From 92d56fe84de554c036a83baef22f6e3e7cd5b2d0 Mon Sep 17 00:00:00 2001 From: Javier Casares Date: Sat, 28 Mar 2026 15:38:41 +0000 Subject: [PATCH] v1.1.0 --- README.md | 281 - changelog.txt | 140 + composer.json | 55 - composer.lock | 3027 -- .../robotstxt-documentation-markdown.pot | 811 - readme.txt | 299 + ...tstxt-documentation-markdown-functions.php | 62 +- robotstxt-documentation-markdown-github.php | 85 +- robotstxt-documentation-markdown-map.php | 82 +- robotstxt-documentation-markdown.php | 241 +- uninstall.php | 118 +- update.json | 29 + vendor/autoload.php | 2 +- vendor/bin/php-parse | 119 - vendor/bin/php-parse.bat | 5 - vendor/bin/phpcbf | 119 - vendor/bin/phpcbf.bat | 5 - vendor/bin/phpcs | 119 - vendor/bin/phpcs.bat | 5 - vendor/bin/phpstan | 119 - vendor/bin/phpstan.bat | 5 - vendor/bin/phpstan.phar | 119 - vendor/bin/phpstan.phar.bat | 5 - vendor/bin/phpunit | 122 - vendor/bin/wp-since | 119 - vendor/bin/wp-since.bat | 5 - vendor/composer/autoload_classmap.php | 1519 - vendor/composer/autoload_files.php | 3 - vendor/composer/autoload_psr4.php | 6 +- vendor/composer/autoload_real.php | 10 +- vendor/composer/autoload_static.php | 1557 +- vendor/composer/installed.json | 2553 +- vendor/composer/installed.php | 344 +- .../CHANGELOG.md | 587 - .../LICENSE.md | 22 - .../README.md | 278 - .../composer.json | 74 - .../src/Plugin.php | 635 - vendor/dflydev/dot-access-data/CHANGELOG.md | 74 - vendor/dflydev/dot-access-data/README.md | 158 - vendor/dflydev/dot-access-data/composer.json | 67 - vendor/eduardovillao/wp-since/.editorconfig | 26 - .../eduardovillao/wp-since/.github/CODEOWNERS | 1 - .../wp-since/.github/workflows/ci.yml | 27 - .../.github/workflows/generate-since.yml | 68 - vendor/eduardovillao/wp-since/.gitignore | 2 - vendor/eduardovillao/wp-since/README.md | 131 - vendor/eduardovillao/wp-since/bin/wp-since | 21 - .../eduardovillao/wp-since/check-plugin.php | 10 - vendor/eduardovillao/wp-since/composer.json | 35 - vendor/eduardovillao/wp-since/composer.lock | 1728 - .../wp-since/generate-since-json.php | 133 - vendor/eduardovillao/wp-since/phpcs.xml | 17 - .../src/Checker/CompatibilityChecker.php | 31 - .../src/Resolver/IgnoreRulesResolver.php | 61 - .../src/Resolver/InlineIgnoreResolver.php | 26 - .../wp-since/src/Resolver/VersionResolver.php | 77 - .../src/Runner/PluginCheckCommand.php | 57 - .../wp-since/src/Scanner/PluginScanner.php | 55 - .../src/Scanner/SymbolExtractorVisitor.php | 48 - .../SymbolHandlers/FunctionCallHandler.php | 27 - .../SymbolHandlers/MethodCallHandler.php | 28 - .../SymbolHandlers/NewClassHandler.php | 29 - .../SymbolHandlers/StaticCallHandler.php | 22 - .../SymbolHandlers/SymbolHandlerInterface.php | 15 - .../wp-since/src/Utils/TablePrinter.php | 46 - .../wp-since/src/Utils/VersionHelper.php | 33 - .../tests/CompatibilityCheckerTest.php | 53 - .../Integration/FullCompatibilityFlowTest.php | 52 - .../wp-since/tests/PluginScannerTest.php | 44 - .../Resolver/IgnoreRulesResolverTest.php | 42 - .../wp-since/tests/TablePrinterTest.php | 29 - .../wp-since/tests/VersionHelperTest.php | 24 - .../wp-since/tests/VersionResolverTest.php | 35 - .../wp-since/tests/fixtures/file-a.php | 5 - .../wp-since/tests/fixtures/file-b.php | 4 - .../fixtures/plugin-full-test/.distignore | 3 - .../fixtures/plugin-full-test/ignore-this.php | 6 - .../plugin-full-test/ignored-folder/fake1.php | 6 - .../ignored-no-slash/file.php | 6 - .../plugin-full-test/plugin-full-test.php | 28 - .../fixtures/plugin-full-test/readme.txt | 10 - .../plugin-ignore-comment.php | 29 - .../plugin-with-header/plugin-with-header.php | 16 - .../plugin-with-readme-only.php | 15 - .../plugin-with-readme-only/readme.txt | 10 - .../plugin-without-version.php | 15 - .../plugin-without-version/readme.txt | 9 - vendor/eduardovillao/wp-since/wp-since.json | 41271 ---------------- vendor/league/commonmark/CHANGELOG.md | 765 - vendor/league/commonmark/README.md | 225 - vendor/league/commonmark/composer.json | 129 - .../DisallowedRawHtmlRenderer.php | 2 +- .../Embed/DomainFilteringAdapter.php | 39 +- .../league/commonmark/src/Util/UrlEncoder.php | 2 +- vendor/league/config/CHANGELOG.md | 42 - vendor/league/config/README.md | 153 - vendor/league/config/composer.json | 69 - vendor/myclabs/deep-copy/LICENSE | 20 - vendor/myclabs/deep-copy/README.md | 406 - vendor/myclabs/deep-copy/composer.json | 43 - .../deep-copy/src/DeepCopy/DeepCopy.php | 328 - .../src/DeepCopy/Exception/CloneException.php | 9 - .../DeepCopy/Exception/PropertyException.php | 9 - .../src/DeepCopy/Filter/ChainableFilter.php | 24 - .../Doctrine/DoctrineCollectionFilter.php | 35 - .../DoctrineEmptyCollectionFilter.php | 30 - .../Filter/Doctrine/DoctrineProxyFilter.php | 22 - .../deep-copy/src/DeepCopy/Filter/Filter.php | 18 - .../src/DeepCopy/Filter/KeepFilter.php | 16 - .../src/DeepCopy/Filter/ReplaceFilter.php | 41 - .../src/DeepCopy/Filter/SetNullFilter.php | 26 - .../Matcher/Doctrine/DoctrineProxyMatcher.php | 22 - .../src/DeepCopy/Matcher/Matcher.php | 14 - .../src/DeepCopy/Matcher/PropertyMatcher.php | 39 - .../DeepCopy/Matcher/PropertyNameMatcher.php | 32 - .../DeepCopy/Matcher/PropertyTypeMatcher.php | 54 - .../DeepCopy/Reflection/ReflectionHelper.php | 78 - .../TypeFilter/Date/DateIntervalFilter.php | 33 - .../TypeFilter/Date/DatePeriodFilter.php | 42 - .../src/DeepCopy/TypeFilter/ReplaceFilter.php | 30 - .../DeepCopy/TypeFilter/ShallowCopyFilter.php | 17 - .../TypeFilter/Spl/ArrayObjectFilter.php | 36 - .../TypeFilter/Spl/SplDoublyLinkedList.php | 10 - .../Spl/SplDoublyLinkedListFilter.php | 51 - .../src/DeepCopy/TypeFilter/TypeFilter.php | 13 - .../src/DeepCopy/TypeMatcher/TypeMatcher.php | 29 - .../deep-copy/src/DeepCopy/deep_copy.php | 20 - vendor/nette/schema/composer.json | 42 - vendor/nette/schema/license.md | 60 - vendor/nette/schema/readme.md | 536 - vendor/nette/utils/composer.json | 54 - vendor/nette/utils/license.md | 60 - vendor/nette/utils/readme.md | 55 - vendor/nikic/php-parser/LICENSE | 29 - vendor/nikic/php-parser/README.md | 225 - vendor/nikic/php-parser/bin/php-parse | 205 - vendor/nikic/php-parser/composer.json | 36 - .../php-parser/lib/PhpParser/Builder.php | 13 - .../lib/PhpParser/Builder/ClassConst.php | 148 - .../lib/PhpParser/Builder/Class_.php | 146 - .../lib/PhpParser/Builder/Declaration.php | 43 - .../lib/PhpParser/Builder/EnumCase.php | 85 - .../lib/PhpParser/Builder/Enum_.php | 117 - .../lib/PhpParser/Builder/FunctionLike.php | 73 - .../lib/PhpParser/Builder/Function_.php | 67 - .../lib/PhpParser/Builder/Interface_.php | 93 - .../lib/PhpParser/Builder/Method.php | 146 - .../lib/PhpParser/Builder/Namespace_.php | 45 - .../lib/PhpParser/Builder/Param.php | 168 - .../lib/PhpParser/Builder/Property.php | 161 - .../lib/PhpParser/Builder/TraitUse.php | 64 - .../PhpParser/Builder/TraitUseAdaptation.php | 148 - .../lib/PhpParser/Builder/Trait_.php | 78 - .../php-parser/lib/PhpParser/Builder/Use_.php | 49 - .../lib/PhpParser/BuilderFactory.php | 399 - .../lib/PhpParser/BuilderHelpers.php | 340 - .../php-parser/lib/PhpParser/Comment.php | 239 - .../php-parser/lib/PhpParser/Comment/Doc.php | 7 - .../ConstExprEvaluationException.php | 6 - .../lib/PhpParser/ConstExprEvaluator.php | 229 - .../nikic/php-parser/lib/PhpParser/Error.php | 180 - .../php-parser/lib/PhpParser/ErrorHandler.php | 13 - .../lib/PhpParser/ErrorHandler/Collecting.php | 46 - .../lib/PhpParser/ErrorHandler/Throwing.php | 18 - .../lib/PhpParser/Internal/DiffElem.php | 27 - .../lib/PhpParser/Internal/Differ.php | 164 - .../Internal/PrintableNewAnonClassNode.php | 64 - .../lib/PhpParser/Internal/TokenStream.php | 286 - .../php-parser/lib/PhpParser/JsonDecoder.php | 103 - .../nikic/php-parser/lib/PhpParser/Lexer.php | 560 - .../lib/PhpParser/Lexer/Emulative.php | 251 - .../Lexer/TokenEmulator/AttributeEmulator.php | 56 - .../CoaleseEqualTokenEmulator.php | 47 - .../Lexer/TokenEmulator/EnumTokenEmulator.php | 31 - .../TokenEmulator/ExplicitOctalEmulator.php | 44 - .../FlexibleDocStringEmulator.php | 76 - .../Lexer/TokenEmulator/FnTokenEmulator.php | 23 - .../Lexer/TokenEmulator/KeywordEmulator.php | 62 - .../TokenEmulator/MatchTokenEmulator.php | 23 - .../TokenEmulator/NullsafeTokenEmulator.php | 67 - .../NumericLiteralSeparatorEmulator.php | 105 - .../ReadonlyFunctionTokenEmulator.php | 31 - .../TokenEmulator/ReadonlyTokenEmulator.php | 36 - .../Lexer/TokenEmulator/ReverseEmulator.php | 36 - .../Lexer/TokenEmulator/TokenEmulator.php | 25 - .../php-parser/lib/PhpParser/NameContext.php | 285 - .../nikic/php-parser/lib/PhpParser/Node.php | 151 - .../php-parser/lib/PhpParser/Node/Arg.php | 46 - .../lib/PhpParser/Node/Attribute.php | 34 - .../lib/PhpParser/Node/AttributeGroup.php | 29 - .../lib/PhpParser/Node/ComplexType.php | 14 - .../php-parser/lib/PhpParser/Node/Const_.php | 37 - .../php-parser/lib/PhpParser/Node/Expr.php | 9 - .../lib/PhpParser/Node/Expr/ArrayDimFetch.php | 34 - .../lib/PhpParser/Node/Expr/ArrayItem.php | 41 - .../lib/PhpParser/Node/Expr/Array_.php | 34 - .../lib/PhpParser/Node/Expr/ArrowFunction.php | 79 - .../lib/PhpParser/Node/Expr/Assign.php | 34 - .../lib/PhpParser/Node/Expr/AssignOp.php | 30 - .../Node/Expr/AssignOp/BitwiseAnd.php | 12 - .../Node/Expr/AssignOp/BitwiseOr.php | 12 - .../Node/Expr/AssignOp/BitwiseXor.php | 12 - .../PhpParser/Node/Expr/AssignOp/Coalesce.php | 12 - .../PhpParser/Node/Expr/AssignOp/Concat.php | 12 - .../lib/PhpParser/Node/Expr/AssignOp/Div.php | 12 - .../PhpParser/Node/Expr/AssignOp/Minus.php | 12 - .../lib/PhpParser/Node/Expr/AssignOp/Mod.php | 12 - .../lib/PhpParser/Node/Expr/AssignOp/Mul.php | 12 - .../lib/PhpParser/Node/Expr/AssignOp/Plus.php | 12 - .../lib/PhpParser/Node/Expr/AssignOp/Pow.php | 12 - .../Node/Expr/AssignOp/ShiftLeft.php | 12 - .../Node/Expr/AssignOp/ShiftRight.php | 12 - .../lib/PhpParser/Node/Expr/AssignRef.php | 34 - .../lib/PhpParser/Node/Expr/BinaryOp.php | 40 - .../Node/Expr/BinaryOp/BitwiseAnd.php | 16 - .../Node/Expr/BinaryOp/BitwiseOr.php | 16 - .../Node/Expr/BinaryOp/BitwiseXor.php | 16 - .../Node/Expr/BinaryOp/BooleanAnd.php | 16 - .../Node/Expr/BinaryOp/BooleanOr.php | 16 - .../PhpParser/Node/Expr/BinaryOp/Coalesce.php | 16 - .../PhpParser/Node/Expr/BinaryOp/Concat.php | 16 - .../lib/PhpParser/Node/Expr/BinaryOp/Div.php | 16 - .../PhpParser/Node/Expr/BinaryOp/Equal.php | 16 - .../PhpParser/Node/Expr/BinaryOp/Greater.php | 16 - .../Node/Expr/BinaryOp/GreaterOrEqual.php | 16 - .../Node/Expr/BinaryOp/Identical.php | 16 - .../Node/Expr/BinaryOp/LogicalAnd.php | 16 - .../Node/Expr/BinaryOp/LogicalOr.php | 16 - .../Node/Expr/BinaryOp/LogicalXor.php | 16 - .../PhpParser/Node/Expr/BinaryOp/Minus.php | 16 - .../lib/PhpParser/Node/Expr/BinaryOp/Mod.php | 16 - .../lib/PhpParser/Node/Expr/BinaryOp/Mul.php | 16 - .../PhpParser/Node/Expr/BinaryOp/NotEqual.php | 16 - .../Node/Expr/BinaryOp/NotIdentical.php | 16 - .../lib/PhpParser/Node/Expr/BinaryOp/Plus.php | 16 - .../lib/PhpParser/Node/Expr/BinaryOp/Pow.php | 16 - .../Node/Expr/BinaryOp/ShiftLeft.php | 16 - .../Node/Expr/BinaryOp/ShiftRight.php | 16 - .../PhpParser/Node/Expr/BinaryOp/Smaller.php | 16 - .../Node/Expr/BinaryOp/SmallerOrEqual.php | 16 - .../Node/Expr/BinaryOp/Spaceship.php | 16 - .../lib/PhpParser/Node/Expr/BitwiseNot.php | 30 - .../lib/PhpParser/Node/Expr/BooleanNot.php | 30 - .../lib/PhpParser/Node/Expr/CallLike.php | 39 - .../lib/PhpParser/Node/Expr/Cast.php | 26 - .../lib/PhpParser/Node/Expr/Cast/Array_.php | 12 - .../lib/PhpParser/Node/Expr/Cast/Bool_.php | 12 - .../lib/PhpParser/Node/Expr/Cast/Double.php | 17 - .../lib/PhpParser/Node/Expr/Cast/Int_.php | 12 - .../lib/PhpParser/Node/Expr/Cast/Object_.php | 12 - .../lib/PhpParser/Node/Expr/Cast/String_.php | 12 - .../lib/PhpParser/Node/Expr/Cast/Unset_.php | 12 - .../PhpParser/Node/Expr/ClassConstFetch.php | 36 - .../lib/PhpParser/Node/Expr/Clone_.php | 30 - .../lib/PhpParser/Node/Expr/Closure.php | 79 - .../lib/PhpParser/Node/Expr/ClosureUse.php | 34 - .../lib/PhpParser/Node/Expr/ConstFetch.php | 31 - .../lib/PhpParser/Node/Expr/Empty_.php | 30 - .../lib/PhpParser/Node/Expr/Error.php | 31 - .../lib/PhpParser/Node/Expr/ErrorSuppress.php | 30 - .../lib/PhpParser/Node/Expr/Eval_.php | 30 - .../lib/PhpParser/Node/Expr/Exit_.php | 34 - .../lib/PhpParser/Node/Expr/FuncCall.php | 39 - .../lib/PhpParser/Node/Expr/Include_.php | 39 - .../lib/PhpParser/Node/Expr/Instanceof_.php | 35 - .../lib/PhpParser/Node/Expr/Isset_.php | 30 - .../lib/PhpParser/Node/Expr/List_.php | 30 - .../lib/PhpParser/Node/Expr/Match_.php | 31 - .../lib/PhpParser/Node/Expr/MethodCall.php | 45 - .../lib/PhpParser/Node/Expr/New_.php | 41 - .../Node/Expr/NullsafeMethodCall.php | 45 - .../Node/Expr/NullsafePropertyFetch.php | 35 - .../lib/PhpParser/Node/Expr/PostDec.php | 30 - .../lib/PhpParser/Node/Expr/PostInc.php | 30 - .../lib/PhpParser/Node/Expr/PreDec.php | 30 - .../lib/PhpParser/Node/Expr/PreInc.php | 30 - .../lib/PhpParser/Node/Expr/Print_.php | 30 - .../lib/PhpParser/Node/Expr/PropertyFetch.php | 35 - .../lib/PhpParser/Node/Expr/ShellExec.php | 30 - .../lib/PhpParser/Node/Expr/StaticCall.php | 46 - .../Node/Expr/StaticPropertyFetch.php | 36 - .../lib/PhpParser/Node/Expr/Ternary.php | 38 - .../lib/PhpParser/Node/Expr/Throw_.php | 30 - .../lib/PhpParser/Node/Expr/UnaryMinus.php | 30 - .../lib/PhpParser/Node/Expr/UnaryPlus.php | 30 - .../lib/PhpParser/Node/Expr/Variable.php | 30 - .../lib/PhpParser/Node/Expr/YieldFrom.php | 30 - .../lib/PhpParser/Node/Expr/Yield_.php | 34 - .../lib/PhpParser/Node/FunctionLike.php | 43 - .../lib/PhpParser/Node/Identifier.php | 75 - .../lib/PhpParser/Node/IntersectionType.php | 30 - .../lib/PhpParser/Node/MatchArm.php | 31 - .../php-parser/lib/PhpParser/Node/Name.php | 254 - .../PhpParser/Node/Name/FullyQualified.php | 50 - .../lib/PhpParser/Node/Name/Relative.php | 50 - .../lib/PhpParser/Node/NullableType.php | 28 - .../php-parser/lib/PhpParser/Node/Param.php | 60 - .../php-parser/lib/PhpParser/Node/Scalar.php | 7 - .../lib/PhpParser/Node/Scalar/DNumber.php | 77 - .../lib/PhpParser/Node/Scalar/Encapsed.php | 31 - .../Node/Scalar/EncapsedStringPart.php | 30 - .../lib/PhpParser/Node/Scalar/LNumber.php | 80 - .../lib/PhpParser/Node/Scalar/MagicConst.php | 28 - .../Node/Scalar/MagicConst/Class_.php | 16 - .../PhpParser/Node/Scalar/MagicConst/Dir.php | 16 - .../PhpParser/Node/Scalar/MagicConst/File.php | 16 - .../Node/Scalar/MagicConst/Function_.php | 16 - .../PhpParser/Node/Scalar/MagicConst/Line.php | 16 - .../Node/Scalar/MagicConst/Method.php | 16 - .../Node/Scalar/MagicConst/Namespace_.php | 16 - .../Node/Scalar/MagicConst/Trait_.php | 16 - .../lib/PhpParser/Node/Scalar/String_.php | 157 - .../php-parser/lib/PhpParser/Node/Stmt.php | 9 - .../lib/PhpParser/Node/Stmt/Break_.php | 30 - .../lib/PhpParser/Node/Stmt/Case_.php | 34 - .../lib/PhpParser/Node/Stmt/Catch_.php | 41 - .../lib/PhpParser/Node/Stmt/ClassConst.php | 85 - .../lib/PhpParser/Node/Stmt/ClassLike.php | 109 - .../lib/PhpParser/Node/Stmt/ClassMethod.php | 161 - .../lib/PhpParser/Node/Stmt/Class_.php | 137 - .../lib/PhpParser/Node/Stmt/Const_.php | 30 - .../lib/PhpParser/Node/Stmt/Continue_.php | 30 - .../PhpParser/Node/Stmt/DeclareDeclare.php | 34 - .../lib/PhpParser/Node/Stmt/Declare_.php | 34 - .../lib/PhpParser/Node/Stmt/Do_.php | 34 - .../lib/PhpParser/Node/Stmt/Echo_.php | 30 - .../lib/PhpParser/Node/Stmt/ElseIf_.php | 34 - .../lib/PhpParser/Node/Stmt/Else_.php | 30 - .../lib/PhpParser/Node/Stmt/EnumCase.php | 37 - .../lib/PhpParser/Node/Stmt/Enum_.php | 40 - .../lib/PhpParser/Node/Stmt/Expression.php | 33 - .../lib/PhpParser/Node/Stmt/Finally_.php | 30 - .../lib/PhpParser/Node/Stmt/For_.php | 43 - .../lib/PhpParser/Node/Stmt/Foreach_.php | 47 - .../lib/PhpParser/Node/Stmt/Function_.php | 77 - .../lib/PhpParser/Node/Stmt/Global_.php | 30 - .../lib/PhpParser/Node/Stmt/Goto_.php | 31 - .../lib/PhpParser/Node/Stmt/GroupUse.php | 39 - .../lib/PhpParser/Node/Stmt/HaltCompiler.php | 30 - .../lib/PhpParser/Node/Stmt/If_.php | 43 - .../lib/PhpParser/Node/Stmt/InlineHTML.php | 30 - .../lib/PhpParser/Node/Stmt/Interface_.php | 37 - .../lib/PhpParser/Node/Stmt/Label.php | 31 - .../lib/PhpParser/Node/Stmt/Namespace_.php | 38 - .../lib/PhpParser/Node/Stmt/Nop.php | 17 - .../lib/PhpParser/Node/Stmt/Property.php | 91 - .../PhpParser/Node/Stmt/PropertyProperty.php | 34 - .../lib/PhpParser/Node/Stmt/Return_.php | 30 - .../lib/PhpParser/Node/Stmt/StaticVar.php | 37 - .../lib/PhpParser/Node/Stmt/Static_.php | 30 - .../lib/PhpParser/Node/Stmt/Switch_.php | 34 - .../lib/PhpParser/Node/Stmt/Throw_.php | 30 - .../lib/PhpParser/Node/Stmt/TraitUse.php | 34 - .../Node/Stmt/TraitUseAdaptation.php | 13 - .../Node/Stmt/TraitUseAdaptation/Alias.php | 38 - .../Stmt/TraitUseAdaptation/Precedence.php | 34 - .../lib/PhpParser/Node/Stmt/Trait_.php | 32 - .../lib/PhpParser/Node/Stmt/TryCatch.php | 38 - .../lib/PhpParser/Node/Stmt/Unset_.php | 30 - .../lib/PhpParser/Node/Stmt/UseUse.php | 52 - .../lib/PhpParser/Node/Stmt/Use_.php | 47 - .../lib/PhpParser/Node/Stmt/While_.php | 34 - .../lib/PhpParser/Node/UnionType.php | 28 - .../lib/PhpParser/Node/VarLikeIdentifier.php | 17 - .../PhpParser/Node/VariadicPlaceholder.php | 27 - .../php-parser/lib/PhpParser/NodeAbstract.php | 178 - .../php-parser/lib/PhpParser/NodeDumper.php | 206 - .../php-parser/lib/PhpParser/NodeFinder.php | 81 - .../lib/PhpParser/NodeTraverser.php | 291 - .../lib/PhpParser/NodeTraverserInterface.php | 29 - .../php-parser/lib/PhpParser/NodeVisitor.php | 72 - .../PhpParser/NodeVisitor/CloningVisitor.php | 20 - .../PhpParser/NodeVisitor/FindingVisitor.php | 48 - .../NodeVisitor/FirstFindingVisitor.php | 50 - .../PhpParser/NodeVisitor/NameResolver.php | 260 - .../NodeVisitor/NodeConnectingVisitor.php | 52 - .../NodeVisitor/ParentConnectingVisitor.php | 41 - .../lib/PhpParser/NodeVisitorAbstract.php | 25 - .../nikic/php-parser/lib/PhpParser/Parser.php | 18 - .../lib/PhpParser/Parser/Multiple.php | 55 - .../php-parser/lib/PhpParser/Parser/Php5.php | 2682 - .../php-parser/lib/PhpParser/Parser/Php7.php | 2899 -- .../lib/PhpParser/Parser/Tokens.php | 148 - .../lib/PhpParser/ParserAbstract.php | 1060 - .../lib/PhpParser/ParserFactory.php | 76 - .../lib/PhpParser/PrettyPrinter/Standard.php | 1126 - .../lib/PhpParser/PrettyPrinterAbstract.php | 1576 - vendor/phar-io/manifest/.github/FUNDING.yml | 3 - .../phar-io/manifest/.github/workflows/ci.yml | 86 - .../phar-io/manifest/.php-cs-fixer.dist.php | 223 - vendor/phar-io/manifest/CHANGELOG.md | 45 - vendor/phar-io/manifest/LICENSE | 31 - vendor/phar-io/manifest/README.md | 178 - vendor/phar-io/manifest/composer.json | 43 - vendor/phar-io/manifest/composer.lock | 76 - vendor/phar-io/manifest/manifest.xsd | 116 - .../manifest/src/ManifestDocumentMapper.php | 151 - .../phar-io/manifest/src/ManifestLoader.php | 47 - .../manifest/src/ManifestSerializer.php | 172 - .../exceptions/ElementCollectionException.php | 16 - .../manifest/src/exceptions/Exception.php | 16 - .../InvalidApplicationNameException.php | 17 - .../src/exceptions/InvalidEmailException.php | 16 - .../src/exceptions/InvalidUrlException.php | 16 - .../exceptions/ManifestDocumentException.php | 16 - .../ManifestDocumentLoadingException.php | 47 - .../ManifestDocumentMapperException.php | 16 - .../exceptions/ManifestElementException.php | 16 - .../exceptions/ManifestLoaderException.php | 14 - .../exceptions/NoEmailAddressException.php | 16 - .../manifest/src/values/Application.php | 17 - .../manifest/src/values/ApplicationName.php | 41 - vendor/phar-io/manifest/src/values/Author.php | 57 - .../manifest/src/values/AuthorCollection.php | 40 - .../src/values/AuthorCollectionIterator.php | 47 - .../manifest/src/values/BundledComponent.php | 34 - .../src/values/BundledComponentCollection.php | 40 - .../BundledComponentCollectionIterator.php | 47 - .../src/values/CopyrightInformation.php | 32 - vendor/phar-io/manifest/src/values/Email.php | 35 - .../phar-io/manifest/src/values/Extension.php | 47 - .../phar-io/manifest/src/values/Library.php | 17 - .../phar-io/manifest/src/values/License.php | 32 - .../phar-io/manifest/src/values/Manifest.php | 93 - .../src/values/PhpExtensionRequirement.php | 24 - .../src/values/PhpVersionRequirement.php | 26 - .../manifest/src/values/Requirement.php | 14 - .../src/values/RequirementCollection.php | 40 - .../values/RequirementCollectionIterator.php | 47 - vendor/phar-io/manifest/src/values/Type.php | 42 - vendor/phar-io/manifest/src/values/Url.php | 38 - .../manifest/src/xml/AuthorElement.php | 25 - .../src/xml/AuthorElementCollection.php | 19 - .../manifest/src/xml/BundlesElement.php | 19 - .../manifest/src/xml/ComponentElement.php | 21 - .../src/xml/ComponentElementCollection.php | 19 - .../manifest/src/xml/ContainsElement.php | 31 - .../manifest/src/xml/CopyrightElement.php | 25 - .../manifest/src/xml/ElementCollection.php | 68 - .../phar-io/manifest/src/xml/ExtElement.php | 17 - .../manifest/src/xml/ExtElementCollection.php | 19 - .../manifest/src/xml/ExtensionElement.php | 21 - .../manifest/src/xml/LicenseElement.php | 21 - .../manifest/src/xml/ManifestDocument.php | 115 - .../manifest/src/xml/ManifestElement.php | 72 - .../phar-io/manifest/src/xml/PhpElement.php | 27 - .../manifest/src/xml/RequiresElement.php | 19 - .../PhpdocSingleLineVarFixer.php | 72 - .../manifest/tools/php-cs-fixer.d/header.txt | 6 - vendor/phar-io/version/CHANGELOG.md | 142 - vendor/phar-io/version/LICENSE | 29 - vendor/phar-io/version/README.md | 61 - vendor/phar-io/version/composer.json | 34 - vendor/phar-io/version/src/BuildMetaData.php | 28 - .../phar-io/version/src/PreReleaseSuffix.php | 82 - vendor/phar-io/version/src/Version.php | 208 - .../version/src/VersionConstraintParser.php | 115 - .../version/src/VersionConstraintValue.php | 88 - vendor/phar-io/version/src/VersionNumber.php | 28 - .../constraints/AbstractVersionConstraint.php | 23 - .../constraints/AndVersionConstraintGroup.php | 34 - .../src/constraints/AnyVersionConstraint.php | 20 - .../constraints/ExactVersionConstraint.php | 22 - .../GreaterThanOrEqualToVersionConstraint.php | 26 - .../constraints/OrVersionConstraintGroup.php | 35 - ...SpecificMajorAndMinorVersionConstraint.php | 33 - .../SpecificMajorVersionConstraint.php | 25 - .../src/constraints/VersionConstraint.php | 16 - .../version/src/exceptions/Exception.php | 15 - .../InvalidPreReleaseSuffixException.php | 5 - .../exceptions/InvalidVersionException.php | 5 - .../exceptions/NoBuildMetaDataException.php | 5 - .../NoPreReleaseSuffixException.php | 5 - .../UnsupportedVersionConstraintException.php | 13 - .../php-compatibility/CHANGELOG.md | 1488 - .../php-compatibility/LICENSE | 165 - .../php-compatibility/PHPCSAliases.php | 73 - .../AbstractComplexVersionSniff.php | 147 - .../AbstractFunctionCallParameterSniff.php | 193 - .../AbstractNewFeatureSniff.php | 115 - .../AbstractRemovedFeatureSniff.php | 156 - .../ComplexVersionInterface.php | 84 - .../PHPCompatibility/PHPCSHelper.php | 678 - .../PHPCompatibility/Sniff.php | 2267 - .../ForbiddenAbstractPrivateMethodsSniff.php | 90 - .../Classes/NewAnonymousClassesSniff.php | 91 - .../Sniffs/Classes/NewClassesSniff.php | 913 - .../Classes/NewConstVisibilitySniff.php | 80 - .../Classes/NewLateStaticBindingSniff.php | 88 - .../Classes/NewTypedPropertiesSniff.php | 132 - .../Classes/RemovedOrphanedParentSniff.php | 115 - .../Sniffs/Constants/NewConstantsSniff.php | 3756 -- .../Constants/NewMagicClassConstantSniff.php | 80 - .../Constants/RemovedConstantsSniff.php | 574 - .../DiscouragedSwitchContinueSniff.php | 238 - ...ForbiddenBreakContinueOutsideLoopSniff.php | 116 - ...denBreakContinueVariableArgumentsSniff.php | 110 - ...enSwitchWithMultipleDefaultBlocksSniff.php | 81 - .../NewExecutionDirectivesSniff.php | 378 - .../NewForeachExpressionReferencingSniff.php | 99 - .../NewListInForeachSniff.php | 84 - .../ControlStructures/NewMultiCatchSniff.php | 78 - .../Extensions/RemovedExtensionsSniff.php | 346 - ...biddenParameterShadowSuperGlobalsSniff.php | 79 - .../ForbiddenParametersWithSameNameSniff.php | 88 - .../ForbiddenToStringParametersSniff.php | 99 - ...orbiddenVariableNamesInClosureUseSniff.php | 122 - .../FunctionDeclarations/NewClosureSniff.php | 264 - .../NewExceptionsFromToStringSniff.php | 171 - .../NewNullableTypesSniff.php | 169 - .../NewParamTypeDeclarationsSniff.php | 237 - .../NewReturnTypeDeclarationsSniff.php | 194 - .../NonStaticMagicMethodsSniff.php | 216 - .../NewMagicMethodsSniff.php | 231 - .../RemovedMagicAutoloadSniff.php | 92 - .../RemovedNamespacedAssertSniff.php | 101 - .../RemovedPHP4StyleConstructorsSniff.php | 158 - .../ReservedFunctionNamesSniff.php | 205 - ...gumentFunctionsReportCurrentValueSniff.php | 455 - .../ArgumentFunctionsUsageSniff.php | 169 - .../NewFunctionParametersSniff.php | 1109 - .../Sniffs/FunctionUse/NewFunctionsSniff.php | 2008 - ...ionalToRequiredFunctionParametersSniff.php | 173 - .../RemovedFunctionParametersSniff.php | 292 - .../FunctionUse/RemovedFunctionsSniff.php | 1104 - ...uiredToOptionalFunctionParametersSniff.php | 350 - .../Generators/NewGeneratorReturnSniff.php | 158 - .../IniDirectives/NewIniDirectivesSniff.php | 855 - .../RemovedIniDirectivesSniff.php | 424 - .../NewConstantArraysUsingConstSniff.php | 82 - .../NewConstantArraysUsingDefineSniff.php | 101 - .../NewConstantScalarExpressionsSniff.php | 556 - .../Sniffs/InitialValue/NewHeredocSniff.php | 100 - .../Interfaces/InternalInterfacesSniff.php | 103 - .../Sniffs/Interfaces/NewInterfacesSniff.php | 362 - .../Keywords/CaseSensitiveKeywordsSniff.php | 76 - .../ForbiddenNamesAsDeclaredSniff.php | 259 - .../ForbiddenNamesAsInvokedFunctionsSniff.php | 188 - .../Sniffs/Keywords/ForbiddenNamesSniff.php | 442 - .../Sniffs/Keywords/NewKeywordsSniff.php | 391 - .../NewEmptyNonVariableSniff.php | 91 - .../NewLanguageConstructsSniff.php | 159 - .../Sniffs/Lists/AssignmentOrderSniff.php | 188 - .../ForbiddenEmptyListAssignmentSniff.php | 116 - .../Sniffs/Lists/NewKeyedListSniff.php | 227 - .../Lists/NewListReferenceAssignmentSniff.php | 74 - .../Sniffs/Lists/NewShortListSniff.php | 84 - .../ForbiddenToStringParametersSniff.php | 103 - .../MethodUse/NewDirectCallsToCloneSniff.php | 117 - .../Miscellaneous/NewPHPOpenTagEOFSniff.php | 147 - .../RemovedAlternativePHPTagsSniff.php | 172 - .../Miscellaneous/ValidIntegersSniff.php | 250 - .../ChangedConcatOperatorPrecedenceSniff.php | 199 - .../ForbiddenNegativeBitshiftSniff.php | 109 - .../Sniffs/Operators/NewOperatorsSniff.php | 317 - .../Sniffs/Operators/NewShortTernarySniff.php | 73 - .../RemovedTernaryAssociativitySniff.php | 157 - .../ForbiddenGetClassNullSniff.php | 84 - ...orbiddenStripTagsSelfClosingXHTMLSniff.php | 113 - .../NewArrayReduceInitialTypeSniff.php | 116 - .../ParameterValues/NewFopenModesSniff.php | 119 - .../NewHTMLEntitiesEncodingDefaultSniff.php | 92 - .../NewHashAlgorithmsSniff.php | 185 - .../NewIDNVariantDefaultSniff.php | 91 - .../NewIconvMbstringCharsetDefaultSniff.php | 231 - .../NewNegativeStringOffsetSniff.php | 129 - .../ParameterValues/NewPCREModifiersSniff.php | 127 - .../ParameterValues/NewPackFormatSniff.php | 132 - .../NewPasswordAlgoConstantValuesSniff.php | 125 - .../NewProcOpenCmdArraySniff.php | 136 - .../NewStripTagsAllowableTagsArraySniff.php | 152 - .../RemovedHashAlgorithmsSniff.php | 117 - .../RemovedIconvEncodingSniff.php | 86 - .../RemovedImplodeFlexibleParamOrderSniff.php | 323 - ...emovedMbStrrposEncodingThirdParamSniff.php | 149 - .../RemovedMbstringModifiersSniff.php | 135 - .../RemovedNonCryptoHashSniff.php | 121 - .../RemovedPCREModifiersSniff.php | 241 - .../RemovedSetlocaleStringSniff.php | 104 - .../ForbiddenCallTimePassByReferenceSniff.php | 259 - .../NewArrayStringDereferencingSniff.php | 199 - .../Sniffs/Syntax/NewArrayUnpackingSniff.php | 142 - .../Syntax/NewClassMemberAccessSniff.php | 192 - .../Syntax/NewDynamicAccessToStaticSniff.php | 89 - .../Syntax/NewFlexibleHeredocNowdocSniff.php | 255 - .../NewFunctionArrayDereferencingSniff.php | 187 - .../NewFunctionCallTrailingCommaSniff.php | 120 - .../Sniffs/Syntax/NewShortArraySniff.php | 77 - .../RemovedCurlyBraceArrayAccessSniff.php | 362 - .../Syntax/RemovedNewReferenceSniff.php | 80 - .../NewUnicodeEscapeSequenceSniff.php | 162 - .../Sniffs/TypeCasts/NewTypeCastsSniff.php | 222 - .../TypeCasts/RemovedTypeCastsSniff.php | 158 - .../Sniffs/Upgrade/LowPHPCSSniff.php | 187 - .../Sniffs/Upgrade/LowPHPSniff.php | 182 - .../NewGroupUseDeclarationsSniff.php | 118 - .../NewUseConstFunctionSniff.php | 109 - .../ForbiddenGlobalVariableVariableSniff.php | 125 - .../ForbiddenThisUseContextsSniff.php | 425 - .../NewUniformVariableSyntaxSniff.php | 114 - .../RemovedPredefinedGlobalVariablesSniff.php | 318 - .../PHPCompatibility/ruleset.xml | 7 - .../php-compatibility/README.md | 250 - .../php-compatibility/composer.json | 44 - .../php-compatibility/phpunit-bootstrap.php | 86 - .../phpcompatibility-paragonie/LICENSE | 165 - .../ruleset.xml | 41 - .../ruleset.xml | 252 - .../phpcompatibility-paragonie/README.md | 156 - .../phpcompatibility-paragonie/composer.json | 40 - .../phpcompatibility-wp/LICENSE | 165 - .../PHPCompatibilityWP/ruleset.xml | 89 - .../phpcompatibility-wp/README.md | 159 - .../phpcompatibility-wp/composer.json | 40 - vendor/phpcsstandards/phpcsextra/CHANGELOG.md | 781 - vendor/phpcsstandards/phpcsextra/LICENSE | 165 - .../Docs/FunctionCalls/DirnameStandard.xml | 40 - .../Sniffs/FunctionCalls/DirnameSniff.php | 389 - .../phpcsextra/Modernize/ruleset.xml | 5 - .../Docs/Arrays/ArrayBraceSpacingStandard.xml | 94 - .../Docs/Arrays/CommaAfterLastStandard.xml | 43 - .../Sniffs/Arrays/ArrayBraceSpacingSniff.php | 305 - .../Sniffs/Arrays/CommaAfterLastSniff.php | 226 - .../phpcsextra/NormalizedArrays/ruleset.xml | 5 - vendor/phpcsstandards/phpcsextra/README.md | 614 - .../DisallowShortArraySyntaxStandard.xml | 27 - .../Docs/Arrays/DuplicateArrayKeyStandard.xml | 44 - .../Arrays/MixedArrayKeyTypesStandard.xml | 40 - .../Arrays/MixedKeyedUnkeyedArrayStandard.xml | 31 - .../Attributes/BracketSpacingStandard.xml | 54 - .../DisallowAttributeParenthesesStandard.xml | 26 - .../RequireAttributeParenthesesStandard.xml | 25 - .../Docs/Attributes/TrailingCommaStandard.xml | 77 - .../DisallowAnonClassParenthesesStandard.xml | 24 - .../Classes/DisallowFinalClassStandard.xml | 25 - .../Classes/ModifierKeywordOrderStandard.xml | 27 - .../RequireAnonClassParenthesesStandard.xml | 23 - .../Classes/RequireFinalClassStandard.xml | 25 - .../ConstructorDestructorReturnStandard.xml | 64 - .../ForeachUniqueAssignmentStandard.xml | 26 - .../CodeAnalysis/NoDoubleNegativeStandard.xml | 27 - .../CodeAnalysis/NoEchoSprintfStandard.xml | 25 - .../StaticInFinalClassStandard.xml | 43 - ...owercaseClassResolutionKeywordStandard.xml | 23 - .../ModifierKeywordOrderStandard.xml | 30 - .../UppercaseMagicConstantsStandard.xml | 25 - .../DisallowAlternativeSyntaxStandard.xml | 35 - .../DisallowLonelyIfStandard.xml | 49 - .../IfElseDeclarationStandard.xml | 37 - .../Files/SeparateFunctionsFromOOStandard.xml | 45 - .../NoLongClosuresStandard.xml | 42 - .../RequireFinalMethodsInTraitsStandard.xml | 33 - .../Lists/DisallowLongListSyntaxStandard.xml | 23 - .../Lists/DisallowShortListSyntaxStandard.xml | 23 - .../DisallowCurlyBraceSyntaxStandard.xml | 27 - ...DisallowDeclarationWithoutNameStandard.xml | 25 - .../EnforceCurlyBraceSyntaxStandard.xml | 27 - .../OneDeclarationPerFileStandard.xml | 27 - ...oReservedKeywordParameterNamesStandard.xml | 23 - .../AlphabeticExtendsImplementsStandard.xml | 27 - .../Docs/Operators/ConcatPositionStandard.xml | 31 - .../DisallowLogicalAndOrStandard.xml | 30 - .../DisallowShortTernaryStandard.xml | 26 - ...andalonePostIncrementDecrementStandard.xml | 44 - .../Operators/StrictComparisonsStandard.xml | 29 - .../TypeSeparatorSpacingStandard.xml | 39 - .../DisallowExitDieParenthesesStandard.xml | 25 - .../Docs/PHP/LowercasePHPTagStandard.xml | 25 - .../Docs/PHP/NoFQNTrueFalseNullStandard.xml | 27 - .../OneStatementInShortEchoTagStandard.xml | 41 - .../PHP/RequireExitDieParenthesesStandard.xml | 25 - .../DisallowMixedGroupUseStandard.xml | 39 - .../DisallowUseClassStandard.xml | 25 - .../DisallowUseConstStandard.xml | 25 - .../DisallowUseFunctionStandard.xml | 25 - .../UseStatements/KeywordSpacingStandard.xml | 29 - .../LowercaseFunctionConstStandard.xml | 25 - .../NoLeadingBackslashStandard.xml | 23 - .../NoUselessAliasesStandard.xml | 30 - .../AnonClassKeywordSpacingStandard.xml | 31 - .../Docs/WhiteSpace/CommaSpacingStandard.xml | 94 - .../WhiteSpace/DisallowInlineTabsStandard.xml | 25 - .../FirstClassCallableSpacingStandard.xml | 33 - .../WhiteSpace/PrecisionAlignmentStandard.xml | 29 - .../Universal/Helpers/DummyTokenizer.php | 60 - .../Arrays/DisallowShortArraySyntaxSniff.php | 89 - .../Sniffs/Arrays/DuplicateArrayKeySniff.php | 294 - .../Sniffs/Arrays/MixedArrayKeyTypesSniff.php | 174 - .../Arrays/MixedKeyedUnkeyedArraySniff.php | 134 - .../Sniffs/Attributes/BracketSpacingSniff.php | 216 - .../DisallowAttributeParenthesesSniff.php | 121 - .../RequireAttributeParenthesesSniff.php | 90 - .../Sniffs/Attributes/TrailingCommaSniff.php | 144 - .../DisallowAnonClassParenthesesSniff.php | 112 - .../Classes/DisallowFinalClassSniff.php | 116 - .../Classes/ModifierKeywordOrderSniff.php | 188 - .../RequireAnonClassParenthesesSniff.php | 81 - .../Sniffs/Classes/RequireFinalClassSniff.php | 102 - .../ConstructorDestructorReturnSniff.php | 211 - .../ForeachUniqueAssignmentSniff.php | 153 - .../CodeAnalysis/NoDoubleNegativeSniff.php | 269 - .../CodeAnalysis/NoEchoSprintfSniff.php | 144 - .../CodeAnalysis/StaticInFinalClassSniff.php | 216 - .../LowercaseClassResolutionKeywordSniff.php | 106 - .../Constants/ModifierKeywordOrderSniff.php | 181 - .../UppercaseMagicConstantsSniff.php | 89 - .../DisallowAlternativeSyntaxSniff.php | 216 - .../DisallowLonelyIfSniff.php | 348 - .../IfElseDeclarationSniff.php | 164 - .../Files/SeparateFunctionsFromOOSniff.php | 189 - .../NoLongClosuresSniff.php | 233 - .../RequireFinalMethodsInTraitsSniff.php | 120 - .../Lists/DisallowLongListSyntaxSniff.php | 71 - .../Lists/DisallowShortListSyntaxSniff.php | 86 - .../DisallowCurlyBraceSyntaxSniff.php | 81 - .../DisallowDeclarationWithoutNameSniff.php | 80 - .../EnforceCurlyBraceSyntaxSniff.php | 81 - .../Namespaces/OneDeclarationPerFileSniff.php | 96 - .../NoReservedKeywordParameterNamesSniff.php | 190 - .../AlphabeticExtendsImplementsSniff.php | 275 - .../Sniffs/Operators/ConcatPositionSniff.php | 203 - .../Operators/DisallowLogicalAndOrSniff.php | 112 - .../Operators/DisallowShortTernarySniff.php | 76 - ...wStandalonePostIncrementDecrementSniff.php | 197 - .../Operators/StrictComparisonsSniff.php | 116 - .../Operators/TypeSeparatorSpacingSniff.php | 148 - .../PHP/DisallowExitDieParenthesesSniff.php | 110 - .../Sniffs/PHP/LowercasePHPTagSniff.php | 87 - .../Sniffs/PHP/NoFQNTrueFalseNullSniff.php | 116 - .../PHP/OneStatementInShortEchoTagSniff.php | 101 - .../PHP/RequireExitDieParenthesesSniff.php | 85 - .../DisallowMixedGroupUseSniff.php | 252 - .../UseStatements/DisallowUseClassSniff.php | 265 - .../UseStatements/DisallowUseConstSniff.php | 265 - .../DisallowUseFunctionSniff.php | 265 - .../UseStatements/KeywordSpacingSniff.php | 207 - .../LowercaseFunctionConstSniff.php | 156 - .../UseStatements/NoLeadingBackslashSniff.php | 178 - .../UseStatements/NoUselessAliasesSniff.php | 169 - .../AnonClassKeywordSpacingSniff.php | 79 - .../Sniffs/WhiteSpace/CommaSpacingSniff.php | 421 - .../WhiteSpace/DisallowInlineTabsSniff.php | 176 - .../FirstClassCallableSpacingSniff.php | 101 - .../WhiteSpace/PrecisionAlignmentSniff.php | 437 - .../phpcsextra/Universal/ruleset.xml | 5 - .../phpcsstandards/phpcsextra/composer.json | 81 - vendor/phpcsstandards/phpcsutils/CHANGELOG.md | 1425 - vendor/phpcsstandards/phpcsutils/LICENSE | 165 - .../AbstractArrayDeclarationSniff.php | 602 - .../PHPCSUtils/BackCompat/BCFile.php | 1070 - .../PHPCSUtils/BackCompat/BCTokens.php | 280 - .../PHPCSUtils/BackCompat/Helper.php | 204 - .../Exceptions/InvalidTokenArray.php | 44 - .../PHPCSUtils/Exceptions/LogicException.php | 47 - .../Exceptions/MissingArgumentError.php | 52 - .../Exceptions/OutOfBoundsStackPtr.php | 51 - .../Exceptions/RuntimeException.php | 24 - .../Exceptions/TestFileNotFound.php | 47 - .../Exceptions/TestMarkerNotFound.php | 43 - .../Exceptions/TestTargetNotFound.php | 50 - .../PHPCSUtils/Exceptions/TypeError.php | 53 - .../Exceptions/UnexpectedTokenType.php | 53 - .../PHPCSUtils/Exceptions/ValueError.php | 55 - .../PHPCSUtils/Fixers/SpacesFixer.php | 267 - .../PHPCSUtils/Internal/AttributeHelper.php | 227 - .../phpcsutils/PHPCSUtils/Internal/Cache.php | 218 - .../Internal/IsShortArrayOrList.php | 693 - .../Internal/IsShortArrayOrListWithCache.php | 269 - .../PHPCSUtils/Internal/NoFileCache.php | 164 - .../PHPCSUtils/Internal/StableCollections.php | 75 - .../PHPCSUtils/TestUtils/ConfigDouble.php | 249 - .../PHPCSUtils/TestUtils/RulesetDouble.php | 57 - .../TestUtils/UtilityMethodTestCase.php | 524 - .../PHPCSUtils/Tokens/Collections.php | 911 - .../PHPCSUtils/Tokens/TokenHelper.php | 55 - .../phpcsutils/PHPCSUtils/Utils/Arrays.php | 246 - .../PHPCSUtils/Utils/AttributeBlock.php | 292 - .../PHPCSUtils/Utils/Conditions.php | 156 - .../phpcsutils/PHPCSUtils/Utils/Constants.php | 217 - .../phpcsutils/PHPCSUtils/Utils/Context.php | 248 - .../PHPCSUtils/Utils/ControlStructures.php | 285 - .../phpcsutils/PHPCSUtils/Utils/FileInfo.php | 92 - .../phpcsutils/PHPCSUtils/Utils/FilePath.php | 154 - .../PHPCSUtils/Utils/FunctionDeclarations.php | 894 - .../PHPCSUtils/Utils/GetTokensAsString.php | 272 - .../phpcsutils/PHPCSUtils/Utils/Lists.php | 365 - .../PHPCSUtils/Utils/MessageHelper.php | 145 - .../PHPCSUtils/Utils/Namespaces.php | 403 - .../PHPCSUtils/Utils/NamingConventions.php | 116 - .../phpcsutils/PHPCSUtils/Utils/Numbers.php | 314 - .../PHPCSUtils/Utils/ObjectDeclarations.php | 661 - .../phpcsutils/PHPCSUtils/Utils/Operators.php | 251 - .../PHPCSUtils/Utils/Orthography.php | 120 - .../PHPCSUtils/Utils/Parentheses.php | 421 - .../PHPCSUtils/Utils/PassedParameters.php | 515 - .../phpcsutils/PHPCSUtils/Utils/Scopes.php | 143 - .../PHPCSUtils/Utils/TextStrings.php | 342 - .../PHPCSUtils/Utils/TypeString.php | 406 - .../PHPCSUtils/Utils/UseStatements.php | 446 - .../phpcsutils/PHPCSUtils/Utils/Variables.php | 405 - .../phpcsutils/PHPCSUtils/ruleset.xml | 4 - vendor/phpcsstandards/phpcsutils/README.md | 297 - .../phpcsstandards/phpcsutils/composer.json | 92 - .../phpcsutils/phpcsutils-autoload.php | 67 - vendor/phpstan/phpstan/LICENSE | 21 - vendor/phpstan/phpstan/README.md | 108 - vendor/phpstan/phpstan/bootstrap.php | 135 - vendor/phpstan/phpstan/composer.json | 31 - vendor/phpstan/phpstan/conf/bleedingEdge.neon | 2 - vendor/phpstan/phpstan/phpstan | 8 - vendor/phpstan/phpstan/phpstan.phar | Bin 23796390 -> 0 bytes vendor/phpstan/phpstan/phpstan.phar.asc | 16 - .../php-code-coverage/ChangeLog-10.1.md | 132 - vendor/phpunit/php-code-coverage/LICENSE | 29 - vendor/phpunit/php-code-coverage/README.md | 55 - vendor/phpunit/php-code-coverage/SECURITY.md | 30 - .../phpunit/php-code-coverage/composer.json | 69 - .../php-code-coverage/src/CodeCoverage.php | 631 - .../src/Data/ProcessedCodeCoverageData.php | 278 - .../src/Data/RawCodeCoverageData.php | 281 - .../php-code-coverage/src/Driver/Driver.php | 128 - .../src/Driver/PcovDriver.php | 80 - .../php-code-coverage/src/Driver/Selector.php | 62 - .../src/Driver/XdebugDriver.php | 162 - ...chAndPathCoverageNotSupportedException.php | 16 - ...DeadCodeDetectionNotSupportedException.php | 16 - .../DirectoryCouldNotBeCreatedException.php | 17 - .../src/Exception/Exception.php | 16 - .../FileCouldNotBeWrittenException.php | 16 - .../Exception/InvalidArgumentException.php | 14 - ...NoCodeCoverageDriverAvailableException.php | 20 - ...hPathCoverageSupportAvailableException.php | 20 - .../src/Exception/ParserException.php | 16 - .../PathExistsButIsNotDirectoryException.php | 22 - .../Exception/PcovNotAvailableException.php | 21 - .../src/Exception/ReflectionException.php | 16 - .../ReportAlreadyFinalizedException.php | 20 - ...ticAnalysisCacheNotConfiguredException.php | 16 - .../src/Exception/TestIdMissingException.php | 20 - .../UnintentionallyCoveredCodeException.php | 49 - .../WriteOperationFailedException.php | 22 - .../Exception/XdebugNotAvailableException.php | 21 - .../Exception/XdebugNotEnabledException.php | 21 - .../src/Exception/XmlException.php | 16 - .../phpunit/php-code-coverage/src/Filter.php | 128 - .../src/Node/AbstractNode.php | 250 - .../php-code-coverage/src/Node/Builder.php | 269 - .../php-code-coverage/src/Node/CrapIndex.php | 43 - .../php-code-coverage/src/Node/Directory.php | 370 - .../php-code-coverage/src/Node/File.php | 688 - .../php-code-coverage/src/Node/Iterator.php | 87 - .../php-code-coverage/src/Report/Clover.php | 258 - .../src/Report/Cobertura.php | 309 - .../php-code-coverage/src/Report/Crap4j.php | 153 - .../src/Report/Html/Colors.php | 66 - .../src/Report/Html/CustomCssFile.php | 50 - .../src/Report/Html/Facade.php | 153 - .../src/Report/Html/Renderer.php | 286 - .../src/Report/Html/Renderer/Dashboard.php | 298 - .../src/Report/Html/Renderer/Directory.php | 123 - .../src/Report/Html/Renderer/File.php | 1130 - .../Html/Renderer/Template/branches.html.dist | 9 - .../Renderer/Template/coverage_bar.html.dist | 5 - .../Template/coverage_bar_branch.html.dist | 5 - .../Renderer/Template/css/bootstrap.min.css | 7 - .../Html/Renderer/Template/css/custom.css | 0 .../Html/Renderer/Template/css/nv.d3.min.css | 1 - .../Html/Renderer/Template/css/octicons.css | 5 - .../Html/Renderer/Template/css/style.css | 158 - .../Renderer/Template/dashboard.html.dist | 281 - .../Template/dashboard_branch.html.dist | 281 - .../Renderer/Template/directory.html.dist | 60 - .../Template/directory_branch.html.dist | 62 - .../Template/directory_item.html.dist | 13 - .../Template/directory_item_branch.html.dist | 19 - .../Html/Renderer/Template/file.html.dist | 65 - .../Renderer/Template/file_branch.html.dist | 67 - .../Renderer/Template/file_item.html.dist | 14 - .../Template/file_item_branch.html.dist | 20 - .../Renderer/Template/icons/file-code.svg | 1 - .../Template/icons/file-directory.svg | 1 - .../Renderer/Template/js/bootstrap.min.js | 7 - .../Html/Renderer/Template/js/d3.min.js | 5 - .../Report/Html/Renderer/Template/js/file.js | 62 - .../Html/Renderer/Template/js/jquery.min.js | 2 - .../Html/Renderer/Template/js/nv.d3.min.js | 8 - .../Html/Renderer/Template/js/popper.min.js | 5 - .../Html/Renderer/Template/line.html.dist | 1 - .../Html/Renderer/Template/lines.html.dist | 5 - .../Renderer/Template/method_item.html.dist | 12 - .../Template/method_item_branch.html.dist | 18 - .../Html/Renderer/Template/paths.html.dist | 9 - .../php-code-coverage/src/Report/PHP.php | 41 - .../php-code-coverage/src/Report/Text.php | 315 - .../src/Report/Thresholds.php | 56 - .../src/Report/Xml/BuildInformation.php | 79 - .../src/Report/Xml/Coverage.php | 63 - .../src/Report/Xml/Directory.php | 17 - .../src/Report/Xml/Facade.php | 304 - .../php-code-coverage/src/Report/Xml/File.php | 80 - .../src/Report/Xml/Method.php | 58 - .../php-code-coverage/src/Report/Xml/Node.php | 86 - .../src/Report/Xml/Project.php | 90 - .../src/Report/Xml/Report.php | 99 - .../src/Report/Xml/Source.php | 41 - .../src/Report/Xml/Tests.php | 44 - .../src/Report/Xml/Totals.php | 123 - .../php-code-coverage/src/Report/Xml/Unit.php | 75 - .../src/StaticAnalysis/CacheWarmer.php | 32 - .../StaticAnalysis/CachingFileAnalyser.php | 182 - .../StaticAnalysis/CodeUnitFindingVisitor.php | 360 - .../ExecutableLinesFindingVisitor.php | 413 - .../src/StaticAnalysis/FileAnalyser.php | 60 - .../IgnoredLinesFindingVisitor.php | 121 - .../StaticAnalysis/ParsingFileAnalyser.php | 247 - .../php-code-coverage/src/TestSize/Known.php | 26 - .../php-code-coverage/src/TestSize/Large.php | 34 - .../php-code-coverage/src/TestSize/Medium.php | 34 - .../php-code-coverage/src/TestSize/Small.php | 34 - .../src/TestSize/TestSize.php | 78 - .../src/TestSize/Unknown.php | 29 - .../src/TestStatus/Failure.php | 29 - .../src/TestStatus/Known.php | 24 - .../src/TestStatus/Success.php | 29 - .../src/TestStatus/TestStatus.php | 65 - .../src/TestStatus/Unknown.php | 29 - .../php-code-coverage/src/Util/Filesystem.php | 37 - .../php-code-coverage/src/Util/Percentage.php | 59 - .../phpunit/php-code-coverage/src/Version.php | 27 - vendor/phpunit/php-file-iterator/ChangeLog.md | 174 - vendor/phpunit/php-file-iterator/LICENSE | 29 - vendor/phpunit/php-file-iterator/README.md | 17 - vendor/phpunit/php-file-iterator/SECURITY.md | 30 - .../phpunit/php-file-iterator/composer.json | 46 - .../php-file-iterator/src/ExcludeIterator.php | 80 - .../phpunit/php-file-iterator/src/Facade.php | 52 - .../phpunit/php-file-iterator/src/Factory.php | 106 - .../php-file-iterator/src/Iterator.php | 114 - .../phpunit/php-invoker/.psalm/baseline.xml | 8 - vendor/phpunit/php-invoker/.psalm/config.xml | 15 - vendor/phpunit/php-invoker/ChangeLog.md | 55 - vendor/phpunit/php-invoker/LICENSE | 29 - vendor/phpunit/php-invoker/README.md | 20 - vendor/phpunit/php-invoker/SECURITY.md | 9 - vendor/phpunit/php-invoker/composer.json | 54 - vendor/phpunit/php-invoker/src/Invoker.php | 67 - .../php-invoker/src/exceptions/Exception.php | 16 - ...cessControlExtensionNotLoadedException.php | 16 - .../src/exceptions/TimeoutException.php | 16 - vendor/phpunit/php-text-template/ChangeLog.md | 57 - vendor/phpunit/php-text-template/LICENSE | 29 - vendor/phpunit/php-text-template/README.md | 17 - vendor/phpunit/php-text-template/SECURITY.md | 30 - .../phpunit/php-text-template/composer.json | 45 - .../php-text-template/src/Template.php | 108 - .../src/exceptions/Exception.php | 16 - .../exceptions/InvalidArgumentException.php | 14 - .../src/exceptions/RuntimeException.php | 16 - vendor/phpunit/php-timer/ChangeLog.md | 145 - vendor/phpunit/php-timer/LICENSE | 29 - vendor/phpunit/php-timer/README.md | 106 - vendor/phpunit/php-timer/SECURITY.md | 9 - vendor/phpunit/php-timer/composer.json | 45 - vendor/phpunit/php-timer/src/Duration.php | 90 - .../php-timer/src/ResourceUsageFormatter.php | 73 - vendor/phpunit/php-timer/src/Timer.php | 40 - .../php-timer/src/exceptions/Exception.php | 16 - .../src/exceptions/NoActiveTimerException.php | 16 - ...nceStartOfRequestNotAvailableException.php | 16 - vendor/phpunit/phpunit/ChangeLog-10.5.md | 593 - vendor/phpunit/phpunit/DEPRECATIONS.md | 92 - vendor/phpunit/phpunit/LICENSE | 29 - vendor/phpunit/phpunit/README.md | 34 - vendor/phpunit/phpunit/SECURITY.md | 33 - vendor/phpunit/phpunit/composer.json | 95 - vendor/phpunit/phpunit/composer.lock | 1590 - vendor/phpunit/phpunit/phpunit | 104 - vendor/phpunit/phpunit/phpunit.xsd | 327 - vendor/phpunit/phpunit/schema/10.0.xsd | 284 - vendor/phpunit/phpunit/schema/10.1.xsd | 312 - vendor/phpunit/phpunit/schema/10.2.xsd | 319 - vendor/phpunit/phpunit/schema/10.3.xsd | 321 - vendor/phpunit/phpunit/schema/10.4.xsd | 322 - vendor/phpunit/phpunit/schema/8.5.xsd | 319 - vendor/phpunit/phpunit/schema/9.0.xsd | 315 - vendor/phpunit/phpunit/schema/9.1.xsd | 317 - vendor/phpunit/phpunit/schema/9.2.xsd | 317 - vendor/phpunit/phpunit/schema/9.3.xsd | 327 - vendor/phpunit/phpunit/schema/9.4.xsd | 328 - vendor/phpunit/phpunit/schema/9.5.xsd | 330 - .../Event/Dispatcher/CollectingDispatcher.php | 39 - .../Event/Dispatcher/DeferringDispatcher.php | 60 - .../src/Event/Dispatcher/DirectDispatcher.php | 139 - .../src/Event/Dispatcher/Dispatcher.php | 23 - .../Dispatcher/SubscribableDispatcher.php | 25 - .../src/Event/Emitter/DispatchingEmitter.php | 1320 - .../phpunit/src/Event/Emitter/Emitter.php | 335 - .../src/Event/Events/Application/Finished.php | 49 - .../Events/Application/FinishedSubscriber.php | 20 - .../src/Event/Events/Application/Started.php | 50 - .../Events/Application/StartedSubscriber.php | 20 - .../phpunit/src/Event/Events/Event.php | 20 - .../src/Event/Events/EventCollection.php | 62 - .../Event/Events/EventCollectionIterator.php | 57 - .../Events/Test/Assertion/AssertionFailed.php | 76 - .../Assertion/AssertionFailedSubscriber.php | 22 - .../Test/Assertion/AssertionSucceeded.php | 76 - .../AssertionSucceededSubscriber.php | 22 - .../Events/Test/ComparatorRegistered.php | 59 - .../Test/ComparatorRegisteredSubscriber.php | 20 - .../HookMethod/AfterLastTestMethodCalled.php | 68 - .../AfterLastTestMethodCalledSubscriber.php | 20 - .../HookMethod/AfterLastTestMethodErrored.php | 84 - .../AfterLastTestMethodErroredSubscriber.php | 20 - .../AfterLastTestMethodFinished.php | 82 - .../AfterLastTestMethodFinishedSubscriber.php | 20 - .../Test/HookMethod/AfterTestMethodCalled.php | 68 - .../AfterTestMethodCalledSubscriber.php | 20 - .../HookMethod/AfterTestMethodErrored.php | 84 - .../AfterTestMethodErroredSubscriber.php | 20 - .../HookMethod/AfterTestMethodFinished.php | 82 - .../AfterTestMethodFinishedSubscriber.php | 20 - .../BeforeFirstTestMethodCalled.php | 68 - .../BeforeFirstTestMethodCalledSubscriber.php | 20 - .../BeforeFirstTestMethodErrored.php | 84 - ...BeforeFirstTestMethodErroredSubscriber.php | 20 - .../BeforeFirstTestMethodFinished.php | 82 - ...eforeFirstTestMethodFinishedSubscriber.php | 20 - .../HookMethod/BeforeTestMethodCalled.php | 68 - .../BeforeTestMethodCalledSubscriber.php | 20 - .../HookMethod/BeforeTestMethodErrored.php | 84 - .../BeforeTestMethodErroredSubscriber.php | 20 - .../HookMethod/BeforeTestMethodFinished.php | 82 - .../BeforeTestMethodFinishedSubscriber.php | 20 - .../Test/HookMethod/PostConditionCalled.php | 68 - .../PostConditionCalledSubscriber.php | 20 - .../Test/HookMethod/PostConditionErrored.php | 84 - .../PostConditionErroredSubscriber.php | 20 - .../Test/HookMethod/PostConditionFinished.php | 82 - .../PostConditionFinishedSubscriber.php | 20 - .../Test/HookMethod/PreConditionCalled.php | 68 - .../PreConditionCalledSubscriber.php | 20 - .../Test/HookMethod/PreConditionErrored.php | 84 - .../PreConditionErroredSubscriber.php | 20 - .../Test/HookMethod/PreConditionFinished.php | 82 - .../PreConditionFinishedSubscriber.php | 20 - .../Events/Test/Issue/ConsideredRisky.php | 70 - .../Test/Issue/ConsideredRiskySubscriber.php | 20 - .../Test/Issue/DeprecationTriggered.php | 139 - .../Issue/DeprecationTriggeredSubscriber.php | 20 - .../Events/Test/Issue/ErrorTriggered.php | 115 - .../Test/Issue/ErrorTriggeredSubscriber.php | 20 - .../Events/Test/Issue/NoticeTriggered.php | 130 - .../Test/Issue/NoticeTriggeredSubscriber.php | 20 - .../Test/Issue/PhpDeprecationTriggered.php | 139 - .../PhpDeprecationTriggeredSubscriber.php | 20 - .../Events/Test/Issue/PhpNoticeTriggered.php | 130 - .../Issue/PhpNoticeTriggeredSubscriber.php | 20 - .../Events/Test/Issue/PhpWarningTriggered.php | 130 - .../Issue/PhpWarningTriggeredSubscriber.php | 20 - .../Issue/PhpunitDeprecationTriggered.php | 75 - .../PhpunitDeprecationTriggeredSubscriber.php | 20 - .../Test/Issue/PhpunitErrorTriggered.php | 76 - .../Issue/PhpunitErrorTriggeredSubscriber.php | 20 - .../Test/Issue/PhpunitWarningTriggered.php | 75 - .../PhpunitWarningTriggeredSubscriber.php | 20 - .../Events/Test/Issue/WarningTriggered.php | 130 - .../Test/Issue/WarningTriggeredSubscriber.php | 20 - .../Lifecycle/DataProviderMethodCalled.php | 60 - .../DataProviderMethodCalledSubscriber.php | 20 - .../Lifecycle/DataProviderMethodFinished.php | 76 - .../DataProviderMethodFinishedSubscriber.php | 20 - .../Event/Events/Test/Lifecycle/Finished.php | 57 - .../Test/Lifecycle/FinishedSubscriber.php | 20 - .../Test/Lifecycle/PreparationFailed.php | 50 - .../Lifecycle/PreparationFailedSubscriber.php | 20 - .../Test/Lifecycle/PreparationStarted.php | 50 - .../PreparationStartedSubscriber.php | 20 - .../Event/Events/Test/Lifecycle/Prepared.php | 50 - .../Test/Lifecycle/PreparedSubscriber.php | 20 - .../src/Event/Events/Test/Outcome/Errored.php | 67 - .../Events/Test/Outcome/ErroredSubscriber.php | 20 - .../src/Event/Events/Test/Outcome/Failed.php | 90 - .../Events/Test/Outcome/FailedSubscriber.php | 20 - .../Events/Test/Outcome/MarkedIncomplete.php | 67 - .../Outcome/MarkedIncompleteSubscriber.php | 20 - .../src/Event/Events/Test/Outcome/Passed.php | 50 - .../Events/Test/Outcome/PassedSubscriber.php | 20 - .../src/Event/Events/Test/Outcome/Skipped.php | 65 - .../Events/Test/Outcome/SkippedSubscriber.php | 20 - .../Events/Test/PrintedUnexpectedOutput.php | 61 - .../PrintedUnexpectedOutputSubscriber.php | 20 - .../Test/TestDouble/MockObjectCreated.php | 59 - .../MockObjectCreatedSubscriber.php | 20 - .../MockObjectForAbstractClassCreated.php | 59 - ...bjectForAbstractClassCreatedSubscriber.php | 20 - ...jectForIntersectionOfInterfacesCreated.php | 60 - ...ersectionOfInterfacesCreatedSubscriber.php | 20 - .../TestDouble/MockObjectForTraitCreated.php | 59 - .../MockObjectForTraitCreatedSubscriber.php | 20 - .../TestDouble/MockObjectFromWsdlCreated.php | 109 - .../MockObjectFromWsdlCreatedSubscriber.php | 20 - .../TestDouble/PartialMockObjectCreated.php | 73 - .../PartialMockObjectCreatedSubscriber.php | 20 - .../Test/TestDouble/TestProxyCreated.php | 66 - .../TestDouble/TestProxyCreatedSubscriber.php | 20 - .../Test/TestDouble/TestStubCreated.php | 59 - .../TestDouble/TestStubCreatedSubscriber.php | 20 - ...StubForIntersectionOfInterfacesCreated.php | 60 - ...ersectionOfInterfacesCreatedSubscriber.php | 20 - .../Events/TestRunner/BootstrapFinished.php | 49 - .../BootstrapFinishedSubscriber.php | 20 - .../Event/Events/TestRunner/Configured.php | 44 - .../TestRunner/ConfiguredSubscriber.php | 20 - .../TestRunner/DeprecationTriggered.php | 49 - .../DeprecationTriggeredSubscriber.php | 20 - .../Events/TestRunner/EventFacadeSealed.php | 38 - .../EventFacadeSealedSubscriber.php | 20 - .../Events/TestRunner/ExecutionAborted.php | 38 - .../TestRunner/ExecutionAbortedSubscriber.php | 20 - .../Events/TestRunner/ExecutionFinished.php | 38 - .../ExecutionFinishedSubscriber.php | 20 - .../Events/TestRunner/ExecutionStarted.php | 51 - .../TestRunner/ExecutionStartedSubscriber.php | 20 - .../TestRunner/ExtensionBootstrapped.php | 74 - .../ExtensionBootstrappedSubscriber.php | 20 - .../TestRunner/ExtensionLoadedFromPhar.php | 64 - .../ExtensionLoadedFromPharSubscriber.php | 20 - .../src/Event/Events/TestRunner/Finished.php | 38 - .../Events/TestRunner/FinishedSubscriber.php | 20 - .../TestRunner/GarbageCollectionDisabled.php | 38 - .../GarbageCollectionDisabledSubscriber.php | 20 - .../TestRunner/GarbageCollectionEnabled.php | 38 - .../GarbageCollectionEnabledSubscriber.php | 20 - .../TestRunner/GarbageCollectionTriggered.php | 38 - .../GarbageCollectionTriggeredSubscriber.php | 20 - .../src/Event/Events/TestRunner/Started.php | 38 - .../Events/TestRunner/StartedSubscriber.php | 20 - .../Events/TestRunner/WarningTriggered.php | 49 - .../TestRunner/WarningTriggeredSubscriber.php | 20 - .../src/Event/Events/TestSuite/Filtered.php | 50 - .../Events/TestSuite/FilteredSubscriber.php | 20 - .../src/Event/Events/TestSuite/Finished.php | 51 - .../Events/TestSuite/FinishedSubscriber.php | 20 - .../src/Event/Events/TestSuite/Loaded.php | 50 - .../Events/TestSuite/LoadedSubscriber.php | 20 - .../src/Event/Events/TestSuite/Skipped.php | 57 - .../Events/TestSuite/SkippedSubscriber.php | 20 - .../src/Event/Events/TestSuite/Sorted.php | 59 - .../Events/TestSuite/SortedSubscriber.php | 20 - .../src/Event/Events/TestSuite/Started.php | 51 - .../Events/TestSuite/StartedSubscriber.php | 20 - .../EventAlreadyAssignedException.php | 19 - .../EventFacadeIsSealedException.php | 19 - .../phpunit/src/Event/Exception/Exception.php | 14 - .../Exception/InvalidArgumentException.php | 17 - .../Event/Exception/InvalidEventException.php | 19 - .../Exception/InvalidSubscriberException.php | 19 - .../phpunit/src/Event/Exception/MapError.php | 19 - ...hanOneDataSetFromDataProviderException.php | 20 - .../NoComparisonFailureException.php | 20 - .../NoDataSetFromDataProviderException.php | 20 - .../NoPreviousThrowableException.php | 19 - .../NoTestCaseObjectOnCallStackException.php | 26 - .../src/Event/Exception/RuntimeException.php | 17 - ...bscriberTypeAlreadyRegisteredException.php | 19 - .../Event/Exception/UnknownEventException.php | 19 - .../Exception/UnknownEventTypeException.php | 19 - .../Exception/UnknownSubscriberException.php | 19 - .../UnknownSubscriberTypeException.php | 19 - vendor/phpunit/phpunit/src/Event/Facade.php | 274 - .../phpunit/phpunit/src/Event/Subscriber.php | 17 - vendor/phpunit/phpunit/src/Event/Tracer.php | 20 - vendor/phpunit/phpunit/src/Event/TypeMap.php | 192 - .../phpunit/src/Event/Value/ClassMethod.php | 54 - .../src/Event/Value/ComparisonFailure.php | 44 - .../Event/Value/ComparisonFailureBuilder.php | 70 - .../Event/Value/Runtime/OperatingSystem.php | 40 - .../phpunit/src/Event/Value/Runtime/PHP.php | 105 - .../src/Event/Value/Runtime/PHPUnit.php | 39 - .../src/Event/Value/Runtime/Runtime.php | 59 - .../src/Event/Value/Telemetry/Duration.php | 148 - .../Telemetry/GarbageCollectorStatus.php | 180 - .../GarbageCollectorStatusProvider.php | 20 - .../src/Event/Value/Telemetry/HRTime.php | 106 - .../src/Event/Value/Telemetry/Info.php | 85 - .../src/Event/Value/Telemetry/MemoryMeter.php | 22 - .../src/Event/Value/Telemetry/MemoryUsage.php | 40 - .../Php81GarbageCollectorStatusProvider.php | 42 - .../Php83GarbageCollectorStatusProvider.php | 40 - .../src/Event/Value/Telemetry/Snapshot.php | 51 - .../src/Event/Value/Telemetry/StopWatch.php | 20 - .../src/Event/Value/Telemetry/System.php | 39 - .../Value/Telemetry/SystemMemoryMeter.php | 31 - .../Event/Value/Telemetry/SystemStopWatch.php | 29 - .../Telemetry/SystemStopWatchWithOffset.php | 46 - .../phpunit/src/Event/Value/Test/Phpt.php | 42 - .../phpunit/src/Event/Value/Test/Test.php | 65 - .../src/Event/Value/Test/TestCollection.php | 60 - .../Value/Test/TestCollectionIterator.php | 57 - .../Test/TestData/DataFromDataProvider.php | 55 - .../Test/TestData/DataFromTestDependency.php | 31 - .../Event/Value/Test/TestData/TestData.php | 46 - .../Test/TestData/TestDataCollection.php | 104 - .../TestData/TestDataCollectionIterator.php | 57 - .../phpunit/src/Event/Value/Test/TestDox.php | 43 - .../src/Event/Value/Test/TestDoxBuilder.php | 53 - .../src/Event/Value/Test/TestMethod.php | 155 - .../Event/Value/Test/TestMethodBuilder.php | 99 - .../src/Event/Value/TestSuite/TestSuite.php | 79 - .../Value/TestSuite/TestSuiteBuilder.php | 112 - .../Value/TestSuite/TestSuiteForTestClass.php | 65 - ...TestSuiteForTestMethodWithDataProvider.php | 81 - .../Value/TestSuite/TestSuiteWithName.php | 26 - .../phpunit/src/Event/Value/Throwable.php | 103 - .../src/Event/Value/ThrowableBuilder.php | 44 - vendor/phpunit/phpunit/src/Exception.php | 16 - .../phpunit/phpunit/src/Framework/Assert.php | 2332 - .../src/Framework/Assert/Functions.php | 2707 - .../src/Framework/Attributes/After.php | 22 - .../src/Framework/Attributes/AfterClass.php | 22 - .../Framework/Attributes/BackupGlobals.php | 33 - .../Attributes/BackupStaticProperties.php | 33 - .../src/Framework/Attributes/Before.php | 22 - .../src/Framework/Attributes/BeforeClass.php | 22 - .../Attributes/CodeCoverageIgnore.php | 24 - .../src/Framework/Attributes/CoversClass.php | 42 - .../Framework/Attributes/CoversFunction.php | 42 - .../Framework/Attributes/CoversNothing.php | 22 - .../src/Framework/Attributes/DataProvider.php | 42 - .../Attributes/DataProviderExternal.php | 57 - .../src/Framework/Attributes/Depends.php | 42 - .../Framework/Attributes/DependsExternal.php | 57 - .../DependsExternalUsingDeepClone.php | 57 - .../DependsExternalUsingShallowClone.php | 57 - .../Framework/Attributes/DependsOnClass.php | 42 - .../DependsOnClassUsingDeepClone.php | 42 - .../DependsOnClassUsingShallowClone.php | 42 - .../Attributes/DependsUsingDeepClone.php | 42 - .../Attributes/DependsUsingShallowClone.php | 42 - .../Attributes/DoesNotPerformAssertions.php | 22 - .../ExcludeGlobalVariableFromBackup.php | 42 - .../ExcludeStaticPropertyFromBackup.php | 57 - .../src/Framework/Attributes/Group.php | 42 - .../Attributes/IgnoreClassForCodeCoverage.php | 44 - .../Attributes/IgnoreDeprecations.php | 22 - .../IgnoreFunctionForCodeCoverage.php | 44 - .../IgnoreMethodForCodeCoverage.php | 59 - .../src/Framework/Attributes/Large.php | 22 - .../src/Framework/Attributes/Medium.php | 22 - .../Framework/Attributes/PostCondition.php | 22 - .../src/Framework/Attributes/PreCondition.php | 22 - .../Attributes/PreserveGlobalState.php | 33 - .../Framework/Attributes/RequiresFunction.php | 42 - .../Framework/Attributes/RequiresMethod.php | 57 - .../Attributes/RequiresOperatingSystem.php | 42 - .../RequiresOperatingSystemFamily.php | 42 - .../src/Framework/Attributes/RequiresPhp.php | 42 - .../Attributes/RequiresPhpExtension.php | 57 - .../Framework/Attributes/RequiresPhpunit.php | 42 - .../Framework/Attributes/RequiresSetting.php | 57 - .../Attributes/RunClassInSeparateProcess.php | 22 - .../Attributes/RunInSeparateProcess.php | 22 - .../RunTestsInSeparateProcesses.php | 22 - .../src/Framework/Attributes/Small.php | 22 - .../phpunit/src/Framework/Attributes/Test.php | 22 - .../src/Framework/Attributes/TestDox.php | 42 - .../src/Framework/Attributes/TestWith.php | 33 - .../src/Framework/Attributes/TestWithJson.php | 42 - .../src/Framework/Attributes/Ticket.php | 42 - .../src/Framework/Attributes/UsesClass.php | 42 - .../src/Framework/Attributes/UsesFunction.php | 42 - .../Attributes/WithoutErrorHandler.php | 22 - .../Framework/Constraint/Boolean/IsFalse.php | 33 - .../Framework/Constraint/Boolean/IsTrue.php | 33 - .../src/Framework/Constraint/Callback.php | 73 - .../Constraint/Cardinality/Count.php | 126 - .../Constraint/Cardinality/GreaterThan.php | 42 - .../Constraint/Cardinality/IsEmpty.php | 66 - .../Constraint/Cardinality/LessThan.php | 42 - .../Constraint/Cardinality/SameSize.php | 29 - .../src/Framework/Constraint/Constraint.php | 264 - .../Framework/Constraint/Equality/IsEqual.php | 120 - .../Equality/IsEqualCanonicalizing.php | 103 - .../Equality/IsEqualIgnoringCase.php | 104 - .../Constraint/Equality/IsEqualWithDelta.php | 92 - .../Constraint/Exception/Exception.php | 81 - .../Constraint/Exception/ExceptionCode.php | 57 - .../ExceptionMessageIsOrContains.php | 69 - ...ceptionMessageMatchesRegularExpression.php | 73 - .../Constraint/Filesystem/DirectoryExists.php | 50 - .../Constraint/Filesystem/FileExists.php | 50 - .../Constraint/Filesystem/IsReadable.php | 50 - .../Constraint/Filesystem/IsWritable.php | 50 - .../src/Framework/Constraint/IsAnything.php | 51 - .../src/Framework/Constraint/IsIdentical.php | 123 - .../src/Framework/Constraint/JsonMatches.php | 97 - .../Framework/Constraint/Math/IsFinite.php | 35 - .../Framework/Constraint/Math/IsInfinite.php | 35 - .../src/Framework/Constraint/Math/IsNan.php | 35 - .../Constraint/Object/ObjectEquals.php | 142 - .../Constraint/Object/ObjectHasProperty.php | 80 - .../Constraint/Operator/BinaryOperator.php | 132 - .../Constraint/Operator/LogicalAnd.php | 54 - .../Constraint/Operator/LogicalNot.php | 141 - .../Constraint/Operator/LogicalOr.php | 54 - .../Constraint/Operator/LogicalXor.php | 66 - .../Constraint/Operator/Operator.php | 55 - .../Constraint/Operator/UnaryOperator.php | 128 - .../Framework/Constraint/String/IsJson.php | 91 - .../Constraint/String/RegularExpression.php | 46 - .../Constraint/String/StringContains.php | 160 - .../Constraint/String/StringEndsWith.php | 50 - .../StringEqualsStringIgnoringLineEndings.php | 57 - .../String/StringMatchesFormatDescription.php | 117 - .../Constraint/String/StringStartsWith.php | 50 - .../Constraint/Traversable/ArrayHasKey.php | 64 - .../Constraint/Traversable/IsList.php | 51 - .../Traversable/TraversableContains.php | 55 - .../Traversable/TraversableContainsEqual.php | 38 - .../TraversableContainsIdentical.php | 37 - .../Traversable/TraversableContainsOnly.php | 75 - .../Constraint/Type/IsInstanceOf.php | 79 - .../src/Framework/Constraint/Type/IsNull.php | 33 - .../src/Framework/Constraint/Type/IsType.php | 205 - .../src/Framework/DataProviderTestSuite.php | 76 - .../Exception/AssertionFailedError.php | 26 - .../Exception/CodeCoverageException.php | 19 - .../Exception/EmptyStringException.php | 19 - .../src/Framework/Exception/Exception.php | 82 - .../Exception/ExpectationFailedException.php | 39 - .../GeneratorNotSupportedException.php | 30 - .../Exception/Incomplete/IncompleteTest.php | 21 - .../Incomplete/IncompleteTestError.php | 19 - .../Exception/InvalidArgumentException.php | 19 - .../InvalidCoversTargetException.php | 19 - .../InvalidDataProviderException.php | 19 - .../Exception/InvalidDependencyException.php | 19 - .../Exception/NoChildTestSuiteException.php | 19 - .../ActualValueIsNotAnObjectException.php | 25 - ...hodDoesNotAcceptParameterTypeException.php | 32 - ...dDoesNotDeclareBoolReturnTypeException.php | 31 - ...NotDeclareExactlyOneParameterException.php | 31 - ...odDoesNotDeclareParameterTypeException.php | 31 - .../ComparisonMethodDoesNotExistException.php | 31 - .../Exception/PhptAssertionFailedError.php | 55 - .../Exception/ProcessIsolationException.php | 19 - .../Exception/Skipped/SkippedTest.php | 21 - .../Skipped/SkippedTestSuiteError.php | 19 - .../Skipped/SkippedWithMessageException.php | 19 - .../UnknownClassOrInterfaceException.php | 30 - .../Exception/UnknownTypeException.php | 30 - .../Framework/ExecutionOrderDependency.php | 193 - .../MockObject/ConfigurableMethod.php | 83 - .../Exception/BadMethodCallException.php | 19 - .../CannotUseOnlyMethodsException.php | 31 - .../MockObject/Exception/Exception.php | 19 - .../IncompatibleReturnValueException.php | 33 - .../MatchBuilderNotFoundException.php | 30 - .../MatcherAlreadyRegisteredException.php | 30 - .../MethodCannotBeConfiguredException.php | 30 - .../MethodNameAlreadyConfiguredException.php | 23 - .../MethodNameNotConfiguredException.php | 23 - ...odParametersAlreadyConfiguredException.php | 23 - .../NeverReturningMethodException.php | 34 - .../NoMoreReturnValuesConfiguredException.php | 32 - .../ReturnValueNotConfiguredException.php | 31 - .../MockObject/Exception/RuntimeException.php | 19 - .../CannotUseAddMethodsException.php | 31 - .../Exception/ClassIsEnumerationException.php | 30 - .../Exception/ClassIsFinalException.php | 30 - .../Exception/ClassIsReadonlyException.php | 30 - .../Exception/DuplicateMethodException.php | 37 - .../Generator/Exception/Exception.php | 21 - .../Exception/InvalidMethodNameException.php | 30 - .../Exception/NameAlreadyInUseException.php | 33 - ...ConstructorInvocationRequiredException.php | 23 - .../Exception/ReflectionException.php | 19 - .../Generator/Exception/RuntimeException.php | 19 - .../SoapExtensionNotAvailableException.php | 25 - .../Exception/UnknownClassException.php | 30 - .../Exception/UnknownTraitException.php | 32 - .../Exception/UnknownTypeException.php | 30 - .../MockObject/Generator/Generator.php | 1085 - .../MockObject/Generator/MockClass.php | 70 - .../MockObject/Generator/MockMethod.php | 396 - .../MockObject/Generator/MockMethodSet.php | 47 - .../MockObject/Generator/MockTrait.php | 50 - .../MockObject/Generator/MockType.php | 23 - .../MockObject/Generator/TemplateLoader.php | 39 - .../Generator/templates/deprecation.tpl | 2 - .../Generator/templates/doubled_method.tpl | 35 - .../templates/doubled_static_method.tpl | 5 - .../Generator/templates/intersection.tpl | 5 - .../Generator/templates/proxied_method.tpl | 37 - .../Generator/templates/test_double_class.tpl | 5 - .../Generator/templates/trait_class.tpl | 6 - .../Generator/templates/wsdl_class.tpl | 9 - .../Generator/templates/wsdl_method.tpl | 4 - .../src/Framework/MockObject/MockBuilder.php | 491 - .../Runtime/Api/DoubledCloneMethod.php | 23 - .../MockObject/Runtime/Api/Method.php | 33 - .../MockObject/Runtime/Api/MockObjectApi.php | 54 - .../Runtime/Api/ProxiedCloneMethod.php | 25 - .../MockObject/Runtime/Api/StubApi.php | 56 - .../MockObject/Runtime/Builder/Identity.php | 25 - .../Runtime/Builder/InvocationMocker.php | 325 - .../Runtime/Builder/InvocationStubber.php | 40 - .../Runtime/Builder/MethodNameMatch.php | 26 - .../Runtime/Builder/ParametersMatch.php | 51 - .../MockObject/Runtime/Builder/Stub.php | 26 - .../Runtime/Interface/MockObject.php | 23 - .../Runtime/Interface/MockObjectInternal.php | 24 - .../MockObject/Runtime/Interface/Stub.php | 21 - .../Runtime/Interface/StubInternal.php | 26 - .../MockObject/Runtime/Invocation.php | 152 - .../MockObject/Runtime/InvocationHandler.php | 154 - .../Framework/MockObject/Runtime/Matcher.php | 212 - .../Runtime/MethodNameConstraint.php | 42 - .../Runtime/ReturnValueGenerator.php | 250 - .../Runtime/Rule/AnyInvokedCount.php | 34 - .../MockObject/Runtime/Rule/AnyParameters.php | 28 - .../Runtime/Rule/InvocationOrder.php | 52 - .../Runtime/Rule/InvokedAtLeastCount.php | 66 - .../Runtime/Rule/InvokedAtLeastOnce.php | 48 - .../Runtime/Rule/InvokedAtMostCount.php | 66 - .../MockObject/Runtime/Rule/InvokedCount.php | 94 - .../MockObject/Runtime/Rule/MethodName.php | 60 - .../MockObject/Runtime/Rule/Parameters.php | 141 - .../Runtime/Rule/ParametersRule.php | 26 - .../Runtime/Stub/ConsecutiveCalls.php | 53 - .../MockObject/Runtime/Stub/Exception.php | 36 - .../Runtime/Stub/ReturnArgument.php | 32 - .../Runtime/Stub/ReturnCallback.php | 36 - .../Runtime/Stub/ReturnReference.php | 32 - .../MockObject/Runtime/Stub/ReturnSelf.php | 29 - .../MockObject/Runtime/Stub/ReturnStub.php | 32 - .../Runtime/Stub/ReturnValueMap.php | 49 - .../MockObject/Runtime/Stub/Stub.php | 26 - .../phpunit/src/Framework/Reorderable.php | 30 - .../phpunit/src/Framework/SelfDescribing.php | 23 - vendor/phpunit/phpunit/src/Framework/Test.php | 20 - .../phpunit/src/Framework/TestBuilder.php | 282 - .../phpunit/src/Framework/TestCase.php | 2414 - .../phpunit/src/Framework/TestRunner.php | 471 - .../phpunit/src/Framework/TestSize/Known.php | 30 - .../phpunit/src/Framework/TestSize/Large.php | 38 - .../phpunit/src/Framework/TestSize/Medium.php | 38 - .../phpunit/src/Framework/TestSize/Small.php | 38 - .../src/Framework/TestSize/TestSize.php | 82 - .../src/Framework/TestSize/Unknown.php | 33 - .../src/Framework/TestStatus/Deprecation.php | 38 - .../src/Framework/TestStatus/Error.php | 38 - .../src/Framework/TestStatus/Failure.php | 38 - .../src/Framework/TestStatus/Incomplete.php | 38 - .../src/Framework/TestStatus/Known.php | 28 - .../src/Framework/TestStatus/Notice.php | 38 - .../src/Framework/TestStatus/Risky.php | 38 - .../src/Framework/TestStatus/Skipped.php | 38 - .../src/Framework/TestStatus/Success.php | 38 - .../src/Framework/TestStatus/TestStatus.php | 195 - .../src/Framework/TestStatus/Unknown.php | 38 - .../src/Framework/TestStatus/Warning.php | 38 - .../phpunit/src/Framework/TestSuite.php | 726 - .../src/Framework/TestSuiteIterator.php | 84 - .../phpunit/src/Logging/EventLogger.php | 68 - .../src/Logging/JUnit/JunitXmlLogger.php | 464 - .../Logging/JUnit/Subscriber/Subscriber.php | 30 - .../Subscriber/TestErroredSubscriber.php | 30 - .../JUnit/Subscriber/TestFailedSubscriber.php | 30 - .../Subscriber/TestFinishedSubscriber.php | 30 - .../TestMarkedIncompleteSubscriber.php | 30 - .../TestPreparationFailedSubscriber.php | 30 - .../TestPreparationStartedSubscriber.php | 30 - .../Subscriber/TestPreparedSubscriber.php | 30 - .../TestPrintedUnexpectedOutputSubscriber.php | 26 - .../TestRunnerExecutionFinishedSubscriber.php | 26 - .../Subscriber/TestSkippedSubscriber.php | 30 - .../TestSuiteFinishedSubscriber.php | 26 - .../Subscriber/TestSuiteStartedSubscriber.php | 26 - .../TeamCity/Subscriber/Subscriber.php | 30 - .../TestConsideredRiskySubscriber.php | 30 - .../Subscriber/TestErroredSubscriber.php | 30 - .../Subscriber/TestFailedSubscriber.php | 30 - .../Subscriber/TestFinishedSubscriber.php | 30 - .../TestMarkedIncompleteSubscriber.php | 30 - .../Subscriber/TestPreparedSubscriber.php | 26 - .../TestRunnerExecutionFinishedSubscriber.php | 26 - .../Subscriber/TestSkippedSubscriber.php | 30 - ...BeforeFirstTestMethodErroredSubscriber.php | 30 - .../TestSuiteFinishedSubscriber.php | 26 - .../Subscriber/TestSuiteSkippedSubscriber.php | 30 - .../Subscriber/TestSuiteStartedSubscriber.php | 26 - .../src/Logging/TeamCity/TeamCityLogger.php | 425 - .../src/Logging/TestDox/HtmlRenderer.php | 158 - .../src/Logging/TestDox/NamePrettifier.php | 305 - .../src/Logging/TestDox/PlainTextRenderer.php | 79 - .../TestResult/Subscriber/Subscriber.php | 30 - .../TestConsideredRiskySubscriber.php | 26 - .../Subscriber/TestErroredSubscriber.php | 26 - .../Subscriber/TestFailedSubscriber.php | 26 - .../Subscriber/TestFinishedSubscriber.php | 30 - .../TestMarkedIncompleteSubscriber.php | 26 - .../Subscriber/TestPassedSubscriber.php | 26 - .../Subscriber/TestPreparedSubscriber.php | 26 - .../Subscriber/TestSkippedSubscriber.php | 26 - .../TestTriggeredDeprecationSubscriber.php | 26 - .../TestTriggeredNoticeSubscriber.php | 26 - .../TestTriggeredPhpDeprecationSubscriber.php | 26 - .../TestTriggeredPhpNoticeSubscriber.php | 26 - .../TestTriggeredPhpWarningSubscriber.php | 26 - ...tTriggeredPhpunitDeprecationSubscriber.php | 26 - .../TestTriggeredPhpunitErrorSubscriber.php | 26 - .../TestTriggeredPhpunitWarningSubscriber.php | 26 - .../TestTriggeredWarningSubscriber.php | 26 - .../Logging/TestDox/TestResult/TestResult.php | 58 - .../TestResult/TestResultCollection.php | 55 - .../TestResultCollectionIterator.php | 59 - .../TestResult/TestResultCollector.php | 447 - vendor/phpunit/phpunit/src/Metadata/After.php | 26 - .../phpunit/src/Metadata/AfterClass.php | 26 - .../phpunit/src/Metadata/Api/CodeCoverage.php | 317 - .../phpunit/src/Metadata/Api/DataProvider.php | 327 - .../phpunit/src/Metadata/Api/Dependencies.php | 57 - .../phpunit/src/Metadata/Api/Groups.php | 132 - .../phpunit/src/Metadata/Api/HookMethods.php | 108 - .../phpunit/src/Metadata/Api/Requirements.php | 154 - .../phpunit/src/Metadata/BackupGlobals.php | 43 - .../src/Metadata/BackupStaticProperties.php | 43 - .../phpunit/phpunit/src/Metadata/Before.php | 26 - .../phpunit/src/Metadata/BeforeClass.php | 26 - .../phpunit/phpunit/src/Metadata/Covers.php | 50 - .../phpunit/src/Metadata/CoversClass.php | 60 - .../src/Metadata/CoversDefaultClass.php | 50 - .../phpunit/src/Metadata/CoversFunction.php | 58 - .../phpunit/src/Metadata/CoversNothing.php | 26 - .../phpunit/src/Metadata/DataProvider.php | 65 - .../phpunit/src/Metadata/DependsOnClass.php | 64 - .../phpunit/src/Metadata/DependsOnMethod.php | 79 - .../src/Metadata/DoesNotPerformAssertions.php | 26 - ...otSupportedForInternalClassesException.php | 35 - .../src/Metadata/Exception/Exception.php | 14 - .../Exception/InvalidAttributeException.php | 45 - .../InvalidVersionRequirementException.php | 16 - .../NoVersionRequirementException.php | 16 - .../Exception/ReflectionException.php | 22 - .../ExcludeGlobalVariableFromBackup.php | 50 - .../ExcludeStaticPropertyFromBackup.php | 65 - vendor/phpunit/phpunit/src/Metadata/Group.php | 50 - .../Metadata/IgnoreClassForCodeCoverage.php | 52 - .../src/Metadata/IgnoreDeprecations.php | 26 - .../IgnoreFunctionForCodeCoverage.php | 52 - .../Metadata/IgnoreMethodForCodeCoverage.php | 67 - .../phpunit/phpunit/src/Metadata/Metadata.php | 835 - .../src/Metadata/MetadataCollection.php | 561 - .../Metadata/MetadataCollectionIterator.php | 57 - .../Metadata/Parser/Annotation/DocBlock.php | 267 - .../Metadata/Parser/Annotation/Registry.php | 98 - .../src/Metadata/Parser/AnnotationParser.php | 568 - .../src/Metadata/Parser/AttributeParser.php | 698 - .../src/Metadata/Parser/CachingParser.php | 88 - .../phpunit/src/Metadata/Parser/Parser.php | 37 - .../src/Metadata/Parser/ParserChain.php | 77 - .../phpunit/src/Metadata/Parser/Registry.php | 38 - .../phpunit/src/Metadata/PostCondition.php | 26 - .../phpunit/src/Metadata/PreCondition.php | 26 - .../src/Metadata/PreserveGlobalState.php | 43 - .../phpunit/src/Metadata/RequiresFunction.php | 50 - .../phpunit/src/Metadata/RequiresMethod.php | 65 - .../src/Metadata/RequiresOperatingSystem.php | 50 - .../RequiresOperatingSystemFamily.php | 50 - .../phpunit/src/Metadata/RequiresPhp.php | 45 - .../src/Metadata/RequiresPhpExtension.php | 74 - .../phpunit/src/Metadata/RequiresPhpunit.php | 45 - .../phpunit/src/Metadata/RequiresSetting.php | 65 - .../Metadata/RunClassInSeparateProcess.php | 26 - .../src/Metadata/RunInSeparateProcess.php | 26 - .../Metadata/RunTestsInSeparateProcesses.php | 26 - vendor/phpunit/phpunit/src/Metadata/Test.php | 26 - .../phpunit/phpunit/src/Metadata/TestDox.php | 50 - .../phpunit/phpunit/src/Metadata/TestWith.php | 43 - vendor/phpunit/phpunit/src/Metadata/Uses.php | 50 - .../phpunit/src/Metadata/UsesClass.php | 60 - .../phpunit/src/Metadata/UsesDefaultClass.php | 50 - .../phpunit/src/Metadata/UsesFunction.php | 58 - .../Version/ComparisonRequirement.php | 40 - .../Version/ConstraintRequirement.php | 56 - .../src/Metadata/Version/Requirement.php | 57 - .../src/Metadata/WithoutErrorHandler.php | 26 - .../phpunit/src/Runner/Baseline/Baseline.php | 61 - .../Exception/CannotLoadBaselineException.php | 22 - .../FileDoesNotHaveLineException.php | 33 - .../phpunit/src/Runner/Baseline/Generator.php | 120 - .../phpunit/src/Runner/Baseline/Issue.php | 147 - .../phpunit/src/Runner/Baseline/Reader.php | 102 - .../Baseline/RelativePathCalculator.php | 105 - .../Runner/Baseline/Subscriber/Subscriber.php | 30 - .../TestTriggeredDeprecationSubscriber.php | 31 - .../TestTriggeredNoticeSubscriber.php | 31 - .../TestTriggeredPhpDeprecationSubscriber.php | 31 - .../TestTriggeredPhpNoticeSubscriber.php | 31 - .../TestTriggeredPhpWarningSubscriber.php | 31 - .../TestTriggeredWarningSubscriber.php | 31 - .../phpunit/src/Runner/Baseline/Writer.php | 67 - .../phpunit/src/Runner/CodeCoverage.php | 426 - .../phpunit/src/Runner/ErrorHandler.php | 225 - .../Exception/ClassCannotBeFoundException.php | 32 - .../ClassDoesNotExtendTestCaseException.php | 32 - .../Exception/ClassIsAbstractException.php | 32 - .../CodeCoverageFileExistsException.php | 21 - .../DirectoryDoesNotExistException.php | 31 - .../src/Runner/Exception/ErrorException.php | 21 - .../src/Runner/Exception/Exception.php | 19 - .../Exception/FileDoesNotExistException.php | 31 - .../Exception/InvalidOrderException.php | 21 - .../Exception/InvalidPhptFileException.php | 21 - .../ParameterDoesNotExistException.php | 31 - ...hptExternalFileCannotBeLoadedException.php | 32 - .../UnsupportedPhptSectionException.php | 31 - .../src/Runner/Extension/Extension.php | 20 - .../Extension/ExtensionBootstrapper.php | 97 - .../phpunit/src/Runner/Extension/Facade.php | 110 - .../Runner/Extension/ParameterCollection.php | 53 - .../src/Runner/Extension/PharLoader.php | 150 - .../Filter/ExcludeGroupFilterIterator.php | 25 - .../phpunit/src/Runner/Filter/Factory.php | 81 - .../src/Runner/Filter/GroupFilterIterator.php | 65 - .../Filter/IncludeGroupFilterIterator.php | 25 - .../src/Runner/Filter/NameFilterIterator.php | 142 - .../Runner/Filter/TestIdFilterIterator.php | 63 - .../GarbageCollectionHandler.php | 89 - .../ExecutionFinishedSubscriber.php | 31 - .../Subscriber/ExecutionStartedSubscriber.php | 31 - .../Subscriber/Subscriber.php | 30 - .../Subscriber/TestFinishedSubscriber.php | 31 - .../phpunit/src/Runner/PhptTestCase.php | 873 - .../Runner/ResultCache/DefaultResultCache.php | 166 - .../Runner/ResultCache/NullResultCache.php | 46 - .../src/Runner/ResultCache/ResultCache.php | 32 - .../Runner/ResultCache/ResultCacheHandler.php | 157 - .../ResultCache/Subscriber/Subscriber.php | 30 - .../TestConsideredRiskySubscriber.php | 26 - .../Subscriber/TestErroredSubscriber.php | 26 - .../Subscriber/TestFailedSubscriber.php | 26 - .../Subscriber/TestFinishedSubscriber.php | 31 - .../TestMarkedIncompleteSubscriber.php | 26 - .../Subscriber/TestPreparedSubscriber.php | 26 - .../Subscriber/TestSkippedSubscriber.php | 31 - .../TestSuiteFinishedSubscriber.php | 26 - .../Subscriber/TestSuiteStartedSubscriber.php | 26 - .../src/Runner/TestResult/Collector.php | 667 - .../phpunit/src/Runner/TestResult/Facade.php | 105 - .../phpunit/src/Runner/TestResult/Issue.php | 115 - .../src/Runner/TestResult/PassedTests.php | 124 - .../AfterTestClassMethodErroredSubscriber.php | 26 - ...BeforeTestClassMethodErroredSubscriber.php | 26 - .../Subscriber/ExecutionStartedSubscriber.php | 26 - .../TestResult/Subscriber/Subscriber.php | 30 - .../TestConsideredRiskySubscriber.php | 26 - .../Subscriber/TestErroredSubscriber.php | 26 - .../Subscriber/TestFailedSubscriber.php | 26 - .../Subscriber/TestFinishedSubscriber.php | 26 - .../TestMarkedIncompleteSubscriber.php | 26 - .../Subscriber/TestPreparedSubscriber.php | 26 - ...stRunnerTriggeredDeprecationSubscriber.php | 26 - .../TestRunnerTriggeredWarningSubscriber.php | 26 - .../Subscriber/TestSkippedSubscriber.php | 26 - .../TestSuiteFinishedSubscriber.php | 26 - .../Subscriber/TestSuiteSkippedSubscriber.php | 26 - .../Subscriber/TestSuiteStartedSubscriber.php | 26 - .../TestTriggeredDeprecationSubscriber.php | 26 - .../TestTriggeredErrorSubscriber.php | 26 - .../TestTriggeredNoticeSubscriber.php | 26 - .../TestTriggeredPhpDeprecationSubscriber.php | 26 - .../TestTriggeredPhpNoticeSubscriber.php | 26 - .../TestTriggeredPhpWarningSubscriber.php | 26 - ...tTriggeredPhpunitDeprecationSubscriber.php | 26 - .../TestTriggeredPhpunitErrorSubscriber.php | 26 - .../TestTriggeredPhpunitWarningSubscriber.php | 26 - .../TestTriggeredWarningSubscriber.php | 26 - .../src/Runner/TestResult/TestResult.php | 586 - .../phpunit/src/Runner/TestSuiteLoader.php | 143 - .../phpunit/src/Runner/TestSuiteSorter.php | 300 - vendor/phpunit/phpunit/src/Runner/Version.php | 63 - .../phpunit/src/TextUI/Application.php | 752 - .../phpunit/src/TextUI/Command/Command.php | 20 - .../Commands/AtLeastVersionCommand.php | 37 - .../Commands/CheckPhpConfigurationCommand.php | 166 - .../Commands/GenerateConfigurationCommand.php | 103 - .../Command/Commands/ListGroupsCommand.php | 83 - .../Commands/ListTestSuitesCommand.php | 74 - .../Commands/ListTestsAsTextCommand.php | 87 - .../Commands/ListTestsAsXmlCommand.php | 142 - .../Commands/MigrateConfigurationCommand.php | 64 - .../Command/Commands/ShowHelpCommand.php | 35 - .../Command/Commands/ShowVersionCommand.php | 23 - .../Command/Commands/VersionCheckCommand.php | 74 - .../Commands/WarmCodeCoverageCacheCommand.php | 81 - .../phpunit/src/TextUI/Command/Result.php | 48 - .../src/TextUI/Configuration/Builder.php | 52 - .../src/TextUI/Configuration/Cli/Builder.php | 1252 - .../Configuration/Cli/Configuration.php | 2325 - .../TextUI/Configuration/Cli/Exception.php | 21 - .../Cli/XmlConfigurationFileFinder.php | 69 - .../CodeCoverageFilterRegistry.php | 78 - .../TextUI/Configuration/Configuration.php | 1393 - .../Exception/CannotFindSchemaException.php | 22 - ...deCoverageReportNotConfiguredException.php | 21 - .../ConfigurationCannotBeBuiltException.php | 21 - .../Configuration/Exception/Exception.php | 19 - .../FilterNotConfiguredException.php | 21 - .../LoggingNotConfiguredException.php | 21 - .../Exception/NoBaselineException.php | 21 - .../Exception/NoBootstrapException.php | 21 - .../Exception/NoCacheDirectoryException.php | 21 - .../Exception/NoCliArgumentException.php | 21 - .../NoConfigurationFileException.php | 21 - .../NoCoverageCacheDirectoryException.php | 21 - .../Exception/NoCustomCssFileException.php | 21 - .../Exception/NoDefaultTestSuiteException.php | 21 - .../NoPharExtensionDirectoryException.php | 21 - .../src/TextUI/Configuration/Merger.php | 963 - .../src/TextUI/Configuration/PhpHandler.php | 123 - .../src/TextUI/Configuration/Registry.php | 111 - .../src/TextUI/Configuration/SourceFilter.php | 51 - .../src/TextUI/Configuration/SourceMapper.php | 99 - .../TextUI/Configuration/TestSuiteBuilder.php | 146 - .../TextUI/Configuration/Value/Constant.php | 37 - .../Value/ConstantCollection.php | 60 - .../Value/ConstantCollectionIterator.php | 64 - .../TextUI/Configuration/Value/Directory.php | 30 - .../Value/DirectoryCollection.php | 65 - .../Value/DirectoryCollectionIterator.php | 64 - .../Value/ExtensionBootstrap.php | 54 - .../Value/ExtensionBootstrapCollection.php | 53 - .../ExtensionBootstrapCollectionIterator.php | 64 - .../src/TextUI/Configuration/Value/File.php | 39 - .../Configuration/Value/FileCollection.php | 65 - .../Value/FileCollectionIterator.php | 64 - .../Configuration/Value/FilterDirectory.php | 53 - .../Value/FilterDirectoryCollection.php | 65 - .../FilterDirectoryCollectionIterator.php | 64 - .../src/TextUI/Configuration/Value/Group.php | 30 - .../Configuration/Value/GroupCollection.php | 72 - .../Value/GroupCollectionIterator.php | 64 - .../TextUI/Configuration/Value/IniSetting.php | 37 - .../Value/IniSettingCollection.php | 60 - .../Value/IniSettingCollectionIterator.php | 64 - .../src/TextUI/Configuration/Value/Php.php | 100 - .../src/TextUI/Configuration/Value/Source.php | 166 - .../Configuration/Value/TestDirectory.php | 69 - .../Value/TestDirectoryCollection.php | 65 - .../Value/TestDirectoryCollectionIterator.php | 64 - .../TextUI/Configuration/Value/TestFile.php | 46 - .../Value/TestFileCollection.php | 65 - .../Value/TestFileCollectionIterator.php | 64 - .../TextUI/Configuration/Value/TestSuite.php | 60 - .../Value/TestSuiteCollection.php | 65 - .../Value/TestSuiteCollectionIterator.php | 64 - .../TextUI/Configuration/Value/Variable.php | 44 - .../Value/VariableCollection.php | 60 - .../Value/VariableCollectionIterator.php | 64 - .../Xml/CodeCoverage/CodeCoverage.php | 295 - .../Xml/CodeCoverage/Report/Clover.php | 34 - .../Xml/CodeCoverage/Report/Cobertura.php | 34 - .../Xml/CodeCoverage/Report/Crap4j.php | 41 - .../Xml/CodeCoverage/Report/Html.php | 106 - .../Xml/CodeCoverage/Report/Php.php | 34 - .../Xml/CodeCoverage/Report/Text.php | 48 - .../Xml/CodeCoverage/Report/Xml.php | 34 - .../Configuration/Xml/Configuration.php | 104 - .../Xml/DefaultConfiguration.php | 166 - .../TextUI/Configuration/Xml/Exception.php | 21 - .../TextUI/Configuration/Xml/Generator.php | 73 - .../src/TextUI/Configuration/Xml/Groups.php | 51 - .../Xml/LoadedFromFileConfiguration.php | 67 - .../src/TextUI/Configuration/Xml/Loader.php | 1052 - .../Configuration/Xml/Logging/Junit.php | 34 - .../Configuration/Xml/Logging/Logging.php | 105 - .../Configuration/Xml/Logging/TeamCity.php | 34 - .../Xml/Logging/TestDox/Html.php | 34 - .../Xml/Logging/TestDox/Text.php | 34 - .../Xml/Migration/MigrationBuilder.php | 88 - .../Xml/Migration/MigrationException.php | 22 - .../Migration/Migrations/ConvertLogTypes.php | 55 - .../Migrations/CoverageCloverToReport.php | 34 - .../Migrations/CoverageCrap4jToReport.php | 35 - .../Migrations/CoverageHtmlToReport.php | 35 - .../Migrations/CoveragePhpToReport.php | 33 - .../Migrations/CoverageTextToReport.php | 35 - .../Migrations/CoverageXmlToReport.php | 33 - .../IntroduceCacheDirectoryAttribute.php | 35 - .../Migrations/IntroduceCoverageElement.php | 30 - .../Migrations/LogToReportMigration.php | 81 - .../Xml/Migration/Migrations/Migration.php | 22 - ...ttributesFromFilterWhitelistToCoverage.php | 53 - .../MoveAttributesFromRootToCoverage.php | 52 - .../MoveCoverageDirectoriesToSource.php | 64 - .../MoveWhitelistExcludesToCoverage.php | 73 - .../MoveWhitelistIncludesToCoverage.php | 54 - ...ResourceUsageDuringSmallTestsAttribute.php | 33 - ...StrictAboutTodoAnnotatedTestsAttribute.php | 33 - .../RemoveCacheResultFileAttribute.php | 33 - .../Migrations/RemoveCacheTokensAttribute.php | 33 - ...RemoveConversionToExceptionsAttributes.php | 45 - ...CoverageElementCacheDirectoryAttribute.php | 34 - ...eElementProcessUncoveredFilesAttribute.php | 34 - .../Migrations/RemoveEmptyFilter.php | 56 - .../Migration/Migrations/RemoveListeners.php | 32 - .../Migration/Migrations/RemoveLogTypes.php | 41 - .../Migrations/RemoveLoggingElements.php | 50 - .../RemoveNoInteractionAttribute.php | 33 - .../Migrations/RemovePrinterAttributes.php | 37 - .../Migrations/RemoveTestDoxGroupsElement.php | 32 - .../RemoveTestSuiteLoaderAttributes.php | 37 - .../Migrations/RemoveVerboseAttribute.php | 33 - .../RenameBackupStaticAttributesAttribute.php | 40 - ...BeStrictAboutCoversAnnotationAttribute.php | 40 - .../RenameForceCoversAnnotationAttribute.php | 40 - .../Migrations/UpdateSchemaLocation.php | 36 - .../Configuration/Xml/Migration/Migrator.php | 51 - .../Xml/Migration/SnapshotNodeList.php | 53 - .../src/TextUI/Configuration/Xml/PHPUnit.php | 515 - .../FailedSchemaDetectionResult.php | 21 - .../SchemaDetector/SchemaDetectionResult.php | 38 - .../Xml/SchemaDetector/SchemaDetector.php | 41 - .../SuccessfulSchemaDetectionResult.php | 49 - .../TextUI/Configuration/Xml/SchemaFinder.php | 82 - .../Configuration/Xml/TestSuiteMapper.php | 117 - .../Xml/Validator/ValidationResult.php | 73 - .../Configuration/Xml/Validator/Validator.php | 37 - .../Exception/CannotOpenSocketException.php | 32 - .../src/TextUI/Exception/Exception.php | 21 - .../Exception/InvalidSocketException.php | 31 - .../src/TextUI/Exception/RuntimeException.php | 19 - .../TestDirectoryNotFoundException.php | 31 - .../Exception/TestFileNotFoundException.php | 31 - vendor/phpunit/phpunit/src/TextUI/Help.php | 318 - .../ProgressPrinter/ProgressPrinter.php | 402 - ...BeforeTestClassMethodErroredSubscriber.php | 26 - .../ProgressPrinter/Subscriber/Subscriber.php | 30 - .../TestConsideredRiskySubscriber.php | 26 - .../Subscriber/TestErroredSubscriber.php | 26 - .../Subscriber/TestFailedSubscriber.php | 26 - .../Subscriber/TestFinishedSubscriber.php | 26 - .../TestMarkedIncompleteSubscriber.php | 26 - .../Subscriber/TestPreparedSubscriber.php | 26 - .../TestRunnerExecutionStartedSubscriber.php | 26 - .../Subscriber/TestSkippedSubscriber.php | 26 - .../TestTriggeredDeprecationSubscriber.php | 26 - .../TestTriggeredErrorSubscriber.php | 26 - .../TestTriggeredNoticeSubscriber.php | 26 - .../TestTriggeredPhpDeprecationSubscriber.php | 26 - .../TestTriggeredPhpNoticeSubscriber.php | 26 - .../TestTriggeredPhpWarningSubscriber.php | 26 - ...tTriggeredPhpunitDeprecationSubscriber.php | 26 - .../TestTriggeredPhpunitWarningSubscriber.php | 26 - .../TestTriggeredWarningSubscriber.php | 26 - .../TextUI/Output/Default/ResultPrinter.php | 634 - .../Default/UnexpectedOutputPrinter.php | 38 - .../phpunit/src/TextUI/Output/Facade.php | 281 - .../TextUI/Output/Printer/DefaultPrinter.php | 122 - .../src/TextUI/Output/Printer/NullPrinter.php | 26 - .../src/TextUI/Output/Printer/Printer.php | 22 - .../src/TextUI/Output/SummaryPrinter.php | 160 - .../TextUI/Output/TestDox/ResultPrinter.php | 366 - .../src/TextUI/ShellExitCodeCalculator.php | 170 - .../phpunit/phpunit/src/TextUI/TestRunner.php | 76 - .../src/TextUI/TestSuiteFilterProcessor.php | 84 - vendor/phpunit/phpunit/src/Util/Cloner.php | 36 - vendor/phpunit/phpunit/src/Util/Color.php | 181 - .../phpunit/src/Util/Exception/Exception.php | 21 - .../Exception/InvalidDirectoryException.php | 31 - .../Util/Exception/InvalidJsonException.php | 21 - .../InvalidVersionOperatorException.php | 31 - .../Util/Exception/PhpProcessException.php | 22 - .../src/Util/Exception/XmlException.php | 22 - .../phpunit/phpunit/src/Util/ExcludeList.php | 231 - vendor/phpunit/phpunit/src/Util/Exporter.php | 63 - .../phpunit/phpunit/src/Util/Filesystem.php | 51 - vendor/phpunit/phpunit/src/Util/Filter.php | 117 - .../phpunit/phpunit/src/Util/GlobalState.php | 325 - .../phpunit/src/Util/Http/Downloader.php | 23 - .../phpunit/src/Util/Http/PhpDownloader.php | 30 - vendor/phpunit/phpunit/src/Util/Json.php | 102 - .../src/Util/PHP/AbstractPhpProcess.php | 314 - .../src/Util/PHP/DefaultPhpProcess.php | 148 - .../src/Util/PHP/Template/PhptTestCase.tpl | 56 - .../src/Util/PHP/Template/TestCaseClass.tpl | 116 - .../src/Util/PHP/Template/TestCaseMethod.tpl | 116 - .../phpunit/phpunit/src/Util/Reflection.php | 107 - vendor/phpunit/phpunit/src/Util/Test.php | 40 - .../src/Util/ThrowableToStringMapper.php | 52 - .../src/Util/VersionComparisonOperator.php | 57 - .../phpunit/phpunit/src/Util/Xml/Loader.php | 127 - vendor/phpunit/phpunit/src/Util/Xml/Xml.php | 81 - vendor/psr/event-dispatcher/.editorconfig | 15 - vendor/psr/event-dispatcher/.gitignore | 2 - vendor/psr/event-dispatcher/README.md | 6 - vendor/psr/event-dispatcher/composer.json | 26 - vendor/sebastian/cli-parser/ChangeLog.md | 30 - vendor/sebastian/cli-parser/LICENSE | 29 - vendor/sebastian/cli-parser/README.md | 22 - vendor/sebastian/cli-parser/SECURITY.md | 30 - vendor/sebastian/cli-parser/composer.json | 42 - vendor/sebastian/cli-parser/src/Parser.php | 206 - .../exceptions/AmbiguousOptionException.php | 26 - .../cli-parser/src/exceptions/Exception.php | 16 - .../OptionDoesNotAllowArgumentException.php | 26 - ...RequiredOptionArgumentMissingException.php | 26 - .../src/exceptions/UnknownOptionException.php | 26 - .../.psalm/baseline.xml | 9 - .../.psalm/config.xml | 15 - .../code-unit-reverse-lookup/ChangeLog.md | 45 - .../code-unit-reverse-lookup/LICENSE | 29 - .../code-unit-reverse-lookup/README.md | 22 - .../code-unit-reverse-lookup/SECURITY.md | 9 - .../code-unit-reverse-lookup/composer.json | 36 - .../code-unit-reverse-lookup/src/Wizard.php | 114 - vendor/sebastian/code-unit/ChangeLog.md | 78 - vendor/sebastian/code-unit/LICENSE | 29 - vendor/sebastian/code-unit/README.md | 22 - vendor/sebastian/code-unit/SECURITY.md | 9 - vendor/sebastian/code-unit/composer.json | 50 - .../code-unit/src/ClassMethodUnit.php | 24 - vendor/sebastian/code-unit/src/ClassUnit.php | 24 - vendor/sebastian/code-unit/src/CodeUnit.php | 478 - .../code-unit/src/CodeUnitCollection.php | 74 - .../src/CodeUnitCollectionIterator.php | 54 - vendor/sebastian/code-unit/src/FileUnit.php | 24 - .../sebastian/code-unit/src/FunctionUnit.php | 24 - .../code-unit/src/InterfaceMethodUnit.php | 24 - .../sebastian/code-unit/src/InterfaceUnit.php | 24 - vendor/sebastian/code-unit/src/Mapper.php | 259 - .../code-unit/src/TraitMethodUnit.php | 24 - vendor/sebastian/code-unit/src/TraitUnit.php | 24 - .../code-unit/src/exceptions/Exception.php | 16 - .../exceptions/InvalidCodeUnitException.php | 16 - .../src/exceptions/NoTraitException.php | 16 - .../src/exceptions/ReflectionException.php | 16 - vendor/sebastian/comparator/ChangeLog.md | 199 - vendor/sebastian/comparator/LICENSE | 29 - vendor/sebastian/comparator/README.md | 43 - vendor/sebastian/comparator/SECURITY.md | 30 - vendor/sebastian/comparator/composer.json | 63 - .../comparator/src/ArrayComparator.php | 127 - .../sebastian/comparator/src/Comparator.php | 32 - .../comparator/src/ComparisonFailure.php | 68 - .../comparator/src/DOMNodeComparator.php | 80 - .../comparator/src/DateTimeComparator.php | 73 - .../comparator/src/ExceptionComparator.php | 41 - vendor/sebastian/comparator/src/Factory.php | 114 - .../comparator/src/MockObjectComparator.php | 43 - .../comparator/src/NumericComparator.php | 67 - .../comparator/src/ObjectComparator.php | 88 - .../comparator/src/ResourceComparator.php | 42 - .../comparator/src/ScalarComparator.php | 81 - .../src/SplObjectStorageComparator.php | 57 - .../comparator/src/TypeComparator.php | 43 - .../comparator/src/exceptions/Exception.php | 16 - .../src/exceptions/RuntimeException.php | 14 - vendor/sebastian/complexity/ChangeLog.md | 68 - vendor/sebastian/complexity/LICENSE | 29 - vendor/sebastian/complexity/README.md | 22 - vendor/sebastian/complexity/SECURITY.md | 30 - vendor/sebastian/complexity/composer.json | 43 - .../sebastian/complexity/src/Calculator.php | 83 - .../complexity/src/Complexity/Complexity.php | 64 - .../src/Complexity/ComplexityCollection.php | 132 - .../ComplexityCollectionIterator.php | 51 - .../complexity/src/Exception/Exception.php | 16 - .../src/Exception/RuntimeException.php | 14 - .../Visitor/ComplexityCalculatingVisitor.php | 132 - ...CyclomaticComplexityCalculatingVisitor.php | 60 - vendor/sebastian/diff/ChangeLog.md | 148 - vendor/sebastian/diff/LICENSE | 29 - vendor/sebastian/diff/README.md | 206 - vendor/sebastian/diff/SECURITY.md | 30 - vendor/sebastian/diff/composer.json | 51 - vendor/sebastian/diff/src/Chunk.php | 124 - vendor/sebastian/diff/src/Diff.php | 114 - vendor/sebastian/diff/src/Differ.php | 239 - .../src/Exception/ConfigurationException.php | 37 - .../diff/src/Exception/Exception.php | 16 - .../Exception/InvalidArgumentException.php | 14 - vendor/sebastian/diff/src/Line.php | 66 - .../LongestCommonSubsequenceCalculator.php | 18 - ...ientLongestCommonSubsequenceCalculator.php | 97 - .../src/Output/AbstractChunkOutputBuilder.php | 52 - .../diff/src/Output/DiffOnlyOutputBuilder.php | 70 - .../src/Output/DiffOutputBuilderInterface.php | 19 - .../Output/StrictUnifiedDiffOutputBuilder.php | 326 - .../src/Output/UnifiedDiffOutputBuilder.php | 257 - vendor/sebastian/diff/src/Parser.php | 112 - ...ientLongestCommonSubsequenceCalculator.php | 82 - vendor/sebastian/environment/ChangeLog.md | 207 - vendor/sebastian/environment/LICENSE | 29 - vendor/sebastian/environment/README.md | 22 - vendor/sebastian/environment/SECURITY.md | 30 - vendor/sebastian/environment/composer.json | 44 - vendor/sebastian/environment/src/Console.php | 187 - vendor/sebastian/environment/src/Runtime.php | 294 - vendor/sebastian/exporter/ChangeLog.md | 39 - vendor/sebastian/exporter/LICENSE | 29 - vendor/sebastian/exporter/README.md | 176 - vendor/sebastian/exporter/SECURITY.md | 30 - vendor/sebastian/exporter/composer.json | 65 - vendor/sebastian/exporter/src/Exporter.php | 334 - vendor/sebastian/global-state/ChangeLog.md | 108 - vendor/sebastian/global-state/LICENSE | 29 - vendor/sebastian/global-state/README.md | 22 - vendor/sebastian/global-state/SECURITY.md | 30 - vendor/sebastian/global-state/composer.json | 52 - .../global-state/src/CodeExporter.php | 106 - .../global-state/src/ExcludeList.php | 95 - .../sebastian/global-state/src/Restorer.php | 106 - .../sebastian/global-state/src/Snapshot.php | 371 - .../global-state/src/exceptions/Exception.php | 16 - .../src/exceptions/RuntimeException.php | 14 - vendor/sebastian/lines-of-code/ChangeLog.md | 55 - vendor/sebastian/lines-of-code/LICENSE | 29 - vendor/sebastian/lines-of-code/README.md | 22 - vendor/sebastian/lines-of-code/SECURITY.md | 30 - vendor/sebastian/lines-of-code/composer.json | 43 - .../sebastian/lines-of-code/src/Counter.php | 90 - .../lines-of-code/src/Exception/Exception.php | 16 - .../Exception/IllogicalValuesException.php | 16 - .../src/Exception/NegativeValueException.php | 16 - .../src/Exception/RuntimeException.php | 14 - .../lines-of-code/src/LineCountingVisitor.php | 93 - .../lines-of-code/src/LinesOfCode.php | 119 - .../sebastian/object-enumerator/ChangeLog.md | 95 - vendor/sebastian/object-enumerator/LICENSE | 29 - vendor/sebastian/object-enumerator/README.md | 22 - .../sebastian/object-enumerator/SECURITY.md | 9 - .../sebastian/object-enumerator/composer.json | 43 - .../sebastian/object-enumerator/phpunit.xml | 24 - .../object-enumerator/src/Enumerator.php | 68 - .../sebastian/object-reflector/ChangeLog.md | 66 - vendor/sebastian/object-reflector/LICENSE | 29 - vendor/sebastian/object-reflector/README.md | 22 - vendor/sebastian/object-reflector/SECURITY.md | 9 - .../sebastian/object-reflector/composer.json | 41 - .../object-reflector/src/ObjectReflector.php | 41 - .../sebastian/recursion-context/ChangeLog.md | 54 - vendor/sebastian/recursion-context/LICENSE | 29 - vendor/sebastian/recursion-context/README.md | 20 - .../sebastian/recursion-context/SECURITY.md | 30 - .../sebastian/recursion-context/composer.json | 48 - .../recursion-context/src/Context.php | 141 - vendor/sebastian/type/ChangeLog.md | 176 - vendor/sebastian/type/LICENSE | 29 - vendor/sebastian/type/README.md | 22 - vendor/sebastian/type/SECURITY.md | 9 - vendor/sebastian/type/composer.json | 50 - vendor/sebastian/type/infection.json | 12 - vendor/sebastian/type/src/Parameter.php | 38 - .../sebastian/type/src/ReflectionMapper.php | 176 - vendor/sebastian/type/src/TypeName.php | 76 - .../type/src/exception/Exception.php | 16 - .../type/src/exception/RuntimeException.php | 14 - .../sebastian/type/src/type/CallableType.php | 182 - vendor/sebastian/type/src/type/FalseType.php | 42 - .../type/src/type/GenericObjectType.php | 51 - .../type/src/type/IntersectionType.php | 126 - .../sebastian/type/src/type/IterableType.php | 71 - vendor/sebastian/type/src/type/MixedType.php | 41 - vendor/sebastian/type/src/type/NeverType.php | 36 - vendor/sebastian/type/src/type/NullType.php | 41 - vendor/sebastian/type/src/type/ObjectType.php | 67 - vendor/sebastian/type/src/type/SimpleType.php | 83 - vendor/sebastian/type/src/type/StaticType.php | 64 - vendor/sebastian/type/src/type/TrueType.php | 42 - vendor/sebastian/type/src/type/Type.php | 192 - vendor/sebastian/type/src/type/UnionType.php | 138 - .../sebastian/type/src/type/UnknownType.php | 41 - vendor/sebastian/type/src/type/VoidType.php | 36 - vendor/sebastian/version/ChangeLog.md | 43 - vendor/sebastian/version/LICENSE | 29 - vendor/sebastian/version/README.md | 50 - vendor/sebastian/version/SECURITY.md | 9 - vendor/sebastian/version/composer.json | 37 - vendor/sebastian/version/src/Version.php | 93 - vendor/squizlabs/php_codesniffer/CHANGELOG.md | 8138 --- .../php_codesniffer/CodeSniffer.conf | 6 - .../php_codesniffer/CodeSniffer.conf.dist | 9 - vendor/squizlabs/php_codesniffer/README.md | 153 - vendor/squizlabs/php_codesniffer/autoload.php | 346 - vendor/squizlabs/php_codesniffer/bin/phpcbf | 15 - .../squizlabs/php_codesniffer/bin/phpcbf.bat | 10 - vendor/squizlabs/php_codesniffer/bin/phpcs | 15 - .../squizlabs/php_codesniffer/bin/phpcs.bat | 10 - .../squizlabs/php_codesniffer/composer.json | 85 - vendor/squizlabs/php_codesniffer/licence.txt | 25 - vendor/squizlabs/php_codesniffer/phpcs.xsd | 136 - .../squizlabs/php_codesniffer/src/Config.php | 1760 - .../src/Exceptions/DeepExitException.php | 20 - .../src/Exceptions/RuntimeException.php | 17 - .../src/Exceptions/TokenizerException.php | 17 - .../php_codesniffer/src/Files/DummyFile.php | 82 - .../php_codesniffer/src/Files/File.php | 2996 -- .../php_codesniffer/src/Files/FileList.php | 266 - .../php_codesniffer/src/Files/LocalFile.php | 219 - .../src/Filters/ExactMatch.php | 156 - .../php_codesniffer/src/Filters/Filter.php | 281 - .../src/Filters/GitModified.php | 124 - .../php_codesniffer/src/Filters/GitStaged.php | 126 - .../squizlabs/php_codesniffer/src/Fixer.php | 867 - .../src/Generators/Generator.php | 143 - .../php_codesniffer/src/Generators/HTML.php | 564 - .../src/Generators/Markdown.php | 350 - .../php_codesniffer/src/Generators/Text.php | 313 - .../php_codesniffer/src/Reporter.php | 445 - .../php_codesniffer/src/Reports/Cbf.php | 259 - .../src/Reports/Checkstyle.php | 111 - .../php_codesniffer/src/Reports/Code.php | 369 - .../php_codesniffer/src/Reports/Csv.php | 92 - .../php_codesniffer/src/Reports/Diff.php | 131 - .../php_codesniffer/src/Reports/Emacs.php | 91 - .../php_codesniffer/src/Reports/Full.php | 260 - .../php_codesniffer/src/Reports/Gitblame.php | 91 - .../php_codesniffer/src/Reports/Hgblame.php | 110 - .../php_codesniffer/src/Reports/Info.php | 173 - .../php_codesniffer/src/Reports/Json.php | 107 - .../php_codesniffer/src/Reports/Junit.php | 133 - .../src/Reports/Notifysend.php | 243 - .../src/Reports/Performance.php | 161 - .../php_codesniffer/src/Reports/Report.php | 87 - .../php_codesniffer/src/Reports/Source.php | 337 - .../php_codesniffer/src/Reports/Summary.php | 184 - .../php_codesniffer/src/Reports/Svnblame.php | 73 - .../src/Reports/VersionControl.php | 377 - .../php_codesniffer/src/Reports/Xml.php | 128 - .../squizlabs/php_codesniffer/src/Ruleset.php | 1747 - .../squizlabs/php_codesniffer/src/Runner.php | 986 - .../src/Sniffs/AbstractArraySniff.php | 172 - .../src/Sniffs/AbstractPatternSniff.php | 941 - .../src/Sniffs/AbstractScopeSniff.php | 189 - .../src/Sniffs/AbstractVariableSniff.php | 230 - .../src/Sniffs/DeprecatedSniff.php | 63 - .../php_codesniffer/src/Sniffs/Sniff.php | 80 - .../Docs/Arrays/ArrayIndentStandard.xml | 107 - .../DisallowLongArraySyntaxStandard.xml | 23 - .../DisallowShortArraySyntaxStandard.xml | 23 - .../Classes/DuplicateClassNameStandard.xml | 27 - .../Classes/OpeningBraceSameLineStandard.xml | 36 - .../AssignmentInConditionStandard.xml | 23 - .../EmptyPHPStatementStandard.xml | 44 - .../CodeAnalysis/EmptyStatementStandard.xml | 23 - .../ForLoopShouldBeWhileLoopStandard.xml | 23 - .../ForLoopWithTestFunctionCallStandard.xml | 24 - .../JumbledIncrementerStandard.xml | 25 - ...licitBooleanOperatorPrecedenceStandard.xml | 44 - .../UnconditionalIfStatementStandard.xml | 39 - .../UnnecessaryFinalModifierStandard.xml | 29 - .../UnusedFunctionParameterStandard.xml | 25 - .../UselessOverridingMethodStandard.xml | 32 - .../Docs/Commenting/DocCommentStandard.xml | 269 - .../Generic/Docs/Commenting/FixmeStandard.xml | 25 - .../Generic/Docs/Commenting/TodoStandard.xml | 25 - .../DisallowYodaConditionsStandard.xml | 23 - .../InlineControlStructureStandard.xml | 22 - .../Generic/Docs/Debug/CSSLintStandard.xml | 19 - .../Docs/Debug/ClosureLinterStandard.xml | 19 - .../Generic/Docs/Debug/JSHintStandard.xml | 19 - .../Docs/Files/ByteOrderMarkStandard.xml | 7 - .../Docs/Files/EndFileNewlineStandard.xml | 7 - .../Docs/Files/EndFileNoNewlineStandard.xml | 7 - .../Docs/Files/ExecutableFileStandard.xml | 7 - .../Generic/Docs/Files/InlineHTMLStandard.xml | 24 - .../Docs/Files/LineEndingsStandard.xml | 7 - .../Generic/Docs/Files/LineLengthStandard.xml | 7 - .../Docs/Files/LowercasedFilenameStandard.xml | 7 - .../Docs/Files/OneClassPerFileStandard.xml | 29 - .../Files/OneInterfacePerFileStandard.xml | 29 - .../OneObjectStructurePerFileStandard.xml | 29 - .../Docs/Files/OneTraitPerFileStandard.xml | 29 - .../DisallowMultipleStatementsStandard.xml | 20 - .../MultipleStatementAlignmentStandard.xml | 56 - .../Formatting/NoSpaceAfterCastStandard.xml | 19 - .../Formatting/SpaceAfterCastStandard.xml | 19 - .../Docs/Formatting/SpaceAfterNotStandard.xml | 22 - .../Formatting/SpaceBeforeCastStandard.xml | 21 - .../CallTimePassByReferenceStandard.xml | 31 - .../FunctionCallArgumentSpacingStandard.xml | 19 - .../OpeningFunctionBraceBsdAllmanStandard.xml | 26 - ...gFunctionBraceKernighanRitchieStandard.xml | 26 - .../Metrics/CyclomaticComplexityStandard.xml | 7 - .../Docs/Metrics/NestingLevelStandard.xml | 7 - .../AbstractClassNamePrefixStandard.xml | 23 - .../CamelCapsFunctionNameStandard.xml | 23 - .../ConstructorNameStandard.xml | 29 - .../InterfaceNameSuffixStandard.xml | 23 - .../TraitNameSuffixStandard.xml | 23 - .../UpperCaseConstantNameStandard.xml | 29 - .../Docs/PHP/BacktickOperatorStandard.xml | 7 - .../CharacterBeforePHPOpeningTagStandard.xml | 22 - .../Docs/PHP/ClosingPHPTagStandard.xml | 22 - .../Docs/PHP/DeprecatedFunctionsStandard.xml | 19 - .../DisallowAlternativePHPTagsStandard.xml | 7 - .../DisallowRequestSuperglobalStandard.xml | 7 - .../Docs/PHP/DisallowShortOpenTagStandard.xml | 7 - .../Docs/PHP/DiscourageGotoStandard.xml | 7 - .../Docs/PHP/ForbiddenFunctionsStandard.xml | 19 - .../Docs/PHP/LowerCaseConstantStandard.xml | 23 - .../Docs/PHP/LowerCaseKeywordStandard.xml | 19 - .../Docs/PHP/LowerCaseTypeStandard.xml | 38 - .../Docs/PHP/NoSilencedErrorsStandard.xml | 23 - .../Docs/PHP/RequireStrictTypesStandard.xml | 38 - .../Generic/Docs/PHP/SAPIUsageStandard.xml | 23 - .../Generic/Docs/PHP/SyntaxStandard.xml | 21 - .../Docs/PHP/UpperCaseConstantStandard.xml | 23 - .../Strings/UnnecessaryHeredocStandard.xml | 39 - .../UnnecessaryStringConcatStandard.xml | 19 - .../SubversionPropertiesStandard.xml | 7 - .../ArbitraryParenthesesSpacingStandard.xml | 23 - .../DisallowSpaceIndentStandard.xml | 7 - .../WhiteSpace/DisallowTabIndentStandard.xml | 7 - .../HereNowdocIdentifierSpacingStandard.xml | 23 - .../IncrementDecrementSpacingStandard.xml | 26 - .../LanguageConstructSpacingStandard.xml | 47 - .../Docs/WhiteSpace/ScopeIndentStandard.xml | 23 - .../SpreadOperatorSpacingAfterStandard.xml | 34 - .../Sniffs/Arrays/ArrayIndentSniff.php | 193 - .../Arrays/DisallowLongArraySyntaxSniff.php | 72 - .../Arrays/DisallowShortArraySyntaxSniff.php | 61 - .../Classes/DuplicateClassNameSniff.php | 126 - .../Classes/OpeningBraceSameLineSniff.php | 124 - .../AssignmentInConditionSniff.php | 171 - .../CodeAnalysis/EmptyPHPStatementSniff.php | 183 - .../CodeAnalysis/EmptyStatementSniff.php | 97 - .../ForLoopShouldBeWhileLoopSniff.php | 91 - .../ForLoopWithTestFunctionCallSniff.php | 101 - .../CodeAnalysis/JumbledIncrementerSniff.php | 134 - ...ExplicitBooleanOperatorPrecedenceSniff.php | 112 - .../UnconditionalIfStatementSniff.php | 93 - .../UnnecessaryFinalModifierSniff.php | 88 - .../UnusedFunctionParameterSniff.php | 307 - .../UselessOverridingMethodSniff.php | 184 - .../Sniffs/Commenting/DocCommentSniff.php | 357 - .../Generic/Sniffs/Commenting/FixmeSniff.php | 78 - .../Generic/Sniffs/Commenting/TodoSniff.php | 77 - .../DisallowYodaConditionsSniff.php | 185 - .../InlineControlStructureSniff.php | 365 - .../Generic/Sniffs/Debug/CSSLintSniff.php | 135 - .../Sniffs/Debug/ClosureLinterSniff.php | 156 - .../Generic/Sniffs/Debug/ESLintSniff.php | 152 - .../Generic/Sniffs/Debug/JSHintSniff.php | 134 - .../Sniffs/Files/ByteOrderMarkSniff.php | 82 - .../Sniffs/Files/EndFileNewlineSniff.php | 84 - .../Sniffs/Files/EndFileNoNewlineSniff.php | 91 - .../Sniffs/Files/ExecutableFileSniff.php | 62 - .../Generic/Sniffs/Files/InlineHTMLSniff.php | 79 - .../Generic/Sniffs/Files/LineEndingsSniff.php | 148 - .../Generic/Sniffs/Files/LineLengthSniff.php | 201 - .../Sniffs/Files/LowercasedFilenameSniff.php | 70 - .../Sniffs/Files/OneClassPerFileSniff.php | 57 - .../Sniffs/Files/OneInterfacePerFileSniff.php | 57 - .../Files/OneObjectStructurePerFileSniff.php | 62 - .../Sniffs/Files/OneTraitPerFileSniff.php | 57 - .../DisallowMultipleStatementsSniff.php | 105 - .../MultipleStatementAlignmentSniff.php | 426 - .../Formatting/NoSpaceAfterCastSniff.php | 98 - .../Sniffs/Formatting/SpaceAfterCastSniff.php | 161 - .../Sniffs/Formatting/SpaceAfterNotSniff.php | 143 - .../Formatting/SpaceBeforeCastSniff.php | 73 - .../CallTimePassByReferenceSniff.php | 180 - .../FunctionCallArgumentSpacingSniff.php | 197 - .../OpeningFunctionBraceBsdAllmanSniff.php | 225 - ...ningFunctionBraceKernighanRitchieSniff.php | 177 - .../Metrics/CyclomaticComplexitySniff.php | 117 - .../Sniffs/Metrics/NestingLevelSniff.php | 100 - .../AbstractClassNamePrefixSniff.php | 60 - .../CamelCapsFunctionNameSniff.php | 222 - .../ConstructorNameSniff.php | 189 - .../InterfaceNameSuffixSniff.php | 55 - .../TraitNameSuffixSniff.php | 55 - .../UpperCaseConstantNameSniff.php | 151 - .../Sniffs/PHP/BacktickOperatorSniff.php | 48 - .../PHP/CharacterBeforePHPOpeningTagSniff.php | 86 - .../Generic/Sniffs/PHP/ClosingPHPTagSniff.php | 54 - .../Sniffs/PHP/DeprecatedFunctionsSniff.php | 75 - .../PHP/DisallowAlternativePHPTagsSniff.php | 253 - .../PHP/DisallowRequestSuperglobalSniff.php | 55 - .../Sniffs/PHP/DisallowShortOpenTagSniff.php | 170 - .../Sniffs/PHP/DiscourageGotoSniff.php | 50 - .../Sniffs/PHP/ForbiddenFunctionsSniff.php | 246 - .../Sniffs/PHP/LowerCaseConstantSniff.php | 250 - .../Sniffs/PHP/LowerCaseKeywordSniff.php | 85 - .../Generic/Sniffs/PHP/LowerCaseTypeSniff.php | 364 - .../Sniffs/PHP/NoSilencedErrorsSniff.php | 77 - .../Sniffs/PHP/RequireStrictTypesSniff.php | 108 - .../Generic/Sniffs/PHP/SAPIUsageSniff.php | 67 - .../Generic/Sniffs/PHP/SyntaxSniff.php | 104 - .../Sniffs/PHP/UpperCaseConstantSniff.php | 57 - .../Strings/UnnecessaryHeredocSniff.php | 145 - .../Strings/UnnecessaryStringConcatSniff.php | 129 - .../VersionControl/GitMergeConflictSniff.php | 228 - .../SubversionPropertiesSniff.php | 186 - .../ArbitraryParenthesesSpacingSniff.php | 239 - .../WhiteSpace/DisallowSpaceIndentSniff.php | 232 - .../WhiteSpace/DisallowTabIndentSniff.php | 201 - .../HereNowdocIdentifierSpacingSniff.php | 69 - .../IncrementDecrementSpacingSniff.php | 174 - .../LanguageConstructSpacingSniff.php | 163 - .../Sniffs/WhiteSpace/ScopeIndentSniff.php | 1587 - .../SpreadOperatorSpacingAfterSniff.php | 159 - .../Tests/Arrays/ArrayIndentUnitTest.inc | 154 - .../Arrays/ArrayIndentUnitTest.inc.fixed | 155 - .../Tests/Arrays/ArrayIndentUnitTest.php | 81 - .../DisallowLongArraySyntaxUnitTest.1.inc | 33 - ...isallowLongArraySyntaxUnitTest.1.inc.fixed | 33 - .../DisallowLongArraySyntaxUnitTest.2.inc | 17 - ...isallowLongArraySyntaxUnitTest.2.inc.fixed | 17 - .../DisallowLongArraySyntaxUnitTest.3.inc | 7 - .../DisallowLongArraySyntaxUnitTest.php | 75 - .../DisallowShortArraySyntaxUnitTest.inc | 12 - ...DisallowShortArraySyntaxUnitTest.inc.fixed | 12 - .../DisallowShortArraySyntaxUnitTest.php | 58 - .../Classes/DuplicateClassNameUnitTest.1.inc | 14 - .../Classes/DuplicateClassNameUnitTest.10.inc | 6 - .../Classes/DuplicateClassNameUnitTest.11.inc | 13 - .../Classes/DuplicateClassNameUnitTest.2.inc | 6 - .../Classes/DuplicateClassNameUnitTest.3.inc | 10 - .../Classes/DuplicateClassNameUnitTest.4.inc | 5 - .../Classes/DuplicateClassNameUnitTest.5.inc | 8 - .../Classes/DuplicateClassNameUnitTest.6.inc | 12 - .../Classes/DuplicateClassNameUnitTest.7.inc | 13 - .../Classes/DuplicateClassNameUnitTest.8.inc | 8 - .../Classes/DuplicateClassNameUnitTest.9.inc | 5 - .../Classes/DuplicateClassNameUnitTest.97.inc | 8 - .../Classes/DuplicateClassNameUnitTest.98.inc | 8 - .../Classes/DuplicateClassNameUnitTest.99.inc | 7 - .../Classes/DuplicateClassNameUnitTest.php | 98 - .../Classes/OpeningBraceSameLineUnitTest.inc | 100 - .../OpeningBraceSameLineUnitTest.inc.fixed | 100 - .../Classes/OpeningBraceSameLineUnitTest.php | 68 - .../AssignmentInConditionUnitTest.1.inc | 95 - .../AssignmentInConditionUnitTest.2.inc | 4 - .../AssignmentInConditionUnitTest.3.inc | 4 - .../AssignmentInConditionUnitTest.4.inc | 6 - .../AssignmentInConditionUnitTest.5.inc | 6 - .../AssignmentInConditionUnitTest.6.inc | 5 - .../AssignmentInConditionUnitTest.php | 96 - .../EmptyPHPStatementUnitTest.1.inc | 86 - .../EmptyPHPStatementUnitTest.1.inc.fixed | 80 - .../EmptyPHPStatementUnitTest.2.inc | 27 - .../EmptyPHPStatementUnitTest.2.inc.fixed | 23 - .../EmptyPHPStatementUnitTest.php | 110 - .../CodeAnalysis/EmptyStatementUnitTest.inc | 74 - .../CodeAnalysis/EmptyStatementUnitTest.php | 68 - .../ForLoopShouldBeWhileLoopUnitTest.1.inc | 37 - .../ForLoopShouldBeWhileLoopUnitTest.2.inc | 4 - .../ForLoopShouldBeWhileLoopUnitTest.3.inc | 6 - .../ForLoopShouldBeWhileLoopUnitTest.php | 64 - .../ForLoopWithTestFunctionCallUnitTest.1.inc | 95 - .../ForLoopWithTestFunctionCallUnitTest.2.inc | 5 - .../ForLoopWithTestFunctionCallUnitTest.3.inc | 6 - .../ForLoopWithTestFunctionCallUnitTest.php | 75 - .../JumbledIncrementerUnitTest.1.inc | 89 - .../JumbledIncrementerUnitTest.2.inc | 8 - .../JumbledIncrementerUnitTest.3.inc | 6 - .../JumbledIncrementerUnitTest.4.inc | 8 - .../JumbledIncrementerUnitTest.php | 72 - ...licitBooleanOperatorPrecedenceUnitTest.inc | 131 - ...licitBooleanOperatorPrecedenceUnitTest.php | 91 - .../UnconditionalIfStatementUnitTest.1.inc | 18 - .../UnconditionalIfStatementUnitTest.2.inc | 4 - .../UnconditionalIfStatementUnitTest.php | 67 - .../UnnecessaryFinalModifierUnitTest.1.inc | 78 - .../UnnecessaryFinalModifierUnitTest.2.inc | 5 - .../UnnecessaryFinalModifierUnitTest.php | 71 - .../UnusedFunctionParameterUnitTest.1.inc | 274 - .../UnusedFunctionParameterUnitTest.2.inc | 5 - .../UnusedFunctionParameterUnitTest.3.inc | 5 - .../UnusedFunctionParameterUnitTest.php | 78 - .../UselessOverridingMethodUnitTest.1.inc | 173 - .../UselessOverridingMethodUnitTest.2.inc | 7 - .../UselessOverridingMethodUnitTest.3.inc | 10 - .../UselessOverridingMethodUnitTest.4.inc | 10 - .../UselessOverridingMethodUnitTest.5.inc | 10 - .../UselessOverridingMethodUnitTest.6.inc | 10 - .../UselessOverridingMethodUnitTest.php | 72 - .../Tests/Commenting/DocCommentUnitTest.1.inc | 270 - .../Commenting/DocCommentUnitTest.1.inc.fixed | 275 - .../Tests/Commenting/DocCommentUnitTest.1.js | 270 - .../Commenting/DocCommentUnitTest.1.js.fixed | 275 - .../Tests/Commenting/DocCommentUnitTest.2.inc | 6 - .../Tests/Commenting/DocCommentUnitTest.2.js | 4 - .../Tests/Commenting/DocCommentUnitTest.php | 127 - .../Tests/Commenting/FixmeUnitTest.inc | 23 - .../Generic/Tests/Commenting/FixmeUnitTest.js | 23 - .../Tests/Commenting/FixmeUnitTest.php | 63 - .../Generic/Tests/Commenting/TodoUnitTest.inc | 23 - .../Generic/Tests/Commenting/TodoUnitTest.js | 23 - .../Generic/Tests/Commenting/TodoUnitTest.php | 62 - .../DisallowYodaConditionsUnitTest.inc | 198 - .../DisallowYodaConditionsUnitTest.php | 99 - .../InlineControlStructureUnitTest.1.inc | 278 - ...InlineControlStructureUnitTest.1.inc.fixed | 316 - .../InlineControlStructureUnitTest.1.js | 35 - .../InlineControlStructureUnitTest.1.js.fixed | 44 - .../InlineControlStructureUnitTest.2.inc | 8 - .../InlineControlStructureUnitTest.2.js | 5 - .../InlineControlStructureUnitTest.3.inc | 4 - .../InlineControlStructureUnitTest.3.js | 5 - .../InlineControlStructureUnitTest.4.inc | 5 - .../InlineControlStructureUnitTest.5.inc | 4 - .../InlineControlStructureUnitTest.6.inc | 6 - .../InlineControlStructureUnitTest.7.inc | 16 - .../InlineControlStructureUnitTest.php | 121 - .../Generic/Tests/Debug/CSSLintUnitTest.css | 6 - .../Generic/Tests/Debug/CSSLintUnitTest.php | 77 - .../Tests/Debug/ClosureLinterUnitTest.js | 6 - .../Tests/Debug/ClosureLinterUnitTest.php | 74 - .../Generic/Tests/Debug/ESLintUnitTest.js | 1 - .../Generic/Tests/Debug/ESLintUnitTest.php | 122 - .../Generic/Tests/Debug/JSHintUnitTest.js | 3 - .../Generic/Tests/Debug/JSHintUnitTest.php | 71 - .../Tests/Files/ByteOrderMarkUnitTest.1.inc | 4 - .../Tests/Files/ByteOrderMarkUnitTest.2.inc | 3 - .../Tests/Files/ByteOrderMarkUnitTest.3.inc | 1 - .../Tests/Files/ByteOrderMarkUnitTest.4.inc | Bin 208 -> 0 bytes .../Tests/Files/ByteOrderMarkUnitTest.5.inc | Bin 202 -> 0 bytes .../Tests/Files/ByteOrderMarkUnitTest.php | 63 - .../Tests/Files/EndFileNewlineUnitTest.1.css | 3 - .../Tests/Files/EndFileNewlineUnitTest.1.inc | 3 - .../Tests/Files/EndFileNewlineUnitTest.1.js | 3 - .../Tests/Files/EndFileNewlineUnitTest.2.css | 2 - .../Tests/Files/EndFileNewlineUnitTest.2.inc | 2 - .../Tests/Files/EndFileNewlineUnitTest.2.js | 2 - .../Tests/Files/EndFileNewlineUnitTest.3.css | 2 - .../Files/EndFileNewlineUnitTest.3.css.fixed | 2 - .../Tests/Files/EndFileNewlineUnitTest.3.inc | 2 - .../Files/EndFileNewlineUnitTest.3.inc.fixed | 2 - .../Tests/Files/EndFileNewlineUnitTest.3.js | 2 - .../Files/EndFileNewlineUnitTest.3.js.fixed | 2 - .../Tests/Files/EndFileNewlineUnitTest.4.inc | 2 - .../Files/EndFileNewlineUnitTest.4.inc.fixed | 2 - .../Tests/Files/EndFileNewlineUnitTest.5.inc | 2 - .../Tests/Files/EndFileNewlineUnitTest.6.inc | 1 - .../Files/EndFileNewlineUnitTest.6.inc.fixed | 1 - .../Tests/Files/EndFileNewlineUnitTest.7.inc | 1 - .../Files/EndFileNewlineUnitTest.7.inc.fixed | 1 - .../Tests/Files/EndFileNewlineUnitTest.8.inc | 1 - .../Tests/Files/EndFileNewlineUnitTest.php | 68 - .../Files/EndFileNoNewlineUnitTest.1.css | 3 - .../EndFileNoNewlineUnitTest.1.css.fixed | 2 - .../Files/EndFileNoNewlineUnitTest.1.inc | 3 - .../EndFileNoNewlineUnitTest.1.inc.fixed | 2 - .../Tests/Files/EndFileNoNewlineUnitTest.1.js | 3 - .../Files/EndFileNoNewlineUnitTest.1.js.fixed | 2 - .../Files/EndFileNoNewlineUnitTest.10.inc | 1 - .../Files/EndFileNoNewlineUnitTest.2.css | 2 - .../EndFileNoNewlineUnitTest.2.css.fixed | 2 - .../Files/EndFileNoNewlineUnitTest.2.inc | 3 - .../EndFileNoNewlineUnitTest.2.inc.fixed | 3 - .../Tests/Files/EndFileNoNewlineUnitTest.2.js | 2 - .../Files/EndFileNoNewlineUnitTest.2.js.fixed | 2 - .../Files/EndFileNoNewlineUnitTest.3.css | 2 - .../Files/EndFileNoNewlineUnitTest.3.inc | 2 - .../Tests/Files/EndFileNoNewlineUnitTest.3.js | 2 - .../Files/EndFileNoNewlineUnitTest.4.inc | 3 - .../Files/EndFileNoNewlineUnitTest.5.inc | 2 - .../Files/EndFileNoNewlineUnitTest.6.inc | 2 - .../EndFileNoNewlineUnitTest.6.inc.fixed | 2 - .../Files/EndFileNoNewlineUnitTest.7.inc | 6 - .../Files/EndFileNoNewlineUnitTest.8.inc | 1 - .../EndFileNoNewlineUnitTest.8.inc.fixed | 1 - .../Files/EndFileNoNewlineUnitTest.9.inc | 1 - .../EndFileNoNewlineUnitTest.9.inc.fixed | 1 - .../Tests/Files/EndFileNoNewlineUnitTest.php | 72 - .../Tests/Files/ExecutableFileUnitTest.1.inc | 1 - .../Tests/Files/ExecutableFileUnitTest.2.inc | 1 - .../Tests/Files/ExecutableFileUnitTest.3.inc | 1 - .../Tests/Files/ExecutableFileUnitTest.4.inc | 1 - .../Tests/Files/ExecutableFileUnitTest.php | 76 - .../Tests/Files/InlineHTMLUnitTest.1.inc | 3 - .../Tests/Files/InlineHTMLUnitTest.2.inc | 3 - .../Tests/Files/InlineHTMLUnitTest.3.inc | 6 - .../Tests/Files/InlineHTMLUnitTest.4.inc | 3 - .../Tests/Files/InlineHTMLUnitTest.5.inc | 3 - .../Tests/Files/InlineHTMLUnitTest.6.inc | 2 - .../Tests/Files/InlineHTMLUnitTest.7.inc | 2 - .../Tests/Files/InlineHTMLUnitTest.php | 69 - .../Tests/Files/LineEndingsUnitTest.1.inc | 18 - .../Files/LineEndingsUnitTest.1.inc.fixed | 18 - .../Tests/Files/LineEndingsUnitTest.2.inc | 5 - .../Files/LineEndingsUnitTest.2.inc.fixed | 5 - .../Tests/Files/LineEndingsUnitTest.css | 3 - .../Tests/Files/LineEndingsUnitTest.css.fixed | 3 - .../Tests/Files/LineEndingsUnitTest.js | 2 - .../Tests/Files/LineEndingsUnitTest.js.fixed | 2 - .../Tests/Files/LineEndingsUnitTest.php | 68 - .../Tests/Files/LineLengthUnitTest.1.inc | 84 - .../Tests/Files/LineLengthUnitTest.2.inc | 7 - .../Tests/Files/LineLengthUnitTest.3.inc | 16 - .../Tests/Files/LineLengthUnitTest.4.inc | 16 - .../Tests/Files/LineLengthUnitTest.php | 114 - .../Files/LowercasedFilenameUnitTest.1.inc | 7 - .../Files/LowercasedFilenameUnitTest.2.inc | 7 - .../Files/LowercasedFilenameUnitTest.php | 106 - .../Tests/Files/OneClassPerFileUnitTest.inc | 13 - .../Tests/Files/OneClassPerFileUnitTest.php | 56 - .../Files/OneInterfacePerFileUnitTest.inc | 13 - .../Files/OneInterfacePerFileUnitTest.php | 56 - .../OneObjectStructurePerFileUnitTest.inc | 26 - .../OneObjectStructurePerFileUnitTest.php | 59 - .../Tests/Files/OneTraitPerFileUnitTest.inc | 17 - .../Tests/Files/OneTraitPerFileUnitTest.php | 56 - .../Files/lowercased_filename_unit_test.inc | 1 - .../DisallowMultipleStatementsUnitTest.inc | 20 - ...sallowMultipleStatementsUnitTest.inc.fixed | 25 - .../DisallowMultipleStatementsUnitTest.php | 59 - .../MultipleStatementAlignmentUnitTest.inc | 504 - ...ltipleStatementAlignmentUnitTest.inc.fixed | 504 - .../MultipleStatementAlignmentUnitTest.js | 118 - ...ultipleStatementAlignmentUnitTest.js.fixed | 118 - .../MultipleStatementAlignmentUnitTest.php | 170 - .../Formatting/NoSpaceAfterCastUnitTest.inc | 51 - .../NoSpaceAfterCastUnitTest.inc.fixed | 51 - .../Formatting/NoSpaceAfterCastUnitTest.php | 77 - .../Formatting/SpaceAfterCastUnitTest.1.inc | 100 - .../SpaceAfterCastUnitTest.1.inc.fixed | 97 - .../Formatting/SpaceAfterCastUnitTest.2.inc | 3 - .../Formatting/SpaceAfterCastUnitTest.php | 103 - .../Formatting/SpaceAfterNotUnitTest.1.inc | 86 - .../SpaceAfterNotUnitTest.1.inc.fixed | 83 - .../Formatting/SpaceAfterNotUnitTest.2.inc | 7 - .../Tests/Formatting/SpaceAfterNotUnitTest.js | 5 - .../Formatting/SpaceAfterNotUnitTest.js.fixed | 5 - .../Formatting/SpaceAfterNotUnitTest.php | 96 - .../Formatting/SpaceBeforeCastUnitTest.inc | 65 - .../SpaceBeforeCastUnitTest.inc.fixed | 65 - .../Formatting/SpaceBeforeCastUnitTest.php | 83 - .../CallTimePassByReferenceUnitTest.1.inc | 66 - .../CallTimePassByReferenceUnitTest.2.inc | 7 - .../CallTimePassByReferenceUnitTest.3.inc | 7 - .../CallTimePassByReferenceUnitTest.php | 75 - .../FunctionCallArgumentSpacingUnitTest.1.inc | 199 - ...ionCallArgumentSpacingUnitTest.1.inc.fixed | 199 - .../FunctionCallArgumentSpacingUnitTest.2.inc | 7 - .../FunctionCallArgumentSpacingUnitTest.php | 96 - .../OpeningFunctionBraceBsdAllmanUnitTest.inc | 270 - ...ngFunctionBraceBsdAllmanUnitTest.inc.fixed | 287 - .../OpeningFunctionBraceBsdAllmanUnitTest.php | 91 - ...unctionBraceKernighanRitchieUnitTest.1.inc | 232 - ...nBraceKernighanRitchieUnitTest.1.inc.fixed | 222 - ...unctionBraceKernighanRitchieUnitTest.2.inc | 19 - ...nBraceKernighanRitchieUnitTest.2.inc.fixed | 19 - ...unctionBraceKernighanRitchieUnitTest.3.inc | 7 - ...gFunctionBraceKernighanRitchieUnitTest.php | 116 - .../CyclomaticComplexityUnitTest.1.inc | 460 - .../CyclomaticComplexityUnitTest.2.inc | 7 - .../CyclomaticComplexityUnitTest.3.inc | 7 - .../Metrics/CyclomaticComplexityUnitTest.php | 77 - .../Tests/Metrics/NestingLevelUnitTest.1.inc | 108 - .../Tests/Metrics/NestingLevelUnitTest.2.inc | 7 - .../Tests/Metrics/NestingLevelUnitTest.3.inc | 7 - .../Tests/Metrics/NestingLevelUnitTest.php | 70 - .../AbstractClassNamePrefixUnitTest.1.inc | 45 - .../AbstractClassNamePrefixUnitTest.2.inc | 7 - .../AbstractClassNamePrefixUnitTest.php | 67 - .../CamelCapsFunctionNameUnitTest.1.inc | 204 - .../CamelCapsFunctionNameUnitTest.2.inc | 9 - .../CamelCapsFunctionNameUnitTest.3.inc | 7 - .../CamelCapsFunctionNameUnitTest.php | 105 - .../ConstructorNameUnitTest.1.inc | 130 - .../ConstructorNameUnitTest.2.inc | 9 - .../ConstructorNameUnitTest.php | 73 - .../InterfaceNameSuffixUnitTest.1.inc | 13 - .../InterfaceNameSuffixUnitTest.2.inc | 7 - .../InterfaceNameSuffixUnitTest.php | 62 - .../TraitNameSuffixUnitTest.1.inc | 11 - .../TraitNameSuffixUnitTest.2.inc | 7 - .../TraitNameSuffixUnitTest.php | 63 - .../UpperCaseConstantNameUnitTest.1.inc | 91 - .../UpperCaseConstantNameUnitTest.2.inc | 7 - .../UpperCaseConstantNameUnitTest.3.inc | 7 - .../UpperCaseConstantNameUnitTest.4.inc | 7 - .../UpperCaseConstantNameUnitTest.5.inc | 9 - .../UpperCaseConstantNameUnitTest.php | 74 - .../Tests/PHP/BacktickOperatorUnitTest.inc | 2 - .../Tests/PHP/BacktickOperatorUnitTest.php | 55 - ...CharacterBeforePHPOpeningTagUnitTest.1.inc | 9 - ...CharacterBeforePHPOpeningTagUnitTest.2.inc | 4 - ...CharacterBeforePHPOpeningTagUnitTest.3.inc | 3 - .../CharacterBeforePHPOpeningTagUnitTest.php | 61 - .../Tests/PHP/ClosingPHPTagUnitTest.1.inc | 10 - .../Tests/PHP/ClosingPHPTagUnitTest.2.inc | 5 - .../Tests/PHP/ClosingPHPTagUnitTest.php | 64 - .../Tests/PHP/DeprecatedFunctionsUnitTest.inc | 5 - .../Tests/PHP/DeprecatedFunctionsUnitTest.php | 67 - .../DisallowAlternativePHPTagsUnitTest.1.inc | 14 - ...llowAlternativePHPTagsUnitTest.1.inc.fixed | 14 - .../DisallowAlternativePHPTagsUnitTest.2.inc | 6 - ...llowAlternativePHPTagsUnitTest.2.inc.fixed | 6 - .../DisallowAlternativePHPTagsUnitTest.3.inc | 7 - .../DisallowAlternativePHPTagsUnitTest.php | 110 - .../DisallowRequestSuperglobalUnitTest.inc | 16 - .../DisallowRequestSuperglobalUnitTest.php | 56 - .../PHP/DisallowShortOpenTagUnitTest.1.inc | 11 - .../DisallowShortOpenTagUnitTest.1.inc.fixed | 11 - .../PHP/DisallowShortOpenTagUnitTest.2.inc | 8 - .../DisallowShortOpenTagUnitTest.2.inc.fixed | 8 - .../PHP/DisallowShortOpenTagUnitTest.3.inc | 20 - .../PHP/DisallowShortOpenTagUnitTest.4.inc | 6 - .../PHP/DisallowShortOpenTagUnitTest.5.inc | 4 - .../PHP/DisallowShortOpenTagUnitTest.php | 110 - .../Tests/PHP/DiscourageGotoUnitTest.inc | 18 - .../Tests/PHP/DiscourageGotoUnitTest.php | 58 - .../Tests/PHP/ForbiddenFunctionsUnitTest.inc | 62 - .../Tests/PHP/ForbiddenFunctionsUnitTest.php | 60 - .../Tests/PHP/LowerCaseConstantUnitTest.1.inc | 183 - .../PHP/LowerCaseConstantUnitTest.1.inc.fixed | 183 - .../Tests/PHP/LowerCaseConstantUnitTest.2.inc | 4 - .../Tests/PHP/LowerCaseConstantUnitTest.js | 14 - .../PHP/LowerCaseConstantUnitTest.js.fixed | 14 - .../Tests/PHP/LowerCaseConstantUnitTest.php | 112 - .../Tests/PHP/LowerCaseKeywordUnitTest.inc | 76 - .../PHP/LowerCaseKeywordUnitTest.inc.fixed | 76 - .../Tests/PHP/LowerCaseKeywordUnitTest.php | 83 - .../Tests/PHP/LowerCaseTypeUnitTest.inc | 145 - .../Tests/PHP/LowerCaseTypeUnitTest.inc.fixed | 145 - .../Tests/PHP/LowerCaseTypeUnitTest.php | 117 - .../Tests/PHP/NoSilencedErrorsUnitTest.inc | 16 - .../Tests/PHP/NoSilencedErrorsUnitTest.php | 57 - .../PHP/RequireStrictTypesUnitTest.1.inc | 8 - .../PHP/RequireStrictTypesUnitTest.10.inc | 5 - .../PHP/RequireStrictTypesUnitTest.11.inc | 5 - .../RequireStrictTypesUnitTest.11.inc.fixed | 5 - .../PHP/RequireStrictTypesUnitTest.12.inc | 5 - .../RequireStrictTypesUnitTest.12.inc.fixed | 5 - .../PHP/RequireStrictTypesUnitTest.13.inc | 3 - .../PHP/RequireStrictTypesUnitTest.14.inc | 5 - .../RequireStrictTypesUnitTest.14.inc.fixed | 5 - .../PHP/RequireStrictTypesUnitTest.15.inc | 5 - .../RequireStrictTypesUnitTest.15.inc.fixed | 5 - .../PHP/RequireStrictTypesUnitTest.2.inc | 2 - .../PHP/RequireStrictTypesUnitTest.3.inc | 5 - .../PHP/RequireStrictTypesUnitTest.4.inc | 10 - .../PHP/RequireStrictTypesUnitTest.5.inc | 6 - .../PHP/RequireStrictTypesUnitTest.6.inc | 4 - .../PHP/RequireStrictTypesUnitTest.7.inc | 4 - .../PHP/RequireStrictTypesUnitTest.8.inc | 5 - .../PHP/RequireStrictTypesUnitTest.9.inc | 5 - .../Tests/PHP/RequireStrictTypesUnitTest.php | 72 - .../Generic/Tests/PHP/SAPIUsageUnitTest.inc | 5 - .../Generic/Tests/PHP/SAPIUsageUnitTest.php | 53 - .../Generic/Tests/PHP/SyntaxUnitTest.1.inc | 4 - .../Generic/Tests/PHP/SyntaxUnitTest.2.inc | 3 - .../Generic/Tests/PHP/SyntaxUnitTest.php | 170 - .../Tests/PHP/UpperCaseConstantUnitTest.inc | 124 - .../PHP/UpperCaseConstantUnitTest.inc.fixed | 124 - .../Tests/PHP/UpperCaseConstantUnitTest.php | 81 - .../Strings/UnnecessaryHeredocUnitTest.1.inc | 122 - .../UnnecessaryHeredocUnitTest.1.inc.fixed | 122 - .../Strings/UnnecessaryHeredocUnitTest.2.inc | 122 - .../UnnecessaryHeredocUnitTest.2.inc.fixed | 122 - .../Strings/UnnecessaryHeredocUnitTest.3.inc | 6 - .../Strings/UnnecessaryHeredocUnitTest.php | 74 - .../UnnecessaryStringConcatUnitTest.1.inc | 34 - .../UnnecessaryStringConcatUnitTest.2.inc | 7 - .../UnnecessaryStringConcatUnitTest.js | 15 - .../UnnecessaryStringConcatUnitTest.php | 87 - .../GitMergeConflictUnitTest.1.css | 35 - .../GitMergeConflictUnitTest.1.inc | 61 - .../GitMergeConflictUnitTest.2.css | 32 - .../GitMergeConflictUnitTest.2.inc | 31 - .../GitMergeConflictUnitTest.3.inc | 43 - .../GitMergeConflictUnitTest.4.inc | 71 - .../GitMergeConflictUnitTest.5.inc | 34 - .../GitMergeConflictUnitTest.6.inc | 34 - .../GitMergeConflictUnitTest.7.inc | 19 - .../GitMergeConflictUnitTest.js | 33 - .../GitMergeConflictUnitTest.php | 175 - .../SubversionPropertiesUnitTest.inc | 3 - .../SubversionPropertiesUnitTest.php | 66 - .../ArbitraryParenthesesSpacingUnitTest.1.inc | 192 - ...raryParenthesesSpacingUnitTest.1.inc.fixed | 180 - .../ArbitraryParenthesesSpacingUnitTest.2.inc | 4 - .../ArbitraryParenthesesSpacingUnitTest.php | 106 - .../DisallowSpaceIndentUnitTest.1.inc | 125 - .../DisallowSpaceIndentUnitTest.1.inc.fixed | 125 - .../DisallowSpaceIndentUnitTest.2.inc | 125 - .../DisallowSpaceIndentUnitTest.2.inc.fixed | 125 - .../DisallowSpaceIndentUnitTest.3.inc | 19 - .../DisallowSpaceIndentUnitTest.3.inc.fixed | 19 - .../DisallowSpaceIndentUnitTest.4.inc | 13 - .../DisallowSpaceIndentUnitTest.css | 4 - .../DisallowSpaceIndentUnitTest.css.fixed | 4 - .../WhiteSpace/DisallowSpaceIndentUnitTest.js | 9 - .../DisallowSpaceIndentUnitTest.js.fixed | 9 - .../DisallowSpaceIndentUnitTest.php | 145 - .../DisallowTabIndentUnitTest.1.inc | 102 - .../DisallowTabIndentUnitTest.1.inc.fixed | 102 - .../DisallowTabIndentUnitTest.2.inc | 19 - .../DisallowTabIndentUnitTest.2.inc.fixed | 19 - .../DisallowTabIndentUnitTest.3.inc | 13 - .../WhiteSpace/DisallowTabIndentUnitTest.css | 5 - .../DisallowTabIndentUnitTest.css.fixed | 5 - .../WhiteSpace/DisallowTabIndentUnitTest.js | 9 - .../DisallowTabIndentUnitTest.js.fixed | 9 - .../WhiteSpace/DisallowTabIndentUnitTest.php | 153 - .../HereNowdocIdentifierSpacingUnitTest.inc | 25 - ...eNowdocIdentifierSpacingUnitTest.inc.fixed | 25 - .../HereNowdocIdentifierSpacingUnitTest.php | 58 - .../IncrementDecrementSpacingUnitTest.inc | 43 - ...ncrementDecrementSpacingUnitTest.inc.fixed | 41 - .../IncrementDecrementSpacingUnitTest.js | 17 - ...IncrementDecrementSpacingUnitTest.js.fixed | 16 - .../IncrementDecrementSpacingUnitTest.php | 86 - .../LanguageConstructSpacingUnitTest.1.inc | 107 - ...nguageConstructSpacingUnitTest.1.inc.fixed | 101 - .../LanguageConstructSpacingUnitTest.2.inc | 4 - .../LanguageConstructSpacingUnitTest.php | 102 - .../WhiteSpace/ScopeIndentUnitTest.1.inc | 1659 - .../ScopeIndentUnitTest.1.inc.fixed | 1659 - .../Tests/WhiteSpace/ScopeIndentUnitTest.1.js | 239 - .../WhiteSpace/ScopeIndentUnitTest.1.js.fixed | 239 - .../WhiteSpace/ScopeIndentUnitTest.2.inc | 1659 - .../ScopeIndentUnitTest.2.inc.fixed | 1659 - .../WhiteSpace/ScopeIndentUnitTest.3.inc | 34 - .../ScopeIndentUnitTest.3.inc.fixed | 34 - .../WhiteSpace/ScopeIndentUnitTest.4.inc | 6 - .../Tests/WhiteSpace/ScopeIndentUnitTest.php | 222 - .../SpreadOperatorSpacingAfterUnitTest.1.inc | 78 - ...adOperatorSpacingAfterUnitTest.1.inc.fixed | 73 - .../SpreadOperatorSpacingAfterUnitTest.2.inc | 4 - .../SpreadOperatorSpacingAfterUnitTest.php | 72 - .../src/Standards/Generic/ruleset.xml | 4 - .../Sniffs/CSS/BrowserSpecificStylesSniff.php | 126 - .../Channels/DisallowSelfActionsSniff.php | 164 - .../Sniffs/Channels/IncludeOwnSystemSniff.php | 137 - .../Sniffs/Channels/IncludeSystemSniff.php | 353 - .../Sniffs/Channels/UnusedSystemSniff.php | 180 - .../Commenting/FunctionCommentSniff.php | 123 - .../MySource/Sniffs/Debug/DebugCodeSniff.php | 94 - .../Sniffs/Debug/FirebugConsoleSniff.php | 103 - .../Sniffs/Objects/AssignThisSniff.php | 120 - .../Objects/CreateWidgetTypeCallbackSniff.php | 257 - .../Sniffs/Objects/DisallowNewWidgetSniff.php | 98 - .../Sniffs/PHP/AjaxNullComparisonSniff.php | 142 - .../Sniffs/PHP/EvalObjectFactorySniff.php | 153 - .../Sniffs/PHP/GetRequestDataSniff.php | 145 - .../Sniffs/PHP/ReturnFunctionValueSniff.php | 102 - .../Sniffs/Strings/JoinStringsSniff.php | 115 - .../CSS/BrowserSpecificStylesUnitTest.css | 13 - .../CSS/BrowserSpecificStylesUnitTest.php | 53 - .../Channels/DisallowSelfActionsUnitTest.inc | 51 - .../Channels/DisallowSelfActionsUnitTest.php | 58 - .../Tests/Channels/IncludeSystemUnitTest.inc | 112 - .../Tests/Channels/IncludeSystemUnitTest.php | 65 - .../Tests/Channels/UnusedSystemUnitTest.inc | 67 - .../Tests/Channels/UnusedSystemUnitTest.php | 60 - .../Commenting/FunctionCommentUnitTest.inc | 101 - .../Commenting/FunctionCommentUnitTest.php | 59 - .../Tests/Debug/DebugCodeUnitTest.inc | 4 - .../Tests/Debug/DebugCodeUnitTest.php | 56 - .../Tests/Debug/FirebugConsoleUnitTest.js | 8 - .../Tests/Debug/FirebugConsoleUnitTest.php | 66 - .../Tests/Objects/AssignThisUnitTest.js | 20 - .../Tests/Objects/AssignThisUnitTest.php | 63 - .../CreateWidgetTypeCallbackUnitTest.js | 186 - .../CreateWidgetTypeCallbackUnitTest.php | 62 - .../Objects/DisallowNewWidgetUnitTest.inc | 6 - .../Objects/DisallowNewWidgetUnitTest.php | 53 - .../Tests/PHP/AjaxNullComparisonUnitTest.inc | 182 - .../Tests/PHP/AjaxNullComparisonUnitTest.php | 60 - .../Tests/PHP/EvalObjectFactoryUnitTest.inc | 26 - .../Tests/PHP/EvalObjectFactoryUnitTest.php | 57 - .../Tests/PHP/GetRequestDataUnitTest.inc | 30 - .../Tests/PHP/GetRequestDataUnitTest.php | 61 - .../Tests/PHP/ReturnFunctionValueUnitTest.inc | 9 - .../Tests/PHP/ReturnFunctionValueUnitTest.php | 57 - .../Tests/Strings/JoinStringsUnitTest.js | 18 - .../Tests/Strings/JoinStringsUnitTest.php | 67 - .../src/Standards/MySource/ruleset.xml | 18 - .../Docs/Classes/ClassDeclarationStandard.xml | 76 - .../Docs/Commenting/ClassCommentStandard.xml | 177 - .../Docs/Commenting/FileCommentStandard.xml | 293 - .../Commenting/FunctionCommentStandard.xml | 230 - .../Docs/Commenting/InlineCommentStandard.xml | 19 - .../ControlSignatureStandard.xml | 36 - .../MultiLineConditionStandard.xml | 60 - .../PEAR/Docs/Files/IncludingFileStandard.xml | 24 - .../MultiLineAssignmentStandard.xml | 35 - .../FunctionCallSignatureStandard.xml | 19 - .../Functions/FunctionDeclarationStandard.xml | 41 - .../Functions/ValidDefaultValueStandard.xml | 25 - .../ValidClassNameStandard.xml | 23 - .../ValidFunctionNameStandard.xml | 23 - .../ValidVariableNameStandard.xml | 29 - .../ObjectOperatorIndentStandard.xml | 39 - .../WhiteSpace/ScopeClosingBraceStandard.xml | 23 - .../Docs/WhiteSpace/ScopeIndentStandard.xml | 29 - .../Sniffs/Classes/ClassDeclarationSniff.php | 150 - .../Sniffs/Commenting/ClassCommentSniff.php | 122 - .../Sniffs/Commenting/FileCommentSniff.php | 583 - .../Commenting/FunctionCommentSniff.php | 550 - .../Sniffs/Commenting/InlineCommentSniff.php | 68 - .../ControlSignatureSniff.php | 48 - .../MultiLineConditionSniff.php | 283 - .../PEAR/Sniffs/Files/IncludingFileSniff.php | 136 - .../Formatting/MultiLineAssignmentSniff.php | 106 - .../Functions/FunctionCallSignatureSniff.php | 634 - .../Functions/FunctionDeclarationSniff.php | 546 - .../Functions/ValidDefaultValueSniff.php | 81 - .../NamingConventions/ValidClassNameSniff.php | 98 - .../ValidFunctionNameSniff.php | 284 - .../ValidVariableNameSniff.php | 107 - .../WhiteSpace/ObjectOperatorIndentSniff.php | 201 - .../WhiteSpace/ScopeClosingBraceSniff.php | 182 - .../Sniffs/WhiteSpace/ScopeIndentSniff.php | 24 - .../Classes/ClassDeclarationUnitTest.1.inc | 114 - .../ClassDeclarationUnitTest.1.inc.fixed | 125 - .../Classes/ClassDeclarationUnitTest.2.inc | 11 - .../Classes/ClassDeclarationUnitTest.php | 100 - .../Tests/Commenting/ClassCommentUnitTest.inc | 163 - .../Tests/Commenting/ClassCommentUnitTest.php | 78 - .../Commenting/FileCommentUnitTest.1.inc | 53 - .../Commenting/FileCommentUnitTest.2.inc | 9 - .../Commenting/FileCommentUnitTest.3.inc | 8 - .../Commenting/FileCommentUnitTest.4.inc | 7 - .../Tests/Commenting/FileCommentUnitTest.php | 95 - .../Commenting/FunctionCommentUnitTest.inc | 550 - .../FunctionCommentUnitTest.inc.fixed | 521 - .../Commenting/FunctionCommentUnitTest.php | 108 - .../Commenting/InlineCommentUnitTest.inc | 31 - .../InlineCommentUnitTest.inc.fixed | 31 - .../Commenting/InlineCommentUnitTest.php | 61 - .../ControlSignatureUnitTest.inc | 165 - .../ControlSignatureUnitTest.php | 77 - .../MultiLineConditionUnitTest.inc | 251 - .../MultiLineConditionUnitTest.inc.fixed | 247 - .../MultiLineConditionUnitTest.js | 251 - .../MultiLineConditionUnitTest.js.fixed | 247 - .../MultiLineConditionUnitTest.php | 96 - .../Tests/Files/IncludingFileUnitTest.inc | 99 - .../Files/IncludingFileUnitTest.inc.fixed | 99 - .../Tests/Files/IncludingFileUnitTest.php | 72 - .../MultiLineAssignmentUnitTest.inc | 22 - .../MultiLineAssignmentUnitTest.php | 57 - .../FunctionCallSignatureUnitTest.inc | 576 - .../FunctionCallSignatureUnitTest.inc.fixed | 591 - .../FunctionCallSignatureUnitTest.js | 80 - .../FunctionCallSignatureUnitTest.js.fixed | 84 - .../FunctionCallSignatureUnitTest.php | 164 - .../FunctionDeclarationUnitTest.1.inc | 490 - .../FunctionDeclarationUnitTest.1.inc.fixed | 487 - .../FunctionDeclarationUnitTest.2.inc | 7 - .../FunctionDeclarationUnitTest.3.inc | 7 - .../FunctionDeclarationUnitTest.4.inc | 7 - .../FunctionDeclarationUnitTest.4.inc.fixed | 7 - .../Functions/FunctionDeclarationUnitTest.js | 59 - .../FunctionDeclarationUnitTest.js.fixed | 60 - .../Functions/FunctionDeclarationUnitTest.php | 154 - .../Functions/ValidDefaultValueUnitTest.1.inc | 120 - .../Functions/ValidDefaultValueUnitTest.2.inc | 7 - .../Functions/ValidDefaultValueUnitTest.php | 74 - .../ValidClassNameUnitTest.inc | 90 - .../ValidClassNameUnitTest.php | 78 - .../ValidFunctionNameUnitTest.inc | 243 - .../ValidFunctionNameUnitTest.php | 154 - .../ValidVariableNameUnitTest.inc | 115 - .../ValidVariableNameUnitTest.php | 64 - .../ObjectOperatorIndentUnitTest.inc | 153 - .../ObjectOperatorIndentUnitTest.inc.fixed | 153 - .../ObjectOperatorIndentUnitTest.php | 80 - .../WhiteSpace/ScopeClosingBraceUnitTest.inc | 170 - .../ScopeClosingBraceUnitTest.inc.fixed | 177 - .../WhiteSpace/ScopeClosingBraceUnitTest.php | 73 - .../Tests/WhiteSpace/ScopeIndentUnitTest.inc | 314 - .../WhiteSpace/ScopeIndentUnitTest.inc.fixed | 314 - .../Tests/WhiteSpace/ScopeIndentUnitTest.php | 86 - .../src/Standards/PEAR/ruleset.xml | 41 - .../Docs/Classes/ClassDeclarationStandard.xml | 48 - .../PSR1/Docs/Files/SideEffectsStandard.xml | 27 - .../Methods/CamelCapsMethodNameStandard.xml | 29 - .../Sniffs/Classes/ClassDeclarationSniff.php | 75 - .../PSR1/Sniffs/Files/SideEffectsSniff.php | 303 - .../Methods/CamelCapsMethodNameSniff.php | 91 - .../Classes/ClassDeclarationUnitTest.1.inc | 3 - .../Classes/ClassDeclarationUnitTest.2.inc | 4 - .../Classes/ClassDeclarationUnitTest.3.inc | 3 - .../Classes/ClassDeclarationUnitTest.php | 62 - .../Tests/Files/SideEffectsUnitTest.1.inc | 87 - .../Tests/Files/SideEffectsUnitTest.10.inc | 8 - .../Tests/Files/SideEffectsUnitTest.11.inc | 11 - .../Tests/Files/SideEffectsUnitTest.12.inc | 8 - .../Tests/Files/SideEffectsUnitTest.13.inc | 2 - .../Tests/Files/SideEffectsUnitTest.14.inc | 2 - .../Tests/Files/SideEffectsUnitTest.15.inc | 2 - .../Tests/Files/SideEffectsUnitTest.16.inc | 2 - .../Tests/Files/SideEffectsUnitTest.17.inc | 8 - .../Tests/Files/SideEffectsUnitTest.2.inc | 24 - .../Tests/Files/SideEffectsUnitTest.3.inc | 6 - .../Tests/Files/SideEffectsUnitTest.4.inc | 10 - .../Tests/Files/SideEffectsUnitTest.5.inc | 2 - .../Tests/Files/SideEffectsUnitTest.6.inc | 9 - .../Tests/Files/SideEffectsUnitTest.7.inc | 8 - .../Tests/Files/SideEffectsUnitTest.8.inc | 8 - .../Tests/Files/SideEffectsUnitTest.9.inc | 8 - .../PSR1/Tests/Files/SideEffectsUnitTest.php | 85 - .../Methods/CamelCapsMethodNameUnitTest.inc | 81 - .../Methods/CamelCapsMethodNameUnitTest.php | 64 - .../src/Standards/PSR1/ruleset.xml | 47 - .../Classes/ClassInstantiationStandard.xml | 19 - .../Docs/Classes/ClosingBraceStandard.xml | 35 - .../Classes/OpeningBraceSpaceStandard.xml | 32 - .../BooleanOperatorPlacementStandard.xml | 59 - .../ControlStructureSpacingStandard.xml | 124 - .../Docs/Files/ImportStatementStandard.xml | 33 - .../PSR12/Docs/Files/OpenTagStandard.xml | 40 - .../NullableTypeDeclarationStandard.xml | 45 - .../ReturnTypeDeclarationStandard.xml | 41 - .../ShortFormTypeKeywordsStandard.xml | 19 - .../CompoundNamespaceDepthStandard.xml | 28 - .../Operators/OperatorSpacingStandard.xml | 27 - .../Properties/ConstantVisibilityStandard.xml | 27 - .../Classes/AnonClassDeclarationSniff.php | 246 - .../Classes/ClassInstantiationSniff.php | 112 - .../Sniffs/Classes/ClosingBraceSniff.php | 67 - .../Sniffs/Classes/OpeningBraceSpaceSniff.php | 80 - .../BooleanOperatorPlacementSniff.php | 229 - .../ControlStructureSpacingSniff.php | 220 - .../Sniffs/Files/DeclareStatementSniff.php | 262 - .../PSR12/Sniffs/Files/FileHeaderSniff.php | 429 - .../Sniffs/Files/ImportStatementSniff.php | 77 - .../PSR12/Sniffs/Files/OpenTagSniff.php | 76 - .../NullableTypeDeclarationSniff.php | 94 - .../Functions/ReturnTypeDeclarationSniff.php | 108 - .../Keywords/ShortFormTypeKeywordsSniff.php | 75 - .../CompoundNamespaceDepthSniff.php | 80 - .../Sniffs/Operators/OperatorSpacingSniff.php | 128 - .../Properties/ConstantVisibilitySniff.php | 70 - .../Sniffs/Traits/UseDeclarationSniff.php | 700 - .../Classes/AnonClassDeclarationUnitTest.inc | 96 - .../AnonClassDeclarationUnitTest.inc.fixed | 98 - .../Classes/AnonClassDeclarationUnitTest.php | 80 - .../Classes/ClassInstantiationUnitTest.inc | 51 - .../ClassInstantiationUnitTest.inc.fixed | 51 - .../Classes/ClassInstantiationUnitTest.php | 72 - .../Tests/Classes/ClosingBraceUnitTest.inc | 52 - .../Tests/Classes/ClosingBraceUnitTest.php | 60 - .../Classes/OpeningBraceSpaceUnitTest.inc | 57 - .../OpeningBraceSpaceUnitTest.inc.fixed | 48 - .../Classes/OpeningBraceSpaceUnitTest.php | 60 - .../BooleanOperatorPlacementUnitTest.inc | 131 - ...BooleanOperatorPlacementUnitTest.inc.fixed | 141 - .../BooleanOperatorPlacementUnitTest.php | 64 - .../ControlStructureSpacingUnitTest.inc | 133 - .../ControlStructureSpacingUnitTest.inc.fixed | 131 - .../ControlStructureSpacingUnitTest.php | 77 - .../Files/DeclareStatementUnitTest.1.inc | 50 - .../DeclareStatementUnitTest.1.inc.fixed | 54 - .../Files/DeclareStatementUnitTest.2.inc | 3 - .../Tests/Files/DeclareStatementUnitTest.php | 84 - .../Tests/Files/FileHeaderUnitTest.1.inc | 29 - .../Tests/Files/FileHeaderUnitTest.10.inc | 4 - .../Files/FileHeaderUnitTest.10.inc.fixed | 5 - .../Tests/Files/FileHeaderUnitTest.11.inc | 21 - .../Files/FileHeaderUnitTest.11.inc.fixed | 22 - .../Tests/Files/FileHeaderUnitTest.12.inc | 17 - .../Files/FileHeaderUnitTest.12.inc.fixed | 18 - .../Tests/Files/FileHeaderUnitTest.13.inc | 24 - .../Tests/Files/FileHeaderUnitTest.14.inc | 7 - .../Tests/Files/FileHeaderUnitTest.15.inc | 5 - .../Tests/Files/FileHeaderUnitTest.16.inc | 13 - .../Tests/Files/FileHeaderUnitTest.17.inc | 13 - .../Tests/Files/FileHeaderUnitTest.18.inc | 16 - .../Tests/Files/FileHeaderUnitTest.19.inc | 11 - .../Tests/Files/FileHeaderUnitTest.2.inc | 33 - .../Files/FileHeaderUnitTest.2.inc.fixed | 29 - .../Tests/Files/FileHeaderUnitTest.3.inc | 27 - .../Tests/Files/FileHeaderUnitTest.4.inc | 15 - .../Files/FileHeaderUnitTest.4.inc.fixed | 19 - .../Tests/Files/FileHeaderUnitTest.5.inc | 18 - .../Tests/Files/FileHeaderUnitTest.6.inc | 13 - .../Tests/Files/FileHeaderUnitTest.7.inc | 2 - .../Files/FileHeaderUnitTest.7.inc.fixed | 3 - .../Tests/Files/FileHeaderUnitTest.8.inc | 5 - .../Tests/Files/FileHeaderUnitTest.9.inc | 7 - .../PSR12/Tests/Files/FileHeaderUnitTest.php | 87 - .../Tests/Files/ImportStatementUnitTest.inc | 26 - .../Files/ImportStatementUnitTest.inc.fixed | 26 - .../Tests/Files/ImportStatementUnitTest.php | 58 - .../PSR12/Tests/Files/OpenTagUnitTest.1.inc | 3 - .../PSR12/Tests/Files/OpenTagUnitTest.2.inc | 1 - .../Tests/Files/OpenTagUnitTest.2.inc.fixed | 2 - .../PSR12/Tests/Files/OpenTagUnitTest.3.inc | 3 - .../PSR12/Tests/Files/OpenTagUnitTest.4.inc | 2 - .../PSR12/Tests/Files/OpenTagUnitTest.5.inc | 1 - .../PSR12/Tests/Files/OpenTagUnitTest.php | 60 - .../NullableTypeDeclarationUnitTest.inc | 95 - .../NullableTypeDeclarationUnitTest.inc.fixed | 92 - .../NullableTypeDeclarationUnitTest.php | 72 - .../ReturnTypeDeclarationUnitTest.inc | 66 - .../ReturnTypeDeclarationUnitTest.inc.fixed | 62 - .../ReturnTypeDeclarationUnitTest.php | 66 - .../ShortFormTypeKeywordsUnitTest.inc | 14 - .../ShortFormTypeKeywordsUnitTest.inc.fixed | 14 - .../ShortFormTypeKeywordsUnitTest.php | 59 - .../CompoundNamespaceDepthUnitTest.inc | 34 - .../CompoundNamespaceDepthUnitTest.php | 57 - .../Operators/OperatorSpacingUnitTest.1.inc | 79 - .../OperatorSpacingUnitTest.1.inc.fixed | 79 - .../Operators/OperatorSpacingUnitTest.2.inc | 3 - .../Operators/OperatorSpacingUnitTest.3.inc | 6 - .../Operators/OperatorSpacingUnitTest.php | 81 - .../ConstantVisibilityUnitTest.1.inc | 22 - .../ConstantVisibilityUnitTest.2.inc | 7 - .../Properties/ConstantVisibilityUnitTest.php | 70 - .../Tests/Traits/UseDeclarationUnitTest.inc | 221 - .../Traits/UseDeclarationUnitTest.inc.fixed | 213 - .../Tests/Traits/UseDeclarationUnitTest.php | 76 - .../src/Standards/PSR12/ruleset.xml | 348 - .../Docs/Classes/ClassDeclarationStandard.xml | 23 - .../Classes/PropertyDeclarationStandard.xml | 81 - .../ControlStructureSpacingStandard.xml | 23 - .../ElseIfDeclarationStandard.xml | 27 - .../SwitchDeclarationStandard.xml | 204 - .../PSR2/Docs/Files/ClosingTagStandard.xml | 23 - .../Docs/Files/EndFileNewlineStandard.xml | 7 - .../Methods/FunctionCallSignatureStandard.xml | 107 - .../Methods/FunctionClosingBraceStandard.xml | 26 - .../Methods/MethodDeclarationStandard.xml | 51 - .../NamespaceDeclarationStandard.xml | 22 - .../Namespaces/UseDeclarationStandard.xml | 57 - .../Sniffs/Classes/ClassDeclarationSniff.php | 540 - .../Classes/PropertyDeclarationSniff.php | 311 - .../ControlStructureSpacingSniff.php | 141 - .../ElseIfDeclarationSniff.php | 72 - .../SwitchDeclarationSniff.php | 405 - .../PSR2/Sniffs/Files/ClosingTagSniff.php | 89 - .../PSR2/Sniffs/Files/EndFileNewlineSniff.php | 107 - .../Methods/FunctionCallSignatureSniff.php | 79 - .../Methods/FunctionClosingBraceSniff.php | 91 - .../Sniffs/Methods/MethodDeclarationSniff.php | 162 - .../Namespaces/NamespaceDeclarationSniff.php | 100 - .../Sniffs/Namespaces/UseDeclarationSniff.php | 297 - .../Classes/ClassDeclarationUnitTest.inc | 346 - .../ClassDeclarationUnitTest.inc.fixed | 335 - .../Classes/ClassDeclarationUnitTest.php | 103 - .../Classes/PropertyDeclarationUnitTest.inc | 136 - .../PropertyDeclarationUnitTest.inc.fixed | 133 - .../Classes/PropertyDeclarationUnitTest.php | 108 - .../ControlStructureSpacingUnitTest.inc | 81 - .../ControlStructureSpacingUnitTest.inc.fixed | 80 - .../ControlStructureSpacingUnitTest.php | 67 - .../ElseIfDeclarationUnitTest.inc | 17 - .../ElseIfDeclarationUnitTest.inc.fixed | 17 - .../ElseIfDeclarationUnitTest.php | 56 - .../SwitchDeclarationUnitTest.inc | 624 - .../SwitchDeclarationUnitTest.inc.fixed | 619 - .../SwitchDeclarationUnitTest.php | 91 - .../PSR2/Tests/Files/ClosingTagUnitTest.1.inc | 12 - .../Files/ClosingTagUnitTest.1.inc.fixed | 12 - .../PSR2/Tests/Files/ClosingTagUnitTest.2.inc | 3 - .../PSR2/Tests/Files/ClosingTagUnitTest.3.inc | 7 - .../PSR2/Tests/Files/ClosingTagUnitTest.4.inc | 1 - .../Files/ClosingTagUnitTest.4.inc.fixed | 1 - .../PSR2/Tests/Files/ClosingTagUnitTest.5.inc | 1 - .../Files/ClosingTagUnitTest.5.inc.fixed | 1 - .../PSR2/Tests/Files/ClosingTagUnitTest.6.inc | 5 - .../Files/ClosingTagUnitTest.6.inc.fixed | 5 - .../PSR2/Tests/Files/ClosingTagUnitTest.7.inc | 5 - .../Files/ClosingTagUnitTest.7.inc.fixed | 5 - .../PSR2/Tests/Files/ClosingTagUnitTest.php | 69 - .../Tests/Files/EndFileNewlineUnitTest.1.inc | 3 - .../Files/EndFileNewlineUnitTest.1.inc.fixed | 2 - .../Tests/Files/EndFileNewlineUnitTest.10.inc | 3 - .../Files/EndFileNewlineUnitTest.10.inc.fixed | 2 - .../Tests/Files/EndFileNewlineUnitTest.11.inc | 1 - .../Files/EndFileNewlineUnitTest.11.inc.fixed | 1 - .../Tests/Files/EndFileNewlineUnitTest.12.inc | 1 - .../Files/EndFileNewlineUnitTest.12.inc.fixed | 1 - .../Tests/Files/EndFileNewlineUnitTest.13.inc | 5 - .../Files/EndFileNewlineUnitTest.13.inc.fixed | 1 - .../Tests/Files/EndFileNewlineUnitTest.14.inc | 1 - .../Tests/Files/EndFileNewlineUnitTest.2.inc | 2 - .../Tests/Files/EndFileNewlineUnitTest.3.inc | 2 - .../Files/EndFileNewlineUnitTest.3.inc.fixed | 2 - .../Tests/Files/EndFileNewlineUnitTest.4.inc | 4 - .../Tests/Files/EndFileNewlineUnitTest.5.inc | 6 - .../Tests/Files/EndFileNewlineUnitTest.6.inc | 2 - .../Files/EndFileNewlineUnitTest.6.inc.fixed | 2 - .../Tests/Files/EndFileNewlineUnitTest.7.inc | 11 - .../Files/EndFileNewlineUnitTest.7.inc.fixed | 2 - .../Tests/Files/EndFileNewlineUnitTest.8.inc | 2 - .../Tests/Files/EndFileNewlineUnitTest.9.inc | 2 - .../Files/EndFileNewlineUnitTest.9.inc.fixed | 2 - .../Tests/Files/EndFileNewlineUnitTest.php | 71 - .../Methods/FunctionCallSignatureUnitTest.inc | 267 - .../FunctionCallSignatureUnitTest.inc.fixed | 283 - .../Methods/FunctionCallSignatureUnitTest.php | 99 - .../Methods/FunctionClosingBraceUnitTest.inc | 70 - .../FunctionClosingBraceUnitTest.inc.fixed | 61 - .../Methods/FunctionClosingBraceUnitTest.php | 60 - .../Methods/MethodDeclarationUnitTest.inc | 75 - .../MethodDeclarationUnitTest.inc.fixed | 75 - .../Methods/MethodDeclarationUnitTest.php | 76 - .../NamespaceDeclarationUnitTest.inc | 26 - .../NamespaceDeclarationUnitTest.inc.fixed | 28 - .../NamespaceDeclarationUnitTest.php | 58 - .../Namespaces/UseDeclarationUnitTest.1.inc | 40 - .../Namespaces/UseDeclarationUnitTest.10.inc | 8 - .../UseDeclarationUnitTest.10.inc.fixed | 9 - .../Namespaces/UseDeclarationUnitTest.11.inc | 2 - .../UseDeclarationUnitTest.11.inc.fixed | 4 - .../Namespaces/UseDeclarationUnitTest.12.inc | 9 - .../UseDeclarationUnitTest.12.inc.fixed | 11 - .../Namespaces/UseDeclarationUnitTest.13.inc | 10 - .../UseDeclarationUnitTest.13.inc.fixed | 11 - .../Namespaces/UseDeclarationUnitTest.14.inc | 8 - .../UseDeclarationUnitTest.14.inc.fixed | 9 - .../Namespaces/UseDeclarationUnitTest.15.inc | 10 - .../Namespaces/UseDeclarationUnitTest.16.inc | 11 - .../UseDeclarationUnitTest.16.inc.fixed | 9 - .../Namespaces/UseDeclarationUnitTest.17.inc | 3 - .../Namespaces/UseDeclarationUnitTest.18.inc | 4 - .../Namespaces/UseDeclarationUnitTest.2.inc | 21 - .../UseDeclarationUnitTest.2.inc.fixed | 27 - .../Namespaces/UseDeclarationUnitTest.3.inc | 16 - .../UseDeclarationUnitTest.3.inc.fixed | 16 - .../Namespaces/UseDeclarationUnitTest.4.inc | 4 - .../Namespaces/UseDeclarationUnitTest.5.inc | 47 - .../UseDeclarationUnitTest.5.inc.fixed | 56 - .../Namespaces/UseDeclarationUnitTest.6.inc | 1 - .../Namespaces/UseDeclarationUnitTest.7.inc | 1 - .../Namespaces/UseDeclarationUnitTest.8.inc | 8 - .../Namespaces/UseDeclarationUnitTest.9.inc | 8 - .../Namespaces/UseDeclarationUnitTest.php | 102 - .../src/Standards/PSR2/ruleset.xml | 218 - .../Arrays/ArrayBracketSpacingStandard.xml | 19 - .../Docs/Arrays/ArrayDeclarationStandard.xml | 117 - .../Docs/Classes/ClassFileNameStandard.xml | 47 - .../LowercaseClassKeywordsStandard.xml | 23 - .../Classes/SelfMemberReferenceStandard.xml | 81 - .../Docs/Classes/ValidClassNameStandard.xml | 39 - .../Docs/Commenting/BlockCommentStandard.xml | 280 - .../DocCommentAlignmentStandard.xml | 39 - .../FunctionCommentThrowTagStandard.xml | 32 - .../ForEachLoopDeclarationStandard.xml | 39 - .../ForLoopDeclarationStandard.xml | 55 - .../LowercaseDeclarationStandard.xml | 23 - .../LowercaseFunctionKeywordsStandard.xml | 25 - .../Squiz/Docs/PHP/HeredocStandard.xml | 32 - .../Docs/Scope/StaticThisUsageStandard.xml | 31 - .../Docs/Strings/EchoedStringsStandard.xml | 19 - .../Docs/WhiteSpace/CastSpacingStandard.xml | 19 - .../FunctionClosingBraceSpaceStandard.xml | 73 - .../FunctionOpeningBraceSpaceStandard.xml | 26 - .../LanguageConstructSpacingStandard.xml | 19 - .../WhiteSpace/MemberVarSpacingStandard.xml | 91 - .../ObjectOperatorSpacingStandard.xml | 19 - .../WhiteSpace/ScopeClosingBraceStandard.xml | 59 - .../ScopeKeywordSpacingStandard.xml | 23 - .../WhiteSpace/SemicolonSpacingStandard.xml | 19 - .../SuperfluousWhitespaceStandard.xml | 98 - .../Arrays/ArrayBracketSpacingSniff.php | 95 - .../Sniffs/Arrays/ArrayDeclarationSniff.php | 962 - .../ClassDefinitionClosingBraceSpaceSniff.php | 173 - .../CSS/ClassDefinitionNameSpacingSniff.php | 150 - .../ClassDefinitionOpeningBraceSpaceSniff.php | 215 - .../Squiz/Sniffs/CSS/ColonSpacingSniff.php | 146 - .../Sniffs/CSS/ColourDefinitionSniff.php | 127 - .../DisallowMultipleStyleDefinitionsSniff.php | 110 - .../CSS/DuplicateClassDefinitionSniff.php | 155 - .../CSS/DuplicateStyleDefinitionSniff.php | 127 - .../Sniffs/CSS/EmptyClassDefinitionSniff.php | 100 - .../Sniffs/CSS/EmptyStyleDefinitionSniff.php | 103 - .../Squiz/Sniffs/CSS/ForbiddenStylesSniff.php | 216 - .../Squiz/Sniffs/CSS/IndentationSniff.php | 189 - .../CSS/LowercaseStyleDefinitionSniff.php | 136 - .../Squiz/Sniffs/CSS/MissingColonSniff.php | 130 - .../Squiz/Sniffs/CSS/NamedColoursSniff.php | 132 - .../Squiz/Sniffs/CSS/OpacitySniff.php | 140 - .../Sniffs/CSS/SemicolonSpacingSniff.php | 142 - .../Squiz/Sniffs/CSS/ShorthandSizeSniff.php | 220 - .../Sniffs/Classes/ClassDeclarationSniff.php | 224 - .../Sniffs/Classes/ClassFileNameSniff.php | 75 - .../Sniffs/Classes/DuplicatePropertySniff.php | 121 - .../Classes/LowercaseClassKeywordsSniff.php | 73 - .../Classes/SelfMemberReferenceSniff.php | 248 - .../Sniffs/Classes/ValidClassNameSniff.php | 88 - .../Sniffs/Commenting/BlockCommentSniff.php | 399 - .../Sniffs/Commenting/ClassCommentSniff.php | 109 - .../ClosingDeclarationCommentSniff.php | 130 - .../Commenting/DocCommentAlignmentSniff.php | 167 - .../Commenting/EmptyCatchCommentSniff.php | 55 - .../Sniffs/Commenting/FileCommentSniff.php | 228 - .../Commenting/FunctionCommentSniff.php | 800 - .../FunctionCommentThrowTagSniff.php | 247 - .../Sniffs/Commenting/InlineCommentSniff.php | 349 - .../LongConditionClosingCommentSniff.php | 218 - .../Commenting/PostStatementCommentSniff.php | 129 - .../Commenting/VariableCommentSniff.php | 203 - .../ControlSignatureSniff.php | 337 - .../ElseIfDeclarationSniff.php | 51 - .../ForEachLoopDeclarationSniff.php | 236 - .../ForLoopDeclarationSniff.php | 316 - .../InlineIfDeclarationSniff.php | 155 - .../LowercaseDeclarationSniff.php | 75 - .../SwitchDeclarationSniff.php | 305 - .../Squiz/Sniffs/Debug/JSLintSniff.php | 125 - .../Sniffs/Debug/JavaScriptLintSniff.php | 128 - .../Squiz/Sniffs/Files/FileExtensionSniff.php | 68 - .../Formatting/OperatorBracketSniff.php | 400 - ...unctionDeclarationArgumentSpacingSniff.php | 572 - .../Functions/FunctionDeclarationSniff.php | 34 - .../FunctionDuplicateArgumentSniff.php | 64 - .../Sniffs/Functions/GlobalFunctionSniff.php | 61 - .../LowercaseFunctionKeywordsSniff.php | 69 - .../MultiLineFunctionDeclarationSniff.php | 262 - .../ValidFunctionNameSniff.php | 54 - .../ValidVariableNameSniff.php | 190 - .../DisallowObjectStringIndexSniff.php | 124 - .../Objects/ObjectInstantiationSniff.php | 85 - .../Sniffs/Objects/ObjectMemberCommaSniff.php | 103 - .../ComparisonOperatorUsageSniff.php | 235 - .../IncrementDecrementUsageSniff.php | 231 - .../Operators/ValidLogicalOperatorsSniff.php | 67 - .../Sniffs/PHP/CommentedOutCodeSniff.php | 283 - .../PHP/DisallowBooleanStatementSniff.php | 59 - .../PHP/DisallowComparisonAssignmentSniff.php | 112 - .../Sniffs/PHP/DisallowInlineIfSniff.php | 57 - .../PHP/DisallowMultipleAssignmentsSniff.php | 196 - .../PHP/DisallowSizeFunctionsInLoopsSniff.php | 116 - .../Sniffs/PHP/DiscouragedFunctionsSniff.php | 38 - .../Squiz/Sniffs/PHP/EmbeddedPhpSniff.php | 524 - .../Standards/Squiz/Sniffs/PHP/EvalSniff.php | 48 - .../Squiz/Sniffs/PHP/GlobalKeywordSniff.php | 53 - .../Squiz/Sniffs/PHP/HeredocSniff.php | 51 - .../Squiz/Sniffs/PHP/InnerFunctionsSniff.php | 76 - .../Sniffs/PHP/LowercasePHPFunctionsSniff.php | 167 - .../Sniffs/PHP/NonExecutableCodeSniff.php | 308 - .../Sniffs/Scope/MemberVarScopeSniff.php | 83 - .../Squiz/Sniffs/Scope/MethodScopeSniff.php | 83 - .../Sniffs/Scope/StaticThisUsageSniff.php | 128 - .../Strings/ConcatenationSpacingSniff.php | 164 - .../Sniffs/Strings/DoubleQuoteUsageSniff.php | 144 - .../Sniffs/Strings/EchoedStringsSniff.php | 88 - .../Sniffs/WhiteSpace/CastSpacingSniff.php | 65 - .../ControlStructureSpacingSniff.php | 359 - .../FunctionClosingBraceSpaceSniff.php | 164 - .../FunctionOpeningBraceSpaceSniff.php | 98 - .../WhiteSpace/FunctionSpacingSniff.php | 376 - .../LanguageConstructSpacingSniff.php | 128 - .../LogicalOperatorSpacingSniff.php | 102 - .../WhiteSpace/MemberVarSpacingSniff.php | 258 - .../WhiteSpace/ObjectOperatorSpacingSniff.php | 167 - .../WhiteSpace/OperatorSpacingSniff.php | 409 - .../WhiteSpace/PropertyLabelSpacingSniff.php | 118 - .../WhiteSpace/ScopeClosingBraceSniff.php | 114 - .../WhiteSpace/ScopeKeywordSpacingSniff.php | 171 - .../WhiteSpace/SemicolonSpacingSniff.php | 116 - .../WhiteSpace/SuperfluousWhitespaceSniff.php | 265 - .../Arrays/ArrayBracketSpacingUnitTest.inc | 31 - .../ArrayBracketSpacingUnitTest.inc.fixed | 31 - .../Arrays/ArrayBracketSpacingUnitTest.php | 62 - .../Arrays/ArrayDeclarationUnitTest.1.inc | 560 - .../ArrayDeclarationUnitTest.1.inc.fixed | 598 - .../Arrays/ArrayDeclarationUnitTest.2.inc | 555 - .../ArrayDeclarationUnitTest.2.inc.fixed | 591 - .../Arrays/ArrayDeclarationUnitTest.3.inc | 7 - .../Arrays/ArrayDeclarationUnitTest.4.inc | 8 - .../ArrayDeclarationUnitTest.4.inc.fixed | 8 - .../Tests/Arrays/ArrayDeclarationUnitTest.php | 262 - ...assDefinitionClosingBraceSpaceUnitTest.css | 81 - ...initionClosingBraceSpaceUnitTest.css.fixed | 85 - ...assDefinitionClosingBraceSpaceUnitTest.php | 65 - .../ClassDefinitionNameSpacingUnitTest.css | 66 - .../ClassDefinitionNameSpacingUnitTest.php | 56 - ...assDefinitionOpeningBraceSpaceUnitTest.css | 108 - ...initionOpeningBraceSpaceUnitTest.css.fixed | 106 - ...assDefinitionOpeningBraceSpaceUnitTest.php | 69 - .../Squiz/Tests/CSS/ColonSpacingUnitTest.css | 42 - .../Tests/CSS/ColonSpacingUnitTest.css.fixed | 40 - .../Squiz/Tests/CSS/ColonSpacingUnitTest.php | 65 - .../Tests/CSS/ColourDefinitionUnitTest.css | 16 - .../CSS/ColourDefinitionUnitTest.css.fixed | 16 - .../Tests/CSS/ColourDefinitionUnitTest.php | 57 - ...sallowMultipleStyleDefinitionsUnitTest.css | 17 - ...MultipleStyleDefinitionsUnitTest.css.fixed | 27 - ...sallowMultipleStyleDefinitionsUnitTest.php | 59 - .../CSS/DuplicateClassDefinitionUnitTest.css | 103 - .../CSS/DuplicateClassDefinitionUnitTest.php | 59 - .../CSS/DuplicateStyleDefinitionUnitTest.css | 27 - .../CSS/DuplicateStyleDefinitionUnitTest.php | 53 - .../CSS/EmptyClassDefinitionUnitTest.css | 15 - .../CSS/EmptyClassDefinitionUnitTest.php | 59 - .../CSS/EmptyStyleDefinitionUnitTest.css | 11 - .../CSS/EmptyStyleDefinitionUnitTest.php | 58 - .../Tests/CSS/ForbiddenStylesUnitTest.css | 18 - .../CSS/ForbiddenStylesUnitTest.css.fixed | 18 - .../Tests/CSS/ForbiddenStylesUnitTest.php | 62 - .../Squiz/Tests/CSS/IndentationUnitTest.1.css | 79 - .../Tests/CSS/IndentationUnitTest.1.css.fixed | 73 - .../Squiz/Tests/CSS/IndentationUnitTest.2.css | 3 - .../Squiz/Tests/CSS/IndentationUnitTest.php | 80 - .../CSS/LowercaseStyleDefinitionUnitTest.css | 14 - .../CSS/LowercaseStyleDefinitionUnitTest.php | 58 - .../Squiz/Tests/CSS/MissingColonUnitTest.css | 21 - .../Squiz/Tests/CSS/MissingColonUnitTest.php | 58 - .../Squiz/Tests/CSS/NamedColoursUnitTest.css | 25 - .../Squiz/Tests/CSS/NamedColoursUnitTest.php | 59 - .../Squiz/Tests/CSS/OpacityUnitTest.css | 35 - .../Squiz/Tests/CSS/OpacityUnitTest.css.fixed | 35 - .../Squiz/Tests/CSS/OpacityUnitTest.php | 65 - .../Tests/CSS/SemicolonSpacingUnitTest.css | 61 - .../CSS/SemicolonSpacingUnitTest.css.fixed | 58 - .../Tests/CSS/SemicolonSpacingUnitTest.php | 63 - .../Tests/CSS/ShorthandSizeUnitTest.1.css | 41 - .../CSS/ShorthandSizeUnitTest.1.css.fixed | 37 - .../Tests/CSS/ShorthandSizeUnitTest.2.css | 3 - .../Squiz/Tests/CSS/ShorthandSizeUnitTest.php | 72 - .../Classes/ClassDeclarationUnitTest.inc | 152 - .../ClassDeclarationUnitTest.inc.fixed | 162 - .../Classes/ClassDeclarationUnitTest.php | 93 - ...assFileName Spaces In FilenameUnitTest.inc | 7 - ...assFileName-Dashes-In-FilenameUnitTest.inc | 7 - .../ClassFileNameLiveCodingFailUnitTest.inc | 6 - .../ClassFileNameLiveCodingPassUnitTest.inc | 6 - .../ClassFileNameParseError1UnitTest.inc | 6 - .../Tests/Classes/ClassFileNameUnitTest.inc | 44 - .../Tests/Classes/ClassFileNameUnitTest.php | 146 - .../Classes/DuplicatePropertyUnitTest.js | 45 - .../Classes/DuplicatePropertyUnitTest.php | 57 - .../LowercaseClassKeywordsUnitTest.inc | 24 - .../LowercaseClassKeywordsUnitTest.inc.fixed | 24 - .../LowercaseClassKeywordsUnitTest.php | 69 - .../Classes/SelfMemberReferenceUnitTest.inc | 199 - .../SelfMemberReferenceUnitTest.inc.fixed | 187 - .../Classes/SelfMemberReferenceUnitTest.php | 71 - .../Tests/Classes/ValidClassNameUnitTest.inc | 201 - .../Tests/Classes/ValidClassNameUnitTest.php | 83 - .../Tests/Commenting/BlockCommentUnitTest.inc | 340 - .../Commenting/BlockCommentUnitTest.inc.fixed | 342 - .../Tests/Commenting/BlockCommentUnitTest.php | 109 - .../Tests/Commenting/ClassCommentUnitTest.inc | 145 - .../Tests/Commenting/ClassCommentUnitTest.php | 66 - .../ClosingDeclarationCommentUnitTest.1.inc | 124 - ...singDeclarationCommentUnitTest.1.inc.fixed | 117 - .../ClosingDeclarationCommentUnitTest.2.inc | 7 - .../ClosingDeclarationCommentUnitTest.3.inc | 7 - .../ClosingDeclarationCommentUnitTest.4.inc | 8 - ...singDeclarationCommentUnitTest.4.inc.fixed | 8 - .../ClosingDeclarationCommentUnitTest.5.inc | 11 - ...singDeclarationCommentUnitTest.5.inc.fixed | 11 - .../ClosingDeclarationCommentUnitTest.php | 96 - .../DocCommentAlignmentUnitTest.inc | 146 - .../DocCommentAlignmentUnitTest.inc.fixed | 146 - .../Commenting/DocCommentAlignmentUnitTest.js | 76 - .../DocCommentAlignmentUnitTest.js.fixed | 76 - .../DocCommentAlignmentUnitTest.php | 100 - .../Commenting/EmptyCatchCommentUnitTest.inc | 55 - .../Commenting/EmptyCatchCommentUnitTest.php | 60 - .../Commenting/FileCommentUnitTest.1.inc | 43 - .../FileCommentUnitTest.1.inc.fixed | 43 - .../Tests/Commenting/FileCommentUnitTest.1.js | 40 - .../Commenting/FileCommentUnitTest.1.js.fixed | 40 - .../Commenting/FileCommentUnitTest.10.inc | 12 - .../Commenting/FileCommentUnitTest.2.inc | 11 - .../Tests/Commenting/FileCommentUnitTest.2.js | 10 - .../Commenting/FileCommentUnitTest.3.inc | 9 - .../Commenting/FileCommentUnitTest.4.inc | 3 - .../Commenting/FileCommentUnitTest.5.inc | 4 - .../Commenting/FileCommentUnitTest.6.inc | 12 - .../Commenting/FileCommentUnitTest.7.inc | 12 - .../Commenting/FileCommentUnitTest.8.inc | 9 - .../Commenting/FileCommentUnitTest.9.inc | 12 - .../Tests/Commenting/FileCommentUnitTest.php | 82 - .../FunctionCommentThrowTagUnitTest.inc | 533 - .../FunctionCommentThrowTagUnitTest.php | 67 - .../Commenting/FunctionCommentUnitTest.inc | 1196 - .../FunctionCommentUnitTest.inc.fixed | 1196 - .../Commenting/FunctionCommentUnitTest.php | 211 - .../Commenting/InlineCommentUnitTest.inc | 199 - .../InlineCommentUnitTest.inc.fixed | 192 - .../Tests/Commenting/InlineCommentUnitTest.js | 129 - .../Commenting/InlineCommentUnitTest.js.fixed | 125 - .../Commenting/InlineCommentUnitTest.php | 97 - .../LongConditionClosingCommentUnitTest.inc | 1033 - ...gConditionClosingCommentUnitTest.inc.fixed | 1033 - .../LongConditionClosingCommentUnitTest.js | 444 - ...ngConditionClosingCommentUnitTest.js.fixed | 444 - .../LongConditionClosingCommentUnitTest.php | 107 - .../PostStatementCommentUnitTest.1.js | 36 - .../PostStatementCommentUnitTest.1.js.fixed | 39 - .../PostStatementCommentUnitTest.2.js | 2 - .../PostStatementCommentUnitTest.inc | 64 - .../PostStatementCommentUnitTest.inc.fixed | 71 - .../PostStatementCommentUnitTest.php | 80 - .../Commenting/VariableCommentUnitTest.inc | 495 - .../VariableCommentUnitTest.inc.fixed | 495 - .../Commenting/VariableCommentUnitTest.php | 88 - .../ControlSignatureUnitTest.1.inc | 320 - .../ControlSignatureUnitTest.1.inc.fixed | 324 - .../ControlSignatureUnitTest.2.inc | 5 - .../ControlSignatureUnitTest.js | 135 - .../ControlSignatureUnitTest.js.fixed | 141 - .../ControlSignatureUnitTest.php | 115 - .../ElseIfDeclarationUnitTest.inc | 14 - .../ElseIfDeclarationUnitTest.inc.fixed | 14 - .../ElseIfDeclarationUnitTest.php | 56 - .../ForEachLoopDeclarationUnitTest.inc | 36 - .../ForEachLoopDeclarationUnitTest.inc.fixed | 36 - .../ForEachLoopDeclarationUnitTest.php | 61 - .../ForLoopDeclarationUnitTest.1.inc | 126 - .../ForLoopDeclarationUnitTest.1.inc.fixed | 92 - .../ForLoopDeclarationUnitTest.1.js | 122 - .../ForLoopDeclarationUnitTest.1.js.fixed | 88 - .../ForLoopDeclarationUnitTest.2.inc | 6 - .../ForLoopDeclarationUnitTest.2.js | 2 - .../ForLoopDeclarationUnitTest.3.inc | 6 - .../ForLoopDeclarationUnitTest.php | 138 - .../InlineIfDeclarationUnitTest.inc | 48 - .../InlineIfDeclarationUnitTest.inc.fixed | 48 - .../InlineIfDeclarationUnitTest.php | 80 - .../LowercaseDeclarationUnitTest.inc | 24 - .../LowercaseDeclarationUnitTest.inc.fixed | 24 - .../LowercaseDeclarationUnitTest.php | 66 - .../SwitchDeclarationUnitTest.inc | 346 - .../SwitchDeclarationUnitTest.inc.fixed | 356 - .../SwitchDeclarationUnitTest.js | 287 - .../SwitchDeclarationUnitTest.php | 159 - .../Squiz/Tests/Debug/JSLintUnitTest.js | 2 - .../Squiz/Tests/Debug/JSLintUnitTest.php | 74 - .../Tests/Debug/JavaScriptLintUnitTest.js | 2 - .../Tests/Debug/JavaScriptLintUnitTest.php | 71 - .../Tests/Files/FileExtensionUnitTest.1.inc | 3 - .../Tests/Files/FileExtensionUnitTest.2.inc | 3 - .../Tests/Files/FileExtensionUnitTest.3.inc | 3 - .../Tests/Files/FileExtensionUnitTest.4.inc | 3 - .../Tests/Files/FileExtensionUnitTest.5.inc | 3 - .../Tests/Files/FileExtensionUnitTest.php | 60 - .../Formatting/OperatorBracketUnitTest.1.inc | 203 - .../OperatorBracketUnitTest.1.inc.fixed | 203 - .../Formatting/OperatorBracketUnitTest.2.inc | 7 - .../Formatting/OperatorBracketUnitTest.3.inc | 5 - .../Formatting/OperatorBracketUnitTest.js | 118 - .../OperatorBracketUnitTest.js.fixed | 118 - .../Formatting/OperatorBracketUnitTest.php | 121 - ...onDeclarationArgumentSpacingUnitTest.1.inc | 227 - ...arationArgumentSpacingUnitTest.1.inc.fixed | 199 - ...onDeclarationArgumentSpacingUnitTest.2.inc | 6 - ...onDeclarationArgumentSpacingUnitTest.3.inc | 6 - ...onDeclarationArgumentSpacingUnitTest.4.inc | 6 - ...onDeclarationArgumentSpacingUnitTest.5.inc | 6 - ...onDeclarationArgumentSpacingUnitTest.6.inc | 6 - ...tionDeclarationArgumentSpacingUnitTest.php | 128 - .../FunctionDeclarationUnitTest.1.inc | 75 - .../FunctionDeclarationUnitTest.2.inc | 5 - .../FunctionDeclarationUnitTest.3.inc | 5 - .../Functions/FunctionDeclarationUnitTest.php | 64 - .../FunctionDuplicateArgumentUnitTest.inc | 6 - .../FunctionDuplicateArgumentUnitTest.php | 57 - .../Functions/GlobalFunctionUnitTest.inc | 17 - .../Functions/GlobalFunctionUnitTest.php | 53 - .../LowercaseFunctionKeywordsUnitTest.inc | 28 - ...owercaseFunctionKeywordsUnitTest.inc.fixed | 28 - .../LowercaseFunctionKeywordsUnitTest.php | 63 - .../MultiLineFunctionDeclarationUnitTest.inc | 356 - ...iLineFunctionDeclarationUnitTest.inc.fixed | 370 - .../MultiLineFunctionDeclarationUnitTest.js | 73 - ...tiLineFunctionDeclarationUnitTest.js.fixed | 81 - .../MultiLineFunctionDeclarationUnitTest.php | 120 - .../ValidFunctionNameUnitTest.inc | 27 - .../ValidFunctionNameUnitTest.php | 64 - .../ValidVariableNameUnitTest.inc | 171 - .../ValidVariableNameUnitTest.php | 96 - .../DisallowObjectStringIndexUnitTest.js | 37 - .../DisallowObjectStringIndexUnitTest.php | 64 - .../Objects/ObjectInstantiationUnitTest.inc | 49 - .../Objects/ObjectInstantiationUnitTest.php | 58 - .../Objects/ObjectMemberCommaUnitTest.js | 47 - .../ObjectMemberCommaUnitTest.js.fixed | 47 - .../Objects/ObjectMemberCommaUnitTest.php | 58 - .../ComparisonOperatorUsageUnitTest.inc | 144 - .../ComparisonOperatorUsageUnitTest.js | 71 - .../ComparisonOperatorUsageUnitTest.php | 105 - .../IncrementDecrementUsageUnitTest.inc | 56 - .../IncrementDecrementUsageUnitTest.php | 73 - .../ValidLogicalOperatorsUnitTest.inc | 28 - .../ValidLogicalOperatorsUnitTest.php | 57 - .../Tests/PHP/CommentedOutCodeUnitTest.css | 23 - .../Tests/PHP/CommentedOutCodeUnitTest.inc | 158 - .../Tests/PHP/CommentedOutCodeUnitTest.php | 80 - .../PHP/DisallowBooleanStatementUnitTest.inc | 27 - .../PHP/DisallowBooleanStatementUnitTest.php | 58 - .../DisallowComparisonAssignmentUnitTest.inc | 83 - .../DisallowComparisonAssignmentUnitTest.php | 64 - .../Tests/PHP/DisallowInlineIfUnitTest.inc | 18 - .../Tests/PHP/DisallowInlineIfUnitTest.js | 2 - .../Tests/PHP/DisallowInlineIfUnitTest.php | 67 - .../DisallowMultipleAssignmentsUnitTest.1.inc | 150 - .../DisallowMultipleAssignmentsUnitTest.2.inc | 7 - .../DisallowMultipleAssignmentsUnitTest.php | 71 - .../DisallowSizeFunctionsInLoopsUnitTest.inc | 58 - .../DisallowSizeFunctionsInLoopsUnitTest.js | 13 - .../DisallowSizeFunctionsInLoopsUnitTest.php | 77 - .../PHP/DiscouragedFunctionsUnitTest.inc | 7 - .../PHP/DiscouragedFunctionsUnitTest.php | 57 - .../Squiz/Tests/PHP/EmbeddedPhpUnitTest.1.inc | 296 - .../Tests/PHP/EmbeddedPhpUnitTest.1.inc.fixed | 314 - .../Tests/PHP/EmbeddedPhpUnitTest.10.inc | 16 - .../Tests/PHP/EmbeddedPhpUnitTest.11.inc | 14 - .../Tests/PHP/EmbeddedPhpUnitTest.12.inc | 12 - .../PHP/EmbeddedPhpUnitTest.12.inc.fixed | 10 - .../Tests/PHP/EmbeddedPhpUnitTest.13.inc | 12 - .../PHP/EmbeddedPhpUnitTest.13.inc.fixed | 10 - .../Tests/PHP/EmbeddedPhpUnitTest.14.inc | 8 - .../Tests/PHP/EmbeddedPhpUnitTest.15.inc | 9 - .../Tests/PHP/EmbeddedPhpUnitTest.16.inc | 8 - .../Tests/PHP/EmbeddedPhpUnitTest.17.inc | 8 - .../Tests/PHP/EmbeddedPhpUnitTest.18.inc | 15 - .../PHP/EmbeddedPhpUnitTest.18.inc.fixed | 13 - .../Tests/PHP/EmbeddedPhpUnitTest.19.inc | 17 - .../PHP/EmbeddedPhpUnitTest.19.inc.fixed | 15 - .../Squiz/Tests/PHP/EmbeddedPhpUnitTest.2.inc | 7 - .../Tests/PHP/EmbeddedPhpUnitTest.2.inc.fixed | 7 - .../Tests/PHP/EmbeddedPhpUnitTest.20.inc | 15 - .../PHP/EmbeddedPhpUnitTest.20.inc.fixed | 16 - .../Tests/PHP/EmbeddedPhpUnitTest.21.inc | 15 - .../PHP/EmbeddedPhpUnitTest.21.inc.fixed | 16 - .../Tests/PHP/EmbeddedPhpUnitTest.22.inc | 30 - .../PHP/EmbeddedPhpUnitTest.22.inc.fixed | 31 - .../Tests/PHP/EmbeddedPhpUnitTest.23.inc | 23 - .../Tests/PHP/EmbeddedPhpUnitTest.24.inc | 25 - .../PHP/EmbeddedPhpUnitTest.24.inc.fixed | 25 - .../Tests/PHP/EmbeddedPhpUnitTest.25.inc | 21 - .../PHP/EmbeddedPhpUnitTest.25.inc.fixed | 25 - .../Squiz/Tests/PHP/EmbeddedPhpUnitTest.3.inc | 123 - .../Tests/PHP/EmbeddedPhpUnitTest.3.inc.fixed | 132 - .../Squiz/Tests/PHP/EmbeddedPhpUnitTest.4.inc | 7 - .../Tests/PHP/EmbeddedPhpUnitTest.4.inc.fixed | 7 - .../Squiz/Tests/PHP/EmbeddedPhpUnitTest.5.inc | 48 - .../Tests/PHP/EmbeddedPhpUnitTest.5.inc.fixed | 39 - .../Squiz/Tests/PHP/EmbeddedPhpUnitTest.6.inc | 8 - .../Squiz/Tests/PHP/EmbeddedPhpUnitTest.7.inc | 8 - .../Squiz/Tests/PHP/EmbeddedPhpUnitTest.8.inc | 10 - .../Squiz/Tests/PHP/EmbeddedPhpUnitTest.9.inc | 10 - .../Squiz/Tests/PHP/EmbeddedPhpUnitTest.php | 241 - .../Squiz/Tests/PHP/EvalUnitTest.inc | 5 - .../Squiz/Tests/PHP/EvalUnitTest.php | 56 - .../Squiz/Tests/PHP/GlobalKeywordUnitTest.inc | 13 - .../Squiz/Tests/PHP/GlobalKeywordUnitTest.php | 56 - .../Squiz/Tests/PHP/HeredocUnitTest.1.inc | 12 - .../Squiz/Tests/PHP/HeredocUnitTest.2.inc | 17 - .../Squiz/Tests/PHP/HeredocUnitTest.php | 64 - .../Tests/PHP/InnerFunctionsUnitTest.inc | 87 - .../Tests/PHP/InnerFunctionsUnitTest.php | 58 - .../PHP/LowercasePHPFunctionsUnitTest.inc | 50 - .../LowercasePHPFunctionsUnitTest.inc.fixed | 50 - .../PHP/LowercasePHPFunctionsUnitTest.php | 60 - .../Tests/PHP/NonExecutableCodeUnitTest.1.inc | 434 - .../Tests/PHP/NonExecutableCodeUnitTest.2.inc | 73 - .../Tests/PHP/NonExecutableCodeUnitTest.3.inc | 64 - .../Tests/PHP/NonExecutableCodeUnitTest.4.inc | 6 - .../Tests/PHP/NonExecutableCodeUnitTest.php | 126 - .../Tests/Scope/MemberVarScopeUnitTest.inc | 91 - .../Tests/Scope/MemberVarScopeUnitTest.php | 68 - .../Squiz/Tests/Scope/MethodScopeUnitTest.inc | 57 - .../Squiz/Tests/Scope/MethodScopeUnitTest.php | 58 - .../Tests/Scope/StaticThisUsageUnitTest.inc | 127 - .../Tests/Scope/StaticThisUsageUnitTest.php | 67 - .../Strings/ConcatenationSpacingUnitTest.inc | 49 - .../ConcatenationSpacingUnitTest.inc.fixed | 47 - .../Strings/ConcatenationSpacingUnitTest.php | 71 - .../Strings/DoubleQuoteUsageUnitTest.inc | 37 - .../DoubleQuoteUsageUnitTest.inc.fixed | 37 - .../Strings/DoubleQuoteUsageUnitTest.php | 67 - .../Tests/Strings/EchoedStringsUnitTest.inc | 13 - .../Strings/EchoedStringsUnitTest.inc.fixed | 13 - .../Tests/Strings/EchoedStringsUnitTest.php | 60 - .../Tests/WhiteSpace/CastSpacingUnitTest.inc | 9 - .../WhiteSpace/CastSpacingUnitTest.inc.fixed | 9 - .../Tests/WhiteSpace/CastSpacingUnitTest.php | 59 - .../ControlStructureSpacingUnitTest.inc | 269 - .../ControlStructureSpacingUnitTest.inc.fixed | 261 - .../ControlStructureSpacingUnitTest.js | 93 - .../ControlStructureSpacingUnitTest.js.fixed | 93 - .../ControlStructureSpacingUnitTest.php | 107 - .../FunctionClosingBraceSpaceUnitTest.inc | 90 - ...unctionClosingBraceSpaceUnitTest.inc.fixed | 94 - .../FunctionClosingBraceSpaceUnitTest.js | 132 - ...FunctionClosingBraceSpaceUnitTest.js.fixed | 133 - .../FunctionClosingBraceSpaceUnitTest.php | 84 - .../FunctionOpeningBraceSpaceUnitTest.inc | 54 - ...unctionOpeningBraceSpaceUnitTest.inc.fixed | 49 - .../FunctionOpeningBraceSpaceUnitTest.js | 115 - ...FunctionOpeningBraceSpaceUnitTest.js.fixed | 109 - .../FunctionOpeningBraceSpaceUnitTest.php | 73 - .../WhiteSpace/FunctionSpacingUnitTest.1.inc | 752 - .../FunctionSpacingUnitTest.1.inc.fixed | 850 - .../WhiteSpace/FunctionSpacingUnitTest.2.inc | 5 - .../FunctionSpacingUnitTest.2.inc.fixed | 7 - .../WhiteSpace/FunctionSpacingUnitTest.3.inc | 10 - .../FunctionSpacingUnitTest.3.inc.fixed | 7 - .../WhiteSpace/FunctionSpacingUnitTest.4.inc | 7 - .../WhiteSpace/FunctionSpacingUnitTest.5.inc | 8 - .../FunctionSpacingUnitTest.5.inc.fixed | 10 - .../WhiteSpace/FunctionSpacingUnitTest.6.inc | 13 - .../FunctionSpacingUnitTest.6.inc.fixed | 10 - .../WhiteSpace/FunctionSpacingUnitTest.7.inc | 10 - .../WhiteSpace/FunctionSpacingUnitTest.php | 150 - .../LanguageConstructSpacingUnitTest.inc | 43 - ...LanguageConstructSpacingUnitTest.inc.fixed | 41 - .../LanguageConstructSpacingUnitTest.php | 65 - .../LogicalOperatorSpacingUnitTest.inc | 19 - .../LogicalOperatorSpacingUnitTest.inc.fixed | 19 - .../LogicalOperatorSpacingUnitTest.js | 19 - .../LogicalOperatorSpacingUnitTest.js.fixed | 19 - .../LogicalOperatorSpacingUnitTest.php | 59 - .../WhiteSpace/MemberVarSpacingUnitTest.1.inc | 474 - .../MemberVarSpacingUnitTest.1.inc.fixed | 463 - .../WhiteSpace/MemberVarSpacingUnitTest.2.inc | 10 - .../WhiteSpace/MemberVarSpacingUnitTest.3.inc | 14 - .../WhiteSpace/MemberVarSpacingUnitTest.php | 120 - .../ObjectOperatorSpacingUnitTest.inc | 52 - .../ObjectOperatorSpacingUnitTest.inc.fixed | 48 - .../ObjectOperatorSpacingUnitTest.php | 73 - .../WhiteSpace/OperatorSpacingUnitTest.1.inc | 510 - .../OperatorSpacingUnitTest.1.inc.fixed | 502 - .../WhiteSpace/OperatorSpacingUnitTest.2.inc | 3 - .../WhiteSpace/OperatorSpacingUnitTest.3.inc | 6 - .../WhiteSpace/OperatorSpacingUnitTest.js | 104 - .../OperatorSpacingUnitTest.js.fixed | 98 - .../WhiteSpace/OperatorSpacingUnitTest.php | 180 - .../PropertyLabelSpacingUnitTest.js | 40 - .../PropertyLabelSpacingUnitTest.js.fixed | 39 - .../PropertyLabelSpacingUnitTest.php | 60 - .../WhiteSpace/ScopeClosingBraceUnitTest.inc | 134 - .../ScopeClosingBraceUnitTest.inc.fixed | 138 - .../WhiteSpace/ScopeClosingBraceUnitTest.php | 64 - .../ScopeKeywordSpacingUnitTest.1.inc | 209 - .../ScopeKeywordSpacingUnitTest.1.inc.fixed | 202 - .../ScopeKeywordSpacingUnitTest.2.inc | 6 - .../ScopeKeywordSpacingUnitTest.3.inc | 6 - .../ScopeKeywordSpacingUnitTest.3.inc.fixed | 6 - .../ScopeKeywordSpacingUnitTest.4.inc | 11 - .../ScopeKeywordSpacingUnitTest.php | 104 - .../WhiteSpace/SemicolonSpacingUnitTest.inc | 42 - .../SemicolonSpacingUnitTest.inc.fixed | 41 - .../WhiteSpace/SemicolonSpacingUnitTest.js | 25 - .../SemicolonSpacingUnitTest.js.fixed | 25 - .../WhiteSpace/SemicolonSpacingUnitTest.php | 87 - .../SuperfluousWhitespaceUnitTest.1.css | 32 - .../SuperfluousWhitespaceUnitTest.1.css.fixed | 30 - .../SuperfluousWhitespaceUnitTest.1.inc | 74 - .../SuperfluousWhitespaceUnitTest.1.inc.fixed | 68 - .../SuperfluousWhitespaceUnitTest.1.js | 56 - .../SuperfluousWhitespaceUnitTest.1.js.fixed | 50 - .../SuperfluousWhitespaceUnitTest.2.css | 3 - .../SuperfluousWhitespaceUnitTest.2.css.fixed | 3 - .../SuperfluousWhitespaceUnitTest.2.inc | 9 - .../SuperfluousWhitespaceUnitTest.2.inc.fixed | 7 - .../SuperfluousWhitespaceUnitTest.2.js | 1 - .../SuperfluousWhitespaceUnitTest.2.js.fixed | 1 - .../SuperfluousWhitespaceUnitTest.3.css | 3 - .../SuperfluousWhitespaceUnitTest.3.css.fixed | 3 - .../SuperfluousWhitespaceUnitTest.3.inc | 14 - .../SuperfluousWhitespaceUnitTest.3.inc.fixed | 5 - .../SuperfluousWhitespaceUnitTest.3.js | 1 - .../SuperfluousWhitespaceUnitTest.3.js.fixed | 1 - .../SuperfluousWhitespaceUnitTest.4.inc | 4 - .../SuperfluousWhitespaceUnitTest.4.inc.fixed | 4 - .../SuperfluousWhitespaceUnitTest.5.inc | 5 - .../SuperfluousWhitespaceUnitTest.5.inc.fixed | 4 - .../SuperfluousWhitespaceUnitTest.php | 117 - .../src/Standards/Squiz/ruleset.xml | 138 - .../Zend/Docs/Debug/CodeAnalyzerStandard.xml | 25 - .../Zend/Docs/Files/ClosingTagStandard.xml | 22 - .../ValidVariableNameStandard.xml | 37 - .../Zend/Sniffs/Debug/CodeAnalyzerSniff.php | 137 - .../Zend/Sniffs/Files/ClosingTagSniff.php | 79 - .../ValidVariableNameSniff.php | 196 - .../Zend/Tests/Debug/CodeAnalyzerUnitTest.inc | 6 - .../Zend/Tests/Debug/CodeAnalyzerUnitTest.php | 71 - .../Zend/Tests/Files/ClosingTagUnitTest.1.inc | 12 - .../Files/ClosingTagUnitTest.1.inc.fixed | 12 - .../Zend/Tests/Files/ClosingTagUnitTest.2.inc | 3 - .../Zend/Tests/Files/ClosingTagUnitTest.3.inc | 1 - .../Files/ClosingTagUnitTest.3.inc.fixed | 1 - .../Zend/Tests/Files/ClosingTagUnitTest.4.inc | 1 - .../Files/ClosingTagUnitTest.4.inc.fixed | 1 - .../Zend/Tests/Files/ClosingTagUnitTest.5.inc | 1 - .../Files/ClosingTagUnitTest.5.inc.fixed | 1 - .../Zend/Tests/Files/ClosingTagUnitTest.6.inc | 3 - .../Files/ClosingTagUnitTest.6.inc.fixed | 3 - .../Zend/Tests/Files/ClosingTagUnitTest.7.inc | 1 - .../Files/ClosingTagUnitTest.7.inc.fixed | 1 - .../Zend/Tests/Files/ClosingTagUnitTest.php | 70 - .../ValidVariableNameUnitTest.inc | 145 - .../ValidVariableNameUnitTest.php | 106 - .../src/Standards/Zend/ruleset.xml | 32 - .../php_codesniffer/src/Tokenizers/CSS.php | 541 - .../src/Tokenizers/Comment.php | 280 - .../php_codesniffer/src/Tokenizers/JS.php | 1256 - .../php_codesniffer/src/Tokenizers/PHP.php | 4222 -- .../src/Tokenizers/Tokenizer.php | 1738 - .../php_codesniffer/src/Util/Cache.php | 355 - .../php_codesniffer/src/Util/Common.php | 605 - .../php_codesniffer/src/Util/Help.php | 626 - .../src/Util/MessageCollector.php | 310 - .../php_codesniffer/src/Util/Standards.php | 340 - .../php_codesniffer/src/Util/Timing.php | 133 - .../php_codesniffer/src/Util/Tokens.php | 835 - .../php_codesniffer/tests/AllTests.php | 58 - .../php_codesniffer/tests/ConfigDouble.php | 213 - .../tests/Core/AbstractMethodUnitTest.php | 274 - .../php_codesniffer/tests/Core/AllTests.php | 63 - .../Autoloader/DetermineLoadedClassTest.php | 126 - .../tests/Core/Autoloader/TestFiles/A.inc | 3 - .../tests/Core/Autoloader/TestFiles/B.inc | 4 - .../tests/Core/Autoloader/TestFiles/C.inc | 4 - .../tests/Core/Autoloader/TestFiles/Sub/C.inc | 5 - .../Config/AbstractRealConfigTestCase.php | 92 - .../tests/Core/Config/ExtensionsArgTest.php | 128 - .../tests/Core/Config/GeneratorArgTest.php | 163 - .../tests/Core/Config/ReportArgsTest.php | 64 - .../tests/Core/Config/ReportWidthTest.php | 260 - .../Core/Config/SniffsExcludeArgsTest.php | 327 - .../tests/Core/ErrorSuppressionTest.php | 1277 - .../Files/File/FindEndOfStatementTest.inc | 105 - .../Files/File/FindEndOfStatementTest.php | 457 - .../Files/File/FindExtendedClassNameTest.inc | 58 - .../Files/File/FindExtendedClassNameTest.php | 153 - .../FindImplementedInterfaceNamesTest.inc | 47 - .../FindImplementedInterfaceNamesTest.php | 162 - .../Files/File/FindStartOfStatementTest.inc | 212 - .../Files/File/FindStartOfStatementTest.php | 989 - .../Files/File/GetClassPropertiesTest.inc | 58 - .../Files/File/GetClassPropertiesTest.php | 192 - .../Core/Files/File/GetConditionTest.inc | 91 - .../Core/Files/File/GetConditionTest.php | 494 - .../Files/File/GetDeclarationNameJSTest.js | 23 - .../Files/File/GetDeclarationNameJSTest.php | 158 - .../GetDeclarationNameParseError1Test.inc | 5 - .../GetDeclarationNameParseError1Test.php | 37 - .../GetDeclarationNameParseError2Test.inc | 6 - .../GetDeclarationNameParseError2Test.php | 37 - .../Files/File/GetDeclarationNameTest.inc | 98 - .../Files/File/GetDeclarationNameTest.php | 221 - .../Files/File/GetMemberPropertiesTest.inc | 427 - .../Files/File/GetMemberPropertiesTest.php | 1899 - .../GetMethodParametersParseError1Test.inc | 4 - .../GetMethodParametersParseError1Test.php | 38 - .../GetMethodParametersParseError2Test.inc | 4 - .../GetMethodParametersParseError2Test.php | 38 - .../Files/File/GetMethodParametersTest.inc | 352 - .../Files/File/GetMethodParametersTest.php | 3347 -- .../Files/File/GetMethodPropertiesTest.inc | 226 - .../Files/File/GetMethodPropertiesTest.php | 1562 - .../Core/Files/File/GetTokensAsStringTest.inc | 25 - .../Core/Files/File/GetTokensAsStringTest.php | 334 - .../tests/Core/Files/File/IsReferenceTest.inc | 216 - .../tests/Core/Files/File/IsReferenceTest.php | 396 - .../FileList/AbstractFileListTestCase.php | 55 - .../tests/Core/Files/FileList/AddFileTest.php | 142 - .../Core/Files/FileList/ConstructTest.php | 122 - .../Core/Files/FileList/FilterDouble.php | 31 - .../Core/Files/FileList/Fixtures/file1.php | 3 - .../Core/Files/FileList/Fixtures/file2.php | 3 - .../Core/Filters/AbstractFilterTestCase.php | 250 - .../tests/Core/Filters/Filter/AcceptTest.php | 110 - .../tests/Core/Filters/Filter/AcceptTest.xml | 18 - .../tests/Core/Filters/GitModifiedTest.php | 273 - .../tests/Core/Filters/GitStagedTest.php | 273 - .../Fixer/FixFileReturnValueAllGoodTest.xml | 8 - .../Fixer/FixFileReturnValueConflictTest.xml | 8 - .../FixFileReturnValueNotEnoughLoopsTest.xml | 8 - .../Core/Fixer/FixFileReturnValueTest.php | 89 - .../GenerateDiffTest-BlankLinesAtEnd.diff | 10 - .../GenerateDiffTest-BlankLinesAtEnd.inc | 11 - .../GenerateDiffTest-BlankLinesAtStart.diff | 9 - .../GenerateDiffTest-BlankLinesAtStart.inc | 10 - .../Fixtures/GenerateDiffTest-LineAdded.diff | 8 - .../Fixtures/GenerateDiffTest-LineAdded.inc | 6 - .../GenerateDiffTest-LineRemoved.diff | 8 - .../Fixtures/GenerateDiffTest-LineRemoved.inc | 8 - .../Fixtures/GenerateDiffTest-NoDiff.diff | 0 .../Fixtures/GenerateDiffTest-NoDiff.inc | 7 - ...GenerateDiffTest-NoTrailingWhitespace.diff | 9 - .../GenerateDiffTest-NoTrailingWhitespace.inc | 7 - .../GenerateDiffTest-TabsToSpaces.diff | 9 - .../GenerateDiffTest-TabsToSpaces.inc | 7 - .../GenerateDiffTest-VarNameChanged.diff | 12 - .../GenerateDiffTest-VarNameChanged.inc | 7 - .../GenerateDiffTest-WhiteSpaceAtEnd.diff | 8 - .../GenerateDiffTest-WhiteSpaceAtEnd.inc | 7 - .../GenerateDiffTest-WhiteSpaceAtStart.diff | 8 - .../GenerateDiffTest-WhiteSpaceAtStart.inc | 7 - .../GenerateDiffTest-WindowsLineEndings.inc | 7 - .../Core/Fixer/Fixtures/GenerateDiffTest.inc | 7 - .../FixFileReturnValue/AllGoodSniff.php | 37 - .../FixFileReturnValue/ConflictSniff.php | 101 - .../NotEnoughLoopsSniff.php | 40 - .../Fixer/Fixtures/TestStandard/ruleset.xml | 4 - .../tests/Core/Fixer/Fixtures/test.inc | 2 - .../tests/Core/Fixer/GenerateDiffTest.php | 227 - .../Core/Generators/AllValidDocsTest.xml | 10 - .../tests/Core/Generators/AnchorLinksTest.xml | 10 - ...xpectedOutputCodeComparisonBlankLines.html | 105 - .../ExpectedOutputCodeComparisonBlankLines.md | 35 - ...ExpectedOutputCodeComparisonBlankLines.txt | 18 - ...pectedOutputCodeComparisonBlockLength.html | 115 - ...ExpectedOutputCodeComparisonBlockLength.md | 47 - ...xpectedOutputCodeComparisonBlockLength.txt | 23 - .../ExpectedOutputCodeComparisonEncoding.html | 105 - .../ExpectedOutputCodeComparisonEncoding.md | 48 - .../ExpectedOutputCodeComparisonEncoding.txt | 26 - ...xpectedOutputCodeComparisonLineLength.html | 106 - .../ExpectedOutputCodeComparisonLineLength.md | 31 - ...ExpectedOutputCodeComparisonLineLength.txt | 18 - .../ExpectedOutputCodeTitleLineWrapping.html | 135 - .../ExpectedOutputCodeTitleLineWrapping.md | 79 - .../ExpectedOutputCodeTitleLineWrapping.txt | 33 - .../ExpectedOutputCodeTitleWhitespace.html | 115 - .../ExpectedOutputCodeTitleWhitespace.md | 44 - .../ExpectedOutputCodeTitleWhitespace.txt | 20 - .../ExpectedOutputDocumentationTitleCase.html | 95 - .../ExpectedOutputDocumentationTitleCase.md | 7 - .../ExpectedOutputDocumentationTitleCase.txt | 7 - ...xpectedOutputDocumentationTitleLength.html | 95 - .../ExpectedOutputDocumentationTitleLength.md | 7 - ...ExpectedOutputDocumentationTitleLength.txt | 7 - ...dOutputDocumentationTitlePCREFallback.html | 96 - ...tedOutputDocumentationTitlePCREFallback.md | 9 - ...edOutputDocumentationTitlePCREFallback.txt | 9 - ...dOutputDocumentationTitleToAnchorSlug.html | 107 - .../Expectations/ExpectedOutputEmpty.txt | 0 ...validCodeComparisonMismatchedCodeElms.html | 105 - ...InvalidCodeComparisonMismatchedCodeElms.md | 25 - ...nvalidCodeComparisonMismatchedCodeElms.txt | 13 - ...utInvalidCodeComparisonMissingCodeElm.html | 95 - ...tputInvalidCodeComparisonMissingCodeElm.md | 7 - ...putInvalidCodeComparisonMissingCodeElm.txt | 7 - ...ctedOutputInvalidCodeComparisonNoCode.html | 101 - ...pectedOutputInvalidCodeComparisonNoCode.md | 13 - ...ectedOutputInvalidCodeComparisonNoCode.txt | 10 - ...dOutputInvalidCodeComparisonNoContent.html | 95 - ...tedOutputInvalidCodeComparisonNoContent.md | 7 - ...edOutputInvalidCodeComparisonNoContent.txt | 7 - ...tInvalidCodeComparisonOneEmptyCodeElm.html | 105 - ...putInvalidCodeComparisonOneEmptyCodeElm.md | 25 - ...utInvalidCodeComparisonOneEmptyCodeElm.txt | 13 - ...InvalidCodeComparisonTwoEmptyCodeElms.html | 95 - ...utInvalidCodeComparisonTwoEmptyCodeElms.md | 7 - ...tInvalidCodeComparisonTwoEmptyCodeElms.txt | 7 - .../ExpectedOutputInvalidCodeTitleEmpty.html | 101 - .../ExpectedOutputInvalidCodeTitleEmpty.md | 21 - .../ExpectedOutputInvalidCodeTitleEmpty.txt | 11 - ...ExpectedOutputInvalidCodeTitleMissing.html | 101 - .../ExpectedOutputInvalidCodeTitleMissing.md | 21 - .../ExpectedOutputInvalidCodeTitleMissing.txt | 11 - ...dOutputInvalidDocumentationTitleEmpty.html | 105 - ...tedOutputInvalidDocumentationTitleEmpty.md | 25 - ...edOutputInvalidDocumentationTitleEmpty.txt | 13 - ...utputInvalidDocumentationTitleMissing.html | 105 - ...dOutputInvalidDocumentationTitleMissing.md | 25 - ...OutputInvalidDocumentationTitleMissing.txt | 13 - ...xpectedOutputInvalidStandardNoContent.html | 104 - .../ExpectedOutputInvalidStandardNoContent.md | 24 - ...ExpectedOutputInvalidStandardNoContent.txt | 11 - .../Expectations/ExpectedOutputOneDoc.html | 95 - .../Expectations/ExpectedOutputOneDoc.md | 7 - .../Expectations/ExpectedOutputOneDoc.txt | 7 - .../ExpectedOutputStandardBlankLines.html | 97 - .../ExpectedOutputStandardBlankLines.md | 11 - .../ExpectedOutputStandardBlankLines.txt | 11 - .../ExpectedOutputStandardEncoding.html | 96 - .../ExpectedOutputStandardEncoding.md | 8 - .../ExpectedOutputStandardEncoding.txt | 9 - .../ExpectedOutputStandardIndent.html | 98 - .../ExpectedOutputStandardIndent.md | 10 - .../ExpectedOutputStandardIndent.txt | 10 - .../ExpectedOutputStandardLineWrapping.html | 97 - .../ExpectedOutputStandardLineWrapping.md | 9 - .../ExpectedOutputStandardLineWrapping.txt | 11 - .../ExpectedOutputStructureDocs.html | 200 - .../ExpectedOutputStructureDocs.md | 177 - .../ExpectedOutputStructureDocs.txt | 106 - ...edOutputUnsupportedOneElmAtWrongLevel.html | 95 - ...ctedOutputUnsupportedOneElmAtWrongLevel.md | 7 - ...tedOutputUnsupportedOneElmAtWrongLevel.txt | 7 - ...tputUnsupportedSuperfluousCodeElement.html | 105 - ...OutputUnsupportedSuperfluousCodeElement.md | 25 - ...utputUnsupportedSuperfluousCodeElement.txt | 13 - .../Core/Generators/Fixtures/HTMLDouble.php | 70 - .../Generators/Fixtures/MarkdownDouble.php | 68 - .../Generators/Fixtures/MockGenerator.php | 28 - .../CodeComparisonBlankLinesStandard.xml | 33 - .../CodeComparisonBlockLengthStandard.xml | 35 - .../CodeComparisonEncodingStandard.xml | 42 - .../CodeComparisonLineLengthStandard.xml | 25 - .../Content/CodeTitleLineWrappingStandard.xml | 55 - .../Content/CodeTitleWhitespaceStandard.xml | 32 - .../DocumentationTitleCaseStandard.xml | 7 - .../DocumentationTitleLengthStandard.xml | 7 - ...DocumentationTitlePCREFallbackStandard.xml | 9 - ...ocumentationTitleToAnchorSlug1Standard.xml | 7 - ...ocumentationTitleToAnchorSlug2Standard.xml | 8 - ...ocumentationTitleToAnchorSlug3Standard.xml | 8 - .../Content/StandardBlankLinesStandard.xml | 13 - .../Docs/Content/StandardEncodingStandard.xml | 8 - .../Docs/Content/StandardIndentStandard.xml | 10 - .../Content/StandardLineWrappingStandard.xml | 9 - ...deComparisonMismatchedCodeElmsStandard.xml | 18 - .../CodeComparisonMissingCodeElmStandard.xml | 14 - .../Invalid/CodeComparisonNoCodeStandard.xml | 11 - .../CodeComparisonNoContentStandard.xml | 8 - .../CodeComparisonOneEmptyCodeElmStandard.xml | 15 - ...CodeComparisonTwoEmptyCodeElmsStandard.xml | 12 - .../Docs/Invalid/CodeTitleEmptyStandard.xml | 19 - .../Docs/Invalid/CodeTitleMissingStandard.xml | 19 - .../DocumentationTitleEmptyStandard.xml | 19 - .../DocumentationTitleMissingStandard.xml | 19 - .../Invalid/StandardNoContentStandard.xml | 15 - .../Docs/Structure/NoContentStandard.xml | 2 - .../NoDocumentationElementStandard.xml | 2 - .../OneCodeComparisonNoStandardStandard.xml | 14 - ...OneStandardBlockCodeComparisonStandard.xml | 19 - .../OneStandardBlockNoCodeStandard.xml | 7 - ...tandardBlockTwoCodeComparisonsStandard.xml | 31 - .../TwoStandardBlocksNoCodeStandard.xml | 12 - ...tandardBlocksOneCodeComparisonStandard.xml | 24 - ...dardBlocksThreeCodeComparisonsStandard.xml | 48 - .../ElementAtWrongLevelStandard.xml | 8 - .../OneElmAtWrongLevelStandard.xml | 13 - .../SuperfluousCodeElementStandard.xml | 24 - .../Unsupported/UnknownElementStandard.xml | 7 - .../Content/CodeComparisonBlankLinesSniff.php | 12 - .../CodeComparisonBlockLengthSniff.php | 12 - .../Content/CodeComparisonEncodingSniff.php | 12 - .../Content/CodeComparisonLineLengthSniff.php | 12 - .../Content/CodeTitleLineWrappingSniff.php | 12 - .../Content/CodeTitleWhitespaceSniff.php | 12 - .../Content/DocumentationTitleCaseSniff.php | 12 - .../Content/DocumentationTitleLengthSniff.php | 12 - .../DocumentationTitlePCREFallbackSniff.php | 12 - .../DocumentationTitleToAnchorSlug1Sniff.php | 12 - .../DocumentationTitleToAnchorSlug2Sniff.php | 12 - .../DocumentationTitleToAnchorSlug3Sniff.php | 12 - .../Content/StandardBlankLinesSniff.php | 12 - .../Sniffs/Content/StandardEncodingSniff.php | 12 - .../Sniffs/Content/StandardIndentSniff.php | 12 - .../Content/StandardLineWrappingSniff.php | 12 - .../StandardWithDocs/Sniffs/DummySniff.php | 25 - .../CodeComparisonMismatchedCodeElmsSniff.php | 12 - .../CodeComparisonMissingCodeElmSniff.php | 12 - .../Invalid/CodeComparisonNoCodeSniff.php | 12 - .../Invalid/CodeComparisonNoContentSniff.php | 12 - .../CodeComparisonOneEmptyCodeElmSniff.php | 12 - .../CodeComparisonTwoEmptyCodeElmsSniff.php | 12 - .../Sniffs/Invalid/CodeTitleEmptySniff.php | 12 - .../Sniffs/Invalid/CodeTitleMissingSniff.php | 12 - .../Invalid/DocumentationTitleEmptySniff.php | 12 - .../DocumentationTitleMissingSniff.php | 12 - .../Sniffs/Invalid/StandardNoContentSniff.php | 12 - .../Structure/DocumentationMissingSniff.php | 12 - .../Sniffs/Structure/NoContentSniff.php | 12 - .../Structure/NoDocumentationElementSniff.php | 12 - .../OneCodeComparisonNoStandardSniff.php | 12 - .../OneStandardBlockCodeComparisonSniff.php | 12 - .../Structure/OneStandardBlockNoCodeSniff.php | 12 - ...neStandardBlockTwoCodeComparisonsSniff.php | 12 - .../TwoStandardBlocksNoCodeSniff.php | 12 - ...woStandardBlocksOneCodeComparisonSniff.php | 12 - ...tandardBlocksThreeCodeComparisonsSniff.php | 12 - .../Unsupported/ElementAtWrongLevelSniff.php | 12 - .../Unsupported/OneElmAtWrongLevelSniff.php | 12 - .../SuperfluousCodeElementSniff.php | 12 - .../Unsupported/UnknownElementSniff.php | 12 - .../Fixtures/StandardWithDocs/ruleset.xml | 4 - .../tests/Core/Generators/GeneratorTest.php | 227 - .../tests/Core/Generators/HTMLTest.php | 426 - .../tests/Core/Generators/MarkdownTest.php | 397 - .../tests/Core/Generators/NoDocsTest.xml | 8 - .../tests/Core/Generators/NoValidDocsTest.xml | 8 - .../tests/Core/Generators/OneDocTest.xml | 8 - .../Core/Generators/StructureDocsTest.xml | 10 - .../tests/Core/Generators/TextTest.php | 245 - .../Core/Ruleset/AbstractRulesetTestCase.php | 115 - .../Core/Ruleset/ConstructorNoSniffsTest.xml | 6 - .../tests/Core/Ruleset/ConstructorTest.php | 293 - .../Ruleset/DisplayCachedMessagesTest.php | 312 - ...xpandRulesetReferenceCaseMismatch1Test.xml | 9 - ...xpandRulesetReferenceCaseMismatch2Test.xml | 9 - ...ExpandRulesetReferenceHomePathFailTest.xml | 8 - .../ExpandRulesetReferenceHomePathTest.php | 121 - .../ExpandRulesetReferenceHomePathTest.xml | 7 - ...pandRulesetReferenceInternalIgnoreTest.xml | 15 - ...ndRulesetReferenceInternalStandardTest.xml | 8 - .../ExpandRulesetReferenceInternalTest.php | 71 - ...dRulesetReferenceInvalidErrorCode1Test.xml | 7 - ...dRulesetReferenceInvalidErrorCode2Test.xml | 7 - ...dRulesetReferenceInvalidErrorCode3Test.xml | 7 - ...RulesetReferenceInvalidHomePathRefTest.xml | 8 - .../ExpandRulesetReferenceMissingFileTest.xml | 7 - .../Ruleset/ExpandRulesetReferenceTest.php | 134 - .../Ruleset/ExpandRulesetReferenceTest.xml | 13 - ...andRulesetReferenceUnknownCategoryTest.xml | 10 - ...ExpandRulesetReferenceUnknownSniffTest.xml | 10 - ...andRulesetReferenceUnknownStandardTest.xml | 10 - .../Core/Ruleset/ExpandSniffDirectoryTest.php | 67 - .../Core/Ruleset/ExpandSniffDirectoryTest.xml | 8 - .../Core/Ruleset/ExplainCustomRulesetTest.xml | 10 - .../Core/Ruleset/ExplainSingleSniffTest.xml | 6 - .../tests/Core/Ruleset/ExplainTest.php | 212 - .../Sniffs/Category/Sniff.php | 24 - .../Category/SubDir/TooDeeplyNestedSniff.php | 24 - .../Sniffs/MissingCategoryDirSniff.php | 24 - .../Sniffs/NoNamespaceSniff.php | 22 - .../Sniffs/PartialNamespaceSniff.php | 24 - .../Sniffs/CategoryCalledSniffsSniff.php | 24 - .../Sniffs/CheckSomething/ValidSniff.php | 25 - .../Ruleset/Fixtures/ExternalA/ruleset.xml | 4 - .../ExternalB/Sniffs/CheckMore/ValidSniff.php | 25 - .../Ruleset/Fixtures/ExternalB/ruleset.xml | 4 - .../MyStandard/Sniffs/Category/ValidSniff.php | 25 - .../FakeHomePath/src/MyStandard/ruleset.xml | 4 - .../Internal/Sniffs/Valid/ValidSniff.php | 25 - .../Ruleset/Fixtures/Internal/ruleset.xml | 11 - .../Fixtures/InvalidNoSniffsDir/Sniffs | 0 .../Fixtures/InvalidNoSniffsDir/ruleset.xml | 4 - .../ProcessRulesetAutoloadLoadAlways.1.php | 8 - .../ProcessRulesetAutoloadLoadAlways.2.php | 8 - .../ProcessRulesetAutoloadLoadAlways.3.php | 8 - .../ProcessRulesetAutoloadLoadAlways.4.php | 8 - .../ProcessRulesetAutoloadLoadPhpcbfOnly.php | 8 - .../ProcessRulesetAutoloadLoadPhpcsOnly.php | 8 - .../Fixtures/PropertyTypeHandlingInline.inc | 31 - .../Deprecated/WithLongReplacementSniff.php | 41 - ...eplacementContainingLinuxNewlinesSniff.php | 45 - ...WithReplacementContainingNewlinesSniff.php | 45 - .../Deprecated/WithReplacementSniff.php | 41 - .../Deprecated/WithoutReplacementSniff.php | 41 - .../EmptyDeprecationVersionSniff.php | 41 - .../EmptyRemovalVersionSniff.php | 41 - .../InvalidDeprecationMessageSniff.php | 42 - .../InvalidDeprecationVersionSniff.php | 41 - .../InvalidRemovalVersionSniff.php | 41 - .../NoImplementsNoProcessSniff.php | 17 - .../NoImplementsNoRegisterOrProcessSniff.php | 12 - .../NoImplementsNoRegisterSniff.php | 19 - .../InvalidSniffs/RegisterNoArraySniff.php | 25 - ...InvalidImplementsWithoutImplementSniff.php | 24 - .../MissingInterface/ValidImplementsSniff.php | 25 - .../ValidImplementsViaAbstractSniff.php | 24 - .../SetProperty/AllowedAsDeclaredSniff.php | 28 - .../AllowedViaMagicMethodSniff.php | 40 - .../SetProperty/AllowedViaStdClassSniff.php | 26 - .../NotAllowedViaAttributeSniff.php | 27 - .../SetProperty/PropertyTypeHandlingSniff.php | 190 - .../ImplementsDeprecatedInterfaceSniff.php | 46 - .../ListensForCSSAndJSSniff.php | 30 - .../ListensForCSSAndUnrecognizedSniff.php | 30 - .../ListensForCSSSniff.php | 27 - .../ListensForEmptySniff.php | 27 - .../SupportedTokenizers/ListensForJSSniff.php | 27 - .../ListensForPHPAndCSSAndJSSniff.php | 34 - .../ListensForUnrecognizedTokenizersSniff.php | 30 - .../ValidSniffs/RegisterEmptyArraySniff.php | 25 - .../Ruleset/Fixtures/TestStandard/ruleset.xml | 4 - .../Core/Ruleset/GetIgnorePatternsTest.php | 111 - .../Core/Ruleset/GetIgnorePatternsTest.xml | 19 - .../Core/Ruleset/GetIncludePatternsTest.php | 108 - .../Core/Ruleset/GetIncludePatternsTest.xml | 15 - ...ateTokenListenersNamingConventionsTest.php | 82 - ...ateTokenListenersNamingConventionsTest.xml | 24 - ...ulateTokenListenersRegisterNoArrayTest.xml | 10 - ...eTokenListenersSupportedTokenizersTest.php | 111 - ...eTokenListenersSupportedTokenizersTest.xml | 8 - .../Ruleset/PopulateTokenListenersTest.php | 553 - .../Ruleset/PopulateTokenListenersTest.xml | 45 - .../Ruleset/ProcessRuleInvalidTypeTest.php | 43 - .../Ruleset/ProcessRuleInvalidTypeTest.xml | 9 - .../ProcessRuleShouldProcessElementTest.php | 666 - .../ProcessRuleShouldProcessElementTest.xml | 105 - ...ssRulesetAutoExpandSniffsDirectoryTest.xml | 13 - ...ProcessRulesetAutoloadFileNotFoundTest.xml | 8 - .../Ruleset/ProcessRulesetAutoloadTest.php | 164 - .../Ruleset/ProcessRulesetAutoloadTest.xml | 37 - ...ocessRulesetBrokenRulesetEmptyFileTest.xml | 0 ...cessRulesetBrokenRulesetMultiErrorTest.xml | 10 - ...essRulesetBrokenRulesetSingleErrorTest.xml | 2 - .../ProcessRulesetBrokenRulesetTest.php | 96 - .../ProcessRulesetExcludeSniffGroupTest.xml | 11 - .../ProcessRulesetInvalidNoSniffsDirTest.xml | 10 - .../Core/Ruleset/ProcessRulesetMiscTest.xml | 25 - ...ProcessRulesetShouldProcessElementTest.php | 391 - ...ProcessRulesetShouldProcessElementTest.xml | 54 - .../tests/Core/Ruleset/ProcessRulesetTest.php | 266 - .../PropertyTypeHandlingInlineTest.xml | 6 - .../Core/Ruleset/PropertyTypeHandlingTest.php | 335 - .../Core/Ruleset/PropertyTypeHandlingTest.xml | 79 - ...isterSniffsMissingInterfaceInvalidTest.xml | 8 - .../RegisterSniffsMissingInterfaceTest.php | 65 - ...egisterSniffsMissingInterfaceValidTest.xml | 9 - ...sInvalidSniffNoImplementsNoProcessTest.xml | 8 - ...iffNoImplementsNoRegisterOrProcessTest.xml | 8 - ...InvalidSniffNoImplementsNoRegisterTest.xml | 8 - .../RegisterSniffsRejectsInvalidSniffTest.php | 80 - .../tests/Core/Ruleset/RegisterSniffsTest.php | 293 - .../RuleInclusionAbsoluteLinuxTest.php | 119 - .../RuleInclusionAbsoluteLinuxTest.xml | 11 - .../RuleInclusionAbsoluteWindowsTest.php | 116 - .../RuleInclusionAbsoluteWindowsTest.xml | 11 - .../Ruleset/RuleInclusionTest-include.xml | 10 - .../tests/Core/Ruleset/RuleInclusionTest.php | 479 - .../tests/Core/Ruleset/RuleInclusionTest.xml | 58 - .../SetPropertyAllowedAsDeclaredTest.xml | 16 - .../SetPropertyAllowedViaMagicMethodTest.xml | 16 - .../SetPropertyAllowedViaStdClassTest.xml | 16 - ...PropertyToMultipleSniffsInCategoryTest.xml | 9 - ...nInvalidPropertyWhenSetForCategoryTest.xml | 9 - ...nInvalidPropertyWhenSetForStandardTest.xml | 10 - .../SetPropertyNotAllowedViaAttributeTest.xml | 10 - ...opertyThrowsErrorOnInvalidPropertyTest.xml | 9 - .../Core/Ruleset/SetSniffPropertyTest.php | 421 - ...eprecationsEmptyDeprecationVersionTest.xml | 8 - ...iffDeprecationsEmptyRemovalVersionTest.xml | 8 - ...recationsInvalidDeprecationMessageTest.xml | 8 - ...recationsInvalidDeprecationVersionTest.xml | 8 - ...fDeprecationsInvalidRemovalVersionTest.xml | 8 - .../ShowSniffDeprecationsOrderTest.xml | 10 - .../ShowSniffDeprecationsReportWidthTest.xml | 8 - .../Ruleset/ShowSniffDeprecationsTest.php | 540 - .../Ruleset/ShowSniffDeprecationsTest.xml | 14 - .../Core/Runner/AbstractRunnerTestCase.php | 19 - .../Core/Runner/PrintProgressDotsTest.php | 222 - .../tests/Core/Runner/PrintProgressTest.php | 235 - .../tests/Core/Runner/RunPHPCSExplainTest.php | 73 - .../Core/Runner/RunPHPCSGeneratorTest.php | 72 - .../Core/Sniffs/AbstractArraySniffTest.inc | 51 - .../Core/Sniffs/AbstractArraySniffTest.php | 297 - .../Sniffs/AbstractArraySniffTestable.php | 65 - .../Core/Standards/StandardRulesetsQATest.php | 82 - .../Tokenizers/AbstractTokenizerTestCase.php | 147 - .../Tokenizers/Comment/CommentTestCase.php | 117 - .../Tokenizers/Comment/LiveCoding1Test.inc | 6 - .../Tokenizers/Comment/LiveCoding1Test.php | 69 - .../Tokenizers/Comment/LiveCoding2Test.inc | 5 - .../Tokenizers/Comment/LiveCoding2Test.php | 68 - .../Tokenizers/Comment/LiveCoding3Test.inc | 4 - .../Tokenizers/Comment/LiveCoding3Test.php | 62 - .../Tokenizers/Comment/LiveCoding4Test.inc | 7 - .../Tokenizers/Comment/LiveCoding4Test.php | 76 - .../Comment/MultiLineDocBlockTest.inc | 81 - .../Comment/MultiLineDocBlockTest.php | 439 - .../PhpcsAnnotationsInDocBlockTest.inc | 116 - .../PhpcsAnnotationsInDocBlockTest.php | 637 - .../Comment/SingleLineDocBlockTest.inc | 26 - .../Comment/SingleLineDocBlockTest.php | 217 - .../PHP/AnonClassParenthesisOwnerTest.inc | 29 - .../PHP/AnonClassParenthesisOwnerTest.php | 158 - .../Core/Tokenizers/PHP/ArrayKeywordTest.inc | 58 - .../Core/Tokenizers/PHP/ArrayKeywordTest.php | 200 - .../PHP/AttributesParseError1Test.inc | 8 - .../PHP/AttributesParseError1Test.php | 66 - .../PHP/AttributesParseError2Test.inc | 8 - .../PHP/AttributesParseError2Test.php | 67 - .../PHP/AttributesParseError3Test.inc | 10 - .../PHP/AttributesParseError3Test.php | 76 - .../PHP/AttributesParseError4Test.inc | 8 - .../PHP/AttributesParseError4Test.php | 84 - .../Core/Tokenizers/PHP/AttributesTest.inc | 86 - .../Core/Tokenizers/PHP/AttributesTest.php | 702 - .../PHP/BackfillAsymmetricVisibilityTest.inc | 60 - .../PHP/BackfillAsymmetricVisibilityTest.php | 331 - .../Core/Tokenizers/PHP/BackfillEnumTest.inc | 91 - .../Core/Tokenizers/PHP/BackfillEnumTest.php | 226 - .../PHP/BackfillExplicitOctalNotationTest.inc | 31 - .../PHP/BackfillExplicitOctalNotationTest.php | 120 - .../PHP/BackfillFnTokenParseErrorTest.inc | 5 - .../PHP/BackfillFnTokenParseErrorTest.php | 44 - .../Tokenizers/PHP/BackfillFnTokenTest.inc | 228 - .../Tokenizers/PHP/BackfillFnTokenTest.php | 967 - .../Tokenizers/PHP/BackfillMatchTokenTest.inc | 319 - .../Tokenizers/PHP/BackfillMatchTokenTest.php | 555 - .../PHP/BackfillNumericSeparatorTest.inc | 94 - .../PHP/BackfillNumericSeparatorTest.php | 402 - .../Tokenizers/PHP/BackfillReadonlyTest.inc | 156 - .../Tokenizers/PHP/BackfillReadonlyTest.php | 271 - .../Core/Tokenizers/PHP/BitwiseOrTest.inc | 213 - .../Core/Tokenizers/PHP/BitwiseOrTest.php | 170 - .../PHP/ContextSensitiveKeywordsTest.inc | 253 - .../PHP/ContextSensitiveKeywordsTest.php | 576 - .../PHP/DNFTypesParseError1Test.inc | 17 - .../PHP/DNFTypesParseError1Test.php | 69 - .../PHP/DNFTypesParseError2Test.inc | 48 - .../PHP/DNFTypesParseError2Test.php | 218 - .../Core/Tokenizers/PHP/DNFTypesTest.inc | 288 - .../Core/Tokenizers/PHP/DNFTypesTest.php | 557 - .../Tokenizers/PHP/DefaultKeywordTest.inc | 203 - .../Tokenizers/PHP/DefaultKeywordTest.php | 255 - .../Core/Tokenizers/PHP/DoubleArrowTest.inc | 281 - .../Core/Tokenizers/PHP/DoubleArrowTest.php | 237 - .../Tokenizers/PHP/DoubleQuotedStringTest.inc | 52 - .../Tokenizers/PHP/DoubleQuotedStringTest.php | 144 - .../Core/Tokenizers/PHP/EnumCaseTest.inc | 97 - .../Core/Tokenizers/PHP/EnumCaseTest.php | 151 - .../Core/Tokenizers/PHP/ExitKeywordTest.inc | 106 - .../Core/Tokenizers/PHP/ExitKeywordTest.php | 228 - .../tests/Core/Tokenizers/PHP/FinallyTest.inc | 40 - .../tests/Core/Tokenizers/PHP/FinallyTest.php | 98 - .../Core/Tokenizers/PHP/GotoLabelTest.inc | 85 - .../Core/Tokenizers/PHP/GotoLabelTest.php | 194 - .../Core/Tokenizers/PHP/HeredocNowdocTest.inc | 39 - .../Core/Tokenizers/PHP/HeredocNowdocTest.php | 213 - .../Tokenizers/PHP/HeredocParseErrorTest.inc | 11 - .../Tokenizers/PHP/HeredocParseErrorTest.php | 41 - .../Core/Tokenizers/PHP/HeredocStringTest.inc | 193 - .../Core/Tokenizers/PHP/HeredocStringTest.php | 161 - .../PHP/NamedFunctionCallArgumentsTest.inc | 419 - .../PHP/NamedFunctionCallArgumentsTest.php | 992 - .../NullableVsInlineThenParseErrorTest.inc | 9 - .../NullableVsInlineThenParseErrorTest.php | 40 - .../PHP/NullableVsInlineThenTest.inc | 79 - .../PHP/NullableVsInlineThenTest.php | 124 - .../PHP/NullsafeObjectOperatorTest.inc | 29 - .../PHP/NullsafeObjectOperatorTest.php | 144 - .../PHP/OtherContextSensitiveKeywordsTest.inc | 261 - .../PHP/OtherContextSensitiveKeywordsTest.php | 745 - .../Tokenizers/PHP/PHPOpenTagEOF1Test.inc | 4 - .../Tokenizers/PHP/PHPOpenTagEOF1Test.php | 54 - .../Tokenizers/PHP/PHPOpenTagEOF2Test.inc | 4 - .../Tokenizers/PHP/PHPOpenTagEOF2Test.php | 54 - .../Tokenizers/PHP/PHPOpenTagEOF3Test.inc | 4 - .../Tokenizers/PHP/PHPOpenTagEOF3Test.php | 54 - .../Tokenizers/PHP/ResolveSimpleTokenTest.inc | 51 - .../Tokenizers/PHP/ResolveSimpleTokenTest.php | 433 - .../Core/Tokenizers/PHP/ShortArrayTest.inc | 128 - .../Core/Tokenizers/PHP/ShortArrayTest.php | 146 - .../PHP/StableCommentWhitespaceTest.inc | 139 - .../PHP/StableCommentWhitespaceTest.php | 1064 - .../PHP/StableCommentWhitespaceWinTest.inc | 63 - .../PHP/StableCommentWhitespaceWinTest.php | 375 - .../Tokenizers/PHP/TypeIntersectionTest.inc | 185 - .../Tokenizers/PHP/TypeIntersectionTest.php | 165 - .../Tokenizers/PHP/TypedConstantsTest.inc | 156 - .../Tokenizers/PHP/TypedConstantsTest.php | 668 - .../PHP/UndoNamespacedNameSingleTokenTest.inc | 200 - .../PHP/UndoNamespacedNameSingleTokenTest.php | 1827 - .../tests/Core/Tokenizers/PHP/YieldTest.inc | 77 - .../tests/Core/Tokenizers/PHP/YieldTest.php | 448 - ...reateParenthesisNestingMapDNFTypesTest.inc | 185 - ...reateParenthesisNestingMapDNFTypesTest.php | 374 - ...eatePositionMapHeredocNowdocCloserTest.inc | 43 - ...eatePositionMapHeredocNowdocCloserTest.php | 117 - ...eatePositionMapHeredocNowdocOpenerTest.inc | 31 - ...eatePositionMapHeredocNowdocOpenerTest.php | 122 - .../CreatePositionMapTabWidth0Test.php | 107 - .../CreatePositionMapYieldFromTest.inc | 15 - .../CreatePositionMapYieldFromTest.php | 100 - .../CreateTokenMapArrayParenthesesTest.inc | 58 - .../CreateTokenMapArrayParenthesesTest.php | 212 - ...curseScopeMapCaseKeywordConditionsTest.inc | 134 - ...curseScopeMapCaseKeywordConditionsTest.php | 272 - ...seScopeMapDefaultKeywordConditionsTest.inc | 231 - ...seScopeMapDefaultKeywordConditionsTest.php | 487 - ...RecurseScopeMapIfKeywordConditionsTest.inc | 13 - ...RecurseScopeMapIfKeywordConditionsTest.php | 76 - .../RecurseScopeMapSwitchTokenScopeTest.inc | 60 - .../RecurseScopeMapSwitchTokenScopeTest.php | 160 - ...curseScopeMapWithNamespaceOperatorTest.inc | 19 - ...curseScopeMapWithNamespaceOperatorTest.php | 98 - .../Tokenizer/ReplaceTabsInTokenMiscTest.php | 124 - .../ReplaceTabsInTokenTabWidth1Test.php | 111 - .../ReplaceTabsInTokenTabWidth2Test.php | 111 - .../ReplaceTabsInTokenTabWidth4Test.php | 111 - .../ReplaceTabsInTokenTabWidth5Test.php | 111 - .../Tokenizer/ReplaceTabsInTokenTest.inc | 46 - .../Tokenizer/ReplaceTabsInTokenTestCase.php | 274 - .../Core/Util/Common/EscapeshellcmdTest.php | 91 - .../Core/Util/Common/GetSniffCodeTest.php | 212 - .../Core/Util/Common/IsCamelCapsTest.php | 512 - .../Core/Util/Common/PrepareForOutputTest.php | 113 - .../Core/Util/Common/StripColorsTest.php | 96 - .../Core/Util/Common/SuggestTypeTest.php | 224 - .../tests/Core/Util/Help/HelpTest.php | 792 - .../MessageCollector/MessageCollectorTest.php | 538 - .../Timing/GetHumanReadableDurationTest.php | 114 - .../tests/Core/Util/Timing/TimingTest.php | 121 - .../Tokens/GetHighestWeightedTokenTest.php | 162 - .../tests/Core/Util/Tokens/TokenNameTest.php | 197 - .../Fixtures/ClassOneWithoutStyleError.inc | 18 - .../Fixtures/ClassTwoWithoutStyleError.inc | 20 - .../EndToEnd/Fixtures/ClassWithStyleError.inc | 22 - .../tests/EndToEnd/Fixtures/endtoend.xml.dist | 13 - .../tests/EndToEnd/outofmemory_test.sh | 25 - .../tests/EndToEnd/phpcbf_test.sh | 38 - .../tests/EndToEnd/phpcs_test.sh | 28 - .../php_codesniffer/tests/FileList.php | 98 - .../tests/Standards/AbstractSniffUnitTest.php | 468 - .../tests/Standards/AllSniffs.php | 114 - .../php_codesniffer/tests/TestSuite.php | 35 - .../php_codesniffer/tests/TestSuite7.php | 35 - .../php_codesniffer/tests/bootstrap.php | 99 - .../deprecation-contracts/CHANGELOG.md | 5 - .../symfony/deprecation-contracts/README.md | 26 - .../deprecation-contracts/composer.json | 35 - vendor/symfony/polyfill-php80/README.md | 25 - vendor/symfony/polyfill-php80/composer.json | 37 - vendor/theseer/tokenizer/CHANGELOG.md | 87 - vendor/theseer/tokenizer/LICENSE | 30 - vendor/theseer/tokenizer/README.md | 47 - vendor/theseer/tokenizer/composer.json | 27 - vendor/theseer/tokenizer/composer.lock | 22 - vendor/theseer/tokenizer/src/Exception.php | 5 - vendor/theseer/tokenizer/src/NamespaceUri.php | 25 - .../tokenizer/src/NamespaceUriException.php | 5 - vendor/theseer/tokenizer/src/Token.php | 35 - .../theseer/tokenizer/src/TokenCollection.php | 82 - .../src/TokenCollectionException.php | 5 - vendor/theseer/tokenizer/src/Tokenizer.php | 149 - .../theseer/tokenizer/src/XMLSerializer.php | 74 - vendor/wp-coding-standards/wpcs/CHANGELOG.md | 1777 - vendor/wp-coding-standards/wpcs/LICENSE | 21 - vendor/wp-coding-standards/wpcs/README.md | 261 - .../wpcs/WordPress-Core/ruleset.xml | 944 - .../wpcs/WordPress-Docs/ruleset.xml | 109 - .../wpcs/WordPress-Extra/ruleset.xml | 211 - ...stractArrayAssignmentRestrictionsSniff.php | 261 - .../AbstractClassRestrictionsSniff.php | 268 - .../AbstractFunctionParameterSniff.php | 169 - .../AbstractFunctionRestrictionsSniff.php | 358 - .../Docs/Arrays/ArrayIndentationStandard.xml | 116 - .../ArrayKeySpacingRestrictionsStandard.xml | 31 - .../MultipleStatementAlignmentStandard.xml | 50 - .../EscapedNotTranslatedStandard.xml | 24 - .../WordPress/Docs/DB/PreparedSQLStandard.xml | 51 - .../DateTime/CurrentTimeTimestampStandard.xml | 35 - .../DateTime/RestrictedFunctionsStandard.xml | 54 - .../PrefixAllGlobalsStandard.xml | 119 - .../ValidFunctionNameStandard.xml | 51 - .../ValidHookNameStandard.xml | 35 - .../ValidPostTypeSlugStandard.xml | 121 - .../ValidVariableNameStandard.xml | 43 - .../Docs/PHP/DontExtractStandard.xml | 35 - .../WordPress/Docs/PHP/IniSetStandard.xml | 40 - .../Docs/PHP/StrictInArrayStandard.xml | 53 - .../Docs/PHP/YodaConditionsStandard.xml | 27 - .../Docs/Security/SafeRedirectStandard.xml | 23 - .../Docs/WP/CapabilitiesStandard.xml | 69 - .../Docs/WP/CapitalPDangitStandard.xml | 43 - .../Docs/WP/ClassNameCaseStandard.xml | 23 - .../Docs/WP/CronIntervalStandard.xml | 45 - .../Docs/WP/DeprecatedClassesStandard.xml | 23 - .../Docs/WP/DeprecatedFunctionsStandard.xml | 23 - .../WP/DeprecatedParameterValuesStandard.xml | 23 - .../Docs/WP/DeprecatedParametersStandard.xml | 40 - .../WP/EnqueuedResourceParametersStandard.xml | 92 - .../Docs/WP/EnqueuedResourcesStandard.xml | 57 - .../Docs/WP/GetMetaSingleStandard.xml | 39 - .../Docs/WP/PostsPerPageStandard.xml | 73 - .../CastStructureSpacingStandard.xml | 27 - .../ControlStructureSpacingStandard.xml | 150 - .../ObjectOperatorSpacingStandard.xml | 23 - .../WhiteSpace/OperatorSpacingStandard.xml | 61 - .../Helpers/ArrayWalkingFunctionsHelper.php | 108 - .../WordPress/Helpers/ConstantsHelper.php | 135 - .../wpcs/WordPress/Helpers/ContextHelper.php | 394 - .../WordPress/Helpers/DeprecationHelper.php | 84 - .../Helpers/EscapingFunctionsTrait.php | 255 - .../Helpers/FormattingFunctionsHelper.php | 60 - .../WordPress/Helpers/IsUnitTestTrait.php | 238 - .../wpcs/WordPress/Helpers/ListHelper.php | 101 - .../Helpers/MinimumWPVersionTrait.php | 159 - .../Helpers/PrintingFunctionsTrait.php | 122 - .../Helpers/RulesetPropertyHelper.php | 73 - .../Helpers/SanitizationHelperTrait.php | 419 - .../WordPress/Helpers/SnakeCaseHelper.php | 60 - .../Helpers/UnslashingFunctionsHelper.php | 59 - .../WordPress/Helpers/ValidationHelper.php | 349 - .../wpcs/WordPress/Helpers/VariableHelper.php | 262 - .../wpcs/WordPress/Helpers/WPDBTrait.php | 115 - .../Helpers/WPGlobalVariablesHelper.php | 312 - .../wpcs/WordPress/Helpers/WPHookHelper.php | 113 - .../wpcs/WordPress/Sniff.php | 72 - .../Arrays/ArrayDeclarationSpacingSniff.php | 252 - .../Sniffs/Arrays/ArrayIndentationSniff.php | 550 - .../ArrayKeySpacingRestrictionsSniff.php | 174 - .../MultipleStatementAlignmentSniff.php | 583 - .../AssignmentInTernaryConditionSniff.php | 173 - .../EscapedNotTranslatedSniff.php | 89 - .../Sniffs/DB/DirectDatabaseQuerySniff.php | 324 - .../DB/PreparedSQLPlaceholdersSniff.php | 766 - .../WordPress/Sniffs/DB/PreparedSQLSniff.php | 243 - .../Sniffs/DB/RestrictedClassesSniff.php | 57 - .../Sniffs/DB/RestrictedFunctionsSniff.php | 63 - .../WordPress/Sniffs/DB/SlowDBQuerySniff.php | 58 - .../DateTime/CurrentTimeTimestampSniff.php | 168 - .../DateTime/RestrictedFunctionsSniff.php | 59 - .../WordPress/Sniffs/Files/FileNameSniff.php | 312 - .../PrefixAllGlobalsSniff.php | 1312 - .../ValidFunctionNameSniff.php | 188 - .../NamingConventions/ValidHookNameSniff.php | 277 - .../ValidPostTypeSlugSniff.php | 230 - .../ValidVariableNameSniff.php | 289 - .../Sniffs/PHP/DevelopmentFunctionsSniff.php | 63 - .../PHP/DiscouragedPHPFunctionsSniff.php | 100 - .../WordPress/Sniffs/PHP/DontExtractSniff.php | 52 - .../wpcs/WordPress/Sniffs/PHP/IniSetSniff.php | 190 - .../Sniffs/PHP/NoSilencedErrorsSniff.php | 245 - .../Sniffs/PHP/POSIXFunctionsSniff.php | 103 - .../Sniffs/PHP/PregQuoteDelimiterSniff.php | 70 - .../PHP/RestrictedPHPFunctionsSniff.php | 45 - .../Sniffs/PHP/StrictInArraySniff.php | 122 - .../WordPress/Sniffs/PHP/TypeCastsSniff.php | 90 - .../Sniffs/PHP/YodaConditionsSniff.php | 123 - .../Sniffs/Security/EscapeOutputSniff.php | 920 - .../Security/NonceVerificationSniff.php | 426 - .../Sniffs/Security/PluginMenuSlugSniff.php | 126 - .../Sniffs/Security/SafeRedirectSniff.php | 45 - .../Security/ValidatedSanitizedInputSniff.php | 244 - .../Sniffs/Utils/I18nTextDomainFixerSniff.php | 862 - .../Sniffs/WP/AlternativeFunctionsSniff.php | 371 - .../WordPress/Sniffs/WP/CapabilitiesSniff.php | 479 - .../Sniffs/WP/CapitalPDangitSniff.php | 315 - .../Sniffs/WP/ClassNameCaseSniff.php | 975 - .../WordPress/Sniffs/WP/CronIntervalSniff.php | 321 - .../Sniffs/WP/DeprecatedClassesSniff.php | 152 - .../Sniffs/WP/DeprecatedFunctionsSniff.php | 1776 - .../WP/DeprecatedParameterValuesSniff.php | 307 - .../Sniffs/WP/DeprecatedParametersSniff.php | 531 - .../Sniffs/WP/DiscouragedConstantsSniff.php | 160 - .../Sniffs/WP/DiscouragedFunctionsSniff.php | 54 - .../WP/EnqueuedResourceParametersSniff.php | 268 - .../Sniffs/WP/EnqueuedResourcesSniff.php | 106 - .../Sniffs/WP/GetMetaSingleSniff.php | 161 - .../WP/GlobalVariablesOverrideSniff.php | 436 - .../wpcs/WordPress/Sniffs/WP/I18nSniff.php | 977 - .../WordPress/Sniffs/WP/PostsPerPageSniff.php | 102 - .../WhiteSpace/CastStructureSpacingSniff.php | 59 - .../ControlStructureSpacingSniff.php | 486 - .../WhiteSpace/ObjectOperatorSpacingSniff.php | 63 - .../WhiteSpace/OperatorSpacingSniff.php | 60 - .../wpcs/WordPress/ruleset.xml | 22 - vendor/wp-coding-standards/wpcs/_typos.toml | 26 - vendor/wp-coding-standards/wpcs/composer.json | 91 - .../wpcs/phpcs.xml.dist.sample | 153 - 4445 files changed, 890 insertions(+), 529499 deletions(-) delete mode 100644 README.md create mode 100644 changelog.txt delete mode 100644 composer.json delete mode 100644 composer.lock delete mode 100644 languages/robotstxt-documentation-markdown.pot create mode 100644 readme.txt create mode 100644 update.json delete mode 100644 vendor/bin/php-parse delete mode 100644 vendor/bin/php-parse.bat delete mode 100644 vendor/bin/phpcbf delete mode 100644 vendor/bin/phpcbf.bat delete mode 100644 vendor/bin/phpcs delete mode 100644 vendor/bin/phpcs.bat delete mode 100644 vendor/bin/phpstan delete mode 100644 vendor/bin/phpstan.bat delete mode 100644 vendor/bin/phpstan.phar delete mode 100644 vendor/bin/phpstan.phar.bat delete mode 100644 vendor/bin/phpunit delete mode 100644 vendor/bin/wp-since delete mode 100644 vendor/bin/wp-since.bat delete mode 100644 vendor/dealerdirect/phpcodesniffer-composer-installer/CHANGELOG.md delete mode 100644 vendor/dealerdirect/phpcodesniffer-composer-installer/LICENSE.md delete mode 100644 vendor/dealerdirect/phpcodesniffer-composer-installer/README.md delete mode 100644 vendor/dealerdirect/phpcodesniffer-composer-installer/composer.json delete mode 100644 vendor/dealerdirect/phpcodesniffer-composer-installer/src/Plugin.php delete mode 100644 vendor/dflydev/dot-access-data/CHANGELOG.md delete mode 100644 vendor/dflydev/dot-access-data/README.md delete mode 100644 vendor/dflydev/dot-access-data/composer.json delete mode 100644 vendor/eduardovillao/wp-since/.editorconfig delete mode 100644 vendor/eduardovillao/wp-since/.github/CODEOWNERS delete mode 100644 vendor/eduardovillao/wp-since/.github/workflows/ci.yml delete mode 100644 vendor/eduardovillao/wp-since/.github/workflows/generate-since.yml delete mode 100644 vendor/eduardovillao/wp-since/.gitignore delete mode 100644 vendor/eduardovillao/wp-since/README.md delete mode 100644 vendor/eduardovillao/wp-since/bin/wp-since delete mode 100644 vendor/eduardovillao/wp-since/check-plugin.php delete mode 100644 vendor/eduardovillao/wp-since/composer.json delete mode 100644 vendor/eduardovillao/wp-since/composer.lock delete mode 100644 vendor/eduardovillao/wp-since/generate-since-json.php delete mode 100644 vendor/eduardovillao/wp-since/phpcs.xml delete mode 100644 vendor/eduardovillao/wp-since/src/Checker/CompatibilityChecker.php delete mode 100644 vendor/eduardovillao/wp-since/src/Resolver/IgnoreRulesResolver.php delete mode 100644 vendor/eduardovillao/wp-since/src/Resolver/InlineIgnoreResolver.php delete mode 100644 vendor/eduardovillao/wp-since/src/Resolver/VersionResolver.php delete mode 100644 vendor/eduardovillao/wp-since/src/Runner/PluginCheckCommand.php delete mode 100644 vendor/eduardovillao/wp-since/src/Scanner/PluginScanner.php delete mode 100644 vendor/eduardovillao/wp-since/src/Scanner/SymbolExtractorVisitor.php delete mode 100644 vendor/eduardovillao/wp-since/src/Scanner/SymbolHandlers/FunctionCallHandler.php delete mode 100644 vendor/eduardovillao/wp-since/src/Scanner/SymbolHandlers/MethodCallHandler.php delete mode 100644 vendor/eduardovillao/wp-since/src/Scanner/SymbolHandlers/NewClassHandler.php delete mode 100644 vendor/eduardovillao/wp-since/src/Scanner/SymbolHandlers/StaticCallHandler.php delete mode 100644 vendor/eduardovillao/wp-since/src/Scanner/SymbolHandlers/SymbolHandlerInterface.php delete mode 100644 vendor/eduardovillao/wp-since/src/Utils/TablePrinter.php delete mode 100644 vendor/eduardovillao/wp-since/src/Utils/VersionHelper.php delete mode 100644 vendor/eduardovillao/wp-since/tests/CompatibilityCheckerTest.php delete mode 100644 vendor/eduardovillao/wp-since/tests/Integration/FullCompatibilityFlowTest.php delete mode 100644 vendor/eduardovillao/wp-since/tests/PluginScannerTest.php delete mode 100644 vendor/eduardovillao/wp-since/tests/Resolver/IgnoreRulesResolverTest.php delete mode 100644 vendor/eduardovillao/wp-since/tests/TablePrinterTest.php delete mode 100644 vendor/eduardovillao/wp-since/tests/VersionHelperTest.php delete mode 100644 vendor/eduardovillao/wp-since/tests/VersionResolverTest.php delete mode 100644 vendor/eduardovillao/wp-since/tests/fixtures/file-a.php delete mode 100644 vendor/eduardovillao/wp-since/tests/fixtures/file-b.php delete mode 100644 vendor/eduardovillao/wp-since/tests/fixtures/plugin-full-test/.distignore delete mode 100644 vendor/eduardovillao/wp-since/tests/fixtures/plugin-full-test/ignore-this.php delete mode 100644 vendor/eduardovillao/wp-since/tests/fixtures/plugin-full-test/ignored-folder/fake1.php delete mode 100644 vendor/eduardovillao/wp-since/tests/fixtures/plugin-full-test/ignored-no-slash/file.php delete mode 100644 vendor/eduardovillao/wp-since/tests/fixtures/plugin-full-test/plugin-full-test.php delete mode 100644 vendor/eduardovillao/wp-since/tests/fixtures/plugin-full-test/readme.txt delete mode 100644 vendor/eduardovillao/wp-since/tests/fixtures/plugin-ignore-comment/plugin-ignore-comment.php delete mode 100644 vendor/eduardovillao/wp-since/tests/fixtures/plugin-with-header/plugin-with-header.php delete mode 100644 vendor/eduardovillao/wp-since/tests/fixtures/plugin-with-readme-only/plugin-with-readme-only.php delete mode 100644 vendor/eduardovillao/wp-since/tests/fixtures/plugin-with-readme-only/readme.txt delete mode 100644 vendor/eduardovillao/wp-since/tests/fixtures/plugin-without-version/plugin-without-version.php delete mode 100644 vendor/eduardovillao/wp-since/tests/fixtures/plugin-without-version/readme.txt delete mode 100644 vendor/eduardovillao/wp-since/wp-since.json delete mode 100644 vendor/league/commonmark/CHANGELOG.md delete mode 100644 vendor/league/commonmark/README.md delete mode 100644 vendor/league/commonmark/composer.json delete mode 100644 vendor/league/config/CHANGELOG.md delete mode 100644 vendor/league/config/README.md delete mode 100644 vendor/league/config/composer.json delete mode 100644 vendor/myclabs/deep-copy/LICENSE delete mode 100644 vendor/myclabs/deep-copy/README.md delete mode 100644 vendor/myclabs/deep-copy/composer.json delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/DeepCopy.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Exception/PropertyException.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Filter/ChainableFilter.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Filter/KeepFilter.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Filter/ReplaceFilter.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyMatcher.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DatePeriodFilter.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/ArrayObjectFilter.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/TypeMatcher/TypeMatcher.php delete mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/deep_copy.php delete mode 100644 vendor/nette/schema/composer.json delete mode 100644 vendor/nette/schema/license.md delete mode 100644 vendor/nette/schema/readme.md delete mode 100644 vendor/nette/utils/composer.json delete mode 100644 vendor/nette/utils/license.md delete mode 100644 vendor/nette/utils/readme.md delete mode 100644 vendor/nikic/php-parser/LICENSE delete mode 100644 vendor/nikic/php-parser/README.md delete mode 100644 vendor/nikic/php-parser/bin/php-parse delete mode 100644 vendor/nikic/php-parser/composer.json delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/ClassConst.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Declaration.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/EnumCase.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Enum_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Function_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Interface_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Method.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Property.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Trait_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Use_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Comment.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Comment/Doc.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluator.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Error.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/ErrorHandler.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Internal/Differ.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/JsonDecoder.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/CoaleseEqualTokenEmulator.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/EnumTokenEmulator.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ExplicitOctalEmulator.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FlexibleDocStringEmulator.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/KeywordEmulator.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NullsafeTokenEmulator.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyFunctionTokenEmulator.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReverseEmulator.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/NameContext.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Arg.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Attribute.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/ComplexType.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Const_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseOr.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseXor.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Coalesce.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Concat.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Div.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Minus.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mod.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mul.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Plus.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Pow.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftLeft.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftRight.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseOr.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseXor.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanAnd.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanOr.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Coalesce.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Concat.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Div.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Equal.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Greater.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalAnd.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalOr.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalXor.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Minus.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mod.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mul.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotEqual.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotIdentical.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Plus.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pow.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftLeft.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftRight.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Spaceship.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Bool_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Int_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Object_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/String_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Unset_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Identifier.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/MatchArm.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Name.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/NullableType.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Param.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Dir.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/File.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Function_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/UnionType.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/VariadicPlaceholder.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeAbstract.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeDumper.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeFinder.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeVisitor.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Parser.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Parser/Multiple.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/Parser/Tokens.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/ParserAbstract.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/ParserFactory.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php delete mode 100644 vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php delete mode 100644 vendor/phar-io/manifest/.github/FUNDING.yml delete mode 100644 vendor/phar-io/manifest/.github/workflows/ci.yml delete mode 100644 vendor/phar-io/manifest/.php-cs-fixer.dist.php delete mode 100644 vendor/phar-io/manifest/CHANGELOG.md delete mode 100644 vendor/phar-io/manifest/LICENSE delete mode 100644 vendor/phar-io/manifest/README.md delete mode 100644 vendor/phar-io/manifest/composer.json delete mode 100644 vendor/phar-io/manifest/composer.lock delete mode 100644 vendor/phar-io/manifest/manifest.xsd delete mode 100644 vendor/phar-io/manifest/src/ManifestDocumentMapper.php delete mode 100644 vendor/phar-io/manifest/src/ManifestLoader.php delete mode 100644 vendor/phar-io/manifest/src/ManifestSerializer.php delete mode 100644 vendor/phar-io/manifest/src/exceptions/ElementCollectionException.php delete mode 100644 vendor/phar-io/manifest/src/exceptions/Exception.php delete mode 100644 vendor/phar-io/manifest/src/exceptions/InvalidApplicationNameException.php delete mode 100644 vendor/phar-io/manifest/src/exceptions/InvalidEmailException.php delete mode 100644 vendor/phar-io/manifest/src/exceptions/InvalidUrlException.php delete mode 100644 vendor/phar-io/manifest/src/exceptions/ManifestDocumentException.php delete mode 100644 vendor/phar-io/manifest/src/exceptions/ManifestDocumentLoadingException.php delete mode 100644 vendor/phar-io/manifest/src/exceptions/ManifestDocumentMapperException.php delete mode 100644 vendor/phar-io/manifest/src/exceptions/ManifestElementException.php delete mode 100644 vendor/phar-io/manifest/src/exceptions/ManifestLoaderException.php delete mode 100644 vendor/phar-io/manifest/src/exceptions/NoEmailAddressException.php delete mode 100644 vendor/phar-io/manifest/src/values/Application.php delete mode 100644 vendor/phar-io/manifest/src/values/ApplicationName.php delete mode 100644 vendor/phar-io/manifest/src/values/Author.php delete mode 100644 vendor/phar-io/manifest/src/values/AuthorCollection.php delete mode 100644 vendor/phar-io/manifest/src/values/AuthorCollectionIterator.php delete mode 100644 vendor/phar-io/manifest/src/values/BundledComponent.php delete mode 100644 vendor/phar-io/manifest/src/values/BundledComponentCollection.php delete mode 100644 vendor/phar-io/manifest/src/values/BundledComponentCollectionIterator.php delete mode 100644 vendor/phar-io/manifest/src/values/CopyrightInformation.php delete mode 100644 vendor/phar-io/manifest/src/values/Email.php delete mode 100644 vendor/phar-io/manifest/src/values/Extension.php delete mode 100644 vendor/phar-io/manifest/src/values/Library.php delete mode 100644 vendor/phar-io/manifest/src/values/License.php delete mode 100644 vendor/phar-io/manifest/src/values/Manifest.php delete mode 100644 vendor/phar-io/manifest/src/values/PhpExtensionRequirement.php delete mode 100644 vendor/phar-io/manifest/src/values/PhpVersionRequirement.php delete mode 100644 vendor/phar-io/manifest/src/values/Requirement.php delete mode 100644 vendor/phar-io/manifest/src/values/RequirementCollection.php delete mode 100644 vendor/phar-io/manifest/src/values/RequirementCollectionIterator.php delete mode 100644 vendor/phar-io/manifest/src/values/Type.php delete mode 100644 vendor/phar-io/manifest/src/values/Url.php delete mode 100644 vendor/phar-io/manifest/src/xml/AuthorElement.php delete mode 100644 vendor/phar-io/manifest/src/xml/AuthorElementCollection.php delete mode 100644 vendor/phar-io/manifest/src/xml/BundlesElement.php delete mode 100644 vendor/phar-io/manifest/src/xml/ComponentElement.php delete mode 100644 vendor/phar-io/manifest/src/xml/ComponentElementCollection.php delete mode 100644 vendor/phar-io/manifest/src/xml/ContainsElement.php delete mode 100644 vendor/phar-io/manifest/src/xml/CopyrightElement.php delete mode 100644 vendor/phar-io/manifest/src/xml/ElementCollection.php delete mode 100644 vendor/phar-io/manifest/src/xml/ExtElement.php delete mode 100644 vendor/phar-io/manifest/src/xml/ExtElementCollection.php delete mode 100644 vendor/phar-io/manifest/src/xml/ExtensionElement.php delete mode 100644 vendor/phar-io/manifest/src/xml/LicenseElement.php delete mode 100644 vendor/phar-io/manifest/src/xml/ManifestDocument.php delete mode 100644 vendor/phar-io/manifest/src/xml/ManifestElement.php delete mode 100644 vendor/phar-io/manifest/src/xml/PhpElement.php delete mode 100644 vendor/phar-io/manifest/src/xml/RequiresElement.php delete mode 100644 vendor/phar-io/manifest/tools/php-cs-fixer.d/PhpdocSingleLineVarFixer.php delete mode 100644 vendor/phar-io/manifest/tools/php-cs-fixer.d/header.txt delete mode 100644 vendor/phar-io/version/CHANGELOG.md delete mode 100644 vendor/phar-io/version/LICENSE delete mode 100644 vendor/phar-io/version/README.md delete mode 100644 vendor/phar-io/version/composer.json delete mode 100644 vendor/phar-io/version/src/BuildMetaData.php delete mode 100644 vendor/phar-io/version/src/PreReleaseSuffix.php delete mode 100644 vendor/phar-io/version/src/Version.php delete mode 100644 vendor/phar-io/version/src/VersionConstraintParser.php delete mode 100644 vendor/phar-io/version/src/VersionConstraintValue.php delete mode 100644 vendor/phar-io/version/src/VersionNumber.php delete mode 100644 vendor/phar-io/version/src/constraints/AbstractVersionConstraint.php delete mode 100644 vendor/phar-io/version/src/constraints/AndVersionConstraintGroup.php delete mode 100644 vendor/phar-io/version/src/constraints/AnyVersionConstraint.php delete mode 100644 vendor/phar-io/version/src/constraints/ExactVersionConstraint.php delete mode 100644 vendor/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php delete mode 100644 vendor/phar-io/version/src/constraints/OrVersionConstraintGroup.php delete mode 100644 vendor/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php delete mode 100644 vendor/phar-io/version/src/constraints/SpecificMajorVersionConstraint.php delete mode 100644 vendor/phar-io/version/src/constraints/VersionConstraint.php delete mode 100644 vendor/phar-io/version/src/exceptions/Exception.php delete mode 100644 vendor/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php delete mode 100644 vendor/phar-io/version/src/exceptions/InvalidVersionException.php delete mode 100644 vendor/phar-io/version/src/exceptions/NoBuildMetaDataException.php delete mode 100644 vendor/phar-io/version/src/exceptions/NoPreReleaseSuffixException.php delete mode 100644 vendor/phar-io/version/src/exceptions/UnsupportedVersionConstraintException.php delete mode 100644 vendor/phpcompatibility/php-compatibility/CHANGELOG.md delete mode 100644 vendor/phpcompatibility/php-compatibility/LICENSE delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCSAliases.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/AbstractComplexVersionSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/AbstractFunctionCallParameterSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/AbstractNewFeatureSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/AbstractRemovedFeatureSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/ComplexVersionInterface.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/PHPCSHelper.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Classes/ForbiddenAbstractPrivateMethodsSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Classes/NewAnonymousClassesSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Classes/NewClassesSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Classes/NewConstVisibilitySniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Classes/NewLateStaticBindingSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Classes/NewTypedPropertiesSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Classes/RemovedOrphanedParentSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Constants/NewConstantsSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Constants/NewMagicClassConstantSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Constants/RemovedConstantsSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ControlStructures/DiscouragedSwitchContinueSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ControlStructures/ForbiddenBreakContinueOutsideLoopSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ControlStructures/ForbiddenBreakContinueVariableArgumentsSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ControlStructures/ForbiddenSwitchWithMultipleDefaultBlocksSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ControlStructures/NewExecutionDirectivesSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ControlStructures/NewForeachExpressionReferencingSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ControlStructures/NewListInForeachSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ControlStructures/NewMultiCatchSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Extensions/RemovedExtensionsSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/ForbiddenParameterShadowSuperGlobalsSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/ForbiddenParametersWithSameNameSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/ForbiddenToStringParametersSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/ForbiddenVariableNamesInClosureUseSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/NewClosureSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/NewExceptionsFromToStringSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/NewNullableTypesSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/NewParamTypeDeclarationsSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/NewReturnTypeDeclarationsSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/NonStaticMagicMethodsSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionNameRestrictions/NewMagicMethodsSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionNameRestrictions/RemovedMagicAutoloadSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionNameRestrictions/RemovedNamespacedAssertSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionNameRestrictions/RemovedPHP4StyleConstructorsSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionNameRestrictions/ReservedFunctionNamesSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionUse/ArgumentFunctionsReportCurrentValueSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionUse/ArgumentFunctionsUsageSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionUse/NewFunctionParametersSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionUse/NewFunctionsSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionUse/OptionalToRequiredFunctionParametersSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionUse/RemovedFunctionParametersSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionUse/RemovedFunctionsSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionUse/RequiredToOptionalFunctionParametersSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Generators/NewGeneratorReturnSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/IniDirectives/NewIniDirectivesSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/IniDirectives/RemovedIniDirectivesSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/InitialValue/NewConstantArraysUsingConstSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/InitialValue/NewConstantArraysUsingDefineSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/InitialValue/NewConstantScalarExpressionsSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/InitialValue/NewHeredocSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Interfaces/InternalInterfacesSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Interfaces/NewInterfacesSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Keywords/CaseSensitiveKeywordsSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Keywords/ForbiddenNamesAsDeclaredSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Keywords/ForbiddenNamesAsInvokedFunctionsSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Keywords/ForbiddenNamesSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Keywords/NewKeywordsSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/LanguageConstructs/NewEmptyNonVariableSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/LanguageConstructs/NewLanguageConstructsSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Lists/AssignmentOrderSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Lists/ForbiddenEmptyListAssignmentSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Lists/NewKeyedListSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Lists/NewListReferenceAssignmentSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Lists/NewShortListSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/MethodUse/ForbiddenToStringParametersSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/MethodUse/NewDirectCallsToCloneSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Miscellaneous/NewPHPOpenTagEOFSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Miscellaneous/RemovedAlternativePHPTagsSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Miscellaneous/ValidIntegersSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Operators/ChangedConcatOperatorPrecedenceSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Operators/ForbiddenNegativeBitshiftSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Operators/NewOperatorsSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Operators/NewShortTernarySniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Operators/RemovedTernaryAssociativitySniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/ForbiddenGetClassNullSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/ForbiddenStripTagsSelfClosingXHTMLSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewArrayReduceInitialTypeSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewFopenModesSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewHTMLEntitiesEncodingDefaultSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewHashAlgorithmsSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewIDNVariantDefaultSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewIconvMbstringCharsetDefaultSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewNegativeStringOffsetSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewPCREModifiersSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewPackFormatSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewPasswordAlgoConstantValuesSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewProcOpenCmdArraySniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewStripTagsAllowableTagsArraySniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/RemovedHashAlgorithmsSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/RemovedIconvEncodingSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/RemovedImplodeFlexibleParamOrderSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/RemovedMbStrrposEncodingThirdParamSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/RemovedMbstringModifiersSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/RemovedNonCryptoHashSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/RemovedPCREModifiersSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/RemovedSetlocaleStringSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/ForbiddenCallTimePassByReferenceSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/NewArrayStringDereferencingSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/NewArrayUnpackingSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/NewClassMemberAccessSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/NewDynamicAccessToStaticSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/NewFlexibleHeredocNowdocSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/NewFunctionArrayDereferencingSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/NewFunctionCallTrailingCommaSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/NewShortArraySniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/RemovedCurlyBraceArrayAccessSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/RemovedNewReferenceSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/TextStrings/NewUnicodeEscapeSequenceSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/TypeCasts/NewTypeCastsSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/TypeCasts/RemovedTypeCastsSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Upgrade/LowPHPCSSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Upgrade/LowPHPSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/UseDeclarations/NewGroupUseDeclarationsSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/UseDeclarations/NewUseConstFunctionSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Variables/ForbiddenGlobalVariableVariableSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Variables/ForbiddenThisUseContextsSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Variables/NewUniformVariableSyntaxSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Variables/RemovedPredefinedGlobalVariablesSniff.php delete mode 100644 vendor/phpcompatibility/php-compatibility/PHPCompatibility/ruleset.xml delete mode 100644 vendor/phpcompatibility/php-compatibility/README.md delete mode 100644 vendor/phpcompatibility/php-compatibility/composer.json delete mode 100644 vendor/phpcompatibility/php-compatibility/phpunit-bootstrap.php delete mode 100644 vendor/phpcompatibility/phpcompatibility-paragonie/LICENSE delete mode 100644 vendor/phpcompatibility/phpcompatibility-paragonie/PHPCompatibilityParagonieRandomCompat/ruleset.xml delete mode 100644 vendor/phpcompatibility/phpcompatibility-paragonie/PHPCompatibilityParagonieSodiumCompat/ruleset.xml delete mode 100644 vendor/phpcompatibility/phpcompatibility-paragonie/README.md delete mode 100644 vendor/phpcompatibility/phpcompatibility-paragonie/composer.json delete mode 100644 vendor/phpcompatibility/phpcompatibility-wp/LICENSE delete mode 100644 vendor/phpcompatibility/phpcompatibility-wp/PHPCompatibilityWP/ruleset.xml delete mode 100644 vendor/phpcompatibility/phpcompatibility-wp/README.md delete mode 100644 vendor/phpcompatibility/phpcompatibility-wp/composer.json delete mode 100644 vendor/phpcsstandards/phpcsextra/CHANGELOG.md delete mode 100644 vendor/phpcsstandards/phpcsextra/LICENSE delete mode 100644 vendor/phpcsstandards/phpcsextra/Modernize/Docs/FunctionCalls/DirnameStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Modernize/Sniffs/FunctionCalls/DirnameSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Modernize/ruleset.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/NormalizedArrays/Docs/Arrays/ArrayBraceSpacingStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/NormalizedArrays/Docs/Arrays/CommaAfterLastStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/NormalizedArrays/Sniffs/Arrays/ArrayBraceSpacingSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/NormalizedArrays/Sniffs/Arrays/CommaAfterLastSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/NormalizedArrays/ruleset.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/README.md delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/Arrays/DisallowShortArraySyntaxStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/Arrays/DuplicateArrayKeyStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/Arrays/MixedArrayKeyTypesStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/Arrays/MixedKeyedUnkeyedArrayStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/Attributes/BracketSpacingStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/Attributes/DisallowAttributeParenthesesStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/Attributes/RequireAttributeParenthesesStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/Attributes/TrailingCommaStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/Classes/DisallowAnonClassParenthesesStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/Classes/DisallowFinalClassStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/Classes/ModifierKeywordOrderStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/Classes/RequireAnonClassParenthesesStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/Classes/RequireFinalClassStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/CodeAnalysis/ConstructorDestructorReturnStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/CodeAnalysis/ForeachUniqueAssignmentStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/CodeAnalysis/NoDoubleNegativeStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/CodeAnalysis/NoEchoSprintfStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/CodeAnalysis/StaticInFinalClassStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/Constants/LowercaseClassResolutionKeywordStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/Constants/ModifierKeywordOrderStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/Constants/UppercaseMagicConstantsStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/ControlStructures/DisallowAlternativeSyntaxStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/ControlStructures/DisallowLonelyIfStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/ControlStructures/IfElseDeclarationStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/Files/SeparateFunctionsFromOOStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/FunctionDeclarations/NoLongClosuresStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/FunctionDeclarations/RequireFinalMethodsInTraitsStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/Lists/DisallowLongListSyntaxStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/Lists/DisallowShortListSyntaxStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/Namespaces/DisallowCurlyBraceSyntaxStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/Namespaces/DisallowDeclarationWithoutNameStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/Namespaces/EnforceCurlyBraceSyntaxStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/Namespaces/OneDeclarationPerFileStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/NamingConventions/NoReservedKeywordParameterNamesStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/OOStructures/AlphabeticExtendsImplementsStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/Operators/ConcatPositionStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/Operators/DisallowLogicalAndOrStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/Operators/DisallowShortTernaryStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/Operators/DisallowStandalonePostIncrementDecrementStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/Operators/StrictComparisonsStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/Operators/TypeSeparatorSpacingStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/PHP/DisallowExitDieParenthesesStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/PHP/LowercasePHPTagStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/PHP/NoFQNTrueFalseNullStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/PHP/OneStatementInShortEchoTagStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/PHP/RequireExitDieParenthesesStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/UseStatements/DisallowMixedGroupUseStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/UseStatements/DisallowUseClassStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/UseStatements/DisallowUseConstStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/UseStatements/DisallowUseFunctionStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/UseStatements/KeywordSpacingStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/UseStatements/LowercaseFunctionConstStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/UseStatements/NoLeadingBackslashStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/UseStatements/NoUselessAliasesStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/WhiteSpace/AnonClassKeywordSpacingStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/WhiteSpace/CommaSpacingStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/WhiteSpace/DisallowInlineTabsStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/WhiteSpace/FirstClassCallableSpacingStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Docs/WhiteSpace/PrecisionAlignmentStandard.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Helpers/DummyTokenizer.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Arrays/DisallowShortArraySyntaxSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Arrays/DuplicateArrayKeySniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Arrays/MixedArrayKeyTypesSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Arrays/MixedKeyedUnkeyedArraySniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Attributes/BracketSpacingSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Attributes/DisallowAttributeParenthesesSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Attributes/RequireAttributeParenthesesSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Attributes/TrailingCommaSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Classes/DisallowAnonClassParenthesesSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Classes/DisallowFinalClassSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Classes/ModifierKeywordOrderSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Classes/RequireAnonClassParenthesesSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Classes/RequireFinalClassSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/CodeAnalysis/ConstructorDestructorReturnSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/CodeAnalysis/ForeachUniqueAssignmentSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/CodeAnalysis/NoDoubleNegativeSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/CodeAnalysis/NoEchoSprintfSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/CodeAnalysis/StaticInFinalClassSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Constants/LowercaseClassResolutionKeywordSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Constants/ModifierKeywordOrderSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Constants/UppercaseMagicConstantsSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/ControlStructures/DisallowAlternativeSyntaxSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/ControlStructures/DisallowLonelyIfSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/ControlStructures/IfElseDeclarationSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Files/SeparateFunctionsFromOOSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/FunctionDeclarations/NoLongClosuresSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/FunctionDeclarations/RequireFinalMethodsInTraitsSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Lists/DisallowLongListSyntaxSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Lists/DisallowShortListSyntaxSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Namespaces/DisallowCurlyBraceSyntaxSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Namespaces/DisallowDeclarationWithoutNameSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Namespaces/EnforceCurlyBraceSyntaxSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Namespaces/OneDeclarationPerFileSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/NamingConventions/NoReservedKeywordParameterNamesSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/OOStructures/AlphabeticExtendsImplementsSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Operators/ConcatPositionSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Operators/DisallowLogicalAndOrSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Operators/DisallowShortTernarySniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Operators/DisallowStandalonePostIncrementDecrementSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Operators/StrictComparisonsSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Operators/TypeSeparatorSpacingSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/PHP/DisallowExitDieParenthesesSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/PHP/LowercasePHPTagSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/PHP/NoFQNTrueFalseNullSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/PHP/OneStatementInShortEchoTagSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/PHP/RequireExitDieParenthesesSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/UseStatements/DisallowMixedGroupUseSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/UseStatements/DisallowUseClassSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/UseStatements/DisallowUseConstSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/UseStatements/DisallowUseFunctionSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/UseStatements/KeywordSpacingSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/UseStatements/LowercaseFunctionConstSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/UseStatements/NoLeadingBackslashSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/UseStatements/NoUselessAliasesSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/WhiteSpace/AnonClassKeywordSpacingSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/WhiteSpace/CommaSpacingSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/WhiteSpace/DisallowInlineTabsSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/WhiteSpace/FirstClassCallableSpacingSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/Sniffs/WhiteSpace/PrecisionAlignmentSniff.php delete mode 100644 vendor/phpcsstandards/phpcsextra/Universal/ruleset.xml delete mode 100644 vendor/phpcsstandards/phpcsextra/composer.json delete mode 100644 vendor/phpcsstandards/phpcsutils/CHANGELOG.md delete mode 100644 vendor/phpcsstandards/phpcsutils/LICENSE delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/AbstractSniffs/AbstractArrayDeclarationSniff.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/BackCompat/BCFile.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/BackCompat/BCTokens.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/BackCompat/Helper.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/InvalidTokenArray.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/LogicException.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/MissingArgumentError.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/OutOfBoundsStackPtr.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/RuntimeException.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/TestFileNotFound.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/TestMarkerNotFound.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/TestTargetNotFound.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/TypeError.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/UnexpectedTokenType.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/ValueError.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Fixers/SpacesFixer.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Internal/AttributeHelper.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Internal/Cache.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Internal/IsShortArrayOrList.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Internal/IsShortArrayOrListWithCache.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Internal/NoFileCache.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Internal/StableCollections.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/TestUtils/ConfigDouble.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/TestUtils/RulesetDouble.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/TestUtils/UtilityMethodTestCase.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Tokens/Collections.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Tokens/TokenHelper.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Arrays.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/AttributeBlock.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Conditions.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Constants.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Context.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/ControlStructures.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/FileInfo.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/FilePath.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/FunctionDeclarations.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/GetTokensAsString.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Lists.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/MessageHelper.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Namespaces.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/NamingConventions.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Numbers.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/ObjectDeclarations.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Operators.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Orthography.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Parentheses.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/PassedParameters.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Scopes.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/TextStrings.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/TypeString.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/UseStatements.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Variables.php delete mode 100644 vendor/phpcsstandards/phpcsutils/PHPCSUtils/ruleset.xml delete mode 100644 vendor/phpcsstandards/phpcsutils/README.md delete mode 100644 vendor/phpcsstandards/phpcsutils/composer.json delete mode 100644 vendor/phpcsstandards/phpcsutils/phpcsutils-autoload.php delete mode 100644 vendor/phpstan/phpstan/LICENSE delete mode 100644 vendor/phpstan/phpstan/README.md delete mode 100644 vendor/phpstan/phpstan/bootstrap.php delete mode 100644 vendor/phpstan/phpstan/composer.json delete mode 100644 vendor/phpstan/phpstan/conf/bleedingEdge.neon delete mode 100644 vendor/phpstan/phpstan/phpstan delete mode 100644 vendor/phpstan/phpstan/phpstan.phar delete mode 100644 vendor/phpstan/phpstan/phpstan.phar.asc delete mode 100644 vendor/phpunit/php-code-coverage/ChangeLog-10.1.md delete mode 100644 vendor/phpunit/php-code-coverage/LICENSE delete mode 100644 vendor/phpunit/php-code-coverage/README.md delete mode 100644 vendor/phpunit/php-code-coverage/SECURITY.md delete mode 100644 vendor/phpunit/php-code-coverage/composer.json delete mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Data/ProcessedCodeCoverageData.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Data/RawCodeCoverageData.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Driver/Driver.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Driver/PcovDriver.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Driver/Selector.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Driver/XdebugDriver.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Exception/BranchAndPathCoverageNotSupportedException.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Exception/DeadCodeDetectionNotSupportedException.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Exception/DirectoryCouldNotBeCreatedException.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Exception/Exception.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Exception/FileCouldNotBeWrittenException.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Exception/InvalidArgumentException.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Exception/NoCodeCoverageDriverAvailableException.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Exception/NoCodeCoverageDriverWithPathCoverageSupportAvailableException.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Exception/ParserException.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Exception/PathExistsButIsNotDirectoryException.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Exception/PcovNotAvailableException.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Exception/ReflectionException.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Exception/ReportAlreadyFinalizedException.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Exception/StaticAnalysisCacheNotConfiguredException.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Exception/TestIdMissingException.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Exception/UnintentionallyCoveredCodeException.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Exception/WriteOperationFailedException.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Exception/XdebugNotAvailableException.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Exception/XdebugNotEnabledException.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Exception/XmlException.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Filter.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Node/AbstractNode.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Node/Builder.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Node/CrapIndex.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Node/Directory.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Node/File.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Node/Iterator.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Clover.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Cobertura.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Crap4j.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Colors.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/CustomCssFile.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Facade.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Dashboard.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Directory.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/branches.html.dist delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/coverage_bar.html.dist delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/coverage_bar_branch.html.dist delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/bootstrap.min.css delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/custom.css delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/nv.d3.min.css delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/octicons.css delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/style.css delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/dashboard.html.dist delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/dashboard_branch.html.dist delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory.html.dist delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory_branch.html.dist delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory_item.html.dist delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory_item_branch.html.dist delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file.html.dist delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file_branch.html.dist delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file_item.html.dist delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file_item_branch.html.dist delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/icons/file-code.svg delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/icons/file-directory.svg delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/bootstrap.min.js delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/d3.min.js delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/file.js delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/jquery.min.js delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/nv.d3.min.js delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/popper.min.js delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/line.html.dist delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/lines.html.dist delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/method_item.html.dist delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/method_item_branch.html.dist delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/paths.html.dist delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/PHP.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Text.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Thresholds.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/BuildInformation.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Coverage.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Directory.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Facade.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/File.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Method.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Node.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Project.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Report.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Source.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Tests.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Totals.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Unit.php delete mode 100644 vendor/phpunit/php-code-coverage/src/StaticAnalysis/CacheWarmer.php delete mode 100644 vendor/phpunit/php-code-coverage/src/StaticAnalysis/CachingFileAnalyser.php delete mode 100644 vendor/phpunit/php-code-coverage/src/StaticAnalysis/CodeUnitFindingVisitor.php delete mode 100644 vendor/phpunit/php-code-coverage/src/StaticAnalysis/ExecutableLinesFindingVisitor.php delete mode 100644 vendor/phpunit/php-code-coverage/src/StaticAnalysis/FileAnalyser.php delete mode 100644 vendor/phpunit/php-code-coverage/src/StaticAnalysis/IgnoredLinesFindingVisitor.php delete mode 100644 vendor/phpunit/php-code-coverage/src/StaticAnalysis/ParsingFileAnalyser.php delete mode 100644 vendor/phpunit/php-code-coverage/src/TestSize/Known.php delete mode 100644 vendor/phpunit/php-code-coverage/src/TestSize/Large.php delete mode 100644 vendor/phpunit/php-code-coverage/src/TestSize/Medium.php delete mode 100644 vendor/phpunit/php-code-coverage/src/TestSize/Small.php delete mode 100644 vendor/phpunit/php-code-coverage/src/TestSize/TestSize.php delete mode 100644 vendor/phpunit/php-code-coverage/src/TestSize/Unknown.php delete mode 100644 vendor/phpunit/php-code-coverage/src/TestStatus/Failure.php delete mode 100644 vendor/phpunit/php-code-coverage/src/TestStatus/Known.php delete mode 100644 vendor/phpunit/php-code-coverage/src/TestStatus/Success.php delete mode 100644 vendor/phpunit/php-code-coverage/src/TestStatus/TestStatus.php delete mode 100644 vendor/phpunit/php-code-coverage/src/TestStatus/Unknown.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Util/Filesystem.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Util/Percentage.php delete mode 100644 vendor/phpunit/php-code-coverage/src/Version.php delete mode 100644 vendor/phpunit/php-file-iterator/ChangeLog.md delete mode 100644 vendor/phpunit/php-file-iterator/LICENSE delete mode 100644 vendor/phpunit/php-file-iterator/README.md delete mode 100644 vendor/phpunit/php-file-iterator/SECURITY.md delete mode 100644 vendor/phpunit/php-file-iterator/composer.json delete mode 100644 vendor/phpunit/php-file-iterator/src/ExcludeIterator.php delete mode 100644 vendor/phpunit/php-file-iterator/src/Facade.php delete mode 100644 vendor/phpunit/php-file-iterator/src/Factory.php delete mode 100644 vendor/phpunit/php-file-iterator/src/Iterator.php delete mode 100644 vendor/phpunit/php-invoker/.psalm/baseline.xml delete mode 100644 vendor/phpunit/php-invoker/.psalm/config.xml delete mode 100644 vendor/phpunit/php-invoker/ChangeLog.md delete mode 100644 vendor/phpunit/php-invoker/LICENSE delete mode 100644 vendor/phpunit/php-invoker/README.md delete mode 100644 vendor/phpunit/php-invoker/SECURITY.md delete mode 100644 vendor/phpunit/php-invoker/composer.json delete mode 100644 vendor/phpunit/php-invoker/src/Invoker.php delete mode 100644 vendor/phpunit/php-invoker/src/exceptions/Exception.php delete mode 100644 vendor/phpunit/php-invoker/src/exceptions/ProcessControlExtensionNotLoadedException.php delete mode 100644 vendor/phpunit/php-invoker/src/exceptions/TimeoutException.php delete mode 100644 vendor/phpunit/php-text-template/ChangeLog.md delete mode 100644 vendor/phpunit/php-text-template/LICENSE delete mode 100644 vendor/phpunit/php-text-template/README.md delete mode 100644 vendor/phpunit/php-text-template/SECURITY.md delete mode 100644 vendor/phpunit/php-text-template/composer.json delete mode 100644 vendor/phpunit/php-text-template/src/Template.php delete mode 100644 vendor/phpunit/php-text-template/src/exceptions/Exception.php delete mode 100644 vendor/phpunit/php-text-template/src/exceptions/InvalidArgumentException.php delete mode 100644 vendor/phpunit/php-text-template/src/exceptions/RuntimeException.php delete mode 100644 vendor/phpunit/php-timer/ChangeLog.md delete mode 100644 vendor/phpunit/php-timer/LICENSE delete mode 100644 vendor/phpunit/php-timer/README.md delete mode 100644 vendor/phpunit/php-timer/SECURITY.md delete mode 100644 vendor/phpunit/php-timer/composer.json delete mode 100644 vendor/phpunit/php-timer/src/Duration.php delete mode 100644 vendor/phpunit/php-timer/src/ResourceUsageFormatter.php delete mode 100644 vendor/phpunit/php-timer/src/Timer.php delete mode 100644 vendor/phpunit/php-timer/src/exceptions/Exception.php delete mode 100644 vendor/phpunit/php-timer/src/exceptions/NoActiveTimerException.php delete mode 100644 vendor/phpunit/php-timer/src/exceptions/TimeSinceStartOfRequestNotAvailableException.php delete mode 100644 vendor/phpunit/phpunit/ChangeLog-10.5.md delete mode 100644 vendor/phpunit/phpunit/DEPRECATIONS.md delete mode 100644 vendor/phpunit/phpunit/LICENSE delete mode 100644 vendor/phpunit/phpunit/README.md delete mode 100644 vendor/phpunit/phpunit/SECURITY.md delete mode 100644 vendor/phpunit/phpunit/composer.json delete mode 100644 vendor/phpunit/phpunit/composer.lock delete mode 100644 vendor/phpunit/phpunit/phpunit delete mode 100644 vendor/phpunit/phpunit/phpunit.xsd delete mode 100644 vendor/phpunit/phpunit/schema/10.0.xsd delete mode 100644 vendor/phpunit/phpunit/schema/10.1.xsd delete mode 100644 vendor/phpunit/phpunit/schema/10.2.xsd delete mode 100644 vendor/phpunit/phpunit/schema/10.3.xsd delete mode 100644 vendor/phpunit/phpunit/schema/10.4.xsd delete mode 100644 vendor/phpunit/phpunit/schema/8.5.xsd delete mode 100644 vendor/phpunit/phpunit/schema/9.0.xsd delete mode 100644 vendor/phpunit/phpunit/schema/9.1.xsd delete mode 100644 vendor/phpunit/phpunit/schema/9.2.xsd delete mode 100644 vendor/phpunit/phpunit/schema/9.3.xsd delete mode 100644 vendor/phpunit/phpunit/schema/9.4.xsd delete mode 100644 vendor/phpunit/phpunit/schema/9.5.xsd delete mode 100644 vendor/phpunit/phpunit/src/Event/Dispatcher/CollectingDispatcher.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Dispatcher/DeferringDispatcher.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Dispatcher/DirectDispatcher.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Dispatcher/Dispatcher.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Dispatcher/SubscribableDispatcher.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Emitter/DispatchingEmitter.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Emitter/Emitter.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Application/Finished.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Application/FinishedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Application/Started.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Application/StartedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Event.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/EventCollection.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/EventCollectionIterator.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionFailed.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionFailedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionSucceeded.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionSucceededSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/ComparatorRegistered.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/ComparatorRegisteredSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodCalled.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodCalledSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodErrored.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodErroredSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodFinished.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodFinishedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodCalled.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodCalledSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodErrored.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodErroredSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodFinished.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodFinishedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodCalled.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodCalledSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodErrored.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodErroredSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodFinished.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodFinishedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodCalled.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodCalledSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodErrored.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodErroredSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodFinished.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodFinishedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionCalled.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionCalledSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionErrored.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionErroredSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionFinished.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionFinishedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionCalled.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionCalledSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionErrored.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionErroredSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionFinished.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionFinishedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/ConsideredRisky.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/ConsideredRiskySubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/DeprecationTriggered.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/DeprecationTriggeredSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/ErrorTriggered.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/ErrorTriggeredSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/NoticeTriggered.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/NoticeTriggeredSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpDeprecationTriggered.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpDeprecationTriggeredSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpNoticeTriggered.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpNoticeTriggeredSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpWarningTriggered.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpWarningTriggeredSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitDeprecationTriggered.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitDeprecationTriggeredSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitErrorTriggered.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitErrorTriggeredSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitWarningTriggered.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitWarningTriggeredSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/WarningTriggered.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/WarningTriggeredSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/DataProviderMethodCalled.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/DataProviderMethodCalledSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/DataProviderMethodFinished.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/DataProviderMethodFinishedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/Finished.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/FinishedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparationFailed.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparationFailedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparationStarted.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparationStartedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/Prepared.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/Errored.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/ErroredSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/Failed.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/FailedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/MarkedIncomplete.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/MarkedIncompleteSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/Passed.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/PassedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/Skipped.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/SkippedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/PrintedUnexpectedOutput.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/PrintedUnexpectedOutputSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectCreated.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectCreatedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForAbstractClassCreated.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForAbstractClassCreatedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForIntersectionOfInterfacesCreated.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForIntersectionOfInterfacesCreatedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForTraitCreated.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForTraitCreatedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectFromWsdlCreated.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectFromWsdlCreatedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/PartialMockObjectCreated.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/PartialMockObjectCreatedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestProxyCreated.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestProxyCreatedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestStubCreated.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestStubCreatedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestStubForIntersectionOfInterfacesCreated.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestStubForIntersectionOfInterfacesCreatedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/BootstrapFinished.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/BootstrapFinishedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/Configured.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/ConfiguredSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/DeprecationTriggered.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/DeprecationTriggeredSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/EventFacadeSealed.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/EventFacadeSealedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionAborted.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionAbortedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionFinished.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionFinishedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionStarted.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionStartedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionBootstrapped.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionBootstrappedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionLoadedFromPhar.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionLoadedFromPharSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/Finished.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/FinishedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionDisabled.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionDisabledSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionEnabled.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionEnabledSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionTriggered.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionTriggeredSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/Started.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/StartedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/WarningTriggered.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/WarningTriggeredSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestSuite/Filtered.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestSuite/FilteredSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestSuite/Finished.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestSuite/FinishedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestSuite/Loaded.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestSuite/LoadedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestSuite/Skipped.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestSuite/SkippedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestSuite/Sorted.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestSuite/SortedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestSuite/Started.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestSuite/StartedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Exception/EventAlreadyAssignedException.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Exception/EventFacadeIsSealedException.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Exception/Exception.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Exception/InvalidArgumentException.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Exception/InvalidEventException.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Exception/InvalidSubscriberException.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Exception/MapError.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Exception/MoreThanOneDataSetFromDataProviderException.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Exception/NoComparisonFailureException.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Exception/NoDataSetFromDataProviderException.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Exception/NoPreviousThrowableException.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Exception/NoTestCaseObjectOnCallStackException.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Exception/RuntimeException.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Exception/SubscriberTypeAlreadyRegisteredException.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Exception/UnknownEventException.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Exception/UnknownEventTypeException.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Exception/UnknownSubscriberException.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Exception/UnknownSubscriberTypeException.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Facade.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Subscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Tracer.php delete mode 100644 vendor/phpunit/phpunit/src/Event/TypeMap.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/ClassMethod.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/ComparisonFailure.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/ComparisonFailureBuilder.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/Runtime/OperatingSystem.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/Runtime/PHP.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/Runtime/PHPUnit.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/Runtime/Runtime.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/Telemetry/Duration.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/Telemetry/GarbageCollectorStatus.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/Telemetry/GarbageCollectorStatusProvider.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/Telemetry/HRTime.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/Telemetry/Info.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/Telemetry/MemoryMeter.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/Telemetry/MemoryUsage.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/Telemetry/Php81GarbageCollectorStatusProvider.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/Telemetry/Php83GarbageCollectorStatusProvider.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/Telemetry/Snapshot.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/Telemetry/StopWatch.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/Telemetry/System.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/Telemetry/SystemMemoryMeter.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/Telemetry/SystemStopWatch.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/Telemetry/SystemStopWatchWithOffset.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/Test/Phpt.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/Test/Test.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/Test/TestCollection.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/Test/TestCollectionIterator.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/Test/TestData/DataFromDataProvider.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/Test/TestData/DataFromTestDependency.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/Test/TestData/TestData.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/Test/TestData/TestDataCollection.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/Test/TestData/TestDataCollectionIterator.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/Test/TestDox.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/Test/TestDoxBuilder.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/Test/TestMethod.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/Test/TestMethodBuilder.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/TestSuite/TestSuite.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteBuilder.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteForTestClass.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteForTestMethodWithDataProvider.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteWithName.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/Throwable.php delete mode 100644 vendor/phpunit/phpunit/src/Event/Value/ThrowableBuilder.php delete mode 100644 vendor/phpunit/phpunit/src/Exception.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Assert.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Assert/Functions.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/After.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/AfterClass.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/BackupGlobals.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/BackupStaticProperties.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/Before.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/BeforeClass.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/CodeCoverageIgnore.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/CoversClass.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/CoversFunction.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/CoversNothing.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/DataProvider.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/DataProviderExternal.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/Depends.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/DependsExternal.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/DependsExternalUsingDeepClone.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/DependsExternalUsingShallowClone.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/DependsOnClass.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/DependsOnClassUsingDeepClone.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/DependsOnClassUsingShallowClone.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/DependsUsingDeepClone.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/DependsUsingShallowClone.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/DoesNotPerformAssertions.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/ExcludeGlobalVariableFromBackup.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/ExcludeStaticPropertyFromBackup.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/Group.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/IgnoreClassForCodeCoverage.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/IgnoreDeprecations.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/IgnoreFunctionForCodeCoverage.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/IgnoreMethodForCodeCoverage.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/Large.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/Medium.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/PostCondition.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/PreCondition.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/PreserveGlobalState.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/RequiresFunction.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/RequiresMethod.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/RequiresOperatingSystem.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/RequiresOperatingSystemFamily.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/RequiresPhp.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/RequiresPhpExtension.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/RequiresPhpunit.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/RequiresSetting.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/RunClassInSeparateProcess.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/RunInSeparateProcess.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/RunTestsInSeparateProcesses.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/Small.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/Test.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/TestDox.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/TestWith.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/TestWithJson.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/Ticket.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/UsesClass.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/UsesFunction.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/WithoutErrorHandler.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Boolean/IsFalse.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Boolean/IsTrue.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Callback.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/Count.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/GreaterThan.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/IsEmpty.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/LessThan.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/SameSize.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Constraint.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqual.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualCanonicalizing.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualIgnoringCase.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualWithDelta.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Exception/Exception.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionCode.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionMessageIsOrContains.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionMessageMatchesRegularExpression.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/DirectoryExists.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/FileExists.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/IsReadable.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/IsWritable.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsAnything.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Math/IsFinite.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Math/IsInfinite.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Math/IsNan.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Object/ObjectEquals.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Object/ObjectHasProperty.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Operator/BinaryOperator.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalAnd.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalNot.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalOr.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalXor.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Operator/Operator.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Operator/UnaryOperator.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/String/IsJson.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/String/RegularExpression.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/String/StringContains.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/String/StringEndsWith.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/String/StringEqualsStringIgnoringLineEndings.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/String/StringMatchesFormatDescription.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/String/StringStartsWith.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/ArrayHasKey.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/IsList.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContains.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsEqual.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsIdentical.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsOnly.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Type/IsInstanceOf.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Type/IsNull.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Type/IsType.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/DataProviderTestSuite.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/AssertionFailedError.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/CodeCoverageException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/EmptyStringException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/Exception.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/ExpectationFailedException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/GeneratorNotSupportedException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/Incomplete/IncompleteTest.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/Incomplete/IncompleteTestError.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/InvalidArgumentException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/InvalidCoversTargetException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/InvalidDataProviderException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/InvalidDependencyException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/NoChildTestSuiteException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ActualValueIsNotAnObjectException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotAcceptParameterTypeException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotDeclareBoolReturnTypeException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotDeclareExactlyOneParameterException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotDeclareParameterTypeException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotExistException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/PhptAssertionFailedError.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/ProcessIsolationException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/Skipped/SkippedTest.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/Skipped/SkippedTestSuiteError.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/Skipped/SkippedWithMessageException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/UnknownClassOrInterfaceException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/UnknownTypeException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/ExecutionOrderDependency.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/ConfigurableMethod.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Exception/BadMethodCallException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Exception/CannotUseOnlyMethodsException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Exception/Exception.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Exception/IncompatibleReturnValueException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MatchBuilderNotFoundException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MatcherAlreadyRegisteredException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MethodCannotBeConfiguredException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MethodNameAlreadyConfiguredException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MethodNameNotConfiguredException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MethodParametersAlreadyConfiguredException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Exception/NeverReturningMethodException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Exception/NoMoreReturnValuesConfiguredException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Exception/ReturnValueNotConfiguredException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Exception/RuntimeException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/CannotUseAddMethodsException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ClassIsEnumerationException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ClassIsFinalException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ClassIsReadonlyException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/DuplicateMethodException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/Exception.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/InvalidMethodNameException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/NameAlreadyInUseException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/OriginalConstructorInvocationRequiredException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ReflectionException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/RuntimeException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/SoapExtensionNotAvailableException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/UnknownClassException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/UnknownTraitException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/UnknownTypeException.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Generator.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/MockClass.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/MockMethod.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/MockMethodSet.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/MockTrait.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/MockType.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/TemplateLoader.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/deprecation.tpl delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/doubled_method.tpl delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/doubled_static_method.tpl delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/intersection.tpl delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/proxied_method.tpl delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/test_double_class.tpl delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/trait_class.tpl delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/wsdl_class.tpl delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/wsdl_method.tpl delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/DoubledCloneMethod.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/Method.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/MockObjectApi.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/ProxiedCloneMethod.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/StubApi.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/Identity.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/InvocationMocker.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/InvocationStubber.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/MethodNameMatch.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/ParametersMatch.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/Stub.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/MockObject.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/MockObjectInternal.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/Stub.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/StubInternal.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Invocation.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/InvocationHandler.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Matcher.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/MethodNameConstraint.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/ReturnValueGenerator.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/AnyInvokedCount.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/AnyParameters.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvocationOrder.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedAtLeastCount.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedAtLeastOnce.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedAtMostCount.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedCount.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/MethodName.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/Parameters.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/ParametersRule.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ConsecutiveCalls.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/Exception.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnArgument.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnCallback.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnReference.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnSelf.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnStub.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnValueMap.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/Stub.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Reorderable.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/SelfDescribing.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/Test.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/TestBuilder.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/TestCase.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/TestRunner.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/TestSize/Known.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/TestSize/Large.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/TestSize/Medium.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/TestSize/Small.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/TestSize/TestSize.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/TestSize/Unknown.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/TestStatus/Deprecation.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/TestStatus/Error.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/TestStatus/Failure.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/TestStatus/Incomplete.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/TestStatus/Known.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/TestStatus/Notice.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/TestStatus/Risky.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/TestStatus/Skipped.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/TestStatus/Success.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/TestStatus/TestStatus.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/TestStatus/Unknown.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/TestStatus/Warning.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/TestSuite.php delete mode 100644 vendor/phpunit/phpunit/src/Framework/TestSuiteIterator.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/EventLogger.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/JUnit/JunitXmlLogger.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/Subscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestErroredSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestFailedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestFinishedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestMarkedIncompleteSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparationFailedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparationStartedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPrintedUnexpectedOutputSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestRunnerExecutionFinishedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestSkippedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestSuiteFinishedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestSuiteStartedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/Subscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestConsideredRiskySubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestErroredSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestFailedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestFinishedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestMarkedIncompleteSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestPreparedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestRunnerExecutionFinishedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSkippedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteBeforeFirstTestMethodErroredSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteFinishedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteSkippedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteStartedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/TeamCity/TeamCityLogger.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/HtmlRenderer.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/NamePrettifier.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/PlainTextRenderer.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/Subscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestConsideredRiskySubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestErroredSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestFailedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestFinishedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestMarkedIncompleteSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestPassedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestPreparedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestSkippedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredDeprecationSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredNoticeSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpDeprecationSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpNoticeSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpWarningSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpunitDeprecationSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpunitErrorSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpunitWarningSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredWarningSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResult.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollection.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollectionIterator.php delete mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollector.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/After.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/AfterClass.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/Api/CodeCoverage.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/Api/DataProvider.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/Api/Dependencies.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/Api/Groups.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/Api/HookMethods.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/Api/Requirements.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/BackupGlobals.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/BackupStaticProperties.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/Before.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/BeforeClass.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/Covers.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/CoversClass.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/CoversDefaultClass.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/CoversFunction.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/CoversNothing.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/DataProvider.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/DependsOnClass.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/DependsOnMethod.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/DoesNotPerformAssertions.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/Exception/AnnotationsAreNotSupportedForInternalClassesException.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/Exception/Exception.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/Exception/InvalidAttributeException.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/Exception/InvalidVersionRequirementException.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/Exception/NoVersionRequirementException.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/Exception/ReflectionException.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/ExcludeGlobalVariableFromBackup.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/ExcludeStaticPropertyFromBackup.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/Group.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/IgnoreClassForCodeCoverage.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/IgnoreDeprecations.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/IgnoreFunctionForCodeCoverage.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/IgnoreMethodForCodeCoverage.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/Metadata.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/MetadataCollection.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/MetadataCollectionIterator.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/Parser/Annotation/DocBlock.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/Parser/Annotation/Registry.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/Parser/AnnotationParser.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/Parser/AttributeParser.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/Parser/CachingParser.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/Parser/Parser.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/Parser/ParserChain.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/Parser/Registry.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/PostCondition.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/PreCondition.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/PreserveGlobalState.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/RequiresFunction.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/RequiresMethod.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/RequiresOperatingSystem.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/RequiresOperatingSystemFamily.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/RequiresPhp.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/RequiresPhpExtension.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/RequiresPhpunit.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/RequiresSetting.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/RunClassInSeparateProcess.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/RunInSeparateProcess.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/RunTestsInSeparateProcesses.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/Test.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/TestDox.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/TestWith.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/Uses.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/UsesClass.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/UsesDefaultClass.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/UsesFunction.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/Version/ComparisonRequirement.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/Version/ConstraintRequirement.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/Version/Requirement.php delete mode 100644 vendor/phpunit/phpunit/src/Metadata/WithoutErrorHandler.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Baseline/Baseline.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Baseline/Exception/CannotLoadBaselineException.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Baseline/Exception/FileDoesNotHaveLineException.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Baseline/Generator.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Baseline/Issue.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Baseline/Reader.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Baseline/RelativePathCalculator.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/Subscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredDeprecationSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredNoticeSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredPhpDeprecationSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredPhpNoticeSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredPhpWarningSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredWarningSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Baseline/Writer.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/CodeCoverage.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/ErrorHandler.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Exception/ClassCannotBeFoundException.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Exception/ClassDoesNotExtendTestCaseException.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Exception/ClassIsAbstractException.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Exception/CodeCoverageFileExistsException.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Exception/DirectoryDoesNotExistException.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Exception/ErrorException.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Exception/Exception.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Exception/FileDoesNotExistException.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Exception/InvalidOrderException.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Exception/InvalidPhptFileException.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Exception/ParameterDoesNotExistException.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Exception/PhptExternalFileCannotBeLoadedException.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Exception/UnsupportedPhptSectionException.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Extension/Extension.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Extension/ExtensionBootstrapper.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Extension/Facade.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Extension/ParameterCollection.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Extension/PharLoader.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Filter/ExcludeGroupFilterIterator.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Filter/Factory.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Filter/IncludeGroupFilterIterator.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Filter/TestIdFilterIterator.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/GarbageCollection/GarbageCollectionHandler.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/ExecutionFinishedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/ExecutionStartedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/Subscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/TestFinishedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/PhptTestCase.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/ResultCache/DefaultResultCache.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/ResultCache/NullResultCache.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/ResultCache/ResultCache.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/ResultCache/ResultCacheHandler.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/Subscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestConsideredRiskySubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestErroredSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestFailedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestFinishedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestMarkedIncompleteSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestPreparedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestSkippedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestSuiteFinishedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestSuiteStartedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Collector.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Facade.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Issue.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/PassedTests.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/AfterTestClassMethodErroredSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/BeforeTestClassMethodErroredSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/ExecutionStartedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/Subscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestConsideredRiskySubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestErroredSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestFailedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestFinishedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestMarkedIncompleteSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestPreparedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestRunnerTriggeredDeprecationSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestRunnerTriggeredWarningSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSkippedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSuiteFinishedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSuiteSkippedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSuiteStartedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredDeprecationSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredErrorSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredNoticeSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpDeprecationSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpNoticeSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpWarningSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpunitDeprecationSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpunitErrorSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpunitWarningSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredWarningSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/TestResult.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/TestSuiteLoader.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/TestSuiteSorter.php delete mode 100644 vendor/phpunit/phpunit/src/Runner/Version.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Application.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Command/Command.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Command/Commands/AtLeastVersionCommand.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Command/Commands/CheckPhpConfigurationCommand.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Command/Commands/GenerateConfigurationCommand.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Command/Commands/ListGroupsCommand.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Command/Commands/ListTestSuitesCommand.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Command/Commands/ListTestsAsTextCommand.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Command/Commands/ListTestsAsXmlCommand.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Command/Commands/MigrateConfigurationCommand.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Command/Commands/ShowHelpCommand.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Command/Commands/ShowVersionCommand.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Command/Commands/VersionCheckCommand.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Command/Commands/WarmCodeCoverageCacheCommand.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Command/Result.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Builder.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Cli/Builder.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Cli/Configuration.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Cli/Exception.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Cli/XmlConfigurationFileFinder.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/CodeCoverageFilterRegistry.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Configuration.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/CannotFindSchemaException.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/CodeCoverageReportNotConfiguredException.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/ConfigurationCannotBeBuiltException.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/Exception.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/FilterNotConfiguredException.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/LoggingNotConfiguredException.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoBaselineException.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoBootstrapException.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCacheDirectoryException.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCliArgumentException.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoConfigurationFileException.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCoverageCacheDirectoryException.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCustomCssFileException.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoDefaultTestSuiteException.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoPharExtensionDirectoryException.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Merger.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/PhpHandler.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Registry.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/SourceFilter.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/SourceMapper.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/TestSuiteBuilder.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/Constant.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/ConstantCollection.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/ConstantCollectionIterator.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/Directory.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/DirectoryCollection.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/DirectoryCollectionIterator.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/ExtensionBootstrap.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/ExtensionBootstrapCollection.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/ExtensionBootstrapCollectionIterator.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/File.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/FileCollection.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/FileCollectionIterator.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/FilterDirectory.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/FilterDirectoryCollection.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/FilterDirectoryCollectionIterator.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/Group.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/GroupCollection.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/GroupCollectionIterator.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/IniSetting.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/IniSettingCollection.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/IniSettingCollectionIterator.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/Php.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/Source.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestDirectory.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestDirectoryCollection.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestDirectoryCollectionIterator.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestFile.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestFileCollection.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestFileCollectionIterator.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestSuite.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestSuiteCollection.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestSuiteCollectionIterator.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/Variable.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/VariableCollection.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/VariableCollectionIterator.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/CodeCoverage.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Clover.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Cobertura.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Crap4j.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Html.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Php.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Text.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Xml.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Configuration.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/DefaultConfiguration.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Exception.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Generator.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Groups.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/LoadedFromFileConfiguration.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Loader.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/Junit.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/Logging.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/TeamCity.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/TestDox/Html.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/TestDox/Text.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/MigrationBuilder.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/MigrationException.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/ConvertLogTypes.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageCloverToReport.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageCrap4jToReport.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageHtmlToReport.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoveragePhpToReport.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageTextToReport.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageXmlToReport.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/IntroduceCacheDirectoryAttribute.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/IntroduceCoverageElement.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/LogToReportMigration.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/Migration.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveAttributesFromFilterWhitelistToCoverage.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveAttributesFromRootToCoverage.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveCoverageDirectoriesToSource.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveWhitelistExcludesToCoverage.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveWhitelistIncludesToCoverage.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveBeStrictAboutResourceUsageDuringSmallTestsAttribute.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveBeStrictAboutTodoAnnotatedTestsAttribute.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCacheResultFileAttribute.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCacheTokensAttribute.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveConversionToExceptionsAttributes.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCoverageElementCacheDirectoryAttribute.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCoverageElementProcessUncoveredFilesAttribute.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveEmptyFilter.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveListeners.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveLogTypes.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveLoggingElements.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveNoInteractionAttribute.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemovePrinterAttributes.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveTestDoxGroupsElement.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveTestSuiteLoaderAttributes.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveVerboseAttribute.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RenameBackupStaticAttributesAttribute.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RenameBeStrictAboutCoversAnnotationAttribute.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RenameForceCoversAnnotationAttribute.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/UpdateSchemaLocation.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrator.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/SnapshotNodeList.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/PHPUnit.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/FailedSchemaDetectionResult.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/SchemaDetectionResult.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/SchemaDetector.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/SuccessfulSchemaDetectionResult.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaFinder.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/TestSuiteMapper.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Validator/ValidationResult.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Validator/Validator.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Exception/CannotOpenSocketException.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Exception/Exception.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Exception/InvalidSocketException.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Exception/RuntimeException.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Exception/TestDirectoryNotFoundException.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Exception/TestFileNotFoundException.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Help.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/ProgressPrinter.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/BeforeTestClassMethodErroredSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/Subscriber.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestConsideredRiskySubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestErroredSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestFailedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestFinishedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestMarkedIncompleteSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestPreparedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestRunnerExecutionStartedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestSkippedSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredDeprecationSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredErrorSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredNoticeSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpDeprecationSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpNoticeSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpWarningSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpunitDeprecationSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpunitWarningSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredWarningSubscriber.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ResultPrinter.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/UnexpectedOutputPrinter.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Facade.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Printer/DefaultPrinter.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Printer/NullPrinter.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Printer/Printer.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/SummaryPrinter.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/TestDox/ResultPrinter.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/ShellExitCodeCalculator.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/TestRunner.php delete mode 100644 vendor/phpunit/phpunit/src/TextUI/TestSuiteFilterProcessor.php delete mode 100644 vendor/phpunit/phpunit/src/Util/Cloner.php delete mode 100644 vendor/phpunit/phpunit/src/Util/Color.php delete mode 100644 vendor/phpunit/phpunit/src/Util/Exception/Exception.php delete mode 100644 vendor/phpunit/phpunit/src/Util/Exception/InvalidDirectoryException.php delete mode 100644 vendor/phpunit/phpunit/src/Util/Exception/InvalidJsonException.php delete mode 100644 vendor/phpunit/phpunit/src/Util/Exception/InvalidVersionOperatorException.php delete mode 100644 vendor/phpunit/phpunit/src/Util/Exception/PhpProcessException.php delete mode 100644 vendor/phpunit/phpunit/src/Util/Exception/XmlException.php delete mode 100644 vendor/phpunit/phpunit/src/Util/ExcludeList.php delete mode 100644 vendor/phpunit/phpunit/src/Util/Exporter.php delete mode 100644 vendor/phpunit/phpunit/src/Util/Filesystem.php delete mode 100644 vendor/phpunit/phpunit/src/Util/Filter.php delete mode 100644 vendor/phpunit/phpunit/src/Util/GlobalState.php delete mode 100644 vendor/phpunit/phpunit/src/Util/Http/Downloader.php delete mode 100644 vendor/phpunit/phpunit/src/Util/Http/PhpDownloader.php delete mode 100644 vendor/phpunit/phpunit/src/Util/Json.php delete mode 100644 vendor/phpunit/phpunit/src/Util/PHP/AbstractPhpProcess.php delete mode 100644 vendor/phpunit/phpunit/src/Util/PHP/DefaultPhpProcess.php delete mode 100644 vendor/phpunit/phpunit/src/Util/PHP/Template/PhptTestCase.tpl delete mode 100644 vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseClass.tpl delete mode 100644 vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseMethod.tpl delete mode 100644 vendor/phpunit/phpunit/src/Util/Reflection.php delete mode 100644 vendor/phpunit/phpunit/src/Util/Test.php delete mode 100644 vendor/phpunit/phpunit/src/Util/ThrowableToStringMapper.php delete mode 100644 vendor/phpunit/phpunit/src/Util/VersionComparisonOperator.php delete mode 100644 vendor/phpunit/phpunit/src/Util/Xml/Loader.php delete mode 100644 vendor/phpunit/phpunit/src/Util/Xml/Xml.php delete mode 100644 vendor/psr/event-dispatcher/.editorconfig delete mode 100644 vendor/psr/event-dispatcher/.gitignore delete mode 100644 vendor/psr/event-dispatcher/README.md delete mode 100644 vendor/psr/event-dispatcher/composer.json delete mode 100644 vendor/sebastian/cli-parser/ChangeLog.md delete mode 100644 vendor/sebastian/cli-parser/LICENSE delete mode 100644 vendor/sebastian/cli-parser/README.md delete mode 100644 vendor/sebastian/cli-parser/SECURITY.md delete mode 100644 vendor/sebastian/cli-parser/composer.json delete mode 100644 vendor/sebastian/cli-parser/src/Parser.php delete mode 100644 vendor/sebastian/cli-parser/src/exceptions/AmbiguousOptionException.php delete mode 100644 vendor/sebastian/cli-parser/src/exceptions/Exception.php delete mode 100644 vendor/sebastian/cli-parser/src/exceptions/OptionDoesNotAllowArgumentException.php delete mode 100644 vendor/sebastian/cli-parser/src/exceptions/RequiredOptionArgumentMissingException.php delete mode 100644 vendor/sebastian/cli-parser/src/exceptions/UnknownOptionException.php delete mode 100644 vendor/sebastian/code-unit-reverse-lookup/.psalm/baseline.xml delete mode 100644 vendor/sebastian/code-unit-reverse-lookup/.psalm/config.xml delete mode 100644 vendor/sebastian/code-unit-reverse-lookup/ChangeLog.md delete mode 100644 vendor/sebastian/code-unit-reverse-lookup/LICENSE delete mode 100644 vendor/sebastian/code-unit-reverse-lookup/README.md delete mode 100644 vendor/sebastian/code-unit-reverse-lookup/SECURITY.md delete mode 100644 vendor/sebastian/code-unit-reverse-lookup/composer.json delete mode 100644 vendor/sebastian/code-unit-reverse-lookup/src/Wizard.php delete mode 100644 vendor/sebastian/code-unit/ChangeLog.md delete mode 100644 vendor/sebastian/code-unit/LICENSE delete mode 100644 vendor/sebastian/code-unit/README.md delete mode 100644 vendor/sebastian/code-unit/SECURITY.md delete mode 100644 vendor/sebastian/code-unit/composer.json delete mode 100644 vendor/sebastian/code-unit/src/ClassMethodUnit.php delete mode 100644 vendor/sebastian/code-unit/src/ClassUnit.php delete mode 100644 vendor/sebastian/code-unit/src/CodeUnit.php delete mode 100644 vendor/sebastian/code-unit/src/CodeUnitCollection.php delete mode 100644 vendor/sebastian/code-unit/src/CodeUnitCollectionIterator.php delete mode 100644 vendor/sebastian/code-unit/src/FileUnit.php delete mode 100644 vendor/sebastian/code-unit/src/FunctionUnit.php delete mode 100644 vendor/sebastian/code-unit/src/InterfaceMethodUnit.php delete mode 100644 vendor/sebastian/code-unit/src/InterfaceUnit.php delete mode 100644 vendor/sebastian/code-unit/src/Mapper.php delete mode 100644 vendor/sebastian/code-unit/src/TraitMethodUnit.php delete mode 100644 vendor/sebastian/code-unit/src/TraitUnit.php delete mode 100644 vendor/sebastian/code-unit/src/exceptions/Exception.php delete mode 100644 vendor/sebastian/code-unit/src/exceptions/InvalidCodeUnitException.php delete mode 100644 vendor/sebastian/code-unit/src/exceptions/NoTraitException.php delete mode 100644 vendor/sebastian/code-unit/src/exceptions/ReflectionException.php delete mode 100644 vendor/sebastian/comparator/ChangeLog.md delete mode 100644 vendor/sebastian/comparator/LICENSE delete mode 100644 vendor/sebastian/comparator/README.md delete mode 100644 vendor/sebastian/comparator/SECURITY.md delete mode 100644 vendor/sebastian/comparator/composer.json delete mode 100644 vendor/sebastian/comparator/src/ArrayComparator.php delete mode 100644 vendor/sebastian/comparator/src/Comparator.php delete mode 100644 vendor/sebastian/comparator/src/ComparisonFailure.php delete mode 100644 vendor/sebastian/comparator/src/DOMNodeComparator.php delete mode 100644 vendor/sebastian/comparator/src/DateTimeComparator.php delete mode 100644 vendor/sebastian/comparator/src/ExceptionComparator.php delete mode 100644 vendor/sebastian/comparator/src/Factory.php delete mode 100644 vendor/sebastian/comparator/src/MockObjectComparator.php delete mode 100644 vendor/sebastian/comparator/src/NumericComparator.php delete mode 100644 vendor/sebastian/comparator/src/ObjectComparator.php delete mode 100644 vendor/sebastian/comparator/src/ResourceComparator.php delete mode 100644 vendor/sebastian/comparator/src/ScalarComparator.php delete mode 100644 vendor/sebastian/comparator/src/SplObjectStorageComparator.php delete mode 100644 vendor/sebastian/comparator/src/TypeComparator.php delete mode 100644 vendor/sebastian/comparator/src/exceptions/Exception.php delete mode 100644 vendor/sebastian/comparator/src/exceptions/RuntimeException.php delete mode 100644 vendor/sebastian/complexity/ChangeLog.md delete mode 100644 vendor/sebastian/complexity/LICENSE delete mode 100644 vendor/sebastian/complexity/README.md delete mode 100644 vendor/sebastian/complexity/SECURITY.md delete mode 100644 vendor/sebastian/complexity/composer.json delete mode 100644 vendor/sebastian/complexity/src/Calculator.php delete mode 100644 vendor/sebastian/complexity/src/Complexity/Complexity.php delete mode 100644 vendor/sebastian/complexity/src/Complexity/ComplexityCollection.php delete mode 100644 vendor/sebastian/complexity/src/Complexity/ComplexityCollectionIterator.php delete mode 100644 vendor/sebastian/complexity/src/Exception/Exception.php delete mode 100644 vendor/sebastian/complexity/src/Exception/RuntimeException.php delete mode 100644 vendor/sebastian/complexity/src/Visitor/ComplexityCalculatingVisitor.php delete mode 100644 vendor/sebastian/complexity/src/Visitor/CyclomaticComplexityCalculatingVisitor.php delete mode 100644 vendor/sebastian/diff/ChangeLog.md delete mode 100644 vendor/sebastian/diff/LICENSE delete mode 100644 vendor/sebastian/diff/README.md delete mode 100644 vendor/sebastian/diff/SECURITY.md delete mode 100644 vendor/sebastian/diff/composer.json delete mode 100644 vendor/sebastian/diff/src/Chunk.php delete mode 100644 vendor/sebastian/diff/src/Diff.php delete mode 100644 vendor/sebastian/diff/src/Differ.php delete mode 100644 vendor/sebastian/diff/src/Exception/ConfigurationException.php delete mode 100644 vendor/sebastian/diff/src/Exception/Exception.php delete mode 100644 vendor/sebastian/diff/src/Exception/InvalidArgumentException.php delete mode 100644 vendor/sebastian/diff/src/Line.php delete mode 100644 vendor/sebastian/diff/src/LongestCommonSubsequenceCalculator.php delete mode 100644 vendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php delete mode 100644 vendor/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php delete mode 100644 vendor/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php delete mode 100644 vendor/sebastian/diff/src/Output/DiffOutputBuilderInterface.php delete mode 100644 vendor/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php delete mode 100644 vendor/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php delete mode 100644 vendor/sebastian/diff/src/Parser.php delete mode 100644 vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php delete mode 100644 vendor/sebastian/environment/ChangeLog.md delete mode 100644 vendor/sebastian/environment/LICENSE delete mode 100644 vendor/sebastian/environment/README.md delete mode 100644 vendor/sebastian/environment/SECURITY.md delete mode 100644 vendor/sebastian/environment/composer.json delete mode 100644 vendor/sebastian/environment/src/Console.php delete mode 100644 vendor/sebastian/environment/src/Runtime.php delete mode 100644 vendor/sebastian/exporter/ChangeLog.md delete mode 100644 vendor/sebastian/exporter/LICENSE delete mode 100644 vendor/sebastian/exporter/README.md delete mode 100644 vendor/sebastian/exporter/SECURITY.md delete mode 100644 vendor/sebastian/exporter/composer.json delete mode 100644 vendor/sebastian/exporter/src/Exporter.php delete mode 100644 vendor/sebastian/global-state/ChangeLog.md delete mode 100644 vendor/sebastian/global-state/LICENSE delete mode 100644 vendor/sebastian/global-state/README.md delete mode 100644 vendor/sebastian/global-state/SECURITY.md delete mode 100644 vendor/sebastian/global-state/composer.json delete mode 100644 vendor/sebastian/global-state/src/CodeExporter.php delete mode 100644 vendor/sebastian/global-state/src/ExcludeList.php delete mode 100644 vendor/sebastian/global-state/src/Restorer.php delete mode 100644 vendor/sebastian/global-state/src/Snapshot.php delete mode 100644 vendor/sebastian/global-state/src/exceptions/Exception.php delete mode 100644 vendor/sebastian/global-state/src/exceptions/RuntimeException.php delete mode 100644 vendor/sebastian/lines-of-code/ChangeLog.md delete mode 100644 vendor/sebastian/lines-of-code/LICENSE delete mode 100644 vendor/sebastian/lines-of-code/README.md delete mode 100644 vendor/sebastian/lines-of-code/SECURITY.md delete mode 100644 vendor/sebastian/lines-of-code/composer.json delete mode 100644 vendor/sebastian/lines-of-code/src/Counter.php delete mode 100644 vendor/sebastian/lines-of-code/src/Exception/Exception.php delete mode 100644 vendor/sebastian/lines-of-code/src/Exception/IllogicalValuesException.php delete mode 100644 vendor/sebastian/lines-of-code/src/Exception/NegativeValueException.php delete mode 100644 vendor/sebastian/lines-of-code/src/Exception/RuntimeException.php delete mode 100644 vendor/sebastian/lines-of-code/src/LineCountingVisitor.php delete mode 100644 vendor/sebastian/lines-of-code/src/LinesOfCode.php delete mode 100644 vendor/sebastian/object-enumerator/ChangeLog.md delete mode 100644 vendor/sebastian/object-enumerator/LICENSE delete mode 100644 vendor/sebastian/object-enumerator/README.md delete mode 100644 vendor/sebastian/object-enumerator/SECURITY.md delete mode 100644 vendor/sebastian/object-enumerator/composer.json delete mode 100644 vendor/sebastian/object-enumerator/phpunit.xml delete mode 100644 vendor/sebastian/object-enumerator/src/Enumerator.php delete mode 100644 vendor/sebastian/object-reflector/ChangeLog.md delete mode 100644 vendor/sebastian/object-reflector/LICENSE delete mode 100644 vendor/sebastian/object-reflector/README.md delete mode 100644 vendor/sebastian/object-reflector/SECURITY.md delete mode 100644 vendor/sebastian/object-reflector/composer.json delete mode 100644 vendor/sebastian/object-reflector/src/ObjectReflector.php delete mode 100644 vendor/sebastian/recursion-context/ChangeLog.md delete mode 100644 vendor/sebastian/recursion-context/LICENSE delete mode 100644 vendor/sebastian/recursion-context/README.md delete mode 100644 vendor/sebastian/recursion-context/SECURITY.md delete mode 100644 vendor/sebastian/recursion-context/composer.json delete mode 100644 vendor/sebastian/recursion-context/src/Context.php delete mode 100644 vendor/sebastian/type/ChangeLog.md delete mode 100644 vendor/sebastian/type/LICENSE delete mode 100644 vendor/sebastian/type/README.md delete mode 100644 vendor/sebastian/type/SECURITY.md delete mode 100644 vendor/sebastian/type/composer.json delete mode 100644 vendor/sebastian/type/infection.json delete mode 100644 vendor/sebastian/type/src/Parameter.php delete mode 100644 vendor/sebastian/type/src/ReflectionMapper.php delete mode 100644 vendor/sebastian/type/src/TypeName.php delete mode 100644 vendor/sebastian/type/src/exception/Exception.php delete mode 100644 vendor/sebastian/type/src/exception/RuntimeException.php delete mode 100644 vendor/sebastian/type/src/type/CallableType.php delete mode 100644 vendor/sebastian/type/src/type/FalseType.php delete mode 100644 vendor/sebastian/type/src/type/GenericObjectType.php delete mode 100644 vendor/sebastian/type/src/type/IntersectionType.php delete mode 100644 vendor/sebastian/type/src/type/IterableType.php delete mode 100644 vendor/sebastian/type/src/type/MixedType.php delete mode 100644 vendor/sebastian/type/src/type/NeverType.php delete mode 100644 vendor/sebastian/type/src/type/NullType.php delete mode 100644 vendor/sebastian/type/src/type/ObjectType.php delete mode 100644 vendor/sebastian/type/src/type/SimpleType.php delete mode 100644 vendor/sebastian/type/src/type/StaticType.php delete mode 100644 vendor/sebastian/type/src/type/TrueType.php delete mode 100644 vendor/sebastian/type/src/type/Type.php delete mode 100644 vendor/sebastian/type/src/type/UnionType.php delete mode 100644 vendor/sebastian/type/src/type/UnknownType.php delete mode 100644 vendor/sebastian/type/src/type/VoidType.php delete mode 100644 vendor/sebastian/version/ChangeLog.md delete mode 100644 vendor/sebastian/version/LICENSE delete mode 100644 vendor/sebastian/version/README.md delete mode 100644 vendor/sebastian/version/SECURITY.md delete mode 100644 vendor/sebastian/version/composer.json delete mode 100644 vendor/sebastian/version/src/Version.php delete mode 100644 vendor/squizlabs/php_codesniffer/CHANGELOG.md delete mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer.conf delete mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer.conf.dist delete mode 100644 vendor/squizlabs/php_codesniffer/README.md delete mode 100644 vendor/squizlabs/php_codesniffer/autoload.php delete mode 100644 vendor/squizlabs/php_codesniffer/bin/phpcbf delete mode 100644 vendor/squizlabs/php_codesniffer/bin/phpcbf.bat delete mode 100644 vendor/squizlabs/php_codesniffer/bin/phpcs delete mode 100644 vendor/squizlabs/php_codesniffer/bin/phpcs.bat delete mode 100644 vendor/squizlabs/php_codesniffer/composer.json delete mode 100644 vendor/squizlabs/php_codesniffer/licence.txt delete mode 100644 vendor/squizlabs/php_codesniffer/phpcs.xsd delete mode 100644 vendor/squizlabs/php_codesniffer/src/Config.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Exceptions/DeepExitException.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Exceptions/RuntimeException.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Exceptions/TokenizerException.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Files/DummyFile.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Files/File.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Files/FileList.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Files/LocalFile.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Filters/ExactMatch.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Filters/Filter.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Filters/GitModified.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Filters/GitStaged.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Fixer.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Generators/Generator.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Generators/HTML.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Generators/Markdown.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Generators/Text.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reporter.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reports/Cbf.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reports/Checkstyle.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reports/Code.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reports/Csv.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reports/Diff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reports/Emacs.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reports/Full.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reports/Gitblame.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reports/Hgblame.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reports/Info.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reports/Json.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reports/Junit.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reports/Notifysend.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reports/Performance.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reports/Report.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reports/Source.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reports/Summary.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reports/Svnblame.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reports/VersionControl.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Reports/Xml.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Ruleset.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Runner.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Sniffs/AbstractArraySniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Sniffs/AbstractPatternSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Sniffs/AbstractScopeSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Sniffs/AbstractVariableSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Sniffs/DeprecatedSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Sniffs/Sniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Arrays/ArrayIndentStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Arrays/DisallowLongArraySyntaxStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Arrays/DisallowShortArraySyntaxStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Classes/DuplicateClassNameStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Classes/OpeningBraceSameLineStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/AssignmentInConditionStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/EmptyPHPStatementStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/EmptyStatementStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/ForLoopShouldBeWhileLoopStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/ForLoopWithTestFunctionCallStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/JumbledIncrementerStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/RequireExplicitBooleanOperatorPrecedenceStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/UnconditionalIfStatementStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/UnnecessaryFinalModifierStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/UnusedFunctionParameterStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/UselessOverridingMethodStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Commenting/DocCommentStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Commenting/FixmeStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Commenting/TodoStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/ControlStructures/DisallowYodaConditionsStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/ControlStructures/InlineControlStructureStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Debug/CSSLintStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Debug/ClosureLinterStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Debug/JSHintStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/ByteOrderMarkStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/EndFileNewlineStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/EndFileNoNewlineStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/ExecutableFileStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/InlineHTMLStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/LineEndingsStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/LineLengthStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/LowercasedFilenameStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/OneClassPerFileStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/OneInterfacePerFileStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/OneObjectStructurePerFileStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/OneTraitPerFileStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/DisallowMultipleStatementsStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/MultipleStatementAlignmentStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/NoSpaceAfterCastStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/SpaceAfterCastStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/SpaceAfterNotStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/SpaceBeforeCastStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Functions/CallTimePassByReferenceStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Functions/FunctionCallArgumentSpacingStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Functions/OpeningFunctionBraceBsdAllmanStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Functions/OpeningFunctionBraceKernighanRitchieStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Metrics/CyclomaticComplexityStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Metrics/NestingLevelStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/NamingConventions/AbstractClassNamePrefixStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/NamingConventions/CamelCapsFunctionNameStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/NamingConventions/ConstructorNameStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/NamingConventions/InterfaceNameSuffixStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/NamingConventions/TraitNameSuffixStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/NamingConventions/UpperCaseConstantNameStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/BacktickOperatorStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/CharacterBeforePHPOpeningTagStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/ClosingPHPTagStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DeprecatedFunctionsStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DisallowAlternativePHPTagsStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DisallowRequestSuperglobalStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DisallowShortOpenTagStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DiscourageGotoStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/ForbiddenFunctionsStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/LowerCaseConstantStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/LowerCaseKeywordStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/LowerCaseTypeStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/NoSilencedErrorsStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/RequireStrictTypesStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/SAPIUsageStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/SyntaxStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/UpperCaseConstantStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Strings/UnnecessaryHeredocStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Strings/UnnecessaryStringConcatStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/VersionControl/SubversionPropertiesStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/ArbitraryParenthesesSpacingStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/DisallowSpaceIndentStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/DisallowTabIndentStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/HereNowdocIdentifierSpacingStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/IncrementDecrementSpacingStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/LanguageConstructSpacingStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/ScopeIndentStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/SpreadOperatorSpacingAfterStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Arrays/ArrayIndentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Arrays/DisallowLongArraySyntaxSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Arrays/DisallowShortArraySyntaxSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Classes/DuplicateClassNameSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Classes/OpeningBraceSameLineSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/AssignmentInConditionSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/EmptyPHPStatementSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/EmptyStatementSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/ForLoopShouldBeWhileLoopSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/ForLoopWithTestFunctionCallSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/JumbledIncrementerSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/RequireExplicitBooleanOperatorPrecedenceSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/UnconditionalIfStatementSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/UnnecessaryFinalModifierSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/UnusedFunctionParameterSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/UselessOverridingMethodSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Commenting/DocCommentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Commenting/FixmeSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Commenting/TodoSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/ControlStructures/DisallowYodaConditionsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/ControlStructures/InlineControlStructureSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Debug/CSSLintSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Debug/ClosureLinterSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Debug/ESLintSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Debug/JSHintSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/ByteOrderMarkSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/EndFileNewlineSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/EndFileNoNewlineSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/ExecutableFileSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/InlineHTMLSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/LineEndingsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/LineLengthSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/LowercasedFilenameSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/OneClassPerFileSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/OneInterfacePerFileSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/OneObjectStructurePerFileSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/OneTraitPerFileSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/DisallowMultipleStatementsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/MultipleStatementAlignmentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/NoSpaceAfterCastSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/SpaceAfterCastSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/SpaceAfterNotSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/SpaceBeforeCastSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Functions/CallTimePassByReferenceSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Functions/FunctionCallArgumentSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Functions/OpeningFunctionBraceBsdAllmanSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Functions/OpeningFunctionBraceKernighanRitchieSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Metrics/CyclomaticComplexitySniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Metrics/NestingLevelSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/NamingConventions/AbstractClassNamePrefixSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/NamingConventions/CamelCapsFunctionNameSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/NamingConventions/ConstructorNameSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/NamingConventions/InterfaceNameSuffixSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/NamingConventions/TraitNameSuffixSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/NamingConventions/UpperCaseConstantNameSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/BacktickOperatorSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/CharacterBeforePHPOpeningTagSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/ClosingPHPTagSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/DeprecatedFunctionsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/DisallowAlternativePHPTagsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/DisallowRequestSuperglobalSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/DisallowShortOpenTagSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/DiscourageGotoSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/ForbiddenFunctionsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/LowerCaseConstantSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/LowerCaseKeywordSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/LowerCaseTypeSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/NoSilencedErrorsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/RequireStrictTypesSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/SAPIUsageSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/SyntaxSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/UpperCaseConstantSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Strings/UnnecessaryHeredocSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Strings/UnnecessaryStringConcatSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/VersionControl/GitMergeConflictSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/VersionControl/SubversionPropertiesSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/WhiteSpace/ArbitraryParenthesesSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/WhiteSpace/DisallowSpaceIndentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/WhiteSpace/DisallowTabIndentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/WhiteSpace/HereNowdocIdentifierSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/WhiteSpace/IncrementDecrementSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/WhiteSpace/LanguageConstructSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/WhiteSpace/ScopeIndentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/WhiteSpace/SpreadOperatorSpacingAfterSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Arrays/ArrayIndentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Arrays/ArrayIndentUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Arrays/ArrayIndentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Arrays/DisallowLongArraySyntaxUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Arrays/DisallowLongArraySyntaxUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Arrays/DisallowLongArraySyntaxUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Arrays/DisallowLongArraySyntaxUnitTest.2.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Arrays/DisallowLongArraySyntaxUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Arrays/DisallowLongArraySyntaxUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Arrays/DisallowShortArraySyntaxUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Arrays/DisallowShortArraySyntaxUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Arrays/DisallowShortArraySyntaxUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Classes/DuplicateClassNameUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Classes/DuplicateClassNameUnitTest.10.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Classes/DuplicateClassNameUnitTest.11.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Classes/DuplicateClassNameUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Classes/DuplicateClassNameUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Classes/DuplicateClassNameUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Classes/DuplicateClassNameUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Classes/DuplicateClassNameUnitTest.6.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Classes/DuplicateClassNameUnitTest.7.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Classes/DuplicateClassNameUnitTest.8.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Classes/DuplicateClassNameUnitTest.9.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Classes/DuplicateClassNameUnitTest.97.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Classes/DuplicateClassNameUnitTest.98.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Classes/DuplicateClassNameUnitTest.99.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Classes/DuplicateClassNameUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Classes/OpeningBraceSameLineUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Classes/OpeningBraceSameLineUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Classes/OpeningBraceSameLineUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/AssignmentInConditionUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/AssignmentInConditionUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/AssignmentInConditionUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/AssignmentInConditionUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/AssignmentInConditionUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/AssignmentInConditionUnitTest.6.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/AssignmentInConditionUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/EmptyPHPStatementUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/EmptyPHPStatementUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/EmptyPHPStatementUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/EmptyPHPStatementUnitTest.2.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/EmptyPHPStatementUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/EmptyStatementUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/EmptyStatementUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/ForLoopShouldBeWhileLoopUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/ForLoopShouldBeWhileLoopUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/ForLoopShouldBeWhileLoopUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/ForLoopShouldBeWhileLoopUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/ForLoopWithTestFunctionCallUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/ForLoopWithTestFunctionCallUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/ForLoopWithTestFunctionCallUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/ForLoopWithTestFunctionCallUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/JumbledIncrementerUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/JumbledIncrementerUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/JumbledIncrementerUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/JumbledIncrementerUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/JumbledIncrementerUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/RequireExplicitBooleanOperatorPrecedenceUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/RequireExplicitBooleanOperatorPrecedenceUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/UnconditionalIfStatementUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/UnconditionalIfStatementUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/UnconditionalIfStatementUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/UnnecessaryFinalModifierUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/UnnecessaryFinalModifierUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/UnnecessaryFinalModifierUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/UnusedFunctionParameterUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/UnusedFunctionParameterUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/UnusedFunctionParameterUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/UnusedFunctionParameterUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/UselessOverridingMethodUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/UselessOverridingMethodUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/UselessOverridingMethodUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/UselessOverridingMethodUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/UselessOverridingMethodUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/UselessOverridingMethodUnitTest.6.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/CodeAnalysis/UselessOverridingMethodUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Commenting/DocCommentUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Commenting/DocCommentUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Commenting/DocCommentUnitTest.1.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Commenting/DocCommentUnitTest.1.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Commenting/DocCommentUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Commenting/DocCommentUnitTest.2.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Commenting/DocCommentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Commenting/FixmeUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Commenting/FixmeUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Commenting/FixmeUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Commenting/TodoUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Commenting/TodoUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Commenting/TodoUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/ControlStructures/DisallowYodaConditionsUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/ControlStructures/DisallowYodaConditionsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/ControlStructures/InlineControlStructureUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/ControlStructures/InlineControlStructureUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/ControlStructures/InlineControlStructureUnitTest.1.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/ControlStructures/InlineControlStructureUnitTest.1.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/ControlStructures/InlineControlStructureUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/ControlStructures/InlineControlStructureUnitTest.2.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/ControlStructures/InlineControlStructureUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/ControlStructures/InlineControlStructureUnitTest.3.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/ControlStructures/InlineControlStructureUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/ControlStructures/InlineControlStructureUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/ControlStructures/InlineControlStructureUnitTest.6.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/ControlStructures/InlineControlStructureUnitTest.7.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/ControlStructures/InlineControlStructureUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Debug/CSSLintUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Debug/CSSLintUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Debug/ClosureLinterUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Debug/ClosureLinterUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Debug/ESLintUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Debug/ESLintUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Debug/JSHintUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Debug/JSHintUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/ByteOrderMarkUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/ByteOrderMarkUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/ByteOrderMarkUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/ByteOrderMarkUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/ByteOrderMarkUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/ByteOrderMarkUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNewlineUnitTest.1.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNewlineUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNewlineUnitTest.1.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNewlineUnitTest.2.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNewlineUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNewlineUnitTest.2.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNewlineUnitTest.3.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNewlineUnitTest.3.css.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNewlineUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNewlineUnitTest.3.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNewlineUnitTest.3.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNewlineUnitTest.3.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNewlineUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNewlineUnitTest.4.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNewlineUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNewlineUnitTest.6.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNewlineUnitTest.6.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNewlineUnitTest.7.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNewlineUnitTest.7.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNewlineUnitTest.8.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNewlineUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.1.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.1.css.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.1.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.1.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.10.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.2.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.2.css.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.2.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.2.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.2.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.3.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.3.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.6.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.6.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.7.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.8.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.8.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.9.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.9.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/EndFileNoNewlineUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/ExecutableFileUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/ExecutableFileUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/ExecutableFileUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/ExecutableFileUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/ExecutableFileUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/InlineHTMLUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/InlineHTMLUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/InlineHTMLUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/InlineHTMLUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/InlineHTMLUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/InlineHTMLUnitTest.6.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/InlineHTMLUnitTest.7.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/InlineHTMLUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/LineEndingsUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/LineEndingsUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/LineEndingsUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/LineEndingsUnitTest.2.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/LineEndingsUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/LineEndingsUnitTest.css.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/LineEndingsUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/LineEndingsUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/LineEndingsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/LineLengthUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/LineLengthUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/LineLengthUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/LineLengthUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/LineLengthUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/LowercasedFilenameUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/LowercasedFilenameUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/LowercasedFilenameUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/OneClassPerFileUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/OneClassPerFileUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/OneInterfacePerFileUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/OneInterfacePerFileUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/OneObjectStructurePerFileUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/OneObjectStructurePerFileUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/OneTraitPerFileUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/OneTraitPerFileUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Files/lowercased_filename_unit_test.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/DisallowMultipleStatementsUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/DisallowMultipleStatementsUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/DisallowMultipleStatementsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/MultipleStatementAlignmentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/MultipleStatementAlignmentUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/MultipleStatementAlignmentUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/MultipleStatementAlignmentUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/MultipleStatementAlignmentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/NoSpaceAfterCastUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/NoSpaceAfterCastUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/NoSpaceAfterCastUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/SpaceAfterCastUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/SpaceAfterCastUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/SpaceAfterCastUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/SpaceAfterCastUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/SpaceAfterNotUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/SpaceAfterNotUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/SpaceAfterNotUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/SpaceAfterNotUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/SpaceAfterNotUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/SpaceAfterNotUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/SpaceBeforeCastUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/SpaceBeforeCastUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Formatting/SpaceBeforeCastUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Functions/CallTimePassByReferenceUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Functions/CallTimePassByReferenceUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Functions/CallTimePassByReferenceUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Functions/CallTimePassByReferenceUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Functions/FunctionCallArgumentSpacingUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Functions/FunctionCallArgumentSpacingUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Functions/FunctionCallArgumentSpacingUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Functions/FunctionCallArgumentSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Functions/OpeningFunctionBraceBsdAllmanUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Functions/OpeningFunctionBraceBsdAllmanUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Functions/OpeningFunctionBraceBsdAllmanUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Functions/OpeningFunctionBraceKernighanRitchieUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Functions/OpeningFunctionBraceKernighanRitchieUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Functions/OpeningFunctionBraceKernighanRitchieUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Functions/OpeningFunctionBraceKernighanRitchieUnitTest.2.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Functions/OpeningFunctionBraceKernighanRitchieUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Functions/OpeningFunctionBraceKernighanRitchieUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Metrics/CyclomaticComplexityUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Metrics/CyclomaticComplexityUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Metrics/CyclomaticComplexityUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Metrics/CyclomaticComplexityUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Metrics/NestingLevelUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Metrics/NestingLevelUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Metrics/NestingLevelUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Metrics/NestingLevelUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/NamingConventions/AbstractClassNamePrefixUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/NamingConventions/AbstractClassNamePrefixUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/NamingConventions/AbstractClassNamePrefixUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/NamingConventions/CamelCapsFunctionNameUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/NamingConventions/CamelCapsFunctionNameUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/NamingConventions/CamelCapsFunctionNameUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/NamingConventions/CamelCapsFunctionNameUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/NamingConventions/ConstructorNameUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/NamingConventions/ConstructorNameUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/NamingConventions/ConstructorNameUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/NamingConventions/InterfaceNameSuffixUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/NamingConventions/InterfaceNameSuffixUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/NamingConventions/InterfaceNameSuffixUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/NamingConventions/TraitNameSuffixUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/NamingConventions/TraitNameSuffixUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/NamingConventions/TraitNameSuffixUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/NamingConventions/UpperCaseConstantNameUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/NamingConventions/UpperCaseConstantNameUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/NamingConventions/UpperCaseConstantNameUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/NamingConventions/UpperCaseConstantNameUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/NamingConventions/UpperCaseConstantNameUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/NamingConventions/UpperCaseConstantNameUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/BacktickOperatorUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/BacktickOperatorUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/CharacterBeforePHPOpeningTagUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/CharacterBeforePHPOpeningTagUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/CharacterBeforePHPOpeningTagUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/CharacterBeforePHPOpeningTagUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/ClosingPHPTagUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/ClosingPHPTagUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/ClosingPHPTagUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DeprecatedFunctionsUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DeprecatedFunctionsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.2.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowRequestSuperglobalUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowRequestSuperglobalUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.2.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DiscourageGotoUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DiscourageGotoUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/ForbiddenFunctionsUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/ForbiddenFunctionsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseConstantUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseConstantUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseConstantUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseConstantUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseConstantUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseConstantUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseKeywordUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseKeywordUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseKeywordUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseTypeUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseTypeUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseTypeUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/NoSilencedErrorsUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/NoSilencedErrorsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/RequireStrictTypesUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/RequireStrictTypesUnitTest.10.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/RequireStrictTypesUnitTest.11.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/RequireStrictTypesUnitTest.11.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/RequireStrictTypesUnitTest.12.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/RequireStrictTypesUnitTest.12.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/RequireStrictTypesUnitTest.13.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/RequireStrictTypesUnitTest.14.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/RequireStrictTypesUnitTest.14.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/RequireStrictTypesUnitTest.15.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/RequireStrictTypesUnitTest.15.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/RequireStrictTypesUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/RequireStrictTypesUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/RequireStrictTypesUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/RequireStrictTypesUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/RequireStrictTypesUnitTest.6.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/RequireStrictTypesUnitTest.7.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/RequireStrictTypesUnitTest.8.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/RequireStrictTypesUnitTest.9.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/RequireStrictTypesUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/SAPIUsageUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/SAPIUsageUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/SyntaxUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/SyntaxUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/SyntaxUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/UpperCaseConstantUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/UpperCaseConstantUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/UpperCaseConstantUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Strings/UnnecessaryHeredocUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Strings/UnnecessaryHeredocUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Strings/UnnecessaryHeredocUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Strings/UnnecessaryHeredocUnitTest.2.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Strings/UnnecessaryHeredocUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Strings/UnnecessaryHeredocUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Strings/UnnecessaryStringConcatUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Strings/UnnecessaryStringConcatUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Strings/UnnecessaryStringConcatUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Strings/UnnecessaryStringConcatUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.1.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.2.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.6.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.7.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/SubversionPropertiesUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/SubversionPropertiesUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ArbitraryParenthesesSpacingUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ArbitraryParenthesesSpacingUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ArbitraryParenthesesSpacingUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ArbitraryParenthesesSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowSpaceIndentUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowSpaceIndentUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowSpaceIndentUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowSpaceIndentUnitTest.2.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowSpaceIndentUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowSpaceIndentUnitTest.3.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowSpaceIndentUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowSpaceIndentUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowSpaceIndentUnitTest.css.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowSpaceIndentUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowSpaceIndentUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowSpaceIndentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowTabIndentUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowTabIndentUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowTabIndentUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowTabIndentUnitTest.2.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowTabIndentUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowTabIndentUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowTabIndentUnitTest.css.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowTabIndentUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowTabIndentUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowTabIndentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/HereNowdocIdentifierSpacingUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/HereNowdocIdentifierSpacingUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/HereNowdocIdentifierSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/LanguageConstructSpacingUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/LanguageConstructSpacingUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/LanguageConstructSpacingUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/LanguageConstructSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.1.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.1.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.2.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.3.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/SpreadOperatorSpacingAfterUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/SpreadOperatorSpacingAfterUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/SpreadOperatorSpacingAfterUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/SpreadOperatorSpacingAfterUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Generic/ruleset.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/CSS/BrowserSpecificStylesSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Channels/DisallowSelfActionsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Channels/IncludeOwnSystemSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Channels/IncludeSystemSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Channels/UnusedSystemSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Commenting/FunctionCommentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Debug/DebugCodeSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Debug/FirebugConsoleSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Objects/AssignThisSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Objects/CreateWidgetTypeCallbackSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Objects/DisallowNewWidgetSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/PHP/AjaxNullComparisonSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/PHP/EvalObjectFactorySniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/PHP/GetRequestDataSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/PHP/ReturnFunctionValueSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Strings/JoinStringsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/CSS/BrowserSpecificStylesUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/CSS/BrowserSpecificStylesUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/DisallowSelfActionsUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/DisallowSelfActionsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/IncludeSystemUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/IncludeSystemUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/UnusedSystemUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/UnusedSystemUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Commenting/FunctionCommentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Commenting/FunctionCommentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Debug/DebugCodeUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Debug/DebugCodeUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Debug/FirebugConsoleUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Debug/FirebugConsoleUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/AssignThisUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/AssignThisUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/CreateWidgetTypeCallbackUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/CreateWidgetTypeCallbackUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/DisallowNewWidgetUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/DisallowNewWidgetUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/AjaxNullComparisonUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/AjaxNullComparisonUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/EvalObjectFactoryUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/EvalObjectFactoryUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/GetRequestDataUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/GetRequestDataUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/ReturnFunctionValueUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/ReturnFunctionValueUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Strings/JoinStringsUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Strings/JoinStringsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/MySource/ruleset.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Classes/ClassDeclarationStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Commenting/ClassCommentStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Commenting/FileCommentStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Commenting/FunctionCommentStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Commenting/InlineCommentStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/ControlStructures/ControlSignatureStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/ControlStructures/MultiLineConditionStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Files/IncludingFileStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Formatting/MultiLineAssignmentStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Functions/FunctionCallSignatureStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Functions/FunctionDeclarationStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Functions/ValidDefaultValueStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/NamingConventions/ValidClassNameStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/NamingConventions/ValidFunctionNameStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/NamingConventions/ValidVariableNameStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/WhiteSpace/ObjectOperatorIndentStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/WhiteSpace/ScopeClosingBraceStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/WhiteSpace/ScopeIndentStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Classes/ClassDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Commenting/ClassCommentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Commenting/FileCommentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Commenting/FunctionCommentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Commenting/InlineCommentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/ControlStructures/ControlSignatureSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/ControlStructures/MultiLineConditionSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Files/IncludingFileSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Formatting/MultiLineAssignmentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Functions/FunctionCallSignatureSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Functions/FunctionDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Functions/ValidDefaultValueSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/NamingConventions/ValidClassNameSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/NamingConventions/ValidFunctionNameSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/NamingConventions/ValidVariableNameSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/WhiteSpace/ObjectOperatorIndentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/WhiteSpace/ScopeClosingBraceSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/WhiteSpace/ScopeIndentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Classes/ClassDeclarationUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Classes/ClassDeclarationUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Classes/ClassDeclarationUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Classes/ClassDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/ClassCommentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/ClassCommentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FileCommentUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FileCommentUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FileCommentUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FileCommentUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FileCommentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FunctionCommentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FunctionCommentUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FunctionCommentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/InlineCommentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/InlineCommentUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/InlineCommentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/ControlSignatureUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/ControlSignatureUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Files/IncludingFileUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Files/IncludingFileUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Files/IncludingFileUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Formatting/MultiLineAssignmentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Formatting/MultiLineAssignmentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionDeclarationUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionDeclarationUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionDeclarationUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionDeclarationUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionDeclarationUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionDeclarationUnitTest.4.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionDeclarationUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionDeclarationUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/ValidDefaultValueUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/ValidDefaultValueUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/ValidDefaultValueUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/NamingConventions/ValidClassNameUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/NamingConventions/ValidClassNameUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/NamingConventions/ValidFunctionNameUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/NamingConventions/ValidFunctionNameUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/NamingConventions/ValidVariableNameUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/NamingConventions/ValidVariableNameUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ObjectOperatorIndentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ObjectOperatorIndentUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ObjectOperatorIndentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ScopeClosingBraceUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ScopeClosingBraceUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ScopeClosingBraceUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ScopeIndentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ScopeIndentUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ScopeIndentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PEAR/ruleset.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Docs/Classes/ClassDeclarationStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Docs/Files/SideEffectsStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Docs/Methods/CamelCapsMethodNameStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Sniffs/Classes/ClassDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Sniffs/Files/SideEffectsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Sniffs/Methods/CamelCapsMethodNameSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Classes/ClassDeclarationUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Classes/ClassDeclarationUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Classes/ClassDeclarationUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Classes/ClassDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.10.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.11.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.12.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.13.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.14.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.15.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.16.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.17.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.6.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.7.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.8.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.9.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Methods/CamelCapsMethodNameUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Methods/CamelCapsMethodNameUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR1/ruleset.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Classes/ClassInstantiationStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Classes/ClosingBraceStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Classes/OpeningBraceSpaceStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/ControlStructures/BooleanOperatorPlacementStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/ControlStructures/ControlStructureSpacingStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Files/ImportStatementStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Files/OpenTagStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Functions/NullableTypeDeclarationStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Functions/ReturnTypeDeclarationStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Keywords/ShortFormTypeKeywordsStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Namespaces/CompoundNamespaceDepthStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Operators/OperatorSpacingStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Properties/ConstantVisibilityStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Classes/AnonClassDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Classes/ClassInstantiationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Classes/ClosingBraceSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Classes/OpeningBraceSpaceSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/ControlStructures/BooleanOperatorPlacementSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/ControlStructures/ControlStructureSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Files/DeclareStatementSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Files/FileHeaderSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Files/ImportStatementSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Files/OpenTagSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Functions/NullableTypeDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Functions/ReturnTypeDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Keywords/ShortFormTypeKeywordsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Namespaces/CompoundNamespaceDepthSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Operators/OperatorSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Properties/ConstantVisibilitySniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Traits/UseDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/AnonClassDeclarationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/AnonClassDeclarationUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/AnonClassDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClassInstantiationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClassInstantiationUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClassInstantiationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClosingBraceUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClosingBraceUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/OpeningBraceSpaceUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/OpeningBraceSpaceUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/OpeningBraceSpaceUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/BooleanOperatorPlacementUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/BooleanOperatorPlacementUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/BooleanOperatorPlacementUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/ControlStructureSpacingUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/ControlStructureSpacingUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/ControlStructureSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/DeclareStatementUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/DeclareStatementUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/DeclareStatementUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/DeclareStatementUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.10.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.10.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.11.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.11.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.12.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.12.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.13.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.14.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.15.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.16.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.17.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.18.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.19.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.2.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.4.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.6.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.7.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.7.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.8.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.9.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/ImportStatementUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/ImportStatementUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/ImportStatementUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/OpenTagUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/OpenTagUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/OpenTagUnitTest.2.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/OpenTagUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/OpenTagUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/OpenTagUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/OpenTagUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Functions/NullableTypeDeclarationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Functions/NullableTypeDeclarationUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Functions/NullableTypeDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Functions/ReturnTypeDeclarationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Functions/ReturnTypeDeclarationUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Functions/ReturnTypeDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Keywords/ShortFormTypeKeywordsUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Keywords/ShortFormTypeKeywordsUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Keywords/ShortFormTypeKeywordsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Namespaces/CompoundNamespaceDepthUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Namespaces/CompoundNamespaceDepthUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Operators/OperatorSpacingUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Operators/OperatorSpacingUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Operators/OperatorSpacingUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Operators/OperatorSpacingUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Operators/OperatorSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Properties/ConstantVisibilityUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Properties/ConstantVisibilityUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Properties/ConstantVisibilityUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Traits/UseDeclarationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Traits/UseDeclarationUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Traits/UseDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR12/ruleset.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Classes/ClassDeclarationStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Classes/PropertyDeclarationStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/ControlStructures/ControlStructureSpacingStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/ControlStructures/ElseIfDeclarationStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/ControlStructures/SwitchDeclarationStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Files/ClosingTagStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Files/EndFileNewlineStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Methods/FunctionCallSignatureStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Methods/FunctionClosingBraceStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Methods/MethodDeclarationStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Namespaces/NamespaceDeclarationStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Namespaces/UseDeclarationStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Classes/ClassDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Classes/PropertyDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/ControlStructures/ControlStructureSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/ControlStructures/ElseIfDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Files/ClosingTagSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Files/EndFileNewlineSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Methods/FunctionCallSignatureSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Methods/FunctionClosingBraceSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Methods/MethodDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Namespaces/NamespaceDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Namespaces/UseDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Classes/ClassDeclarationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Classes/ClassDeclarationUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Classes/ClassDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Classes/PropertyDeclarationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Classes/PropertyDeclarationUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Classes/PropertyDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ControlStructureSpacingUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ControlStructureSpacingUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ControlStructureSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ElseIfDeclarationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ElseIfDeclarationUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ElseIfDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/SwitchDeclarationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/SwitchDeclarationUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/SwitchDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.4.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.5.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.6.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.6.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.7.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.7.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.10.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.10.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.11.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.11.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.12.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.12.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.13.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.13.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.14.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.3.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.6.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.6.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.7.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.7.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.8.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.9.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.9.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/FunctionCallSignatureUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/FunctionCallSignatureUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/FunctionCallSignatureUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/FunctionClosingBraceUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/FunctionClosingBraceUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/FunctionClosingBraceUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/MethodDeclarationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/MethodDeclarationUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/MethodDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/NamespaceDeclarationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/NamespaceDeclarationUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/NamespaceDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.10.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.10.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.11.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.11.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.12.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.12.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.13.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.13.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.14.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.14.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.15.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.16.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.16.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.17.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.18.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.2.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.3.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.5.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.6.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.7.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.8.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.9.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/PSR2/ruleset.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Arrays/ArrayBracketSpacingStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Arrays/ArrayDeclarationStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Classes/ClassFileNameStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Classes/LowercaseClassKeywordsStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Classes/SelfMemberReferenceStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Classes/ValidClassNameStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Commenting/BlockCommentStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Commenting/DocCommentAlignmentStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Commenting/FunctionCommentThrowTagStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/ControlStructures/ForEachLoopDeclarationStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/ControlStructures/ForLoopDeclarationStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/ControlStructures/LowercaseDeclarationStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Functions/LowercaseFunctionKeywordsStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/PHP/HeredocStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Scope/StaticThisUsageStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Strings/EchoedStringsStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/CastSpacingStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/FunctionClosingBraceSpaceStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/FunctionOpeningBraceSpaceStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/LanguageConstructSpacingStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/MemberVarSpacingStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/ObjectOperatorSpacingStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/ScopeClosingBraceStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/ScopeKeywordSpacingStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/SemicolonSpacingStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/SuperfluousWhitespaceStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Arrays/ArrayBracketSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Arrays/ArrayDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ClassDefinitionClosingBraceSpaceSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ClassDefinitionNameSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ClassDefinitionOpeningBraceSpaceSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ColonSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ColourDefinitionSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/DisallowMultipleStyleDefinitionsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/DuplicateClassDefinitionSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/DuplicateStyleDefinitionSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/EmptyClassDefinitionSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/EmptyStyleDefinitionSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ForbiddenStylesSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/IndentationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/LowercaseStyleDefinitionSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/MissingColonSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/NamedColoursSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/OpacitySniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/SemicolonSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ShorthandSizeSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/ClassDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/ClassFileNameSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/DuplicatePropertySniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/LowercaseClassKeywordsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/SelfMemberReferenceSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/ValidClassNameSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/BlockCommentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/ClassCommentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/ClosingDeclarationCommentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/DocCommentAlignmentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/EmptyCatchCommentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/FileCommentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/FunctionCommentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/FunctionCommentThrowTagSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/InlineCommentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/LongConditionClosingCommentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/PostStatementCommentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/VariableCommentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/ControlSignatureSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/ElseIfDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/ForEachLoopDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/ForLoopDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/InlineIfDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/LowercaseDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/SwitchDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Debug/JSLintSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Debug/JavaScriptLintSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Files/FileExtensionSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Formatting/OperatorBracketSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/FunctionDeclarationArgumentSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/FunctionDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/FunctionDuplicateArgumentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/GlobalFunctionSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/LowercaseFunctionKeywordsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/MultiLineFunctionDeclarationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/NamingConventions/ValidFunctionNameSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/NamingConventions/ValidVariableNameSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Objects/DisallowObjectStringIndexSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Objects/ObjectInstantiationSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Objects/ObjectMemberCommaSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Operators/ComparisonOperatorUsageSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Operators/IncrementDecrementUsageSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Operators/ValidLogicalOperatorsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/CommentedOutCodeSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowBooleanStatementSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowComparisonAssignmentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowInlineIfSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowMultipleAssignmentsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowSizeFunctionsInLoopsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DiscouragedFunctionsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/EmbeddedPhpSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/EvalSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/GlobalKeywordSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/HeredocSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/InnerFunctionsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/LowercasePHPFunctionsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/NonExecutableCodeSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Scope/MemberVarScopeSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Scope/MethodScopeSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Scope/StaticThisUsageSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Strings/ConcatenationSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Strings/DoubleQuoteUsageSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Strings/EchoedStringsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/CastSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/ControlStructureSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/FunctionClosingBraceSpaceSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/FunctionOpeningBraceSpaceSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/FunctionSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/LanguageConstructSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/LogicalOperatorSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/MemberVarSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/ObjectOperatorSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/OperatorSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/PropertyLabelSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/ScopeClosingBraceSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/ScopeKeywordSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/SemicolonSpacingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/SuperfluousWhitespaceSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayBracketSpacingUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayBracketSpacingUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayBracketSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.2.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.4.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionClosingBraceSpaceUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionClosingBraceSpaceUnitTest.css.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionClosingBraceSpaceUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionNameSpacingUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionNameSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionOpeningBraceSpaceUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionOpeningBraceSpaceUnitTest.css.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionOpeningBraceSpaceUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColonSpacingUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColonSpacingUnitTest.css.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColonSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColourDefinitionUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColourDefinitionUnitTest.css.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColourDefinitionUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DisallowMultipleStyleDefinitionsUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DisallowMultipleStyleDefinitionsUnitTest.css.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DisallowMultipleStyleDefinitionsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DuplicateClassDefinitionUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DuplicateClassDefinitionUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DuplicateStyleDefinitionUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DuplicateStyleDefinitionUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/EmptyClassDefinitionUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/EmptyClassDefinitionUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/EmptyStyleDefinitionUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/EmptyStyleDefinitionUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ForbiddenStylesUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ForbiddenStylesUnitTest.css.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ForbiddenStylesUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/IndentationUnitTest.1.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/IndentationUnitTest.1.css.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/IndentationUnitTest.2.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/IndentationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/LowercaseStyleDefinitionUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/LowercaseStyleDefinitionUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/MissingColonUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/MissingColonUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/NamedColoursUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/NamedColoursUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/OpacityUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/OpacityUnitTest.css.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/OpacityUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/SemicolonSpacingUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/SemicolonSpacingUnitTest.css.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/SemicolonSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ShorthandSizeUnitTest.1.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ShorthandSizeUnitTest.1.css.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ShorthandSizeUnitTest.2.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ShorthandSizeUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ClassDeclarationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ClassDeclarationUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ClassDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ClassFileName Spaces In FilenameUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ClassFileName-Dashes-In-FilenameUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ClassFileNameLiveCodingFailUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ClassFileNameLiveCodingPassUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ClassFileNameParseError1UnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ClassFileNameUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ClassFileNameUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/DuplicatePropertyUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/DuplicatePropertyUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/LowercaseClassKeywordsUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/LowercaseClassKeywordsUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/LowercaseClassKeywordsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/SelfMemberReferenceUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/SelfMemberReferenceUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/SelfMemberReferenceUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ValidClassNameUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ValidClassNameUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/BlockCommentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/BlockCommentUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/BlockCommentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/ClassCommentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/ClassCommentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/ClosingDeclarationCommentUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/ClosingDeclarationCommentUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/ClosingDeclarationCommentUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/ClosingDeclarationCommentUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/ClosingDeclarationCommentUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/ClosingDeclarationCommentUnitTest.4.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/ClosingDeclarationCommentUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/ClosingDeclarationCommentUnitTest.5.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/ClosingDeclarationCommentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/EmptyCatchCommentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/EmptyCatchCommentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.1.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.1.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.10.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.2.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.6.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.7.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.8.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.9.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentThrowTagUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentThrowTagUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/LongConditionClosingCommentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/LongConditionClosingCommentUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/LongConditionClosingCommentUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/LongConditionClosingCommentUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/LongConditionClosingCommentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.1.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.1.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.2.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/VariableCommentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/VariableCommentUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/VariableCommentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ControlSignatureUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ControlSignatureUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ControlSignatureUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ControlSignatureUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ControlSignatureUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ControlSignatureUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ElseIfDeclarationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ElseIfDeclarationUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ElseIfDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForEachLoopDeclarationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForEachLoopDeclarationUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForEachLoopDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.1.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.1.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.2.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/InlineIfDeclarationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/InlineIfDeclarationUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/InlineIfDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/LowercaseDeclarationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/LowercaseDeclarationUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/LowercaseDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/SwitchDeclarationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/SwitchDeclarationUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/SwitchDeclarationUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/SwitchDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Debug/JSLintUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Debug/JSLintUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Debug/JavaScriptLintUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Debug/JavaScriptLintUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationArgumentSpacingUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationArgumentSpacingUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationArgumentSpacingUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationArgumentSpacingUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationArgumentSpacingUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationArgumentSpacingUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationArgumentSpacingUnitTest.6.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationArgumentSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDuplicateArgumentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDuplicateArgumentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/GlobalFunctionUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/GlobalFunctionUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/LowercaseFunctionKeywordsUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/LowercaseFunctionKeywordsUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/LowercaseFunctionKeywordsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/MultiLineFunctionDeclarationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/MultiLineFunctionDeclarationUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/MultiLineFunctionDeclarationUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/MultiLineFunctionDeclarationUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/MultiLineFunctionDeclarationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/NamingConventions/ValidFunctionNameUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/NamingConventions/ValidFunctionNameUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/NamingConventions/ValidVariableNameUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/NamingConventions/ValidVariableNameUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/DisallowObjectStringIndexUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/DisallowObjectStringIndexUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectInstantiationUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectInstantiationUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectMemberCommaUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectMemberCommaUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectMemberCommaUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ComparisonOperatorUsageUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ComparisonOperatorUsageUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ComparisonOperatorUsageUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/IncrementDecrementUsageUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/IncrementDecrementUsageUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ValidLogicalOperatorsUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ValidLogicalOperatorsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/CommentedOutCodeUnitTest.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/CommentedOutCodeUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/CommentedOutCodeUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowBooleanStatementUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowBooleanStatementUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowComparisonAssignmentUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowComparisonAssignmentUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowInlineIfUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowInlineIfUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowInlineIfUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowMultipleAssignmentsUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowMultipleAssignmentsUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowMultipleAssignmentsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowSizeFunctionsInLoopsUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowSizeFunctionsInLoopsUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowSizeFunctionsInLoopsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DiscouragedFunctionsUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DiscouragedFunctionsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.10.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.11.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.12.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.12.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.13.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.13.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.14.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.15.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.16.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.17.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.18.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.18.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.19.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.19.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.2.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.20.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.20.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.21.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.21.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.22.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.22.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.23.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.24.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.24.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.25.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.25.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.3.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.4.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.5.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.6.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.7.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.8.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.9.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EvalUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EvalUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/GlobalKeywordUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/GlobalKeywordUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/HeredocUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/HeredocUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/HeredocUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/InnerFunctionsUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/InnerFunctionsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/LowercasePHPFunctionsUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/LowercasePHPFunctionsUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/LowercasePHPFunctionsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/NonExecutableCodeUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/NonExecutableCodeUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/NonExecutableCodeUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/NonExecutableCodeUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/NonExecutableCodeUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Scope/MemberVarScopeUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Scope/MemberVarScopeUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Scope/MethodScopeUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Scope/MethodScopeUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Scope/StaticThisUsageUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Scope/StaticThisUsageUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/ConcatenationSpacingUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/ConcatenationSpacingUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/ConcatenationSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/DoubleQuoteUsageUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/DoubleQuoteUsageUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/DoubleQuoteUsageUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/EchoedStringsUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/EchoedStringsUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/EchoedStringsUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/CastSpacingUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/CastSpacingUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/CastSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionClosingBraceSpaceUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionClosingBraceSpaceUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionClosingBraceSpaceUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionClosingBraceSpaceUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionClosingBraceSpaceUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionOpeningBraceSpaceUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionOpeningBraceSpaceUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionOpeningBraceSpaceUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionOpeningBraceSpaceUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionOpeningBraceSpaceUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionSpacingUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionSpacingUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionSpacingUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionSpacingUnitTest.2.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionSpacingUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionSpacingUnitTest.3.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionSpacingUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionSpacingUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionSpacingUnitTest.5.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionSpacingUnitTest.6.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionSpacingUnitTest.6.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionSpacingUnitTest.7.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/LanguageConstructSpacingUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/LanguageConstructSpacingUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/LanguageConstructSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/LogicalOperatorSpacingUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/LogicalOperatorSpacingUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/LogicalOperatorSpacingUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/LogicalOperatorSpacingUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/LogicalOperatorSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/MemberVarSpacingUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/MemberVarSpacingUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/MemberVarSpacingUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/MemberVarSpacingUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/MemberVarSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ObjectOperatorSpacingUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ObjectOperatorSpacingUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ObjectOperatorSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/PropertyLabelSpacingUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/PropertyLabelSpacingUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/PropertyLabelSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeClosingBraceUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeClosingBraceUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeClosingBraceUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.3.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.css.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.css.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.css delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.css.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.js delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.js.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.4.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.5.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Squiz/ruleset.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Docs/Debug/CodeAnalyzerStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Docs/Files/ClosingTagStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Docs/NamingConventions/ValidVariableNameStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Sniffs/Debug/CodeAnalyzerSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Sniffs/Files/ClosingTagSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Sniffs/NamingConventions/ValidVariableNameSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Debug/CodeAnalyzerUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Debug/CodeAnalyzerUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.1.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.1.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.2.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.3.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.3.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.4.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.4.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.5.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.5.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.6.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.6.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.7.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.7.inc.fixed delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/NamingConventions/ValidVariableNameUnitTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/NamingConventions/ValidVariableNameUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Standards/Zend/ruleset.xml delete mode 100644 vendor/squizlabs/php_codesniffer/src/Tokenizers/CSS.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Tokenizers/Comment.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Tokenizers/JS.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Tokenizers/PHP.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Tokenizers/Tokenizer.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Util/Cache.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Util/Common.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Util/Help.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Util/MessageCollector.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Util/Standards.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Util/Timing.php delete mode 100644 vendor/squizlabs/php_codesniffer/src/Util/Tokens.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/AllTests.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/ConfigDouble.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/AbstractMethodUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/AllTests.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Autoloader/DetermineLoadedClassTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Autoloader/TestFiles/A.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Autoloader/TestFiles/B.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Autoloader/TestFiles/C.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Autoloader/TestFiles/Sub/C.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Config/AbstractRealConfigTestCase.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Config/ExtensionsArgTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Config/GeneratorArgTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Config/ReportArgsTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Config/ReportWidthTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Config/SniffsExcludeArgsTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/ErrorSuppressionTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/File/FindEndOfStatementTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/File/FindEndOfStatementTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/File/FindExtendedClassNameTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/File/FindExtendedClassNameTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/File/FindImplementedInterfaceNamesTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/File/FindImplementedInterfaceNamesTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/File/FindStartOfStatementTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/File/FindStartOfStatementTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetClassPropertiesTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetClassPropertiesTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetConditionTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetConditionTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetDeclarationNameJSTest.js delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetDeclarationNameJSTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetDeclarationNameParseError1Test.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetDeclarationNameParseError1Test.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetDeclarationNameParseError2Test.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetDeclarationNameParseError2Test.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetDeclarationNameTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetDeclarationNameTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetMemberPropertiesTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetMemberPropertiesTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetMethodParametersParseError1Test.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetMethodParametersParseError1Test.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetMethodParametersParseError2Test.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetMethodParametersParseError2Test.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetMethodParametersTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetMethodParametersTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetMethodPropertiesTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetMethodPropertiesTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetTokensAsStringTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetTokensAsStringTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/File/IsReferenceTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/File/IsReferenceTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/FileList/AbstractFileListTestCase.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/FileList/AddFileTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/FileList/ConstructTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/FileList/FilterDouble.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/FileList/Fixtures/file1.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Files/FileList/Fixtures/file2.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Filters/AbstractFilterTestCase.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Filters/Filter/AcceptTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Filters/Filter/AcceptTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Filters/GitModifiedTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Filters/GitStagedTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Fixer/FixFileReturnValueAllGoodTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Fixer/FixFileReturnValueConflictTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Fixer/FixFileReturnValueNotEnoughLoopsTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Fixer/FixFileReturnValueTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/GenerateDiffTest-BlankLinesAtEnd.diff delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/GenerateDiffTest-BlankLinesAtEnd.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/GenerateDiffTest-BlankLinesAtStart.diff delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/GenerateDiffTest-BlankLinesAtStart.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/GenerateDiffTest-LineAdded.diff delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/GenerateDiffTest-LineAdded.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/GenerateDiffTest-LineRemoved.diff delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/GenerateDiffTest-LineRemoved.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/GenerateDiffTest-NoDiff.diff delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/GenerateDiffTest-NoDiff.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/GenerateDiffTest-NoTrailingWhitespace.diff delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/GenerateDiffTest-NoTrailingWhitespace.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/GenerateDiffTest-TabsToSpaces.diff delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/GenerateDiffTest-TabsToSpaces.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/GenerateDiffTest-VarNameChanged.diff delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/GenerateDiffTest-VarNameChanged.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/GenerateDiffTest-WhiteSpaceAtEnd.diff delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/GenerateDiffTest-WhiteSpaceAtEnd.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/GenerateDiffTest-WhiteSpaceAtStart.diff delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/GenerateDiffTest-WhiteSpaceAtStart.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/GenerateDiffTest-WindowsLineEndings.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/GenerateDiffTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/TestStandard/Sniffs/FixFileReturnValue/AllGoodSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/TestStandard/Sniffs/FixFileReturnValue/ConflictSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/TestStandard/Sniffs/FixFileReturnValue/NotEnoughLoopsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/TestStandard/ruleset.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/test.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Fixer/GenerateDiffTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/AllValidDocsTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/AnchorLinksTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonBlankLines.html delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonBlankLines.md delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonBlankLines.txt delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonBlockLength.html delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonBlockLength.md delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonBlockLength.txt delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonEncoding.html delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonEncoding.md delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonEncoding.txt delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonLineLength.html delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonLineLength.md delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonLineLength.txt delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeTitleLineWrapping.html delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeTitleLineWrapping.md delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeTitleLineWrapping.txt delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeTitleWhitespace.html delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeTitleWhitespace.md delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeTitleWhitespace.txt delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitleCase.html delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitleCase.md delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitleCase.txt delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitleLength.html delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitleLength.md delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitleLength.txt delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitlePCREFallback.html delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitlePCREFallback.md delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitlePCREFallback.txt delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitleToAnchorSlug.html delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputEmpty.txt delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonMismatchedCodeElms.html delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonMismatchedCodeElms.md delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonMismatchedCodeElms.txt delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonMissingCodeElm.html delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonMissingCodeElm.md delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonMissingCodeElm.txt delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonNoCode.html delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonNoCode.md delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonNoCode.txt delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonNoContent.html delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonNoContent.md delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonNoContent.txt delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonOneEmptyCodeElm.html delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonOneEmptyCodeElm.md delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonOneEmptyCodeElm.txt delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonTwoEmptyCodeElms.html delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonTwoEmptyCodeElms.md delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonTwoEmptyCodeElms.txt delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeTitleEmpty.html delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeTitleEmpty.md delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeTitleEmpty.txt delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeTitleMissing.html delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeTitleMissing.md delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeTitleMissing.txt delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidDocumentationTitleEmpty.html delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidDocumentationTitleEmpty.md delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidDocumentationTitleEmpty.txt delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidDocumentationTitleMissing.html delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidDocumentationTitleMissing.md delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidDocumentationTitleMissing.txt delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidStandardNoContent.html delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidStandardNoContent.md delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidStandardNoContent.txt delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputOneDoc.html delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputOneDoc.md delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputOneDoc.txt delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardBlankLines.html delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardBlankLines.md delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardBlankLines.txt delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardEncoding.html delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardEncoding.md delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardEncoding.txt delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardIndent.html delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardIndent.md delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardIndent.txt delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardLineWrapping.html delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardLineWrapping.md delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardLineWrapping.txt delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStructureDocs.html delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStructureDocs.md delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStructureDocs.txt delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputUnsupportedOneElmAtWrongLevel.html delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputUnsupportedOneElmAtWrongLevel.md delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputUnsupportedOneElmAtWrongLevel.txt delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputUnsupportedSuperfluousCodeElement.html delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputUnsupportedSuperfluousCodeElement.md delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputUnsupportedSuperfluousCodeElement.txt delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/HTMLDouble.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/MarkdownDouble.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/MockGenerator.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/CodeComparisonBlankLinesStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/CodeComparisonBlockLengthStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/CodeComparisonEncodingStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/CodeComparisonLineLengthStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/CodeTitleLineWrappingStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/CodeTitleWhitespaceStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/DocumentationTitleCaseStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/DocumentationTitleLengthStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/DocumentationTitlePCREFallbackStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/DocumentationTitleToAnchorSlug1Standard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/DocumentationTitleToAnchorSlug2Standard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/DocumentationTitleToAnchorSlug3Standard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/StandardBlankLinesStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/StandardEncodingStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/StandardIndentStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/StandardLineWrappingStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/CodeComparisonMismatchedCodeElmsStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/CodeComparisonMissingCodeElmStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/CodeComparisonNoCodeStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/CodeComparisonNoContentStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/CodeComparisonOneEmptyCodeElmStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/CodeComparisonTwoEmptyCodeElmsStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/CodeTitleEmptyStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/CodeTitleMissingStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/DocumentationTitleEmptyStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/DocumentationTitleMissingStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/StandardNoContentStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Structure/NoContentStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Structure/NoDocumentationElementStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Structure/OneCodeComparisonNoStandardStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Structure/OneStandardBlockCodeComparisonStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Structure/OneStandardBlockNoCodeStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Structure/OneStandardBlockTwoCodeComparisonsStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Structure/TwoStandardBlocksNoCodeStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Structure/TwoStandardBlocksOneCodeComparisonStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Structure/TwoStandardBlocksThreeCodeComparisonsStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Unsupported/ElementAtWrongLevelStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Unsupported/OneElmAtWrongLevelStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Unsupported/SuperfluousCodeElementStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Unsupported/UnknownElementStandard.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Content/CodeComparisonBlankLinesSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Content/CodeComparisonBlockLengthSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Content/CodeComparisonEncodingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Content/CodeComparisonLineLengthSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Content/CodeTitleLineWrappingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Content/CodeTitleWhitespaceSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Content/DocumentationTitleCaseSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Content/DocumentationTitleLengthSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Content/DocumentationTitlePCREFallbackSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Content/DocumentationTitleToAnchorSlug1Sniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Content/DocumentationTitleToAnchorSlug2Sniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Content/DocumentationTitleToAnchorSlug3Sniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Content/StandardBlankLinesSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Content/StandardEncodingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Content/StandardIndentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Content/StandardLineWrappingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/DummySniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Invalid/CodeComparisonMismatchedCodeElmsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Invalid/CodeComparisonMissingCodeElmSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Invalid/CodeComparisonNoCodeSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Invalid/CodeComparisonNoContentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Invalid/CodeComparisonOneEmptyCodeElmSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Invalid/CodeComparisonTwoEmptyCodeElmsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Invalid/CodeTitleEmptySniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Invalid/CodeTitleMissingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Invalid/DocumentationTitleEmptySniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Invalid/DocumentationTitleMissingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Invalid/StandardNoContentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Structure/DocumentationMissingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Structure/NoContentSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Structure/NoDocumentationElementSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Structure/OneCodeComparisonNoStandardSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Structure/OneStandardBlockCodeComparisonSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Structure/OneStandardBlockNoCodeSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Structure/OneStandardBlockTwoCodeComparisonsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Structure/TwoStandardBlocksNoCodeSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Structure/TwoStandardBlocksOneCodeComparisonSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Structure/TwoStandardBlocksThreeCodeComparisonsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Unsupported/ElementAtWrongLevelSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Unsupported/OneElmAtWrongLevelSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Unsupported/SuperfluousCodeElementSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Unsupported/UnknownElementSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/ruleset.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/GeneratorTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/HTMLTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/MarkdownTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/NoDocsTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/NoValidDocsTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/OneDocTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/StructureDocsTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Generators/TextTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/AbstractRulesetTestCase.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ConstructorNoSniffsTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ConstructorTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/DisplayCachedMessagesTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceCaseMismatch1Test.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceCaseMismatch2Test.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceHomePathFailTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceHomePathTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceHomePathTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceInternalIgnoreTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceInternalStandardTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceInternalTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceInvalidErrorCode1Test.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceInvalidErrorCode2Test.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceInvalidErrorCode3Test.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceInvalidHomePathRefTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceMissingFileTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceUnknownCategoryTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceUnknownSniffTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceUnknownStandardTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandSniffDirectoryTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandSniffDirectoryTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExplainCustomRulesetTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExplainSingleSniffTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExplainTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/BrokenNamingConventions/Sniffs/Category/Sniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/BrokenNamingConventions/Sniffs/Category/SubDir/TooDeeplyNestedSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/BrokenNamingConventions/Sniffs/MissingCategoryDirSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/BrokenNamingConventions/Sniffs/NoNamespaceSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/BrokenNamingConventions/Sniffs/PartialNamespaceSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/BrokenNamingConventions/Sniffs/Sniffs/CategoryCalledSniffsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/ExternalA/Sniffs/CheckSomething/ValidSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/ExternalA/ruleset.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/ExternalB/Sniffs/CheckMore/ValidSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/ExternalB/ruleset.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/FakeHomePath/src/MyStandard/Sniffs/Category/ValidSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/FakeHomePath/src/MyStandard/ruleset.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/Internal/Sniffs/Valid/ValidSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/Internal/ruleset.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/InvalidNoSniffsDir/Sniffs delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/InvalidNoSniffsDir/ruleset.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/ProcessRulesetAutoloadLoadAlways.1.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/ProcessRulesetAutoloadLoadAlways.2.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/ProcessRulesetAutoloadLoadAlways.3.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/ProcessRulesetAutoloadLoadAlways.4.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/ProcessRulesetAutoloadLoadPhpcbfOnly.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/ProcessRulesetAutoloadLoadPhpcsOnly.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/PropertyTypeHandlingInline.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/Deprecated/WithLongReplacementSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/Deprecated/WithReplacementContainingLinuxNewlinesSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/Deprecated/WithReplacementContainingNewlinesSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/Deprecated/WithReplacementSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/Deprecated/WithoutReplacementSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/DeprecatedInvalid/EmptyDeprecationVersionSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/DeprecatedInvalid/EmptyRemovalVersionSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/DeprecatedInvalid/InvalidDeprecationMessageSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/DeprecatedInvalid/InvalidDeprecationVersionSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/DeprecatedInvalid/InvalidRemovalVersionSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/InvalidSniffError/NoImplementsNoProcessSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/InvalidSniffError/NoImplementsNoRegisterOrProcessSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/InvalidSniffError/NoImplementsNoRegisterSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/InvalidSniffs/RegisterNoArraySniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/MissingInterface/InvalidImplementsWithoutImplementSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/MissingInterface/ValidImplementsSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/MissingInterface/ValidImplementsViaAbstractSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/SetProperty/AllowedAsDeclaredSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/SetProperty/AllowedViaMagicMethodSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/SetProperty/AllowedViaStdClassSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/SetProperty/NotAllowedViaAttributeSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/SetProperty/PropertyTypeHandlingSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/SupportedTokenizers/ImplementsDeprecatedInterfaceSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/SupportedTokenizers/ListensForCSSAndJSSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/SupportedTokenizers/ListensForCSSAndUnrecognizedSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/SupportedTokenizers/ListensForCSSSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/SupportedTokenizers/ListensForEmptySniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/SupportedTokenizers/ListensForJSSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/SupportedTokenizers/ListensForPHPAndCSSAndJSSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/SupportedTokenizers/ListensForUnrecognizedTokenizersSniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/ValidSniffs/RegisterEmptyArraySniff.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/ruleset.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/GetIgnorePatternsTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/GetIgnorePatternsTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/GetIncludePatternsTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/GetIncludePatternsTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PopulateTokenListenersNamingConventionsTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PopulateTokenListenersNamingConventionsTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PopulateTokenListenersRegisterNoArrayTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PopulateTokenListenersSupportedTokenizersTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PopulateTokenListenersSupportedTokenizersTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PopulateTokenListenersTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PopulateTokenListenersTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRuleInvalidTypeTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRuleInvalidTypeTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRuleShouldProcessElementTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRuleShouldProcessElementTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetAutoExpandSniffsDirectoryTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetAutoloadFileNotFoundTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetAutoloadTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetAutoloadTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetBrokenRulesetEmptyFileTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetBrokenRulesetMultiErrorTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetBrokenRulesetSingleErrorTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetBrokenRulesetTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetExcludeSniffGroupTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetInvalidNoSniffsDirTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetMiscTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetShouldProcessElementTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetShouldProcessElementTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PropertyTypeHandlingInlineTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PropertyTypeHandlingTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PropertyTypeHandlingTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RegisterSniffsMissingInterfaceInvalidTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RegisterSniffsMissingInterfaceTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RegisterSniffsMissingInterfaceValidTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RegisterSniffsRejectsInvalidSniffNoImplementsNoProcessTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RegisterSniffsRejectsInvalidSniffNoImplementsNoRegisterOrProcessTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RegisterSniffsRejectsInvalidSniffNoImplementsNoRegisterTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RegisterSniffsRejectsInvalidSniffTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RegisterSniffsTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionAbsoluteLinuxTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionAbsoluteLinuxTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionAbsoluteWindowsTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionAbsoluteWindowsTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionTest-include.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/SetPropertyAllowedAsDeclaredTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/SetPropertyAllowedViaMagicMethodTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/SetPropertyAllowedViaStdClassTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/SetPropertyAppliesPropertyToMultipleSniffsInCategoryTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/SetPropertyDoesNotThrowErrorOnInvalidPropertyWhenSetForCategoryTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/SetPropertyDoesNotThrowErrorOnInvalidPropertyWhenSetForStandardTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/SetPropertyNotAllowedViaAttributeTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/SetPropertyThrowsErrorOnInvalidPropertyTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/SetSniffPropertyTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ShowSniffDeprecationsEmptyDeprecationVersionTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ShowSniffDeprecationsEmptyRemovalVersionTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ShowSniffDeprecationsInvalidDeprecationMessageTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ShowSniffDeprecationsInvalidDeprecationVersionTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ShowSniffDeprecationsInvalidRemovalVersionTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ShowSniffDeprecationsOrderTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ShowSniffDeprecationsReportWidthTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ShowSniffDeprecationsTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ShowSniffDeprecationsTest.xml delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Runner/AbstractRunnerTestCase.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Runner/PrintProgressDotsTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Runner/PrintProgressTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Runner/RunPHPCSExplainTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Runner/RunPHPCSGeneratorTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Sniffs/AbstractArraySniffTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Sniffs/AbstractArraySniffTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Sniffs/AbstractArraySniffTestable.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Standards/StandardRulesetsQATest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/AbstractTokenizerTestCase.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Comment/CommentTestCase.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Comment/LiveCoding1Test.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Comment/LiveCoding1Test.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Comment/LiveCoding2Test.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Comment/LiveCoding2Test.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Comment/LiveCoding3Test.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Comment/LiveCoding3Test.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Comment/LiveCoding4Test.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Comment/LiveCoding4Test.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Comment/MultiLineDocBlockTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Comment/MultiLineDocBlockTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Comment/PhpcsAnnotationsInDocBlockTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Comment/PhpcsAnnotationsInDocBlockTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Comment/SingleLineDocBlockTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Comment/SingleLineDocBlockTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/AnonClassParenthesisOwnerTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/AnonClassParenthesisOwnerTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ArrayKeywordTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ArrayKeywordTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/AttributesParseError1Test.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/AttributesParseError1Test.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/AttributesParseError2Test.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/AttributesParseError2Test.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/AttributesParseError3Test.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/AttributesParseError3Test.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/AttributesParseError4Test.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/AttributesParseError4Test.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/AttributesTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/AttributesTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillAsymmetricVisibilityTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillAsymmetricVisibilityTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillEnumTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillEnumTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillExplicitOctalNotationTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillExplicitOctalNotationTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillFnTokenParseErrorTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillFnTokenParseErrorTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillFnTokenTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillFnTokenTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillMatchTokenTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillMatchTokenTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillNumericSeparatorTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillNumericSeparatorTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillReadonlyTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillReadonlyTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BitwiseOrTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BitwiseOrTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ContextSensitiveKeywordsTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ContextSensitiveKeywordsTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DNFTypesParseError1Test.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DNFTypesParseError1Test.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DNFTypesParseError2Test.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DNFTypesParseError2Test.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DNFTypesTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DNFTypesTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DefaultKeywordTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DefaultKeywordTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DoubleArrowTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DoubleArrowTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DoubleQuotedStringTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DoubleQuotedStringTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/EnumCaseTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/EnumCaseTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ExitKeywordTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ExitKeywordTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/FinallyTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/FinallyTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/GotoLabelTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/GotoLabelTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/HeredocNowdocTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/HeredocNowdocTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/HeredocParseErrorTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/HeredocParseErrorTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/HeredocStringTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/HeredocStringTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/NamedFunctionCallArgumentsTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/NamedFunctionCallArgumentsTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/NullableVsInlineThenParseErrorTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/NullableVsInlineThenParseErrorTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/NullableVsInlineThenTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/NullableVsInlineThenTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/NullsafeObjectOperatorTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/NullsafeObjectOperatorTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/OtherContextSensitiveKeywordsTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/OtherContextSensitiveKeywordsTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/PHPOpenTagEOF1Test.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/PHPOpenTagEOF1Test.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/PHPOpenTagEOF2Test.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/PHPOpenTagEOF2Test.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/PHPOpenTagEOF3Test.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/PHPOpenTagEOF3Test.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ResolveSimpleTokenTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ResolveSimpleTokenTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ShortArrayTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ShortArrayTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/StableCommentWhitespaceTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/StableCommentWhitespaceTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/StableCommentWhitespaceWinTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/StableCommentWhitespaceWinTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/TypeIntersectionTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/TypeIntersectionTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/TypedConstantsTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/TypedConstantsTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/UndoNamespacedNameSingleTokenTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/UndoNamespacedNameSingleTokenTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/YieldTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/YieldTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/CreateParenthesisNestingMapDNFTypesTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/CreateParenthesisNestingMapDNFTypesTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/CreatePositionMapHeredocNowdocCloserTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/CreatePositionMapHeredocNowdocCloserTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/CreatePositionMapHeredocNowdocOpenerTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/CreatePositionMapHeredocNowdocOpenerTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/CreatePositionMapTabWidth0Test.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/CreatePositionMapYieldFromTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/CreatePositionMapYieldFromTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/CreateTokenMapArrayParenthesesTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/CreateTokenMapArrayParenthesesTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapCaseKeywordConditionsTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapCaseKeywordConditionsTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapDefaultKeywordConditionsTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapDefaultKeywordConditionsTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapIfKeywordConditionsTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapIfKeywordConditionsTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapSwitchTokenScopeTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapSwitchTokenScopeTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapWithNamespaceOperatorTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapWithNamespaceOperatorTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/ReplaceTabsInTokenMiscTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/ReplaceTabsInTokenTabWidth1Test.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/ReplaceTabsInTokenTabWidth2Test.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/ReplaceTabsInTokenTabWidth4Test.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/ReplaceTabsInTokenTabWidth5Test.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/ReplaceTabsInTokenTest.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/ReplaceTabsInTokenTestCase.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Util/Common/EscapeshellcmdTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Util/Common/GetSniffCodeTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Util/Common/IsCamelCapsTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Util/Common/PrepareForOutputTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Util/Common/StripColorsTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Util/Common/SuggestTypeTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Util/Help/HelpTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Util/MessageCollector/MessageCollectorTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Util/Timing/GetHumanReadableDurationTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Util/Timing/TimingTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Util/Tokens/GetHighestWeightedTokenTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Core/Util/Tokens/TokenNameTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/EndToEnd/Fixtures/ClassOneWithoutStyleError.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/EndToEnd/Fixtures/ClassTwoWithoutStyleError.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/EndToEnd/Fixtures/ClassWithStyleError.inc delete mode 100644 vendor/squizlabs/php_codesniffer/tests/EndToEnd/Fixtures/endtoend.xml.dist delete mode 100644 vendor/squizlabs/php_codesniffer/tests/EndToEnd/outofmemory_test.sh delete mode 100644 vendor/squizlabs/php_codesniffer/tests/EndToEnd/phpcbf_test.sh delete mode 100644 vendor/squizlabs/php_codesniffer/tests/EndToEnd/phpcs_test.sh delete mode 100644 vendor/squizlabs/php_codesniffer/tests/FileList.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Standards/AbstractSniffUnitTest.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/Standards/AllSniffs.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/TestSuite.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/TestSuite7.php delete mode 100644 vendor/squizlabs/php_codesniffer/tests/bootstrap.php delete mode 100644 vendor/symfony/deprecation-contracts/CHANGELOG.md delete mode 100644 vendor/symfony/deprecation-contracts/README.md delete mode 100644 vendor/symfony/deprecation-contracts/composer.json delete mode 100644 vendor/symfony/polyfill-php80/README.md delete mode 100644 vendor/symfony/polyfill-php80/composer.json delete mode 100644 vendor/theseer/tokenizer/CHANGELOG.md delete mode 100644 vendor/theseer/tokenizer/LICENSE delete mode 100644 vendor/theseer/tokenizer/README.md delete mode 100644 vendor/theseer/tokenizer/composer.json delete mode 100644 vendor/theseer/tokenizer/composer.lock delete mode 100644 vendor/theseer/tokenizer/src/Exception.php delete mode 100644 vendor/theseer/tokenizer/src/NamespaceUri.php delete mode 100644 vendor/theseer/tokenizer/src/NamespaceUriException.php delete mode 100644 vendor/theseer/tokenizer/src/Token.php delete mode 100644 vendor/theseer/tokenizer/src/TokenCollection.php delete mode 100644 vendor/theseer/tokenizer/src/TokenCollectionException.php delete mode 100644 vendor/theseer/tokenizer/src/Tokenizer.php delete mode 100644 vendor/theseer/tokenizer/src/XMLSerializer.php delete mode 100644 vendor/wp-coding-standards/wpcs/CHANGELOG.md delete mode 100644 vendor/wp-coding-standards/wpcs/LICENSE delete mode 100644 vendor/wp-coding-standards/wpcs/README.md delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress-Core/ruleset.xml delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress-Docs/ruleset.xml delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress-Extra/ruleset.xml delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/AbstractArrayAssignmentRestrictionsSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/AbstractClassRestrictionsSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/AbstractFunctionParameterSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/AbstractFunctionRestrictionsSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Docs/Arrays/ArrayIndentationStandard.xml delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Docs/Arrays/ArrayKeySpacingRestrictionsStandard.xml delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Docs/Arrays/MultipleStatementAlignmentStandard.xml delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Docs/CodeAnalysis/EscapedNotTranslatedStandard.xml delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Docs/DB/PreparedSQLStandard.xml delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Docs/DateTime/CurrentTimeTimestampStandard.xml delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Docs/DateTime/RestrictedFunctionsStandard.xml delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Docs/NamingConventions/PrefixAllGlobalsStandard.xml delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Docs/NamingConventions/ValidFunctionNameStandard.xml delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Docs/NamingConventions/ValidHookNameStandard.xml delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Docs/NamingConventions/ValidPostTypeSlugStandard.xml delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Docs/NamingConventions/ValidVariableNameStandard.xml delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Docs/PHP/DontExtractStandard.xml delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Docs/PHP/IniSetStandard.xml delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Docs/PHP/StrictInArrayStandard.xml delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Docs/PHP/YodaConditionsStandard.xml delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Docs/Security/SafeRedirectStandard.xml delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/CapabilitiesStandard.xml delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/CapitalPDangitStandard.xml delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/ClassNameCaseStandard.xml delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/CronIntervalStandard.xml delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/DeprecatedClassesStandard.xml delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/DeprecatedFunctionsStandard.xml delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/DeprecatedParameterValuesStandard.xml delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/DeprecatedParametersStandard.xml delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/EnqueuedResourceParametersStandard.xml delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/EnqueuedResourcesStandard.xml delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/GetMetaSingleStandard.xml delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/PostsPerPageStandard.xml delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Docs/WhiteSpace/CastStructureSpacingStandard.xml delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Docs/WhiteSpace/ControlStructureSpacingStandard.xml delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Docs/WhiteSpace/ObjectOperatorSpacingStandard.xml delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Docs/WhiteSpace/OperatorSpacingStandard.xml delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Helpers/ArrayWalkingFunctionsHelper.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Helpers/ConstantsHelper.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Helpers/ContextHelper.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Helpers/DeprecationHelper.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Helpers/EscapingFunctionsTrait.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Helpers/FormattingFunctionsHelper.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Helpers/IsUnitTestTrait.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Helpers/ListHelper.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Helpers/MinimumWPVersionTrait.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Helpers/PrintingFunctionsTrait.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Helpers/RulesetPropertyHelper.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Helpers/SanitizationHelperTrait.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Helpers/SnakeCaseHelper.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Helpers/UnslashingFunctionsHelper.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Helpers/ValidationHelper.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Helpers/VariableHelper.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Helpers/WPDBTrait.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Helpers/WPGlobalVariablesHelper.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Helpers/WPHookHelper.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Arrays/ArrayDeclarationSpacingSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Arrays/ArrayIndentationSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Arrays/ArrayKeySpacingRestrictionsSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Arrays/MultipleStatementAlignmentSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/CodeAnalysis/AssignmentInTernaryConditionSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/CodeAnalysis/EscapedNotTranslatedSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/DB/DirectDatabaseQuerySniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/DB/PreparedSQLPlaceholdersSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/DB/PreparedSQLSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/DB/RestrictedClassesSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/DB/RestrictedFunctionsSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/DB/SlowDBQuerySniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/DateTime/CurrentTimeTimestampSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/DateTime/RestrictedFunctionsSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Files/FileNameSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/NamingConventions/PrefixAllGlobalsSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/NamingConventions/ValidFunctionNameSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/NamingConventions/ValidHookNameSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/NamingConventions/ValidPostTypeSlugSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/NamingConventions/ValidVariableNameSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/DevelopmentFunctionsSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/DiscouragedPHPFunctionsSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/DontExtractSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/IniSetSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/NoSilencedErrorsSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/POSIXFunctionsSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/PregQuoteDelimiterSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/RestrictedPHPFunctionsSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/StrictInArraySniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/TypeCastsSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/YodaConditionsSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Security/EscapeOutputSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Security/NonceVerificationSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Security/PluginMenuSlugSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Security/SafeRedirectSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Security/ValidatedSanitizedInputSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Utils/I18nTextDomainFixerSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/AlternativeFunctionsSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/CapabilitiesSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/CapitalPDangitSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/ClassNameCaseSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/CronIntervalSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/DeprecatedClassesSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/DeprecatedFunctionsSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/DeprecatedParameterValuesSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/DeprecatedParametersSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/DiscouragedConstantsSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/DiscouragedFunctionsSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/EnqueuedResourceParametersSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/EnqueuedResourcesSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/GetMetaSingleSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/GlobalVariablesOverrideSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/I18nSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/PostsPerPageSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WhiteSpace/CastStructureSpacingSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WhiteSpace/ControlStructureSpacingSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WhiteSpace/ObjectOperatorSpacingSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WhiteSpace/OperatorSpacingSniff.php delete mode 100644 vendor/wp-coding-standards/wpcs/WordPress/ruleset.xml delete mode 100644 vendor/wp-coding-standards/wpcs/_typos.toml delete mode 100644 vendor/wp-coding-standards/wpcs/composer.json delete mode 100644 vendor/wp-coding-standards/wpcs/phpcs.xml.dist.sample diff --git a/README.md b/README.md deleted file mode 100644 index 64d255d..0000000 --- a/README.md +++ /dev/null @@ -1,281 +0,0 @@ -# Documentation Markdown (by ROBOTSTXT) - -Synchronize Markdown documentation from GitHub repositories to WordPress pages and posts automatically. - -## Description - -**Documentation Markdown** is a WordPress plugin that enables seamless synchronization of Markdown documentation files from GitHub repositories into your WordPress site. Perfect for maintaining technical documentation, API references, knowledge bases, and more. - -## Features - -- 🔄 **Automatic Synchronization** - Schedule automatic syncs via WordPress Cron -- 📝 **Markdown to HTML** - Convert GitHub Flavored Markdown to clean HTML -- 🎯 **Flexible Mapping** - Map individual MD files to specific WordPress posts/pages -- 🔍 **Smart Change Detection** - Only sync when content actually changes (using SHA comparison) -- 🔐 **Secure** - Encrypted GitHub token storage, full input validation & output escaping -- 🌍 **Translatable** - Full internationalization support (i18n/l10n ready) -- 📚 **Multi-Repository** - Sync from multiple GitHub repos simultaneously -- ⚡ **Manual Sync** - On-demand synchronization from admin interface - -## Requirements - -- **PHP:** 8.2 or higher -- **WordPress:** 6.5 or higher -- **GitHub Account:** For repository access (public or private) - -## Installation - -### Manual Installation - -1. Download the plugin or clone this repository -2. Upload to `/wp-content/plugins/robotstxt-documentation-markdown/` -3. Run `composer install --no-dev` in the plugin directory -4. Activate the plugin through the 'Plugins' menu in WordPress -5. Navigate to 'GitHub Docs' in the WordPress admin menu -6. Configure your GitHub Personal Access Token -7. Create your first mapping - -### Via Composer (Development) - -```bash -cd wp-content/plugins -git clone https://git.robotstxt.es/ROBOTSTXT/robotstxt-documentation-markdown.git robotstxt-documentation-markdown -cd robotstxt-documentation-markdown -composer install -``` - -## Configuration - -### 1. GitHub Personal Access Token - -Generate a Personal Access Token from GitHub: -- Go to GitHub → Settings → Developer settings → Personal access tokens -- Click "Generate new token" -- For public repositories: No specific scopes needed -- For private repositories: Select `repo` scope -- Copy the token (you won't see it again!) - -### 2. Plugin Configuration - -1. In WordPress admin, go to **GitHub Docs → Settings** -2. Paste your GitHub token -3. Configure sync frequency (hourly, twice daily, daily) -4. Save settings - -### 3. Create a Mapping - -1. Go to **GitHub Docs → Mappings** -2. Click "Add New Mapping" -3. Fill in: - - **Repository Owner:** GitHub username or organization - - **Repository Name:** Repository name - - **File Path:** Path to `.md` file (e.g., `docs/api/auth.md`) - - **Branch:** Branch to sync from (default: `main`) - - **Target Post Type:** Where to create content (page/post) - - **Author:** WordPress user who will be the post author -4. Save mapping -5. Click "Sync Now" to perform first synchronization - -## Usage Examples - -### Example 1: API Documentation - -Sync your API documentation from GitHub to WordPress pages: - -``` -Repository: yourcompany/api-docs -File Path: docs/authentication.md -Branch: main -Target: Page -``` - -Every time `authentication.md` is updated in GitHub, the corresponding WordPress page will automatically update. - -### Example 2: Blog Posts - -Write blog posts in Markdown using Git workflow: - -``` -Repository: yourblog/content -File Path: posts/2026-01-intro-to-api.md -Branch: main -Target: Post -``` - -Commit your Markdown post to GitHub, and it automatically publishes to your WordPress blog. - -### Example 3: Knowledge Base - -Maintain a knowledge base with version control: - -``` -Repository: support/knowledge-base -File Path: articles/how-to-install.md -Branch: production -Target: Page -``` - -## Development - -### Setup Development Environment - -```bash -# Clone repository -git clone https://git.robotstxt.es/ROBOTSTXT/robotstxt-documentation-markdown.git -cd documentation-markdown - -# Install dependencies -composer install - -# Run code quality checks -composer phpcs # Check coding standards -composer phpcbf # Auto-fix coding standards -composer phpstan # Static analysis -composer test # Run tests -``` - -### Coding Standards - -This plugin strictly follows: -- **WordPress Coding Standards (WPCS)** -- **PHP 8.2+ features** (readonly properties, constructor promotion, match expressions) -- **Complete PHPDoc** documentation for all code -- **PSR-4 autoloading** - -All code must pass: -```bash -composer lint # Runs both PHPCS and PHPStan -``` - -### Documentation - -Complete technical documentation available in `/docs/`: -- **00-REQUIREMENTS-SUMMARY.md** - Start here! All critical requirements -- **01-project-overview.md** - Plugin overview and use cases -- **02-architecture.md** - System architecture and components -- **03-data-structure.md** - Database schema and data models -- **04-development-phases.md** - Development roadmap -- **05-technical-specifications.md** - Technical details and APIs -- **06-synchronization-flow.md** - How synchronization works -- **07-security-considerations.md** - Security best practices -- **08-implementation-order.md** - Step-by-step implementation guide - -### Running Tests - -```bash -# Unit tests -composer test - -# Specific test -vendor/bin/phpunit tests/test-github-api-client.php - -# With coverage -composer test -- --coverage-html coverage/ -``` - -## Security - -### Reporting Vulnerabilities - -Please report security vulnerabilities privately to: **robotstxt@robotstxt.es** - -Do NOT create public issues for security vulnerabilities. - -### Security Features - -- ✅ GitHub tokens encrypted at rest (AES-256-CBC) -- ✅ All user input sanitized -- ✅ All output escaped -- ✅ Nonce verification on all forms -- ✅ Capability checks for all admin actions -- ✅ Prepared statements for database queries -- ✅ Rate limiting for GitHub API - -## Translation - -The plugin is fully translatable and uses the text domain: `robotstxt-documentation-markdown` - -To translate: -1. Use [Poedit](https://poedit.net/) or similar tool -2. Open `/languages/robotstxt-documentation-markdown.pot` -3. Create translations -4. Save as `robotstxt-documentation-markdown-{locale}.mo` -5. Place in `/wp-content/languages/plugins/` - -## Changelog - -See [CHANGELOG.md](CHANGELOG.md) for detailed version history. - -### Version 1.0.0 (2026-01-26) -- ✨ Initial stable release -- 🔄 GitHub repository synchronization -- 📝 Markdown to HTML conversion using CommonMark -- 🎯 Flexible file-to-content mapping -- ⚡ Manual and scheduled synchronization -- 🎨 Complete admin interface -- 🐛 Built-in debug tools (WP_DEBUG mode) -- 🔐 Encrypted token storage -- 🌍 Full internationalization support -- 🛡️ Security best practices implemented - -## Roadmap - -Future enhancements under consideration: -- [ ] Bidirectional sync (WordPress → GitHub) -- [ ] Image synchronization from GitHub -- [ ] Folder-level mapping (sync entire directory) -- [ ] GitHub webhooks support (instant sync on push) -- [ ] Gutenberg block for embedded docs -- [ ] Multi-branch support per mapping -- [ ] Conflict resolution UI - -## Contributing - -We welcome contributions! Please follow these guidelines: - -1. Fork the repository -2. Create a feature branch (`git checkout -b feature/amazing-feature`) -3. Follow WordPress Coding Standards (run `composer phpcs`) -4. Write PHPDoc for all functions -5. Include unit tests for new functionality -6. Ensure all tests pass (`composer test`) -7. Commit with conventional commit messages -8. Push to your fork -9. Open a Pull Request - -All contributions must: -- Be in English -- Include complete PHPDoc -- Pass PHPCS and PHPStan -- Include appropriate unit tests - -## License - -This plugin is licensed under the GNU General Public License v3.0 or later. - -See [LICENSE](LICENSE) file for details. - -## Credits - -**Developed by:** ROBOTSTXT - -**Dependencies:** -- [league/commonmark](https://commonmark.thephpleague.com/) - Markdown parser -- [WordPress Coding Standards](https://github.com/WordPress/WordPress-Coding-Standards) - -## Support - -- **Documentation:** See `/docs/` directory -- **Issues:** [Gitea Issues](https://git.robotstxt.es/ROBOTSTXT/robotstxt-documentation-markdown/issues) -- **Discussions:** [Gitea Discussions](https://git.robotstxt.es/ROBOTSTXT/robotstxt-documentation-markdown/discussions) -- **Website:** [ROBOTSTXT.es](https://www.robotstxt.es/) -- **Security:** robotstxt@robotstxt.es - ---- - -**Status:** Stable Release -**Version:** 1.0.0 -**Requires PHP:** 8.2+ -**Requires WordPress:** 6.5+ (single-site only) -**License:** GPL-3.0-or-later -**Text Domain:** robotstxt-documentation-markdown diff --git a/changelog.txt b/changelog.txt new file mode 100644 index 0000000..79b8142 --- /dev/null +++ b/changelog.txt @@ -0,0 +1,140 @@ +== Changelog == + += 1.1.0 = + +_Release date: 2026-03-28_ + +**Highlights** + +* Editor-level access: editors can now manage documentation mappings without administrator privileges +* Full PHPStan level 9 compliance — zero errors across all plugin files +* Security patch for two CVEs in league/commonmark +* `target_order` (menu_order) field fully implemented end-to-end + +**Security** + +* Patched CVE-2026-33347 and CVE-2026-30838 by upgrading league/commonmark to 2.8.2 + +**Changed** + +* Access level changed from `manage_options` (administrator) to `edit_pages` (editor) across all admin pages, form handlers, and debug functions +* `robotstxt_docmd_debug_run_cron()` now has a typed `int $mapping_id` parameter + +**Fixed** + +* PHPStan level 9: replaced all implicit `mixed` casts with proper type-narrowing via `is_string()`, `is_int()`, and `is_numeric()` guards +* New `robotstxt_docmd_input_string()` and `robotstxt_docmd_input_int()` helpers used for all superglobal (`$_POST`, `$_GET`) access +* `MappingData` and `MappingInput` global type aliases defined in `phpstan.neon` — file-level `@phpstan-type` aliases do not propagate between files in PHPStan 2.x procedural code +* `target_order` field was rendered in the form UI but never saved to post meta or applied during sync — now fully implemented +* `openssl_decrypt()` false return properly handled in token decryption +* `get_edit_post_link()` null return handled safely in debug run-cron output +* Redundant `isset()` guards removed on statically-typed array shapes +* Uninstall handler narrows `get_option()` mixed return before array access +* `size_format()` false return handled in discover-page file list +* Settings and debug functions use `is_array()` narrowing on `get_option()` before accessing keys +* `json_decode()` results in GitHub debug functions fully type-narrowed before key access + +**Developer Features** + +* PHPStan level 9: 0 errors (down from 104 in v1.0.0) +* `phpstan.neon` now includes global `MappingData` and `MappingInput` type aliases +* `robotstxt-updater.php` moved to `bootstrapFiles` in PHPStan config to avoid strict analysis of shared utility +* `$default` parameter renamed to `$fallback` in helpers (reserved keyword warning) +* Short ternary (`?:`) replaced with explicit `false !==` check (PHPCS rule) + +**Compatibility** + +* WordPress: 6.7 - 7.0 +* PHP: 8.2 - 8.4 (verified on PHP 8.4.x) +* MariaDB: 10.6 or newer + +**Dependencies** + +* `league/commonmark`: 2.8.0 → 2.8.2 (security patch) +* `eduardovillao/wp-since`: 1.3.0 → 1.4.0 +* `phpunit/phpunit` held at ^10.5 (v13.x available; pending test suite migration) +* `squizlabs/php_codesniffer` held at ^3.13 (v4.x available; pending WPCS 4.x confirmation) + +**Tests** + +* PHP Coding Standards: PHPCS 3.x with WordPress-Extra ruleset — 0 errors, 0 warnings +* WordPress Coding Standards: WPCS 3.3 +* PHPStan: level 9, 0 errors (szepeviktor/phpstan-wordpress extension) +* PHPCompatibility: PHP 8.2 - 8.4 validated +* Manual testing: WordPress 6.8, 7.0 + += 1.0.0 = + +_Release date: 2026-01-26_ + +**Highlights** + +* Initial release of Documentation Markdown plugin +* Automatic synchronization of Markdown files from GitHub to WordPress +* Full support for GitHub Flavored Markdown +* Encrypted GitHub token storage +* Flexible mapping system for multiple repositories + +**Added** + +* Core synchronization functionality between GitHub and WordPress +* Automatic scheduled sync (hourly, twice daily, daily) +* Manual on-demand sync via admin interface +* Markdown to HTML conversion using CommonMark (league/commonmark) +* Flexible file-to-content mapping system +* Custom Post Type (robotstxt_map) for mapping management +* Encrypted GitHub token storage (AES-256-CBC) +* Full internationalization support (i18n/l10n ready) +* Multi-repository support +* Clean admin interface with status badges +* Support for pages, posts, and custom post types as sync targets +* Configurable post author and parent page +* Page order (menu_order) support +* Debug tools for troubleshooting (visible when WP_DEBUG enabled) +* Cron job management and repair tools +* Clean uninstall with optional data deletion +* Settings page for GitHub configuration +* Mappings management interface (list, add, edit, delete) +* Sync status monitoring with timestamps +* Rate limiting awareness for GitHub API +* Cache system using WordPress Transients API + +**Security** + +* All user input sanitized using WordPress functions +* All output escaped (esc_html, esc_attr, esc_url) +* Nonce verification on all forms and actions +* Capability checks for all admin actions (manage_options — changed to edit_pages in 1.1.0) +* Prepared statements for all database queries +* GitHub tokens encrypted at rest using AES-256-CBC +* OWASP Top 10 mitigation implemented +* Direct access prevention on all PHP files +* CSRF protection on all state-changing operations +* XSS prevention through proper escaping +* SQL injection prevention through prepared statements + +**Developer Features** + +* Procedural PHP architecture following KISS principles +* PHP 8.2+ modern features (typed parameters, match expressions) +* Complete PHPDoc documentation on all functions +* WordPress Coding Standards (WPCS) compliant +* PHPCS/WPBF validated (0 errors, 0 warnings) +* Extensible architecture with WordPress hooks +* Clean, well-documented codebase +* Composer-based dependency management +* Production-optimized deployment script (bin/deploy.sh) + +**Compatibility** + +* WordPress: 6.7 - 6.9 +* PHP: 8.2 - 8.5 +* MariaDB: 10.6 or newer + +**Tests** + +* PHP Coding Standards: PHPCS 3.x with WordPress-Extra ruleset +* WordPress Coding Standards: WPCS 3.3 +* PHPCompatibility: PHP 8.2 - 8.5 validated +* Security Audit: Complete OWASP Top 10 coverage +* Manual testing: WordPress 6.7, 6.8, 6.9 diff --git a/composer.json b/composer.json deleted file mode 100644 index 61e97f1..0000000 --- a/composer.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "name": "robotstxt/documentation-markdown", - "description": "Synchronizes Markdown documentation from GitHub repositories to WordPress pages and posts", - "type": "wordpress-plugin", - "license": "GPL-3.0-or-later", - "authors": [ - { - "name": "ROBOTSTXT", - "homepage": "https://www.robotstxt.es" - } - ], - "require": { - "php": ">=8.2", - "league/commonmark": "^2.4" - }, - "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^1.0", - "squizlabs/php_codesniffer": "^3.13", - "wp-coding-standards/wpcs": "^3.3", - "phpcompatibility/php-compatibility": "^9.3", - "phpcompatibility/phpcompatibility-wp": "^2.1", - "eduardovillao/wp-since": "^1.3", - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^10.5" - }, - "autoload": { - "psr-4": { - "RobotsTxt\\DocumentationMarkdown\\": "includes/" - } - }, - "config": { - "allow-plugins": { - "dealerdirect/phpcodesniffer-composer-installer": true - }, - "sort-packages": true, - "optimize-autoloader": true - }, - "scripts": { - "phpcs": "phpcs", - "phpcbf": "phpcbf", - "phpstan": "phpstan analyse --memory-limit=512M", - "test": "phpunit", - "lint": [ - "@phpcs", - "@phpstan" - ] - }, - "scripts-descriptions": { - "phpcs": "Run PHP_CodeSniffer to detect coding standard violations", - "phpcbf": "Run PHP Code Beautifier to automatically fix coding standard violations", - "phpstan": "Run PHPStan static analysis", - "test": "Run PHPUnit tests", - "lint": "Run all code quality checks" - } -} diff --git a/composer.lock b/composer.lock deleted file mode 100644 index 9f15e7e..0000000 --- a/composer.lock +++ /dev/null @@ -1,3027 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "5521033548202d71c9afc90f45ab0b56", - "packages": [ - { - "name": "dflydev/dot-access-data", - "version": "v3.0.3", - "source": { - "type": "git", - "url": "https://github.com/dflydev/dflydev-dot-access-data.git", - "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f", - "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^0.12.42", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", - "scrutinizer/ocular": "1.6.0", - "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "^4.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Dflydev\\DotAccessData\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Dragonfly Development Inc.", - "email": "info@dflydev.com", - "homepage": "http://dflydev.com" - }, - { - "name": "Beau Simensen", - "email": "beau@dflydev.com", - "homepage": "http://beausimensen.com" - }, - { - "name": "Carlos Frutos", - "email": "carlos@kiwing.it", - "homepage": "https://github.com/cfrutos" - }, - { - "name": "Colin O'Dell", - "email": "colinodell@gmail.com", - "homepage": "https://www.colinodell.com" - } - ], - "description": "Given a deep data structure, access data by dot notation.", - "homepage": "https://github.com/dflydev/dflydev-dot-access-data", - "keywords": [ - "access", - "data", - "dot", - "notation" - ], - "support": { - "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", - "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3" - }, - "time": "2024-07-08T12:26:09+00:00" - }, - { - "name": "league/commonmark", - "version": "2.8.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/commonmark.git", - "reference": "4efa10c1e56488e658d10adf7b7b7dcd19940bfb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/4efa10c1e56488e658d10adf7b7b7dcd19940bfb", - "reference": "4efa10c1e56488e658d10adf7b7b7dcd19940bfb", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "league/config": "^1.1.1", - "php": "^7.4 || ^8.0", - "psr/event-dispatcher": "^1.0", - "symfony/deprecation-contracts": "^2.1 || ^3.0", - "symfony/polyfill-php80": "^1.16" - }, - "require-dev": { - "cebe/markdown": "^1.0", - "commonmark/cmark": "0.31.1", - "commonmark/commonmark.js": "0.31.1", - "composer/package-versions-deprecated": "^1.8", - "embed/embed": "^4.4", - "erusev/parsedown": "^1.0", - "ext-json": "*", - "github/gfm": "0.29.0", - "michelf/php-markdown": "^1.4 || ^2.0", - "nyholm/psr7": "^1.5", - "phpstan/phpstan": "^1.8.2", - "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0", - "scrutinizer/ocular": "^1.8.1", - "symfony/finder": "^5.3 | ^6.0 | ^7.0", - "symfony/process": "^5.4 | ^6.0 | ^7.0", - "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0", - "unleashedtech/php-coding-standard": "^3.1.1", - "vimeo/psalm": "^4.24.0 || ^5.0.0 || ^6.0.0" - }, - "suggest": { - "symfony/yaml": "v2.3+ required if using the Front Matter extension" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.9-dev" - } - }, - "autoload": { - "psr-4": { - "League\\CommonMark\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Colin O'Dell", - "email": "colinodell@gmail.com", - "homepage": "https://www.colinodell.com", - "role": "Lead Developer" - } - ], - "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", - "homepage": "https://commonmark.thephpleague.com", - "keywords": [ - "commonmark", - "flavored", - "gfm", - "github", - "github-flavored", - "markdown", - "md", - "parser" - ], - "support": { - "docs": "https://commonmark.thephpleague.com/", - "forum": "https://github.com/thephpleague/commonmark/discussions", - "issues": "https://github.com/thephpleague/commonmark/issues", - "rss": "https://github.com/thephpleague/commonmark/releases.atom", - "source": "https://github.com/thephpleague/commonmark" - }, - "funding": [ - { - "url": "https://www.colinodell.com/sponsor", - "type": "custom" - }, - { - "url": "https://www.paypal.me/colinpodell/10.00", - "type": "custom" - }, - { - "url": "https://github.com/colinodell", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/league/commonmark", - "type": "tidelift" - } - ], - "time": "2025-11-26T21:48:24+00:00" - }, - { - "name": "league/config", - "version": "v1.2.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/config.git", - "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", - "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", - "shasum": "" - }, - "require": { - "dflydev/dot-access-data": "^3.0.1", - "nette/schema": "^1.2", - "php": "^7.4 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.8.2", - "phpunit/phpunit": "^9.5.5", - "scrutinizer/ocular": "^1.8.1", - "unleashedtech/php-coding-standard": "^3.1", - "vimeo/psalm": "^4.7.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.2-dev" - } - }, - "autoload": { - "psr-4": { - "League\\Config\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Colin O'Dell", - "email": "colinodell@gmail.com", - "homepage": "https://www.colinodell.com", - "role": "Lead Developer" - } - ], - "description": "Define configuration arrays with strict schemas and access values with dot notation", - "homepage": "https://config.thephpleague.com", - "keywords": [ - "array", - "config", - "configuration", - "dot", - "dot-access", - "nested", - "schema" - ], - "support": { - "docs": "https://config.thephpleague.com/", - "issues": "https://github.com/thephpleague/config/issues", - "rss": "https://github.com/thephpleague/config/releases.atom", - "source": "https://github.com/thephpleague/config" - }, - "funding": [ - { - "url": "https://www.colinodell.com/sponsor", - "type": "custom" - }, - { - "url": "https://www.paypal.me/colinpodell/10.00", - "type": "custom" - }, - { - "url": "https://github.com/colinodell", - "type": "github" - } - ], - "time": "2022-12-11T20:36:23+00:00" - }, - { - "name": "nette/schema", - "version": "v1.3.3", - "source": { - "type": "git", - "url": "https://github.com/nette/schema.git", - "reference": "2befc2f42d7c715fd9d95efc31b1081e5d765004" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/schema/zipball/2befc2f42d7c715fd9d95efc31b1081e5d765004", - "reference": "2befc2f42d7c715fd9d95efc31b1081e5d765004", - "shasum": "" - }, - "require": { - "nette/utils": "^4.0", - "php": "8.1 - 8.5" - }, - "require-dev": { - "nette/tester": "^2.5.2", - "phpstan/phpstan-nette": "^2.0@stable", - "tracy/tracy": "^2.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3-dev" - } - }, - "autoload": { - "psr-4": { - "Nette\\": "src" - }, - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0-only", - "GPL-3.0-only" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "📐 Nette Schema: validating data structures against a given Schema.", - "homepage": "https://nette.org", - "keywords": [ - "config", - "nette" - ], - "support": { - "issues": "https://github.com/nette/schema/issues", - "source": "https://github.com/nette/schema/tree/v1.3.3" - }, - "time": "2025-10-30T22:57:59+00:00" - }, - { - "name": "nette/utils", - "version": "v4.1.1", - "source": { - "type": "git", - "url": "https://github.com/nette/utils.git", - "reference": "c99059c0315591f1a0db7ad6002000288ab8dc72" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/c99059c0315591f1a0db7ad6002000288ab8dc72", - "reference": "c99059c0315591f1a0db7ad6002000288ab8dc72", - "shasum": "" - }, - "require": { - "php": "8.2 - 8.5" - }, - "conflict": { - "nette/finder": "<3", - "nette/schema": "<1.2.2" - }, - "require-dev": { - "jetbrains/phpstorm-attributes": "^1.2", - "nette/tester": "^2.5", - "phpstan/phpstan-nette": "^2.0@stable", - "tracy/tracy": "^2.9" - }, - "suggest": { - "ext-gd": "to use Image", - "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", - "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", - "ext-json": "to use Nette\\Utils\\Json", - "ext-mbstring": "to use Strings::lower() etc...", - "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.1-dev" - } - }, - "autoload": { - "psr-4": { - "Nette\\": "src" - }, - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0-only", - "GPL-3.0-only" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", - "homepage": "https://nette.org", - "keywords": [ - "array", - "core", - "datetime", - "images", - "json", - "nette", - "paginator", - "password", - "slugify", - "string", - "unicode", - "utf-8", - "utility", - "validation" - ], - "support": { - "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v4.1.1" - }, - "time": "2025-12-22T12:14:32+00:00" - }, - { - "name": "psr/event-dispatcher", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/event-dispatcher.git", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\EventDispatcher\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Standard interfaces for event handling.", - "keywords": [ - "events", - "psr", - "psr-14" - ], - "support": { - "issues": "https://github.com/php-fig/event-dispatcher/issues", - "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" - }, - "time": "2019-01-08T18:20:26+00:00" - }, - { - "name": "symfony/deprecation-contracts", - "version": "v3.6.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", - "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, - "branch-alias": { - "dev-main": "3.6-dev" - } - }, - "autoload": { - "files": [ - "function.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-09-25T14:21:43+00:00" - }, - { - "name": "symfony/polyfill-php80", - "version": "v1.33.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", - "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2025-01-02T08:10:11+00:00" - } - ], - "packages-dev": [ - { - "name": "dealerdirect/phpcodesniffer-composer-installer", - "version": "v1.2.0", - "source": { - "type": "git", - "url": "https://github.com/PHPCSStandards/composer-installer.git", - "reference": "845eb62303d2ca9b289ef216356568ccc075ffd1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/845eb62303d2ca9b289ef216356568ccc075ffd1", - "reference": "845eb62303d2ca9b289ef216356568ccc075ffd1", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^2.2", - "php": ">=5.4", - "squizlabs/php_codesniffer": "^3.1.0 || ^4.0" - }, - "require-dev": { - "composer/composer": "^2.2", - "ext-json": "*", - "ext-zip": "*", - "php-parallel-lint/php-parallel-lint": "^1.4.0", - "phpcompatibility/php-compatibility": "^9.0 || ^10.0.0@dev", - "yoast/phpunit-polyfills": "^1.0" - }, - "type": "composer-plugin", - "extra": { - "class": "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" - }, - "autoload": { - "psr-4": { - "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Franck Nijhof", - "email": "opensource@frenck.dev", - "homepage": "https://frenck.dev", - "role": "Open source developer" - }, - { - "name": "Contributors", - "homepage": "https://github.com/PHPCSStandards/composer-installer/graphs/contributors" - } - ], - "description": "PHP_CodeSniffer Standards Composer Installer Plugin", - "keywords": [ - "PHPCodeSniffer", - "PHP_CodeSniffer", - "code quality", - "codesniffer", - "composer", - "installer", - "phpcbf", - "phpcs", - "plugin", - "qa", - "quality", - "standard", - "standards", - "style guide", - "stylecheck", - "tests" - ], - "support": { - "issues": "https://github.com/PHPCSStandards/composer-installer/issues", - "security": "https://github.com/PHPCSStandards/composer-installer/security/policy", - "source": "https://github.com/PHPCSStandards/composer-installer" - }, - "funding": [ - { - "url": "https://github.com/PHPCSStandards", - "type": "github" - }, - { - "url": "https://github.com/jrfnl", - "type": "github" - }, - { - "url": "https://opencollective.com/php_codesniffer", - "type": "open_collective" - }, - { - "url": "https://thanks.dev/u/gh/phpcsstandards", - "type": "thanks_dev" - } - ], - "time": "2025-11-11T04:32:07+00:00" - }, - { - "name": "eduardovillao/wp-since", - "version": "v1.3.0", - "source": { - "type": "git", - "url": "https://github.com/eduardovillao/wp-since.git", - "reference": "c7ad6e49b045f144fbc40a91a45590c3dfd240c2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/eduardovillao/wp-since/zipball/c7ad6e49b045f144fbc40a91a45590c3dfd240c2", - "reference": "c7ad6e49b045f144fbc40a91a45590c3dfd240c2", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^4.15", - "php": ">=7.4" - }, - "require-dev": { - "phpunit/phpunit": "^10.5", - "squizlabs/php_codesniffer": "^3.12" - }, - "bin": [ - "bin/wp-since" - ], - "type": "library", - "autoload": { - "psr-4": { - "WP_Since\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Check WordPress plugin compatibility by analyzing used functions, classes, hooks and comparing against the minimum required WP version.", - "support": { - "issues": "https://github.com/eduardovillao/wp-since/issues", - "source": "https://github.com/eduardovillao/wp-since" - }, - "time": "2025-05-01T20:03:49+00:00" - }, - { - "name": "myclabs/deep-copy", - "version": "1.13.4", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", - "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "conflict": { - "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3 <3.2.2" - }, - "require-dev": { - "doctrine/collections": "^1.6.8", - "doctrine/common": "^2.13.3 || ^3.2.2", - "phpspec/prophecy": "^1.10", - "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" - }, - "type": "library", - "autoload": { - "files": [ - "src/DeepCopy/deep_copy.php" - ], - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ], - "support": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" - }, - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" - } - ], - "time": "2025-08-01T08:46:24+00:00" - }, - { - "name": "nikic/php-parser", - "version": "v4.19.5", - "source": { - "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "51bd93cc741b7fc3d63d20b6bdcd99fdaa359837" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/51bd93cc741b7fc3d63d20b6bdcd99fdaa359837", - "reference": "51bd93cc741b7fc3d63d20b6bdcd99fdaa359837", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": ">=7.1" - }, - "require-dev": { - "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" - }, - "bin": [ - "bin/php-parse" - ], - "type": "library", - "autoload": { - "psr-4": { - "PhpParser\\": "lib/PhpParser" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Nikita Popov" - } - ], - "description": "A PHP parser written in PHP", - "keywords": [ - "parser", - "php" - ], - "support": { - "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.5" - }, - "time": "2025-12-06T11:45:25+00:00" - }, - { - "name": "phar-io/manifest", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "54750ef60c58e43759730615a392c31c80e23176" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", - "reference": "54750ef60c58e43759730615a392c31c80e23176", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-phar": "*", - "ext-xmlwriter": "*", - "phar-io/version": "^3.0.1", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "support": { - "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.4" - }, - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "time": "2024-03-03T12:33:53+00:00" - }, - { - "name": "phar-io/version", - "version": "3.2.1", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Library for handling version information and constraints", - "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.2.1" - }, - "time": "2022-02-21T01:04:05+00:00" - }, - { - "name": "phpcompatibility/php-compatibility", - "version": "9.3.5", - "source": { - "type": "git", - "url": "https://github.com/PHPCompatibility/PHPCompatibility.git", - "reference": "9fb324479acf6f39452e0655d2429cc0d3914243" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibility/zipball/9fb324479acf6f39452e0655d2429cc0d3914243", - "reference": "9fb324479acf6f39452e0655d2429cc0d3914243", - "shasum": "" - }, - "require": { - "php": ">=5.3", - "squizlabs/php_codesniffer": "^2.3 || ^3.0.2" - }, - "conflict": { - "squizlabs/php_codesniffer": "2.6.2" - }, - "require-dev": { - "phpunit/phpunit": "~4.5 || ^5.0 || ^6.0 || ^7.0" - }, - "suggest": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically.", - "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." - }, - "type": "phpcodesniffer-standard", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-3.0-or-later" - ], - "authors": [ - { - "name": "Wim Godden", - "homepage": "https://github.com/wimg", - "role": "lead" - }, - { - "name": "Juliette Reinders Folmer", - "homepage": "https://github.com/jrfnl", - "role": "lead" - }, - { - "name": "Contributors", - "homepage": "https://github.com/PHPCompatibility/PHPCompatibility/graphs/contributors" - } - ], - "description": "A set of sniffs for PHP_CodeSniffer that checks for PHP cross-version compatibility.", - "homepage": "http://techblog.wimgodden.be/tag/codesniffer/", - "keywords": [ - "compatibility", - "phpcs", - "standards" - ], - "support": { - "issues": "https://github.com/PHPCompatibility/PHPCompatibility/issues", - "source": "https://github.com/PHPCompatibility/PHPCompatibility" - }, - "time": "2019-12-27T09:44:58+00:00" - }, - { - "name": "phpcompatibility/phpcompatibility-paragonie", - "version": "1.3.4", - "source": { - "type": "git", - "url": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie.git", - "reference": "244d7b04fc4bc2117c15f5abe23eb933b5f02bbf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityParagonie/zipball/244d7b04fc4bc2117c15f5abe23eb933b5f02bbf", - "reference": "244d7b04fc4bc2117c15f5abe23eb933b5f02bbf", - "shasum": "" - }, - "require": { - "phpcompatibility/php-compatibility": "^9.0" - }, - "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^1.0", - "paragonie/random_compat": "dev-master", - "paragonie/sodium_compat": "dev-master" - }, - "suggest": { - "dealerdirect/phpcodesniffer-composer-installer": "^1.0 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.", - "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." - }, - "type": "phpcodesniffer-standard", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-3.0-or-later" - ], - "authors": [ - { - "name": "Wim Godden", - "role": "lead" - }, - { - "name": "Juliette Reinders Folmer", - "role": "lead" - } - ], - "description": "A set of rulesets for PHP_CodeSniffer to check for PHP cross-version compatibility issues in projects, while accounting for polyfills provided by the Paragonie polyfill libraries.", - "homepage": "http://phpcompatibility.com/", - "keywords": [ - "compatibility", - "paragonie", - "phpcs", - "polyfill", - "standards", - "static analysis" - ], - "support": { - "issues": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie/issues", - "security": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie/security/policy", - "source": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie" - }, - "funding": [ - { - "url": "https://github.com/PHPCompatibility", - "type": "github" - }, - { - "url": "https://github.com/jrfnl", - "type": "github" - }, - { - "url": "https://opencollective.com/php_codesniffer", - "type": "open_collective" - }, - { - "url": "https://thanks.dev/u/gh/phpcompatibility", - "type": "thanks_dev" - } - ], - "time": "2025-09-19T17:43:28+00:00" - }, - { - "name": "phpcompatibility/phpcompatibility-wp", - "version": "2.1.8", - "source": { - "type": "git", - "url": "https://github.com/PHPCompatibility/PHPCompatibilityWP.git", - "reference": "7c8d18b4d90dac9e86b0869a608fa09158e168fa" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityWP/zipball/7c8d18b4d90dac9e86b0869a608fa09158e168fa", - "reference": "7c8d18b4d90dac9e86b0869a608fa09158e168fa", - "shasum": "" - }, - "require": { - "phpcompatibility/php-compatibility": "^9.0", - "phpcompatibility/phpcompatibility-paragonie": "^1.0", - "squizlabs/php_codesniffer": "^3.3" - }, - "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^1.0" - }, - "suggest": { - "dealerdirect/phpcodesniffer-composer-installer": "^1.0 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.", - "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." - }, - "type": "phpcodesniffer-standard", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-3.0-or-later" - ], - "authors": [ - { - "name": "Wim Godden", - "role": "lead" - }, - { - "name": "Juliette Reinders Folmer", - "role": "lead" - } - ], - "description": "A ruleset for PHP_CodeSniffer to check for PHP cross-version compatibility issues in projects, while accounting for polyfills provided by WordPress.", - "homepage": "http://phpcompatibility.com/", - "keywords": [ - "compatibility", - "phpcs", - "standards", - "static analysis", - "wordpress" - ], - "support": { - "issues": "https://github.com/PHPCompatibility/PHPCompatibilityWP/issues", - "security": "https://github.com/PHPCompatibility/PHPCompatibilityWP/security/policy", - "source": "https://github.com/PHPCompatibility/PHPCompatibilityWP" - }, - "funding": [ - { - "url": "https://github.com/PHPCompatibility", - "type": "github" - }, - { - "url": "https://github.com/jrfnl", - "type": "github" - }, - { - "url": "https://opencollective.com/php_codesniffer", - "type": "open_collective" - }, - { - "url": "https://thanks.dev/u/gh/phpcompatibility", - "type": "thanks_dev" - } - ], - "time": "2025-10-18T00:05:59+00:00" - }, - { - "name": "phpcsstandards/phpcsextra", - "version": "1.5.0", - "source": { - "type": "git", - "url": "https://github.com/PHPCSStandards/PHPCSExtra.git", - "reference": "b598aa890815b8df16363271b659d73280129101" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHPCSExtra/zipball/b598aa890815b8df16363271b659d73280129101", - "reference": "b598aa890815b8df16363271b659d73280129101", - "shasum": "" - }, - "require": { - "php": ">=5.4", - "phpcsstandards/phpcsutils": "^1.2.0", - "squizlabs/php_codesniffer": "^3.13.5 || ^4.0.1" - }, - "require-dev": { - "php-parallel-lint/php-console-highlighter": "^1.0", - "php-parallel-lint/php-parallel-lint": "^1.4.0", - "phpcsstandards/phpcsdevcs": "^1.2.0", - "phpcsstandards/phpcsdevtools": "^1.2.1", - "phpunit/phpunit": "^4.5 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" - }, - "type": "phpcodesniffer-standard", - "extra": { - "branch-alias": { - "dev-stable": "1.x-dev", - "dev-develop": "1.x-dev" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-3.0-or-later" - ], - "authors": [ - { - "name": "Juliette Reinders Folmer", - "homepage": "https://github.com/jrfnl", - "role": "lead" - }, - { - "name": "Contributors", - "homepage": "https://github.com/PHPCSStandards/PHPCSExtra/graphs/contributors" - } - ], - "description": "A collection of sniffs and standards for use with PHP_CodeSniffer.", - "keywords": [ - "PHP_CodeSniffer", - "phpcbf", - "phpcodesniffer-standard", - "phpcs", - "standards", - "static analysis" - ], - "support": { - "issues": "https://github.com/PHPCSStandards/PHPCSExtra/issues", - "security": "https://github.com/PHPCSStandards/PHPCSExtra/security/policy", - "source": "https://github.com/PHPCSStandards/PHPCSExtra" - }, - "funding": [ - { - "url": "https://github.com/PHPCSStandards", - "type": "github" - }, - { - "url": "https://github.com/jrfnl", - "type": "github" - }, - { - "url": "https://opencollective.com/php_codesniffer", - "type": "open_collective" - }, - { - "url": "https://thanks.dev/u/gh/phpcsstandards", - "type": "thanks_dev" - } - ], - "time": "2025-11-12T23:06:57+00:00" - }, - { - "name": "phpcsstandards/phpcsutils", - "version": "1.2.2", - "source": { - "type": "git", - "url": "https://github.com/PHPCSStandards/PHPCSUtils.git", - "reference": "c216317e96c8b3f5932808f9b0f1f7a14e3bbf55" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHPCSUtils/zipball/c216317e96c8b3f5932808f9b0f1f7a14e3bbf55", - "reference": "c216317e96c8b3f5932808f9b0f1f7a14e3bbf55", - "shasum": "" - }, - "require": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.4.1 || ^0.5 || ^0.6.2 || ^0.7 || ^1.0", - "php": ">=5.4", - "squizlabs/php_codesniffer": "^3.13.5 || ^4.0.1" - }, - "require-dev": { - "ext-filter": "*", - "php-parallel-lint/php-console-highlighter": "^1.0", - "php-parallel-lint/php-parallel-lint": "^1.4.0", - "phpcsstandards/phpcsdevcs": "^1.2.0", - "yoast/phpunit-polyfills": "^1.1.0 || ^2.0.0 || ^3.0.0" - }, - "type": "phpcodesniffer-standard", - "extra": { - "branch-alias": { - "dev-stable": "1.x-dev", - "dev-develop": "1.x-dev" - } - }, - "autoload": { - "classmap": [ - "PHPCSUtils/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-3.0-or-later" - ], - "authors": [ - { - "name": "Juliette Reinders Folmer", - "homepage": "https://github.com/jrfnl", - "role": "lead" - }, - { - "name": "Contributors", - "homepage": "https://github.com/PHPCSStandards/PHPCSUtils/graphs/contributors" - } - ], - "description": "A suite of utility functions for use with PHP_CodeSniffer", - "homepage": "https://phpcsutils.com/", - "keywords": [ - "PHP_CodeSniffer", - "phpcbf", - "phpcodesniffer-standard", - "phpcs", - "phpcs3", - "phpcs4", - "standards", - "static analysis", - "tokens", - "utility" - ], - "support": { - "docs": "https://phpcsutils.com/", - "issues": "https://github.com/PHPCSStandards/PHPCSUtils/issues", - "security": "https://github.com/PHPCSStandards/PHPCSUtils/security/policy", - "source": "https://github.com/PHPCSStandards/PHPCSUtils" - }, - "funding": [ - { - "url": "https://github.com/PHPCSStandards", - "type": "github" - }, - { - "url": "https://github.com/jrfnl", - "type": "github" - }, - { - "url": "https://opencollective.com/php_codesniffer", - "type": "open_collective" - }, - { - "url": "https://thanks.dev/u/gh/phpcsstandards", - "type": "thanks_dev" - } - ], - "time": "2025-12-08T14:27:58+00:00" - }, - { - "name": "phpstan/phpstan", - "version": "1.12.32", - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/2770dcdf5078d0b0d53f94317e06affe88419aa8", - "reference": "2770dcdf5078d0b0d53f94317e06affe88419aa8", - "shasum": "" - }, - "require": { - "php": "^7.2|^8.0" - }, - "conflict": { - "phpstan/phpstan-shim": "*" - }, - "bin": [ - "phpstan", - "phpstan.phar" - ], - "type": "library", - "autoload": { - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHPStan - PHP Static Analysis Tool", - "keywords": [ - "dev", - "static analysis" - ], - "support": { - "docs": "https://phpstan.org/user-guide/getting-started", - "forum": "https://github.com/phpstan/phpstan/discussions", - "issues": "https://github.com/phpstan/phpstan/issues", - "security": "https://github.com/phpstan/phpstan/security/policy", - "source": "https://github.com/phpstan/phpstan-src" - }, - "funding": [ - { - "url": "https://github.com/ondrejmirtes", - "type": "github" - }, - { - "url": "https://github.com/phpstan", - "type": "github" - } - ], - "time": "2025-09-30T10:16:31+00:00" - }, - { - "name": "phpunit/php-code-coverage", - "version": "10.1.16", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "7e308268858ed6baedc8704a304727d20bc07c77" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e308268858ed6baedc8704a304727d20bc07c77", - "reference": "7e308268858ed6baedc8704a304727d20bc07c77", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-xmlwriter": "*", - "nikic/php-parser": "^4.19.1 || ^5.1.0", - "php": ">=8.1", - "phpunit/php-file-iterator": "^4.1.0", - "phpunit/php-text-template": "^3.0.1", - "sebastian/code-unit-reverse-lookup": "^3.0.0", - "sebastian/complexity": "^3.2.0", - "sebastian/environment": "^6.1.0", - "sebastian/lines-of-code": "^2.0.2", - "sebastian/version": "^4.0.1", - "theseer/tokenizer": "^1.2.3" - }, - "require-dev": { - "phpunit/phpunit": "^10.1" - }, - "suggest": { - "ext-pcov": "PHP extension that provides line coverage", - "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "10.1.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.16" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-08-22T04:31:57+00:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "4.1.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", - "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-08-31T06:24:48+00:00" - }, - { - "name": "phpunit/php-invoker", - "version": "4.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", - "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "ext-pcntl": "*", - "phpunit/phpunit": "^10.0" - }, - "suggest": { - "ext-pcntl": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Invoke callables with a timeout", - "homepage": "https://github.com/sebastianbergmann/php-invoker/", - "keywords": [ - "process" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T06:56:09+00:00" - }, - { - "name": "phpunit/php-text-template", - "version": "3.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", - "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-08-31T14:07:24+00:00" - }, - { - "name": "phpunit/php-timer", - "version": "6.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", - "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T06:57:52+00:00" - }, - { - "name": "phpunit/phpunit", - "version": "10.5.63", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "33198268dad71e926626b618f3ec3966661e4d90" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/33198268dad71e926626b618f3ec3966661e4d90", - "reference": "33198268dad71e926626b618f3ec3966661e4d90", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.13.4", - "phar-io/manifest": "^2.0.4", - "phar-io/version": "^3.2.1", - "php": ">=8.1", - "phpunit/php-code-coverage": "^10.1.16", - "phpunit/php-file-iterator": "^4.1.0", - "phpunit/php-invoker": "^4.0.0", - "phpunit/php-text-template": "^3.0.1", - "phpunit/php-timer": "^6.0.0", - "sebastian/cli-parser": "^2.0.1", - "sebastian/code-unit": "^2.0.0", - "sebastian/comparator": "^5.0.5", - "sebastian/diff": "^5.1.1", - "sebastian/environment": "^6.1.0", - "sebastian/exporter": "^5.1.4", - "sebastian/global-state": "^6.0.2", - "sebastian/object-enumerator": "^5.0.0", - "sebastian/recursion-context": "^5.0.1", - "sebastian/type": "^4.0.0", - "sebastian/version": "^4.0.1" - }, - "suggest": { - "ext-soap": "To be able to generate mocks based on WSDL files" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "10.5-dev" - } - }, - "autoload": { - "files": [ - "src/Framework/Assert/Functions.php" - ], - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.63" - }, - "funding": [ - { - "url": "https://phpunit.de/sponsors.html", - "type": "custom" - }, - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", - "type": "tidelift" - } - ], - "time": "2026-01-27T05:48:37+00:00" - }, - { - "name": "sebastian/cli-parser", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", - "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for parsing CLI options", - "homepage": "https://github.com/sebastianbergmann/cli-parser", - "support": { - "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-02T07:12:49+00:00" - }, - { - "name": "sebastian/code-unit", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", - "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the PHP code units", - "homepage": "https://github.com/sebastianbergmann/code-unit", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T06:58:43+00:00" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", - "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T06:59:15+00:00" - }, - { - "name": "sebastian/comparator", - "version": "5.0.5", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "55dfef806eb7dfeb6e7a6935601fef866f8ca48d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55dfef806eb7dfeb6e7a6935601fef866f8ca48d", - "reference": "55dfef806eb7dfeb6e7a6935601fef866f8ca48d", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-mbstring": "*", - "php": ">=8.1", - "sebastian/diff": "^5.0", - "sebastian/exporter": "^5.0" - }, - "require-dev": { - "phpunit/phpunit": "^10.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "https://github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/comparator/issues", - "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.5" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", - "type": "tidelift" - } - ], - "time": "2026-01-24T09:25:16+00:00" - }, - { - "name": "sebastian/complexity", - "version": "3.2.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "68ff824baeae169ec9f2137158ee529584553799" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", - "reference": "68ff824baeae169ec9f2137158ee529584553799", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.2-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for calculating the complexity of PHP code units", - "homepage": "https://github.com/sebastianbergmann/complexity", - "support": { - "issues": "https://github.com/sebastianbergmann/complexity/issues", - "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-12-21T08:37:17+00:00" - }, - { - "name": "sebastian/diff", - "version": "5.1.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", - "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0", - "symfony/process": "^6.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/diff/issues", - "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-02T07:15:17+00:00" - }, - { - "name": "sebastian/environment", - "version": "6.1.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", - "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "suggest": { - "ext-posix": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "https://github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/environment/issues", - "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-23T08:47:14+00:00" - }, - { - "name": "sebastian/exporter", - "version": "5.1.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "0735b90f4da94969541dac1da743446e276defa6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/0735b90f4da94969541dac1da743446e276defa6", - "reference": "0735b90f4da94969541dac1da743446e276defa6", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "php": ">=8.1", - "sebastian/recursion-context": "^5.0" - }, - "require-dev": { - "phpunit/phpunit": "^10.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "https://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/exporter/issues", - "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", - "type": "tidelift" - } - ], - "time": "2025-09-24T06:09:11+00:00" - }, - { - "name": "sebastian/global-state", - "version": "6.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", - "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "sebastian/object-reflector": "^3.0", - "sebastian/recursion-context": "^5.0" - }, - "require-dev": { - "ext-dom": "*", - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Snapshotting of global state", - "homepage": "https://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/global-state/issues", - "security": "https://github.com/sebastianbergmann/global-state/security/policy", - "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-02T07:19:19+00:00" - }, - { - "name": "sebastian/lines-of-code", - "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", - "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for counting the lines of code in PHP source code", - "homepage": "https://github.com/sebastianbergmann/lines-of-code", - "support": { - "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-12-21T08:38:20+00:00" - }, - { - "name": "sebastian/object-enumerator", - "version": "5.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", - "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "sebastian/object-reflector": "^3.0", - "sebastian/recursion-context": "^5.0" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T07:08:32+00:00" - }, - { - "name": "sebastian/object-reflector", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", - "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T07:06:18+00:00" - }, - { - "name": "sebastian/recursion-context", - "version": "5.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "47e34210757a2f37a97dcd207d032e1b01e64c7a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/47e34210757a2f37a97dcd207d032e1b01e64c7a", - "reference": "47e34210757a2f37a97dcd207d032e1b01e64c7a", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "https://github.com/sebastianbergmann/recursion-context", - "support": { - "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", - "type": "tidelift" - } - ], - "time": "2025-08-10T07:50:56+00:00" - }, - { - "name": "sebastian/type", - "version": "4.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/type.git", - "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", - "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the types of the PHP type system", - "homepage": "https://github.com/sebastianbergmann/type", - "support": { - "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T07:10:45+00:00" - }, - { - "name": "sebastian/version", - "version": "4.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", - "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "support": { - "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-07T11:34:05+00:00" - }, - { - "name": "squizlabs/php_codesniffer", - "version": "3.13.5", - "source": { - "type": "git", - "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "0ca86845ce43291e8f5692c7356fccf3bcf02bf4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/0ca86845ce43291e8f5692c7356fccf3bcf02bf4", - "reference": "0ca86845ce43291e8f5692c7356fccf3bcf02bf4", - "shasum": "" - }, - "require": { - "ext-simplexml": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": ">=5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" - }, - "bin": [ - "bin/phpcbf", - "bin/phpcs" - ], - "type": "library", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Greg Sherwood", - "role": "Former lead" - }, - { - "name": "Juliette Reinders Folmer", - "role": "Current lead" - }, - { - "name": "Contributors", - "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" - } - ], - "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", - "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", - "keywords": [ - "phpcs", - "standards", - "static analysis" - ], - "support": { - "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", - "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", - "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", - "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" - }, - "funding": [ - { - "url": "https://github.com/PHPCSStandards", - "type": "github" - }, - { - "url": "https://github.com/jrfnl", - "type": "github" - }, - { - "url": "https://opencollective.com/php_codesniffer", - "type": "open_collective" - }, - { - "url": "https://thanks.dev/u/gh/phpcsstandards", - "type": "thanks_dev" - } - ], - "time": "2025-11-04T16:30:35+00:00" - }, - { - "name": "theseer/tokenizer", - "version": "1.3.1", - "source": { - "type": "git", - "url": "https://github.com/theseer/tokenizer.git", - "reference": "b7489ce515e168639d17feec34b8847c326b0b3c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c", - "reference": "b7489ce515e168639d17feec34b8847c326b0b3c", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - } - ], - "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "support": { - "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.3.1" - }, - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "time": "2025-11-17T20:03:58+00:00" - }, - { - "name": "wp-coding-standards/wpcs", - "version": "3.3.0", - "source": { - "type": "git", - "url": "https://github.com/WordPress/WordPress-Coding-Standards.git", - "reference": "7795ec6fa05663d716a549d0b44e47ffc8b0d4a6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/WordPress/WordPress-Coding-Standards/zipball/7795ec6fa05663d716a549d0b44e47ffc8b0d4a6", - "reference": "7795ec6fa05663d716a549d0b44e47ffc8b0d4a6", - "shasum": "" - }, - "require": { - "ext-filter": "*", - "ext-libxml": "*", - "ext-tokenizer": "*", - "ext-xmlreader": "*", - "php": ">=7.2", - "phpcsstandards/phpcsextra": "^1.5.0", - "phpcsstandards/phpcsutils": "^1.1.0", - "squizlabs/php_codesniffer": "^3.13.4" - }, - "require-dev": { - "php-parallel-lint/php-console-highlighter": "^1.0.0", - "php-parallel-lint/php-parallel-lint": "^1.4.0", - "phpcompatibility/php-compatibility": "^10.0.0@dev", - "phpcsstandards/phpcsdevtools": "^1.2.0", - "phpunit/phpunit": "^8.0 || ^9.0" - }, - "suggest": { - "ext-iconv": "For improved results", - "ext-mbstring": "For improved results" - }, - "type": "phpcodesniffer-standard", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Contributors", - "homepage": "https://github.com/WordPress/WordPress-Coding-Standards/graphs/contributors" - } - ], - "description": "PHP_CodeSniffer rules (sniffs) to enforce WordPress coding conventions", - "keywords": [ - "phpcs", - "standards", - "static analysis", - "wordpress" - ], - "support": { - "issues": "https://github.com/WordPress/WordPress-Coding-Standards/issues", - "source": "https://github.com/WordPress/WordPress-Coding-Standards", - "wiki": "https://github.com/WordPress/WordPress-Coding-Standards/wiki" - }, - "funding": [ - { - "url": "https://opencollective.com/php_codesniffer", - "type": "custom" - } - ], - "time": "2025-11-25T12:08:04+00:00" - } - ], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": ">=8.2" - }, - "platform-dev": [], - "plugin-api-version": "2.6.0" -} diff --git a/languages/robotstxt-documentation-markdown.pot b/languages/robotstxt-documentation-markdown.pot deleted file mode 100644 index 701f802..0000000 --- a/languages/robotstxt-documentation-markdown.pot +++ /dev/null @@ -1,811 +0,0 @@ -# Copyright (C) 2026 ROBOTSTXT -# This file is distributed under the GPL-3.0-or-later. -msgid "" -msgstr "" -"Project-Id-Version: Documentation Markdown (by ROBOTSTXT) 1.0.0-rc1\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/robotstxt-documentation-markdown\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2026-01-25T18:11:49+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"X-Generator: WP-CLI 2.12.0\n" -"X-Domain: robotstxt-documentation-markdown\n" - -#. Plugin Name of the plugin -#: robotstxt-documentation-markdown.php -msgid "Documentation Markdown (by ROBOTSTXT)" -msgstr "" - -#. Plugin URI of the plugin -#: robotstxt-documentation-markdown.php -msgid "https://github.com/robotstxt/documentation-markdown" -msgstr "" - -#. Description of the plugin -#: robotstxt-documentation-markdown.php -msgid "Synchronizes Markdown documentation from GitHub repositories to WordPress pages and posts automatically." -msgstr "" - -#. Author of the plugin -#: robotstxt-documentation-markdown.php -msgid "ROBOTSTXT" -msgstr "" - -#. Author URI of the plugin -#: robotstxt-documentation-markdown.php -msgid "https://robotstxt.com" -msgstr "" - -#: includes/admin/Admin_Mappings.php:52 -msgid "Manage Mappings" -msgstr "" - -#: includes/admin/Admin_Mappings.php:53 -msgid "Mappings" -msgstr "" - -#: includes/admin/Admin_Mappings.php:61 -#: includes/admin/Admin_Mappings.php:173 -#: includes/admin/Admin_Mappings.php:382 -msgid "Add New Mapping" -msgstr "" - -#: includes/admin/Admin_Mappings.php:62 -#: includes/admin/Admin_Mappings.php:136 -msgid "Add New" -msgstr "" - -#: includes/admin/Admin_Mappings.php:105 -#: includes/admin/Admin_Mappings.php:276 -msgid "Syncing..." -msgstr "" - -#: includes/admin/Admin_Mappings.php:106 -#: includes/admin/Admin_Mappings.php:653 -msgid "Sync completed successfully!" -msgstr "" - -#: includes/admin/Admin_Mappings.php:107 -msgid "Sync failed:" -msgstr "" - -#: includes/admin/Admin_Mappings.php:108 -#: includes/admin/Admin_Mappings.php:342 -msgid "Are you sure you want to delete this mapping?" -msgstr "" - -#: includes/admin/Admin_Mappings.php:109 -msgid "Syncing all mappings..." -msgstr "" - -#: includes/admin/Admin_Mappings.php:124 -#: includes/admin/Admin_Mappings.php:357 -#: includes/admin/Admin_Settings.php:542 -msgid "You do not have sufficient permissions to access this page." -msgstr "" - -#: includes/admin/Admin_Mappings.php:133 -msgid "Documentation Mappings" -msgstr "" - -#: includes/admin/Admin_Mappings.php:145 -msgid "Total Mappings" -msgstr "" - -#: includes/admin/Admin_Mappings.php:149 -msgid "Active" -msgstr "" - -#: includes/admin/Admin_Mappings.php:153 -msgid "Last Success" -msgstr "" - -#: includes/admin/Admin_Mappings.php:157 -msgid "Last Error" -msgstr "" - -#: includes/admin/Admin_Mappings.php:164 -msgid "Sync All Active Mappings" -msgstr "" - -#: includes/admin/Admin_Mappings.php:171 -msgid "No mappings found. Create your first mapping to get started!" -msgstr "" - -#: includes/admin/Admin_Mappings.php:180 -msgid "Title" -msgstr "" - -#: includes/admin/Admin_Mappings.php:181 -msgid "Repository" -msgstr "" - -#: includes/admin/Admin_Mappings.php:182 -msgid "File" -msgstr "" - -#: includes/admin/Admin_Mappings.php:183 -msgid "Frequency" -msgstr "" - -#: includes/admin/Admin_Mappings.php:184 -msgid "Status" -msgstr "" - -#: includes/admin/Admin_Mappings.php:185 -msgid "Sync Status" -msgstr "" - -#: includes/admin/Admin_Mappings.php:186 -msgid "Last Sync" -msgstr "" - -#: includes/admin/Admin_Mappings.php:187 -msgid "Next Sync" -msgstr "" - -#: includes/admin/Admin_Mappings.php:188 -msgid "Actions" -msgstr "" - -#: includes/admin/Admin_Mappings.php:208 -#, php-format -msgid "Branch: %s" -msgstr "" - -#: includes/admin/Admin_Mappings.php:214 -#: includes/admin/Admin_Mappings.php:232 -msgid "Never" -msgstr "" - -#: includes/admin/Admin_Mappings.php:219 -msgid "Enabled" -msgstr "" - -#: includes/admin/Admin_Mappings.php:221 -msgid "Disabled" -msgstr "" - -#: includes/admin/Admin_Mappings.php:242 -msgid "Manual Only" -msgstr "" - -#: includes/admin/Admin_Mappings.php:272 -msgid "Never Synced" -msgstr "" - -#: includes/admin/Admin_Mappings.php:280 -msgid "Success" -msgstr "" - -#: includes/admin/Admin_Mappings.php:284 -msgid "Error" -msgstr "" - -#: includes/admin/Admin_Mappings.php:337 -msgid "Sync Now" -msgstr "" - -#: includes/admin/Admin_Mappings.php:340 -msgid "Edit" -msgstr "" - -#: includes/admin/Admin_Mappings.php:343 -msgid "Delete" -msgstr "" - -#: includes/admin/Admin_Mappings.php:382 -msgid "Edit Mapping" -msgstr "" - -#: includes/admin/Admin_Mappings.php:397 -msgid "Mapping Title" -msgstr "" - -#: includes/admin/Admin_Mappings.php:401 -msgid "A descriptive name for this mapping." -msgstr "" - -#: includes/admin/Admin_Mappings.php:407 -msgid "Repository Owner" -msgstr "" - -#: includes/admin/Admin_Mappings.php:411 -msgid "GitHub username or organization (e.g., \"wordpress\")." -msgstr "" - -#: includes/admin/Admin_Mappings.php:417 -msgid "Repository Name" -msgstr "" - -#: includes/admin/Admin_Mappings.php:421 -msgid "Repository name (e.g., \"wordpress-develop\")." -msgstr "" - -#: includes/admin/Admin_Mappings.php:427 -msgid "File Path" -msgstr "" - -#: includes/admin/Admin_Mappings.php:431 -msgid "Path to Markdown file (e.g., \"README.md\" or \"docs/api.md\")." -msgstr "" - -#: includes/admin/Admin_Mappings.php:437 -msgid "Branch" -msgstr "" - -#: includes/admin/Admin_Mappings.php:441 -msgid "Git branch name (default: \"main\")." -msgstr "" - -#: includes/admin/Admin_Mappings.php:447 -msgid "Target Post Type" -msgstr "" - -#: includes/admin/Admin_Mappings.php:463 -msgid "WordPress post type for the synced content." -msgstr "" - -#: includes/admin/Admin_Mappings.php:469 -msgid "Post Author" -msgstr "" - -#: includes/admin/Admin_Mappings.php:481 -msgid "WordPress user to assign as post author." -msgstr "" - -#: includes/admin/Admin_Mappings.php:487 -msgid "Sync Frequency" -msgstr "" - -#: includes/admin/Admin_Mappings.php:503 -msgid "How often to automatically sync this documentation from GitHub." -msgstr "" - -#: includes/admin/Admin_Mappings.php:509 -msgid "Enable Sync" -msgstr "" - -#: includes/admin/Admin_Mappings.php:514 -msgid "Enable automatic synchronization for this mapping" -msgstr "" - -#: includes/admin/Admin_Mappings.php:516 -msgid "Must be enabled for automatic syncing to work." -msgstr "" - -#: includes/admin/Admin_Mappings.php:521 -msgid "Update Mapping" -msgstr "" - -#: includes/admin/Admin_Mappings.php:521 -msgid "Create Mapping" -msgstr "" - -#: includes/admin/Admin_Mappings.php:536 -#: includes/admin/Admin_Mappings.php:593 -msgid "You do not have sufficient permissions." -msgstr "" - -#: includes/admin/Admin_Mappings.php:634 -#: includes/admin/Admin_Mappings.php:670 -msgid "Insufficient permissions." -msgstr "" - -#: includes/admin/Admin_Mappings.php:640 -msgid "Invalid mapping ID." -msgstr "" - -#. translators: 1: Success count, 2: Error count -#: includes/admin/Admin_Mappings.php:690 -#, php-format -msgid "Sync complete: %1$d succeeded, %2$d failed." -msgstr "" - -#: includes/admin/Admin_Mappings.php:711 -msgid "Mapping created successfully." -msgstr "" - -#: includes/admin/Admin_Mappings.php:712 -msgid "Mapping updated successfully." -msgstr "" - -#: includes/admin/Admin_Mappings.php:713 -msgid "Mapping deleted successfully." -msgstr "" - -#: includes/admin/Admin_Settings.php:45 -msgid "Documentation Settings" -msgstr "" - -#: includes/admin/Admin_Settings.php:46 -msgid "Documentation" -msgstr "" - -#: includes/admin/Admin_Settings.php:78 -msgid "GitHub Repository Settings" -msgstr "" - -#: includes/admin/Admin_Settings.php:85 -msgid "GitHub Documentation URL" -msgstr "" - -#: includes/admin/Admin_Settings.php:93 -msgid "GitHub Personal Access Token" -msgstr "" - -#: includes/admin/Admin_Settings.php:102 -msgid "Advanced Settings" -msgstr "" - -#: includes/admin/Admin_Settings.php:109 -msgid "Delete Data on Uninstall" -msgstr "" - -#: includes/admin/Admin_Settings.php:118 -msgid "Email Notifications" -msgstr "" - -#: includes/admin/Admin_Settings.php:125 -msgid "Enable Notifications" -msgstr "" - -#: includes/admin/Admin_Settings.php:133 -msgid "Notification Email" -msgstr "" - -#: includes/admin/Admin_Settings.php:141 -msgid "Notify on Success" -msgstr "" - -#: includes/admin/Admin_Settings.php:149 -msgid "Notify Unsynchronized" -msgstr "" - -#: includes/admin/Admin_Settings.php:181 -msgid "GitHub URL must use HTTPS protocol for security. URL was not saved." -msgstr "" - -#: includes/admin/Admin_Settings.php:210 -msgid "Warning: Token could not be encrypted. It has been saved in plain text." -msgstr "" - -#: includes/admin/Admin_Settings.php:251 -msgid "Configure your GitHub repository settings to synchronize documentation from GitHub to WordPress." -msgstr "" - -#: includes/admin/Admin_Settings.php:267 -msgid "Advanced configuration options for plugin behavior." -msgstr "" - -#: includes/admin/Admin_Settings.php:295 -msgid "Enter the full URL of your GitHub repository (e.g., https://github.com/owner/repository)" -msgstr "" - -#: includes/admin/Admin_Settings.php:322 -msgid "ghp_xxxxxxxxxxxx" -msgstr "" - -#. translators: %s: Link to GitHub Personal Access Tokens page -#: includes/admin/Admin_Settings.php:328 -#, php-format -msgid "Enter your GitHub Personal Access Token. %s" -msgstr "" - -#: includes/admin/Admin_Settings.php:333 -msgid "Create a token" -msgstr "" - -#: includes/admin/Admin_Settings.php:340 -msgid "How to create a GitHub Personal Access Token:" -msgstr "" - -#: includes/admin/Admin_Settings.php:343 -msgid "Go to GitHub → Settings → Developer settings → Personal access tokens" -msgstr "" - -#: includes/admin/Admin_Settings.php:344 -msgid "Click \"Generate new token\" (classic)" -msgstr "" - -#: includes/admin/Admin_Settings.php:345 -msgid "Give it a descriptive name (e.g., \"WordPress Documentation Sync\")" -msgstr "" - -#: includes/admin/Admin_Settings.php:348 -msgid "For public repositories: No specific scopes needed" -msgstr "" - -#: includes/admin/Admin_Settings.php:355 -msgid "For private repositories: Select the \"repo\" scope" -msgstr "" - -#: includes/admin/Admin_Settings.php:361 -msgid "Click \"Generate token\" and copy it immediately" -msgstr "" - -#: includes/admin/Admin_Settings.php:362 -msgid "Paste the token in the field above and save" -msgstr "" - -#: includes/admin/Admin_Settings.php:367 -msgid "Note: For security, your token is stored encrypted and will be shown as dots once saved." -msgstr "" - -#: includes/admin/Admin_Settings.php:397 -msgid "Delete all plugin data when uninstalling" -msgstr "" - -#: includes/admin/Admin_Settings.php:401 -msgid "If enabled, all plugin settings and mapping configurations will be deleted when you uninstall the plugin." -msgstr "" - -#: includes/admin/Admin_Settings.php:409 -msgid "Important:" -msgstr "" - -#: includes/admin/Admin_Settings.php:411 -msgid "Your synced documentation content (pages/posts) will NOT be deleted, only the mapping configurations and plugin settings." -msgstr "" - -#: includes/admin/Admin_Settings.php:419 -msgid "This ensures your documentation remains available even after uninstalling the plugin." -msgstr "" - -#: includes/admin/Admin_Settings.php:438 -msgid "Configure email notifications for sync events." -msgstr "" - -#: includes/admin/Admin_Settings.php:458 -msgid "Send email notifications for sync errors" -msgstr "" - -#: includes/admin/Admin_Settings.php:461 -msgid "You will receive an email when a sync operation fails (rate limited to once per hour per mapping)." -msgstr "" - -#. translators: %s: Default admin email -#: includes/admin/Admin_Settings.php:482 -#, php-format -msgid "Email address for notifications (default: %s)." -msgstr "" - -#: includes/admin/Admin_Settings.php:503 -msgid "Send email notifications for successful syncs" -msgstr "" - -#: includes/admin/Admin_Settings.php:506 -msgid "Receive an email confirmation when content is successfully synchronized (not recommended for frequent syncs)." -msgstr "" - -#: includes/admin/Admin_Settings.php:524 -msgid "Notify when mappings have not been synchronized" -msgstr "" - -#: includes/admin/Admin_Settings.php:527 -msgid "Receive alerts when enabled mappings with auto-sync have never been synchronized (rate limited to once per hour)." -msgstr "" - -#: includes/admin/Admin_Settings.php:550 -msgid "Settings saved successfully." -msgstr "" - -#: includes/admin/Admin_Settings.php:563 -msgid "Documentation Markdown allows you to automatically synchronize Markdown documentation from GitHub repositories to your WordPress site." -msgstr "" - -#: includes/admin/Admin_Settings.php:575 -msgid "Save Settings" -msgstr "" - -#: includes/admin/Admin_Settings.php:580 -msgid "About This Plugin" -msgstr "" - -#: includes/admin/Admin_Settings.php:583 -msgid "This plugin synchronizes Markdown documentation from GitHub repositories and converts it into WordPress pages or posts automatically." -msgstr "" - -#: includes/admin/Admin_Settings.php:590 -msgid "Version:" -msgstr "" - -#: includes/admin/Admin_Settings.php:594 -msgid "Developer:" -msgstr "" - -#: includes/Cron_Manager.php:43 -msgid "Never (Manual Only)" -msgstr "" - -#: includes/Cron_Manager.php:47 -msgid "Every 1 Minute" -msgstr "" - -#: includes/Cron_Manager.php:51 -msgid "Every 5 Minutes" -msgstr "" - -#: includes/Cron_Manager.php:55 -msgid "Every 10 Minutes" -msgstr "" - -#: includes/Cron_Manager.php:59 -msgid "Every 15 Minutes" -msgstr "" - -#: includes/Cron_Manager.php:63 -msgid "Every 30 Minutes" -msgstr "" - -#: includes/Cron_Manager.php:67 -msgid "Every 1 Hour" -msgstr "" - -#: includes/Cron_Manager.php:71 -msgid "Every 2 Hours" -msgstr "" - -#: includes/Cron_Manager.php:75 -msgid "Every 4 Hours" -msgstr "" - -#: includes/Cron_Manager.php:79 -msgid "Every 6 Hours" -msgstr "" - -#: includes/Cron_Manager.php:83 -msgid "Every 12 Hours" -msgstr "" - -#: includes/Cron_Manager.php:87 -msgid "Once Daily" -msgstr "" - -#: includes/Cron_Manager.php:238 -#: includes/Cron_Manager.php:247 -msgid "Now" -msgstr "" - -#. translators: %s: Mapping title -#: includes/Cron_Manager.php:286 -#, php-format -msgid "[Documentation Sync] Error: %s" -msgstr "" - -#. translators: %s: Mapping title -#: includes/Cron_Manager.php:332 -#, php-format -msgid "[Documentation Sync] Success: %s" -msgstr "" - -#: includes/Cron_Manager.php:397 -msgid "[Documentation Sync] Unsynchronized Files Found" -msgstr "" - -#. translators: 1: Mapping title, 2: Error message -#: includes/Cron_Manager.php:491 -#, php-format -msgid "" -"Failed to sync documentation: %1$s\n" -"\n" -"Error: %2$s\n" -"\n" -"" -msgstr "" - -#: includes/Cron_Manager.php:496 -#: includes/Cron_Manager.php:538 -msgid "" -"Repository Details:\n" -"" -msgstr "" - -#. translators: %s: Admin URL -#: includes/Cron_Manager.php:504 -#, php-format -msgid "" -"Manage mappings: %s\n" -"" -msgstr "" - -#. translators: %s: Mapping title -#: includes/Cron_Manager.php:522 -#, php-format -msgid "" -"Successfully synchronized documentation: %s\n" -"\n" -"" -msgstr "" - -#. translators: 1: Post title, 2: Post URL -#: includes/Cron_Manager.php:531 -#, php-format -msgid "" -"Post: %1$s\n" -"View: %2$s\n" -"\n" -"" -msgstr "" - -#. translators: %d: Number of unsynchronized mappings -#: includes/Cron_Manager.php:558 -#, php-format -msgid "There is %d documentation mapping that has not been synchronized:" -msgid_plural "There are %d documentation mappings that have not been synchronized:" -msgstr[0] "" -msgstr[1] "" - -#. translators: %s: Admin URL -#: includes/Cron_Manager.php:579 -#, php-format -msgid "" -"Please review and sync these mappings: %s\n" -"" -msgstr "" - -#: includes/encryption-functions.php:34 -msgid "OpenSSL extension is required for token encryption" -msgstr "" - -#: includes/encryption-functions.php:47 -#: includes/encryption-functions.php:112 -msgid "Failed to determine cipher IV length" -msgstr "" - -#: includes/encryption-functions.php:64 -msgid "Encryption failed" -msgstr "" - -#: includes/encryption-functions.php:90 -msgid "OpenSSL extension is required for token decryption" -msgstr "" - -#: includes/encryption-functions.php:99 -msgid "Invalid encrypted data format" -msgstr "" - -#: includes/encryption-functions.php:130 -msgid "Decryption failed" -msgstr "" - -#: includes/GitHub_API_Client.php:81 -msgid "Invalid response from GitHub API: missing required fields" -msgstr "" - -#: includes/GitHub_API_Client.php:91 -msgid "Failed to decode file content from GitHub" -msgstr "" - -#: includes/GitHub_API_Client.php:132 -msgid "SHA not found in GitHub API response" -msgstr "" - -#. translators: %s: Error message -#: includes/GitHub_API_Client.php:213 -#, php-format -msgid "GitHub API request failed: %s" -msgstr "" - -#: includes/GitHub_API_Client.php:230 -msgid "Unknown error" -msgstr "" - -#: includes/GitHub_API_Client.php:234 -msgid "Authentication failed. Please check your GitHub token." -msgstr "" - -#: includes/GitHub_API_Client.php:235 -msgid "Access forbidden. Check your token permissions or rate limit." -msgstr "" - -#: includes/GitHub_API_Client.php:236 -msgid "File not found in repository. Please verify the file path and branch." -msgstr "" - -#. translators: 1: HTTP status code, 2: Error message -#: includes/GitHub_API_Client.php:239 -#, php-format -msgid "GitHub API error (%1$d): %2$s" -msgstr "" - -#. translators: %s: JSON error message -#: includes/GitHub_API_Client.php:255 -#, php-format -msgid "Invalid JSON response from GitHub: %s" -msgstr "" - -#: includes/GitHub_API_Client.php:347 -msgid "unknown" -msgstr "" - -#. translators: %s: Reset time -#: includes/GitHub_API_Client.php:352 -#, php-format -msgid "GitHub API rate limit nearly exceeded. Resets at: %s" -msgstr "" - -#: includes/mapping-functions.php:73 -#: includes/mapping-functions.php:118 -msgid "Invalid mapping ID" -msgstr "" - -#: includes/mapping-functions.php:124 -msgid "Failed to delete mapping" -msgstr "" - -#: includes/mapping-functions.php:227 -msgid "Repository owner is required" -msgstr "" - -#: includes/mapping-functions.php:233 -msgid "Invalid repository owner format" -msgstr "" - -#: includes/mapping-functions.php:238 -msgid "Repository name is required" -msgstr "" - -#: includes/mapping-functions.php:244 -msgid "Invalid repository name format" -msgstr "" - -#: includes/mapping-functions.php:249 -msgid "File path is required" -msgstr "" - -#: includes/mapping-functions.php:256 -msgid "File path cannot contain \"..\"" -msgstr "" - -#: includes/mapping-functions.php:261 -msgid "File must be .md or .markdown" -msgstr "" - -#: includes/mapping-functions.php:268 -msgid "Invalid branch name format" -msgstr "" - -#: includes/mapping-functions.php:275 -msgid "Post type does not exist" -msgstr "" - -#: includes/Plugin.php:172 -msgid "GitHub Doc Mappings" -msgstr "" - -#: includes/Plugin.php:173 -msgid "GitHub Doc Mapping" -msgstr "" - -#: includes/Sync_Manager.php:84 -#: includes/Sync_Manager.php:422 -msgid "Synchronization is disabled for this mapping." -msgstr "" - -#. translators: %s: Error message from GitHub API -#: includes/Sync_Manager.php:259 -#, php-format -msgid "Failed to fetch file from GitHub: %s" -msgstr "" - -#. translators: %s: Error message -#: includes/Sync_Manager.php:441 -#, php-format -msgid "Failed to check for changes: %s" -msgstr "" - -#: includes/Sync_Manager.php:498 -msgid "GitHub Personal Access Token is not configured." -msgstr "" - -#: includes/Sync_Manager.php:504 -msgid "No active mappings configured." -msgstr "" - -#: includes/Sync_Manager.php:509 -msgid "OpenSSL extension is not available (required for token encryption)." -msgstr "" diff --git a/readme.txt b/readme.txt new file mode 100644 index 0000000..b90a2a9 --- /dev/null +++ b/readme.txt @@ -0,0 +1,299 @@ +=== Documentation Markdown (by ROBOTSTXT) === +Contributors: robotstxt +Tags: github, documentation, markdown, sync, automation +Requires at least: 6.7 +Tested up to: 7.0 +Requires PHP: 8.2 +Stable tag: 1.1.0 +License: GPLv3 or later +License URI: https://www.gnu.org/licenses/gpl-3.0.html + +Synchronize Markdown documentation from GitHub repositories to WordPress pages and posts automatically. + +== Description == + +**Documentation Markdown** is a powerful WordPress plugin that enables seamless synchronization of Markdown documentation files from GitHub repositories into your WordPress site. Perfect for maintaining technical documentation, API references, knowledge bases, and more - all with the power of version control. + += Key Features = + +* 🔄 **Automatic Synchronization** - Schedule automatic syncs via WordPress Cron (hourly, twice daily, daily) +* 📝 **Markdown to HTML** - Convert GitHub Flavored Markdown to clean HTML using CommonMark +* 🎯 **Flexible Mapping** - Map individual MD files to specific WordPress posts or pages +* 🔐 **Secure** - Encrypted GitHub token storage, full input validation & output escaping +* 🌍 **Translatable** - Full internationalization support (i18n/l10n ready) +* 📚 **Multi-Repository** - Sync from multiple GitHub repos simultaneously +* ⚡ **Manual Sync** - On-demand synchronization from admin interface +* 🐛 **Debug Tools** - Built-in debugging tools (visible when WP_DEBUG is enabled) + += Use Cases = + +* **API Documentation** - Keep your API docs in sync between GitHub and WordPress +* **Technical Documentation** - Maintain version-controlled technical docs +* **Knowledge Base** - Build a knowledge base powered by GitHub +* **Blog Posts** - Write blog posts in Markdown with Git workflow +* **Product Documentation** - Sync product documentation from your repository +* **Multi-language Documentation** - Manage translations in GitHub, publish to WordPress + += How It Works = + +1. Configure your GitHub Personal Access Token in plugin settings +2. Create mappings between GitHub Markdown files and WordPress content +3. Choose synchronization frequency (manual, hourly, twice daily, daily) +4. The plugin automatically fetches and converts Markdown to HTML +5. Your WordPress content stays in sync with your GitHub repository + += Requirements = + +* PHP 8.2 or higher +* WordPress 6.9 or higher +* GitHub Personal Access Token (free, for accessing repositories) +* Composer (for production build with dependencies) + += Security = + +* GitHub tokens encrypted at rest (AES-256-CBC) +* All user input sanitized +* All output escaped +* Nonce verification on all forms +* Capability checks for all admin actions +* Prepared statements for database queries +* Rate limiting for GitHub API + += Developer Friendly = + +* Clean, well-documented code +* Follows WordPress Coding Standards (WPCS) +* Modern PHP 8.2+ features +* Extensive PHPDoc documentation +* Procedural approach (KISS principles) +* Extensible with WordPress hooks and filters + +== Installation == + += Automatic Installation = + +1. Log in to your WordPress admin panel +2. Navigate to Plugins → Add New +3. Search for "Documentation Markdown ROBOTSTXT" +4. Click "Install Now" and then "Activate" + += Manual Installation = + +1. Download the plugin ZIP file +2. Upload to `/wp-content/plugins/` directory +3. Extract the files +4. Ensure Composer dependencies are installed (`composer install --no-dev`) +5. Activate the plugin through the 'Plugins' menu in WordPress + += After Installation = + +1. Navigate to 'Documentation → Settings' in the WordPress admin menu +2. Generate a GitHub Personal Access Token: + - Go to GitHub → Settings → Developer settings → Personal access tokens + - Click "Generate new token" + - For public repositories: No specific scopes needed + - For private repositories: Select `repo` scope +3. Paste your token in the plugin settings and save +4. Create your first mapping under 'Documentation → Mappings' + +== Frequently Asked Questions == + += Do I need a GitHub account? = + +Yes, you need a GitHub account to generate a Personal Access Token. The token is required to access repositories (public or private). + += Can I sync from private repositories? = + +Yes! When generating your GitHub Personal Access Token, make sure to select the `repo` scope for full access to private repositories. + += How often does synchronization happen? = + +You can configure synchronization frequency per mapping: +* Manual only (on-demand via "Sync Now" button) +* Hourly +* Twice daily +* Daily + +You can also manually trigger sync at any time. + += Will the plugin delete my WordPress content if I uninstall it? = + +By default, NO. When you uninstall the plugin, it preserves all synced WordPress pages/posts. However, there's an option in Settings to delete plugin data on uninstall (mappings, settings, etc.) - but this never deletes the actual WordPress content, only the plugin configuration. + += Can I sync multiple files from the same repository? = + +Yes! You can create multiple mappings, each pointing to different files in the same repository or different repositories. + += What Markdown syntax is supported? = + +The plugin uses CommonMark (league/commonmark), which supports GitHub Flavored Markdown including: +* Headings, paragraphs, lists +* Code blocks with syntax highlighting +* Tables +* Links and images +* Blockquotes +* And more! + += Does it support images from GitHub? = + +Currently, Markdown image links are converted to HTML, but images are not downloaded. Images must be publicly accessible via their GitHub URLs or you need to host them separately. + += Can I customize the HTML output? = + +The plugin converts Markdown to standard HTML. You can style the output using your theme's CSS by targeting the content area where documentation is displayed. + += Is there a limit on file size? = + +While there's no hard limit imposed by the plugin, GitHub API has size limitations. Very large files (>10MB) may cause issues. We recommend keeping documentation files under 1MB for best performance. + += What happens if GitHub is unavailable? = + +If GitHub API is unreachable during a scheduled sync, the plugin will fail gracefully and retry on the next scheduled interval. Your existing content remains unchanged. + += Can I edit synced content in WordPress? = + +You can edit synced content in WordPress, but be aware that the next synchronization will overwrite your changes with content from GitHub. We recommend making all edits in your GitHub repository. + += How do I debug synchronization issues? = + +Enable WP_DEBUG in your wp-config.php: +``` +define('WP_DEBUG', true); +``` + +Then go to Documentation → Settings, and you'll see a "Debug Tools" section at the bottom with: +* Test GitHub repository connection +* Test GitHub token validity +* View scheduled cron jobs +* Manually run cron jobs +* Clear plugin caches + +== Screenshots == + +1. Plugin Settings - Configure GitHub repository and token +2. Mappings List - View all your GitHub-to-WordPress mappings +3. Add/Edit Mapping - Create new mapping between GitHub file and WordPress content +4. Sync Status - Monitor synchronization status and history +5. Debug Tools - Built-in debugging interface (shown when WP_DEBUG is enabled) + +== Compatibility == + +* WordPress: 6.7 - 6.9 +* PHP: 8.2 - 8.5 + +== Changelog == + +For the complete changelog, see [changelog.txt](https://git.robotstxt.es/ROBOTSTXT/robotstxt-documentation-markdown/raw/branch/main/changelog.txt). + += 1.1.0 - 2026-03-28 = + +**Security** + +* Patched CVE-2026-33347 and CVE-2026-30838 (league/commonmark updated to 2.8.2) + +**Changed** + +* Access level changed from administrator (manage_options) to editor (edit_pages) — editors can now manage documentation mappings without requiring full admin access + +**Fixed** + +* PHPStan level 9 compliance: zero errors across all plugin files (down from 104) +* target_order (menu_order) field was in the UI but never saved or applied — now fully implemented +* Type-safety improvements for all WordPress API returns (get_option, get_post_meta, json_decode, size_format) +* Token decryption false return handled correctly +* Uninstall data cleanup narrows mixed option return before array access + +**Compatibility** + +* Verified compatible with WordPress 6.8 and 7.0 +* Verified compatible with PHP 8.4.x + += 1.0.0 - 2026-01-26 = + +**Initial Release** + +* ✨ Core synchronization functionality +* 🔄 Automatic scheduled sync (hourly, twice daily, daily) +* ⚡ Manual on-demand sync +* 📝 Markdown to HTML conversion using CommonMark +* 🎯 Flexible file-to-content mapping system +* 🔐 Encrypted GitHub token storage +* 🌍 Full internationalization support +* 📚 Multi-repository support +* 🎨 Clean admin interface with status badges +* 🔧 Custom Post Type for mapping management +* 📦 Support for pages, posts, and custom post types +* 👤 Configurable post author and parent page +* 🔢 Page order (menu_order) support +* 🐛 Debug tools for troubleshooting +* 🔄 Cron job management and repair tools +* 🧹 Clean uninstall with optional data deletion +* ✅ WordPress Coding Standards compliant +* 🛡️ Security best practices (nonces, escaping, sanitization) + +**Admin Features:** +* Settings page for GitHub configuration +* Mappings management interface +* Add/Edit mapping with validation +* Sync status monitoring +* Debug tools (when WP_DEBUG enabled) + - Test GitHub connection + - Test token validity + - View scheduled crons + - Run crons manually + - Fix cron schedules + - Clear plugin caches + +**Developer Features:** +* Procedural PHP following KISS principles +* PHP 8.2+ modern features +* Complete PHPDoc documentation +* WordPress hooks and filters +* Extensible architecture +* PHPCS and PHPStan validated + +== Upgrade Notice == + += 1.0.0 = +Initial release of Documentation Markdown. Sync your GitHub Markdown files to WordPress automatically! + +== Additional Information == + += Support = + +* **Documentation:** Comprehensive docs included in `/docs/` directory +* **Repository:** [Report issues](https://git.robotstxt.es/ROBOTSTXT/robotstxt-documentation-markdown/issues) +* **Website:** [ROBOTSTXT.es](https://www.robotstxt.es/) +* **Security:** robotstxt@robotstxt.es + += Contributing = + +We welcome contributions! Please visit our [Gitea repository](https://git.robotstxt.es/ROBOTSTXT/robotstxt-documentation-markdown) to: +* Report bugs +* Suggest features +* Submit pull requests + += Privacy = + +This plugin does not collect or store any user data. The only external connection made is to the GitHub API to fetch repository content. Your GitHub Personal Access Token is encrypted and stored locally in your WordPress database. + += Credits = + +Developed by ROBOTSTXT with ❤️ + +**Dependencies:** +* [league/commonmark](https://commonmark.thephpleague.com/) - Markdown parser and converter + += License = + +This plugin is licensed under the GNU General Public License v3.0 or later. + +== Compliance == + +This plugin adheres to the following security measures and review protocols for each version: + +* [WordPress Plugin Handbook](https://developer.wordpress.org/plugins/) +* [WordPress Plugin Security](https://developer.wordpress.org/plugins/wordpress-org/plugin-security/) +* [WordPress APIs Security](https://developer.wordpress.org/apis/security/) +* [WordPress Coding Standards](https://github.com/WordPress/WordPress-Coding-Standards) +* [Plugin Check (PCP)](https://wordpress.org/plugins/plugin-check/) diff --git a/robotstxt-documentation-markdown-functions.php b/robotstxt-documentation-markdown-functions.php index e767f78..e3c4641 100644 --- a/robotstxt-documentation-markdown-functions.php +++ b/robotstxt-documentation-markdown-functions.php @@ -16,9 +16,9 @@ if ( ! defined( 'ABSPATH' ) ) { * @since 1.0.0 * * @param string $token Plain token. - * @return string Encrypted token. + * @return string Encrypted token, or empty string on failure. */ -function robotstxt_docmd_encrypt_token( $token ) { +function robotstxt_docmd_encrypt_token( string $token ): string { if ( empty( $token ) ) { return ''; } @@ -27,9 +27,12 @@ function robotstxt_docmd_encrypt_token( $token ) { $key = wp_salt( 'auth' ); $iv_length = openssl_cipher_iv_length( 'aes-256-cbc' ); $iv = openssl_random_pseudo_bytes( $iv_length ); - $encrypted = openssl_encrypt( $token, 'aes-256-cbc', $key, 0, $iv ); + if ( false === $encrypted ) { + return ''; + } + return base64_encode( $iv . $encrypted ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode } @@ -39,9 +42,9 @@ function robotstxt_docmd_encrypt_token( $token ) { * @since 1.0.0 * * @param string $encrypted_token Encrypted token. - * @return string Plain token. + * @return string Plain token, or empty string on failure. */ -function robotstxt_docmd_decrypt_token( $encrypted_token ) { +function robotstxt_docmd_decrypt_token( string $encrypted_token ): string { if ( empty( $encrypted_token ) ) { return ''; } @@ -53,7 +56,8 @@ function robotstxt_docmd_decrypt_token( $encrypted_token ) { $iv = substr( $decoded, 0, $iv_length ); $encrypted = substr( $decoded, $iv_length ); - return openssl_decrypt( $encrypted, 'aes-256-cbc', $key, 0, $iv ); + $decrypted = openssl_decrypt( $encrypted, 'aes-256-cbc', $key, 0, $iv ); + return false !== $decrypted ? $decrypted : ''; } /** @@ -66,10 +70,11 @@ function robotstxt_docmd_decrypt_token( $encrypted_token ) { * @param string $file_path File path. * @return string Generated title. */ -function robotstxt_docmd_generate_title_from_path( $file_path ) { +function robotstxt_docmd_generate_title_from_path( string $file_path ): string { // Get filename without extension. $filename = basename( $file_path ); $title = preg_replace( '/\.(md|markdown)$/i', '', $filename ); + $title = is_string( $title ) ? $title : $filename; // Replace separators with spaces. $title = str_replace( array( '-', '_' ), ' ', $title ); @@ -91,7 +96,8 @@ function robotstxt_docmd_generate_title_from_path( $file_path ) { ); foreach ( $abbreviations as $search => $replace ) { - $title = preg_replace( '/\b' . $search . '\b/', $replace, $title ); + $result = preg_replace( '/\b' . $search . '\b/', $replace, $title ); + $title = is_string( $result ) ? $result : $title; } return $title; @@ -105,7 +111,7 @@ function robotstxt_docmd_generate_title_from_path( $file_path ) { * @param string $status Status (never, pending, success, error). * @return string Badge HTML. */ -function robotstxt_docmd_get_status_badge( $status ) { +function robotstxt_docmd_get_status_badge( string $status ): string { $badges = array( 'never' => array( 'class' => 'status-never', @@ -133,3 +139,41 @@ function robotstxt_docmd_get_status_badge( $status ) { esc_html( $badge['label'] ) ); } + +/** + * Safely get a string value from a superglobal array + * + * Provides PHPStan level 9 compliant type-narrowing for superglobal access. + * + * @since 1.0.1 + * + * @param array $input The superglobal array ($_POST, $_GET, etc.). + * @param string $key The key to look for. + * @param string $fallback Default value if key not found or not a string. + * @return string + */ +function robotstxt_docmd_input_string( array $input, string $key, string $fallback = '' ): string { + if ( isset( $input[ $key ] ) && is_string( $input[ $key ] ) ) { + return $input[ $key ]; + } + return $fallback; +} + +/** + * Safely get an integer value from a superglobal array + * + * Provides PHPStan level 9 compliant type-narrowing for superglobal access. + * + * @since 1.0.1 + * + * @param array $input The superglobal array ($_POST, $_GET, etc.). + * @param string $key The key to look for. + * @param int $fallback Default value if key not found or not numeric. + * @return int + */ +function robotstxt_docmd_input_int( array $input, string $key, int $fallback = 0 ): int { + if ( isset( $input[ $key ] ) && is_numeric( $input[ $key ] ) ) { + return (int) $input[ $key ]; + } + return $fallback; +} diff --git a/robotstxt-documentation-markdown-github.php b/robotstxt-documentation-markdown-github.php index 3e560f6..4aadd12 100644 --- a/robotstxt-documentation-markdown-github.php +++ b/robotstxt-documentation-markdown-github.php @@ -16,9 +16,9 @@ if ( ! defined( 'ABSPATH' ) ) { * @since 1.0.0 * * @param string $url GitHub repository URL. - * @return array|WP_Error Array with 'owner' and 'repo' or error. + * @return array{owner: string, repo: string}|WP_Error Array with 'owner' and 'repo' or error. */ -function robotstxt_docmd_parse_github_url( $url ) { +function robotstxt_docmd_parse_github_url( string $url ): array|WP_Error { if ( ! str_starts_with( $url, 'https://' ) ) { return new WP_Error( 'invalid_url', __( 'GitHub URL must use HTTPS', 'robotstxt-documentation-markdown' ) ); } @@ -33,6 +33,43 @@ function robotstxt_docmd_parse_github_url( $url ) { return new WP_Error( 'invalid_format', __( 'Could not parse GitHub URL', 'robotstxt-documentation-markdown' ) ); } +/** + * Validate and normalize a list of file data from cache or API response + * + * Converts untyped cache data back into the expected typed structure. + * Required for PHPStan level 9 compliance with transient cache usage. + * + * @since 1.0.1 + * + * @param mixed $data Raw data to validate (typically from get_transient()). + * @return list + */ +function robotstxt_docmd_validate_file_list( mixed $data ): array { + if ( ! is_array( $data ) ) { + return array(); + } + + $result = array(); + foreach ( $data as $item ) { + if ( is_array( $item ) + && isset( $item['path'], $item['name'], $item['size'], $item['sha'] ) + && is_string( $item['path'] ) + && is_string( $item['name'] ) + && is_int( $item['size'] ) + && is_string( $item['sha'] ) + ) { + $result[] = array( + 'path' => $item['path'], + 'name' => $item['name'], + 'size' => $item['size'], + 'sha' => $item['sha'], + ); + } + } + + return $result; +} + /** * Get all markdown files from repository * @@ -42,15 +79,15 @@ function robotstxt_docmd_parse_github_url( $url ) { * @param string $repo Repository name. * @param string $branch Branch name. * @param string $token GitHub token (encrypted). - * @return array|WP_Error Array of files or error. + * @return list|WP_Error Array of files or error. */ -function robotstxt_docmd_get_all_markdown_files( $owner, $repo, $branch, $token ) { +function robotstxt_docmd_get_all_markdown_files( string $owner, string $repo, string $branch, string $token ): array|WP_Error { // Check cache first. $cache_key = sprintf( 'robotstxt_docmd_files_%s_%s_%s', $owner, $repo, $branch ); $cached = get_transient( $cache_key ); if ( false !== $cached ) { - return $cached; + return robotstxt_docmd_validate_file_list( $cached ); } // Decrypt token. @@ -63,16 +100,13 @@ function robotstxt_docmd_get_all_markdown_files( $owner, $repo, $branch, $token return $files; } - // Filter only markdown files. - $markdown_files = array_filter( - $files, - function ( $file ) { - return preg_match( '/\.(md|markdown)$/i', $file['path'] ); + // Filter only markdown files and re-index. + $markdown_files = array(); + foreach ( $files as $file ) { + if ( preg_match( '/\.(md|markdown)$/i', $file['path'] ) ) { + $markdown_files[] = $file; } - ); - - // Re-index array. - $markdown_files = array_values( $markdown_files ); + } // Cache for 24 hours. set_transient( $cache_key, $markdown_files, DAY_IN_SECONDS ); @@ -91,9 +125,9 @@ function robotstxt_docmd_get_all_markdown_files( $owner, $repo, $branch, $token * @param string $branch Branch name. * @param string $token GitHub token (plain). * @param int $depth Current depth (for recursion limit). - * @return array|WP_Error Array of files or error. + * @return list|WP_Error Array of files or error. */ -function robotstxt_docmd_get_repository_contents_recursive( $owner, $repo, $path, $branch, $token, $depth = 0 ) { +function robotstxt_docmd_get_repository_contents_recursive( string $owner, string $repo, string $path, string $branch, string $token, int $depth = 0 ): array|WP_Error { // Prevent infinite recursion. if ( $depth > 10 ) { return array(); @@ -145,6 +179,17 @@ function robotstxt_docmd_get_repository_contents_recursive( $owner, $repo, $path $files = array(); foreach ( $contents as $item ) { + if ( ! is_array( $item ) + || ! isset( $item['type'], $item['path'], $item['name'], $item['size'], $item['sha'] ) + || ! is_string( $item['type'] ) + || ! is_string( $item['path'] ) + || ! is_string( $item['name'] ) + || ! is_string( $item['sha'] ) + || ! is_int( $item['size'] ) + ) { + continue; + } + if ( 'file' === $item['type'] ) { // Skip files larger than 10MB. if ( $item['size'] > 10 * 1024 * 1024 ) { @@ -189,7 +234,7 @@ function robotstxt_docmd_get_repository_contents_recursive( $owner, $repo, $path * @param string $token GitHub token (encrypted). * @return string|WP_Error File content or error. */ -function robotstxt_docmd_get_file_content( $owner, $repo, $file_path, $branch, $token ) { +function robotstxt_docmd_get_file_content( string $owner, string $repo, string $file_path, string $branch, string $token ): string|WP_Error { $decrypted_token = robotstxt_docmd_decrypt_token( $token ); $url = sprintf( @@ -231,7 +276,11 @@ function robotstxt_docmd_get_file_content( $owner, $repo, $file_path, $branch, $ $body = wp_remote_retrieve_body( $response ); $data = json_decode( $body, true ); - if ( ! isset( $data['content'] ) || ! isset( $data['encoding'] ) ) { + if ( ! is_array( $data ) + || ! isset( $data['content'], $data['encoding'] ) + || ! is_string( $data['content'] ) + || ! is_string( $data['encoding'] ) + ) { return new WP_Error( 'invalid_response', __( 'Invalid file response from GitHub', 'robotstxt-documentation-markdown' ) ); } diff --git a/robotstxt-documentation-markdown-map.php b/robotstxt-documentation-markdown-map.php index 8f3f5e2..4e160d7 100644 --- a/robotstxt-documentation-markdown-map.php +++ b/robotstxt-documentation-markdown-map.php @@ -15,9 +15,9 @@ if ( ! defined( 'ABSPATH' ) ) { * * @since 1.0.0 * - * @return array Array of mappings. + * @return list Array of mappings. */ -function robotstxt_docmd_get_all_mappings() { +function robotstxt_docmd_get_all_mappings(): array { $args = array( 'post_type' => 'robotstxt_map', 'posts_per_page' => -1, @@ -30,6 +30,9 @@ function robotstxt_docmd_get_all_mappings() { $mappings = array(); foreach ( $query->posts as $post ) { + if ( ! ( $post instanceof WP_Post ) ) { + continue; + } $mapping = robotstxt_docmd_get_mapping( $post->ID ); if ( $mapping ) { $mappings[] = $mapping; @@ -47,23 +50,34 @@ function robotstxt_docmd_get_all_mappings() { * @since 1.0.0 * * @param int $mapping_id Mapping post ID. - * @return array|null Mapping data or null. + * @return MappingData|null Mapping data or null. */ -function robotstxt_docmd_get_mapping( $mapping_id ) { +function robotstxt_docmd_get_mapping( int $mapping_id ): ?array { $post = get_post( $mapping_id ); if ( ! $post || 'robotstxt_map' !== $post->post_type ) { return null; } - $repo_owner = get_post_meta( $mapping_id, '_robotstxt_docmd_repo_owner', true ); - $repo_name = get_post_meta( $mapping_id, '_robotstxt_docmd_repo_name', true ); - $file_path = get_post_meta( $mapping_id, '_robotstxt_docmd_file_path', true ); - $branch = get_post_meta( $mapping_id, '_robotstxt_docmd_branch', true ); + $repo_owner_raw = get_post_meta( $mapping_id, '_robotstxt_docmd_repo_owner', true ); + $repo_name_raw = get_post_meta( $mapping_id, '_robotstxt_docmd_repo_name', true ); + $file_path_raw = get_post_meta( $mapping_id, '_robotstxt_docmd_file_path', true ); + $branch_raw = get_post_meta( $mapping_id, '_robotstxt_docmd_branch', true ); - if ( empty( $branch ) ) { - $branch = 'main'; - } + $repo_owner = is_string( $repo_owner_raw ) ? $repo_owner_raw : ''; + $repo_name = is_string( $repo_name_raw ) ? $repo_name_raw : ''; + $file_path = is_string( $file_path_raw ) ? $file_path_raw : ''; + $branch = is_string( $branch_raw ) && '' !== $branch_raw ? $branch_raw : 'main'; + + $post_type_raw = get_post_meta( $mapping_id, '_robotstxt_docmd_target_post_type', true ); + $sync_frequency_raw = get_post_meta( $mapping_id, '_robotstxt_docmd_sync_frequency', true ); + $sync_status_raw = get_post_meta( $mapping_id, '_robotstxt_docmd_sync_status', true ); + $last_sync_raw = get_post_meta( $mapping_id, '_robotstxt_docmd_last_sync', true ); + + $target_post_id_raw = get_post_meta( $mapping_id, '_robotstxt_docmd_target_post_id', true ); + $target_author_raw = get_post_meta( $mapping_id, '_robotstxt_docmd_target_author', true ); + $target_parent_raw = get_post_meta( $mapping_id, '_robotstxt_docmd_target_parent', true ); + $target_order_raw = get_post_meta( $mapping_id, '_robotstxt_docmd_target_order', true ); return array( 'id' => $mapping_id, @@ -73,14 +87,15 @@ function robotstxt_docmd_get_mapping( $mapping_id ) { 'file_path' => $file_path, 'branch' => $branch, 'github_url' => sprintf( 'https://github.com/%s/%s/blob/%s/%s', $repo_owner, $repo_name, $branch, $file_path ), - 'target_post_type' => get_post_meta( $mapping_id, '_robotstxt_docmd_target_post_type', true ), - 'target_post_id' => absint( get_post_meta( $mapping_id, '_robotstxt_docmd_target_post_id', true ) ), - 'target_author' => absint( get_post_meta( $mapping_id, '_robotstxt_docmd_target_author', true ) ), - 'target_parent' => absint( get_post_meta( $mapping_id, '_robotstxt_docmd_target_parent', true ) ), + 'target_post_type' => is_string( $post_type_raw ) ? $post_type_raw : '', + 'target_post_id' => is_numeric( $target_post_id_raw ) ? absint( $target_post_id_raw ) : 0, + 'target_author' => is_numeric( $target_author_raw ) ? absint( $target_author_raw ) : 0, + 'target_parent' => is_numeric( $target_parent_raw ) ? absint( $target_parent_raw ) : 0, + 'target_order' => is_numeric( $target_order_raw ) ? absint( $target_order_raw ) : 0, 'sync_enabled' => (bool) get_post_meta( $mapping_id, '_robotstxt_docmd_sync_enabled', true ), - 'sync_frequency' => get_post_meta( $mapping_id, '_robotstxt_docmd_sync_frequency', true ), - 'sync_status' => get_post_meta( $mapping_id, '_robotstxt_docmd_sync_status', true ) ? get_post_meta( $mapping_id, '_robotstxt_docmd_sync_status', true ) : 'never', - 'last_sync' => get_post_meta( $mapping_id, '_robotstxt_docmd_last_sync', true ), + 'sync_frequency' => is_string( $sync_frequency_raw ) ? $sync_frequency_raw : 'daily', + 'sync_status' => is_string( $sync_status_raw ) && '' !== $sync_status_raw ? $sync_status_raw : 'never', + 'last_sync' => is_string( $last_sync_raw ) ? $last_sync_raw : '', ); } @@ -89,10 +104,11 @@ function robotstxt_docmd_get_mapping( $mapping_id ) { * * @since 1.0.0 * - * @param array $data Mapping data. + * @param array $data Mapping input data. + * @phpstan-param MappingInput $data * @return int|WP_Error Mapping ID or error. */ -function robotstxt_docmd_create_mapping( $data ) { +function robotstxt_docmd_create_mapping( array $data ): int|WP_Error { // Check for duplicates. if ( robotstxt_docmd_is_file_mapped( $data['repo_owner'], $data['repo_name'], $data['file_path'], $data['branch'] ) ) { return new WP_Error( 'duplicate_mapping', __( 'This file is already mapped', 'robotstxt-documentation-markdown' ) ); @@ -119,7 +135,8 @@ function robotstxt_docmd_create_mapping( $data ) { update_post_meta( $post_id, '_robotstxt_docmd_branch', $data['branch'] ); update_post_meta( $post_id, '_robotstxt_docmd_target_post_type', $data['target_post_type'] ); update_post_meta( $post_id, '_robotstxt_docmd_target_author', $data['target_author'] ); - update_post_meta( $post_id, '_robotstxt_docmd_target_parent', $data['target_parent'] ?? 0 ); + update_post_meta( $post_id, '_robotstxt_docmd_target_parent', $data['target_parent'] ); + update_post_meta( $post_id, '_robotstxt_docmd_target_order', $data['target_order'] ); update_post_meta( $post_id, '_robotstxt_docmd_sync_enabled', $data['sync_enabled'] ? 1 : 0 ); update_post_meta( $post_id, '_robotstxt_docmd_sync_frequency', $data['sync_frequency'] ); @@ -141,10 +158,11 @@ function robotstxt_docmd_create_mapping( $data ) { * @since 1.0.0 * * @param int $mapping_id Mapping ID. - * @param array $data Mapping data. - * @return bool|WP_Error True on success or error. + * @param array $data Mapping input data. + * @phpstan-param MappingInput $data + * @return bool True on success. */ -function robotstxt_docmd_update_mapping( $mapping_id, $data ) { +function robotstxt_docmd_update_mapping( int $mapping_id, array $data ): bool { // Update post title. wp_update_post( array( @@ -160,7 +178,8 @@ function robotstxt_docmd_update_mapping( $mapping_id, $data ) { update_post_meta( $mapping_id, '_robotstxt_docmd_branch', $data['branch'] ); update_post_meta( $mapping_id, '_robotstxt_docmd_target_post_type', $data['target_post_type'] ); update_post_meta( $mapping_id, '_robotstxt_docmd_target_author', $data['target_author'] ); - update_post_meta( $mapping_id, '_robotstxt_docmd_target_parent', $data['target_parent'] ?? 0 ); + update_post_meta( $mapping_id, '_robotstxt_docmd_target_parent', $data['target_parent'] ); + update_post_meta( $mapping_id, '_robotstxt_docmd_target_order', $data['target_order'] ); update_post_meta( $mapping_id, '_robotstxt_docmd_sync_enabled', $data['sync_enabled'] ? 1 : 0 ); update_post_meta( $mapping_id, '_robotstxt_docmd_sync_frequency', $data['sync_frequency'] ); @@ -185,7 +204,7 @@ function robotstxt_docmd_update_mapping( $mapping_id, $data ) { * @param int $mapping_id Mapping ID. * @return bool True on success. */ -function robotstxt_docmd_delete_mapping( $mapping_id ) { +function robotstxt_docmd_delete_mapping( int $mapping_id ): bool { robotstxt_docmd_unschedule_mapping_sync( $mapping_id ); wp_delete_post( $mapping_id, true ); return true; @@ -202,7 +221,7 @@ function robotstxt_docmd_delete_mapping( $mapping_id ) { * @param string $branch Branch name. * @return bool True if mapped. */ -function robotstxt_docmd_is_file_mapped( $owner, $repo, $file_path, $branch ) { +function robotstxt_docmd_is_file_mapped( string $owner, string $repo, string $file_path, string $branch ): bool { $args = array( 'post_type' => 'robotstxt_map', 'posts_per_page' => 1, @@ -238,7 +257,7 @@ function robotstxt_docmd_is_file_mapped( $owner, $repo, $file_path, $branch ) { * @param int $mapping_id Mapping ID. * @return bool|WP_Error True on success or error. */ -function robotstxt_docmd_sync_mapping( $mapping_id ) { +function robotstxt_docmd_sync_mapping( int $mapping_id ): bool|WP_Error { $mapping = robotstxt_docmd_get_mapping( $mapping_id ); if ( ! $mapping ) { @@ -249,8 +268,10 @@ function robotstxt_docmd_sync_mapping( $mapping_id ) { update_post_meta( $mapping_id, '_robotstxt_docmd_sync_status', 'pending' ); // Get settings. - $settings = get_option( 'robotstxt_docmd_settings', array() ); - $token = $settings['github_token'] ?? ''; + $raw_settings = get_option( 'robotstxt_docmd_settings' ); + $settings = is_array( $raw_settings ) ? $raw_settings : array(); + $token_raw = $settings['github_token'] ?? ''; + $token = is_string( $token_raw ) ? $token_raw : ''; if ( empty( $token ) ) { update_post_meta( $mapping_id, '_robotstxt_docmd_sync_status', 'error' ); @@ -286,6 +307,7 @@ function robotstxt_docmd_sync_mapping( $mapping_id ) { 'post_status' => 'publish', 'post_author' => $mapping['target_author'], 'post_parent' => $mapping['target_parent'], + 'menu_order' => $mapping['target_order'], ), true ); diff --git a/robotstxt-documentation-markdown.php b/robotstxt-documentation-markdown.php index cd1ee6e..5d1fad1 100644 --- a/robotstxt-documentation-markdown.php +++ b/robotstxt-documentation-markdown.php @@ -3,8 +3,8 @@ * Plugin Name: Documentation Markdown (by ROBOTSTXT) * Plugin URI: https://git.robotstxt.es/ROBOTSTXT/robotstxt-documentation-markdown * Description: Synchronizes Markdown documentation from GitHub repositories to WordPress pages and posts automatically. - * Version: 1.0.0 - * Requires at least: 6.5 + * Version: 1.1.0 + * Requires at least: 6.7 * Requires PHP: 8.2 * Security: robotstxt@robotstxt.es * Author: ROBOTSTXT @@ -26,7 +26,7 @@ if ( ! defined( 'ABSPATH' ) ) { } // Define plugin constants. -define( 'ROBOTSTXT_DOCMD_VERSION', '1.0.0' ); +define( 'ROBOTSTXT_DOCMD_VERSION', '1.1.0' ); define( 'ROBOTSTXT_DOCMD_PLUGIN_FILE', __FILE__ ); define( 'ROBOTSTXT_DOCMD_PLUGIN_DIR', plugin_dir_path( __FILE__ ) ); define( 'ROBOTSTXT_DOCMD_PLUGIN_URL', plugin_dir_url( __FILE__ ) ); @@ -99,13 +99,6 @@ function robotstxt_docmd_deactivate() { * @return void */ function robotstxt_docmd_init() { - // Load textdomain. - load_plugin_textdomain( - 'robotstxt-documentation-markdown', - false, - dirname( plugin_basename( __FILE__ ) ) . '/languages' - ); - // Register CPT. robotstxt_docmd_register_post_types(); } @@ -154,7 +147,7 @@ function robotstxt_docmd_register_admin_menu() { add_menu_page( __( 'Documentation', 'robotstxt-documentation-markdown' ), __( 'Documentation', 'robotstxt-documentation-markdown' ), - 'manage_options', + 'edit_pages', 'robotstxt-docmd-mappings', 'robotstxt_docmd_render_mappings_page', 'dashicons-media-document', @@ -166,7 +159,7 @@ function robotstxt_docmd_register_admin_menu() { 'robotstxt-docmd-mappings', __( 'Mappings', 'robotstxt-documentation-markdown' ), __( 'Mappings', 'robotstxt-documentation-markdown' ), - 'manage_options', + 'edit_pages', 'robotstxt-docmd-mappings', 'robotstxt_docmd_render_mappings_page' ); @@ -176,7 +169,7 @@ function robotstxt_docmd_register_admin_menu() { 'robotstxt-docmd-mappings', __( 'Discover Files', 'robotstxt-documentation-markdown' ), __( 'Discover Files', 'robotstxt-documentation-markdown' ), - 'manage_options', + 'edit_pages', 'robotstxt-docmd-discover', 'robotstxt_docmd_render_discover_page' ); @@ -186,7 +179,7 @@ function robotstxt_docmd_register_admin_menu() { 'robotstxt-docmd-mappings', __( 'Add New', 'robotstxt-documentation-markdown' ), __( 'Add New', 'robotstxt-documentation-markdown' ), - 'manage_options', + 'edit_pages', 'robotstxt-docmd-add-mapping', 'robotstxt_docmd_render_add_mapping_page' ); @@ -196,7 +189,7 @@ function robotstxt_docmd_register_admin_menu() { 'robotstxt-docmd-mappings', __( 'Settings', 'robotstxt-documentation-markdown' ), __( 'Settings', 'robotstxt-documentation-markdown' ), - 'manage_options', + 'edit_pages', 'robotstxt-docmd-settings', 'robotstxt_docmd_render_settings_page' ); @@ -232,14 +225,14 @@ function robotstxt_docmd_enqueue_admin_assets( $hook ) { * @return void */ function robotstxt_docmd_handle_admin_actions() { - if ( ! current_user_can( 'manage_options' ) ) { + if ( ! current_user_can( 'edit_pages' ) ) { return; } // Handle mapping form submission (POST). // phpcs:ignore WordPress.Security.NonceVerification.Missing if ( isset( $_POST['robotstxt_docmd_nonce'] ) && isset( $_POST['title'] ) ) { - if ( wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['robotstxt_docmd_nonce'] ) ), 'robotstxt_docmd_save_mapping' ) ) { + if ( wp_verify_nonce( sanitize_text_field( wp_unslash( robotstxt_docmd_input_string( $_POST, 'robotstxt_docmd_nonce' ) ) ), 'robotstxt_docmd_save_mapping' ) ) { robotstxt_docmd_handle_save_mapping(); // The function above will redirect and exit. } @@ -248,7 +241,7 @@ function robotstxt_docmd_handle_admin_actions() { // Handle settings form submission (POST). // phpcs:ignore WordPress.Security.NonceVerification.Missing if ( isset( $_POST['robotstxt_docmd_nonce'] ) && isset( $_POST['github_url'] ) ) { - if ( wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['robotstxt_docmd_nonce'] ) ), 'robotstxt_docmd_save_settings' ) ) { + if ( wp_verify_nonce( sanitize_text_field( wp_unslash( robotstxt_docmd_input_string( $_POST, 'robotstxt_docmd_nonce' ) ) ), 'robotstxt_docmd_save_settings' ) ) { robotstxt_docmd_handle_save_settings(); // The function above will redirect and exit. } @@ -257,7 +250,7 @@ function robotstxt_docmd_handle_admin_actions() { // Handle debug actions (only on settings page). // phpcs:disable WordPress.Security.NonceVerification.Recommended if ( isset( $_GET['page'] ) && 'robotstxt-docmd-settings' === $_GET['page'] && isset( $_GET['debug_action'] ) ) { - $debug_action = sanitize_key( wp_unslash( $_GET['debug_action'] ) ); + $debug_action = sanitize_key( wp_unslash( robotstxt_docmd_input_string( $_GET, 'debug_action' ) ) ); if ( 'test_github' === $debug_action ) { check_admin_referer( 'robotstxt_docmd_debug_test_github' ); @@ -272,7 +265,7 @@ function robotstxt_docmd_handle_admin_actions() { } if ( 'run_cron' === $debug_action && isset( $_GET['mapping_id'] ) ) { - $mapping_id = absint( wp_unslash( $_GET['mapping_id'] ) ); + $mapping_id = robotstxt_docmd_input_int( $_GET, 'mapping_id' ); check_admin_referer( 'robotstxt_docmd_debug_run_cron_' . $mapping_id ); robotstxt_docmd_debug_run_cron( $mapping_id ); return; @@ -300,8 +293,8 @@ function robotstxt_docmd_handle_admin_actions() { return; } - $action = sanitize_key( wp_unslash( $_GET['action'] ) ); - $mapping_id = absint( wp_unslash( $_GET['mapping_id'] ) ); + $action = sanitize_key( wp_unslash( robotstxt_docmd_input_string( $_GET, 'action' ) ) ); + $mapping_id = robotstxt_docmd_input_int( $_GET, 'mapping_id' ); // phpcs:enable WordPress.Security.NonceVerification.Recommended if ( 'sync' === $action ) { @@ -332,7 +325,7 @@ function robotstxt_docmd_handle_admin_actions() { * @return void */ function robotstxt_docmd_render_mappings_page() { - if ( ! current_user_can( 'manage_options' ) ) { + if ( ! current_user_can( 'edit_pages' ) ) { wp_die( esc_html__( 'You do not have sufficient permissions.', 'robotstxt-documentation-markdown' ) ); } @@ -380,8 +373,8 @@ function robotstxt_docmd_render_mappings_page() { - - + + @@ -418,14 +411,15 @@ function robotstxt_docmd_render_mappings_page() { * @return void */ function robotstxt_docmd_render_discover_page() { - if ( ! current_user_can( 'manage_options' ) ) { + if ( ! current_user_can( 'edit_pages' ) ) { wp_die( esc_html__( 'You do not have sufficient permissions.', 'robotstxt-documentation-markdown' ) ); } // Get settings. - $settings = get_option( 'robotstxt_docmd_settings', array() ); - $github_url = $settings['github_url'] ?? ''; - $github_token = $settings['github_token'] ?? ''; + $raw_settings = get_option( 'robotstxt_docmd_settings', array() ); + $settings = is_array( $raw_settings ) ? $raw_settings : array(); + $github_url = robotstxt_docmd_input_string( $settings, 'github_url' ); + $github_token = robotstxt_docmd_input_string( $settings, 'github_token' ); // Parse GitHub URL. $repo_data = robotstxt_docmd_parse_github_url( $github_url ); @@ -452,11 +446,11 @@ function robotstxt_docmd_render_discover_page() { // Get branch from query string. // phpcs:ignore WordPress.Security.NonceVerification.Recommended - $branch = isset( $_GET['branch'] ) ? sanitize_text_field( wp_unslash( $_GET['branch'] ) ) : 'main'; + $branch = sanitize_text_field( wp_unslash( robotstxt_docmd_input_string( $_GET, 'branch', 'main' ) ) ); // Check if refresh requested. // phpcs:ignore WordPress.Security.NonceVerification.Recommended - $refresh = isset( $_GET['refresh'] ) && '1' === $_GET['refresh']; + $refresh = '1' === robotstxt_docmd_input_string( $_GET, 'refresh' ); if ( $refresh ) { $cache_key = sprintf( 'robotstxt_docmd_files_%s_%s_%s', $repo_data['owner'], $repo_data['repo'], $branch ); delete_transient( $cache_key ); @@ -542,15 +536,14 @@ function robotstxt_docmd_render_discover_page() { - + + @@ -599,28 +592,28 @@ function robotstxt_docmd_render_discover_page() { * @return void */ function robotstxt_docmd_render_add_mapping_page() { - if ( ! current_user_can( 'manage_options' ) ) { + if ( ! current_user_can( 'edit_pages' ) ) { wp_die( esc_html__( 'You do not have sufficient permissions.', 'robotstxt-documentation-markdown' ) ); } // Get mapping ID if editing. - // phpcs:ignore WordPress.Security.NonceVerification.Recommended - $mapping_id = isset( $_GET['mapping_id'] ) ? absint( wp_unslash( $_GET['mapping_id'] ) ) : 0; + // phpcs:disable WordPress.Security.NonceVerification.Recommended + $mapping_id = robotstxt_docmd_input_int( $_GET, 'mapping_id' ); $mapping = $mapping_id ? robotstxt_docmd_get_mapping( $mapping_id ) : null; // Pre-fill from discover page or defaults. $defaults = array( 'title' => '', - // phpcs:disable WordPress.Security.NonceVerification.Recommended - 'repo_owner' => isset( $_GET['owner'] ) ? sanitize_text_field( wp_unslash( $_GET['owner'] ) ) : '', - 'repo_name' => isset( $_GET['repo'] ) ? sanitize_text_field( wp_unslash( $_GET['repo'] ) ) : '', - 'file_path' => isset( $_GET['file_path'] ) ? urldecode( sanitize_text_field( wp_unslash( $_GET['file_path'] ) ) ) : '', - 'branch' => isset( $_GET['branch'] ) ? sanitize_text_field( wp_unslash( $_GET['branch'] ) ) : 'main', + 'repo_owner' => sanitize_text_field( wp_unslash( robotstxt_docmd_input_string( $_GET, 'owner' ) ) ), + 'repo_name' => sanitize_text_field( wp_unslash( robotstxt_docmd_input_string( $_GET, 'repo' ) ) ), + 'file_path' => urldecode( sanitize_text_field( wp_unslash( robotstxt_docmd_input_string( $_GET, 'file_path' ) ) ) ), + 'branch' => sanitize_text_field( wp_unslash( robotstxt_docmd_input_string( $_GET, 'branch', 'main' ) ) ), // phpcs:enable WordPress.Security.NonceVerification.Recommended 'target_post_type' => 'page', 'target_post_id' => 0, 'target_author' => get_current_user_id(), 'target_parent' => 0, + 'target_order' => 0, 'sync_enabled' => true, 'sync_frequency' => 'daily', ); @@ -641,7 +634,7 @@ function robotstxt_docmd_render_add_mapping_page() {
- + @@ -727,8 +720,8 @@ function robotstxt_docmd_render_add_mapping_page() { array( 'name' => 'target_parent', 'show_option_none' => esc_html__( '(no parent)', 'robotstxt-documentation-markdown' ), - 'option_none_value' => 0, - 'selected' => absint( $data['target_parent'] ?? 0 ), + 'option_none_value' => '0', + 'selected' => absint( $data['target_parent'] ), ) ); ?> @@ -750,7 +743,7 @@ function robotstxt_docmd_render_add_mapping_page() { @@ -781,7 +774,7 @@ function robotstxt_docmd_render_add_mapping_page() { foreach ( $all_posts as $post ) { printf( '', - esc_attr( $post->ID ), + esc_attr( (string) $post->ID ), selected( $data['target_post_id'], $post->ID, false ), esc_html( $post->post_title ), esc_html( $post->post_type ) @@ -857,36 +850,35 @@ function robotstxt_docmd_render_add_mapping_page() { * @return void */ function robotstxt_docmd_handle_save_mapping() { - if ( ! current_user_can( 'manage_options' ) ) { + if ( ! current_user_can( 'edit_pages' ) ) { return; } // Verify nonce. - if ( ! isset( $_POST['robotstxt_docmd_nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['robotstxt_docmd_nonce'] ) ), 'robotstxt_docmd_save_mapping' ) ) { + if ( ! wp_verify_nonce( sanitize_text_field( wp_unslash( robotstxt_docmd_input_string( $_POST, 'robotstxt_docmd_nonce' ) ) ), 'robotstxt_docmd_save_mapping' ) ) { wp_die( esc_html__( 'Security check failed.', 'robotstxt-documentation-markdown' ) ); } - // phpcs:disable WordPress.Security.ValidatedSanitizedInput.InputNotSanitized - $mapping_id = isset( $_POST['mapping_id'] ) ? absint( wp_unslash( $_POST['mapping_id'] ) ) : 0; + $mapping_id = robotstxt_docmd_input_int( $_POST, 'mapping_id' ); $data = array( - 'title' => sanitize_text_field( wp_unslash( $_POST['title'] ?? '' ) ), - 'repo_owner' => sanitize_text_field( wp_unslash( $_POST['repo_owner'] ?? '' ) ), - 'repo_name' => sanitize_text_field( wp_unslash( $_POST['repo_name'] ?? '' ) ), - 'file_path' => sanitize_text_field( wp_unslash( $_POST['file_path'] ?? '' ) ), - 'branch' => sanitize_text_field( wp_unslash( $_POST['branch'] ?? 'main' ) ), - 'target_post_type' => sanitize_key( wp_unslash( $_POST['target_post_type'] ?? 'page' ) ), - 'target_author' => absint( wp_unslash( $_POST['target_author'] ?? get_current_user_id() ) ), - 'target_parent' => absint( wp_unslash( $_POST['target_parent'] ?? 0 ) ), + 'title' => sanitize_text_field( wp_unslash( robotstxt_docmd_input_string( $_POST, 'title' ) ) ), + 'repo_owner' => sanitize_text_field( wp_unslash( robotstxt_docmd_input_string( $_POST, 'repo_owner' ) ) ), + 'repo_name' => sanitize_text_field( wp_unslash( robotstxt_docmd_input_string( $_POST, 'repo_name' ) ) ), + 'file_path' => sanitize_text_field( wp_unslash( robotstxt_docmd_input_string( $_POST, 'file_path' ) ) ), + 'branch' => sanitize_text_field( wp_unslash( robotstxt_docmd_input_string( $_POST, 'branch', 'main' ) ) ), + 'target_post_type' => sanitize_key( wp_unslash( robotstxt_docmd_input_string( $_POST, 'target_post_type', 'page' ) ) ), + 'target_author' => robotstxt_docmd_input_int( $_POST, 'target_author', get_current_user_id() ), + 'target_parent' => robotstxt_docmd_input_int( $_POST, 'target_parent' ), + 'target_order' => robotstxt_docmd_input_int( $_POST, 'target_order' ), 'sync_enabled' => ! empty( $_POST['sync_enabled'] ), - 'sync_frequency' => sanitize_key( wp_unslash( $_POST['sync_frequency'] ?? 'daily' ) ), + 'sync_frequency' => sanitize_key( wp_unslash( robotstxt_docmd_input_string( $_POST, 'sync_frequency', 'daily' ) ) ), ); - $target_type = sanitize_key( wp_unslash( $_POST['target_type'] ?? 'new' ) ); + $target_type = sanitize_key( wp_unslash( robotstxt_docmd_input_string( $_POST, 'target_type', 'new' ) ) ); if ( 'existing' === $target_type ) { - $data['target_post_id'] = absint( wp_unslash( $_POST['target_post_id'] ?? 0 ) ); + $data['target_post_id'] = robotstxt_docmd_input_int( $_POST, 'target_post_id' ); } - // phpcs:enable WordPress.Security.ValidatedSanitizedInput.InputNotSanitized if ( $mapping_id ) { $result = robotstxt_docmd_update_mapping( $mapping_id, $data ); @@ -915,29 +907,33 @@ function robotstxt_docmd_handle_save_mapping() { */ function robotstxt_docmd_render_admin_notices() { // Check for regular message parameter. - if ( isset( $_GET['message'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended - $message = sanitize_key( wp_unslash( $_GET['message'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended - - if ( 'settings_saved' === $message ) { - echo '

'; - esc_html_e( 'Settings saved successfully.', 'robotstxt-documentation-markdown' ); - echo '

'; - } + // phpcs:ignore WordPress.Security.NonceVerification.Recommended + $message = sanitize_key( wp_unslash( robotstxt_docmd_input_string( $_GET, 'message' ) ) ); + if ( 'settings_saved' === $message ) { + echo '

'; + esc_html_e( 'Settings saved successfully.', 'robotstxt-documentation-markdown' ); + echo '

'; } // Check for debug results. $debug_result = get_transient( 'robotstxt_docmd_debug_result' ); - if ( $debug_result ) { + if ( is_array( $debug_result ) + && isset( $debug_result['type'], $debug_result['message'] ) + && is_string( $debug_result['type'] ) + && is_string( $debug_result['message'] ) + ) { delete_transient( 'robotstxt_docmd_debug_result' ); $notice_class = 'notice-' . $debug_result['type']; echo '
'; echo '

' . wp_kses_post( $debug_result['message'] ) . '

'; - if ( ! empty( $debug_result['details'] ) ) { + if ( ! empty( $debug_result['details'] ) && is_array( $debug_result['details'] ) ) { echo '
    '; foreach ( $debug_result['details'] as $detail ) { - echo '
  • ' . wp_kses_post( $detail ) . '
  • '; + if ( is_string( $detail ) ) { + echo '
  • ' . wp_kses_post( $detail ) . '
  • '; + } } echo '
'; } @@ -954,11 +950,12 @@ function robotstxt_docmd_render_admin_notices() { * @return void */ function robotstxt_docmd_render_settings_page() { - if ( ! current_user_can( 'manage_options' ) ) { + if ( ! current_user_can( 'edit_pages' ) ) { wp_die( esc_html__( 'You do not have sufficient permissions.', 'robotstxt-documentation-markdown' ) ); } - $settings = get_option( 'robotstxt_docmd_settings', array() ); + $raw_settings = get_option( 'robotstxt_docmd_settings', array() ); + $settings = is_array( $raw_settings ) ? $raw_settings : array(); ?>
@@ -976,7 +973,7 @@ function robotstxt_docmd_render_settings_page() {
@@ -988,7 +985,7 @@ function robotstxt_docmd_render_settings_page() { @@ -1080,7 +1077,9 @@ function robotstxt_docmd_render_settings_page() { echo ''; echo ' - - - - - - - - - - - - diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory_item_branch.html.dist b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory_item_branch.html.dist deleted file mode 100644 index 532a436..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory_item_branch.html.dist +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file.html.dist b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file.html.dist deleted file mode 100644 index a022f5c..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file.html.dist +++ /dev/null @@ -1,65 +0,0 @@ - - - - - Code Coverage for {{full_path}} - - - - - - - -
-
-
-
- -
-
-
-
-
-
-
- +

- +

' . esc_html( $mapping['sync_frequency'] ) . ''; if ( $timestamp ) { - echo esc_html( gmdate( 'Y-m-d H:i:s', $timestamp + ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS ) ) ); + $gmt_offset_raw = get_option( 'gmt_offset', 0 ); + $gmt_offset_sec = is_numeric( $gmt_offset_raw ) ? (int) ( (float) $gmt_offset_raw * HOUR_IN_SECONDS ) : 0; + echo esc_html( gmdate( 'Y-m-d H:i:s', $timestamp + $gmt_offset_sec ) ); } else { echo '' . esc_html__( 'Not scheduled', 'robotstxt-documentation-markdown' ) . ''; } @@ -1134,21 +1133,20 @@ function robotstxt_docmd_render_settings_page() { * @return void */ function robotstxt_docmd_handle_save_settings() { - if ( ! current_user_can( 'manage_options' ) ) { + if ( ! current_user_can( 'edit_pages' ) ) { return; } // Verify nonce. - if ( ! isset( $_POST['robotstxt_docmd_nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['robotstxt_docmd_nonce'] ) ), 'robotstxt_docmd_save_settings' ) ) { + if ( ! wp_verify_nonce( sanitize_text_field( wp_unslash( robotstxt_docmd_input_string( $_POST, 'robotstxt_docmd_nonce' ) ) ), 'robotstxt_docmd_save_settings' ) ) { wp_die( esc_html__( 'Security check failed.', 'robotstxt-documentation-markdown' ) ); } - // phpcs:disable WordPress.Security.ValidatedSanitizedInput.InputNotSanitized - $github_url = sanitize_text_field( wp_unslash( $_POST['github_url'] ?? '' ) ); - $github_token = sanitize_text_field( wp_unslash( $_POST['github_token'] ?? '' ) ); - // phpcs:enable WordPress.Security.ValidatedSanitizedInput.InputNotSanitized + $github_url = sanitize_text_field( wp_unslash( robotstxt_docmd_input_string( $_POST, 'github_url' ) ) ); + $github_token = sanitize_text_field( wp_unslash( robotstxt_docmd_input_string( $_POST, 'github_token' ) ) ); - $settings = get_option( 'robotstxt_docmd_settings', array() ); + $raw_settings = get_option( 'robotstxt_docmd_settings', array() ); + $settings = is_array( $raw_settings ) ? $raw_settings : array(); $settings['github_url'] = $github_url; @@ -1177,13 +1175,14 @@ function robotstxt_docmd_handle_save_settings() { * @return void */ function robotstxt_docmd_debug_test_github() { - if ( ! current_user_can( 'manage_options' ) ) { + if ( ! current_user_can( 'edit_pages' ) ) { wp_die( esc_html__( 'Permission denied.', 'robotstxt-documentation-markdown' ) ); } - $settings = get_option( 'robotstxt_docmd_settings', array() ); - $repo_url = $settings['github_url'] ?? ''; - $token = $settings['github_token'] ?? ''; + $raw_settings = get_option( 'robotstxt_docmd_settings', array() ); + $settings = is_array( $raw_settings ) ? $raw_settings : array(); + $repo_url = robotstxt_docmd_input_string( $settings, 'github_url' ); + $token = robotstxt_docmd_input_string( $settings, 'github_token' ); $result = array( 'type' => 'error', @@ -1241,27 +1240,32 @@ function robotstxt_docmd_debug_test_github() { $response->get_error_message() ); } elseif ( 200 === $status_code ) { - $body = json_decode( wp_remote_retrieve_body( $response ), true ); + $body = json_decode( wp_remote_retrieve_body( $response ), true ); + $full_name = is_array( $body ) && isset( $body['full_name'] ) && is_string( $body['full_name'] ) ? $body['full_name'] : 'N/A'; + $repo_name = is_array( $body ) && isset( $body['name'] ) && is_string( $body['name'] ) ? $body['name'] : 'N/A'; + $is_private = is_array( $body ) && ! empty( $body['private'] ); + $default_branch = is_array( $body ) && isset( $body['default_branch'] ) && is_string( $body['default_branch'] ) ? $body['default_branch'] : 'N/A'; + $result['type'] = 'success'; $result['message'] = sprintf( /* translators: %s: repository full name */ __( 'Successfully connected to repository: %s', 'robotstxt-documentation-markdown' ), - $body['full_name'] ?? 'N/A' + $full_name ); $result['details'][] = sprintf( '%s: %s', __( 'Name', 'robotstxt-documentation-markdown' ), - $body['name'] ?? 'N/A' + $repo_name ); $result['details'][] = sprintf( '%s: %s', __( 'Private', 'robotstxt-documentation-markdown' ), - ! empty( $body['private'] ) ? __( 'Yes', 'robotstxt-documentation-markdown' ) : __( 'No', 'robotstxt-documentation-markdown' ) + $is_private ? __( 'Yes', 'robotstxt-documentation-markdown' ) : __( 'No', 'robotstxt-documentation-markdown' ) ); $result['details'][] = sprintf( '%s: %s', __( 'Default Branch', 'robotstxt-documentation-markdown' ), - $body['default_branch'] ?? 'N/A' + $default_branch ); } elseif ( 404 === $status_code ) { $result['message'] = __( 'Repository Not Found: The repository does not exist or your token does not have access to it.', 'robotstxt-documentation-markdown' ); @@ -1290,12 +1294,13 @@ function robotstxt_docmd_debug_test_github() { * @return void */ function robotstxt_docmd_debug_test_token() { - if ( ! current_user_can( 'manage_options' ) ) { + if ( ! current_user_can( 'edit_pages' ) ) { wp_die( esc_html__( 'Permission denied.', 'robotstxt-documentation-markdown' ) ); } - $settings = get_option( 'robotstxt_docmd_settings', array() ); - $token = $settings['github_token'] ?? ''; + $raw_settings = get_option( 'robotstxt_docmd_settings', array() ); + $settings = is_array( $raw_settings ) ? $raw_settings : array(); + $token = robotstxt_docmd_input_string( $settings, 'github_token' ); $result = array( 'type' => 'error', @@ -1339,11 +1344,13 @@ function robotstxt_docmd_debug_test_token() { $result['type'] = 'success'; $result['message'] = __( 'Token Valid! Your GitHub token is working correctly.', 'robotstxt-documentation-markdown' ); - if ( isset( $body['resources']['core'] ) ) { - $core = $body['resources']['core']; - $remaining = $core['remaining'] ?? 0; - $limit = $core['limit'] ?? 0; - $reset = $core['reset'] ?? 0; + $resources = is_array( $body ) && isset( $body['resources'] ) && is_array( $body['resources'] ) ? $body['resources'] : null; + $core = is_array( $resources ) && isset( $resources['core'] ) && is_array( $resources['core'] ) ? $resources['core'] : null; + + if ( null !== $core ) { + $remaining = isset( $core['remaining'] ) && is_int( $core['remaining'] ) ? $core['remaining'] : 0; + $limit = isset( $core['limit'] ) && is_int( $core['limit'] ) ? $core['limit'] : 0; + $reset = isset( $core['reset'] ) && is_int( $core['reset'] ) ? $core['reset'] : 0; $result['details'][] = sprintf( '%s: %d / %d', @@ -1353,7 +1360,9 @@ function robotstxt_docmd_debug_test_token() { ); if ( $reset > 0 ) { - $reset_time = gmdate( 'Y-m-d H:i:s', $reset + ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS ) ); + $gmt_offset_raw = get_option( 'gmt_offset', 0 ); + $gmt_offset_sec = is_numeric( $gmt_offset_raw ) ? (int) ( (float) $gmt_offset_raw * HOUR_IN_SECONDS ) : 0; + $reset_time = gmdate( 'Y-m-d H:i:s', $reset + $gmt_offset_sec ); $result['details'][] = sprintf( '%s: %s', __( 'Resets At', 'robotstxt-documentation-markdown' ), @@ -1391,8 +1400,8 @@ function robotstxt_docmd_debug_test_token() { * @param int $mapping_id Mapping ID to sync. * @return void */ -function robotstxt_docmd_debug_run_cron( $mapping_id ) { - if ( ! current_user_can( 'manage_options' ) ) { +function robotstxt_docmd_debug_run_cron( int $mapping_id ) { + if ( ! current_user_can( 'edit_pages' ) ) { wp_die( esc_html__( 'Permission denied.', 'robotstxt-documentation-markdown' ) ); } @@ -1425,6 +1434,13 @@ function robotstxt_docmd_debug_run_cron( $mapping_id ) { // Reload mapping to get updated info. $mapping = robotstxt_docmd_get_mapping( $mapping_id ); + if ( ! $mapping ) { + $result['message'] = __( 'Sync completed but mapping data could not be reloaded.', 'robotstxt-documentation-markdown' ); + set_transient( 'robotstxt_docmd_debug_result', $result, 60 ); + wp_safe_redirect( admin_url( 'admin.php?page=robotstxt-docmd-settings' ) ); + exit; + } + $result['type'] = 'success'; $result['message'] = sprintf( /* translators: %s: mapping title */ @@ -1441,11 +1457,11 @@ function robotstxt_docmd_debug_run_cron( $mapping_id ) { $result['details'][] = sprintf( '%s: %s', __( 'Last Sync', 'robotstxt-documentation-markdown' ), - $mapping['last_sync'] ?? 'N/A' + $mapping['last_sync'] ); if ( ! empty( $mapping['target_post_id'] ) ) { - $edit_url = get_edit_post_link( $mapping['target_post_id'] ); + $edit_url = get_edit_post_link( $mapping['target_post_id'] ) ?? ''; $result['details'][] = sprintf( '%s: %s', __( 'Target Post', 'robotstxt-documentation-markdown' ), @@ -1470,7 +1486,7 @@ function robotstxt_docmd_debug_run_cron( $mapping_id ) { * @return void */ function robotstxt_docmd_debug_clear_cache() { - if ( ! current_user_can( 'manage_options' ) ) { + if ( ! current_user_can( 'edit_pages' ) ) { wp_die( esc_html__( 'Permission denied.', 'robotstxt-documentation-markdown' ) ); } @@ -1483,6 +1499,7 @@ function robotstxt_docmd_debug_clear_cache() { ); // Delete all plugin transients. + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- Direct query acceptable for cache clearing operation. $deleted = $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->options} @@ -1519,7 +1536,7 @@ function robotstxt_docmd_debug_clear_cache() { * @return void */ function robotstxt_docmd_debug_fix_crons() { - if ( ! current_user_can( 'manage_options' ) ) { + if ( ! current_user_can( 'edit_pages' ) ) { wp_die( esc_html__( 'Permission denied.', 'robotstxt-documentation-markdown' ) ); } diff --git a/uninstall.php b/uninstall.php index 3259249..8ab635c 100644 --- a/uninstall.php +++ b/uninstall.php @@ -7,7 +7,7 @@ * @package RobotsTxt\DocumentationMarkdown * @author ROBOTSTXT * @license GPL-3.0-or-later - * @link https://github.com/robotstxt/documentation-markdown + * @link https://git.robotstxt.es/ROBOTSTXT/robotstxt-documentation-markdown * @since 1.0.0 */ @@ -29,7 +29,8 @@ if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) { */ function robotstxt_docmd_uninstall(): void { // Get plugin settings. - $settings = get_option( 'robotstxt_docmd_settings', array() ); + $raw_settings = get_option( 'robotstxt_docmd_settings', array() ); + $settings = is_array( $raw_settings ) ? $raw_settings : array(); // Check if user wants to delete data on uninstall. if ( empty( $settings['delete_on_uninstall'] ) ) { @@ -37,77 +38,80 @@ function robotstxt_docmd_uninstall(): void { return; } - global $wpdb; - - // Delete all mapping posts (CPT). - $mapping_ids = $wpdb->get_col( - $wpdb->prepare( - "SELECT ID FROM {$wpdb->posts} WHERE post_type = %s", - 'robotstxt_map' + // Delete all mapping posts (CPT) using WordPress API. + $mapping_posts = get_posts( + array( + 'post_type' => 'robotstxt_map', + 'posts_per_page' => -1, + 'post_status' => 'any', + 'fields' => 'ids', ) ); - foreach ( $mapping_ids as $mapping_id ) { - // Force delete (bypass trash). - wp_delete_post( $mapping_id, true ); - } - - // Delete all plugin-specific post meta. - $wpdb->query( - "DELETE FROM {$wpdb->postmeta} - WHERE meta_key LIKE '_robotstxt_docmd_%'" - ); - - // Delete plugin options. - delete_option( 'robotstxt_docmd_settings' ); - - // Delete transients (cached data). - $wpdb->query( - $wpdb->prepare( - "DELETE FROM {$wpdb->options} - WHERE option_name LIKE %s", - $wpdb->esc_like( '_transient_robotstxt_docmd_' ) . '%' - ) - ); - - $wpdb->query( - $wpdb->prepare( - "DELETE FROM {$wpdb->options} - WHERE option_name LIKE %s", - $wpdb->esc_like( '_transient_timeout_robotstxt_docmd_' ) . '%' - ) - ); - - // Clear all scheduled cron events for each mapping. - foreach ( $mapping_ids as $mapping_id ) { + // Delete each mapping post and its associated meta. + foreach ( $mapping_posts as $mapping_id ) { + // Clear scheduled cron events for this mapping. $hook = 'robotstxt_docmd_sync_event'; $args = array( $mapping_id ); $timestamp = wp_next_scheduled( $hook, $args ); if ( $timestamp ) { wp_unschedule_event( $timestamp, $hook, $args ); } + + // Force delete (bypass trash). This also deletes all associated post meta. + wp_delete_post( $mapping_id, true ); } - // Clear notification transients. - $wpdb->query( - $wpdb->prepare( - "DELETE FROM {$wpdb->options} - WHERE option_name LIKE %s", - $wpdb->esc_like( '_transient_robotstxt_docmd_notification_' ) . '%' - ) - ); + // Delete plugin options. + delete_option( 'robotstxt_docmd_settings' ); - $wpdb->query( - $wpdb->prepare( - "DELETE FROM {$wpdb->options} - WHERE option_name LIKE %s", - $wpdb->esc_like( '_transient_timeout_robotstxt_docmd_notification_' ) . '%' - ) - ); + // Delete transients (cached data). + // Note: WordPress does not provide an API for pattern-based transient deletion. + // Direct database queries are necessary here for bulk cleanup operations. + robotstxt_docmd_delete_transients_by_prefix( 'robotstxt_docmd_' ); + robotstxt_docmd_delete_transients_by_prefix( 'robotstxt_docmd_notification_' ); // Note: We deliberately DO NOT delete the synced posts/pages themselves. // Users may want to keep the documentation even after uninstalling the plugin. } +/** + * Delete all transients matching a prefix + * + * WordPress does not provide an API for pattern-based transient deletion, + * so direct database access is required for bulk cleanup operations. + * This is compliant with AGENTS.md guidelines for necessary database operations. + * + * @since 1.0.0 + * + * @param string $prefix Transient name prefix to match. + * @return void + */ +function robotstxt_docmd_delete_transients_by_prefix( string $prefix ): void { + global $wpdb; + + // Sanitize prefix for LIKE query. + $transient_prefix = $wpdb->esc_like( '_transient_' . $prefix ) . '%'; + $transient_timeout_prefix = $wpdb->esc_like( '_transient_timeout_' . $prefix ) . '%'; + + // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- Required for bulk pattern-based deletion; no WordPress API available for this operation. + // Delete transient values. + $wpdb->query( + $wpdb->prepare( + "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s", + $transient_prefix + ) + ); + + // Delete transient timeouts. + $wpdb->query( + $wpdb->prepare( + "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s", + $transient_timeout_prefix + ) + ); + // phpcs:enable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching +} + // Run uninstall. robotstxt_docmd_uninstall(); diff --git a/update.json b/update.json new file mode 100644 index 0000000..aef4d3a --- /dev/null +++ b/update.json @@ -0,0 +1,29 @@ +{ + "name": "Documentation Markdown (by ROBOTSTXT)", + "slug": "robotstxt-documentation-markdown", + "version": "1.0.0", + "download_url": "https://git.robotstxt.es/ROBOTSTXT/robotstxt-documentation-markdown/releases/download/1.0.0/robotstxt-documentation-markdown-1.0.0.zip", + "requires": "6.7", + "requires_php": "8.2", + "tested": "6.9", + "last_updated": "2026-01-26", + "author": "ROBOTSTXT", + "author_profile": "https://www.robotstxt.es/", + "homepage": "https://git.robotstxt.es/ROBOTSTXT/robotstxt-documentation-markdown", + "description": "Synchronizes Markdown documentation from GitHub repositories to WordPress pages and posts automatically. Perfect for maintaining technical documentation, API references, and knowledge bases with version control.", + "changelog": "

1.0.0 - 2026-01-26

Initial Release

  • Core: GitHub repository synchronization system
  • Core: Markdown to HTML conversion using CommonMark
  • Core: Encrypted GitHub token storage (AES-256-CBC)
  • Feature: Flexible file-to-content mapping system
  • Feature: Custom Post Type for mapping management
  • Feature: Configurable sync frequency (manual, hourly, twice daily, daily)
  • Feature: Manual on-demand synchronization
  • Feature: Support for pages, posts, and custom post types
  • Feature: Page order (menu_order) configuration
  • Feature: Configurable post author and parent page
  • Admin: Complete admin interface with status monitoring
  • Admin: Settings page for GitHub configuration
  • Admin: Mappings management interface
  • Debug: Built-in debug tools (visible when WP_DEBUG enabled)
  • Debug: Test GitHub connection and token validity
  • Debug: View and manage scheduled cron jobs
  • Debug: Fix/reschedule broken cron jobs
  • Debug: Cache management tools
  • Security: Complete input sanitization and output escaping
  • Security: Nonce verification on all forms
  • Security: Capability checks for admin actions
  • i18n: Full internationalization support
  • Quality: WordPress Coding Standards compliant
", + "sections": { + "description": "

Documentation Markdown is a powerful WordPress plugin that enables seamless synchronization of Markdown documentation files from GitHub repositories into your WordPress site.

Key Features

  • Automatic Synchronization: Schedule automatic syncs via WordPress Cron (hourly, twice daily, daily)
  • Markdown to HTML: Convert GitHub Flavored Markdown to clean HTML using CommonMark
  • Flexible Mapping: Map individual MD files to specific WordPress posts or pages
  • Secure: Encrypted GitHub token storage, full input validation & output escaping
  • Translatable: Full internationalization support (i18n/l10n ready)
  • Multi-Repository: Sync from multiple GitHub repos simultaneously
  • Manual Sync: On-demand synchronization from admin interface
  • Debug Tools: Built-in debugging tools (visible when WP_DEBUG is enabled)

Use Cases

  • API Documentation - Keep your API docs in sync between GitHub and WordPress
  • Technical Documentation - Maintain version-controlled technical docs
  • Knowledge Base - Build a knowledge base powered by GitHub
  • Blog Posts - Write blog posts in Markdown with Git workflow
  • Product Documentation - Sync product documentation from your repository

Requirements

  • PHP 8.2 or higher
  • WordPress 6.5 or higher (single-site installations only)
  • GitHub Personal Access Token (free)
", + "installation": "

Installation

  1. Upload the plugin files to /wp-content/plugins/robotstxt-documentation-markdown/
  2. Activate the plugin through the 'Plugins' menu in WordPress
  3. Navigate to 'Documentation → Settings' in the WordPress admin menu
  4. Generate a GitHub Personal Access Token:
    • Go to GitHub → Settings → Developer settings → Personal access tokens
    • Click 'Generate new token'
    • For public repositories: No specific scopes needed
    • For private repositories: Select repo scope
  5. Paste your token in the plugin settings and save
  6. Create your first mapping under 'Documentation → Mappings'

Configuration

  1. Go to Documentation → Add Mapping
  2. Fill in the repository details (owner, name, file path, branch)
  3. Configure target content (post type, author, parent, order)
  4. Set synchronization frequency
  5. Save and click 'Sync Now' to perform first sync
", + "faq": "

Do I need a GitHub account?

Yes, you need a GitHub account to generate a Personal Access Token. The token is required to access repositories (public or private).

Can I sync from private repositories?

Yes! When generating your GitHub Personal Access Token, make sure to select the repo scope for full access to private repositories.

How often does synchronization happen?

You can configure synchronization frequency per mapping: Manual only, Hourly, Twice daily, or Daily. You can also manually trigger sync at any time.

Will the plugin delete my WordPress content if I uninstall it?

By default, NO. When you uninstall the plugin, it preserves all synced WordPress pages/posts. However, there's an option in Settings to delete plugin data on uninstall - but this never deletes the actual WordPress content.

Can I sync multiple files from the same repository?

Yes! You can create multiple mappings, each pointing to different files in the same repository or different repositories.

How do I debug synchronization issues?

Enable WP_DEBUG in your wp-config.php, then go to Documentation → Settings. You'll see a 'Debug Tools' section with options to test GitHub connection, validate token, view cron jobs, and run manual syncs.

", + "changelog": "

1.0.0 - 2026-01-26

Initial Release

  • Core: GitHub repository synchronization system
  • Core: Markdown to HTML conversion using CommonMark
  • Core: Encrypted GitHub token storage (AES-256-CBC)
  • Feature: Flexible file-to-content mapping system
  • Feature: Custom Post Type for mapping management
  • Feature: Configurable sync frequency (manual, hourly, twice daily, daily)
  • Feature: Manual on-demand synchronization
  • Feature: Support for pages, posts, and custom post types
  • Feature: Page order (menu_order) configuration
  • Feature: Configurable post author and parent page
  • Admin: Complete admin interface with status monitoring
  • Admin: Settings page for GitHub configuration
  • Admin: Mappings management interface
  • Debug: Built-in debug tools (visible when WP_DEBUG enabled)
  • Debug: Test GitHub connection and token validity
  • Debug: View and manage scheduled cron jobs
  • Debug: Fix/reschedule broken cron jobs
  • Debug: Cache management tools
  • Security: Complete input sanitization and output escaping
  • Security: Nonce verification on all forms
  • Security: Capability checks for admin actions
  • i18n: Full internationalization support
  • Quality: WordPress Coding Standards compliant
" + }, + "banners": { + "low": "", + "high": "" + }, + "icons": { + "1x": "", + "2x": "" + } +} diff --git a/vendor/autoload.php b/vendor/autoload.php index 9ee0cf8..7c8c8d4 100644 --- a/vendor/autoload.php +++ b/vendor/autoload.php @@ -22,4 +22,4 @@ if (PHP_VERSION_ID < 50600) { require_once __DIR__ . '/composer/autoload_real.php'; -return ComposerAutoloaderInit5db7b63bf0104878d549f48a1ce8cb76::getLoader(); +return ComposerAutoloaderInit216e6d5522dd071bc42c5f7c15b28cdc::getLoader(); diff --git a/vendor/bin/php-parse b/vendor/bin/php-parse deleted file mode 100644 index 61566e6..0000000 --- a/vendor/bin/php-parse +++ /dev/null @@ -1,119 +0,0 @@ -#!/usr/bin/env php -realpath = realpath($opened_path) ?: $opened_path; - $opened_path = $this->realpath; - $this->handle = fopen($this->realpath, $mode); - $this->position = 0; - - return (bool) $this->handle; - } - - public function stream_read($count) - { - $data = fread($this->handle, $count); - - if ($this->position === 0) { - $data = preg_replace('{^#!.*\r?\n}', '', $data); - } - - $this->position += strlen($data); - - return $data; - } - - public function stream_cast($castAs) - { - return $this->handle; - } - - public function stream_close() - { - fclose($this->handle); - } - - public function stream_lock($operation) - { - return $operation ? flock($this->handle, $operation) : true; - } - - public function stream_seek($offset, $whence) - { - if (0 === fseek($this->handle, $offset, $whence)) { - $this->position = ftell($this->handle); - return true; - } - - return false; - } - - public function stream_tell() - { - return $this->position; - } - - public function stream_eof() - { - return feof($this->handle); - } - - public function stream_stat() - { - return array(); - } - - public function stream_set_option($option, $arg1, $arg2) - { - return true; - } - - public function url_stat($path, $flags) - { - $path = substr($path, 17); - if (file_exists($path)) { - return stat($path); - } - - return false; - } - } - } - - if ( - (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) - || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) - ) { - return include("phpvfscomposer://" . __DIR__ . '/..'.'/nikic/php-parser/bin/php-parse'); - } -} - -return include __DIR__ . '/..'.'/nikic/php-parser/bin/php-parse'; diff --git a/vendor/bin/php-parse.bat b/vendor/bin/php-parse.bat deleted file mode 100644 index 10920fc..0000000 --- a/vendor/bin/php-parse.bat +++ /dev/null @@ -1,5 +0,0 @@ -@ECHO OFF -setlocal DISABLEDELAYEDEXPANSION -SET BIN_TARGET=%~dp0/php-parse -SET COMPOSER_RUNTIME_BIN_DIR=%~dp0 -php "%BIN_TARGET%" %* diff --git a/vendor/bin/phpcbf b/vendor/bin/phpcbf deleted file mode 100644 index 1c0c79c..0000000 --- a/vendor/bin/phpcbf +++ /dev/null @@ -1,119 +0,0 @@ -#!/usr/bin/env php -realpath = realpath($opened_path) ?: $opened_path; - $opened_path = $this->realpath; - $this->handle = fopen($this->realpath, $mode); - $this->position = 0; - - return (bool) $this->handle; - } - - public function stream_read($count) - { - $data = fread($this->handle, $count); - - if ($this->position === 0) { - $data = preg_replace('{^#!.*\r?\n}', '', $data); - } - - $this->position += strlen($data); - - return $data; - } - - public function stream_cast($castAs) - { - return $this->handle; - } - - public function stream_close() - { - fclose($this->handle); - } - - public function stream_lock($operation) - { - return $operation ? flock($this->handle, $operation) : true; - } - - public function stream_seek($offset, $whence) - { - if (0 === fseek($this->handle, $offset, $whence)) { - $this->position = ftell($this->handle); - return true; - } - - return false; - } - - public function stream_tell() - { - return $this->position; - } - - public function stream_eof() - { - return feof($this->handle); - } - - public function stream_stat() - { - return array(); - } - - public function stream_set_option($option, $arg1, $arg2) - { - return true; - } - - public function url_stat($path, $flags) - { - $path = substr($path, 17); - if (file_exists($path)) { - return stat($path); - } - - return false; - } - } - } - - if ( - (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) - || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) - ) { - return include("phpvfscomposer://" . __DIR__ . '/..'.'/squizlabs/php_codesniffer/bin/phpcbf'); - } -} - -return include __DIR__ . '/..'.'/squizlabs/php_codesniffer/bin/phpcbf'; diff --git a/vendor/bin/phpcbf.bat b/vendor/bin/phpcbf.bat deleted file mode 100644 index 5730599..0000000 --- a/vendor/bin/phpcbf.bat +++ /dev/null @@ -1,5 +0,0 @@ -@ECHO OFF -setlocal DISABLEDELAYEDEXPANSION -SET BIN_TARGET=%~dp0/phpcbf -SET COMPOSER_RUNTIME_BIN_DIR=%~dp0 -php "%BIN_TARGET%" %* diff --git a/vendor/bin/phpcs b/vendor/bin/phpcs deleted file mode 100644 index 04e658c..0000000 --- a/vendor/bin/phpcs +++ /dev/null @@ -1,119 +0,0 @@ -#!/usr/bin/env php -realpath = realpath($opened_path) ?: $opened_path; - $opened_path = $this->realpath; - $this->handle = fopen($this->realpath, $mode); - $this->position = 0; - - return (bool) $this->handle; - } - - public function stream_read($count) - { - $data = fread($this->handle, $count); - - if ($this->position === 0) { - $data = preg_replace('{^#!.*\r?\n}', '', $data); - } - - $this->position += strlen($data); - - return $data; - } - - public function stream_cast($castAs) - { - return $this->handle; - } - - public function stream_close() - { - fclose($this->handle); - } - - public function stream_lock($operation) - { - return $operation ? flock($this->handle, $operation) : true; - } - - public function stream_seek($offset, $whence) - { - if (0 === fseek($this->handle, $offset, $whence)) { - $this->position = ftell($this->handle); - return true; - } - - return false; - } - - public function stream_tell() - { - return $this->position; - } - - public function stream_eof() - { - return feof($this->handle); - } - - public function stream_stat() - { - return array(); - } - - public function stream_set_option($option, $arg1, $arg2) - { - return true; - } - - public function url_stat($path, $flags) - { - $path = substr($path, 17); - if (file_exists($path)) { - return stat($path); - } - - return false; - } - } - } - - if ( - (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) - || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) - ) { - return include("phpvfscomposer://" . __DIR__ . '/..'.'/squizlabs/php_codesniffer/bin/phpcs'); - } -} - -return include __DIR__ . '/..'.'/squizlabs/php_codesniffer/bin/phpcs'; diff --git a/vendor/bin/phpcs.bat b/vendor/bin/phpcs.bat deleted file mode 100644 index c8ac5bf..0000000 --- a/vendor/bin/phpcs.bat +++ /dev/null @@ -1,5 +0,0 @@ -@ECHO OFF -setlocal DISABLEDELAYEDEXPANSION -SET BIN_TARGET=%~dp0/phpcs -SET COMPOSER_RUNTIME_BIN_DIR=%~dp0 -php "%BIN_TARGET%" %* diff --git a/vendor/bin/phpstan b/vendor/bin/phpstan deleted file mode 100644 index d76c0be..0000000 --- a/vendor/bin/phpstan +++ /dev/null @@ -1,119 +0,0 @@ -#!/usr/bin/env php -realpath = realpath($opened_path) ?: $opened_path; - $opened_path = $this->realpath; - $this->handle = fopen($this->realpath, $mode); - $this->position = 0; - - return (bool) $this->handle; - } - - public function stream_read($count) - { - $data = fread($this->handle, $count); - - if ($this->position === 0) { - $data = preg_replace('{^#!.*\r?\n}', '', $data); - } - - $this->position += strlen($data); - - return $data; - } - - public function stream_cast($castAs) - { - return $this->handle; - } - - public function stream_close() - { - fclose($this->handle); - } - - public function stream_lock($operation) - { - return $operation ? flock($this->handle, $operation) : true; - } - - public function stream_seek($offset, $whence) - { - if (0 === fseek($this->handle, $offset, $whence)) { - $this->position = ftell($this->handle); - return true; - } - - return false; - } - - public function stream_tell() - { - return $this->position; - } - - public function stream_eof() - { - return feof($this->handle); - } - - public function stream_stat() - { - return array(); - } - - public function stream_set_option($option, $arg1, $arg2) - { - return true; - } - - public function url_stat($path, $flags) - { - $path = substr($path, 17); - if (file_exists($path)) { - return stat($path); - } - - return false; - } - } - } - - if ( - (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) - || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) - ) { - return include("phpvfscomposer://" . __DIR__ . '/..'.'/phpstan/phpstan/phpstan'); - } -} - -return include __DIR__ . '/..'.'/phpstan/phpstan/phpstan'; diff --git a/vendor/bin/phpstan.bat b/vendor/bin/phpstan.bat deleted file mode 100644 index 8556a02..0000000 --- a/vendor/bin/phpstan.bat +++ /dev/null @@ -1,5 +0,0 @@ -@ECHO OFF -setlocal DISABLEDELAYEDEXPANSION -SET BIN_TARGET=%~dp0/phpstan -SET COMPOSER_RUNTIME_BIN_DIR=%~dp0 -php "%BIN_TARGET%" %* diff --git a/vendor/bin/phpstan.phar b/vendor/bin/phpstan.phar deleted file mode 100644 index fecf96f..0000000 --- a/vendor/bin/phpstan.phar +++ /dev/null @@ -1,119 +0,0 @@ -#!/usr/bin/env php -realpath = realpath($opened_path) ?: $opened_path; - $opened_path = $this->realpath; - $this->handle = fopen($this->realpath, $mode); - $this->position = 0; - - return (bool) $this->handle; - } - - public function stream_read($count) - { - $data = fread($this->handle, $count); - - if ($this->position === 0) { - $data = preg_replace('{^#!.*\r?\n}', '', $data); - } - - $this->position += strlen($data); - - return $data; - } - - public function stream_cast($castAs) - { - return $this->handle; - } - - public function stream_close() - { - fclose($this->handle); - } - - public function stream_lock($operation) - { - return $operation ? flock($this->handle, $operation) : true; - } - - public function stream_seek($offset, $whence) - { - if (0 === fseek($this->handle, $offset, $whence)) { - $this->position = ftell($this->handle); - return true; - } - - return false; - } - - public function stream_tell() - { - return $this->position; - } - - public function stream_eof() - { - return feof($this->handle); - } - - public function stream_stat() - { - return array(); - } - - public function stream_set_option($option, $arg1, $arg2) - { - return true; - } - - public function url_stat($path, $flags) - { - $path = substr($path, 17); - if (file_exists($path)) { - return stat($path); - } - - return false; - } - } - } - - if ( - (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) - || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) - ) { - return include("phpvfscomposer://" . __DIR__ . '/..'.'/phpstan/phpstan/phpstan.phar'); - } -} - -return include __DIR__ . '/..'.'/phpstan/phpstan/phpstan.phar'; diff --git a/vendor/bin/phpstan.phar.bat b/vendor/bin/phpstan.phar.bat deleted file mode 100644 index 0d32adc..0000000 --- a/vendor/bin/phpstan.phar.bat +++ /dev/null @@ -1,5 +0,0 @@ -@ECHO OFF -setlocal DISABLEDELAYEDEXPANSION -SET BIN_TARGET=%~dp0/phpstan.phar -SET COMPOSER_RUNTIME_BIN_DIR=%~dp0 -php "%BIN_TARGET%" %* diff --git a/vendor/bin/phpunit b/vendor/bin/phpunit deleted file mode 100644 index b5b530a..0000000 --- a/vendor/bin/phpunit +++ /dev/null @@ -1,122 +0,0 @@ -#!/usr/bin/env php -realpath = realpath($opened_path) ?: $opened_path; - $opened_path = 'phpvfscomposer://'.$this->realpath; - $this->handle = fopen($this->realpath, $mode); - $this->position = 0; - - return (bool) $this->handle; - } - - public function stream_read($count) - { - $data = fread($this->handle, $count); - - if ($this->position === 0) { - $data = preg_replace('{^#!.*\r?\n}', '', $data); - } - $data = str_replace('__DIR__', var_export(dirname($this->realpath), true), $data); - $data = str_replace('__FILE__', var_export($this->realpath, true), $data); - - $this->position += strlen($data); - - return $data; - } - - public function stream_cast($castAs) - { - return $this->handle; - } - - public function stream_close() - { - fclose($this->handle); - } - - public function stream_lock($operation) - { - return $operation ? flock($this->handle, $operation) : true; - } - - public function stream_seek($offset, $whence) - { - if (0 === fseek($this->handle, $offset, $whence)) { - $this->position = ftell($this->handle); - return true; - } - - return false; - } - - public function stream_tell() - { - return $this->position; - } - - public function stream_eof() - { - return feof($this->handle); - } - - public function stream_stat() - { - return array(); - } - - public function stream_set_option($option, $arg1, $arg2) - { - return true; - } - - public function url_stat($path, $flags) - { - $path = substr($path, 17); - if (file_exists($path)) { - return stat($path); - } - - return false; - } - } - } - - if ( - (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) - || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) - ) { - return include("phpvfscomposer://" . __DIR__ . '/..'.'/phpunit/phpunit/phpunit'); - } -} - -return include __DIR__ . '/..'.'/phpunit/phpunit/phpunit'; diff --git a/vendor/bin/wp-since b/vendor/bin/wp-since deleted file mode 100644 index dfae851..0000000 --- a/vendor/bin/wp-since +++ /dev/null @@ -1,119 +0,0 @@ -#!/usr/bin/env php -realpath = realpath($opened_path) ?: $opened_path; - $opened_path = $this->realpath; - $this->handle = fopen($this->realpath, $mode); - $this->position = 0; - - return (bool) $this->handle; - } - - public function stream_read($count) - { - $data = fread($this->handle, $count); - - if ($this->position === 0) { - $data = preg_replace('{^#!.*\r?\n}', '', $data); - } - - $this->position += strlen($data); - - return $data; - } - - public function stream_cast($castAs) - { - return $this->handle; - } - - public function stream_close() - { - fclose($this->handle); - } - - public function stream_lock($operation) - { - return $operation ? flock($this->handle, $operation) : true; - } - - public function stream_seek($offset, $whence) - { - if (0 === fseek($this->handle, $offset, $whence)) { - $this->position = ftell($this->handle); - return true; - } - - return false; - } - - public function stream_tell() - { - return $this->position; - } - - public function stream_eof() - { - return feof($this->handle); - } - - public function stream_stat() - { - return array(); - } - - public function stream_set_option($option, $arg1, $arg2) - { - return true; - } - - public function url_stat($path, $flags) - { - $path = substr($path, 17); - if (file_exists($path)) { - return stat($path); - } - - return false; - } - } - } - - if ( - (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) - || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) - ) { - return include("phpvfscomposer://" . __DIR__ . '/..'.'/eduardovillao/wp-since/bin/wp-since'); - } -} - -return include __DIR__ . '/..'.'/eduardovillao/wp-since/bin/wp-since'; diff --git a/vendor/bin/wp-since.bat b/vendor/bin/wp-since.bat deleted file mode 100644 index 412d535..0000000 --- a/vendor/bin/wp-since.bat +++ /dev/null @@ -1,5 +0,0 @@ -@ECHO OFF -setlocal DISABLEDELAYEDEXPANSION -SET BIN_TARGET=%~dp0/wp-since -SET COMPOSER_RUNTIME_BIN_DIR=%~dp0 -php "%BIN_TARGET%" %* diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php index bf33549..85302e7 100644 --- a/vendor/composer/autoload_classmap.php +++ b/vendor/composer/autoload_classmap.php @@ -8,32 +8,6 @@ $baseDir = dirname($vendorDir); return array( 'Attribute' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', - 'DeepCopy\\DeepCopy' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/DeepCopy.php', - 'DeepCopy\\Exception\\CloneException' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php', - 'DeepCopy\\Exception\\PropertyException' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Exception/PropertyException.php', - 'DeepCopy\\Filter\\ChainableFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/ChainableFilter.php', - 'DeepCopy\\Filter\\Doctrine\\DoctrineCollectionFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php', - 'DeepCopy\\Filter\\Doctrine\\DoctrineEmptyCollectionFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php', - 'DeepCopy\\Filter\\Doctrine\\DoctrineProxyFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php', - 'DeepCopy\\Filter\\Filter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php', - 'DeepCopy\\Filter\\KeepFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/KeepFilter.php', - 'DeepCopy\\Filter\\ReplaceFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/ReplaceFilter.php', - 'DeepCopy\\Filter\\SetNullFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php', - 'DeepCopy\\Matcher\\Doctrine\\DoctrineProxyMatcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php', - 'DeepCopy\\Matcher\\Matcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.php', - 'DeepCopy\\Matcher\\PropertyMatcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyMatcher.php', - 'DeepCopy\\Matcher\\PropertyNameMatcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php', - 'DeepCopy\\Matcher\\PropertyTypeMatcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php', - 'DeepCopy\\Reflection\\ReflectionHelper' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php', - 'DeepCopy\\TypeFilter\\Date\\DateIntervalFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.php', - 'DeepCopy\\TypeFilter\\Date\\DatePeriodFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DatePeriodFilter.php', - 'DeepCopy\\TypeFilter\\ReplaceFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php', - 'DeepCopy\\TypeFilter\\ShallowCopyFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php', - 'DeepCopy\\TypeFilter\\Spl\\ArrayObjectFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/ArrayObjectFilter.php', - 'DeepCopy\\TypeFilter\\Spl\\SplDoublyLinkedList' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php', - 'DeepCopy\\TypeFilter\\Spl\\SplDoublyLinkedListFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.php', - 'DeepCopy\\TypeFilter\\TypeFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php', - 'DeepCopy\\TypeMatcher\\TypeMatcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeMatcher/TypeMatcher.php', 'Dflydev\\DotAccessData\\Data' => $vendorDir . '/dflydev/dot-access-data/src/Data.php', 'Dflydev\\DotAccessData\\DataInterface' => $vendorDir . '/dflydev/dot-access-data/src/DataInterface.php', 'Dflydev\\DotAccessData\\Exception\\DataException' => $vendorDir . '/dflydev/dot-access-data/src/Exception/DataException.php', @@ -411,1506 +385,13 @@ return array( 'Nette\\Utils\\Type' => $vendorDir . '/nette/utils/src/Utils/Type.php', 'Nette\\Utils\\UnknownImageFileException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', 'Nette\\Utils\\Validators' => $vendorDir . '/nette/utils/src/Utils/Validators.php', - 'PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin' => $vendorDir . '/dealerdirect/phpcodesniffer-composer-installer/src/Plugin.php', - 'PHPCSUtils\\AbstractSniffs\\AbstractArrayDeclarationSniff' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/AbstractSniffs/AbstractArrayDeclarationSniff.php', - 'PHPCSUtils\\BackCompat\\BCFile' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/BackCompat/BCFile.php', - 'PHPCSUtils\\BackCompat\\BCTokens' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/BackCompat/BCTokens.php', - 'PHPCSUtils\\BackCompat\\Helper' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/BackCompat/Helper.php', - 'PHPCSUtils\\Exceptions\\InvalidTokenArray' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/InvalidTokenArray.php', - 'PHPCSUtils\\Exceptions\\LogicException' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/LogicException.php', - 'PHPCSUtils\\Exceptions\\MissingArgumentError' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/MissingArgumentError.php', - 'PHPCSUtils\\Exceptions\\OutOfBoundsStackPtr' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/OutOfBoundsStackPtr.php', - 'PHPCSUtils\\Exceptions\\RuntimeException' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/RuntimeException.php', - 'PHPCSUtils\\Exceptions\\TestFileNotFound' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/TestFileNotFound.php', - 'PHPCSUtils\\Exceptions\\TestMarkerNotFound' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/TestMarkerNotFound.php', - 'PHPCSUtils\\Exceptions\\TestTargetNotFound' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/TestTargetNotFound.php', - 'PHPCSUtils\\Exceptions\\TypeError' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/TypeError.php', - 'PHPCSUtils\\Exceptions\\UnexpectedTokenType' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/UnexpectedTokenType.php', - 'PHPCSUtils\\Exceptions\\ValueError' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/ValueError.php', - 'PHPCSUtils\\Fixers\\SpacesFixer' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Fixers/SpacesFixer.php', - 'PHPCSUtils\\Internal\\AttributeHelper' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Internal/AttributeHelper.php', - 'PHPCSUtils\\Internal\\Cache' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Internal/Cache.php', - 'PHPCSUtils\\Internal\\IsShortArrayOrList' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Internal/IsShortArrayOrList.php', - 'PHPCSUtils\\Internal\\IsShortArrayOrListWithCache' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Internal/IsShortArrayOrListWithCache.php', - 'PHPCSUtils\\Internal\\NoFileCache' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Internal/NoFileCache.php', - 'PHPCSUtils\\Internal\\StableCollections' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Internal/StableCollections.php', - 'PHPCSUtils\\TestUtils\\ConfigDouble' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/TestUtils/ConfigDouble.php', - 'PHPCSUtils\\TestUtils\\RulesetDouble' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/TestUtils/RulesetDouble.php', - 'PHPCSUtils\\TestUtils\\UtilityMethodTestCase' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/TestUtils/UtilityMethodTestCase.php', - 'PHPCSUtils\\Tokens\\Collections' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Tokens/Collections.php', - 'PHPCSUtils\\Tokens\\TokenHelper' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Tokens/TokenHelper.php', - 'PHPCSUtils\\Utils\\Arrays' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Arrays.php', - 'PHPCSUtils\\Utils\\AttributeBlock' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/AttributeBlock.php', - 'PHPCSUtils\\Utils\\Conditions' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Conditions.php', - 'PHPCSUtils\\Utils\\Constants' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Constants.php', - 'PHPCSUtils\\Utils\\Context' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Context.php', - 'PHPCSUtils\\Utils\\ControlStructures' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/ControlStructures.php', - 'PHPCSUtils\\Utils\\FileInfo' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/FileInfo.php', - 'PHPCSUtils\\Utils\\FilePath' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/FilePath.php', - 'PHPCSUtils\\Utils\\FunctionDeclarations' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/FunctionDeclarations.php', - 'PHPCSUtils\\Utils\\GetTokensAsString' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/GetTokensAsString.php', - 'PHPCSUtils\\Utils\\Lists' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Lists.php', - 'PHPCSUtils\\Utils\\MessageHelper' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/MessageHelper.php', - 'PHPCSUtils\\Utils\\Namespaces' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Namespaces.php', - 'PHPCSUtils\\Utils\\NamingConventions' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/NamingConventions.php', - 'PHPCSUtils\\Utils\\Numbers' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Numbers.php', - 'PHPCSUtils\\Utils\\ObjectDeclarations' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/ObjectDeclarations.php', - 'PHPCSUtils\\Utils\\Operators' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Operators.php', - 'PHPCSUtils\\Utils\\Orthography' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Orthography.php', - 'PHPCSUtils\\Utils\\Parentheses' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Parentheses.php', - 'PHPCSUtils\\Utils\\PassedParameters' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/PassedParameters.php', - 'PHPCSUtils\\Utils\\Scopes' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Scopes.php', - 'PHPCSUtils\\Utils\\TextStrings' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/TextStrings.php', - 'PHPCSUtils\\Utils\\TypeString' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/TypeString.php', - 'PHPCSUtils\\Utils\\UseStatements' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/UseStatements.php', - 'PHPCSUtils\\Utils\\Variables' => $vendorDir . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Variables.php', - 'PHPUnit\\Event\\Application\\Finished' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Application/Finished.php', - 'PHPUnit\\Event\\Application\\FinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Application/FinishedSubscriber.php', - 'PHPUnit\\Event\\Application\\Started' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Application/Started.php', - 'PHPUnit\\Event\\Application\\StartedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Application/StartedSubscriber.php', - 'PHPUnit\\Event\\Code\\ClassMethod' => $vendorDir . '/phpunit/phpunit/src/Event/Value/ClassMethod.php', - 'PHPUnit\\Event\\Code\\ComparisonFailure' => $vendorDir . '/phpunit/phpunit/src/Event/Value/ComparisonFailure.php', - 'PHPUnit\\Event\\Code\\ComparisonFailureBuilder' => $vendorDir . '/phpunit/phpunit/src/Event/Value/ComparisonFailureBuilder.php', - 'PHPUnit\\Event\\Code\\NoTestCaseObjectOnCallStackException' => $vendorDir . '/phpunit/phpunit/src/Event/Exception/NoTestCaseObjectOnCallStackException.php', - 'PHPUnit\\Event\\Code\\Phpt' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Test/Phpt.php', - 'PHPUnit\\Event\\Code\\Test' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Test/Test.php', - 'PHPUnit\\Event\\Code\\TestCollection' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Test/TestCollection.php', - 'PHPUnit\\Event\\Code\\TestCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Test/TestCollectionIterator.php', - 'PHPUnit\\Event\\Code\\TestDox' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Test/TestDox.php', - 'PHPUnit\\Event\\Code\\TestDoxBuilder' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Test/TestDoxBuilder.php', - 'PHPUnit\\Event\\Code\\TestMethod' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Test/TestMethod.php', - 'PHPUnit\\Event\\Code\\TestMethodBuilder' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Test/TestMethodBuilder.php', - 'PHPUnit\\Event\\Code\\Throwable' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Throwable.php', - 'PHPUnit\\Event\\Code\\ThrowableBuilder' => $vendorDir . '/phpunit/phpunit/src/Event/Value/ThrowableBuilder.php', - 'PHPUnit\\Event\\CollectingDispatcher' => $vendorDir . '/phpunit/phpunit/src/Event/Dispatcher/CollectingDispatcher.php', - 'PHPUnit\\Event\\DeferringDispatcher' => $vendorDir . '/phpunit/phpunit/src/Event/Dispatcher/DeferringDispatcher.php', - 'PHPUnit\\Event\\DirectDispatcher' => $vendorDir . '/phpunit/phpunit/src/Event/Dispatcher/DirectDispatcher.php', - 'PHPUnit\\Event\\Dispatcher' => $vendorDir . '/phpunit/phpunit/src/Event/Dispatcher/Dispatcher.php', - 'PHPUnit\\Event\\DispatchingEmitter' => $vendorDir . '/phpunit/phpunit/src/Event/Emitter/DispatchingEmitter.php', - 'PHPUnit\\Event\\Emitter' => $vendorDir . '/phpunit/phpunit/src/Event/Emitter/Emitter.php', - 'PHPUnit\\Event\\Event' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Event.php', - 'PHPUnit\\Event\\EventAlreadyAssignedException' => $vendorDir . '/phpunit/phpunit/src/Event/Exception/EventAlreadyAssignedException.php', - 'PHPUnit\\Event\\EventCollection' => $vendorDir . '/phpunit/phpunit/src/Event/Events/EventCollection.php', - 'PHPUnit\\Event\\EventCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/Event/Events/EventCollectionIterator.php', - 'PHPUnit\\Event\\EventFacadeIsSealedException' => $vendorDir . '/phpunit/phpunit/src/Event/Exception/EventFacadeIsSealedException.php', - 'PHPUnit\\Event\\Exception' => $vendorDir . '/phpunit/phpunit/src/Event/Exception/Exception.php', - 'PHPUnit\\Event\\Facade' => $vendorDir . '/phpunit/phpunit/src/Event/Facade.php', - 'PHPUnit\\Event\\InvalidArgumentException' => $vendorDir . '/phpunit/phpunit/src/Event/Exception/InvalidArgumentException.php', - 'PHPUnit\\Event\\InvalidEventException' => $vendorDir . '/phpunit/phpunit/src/Event/Exception/InvalidEventException.php', - 'PHPUnit\\Event\\InvalidSubscriberException' => $vendorDir . '/phpunit/phpunit/src/Event/Exception/InvalidSubscriberException.php', - 'PHPUnit\\Event\\MapError' => $vendorDir . '/phpunit/phpunit/src/Event/Exception/MapError.php', - 'PHPUnit\\Event\\NoPreviousThrowableException' => $vendorDir . '/phpunit/phpunit/src/Event/Exception/NoPreviousThrowableException.php', - 'PHPUnit\\Event\\RuntimeException' => $vendorDir . '/phpunit/phpunit/src/Event/Exception/RuntimeException.php', - 'PHPUnit\\Event\\Runtime\\OperatingSystem' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Runtime/OperatingSystem.php', - 'PHPUnit\\Event\\Runtime\\PHP' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Runtime/PHP.php', - 'PHPUnit\\Event\\Runtime\\PHPUnit' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Runtime/PHPUnit.php', - 'PHPUnit\\Event\\Runtime\\Runtime' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Runtime/Runtime.php', - 'PHPUnit\\Event\\SubscribableDispatcher' => $vendorDir . '/phpunit/phpunit/src/Event/Dispatcher/SubscribableDispatcher.php', - 'PHPUnit\\Event\\Subscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Subscriber.php', - 'PHPUnit\\Event\\SubscriberTypeAlreadyRegisteredException' => $vendorDir . '/phpunit/phpunit/src/Event/Exception/SubscriberTypeAlreadyRegisteredException.php', - 'PHPUnit\\Event\\Telemetry\\Duration' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Telemetry/Duration.php', - 'PHPUnit\\Event\\Telemetry\\GarbageCollectorStatus' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Telemetry/GarbageCollectorStatus.php', - 'PHPUnit\\Event\\Telemetry\\GarbageCollectorStatusProvider' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Telemetry/GarbageCollectorStatusProvider.php', - 'PHPUnit\\Event\\Telemetry\\HRTime' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Telemetry/HRTime.php', - 'PHPUnit\\Event\\Telemetry\\Info' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Telemetry/Info.php', - 'PHPUnit\\Event\\Telemetry\\MemoryMeter' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Telemetry/MemoryMeter.php', - 'PHPUnit\\Event\\Telemetry\\MemoryUsage' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Telemetry/MemoryUsage.php', - 'PHPUnit\\Event\\Telemetry\\Php81GarbageCollectorStatusProvider' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Telemetry/Php81GarbageCollectorStatusProvider.php', - 'PHPUnit\\Event\\Telemetry\\Php83GarbageCollectorStatusProvider' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Telemetry/Php83GarbageCollectorStatusProvider.php', - 'PHPUnit\\Event\\Telemetry\\Snapshot' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Telemetry/Snapshot.php', - 'PHPUnit\\Event\\Telemetry\\StopWatch' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Telemetry/StopWatch.php', - 'PHPUnit\\Event\\Telemetry\\System' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Telemetry/System.php', - 'PHPUnit\\Event\\Telemetry\\SystemMemoryMeter' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Telemetry/SystemMemoryMeter.php', - 'PHPUnit\\Event\\Telemetry\\SystemStopWatch' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Telemetry/SystemStopWatch.php', - 'PHPUnit\\Event\\Telemetry\\SystemStopWatchWithOffset' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Telemetry/SystemStopWatchWithOffset.php', - 'PHPUnit\\Event\\TestData\\DataFromDataProvider' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Test/TestData/DataFromDataProvider.php', - 'PHPUnit\\Event\\TestData\\DataFromTestDependency' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Test/TestData/DataFromTestDependency.php', - 'PHPUnit\\Event\\TestData\\MoreThanOneDataSetFromDataProviderException' => $vendorDir . '/phpunit/phpunit/src/Event/Exception/MoreThanOneDataSetFromDataProviderException.php', - 'PHPUnit\\Event\\TestData\\NoDataSetFromDataProviderException' => $vendorDir . '/phpunit/phpunit/src/Event/Exception/NoDataSetFromDataProviderException.php', - 'PHPUnit\\Event\\TestData\\TestData' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Test/TestData/TestData.php', - 'PHPUnit\\Event\\TestData\\TestDataCollection' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Test/TestData/TestDataCollection.php', - 'PHPUnit\\Event\\TestData\\TestDataCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/Event/Value/Test/TestData/TestDataCollectionIterator.php', - 'PHPUnit\\Event\\TestRunner\\BootstrapFinished' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/BootstrapFinished.php', - 'PHPUnit\\Event\\TestRunner\\BootstrapFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/BootstrapFinishedSubscriber.php', - 'PHPUnit\\Event\\TestRunner\\Configured' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/Configured.php', - 'PHPUnit\\Event\\TestRunner\\ConfiguredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/ConfiguredSubscriber.php', - 'PHPUnit\\Event\\TestRunner\\DeprecationTriggered' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/DeprecationTriggered.php', - 'PHPUnit\\Event\\TestRunner\\DeprecationTriggeredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/DeprecationTriggeredSubscriber.php', - 'PHPUnit\\Event\\TestRunner\\EventFacadeSealed' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/EventFacadeSealed.php', - 'PHPUnit\\Event\\TestRunner\\EventFacadeSealedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/EventFacadeSealedSubscriber.php', - 'PHPUnit\\Event\\TestRunner\\ExecutionAborted' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionAborted.php', - 'PHPUnit\\Event\\TestRunner\\ExecutionAbortedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionAbortedSubscriber.php', - 'PHPUnit\\Event\\TestRunner\\ExecutionFinished' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionFinished.php', - 'PHPUnit\\Event\\TestRunner\\ExecutionFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionFinishedSubscriber.php', - 'PHPUnit\\Event\\TestRunner\\ExecutionStarted' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionStarted.php', - 'PHPUnit\\Event\\TestRunner\\ExecutionStartedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionStartedSubscriber.php', - 'PHPUnit\\Event\\TestRunner\\ExtensionBootstrapped' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionBootstrapped.php', - 'PHPUnit\\Event\\TestRunner\\ExtensionBootstrappedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionBootstrappedSubscriber.php', - 'PHPUnit\\Event\\TestRunner\\ExtensionLoadedFromPhar' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionLoadedFromPhar.php', - 'PHPUnit\\Event\\TestRunner\\ExtensionLoadedFromPharSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionLoadedFromPharSubscriber.php', - 'PHPUnit\\Event\\TestRunner\\Finished' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/Finished.php', - 'PHPUnit\\Event\\TestRunner\\FinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/FinishedSubscriber.php', - 'PHPUnit\\Event\\TestRunner\\GarbageCollectionDisabled' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionDisabled.php', - 'PHPUnit\\Event\\TestRunner\\GarbageCollectionDisabledSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionDisabledSubscriber.php', - 'PHPUnit\\Event\\TestRunner\\GarbageCollectionEnabled' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionEnabled.php', - 'PHPUnit\\Event\\TestRunner\\GarbageCollectionEnabledSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionEnabledSubscriber.php', - 'PHPUnit\\Event\\TestRunner\\GarbageCollectionTriggered' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionTriggered.php', - 'PHPUnit\\Event\\TestRunner\\GarbageCollectionTriggeredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionTriggeredSubscriber.php', - 'PHPUnit\\Event\\TestRunner\\Started' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/Started.php', - 'PHPUnit\\Event\\TestRunner\\StartedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/StartedSubscriber.php', - 'PHPUnit\\Event\\TestRunner\\WarningTriggered' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/WarningTriggered.php', - 'PHPUnit\\Event\\TestRunner\\WarningTriggeredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestRunner/WarningTriggeredSubscriber.php', - 'PHPUnit\\Event\\TestSuite\\Filtered' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestSuite/Filtered.php', - 'PHPUnit\\Event\\TestSuite\\FilteredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestSuite/FilteredSubscriber.php', - 'PHPUnit\\Event\\TestSuite\\Finished' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestSuite/Finished.php', - 'PHPUnit\\Event\\TestSuite\\FinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestSuite/FinishedSubscriber.php', - 'PHPUnit\\Event\\TestSuite\\Loaded' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestSuite/Loaded.php', - 'PHPUnit\\Event\\TestSuite\\LoadedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestSuite/LoadedSubscriber.php', - 'PHPUnit\\Event\\TestSuite\\Skipped' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestSuite/Skipped.php', - 'PHPUnit\\Event\\TestSuite\\SkippedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestSuite/SkippedSubscriber.php', - 'PHPUnit\\Event\\TestSuite\\Sorted' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestSuite/Sorted.php', - 'PHPUnit\\Event\\TestSuite\\SortedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestSuite/SortedSubscriber.php', - 'PHPUnit\\Event\\TestSuite\\Started' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestSuite/Started.php', - 'PHPUnit\\Event\\TestSuite\\StartedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/TestSuite/StartedSubscriber.php', - 'PHPUnit\\Event\\TestSuite\\TestSuite' => $vendorDir . '/phpunit/phpunit/src/Event/Value/TestSuite/TestSuite.php', - 'PHPUnit\\Event\\TestSuite\\TestSuiteBuilder' => $vendorDir . '/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteBuilder.php', - 'PHPUnit\\Event\\TestSuite\\TestSuiteForTestClass' => $vendorDir . '/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteForTestClass.php', - 'PHPUnit\\Event\\TestSuite\\TestSuiteForTestMethodWithDataProvider' => $vendorDir . '/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteForTestMethodWithDataProvider.php', - 'PHPUnit\\Event\\TestSuite\\TestSuiteWithName' => $vendorDir . '/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteWithName.php', - 'PHPUnit\\Event\\Test\\AfterLastTestMethodCalled' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodCalled.php', - 'PHPUnit\\Event\\Test\\AfterLastTestMethodCalledSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodCalledSubscriber.php', - 'PHPUnit\\Event\\Test\\AfterLastTestMethodErrored' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodErrored.php', - 'PHPUnit\\Event\\Test\\AfterLastTestMethodErroredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodErroredSubscriber.php', - 'PHPUnit\\Event\\Test\\AfterLastTestMethodFinished' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodFinished.php', - 'PHPUnit\\Event\\Test\\AfterLastTestMethodFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodFinishedSubscriber.php', - 'PHPUnit\\Event\\Test\\AfterTestMethodCalled' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodCalled.php', - 'PHPUnit\\Event\\Test\\AfterTestMethodCalledSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodCalledSubscriber.php', - 'PHPUnit\\Event\\Test\\AfterTestMethodErrored' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodErrored.php', - 'PHPUnit\\Event\\Test\\AfterTestMethodErroredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodErroredSubscriber.php', - 'PHPUnit\\Event\\Test\\AfterTestMethodFinished' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodFinished.php', - 'PHPUnit\\Event\\Test\\AfterTestMethodFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodFinishedSubscriber.php', - 'PHPUnit\\Event\\Test\\AssertionFailed' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionFailed.php', - 'PHPUnit\\Event\\Test\\AssertionFailedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionFailedSubscriber.php', - 'PHPUnit\\Event\\Test\\AssertionSucceeded' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionSucceeded.php', - 'PHPUnit\\Event\\Test\\AssertionSucceededSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionSucceededSubscriber.php', - 'PHPUnit\\Event\\Test\\BeforeFirstTestMethodCalled' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodCalled.php', - 'PHPUnit\\Event\\Test\\BeforeFirstTestMethodCalledSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodCalledSubscriber.php', - 'PHPUnit\\Event\\Test\\BeforeFirstTestMethodErrored' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodErrored.php', - 'PHPUnit\\Event\\Test\\BeforeFirstTestMethodErroredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodErroredSubscriber.php', - 'PHPUnit\\Event\\Test\\BeforeFirstTestMethodFinished' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodFinished.php', - 'PHPUnit\\Event\\Test\\BeforeFirstTestMethodFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodFinishedSubscriber.php', - 'PHPUnit\\Event\\Test\\BeforeTestMethodCalled' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodCalled.php', - 'PHPUnit\\Event\\Test\\BeforeTestMethodCalledSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodCalledSubscriber.php', - 'PHPUnit\\Event\\Test\\BeforeTestMethodErrored' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodErrored.php', - 'PHPUnit\\Event\\Test\\BeforeTestMethodErroredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodErroredSubscriber.php', - 'PHPUnit\\Event\\Test\\BeforeTestMethodFinished' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodFinished.php', - 'PHPUnit\\Event\\Test\\BeforeTestMethodFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodFinishedSubscriber.php', - 'PHPUnit\\Event\\Test\\ComparatorRegistered' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/ComparatorRegistered.php', - 'PHPUnit\\Event\\Test\\ComparatorRegisteredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/ComparatorRegisteredSubscriber.php', - 'PHPUnit\\Event\\Test\\ConsideredRisky' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/ConsideredRisky.php', - 'PHPUnit\\Event\\Test\\ConsideredRiskySubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/ConsideredRiskySubscriber.php', - 'PHPUnit\\Event\\Test\\DataProviderMethodCalled' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/DataProviderMethodCalled.php', - 'PHPUnit\\Event\\Test\\DataProviderMethodCalledSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/DataProviderMethodCalledSubscriber.php', - 'PHPUnit\\Event\\Test\\DataProviderMethodFinished' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/DataProviderMethodFinished.php', - 'PHPUnit\\Event\\Test\\DataProviderMethodFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/DataProviderMethodFinishedSubscriber.php', - 'PHPUnit\\Event\\Test\\DeprecationTriggered' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/DeprecationTriggered.php', - 'PHPUnit\\Event\\Test\\DeprecationTriggeredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/DeprecationTriggeredSubscriber.php', - 'PHPUnit\\Event\\Test\\ErrorTriggered' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/ErrorTriggered.php', - 'PHPUnit\\Event\\Test\\ErrorTriggeredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/ErrorTriggeredSubscriber.php', - 'PHPUnit\\Event\\Test\\Errored' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Outcome/Errored.php', - 'PHPUnit\\Event\\Test\\ErroredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Outcome/ErroredSubscriber.php', - 'PHPUnit\\Event\\Test\\Failed' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Outcome/Failed.php', - 'PHPUnit\\Event\\Test\\FailedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Outcome/FailedSubscriber.php', - 'PHPUnit\\Event\\Test\\Finished' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/Finished.php', - 'PHPUnit\\Event\\Test\\FinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/FinishedSubscriber.php', - 'PHPUnit\\Event\\Test\\MarkedIncomplete' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Outcome/MarkedIncomplete.php', - 'PHPUnit\\Event\\Test\\MarkedIncompleteSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Outcome/MarkedIncompleteSubscriber.php', - 'PHPUnit\\Event\\Test\\MockObjectCreated' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectCreated.php', - 'PHPUnit\\Event\\Test\\MockObjectCreatedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectCreatedSubscriber.php', - 'PHPUnit\\Event\\Test\\MockObjectForAbstractClassCreated' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForAbstractClassCreated.php', - 'PHPUnit\\Event\\Test\\MockObjectForAbstractClassCreatedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForAbstractClassCreatedSubscriber.php', - 'PHPUnit\\Event\\Test\\MockObjectForIntersectionOfInterfacesCreated' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForIntersectionOfInterfacesCreated.php', - 'PHPUnit\\Event\\Test\\MockObjectForIntersectionOfInterfacesCreatedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForIntersectionOfInterfacesCreatedSubscriber.php', - 'PHPUnit\\Event\\Test\\MockObjectForTraitCreated' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForTraitCreated.php', - 'PHPUnit\\Event\\Test\\MockObjectForTraitCreatedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForTraitCreatedSubscriber.php', - 'PHPUnit\\Event\\Test\\MockObjectFromWsdlCreated' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectFromWsdlCreated.php', - 'PHPUnit\\Event\\Test\\MockObjectFromWsdlCreatedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectFromWsdlCreatedSubscriber.php', - 'PHPUnit\\Event\\Test\\NoComparisonFailureException' => $vendorDir . '/phpunit/phpunit/src/Event/Exception/NoComparisonFailureException.php', - 'PHPUnit\\Event\\Test\\NoticeTriggered' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/NoticeTriggered.php', - 'PHPUnit\\Event\\Test\\NoticeTriggeredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/NoticeTriggeredSubscriber.php', - 'PHPUnit\\Event\\Test\\PartialMockObjectCreated' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/PartialMockObjectCreated.php', - 'PHPUnit\\Event\\Test\\PartialMockObjectCreatedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/PartialMockObjectCreatedSubscriber.php', - 'PHPUnit\\Event\\Test\\Passed' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Outcome/Passed.php', - 'PHPUnit\\Event\\Test\\PassedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Outcome/PassedSubscriber.php', - 'PHPUnit\\Event\\Test\\PhpDeprecationTriggered' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpDeprecationTriggered.php', - 'PHPUnit\\Event\\Test\\PhpDeprecationTriggeredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpDeprecationTriggeredSubscriber.php', - 'PHPUnit\\Event\\Test\\PhpNoticeTriggered' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpNoticeTriggered.php', - 'PHPUnit\\Event\\Test\\PhpNoticeTriggeredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpNoticeTriggeredSubscriber.php', - 'PHPUnit\\Event\\Test\\PhpWarningTriggered' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpWarningTriggered.php', - 'PHPUnit\\Event\\Test\\PhpWarningTriggeredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpWarningTriggeredSubscriber.php', - 'PHPUnit\\Event\\Test\\PhpunitDeprecationTriggered' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitDeprecationTriggered.php', - 'PHPUnit\\Event\\Test\\PhpunitDeprecationTriggeredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitDeprecationTriggeredSubscriber.php', - 'PHPUnit\\Event\\Test\\PhpunitErrorTriggered' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitErrorTriggered.php', - 'PHPUnit\\Event\\Test\\PhpunitErrorTriggeredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitErrorTriggeredSubscriber.php', - 'PHPUnit\\Event\\Test\\PhpunitWarningTriggered' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitWarningTriggered.php', - 'PHPUnit\\Event\\Test\\PhpunitWarningTriggeredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitWarningTriggeredSubscriber.php', - 'PHPUnit\\Event\\Test\\PostConditionCalled' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionCalled.php', - 'PHPUnit\\Event\\Test\\PostConditionCalledSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionCalledSubscriber.php', - 'PHPUnit\\Event\\Test\\PostConditionErrored' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionErrored.php', - 'PHPUnit\\Event\\Test\\PostConditionErroredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionErroredSubscriber.php', - 'PHPUnit\\Event\\Test\\PostConditionFinished' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionFinished.php', - 'PHPUnit\\Event\\Test\\PostConditionFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionFinishedSubscriber.php', - 'PHPUnit\\Event\\Test\\PreConditionCalled' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionCalled.php', - 'PHPUnit\\Event\\Test\\PreConditionCalledSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionCalledSubscriber.php', - 'PHPUnit\\Event\\Test\\PreConditionErrored' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionErrored.php', - 'PHPUnit\\Event\\Test\\PreConditionErroredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionErroredSubscriber.php', - 'PHPUnit\\Event\\Test\\PreConditionFinished' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionFinished.php', - 'PHPUnit\\Event\\Test\\PreConditionFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionFinishedSubscriber.php', - 'PHPUnit\\Event\\Test\\PreparationFailed' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparationFailed.php', - 'PHPUnit\\Event\\Test\\PreparationFailedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparationFailedSubscriber.php', - 'PHPUnit\\Event\\Test\\PreparationStarted' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparationStarted.php', - 'PHPUnit\\Event\\Test\\PreparationStartedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparationStartedSubscriber.php', - 'PHPUnit\\Event\\Test\\Prepared' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/Prepared.php', - 'PHPUnit\\Event\\Test\\PreparedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparedSubscriber.php', - 'PHPUnit\\Event\\Test\\PrintedUnexpectedOutput' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/PrintedUnexpectedOutput.php', - 'PHPUnit\\Event\\Test\\PrintedUnexpectedOutputSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/PrintedUnexpectedOutputSubscriber.php', - 'PHPUnit\\Event\\Test\\Skipped' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Outcome/Skipped.php', - 'PHPUnit\\Event\\Test\\SkippedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Outcome/SkippedSubscriber.php', - 'PHPUnit\\Event\\Test\\TestProxyCreated' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestProxyCreated.php', - 'PHPUnit\\Event\\Test\\TestProxyCreatedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestProxyCreatedSubscriber.php', - 'PHPUnit\\Event\\Test\\TestStubCreated' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestStubCreated.php', - 'PHPUnit\\Event\\Test\\TestStubCreatedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestStubCreatedSubscriber.php', - 'PHPUnit\\Event\\Test\\TestStubForIntersectionOfInterfacesCreated' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestStubForIntersectionOfInterfacesCreated.php', - 'PHPUnit\\Event\\Test\\TestStubForIntersectionOfInterfacesCreatedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestStubForIntersectionOfInterfacesCreatedSubscriber.php', - 'PHPUnit\\Event\\Test\\WarningTriggered' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/WarningTriggered.php', - 'PHPUnit\\Event\\Test\\WarningTriggeredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Event/Events/Test/Issue/WarningTriggeredSubscriber.php', - 'PHPUnit\\Event\\Tracer\\Tracer' => $vendorDir . '/phpunit/phpunit/src/Event/Tracer.php', - 'PHPUnit\\Event\\TypeMap' => $vendorDir . '/phpunit/phpunit/src/Event/TypeMap.php', - 'PHPUnit\\Event\\UnknownEventException' => $vendorDir . '/phpunit/phpunit/src/Event/Exception/UnknownEventException.php', - 'PHPUnit\\Event\\UnknownEventTypeException' => $vendorDir . '/phpunit/phpunit/src/Event/Exception/UnknownEventTypeException.php', - 'PHPUnit\\Event\\UnknownSubscriberException' => $vendorDir . '/phpunit/phpunit/src/Event/Exception/UnknownSubscriberException.php', - 'PHPUnit\\Event\\UnknownSubscriberTypeException' => $vendorDir . '/phpunit/phpunit/src/Event/Exception/UnknownSubscriberTypeException.php', - 'PHPUnit\\Exception' => $vendorDir . '/phpunit/phpunit/src/Exception.php', - 'PHPUnit\\Framework\\ActualValueIsNotAnObjectException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ActualValueIsNotAnObjectException.php', - 'PHPUnit\\Framework\\Assert' => $vendorDir . '/phpunit/phpunit/src/Framework/Assert.php', - 'PHPUnit\\Framework\\AssertionFailedError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/AssertionFailedError.php', - 'PHPUnit\\Framework\\Attributes\\After' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/After.php', - 'PHPUnit\\Framework\\Attributes\\AfterClass' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/AfterClass.php', - 'PHPUnit\\Framework\\Attributes\\BackupGlobals' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/BackupGlobals.php', - 'PHPUnit\\Framework\\Attributes\\BackupStaticProperties' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/BackupStaticProperties.php', - 'PHPUnit\\Framework\\Attributes\\Before' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/Before.php', - 'PHPUnit\\Framework\\Attributes\\BeforeClass' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/BeforeClass.php', - 'PHPUnit\\Framework\\Attributes\\CodeCoverageIgnore' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/CodeCoverageIgnore.php', - 'PHPUnit\\Framework\\Attributes\\CoversClass' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/CoversClass.php', - 'PHPUnit\\Framework\\Attributes\\CoversFunction' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/CoversFunction.php', - 'PHPUnit\\Framework\\Attributes\\CoversNothing' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/CoversNothing.php', - 'PHPUnit\\Framework\\Attributes\\DataProvider' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/DataProvider.php', - 'PHPUnit\\Framework\\Attributes\\DataProviderExternal' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/DataProviderExternal.php', - 'PHPUnit\\Framework\\Attributes\\Depends' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/Depends.php', - 'PHPUnit\\Framework\\Attributes\\DependsExternal' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/DependsExternal.php', - 'PHPUnit\\Framework\\Attributes\\DependsExternalUsingDeepClone' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/DependsExternalUsingDeepClone.php', - 'PHPUnit\\Framework\\Attributes\\DependsExternalUsingShallowClone' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/DependsExternalUsingShallowClone.php', - 'PHPUnit\\Framework\\Attributes\\DependsOnClass' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/DependsOnClass.php', - 'PHPUnit\\Framework\\Attributes\\DependsOnClassUsingDeepClone' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/DependsOnClassUsingDeepClone.php', - 'PHPUnit\\Framework\\Attributes\\DependsOnClassUsingShallowClone' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/DependsOnClassUsingShallowClone.php', - 'PHPUnit\\Framework\\Attributes\\DependsUsingDeepClone' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/DependsUsingDeepClone.php', - 'PHPUnit\\Framework\\Attributes\\DependsUsingShallowClone' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/DependsUsingShallowClone.php', - 'PHPUnit\\Framework\\Attributes\\DoesNotPerformAssertions' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/DoesNotPerformAssertions.php', - 'PHPUnit\\Framework\\Attributes\\ExcludeGlobalVariableFromBackup' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/ExcludeGlobalVariableFromBackup.php', - 'PHPUnit\\Framework\\Attributes\\ExcludeStaticPropertyFromBackup' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/ExcludeStaticPropertyFromBackup.php', - 'PHPUnit\\Framework\\Attributes\\Group' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/Group.php', - 'PHPUnit\\Framework\\Attributes\\IgnoreClassForCodeCoverage' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/IgnoreClassForCodeCoverage.php', - 'PHPUnit\\Framework\\Attributes\\IgnoreDeprecations' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/IgnoreDeprecations.php', - 'PHPUnit\\Framework\\Attributes\\IgnoreFunctionForCodeCoverage' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/IgnoreFunctionForCodeCoverage.php', - 'PHPUnit\\Framework\\Attributes\\IgnoreMethodForCodeCoverage' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/IgnoreMethodForCodeCoverage.php', - 'PHPUnit\\Framework\\Attributes\\Large' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/Large.php', - 'PHPUnit\\Framework\\Attributes\\Medium' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/Medium.php', - 'PHPUnit\\Framework\\Attributes\\PostCondition' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/PostCondition.php', - 'PHPUnit\\Framework\\Attributes\\PreCondition' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/PreCondition.php', - 'PHPUnit\\Framework\\Attributes\\PreserveGlobalState' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/PreserveGlobalState.php', - 'PHPUnit\\Framework\\Attributes\\RequiresFunction' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/RequiresFunction.php', - 'PHPUnit\\Framework\\Attributes\\RequiresMethod' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/RequiresMethod.php', - 'PHPUnit\\Framework\\Attributes\\RequiresOperatingSystem' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/RequiresOperatingSystem.php', - 'PHPUnit\\Framework\\Attributes\\RequiresOperatingSystemFamily' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/RequiresOperatingSystemFamily.php', - 'PHPUnit\\Framework\\Attributes\\RequiresPhp' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/RequiresPhp.php', - 'PHPUnit\\Framework\\Attributes\\RequiresPhpExtension' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/RequiresPhpExtension.php', - 'PHPUnit\\Framework\\Attributes\\RequiresPhpunit' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/RequiresPhpunit.php', - 'PHPUnit\\Framework\\Attributes\\RequiresSetting' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/RequiresSetting.php', - 'PHPUnit\\Framework\\Attributes\\RunClassInSeparateProcess' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/RunClassInSeparateProcess.php', - 'PHPUnit\\Framework\\Attributes\\RunInSeparateProcess' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/RunInSeparateProcess.php', - 'PHPUnit\\Framework\\Attributes\\RunTestsInSeparateProcesses' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/RunTestsInSeparateProcesses.php', - 'PHPUnit\\Framework\\Attributes\\Small' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/Small.php', - 'PHPUnit\\Framework\\Attributes\\Test' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/Test.php', - 'PHPUnit\\Framework\\Attributes\\TestDox' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/TestDox.php', - 'PHPUnit\\Framework\\Attributes\\TestWith' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/TestWith.php', - 'PHPUnit\\Framework\\Attributes\\TestWithJson' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/TestWithJson.php', - 'PHPUnit\\Framework\\Attributes\\Ticket' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/Ticket.php', - 'PHPUnit\\Framework\\Attributes\\UsesClass' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/UsesClass.php', - 'PHPUnit\\Framework\\Attributes\\UsesFunction' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/UsesFunction.php', - 'PHPUnit\\Framework\\Attributes\\WithoutErrorHandler' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/WithoutErrorHandler.php', - 'PHPUnit\\Framework\\CodeCoverageException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/CodeCoverageException.php', - 'PHPUnit\\Framework\\ComparisonMethodDoesNotAcceptParameterTypeException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotAcceptParameterTypeException.php', - 'PHPUnit\\Framework\\ComparisonMethodDoesNotDeclareBoolReturnTypeException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotDeclareBoolReturnTypeException.php', - 'PHPUnit\\Framework\\ComparisonMethodDoesNotDeclareExactlyOneParameterException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotDeclareExactlyOneParameterException.php', - 'PHPUnit\\Framework\\ComparisonMethodDoesNotDeclareParameterTypeException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotDeclareParameterTypeException.php', - 'PHPUnit\\Framework\\ComparisonMethodDoesNotExistException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotExistException.php', - 'PHPUnit\\Framework\\Constraint\\ArrayHasKey' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Traversable/ArrayHasKey.php', - 'PHPUnit\\Framework\\Constraint\\BinaryOperator' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Operator/BinaryOperator.php', - 'PHPUnit\\Framework\\Constraint\\Callback' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Callback.php', - 'PHPUnit\\Framework\\Constraint\\Constraint' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Constraint.php', - 'PHPUnit\\Framework\\Constraint\\Count' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Cardinality/Count.php', - 'PHPUnit\\Framework\\Constraint\\DirectoryExists' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Filesystem/DirectoryExists.php', - 'PHPUnit\\Framework\\Constraint\\Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Exception/Exception.php', - 'PHPUnit\\Framework\\Constraint\\ExceptionCode' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionCode.php', - 'PHPUnit\\Framework\\Constraint\\ExceptionMessageIsOrContains' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionMessageIsOrContains.php', - 'PHPUnit\\Framework\\Constraint\\ExceptionMessageMatchesRegularExpression' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionMessageMatchesRegularExpression.php', - 'PHPUnit\\Framework\\Constraint\\FileExists' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Filesystem/FileExists.php', - 'PHPUnit\\Framework\\Constraint\\GreaterThan' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Cardinality/GreaterThan.php', - 'PHPUnit\\Framework\\Constraint\\IsAnything' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsAnything.php', - 'PHPUnit\\Framework\\Constraint\\IsEmpty' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Cardinality/IsEmpty.php', - 'PHPUnit\\Framework\\Constraint\\IsEqual' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqual.php', - 'PHPUnit\\Framework\\Constraint\\IsEqualCanonicalizing' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualCanonicalizing.php', - 'PHPUnit\\Framework\\Constraint\\IsEqualIgnoringCase' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualIgnoringCase.php', - 'PHPUnit\\Framework\\Constraint\\IsEqualWithDelta' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualWithDelta.php', - 'PHPUnit\\Framework\\Constraint\\IsFalse' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Boolean/IsFalse.php', - 'PHPUnit\\Framework\\Constraint\\IsFinite' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Math/IsFinite.php', - 'PHPUnit\\Framework\\Constraint\\IsIdentical' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php', - 'PHPUnit\\Framework\\Constraint\\IsInfinite' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Math/IsInfinite.php', - 'PHPUnit\\Framework\\Constraint\\IsInstanceOf' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Type/IsInstanceOf.php', - 'PHPUnit\\Framework\\Constraint\\IsJson' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/String/IsJson.php', - 'PHPUnit\\Framework\\Constraint\\IsList' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Traversable/IsList.php', - 'PHPUnit\\Framework\\Constraint\\IsNan' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Math/IsNan.php', - 'PHPUnit\\Framework\\Constraint\\IsNull' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Type/IsNull.php', - 'PHPUnit\\Framework\\Constraint\\IsReadable' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Filesystem/IsReadable.php', - 'PHPUnit\\Framework\\Constraint\\IsTrue' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Boolean/IsTrue.php', - 'PHPUnit\\Framework\\Constraint\\IsType' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Type/IsType.php', - 'PHPUnit\\Framework\\Constraint\\IsWritable' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Filesystem/IsWritable.php', - 'PHPUnit\\Framework\\Constraint\\JsonMatches' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php', - 'PHPUnit\\Framework\\Constraint\\LessThan' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Cardinality/LessThan.php', - 'PHPUnit\\Framework\\Constraint\\LogicalAnd' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalAnd.php', - 'PHPUnit\\Framework\\Constraint\\LogicalNot' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalNot.php', - 'PHPUnit\\Framework\\Constraint\\LogicalOr' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalOr.php', - 'PHPUnit\\Framework\\Constraint\\LogicalXor' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalXor.php', - 'PHPUnit\\Framework\\Constraint\\ObjectEquals' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Object/ObjectEquals.php', - 'PHPUnit\\Framework\\Constraint\\ObjectHasProperty' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Object/ObjectHasProperty.php', - 'PHPUnit\\Framework\\Constraint\\Operator' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Operator/Operator.php', - 'PHPUnit\\Framework\\Constraint\\RegularExpression' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/String/RegularExpression.php', - 'PHPUnit\\Framework\\Constraint\\SameSize' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Cardinality/SameSize.php', - 'PHPUnit\\Framework\\Constraint\\StringContains' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/String/StringContains.php', - 'PHPUnit\\Framework\\Constraint\\StringEndsWith' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/String/StringEndsWith.php', - 'PHPUnit\\Framework\\Constraint\\StringEqualsStringIgnoringLineEndings' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/String/StringEqualsStringIgnoringLineEndings.php', - 'PHPUnit\\Framework\\Constraint\\StringMatchesFormatDescription' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/String/StringMatchesFormatDescription.php', - 'PHPUnit\\Framework\\Constraint\\StringStartsWith' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/String/StringStartsWith.php', - 'PHPUnit\\Framework\\Constraint\\TraversableContains' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContains.php', - 'PHPUnit\\Framework\\Constraint\\TraversableContainsEqual' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsEqual.php', - 'PHPUnit\\Framework\\Constraint\\TraversableContainsIdentical' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsIdentical.php', - 'PHPUnit\\Framework\\Constraint\\TraversableContainsOnly' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsOnly.php', - 'PHPUnit\\Framework\\Constraint\\UnaryOperator' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Operator/UnaryOperator.php', - 'PHPUnit\\Framework\\DataProviderTestSuite' => $vendorDir . '/phpunit/phpunit/src/Framework/DataProviderTestSuite.php', - 'PHPUnit\\Framework\\EmptyStringException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/EmptyStringException.php', - 'PHPUnit\\Framework\\Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/Exception.php', - 'PHPUnit\\Framework\\ExecutionOrderDependency' => $vendorDir . '/phpunit/phpunit/src/Framework/ExecutionOrderDependency.php', - 'PHPUnit\\Framework\\ExpectationFailedException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/ExpectationFailedException.php', - 'PHPUnit\\Framework\\GeneratorNotSupportedException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/GeneratorNotSupportedException.php', - 'PHPUnit\\Framework\\IncompleteTest' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/Incomplete/IncompleteTest.php', - 'PHPUnit\\Framework\\IncompleteTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/Incomplete/IncompleteTestError.php', - 'PHPUnit\\Framework\\InvalidArgumentException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/InvalidArgumentException.php', - 'PHPUnit\\Framework\\InvalidCoversTargetException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/InvalidCoversTargetException.php', - 'PHPUnit\\Framework\\InvalidDataProviderException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/InvalidDataProviderException.php', - 'PHPUnit\\Framework\\InvalidDependencyException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/InvalidDependencyException.php', - 'PHPUnit\\Framework\\MockObject\\BadMethodCallException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/BadMethodCallException.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\Identity' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/Identity.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\InvocationMocker' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/InvocationMocker.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\InvocationStubber' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/InvocationStubber.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\MethodNameMatch' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/MethodNameMatch.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\ParametersMatch' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/ParametersMatch.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\Stub' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/Stub.php', - 'PHPUnit\\Framework\\MockObject\\CannotUseOnlyMethodsException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/CannotUseOnlyMethodsException.php', - 'PHPUnit\\Framework\\MockObject\\ConfigurableMethod' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/ConfigurableMethod.php', - 'PHPUnit\\Framework\\MockObject\\DoubledCloneMethod' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/DoubledCloneMethod.php', - 'PHPUnit\\Framework\\MockObject\\Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/Exception.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\CannotUseAddMethodsException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/CannotUseAddMethodsException.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\ClassIsEnumerationException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ClassIsEnumerationException.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\ClassIsFinalException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ClassIsFinalException.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\ClassIsReadonlyException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ClassIsReadonlyException.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\DuplicateMethodException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/DuplicateMethodException.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/Exception.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\Generator' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/Generator.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\InvalidMethodNameException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/InvalidMethodNameException.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\MockClass' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/MockClass.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\MockMethod' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/MockMethod.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\MockMethodSet' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/MockMethodSet.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\MockTrait' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/MockTrait.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\MockType' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/MockType.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\NameAlreadyInUseException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/NameAlreadyInUseException.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\OriginalConstructorInvocationRequiredException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/OriginalConstructorInvocationRequiredException.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\ReflectionException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ReflectionException.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\RuntimeException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/RuntimeException.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\SoapExtensionNotAvailableException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/SoapExtensionNotAvailableException.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\TemplateLoader' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/TemplateLoader.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\UnknownClassException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/UnknownClassException.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\UnknownTraitException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/UnknownTraitException.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\UnknownTypeException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/UnknownTypeException.php', - 'PHPUnit\\Framework\\MockObject\\IncompatibleReturnValueException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/IncompatibleReturnValueException.php', - 'PHPUnit\\Framework\\MockObject\\Invocation' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Invocation.php', - 'PHPUnit\\Framework\\MockObject\\InvocationHandler' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/InvocationHandler.php', - 'PHPUnit\\Framework\\MockObject\\MatchBuilderNotFoundException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/MatchBuilderNotFoundException.php', - 'PHPUnit\\Framework\\MockObject\\Matcher' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Matcher.php', - 'PHPUnit\\Framework\\MockObject\\MatcherAlreadyRegisteredException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/MatcherAlreadyRegisteredException.php', - 'PHPUnit\\Framework\\MockObject\\Method' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/Method.php', - 'PHPUnit\\Framework\\MockObject\\MethodCannotBeConfiguredException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/MethodCannotBeConfiguredException.php', - 'PHPUnit\\Framework\\MockObject\\MethodNameAlreadyConfiguredException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/MethodNameAlreadyConfiguredException.php', - 'PHPUnit\\Framework\\MockObject\\MethodNameConstraint' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/MethodNameConstraint.php', - 'PHPUnit\\Framework\\MockObject\\MethodNameNotConfiguredException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/MethodNameNotConfiguredException.php', - 'PHPUnit\\Framework\\MockObject\\MethodParametersAlreadyConfiguredException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/MethodParametersAlreadyConfiguredException.php', - 'PHPUnit\\Framework\\MockObject\\MockBuilder' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php', - 'PHPUnit\\Framework\\MockObject\\MockObject' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/MockObject.php', - 'PHPUnit\\Framework\\MockObject\\MockObjectApi' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/MockObjectApi.php', - 'PHPUnit\\Framework\\MockObject\\MockObjectInternal' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/MockObjectInternal.php', - 'PHPUnit\\Framework\\MockObject\\NeverReturningMethodException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/NeverReturningMethodException.php', - 'PHPUnit\\Framework\\MockObject\\NoMoreReturnValuesConfiguredException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/NoMoreReturnValuesConfiguredException.php', - 'PHPUnit\\Framework\\MockObject\\ProxiedCloneMethod' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/ProxiedCloneMethod.php', - 'PHPUnit\\Framework\\MockObject\\ReturnValueGenerator' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/ReturnValueGenerator.php', - 'PHPUnit\\Framework\\MockObject\\ReturnValueNotConfiguredException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/ReturnValueNotConfiguredException.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\AnyInvokedCount' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/AnyInvokedCount.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\AnyParameters' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/AnyParameters.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\InvocationOrder' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvocationOrder.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtLeastCount' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedAtLeastCount.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtLeastOnce' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedAtLeastOnce.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtMostCount' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedAtMostCount.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedCount' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedCount.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\MethodName' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/MethodName.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\Parameters' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/Parameters.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\ParametersRule' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/ParametersRule.php', - 'PHPUnit\\Framework\\MockObject\\RuntimeException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/RuntimeException.php', - 'PHPUnit\\Framework\\MockObject\\Stub' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/Stub.php', - 'PHPUnit\\Framework\\MockObject\\StubApi' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/StubApi.php', - 'PHPUnit\\Framework\\MockObject\\StubInternal' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/StubInternal.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ConsecutiveCalls' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ConsecutiveCalls.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/Exception.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnArgument' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnArgument.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnCallback' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnCallback.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnReference' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnReference.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnSelf' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnSelf.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnStub' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnStub.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnValueMap' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnValueMap.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\Stub' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/Stub.php', - 'PHPUnit\\Framework\\NoChildTestSuiteException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/NoChildTestSuiteException.php', - 'PHPUnit\\Framework\\PhptAssertionFailedError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/PhptAssertionFailedError.php', - 'PHPUnit\\Framework\\ProcessIsolationException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/ProcessIsolationException.php', - 'PHPUnit\\Framework\\Reorderable' => $vendorDir . '/phpunit/phpunit/src/Framework/Reorderable.php', - 'PHPUnit\\Framework\\SelfDescribing' => $vendorDir . '/phpunit/phpunit/src/Framework/SelfDescribing.php', - 'PHPUnit\\Framework\\SkippedTest' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/Skipped/SkippedTest.php', - 'PHPUnit\\Framework\\SkippedTestSuiteError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/Skipped/SkippedTestSuiteError.php', - 'PHPUnit\\Framework\\SkippedWithMessageException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/Skipped/SkippedWithMessageException.php', - 'PHPUnit\\Framework\\Test' => $vendorDir . '/phpunit/phpunit/src/Framework/Test.php', - 'PHPUnit\\Framework\\TestBuilder' => $vendorDir . '/phpunit/phpunit/src/Framework/TestBuilder.php', - 'PHPUnit\\Framework\\TestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/TestCase.php', - 'PHPUnit\\Framework\\TestRunner' => $vendorDir . '/phpunit/phpunit/src/Framework/TestRunner.php', - 'PHPUnit\\Framework\\TestSize\\Known' => $vendorDir . '/phpunit/phpunit/src/Framework/TestSize/Known.php', - 'PHPUnit\\Framework\\TestSize\\Large' => $vendorDir . '/phpunit/phpunit/src/Framework/TestSize/Large.php', - 'PHPUnit\\Framework\\TestSize\\Medium' => $vendorDir . '/phpunit/phpunit/src/Framework/TestSize/Medium.php', - 'PHPUnit\\Framework\\TestSize\\Small' => $vendorDir . '/phpunit/phpunit/src/Framework/TestSize/Small.php', - 'PHPUnit\\Framework\\TestSize\\TestSize' => $vendorDir . '/phpunit/phpunit/src/Framework/TestSize/TestSize.php', - 'PHPUnit\\Framework\\TestSize\\Unknown' => $vendorDir . '/phpunit/phpunit/src/Framework/TestSize/Unknown.php', - 'PHPUnit\\Framework\\TestStatus\\Deprecation' => $vendorDir . '/phpunit/phpunit/src/Framework/TestStatus/Deprecation.php', - 'PHPUnit\\Framework\\TestStatus\\Error' => $vendorDir . '/phpunit/phpunit/src/Framework/TestStatus/Error.php', - 'PHPUnit\\Framework\\TestStatus\\Failure' => $vendorDir . '/phpunit/phpunit/src/Framework/TestStatus/Failure.php', - 'PHPUnit\\Framework\\TestStatus\\Incomplete' => $vendorDir . '/phpunit/phpunit/src/Framework/TestStatus/Incomplete.php', - 'PHPUnit\\Framework\\TestStatus\\Known' => $vendorDir . '/phpunit/phpunit/src/Framework/TestStatus/Known.php', - 'PHPUnit\\Framework\\TestStatus\\Notice' => $vendorDir . '/phpunit/phpunit/src/Framework/TestStatus/Notice.php', - 'PHPUnit\\Framework\\TestStatus\\Risky' => $vendorDir . '/phpunit/phpunit/src/Framework/TestStatus/Risky.php', - 'PHPUnit\\Framework\\TestStatus\\Skipped' => $vendorDir . '/phpunit/phpunit/src/Framework/TestStatus/Skipped.php', - 'PHPUnit\\Framework\\TestStatus\\Success' => $vendorDir . '/phpunit/phpunit/src/Framework/TestStatus/Success.php', - 'PHPUnit\\Framework\\TestStatus\\TestStatus' => $vendorDir . '/phpunit/phpunit/src/Framework/TestStatus/TestStatus.php', - 'PHPUnit\\Framework\\TestStatus\\Unknown' => $vendorDir . '/phpunit/phpunit/src/Framework/TestStatus/Unknown.php', - 'PHPUnit\\Framework\\TestStatus\\Warning' => $vendorDir . '/phpunit/phpunit/src/Framework/TestStatus/Warning.php', - 'PHPUnit\\Framework\\TestSuite' => $vendorDir . '/phpunit/phpunit/src/Framework/TestSuite.php', - 'PHPUnit\\Framework\\TestSuiteIterator' => $vendorDir . '/phpunit/phpunit/src/Framework/TestSuiteIterator.php', - 'PHPUnit\\Framework\\UnknownClassOrInterfaceException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/UnknownClassOrInterfaceException.php', - 'PHPUnit\\Framework\\UnknownTypeException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/UnknownTypeException.php', - 'PHPUnit\\Logging\\EventLogger' => $vendorDir . '/phpunit/phpunit/src/Logging/EventLogger.php', - 'PHPUnit\\Logging\\JUnit\\JunitXmlLogger' => $vendorDir . '/phpunit/phpunit/src/Logging/JUnit/JunitXmlLogger.php', - 'PHPUnit\\Logging\\JUnit\\Subscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/Subscriber.php', - 'PHPUnit\\Logging\\JUnit\\TestErroredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestErroredSubscriber.php', - 'PHPUnit\\Logging\\JUnit\\TestFailedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestFailedSubscriber.php', - 'PHPUnit\\Logging\\JUnit\\TestFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestFinishedSubscriber.php', - 'PHPUnit\\Logging\\JUnit\\TestMarkedIncompleteSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestMarkedIncompleteSubscriber.php', - 'PHPUnit\\Logging\\JUnit\\TestPreparationFailedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparationFailedSubscriber.php', - 'PHPUnit\\Logging\\JUnit\\TestPreparationStartedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparationStartedSubscriber.php', - 'PHPUnit\\Logging\\JUnit\\TestPreparedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparedSubscriber.php', - 'PHPUnit\\Logging\\JUnit\\TestPrintedUnexpectedOutputSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPrintedUnexpectedOutputSubscriber.php', - 'PHPUnit\\Logging\\JUnit\\TestRunnerExecutionFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestRunnerExecutionFinishedSubscriber.php', - 'PHPUnit\\Logging\\JUnit\\TestSkippedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestSkippedSubscriber.php', - 'PHPUnit\\Logging\\JUnit\\TestSuiteFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestSuiteFinishedSubscriber.php', - 'PHPUnit\\Logging\\JUnit\\TestSuiteStartedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestSuiteStartedSubscriber.php', - 'PHPUnit\\Logging\\TeamCity\\Subscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/Subscriber.php', - 'PHPUnit\\Logging\\TeamCity\\TeamCityLogger' => $vendorDir . '/phpunit/phpunit/src/Logging/TeamCity/TeamCityLogger.php', - 'PHPUnit\\Logging\\TeamCity\\TestConsideredRiskySubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestConsideredRiskySubscriber.php', - 'PHPUnit\\Logging\\TeamCity\\TestErroredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestErroredSubscriber.php', - 'PHPUnit\\Logging\\TeamCity\\TestFailedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestFailedSubscriber.php', - 'PHPUnit\\Logging\\TeamCity\\TestFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestFinishedSubscriber.php', - 'PHPUnit\\Logging\\TeamCity\\TestMarkedIncompleteSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestMarkedIncompleteSubscriber.php', - 'PHPUnit\\Logging\\TeamCity\\TestPreparedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestPreparedSubscriber.php', - 'PHPUnit\\Logging\\TeamCity\\TestRunnerExecutionFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestRunnerExecutionFinishedSubscriber.php', - 'PHPUnit\\Logging\\TeamCity\\TestSkippedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSkippedSubscriber.php', - 'PHPUnit\\Logging\\TeamCity\\TestSuiteBeforeFirstTestMethodErroredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteBeforeFirstTestMethodErroredSubscriber.php', - 'PHPUnit\\Logging\\TeamCity\\TestSuiteFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteFinishedSubscriber.php', - 'PHPUnit\\Logging\\TeamCity\\TestSuiteSkippedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteSkippedSubscriber.php', - 'PHPUnit\\Logging\\TeamCity\\TestSuiteStartedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteStartedSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\HtmlRenderer' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/HtmlRenderer.php', - 'PHPUnit\\Logging\\TestDox\\NamePrettifier' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/NamePrettifier.php', - 'PHPUnit\\Logging\\TestDox\\PlainTextRenderer' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/PlainTextRenderer.php', - 'PHPUnit\\Logging\\TestDox\\Subscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/Subscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestConsideredRiskySubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestConsideredRiskySubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestErroredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestErroredSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestFailedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestFailedSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestFinishedSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestMarkedIncompleteSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestMarkedIncompleteSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestPassedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestPassedSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestPreparedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestPreparedSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestResult' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResult.php', - 'PHPUnit\\Logging\\TestDox\\TestResultCollection' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollection.php', - 'PHPUnit\\Logging\\TestDox\\TestResultCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollectionIterator.php', - 'PHPUnit\\Logging\\TestDox\\TestResultCollector' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollector.php', - 'PHPUnit\\Logging\\TestDox\\TestSkippedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestSkippedSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestTriggeredDeprecationSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredDeprecationSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestTriggeredNoticeSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredNoticeSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestTriggeredPhpDeprecationSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpDeprecationSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestTriggeredPhpNoticeSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpNoticeSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestTriggeredPhpWarningSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpWarningSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestTriggeredPhpunitDeprecationSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpunitDeprecationSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestTriggeredPhpunitErrorSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpunitErrorSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestTriggeredPhpunitWarningSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpunitWarningSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestTriggeredWarningSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredWarningSubscriber.php', - 'PHPUnit\\Metadata\\After' => $vendorDir . '/phpunit/phpunit/src/Metadata/After.php', - 'PHPUnit\\Metadata\\AfterClass' => $vendorDir . '/phpunit/phpunit/src/Metadata/AfterClass.php', - 'PHPUnit\\Metadata\\Annotation\\Parser\\DocBlock' => $vendorDir . '/phpunit/phpunit/src/Metadata/Parser/Annotation/DocBlock.php', - 'PHPUnit\\Metadata\\Annotation\\Parser\\Registry' => $vendorDir . '/phpunit/phpunit/src/Metadata/Parser/Annotation/Registry.php', - 'PHPUnit\\Metadata\\AnnotationsAreNotSupportedForInternalClassesException' => $vendorDir . '/phpunit/phpunit/src/Metadata/Exception/AnnotationsAreNotSupportedForInternalClassesException.php', - 'PHPUnit\\Metadata\\Api\\CodeCoverage' => $vendorDir . '/phpunit/phpunit/src/Metadata/Api/CodeCoverage.php', - 'PHPUnit\\Metadata\\Api\\DataProvider' => $vendorDir . '/phpunit/phpunit/src/Metadata/Api/DataProvider.php', - 'PHPUnit\\Metadata\\Api\\Dependencies' => $vendorDir . '/phpunit/phpunit/src/Metadata/Api/Dependencies.php', - 'PHPUnit\\Metadata\\Api\\Groups' => $vendorDir . '/phpunit/phpunit/src/Metadata/Api/Groups.php', - 'PHPUnit\\Metadata\\Api\\HookMethods' => $vendorDir . '/phpunit/phpunit/src/Metadata/Api/HookMethods.php', - 'PHPUnit\\Metadata\\Api\\Requirements' => $vendorDir . '/phpunit/phpunit/src/Metadata/Api/Requirements.php', - 'PHPUnit\\Metadata\\BackupGlobals' => $vendorDir . '/phpunit/phpunit/src/Metadata/BackupGlobals.php', - 'PHPUnit\\Metadata\\BackupStaticProperties' => $vendorDir . '/phpunit/phpunit/src/Metadata/BackupStaticProperties.php', - 'PHPUnit\\Metadata\\Before' => $vendorDir . '/phpunit/phpunit/src/Metadata/Before.php', - 'PHPUnit\\Metadata\\BeforeClass' => $vendorDir . '/phpunit/phpunit/src/Metadata/BeforeClass.php', - 'PHPUnit\\Metadata\\Covers' => $vendorDir . '/phpunit/phpunit/src/Metadata/Covers.php', - 'PHPUnit\\Metadata\\CoversClass' => $vendorDir . '/phpunit/phpunit/src/Metadata/CoversClass.php', - 'PHPUnit\\Metadata\\CoversDefaultClass' => $vendorDir . '/phpunit/phpunit/src/Metadata/CoversDefaultClass.php', - 'PHPUnit\\Metadata\\CoversFunction' => $vendorDir . '/phpunit/phpunit/src/Metadata/CoversFunction.php', - 'PHPUnit\\Metadata\\CoversNothing' => $vendorDir . '/phpunit/phpunit/src/Metadata/CoversNothing.php', - 'PHPUnit\\Metadata\\DataProvider' => $vendorDir . '/phpunit/phpunit/src/Metadata/DataProvider.php', - 'PHPUnit\\Metadata\\DependsOnClass' => $vendorDir . '/phpunit/phpunit/src/Metadata/DependsOnClass.php', - 'PHPUnit\\Metadata\\DependsOnMethod' => $vendorDir . '/phpunit/phpunit/src/Metadata/DependsOnMethod.php', - 'PHPUnit\\Metadata\\DoesNotPerformAssertions' => $vendorDir . '/phpunit/phpunit/src/Metadata/DoesNotPerformAssertions.php', - 'PHPUnit\\Metadata\\Exception' => $vendorDir . '/phpunit/phpunit/src/Metadata/Exception/Exception.php', - 'PHPUnit\\Metadata\\ExcludeGlobalVariableFromBackup' => $vendorDir . '/phpunit/phpunit/src/Metadata/ExcludeGlobalVariableFromBackup.php', - 'PHPUnit\\Metadata\\ExcludeStaticPropertyFromBackup' => $vendorDir . '/phpunit/phpunit/src/Metadata/ExcludeStaticPropertyFromBackup.php', - 'PHPUnit\\Metadata\\Group' => $vendorDir . '/phpunit/phpunit/src/Metadata/Group.php', - 'PHPUnit\\Metadata\\IgnoreClassForCodeCoverage' => $vendorDir . '/phpunit/phpunit/src/Metadata/IgnoreClassForCodeCoverage.php', - 'PHPUnit\\Metadata\\IgnoreDeprecations' => $vendorDir . '/phpunit/phpunit/src/Metadata/IgnoreDeprecations.php', - 'PHPUnit\\Metadata\\IgnoreFunctionForCodeCoverage' => $vendorDir . '/phpunit/phpunit/src/Metadata/IgnoreFunctionForCodeCoverage.php', - 'PHPUnit\\Metadata\\IgnoreMethodForCodeCoverage' => $vendorDir . '/phpunit/phpunit/src/Metadata/IgnoreMethodForCodeCoverage.php', - 'PHPUnit\\Metadata\\InvalidAttributeException' => $vendorDir . '/phpunit/phpunit/src/Metadata/Exception/InvalidAttributeException.php', - 'PHPUnit\\Metadata\\InvalidVersionRequirementException' => $vendorDir . '/phpunit/phpunit/src/Metadata/Exception/InvalidVersionRequirementException.php', - 'PHPUnit\\Metadata\\Metadata' => $vendorDir . '/phpunit/phpunit/src/Metadata/Metadata.php', - 'PHPUnit\\Metadata\\MetadataCollection' => $vendorDir . '/phpunit/phpunit/src/Metadata/MetadataCollection.php', - 'PHPUnit\\Metadata\\MetadataCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/Metadata/MetadataCollectionIterator.php', - 'PHPUnit\\Metadata\\NoVersionRequirementException' => $vendorDir . '/phpunit/phpunit/src/Metadata/Exception/NoVersionRequirementException.php', - 'PHPUnit\\Metadata\\Parser\\AnnotationParser' => $vendorDir . '/phpunit/phpunit/src/Metadata/Parser/AnnotationParser.php', - 'PHPUnit\\Metadata\\Parser\\AttributeParser' => $vendorDir . '/phpunit/phpunit/src/Metadata/Parser/AttributeParser.php', - 'PHPUnit\\Metadata\\Parser\\CachingParser' => $vendorDir . '/phpunit/phpunit/src/Metadata/Parser/CachingParser.php', - 'PHPUnit\\Metadata\\Parser\\Parser' => $vendorDir . '/phpunit/phpunit/src/Metadata/Parser/Parser.php', - 'PHPUnit\\Metadata\\Parser\\ParserChain' => $vendorDir . '/phpunit/phpunit/src/Metadata/Parser/ParserChain.php', - 'PHPUnit\\Metadata\\Parser\\Registry' => $vendorDir . '/phpunit/phpunit/src/Metadata/Parser/Registry.php', - 'PHPUnit\\Metadata\\PostCondition' => $vendorDir . '/phpunit/phpunit/src/Metadata/PostCondition.php', - 'PHPUnit\\Metadata\\PreCondition' => $vendorDir . '/phpunit/phpunit/src/Metadata/PreCondition.php', - 'PHPUnit\\Metadata\\PreserveGlobalState' => $vendorDir . '/phpunit/phpunit/src/Metadata/PreserveGlobalState.php', - 'PHPUnit\\Metadata\\ReflectionException' => $vendorDir . '/phpunit/phpunit/src/Metadata/Exception/ReflectionException.php', - 'PHPUnit\\Metadata\\RequiresFunction' => $vendorDir . '/phpunit/phpunit/src/Metadata/RequiresFunction.php', - 'PHPUnit\\Metadata\\RequiresMethod' => $vendorDir . '/phpunit/phpunit/src/Metadata/RequiresMethod.php', - 'PHPUnit\\Metadata\\RequiresOperatingSystem' => $vendorDir . '/phpunit/phpunit/src/Metadata/RequiresOperatingSystem.php', - 'PHPUnit\\Metadata\\RequiresOperatingSystemFamily' => $vendorDir . '/phpunit/phpunit/src/Metadata/RequiresOperatingSystemFamily.php', - 'PHPUnit\\Metadata\\RequiresPhp' => $vendorDir . '/phpunit/phpunit/src/Metadata/RequiresPhp.php', - 'PHPUnit\\Metadata\\RequiresPhpExtension' => $vendorDir . '/phpunit/phpunit/src/Metadata/RequiresPhpExtension.php', - 'PHPUnit\\Metadata\\RequiresPhpunit' => $vendorDir . '/phpunit/phpunit/src/Metadata/RequiresPhpunit.php', - 'PHPUnit\\Metadata\\RequiresSetting' => $vendorDir . '/phpunit/phpunit/src/Metadata/RequiresSetting.php', - 'PHPUnit\\Metadata\\RunClassInSeparateProcess' => $vendorDir . '/phpunit/phpunit/src/Metadata/RunClassInSeparateProcess.php', - 'PHPUnit\\Metadata\\RunInSeparateProcess' => $vendorDir . '/phpunit/phpunit/src/Metadata/RunInSeparateProcess.php', - 'PHPUnit\\Metadata\\RunTestsInSeparateProcesses' => $vendorDir . '/phpunit/phpunit/src/Metadata/RunTestsInSeparateProcesses.php', - 'PHPUnit\\Metadata\\Test' => $vendorDir . '/phpunit/phpunit/src/Metadata/Test.php', - 'PHPUnit\\Metadata\\TestDox' => $vendorDir . '/phpunit/phpunit/src/Metadata/TestDox.php', - 'PHPUnit\\Metadata\\TestWith' => $vendorDir . '/phpunit/phpunit/src/Metadata/TestWith.php', - 'PHPUnit\\Metadata\\Uses' => $vendorDir . '/phpunit/phpunit/src/Metadata/Uses.php', - 'PHPUnit\\Metadata\\UsesClass' => $vendorDir . '/phpunit/phpunit/src/Metadata/UsesClass.php', - 'PHPUnit\\Metadata\\UsesDefaultClass' => $vendorDir . '/phpunit/phpunit/src/Metadata/UsesDefaultClass.php', - 'PHPUnit\\Metadata\\UsesFunction' => $vendorDir . '/phpunit/phpunit/src/Metadata/UsesFunction.php', - 'PHPUnit\\Metadata\\Version\\ComparisonRequirement' => $vendorDir . '/phpunit/phpunit/src/Metadata/Version/ComparisonRequirement.php', - 'PHPUnit\\Metadata\\Version\\ConstraintRequirement' => $vendorDir . '/phpunit/phpunit/src/Metadata/Version/ConstraintRequirement.php', - 'PHPUnit\\Metadata\\Version\\Requirement' => $vendorDir . '/phpunit/phpunit/src/Metadata/Version/Requirement.php', - 'PHPUnit\\Metadata\\WithoutErrorHandler' => $vendorDir . '/phpunit/phpunit/src/Metadata/WithoutErrorHandler.php', - 'PHPUnit\\Runner\\Baseline\\Baseline' => $vendorDir . '/phpunit/phpunit/src/Runner/Baseline/Baseline.php', - 'PHPUnit\\Runner\\Baseline\\CannotLoadBaselineException' => $vendorDir . '/phpunit/phpunit/src/Runner/Baseline/Exception/CannotLoadBaselineException.php', - 'PHPUnit\\Runner\\Baseline\\FileDoesNotHaveLineException' => $vendorDir . '/phpunit/phpunit/src/Runner/Baseline/Exception/FileDoesNotHaveLineException.php', - 'PHPUnit\\Runner\\Baseline\\Generator' => $vendorDir . '/phpunit/phpunit/src/Runner/Baseline/Generator.php', - 'PHPUnit\\Runner\\Baseline\\Issue' => $vendorDir . '/phpunit/phpunit/src/Runner/Baseline/Issue.php', - 'PHPUnit\\Runner\\Baseline\\Reader' => $vendorDir . '/phpunit/phpunit/src/Runner/Baseline/Reader.php', - 'PHPUnit\\Runner\\Baseline\\RelativePathCalculator' => $vendorDir . '/phpunit/phpunit/src/Runner/Baseline/RelativePathCalculator.php', - 'PHPUnit\\Runner\\Baseline\\Subscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/Baseline/Subscriber/Subscriber.php', - 'PHPUnit\\Runner\\Baseline\\TestTriggeredDeprecationSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredDeprecationSubscriber.php', - 'PHPUnit\\Runner\\Baseline\\TestTriggeredNoticeSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredNoticeSubscriber.php', - 'PHPUnit\\Runner\\Baseline\\TestTriggeredPhpDeprecationSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredPhpDeprecationSubscriber.php', - 'PHPUnit\\Runner\\Baseline\\TestTriggeredPhpNoticeSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredPhpNoticeSubscriber.php', - 'PHPUnit\\Runner\\Baseline\\TestTriggeredPhpWarningSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredPhpWarningSubscriber.php', - 'PHPUnit\\Runner\\Baseline\\TestTriggeredWarningSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredWarningSubscriber.php', - 'PHPUnit\\Runner\\Baseline\\Writer' => $vendorDir . '/phpunit/phpunit/src/Runner/Baseline/Writer.php', - 'PHPUnit\\Runner\\ClassCannotBeFoundException' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception/ClassCannotBeFoundException.php', - 'PHPUnit\\Runner\\ClassDoesNotExtendTestCaseException' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception/ClassDoesNotExtendTestCaseException.php', - 'PHPUnit\\Runner\\ClassIsAbstractException' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception/ClassIsAbstractException.php', - 'PHPUnit\\Runner\\CodeCoverage' => $vendorDir . '/phpunit/phpunit/src/Runner/CodeCoverage.php', - 'PHPUnit\\Runner\\CodeCoverageFileExistsException' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception/CodeCoverageFileExistsException.php', - 'PHPUnit\\Runner\\DirectoryDoesNotExistException' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception/DirectoryDoesNotExistException.php', - 'PHPUnit\\Runner\\ErrorException' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception/ErrorException.php', - 'PHPUnit\\Runner\\ErrorHandler' => $vendorDir . '/phpunit/phpunit/src/Runner/ErrorHandler.php', - 'PHPUnit\\Runner\\Exception' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception/Exception.php', - 'PHPUnit\\Runner\\Extension\\Extension' => $vendorDir . '/phpunit/phpunit/src/Runner/Extension/Extension.php', - 'PHPUnit\\Runner\\Extension\\ExtensionBootstrapper' => $vendorDir . '/phpunit/phpunit/src/Runner/Extension/ExtensionBootstrapper.php', - 'PHPUnit\\Runner\\Extension\\Facade' => $vendorDir . '/phpunit/phpunit/src/Runner/Extension/Facade.php', - 'PHPUnit\\Runner\\Extension\\ParameterCollection' => $vendorDir . '/phpunit/phpunit/src/Runner/Extension/ParameterCollection.php', - 'PHPUnit\\Runner\\Extension\\PharLoader' => $vendorDir . '/phpunit/phpunit/src/Runner/Extension/PharLoader.php', - 'PHPUnit\\Runner\\FileDoesNotExistException' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception/FileDoesNotExistException.php', - 'PHPUnit\\Runner\\Filter\\ExcludeGroupFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/ExcludeGroupFilterIterator.php', - 'PHPUnit\\Runner\\Filter\\Factory' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Factory.php', - 'PHPUnit\\Runner\\Filter\\GroupFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.php', - 'PHPUnit\\Runner\\Filter\\IncludeGroupFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/IncludeGroupFilterIterator.php', - 'PHPUnit\\Runner\\Filter\\NameFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.php', - 'PHPUnit\\Runner\\Filter\\TestIdFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/TestIdFilterIterator.php', - 'PHPUnit\\Runner\\GarbageCollection\\ExecutionFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/ExecutionFinishedSubscriber.php', - 'PHPUnit\\Runner\\GarbageCollection\\ExecutionStartedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/ExecutionStartedSubscriber.php', - 'PHPUnit\\Runner\\GarbageCollection\\GarbageCollectionHandler' => $vendorDir . '/phpunit/phpunit/src/Runner/GarbageCollection/GarbageCollectionHandler.php', - 'PHPUnit\\Runner\\GarbageCollection\\Subscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/Subscriber.php', - 'PHPUnit\\Runner\\GarbageCollection\\TestFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/TestFinishedSubscriber.php', - 'PHPUnit\\Runner\\InvalidOrderException' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception/InvalidOrderException.php', - 'PHPUnit\\Runner\\InvalidPhptFileException' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception/InvalidPhptFileException.php', - 'PHPUnit\\Runner\\ParameterDoesNotExistException' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception/ParameterDoesNotExistException.php', - 'PHPUnit\\Runner\\PhptExternalFileCannotBeLoadedException' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception/PhptExternalFileCannotBeLoadedException.php', - 'PHPUnit\\Runner\\PhptTestCase' => $vendorDir . '/phpunit/phpunit/src/Runner/PhptTestCase.php', - 'PHPUnit\\Runner\\ResultCache\\DefaultResultCache' => $vendorDir . '/phpunit/phpunit/src/Runner/ResultCache/DefaultResultCache.php', - 'PHPUnit\\Runner\\ResultCache\\NullResultCache' => $vendorDir . '/phpunit/phpunit/src/Runner/ResultCache/NullResultCache.php', - 'PHPUnit\\Runner\\ResultCache\\ResultCache' => $vendorDir . '/phpunit/phpunit/src/Runner/ResultCache/ResultCache.php', - 'PHPUnit\\Runner\\ResultCache\\ResultCacheHandler' => $vendorDir . '/phpunit/phpunit/src/Runner/ResultCache/ResultCacheHandler.php', - 'PHPUnit\\Runner\\ResultCache\\Subscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/Subscriber.php', - 'PHPUnit\\Runner\\ResultCache\\TestConsideredRiskySubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestConsideredRiskySubscriber.php', - 'PHPUnit\\Runner\\ResultCache\\TestErroredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestErroredSubscriber.php', - 'PHPUnit\\Runner\\ResultCache\\TestFailedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestFailedSubscriber.php', - 'PHPUnit\\Runner\\ResultCache\\TestFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestFinishedSubscriber.php', - 'PHPUnit\\Runner\\ResultCache\\TestMarkedIncompleteSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestMarkedIncompleteSubscriber.php', - 'PHPUnit\\Runner\\ResultCache\\TestPreparedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestPreparedSubscriber.php', - 'PHPUnit\\Runner\\ResultCache\\TestSkippedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestSkippedSubscriber.php', - 'PHPUnit\\Runner\\ResultCache\\TestSuiteFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestSuiteFinishedSubscriber.php', - 'PHPUnit\\Runner\\ResultCache\\TestSuiteStartedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestSuiteStartedSubscriber.php', - 'PHPUnit\\Runner\\TestSuiteLoader' => $vendorDir . '/phpunit/phpunit/src/Runner/TestSuiteLoader.php', - 'PHPUnit\\Runner\\TestSuiteSorter' => $vendorDir . '/phpunit/phpunit/src/Runner/TestSuiteSorter.php', - 'PHPUnit\\Runner\\UnsupportedPhptSectionException' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception/UnsupportedPhptSectionException.php', - 'PHPUnit\\Runner\\Version' => $vendorDir . '/phpunit/phpunit/src/Runner/Version.php', - 'PHPUnit\\TestRunner\\TestResult\\AfterTestClassMethodErroredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/AfterTestClassMethodErroredSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\BeforeTestClassMethodErroredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/BeforeTestClassMethodErroredSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\Collector' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Collector.php', - 'PHPUnit\\TestRunner\\TestResult\\ExecutionStartedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/ExecutionStartedSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\Facade' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Facade.php', - 'PHPUnit\\TestRunner\\TestResult\\Issues\\Issue' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Issue.php', - 'PHPUnit\\TestRunner\\TestResult\\PassedTests' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/PassedTests.php', - 'PHPUnit\\TestRunner\\TestResult\\Subscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/Subscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestConsideredRiskySubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestConsideredRiskySubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestErroredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestErroredSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestFailedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestFailedSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestFinishedSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestMarkedIncompleteSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestMarkedIncompleteSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestPreparedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestPreparedSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestResult' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/TestResult.php', - 'PHPUnit\\TestRunner\\TestResult\\TestRunnerTriggeredDeprecationSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestRunnerTriggeredDeprecationSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestRunnerTriggeredWarningSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestRunnerTriggeredWarningSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestSkippedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSkippedSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestSuiteFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSuiteFinishedSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestSuiteSkippedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSuiteSkippedSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestSuiteStartedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSuiteStartedSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredDeprecationSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredDeprecationSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredErrorSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredErrorSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredNoticeSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredNoticeSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredPhpDeprecationSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpDeprecationSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredPhpNoticeSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpNoticeSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredPhpWarningSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpWarningSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredPhpunitDeprecationSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpunitDeprecationSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredPhpunitErrorSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpunitErrorSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredPhpunitWarningSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpunitWarningSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredWarningSubscriber' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredWarningSubscriber.php', - 'PHPUnit\\TextUI\\Application' => $vendorDir . '/phpunit/phpunit/src/TextUI/Application.php', - 'PHPUnit\\TextUI\\CannotOpenSocketException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Exception/CannotOpenSocketException.php', - 'PHPUnit\\TextUI\\CliArguments\\Builder' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Cli/Builder.php', - 'PHPUnit\\TextUI\\CliArguments\\Configuration' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Cli/Configuration.php', - 'PHPUnit\\TextUI\\CliArguments\\Exception' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Cli/Exception.php', - 'PHPUnit\\TextUI\\CliArguments\\XmlConfigurationFileFinder' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Cli/XmlConfigurationFileFinder.php', - 'PHPUnit\\TextUI\\Command\\AtLeastVersionCommand' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command/Commands/AtLeastVersionCommand.php', - 'PHPUnit\\TextUI\\Command\\CheckPhpConfigurationCommand' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command/Commands/CheckPhpConfigurationCommand.php', - 'PHPUnit\\TextUI\\Command\\Command' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command/Command.php', - 'PHPUnit\\TextUI\\Command\\GenerateConfigurationCommand' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command/Commands/GenerateConfigurationCommand.php', - 'PHPUnit\\TextUI\\Command\\ListGroupsCommand' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command/Commands/ListGroupsCommand.php', - 'PHPUnit\\TextUI\\Command\\ListTestSuitesCommand' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command/Commands/ListTestSuitesCommand.php', - 'PHPUnit\\TextUI\\Command\\ListTestsAsTextCommand' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command/Commands/ListTestsAsTextCommand.php', - 'PHPUnit\\TextUI\\Command\\ListTestsAsXmlCommand' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command/Commands/ListTestsAsXmlCommand.php', - 'PHPUnit\\TextUI\\Command\\MigrateConfigurationCommand' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command/Commands/MigrateConfigurationCommand.php', - 'PHPUnit\\TextUI\\Command\\Result' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command/Result.php', - 'PHPUnit\\TextUI\\Command\\ShowHelpCommand' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command/Commands/ShowHelpCommand.php', - 'PHPUnit\\TextUI\\Command\\ShowVersionCommand' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command/Commands/ShowVersionCommand.php', - 'PHPUnit\\TextUI\\Command\\VersionCheckCommand' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command/Commands/VersionCheckCommand.php', - 'PHPUnit\\TextUI\\Command\\WarmCodeCoverageCacheCommand' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command/Commands/WarmCodeCoverageCacheCommand.php', - 'PHPUnit\\TextUI\\Configuration\\Builder' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Builder.php', - 'PHPUnit\\TextUI\\Configuration\\CodeCoverageFilterRegistry' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/CodeCoverageFilterRegistry.php', - 'PHPUnit\\TextUI\\Configuration\\CodeCoverageReportNotConfiguredException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Exception/CodeCoverageReportNotConfiguredException.php', - 'PHPUnit\\TextUI\\Configuration\\Configuration' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Configuration.php', - 'PHPUnit\\TextUI\\Configuration\\ConfigurationCannotBeBuiltException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Exception/ConfigurationCannotBeBuiltException.php', - 'PHPUnit\\TextUI\\Configuration\\Constant' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/Constant.php', - 'PHPUnit\\TextUI\\Configuration\\ConstantCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/ConstantCollection.php', - 'PHPUnit\\TextUI\\Configuration\\ConstantCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/ConstantCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\Directory' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/Directory.php', - 'PHPUnit\\TextUI\\Configuration\\DirectoryCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/DirectoryCollection.php', - 'PHPUnit\\TextUI\\Configuration\\DirectoryCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/DirectoryCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\Exception' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Exception/Exception.php', - 'PHPUnit\\TextUI\\Configuration\\ExtensionBootstrap' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/ExtensionBootstrap.php', - 'PHPUnit\\TextUI\\Configuration\\ExtensionBootstrapCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/ExtensionBootstrapCollection.php', - 'PHPUnit\\TextUI\\Configuration\\ExtensionBootstrapCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/ExtensionBootstrapCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\File' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/File.php', - 'PHPUnit\\TextUI\\Configuration\\FileCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/FileCollection.php', - 'PHPUnit\\TextUI\\Configuration\\FileCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/FileCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\FilterDirectory' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/FilterDirectory.php', - 'PHPUnit\\TextUI\\Configuration\\FilterDirectoryCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/FilterDirectoryCollection.php', - 'PHPUnit\\TextUI\\Configuration\\FilterDirectoryCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/FilterDirectoryCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\FilterNotConfiguredException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Exception/FilterNotConfiguredException.php', - 'PHPUnit\\TextUI\\Configuration\\Group' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/Group.php', - 'PHPUnit\\TextUI\\Configuration\\GroupCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/GroupCollection.php', - 'PHPUnit\\TextUI\\Configuration\\GroupCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/GroupCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\IniSetting' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/IniSetting.php', - 'PHPUnit\\TextUI\\Configuration\\IniSettingCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/IniSettingCollection.php', - 'PHPUnit\\TextUI\\Configuration\\IniSettingCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/IniSettingCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\LoggingNotConfiguredException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Exception/LoggingNotConfiguredException.php', - 'PHPUnit\\TextUI\\Configuration\\Merger' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Merger.php', - 'PHPUnit\\TextUI\\Configuration\\NoBaselineException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Exception/NoBaselineException.php', - 'PHPUnit\\TextUI\\Configuration\\NoBootstrapException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Exception/NoBootstrapException.php', - 'PHPUnit\\TextUI\\Configuration\\NoCacheDirectoryException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCacheDirectoryException.php', - 'PHPUnit\\TextUI\\Configuration\\NoCliArgumentException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCliArgumentException.php', - 'PHPUnit\\TextUI\\Configuration\\NoConfigurationFileException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Exception/NoConfigurationFileException.php', - 'PHPUnit\\TextUI\\Configuration\\NoCoverageCacheDirectoryException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCoverageCacheDirectoryException.php', - 'PHPUnit\\TextUI\\Configuration\\NoCustomCssFileException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCustomCssFileException.php', - 'PHPUnit\\TextUI\\Configuration\\NoDefaultTestSuiteException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Exception/NoDefaultTestSuiteException.php', - 'PHPUnit\\TextUI\\Configuration\\NoPharExtensionDirectoryException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Exception/NoPharExtensionDirectoryException.php', - 'PHPUnit\\TextUI\\Configuration\\Php' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/Php.php', - 'PHPUnit\\TextUI\\Configuration\\PhpHandler' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/PhpHandler.php', - 'PHPUnit\\TextUI\\Configuration\\Registry' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Registry.php', - 'PHPUnit\\TextUI\\Configuration\\Source' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/Source.php', - 'PHPUnit\\TextUI\\Configuration\\SourceFilter' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/SourceFilter.php', - 'PHPUnit\\TextUI\\Configuration\\SourceMapper' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/SourceMapper.php', - 'PHPUnit\\TextUI\\Configuration\\TestDirectory' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/TestDirectory.php', - 'PHPUnit\\TextUI\\Configuration\\TestDirectoryCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/TestDirectoryCollection.php', - 'PHPUnit\\TextUI\\Configuration\\TestDirectoryCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/TestDirectoryCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\TestFile' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/TestFile.php', - 'PHPUnit\\TextUI\\Configuration\\TestFileCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/TestFileCollection.php', - 'PHPUnit\\TextUI\\Configuration\\TestFileCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/TestFileCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\TestSuite' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/TestSuite.php', - 'PHPUnit\\TextUI\\Configuration\\TestSuiteBuilder' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/TestSuiteBuilder.php', - 'PHPUnit\\TextUI\\Configuration\\TestSuiteCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/TestSuiteCollection.php', - 'PHPUnit\\TextUI\\Configuration\\TestSuiteCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/TestSuiteCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\Variable' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/Variable.php', - 'PHPUnit\\TextUI\\Configuration\\VariableCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/VariableCollection.php', - 'PHPUnit\\TextUI\\Configuration\\VariableCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Value/VariableCollectionIterator.php', - 'PHPUnit\\TextUI\\Exception' => $vendorDir . '/phpunit/phpunit/src/TextUI/Exception/Exception.php', - 'PHPUnit\\TextUI\\Help' => $vendorDir . '/phpunit/phpunit/src/TextUI/Help.php', - 'PHPUnit\\TextUI\\InvalidSocketException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Exception/InvalidSocketException.php', - 'PHPUnit\\TextUI\\Output\\DefaultPrinter' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Printer/DefaultPrinter.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\BeforeTestClassMethodErroredSubscriber' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/BeforeTestClassMethodErroredSubscriber.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\ProgressPrinter' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/ProgressPrinter.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\Subscriber' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/Subscriber.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestConsideredRiskySubscriber' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestConsideredRiskySubscriber.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestErroredSubscriber' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestErroredSubscriber.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestFailedSubscriber' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestFailedSubscriber.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestFinishedSubscriber.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestMarkedIncompleteSubscriber' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestMarkedIncompleteSubscriber.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestPreparedSubscriber' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestPreparedSubscriber.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestRunnerExecutionStartedSubscriber' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestRunnerExecutionStartedSubscriber.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestSkippedSubscriber' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestSkippedSubscriber.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestTriggeredDeprecationSubscriber' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredDeprecationSubscriber.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestTriggeredErrorSubscriber' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredErrorSubscriber.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestTriggeredNoticeSubscriber' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredNoticeSubscriber.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestTriggeredPhpDeprecationSubscriber' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpDeprecationSubscriber.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestTriggeredPhpNoticeSubscriber' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpNoticeSubscriber.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestTriggeredPhpWarningSubscriber' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpWarningSubscriber.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestTriggeredPhpunitDeprecationSubscriber' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpunitDeprecationSubscriber.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestTriggeredPhpunitWarningSubscriber' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpunitWarningSubscriber.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestTriggeredWarningSubscriber' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredWarningSubscriber.php', - 'PHPUnit\\TextUI\\Output\\Default\\ResultPrinter' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/ResultPrinter.php', - 'PHPUnit\\TextUI\\Output\\Default\\UnexpectedOutputPrinter' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Default/UnexpectedOutputPrinter.php', - 'PHPUnit\\TextUI\\Output\\Facade' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Facade.php', - 'PHPUnit\\TextUI\\Output\\NullPrinter' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Printer/NullPrinter.php', - 'PHPUnit\\TextUI\\Output\\Printer' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/Printer/Printer.php', - 'PHPUnit\\TextUI\\Output\\SummaryPrinter' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/SummaryPrinter.php', - 'PHPUnit\\TextUI\\Output\\TestDox\\ResultPrinter' => $vendorDir . '/phpunit/phpunit/src/TextUI/Output/TestDox/ResultPrinter.php', - 'PHPUnit\\TextUI\\RuntimeException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Exception/RuntimeException.php', - 'PHPUnit\\TextUI\\ShellExitCodeCalculator' => $vendorDir . '/phpunit/phpunit/src/TextUI/ShellExitCodeCalculator.php', - 'PHPUnit\\TextUI\\TestDirectoryNotFoundException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Exception/TestDirectoryNotFoundException.php', - 'PHPUnit\\TextUI\\TestFileNotFoundException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Exception/TestFileNotFoundException.php', - 'PHPUnit\\TextUI\\TestRunner' => $vendorDir . '/phpunit/phpunit/src/TextUI/TestRunner.php', - 'PHPUnit\\TextUI\\TestSuiteFilterProcessor' => $vendorDir . '/phpunit/phpunit/src/TextUI/TestSuiteFilterProcessor.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\CannotFindSchemaException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Exception/CannotFindSchemaException.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\CodeCoverage' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/CodeCoverage.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Clover' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Clover.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Cobertura' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Cobertura.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Crap4j' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Crap4j.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Html' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Html.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Php' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Php.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Text' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Text.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Xml' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Xml.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\Configuration' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Configuration.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\ConvertLogTypes' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/ConvertLogTypes.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\CoverageCloverToReport' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageCloverToReport.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\CoverageCrap4jToReport' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageCrap4jToReport.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\CoverageHtmlToReport' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageHtmlToReport.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\CoveragePhpToReport' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoveragePhpToReport.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\CoverageTextToReport' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageTextToReport.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\CoverageXmlToReport' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageXmlToReport.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\DefaultConfiguration' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/DefaultConfiguration.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\Exception' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Exception.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\FailedSchemaDetectionResult' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/FailedSchemaDetectionResult.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\Generator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Generator.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\Groups' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Groups.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\IntroduceCacheDirectoryAttribute' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/IntroduceCacheDirectoryAttribute.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\IntroduceCoverageElement' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/IntroduceCoverageElement.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\LoadedFromFileConfiguration' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/LoadedFromFileConfiguration.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\Loader' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Loader.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\LogToReportMigration' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/LogToReportMigration.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\Logging\\Junit' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/Junit.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\Logging\\Logging' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/Logging.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\Logging\\TeamCity' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/TeamCity.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\Logging\\TestDox\\Html' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/TestDox/Html.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\Logging\\TestDox\\Text' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/TestDox/Text.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\Migration' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/Migration.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\MigrationBuilder' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/MigrationBuilder.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\MigrationException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/MigrationException.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\Migrator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrator.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\MoveAttributesFromFilterWhitelistToCoverage' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveAttributesFromFilterWhitelistToCoverage.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\MoveAttributesFromRootToCoverage' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveAttributesFromRootToCoverage.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\MoveCoverageDirectoriesToSource' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveCoverageDirectoriesToSource.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\MoveWhitelistExcludesToCoverage' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveWhitelistExcludesToCoverage.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\MoveWhitelistIncludesToCoverage' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveWhitelistIncludesToCoverage.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\PHPUnit' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/PHPUnit.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveBeStrictAboutResourceUsageDuringSmallTestsAttribute' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveBeStrictAboutResourceUsageDuringSmallTestsAttribute.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveBeStrictAboutTodoAnnotatedTestsAttribute' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveBeStrictAboutTodoAnnotatedTestsAttribute.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveCacheResultFileAttribute' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCacheResultFileAttribute.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveCacheTokensAttribute' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCacheTokensAttribute.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveConversionToExceptionsAttributes' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveConversionToExceptionsAttributes.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveCoverageElementCacheDirectoryAttribute' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCoverageElementCacheDirectoryAttribute.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveCoverageElementProcessUncoveredFilesAttribute' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCoverageElementProcessUncoveredFilesAttribute.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveEmptyFilter' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveEmptyFilter.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveListeners' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveListeners.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveLogTypes' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveLogTypes.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveLoggingElements' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveLoggingElements.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveNoInteractionAttribute' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveNoInteractionAttribute.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\RemovePrinterAttributes' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemovePrinterAttributes.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveTestDoxGroupsElement' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveTestDoxGroupsElement.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveTestSuiteLoaderAttributes' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveTestSuiteLoaderAttributes.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveVerboseAttribute' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveVerboseAttribute.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\RenameBackupStaticAttributesAttribute' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RenameBackupStaticAttributesAttribute.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\RenameBeStrictAboutCoversAnnotationAttribute' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RenameBeStrictAboutCoversAnnotationAttribute.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\RenameForceCoversAnnotationAttribute' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RenameForceCoversAnnotationAttribute.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\SchemaDetectionResult' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/SchemaDetectionResult.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\SchemaDetector' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/SchemaDetector.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\SchemaFinder' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaFinder.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\SnapshotNodeList' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/SnapshotNodeList.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\SuccessfulSchemaDetectionResult' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/SuccessfulSchemaDetectionResult.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\TestSuiteMapper' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/TestSuiteMapper.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\UpdateSchemaLocation' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/UpdateSchemaLocation.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\ValidationResult' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Validator/ValidationResult.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\Validator' => $vendorDir . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Validator/Validator.php', - 'PHPUnit\\Util\\Cloner' => $vendorDir . '/phpunit/phpunit/src/Util/Cloner.php', - 'PHPUnit\\Util\\Color' => $vendorDir . '/phpunit/phpunit/src/Util/Color.php', - 'PHPUnit\\Util\\Exception' => $vendorDir . '/phpunit/phpunit/src/Util/Exception/Exception.php', - 'PHPUnit\\Util\\ExcludeList' => $vendorDir . '/phpunit/phpunit/src/Util/ExcludeList.php', - 'PHPUnit\\Util\\Exporter' => $vendorDir . '/phpunit/phpunit/src/Util/Exporter.php', - 'PHPUnit\\Util\\Filesystem' => $vendorDir . '/phpunit/phpunit/src/Util/Filesystem.php', - 'PHPUnit\\Util\\Filter' => $vendorDir . '/phpunit/phpunit/src/Util/Filter.php', - 'PHPUnit\\Util\\GlobalState' => $vendorDir . '/phpunit/phpunit/src/Util/GlobalState.php', - 'PHPUnit\\Util\\Http\\Downloader' => $vendorDir . '/phpunit/phpunit/src/Util/Http/Downloader.php', - 'PHPUnit\\Util\\Http\\PhpDownloader' => $vendorDir . '/phpunit/phpunit/src/Util/Http/PhpDownloader.php', - 'PHPUnit\\Util\\InvalidDirectoryException' => $vendorDir . '/phpunit/phpunit/src/Util/Exception/InvalidDirectoryException.php', - 'PHPUnit\\Util\\InvalidJsonException' => $vendorDir . '/phpunit/phpunit/src/Util/Exception/InvalidJsonException.php', - 'PHPUnit\\Util\\InvalidVersionOperatorException' => $vendorDir . '/phpunit/phpunit/src/Util/Exception/InvalidVersionOperatorException.php', - 'PHPUnit\\Util\\Json' => $vendorDir . '/phpunit/phpunit/src/Util/Json.php', - 'PHPUnit\\Util\\PHP\\AbstractPhpProcess' => $vendorDir . '/phpunit/phpunit/src/Util/PHP/AbstractPhpProcess.php', - 'PHPUnit\\Util\\PHP\\DefaultPhpProcess' => $vendorDir . '/phpunit/phpunit/src/Util/PHP/DefaultPhpProcess.php', - 'PHPUnit\\Util\\PHP\\PhpProcessException' => $vendorDir . '/phpunit/phpunit/src/Util/Exception/PhpProcessException.php', - 'PHPUnit\\Util\\Reflection' => $vendorDir . '/phpunit/phpunit/src/Util/Reflection.php', - 'PHPUnit\\Util\\Test' => $vendorDir . '/phpunit/phpunit/src/Util/Test.php', - 'PHPUnit\\Util\\ThrowableToStringMapper' => $vendorDir . '/phpunit/phpunit/src/Util/ThrowableToStringMapper.php', - 'PHPUnit\\Util\\VersionComparisonOperator' => $vendorDir . '/phpunit/phpunit/src/Util/VersionComparisonOperator.php', - 'PHPUnit\\Util\\Xml' => $vendorDir . '/phpunit/phpunit/src/Util/Xml/Xml.php', - 'PHPUnit\\Util\\Xml\\Loader' => $vendorDir . '/phpunit/phpunit/src/Util/Xml/Loader.php', - 'PHPUnit\\Util\\Xml\\XmlException' => $vendorDir . '/phpunit/phpunit/src/Util/Exception/XmlException.php', - 'PharIo\\Manifest\\Application' => $vendorDir . '/phar-io/manifest/src/values/Application.php', - 'PharIo\\Manifest\\ApplicationName' => $vendorDir . '/phar-io/manifest/src/values/ApplicationName.php', - 'PharIo\\Manifest\\Author' => $vendorDir . '/phar-io/manifest/src/values/Author.php', - 'PharIo\\Manifest\\AuthorCollection' => $vendorDir . '/phar-io/manifest/src/values/AuthorCollection.php', - 'PharIo\\Manifest\\AuthorCollectionIterator' => $vendorDir . '/phar-io/manifest/src/values/AuthorCollectionIterator.php', - 'PharIo\\Manifest\\AuthorElement' => $vendorDir . '/phar-io/manifest/src/xml/AuthorElement.php', - 'PharIo\\Manifest\\AuthorElementCollection' => $vendorDir . '/phar-io/manifest/src/xml/AuthorElementCollection.php', - 'PharIo\\Manifest\\BundledComponent' => $vendorDir . '/phar-io/manifest/src/values/BundledComponent.php', - 'PharIo\\Manifest\\BundledComponentCollection' => $vendorDir . '/phar-io/manifest/src/values/BundledComponentCollection.php', - 'PharIo\\Manifest\\BundledComponentCollectionIterator' => $vendorDir . '/phar-io/manifest/src/values/BundledComponentCollectionIterator.php', - 'PharIo\\Manifest\\BundlesElement' => $vendorDir . '/phar-io/manifest/src/xml/BundlesElement.php', - 'PharIo\\Manifest\\ComponentElement' => $vendorDir . '/phar-io/manifest/src/xml/ComponentElement.php', - 'PharIo\\Manifest\\ComponentElementCollection' => $vendorDir . '/phar-io/manifest/src/xml/ComponentElementCollection.php', - 'PharIo\\Manifest\\ContainsElement' => $vendorDir . '/phar-io/manifest/src/xml/ContainsElement.php', - 'PharIo\\Manifest\\CopyrightElement' => $vendorDir . '/phar-io/manifest/src/xml/CopyrightElement.php', - 'PharIo\\Manifest\\CopyrightInformation' => $vendorDir . '/phar-io/manifest/src/values/CopyrightInformation.php', - 'PharIo\\Manifest\\ElementCollection' => $vendorDir . '/phar-io/manifest/src/xml/ElementCollection.php', - 'PharIo\\Manifest\\ElementCollectionException' => $vendorDir . '/phar-io/manifest/src/exceptions/ElementCollectionException.php', - 'PharIo\\Manifest\\Email' => $vendorDir . '/phar-io/manifest/src/values/Email.php', - 'PharIo\\Manifest\\Exception' => $vendorDir . '/phar-io/manifest/src/exceptions/Exception.php', - 'PharIo\\Manifest\\ExtElement' => $vendorDir . '/phar-io/manifest/src/xml/ExtElement.php', - 'PharIo\\Manifest\\ExtElementCollection' => $vendorDir . '/phar-io/manifest/src/xml/ExtElementCollection.php', - 'PharIo\\Manifest\\Extension' => $vendorDir . '/phar-io/manifest/src/values/Extension.php', - 'PharIo\\Manifest\\ExtensionElement' => $vendorDir . '/phar-io/manifest/src/xml/ExtensionElement.php', - 'PharIo\\Manifest\\InvalidApplicationNameException' => $vendorDir . '/phar-io/manifest/src/exceptions/InvalidApplicationNameException.php', - 'PharIo\\Manifest\\InvalidEmailException' => $vendorDir . '/phar-io/manifest/src/exceptions/InvalidEmailException.php', - 'PharIo\\Manifest\\InvalidUrlException' => $vendorDir . '/phar-io/manifest/src/exceptions/InvalidUrlException.php', - 'PharIo\\Manifest\\Library' => $vendorDir . '/phar-io/manifest/src/values/Library.php', - 'PharIo\\Manifest\\License' => $vendorDir . '/phar-io/manifest/src/values/License.php', - 'PharIo\\Manifest\\LicenseElement' => $vendorDir . '/phar-io/manifest/src/xml/LicenseElement.php', - 'PharIo\\Manifest\\Manifest' => $vendorDir . '/phar-io/manifest/src/values/Manifest.php', - 'PharIo\\Manifest\\ManifestDocument' => $vendorDir . '/phar-io/manifest/src/xml/ManifestDocument.php', - 'PharIo\\Manifest\\ManifestDocumentException' => $vendorDir . '/phar-io/manifest/src/exceptions/ManifestDocumentException.php', - 'PharIo\\Manifest\\ManifestDocumentLoadingException' => $vendorDir . '/phar-io/manifest/src/exceptions/ManifestDocumentLoadingException.php', - 'PharIo\\Manifest\\ManifestDocumentMapper' => $vendorDir . '/phar-io/manifest/src/ManifestDocumentMapper.php', - 'PharIo\\Manifest\\ManifestDocumentMapperException' => $vendorDir . '/phar-io/manifest/src/exceptions/ManifestDocumentMapperException.php', - 'PharIo\\Manifest\\ManifestElement' => $vendorDir . '/phar-io/manifest/src/xml/ManifestElement.php', - 'PharIo\\Manifest\\ManifestElementException' => $vendorDir . '/phar-io/manifest/src/exceptions/ManifestElementException.php', - 'PharIo\\Manifest\\ManifestLoader' => $vendorDir . '/phar-io/manifest/src/ManifestLoader.php', - 'PharIo\\Manifest\\ManifestLoaderException' => $vendorDir . '/phar-io/manifest/src/exceptions/ManifestLoaderException.php', - 'PharIo\\Manifest\\ManifestSerializer' => $vendorDir . '/phar-io/manifest/src/ManifestSerializer.php', - 'PharIo\\Manifest\\NoEmailAddressException' => $vendorDir . '/phar-io/manifest/src/exceptions/NoEmailAddressException.php', - 'PharIo\\Manifest\\PhpElement' => $vendorDir . '/phar-io/manifest/src/xml/PhpElement.php', - 'PharIo\\Manifest\\PhpExtensionRequirement' => $vendorDir . '/phar-io/manifest/src/values/PhpExtensionRequirement.php', - 'PharIo\\Manifest\\PhpVersionRequirement' => $vendorDir . '/phar-io/manifest/src/values/PhpVersionRequirement.php', - 'PharIo\\Manifest\\Requirement' => $vendorDir . '/phar-io/manifest/src/values/Requirement.php', - 'PharIo\\Manifest\\RequirementCollection' => $vendorDir . '/phar-io/manifest/src/values/RequirementCollection.php', - 'PharIo\\Manifest\\RequirementCollectionIterator' => $vendorDir . '/phar-io/manifest/src/values/RequirementCollectionIterator.php', - 'PharIo\\Manifest\\RequiresElement' => $vendorDir . '/phar-io/manifest/src/xml/RequiresElement.php', - 'PharIo\\Manifest\\Type' => $vendorDir . '/phar-io/manifest/src/values/Type.php', - 'PharIo\\Manifest\\Url' => $vendorDir . '/phar-io/manifest/src/values/Url.php', - 'PharIo\\Version\\AbstractVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/AbstractVersionConstraint.php', - 'PharIo\\Version\\AndVersionConstraintGroup' => $vendorDir . '/phar-io/version/src/constraints/AndVersionConstraintGroup.php', - 'PharIo\\Version\\AnyVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/AnyVersionConstraint.php', - 'PharIo\\Version\\BuildMetaData' => $vendorDir . '/phar-io/version/src/BuildMetaData.php', - 'PharIo\\Version\\ExactVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/ExactVersionConstraint.php', - 'PharIo\\Version\\Exception' => $vendorDir . '/phar-io/version/src/exceptions/Exception.php', - 'PharIo\\Version\\GreaterThanOrEqualToVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php', - 'PharIo\\Version\\InvalidPreReleaseSuffixException' => $vendorDir . '/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php', - 'PharIo\\Version\\InvalidVersionException' => $vendorDir . '/phar-io/version/src/exceptions/InvalidVersionException.php', - 'PharIo\\Version\\NoBuildMetaDataException' => $vendorDir . '/phar-io/version/src/exceptions/NoBuildMetaDataException.php', - 'PharIo\\Version\\NoPreReleaseSuffixException' => $vendorDir . '/phar-io/version/src/exceptions/NoPreReleaseSuffixException.php', - 'PharIo\\Version\\OrVersionConstraintGroup' => $vendorDir . '/phar-io/version/src/constraints/OrVersionConstraintGroup.php', - 'PharIo\\Version\\PreReleaseSuffix' => $vendorDir . '/phar-io/version/src/PreReleaseSuffix.php', - 'PharIo\\Version\\SpecificMajorAndMinorVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php', - 'PharIo\\Version\\SpecificMajorVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/SpecificMajorVersionConstraint.php', - 'PharIo\\Version\\UnsupportedVersionConstraintException' => $vendorDir . '/phar-io/version/src/exceptions/UnsupportedVersionConstraintException.php', - 'PharIo\\Version\\Version' => $vendorDir . '/phar-io/version/src/Version.php', - 'PharIo\\Version\\VersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/VersionConstraint.php', - 'PharIo\\Version\\VersionConstraintParser' => $vendorDir . '/phar-io/version/src/VersionConstraintParser.php', - 'PharIo\\Version\\VersionConstraintValue' => $vendorDir . '/phar-io/version/src/VersionConstraintValue.php', - 'PharIo\\Version\\VersionNumber' => $vendorDir . '/phar-io/version/src/VersionNumber.php', - 'PhpParser\\Builder' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder.php', - 'PhpParser\\BuilderFactory' => $vendorDir . '/nikic/php-parser/lib/PhpParser/BuilderFactory.php', - 'PhpParser\\BuilderHelpers' => $vendorDir . '/nikic/php-parser/lib/PhpParser/BuilderHelpers.php', - 'PhpParser\\Builder\\ClassConst' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/ClassConst.php', - 'PhpParser\\Builder\\Class_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Class_.php', - 'PhpParser\\Builder\\Declaration' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Declaration.php', - 'PhpParser\\Builder\\EnumCase' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/EnumCase.php', - 'PhpParser\\Builder\\Enum_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Enum_.php', - 'PhpParser\\Builder\\FunctionLike' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php', - 'PhpParser\\Builder\\Function_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Function_.php', - 'PhpParser\\Builder\\Interface_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Interface_.php', - 'PhpParser\\Builder\\Method' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Method.php', - 'PhpParser\\Builder\\Namespace_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php', - 'PhpParser\\Builder\\Param' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Param.php', - 'PhpParser\\Builder\\Property' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Property.php', - 'PhpParser\\Builder\\TraitUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php', - 'PhpParser\\Builder\\TraitUseAdaptation' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php', - 'PhpParser\\Builder\\Trait_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Trait_.php', - 'PhpParser\\Builder\\Use_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Use_.php', - 'PhpParser\\Comment' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Comment.php', - 'PhpParser\\Comment\\Doc' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Comment/Doc.php', - 'PhpParser\\ConstExprEvaluationException' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.php', - 'PhpParser\\ConstExprEvaluator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ConstExprEvaluator.php', - 'PhpParser\\Error' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Error.php', - 'PhpParser\\ErrorHandler' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ErrorHandler.php', - 'PhpParser\\ErrorHandler\\Collecting' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php', - 'PhpParser\\ErrorHandler\\Throwing' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php', - 'PhpParser\\Internal\\DiffElem' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php', - 'PhpParser\\Internal\\Differ' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/Differ.php', - 'PhpParser\\Internal\\PrintableNewAnonClassNode' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php', - 'PhpParser\\Internal\\TokenStream' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php', - 'PhpParser\\JsonDecoder' => $vendorDir . '/nikic/php-parser/lib/PhpParser/JsonDecoder.php', - 'PhpParser\\Lexer' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer.php', - 'PhpParser\\Lexer\\Emulative' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php', - 'PhpParser\\Lexer\\TokenEmulator\\AttributeEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\CoaleseEqualTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/CoaleseEqualTokenEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\EnumTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/EnumTokenEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\ExplicitOctalEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ExplicitOctalEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\FlexibleDocStringEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FlexibleDocStringEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\FnTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\KeywordEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/KeywordEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\MatchTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\NullsafeTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NullsafeTokenEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\NumericLiteralSeparatorEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\ReadonlyFunctionTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyFunctionTokenEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\ReadonlyTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\ReverseEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReverseEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\TokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php', - 'PhpParser\\NameContext' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NameContext.php', - 'PhpParser\\Node' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node.php', - 'PhpParser\\NodeAbstract' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeAbstract.php', - 'PhpParser\\NodeDumper' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeDumper.php', - 'PhpParser\\NodeFinder' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeFinder.php', - 'PhpParser\\NodeTraverser' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeTraverser.php', - 'PhpParser\\NodeTraverserInterface' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php', - 'PhpParser\\NodeVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor.php', - 'PhpParser\\NodeVisitorAbstract' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php', - 'PhpParser\\NodeVisitor\\CloningVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php', - 'PhpParser\\NodeVisitor\\FindingVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php', - 'PhpParser\\NodeVisitor\\FirstFindingVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php', - 'PhpParser\\NodeVisitor\\NameResolver' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php', - 'PhpParser\\NodeVisitor\\NodeConnectingVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php', - 'PhpParser\\NodeVisitor\\ParentConnectingVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php', - 'PhpParser\\Node\\Arg' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Arg.php', - 'PhpParser\\Node\\Attribute' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Attribute.php', - 'PhpParser\\Node\\AttributeGroup' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php', - 'PhpParser\\Node\\ComplexType' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/ComplexType.php', - 'PhpParser\\Node\\Const_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Const_.php', - 'PhpParser\\Node\\Expr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr.php', - 'PhpParser\\Node\\Expr\\ArrayDimFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php', - 'PhpParser\\Node\\Expr\\ArrayItem' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php', - 'PhpParser\\Node\\Expr\\Array_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php', - 'PhpParser\\Node\\Expr\\ArrowFunction' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php', - 'PhpParser\\Node\\Expr\\Assign' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php', - 'PhpParser\\Node\\Expr\\AssignOp' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php', - 'PhpParser\\Node\\Expr\\AssignOp\\BitwiseAnd' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php', - 'PhpParser\\Node\\Expr\\AssignOp\\BitwiseOr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseOr.php', - 'PhpParser\\Node\\Expr\\AssignOp\\BitwiseXor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseXor.php', - 'PhpParser\\Node\\Expr\\AssignOp\\Coalesce' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Coalesce.php', - 'PhpParser\\Node\\Expr\\AssignOp\\Concat' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Concat.php', - 'PhpParser\\Node\\Expr\\AssignOp\\Div' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Div.php', - 'PhpParser\\Node\\Expr\\AssignOp\\Minus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Minus.php', - 'PhpParser\\Node\\Expr\\AssignOp\\Mod' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mod.php', - 'PhpParser\\Node\\Expr\\AssignOp\\Mul' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mul.php', - 'PhpParser\\Node\\Expr\\AssignOp\\Plus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Plus.php', - 'PhpParser\\Node\\Expr\\AssignOp\\Pow' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Pow.php', - 'PhpParser\\Node\\Expr\\AssignOp\\ShiftLeft' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftLeft.php', - 'PhpParser\\Node\\Expr\\AssignOp\\ShiftRight' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftRight.php', - 'PhpParser\\Node\\Expr\\AssignRef' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php', - 'PhpParser\\Node\\Expr\\BinaryOp' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\BitwiseAnd' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\BitwiseOr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseOr.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\BitwiseXor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseXor.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\BooleanAnd' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanAnd.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\BooleanOr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanOr.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Coalesce' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Coalesce.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Concat' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Concat.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Div' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Div.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Equal' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Equal.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Greater' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Greater.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\GreaterOrEqual' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Identical' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\LogicalAnd' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalAnd.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\LogicalOr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalOr.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\LogicalXor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalXor.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Minus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Minus.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Mod' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mod.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Mul' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mul.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\NotEqual' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotEqual.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\NotIdentical' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotIdentical.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Plus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Plus.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Pow' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pow.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\ShiftLeft' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftLeft.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\ShiftRight' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftRight.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Smaller' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\SmallerOrEqual' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Spaceship' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Spaceship.php', - 'PhpParser\\Node\\Expr\\BitwiseNot' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php', - 'PhpParser\\Node\\Expr\\BooleanNot' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php', - 'PhpParser\\Node\\Expr\\CallLike' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php', - 'PhpParser\\Node\\Expr\\Cast' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php', - 'PhpParser\\Node\\Expr\\Cast\\Array_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php', - 'PhpParser\\Node\\Expr\\Cast\\Bool_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Bool_.php', - 'PhpParser\\Node\\Expr\\Cast\\Double' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.php', - 'PhpParser\\Node\\Expr\\Cast\\Int_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Int_.php', - 'PhpParser\\Node\\Expr\\Cast\\Object_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Object_.php', - 'PhpParser\\Node\\Expr\\Cast\\String_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/String_.php', - 'PhpParser\\Node\\Expr\\Cast\\Unset_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Unset_.php', - 'PhpParser\\Node\\Expr\\ClassConstFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php', - 'PhpParser\\Node\\Expr\\Clone_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php', - 'PhpParser\\Node\\Expr\\Closure' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php', - 'PhpParser\\Node\\Expr\\ClosureUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php', - 'PhpParser\\Node\\Expr\\ConstFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php', - 'PhpParser\\Node\\Expr\\Empty_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php', - 'PhpParser\\Node\\Expr\\Error' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php', - 'PhpParser\\Node\\Expr\\ErrorSuppress' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php', - 'PhpParser\\Node\\Expr\\Eval_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php', - 'PhpParser\\Node\\Expr\\Exit_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php', - 'PhpParser\\Node\\Expr\\FuncCall' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php', - 'PhpParser\\Node\\Expr\\Include_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php', - 'PhpParser\\Node\\Expr\\Instanceof_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php', - 'PhpParser\\Node\\Expr\\Isset_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php', - 'PhpParser\\Node\\Expr\\List_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php', - 'PhpParser\\Node\\Expr\\Match_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.php', - 'PhpParser\\Node\\Expr\\MethodCall' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php', - 'PhpParser\\Node\\Expr\\New_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php', - 'PhpParser\\Node\\Expr\\NullsafeMethodCall' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.php', - 'PhpParser\\Node\\Expr\\NullsafePropertyFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.php', - 'PhpParser\\Node\\Expr\\PostDec' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php', - 'PhpParser\\Node\\Expr\\PostInc' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php', - 'PhpParser\\Node\\Expr\\PreDec' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php', - 'PhpParser\\Node\\Expr\\PreInc' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php', - 'PhpParser\\Node\\Expr\\Print_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php', - 'PhpParser\\Node\\Expr\\PropertyFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php', - 'PhpParser\\Node\\Expr\\ShellExec' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php', - 'PhpParser\\Node\\Expr\\StaticCall' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php', - 'PhpParser\\Node\\Expr\\StaticPropertyFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php', - 'PhpParser\\Node\\Expr\\Ternary' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php', - 'PhpParser\\Node\\Expr\\Throw_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.php', - 'PhpParser\\Node\\Expr\\UnaryMinus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php', - 'PhpParser\\Node\\Expr\\UnaryPlus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php', - 'PhpParser\\Node\\Expr\\Variable' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php', - 'PhpParser\\Node\\Expr\\YieldFrom' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php', - 'PhpParser\\Node\\Expr\\Yield_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php', - 'PhpParser\\Node\\FunctionLike' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php', - 'PhpParser\\Node\\Identifier' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Identifier.php', - 'PhpParser\\Node\\IntersectionType' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php', - 'PhpParser\\Node\\MatchArm' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/MatchArm.php', - 'PhpParser\\Node\\Name' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Name.php', - 'PhpParser\\Node\\Name\\FullyQualified' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php', - 'PhpParser\\Node\\Name\\Relative' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php', - 'PhpParser\\Node\\NullableType' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/NullableType.php', - 'PhpParser\\Node\\Param' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Param.php', - 'PhpParser\\Node\\Scalar' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar.php', - 'PhpParser\\Node\\Scalar\\DNumber' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php', - 'PhpParser\\Node\\Scalar\\Encapsed' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php', - 'PhpParser\\Node\\Scalar\\EncapsedStringPart' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php', - 'PhpParser\\Node\\Scalar\\LNumber' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php', - 'PhpParser\\Node\\Scalar\\MagicConst' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php', - 'PhpParser\\Node\\Scalar\\MagicConst\\Class_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php', - 'PhpParser\\Node\\Scalar\\MagicConst\\Dir' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Dir.php', - 'PhpParser\\Node\\Scalar\\MagicConst\\File' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/File.php', - 'PhpParser\\Node\\Scalar\\MagicConst\\Function_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Function_.php', - 'PhpParser\\Node\\Scalar\\MagicConst\\Line' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.php', - 'PhpParser\\Node\\Scalar\\MagicConst\\Method' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.php', - 'PhpParser\\Node\\Scalar\\MagicConst\\Namespace_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.php', - 'PhpParser\\Node\\Scalar\\MagicConst\\Trait_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.php', - 'PhpParser\\Node\\Scalar\\String_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php', - 'PhpParser\\Node\\Stmt' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt.php', - 'PhpParser\\Node\\Stmt\\Break_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php', - 'PhpParser\\Node\\Stmt\\Case_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php', - 'PhpParser\\Node\\Stmt\\Catch_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php', - 'PhpParser\\Node\\Stmt\\ClassConst' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php', - 'PhpParser\\Node\\Stmt\\ClassLike' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php', - 'PhpParser\\Node\\Stmt\\ClassMethod' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php', - 'PhpParser\\Node\\Stmt\\Class_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php', - 'PhpParser\\Node\\Stmt\\Const_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php', - 'PhpParser\\Node\\Stmt\\Continue_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php', - 'PhpParser\\Node\\Stmt\\DeclareDeclare' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php', - 'PhpParser\\Node\\Stmt\\Declare_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php', - 'PhpParser\\Node\\Stmt\\Do_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php', - 'PhpParser\\Node\\Stmt\\Echo_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php', - 'PhpParser\\Node\\Stmt\\ElseIf_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php', - 'PhpParser\\Node\\Stmt\\Else_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php', - 'PhpParser\\Node\\Stmt\\EnumCase' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.php', - 'PhpParser\\Node\\Stmt\\Enum_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php', - 'PhpParser\\Node\\Stmt\\Expression' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php', - 'PhpParser\\Node\\Stmt\\Finally_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php', - 'PhpParser\\Node\\Stmt\\For_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php', - 'PhpParser\\Node\\Stmt\\Foreach_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php', - 'PhpParser\\Node\\Stmt\\Function_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php', - 'PhpParser\\Node\\Stmt\\Global_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php', - 'PhpParser\\Node\\Stmt\\Goto_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php', - 'PhpParser\\Node\\Stmt\\GroupUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php', - 'PhpParser\\Node\\Stmt\\HaltCompiler' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php', - 'PhpParser\\Node\\Stmt\\If_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php', - 'PhpParser\\Node\\Stmt\\InlineHTML' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php', - 'PhpParser\\Node\\Stmt\\Interface_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php', - 'PhpParser\\Node\\Stmt\\Label' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php', - 'PhpParser\\Node\\Stmt\\Namespace_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php', - 'PhpParser\\Node\\Stmt\\Nop' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php', - 'PhpParser\\Node\\Stmt\\Property' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php', - 'PhpParser\\Node\\Stmt\\PropertyProperty' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php', - 'PhpParser\\Node\\Stmt\\Return_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php', - 'PhpParser\\Node\\Stmt\\StaticVar' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php', - 'PhpParser\\Node\\Stmt\\Static_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php', - 'PhpParser\\Node\\Stmt\\Switch_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php', - 'PhpParser\\Node\\Stmt\\Throw_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php', - 'PhpParser\\Node\\Stmt\\TraitUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php', - 'PhpParser\\Node\\Stmt\\TraitUseAdaptation' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php', - 'PhpParser\\Node\\Stmt\\TraitUseAdaptation\\Alias' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php', - 'PhpParser\\Node\\Stmt\\TraitUseAdaptation\\Precedence' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php', - 'PhpParser\\Node\\Stmt\\Trait_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php', - 'PhpParser\\Node\\Stmt\\TryCatch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php', - 'PhpParser\\Node\\Stmt\\Unset_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php', - 'PhpParser\\Node\\Stmt\\UseUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php', - 'PhpParser\\Node\\Stmt\\Use_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php', - 'PhpParser\\Node\\Stmt\\While_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php', - 'PhpParser\\Node\\UnionType' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/UnionType.php', - 'PhpParser\\Node\\VarLikeIdentifier' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php', - 'PhpParser\\Node\\VariadicPlaceholder' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/VariadicPlaceholder.php', - 'PhpParser\\Parser' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser.php', - 'PhpParser\\ParserAbstract' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ParserAbstract.php', - 'PhpParser\\ParserFactory' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ParserFactory.php', - 'PhpParser\\Parser\\Multiple' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser/Multiple.php', - 'PhpParser\\Parser\\Php5' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser/Php5.php', - 'PhpParser\\Parser\\Php7' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser/Php7.php', - 'PhpParser\\Parser\\Tokens' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser/Tokens.php', - 'PhpParser\\PrettyPrinterAbstract' => $vendorDir . '/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php', - 'PhpParser\\PrettyPrinter\\Standard' => $vendorDir . '/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php', 'PhpToken' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', 'Psr\\EventDispatcher\\EventDispatcherInterface' => $vendorDir . '/psr/event-dispatcher/src/EventDispatcherInterface.php', 'Psr\\EventDispatcher\\ListenerProviderInterface' => $vendorDir . '/psr/event-dispatcher/src/ListenerProviderInterface.php', 'Psr\\EventDispatcher\\StoppableEventInterface' => $vendorDir . '/psr/event-dispatcher/src/StoppableEventInterface.php', - 'SebastianBergmann\\CliParser\\AmbiguousOptionException' => $vendorDir . '/sebastian/cli-parser/src/exceptions/AmbiguousOptionException.php', - 'SebastianBergmann\\CliParser\\Exception' => $vendorDir . '/sebastian/cli-parser/src/exceptions/Exception.php', - 'SebastianBergmann\\CliParser\\OptionDoesNotAllowArgumentException' => $vendorDir . '/sebastian/cli-parser/src/exceptions/OptionDoesNotAllowArgumentException.php', - 'SebastianBergmann\\CliParser\\Parser' => $vendorDir . '/sebastian/cli-parser/src/Parser.php', - 'SebastianBergmann\\CliParser\\RequiredOptionArgumentMissingException' => $vendorDir . '/sebastian/cli-parser/src/exceptions/RequiredOptionArgumentMissingException.php', - 'SebastianBergmann\\CliParser\\UnknownOptionException' => $vendorDir . '/sebastian/cli-parser/src/exceptions/UnknownOptionException.php', - 'SebastianBergmann\\CodeCoverage\\BranchAndPathCoverageNotSupportedException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/BranchAndPathCoverageNotSupportedException.php', - 'SebastianBergmann\\CodeCoverage\\CodeCoverage' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage.php', - 'SebastianBergmann\\CodeCoverage\\Data\\ProcessedCodeCoverageData' => $vendorDir . '/phpunit/php-code-coverage/src/Data/ProcessedCodeCoverageData.php', - 'SebastianBergmann\\CodeCoverage\\Data\\RawCodeCoverageData' => $vendorDir . '/phpunit/php-code-coverage/src/Data/RawCodeCoverageData.php', - 'SebastianBergmann\\CodeCoverage\\DeadCodeDetectionNotSupportedException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/DeadCodeDetectionNotSupportedException.php', - 'SebastianBergmann\\CodeCoverage\\Driver\\Driver' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/Driver.php', - 'SebastianBergmann\\CodeCoverage\\Driver\\PathExistsButIsNotDirectoryException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/PathExistsButIsNotDirectoryException.php', - 'SebastianBergmann\\CodeCoverage\\Driver\\PcovDriver' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/PcovDriver.php', - 'SebastianBergmann\\CodeCoverage\\Driver\\PcovNotAvailableException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/PcovNotAvailableException.php', - 'SebastianBergmann\\CodeCoverage\\Driver\\Selector' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/Selector.php', - 'SebastianBergmann\\CodeCoverage\\Driver\\WriteOperationFailedException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/WriteOperationFailedException.php', - 'SebastianBergmann\\CodeCoverage\\Driver\\XdebugDriver' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/XdebugDriver.php', - 'SebastianBergmann\\CodeCoverage\\Driver\\XdebugNotAvailableException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/XdebugNotAvailableException.php', - 'SebastianBergmann\\CodeCoverage\\Driver\\XdebugNotEnabledException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/XdebugNotEnabledException.php', - 'SebastianBergmann\\CodeCoverage\\Exception' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/Exception.php', - 'SebastianBergmann\\CodeCoverage\\FileCouldNotBeWrittenException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/FileCouldNotBeWrittenException.php', - 'SebastianBergmann\\CodeCoverage\\Filter' => $vendorDir . '/phpunit/php-code-coverage/src/Filter.php', - 'SebastianBergmann\\CodeCoverage\\InvalidArgumentException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/InvalidArgumentException.php', - 'SebastianBergmann\\CodeCoverage\\NoCodeCoverageDriverAvailableException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/NoCodeCoverageDriverAvailableException.php', - 'SebastianBergmann\\CodeCoverage\\NoCodeCoverageDriverWithPathCoverageSupportAvailableException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/NoCodeCoverageDriverWithPathCoverageSupportAvailableException.php', - 'SebastianBergmann\\CodeCoverage\\Node\\AbstractNode' => $vendorDir . '/phpunit/php-code-coverage/src/Node/AbstractNode.php', - 'SebastianBergmann\\CodeCoverage\\Node\\Builder' => $vendorDir . '/phpunit/php-code-coverage/src/Node/Builder.php', - 'SebastianBergmann\\CodeCoverage\\Node\\CrapIndex' => $vendorDir . '/phpunit/php-code-coverage/src/Node/CrapIndex.php', - 'SebastianBergmann\\CodeCoverage\\Node\\Directory' => $vendorDir . '/phpunit/php-code-coverage/src/Node/Directory.php', - 'SebastianBergmann\\CodeCoverage\\Node\\File' => $vendorDir . '/phpunit/php-code-coverage/src/Node/File.php', - 'SebastianBergmann\\CodeCoverage\\Node\\Iterator' => $vendorDir . '/phpunit/php-code-coverage/src/Node/Iterator.php', - 'SebastianBergmann\\CodeCoverage\\ParserException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/ParserException.php', - 'SebastianBergmann\\CodeCoverage\\ReflectionException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/ReflectionException.php', - 'SebastianBergmann\\CodeCoverage\\ReportAlreadyFinalizedException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/ReportAlreadyFinalizedException.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Clover' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Clover.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Cobertura' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Cobertura.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Crap4j' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Crap4j.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Colors' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Colors.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Html\\CustomCssFile' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/CustomCssFile.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Dashboard' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Dashboard.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Directory' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Directory.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Facade' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Facade.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Html\\File' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Renderer' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer.php', - 'SebastianBergmann\\CodeCoverage\\Report\\PHP' => $vendorDir . '/phpunit/php-code-coverage/src/Report/PHP.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Text' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Text.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Thresholds' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Thresholds.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\BuildInformation' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/BuildInformation.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Coverage' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Coverage.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Directory' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Directory.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Facade' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Facade.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\File' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/File.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Method' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Method.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Node' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Node.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Project' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Project.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Report' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Report.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Source' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Source.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Tests' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Tests.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Totals' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Totals.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Unit' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Unit.php', - 'SebastianBergmann\\CodeCoverage\\StaticAnalysisCacheNotConfiguredException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/StaticAnalysisCacheNotConfiguredException.php', - 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\CacheWarmer' => $vendorDir . '/phpunit/php-code-coverage/src/StaticAnalysis/CacheWarmer.php', - 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\CachingFileAnalyser' => $vendorDir . '/phpunit/php-code-coverage/src/StaticAnalysis/CachingFileAnalyser.php', - 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\CodeUnitFindingVisitor' => $vendorDir . '/phpunit/php-code-coverage/src/StaticAnalysis/CodeUnitFindingVisitor.php', - 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\ExecutableLinesFindingVisitor' => $vendorDir . '/phpunit/php-code-coverage/src/StaticAnalysis/ExecutableLinesFindingVisitor.php', - 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\FileAnalyser' => $vendorDir . '/phpunit/php-code-coverage/src/StaticAnalysis/FileAnalyser.php', - 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\IgnoredLinesFindingVisitor' => $vendorDir . '/phpunit/php-code-coverage/src/StaticAnalysis/IgnoredLinesFindingVisitor.php', - 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\ParsingFileAnalyser' => $vendorDir . '/phpunit/php-code-coverage/src/StaticAnalysis/ParsingFileAnalyser.php', - 'SebastianBergmann\\CodeCoverage\\TestIdMissingException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/TestIdMissingException.php', - 'SebastianBergmann\\CodeCoverage\\Test\\TestSize\\Known' => $vendorDir . '/phpunit/php-code-coverage/src/TestSize/Known.php', - 'SebastianBergmann\\CodeCoverage\\Test\\TestSize\\Large' => $vendorDir . '/phpunit/php-code-coverage/src/TestSize/Large.php', - 'SebastianBergmann\\CodeCoverage\\Test\\TestSize\\Medium' => $vendorDir . '/phpunit/php-code-coverage/src/TestSize/Medium.php', - 'SebastianBergmann\\CodeCoverage\\Test\\TestSize\\Small' => $vendorDir . '/phpunit/php-code-coverage/src/TestSize/Small.php', - 'SebastianBergmann\\CodeCoverage\\Test\\TestSize\\TestSize' => $vendorDir . '/phpunit/php-code-coverage/src/TestSize/TestSize.php', - 'SebastianBergmann\\CodeCoverage\\Test\\TestSize\\Unknown' => $vendorDir . '/phpunit/php-code-coverage/src/TestSize/Unknown.php', - 'SebastianBergmann\\CodeCoverage\\Test\\TestStatus\\Failure' => $vendorDir . '/phpunit/php-code-coverage/src/TestStatus/Failure.php', - 'SebastianBergmann\\CodeCoverage\\Test\\TestStatus\\Known' => $vendorDir . '/phpunit/php-code-coverage/src/TestStatus/Known.php', - 'SebastianBergmann\\CodeCoverage\\Test\\TestStatus\\Success' => $vendorDir . '/phpunit/php-code-coverage/src/TestStatus/Success.php', - 'SebastianBergmann\\CodeCoverage\\Test\\TestStatus\\TestStatus' => $vendorDir . '/phpunit/php-code-coverage/src/TestStatus/TestStatus.php', - 'SebastianBergmann\\CodeCoverage\\Test\\TestStatus\\Unknown' => $vendorDir . '/phpunit/php-code-coverage/src/TestStatus/Unknown.php', - 'SebastianBergmann\\CodeCoverage\\UnintentionallyCoveredCodeException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/UnintentionallyCoveredCodeException.php', - 'SebastianBergmann\\CodeCoverage\\Util\\DirectoryCouldNotBeCreatedException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/DirectoryCouldNotBeCreatedException.php', - 'SebastianBergmann\\CodeCoverage\\Util\\Filesystem' => $vendorDir . '/phpunit/php-code-coverage/src/Util/Filesystem.php', - 'SebastianBergmann\\CodeCoverage\\Util\\Percentage' => $vendorDir . '/phpunit/php-code-coverage/src/Util/Percentage.php', - 'SebastianBergmann\\CodeCoverage\\Version' => $vendorDir . '/phpunit/php-code-coverage/src/Version.php', - 'SebastianBergmann\\CodeCoverage\\XmlException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/XmlException.php', - 'SebastianBergmann\\CodeUnitReverseLookup\\Wizard' => $vendorDir . '/sebastian/code-unit-reverse-lookup/src/Wizard.php', - 'SebastianBergmann\\CodeUnit\\ClassMethodUnit' => $vendorDir . '/sebastian/code-unit/src/ClassMethodUnit.php', - 'SebastianBergmann\\CodeUnit\\ClassUnit' => $vendorDir . '/sebastian/code-unit/src/ClassUnit.php', - 'SebastianBergmann\\CodeUnit\\CodeUnit' => $vendorDir . '/sebastian/code-unit/src/CodeUnit.php', - 'SebastianBergmann\\CodeUnit\\CodeUnitCollection' => $vendorDir . '/sebastian/code-unit/src/CodeUnitCollection.php', - 'SebastianBergmann\\CodeUnit\\CodeUnitCollectionIterator' => $vendorDir . '/sebastian/code-unit/src/CodeUnitCollectionIterator.php', - 'SebastianBergmann\\CodeUnit\\Exception' => $vendorDir . '/sebastian/code-unit/src/exceptions/Exception.php', - 'SebastianBergmann\\CodeUnit\\FileUnit' => $vendorDir . '/sebastian/code-unit/src/FileUnit.php', - 'SebastianBergmann\\CodeUnit\\FunctionUnit' => $vendorDir . '/sebastian/code-unit/src/FunctionUnit.php', - 'SebastianBergmann\\CodeUnit\\InterfaceMethodUnit' => $vendorDir . '/sebastian/code-unit/src/InterfaceMethodUnit.php', - 'SebastianBergmann\\CodeUnit\\InterfaceUnit' => $vendorDir . '/sebastian/code-unit/src/InterfaceUnit.php', - 'SebastianBergmann\\CodeUnit\\InvalidCodeUnitException' => $vendorDir . '/sebastian/code-unit/src/exceptions/InvalidCodeUnitException.php', - 'SebastianBergmann\\CodeUnit\\Mapper' => $vendorDir . '/sebastian/code-unit/src/Mapper.php', - 'SebastianBergmann\\CodeUnit\\NoTraitException' => $vendorDir . '/sebastian/code-unit/src/exceptions/NoTraitException.php', - 'SebastianBergmann\\CodeUnit\\ReflectionException' => $vendorDir . '/sebastian/code-unit/src/exceptions/ReflectionException.php', - 'SebastianBergmann\\CodeUnit\\TraitMethodUnit' => $vendorDir . '/sebastian/code-unit/src/TraitMethodUnit.php', - 'SebastianBergmann\\CodeUnit\\TraitUnit' => $vendorDir . '/sebastian/code-unit/src/TraitUnit.php', - 'SebastianBergmann\\Comparator\\ArrayComparator' => $vendorDir . '/sebastian/comparator/src/ArrayComparator.php', - 'SebastianBergmann\\Comparator\\Comparator' => $vendorDir . '/sebastian/comparator/src/Comparator.php', - 'SebastianBergmann\\Comparator\\ComparisonFailure' => $vendorDir . '/sebastian/comparator/src/ComparisonFailure.php', - 'SebastianBergmann\\Comparator\\DOMNodeComparator' => $vendorDir . '/sebastian/comparator/src/DOMNodeComparator.php', - 'SebastianBergmann\\Comparator\\DateTimeComparator' => $vendorDir . '/sebastian/comparator/src/DateTimeComparator.php', - 'SebastianBergmann\\Comparator\\Exception' => $vendorDir . '/sebastian/comparator/src/exceptions/Exception.php', - 'SebastianBergmann\\Comparator\\ExceptionComparator' => $vendorDir . '/sebastian/comparator/src/ExceptionComparator.php', - 'SebastianBergmann\\Comparator\\Factory' => $vendorDir . '/sebastian/comparator/src/Factory.php', - 'SebastianBergmann\\Comparator\\MockObjectComparator' => $vendorDir . '/sebastian/comparator/src/MockObjectComparator.php', - 'SebastianBergmann\\Comparator\\NumericComparator' => $vendorDir . '/sebastian/comparator/src/NumericComparator.php', - 'SebastianBergmann\\Comparator\\ObjectComparator' => $vendorDir . '/sebastian/comparator/src/ObjectComparator.php', - 'SebastianBergmann\\Comparator\\ResourceComparator' => $vendorDir . '/sebastian/comparator/src/ResourceComparator.php', - 'SebastianBergmann\\Comparator\\RuntimeException' => $vendorDir . '/sebastian/comparator/src/exceptions/RuntimeException.php', - 'SebastianBergmann\\Comparator\\ScalarComparator' => $vendorDir . '/sebastian/comparator/src/ScalarComparator.php', - 'SebastianBergmann\\Comparator\\SplObjectStorageComparator' => $vendorDir . '/sebastian/comparator/src/SplObjectStorageComparator.php', - 'SebastianBergmann\\Comparator\\TypeComparator' => $vendorDir . '/sebastian/comparator/src/TypeComparator.php', - 'SebastianBergmann\\Complexity\\Calculator' => $vendorDir . '/sebastian/complexity/src/Calculator.php', - 'SebastianBergmann\\Complexity\\Complexity' => $vendorDir . '/sebastian/complexity/src/Complexity/Complexity.php', - 'SebastianBergmann\\Complexity\\ComplexityCalculatingVisitor' => $vendorDir . '/sebastian/complexity/src/Visitor/ComplexityCalculatingVisitor.php', - 'SebastianBergmann\\Complexity\\ComplexityCollection' => $vendorDir . '/sebastian/complexity/src/Complexity/ComplexityCollection.php', - 'SebastianBergmann\\Complexity\\ComplexityCollectionIterator' => $vendorDir . '/sebastian/complexity/src/Complexity/ComplexityCollectionIterator.php', - 'SebastianBergmann\\Complexity\\CyclomaticComplexityCalculatingVisitor' => $vendorDir . '/sebastian/complexity/src/Visitor/CyclomaticComplexityCalculatingVisitor.php', - 'SebastianBergmann\\Complexity\\Exception' => $vendorDir . '/sebastian/complexity/src/Exception/Exception.php', - 'SebastianBergmann\\Complexity\\RuntimeException' => $vendorDir . '/sebastian/complexity/src/Exception/RuntimeException.php', - 'SebastianBergmann\\Diff\\Chunk' => $vendorDir . '/sebastian/diff/src/Chunk.php', - 'SebastianBergmann\\Diff\\ConfigurationException' => $vendorDir . '/sebastian/diff/src/Exception/ConfigurationException.php', - 'SebastianBergmann\\Diff\\Diff' => $vendorDir . '/sebastian/diff/src/Diff.php', - 'SebastianBergmann\\Diff\\Differ' => $vendorDir . '/sebastian/diff/src/Differ.php', - 'SebastianBergmann\\Diff\\Exception' => $vendorDir . '/sebastian/diff/src/Exception/Exception.php', - 'SebastianBergmann\\Diff\\InvalidArgumentException' => $vendorDir . '/sebastian/diff/src/Exception/InvalidArgumentException.php', - 'SebastianBergmann\\Diff\\Line' => $vendorDir . '/sebastian/diff/src/Line.php', - 'SebastianBergmann\\Diff\\LongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/LongestCommonSubsequenceCalculator.php', - 'SebastianBergmann\\Diff\\MemoryEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php', - 'SebastianBergmann\\Diff\\Output\\AbstractChunkOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php', - 'SebastianBergmann\\Diff\\Output\\DiffOnlyOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php', - 'SebastianBergmann\\Diff\\Output\\DiffOutputBuilderInterface' => $vendorDir . '/sebastian/diff/src/Output/DiffOutputBuilderInterface.php', - 'SebastianBergmann\\Diff\\Output\\StrictUnifiedDiffOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php', - 'SebastianBergmann\\Diff\\Output\\UnifiedDiffOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php', - 'SebastianBergmann\\Diff\\Parser' => $vendorDir . '/sebastian/diff/src/Parser.php', - 'SebastianBergmann\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php', - 'SebastianBergmann\\Environment\\Console' => $vendorDir . '/sebastian/environment/src/Console.php', - 'SebastianBergmann\\Environment\\Runtime' => $vendorDir . '/sebastian/environment/src/Runtime.php', - 'SebastianBergmann\\Exporter\\Exporter' => $vendorDir . '/sebastian/exporter/src/Exporter.php', - 'SebastianBergmann\\FileIterator\\ExcludeIterator' => $vendorDir . '/phpunit/php-file-iterator/src/ExcludeIterator.php', - 'SebastianBergmann\\FileIterator\\Facade' => $vendorDir . '/phpunit/php-file-iterator/src/Facade.php', - 'SebastianBergmann\\FileIterator\\Factory' => $vendorDir . '/phpunit/php-file-iterator/src/Factory.php', - 'SebastianBergmann\\FileIterator\\Iterator' => $vendorDir . '/phpunit/php-file-iterator/src/Iterator.php', - 'SebastianBergmann\\GlobalState\\CodeExporter' => $vendorDir . '/sebastian/global-state/src/CodeExporter.php', - 'SebastianBergmann\\GlobalState\\Exception' => $vendorDir . '/sebastian/global-state/src/exceptions/Exception.php', - 'SebastianBergmann\\GlobalState\\ExcludeList' => $vendorDir . '/sebastian/global-state/src/ExcludeList.php', - 'SebastianBergmann\\GlobalState\\Restorer' => $vendorDir . '/sebastian/global-state/src/Restorer.php', - 'SebastianBergmann\\GlobalState\\RuntimeException' => $vendorDir . '/sebastian/global-state/src/exceptions/RuntimeException.php', - 'SebastianBergmann\\GlobalState\\Snapshot' => $vendorDir . '/sebastian/global-state/src/Snapshot.php', - 'SebastianBergmann\\Invoker\\Exception' => $vendorDir . '/phpunit/php-invoker/src/exceptions/Exception.php', - 'SebastianBergmann\\Invoker\\Invoker' => $vendorDir . '/phpunit/php-invoker/src/Invoker.php', - 'SebastianBergmann\\Invoker\\ProcessControlExtensionNotLoadedException' => $vendorDir . '/phpunit/php-invoker/src/exceptions/ProcessControlExtensionNotLoadedException.php', - 'SebastianBergmann\\Invoker\\TimeoutException' => $vendorDir . '/phpunit/php-invoker/src/exceptions/TimeoutException.php', - 'SebastianBergmann\\LinesOfCode\\Counter' => $vendorDir . '/sebastian/lines-of-code/src/Counter.php', - 'SebastianBergmann\\LinesOfCode\\Exception' => $vendorDir . '/sebastian/lines-of-code/src/Exception/Exception.php', - 'SebastianBergmann\\LinesOfCode\\IllogicalValuesException' => $vendorDir . '/sebastian/lines-of-code/src/Exception/IllogicalValuesException.php', - 'SebastianBergmann\\LinesOfCode\\LineCountingVisitor' => $vendorDir . '/sebastian/lines-of-code/src/LineCountingVisitor.php', - 'SebastianBergmann\\LinesOfCode\\LinesOfCode' => $vendorDir . '/sebastian/lines-of-code/src/LinesOfCode.php', - 'SebastianBergmann\\LinesOfCode\\NegativeValueException' => $vendorDir . '/sebastian/lines-of-code/src/Exception/NegativeValueException.php', - 'SebastianBergmann\\LinesOfCode\\RuntimeException' => $vendorDir . '/sebastian/lines-of-code/src/Exception/RuntimeException.php', - 'SebastianBergmann\\ObjectEnumerator\\Enumerator' => $vendorDir . '/sebastian/object-enumerator/src/Enumerator.php', - 'SebastianBergmann\\ObjectReflector\\ObjectReflector' => $vendorDir . '/sebastian/object-reflector/src/ObjectReflector.php', - 'SebastianBergmann\\RecursionContext\\Context' => $vendorDir . '/sebastian/recursion-context/src/Context.php', - 'SebastianBergmann\\Template\\Exception' => $vendorDir . '/phpunit/php-text-template/src/exceptions/Exception.php', - 'SebastianBergmann\\Template\\InvalidArgumentException' => $vendorDir . '/phpunit/php-text-template/src/exceptions/InvalidArgumentException.php', - 'SebastianBergmann\\Template\\RuntimeException' => $vendorDir . '/phpunit/php-text-template/src/exceptions/RuntimeException.php', - 'SebastianBergmann\\Template\\Template' => $vendorDir . '/phpunit/php-text-template/src/Template.php', - 'SebastianBergmann\\Timer\\Duration' => $vendorDir . '/phpunit/php-timer/src/Duration.php', - 'SebastianBergmann\\Timer\\Exception' => $vendorDir . '/phpunit/php-timer/src/exceptions/Exception.php', - 'SebastianBergmann\\Timer\\NoActiveTimerException' => $vendorDir . '/phpunit/php-timer/src/exceptions/NoActiveTimerException.php', - 'SebastianBergmann\\Timer\\ResourceUsageFormatter' => $vendorDir . '/phpunit/php-timer/src/ResourceUsageFormatter.php', - 'SebastianBergmann\\Timer\\TimeSinceStartOfRequestNotAvailableException' => $vendorDir . '/phpunit/php-timer/src/exceptions/TimeSinceStartOfRequestNotAvailableException.php', - 'SebastianBergmann\\Timer\\Timer' => $vendorDir . '/phpunit/php-timer/src/Timer.php', - 'SebastianBergmann\\Type\\CallableType' => $vendorDir . '/sebastian/type/src/type/CallableType.php', - 'SebastianBergmann\\Type\\Exception' => $vendorDir . '/sebastian/type/src/exception/Exception.php', - 'SebastianBergmann\\Type\\FalseType' => $vendorDir . '/sebastian/type/src/type/FalseType.php', - 'SebastianBergmann\\Type\\GenericObjectType' => $vendorDir . '/sebastian/type/src/type/GenericObjectType.php', - 'SebastianBergmann\\Type\\IntersectionType' => $vendorDir . '/sebastian/type/src/type/IntersectionType.php', - 'SebastianBergmann\\Type\\IterableType' => $vendorDir . '/sebastian/type/src/type/IterableType.php', - 'SebastianBergmann\\Type\\MixedType' => $vendorDir . '/sebastian/type/src/type/MixedType.php', - 'SebastianBergmann\\Type\\NeverType' => $vendorDir . '/sebastian/type/src/type/NeverType.php', - 'SebastianBergmann\\Type\\NullType' => $vendorDir . '/sebastian/type/src/type/NullType.php', - 'SebastianBergmann\\Type\\ObjectType' => $vendorDir . '/sebastian/type/src/type/ObjectType.php', - 'SebastianBergmann\\Type\\Parameter' => $vendorDir . '/sebastian/type/src/Parameter.php', - 'SebastianBergmann\\Type\\ReflectionMapper' => $vendorDir . '/sebastian/type/src/ReflectionMapper.php', - 'SebastianBergmann\\Type\\RuntimeException' => $vendorDir . '/sebastian/type/src/exception/RuntimeException.php', - 'SebastianBergmann\\Type\\SimpleType' => $vendorDir . '/sebastian/type/src/type/SimpleType.php', - 'SebastianBergmann\\Type\\StaticType' => $vendorDir . '/sebastian/type/src/type/StaticType.php', - 'SebastianBergmann\\Type\\TrueType' => $vendorDir . '/sebastian/type/src/type/TrueType.php', - 'SebastianBergmann\\Type\\Type' => $vendorDir . '/sebastian/type/src/type/Type.php', - 'SebastianBergmann\\Type\\TypeName' => $vendorDir . '/sebastian/type/src/TypeName.php', - 'SebastianBergmann\\Type\\UnionType' => $vendorDir . '/sebastian/type/src/type/UnionType.php', - 'SebastianBergmann\\Type\\UnknownType' => $vendorDir . '/sebastian/type/src/type/UnknownType.php', - 'SebastianBergmann\\Type\\VoidType' => $vendorDir . '/sebastian/type/src/type/VoidType.php', - 'SebastianBergmann\\Version' => $vendorDir . '/sebastian/version/src/Version.php', 'Stringable' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', 'Symfony\\Polyfill\\Php80\\Php80' => $vendorDir . '/symfony/polyfill-php80/Php80.php', 'Symfony\\Polyfill\\Php80\\PhpToken' => $vendorDir . '/symfony/polyfill-php80/PhpToken.php', - 'TheSeer\\Tokenizer\\Exception' => $vendorDir . '/theseer/tokenizer/src/Exception.php', - 'TheSeer\\Tokenizer\\NamespaceUri' => $vendorDir . '/theseer/tokenizer/src/NamespaceUri.php', - 'TheSeer\\Tokenizer\\NamespaceUriException' => $vendorDir . '/theseer/tokenizer/src/NamespaceUriException.php', - 'TheSeer\\Tokenizer\\Token' => $vendorDir . '/theseer/tokenizer/src/Token.php', - 'TheSeer\\Tokenizer\\TokenCollection' => $vendorDir . '/theseer/tokenizer/src/TokenCollection.php', - 'TheSeer\\Tokenizer\\TokenCollectionException' => $vendorDir . '/theseer/tokenizer/src/TokenCollectionException.php', - 'TheSeer\\Tokenizer\\Tokenizer' => $vendorDir . '/theseer/tokenizer/src/Tokenizer.php', - 'TheSeer\\Tokenizer\\XMLSerializer' => $vendorDir . '/theseer/tokenizer/src/XMLSerializer.php', 'UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', 'ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', - 'WP_Since\\Checker\\CompatibilityChecker' => $vendorDir . '/eduardovillao/wp-since/src/Checker/CompatibilityChecker.php', - 'WP_Since\\Resolver\\IgnoreRulesResolver' => $vendorDir . '/eduardovillao/wp-since/src/Resolver/IgnoreRulesResolver.php', - 'WP_Since\\Resolver\\InlineIgnoreResolver' => $vendorDir . '/eduardovillao/wp-since/src/Resolver/InlineIgnoreResolver.php', - 'WP_Since\\Resolver\\VersionResolver' => $vendorDir . '/eduardovillao/wp-since/src/Resolver/VersionResolver.php', - 'WP_Since\\Runner\\PluginCheckCommand' => $vendorDir . '/eduardovillao/wp-since/src/Runner/PluginCheckCommand.php', - 'WP_Since\\Scanner\\PluginScanner' => $vendorDir . '/eduardovillao/wp-since/src/Scanner/PluginScanner.php', - 'WP_Since\\Scanner\\SymbolExtractorVisitor' => $vendorDir . '/eduardovillao/wp-since/src/Scanner/SymbolExtractorVisitor.php', - 'WP_Since\\Scanner\\SymbolHandlers\\FunctionCallHandler' => $vendorDir . '/eduardovillao/wp-since/src/Scanner/SymbolHandlers/FunctionCallHandler.php', - 'WP_Since\\Scanner\\SymbolHandlers\\MethodCallHandler' => $vendorDir . '/eduardovillao/wp-since/src/Scanner/SymbolHandlers/MethodCallHandler.php', - 'WP_Since\\Scanner\\SymbolHandlers\\NewClassHandler' => $vendorDir . '/eduardovillao/wp-since/src/Scanner/SymbolHandlers/NewClassHandler.php', - 'WP_Since\\Scanner\\SymbolHandlers\\StaticCallHandler' => $vendorDir . '/eduardovillao/wp-since/src/Scanner/SymbolHandlers/StaticCallHandler.php', - 'WP_Since\\Scanner\\SymbolHandlers\\SymbolHandlerInterface' => $vendorDir . '/eduardovillao/wp-since/src/Scanner/SymbolHandlers/SymbolHandlerInterface.php', - 'WP_Since\\Utils\\TablePrinter' => $vendorDir . '/eduardovillao/wp-since/src/Utils/TablePrinter.php', - 'WP_Since\\Utils\\VersionHelper' => $vendorDir . '/eduardovillao/wp-since/src/Utils/VersionHelper.php', ); diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php index 01270ee..414f45c 100644 --- a/vendor/composer/autoload_files.php +++ b/vendor/composer/autoload_files.php @@ -6,9 +6,6 @@ $vendorDir = dirname(__DIR__); $baseDir = dirname($vendorDir); return array( - '6124b4c8570aa390c21fafd04a26c69f' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php', '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php', 'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php', - '9b38cf48e83f5d8f60375221cd213eee' => $vendorDir . '/phpstan/phpstan/bootstrap.php', - 'ec07570ca5a812141189b1fa81503674' => $vendorDir . '/phpunit/phpunit/src/Framework/Assert/Functions.php', ); diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php index e60e2a7..87aca3c 100644 --- a/vendor/composer/autoload_psr4.php +++ b/vendor/composer/autoload_psr4.php @@ -6,15 +6,11 @@ $vendorDir = dirname(__DIR__); $baseDir = dirname($vendorDir); return array( - 'WP_Since\\' => array($vendorDir . '/eduardovillao/wp-since/src'), 'Symfony\\Polyfill\\Php80\\' => array($vendorDir . '/symfony/polyfill-php80'), 'RobotsTxt\\DocumentationMarkdown\\' => array($baseDir . '/includes'), 'Psr\\EventDispatcher\\' => array($vendorDir . '/psr/event-dispatcher/src'), - 'PhpParser\\' => array($vendorDir . '/nikic/php-parser/lib/PhpParser'), - 'PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\' => array($vendorDir . '/dealerdirect/phpcodesniffer-composer-installer/src'), - 'Nette\\' => array($vendorDir . '/nette/schema/src', $vendorDir . '/nette/utils/src'), + 'Nette\\' => array($vendorDir . '/nette/utils/src', $vendorDir . '/nette/schema/src'), 'League\\Config\\' => array($vendorDir . '/league/config/src'), 'League\\CommonMark\\' => array($vendorDir . '/league/commonmark/src'), 'Dflydev\\DotAccessData\\' => array($vendorDir . '/dflydev/dot-access-data/src'), - 'DeepCopy\\' => array($vendorDir . '/myclabs/deep-copy/src/DeepCopy'), ); diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php index 68c7d51..36ad717 100644 --- a/vendor/composer/autoload_real.php +++ b/vendor/composer/autoload_real.php @@ -2,7 +2,7 @@ // autoload_real.php @generated by Composer -class ComposerAutoloaderInit5db7b63bf0104878d549f48a1ce8cb76 +class ComposerAutoloaderInit216e6d5522dd071bc42c5f7c15b28cdc { private static $loader; @@ -24,16 +24,16 @@ class ComposerAutoloaderInit5db7b63bf0104878d549f48a1ce8cb76 require __DIR__ . '/platform_check.php'; - spl_autoload_register(array('ComposerAutoloaderInit5db7b63bf0104878d549f48a1ce8cb76', 'loadClassLoader'), true, true); + spl_autoload_register(array('ComposerAutoloaderInit216e6d5522dd071bc42c5f7c15b28cdc', 'loadClassLoader'), true, true); self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__)); - spl_autoload_unregister(array('ComposerAutoloaderInit5db7b63bf0104878d549f48a1ce8cb76', 'loadClassLoader')); + spl_autoload_unregister(array('ComposerAutoloaderInit216e6d5522dd071bc42c5f7c15b28cdc', 'loadClassLoader')); require __DIR__ . '/autoload_static.php'; - call_user_func(\Composer\Autoload\ComposerStaticInit5db7b63bf0104878d549f48a1ce8cb76::getInitializer($loader)); + call_user_func(\Composer\Autoload\ComposerStaticInit216e6d5522dd071bc42c5f7c15b28cdc::getInitializer($loader)); $loader->register(true); - $filesToLoad = \Composer\Autoload\ComposerStaticInit5db7b63bf0104878d549f48a1ce8cb76::$files; + $filesToLoad = \Composer\Autoload\ComposerStaticInit216e6d5522dd071bc42c5f7c15b28cdc::$files; $requireFile = \Closure::bind(static function ($fileIdentifier, $file) { if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index 086dcf4..0f4921c 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -4,21 +4,14 @@ namespace Composer\Autoload; -class ComposerStaticInit5db7b63bf0104878d549f48a1ce8cb76 +class ComposerStaticInit216e6d5522dd071bc42c5f7c15b28cdc { public static $files = array ( - '6124b4c8570aa390c21fafd04a26c69f' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php', '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php', 'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php', - '9b38cf48e83f5d8f60375221cd213eee' => __DIR__ . '/..' . '/phpstan/phpstan/bootstrap.php', - 'ec07570ca5a812141189b1fa81503674' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Assert/Functions.php', ); public static $prefixLengthsPsr4 = array ( - 'W' => - array ( - 'WP_Since\\' => 9, - ), 'S' => array ( 'Symfony\\Polyfill\\Php80\\' => 23, @@ -30,8 +23,6 @@ class ComposerStaticInit5db7b63bf0104878d549f48a1ce8cb76 'P' => array ( 'Psr\\EventDispatcher\\' => 20, - 'PhpParser\\' => 10, - 'PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\' => 57, ), 'N' => array ( @@ -45,15 +36,10 @@ class ComposerStaticInit5db7b63bf0104878d549f48a1ce8cb76 'D' => array ( 'Dflydev\\DotAccessData\\' => 22, - 'DeepCopy\\' => 9, ), ); public static $prefixDirsPsr4 = array ( - 'WP_Since\\' => - array ( - 0 => __DIR__ . '/..' . '/eduardovillao/wp-since/src', - ), 'Symfony\\Polyfill\\Php80\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-php80', @@ -66,18 +52,10 @@ class ComposerStaticInit5db7b63bf0104878d549f48a1ce8cb76 array ( 0 => __DIR__ . '/..' . '/psr/event-dispatcher/src', ), - 'PhpParser\\' => - array ( - 0 => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser', - ), - 'PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\' => - array ( - 0 => __DIR__ . '/..' . '/dealerdirect/phpcodesniffer-composer-installer/src', - ), 'Nette\\' => array ( - 0 => __DIR__ . '/..' . '/nette/schema/src', - 1 => __DIR__ . '/..' . '/nette/utils/src', + 0 => __DIR__ . '/..' . '/nette/utils/src', + 1 => __DIR__ . '/..' . '/nette/schema/src', ), 'League\\Config\\' => array ( @@ -91,41 +69,11 @@ class ComposerStaticInit5db7b63bf0104878d549f48a1ce8cb76 array ( 0 => __DIR__ . '/..' . '/dflydev/dot-access-data/src', ), - 'DeepCopy\\' => - array ( - 0 => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy', - ), ); public static $classMap = array ( 'Attribute' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', - 'DeepCopy\\DeepCopy' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/DeepCopy.php', - 'DeepCopy\\Exception\\CloneException' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php', - 'DeepCopy\\Exception\\PropertyException' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Exception/PropertyException.php', - 'DeepCopy\\Filter\\ChainableFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/ChainableFilter.php', - 'DeepCopy\\Filter\\Doctrine\\DoctrineCollectionFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php', - 'DeepCopy\\Filter\\Doctrine\\DoctrineEmptyCollectionFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php', - 'DeepCopy\\Filter\\Doctrine\\DoctrineProxyFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php', - 'DeepCopy\\Filter\\Filter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php', - 'DeepCopy\\Filter\\KeepFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/KeepFilter.php', - 'DeepCopy\\Filter\\ReplaceFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/ReplaceFilter.php', - 'DeepCopy\\Filter\\SetNullFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php', - 'DeepCopy\\Matcher\\Doctrine\\DoctrineProxyMatcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php', - 'DeepCopy\\Matcher\\Matcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.php', - 'DeepCopy\\Matcher\\PropertyMatcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyMatcher.php', - 'DeepCopy\\Matcher\\PropertyNameMatcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php', - 'DeepCopy\\Matcher\\PropertyTypeMatcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php', - 'DeepCopy\\Reflection\\ReflectionHelper' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php', - 'DeepCopy\\TypeFilter\\Date\\DateIntervalFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.php', - 'DeepCopy\\TypeFilter\\Date\\DatePeriodFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DatePeriodFilter.php', - 'DeepCopy\\TypeFilter\\ReplaceFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php', - 'DeepCopy\\TypeFilter\\ShallowCopyFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php', - 'DeepCopy\\TypeFilter\\Spl\\ArrayObjectFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/ArrayObjectFilter.php', - 'DeepCopy\\TypeFilter\\Spl\\SplDoublyLinkedList' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php', - 'DeepCopy\\TypeFilter\\Spl\\SplDoublyLinkedListFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.php', - 'DeepCopy\\TypeFilter\\TypeFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php', - 'DeepCopy\\TypeMatcher\\TypeMatcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeMatcher/TypeMatcher.php', 'Dflydev\\DotAccessData\\Data' => __DIR__ . '/..' . '/dflydev/dot-access-data/src/Data.php', 'Dflydev\\DotAccessData\\DataInterface' => __DIR__ . '/..' . '/dflydev/dot-access-data/src/DataInterface.php', 'Dflydev\\DotAccessData\\Exception\\DataException' => __DIR__ . '/..' . '/dflydev/dot-access-data/src/Exception/DataException.php', @@ -503,1516 +451,23 @@ class ComposerStaticInit5db7b63bf0104878d549f48a1ce8cb76 'Nette\\Utils\\Type' => __DIR__ . '/..' . '/nette/utils/src/Utils/Type.php', 'Nette\\Utils\\UnknownImageFileException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', 'Nette\\Utils\\Validators' => __DIR__ . '/..' . '/nette/utils/src/Utils/Validators.php', - 'PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin' => __DIR__ . '/..' . '/dealerdirect/phpcodesniffer-composer-installer/src/Plugin.php', - 'PHPCSUtils\\AbstractSniffs\\AbstractArrayDeclarationSniff' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/AbstractSniffs/AbstractArrayDeclarationSniff.php', - 'PHPCSUtils\\BackCompat\\BCFile' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/BackCompat/BCFile.php', - 'PHPCSUtils\\BackCompat\\BCTokens' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/BackCompat/BCTokens.php', - 'PHPCSUtils\\BackCompat\\Helper' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/BackCompat/Helper.php', - 'PHPCSUtils\\Exceptions\\InvalidTokenArray' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/InvalidTokenArray.php', - 'PHPCSUtils\\Exceptions\\LogicException' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/LogicException.php', - 'PHPCSUtils\\Exceptions\\MissingArgumentError' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/MissingArgumentError.php', - 'PHPCSUtils\\Exceptions\\OutOfBoundsStackPtr' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/OutOfBoundsStackPtr.php', - 'PHPCSUtils\\Exceptions\\RuntimeException' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/RuntimeException.php', - 'PHPCSUtils\\Exceptions\\TestFileNotFound' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/TestFileNotFound.php', - 'PHPCSUtils\\Exceptions\\TestMarkerNotFound' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/TestMarkerNotFound.php', - 'PHPCSUtils\\Exceptions\\TestTargetNotFound' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/TestTargetNotFound.php', - 'PHPCSUtils\\Exceptions\\TypeError' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/TypeError.php', - 'PHPCSUtils\\Exceptions\\UnexpectedTokenType' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/UnexpectedTokenType.php', - 'PHPCSUtils\\Exceptions\\ValueError' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/ValueError.php', - 'PHPCSUtils\\Fixers\\SpacesFixer' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Fixers/SpacesFixer.php', - 'PHPCSUtils\\Internal\\AttributeHelper' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Internal/AttributeHelper.php', - 'PHPCSUtils\\Internal\\Cache' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Internal/Cache.php', - 'PHPCSUtils\\Internal\\IsShortArrayOrList' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Internal/IsShortArrayOrList.php', - 'PHPCSUtils\\Internal\\IsShortArrayOrListWithCache' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Internal/IsShortArrayOrListWithCache.php', - 'PHPCSUtils\\Internal\\NoFileCache' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Internal/NoFileCache.php', - 'PHPCSUtils\\Internal\\StableCollections' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Internal/StableCollections.php', - 'PHPCSUtils\\TestUtils\\ConfigDouble' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/TestUtils/ConfigDouble.php', - 'PHPCSUtils\\TestUtils\\RulesetDouble' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/TestUtils/RulesetDouble.php', - 'PHPCSUtils\\TestUtils\\UtilityMethodTestCase' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/TestUtils/UtilityMethodTestCase.php', - 'PHPCSUtils\\Tokens\\Collections' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Tokens/Collections.php', - 'PHPCSUtils\\Tokens\\TokenHelper' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Tokens/TokenHelper.php', - 'PHPCSUtils\\Utils\\Arrays' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Arrays.php', - 'PHPCSUtils\\Utils\\AttributeBlock' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/AttributeBlock.php', - 'PHPCSUtils\\Utils\\Conditions' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Conditions.php', - 'PHPCSUtils\\Utils\\Constants' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Constants.php', - 'PHPCSUtils\\Utils\\Context' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Context.php', - 'PHPCSUtils\\Utils\\ControlStructures' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/ControlStructures.php', - 'PHPCSUtils\\Utils\\FileInfo' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/FileInfo.php', - 'PHPCSUtils\\Utils\\FilePath' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/FilePath.php', - 'PHPCSUtils\\Utils\\FunctionDeclarations' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/FunctionDeclarations.php', - 'PHPCSUtils\\Utils\\GetTokensAsString' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/GetTokensAsString.php', - 'PHPCSUtils\\Utils\\Lists' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Lists.php', - 'PHPCSUtils\\Utils\\MessageHelper' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/MessageHelper.php', - 'PHPCSUtils\\Utils\\Namespaces' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Namespaces.php', - 'PHPCSUtils\\Utils\\NamingConventions' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/NamingConventions.php', - 'PHPCSUtils\\Utils\\Numbers' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Numbers.php', - 'PHPCSUtils\\Utils\\ObjectDeclarations' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/ObjectDeclarations.php', - 'PHPCSUtils\\Utils\\Operators' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Operators.php', - 'PHPCSUtils\\Utils\\Orthography' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Orthography.php', - 'PHPCSUtils\\Utils\\Parentheses' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Parentheses.php', - 'PHPCSUtils\\Utils\\PassedParameters' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/PassedParameters.php', - 'PHPCSUtils\\Utils\\Scopes' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Scopes.php', - 'PHPCSUtils\\Utils\\TextStrings' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/TextStrings.php', - 'PHPCSUtils\\Utils\\TypeString' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/TypeString.php', - 'PHPCSUtils\\Utils\\UseStatements' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/UseStatements.php', - 'PHPCSUtils\\Utils\\Variables' => __DIR__ . '/..' . '/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Variables.php', - 'PHPUnit\\Event\\Application\\Finished' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Application/Finished.php', - 'PHPUnit\\Event\\Application\\FinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Application/FinishedSubscriber.php', - 'PHPUnit\\Event\\Application\\Started' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Application/Started.php', - 'PHPUnit\\Event\\Application\\StartedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Application/StartedSubscriber.php', - 'PHPUnit\\Event\\Code\\ClassMethod' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/ClassMethod.php', - 'PHPUnit\\Event\\Code\\ComparisonFailure' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/ComparisonFailure.php', - 'PHPUnit\\Event\\Code\\ComparisonFailureBuilder' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/ComparisonFailureBuilder.php', - 'PHPUnit\\Event\\Code\\NoTestCaseObjectOnCallStackException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Exception/NoTestCaseObjectOnCallStackException.php', - 'PHPUnit\\Event\\Code\\Phpt' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Test/Phpt.php', - 'PHPUnit\\Event\\Code\\Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Test/Test.php', - 'PHPUnit\\Event\\Code\\TestCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Test/TestCollection.php', - 'PHPUnit\\Event\\Code\\TestCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Test/TestCollectionIterator.php', - 'PHPUnit\\Event\\Code\\TestDox' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Test/TestDox.php', - 'PHPUnit\\Event\\Code\\TestDoxBuilder' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Test/TestDoxBuilder.php', - 'PHPUnit\\Event\\Code\\TestMethod' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Test/TestMethod.php', - 'PHPUnit\\Event\\Code\\TestMethodBuilder' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Test/TestMethodBuilder.php', - 'PHPUnit\\Event\\Code\\Throwable' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Throwable.php', - 'PHPUnit\\Event\\Code\\ThrowableBuilder' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/ThrowableBuilder.php', - 'PHPUnit\\Event\\CollectingDispatcher' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Dispatcher/CollectingDispatcher.php', - 'PHPUnit\\Event\\DeferringDispatcher' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Dispatcher/DeferringDispatcher.php', - 'PHPUnit\\Event\\DirectDispatcher' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Dispatcher/DirectDispatcher.php', - 'PHPUnit\\Event\\Dispatcher' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Dispatcher/Dispatcher.php', - 'PHPUnit\\Event\\DispatchingEmitter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Emitter/DispatchingEmitter.php', - 'PHPUnit\\Event\\Emitter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Emitter/Emitter.php', - 'PHPUnit\\Event\\Event' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Event.php', - 'PHPUnit\\Event\\EventAlreadyAssignedException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Exception/EventAlreadyAssignedException.php', - 'PHPUnit\\Event\\EventCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/EventCollection.php', - 'PHPUnit\\Event\\EventCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/EventCollectionIterator.php', - 'PHPUnit\\Event\\EventFacadeIsSealedException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Exception/EventFacadeIsSealedException.php', - 'PHPUnit\\Event\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Exception/Exception.php', - 'PHPUnit\\Event\\Facade' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Facade.php', - 'PHPUnit\\Event\\InvalidArgumentException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Exception/InvalidArgumentException.php', - 'PHPUnit\\Event\\InvalidEventException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Exception/InvalidEventException.php', - 'PHPUnit\\Event\\InvalidSubscriberException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Exception/InvalidSubscriberException.php', - 'PHPUnit\\Event\\MapError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Exception/MapError.php', - 'PHPUnit\\Event\\NoPreviousThrowableException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Exception/NoPreviousThrowableException.php', - 'PHPUnit\\Event\\RuntimeException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Exception/RuntimeException.php', - 'PHPUnit\\Event\\Runtime\\OperatingSystem' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Runtime/OperatingSystem.php', - 'PHPUnit\\Event\\Runtime\\PHP' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Runtime/PHP.php', - 'PHPUnit\\Event\\Runtime\\PHPUnit' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Runtime/PHPUnit.php', - 'PHPUnit\\Event\\Runtime\\Runtime' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Runtime/Runtime.php', - 'PHPUnit\\Event\\SubscribableDispatcher' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Dispatcher/SubscribableDispatcher.php', - 'PHPUnit\\Event\\Subscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Subscriber.php', - 'PHPUnit\\Event\\SubscriberTypeAlreadyRegisteredException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Exception/SubscriberTypeAlreadyRegisteredException.php', - 'PHPUnit\\Event\\Telemetry\\Duration' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Telemetry/Duration.php', - 'PHPUnit\\Event\\Telemetry\\GarbageCollectorStatus' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Telemetry/GarbageCollectorStatus.php', - 'PHPUnit\\Event\\Telemetry\\GarbageCollectorStatusProvider' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Telemetry/GarbageCollectorStatusProvider.php', - 'PHPUnit\\Event\\Telemetry\\HRTime' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Telemetry/HRTime.php', - 'PHPUnit\\Event\\Telemetry\\Info' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Telemetry/Info.php', - 'PHPUnit\\Event\\Telemetry\\MemoryMeter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Telemetry/MemoryMeter.php', - 'PHPUnit\\Event\\Telemetry\\MemoryUsage' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Telemetry/MemoryUsage.php', - 'PHPUnit\\Event\\Telemetry\\Php81GarbageCollectorStatusProvider' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Telemetry/Php81GarbageCollectorStatusProvider.php', - 'PHPUnit\\Event\\Telemetry\\Php83GarbageCollectorStatusProvider' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Telemetry/Php83GarbageCollectorStatusProvider.php', - 'PHPUnit\\Event\\Telemetry\\Snapshot' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Telemetry/Snapshot.php', - 'PHPUnit\\Event\\Telemetry\\StopWatch' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Telemetry/StopWatch.php', - 'PHPUnit\\Event\\Telemetry\\System' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Telemetry/System.php', - 'PHPUnit\\Event\\Telemetry\\SystemMemoryMeter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Telemetry/SystemMemoryMeter.php', - 'PHPUnit\\Event\\Telemetry\\SystemStopWatch' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Telemetry/SystemStopWatch.php', - 'PHPUnit\\Event\\Telemetry\\SystemStopWatchWithOffset' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Telemetry/SystemStopWatchWithOffset.php', - 'PHPUnit\\Event\\TestData\\DataFromDataProvider' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Test/TestData/DataFromDataProvider.php', - 'PHPUnit\\Event\\TestData\\DataFromTestDependency' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Test/TestData/DataFromTestDependency.php', - 'PHPUnit\\Event\\TestData\\MoreThanOneDataSetFromDataProviderException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Exception/MoreThanOneDataSetFromDataProviderException.php', - 'PHPUnit\\Event\\TestData\\NoDataSetFromDataProviderException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Exception/NoDataSetFromDataProviderException.php', - 'PHPUnit\\Event\\TestData\\TestData' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Test/TestData/TestData.php', - 'PHPUnit\\Event\\TestData\\TestDataCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Test/TestData/TestDataCollection.php', - 'PHPUnit\\Event\\TestData\\TestDataCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/Test/TestData/TestDataCollectionIterator.php', - 'PHPUnit\\Event\\TestRunner\\BootstrapFinished' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/BootstrapFinished.php', - 'PHPUnit\\Event\\TestRunner\\BootstrapFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/BootstrapFinishedSubscriber.php', - 'PHPUnit\\Event\\TestRunner\\Configured' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/Configured.php', - 'PHPUnit\\Event\\TestRunner\\ConfiguredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/ConfiguredSubscriber.php', - 'PHPUnit\\Event\\TestRunner\\DeprecationTriggered' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/DeprecationTriggered.php', - 'PHPUnit\\Event\\TestRunner\\DeprecationTriggeredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/DeprecationTriggeredSubscriber.php', - 'PHPUnit\\Event\\TestRunner\\EventFacadeSealed' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/EventFacadeSealed.php', - 'PHPUnit\\Event\\TestRunner\\EventFacadeSealedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/EventFacadeSealedSubscriber.php', - 'PHPUnit\\Event\\TestRunner\\ExecutionAborted' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionAborted.php', - 'PHPUnit\\Event\\TestRunner\\ExecutionAbortedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionAbortedSubscriber.php', - 'PHPUnit\\Event\\TestRunner\\ExecutionFinished' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionFinished.php', - 'PHPUnit\\Event\\TestRunner\\ExecutionFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionFinishedSubscriber.php', - 'PHPUnit\\Event\\TestRunner\\ExecutionStarted' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionStarted.php', - 'PHPUnit\\Event\\TestRunner\\ExecutionStartedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionStartedSubscriber.php', - 'PHPUnit\\Event\\TestRunner\\ExtensionBootstrapped' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionBootstrapped.php', - 'PHPUnit\\Event\\TestRunner\\ExtensionBootstrappedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionBootstrappedSubscriber.php', - 'PHPUnit\\Event\\TestRunner\\ExtensionLoadedFromPhar' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionLoadedFromPhar.php', - 'PHPUnit\\Event\\TestRunner\\ExtensionLoadedFromPharSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionLoadedFromPharSubscriber.php', - 'PHPUnit\\Event\\TestRunner\\Finished' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/Finished.php', - 'PHPUnit\\Event\\TestRunner\\FinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/FinishedSubscriber.php', - 'PHPUnit\\Event\\TestRunner\\GarbageCollectionDisabled' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionDisabled.php', - 'PHPUnit\\Event\\TestRunner\\GarbageCollectionDisabledSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionDisabledSubscriber.php', - 'PHPUnit\\Event\\TestRunner\\GarbageCollectionEnabled' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionEnabled.php', - 'PHPUnit\\Event\\TestRunner\\GarbageCollectionEnabledSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionEnabledSubscriber.php', - 'PHPUnit\\Event\\TestRunner\\GarbageCollectionTriggered' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionTriggered.php', - 'PHPUnit\\Event\\TestRunner\\GarbageCollectionTriggeredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionTriggeredSubscriber.php', - 'PHPUnit\\Event\\TestRunner\\Started' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/Started.php', - 'PHPUnit\\Event\\TestRunner\\StartedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/StartedSubscriber.php', - 'PHPUnit\\Event\\TestRunner\\WarningTriggered' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/WarningTriggered.php', - 'PHPUnit\\Event\\TestRunner\\WarningTriggeredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestRunner/WarningTriggeredSubscriber.php', - 'PHPUnit\\Event\\TestSuite\\Filtered' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestSuite/Filtered.php', - 'PHPUnit\\Event\\TestSuite\\FilteredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestSuite/FilteredSubscriber.php', - 'PHPUnit\\Event\\TestSuite\\Finished' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestSuite/Finished.php', - 'PHPUnit\\Event\\TestSuite\\FinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestSuite/FinishedSubscriber.php', - 'PHPUnit\\Event\\TestSuite\\Loaded' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestSuite/Loaded.php', - 'PHPUnit\\Event\\TestSuite\\LoadedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestSuite/LoadedSubscriber.php', - 'PHPUnit\\Event\\TestSuite\\Skipped' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestSuite/Skipped.php', - 'PHPUnit\\Event\\TestSuite\\SkippedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestSuite/SkippedSubscriber.php', - 'PHPUnit\\Event\\TestSuite\\Sorted' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestSuite/Sorted.php', - 'PHPUnit\\Event\\TestSuite\\SortedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestSuite/SortedSubscriber.php', - 'PHPUnit\\Event\\TestSuite\\Started' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestSuite/Started.php', - 'PHPUnit\\Event\\TestSuite\\StartedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/TestSuite/StartedSubscriber.php', - 'PHPUnit\\Event\\TestSuite\\TestSuite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/TestSuite/TestSuite.php', - 'PHPUnit\\Event\\TestSuite\\TestSuiteBuilder' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteBuilder.php', - 'PHPUnit\\Event\\TestSuite\\TestSuiteForTestClass' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteForTestClass.php', - 'PHPUnit\\Event\\TestSuite\\TestSuiteForTestMethodWithDataProvider' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteForTestMethodWithDataProvider.php', - 'PHPUnit\\Event\\TestSuite\\TestSuiteWithName' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteWithName.php', - 'PHPUnit\\Event\\Test\\AfterLastTestMethodCalled' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodCalled.php', - 'PHPUnit\\Event\\Test\\AfterLastTestMethodCalledSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodCalledSubscriber.php', - 'PHPUnit\\Event\\Test\\AfterLastTestMethodErrored' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodErrored.php', - 'PHPUnit\\Event\\Test\\AfterLastTestMethodErroredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodErroredSubscriber.php', - 'PHPUnit\\Event\\Test\\AfterLastTestMethodFinished' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodFinished.php', - 'PHPUnit\\Event\\Test\\AfterLastTestMethodFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodFinishedSubscriber.php', - 'PHPUnit\\Event\\Test\\AfterTestMethodCalled' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodCalled.php', - 'PHPUnit\\Event\\Test\\AfterTestMethodCalledSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodCalledSubscriber.php', - 'PHPUnit\\Event\\Test\\AfterTestMethodErrored' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodErrored.php', - 'PHPUnit\\Event\\Test\\AfterTestMethodErroredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodErroredSubscriber.php', - 'PHPUnit\\Event\\Test\\AfterTestMethodFinished' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodFinished.php', - 'PHPUnit\\Event\\Test\\AfterTestMethodFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodFinishedSubscriber.php', - 'PHPUnit\\Event\\Test\\AssertionFailed' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionFailed.php', - 'PHPUnit\\Event\\Test\\AssertionFailedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionFailedSubscriber.php', - 'PHPUnit\\Event\\Test\\AssertionSucceeded' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionSucceeded.php', - 'PHPUnit\\Event\\Test\\AssertionSucceededSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionSucceededSubscriber.php', - 'PHPUnit\\Event\\Test\\BeforeFirstTestMethodCalled' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodCalled.php', - 'PHPUnit\\Event\\Test\\BeforeFirstTestMethodCalledSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodCalledSubscriber.php', - 'PHPUnit\\Event\\Test\\BeforeFirstTestMethodErrored' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodErrored.php', - 'PHPUnit\\Event\\Test\\BeforeFirstTestMethodErroredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodErroredSubscriber.php', - 'PHPUnit\\Event\\Test\\BeforeFirstTestMethodFinished' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodFinished.php', - 'PHPUnit\\Event\\Test\\BeforeFirstTestMethodFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodFinishedSubscriber.php', - 'PHPUnit\\Event\\Test\\BeforeTestMethodCalled' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodCalled.php', - 'PHPUnit\\Event\\Test\\BeforeTestMethodCalledSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodCalledSubscriber.php', - 'PHPUnit\\Event\\Test\\BeforeTestMethodErrored' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodErrored.php', - 'PHPUnit\\Event\\Test\\BeforeTestMethodErroredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodErroredSubscriber.php', - 'PHPUnit\\Event\\Test\\BeforeTestMethodFinished' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodFinished.php', - 'PHPUnit\\Event\\Test\\BeforeTestMethodFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodFinishedSubscriber.php', - 'PHPUnit\\Event\\Test\\ComparatorRegistered' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/ComparatorRegistered.php', - 'PHPUnit\\Event\\Test\\ComparatorRegisteredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/ComparatorRegisteredSubscriber.php', - 'PHPUnit\\Event\\Test\\ConsideredRisky' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/ConsideredRisky.php', - 'PHPUnit\\Event\\Test\\ConsideredRiskySubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/ConsideredRiskySubscriber.php', - 'PHPUnit\\Event\\Test\\DataProviderMethodCalled' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/DataProviderMethodCalled.php', - 'PHPUnit\\Event\\Test\\DataProviderMethodCalledSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/DataProviderMethodCalledSubscriber.php', - 'PHPUnit\\Event\\Test\\DataProviderMethodFinished' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/DataProviderMethodFinished.php', - 'PHPUnit\\Event\\Test\\DataProviderMethodFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/DataProviderMethodFinishedSubscriber.php', - 'PHPUnit\\Event\\Test\\DeprecationTriggered' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/DeprecationTriggered.php', - 'PHPUnit\\Event\\Test\\DeprecationTriggeredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/DeprecationTriggeredSubscriber.php', - 'PHPUnit\\Event\\Test\\ErrorTriggered' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/ErrorTriggered.php', - 'PHPUnit\\Event\\Test\\ErrorTriggeredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/ErrorTriggeredSubscriber.php', - 'PHPUnit\\Event\\Test\\Errored' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Outcome/Errored.php', - 'PHPUnit\\Event\\Test\\ErroredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Outcome/ErroredSubscriber.php', - 'PHPUnit\\Event\\Test\\Failed' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Outcome/Failed.php', - 'PHPUnit\\Event\\Test\\FailedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Outcome/FailedSubscriber.php', - 'PHPUnit\\Event\\Test\\Finished' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/Finished.php', - 'PHPUnit\\Event\\Test\\FinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/FinishedSubscriber.php', - 'PHPUnit\\Event\\Test\\MarkedIncomplete' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Outcome/MarkedIncomplete.php', - 'PHPUnit\\Event\\Test\\MarkedIncompleteSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Outcome/MarkedIncompleteSubscriber.php', - 'PHPUnit\\Event\\Test\\MockObjectCreated' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectCreated.php', - 'PHPUnit\\Event\\Test\\MockObjectCreatedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectCreatedSubscriber.php', - 'PHPUnit\\Event\\Test\\MockObjectForAbstractClassCreated' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForAbstractClassCreated.php', - 'PHPUnit\\Event\\Test\\MockObjectForAbstractClassCreatedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForAbstractClassCreatedSubscriber.php', - 'PHPUnit\\Event\\Test\\MockObjectForIntersectionOfInterfacesCreated' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForIntersectionOfInterfacesCreated.php', - 'PHPUnit\\Event\\Test\\MockObjectForIntersectionOfInterfacesCreatedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForIntersectionOfInterfacesCreatedSubscriber.php', - 'PHPUnit\\Event\\Test\\MockObjectForTraitCreated' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForTraitCreated.php', - 'PHPUnit\\Event\\Test\\MockObjectForTraitCreatedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForTraitCreatedSubscriber.php', - 'PHPUnit\\Event\\Test\\MockObjectFromWsdlCreated' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectFromWsdlCreated.php', - 'PHPUnit\\Event\\Test\\MockObjectFromWsdlCreatedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectFromWsdlCreatedSubscriber.php', - 'PHPUnit\\Event\\Test\\NoComparisonFailureException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Exception/NoComparisonFailureException.php', - 'PHPUnit\\Event\\Test\\NoticeTriggered' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/NoticeTriggered.php', - 'PHPUnit\\Event\\Test\\NoticeTriggeredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/NoticeTriggeredSubscriber.php', - 'PHPUnit\\Event\\Test\\PartialMockObjectCreated' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/PartialMockObjectCreated.php', - 'PHPUnit\\Event\\Test\\PartialMockObjectCreatedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/PartialMockObjectCreatedSubscriber.php', - 'PHPUnit\\Event\\Test\\Passed' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Outcome/Passed.php', - 'PHPUnit\\Event\\Test\\PassedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Outcome/PassedSubscriber.php', - 'PHPUnit\\Event\\Test\\PhpDeprecationTriggered' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpDeprecationTriggered.php', - 'PHPUnit\\Event\\Test\\PhpDeprecationTriggeredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpDeprecationTriggeredSubscriber.php', - 'PHPUnit\\Event\\Test\\PhpNoticeTriggered' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpNoticeTriggered.php', - 'PHPUnit\\Event\\Test\\PhpNoticeTriggeredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpNoticeTriggeredSubscriber.php', - 'PHPUnit\\Event\\Test\\PhpWarningTriggered' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpWarningTriggered.php', - 'PHPUnit\\Event\\Test\\PhpWarningTriggeredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpWarningTriggeredSubscriber.php', - 'PHPUnit\\Event\\Test\\PhpunitDeprecationTriggered' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitDeprecationTriggered.php', - 'PHPUnit\\Event\\Test\\PhpunitDeprecationTriggeredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitDeprecationTriggeredSubscriber.php', - 'PHPUnit\\Event\\Test\\PhpunitErrorTriggered' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitErrorTriggered.php', - 'PHPUnit\\Event\\Test\\PhpunitErrorTriggeredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitErrorTriggeredSubscriber.php', - 'PHPUnit\\Event\\Test\\PhpunitWarningTriggered' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitWarningTriggered.php', - 'PHPUnit\\Event\\Test\\PhpunitWarningTriggeredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitWarningTriggeredSubscriber.php', - 'PHPUnit\\Event\\Test\\PostConditionCalled' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionCalled.php', - 'PHPUnit\\Event\\Test\\PostConditionCalledSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionCalledSubscriber.php', - 'PHPUnit\\Event\\Test\\PostConditionErrored' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionErrored.php', - 'PHPUnit\\Event\\Test\\PostConditionErroredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionErroredSubscriber.php', - 'PHPUnit\\Event\\Test\\PostConditionFinished' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionFinished.php', - 'PHPUnit\\Event\\Test\\PostConditionFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionFinishedSubscriber.php', - 'PHPUnit\\Event\\Test\\PreConditionCalled' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionCalled.php', - 'PHPUnit\\Event\\Test\\PreConditionCalledSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionCalledSubscriber.php', - 'PHPUnit\\Event\\Test\\PreConditionErrored' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionErrored.php', - 'PHPUnit\\Event\\Test\\PreConditionErroredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionErroredSubscriber.php', - 'PHPUnit\\Event\\Test\\PreConditionFinished' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionFinished.php', - 'PHPUnit\\Event\\Test\\PreConditionFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionFinishedSubscriber.php', - 'PHPUnit\\Event\\Test\\PreparationFailed' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparationFailed.php', - 'PHPUnit\\Event\\Test\\PreparationFailedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparationFailedSubscriber.php', - 'PHPUnit\\Event\\Test\\PreparationStarted' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparationStarted.php', - 'PHPUnit\\Event\\Test\\PreparationStartedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparationStartedSubscriber.php', - 'PHPUnit\\Event\\Test\\Prepared' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/Prepared.php', - 'PHPUnit\\Event\\Test\\PreparedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparedSubscriber.php', - 'PHPUnit\\Event\\Test\\PrintedUnexpectedOutput' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/PrintedUnexpectedOutput.php', - 'PHPUnit\\Event\\Test\\PrintedUnexpectedOutputSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/PrintedUnexpectedOutputSubscriber.php', - 'PHPUnit\\Event\\Test\\Skipped' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Outcome/Skipped.php', - 'PHPUnit\\Event\\Test\\SkippedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Outcome/SkippedSubscriber.php', - 'PHPUnit\\Event\\Test\\TestProxyCreated' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestProxyCreated.php', - 'PHPUnit\\Event\\Test\\TestProxyCreatedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestProxyCreatedSubscriber.php', - 'PHPUnit\\Event\\Test\\TestStubCreated' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestStubCreated.php', - 'PHPUnit\\Event\\Test\\TestStubCreatedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestStubCreatedSubscriber.php', - 'PHPUnit\\Event\\Test\\TestStubForIntersectionOfInterfacesCreated' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestStubForIntersectionOfInterfacesCreated.php', - 'PHPUnit\\Event\\Test\\TestStubForIntersectionOfInterfacesCreatedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestStubForIntersectionOfInterfacesCreatedSubscriber.php', - 'PHPUnit\\Event\\Test\\WarningTriggered' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/WarningTriggered.php', - 'PHPUnit\\Event\\Test\\WarningTriggeredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Events/Test/Issue/WarningTriggeredSubscriber.php', - 'PHPUnit\\Event\\Tracer\\Tracer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Tracer.php', - 'PHPUnit\\Event\\TypeMap' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/TypeMap.php', - 'PHPUnit\\Event\\UnknownEventException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Exception/UnknownEventException.php', - 'PHPUnit\\Event\\UnknownEventTypeException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Exception/UnknownEventTypeException.php', - 'PHPUnit\\Event\\UnknownSubscriberException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Exception/UnknownSubscriberException.php', - 'PHPUnit\\Event\\UnknownSubscriberTypeException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Event/Exception/UnknownSubscriberTypeException.php', - 'PHPUnit\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Exception.php', - 'PHPUnit\\Framework\\ActualValueIsNotAnObjectException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ActualValueIsNotAnObjectException.php', - 'PHPUnit\\Framework\\Assert' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Assert.php', - 'PHPUnit\\Framework\\AssertionFailedError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/AssertionFailedError.php', - 'PHPUnit\\Framework\\Attributes\\After' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/After.php', - 'PHPUnit\\Framework\\Attributes\\AfterClass' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/AfterClass.php', - 'PHPUnit\\Framework\\Attributes\\BackupGlobals' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/BackupGlobals.php', - 'PHPUnit\\Framework\\Attributes\\BackupStaticProperties' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/BackupStaticProperties.php', - 'PHPUnit\\Framework\\Attributes\\Before' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/Before.php', - 'PHPUnit\\Framework\\Attributes\\BeforeClass' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/BeforeClass.php', - 'PHPUnit\\Framework\\Attributes\\CodeCoverageIgnore' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/CodeCoverageIgnore.php', - 'PHPUnit\\Framework\\Attributes\\CoversClass' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/CoversClass.php', - 'PHPUnit\\Framework\\Attributes\\CoversFunction' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/CoversFunction.php', - 'PHPUnit\\Framework\\Attributes\\CoversNothing' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/CoversNothing.php', - 'PHPUnit\\Framework\\Attributes\\DataProvider' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/DataProvider.php', - 'PHPUnit\\Framework\\Attributes\\DataProviderExternal' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/DataProviderExternal.php', - 'PHPUnit\\Framework\\Attributes\\Depends' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/Depends.php', - 'PHPUnit\\Framework\\Attributes\\DependsExternal' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/DependsExternal.php', - 'PHPUnit\\Framework\\Attributes\\DependsExternalUsingDeepClone' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/DependsExternalUsingDeepClone.php', - 'PHPUnit\\Framework\\Attributes\\DependsExternalUsingShallowClone' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/DependsExternalUsingShallowClone.php', - 'PHPUnit\\Framework\\Attributes\\DependsOnClass' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/DependsOnClass.php', - 'PHPUnit\\Framework\\Attributes\\DependsOnClassUsingDeepClone' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/DependsOnClassUsingDeepClone.php', - 'PHPUnit\\Framework\\Attributes\\DependsOnClassUsingShallowClone' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/DependsOnClassUsingShallowClone.php', - 'PHPUnit\\Framework\\Attributes\\DependsUsingDeepClone' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/DependsUsingDeepClone.php', - 'PHPUnit\\Framework\\Attributes\\DependsUsingShallowClone' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/DependsUsingShallowClone.php', - 'PHPUnit\\Framework\\Attributes\\DoesNotPerformAssertions' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/DoesNotPerformAssertions.php', - 'PHPUnit\\Framework\\Attributes\\ExcludeGlobalVariableFromBackup' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/ExcludeGlobalVariableFromBackup.php', - 'PHPUnit\\Framework\\Attributes\\ExcludeStaticPropertyFromBackup' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/ExcludeStaticPropertyFromBackup.php', - 'PHPUnit\\Framework\\Attributes\\Group' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/Group.php', - 'PHPUnit\\Framework\\Attributes\\IgnoreClassForCodeCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/IgnoreClassForCodeCoverage.php', - 'PHPUnit\\Framework\\Attributes\\IgnoreDeprecations' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/IgnoreDeprecations.php', - 'PHPUnit\\Framework\\Attributes\\IgnoreFunctionForCodeCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/IgnoreFunctionForCodeCoverage.php', - 'PHPUnit\\Framework\\Attributes\\IgnoreMethodForCodeCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/IgnoreMethodForCodeCoverage.php', - 'PHPUnit\\Framework\\Attributes\\Large' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/Large.php', - 'PHPUnit\\Framework\\Attributes\\Medium' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/Medium.php', - 'PHPUnit\\Framework\\Attributes\\PostCondition' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/PostCondition.php', - 'PHPUnit\\Framework\\Attributes\\PreCondition' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/PreCondition.php', - 'PHPUnit\\Framework\\Attributes\\PreserveGlobalState' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/PreserveGlobalState.php', - 'PHPUnit\\Framework\\Attributes\\RequiresFunction' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/RequiresFunction.php', - 'PHPUnit\\Framework\\Attributes\\RequiresMethod' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/RequiresMethod.php', - 'PHPUnit\\Framework\\Attributes\\RequiresOperatingSystem' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/RequiresOperatingSystem.php', - 'PHPUnit\\Framework\\Attributes\\RequiresOperatingSystemFamily' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/RequiresOperatingSystemFamily.php', - 'PHPUnit\\Framework\\Attributes\\RequiresPhp' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/RequiresPhp.php', - 'PHPUnit\\Framework\\Attributes\\RequiresPhpExtension' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/RequiresPhpExtension.php', - 'PHPUnit\\Framework\\Attributes\\RequiresPhpunit' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/RequiresPhpunit.php', - 'PHPUnit\\Framework\\Attributes\\RequiresSetting' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/RequiresSetting.php', - 'PHPUnit\\Framework\\Attributes\\RunClassInSeparateProcess' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/RunClassInSeparateProcess.php', - 'PHPUnit\\Framework\\Attributes\\RunInSeparateProcess' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/RunInSeparateProcess.php', - 'PHPUnit\\Framework\\Attributes\\RunTestsInSeparateProcesses' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/RunTestsInSeparateProcesses.php', - 'PHPUnit\\Framework\\Attributes\\Small' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/Small.php', - 'PHPUnit\\Framework\\Attributes\\Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/Test.php', - 'PHPUnit\\Framework\\Attributes\\TestDox' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/TestDox.php', - 'PHPUnit\\Framework\\Attributes\\TestWith' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/TestWith.php', - 'PHPUnit\\Framework\\Attributes\\TestWithJson' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/TestWithJson.php', - 'PHPUnit\\Framework\\Attributes\\Ticket' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/Ticket.php', - 'PHPUnit\\Framework\\Attributes\\UsesClass' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/UsesClass.php', - 'PHPUnit\\Framework\\Attributes\\UsesFunction' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/UsesFunction.php', - 'PHPUnit\\Framework\\Attributes\\WithoutErrorHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/WithoutErrorHandler.php', - 'PHPUnit\\Framework\\CodeCoverageException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/CodeCoverageException.php', - 'PHPUnit\\Framework\\ComparisonMethodDoesNotAcceptParameterTypeException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotAcceptParameterTypeException.php', - 'PHPUnit\\Framework\\ComparisonMethodDoesNotDeclareBoolReturnTypeException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotDeclareBoolReturnTypeException.php', - 'PHPUnit\\Framework\\ComparisonMethodDoesNotDeclareExactlyOneParameterException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotDeclareExactlyOneParameterException.php', - 'PHPUnit\\Framework\\ComparisonMethodDoesNotDeclareParameterTypeException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotDeclareParameterTypeException.php', - 'PHPUnit\\Framework\\ComparisonMethodDoesNotExistException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotExistException.php', - 'PHPUnit\\Framework\\Constraint\\ArrayHasKey' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Traversable/ArrayHasKey.php', - 'PHPUnit\\Framework\\Constraint\\BinaryOperator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Operator/BinaryOperator.php', - 'PHPUnit\\Framework\\Constraint\\Callback' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Callback.php', - 'PHPUnit\\Framework\\Constraint\\Constraint' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Constraint.php', - 'PHPUnit\\Framework\\Constraint\\Count' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Cardinality/Count.php', - 'PHPUnit\\Framework\\Constraint\\DirectoryExists' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Filesystem/DirectoryExists.php', - 'PHPUnit\\Framework\\Constraint\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Exception/Exception.php', - 'PHPUnit\\Framework\\Constraint\\ExceptionCode' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionCode.php', - 'PHPUnit\\Framework\\Constraint\\ExceptionMessageIsOrContains' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionMessageIsOrContains.php', - 'PHPUnit\\Framework\\Constraint\\ExceptionMessageMatchesRegularExpression' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionMessageMatchesRegularExpression.php', - 'PHPUnit\\Framework\\Constraint\\FileExists' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Filesystem/FileExists.php', - 'PHPUnit\\Framework\\Constraint\\GreaterThan' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Cardinality/GreaterThan.php', - 'PHPUnit\\Framework\\Constraint\\IsAnything' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsAnything.php', - 'PHPUnit\\Framework\\Constraint\\IsEmpty' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Cardinality/IsEmpty.php', - 'PHPUnit\\Framework\\Constraint\\IsEqual' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqual.php', - 'PHPUnit\\Framework\\Constraint\\IsEqualCanonicalizing' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualCanonicalizing.php', - 'PHPUnit\\Framework\\Constraint\\IsEqualIgnoringCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualIgnoringCase.php', - 'PHPUnit\\Framework\\Constraint\\IsEqualWithDelta' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualWithDelta.php', - 'PHPUnit\\Framework\\Constraint\\IsFalse' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Boolean/IsFalse.php', - 'PHPUnit\\Framework\\Constraint\\IsFinite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Math/IsFinite.php', - 'PHPUnit\\Framework\\Constraint\\IsIdentical' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php', - 'PHPUnit\\Framework\\Constraint\\IsInfinite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Math/IsInfinite.php', - 'PHPUnit\\Framework\\Constraint\\IsInstanceOf' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Type/IsInstanceOf.php', - 'PHPUnit\\Framework\\Constraint\\IsJson' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/String/IsJson.php', - 'PHPUnit\\Framework\\Constraint\\IsList' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Traversable/IsList.php', - 'PHPUnit\\Framework\\Constraint\\IsNan' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Math/IsNan.php', - 'PHPUnit\\Framework\\Constraint\\IsNull' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Type/IsNull.php', - 'PHPUnit\\Framework\\Constraint\\IsReadable' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Filesystem/IsReadable.php', - 'PHPUnit\\Framework\\Constraint\\IsTrue' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Boolean/IsTrue.php', - 'PHPUnit\\Framework\\Constraint\\IsType' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Type/IsType.php', - 'PHPUnit\\Framework\\Constraint\\IsWritable' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Filesystem/IsWritable.php', - 'PHPUnit\\Framework\\Constraint\\JsonMatches' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php', - 'PHPUnit\\Framework\\Constraint\\LessThan' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Cardinality/LessThan.php', - 'PHPUnit\\Framework\\Constraint\\LogicalAnd' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalAnd.php', - 'PHPUnit\\Framework\\Constraint\\LogicalNot' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalNot.php', - 'PHPUnit\\Framework\\Constraint\\LogicalOr' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalOr.php', - 'PHPUnit\\Framework\\Constraint\\LogicalXor' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalXor.php', - 'PHPUnit\\Framework\\Constraint\\ObjectEquals' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Object/ObjectEquals.php', - 'PHPUnit\\Framework\\Constraint\\ObjectHasProperty' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Object/ObjectHasProperty.php', - 'PHPUnit\\Framework\\Constraint\\Operator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Operator/Operator.php', - 'PHPUnit\\Framework\\Constraint\\RegularExpression' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/String/RegularExpression.php', - 'PHPUnit\\Framework\\Constraint\\SameSize' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Cardinality/SameSize.php', - 'PHPUnit\\Framework\\Constraint\\StringContains' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/String/StringContains.php', - 'PHPUnit\\Framework\\Constraint\\StringEndsWith' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/String/StringEndsWith.php', - 'PHPUnit\\Framework\\Constraint\\StringEqualsStringIgnoringLineEndings' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/String/StringEqualsStringIgnoringLineEndings.php', - 'PHPUnit\\Framework\\Constraint\\StringMatchesFormatDescription' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/String/StringMatchesFormatDescription.php', - 'PHPUnit\\Framework\\Constraint\\StringStartsWith' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/String/StringStartsWith.php', - 'PHPUnit\\Framework\\Constraint\\TraversableContains' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContains.php', - 'PHPUnit\\Framework\\Constraint\\TraversableContainsEqual' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsEqual.php', - 'PHPUnit\\Framework\\Constraint\\TraversableContainsIdentical' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsIdentical.php', - 'PHPUnit\\Framework\\Constraint\\TraversableContainsOnly' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsOnly.php', - 'PHPUnit\\Framework\\Constraint\\UnaryOperator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Operator/UnaryOperator.php', - 'PHPUnit\\Framework\\DataProviderTestSuite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/DataProviderTestSuite.php', - 'PHPUnit\\Framework\\EmptyStringException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/EmptyStringException.php', - 'PHPUnit\\Framework\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/Exception.php', - 'PHPUnit\\Framework\\ExecutionOrderDependency' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/ExecutionOrderDependency.php', - 'PHPUnit\\Framework\\ExpectationFailedException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/ExpectationFailedException.php', - 'PHPUnit\\Framework\\GeneratorNotSupportedException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/GeneratorNotSupportedException.php', - 'PHPUnit\\Framework\\IncompleteTest' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/Incomplete/IncompleteTest.php', - 'PHPUnit\\Framework\\IncompleteTestError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/Incomplete/IncompleteTestError.php', - 'PHPUnit\\Framework\\InvalidArgumentException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/InvalidArgumentException.php', - 'PHPUnit\\Framework\\InvalidCoversTargetException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/InvalidCoversTargetException.php', - 'PHPUnit\\Framework\\InvalidDataProviderException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/InvalidDataProviderException.php', - 'PHPUnit\\Framework\\InvalidDependencyException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/InvalidDependencyException.php', - 'PHPUnit\\Framework\\MockObject\\BadMethodCallException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/BadMethodCallException.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\Identity' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/Identity.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\InvocationMocker' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/InvocationMocker.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\InvocationStubber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/InvocationStubber.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\MethodNameMatch' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/MethodNameMatch.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\ParametersMatch' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/ParametersMatch.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\Stub' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/Stub.php', - 'PHPUnit\\Framework\\MockObject\\CannotUseOnlyMethodsException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/CannotUseOnlyMethodsException.php', - 'PHPUnit\\Framework\\MockObject\\ConfigurableMethod' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/ConfigurableMethod.php', - 'PHPUnit\\Framework\\MockObject\\DoubledCloneMethod' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/DoubledCloneMethod.php', - 'PHPUnit\\Framework\\MockObject\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/Exception.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\CannotUseAddMethodsException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/CannotUseAddMethodsException.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\ClassIsEnumerationException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ClassIsEnumerationException.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\ClassIsFinalException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ClassIsFinalException.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\ClassIsReadonlyException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ClassIsReadonlyException.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\DuplicateMethodException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/DuplicateMethodException.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/Exception.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\Generator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/Generator.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\InvalidMethodNameException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/InvalidMethodNameException.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\MockClass' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/MockClass.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\MockMethod' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/MockMethod.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\MockMethodSet' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/MockMethodSet.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\MockTrait' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/MockTrait.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\MockType' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/MockType.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\NameAlreadyInUseException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/NameAlreadyInUseException.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\OriginalConstructorInvocationRequiredException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/OriginalConstructorInvocationRequiredException.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\ReflectionException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ReflectionException.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\RuntimeException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/RuntimeException.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\SoapExtensionNotAvailableException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/SoapExtensionNotAvailableException.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\TemplateLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/TemplateLoader.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\UnknownClassException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/UnknownClassException.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\UnknownTraitException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/UnknownTraitException.php', - 'PHPUnit\\Framework\\MockObject\\Generator\\UnknownTypeException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/UnknownTypeException.php', - 'PHPUnit\\Framework\\MockObject\\IncompatibleReturnValueException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/IncompatibleReturnValueException.php', - 'PHPUnit\\Framework\\MockObject\\Invocation' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Invocation.php', - 'PHPUnit\\Framework\\MockObject\\InvocationHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/InvocationHandler.php', - 'PHPUnit\\Framework\\MockObject\\MatchBuilderNotFoundException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/MatchBuilderNotFoundException.php', - 'PHPUnit\\Framework\\MockObject\\Matcher' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Matcher.php', - 'PHPUnit\\Framework\\MockObject\\MatcherAlreadyRegisteredException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/MatcherAlreadyRegisteredException.php', - 'PHPUnit\\Framework\\MockObject\\Method' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/Method.php', - 'PHPUnit\\Framework\\MockObject\\MethodCannotBeConfiguredException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/MethodCannotBeConfiguredException.php', - 'PHPUnit\\Framework\\MockObject\\MethodNameAlreadyConfiguredException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/MethodNameAlreadyConfiguredException.php', - 'PHPUnit\\Framework\\MockObject\\MethodNameConstraint' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/MethodNameConstraint.php', - 'PHPUnit\\Framework\\MockObject\\MethodNameNotConfiguredException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/MethodNameNotConfiguredException.php', - 'PHPUnit\\Framework\\MockObject\\MethodParametersAlreadyConfiguredException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/MethodParametersAlreadyConfiguredException.php', - 'PHPUnit\\Framework\\MockObject\\MockBuilder' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php', - 'PHPUnit\\Framework\\MockObject\\MockObject' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/MockObject.php', - 'PHPUnit\\Framework\\MockObject\\MockObjectApi' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/MockObjectApi.php', - 'PHPUnit\\Framework\\MockObject\\MockObjectInternal' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/MockObjectInternal.php', - 'PHPUnit\\Framework\\MockObject\\NeverReturningMethodException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/NeverReturningMethodException.php', - 'PHPUnit\\Framework\\MockObject\\NoMoreReturnValuesConfiguredException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/NoMoreReturnValuesConfiguredException.php', - 'PHPUnit\\Framework\\MockObject\\ProxiedCloneMethod' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/ProxiedCloneMethod.php', - 'PHPUnit\\Framework\\MockObject\\ReturnValueGenerator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/ReturnValueGenerator.php', - 'PHPUnit\\Framework\\MockObject\\ReturnValueNotConfiguredException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/ReturnValueNotConfiguredException.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\AnyInvokedCount' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/AnyInvokedCount.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\AnyParameters' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/AnyParameters.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\InvocationOrder' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvocationOrder.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtLeastCount' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedAtLeastCount.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtLeastOnce' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedAtLeastOnce.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtMostCount' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedAtMostCount.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedCount' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedCount.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\MethodName' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/MethodName.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\Parameters' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/Parameters.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\ParametersRule' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/ParametersRule.php', - 'PHPUnit\\Framework\\MockObject\\RuntimeException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/RuntimeException.php', - 'PHPUnit\\Framework\\MockObject\\Stub' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/Stub.php', - 'PHPUnit\\Framework\\MockObject\\StubApi' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/StubApi.php', - 'PHPUnit\\Framework\\MockObject\\StubInternal' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/StubInternal.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ConsecutiveCalls' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ConsecutiveCalls.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/Exception.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnArgument' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnArgument.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnCallback' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnCallback.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnReference' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnReference.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnSelf' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnSelf.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnStub' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnStub.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnValueMap' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnValueMap.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\Stub' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/Stub.php', - 'PHPUnit\\Framework\\NoChildTestSuiteException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/NoChildTestSuiteException.php', - 'PHPUnit\\Framework\\PhptAssertionFailedError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/PhptAssertionFailedError.php', - 'PHPUnit\\Framework\\ProcessIsolationException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/ProcessIsolationException.php', - 'PHPUnit\\Framework\\Reorderable' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Reorderable.php', - 'PHPUnit\\Framework\\SelfDescribing' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SelfDescribing.php', - 'PHPUnit\\Framework\\SkippedTest' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/Skipped/SkippedTest.php', - 'PHPUnit\\Framework\\SkippedTestSuiteError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/Skipped/SkippedTestSuiteError.php', - 'PHPUnit\\Framework\\SkippedWithMessageException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/Skipped/SkippedWithMessageException.php', - 'PHPUnit\\Framework\\Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Test.php', - 'PHPUnit\\Framework\\TestBuilder' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestBuilder.php', - 'PHPUnit\\Framework\\TestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestCase.php', - 'PHPUnit\\Framework\\TestRunner' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestRunner.php', - 'PHPUnit\\Framework\\TestSize\\Known' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestSize/Known.php', - 'PHPUnit\\Framework\\TestSize\\Large' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestSize/Large.php', - 'PHPUnit\\Framework\\TestSize\\Medium' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestSize/Medium.php', - 'PHPUnit\\Framework\\TestSize\\Small' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestSize/Small.php', - 'PHPUnit\\Framework\\TestSize\\TestSize' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestSize/TestSize.php', - 'PHPUnit\\Framework\\TestSize\\Unknown' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestSize/Unknown.php', - 'PHPUnit\\Framework\\TestStatus\\Deprecation' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestStatus/Deprecation.php', - 'PHPUnit\\Framework\\TestStatus\\Error' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestStatus/Error.php', - 'PHPUnit\\Framework\\TestStatus\\Failure' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestStatus/Failure.php', - 'PHPUnit\\Framework\\TestStatus\\Incomplete' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestStatus/Incomplete.php', - 'PHPUnit\\Framework\\TestStatus\\Known' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestStatus/Known.php', - 'PHPUnit\\Framework\\TestStatus\\Notice' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestStatus/Notice.php', - 'PHPUnit\\Framework\\TestStatus\\Risky' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestStatus/Risky.php', - 'PHPUnit\\Framework\\TestStatus\\Skipped' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestStatus/Skipped.php', - 'PHPUnit\\Framework\\TestStatus\\Success' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestStatus/Success.php', - 'PHPUnit\\Framework\\TestStatus\\TestStatus' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestStatus/TestStatus.php', - 'PHPUnit\\Framework\\TestStatus\\Unknown' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestStatus/Unknown.php', - 'PHPUnit\\Framework\\TestStatus\\Warning' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestStatus/Warning.php', - 'PHPUnit\\Framework\\TestSuite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestSuite.php', - 'PHPUnit\\Framework\\TestSuiteIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestSuiteIterator.php', - 'PHPUnit\\Framework\\UnknownClassOrInterfaceException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/UnknownClassOrInterfaceException.php', - 'PHPUnit\\Framework\\UnknownTypeException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/UnknownTypeException.php', - 'PHPUnit\\Logging\\EventLogger' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/EventLogger.php', - 'PHPUnit\\Logging\\JUnit\\JunitXmlLogger' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/JUnit/JunitXmlLogger.php', - 'PHPUnit\\Logging\\JUnit\\Subscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/Subscriber.php', - 'PHPUnit\\Logging\\JUnit\\TestErroredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestErroredSubscriber.php', - 'PHPUnit\\Logging\\JUnit\\TestFailedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestFailedSubscriber.php', - 'PHPUnit\\Logging\\JUnit\\TestFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestFinishedSubscriber.php', - 'PHPUnit\\Logging\\JUnit\\TestMarkedIncompleteSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestMarkedIncompleteSubscriber.php', - 'PHPUnit\\Logging\\JUnit\\TestPreparationFailedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparationFailedSubscriber.php', - 'PHPUnit\\Logging\\JUnit\\TestPreparationStartedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparationStartedSubscriber.php', - 'PHPUnit\\Logging\\JUnit\\TestPreparedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparedSubscriber.php', - 'PHPUnit\\Logging\\JUnit\\TestPrintedUnexpectedOutputSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPrintedUnexpectedOutputSubscriber.php', - 'PHPUnit\\Logging\\JUnit\\TestRunnerExecutionFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestRunnerExecutionFinishedSubscriber.php', - 'PHPUnit\\Logging\\JUnit\\TestSkippedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestSkippedSubscriber.php', - 'PHPUnit\\Logging\\JUnit\\TestSuiteFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestSuiteFinishedSubscriber.php', - 'PHPUnit\\Logging\\JUnit\\TestSuiteStartedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestSuiteStartedSubscriber.php', - 'PHPUnit\\Logging\\TeamCity\\Subscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/Subscriber.php', - 'PHPUnit\\Logging\\TeamCity\\TeamCityLogger' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TeamCity/TeamCityLogger.php', - 'PHPUnit\\Logging\\TeamCity\\TestConsideredRiskySubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestConsideredRiskySubscriber.php', - 'PHPUnit\\Logging\\TeamCity\\TestErroredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestErroredSubscriber.php', - 'PHPUnit\\Logging\\TeamCity\\TestFailedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestFailedSubscriber.php', - 'PHPUnit\\Logging\\TeamCity\\TestFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestFinishedSubscriber.php', - 'PHPUnit\\Logging\\TeamCity\\TestMarkedIncompleteSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestMarkedIncompleteSubscriber.php', - 'PHPUnit\\Logging\\TeamCity\\TestPreparedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestPreparedSubscriber.php', - 'PHPUnit\\Logging\\TeamCity\\TestRunnerExecutionFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestRunnerExecutionFinishedSubscriber.php', - 'PHPUnit\\Logging\\TeamCity\\TestSkippedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSkippedSubscriber.php', - 'PHPUnit\\Logging\\TeamCity\\TestSuiteBeforeFirstTestMethodErroredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteBeforeFirstTestMethodErroredSubscriber.php', - 'PHPUnit\\Logging\\TeamCity\\TestSuiteFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteFinishedSubscriber.php', - 'PHPUnit\\Logging\\TeamCity\\TestSuiteSkippedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteSkippedSubscriber.php', - 'PHPUnit\\Logging\\TeamCity\\TestSuiteStartedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteStartedSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\HtmlRenderer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/HtmlRenderer.php', - 'PHPUnit\\Logging\\TestDox\\NamePrettifier' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/NamePrettifier.php', - 'PHPUnit\\Logging\\TestDox\\PlainTextRenderer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/PlainTextRenderer.php', - 'PHPUnit\\Logging\\TestDox\\Subscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/Subscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestConsideredRiskySubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestConsideredRiskySubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestErroredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestErroredSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestFailedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestFailedSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestFinishedSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestMarkedIncompleteSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestMarkedIncompleteSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestPassedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestPassedSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestPreparedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestPreparedSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestResult' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResult.php', - 'PHPUnit\\Logging\\TestDox\\TestResultCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollection.php', - 'PHPUnit\\Logging\\TestDox\\TestResultCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollectionIterator.php', - 'PHPUnit\\Logging\\TestDox\\TestResultCollector' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollector.php', - 'PHPUnit\\Logging\\TestDox\\TestSkippedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestSkippedSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestTriggeredDeprecationSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredDeprecationSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestTriggeredNoticeSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredNoticeSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestTriggeredPhpDeprecationSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpDeprecationSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestTriggeredPhpNoticeSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpNoticeSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestTriggeredPhpWarningSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpWarningSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestTriggeredPhpunitDeprecationSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpunitDeprecationSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestTriggeredPhpunitErrorSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpunitErrorSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestTriggeredPhpunitWarningSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpunitWarningSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestTriggeredWarningSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredWarningSubscriber.php', - 'PHPUnit\\Metadata\\After' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/After.php', - 'PHPUnit\\Metadata\\AfterClass' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/AfterClass.php', - 'PHPUnit\\Metadata\\Annotation\\Parser\\DocBlock' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Parser/Annotation/DocBlock.php', - 'PHPUnit\\Metadata\\Annotation\\Parser\\Registry' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Parser/Annotation/Registry.php', - 'PHPUnit\\Metadata\\AnnotationsAreNotSupportedForInternalClassesException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Exception/AnnotationsAreNotSupportedForInternalClassesException.php', - 'PHPUnit\\Metadata\\Api\\CodeCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Api/CodeCoverage.php', - 'PHPUnit\\Metadata\\Api\\DataProvider' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Api/DataProvider.php', - 'PHPUnit\\Metadata\\Api\\Dependencies' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Api/Dependencies.php', - 'PHPUnit\\Metadata\\Api\\Groups' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Api/Groups.php', - 'PHPUnit\\Metadata\\Api\\HookMethods' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Api/HookMethods.php', - 'PHPUnit\\Metadata\\Api\\Requirements' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Api/Requirements.php', - 'PHPUnit\\Metadata\\BackupGlobals' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/BackupGlobals.php', - 'PHPUnit\\Metadata\\BackupStaticProperties' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/BackupStaticProperties.php', - 'PHPUnit\\Metadata\\Before' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Before.php', - 'PHPUnit\\Metadata\\BeforeClass' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/BeforeClass.php', - 'PHPUnit\\Metadata\\Covers' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Covers.php', - 'PHPUnit\\Metadata\\CoversClass' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/CoversClass.php', - 'PHPUnit\\Metadata\\CoversDefaultClass' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/CoversDefaultClass.php', - 'PHPUnit\\Metadata\\CoversFunction' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/CoversFunction.php', - 'PHPUnit\\Metadata\\CoversNothing' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/CoversNothing.php', - 'PHPUnit\\Metadata\\DataProvider' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/DataProvider.php', - 'PHPUnit\\Metadata\\DependsOnClass' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/DependsOnClass.php', - 'PHPUnit\\Metadata\\DependsOnMethod' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/DependsOnMethod.php', - 'PHPUnit\\Metadata\\DoesNotPerformAssertions' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/DoesNotPerformAssertions.php', - 'PHPUnit\\Metadata\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Exception/Exception.php', - 'PHPUnit\\Metadata\\ExcludeGlobalVariableFromBackup' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/ExcludeGlobalVariableFromBackup.php', - 'PHPUnit\\Metadata\\ExcludeStaticPropertyFromBackup' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/ExcludeStaticPropertyFromBackup.php', - 'PHPUnit\\Metadata\\Group' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Group.php', - 'PHPUnit\\Metadata\\IgnoreClassForCodeCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/IgnoreClassForCodeCoverage.php', - 'PHPUnit\\Metadata\\IgnoreDeprecations' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/IgnoreDeprecations.php', - 'PHPUnit\\Metadata\\IgnoreFunctionForCodeCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/IgnoreFunctionForCodeCoverage.php', - 'PHPUnit\\Metadata\\IgnoreMethodForCodeCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/IgnoreMethodForCodeCoverage.php', - 'PHPUnit\\Metadata\\InvalidAttributeException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Exception/InvalidAttributeException.php', - 'PHPUnit\\Metadata\\InvalidVersionRequirementException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Exception/InvalidVersionRequirementException.php', - 'PHPUnit\\Metadata\\Metadata' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Metadata.php', - 'PHPUnit\\Metadata\\MetadataCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/MetadataCollection.php', - 'PHPUnit\\Metadata\\MetadataCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/MetadataCollectionIterator.php', - 'PHPUnit\\Metadata\\NoVersionRequirementException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Exception/NoVersionRequirementException.php', - 'PHPUnit\\Metadata\\Parser\\AnnotationParser' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Parser/AnnotationParser.php', - 'PHPUnit\\Metadata\\Parser\\AttributeParser' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Parser/AttributeParser.php', - 'PHPUnit\\Metadata\\Parser\\CachingParser' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Parser/CachingParser.php', - 'PHPUnit\\Metadata\\Parser\\Parser' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Parser/Parser.php', - 'PHPUnit\\Metadata\\Parser\\ParserChain' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Parser/ParserChain.php', - 'PHPUnit\\Metadata\\Parser\\Registry' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Parser/Registry.php', - 'PHPUnit\\Metadata\\PostCondition' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/PostCondition.php', - 'PHPUnit\\Metadata\\PreCondition' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/PreCondition.php', - 'PHPUnit\\Metadata\\PreserveGlobalState' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/PreserveGlobalState.php', - 'PHPUnit\\Metadata\\ReflectionException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Exception/ReflectionException.php', - 'PHPUnit\\Metadata\\RequiresFunction' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/RequiresFunction.php', - 'PHPUnit\\Metadata\\RequiresMethod' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/RequiresMethod.php', - 'PHPUnit\\Metadata\\RequiresOperatingSystem' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/RequiresOperatingSystem.php', - 'PHPUnit\\Metadata\\RequiresOperatingSystemFamily' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/RequiresOperatingSystemFamily.php', - 'PHPUnit\\Metadata\\RequiresPhp' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/RequiresPhp.php', - 'PHPUnit\\Metadata\\RequiresPhpExtension' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/RequiresPhpExtension.php', - 'PHPUnit\\Metadata\\RequiresPhpunit' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/RequiresPhpunit.php', - 'PHPUnit\\Metadata\\RequiresSetting' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/RequiresSetting.php', - 'PHPUnit\\Metadata\\RunClassInSeparateProcess' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/RunClassInSeparateProcess.php', - 'PHPUnit\\Metadata\\RunInSeparateProcess' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/RunInSeparateProcess.php', - 'PHPUnit\\Metadata\\RunTestsInSeparateProcesses' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/RunTestsInSeparateProcesses.php', - 'PHPUnit\\Metadata\\Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Test.php', - 'PHPUnit\\Metadata\\TestDox' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/TestDox.php', - 'PHPUnit\\Metadata\\TestWith' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/TestWith.php', - 'PHPUnit\\Metadata\\Uses' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Uses.php', - 'PHPUnit\\Metadata\\UsesClass' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/UsesClass.php', - 'PHPUnit\\Metadata\\UsesDefaultClass' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/UsesDefaultClass.php', - 'PHPUnit\\Metadata\\UsesFunction' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/UsesFunction.php', - 'PHPUnit\\Metadata\\Version\\ComparisonRequirement' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Version/ComparisonRequirement.php', - 'PHPUnit\\Metadata\\Version\\ConstraintRequirement' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Version/ConstraintRequirement.php', - 'PHPUnit\\Metadata\\Version\\Requirement' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Version/Requirement.php', - 'PHPUnit\\Metadata\\WithoutErrorHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/WithoutErrorHandler.php', - 'PHPUnit\\Runner\\Baseline\\Baseline' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Baseline/Baseline.php', - 'PHPUnit\\Runner\\Baseline\\CannotLoadBaselineException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Baseline/Exception/CannotLoadBaselineException.php', - 'PHPUnit\\Runner\\Baseline\\FileDoesNotHaveLineException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Baseline/Exception/FileDoesNotHaveLineException.php', - 'PHPUnit\\Runner\\Baseline\\Generator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Baseline/Generator.php', - 'PHPUnit\\Runner\\Baseline\\Issue' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Baseline/Issue.php', - 'PHPUnit\\Runner\\Baseline\\Reader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Baseline/Reader.php', - 'PHPUnit\\Runner\\Baseline\\RelativePathCalculator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Baseline/RelativePathCalculator.php', - 'PHPUnit\\Runner\\Baseline\\Subscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Baseline/Subscriber/Subscriber.php', - 'PHPUnit\\Runner\\Baseline\\TestTriggeredDeprecationSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredDeprecationSubscriber.php', - 'PHPUnit\\Runner\\Baseline\\TestTriggeredNoticeSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredNoticeSubscriber.php', - 'PHPUnit\\Runner\\Baseline\\TestTriggeredPhpDeprecationSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredPhpDeprecationSubscriber.php', - 'PHPUnit\\Runner\\Baseline\\TestTriggeredPhpNoticeSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredPhpNoticeSubscriber.php', - 'PHPUnit\\Runner\\Baseline\\TestTriggeredPhpWarningSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredPhpWarningSubscriber.php', - 'PHPUnit\\Runner\\Baseline\\TestTriggeredWarningSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredWarningSubscriber.php', - 'PHPUnit\\Runner\\Baseline\\Writer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Baseline/Writer.php', - 'PHPUnit\\Runner\\ClassCannotBeFoundException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception/ClassCannotBeFoundException.php', - 'PHPUnit\\Runner\\ClassDoesNotExtendTestCaseException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception/ClassDoesNotExtendTestCaseException.php', - 'PHPUnit\\Runner\\ClassIsAbstractException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception/ClassIsAbstractException.php', - 'PHPUnit\\Runner\\CodeCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/CodeCoverage.php', - 'PHPUnit\\Runner\\CodeCoverageFileExistsException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception/CodeCoverageFileExistsException.php', - 'PHPUnit\\Runner\\DirectoryDoesNotExistException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception/DirectoryDoesNotExistException.php', - 'PHPUnit\\Runner\\ErrorException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception/ErrorException.php', - 'PHPUnit\\Runner\\ErrorHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/ErrorHandler.php', - 'PHPUnit\\Runner\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception/Exception.php', - 'PHPUnit\\Runner\\Extension\\Extension' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Extension/Extension.php', - 'PHPUnit\\Runner\\Extension\\ExtensionBootstrapper' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Extension/ExtensionBootstrapper.php', - 'PHPUnit\\Runner\\Extension\\Facade' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Extension/Facade.php', - 'PHPUnit\\Runner\\Extension\\ParameterCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Extension/ParameterCollection.php', - 'PHPUnit\\Runner\\Extension\\PharLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Extension/PharLoader.php', - 'PHPUnit\\Runner\\FileDoesNotExistException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception/FileDoesNotExistException.php', - 'PHPUnit\\Runner\\Filter\\ExcludeGroupFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/ExcludeGroupFilterIterator.php', - 'PHPUnit\\Runner\\Filter\\Factory' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/Factory.php', - 'PHPUnit\\Runner\\Filter\\GroupFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.php', - 'PHPUnit\\Runner\\Filter\\IncludeGroupFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/IncludeGroupFilterIterator.php', - 'PHPUnit\\Runner\\Filter\\NameFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.php', - 'PHPUnit\\Runner\\Filter\\TestIdFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/TestIdFilterIterator.php', - 'PHPUnit\\Runner\\GarbageCollection\\ExecutionFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/ExecutionFinishedSubscriber.php', - 'PHPUnit\\Runner\\GarbageCollection\\ExecutionStartedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/ExecutionStartedSubscriber.php', - 'PHPUnit\\Runner\\GarbageCollection\\GarbageCollectionHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/GarbageCollection/GarbageCollectionHandler.php', - 'PHPUnit\\Runner\\GarbageCollection\\Subscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/Subscriber.php', - 'PHPUnit\\Runner\\GarbageCollection\\TestFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/TestFinishedSubscriber.php', - 'PHPUnit\\Runner\\InvalidOrderException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception/InvalidOrderException.php', - 'PHPUnit\\Runner\\InvalidPhptFileException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception/InvalidPhptFileException.php', - 'PHPUnit\\Runner\\ParameterDoesNotExistException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception/ParameterDoesNotExistException.php', - 'PHPUnit\\Runner\\PhptExternalFileCannotBeLoadedException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception/PhptExternalFileCannotBeLoadedException.php', - 'PHPUnit\\Runner\\PhptTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/PhptTestCase.php', - 'PHPUnit\\Runner\\ResultCache\\DefaultResultCache' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/ResultCache/DefaultResultCache.php', - 'PHPUnit\\Runner\\ResultCache\\NullResultCache' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/ResultCache/NullResultCache.php', - 'PHPUnit\\Runner\\ResultCache\\ResultCache' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/ResultCache/ResultCache.php', - 'PHPUnit\\Runner\\ResultCache\\ResultCacheHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/ResultCache/ResultCacheHandler.php', - 'PHPUnit\\Runner\\ResultCache\\Subscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/Subscriber.php', - 'PHPUnit\\Runner\\ResultCache\\TestConsideredRiskySubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestConsideredRiskySubscriber.php', - 'PHPUnit\\Runner\\ResultCache\\TestErroredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestErroredSubscriber.php', - 'PHPUnit\\Runner\\ResultCache\\TestFailedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestFailedSubscriber.php', - 'PHPUnit\\Runner\\ResultCache\\TestFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestFinishedSubscriber.php', - 'PHPUnit\\Runner\\ResultCache\\TestMarkedIncompleteSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestMarkedIncompleteSubscriber.php', - 'PHPUnit\\Runner\\ResultCache\\TestPreparedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestPreparedSubscriber.php', - 'PHPUnit\\Runner\\ResultCache\\TestSkippedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestSkippedSubscriber.php', - 'PHPUnit\\Runner\\ResultCache\\TestSuiteFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestSuiteFinishedSubscriber.php', - 'PHPUnit\\Runner\\ResultCache\\TestSuiteStartedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestSuiteStartedSubscriber.php', - 'PHPUnit\\Runner\\TestSuiteLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestSuiteLoader.php', - 'PHPUnit\\Runner\\TestSuiteSorter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestSuiteSorter.php', - 'PHPUnit\\Runner\\UnsupportedPhptSectionException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception/UnsupportedPhptSectionException.php', - 'PHPUnit\\Runner\\Version' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Version.php', - 'PHPUnit\\TestRunner\\TestResult\\AfterTestClassMethodErroredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/AfterTestClassMethodErroredSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\BeforeTestClassMethodErroredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/BeforeTestClassMethodErroredSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\Collector' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Collector.php', - 'PHPUnit\\TestRunner\\TestResult\\ExecutionStartedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/ExecutionStartedSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\Facade' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Facade.php', - 'PHPUnit\\TestRunner\\TestResult\\Issues\\Issue' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Issue.php', - 'PHPUnit\\TestRunner\\TestResult\\PassedTests' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/PassedTests.php', - 'PHPUnit\\TestRunner\\TestResult\\Subscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/Subscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestConsideredRiskySubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestConsideredRiskySubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestErroredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestErroredSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestFailedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestFailedSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestFinishedSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestMarkedIncompleteSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestMarkedIncompleteSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestPreparedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestPreparedSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestResult' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/TestResult.php', - 'PHPUnit\\TestRunner\\TestResult\\TestRunnerTriggeredDeprecationSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestRunnerTriggeredDeprecationSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestRunnerTriggeredWarningSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestRunnerTriggeredWarningSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestSkippedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSkippedSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestSuiteFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSuiteFinishedSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestSuiteSkippedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSuiteSkippedSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestSuiteStartedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSuiteStartedSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredDeprecationSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredDeprecationSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredErrorSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredErrorSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredNoticeSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredNoticeSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredPhpDeprecationSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpDeprecationSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredPhpNoticeSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpNoticeSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredPhpWarningSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpWarningSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredPhpunitDeprecationSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpunitDeprecationSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredPhpunitErrorSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpunitErrorSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredPhpunitWarningSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpunitWarningSubscriber.php', - 'PHPUnit\\TestRunner\\TestResult\\TestTriggeredWarningSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredWarningSubscriber.php', - 'PHPUnit\\TextUI\\Application' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Application.php', - 'PHPUnit\\TextUI\\CannotOpenSocketException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Exception/CannotOpenSocketException.php', - 'PHPUnit\\TextUI\\CliArguments\\Builder' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Cli/Builder.php', - 'PHPUnit\\TextUI\\CliArguments\\Configuration' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Cli/Configuration.php', - 'PHPUnit\\TextUI\\CliArguments\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Cli/Exception.php', - 'PHPUnit\\TextUI\\CliArguments\\XmlConfigurationFileFinder' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Cli/XmlConfigurationFileFinder.php', - 'PHPUnit\\TextUI\\Command\\AtLeastVersionCommand' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command/Commands/AtLeastVersionCommand.php', - 'PHPUnit\\TextUI\\Command\\CheckPhpConfigurationCommand' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command/Commands/CheckPhpConfigurationCommand.php', - 'PHPUnit\\TextUI\\Command\\Command' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command/Command.php', - 'PHPUnit\\TextUI\\Command\\GenerateConfigurationCommand' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command/Commands/GenerateConfigurationCommand.php', - 'PHPUnit\\TextUI\\Command\\ListGroupsCommand' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command/Commands/ListGroupsCommand.php', - 'PHPUnit\\TextUI\\Command\\ListTestSuitesCommand' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command/Commands/ListTestSuitesCommand.php', - 'PHPUnit\\TextUI\\Command\\ListTestsAsTextCommand' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command/Commands/ListTestsAsTextCommand.php', - 'PHPUnit\\TextUI\\Command\\ListTestsAsXmlCommand' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command/Commands/ListTestsAsXmlCommand.php', - 'PHPUnit\\TextUI\\Command\\MigrateConfigurationCommand' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command/Commands/MigrateConfigurationCommand.php', - 'PHPUnit\\TextUI\\Command\\Result' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command/Result.php', - 'PHPUnit\\TextUI\\Command\\ShowHelpCommand' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command/Commands/ShowHelpCommand.php', - 'PHPUnit\\TextUI\\Command\\ShowVersionCommand' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command/Commands/ShowVersionCommand.php', - 'PHPUnit\\TextUI\\Command\\VersionCheckCommand' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command/Commands/VersionCheckCommand.php', - 'PHPUnit\\TextUI\\Command\\WarmCodeCoverageCacheCommand' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command/Commands/WarmCodeCoverageCacheCommand.php', - 'PHPUnit\\TextUI\\Configuration\\Builder' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Builder.php', - 'PHPUnit\\TextUI\\Configuration\\CodeCoverageFilterRegistry' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/CodeCoverageFilterRegistry.php', - 'PHPUnit\\TextUI\\Configuration\\CodeCoverageReportNotConfiguredException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Exception/CodeCoverageReportNotConfiguredException.php', - 'PHPUnit\\TextUI\\Configuration\\Configuration' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Configuration.php', - 'PHPUnit\\TextUI\\Configuration\\ConfigurationCannotBeBuiltException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Exception/ConfigurationCannotBeBuiltException.php', - 'PHPUnit\\TextUI\\Configuration\\Constant' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/Constant.php', - 'PHPUnit\\TextUI\\Configuration\\ConstantCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/ConstantCollection.php', - 'PHPUnit\\TextUI\\Configuration\\ConstantCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/ConstantCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\Directory' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/Directory.php', - 'PHPUnit\\TextUI\\Configuration\\DirectoryCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/DirectoryCollection.php', - 'PHPUnit\\TextUI\\Configuration\\DirectoryCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/DirectoryCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Exception/Exception.php', - 'PHPUnit\\TextUI\\Configuration\\ExtensionBootstrap' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/ExtensionBootstrap.php', - 'PHPUnit\\TextUI\\Configuration\\ExtensionBootstrapCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/ExtensionBootstrapCollection.php', - 'PHPUnit\\TextUI\\Configuration\\ExtensionBootstrapCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/ExtensionBootstrapCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\File' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/File.php', - 'PHPUnit\\TextUI\\Configuration\\FileCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/FileCollection.php', - 'PHPUnit\\TextUI\\Configuration\\FileCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/FileCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\FilterDirectory' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/FilterDirectory.php', - 'PHPUnit\\TextUI\\Configuration\\FilterDirectoryCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/FilterDirectoryCollection.php', - 'PHPUnit\\TextUI\\Configuration\\FilterDirectoryCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/FilterDirectoryCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\FilterNotConfiguredException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Exception/FilterNotConfiguredException.php', - 'PHPUnit\\TextUI\\Configuration\\Group' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/Group.php', - 'PHPUnit\\TextUI\\Configuration\\GroupCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/GroupCollection.php', - 'PHPUnit\\TextUI\\Configuration\\GroupCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/GroupCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\IniSetting' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/IniSetting.php', - 'PHPUnit\\TextUI\\Configuration\\IniSettingCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/IniSettingCollection.php', - 'PHPUnit\\TextUI\\Configuration\\IniSettingCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/IniSettingCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\LoggingNotConfiguredException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Exception/LoggingNotConfiguredException.php', - 'PHPUnit\\TextUI\\Configuration\\Merger' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Merger.php', - 'PHPUnit\\TextUI\\Configuration\\NoBaselineException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Exception/NoBaselineException.php', - 'PHPUnit\\TextUI\\Configuration\\NoBootstrapException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Exception/NoBootstrapException.php', - 'PHPUnit\\TextUI\\Configuration\\NoCacheDirectoryException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCacheDirectoryException.php', - 'PHPUnit\\TextUI\\Configuration\\NoCliArgumentException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCliArgumentException.php', - 'PHPUnit\\TextUI\\Configuration\\NoConfigurationFileException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Exception/NoConfigurationFileException.php', - 'PHPUnit\\TextUI\\Configuration\\NoCoverageCacheDirectoryException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCoverageCacheDirectoryException.php', - 'PHPUnit\\TextUI\\Configuration\\NoCustomCssFileException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCustomCssFileException.php', - 'PHPUnit\\TextUI\\Configuration\\NoDefaultTestSuiteException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Exception/NoDefaultTestSuiteException.php', - 'PHPUnit\\TextUI\\Configuration\\NoPharExtensionDirectoryException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Exception/NoPharExtensionDirectoryException.php', - 'PHPUnit\\TextUI\\Configuration\\Php' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/Php.php', - 'PHPUnit\\TextUI\\Configuration\\PhpHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/PhpHandler.php', - 'PHPUnit\\TextUI\\Configuration\\Registry' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Registry.php', - 'PHPUnit\\TextUI\\Configuration\\Source' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/Source.php', - 'PHPUnit\\TextUI\\Configuration\\SourceFilter' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/SourceFilter.php', - 'PHPUnit\\TextUI\\Configuration\\SourceMapper' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/SourceMapper.php', - 'PHPUnit\\TextUI\\Configuration\\TestDirectory' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/TestDirectory.php', - 'PHPUnit\\TextUI\\Configuration\\TestDirectoryCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/TestDirectoryCollection.php', - 'PHPUnit\\TextUI\\Configuration\\TestDirectoryCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/TestDirectoryCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\TestFile' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/TestFile.php', - 'PHPUnit\\TextUI\\Configuration\\TestFileCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/TestFileCollection.php', - 'PHPUnit\\TextUI\\Configuration\\TestFileCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/TestFileCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\TestSuite' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/TestSuite.php', - 'PHPUnit\\TextUI\\Configuration\\TestSuiteBuilder' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/TestSuiteBuilder.php', - 'PHPUnit\\TextUI\\Configuration\\TestSuiteCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/TestSuiteCollection.php', - 'PHPUnit\\TextUI\\Configuration\\TestSuiteCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/TestSuiteCollectionIterator.php', - 'PHPUnit\\TextUI\\Configuration\\Variable' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/Variable.php', - 'PHPUnit\\TextUI\\Configuration\\VariableCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/VariableCollection.php', - 'PHPUnit\\TextUI\\Configuration\\VariableCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Value/VariableCollectionIterator.php', - 'PHPUnit\\TextUI\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Exception/Exception.php', - 'PHPUnit\\TextUI\\Help' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Help.php', - 'PHPUnit\\TextUI\\InvalidSocketException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Exception/InvalidSocketException.php', - 'PHPUnit\\TextUI\\Output\\DefaultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Printer/DefaultPrinter.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\BeforeTestClassMethodErroredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/BeforeTestClassMethodErroredSubscriber.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\ProgressPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/ProgressPrinter.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\Subscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/Subscriber.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestConsideredRiskySubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestConsideredRiskySubscriber.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestErroredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestErroredSubscriber.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestFailedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestFailedSubscriber.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestFinishedSubscriber.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestMarkedIncompleteSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestMarkedIncompleteSubscriber.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestPreparedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestPreparedSubscriber.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestRunnerExecutionStartedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestRunnerExecutionStartedSubscriber.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestSkippedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestSkippedSubscriber.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestTriggeredDeprecationSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredDeprecationSubscriber.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestTriggeredErrorSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredErrorSubscriber.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestTriggeredNoticeSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredNoticeSubscriber.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestTriggeredPhpDeprecationSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpDeprecationSubscriber.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestTriggeredPhpNoticeSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpNoticeSubscriber.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestTriggeredPhpWarningSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpWarningSubscriber.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestTriggeredPhpunitDeprecationSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpunitDeprecationSubscriber.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestTriggeredPhpunitWarningSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpunitWarningSubscriber.php', - 'PHPUnit\\TextUI\\Output\\Default\\ProgressPrinter\\TestTriggeredWarningSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredWarningSubscriber.php', - 'PHPUnit\\TextUI\\Output\\Default\\ResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/ResultPrinter.php', - 'PHPUnit\\TextUI\\Output\\Default\\UnexpectedOutputPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Default/UnexpectedOutputPrinter.php', - 'PHPUnit\\TextUI\\Output\\Facade' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Facade.php', - 'PHPUnit\\TextUI\\Output\\NullPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Printer/NullPrinter.php', - 'PHPUnit\\TextUI\\Output\\Printer' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/Printer/Printer.php', - 'PHPUnit\\TextUI\\Output\\SummaryPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/SummaryPrinter.php', - 'PHPUnit\\TextUI\\Output\\TestDox\\ResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Output/TestDox/ResultPrinter.php', - 'PHPUnit\\TextUI\\RuntimeException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Exception/RuntimeException.php', - 'PHPUnit\\TextUI\\ShellExitCodeCalculator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/ShellExitCodeCalculator.php', - 'PHPUnit\\TextUI\\TestDirectoryNotFoundException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Exception/TestDirectoryNotFoundException.php', - 'PHPUnit\\TextUI\\TestFileNotFoundException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Exception/TestFileNotFoundException.php', - 'PHPUnit\\TextUI\\TestRunner' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/TestRunner.php', - 'PHPUnit\\TextUI\\TestSuiteFilterProcessor' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/TestSuiteFilterProcessor.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\CannotFindSchemaException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Exception/CannotFindSchemaException.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\CodeCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/CodeCoverage.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Clover' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Clover.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Cobertura' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Cobertura.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Crap4j' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Crap4j.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Html' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Html.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Php' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Php.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Text' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Text.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Xml' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Xml.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\Configuration' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Configuration.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\ConvertLogTypes' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/ConvertLogTypes.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\CoverageCloverToReport' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageCloverToReport.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\CoverageCrap4jToReport' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageCrap4jToReport.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\CoverageHtmlToReport' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageHtmlToReport.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\CoveragePhpToReport' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoveragePhpToReport.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\CoverageTextToReport' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageTextToReport.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\CoverageXmlToReport' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageXmlToReport.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\DefaultConfiguration' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/DefaultConfiguration.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Exception.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\FailedSchemaDetectionResult' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/FailedSchemaDetectionResult.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\Generator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Generator.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\Groups' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Groups.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\IntroduceCacheDirectoryAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/IntroduceCacheDirectoryAttribute.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\IntroduceCoverageElement' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/IntroduceCoverageElement.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\LoadedFromFileConfiguration' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/LoadedFromFileConfiguration.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\Loader' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Loader.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\LogToReportMigration' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/LogToReportMigration.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\Logging\\Junit' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/Junit.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\Logging\\Logging' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/Logging.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\Logging\\TeamCity' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/TeamCity.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\Logging\\TestDox\\Html' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/TestDox/Html.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\Logging\\TestDox\\Text' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/TestDox/Text.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\Migration' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/Migration.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\MigrationBuilder' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/MigrationBuilder.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\MigrationException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/MigrationException.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\Migrator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrator.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\MoveAttributesFromFilterWhitelistToCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveAttributesFromFilterWhitelistToCoverage.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\MoveAttributesFromRootToCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveAttributesFromRootToCoverage.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\MoveCoverageDirectoriesToSource' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveCoverageDirectoriesToSource.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\MoveWhitelistExcludesToCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveWhitelistExcludesToCoverage.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\MoveWhitelistIncludesToCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveWhitelistIncludesToCoverage.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\PHPUnit' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/PHPUnit.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveBeStrictAboutResourceUsageDuringSmallTestsAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveBeStrictAboutResourceUsageDuringSmallTestsAttribute.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveBeStrictAboutTodoAnnotatedTestsAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveBeStrictAboutTodoAnnotatedTestsAttribute.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveCacheResultFileAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCacheResultFileAttribute.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveCacheTokensAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCacheTokensAttribute.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveConversionToExceptionsAttributes' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveConversionToExceptionsAttributes.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveCoverageElementCacheDirectoryAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCoverageElementCacheDirectoryAttribute.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveCoverageElementProcessUncoveredFilesAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCoverageElementProcessUncoveredFilesAttribute.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveEmptyFilter' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveEmptyFilter.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveListeners' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveListeners.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveLogTypes' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveLogTypes.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveLoggingElements' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveLoggingElements.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveNoInteractionAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveNoInteractionAttribute.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\RemovePrinterAttributes' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemovePrinterAttributes.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveTestDoxGroupsElement' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveTestDoxGroupsElement.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveTestSuiteLoaderAttributes' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveTestSuiteLoaderAttributes.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveVerboseAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveVerboseAttribute.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\RenameBackupStaticAttributesAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RenameBackupStaticAttributesAttribute.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\RenameBeStrictAboutCoversAnnotationAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RenameBeStrictAboutCoversAnnotationAttribute.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\RenameForceCoversAnnotationAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RenameForceCoversAnnotationAttribute.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\SchemaDetectionResult' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/SchemaDetectionResult.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\SchemaDetector' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/SchemaDetector.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\SchemaFinder' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaFinder.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\SnapshotNodeList' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/SnapshotNodeList.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\SuccessfulSchemaDetectionResult' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/SuccessfulSchemaDetectionResult.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\TestSuiteMapper' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/TestSuiteMapper.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\UpdateSchemaLocation' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/UpdateSchemaLocation.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\ValidationResult' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Validator/ValidationResult.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\Validator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Configuration/Xml/Validator/Validator.php', - 'PHPUnit\\Util\\Cloner' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Cloner.php', - 'PHPUnit\\Util\\Color' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Color.php', - 'PHPUnit\\Util\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Exception/Exception.php', - 'PHPUnit\\Util\\ExcludeList' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/ExcludeList.php', - 'PHPUnit\\Util\\Exporter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Exporter.php', - 'PHPUnit\\Util\\Filesystem' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Filesystem.php', - 'PHPUnit\\Util\\Filter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Filter.php', - 'PHPUnit\\Util\\GlobalState' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/GlobalState.php', - 'PHPUnit\\Util\\Http\\Downloader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Http/Downloader.php', - 'PHPUnit\\Util\\Http\\PhpDownloader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Http/PhpDownloader.php', - 'PHPUnit\\Util\\InvalidDirectoryException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Exception/InvalidDirectoryException.php', - 'PHPUnit\\Util\\InvalidJsonException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Exception/InvalidJsonException.php', - 'PHPUnit\\Util\\InvalidVersionOperatorException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Exception/InvalidVersionOperatorException.php', - 'PHPUnit\\Util\\Json' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Json.php', - 'PHPUnit\\Util\\PHP\\AbstractPhpProcess' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/PHP/AbstractPhpProcess.php', - 'PHPUnit\\Util\\PHP\\DefaultPhpProcess' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/PHP/DefaultPhpProcess.php', - 'PHPUnit\\Util\\PHP\\PhpProcessException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Exception/PhpProcessException.php', - 'PHPUnit\\Util\\Reflection' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Reflection.php', - 'PHPUnit\\Util\\Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Test.php', - 'PHPUnit\\Util\\ThrowableToStringMapper' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/ThrowableToStringMapper.php', - 'PHPUnit\\Util\\VersionComparisonOperator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/VersionComparisonOperator.php', - 'PHPUnit\\Util\\Xml' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Xml/Xml.php', - 'PHPUnit\\Util\\Xml\\Loader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Xml/Loader.php', - 'PHPUnit\\Util\\Xml\\XmlException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Exception/XmlException.php', - 'PharIo\\Manifest\\Application' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Application.php', - 'PharIo\\Manifest\\ApplicationName' => __DIR__ . '/..' . '/phar-io/manifest/src/values/ApplicationName.php', - 'PharIo\\Manifest\\Author' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Author.php', - 'PharIo\\Manifest\\AuthorCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/values/AuthorCollection.php', - 'PharIo\\Manifest\\AuthorCollectionIterator' => __DIR__ . '/..' . '/phar-io/manifest/src/values/AuthorCollectionIterator.php', - 'PharIo\\Manifest\\AuthorElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/AuthorElement.php', - 'PharIo\\Manifest\\AuthorElementCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/AuthorElementCollection.php', - 'PharIo\\Manifest\\BundledComponent' => __DIR__ . '/..' . '/phar-io/manifest/src/values/BundledComponent.php', - 'PharIo\\Manifest\\BundledComponentCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/values/BundledComponentCollection.php', - 'PharIo\\Manifest\\BundledComponentCollectionIterator' => __DIR__ . '/..' . '/phar-io/manifest/src/values/BundledComponentCollectionIterator.php', - 'PharIo\\Manifest\\BundlesElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/BundlesElement.php', - 'PharIo\\Manifest\\ComponentElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ComponentElement.php', - 'PharIo\\Manifest\\ComponentElementCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ComponentElementCollection.php', - 'PharIo\\Manifest\\ContainsElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ContainsElement.php', - 'PharIo\\Manifest\\CopyrightElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/CopyrightElement.php', - 'PharIo\\Manifest\\CopyrightInformation' => __DIR__ . '/..' . '/phar-io/manifest/src/values/CopyrightInformation.php', - 'PharIo\\Manifest\\ElementCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ElementCollection.php', - 'PharIo\\Manifest\\ElementCollectionException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/ElementCollectionException.php', - 'PharIo\\Manifest\\Email' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Email.php', - 'PharIo\\Manifest\\Exception' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/Exception.php', - 'PharIo\\Manifest\\ExtElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ExtElement.php', - 'PharIo\\Manifest\\ExtElementCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ExtElementCollection.php', - 'PharIo\\Manifest\\Extension' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Extension.php', - 'PharIo\\Manifest\\ExtensionElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ExtensionElement.php', - 'PharIo\\Manifest\\InvalidApplicationNameException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/InvalidApplicationNameException.php', - 'PharIo\\Manifest\\InvalidEmailException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/InvalidEmailException.php', - 'PharIo\\Manifest\\InvalidUrlException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/InvalidUrlException.php', - 'PharIo\\Manifest\\Library' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Library.php', - 'PharIo\\Manifest\\License' => __DIR__ . '/..' . '/phar-io/manifest/src/values/License.php', - 'PharIo\\Manifest\\LicenseElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/LicenseElement.php', - 'PharIo\\Manifest\\Manifest' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Manifest.php', - 'PharIo\\Manifest\\ManifestDocument' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ManifestDocument.php', - 'PharIo\\Manifest\\ManifestDocumentException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/ManifestDocumentException.php', - 'PharIo\\Manifest\\ManifestDocumentLoadingException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/ManifestDocumentLoadingException.php', - 'PharIo\\Manifest\\ManifestDocumentMapper' => __DIR__ . '/..' . '/phar-io/manifest/src/ManifestDocumentMapper.php', - 'PharIo\\Manifest\\ManifestDocumentMapperException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/ManifestDocumentMapperException.php', - 'PharIo\\Manifest\\ManifestElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ManifestElement.php', - 'PharIo\\Manifest\\ManifestElementException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/ManifestElementException.php', - 'PharIo\\Manifest\\ManifestLoader' => __DIR__ . '/..' . '/phar-io/manifest/src/ManifestLoader.php', - 'PharIo\\Manifest\\ManifestLoaderException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/ManifestLoaderException.php', - 'PharIo\\Manifest\\ManifestSerializer' => __DIR__ . '/..' . '/phar-io/manifest/src/ManifestSerializer.php', - 'PharIo\\Manifest\\NoEmailAddressException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/NoEmailAddressException.php', - 'PharIo\\Manifest\\PhpElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/PhpElement.php', - 'PharIo\\Manifest\\PhpExtensionRequirement' => __DIR__ . '/..' . '/phar-io/manifest/src/values/PhpExtensionRequirement.php', - 'PharIo\\Manifest\\PhpVersionRequirement' => __DIR__ . '/..' . '/phar-io/manifest/src/values/PhpVersionRequirement.php', - 'PharIo\\Manifest\\Requirement' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Requirement.php', - 'PharIo\\Manifest\\RequirementCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/values/RequirementCollection.php', - 'PharIo\\Manifest\\RequirementCollectionIterator' => __DIR__ . '/..' . '/phar-io/manifest/src/values/RequirementCollectionIterator.php', - 'PharIo\\Manifest\\RequiresElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/RequiresElement.php', - 'PharIo\\Manifest\\Type' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Type.php', - 'PharIo\\Manifest\\Url' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Url.php', - 'PharIo\\Version\\AbstractVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/AbstractVersionConstraint.php', - 'PharIo\\Version\\AndVersionConstraintGroup' => __DIR__ . '/..' . '/phar-io/version/src/constraints/AndVersionConstraintGroup.php', - 'PharIo\\Version\\AnyVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/AnyVersionConstraint.php', - 'PharIo\\Version\\BuildMetaData' => __DIR__ . '/..' . '/phar-io/version/src/BuildMetaData.php', - 'PharIo\\Version\\ExactVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/ExactVersionConstraint.php', - 'PharIo\\Version\\Exception' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/Exception.php', - 'PharIo\\Version\\GreaterThanOrEqualToVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php', - 'PharIo\\Version\\InvalidPreReleaseSuffixException' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php', - 'PharIo\\Version\\InvalidVersionException' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/InvalidVersionException.php', - 'PharIo\\Version\\NoBuildMetaDataException' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/NoBuildMetaDataException.php', - 'PharIo\\Version\\NoPreReleaseSuffixException' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/NoPreReleaseSuffixException.php', - 'PharIo\\Version\\OrVersionConstraintGroup' => __DIR__ . '/..' . '/phar-io/version/src/constraints/OrVersionConstraintGroup.php', - 'PharIo\\Version\\PreReleaseSuffix' => __DIR__ . '/..' . '/phar-io/version/src/PreReleaseSuffix.php', - 'PharIo\\Version\\SpecificMajorAndMinorVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php', - 'PharIo\\Version\\SpecificMajorVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/SpecificMajorVersionConstraint.php', - 'PharIo\\Version\\UnsupportedVersionConstraintException' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/UnsupportedVersionConstraintException.php', - 'PharIo\\Version\\Version' => __DIR__ . '/..' . '/phar-io/version/src/Version.php', - 'PharIo\\Version\\VersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/VersionConstraint.php', - 'PharIo\\Version\\VersionConstraintParser' => __DIR__ . '/..' . '/phar-io/version/src/VersionConstraintParser.php', - 'PharIo\\Version\\VersionConstraintValue' => __DIR__ . '/..' . '/phar-io/version/src/VersionConstraintValue.php', - 'PharIo\\Version\\VersionNumber' => __DIR__ . '/..' . '/phar-io/version/src/VersionNumber.php', - 'PhpParser\\Builder' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder.php', - 'PhpParser\\BuilderFactory' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/BuilderFactory.php', - 'PhpParser\\BuilderHelpers' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/BuilderHelpers.php', - 'PhpParser\\Builder\\ClassConst' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/ClassConst.php', - 'PhpParser\\Builder\\Class_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Class_.php', - 'PhpParser\\Builder\\Declaration' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Declaration.php', - 'PhpParser\\Builder\\EnumCase' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/EnumCase.php', - 'PhpParser\\Builder\\Enum_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Enum_.php', - 'PhpParser\\Builder\\FunctionLike' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php', - 'PhpParser\\Builder\\Function_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Function_.php', - 'PhpParser\\Builder\\Interface_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Interface_.php', - 'PhpParser\\Builder\\Method' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Method.php', - 'PhpParser\\Builder\\Namespace_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php', - 'PhpParser\\Builder\\Param' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Param.php', - 'PhpParser\\Builder\\Property' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Property.php', - 'PhpParser\\Builder\\TraitUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php', - 'PhpParser\\Builder\\TraitUseAdaptation' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php', - 'PhpParser\\Builder\\Trait_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Trait_.php', - 'PhpParser\\Builder\\Use_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Use_.php', - 'PhpParser\\Comment' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Comment.php', - 'PhpParser\\Comment\\Doc' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Comment/Doc.php', - 'PhpParser\\ConstExprEvaluationException' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.php', - 'PhpParser\\ConstExprEvaluator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ConstExprEvaluator.php', - 'PhpParser\\Error' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Error.php', - 'PhpParser\\ErrorHandler' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ErrorHandler.php', - 'PhpParser\\ErrorHandler\\Collecting' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php', - 'PhpParser\\ErrorHandler\\Throwing' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php', - 'PhpParser\\Internal\\DiffElem' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php', - 'PhpParser\\Internal\\Differ' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/Differ.php', - 'PhpParser\\Internal\\PrintableNewAnonClassNode' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php', - 'PhpParser\\Internal\\TokenStream' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php', - 'PhpParser\\JsonDecoder' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/JsonDecoder.php', - 'PhpParser\\Lexer' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer.php', - 'PhpParser\\Lexer\\Emulative' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php', - 'PhpParser\\Lexer\\TokenEmulator\\AttributeEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\CoaleseEqualTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/CoaleseEqualTokenEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\EnumTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/EnumTokenEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\ExplicitOctalEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ExplicitOctalEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\FlexibleDocStringEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FlexibleDocStringEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\FnTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\KeywordEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/KeywordEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\MatchTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\NullsafeTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NullsafeTokenEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\NumericLiteralSeparatorEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\ReadonlyFunctionTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyFunctionTokenEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\ReadonlyTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\ReverseEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReverseEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\TokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php', - 'PhpParser\\NameContext' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NameContext.php', - 'PhpParser\\Node' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node.php', - 'PhpParser\\NodeAbstract' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeAbstract.php', - 'PhpParser\\NodeDumper' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeDumper.php', - 'PhpParser\\NodeFinder' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeFinder.php', - 'PhpParser\\NodeTraverser' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeTraverser.php', - 'PhpParser\\NodeTraverserInterface' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php', - 'PhpParser\\NodeVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor.php', - 'PhpParser\\NodeVisitorAbstract' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php', - 'PhpParser\\NodeVisitor\\CloningVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php', - 'PhpParser\\NodeVisitor\\FindingVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php', - 'PhpParser\\NodeVisitor\\FirstFindingVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php', - 'PhpParser\\NodeVisitor\\NameResolver' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php', - 'PhpParser\\NodeVisitor\\NodeConnectingVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php', - 'PhpParser\\NodeVisitor\\ParentConnectingVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php', - 'PhpParser\\Node\\Arg' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Arg.php', - 'PhpParser\\Node\\Attribute' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Attribute.php', - 'PhpParser\\Node\\AttributeGroup' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php', - 'PhpParser\\Node\\ComplexType' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/ComplexType.php', - 'PhpParser\\Node\\Const_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Const_.php', - 'PhpParser\\Node\\Expr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr.php', - 'PhpParser\\Node\\Expr\\ArrayDimFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php', - 'PhpParser\\Node\\Expr\\ArrayItem' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php', - 'PhpParser\\Node\\Expr\\Array_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php', - 'PhpParser\\Node\\Expr\\ArrowFunction' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php', - 'PhpParser\\Node\\Expr\\Assign' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php', - 'PhpParser\\Node\\Expr\\AssignOp' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php', - 'PhpParser\\Node\\Expr\\AssignOp\\BitwiseAnd' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php', - 'PhpParser\\Node\\Expr\\AssignOp\\BitwiseOr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseOr.php', - 'PhpParser\\Node\\Expr\\AssignOp\\BitwiseXor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseXor.php', - 'PhpParser\\Node\\Expr\\AssignOp\\Coalesce' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Coalesce.php', - 'PhpParser\\Node\\Expr\\AssignOp\\Concat' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Concat.php', - 'PhpParser\\Node\\Expr\\AssignOp\\Div' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Div.php', - 'PhpParser\\Node\\Expr\\AssignOp\\Minus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Minus.php', - 'PhpParser\\Node\\Expr\\AssignOp\\Mod' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mod.php', - 'PhpParser\\Node\\Expr\\AssignOp\\Mul' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mul.php', - 'PhpParser\\Node\\Expr\\AssignOp\\Plus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Plus.php', - 'PhpParser\\Node\\Expr\\AssignOp\\Pow' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Pow.php', - 'PhpParser\\Node\\Expr\\AssignOp\\ShiftLeft' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftLeft.php', - 'PhpParser\\Node\\Expr\\AssignOp\\ShiftRight' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftRight.php', - 'PhpParser\\Node\\Expr\\AssignRef' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php', - 'PhpParser\\Node\\Expr\\BinaryOp' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\BitwiseAnd' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\BitwiseOr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseOr.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\BitwiseXor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseXor.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\BooleanAnd' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanAnd.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\BooleanOr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanOr.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Coalesce' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Coalesce.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Concat' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Concat.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Div' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Div.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Equal' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Equal.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Greater' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Greater.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\GreaterOrEqual' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Identical' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\LogicalAnd' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalAnd.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\LogicalOr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalOr.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\LogicalXor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalXor.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Minus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Minus.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Mod' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mod.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Mul' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mul.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\NotEqual' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotEqual.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\NotIdentical' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotIdentical.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Plus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Plus.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Pow' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pow.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\ShiftLeft' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftLeft.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\ShiftRight' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftRight.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Smaller' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\SmallerOrEqual' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.php', - 'PhpParser\\Node\\Expr\\BinaryOp\\Spaceship' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Spaceship.php', - 'PhpParser\\Node\\Expr\\BitwiseNot' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php', - 'PhpParser\\Node\\Expr\\BooleanNot' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php', - 'PhpParser\\Node\\Expr\\CallLike' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php', - 'PhpParser\\Node\\Expr\\Cast' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php', - 'PhpParser\\Node\\Expr\\Cast\\Array_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php', - 'PhpParser\\Node\\Expr\\Cast\\Bool_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Bool_.php', - 'PhpParser\\Node\\Expr\\Cast\\Double' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.php', - 'PhpParser\\Node\\Expr\\Cast\\Int_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Int_.php', - 'PhpParser\\Node\\Expr\\Cast\\Object_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Object_.php', - 'PhpParser\\Node\\Expr\\Cast\\String_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/String_.php', - 'PhpParser\\Node\\Expr\\Cast\\Unset_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Unset_.php', - 'PhpParser\\Node\\Expr\\ClassConstFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php', - 'PhpParser\\Node\\Expr\\Clone_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php', - 'PhpParser\\Node\\Expr\\Closure' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php', - 'PhpParser\\Node\\Expr\\ClosureUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php', - 'PhpParser\\Node\\Expr\\ConstFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php', - 'PhpParser\\Node\\Expr\\Empty_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php', - 'PhpParser\\Node\\Expr\\Error' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php', - 'PhpParser\\Node\\Expr\\ErrorSuppress' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php', - 'PhpParser\\Node\\Expr\\Eval_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php', - 'PhpParser\\Node\\Expr\\Exit_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php', - 'PhpParser\\Node\\Expr\\FuncCall' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php', - 'PhpParser\\Node\\Expr\\Include_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php', - 'PhpParser\\Node\\Expr\\Instanceof_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php', - 'PhpParser\\Node\\Expr\\Isset_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php', - 'PhpParser\\Node\\Expr\\List_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php', - 'PhpParser\\Node\\Expr\\Match_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.php', - 'PhpParser\\Node\\Expr\\MethodCall' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php', - 'PhpParser\\Node\\Expr\\New_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php', - 'PhpParser\\Node\\Expr\\NullsafeMethodCall' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.php', - 'PhpParser\\Node\\Expr\\NullsafePropertyFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.php', - 'PhpParser\\Node\\Expr\\PostDec' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php', - 'PhpParser\\Node\\Expr\\PostInc' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php', - 'PhpParser\\Node\\Expr\\PreDec' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php', - 'PhpParser\\Node\\Expr\\PreInc' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php', - 'PhpParser\\Node\\Expr\\Print_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php', - 'PhpParser\\Node\\Expr\\PropertyFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php', - 'PhpParser\\Node\\Expr\\ShellExec' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php', - 'PhpParser\\Node\\Expr\\StaticCall' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php', - 'PhpParser\\Node\\Expr\\StaticPropertyFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php', - 'PhpParser\\Node\\Expr\\Ternary' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php', - 'PhpParser\\Node\\Expr\\Throw_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.php', - 'PhpParser\\Node\\Expr\\UnaryMinus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php', - 'PhpParser\\Node\\Expr\\UnaryPlus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php', - 'PhpParser\\Node\\Expr\\Variable' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php', - 'PhpParser\\Node\\Expr\\YieldFrom' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php', - 'PhpParser\\Node\\Expr\\Yield_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php', - 'PhpParser\\Node\\FunctionLike' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php', - 'PhpParser\\Node\\Identifier' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Identifier.php', - 'PhpParser\\Node\\IntersectionType' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php', - 'PhpParser\\Node\\MatchArm' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/MatchArm.php', - 'PhpParser\\Node\\Name' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Name.php', - 'PhpParser\\Node\\Name\\FullyQualified' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php', - 'PhpParser\\Node\\Name\\Relative' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php', - 'PhpParser\\Node\\NullableType' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/NullableType.php', - 'PhpParser\\Node\\Param' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Param.php', - 'PhpParser\\Node\\Scalar' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar.php', - 'PhpParser\\Node\\Scalar\\DNumber' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php', - 'PhpParser\\Node\\Scalar\\Encapsed' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php', - 'PhpParser\\Node\\Scalar\\EncapsedStringPart' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php', - 'PhpParser\\Node\\Scalar\\LNumber' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php', - 'PhpParser\\Node\\Scalar\\MagicConst' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php', - 'PhpParser\\Node\\Scalar\\MagicConst\\Class_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php', - 'PhpParser\\Node\\Scalar\\MagicConst\\Dir' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Dir.php', - 'PhpParser\\Node\\Scalar\\MagicConst\\File' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/File.php', - 'PhpParser\\Node\\Scalar\\MagicConst\\Function_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Function_.php', - 'PhpParser\\Node\\Scalar\\MagicConst\\Line' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.php', - 'PhpParser\\Node\\Scalar\\MagicConst\\Method' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.php', - 'PhpParser\\Node\\Scalar\\MagicConst\\Namespace_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.php', - 'PhpParser\\Node\\Scalar\\MagicConst\\Trait_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.php', - 'PhpParser\\Node\\Scalar\\String_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php', - 'PhpParser\\Node\\Stmt' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt.php', - 'PhpParser\\Node\\Stmt\\Break_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php', - 'PhpParser\\Node\\Stmt\\Case_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php', - 'PhpParser\\Node\\Stmt\\Catch_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php', - 'PhpParser\\Node\\Stmt\\ClassConst' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php', - 'PhpParser\\Node\\Stmt\\ClassLike' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php', - 'PhpParser\\Node\\Stmt\\ClassMethod' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php', - 'PhpParser\\Node\\Stmt\\Class_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php', - 'PhpParser\\Node\\Stmt\\Const_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php', - 'PhpParser\\Node\\Stmt\\Continue_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php', - 'PhpParser\\Node\\Stmt\\DeclareDeclare' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php', - 'PhpParser\\Node\\Stmt\\Declare_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php', - 'PhpParser\\Node\\Stmt\\Do_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php', - 'PhpParser\\Node\\Stmt\\Echo_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php', - 'PhpParser\\Node\\Stmt\\ElseIf_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php', - 'PhpParser\\Node\\Stmt\\Else_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php', - 'PhpParser\\Node\\Stmt\\EnumCase' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.php', - 'PhpParser\\Node\\Stmt\\Enum_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php', - 'PhpParser\\Node\\Stmt\\Expression' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php', - 'PhpParser\\Node\\Stmt\\Finally_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php', - 'PhpParser\\Node\\Stmt\\For_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php', - 'PhpParser\\Node\\Stmt\\Foreach_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php', - 'PhpParser\\Node\\Stmt\\Function_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php', - 'PhpParser\\Node\\Stmt\\Global_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php', - 'PhpParser\\Node\\Stmt\\Goto_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php', - 'PhpParser\\Node\\Stmt\\GroupUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php', - 'PhpParser\\Node\\Stmt\\HaltCompiler' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php', - 'PhpParser\\Node\\Stmt\\If_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php', - 'PhpParser\\Node\\Stmt\\InlineHTML' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php', - 'PhpParser\\Node\\Stmt\\Interface_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php', - 'PhpParser\\Node\\Stmt\\Label' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php', - 'PhpParser\\Node\\Stmt\\Namespace_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php', - 'PhpParser\\Node\\Stmt\\Nop' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php', - 'PhpParser\\Node\\Stmt\\Property' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php', - 'PhpParser\\Node\\Stmt\\PropertyProperty' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php', - 'PhpParser\\Node\\Stmt\\Return_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php', - 'PhpParser\\Node\\Stmt\\StaticVar' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php', - 'PhpParser\\Node\\Stmt\\Static_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php', - 'PhpParser\\Node\\Stmt\\Switch_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php', - 'PhpParser\\Node\\Stmt\\Throw_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php', - 'PhpParser\\Node\\Stmt\\TraitUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php', - 'PhpParser\\Node\\Stmt\\TraitUseAdaptation' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php', - 'PhpParser\\Node\\Stmt\\TraitUseAdaptation\\Alias' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php', - 'PhpParser\\Node\\Stmt\\TraitUseAdaptation\\Precedence' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php', - 'PhpParser\\Node\\Stmt\\Trait_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php', - 'PhpParser\\Node\\Stmt\\TryCatch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php', - 'PhpParser\\Node\\Stmt\\Unset_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php', - 'PhpParser\\Node\\Stmt\\UseUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php', - 'PhpParser\\Node\\Stmt\\Use_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php', - 'PhpParser\\Node\\Stmt\\While_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php', - 'PhpParser\\Node\\UnionType' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/UnionType.php', - 'PhpParser\\Node\\VarLikeIdentifier' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php', - 'PhpParser\\Node\\VariadicPlaceholder' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/VariadicPlaceholder.php', - 'PhpParser\\Parser' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser.php', - 'PhpParser\\ParserAbstract' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ParserAbstract.php', - 'PhpParser\\ParserFactory' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ParserFactory.php', - 'PhpParser\\Parser\\Multiple' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser/Multiple.php', - 'PhpParser\\Parser\\Php5' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser/Php5.php', - 'PhpParser\\Parser\\Php7' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser/Php7.php', - 'PhpParser\\Parser\\Tokens' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser/Tokens.php', - 'PhpParser\\PrettyPrinterAbstract' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php', - 'PhpParser\\PrettyPrinter\\Standard' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php', 'PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', 'Psr\\EventDispatcher\\EventDispatcherInterface' => __DIR__ . '/..' . '/psr/event-dispatcher/src/EventDispatcherInterface.php', 'Psr\\EventDispatcher\\ListenerProviderInterface' => __DIR__ . '/..' . '/psr/event-dispatcher/src/ListenerProviderInterface.php', 'Psr\\EventDispatcher\\StoppableEventInterface' => __DIR__ . '/..' . '/psr/event-dispatcher/src/StoppableEventInterface.php', - 'SebastianBergmann\\CliParser\\AmbiguousOptionException' => __DIR__ . '/..' . '/sebastian/cli-parser/src/exceptions/AmbiguousOptionException.php', - 'SebastianBergmann\\CliParser\\Exception' => __DIR__ . '/..' . '/sebastian/cli-parser/src/exceptions/Exception.php', - 'SebastianBergmann\\CliParser\\OptionDoesNotAllowArgumentException' => __DIR__ . '/..' . '/sebastian/cli-parser/src/exceptions/OptionDoesNotAllowArgumentException.php', - 'SebastianBergmann\\CliParser\\Parser' => __DIR__ . '/..' . '/sebastian/cli-parser/src/Parser.php', - 'SebastianBergmann\\CliParser\\RequiredOptionArgumentMissingException' => __DIR__ . '/..' . '/sebastian/cli-parser/src/exceptions/RequiredOptionArgumentMissingException.php', - 'SebastianBergmann\\CliParser\\UnknownOptionException' => __DIR__ . '/..' . '/sebastian/cli-parser/src/exceptions/UnknownOptionException.php', - 'SebastianBergmann\\CodeCoverage\\BranchAndPathCoverageNotSupportedException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/BranchAndPathCoverageNotSupportedException.php', - 'SebastianBergmann\\CodeCoverage\\CodeCoverage' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage.php', - 'SebastianBergmann\\CodeCoverage\\Data\\ProcessedCodeCoverageData' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Data/ProcessedCodeCoverageData.php', - 'SebastianBergmann\\CodeCoverage\\Data\\RawCodeCoverageData' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Data/RawCodeCoverageData.php', - 'SebastianBergmann\\CodeCoverage\\DeadCodeDetectionNotSupportedException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/DeadCodeDetectionNotSupportedException.php', - 'SebastianBergmann\\CodeCoverage\\Driver\\Driver' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/Driver.php', - 'SebastianBergmann\\CodeCoverage\\Driver\\PathExistsButIsNotDirectoryException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/PathExistsButIsNotDirectoryException.php', - 'SebastianBergmann\\CodeCoverage\\Driver\\PcovDriver' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/PcovDriver.php', - 'SebastianBergmann\\CodeCoverage\\Driver\\PcovNotAvailableException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/PcovNotAvailableException.php', - 'SebastianBergmann\\CodeCoverage\\Driver\\Selector' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/Selector.php', - 'SebastianBergmann\\CodeCoverage\\Driver\\WriteOperationFailedException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/WriteOperationFailedException.php', - 'SebastianBergmann\\CodeCoverage\\Driver\\XdebugDriver' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/XdebugDriver.php', - 'SebastianBergmann\\CodeCoverage\\Driver\\XdebugNotAvailableException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/XdebugNotAvailableException.php', - 'SebastianBergmann\\CodeCoverage\\Driver\\XdebugNotEnabledException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/XdebugNotEnabledException.php', - 'SebastianBergmann\\CodeCoverage\\Exception' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/Exception.php', - 'SebastianBergmann\\CodeCoverage\\FileCouldNotBeWrittenException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/FileCouldNotBeWrittenException.php', - 'SebastianBergmann\\CodeCoverage\\Filter' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Filter.php', - 'SebastianBergmann\\CodeCoverage\\InvalidArgumentException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/InvalidArgumentException.php', - 'SebastianBergmann\\CodeCoverage\\NoCodeCoverageDriverAvailableException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/NoCodeCoverageDriverAvailableException.php', - 'SebastianBergmann\\CodeCoverage\\NoCodeCoverageDriverWithPathCoverageSupportAvailableException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/NoCodeCoverageDriverWithPathCoverageSupportAvailableException.php', - 'SebastianBergmann\\CodeCoverage\\Node\\AbstractNode' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/AbstractNode.php', - 'SebastianBergmann\\CodeCoverage\\Node\\Builder' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/Builder.php', - 'SebastianBergmann\\CodeCoverage\\Node\\CrapIndex' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/CrapIndex.php', - 'SebastianBergmann\\CodeCoverage\\Node\\Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/Directory.php', - 'SebastianBergmann\\CodeCoverage\\Node\\File' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/File.php', - 'SebastianBergmann\\CodeCoverage\\Node\\Iterator' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/Iterator.php', - 'SebastianBergmann\\CodeCoverage\\ParserException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/ParserException.php', - 'SebastianBergmann\\CodeCoverage\\ReflectionException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/ReflectionException.php', - 'SebastianBergmann\\CodeCoverage\\ReportAlreadyFinalizedException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/ReportAlreadyFinalizedException.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Clover' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Clover.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Cobertura' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Cobertura.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Crap4j' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Crap4j.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Colors' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Colors.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Html\\CustomCssFile' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/CustomCssFile.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Dashboard' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Dashboard.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Directory.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Facade' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Facade.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Html\\File' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Renderer' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer.php', - 'SebastianBergmann\\CodeCoverage\\Report\\PHP' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/PHP.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Text' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Text.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Thresholds' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Thresholds.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\BuildInformation' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/BuildInformation.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Coverage' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Coverage.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Directory.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Facade' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Facade.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\File' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/File.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Method' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Method.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Node' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Node.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Project' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Project.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Report' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Report.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Source' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Source.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Tests' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Tests.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Totals' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Totals.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Unit' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Unit.php', - 'SebastianBergmann\\CodeCoverage\\StaticAnalysisCacheNotConfiguredException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/StaticAnalysisCacheNotConfiguredException.php', - 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\CacheWarmer' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/StaticAnalysis/CacheWarmer.php', - 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\CachingFileAnalyser' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/StaticAnalysis/CachingFileAnalyser.php', - 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\CodeUnitFindingVisitor' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/StaticAnalysis/CodeUnitFindingVisitor.php', - 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\ExecutableLinesFindingVisitor' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/StaticAnalysis/ExecutableLinesFindingVisitor.php', - 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\FileAnalyser' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/StaticAnalysis/FileAnalyser.php', - 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\IgnoredLinesFindingVisitor' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/StaticAnalysis/IgnoredLinesFindingVisitor.php', - 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\ParsingFileAnalyser' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/StaticAnalysis/ParsingFileAnalyser.php', - 'SebastianBergmann\\CodeCoverage\\TestIdMissingException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/TestIdMissingException.php', - 'SebastianBergmann\\CodeCoverage\\Test\\TestSize\\Known' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/TestSize/Known.php', - 'SebastianBergmann\\CodeCoverage\\Test\\TestSize\\Large' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/TestSize/Large.php', - 'SebastianBergmann\\CodeCoverage\\Test\\TestSize\\Medium' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/TestSize/Medium.php', - 'SebastianBergmann\\CodeCoverage\\Test\\TestSize\\Small' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/TestSize/Small.php', - 'SebastianBergmann\\CodeCoverage\\Test\\TestSize\\TestSize' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/TestSize/TestSize.php', - 'SebastianBergmann\\CodeCoverage\\Test\\TestSize\\Unknown' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/TestSize/Unknown.php', - 'SebastianBergmann\\CodeCoverage\\Test\\TestStatus\\Failure' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/TestStatus/Failure.php', - 'SebastianBergmann\\CodeCoverage\\Test\\TestStatus\\Known' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/TestStatus/Known.php', - 'SebastianBergmann\\CodeCoverage\\Test\\TestStatus\\Success' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/TestStatus/Success.php', - 'SebastianBergmann\\CodeCoverage\\Test\\TestStatus\\TestStatus' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/TestStatus/TestStatus.php', - 'SebastianBergmann\\CodeCoverage\\Test\\TestStatus\\Unknown' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/TestStatus/Unknown.php', - 'SebastianBergmann\\CodeCoverage\\UnintentionallyCoveredCodeException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/UnintentionallyCoveredCodeException.php', - 'SebastianBergmann\\CodeCoverage\\Util\\DirectoryCouldNotBeCreatedException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/DirectoryCouldNotBeCreatedException.php', - 'SebastianBergmann\\CodeCoverage\\Util\\Filesystem' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Util/Filesystem.php', - 'SebastianBergmann\\CodeCoverage\\Util\\Percentage' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Util/Percentage.php', - 'SebastianBergmann\\CodeCoverage\\Version' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Version.php', - 'SebastianBergmann\\CodeCoverage\\XmlException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/XmlException.php', - 'SebastianBergmann\\CodeUnitReverseLookup\\Wizard' => __DIR__ . '/..' . '/sebastian/code-unit-reverse-lookup/src/Wizard.php', - 'SebastianBergmann\\CodeUnit\\ClassMethodUnit' => __DIR__ . '/..' . '/sebastian/code-unit/src/ClassMethodUnit.php', - 'SebastianBergmann\\CodeUnit\\ClassUnit' => __DIR__ . '/..' . '/sebastian/code-unit/src/ClassUnit.php', - 'SebastianBergmann\\CodeUnit\\CodeUnit' => __DIR__ . '/..' . '/sebastian/code-unit/src/CodeUnit.php', - 'SebastianBergmann\\CodeUnit\\CodeUnitCollection' => __DIR__ . '/..' . '/sebastian/code-unit/src/CodeUnitCollection.php', - 'SebastianBergmann\\CodeUnit\\CodeUnitCollectionIterator' => __DIR__ . '/..' . '/sebastian/code-unit/src/CodeUnitCollectionIterator.php', - 'SebastianBergmann\\CodeUnit\\Exception' => __DIR__ . '/..' . '/sebastian/code-unit/src/exceptions/Exception.php', - 'SebastianBergmann\\CodeUnit\\FileUnit' => __DIR__ . '/..' . '/sebastian/code-unit/src/FileUnit.php', - 'SebastianBergmann\\CodeUnit\\FunctionUnit' => __DIR__ . '/..' . '/sebastian/code-unit/src/FunctionUnit.php', - 'SebastianBergmann\\CodeUnit\\InterfaceMethodUnit' => __DIR__ . '/..' . '/sebastian/code-unit/src/InterfaceMethodUnit.php', - 'SebastianBergmann\\CodeUnit\\InterfaceUnit' => __DIR__ . '/..' . '/sebastian/code-unit/src/InterfaceUnit.php', - 'SebastianBergmann\\CodeUnit\\InvalidCodeUnitException' => __DIR__ . '/..' . '/sebastian/code-unit/src/exceptions/InvalidCodeUnitException.php', - 'SebastianBergmann\\CodeUnit\\Mapper' => __DIR__ . '/..' . '/sebastian/code-unit/src/Mapper.php', - 'SebastianBergmann\\CodeUnit\\NoTraitException' => __DIR__ . '/..' . '/sebastian/code-unit/src/exceptions/NoTraitException.php', - 'SebastianBergmann\\CodeUnit\\ReflectionException' => __DIR__ . '/..' . '/sebastian/code-unit/src/exceptions/ReflectionException.php', - 'SebastianBergmann\\CodeUnit\\TraitMethodUnit' => __DIR__ . '/..' . '/sebastian/code-unit/src/TraitMethodUnit.php', - 'SebastianBergmann\\CodeUnit\\TraitUnit' => __DIR__ . '/..' . '/sebastian/code-unit/src/TraitUnit.php', - 'SebastianBergmann\\Comparator\\ArrayComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ArrayComparator.php', - 'SebastianBergmann\\Comparator\\Comparator' => __DIR__ . '/..' . '/sebastian/comparator/src/Comparator.php', - 'SebastianBergmann\\Comparator\\ComparisonFailure' => __DIR__ . '/..' . '/sebastian/comparator/src/ComparisonFailure.php', - 'SebastianBergmann\\Comparator\\DOMNodeComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/DOMNodeComparator.php', - 'SebastianBergmann\\Comparator\\DateTimeComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/DateTimeComparator.php', - 'SebastianBergmann\\Comparator\\Exception' => __DIR__ . '/..' . '/sebastian/comparator/src/exceptions/Exception.php', - 'SebastianBergmann\\Comparator\\ExceptionComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ExceptionComparator.php', - 'SebastianBergmann\\Comparator\\Factory' => __DIR__ . '/..' . '/sebastian/comparator/src/Factory.php', - 'SebastianBergmann\\Comparator\\MockObjectComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/MockObjectComparator.php', - 'SebastianBergmann\\Comparator\\NumericComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/NumericComparator.php', - 'SebastianBergmann\\Comparator\\ObjectComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ObjectComparator.php', - 'SebastianBergmann\\Comparator\\ResourceComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ResourceComparator.php', - 'SebastianBergmann\\Comparator\\RuntimeException' => __DIR__ . '/..' . '/sebastian/comparator/src/exceptions/RuntimeException.php', - 'SebastianBergmann\\Comparator\\ScalarComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ScalarComparator.php', - 'SebastianBergmann\\Comparator\\SplObjectStorageComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/SplObjectStorageComparator.php', - 'SebastianBergmann\\Comparator\\TypeComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/TypeComparator.php', - 'SebastianBergmann\\Complexity\\Calculator' => __DIR__ . '/..' . '/sebastian/complexity/src/Calculator.php', - 'SebastianBergmann\\Complexity\\Complexity' => __DIR__ . '/..' . '/sebastian/complexity/src/Complexity/Complexity.php', - 'SebastianBergmann\\Complexity\\ComplexityCalculatingVisitor' => __DIR__ . '/..' . '/sebastian/complexity/src/Visitor/ComplexityCalculatingVisitor.php', - 'SebastianBergmann\\Complexity\\ComplexityCollection' => __DIR__ . '/..' . '/sebastian/complexity/src/Complexity/ComplexityCollection.php', - 'SebastianBergmann\\Complexity\\ComplexityCollectionIterator' => __DIR__ . '/..' . '/sebastian/complexity/src/Complexity/ComplexityCollectionIterator.php', - 'SebastianBergmann\\Complexity\\CyclomaticComplexityCalculatingVisitor' => __DIR__ . '/..' . '/sebastian/complexity/src/Visitor/CyclomaticComplexityCalculatingVisitor.php', - 'SebastianBergmann\\Complexity\\Exception' => __DIR__ . '/..' . '/sebastian/complexity/src/Exception/Exception.php', - 'SebastianBergmann\\Complexity\\RuntimeException' => __DIR__ . '/..' . '/sebastian/complexity/src/Exception/RuntimeException.php', - 'SebastianBergmann\\Diff\\Chunk' => __DIR__ . '/..' . '/sebastian/diff/src/Chunk.php', - 'SebastianBergmann\\Diff\\ConfigurationException' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/ConfigurationException.php', - 'SebastianBergmann\\Diff\\Diff' => __DIR__ . '/..' . '/sebastian/diff/src/Diff.php', - 'SebastianBergmann\\Diff\\Differ' => __DIR__ . '/..' . '/sebastian/diff/src/Differ.php', - 'SebastianBergmann\\Diff\\Exception' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/Exception.php', - 'SebastianBergmann\\Diff\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/InvalidArgumentException.php', - 'SebastianBergmann\\Diff\\Line' => __DIR__ . '/..' . '/sebastian/diff/src/Line.php', - 'SebastianBergmann\\Diff\\LongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/LongestCommonSubsequenceCalculator.php', - 'SebastianBergmann\\Diff\\MemoryEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php', - 'SebastianBergmann\\Diff\\Output\\AbstractChunkOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php', - 'SebastianBergmann\\Diff\\Output\\DiffOnlyOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php', - 'SebastianBergmann\\Diff\\Output\\DiffOutputBuilderInterface' => __DIR__ . '/..' . '/sebastian/diff/src/Output/DiffOutputBuilderInterface.php', - 'SebastianBergmann\\Diff\\Output\\StrictUnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php', - 'SebastianBergmann\\Diff\\Output\\UnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php', - 'SebastianBergmann\\Diff\\Parser' => __DIR__ . '/..' . '/sebastian/diff/src/Parser.php', - 'SebastianBergmann\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php', - 'SebastianBergmann\\Environment\\Console' => __DIR__ . '/..' . '/sebastian/environment/src/Console.php', - 'SebastianBergmann\\Environment\\Runtime' => __DIR__ . '/..' . '/sebastian/environment/src/Runtime.php', - 'SebastianBergmann\\Exporter\\Exporter' => __DIR__ . '/..' . '/sebastian/exporter/src/Exporter.php', - 'SebastianBergmann\\FileIterator\\ExcludeIterator' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/ExcludeIterator.php', - 'SebastianBergmann\\FileIterator\\Facade' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Facade.php', - 'SebastianBergmann\\FileIterator\\Factory' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Factory.php', - 'SebastianBergmann\\FileIterator\\Iterator' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Iterator.php', - 'SebastianBergmann\\GlobalState\\CodeExporter' => __DIR__ . '/..' . '/sebastian/global-state/src/CodeExporter.php', - 'SebastianBergmann\\GlobalState\\Exception' => __DIR__ . '/..' . '/sebastian/global-state/src/exceptions/Exception.php', - 'SebastianBergmann\\GlobalState\\ExcludeList' => __DIR__ . '/..' . '/sebastian/global-state/src/ExcludeList.php', - 'SebastianBergmann\\GlobalState\\Restorer' => __DIR__ . '/..' . '/sebastian/global-state/src/Restorer.php', - 'SebastianBergmann\\GlobalState\\RuntimeException' => __DIR__ . '/..' . '/sebastian/global-state/src/exceptions/RuntimeException.php', - 'SebastianBergmann\\GlobalState\\Snapshot' => __DIR__ . '/..' . '/sebastian/global-state/src/Snapshot.php', - 'SebastianBergmann\\Invoker\\Exception' => __DIR__ . '/..' . '/phpunit/php-invoker/src/exceptions/Exception.php', - 'SebastianBergmann\\Invoker\\Invoker' => __DIR__ . '/..' . '/phpunit/php-invoker/src/Invoker.php', - 'SebastianBergmann\\Invoker\\ProcessControlExtensionNotLoadedException' => __DIR__ . '/..' . '/phpunit/php-invoker/src/exceptions/ProcessControlExtensionNotLoadedException.php', - 'SebastianBergmann\\Invoker\\TimeoutException' => __DIR__ . '/..' . '/phpunit/php-invoker/src/exceptions/TimeoutException.php', - 'SebastianBergmann\\LinesOfCode\\Counter' => __DIR__ . '/..' . '/sebastian/lines-of-code/src/Counter.php', - 'SebastianBergmann\\LinesOfCode\\Exception' => __DIR__ . '/..' . '/sebastian/lines-of-code/src/Exception/Exception.php', - 'SebastianBergmann\\LinesOfCode\\IllogicalValuesException' => __DIR__ . '/..' . '/sebastian/lines-of-code/src/Exception/IllogicalValuesException.php', - 'SebastianBergmann\\LinesOfCode\\LineCountingVisitor' => __DIR__ . '/..' . '/sebastian/lines-of-code/src/LineCountingVisitor.php', - 'SebastianBergmann\\LinesOfCode\\LinesOfCode' => __DIR__ . '/..' . '/sebastian/lines-of-code/src/LinesOfCode.php', - 'SebastianBergmann\\LinesOfCode\\NegativeValueException' => __DIR__ . '/..' . '/sebastian/lines-of-code/src/Exception/NegativeValueException.php', - 'SebastianBergmann\\LinesOfCode\\RuntimeException' => __DIR__ . '/..' . '/sebastian/lines-of-code/src/Exception/RuntimeException.php', - 'SebastianBergmann\\ObjectEnumerator\\Enumerator' => __DIR__ . '/..' . '/sebastian/object-enumerator/src/Enumerator.php', - 'SebastianBergmann\\ObjectReflector\\ObjectReflector' => __DIR__ . '/..' . '/sebastian/object-reflector/src/ObjectReflector.php', - 'SebastianBergmann\\RecursionContext\\Context' => __DIR__ . '/..' . '/sebastian/recursion-context/src/Context.php', - 'SebastianBergmann\\Template\\Exception' => __DIR__ . '/..' . '/phpunit/php-text-template/src/exceptions/Exception.php', - 'SebastianBergmann\\Template\\InvalidArgumentException' => __DIR__ . '/..' . '/phpunit/php-text-template/src/exceptions/InvalidArgumentException.php', - 'SebastianBergmann\\Template\\RuntimeException' => __DIR__ . '/..' . '/phpunit/php-text-template/src/exceptions/RuntimeException.php', - 'SebastianBergmann\\Template\\Template' => __DIR__ . '/..' . '/phpunit/php-text-template/src/Template.php', - 'SebastianBergmann\\Timer\\Duration' => __DIR__ . '/..' . '/phpunit/php-timer/src/Duration.php', - 'SebastianBergmann\\Timer\\Exception' => __DIR__ . '/..' . '/phpunit/php-timer/src/exceptions/Exception.php', - 'SebastianBergmann\\Timer\\NoActiveTimerException' => __DIR__ . '/..' . '/phpunit/php-timer/src/exceptions/NoActiveTimerException.php', - 'SebastianBergmann\\Timer\\ResourceUsageFormatter' => __DIR__ . '/..' . '/phpunit/php-timer/src/ResourceUsageFormatter.php', - 'SebastianBergmann\\Timer\\TimeSinceStartOfRequestNotAvailableException' => __DIR__ . '/..' . '/phpunit/php-timer/src/exceptions/TimeSinceStartOfRequestNotAvailableException.php', - 'SebastianBergmann\\Timer\\Timer' => __DIR__ . '/..' . '/phpunit/php-timer/src/Timer.php', - 'SebastianBergmann\\Type\\CallableType' => __DIR__ . '/..' . '/sebastian/type/src/type/CallableType.php', - 'SebastianBergmann\\Type\\Exception' => __DIR__ . '/..' . '/sebastian/type/src/exception/Exception.php', - 'SebastianBergmann\\Type\\FalseType' => __DIR__ . '/..' . '/sebastian/type/src/type/FalseType.php', - 'SebastianBergmann\\Type\\GenericObjectType' => __DIR__ . '/..' . '/sebastian/type/src/type/GenericObjectType.php', - 'SebastianBergmann\\Type\\IntersectionType' => __DIR__ . '/..' . '/sebastian/type/src/type/IntersectionType.php', - 'SebastianBergmann\\Type\\IterableType' => __DIR__ . '/..' . '/sebastian/type/src/type/IterableType.php', - 'SebastianBergmann\\Type\\MixedType' => __DIR__ . '/..' . '/sebastian/type/src/type/MixedType.php', - 'SebastianBergmann\\Type\\NeverType' => __DIR__ . '/..' . '/sebastian/type/src/type/NeverType.php', - 'SebastianBergmann\\Type\\NullType' => __DIR__ . '/..' . '/sebastian/type/src/type/NullType.php', - 'SebastianBergmann\\Type\\ObjectType' => __DIR__ . '/..' . '/sebastian/type/src/type/ObjectType.php', - 'SebastianBergmann\\Type\\Parameter' => __DIR__ . '/..' . '/sebastian/type/src/Parameter.php', - 'SebastianBergmann\\Type\\ReflectionMapper' => __DIR__ . '/..' . '/sebastian/type/src/ReflectionMapper.php', - 'SebastianBergmann\\Type\\RuntimeException' => __DIR__ . '/..' . '/sebastian/type/src/exception/RuntimeException.php', - 'SebastianBergmann\\Type\\SimpleType' => __DIR__ . '/..' . '/sebastian/type/src/type/SimpleType.php', - 'SebastianBergmann\\Type\\StaticType' => __DIR__ . '/..' . '/sebastian/type/src/type/StaticType.php', - 'SebastianBergmann\\Type\\TrueType' => __DIR__ . '/..' . '/sebastian/type/src/type/TrueType.php', - 'SebastianBergmann\\Type\\Type' => __DIR__ . '/..' . '/sebastian/type/src/type/Type.php', - 'SebastianBergmann\\Type\\TypeName' => __DIR__ . '/..' . '/sebastian/type/src/TypeName.php', - 'SebastianBergmann\\Type\\UnionType' => __DIR__ . '/..' . '/sebastian/type/src/type/UnionType.php', - 'SebastianBergmann\\Type\\UnknownType' => __DIR__ . '/..' . '/sebastian/type/src/type/UnknownType.php', - 'SebastianBergmann\\Type\\VoidType' => __DIR__ . '/..' . '/sebastian/type/src/type/VoidType.php', - 'SebastianBergmann\\Version' => __DIR__ . '/..' . '/sebastian/version/src/Version.php', 'Stringable' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', 'Symfony\\Polyfill\\Php80\\Php80' => __DIR__ . '/..' . '/symfony/polyfill-php80/Php80.php', 'Symfony\\Polyfill\\Php80\\PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/PhpToken.php', - 'TheSeer\\Tokenizer\\Exception' => __DIR__ . '/..' . '/theseer/tokenizer/src/Exception.php', - 'TheSeer\\Tokenizer\\NamespaceUri' => __DIR__ . '/..' . '/theseer/tokenizer/src/NamespaceUri.php', - 'TheSeer\\Tokenizer\\NamespaceUriException' => __DIR__ . '/..' . '/theseer/tokenizer/src/NamespaceUriException.php', - 'TheSeer\\Tokenizer\\Token' => __DIR__ . '/..' . '/theseer/tokenizer/src/Token.php', - 'TheSeer\\Tokenizer\\TokenCollection' => __DIR__ . '/..' . '/theseer/tokenizer/src/TokenCollection.php', - 'TheSeer\\Tokenizer\\TokenCollectionException' => __DIR__ . '/..' . '/theseer/tokenizer/src/TokenCollectionException.php', - 'TheSeer\\Tokenizer\\Tokenizer' => __DIR__ . '/..' . '/theseer/tokenizer/src/Tokenizer.php', - 'TheSeer\\Tokenizer\\XMLSerializer' => __DIR__ . '/..' . '/theseer/tokenizer/src/XMLSerializer.php', 'UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', 'ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', - 'WP_Since\\Checker\\CompatibilityChecker' => __DIR__ . '/..' . '/eduardovillao/wp-since/src/Checker/CompatibilityChecker.php', - 'WP_Since\\Resolver\\IgnoreRulesResolver' => __DIR__ . '/..' . '/eduardovillao/wp-since/src/Resolver/IgnoreRulesResolver.php', - 'WP_Since\\Resolver\\InlineIgnoreResolver' => __DIR__ . '/..' . '/eduardovillao/wp-since/src/Resolver/InlineIgnoreResolver.php', - 'WP_Since\\Resolver\\VersionResolver' => __DIR__ . '/..' . '/eduardovillao/wp-since/src/Resolver/VersionResolver.php', - 'WP_Since\\Runner\\PluginCheckCommand' => __DIR__ . '/..' . '/eduardovillao/wp-since/src/Runner/PluginCheckCommand.php', - 'WP_Since\\Scanner\\PluginScanner' => __DIR__ . '/..' . '/eduardovillao/wp-since/src/Scanner/PluginScanner.php', - 'WP_Since\\Scanner\\SymbolExtractorVisitor' => __DIR__ . '/..' . '/eduardovillao/wp-since/src/Scanner/SymbolExtractorVisitor.php', - 'WP_Since\\Scanner\\SymbolHandlers\\FunctionCallHandler' => __DIR__ . '/..' . '/eduardovillao/wp-since/src/Scanner/SymbolHandlers/FunctionCallHandler.php', - 'WP_Since\\Scanner\\SymbolHandlers\\MethodCallHandler' => __DIR__ . '/..' . '/eduardovillao/wp-since/src/Scanner/SymbolHandlers/MethodCallHandler.php', - 'WP_Since\\Scanner\\SymbolHandlers\\NewClassHandler' => __DIR__ . '/..' . '/eduardovillao/wp-since/src/Scanner/SymbolHandlers/NewClassHandler.php', - 'WP_Since\\Scanner\\SymbolHandlers\\StaticCallHandler' => __DIR__ . '/..' . '/eduardovillao/wp-since/src/Scanner/SymbolHandlers/StaticCallHandler.php', - 'WP_Since\\Scanner\\SymbolHandlers\\SymbolHandlerInterface' => __DIR__ . '/..' . '/eduardovillao/wp-since/src/Scanner/SymbolHandlers/SymbolHandlerInterface.php', - 'WP_Since\\Utils\\TablePrinter' => __DIR__ . '/..' . '/eduardovillao/wp-since/src/Utils/TablePrinter.php', - 'WP_Since\\Utils\\VersionHelper' => __DIR__ . '/..' . '/eduardovillao/wp-since/src/Utils/VersionHelper.php', ); public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { - $loader->prefixLengthsPsr4 = ComposerStaticInit5db7b63bf0104878d549f48a1ce8cb76::$prefixLengthsPsr4; - $loader->prefixDirsPsr4 = ComposerStaticInit5db7b63bf0104878d549f48a1ce8cb76::$prefixDirsPsr4; - $loader->classMap = ComposerStaticInit5db7b63bf0104878d549f48a1ce8cb76::$classMap; + $loader->prefixLengthsPsr4 = ComposerStaticInit216e6d5522dd071bc42c5f7c15b28cdc::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInit216e6d5522dd071bc42c5f7c15b28cdc::$prefixDirsPsr4; + $loader->classMap = ComposerStaticInit216e6d5522dd071bc42c5f7c15b28cdc::$classMap; }, null, ClassLoader::class); } diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index 92a515f..38c1992 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -1,104 +1,5 @@ { "packages": [ - { - "name": "dealerdirect/phpcodesniffer-composer-installer", - "version": "v1.2.0", - "version_normalized": "1.2.0.0", - "source": { - "type": "git", - "url": "https://github.com/PHPCSStandards/composer-installer.git", - "reference": "845eb62303d2ca9b289ef216356568ccc075ffd1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/845eb62303d2ca9b289ef216356568ccc075ffd1", - "reference": "845eb62303d2ca9b289ef216356568ccc075ffd1", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^2.2", - "php": ">=5.4", - "squizlabs/php_codesniffer": "^3.1.0 || ^4.0" - }, - "require-dev": { - "composer/composer": "^2.2", - "ext-json": "*", - "ext-zip": "*", - "php-parallel-lint/php-parallel-lint": "^1.4.0", - "phpcompatibility/php-compatibility": "^9.0 || ^10.0.0@dev", - "yoast/phpunit-polyfills": "^1.0" - }, - "time": "2025-11-11T04:32:07+00:00", - "type": "composer-plugin", - "extra": { - "class": "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Franck Nijhof", - "email": "opensource@frenck.dev", - "homepage": "https://frenck.dev", - "role": "Open source developer" - }, - { - "name": "Contributors", - "homepage": "https://github.com/PHPCSStandards/composer-installer/graphs/contributors" - } - ], - "description": "PHP_CodeSniffer Standards Composer Installer Plugin", - "keywords": [ - "PHPCodeSniffer", - "PHP_CodeSniffer", - "code quality", - "codesniffer", - "composer", - "installer", - "phpcbf", - "phpcs", - "plugin", - "qa", - "quality", - "standard", - "standards", - "style guide", - "stylecheck", - "tests" - ], - "support": { - "issues": "https://github.com/PHPCSStandards/composer-installer/issues", - "security": "https://github.com/PHPCSStandards/composer-installer/security/policy", - "source": "https://github.com/PHPCSStandards/composer-installer" - }, - "funding": [ - { - "url": "https://github.com/PHPCSStandards", - "type": "github" - }, - { - "url": "https://github.com/jrfnl", - "type": "github" - }, - { - "url": "https://opencollective.com/php_codesniffer", - "type": "open_collective" - }, - { - "url": "https://thanks.dev/u/gh/phpcsstandards", - "type": "thanks_dev" - } - ], - "install-path": "../dealerdirect/phpcodesniffer-composer-installer" - }, { "name": "dflydev/dot-access-data", "version": "v3.0.3", @@ -177,64 +78,19 @@ }, "install-path": "../dflydev/dot-access-data" }, - { - "name": "eduardovillao/wp-since", - "version": "v1.3.0", - "version_normalized": "1.3.0.0", - "source": { - "type": "git", - "url": "https://github.com/eduardovillao/wp-since.git", - "reference": "c7ad6e49b045f144fbc40a91a45590c3dfd240c2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/eduardovillao/wp-since/zipball/c7ad6e49b045f144fbc40a91a45590c3dfd240c2", - "reference": "c7ad6e49b045f144fbc40a91a45590c3dfd240c2", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^4.15", - "php": ">=7.4" - }, - "require-dev": { - "phpunit/phpunit": "^10.5", - "squizlabs/php_codesniffer": "^3.12" - }, - "time": "2025-05-01T20:03:49+00:00", - "bin": [ - "bin/wp-since" - ], - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Since\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Check WordPress plugin compatibility by analyzing used functions, classes, hooks and comparing against the minimum required WP version.", - "support": { - "issues": "https://github.com/eduardovillao/wp-since/issues", - "source": "https://github.com/eduardovillao/wp-since" - }, - "install-path": "../eduardovillao/wp-since" - }, { "name": "league/commonmark", - "version": "2.8.0", - "version_normalized": "2.8.0.0", + "version": "2.8.2", + "version_normalized": "2.8.2.0", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "4efa10c1e56488e658d10adf7b7b7dcd19940bfb" + "reference": "59fb075d2101740c337c7216e3f32b36c204218b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/4efa10c1e56488e658d10adf7b7b7dcd19940bfb", - "reference": "4efa10c1e56488e658d10adf7b7b7dcd19940bfb", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/59fb075d2101740c337c7216e3f32b36c204218b", + "reference": "59fb075d2101740c337c7216e3f32b36c204218b", "shasum": "" }, "require": { @@ -259,16 +115,16 @@ "phpstan/phpstan": "^1.8.2", "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0", "scrutinizer/ocular": "^1.8.1", - "symfony/finder": "^5.3 | ^6.0 | ^7.0", - "symfony/process": "^5.4 | ^6.0 | ^7.0", - "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0", + "symfony/finder": "^5.3 | ^6.0 | ^7.0 || ^8.0", + "symfony/process": "^5.4 | ^6.0 | ^7.0 || ^8.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0 || ^8.0", "unleashedtech/php-coding-standard": "^3.1.1", "vimeo/psalm": "^4.24.0 || ^5.0.0 || ^6.0.0" }, "suggest": { "symfony/yaml": "v2.3+ required if using the Front Matter extension" }, - "time": "2025-11-26T21:48:24+00:00", + "time": "2026-03-19T13:16:38+00:00", "type": "library", "extra": { "branch-alias": { @@ -417,69 +273,6 @@ ], "install-path": "../league/config" }, - { - "name": "myclabs/deep-copy", - "version": "1.13.4", - "version_normalized": "1.13.4.0", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", - "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "conflict": { - "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3 <3.2.2" - }, - "require-dev": { - "doctrine/collections": "^1.6.8", - "doctrine/common": "^2.13.3 || ^3.2.2", - "phpspec/prophecy": "^1.10", - "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" - }, - "time": "2025-08-01T08:46:24+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "files": [ - "src/DeepCopy/deep_copy.php" - ], - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ], - "support": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" - }, - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" - } - ], - "install-path": "../myclabs/deep-copy" - }, { "name": "nette/schema", "version": "v1.3.3", @@ -640,1091 +433,6 @@ }, "install-path": "../nette/utils" }, - { - "name": "nikic/php-parser", - "version": "v4.19.5", - "version_normalized": "4.19.5.0", - "source": { - "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "51bd93cc741b7fc3d63d20b6bdcd99fdaa359837" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/51bd93cc741b7fc3d63d20b6bdcd99fdaa359837", - "reference": "51bd93cc741b7fc3d63d20b6bdcd99fdaa359837", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": ">=7.1" - }, - "require-dev": { - "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" - }, - "time": "2025-12-06T11:45:25+00:00", - "bin": [ - "bin/php-parse" - ], - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "PhpParser\\": "lib/PhpParser" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Nikita Popov" - } - ], - "description": "A PHP parser written in PHP", - "keywords": [ - "parser", - "php" - ], - "support": { - "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.5" - }, - "install-path": "../nikic/php-parser" - }, - { - "name": "phar-io/manifest", - "version": "2.0.4", - "version_normalized": "2.0.4.0", - "source": { - "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "54750ef60c58e43759730615a392c31c80e23176" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", - "reference": "54750ef60c58e43759730615a392c31c80e23176", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-phar": "*", - "ext-xmlwriter": "*", - "phar-io/version": "^3.0.1", - "php": "^7.2 || ^8.0" - }, - "time": "2024-03-03T12:33:53+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "support": { - "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.4" - }, - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "install-path": "../phar-io/manifest" - }, - { - "name": "phar-io/version", - "version": "3.2.1", - "version_normalized": "3.2.1.0", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "time": "2022-02-21T01:04:05+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Library for handling version information and constraints", - "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.2.1" - }, - "install-path": "../phar-io/version" - }, - { - "name": "phpcompatibility/php-compatibility", - "version": "9.3.5", - "version_normalized": "9.3.5.0", - "source": { - "type": "git", - "url": "https://github.com/PHPCompatibility/PHPCompatibility.git", - "reference": "9fb324479acf6f39452e0655d2429cc0d3914243" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibility/zipball/9fb324479acf6f39452e0655d2429cc0d3914243", - "reference": "9fb324479acf6f39452e0655d2429cc0d3914243", - "shasum": "" - }, - "require": { - "php": ">=5.3", - "squizlabs/php_codesniffer": "^2.3 || ^3.0.2" - }, - "conflict": { - "squizlabs/php_codesniffer": "2.6.2" - }, - "require-dev": { - "phpunit/phpunit": "~4.5 || ^5.0 || ^6.0 || ^7.0" - }, - "suggest": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically.", - "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." - }, - "time": "2019-12-27T09:44:58+00:00", - "type": "phpcodesniffer-standard", - "installation-source": "dist", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-3.0-or-later" - ], - "authors": [ - { - "name": "Wim Godden", - "homepage": "https://github.com/wimg", - "role": "lead" - }, - { - "name": "Juliette Reinders Folmer", - "homepage": "https://github.com/jrfnl", - "role": "lead" - }, - { - "name": "Contributors", - "homepage": "https://github.com/PHPCompatibility/PHPCompatibility/graphs/contributors" - } - ], - "description": "A set of sniffs for PHP_CodeSniffer that checks for PHP cross-version compatibility.", - "homepage": "http://techblog.wimgodden.be/tag/codesniffer/", - "keywords": [ - "compatibility", - "phpcs", - "standards" - ], - "support": { - "issues": "https://github.com/PHPCompatibility/PHPCompatibility/issues", - "source": "https://github.com/PHPCompatibility/PHPCompatibility" - }, - "install-path": "../phpcompatibility/php-compatibility" - }, - { - "name": "phpcompatibility/phpcompatibility-paragonie", - "version": "1.3.4", - "version_normalized": "1.3.4.0", - "source": { - "type": "git", - "url": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie.git", - "reference": "244d7b04fc4bc2117c15f5abe23eb933b5f02bbf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityParagonie/zipball/244d7b04fc4bc2117c15f5abe23eb933b5f02bbf", - "reference": "244d7b04fc4bc2117c15f5abe23eb933b5f02bbf", - "shasum": "" - }, - "require": { - "phpcompatibility/php-compatibility": "^9.0" - }, - "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^1.0", - "paragonie/random_compat": "dev-master", - "paragonie/sodium_compat": "dev-master" - }, - "suggest": { - "dealerdirect/phpcodesniffer-composer-installer": "^1.0 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.", - "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." - }, - "time": "2025-09-19T17:43:28+00:00", - "type": "phpcodesniffer-standard", - "installation-source": "dist", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-3.0-or-later" - ], - "authors": [ - { - "name": "Wim Godden", - "role": "lead" - }, - { - "name": "Juliette Reinders Folmer", - "role": "lead" - } - ], - "description": "A set of rulesets for PHP_CodeSniffer to check for PHP cross-version compatibility issues in projects, while accounting for polyfills provided by the Paragonie polyfill libraries.", - "homepage": "http://phpcompatibility.com/", - "keywords": [ - "compatibility", - "paragonie", - "phpcs", - "polyfill", - "standards", - "static analysis" - ], - "support": { - "issues": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie/issues", - "security": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie/security/policy", - "source": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie" - }, - "funding": [ - { - "url": "https://github.com/PHPCompatibility", - "type": "github" - }, - { - "url": "https://github.com/jrfnl", - "type": "github" - }, - { - "url": "https://opencollective.com/php_codesniffer", - "type": "open_collective" - }, - { - "url": "https://thanks.dev/u/gh/phpcompatibility", - "type": "thanks_dev" - } - ], - "install-path": "../phpcompatibility/phpcompatibility-paragonie" - }, - { - "name": "phpcompatibility/phpcompatibility-wp", - "version": "2.1.8", - "version_normalized": "2.1.8.0", - "source": { - "type": "git", - "url": "https://github.com/PHPCompatibility/PHPCompatibilityWP.git", - "reference": "7c8d18b4d90dac9e86b0869a608fa09158e168fa" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityWP/zipball/7c8d18b4d90dac9e86b0869a608fa09158e168fa", - "reference": "7c8d18b4d90dac9e86b0869a608fa09158e168fa", - "shasum": "" - }, - "require": { - "phpcompatibility/php-compatibility": "^9.0", - "phpcompatibility/phpcompatibility-paragonie": "^1.0", - "squizlabs/php_codesniffer": "^3.3" - }, - "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^1.0" - }, - "suggest": { - "dealerdirect/phpcodesniffer-composer-installer": "^1.0 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.", - "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." - }, - "time": "2025-10-18T00:05:59+00:00", - "type": "phpcodesniffer-standard", - "installation-source": "dist", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-3.0-or-later" - ], - "authors": [ - { - "name": "Wim Godden", - "role": "lead" - }, - { - "name": "Juliette Reinders Folmer", - "role": "lead" - } - ], - "description": "A ruleset for PHP_CodeSniffer to check for PHP cross-version compatibility issues in projects, while accounting for polyfills provided by WordPress.", - "homepage": "http://phpcompatibility.com/", - "keywords": [ - "compatibility", - "phpcs", - "standards", - "static analysis", - "wordpress" - ], - "support": { - "issues": "https://github.com/PHPCompatibility/PHPCompatibilityWP/issues", - "security": "https://github.com/PHPCompatibility/PHPCompatibilityWP/security/policy", - "source": "https://github.com/PHPCompatibility/PHPCompatibilityWP" - }, - "funding": [ - { - "url": "https://github.com/PHPCompatibility", - "type": "github" - }, - { - "url": "https://github.com/jrfnl", - "type": "github" - }, - { - "url": "https://opencollective.com/php_codesniffer", - "type": "open_collective" - }, - { - "url": "https://thanks.dev/u/gh/phpcompatibility", - "type": "thanks_dev" - } - ], - "install-path": "../phpcompatibility/phpcompatibility-wp" - }, - { - "name": "phpcsstandards/phpcsextra", - "version": "1.5.0", - "version_normalized": "1.5.0.0", - "source": { - "type": "git", - "url": "https://github.com/PHPCSStandards/PHPCSExtra.git", - "reference": "b598aa890815b8df16363271b659d73280129101" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHPCSExtra/zipball/b598aa890815b8df16363271b659d73280129101", - "reference": "b598aa890815b8df16363271b659d73280129101", - "shasum": "" - }, - "require": { - "php": ">=5.4", - "phpcsstandards/phpcsutils": "^1.2.0", - "squizlabs/php_codesniffer": "^3.13.5 || ^4.0.1" - }, - "require-dev": { - "php-parallel-lint/php-console-highlighter": "^1.0", - "php-parallel-lint/php-parallel-lint": "^1.4.0", - "phpcsstandards/phpcsdevcs": "^1.2.0", - "phpcsstandards/phpcsdevtools": "^1.2.1", - "phpunit/phpunit": "^4.5 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" - }, - "time": "2025-11-12T23:06:57+00:00", - "type": "phpcodesniffer-standard", - "extra": { - "branch-alias": { - "dev-stable": "1.x-dev", - "dev-develop": "1.x-dev" - } - }, - "installation-source": "dist", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-3.0-or-later" - ], - "authors": [ - { - "name": "Juliette Reinders Folmer", - "homepage": "https://github.com/jrfnl", - "role": "lead" - }, - { - "name": "Contributors", - "homepage": "https://github.com/PHPCSStandards/PHPCSExtra/graphs/contributors" - } - ], - "description": "A collection of sniffs and standards for use with PHP_CodeSniffer.", - "keywords": [ - "PHP_CodeSniffer", - "phpcbf", - "phpcodesniffer-standard", - "phpcs", - "standards", - "static analysis" - ], - "support": { - "issues": "https://github.com/PHPCSStandards/PHPCSExtra/issues", - "security": "https://github.com/PHPCSStandards/PHPCSExtra/security/policy", - "source": "https://github.com/PHPCSStandards/PHPCSExtra" - }, - "funding": [ - { - "url": "https://github.com/PHPCSStandards", - "type": "github" - }, - { - "url": "https://github.com/jrfnl", - "type": "github" - }, - { - "url": "https://opencollective.com/php_codesniffer", - "type": "open_collective" - }, - { - "url": "https://thanks.dev/u/gh/phpcsstandards", - "type": "thanks_dev" - } - ], - "install-path": "../phpcsstandards/phpcsextra" - }, - { - "name": "phpcsstandards/phpcsutils", - "version": "1.2.2", - "version_normalized": "1.2.2.0", - "source": { - "type": "git", - "url": "https://github.com/PHPCSStandards/PHPCSUtils.git", - "reference": "c216317e96c8b3f5932808f9b0f1f7a14e3bbf55" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHPCSUtils/zipball/c216317e96c8b3f5932808f9b0f1f7a14e3bbf55", - "reference": "c216317e96c8b3f5932808f9b0f1f7a14e3bbf55", - "shasum": "" - }, - "require": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.4.1 || ^0.5 || ^0.6.2 || ^0.7 || ^1.0", - "php": ">=5.4", - "squizlabs/php_codesniffer": "^3.13.5 || ^4.0.1" - }, - "require-dev": { - "ext-filter": "*", - "php-parallel-lint/php-console-highlighter": "^1.0", - "php-parallel-lint/php-parallel-lint": "^1.4.0", - "phpcsstandards/phpcsdevcs": "^1.2.0", - "yoast/phpunit-polyfills": "^1.1.0 || ^2.0.0 || ^3.0.0" - }, - "time": "2025-12-08T14:27:58+00:00", - "type": "phpcodesniffer-standard", - "extra": { - "branch-alias": { - "dev-stable": "1.x-dev", - "dev-develop": "1.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "PHPCSUtils/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-3.0-or-later" - ], - "authors": [ - { - "name": "Juliette Reinders Folmer", - "homepage": "https://github.com/jrfnl", - "role": "lead" - }, - { - "name": "Contributors", - "homepage": "https://github.com/PHPCSStandards/PHPCSUtils/graphs/contributors" - } - ], - "description": "A suite of utility functions for use with PHP_CodeSniffer", - "homepage": "https://phpcsutils.com/", - "keywords": [ - "PHP_CodeSniffer", - "phpcbf", - "phpcodesniffer-standard", - "phpcs", - "phpcs3", - "phpcs4", - "standards", - "static analysis", - "tokens", - "utility" - ], - "support": { - "docs": "https://phpcsutils.com/", - "issues": "https://github.com/PHPCSStandards/PHPCSUtils/issues", - "security": "https://github.com/PHPCSStandards/PHPCSUtils/security/policy", - "source": "https://github.com/PHPCSStandards/PHPCSUtils" - }, - "funding": [ - { - "url": "https://github.com/PHPCSStandards", - "type": "github" - }, - { - "url": "https://github.com/jrfnl", - "type": "github" - }, - { - "url": "https://opencollective.com/php_codesniffer", - "type": "open_collective" - }, - { - "url": "https://thanks.dev/u/gh/phpcsstandards", - "type": "thanks_dev" - } - ], - "install-path": "../phpcsstandards/phpcsutils" - }, - { - "name": "phpstan/phpstan", - "version": "1.12.32", - "version_normalized": "1.12.32.0", - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/2770dcdf5078d0b0d53f94317e06affe88419aa8", - "reference": "2770dcdf5078d0b0d53f94317e06affe88419aa8", - "shasum": "" - }, - "require": { - "php": "^7.2|^8.0" - }, - "conflict": { - "phpstan/phpstan-shim": "*" - }, - "time": "2025-09-30T10:16:31+00:00", - "bin": [ - "phpstan", - "phpstan.phar" - ], - "type": "library", - "installation-source": "dist", - "autoload": { - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHPStan - PHP Static Analysis Tool", - "keywords": [ - "dev", - "static analysis" - ], - "support": { - "docs": "https://phpstan.org/user-guide/getting-started", - "forum": "https://github.com/phpstan/phpstan/discussions", - "issues": "https://github.com/phpstan/phpstan/issues", - "security": "https://github.com/phpstan/phpstan/security/policy", - "source": "https://github.com/phpstan/phpstan-src" - }, - "funding": [ - { - "url": "https://github.com/ondrejmirtes", - "type": "github" - }, - { - "url": "https://github.com/phpstan", - "type": "github" - } - ], - "install-path": "../phpstan/phpstan" - }, - { - "name": "phpunit/php-code-coverage", - "version": "10.1.16", - "version_normalized": "10.1.16.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "7e308268858ed6baedc8704a304727d20bc07c77" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e308268858ed6baedc8704a304727d20bc07c77", - "reference": "7e308268858ed6baedc8704a304727d20bc07c77", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-xmlwriter": "*", - "nikic/php-parser": "^4.19.1 || ^5.1.0", - "php": ">=8.1", - "phpunit/php-file-iterator": "^4.1.0", - "phpunit/php-text-template": "^3.0.1", - "sebastian/code-unit-reverse-lookup": "^3.0.0", - "sebastian/complexity": "^3.2.0", - "sebastian/environment": "^6.1.0", - "sebastian/lines-of-code": "^2.0.2", - "sebastian/version": "^4.0.1", - "theseer/tokenizer": "^1.2.3" - }, - "require-dev": { - "phpunit/phpunit": "^10.1" - }, - "suggest": { - "ext-pcov": "PHP extension that provides line coverage", - "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" - }, - "time": "2024-08-22T04:31:57+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "10.1.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.16" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "install-path": "../phpunit/php-code-coverage" - }, - { - "name": "phpunit/php-file-iterator", - "version": "4.1.0", - "version_normalized": "4.1.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", - "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "time": "2023-08-31T06:24:48+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "install-path": "../phpunit/php-file-iterator" - }, - { - "name": "phpunit/php-invoker", - "version": "4.0.0", - "version_normalized": "4.0.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", - "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "ext-pcntl": "*", - "phpunit/phpunit": "^10.0" - }, - "suggest": { - "ext-pcntl": "*" - }, - "time": "2023-02-03T06:56:09+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Invoke callables with a timeout", - "homepage": "https://github.com/sebastianbergmann/php-invoker/", - "keywords": [ - "process" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "install-path": "../phpunit/php-invoker" - }, - { - "name": "phpunit/php-text-template", - "version": "3.0.1", - "version_normalized": "3.0.1.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", - "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "time": "2023-08-31T14:07:24+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "install-path": "../phpunit/php-text-template" - }, - { - "name": "phpunit/php-timer", - "version": "6.0.0", - "version_normalized": "6.0.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", - "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "time": "2023-02-03T06:57:52+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "install-path": "../phpunit/php-timer" - }, - { - "name": "phpunit/phpunit", - "version": "10.5.63", - "version_normalized": "10.5.63.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "33198268dad71e926626b618f3ec3966661e4d90" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/33198268dad71e926626b618f3ec3966661e4d90", - "reference": "33198268dad71e926626b618f3ec3966661e4d90", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.13.4", - "phar-io/manifest": "^2.0.4", - "phar-io/version": "^3.2.1", - "php": ">=8.1", - "phpunit/php-code-coverage": "^10.1.16", - "phpunit/php-file-iterator": "^4.1.0", - "phpunit/php-invoker": "^4.0.0", - "phpunit/php-text-template": "^3.0.1", - "phpunit/php-timer": "^6.0.0", - "sebastian/cli-parser": "^2.0.1", - "sebastian/code-unit": "^2.0.0", - "sebastian/comparator": "^5.0.5", - "sebastian/diff": "^5.1.1", - "sebastian/environment": "^6.1.0", - "sebastian/exporter": "^5.1.4", - "sebastian/global-state": "^6.0.2", - "sebastian/object-enumerator": "^5.0.0", - "sebastian/recursion-context": "^5.0.1", - "sebastian/type": "^4.0.0", - "sebastian/version": "^4.0.1" - }, - "suggest": { - "ext-soap": "To be able to generate mocks based on WSDL files" - }, - "time": "2026-01-27T05:48:37+00:00", - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "10.5-dev" - } - }, - "installation-source": "dist", - "autoload": { - "files": [ - "src/Framework/Assert/Functions.php" - ], - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.63" - }, - "funding": [ - { - "url": "https://phpunit.de/sponsors.html", - "type": "custom" - }, - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", - "type": "tidelift" - } - ], - "install-path": "../phpunit/phpunit" - }, { "name": "psr/event-dispatcher", "version": "1.0.0", @@ -1778,1086 +486,6 @@ }, "install-path": "../psr/event-dispatcher" }, - { - "name": "sebastian/cli-parser", - "version": "2.0.1", - "version_normalized": "2.0.1.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", - "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "time": "2024-03-02T07:12:49+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for parsing CLI options", - "homepage": "https://github.com/sebastianbergmann/cli-parser", - "support": { - "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "install-path": "../sebastian/cli-parser" - }, - { - "name": "sebastian/code-unit", - "version": "2.0.0", - "version_normalized": "2.0.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", - "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "time": "2023-02-03T06:58:43+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the PHP code units", - "homepage": "https://github.com/sebastianbergmann/code-unit", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "install-path": "../sebastian/code-unit" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "3.0.0", - "version_normalized": "3.0.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", - "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "time": "2023-02-03T06:59:15+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "install-path": "../sebastian/code-unit-reverse-lookup" - }, - { - "name": "sebastian/comparator", - "version": "5.0.5", - "version_normalized": "5.0.5.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "55dfef806eb7dfeb6e7a6935601fef866f8ca48d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55dfef806eb7dfeb6e7a6935601fef866f8ca48d", - "reference": "55dfef806eb7dfeb6e7a6935601fef866f8ca48d", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-mbstring": "*", - "php": ">=8.1", - "sebastian/diff": "^5.0", - "sebastian/exporter": "^5.0" - }, - "require-dev": { - "phpunit/phpunit": "^10.5" - }, - "time": "2026-01-24T09:25:16+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "https://github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/comparator/issues", - "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.5" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", - "type": "tidelift" - } - ], - "install-path": "../sebastian/comparator" - }, - { - "name": "sebastian/complexity", - "version": "3.2.0", - "version_normalized": "3.2.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "68ff824baeae169ec9f2137158ee529584553799" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", - "reference": "68ff824baeae169ec9f2137158ee529584553799", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "time": "2023-12-21T08:37:17+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.2-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for calculating the complexity of PHP code units", - "homepage": "https://github.com/sebastianbergmann/complexity", - "support": { - "issues": "https://github.com/sebastianbergmann/complexity/issues", - "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "install-path": "../sebastian/complexity" - }, - { - "name": "sebastian/diff", - "version": "5.1.1", - "version_normalized": "5.1.1.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", - "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0", - "symfony/process": "^6.4" - }, - "time": "2024-03-02T07:15:17+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.1-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/diff/issues", - "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "install-path": "../sebastian/diff" - }, - { - "name": "sebastian/environment", - "version": "6.1.0", - "version_normalized": "6.1.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", - "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "suggest": { - "ext-posix": "*" - }, - "time": "2024-03-23T08:47:14+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.1-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "https://github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/environment/issues", - "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "install-path": "../sebastian/environment" - }, - { - "name": "sebastian/exporter", - "version": "5.1.4", - "version_normalized": "5.1.4.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "0735b90f4da94969541dac1da743446e276defa6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/0735b90f4da94969541dac1da743446e276defa6", - "reference": "0735b90f4da94969541dac1da743446e276defa6", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "php": ">=8.1", - "sebastian/recursion-context": "^5.0" - }, - "require-dev": { - "phpunit/phpunit": "^10.5" - }, - "time": "2025-09-24T06:09:11+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.1-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "https://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/exporter/issues", - "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", - "type": "tidelift" - } - ], - "install-path": "../sebastian/exporter" - }, - { - "name": "sebastian/global-state", - "version": "6.0.2", - "version_normalized": "6.0.2.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", - "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "sebastian/object-reflector": "^3.0", - "sebastian/recursion-context": "^5.0" - }, - "require-dev": { - "ext-dom": "*", - "phpunit/phpunit": "^10.0" - }, - "time": "2024-03-02T07:19:19+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Snapshotting of global state", - "homepage": "https://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/global-state/issues", - "security": "https://github.com/sebastianbergmann/global-state/security/policy", - "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "install-path": "../sebastian/global-state" - }, - { - "name": "sebastian/lines-of-code", - "version": "2.0.2", - "version_normalized": "2.0.2.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", - "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "time": "2023-12-21T08:38:20+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for counting the lines of code in PHP source code", - "homepage": "https://github.com/sebastianbergmann/lines-of-code", - "support": { - "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "install-path": "../sebastian/lines-of-code" - }, - { - "name": "sebastian/object-enumerator", - "version": "5.0.0", - "version_normalized": "5.0.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", - "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "sebastian/object-reflector": "^3.0", - "sebastian/recursion-context": "^5.0" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "time": "2023-02-03T07:08:32+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "install-path": "../sebastian/object-enumerator" - }, - { - "name": "sebastian/object-reflector", - "version": "3.0.0", - "version_normalized": "3.0.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", - "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "time": "2023-02-03T07:06:18+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "install-path": "../sebastian/object-reflector" - }, - { - "name": "sebastian/recursion-context", - "version": "5.0.1", - "version_normalized": "5.0.1.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "47e34210757a2f37a97dcd207d032e1b01e64c7a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/47e34210757a2f37a97dcd207d032e1b01e64c7a", - "reference": "47e34210757a2f37a97dcd207d032e1b01e64c7a", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.5" - }, - "time": "2025-08-10T07:50:56+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "https://github.com/sebastianbergmann/recursion-context", - "support": { - "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", - "type": "tidelift" - } - ], - "install-path": "../sebastian/recursion-context" - }, - { - "name": "sebastian/type", - "version": "4.0.0", - "version_normalized": "4.0.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/type.git", - "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", - "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "time": "2023-02-03T07:10:45+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the types of the PHP type system", - "homepage": "https://github.com/sebastianbergmann/type", - "support": { - "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "install-path": "../sebastian/type" - }, - { - "name": "sebastian/version", - "version": "4.0.1", - "version_normalized": "4.0.1.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", - "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "time": "2023-02-07T11:34:05+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "support": { - "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "install-path": "../sebastian/version" - }, - { - "name": "squizlabs/php_codesniffer", - "version": "3.13.5", - "version_normalized": "3.13.5.0", - "source": { - "type": "git", - "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "0ca86845ce43291e8f5692c7356fccf3bcf02bf4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/0ca86845ce43291e8f5692c7356fccf3bcf02bf4", - "reference": "0ca86845ce43291e8f5692c7356fccf3bcf02bf4", - "shasum": "" - }, - "require": { - "ext-simplexml": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": ">=5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" - }, - "time": "2025-11-04T16:30:35+00:00", - "bin": [ - "bin/phpcbf", - "bin/phpcs" - ], - "type": "library", - "installation-source": "dist", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Greg Sherwood", - "role": "Former lead" - }, - { - "name": "Juliette Reinders Folmer", - "role": "Current lead" - }, - { - "name": "Contributors", - "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" - } - ], - "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", - "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", - "keywords": [ - "phpcs", - "standards", - "static analysis" - ], - "support": { - "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", - "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", - "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", - "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" - }, - "funding": [ - { - "url": "https://github.com/PHPCSStandards", - "type": "github" - }, - { - "url": "https://github.com/jrfnl", - "type": "github" - }, - { - "url": "https://opencollective.com/php_codesniffer", - "type": "open_collective" - }, - { - "url": "https://thanks.dev/u/gh/phpcsstandards", - "type": "thanks_dev" - } - ], - "install-path": "../squizlabs/php_codesniffer" - }, { "name": "symfony/deprecation-contracts", "version": "v3.6.0", @@ -3014,167 +642,8 @@ } ], "install-path": "../symfony/polyfill-php80" - }, - { - "name": "theseer/tokenizer", - "version": "1.3.1", - "version_normalized": "1.3.1.0", - "source": { - "type": "git", - "url": "https://github.com/theseer/tokenizer.git", - "reference": "b7489ce515e168639d17feec34b8847c326b0b3c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c", - "reference": "b7489ce515e168639d17feec34b8847c326b0b3c", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": "^7.2 || ^8.0" - }, - "time": "2025-11-17T20:03:58+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - } - ], - "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "support": { - "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.3.1" - }, - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "install-path": "../theseer/tokenizer" - }, - { - "name": "wp-coding-standards/wpcs", - "version": "3.3.0", - "version_normalized": "3.3.0.0", - "source": { - "type": "git", - "url": "https://github.com/WordPress/WordPress-Coding-Standards.git", - "reference": "7795ec6fa05663d716a549d0b44e47ffc8b0d4a6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/WordPress/WordPress-Coding-Standards/zipball/7795ec6fa05663d716a549d0b44e47ffc8b0d4a6", - "reference": "7795ec6fa05663d716a549d0b44e47ffc8b0d4a6", - "shasum": "" - }, - "require": { - "ext-filter": "*", - "ext-libxml": "*", - "ext-tokenizer": "*", - "ext-xmlreader": "*", - "php": ">=7.2", - "phpcsstandards/phpcsextra": "^1.5.0", - "phpcsstandards/phpcsutils": "^1.1.0", - "squizlabs/php_codesniffer": "^3.13.4" - }, - "require-dev": { - "php-parallel-lint/php-console-highlighter": "^1.0.0", - "php-parallel-lint/php-parallel-lint": "^1.4.0", - "phpcompatibility/php-compatibility": "^10.0.0@dev", - "phpcsstandards/phpcsdevtools": "^1.2.0", - "phpunit/phpunit": "^8.0 || ^9.0" - }, - "suggest": { - "ext-iconv": "For improved results", - "ext-mbstring": "For improved results" - }, - "time": "2025-11-25T12:08:04+00:00", - "type": "phpcodesniffer-standard", - "installation-source": "dist", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Contributors", - "homepage": "https://github.com/WordPress/WordPress-Coding-Standards/graphs/contributors" - } - ], - "description": "PHP_CodeSniffer rules (sniffs) to enforce WordPress coding conventions", - "keywords": [ - "phpcs", - "standards", - "static analysis", - "wordpress" - ], - "support": { - "issues": "https://github.com/WordPress/WordPress-Coding-Standards/issues", - "source": "https://github.com/WordPress/WordPress-Coding-Standards", - "wiki": "https://github.com/WordPress/WordPress-Coding-Standards/wiki" - }, - "funding": [ - { - "url": "https://opencollective.com/php_codesniffer", - "type": "custom" - } - ], - "install-path": "../wp-coding-standards/wpcs" } ], - "dev": true, - "dev-package-names": [ - "dealerdirect/phpcodesniffer-composer-installer", - "eduardovillao/wp-since", - "myclabs/deep-copy", - "nikic/php-parser", - "phar-io/manifest", - "phar-io/version", - "phpcompatibility/php-compatibility", - "phpcompatibility/phpcompatibility-paragonie", - "phpcompatibility/phpcompatibility-wp", - "phpcsstandards/phpcsextra", - "phpcsstandards/phpcsutils", - "phpstan/phpstan", - "phpunit/php-code-coverage", - "phpunit/php-file-iterator", - "phpunit/php-invoker", - "phpunit/php-text-template", - "phpunit/php-timer", - "phpunit/phpunit", - "sebastian/cli-parser", - "sebastian/code-unit", - "sebastian/code-unit-reverse-lookup", - "sebastian/comparator", - "sebastian/complexity", - "sebastian/diff", - "sebastian/environment", - "sebastian/exporter", - "sebastian/global-state", - "sebastian/lines-of-code", - "sebastian/object-enumerator", - "sebastian/object-reflector", - "sebastian/recursion-context", - "sebastian/type", - "sebastian/version", - "squizlabs/php_codesniffer", - "theseer/tokenizer", - "wp-coding-standards/wpcs" - ] + "dev": false, + "dev-package-names": [] } diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php index e687a46..24be988 100644 --- a/vendor/composer/installed.php +++ b/vendor/composer/installed.php @@ -1,24 +1,15 @@ array( 'name' => 'robotstxt/documentation-markdown', - 'pretty_version' => 'dev-main', - 'version' => 'dev-main', - 'reference' => 'c7911a52f403328162659f7318199209c20441db', + 'pretty_version' => '1.0.0+no-version-set', + 'version' => '1.0.0.0', + 'reference' => null, 'type' => 'wordpress-plugin', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), - 'dev' => true, + 'dev' => false, ), 'versions' => array( - 'dealerdirect/phpcodesniffer-composer-installer' => array( - 'pretty_version' => 'v1.2.0', - 'version' => '1.2.0.0', - 'reference' => '845eb62303d2ca9b289ef216356568ccc075ffd1', - 'type' => 'composer-plugin', - 'install_path' => __DIR__ . '/../dealerdirect/phpcodesniffer-composer-installer', - 'aliases' => array(), - 'dev_requirement' => true, - ), 'dflydev/dot-access-data' => array( 'pretty_version' => 'v3.0.3', 'version' => '3.0.3.0', @@ -28,19 +19,10 @@ 'aliases' => array(), 'dev_requirement' => false, ), - 'eduardovillao/wp-since' => array( - 'pretty_version' => 'v1.3.0', - 'version' => '1.3.0.0', - 'reference' => 'c7ad6e49b045f144fbc40a91a45590c3dfd240c2', - 'type' => 'library', - 'install_path' => __DIR__ . '/../eduardovillao/wp-since', - 'aliases' => array(), - 'dev_requirement' => true, - ), 'league/commonmark' => array( - 'pretty_version' => '2.8.0', - 'version' => '2.8.0.0', - 'reference' => '4efa10c1e56488e658d10adf7b7b7dcd19940bfb', + 'pretty_version' => '2.8.2', + 'version' => '2.8.2.0', + 'reference' => '59fb075d2101740c337c7216e3f32b36c204218b', 'type' => 'library', 'install_path' => __DIR__ . '/../league/commonmark', 'aliases' => array(), @@ -55,15 +37,6 @@ 'aliases' => array(), 'dev_requirement' => false, ), - 'myclabs/deep-copy' => array( - 'pretty_version' => '1.13.4', - 'version' => '1.13.4.0', - 'reference' => '07d290f0c47959fd5eed98c95ee5602db07e0b6a', - 'type' => 'library', - 'install_path' => __DIR__ . '/../myclabs/deep-copy', - 'aliases' => array(), - 'dev_requirement' => true, - ), 'nette/schema' => array( 'pretty_version' => 'v1.3.3', 'version' => '1.3.3.0', @@ -82,141 +55,6 @@ 'aliases' => array(), 'dev_requirement' => false, ), - 'nikic/php-parser' => array( - 'pretty_version' => 'v4.19.5', - 'version' => '4.19.5.0', - 'reference' => '51bd93cc741b7fc3d63d20b6bdcd99fdaa359837', - 'type' => 'library', - 'install_path' => __DIR__ . '/../nikic/php-parser', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'phar-io/manifest' => array( - 'pretty_version' => '2.0.4', - 'version' => '2.0.4.0', - 'reference' => '54750ef60c58e43759730615a392c31c80e23176', - 'type' => 'library', - 'install_path' => __DIR__ . '/../phar-io/manifest', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'phar-io/version' => array( - 'pretty_version' => '3.2.1', - 'version' => '3.2.1.0', - 'reference' => '4f7fd7836c6f332bb2933569e566a0d6c4cbed74', - 'type' => 'library', - 'install_path' => __DIR__ . '/../phar-io/version', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'phpcompatibility/php-compatibility' => array( - 'pretty_version' => '9.3.5', - 'version' => '9.3.5.0', - 'reference' => '9fb324479acf6f39452e0655d2429cc0d3914243', - 'type' => 'phpcodesniffer-standard', - 'install_path' => __DIR__ . '/../phpcompatibility/php-compatibility', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'phpcompatibility/phpcompatibility-paragonie' => array( - 'pretty_version' => '1.3.4', - 'version' => '1.3.4.0', - 'reference' => '244d7b04fc4bc2117c15f5abe23eb933b5f02bbf', - 'type' => 'phpcodesniffer-standard', - 'install_path' => __DIR__ . '/../phpcompatibility/phpcompatibility-paragonie', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'phpcompatibility/phpcompatibility-wp' => array( - 'pretty_version' => '2.1.8', - 'version' => '2.1.8.0', - 'reference' => '7c8d18b4d90dac9e86b0869a608fa09158e168fa', - 'type' => 'phpcodesniffer-standard', - 'install_path' => __DIR__ . '/../phpcompatibility/phpcompatibility-wp', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'phpcsstandards/phpcsextra' => array( - 'pretty_version' => '1.5.0', - 'version' => '1.5.0.0', - 'reference' => 'b598aa890815b8df16363271b659d73280129101', - 'type' => 'phpcodesniffer-standard', - 'install_path' => __DIR__ . '/../phpcsstandards/phpcsextra', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'phpcsstandards/phpcsutils' => array( - 'pretty_version' => '1.2.2', - 'version' => '1.2.2.0', - 'reference' => 'c216317e96c8b3f5932808f9b0f1f7a14e3bbf55', - 'type' => 'phpcodesniffer-standard', - 'install_path' => __DIR__ . '/../phpcsstandards/phpcsutils', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'phpstan/phpstan' => array( - 'pretty_version' => '1.12.32', - 'version' => '1.12.32.0', - 'reference' => '2770dcdf5078d0b0d53f94317e06affe88419aa8', - 'type' => 'library', - 'install_path' => __DIR__ . '/../phpstan/phpstan', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'phpunit/php-code-coverage' => array( - 'pretty_version' => '10.1.16', - 'version' => '10.1.16.0', - 'reference' => '7e308268858ed6baedc8704a304727d20bc07c77', - 'type' => 'library', - 'install_path' => __DIR__ . '/../phpunit/php-code-coverage', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'phpunit/php-file-iterator' => array( - 'pretty_version' => '4.1.0', - 'version' => '4.1.0.0', - 'reference' => 'a95037b6d9e608ba092da1b23931e537cadc3c3c', - 'type' => 'library', - 'install_path' => __DIR__ . '/../phpunit/php-file-iterator', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'phpunit/php-invoker' => array( - 'pretty_version' => '4.0.0', - 'version' => '4.0.0.0', - 'reference' => 'f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7', - 'type' => 'library', - 'install_path' => __DIR__ . '/../phpunit/php-invoker', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'phpunit/php-text-template' => array( - 'pretty_version' => '3.0.1', - 'version' => '3.0.1.0', - 'reference' => '0c7b06ff49e3d5072f057eb1fa59258bf287a748', - 'type' => 'library', - 'install_path' => __DIR__ . '/../phpunit/php-text-template', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'phpunit/php-timer' => array( - 'pretty_version' => '6.0.0', - 'version' => '6.0.0.0', - 'reference' => 'e2a2d67966e740530f4a3343fe2e030ffdc1161d', - 'type' => 'library', - 'install_path' => __DIR__ . '/../phpunit/php-timer', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'phpunit/phpunit' => array( - 'pretty_version' => '10.5.63', - 'version' => '10.5.63.0', - 'reference' => '33198268dad71e926626b618f3ec3966661e4d90', - 'type' => 'library', - 'install_path' => __DIR__ . '/../phpunit/phpunit', - 'aliases' => array(), - 'dev_requirement' => true, - ), 'psr/event-dispatcher' => array( 'pretty_version' => '1.0.0', 'version' => '1.0.0.0', @@ -227,158 +65,14 @@ 'dev_requirement' => false, ), 'robotstxt/documentation-markdown' => array( - 'pretty_version' => 'dev-main', - 'version' => 'dev-main', - 'reference' => 'c7911a52f403328162659f7318199209c20441db', + 'pretty_version' => '1.0.0+no-version-set', + 'version' => '1.0.0.0', + 'reference' => null, 'type' => 'wordpress-plugin', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev_requirement' => false, ), - 'sebastian/cli-parser' => array( - 'pretty_version' => '2.0.1', - 'version' => '2.0.1.0', - 'reference' => 'c34583b87e7b7a8055bf6c450c2c77ce32a24084', - 'type' => 'library', - 'install_path' => __DIR__ . '/../sebastian/cli-parser', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'sebastian/code-unit' => array( - 'pretty_version' => '2.0.0', - 'version' => '2.0.0.0', - 'reference' => 'a81fee9eef0b7a76af11d121767abc44c104e503', - 'type' => 'library', - 'install_path' => __DIR__ . '/../sebastian/code-unit', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'sebastian/code-unit-reverse-lookup' => array( - 'pretty_version' => '3.0.0', - 'version' => '3.0.0.0', - 'reference' => '5e3a687f7d8ae33fb362c5c0743794bbb2420a1d', - 'type' => 'library', - 'install_path' => __DIR__ . '/../sebastian/code-unit-reverse-lookup', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'sebastian/comparator' => array( - 'pretty_version' => '5.0.5', - 'version' => '5.0.5.0', - 'reference' => '55dfef806eb7dfeb6e7a6935601fef866f8ca48d', - 'type' => 'library', - 'install_path' => __DIR__ . '/../sebastian/comparator', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'sebastian/complexity' => array( - 'pretty_version' => '3.2.0', - 'version' => '3.2.0.0', - 'reference' => '68ff824baeae169ec9f2137158ee529584553799', - 'type' => 'library', - 'install_path' => __DIR__ . '/../sebastian/complexity', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'sebastian/diff' => array( - 'pretty_version' => '5.1.1', - 'version' => '5.1.1.0', - 'reference' => 'c41e007b4b62af48218231d6c2275e4c9b975b2e', - 'type' => 'library', - 'install_path' => __DIR__ . '/../sebastian/diff', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'sebastian/environment' => array( - 'pretty_version' => '6.1.0', - 'version' => '6.1.0.0', - 'reference' => '8074dbcd93529b357029f5cc5058fd3e43666984', - 'type' => 'library', - 'install_path' => __DIR__ . '/../sebastian/environment', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'sebastian/exporter' => array( - 'pretty_version' => '5.1.4', - 'version' => '5.1.4.0', - 'reference' => '0735b90f4da94969541dac1da743446e276defa6', - 'type' => 'library', - 'install_path' => __DIR__ . '/../sebastian/exporter', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'sebastian/global-state' => array( - 'pretty_version' => '6.0.2', - 'version' => '6.0.2.0', - 'reference' => '987bafff24ecc4c9ac418cab1145b96dd6e9cbd9', - 'type' => 'library', - 'install_path' => __DIR__ . '/../sebastian/global-state', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'sebastian/lines-of-code' => array( - 'pretty_version' => '2.0.2', - 'version' => '2.0.2.0', - 'reference' => '856e7f6a75a84e339195d48c556f23be2ebf75d0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../sebastian/lines-of-code', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'sebastian/object-enumerator' => array( - 'pretty_version' => '5.0.0', - 'version' => '5.0.0.0', - 'reference' => '202d0e344a580d7f7d04b3fafce6933e59dae906', - 'type' => 'library', - 'install_path' => __DIR__ . '/../sebastian/object-enumerator', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'sebastian/object-reflector' => array( - 'pretty_version' => '3.0.0', - 'version' => '3.0.0.0', - 'reference' => '24ed13d98130f0e7122df55d06c5c4942a577957', - 'type' => 'library', - 'install_path' => __DIR__ . '/../sebastian/object-reflector', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'sebastian/recursion-context' => array( - 'pretty_version' => '5.0.1', - 'version' => '5.0.1.0', - 'reference' => '47e34210757a2f37a97dcd207d032e1b01e64c7a', - 'type' => 'library', - 'install_path' => __DIR__ . '/../sebastian/recursion-context', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'sebastian/type' => array( - 'pretty_version' => '4.0.0', - 'version' => '4.0.0.0', - 'reference' => '462699a16464c3944eefc02ebdd77882bd3925bf', - 'type' => 'library', - 'install_path' => __DIR__ . '/../sebastian/type', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'sebastian/version' => array( - 'pretty_version' => '4.0.1', - 'version' => '4.0.1.0', - 'reference' => 'c51fa83a5d8f43f1402e3f32a005e6262244ef17', - 'type' => 'library', - 'install_path' => __DIR__ . '/../sebastian/version', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'squizlabs/php_codesniffer' => array( - 'pretty_version' => '3.13.5', - 'version' => '3.13.5.0', - 'reference' => '0ca86845ce43291e8f5692c7356fccf3bcf02bf4', - 'type' => 'library', - 'install_path' => __DIR__ . '/../squizlabs/php_codesniffer', - 'aliases' => array(), - 'dev_requirement' => true, - ), 'symfony/deprecation-contracts' => array( 'pretty_version' => 'v3.6.0', 'version' => '3.6.0.0', @@ -397,23 +91,5 @@ 'aliases' => array(), 'dev_requirement' => false, ), - 'theseer/tokenizer' => array( - 'pretty_version' => '1.3.1', - 'version' => '1.3.1.0', - 'reference' => 'b7489ce515e168639d17feec34b8847c326b0b3c', - 'type' => 'library', - 'install_path' => __DIR__ . '/../theseer/tokenizer', - 'aliases' => array(), - 'dev_requirement' => true, - ), - 'wp-coding-standards/wpcs' => array( - 'pretty_version' => '3.3.0', - 'version' => '3.3.0.0', - 'reference' => '7795ec6fa05663d716a549d0b44e47ffc8b0d4a6', - 'type' => 'phpcodesniffer-standard', - 'install_path' => __DIR__ . '/../wp-coding-standards/wpcs', - 'aliases' => array(), - 'dev_requirement' => true, - ), ), ); diff --git a/vendor/dealerdirect/phpcodesniffer-composer-installer/CHANGELOG.md b/vendor/dealerdirect/phpcodesniffer-composer-installer/CHANGELOG.md deleted file mode 100644 index 6794ef6..0000000 --- a/vendor/dealerdirect/phpcodesniffer-composer-installer/CHANGELOG.md +++ /dev/null @@ -1,587 +0,0 @@ -# Change Log for the Composer Installer for PHP CodeSniffer - -All notable changes to this project will be documented in this file. - -This projects adheres to [Keep a CHANGELOG](https://keepachangelog.com/) and uses [Semantic Versioning](https://semver.org/). - - -## [Unreleased] - -_Nothing yet._ - - -## [v1.2.0] - 2025-11-11 - -### Changed -- Various housekeeping, including improvements to the documentation and tests. - -### Removed -- Drop support for PHP_CodeSniffer 2.x. Thanks [@jrfnl] ! [#261] - -[#261]: https://github.com/PHPCSStandards/composer-installer/pull/261 - - -## [v1.1.2] - 2025-07-17 - -### Changed -- General housekeeping. - -### Fixed -- [#247]: Potential fatal error when the Composer EventDispatcher is called programmatically from an integration. Thanks [@jrfnl] ! [#248] - -[#247]: https://github.com/PHPCSStandards/composer-installer/issues/247 -[#248]: https://github.com/PHPCSStandards/composer-installer/pull/248 - - -## [v1.1.1] - 2025-06-27 - -### Changed -- Various housekeeping, including improvements to the documentation. - -### Fixed -- [#239]: The PHP_CodeSniffer package could not be always found when running the plugin in a Drupal or Magento setup. Thanks [@jrfnl] ! [#245] - -[#239]: https://github.com/PHPCSStandards/composer-installer/issues/239 -[#245]: https://github.com/PHPCSStandards/composer-installer/pull/245 - - -## [v1.1.0] - 2025-06-24 - -### Changed -- Various housekeeping, including improvements to the documentation and tests. Thanks [@SplotyCode], [@fredden] for contributing! - -### Removed -- Drop support for Composer v1.x. Thanks [@fredden] ! [#230] - -[#230]: https://github.com/PHPCSStandards/composer-installer/pull/230 - - -## [v1.0.0] - 2023-01-05 - -### Breaking changes -- Rename namespace prefix from Dealerdirect to PHPCSStandards by [@jrfnl] in [#191] -- Drop support for PHP 5.3 by [@jrfnl] in [#147] - -### Changed -- Correct grammar in error message by [@fredden] in [#189] -- .gitattributes: sync with current repo state by [@jrfnl] in [#198] -- PHPCSVersions: update URL references by [@jrfnl] in [#161] -- README: remove references to Scrutinizer by [@jrfnl] in [#157] -- Rename references to master branch by [@Potherca] in [#201] -- Update repo references by [@jrfnl] in [#158] -- GH Actions: add builds against Composer 2.2 for PHP 7.2 - 8.x by [@jrfnl] in [#172] -- GH Actions: bust the cache semi-regularly by [@jrfnl] in [#192] -- GH Actions: fix builds on Windows with PHP 8.2 by [@jrfnl] in [#180] -- GH Actions: fix up fail-fast for setup-php by [@jrfnl] in [#195] -- GH Actions: run integration tests against Composer snapshot by [@jrfnl] in [#163] -- GH Actions: run linting against against ubuntu-latest by [@jrfnl] in [#184] -- GH Actions/Securitycheck: update the security checker download by [@jrfnl] in [#178] -- GH Actions/Securitycheck: update the security checker download by [@jrfnl] in [#186] -- GH Actions/Securitycheck: update the security checker download by [@jrfnl] in [#190] -- GH Actions: selectively use fail-fast with setup-php by [@jrfnl] in [#194] -- GH Actions: stop running tests against PHP 5.5/Composer 1.x on Windows (and remove work-arounds) by [@jrfnl] in [#183] -- GH Actions: various tweaks / PHP 8.2 not allowed to fail by [@jrfnl] in [#193] -- GH Actions: version update for various predefined actions by [@jrfnl] in [#170] -- Update YamLint by [@Potherca] in [#173] -- Add initial integration test setup and first few tests by [@jrfnl] in [#153] -- BaseLineTest: stabilize the message checks by [@jrfnl] in [#162] -- PlayNiceWithScriptsTest: wrap output expectation in condition by [@jrfnl] in [#179] -- RegisterExternalStandardsTest: add new tests by [@jrfnl] in [#165] -- RegisterExternalStandardsTest: stabilize test for Composer v1 on Windows with PHP 5.5 by [@jrfnl] in [#171] -- TestCase::executeCliCommand(): retry Composer commands on a particular exception by [@jrfnl] in [#164] -- Tests: add new InstalledPathsOrderTest by [@jrfnl] in [#176] -- Tests: add new InstallUpdateEventsTest and NonInstallUpdateEventsTest by [@jrfnl] in [#174] -- Tests: add new InvalidPackagesTest by [@jrfnl] in [#168] -- Tests: add new PlayNiceWithScriptsTest by [@jrfnl] in [#169] -- Tests: add new PreexistingPHPCSConfigTest by [@jrfnl] in [#166] -- Tests: add new PreexistingPHPCSInstalledPathsConfigTest + bug fix by [@jrfnl] in [#167] -- Tests: add new RemovePluginTest by [@jrfnl] in [#177] -- Tests: add new RootPackageHandlingTest + bugfix by [@jrfnl] in [#175] - -### Fixed -- Plugin: improve feedback by [@jrfnl] in [#182] - -[#147]: https://github.com/PHPCSStandards/composer-installer/pull/147 -[#153]: https://github.com/PHPCSStandards/composer-installer/pull/153 -[#157]: https://github.com/PHPCSStandards/composer-installer/pull/157 -[#158]: https://github.com/PHPCSStandards/composer-installer/pull/158 -[#161]: https://github.com/PHPCSStandards/composer-installer/pull/161 -[#162]: https://github.com/PHPCSStandards/composer-installer/pull/162 -[#163]: https://github.com/PHPCSStandards/composer-installer/pull/163 -[#164]: https://github.com/PHPCSStandards/composer-installer/pull/164 -[#165]: https://github.com/PHPCSStandards/composer-installer/pull/165 -[#166]: https://github.com/PHPCSStandards/composer-installer/pull/166 -[#167]: https://github.com/PHPCSStandards/composer-installer/pull/167 -[#168]: https://github.com/PHPCSStandards/composer-installer/pull/168 -[#169]: https://github.com/PHPCSStandards/composer-installer/pull/169 -[#170]: https://github.com/PHPCSStandards/composer-installer/pull/170 -[#171]: https://github.com/PHPCSStandards/composer-installer/pull/171 -[#172]: https://github.com/PHPCSStandards/composer-installer/pull/172 -[#173]: https://github.com/PHPCSStandards/composer-installer/pull/173 -[#174]: https://github.com/PHPCSStandards/composer-installer/pull/174 -[#175]: https://github.com/PHPCSStandards/composer-installer/pull/175 -[#176]: https://github.com/PHPCSStandards/composer-installer/pull/176 -[#177]: https://github.com/PHPCSStandards/composer-installer/pull/177 -[#178]: https://github.com/PHPCSStandards/composer-installer/pull/178 -[#179]: https://github.com/PHPCSStandards/composer-installer/pull/179 -[#180]: https://github.com/PHPCSStandards/composer-installer/pull/180 -[#182]: https://github.com/PHPCSStandards/composer-installer/pull/182 -[#183]: https://github.com/PHPCSStandards/composer-installer/pull/183 -[#184]: https://github.com/PHPCSStandards/composer-installer/pull/184 -[#186]: https://github.com/PHPCSStandards/composer-installer/pull/186 -[#189]: https://github.com/PHPCSStandards/composer-installer/pull/189 -[#190]: https://github.com/PHPCSStandards/composer-installer/pull/190 -[#191]: https://github.com/PHPCSStandards/composer-installer/pull/191 -[#192]: https://github.com/PHPCSStandards/composer-installer/pull/192 -[#193]: https://github.com/PHPCSStandards/composer-installer/pull/193 -[#194]: https://github.com/PHPCSStandards/composer-installer/pull/194 -[#195]: https://github.com/PHPCSStandards/composer-installer/pull/195 -[#198]: https://github.com/PHPCSStandards/composer-installer/pull/198 -[#201]: https://github.com/PHPCSStandards/composer-installer/pull/201 - - -## [v0.7.2] - 2022-02-04 - -### Changed -- Add details regarding QA automation in CONTRIBUTING.md file. by [@Potherca] in [#133] -- Add mention of Composer and PHP compatibility to project README. by [@Potherca] in [#132] -- Composer: tweak PHPCS version constraint by [@jrfnl] in [#152] -- CONTRIBUTING: remove duplicate code of conduct by [@jrfnl] in [#148] -- Document release process by [@Potherca] in [#118] -- Plugin::loadInstalledPaths(): config-show always shows all by [@jrfnl] in [#154] -- README: minor tweaks by [@jrfnl] in [#149] -- README: update with information about Composer >= 2.2 by [@jrfnl] in [#141] -- Replace deprecated Sensiolabs security checker by [@paras-malhotra] in [#130] -- Stabilize a condition by [@jrfnl] in [#127] -- Update copyright year by [@jrfnl] in [#138] -- Various minor tweaks by [@jrfnl] in [#151] -- Change YamlLint config to prevent "truthy" warning. by [@Potherca] in [#144] -- GH Actions: PHP 8.1 has been released by [@jrfnl] in [#139] -- Travis: line length tweaks by [@jrfnl] in [#128] -- CI: Switch to GH Actions by [@jrfnl] in [#137] -- CI: various updates by [@jrfnl] in [#140] - -[#118]: https://github.com/PHPCSStandards/composer-installer/pull/118 -[#127]: https://github.com/PHPCSStandards/composer-installer/pull/127 -[#128]: https://github.com/PHPCSStandards/composer-installer/pull/128 -[#130]: https://github.com/PHPCSStandards/composer-installer/pull/130 -[#132]: https://github.com/PHPCSStandards/composer-installer/pull/132 -[#133]: https://github.com/PHPCSStandards/composer-installer/pull/133 -[#137]: https://github.com/PHPCSStandards/composer-installer/pull/137 -[#138]: https://github.com/PHPCSStandards/composer-installer/pull/138 -[#139]: https://github.com/PHPCSStandards/composer-installer/pull/139 -[#140]: https://github.com/PHPCSStandards/composer-installer/pull/140 -[#141]: https://github.com/PHPCSStandards/composer-installer/pull/141 -[#144]: https://github.com/PHPCSStandards/composer-installer/pull/144 -[#148]: https://github.com/PHPCSStandards/composer-installer/pull/148 -[#149]: https://github.com/PHPCSStandards/composer-installer/pull/149 -[#151]: https://github.com/PHPCSStandards/composer-installer/pull/151 -[#152]: https://github.com/PHPCSStandards/composer-installer/pull/152 -[#154]: https://github.com/PHPCSStandards/composer-installer/pull/154 - - -## [v0.7.1] - 2020-12-07 - -### Closed issues -- Order of installed_paths inconsistent between runs [#125] -- Maintaining this project and Admin rights [#113] - -### Changed -- Sort list of installed paths before saving for consistency by [@kevinfodness] in [#126] -- Update code of conduct by [@Potherca] in [#117] -- Add remark configuration by [@Potherca] in [#122] -- Travis: add build against PHP 8.0 by [@jrfnl] in [#124] - -### Fixed -- Fixed v4 constraint by [@GrahamCampbell] in [#115] - -[#113]: https://github.com/PHPCSStandards/composer-installer/issues/113 -[#115]: https://github.com/PHPCSStandards/composer-installer/pull/115 -[#117]: https://github.com/PHPCSStandards/composer-installer/pull/117 -[#122]: https://github.com/PHPCSStandards/composer-installer/pull/122 -[#124]: https://github.com/PHPCSStandards/composer-installer/pull/124 -[#125]: https://github.com/PHPCSStandards/composer-installer/issues/125 -[#126]: https://github.com/PHPCSStandards/composer-installer/pull/126 - - -## [v0.7.0] - 2020-06-25 - -### Closed issues -- Composer 2.x compatibility [#108] -- Add link to Packagist on main page [#110] -- Switch from Travis CI .org to .com [#112] - -### Added -- Allow installation on PHP 8 by [@jrfnl] in [#106] -- Support Composer 2.0 by [@jrfnl] in [#111] - -### Changed -- Test with PHPCS 4.x and allow installation when using PHPCS 4.x by [@jrfnl] in [#107] -- Fix case of class name by [@Seldaek] in [#109] - -[#106]: https://github.com/PHPCSStandards/composer-installer/pull/106 -[#107]: https://github.com/PHPCSStandards/composer-installer/pull/107 -[#108]: https://github.com/PHPCSStandards/composer-installer/issues/108 -[#109]: https://github.com/PHPCSStandards/composer-installer/pull/109 -[#110]: https://github.com/PHPCSStandards/composer-installer/issues/110 -[#111]: https://github.com/PHPCSStandards/composer-installer/pull/111 -[#112]: https://github.com/PHPCSStandards/composer-installer/issues/112 - - -## [v0.6.2] - 2020-01-29 - -### Fixed -- Composer scripts/commands broken in 0.6.0 update by [@BrianHenryIE] in [#105] - -[#105]: https://github.com/PHPCSStandards/composer-installer/pull/105 - -## [v0.6.1] - 2020-01-27 - -### Closed issues -- Do not exit with code 1 on uninstall (--no-dev) [#103] - -### Changed -- Readme: minor tweak now 0.6.0 has been released [#102] ([@jrfnl]) - -### Fixed -- [#103]: Fix for issue #103 [#104] ([@Potherca]) - -[#102]: https://github.com/PHPCSStandards/composer-installer/pull/102 -[#103]: https://github.com/PHPCSStandards/composer-installer/issues/103 -[#104]: https://github.com/PHPCSStandards/composer-installer/pull/104 - - -## [v0.6.0] - 2020-01-19 - -### Closed issues -- Composer PHP version appears not to be respected [#79] -- Allow a string value for extra.phpcodesniffer-search-depth [#82] -- Add [@jrfnl] as (co)maintainer to this project [#87] - -### Added -- Add support for a string phpcodesniffer-search-depth config value set via composer config by [@TravisCarden] in [#85] -- Send an exit code when the script terminates by [@jrfnl] in [#93] -- Verify the installed_paths after save by [@jrfnl] in [#97] - -### Changed -- CS: fix compliance with PSR12 by [@jrfnl] in [#88] -- Improve GH issue template by [@jrfnl] in [#94] -- Readme: add section about including this plugin from an external PHPCS standard by [@jrfnl] in [#95] -- Bug report template: further enhancement by [@jrfnl] in [#99] -- Update copyright year. by [@Potherca] in [#101] -- Adding linting jobs in github action by [@mjrider] in [#96] -- GH Actions: minor tweaks: by [@jrfnl] in [#100] -- Travis: disable Xdebug by [@jrfnl] in [#89] -- Travis: test against PHP 7.4, not snapshot by [@jrfnl] in [#90] -- Travis: use a mix of PHPCS versions in the matrix by [@jrfnl] in [#91] -- Update Travis file and fix build by [@Potherca] in [#86] - -### Fixed -- [#79]: Respect PHP version used by Composer and provide better feedback on failure by [@jrfnl] in [#80] -- Bug fix: loadInstalledPaths() very very broken since PHPCS 3.1.0 by [@jrfnl] in [#98] - -[#79]: https://github.com/PHPCSStandards/composer-installer/issues/79 -[#80]: https://github.com/PHPCSStandards/composer-installer/issues/80 -[#82]: https://github.com/PHPCSStandards/composer-installer/issues/82 -[#85]: https://github.com/PHPCSStandards/composer-installer/pull/85 -[#86]: https://github.com/PHPCSStandards/composer-installer/pull/86 -[#87]: https://github.com/PHPCSStandards/composer-installer/issues/87 -[#88]: https://github.com/PHPCSStandards/composer-installer/pull/88 -[#89]: https://github.com/PHPCSStandards/composer-installer/pull/89 -[#90]: https://github.com/PHPCSStandards/composer-installer/pull/90 -[#91]: https://github.com/PHPCSStandards/composer-installer/pull/91 -[#93]: https://github.com/PHPCSStandards/composer-installer/pull/93 -[#94]: https://github.com/PHPCSStandards/composer-installer/pull/94 -[#95]: https://github.com/PHPCSStandards/composer-installer/pull/95 -[#96]: https://github.com/PHPCSStandards/composer-installer/pull/96 -[#97]: https://github.com/PHPCSStandards/composer-installer/pull/97 -[#98]: https://github.com/PHPCSStandards/composer-installer/issues/98 -[#99]: https://github.com/PHPCSStandards/composer-installer/pull/99 -[#100]: https://github.com/PHPCSStandards/composer-installer/pull/100 -[#101]: https://github.com/PHPCSStandards/composer-installer/pull/101 - - -## [v0.5.0] - 2018-10-26 - -### Closed issues -- Scan depth as parameter [#45] -- phpcs: Exit Code: 127 (Command not found) on every Composer command [#48] -- The composer plugin implementation seems to be breaking the composer lifecycle [#49] -- Installation error [#53] -- Broke composer commands when used with wp-cli/package-command [#59] -- Getting a new stable release [#60] -- Support PHP CodeSniffer standards in packages installed outside of the vendor directory [#63] - -### Added -- Adds the ability to set the max depth from the composer.json file by [@Potherca] in [#46] - -### Changed -- Build/PHPCS: update PHPCompatibility repo name by [@jrfnl] in [#54] -- README: remove VersionEye badge by [@jrfnl] in [#55] -- README: replace maintenance badge by [@jrfnl] in [#56] -- Execute phpcs and security-checker from vendor/bin by [@gapple] in [#52] -- PHPCS: various minor tweaks by [@jrfnl] in [#57] -- Travis: various tweaks by [@jrfnl] in [#58] -- Use PHPCompatibility 9.0.0 by [@jrfnl] in [#61] -- Build/Travis: test builds against PHP 7.3 by [@jrfnl] in [#62] -- Updates copyright year by [@frenck] in [#67] -- Enforces PSR12 by [@frenck] in [#66] -- Updates contact information by [@frenck] in [#68] -- Updates README, spelling/grammar, removed Working section by [@frenck] in [#69] -- Replaces ProcessBuilder by ProcessExecutor by [@frenck] in [#70] -- Refactors relative path logic by [@frenck] in [#71] -- Removes suggested packages by [@frenck] in [#72] -- Ensures absolute paths during detection phase by [@frenck] in [#73] -- Trivial code cleanup by [@frenck] in [#74] -- Fixes duplicate declaration of cwd by [@frenck] in [#75] -- Removes HHVM from TravisCI by [@frenck] in [#76] -- Adds PHP_CodeSniffer version constraints by [@frenck] in [#77] - -### Fixed -- [#49]: Move loadInstalledPaths from init to onDependenciesChangedEvent by [@gapple] in [#51] - -[#45]: https://github.com/PHPCSStandards/composer-installer/issues/45 -[#46]: https://github.com/PHPCSStandards/composer-installer/pull/46 -[#48]: https://github.com/PHPCSStandards/composer-installer/issues/48 -[#49]: https://github.com/PHPCSStandards/composer-installer/issues/49 -[#51]: https://github.com/PHPCSStandards/composer-installer/pull/51 -[#52]: https://github.com/PHPCSStandards/composer-installer/pull/52 -[#53]: https://github.com/PHPCSStandards/composer-installer/issues/53 -[#54]: https://github.com/PHPCSStandards/composer-installer/pull/54 -[#55]: https://github.com/PHPCSStandards/composer-installer/pull/55 -[#56]: https://github.com/PHPCSStandards/composer-installer/pull/56 -[#57]: https://github.com/PHPCSStandards/composer-installer/pull/57 -[#58]: https://github.com/PHPCSStandards/composer-installer/pull/58 -[#59]: https://github.com/PHPCSStandards/composer-installer/issues/59 -[#60]: https://github.com/PHPCSStandards/composer-installer/issues/60 -[#61]: https://github.com/PHPCSStandards/composer-installer/pull/61 -[#62]: https://github.com/PHPCSStandards/composer-installer/pull/62 -[#63]: https://github.com/PHPCSStandards/composer-installer/issues/63 -[#66]: https://github.com/PHPCSStandards/composer-installer/pull/66 -[#67]: https://github.com/PHPCSStandards/composer-installer/pull/67 -[#68]: https://github.com/PHPCSStandards/composer-installer/pull/68 -[#69]: https://github.com/PHPCSStandards/composer-installer/pull/69 -[#70]: https://github.com/PHPCSStandards/composer-installer/pull/70 -[#71]: https://github.com/PHPCSStandards/composer-installer/pull/71 -[#72]: https://github.com/PHPCSStandards/composer-installer/pull/72 -[#73]: https://github.com/PHPCSStandards/composer-installer/pull/73 -[#74]: https://github.com/PHPCSStandards/composer-installer/pull/74 -[#75]: https://github.com/PHPCSStandards/composer-installer/pull/75 -[#76]: https://github.com/PHPCSStandards/composer-installer/pull/76 -[#77]: https://github.com/PHPCSStandards/composer-installer/pull/77 - - -## [v0.4.4] - 2017-12-06 - -### Closed issues -- PHP 7.2 compatibility issue [#43] - -### Changed -- Update Travis CI svg badge and link URLs [#42] ([@ntwb]) -- Add PHP 7.2 to Travis CI [#41] ([@ntwb]) -- Docs: Fix link to releases [#40] ([@GaryJones]) - -[#40]: https://github.com/PHPCSStandards/composer-installer/pull/40 -[#41]: https://github.com/PHPCSStandards/composer-installer/pull/41 -[#42]: https://github.com/PHPCSStandards/composer-installer/pull/42 -[#43]: https://github.com/PHPCSStandards/composer-installer/issues/43 - - -## [v0.4.3] - 2017-09-18 - -### Changed -- CS: Add PHP 5.3 compatibility [#39] ([@GaryJones]) -- Local PHPCS [#38] ([@GaryJones]) - -[#38]: https://github.com/PHPCSStandards/composer-installer/pull/38 -[#39]: https://github.com/PHPCSStandards/composer-installer/pull/39 - - -## [v0.4.2] - 2017-08-16 - -### Changed -- Docs: Rename example script [#35] ([@GaryJones]) -- Update README.md [#36] ([@jrfnl]) -- Documentation update. [#37] ([@frenck]) - -[#35]: https://github.com/PHPCSStandards/composer-installer/pull/35 -[#36]: https://github.com/PHPCSStandards/composer-installer/pull/36 -[#37]: https://github.com/PHPCSStandards/composer-installer/pull/37 - - -## [v0.4.1] - 2017-08-01 - -### Closed issues -- Incorrect relative paths for WPCS [#33] - -### Fixed -- [#33]: Changes the way the installed_paths are set. [#34] ([@frenck]) - -[#33]: https://github.com/PHPCSStandards/composer-installer/issues/33 -[#34]: https://github.com/PHPCSStandards/composer-installer/pull/34 - - -## [v0.4.0] - 2017-05-11 - -### Closed issues -- Add support for code standards in root of repository for PHP_CodeSniffer 3.x [#26] -- Config codings styles in composer.json from project [#23] -- Check the root package for sniffs to install [#20] -- Document the ability to execute the main plugin functionality directly [#18] -- Add a CHANGELOG.md [#17] -- Install sniffs with relative paths in CodeSniffer.conf [#14] - -### Added -- Support for coding standard in the root repository for PHP_CodeSniffer v3.x [#30] ([@frenck]) -- Added support for having coding standards in the root package [#25] ([@frenck]) - -### Changed -- Local projects uses relative paths to their coding standards [#28] ([@frenck]) -- Docs: Updated README. [#31] ([@frenck]) -- Docs: Adds reference to calling the script directly in the README. [#29] ([@Potherca]) -- Adds Travis-CI configuration file. [#27] ([@Potherca]) - - -[#14]: https://github.com/PHPCSStandards/composer-installer/issues/14 -[#17]: https://github.com/PHPCSStandards/composer-installer/issues/17 -[#18]: https://github.com/PHPCSStandards/composer-installer/issues/18 -[#20]: https://github.com/PHPCSStandards/composer-installer/issues/20 -[#23]: https://github.com/PHPCSStandards/composer-installer/issues/23 -[#25]: https://github.com/PHPCSStandards/composer-installer/pull/25 -[#26]: https://github.com/PHPCSStandards/composer-installer/issues/26 -[#27]: https://github.com/PHPCSStandards/composer-installer/pull/27 -[#28]: https://github.com/PHPCSStandards/composer-installer/pull/28 -[#29]: https://github.com/PHPCSStandards/composer-installer/pull/29 -[#31]: https://github.com/PHPCSStandards/composer-installer/pull/31 - - -## [v0.3.2] - 2017-03-29 - -### Closed issues -- Coding Standard tries itself to install with installPath when it's the root package [#19] - -### Changed -- Improvements to the documentation [#22] ([@Potherca]) -- Added instanceof check to prevent root package from being installed [#21] ([@bastianschwarz]) - -### Fixed -- [#13]: Incorrect coding standards search depth [#15] ([@frenck]) - -[#19]: https://github.com/PHPCSStandards/composer-installer/issues/19 -[#21]: https://github.com/PHPCSStandards/composer-installer/pull/21 -[#22]: https://github.com/PHPCSStandards/composer-installer/pull/22 - - -## [v0.3.1] - 2017-02-17 - -### Closed issues -- Plugin not working correctly when sniffs install depth is equal to "1" [#13] -- Create new stable release version to support wider use [#11] - -### Fixed -- [#13]: Incorrect coding standards search depth [#15] ([@frenck]) - -[#11]: https://github.com/PHPCSStandards/composer-installer/issues/11 -[#13]: https://github.com/PHPCSStandards/composer-installer/issues/13 -[#15]: https://github.com/PHPCSStandards/composer-installer/pull/15 - - -## [v0.3.0] - 2017-02-15 - -### Implemented enhancements -- Install Plugin provides no feedback [#7] -- Installing coding standards when executing Composer with --no-scripts [#4] -- Github contribution templates [#10] ([@christopher-hopper]) -- Show config actions and a result as Console output [#8] ([@christopher-hopper]) -- Adds static function to call the Plugin::onDependenciesChangedEvent() method [#5] ([@Potherca]) - -### Added -- Support existing standards packages with subfolders [#6] ([@christopher-hopper]) - -### Changed -- Improved documentation [#12] ([@frenck]) -- Removal of lgtm.co [#3] ([@frenck]) - -[#3]: https://github.com/PHPCSStandards/composer-installer/pull/3 -[#4]: https://github.com/PHPCSStandards/composer-installer/issues/4 -[#5]: https://github.com/PHPCSStandards/composer-installer/pull/5 -[#6]: https://github.com/PHPCSStandards/composer-installer/pull/6 -[#7]: https://github.com/PHPCSStandards/composer-installer/issues/7 -[#8]: https://github.com/PHPCSStandards/composer-installer/pull/8 -[#10]: https://github.com/PHPCSStandards/composer-installer/pull/10 -[#12]: https://github.com/PHPCSStandards/composer-installer/pull/12 - - -## [v0.2.1] - 2016-11-01 - -Fixes an issue with having this plugin installed globally within composer, but using your global composer installation on a local repository without PHP_CodeSniffer installed. - -### Fixed -- Bugfix: Plugin fails when PHP_CodeSniffer is not installed [#2] ([@frenck]) - -[#2]: https://github.com/PHPCSStandards/composer-installer/pull/2 - - -## [v0.2.0] - 2016-11-01 - -For this version on, this installer no longer messes with the installation paths of composer libraries, but instead, it configures PHP_CodeSniffer to look into other directories for coding standards. - -### Changed -- PHPCS Configuration management [#1] ([@frenck]) - -[#1]: https://github.com/PHPCSStandards/composer-installer/pull/1 - - -## [v0.1.1] - 2016-10-24 - -### Changed -- Standard name mapping improvements - - -## v0.1.0 - 2016-10-23 - -First useable release. - -[v1.2.0]: https://github.com/PHPCSStandards/composer-installer/compare/v1.1.2...v1.2.0 -[v1.1.2]: https://github.com/PHPCSStandards/composer-installer/compare/v1.1.1...v1.1.2 -[v1.1.1]: https://github.com/PHPCSStandards/composer-installer/compare/v1.1.0...v1.1.1 -[v1.1.0]: https://github.com/PHPCSStandards/composer-installer/compare/v1.0.0...v1.1.0 -[v1.0.0]: https://github.com/PHPCSStandards/composer-installer/compare/v0.7.2...v1.0.0 -[v0.7.2]: https://github.com/PHPCSStandards/composer-installer/compare/v0.7.1...v0.7.2 -[v0.7.1]: https://github.com/PHPCSStandards/composer-installer/compare/v0.7.0...v0.7.1 -[v0.7.0]: https://github.com/PHPCSStandards/composer-installer/compare/v0.6.2...v0.7.0 -[v0.6.2]: https://github.com/PHPCSStandards/composer-installer/compare/v0.6.1...v0.6.2 -[v0.6.1]: https://github.com/PHPCSStandards/composer-installer/compare/v0.6.0...v0.6.1 -[v0.6.0]: https://github.com/PHPCSStandards/composer-installer/compare/v0.5.0...v0.6.0 -[v0.5.0]: https://github.com/PHPCSStandards/composer-installer/compare/v0.4.4...v0.5.0 -[v0.4.4]: https://github.com/PHPCSStandards/composer-installer/compare/v0.4.3...v0.4.4 -[v0.4.3]: https://github.com/PHPCSStandards/composer-installer/compare/v0.4.2...v0.4.3 -[v0.4.2]: https://github.com/PHPCSStandards/composer-installer/compare/v0.4.1...v0.4.2 -[v0.4.1]: https://github.com/PHPCSStandards/composer-installer/compare/v0.4.0...v0.4.1 -[v0.4.0]: https://github.com/PHPCSStandards/composer-installer/compare/v0.3.2...v0.4.0 -[v0.3.2]: https://github.com/PHPCSStandards/composer-installer/compare/v0.3.1...v0.3.2 -[v0.3.1]: https://github.com/PHPCSStandards/composer-installer/compare/v0.3.0...v0.3.1 -[v0.3.0]: https://github.com/PHPCSStandards/composer-installer/compare/v0.2.1...v0.3.0 -[v0.2.1]: https://github.com/PHPCSStandards/composer-installer/compare/v0.2.0...v0.2.1 -[v0.2.0]: https://github.com/PHPCSStandards/composer-installer/compare/v0.1.1...v0.2.0 -[v0.1.1]: https://github.com/PHPCSStandards/composer-installer/compare/v0.1.0...v0.1.1 - -[PHP_CodeSniffer]: https://github.com/PHPCSStandards/PHP_CodeSniffer - -[@bastianschwarz]: https://github.com/bastianschwarz -[@BrianHenryIE]: https://github.com/BrianHenryIE -[@christopher-hopper]: https://github.com/christopher-hopper -[@fredden]: https://github.com/fredden -[@frenck]: https://github.com/frenck -[@gapple]: https://github.com/gapple -[@GaryJones]: https://github.com/GaryJones -[@GrahamCampbell]: https://github.com/GrahamCampbell -[@jrfnl]: https://github.com/jrfnl -[@kevinfodness]: https://github.com/kevinfodness -[@mjrider]: https://github.com/mjrider -[@ntwb]: https://github.com/ntwb -[@paras-malhotra]: https://github.com/paras-malhotra -[@Potherca]: https://github.com/Potherca -[@Seldaek]: https://github.com/Seldaek -[@SplotyCode]: https://github.com/SplotyCode -[@TravisCarden]: https://github.com/TravisCarden diff --git a/vendor/dealerdirect/phpcodesniffer-composer-installer/LICENSE.md b/vendor/dealerdirect/phpcodesniffer-composer-installer/LICENSE.md deleted file mode 100644 index 9bc8806..0000000 --- a/vendor/dealerdirect/phpcodesniffer-composer-installer/LICENSE.md +++ /dev/null @@ -1,22 +0,0 @@ -MIT License - -Copyright (c) 2016-2022 Dealerdirect B.V. and contributors -Copyright (c) 2022 PHPCSStandards and contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/dealerdirect/phpcodesniffer-composer-installer/README.md b/vendor/dealerdirect/phpcodesniffer-composer-installer/README.md deleted file mode 100644 index fb6851a..0000000 --- a/vendor/dealerdirect/phpcodesniffer-composer-installer/README.md +++ /dev/null @@ -1,278 +0,0 @@ -# PHP_CodeSniffer Standards Composer Installer Plugin - -![Last Commit][last-updated-shield] -![Awesome][awesome-shield] -[![License][license-shield]](LICENSE.md) - -[![Tests][ghactionstest-shield]][ghactions] -[![Latest Version on Packagist][packagist-version-shield]][packagist-version] -[![Packagist][packagist-shield]][packagist] - -[![Contributor Covenant][code-of-conduct-shield]][code-of-conduct] - -This composer installer plugin makes installation of [PHP_CodeSniffer][codesniffer] coding standards (rulesets) straight-forward. - -No more symbolic linking of directories, checking out repositories on specific locations or manually changing the `phpcs` configuration. - -## Usage - -Installation can be done with [Composer][composer], by requiring this package as a development dependency: - -```bash -composer require --dev dealerdirect/phpcodesniffer-composer-installer:"^1.0" -``` - -Since Composer 2.2, Composer will [ask for your permission](https://blog.packagist.com/composer-2-2/#more-secure-plugin-execution) to allow this plugin to execute code. For this plugin to be functional, permission needs to be granted. - -When permission has been granted, the following snippet will automatically be added to your `composer.json` file by Composer: -```json -{ - "config": { - "allow-plugins": { - "dealerdirect/phpcodesniffer-composer-installer": true - } - } -} -``` - -You can safely add the permission flag (to avoid Composer needing to ask), by running: -```bash -composer config allow-plugins.dealerdirect/phpcodesniffer-composer-installer true -``` - -That's it. - -### Compatibility - -This plugin is compatible with: - -- PHP **5.4+**, **7.x**, and **8.x** (Support for PHP v8 is available since [`v0.7.0`][v0.7]) -- [Composer][composer] **2.2+** (Support for Composer v2 is available since [`v0.7.0`][v0.7]; support for Composer < 2.2 was dropped in [`v1.1.0`][v1.1]) -- [PHP_CodeSniffer][codesniffer] **3.x** and **4.x**(Support for PHP_CodeSniffer v4 is available since [`v0.7.0`][v0.7], support for PHP_CodeSniffer v2 was dropped in [`v1.2.0`][v1.2]) - -### How it works - -Basically, this plugin executes the following steps: - -- This plugin searches for [`phpcodesniffer-standard` packages][] in all of your currently installed Composer packages. -- Matching packages and the project itself are scanned for PHP_CodeSniffer rulesets. -- The plugin will call PHP_CodeSniffer and configure the `installed_paths` option. - -### Example project - -The following is an example Composer project and has included -multiple `phpcodesniffer-standard` packages. - -```json -{ - "name": "example/project", - "description": "Just an example project", - "type": "project", - "require": {}, - "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "*", - "phpcompatibility/php-compatibility": "*", - "wp-coding-standards/wpcs": "*" - }, - "config": { - "allow-plugins": { - "dealerdirect/phpcodesniffer-composer-installer": true - } - } -} -``` - -After running `composer install` PHP_CodeSniffer just works: - -```bash -$ ./vendor/bin/phpcs -i -The installed coding standards are PEAR, PSR1, PSR2, PSR12, Squiz, Zend, PHPCompatibility, Modernize, -NormalizedArrays, Universal, PHPCSUtils, WordPress, WordPress-Core, WordPress-Docs and WordPress-Extra -``` - -### Calling the plugin directly - -In some circumstances, it is desirable to call this plugin's functionality -directly. For instance, during development or in [CI][definition-ci] environments. - -As the plugin requires Composer to work, direct calls need to be wired through a -project's `composer.json`. - -This is done by adding a call to the `Plugin::run` function in the `script` -section of the `composer.json`: - -```json -{ - "scripts": { - "install-codestandards": [ - "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin::run" - ] - } -} -``` - -The command can then be called using `composer run-script install-codestandards` or -referenced from other script configurations, as follows: - -```json -{ - "scripts": { - "install-codestandards": [ - "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin::run" - ], - "post-install-cmd": [ - "@install-codestandards" - ] - } -} -``` - -For more details about Composer scripts, please refer to [the section on scripts -in the Composer manual][composer-manual-scripts]. - -### Changing the Coding Standards search depth - -By default, this plugin searches up for Coding Standards up to three directories -deep. In most cases, this should be sufficient. However, this plugin allows -you to customize the search depth setting if needed. - -```json -{ - "extra": { - "phpcodesniffer-search-depth": 5 - } -} -``` - -### Caveats - -When this plugin is installed globally, composer will load the _global_ plugin rather -than the one from the local repository. Despite [this behavior being documented -in the composer manual][using-composer-plugins], it could potentially confuse -as another version of the plugin could be run and not the one specified by the project. - -## Developing Coding Standards - -Coding standard can be developed normally, as documented by [PHP_CodeSniffer][codesniffer], in the [Coding Standard Tutorial][tutorial]. - -Create a composer package of your coding standard by adding a `composer.json` file. - -```json -{ - "name" : "acme/phpcodesniffer-our-standards", - "description" : "Package contains all coding standards of the Acme company", - "require" : { - "php" : ">=5.4.0", - "squizlabs/php_codesniffer" : "^3.13" - }, - "type" : "phpcodesniffer-standard" -} -``` - -Requirements: -* The repository may contain one or more standards. -* Each standard can have a separate directory no deeper than 3 levels from the repository root. -* The package `type` must be `phpcodesniffer-standard`. Without this, the plugin will not trigger. - -### Requiring the plugin from within your coding standard - -If your coding standard itself depends on additional external PHPCS standards, this plugin can -make life easier on your end-users by taking care of the installation of all standards - yours -and your dependencies - for them. - -This can help reduce the number of support questions about setting the `installed_paths`, as well -as simplify your standard's installation instructions. - -For this to work, make sure your external standard adds this plugin to the `composer.json` config -via `require`, **not** `require-dev`. - -> :warning: Your end-user may already `require-dev` this plugin and/or other external standards used -> by your end-users may require this plugin as well. -> -> To prevent your end-users getting into "_dependency hell_", make sure to make the version requirement -> for this plugin flexible. -> -> Remember that [Composer treats unstable minors as majors][composer-manual-caret] and will not be able to resolve -> one config requiring this plugin at version `^0.7`, while another requires it at version `^1.0`. -> Either allow multiple minors or use `*` as the version requirement. -> -> Some examples of flexible requirements which can be used: -> ```bash -> composer require dealerdirect/phpcodesniffer-composer-installer:"*" -> composer require dealerdirect/phpcodesniffer-composer-installer:"^0.4.1 || ^0.5 || ^0.6 || ^0.7 || ^1.0" -> ``` - -## Contributing - -This is an active open-source project. We are always open to people who want to -use the code or contribute to it. - -We've set up a separate document for our [contribution guidelines][contributing-guidelines]. - -Thank you for being involved! :heart_eyes: - -## Authors & contributors - -The original idea and setup of this repository is by [Franck Nijhof][frenck], employee @ Dealerdirect. - -For a full list of all authors and/or contributors, check [the contributors page][contributors]. - -## Funding - -This project is included in the projects supported via the [PHP_CodeSniffer Open Collective][phpcs-open-collective]. - -If you use this plugin, financial contributions to the Open Collective are encouraged and appreciated. - -## License - -The MIT License (MIT) - -Copyright (c) 2016-2022 Dealerdirect B.V. and contributors -Copyright (c) 2022- PHPCSStandards and contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -[awesome-shield]: https://img.shields.io/badge/awesome%3F-yes-brightgreen.svg -[code-of-conduct-shield]: https://img.shields.io/badge/Contributor%20Covenant-v2.0-ff69b4.svg -[code-of-conduct]: CODE_OF_CONDUCT.md -[codesniffer]: https://github.com/PHPCSStandards/PHP_CodeSniffer -[composer-manual-scripts]: https://getcomposer.org/doc/articles/scripts.md -[composer-manual-caret]: https://getcomposer.org/doc/articles/versions.md#caret-version-range- -[composer]: https://getcomposer.org/ -[contributing-guidelines]: CONTRIBUTING.md -[contributors]: https://github.com/PHPCSStandards/composer-installer/graphs/contributors -[definition-ci]: https://en.wikipedia.org/wiki/Continuous_integration -[frenck]: https://github.com/frenck -[last-updated-shield]: https://img.shields.io/github/last-commit/PHPCSStandards/composer-installer.svg -[license-shield]: https://img.shields.io/github/license/PHPCSStandards/composer-installer.svg -[packagist-shield]: https://img.shields.io/packagist/dt/dealerdirect/phpcodesniffer-composer-installer.svg -[packagist-version-shield]: https://img.shields.io/packagist/v/dealerdirect/phpcodesniffer-composer-installer.svg -[packagist-version]: https://packagist.org/packages/dealerdirect/phpcodesniffer-composer-installer -[packagist]: https://packagist.org/packages/dealerdirect/phpcodesniffer-composer-installer -[`phpcodesniffer-standard` packages]: https://packagist.org/explore/?type=phpcodesniffer-standard -[phpcs-open-collective]: https://opencollective.com/php_codesniffer -[scrutinizer-shield]: https://img.shields.io/scrutinizer/g/dealerdirect/phpcodesniffer-composer-installer.svg -[scrutinizer]: https://scrutinizer-ci.com/g/dealerdirect/phpcodesniffer-composer-installer/ -[ghactionstest-shield]: https://github.com/PHPCSStandards/composer-installer/actions/workflows/integrationtest.yml/badge.svg -[ghactions]: https://github.com/PHPCSStandards/composer-installer/actions/workflows/integrationtest.yml -[tutorial]: https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki/Coding-Standard-Tutorial -[using-composer-plugins]: https://getcomposer.org/doc/articles/plugins.md#using-plugins -[v0.7]: https://github.com/PHPCSStandards/composer-installer/releases/tag/v0.7.0 -[v1.1]: https://github.com/PHPCSStandards/composer-installer/releases/tag/v1.1.0 -[v1.2]: https://github.com/PHPCSStandards/composer-installer/releases/tag/v1.2.0 diff --git a/vendor/dealerdirect/phpcodesniffer-composer-installer/composer.json b/vendor/dealerdirect/phpcodesniffer-composer-installer/composer.json deleted file mode 100644 index ba3fbff..0000000 --- a/vendor/dealerdirect/phpcodesniffer-composer-installer/composer.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "name": "dealerdirect/phpcodesniffer-composer-installer", - "description": "PHP_CodeSniffer Standards Composer Installer Plugin", - "type": "composer-plugin", - "keywords": [ - "composer", "installer", "plugin", - "phpcs", "phpcbf", "codesniffer", "phpcodesniffer", "php_codesniffer", - "standard", "standards", "style guide", "stylecheck", - "qa", "quality", "code quality", "tests" - ], - "license": "MIT", - "authors": [ - { - "name": "Franck Nijhof", - "email": "opensource@frenck.dev", - "homepage": "https://frenck.dev", - "role": "Open source developer" - }, - { - "name" : "Contributors", - "homepage" : "https://github.com/PHPCSStandards/composer-installer/graphs/contributors" - } - ], - "support": { - "issues": "https://github.com/PHPCSStandards/composer-installer/issues", - "source": "https://github.com/PHPCSStandards/composer-installer", - "security": "https://github.com/PHPCSStandards/composer-installer/security/policy" - }, - "require": { - "php": ">=5.4", - "composer-plugin-api": "^2.2", - "squizlabs/php_codesniffer": "^3.1.0 || ^4.0" - }, - "require-dev": { - "ext-json": "*", - "ext-zip": "*", - "composer/composer": "^2.2", - "phpcompatibility/php-compatibility": "^9.0 || ^10.0.0@dev", - "php-parallel-lint/php-parallel-lint": "^1.4.0", - "yoast/phpunit-polyfills": "^1.0" - }, - "minimum-stability": "dev", - "prefer-stable": true, - "autoload": { - "psr-4": { - "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" - } - }, - "autoload-dev": { - "psr-4": { - "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Tests\\": "tests/" - } - }, - "config": { - "lock": false - }, - "extra": { - "class": "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" - }, - "scripts": { - "install-codestandards": [ - "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin::run" - ], - "lint": [ - "@php ./vendor/php-parallel-lint/php-parallel-lint/parallel-lint . -e php --show-deprecated --exclude vendor --exclude .git" - ], - "test": [ - "@php ./vendor/phpunit/phpunit/phpunit --no-coverage" - ], - "coverage": [ - "@php ./vendor/phpunit/phpunit/phpunit" - ] - } -} diff --git a/vendor/dealerdirect/phpcodesniffer-composer-installer/src/Plugin.php b/vendor/dealerdirect/phpcodesniffer-composer-installer/src/Plugin.php deleted file mode 100644 index 03f9b54..0000000 --- a/vendor/dealerdirect/phpcodesniffer-composer-installer/src/Plugin.php +++ /dev/null @@ -1,635 +0,0 @@ - - */ -class Plugin implements PluginInterface, EventSubscriberInterface -{ - const KEY_MAX_DEPTH = 'phpcodesniffer-search-depth'; - - const MESSAGE_ERROR_WRONG_MAX_DEPTH = - 'The value of "%s" (in the composer.json "extra".section) must be an integer larger than %d, %s given.'; - - const MESSAGE_NOT_INSTALLED = 'PHPCodeSniffer is not installed'; - const MESSAGE_NOTHING_TO_INSTALL = 'No PHPCS standards to install or update'; - const MESSAGE_PLUGIN_UNINSTALLED = 'PHPCodeSniffer Composer Installer is uninstalled'; - const MESSAGE_RUNNING_INSTALLER = 'Running PHPCodeSniffer Composer Installer'; - - const PACKAGE_NAME = 'squizlabs/php_codesniffer'; - const PACKAGE_TYPE = 'phpcodesniffer-standard'; - - const PHPCS_CONFIG_REGEX = '`%s:[^\r\n]+`'; - const PHPCS_CONFIG_KEY = 'installed_paths'; - - const PLUGIN_NAME = 'dealerdirect/phpcodesniffer-composer-installer'; - - /** - * @var Composer - */ - private $composer; - - /** - * @var string - */ - private $cwd; - - /** - * @var Filesystem - */ - private $filesystem; - - /** - * @var array - */ - private $installedPaths; - - /** - * @var IOInterface - */ - private $io; - - /** - * @var ProcessExecutor - */ - private $processExecutor; - - /** - * Triggers the plugin's main functionality. - * - * Makes it possible to run the plugin as a custom command. - * - * @param Event $event - * - * @throws \InvalidArgumentException - * @throws \RuntimeException - * @throws LogicException - * @throws ProcessFailedException - * @throws RuntimeException - */ - public static function run(Event $event) - { - $io = $event->getIO(); - $composer = $event->getComposer(); - - $instance = new static(); - - $instance->io = $io; - $instance->composer = $composer; - $instance->init(); - $instance->onDependenciesChangedEvent(); - } - - /** - * {@inheritDoc} - * - * @throws \RuntimeException - * @throws LogicException - * @throws ProcessFailedException - * @throws RuntimeException - */ - public function activate(Composer $composer, IOInterface $io) - { - $this->composer = $composer; - $this->io = $io; - - $this->init(); - } - - /** - * {@inheritDoc} - */ - public function deactivate(Composer $composer, IOInterface $io) - { - } - - /** - * {@inheritDoc} - */ - public function uninstall(Composer $composer, IOInterface $io) - { - } - - /** - * Prepares the plugin so it's main functionality can be run. - * - * @throws \RuntimeException - * @throws LogicException - * @throws ProcessFailedException - * @throws RuntimeException - */ - private function init() - { - $this->cwd = getcwd(); - $this->installedPaths = array(); - - $this->processExecutor = new ProcessExecutor($this->io); - $this->filesystem = new Filesystem($this->processExecutor); - } - - /** - * {@inheritDoc} - */ - public static function getSubscribedEvents() - { - return array( - ScriptEvents::POST_INSTALL_CMD => array( - array('onDependenciesChangedEvent', 0), - ), - ScriptEvents::POST_UPDATE_CMD => array( - array('onDependenciesChangedEvent', 0), - ), - ); - } - - /** - * Entry point for post install and post update events. - * - * @throws \InvalidArgumentException - * @throws LogicException - * @throws ProcessFailedException - * @throws RuntimeException - */ - public function onDependenciesChangedEvent() - { - $io = $this->io; - $isVerbose = $io->isVerbose(); - $exitCode = 0; - - if ($isVerbose) { - $io->write(sprintf('%s', self::MESSAGE_RUNNING_INSTALLER)); - } - - if ($this->isPHPCodeSnifferInstalled() === true) { - $this->loadInstalledPaths(); - $installPathCleaned = $this->cleanInstalledPaths(); - $installPathUpdated = $this->updateInstalledPaths(); - - if ($installPathCleaned === true || $installPathUpdated === true) { - $exitCode = $this->saveInstalledPaths(); - } elseif ($isVerbose) { - $io->write(sprintf('%s', self::MESSAGE_NOTHING_TO_INSTALL)); - } - } else { - $pluginPackage = $this - ->composer - ->getRepositoryManager() - ->getLocalRepository() - ->findPackages(self::PLUGIN_NAME) - ; - - $isPluginUninstalled = count($pluginPackage) === 0; - - if ($isPluginUninstalled) { - if ($isVerbose) { - $io->write(sprintf('%s', self::MESSAGE_PLUGIN_UNINSTALLED)); - } - } else { - $exitCode = 1; - if ($isVerbose) { - $io->write(sprintf('%s', self::MESSAGE_NOT_INSTALLED)); - } - } - } - - return $exitCode; - } - - /** - * Load all paths from PHP_CodeSniffer into an array. - * - * @throws LogicException - * @throws ProcessFailedException - * @throws RuntimeException - */ - private function loadInstalledPaths() - { - if ($this->isPHPCodeSnifferInstalled() === true) { - $this->processExecutor->execute( - $this->getPhpcsCommand() . ' --config-show', - $output, - $this->getPHPCodeSnifferInstallPath() - ); - - $regex = sprintf(self::PHPCS_CONFIG_REGEX, self::PHPCS_CONFIG_KEY); - if (preg_match($regex, $output, $match) === 1) { - $phpcsInstalledPaths = str_replace(self::PHPCS_CONFIG_KEY . ': ', '', $match[0]); - $phpcsInstalledPaths = trim($phpcsInstalledPaths); - - if ($phpcsInstalledPaths !== '') { - $this->installedPaths = explode(',', $phpcsInstalledPaths); - } - } - } - } - - /** - * Save all coding standard paths back into PHP_CodeSniffer - * - * @throws LogicException - * @throws ProcessFailedException - * @throws RuntimeException - * - * @return int Exit code. 0 for success, 1 or higher for failure. - */ - private function saveInstalledPaths() - { - // Check if we found installed paths to set. - if (count($this->installedPaths) !== 0) { - sort($this->installedPaths); - $paths = implode(',', $this->installedPaths); - $arguments = array('--config-set', self::PHPCS_CONFIG_KEY, $paths); - $configMessage = sprintf( - 'PHP CodeSniffer Config %s set to %s', - self::PHPCS_CONFIG_KEY, - $paths - ); - } else { - // Delete the installed paths if none were found. - $arguments = array('--config-delete', self::PHPCS_CONFIG_KEY); - $configMessage = sprintf( - 'PHP CodeSniffer Config %s delete', - self::PHPCS_CONFIG_KEY - ); - } - - // Prepare message in case of failure - $failMessage = sprintf( - 'Failed to set PHP CodeSniffer %s Config', - self::PHPCS_CONFIG_KEY - ); - - // Okay, lets rock! - $command = vsprintf( - '%s %s', - array( - 'phpcs command' => $this->getPhpcsCommand(), - 'arguments' => implode(' ', $arguments), - ) - ); - - $exitCode = $this->processExecutor->execute($command, $configResult, $this->getPHPCodeSnifferInstallPath()); - if ($exitCode === 0) { - $exitCode = $this->verifySaveSuccess(); - } - - if ($exitCode === 0) { - $this->io->write($configMessage); - } else { - $this->io->write($failMessage); - } - - if ($this->io->isVerbose() && !empty($configResult)) { - $this->io->write(sprintf('%s', $configResult)); - } - - return $exitCode; - } - - /** - * Verify that the paths which were expected to be saved, have been. - * - * @return int Exit code. 0 for success, 1 for failure. - */ - private function verifySaveSuccess() - { - $exitCode = 1; - $expectedPaths = $this->installedPaths; - - // Request the currently set installed paths after the save. - $this->loadInstalledPaths(); - - $registeredPaths = array_intersect($this->installedPaths, $expectedPaths); - $registeredCount = count($registeredPaths); - $expectedCount = count($expectedPaths); - - if ($expectedCount === $registeredCount) { - $exitCode = 0; - } - - if ($exitCode === 1 && $this->io->isVerbose()) { - $verificationMessage = sprintf( - "Paths to external standards found by the plugin: %s\n" - . 'Actual paths registered with PHPCS: %s', - implode(', ', $expectedPaths), - implode(', ', $this->installedPaths) - ); - $this->io->write($verificationMessage); - } - - return $exitCode; - } - - /** - * Get the command to call PHPCS. - */ - protected function getPhpcsCommand() - { - return vsprintf( - '%s %s', - array( - 'php executable' => $this->getPhpExecCommand(), - 'phpcs executable' => './bin/phpcs', - ) - ); - } - - /** - * Get the path to the current PHP version being used. - * - * Duplicate of the same in the EventDispatcher class in Composer itself. - */ - protected function getPhpExecCommand() - { - $finder = new PhpExecutableFinder(); - - $phpPath = $finder->find(false); - - if ($phpPath === false) { - throw new \RuntimeException('Failed to locate PHP binary to execute ' . $phpPath); - } - - $phpArgs = $finder->findArguments(); - $phpArgs = $phpArgs - ? ' ' . implode(' ', $phpArgs) - : '' - ; - - $command = ProcessExecutor::escape($phpPath) . - $phpArgs . - ' -d allow_url_fopen=' . ProcessExecutor::escape(ini_get('allow_url_fopen')) . - ' -d disable_functions=' . ProcessExecutor::escape(ini_get('disable_functions')) . - ' -d memory_limit=' . ProcessExecutor::escape(ini_get('memory_limit')) - ; - - return $command; - } - - /** - * Iterate trough all known paths and check if they are still valid. - * - * If path does not exists, is not an directory or isn't readable, the path - * is removed from the list. - * - * @return bool True if changes where made, false otherwise - */ - private function cleanInstalledPaths() - { - $changes = false; - foreach ($this->installedPaths as $key => $path) { - // This might be a relative path as well - $alternativePath = realpath($this->getPHPCodeSnifferInstallPath() . \DIRECTORY_SEPARATOR . $path); - - if ( - (is_dir($path) === false || is_readable($path) === false) && - ( - $alternativePath === false || - is_dir($alternativePath) === false || - is_readable($alternativePath) === false - ) - ) { - unset($this->installedPaths[$key]); - $changes = true; - } - } - return $changes; - } - - /** - * Check all installed packages (including the root package) against - * the installed paths from PHP_CodeSniffer and add the missing ones. - * - * @return bool True if changes where made, false otherwise - * - * @throws \InvalidArgumentException - * @throws \RuntimeException - */ - private function updateInstalledPaths() - { - $changes = false; - $searchPaths = array(); - - // Add root package only if it has the expected package type. - if ( - $this->composer->getPackage() instanceof RootPackageInterface - && $this->composer->getPackage()->getType() === self::PACKAGE_TYPE - ) { - $searchPaths[] = $this->cwd; - } - - $codingStandardPackages = $this->getPHPCodingStandardPackages(); - foreach ($codingStandardPackages as $package) { - $installPath = $this->composer->getInstallationManager()->getInstallPath($package); - if ($this->filesystem->isAbsolutePath($installPath) === false) { - $installPath = $this->filesystem->normalizePath( - $this->cwd . \DIRECTORY_SEPARATOR . $installPath - ); - } - $searchPaths[] = $installPath; - } - - // Nothing to do. - if ($searchPaths === array()) { - return false; - } - - $finder = new Finder(); - $finder->files() - ->depth('<= ' . $this->getMaxDepth()) - ->depth('>= ' . $this->getMinDepth()) - ->ignoreUnreadableDirs() - ->ignoreVCS(true) - ->in($searchPaths) - ->name('ruleset.xml'); - - // Process each found possible ruleset. - foreach ($finder as $ruleset) { - $standardsPath = $ruleset->getPath(); - - // Pick the directory above the directory containing the standard, unless this is the project root. - if ($standardsPath !== $this->cwd) { - $standardsPath = dirname($standardsPath); - } - - // Use relative paths for local project repositories. - if ($this->isRunningGlobally() === false) { - $standardsPath = $this->filesystem->findShortestPath( - $this->getPHPCodeSnifferInstallPath(), - $standardsPath, - true - ); - } - - // De-duplicate and add when directory is not configured. - if (in_array($standardsPath, $this->installedPaths, true) === false) { - $this->installedPaths[] = $standardsPath; - $changes = true; - } - } - - return $changes; - } - - /** - * Iterates through Composers' local repository looking for valid Coding - * Standard packages. - * - * @return array Composer packages containing coding standard(s) - */ - private function getPHPCodingStandardPackages() - { - $codingStandardPackages = array_filter( - $this->composer->getRepositoryManager()->getLocalRepository()->getPackages(), - function (PackageInterface $package) { - if ($package instanceof AliasPackage) { - return false; - } - return $package->getType() === Plugin::PACKAGE_TYPE; - } - ); - - return $codingStandardPackages; - } - - /** - * Searches for the installed PHP_CodeSniffer Composer package - * - * @param null|string|\Composer\Semver\Constraint\ConstraintInterface $versionConstraint to match against - * - * @return PackageInterface|null - */ - private function getPHPCodeSnifferPackage($versionConstraint = null) - { - $packages = $this - ->composer - ->getRepositoryManager() - ->getLocalRepository() - ->findPackages(self::PACKAGE_NAME, $versionConstraint); - - return array_shift($packages); - } - - /** - * Returns the path to the PHP_CodeSniffer package installation location - * - * {@internal Do NOT try to modernize via the Composer 2.2 API (`InstalledVersions::getInstallPath()`). - * Doing so doesn't play nice with other plugins. - * {@link https://github.com/PHPCSStandards/composer-installer/issues/239}} - * - * @return string - */ - private function getPHPCodeSnifferInstallPath() - { - return $this->composer->getInstallationManager()->getInstallPath($this->getPHPCodeSnifferPackage()); - } - - /** - * Simple check if PHP_CodeSniffer is installed. - * - * {@internal Do NOT try to modernize via the Composer 2.2 API (`InstalledVersions::isInstalled()`). - * Doing so doesn't play nice with integrations calling the Composer EventDispatcher programmatically. - * {@link https://github.com/PHPCSStandards/composer-installer/issues/247}} - * - * @param null|string|\Composer\Semver\Constraint\ConstraintInterface $versionConstraint to match against - * - * @return bool Whether PHP_CodeSniffer is installed - */ - private function isPHPCodeSnifferInstalled($versionConstraint = null) - { - return ($this->getPHPCodeSnifferPackage($versionConstraint) !== null); - } - - /** - * Test if composer is running "global" - * This check kinda dirty, but it is the "Composer Way" - * - * @return bool Whether Composer is running "globally" - * - * @throws \RuntimeException - */ - private function isRunningGlobally() - { - return ($this->composer->getConfig()->get('home') === $this->cwd); - } - - /** - * Determines the maximum search depth when searching for Coding Standards. - * - * @return int - * - * @throws \InvalidArgumentException - */ - private function getMaxDepth() - { - $maxDepth = 3; - - $extra = $this->composer->getPackage()->getExtra(); - - if (array_key_exists(self::KEY_MAX_DEPTH, $extra)) { - $maxDepth = $extra[self::KEY_MAX_DEPTH]; - $minDepth = $this->getMinDepth(); - - if ( - (string) (int) $maxDepth !== (string) $maxDepth /* Must be an integer or cleanly castable to one */ - || $maxDepth <= $minDepth /* Larger than the minimum */ - || is_float($maxDepth) === true /* Within the boundaries of integer */ - ) { - $message = vsprintf( - self::MESSAGE_ERROR_WRONG_MAX_DEPTH, - array( - 'key' => self::KEY_MAX_DEPTH, - 'min' => $minDepth, - 'given' => var_export($maxDepth, true), - ) - ); - - throw new \InvalidArgumentException($message); - } - } - - return (int) $maxDepth; - } - - /** - * Returns the minimal search depth for Coding Standard packages. - * - * Usually this is 0, unless PHP_CodeSniffer >= 3 is used. - * - * @return int - */ - private function getMinDepth() - { - if ($this->isPHPCodeSnifferInstalled('>= 3.0.0') !== true) { - return 1; - } - return 0; - } -} diff --git a/vendor/dflydev/dot-access-data/CHANGELOG.md b/vendor/dflydev/dot-access-data/CHANGELOG.md deleted file mode 100644 index b8b468d..0000000 --- a/vendor/dflydev/dot-access-data/CHANGELOG.md +++ /dev/null @@ -1,74 +0,0 @@ -# Changelog - -All notable changes to this project will be documented in this file. - -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), -and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - -## [Unreleased] - -## [3.0.3] - 2024-07-08 - -### Fixed - - - Fixed PHP 8.4 deprecation notices (#47) - -## [3.0.2] - 2022-10-27 - -### Fixed - - - Added missing return types to docblocks (#44, #45) - -## [3.0.1] - 2021-08-13 - -### Added - - - Adds ReturnTypeWillChange to suppress PHP 8.1 warnings (#40) - -## [3.0.0] - 2021-01-01 - -### Added - - Added support for both `.` and `/`-delimited key paths (#24) - - Added parameter and return types to everything; enabled strict type checks (#18) - - Added new exception classes to better identify certain types of errors (#20) - - `Data` now implements `ArrayAccess` (#17) - - Added ability to merge non-associative array values (#31, #32) - -### Changed - - All thrown exceptions are now instances or subclasses of `DataException` (#20) - - Calling `get()` on a missing key path without providing a default will throw a `MissingPathException` instead of returning `null` (#29) - - Bumped supported PHP versions to 7.1 - 8.x (#18) - -### Fixed - - Fixed incorrect merging of array values into string values (#32) - - Fixed `get()` method behaving as if keys with `null` values didn't exist - -## [2.0.0] - 2017-12-21 - -### Changed - - Bumped supported PHP versions to 7.0 - 7.4 (#12) - - Switched to PSR-4 autoloading - -## [1.1.0] - 2017-01-20 - -### Added - - Added new `has()` method to check for the existence of the given key (#4, #7) - -## [1.0.1] - 2015-08-12 - -### Added - - Added new optional `$default` parameter to the `get()` method (#2) - -## [1.0.0] - 2012-07-17 - -**Initial release!** - -[Unreleased]: https://github.com/dflydev/dflydev-dot-access-data/compare/v3.0.3...main -[3.0.3]: https://github.com/dflydev/dflydev-dot-access-data/compare/v3.0.2...v3.0.3 -[3.0.2]: https://github.com/dflydev/dflydev-dot-access-data/compare/v3.0.1...v3.0.2 -[3.0.1]: https://github.com/dflydev/dflydev-dot-access-data/compare/v3.0.0...v3.0.1 -[3.0.0]: https://github.com/dflydev/dflydev-dot-access-data/compare/v2.0.0...v3.0.0 -[2.0.0]: https://github.com/dflydev/dflydev-dot-access-data/compare/v1.1.0...v2.0.0 -[1.1.0]: https://github.com/dflydev/dflydev-dot-access-data/compare/v1.0.1...v1.1.0 -[1.0.1]: https://github.com/dflydev/dflydev-dot-access-data/compare/v1.0.0...v1.0.1 -[1.0.0]: https://github.com/dflydev/dflydev-dot-access-data/releases/tag/v1.0.0 diff --git a/vendor/dflydev/dot-access-data/README.md b/vendor/dflydev/dot-access-data/README.md deleted file mode 100644 index 775fbdf..0000000 --- a/vendor/dflydev/dot-access-data/README.md +++ /dev/null @@ -1,158 +0,0 @@ -Dot Access Data -=============== - -[![Latest Version](https://img.shields.io/packagist/v/dflydev/dot-access-data.svg?style=flat-square)](https://packagist.org/packages/dflydev/dot-access-data) -[![Total Downloads](https://img.shields.io/packagist/dt/dflydev/dot-access-data.svg?style=flat-square)](https://packagist.org/packages/dflydev/dot-access-data) -[![Software License](https://img.shields.io/badge/License-MIT-brightgreen.svg?style=flat-square)](LICENSE) -[![Build Status](https://img.shields.io/github/workflow/status/dflydev/dflydev-dot-access-data/Tests/main.svg?style=flat-square)](https://github.com/dflydev/dflydev-dot-access-data/actions?query=workflow%3ATests+branch%3Amain) -[![Coverage Status](https://img.shields.io/scrutinizer/coverage/g/dflydev/dflydev-dot-access-data.svg?style=flat-square)](https://scrutinizer-ci.com/g/dflydev/dflydev-dot-access-data/code-structure/) -[![Quality Score](https://img.shields.io/scrutinizer/g/dflydev/dflydev-dot-access-data.svg?style=flat-square)](https://scrutinizer-ci.com/g/dflydev/dflydev-dot-access-data) - -Given a deep data structure, access data by dot notation. - - -Requirements ------------- - - * PHP (7.1+) - -> For PHP (5.3+) please refer to version `1.0`. - - -Usage ------ - -Abstract example: - -```php -use Dflydev\DotAccessData\Data; - -$data = new Data; - -$data->set('a.b.c', 'C'); -$data->set('a.b.d', 'D1'); -$data->append('a.b.d', 'D2'); -$data->set('a.b.e', ['E0', 'E1', 'E2']); - -// C -$data->get('a.b.c'); - -// ['D1', 'D2'] -$data->get('a.b.d'); - -// ['E0', 'E1', 'E2'] -$data->get('a.b.e'); - -// true -$data->has('a.b.c'); - -// false -$data->has('a.b.d.j'); - - -// 'some-default-value' -$data->get('some.path.that.does.not.exist', 'some-default-value'); - -// throws a MissingPathException because no default was given -$data->get('some.path.that.does.not.exist'); -``` - -A more concrete example: - -```php -use Dflydev\DotAccessData\Data; - -$data = new Data([ - 'hosts' => [ - 'hewey' => [ - 'username' => 'hman', - 'password' => 'HPASS', - 'roles' => ['web'], - ], - 'dewey' => [ - 'username' => 'dman', - 'password' => 'D---S', - 'roles' => ['web', 'db'], - 'nick' => 'dewey dman', - ], - 'lewey' => [ - 'username' => 'lman', - 'password' => 'LP@$$', - 'roles' => ['db'], - ], - ], -]); - -// hman -$username = $data->get('hosts.hewey.username'); -// HPASS -$password = $data->get('hosts.hewey.password'); -// ['web'] -$roles = $data->get('hosts.hewey.roles'); -// dewey dman -$nick = $data->get('hosts.dewey.nick'); -// Unknown -$nick = $data->get('hosts.lewey.nick', 'Unknown'); - -// DataInterface instance -$dewey = $data->getData('hosts.dewey'); -// dman -$username = $dewey->get('username'); -// D---S -$password = $dewey->get('password'); -// ['web', 'db'] -$roles = $dewey->get('roles'); - -// No more lewey -$data->remove('hosts.lewey'); - -// Add DB to hewey's roles -$data->append('hosts.hewey.roles', 'db'); - -$data->set('hosts.april', [ - 'username' => 'aman', - 'password' => '@---S', - 'roles' => ['web'], -]); - -// Check if a key exists (true to this case) -$hasKey = $data->has('hosts.dewey.username'); -``` - -`Data` may be used as an array, since it implements `ArrayAccess` interface: - -```php -// Get -$data->get('name') === $data['name']; // true - -$data['name'] = 'Dewey'; -// is equivalent to -$data->set($name, 'Dewey'); - -isset($data['name']) === $data->has('name'); - -// Remove key -unset($data['name']); -``` - -`/` can also be used as a path delimiter: - -```php -$data->set('a/b/c', 'd'); -echo $data->get('a/b/c'); // "d" - -$data->get('a/b/c') === $data->get('a.b.c'); // true -``` - -License -------- - -This library is licensed under the MIT License - see the LICENSE file -for details. - - -Community ---------- - -If you have questions or want to help out, join us in the -[#dflydev](irc://irc.freenode.net/#dflydev) channel on irc.freenode.net. diff --git a/vendor/dflydev/dot-access-data/composer.json b/vendor/dflydev/dot-access-data/composer.json deleted file mode 100644 index 44dc5ed..0000000 --- a/vendor/dflydev/dot-access-data/composer.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "name": "dflydev/dot-access-data", - "type": "library", - "description": "Given a deep data structure, access data by dot notation.", - "homepage": "https://github.com/dflydev/dflydev-dot-access-data", - "keywords": ["dot", "access", "data", "notation"], - "license": "MIT", - "authors": [ - { - "name": "Dragonfly Development Inc.", - "email": "info@dflydev.com", - "homepage": "http://dflydev.com" - }, - { - "name": "Beau Simensen", - "email": "beau@dflydev.com", - "homepage": "http://beausimensen.com" - }, - { - "name": "Carlos Frutos", - "email": "carlos@kiwing.it", - "homepage": "https://github.com/cfrutos" - }, - { - "name": "Colin O'Dell", - "email": "colinodell@gmail.com", - "homepage": "https://www.colinodell.com" - } - ], - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^0.12.42", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", - "scrutinizer/ocular": "1.6.0", - "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "^4.0.0" - }, - "autoload": { - "psr-4": { - "Dflydev\\DotAccessData\\": "src/" - } - }, - "autoload-dev": { - "psr-4": { - "Dflydev\\DotAccessData\\": "tests/" - } - }, - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "scripts": { - "phpcs": "phpcs", - "phpstan": "phpstan analyse", - "phpunit": "phpunit --no-coverage", - "psalm": "psalm", - "test": [ - "@phpcs", - "@phpstan", - "@psalm", - "@phpunit" - ] - } -} diff --git a/vendor/eduardovillao/wp-since/.editorconfig b/vendor/eduardovillao/wp-since/.editorconfig deleted file mode 100644 index 53a25d0..0000000 --- a/vendor/eduardovillao/wp-since/.editorconfig +++ /dev/null @@ -1,26 +0,0 @@ -# EditorConfig: https://editorconfig.org - -root = true - -[*] -charset = utf-8 -end_of_line = lf -insert_final_newline = true -indent_style = space -indent_size = 4 -trim_trailing_whitespace = true - -[*.php] -indent_style = space -indent_size = 4 -max_line_length = 120 - -[*.{json,yml,yaml,xml}] -indent_style = space -indent_size = 2 - -[Makefile] -indent_style = tab - -[*.md] -trim_trailing_whitespace = false diff --git a/vendor/eduardovillao/wp-since/.github/CODEOWNERS b/vendor/eduardovillao/wp-since/.github/CODEOWNERS deleted file mode 100644 index 1c2addd..0000000 --- a/vendor/eduardovillao/wp-since/.github/CODEOWNERS +++ /dev/null @@ -1 +0,0 @@ -* @eduardovillao diff --git a/vendor/eduardovillao/wp-since/.github/workflows/ci.yml b/vendor/eduardovillao/wp-since/.github/workflows/ci.yml deleted file mode 100644 index 1a37490..0000000 --- a/vendor/eduardovillao/wp-since/.github/workflows/ci.yml +++ /dev/null @@ -1,27 +0,0 @@ -name: Lint & Test PHP Project - -on: [pull_request] - -jobs: - quality-checks: - name: Code Quality & Tests - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: "8.2" - tools: composer, phpunit, phpcs - - - name: Install dependencies - run: composer install --no-interaction --prefer-dist - - - name: Run PHPCS (PSR-12) - run: composer lint - - - name: Run PHPUnit tests - run: composer tests:unit diff --git a/vendor/eduardovillao/wp-since/.github/workflows/generate-since.yml b/vendor/eduardovillao/wp-since/.github/workflows/generate-since.yml deleted file mode 100644 index bc2b520..0000000 --- a/vendor/eduardovillao/wp-since/.github/workflows/generate-since.yml +++ /dev/null @@ -1,68 +0,0 @@ -name: Generate WP Since Map - -on: - workflow_dispatch: - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - name: Checkout project - uses: actions/checkout@v4 - - - name: Install PHP depencencies - run: | - sudo apt-get update - sudo apt-get install -y php php-cli php-mbstring unzip curl - - - name: Install Composer - run: | - curl -sS https://getcomposer.org/installer | php - sudo mv composer.phar /usr/local/bin/composer - - - name: Install Composer dependencies - run: composer install - - - name: Download WordPress - run: | - curl -O https://wordpress.org/latest.zip - unzip latest.zip -d wp-source - mv wp-source/wordpress/* wp-source/ - - - name: Generate wp-since.json - run: php generate-since-json.php - - - name: Remove temporary files - run: rm -rf wp.tar.gz wp-source - - - name: Install GitHub CLI - run: sudo apt install gh -y - - - name: Authenticate GitHub CLI - env: - GH_TOKEN: ${{ secrets.WP_SINCE_ACTION }} - run: echo "${GH_TOKEN}" | gh auth login --with-token - - - name: Create new branch - run: | - BRANCH_NAME=update-since-map-${{ github.run_number }} - git checkout -b $BRANCH_NAME - echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENV - - - name: Commit changes - run: | - git config --global user.email "github-actions[bot]@users.noreply.github.com" - git config --global user.name "GitHub Actions" - git add wp-since.json - DATE=$(date +"%Y-%m-%d") - git commit -m "chore(data): update since map on $DATE" || echo "Nada pra commitar" - git push origin $BRANCH_NAME - - - name: Create Pull Request - env: - GH_TOKEN: ${{ secrets.WP_SINCE_ACTION }} - run: | - gh pr create --head "$BRANCH_NAME" --base main \ - --title "chore(data): update since map" \ - --body "This PR was automatically generated by a GitHub Action. It updates the \`wp-since.json\` file with the latest WordPress version and its release date." diff --git a/vendor/eduardovillao/wp-since/.gitignore b/vendor/eduardovillao/wp-since/.gitignore deleted file mode 100644 index bd9ddaf..0000000 --- a/vendor/eduardovillao/wp-since/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/vendor -.DS_Store \ No newline at end of file diff --git a/vendor/eduardovillao/wp-since/README.md b/vendor/eduardovillao/wp-since/README.md deleted file mode 100644 index 93e4fdb..0000000 --- a/vendor/eduardovillao/wp-since/README.md +++ /dev/null @@ -1,131 +0,0 @@ -# WP Since - -![License](https://img.shields.io/badge/license-MIT-blue.svg) -[![Code Style: PSR-12](https://img.shields.io/badge/code%20style-PSR--12-blue)](https://www.php-fig.org/psr/psr-12/) -[![Tests](https://img.shields.io/badge/tests-passing-brightgreen)](./tests) - -**Make sure your plugin works with the right WordPress version — automatically.** -Scans your WordPress plugin to detect all used core symbols and validates them against their official @since versions for accurate compatibility checks. - -## ✨ How It Works - -Ever struggled to define the correct minimum WordPress version for your plugin? - -Worried about accidentally using functions or APIs that don’t exist in declared minimum WP version? - -`wp-since` helps you avoid those headaches by automatically analyzing your plugin’s code and checking compatibility against real WordPress versions. - -### Here’s what it does: - -- 🧠 Scans your plugin for used: - - Functions - - Classes - - Class methods (static and instance) - - Action and filter hooks -- 📖 Reads the declared Requires at least: version from your `readme.txt` -- 🗂️ Compares those symbols with a version map built from WordPress core using `@since` tags -- 🚨 Reports any used symbols that require a newer WP version than what’s declared - -### Example Output - -Let’s say your plugin uses `register_setting()` (introduced in WP `5.5`), but your `readme.txt` declares compatibility with WordPress `5.4`: - -```bash -🔍 Scanning plugin files... -✅ Found readme.txt → Minimum version declared: 5.4 - -🚨 Compatibility issues found: - -┌──────────────────────┬──────────────────┐ -│ Symbol │ Introduced in WP │ -├──────────────────────┼──────────────────┤ -│ register_setting │ 5.5.0 │ -└──────────────────────┴──────────────────┘ - -📌 Suggested version required: 5.5.0 -``` - -Now imagine your code is fully aligned with your declared version: - -```bash -🔍 Scanning plugin files... -✅ Found readme.txt → Minimum version declared: 5.5 - -🎉 No compatibility issues found! -``` - -Simple. Powerful. Automatic. -Because your plugin deserves reliable compatibility. - -## 🚀 Usage - -**Requirements** - -- PHP 7.4+ -- Composer - -🛠️ Install via Composer (recommended) - -```bash -composer require --dev eduardovillao/wp-since -``` - -▶️ Run the compatibility check - -```bash -./vendor/bin/wp-since check ./path-to-your-plugin -``` - -### 🧹 Ignore Files & Folders - -By default, wp-since scans all `.php` files in your plugin directory. - -But what about files that don’t make it into your final plugin zip — like tests or dev tools? No worries — wp-since respects your ignore rules. - -**Supported ignore sources:** - -- `.distignore` -- `.gitattributes` with `export-ignore` - -If any of those files are present, wp-since will automatically ignore the listed files or folders during analysis — just like svn export or plugin deployment. - -Example: .gitattributes - -```txt -/tests/ export-ignore -/tools/debug.php export-ignore -``` - -Example: .distignore - -```txt -/tests -/tools/debug.php -``` - -> These paths will be excluded from compatibility checks. This helps avoid false positives caused by test or development files. - -### 📝 Inline Ignore - -You can ignore specific lines from the scan by adding a special inline comment. - -This is useful when you conditionally use a newer function but know it’s safe, like: - -```php -if (function_exists('wp_some_new_func')) { - return wp_some_new_func(); // @wp-since ignore -} -``` - -> Only inline comments on the same line will be considered — comments above the line won’t trigger ignores. - -## 🛠️ Coming Soon - -- GitHub Action integration -- HTML/Markdown reports -- Export for CI/CD pipelines - -## 📜 License - -MIT © [Eduardo Villão](https://github.com/eduardovillao) -Use freely, contribute gladly. diff --git a/vendor/eduardovillao/wp-since/bin/wp-since b/vendor/eduardovillao/wp-since/bin/wp-since deleted file mode 100644 index 2a4ad2a..0000000 --- a/vendor/eduardovillao/wp-since/bin/wp-since +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env php -=7.4", - "nikic/php-parser": "^4.15" - }, - "require-dev": { - "phpunit/phpunit": "^10.5", - "squizlabs/php_codesniffer": "^3.12" - }, - "autoload": { - "psr-4": { - "WP_Since\\": "src/" - } - }, - "bin": [ - "bin/wp-since" - ], - "scripts": { - "check": "php bin/wp-since check ./tests/fixtures/plugin-full-test", - "generate-since": "php generate-since-json.php", - "tests:unit": "phpunit tests --testdox --colors", - "lint": "phpcs", - "lint:fix": "phpcbf" - }, - "minimum-stability": "stable", - "prefer-stable": true, - "support": { - "issues": "https://github.com/eduardovillao/wp-since/issues", - "source": "https://github.com/eduardovillao/wp-since" - } -} diff --git a/vendor/eduardovillao/wp-since/composer.lock b/vendor/eduardovillao/wp-since/composer.lock deleted file mode 100644 index cd566e3..0000000 --- a/vendor/eduardovillao/wp-since/composer.lock +++ /dev/null @@ -1,1728 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "be2810f9ad06c975eb7bba257dc54afb", - "packages": [ - { - "name": "nikic/php-parser", - "version": "v4.19.4", - "source": { - "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "715f4d25e225bc47b293a8b997fe6ce99bf987d2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/715f4d25e225bc47b293a8b997fe6ce99bf987d2", - "reference": "715f4d25e225bc47b293a8b997fe6ce99bf987d2", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": ">=7.1" - }, - "require-dev": { - "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" - }, - "bin": [ - "bin/php-parse" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.9-dev" - } - }, - "autoload": { - "psr-4": { - "PhpParser\\": "lib/PhpParser" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Nikita Popov" - } - ], - "description": "A PHP parser written in PHP", - "keywords": [ - "parser", - "php" - ], - "support": { - "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.4" - }, - "time": "2024-09-29T15:01:53+00:00" - } - ], - "packages-dev": [ - { - "name": "myclabs/deep-copy", - "version": "1.13.0", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "024473a478be9df5fdaca2c793f2232fe788e414" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/024473a478be9df5fdaca2c793f2232fe788e414", - "reference": "024473a478be9df5fdaca2c793f2232fe788e414", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "conflict": { - "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3 <3.2.2" - }, - "require-dev": { - "doctrine/collections": "^1.6.8", - "doctrine/common": "^2.13.3 || ^3.2.2", - "phpspec/prophecy": "^1.10", - "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" - }, - "type": "library", - "autoload": { - "files": [ - "src/DeepCopy/deep_copy.php" - ], - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ], - "support": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.13.0" - }, - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" - } - ], - "time": "2025-02-12T12:17:51+00:00" - }, - { - "name": "phar-io/manifest", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "54750ef60c58e43759730615a392c31c80e23176" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", - "reference": "54750ef60c58e43759730615a392c31c80e23176", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-phar": "*", - "ext-xmlwriter": "*", - "phar-io/version": "^3.0.1", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "support": { - "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.4" - }, - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "time": "2024-03-03T12:33:53+00:00" - }, - { - "name": "phar-io/version", - "version": "3.2.1", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Library for handling version information and constraints", - "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.2.1" - }, - "time": "2022-02-21T01:04:05+00:00" - }, - { - "name": "phpunit/php-code-coverage", - "version": "10.1.16", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "7e308268858ed6baedc8704a304727d20bc07c77" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e308268858ed6baedc8704a304727d20bc07c77", - "reference": "7e308268858ed6baedc8704a304727d20bc07c77", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-xmlwriter": "*", - "nikic/php-parser": "^4.19.1 || ^5.1.0", - "php": ">=8.1", - "phpunit/php-file-iterator": "^4.1.0", - "phpunit/php-text-template": "^3.0.1", - "sebastian/code-unit-reverse-lookup": "^3.0.0", - "sebastian/complexity": "^3.2.0", - "sebastian/environment": "^6.1.0", - "sebastian/lines-of-code": "^2.0.2", - "sebastian/version": "^4.0.1", - "theseer/tokenizer": "^1.2.3" - }, - "require-dev": { - "phpunit/phpunit": "^10.1" - }, - "suggest": { - "ext-pcov": "PHP extension that provides line coverage", - "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "10.1.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.16" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-08-22T04:31:57+00:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "4.1.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", - "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-08-31T06:24:48+00:00" - }, - { - "name": "phpunit/php-invoker", - "version": "4.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", - "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "ext-pcntl": "*", - "phpunit/phpunit": "^10.0" - }, - "suggest": { - "ext-pcntl": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Invoke callables with a timeout", - "homepage": "https://github.com/sebastianbergmann/php-invoker/", - "keywords": [ - "process" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T06:56:09+00:00" - }, - { - "name": "phpunit/php-text-template", - "version": "3.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", - "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-08-31T14:07:24+00:00" - }, - { - "name": "phpunit/php-timer", - "version": "6.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", - "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T06:57:52+00:00" - }, - { - "name": "phpunit/phpunit", - "version": "10.5.45", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "bd68a781d8e30348bc297449f5234b3458267ae8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/bd68a781d8e30348bc297449f5234b3458267ae8", - "reference": "bd68a781d8e30348bc297449f5234b3458267ae8", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.12.1", - "phar-io/manifest": "^2.0.4", - "phar-io/version": "^3.2.1", - "php": ">=8.1", - "phpunit/php-code-coverage": "^10.1.16", - "phpunit/php-file-iterator": "^4.1.0", - "phpunit/php-invoker": "^4.0.0", - "phpunit/php-text-template": "^3.0.1", - "phpunit/php-timer": "^6.0.0", - "sebastian/cli-parser": "^2.0.1", - "sebastian/code-unit": "^2.0.0", - "sebastian/comparator": "^5.0.3", - "sebastian/diff": "^5.1.1", - "sebastian/environment": "^6.1.0", - "sebastian/exporter": "^5.1.2", - "sebastian/global-state": "^6.0.2", - "sebastian/object-enumerator": "^5.0.0", - "sebastian/recursion-context": "^5.0.0", - "sebastian/type": "^4.0.0", - "sebastian/version": "^4.0.1" - }, - "suggest": { - "ext-soap": "To be able to generate mocks based on WSDL files" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "10.5-dev" - } - }, - "autoload": { - "files": [ - "src/Framework/Assert/Functions.php" - ], - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.45" - }, - "funding": [ - { - "url": "https://phpunit.de/sponsors.html", - "type": "custom" - }, - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", - "type": "tidelift" - } - ], - "time": "2025-02-06T16:08:12+00:00" - }, - { - "name": "sebastian/cli-parser", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", - "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for parsing CLI options", - "homepage": "https://github.com/sebastianbergmann/cli-parser", - "support": { - "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-02T07:12:49+00:00" - }, - { - "name": "sebastian/code-unit", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", - "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the PHP code units", - "homepage": "https://github.com/sebastianbergmann/code-unit", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T06:58:43+00:00" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", - "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T06:59:15+00:00" - }, - { - "name": "sebastian/comparator", - "version": "5.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e", - "reference": "a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-mbstring": "*", - "php": ">=8.1", - "sebastian/diff": "^5.0", - "sebastian/exporter": "^5.0" - }, - "require-dev": { - "phpunit/phpunit": "^10.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "https://github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/comparator/issues", - "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-10-18T14:56:07+00:00" - }, - { - "name": "sebastian/complexity", - "version": "3.2.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "68ff824baeae169ec9f2137158ee529584553799" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", - "reference": "68ff824baeae169ec9f2137158ee529584553799", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.2-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for calculating the complexity of PHP code units", - "homepage": "https://github.com/sebastianbergmann/complexity", - "support": { - "issues": "https://github.com/sebastianbergmann/complexity/issues", - "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-12-21T08:37:17+00:00" - }, - { - "name": "sebastian/diff", - "version": "5.1.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", - "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0", - "symfony/process": "^6.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/diff/issues", - "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-02T07:15:17+00:00" - }, - { - "name": "sebastian/environment", - "version": "6.1.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", - "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "suggest": { - "ext-posix": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "https://github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/environment/issues", - "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-23T08:47:14+00:00" - }, - { - "name": "sebastian/exporter", - "version": "5.1.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "955288482d97c19a372d3f31006ab3f37da47adf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/955288482d97c19a372d3f31006ab3f37da47adf", - "reference": "955288482d97c19a372d3f31006ab3f37da47adf", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "php": ">=8.1", - "sebastian/recursion-context": "^5.0" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "https://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/exporter/issues", - "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-02T07:17:12+00:00" - }, - { - "name": "sebastian/global-state", - "version": "6.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", - "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "sebastian/object-reflector": "^3.0", - "sebastian/recursion-context": "^5.0" - }, - "require-dev": { - "ext-dom": "*", - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Snapshotting of global state", - "homepage": "https://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/global-state/issues", - "security": "https://github.com/sebastianbergmann/global-state/security/policy", - "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-02T07:19:19+00:00" - }, - { - "name": "sebastian/lines-of-code", - "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", - "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for counting the lines of code in PHP source code", - "homepage": "https://github.com/sebastianbergmann/lines-of-code", - "support": { - "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-12-21T08:38:20+00:00" - }, - { - "name": "sebastian/object-enumerator", - "version": "5.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", - "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "sebastian/object-reflector": "^3.0", - "sebastian/recursion-context": "^5.0" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T07:08:32+00:00" - }, - { - "name": "sebastian/object-reflector", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", - "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T07:06:18+00:00" - }, - { - "name": "sebastian/recursion-context", - "version": "5.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "05909fb5bc7df4c52992396d0116aed689f93712" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712", - "reference": "05909fb5bc7df4c52992396d0116aed689f93712", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "https://github.com/sebastianbergmann/recursion-context", - "support": { - "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T07:05:40+00:00" - }, - { - "name": "sebastian/type", - "version": "4.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/type.git", - "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", - "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the types of the PHP type system", - "homepage": "https://github.com/sebastianbergmann/type", - "support": { - "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T07:10:45+00:00" - }, - { - "name": "sebastian/version", - "version": "4.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", - "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "support": { - "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-07T11:34:05+00:00" - }, - { - "name": "squizlabs/php_codesniffer", - "version": "3.12.1", - "source": { - "type": "git", - "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "ea16a1f3719783345febd3aab41beb55c8c84bfd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/ea16a1f3719783345febd3aab41beb55c8c84bfd", - "reference": "ea16a1f3719783345febd3aab41beb55c8c84bfd", - "shasum": "" - }, - "require": { - "ext-simplexml": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": ">=5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" - }, - "bin": [ - "bin/phpcbf", - "bin/phpcs" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Greg Sherwood", - "role": "Former lead" - }, - { - "name": "Juliette Reinders Folmer", - "role": "Current lead" - }, - { - "name": "Contributors", - "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" - } - ], - "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", - "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", - "keywords": [ - "phpcs", - "standards", - "static analysis" - ], - "support": { - "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", - "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", - "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", - "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" - }, - "funding": [ - { - "url": "https://github.com/PHPCSStandards", - "type": "github" - }, - { - "url": "https://github.com/jrfnl", - "type": "github" - }, - { - "url": "https://opencollective.com/php_codesniffer", - "type": "open_collective" - }, - { - "url": "https://thanks.dev/u/gh/phpcsstandards", - "type": "thanks_dev" - } - ], - "time": "2025-04-04T12:57:55+00:00" - }, - { - "name": "theseer/tokenizer", - "version": "1.2.3", - "source": { - "type": "git", - "url": "https://github.com/theseer/tokenizer.git", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - } - ], - "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "support": { - "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.3" - }, - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "time": "2024-03-03T12:36:25+00:00" - } - ], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": ">=7.4" - }, - "platform-dev": [], - "plugin-api-version": "2.6.0" -} diff --git a/vendor/eduardovillao/wp-since/generate-since-json.php b/vendor/eduardovillao/wp-since/generate-since-json.php deleted file mode 100644 index 13595c4..0000000 --- a/vendor/eduardovillao/wp-since/generate-since-json.php +++ /dev/null @@ -1,133 +0,0 @@ -create(ParserFactory::PREFER_PHP7); -$result = []; - -class SinceExtractor extends NodeVisitorAbstract -{ - private $file; - private $result; - - public function __construct($file, &$result) - { - $this->file = $file; - $this->result = &$result; - } - - public function enterNode(Node $node) - { - $doc = $node->getDocComment(); - $docText = $doc ? $doc->getText() : null; - $since = $this->extractTag($docText, '@since'); - $deprecated = $this->extractTag($docText, '@deprecated'); - - if ($node instanceof Node\Stmt\Function_) { - $this->addResult($node->name->toString(), 'function', $since, $deprecated); - } elseif ($node instanceof Node\Stmt\Class_ || $node instanceof Node\Stmt\Interface_ || $node instanceof Node\Stmt\Trait_) { - $type = $node instanceof Node\Stmt\Class_ ? 'class' : ($node instanceof Node\Stmt\Interface_ ? 'interface' : 'trait'); - $this->addResult($node->name->toString(), $type, $since, $deprecated); - } elseif ($node instanceof Node\Stmt\ClassMethod && !$node->isPrivate()) { - $class = $node->getAttribute('parent'); - $className = $class instanceof Node\Stmt\Class_ && $class->name ? $class->name->toString() : 'Anonymous'; - $methodName = $node->name->toString(); - $methodSince = $since ?: ($class && $class->getDocComment() ? $this->extractTag($class->getDocComment()->getText(), '@since') : null); - if ($className !== 'Anonymous' && $methodSince) { - $this->addResult("$className::$methodName", 'method', $methodSince, $deprecated); - } - } elseif ( - $node instanceof Node\Expr\FuncCall && - $node->name instanceof Node\Name && - in_array($node->name->toString(), ['do_action', 'apply_filters'], true) - ) { - $hookNameNode = $node->args[0]->value ?? null; - if ($hookNameNode instanceof Node\Scalar\String_) { - $hookName = $hookNameNode->value; - $this->addResult($hookName, 'hook', $since, $deprecated); - } - } - } - - private function extractTag($docText, $tag) - { - if ($docText && preg_match('/' . preg_quote($tag) . '\s+([0-9.]+)/', $docText, $matches)) { - $version = $matches[1]; - if ($version === 'MU') return '3.0.0'; - if (preg_match('/^\d+\.\d+(\.\d+)?$/', $version)) return $version; - } - return null; - } - - private function addResult($name, $type, $since, $deprecated) - { - if ($since) { - $this->result[$name] = array_filter([ - 'type' => $type, - 'since' => $since, - 'deprecated' => $deprecated, - 'file' => $this->file - ]); - } - } -} - -$rii = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($sourceDir)); - -foreach ($rii as $file) { - if ($file->isDir() || $file->getExtension() !== 'php') continue; - $relativePath = str_replace($sourceDir . '/', '', $file->getPathname()); - - foreach ($excludedPaths as $excluded) { - if (strpos($relativePath, $excluded) === 0) continue 2; - } - - try { - $code = file_get_contents($file->getPathname()); - $ast = $parser->parse($code); - - $traverser = new NodeTraverser(); - $traverser->addVisitor(new ParentConnectingVisitor()); - $traverser->addVisitor(new SinceExtractor($relativePath, $result)); - $traverser->traverse($ast); - - } catch (Error $e) { - echo "Processing error {$relativePath}: {$e->getMessage()}\n"; - } -} - -file_put_contents($outputPath, json_encode($result, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES)); -echo "✅ File generated in: {$outputPath}\n"; diff --git a/vendor/eduardovillao/wp-since/phpcs.xml b/vendor/eduardovillao/wp-since/phpcs.xml deleted file mode 100644 index 9594e6c..0000000 --- a/vendor/eduardovillao/wp-since/phpcs.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - PHP_CodeSniffer configuration for WP-Since - - - - - - src - tests - - - vendor/* - tests/fixtures/* - - - diff --git a/vendor/eduardovillao/wp-since/src/Checker/CompatibilityChecker.php b/vendor/eduardovillao/wp-since/src/Checker/CompatibilityChecker.php deleted file mode 100644 index 3d3c936..0000000 --- a/vendor/eduardovillao/wp-since/src/Checker/CompatibilityChecker.php +++ /dev/null @@ -1,31 +0,0 @@ -sinceMap = $sinceMap; - } - - public function check(array $symbols, string $declaredVersion): array - { - $incompatible = []; - - foreach ($symbols as $symbol) { - if ( - isset($this->sinceMap[$symbol]) && - VersionHelper::compare($declaredVersion, $this->sinceMap[$symbol]['since']) < 0 - ) { - $incompatible[$symbol] = $this->sinceMap[$symbol]['since']; - } - } - - return $incompatible; - } -} diff --git a/vendor/eduardovillao/wp-since/src/Resolver/IgnoreRulesResolver.php b/vendor/eduardovillao/wp-since/src/Resolver/IgnoreRulesResolver.php deleted file mode 100644 index ed882dd..0000000 --- a/vendor/eduardovillao/wp-since/src/Resolver/IgnoreRulesResolver.php +++ /dev/null @@ -1,61 +0,0 @@ - $line !== '' && $line[0] !== '#'); - } - - private static function parseGitAttributes(string $file): array - { - $lines = file($file); - $ignores = []; - - foreach ($lines as $line) { - if (strpos($line, 'export-ignore') !== false) { - $parts = preg_split('/\s+/', trim($line)); - if (!empty($parts[0])) { - $ignores[] = $parts[0]; - } - } - } - - return $ignores; - } - - public static function shouldIgnore(string $relativePath, array $ignorePaths): bool - { - foreach ($ignorePaths as $ignored) { - $normalized = ltrim($ignored, '/'); - if ( - $relativePath === $normalized || - str_starts_with($relativePath, rtrim($normalized, '/') . '/') - ) { - return true; - } - } - return false; - } -} diff --git a/vendor/eduardovillao/wp-since/src/Resolver/InlineIgnoreResolver.php b/vendor/eduardovillao/wp-since/src/Resolver/InlineIgnoreResolver.php deleted file mode 100644 index 0207f1c..0000000 --- a/vendor/eduardovillao/wp-since/src/Resolver/InlineIgnoreResolver.php +++ /dev/null @@ -1,26 +0,0 @@ - ['startLine']]); - $lexer->startLexing($code); - - $ignoredLines = []; - - foreach ($lexer->getTokens() as $token) { - if (is_array($token) && in_array($token[0], [T_COMMENT, T_DOC_COMMENT], true)) { - if (strpos($token[1], '@wp-since ignore') !== false) { - $ignoredLines[] = $token[2]; - } - } - } - - return $ignoredLines; - } -} diff --git a/vendor/eduardovillao/wp-since/src/Resolver/VersionResolver.php b/vendor/eduardovillao/wp-since/src/Resolver/VersionResolver.php deleted file mode 100644 index 71beb87..0000000 --- a/vendor/eduardovillao/wp-since/src/Resolver/VersionResolver.php +++ /dev/null @@ -1,77 +0,0 @@ - $version, 'source' => 'main plugin file header']; - } - } - - $readme = self::findReadmeFile($pluginPath); - if ($readme) { - $version = self::extractVersionFromReadme($readme); - if ($version) { - return ['version' => $version, 'source' => 'readme']; - } - } - - return null; - } - - private static function findMainPluginFile(string $pluginPath): ?string - { - $basename = basename($pluginPath); - $candidate = "{$pluginPath}/{$basename}.php"; - if (file_exists($candidate)) { - return $candidate; - } - - return null; - } - - private static function extractVersionFromPluginHeader(string $file): ?string - { - $contents = file_get_contents($file); - if (!$contents) { - return null; - } - - if (preg_match('/^\s*\*\s+Requires at least:\s*([0-9.]+)/mi', $contents, $matches)) { - return $matches[1]; - } - - return null; - } - - private static function findReadmeFile(string $pluginPath): ?string - { - foreach (['readme.txt', 'README.txt'] as $filename) { - $full = "{$pluginPath}/{$filename}"; - if (file_exists($full)) { - return $full; - } - } - return null; - } - - private static function extractVersionFromReadme(string $file): ?string - { - $lines = file($file); - foreach ($lines as $line) { - if (stripos($line, 'Requires at least:') === 0) { - if (preg_match('/Requires at least:\s*([0-9.]+)/i', $line, $matches)) { - return $matches[1]; - } - } - } - return null; - } -} diff --git a/vendor/eduardovillao/wp-since/src/Runner/PluginCheckCommand.php b/vendor/eduardovillao/wp-since/src/Runner/PluginCheckCommand.php deleted file mode 100644 index 103cea0..0000000 --- a/vendor/eduardovillao/wp-since/src/Runner/PluginCheckCommand.php +++ /dev/null @@ -1,57 +0,0 @@ -check($usedSymbols, $declaredVersion); - - if (count($incompatible)) { - echo "🚨 Compatibility issues found:\n\n"; - $rows = []; - foreach ($incompatible as $symbol => $version) { - $rows[] = [$symbol, $version]; - } - TablePrinter::render($rows, ['Symbol', 'Introduced in WP']); - - $versions = array_values($incompatible); - $maxVersion = array_reduce($versions, function ($carry, $v) { - return VersionHelper::compare($carry, $v) < 0 ? $v : $carry; - }, $declaredVersion); - - echo "📌 Suggested version required: {$maxVersion}\n"; - return 1; - } - - echo "✅ All good! Your plugin is compatible with WP {$declaredVersion}.\n"; - return 0; - } -} diff --git a/vendor/eduardovillao/wp-since/src/Scanner/PluginScanner.php b/vendor/eduardovillao/wp-since/src/Scanner/PluginScanner.php deleted file mode 100644 index 71bbefd..0000000 --- a/vendor/eduardovillao/wp-since/src/Scanner/PluginScanner.php +++ /dev/null @@ -1,55 +0,0 @@ -create(ParserFactory::PREFER_PHP7); - $traverser = new NodeTraverser(); - - $usedSymbols = []; - $varMap = []; - - $traverser->addVisitor(new ParentConnectingVisitor()); - - $ignorePaths = IgnoreRulesResolver::getIgnoredPaths($path); - $rii = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path)); - foreach ($rii as $file) { - $relativePath = str_replace($path . '/', '', $file->getPathname()); - - if ( - $file->isDir() || - $file->getExtension() !== 'php' || - IgnoreRulesResolver::shouldIgnore($relativePath, $ignorePaths) - ) { - continue; - } - - $code = file_get_contents($file->getPathname()); - $ignoredLines = InlineIgnoreResolver::extractIgnoredLines($code); - - $visitor = new SymbolExtractorVisitor($usedSymbols, $varMap, $ignoredLines); - $traverser->addVisitor($visitor); - - try { - $stmts = $parser->parse($code); - $traverser->traverse($stmts); - } catch (\Exception $e) { - // Add error handling - } - - $traverser->removeVisitor($visitor); - } - - return array_unique($usedSymbols); - } -} diff --git a/vendor/eduardovillao/wp-since/src/Scanner/SymbolExtractorVisitor.php b/vendor/eduardovillao/wp-since/src/Scanner/SymbolExtractorVisitor.php deleted file mode 100644 index abd8bf2..0000000 --- a/vendor/eduardovillao/wp-since/src/Scanner/SymbolExtractorVisitor.php +++ /dev/null @@ -1,48 +0,0 @@ -usedSymbols = &$usedSymbols; - $this->varMap = &$varMap; - $this->ignoredLines = $ignoredLines; - - $this->handlers = [ - new SymbolHandlers\FunctionCallHandler(), - new SymbolHandlers\NewClassHandler(), - new SymbolHandlers\StaticCallHandler(), - new SymbolHandlers\MethodCallHandler(), - ]; - } - - public function enterNode(Node $node) - { - if (in_array($node->getStartLine(), $this->ignoredLines, true)) { - return null; - } - - foreach ($this->handlers as $handler) { - if ($handler->supports($node)) { - $symbols = $handler->extract($node, $this->varMap); - foreach ($symbols as $symbol) { - $this->usedSymbols[] = $symbol; - } - break; - } - } - } -} diff --git a/vendor/eduardovillao/wp-since/src/Scanner/SymbolHandlers/FunctionCallHandler.php b/vendor/eduardovillao/wp-since/src/Scanner/SymbolHandlers/FunctionCallHandler.php deleted file mode 100644 index 1cbdaaf..0000000 --- a/vendor/eduardovillao/wp-since/src/Scanner/SymbolHandlers/FunctionCallHandler.php +++ /dev/null @@ -1,27 +0,0 @@ -name instanceof Node\Name; - } - - public function extract(Node $node, array &$varMap = []): array - { - $symbols = [(string) $node->name]; - - if (in_array((string) $node->name, ['do_action', 'apply_filters'], true)) { - $hookNameNode = $node->args[0]->value ?? null; - if ($hookNameNode instanceof Node\Scalar\String_) { - $symbols[] = $hookNameNode->value; - } - } - - return $symbols; - } -} diff --git a/vendor/eduardovillao/wp-since/src/Scanner/SymbolHandlers/MethodCallHandler.php b/vendor/eduardovillao/wp-since/src/Scanner/SymbolHandlers/MethodCallHandler.php deleted file mode 100644 index be9179f..0000000 --- a/vendor/eduardovillao/wp-since/src/Scanner/SymbolHandlers/MethodCallHandler.php +++ /dev/null @@ -1,28 +0,0 @@ -var instanceof Node\Expr\Variable && - $node->name instanceof Node\Identifier; - } - - public function extract(Node $node, array &$varMap = []): array - { - $varName = $node->var->name; - $method = (string) $node->name; - - if (is_string($varName) && isset($varMap[$varName])) { - $class = $varMap[$varName]; - return ["$class::$method"]; - } - - return []; - } -} diff --git a/vendor/eduardovillao/wp-since/src/Scanner/SymbolHandlers/NewClassHandler.php b/vendor/eduardovillao/wp-since/src/Scanner/SymbolHandlers/NewClassHandler.php deleted file mode 100644 index c9a0435..0000000 --- a/vendor/eduardovillao/wp-since/src/Scanner/SymbolHandlers/NewClassHandler.php +++ /dev/null @@ -1,29 +0,0 @@ -class instanceof Node\Name; - } - - public function extract(Node $node, array &$varMap = []): array - { - $symbols = [(string) $node->class]; - - $parent = $node->getAttribute('parent'); - if ( - $parent instanceof Node\Expr\Assign && - $parent->var instanceof Node\Expr\Variable && - is_string($parent->var->name) - ) { - $varMap[$parent->var->name] = (string) $node->class; - } - - return $symbols; - } -} diff --git a/vendor/eduardovillao/wp-since/src/Scanner/SymbolHandlers/StaticCallHandler.php b/vendor/eduardovillao/wp-since/src/Scanner/SymbolHandlers/StaticCallHandler.php deleted file mode 100644 index 694e25f..0000000 --- a/vendor/eduardovillao/wp-since/src/Scanner/SymbolHandlers/StaticCallHandler.php +++ /dev/null @@ -1,22 +0,0 @@ -class instanceof Node\Name && - $node->name instanceof Node\Identifier; - } - - public function extract(Node $node, array &$varMap = []): array - { - $class = (string) $node->class; - $method = (string) $node->name; - return ["$class::$method"]; - } -} diff --git a/vendor/eduardovillao/wp-since/src/Scanner/SymbolHandlers/SymbolHandlerInterface.php b/vendor/eduardovillao/wp-since/src/Scanner/SymbolHandlers/SymbolHandlerInterface.php deleted file mode 100644 index e75ebc7..0000000 --- a/vendor/eduardovillao/wp-since/src/Scanner/SymbolHandlers/SymbolHandlerInterface.php +++ /dev/null @@ -1,15 +0,0 @@ - $header) { - $widths[$i] = strlen($header); - } - - foreach ($rows as $row) { - foreach ($row as $i => $cell) { - $widths[$i] = max($widths[$i], strlen($cell)); - } - } - - $drawLine = function ($left, $middle, $right, $fill = '─') use ($widths) { - echo $left; - foreach ($widths as $i => $w) { - echo str_repeat($fill, $w + 2); - echo $i < count($widths) - 1 ? $middle : $right; - } - echo "\n"; - }; - - $drawRow = function ($row, $sep = '│') use ($widths) { - echo $sep; - foreach ($row as $i => $cell) { - echo ' ' . str_pad($cell, $widths[$i]) . ' ' . $sep; - } - echo "\n"; - }; - - $drawLine('┌', '┬', '┐'); - $drawRow($headers); - $drawLine('├', '┼', '┤'); - foreach ($rows as $row) { - $drawRow($row); - } - $drawLine('└', '┴', '┘'); - echo "\n"; - } -} diff --git a/vendor/eduardovillao/wp-since/src/Utils/VersionHelper.php b/vendor/eduardovillao/wp-since/src/Utils/VersionHelper.php deleted file mode 100644 index fdf7f2b..0000000 --- a/vendor/eduardovillao/wp-since/src/Utils/VersionHelper.php +++ /dev/null @@ -1,33 +0,0 @@ - B - */ - public static function compare(string $versionA, string $versionB): int - { - return version_compare( - self::normalize($versionA), - self::normalize($versionB) - ); - } -} diff --git a/vendor/eduardovillao/wp-since/tests/CompatibilityCheckerTest.php b/vendor/eduardovillao/wp-since/tests/CompatibilityCheckerTest.php deleted file mode 100644 index 71541dd..0000000 --- a/vendor/eduardovillao/wp-since/tests/CompatibilityCheckerTest.php +++ /dev/null @@ -1,53 +0,0 @@ - ['since' => '5.5.0'], - 'WP_Query' => ['since' => '3.0.0'], - 'MyClass::boot' => ['since' => '6.2.0'], - 'custom_hook' => ['since' => '6.0.0'], - ]; - - $symbols = [ - 'register_setting', - 'WP_Query', - 'MyClass::boot', - 'custom_hook', - ]; - - $declaredVersion = '5.5'; - - $checker = new CompatibilityChecker($sinceMap); - $incompatible = $checker->check($symbols, $declaredVersion); - - $this->assertArrayHasKey('MyClass::boot', $incompatible); - $this->assertArrayHasKey('custom_hook', $incompatible); - $this->assertArrayNotHasKey('register_setting', $incompatible); - $this->assertArrayNotHasKey('WP_Query', $incompatible); - $this->assertEquals('6.2.0', $incompatible['MyClass::boot']); - } - - public function testAllSymbolsCompatible() - { - $sinceMap = [ - 'function_one' => ['since' => '5.1.0'], - 'function_two' => ['since' => '5.0.0'], - ]; - - $symbols = ['function_one', 'function_two']; - $declaredVersion = '5.5.0'; - - $checker = new CompatibilityChecker($sinceMap); - $incompatible = $checker->check($symbols, $declaredVersion); - - $this->assertEmpty($incompatible); - } -} diff --git a/vendor/eduardovillao/wp-since/tests/Integration/FullCompatibilityFlowTest.php b/vendor/eduardovillao/wp-since/tests/Integration/FullCompatibilityFlowTest.php deleted file mode 100644 index 7c9b14f..0000000 --- a/vendor/eduardovillao/wp-since/tests/Integration/FullCompatibilityFlowTest.php +++ /dev/null @@ -1,52 +0,0 @@ -assertNotNull($declaredVersion, 'Declared version should not be null'); - $this->assertEquals('5.5', $declaredVersion['version']); - - $sinceMap = [ - 'add_option' => ['since' => '2.0.0'], - 'WP_Query' => ['since' => '3.0.0'], - 'WP_Filesystem::get_contents' => ['since' => '5.1.0'], - 'WP_User::add_cap' => ['since' => '5.7.0'], - 'my_custom_hook' => ['since' => '6.0.0'], - 'my_filter_hook' => ['since' => '5.3.0'], - ]; - - $checker = new CompatibilityChecker($sinceMap); - $incompatible = $checker->check($symbols, $declaredVersion['version']); - - $this->assertArrayHasKey('WP_User::add_cap', $incompatible); - $this->assertArrayHasKey('my_custom_hook', $incompatible); - - $this->assertArrayNotHasKey('add_option', $incompatible); - $this->assertArrayNotHasKey('WP_Query', $incompatible); - $this->assertArrayNotHasKey('WP_Filesystem::get_contents', $incompatible); - $this->assertArrayNotHasKey('my_filter_hook', $incompatible); - - $expected = array_keys($sinceMap); - foreach ($expected as $symbol) { - $this->assertContains($symbol, $symbols, "Missing symbol: {$symbol}"); - - // phpcs:disable Generic.Files.LineLength.TooLong - $this->assertNotContains('some_ignored_func_folder', $symbols, 'Should ignore folder from /ignored-folder/'); - $this->assertNotContains('some_ignored_func_file', $symbols, 'Should ignore specific file /ignore-this.php'); - $this->assertNotContains('some_ignored_func_noslash', $symbols, 'Should ignore folder from ignored-no-slash/'); - } - } -} diff --git a/vendor/eduardovillao/wp-since/tests/PluginScannerTest.php b/vendor/eduardovillao/wp-since/tests/PluginScannerTest.php deleted file mode 100644 index e55bc37..0000000 --- a/vendor/eduardovillao/wp-since/tests/PluginScannerTest.php +++ /dev/null @@ -1,44 +0,0 @@ -assertContains($symbol, $symbols, "Missing: $symbol"); - } - } - - public function testIgnoresSymbolsMarkedWithIgnoreComment() - { - $path = __DIR__ . '/fixtures/plugin-ignore-comment'; - $symbols = PluginScanner::scan($path); - - $this->assertNotContains('add_option', $symbols, 'Should ignore symbol with @wp-since ignore'); - $this->assertNotContains('should_be_ignored', $symbols, 'Should ignore symbolwith @wp-since ignore'); - $this->assertNotContains('wp_is_block_theme', $symbols, 'Should ignore symbol with @wp-since ignore'); - $this->assertNotContains('should_be_ignored_space', $symbols, 'Should ignore symbol with @wp-since ignore'); - $this->assertContains('do_action', $symbols, 'Should detect function call without ignore comment'); - $this->assertContains('my_custom_hook', $symbols, 'Should detect function call without ignore comment'); - $this->assertContains('register_setting', $symbols, 'Should detect function call without ignore comment'); - $this->assertContains('wp_detected_function', $symbols, 'Should detect function call without ignore comment'); - $this->assertContains('need_detect', $symbols, 'Should detect function call without ignore comment'); - } -} diff --git a/vendor/eduardovillao/wp-since/tests/Resolver/IgnoreRulesResolverTest.php b/vendor/eduardovillao/wp-since/tests/Resolver/IgnoreRulesResolverTest.php deleted file mode 100644 index 68bec78..0000000 --- a/vendor/eduardovillao/wp-since/tests/Resolver/IgnoreRulesResolverTest.php +++ /dev/null @@ -1,42 +0,0 @@ -assertTrue(IgnoreRulesResolver::shouldIgnore('tests/helper.php', $ignorePaths)); - $this->assertTrue(IgnoreRulesResolver::shouldIgnore('assets/img/logo.png', $ignorePaths)); - $this->assertTrue(IgnoreRulesResolver::shouldIgnore('example.php', $ignorePaths)); - } - - public function testShouldNotIgnoreNonMatchingPath() - { - $ignorePaths = ['tests/', 'vendor/', 'docs/readme.txt']; - - $this->assertFalse(IgnoreRulesResolver::shouldIgnore('src/Plugin.php', $ignorePaths)); - $this->assertFalse(IgnoreRulesResolver::shouldIgnore('includes/functions.php', $ignorePaths)); - } - - public function testShouldIgnoreNestedPaths() - { - $ignorePaths = ['admin/']; - - $this->assertTrue(IgnoreRulesResolver::shouldIgnore('admin/settings/page.php', $ignorePaths)); - $this->assertTrue(IgnoreRulesResolver::shouldIgnore('admin/page.php', $ignorePaths)); - } - - public function testShouldIgnoreWithOrWithoutLeadingSlash() - { - $ignorePaths = ['/build/', 'temp/']; - - $this->assertTrue(IgnoreRulesResolver::shouldIgnore('build/bundle.js', $ignorePaths)); - $this->assertTrue(IgnoreRulesResolver::shouldIgnore('temp/cache.php', $ignorePaths)); - } -} diff --git a/vendor/eduardovillao/wp-since/tests/TablePrinterTest.php b/vendor/eduardovillao/wp-since/tests/TablePrinterTest.php deleted file mode 100644 index c6cec05..0000000 --- a/vendor/eduardovillao/wp-since/tests/TablePrinterTest.php +++ /dev/null @@ -1,29 +0,0 @@ -assertStringContainsString('register_setting', $output); - $this->assertStringContainsString('some_function', $output); - $this->assertStringContainsString('┌', $output); - $this->assertStringContainsString('┴', $output); - $this->assertStringContainsString('│ Name', $output); - $this->assertStringContainsString('│ Version', $output); - } -} diff --git a/vendor/eduardovillao/wp-since/tests/VersionHelperTest.php b/vendor/eduardovillao/wp-since/tests/VersionHelperTest.php deleted file mode 100644 index 1f26eb5..0000000 --- a/vendor/eduardovillao/wp-since/tests/VersionHelperTest.php +++ /dev/null @@ -1,24 +0,0 @@ -assertEquals('5.5.0', VersionHelper::normalize('5.5')); - $this->assertEquals('5.0.0', VersionHelper::normalize('5')); - $this->assertEquals('6.1.2', VersionHelper::normalize('6.1.2')); - } - - public function testCompareVersions() - { - $this->assertSame(0, VersionHelper::compare('5.5', '5.5.0')); - $this->assertSame(0, VersionHelper::compare('6.1.0', '6.1')); - $this->assertSame(1, VersionHelper::compare('6.2', '6.1.5')); - $this->assertSame(-1, VersionHelper::compare('5.9', '6.0')); - } -} diff --git a/vendor/eduardovillao/wp-since/tests/VersionResolverTest.php b/vendor/eduardovillao/wp-since/tests/VersionResolverTest.php deleted file mode 100644 index e114b6a..0000000 --- a/vendor/eduardovillao/wp-since/tests/VersionResolverTest.php +++ /dev/null @@ -1,35 +0,0 @@ -assertEquals('6.2', $resolved['version']); - $this->assertEquals('main plugin file header', $resolved['source']); - } - - public function testExtractsVersionFromReadmeIfNoHeader() - { - $path = __DIR__ . '/fixtures/plugin-with-readme-only'; - $resolved = VersionResolver::resolve($path); - - $this->assertEquals('5.8', $resolved['version']); - $this->assertEquals('readme', $resolved['source']); - } - - public function testReturnsNullIfVersionNotFoundAnywhere() - { - $path = __DIR__ . '/fixtures/plugin-without-version'; - $resolved = VersionResolver::resolve($path); - - $this->assertNull($resolved); - } -} diff --git a/vendor/eduardovillao/wp-since/tests/fixtures/file-a.php b/vendor/eduardovillao/wp-since/tests/fixtures/file-a.php deleted file mode 100644 index e0d7cd7..0000000 --- a/vendor/eduardovillao/wp-since/tests/fixtures/file-a.php +++ /dev/null @@ -1,5 +0,0 @@ -add_cap('edit_posts'); - -do_action('my_custom_hook', 'param'); -apply_filters('my_filter_hook', 'value'); diff --git a/vendor/eduardovillao/wp-since/tests/fixtures/plugin-full-test/readme.txt b/vendor/eduardovillao/wp-since/tests/fixtures/plugin-full-test/readme.txt deleted file mode 100644 index c9e7386..0000000 --- a/vendor/eduardovillao/wp-since/tests/fixtures/plugin-full-test/readme.txt +++ /dev/null @@ -1,10 +0,0 @@ -=== Test Plugin === -Contributors: evcode -Donate link: https://eduardovillao.me/ -Tags: delivery, wordpress delivery, delivery whatsapp -Requires at least: 5.5 -Tested up to: 6.7 -Stable tag: 2.0 -Requires PHP: 7.4 -License: GPLv2License -URI:https://www.gnu.org/licenses/gpl-2.0.html diff --git a/vendor/eduardovillao/wp-since/tests/fixtures/plugin-ignore-comment/plugin-ignore-comment.php b/vendor/eduardovillao/wp-since/tests/fixtures/plugin-ignore-comment/plugin-ignore-comment.php deleted file mode 100644 index fdea87c..0000000 --- a/vendor/eduardovillao/wp-since/tests/fixtures/plugin-ignore-comment/plugin-ignore-comment.php +++ /dev/null @@ -1,29 +0,0 @@ - for additional information. - -## [Unreleased][unreleased] - -## [2.8.0] - 2025-11-26 - -### Added -- Added a new `HighlightExtension` for marking important text using `==` syntax (#1100) - -### Fixed -- Fixed `AutolinkExtension` incorrectly matching URLs after invalid `www.` prefix (#1095, #1103) - -## [2.7.1] - 2025-07-20 - -### Changed -- Optimized several regular expressions in `RegexHelper` to improve performance (#674, #1086) - -### Fixed -- `EmbedProcessor` no longer calls `updateEmbeds()` when there are no embeds to update (#1081) -- Fixed missing `benchmark.php` CSV path validation for non-existent files (#1068, #1085) - -## [2.7.0] - 2025-05-05 - -This is a **security release** to address a potential cross-site scripting (XSS) vulnerability when using the `AttributesExtension` with untrusted user input. - -### Added -- Added `attributes/allow` config option to specify which attributes users are allowed to set on elements (default allows virtually all attributes) - -### Changed -- The `AttributesExtension` blocks all attributes starting with `on` unless explicitly allowed via the `attributes/allow` config option -- The `allow_unsafe_links` option is now respected by the `AttributesExtension` when users specify `href` and `src` attributes - -## [2.6.2] - 2025-04-18 - -### Fixed - -- Fixed Attributes extension parsing regression (#1071) - -## [2.6.1] - 2024-12-29 - -### Fixed - -- Rendered list items should only add newlines around block-level children (#1059, #1061) - -## [2.6.0] - 2024-12-07 - -This is a **security release** to address potential denial of service attacks when parsing specially crafted, -malicious input from untrusted sources (like user input). - -### Added - -- Added `max_delimiters_per_line` config option to prevent denial of service attacks when parsing malicious input -- Added `table/max_autocompleted_cells` config option to prevent denial of service attacks when parsing large tables -- The `AttributesExtension` now supports attributes without values (#985, #986) -- The `AutolinkExtension` exposes two new configuration options to override the default behavior (#969, #987): - - `autolink/allowed_protocols` - an array of protocols to allow autolinking for - - `autolink/default_protocol` - the default protocol to use when none is specified -- Added `RegexHelper::isWhitespace()` method to check if a given character is an ASCII whitespace character -- Added `CacheableDelimiterProcessorInterface` to ensure linear complexity for dynamic delimiter processing -- Added `Bracket` delimiter type to optimize bracket parsing - -### Changed - -- `[` and `]` are no longer added as `Delimiter` objects on the stack; a new `Bracket` type with its own stack is used instead -- `UrlAutolinkParser` no longer parses URLs with more than 127 subdomains -- Expanded reference links can no longer exceed 100kb, or the size of the input document (whichever is greater) -- Delimiters should always provide a non-null value via `DelimiterInterface::getIndex()` - - We'll attempt to infer the index based on surrounding delimiters where possible -- The `DelimiterStack` now accepts integer positions for any `$stackBottom` argument -- Several small performance optimizations - -## [2.5.3] - 2024-08-16 - -### Changed - -- Made compatible with CommonMark spec 0.31.1, including: - - Remove `source`, add `search` to list of recognized block tags - -## [2.5.2] - 2024-08-14 - -### Changed - -- Boolean attributes now require an explicit `true` value (#1040) - -### Fixed - -- Fixed regression where text could be misinterpreted as an attribute (#1040) - -## [2.5.1] - 2024-07-24 - -### Fixed - -- Fixed attribute parsing incorrectly parsing mustache-like syntax (#1035) -- Fixed incorrect `Table` start line numbers (#1037) - -## [2.5.0] - 2024-07-22 - -### Added - -- The `AttributesExtension` now supports attributes without values (#985, #986) -- The `AutolinkExtension` exposes two new configuration options to override the default behavior (#969, #987): - - `autolink/allowed_protocols` - an array of protocols to allow autolinking for - - `autolink/default_protocol` - the default protocol to use when none is specified - -### Changed - -- Made compatible with CommonMark spec 0.31.0, including: - - Allow closing fence to be followed by tabs - - Remove restrictive limitation on inline comments - - Unicode symbols now treated like punctuation (for purposes of flankingness) - - Trailing tabs on the last line of indented code blocks will be excluded - - Improved HTML comment matching -- `Paragraph`s only containing link reference definitions will be kept in the AST until the `Document` is finalized - - (These were previously removed immediately after parsing the `Paragraph`) - -### Fixed - -- Fixed list tightness not being determined properly in some edge cases -- Fixed incorrect ending line numbers for several block types in various scenarios -- Fixed lowercase inline HTML declarations not being accepted - -## [2.4.4] - 2024-07-22 - -### Fixed - -- Fixed SmartPunct extension changing already-formatted quotation marks (#1030) - -## [2.4.3] - 2024-07-22 - -### Fixed - -- Fixed the Attributes extension not supporting CSS level 3 selectors (#1013) -- Fixed `UrlAutolinkParser` incorrectly parsing text containing `www` anywhere before an autolink (#1025) - - -## [2.4.2] - 2024-02-02 - -### Fixed - -- Fixed declaration parser being too strict -- `FencedCodeRenderer`: don't add `language-` to class if already prefixed - -### Deprecated - -- Returning dynamic values from `DelimiterProcessorInterface::getDelimiterUse()` is deprecated - - You should instead implement `CacheableDelimiterProcessorInterface` to help the engine perform caching to avoid performance issues. -- Failing to set a delimiter's index (or returning `null` from `DelimiterInterface::getIndex()`) is deprecated and will not be supported in 3.0 -- Deprecated `DelimiterInterface::isActive()` and `DelimiterInterface::setActive()`, as these are no longer used by the engine -- Deprecated `DelimiterStack::removeEarlierMatches()` and `DelimiterStack::searchByCharacter()`, as these are no longer used by the engine -- Passing a `DelimiterInterface` as the `$stackBottom` argument to `DelimiterStack::processDelimiters()` or `::removeAll()` is deprecated and will not be supported in 3.0; pass the integer position instead. - -### Fixed - -- Fixed NUL characters not being replaced in the input -- Fixed quadratic complexity parsing unclosed inline links -- Fixed quadratic complexity parsing emphasis and strikethrough delimiters -- Fixed issue where having 500,000+ delimiters could trigger a [known segmentation fault issue in PHP's garbage collection](https://bugs.php.net/bug.php?id=68606) -- Fixed quadratic complexity deactivating link openers -- Fixed quadratic complexity parsing long backtick code spans with no matching closers -- Fixed catastrophic backtracking when parsing link labels/titles - -## [2.4.1] - 2023-08-30 - -### Fixed - -- Fixed `ExternalLinkProcessor` not fully disabling the `rel` attribute when configured to do so (#992) - -## [2.4.0] - 2023-03-24 - -### Added - -- Added generic `CommonMarkException` marker interface for all exceptions thrown by the library -- Added several new specific exception types implementing that marker interface: - - `AlreadyInitializedException` - - `InvalidArgumentException` - - `IOException` - - `LogicException` - - `MissingDependencyException` - - `NoMatchingRendererException` - - `ParserLogicException` -- Added more configuration options to the Heading Permalinks extension (#939): - - `heading_permalink/apply_id_to_heading` - When `true`, the `id` attribute will be applied to the heading element itself instead of the `` tag - - `heading_permalink/heading_class` - class to apply to the heading element - - `heading_permalink/insert` - now accepts `none` to prevent the creation of the `` link -- Added new `table/alignment_attributes` configuration option to control how table cell alignment is rendered (#959) - -### Changed - -- Change several thrown exceptions from `RuntimeException` to `LogicException` (or something extending it), including: - - `CallbackGenerator`s that fail to set a URL or return an expected value - - `MarkdownParser` when deactivating the last block parser or attempting to get an active block parser when they've all been closed - - Adding items to an already-initialized `Environment` - - Rendering a `Node` when no renderer has been registered for it -- `HeadingPermalinkProcessor` now throws `InvalidConfigurationException` instead of `RuntimeException` when invalid config values are given. -- `HtmlElement::setAttribute()` no longer requires the second parameter for boolean attributes -- Several small micro-optimizations -- Changed Strikethrough to only allow 1 or 2 tildes per the updated GFM spec - -### Fixed - -- Fixed inaccurate `@throws` docblocks throughout the codebase, including `ConverterInterface`, `MarkdownConverter`, and `MarkdownConverterInterface`. - - These previously suggested that only `\RuntimeException`s were thrown, which was inaccurate as `\LogicException`s were also possible. - -## [2.3.9] - 2023-02-15 - -### Fixed - -- Fixed autolink extension not detecting some URIs with underscores (#956) - -## [2.3.8] - 2022-12-10 - -### Fixed - -- Fixed parsing issues when `mb_internal_encoding()` is set to something other than `UTF-8` (#951) - -## [2.3.7] - 2022-11-03 - -### Fixed - -- Fixed `TaskListItemMarkerRenderer` not including HTML attributes set on the node by other extensions (#947) - -## [2.3.6] - 2022-10-30 - -### Fixed - -- Fixed unquoted attribute parsing when closing curly brace is followed by certain characters (like a `.`) (#943) - -## [2.3.5] - 2022-07-29 - -### Fixed - -- Fixed error using `InlineParserEngine` when no inline parsers are registered in the `Environment` (#908) - -## [2.3.4] - 2022-07-17 - -### Changed - -- Made a number of small tweaks to the embed extension's parsing behavior to fix #898: - - Changed `EmbedStartParser` to always capture embed-like lines in container blocks, regardless of parent block type - - Changed `EmbedProcessor` to also remove `Embed` blocks that aren't direct children of the `Document` - - Increased the priority of `EmbedProcessor` to `1010` - -### Fixed - -- Fixed `EmbedExtension` not parsing embeds following a list block (#898) - -## [2.3.3] - 2022-06-07 - -### Fixed - -- Fixed `DomainFilteringAdapter` not reindexing the embed list (#884, #885) - -## [2.3.2] - 2022-06-03 - -### Fixed - -- Fixed FootnoteExtension stripping extra characters from tab-indented footnotes (#881) - -## [2.2.5] - 2022-06-03 - -### Fixed - -- Fixed FootnoteExtension stripping extra characters from tab-indented footnotes (#881) - -## [2.3.1] - 2022-05-14 - -### Fixed - -- Fixed AutolinkExtension not ignoring trailing strikethrough syntax (#867) - -## [2.2.4] - 2022-05-14 - -### Fixed - -- Fixed AutolinkExtension not ignoring trailing strikethrough syntax (#867) - -## [2.3.0] - 2022-04-07 - -### Added - -- Added new `EmbedExtension` (#805) -- Added `DocumentRendererInterface` as a replacement for the now-deprecated `MarkdownRendererInterface` - -### Deprecated - -- Deprecated `MarkdownRendererInterface`; use `DocumentRendererInterface` instead - -## [2.2.3] - 2022-02-26 - -### Fixed - -- Fixed front matter parsing with Windows line endings (#821) - -## [2.1.3] - 2022-02-26 - -### Fixed - -- Fixed front matter parsing with Windows line endings (#821) - -## [2.0.4] - 2022-02-26 - -### Fixed - -- Fixed front matter parsing with Windows line endings (#821) - -## [2.2.2] - 2022-02-13 - -### Fixed - -- Fixed double-escaping of image alt text (#806, #810) -- Fixed Psalm typehints for event class names - -## [2.2.1] - 2022-01-25 - -### Fixed - - - Fixed `symfony/deprecation-contracts` constraint - -### Removed - - - Removed deprecation trigger from `MarkdownConverterInterface` to reduce noise - -## [2.2.0] - 2022-01-22 - -### Added - - - Added new `ConverterInterface` - - Added new `MarkdownToXmlConverter` class - - Added new `HtmlDecorator` class which can wrap existing renderers with additional HTML tags - - Added new `table/wrap` config to apply an optional wrapping/container element around a table (#780) - -### Changed - - - `HtmlElement` contents can now consist of any `Stringable`, not just `HtmlElement` and `string` - -### Deprecated - - - Deprecated `MarkdownConverterInterface` and its `convertToHtml()` method; use `ConverterInterface` and `convert()` instead - -## [2.1.2] - 2022-02-13 - -### Fixed - -- Fixed double-escaping of image alt text (#806, #810) -- Fixed Psalm typehints for event class names - -## [2.1.1] - 2022-01-02 - -### Added - - - Added missing return type to `Environment::dispatch()` to fix deprecation warning (#778) - -## [2.1.0] - 2021-12-05 - -### Added - -- Added support for ext-yaml in FrontMatterExtension (#715) -- Added support for symfony/yaml v6.0 in FrontMatterExtension (#739) -- Added new `heading_permalink/aria_hidden` config option (#741) - -### Fixed - - - Fixed PHP 8.1 deprecation warning (#759, #762) - -## [2.0.3] - 2022-02-13 - -### Fixed - -- Fixed double-escaping of image alt text (#806, #810) -- Fixed Psalm typehints for event class names - -## [2.0.2] - 2021-08-14 - -### Changed - -- Bumped minimum version of league/config to support PHP 8.1 - -### Fixed - -- Fixed ability to register block parsers that identify lines starting with letters (#706) - -## [2.0.1] - 2021-07-31 - -### Fixed - -- Fixed nested autolinks (#689) -- Fixed description lists being parsed incorrectly (#692) -- Fixed Table of Contents not respecting Heading Permalink prefixes (#690) - -## [2.0.0] - 2021-07-24 - -No changes were introduced since the previous RC2 release. -See all entries below for a list of changes between 1.x and 2.0. - -## [2.0.0-rc2] - 2021-07-17 - -### Fixed - -- Fixed Mentions inside of links creating nested links against the spec's rules (#688) - -## [2.0.0-rc1] - 2021-07-10 - -No changes were introduced since the previous release. - -## [2.0.0-beta3] - 2021-07-03 - -### Changed - - - Any leading UTF-8 BOM will be stripped from the input - - The `getEnvironment()` method of `CommonMarkConverter` and `GithubFlavoredMarkdownConverter` will always return the concrete, configurable `Environment` for upgrading convenience - - Optimized AST iteration - - Lots of small micro-optimizations - -## [2.0.0-beta2] - 2021-06-27 - -### Added - -- Added new `Node::iterator()` method and `NodeIterator` class for faster AST iteration (#683, #684) - -### Changed - -- Made compatible with CommonMark spec 0.30.0 -- Optimized link label parsing -- Optimized AST iteration for a 50% performance boost in some event listeners (#683, #684) - -### Fixed - -- Fixed processing instructions with EOLs -- Fixed case-insensitive matching for HTML tag types -- Fixed type 7 HTML blocks incorrectly interrupting lazy paragraphs -- Fixed newlines in reference labels not collapsing into spaces -- Fixed link label normalization with escaped newlines -- Fixed unnecessary AST iteration when no default attributes are configured - -## [2.0.0-beta1] - 2021-06-20 - -### Added - - - **Added three new extensions:** - - `FrontMatterExtension` ([see documentation](https://commonmark.thephpleague.com/extensions/front-matter/)) - - `DescriptionListExtension` ([see documentation](https://commonmark.thephpleague.com/extensions/description-lists/)) - - `DefaultAttributesExtension` ([see documentation](https://commonmark.thephpleague.com/extensions/default-attributes/)) - - **Added new `XmlRenderer` to simplify AST debugging** ([see documentation](https://commonmark.thephpleague.com/xml/)) (#431) - - **Added the ability to configure disallowed raw HTML tags** (#507) - - **Added the ability for Mentions to use multiple characters for their symbol** (#514, #550) - - **Added the ability to delegate event dispatching to PSR-14 compliant event dispatcher libraries** - - **Added new configuration options:** - - Added `heading_permalink/min_heading_level` and `heading_permalink/max_heading_level` options to control which headings get permalinks (#519) - - Added `heading_permalink/fragment_prefix` to allow customizing the URL fragment prefix (#602) - - Added `footnote/backref_symbol` option for customizing backreference link appearance (#522) - - Added `slug_normalizer/max_length` option to control the maximum length of generated URL slugs - - Added `slug_normalizer/unique` option to control whether unique slugs should be generated per-document or per-environment - - **Added purity markers throughout the codebase** (verified with Psalm) - - Added `Query` class to simplify Node traversal when looking to take action on certain Nodes - - Added new `HtmlFilter` and `StringContainerHelper` utility classes - - Added new `AbstractBlockContinueParser` class to simplify the creation of custom block parsers - - Added several new classes and interfaces: - - `BlockContinue` - - `BlockContinueParserInterface` - - `BlockContinueParserWithInlinesInterface` - - `BlockStart` - - `BlockStartParserInterface` - - `ChildNodeRendererInterface` - - `ConfigurableExtensionInterface` - - `CursorState` - - `DashParser` (extracted from `PunctuationParser`) - - `DelimiterParser` - - `DocumentBlockParser` - - `DocumentPreRenderEvent` - - `DocumentRenderedEvent` - - `EllipsesParser` (extracted from `PunctuationParser`) - - `ExpressionInterface` - - `FallbackNodeXmlRenderer` - - `InlineParserEngineInterface` - - `InlineParserMatch` - - `MarkdownParserState` - - `MarkdownParserStateInterface` - - `MarkdownRendererInterface` - - `Query` - - `RawMarkupContainerInterface` - - `ReferenceableInterface` - - `RenderedContent` - - `RenderedContentInterface` - - `ReplaceUnpairedQuotesListener` - - `SpecReader` - - `TableOfContentsRenderer` - - `UniqueSlugNormalizer` - - `UniqueSlugNormalizerInterface` - - `XmlRenderer` - - `XmlNodeRendererInterface` - - Added several new methods: - - `Cursor::getCurrentCharacter()` - - `Environment::createDefaultConfiguration()` - - `Environment::setEventDispatcher()` - - `EnvironmentInterface::getExtensions()` - - `EnvironmentInterface::getInlineParsers()` - - `EnvironmentInterface::getSlugNormalizer()` - - `FencedCode::setInfo()` - - `Heading::setLevel()` - - `HtmlRenderer::renderDocument()` - - `InlineParserContext::getFullMatch()` - - `InlineParserContext::getFullMatchLength()` - - `InlineParserContext::getMatches()` - - `InlineParserContext::getSubMatches()` - - `LinkParserHelper::parsePartialLinkLabel()` - - `LinkParserHelper::parsePartialLinkTitle()` - - `Node::assertInstanceOf()` - - `RegexHelper::isLetter()` - - `StringContainerInterface::setLiteral()` - - `TableCell::getType()` - - `TableCell::setType()` - - `TableCell::getAlign()` - - `TableCell::setAlign()` - -### Changed - - - **Changed the converter return type** - - `CommonMarkConverter::convertToHtml()` now returns an instance of `RenderedContentInterface`. This can be cast to a string for backward compatibility with 1.x. - - **Table of Contents items are no longer wrapped with `

` tags** (#613) - - **Heading Permalinks now link to element IDs instead of using `name` attributes** (#602) - - **Heading Permalink IDs and URL fragments now have a `content` prefix by default** (#602) - - **Changes to configuration options:** - - `enable_em` has been renamed to `commonmark/enable_em` - - `enable_strong` has been renamed to `commonmark/enable_strong` - - `use_asterisk` has been renamed to `commonmark/use_asterisk` - - `use_underscore` has been renamed to `commonmark/use_underscore` - - `unordered_list_markers` has been renamed to `commonmark/unordered_list_markers` - - `mentions/*/symbol` has been renamed to `mentions/*/prefix` - - `mentions/*/regex` has been renamed to `mentions/*/pattern` and requires partial regular expressions (without delimiters or flags) - - `max_nesting_level` now defaults to `PHP_INT_MAX` and no longer supports floats - - `heading_permalink/slug_normalizer` has been renamed to `slug_normalizer/instance` - - **Event dispatching is now fully PSR-14 compliant** - - **Moved and renamed several classes** - [see the full list here](https://commonmark.thephpleague.com/2.0/upgrading/#classesnamespaces-renamed) - - The `HeadingPermalinkExtension` and `FootnoteExtension` were modified to ensure they never produce a slug which conflicts with slugs created by the other extension - - `SlugNormalizer::normalizer()` now supports optional prefixes and max length options passed in via the `$context` argument - - The `AbstractBlock::$data` and `AbstractInline::$data` arrays were replaced with a `Data` array-like object on the base `Node` class - - **Implemented a new approach to block parsing.** This was a massive change, so here are the highlights: - - Functionality previously found in block parsers and node elements has moved to block parser factories and block parsers, respectively ([more details](https://commonmark.thephpleague.com/2.0/upgrading/#new-block-parsing-approach)) - - `ConfigurableEnvironmentInterface::addBlockParser()` is now `EnvironmentBuilderInterface::addBlockParserFactory()` - - `ReferenceParser` was re-implemented and works completely different than before - - The paragraph parser no longer needs to be added manually to the environment - - **Implemented a new approach to inline parsing** where parsers can now specify longer strings or regular expressions they want to parse (instead of just single characters): - - `InlineParserInterface::getCharacters()` is now `getMatchDefinition()` and returns an instance of `InlineParserMatch` - - `InlineParserContext::__construct()` now requires the contents to be provided as a `Cursor` instead of a `string` - - **Implemented delimiter parsing as a special type of inline parser** (via the new `DelimiterParser` class) - - **Changed block and inline rendering to use common methods and interfaces** - - `BlockRendererInterface` and `InlineRendererInterface` were replaced by `NodeRendererInterface` with slightly different parameters. All core renderers now implement this interface. - - `ConfigurableEnvironmentInterface::addBlockRenderer()` and `addInlineRenderer()` were combined into `EnvironmentBuilderInterface::addRenderer()` - - `EnvironmentInterface::getBlockRenderersForClass()` and `getInlineRenderersForClass()` are now just `getRenderersForClass()` - - **Completely refactored the Configuration implementation** - - All configuration-specific classes have been moved into a new `league/config` package with a new namespace - - `Configuration` objects must now be configured with a schema and all options must match that schema - arbitrary keys are no longer permitted - - `Configuration::__construct()` no longer accepts the default configuration values - use `Configuration::merge()` instead - - `ConfigurationInterface` now only contains a `get(string $key)`; this method no longer allows arbitrary default values to be returned if the option is missing - - `ConfigurableEnvironmentInterface` was renamed to `EnvironmentBuilderInterface` - - `ExtensionInterface::register()` now requires an `EnvironmentBuilderInterface` param instead of `ConfigurableEnvironmentInterface` - - **Added missing return types to virtually every class and interface method** - - Re-implemented the GFM Autolink extension using the new inline parser approach instead of document processors - - `EmailAutolinkProcessor` is now `EmailAutolinkParser` - - `UrlAutolinkProcessor` is now `UrlAutolinkParser` - - `HtmlElement` can now properly handle array (i.e. `class`) and boolean (i.e. `checked`) attribute values - - `HtmlElement` automatically flattens any attributes with array values into space-separated strings, removing duplicate entries - - Combined separate classes/interfaces into one: - - `DisallowedRawHtmlRenderer` replaces `DisallowedRawHtmlBlockRenderer` and `DisallowedRawHtmlInlineRenderer` - - `NodeRendererInterface` replaces `BlockRendererInterface` and `InlineRendererInterface` - - Renamed the following methods: - - `Environment` and `ConfigurableEnvironmentInterface`: - - `addBlockParser()` is now `addBlockStartParser()` - - `ReferenceMap` and `ReferenceMapInterface`: - - `addReference()` is now `add()` - - `getReference()` is now `get()` - - `listReferences()` is now `getIterator()` - - Various node (block/inline) classes: - - `getContent()` is now `getLiteral()` - - `setContent()` is now `setLiteral()` - - Moved and renamed the following constants: - - `EnvironmentInterface::HTML_INPUT_ALLOW` is now `HtmlFilter::ALLOW` - - `EnvironmentInterface::HTML_INPUT_ESCAPE` is now `HtmlFilter::ESCAPE` - - `EnvironmentInterface::HTML_INPUT_STRIP` is now `HtmlFilter::STRIP` - - `TableCell::TYPE_HEAD` is now `TableCell::TYPE_HEADER` - - `TableCell::TYPE_BODY` is now `TableCell::TYPE_DATA` - - Changed the visibility of the following properties: - - `AttributesInline::$attributes` is now `private` - - `AttributesInline::$block` is now `private` - - `TableCell::$align` is now `private` - - `TableCell::$type` is now `private` - - `TableSection::$type` is now `private` - - Several methods which previously returned `$this` now return `void` - - `Delimiter::setPrevious()` - - `Node::replaceChildren()` - - `Context::setTip()` - - `Context::setContainer()` - - `Context::setBlocksParsed()` - - `AbstractStringContainer::setContent()` - - `AbstractWebResource::setUrl()` - - Several classes are now marked `final`: - - `ArrayCollection` - - `Emphasis` - - `FencedCode` - - `Heading` - - `HtmlBlock` - - `HtmlElement` - - `HtmlInline` - - `IndentedCode` - - `Newline` - - `Strikethrough` - - `Strong` - - `Text` - - `Heading` nodes no longer directly contain a copy of their inner text - - `StringContainerInterface` can now be used for inlines, not just blocks - - `ArrayCollection` only supports integer keys - - `HtmlElement` now implements `Stringable` - - `Cursor::saveState()` and `Cursor::restoreState()` now use `CursorState` objects instead of arrays - - `NodeWalker::next()` now enters, traverses any children, and leaves all elements which may have children (basically all blocks plus any inlines with children). Previously, it only did this for elements explicitly marked as "containers". - - `InvalidOptionException` was removed - - Anything with a `getReference(): ReferenceInterface` method now implements `ReferencableInterface` - - The `SmartPunct` extension now replaces all unpaired `Quote` elements with `Text` elements towards the end of parsing, making the `QuoteRenderer` unnecessary - - Several changes made to the Footnote extension: - - Footnote identifiers can no longer contain spaces - - Anonymous footnotes can now span subsequent lines - - Footnotes can now contain multiple lines of content, including sub-blocks, by indenting them - - Footnote event listeners now have numbered priorities (but still execute in the same order) - - Footnotes must now be separated from previous content by a blank line - - The line numbers (keys) returned via `MarkdownInput::getLines()` now start at 1 instead of 0 - - `DelimiterProcessorCollectionInterface` now extends `Countable` - - `RegexHelper::PARTIAL_` constants must always be used in case-insensitive contexts - - `HeadingPermalinkProcessor` no longer accepts text normalizers via the constructor - these must be provided via configuration instead - - Blocks which can't contain inlines will no longer be asked to render inlines - - `AnonymousFootnoteRefParser` and `HeadingPermalinkProcessor` now implement `EnvironmentAwareInterface` instead of `ConfigurationAwareInterface` - - The second argument to `TextNormalizerInterface::normalize()` must now be an array - - The `title` attribute for `Link` and `Image` nodes is now stored using a dedicated property instead of stashing it in `$data` - - `ListData::$delimiter` now returns either `ListBlock::DELIM_PERIOD` or `ListBlock::DELIM_PAREN` instead of the literal delimiter - -### Fixed - - - **Fixed parsing of footnotes without content** - - **Fixed rendering of orphaned footnotes and footnote refs** - - **Fixed some URL autolinks breaking too early** (#492) - - Fixed `AbstractStringContainer` not actually being `abstract` - -### Removed - - - **Removed support for PHP 7.1, 7.2, and 7.3** (#625, #671) - - **Removed all previously-deprecated functionality:** - - Removed the ability to pass custom `Environment` instances into the `CommonMarkConverter` and `GithubFlavoredMarkdownConverter` constructors - - Removed the `Converter` class and `ConverterInterface` - - Removed the `bin/commonmark` script - - Removed the `Html5Entities` utility class - - Removed the `InlineMentionParser` (use `MentionParser` instead) - - Removed `DefaultSlugGenerator` and `SlugGeneratorInterface` from the `Extension/HeadingPermalink/Slug` sub-namespace (use the new ones under `./SlugGenerator` instead) - - Removed the following `ArrayCollection` methods: - - `add()` - - `set()` - - `get()` - - `remove()` - - `isEmpty()` - - `contains()` - - `indexOf()` - - `containsKey()` - - `replaceWith()` - - `removeGaps()` - - Removed the `ConfigurableEnvironmentInterface::setConfig()` method - - Removed the `ListBlock::TYPE_UNORDERED` constant - - Removed the `CommonMarkConverter::VERSION` constant - - Removed the `HeadingPermalinkRenderer::DEFAULT_INNER_CONTENTS` constant - - Removed the `heading_permalink/inner_contents` configuration option - - **Removed now-unused classes:** - - `AbstractStringContainerBlock` - - `BlockRendererInterface` - - `Context` - - `ContextInterface` - - `Converter` - - `ConverterInterface` - - `InlineRendererInterface` - - `PunctuationParser` (was split into two classes: `DashParser` and `EllipsesParser`) - - `QuoteRenderer` - - `UnmatchedBlockCloser` - - Removed the following methods, properties, and constants: - - `AbstractBlock::$open` - - `AbstractBlock::$lastLineBlank` - - `AbstractBlock::isContainer()` - - `AbstractBlock::canContain()` - - `AbstractBlock::isCode()` - - `AbstractBlock::matchesNextLine()` - - `AbstractBlock::endsWithBlankLine()` - - `AbstractBlock::setLastLineBlank()` - - `AbstractBlock::shouldLastLineBeBlank()` - - `AbstractBlock::isOpen()` - - `AbstractBlock::finalize()` - - `AbstractBlock::getData()` - - `AbstractInline::getData()` - - `ConfigurableEnvironmentInterface::addBlockParser()` - - `ConfigurableEnvironmentInterface::mergeConfig()` - - `Delimiter::setCanClose()` - - `EnvironmentInterface::getConfig()` - - `EnvironmentInterface::getInlineParsersForCharacter()` - - `EnvironmentInterface::getInlineParserCharacterRegex()` - - `HtmlRenderer::renderBlock()` - - `HtmlRenderer::renderBlocks()` - - `HtmlRenderer::renderInline()` - - `HtmlRenderer::renderInlines()` - - `Node::isContainer()` - - `RegexHelper::matchAll()` (use the new `matchFirst()` method instead) - - `RegexHelper::REGEX_WHITESPACE` - - Removed the second `$contents` argument from the `Heading` constructor - -### Deprecated - -**The following things have been deprecated and will not be supported in v3.0:** - - - `Environment::mergeConfig()` (set configuration before instantiation instead) - - `Environment::createCommonMarkEnvironment()` and `Environment::createGFMEnvironment()` - - Alternative 1: Use `CommonMarkConverter` or `GithubFlavoredMarkdownConverter` if you don't need to customize the environment - - Alternative 2: Instantiate a new `Environment` and add the necessary extensions yourself - -[unreleased]: https://github.com/thephpleague/commonmark/compare/2.8.0...HEAD -[2.8.0]: https://github.com/thephpleague/commonmark/compare/2.7.1...2.8.0 -[2.7.1]: https://github.com/thephpleague/commonmark/compare/2.7.0...2.7.1 -[2.7.0]: https://github.com/thephpleague/commonmark/compare/2.6.2...2.7.0 -[2.6.2]: https://github.com/thephpleague/commonmark/compare/2.6.1...2.6.2 -[2.6.1]: https://github.com/thephpleague/commonmark/compare/2.6.0...2.6.1 -[2.6.0]: https://github.com/thephpleague/commonmark/compare/2.5.3...2.6.0 -[2.5.3]: https://github.com/thephpleague/commonmark/compare/2.5.2...2.5.3 -[2.5.2]: https://github.com/thephpleague/commonmark/compare/2.5.1...2.5.2 -[2.5.1]: https://github.com/thephpleague/commonmark/compare/2.5.0...2.5.1 -[2.5.0]: https://github.com/thephpleague/commonmark/compare/2.4.4...2.5.0 -[2.4.4]: https://github.com/thephpleague/commonmark/compare/2.4.3...2.4.4 -[2.4.3]: https://github.com/thephpleague/commonmark/compare/2.4.2...2.4.3 -[2.4.2]: https://github.com/thephpleague/commonmark/compare/2.4.1...2.4.2 -[2.4.1]: https://github.com/thephpleague/commonmark/compare/2.4.0...2.4.1 -[2.4.0]: https://github.com/thephpleague/commonmark/compare/2.3.9...2.4.0 -[2.3.9]: https://github.com/thephpleague/commonmark/compare/2.3.8...2.3.9 -[2.3.8]: https://github.com/thephpleague/commonmark/compare/2.3.7...2.3.8 -[2.3.7]: https://github.com/thephpleague/commonmark/compare/2.3.6...2.3.7 -[2.3.6]: https://github.com/thephpleague/commonmark/compare/2.3.5...2.3.6 -[2.3.5]: https://github.com/thephpleague/commonmark/compare/2.3.4...2.3.5 -[2.3.4]: https://github.com/thephpleague/commonmark/compare/2.3.3...2.3.4 -[2.3.3]: https://github.com/thephpleague/commonmark/compare/2.3.2...2.3.3 -[2.3.2]: https://github.com/thephpleague/commonmark/compare/2.3.2...main -[2.3.1]: https://github.com/thephpleague/commonmark/compare/2.3.0...2.3.1 -[2.3.0]: https://github.com/thephpleague/commonmark/compare/2.2.3...2.3.0 -[2.2.5]: https://github.com/thephpleague/commonmark/compare/2.2.4...2.2.5 -[2.2.4]: https://github.com/thephpleague/commonmark/compare/2.2.3...2.2.4 -[2.2.3]: https://github.com/thephpleague/commonmark/compare/2.2.2...2.2.3 -[2.2.2]: https://github.com/thephpleague/commonmark/compare/2.2.1...2.2.2 -[2.2.1]: https://github.com/thephpleague/commonmark/compare/2.2.0...2.2.1 -[2.2.0]: https://github.com/thephpleague/commonmark/compare/2.1.1...2.2.0 -[2.1.3]: https://github.com/thephpleague/commonmark/compare/2.1.2...2.1.3 -[2.1.2]: https://github.com/thephpleague/commonmark/compare/2.1.1...2.1.2 -[2.1.1]: https://github.com/thephpleague/commonmark/compare/2.0.2...2.1.1 -[2.1.0]: https://github.com/thephpleague/commonmark/compare/2.0.2...2.1.0 -[2.0.4]: https://github.com/thephpleague/commonmark/compare/2.0.3...2.0.4 -[2.0.3]: https://github.com/thephpleague/commonmark/compare/2.0.2...2.0.3 -[2.0.2]: https://github.com/thephpleague/commonmark/compare/2.0.1...2.0.2 -[2.0.1]: https://github.com/thephpleague/commonmark/compare/2.0.0...2.0.1 -[2.0.0]: https://github.com/thephpleague/commonmark/compare/2.0.0-rc2...2.0.0 -[2.0.0-rc2]: https://github.com/thephpleague/commonmark/compare/2.0.0-rc1...2.0.0-rc2 -[2.0.0-rc1]: https://github.com/thephpleague/commonmark/compare/2.0.0-beta3...2.0.0-rc1 -[2.0.0-beta3]: https://github.com/thephpleague/commonmark/compare/2.0.0-beta2...2.0.0-beta3 -[2.0.0-beta2]: https://github.com/thephpleague/commonmark/compare/2.0.0-beta1...2.0.0-beta2 -[2.0.0-beta1]: https://github.com/thephpleague/commonmark/compare/1.6...2.0.0-beta1 diff --git a/vendor/league/commonmark/README.md b/vendor/league/commonmark/README.md deleted file mode 100644 index bade174..0000000 --- a/vendor/league/commonmark/README.md +++ /dev/null @@ -1,225 +0,0 @@ -# league/commonmark - -[![Latest Version](https://img.shields.io/packagist/v/league/commonmark.svg?style=flat-square)](https://packagist.org/packages/league/commonmark) -[![Total Downloads](https://img.shields.io/packagist/dt/league/commonmark.svg?style=flat-square)](https://packagist.org/packages/league/commonmark) -[![Software License](https://img.shields.io/badge/License-BSD--3-brightgreen.svg?style=flat-square)](LICENSE) -[![Build Status](https://img.shields.io/github/actions/workflow/status/thephpleague/commonmark/tests.yml?branch=main&style=flat-square)](https://github.com/thephpleague/commonmark/actions?query=workflow%3ATests+branch%3Amain) -[![Coverage Status](https://img.shields.io/scrutinizer/coverage/g/thephpleague/commonmark.svg?style=flat-square)](https://scrutinizer-ci.com/g/thephpleague/commonmark/code-structure) -[![Quality Score](https://img.shields.io/scrutinizer/g/thephpleague/commonmark.svg?style=flat-square)](https://scrutinizer-ci.com/g/thephpleague/commonmark) -[![Psalm Type Coverage](https://shepherd.dev/github/thephpleague/commonmark/coverage.svg)](https://shepherd.dev/github/thephpleague/commonmark) -[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/126/badge)](https://bestpractices.coreinfrastructure.org/projects/126) -[![Sponsor development of this project](https://img.shields.io/badge/sponsor%20this%20package-%E2%9D%A4-ff69b4.svg?style=flat-square)](https://www.colinodell.com/sponsor) - -![league/commonmark](commonmark-banner.png) - -**league/commonmark** is a highly-extensible PHP Markdown parser created by [Colin O'Dell][@colinodell] which supports the full [CommonMark] spec and [GitHub-Flavored Markdown]. It is based on the [CommonMark JS reference implementation][commonmark.js] by [John MacFarlane] \([@jgm]\). - -## 📦 Installation & Basic Usage - -This project requires PHP 7.4 or higher with the `mbstring` extension. To install it via [Composer] simply run: - -``` bash -$ composer require league/commonmark -``` - -The `CommonMarkConverter` class provides a simple wrapper for converting CommonMark to HTML: - -```php -use League\CommonMark\CommonMarkConverter; - -$converter = new CommonMarkConverter([ - 'html_input' => 'strip', - 'allow_unsafe_links' => false, -]); - -echo $converter->convert('# Hello World!'); - -//

Hello World!

-``` - -Or if you want GitHub-Flavored Markdown, use the `GithubFlavoredMarkdownConverter` class instead: - -```php -use League\CommonMark\GithubFlavoredMarkdownConverter; - -$converter = new GithubFlavoredMarkdownConverter([ - 'html_input' => 'strip', - 'allow_unsafe_links' => false, -]); - -echo $converter->convert('# Hello World!'); - -//

Hello World!

-``` - -Please note that only UTF-8 and ASCII encodings are supported. If your Markdown uses a different encoding please convert it to UTF-8 before running it through this library. - -> [!CAUTION] -> If you will be parsing untrusted input from users, please consider setting the `html_input` and `allow_unsafe_links` options per the example above. See for more details. If you also do choose to allow raw HTML input from untrusted users, consider using a library (like [HTML Purifier](https://github.com/ezyang/htmlpurifier)) to provide additional HTML filtering. - -## 📓 Documentation - -Full documentation on advanced usage, configuration, and customization can be found at [commonmark.thephpleague.com][docs]. - -## ⏫ Upgrading - -Information on how to upgrade to newer versions of this library can be found at . - -## 💻 GitHub-Flavored Markdown - -The `GithubFlavoredMarkdownConverter` shown earlier is a drop-in replacement for the `CommonMarkConverter` which adds additional features found in the GFM spec: - - - Autolinks - - Disallowed raw HTML - - Strikethrough - - Tables - - Task Lists - -See the [Extensions documentation](https://commonmark.thephpleague.com/customization/extensions/) for more details on how to include only certain GFM features if you don't want them all. - -## 🗃️ Related Packages - -### Integrations - -- [CakePHP 3](https://github.com/gourmet/common-mark) -- [Drupal](https://www.drupal.org/project/markdown) -- [Laravel 4+](https://github.com/GrahamCampbell/Laravel-Markdown) -- [Sculpin](https://github.com/bcremer/sculpin-commonmark-bundle) -- [Symfony 2 & 3](https://github.com/webuni/commonmark-bundle) -- [Symfony 4](https://github.com/avensome/commonmark-bundle) -- [Twig Markdown extension](https://github.com/twigphp/markdown-extension) -- [Twig filter and tag](https://github.com/aptoma/twig-markdown) -- [Laravel CommonMark Blog](https://github.com/spekulatius/laravel-commonmark-blog) - -### Included Extensions - -See [our extension documentation](https://commonmark.thephpleague.com/extensions/overview) for a full list of extensions bundled with this library. - -### Community Extensions - -Custom parsers/renderers can be bundled into extensions which extend CommonMark. Here are some that you may find interesting: - - - [Emoji extension](https://github.com/ElGigi/CommonMarkEmoji) - UTF-8 emoji extension with Github tag. - - [Sup Sub extensions](https://github.com/OWS/commonmark-sup-sub-extensions) - Adds support of superscript and subscript (`` and `` HTML tags). - - [YouTube iframe extension](https://github.com/zoonru/commonmark-ext-youtube-iframe) - Replaces youtube link with iframe. - - [Lazy Image extension](https://github.com/simonvomeyser/commonmark-ext-lazy-image) - Adds various options for lazy loading of images. - - [Marker Extension](https://github.com/noah1400/commonmark-marker-extension) - Adds support of highlighted text (`` HTML tag). - - [Pygments Highlighter extension](https://github.com/DanielEScherzer/commonmark-ext-pygments-highlighter) - Adds support for highlighting code with the Pygments library. - - [LatexRenderer extension](https://github.com/samwilson/commonmark-latex) - For rendering Markdown to LaTeX. - -Others can be found on [Packagist under the `commonmark-extension` package type](https://packagist.org/packages/league/commonmark?type=commonmark-extension). - -If you build your own, feel free to submit a PR to add it to this list! - -### Others - -Check out the other cool things people are doing with `league/commonmark`: - -## 🏷️ Versioning - -[SemVer](http://semver.org/) is followed closely. Minor and patch releases should not introduce breaking changes to the codebase; however, they might change the resulting AST or HTML output of parsed Markdown (due to bug fixes, spec changes, etc.) As a result, you might get slightly different HTML, but any custom code built onto this library should still function correctly. - -Any classes or methods marked `@internal` are not intended for use outside of this library and are subject to breaking changes at any time, so please avoid using them. - -## 🛠️ Maintenance & Support - -When a new **minor** version (e.g. `2.0` -> `2.1`) is released, the previous one (`2.0`) will continue to receive security and critical bug fixes for *at least* 3 months. - -When a new **major** version is released (e.g. `1.6` -> `2.0`), the previous one (`1.6`) will receive critical bug fixes for *at least* 3 months and security updates for 6 months after that new release comes out. - -(This policy may change in the future and exceptions may be made on a case-by-case basis.) - -**Professional support, including notification of new releases and security updates, is available through a [Tidelift Subscription](https://tidelift.com/subscription/pkg/packagist-league-commonmark?utm_source=packagist-league-commonmark&utm_medium=referral&utm_campaign=readme).** - -## 👷‍♀️ Contributing - -To report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security). Tidelift will coordinate the fix and disclosure with us. - -If you encounter a bug in the spec, please report it to the [CommonMark] project. Any resulting fix will eventually be implemented in this project as well. - -Contributions to this library are **welcome**, especially ones that: - - * Improve usability or flexibility without compromising our ability to adhere to the [CommonMark spec] - * Mirror fixes made to the [reference implementation][commonmark.js] - * Optimize performance - * Fix issues with adhering to the [CommonMark spec] - -Major refactoring to core parsing logic should be avoided if possible so that we can easily follow updates made to [the reference implementation][commonmark.js]. That being said, we will absolutely consider changes which don't deviate too far from the reference spec or which are favored by other popular CommonMark implementations. - -Please see [CONTRIBUTING](https://github.com/thephpleague/commonmark/blob/main/.github/CONTRIBUTING.md) for additional details. - -## 🧪 Testing - -``` bash -$ composer test -``` - -This will also test league/commonmark against the latest supported spec. - -## 🚀 Performance Benchmarks - -You can compare the performance of **league/commonmark** to other popular parsers by running the included benchmark tool: - -``` bash -$ ./tests/benchmark/benchmark.php -``` - -## 👥 Credits & Acknowledgements - -This code was originally based on the [CommonMark JS reference implementation][commonmark.js] which is written, maintained, and copyrighted by [John MacFarlane]. This project simply wouldn't exist without his work. - -And a huge thanks to all of our amazing contributors: - -
- - - -### Sponsors - -We'd also like to extend our sincere thanks the following sponsors who support ongoing development of this project: - - - [Tidelift](https://tidelift.com/subscription/pkg/packagist-league-commonmark?utm_source=packagist-league-commonmark&utm_medium=referral&utm_campaign=readme) for offering support to both the maintainers and end-users through their [professional support](https://tidelift.com/subscription/pkg/packagist-league-commonmark?utm_source=packagist-league-commonmark&utm_medium=referral&utm_campaign=readme) program - - [Blackfire](https://www.blackfire.io/) for providing an Open-Source Profiler subscription - - [JetBrains](https://www.jetbrains.com/) for supporting this project with complimentary [PhpStorm](https://www.jetbrains.com/phpstorm/) licenses - -Are you interested in sponsoring development of this project? See for a list of ways to contribute. - -## 📄 License - -**league/commonmark** is licensed under the BSD-3 license. See the [`LICENSE`](LICENSE) file for more details. - -## 🏛️ Governance - -This project is primarily maintained by [Colin O'Dell][@colinodell]. Members of the [PHP League] Leadership Team may occasionally assist with some of these duties. - -## 🗺️ Who Uses It? - -This project is used by [Drupal](https://www.drupal.org/project/markdown), [Laravel Framework](https://laravel.com/), [Cachet](https://cachethq.io/), [Firefly III](https://firefly-iii.org/), [Neos](https://www.neos.io/), [Daux.io](https://daux.io/), and [more](https://packagist.org/packages/league/commonmark/dependents)! - ---- - -
- - Get professional support for league/commonmark with a Tidelift subscription - -
- - Tidelift helps make open source sustainable for maintainers while giving companies
assurances about security, maintenance, and licensing for their dependencies. -
-
- -[CommonMark]: http://commonmark.org/ -[CommonMark spec]: http://spec.commonmark.org/ -[commonmark.js]: https://github.com/jgm/commonmark.js -[GitHub-Flavored Markdown]: https://github.github.com/gfm/ -[John MacFarlane]: http://johnmacfarlane.net -[docs]: https://commonmark.thephpleague.com/ -[docs-examples]: https://commonmark.thephpleague.com/customization/overview/#examples -[docs-example-twitter]: https://commonmark.thephpleague.com/customization/inline-parsing#example-1---twitter-handles -[docs-example-smilies]: https://commonmark.thephpleague.com/customization/inline-parsing#example-2---emoticons -[All Contributors]: https://github.com/thephpleague/commonmark/contributors -[@colinodell]: https://www.twitter.com/colinodell -[@jgm]: https://github.com/jgm -[jgm/stmd]: https://github.com/jgm/stmd -[Composer]: https://getcomposer.org/ -[PHP League]: https://thephpleague.com diff --git a/vendor/league/commonmark/composer.json b/vendor/league/commonmark/composer.json deleted file mode 100644 index 2d7a1a8..0000000 --- a/vendor/league/commonmark/composer.json +++ /dev/null @@ -1,129 +0,0 @@ -{ - "name": "league/commonmark", - "type": "library", - "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", - "keywords": ["markdown","parser","commonmark","gfm","github","flavored","github-flavored","md"], - "homepage": "https://commonmark.thephpleague.com", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Colin O'Dell", - "email": "colinodell@gmail.com", - "homepage": "https://www.colinodell.com", - "role": "Lead Developer" - } - ], - "support": { - "docs": "https://commonmark.thephpleague.com/", - "forum": "https://github.com/thephpleague/commonmark/discussions", - "issues": "https://github.com/thephpleague/commonmark/issues", - "rss": "https://github.com/thephpleague/commonmark/releases.atom", - "source": "https://github.com/thephpleague/commonmark" - }, - "require": { - "php": "^7.4 || ^8.0", - "ext-mbstring": "*", - "league/config": "^1.1.1", - "psr/event-dispatcher": "^1.0", - "symfony/deprecation-contracts": "^2.1 || ^3.0", - "symfony/polyfill-php80": "^1.16" - }, - "require-dev": { - "ext-json": "*", - "cebe/markdown": "^1.0", - "commonmark/cmark": "0.31.1", - "commonmark/commonmark.js": "0.31.1", - "composer/package-versions-deprecated": "^1.8", - "embed/embed": "^4.4", - "erusev/parsedown": "^1.0", - "github/gfm": "0.29.0", - "michelf/php-markdown": "^1.4 || ^2.0", - "nyholm/psr7": "^1.5", - "phpstan/phpstan": "^1.8.2", - "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0", - "scrutinizer/ocular": "^1.8.1", - "symfony/finder": "^5.3 | ^6.0 | ^7.0", - "symfony/process": "^5.4 | ^6.0 | ^7.0", - "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0", - "unleashedtech/php-coding-standard": "^3.1.1", - "vimeo/psalm": "^4.24.0 || ^5.0.0 || ^6.0.0" - }, - "minimum-stability": "beta", - "suggest": { - "symfony/yaml": "v2.3+ required if using the Front Matter extension" - }, - "repositories": [ - { - "type": "package", - "package": { - "name": "commonmark/commonmark.js", - "version": "0.31.1", - "dist": { - "url": "https://github.com/commonmark/commonmark.js/archive/0.31.1.zip", - "type": "zip" - } - } - }, - { - "type": "package", - "package": { - "name": "commonmark/cmark", - "version": "0.31.1", - "dist": { - "url": "https://github.com/commonmark/cmark/archive/0.31.1.zip", - "type": "zip" - } - } - }, - { - "type": "package", - "package": { - "name": "github/gfm", - "version": "0.29.0", - "dist": { - "url": "https://github.com/github/cmark-gfm/archive/0.29.0.gfm.13.zip", - "type": "zip" - } - } - } - ], - "autoload": { - "psr-4": { - "League\\CommonMark\\": "src" - } - }, - "autoload-dev": { - "psr-4": { - "League\\CommonMark\\Tests\\Unit\\": "tests/unit", - "League\\CommonMark\\Tests\\Functional\\": "tests/functional", - "League\\CommonMark\\Tests\\PHPStan\\": "tests/phpstan" - } - }, - "scripts": { - "phpcs": "phpcs", - "phpcbf": "phpcbf", - "phpstan": "phpstan analyse", - "phpunit": "phpunit --no-coverage", - "psalm": "psalm --stats", - "pathological": "tests/pathological/test.php", - "test": [ - "@phpcs", - "@phpstan", - "@psalm", - "@phpunit", - "@pathological" - ] - }, - "extra": { - "branch-alias": { - "dev-main": "2.9-dev" - } - }, - "config": { - "allow-plugins": { - "composer/package-versions-deprecated": true, - "dealerdirect/phpcodesniffer-composer-installer": true - }, - "sort-packages": true - } -} diff --git a/vendor/league/commonmark/src/Extension/DisallowedRawHtml/DisallowedRawHtmlRenderer.php b/vendor/league/commonmark/src/Extension/DisallowedRawHtml/DisallowedRawHtmlRenderer.php index 06252a3..2bcb89a 100644 --- a/vendor/league/commonmark/src/Extension/DisallowedRawHtml/DisallowedRawHtmlRenderer.php +++ b/vendor/league/commonmark/src/Extension/DisallowedRawHtml/DisallowedRawHtmlRenderer.php @@ -45,7 +45,7 @@ final class DisallowedRawHtmlRenderer implements NodeRendererInterface, Configur return $rendered; } - $regex = \sprintf('/<(\/?(?:%s)[ \/>])/i', \implode('|', \array_map('preg_quote', $tags))); + $regex = \sprintf('/<(\/?(?:%s)[\s\/>])/i', \implode('|', \array_map('preg_quote', $tags))); // Match these types of tags: <title/> <title /> return \preg_replace($regex, '<$1', $rendered); diff --git a/vendor/league/commonmark/src/Extension/Embed/DomainFilteringAdapter.php b/vendor/league/commonmark/src/Extension/Embed/DomainFilteringAdapter.php index d150764..b00b028 100644 --- a/vendor/league/commonmark/src/Extension/Embed/DomainFilteringAdapter.php +++ b/vendor/league/commonmark/src/Extension/Embed/DomainFilteringAdapter.php @@ -17,16 +17,16 @@ class DomainFilteringAdapter implements EmbedAdapterInterface { private EmbedAdapterInterface $decorated; - /** @psalm-var non-empty-string */ - private string $regex; + /** @var string[] */ + private array $allowedDomains; /** * @param string[] $allowedDomains */ public function __construct(EmbedAdapterInterface $decorated, array $allowedDomains) { - $this->decorated = $decorated; - $this->regex = self::createRegex($allowedDomains); + $this->decorated = $decorated; + $this->allowedDomains = \array_map('strtolower', $allowedDomains); } /** @@ -34,20 +34,29 @@ class DomainFilteringAdapter implements EmbedAdapterInterface */ public function updateEmbeds(array $embeds): void { - $this->decorated->updateEmbeds(\array_values(\array_filter($embeds, function (Embed $embed): bool { - return \preg_match($this->regex, $embed->getUrl()) === 1; - }))); + $this->decorated->updateEmbeds(\array_values(\array_filter($embeds, [$this, 'isAllowed']))); } - /** - * @param string[] $allowedDomains - * - * @psalm-return non-empty-string - */ - private static function createRegex(array $allowedDomains): string + private function isAllowed(Embed $embed): bool { - $allowedDomains = \array_map('preg_quote', $allowedDomains); + $url = $embed->getUrl(); + $scheme = \parse_url($url, \PHP_URL_SCHEME); + if ($scheme === null || $scheme === false) { + // Bare domain (no scheme) - assume https:// so parse_url can extract the host + $url = 'https://' . $url; + } elseif (\strtolower($scheme) !== 'http' && \strtolower($scheme) !== 'https') { + return false; + } - return '/^(?:https?:\/\/)?(?:[^.]+\.)*(' . \implode('|', $allowedDomains) . ')/'; + $host = \parse_url($url, \PHP_URL_HOST); + $host = \strtolower(\rtrim((string) $host, '.')); + + foreach ($this->allowedDomains as $domain) { + if ($host === $domain || \str_ends_with($host, '.' . $domain)) { + return true; + } + } + + return false; } } diff --git a/vendor/league/commonmark/src/Util/UrlEncoder.php b/vendor/league/commonmark/src/Util/UrlEncoder.php index bba1af3..f4aabda 100644 --- a/vendor/league/commonmark/src/Util/UrlEncoder.php +++ b/vendor/league/commonmark/src/Util/UrlEncoder.php @@ -56,7 +56,7 @@ final class UrlEncoder } } - if (\ord($code) < 128) { + if (\strlen($code) === 1 && \ord($code) < 128) { $result .= self::ENCODE_CACHE[\ord($code)]; continue; } diff --git a/vendor/league/config/CHANGELOG.md b/vendor/league/config/CHANGELOG.md deleted file mode 100644 index 9a7813a..0000000 --- a/vendor/league/config/CHANGELOG.md +++ /dev/null @@ -1,42 +0,0 @@ -# Change Log -All notable changes to this project will be documented in this file. -Updates should follow the [Keep a CHANGELOG](https://keepachangelog.com/) principles. - -## [Unreleased][unreleased] - -## [1.2.0] - 2022-12-11 - -### Changed - -- Values can now be set prior to the corresponding schema being registered. -- `exists()` and `get()` now only trigger validation for the relevant schema, not the entire config at once. - -## [1.1.1] - 2021-08-14 - -### Changed - - - Bumped the minimum version of dflydev/dot-access-data for PHP 8.1 support - -## [1.1.0] - 2021-06-19 - -### Changed - -- Bumped the minimum PHP version to 7.4+ -- Bumped the minimum version of nette/schema to 1.2.0 - -## [1.0.1] - 2021-05-31 - -### Fixed - -- Fixed the `ConfigurationExceptionInterface` marker interface not extending `Throwable` (#2) - -## [1.0.0] - 2021-05-31 - -Initial release! 🎉 - -[unreleased]: https://github.com/thephpleague/config/compare/v1.2.0...main -[1.2.0]: https://github.com/thephpleague/config/compare/v1.1.1...v.1.2.0 -[1.1.1]: https://github.com/thephpleague/config/compare/v1.1.0...v1.1.1 -[1.1.0]: https://github.com/thephpleague/config/compare/v1.0.1...v1.1.0 -[1.0.1]: https://github.com/thephpleague/config/compare/v1.0.0...v1.0.1 -[1.0.0]: https://github.com/thephpleague/config/releases/tag/v1.0.0 diff --git a/vendor/league/config/README.md b/vendor/league/config/README.md deleted file mode 100644 index 2304746..0000000 --- a/vendor/league/config/README.md +++ /dev/null @@ -1,153 +0,0 @@ -# league/config - -[![Latest Version](https://img.shields.io/packagist/v/league/config.svg?style=flat-square)](https://packagist.org/packages/league/config) -[![Total Downloads](https://img.shields.io/packagist/dt/league/config.svg?style=flat-square)](https://packagist.org/packages/league/config) -[![Software License](https://img.shields.io/badge/License-BSD--3-brightgreen.svg?style=flat-square)](LICENSE) -[![Build Status](https://img.shields.io/github/workflow/status/thephpleague/config/Tests/main.svg?style=flat-square)](https://github.com/thephpleague/config/actions?query=workflow%3ATests+branch%3Amain) -[![Coverage Status](https://img.shields.io/scrutinizer/coverage/g/thephpleague/config.svg?style=flat-square)](https://scrutinizer-ci.com/g/thephpleague/config/code-structure) -[![Quality Score](https://img.shields.io/scrutinizer/g/thephpleague/config.svg?style=flat-square)](https://scrutinizer-ci.com/g/thephpleague/config) -[![Sponsor development of this project](https://img.shields.io/badge/sponsor%20this%20package-%E2%9D%A4-ff69b4.svg?style=flat-square)](https://www.colinodell.com/sponsor) - -**league/config** helps you define nested configuration arrays with strict schemas and access configuration values with dot notation. It was created by [Colin O'Dell][@colinodell]. - -## 📦 Installation - -This project requires PHP 7.4 or higher. To install it via [Composer] simply run: - -```bash -composer require league/config -``` - -## 🧰️ Basic Usage - -The `Configuration` class provides everything you need to define the configuration structure and fetch values: - -```php -use League\Config\Configuration; -use Nette\Schema\Expect; - -// Define your configuration schema -$config = new Configuration([ - 'database' => Expect::structure([ - 'driver' => Expect::anyOf('mysql', 'postgresql', 'sqlite')->required(), - 'host' => Expect::string()->default('localhost'), - 'port' => Expect::int()->min(1)->max(65535), - 'ssl' => Expect::bool(), - 'database' => Expect::string()->required(), - 'username' => Expect::string()->required(), - 'password' => Expect::string()->nullable(), - ]), - 'logging' => Expect::structure([ - 'enabled' => Expect::bool()->default($_ENV['DEBUG'] == true), - 'file' => Expect::string()->deprecated("use logging.path instead"), - 'path' => Expect::string()->assert(function ($path) { return \is_writeable($path); })->required(), - ]), -]); - -// Set the values, either all at once with `merge()`: -$config->merge([ - 'database' => [ - 'driver' => 'mysql', - 'port' => 3306, - 'database' => 'mydb', - 'username' => 'user', - 'password' => 'secret', - ], -]); - -// Or one-at-a-time with `set()`: -$config->set('logging.path', '/var/log/myapp.log'); - -// You can now retrieve those values with `get()`. -// Validation and defaults will be applied for you automatically -$config->get('database'); // Fetches the entire "database" section as an array -$config->get('database.driver'); // Fetch a specific nested value with dot notation -$config->get('database/driver'); // Fetch a specific nested value with slash notation -$config->get('database.host'); // Returns the default value "localhost" -$config->get('logging.path'); // Guaranteed to be writeable thanks to the assertion in the schema - -// If validation fails an `InvalidConfigurationException` will be thrown: -$config->set('database.driver', 'mongodb'); -$config->get('database.driver'); // InvalidConfigurationException - -// Attempting to fetch a non-existent key will result in an `InvalidConfigurationException` -$config->get('foo.bar'); - -// You could avoid this by checking whether that item exists: -$config->exists('foo.bar'); // Returns `false` -``` - -## 📓 Documentation - -Full documentation can be found at [config.thephpleague.com][docs]. - -## 💭 Philosophy - -This library aims to provide a **simple yet opinionated** approach to configuration with the following goals: - -- The configuration should operate on **arrays with nested values** which are easily accessible -- The configuration structure should be **defined with strict schemas** defining the overall structure, allowed types, and allowed values -- Schemas should be defined using a **simple, fluent interface** -- You should be able to **add and combine schemas but never modify existing ones** -- Both the configuration values and the schema should be **defined and managed with PHP code** -- Schemas should be **immutable**; they should never change once they are set -- Configuration values should never define or influence the schemas - -As a result, this library will likely **never** support features like: - -- Loading and/or exporting configuration values or schemas using YAML, XML, or other files -- Parsing configuration values from a command line or other user interface -- Dynamically changing the schema, allowed values, or default values based on other configuration values - -If you need that functionality you should check out other libraries like: - -- [symfony/config] -- [symfony/options-resolver] -- [hassankhan/config] -- [consolidation/config] -- [laminas/laminas-config] - -## 🏷️ Versioning - -[SemVer](http://semver.org/) is followed closely. Minor and patch releases should not introduce breaking changes to the codebase. - -Any classes or methods marked `@internal` are not intended for use outside this library and are subject to breaking changes at any time, so please avoid using them. - -## 🛠️ Maintenance & Support - -When a new **minor** version (e.g. `1.0` -> `1.1`) is released, the previous one (`1.0`) will continue to receive security and critical bug fixes for *at least* 3 months. - -When a new **major** version is released (e.g. `1.1` -> `2.0`), the previous one (`1.1`) will receive critical bug fixes for *at least* 3 months and security updates for 6 months after that new release comes out. - -(This policy may change in the future and exceptions may be made on a case-by-case basis.) - -## 👷‍️ Contributing - -Contributions to this library are **welcome**! We only ask that you adhere to our [contributor guidelines] and avoid making changes that conflict with our Philosophy above. - -## 🧪 Testing - -```bash -composer test -``` - -## 📄 License - -**league/config** is licensed under the BSD-3 license. See the [`LICENSE.md`][license] file for more details. - -## 🗺️ Who Uses It? - -This project is used by [league/commonmark][league-commonmark]. - -[docs]: https://config.thephpleague.com/ -[@colinodell]: https://www.twitter.com/colinodell -[Composer]: https://getcomposer.org/ -[PHP League]: https://thephpleague.com -[symfony/config]: https://symfony.com/doc/current/components/config.html -[symfony/options-resolver]: https://symfony.com/doc/current/components/options_resolver.html -[hassankhan/config]: https://github.com/hassankhan/config -[consolidation/config]: https://github.com/consolidation/config -[laminas/laminas-config]: https://docs.laminas.dev/laminas-config/ -[contributor guidelines]: https://github.com/thephpleague/config/blob/main/.github/CONTRIBUTING.md -[license]: https://github.com/thephpleague/config/blob/main/LICENSE.md -[league-commonmark]: https://commonmark.thephpleague.com diff --git a/vendor/league/config/composer.json b/vendor/league/config/composer.json deleted file mode 100644 index 3cd8d87..0000000 --- a/vendor/league/config/composer.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "name": "league/config", - "type": "library", - "description": "Define configuration arrays with strict schemas and access values with dot notation", - "keywords": ["configuration","config","schema","array","nested","dot","dot-access"], - "homepage": "https://config.thephpleague.com", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Colin O'Dell", - "email": "colinodell@gmail.com", - "homepage": "https://www.colinodell.com", - "role": "Lead Developer" - } - ], - "support": { - "docs": "https://config.thephpleague.com/", - "issues": "https://github.com/thephpleague/config/issues", - "rss": "https://github.com/thephpleague/config/releases.atom", - "source": "https://github.com/thephpleague/config" - }, - "require": { - "php": "^7.4 || ^8.0", - "dflydev/dot-access-data": "^3.0.1", - "nette/schema": "^1.2" - }, - "require-dev": { - "phpstan/phpstan": "^1.8.2", - "phpunit/phpunit": "^9.5.5", - "scrutinizer/ocular": "^1.8.1", - "unleashedtech/php-coding-standard": "^3.1", - "vimeo/psalm": "^4.7.3" - }, - "minimum-stability": "dev", - "prefer-stable": true, - "autoload": { - "psr-4": { - "League\\Config\\": "src" - } - }, - "autoload-dev": { - "psr-4": { - "League\\Config\\Tests\\": "tests" - } - }, - "scripts": { - "phpcs": "phpcs", - "phpstan": "phpstan analyse", - "phpunit": "phpunit --no-coverage", - "psalm": "psalm", - "test": [ - "@phpcs", - "@phpstan", - "@psalm", - "@phpunit" - ] - }, - "extra": { - "branch-alias": { - "dev-main": "1.2-dev" - } - }, - "config": { - "sort-packages": true, - "allow-plugins": { - "dealerdirect/phpcodesniffer-composer-installer": true - } - } -} diff --git a/vendor/myclabs/deep-copy/LICENSE b/vendor/myclabs/deep-copy/LICENSE deleted file mode 100644 index c3e8350..0000000 --- a/vendor/myclabs/deep-copy/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013 My C-Sense - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/myclabs/deep-copy/README.md b/vendor/myclabs/deep-copy/README.md deleted file mode 100644 index 88ae14c..0000000 --- a/vendor/myclabs/deep-copy/README.md +++ /dev/null @@ -1,406 +0,0 @@ -# DeepCopy - -DeepCopy helps you create deep copies (clones) of your objects. It is designed to handle cycles in the association graph. - -[![Total Downloads](https://poser.pugx.org/myclabs/deep-copy/downloads.svg)](https://packagist.org/packages/myclabs/deep-copy) -[![Integrate](https://github.com/myclabs/DeepCopy/actions/workflows/ci.yaml/badge.svg?branch=1.x)](https://github.com/myclabs/DeepCopy/actions/workflows/ci.yaml) - -## Table of Contents - -1. [How](#how) -1. [Why](#why) - 1. [Using simply `clone`](#using-simply-clone) - 1. [Overriding `__clone()`](#overriding-__clone) - 1. [With `DeepCopy`](#with-deepcopy) -1. [How it works](#how-it-works) -1. [Going further](#going-further) - 1. [Matchers](#matchers) - 1. [Property name](#property-name) - 1. [Specific property](#specific-property) - 1. [Type](#type) - 1. [Filters](#filters) - 1. [`SetNullFilter`](#setnullfilter-filter) - 1. [`KeepFilter`](#keepfilter-filter) - 1. [`DoctrineCollectionFilter`](#doctrinecollectionfilter-filter) - 1. [`DoctrineEmptyCollectionFilter`](#doctrineemptycollectionfilter-filter) - 1. [`DoctrineProxyFilter`](#doctrineproxyfilter-filter) - 1. [`ReplaceFilter`](#replacefilter-type-filter) - 1. [`ShallowCopyFilter`](#shallowcopyfilter-type-filter) -1. [Edge cases](#edge-cases) -1. [Contributing](#contributing) - 1. [Tests](#tests) - - -## How? - -Install with Composer: - -``` -composer require myclabs/deep-copy -``` - -Use it: - -```php -use DeepCopy\DeepCopy; - -$copier = new DeepCopy(); -$myCopy = $copier->copy($myObject); -``` - - -## Why? - -- How do you create copies of your objects? - -```php -$myCopy = clone $myObject; -``` - -- How do you create **deep** copies of your objects (i.e. copying also all the objects referenced in the properties)? - -You use [`__clone()`](http://www.php.net/manual/en/language.oop5.cloning.php#object.clone) and implement the behavior -yourself. - -- But how do you handle **cycles** in the association graph? - -Now you're in for a big mess :( - -![association graph](doc/graph.png) - - -### Using simply `clone` - -![Using clone](doc/clone.png) - - -### Overriding `__clone()` - -![Overriding __clone](doc/deep-clone.png) - - -### With `DeepCopy` - -![With DeepCopy](doc/deep-copy.png) - - -## How it works - -DeepCopy recursively traverses all the object's properties and clones them. To avoid cloning the same object twice it -keeps a hash map of all instances and thus preserves the object graph. - -To use it: - -```php -use function DeepCopy\deep_copy; - -$copy = deep_copy($var); -``` - -Alternatively, you can create your own `DeepCopy` instance to configure it differently for example: - -```php -use DeepCopy\DeepCopy; - -$copier = new DeepCopy(true); - -$copy = $copier->copy($var); -``` - -You may want to roll your own deep copy function: - -```php -namespace Acme; - -use DeepCopy\DeepCopy; - -function deep_copy($var) -{ - static $copier = null; - - if (null === $copier) { - $copier = new DeepCopy(true); - } - - return $copier->copy($var); -} -``` - - -## Going further - -You can add filters to customize the copy process. - -The method to add a filter is `DeepCopy\DeepCopy::addFilter($filter, $matcher)`, -with `$filter` implementing `DeepCopy\Filter\Filter` -and `$matcher` implementing `DeepCopy\Matcher\Matcher`. - -We provide some generic filters and matchers. - - -### Matchers - - - `DeepCopy\Matcher` applies on a object attribute. - - `DeepCopy\TypeMatcher` applies on any element found in graph, including array elements. - - -#### Property name - -The `PropertyNameMatcher` will match a property by its name: - -```php -use DeepCopy\Matcher\PropertyNameMatcher; - -// Will apply a filter to any property of any objects named "id" -$matcher = new PropertyNameMatcher('id'); -``` - - -#### Specific property - -The `PropertyMatcher` will match a specific property of a specific class: - -```php -use DeepCopy\Matcher\PropertyMatcher; - -// Will apply a filter to the property "id" of any objects of the class "MyClass" -$matcher = new PropertyMatcher('MyClass', 'id'); -``` - - -#### Type - -The `TypeMatcher` will match any element by its type (instance of a class or any value that could be parameter of -[gettype()](http://php.net/manual/en/function.gettype.php) function): - -```php -use DeepCopy\TypeMatcher\TypeMatcher; - -// Will apply a filter to any object that is an instance of Doctrine\Common\Collections\Collection -$matcher = new TypeMatcher('Doctrine\Common\Collections\Collection'); -``` - - -### Filters - -- `DeepCopy\Filter` applies a transformation to the object attribute matched by `DeepCopy\Matcher` -- `DeepCopy\TypeFilter` applies a transformation to any element matched by `DeepCopy\TypeMatcher` - -By design, matching a filter will stop the chain of filters (i.e. the next ones will not be applied). -Using the ([`ChainableFilter`](#chainablefilter-filter)) won't stop the chain of filters. - - -#### `SetNullFilter` (filter) - -Let's say for example that you are copying a database record (or a Doctrine entity), so you want the copy not to have -any ID: - -```php -use DeepCopy\DeepCopy; -use DeepCopy\Filter\SetNullFilter; -use DeepCopy\Matcher\PropertyNameMatcher; - -$object = MyClass::load(123); -echo $object->id; // 123 - -$copier = new DeepCopy(); -$copier->addFilter(new SetNullFilter(), new PropertyNameMatcher('id')); - -$copy = $copier->copy($object); - -echo $copy->id; // null -``` - - -#### `KeepFilter` (filter) - -If you want a property to remain untouched (for example, an association to an object): - -```php -use DeepCopy\DeepCopy; -use DeepCopy\Filter\KeepFilter; -use DeepCopy\Matcher\PropertyMatcher; - -$copier = new DeepCopy(); -$copier->addFilter(new KeepFilter(), new PropertyMatcher('MyClass', 'category')); - -$copy = $copier->copy($object); -// $copy->category has not been touched -``` - - -#### `ChainableFilter` (filter) - -If you use cloning on proxy classes, you might want to apply two filters for: -1. loading the data -2. applying a transformation - -You can use the `ChainableFilter` as a decorator of the proxy loader filter, which won't stop the chain of filters (i.e. -the next ones may be applied). - - -```php -use DeepCopy\DeepCopy; -use DeepCopy\Filter\ChainableFilter; -use DeepCopy\Filter\Doctrine\DoctrineProxyFilter; -use DeepCopy\Filter\SetNullFilter; -use DeepCopy\Matcher\Doctrine\DoctrineProxyMatcher; -use DeepCopy\Matcher\PropertyNameMatcher; - -$copier = new DeepCopy(); -$copier->addFilter(new ChainableFilter(new DoctrineProxyFilter()), new DoctrineProxyMatcher()); -$copier->addFilter(new SetNullFilter(), new PropertyNameMatcher('id')); - -$copy = $copier->copy($object); - -echo $copy->id; // null -``` - - -#### `DoctrineCollectionFilter` (filter) - -If you use Doctrine and want to copy an entity, you will need to use the `DoctrineCollectionFilter`: - -```php -use DeepCopy\DeepCopy; -use DeepCopy\Filter\Doctrine\DoctrineCollectionFilter; -use DeepCopy\Matcher\PropertyTypeMatcher; - -$copier = new DeepCopy(); -$copier->addFilter(new DoctrineCollectionFilter(), new PropertyTypeMatcher('Doctrine\Common\Collections\Collection')); - -$copy = $copier->copy($object); -``` - - -#### `DoctrineEmptyCollectionFilter` (filter) - -If you use Doctrine and want to copy an entity who contains a `Collection` that you want to be reset, you can use the -`DoctrineEmptyCollectionFilter` - -```php -use DeepCopy\DeepCopy; -use DeepCopy\Filter\Doctrine\DoctrineEmptyCollectionFilter; -use DeepCopy\Matcher\PropertyMatcher; - -$copier = new DeepCopy(); -$copier->addFilter(new DoctrineEmptyCollectionFilter(), new PropertyMatcher('MyClass', 'myProperty')); - -$copy = $copier->copy($object); - -// $copy->myProperty will return an empty collection -``` - - -#### `DoctrineProxyFilter` (filter) - -If you use Doctrine and use cloning on lazy loaded entities, you might encounter errors mentioning missing fields on a -Doctrine proxy class (...\\\_\_CG\_\_\Proxy). -You can use the `DoctrineProxyFilter` to load the actual entity behind the Doctrine proxy class. -**Make sure, though, to put this as one of your very first filters in the filter chain so that the entity is loaded -before other filters are applied!** -We recommend to decorate the `DoctrineProxyFilter` with the `ChainableFilter` to allow applying other filters to the -cloned lazy loaded entities. - -```php -use DeepCopy\DeepCopy; -use DeepCopy\Filter\Doctrine\DoctrineProxyFilter; -use DeepCopy\Matcher\Doctrine\DoctrineProxyMatcher; - -$copier = new DeepCopy(); -$copier->addFilter(new ChainableFilter(new DoctrineProxyFilter()), new DoctrineProxyMatcher()); - -$copy = $copier->copy($object); - -// $copy should now contain a clone of all entities, including those that were not yet fully loaded. -``` - - -#### `ReplaceFilter` (type filter) - -1. If you want to replace the value of a property: - -```php -use DeepCopy\DeepCopy; -use DeepCopy\Filter\ReplaceFilter; -use DeepCopy\Matcher\PropertyMatcher; - -$copier = new DeepCopy(); -$callback = function ($currentValue) { - return $currentValue . ' (copy)' -}; -$copier->addFilter(new ReplaceFilter($callback), new PropertyMatcher('MyClass', 'title')); - -$copy = $copier->copy($object); - -// $copy->title will contain the data returned by the callback, e.g. 'The title (copy)' -``` - -2. If you want to replace whole element: - -```php -use DeepCopy\DeepCopy; -use DeepCopy\TypeFilter\ReplaceFilter; -use DeepCopy\TypeMatcher\TypeMatcher; - -$copier = new DeepCopy(); -$callback = function (MyClass $myClass) { - return get_class($myClass); -}; -$copier->addTypeFilter(new ReplaceFilter($callback), new TypeMatcher('MyClass')); - -$copy = $copier->copy([new MyClass, 'some string', new MyClass]); - -// $copy will contain ['MyClass', 'some string', 'MyClass'] -``` - - -The `$callback` parameter of the `ReplaceFilter` constructor accepts any PHP callable. - - -#### `ShallowCopyFilter` (type filter) - -Stop *DeepCopy* from recursively copying element, using standard `clone` instead: - -```php -use DeepCopy\DeepCopy; -use DeepCopy\TypeFilter\ShallowCopyFilter; -use DeepCopy\TypeMatcher\TypeMatcher; -use Mockery as m; - -$this->deepCopy = new DeepCopy(); -$this->deepCopy->addTypeFilter( - new ShallowCopyFilter, - new TypeMatcher(m\MockInterface::class) -); - -$myServiceWithMocks = new MyService(m::mock(MyDependency1::class), m::mock(MyDependency2::class)); -// All mocks will be just cloned, not deep copied -``` - - -## Edge cases - -The following structures cannot be deep-copied with PHP Reflection. As a result they are shallow cloned and filters are -not applied. There is two ways for you to handle them: - -- Implement your own `__clone()` method -- Use a filter with a type matcher - - -## Contributing - -DeepCopy is distributed under the MIT license. - - -### Tests - -Running the tests is simple: - -```php -vendor/bin/phpunit -``` - -### Support - -Get professional support via [the Tidelift Subscription](https://tidelift.com/subscription/pkg/packagist-myclabs-deep-copy?utm_source=packagist-myclabs-deep-copy&utm_medium=referral&utm_campaign=readme). diff --git a/vendor/myclabs/deep-copy/composer.json b/vendor/myclabs/deep-copy/composer.json deleted file mode 100644 index f115fff..0000000 --- a/vendor/myclabs/deep-copy/composer.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "myclabs/deep-copy", - "description": "Create deep copies (clones) of your objects", - "license": "MIT", - "type": "library", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ], - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/collections": "^1.6.8", - "doctrine/common": "^2.13.3 || ^3.2.2", - "phpspec/prophecy": "^1.10", - "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" - }, - "conflict": { - "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3 <3.2.2" - }, - "autoload": { - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - }, - "files": [ - "src/DeepCopy/deep_copy.php" - ] - }, - "autoload-dev": { - "psr-4": { - "DeepCopyTest\\": "tests/DeepCopyTest/", - "DeepCopy\\": "fixtures/" - } - }, - "config": { - "sort-packages": true - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/DeepCopy.php b/vendor/myclabs/deep-copy/src/DeepCopy/DeepCopy.php deleted file mode 100644 index a944697..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/DeepCopy.php +++ /dev/null @@ -1,328 +0,0 @@ -<?php - -namespace DeepCopy; - -use ArrayObject; -use DateInterval; -use DatePeriod; -use DateTimeInterface; -use DateTimeZone; -use DeepCopy\Exception\CloneException; -use DeepCopy\Filter\ChainableFilter; -use DeepCopy\Filter\Filter; -use DeepCopy\Matcher\Matcher; -use DeepCopy\Reflection\ReflectionHelper; -use DeepCopy\TypeFilter\Date\DateIntervalFilter; -use DeepCopy\TypeFilter\Date\DatePeriodFilter; -use DeepCopy\TypeFilter\Spl\ArrayObjectFilter; -use DeepCopy\TypeFilter\Spl\SplDoublyLinkedListFilter; -use DeepCopy\TypeFilter\TypeFilter; -use DeepCopy\TypeMatcher\TypeMatcher; -use ReflectionObject; -use ReflectionProperty; -use SplDoublyLinkedList; - -/** - * @final - */ -class DeepCopy -{ - /** - * @var object[] List of objects copied. - */ - private $hashMap = []; - - /** - * Filters to apply. - * - * @var array Array of ['filter' => Filter, 'matcher' => Matcher] pairs. - */ - private $filters = []; - - /** - * Type Filters to apply. - * - * @var array Array of ['filter' => Filter, 'matcher' => Matcher] pairs. - */ - private $typeFilters = []; - - /** - * @var bool - */ - private $skipUncloneable = false; - - /** - * @var bool - */ - private $useCloneMethod; - - /** - * @param bool $useCloneMethod If set to true, when an object implements the __clone() function, it will be used - * instead of the regular deep cloning. - */ - public function __construct($useCloneMethod = false) - { - $this->useCloneMethod = $useCloneMethod; - - $this->addTypeFilter(new ArrayObjectFilter($this), new TypeMatcher(ArrayObject::class)); - $this->addTypeFilter(new DateIntervalFilter(), new TypeMatcher(DateInterval::class)); - $this->addTypeFilter(new DatePeriodFilter(), new TypeMatcher(DatePeriod::class)); - $this->addTypeFilter(new SplDoublyLinkedListFilter($this), new TypeMatcher(SplDoublyLinkedList::class)); - } - - /** - * If enabled, will not throw an exception when coming across an uncloneable property. - * - * @param $skipUncloneable - * - * @return $this - */ - public function skipUncloneable($skipUncloneable = true) - { - $this->skipUncloneable = $skipUncloneable; - - return $this; - } - - /** - * Deep copies the given object. - * - * @template TObject - * - * @param TObject $object - * - * @return TObject - */ - public function copy($object) - { - $this->hashMap = []; - - return $this->recursiveCopy($object); - } - - public function addFilter(Filter $filter, Matcher $matcher) - { - $this->filters[] = [ - 'matcher' => $matcher, - 'filter' => $filter, - ]; - } - - public function prependFilter(Filter $filter, Matcher $matcher) - { - array_unshift($this->filters, [ - 'matcher' => $matcher, - 'filter' => $filter, - ]); - } - - public function addTypeFilter(TypeFilter $filter, TypeMatcher $matcher) - { - $this->typeFilters[] = [ - 'matcher' => $matcher, - 'filter' => $filter, - ]; - } - - public function prependTypeFilter(TypeFilter $filter, TypeMatcher $matcher) - { - array_unshift($this->typeFilters, [ - 'matcher' => $matcher, - 'filter' => $filter, - ]); - } - - private function recursiveCopy($var) - { - // Matches Type Filter - if ($filter = $this->getFirstMatchedTypeFilter($this->typeFilters, $var)) { - return $filter->apply($var); - } - - // Resource - if (is_resource($var)) { - return $var; - } - - // Array - if (is_array($var)) { - return $this->copyArray($var); - } - - // Scalar - if (! is_object($var)) { - return $var; - } - - // Enum - if (PHP_VERSION_ID >= 80100 && enum_exists(get_class($var))) { - return $var; - } - - // Object - return $this->copyObject($var); - } - - /** - * Copy an array - * @param array $array - * @return array - */ - private function copyArray(array $array) - { - foreach ($array as $key => $value) { - $array[$key] = $this->recursiveCopy($value); - } - - return $array; - } - - /** - * Copies an object. - * - * @param object $object - * - * @throws CloneException - * - * @return object - */ - private function copyObject($object) - { - $objectHash = spl_object_hash($object); - - if (isset($this->hashMap[$objectHash])) { - return $this->hashMap[$objectHash]; - } - - $reflectedObject = new ReflectionObject($object); - $isCloneable = $reflectedObject->isCloneable(); - - if (false === $isCloneable) { - if ($this->skipUncloneable) { - $this->hashMap[$objectHash] = $object; - - return $object; - } - - throw new CloneException( - sprintf( - 'The class "%s" is not cloneable.', - $reflectedObject->getName() - ) - ); - } - - $newObject = clone $object; - $this->hashMap[$objectHash] = $newObject; - - if ($this->useCloneMethod && $reflectedObject->hasMethod('__clone')) { - return $newObject; - } - - if ($newObject instanceof DateTimeInterface || $newObject instanceof DateTimeZone) { - return $newObject; - } - - foreach (ReflectionHelper::getProperties($reflectedObject) as $property) { - $this->copyObjectProperty($newObject, $property); - } - - return $newObject; - } - - private function copyObjectProperty($object, ReflectionProperty $property) - { - // Ignore static properties - if ($property->isStatic()) { - return; - } - - // Ignore readonly properties - if (method_exists($property, 'isReadOnly') && $property->isReadOnly()) { - return; - } - - // Apply the filters - foreach ($this->filters as $item) { - /** @var Matcher $matcher */ - $matcher = $item['matcher']; - /** @var Filter $filter */ - $filter = $item['filter']; - - if ($matcher->matches($object, $property->getName())) { - $filter->apply( - $object, - $property->getName(), - function ($object) { - return $this->recursiveCopy($object); - } - ); - - if ($filter instanceof ChainableFilter) { - continue; - } - - // If a filter matches, we stop processing this property - return; - } - } - - if (PHP_VERSION_ID < 80100) { - $property->setAccessible(true); - } - - // Ignore uninitialized properties (for PHP >7.4) - if (method_exists($property, 'isInitialized') && !$property->isInitialized($object)) { - return; - } - - $propertyValue = $property->getValue($object); - - // Copy the property - $property->setValue($object, $this->recursiveCopy($propertyValue)); - } - - /** - * Returns first filter that matches variable, `null` if no such filter found. - * - * @param array $filterRecords Associative array with 2 members: 'filter' with value of type {@see TypeFilter} and - * 'matcher' with value of type {@see TypeMatcher} - * @param mixed $var - * - * @return TypeFilter|null - */ - private function getFirstMatchedTypeFilter(array $filterRecords, $var) - { - $matched = $this->first( - $filterRecords, - function (array $record) use ($var) { - /* @var TypeMatcher $matcher */ - $matcher = $record['matcher']; - - return $matcher->matches($var); - } - ); - - return isset($matched) ? $matched['filter'] : null; - } - - /** - * Returns first element that matches predicate, `null` if no such element found. - * - * @param array $elements Array of ['filter' => Filter, 'matcher' => Matcher] pairs. - * @param callable $predicate Predicate arguments are: element. - * - * @return array|null Associative array with 2 members: 'filter' with value of type {@see TypeFilter} and 'matcher' - * with value of type {@see TypeMatcher} or `null`. - */ - private function first(array $elements, callable $predicate) - { - foreach ($elements as $element) { - if (call_user_func($predicate, $element)) { - return $element; - } - } - - return null; - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php b/vendor/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php deleted file mode 100644 index c046706..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php +++ /dev/null @@ -1,9 +0,0 @@ -<?php - -namespace DeepCopy\Exception; - -use UnexpectedValueException; - -class CloneException extends UnexpectedValueException -{ -} \ No newline at end of file diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Exception/PropertyException.php b/vendor/myclabs/deep-copy/src/DeepCopy/Exception/PropertyException.php deleted file mode 100644 index 9702101..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Exception/PropertyException.php +++ /dev/null @@ -1,9 +0,0 @@ -<?php - -namespace DeepCopy\Exception; - -use ReflectionException; - -class PropertyException extends ReflectionException -{ -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/ChainableFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/ChainableFilter.php deleted file mode 100644 index 4e3f7bb..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/ChainableFilter.php +++ /dev/null @@ -1,24 +0,0 @@ -<?php - -namespace DeepCopy\Filter; - -/** - * Defines a decorator filter that will not stop the chain of filters. - */ -class ChainableFilter implements Filter -{ - /** - * @var Filter - */ - protected $filter; - - public function __construct(Filter $filter) - { - $this->filter = $filter; - } - - public function apply($object, $property, $objectCopier) - { - $this->filter->apply($object, $property, $objectCopier); - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php deleted file mode 100644 index 66e91e5..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php +++ /dev/null @@ -1,35 +0,0 @@ -<?php - -namespace DeepCopy\Filter\Doctrine; - -use DeepCopy\Filter\Filter; -use DeepCopy\Reflection\ReflectionHelper; - -/** - * @final - */ -class DoctrineCollectionFilter implements Filter -{ - /** - * Copies the object property doctrine collection. - * - * {@inheritdoc} - */ - public function apply($object, $property, $objectCopier) - { - $reflectionProperty = ReflectionHelper::getProperty($object, $property); - - if (PHP_VERSION_ID < 80100) { - $reflectionProperty->setAccessible(true); - } - $oldCollection = $reflectionProperty->getValue($object); - - $newCollection = $oldCollection->map( - function ($item) use ($objectCopier) { - return $objectCopier($item); - } - ); - - $reflectionProperty->setValue($object, $newCollection); - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php deleted file mode 100644 index fa1c034..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php - -namespace DeepCopy\Filter\Doctrine; - -use DeepCopy\Filter\Filter; -use DeepCopy\Reflection\ReflectionHelper; -use Doctrine\Common\Collections\ArrayCollection; - -/** - * @final - */ -class DoctrineEmptyCollectionFilter implements Filter -{ - /** - * Sets the object property to an empty doctrine collection. - * - * @param object $object - * @param string $property - * @param callable $objectCopier - */ - public function apply($object, $property, $objectCopier) - { - $reflectionProperty = ReflectionHelper::getProperty($object, $property); - if (PHP_VERSION_ID < 80100) { - $reflectionProperty->setAccessible(true); - } - - $reflectionProperty->setValue($object, new ArrayCollection()); - } -} \ No newline at end of file diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php deleted file mode 100644 index 8bee8f7..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php - -namespace DeepCopy\Filter\Doctrine; - -use DeepCopy\Filter\Filter; - -/** - * @final - */ -class DoctrineProxyFilter implements Filter -{ - /** - * Triggers the magic method __load() on a Doctrine Proxy class to load the - * actual entity from the database. - * - * {@inheritdoc} - */ - public function apply($object, $property, $objectCopier) - { - $object->__load(); - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php deleted file mode 100644 index 85ba18c..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php +++ /dev/null @@ -1,18 +0,0 @@ -<?php - -namespace DeepCopy\Filter; - -/** - * Filter to apply to a property while copying an object - */ -interface Filter -{ - /** - * Applies the filter to the object. - * - * @param object $object - * @param string $property - * @param callable $objectCopier - */ - public function apply($object, $property, $objectCopier); -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/KeepFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/KeepFilter.php deleted file mode 100644 index 4b11a08..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/KeepFilter.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php - -namespace DeepCopy\Filter; - -class KeepFilter implements Filter -{ - /** - * Keeps the value of the object property. - * - * {@inheritdoc} - */ - public function apply($object, $property, $objectCopier) - { - // Nothing to do - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/ReplaceFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/ReplaceFilter.php deleted file mode 100644 index fda8e72..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/ReplaceFilter.php +++ /dev/null @@ -1,41 +0,0 @@ -<?php - -namespace DeepCopy\Filter; - -use DeepCopy\Reflection\ReflectionHelper; - -/** - * @final - */ -class ReplaceFilter implements Filter -{ - /** - * @var callable - */ - protected $callback; - - /** - * @param callable $callable Will be called to get the new value for each property to replace - */ - public function __construct(callable $callable) - { - $this->callback = $callable; - } - - /** - * Replaces the object property by the result of the callback called with the object property. - * - * {@inheritdoc} - */ - public function apply($object, $property, $objectCopier) - { - $reflectionProperty = ReflectionHelper::getProperty($object, $property); - if (PHP_VERSION_ID < 80100) { - $reflectionProperty->setAccessible(true); - } - - $value = call_user_func($this->callback, $reflectionProperty->getValue($object)); - - $reflectionProperty->setValue($object, $value); - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php deleted file mode 100644 index 6722272..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php +++ /dev/null @@ -1,26 +0,0 @@ -<?php - -namespace DeepCopy\Filter; - -use DeepCopy\Reflection\ReflectionHelper; - -/** - * @final - */ -class SetNullFilter implements Filter -{ - /** - * Sets the object property to null. - * - * {@inheritdoc} - */ - public function apply($object, $property, $objectCopier) - { - $reflectionProperty = ReflectionHelper::getProperty($object, $property); - - if (PHP_VERSION_ID < 80100) { - $reflectionProperty->setAccessible(true); - } - $reflectionProperty->setValue($object, null); - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php b/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php deleted file mode 100644 index c5887b1..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php - -namespace DeepCopy\Matcher\Doctrine; - -use DeepCopy\Matcher\Matcher; -use Doctrine\Persistence\Proxy; - -/** - * @final - */ -class DoctrineProxyMatcher implements Matcher -{ - /** - * Matches a Doctrine Proxy class. - * - * {@inheritdoc} - */ - public function matches($object, $property) - { - return $object instanceof Proxy; - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.php b/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.php deleted file mode 100644 index d67f3ca..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.php +++ /dev/null @@ -1,14 +0,0 @@ -<?php - -namespace DeepCopy\Matcher; - -interface Matcher -{ - /** - * @param object $object - * @param string $property - * - * @return boolean - */ - public function matches($object, $property); -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyMatcher.php b/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyMatcher.php deleted file mode 100644 index 073b20c..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyMatcher.php +++ /dev/null @@ -1,39 +0,0 @@ -<?php - -namespace DeepCopy\Matcher; - -/** - * @final - */ -class PropertyMatcher implements Matcher -{ - /** - * @var string - */ - private $class; - - /** - * @var string - */ - private $property; - - /** - * @param string $class Class name - * @param string $property Property name - */ - public function __construct($class, $property) - { - $this->class = $class; - $this->property = $property; - } - - /** - * Matches a specific property of a specific class. - * - * {@inheritdoc} - */ - public function matches($object, $property) - { - return ($object instanceof $this->class) && $property == $this->property; - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php b/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php deleted file mode 100644 index c8ec0d2..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php - -namespace DeepCopy\Matcher; - -/** - * @final - */ -class PropertyNameMatcher implements Matcher -{ - /** - * @var string - */ - private $property; - - /** - * @param string $property Property name - */ - public function __construct($property) - { - $this->property = $property; - } - - /** - * Matches a property by its name. - * - * {@inheritdoc} - */ - public function matches($object, $property) - { - return $property == $this->property; - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php b/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php deleted file mode 100644 index 7980bfa..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php +++ /dev/null @@ -1,54 +0,0 @@ -<?php - -namespace DeepCopy\Matcher; - -use DeepCopy\Reflection\ReflectionHelper; -use ReflectionException; - -/** - * Matches a property by its type. - * - * It is recommended to use {@see DeepCopy\TypeFilter\TypeFilter} instead, as it applies on all occurrences - * of given type in copied context (eg. array elements), not just on object properties. - * - * @final - */ -class PropertyTypeMatcher implements Matcher -{ - /** - * @var string - */ - private $propertyType; - - /** - * @param string $propertyType Property type - */ - public function __construct($propertyType) - { - $this->propertyType = $propertyType; - } - - /** - * {@inheritdoc} - */ - public function matches($object, $property) - { - try { - $reflectionProperty = ReflectionHelper::getProperty($object, $property); - } catch (ReflectionException $exception) { - return false; - } - - if (PHP_VERSION_ID < 80100) { - $reflectionProperty->setAccessible(true); - } - - // Uninitialized properties (for PHP >7.4) - if (method_exists($reflectionProperty, 'isInitialized') && !$reflectionProperty->isInitialized($object)) { - // null instanceof $this->propertyType - return false; - } - - return $reflectionProperty->getValue($object) instanceof $this->propertyType; - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php b/vendor/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php deleted file mode 100644 index 742410c..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php +++ /dev/null @@ -1,78 +0,0 @@ -<?php - -namespace DeepCopy\Reflection; - -use DeepCopy\Exception\PropertyException; -use ReflectionClass; -use ReflectionException; -use ReflectionObject; -use ReflectionProperty; - -class ReflectionHelper -{ - /** - * Retrieves all properties (including private ones), from object and all its ancestors. - * - * Standard \ReflectionClass->getProperties() does not return private properties from ancestor classes. - * - * @author muratyaman@gmail.com - * @see http://php.net/manual/en/reflectionclass.getproperties.php - * - * @param ReflectionClass $ref - * - * @return ReflectionProperty[] - */ - public static function getProperties(ReflectionClass $ref) - { - $props = $ref->getProperties(); - $propsArr = array(); - - foreach ($props as $prop) { - $propertyName = $prop->getName(); - $propsArr[$propertyName] = $prop; - } - - if ($parentClass = $ref->getParentClass()) { - $parentPropsArr = self::getProperties($parentClass); - foreach ($propsArr as $key => $property) { - $parentPropsArr[$key] = $property; - } - - return $parentPropsArr; - } - - return $propsArr; - } - - /** - * Retrieves property by name from object and all its ancestors. - * - * @param object|string $object - * @param string $name - * - * @throws PropertyException - * @throws ReflectionException - * - * @return ReflectionProperty - */ - public static function getProperty($object, $name) - { - $reflection = is_object($object) ? new ReflectionObject($object) : new ReflectionClass($object); - - if ($reflection->hasProperty($name)) { - return $reflection->getProperty($name); - } - - if ($parentClass = $reflection->getParentClass()) { - return self::getProperty($parentClass->getName(), $name); - } - - throw new PropertyException( - sprintf( - 'The class "%s" doesn\'t have a property with the given name: "%s".', - is_object($object) ? get_class($object) : $object, - $name - ) - ); - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.php deleted file mode 100644 index becd1cf..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.php +++ /dev/null @@ -1,33 +0,0 @@ -<?php - -namespace DeepCopy\TypeFilter\Date; - -use DateInterval; -use DeepCopy\TypeFilter\TypeFilter; - -/** - * @final - * - * @deprecated Will be removed in 2.0. This filter will no longer be necessary in PHP 7.1+. - */ -class DateIntervalFilter implements TypeFilter -{ - - /** - * {@inheritdoc} - * - * @param DateInterval $element - * - * @see http://news.php.net/php.bugs/205076 - */ - public function apply($element) - { - $copy = new DateInterval('P0D'); - - foreach ($element as $propertyName => $propertyValue) { - $copy->{$propertyName} = $propertyValue; - } - - return $copy; - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DatePeriodFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DatePeriodFilter.php deleted file mode 100644 index 6bd2f7e..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DatePeriodFilter.php +++ /dev/null @@ -1,42 +0,0 @@ -<?php - -namespace DeepCopy\TypeFilter\Date; - -use DatePeriod; -use DeepCopy\TypeFilter\TypeFilter; - -/** - * @final - */ -class DatePeriodFilter implements TypeFilter -{ - /** - * {@inheritdoc} - * - * @param DatePeriod $element - * - * @see http://news.php.net/php.bugs/205076 - */ - public function apply($element) - { - $options = 0; - if (PHP_VERSION_ID >= 80200 && $element->include_end_date) { - $options |= DatePeriod::INCLUDE_END_DATE; - } - if (!$element->include_start_date) { - $options |= DatePeriod::EXCLUDE_START_DATE; - } - - if ($element->getEndDate()) { - return new DatePeriod($element->getStartDate(), $element->getDateInterval(), $element->getEndDate(), $options); - } - - if (PHP_VERSION_ID >= 70217) { - $recurrences = $element->getRecurrences(); - } else { - $recurrences = $element->recurrences - $element->include_start_date; - } - - return new DatePeriod($element->getStartDate(), $element->getDateInterval(), $recurrences, $options); - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php deleted file mode 100644 index 164f8b8..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php - -namespace DeepCopy\TypeFilter; - -/** - * @final - */ -class ReplaceFilter implements TypeFilter -{ - /** - * @var callable - */ - protected $callback; - - /** - * @param callable $callable Will be called to get the new value for each element to replace - */ - public function __construct(callable $callable) - { - $this->callback = $callable; - } - - /** - * {@inheritdoc} - */ - public function apply($element) - { - return call_user_func($this->callback, $element); - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php deleted file mode 100644 index a5fbd7a..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php +++ /dev/null @@ -1,17 +0,0 @@ -<?php - -namespace DeepCopy\TypeFilter; - -/** - * @final - */ -class ShallowCopyFilter implements TypeFilter -{ - /** - * {@inheritdoc} - */ - public function apply($element) - { - return clone $element; - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/ArrayObjectFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/ArrayObjectFilter.php deleted file mode 100644 index 1784601..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/ArrayObjectFilter.php +++ /dev/null @@ -1,36 +0,0 @@ -<?php -namespace DeepCopy\TypeFilter\Spl; - -use DeepCopy\DeepCopy; -use DeepCopy\TypeFilter\TypeFilter; - -/** - * In PHP 7.4 the storage of an ArrayObject isn't returned as - * ReflectionProperty. So we deep copy its array copy. - */ -final class ArrayObjectFilter implements TypeFilter -{ - /** - * @var DeepCopy - */ - private $copier; - - public function __construct(DeepCopy $copier) - { - $this->copier = $copier; - } - - /** - * {@inheritdoc} - */ - public function apply($arrayObject) - { - $clone = clone $arrayObject; - foreach ($arrayObject->getArrayCopy() as $k => $v) { - $clone->offsetSet($k, $this->copier->copy($v)); - } - - return $clone; - } -} - diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php deleted file mode 100644 index c5644cf..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php +++ /dev/null @@ -1,10 +0,0 @@ -<?php - -namespace DeepCopy\TypeFilter\Spl; - -/** - * @deprecated Use {@see SplDoublyLinkedListFilter} instead. - */ -class SplDoublyLinkedList extends SplDoublyLinkedListFilter -{ -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.php deleted file mode 100644 index c33be45..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.php +++ /dev/null @@ -1,51 +0,0 @@ -<?php - -namespace DeepCopy\TypeFilter\Spl; - -use Closure; -use DeepCopy\DeepCopy; -use DeepCopy\TypeFilter\TypeFilter; -use SplDoublyLinkedList; - -/** - * @final - */ -class SplDoublyLinkedListFilter implements TypeFilter -{ - private $copier; - - public function __construct(DeepCopy $copier) - { - $this->copier = $copier; - } - - /** - * {@inheritdoc} - */ - public function apply($element) - { - $newElement = clone $element; - - $copy = $this->createCopyClosure(); - - return $copy($newElement); - } - - private function createCopyClosure() - { - $copier = $this->copier; - - $copy = function (SplDoublyLinkedList $list) use ($copier) { - // Replace each element in the list with a deep copy of itself - for ($i = 1; $i <= $list->count(); $i++) { - $copy = $copier->recursiveCopy($list->shift()); - - $list->push($copy); - } - - return $list; - }; - - return Closure::bind($copy, null, DeepCopy::class); - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php deleted file mode 100644 index 5785a7d..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php +++ /dev/null @@ -1,13 +0,0 @@ -<?php - -namespace DeepCopy\TypeFilter; - -interface TypeFilter -{ - /** - * Applies the filter to the object. - * - * @param mixed $element - */ - public function apply($element); -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/TypeMatcher/TypeMatcher.php b/vendor/myclabs/deep-copy/src/DeepCopy/TypeMatcher/TypeMatcher.php deleted file mode 100644 index a563cb2..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/TypeMatcher/TypeMatcher.php +++ /dev/null @@ -1,29 +0,0 @@ -<?php - -namespace DeepCopy\TypeMatcher; - -class TypeMatcher -{ - /** - * @var string - */ - private $type; - - /** - * @param string $type - */ - public function __construct($type) - { - $this->type = $type; - } - - /** - * @param mixed $element - * - * @return boolean - */ - public function matches($element) - { - return is_object($element) ? is_a($element, $this->type) : gettype($element) === $this->type; - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/deep_copy.php b/vendor/myclabs/deep-copy/src/DeepCopy/deep_copy.php deleted file mode 100644 index 55dcc92..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/deep_copy.php +++ /dev/null @@ -1,20 +0,0 @@ -<?php - -namespace DeepCopy; - -use function function_exists; - -if (false === function_exists('DeepCopy\deep_copy')) { - /** - * Deep copies the given value. - * - * @param mixed $value - * @param bool $useCloneMethod - * - * @return mixed - */ - function deep_copy($value, $useCloneMethod = false) - { - return (new DeepCopy($useCloneMethod))->copy($value); - } -} diff --git a/vendor/nette/schema/composer.json b/vendor/nette/schema/composer.json deleted file mode 100644 index a230675..0000000 --- a/vendor/nette/schema/composer.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "nette/schema", - "description": "📐 Nette Schema: validating data structures against a given Schema.", - "keywords": ["nette", "config"], - "homepage": "https://nette.org", - "license": ["BSD-3-Clause", "GPL-2.0-only", "GPL-3.0-only"], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "require": { - "php": "8.1 - 8.5", - "nette/utils": "^4.0" - }, - "require-dev": { - "nette/tester": "^2.5.2", - "tracy/tracy": "^2.8", - "phpstan/phpstan-nette": "^2.0@stable" - }, - "autoload": { - "classmap": ["src/"], - "psr-4": { - "Nette\\": "src" - } - }, - "minimum-stability": "dev", - "scripts": { - "phpstan": "phpstan analyse", - "tester": "tester tests -s" - }, - "extra": { - "branch-alias": { - "dev-master": "1.3-dev" - } - } -} diff --git a/vendor/nette/schema/license.md b/vendor/nette/schema/license.md deleted file mode 100644 index cf741bd..0000000 --- a/vendor/nette/schema/license.md +++ /dev/null @@ -1,60 +0,0 @@ -Licenses -======== - -Good news! You may use Nette Framework under the terms of either -the New BSD License or the GNU General Public License (GPL) version 2 or 3. - -The BSD License is recommended for most projects. It is easy to understand and it -places almost no restrictions on what you can do with the framework. If the GPL -fits better to your project, you can use the framework under this license. - -You don't have to notify anyone which license you are using. You can freely -use Nette Framework in commercial projects as long as the copyright header -remains intact. - -Please be advised that the name "Nette Framework" is a protected trademark and its -usage has some limitations. So please do not use word "Nette" in the name of your -project or top-level domain, and choose a name that stands on its own merits. -If your stuff is good, it will not take long to establish a reputation for yourselves. - - -New BSD License ---------------- - -Copyright (c) 2004, 2014 David Grudl (https://davidgrudl.com) -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of "Nette Framework" nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -This software is provided by the copyright holders and contributors "as is" and -any express or implied warranties, including, but not limited to, the implied -warranties of merchantability and fitness for a particular purpose are -disclaimed. In no event shall the copyright owner or contributors be liable for -any direct, indirect, incidental, special, exemplary, or consequential damages -(including, but not limited to, procurement of substitute goods or services; -loss of use, data, or profits; or business interruption) however caused and on -any theory of liability, whether in contract, strict liability, or tort -(including negligence or otherwise) arising in any way out of the use of this -software, even if advised of the possibility of such damage. - - -GNU General Public License --------------------------- - -GPL licenses are very very long, so instead of including them here we offer -you URLs with full text: - -- [GPL version 2](http://www.gnu.org/licenses/gpl-2.0.html) -- [GPL version 3](http://www.gnu.org/licenses/gpl-3.0.html) diff --git a/vendor/nette/schema/readme.md b/vendor/nette/schema/readme.md deleted file mode 100644 index ce9d0d1..0000000 --- a/vendor/nette/schema/readme.md +++ /dev/null @@ -1,536 +0,0 @@ -# Nette Schema - -[![Downloads this Month](https://img.shields.io/packagist/dm/nette/schema.svg)](https://packagist.org/packages/nette/schema) -[![Tests](https://github.com/nette/schema/workflows/Tests/badge.svg?branch=master)](https://github.com/nette/schema/actions) -[![Coverage Status](https://coveralls.io/repos/github/nette/schema/badge.svg?branch=master)](https://coveralls.io/github/nette/schema?branch=master) -[![Latest Stable Version](https://poser.pugx.org/nette/schema/v/stable)](https://github.com/nette/schema/releases) -[![License](https://img.shields.io/badge/license-New%20BSD-blue.svg)](https://github.com/nette/schema/blob/master/license.md) - - -Introduction -============ - -A practical library for validation and normalization of data structures against a given schema with a smart & easy-to-understand API. - -Documentation can be found on the [website](https://doc.nette.org/schema). - -Installation: - -```shell -composer require nette/schema -``` - -It requires PHP version 8.1 and supports PHP up to 8.5. - - -[Support Me](https://github.com/sponsors/dg) --------------------------------------------- - -Do you like Nette Schema? Are you looking forward to the new features? - -[![Buy me a coffee](https://files.nette.org/icons/donation-3.svg)](https://github.com/sponsors/dg) - -Thank you! - - -Basic Usage ------------ - -In variable `$schema` we have a validation schema (what exactly this means and how to create it we will say later) and in variable `$data` we have a data structure that we want to validate and normalize. This can be, for example, data sent by the user through an API, configuration file, etc. - -The task is handled by the [Nette\Schema\Processor](https://api.nette.org/schema/master/Nette/Schema/Processor.html) class, which processes the input and either returns normalized data or throws an [Nette\Schema\ValidationException](https://api.nette.org/schema/master/Nette/Schema/ValidationException.html) exception on error. - -```php -$processor = new Nette\Schema\Processor; - -try { - $normalized = $processor->process($schema, $data); -} catch (Nette\Schema\ValidationException $e) { - echo 'Data is invalid: ' . $e->getMessage(); -} -``` - -Method `$e->getMessages()` returns array of all message strings and `$e->getMessageObjects()` return all messages as [Nette\Schema\Message](https://api.nette.org/schema/master/Nette/Schema/Message.html) objects. - - -Defining Schema ---------------- - -And now let's create a schema. The class [Nette\Schema\Expect](https://api.nette.org/schema/master/Nette/Schema/Expect.html) is used to define it, we actually define expectations of what the data should look like. Let's say that the input data must be a structure (e.g. an array) containing elements `processRefund` of type bool and `refundAmount` of type int. - -```php -use Nette\Schema\Expect; - -$schema = Expect::structure([ - 'processRefund' => Expect::bool(), - 'refundAmount' => Expect::int(), -]); -``` - -We believe that the schema definition looks clear, even if you see it for the very first time. - -Lets send the following data for validation: - -```php -$data = [ - 'processRefund' => true, - 'refundAmount' => 17, -]; - -$normalized = $processor->process($schema, $data); // OK, it passes -``` - -The output, i.e. the value `$normalized`, is the object `stdClass`. If we want the output to be an array, we add a cast to schema `Expect::structure([...])->castTo('array')`. - -All elements of the structure are optional and have a default value `null`. Example: - -```php -$data = [ - 'refundAmount' => 17, -]; - -$normalized = $processor->process($schema, $data); // OK, it passes -// $normalized = {'processRefund' => null, 'refundAmount' => 17} -``` - -The fact that the default value is `null` does not mean that it would be accepted in the input data `'processRefund' => null`. No, the input must be boolean, i.e. only `true` or `false`. We would have to explicitly allow `null` via `Expect::bool()->nullable()`. - -An item can be made mandatory using `Expect::bool()->required()`. We change the default value to `false` using `Expect::bool()->default(false)` or shortly using `Expect::bool(false)`. - -And what if we wanted to accept `1` and `0` besides booleans? Then we list the allowed values, which we will also normalize to boolean: - -```php -$schema = Expect::structure([ - 'processRefund' => Expect::anyOf(true, false, 1, 0)->castTo('bool'), - 'refundAmount' => Expect::int(), -]); - -$normalized = $processor->process($schema, $data); -is_bool($normalized->processRefund); // true -``` - -Now you know the basics of how the schema is defined and how the individual elements of the structure behave. We will now show what all the other elements can be used in defining a schema. - - -Data Types: type() ------------------- - -All standard PHP data types can be listed in the schema: - -```php -Expect::string($default = null) -Expect::int($default = null) -Expect::float($default = null) -Expect::bool($default = null) -Expect::null() -Expect::array($default = []) -``` - -And then all types [supported by the Validators](https://doc.nette.org/validators#toc-validation-rules) via `Expect::type('scalar')` or abbreviated `Expect::scalar()`. Also class or interface names are accepted, e.g. `Expect::type('AddressEntity')`. - -You can also use union notation: - -```php -Expect::type('bool|string|array') -``` - -The default value is always `null` except for `array` and `list`, where it is an empty array. (A list is an array indexed in ascending order of numeric keys from zero, that is, a non-associative array). - - -Array of Values: arrayOf() listOf() ------------------------------------ - -The array is too general structure, it is more useful to specify exactly what elements it can contain. For example, an array whose elements can only be strings: - -```php -$schema = Expect::arrayOf('string'); - -$processor->process($schema, ['hello', 'world']); // OK -$processor->process($schema, ['a' => 'hello', 'b' => 'world']); // OK -$processor->process($schema, ['key' => 123]); // ERROR: 123 is not a string -``` - -The second parameter can be used to specify keys (since version 1.2): - -```php -$schema = Expect::arrayOf('string', 'int'); - -$processor->process($schema, ['hello', 'world']); // OK -$processor->process($schema, ['a' => 'hello']); // ERROR: 'a' is not int -``` - -The list is an indexed array: - -```php -$schema = Expect::listOf('string'); - -$processor->process($schema, ['a', 'b']); // OK -$processor->process($schema, ['a', 123]); // ERROR: 123 is not a string -$processor->process($schema, ['key' => 'a']); // ERROR: is not a list -$processor->process($schema, [1 => 'a', 0 => 'b']); // ERROR: is not a list -``` - -The parameter can also be a schema, so we can write: - -```php -Expect::arrayOf(Expect::bool()) -``` - -The default value is an empty array. If you specify a default value, it will be merged with the passed data. This can be disabled using `mergeDefaults(false)`. - - -Enumeration: anyOf() --------------------- - -`anyOf()` is a set of values ​​or schemas that a value can be. Here's how to write an array of elements that can be either `'a'`, `true`, or `null`: - -```php -$schema = Expect::listOf( - Expect::anyOf('a', true, null), -); - -$processor->process($schema, ['a', true, null, 'a']); // OK -$processor->process($schema, ['a', false]); // ERROR: false does not belong there -``` - -The enumeration elements can also be schemas: - -```php -$schema = Expect::listOf( - Expect::anyOf(Expect::string(), true, null), -); - -$processor->process($schema, ['foo', true, null, 'bar']); // OK -$processor->process($schema, [123]); // ERROR -``` - -The `anyOf()` method accepts variants as individual parameters, not as array. To pass it an array of values, use the unpacking operator `anyOf(...$variants)`. - -The default value is `null`. Use the `firstIsDefault()` method to make the first element the default: - -```php -// default is 'hello' -Expect::anyOf(Expect::string('hello'), true, null)->firstIsDefault(); -``` - - -Structures ----------- - -Structures are objects with defined keys. Each of these key => value pairs is referred to as a "property": - -Structures accept arrays and objects and return objects `stdClass` (unless you change it with `castTo('array')`, etc.). - -By default, all properties are optional and have a default value of `null`. You can define mandatory properties using `required()`: - -```php -$schema = Expect::structure([ - 'required' => Expect::string()->required(), - 'optional' => Expect::string(), // the default value is null -]); - -$processor->process($schema, ['optional' => '']); -// ERROR: option 'required' is missing - -$processor->process($schema, ['required' => 'foo']); -// OK, returns {'required' => 'foo', 'optional' => null} -``` - -If you do not want to output properties with only a default value, use `skipDefaults()`: - -```php -$schema = Expect::structure([ - 'required' => Expect::string()->required(), - 'optional' => Expect::string(), -])->skipDefaults(); - -$processor->process($schema, ['required' => 'foo']); -// OK, returns {'required' => 'foo'} -``` - -Although `null` is the default value of the `optional` property, it is not allowed in the input data (the value must be a string). Properties accepting `null` are defined using `nullable()`: - -```php -$schema = Expect::structure([ - 'optional' => Expect::string(), - 'nullable' => Expect::string()->nullable(), -]); - -$processor->process($schema, ['optional' => null]); -// ERROR: 'optional' expects to be string, null given. - -$processor->process($schema, ['nullable' => null]); -// OK, returns {'optional' => null, 'nullable' => null} -``` - -By default, there can be no extra items in the input data: - -```php -$schema = Expect::structure([ - 'key' => Expect::string(), -]); - -$processor->process($schema, ['additional' => 1]); -// ERROR: Unexpected item 'additional' -``` - -Which we can change with `otherItems()`. As a parameter, we will specify the schema for each extra element: - -```php -$schema = Expect::structure([ - 'key' => Expect::string(), -])->otherItems(Expect::int()); - -$processor->process($schema, ['additional' => 1]); // OK -$processor->process($schema, ['additional' => true]); // ERROR -``` - - -Deprecations ------------- - -You can deprecate property using the `deprecated([string $message])` method. Deprecation notices are returned by `$processor->getWarnings()`: - -```php -$schema = Expect::structure([ - 'old' => Expect::int()->deprecated('The item %path% is deprecated'), -]); - -$processor->process($schema, ['old' => 1]); // OK -$processor->getWarnings(); // ["The item 'old' is deprecated"] -``` - - -Ranges: min() max() -------------------- - -Use `min()` and `max()` to limit the number of elements for arrays: - -```php -// array, at least 10 items, maximum 20 items -Expect::array()->min(10)->max(20); -``` - -For strings, limit their length: - -```php -// string, at least 10 characters long, maximum 20 characters -Expect::string()->min(10)->max(20); -``` - -For numbers, limit their value: - -```php -// integer, between 10 and 20 inclusive -Expect::int()->min(10)->max(20); -``` - -Of course, it is possible to mention only `min()`, or only `max()`: - -```php -// string, maximum 20 characters -Expect::string()->max(20); -``` - - -Regular Expressions: pattern() ------------------------------- - -Using `pattern()`, you can specify a regular expression which the **whole** input string must match (i.e. as if it were wrapped in characters `^` a `$`): - -```php -// just 9 digits -Expect::string()->pattern('\d{9}'); -``` - - -Custom Assertions: assert() ---------------------------- - -You can add any other restrictions using `assert(callable $fn)`. - -```php -$countIsEven = fn($v) => count($v) % 2 === 0; - -$schema = Expect::arrayOf('string') - ->assert($countIsEven); // the count must be even - -$processor->process($schema, ['a', 'b']); // OK -$processor->process($schema, ['a', 'b', 'c']); // ERROR: 3 is not even -``` - -Or - -```php -Expect::string()->assert('is_file'); // the file must exist -``` - -You can add your own description for each assertion. It will be part of the error message. - -```php -$schema = Expect::arrayOf('string') - ->assert($countIsEven, 'Even items in array'); - -$processor->process($schema, ['a', 'b', 'c']); -// Failed assertion "Even items in array" for item with value array. -``` - -The method can be called repeatedly to add multiple constraints. It can be intermixed with calls to `transform()` and `castTo()`. - - -Transformation: transform() ---------------------------- - -Successfully validated data can be modified using a custom function: - -```php -// conversion to uppercase: -Expect::string()->transform(fn(string $s) => strtoupper($s)); -``` - -The method can be called repeatedly to add multiple transformations. It can be intermixed with calls to `assert()` and `castTo()`. The operations will be executed in the order in which they are declared: - -```php -Expect::type('string|int') - ->castTo('string') - ->assert('ctype_lower', 'All characters must be lowercased') - ->transform(fn(string $s) => strtoupper($s)); // conversion to uppercase -``` - -The `transform()` method can both transform and validate the value simultaneously. This is often simpler and less redundant than chaining `transform()` and `assert()`. For this purpose, the function receives a [Nette\Schema\Context](https://api.nette.org/schema/master/Nette/Schema/Context.html) object with an `addError()` method, which can be used to add information about validation issues: - -```php -Expect::string() - ->transform(function (string $s, Nette\Schema\Context $context) { - if (!ctype_lower($s)) { - $context->addError('All characters must be lowercased', 'my.case.error'); - return null; - } - - return strtoupper($s); - }); -``` - - -Casting: castTo() ------------------ - -Successfully validated data can be cast: - -```php -Expect::scalar()->castTo('string'); -``` - -In addition to native PHP types, you can also cast to classes. It distinguishes whether it is a simple class without a constructor or a class with a constructor. If the class has no constructor, an instance of it is created and all elements of the structure are written to its properties: - -```php -class Info -{ - public bool $processRefund; - public int $refundAmount; -} - -Expect::structure([ - 'processRefund' => Expect::bool(), - 'refundAmount' => Expect::int(), -])->castTo(Info::class); - -// creates '$obj = new Info' and writes to $obj->processRefund and $obj->refundAmount -``` - -If the class has a constructor, the elements of the structure are passed as named parameters to the constructor: - -```php -class Info -{ - public function __construct( - public bool $processRefund, - public int $refundAmount, - ) { - } -} - -// creates $obj = new Info(processRefund: ..., refundAmount: ...) -``` - -Casting combined with a scalar parameter creates an object and passes the value as the sole parameter to the constructor: - -```php -Expect::string()->castTo(DateTime::class); -// creates new DateTime(...) -``` - - -Normalization: before() ------------------------ - -Prior to the validation itself, the data can be normalized using the method `before()`. As an example, let's have an element that must be an array of strings (eg `['a', 'b', 'c']`), but receives input in the form of a string `a b c`: - -```php -$explode = fn($v) => explode(' ', $v); - -$schema = Expect::arrayOf('string') - ->before($explode); - -$normalized = $processor->process($schema, 'a b c'); -// OK, returns ['a', 'b', 'c'] -``` - - -Mapping to Objects: from() --------------------------- - -You can generate structure schema from the class. Example: - -```php -class Config -{ - /** @var string */ - public $name; - /** @var string|null */ - public $password; - /** @var bool */ - public $admin = false; -} - -$schema = Expect::from(new Config); - -$data = [ - 'name' => 'jeff', -]; - -$normalized = $processor->process($schema, $data); -// $normalized instanceof Config -// $normalized = {'name' => 'jeff', 'password' => null, 'admin' => false} -``` - -If you are using PHP 7.4 or higher, you can use native types: - -```php -class Config -{ - public string $name; - public ?string $password; - public bool $admin = false; -} - -$schema = Expect::from(new Config); -``` - -Anonymous classes are also supported: - -```php -$schema = Expect::from(new class { - public string $name; - public ?string $password; - public bool $admin = false; -}); -``` - -Because the information obtained from the class definition may not be sufficient, you can add a custom schema for the elements with the second parameter: - -```php -$schema = Expect::from(new Config, [ - 'name' => Expect::string()->pattern('\w:.*'), -]); -``` diff --git a/vendor/nette/utils/composer.json b/vendor/nette/utils/composer.json deleted file mode 100644 index 6f6db4a..0000000 --- a/vendor/nette/utils/composer.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "name": "nette/utils", - "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", - "keywords": ["nette", "images", "json", "password", "validation", "utility", "string", "array", "core", "slugify", "utf-8", "unicode", "paginator", "datetime"], - "homepage": "https://nette.org", - "license": ["BSD-3-Clause", "GPL-2.0-only", "GPL-3.0-only"], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "require": { - "php": "8.2 - 8.5" - }, - "require-dev": { - "nette/tester": "^2.5", - "tracy/tracy": "^2.9", - "phpstan/phpstan-nette": "^2.0@stable", - "jetbrains/phpstorm-attributes": "^1.2" - }, - "conflict": { - "nette/finder": "<3", - "nette/schema": "<1.2.2" - }, - "suggest": { - "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", - "ext-json": "to use Nette\\Utils\\Json", - "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", - "ext-mbstring": "to use Strings::lower() etc...", - "ext-gd": "to use Image", - "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" - }, - "autoload": { - "classmap": ["src/"], - "psr-4": { - "Nette\\": "src" - } - }, - "minimum-stability": "dev", - "scripts": { - "phpstan": "phpstan analyse", - "tester": "tester tests -s" - }, - "extra": { - "branch-alias": { - "dev-master": "4.1-dev" - } - } -} diff --git a/vendor/nette/utils/license.md b/vendor/nette/utils/license.md deleted file mode 100644 index cf741bd..0000000 --- a/vendor/nette/utils/license.md +++ /dev/null @@ -1,60 +0,0 @@ -Licenses -======== - -Good news! You may use Nette Framework under the terms of either -the New BSD License or the GNU General Public License (GPL) version 2 or 3. - -The BSD License is recommended for most projects. It is easy to understand and it -places almost no restrictions on what you can do with the framework. If the GPL -fits better to your project, you can use the framework under this license. - -You don't have to notify anyone which license you are using. You can freely -use Nette Framework in commercial projects as long as the copyright header -remains intact. - -Please be advised that the name "Nette Framework" is a protected trademark and its -usage has some limitations. So please do not use word "Nette" in the name of your -project or top-level domain, and choose a name that stands on its own merits. -If your stuff is good, it will not take long to establish a reputation for yourselves. - - -New BSD License ---------------- - -Copyright (c) 2004, 2014 David Grudl (https://davidgrudl.com) -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of "Nette Framework" nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -This software is provided by the copyright holders and contributors "as is" and -any express or implied warranties, including, but not limited to, the implied -warranties of merchantability and fitness for a particular purpose are -disclaimed. In no event shall the copyright owner or contributors be liable for -any direct, indirect, incidental, special, exemplary, or consequential damages -(including, but not limited to, procurement of substitute goods or services; -loss of use, data, or profits; or business interruption) however caused and on -any theory of liability, whether in contract, strict liability, or tort -(including negligence or otherwise) arising in any way out of the use of this -software, even if advised of the possibility of such damage. - - -GNU General Public License --------------------------- - -GPL licenses are very very long, so instead of including them here we offer -you URLs with full text: - -- [GPL version 2](http://www.gnu.org/licenses/gpl-2.0.html) -- [GPL version 3](http://www.gnu.org/licenses/gpl-3.0.html) diff --git a/vendor/nette/utils/readme.md b/vendor/nette/utils/readme.md deleted file mode 100644 index 8c717be..0000000 --- a/vendor/nette/utils/readme.md +++ /dev/null @@ -1,55 +0,0 @@ -[![Nette Utils](https://github.com/nette/utils/assets/194960/c33fdb74-0652-4cad-ac6e-c1ce0d29e32a)](https://doc.nette.org/en/utils) - -[![Downloads this Month](https://img.shields.io/packagist/dm/nette/utils.svg)](https://packagist.org/packages/nette/utils) -[![Tests](https://github.com/nette/utils/workflows/Tests/badge.svg?branch=master)](https://github.com/nette/utils/actions) -[![Coverage Status](https://coveralls.io/repos/github/nette/utils/badge.svg?branch=master)](https://coveralls.io/github/nette/utils?branch=master) -[![Latest Stable Version](https://poser.pugx.org/nette/utils/v/stable)](https://github.com/nette/utils/releases) -[![License](https://img.shields.io/badge/license-New%20BSD-blue.svg)](https://github.com/nette/utils/blob/master/license.md) - - -Introduction ------------- - -In package nette/utils you will find a set of useful classes for everyday use: - -✅ [Arrays](https://doc.nette.org/utils/arrays)<br> -✅ [Callback](https://doc.nette.org/utils/callback) - PHP callbacks<br> -✅ [Filesystem](https://doc.nette.org/utils/filesystem) - copying, renaming, …<br> -✅ [Finder](https://doc.nette.org/utils/finder) - finds files and directories<br> -✅ [Floats](https://doc.nette.org/utils/floats) - floating point numbers<br> -✅ [Helper Functions](https://doc.nette.org/utils/helpers)<br> -✅ [HTML elements](https://doc.nette.org/utils/html-elements) - generate HTML<br> -✅ [Images](https://doc.nette.org/utils/images) - crop, resize, rotate images<br> -✅ [Iterables](https://doc.nette.org/utils/iterables) <br> -✅ [JSON](https://doc.nette.org/utils/json) - encoding and decoding<br> -✅ [Generating Random Strings](https://doc.nette.org/utils/random)<br> -✅ [Paginator](https://doc.nette.org/utils/paginator) - pagination math<br> -✅ [PHP Reflection](https://doc.nette.org/utils/reflection)<br> -✅ [Strings](https://doc.nette.org/utils/strings) - useful text functions<br> -✅ [SmartObject](https://doc.nette.org/utils/smartobject) - PHP object enhancements<br> -✅ [Type](https://doc.nette.org/utils/type) - PHP data type<br> -✅ [Validation](https://doc.nette.org/utils/validators) - validate inputs<br> - - <!----> - -Installation ------------- - -The recommended way to install is via Composer: - -``` -composer require nette/utils -``` - -Nette Utils 4.1 is compatible with PHP 8.2 to 8.5. - - <!----> - -[Support Me](https://github.com/sponsors/dg) --------------------------------------------- - -Do you like Nette Utils? Are you looking forward to the new features? - -[![Buy me a coffee](https://files.nette.org/icons/donation-3.svg)](https://github.com/sponsors/dg) - -Thank you! diff --git a/vendor/nikic/php-parser/LICENSE b/vendor/nikic/php-parser/LICENSE deleted file mode 100644 index 2e56718..0000000 --- a/vendor/nikic/php-parser/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2011, Nikita Popov -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/nikic/php-parser/README.md b/vendor/nikic/php-parser/README.md deleted file mode 100644 index 3bca288..0000000 --- a/vendor/nikic/php-parser/README.md +++ /dev/null @@ -1,225 +0,0 @@ -PHP Parser -========== - -[![Coverage Status](https://coveralls.io/repos/github/nikic/PHP-Parser/badge.svg?branch=master)](https://coveralls.io/github/nikic/PHP-Parser?branch=master) - -This is a PHP 5.2 to PHP 8.2 parser written in PHP. Its purpose is to simplify static code analysis and -manipulation. - -[**Documentation for version 4.x**][doc_4_x] (stable; for running on PHP >= 7.1; for parsing PHP 5.2 to PHP 8.2). - -[Documentation for version 3.x][doc_3_x] (unsupported; for running on PHP >= 5.5; for parsing PHP 5.2 to PHP 7.2). - -Features --------- - -The main features provided by this library are: - - * Parsing PHP 5, PHP 7, and PHP 8 code into an abstract syntax tree (AST). - * Invalid code can be parsed into a partial AST. - * The AST contains accurate location information. - * Dumping the AST in human-readable form. - * Converting an AST back to PHP code. - * Experimental: Formatting can be preserved for partially changed ASTs. - * Infrastructure to traverse and modify ASTs. - * Resolution of namespaced names. - * Evaluation of constant expressions. - * Builders to simplify AST construction for code generation. - * Converting an AST into JSON and back. - -Quick Start ------------ - -Install the library using [composer](https://getcomposer.org): - - php composer.phar require nikic/php-parser - -Parse some PHP code into an AST and dump the result in human-readable form: - -```php -<?php -use PhpParser\Error; -use PhpParser\NodeDumper; -use PhpParser\ParserFactory; - -$code = <<<'CODE' -<?php - -function test($foo) -{ - var_dump($foo); -} -CODE; - -$parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7); -try { - $ast = $parser->parse($code); -} catch (Error $error) { - echo "Parse error: {$error->getMessage()}\n"; - return; -} - -$dumper = new NodeDumper; -echo $dumper->dump($ast) . "\n"; -``` - -This dumps an AST looking something like this: - -``` -array( - 0: Stmt_Function( - byRef: false - name: Identifier( - name: test - ) - params: array( - 0: Param( - type: null - byRef: false - variadic: false - var: Expr_Variable( - name: foo - ) - default: null - ) - ) - returnType: null - stmts: array( - 0: Stmt_Expression( - expr: Expr_FuncCall( - name: Name( - parts: array( - 0: var_dump - ) - ) - args: array( - 0: Arg( - value: Expr_Variable( - name: foo - ) - byRef: false - unpack: false - ) - ) - ) - ) - ) - ) -) -``` - -Let's traverse the AST and perform some kind of modification. For example, drop all function bodies: - -```php -use PhpParser\Node; -use PhpParser\Node\Stmt\Function_; -use PhpParser\NodeTraverser; -use PhpParser\NodeVisitorAbstract; - -$traverser = new NodeTraverser(); -$traverser->addVisitor(new class extends NodeVisitorAbstract { - public function enterNode(Node $node) { - if ($node instanceof Function_) { - // Clean out the function body - $node->stmts = []; - } - } -}); - -$ast = $traverser->traverse($ast); -echo $dumper->dump($ast) . "\n"; -``` - -This gives us an AST where the `Function_::$stmts` are empty: - -``` -array( - 0: Stmt_Function( - byRef: false - name: Identifier( - name: test - ) - params: array( - 0: Param( - type: null - byRef: false - variadic: false - var: Expr_Variable( - name: foo - ) - default: null - ) - ) - returnType: null - stmts: array( - ) - ) -) -``` - -Finally, we can convert the new AST back to PHP code: - -```php -use PhpParser\PrettyPrinter; - -$prettyPrinter = new PrettyPrinter\Standard; -echo $prettyPrinter->prettyPrintFile($ast); -``` - -This gives us our original code, minus the `var_dump()` call inside the function: - -```php -<?php - -function test($foo) -{ -} -``` - -For a more comprehensive introduction, see the documentation. - -Documentation -------------- - - 1. [Introduction](doc/0_Introduction.markdown) - 2. [Usage of basic components](doc/2_Usage_of_basic_components.markdown) - -Component documentation: - - * [Walking the AST](doc/component/Walking_the_AST.markdown) - * Node visitors - * Modifying the AST from a visitor - * Short-circuiting traversals - * Interleaved visitors - * Simple node finding API - * Parent and sibling references - * [Name resolution](doc/component/Name_resolution.markdown) - * Name resolver options - * Name resolution context - * [Pretty printing](doc/component/Pretty_printing.markdown) - * Converting AST back to PHP code - * Customizing formatting - * Formatting-preserving code transformations - * [AST builders](doc/component/AST_builders.markdown) - * Fluent builders for AST nodes - * [Lexer](doc/component/Lexer.markdown) - * Lexer options - * Token and file positions for nodes - * Custom attributes - * [Error handling](doc/component/Error_handling.markdown) - * Column information for errors - * Error recovery (parsing of syntactically incorrect code) - * [Constant expression evaluation](doc/component/Constant_expression_evaluation.markdown) - * Evaluating constant/property/etc initializers - * Handling errors and unsupported expressions - * [JSON representation](doc/component/JSON_representation.markdown) - * JSON encoding and decoding of ASTs - * [Performance](doc/component/Performance.markdown) - * Disabling Xdebug - * Reusing objects - * Garbage collection impact - * [Frequently asked questions](doc/component/FAQ.markdown) - * Parent and sibling references - - [doc_3_x]: https://github.com/nikic/PHP-Parser/tree/3.x/doc - [doc_4_x]: https://github.com/nikic/PHP-Parser/tree/4.x/doc diff --git a/vendor/nikic/php-parser/bin/php-parse b/vendor/nikic/php-parser/bin/php-parse deleted file mode 100644 index bb3e46d..0000000 --- a/vendor/nikic/php-parser/bin/php-parse +++ /dev/null @@ -1,205 +0,0 @@ -#!/usr/bin/env php -<?php - -foreach ([__DIR__ . '/../../../autoload.php', __DIR__ . '/../vendor/autoload.php'] as $file) { - if (file_exists($file)) { - require $file; - break; - } -} - -ini_set('xdebug.max_nesting_level', 3000); - -// Disable Xdebug var_dump() output truncation -ini_set('xdebug.var_display_max_children', -1); -ini_set('xdebug.var_display_max_data', -1); -ini_set('xdebug.var_display_max_depth', -1); - -list($operations, $files, $attributes) = parseArgs($argv); - -/* Dump nodes by default */ -if (empty($operations)) { - $operations[] = 'dump'; -} - -if (empty($files)) { - showHelp("Must specify at least one file."); -} - -$lexer = new PhpParser\Lexer\Emulative(['usedAttributes' => [ - 'startLine', 'endLine', 'startFilePos', 'endFilePos', 'comments' -]]); -$parser = (new PhpParser\ParserFactory)->create( - PhpParser\ParserFactory::PREFER_PHP7, - $lexer -); -$dumper = new PhpParser\NodeDumper([ - 'dumpComments' => true, - 'dumpPositions' => $attributes['with-positions'], -]); -$prettyPrinter = new PhpParser\PrettyPrinter\Standard; - -$traverser = new PhpParser\NodeTraverser(); -$traverser->addVisitor(new PhpParser\NodeVisitor\NameResolver); - -foreach ($files as $file) { - if (strpos($file, '<?php') === 0) { - $code = $file; - fwrite(STDERR, "====> Code $code\n"); - } else { - if (!file_exists($file)) { - fwrite(STDERR, "File $file does not exist.\n"); - exit(1); - } - - $code = file_get_contents($file); - fwrite(STDERR, "====> File $file:\n"); - } - - if ($attributes['with-recovery']) { - $errorHandler = new PhpParser\ErrorHandler\Collecting; - $stmts = $parser->parse($code, $errorHandler); - foreach ($errorHandler->getErrors() as $error) { - $message = formatErrorMessage($error, $code, $attributes['with-column-info']); - fwrite(STDERR, $message . "\n"); - } - if (null === $stmts) { - continue; - } - } else { - try { - $stmts = $parser->parse($code); - } catch (PhpParser\Error $error) { - $message = formatErrorMessage($error, $code, $attributes['with-column-info']); - fwrite(STDERR, $message . "\n"); - exit(1); - } - } - - foreach ($operations as $operation) { - if ('dump' === $operation) { - fwrite(STDERR, "==> Node dump:\n"); - echo $dumper->dump($stmts, $code), "\n"; - } elseif ('pretty-print' === $operation) { - fwrite(STDERR, "==> Pretty print:\n"); - echo $prettyPrinter->prettyPrintFile($stmts), "\n"; - } elseif ('json-dump' === $operation) { - fwrite(STDERR, "==> JSON dump:\n"); - echo json_encode($stmts, JSON_PRETTY_PRINT), "\n"; - } elseif ('var-dump' === $operation) { - fwrite(STDERR, "==> var_dump():\n"); - var_dump($stmts); - } elseif ('resolve-names' === $operation) { - fwrite(STDERR, "==> Resolved names.\n"); - $stmts = $traverser->traverse($stmts); - } - } -} - -function formatErrorMessage(PhpParser\Error $e, $code, $withColumnInfo) { - if ($withColumnInfo && $e->hasColumnInfo()) { - return $e->getMessageWithColumnInfo($code); - } else { - return $e->getMessage(); - } -} - -function showHelp($error = '') { - if ($error) { - fwrite(STDERR, $error . "\n\n"); - } - fwrite($error ? STDERR : STDOUT, <<<OUTPUT -Usage: php-parse [operations] file1.php [file2.php ...] - or: php-parse [operations] "<?php code" -Turn PHP source code into an abstract syntax tree. - -Operations is a list of the following options (--dump by default): - - -d, --dump Dump nodes using NodeDumper - -p, --pretty-print Pretty print file using PrettyPrinter\Standard - -j, --json-dump Print json_encode() result - --var-dump var_dump() nodes (for exact structure) - -N, --resolve-names Resolve names using NodeVisitor\NameResolver - -c, --with-column-info Show column-numbers for errors (if available) - -P, --with-positions Show positions in node dumps - -r, --with-recovery Use parsing with error recovery - -h, --help Display this page - -Example: - php-parse -d -p -N -d file.php - - Dumps nodes, pretty prints them, then resolves names and dumps them again. - - -OUTPUT - ); - exit($error ? 1 : 0); -} - -function parseArgs($args) { - $operations = []; - $files = []; - $attributes = [ - 'with-column-info' => false, - 'with-positions' => false, - 'with-recovery' => false, - ]; - - array_shift($args); - $parseOptions = true; - foreach ($args as $arg) { - if (!$parseOptions) { - $files[] = $arg; - continue; - } - - switch ($arg) { - case '--dump': - case '-d': - $operations[] = 'dump'; - break; - case '--pretty-print': - case '-p': - $operations[] = 'pretty-print'; - break; - case '--json-dump': - case '-j': - $operations[] = 'json-dump'; - break; - case '--var-dump': - $operations[] = 'var-dump'; - break; - case '--resolve-names': - case '-N'; - $operations[] = 'resolve-names'; - break; - case '--with-column-info': - case '-c'; - $attributes['with-column-info'] = true; - break; - case '--with-positions': - case '-P': - $attributes['with-positions'] = true; - break; - case '--with-recovery': - case '-r': - $attributes['with-recovery'] = true; - break; - case '--help': - case '-h'; - showHelp(); - break; - case '--': - $parseOptions = false; - break; - default: - if ($arg[0] === '-') { - showHelp("Invalid operation $arg."); - } else { - $files[] = $arg; - } - } - } - - return [$operations, $files, $attributes]; -} diff --git a/vendor/nikic/php-parser/composer.json b/vendor/nikic/php-parser/composer.json deleted file mode 100644 index ef416d9..0000000 --- a/vendor/nikic/php-parser/composer.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "nikic/php-parser", - "type": "library", - "description": "A PHP parser written in PHP", - "keywords": [ - "php", - "parser" - ], - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Nikita Popov" - } - ], - "require": { - "php": ">=7.1", - "ext-tokenizer": "*" - }, - "require-dev": { - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", - "ircmaxell/php-yacc": "^0.0.7" - }, - "autoload": { - "psr-4": { - "PhpParser\\": "lib/PhpParser" - } - }, - "autoload-dev": { - "psr-4": { - "PhpParser\\": "test/PhpParser/" - } - }, - "bin": [ - "bin/php-parse" - ] -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder.php b/vendor/nikic/php-parser/lib/PhpParser/Builder.php deleted file mode 100644 index 26d8921..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Builder.php +++ /dev/null @@ -1,13 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser; - -interface Builder -{ - /** - * Returns the built node. - * - * @return Node The built node - */ - public function getNode() : Node; -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/ClassConst.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/ClassConst.php deleted file mode 100644 index 7c1512d..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Builder/ClassConst.php +++ /dev/null @@ -1,148 +0,0 @@ -<?php - -declare(strict_types=1); - -namespace PhpParser\Builder; - -use PhpParser; -use PhpParser\BuilderHelpers; -use PhpParser\Node; -use PhpParser\Node\Const_; -use PhpParser\Node\Identifier; -use PhpParser\Node\Stmt; - -class ClassConst implements PhpParser\Builder -{ - protected $flags = 0; - protected $attributes = []; - protected $constants = []; - - /** @var Node\AttributeGroup[] */ - protected $attributeGroups = []; - /** @var Identifier|Node\Name|Node\ComplexType */ - protected $type; - - /** - * Creates a class constant builder - * - * @param string|Identifier $name Name - * @param Node\Expr|bool|null|int|float|string|array|\UnitEnum $value Value - */ - public function __construct($name, $value) { - $this->constants = [new Const_($name, BuilderHelpers::normalizeValue($value))]; - } - - /** - * Add another constant to const group - * - * @param string|Identifier $name Name - * @param Node\Expr|bool|null|int|float|string|array|\UnitEnum $value Value - * - * @return $this The builder instance (for fluid interface) - */ - public function addConst($name, $value) { - $this->constants[] = new Const_($name, BuilderHelpers::normalizeValue($value)); - - return $this; - } - - /** - * Makes the constant public. - * - * @return $this The builder instance (for fluid interface) - */ - public function makePublic() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PUBLIC); - - return $this; - } - - /** - * Makes the constant protected. - * - * @return $this The builder instance (for fluid interface) - */ - public function makeProtected() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PROTECTED); - - return $this; - } - - /** - * Makes the constant private. - * - * @return $this The builder instance (for fluid interface) - */ - public function makePrivate() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PRIVATE); - - return $this; - } - - /** - * Makes the constant final. - * - * @return $this The builder instance (for fluid interface) - */ - public function makeFinal() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_FINAL); - - return $this; - } - - /** - * Sets doc comment for the constant. - * - * @param PhpParser\Comment\Doc|string $docComment Doc comment to set - * - * @return $this The builder instance (for fluid interface) - */ - public function setDocComment($docComment) { - $this->attributes = [ - 'comments' => [BuilderHelpers::normalizeDocComment($docComment)] - ]; - - return $this; - } - - /** - * Adds an attribute group. - * - * @param Node\Attribute|Node\AttributeGroup $attribute - * - * @return $this The builder instance (for fluid interface) - */ - public function addAttribute($attribute) { - $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); - - return $this; - } - - /** - * Sets the constant type. - * - * @param string|Node\Name|Identifier|Node\ComplexType $type - * - * @return $this - */ - public function setType($type) { - $this->type = BuilderHelpers::normalizeType($type); - - return $this; - } - - /** - * Returns the built class node. - * - * @return Stmt\ClassConst The built constant node - */ - public function getNode(): PhpParser\Node { - return new Stmt\ClassConst( - $this->constants, - $this->flags, - $this->attributes, - $this->attributeGroups, - $this->type - ); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.php deleted file mode 100644 index 35b54d0..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.php +++ /dev/null @@ -1,146 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Builder; - -use PhpParser; -use PhpParser\BuilderHelpers; -use PhpParser\Node; -use PhpParser\Node\Name; -use PhpParser\Node\Stmt; - -class Class_ extends Declaration -{ - protected $name; - - protected $extends = null; - protected $implements = []; - protected $flags = 0; - - protected $uses = []; - protected $constants = []; - protected $properties = []; - protected $methods = []; - - /** @var Node\AttributeGroup[] */ - protected $attributeGroups = []; - - /** - * Creates a class builder. - * - * @param string $name Name of the class - */ - public function __construct(string $name) { - $this->name = $name; - } - - /** - * Extends a class. - * - * @param Name|string $class Name of class to extend - * - * @return $this The builder instance (for fluid interface) - */ - public function extend($class) { - $this->extends = BuilderHelpers::normalizeName($class); - - return $this; - } - - /** - * Implements one or more interfaces. - * - * @param Name|string ...$interfaces Names of interfaces to implement - * - * @return $this The builder instance (for fluid interface) - */ - public function implement(...$interfaces) { - foreach ($interfaces as $interface) { - $this->implements[] = BuilderHelpers::normalizeName($interface); - } - - return $this; - } - - /** - * Makes the class abstract. - * - * @return $this The builder instance (for fluid interface) - */ - public function makeAbstract() { - $this->flags = BuilderHelpers::addClassModifier($this->flags, Stmt\Class_::MODIFIER_ABSTRACT); - - return $this; - } - - /** - * Makes the class final. - * - * @return $this The builder instance (for fluid interface) - */ - public function makeFinal() { - $this->flags = BuilderHelpers::addClassModifier($this->flags, Stmt\Class_::MODIFIER_FINAL); - - return $this; - } - - public function makeReadonly() { - $this->flags = BuilderHelpers::addClassModifier($this->flags, Stmt\Class_::MODIFIER_READONLY); - - return $this; - } - - /** - * Adds a statement. - * - * @param Stmt|PhpParser\Builder $stmt The statement to add - * - * @return $this The builder instance (for fluid interface) - */ - public function addStmt($stmt) { - $stmt = BuilderHelpers::normalizeNode($stmt); - - $targets = [ - Stmt\TraitUse::class => &$this->uses, - Stmt\ClassConst::class => &$this->constants, - Stmt\Property::class => &$this->properties, - Stmt\ClassMethod::class => &$this->methods, - ]; - - $class = \get_class($stmt); - if (!isset($targets[$class])) { - throw new \LogicException(sprintf('Unexpected node of type "%s"', $stmt->getType())); - } - - $targets[$class][] = $stmt; - - return $this; - } - - /** - * Adds an attribute group. - * - * @param Node\Attribute|Node\AttributeGroup $attribute - * - * @return $this The builder instance (for fluid interface) - */ - public function addAttribute($attribute) { - $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); - - return $this; - } - - /** - * Returns the built class node. - * - * @return Stmt\Class_ The built class node - */ - public function getNode() : PhpParser\Node { - return new Stmt\Class_($this->name, [ - 'flags' => $this->flags, - 'extends' => $this->extends, - 'implements' => $this->implements, - 'stmts' => array_merge($this->uses, $this->constants, $this->properties, $this->methods), - 'attrGroups' => $this->attributeGroups, - ], $this->attributes); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Declaration.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Declaration.php deleted file mode 100644 index 8309499..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Builder/Declaration.php +++ /dev/null @@ -1,43 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Builder; - -use PhpParser; -use PhpParser\BuilderHelpers; - -abstract class Declaration implements PhpParser\Builder -{ - protected $attributes = []; - - abstract public function addStmt($stmt); - - /** - * Adds multiple statements. - * - * @param array $stmts The statements to add - * - * @return $this The builder instance (for fluid interface) - */ - public function addStmts(array $stmts) { - foreach ($stmts as $stmt) { - $this->addStmt($stmt); - } - - return $this; - } - - /** - * Sets doc comment for the declaration. - * - * @param PhpParser\Comment\Doc|string $docComment Doc comment to set - * - * @return $this The builder instance (for fluid interface) - */ - public function setDocComment($docComment) { - $this->attributes['comments'] = [ - BuilderHelpers::normalizeDocComment($docComment) - ]; - - return $this; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/EnumCase.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/EnumCase.php deleted file mode 100644 index accc516..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Builder/EnumCase.php +++ /dev/null @@ -1,85 +0,0 @@ -<?php - -declare(strict_types=1); - -namespace PhpParser\Builder; - -use PhpParser; -use PhpParser\BuilderHelpers; -use PhpParser\Node; -use PhpParser\Node\Identifier; -use PhpParser\Node\Stmt; - -class EnumCase implements PhpParser\Builder -{ - protected $name; - protected $value = null; - protected $attributes = []; - - /** @var Node\AttributeGroup[] */ - protected $attributeGroups = []; - - /** - * Creates an enum case builder. - * - * @param string|Identifier $name Name - */ - public function __construct($name) { - $this->name = $name; - } - - /** - * Sets the value. - * - * @param Node\Expr|string|int $value - * - * @return $this - */ - public function setValue($value) { - $this->value = BuilderHelpers::normalizeValue($value); - - return $this; - } - - /** - * Sets doc comment for the constant. - * - * @param PhpParser\Comment\Doc|string $docComment Doc comment to set - * - * @return $this The builder instance (for fluid interface) - */ - public function setDocComment($docComment) { - $this->attributes = [ - 'comments' => [BuilderHelpers::normalizeDocComment($docComment)] - ]; - - return $this; - } - - /** - * Adds an attribute group. - * - * @param Node\Attribute|Node\AttributeGroup $attribute - * - * @return $this The builder instance (for fluid interface) - */ - public function addAttribute($attribute) { - $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); - - return $this; - } - - /** - * Returns the built enum case node. - * - * @return Stmt\EnumCase The built constant node - */ - public function getNode(): PhpParser\Node { - return new Stmt\EnumCase( - $this->name, - $this->value, - $this->attributeGroups, - $this->attributes - ); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Enum_.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Enum_.php deleted file mode 100644 index be7eef9..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Builder/Enum_.php +++ /dev/null @@ -1,117 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Builder; - -use PhpParser; -use PhpParser\BuilderHelpers; -use PhpParser\Node; -use PhpParser\Node\Identifier; -use PhpParser\Node\Name; -use PhpParser\Node\Stmt; - -class Enum_ extends Declaration -{ - protected $name; - protected $scalarType = null; - - protected $implements = []; - - protected $uses = []; - protected $enumCases = []; - protected $constants = []; - protected $methods = []; - - /** @var Node\AttributeGroup[] */ - protected $attributeGroups = []; - - /** - * Creates an enum builder. - * - * @param string $name Name of the enum - */ - public function __construct(string $name) { - $this->name = $name; - } - - /** - * Sets the scalar type. - * - * @param string|Identifier $type - * - * @return $this - */ - public function setScalarType($scalarType) { - $this->scalarType = BuilderHelpers::normalizeType($scalarType); - - return $this; - } - - /** - * Implements one or more interfaces. - * - * @param Name|string ...$interfaces Names of interfaces to implement - * - * @return $this The builder instance (for fluid interface) - */ - public function implement(...$interfaces) { - foreach ($interfaces as $interface) { - $this->implements[] = BuilderHelpers::normalizeName($interface); - } - - return $this; - } - - /** - * Adds a statement. - * - * @param Stmt|PhpParser\Builder $stmt The statement to add - * - * @return $this The builder instance (for fluid interface) - */ - public function addStmt($stmt) { - $stmt = BuilderHelpers::normalizeNode($stmt); - - $targets = [ - Stmt\TraitUse::class => &$this->uses, - Stmt\EnumCase::class => &$this->enumCases, - Stmt\ClassConst::class => &$this->constants, - Stmt\ClassMethod::class => &$this->methods, - ]; - - $class = \get_class($stmt); - if (!isset($targets[$class])) { - throw new \LogicException(sprintf('Unexpected node of type "%s"', $stmt->getType())); - } - - $targets[$class][] = $stmt; - - return $this; - } - - /** - * Adds an attribute group. - * - * @param Node\Attribute|Node\AttributeGroup $attribute - * - * @return $this The builder instance (for fluid interface) - */ - public function addAttribute($attribute) { - $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); - - return $this; - } - - /** - * Returns the built class node. - * - * @return Stmt\Enum_ The built enum node - */ - public function getNode() : PhpParser\Node { - return new Stmt\Enum_($this->name, [ - 'scalarType' => $this->scalarType, - 'implements' => $this->implements, - 'stmts' => array_merge($this->uses, $this->enumCases, $this->constants, $this->methods), - 'attrGroups' => $this->attributeGroups, - ], $this->attributes); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php deleted file mode 100644 index 98ea9d3..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php +++ /dev/null @@ -1,73 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Builder; - -use PhpParser\BuilderHelpers; -use PhpParser\Node; - -abstract class FunctionLike extends Declaration -{ - protected $returnByRef = false; - protected $params = []; - - /** @var string|Node\Name|Node\NullableType|null */ - protected $returnType = null; - - /** - * Make the function return by reference. - * - * @return $this The builder instance (for fluid interface) - */ - public function makeReturnByRef() { - $this->returnByRef = true; - - return $this; - } - - /** - * Adds a parameter. - * - * @param Node\Param|Param $param The parameter to add - * - * @return $this The builder instance (for fluid interface) - */ - public function addParam($param) { - $param = BuilderHelpers::normalizeNode($param); - - if (!$param instanceof Node\Param) { - throw new \LogicException(sprintf('Expected parameter node, got "%s"', $param->getType())); - } - - $this->params[] = $param; - - return $this; - } - - /** - * Adds multiple parameters. - * - * @param array $params The parameters to add - * - * @return $this The builder instance (for fluid interface) - */ - public function addParams(array $params) { - foreach ($params as $param) { - $this->addParam($param); - } - - return $this; - } - - /** - * Sets the return type for PHP 7. - * - * @param string|Node\Name|Node\Identifier|Node\ComplexType $type - * - * @return $this The builder instance (for fluid interface) - */ - public function setReturnType($type) { - $this->returnType = BuilderHelpers::normalizeType($type); - - return $this; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Function_.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Function_.php deleted file mode 100644 index 1cd73c0..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Builder/Function_.php +++ /dev/null @@ -1,67 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Builder; - -use PhpParser; -use PhpParser\BuilderHelpers; -use PhpParser\Node; -use PhpParser\Node\Stmt; - -class Function_ extends FunctionLike -{ - protected $name; - protected $stmts = []; - - /** @var Node\AttributeGroup[] */ - protected $attributeGroups = []; - - /** - * Creates a function builder. - * - * @param string $name Name of the function - */ - public function __construct(string $name) { - $this->name = $name; - } - - /** - * Adds a statement. - * - * @param Node|PhpParser\Builder $stmt The statement to add - * - * @return $this The builder instance (for fluid interface) - */ - public function addStmt($stmt) { - $this->stmts[] = BuilderHelpers::normalizeStmt($stmt); - - return $this; - } - - /** - * Adds an attribute group. - * - * @param Node\Attribute|Node\AttributeGroup $attribute - * - * @return $this The builder instance (for fluid interface) - */ - public function addAttribute($attribute) { - $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); - - return $this; - } - - /** - * Returns the built function node. - * - * @return Stmt\Function_ The built function node - */ - public function getNode() : Node { - return new Stmt\Function_($this->name, [ - 'byRef' => $this->returnByRef, - 'params' => $this->params, - 'returnType' => $this->returnType, - 'stmts' => $this->stmts, - 'attrGroups' => $this->attributeGroups, - ], $this->attributes); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Interface_.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Interface_.php deleted file mode 100644 index 7806e85..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Builder/Interface_.php +++ /dev/null @@ -1,93 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Builder; - -use PhpParser; -use PhpParser\BuilderHelpers; -use PhpParser\Node; -use PhpParser\Node\Name; -use PhpParser\Node\Stmt; - -class Interface_ extends Declaration -{ - protected $name; - protected $extends = []; - protected $constants = []; - protected $methods = []; - - /** @var Node\AttributeGroup[] */ - protected $attributeGroups = []; - - /** - * Creates an interface builder. - * - * @param string $name Name of the interface - */ - public function __construct(string $name) { - $this->name = $name; - } - - /** - * Extends one or more interfaces. - * - * @param Name|string ...$interfaces Names of interfaces to extend - * - * @return $this The builder instance (for fluid interface) - */ - public function extend(...$interfaces) { - foreach ($interfaces as $interface) { - $this->extends[] = BuilderHelpers::normalizeName($interface); - } - - return $this; - } - - /** - * Adds a statement. - * - * @param Stmt|PhpParser\Builder $stmt The statement to add - * - * @return $this The builder instance (for fluid interface) - */ - public function addStmt($stmt) { - $stmt = BuilderHelpers::normalizeNode($stmt); - - if ($stmt instanceof Stmt\ClassConst) { - $this->constants[] = $stmt; - } elseif ($stmt instanceof Stmt\ClassMethod) { - // we erase all statements in the body of an interface method - $stmt->stmts = null; - $this->methods[] = $stmt; - } else { - throw new \LogicException(sprintf('Unexpected node of type "%s"', $stmt->getType())); - } - - return $this; - } - - /** - * Adds an attribute group. - * - * @param Node\Attribute|Node\AttributeGroup $attribute - * - * @return $this The builder instance (for fluid interface) - */ - public function addAttribute($attribute) { - $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); - - return $this; - } - - /** - * Returns the built interface node. - * - * @return Stmt\Interface_ The built interface node - */ - public function getNode() : PhpParser\Node { - return new Stmt\Interface_($this->name, [ - 'extends' => $this->extends, - 'stmts' => array_merge($this->constants, $this->methods), - 'attrGroups' => $this->attributeGroups, - ], $this->attributes); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Method.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Method.php deleted file mode 100644 index 232d7cb..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Builder/Method.php +++ /dev/null @@ -1,146 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Builder; - -use PhpParser; -use PhpParser\BuilderHelpers; -use PhpParser\Node; -use PhpParser\Node\Stmt; - -class Method extends FunctionLike -{ - protected $name; - protected $flags = 0; - - /** @var array|null */ - protected $stmts = []; - - /** @var Node\AttributeGroup[] */ - protected $attributeGroups = []; - - /** - * Creates a method builder. - * - * @param string $name Name of the method - */ - public function __construct(string $name) { - $this->name = $name; - } - - /** - * Makes the method public. - * - * @return $this The builder instance (for fluid interface) - */ - public function makePublic() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PUBLIC); - - return $this; - } - - /** - * Makes the method protected. - * - * @return $this The builder instance (for fluid interface) - */ - public function makeProtected() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PROTECTED); - - return $this; - } - - /** - * Makes the method private. - * - * @return $this The builder instance (for fluid interface) - */ - public function makePrivate() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PRIVATE); - - return $this; - } - - /** - * Makes the method static. - * - * @return $this The builder instance (for fluid interface) - */ - public function makeStatic() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_STATIC); - - return $this; - } - - /** - * Makes the method abstract. - * - * @return $this The builder instance (for fluid interface) - */ - public function makeAbstract() { - if (!empty($this->stmts)) { - throw new \LogicException('Cannot make method with statements abstract'); - } - - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_ABSTRACT); - $this->stmts = null; // abstract methods don't have statements - - return $this; - } - - /** - * Makes the method final. - * - * @return $this The builder instance (for fluid interface) - */ - public function makeFinal() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_FINAL); - - return $this; - } - - /** - * Adds a statement. - * - * @param Node|PhpParser\Builder $stmt The statement to add - * - * @return $this The builder instance (for fluid interface) - */ - public function addStmt($stmt) { - if (null === $this->stmts) { - throw new \LogicException('Cannot add statements to an abstract method'); - } - - $this->stmts[] = BuilderHelpers::normalizeStmt($stmt); - - return $this; - } - - /** - * Adds an attribute group. - * - * @param Node\Attribute|Node\AttributeGroup $attribute - * - * @return $this The builder instance (for fluid interface) - */ - public function addAttribute($attribute) { - $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); - - return $this; - } - - /** - * Returns the built method node. - * - * @return Stmt\ClassMethod The built method node - */ - public function getNode() : Node { - return new Stmt\ClassMethod($this->name, [ - 'flags' => $this->flags, - 'byRef' => $this->returnByRef, - 'params' => $this->params, - 'returnType' => $this->returnType, - 'stmts' => $this->stmts, - 'attrGroups' => $this->attributeGroups, - ], $this->attributes); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php deleted file mode 100644 index 1c751e1..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php +++ /dev/null @@ -1,45 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Builder; - -use PhpParser; -use PhpParser\BuilderHelpers; -use PhpParser\Node; -use PhpParser\Node\Stmt; - -class Namespace_ extends Declaration -{ - private $name; - private $stmts = []; - - /** - * Creates a namespace builder. - * - * @param Node\Name|string|null $name Name of the namespace - */ - public function __construct($name) { - $this->name = null !== $name ? BuilderHelpers::normalizeName($name) : null; - } - - /** - * Adds a statement. - * - * @param Node|PhpParser\Builder $stmt The statement to add - * - * @return $this The builder instance (for fluid interface) - */ - public function addStmt($stmt) { - $this->stmts[] = BuilderHelpers::normalizeStmt($stmt); - - return $this; - } - - /** - * Returns the built node. - * - * @return Stmt\Namespace_ The built node - */ - public function getNode() : Node { - return new Stmt\Namespace_($this->name, $this->stmts, $this->attributes); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php deleted file mode 100644 index 69f3533..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php +++ /dev/null @@ -1,168 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Builder; - -use PhpParser; -use PhpParser\BuilderHelpers; -use PhpParser\Node; - -class Param implements PhpParser\Builder -{ - protected $name; - - protected $default = null; - - /** @var Node\Identifier|Node\Name|Node\NullableType|null */ - protected $type = null; - - protected $byRef = false; - - protected $variadic = false; - - protected $flags = 0; - - /** @var Node\AttributeGroup[] */ - protected $attributeGroups = []; - - /** - * Creates a parameter builder. - * - * @param string $name Name of the parameter - */ - public function __construct(string $name) { - $this->name = $name; - } - - /** - * Sets default value for the parameter. - * - * @param mixed $value Default value to use - * - * @return $this The builder instance (for fluid interface) - */ - public function setDefault($value) { - $this->default = BuilderHelpers::normalizeValue($value); - - return $this; - } - - /** - * Sets type for the parameter. - * - * @param string|Node\Name|Node\Identifier|Node\ComplexType $type Parameter type - * - * @return $this The builder instance (for fluid interface) - */ - public function setType($type) { - $this->type = BuilderHelpers::normalizeType($type); - if ($this->type == 'void') { - throw new \LogicException('Parameter type cannot be void'); - } - - return $this; - } - - /** - * Sets type for the parameter. - * - * @param string|Node\Name|Node\Identifier|Node\ComplexType $type Parameter type - * - * @return $this The builder instance (for fluid interface) - * - * @deprecated Use setType() instead - */ - public function setTypeHint($type) { - return $this->setType($type); - } - - /** - * Make the parameter accept the value by reference. - * - * @return $this The builder instance (for fluid interface) - */ - public function makeByRef() { - $this->byRef = true; - - return $this; - } - - /** - * Make the parameter variadic - * - * @return $this The builder instance (for fluid interface) - */ - public function makeVariadic() { - $this->variadic = true; - - return $this; - } - - /** - * Makes the (promoted) parameter public. - * - * @return $this The builder instance (for fluid interface) - */ - public function makePublic() { - $this->flags = BuilderHelpers::addModifier($this->flags, Node\Stmt\Class_::MODIFIER_PUBLIC); - - return $this; - } - - /** - * Makes the (promoted) parameter protected. - * - * @return $this The builder instance (for fluid interface) - */ - public function makeProtected() { - $this->flags = BuilderHelpers::addModifier($this->flags, Node\Stmt\Class_::MODIFIER_PROTECTED); - - return $this; - } - - /** - * Makes the (promoted) parameter private. - * - * @return $this The builder instance (for fluid interface) - */ - public function makePrivate() { - $this->flags = BuilderHelpers::addModifier($this->flags, Node\Stmt\Class_::MODIFIER_PRIVATE); - - return $this; - } - - /** - * Makes the (promoted) parameter readonly. - * - * @return $this The builder instance (for fluid interface) - */ - public function makeReadonly() { - $this->flags = BuilderHelpers::addModifier($this->flags, Node\Stmt\Class_::MODIFIER_READONLY); - - return $this; - } - - /** - * Adds an attribute group. - * - * @param Node\Attribute|Node\AttributeGroup $attribute - * - * @return $this The builder instance (for fluid interface) - */ - public function addAttribute($attribute) { - $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); - - return $this; - } - - /** - * Returns the built parameter node. - * - * @return Node\Param The built parameter node - */ - public function getNode() : Node { - return new Node\Param( - new Node\Expr\Variable($this->name), - $this->default, $this->type, $this->byRef, $this->variadic, [], $this->flags, $this->attributeGroups - ); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Property.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Property.php deleted file mode 100644 index 68e3185..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Builder/Property.php +++ /dev/null @@ -1,161 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Builder; - -use PhpParser; -use PhpParser\BuilderHelpers; -use PhpParser\Node; -use PhpParser\Node\Identifier; -use PhpParser\Node\Name; -use PhpParser\Node\Stmt; -use PhpParser\Node\ComplexType; - -class Property implements PhpParser\Builder -{ - protected $name; - - protected $flags = 0; - protected $default = null; - protected $attributes = []; - - /** @var null|Identifier|Name|NullableType */ - protected $type; - - /** @var Node\AttributeGroup[] */ - protected $attributeGroups = []; - - /** - * Creates a property builder. - * - * @param string $name Name of the property - */ - public function __construct(string $name) { - $this->name = $name; - } - - /** - * Makes the property public. - * - * @return $this The builder instance (for fluid interface) - */ - public function makePublic() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PUBLIC); - - return $this; - } - - /** - * Makes the property protected. - * - * @return $this The builder instance (for fluid interface) - */ - public function makeProtected() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PROTECTED); - - return $this; - } - - /** - * Makes the property private. - * - * @return $this The builder instance (for fluid interface) - */ - public function makePrivate() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PRIVATE); - - return $this; - } - - /** - * Makes the property static. - * - * @return $this The builder instance (for fluid interface) - */ - public function makeStatic() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_STATIC); - - return $this; - } - - /** - * Makes the property readonly. - * - * @return $this The builder instance (for fluid interface) - */ - public function makeReadonly() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_READONLY); - - return $this; - } - - /** - * Sets default value for the property. - * - * @param mixed $value Default value to use - * - * @return $this The builder instance (for fluid interface) - */ - public function setDefault($value) { - $this->default = BuilderHelpers::normalizeValue($value); - - return $this; - } - - /** - * Sets doc comment for the property. - * - * @param PhpParser\Comment\Doc|string $docComment Doc comment to set - * - * @return $this The builder instance (for fluid interface) - */ - public function setDocComment($docComment) { - $this->attributes = [ - 'comments' => [BuilderHelpers::normalizeDocComment($docComment)] - ]; - - return $this; - } - - /** - * Sets the property type for PHP 7.4+. - * - * @param string|Name|Identifier|ComplexType $type - * - * @return $this - */ - public function setType($type) { - $this->type = BuilderHelpers::normalizeType($type); - - return $this; - } - - /** - * Adds an attribute group. - * - * @param Node\Attribute|Node\AttributeGroup $attribute - * - * @return $this The builder instance (for fluid interface) - */ - public function addAttribute($attribute) { - $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); - - return $this; - } - - /** - * Returns the built class node. - * - * @return Stmt\Property The built property node - */ - public function getNode() : PhpParser\Node { - return new Stmt\Property( - $this->flags !== 0 ? $this->flags : Stmt\Class_::MODIFIER_PUBLIC, - [ - new Stmt\PropertyProperty($this->name, $this->default) - ], - $this->attributes, - $this->type, - $this->attributeGroups - ); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php deleted file mode 100644 index 311e8cd..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php +++ /dev/null @@ -1,64 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Builder; - -use PhpParser\Builder; -use PhpParser\BuilderHelpers; -use PhpParser\Node; -use PhpParser\Node\Stmt; - -class TraitUse implements Builder -{ - protected $traits = []; - protected $adaptations = []; - - /** - * Creates a trait use builder. - * - * @param Node\Name|string ...$traits Names of used traits - */ - public function __construct(...$traits) { - foreach ($traits as $trait) { - $this->and($trait); - } - } - - /** - * Adds used trait. - * - * @param Node\Name|string $trait Trait name - * - * @return $this The builder instance (for fluid interface) - */ - public function and($trait) { - $this->traits[] = BuilderHelpers::normalizeName($trait); - return $this; - } - - /** - * Adds trait adaptation. - * - * @param Stmt\TraitUseAdaptation|Builder\TraitUseAdaptation $adaptation Trait adaptation - * - * @return $this The builder instance (for fluid interface) - */ - public function with($adaptation) { - $adaptation = BuilderHelpers::normalizeNode($adaptation); - - if (!$adaptation instanceof Stmt\TraitUseAdaptation) { - throw new \LogicException('Adaptation must have type TraitUseAdaptation'); - } - - $this->adaptations[] = $adaptation; - return $this; - } - - /** - * Returns the built node. - * - * @return Node The built node - */ - public function getNode() : Node { - return new Stmt\TraitUse($this->traits, $this->adaptations); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php deleted file mode 100644 index eb6c0b6..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php +++ /dev/null @@ -1,148 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Builder; - -use PhpParser\Builder; -use PhpParser\BuilderHelpers; -use PhpParser\Node; -use PhpParser\Node\Stmt; - -class TraitUseAdaptation implements Builder -{ - const TYPE_UNDEFINED = 0; - const TYPE_ALIAS = 1; - const TYPE_PRECEDENCE = 2; - - /** @var int Type of building adaptation */ - protected $type; - - protected $trait; - protected $method; - - protected $modifier = null; - protected $alias = null; - - protected $insteadof = []; - - /** - * Creates a trait use adaptation builder. - * - * @param Node\Name|string|null $trait Name of adaptated trait - * @param Node\Identifier|string $method Name of adaptated method - */ - public function __construct($trait, $method) { - $this->type = self::TYPE_UNDEFINED; - - $this->trait = is_null($trait)? null: BuilderHelpers::normalizeName($trait); - $this->method = BuilderHelpers::normalizeIdentifier($method); - } - - /** - * Sets alias of method. - * - * @param Node\Identifier|string $alias Alias for adaptated method - * - * @return $this The builder instance (for fluid interface) - */ - public function as($alias) { - if ($this->type === self::TYPE_UNDEFINED) { - $this->type = self::TYPE_ALIAS; - } - - if ($this->type !== self::TYPE_ALIAS) { - throw new \LogicException('Cannot set alias for not alias adaptation buider'); - } - - $this->alias = $alias; - return $this; - } - - /** - * Sets adaptated method public. - * - * @return $this The builder instance (for fluid interface) - */ - public function makePublic() { - $this->setModifier(Stmt\Class_::MODIFIER_PUBLIC); - return $this; - } - - /** - * Sets adaptated method protected. - * - * @return $this The builder instance (for fluid interface) - */ - public function makeProtected() { - $this->setModifier(Stmt\Class_::MODIFIER_PROTECTED); - return $this; - } - - /** - * Sets adaptated method private. - * - * @return $this The builder instance (for fluid interface) - */ - public function makePrivate() { - $this->setModifier(Stmt\Class_::MODIFIER_PRIVATE); - return $this; - } - - /** - * Adds overwritten traits. - * - * @param Node\Name|string ...$traits Traits for overwrite - * - * @return $this The builder instance (for fluid interface) - */ - public function insteadof(...$traits) { - if ($this->type === self::TYPE_UNDEFINED) { - if (is_null($this->trait)) { - throw new \LogicException('Precedence adaptation must have trait'); - } - - $this->type = self::TYPE_PRECEDENCE; - } - - if ($this->type !== self::TYPE_PRECEDENCE) { - throw new \LogicException('Cannot add overwritten traits for not precedence adaptation buider'); - } - - foreach ($traits as $trait) { - $this->insteadof[] = BuilderHelpers::normalizeName($trait); - } - - return $this; - } - - protected function setModifier(int $modifier) { - if ($this->type === self::TYPE_UNDEFINED) { - $this->type = self::TYPE_ALIAS; - } - - if ($this->type !== self::TYPE_ALIAS) { - throw new \LogicException('Cannot set access modifier for not alias adaptation buider'); - } - - if (is_null($this->modifier)) { - $this->modifier = $modifier; - } else { - throw new \LogicException('Multiple access type modifiers are not allowed'); - } - } - - /** - * Returns the built node. - * - * @return Node The built node - */ - public function getNode() : Node { - switch ($this->type) { - case self::TYPE_ALIAS: - return new Stmt\TraitUseAdaptation\Alias($this->trait, $this->method, $this->modifier, $this->alias); - case self::TYPE_PRECEDENCE: - return new Stmt\TraitUseAdaptation\Precedence($this->trait, $this->method, $this->insteadof); - default: - throw new \LogicException('Type of adaptation is not defined'); - } - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Trait_.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Trait_.php deleted file mode 100644 index 97f32f9..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Builder/Trait_.php +++ /dev/null @@ -1,78 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Builder; - -use PhpParser; -use PhpParser\BuilderHelpers; -use PhpParser\Node; -use PhpParser\Node\Stmt; - -class Trait_ extends Declaration -{ - protected $name; - protected $uses = []; - protected $properties = []; - protected $methods = []; - - /** @var Node\AttributeGroup[] */ - protected $attributeGroups = []; - - /** - * Creates an interface builder. - * - * @param string $name Name of the interface - */ - public function __construct(string $name) { - $this->name = $name; - } - - /** - * Adds a statement. - * - * @param Stmt|PhpParser\Builder $stmt The statement to add - * - * @return $this The builder instance (for fluid interface) - */ - public function addStmt($stmt) { - $stmt = BuilderHelpers::normalizeNode($stmt); - - if ($stmt instanceof Stmt\Property) { - $this->properties[] = $stmt; - } elseif ($stmt instanceof Stmt\ClassMethod) { - $this->methods[] = $stmt; - } elseif ($stmt instanceof Stmt\TraitUse) { - $this->uses[] = $stmt; - } else { - throw new \LogicException(sprintf('Unexpected node of type "%s"', $stmt->getType())); - } - - return $this; - } - - /** - * Adds an attribute group. - * - * @param Node\Attribute|Node\AttributeGroup $attribute - * - * @return $this The builder instance (for fluid interface) - */ - public function addAttribute($attribute) { - $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); - - return $this; - } - - /** - * Returns the built trait node. - * - * @return Stmt\Trait_ The built interface node - */ - public function getNode() : PhpParser\Node { - return new Stmt\Trait_( - $this->name, [ - 'stmts' => array_merge($this->uses, $this->properties, $this->methods), - 'attrGroups' => $this->attributeGroups, - ], $this->attributes - ); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Use_.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Use_.php deleted file mode 100644 index 4bd3d12..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Builder/Use_.php +++ /dev/null @@ -1,49 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Builder; - -use PhpParser\Builder; -use PhpParser\BuilderHelpers; -use PhpParser\Node; -use PhpParser\Node\Stmt; - -class Use_ implements Builder -{ - protected $name; - protected $type; - protected $alias = null; - - /** - * Creates a name use (alias) builder. - * - * @param Node\Name|string $name Name of the entity (namespace, class, function, constant) to alias - * @param int $type One of the Stmt\Use_::TYPE_* constants - */ - public function __construct($name, int $type) { - $this->name = BuilderHelpers::normalizeName($name); - $this->type = $type; - } - - /** - * Sets alias for used name. - * - * @param string $alias Alias to use (last component of full name by default) - * - * @return $this The builder instance (for fluid interface) - */ - public function as(string $alias) { - $this->alias = $alias; - return $this; - } - - /** - * Returns the built node. - * - * @return Stmt\Use_ The built node - */ - public function getNode() : Node { - return new Stmt\Use_([ - new Stmt\UseUse($this->name, $this->alias) - ], $this->type); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php b/vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php deleted file mode 100644 index 0aae873..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php +++ /dev/null @@ -1,399 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser; - -use PhpParser\Node\Arg; -use PhpParser\Node\Expr; -use PhpParser\Node\Expr\BinaryOp\Concat; -use PhpParser\Node\Identifier; -use PhpParser\Node\Name; -use PhpParser\Node\Scalar\String_; -use PhpParser\Node\Stmt\Use_; - -class BuilderFactory -{ - /** - * Creates an attribute node. - * - * @param string|Name $name Name of the attribute - * @param array $args Attribute named arguments - * - * @return Node\Attribute - */ - public function attribute($name, array $args = []) : Node\Attribute { - return new Node\Attribute( - BuilderHelpers::normalizeName($name), - $this->args($args) - ); - } - - /** - * Creates a namespace builder. - * - * @param null|string|Node\Name $name Name of the namespace - * - * @return Builder\Namespace_ The created namespace builder - */ - public function namespace($name) : Builder\Namespace_ { - return new Builder\Namespace_($name); - } - - /** - * Creates a class builder. - * - * @param string $name Name of the class - * - * @return Builder\Class_ The created class builder - */ - public function class(string $name) : Builder\Class_ { - return new Builder\Class_($name); - } - - /** - * Creates an interface builder. - * - * @param string $name Name of the interface - * - * @return Builder\Interface_ The created interface builder - */ - public function interface(string $name) : Builder\Interface_ { - return new Builder\Interface_($name); - } - - /** - * Creates a trait builder. - * - * @param string $name Name of the trait - * - * @return Builder\Trait_ The created trait builder - */ - public function trait(string $name) : Builder\Trait_ { - return new Builder\Trait_($name); - } - - /** - * Creates an enum builder. - * - * @param string $name Name of the enum - * - * @return Builder\Enum_ The created enum builder - */ - public function enum(string $name) : Builder\Enum_ { - return new Builder\Enum_($name); - } - - /** - * Creates a trait use builder. - * - * @param Node\Name|string ...$traits Trait names - * - * @return Builder\TraitUse The create trait use builder - */ - public function useTrait(...$traits) : Builder\TraitUse { - return new Builder\TraitUse(...$traits); - } - - /** - * Creates a trait use adaptation builder. - * - * @param Node\Name|string|null $trait Trait name - * @param Node\Identifier|string $method Method name - * - * @return Builder\TraitUseAdaptation The create trait use adaptation builder - */ - public function traitUseAdaptation($trait, $method = null) : Builder\TraitUseAdaptation { - if ($method === null) { - $method = $trait; - $trait = null; - } - - return new Builder\TraitUseAdaptation($trait, $method); - } - - /** - * Creates a method builder. - * - * @param string $name Name of the method - * - * @return Builder\Method The created method builder - */ - public function method(string $name) : Builder\Method { - return new Builder\Method($name); - } - - /** - * Creates a parameter builder. - * - * @param string $name Name of the parameter - * - * @return Builder\Param The created parameter builder - */ - public function param(string $name) : Builder\Param { - return new Builder\Param($name); - } - - /** - * Creates a property builder. - * - * @param string $name Name of the property - * - * @return Builder\Property The created property builder - */ - public function property(string $name) : Builder\Property { - return new Builder\Property($name); - } - - /** - * Creates a function builder. - * - * @param string $name Name of the function - * - * @return Builder\Function_ The created function builder - */ - public function function(string $name) : Builder\Function_ { - return new Builder\Function_($name); - } - - /** - * Creates a namespace/class use builder. - * - * @param Node\Name|string $name Name of the entity (namespace or class) to alias - * - * @return Builder\Use_ The created use builder - */ - public function use($name) : Builder\Use_ { - return new Builder\Use_($name, Use_::TYPE_NORMAL); - } - - /** - * Creates a function use builder. - * - * @param Node\Name|string $name Name of the function to alias - * - * @return Builder\Use_ The created use function builder - */ - public function useFunction($name) : Builder\Use_ { - return new Builder\Use_($name, Use_::TYPE_FUNCTION); - } - - /** - * Creates a constant use builder. - * - * @param Node\Name|string $name Name of the const to alias - * - * @return Builder\Use_ The created use const builder - */ - public function useConst($name) : Builder\Use_ { - return new Builder\Use_($name, Use_::TYPE_CONSTANT); - } - - /** - * Creates a class constant builder. - * - * @param string|Identifier $name Name - * @param Node\Expr|bool|null|int|float|string|array $value Value - * - * @return Builder\ClassConst The created use const builder - */ - public function classConst($name, $value) : Builder\ClassConst { - return new Builder\ClassConst($name, $value); - } - - /** - * Creates an enum case builder. - * - * @param string|Identifier $name Name - * - * @return Builder\EnumCase The created use const builder - */ - public function enumCase($name) : Builder\EnumCase { - return new Builder\EnumCase($name); - } - - /** - * Creates node a for a literal value. - * - * @param Expr|bool|null|int|float|string|array|\UnitEnum $value $value - * - * @return Expr - */ - public function val($value) : Expr { - return BuilderHelpers::normalizeValue($value); - } - - /** - * Creates variable node. - * - * @param string|Expr $name Name - * - * @return Expr\Variable - */ - public function var($name) : Expr\Variable { - if (!\is_string($name) && !$name instanceof Expr) { - throw new \LogicException('Variable name must be string or Expr'); - } - - return new Expr\Variable($name); - } - - /** - * Normalizes an argument list. - * - * Creates Arg nodes for all arguments and converts literal values to expressions. - * - * @param array $args List of arguments to normalize - * - * @return Arg[] - */ - public function args(array $args) : array { - $normalizedArgs = []; - foreach ($args as $key => $arg) { - if (!($arg instanceof Arg)) { - $arg = new Arg(BuilderHelpers::normalizeValue($arg)); - } - if (\is_string($key)) { - $arg->name = BuilderHelpers::normalizeIdentifier($key); - } - $normalizedArgs[] = $arg; - } - return $normalizedArgs; - } - - /** - * Creates a function call node. - * - * @param string|Name|Expr $name Function name - * @param array $args Function arguments - * - * @return Expr\FuncCall - */ - public function funcCall($name, array $args = []) : Expr\FuncCall { - return new Expr\FuncCall( - BuilderHelpers::normalizeNameOrExpr($name), - $this->args($args) - ); - } - - /** - * Creates a method call node. - * - * @param Expr $var Variable the method is called on - * @param string|Identifier|Expr $name Method name - * @param array $args Method arguments - * - * @return Expr\MethodCall - */ - public function methodCall(Expr $var, $name, array $args = []) : Expr\MethodCall { - return new Expr\MethodCall( - $var, - BuilderHelpers::normalizeIdentifierOrExpr($name), - $this->args($args) - ); - } - - /** - * Creates a static method call node. - * - * @param string|Name|Expr $class Class name - * @param string|Identifier|Expr $name Method name - * @param array $args Method arguments - * - * @return Expr\StaticCall - */ - public function staticCall($class, $name, array $args = []) : Expr\StaticCall { - return new Expr\StaticCall( - BuilderHelpers::normalizeNameOrExpr($class), - BuilderHelpers::normalizeIdentifierOrExpr($name), - $this->args($args) - ); - } - - /** - * Creates an object creation node. - * - * @param string|Name|Expr $class Class name - * @param array $args Constructor arguments - * - * @return Expr\New_ - */ - public function new($class, array $args = []) : Expr\New_ { - return new Expr\New_( - BuilderHelpers::normalizeNameOrExpr($class), - $this->args($args) - ); - } - - /** - * Creates a constant fetch node. - * - * @param string|Name $name Constant name - * - * @return Expr\ConstFetch - */ - public function constFetch($name) : Expr\ConstFetch { - return new Expr\ConstFetch(BuilderHelpers::normalizeName($name)); - } - - /** - * Creates a property fetch node. - * - * @param Expr $var Variable holding object - * @param string|Identifier|Expr $name Property name - * - * @return Expr\PropertyFetch - */ - public function propertyFetch(Expr $var, $name) : Expr\PropertyFetch { - return new Expr\PropertyFetch($var, BuilderHelpers::normalizeIdentifierOrExpr($name)); - } - - /** - * Creates a class constant fetch node. - * - * @param string|Name|Expr $class Class name - * @param string|Identifier|Expr $name Constant name - * - * @return Expr\ClassConstFetch - */ - public function classConstFetch($class, $name): Expr\ClassConstFetch { - return new Expr\ClassConstFetch( - BuilderHelpers::normalizeNameOrExpr($class), - BuilderHelpers::normalizeIdentifierOrExpr($name) - ); - } - - /** - * Creates nested Concat nodes from a list of expressions. - * - * @param Expr|string ...$exprs Expressions or literal strings - * - * @return Concat - */ - public function concat(...$exprs) : Concat { - $numExprs = count($exprs); - if ($numExprs < 2) { - throw new \LogicException('Expected at least two expressions'); - } - - $lastConcat = $this->normalizeStringExpr($exprs[0]); - for ($i = 1; $i < $numExprs; $i++) { - $lastConcat = new Concat($lastConcat, $this->normalizeStringExpr($exprs[$i])); - } - return $lastConcat; - } - - /** - * @param string|Expr $expr - * @return Expr - */ - private function normalizeStringExpr($expr) : Expr { - if ($expr instanceof Expr) { - return $expr; - } - - if (\is_string($expr)) { - return new String_($expr); - } - - throw new \LogicException('Expected string or Expr'); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php b/vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php deleted file mode 100644 index 05e7868..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php +++ /dev/null @@ -1,340 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser; - -use PhpParser\Node\ComplexType; -use PhpParser\Node\Expr; -use PhpParser\Node\Identifier; -use PhpParser\Node\Name; -use PhpParser\Node\Name\FullyQualified; -use PhpParser\Node\NullableType; -use PhpParser\Node\Scalar; -use PhpParser\Node\Stmt; - -/** - * This class defines helpers used in the implementation of builders. Don't use it directly. - * - * @internal - */ -final class BuilderHelpers -{ - /** - * Normalizes a node: Converts builder objects to nodes. - * - * @param Node|Builder $node The node to normalize - * - * @return Node The normalized node - */ - public static function normalizeNode($node) : Node { - if ($node instanceof Builder) { - return $node->getNode(); - } - - if ($node instanceof Node) { - return $node; - } - - throw new \LogicException('Expected node or builder object'); - } - - /** - * Normalizes a node to a statement. - * - * Expressions are wrapped in a Stmt\Expression node. - * - * @param Node|Builder $node The node to normalize - * - * @return Stmt The normalized statement node - */ - public static function normalizeStmt($node) : Stmt { - $node = self::normalizeNode($node); - if ($node instanceof Stmt) { - return $node; - } - - if ($node instanceof Expr) { - return new Stmt\Expression($node); - } - - throw new \LogicException('Expected statement or expression node'); - } - - /** - * Normalizes strings to Identifier. - * - * @param string|Identifier $name The identifier to normalize - * - * @return Identifier The normalized identifier - */ - public static function normalizeIdentifier($name) : Identifier { - if ($name instanceof Identifier) { - return $name; - } - - if (\is_string($name)) { - return new Identifier($name); - } - - throw new \LogicException('Expected string or instance of Node\Identifier'); - } - - /** - * Normalizes strings to Identifier, also allowing expressions. - * - * @param string|Identifier|Expr $name The identifier to normalize - * - * @return Identifier|Expr The normalized identifier or expression - */ - public static function normalizeIdentifierOrExpr($name) { - if ($name instanceof Identifier || $name instanceof Expr) { - return $name; - } - - if (\is_string($name)) { - return new Identifier($name); - } - - throw new \LogicException('Expected string or instance of Node\Identifier or Node\Expr'); - } - - /** - * Normalizes a name: Converts string names to Name nodes. - * - * @param Name|string $name The name to normalize - * - * @return Name The normalized name - */ - public static function normalizeName($name) : Name { - if ($name instanceof Name) { - return $name; - } - - if (is_string($name)) { - if (!$name) { - throw new \LogicException('Name cannot be empty'); - } - - if ($name[0] === '\\') { - return new Name\FullyQualified(substr($name, 1)); - } - - if (0 === strpos($name, 'namespace\\')) { - return new Name\Relative(substr($name, strlen('namespace\\'))); - } - - return new Name($name); - } - - throw new \LogicException('Name must be a string or an instance of Node\Name'); - } - - /** - * Normalizes a name: Converts string names to Name nodes, while also allowing expressions. - * - * @param Expr|Name|string $name The name to normalize - * - * @return Name|Expr The normalized name or expression - */ - public static function normalizeNameOrExpr($name) { - if ($name instanceof Expr) { - return $name; - } - - if (!is_string($name) && !($name instanceof Name)) { - throw new \LogicException( - 'Name must be a string or an instance of Node\Name or Node\Expr' - ); - } - - return self::normalizeName($name); - } - - /** - * Normalizes a type: Converts plain-text type names into proper AST representation. - * - * In particular, builtin types become Identifiers, custom types become Names and nullables - * are wrapped in NullableType nodes. - * - * @param string|Name|Identifier|ComplexType $type The type to normalize - * - * @return Name|Identifier|ComplexType The normalized type - */ - public static function normalizeType($type) { - if (!is_string($type)) { - if ( - !$type instanceof Name && !$type instanceof Identifier && - !$type instanceof ComplexType - ) { - throw new \LogicException( - 'Type must be a string, or an instance of Name, Identifier or ComplexType' - ); - } - return $type; - } - - $nullable = false; - if (strlen($type) > 0 && $type[0] === '?') { - $nullable = true; - $type = substr($type, 1); - } - - $builtinTypes = [ - 'array', - 'callable', - 'bool', - 'int', - 'float', - 'string', - 'iterable', - 'void', - 'object', - 'null', - 'false', - 'mixed', - 'never', - 'true', - ]; - - $lowerType = strtolower($type); - if (in_array($lowerType, $builtinTypes)) { - $type = new Identifier($lowerType); - } else { - $type = self::normalizeName($type); - } - - $notNullableTypes = [ - 'void', 'mixed', 'never', - ]; - if ($nullable && in_array((string) $type, $notNullableTypes)) { - throw new \LogicException(sprintf('%s type cannot be nullable', $type)); - } - - return $nullable ? new NullableType($type) : $type; - } - - /** - * Normalizes a value: Converts nulls, booleans, integers, - * floats, strings and arrays into their respective nodes - * - * @param Node\Expr|bool|null|int|float|string|array|\UnitEnum $value The value to normalize - * - * @return Expr The normalized value - */ - public static function normalizeValue($value) : Expr { - if ($value instanceof Node\Expr) { - return $value; - } - - if (is_null($value)) { - return new Expr\ConstFetch( - new Name('null') - ); - } - - if (is_bool($value)) { - return new Expr\ConstFetch( - new Name($value ? 'true' : 'false') - ); - } - - if (is_int($value)) { - return new Scalar\LNumber($value); - } - - if (is_float($value)) { - return new Scalar\DNumber($value); - } - - if (is_string($value)) { - return new Scalar\String_($value); - } - - if (is_array($value)) { - $items = []; - $lastKey = -1; - foreach ($value as $itemKey => $itemValue) { - // for consecutive, numeric keys don't generate keys - if (null !== $lastKey && ++$lastKey === $itemKey) { - $items[] = new Expr\ArrayItem( - self::normalizeValue($itemValue) - ); - } else { - $lastKey = null; - $items[] = new Expr\ArrayItem( - self::normalizeValue($itemValue), - self::normalizeValue($itemKey) - ); - } - } - - return new Expr\Array_($items); - } - - if ($value instanceof \UnitEnum) { - return new Expr\ClassConstFetch(new FullyQualified(\get_class($value)), new Identifier($value->name)); - } - - throw new \LogicException('Invalid value'); - } - - /** - * Normalizes a doc comment: Converts plain strings to PhpParser\Comment\Doc. - * - * @param Comment\Doc|string $docComment The doc comment to normalize - * - * @return Comment\Doc The normalized doc comment - */ - public static function normalizeDocComment($docComment) : Comment\Doc { - if ($docComment instanceof Comment\Doc) { - return $docComment; - } - - if (is_string($docComment)) { - return new Comment\Doc($docComment); - } - - throw new \LogicException('Doc comment must be a string or an instance of PhpParser\Comment\Doc'); - } - - /** - * Normalizes a attribute: Converts attribute to the Attribute Group if needed. - * - * @param Node\Attribute|Node\AttributeGroup $attribute - * - * @return Node\AttributeGroup The Attribute Group - */ - public static function normalizeAttribute($attribute) : Node\AttributeGroup - { - if ($attribute instanceof Node\AttributeGroup) { - return $attribute; - } - - if (!($attribute instanceof Node\Attribute)) { - throw new \LogicException('Attribute must be an instance of PhpParser\Node\Attribute or PhpParser\Node\AttributeGroup'); - } - - return new Node\AttributeGroup([$attribute]); - } - - /** - * Adds a modifier and returns new modifier bitmask. - * - * @param int $modifiers Existing modifiers - * @param int $modifier Modifier to set - * - * @return int New modifiers - */ - public static function addModifier(int $modifiers, int $modifier) : int { - Stmt\Class_::verifyModifier($modifiers, $modifier); - return $modifiers | $modifier; - } - - /** - * Adds a modifier and returns new modifier bitmask. - * @return int New modifiers - */ - public static function addClassModifier(int $existingModifiers, int $modifierToSet) : int { - Stmt\Class_::verifyClassModifier($existingModifiers, $modifierToSet); - return $existingModifiers | $modifierToSet; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Comment.php b/vendor/nikic/php-parser/lib/PhpParser/Comment.php deleted file mode 100644 index 61e98d3..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Comment.php +++ /dev/null @@ -1,239 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser; - -class Comment implements \JsonSerializable -{ - protected $text; - protected $startLine; - protected $startFilePos; - protected $startTokenPos; - protected $endLine; - protected $endFilePos; - protected $endTokenPos; - - /** - * Constructs a comment node. - * - * @param string $text Comment text (including comment delimiters like /*) - * @param int $startLine Line number the comment started on - * @param int $startFilePos File offset the comment started on - * @param int $startTokenPos Token offset the comment started on - */ - public function __construct( - string $text, - int $startLine = -1, int $startFilePos = -1, int $startTokenPos = -1, - int $endLine = -1, int $endFilePos = -1, int $endTokenPos = -1 - ) { - $this->text = $text; - $this->startLine = $startLine; - $this->startFilePos = $startFilePos; - $this->startTokenPos = $startTokenPos; - $this->endLine = $endLine; - $this->endFilePos = $endFilePos; - $this->endTokenPos = $endTokenPos; - } - - /** - * Gets the comment text. - * - * @return string The comment text (including comment delimiters like /*) - */ - public function getText() : string { - return $this->text; - } - - /** - * Gets the line number the comment started on. - * - * @return int Line number (or -1 if not available) - */ - public function getStartLine() : int { - return $this->startLine; - } - - /** - * Gets the file offset the comment started on. - * - * @return int File offset (or -1 if not available) - */ - public function getStartFilePos() : int { - return $this->startFilePos; - } - - /** - * Gets the token offset the comment started on. - * - * @return int Token offset (or -1 if not available) - */ - public function getStartTokenPos() : int { - return $this->startTokenPos; - } - - /** - * Gets the line number the comment ends on. - * - * @return int Line number (or -1 if not available) - */ - public function getEndLine() : int { - return $this->endLine; - } - - /** - * Gets the file offset the comment ends on. - * - * @return int File offset (or -1 if not available) - */ - public function getEndFilePos() : int { - return $this->endFilePos; - } - - /** - * Gets the token offset the comment ends on. - * - * @return int Token offset (or -1 if not available) - */ - public function getEndTokenPos() : int { - return $this->endTokenPos; - } - - /** - * Gets the line number the comment started on. - * - * @deprecated Use getStartLine() instead - * - * @return int Line number - */ - public function getLine() : int { - return $this->startLine; - } - - /** - * Gets the file offset the comment started on. - * - * @deprecated Use getStartFilePos() instead - * - * @return int File offset - */ - public function getFilePos() : int { - return $this->startFilePos; - } - - /** - * Gets the token offset the comment started on. - * - * @deprecated Use getStartTokenPos() instead - * - * @return int Token offset - */ - public function getTokenPos() : int { - return $this->startTokenPos; - } - - /** - * Gets the comment text. - * - * @return string The comment text (including comment delimiters like /*) - */ - public function __toString() : string { - return $this->text; - } - - /** - * Gets the reformatted comment text. - * - * "Reformatted" here means that we try to clean up the whitespace at the - * starts of the lines. This is necessary because we receive the comments - * without trailing whitespace on the first line, but with trailing whitespace - * on all subsequent lines. - * - * @return mixed|string - */ - public function getReformattedText() { - $text = trim($this->text); - $newlinePos = strpos($text, "\n"); - if (false === $newlinePos) { - // Single line comments don't need further processing - return $text; - } elseif (preg_match('((*BSR_ANYCRLF)(*ANYCRLF)^.*(?:\R\s+\*.*)+$)', $text)) { - // Multi line comment of the type - // - // /* - // * Some text. - // * Some more text. - // */ - // - // is handled by replacing the whitespace sequences before the * by a single space - return preg_replace('(^\s+\*)m', ' *', $this->text); - } elseif (preg_match('(^/\*\*?\s*[\r\n])', $text) && preg_match('(\n(\s*)\*/$)', $text, $matches)) { - // Multi line comment of the type - // - // /* - // Some text. - // Some more text. - // */ - // - // is handled by removing the whitespace sequence on the line before the closing - // */ on all lines. So if the last line is " */", then " " is removed at the - // start of all lines. - return preg_replace('(^' . preg_quote($matches[1]) . ')m', '', $text); - } elseif (preg_match('(^/\*\*?\s*(?!\s))', $text, $matches)) { - // Multi line comment of the type - // - // /* Some text. - // Some more text. - // Indented text. - // Even more text. */ - // - // is handled by removing the difference between the shortest whitespace prefix on all - // lines and the length of the "/* " opening sequence. - $prefixLen = $this->getShortestWhitespacePrefixLen(substr($text, $newlinePos + 1)); - $removeLen = $prefixLen - strlen($matches[0]); - return preg_replace('(^\s{' . $removeLen . '})m', '', $text); - } - - // No idea how to format this comment, so simply return as is - return $text; - } - - /** - * Get length of shortest whitespace prefix (at the start of a line). - * - * If there is a line with no prefix whitespace, 0 is a valid return value. - * - * @param string $str String to check - * @return int Length in characters. Tabs count as single characters. - */ - private function getShortestWhitespacePrefixLen(string $str) : int { - $lines = explode("\n", $str); - $shortestPrefixLen = \INF; - foreach ($lines as $line) { - preg_match('(^\s*)', $line, $matches); - $prefixLen = strlen($matches[0]); - if ($prefixLen < $shortestPrefixLen) { - $shortestPrefixLen = $prefixLen; - } - } - return $shortestPrefixLen; - } - - /** - * @return array - * @psalm-return array{nodeType:string, text:mixed, line:mixed, filePos:mixed} - */ - public function jsonSerialize() : array { - // Technically not a node, but we make it look like one anyway - $type = $this instanceof Comment\Doc ? 'Comment_Doc' : 'Comment'; - return [ - 'nodeType' => $type, - 'text' => $this->text, - // TODO: Rename these to include "start". - 'line' => $this->startLine, - 'filePos' => $this->startFilePos, - 'tokenPos' => $this->startTokenPos, - 'endLine' => $this->endLine, - 'endFilePos' => $this->endFilePos, - 'endTokenPos' => $this->endTokenPos, - ]; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Comment/Doc.php b/vendor/nikic/php-parser/lib/PhpParser/Comment/Doc.php deleted file mode 100644 index a9db612..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Comment/Doc.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Comment; - -class Doc extends \PhpParser\Comment -{ -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.php b/vendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.php deleted file mode 100644 index 49c92d5..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.php +++ /dev/null @@ -1,6 +0,0 @@ -<?php - -namespace PhpParser; - -class ConstExprEvaluationException extends \Exception -{} diff --git a/vendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluator.php b/vendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluator.php deleted file mode 100644 index ceb3f11..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluator.php +++ /dev/null @@ -1,229 +0,0 @@ -<?php - -namespace PhpParser; - -use function array_merge; -use PhpParser\Node\Expr; -use PhpParser\Node\Scalar; - -/** - * Evaluates constant expressions. - * - * This evaluator is able to evaluate all constant expressions (as defined by PHP), which can be - * evaluated without further context. If a subexpression is not of this type, a user-provided - * fallback evaluator is invoked. To support all constant expressions that are also supported by - * PHP (and not already handled by this class), the fallback evaluator must be able to handle the - * following node types: - * - * * All Scalar\MagicConst\* nodes. - * * Expr\ConstFetch nodes. Only null/false/true are already handled by this class. - * * Expr\ClassConstFetch nodes. - * - * The fallback evaluator should throw ConstExprEvaluationException for nodes it cannot evaluate. - * - * The evaluation is dependent on runtime configuration in two respects: Firstly, floating - * point to string conversions are affected by the precision ini setting. Secondly, they are also - * affected by the LC_NUMERIC locale. - */ -class ConstExprEvaluator -{ - private $fallbackEvaluator; - - /** - * Create a constant expression evaluator. - * - * The provided fallback evaluator is invoked whenever a subexpression cannot be evaluated. See - * class doc comment for more information. - * - * @param callable|null $fallbackEvaluator To call if subexpression cannot be evaluated - */ - public function __construct(?callable $fallbackEvaluator = null) { - $this->fallbackEvaluator = $fallbackEvaluator ?? function(Expr $expr) { - throw new ConstExprEvaluationException( - "Expression of type {$expr->getType()} cannot be evaluated" - ); - }; - } - - /** - * Silently evaluates a constant expression into a PHP value. - * - * Thrown Errors, warnings or notices will be converted into a ConstExprEvaluationException. - * The original source of the exception is available through getPrevious(). - * - * If some part of the expression cannot be evaluated, the fallback evaluator passed to the - * constructor will be invoked. By default, if no fallback is provided, an exception of type - * ConstExprEvaluationException is thrown. - * - * See class doc comment for caveats and limitations. - * - * @param Expr $expr Constant expression to evaluate - * @return mixed Result of evaluation - * - * @throws ConstExprEvaluationException if the expression cannot be evaluated or an error occurred - */ - public function evaluateSilently(Expr $expr) { - set_error_handler(function($num, $str, $file, $line) { - throw new \ErrorException($str, 0, $num, $file, $line); - }); - - try { - return $this->evaluate($expr); - } catch (\Throwable $e) { - if (!$e instanceof ConstExprEvaluationException) { - $e = new ConstExprEvaluationException( - "An error occurred during constant expression evaluation", 0, $e); - } - throw $e; - } finally { - restore_error_handler(); - } - } - - /** - * Directly evaluates a constant expression into a PHP value. - * - * May generate Error exceptions, warnings or notices. Use evaluateSilently() to convert these - * into a ConstExprEvaluationException. - * - * If some part of the expression cannot be evaluated, the fallback evaluator passed to the - * constructor will be invoked. By default, if no fallback is provided, an exception of type - * ConstExprEvaluationException is thrown. - * - * See class doc comment for caveats and limitations. - * - * @param Expr $expr Constant expression to evaluate - * @return mixed Result of evaluation - * - * @throws ConstExprEvaluationException if the expression cannot be evaluated - */ - public function evaluateDirectly(Expr $expr) { - return $this->evaluate($expr); - } - - private function evaluate(Expr $expr) { - if ($expr instanceof Scalar\LNumber - || $expr instanceof Scalar\DNumber - || $expr instanceof Scalar\String_ - ) { - return $expr->value; - } - - if ($expr instanceof Expr\Array_) { - return $this->evaluateArray($expr); - } - - // Unary operators - if ($expr instanceof Expr\UnaryPlus) { - return +$this->evaluate($expr->expr); - } - if ($expr instanceof Expr\UnaryMinus) { - return -$this->evaluate($expr->expr); - } - if ($expr instanceof Expr\BooleanNot) { - return !$this->evaluate($expr->expr); - } - if ($expr instanceof Expr\BitwiseNot) { - return ~$this->evaluate($expr->expr); - } - - if ($expr instanceof Expr\BinaryOp) { - return $this->evaluateBinaryOp($expr); - } - - if ($expr instanceof Expr\Ternary) { - return $this->evaluateTernary($expr); - } - - if ($expr instanceof Expr\ArrayDimFetch && null !== $expr->dim) { - return $this->evaluate($expr->var)[$this->evaluate($expr->dim)]; - } - - if ($expr instanceof Expr\ConstFetch) { - return $this->evaluateConstFetch($expr); - } - - return ($this->fallbackEvaluator)($expr); - } - - private function evaluateArray(Expr\Array_ $expr) { - $array = []; - foreach ($expr->items as $item) { - if (null !== $item->key) { - $array[$this->evaluate($item->key)] = $this->evaluate($item->value); - } elseif ($item->unpack) { - $array = array_merge($array, $this->evaluate($item->value)); - } else { - $array[] = $this->evaluate($item->value); - } - } - return $array; - } - - private function evaluateTernary(Expr\Ternary $expr) { - if (null === $expr->if) { - return $this->evaluate($expr->cond) ?: $this->evaluate($expr->else); - } - - return $this->evaluate($expr->cond) - ? $this->evaluate($expr->if) - : $this->evaluate($expr->else); - } - - private function evaluateBinaryOp(Expr\BinaryOp $expr) { - if ($expr instanceof Expr\BinaryOp\Coalesce - && $expr->left instanceof Expr\ArrayDimFetch - ) { - // This needs to be special cased to respect BP_VAR_IS fetch semantics - return $this->evaluate($expr->left->var)[$this->evaluate($expr->left->dim)] - ?? $this->evaluate($expr->right); - } - - // The evaluate() calls are repeated in each branch, because some of the operators are - // short-circuiting and evaluating the RHS in advance may be illegal in that case - $l = $expr->left; - $r = $expr->right; - switch ($expr->getOperatorSigil()) { - case '&': return $this->evaluate($l) & $this->evaluate($r); - case '|': return $this->evaluate($l) | $this->evaluate($r); - case '^': return $this->evaluate($l) ^ $this->evaluate($r); - case '&&': return $this->evaluate($l) && $this->evaluate($r); - case '||': return $this->evaluate($l) || $this->evaluate($r); - case '??': return $this->evaluate($l) ?? $this->evaluate($r); - case '.': return $this->evaluate($l) . $this->evaluate($r); - case '/': return $this->evaluate($l) / $this->evaluate($r); - case '==': return $this->evaluate($l) == $this->evaluate($r); - case '>': return $this->evaluate($l) > $this->evaluate($r); - case '>=': return $this->evaluate($l) >= $this->evaluate($r); - case '===': return $this->evaluate($l) === $this->evaluate($r); - case 'and': return $this->evaluate($l) and $this->evaluate($r); - case 'or': return $this->evaluate($l) or $this->evaluate($r); - case 'xor': return $this->evaluate($l) xor $this->evaluate($r); - case '-': return $this->evaluate($l) - $this->evaluate($r); - case '%': return $this->evaluate($l) % $this->evaluate($r); - case '*': return $this->evaluate($l) * $this->evaluate($r); - case '!=': return $this->evaluate($l) != $this->evaluate($r); - case '!==': return $this->evaluate($l) !== $this->evaluate($r); - case '+': return $this->evaluate($l) + $this->evaluate($r); - case '**': return $this->evaluate($l) ** $this->evaluate($r); - case '<<': return $this->evaluate($l) << $this->evaluate($r); - case '>>': return $this->evaluate($l) >> $this->evaluate($r); - case '<': return $this->evaluate($l) < $this->evaluate($r); - case '<=': return $this->evaluate($l) <= $this->evaluate($r); - case '<=>': return $this->evaluate($l) <=> $this->evaluate($r); - } - - throw new \Exception('Should not happen'); - } - - private function evaluateConstFetch(Expr\ConstFetch $expr) { - $name = $expr->name->toLowerString(); - switch ($name) { - case 'null': return null; - case 'false': return false; - case 'true': return true; - } - - return ($this->fallbackEvaluator)($expr); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Error.php b/vendor/nikic/php-parser/lib/PhpParser/Error.php deleted file mode 100644 index d1fb959..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Error.php +++ /dev/null @@ -1,180 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser; - -class Error extends \RuntimeException -{ - protected $rawMessage; - protected $attributes; - - /** - * Creates an Exception signifying a parse error. - * - * @param string $message Error message - * @param array|int $attributes Attributes of node/token where error occurred - * (or start line of error -- deprecated) - */ - public function __construct(string $message, $attributes = []) { - $this->rawMessage = $message; - if (is_array($attributes)) { - $this->attributes = $attributes; - } else { - $this->attributes = ['startLine' => $attributes]; - } - $this->updateMessage(); - } - - /** - * Gets the error message - * - * @return string Error message - */ - public function getRawMessage() : string { - return $this->rawMessage; - } - - /** - * Gets the line the error starts in. - * - * @return int Error start line - */ - public function getStartLine() : int { - return $this->attributes['startLine'] ?? -1; - } - - /** - * Gets the line the error ends in. - * - * @return int Error end line - */ - public function getEndLine() : int { - return $this->attributes['endLine'] ?? -1; - } - - /** - * Gets the attributes of the node/token the error occurred at. - * - * @return array - */ - public function getAttributes() : array { - return $this->attributes; - } - - /** - * Sets the attributes of the node/token the error occurred at. - * - * @param array $attributes - */ - public function setAttributes(array $attributes) { - $this->attributes = $attributes; - $this->updateMessage(); - } - - /** - * Sets the line of the PHP file the error occurred in. - * - * @param string $message Error message - */ - public function setRawMessage(string $message) { - $this->rawMessage = $message; - $this->updateMessage(); - } - - /** - * Sets the line the error starts in. - * - * @param int $line Error start line - */ - public function setStartLine(int $line) { - $this->attributes['startLine'] = $line; - $this->updateMessage(); - } - - /** - * Returns whether the error has start and end column information. - * - * For column information enable the startFilePos and endFilePos in the lexer options. - * - * @return bool - */ - public function hasColumnInfo() : bool { - return isset($this->attributes['startFilePos'], $this->attributes['endFilePos']); - } - - /** - * Gets the start column (1-based) into the line where the error started. - * - * @param string $code Source code of the file - * @return int - */ - public function getStartColumn(string $code) : int { - if (!$this->hasColumnInfo()) { - throw new \RuntimeException('Error does not have column information'); - } - - return $this->toColumn($code, $this->attributes['startFilePos']); - } - - /** - * Gets the end column (1-based) into the line where the error ended. - * - * @param string $code Source code of the file - * @return int - */ - public function getEndColumn(string $code) : int { - if (!$this->hasColumnInfo()) { - throw new \RuntimeException('Error does not have column information'); - } - - return $this->toColumn($code, $this->attributes['endFilePos']); - } - - /** - * Formats message including line and column information. - * - * @param string $code Source code associated with the error, for calculation of the columns - * - * @return string Formatted message - */ - public function getMessageWithColumnInfo(string $code) : string { - return sprintf( - '%s from %d:%d to %d:%d', $this->getRawMessage(), - $this->getStartLine(), $this->getStartColumn($code), - $this->getEndLine(), $this->getEndColumn($code) - ); - } - - /** - * Converts a file offset into a column. - * - * @param string $code Source code that $pos indexes into - * @param int $pos 0-based position in $code - * - * @return int 1-based column (relative to start of line) - */ - private function toColumn(string $code, int $pos) : int { - if ($pos > strlen($code)) { - throw new \RuntimeException('Invalid position information'); - } - - $lineStartPos = strrpos($code, "\n", $pos - strlen($code)); - if (false === $lineStartPos) { - $lineStartPos = -1; - } - - return $pos - $lineStartPos; - } - - /** - * Updates the exception message after a change to rawMessage or rawLine. - */ - protected function updateMessage() { - $this->message = $this->rawMessage; - - if (-1 === $this->getStartLine()) { - $this->message .= ' on unknown line'; - } else { - $this->message .= ' on line ' . $this->getStartLine(); - } - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler.php b/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler.php deleted file mode 100644 index d620e74..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler.php +++ /dev/null @@ -1,13 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser; - -interface ErrorHandler -{ - /** - * Handle an error generated during lexing, parsing or some other operation. - * - * @param Error $error The error that needs to be handled - */ - public function handleError(Error $error); -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php b/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php deleted file mode 100644 index 784b61b..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php +++ /dev/null @@ -1,46 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\ErrorHandler; - -use PhpParser\Error; -use PhpParser\ErrorHandler; - -/** - * Error handler that collects all errors into an array. - * - * This allows graceful handling of errors. - */ -class Collecting implements ErrorHandler -{ - /** @var Error[] Collected errors */ - private $errors = []; - - public function handleError(Error $error) { - $this->errors[] = $error; - } - - /** - * Get collected errors. - * - * @return Error[] - */ - public function getErrors() : array { - return $this->errors; - } - - /** - * Check whether there are any errors. - * - * @return bool - */ - public function hasErrors() : bool { - return !empty($this->errors); - } - - /** - * Reset/clear collected errors. - */ - public function clearErrors() { - $this->errors = []; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php b/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php deleted file mode 100644 index aeee989..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php +++ /dev/null @@ -1,18 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\ErrorHandler; - -use PhpParser\Error; -use PhpParser\ErrorHandler; - -/** - * Error handler that handles all errors by throwing them. - * - * This is the default strategy used by all components. - */ -class Throwing implements ErrorHandler -{ - public function handleError(Error $error) { - throw $error; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php b/vendor/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php deleted file mode 100644 index a38b57b..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Internal; - -/** - * @internal - */ -class DiffElem -{ - const TYPE_KEEP = 0; - const TYPE_REMOVE = 1; - const TYPE_ADD = 2; - const TYPE_REPLACE = 3; - - /** @var int One of the TYPE_* constants */ - public $type; - /** @var mixed Is null for add operations */ - public $old; - /** @var mixed Is null for remove operations */ - public $new; - - public function __construct(int $type, $old, $new) { - $this->type = $type; - $this->old = $old; - $this->new = $new; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Internal/Differ.php b/vendor/nikic/php-parser/lib/PhpParser/Internal/Differ.php deleted file mode 100644 index 7f218c7..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Internal/Differ.php +++ /dev/null @@ -1,164 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Internal; - -/** - * Implements the Myers diff algorithm. - * - * Myers, Eugene W. "An O (ND) difference algorithm and its variations." - * Algorithmica 1.1 (1986): 251-266. - * - * @internal - */ -class Differ -{ - private $isEqual; - - /** - * Create differ over the given equality relation. - * - * @param callable $isEqual Equality relation with signature function($a, $b) : bool - */ - public function __construct(callable $isEqual) { - $this->isEqual = $isEqual; - } - - /** - * Calculate diff (edit script) from $old to $new. - * - * @param array $old Original array - * @param array $new New array - * - * @return DiffElem[] Diff (edit script) - */ - public function diff(array $old, array $new) { - list($trace, $x, $y) = $this->calculateTrace($old, $new); - return $this->extractDiff($trace, $x, $y, $old, $new); - } - - /** - * Calculate diff, including "replace" operations. - * - * If a sequence of remove operations is followed by the same number of add operations, these - * will be coalesced into replace operations. - * - * @param array $old Original array - * @param array $new New array - * - * @return DiffElem[] Diff (edit script), including replace operations - */ - public function diffWithReplacements(array $old, array $new) { - return $this->coalesceReplacements($this->diff($old, $new)); - } - - private function calculateTrace(array $a, array $b) { - $n = \count($a); - $m = \count($b); - $max = $n + $m; - $v = [1 => 0]; - $trace = []; - for ($d = 0; $d <= $max; $d++) { - $trace[] = $v; - for ($k = -$d; $k <= $d; $k += 2) { - if ($k === -$d || ($k !== $d && $v[$k-1] < $v[$k+1])) { - $x = $v[$k+1]; - } else { - $x = $v[$k-1] + 1; - } - - $y = $x - $k; - while ($x < $n && $y < $m && ($this->isEqual)($a[$x], $b[$y])) { - $x++; - $y++; - } - - $v[$k] = $x; - if ($x >= $n && $y >= $m) { - return [$trace, $x, $y]; - } - } - } - throw new \Exception('Should not happen'); - } - - private function extractDiff(array $trace, int $x, int $y, array $a, array $b) { - $result = []; - for ($d = \count($trace) - 1; $d >= 0; $d--) { - $v = $trace[$d]; - $k = $x - $y; - - if ($k === -$d || ($k !== $d && $v[$k-1] < $v[$k+1])) { - $prevK = $k + 1; - } else { - $prevK = $k - 1; - } - - $prevX = $v[$prevK]; - $prevY = $prevX - $prevK; - - while ($x > $prevX && $y > $prevY) { - $result[] = new DiffElem(DiffElem::TYPE_KEEP, $a[$x-1], $b[$y-1]); - $x--; - $y--; - } - - if ($d === 0) { - break; - } - - while ($x > $prevX) { - $result[] = new DiffElem(DiffElem::TYPE_REMOVE, $a[$x-1], null); - $x--; - } - - while ($y > $prevY) { - $result[] = new DiffElem(DiffElem::TYPE_ADD, null, $b[$y-1]); - $y--; - } - } - return array_reverse($result); - } - - /** - * Coalesce equal-length sequences of remove+add into a replace operation. - * - * @param DiffElem[] $diff - * @return DiffElem[] - */ - private function coalesceReplacements(array $diff) { - $newDiff = []; - $c = \count($diff); - for ($i = 0; $i < $c; $i++) { - $diffType = $diff[$i]->type; - if ($diffType !== DiffElem::TYPE_REMOVE) { - $newDiff[] = $diff[$i]; - continue; - } - - $j = $i; - while ($j < $c && $diff[$j]->type === DiffElem::TYPE_REMOVE) { - $j++; - } - - $k = $j; - while ($k < $c && $diff[$k]->type === DiffElem::TYPE_ADD) { - $k++; - } - - if ($j - $i === $k - $j) { - $len = $j - $i; - for ($n = 0; $n < $len; $n++) { - $newDiff[] = new DiffElem( - DiffElem::TYPE_REPLACE, $diff[$i + $n]->old, $diff[$j + $n]->new - ); - } - } else { - for (; $i < $k; $i++) { - $newDiff[] = $diff[$i]; - } - } - $i = $k - 1; - } - return $newDiff; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php b/vendor/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php deleted file mode 100644 index fc276ec..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php +++ /dev/null @@ -1,64 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Internal; - -use PhpParser\Node; -use PhpParser\Node\Expr; - -/** - * This node is used internally by the format-preserving pretty printer to print anonymous classes. - * - * The normal anonymous class structure violates assumptions about the order of token offsets. - * Namely, the constructor arguments are part of the Expr\New_ node and follow the class node, even - * though they are actually interleaved with them. This special node type is used temporarily to - * restore a sane token offset order. - * - * @internal - */ -class PrintableNewAnonClassNode extends Expr -{ - /** @var Node\AttributeGroup[] PHP attribute groups */ - public $attrGroups; - /** @var int Modifiers */ - public $flags; - /** @var Node\Arg[] Arguments */ - public $args; - /** @var null|Node\Name Name of extended class */ - public $extends; - /** @var Node\Name[] Names of implemented interfaces */ - public $implements; - /** @var Node\Stmt[] Statements */ - public $stmts; - - public function __construct( - array $attrGroups, int $flags, array $args, ?Node\Name $extends, array $implements, - array $stmts, array $attributes - ) { - parent::__construct($attributes); - $this->attrGroups = $attrGroups; - $this->flags = $flags; - $this->args = $args; - $this->extends = $extends; - $this->implements = $implements; - $this->stmts = $stmts; - } - - public static function fromNewNode(Expr\New_ $newNode) { - $class = $newNode->class; - assert($class instanceof Node\Stmt\Class_); - // We don't assert that $class->name is null here, to allow consumers to assign unique names - // to anonymous classes for their own purposes. We simplify ignore the name here. - return new self( - $class->attrGroups, $class->flags, $newNode->args, $class->extends, $class->implements, - $class->stmts, $newNode->getAttributes() - ); - } - - public function getType() : string { - return 'Expr_PrintableNewAnonClass'; - } - - public function getSubNodeNames() : array { - return ['attrGroups', 'flags', 'args', 'extends', 'implements', 'stmts']; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php b/vendor/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php deleted file mode 100644 index 7e0a5de..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php +++ /dev/null @@ -1,286 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Internal; - -/** - * Provides operations on token streams, for use by pretty printer. - * - * @internal - */ -class TokenStream -{ - /** @var array Tokens (in token_get_all format) */ - private $tokens; - /** @var int[] Map from position to indentation */ - private $indentMap; - - /** - * Create token stream instance. - * - * @param array $tokens Tokens in token_get_all() format - */ - public function __construct(array $tokens) { - $this->tokens = $tokens; - $this->indentMap = $this->calcIndentMap(); - } - - /** - * Whether the given position is immediately surrounded by parenthesis. - * - * @param int $startPos Start position - * @param int $endPos End position - * - * @return bool - */ - public function haveParens(int $startPos, int $endPos) : bool { - return $this->haveTokenImmediatelyBefore($startPos, '(') - && $this->haveTokenImmediatelyAfter($endPos, ')'); - } - - /** - * Whether the given position is immediately surrounded by braces. - * - * @param int $startPos Start position - * @param int $endPos End position - * - * @return bool - */ - public function haveBraces(int $startPos, int $endPos) : bool { - return ($this->haveTokenImmediatelyBefore($startPos, '{') - || $this->haveTokenImmediatelyBefore($startPos, T_CURLY_OPEN)) - && $this->haveTokenImmediatelyAfter($endPos, '}'); - } - - /** - * Check whether the position is directly preceded by a certain token type. - * - * During this check whitespace and comments are skipped. - * - * @param int $pos Position before which the token should occur - * @param int|string $expectedTokenType Token to check for - * - * @return bool Whether the expected token was found - */ - public function haveTokenImmediatelyBefore(int $pos, $expectedTokenType) : bool { - $tokens = $this->tokens; - $pos--; - for (; $pos >= 0; $pos--) { - $tokenType = $tokens[$pos][0]; - if ($tokenType === $expectedTokenType) { - return true; - } - if ($tokenType !== \T_WHITESPACE - && $tokenType !== \T_COMMENT && $tokenType !== \T_DOC_COMMENT) { - break; - } - } - return false; - } - - /** - * Check whether the position is directly followed by a certain token type. - * - * During this check whitespace and comments are skipped. - * - * @param int $pos Position after which the token should occur - * @param int|string $expectedTokenType Token to check for - * - * @return bool Whether the expected token was found - */ - public function haveTokenImmediatelyAfter(int $pos, $expectedTokenType) : bool { - $tokens = $this->tokens; - $pos++; - for (; $pos < \count($tokens); $pos++) { - $tokenType = $tokens[$pos][0]; - if ($tokenType === $expectedTokenType) { - return true; - } - if ($tokenType !== \T_WHITESPACE - && $tokenType !== \T_COMMENT && $tokenType !== \T_DOC_COMMENT) { - break; - } - } - return false; - } - - public function skipLeft(int $pos, $skipTokenType) { - $tokens = $this->tokens; - - $pos = $this->skipLeftWhitespace($pos); - if ($skipTokenType === \T_WHITESPACE) { - return $pos; - } - - if ($tokens[$pos][0] !== $skipTokenType) { - // Shouldn't happen. The skip token MUST be there - throw new \Exception('Encountered unexpected token'); - } - $pos--; - - return $this->skipLeftWhitespace($pos); - } - - public function skipRight(int $pos, $skipTokenType) { - $tokens = $this->tokens; - - $pos = $this->skipRightWhitespace($pos); - if ($skipTokenType === \T_WHITESPACE) { - return $pos; - } - - if ($tokens[$pos][0] !== $skipTokenType) { - // Shouldn't happen. The skip token MUST be there - throw new \Exception('Encountered unexpected token'); - } - $pos++; - - return $this->skipRightWhitespace($pos); - } - - /** - * Return first non-whitespace token position smaller or equal to passed position. - * - * @param int $pos Token position - * @return int Non-whitespace token position - */ - public function skipLeftWhitespace(int $pos) { - $tokens = $this->tokens; - for (; $pos >= 0; $pos--) { - $type = $tokens[$pos][0]; - if ($type !== \T_WHITESPACE && $type !== \T_COMMENT && $type !== \T_DOC_COMMENT) { - break; - } - } - return $pos; - } - - /** - * Return first non-whitespace position greater or equal to passed position. - * - * @param int $pos Token position - * @return int Non-whitespace token position - */ - public function skipRightWhitespace(int $pos) { - $tokens = $this->tokens; - for ($count = \count($tokens); $pos < $count; $pos++) { - $type = $tokens[$pos][0]; - if ($type !== \T_WHITESPACE && $type !== \T_COMMENT && $type !== \T_DOC_COMMENT) { - break; - } - } - return $pos; - } - - public function findRight(int $pos, $findTokenType) { - $tokens = $this->tokens; - for ($count = \count($tokens); $pos < $count; $pos++) { - $type = $tokens[$pos][0]; - if ($type === $findTokenType) { - return $pos; - } - } - return -1; - } - - /** - * Whether the given position range contains a certain token type. - * - * @param int $startPos Starting position (inclusive) - * @param int $endPos Ending position (exclusive) - * @param int|string $tokenType Token type to look for - * @return bool Whether the token occurs in the given range - */ - public function haveTokenInRange(int $startPos, int $endPos, $tokenType) { - $tokens = $this->tokens; - for ($pos = $startPos; $pos < $endPos; $pos++) { - if ($tokens[$pos][0] === $tokenType) { - return true; - } - } - return false; - } - - public function haveBracesInRange(int $startPos, int $endPos) { - return $this->haveTokenInRange($startPos, $endPos, '{') - || $this->haveTokenInRange($startPos, $endPos, T_CURLY_OPEN) - || $this->haveTokenInRange($startPos, $endPos, '}'); - } - - public function haveTagInRange(int $startPos, int $endPos): bool { - return $this->haveTokenInRange($startPos, $endPos, \T_OPEN_TAG) - || $this->haveTokenInRange($startPos, $endPos, \T_CLOSE_TAG); - } - - /** - * Get indentation before token position. - * - * @param int $pos Token position - * - * @return int Indentation depth (in spaces) - */ - public function getIndentationBefore(int $pos) : int { - return $this->indentMap[$pos]; - } - - /** - * Get the code corresponding to a token offset range, optionally adjusted for indentation. - * - * @param int $from Token start position (inclusive) - * @param int $to Token end position (exclusive) - * @param int $indent By how much the code should be indented (can be negative as well) - * - * @return string Code corresponding to token range, adjusted for indentation - */ - public function getTokenCode(int $from, int $to, int $indent) : string { - $tokens = $this->tokens; - $result = ''; - for ($pos = $from; $pos < $to; $pos++) { - $token = $tokens[$pos]; - if (\is_array($token)) { - $type = $token[0]; - $content = $token[1]; - if ($type === \T_CONSTANT_ENCAPSED_STRING || $type === \T_ENCAPSED_AND_WHITESPACE) { - $result .= $content; - } else { - // TODO Handle non-space indentation - if ($indent < 0) { - $result .= str_replace("\n" . str_repeat(" ", -$indent), "\n", $content); - } elseif ($indent > 0) { - $result .= str_replace("\n", "\n" . str_repeat(" ", $indent), $content); - } else { - $result .= $content; - } - } - } else { - $result .= $token; - } - } - return $result; - } - - /** - * Precalculate the indentation at every token position. - * - * @return int[] Token position to indentation map - */ - private function calcIndentMap() { - $indentMap = []; - $indent = 0; - foreach ($this->tokens as $token) { - $indentMap[] = $indent; - - if ($token[0] === \T_WHITESPACE) { - $content = $token[1]; - $newlinePos = \strrpos($content, "\n"); - if (false !== $newlinePos) { - $indent = \strlen($content) - $newlinePos - 1; - } - } - } - - // Add a sentinel for one past end of the file - $indentMap[] = $indent; - - return $indentMap; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/JsonDecoder.php b/vendor/nikic/php-parser/lib/PhpParser/JsonDecoder.php deleted file mode 100644 index 47d2003..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/JsonDecoder.php +++ /dev/null @@ -1,103 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser; - -class JsonDecoder -{ - /** @var \ReflectionClass[] Node type to reflection class map */ - private $reflectionClassCache; - - public function decode(string $json) { - $value = json_decode($json, true); - if (json_last_error()) { - throw new \RuntimeException('JSON decoding error: ' . json_last_error_msg()); - } - - return $this->decodeRecursive($value); - } - - private function decodeRecursive($value) { - if (\is_array($value)) { - if (isset($value['nodeType'])) { - if ($value['nodeType'] === 'Comment' || $value['nodeType'] === 'Comment_Doc') { - return $this->decodeComment($value); - } - return $this->decodeNode($value); - } - return $this->decodeArray($value); - } - return $value; - } - - private function decodeArray(array $array) : array { - $decodedArray = []; - foreach ($array as $key => $value) { - $decodedArray[$key] = $this->decodeRecursive($value); - } - return $decodedArray; - } - - private function decodeNode(array $value) : Node { - $nodeType = $value['nodeType']; - if (!\is_string($nodeType)) { - throw new \RuntimeException('Node type must be a string'); - } - - $reflectionClass = $this->reflectionClassFromNodeType($nodeType); - /** @var Node $node */ - $node = $reflectionClass->newInstanceWithoutConstructor(); - - if (isset($value['attributes'])) { - if (!\is_array($value['attributes'])) { - throw new \RuntimeException('Attributes must be an array'); - } - - $node->setAttributes($this->decodeArray($value['attributes'])); - } - - foreach ($value as $name => $subNode) { - if ($name === 'nodeType' || $name === 'attributes') { - continue; - } - - $node->$name = $this->decodeRecursive($subNode); - } - - return $node; - } - - private function decodeComment(array $value) : Comment { - $className = $value['nodeType'] === 'Comment' ? Comment::class : Comment\Doc::class; - if (!isset($value['text'])) { - throw new \RuntimeException('Comment must have text'); - } - - return new $className( - $value['text'], - $value['line'] ?? -1, $value['filePos'] ?? -1, $value['tokenPos'] ?? -1, - $value['endLine'] ?? -1, $value['endFilePos'] ?? -1, $value['endTokenPos'] ?? -1 - ); - } - - private function reflectionClassFromNodeType(string $nodeType) : \ReflectionClass { - if (!isset($this->reflectionClassCache[$nodeType])) { - $className = $this->classNameFromNodeType($nodeType); - $this->reflectionClassCache[$nodeType] = new \ReflectionClass($className); - } - return $this->reflectionClassCache[$nodeType]; - } - - private function classNameFromNodeType(string $nodeType) : string { - $className = 'PhpParser\\Node\\' . strtr($nodeType, '_', '\\'); - if (class_exists($className)) { - return $className; - } - - $className .= '_'; - if (class_exists($className)) { - return $className; - } - - throw new \RuntimeException("Unknown node type \"$nodeType\""); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Lexer.php b/vendor/nikic/php-parser/lib/PhpParser/Lexer.php deleted file mode 100644 index 60b809b..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Lexer.php +++ /dev/null @@ -1,560 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser; - -use PhpParser\Parser\Tokens; - -class Lexer -{ - protected $code; - protected $tokens; - protected $pos; - protected $line; - protected $filePos; - protected $prevCloseTagHasNewline; - - protected $tokenMap; - protected $dropTokens; - protected $identifierTokens; - - private $attributeStartLineUsed; - private $attributeEndLineUsed; - private $attributeStartTokenPosUsed; - private $attributeEndTokenPosUsed; - private $attributeStartFilePosUsed; - private $attributeEndFilePosUsed; - private $attributeCommentsUsed; - - /** - * Creates a Lexer. - * - * @param array $options Options array. Currently only the 'usedAttributes' option is supported, - * which is an array of attributes to add to the AST nodes. Possible - * attributes are: 'comments', 'startLine', 'endLine', 'startTokenPos', - * 'endTokenPos', 'startFilePos', 'endFilePos'. The option defaults to the - * first three. For more info see getNextToken() docs. - */ - public function __construct(array $options = []) { - // Create Map from internal tokens to PhpParser tokens. - $this->defineCompatibilityTokens(); - $this->tokenMap = $this->createTokenMap(); - $this->identifierTokens = $this->createIdentifierTokenMap(); - - // map of tokens to drop while lexing (the map is only used for isset lookup, - // that's why the value is simply set to 1; the value is never actually used.) - $this->dropTokens = array_fill_keys( - [\T_WHITESPACE, \T_OPEN_TAG, \T_COMMENT, \T_DOC_COMMENT, \T_BAD_CHARACTER], 1 - ); - - $defaultAttributes = ['comments', 'startLine', 'endLine']; - $usedAttributes = array_fill_keys($options['usedAttributes'] ?? $defaultAttributes, true); - - // Create individual boolean properties to make these checks faster. - $this->attributeStartLineUsed = isset($usedAttributes['startLine']); - $this->attributeEndLineUsed = isset($usedAttributes['endLine']); - $this->attributeStartTokenPosUsed = isset($usedAttributes['startTokenPos']); - $this->attributeEndTokenPosUsed = isset($usedAttributes['endTokenPos']); - $this->attributeStartFilePosUsed = isset($usedAttributes['startFilePos']); - $this->attributeEndFilePosUsed = isset($usedAttributes['endFilePos']); - $this->attributeCommentsUsed = isset($usedAttributes['comments']); - } - - /** - * Initializes the lexer for lexing the provided source code. - * - * This function does not throw if lexing errors occur. Instead, errors may be retrieved using - * the getErrors() method. - * - * @param string $code The source code to lex - * @param ErrorHandler|null $errorHandler Error handler to use for lexing errors. Defaults to - * ErrorHandler\Throwing - */ - public function startLexing(string $code, ?ErrorHandler $errorHandler = null) { - if (null === $errorHandler) { - $errorHandler = new ErrorHandler\Throwing(); - } - - $this->code = $code; // keep the code around for __halt_compiler() handling - $this->pos = -1; - $this->line = 1; - $this->filePos = 0; - - // If inline HTML occurs without preceding code, treat it as if it had a leading newline. - // This ensures proper composability, because having a newline is the "safe" assumption. - $this->prevCloseTagHasNewline = true; - - $scream = ini_set('xdebug.scream', '0'); - - $this->tokens = @token_get_all($code); - $this->postprocessTokens($errorHandler); - - if (false !== $scream) { - ini_set('xdebug.scream', $scream); - } - } - - private function handleInvalidCharacterRange($start, $end, $line, ErrorHandler $errorHandler) { - $tokens = []; - for ($i = $start; $i < $end; $i++) { - $chr = $this->code[$i]; - if ($chr === "\0") { - // PHP cuts error message after null byte, so need special case - $errorMsg = 'Unexpected null byte'; - } else { - $errorMsg = sprintf( - 'Unexpected character "%s" (ASCII %d)', $chr, ord($chr) - ); - } - - $tokens[] = [\T_BAD_CHARACTER, $chr, $line]; - $errorHandler->handleError(new Error($errorMsg, [ - 'startLine' => $line, - 'endLine' => $line, - 'startFilePos' => $i, - 'endFilePos' => $i, - ])); - } - return $tokens; - } - - /** - * Check whether comment token is unterminated. - * - * @return bool - */ - private function isUnterminatedComment($token) : bool { - return ($token[0] === \T_COMMENT || $token[0] === \T_DOC_COMMENT) - && substr($token[1], 0, 2) === '/*' - && substr($token[1], -2) !== '*/'; - } - - protected function postprocessTokens(ErrorHandler $errorHandler) { - // PHP's error handling for token_get_all() is rather bad, so if we want detailed - // error information we need to compute it ourselves. Invalid character errors are - // detected by finding "gaps" in the token array. Unterminated comments are detected - // by checking if a trailing comment has a "*/" at the end. - // - // Additionally, we perform a number of canonicalizations here: - // * Use the PHP 8.0 comment format, which does not include trailing whitespace anymore. - // * Use PHP 8.0 T_NAME_* tokens. - // * Use PHP 8.1 T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG and - // T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG tokens used to disambiguate intersection types. - - $filePos = 0; - $line = 1; - $numTokens = \count($this->tokens); - for ($i = 0; $i < $numTokens; $i++) { - $token = $this->tokens[$i]; - - // Since PHP 7.4 invalid characters are represented by a T_BAD_CHARACTER token. - // In this case we only need to emit an error. - if ($token[0] === \T_BAD_CHARACTER) { - $this->handleInvalidCharacterRange($filePos, $filePos + 1, $line, $errorHandler); - } - - if ($token[0] === \T_COMMENT && substr($token[1], 0, 2) !== '/*' - && preg_match('/(\r\n|\n|\r)$/D', $token[1], $matches)) { - $trailingNewline = $matches[0]; - $token[1] = substr($token[1], 0, -strlen($trailingNewline)); - $this->tokens[$i] = $token; - if (isset($this->tokens[$i + 1]) && $this->tokens[$i + 1][0] === \T_WHITESPACE) { - // Move trailing newline into following T_WHITESPACE token, if it already exists. - $this->tokens[$i + 1][1] = $trailingNewline . $this->tokens[$i + 1][1]; - $this->tokens[$i + 1][2]--; - } else { - // Otherwise, we need to create a new T_WHITESPACE token. - array_splice($this->tokens, $i + 1, 0, [ - [\T_WHITESPACE, $trailingNewline, $line], - ]); - $numTokens++; - } - } - - // Emulate PHP 8 T_NAME_* tokens, by combining sequences of T_NS_SEPARATOR and T_STRING - // into a single token. - if (\is_array($token) - && ($token[0] === \T_NS_SEPARATOR || isset($this->identifierTokens[$token[0]]))) { - $lastWasSeparator = $token[0] === \T_NS_SEPARATOR; - $text = $token[1]; - for ($j = $i + 1; isset($this->tokens[$j]); $j++) { - if ($lastWasSeparator) { - if (!isset($this->identifierTokens[$this->tokens[$j][0]])) { - break; - } - $lastWasSeparator = false; - } else { - if ($this->tokens[$j][0] !== \T_NS_SEPARATOR) { - break; - } - $lastWasSeparator = true; - } - $text .= $this->tokens[$j][1]; - } - if ($lastWasSeparator) { - // Trailing separator is not part of the name. - $j--; - $text = substr($text, 0, -1); - } - if ($j > $i + 1) { - if ($token[0] === \T_NS_SEPARATOR) { - $type = \T_NAME_FULLY_QUALIFIED; - } else if ($token[0] === \T_NAMESPACE) { - $type = \T_NAME_RELATIVE; - } else { - $type = \T_NAME_QUALIFIED; - } - $token = [$type, $text, $line]; - array_splice($this->tokens, $i, $j - $i, [$token]); - $numTokens -= $j - $i - 1; - } - } - - if ($token === '&') { - $next = $i + 1; - while (isset($this->tokens[$next]) && $this->tokens[$next][0] === \T_WHITESPACE) { - $next++; - } - $followedByVarOrVarArg = isset($this->tokens[$next]) && - ($this->tokens[$next][0] === \T_VARIABLE || $this->tokens[$next][0] === \T_ELLIPSIS); - $this->tokens[$i] = $token = [ - $followedByVarOrVarArg - ? \T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG - : \T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG, - '&', - $line, - ]; - } - - $tokenValue = \is_string($token) ? $token : $token[1]; - $tokenLen = \strlen($tokenValue); - - if (substr($this->code, $filePos, $tokenLen) !== $tokenValue) { - // Something is missing, must be an invalid character - $nextFilePos = strpos($this->code, $tokenValue, $filePos); - $badCharTokens = $this->handleInvalidCharacterRange( - $filePos, $nextFilePos, $line, $errorHandler); - $filePos = (int) $nextFilePos; - - array_splice($this->tokens, $i, 0, $badCharTokens); - $numTokens += \count($badCharTokens); - $i += \count($badCharTokens); - } - - $filePos += $tokenLen; - $line += substr_count($tokenValue, "\n"); - } - - if ($filePos !== \strlen($this->code)) { - if (substr($this->code, $filePos, 2) === '/*') { - // Unlike PHP, HHVM will drop unterminated comments entirely - $comment = substr($this->code, $filePos); - $errorHandler->handleError(new Error('Unterminated comment', [ - 'startLine' => $line, - 'endLine' => $line + substr_count($comment, "\n"), - 'startFilePos' => $filePos, - 'endFilePos' => $filePos + \strlen($comment), - ])); - - // Emulate the PHP behavior - $isDocComment = isset($comment[3]) && $comment[3] === '*'; - $this->tokens[] = [$isDocComment ? \T_DOC_COMMENT : \T_COMMENT, $comment, $line]; - } else { - // Invalid characters at the end of the input - $badCharTokens = $this->handleInvalidCharacterRange( - $filePos, \strlen($this->code), $line, $errorHandler); - $this->tokens = array_merge($this->tokens, $badCharTokens); - } - return; - } - - if (count($this->tokens) > 0) { - // Check for unterminated comment - $lastToken = $this->tokens[count($this->tokens) - 1]; - if ($this->isUnterminatedComment($lastToken)) { - $errorHandler->handleError(new Error('Unterminated comment', [ - 'startLine' => $line - substr_count($lastToken[1], "\n"), - 'endLine' => $line, - 'startFilePos' => $filePos - \strlen($lastToken[1]), - 'endFilePos' => $filePos, - ])); - } - } - } - - /** - * Fetches the next token. - * - * The available attributes are determined by the 'usedAttributes' option, which can - * be specified in the constructor. The following attributes are supported: - * - * * 'comments' => Array of PhpParser\Comment or PhpParser\Comment\Doc instances, - * representing all comments that occurred between the previous - * non-discarded token and the current one. - * * 'startLine' => Line in which the node starts. - * * 'endLine' => Line in which the node ends. - * * 'startTokenPos' => Offset into the token array of the first token in the node. - * * 'endTokenPos' => Offset into the token array of the last token in the node. - * * 'startFilePos' => Offset into the code string of the first character that is part of the node. - * * 'endFilePos' => Offset into the code string of the last character that is part of the node. - * - * @param mixed $value Variable to store token content in - * @param mixed $startAttributes Variable to store start attributes in - * @param mixed $endAttributes Variable to store end attributes in - * - * @return int Token id - */ - public function getNextToken(&$value = null, &$startAttributes = null, &$endAttributes = null) : int { - $startAttributes = []; - $endAttributes = []; - - while (1) { - if (isset($this->tokens[++$this->pos])) { - $token = $this->tokens[$this->pos]; - } else { - // EOF token with ID 0 - $token = "\0"; - } - - if ($this->attributeStartLineUsed) { - $startAttributes['startLine'] = $this->line; - } - if ($this->attributeStartTokenPosUsed) { - $startAttributes['startTokenPos'] = $this->pos; - } - if ($this->attributeStartFilePosUsed) { - $startAttributes['startFilePos'] = $this->filePos; - } - - if (\is_string($token)) { - $value = $token; - if (isset($token[1])) { - // bug in token_get_all - $this->filePos += 2; - $id = ord('"'); - } else { - $this->filePos += 1; - $id = ord($token); - } - } elseif (!isset($this->dropTokens[$token[0]])) { - $value = $token[1]; - $id = $this->tokenMap[$token[0]]; - if (\T_CLOSE_TAG === $token[0]) { - $this->prevCloseTagHasNewline = false !== strpos($token[1], "\n") - || false !== strpos($token[1], "\r"); - } elseif (\T_INLINE_HTML === $token[0]) { - $startAttributes['hasLeadingNewline'] = $this->prevCloseTagHasNewline; - } - - $this->line += substr_count($value, "\n"); - $this->filePos += \strlen($value); - } else { - $origLine = $this->line; - $origFilePos = $this->filePos; - $this->line += substr_count($token[1], "\n"); - $this->filePos += \strlen($token[1]); - - if (\T_COMMENT === $token[0] || \T_DOC_COMMENT === $token[0]) { - if ($this->attributeCommentsUsed) { - $comment = \T_DOC_COMMENT === $token[0] - ? new Comment\Doc($token[1], - $origLine, $origFilePos, $this->pos, - $this->line, $this->filePos - 1, $this->pos) - : new Comment($token[1], - $origLine, $origFilePos, $this->pos, - $this->line, $this->filePos - 1, $this->pos); - $startAttributes['comments'][] = $comment; - } - } - continue; - } - - if ($this->attributeEndLineUsed) { - $endAttributes['endLine'] = $this->line; - } - if ($this->attributeEndTokenPosUsed) { - $endAttributes['endTokenPos'] = $this->pos; - } - if ($this->attributeEndFilePosUsed) { - $endAttributes['endFilePos'] = $this->filePos - 1; - } - - return $id; - } - - throw new \RuntimeException('Reached end of lexer loop'); - } - - /** - * Returns the token array for current code. - * - * The token array is in the same format as provided by the - * token_get_all() function and does not discard tokens (i.e. - * whitespace and comments are included). The token position - * attributes are against this token array. - * - * @return array Array of tokens in token_get_all() format - */ - public function getTokens() : array { - return $this->tokens; - } - - /** - * Handles __halt_compiler() by returning the text after it. - * - * @return string Remaining text - */ - public function handleHaltCompiler() : string { - // text after T_HALT_COMPILER, still including (); - $textAfter = substr($this->code, $this->filePos); - - // ensure that it is followed by (); - // this simplifies the situation, by not allowing any comments - // in between of the tokens. - if (!preg_match('~^\s*\(\s*\)\s*(?:;|\?>\r?\n?)~', $textAfter, $matches)) { - throw new Error('__HALT_COMPILER must be followed by "();"'); - } - - // prevent the lexer from returning any further tokens - $this->pos = count($this->tokens); - - // return with (); removed - return substr($textAfter, strlen($matches[0])); - } - - private function defineCompatibilityTokens() { - static $compatTokensDefined = false; - if ($compatTokensDefined) { - return; - } - - $compatTokens = [ - // PHP 7.4 - 'T_BAD_CHARACTER', - 'T_FN', - 'T_COALESCE_EQUAL', - // PHP 8.0 - 'T_NAME_QUALIFIED', - 'T_NAME_FULLY_QUALIFIED', - 'T_NAME_RELATIVE', - 'T_MATCH', - 'T_NULLSAFE_OBJECT_OPERATOR', - 'T_ATTRIBUTE', - // PHP 8.1 - 'T_ENUM', - 'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG', - 'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG', - 'T_READONLY', - ]; - - // PHP-Parser might be used together with another library that also emulates some or all - // of these tokens. Perform a sanity-check that all already defined tokens have been - // assigned a unique ID. - $usedTokenIds = []; - foreach ($compatTokens as $token) { - if (\defined($token)) { - $tokenId = \constant($token); - $clashingToken = $usedTokenIds[$tokenId] ?? null; - if ($clashingToken !== null) { - throw new \Error(sprintf( - 'Token %s has same ID as token %s, ' . - 'you may be using a library with broken token emulation', - $token, $clashingToken - )); - } - $usedTokenIds[$tokenId] = $token; - } - } - - // Now define any tokens that have not yet been emulated. Try to assign IDs from -1 - // downwards, but skip any IDs that may already be in use. - $newTokenId = -1; - foreach ($compatTokens as $token) { - if (!\defined($token)) { - while (isset($usedTokenIds[$newTokenId])) { - $newTokenId--; - } - \define($token, $newTokenId); - $newTokenId--; - } - } - - $compatTokensDefined = true; - } - - /** - * Creates the token map. - * - * The token map maps the PHP internal token identifiers - * to the identifiers used by the Parser. Additionally it - * maps T_OPEN_TAG_WITH_ECHO to T_ECHO and T_CLOSE_TAG to ';'. - * - * @return array The token map - */ - protected function createTokenMap() : array { - $tokenMap = []; - - // 256 is the minimum possible token number, as everything below - // it is an ASCII value - for ($i = 256; $i < 1000; ++$i) { - if (\T_DOUBLE_COLON === $i) { - // T_DOUBLE_COLON is equivalent to T_PAAMAYIM_NEKUDOTAYIM - $tokenMap[$i] = Tokens::T_PAAMAYIM_NEKUDOTAYIM; - } elseif(\T_OPEN_TAG_WITH_ECHO === $i) { - // T_OPEN_TAG_WITH_ECHO with dropped T_OPEN_TAG results in T_ECHO - $tokenMap[$i] = Tokens::T_ECHO; - } elseif(\T_CLOSE_TAG === $i) { - // T_CLOSE_TAG is equivalent to ';' - $tokenMap[$i] = ord(';'); - } elseif ('UNKNOWN' !== $name = token_name($i)) { - if ('T_HASHBANG' === $name) { - // HHVM uses a special token for #! hashbang lines - $tokenMap[$i] = Tokens::T_INLINE_HTML; - } elseif (defined($name = Tokens::class . '::' . $name)) { - // Other tokens can be mapped directly - $tokenMap[$i] = constant($name); - } - } - } - - // HHVM uses a special token for numbers that overflow to double - if (defined('T_ONUMBER')) { - $tokenMap[\T_ONUMBER] = Tokens::T_DNUMBER; - } - // HHVM also has a separate token for the __COMPILER_HALT_OFFSET__ constant - if (defined('T_COMPILER_HALT_OFFSET')) { - $tokenMap[\T_COMPILER_HALT_OFFSET] = Tokens::T_STRING; - } - - // Assign tokens for which we define compatibility constants, as token_name() does not know them. - $tokenMap[\T_FN] = Tokens::T_FN; - $tokenMap[\T_COALESCE_EQUAL] = Tokens::T_COALESCE_EQUAL; - $tokenMap[\T_NAME_QUALIFIED] = Tokens::T_NAME_QUALIFIED; - $tokenMap[\T_NAME_FULLY_QUALIFIED] = Tokens::T_NAME_FULLY_QUALIFIED; - $tokenMap[\T_NAME_RELATIVE] = Tokens::T_NAME_RELATIVE; - $tokenMap[\T_MATCH] = Tokens::T_MATCH; - $tokenMap[\T_NULLSAFE_OBJECT_OPERATOR] = Tokens::T_NULLSAFE_OBJECT_OPERATOR; - $tokenMap[\T_ATTRIBUTE] = Tokens::T_ATTRIBUTE; - $tokenMap[\T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG] = Tokens::T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG; - $tokenMap[\T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG] = Tokens::T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG; - $tokenMap[\T_ENUM] = Tokens::T_ENUM; - $tokenMap[\T_READONLY] = Tokens::T_READONLY; - - return $tokenMap; - } - - private function createIdentifierTokenMap(): array { - // Based on semi_reserved production. - return array_fill_keys([ - \T_STRING, - \T_STATIC, \T_ABSTRACT, \T_FINAL, \T_PRIVATE, \T_PROTECTED, \T_PUBLIC, \T_READONLY, - \T_INCLUDE, \T_INCLUDE_ONCE, \T_EVAL, \T_REQUIRE, \T_REQUIRE_ONCE, \T_LOGICAL_OR, \T_LOGICAL_XOR, \T_LOGICAL_AND, - \T_INSTANCEOF, \T_NEW, \T_CLONE, \T_EXIT, \T_IF, \T_ELSEIF, \T_ELSE, \T_ENDIF, \T_ECHO, \T_DO, \T_WHILE, - \T_ENDWHILE, \T_FOR, \T_ENDFOR, \T_FOREACH, \T_ENDFOREACH, \T_DECLARE, \T_ENDDECLARE, \T_AS, \T_TRY, \T_CATCH, - \T_FINALLY, \T_THROW, \T_USE, \T_INSTEADOF, \T_GLOBAL, \T_VAR, \T_UNSET, \T_ISSET, \T_EMPTY, \T_CONTINUE, \T_GOTO, - \T_FUNCTION, \T_CONST, \T_RETURN, \T_PRINT, \T_YIELD, \T_LIST, \T_SWITCH, \T_ENDSWITCH, \T_CASE, \T_DEFAULT, - \T_BREAK, \T_ARRAY, \T_CALLABLE, \T_EXTENDS, \T_IMPLEMENTS, \T_NAMESPACE, \T_TRAIT, \T_INTERFACE, \T_CLASS, - \T_CLASS_C, \T_TRAIT_C, \T_FUNC_C, \T_METHOD_C, \T_LINE, \T_FILE, \T_DIR, \T_NS_C, \T_HALT_COMPILER, \T_FN, - \T_MATCH, - ], true); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php b/vendor/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php deleted file mode 100644 index a0e781d..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php +++ /dev/null @@ -1,251 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Lexer; - -use PhpParser\Error; -use PhpParser\ErrorHandler; -use PhpParser\Lexer; -use PhpParser\Lexer\TokenEmulator\AttributeEmulator; -use PhpParser\Lexer\TokenEmulator\EnumTokenEmulator; -use PhpParser\Lexer\TokenEmulator\CoaleseEqualTokenEmulator; -use PhpParser\Lexer\TokenEmulator\ExplicitOctalEmulator; -use PhpParser\Lexer\TokenEmulator\FlexibleDocStringEmulator; -use PhpParser\Lexer\TokenEmulator\FnTokenEmulator; -use PhpParser\Lexer\TokenEmulator\MatchTokenEmulator; -use PhpParser\Lexer\TokenEmulator\NullsafeTokenEmulator; -use PhpParser\Lexer\TokenEmulator\NumericLiteralSeparatorEmulator; -use PhpParser\Lexer\TokenEmulator\ReadonlyFunctionTokenEmulator; -use PhpParser\Lexer\TokenEmulator\ReadonlyTokenEmulator; -use PhpParser\Lexer\TokenEmulator\ReverseEmulator; -use PhpParser\Lexer\TokenEmulator\TokenEmulator; - -class Emulative extends Lexer -{ - const PHP_7_3 = '7.3dev'; - const PHP_7_4 = '7.4dev'; - const PHP_8_0 = '8.0dev'; - const PHP_8_1 = '8.1dev'; - const PHP_8_2 = '8.2dev'; - - /** @var mixed[] Patches used to reverse changes introduced in the code */ - private $patches = []; - - /** @var TokenEmulator[] */ - private $emulators = []; - - /** @var string */ - private $targetPhpVersion; - - /** - * @param mixed[] $options Lexer options. In addition to the usual options, - * accepts a 'phpVersion' string that specifies the - * version to emulate. Defaults to newest supported. - */ - public function __construct(array $options = []) - { - $this->targetPhpVersion = $options['phpVersion'] ?? Emulative::PHP_8_2; - unset($options['phpVersion']); - - parent::__construct($options); - - $emulators = [ - new FlexibleDocStringEmulator(), - new FnTokenEmulator(), - new MatchTokenEmulator(), - new CoaleseEqualTokenEmulator(), - new NumericLiteralSeparatorEmulator(), - new NullsafeTokenEmulator(), - new AttributeEmulator(), - new EnumTokenEmulator(), - new ReadonlyTokenEmulator(), - new ExplicitOctalEmulator(), - new ReadonlyFunctionTokenEmulator(), - ]; - - // Collect emulators that are relevant for the PHP version we're running - // and the PHP version we're targeting for emulation. - foreach ($emulators as $emulator) { - $emulatorPhpVersion = $emulator->getPhpVersion(); - if ($this->isForwardEmulationNeeded($emulatorPhpVersion)) { - $this->emulators[] = $emulator; - } else if ($this->isReverseEmulationNeeded($emulatorPhpVersion)) { - $this->emulators[] = new ReverseEmulator($emulator); - } - } - } - - public function startLexing(string $code, ?ErrorHandler $errorHandler = null) { - $emulators = array_filter($this->emulators, function($emulator) use($code) { - return $emulator->isEmulationNeeded($code); - }); - - if (empty($emulators)) { - // Nothing to emulate, yay - parent::startLexing($code, $errorHandler); - return; - } - - $this->patches = []; - foreach ($emulators as $emulator) { - $code = $emulator->preprocessCode($code, $this->patches); - } - - $collector = new ErrorHandler\Collecting(); - parent::startLexing($code, $collector); - $this->sortPatches(); - $this->fixupTokens(); - - $errors = $collector->getErrors(); - if (!empty($errors)) { - $this->fixupErrors($errors); - foreach ($errors as $error) { - $errorHandler->handleError($error); - } - } - - foreach ($emulators as $emulator) { - $this->tokens = $emulator->emulate($code, $this->tokens); - } - } - - private function isForwardEmulationNeeded(string $emulatorPhpVersion): bool { - return version_compare(\PHP_VERSION, $emulatorPhpVersion, '<') - && version_compare($this->targetPhpVersion, $emulatorPhpVersion, '>='); - } - - private function isReverseEmulationNeeded(string $emulatorPhpVersion): bool { - return version_compare(\PHP_VERSION, $emulatorPhpVersion, '>=') - && version_compare($this->targetPhpVersion, $emulatorPhpVersion, '<'); - } - - private function sortPatches() - { - // Patches may be contributed by different emulators. - // Make sure they are sorted by increasing patch position. - usort($this->patches, function($p1, $p2) { - return $p1[0] <=> $p2[0]; - }); - } - - private function fixupTokens() - { - if (\count($this->patches) === 0) { - return; - } - - // Load first patch - $patchIdx = 0; - - list($patchPos, $patchType, $patchText) = $this->patches[$patchIdx]; - - // We use a manual loop over the tokens, because we modify the array on the fly - $pos = 0; - for ($i = 0, $c = \count($this->tokens); $i < $c; $i++) { - $token = $this->tokens[$i]; - if (\is_string($token)) { - if ($patchPos === $pos) { - // Only support replacement for string tokens. - assert($patchType === 'replace'); - $this->tokens[$i] = $patchText; - - // Fetch the next patch - $patchIdx++; - if ($patchIdx >= \count($this->patches)) { - // No more patches, we're done - return; - } - list($patchPos, $patchType, $patchText) = $this->patches[$patchIdx]; - } - - $pos += \strlen($token); - continue; - } - - $len = \strlen($token[1]); - $posDelta = 0; - while ($patchPos >= $pos && $patchPos < $pos + $len) { - $patchTextLen = \strlen($patchText); - if ($patchType === 'remove') { - if ($patchPos === $pos && $patchTextLen === $len) { - // Remove token entirely - array_splice($this->tokens, $i, 1, []); - $i--; - $c--; - } else { - // Remove from token string - $this->tokens[$i][1] = substr_replace( - $token[1], '', $patchPos - $pos + $posDelta, $patchTextLen - ); - $posDelta -= $patchTextLen; - } - } elseif ($patchType === 'add') { - // Insert into the token string - $this->tokens[$i][1] = substr_replace( - $token[1], $patchText, $patchPos - $pos + $posDelta, 0 - ); - $posDelta += $patchTextLen; - } else if ($patchType === 'replace') { - // Replace inside the token string - $this->tokens[$i][1] = substr_replace( - $token[1], $patchText, $patchPos - $pos + $posDelta, $patchTextLen - ); - } else { - assert(false); - } - - // Fetch the next patch - $patchIdx++; - if ($patchIdx >= \count($this->patches)) { - // No more patches, we're done - return; - } - - list($patchPos, $patchType, $patchText) = $this->patches[$patchIdx]; - - // Multiple patches may apply to the same token. Reload the current one to check - // If the new patch applies - $token = $this->tokens[$i]; - } - - $pos += $len; - } - - // A patch did not apply - assert(false); - } - - /** - * Fixup line and position information in errors. - * - * @param Error[] $errors - */ - private function fixupErrors(array $errors) { - foreach ($errors as $error) { - $attrs = $error->getAttributes(); - - $posDelta = 0; - $lineDelta = 0; - foreach ($this->patches as $patch) { - list($patchPos, $patchType, $patchText) = $patch; - if ($patchPos >= $attrs['startFilePos']) { - // No longer relevant - break; - } - - if ($patchType === 'add') { - $posDelta += strlen($patchText); - $lineDelta += substr_count($patchText, "\n"); - } else if ($patchType === 'remove') { - $posDelta -= strlen($patchText); - $lineDelta -= substr_count($patchText, "\n"); - } - } - - $attrs['startFilePos'] += $posDelta; - $attrs['endFilePos'] += $posDelta; - $attrs['startLine'] += $lineDelta; - $attrs['endLine'] += $lineDelta; - $error->setAttributes($attrs); - } - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php b/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php deleted file mode 100644 index 6776a51..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php +++ /dev/null @@ -1,56 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Lexer\TokenEmulator; - -use PhpParser\Lexer\Emulative; - -final class AttributeEmulator extends TokenEmulator -{ - public function getPhpVersion(): string - { - return Emulative::PHP_8_0; - } - - public function isEmulationNeeded(string $code) : bool - { - return strpos($code, '#[') !== false; - } - - public function emulate(string $code, array $tokens): array - { - // We need to manually iterate and manage a count because we'll change - // the tokens array on the way. - $line = 1; - for ($i = 0, $c = count($tokens); $i < $c; ++$i) { - if ($tokens[$i] === '#' && isset($tokens[$i + 1]) && $tokens[$i + 1] === '[') { - array_splice($tokens, $i, 2, [ - [\T_ATTRIBUTE, '#[', $line] - ]); - $c--; - continue; - } - if (\is_array($tokens[$i])) { - $line += substr_count($tokens[$i][1], "\n"); - } - } - - return $tokens; - } - - public function reverseEmulate(string $code, array $tokens): array - { - // TODO - return $tokens; - } - - public function preprocessCode(string $code, array &$patches): string { - $pos = 0; - while (false !== $pos = strpos($code, '#[', $pos)) { - // Replace #[ with %[ - $code[$pos] = '%'; - $patches[] = [$pos, 'replace', '#']; - $pos += 2; - } - return $code; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/CoaleseEqualTokenEmulator.php b/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/CoaleseEqualTokenEmulator.php deleted file mode 100644 index d91da92..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/CoaleseEqualTokenEmulator.php +++ /dev/null @@ -1,47 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Lexer\TokenEmulator; - -use PhpParser\Lexer\Emulative; - -final class CoaleseEqualTokenEmulator extends TokenEmulator -{ - public function getPhpVersion(): string - { - return Emulative::PHP_7_4; - } - - public function isEmulationNeeded(string $code): bool - { - return strpos($code, '??=') !== false; - } - - public function emulate(string $code, array $tokens): array - { - // We need to manually iterate and manage a count because we'll change - // the tokens array on the way - $line = 1; - for ($i = 0, $c = count($tokens); $i < $c; ++$i) { - if (isset($tokens[$i + 1])) { - if ($tokens[$i][0] === T_COALESCE && $tokens[$i + 1] === '=') { - array_splice($tokens, $i, 2, [ - [\T_COALESCE_EQUAL, '??=', $line] - ]); - $c--; - continue; - } - } - if (\is_array($tokens[$i])) { - $line += substr_count($tokens[$i][1], "\n"); - } - } - - return $tokens; - } - - public function reverseEmulate(string $code, array $tokens): array - { - // ??= was not valid code previously, don't bother. - return $tokens; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/EnumTokenEmulator.php b/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/EnumTokenEmulator.php deleted file mode 100644 index 4ddc0b1..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/EnumTokenEmulator.php +++ /dev/null @@ -1,31 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Lexer\TokenEmulator; - -use PhpParser\Lexer\Emulative; - -final class EnumTokenEmulator extends KeywordEmulator -{ - public function getPhpVersion(): string - { - return Emulative::PHP_8_1; - } - - public function getKeywordString(): string - { - return 'enum'; - } - - public function getKeywordToken(): int - { - return \T_ENUM; - } - - protected function isKeywordContext(array $tokens, int $pos): bool - { - return parent::isKeywordContext($tokens, $pos) - && isset($tokens[$pos + 2]) - && $tokens[$pos + 1][0] === \T_WHITESPACE - && $tokens[$pos + 2][0] === \T_STRING; - } -} \ No newline at end of file diff --git a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ExplicitOctalEmulator.php b/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ExplicitOctalEmulator.php deleted file mode 100644 index f5f6805..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ExplicitOctalEmulator.php +++ /dev/null @@ -1,44 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Lexer\TokenEmulator; - -use PhpParser\Lexer\Emulative; - -class ExplicitOctalEmulator extends TokenEmulator { - public function getPhpVersion(): string { - return Emulative::PHP_8_1; - } - - public function isEmulationNeeded(string $code): bool { - return strpos($code, '0o') !== false || strpos($code, '0O') !== false; - } - - public function emulate(string $code, array $tokens): array { - for ($i = 0, $c = count($tokens); $i < $c; ++$i) { - if ($tokens[$i][0] == \T_LNUMBER && $tokens[$i][1] === '0' && - isset($tokens[$i + 1]) && $tokens[$i + 1][0] == \T_STRING && - preg_match('/[oO][0-7]+(?:_[0-7]+)*/', $tokens[$i + 1][1]) - ) { - $tokenKind = $this->resolveIntegerOrFloatToken($tokens[$i + 1][1]); - array_splice($tokens, $i, 2, [ - [$tokenKind, '0' . $tokens[$i + 1][1], $tokens[$i][2]], - ]); - $c--; - } - } - return $tokens; - } - - private function resolveIntegerOrFloatToken(string $str): int - { - $str = substr($str, 1); - $str = str_replace('_', '', $str); - $num = octdec($str); - return is_float($num) ? \T_DNUMBER : \T_LNUMBER; - } - - public function reverseEmulate(string $code, array $tokens): array { - // Explicit octals were not legal code previously, don't bother. - return $tokens; - } -} \ No newline at end of file diff --git a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FlexibleDocStringEmulator.php b/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FlexibleDocStringEmulator.php deleted file mode 100644 index c15d627..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FlexibleDocStringEmulator.php +++ /dev/null @@ -1,76 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Lexer\TokenEmulator; - -use PhpParser\Lexer\Emulative; - -final class FlexibleDocStringEmulator extends TokenEmulator -{ - const FLEXIBLE_DOC_STRING_REGEX = <<<'REGEX' -/<<<[ \t]*(['"]?)([a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*)\1\r?\n -(?:.*\r?\n)*? -(?<indentation>\h*)\2(?![a-zA-Z0-9_\x80-\xff])(?<separator>(?:;?[\r\n])?)/x -REGEX; - - public function getPhpVersion(): string - { - return Emulative::PHP_7_3; - } - - public function isEmulationNeeded(string $code) : bool - { - return strpos($code, '<<<') !== false; - } - - public function emulate(string $code, array $tokens): array - { - // Handled by preprocessing + fixup. - return $tokens; - } - - public function reverseEmulate(string $code, array $tokens): array - { - // Not supported. - return $tokens; - } - - public function preprocessCode(string $code, array &$patches): string { - if (!preg_match_all(self::FLEXIBLE_DOC_STRING_REGEX, $code, $matches, PREG_SET_ORDER|PREG_OFFSET_CAPTURE)) { - // No heredoc/nowdoc found - return $code; - } - - // Keep track of how much we need to adjust string offsets due to the modifications we - // already made - $posDelta = 0; - foreach ($matches as $match) { - $indentation = $match['indentation'][0]; - $indentationStart = $match['indentation'][1]; - - $separator = $match['separator'][0]; - $separatorStart = $match['separator'][1]; - - if ($indentation === '' && $separator !== '') { - // Ordinary heredoc/nowdoc - continue; - } - - if ($indentation !== '') { - // Remove indentation - $indentationLen = strlen($indentation); - $code = substr_replace($code, '', $indentationStart + $posDelta, $indentationLen); - $patches[] = [$indentationStart + $posDelta, 'add', $indentation]; - $posDelta -= $indentationLen; - } - - if ($separator === '') { - // Insert newline as separator - $code = substr_replace($code, "\n", $separatorStart + $posDelta, 0); - $patches[] = [$separatorStart + $posDelta, 'remove', "\n"]; - $posDelta += 1; - } - } - - return $code; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php b/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php deleted file mode 100644 index eb7e496..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php +++ /dev/null @@ -1,23 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Lexer\TokenEmulator; - -use PhpParser\Lexer\Emulative; - -final class FnTokenEmulator extends KeywordEmulator -{ - public function getPhpVersion(): string - { - return Emulative::PHP_7_4; - } - - public function getKeywordString(): string - { - return 'fn'; - } - - public function getKeywordToken(): int - { - return \T_FN; - } -} \ No newline at end of file diff --git a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/KeywordEmulator.php b/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/KeywordEmulator.php deleted file mode 100644 index f8e8362..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/KeywordEmulator.php +++ /dev/null @@ -1,62 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Lexer\TokenEmulator; - -abstract class KeywordEmulator extends TokenEmulator -{ - abstract function getKeywordString(): string; - abstract function getKeywordToken(): int; - - public function isEmulationNeeded(string $code): bool - { - return strpos(strtolower($code), $this->getKeywordString()) !== false; - } - - protected function isKeywordContext(array $tokens, int $pos): bool - { - $previousNonSpaceToken = $this->getPreviousNonSpaceToken($tokens, $pos); - return $previousNonSpaceToken === null || $previousNonSpaceToken[0] !== \T_OBJECT_OPERATOR; - } - - public function emulate(string $code, array $tokens): array - { - $keywordString = $this->getKeywordString(); - foreach ($tokens as $i => $token) { - if ($token[0] === T_STRING && strtolower($token[1]) === $keywordString - && $this->isKeywordContext($tokens, $i)) { - $tokens[$i][0] = $this->getKeywordToken(); - } - } - - return $tokens; - } - - /** - * @param mixed[] $tokens - * @return array|string|null - */ - private function getPreviousNonSpaceToken(array $tokens, int $start) - { - for ($i = $start - 1; $i >= 0; --$i) { - if ($tokens[$i][0] === T_WHITESPACE) { - continue; - } - - return $tokens[$i]; - } - - return null; - } - - public function reverseEmulate(string $code, array $tokens): array - { - $keywordToken = $this->getKeywordToken(); - foreach ($tokens as $i => $token) { - if ($token[0] === $keywordToken) { - $tokens[$i][0] = \T_STRING; - } - } - - return $tokens; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php b/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php deleted file mode 100644 index 902a46d..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php +++ /dev/null @@ -1,23 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Lexer\TokenEmulator; - -use PhpParser\Lexer\Emulative; - -final class MatchTokenEmulator extends KeywordEmulator -{ - public function getPhpVersion(): string - { - return Emulative::PHP_8_0; - } - - public function getKeywordString(): string - { - return 'match'; - } - - public function getKeywordToken(): int - { - return \T_MATCH; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NullsafeTokenEmulator.php b/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NullsafeTokenEmulator.php deleted file mode 100644 index 1a29c67..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NullsafeTokenEmulator.php +++ /dev/null @@ -1,67 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Lexer\TokenEmulator; - -use PhpParser\Lexer\Emulative; - -final class NullsafeTokenEmulator extends TokenEmulator -{ - public function getPhpVersion(): string - { - return Emulative::PHP_8_0; - } - - public function isEmulationNeeded(string $code): bool - { - return strpos($code, '?->') !== false; - } - - public function emulate(string $code, array $tokens): array - { - // We need to manually iterate and manage a count because we'll change - // the tokens array on the way - $line = 1; - for ($i = 0, $c = count($tokens); $i < $c; ++$i) { - if ($tokens[$i] === '?' && isset($tokens[$i + 1]) && $tokens[$i + 1][0] === \T_OBJECT_OPERATOR) { - array_splice($tokens, $i, 2, [ - [\T_NULLSAFE_OBJECT_OPERATOR, '?->', $line] - ]); - $c--; - continue; - } - - // Handle ?-> inside encapsed string. - if ($tokens[$i][0] === \T_ENCAPSED_AND_WHITESPACE && isset($tokens[$i - 1]) - && $tokens[$i - 1][0] === \T_VARIABLE - && preg_match('/^\?->([a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*)/', $tokens[$i][1], $matches) - ) { - $replacement = [ - [\T_NULLSAFE_OBJECT_OPERATOR, '?->', $line], - [\T_STRING, $matches[1], $line], - ]; - if (\strlen($matches[0]) !== \strlen($tokens[$i][1])) { - $replacement[] = [ - \T_ENCAPSED_AND_WHITESPACE, - \substr($tokens[$i][1], \strlen($matches[0])), - $line - ]; - } - array_splice($tokens, $i, 1, $replacement); - $c += \count($replacement) - 1; - continue; - } - - if (\is_array($tokens[$i])) { - $line += substr_count($tokens[$i][1], "\n"); - } - } - - return $tokens; - } - - public function reverseEmulate(string $code, array $tokens): array - { - // ?-> was not valid code previously, don't bother. - return $tokens; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.php b/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.php deleted file mode 100644 index cdf793e..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.php +++ /dev/null @@ -1,105 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Lexer\TokenEmulator; - -use PhpParser\Lexer\Emulative; - -final class NumericLiteralSeparatorEmulator extends TokenEmulator -{ - const BIN = '(?:0b[01]+(?:_[01]+)*)'; - const HEX = '(?:0x[0-9a-f]+(?:_[0-9a-f]+)*)'; - const DEC = '(?:[0-9]+(?:_[0-9]+)*)'; - const SIMPLE_FLOAT = '(?:' . self::DEC . '\.' . self::DEC . '?|\.' . self::DEC . ')'; - const EXP = '(?:e[+-]?' . self::DEC . ')'; - const FLOAT = '(?:' . self::SIMPLE_FLOAT . self::EXP . '?|' . self::DEC . self::EXP . ')'; - const NUMBER = '~' . self::FLOAT . '|' . self::BIN . '|' . self::HEX . '|' . self::DEC . '~iA'; - - public function getPhpVersion(): string - { - return Emulative::PHP_7_4; - } - - public function isEmulationNeeded(string $code) : bool - { - return preg_match('~[0-9]_[0-9]~', $code) - || preg_match('~0x[0-9a-f]+_[0-9a-f]~i', $code); - } - - public function emulate(string $code, array $tokens): array - { - // We need to manually iterate and manage a count because we'll change - // the tokens array on the way - $codeOffset = 0; - for ($i = 0, $c = count($tokens); $i < $c; ++$i) { - $token = $tokens[$i]; - $tokenLen = \strlen(\is_array($token) ? $token[1] : $token); - - if ($token[0] !== T_LNUMBER && $token[0] !== T_DNUMBER) { - $codeOffset += $tokenLen; - continue; - } - - $res = preg_match(self::NUMBER, $code, $matches, 0, $codeOffset); - assert($res, "No number at number token position"); - - $match = $matches[0]; - $matchLen = \strlen($match); - if ($matchLen === $tokenLen) { - // Original token already holds the full number. - $codeOffset += $tokenLen; - continue; - } - - $tokenKind = $this->resolveIntegerOrFloatToken($match); - $newTokens = [[$tokenKind, $match, $token[2]]]; - - $numTokens = 1; - $len = $tokenLen; - while ($matchLen > $len) { - $nextToken = $tokens[$i + $numTokens]; - $nextTokenText = \is_array($nextToken) ? $nextToken[1] : $nextToken; - $nextTokenLen = \strlen($nextTokenText); - - $numTokens++; - if ($matchLen < $len + $nextTokenLen) { - // Split trailing characters into a partial token. - assert(is_array($nextToken), "Partial token should be an array token"); - $partialText = substr($nextTokenText, $matchLen - $len); - $newTokens[] = [$nextToken[0], $partialText, $nextToken[2]]; - break; - } - - $len += $nextTokenLen; - } - - array_splice($tokens, $i, $numTokens, $newTokens); - $c -= $numTokens - \count($newTokens); - $codeOffset += $matchLen; - } - - return $tokens; - } - - private function resolveIntegerOrFloatToken(string $str): int - { - $str = str_replace('_', '', $str); - - if (stripos($str, '0b') === 0) { - $num = bindec($str); - } elseif (stripos($str, '0x') === 0) { - $num = hexdec($str); - } elseif (stripos($str, '0') === 0 && ctype_digit($str)) { - $num = octdec($str); - } else { - $num = +$str; - } - - return is_float($num) ? T_DNUMBER : T_LNUMBER; - } - - public function reverseEmulate(string $code, array $tokens): array - { - // Numeric separators were not legal code previously, don't bother. - return $tokens; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyFunctionTokenEmulator.php b/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyFunctionTokenEmulator.php deleted file mode 100644 index e671458..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyFunctionTokenEmulator.php +++ /dev/null @@ -1,31 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Lexer\TokenEmulator; - -use PhpParser\Lexer\Emulative; - -/* - * In PHP 8.1, "readonly(" was special cased in the lexer in order to support functions with - * name readonly. In PHP 8.2, this may conflict with readonly properties having a DNF type. For - * this reason, PHP 8.2 instead treats this as T_READONLY and then handles it specially in the - * parser. This emulator only exists to handle this special case, which is skipped by the - * PHP 8.1 ReadonlyTokenEmulator. - */ -class ReadonlyFunctionTokenEmulator extends KeywordEmulator { - public function getKeywordString(): string { - return 'readonly'; - } - - public function getKeywordToken(): int { - return \T_READONLY; - } - - public function getPhpVersion(): string { - return Emulative::PHP_8_2; - } - - public function reverseEmulate(string $code, array $tokens): array { - // Don't bother - return $tokens; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.php b/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.php deleted file mode 100644 index 539a2bc..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.php +++ /dev/null @@ -1,36 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Lexer\TokenEmulator; - -use PhpParser\Lexer\Emulative; - -final class ReadonlyTokenEmulator extends KeywordEmulator -{ - public function getPhpVersion(): string - { - return Emulative::PHP_8_1; - } - - public function getKeywordString(): string - { - return 'readonly'; - } - - public function getKeywordToken(): int - { - return \T_READONLY; - } - - protected function isKeywordContext(array $tokens, int $pos): bool - { - if (!parent::isKeywordContext($tokens, $pos)) { - return false; - } - // Support "function readonly(" - return !(isset($tokens[$pos + 1]) && - ($tokens[$pos + 1][0] === '(' || - ($tokens[$pos + 1][0] === \T_WHITESPACE && - isset($tokens[$pos + 2]) && - $tokens[$pos + 2][0] === '('))); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReverseEmulator.php b/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReverseEmulator.php deleted file mode 100644 index 90093f6..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReverseEmulator.php +++ /dev/null @@ -1,36 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Lexer\TokenEmulator; - -/** - * Reverses emulation direction of the inner emulator. - */ -final class ReverseEmulator extends TokenEmulator -{ - /** @var TokenEmulator Inner emulator */ - private $emulator; - - public function __construct(TokenEmulator $emulator) { - $this->emulator = $emulator; - } - - public function getPhpVersion(): string { - return $this->emulator->getPhpVersion(); - } - - public function isEmulationNeeded(string $code): bool { - return $this->emulator->isEmulationNeeded($code); - } - - public function emulate(string $code, array $tokens): array { - return $this->emulator->reverseEmulate($code, $tokens); - } - - public function reverseEmulate(string $code, array $tokens): array { - return $this->emulator->emulate($code, $tokens); - } - - public function preprocessCode(string $code, array &$patches): string { - return $code; - } -} \ No newline at end of file diff --git a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php b/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php deleted file mode 100644 index a020bc0..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Lexer\TokenEmulator; - -/** @internal */ -abstract class TokenEmulator -{ - abstract public function getPhpVersion(): string; - - abstract public function isEmulationNeeded(string $code): bool; - - /** - * @return array Modified Tokens - */ - abstract public function emulate(string $code, array $tokens): array; - - /** - * @return array Modified Tokens - */ - abstract public function reverseEmulate(string $code, array $tokens): array; - - public function preprocessCode(string $code, array &$patches): string { - return $code; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/NameContext.php b/vendor/nikic/php-parser/lib/PhpParser/NameContext.php deleted file mode 100644 index 82c5acc..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/NameContext.php +++ /dev/null @@ -1,285 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser; - -use PhpParser\Node\Name; -use PhpParser\Node\Name\FullyQualified; -use PhpParser\Node\Stmt; - -class NameContext -{ - /** @var null|Name Current namespace */ - protected $namespace; - - /** @var Name[][] Map of format [aliasType => [aliasName => originalName]] */ - protected $aliases = []; - - /** @var Name[][] Same as $aliases but preserving original case */ - protected $origAliases = []; - - /** @var ErrorHandler Error handler */ - protected $errorHandler; - - /** - * Create a name context. - * - * @param ErrorHandler $errorHandler Error handling used to report errors - */ - public function __construct(ErrorHandler $errorHandler) { - $this->errorHandler = $errorHandler; - } - - /** - * Start a new namespace. - * - * This also resets the alias table. - * - * @param Name|null $namespace Null is the global namespace - */ - public function startNamespace(?Name $namespace = null) { - $this->namespace = $namespace; - $this->origAliases = $this->aliases = [ - Stmt\Use_::TYPE_NORMAL => [], - Stmt\Use_::TYPE_FUNCTION => [], - Stmt\Use_::TYPE_CONSTANT => [], - ]; - } - - /** - * Add an alias / import. - * - * @param Name $name Original name - * @param string $aliasName Aliased name - * @param int $type One of Stmt\Use_::TYPE_* - * @param array $errorAttrs Attributes to use to report an error - */ - public function addAlias(Name $name, string $aliasName, int $type, array $errorAttrs = []) { - // Constant names are case sensitive, everything else case insensitive - if ($type === Stmt\Use_::TYPE_CONSTANT) { - $aliasLookupName = $aliasName; - } else { - $aliasLookupName = strtolower($aliasName); - } - - if (isset($this->aliases[$type][$aliasLookupName])) { - $typeStringMap = [ - Stmt\Use_::TYPE_NORMAL => '', - Stmt\Use_::TYPE_FUNCTION => 'function ', - Stmt\Use_::TYPE_CONSTANT => 'const ', - ]; - - $this->errorHandler->handleError(new Error( - sprintf( - 'Cannot use %s%s as %s because the name is already in use', - $typeStringMap[$type], $name, $aliasName - ), - $errorAttrs - )); - return; - } - - $this->aliases[$type][$aliasLookupName] = $name; - $this->origAliases[$type][$aliasName] = $name; - } - - /** - * Get current namespace. - * - * @return null|Name Namespace (or null if global namespace) - */ - public function getNamespace() { - return $this->namespace; - } - - /** - * Get resolved name. - * - * @param Name $name Name to resolve - * @param int $type One of Stmt\Use_::TYPE_{FUNCTION|CONSTANT} - * - * @return null|Name Resolved name, or null if static resolution is not possible - */ - public function getResolvedName(Name $name, int $type) { - // don't resolve special class names - if ($type === Stmt\Use_::TYPE_NORMAL && $name->isSpecialClassName()) { - if (!$name->isUnqualified()) { - $this->errorHandler->handleError(new Error( - sprintf("'\\%s' is an invalid class name", $name->toString()), - $name->getAttributes() - )); - } - return $name; - } - - // fully qualified names are already resolved - if ($name->isFullyQualified()) { - return $name; - } - - // Try to resolve aliases - if (null !== $resolvedName = $this->resolveAlias($name, $type)) { - return $resolvedName; - } - - if ($type !== Stmt\Use_::TYPE_NORMAL && $name->isUnqualified()) { - if (null === $this->namespace) { - // outside of a namespace unaliased unqualified is same as fully qualified - return new FullyQualified($name, $name->getAttributes()); - } - - // Cannot resolve statically - return null; - } - - // if no alias exists prepend current namespace - return FullyQualified::concat($this->namespace, $name, $name->getAttributes()); - } - - /** - * Get resolved class name. - * - * @param Name $name Class ame to resolve - * - * @return Name Resolved name - */ - public function getResolvedClassName(Name $name) : Name { - return $this->getResolvedName($name, Stmt\Use_::TYPE_NORMAL); - } - - /** - * Get possible ways of writing a fully qualified name (e.g., by making use of aliases). - * - * @param string $name Fully-qualified name (without leading namespace separator) - * @param int $type One of Stmt\Use_::TYPE_* - * - * @return Name[] Possible representations of the name - */ - public function getPossibleNames(string $name, int $type) : array { - $lcName = strtolower($name); - - if ($type === Stmt\Use_::TYPE_NORMAL) { - // self, parent and static must always be unqualified - if ($lcName === "self" || $lcName === "parent" || $lcName === "static") { - return [new Name($name)]; - } - } - - // Collect possible ways to write this name, starting with the fully-qualified name - $possibleNames = [new FullyQualified($name)]; - - if (null !== $nsRelativeName = $this->getNamespaceRelativeName($name, $lcName, $type)) { - // Make sure there is no alias that makes the normally namespace-relative name - // into something else - if (null === $this->resolveAlias($nsRelativeName, $type)) { - $possibleNames[] = $nsRelativeName; - } - } - - // Check for relevant namespace use statements - foreach ($this->origAliases[Stmt\Use_::TYPE_NORMAL] as $alias => $orig) { - $lcOrig = $orig->toLowerString(); - if (0 === strpos($lcName, $lcOrig . '\\')) { - $possibleNames[] = new Name($alias . substr($name, strlen($lcOrig))); - } - } - - // Check for relevant type-specific use statements - foreach ($this->origAliases[$type] as $alias => $orig) { - if ($type === Stmt\Use_::TYPE_CONSTANT) { - // Constants are are complicated-sensitive - $normalizedOrig = $this->normalizeConstName($orig->toString()); - if ($normalizedOrig === $this->normalizeConstName($name)) { - $possibleNames[] = new Name($alias); - } - } else { - // Everything else is case-insensitive - if ($orig->toLowerString() === $lcName) { - $possibleNames[] = new Name($alias); - } - } - } - - return $possibleNames; - } - - /** - * Get shortest representation of this fully-qualified name. - * - * @param string $name Fully-qualified name (without leading namespace separator) - * @param int $type One of Stmt\Use_::TYPE_* - * - * @return Name Shortest representation - */ - public function getShortName(string $name, int $type) : Name { - $possibleNames = $this->getPossibleNames($name, $type); - - // Find shortest name - $shortestName = null; - $shortestLength = \INF; - foreach ($possibleNames as $possibleName) { - $length = strlen($possibleName->toCodeString()); - if ($length < $shortestLength) { - $shortestName = $possibleName; - $shortestLength = $length; - } - } - - return $shortestName; - } - - private function resolveAlias(Name $name, $type) { - $firstPart = $name->getFirst(); - - if ($name->isQualified()) { - // resolve aliases for qualified names, always against class alias table - $checkName = strtolower($firstPart); - if (isset($this->aliases[Stmt\Use_::TYPE_NORMAL][$checkName])) { - $alias = $this->aliases[Stmt\Use_::TYPE_NORMAL][$checkName]; - return FullyQualified::concat($alias, $name->slice(1), $name->getAttributes()); - } - } elseif ($name->isUnqualified()) { - // constant aliases are case-sensitive, function aliases case-insensitive - $checkName = $type === Stmt\Use_::TYPE_CONSTANT ? $firstPart : strtolower($firstPart); - if (isset($this->aliases[$type][$checkName])) { - // resolve unqualified aliases - return new FullyQualified($this->aliases[$type][$checkName], $name->getAttributes()); - } - } - - // No applicable aliases - return null; - } - - private function getNamespaceRelativeName(string $name, string $lcName, int $type) { - if (null === $this->namespace) { - return new Name($name); - } - - if ($type === Stmt\Use_::TYPE_CONSTANT) { - // The constants true/false/null always resolve to the global symbols, even inside a - // namespace, so they may be used without qualification - if ($lcName === "true" || $lcName === "false" || $lcName === "null") { - return new Name($name); - } - } - - $namespacePrefix = strtolower($this->namespace . '\\'); - if (0 === strpos($lcName, $namespacePrefix)) { - return new Name(substr($name, strlen($namespacePrefix))); - } - - return null; - } - - private function normalizeConstName(string $name) { - $nsSep = strrpos($name, '\\'); - if (false === $nsSep) { - return $name; - } - - // Constants have case-insensitive namespace and case-sensitive short-name - $ns = substr($name, 0, $nsSep); - $shortName = substr($name, $nsSep + 1); - return strtolower($ns) . '\\' . $shortName; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node.php b/vendor/nikic/php-parser/lib/PhpParser/Node.php deleted file mode 100644 index befb256..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node.php +++ /dev/null @@ -1,151 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser; - -interface Node -{ - /** - * Gets the type of the node. - * - * @return string Type of the node - */ - public function getType() : string; - - /** - * Gets the names of the sub nodes. - * - * @return array Names of sub nodes - */ - public function getSubNodeNames() : array; - - /** - * Gets line the node started in (alias of getStartLine). - * - * @return int Start line (or -1 if not available) - */ - public function getLine() : int; - - /** - * Gets line the node started in. - * - * Requires the 'startLine' attribute to be enabled in the lexer (enabled by default). - * - * @return int Start line (or -1 if not available) - */ - public function getStartLine() : int; - - /** - * Gets the line the node ended in. - * - * Requires the 'endLine' attribute to be enabled in the lexer (enabled by default). - * - * @return int End line (or -1 if not available) - */ - public function getEndLine() : int; - - /** - * Gets the token offset of the first token that is part of this node. - * - * The offset is an index into the array returned by Lexer::getTokens(). - * - * Requires the 'startTokenPos' attribute to be enabled in the lexer (DISABLED by default). - * - * @return int Token start position (or -1 if not available) - */ - public function getStartTokenPos() : int; - - /** - * Gets the token offset of the last token that is part of this node. - * - * The offset is an index into the array returned by Lexer::getTokens(). - * - * Requires the 'endTokenPos' attribute to be enabled in the lexer (DISABLED by default). - * - * @return int Token end position (or -1 if not available) - */ - public function getEndTokenPos() : int; - - /** - * Gets the file offset of the first character that is part of this node. - * - * Requires the 'startFilePos' attribute to be enabled in the lexer (DISABLED by default). - * - * @return int File start position (or -1 if not available) - */ - public function getStartFilePos() : int; - - /** - * Gets the file offset of the last character that is part of this node. - * - * Requires the 'endFilePos' attribute to be enabled in the lexer (DISABLED by default). - * - * @return int File end position (or -1 if not available) - */ - public function getEndFilePos() : int; - - /** - * Gets all comments directly preceding this node. - * - * The comments are also available through the "comments" attribute. - * - * @return Comment[] - */ - public function getComments() : array; - - /** - * Gets the doc comment of the node. - * - * @return null|Comment\Doc Doc comment object or null - */ - public function getDocComment(); - - /** - * Sets the doc comment of the node. - * - * This will either replace an existing doc comment or add it to the comments array. - * - * @param Comment\Doc $docComment Doc comment to set - */ - public function setDocComment(Comment\Doc $docComment); - - /** - * Sets an attribute on a node. - * - * @param string $key - * @param mixed $value - */ - public function setAttribute(string $key, $value); - - /** - * Returns whether an attribute exists. - * - * @param string $key - * - * @return bool - */ - public function hasAttribute(string $key) : bool; - - /** - * Returns the value of an attribute. - * - * @param string $key - * @param mixed $default - * - * @return mixed - */ - public function getAttribute(string $key, $default = null); - - /** - * Returns all the attributes of this node. - * - * @return array - */ - public function getAttributes() : array; - - /** - * Replaces all the attributes of this node. - * - * @param array $attributes - */ - public function setAttributes(array $attributes); -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Arg.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Arg.php deleted file mode 100644 index 17e6802..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Arg.php +++ /dev/null @@ -1,46 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node; - -use PhpParser\Node\VariadicPlaceholder; -use PhpParser\NodeAbstract; - -class Arg extends NodeAbstract -{ - /** @var Identifier|null Parameter name (for named parameters) */ - public $name; - /** @var Expr Value to pass */ - public $value; - /** @var bool Whether to pass by ref */ - public $byRef; - /** @var bool Whether to unpack the argument */ - public $unpack; - - /** - * Constructs a function call argument node. - * - * @param Expr $value Value to pass - * @param bool $byRef Whether to pass by ref - * @param bool $unpack Whether to unpack the argument - * @param array $attributes Additional attributes - * @param Identifier|null $name Parameter name (for named parameters) - */ - public function __construct( - Expr $value, bool $byRef = false, bool $unpack = false, array $attributes = [], - ?Identifier $name = null - ) { - $this->attributes = $attributes; - $this->name = $name; - $this->value = $value; - $this->byRef = $byRef; - $this->unpack = $unpack; - } - - public function getSubNodeNames() : array { - return ['name', 'value', 'byRef', 'unpack']; - } - - public function getType() : string { - return 'Arg'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Attribute.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Attribute.php deleted file mode 100644 index c96f66e..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Attribute.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node; - -use PhpParser\Node; -use PhpParser\NodeAbstract; - -class Attribute extends NodeAbstract -{ - /** @var Name Attribute name */ - public $name; - - /** @var Arg[] Attribute arguments */ - public $args; - - /** - * @param Node\Name $name Attribute name - * @param Arg[] $args Attribute arguments - * @param array $attributes Additional node attributes - */ - public function __construct(Name $name, array $args = [], array $attributes = []) { - $this->attributes = $attributes; - $this->name = $name; - $this->args = $args; - } - - public function getSubNodeNames() : array { - return ['name', 'args']; - } - - public function getType() : string { - return 'Attribute'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php b/vendor/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php deleted file mode 100644 index 613bfc4..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php +++ /dev/null @@ -1,29 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node; - -use PhpParser\Node; -use PhpParser\NodeAbstract; - -class AttributeGroup extends NodeAbstract -{ - /** @var Attribute[] Attributes */ - public $attrs; - - /** - * @param Attribute[] $attrs PHP attributes - * @param array $attributes Additional node attributes - */ - public function __construct(array $attrs, array $attributes = []) { - $this->attributes = $attributes; - $this->attrs = $attrs; - } - - public function getSubNodeNames() : array { - return ['attrs']; - } - - public function getType() : string { - return 'AttributeGroup'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/ComplexType.php b/vendor/nikic/php-parser/lib/PhpParser/Node/ComplexType.php deleted file mode 100644 index 9505532..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/ComplexType.php +++ /dev/null @@ -1,14 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node; - -use PhpParser\NodeAbstract; - -/** - * This is a base class for complex types, including nullable types and union types. - * - * It does not provide any shared behavior and exists only for type-checking purposes. - */ -abstract class ComplexType extends NodeAbstract -{ -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Const_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Const_.php deleted file mode 100644 index 07a74df..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Const_.php +++ /dev/null @@ -1,37 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node; - -use PhpParser\NodeAbstract; - -class Const_ extends NodeAbstract -{ - /** @var Identifier Name */ - public $name; - /** @var Expr Value */ - public $value; - - /** @var Name|null Namespaced name (if using NameResolver) */ - public $namespacedName; - - /** - * Constructs a const node for use in class const and const statements. - * - * @param string|Identifier $name Name - * @param Expr $value Value - * @param array $attributes Additional attributes - */ - public function __construct($name, Expr $value, array $attributes = []) { - $this->attributes = $attributes; - $this->name = \is_string($name) ? new Identifier($name) : $name; - $this->value = $value; - } - - public function getSubNodeNames() : array { - return ['name', 'value']; - } - - public function getType() : string { - return 'Const'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr.php deleted file mode 100644 index 6cf4df2..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr.php +++ /dev/null @@ -1,9 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node; - -use PhpParser\NodeAbstract; - -abstract class Expr extends NodeAbstract -{ -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php deleted file mode 100644 index 46db975..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Expr; - -class ArrayDimFetch extends Expr -{ - /** @var Expr Variable */ - public $var; - /** @var null|Expr Array index / dim */ - public $dim; - - /** - * Constructs an array index fetch node. - * - * @param Expr $var Variable - * @param null|Expr $dim Array index / dim - * @param array $attributes Additional attributes - */ - public function __construct(Expr $var, ?Expr $dim = null, array $attributes = []) { - $this->attributes = $attributes; - $this->var = $var; - $this->dim = $dim; - } - - public function getSubNodeNames() : array { - return ['var', 'dim']; - } - - public function getType() : string { - return 'Expr_ArrayDimFetch'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php deleted file mode 100644 index 5aaa986..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php +++ /dev/null @@ -1,41 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Expr; - -class ArrayItem extends Expr -{ - /** @var null|Expr Key */ - public $key; - /** @var Expr Value */ - public $value; - /** @var bool Whether to assign by reference */ - public $byRef; - /** @var bool Whether to unpack the argument */ - public $unpack; - - /** - * Constructs an array item node. - * - * @param Expr $value Value - * @param null|Expr $key Key - * @param bool $byRef Whether to assign by reference - * @param array $attributes Additional attributes - */ - public function __construct(Expr $value, ?Expr $key = null, bool $byRef = false, array $attributes = [], bool $unpack = false) { - $this->attributes = $attributes; - $this->key = $key; - $this->value = $value; - $this->byRef = $byRef; - $this->unpack = $unpack; - } - - public function getSubNodeNames() : array { - return ['key', 'value', 'byRef', 'unpack']; - } - - public function getType() : string { - return 'Expr_ArrayItem'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php deleted file mode 100644 index e6eaa28..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Expr; - -class Array_ extends Expr -{ - // For use in "kind" attribute - const KIND_LONG = 1; // array() syntax - const KIND_SHORT = 2; // [] syntax - - /** @var (ArrayItem|null)[] Items */ - public $items; - - /** - * Constructs an array node. - * - * @param (ArrayItem|null)[] $items Items of the array - * @param array $attributes Additional attributes - */ - public function __construct(array $items = [], array $attributes = []) { - $this->attributes = $attributes; - $this->items = $items; - } - - public function getSubNodeNames() : array { - return ['items']; - } - - public function getType() : string { - return 'Expr_Array'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php deleted file mode 100644 index c273fb7..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php +++ /dev/null @@ -1,79 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node; -use PhpParser\Node\Expr; -use PhpParser\Node\FunctionLike; - -class ArrowFunction extends Expr implements FunctionLike -{ - /** @var bool */ - public $static; - - /** @var bool */ - public $byRef; - - /** @var Node\Param[] */ - public $params = []; - - /** @var null|Node\Identifier|Node\Name|Node\ComplexType */ - public $returnType; - - /** @var Expr */ - public $expr; - /** @var Node\AttributeGroup[] */ - public $attrGroups; - - /** - * @param array $subNodes Array of the following optional subnodes: - * 'static' => false : Whether the closure is static - * 'byRef' => false : Whether to return by reference - * 'params' => array() : Parameters - * 'returnType' => null : Return type - * 'expr' => Expr : Expression body - * 'attrGroups' => array() : PHP attribute groups - * @param array $attributes Additional attributes - */ - public function __construct(array $subNodes = [], array $attributes = []) { - $this->attributes = $attributes; - $this->static = $subNodes['static'] ?? false; - $this->byRef = $subNodes['byRef'] ?? false; - $this->params = $subNodes['params'] ?? []; - $returnType = $subNodes['returnType'] ?? null; - $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType; - $this->expr = $subNodes['expr']; - $this->attrGroups = $subNodes['attrGroups'] ?? []; - } - - public function getSubNodeNames() : array { - return ['attrGroups', 'static', 'byRef', 'params', 'returnType', 'expr']; - } - - public function returnsByRef() : bool { - return $this->byRef; - } - - public function getParams() : array { - return $this->params; - } - - public function getReturnType() { - return $this->returnType; - } - - public function getAttrGroups() : array { - return $this->attrGroups; - } - - /** - * @return Node\Stmt\Return_[] - */ - public function getStmts() : array { - return [new Node\Stmt\Return_($this->expr)]; - } - - public function getType() : string { - return 'Expr_ArrowFunction'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php deleted file mode 100644 index cf9e6e8..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Expr; - -class Assign extends Expr -{ - /** @var Expr Variable */ - public $var; - /** @var Expr Expression */ - public $expr; - - /** - * Constructs an assignment node. - * - * @param Expr $var Variable - * @param Expr $expr Expression - * @param array $attributes Additional attributes - */ - public function __construct(Expr $var, Expr $expr, array $attributes = []) { - $this->attributes = $attributes; - $this->var = $var; - $this->expr = $expr; - } - - public function getSubNodeNames() : array { - return ['var', 'expr']; - } - - public function getType() : string { - return 'Expr_Assign'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php deleted file mode 100644 index bce8604..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Expr; - -abstract class AssignOp extends Expr -{ - /** @var Expr Variable */ - public $var; - /** @var Expr Expression */ - public $expr; - - /** - * Constructs a compound assignment operation node. - * - * @param Expr $var Variable - * @param Expr $expr Expression - * @param array $attributes Additional attributes - */ - public function __construct(Expr $var, Expr $expr, array $attributes = []) { - $this->attributes = $attributes; - $this->var = $var; - $this->expr = $expr; - } - - public function getSubNodeNames() : array { - return ['var', 'expr']; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php deleted file mode 100644 index 420284c..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\AssignOp; - -use PhpParser\Node\Expr\AssignOp; - -class BitwiseAnd extends AssignOp -{ - public function getType() : string { - return 'Expr_AssignOp_BitwiseAnd'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseOr.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseOr.php deleted file mode 100644 index 481ad3b..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseOr.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\AssignOp; - -use PhpParser\Node\Expr\AssignOp; - -class BitwiseOr extends AssignOp -{ - public function getType() : string { - return 'Expr_AssignOp_BitwiseOr'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseXor.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseXor.php deleted file mode 100644 index f41d4c8..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseXor.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\AssignOp; - -use PhpParser\Node\Expr\AssignOp; - -class BitwiseXor extends AssignOp -{ - public function getType() : string { - return 'Expr_AssignOp_BitwiseXor'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Coalesce.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Coalesce.php deleted file mode 100644 index c0e9b31..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Coalesce.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\AssignOp; - -use PhpParser\Node\Expr\AssignOp; - -class Coalesce extends AssignOp -{ - public function getType() : string { - return 'Expr_AssignOp_Coalesce'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Concat.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Concat.php deleted file mode 100644 index ac16820..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Concat.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\AssignOp; - -use PhpParser\Node\Expr\AssignOp; - -class Concat extends AssignOp -{ - public function getType() : string { - return 'Expr_AssignOp_Concat'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Div.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Div.php deleted file mode 100644 index f1fcfc0..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Div.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\AssignOp; - -use PhpParser\Node\Expr\AssignOp; - -class Div extends AssignOp -{ - public function getType() : string { - return 'Expr_AssignOp_Div'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Minus.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Minus.php deleted file mode 100644 index 82ef451..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Minus.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\AssignOp; - -use PhpParser\Node\Expr\AssignOp; - -class Minus extends AssignOp -{ - public function getType() : string { - return 'Expr_AssignOp_Minus'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mod.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mod.php deleted file mode 100644 index be3b4a0..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mod.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\AssignOp; - -use PhpParser\Node\Expr\AssignOp; - -class Mod extends AssignOp -{ - public function getType() : string { - return 'Expr_AssignOp_Mod'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mul.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mul.php deleted file mode 100644 index 5c196c3..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mul.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\AssignOp; - -use PhpParser\Node\Expr\AssignOp; - -class Mul extends AssignOp -{ - public function getType() : string { - return 'Expr_AssignOp_Mul'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Plus.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Plus.php deleted file mode 100644 index dd101c6..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Plus.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\AssignOp; - -use PhpParser\Node\Expr\AssignOp; - -class Plus extends AssignOp -{ - public function getType() : string { - return 'Expr_AssignOp_Plus'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Pow.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Pow.php deleted file mode 100644 index 5e1307d..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Pow.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\AssignOp; - -use PhpParser\Node\Expr\AssignOp; - -class Pow extends AssignOp -{ - public function getType() : string { - return 'Expr_AssignOp_Pow'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftLeft.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftLeft.php deleted file mode 100644 index b8f8826..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftLeft.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\AssignOp; - -use PhpParser\Node\Expr\AssignOp; - -class ShiftLeft extends AssignOp -{ - public function getType() : string { - return 'Expr_AssignOp_ShiftLeft'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftRight.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftRight.php deleted file mode 100644 index e0cc67b..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftRight.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\AssignOp; - -use PhpParser\Node\Expr\AssignOp; - -class ShiftRight extends AssignOp -{ - public function getType() : string { - return 'Expr_AssignOp_ShiftRight'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php deleted file mode 100644 index de3c644..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Expr; - -class AssignRef extends Expr -{ - /** @var Expr Variable reference is assigned to */ - public $var; - /** @var Expr Variable which is referenced */ - public $expr; - - /** - * Constructs an assignment node. - * - * @param Expr $var Variable - * @param Expr $expr Expression - * @param array $attributes Additional attributes - */ - public function __construct(Expr $var, Expr $expr, array $attributes = []) { - $this->attributes = $attributes; - $this->var = $var; - $this->expr = $expr; - } - - public function getSubNodeNames() : array { - return ['var', 'expr']; - } - - public function getType() : string { - return 'Expr_AssignRef'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php deleted file mode 100644 index d9c582b..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php +++ /dev/null @@ -1,40 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Expr; - -abstract class BinaryOp extends Expr -{ - /** @var Expr The left hand side expression */ - public $left; - /** @var Expr The right hand side expression */ - public $right; - - /** - * Constructs a binary operator node. - * - * @param Expr $left The left hand side expression - * @param Expr $right The right hand side expression - * @param array $attributes Additional attributes - */ - public function __construct(Expr $left, Expr $right, array $attributes = []) { - $this->attributes = $attributes; - $this->left = $left; - $this->right = $right; - } - - public function getSubNodeNames() : array { - return ['left', 'right']; - } - - /** - * Get the operator sigil for this binary operation. - * - * In the case there are multiple possible sigils for an operator, this method does not - * necessarily return the one used in the parsed code. - * - * @return string - */ - abstract public function getOperatorSigil() : string; -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php deleted file mode 100644 index d907393..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\BinaryOp; - -use PhpParser\Node\Expr\BinaryOp; - -class BitwiseAnd extends BinaryOp -{ - public function getOperatorSigil() : string { - return '&'; - } - - public function getType() : string { - return 'Expr_BinaryOp_BitwiseAnd'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseOr.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseOr.php deleted file mode 100644 index d92069f..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseOr.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\BinaryOp; - -use PhpParser\Node\Expr\BinaryOp; - -class BitwiseOr extends BinaryOp -{ - public function getOperatorSigil() : string { - return '|'; - } - - public function getType() : string { - return 'Expr_BinaryOp_BitwiseOr'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseXor.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseXor.php deleted file mode 100644 index 40fa94f..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseXor.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\BinaryOp; - -use PhpParser\Node\Expr\BinaryOp; - -class BitwiseXor extends BinaryOp -{ - public function getOperatorSigil() : string { - return '^'; - } - - public function getType() : string { - return 'Expr_BinaryOp_BitwiseXor'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanAnd.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanAnd.php deleted file mode 100644 index 4c3c9e9..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanAnd.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\BinaryOp; - -use PhpParser\Node\Expr\BinaryOp; - -class BooleanAnd extends BinaryOp -{ - public function getOperatorSigil() : string { - return '&&'; - } - - public function getType() : string { - return 'Expr_BinaryOp_BooleanAnd'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanOr.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanOr.php deleted file mode 100644 index 5ad4172..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanOr.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\BinaryOp; - -use PhpParser\Node\Expr\BinaryOp; - -class BooleanOr extends BinaryOp -{ - public function getOperatorSigil() : string { - return '||'; - } - - public function getType() : string { - return 'Expr_BinaryOp_BooleanOr'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Coalesce.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Coalesce.php deleted file mode 100644 index b8cf6f4..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Coalesce.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\BinaryOp; - -use PhpParser\Node\Expr\BinaryOp; - -class Coalesce extends BinaryOp -{ - public function getOperatorSigil() : string { - return '??'; - } - - public function getType() : string { - return 'Expr_BinaryOp_Coalesce'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Concat.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Concat.php deleted file mode 100644 index 9a8d987..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Concat.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\BinaryOp; - -use PhpParser\Node\Expr\BinaryOp; - -class Concat extends BinaryOp -{ - public function getOperatorSigil() : string { - return '.'; - } - - public function getType() : string { - return 'Expr_BinaryOp_Concat'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Div.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Div.php deleted file mode 100644 index d38df0d..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Div.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\BinaryOp; - -use PhpParser\Node\Expr\BinaryOp; - -class Div extends BinaryOp -{ - public function getOperatorSigil() : string { - return '/'; - } - - public function getType() : string { - return 'Expr_BinaryOp_Div'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Equal.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Equal.php deleted file mode 100644 index e7b11dc..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Equal.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\BinaryOp; - -use PhpParser\Node\Expr\BinaryOp; - -class Equal extends BinaryOp -{ - public function getOperatorSigil() : string { - return '=='; - } - - public function getType() : string { - return 'Expr_BinaryOp_Equal'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Greater.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Greater.php deleted file mode 100644 index da01f7a..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Greater.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\BinaryOp; - -use PhpParser\Node\Expr\BinaryOp; - -class Greater extends BinaryOp -{ - public function getOperatorSigil() : string { - return '>'; - } - - public function getType() : string { - return 'Expr_BinaryOp_Greater'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php deleted file mode 100644 index d677502..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\BinaryOp; - -use PhpParser\Node\Expr\BinaryOp; - -class GreaterOrEqual extends BinaryOp -{ - public function getOperatorSigil() : string { - return '>='; - } - - public function getType() : string { - return 'Expr_BinaryOp_GreaterOrEqual'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php deleted file mode 100644 index 3d96285..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\BinaryOp; - -use PhpParser\Node\Expr\BinaryOp; - -class Identical extends BinaryOp -{ - public function getOperatorSigil() : string { - return '==='; - } - - public function getType() : string { - return 'Expr_BinaryOp_Identical'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalAnd.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalAnd.php deleted file mode 100644 index 2a3afd5..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalAnd.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\BinaryOp; - -use PhpParser\Node\Expr\BinaryOp; - -class LogicalAnd extends BinaryOp -{ - public function getOperatorSigil() : string { - return 'and'; - } - - public function getType() : string { - return 'Expr_BinaryOp_LogicalAnd'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalOr.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalOr.php deleted file mode 100644 index 21507db..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalOr.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\BinaryOp; - -use PhpParser\Node\Expr\BinaryOp; - -class LogicalOr extends BinaryOp -{ - public function getOperatorSigil() : string { - return 'or'; - } - - public function getType() : string { - return 'Expr_BinaryOp_LogicalOr'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalXor.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalXor.php deleted file mode 100644 index 261c6a9..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalXor.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\BinaryOp; - -use PhpParser\Node\Expr\BinaryOp; - -class LogicalXor extends BinaryOp -{ - public function getOperatorSigil() : string { - return 'xor'; - } - - public function getType() : string { - return 'Expr_BinaryOp_LogicalXor'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Minus.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Minus.php deleted file mode 100644 index 54b3c6e..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Minus.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\BinaryOp; - -use PhpParser\Node\Expr\BinaryOp; - -class Minus extends BinaryOp -{ - public function getOperatorSigil() : string { - return '-'; - } - - public function getType() : string { - return 'Expr_BinaryOp_Minus'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mod.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mod.php deleted file mode 100644 index 1034040..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mod.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\BinaryOp; - -use PhpParser\Node\Expr\BinaryOp; - -class Mod extends BinaryOp -{ - public function getOperatorSigil() : string { - return '%'; - } - - public function getType() : string { - return 'Expr_BinaryOp_Mod'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mul.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mul.php deleted file mode 100644 index b82d0b2..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mul.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\BinaryOp; - -use PhpParser\Node\Expr\BinaryOp; - -class Mul extends BinaryOp -{ - public function getOperatorSigil() : string { - return '*'; - } - - public function getType() : string { - return 'Expr_BinaryOp_Mul'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotEqual.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotEqual.php deleted file mode 100644 index 51075da..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotEqual.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\BinaryOp; - -use PhpParser\Node\Expr\BinaryOp; - -class NotEqual extends BinaryOp -{ - public function getOperatorSigil() : string { - return '!='; - } - - public function getType() : string { - return 'Expr_BinaryOp_NotEqual'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotIdentical.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotIdentical.php deleted file mode 100644 index fa4050e..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotIdentical.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\BinaryOp; - -use PhpParser\Node\Expr\BinaryOp; - -class NotIdentical extends BinaryOp -{ - public function getOperatorSigil() : string { - return '!=='; - } - - public function getType() : string { - return 'Expr_BinaryOp_NotIdentical'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Plus.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Plus.php deleted file mode 100644 index 62f0229..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Plus.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\BinaryOp; - -use PhpParser\Node\Expr\BinaryOp; - -class Plus extends BinaryOp -{ - public function getOperatorSigil() : string { - return '+'; - } - - public function getType() : string { - return 'Expr_BinaryOp_Plus'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pow.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pow.php deleted file mode 100644 index 572a1e8..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pow.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\BinaryOp; - -use PhpParser\Node\Expr\BinaryOp; - -class Pow extends BinaryOp -{ - public function getOperatorSigil() : string { - return '**'; - } - - public function getType() : string { - return 'Expr_BinaryOp_Pow'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftLeft.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftLeft.php deleted file mode 100644 index 4e70b4e..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftLeft.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\BinaryOp; - -use PhpParser\Node\Expr\BinaryOp; - -class ShiftLeft extends BinaryOp -{ - public function getOperatorSigil() : string { - return '<<'; - } - - public function getType() : string { - return 'Expr_BinaryOp_ShiftLeft'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftRight.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftRight.php deleted file mode 100644 index 45acbd0..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftRight.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\BinaryOp; - -use PhpParser\Node\Expr\BinaryOp; - -class ShiftRight extends BinaryOp -{ - public function getOperatorSigil() : string { - return '>>'; - } - - public function getType() : string { - return 'Expr_BinaryOp_ShiftRight'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php deleted file mode 100644 index 3cb8e7e..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\BinaryOp; - -use PhpParser\Node\Expr\BinaryOp; - -class Smaller extends BinaryOp -{ - public function getOperatorSigil() : string { - return '<'; - } - - public function getType() : string { - return 'Expr_BinaryOp_Smaller'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.php deleted file mode 100644 index 83e8e21..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\BinaryOp; - -use PhpParser\Node\Expr\BinaryOp; - -class SmallerOrEqual extends BinaryOp -{ - public function getOperatorSigil() : string { - return '<='; - } - - public function getType() : string { - return 'Expr_BinaryOp_SmallerOrEqual'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Spaceship.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Spaceship.php deleted file mode 100644 index 8c6d787..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Spaceship.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\BinaryOp; - -use PhpParser\Node\Expr\BinaryOp; - -class Spaceship extends BinaryOp -{ - public function getOperatorSigil() : string { - return '<=>'; - } - - public function getType() : string { - return 'Expr_BinaryOp_Spaceship'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php deleted file mode 100644 index ed44984..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Expr; - -class BitwiseNot extends Expr -{ - /** @var Expr Expression */ - public $expr; - - /** - * Constructs a bitwise not node. - * - * @param Expr $expr Expression - * @param array $attributes Additional attributes - */ - public function __construct(Expr $expr, array $attributes = []) { - $this->attributes = $attributes; - $this->expr = $expr; - } - - public function getSubNodeNames() : array { - return ['expr']; - } - - public function getType() : string { - return 'Expr_BitwiseNot'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php deleted file mode 100644 index bf27e9f..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Expr; - -class BooleanNot extends Expr -{ - /** @var Expr Expression */ - public $expr; - - /** - * Constructs a boolean not node. - * - * @param Expr $expr Expression - * @param array $attributes Additional attributes - */ - public function __construct(Expr $expr, array $attributes = []) { - $this->attributes = $attributes; - $this->expr = $expr; - } - - public function getSubNodeNames() : array { - return ['expr']; - } - - public function getType() : string { - return 'Expr_BooleanNot'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php deleted file mode 100644 index 78e1cf3..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php +++ /dev/null @@ -1,39 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Arg; -use PhpParser\Node\Expr; -use PhpParser\Node\VariadicPlaceholder; - -abstract class CallLike extends Expr { - /** - * Return raw arguments, which may be actual Args, or VariadicPlaceholders for first-class - * callables. - * - * @return array<Arg|VariadicPlaceholder> - */ - abstract public function getRawArgs(): array; - - /** - * Returns whether this call expression is actually a first class callable. - */ - public function isFirstClassCallable(): bool { - foreach ($this->getRawArgs() as $arg) { - if ($arg instanceof VariadicPlaceholder) { - return true; - } - } - return false; - } - - /** - * Assert that this is not a first-class callable and return only ordinary Args. - * - * @return Arg[] - */ - public function getArgs(): array { - assert(!$this->isFirstClassCallable()); - return $this->getRawArgs(); - } -} \ No newline at end of file diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php deleted file mode 100644 index 36769d4..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php +++ /dev/null @@ -1,26 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Expr; - -abstract class Cast extends Expr -{ - /** @var Expr Expression */ - public $expr; - - /** - * Constructs a cast node. - * - * @param Expr $expr Expression - * @param array $attributes Additional attributes - */ - public function __construct(Expr $expr, array $attributes = []) { - $this->attributes = $attributes; - $this->expr = $expr; - } - - public function getSubNodeNames() : array { - return ['expr']; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php deleted file mode 100644 index 57cc473..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\Cast; - -use PhpParser\Node\Expr\Cast; - -class Array_ extends Cast -{ - public function getType() : string { - return 'Expr_Cast_Array'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Bool_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Bool_.php deleted file mode 100644 index 04eb4af..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Bool_.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\Cast; - -use PhpParser\Node\Expr\Cast; - -class Bool_ extends Cast -{ - public function getType() : string { - return 'Expr_Cast_Bool'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.php deleted file mode 100644 index 891ba5f..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.php +++ /dev/null @@ -1,17 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\Cast; - -use PhpParser\Node\Expr\Cast; - -class Double extends Cast -{ - // For use in "kind" attribute - const KIND_DOUBLE = 1; // "double" syntax - const KIND_FLOAT = 2; // "float" syntax - const KIND_REAL = 3; // "real" syntax - - public function getType() : string { - return 'Expr_Cast_Double'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Int_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Int_.php deleted file mode 100644 index 01ed594..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Int_.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\Cast; - -use PhpParser\Node\Expr\Cast; - -class Int_ extends Cast -{ - public function getType() : string { - return 'Expr_Cast_Int'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Object_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Object_.php deleted file mode 100644 index 163752b..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Object_.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\Cast; - -use PhpParser\Node\Expr\Cast; - -class Object_ extends Cast -{ - public function getType() : string { - return 'Expr_Cast_Object'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/String_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/String_.php deleted file mode 100644 index b3d9927..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/String_.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\Cast; - -use PhpParser\Node\Expr\Cast; - -class String_ extends Cast -{ - public function getType() : string { - return 'Expr_Cast_String'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Unset_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Unset_.php deleted file mode 100644 index accda3e..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Unset_.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr\Cast; - -use PhpParser\Node\Expr\Cast; - -class Unset_ extends Cast -{ - public function getType() : string { - return 'Expr_Cast_Unset'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php deleted file mode 100644 index 0c45ffb..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php +++ /dev/null @@ -1,36 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Expr; -use PhpParser\Node\Identifier; -use PhpParser\Node\Name; - -class ClassConstFetch extends Expr -{ - /** @var Name|Expr Class name */ - public $class; - /** @var Identifier|Expr|Error Constant name */ - public $name; - - /** - * Constructs a class const fetch node. - * - * @param Name|Expr $class Class name - * @param string|Identifier|Expr|Error $name Constant name - * @param array $attributes Additional attributes - */ - public function __construct($class, $name, array $attributes = []) { - $this->attributes = $attributes; - $this->class = $class; - $this->name = \is_string($name) ? new Identifier($name) : $name; - } - - public function getSubNodeNames() : array { - return ['class', 'name']; - } - - public function getType() : string { - return 'Expr_ClassConstFetch'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php deleted file mode 100644 index db216b8..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Expr; - -class Clone_ extends Expr -{ - /** @var Expr Expression */ - public $expr; - - /** - * Constructs a clone node. - * - * @param Expr $expr Expression - * @param array $attributes Additional attributes - */ - public function __construct(Expr $expr, array $attributes = []) { - $this->attributes = $attributes; - $this->expr = $expr; - } - - public function getSubNodeNames() : array { - return ['expr']; - } - - public function getType() : string { - return 'Expr_Clone'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php deleted file mode 100644 index 56ddea6..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php +++ /dev/null @@ -1,79 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node; -use PhpParser\Node\Expr; -use PhpParser\Node\FunctionLike; - -class Closure extends Expr implements FunctionLike -{ - /** @var bool Whether the closure is static */ - public $static; - /** @var bool Whether to return by reference */ - public $byRef; - /** @var Node\Param[] Parameters */ - public $params; - /** @var ClosureUse[] use()s */ - public $uses; - /** @var null|Node\Identifier|Node\Name|Node\ComplexType Return type */ - public $returnType; - /** @var Node\Stmt[] Statements */ - public $stmts; - /** @var Node\AttributeGroup[] PHP attribute groups */ - public $attrGroups; - - /** - * Constructs a lambda function node. - * - * @param array $subNodes Array of the following optional subnodes: - * 'static' => false : Whether the closure is static - * 'byRef' => false : Whether to return by reference - * 'params' => array(): Parameters - * 'uses' => array(): use()s - * 'returnType' => null : Return type - * 'stmts' => array(): Statements - * 'attrGroups' => array(): PHP attributes groups - * @param array $attributes Additional attributes - */ - public function __construct(array $subNodes = [], array $attributes = []) { - $this->attributes = $attributes; - $this->static = $subNodes['static'] ?? false; - $this->byRef = $subNodes['byRef'] ?? false; - $this->params = $subNodes['params'] ?? []; - $this->uses = $subNodes['uses'] ?? []; - $returnType = $subNodes['returnType'] ?? null; - $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType; - $this->stmts = $subNodes['stmts'] ?? []; - $this->attrGroups = $subNodes['attrGroups'] ?? []; - } - - public function getSubNodeNames() : array { - return ['attrGroups', 'static', 'byRef', 'params', 'uses', 'returnType', 'stmts']; - } - - public function returnsByRef() : bool { - return $this->byRef; - } - - public function getParams() : array { - return $this->params; - } - - public function getReturnType() { - return $this->returnType; - } - - /** @return Node\Stmt[] */ - public function getStmts() : array { - return $this->stmts; - } - - public function getAttrGroups() : array { - return $this->attrGroups; - } - - public function getType() : string { - return 'Expr_Closure'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php deleted file mode 100644 index 2b8a096..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Expr; - -class ClosureUse extends Expr -{ - /** @var Expr\Variable Variable to use */ - public $var; - /** @var bool Whether to use by reference */ - public $byRef; - - /** - * Constructs a closure use node. - * - * @param Expr\Variable $var Variable to use - * @param bool $byRef Whether to use by reference - * @param array $attributes Additional attributes - */ - public function __construct(Expr\Variable $var, bool $byRef = false, array $attributes = []) { - $this->attributes = $attributes; - $this->var = $var; - $this->byRef = $byRef; - } - - public function getSubNodeNames() : array { - return ['var', 'byRef']; - } - - public function getType() : string { - return 'Expr_ClosureUse'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php deleted file mode 100644 index 14ebd16..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php +++ /dev/null @@ -1,31 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Expr; -use PhpParser\Node\Name; - -class ConstFetch extends Expr -{ - /** @var Name Constant name */ - public $name; - - /** - * Constructs a const fetch node. - * - * @param Name $name Constant name - * @param array $attributes Additional attributes - */ - public function __construct(Name $name, array $attributes = []) { - $this->attributes = $attributes; - $this->name = $name; - } - - public function getSubNodeNames() : array { - return ['name']; - } - - public function getType() : string { - return 'Expr_ConstFetch'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php deleted file mode 100644 index 4042ec9..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Expr; - -class Empty_ extends Expr -{ - /** @var Expr Expression */ - public $expr; - - /** - * Constructs an empty() node. - * - * @param Expr $expr Expression - * @param array $attributes Additional attributes - */ - public function __construct(Expr $expr, array $attributes = []) { - $this->attributes = $attributes; - $this->expr = $expr; - } - - public function getSubNodeNames() : array { - return ['expr']; - } - - public function getType() : string { - return 'Expr_Empty'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php deleted file mode 100644 index 1637f3a..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php +++ /dev/null @@ -1,31 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Expr; - -/** - * Error node used during parsing with error recovery. - * - * An error node may be placed at a position where an expression is required, but an error occurred. - * Error nodes will not be present if the parser is run in throwOnError mode (the default). - */ -class Error extends Expr -{ - /** - * Constructs an error node. - * - * @param array $attributes Additional attributes - */ - public function __construct(array $attributes = []) { - $this->attributes = $attributes; - } - - public function getSubNodeNames() : array { - return []; - } - - public function getType() : string { - return 'Expr_Error'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php deleted file mode 100644 index c44ff6f..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Expr; - -class ErrorSuppress extends Expr -{ - /** @var Expr Expression */ - public $expr; - - /** - * Constructs an error suppress node. - * - * @param Expr $expr Expression - * @param array $attributes Additional attributes - */ - public function __construct(Expr $expr, array $attributes = []) { - $this->attributes = $attributes; - $this->expr = $expr; - } - - public function getSubNodeNames() : array { - return ['expr']; - } - - public function getType() : string { - return 'Expr_ErrorSuppress'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php deleted file mode 100644 index 8568547..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Expr; - -class Eval_ extends Expr -{ - /** @var Expr Expression */ - public $expr; - - /** - * Constructs an eval() node. - * - * @param Expr $expr Expression - * @param array $attributes Additional attributes - */ - public function __construct(Expr $expr, array $attributes = []) { - $this->attributes = $attributes; - $this->expr = $expr; - } - - public function getSubNodeNames() : array { - return ['expr']; - } - - public function getType() : string { - return 'Expr_Eval'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php deleted file mode 100644 index 5469b8e..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Expr; - -class Exit_ extends Expr -{ - /* For use in "kind" attribute */ - const KIND_EXIT = 1; - const KIND_DIE = 2; - - /** @var null|Expr Expression */ - public $expr; - - /** - * Constructs an exit() node. - * - * @param null|Expr $expr Expression - * @param array $attributes Additional attributes - */ - public function __construct(?Expr $expr = null, array $attributes = []) { - $this->attributes = $attributes; - $this->expr = $expr; - } - - public function getSubNodeNames() : array { - return ['expr']; - } - - public function getType() : string { - return 'Expr_Exit'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php deleted file mode 100644 index 2de4d0d..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php +++ /dev/null @@ -1,39 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node; -use PhpParser\Node\Expr; - -class FuncCall extends CallLike -{ - /** @var Node\Name|Expr Function name */ - public $name; - /** @var array<Node\Arg|Node\VariadicPlaceholder> Arguments */ - public $args; - - /** - * Constructs a function call node. - * - * @param Node\Name|Expr $name Function name - * @param array<Node\Arg|Node\VariadicPlaceholder> $args Arguments - * @param array $attributes Additional attributes - */ - public function __construct($name, array $args = [], array $attributes = []) { - $this->attributes = $attributes; - $this->name = $name; - $this->args = $args; - } - - public function getSubNodeNames() : array { - return ['name', 'args']; - } - - public function getType() : string { - return 'Expr_FuncCall'; - } - - public function getRawArgs(): array { - return $this->args; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php deleted file mode 100644 index 07ce596..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php +++ /dev/null @@ -1,39 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Expr; - -class Include_ extends Expr -{ - const TYPE_INCLUDE = 1; - const TYPE_INCLUDE_ONCE = 2; - const TYPE_REQUIRE = 3; - const TYPE_REQUIRE_ONCE = 4; - - /** @var Expr Expression */ - public $expr; - /** @var int Type of include */ - public $type; - - /** - * Constructs an include node. - * - * @param Expr $expr Expression - * @param int $type Type of include - * @param array $attributes Additional attributes - */ - public function __construct(Expr $expr, int $type, array $attributes = []) { - $this->attributes = $attributes; - $this->expr = $expr; - $this->type = $type; - } - - public function getSubNodeNames() : array { - return ['expr', 'type']; - } - - public function getType() : string { - return 'Expr_Include'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php deleted file mode 100644 index 9000d47..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php +++ /dev/null @@ -1,35 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Expr; -use PhpParser\Node\Name; - -class Instanceof_ extends Expr -{ - /** @var Expr Expression */ - public $expr; - /** @var Name|Expr Class name */ - public $class; - - /** - * Constructs an instanceof check node. - * - * @param Expr $expr Expression - * @param Name|Expr $class Class name - * @param array $attributes Additional attributes - */ - public function __construct(Expr $expr, $class, array $attributes = []) { - $this->attributes = $attributes; - $this->expr = $expr; - $this->class = $class; - } - - public function getSubNodeNames() : array { - return ['expr', 'class']; - } - - public function getType() : string { - return 'Expr_Instanceof'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php deleted file mode 100644 index 76b7387..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Expr; - -class Isset_ extends Expr -{ - /** @var Expr[] Variables */ - public $vars; - - /** - * Constructs an array node. - * - * @param Expr[] $vars Variables - * @param array $attributes Additional attributes - */ - public function __construct(array $vars, array $attributes = []) { - $this->attributes = $attributes; - $this->vars = $vars; - } - - public function getSubNodeNames() : array { - return ['vars']; - } - - public function getType() : string { - return 'Expr_Isset'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php deleted file mode 100644 index c27a27b..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Expr; - -class List_ extends Expr -{ - /** @var (ArrayItem|null)[] List of items to assign to */ - public $items; - - /** - * Constructs a list() destructuring node. - * - * @param (ArrayItem|null)[] $items List of items to assign to - * @param array $attributes Additional attributes - */ - public function __construct(array $items, array $attributes = []) { - $this->attributes = $attributes; - $this->items = $items; - } - - public function getSubNodeNames() : array { - return ['items']; - } - - public function getType() : string { - return 'Expr_List'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.php deleted file mode 100644 index 2455a30..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.php +++ /dev/null @@ -1,31 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node; -use PhpParser\Node\MatchArm; - -class Match_ extends Node\Expr -{ - /** @var Node\Expr */ - public $cond; - /** @var MatchArm[] */ - public $arms; - - /** - * @param MatchArm[] $arms - */ - public function __construct(Node\Expr $cond, array $arms = [], array $attributes = []) { - $this->attributes = $attributes; - $this->cond = $cond; - $this->arms = $arms; - } - - public function getSubNodeNames() : array { - return ['cond', 'arms']; - } - - public function getType() : string { - return 'Expr_Match'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php deleted file mode 100644 index 49ca483..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php +++ /dev/null @@ -1,45 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Arg; -use PhpParser\Node\Expr; -use PhpParser\Node\Identifier; -use PhpParser\Node\VariadicPlaceholder; - -class MethodCall extends CallLike -{ - /** @var Expr Variable holding object */ - public $var; - /** @var Identifier|Expr Method name */ - public $name; - /** @var array<Arg|VariadicPlaceholder> Arguments */ - public $args; - - /** - * Constructs a function call node. - * - * @param Expr $var Variable holding object - * @param string|Identifier|Expr $name Method name - * @param array<Arg|VariadicPlaceholder> $args Arguments - * @param array $attributes Additional attributes - */ - public function __construct(Expr $var, $name, array $args = [], array $attributes = []) { - $this->attributes = $attributes; - $this->var = $var; - $this->name = \is_string($name) ? new Identifier($name) : $name; - $this->args = $args; - } - - public function getSubNodeNames() : array { - return ['var', 'name', 'args']; - } - - public function getType() : string { - return 'Expr_MethodCall'; - } - - public function getRawArgs(): array { - return $this->args; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php deleted file mode 100644 index e2bb649..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php +++ /dev/null @@ -1,41 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node; -use PhpParser\Node\Arg; -use PhpParser\Node\Expr; -use PhpParser\Node\VariadicPlaceholder; - -class New_ extends CallLike -{ - /** @var Node\Name|Expr|Node\Stmt\Class_ Class name */ - public $class; - /** @var array<Arg|VariadicPlaceholder> Arguments */ - public $args; - - /** - * Constructs a function call node. - * - * @param Node\Name|Expr|Node\Stmt\Class_ $class Class name (or class node for anonymous classes) - * @param array<Arg|VariadicPlaceholder> $args Arguments - * @param array $attributes Additional attributes - */ - public function __construct($class, array $args = [], array $attributes = []) { - $this->attributes = $attributes; - $this->class = $class; - $this->args = $args; - } - - public function getSubNodeNames() : array { - return ['class', 'args']; - } - - public function getType() : string { - return 'Expr_New'; - } - - public function getRawArgs(): array { - return $this->args; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.php deleted file mode 100644 index 07a571f..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.php +++ /dev/null @@ -1,45 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Arg; -use PhpParser\Node\Expr; -use PhpParser\Node\Identifier; -use PhpParser\Node\VariadicPlaceholder; - -class NullsafeMethodCall extends CallLike -{ - /** @var Expr Variable holding object */ - public $var; - /** @var Identifier|Expr Method name */ - public $name; - /** @var array<Arg|VariadicPlaceholder> Arguments */ - public $args; - - /** - * Constructs a nullsafe method call node. - * - * @param Expr $var Variable holding object - * @param string|Identifier|Expr $name Method name - * @param array<Arg|VariadicPlaceholder> $args Arguments - * @param array $attributes Additional attributes - */ - public function __construct(Expr $var, $name, array $args = [], array $attributes = []) { - $this->attributes = $attributes; - $this->var = $var; - $this->name = \is_string($name) ? new Identifier($name) : $name; - $this->args = $args; - } - - public function getSubNodeNames() : array { - return ['var', 'name', 'args']; - } - - public function getType() : string { - return 'Expr_NullsafeMethodCall'; - } - - public function getRawArgs(): array { - return $this->args; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.php deleted file mode 100644 index 9317eb3..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.php +++ /dev/null @@ -1,35 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Expr; -use PhpParser\Node\Identifier; - -class NullsafePropertyFetch extends Expr -{ - /** @var Expr Variable holding object */ - public $var; - /** @var Identifier|Expr Property name */ - public $name; - - /** - * Constructs a nullsafe property fetch node. - * - * @param Expr $var Variable holding object - * @param string|Identifier|Expr $name Property name - * @param array $attributes Additional attributes - */ - public function __construct(Expr $var, $name, array $attributes = []) { - $this->attributes = $attributes; - $this->var = $var; - $this->name = \is_string($name) ? new Identifier($name) : $name; - } - - public function getSubNodeNames() : array { - return ['var', 'name']; - } - - public function getType() : string { - return 'Expr_NullsafePropertyFetch'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php deleted file mode 100644 index 94d6c29..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Expr; - -class PostDec extends Expr -{ - /** @var Expr Variable */ - public $var; - - /** - * Constructs a post decrement node. - * - * @param Expr $var Variable - * @param array $attributes Additional attributes - */ - public function __construct(Expr $var, array $attributes = []) { - $this->attributes = $attributes; - $this->var = $var; - } - - public function getSubNodeNames() : array { - return ['var']; - } - - public function getType() : string { - return 'Expr_PostDec'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php deleted file mode 100644 index 005c443..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Expr; - -class PostInc extends Expr -{ - /** @var Expr Variable */ - public $var; - - /** - * Constructs a post increment node. - * - * @param Expr $var Variable - * @param array $attributes Additional attributes - */ - public function __construct(Expr $var, array $attributes = []) { - $this->attributes = $attributes; - $this->var = $var; - } - - public function getSubNodeNames() : array { - return ['var']; - } - - public function getType() : string { - return 'Expr_PostInc'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php deleted file mode 100644 index a5ca685..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Expr; - -class PreDec extends Expr -{ - /** @var Expr Variable */ - public $var; - - /** - * Constructs a pre decrement node. - * - * @param Expr $var Variable - * @param array $attributes Additional attributes - */ - public function __construct(Expr $var, array $attributes = []) { - $this->attributes = $attributes; - $this->var = $var; - } - - public function getSubNodeNames() : array { - return ['var']; - } - - public function getType() : string { - return 'Expr_PreDec'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php deleted file mode 100644 index 0986c44..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Expr; - -class PreInc extends Expr -{ - /** @var Expr Variable */ - public $var; - - /** - * Constructs a pre increment node. - * - * @param Expr $var Variable - * @param array $attributes Additional attributes - */ - public function __construct(Expr $var, array $attributes = []) { - $this->attributes = $attributes; - $this->var = $var; - } - - public function getSubNodeNames() : array { - return ['var']; - } - - public function getType() : string { - return 'Expr_PreInc'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php deleted file mode 100644 index 2d43c2a..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Expr; - -class Print_ extends Expr -{ - /** @var Expr Expression */ - public $expr; - - /** - * Constructs an print() node. - * - * @param Expr $expr Expression - * @param array $attributes Additional attributes - */ - public function __construct(Expr $expr, array $attributes = []) { - $this->attributes = $attributes; - $this->expr = $expr; - } - - public function getSubNodeNames() : array { - return ['expr']; - } - - public function getType() : string { - return 'Expr_Print'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php deleted file mode 100644 index 4281f31..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php +++ /dev/null @@ -1,35 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Expr; -use PhpParser\Node\Identifier; - -class PropertyFetch extends Expr -{ - /** @var Expr Variable holding object */ - public $var; - /** @var Identifier|Expr Property name */ - public $name; - - /** - * Constructs a function call node. - * - * @param Expr $var Variable holding object - * @param string|Identifier|Expr $name Property name - * @param array $attributes Additional attributes - */ - public function __construct(Expr $var, $name, array $attributes = []) { - $this->attributes = $attributes; - $this->var = $var; - $this->name = \is_string($name) ? new Identifier($name) : $name; - } - - public function getSubNodeNames() : array { - return ['var', 'name']; - } - - public function getType() : string { - return 'Expr_PropertyFetch'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php deleted file mode 100644 index 537a7cc..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Expr; - -class ShellExec extends Expr -{ - /** @var array Encapsed string array */ - public $parts; - - /** - * Constructs a shell exec (backtick) node. - * - * @param array $parts Encapsed string array - * @param array $attributes Additional attributes - */ - public function __construct(array $parts, array $attributes = []) { - $this->attributes = $attributes; - $this->parts = $parts; - } - - public function getSubNodeNames() : array { - return ['parts']; - } - - public function getType() : string { - return 'Expr_ShellExec'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php deleted file mode 100644 index d0d099c..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php +++ /dev/null @@ -1,46 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node; -use PhpParser\Node\Arg; -use PhpParser\Node\Expr; -use PhpParser\Node\Identifier; -use PhpParser\Node\VariadicPlaceholder; - -class StaticCall extends CallLike -{ - /** @var Node\Name|Expr Class name */ - public $class; - /** @var Identifier|Expr Method name */ - public $name; - /** @var array<Arg|VariadicPlaceholder> Arguments */ - public $args; - - /** - * Constructs a static method call node. - * - * @param Node\Name|Expr $class Class name - * @param string|Identifier|Expr $name Method name - * @param array<Arg|VariadicPlaceholder> $args Arguments - * @param array $attributes Additional attributes - */ - public function __construct($class, $name, array $args = [], array $attributes = []) { - $this->attributes = $attributes; - $this->class = $class; - $this->name = \is_string($name) ? new Identifier($name) : $name; - $this->args = $args; - } - - public function getSubNodeNames() : array { - return ['class', 'name', 'args']; - } - - public function getType() : string { - return 'Expr_StaticCall'; - } - - public function getRawArgs(): array { - return $this->args; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php deleted file mode 100644 index 1ee1a25..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php +++ /dev/null @@ -1,36 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Expr; -use PhpParser\Node\Name; -use PhpParser\Node\VarLikeIdentifier; - -class StaticPropertyFetch extends Expr -{ - /** @var Name|Expr Class name */ - public $class; - /** @var VarLikeIdentifier|Expr Property name */ - public $name; - - /** - * Constructs a static property fetch node. - * - * @param Name|Expr $class Class name - * @param string|VarLikeIdentifier|Expr $name Property name - * @param array $attributes Additional attributes - */ - public function __construct($class, $name, array $attributes = []) { - $this->attributes = $attributes; - $this->class = $class; - $this->name = \is_string($name) ? new VarLikeIdentifier($name) : $name; - } - - public function getSubNodeNames() : array { - return ['class', 'name']; - } - - public function getType() : string { - return 'Expr_StaticPropertyFetch'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php deleted file mode 100644 index 9316f47..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php +++ /dev/null @@ -1,38 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Expr; - -class Ternary extends Expr -{ - /** @var Expr Condition */ - public $cond; - /** @var null|Expr Expression for true */ - public $if; - /** @var Expr Expression for false */ - public $else; - - /** - * Constructs a ternary operator node. - * - * @param Expr $cond Condition - * @param null|Expr $if Expression for true - * @param Expr $else Expression for false - * @param array $attributes Additional attributes - */ - public function __construct(Expr $cond, $if, Expr $else, array $attributes = []) { - $this->attributes = $attributes; - $this->cond = $cond; - $this->if = $if; - $this->else = $else; - } - - public function getSubNodeNames() : array { - return ['cond', 'if', 'else']; - } - - public function getType() : string { - return 'Expr_Ternary'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.php deleted file mode 100644 index 5c97f0e..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node; - -class Throw_ extends Node\Expr -{ - /** @var Node\Expr Expression */ - public $expr; - - /** - * Constructs a throw expression node. - * - * @param Node\Expr $expr Expression - * @param array $attributes Additional attributes - */ - public function __construct(Node\Expr $expr, array $attributes = []) { - $this->attributes = $attributes; - $this->expr = $expr; - } - - public function getSubNodeNames() : array { - return ['expr']; - } - - public function getType() : string { - return 'Expr_Throw'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php deleted file mode 100644 index ce8808b..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Expr; - -class UnaryMinus extends Expr -{ - /** @var Expr Expression */ - public $expr; - - /** - * Constructs a unary minus node. - * - * @param Expr $expr Expression - * @param array $attributes Additional attributes - */ - public function __construct(Expr $expr, array $attributes = []) { - $this->attributes = $attributes; - $this->expr = $expr; - } - - public function getSubNodeNames() : array { - return ['expr']; - } - - public function getType() : string { - return 'Expr_UnaryMinus'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php deleted file mode 100644 index d23047e..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Expr; - -class UnaryPlus extends Expr -{ - /** @var Expr Expression */ - public $expr; - - /** - * Constructs a unary plus node. - * - * @param Expr $expr Expression - * @param array $attributes Additional attributes - */ - public function __construct(Expr $expr, array $attributes = []) { - $this->attributes = $attributes; - $this->expr = $expr; - } - - public function getSubNodeNames() : array { - return ['expr']; - } - - public function getType() : string { - return 'Expr_UnaryPlus'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php deleted file mode 100644 index b47d38e..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Expr; - -class Variable extends Expr -{ - /** @var string|Expr Name */ - public $name; - - /** - * Constructs a variable node. - * - * @param string|Expr $name Name - * @param array $attributes Additional attributes - */ - public function __construct($name, array $attributes = []) { - $this->attributes = $attributes; - $this->name = $name; - } - - public function getSubNodeNames() : array { - return ['name']; - } - - public function getType() : string { - return 'Expr_Variable'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php deleted file mode 100644 index a3efce6..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Expr; - -class YieldFrom extends Expr -{ - /** @var Expr Expression to yield from */ - public $expr; - - /** - * Constructs an "yield from" node. - * - * @param Expr $expr Expression - * @param array $attributes Additional attributes - */ - public function __construct(Expr $expr, array $attributes = []) { - $this->attributes = $attributes; - $this->expr = $expr; - } - - public function getSubNodeNames() : array { - return ['expr']; - } - - public function getType() : string { - return 'Expr_YieldFrom'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php deleted file mode 100644 index f15336e..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Expr; - -use PhpParser\Node\Expr; - -class Yield_ extends Expr -{ - /** @var null|Expr Key expression */ - public $key; - /** @var null|Expr Value expression */ - public $value; - - /** - * Constructs a yield expression node. - * - * @param null|Expr $value Value expression - * @param null|Expr $key Key expression - * @param array $attributes Additional attributes - */ - public function __construct(?Expr $value = null, ?Expr $key = null, array $attributes = []) { - $this->attributes = $attributes; - $this->key = $key; - $this->value = $value; - } - - public function getSubNodeNames() : array { - return ['key', 'value']; - } - - public function getType() : string { - return 'Expr_Yield'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php b/vendor/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php deleted file mode 100644 index 5a825e7..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php +++ /dev/null @@ -1,43 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node; - -use PhpParser\Node; - -interface FunctionLike extends Node -{ - /** - * Whether to return by reference - * - * @return bool - */ - public function returnsByRef() : bool; - - /** - * List of parameters - * - * @return Param[] - */ - public function getParams() : array; - - /** - * Get the declared return type or null - * - * @return null|Identifier|Name|ComplexType - */ - public function getReturnType(); - - /** - * The function body - * - * @return Stmt[]|null - */ - public function getStmts(); - - /** - * Get PHP attribute groups. - * - * @return AttributeGroup[] - */ - public function getAttrGroups() : array; -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Identifier.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Identifier.php deleted file mode 100644 index 2f262db..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Identifier.php +++ /dev/null @@ -1,75 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node; - -use PhpParser\NodeAbstract; - -/** - * Represents a non-namespaced name. Namespaced names are represented using Name nodes. - */ -class Identifier extends NodeAbstract -{ - /** @var string Identifier as string */ - public $name; - - private static $specialClassNames = [ - 'self' => true, - 'parent' => true, - 'static' => true, - ]; - - /** - * Constructs an identifier node. - * - * @param string $name Identifier as string - * @param array $attributes Additional attributes - */ - public function __construct(string $name, array $attributes = []) { - $this->attributes = $attributes; - $this->name = $name; - } - - public function getSubNodeNames() : array { - return ['name']; - } - - /** - * Get identifier as string. - * - * @return string Identifier as string. - */ - public function toString() : string { - return $this->name; - } - - /** - * Get lowercased identifier as string. - * - * @return string Lowercased identifier as string - */ - public function toLowerString() : string { - return strtolower($this->name); - } - - /** - * Checks whether the identifier is a special class name (self, parent or static). - * - * @return bool Whether identifier is a special class name - */ - public function isSpecialClassName() : bool { - return isset(self::$specialClassNames[strtolower($this->name)]); - } - - /** - * Get identifier as string. - * - * @return string Identifier as string - */ - public function __toString() : string { - return $this->name; - } - - public function getType() : string { - return 'Identifier'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php b/vendor/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php deleted file mode 100644 index 9208e13..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node; - -use PhpParser\NodeAbstract; - -class IntersectionType extends ComplexType -{ - /** @var (Identifier|Name)[] Types */ - public $types; - - /** - * Constructs an intersection type. - * - * @param (Identifier|Name)[] $types Types - * @param array $attributes Additional attributes - */ - public function __construct(array $types, array $attributes = []) { - $this->attributes = $attributes; - $this->types = $types; - } - - public function getSubNodeNames() : array { - return ['types']; - } - - public function getType() : string { - return 'IntersectionType'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/MatchArm.php b/vendor/nikic/php-parser/lib/PhpParser/Node/MatchArm.php deleted file mode 100644 index 2ae1c86..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/MatchArm.php +++ /dev/null @@ -1,31 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node; - -use PhpParser\Node; -use PhpParser\NodeAbstract; - -class MatchArm extends NodeAbstract -{ - /** @var null|Node\Expr[] */ - public $conds; - /** @var Node\Expr */ - public $body; - - /** - * @param null|Node\Expr[] $conds - */ - public function __construct($conds, Node\Expr $body, array $attributes = []) { - $this->conds = $conds; - $this->body = $body; - $this->attributes = $attributes; - } - - public function getSubNodeNames() : array { - return ['conds', 'body']; - } - - public function getType() : string { - return 'MatchArm'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Name.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Name.php deleted file mode 100644 index 0d6e4b1..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Name.php +++ /dev/null @@ -1,254 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node; - -use PhpParser\NodeAbstract; - -class Name extends NodeAbstract -{ - /** - * @var string[] Parts of the name - * @deprecated Use getParts() instead - */ - public $parts; - - private static $specialClassNames = [ - 'self' => true, - 'parent' => true, - 'static' => true, - ]; - - /** - * Constructs a name node. - * - * @param string|string[]|self $name Name as string, part array or Name instance (copy ctor) - * @param array $attributes Additional attributes - */ - public function __construct($name, array $attributes = []) { - $this->attributes = $attributes; - $this->parts = self::prepareName($name); - } - - public function getSubNodeNames() : array { - return ['parts']; - } - - /** - * Get parts of name (split by the namespace separator). - * - * @return string[] Parts of name - */ - public function getParts(): array { - return $this->parts; - } - - /** - * Gets the first part of the name, i.e. everything before the first namespace separator. - * - * @return string First part of the name - */ - public function getFirst() : string { - return $this->parts[0]; - } - - /** - * Gets the last part of the name, i.e. everything after the last namespace separator. - * - * @return string Last part of the name - */ - public function getLast() : string { - return $this->parts[count($this->parts) - 1]; - } - - /** - * Checks whether the name is unqualified. (E.g. Name) - * - * @return bool Whether the name is unqualified - */ - public function isUnqualified() : bool { - return 1 === count($this->parts); - } - - /** - * Checks whether the name is qualified. (E.g. Name\Name) - * - * @return bool Whether the name is qualified - */ - public function isQualified() : bool { - return 1 < count($this->parts); - } - - /** - * Checks whether the name is fully qualified. (E.g. \Name) - * - * @return bool Whether the name is fully qualified - */ - public function isFullyQualified() : bool { - return false; - } - - /** - * Checks whether the name is explicitly relative to the current namespace. (E.g. namespace\Name) - * - * @return bool Whether the name is relative - */ - public function isRelative() : bool { - return false; - } - - /** - * Returns a string representation of the name itself, without taking the name type into - * account (e.g., not including a leading backslash for fully qualified names). - * - * @return string String representation - */ - public function toString() : string { - return implode('\\', $this->parts); - } - - /** - * Returns a string representation of the name as it would occur in code (e.g., including - * leading backslash for fully qualified names. - * - * @return string String representation - */ - public function toCodeString() : string { - return $this->toString(); - } - - /** - * Returns lowercased string representation of the name, without taking the name type into - * account (e.g., no leading backslash for fully qualified names). - * - * @return string Lowercased string representation - */ - public function toLowerString() : string { - return strtolower(implode('\\', $this->parts)); - } - - /** - * Checks whether the identifier is a special class name (self, parent or static). - * - * @return bool Whether identifier is a special class name - */ - public function isSpecialClassName() : bool { - return count($this->parts) === 1 - && isset(self::$specialClassNames[strtolower($this->parts[0])]); - } - - /** - * Returns a string representation of the name by imploding the namespace parts with the - * namespace separator. - * - * @return string String representation - */ - public function __toString() : string { - return implode('\\', $this->parts); - } - - /** - * Gets a slice of a name (similar to array_slice). - * - * This method returns a new instance of the same type as the original and with the same - * attributes. - * - * If the slice is empty, null is returned. The null value will be correctly handled in - * concatenations using concat(). - * - * Offset and length have the same meaning as in array_slice(). - * - * @param int $offset Offset to start the slice at (may be negative) - * @param int|null $length Length of the slice (may be negative) - * - * @return static|null Sliced name - */ - public function slice(int $offset, ?int $length = null) { - $numParts = count($this->parts); - - $realOffset = $offset < 0 ? $offset + $numParts : $offset; - if ($realOffset < 0 || $realOffset > $numParts) { - throw new \OutOfBoundsException(sprintf('Offset %d is out of bounds', $offset)); - } - - if (null === $length) { - $realLength = $numParts - $realOffset; - } else { - $realLength = $length < 0 ? $length + $numParts - $realOffset : $length; - if ($realLength < 0 || $realLength > $numParts - $realOffset) { - throw new \OutOfBoundsException(sprintf('Length %d is out of bounds', $length)); - } - } - - if ($realLength === 0) { - // Empty slice is represented as null - return null; - } - - return new static(array_slice($this->parts, $realOffset, $realLength), $this->attributes); - } - - /** - * Concatenate two names, yielding a new Name instance. - * - * The type of the generated instance depends on which class this method is called on, for - * example Name\FullyQualified::concat() will yield a Name\FullyQualified instance. - * - * If one of the arguments is null, a new instance of the other name will be returned. If both - * arguments are null, null will be returned. As such, writing - * Name::concat($namespace, $shortName) - * where $namespace is a Name node or null will work as expected. - * - * @param string|string[]|self|null $name1 The first name - * @param string|string[]|self|null $name2 The second name - * @param array $attributes Attributes to assign to concatenated name - * - * @return static|null Concatenated name - */ - public static function concat($name1, $name2, array $attributes = []) { - if (null === $name1 && null === $name2) { - return null; - } elseif (null === $name1) { - return new static(self::prepareName($name2), $attributes); - } elseif (null === $name2) { - return new static(self::prepareName($name1), $attributes); - } else { - return new static( - array_merge(self::prepareName($name1), self::prepareName($name2)), $attributes - ); - } - } - - /** - * Prepares a (string, array or Name node) name for use in name changing methods by converting - * it to an array. - * - * @param string|string[]|self $name Name to prepare - * - * @return string[] Prepared name - */ - private static function prepareName($name) : array { - if (\is_string($name)) { - if ('' === $name) { - throw new \InvalidArgumentException('Name cannot be empty'); - } - - return explode('\\', $name); - } elseif (\is_array($name)) { - if (empty($name)) { - throw new \InvalidArgumentException('Name cannot be empty'); - } - - return $name; - } elseif ($name instanceof self) { - return $name->parts; - } - - throw new \InvalidArgumentException( - 'Expected string, array of parts or Name instance' - ); - } - - public function getType() : string { - return 'Name'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php deleted file mode 100644 index 1df93a5..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php +++ /dev/null @@ -1,50 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Name; - -class FullyQualified extends \PhpParser\Node\Name -{ - /** - * Checks whether the name is unqualified. (E.g. Name) - * - * @return bool Whether the name is unqualified - */ - public function isUnqualified() : bool { - return false; - } - - /** - * Checks whether the name is qualified. (E.g. Name\Name) - * - * @return bool Whether the name is qualified - */ - public function isQualified() : bool { - return false; - } - - /** - * Checks whether the name is fully qualified. (E.g. \Name) - * - * @return bool Whether the name is fully qualified - */ - public function isFullyQualified() : bool { - return true; - } - - /** - * Checks whether the name is explicitly relative to the current namespace. (E.g. namespace\Name) - * - * @return bool Whether the name is relative - */ - public function isRelative() : bool { - return false; - } - - public function toCodeString() : string { - return '\\' . $this->toString(); - } - - public function getType() : string { - return 'Name_FullyQualified'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php deleted file mode 100644 index 57bf7af..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php +++ /dev/null @@ -1,50 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Name; - -class Relative extends \PhpParser\Node\Name -{ - /** - * Checks whether the name is unqualified. (E.g. Name) - * - * @return bool Whether the name is unqualified - */ - public function isUnqualified() : bool { - return false; - } - - /** - * Checks whether the name is qualified. (E.g. Name\Name) - * - * @return bool Whether the name is qualified - */ - public function isQualified() : bool { - return false; - } - - /** - * Checks whether the name is fully qualified. (E.g. \Name) - * - * @return bool Whether the name is fully qualified - */ - public function isFullyQualified() : bool { - return false; - } - - /** - * Checks whether the name is explicitly relative to the current namespace. (E.g. namespace\Name) - * - * @return bool Whether the name is relative - */ - public function isRelative() : bool { - return true; - } - - public function toCodeString() : string { - return 'namespace\\' . $this->toString(); - } - - public function getType() : string { - return 'Name_Relative'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/NullableType.php b/vendor/nikic/php-parser/lib/PhpParser/Node/NullableType.php deleted file mode 100644 index d68e26a..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/NullableType.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node; - -class NullableType extends ComplexType -{ - /** @var Identifier|Name Type */ - public $type; - - /** - * Constructs a nullable type (wrapping another type). - * - * @param string|Identifier|Name $type Type - * @param array $attributes Additional attributes - */ - public function __construct($type, array $attributes = []) { - $this->attributes = $attributes; - $this->type = \is_string($type) ? new Identifier($type) : $type; - } - - public function getSubNodeNames() : array { - return ['type']; - } - - public function getType() : string { - return 'NullableType'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Param.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Param.php deleted file mode 100644 index dfb77f6..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Param.php +++ /dev/null @@ -1,60 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node; - -use PhpParser\NodeAbstract; - -class Param extends NodeAbstract -{ - /** @var null|Identifier|Name|ComplexType Type declaration */ - public $type; - /** @var bool Whether parameter is passed by reference */ - public $byRef; - /** @var bool Whether this is a variadic argument */ - public $variadic; - /** @var Expr\Variable|Expr\Error Parameter variable */ - public $var; - /** @var null|Expr Default value */ - public $default; - /** @var int */ - public $flags; - /** @var AttributeGroup[] PHP attribute groups */ - public $attrGroups; - - /** - * Constructs a parameter node. - * - * @param Expr\Variable|Expr\Error $var Parameter variable - * @param null|Expr $default Default value - * @param null|string|Identifier|Name|ComplexType $type Type declaration - * @param bool $byRef Whether is passed by reference - * @param bool $variadic Whether this is a variadic argument - * @param array $attributes Additional attributes - * @param int $flags Optional visibility flags - * @param AttributeGroup[] $attrGroups PHP attribute groups - */ - public function __construct( - $var, ?Expr $default = null, $type = null, - bool $byRef = false, bool $variadic = false, - array $attributes = [], - int $flags = 0, - array $attrGroups = [] - ) { - $this->attributes = $attributes; - $this->type = \is_string($type) ? new Identifier($type) : $type; - $this->byRef = $byRef; - $this->variadic = $variadic; - $this->var = $var; - $this->default = $default; - $this->flags = $flags; - $this->attrGroups = $attrGroups; - } - - public function getSubNodeNames() : array { - return ['attrGroups', 'flags', 'type', 'byRef', 'variadic', 'var', 'default']; - } - - public function getType() : string { - return 'Param'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar.php deleted file mode 100644 index 8117909..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node; - -abstract class Scalar extends Expr -{ -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php deleted file mode 100644 index 8a15c6f..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php +++ /dev/null @@ -1,77 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Scalar; - -use PhpParser\Node\Scalar; - -class DNumber extends Scalar -{ - /** @var float Number value */ - public $value; - - /** - * Constructs a float number scalar node. - * - * @param float $value Value of the number - * @param array $attributes Additional attributes - */ - public function __construct(float $value, array $attributes = []) { - $this->attributes = $attributes; - $this->value = $value; - } - - public function getSubNodeNames() : array { - return ['value']; - } - - /** - * @param mixed[] $attributes - */ - public static function fromString(string $str, array $attributes = []): DNumber - { - $attributes['rawValue'] = $str; - $float = self::parse($str); - - return new DNumber($float, $attributes); - } - - /** - * @internal - * - * Parses a DNUMBER token like PHP would. - * - * @param string $str A string number - * - * @return float The parsed number - */ - public static function parse(string $str) : float { - $str = str_replace('_', '', $str); - - // Check whether this is one of the special integer notations. - if ('0' === $str[0]) { - // hex - if ('x' === $str[1] || 'X' === $str[1]) { - return hexdec($str); - } - - // bin - if ('b' === $str[1] || 'B' === $str[1]) { - return bindec($str); - } - - // oct, but only if the string does not contain any of '.eE'. - if (false === strpbrk($str, '.eE')) { - // substr($str, 0, strcspn($str, '89')) cuts the string at the first invalid digit - // (8 or 9) so that only the digits before that are used. - return octdec(substr($str, 0, strcspn($str, '89'))); - } - } - - // dec - return (float) $str; - } - - public function getType() : string { - return 'Scalar_DNumber'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php deleted file mode 100644 index fa5d2e2..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php +++ /dev/null @@ -1,31 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Scalar; - -use PhpParser\Node\Expr; -use PhpParser\Node\Scalar; - -class Encapsed extends Scalar -{ - /** @var Expr[] list of string parts */ - public $parts; - - /** - * Constructs an encapsed string node. - * - * @param Expr[] $parts Encaps list - * @param array $attributes Additional attributes - */ - public function __construct(array $parts, array $attributes = []) { - $this->attributes = $attributes; - $this->parts = $parts; - } - - public function getSubNodeNames() : array { - return ['parts']; - } - - public function getType() : string { - return 'Scalar_Encapsed'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php deleted file mode 100644 index bb3194c..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Scalar; - -use PhpParser\Node\Scalar; - -class EncapsedStringPart extends Scalar -{ - /** @var string String value */ - public $value; - - /** - * Constructs a node representing a string part of an encapsed string. - * - * @param string $value String value - * @param array $attributes Additional attributes - */ - public function __construct(string $value, array $attributes = []) { - $this->attributes = $attributes; - $this->value = $value; - } - - public function getSubNodeNames() : array { - return ['value']; - } - - public function getType() : string { - return 'Scalar_EncapsedStringPart'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php deleted file mode 100644 index 2cc2b22..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php +++ /dev/null @@ -1,80 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Scalar; - -use PhpParser\Error; -use PhpParser\Node\Scalar; - -class LNumber extends Scalar -{ - /* For use in "kind" attribute */ - const KIND_BIN = 2; - const KIND_OCT = 8; - const KIND_DEC = 10; - const KIND_HEX = 16; - - /** @var int Number value */ - public $value; - - /** - * Constructs an integer number scalar node. - * - * @param int $value Value of the number - * @param array $attributes Additional attributes - */ - public function __construct(int $value, array $attributes = []) { - $this->attributes = $attributes; - $this->value = $value; - } - - public function getSubNodeNames() : array { - return ['value']; - } - - /** - * Constructs an LNumber node from a string number literal. - * - * @param string $str String number literal (decimal, octal, hex or binary) - * @param array $attributes Additional attributes - * @param bool $allowInvalidOctal Whether to allow invalid octal numbers (PHP 5) - * - * @return LNumber The constructed LNumber, including kind attribute - */ - public static function fromString(string $str, array $attributes = [], bool $allowInvalidOctal = false) : LNumber { - $attributes['rawValue'] = $str; - - $str = str_replace('_', '', $str); - - if ('0' !== $str[0] || '0' === $str) { - $attributes['kind'] = LNumber::KIND_DEC; - return new LNumber((int) $str, $attributes); - } - - if ('x' === $str[1] || 'X' === $str[1]) { - $attributes['kind'] = LNumber::KIND_HEX; - return new LNumber(hexdec($str), $attributes); - } - - if ('b' === $str[1] || 'B' === $str[1]) { - $attributes['kind'] = LNumber::KIND_BIN; - return new LNumber(bindec($str), $attributes); - } - - if (!$allowInvalidOctal && strpbrk($str, '89')) { - throw new Error('Invalid numeric literal', $attributes); - } - - // Strip optional explicit octal prefix. - if ('o' === $str[1] || 'O' === $str[1]) { - $str = substr($str, 2); - } - - // use intval instead of octdec to get proper cutting behavior with malformed numbers - $attributes['kind'] = LNumber::KIND_OCT; - return new LNumber(intval($str, 8), $attributes); - } - - public function getType() : string { - return 'Scalar_LNumber'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php deleted file mode 100644 index 941f0c7..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Scalar; - -use PhpParser\Node\Scalar; - -abstract class MagicConst extends Scalar -{ - /** - * Constructs a magic constant node. - * - * @param array $attributes Additional attributes - */ - public function __construct(array $attributes = []) { - $this->attributes = $attributes; - } - - public function getSubNodeNames() : array { - return []; - } - - /** - * Get name of magic constant. - * - * @return string Name of magic constant - */ - abstract public function getName() : string; -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php deleted file mode 100644 index 2443284..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Scalar\MagicConst; - -use PhpParser\Node\Scalar\MagicConst; - -class Class_ extends MagicConst -{ - public function getName() : string { - return '__CLASS__'; - } - - public function getType() : string { - return 'Scalar_MagicConst_Class'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Dir.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Dir.php deleted file mode 100644 index 2b61847..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Dir.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Scalar\MagicConst; - -use PhpParser\Node\Scalar\MagicConst; - -class Dir extends MagicConst -{ - public function getName() : string { - return '__DIR__'; - } - - public function getType() : string { - return 'Scalar_MagicConst_Dir'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/File.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/File.php deleted file mode 100644 index 3422db0..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/File.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Scalar\MagicConst; - -use PhpParser\Node\Scalar\MagicConst; - -class File extends MagicConst -{ - public function getName() : string { - return '__FILE__'; - } - - public function getType() : string { - return 'Scalar_MagicConst_File'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Function_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Function_.php deleted file mode 100644 index 1db65a1..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Function_.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Scalar\MagicConst; - -use PhpParser\Node\Scalar\MagicConst; - -class Function_ extends MagicConst -{ - public function getName() : string { - return '__FUNCTION__'; - } - - public function getType() : string { - return 'Scalar_MagicConst_Function'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.php deleted file mode 100644 index 25d3de5..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Scalar\MagicConst; - -use PhpParser\Node\Scalar\MagicConst; - -class Line extends MagicConst -{ - public function getName() : string { - return '__LINE__'; - } - - public function getType() : string { - return 'Scalar_MagicConst_Line'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.php deleted file mode 100644 index d168d56..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Scalar\MagicConst; - -use PhpParser\Node\Scalar\MagicConst; - -class Method extends MagicConst -{ - public function getName() : string { - return '__METHOD__'; - } - - public function getType() : string { - return 'Scalar_MagicConst_Method'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.php deleted file mode 100644 index 4fabb75..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Scalar\MagicConst; - -use PhpParser\Node\Scalar\MagicConst; - -class Namespace_ extends MagicConst -{ - public function getName() : string { - return '__NAMESPACE__'; - } - - public function getType() : string { - return 'Scalar_MagicConst_Namespace'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.php deleted file mode 100644 index 5ee7e40..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Scalar\MagicConst; - -use PhpParser\Node\Scalar\MagicConst; - -class Trait_ extends MagicConst -{ - public function getName() : string { - return '__TRAIT__'; - } - - public function getType() : string { - return 'Scalar_MagicConst_Trait'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php deleted file mode 100644 index df2f6c1..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php +++ /dev/null @@ -1,157 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Scalar; - -use PhpParser\Error; -use PhpParser\Node\Scalar; - -class String_ extends Scalar -{ - /* For use in "kind" attribute */ - const KIND_SINGLE_QUOTED = 1; - const KIND_DOUBLE_QUOTED = 2; - const KIND_HEREDOC = 3; - const KIND_NOWDOC = 4; - - /** @var string String value */ - public $value; - - protected static $replacements = [ - '\\' => '\\', - '$' => '$', - 'n' => "\n", - 'r' => "\r", - 't' => "\t", - 'f' => "\f", - 'v' => "\v", - 'e' => "\x1B", - ]; - - /** - * Constructs a string scalar node. - * - * @param string $value Value of the string - * @param array $attributes Additional attributes - */ - public function __construct(string $value, array $attributes = []) { - $this->attributes = $attributes; - $this->value = $value; - } - - public function getSubNodeNames() : array { - return ['value']; - } - - /** - * @param bool $parseUnicodeEscape Whether to parse PHP 7 \u escapes - */ - public static function fromString(string $str, array $attributes = [], bool $parseUnicodeEscape = true): self - { - $attributes['kind'] = ($str[0] === "'" || ($str[1] === "'" && ($str[0] === 'b' || $str[0] === 'B'))) - ? Scalar\String_::KIND_SINGLE_QUOTED - : Scalar\String_::KIND_DOUBLE_QUOTED; - - $attributes['rawValue'] = $str; - - $string = self::parse($str, $parseUnicodeEscape); - - return new self($string, $attributes); - } - - /** - * @internal - * - * Parses a string token. - * - * @param string $str String token content - * @param bool $parseUnicodeEscape Whether to parse PHP 7 \u escapes - * - * @return string The parsed string - */ - public static function parse(string $str, bool $parseUnicodeEscape = true) : string { - $bLength = 0; - if ('b' === $str[0] || 'B' === $str[0]) { - $bLength = 1; - } - - if ('\'' === $str[$bLength]) { - return str_replace( - ['\\\\', '\\\''], - ['\\', '\''], - substr($str, $bLength + 1, -1) - ); - } else { - return self::parseEscapeSequences( - substr($str, $bLength + 1, -1), '"', $parseUnicodeEscape - ); - } - } - - /** - * @internal - * - * Parses escape sequences in strings (all string types apart from single quoted). - * - * @param string $str String without quotes - * @param null|string $quote Quote type - * @param bool $parseUnicodeEscape Whether to parse PHP 7 \u escapes - * - * @return string String with escape sequences parsed - */ - public static function parseEscapeSequences(string $str, $quote, bool $parseUnicodeEscape = true) : string { - if (null !== $quote) { - $str = str_replace('\\' . $quote, $quote, $str); - } - - $extra = ''; - if ($parseUnicodeEscape) { - $extra = '|u\{([0-9a-fA-F]+)\}'; - } - - return preg_replace_callback( - '~\\\\([\\\\$nrtfve]|[xX][0-9a-fA-F]{1,2}|[0-7]{1,3}' . $extra . ')~', - function($matches) { - $str = $matches[1]; - - if (isset(self::$replacements[$str])) { - return self::$replacements[$str]; - } elseif ('x' === $str[0] || 'X' === $str[0]) { - return chr(hexdec(substr($str, 1))); - } elseif ('u' === $str[0]) { - return self::codePointToUtf8(hexdec($matches[2])); - } else { - return chr(octdec($str) & 255); - } - }, - $str - ); - } - - /** - * Converts a Unicode code point to its UTF-8 encoded representation. - * - * @param int $num Code point - * - * @return string UTF-8 representation of code point - */ - private static function codePointToUtf8(int $num) : string { - if ($num <= 0x7F) { - return chr($num); - } - if ($num <= 0x7FF) { - return chr(($num>>6) + 0xC0) . chr(($num&0x3F) + 0x80); - } - if ($num <= 0xFFFF) { - return chr(($num>>12) + 0xE0) . chr((($num>>6)&0x3F) + 0x80) . chr(($num&0x3F) + 0x80); - } - if ($num <= 0x1FFFFF) { - return chr(($num>>18) + 0xF0) . chr((($num>>12)&0x3F) + 0x80) - . chr((($num>>6)&0x3F) + 0x80) . chr(($num&0x3F) + 0x80); - } - throw new Error('Invalid UTF-8 codepoint escape sequence: Codepoint too large'); - } - - public function getType() : string { - return 'Scalar_String'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt.php deleted file mode 100644 index 69d33e5..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt.php +++ /dev/null @@ -1,9 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node; - -use PhpParser\NodeAbstract; - -abstract class Stmt extends NodeAbstract -{ -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php deleted file mode 100644 index d9464a1..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node; - -class Break_ extends Node\Stmt -{ - /** @var null|Node\Expr Number of loops to break */ - public $num; - - /** - * Constructs a break node. - * - * @param null|Node\Expr $num Number of loops to break - * @param array $attributes Additional attributes - */ - public function __construct(?Node\Expr $num = null, array $attributes = []) { - $this->attributes = $attributes; - $this->num = $num; - } - - public function getSubNodeNames() : array { - return ['num']; - } - - public function getType() : string { - return 'Stmt_Break'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php deleted file mode 100644 index 2bf044c..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node; - -class Case_ extends Node\Stmt -{ - /** @var null|Node\Expr Condition (null for default) */ - public $cond; - /** @var Node\Stmt[] Statements */ - public $stmts; - - /** - * Constructs a case node. - * - * @param null|Node\Expr $cond Condition (null for default) - * @param Node\Stmt[] $stmts Statements - * @param array $attributes Additional attributes - */ - public function __construct($cond, array $stmts = [], array $attributes = []) { - $this->attributes = $attributes; - $this->cond = $cond; - $this->stmts = $stmts; - } - - public function getSubNodeNames() : array { - return ['cond', 'stmts']; - } - - public function getType() : string { - return 'Stmt_Case'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php deleted file mode 100644 index 5d7b5c0..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php +++ /dev/null @@ -1,41 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node; -use PhpParser\Node\Expr; - -class Catch_ extends Node\Stmt -{ - /** @var Node\Name[] Types of exceptions to catch */ - public $types; - /** @var Expr\Variable|null Variable for exception */ - public $var; - /** @var Node\Stmt[] Statements */ - public $stmts; - - /** - * Constructs a catch node. - * - * @param Node\Name[] $types Types of exceptions to catch - * @param Expr\Variable|null $var Variable for exception - * @param Node\Stmt[] $stmts Statements - * @param array $attributes Additional attributes - */ - public function __construct( - array $types, ?Expr\Variable $var = null, array $stmts = [], array $attributes = [] - ) { - $this->attributes = $attributes; - $this->types = $types; - $this->var = $var; - $this->stmts = $stmts; - } - - public function getSubNodeNames() : array { - return ['types', 'var', 'stmts']; - } - - public function getType() : string { - return 'Stmt_Catch'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php deleted file mode 100644 index 8abaad6..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php +++ /dev/null @@ -1,85 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node; - -class ClassConst extends Node\Stmt -{ - /** @var int Modifiers */ - public $flags; - /** @var Node\Const_[] Constant declarations */ - public $consts; - /** @var Node\AttributeGroup[] PHP attribute groups */ - public $attrGroups; - /** @var Node\Identifier|Node\Name|Node\ComplexType|null Type declaration */ - public $type; - - /** - * Constructs a class const list node. - * - * @param Node\Const_[] $consts Constant declarations - * @param int $flags Modifiers - * @param array $attributes Additional attributes - * @param Node\AttributeGroup[] $attrGroups PHP attribute groups - * @param null|string|Node\Identifier|Node\Name|Node\ComplexType $type Type declaration - */ - public function __construct( - array $consts, - int $flags = 0, - array $attributes = [], - array $attrGroups = [], - $type = null - ) { - $this->attributes = $attributes; - $this->flags = $flags; - $this->consts = $consts; - $this->attrGroups = $attrGroups; - $this->type = \is_string($type) ? new Node\Identifier($type) : $type; - } - - public function getSubNodeNames() : array { - return ['attrGroups', 'flags', 'type', 'consts']; - } - - /** - * Whether constant is explicitly or implicitly public. - * - * @return bool - */ - public function isPublic() : bool { - return ($this->flags & Class_::MODIFIER_PUBLIC) !== 0 - || ($this->flags & Class_::VISIBILITY_MODIFIER_MASK) === 0; - } - - /** - * Whether constant is protected. - * - * @return bool - */ - public function isProtected() : bool { - return (bool) ($this->flags & Class_::MODIFIER_PROTECTED); - } - - /** - * Whether constant is private. - * - * @return bool - */ - public function isPrivate() : bool { - return (bool) ($this->flags & Class_::MODIFIER_PRIVATE); - } - - /** - * Whether constant is final. - * - * @return bool - */ - public function isFinal() : bool { - return (bool) ($this->flags & Class_::MODIFIER_FINAL); - } - - public function getType() : string { - return 'Stmt_ClassConst'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php deleted file mode 100644 index 2fa4e86..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php +++ /dev/null @@ -1,109 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node; - -abstract class ClassLike extends Node\Stmt -{ - /** @var Node\Identifier|null Name */ - public $name; - /** @var Node\Stmt[] Statements */ - public $stmts; - /** @var Node\AttributeGroup[] PHP attribute groups */ - public $attrGroups; - - /** @var Node\Name|null Namespaced name (if using NameResolver) */ - public $namespacedName; - - /** - * @return TraitUse[] - */ - public function getTraitUses() : array { - $traitUses = []; - foreach ($this->stmts as $stmt) { - if ($stmt instanceof TraitUse) { - $traitUses[] = $stmt; - } - } - return $traitUses; - } - - /** - * @return ClassConst[] - */ - public function getConstants() : array { - $constants = []; - foreach ($this->stmts as $stmt) { - if ($stmt instanceof ClassConst) { - $constants[] = $stmt; - } - } - return $constants; - } - - /** - * @return Property[] - */ - public function getProperties() : array { - $properties = []; - foreach ($this->stmts as $stmt) { - if ($stmt instanceof Property) { - $properties[] = $stmt; - } - } - return $properties; - } - - /** - * Gets property with the given name defined directly in this class/interface/trait. - * - * @param string $name Name of the property - * - * @return Property|null Property node or null if the property does not exist - */ - public function getProperty(string $name) { - foreach ($this->stmts as $stmt) { - if ($stmt instanceof Property) { - foreach ($stmt->props as $prop) { - if ($prop instanceof PropertyProperty && $name === $prop->name->toString()) { - return $stmt; - } - } - } - } - return null; - } - - /** - * Gets all methods defined directly in this class/interface/trait - * - * @return ClassMethod[] - */ - public function getMethods() : array { - $methods = []; - foreach ($this->stmts as $stmt) { - if ($stmt instanceof ClassMethod) { - $methods[] = $stmt; - } - } - return $methods; - } - - /** - * Gets method with the given name defined directly in this class/interface/trait. - * - * @param string $name Name of the method (compared case-insensitively) - * - * @return ClassMethod|null Method node or null if the method does not exist - */ - public function getMethod(string $name) { - $lowerName = strtolower($name); - foreach ($this->stmts as $stmt) { - if ($stmt instanceof ClassMethod && $lowerName === $stmt->name->toLowerString()) { - return $stmt; - } - } - return null; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php deleted file mode 100644 index 6e85161..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php +++ /dev/null @@ -1,161 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node; -use PhpParser\Node\FunctionLike; - -class ClassMethod extends Node\Stmt implements FunctionLike -{ - /** @var int Flags */ - public $flags; - /** @var bool Whether to return by reference */ - public $byRef; - /** @var Node\Identifier Name */ - public $name; - /** @var Node\Param[] Parameters */ - public $params; - /** @var null|Node\Identifier|Node\Name|Node\ComplexType Return type */ - public $returnType; - /** @var Node\Stmt[]|null Statements */ - public $stmts; - /** @var Node\AttributeGroup[] PHP attribute groups */ - public $attrGroups; - - private static $magicNames = [ - '__construct' => true, - '__destruct' => true, - '__call' => true, - '__callstatic' => true, - '__get' => true, - '__set' => true, - '__isset' => true, - '__unset' => true, - '__sleep' => true, - '__wakeup' => true, - '__tostring' => true, - '__set_state' => true, - '__clone' => true, - '__invoke' => true, - '__debuginfo' => true, - '__serialize' => true, - '__unserialize' => true, - ]; - - /** - * Constructs a class method node. - * - * @param string|Node\Identifier $name Name - * @param array $subNodes Array of the following optional subnodes: - * 'flags => MODIFIER_PUBLIC: Flags - * 'byRef' => false : Whether to return by reference - * 'params' => array() : Parameters - * 'returnType' => null : Return type - * 'stmts' => array() : Statements - * 'attrGroups' => array() : PHP attribute groups - * @param array $attributes Additional attributes - */ - public function __construct($name, array $subNodes = [], array $attributes = []) { - $this->attributes = $attributes; - $this->flags = $subNodes['flags'] ?? $subNodes['type'] ?? 0; - $this->byRef = $subNodes['byRef'] ?? false; - $this->name = \is_string($name) ? new Node\Identifier($name) : $name; - $this->params = $subNodes['params'] ?? []; - $returnType = $subNodes['returnType'] ?? null; - $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType; - $this->stmts = array_key_exists('stmts', $subNodes) ? $subNodes['stmts'] : []; - $this->attrGroups = $subNodes['attrGroups'] ?? []; - } - - public function getSubNodeNames() : array { - return ['attrGroups', 'flags', 'byRef', 'name', 'params', 'returnType', 'stmts']; - } - - public function returnsByRef() : bool { - return $this->byRef; - } - - public function getParams() : array { - return $this->params; - } - - public function getReturnType() { - return $this->returnType; - } - - public function getStmts() { - return $this->stmts; - } - - public function getAttrGroups() : array { - return $this->attrGroups; - } - - /** - * Whether the method is explicitly or implicitly public. - * - * @return bool - */ - public function isPublic() : bool { - return ($this->flags & Class_::MODIFIER_PUBLIC) !== 0 - || ($this->flags & Class_::VISIBILITY_MODIFIER_MASK) === 0; - } - - /** - * Whether the method is protected. - * - * @return bool - */ - public function isProtected() : bool { - return (bool) ($this->flags & Class_::MODIFIER_PROTECTED); - } - - /** - * Whether the method is private. - * - * @return bool - */ - public function isPrivate() : bool { - return (bool) ($this->flags & Class_::MODIFIER_PRIVATE); - } - - /** - * Whether the method is abstract. - * - * @return bool - */ - public function isAbstract() : bool { - return (bool) ($this->flags & Class_::MODIFIER_ABSTRACT); - } - - /** - * Whether the method is final. - * - * @return bool - */ - public function isFinal() : bool { - return (bool) ($this->flags & Class_::MODIFIER_FINAL); - } - - /** - * Whether the method is static. - * - * @return bool - */ - public function isStatic() : bool { - return (bool) ($this->flags & Class_::MODIFIER_STATIC); - } - - /** - * Whether the method is magic. - * - * @return bool - */ - public function isMagic() : bool { - return isset(self::$magicNames[$this->name->toLowerString()]); - } - - public function getType() : string { - return 'Stmt_ClassMethod'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php deleted file mode 100644 index 52ed6c6..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php +++ /dev/null @@ -1,137 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Error; -use PhpParser\Node; - -class Class_ extends ClassLike -{ - const MODIFIER_PUBLIC = 1; - const MODIFIER_PROTECTED = 2; - const MODIFIER_PRIVATE = 4; - const MODIFIER_STATIC = 8; - const MODIFIER_ABSTRACT = 16; - const MODIFIER_FINAL = 32; - const MODIFIER_READONLY = 64; - - const VISIBILITY_MODIFIER_MASK = 7; // 1 | 2 | 4 - - /** @var int Type */ - public $flags; - /** @var null|Node\Name Name of extended class */ - public $extends; - /** @var Node\Name[] Names of implemented interfaces */ - public $implements; - - /** - * Constructs a class node. - * - * @param string|Node\Identifier|null $name Name - * @param array $subNodes Array of the following optional subnodes: - * 'flags' => 0 : Flags - * 'extends' => null : Name of extended class - * 'implements' => array(): Names of implemented interfaces - * 'stmts' => array(): Statements - * 'attrGroups' => array(): PHP attribute groups - * @param array $attributes Additional attributes - */ - public function __construct($name, array $subNodes = [], array $attributes = []) { - $this->attributes = $attributes; - $this->flags = $subNodes['flags'] ?? $subNodes['type'] ?? 0; - $this->name = \is_string($name) ? new Node\Identifier($name) : $name; - $this->extends = $subNodes['extends'] ?? null; - $this->implements = $subNodes['implements'] ?? []; - $this->stmts = $subNodes['stmts'] ?? []; - $this->attrGroups = $subNodes['attrGroups'] ?? []; - } - - public function getSubNodeNames() : array { - return ['attrGroups', 'flags', 'name', 'extends', 'implements', 'stmts']; - } - - /** - * Whether the class is explicitly abstract. - * - * @return bool - */ - public function isAbstract() : bool { - return (bool) ($this->flags & self::MODIFIER_ABSTRACT); - } - - /** - * Whether the class is final. - * - * @return bool - */ - public function isFinal() : bool { - return (bool) ($this->flags & self::MODIFIER_FINAL); - } - - public function isReadonly() : bool { - return (bool) ($this->flags & self::MODIFIER_READONLY); - } - - /** - * Whether the class is anonymous. - * - * @return bool - */ - public function isAnonymous() : bool { - return null === $this->name; - } - - /** - * @internal - */ - public static function verifyClassModifier($a, $b) { - if ($a & self::MODIFIER_ABSTRACT && $b & self::MODIFIER_ABSTRACT) { - throw new Error('Multiple abstract modifiers are not allowed'); - } - - if ($a & self::MODIFIER_FINAL && $b & self::MODIFIER_FINAL) { - throw new Error('Multiple final modifiers are not allowed'); - } - - if ($a & self::MODIFIER_READONLY && $b & self::MODIFIER_READONLY) { - throw new Error('Multiple readonly modifiers are not allowed'); - } - - if ($a & 48 && $b & 48) { - throw new Error('Cannot use the final modifier on an abstract class'); - } - } - - /** - * @internal - */ - public static function verifyModifier($a, $b) { - if ($a & self::VISIBILITY_MODIFIER_MASK && $b & self::VISIBILITY_MODIFIER_MASK) { - throw new Error('Multiple access type modifiers are not allowed'); - } - - if ($a & self::MODIFIER_ABSTRACT && $b & self::MODIFIER_ABSTRACT) { - throw new Error('Multiple abstract modifiers are not allowed'); - } - - if ($a & self::MODIFIER_STATIC && $b & self::MODIFIER_STATIC) { - throw new Error('Multiple static modifiers are not allowed'); - } - - if ($a & self::MODIFIER_FINAL && $b & self::MODIFIER_FINAL) { - throw new Error('Multiple final modifiers are not allowed'); - } - - if ($a & self::MODIFIER_READONLY && $b & self::MODIFIER_READONLY) { - throw new Error('Multiple readonly modifiers are not allowed'); - } - - if ($a & 48 && $b & 48) { - throw new Error('Cannot use the final modifier on an abstract class member'); - } - } - - public function getType() : string { - return 'Stmt_Class'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php deleted file mode 100644 index e631634..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node; - -class Const_ extends Node\Stmt -{ - /** @var Node\Const_[] Constant declarations */ - public $consts; - - /** - * Constructs a const list node. - * - * @param Node\Const_[] $consts Constant declarations - * @param array $attributes Additional attributes - */ - public function __construct(array $consts, array $attributes = []) { - $this->attributes = $attributes; - $this->consts = $consts; - } - - public function getSubNodeNames() : array { - return ['consts']; - } - - public function getType() : string { - return 'Stmt_Const'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php deleted file mode 100644 index f2b30d7..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node; - -class Continue_ extends Node\Stmt -{ - /** @var null|Node\Expr Number of loops to continue */ - public $num; - - /** - * Constructs a continue node. - * - * @param null|Node\Expr $num Number of loops to continue - * @param array $attributes Additional attributes - */ - public function __construct(?Node\Expr $num = null, array $attributes = []) { - $this->attributes = $attributes; - $this->num = $num; - } - - public function getSubNodeNames() : array { - return ['num']; - } - - public function getType() : string { - return 'Stmt_Continue'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php deleted file mode 100644 index ac07f30..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node; - -class DeclareDeclare extends Node\Stmt -{ - /** @var Node\Identifier Key */ - public $key; - /** @var Node\Expr Value */ - public $value; - - /** - * Constructs a declare key=>value pair node. - * - * @param string|Node\Identifier $key Key - * @param Node\Expr $value Value - * @param array $attributes Additional attributes - */ - public function __construct($key, Node\Expr $value, array $attributes = []) { - $this->attributes = $attributes; - $this->key = \is_string($key) ? new Node\Identifier($key) : $key; - $this->value = $value; - } - - public function getSubNodeNames() : array { - return ['key', 'value']; - } - - public function getType() : string { - return 'Stmt_DeclareDeclare'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php deleted file mode 100644 index a3a5bfa..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node; - -class Declare_ extends Node\Stmt -{ - /** @var DeclareDeclare[] List of declares */ - public $declares; - /** @var Node\Stmt[]|null Statements */ - public $stmts; - - /** - * Constructs a declare node. - * - * @param DeclareDeclare[] $declares List of declares - * @param Node\Stmt[]|null $stmts Statements - * @param array $attributes Additional attributes - */ - public function __construct(array $declares, ?array $stmts = null, array $attributes = []) { - $this->attributes = $attributes; - $this->declares = $declares; - $this->stmts = $stmts; - } - - public function getSubNodeNames() : array { - return ['declares', 'stmts']; - } - - public function getType() : string { - return 'Stmt_Declare'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php deleted file mode 100644 index 78e90da..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node; - -class Do_ extends Node\Stmt -{ - /** @var Node\Stmt[] Statements */ - public $stmts; - /** @var Node\Expr Condition */ - public $cond; - - /** - * Constructs a do while node. - * - * @param Node\Expr $cond Condition - * @param Node\Stmt[] $stmts Statements - * @param array $attributes Additional attributes - */ - public function __construct(Node\Expr $cond, array $stmts = [], array $attributes = []) { - $this->attributes = $attributes; - $this->cond = $cond; - $this->stmts = $stmts; - } - - public function getSubNodeNames() : array { - return ['stmts', 'cond']; - } - - public function getType() : string { - return 'Stmt_Do'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php deleted file mode 100644 index 7cc50d5..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node; - -class Echo_ extends Node\Stmt -{ - /** @var Node\Expr[] Expressions */ - public $exprs; - - /** - * Constructs an echo node. - * - * @param Node\Expr[] $exprs Expressions - * @param array $attributes Additional attributes - */ - public function __construct(array $exprs, array $attributes = []) { - $this->attributes = $attributes; - $this->exprs = $exprs; - } - - public function getSubNodeNames() : array { - return ['exprs']; - } - - public function getType() : string { - return 'Stmt_Echo'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php deleted file mode 100644 index eef1ece..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node; - -class ElseIf_ extends Node\Stmt -{ - /** @var Node\Expr Condition */ - public $cond; - /** @var Node\Stmt[] Statements */ - public $stmts; - - /** - * Constructs an elseif node. - * - * @param Node\Expr $cond Condition - * @param Node\Stmt[] $stmts Statements - * @param array $attributes Additional attributes - */ - public function __construct(Node\Expr $cond, array $stmts = [], array $attributes = []) { - $this->attributes = $attributes; - $this->cond = $cond; - $this->stmts = $stmts; - } - - public function getSubNodeNames() : array { - return ['cond', 'stmts']; - } - - public function getType() : string { - return 'Stmt_ElseIf'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php deleted file mode 100644 index 0e61778..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node; - -class Else_ extends Node\Stmt -{ - /** @var Node\Stmt[] Statements */ - public $stmts; - - /** - * Constructs an else node. - * - * @param Node\Stmt[] $stmts Statements - * @param array $attributes Additional attributes - */ - public function __construct(array $stmts = [], array $attributes = []) { - $this->attributes = $attributes; - $this->stmts = $stmts; - } - - public function getSubNodeNames() : array { - return ['stmts']; - } - - public function getType() : string { - return 'Stmt_Else'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.php deleted file mode 100644 index 4b1079b..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.php +++ /dev/null @@ -1,37 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node; -use PhpParser\Node\AttributeGroup; - -class EnumCase extends Node\Stmt -{ - /** @var Node\Identifier Enum case name */ - public $name; - /** @var Node\Expr|null Enum case expression */ - public $expr; - /** @var Node\AttributeGroup[] PHP attribute groups */ - public $attrGroups; - - /** - * @param string|Node\Identifier $name Enum case name - * @param Node\Expr|null $expr Enum case expression - * @param AttributeGroup[] $attrGroups PHP attribute groups - * @param array $attributes Additional attributes - */ - public function __construct($name, ?Node\Expr $expr = null, array $attrGroups = [], array $attributes = []) { - parent::__construct($attributes); - $this->name = \is_string($name) ? new Node\Identifier($name) : $name; - $this->expr = $expr; - $this->attrGroups = $attrGroups; - } - - public function getSubNodeNames() : array { - return ['attrGroups', 'name', 'expr']; - } - - public function getType() : string { - return 'Stmt_EnumCase'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php deleted file mode 100644 index 3a50c22..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php +++ /dev/null @@ -1,40 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node; - -class Enum_ extends ClassLike -{ - /** @var null|Node\Identifier Scalar Type */ - public $scalarType; - /** @var Node\Name[] Names of implemented interfaces */ - public $implements; - - /** - * @param string|Node\Identifier|null $name Name - * @param array $subNodes Array of the following optional subnodes: - * 'scalarType' => null : Scalar type - * 'implements' => array() : Names of implemented interfaces - * 'stmts' => array() : Statements - * 'attrGroups' => array() : PHP attribute groups - * @param array $attributes Additional attributes - */ - public function __construct($name, array $subNodes = [], array $attributes = []) { - $this->name = \is_string($name) ? new Node\Identifier($name) : $name; - $this->scalarType = $subNodes['scalarType'] ?? null; - $this->implements = $subNodes['implements'] ?? []; - $this->stmts = $subNodes['stmts'] ?? []; - $this->attrGroups = $subNodes['attrGroups'] ?? []; - - parent::__construct($attributes); - } - - public function getSubNodeNames() : array { - return ['attrGroups', 'name', 'scalarType', 'implements', 'stmts']; - } - - public function getType() : string { - return 'Stmt_Enum'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php deleted file mode 100644 index 99d1687..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php +++ /dev/null @@ -1,33 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node; - -/** - * Represents statements of type "expr;" - */ -class Expression extends Node\Stmt -{ - /** @var Node\Expr Expression */ - public $expr; - - /** - * Constructs an expression statement. - * - * @param Node\Expr $expr Expression - * @param array $attributes Additional attributes - */ - public function __construct(Node\Expr $expr, array $attributes = []) { - $this->attributes = $attributes; - $this->expr = $expr; - } - - public function getSubNodeNames() : array { - return ['expr']; - } - - public function getType() : string { - return 'Stmt_Expression'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php deleted file mode 100644 index d55b8b6..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node; - -class Finally_ extends Node\Stmt -{ - /** @var Node\Stmt[] Statements */ - public $stmts; - - /** - * Constructs a finally node. - * - * @param Node\Stmt[] $stmts Statements - * @param array $attributes Additional attributes - */ - public function __construct(array $stmts = [], array $attributes = []) { - $this->attributes = $attributes; - $this->stmts = $stmts; - } - - public function getSubNodeNames() : array { - return ['stmts']; - } - - public function getType() : string { - return 'Stmt_Finally'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php deleted file mode 100644 index 1323d37..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php +++ /dev/null @@ -1,43 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node; - -class For_ extends Node\Stmt -{ - /** @var Node\Expr[] Init expressions */ - public $init; - /** @var Node\Expr[] Loop conditions */ - public $cond; - /** @var Node\Expr[] Loop expressions */ - public $loop; - /** @var Node\Stmt[] Statements */ - public $stmts; - - /** - * Constructs a for loop node. - * - * @param array $subNodes Array of the following optional subnodes: - * 'init' => array(): Init expressions - * 'cond' => array(): Loop conditions - * 'loop' => array(): Loop expressions - * 'stmts' => array(): Statements - * @param array $attributes Additional attributes - */ - public function __construct(array $subNodes = [], array $attributes = []) { - $this->attributes = $attributes; - $this->init = $subNodes['init'] ?? []; - $this->cond = $subNodes['cond'] ?? []; - $this->loop = $subNodes['loop'] ?? []; - $this->stmts = $subNodes['stmts'] ?? []; - } - - public function getSubNodeNames() : array { - return ['init', 'cond', 'loop', 'stmts']; - } - - public function getType() : string { - return 'Stmt_For'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php deleted file mode 100644 index 0556a7c..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php +++ /dev/null @@ -1,47 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node; - -class Foreach_ extends Node\Stmt -{ - /** @var Node\Expr Expression to iterate */ - public $expr; - /** @var null|Node\Expr Variable to assign key to */ - public $keyVar; - /** @var bool Whether to assign value by reference */ - public $byRef; - /** @var Node\Expr Variable to assign value to */ - public $valueVar; - /** @var Node\Stmt[] Statements */ - public $stmts; - - /** - * Constructs a foreach node. - * - * @param Node\Expr $expr Expression to iterate - * @param Node\Expr $valueVar Variable to assign value to - * @param array $subNodes Array of the following optional subnodes: - * 'keyVar' => null : Variable to assign key to - * 'byRef' => false : Whether to assign value by reference - * 'stmts' => array(): Statements - * @param array $attributes Additional attributes - */ - public function __construct(Node\Expr $expr, Node\Expr $valueVar, array $subNodes = [], array $attributes = []) { - $this->attributes = $attributes; - $this->expr = $expr; - $this->keyVar = $subNodes['keyVar'] ?? null; - $this->byRef = $subNodes['byRef'] ?? false; - $this->valueVar = $valueVar; - $this->stmts = $subNodes['stmts'] ?? []; - } - - public function getSubNodeNames() : array { - return ['expr', 'keyVar', 'byRef', 'valueVar', 'stmts']; - } - - public function getType() : string { - return 'Stmt_Foreach'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php deleted file mode 100644 index c2ccae2..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php +++ /dev/null @@ -1,77 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node; -use PhpParser\Node\FunctionLike; - -class Function_ extends Node\Stmt implements FunctionLike -{ - /** @var bool Whether function returns by reference */ - public $byRef; - /** @var Node\Identifier Name */ - public $name; - /** @var Node\Param[] Parameters */ - public $params; - /** @var null|Node\Identifier|Node\Name|Node\ComplexType Return type */ - public $returnType; - /** @var Node\Stmt[] Statements */ - public $stmts; - /** @var Node\AttributeGroup[] PHP attribute groups */ - public $attrGroups; - - /** @var Node\Name|null Namespaced name (if using NameResolver) */ - public $namespacedName; - - /** - * Constructs a function node. - * - * @param string|Node\Identifier $name Name - * @param array $subNodes Array of the following optional subnodes: - * 'byRef' => false : Whether to return by reference - * 'params' => array(): Parameters - * 'returnType' => null : Return type - * 'stmts' => array(): Statements - * 'attrGroups' => array(): PHP attribute groups - * @param array $attributes Additional attributes - */ - public function __construct($name, array $subNodes = [], array $attributes = []) { - $this->attributes = $attributes; - $this->byRef = $subNodes['byRef'] ?? false; - $this->name = \is_string($name) ? new Node\Identifier($name) : $name; - $this->params = $subNodes['params'] ?? []; - $returnType = $subNodes['returnType'] ?? null; - $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType; - $this->stmts = $subNodes['stmts'] ?? []; - $this->attrGroups = $subNodes['attrGroups'] ?? []; - } - - public function getSubNodeNames() : array { - return ['attrGroups', 'byRef', 'name', 'params', 'returnType', 'stmts']; - } - - public function returnsByRef() : bool { - return $this->byRef; - } - - public function getParams() : array { - return $this->params; - } - - public function getReturnType() { - return $this->returnType; - } - - public function getAttrGroups() : array { - return $this->attrGroups; - } - - /** @return Node\Stmt[] */ - public function getStmts() : array { - return $this->stmts; - } - - public function getType() : string { - return 'Stmt_Function'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php deleted file mode 100644 index a0022ad..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node; - -class Global_ extends Node\Stmt -{ - /** @var Node\Expr[] Variables */ - public $vars; - - /** - * Constructs a global variables list node. - * - * @param Node\Expr[] $vars Variables to unset - * @param array $attributes Additional attributes - */ - public function __construct(array $vars, array $attributes = []) { - $this->attributes = $attributes; - $this->vars = $vars; - } - - public function getSubNodeNames() : array { - return ['vars']; - } - - public function getType() : string { - return 'Stmt_Global'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php deleted file mode 100644 index 24a57f7..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php +++ /dev/null @@ -1,31 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node\Identifier; -use PhpParser\Node\Stmt; - -class Goto_ extends Stmt -{ - /** @var Identifier Name of label to jump to */ - public $name; - - /** - * Constructs a goto node. - * - * @param string|Identifier $name Name of label to jump to - * @param array $attributes Additional attributes - */ - public function __construct($name, array $attributes = []) { - $this->attributes = $attributes; - $this->name = \is_string($name) ? new Identifier($name) : $name; - } - - public function getSubNodeNames() : array { - return ['name']; - } - - public function getType() : string { - return 'Stmt_Goto'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php deleted file mode 100644 index 24520d2..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php +++ /dev/null @@ -1,39 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node\Name; -use PhpParser\Node\Stmt; - -class GroupUse extends Stmt -{ - /** @var int Type of group use */ - public $type; - /** @var Name Prefix for uses */ - public $prefix; - /** @var UseUse[] Uses */ - public $uses; - - /** - * Constructs a group use node. - * - * @param Name $prefix Prefix for uses - * @param UseUse[] $uses Uses - * @param int $type Type of group use - * @param array $attributes Additional attributes - */ - public function __construct(Name $prefix, array $uses, int $type = Use_::TYPE_NORMAL, array $attributes = []) { - $this->attributes = $attributes; - $this->type = $type; - $this->prefix = $prefix; - $this->uses = $uses; - } - - public function getSubNodeNames() : array { - return ['type', 'prefix', 'uses']; - } - - public function getType() : string { - return 'Stmt_GroupUse'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php deleted file mode 100644 index 8e624e0..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node\Stmt; - -class HaltCompiler extends Stmt -{ - /** @var string Remaining text after halt compiler statement. */ - public $remaining; - - /** - * Constructs a __halt_compiler node. - * - * @param string $remaining Remaining text after halt compiler statement. - * @param array $attributes Additional attributes - */ - public function __construct(string $remaining, array $attributes = []) { - $this->attributes = $attributes; - $this->remaining = $remaining; - } - - public function getSubNodeNames() : array { - return ['remaining']; - } - - public function getType() : string { - return 'Stmt_HaltCompiler'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php deleted file mode 100644 index a1bae4b..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php +++ /dev/null @@ -1,43 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node; - -class If_ extends Node\Stmt -{ - /** @var Node\Expr Condition expression */ - public $cond; - /** @var Node\Stmt[] Statements */ - public $stmts; - /** @var ElseIf_[] Elseif clauses */ - public $elseifs; - /** @var null|Else_ Else clause */ - public $else; - - /** - * Constructs an if node. - * - * @param Node\Expr $cond Condition - * @param array $subNodes Array of the following optional subnodes: - * 'stmts' => array(): Statements - * 'elseifs' => array(): Elseif clauses - * 'else' => null : Else clause - * @param array $attributes Additional attributes - */ - public function __construct(Node\Expr $cond, array $subNodes = [], array $attributes = []) { - $this->attributes = $attributes; - $this->cond = $cond; - $this->stmts = $subNodes['stmts'] ?? []; - $this->elseifs = $subNodes['elseifs'] ?? []; - $this->else = $subNodes['else'] ?? null; - } - - public function getSubNodeNames() : array { - return ['cond', 'stmts', 'elseifs', 'else']; - } - - public function getType() : string { - return 'Stmt_If'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php deleted file mode 100644 index 0711d28..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node\Stmt; - -class InlineHTML extends Stmt -{ - /** @var string String */ - public $value; - - /** - * Constructs an inline HTML node. - * - * @param string $value String - * @param array $attributes Additional attributes - */ - public function __construct(string $value, array $attributes = []) { - $this->attributes = $attributes; - $this->value = $value; - } - - public function getSubNodeNames() : array { - return ['value']; - } - - public function getType() : string { - return 'Stmt_InlineHTML'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php deleted file mode 100644 index 4d587dd..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php +++ /dev/null @@ -1,37 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node; - -class Interface_ extends ClassLike -{ - /** @var Node\Name[] Extended interfaces */ - public $extends; - - /** - * Constructs a class node. - * - * @param string|Node\Identifier $name Name - * @param array $subNodes Array of the following optional subnodes: - * 'extends' => array(): Name of extended interfaces - * 'stmts' => array(): Statements - * 'attrGroups' => array(): PHP attribute groups - * @param array $attributes Additional attributes - */ - public function __construct($name, array $subNodes = [], array $attributes = []) { - $this->attributes = $attributes; - $this->name = \is_string($name) ? new Node\Identifier($name) : $name; - $this->extends = $subNodes['extends'] ?? []; - $this->stmts = $subNodes['stmts'] ?? []; - $this->attrGroups = $subNodes['attrGroups'] ?? []; - } - - public function getSubNodeNames() : array { - return ['attrGroups', 'name', 'extends', 'stmts']; - } - - public function getType() : string { - return 'Stmt_Interface'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php deleted file mode 100644 index 3edcb3b..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php +++ /dev/null @@ -1,31 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node\Identifier; -use PhpParser\Node\Stmt; - -class Label extends Stmt -{ - /** @var Identifier Name */ - public $name; - - /** - * Constructs a label node. - * - * @param string|Identifier $name Name - * @param array $attributes Additional attributes - */ - public function __construct($name, array $attributes = []) { - $this->attributes = $attributes; - $this->name = \is_string($name) ? new Identifier($name) : $name; - } - - public function getSubNodeNames() : array { - return ['name']; - } - - public function getType() : string { - return 'Stmt_Label'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php deleted file mode 100644 index fc24916..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php +++ /dev/null @@ -1,38 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node; - -class Namespace_ extends Node\Stmt -{ - /* For use in the "kind" attribute */ - const KIND_SEMICOLON = 1; - const KIND_BRACED = 2; - - /** @var null|Node\Name Name */ - public $name; - /** @var Node\Stmt[] Statements */ - public $stmts; - - /** - * Constructs a namespace node. - * - * @param null|Node\Name $name Name - * @param null|Node\Stmt[] $stmts Statements - * @param array $attributes Additional attributes - */ - public function __construct(?Node\Name $name = null, $stmts = [], array $attributes = []) { - $this->attributes = $attributes; - $this->name = $name; - $this->stmts = $stmts; - } - - public function getSubNodeNames() : array { - return ['name', 'stmts']; - } - - public function getType() : string { - return 'Stmt_Namespace'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php deleted file mode 100644 index f86f8df..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php +++ /dev/null @@ -1,17 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node; - -/** Nop/empty statement (;). */ -class Nop extends Node\Stmt -{ - public function getSubNodeNames() : array { - return []; - } - - public function getType() : string { - return 'Stmt_Nop'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php deleted file mode 100644 index bc781bb..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php +++ /dev/null @@ -1,91 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node; -use PhpParser\Node\ComplexType; -use PhpParser\Node\Identifier; -use PhpParser\Node\Name; - -class Property extends Node\Stmt -{ - /** @var int Modifiers */ - public $flags; - /** @var PropertyProperty[] Properties */ - public $props; - /** @var null|Identifier|Name|ComplexType Type declaration */ - public $type; - /** @var Node\AttributeGroup[] PHP attribute groups */ - public $attrGroups; - - /** - * Constructs a class property list node. - * - * @param int $flags Modifiers - * @param PropertyProperty[] $props Properties - * @param array $attributes Additional attributes - * @param null|string|Identifier|Name|ComplexType $type Type declaration - * @param Node\AttributeGroup[] $attrGroups PHP attribute groups - */ - public function __construct(int $flags, array $props, array $attributes = [], $type = null, array $attrGroups = []) { - $this->attributes = $attributes; - $this->flags = $flags; - $this->props = $props; - $this->type = \is_string($type) ? new Identifier($type) : $type; - $this->attrGroups = $attrGroups; - } - - public function getSubNodeNames() : array { - return ['attrGroups', 'flags', 'type', 'props']; - } - - /** - * Whether the property is explicitly or implicitly public. - * - * @return bool - */ - public function isPublic() : bool { - return ($this->flags & Class_::MODIFIER_PUBLIC) !== 0 - || ($this->flags & Class_::VISIBILITY_MODIFIER_MASK) === 0; - } - - /** - * Whether the property is protected. - * - * @return bool - */ - public function isProtected() : bool { - return (bool) ($this->flags & Class_::MODIFIER_PROTECTED); - } - - /** - * Whether the property is private. - * - * @return bool - */ - public function isPrivate() : bool { - return (bool) ($this->flags & Class_::MODIFIER_PRIVATE); - } - - /** - * Whether the property is static. - * - * @return bool - */ - public function isStatic() : bool { - return (bool) ($this->flags & Class_::MODIFIER_STATIC); - } - - /** - * Whether the property is readonly. - * - * @return bool - */ - public function isReadonly() : bool { - return (bool) ($this->flags & Class_::MODIFIER_READONLY); - } - - public function getType() : string { - return 'Stmt_Property'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php deleted file mode 100644 index 286b429..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node; - -class PropertyProperty extends Node\Stmt -{ - /** @var Node\VarLikeIdentifier Name */ - public $name; - /** @var null|Node\Expr Default */ - public $default; - - /** - * Constructs a class property node. - * - * @param string|Node\VarLikeIdentifier $name Name - * @param null|Node\Expr $default Default value - * @param array $attributes Additional attributes - */ - public function __construct($name, ?Node\Expr $default = null, array $attributes = []) { - $this->attributes = $attributes; - $this->name = \is_string($name) ? new Node\VarLikeIdentifier($name) : $name; - $this->default = $default; - } - - public function getSubNodeNames() : array { - return ['name', 'default']; - } - - public function getType() : string { - return 'Stmt_PropertyProperty'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php deleted file mode 100644 index 5373125..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node; - -class Return_ extends Node\Stmt -{ - /** @var null|Node\Expr Expression */ - public $expr; - - /** - * Constructs a return node. - * - * @param null|Node\Expr $expr Expression - * @param array $attributes Additional attributes - */ - public function __construct(?Node\Expr $expr = null, array $attributes = []) { - $this->attributes = $attributes; - $this->expr = $expr; - } - - public function getSubNodeNames() : array { - return ['expr']; - } - - public function getType() : string { - return 'Stmt_Return'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php deleted file mode 100644 index 0cc47b4..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php +++ /dev/null @@ -1,37 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node; -use PhpParser\Node\Expr; - -class StaticVar extends Node\Stmt -{ - /** @var Expr\Variable Variable */ - public $var; - /** @var null|Node\Expr Default value */ - public $default; - - /** - * Constructs a static variable node. - * - * @param Expr\Variable $var Name - * @param null|Node\Expr $default Default value - * @param array $attributes Additional attributes - */ - public function __construct( - Expr\Variable $var, ?Node\Expr $default = null, array $attributes = [] - ) { - $this->attributes = $attributes; - $this->var = $var; - $this->default = $default; - } - - public function getSubNodeNames() : array { - return ['var', 'default']; - } - - public function getType() : string { - return 'Stmt_StaticVar'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php deleted file mode 100644 index 464898f..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node\Stmt; - -class Static_ extends Stmt -{ - /** @var StaticVar[] Variable definitions */ - public $vars; - - /** - * Constructs a static variables list node. - * - * @param StaticVar[] $vars Variable definitions - * @param array $attributes Additional attributes - */ - public function __construct(array $vars, array $attributes = []) { - $this->attributes = $attributes; - $this->vars = $vars; - } - - public function getSubNodeNames() : array { - return ['vars']; - } - - public function getType() : string { - return 'Stmt_Static'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php deleted file mode 100644 index 2c8dae0..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node; - -class Switch_ extends Node\Stmt -{ - /** @var Node\Expr Condition */ - public $cond; - /** @var Case_[] Case list */ - public $cases; - - /** - * Constructs a case node. - * - * @param Node\Expr $cond Condition - * @param Case_[] $cases Case list - * @param array $attributes Additional attributes - */ - public function __construct(Node\Expr $cond, array $cases, array $attributes = []) { - $this->attributes = $attributes; - $this->cond = $cond; - $this->cases = $cases; - } - - public function getSubNodeNames() : array { - return ['cond', 'cases']; - } - - public function getType() : string { - return 'Stmt_Switch'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php deleted file mode 100644 index a34e2b3..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node; - -class Throw_ extends Node\Stmt -{ - /** @var Node\Expr Expression */ - public $expr; - - /** - * Constructs a legacy throw statement node. - * - * @param Node\Expr $expr Expression - * @param array $attributes Additional attributes - */ - public function __construct(Node\Expr $expr, array $attributes = []) { - $this->attributes = $attributes; - $this->expr = $expr; - } - - public function getSubNodeNames() : array { - return ['expr']; - } - - public function getType() : string { - return 'Stmt_Throw'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php deleted file mode 100644 index 9e97053..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node; - -class TraitUse extends Node\Stmt -{ - /** @var Node\Name[] Traits */ - public $traits; - /** @var TraitUseAdaptation[] Adaptations */ - public $adaptations; - - /** - * Constructs a trait use node. - * - * @param Node\Name[] $traits Traits - * @param TraitUseAdaptation[] $adaptations Adaptations - * @param array $attributes Additional attributes - */ - public function __construct(array $traits, array $adaptations = [], array $attributes = []) { - $this->attributes = $attributes; - $this->traits = $traits; - $this->adaptations = $adaptations; - } - - public function getSubNodeNames() : array { - return ['traits', 'adaptations']; - } - - public function getType() : string { - return 'Stmt_TraitUse'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php deleted file mode 100644 index 8bdd2c0..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php +++ /dev/null @@ -1,13 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node; - -abstract class TraitUseAdaptation extends Node\Stmt -{ - /** @var Node\Name|null Trait name */ - public $trait; - /** @var Node\Identifier Method name */ - public $method; -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php deleted file mode 100644 index a3bccbd..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php +++ /dev/null @@ -1,38 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt\TraitUseAdaptation; - -use PhpParser\Node; - -class Alias extends Node\Stmt\TraitUseAdaptation -{ - /** @var null|int New modifier */ - public $newModifier; - /** @var null|Node\Identifier New name */ - public $newName; - - /** - * Constructs a trait use precedence adaptation node. - * - * @param null|Node\Name $trait Trait name - * @param string|Node\Identifier $method Method name - * @param null|int $newModifier New modifier - * @param null|string|Node\Identifier $newName New name - * @param array $attributes Additional attributes - */ - public function __construct($trait, $method, $newModifier, $newName, array $attributes = []) { - $this->attributes = $attributes; - $this->trait = $trait; - $this->method = \is_string($method) ? new Node\Identifier($method) : $method; - $this->newModifier = $newModifier; - $this->newName = \is_string($newName) ? new Node\Identifier($newName) : $newName; - } - - public function getSubNodeNames() : array { - return ['trait', 'method', 'newModifier', 'newName']; - } - - public function getType() : string { - return 'Stmt_TraitUseAdaptation_Alias'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php deleted file mode 100644 index 80385f6..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt\TraitUseAdaptation; - -use PhpParser\Node; - -class Precedence extends Node\Stmt\TraitUseAdaptation -{ - /** @var Node\Name[] Overwritten traits */ - public $insteadof; - - /** - * Constructs a trait use precedence adaptation node. - * - * @param Node\Name $trait Trait name - * @param string|Node\Identifier $method Method name - * @param Node\Name[] $insteadof Overwritten traits - * @param array $attributes Additional attributes - */ - public function __construct(Node\Name $trait, $method, array $insteadof, array $attributes = []) { - $this->attributes = $attributes; - $this->trait = $trait; - $this->method = \is_string($method) ? new Node\Identifier($method) : $method; - $this->insteadof = $insteadof; - } - - public function getSubNodeNames() : array { - return ['trait', 'method', 'insteadof']; - } - - public function getType() : string { - return 'Stmt_TraitUseAdaptation_Precedence'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php deleted file mode 100644 index 0cec203..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node; - -class Trait_ extends ClassLike -{ - /** - * Constructs a trait node. - * - * @param string|Node\Identifier $name Name - * @param array $subNodes Array of the following optional subnodes: - * 'stmts' => array(): Statements - * 'attrGroups' => array(): PHP attribute groups - * @param array $attributes Additional attributes - */ - public function __construct($name, array $subNodes = [], array $attributes = []) { - $this->attributes = $attributes; - $this->name = \is_string($name) ? new Node\Identifier($name) : $name; - $this->stmts = $subNodes['stmts'] ?? []; - $this->attrGroups = $subNodes['attrGroups'] ?? []; - } - - public function getSubNodeNames() : array { - return ['attrGroups', 'name', 'stmts']; - } - - public function getType() : string { - return 'Stmt_Trait'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php deleted file mode 100644 index 74e0043..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php +++ /dev/null @@ -1,38 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node; - -class TryCatch extends Node\Stmt -{ - /** @var Node\Stmt[] Statements */ - public $stmts; - /** @var Catch_[] Catches */ - public $catches; - /** @var null|Finally_ Optional finally node */ - public $finally; - - /** - * Constructs a try catch node. - * - * @param Node\Stmt[] $stmts Statements - * @param Catch_[] $catches Catches - * @param null|Finally_ $finally Optional finally node - * @param array $attributes Additional attributes - */ - public function __construct(array $stmts, array $catches, ?Finally_ $finally = null, array $attributes = []) { - $this->attributes = $attributes; - $this->stmts = $stmts; - $this->catches = $catches; - $this->finally = $finally; - } - - public function getSubNodeNames() : array { - return ['stmts', 'catches', 'finally']; - } - - public function getType() : string { - return 'Stmt_TryCatch'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php deleted file mode 100644 index 310e427..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node; - -class Unset_ extends Node\Stmt -{ - /** @var Node\Expr[] Variables to unset */ - public $vars; - - /** - * Constructs an unset node. - * - * @param Node\Expr[] $vars Variables to unset - * @param array $attributes Additional attributes - */ - public function __construct(array $vars, array $attributes = []) { - $this->attributes = $attributes; - $this->vars = $vars; - } - - public function getSubNodeNames() : array { - return ['vars']; - } - - public function getType() : string { - return 'Stmt_Unset'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php deleted file mode 100644 index 32bd784..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php +++ /dev/null @@ -1,52 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node; -use PhpParser\Node\Identifier; - -class UseUse extends Node\Stmt -{ - /** @var int One of the Stmt\Use_::TYPE_* constants. Will only differ from TYPE_UNKNOWN for mixed group uses */ - public $type; - /** @var Node\Name Namespace, class, function or constant to alias */ - public $name; - /** @var Identifier|null Alias */ - public $alias; - - /** - * Constructs an alias (use) node. - * - * @param Node\Name $name Namespace/Class to alias - * @param null|string|Identifier $alias Alias - * @param int $type Type of the use element (for mixed group use only) - * @param array $attributes Additional attributes - */ - public function __construct(Node\Name $name, $alias = null, int $type = Use_::TYPE_UNKNOWN, array $attributes = []) { - $this->attributes = $attributes; - $this->type = $type; - $this->name = $name; - $this->alias = \is_string($alias) ? new Identifier($alias) : $alias; - } - - public function getSubNodeNames() : array { - return ['type', 'name', 'alias']; - } - - /** - * Get alias. If not explicitly given this is the last component of the used name. - * - * @return Identifier - */ - public function getAlias() : Identifier { - if (null !== $this->alias) { - return $this->alias; - } - - return new Identifier($this->name->getLast()); - } - - public function getType() : string { - return 'Stmt_UseUse'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php deleted file mode 100644 index 8753da3..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php +++ /dev/null @@ -1,47 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node\Stmt; - -class Use_ extends Stmt -{ - /** - * Unknown type. Both Stmt\Use_ / Stmt\GroupUse and Stmt\UseUse have a $type property, one of them will always be - * TYPE_UNKNOWN while the other has one of the three other possible types. For normal use statements the type on the - * Stmt\UseUse is unknown. It's only the other way around for mixed group use declarations. - */ - const TYPE_UNKNOWN = 0; - /** Class or namespace import */ - const TYPE_NORMAL = 1; - /** Function import */ - const TYPE_FUNCTION = 2; - /** Constant import */ - const TYPE_CONSTANT = 3; - - /** @var int Type of alias */ - public $type; - /** @var UseUse[] Aliases */ - public $uses; - - /** - * Constructs an alias (use) list node. - * - * @param UseUse[] $uses Aliases - * @param int $type Type of alias - * @param array $attributes Additional attributes - */ - public function __construct(array $uses, int $type = self::TYPE_NORMAL, array $attributes = []) { - $this->attributes = $attributes; - $this->type = $type; - $this->uses = $uses; - } - - public function getSubNodeNames() : array { - return ['type', 'uses']; - } - - public function getType() : string { - return 'Stmt_Use'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php deleted file mode 100644 index f41034f..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node\Stmt; - -use PhpParser\Node; - -class While_ extends Node\Stmt -{ - /** @var Node\Expr Condition */ - public $cond; - /** @var Node\Stmt[] Statements */ - public $stmts; - - /** - * Constructs a while node. - * - * @param Node\Expr $cond Condition - * @param Node\Stmt[] $stmts Statements - * @param array $attributes Additional attributes - */ - public function __construct(Node\Expr $cond, array $stmts = [], array $attributes = []) { - $this->attributes = $attributes; - $this->cond = $cond; - $this->stmts = $stmts; - } - - public function getSubNodeNames() : array { - return ['cond', 'stmts']; - } - - public function getType() : string { - return 'Stmt_While'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/UnionType.php b/vendor/nikic/php-parser/lib/PhpParser/Node/UnionType.php deleted file mode 100644 index 93cecd2..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/UnionType.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node; - -class UnionType extends ComplexType -{ - /** @var (Identifier|Name|IntersectionType)[] Types */ - public $types; - - /** - * Constructs a union type. - * - * @param (Identifier|Name|IntersectionType)[] $types Types - * @param array $attributes Additional attributes - */ - public function __construct(array $types, array $attributes = []) { - $this->attributes = $attributes; - $this->types = $types; - } - - public function getSubNodeNames() : array { - return ['types']; - } - - public function getType() : string { - return 'UnionType'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php b/vendor/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php deleted file mode 100644 index a30807a..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php +++ /dev/null @@ -1,17 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node; - -/** - * Represents a name that is written in source code with a leading dollar, - * but is not a proper variable. The leading dollar is not stored as part of the name. - * - * Examples: Names in property declarations are formatted as variables. Names in static property - * lookups are also formatted as variables. - */ -class VarLikeIdentifier extends Identifier -{ - public function getType() : string { - return 'VarLikeIdentifier'; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/VariadicPlaceholder.php b/vendor/nikic/php-parser/lib/PhpParser/Node/VariadicPlaceholder.php deleted file mode 100644 index 403a24d..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/VariadicPlaceholder.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Node; - -use PhpParser\NodeAbstract; - -/** - * Represents the "..." in "foo(...)" of the first-class callable syntax. - */ -class VariadicPlaceholder extends NodeAbstract { - /** - * Create a variadic argument placeholder (first-class callable syntax). - * - * @param array $attributes Additional attributes - */ - public function __construct(array $attributes = []) { - $this->attributes = $attributes; - } - - public function getType(): string { - return 'VariadicPlaceholder'; - } - - public function getSubNodeNames(): array { - return []; - } -} \ No newline at end of file diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeAbstract.php b/vendor/nikic/php-parser/lib/PhpParser/NodeAbstract.php deleted file mode 100644 index 04514da..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/NodeAbstract.php +++ /dev/null @@ -1,178 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser; - -abstract class NodeAbstract implements Node, \JsonSerializable -{ - protected $attributes; - - /** - * Creates a Node. - * - * @param array $attributes Array of attributes - */ - public function __construct(array $attributes = []) { - $this->attributes = $attributes; - } - - /** - * Gets line the node started in (alias of getStartLine). - * - * @return int Start line (or -1 if not available) - */ - public function getLine() : int { - return $this->attributes['startLine'] ?? -1; - } - - /** - * Gets line the node started in. - * - * Requires the 'startLine' attribute to be enabled in the lexer (enabled by default). - * - * @return int Start line (or -1 if not available) - */ - public function getStartLine() : int { - return $this->attributes['startLine'] ?? -1; - } - - /** - * Gets the line the node ended in. - * - * Requires the 'endLine' attribute to be enabled in the lexer (enabled by default). - * - * @return int End line (or -1 if not available) - */ - public function getEndLine() : int { - return $this->attributes['endLine'] ?? -1; - } - - /** - * Gets the token offset of the first token that is part of this node. - * - * The offset is an index into the array returned by Lexer::getTokens(). - * - * Requires the 'startTokenPos' attribute to be enabled in the lexer (DISABLED by default). - * - * @return int Token start position (or -1 if not available) - */ - public function getStartTokenPos() : int { - return $this->attributes['startTokenPos'] ?? -1; - } - - /** - * Gets the token offset of the last token that is part of this node. - * - * The offset is an index into the array returned by Lexer::getTokens(). - * - * Requires the 'endTokenPos' attribute to be enabled in the lexer (DISABLED by default). - * - * @return int Token end position (or -1 if not available) - */ - public function getEndTokenPos() : int { - return $this->attributes['endTokenPos'] ?? -1; - } - - /** - * Gets the file offset of the first character that is part of this node. - * - * Requires the 'startFilePos' attribute to be enabled in the lexer (DISABLED by default). - * - * @return int File start position (or -1 if not available) - */ - public function getStartFilePos() : int { - return $this->attributes['startFilePos'] ?? -1; - } - - /** - * Gets the file offset of the last character that is part of this node. - * - * Requires the 'endFilePos' attribute to be enabled in the lexer (DISABLED by default). - * - * @return int File end position (or -1 if not available) - */ - public function getEndFilePos() : int { - return $this->attributes['endFilePos'] ?? -1; - } - - /** - * Gets all comments directly preceding this node. - * - * The comments are also available through the "comments" attribute. - * - * @return Comment[] - */ - public function getComments() : array { - return $this->attributes['comments'] ?? []; - } - - /** - * Gets the doc comment of the node. - * - * @return null|Comment\Doc Doc comment object or null - */ - public function getDocComment() { - $comments = $this->getComments(); - for ($i = count($comments) - 1; $i >= 0; $i--) { - $comment = $comments[$i]; - if ($comment instanceof Comment\Doc) { - return $comment; - } - } - - return null; - } - - /** - * Sets the doc comment of the node. - * - * This will either replace an existing doc comment or add it to the comments array. - * - * @param Comment\Doc $docComment Doc comment to set - */ - public function setDocComment(Comment\Doc $docComment) { - $comments = $this->getComments(); - for ($i = count($comments) - 1; $i >= 0; $i--) { - if ($comments[$i] instanceof Comment\Doc) { - // Replace existing doc comment. - $comments[$i] = $docComment; - $this->setAttribute('comments', $comments); - return; - } - } - - // Append new doc comment. - $comments[] = $docComment; - $this->setAttribute('comments', $comments); - } - - public function setAttribute(string $key, $value) { - $this->attributes[$key] = $value; - } - - public function hasAttribute(string $key) : bool { - return array_key_exists($key, $this->attributes); - } - - public function getAttribute(string $key, $default = null) { - if (array_key_exists($key, $this->attributes)) { - return $this->attributes[$key]; - } - - return $default; - } - - public function getAttributes() : array { - return $this->attributes; - } - - public function setAttributes(array $attributes) { - $this->attributes = $attributes; - } - - /** - * @return array - */ - public function jsonSerialize() : array { - return ['nodeType' => $this->getType()] + get_object_vars($this); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeDumper.php b/vendor/nikic/php-parser/lib/PhpParser/NodeDumper.php deleted file mode 100644 index e0c7f78..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/NodeDumper.php +++ /dev/null @@ -1,206 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser; - -use PhpParser\Node\Expr\Include_; -use PhpParser\Node\Stmt\Class_; -use PhpParser\Node\Stmt\GroupUse; -use PhpParser\Node\Stmt\Use_; -use PhpParser\Node\Stmt\UseUse; - -class NodeDumper -{ - private $dumpComments; - private $dumpPositions; - private $code; - - /** - * Constructs a NodeDumper. - * - * Supported options: - * * bool dumpComments: Whether comments should be dumped. - * * bool dumpPositions: Whether line/offset information should be dumped. To dump offset - * information, the code needs to be passed to dump(). - * - * @param array $options Options (see description) - */ - public function __construct(array $options = []) { - $this->dumpComments = !empty($options['dumpComments']); - $this->dumpPositions = !empty($options['dumpPositions']); - } - - /** - * Dumps a node or array. - * - * @param array|Node $node Node or array to dump - * @param string|null $code Code corresponding to dumped AST. This only needs to be passed if - * the dumpPositions option is enabled and the dumping of node offsets - * is desired. - * - * @return string Dumped value - */ - public function dump($node, ?string $code = null) : string { - $this->code = $code; - return $this->dumpRecursive($node); - } - - protected function dumpRecursive($node) { - if ($node instanceof Node) { - $r = $node->getType(); - if ($this->dumpPositions && null !== $p = $this->dumpPosition($node)) { - $r .= $p; - } - $r .= '('; - - foreach ($node->getSubNodeNames() as $key) { - $r .= "\n " . $key . ': '; - - $value = $node->$key; - if (null === $value) { - $r .= 'null'; - } elseif (false === $value) { - $r .= 'false'; - } elseif (true === $value) { - $r .= 'true'; - } elseif (is_scalar($value)) { - if ('flags' === $key || 'newModifier' === $key) { - $r .= $this->dumpFlags($value); - } elseif ('type' === $key && $node instanceof Include_) { - $r .= $this->dumpIncludeType($value); - } elseif ('type' === $key - && ($node instanceof Use_ || $node instanceof UseUse || $node instanceof GroupUse)) { - $r .= $this->dumpUseType($value); - } else { - $r .= $value; - } - } else { - $r .= str_replace("\n", "\n ", $this->dumpRecursive($value)); - } - } - - if ($this->dumpComments && $comments = $node->getComments()) { - $r .= "\n comments: " . str_replace("\n", "\n ", $this->dumpRecursive($comments)); - } - } elseif (is_array($node)) { - $r = 'array('; - - foreach ($node as $key => $value) { - $r .= "\n " . $key . ': '; - - if (null === $value) { - $r .= 'null'; - } elseif (false === $value) { - $r .= 'false'; - } elseif (true === $value) { - $r .= 'true'; - } elseif (is_scalar($value)) { - $r .= $value; - } else { - $r .= str_replace("\n", "\n ", $this->dumpRecursive($value)); - } - } - } elseif ($node instanceof Comment) { - return $node->getReformattedText(); - } else { - throw new \InvalidArgumentException('Can only dump nodes and arrays.'); - } - - return $r . "\n)"; - } - - protected function dumpFlags($flags) { - $strs = []; - if ($flags & Class_::MODIFIER_PUBLIC) { - $strs[] = 'MODIFIER_PUBLIC'; - } - if ($flags & Class_::MODIFIER_PROTECTED) { - $strs[] = 'MODIFIER_PROTECTED'; - } - if ($flags & Class_::MODIFIER_PRIVATE) { - $strs[] = 'MODIFIER_PRIVATE'; - } - if ($flags & Class_::MODIFIER_ABSTRACT) { - $strs[] = 'MODIFIER_ABSTRACT'; - } - if ($flags & Class_::MODIFIER_STATIC) { - $strs[] = 'MODIFIER_STATIC'; - } - if ($flags & Class_::MODIFIER_FINAL) { - $strs[] = 'MODIFIER_FINAL'; - } - if ($flags & Class_::MODIFIER_READONLY) { - $strs[] = 'MODIFIER_READONLY'; - } - - if ($strs) { - return implode(' | ', $strs) . ' (' . $flags . ')'; - } else { - return $flags; - } - } - - protected function dumpIncludeType($type) { - $map = [ - Include_::TYPE_INCLUDE => 'TYPE_INCLUDE', - Include_::TYPE_INCLUDE_ONCE => 'TYPE_INCLUDE_ONCE', - Include_::TYPE_REQUIRE => 'TYPE_REQUIRE', - Include_::TYPE_REQUIRE_ONCE => 'TYPE_REQUIRE_ONCE', - ]; - - if (!isset($map[$type])) { - return $type; - } - return $map[$type] . ' (' . $type . ')'; - } - - protected function dumpUseType($type) { - $map = [ - Use_::TYPE_UNKNOWN => 'TYPE_UNKNOWN', - Use_::TYPE_NORMAL => 'TYPE_NORMAL', - Use_::TYPE_FUNCTION => 'TYPE_FUNCTION', - Use_::TYPE_CONSTANT => 'TYPE_CONSTANT', - ]; - - if (!isset($map[$type])) { - return $type; - } - return $map[$type] . ' (' . $type . ')'; - } - - /** - * Dump node position, if possible. - * - * @param Node $node Node for which to dump position - * - * @return string|null Dump of position, or null if position information not available - */ - protected function dumpPosition(Node $node) { - if (!$node->hasAttribute('startLine') || !$node->hasAttribute('endLine')) { - return null; - } - - $start = $node->getStartLine(); - $end = $node->getEndLine(); - if ($node->hasAttribute('startFilePos') && $node->hasAttribute('endFilePos') - && null !== $this->code - ) { - $start .= ':' . $this->toColumn($this->code, $node->getStartFilePos()); - $end .= ':' . $this->toColumn($this->code, $node->getEndFilePos()); - } - return "[$start - $end]"; - } - - // Copied from Error class - private function toColumn($code, $pos) { - if ($pos > strlen($code)) { - throw new \RuntimeException('Invalid position information'); - } - - $lineStartPos = strrpos($code, "\n", $pos - strlen($code)); - if (false === $lineStartPos) { - $lineStartPos = -1; - } - - return $pos - $lineStartPos; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeFinder.php b/vendor/nikic/php-parser/lib/PhpParser/NodeFinder.php deleted file mode 100644 index 2e7cfda..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/NodeFinder.php +++ /dev/null @@ -1,81 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser; - -use PhpParser\NodeVisitor\FindingVisitor; -use PhpParser\NodeVisitor\FirstFindingVisitor; - -class NodeFinder -{ - /** - * Find all nodes satisfying a filter callback. - * - * @param Node|Node[] $nodes Single node or array of nodes to search in - * @param callable $filter Filter callback: function(Node $node) : bool - * - * @return Node[] Found nodes satisfying the filter callback - */ - public function find($nodes, callable $filter) : array { - if (!is_array($nodes)) { - $nodes = [$nodes]; - } - - $visitor = new FindingVisitor($filter); - - $traverser = new NodeTraverser; - $traverser->addVisitor($visitor); - $traverser->traverse($nodes); - - return $visitor->getFoundNodes(); - } - - /** - * Find all nodes that are instances of a certain class. - * - * @param Node|Node[] $nodes Single node or array of nodes to search in - * @param string $class Class name - * - * @return Node[] Found nodes (all instances of $class) - */ - public function findInstanceOf($nodes, string $class) : array { - return $this->find($nodes, function ($node) use ($class) { - return $node instanceof $class; - }); - } - - /** - * Find first node satisfying a filter callback. - * - * @param Node|Node[] $nodes Single node or array of nodes to search in - * @param callable $filter Filter callback: function(Node $node) : bool - * - * @return null|Node Found node (or null if none found) - */ - public function findFirst($nodes, callable $filter) { - if (!is_array($nodes)) { - $nodes = [$nodes]; - } - - $visitor = new FirstFindingVisitor($filter); - - $traverser = new NodeTraverser; - $traverser->addVisitor($visitor); - $traverser->traverse($nodes); - - return $visitor->getFoundNode(); - } - - /** - * Find first node that is an instance of a certain class. - * - * @param Node|Node[] $nodes Single node or array of nodes to search in - * @param string $class Class name - * - * @return null|Node Found node, which is an instance of $class (or null if none found) - */ - public function findFirstInstanceOf($nodes, string $class) { - return $this->findFirst($nodes, function ($node) use ($class) { - return $node instanceof $class; - }); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php b/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php deleted file mode 100644 index 97d45bd..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php +++ /dev/null @@ -1,291 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser; - -class NodeTraverser implements NodeTraverserInterface -{ - /** - * If NodeVisitor::enterNode() returns DONT_TRAVERSE_CHILDREN, child nodes - * of the current node will not be traversed for any visitors. - * - * For subsequent visitors enterNode() will still be called on the current - * node and leaveNode() will also be invoked for the current node. - */ - const DONT_TRAVERSE_CHILDREN = 1; - - /** - * If NodeVisitor::enterNode() or NodeVisitor::leaveNode() returns - * STOP_TRAVERSAL, traversal is aborted. - * - * The afterTraverse() method will still be invoked. - */ - const STOP_TRAVERSAL = 2; - - /** - * If NodeVisitor::leaveNode() returns REMOVE_NODE for a node that occurs - * in an array, it will be removed from the array. - * - * For subsequent visitors leaveNode() will still be invoked for the - * removed node. - */ - const REMOVE_NODE = 3; - - /** - * If NodeVisitor::enterNode() returns DONT_TRAVERSE_CURRENT_AND_CHILDREN, child nodes - * of the current node will not be traversed for any visitors. - * - * For subsequent visitors enterNode() will not be called as well. - * leaveNode() will be invoked for visitors that has enterNode() method invoked. - */ - const DONT_TRAVERSE_CURRENT_AND_CHILDREN = 4; - - /** @var NodeVisitor[] Visitors */ - protected $visitors = []; - - /** @var bool Whether traversal should be stopped */ - protected $stopTraversal; - - public function __construct() { - // for BC - } - - /** - * Adds a visitor. - * - * @param NodeVisitor $visitor Visitor to add - */ - public function addVisitor(NodeVisitor $visitor) { - $this->visitors[] = $visitor; - } - - /** - * Removes an added visitor. - * - * @param NodeVisitor $visitor - */ - public function removeVisitor(NodeVisitor $visitor) { - foreach ($this->visitors as $index => $storedVisitor) { - if ($storedVisitor === $visitor) { - unset($this->visitors[$index]); - break; - } - } - } - - /** - * Traverses an array of nodes using the registered visitors. - * - * @param Node[] $nodes Array of nodes - * - * @return Node[] Traversed array of nodes - */ - public function traverse(array $nodes) : array { - $this->stopTraversal = false; - - foreach ($this->visitors as $visitor) { - if (null !== $return = $visitor->beforeTraverse($nodes)) { - $nodes = $return; - } - } - - $nodes = $this->traverseArray($nodes); - - foreach ($this->visitors as $visitor) { - if (null !== $return = $visitor->afterTraverse($nodes)) { - $nodes = $return; - } - } - - return $nodes; - } - - /** - * Recursively traverse a node. - * - * @param Node $node Node to traverse. - * - * @return Node Result of traversal (may be original node or new one) - */ - protected function traverseNode(Node $node) : Node { - foreach ($node->getSubNodeNames() as $name) { - $subNode =& $node->$name; - - if (\is_array($subNode)) { - $subNode = $this->traverseArray($subNode); - if ($this->stopTraversal) { - break; - } - } elseif ($subNode instanceof Node) { - $traverseChildren = true; - $breakVisitorIndex = null; - - foreach ($this->visitors as $visitorIndex => $visitor) { - $return = $visitor->enterNode($subNode); - if (null !== $return) { - if ($return instanceof Node) { - $this->ensureReplacementReasonable($subNode, $return); - $subNode = $return; - } elseif (self::DONT_TRAVERSE_CHILDREN === $return) { - $traverseChildren = false; - } elseif (self::DONT_TRAVERSE_CURRENT_AND_CHILDREN === $return) { - $traverseChildren = false; - $breakVisitorIndex = $visitorIndex; - break; - } elseif (self::STOP_TRAVERSAL === $return) { - $this->stopTraversal = true; - break 2; - } else { - throw new \LogicException( - 'enterNode() returned invalid value of type ' . gettype($return) - ); - } - } - } - - if ($traverseChildren) { - $subNode = $this->traverseNode($subNode); - if ($this->stopTraversal) { - break; - } - } - - foreach ($this->visitors as $visitorIndex => $visitor) { - $return = $visitor->leaveNode($subNode); - - if (null !== $return) { - if ($return instanceof Node) { - $this->ensureReplacementReasonable($subNode, $return); - $subNode = $return; - } elseif (self::STOP_TRAVERSAL === $return) { - $this->stopTraversal = true; - break 2; - } elseif (\is_array($return)) { - throw new \LogicException( - 'leaveNode() may only return an array ' . - 'if the parent structure is an array' - ); - } else { - throw new \LogicException( - 'leaveNode() returned invalid value of type ' . gettype($return) - ); - } - } - - if ($breakVisitorIndex === $visitorIndex) { - break; - } - } - } - } - - return $node; - } - - /** - * Recursively traverse array (usually of nodes). - * - * @param array $nodes Array to traverse - * - * @return array Result of traversal (may be original array or changed one) - */ - protected function traverseArray(array $nodes) : array { - $doNodes = []; - - foreach ($nodes as $i => &$node) { - if ($node instanceof Node) { - $traverseChildren = true; - $breakVisitorIndex = null; - - foreach ($this->visitors as $visitorIndex => $visitor) { - $return = $visitor->enterNode($node); - if (null !== $return) { - if ($return instanceof Node) { - $this->ensureReplacementReasonable($node, $return); - $node = $return; - } elseif (self::DONT_TRAVERSE_CHILDREN === $return) { - $traverseChildren = false; - } elseif (self::DONT_TRAVERSE_CURRENT_AND_CHILDREN === $return) { - $traverseChildren = false; - $breakVisitorIndex = $visitorIndex; - break; - } elseif (self::STOP_TRAVERSAL === $return) { - $this->stopTraversal = true; - break 2; - } else { - throw new \LogicException( - 'enterNode() returned invalid value of type ' . gettype($return) - ); - } - } - } - - if ($traverseChildren) { - $node = $this->traverseNode($node); - if ($this->stopTraversal) { - break; - } - } - - foreach ($this->visitors as $visitorIndex => $visitor) { - $return = $visitor->leaveNode($node); - - if (null !== $return) { - if ($return instanceof Node) { - $this->ensureReplacementReasonable($node, $return); - $node = $return; - } elseif (\is_array($return)) { - $doNodes[] = [$i, $return]; - break; - } elseif (self::REMOVE_NODE === $return) { - $doNodes[] = [$i, []]; - break; - } elseif (self::STOP_TRAVERSAL === $return) { - $this->stopTraversal = true; - break 2; - } elseif (false === $return) { - throw new \LogicException( - 'bool(false) return from leaveNode() no longer supported. ' . - 'Return NodeTraverser::REMOVE_NODE instead' - ); - } else { - throw new \LogicException( - 'leaveNode() returned invalid value of type ' . gettype($return) - ); - } - } - - if ($breakVisitorIndex === $visitorIndex) { - break; - } - } - } elseif (\is_array($node)) { - throw new \LogicException('Invalid node structure: Contains nested arrays'); - } - } - - if (!empty($doNodes)) { - while (list($i, $replace) = array_pop($doNodes)) { - array_splice($nodes, $i, 1, $replace); - } - } - - return $nodes; - } - - private function ensureReplacementReasonable($old, $new) { - if ($old instanceof Node\Stmt && $new instanceof Node\Expr) { - throw new \LogicException( - "Trying to replace statement ({$old->getType()}) " . - "with expression ({$new->getType()}). Are you missing a " . - "Stmt_Expression wrapper?" - ); - } - - if ($old instanceof Node\Expr && $new instanceof Node\Stmt) { - throw new \LogicException( - "Trying to replace expression ({$old->getType()}) " . - "with statement ({$new->getType()})" - ); - } - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php b/vendor/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php deleted file mode 100644 index 77ff3d2..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php +++ /dev/null @@ -1,29 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser; - -interface NodeTraverserInterface -{ - /** - * Adds a visitor. - * - * @param NodeVisitor $visitor Visitor to add - */ - public function addVisitor(NodeVisitor $visitor); - - /** - * Removes an added visitor. - * - * @param NodeVisitor $visitor - */ - public function removeVisitor(NodeVisitor $visitor); - - /** - * Traverses an array of nodes using the registered visitors. - * - * @param Node[] $nodes Array of nodes - * - * @return Node[] Traversed array of nodes - */ - public function traverse(array $nodes) : array; -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor.php b/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor.php deleted file mode 100644 index f1f7f3e..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor.php +++ /dev/null @@ -1,72 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser; - -interface NodeVisitor -{ - /** - * Called once before traversal. - * - * Return value semantics: - * * null: $nodes stays as-is - * * otherwise: $nodes is set to the return value - * - * @param Node[] $nodes Array of nodes - * - * @return null|Node[] Array of nodes - */ - public function beforeTraverse(array $nodes); - - /** - * Called when entering a node. - * - * Return value semantics: - * * null - * => $node stays as-is - * * NodeTraverser::DONT_TRAVERSE_CHILDREN - * => Children of $node are not traversed. $node stays as-is - * * NodeTraverser::STOP_TRAVERSAL - * => Traversal is aborted. $node stays as-is - * * otherwise - * => $node is set to the return value - * - * @param Node $node Node - * - * @return null|int|Node Replacement node (or special return value) - */ - public function enterNode(Node $node); - - /** - * Called when leaving a node. - * - * Return value semantics: - * * null - * => $node stays as-is - * * NodeTraverser::REMOVE_NODE - * => $node is removed from the parent array - * * NodeTraverser::STOP_TRAVERSAL - * => Traversal is aborted. $node stays as-is - * * array (of Nodes) - * => The return value is merged into the parent array (at the position of the $node) - * * otherwise - * => $node is set to the return value - * - * @param Node $node Node - * - * @return null|int|Node|Node[] Replacement node (or special return value) - */ - public function leaveNode(Node $node); - - /** - * Called once after traversal. - * - * Return value semantics: - * * null: $nodes stays as-is - * * otherwise: $nodes is set to the return value - * - * @param Node[] $nodes Array of nodes - * - * @return null|Node[] Array of nodes - */ - public function afterTraverse(array $nodes); -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php b/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php deleted file mode 100644 index a85fa49..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php +++ /dev/null @@ -1,20 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\NodeVisitor; - -use PhpParser\Node; -use PhpParser\NodeVisitorAbstract; - -/** - * Visitor cloning all nodes and linking to the original nodes using an attribute. - * - * This visitor is required to perform format-preserving pretty prints. - */ -class CloningVisitor extends NodeVisitorAbstract -{ - public function enterNode(Node $origNode) { - $node = clone $origNode; - $node->setAttribute('origNode', $origNode); - return $node; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php b/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php deleted file mode 100644 index 9531edb..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php +++ /dev/null @@ -1,48 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\NodeVisitor; - -use PhpParser\Node; -use PhpParser\NodeVisitorAbstract; - -/** - * This visitor can be used to find and collect all nodes satisfying some criterion determined by - * a filter callback. - */ -class FindingVisitor extends NodeVisitorAbstract -{ - /** @var callable Filter callback */ - protected $filterCallback; - /** @var Node[] Found nodes */ - protected $foundNodes; - - public function __construct(callable $filterCallback) { - $this->filterCallback = $filterCallback; - } - - /** - * Get found nodes satisfying the filter callback. - * - * Nodes are returned in pre-order. - * - * @return Node[] Found nodes - */ - public function getFoundNodes() : array { - return $this->foundNodes; - } - - public function beforeTraverse(array $nodes) { - $this->foundNodes = []; - - return null; - } - - public function enterNode(Node $node) { - $filterCallback = $this->filterCallback; - if ($filterCallback($node)) { - $this->foundNodes[] = $node; - } - - return null; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php b/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php deleted file mode 100644 index 596a7d7..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php +++ /dev/null @@ -1,50 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\NodeVisitor; - -use PhpParser\Node; -use PhpParser\NodeTraverser; -use PhpParser\NodeVisitorAbstract; - -/** - * This visitor can be used to find the first node satisfying some criterion determined by - * a filter callback. - */ -class FirstFindingVisitor extends NodeVisitorAbstract -{ - /** @var callable Filter callback */ - protected $filterCallback; - /** @var null|Node Found node */ - protected $foundNode; - - public function __construct(callable $filterCallback) { - $this->filterCallback = $filterCallback; - } - - /** - * Get found node satisfying the filter callback. - * - * Returns null if no node satisfies the filter callback. - * - * @return null|Node Found node (or null if not found) - */ - public function getFoundNode() { - return $this->foundNode; - } - - public function beforeTraverse(array $nodes) { - $this->foundNode = null; - - return null; - } - - public function enterNode(Node $node) { - $filterCallback = $this->filterCallback; - if ($filterCallback($node)) { - $this->foundNode = $node; - return NodeTraverser::STOP_TRAVERSAL; - } - - return null; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php b/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php deleted file mode 100644 index dd2e9ca..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php +++ /dev/null @@ -1,260 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\NodeVisitor; - -use PhpParser\ErrorHandler; -use PhpParser\NameContext; -use PhpParser\Node; -use PhpParser\Node\Expr; -use PhpParser\Node\Name; -use PhpParser\Node\Name\FullyQualified; -use PhpParser\Node\Stmt; -use PhpParser\NodeVisitorAbstract; - -class NameResolver extends NodeVisitorAbstract -{ - /** @var NameContext Naming context */ - protected $nameContext; - - /** @var bool Whether to preserve original names */ - protected $preserveOriginalNames; - - /** @var bool Whether to replace resolved nodes in place, or to add resolvedNode attributes */ - protected $replaceNodes; - - /** - * Constructs a name resolution visitor. - * - * Options: - * * preserveOriginalNames (default false): An "originalName" attribute will be added to - * all name nodes that underwent resolution. - * * replaceNodes (default true): Resolved names are replaced in-place. Otherwise, a - * resolvedName attribute is added. (Names that cannot be statically resolved receive a - * namespacedName attribute, as usual.) - * - * @param ErrorHandler|null $errorHandler Error handler - * @param array $options Options - */ - public function __construct(?ErrorHandler $errorHandler = null, array $options = []) { - $this->nameContext = new NameContext($errorHandler ?? new ErrorHandler\Throwing); - $this->preserveOriginalNames = $options['preserveOriginalNames'] ?? false; - $this->replaceNodes = $options['replaceNodes'] ?? true; - } - - /** - * Get name resolution context. - * - * @return NameContext - */ - public function getNameContext() : NameContext { - return $this->nameContext; - } - - public function beforeTraverse(array $nodes) { - $this->nameContext->startNamespace(); - return null; - } - - public function enterNode(Node $node) { - if ($node instanceof Stmt\Namespace_) { - $this->nameContext->startNamespace($node->name); - } elseif ($node instanceof Stmt\Use_) { - foreach ($node->uses as $use) { - $this->addAlias($use, $node->type, null); - } - } elseif ($node instanceof Stmt\GroupUse) { - foreach ($node->uses as $use) { - $this->addAlias($use, $node->type, $node->prefix); - } - } elseif ($node instanceof Stmt\Class_) { - if (null !== $node->extends) { - $node->extends = $this->resolveClassName($node->extends); - } - - foreach ($node->implements as &$interface) { - $interface = $this->resolveClassName($interface); - } - - $this->resolveAttrGroups($node); - if (null !== $node->name) { - $this->addNamespacedName($node); - } - } elseif ($node instanceof Stmt\Interface_) { - foreach ($node->extends as &$interface) { - $interface = $this->resolveClassName($interface); - } - - $this->resolveAttrGroups($node); - $this->addNamespacedName($node); - } elseif ($node instanceof Stmt\Enum_) { - foreach ($node->implements as &$interface) { - $interface = $this->resolveClassName($interface); - } - - $this->resolveAttrGroups($node); - if (null !== $node->name) { - $this->addNamespacedName($node); - } - } elseif ($node instanceof Stmt\Trait_) { - $this->resolveAttrGroups($node); - $this->addNamespacedName($node); - } elseif ($node instanceof Stmt\Function_) { - $this->resolveSignature($node); - $this->resolveAttrGroups($node); - $this->addNamespacedName($node); - } elseif ($node instanceof Stmt\ClassMethod - || $node instanceof Expr\Closure - || $node instanceof Expr\ArrowFunction - ) { - $this->resolveSignature($node); - $this->resolveAttrGroups($node); - } elseif ($node instanceof Stmt\Property) { - if (null !== $node->type) { - $node->type = $this->resolveType($node->type); - } - $this->resolveAttrGroups($node); - } elseif ($node instanceof Stmt\Const_) { - foreach ($node->consts as $const) { - $this->addNamespacedName($const); - } - } else if ($node instanceof Stmt\ClassConst) { - if (null !== $node->type) { - $node->type = $this->resolveType($node->type); - } - $this->resolveAttrGroups($node); - } else if ($node instanceof Stmt\EnumCase) { - $this->resolveAttrGroups($node); - } elseif ($node instanceof Expr\StaticCall - || $node instanceof Expr\StaticPropertyFetch - || $node instanceof Expr\ClassConstFetch - || $node instanceof Expr\New_ - || $node instanceof Expr\Instanceof_ - ) { - if ($node->class instanceof Name) { - $node->class = $this->resolveClassName($node->class); - } - } elseif ($node instanceof Stmt\Catch_) { - foreach ($node->types as &$type) { - $type = $this->resolveClassName($type); - } - } elseif ($node instanceof Expr\FuncCall) { - if ($node->name instanceof Name) { - $node->name = $this->resolveName($node->name, Stmt\Use_::TYPE_FUNCTION); - } - } elseif ($node instanceof Expr\ConstFetch) { - $node->name = $this->resolveName($node->name, Stmt\Use_::TYPE_CONSTANT); - } elseif ($node instanceof Stmt\TraitUse) { - foreach ($node->traits as &$trait) { - $trait = $this->resolveClassName($trait); - } - - foreach ($node->adaptations as $adaptation) { - if (null !== $adaptation->trait) { - $adaptation->trait = $this->resolveClassName($adaptation->trait); - } - - if ($adaptation instanceof Stmt\TraitUseAdaptation\Precedence) { - foreach ($adaptation->insteadof as &$insteadof) { - $insteadof = $this->resolveClassName($insteadof); - } - } - } - } - - return null; - } - - private function addAlias(Stmt\UseUse $use, int $type, ?Name $prefix = null) { - // Add prefix for group uses - $name = $prefix ? Name::concat($prefix, $use->name) : $use->name; - // Type is determined either by individual element or whole use declaration - $type |= $use->type; - - $this->nameContext->addAlias( - $name, (string) $use->getAlias(), $type, $use->getAttributes() - ); - } - - /** @param Stmt\Function_|Stmt\ClassMethod|Expr\Closure $node */ - private function resolveSignature($node) { - foreach ($node->params as $param) { - $param->type = $this->resolveType($param->type); - $this->resolveAttrGroups($param); - } - $node->returnType = $this->resolveType($node->returnType); - } - - private function resolveType($node) { - if ($node instanceof Name) { - return $this->resolveClassName($node); - } - if ($node instanceof Node\NullableType) { - $node->type = $this->resolveType($node->type); - return $node; - } - if ($node instanceof Node\UnionType || $node instanceof Node\IntersectionType) { - foreach ($node->types as &$type) { - $type = $this->resolveType($type); - } - return $node; - } - return $node; - } - - /** - * Resolve name, according to name resolver options. - * - * @param Name $name Function or constant name to resolve - * @param int $type One of Stmt\Use_::TYPE_* - * - * @return Name Resolved name, or original name with attribute - */ - protected function resolveName(Name $name, int $type) : Name { - if (!$this->replaceNodes) { - $resolvedName = $this->nameContext->getResolvedName($name, $type); - if (null !== $resolvedName) { - $name->setAttribute('resolvedName', $resolvedName); - } else { - $name->setAttribute('namespacedName', FullyQualified::concat( - $this->nameContext->getNamespace(), $name, $name->getAttributes())); - } - return $name; - } - - if ($this->preserveOriginalNames) { - // Save the original name - $originalName = $name; - $name = clone $originalName; - $name->setAttribute('originalName', $originalName); - } - - $resolvedName = $this->nameContext->getResolvedName($name, $type); - if (null !== $resolvedName) { - return $resolvedName; - } - - // unqualified names inside a namespace cannot be resolved at compile-time - // add the namespaced version of the name as an attribute - $name->setAttribute('namespacedName', FullyQualified::concat( - $this->nameContext->getNamespace(), $name, $name->getAttributes())); - return $name; - } - - protected function resolveClassName(Name $name) { - return $this->resolveName($name, Stmt\Use_::TYPE_NORMAL); - } - - protected function addNamespacedName(Node $node) { - $node->namespacedName = Name::concat( - $this->nameContext->getNamespace(), (string) $node->name); - } - - protected function resolveAttrGroups(Node $node) - { - foreach ($node->attrGroups as $attrGroup) { - foreach ($attrGroup->attrs as $attr) { - $attr->name = $this->resolveClassName($attr->name); - } - } - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php b/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php deleted file mode 100644 index ea372e5..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php +++ /dev/null @@ -1,52 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\NodeVisitor; - -use PhpParser\Node; -use PhpParser\NodeVisitorAbstract; - -/** - * Visitor that connects a child node to its parent node - * as well as its sibling nodes. - * - * On the child node, the parent node can be accessed through - * <code>$node->getAttribute('parent')</code>, the previous - * node can be accessed through <code>$node->getAttribute('previous')</code>, - * and the next node can be accessed through <code>$node->getAttribute('next')</code>. - */ -final class NodeConnectingVisitor extends NodeVisitorAbstract -{ - /** - * @var Node[] - */ - private $stack = []; - - /** - * @var ?Node - */ - private $previous; - - public function beforeTraverse(array $nodes) { - $this->stack = []; - $this->previous = null; - } - - public function enterNode(Node $node) { - if (!empty($this->stack)) { - $node->setAttribute('parent', $this->stack[count($this->stack) - 1]); - } - - if ($this->previous !== null && $this->previous->getAttribute('parent') === $node->getAttribute('parent')) { - $node->setAttribute('previous', $this->previous); - $this->previous->setAttribute('next', $node); - } - - $this->stack[] = $node; - } - - public function leaveNode(Node $node) { - $this->previous = $node; - - array_pop($this->stack); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php b/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php deleted file mode 100644 index b98d2bf..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php +++ /dev/null @@ -1,41 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\NodeVisitor; - -use function array_pop; -use function count; -use PhpParser\Node; -use PhpParser\NodeVisitorAbstract; - -/** - * Visitor that connects a child node to its parent node. - * - * On the child node, the parent node can be accessed through - * <code>$node->getAttribute('parent')</code>. - */ -final class ParentConnectingVisitor extends NodeVisitorAbstract -{ - /** - * @var Node[] - */ - private $stack = []; - - public function beforeTraverse(array $nodes) - { - $this->stack = []; - } - - public function enterNode(Node $node) - { - if (!empty($this->stack)) { - $node->setAttribute('parent', $this->stack[count($this->stack) - 1]); - } - - $this->stack[] = $node; - } - - public function leaveNode(Node $node) - { - array_pop($this->stack); - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php b/vendor/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php deleted file mode 100644 index d378d67..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser; - -/** - * @codeCoverageIgnore - */ -class NodeVisitorAbstract implements NodeVisitor -{ - public function beforeTraverse(array $nodes) { - return null; - } - - public function enterNode(Node $node) { - return null; - } - - public function leaveNode(Node $node) { - return null; - } - - public function afterTraverse(array $nodes) { - return null; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Parser.php b/vendor/nikic/php-parser/lib/PhpParser/Parser.php deleted file mode 100644 index 7236c68..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Parser.php +++ /dev/null @@ -1,18 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser; - -interface Parser -{ - /** - * Parses PHP code into a node tree. - * - * @param string $code The source code to parse - * @param ErrorHandler|null $errorHandler Error handler to use for lexer/parser errors, defaults - * to ErrorHandler\Throwing. - * - * @return Node\Stmt[]|null Array of statements (or null non-throwing error handler is used and - * the parser was unable to recover from an error). - */ - public function parse(string $code, ?ErrorHandler $errorHandler = null); -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Parser/Multiple.php b/vendor/nikic/php-parser/lib/PhpParser/Parser/Multiple.php deleted file mode 100644 index 083ff46..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Parser/Multiple.php +++ /dev/null @@ -1,55 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\Parser; - -use PhpParser\Error; -use PhpParser\ErrorHandler; -use PhpParser\Parser; - -class Multiple implements Parser -{ - /** @var Parser[] List of parsers to try, in order of preference */ - private $parsers; - - /** - * Create a parser which will try multiple parsers in an order of preference. - * - * Parsers will be invoked in the order they're provided to the constructor. If one of the - * parsers runs without throwing, it's output is returned. Otherwise the exception that the - * first parser generated is thrown. - * - * @param Parser[] $parsers - */ - public function __construct(array $parsers) { - $this->parsers = $parsers; - } - - public function parse(string $code, ?ErrorHandler $errorHandler = null) { - if (null === $errorHandler) { - $errorHandler = new ErrorHandler\Throwing; - } - - list($firstStmts, $firstError) = $this->tryParse($this->parsers[0], $errorHandler, $code); - if ($firstError === null) { - return $firstStmts; - } - - for ($i = 1, $c = count($this->parsers); $i < $c; ++$i) { - list($stmts, $error) = $this->tryParse($this->parsers[$i], $errorHandler, $code); - if ($error === null) { - return $stmts; - } - } - - throw $firstError; - } - - private function tryParse(Parser $parser, ErrorHandler $errorHandler, $code) { - $stmts = null; - $error = null; - try { - $stmts = $parser->parse($code, $errorHandler); - } catch (Error $error) {} - return [$stmts, $error]; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.php b/vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.php deleted file mode 100644 index 80ebdfb..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.php +++ /dev/null @@ -1,2682 +0,0 @@ -<?php - -namespace PhpParser\Parser; - -use PhpParser\Error; -use PhpParser\Node; -use PhpParser\Node\Expr; -use PhpParser\Node\Name; -use PhpParser\Node\Scalar; -use PhpParser\Node\Stmt; - -/* This is an automatically GENERATED file, which should not be manually edited. - * Instead edit one of the following: - * * the grammar files grammar/php5.y or grammar/php7.y - * * the skeleton file grammar/parser.template - * * the preprocessing script grammar/rebuildParsers.php - */ -class Php5 extends \PhpParser\ParserAbstract -{ - protected $tokenToSymbolMapSize = 396; - protected $actionTableSize = 1099; - protected $gotoTableSize = 640; - - protected $invalidSymbol = 168; - protected $errorSymbol = 1; - protected $defaultAction = -32766; - protected $unexpectedTokenRule = 32767; - - protected $YY2TBLSTATE = 415; - protected $numNonLeafStates = 664; - - protected $symbolToName = array( - "EOF", - "error", - "T_THROW", - "T_INCLUDE", - "T_INCLUDE_ONCE", - "T_EVAL", - "T_REQUIRE", - "T_REQUIRE_ONCE", - "','", - "T_LOGICAL_OR", - "T_LOGICAL_XOR", - "T_LOGICAL_AND", - "T_PRINT", - "T_YIELD", - "T_DOUBLE_ARROW", - "T_YIELD_FROM", - "'='", - "T_PLUS_EQUAL", - "T_MINUS_EQUAL", - "T_MUL_EQUAL", - "T_DIV_EQUAL", - "T_CONCAT_EQUAL", - "T_MOD_EQUAL", - "T_AND_EQUAL", - "T_OR_EQUAL", - "T_XOR_EQUAL", - "T_SL_EQUAL", - "T_SR_EQUAL", - "T_POW_EQUAL", - "T_COALESCE_EQUAL", - "'?'", - "':'", - "T_COALESCE", - "T_BOOLEAN_OR", - "T_BOOLEAN_AND", - "'|'", - "'^'", - "T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG", - "T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG", - "T_IS_EQUAL", - "T_IS_NOT_EQUAL", - "T_IS_IDENTICAL", - "T_IS_NOT_IDENTICAL", - "T_SPACESHIP", - "'<'", - "T_IS_SMALLER_OR_EQUAL", - "'>'", - "T_IS_GREATER_OR_EQUAL", - "T_SL", - "T_SR", - "'+'", - "'-'", - "'.'", - "'*'", - "'/'", - "'%'", - "'!'", - "T_INSTANCEOF", - "'~'", - "T_INC", - "T_DEC", - "T_INT_CAST", - "T_DOUBLE_CAST", - "T_STRING_CAST", - "T_ARRAY_CAST", - "T_OBJECT_CAST", - "T_BOOL_CAST", - "T_UNSET_CAST", - "'@'", - "T_POW", - "'['", - "T_NEW", - "T_CLONE", - "T_EXIT", - "T_IF", - "T_ELSEIF", - "T_ELSE", - "T_ENDIF", - "T_LNUMBER", - "T_DNUMBER", - "T_STRING", - "T_STRING_VARNAME", - "T_VARIABLE", - "T_NUM_STRING", - "T_INLINE_HTML", - "T_ENCAPSED_AND_WHITESPACE", - "T_CONSTANT_ENCAPSED_STRING", - "T_ECHO", - "T_DO", - "T_WHILE", - "T_ENDWHILE", - "T_FOR", - "T_ENDFOR", - "T_FOREACH", - "T_ENDFOREACH", - "T_DECLARE", - "T_ENDDECLARE", - "T_AS", - "T_SWITCH", - "T_MATCH", - "T_ENDSWITCH", - "T_CASE", - "T_DEFAULT", - "T_BREAK", - "T_CONTINUE", - "T_GOTO", - "T_FUNCTION", - "T_FN", - "T_CONST", - "T_RETURN", - "T_TRY", - "T_CATCH", - "T_FINALLY", - "T_USE", - "T_INSTEADOF", - "T_GLOBAL", - "T_STATIC", - "T_ABSTRACT", - "T_FINAL", - "T_PRIVATE", - "T_PROTECTED", - "T_PUBLIC", - "T_READONLY", - "T_VAR", - "T_UNSET", - "T_ISSET", - "T_EMPTY", - "T_HALT_COMPILER", - "T_CLASS", - "T_TRAIT", - "T_INTERFACE", - "T_EXTENDS", - "T_IMPLEMENTS", - "T_OBJECT_OPERATOR", - "T_LIST", - "T_ARRAY", - "T_CALLABLE", - "T_CLASS_C", - "T_TRAIT_C", - "T_METHOD_C", - "T_FUNC_C", - "T_LINE", - "T_FILE", - "T_START_HEREDOC", - "T_END_HEREDOC", - "T_DOLLAR_OPEN_CURLY_BRACES", - "T_CURLY_OPEN", - "T_PAAMAYIM_NEKUDOTAYIM", - "T_NAMESPACE", - "T_NS_C", - "T_DIR", - "T_NS_SEPARATOR", - "T_ELLIPSIS", - "T_NAME_FULLY_QUALIFIED", - "T_NAME_QUALIFIED", - "T_NAME_RELATIVE", - "';'", - "'{'", - "'}'", - "'('", - "')'", - "'$'", - "'`'", - "']'", - "'\"'", - "T_ENUM", - "T_NULLSAFE_OBJECT_OPERATOR", - "T_ATTRIBUTE" - ); - - protected $tokenToSymbol = array( - 0, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 56, 164, 168, 161, 55, 168, 168, - 159, 160, 53, 50, 8, 51, 52, 54, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 31, 156, - 44, 16, 46, 30, 68, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 70, 168, 163, 36, 168, 162, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 157, 35, 158, 58, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 1, 2, 3, 4, - 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 32, 33, 34, 37, 38, 39, 40, - 41, 42, 43, 45, 47, 48, 49, 57, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 69, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 165, 131, - 132, 133, 166, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 167 - ); - - protected $action = array( - 701, 671, 672, 673, 674, 675, 286, 676, 677, 678, - 714, 715, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 0, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244,-32766,-32766,-32766,-32766,-32766, - -32766,-32766,-32766,-32766,-32767,-32767,-32767,-32767, 245, 246, - 242, 243, 244,-32766,-32766, 679,-32766,-32766,-32766,-32766, - -32766,-32766,-32766,-32766,-32766, 1230, 245, 246, 1231, 680, - 681, 682, 683, 684, 685, 686, 900, 901, 748,-32766, - -32766,-32766,-32766,-32766,-32766, 687, 688, 689, 690, 691, - 692, 693, 694, 695, 696, 697, 717, 740, 718, 719, - 720, 721, 709, 710, 711, 739, 712, 713, 698, 699, - 700, 702, 703, 704, 742, 743, 744, 745, 746, 747, - 876, 705, 706, 707, 708, 738, 729, 727, 728, 724, - 725, 1047, 716, 722, 723, 730, 731, 733, 732, 734, - 735, 55, 56, 425, 57, 58, 726, 737, 736, 756, - 59, 60, -226, 61,-32766,-32766,-32766,-32766,-32766,-32766, - -32766,-32766,-32766,-32766, 337,-32767,-32767,-32767,-32767, 29, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 621,-32766,-32766,-32766,-32766, 62, 63, - 1047,-32766,-32766,-32766, 64, 419, 65, 294, 295, 66, - 67, 68, 69, 70, 71, 72, 73, 824, 25, 302, - 74, 418, 985, 987, 670, 669, 1101, 1102, 1079, 756, - 756, 768, 1221, 769, 470,-32766,-32766,-32766, 341, 750, - 825, 54,-32767,-32767,-32767,-32767, 98, 99, 100, 101, - 102, 220, 221, 222, 362, 877,-32766, 27,-32766,-32766, - -32766,-32766,-32766, 1047, 492, 126, 1081, 1080, 1082, 370, - 1069, 931, 207, 478, 479, 953, 954, 955, 952, 951, - 950, 128, 480, 481, 804, 1107, 1108, 1109, 1110, 1104, - 1105, 319, 32, 297, 10, 211, -515, 1111, 1106, 670, - 669, 1081, 1080, 1082, 220, 221, 222, 41, 364, 341, - 334, 421, 336, 426, -128, -128, -128, 313, 1047, 469, - -4, 825, 54, 813, 597, 207, 40, 21, 427, -128, - 471, -128, 472, -128, 473, -128, 1047, 428, 220, 221, - 222,-32766, 33, 34, 429, 361, 327, 52, 35, 474, - -32766,-32766,-32766, 342, 357, 358, 475, 476, 48, 207, - 249, 670, 669, 477, 443, 300, 796, 847, 430, 431, - 28,-32766, 815,-32766,-32766,-32766,-32766,-32766,-32766,-32766, - -32767,-32767,-32767,-32767,-32767, 953, 954, 955, 952, 951, - 950, 422, 756, 424, 426, 827, 635, -128,-32766,-32766, - 469, 825, 54, 288, 813, 1152, 756, 40, 21, 427, - 317, 471, 345, 472, 129, 473, 9, 1187, 428, 612, - 360, 324, 906, 33, 34, 429, 361, 1047, 415, 35, - 474, 945, 1069, 315, 125, 357, 358, 475, 476,-32766, - -32766,-32766, 927, 302, 477, 121, 1069, 760, 847, 430, - 431, 670, 669, 423, 756, 1153, 810, 1047, 480, 767, - -32766, 806,-32766,-32766,-32766,-32766, -261, 127, 347, 436, - 842, 341, 1079, 1201, 426, 446, 827, 635, -4, 808, - 469, 825, 54, 436, 813, 341, 756, 40, 21, 427, - 444, 471, 130, 472, 1069, 473, 346, 768, 428, 769, - -211, -211, -211, 33, 34, 429, 361, 308, 1077, 35, - 474,-32766,-32766,-32766, 1047, 357, 358, 475, 476,-32766, - -32766,-32766, 907, 120, 477, 538, 1069, 796, 847, 430, - 431, 436,-32766, 341,-32766,-32766,-32766, 1047, 480, 811, - -32766, 926,-32766,-32766, 755, 1081, 1080, 1082, 49,-32766, - -32766,-32766, 750, 752, 426, 1202, 827, 635, -211, 30, - 469, 670, 669, 436, 813, 341, 75, 40, 21, 427, - -32766, 471, 1065, 472, 124, 473, 670, 669, 428, 212, - -210, -210, -210, 33, 34, 429, 361, 51, 1187, 35, - 474, 756,-32766,-32766,-32766, 357, 358, 475, 476, 213, - 825, 54, 221, 222, 477, 20, 580, 796, 847, 430, - 431, 220, 221, 222, 756, 222, 247, 78, 79, 80, - 81, 341, 207, 516, 103, 104, 105, 753, 307, 131, - 638, 1069, 207, 341, 207, 122, 827, 635, -210, 36, - 106, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 1113, 307, 346, 436, 214, - 341, 825, 54, 426, 123, 250, 129, 134, 106, 469, - -32766, 571, 1113, 813, 245, 246, 40, 21, 427, 251, - 471, 252, 472, 341, 473, 453, 22, 428, 207, 900, - 901, 639, 33, 34, 429, 825, 54, -86, 35, 474, - 220, 221, 222, 314, 357, 358, 100, 101, 102, 239, - 240, 241, 646, 477, -230, 458, 588, 135, 374, 595, - 596, 207, 761, 641, 649, 643, 942, 655, 930, 663, - 823, 133, 307, 838, 426,-32766, 106, 750, 43, 44, - 469, 45, 442, 46, 813, 827, 635, 40, 21, 427, - 47, 471, 50, 472, 53, 473, 132, 608, 428, 302, - 604, -280,-32766, 33, 34, 429, 825, 54, 426, 35, - 474, 756, 958, -84, 469, 357, 358, 520, 813, 629, - 363, 40, 21, 427, 477, 471, 574, 472, -515, 473, - 848, 617, 428, -423,-32766, 11, 647, 33, 34, 429, - 825, 54, 445, 35, 474, 462, 285, 577, 1112, 357, - 358, 592, 369, 849, 593, 290, 827, 635, 477, 0, - 0, 531, 0, 0, 325, 0, 0, 0, 0, 0, - 652, 0, 0, 0, 322, 326, 0, 0, 0, 426, - 0, 0, 0, 0, 323, 469, 316, 318, -516, 813, - 863, 635, 40, 21, 427, 0, 471, 0, 472, 0, - 473, 1159, 0, 428, 0, -414, 6, 7, 33, 34, - 429, 825, 54, 426, 35, 474, 12, 14, 373, 469, - 357, 358, -424, 813, 562, 755, 40, 21, 427, 477, - 471, 248, 472, 840, 473, 38, 39, 428, 658, 659, - 814, 822, 33, 34, 429, 801, 816, 879, 35, 474, - 215, 216, 870, 871, 357, 358, 217, 771, 218, 799, - 864, 827, 635, 477, 770, 861, 859, 937, 938, 935, - 209, 821, 805, 807, 809, 812, 934, 764, 1101, 1102, - 765, 936, 24, 78, 426, 335, 1103, 359, 636, 640, - 469, 642, 644, 645, 813, 827, 635, 40, 21, 427, - 648, 471, 650, 472, 651, 473, 653, 654, 428, 637, - 26, 660, 797, 33, 34, 429, 215, 216, 1227, 35, - 474, 1229, 217, 763, 218, 357, 358, 846, 762, 845, - 1228, 844, 1061, 832, 477, 558, 209, 1107, 1108, 1109, - 1110, 1104, 1105, 398, 1101, 1102, 1049, 843, 1050, 1111, - 1106, 830, 1103, 943, 868, 869, 457, 1226, 1158, 219, - 1195, 1193, 1178, 1191, 1092, 918, 827, 635, 31, 1199, - 1189, 1056, 37, 42, 76, 77, 210, 287, 292, 293, - 308, 309, 310, 311, 339, 356, 416, 0, -227, -226, - 16, 17, 18, 393, 454, 461, 463, 467, 552, 626, - 1052, 558, 1055, 1107, 1108, 1109, 1110, 1104, 1105, 398, - 908, 1117, 1051, 1027, 563, 1111, 1106, 1026, 1094, 1058, - 0, -433, 1045, 0, 1057, 219, 1060, 1059, 1076, 0, - 1192, 1177, 1173, 1190, 1091, 1224, 1118, 1172, 600 - ); - - protected $actionCheck = array( - 2, 3, 4, 5, 6, 7, 14, 9, 10, 11, - 12, 13, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 0, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 9, 10, 11, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 69, 70, - 53, 54, 55, 9, 10, 57, 30, 116, 32, 33, - 34, 35, 36, 37, 38, 80, 69, 70, 83, 71, - 72, 73, 74, 75, 76, 77, 135, 136, 80, 33, - 34, 35, 36, 37, 38, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 31, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 13, 134, 135, 136, 137, 138, 139, 140, 141, - 142, 3, 4, 5, 6, 7, 148, 149, 150, 82, - 12, 13, 160, 15, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 8, 44, 45, 46, 47, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 80, 33, 34, 35, 36, 50, 51, - 13, 9, 10, 11, 56, 128, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 1, 70, 71, - 72, 73, 59, 60, 37, 38, 78, 79, 80, 82, - 82, 106, 85, 108, 86, 9, 10, 11, 161, 80, - 1, 2, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 9, 10, 11, 106, 156, 30, 8, 32, 33, - 34, 35, 36, 13, 116, 8, 153, 154, 155, 8, - 122, 158, 30, 125, 126, 116, 117, 118, 119, 120, - 121, 31, 134, 135, 156, 137, 138, 139, 140, 141, - 142, 143, 145, 146, 8, 8, 133, 149, 150, 37, - 38, 153, 154, 155, 9, 10, 11, 159, 8, 161, - 162, 8, 164, 74, 75, 76, 77, 8, 13, 80, - 0, 1, 2, 84, 158, 30, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 13, 98, 9, 10, - 11, 9, 103, 104, 105, 106, 8, 70, 109, 110, - 9, 10, 11, 8, 115, 116, 117, 118, 70, 30, - 31, 37, 38, 124, 31, 8, 127, 128, 129, 130, - 8, 30, 156, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 116, 117, 118, 119, 120, - 121, 8, 82, 8, 74, 156, 157, 158, 33, 34, - 80, 1, 2, 8, 84, 163, 82, 87, 88, 89, - 133, 91, 70, 93, 152, 95, 108, 82, 98, 158, - 8, 113, 160, 103, 104, 105, 106, 13, 108, 109, - 110, 123, 122, 113, 157, 115, 116, 117, 118, 9, - 10, 11, 156, 71, 124, 157, 122, 127, 128, 129, - 130, 37, 38, 8, 82, 160, 156, 13, 134, 156, - 30, 156, 32, 33, 34, 35, 158, 157, 148, 159, - 122, 161, 80, 1, 74, 133, 156, 157, 158, 156, - 80, 1, 2, 159, 84, 161, 82, 87, 88, 89, - 157, 91, 157, 93, 122, 95, 161, 106, 98, 108, - 100, 101, 102, 103, 104, 105, 106, 159, 116, 109, - 110, 9, 10, 11, 13, 115, 116, 117, 118, 9, - 10, 11, 160, 16, 124, 81, 122, 127, 128, 129, - 130, 159, 30, 161, 32, 33, 34, 13, 134, 156, - 30, 156, 32, 33, 153, 153, 154, 155, 70, 9, - 10, 11, 80, 80, 74, 160, 156, 157, 158, 14, - 80, 37, 38, 159, 84, 161, 152, 87, 88, 89, - 30, 91, 160, 93, 14, 95, 37, 38, 98, 16, - 100, 101, 102, 103, 104, 105, 106, 70, 82, 109, - 110, 82, 33, 34, 35, 115, 116, 117, 118, 16, - 1, 2, 10, 11, 124, 160, 85, 127, 128, 129, - 130, 9, 10, 11, 82, 11, 14, 157, 9, 10, - 11, 161, 30, 85, 53, 54, 55, 154, 57, 157, - 31, 122, 30, 161, 30, 157, 156, 157, 158, 30, - 69, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 144, 57, 161, 159, 16, - 161, 1, 2, 74, 157, 16, 152, 157, 69, 80, - 116, 161, 144, 84, 69, 70, 87, 88, 89, 16, - 91, 16, 93, 161, 95, 75, 76, 98, 30, 135, - 136, 31, 103, 104, 105, 1, 2, 31, 109, 110, - 9, 10, 11, 31, 115, 116, 50, 51, 52, 50, - 51, 52, 31, 124, 160, 75, 76, 101, 102, 111, - 112, 30, 156, 157, 31, 31, 156, 157, 156, 157, - 31, 31, 57, 38, 74, 33, 69, 80, 70, 70, - 80, 70, 89, 70, 84, 156, 157, 87, 88, 89, - 70, 91, 70, 93, 70, 95, 70, 96, 98, 71, - 77, 82, 85, 103, 104, 105, 1, 2, 74, 109, - 110, 82, 82, 97, 80, 115, 116, 85, 84, 92, - 106, 87, 88, 89, 124, 91, 90, 93, 133, 95, - 128, 94, 98, 147, 116, 97, 31, 103, 104, 105, - 1, 2, 97, 109, 110, 97, 97, 100, 144, 115, - 116, 100, 106, 128, 113, 161, 156, 157, 124, -1, - -1, 151, -1, -1, 114, -1, -1, -1, -1, -1, - 31, -1, -1, -1, 131, 131, -1, -1, -1, 74, - -1, -1, -1, -1, 132, 80, 133, 133, 133, 84, - 156, 157, 87, 88, 89, -1, 91, -1, 93, -1, - 95, 144, -1, 98, -1, 147, 147, 147, 103, 104, - 105, 1, 2, 74, 109, 110, 147, 147, 147, 80, - 115, 116, 147, 84, 151, 153, 87, 88, 89, 124, - 91, 31, 93, 152, 95, 156, 156, 98, 156, 156, - 156, 156, 103, 104, 105, 156, 156, 156, 109, 110, - 50, 51, 156, 156, 115, 116, 56, 156, 58, 156, - 156, 156, 157, 124, 156, 156, 156, 156, 156, 156, - 70, 156, 156, 156, 156, 156, 156, 156, 78, 79, - 156, 156, 159, 157, 74, 157, 86, 157, 157, 157, - 80, 157, 157, 157, 84, 156, 157, 87, 88, 89, - 157, 91, 157, 93, 157, 95, 157, 157, 98, 157, - 159, 158, 158, 103, 104, 105, 50, 51, 158, 109, - 110, 158, 56, 158, 58, 115, 116, 158, 158, 158, - 158, 158, 158, 158, 124, 135, 70, 137, 138, 139, - 140, 141, 142, 143, 78, 79, 158, 158, 158, 149, - 150, 158, 86, 158, 158, 158, 158, 158, 164, 159, - 158, 158, 158, 158, 158, 158, 156, 157, 159, 158, - 158, 163, 159, 159, 159, 159, 159, 159, 159, 159, - 159, 159, 159, 159, 159, 159, 159, -1, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, - 160, 135, 160, 137, 138, 139, 140, 141, 142, 143, - 160, 160, 160, 160, 160, 149, 150, 160, 160, 163, - -1, 162, 162, -1, 163, 159, 163, 163, 163, -1, - 163, 163, 163, 163, 163, 163, 163, 163, 163 - ); - - protected $actionBase = array( - 0, 229, 310, 390, 470, 103, 325, 325, 785, -2, - -2, 149, -2, -2, -2, 660, 765, 799, 765, 589, - 694, 870, 870, 870, 252, 404, 404, 404, 514, 177, - 177, 918, 434, 118, 295, 313, 240, 491, 491, 491, - 491, 138, 138, 491, 491, 491, 491, 491, 491, 491, - 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, - 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, - 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, - 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, - 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, - 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, - 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, - 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, - 491, 491, 491, 491, 491, 491, 89, 206, 775, 550, - 535, 776, 777, 778, 912, 709, 913, 859, 862, 700, - 863, 864, 865, 866, 867, 858, 871, 935, 872, 599, - 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, - 599, 322, 592, 285, 319, 232, 44, 691, 691, 691, - 691, 691, 691, 691, 182, 182, 182, 182, 182, 182, - 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, - 182, 182, 582, 530, 530, 530, 594, 860, 658, 926, - 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, - 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, - 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, - 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, - 926, 926, 926, 500, -21, -21, 492, 702, 420, 355, - 216, 549, 151, 26, 26, 331, 331, 331, 331, 331, - 46, 46, 5, 5, 5, 5, 153, 188, 188, 188, - 188, 121, 121, 121, 121, 314, 314, 394, 394, 362, - 300, 298, 499, 499, 499, 499, 499, 499, 499, 499, - 499, 499, 67, 656, 656, 659, 659, 522, 554, 554, - 554, 554, 679, -59, -59, 381, 462, 462, 462, 528, - 717, 854, 382, 382, 382, 382, 382, 382, 561, 561, - 561, -3, -3, -3, 692, 115, 137, 115, 137, 678, - 732, 450, 732, 338, 677, -15, 510, 812, 468, 707, - 856, 711, 857, 572, 735, 267, 529, 654, 674, 463, - 529, 529, 529, 529, 654, 610, 640, 608, 463, 529, - 463, 718, 323, 496, 89, 570, 507, 675, 779, 293, - 670, 781, 290, 373, 332, 566, 278, 435, 733, 784, - 914, 917, 385, 715, 675, 675, 675, 352, 511, 278, - -8, 605, 605, 605, 605, 156, 605, 605, 605, 605, - 251, 276, 375, 402, 780, 657, 657, 690, 869, 783, - 783, 657, 689, 657, 690, 874, 874, 874, 874, 657, - 657, 657, 657, 783, 783, 783, 688, 783, 239, 703, - 704, 704, 874, 742, 743, 657, 657, 712, 783, 783, - 783, 712, 695, 874, 701, 741, 277, 783, 874, 672, - 689, 672, 657, 701, 672, 689, 689, 672, 22, 666, - 668, 873, 875, 887, 791, 662, 685, 879, 880, 876, - 878, 811, 699, 744, 497, 669, 671, 673, 680, 719, - 682, 713, 674, 667, 667, 667, 655, 720, 655, 667, - 667, 667, 667, 667, 667, 667, 667, 868, 646, 731, - 714, 653, 745, 553, 573, 792, 664, 814, 900, 893, - 919, 920, 881, 898, 655, 916, 739, 247, 643, 882, - 813, 788, 655, 883, 655, 794, 655, 902, 820, 686, - 823, 825, 667, 910, 921, 923, 924, 925, 927, 928, - 929, 930, 684, 931, 749, 696, 894, 299, 877, 718, - 729, 705, 790, 750, 829, 328, 932, 830, 655, 655, - 795, 786, 655, 796, 751, 740, 890, 756, 895, 933, - 664, 708, 896, 655, 706, 831, 934, 328, 681, 683, - 888, 661, 757, 886, 911, 885, 803, 761, 649, 663, - 832, 833, 834, 693, 763, 891, 892, 889, 764, 805, - 665, 807, 768, 697, 835, 809, 884, 769, 848, 849, - 899, 676, 730, 710, 698, 687, 810, 850, 897, 770, - 771, 772, 853, 773, 855, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 138, 138, 138, 138, -2, - -2, -2, -2, 0, 0, -2, 0, 0, 0, 138, - 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 0, 0, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, - 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, - 599, 599, 599, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 599, -21, -21, -21, -21, - 599, -21, -21, -21, -21, -21, -21, -21, 599, 599, - 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, - 599, 599, 599, 599, 599, 599, -21, 599, 599, 599, - -21, 382, -21, 382, 382, 382, 382, 382, 382, 382, - 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, - 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, - 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, - 382, 382, 382, 382, 382, 382, 382, 599, 0, 0, - 599, -21, 599, -21, 599, -21, -21, 599, 599, 599, - 599, 599, 599, 599, -21, -21, -21, -21, -21, -21, - 0, 561, 561, 561, 561, -21, -21, -21, -21, 382, - 382, 382, 382, 382, 382, 259, 382, 382, 382, 382, - 382, 382, 382, 382, 382, 382, 382, 561, 561, -3, - -3, 382, 382, 382, 382, 382, 259, 382, 382, 463, - 689, 689, 689, 137, 137, 137, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 137, 463, - 0, 463, 0, 382, 463, 689, 463, 657, 137, 689, - 689, 463, 783, 616, 616, 616, 616, 328, 278, 0, - 0, 689, 689, 0, 0, 0, 0, 0, 689, 0, - 0, 0, 0, 0, 0, 783, 0, 0, 0, 0, - 0, 667, 247, 0, 705, 335, 0, 0, 0, 0, - 0, 0, 705, 335, 347, 347, 0, 684, 667, 667, - 667, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 328 - ); - - protected $actionDefault = array( - 3,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767, 544, 544, 499,32767,32767, - 32767,32767,32767,32767,32767,32767,32767, 299, 299, 299, - 32767,32767,32767, 532, 532, 532, 532, 532, 532, 532, - 532, 532, 532, 532,32767,32767,32767,32767,32767,32767, - 383,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767, 389, - 549,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767, 364, - 365, 367, 368, 298, 552, 533, 247, 390, 548, 297, - 249, 327, 503,32767,32767,32767, 329, 122, 258, 203, - 502, 125, 296, 234, 382, 384, 328, 303, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 302, 458, 361, 360, 359, 460,32767, 459, 496, - 496, 499,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767, 325, 487, 486, 326, 456, 330, 457, - 333, 461, 464, 331, 332, 349, 350, 347, 348, 351, - 462, 463, 480, 481, 478, 479, 301, 352, 353, 354, - 355, 482, 483, 484, 485,32767,32767, 543, 543,32767, - 32767, 282,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767, 340, 341, 471, 472,32767, 238, 238, - 238, 238, 283, 238,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767, 335, 336, - 334, 466, 467, 465, 432,32767,32767,32767, 434,32767, - 32767,32767,32767,32767,32767,32767,32767,32767, 504,32767, - 32767,32767,32767,32767, 517, 421, 171,32767, 413,32767, - 171, 171, 171, 171,32767, 222, 224, 167,32767, 171, - 32767, 490,32767,32767,32767,32767, 522, 345,32767,32767, - 116,32767,32767,32767, 559,32767, 517,32767, 116,32767, - 32767,32767,32767, 358, 337, 338, 339,32767,32767, 521, - 515, 474, 475, 476, 477,32767, 468, 469, 470, 473, - 32767,32767,32767,32767,32767,32767,32767,32767, 429, 435, - 435,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767, 520, 519,32767, 414, 498, 188, - 186, 186,32767, 208, 208,32767,32767, 190, 491, 510, - 32767, 190, 173,32767, 400, 175, 498,32767,32767, 240, - 32767, 240,32767, 400, 240,32767,32767, 240,32767, 415, - 439,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767, 379, 380, 493, 506,32767, - 507,32767, 413, 343, 344, 346, 322,32767, 324, 369, - 370, 371, 372, 373, 374, 375, 377,32767, 419,32767, - 422,32767,32767,32767, 257,32767, 557,32767,32767, 306, - 557,32767,32767,32767, 551,32767,32767, 300,32767,32767, - 32767,32767, 253,32767, 169,32767, 541,32767, 558,32767, - 515,32767, 342,32767,32767,32767,32767,32767,32767,32767, - 32767,32767, 516,32767,32767,32767,32767, 229,32767, 452, - 32767, 116,32767,32767,32767, 189,32767,32767, 304, 248, - 32767,32767, 550,32767,32767,32767,32767,32767,32767,32767, - 32767, 114,32767, 170,32767,32767,32767, 191,32767,32767, - 515,32767,32767,32767,32767,32767,32767,32767,32767, 295, - 32767,32767,32767,32767,32767,32767,32767, 515,32767,32767, - 233,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767, 415,32767, 276,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767, 127, 127, 3, 127, 127, - 260, 3, 260, 127, 260, 260, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 216, 219, 208, 208, - 164, 127, 127, 268 - ); - - protected $goto = array( - 166, 140, 140, 140, 166, 187, 168, 144, 147, 141, - 142, 143, 149, 163, 163, 163, 163, 144, 144, 165, - 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, - 138, 159, 160, 161, 162, 184, 139, 185, 493, 494, - 377, 495, 499, 500, 501, 502, 503, 504, 505, 506, - 971, 164, 145, 146, 148, 171, 176, 186, 203, 253, - 256, 258, 260, 263, 264, 265, 266, 267, 268, 269, - 277, 278, 279, 280, 303, 304, 328, 329, 330, 394, - 395, 396, 542, 188, 189, 190, 191, 192, 193, 194, - 195, 196, 197, 198, 199, 200, 201, 150, 151, 152, - 167, 153, 169, 154, 204, 170, 155, 156, 157, 205, - 158, 136, 622, 560, 758, 560, 560, 560, 560, 560, - 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, - 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, - 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, - 560, 560, 560, 560, 560, 560, 560, 560, 560, 1114, - 630, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, - 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, - 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, - 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, - 1114, 1114, 1114, 1114, 1114, 759, 519, 530, 508, 657, - 555, 1184, 350, 508, 591, 787, 1184, 889, 613, 614, - 885, 618, 619, 625, 627, 632, 634, 751, 856, 856, - 856, 856, 851, 857, 174, 892, 892, 1206, 1206, 177, - 178, 179, 401, 402, 403, 404, 173, 202, 206, 208, - 257, 259, 261, 262, 270, 271, 272, 273, 274, 275, - 281, 282, 283, 284, 305, 306, 331, 332, 333, 406, - 407, 408, 409, 175, 180, 254, 255, 181, 182, 183, - 497, 497, 497, 497, 497, 497, 818, 497, 497, 497, - 497, 497, 497, 497, 497, 497, 497, 509, 585, 862, - 601, 602, 509, 544, 545, 546, 547, 548, 549, 550, - 551, 553, 586, 338, 559, 321, 559, 559, 559, 559, - 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, - 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, - 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, - 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, - 400, 607, 536, 536, 568, 532, 537, 534, 534, 496, - 498, 524, 540, 569, 572, 583, 590, 298, 296, 296, - 296, 298, 289, 299, 611, 1210, 510, 615, 910, 948, - 375, 510, 437, 437, 437, 437, 437, 437, 594, 437, - 437, 437, 437, 437, 437, 437, 437, 437, 437, 1078, - 949, 388, 1176, 561, 1078, 899, 899, 899, 899, 378, - 899, 899, 1218, 1218, 1164, 754, 351, 352, 757, 1078, - 1078, 1078, 1078, 1078, 1078, 1070, 384, 384, 384, 606, - 1218, 878, 860, 858, 860, 656, 466, 511, 887, 882, - 754, 384, 754, 384, 969, 384, 391, 385, 587, 353, - 414, 384, 1232, 1203, 541, 1198, 1198, 1198, 567, 1095, - 386, 386, 386, 1020, 916, 514, 1030, 19, 15, 372, - 776, 916, 941, 448, 450, 633, 896, 1217, 1217, 1115, - 616, 939, 841, 554, 905, 386, 340, 1071, 1074, 1075, - 399, 1070, 1183, 914, 23, 1217, 774, 1183, 543, 603, - 389, 1220, 1072, 1175, 1072, 518, 1200, 1200, 1200, 575, - 605, 1073, 343, 522, 533, 518, 518, 773, 1090, 1089, - 13, 578, 582, 628, 3, 4, 783, 1067, 772, 514, - 1062, 1182, 784, 661, 919, 451, 866, 573, 957, 1161, - 464, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 513, 528, 0, 0, 0, 0, - 513, 0, 528, 0, 0, 0, 0, 610, 512, 515, - 439, 440, 1068, 620, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 781, 1225, 0, 0, 0, 0, - 0, 523, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 779, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 301, 301 - ); - - protected $gotoCheck = array( - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 57, 69, 15, 69, 69, 69, 69, 69, - 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, - 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, - 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, - 69, 69, 69, 69, 69, 69, 69, 69, 69, 128, - 9, 128, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 16, 102, 32, 69, 32, - 32, 120, 72, 69, 32, 29, 120, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 6, 69, 69, - 69, 69, 69, 69, 27, 77, 77, 77, 77, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 119, 119, 119, 119, 119, 119, 50, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 67, 33, - 67, 67, 119, 111, 111, 111, 111, 111, 111, 111, - 111, 111, 111, 127, 57, 127, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 51, 51, 51, 51, 51, 51, 110, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 5, 5, 5, - 5, 5, 5, 5, 63, 142, 124, 63, 84, 98, - 63, 124, 57, 57, 57, 57, 57, 57, 129, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 98, 12, 82, 12, 57, 57, 57, 57, 57, 46, - 57, 57, 144, 144, 133, 11, 72, 72, 14, 57, - 57, 57, 57, 57, 57, 82, 13, 13, 13, 49, - 144, 14, 14, 14, 14, 14, 57, 14, 14, 14, - 11, 13, 11, 13, 102, 13, 48, 11, 70, 70, - 70, 13, 13, 140, 2, 9, 9, 9, 2, 34, - 125, 125, 125, 103, 13, 13, 34, 34, 34, 34, - 25, 13, 8, 8, 8, 8, 79, 143, 143, 8, - 8, 8, 9, 34, 81, 125, 18, 82, 82, 82, - 125, 82, 121, 85, 34, 143, 24, 121, 47, 34, - 17, 143, 82, 82, 82, 47, 121, 121, 121, 40, - 40, 82, 58, 58, 58, 47, 47, 23, 126, 126, - 58, 62, 62, 62, 30, 30, 23, 116, 23, 13, - 114, 121, 26, 74, 86, 65, 71, 66, 100, 132, - 109, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 9, 9, -1, -1, -1, -1, - 9, -1, 9, -1, -1, -1, -1, 13, 9, 9, - 9, 9, 13, 13, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 9, 9, -1, -1, -1, -1, - -1, 102, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 9, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 5, 5 - ); - - protected $gotoBase = array( - 0, 0, -173, 0, 0, 353, 216, 0, 477, 149, - 0, 110, 71, 117, 426, 112, 203, 170, 181, 0, - 0, 0, 0, 168, 164, 143, 121, 27, 0, 205, - -127, 0, -429, 279, 51, 0, 0, 0, 0, 0, - 481, 0, 0, -24, 0, 0, 379, 484, 163, 153, - 268, 75, 0, 0, 0, 0, 0, 107, 161, 0, - 0, 0, 222, -77, 0, 104, 96, -344, 0, -94, - 135, 123, -232, 0, 169, 0, 0, -50, 0, 173, - 0, 180, 64, 0, 360, 139, 122, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 98, 0, - 124, 0, 165, 166, 0, 0, 0, 0, 0, 87, - 340, 259, 0, 0, 120, 0, 177, 0, 0, -5, - -91, 200, 0, 0, 84, 154, 211, -21, -48, 188, - 0, 0, 93, 213, 0, 0, 0, 0, 0, 0, - 175, 0, 358, 167, 102, 0, 0 - ); - - protected $gotoDefault = array( - -32768, 468, 665, 2, 666, 836, 741, 749, 598, 482, - 631, 581, 380, 1194, 793, 794, 795, 381, 368, 766, - 379, 410, 405, 782, 775, 777, 785, 172, 411, 788, - 1, 790, 517, 826, 1021, 365, 798, 366, 589, 800, - 526, 802, 803, 137, 382, 383, 527, 483, 390, 576, - 817, 276, 387, 819, 367, 820, 829, 371, 465, 455, - 460, 529, 556, 609, 432, 447, 570, 564, 535, 1087, - 565, 865, 349, 873, 662, 881, 884, 484, 557, 895, - 452, 903, 1100, 397, 909, 915, 920, 291, 923, 417, - 412, 584, 928, 929, 5, 933, 623, 624, 8, 312, - 956, 599, 970, 420, 1040, 1042, 485, 486, 521, 459, - 507, 525, 487, 1063, 441, 413, 1066, 433, 488, 489, - 434, 435, 1084, 355, 1169, 354, 449, 320, 1156, 579, - 1119, 456, 1209, 1165, 348, 490, 491, 376, 1188, 392, - 1204, 438, 1211, 1219, 344, 539, 566 - ); - - protected $ruleToNonTerminal = array( - 0, 1, 3, 3, 2, 5, 5, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, - 7, 7, 7, 7, 8, 8, 9, 10, 11, 11, - 12, 12, 13, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 18, 18, 19, 19, 21, 21, - 17, 17, 22, 22, 23, 23, 24, 24, 25, 25, - 20, 20, 26, 28, 28, 29, 30, 30, 32, 31, - 31, 31, 31, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 14, 14, 54, 54, 56, 55, 55, 48, - 48, 58, 58, 59, 59, 60, 60, 61, 61, 15, - 16, 16, 16, 64, 64, 64, 65, 65, 68, 68, - 66, 66, 70, 70, 41, 41, 50, 50, 53, 53, - 53, 52, 52, 71, 42, 42, 42, 42, 72, 72, - 73, 73, 74, 74, 39, 39, 35, 35, 75, 37, - 37, 76, 36, 36, 38, 38, 49, 49, 49, 62, - 62, 78, 78, 79, 79, 81, 81, 81, 80, 80, - 63, 63, 82, 82, 82, 83, 83, 84, 84, 84, - 44, 44, 85, 85, 85, 45, 45, 86, 86, 87, - 87, 67, 88, 88, 88, 88, 93, 93, 94, 94, - 95, 95, 95, 95, 95, 96, 97, 97, 92, 92, - 89, 89, 91, 91, 99, 99, 98, 98, 98, 98, - 98, 98, 90, 90, 101, 100, 100, 46, 46, 40, - 40, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 34, 34, 47, - 47, 106, 106, 107, 107, 107, 107, 113, 102, 102, - 109, 109, 115, 115, 116, 117, 118, 118, 118, 118, - 118, 118, 118, 69, 69, 57, 57, 57, 57, 103, - 103, 122, 122, 119, 119, 123, 123, 123, 123, 104, - 104, 104, 108, 108, 108, 114, 114, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, - 27, 27, 27, 27, 27, 27, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 112, 112, 105, 105, 105, 105, 129, 129, 132, 132, - 131, 131, 133, 133, 51, 51, 51, 51, 135, 135, - 134, 134, 134, 134, 134, 136, 136, 121, 121, 124, - 124, 120, 120, 138, 137, 137, 137, 137, 125, 125, - 125, 125, 111, 111, 126, 126, 126, 126, 77, 139, - 139, 140, 140, 140, 110, 110, 141, 141, 142, 142, - 142, 142, 142, 127, 127, 127, 127, 144, 145, 143, - 143, 143, 143, 143, 143, 143, 146, 146, 146 - ); - - protected $ruleToLength = array( - 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 3, 5, 4, - 3, 4, 1, 3, 1, 1, 8, 7, 3, 1, - 3, 1, 3, 1, 1, 3, 1, 3, 1, 2, - 3, 1, 3, 3, 1, 3, 2, 0, 1, 1, - 1, 1, 1, 3, 5, 8, 3, 5, 9, 3, - 2, 3, 2, 3, 2, 3, 3, 3, 3, 1, - 2, 2, 5, 7, 9, 5, 6, 3, 3, 2, - 2, 1, 1, 1, 0, 2, 8, 0, 4, 1, - 3, 0, 1, 0, 1, 0, 1, 1, 1, 10, - 7, 6, 5, 1, 2, 2, 0, 2, 0, 2, - 0, 2, 1, 3, 1, 4, 1, 4, 1, 1, - 4, 1, 3, 3, 3, 4, 4, 5, 0, 2, - 4, 3, 1, 1, 1, 4, 0, 2, 3, 0, - 2, 4, 0, 2, 0, 3, 1, 2, 1, 1, - 0, 1, 3, 4, 6, 1, 1, 1, 0, 1, - 0, 2, 2, 3, 3, 1, 3, 1, 2, 2, - 3, 1, 1, 2, 4, 3, 1, 1, 3, 2, - 0, 1, 3, 3, 9, 3, 1, 3, 0, 2, - 4, 5, 4, 4, 4, 3, 1, 1, 1, 3, - 1, 1, 0, 1, 1, 2, 1, 1, 1, 1, - 1, 1, 1, 3, 1, 1, 3, 3, 1, 0, - 1, 1, 3, 3, 4, 4, 1, 2, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 1, 3, 5, - 4, 3, 4, 4, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, - 1, 3, 2, 1, 2, 10, 11, 3, 3, 2, - 4, 4, 3, 4, 4, 4, 4, 7, 3, 2, - 0, 4, 1, 3, 2, 1, 2, 2, 4, 6, - 2, 2, 4, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 3, 3, 4, 4, 0, - 2, 1, 0, 1, 1, 0, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, - 1, 3, 1, 4, 3, 1, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, - 3, 3, 3, 3, 3, 3, 5, 4, 4, 3, - 1, 3, 1, 1, 3, 3, 0, 2, 0, 1, - 3, 1, 3, 1, 1, 1, 1, 1, 6, 4, - 3, 4, 2, 4, 4, 1, 3, 1, 2, 1, - 1, 4, 1, 1, 3, 6, 4, 4, 4, 4, - 1, 4, 0, 1, 1, 3, 1, 1, 4, 3, - 1, 1, 1, 0, 0, 2, 3, 1, 3, 1, - 4, 2, 2, 2, 2, 1, 2, 1, 1, 1, - 4, 3, 3, 3, 6, 3, 1, 1, 1 - ); - - protected function initReduceCallbacks() { - $this->reduceCallbacks = [ - 0 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 1 => function ($stackPos) { - $this->semValue = $this->handleNamespaces($this->semStack[$stackPos-(1-1)]); - }, - 2 => function ($stackPos) { - if (is_array($this->semStack[$stackPos-(2-2)])) { $this->semValue = array_merge($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); } else { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }; - }, - 3 => function ($stackPos) { - $this->semValue = array(); - }, - 4 => function ($stackPos) { - $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; }; - if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 5 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 6 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 7 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 8 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 9 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 10 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 11 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 12 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 13 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 14 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 15 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 16 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 17 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 18 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 19 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 20 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 21 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 22 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 23 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 24 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 25 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 26 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 27 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 28 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 29 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 30 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 31 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 32 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 33 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 34 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 35 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 36 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 37 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 38 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 39 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 40 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 41 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 42 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 43 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 44 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 45 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 46 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 47 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 48 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 49 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 50 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 51 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 52 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 53 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 54 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 55 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 56 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 57 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 58 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 59 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 60 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 61 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 62 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 63 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 64 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 65 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 66 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 67 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 68 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 69 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 70 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 71 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 72 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 73 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 74 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 75 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 76 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 77 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 78 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 79 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 80 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 81 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 82 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 83 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 84 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 85 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 86 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 87 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 88 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 89 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 90 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 91 => function ($stackPos) { - $this->semValue = new Name(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 92 => function ($stackPos) { - $this->semValue = new Expr\Variable(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 93 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 94 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 95 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 96 => function ($stackPos) { - $this->semValue = new Stmt\HaltCompiler($this->lexer->handleHaltCompiler(), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 97 => function ($stackPos) { - $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos-(3-2)], null, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_SEMICOLON); - $this->checkNamespace($this->semValue); - }, - 98 => function ($stackPos) { - $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos-(5-2)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); - $this->checkNamespace($this->semValue); - }, - 99 => function ($stackPos) { - $this->semValue = new Stmt\Namespace_(null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); - $this->checkNamespace($this->semValue); - }, - 100 => function ($stackPos) { - $this->semValue = new Stmt\Use_($this->semStack[$stackPos-(3-2)], Stmt\Use_::TYPE_NORMAL, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 101 => function ($stackPos) { - $this->semValue = new Stmt\Use_($this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-2)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 102 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 103 => function ($stackPos) { - $this->semValue = new Stmt\Const_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 104 => function ($stackPos) { - $this->semValue = Stmt\Use_::TYPE_FUNCTION; - }, - 105 => function ($stackPos) { - $this->semValue = Stmt\Use_::TYPE_CONSTANT; - }, - 106 => function ($stackPos) { - $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos-(8-3)], $this->semStack[$stackPos-(8-6)], $this->semStack[$stackPos-(8-2)], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); - }, - 107 => function ($stackPos) { - $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos-(7-2)], $this->semStack[$stackPos-(7-5)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); - }, - 108 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 109 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 110 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 111 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 112 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 113 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 114 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(1-1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(1-1)); - }, - 115 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(3-3)); - }, - 116 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(1-1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(1-1)); - }, - 117 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(3-3)); - }, - 118 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; $this->semValue->type = Stmt\Use_::TYPE_NORMAL; - }, - 119 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-2)]; $this->semValue->type = $this->semStack[$stackPos-(2-1)]; - }, - 120 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 121 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 122 => function ($stackPos) { - $this->semValue = new Node\Const_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 123 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 124 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 125 => function ($stackPos) { - $this->semValue = new Node\Const_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 126 => function ($stackPos) { - if (is_array($this->semStack[$stackPos-(2-2)])) { $this->semValue = array_merge($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); } else { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }; - }, - 127 => function ($stackPos) { - $this->semValue = array(); - }, - 128 => function ($stackPos) { - $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; }; - if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 129 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 130 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 131 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 132 => function ($stackPos) { - throw new Error('__HALT_COMPILER() can only be used from the outermost scope', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 133 => function ($stackPos) { - - if ($this->semStack[$stackPos-(3-2)]) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; $attrs = $this->startAttributeStack[$stackPos-(3-1)]; $stmts = $this->semValue; if (!empty($attrs['comments'])) {$stmts[0]->setAttribute('comments', array_merge($attrs['comments'], $stmts[0]->getAttribute('comments', []))); }; - } else { - $startAttributes = $this->startAttributeStack[$stackPos-(3-1)]; if (isset($startAttributes['comments'])) { $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); } else { $this->semValue = null; }; - if (null === $this->semValue) { $this->semValue = array(); } - } - - }, - 134 => function ($stackPos) { - $this->semValue = new Stmt\If_($this->semStack[$stackPos-(5-2)], ['stmts' => is_array($this->semStack[$stackPos-(5-3)]) ? $this->semStack[$stackPos-(5-3)] : array($this->semStack[$stackPos-(5-3)]), 'elseifs' => $this->semStack[$stackPos-(5-4)], 'else' => $this->semStack[$stackPos-(5-5)]], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 135 => function ($stackPos) { - $this->semValue = new Stmt\If_($this->semStack[$stackPos-(8-2)], ['stmts' => $this->semStack[$stackPos-(8-4)], 'elseifs' => $this->semStack[$stackPos-(8-5)], 'else' => $this->semStack[$stackPos-(8-6)]], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); - }, - 136 => function ($stackPos) { - $this->semValue = new Stmt\While_($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 137 => function ($stackPos) { - $this->semValue = new Stmt\Do_($this->semStack[$stackPos-(5-4)], is_array($this->semStack[$stackPos-(5-2)]) ? $this->semStack[$stackPos-(5-2)] : array($this->semStack[$stackPos-(5-2)]), $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 138 => function ($stackPos) { - $this->semValue = new Stmt\For_(['init' => $this->semStack[$stackPos-(9-3)], 'cond' => $this->semStack[$stackPos-(9-5)], 'loop' => $this->semStack[$stackPos-(9-7)], 'stmts' => $this->semStack[$stackPos-(9-9)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); - }, - 139 => function ($stackPos) { - $this->semValue = new Stmt\Switch_($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 140 => function ($stackPos) { - $this->semValue = new Stmt\Break_(null, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 141 => function ($stackPos) { - $this->semValue = new Stmt\Break_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 142 => function ($stackPos) { - $this->semValue = new Stmt\Continue_(null, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 143 => function ($stackPos) { - $this->semValue = new Stmt\Continue_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 144 => function ($stackPos) { - $this->semValue = new Stmt\Return_(null, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 145 => function ($stackPos) { - $this->semValue = new Stmt\Return_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 146 => function ($stackPos) { - $this->semValue = new Stmt\Global_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 147 => function ($stackPos) { - $this->semValue = new Stmt\Static_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 148 => function ($stackPos) { - $this->semValue = new Stmt\Echo_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 149 => function ($stackPos) { - $this->semValue = new Stmt\InlineHTML($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 150 => function ($stackPos) { - $this->semValue = new Stmt\Expression($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 151 => function ($stackPos) { - $this->semValue = new Stmt\Expression($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 152 => function ($stackPos) { - $this->semValue = new Stmt\Unset_($this->semStack[$stackPos-(5-3)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 153 => function ($stackPos) { - $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-5)][0], ['keyVar' => null, 'byRef' => $this->semStack[$stackPos-(7-5)][1], 'stmts' => $this->semStack[$stackPos-(7-7)]], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); - }, - 154 => function ($stackPos) { - $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos-(9-3)], $this->semStack[$stackPos-(9-7)][0], ['keyVar' => $this->semStack[$stackPos-(9-5)], 'byRef' => $this->semStack[$stackPos-(9-7)][1], 'stmts' => $this->semStack[$stackPos-(9-9)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); - }, - 155 => function ($stackPos) { - $this->semValue = new Stmt\Declare_($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 156 => function ($stackPos) { - $this->semValue = new Stmt\TryCatch($this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-5)], $this->semStack[$stackPos-(6-6)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); $this->checkTryCatch($this->semValue); - }, - 157 => function ($stackPos) { - $this->semValue = new Stmt\Throw_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 158 => function ($stackPos) { - $this->semValue = new Stmt\Goto_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 159 => function ($stackPos) { - $this->semValue = new Stmt\Label($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 160 => function ($stackPos) { - $this->semValue = new Stmt\Expression($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 161 => function ($stackPos) { - $this->semValue = array(); /* means: no statement */ - }, - 162 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 163 => function ($stackPos) { - $startAttributes = $this->startAttributeStack[$stackPos-(1-1)]; if (isset($startAttributes['comments'])) { $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); } else { $this->semValue = null; }; - if ($this->semValue === null) $this->semValue = array(); /* means: no statement */ - }, - 164 => function ($stackPos) { - $this->semValue = array(); - }, - 165 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 166 => function ($stackPos) { - $this->semValue = new Stmt\Catch_(array($this->semStack[$stackPos-(8-3)]), $this->semStack[$stackPos-(8-4)], $this->semStack[$stackPos-(8-7)], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); - }, - 167 => function ($stackPos) { - $this->semValue = null; - }, - 168 => function ($stackPos) { - $this->semValue = new Stmt\Finally_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 169 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 170 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 171 => function ($stackPos) { - $this->semValue = false; - }, - 172 => function ($stackPos) { - $this->semValue = true; - }, - 173 => function ($stackPos) { - $this->semValue = false; - }, - 174 => function ($stackPos) { - $this->semValue = true; - }, - 175 => function ($stackPos) { - $this->semValue = false; - }, - 176 => function ($stackPos) { - $this->semValue = true; - }, - 177 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 178 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 179 => function ($stackPos) { - $this->semValue = new Stmt\Function_($this->semStack[$stackPos-(10-3)], ['byRef' => $this->semStack[$stackPos-(10-2)], 'params' => $this->semStack[$stackPos-(10-5)], 'returnType' => $this->semStack[$stackPos-(10-7)], 'stmts' => $this->semStack[$stackPos-(10-9)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); - }, - 180 => function ($stackPos) { - $this->semValue = new Stmt\Class_($this->semStack[$stackPos-(7-2)], ['type' => $this->semStack[$stackPos-(7-1)], 'extends' => $this->semStack[$stackPos-(7-3)], 'implements' => $this->semStack[$stackPos-(7-4)], 'stmts' => $this->semStack[$stackPos-(7-6)]], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); - $this->checkClass($this->semValue, $stackPos-(7-2)); - }, - 181 => function ($stackPos) { - $this->semValue = new Stmt\Interface_($this->semStack[$stackPos-(6-2)], ['extends' => $this->semStack[$stackPos-(6-3)], 'stmts' => $this->semStack[$stackPos-(6-5)]], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); - $this->checkInterface($this->semValue, $stackPos-(6-2)); - }, - 182 => function ($stackPos) { - $this->semValue = new Stmt\Trait_($this->semStack[$stackPos-(5-2)], ['stmts' => $this->semStack[$stackPos-(5-4)]], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 183 => function ($stackPos) { - $this->semValue = 0; - }, - 184 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; - }, - 185 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_FINAL; - }, - 186 => function ($stackPos) { - $this->semValue = null; - }, - 187 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-2)]; - }, - 188 => function ($stackPos) { - $this->semValue = array(); - }, - 189 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-2)]; - }, - 190 => function ($stackPos) { - $this->semValue = array(); - }, - 191 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-2)]; - }, - 192 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 193 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 194 => function ($stackPos) { - $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); - }, - 195 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-2)]; - }, - 196 => function ($stackPos) { - $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); - }, - 197 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-2)]; - }, - 198 => function ($stackPos) { - $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); - }, - 199 => function ($stackPos) { - $this->semValue = null; - }, - 200 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-2)]; - }, - 201 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 202 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 203 => function ($stackPos) { - $this->semValue = new Stmt\DeclareDeclare($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 204 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 205 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-3)]; - }, - 206 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-2)]; - }, - 207 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(5-3)]; - }, - 208 => function ($stackPos) { - $this->semValue = array(); - }, - 209 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 210 => function ($stackPos) { - $this->semValue = new Stmt\Case_($this->semStack[$stackPos-(4-2)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 211 => function ($stackPos) { - $this->semValue = new Stmt\Case_(null, $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 212 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 213 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 214 => function ($stackPos) { - $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); - }, - 215 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-2)]; - }, - 216 => function ($stackPos) { - $this->semValue = array(); - }, - 217 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 218 => function ($stackPos) { - $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(3-2)], is_array($this->semStack[$stackPos-(3-3)]) ? $this->semStack[$stackPos-(3-3)] : array($this->semStack[$stackPos-(3-3)]), $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 219 => function ($stackPos) { - $this->semValue = array(); - }, - 220 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 221 => function ($stackPos) { - $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(4-2)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 222 => function ($stackPos) { - $this->semValue = null; - }, - 223 => function ($stackPos) { - $this->semValue = new Stmt\Else_(is_array($this->semStack[$stackPos-(2-2)]) ? $this->semStack[$stackPos-(2-2)] : array($this->semStack[$stackPos-(2-2)]), $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 224 => function ($stackPos) { - $this->semValue = null; - }, - 225 => function ($stackPos) { - $this->semValue = new Stmt\Else_($this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 226 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)], false); - }, - 227 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(2-2)], true); - }, - 228 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)], false); - }, - 229 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 230 => function ($stackPos) { - $this->semValue = array(); - }, - 231 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 232 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 233 => function ($stackPos) { - $this->semValue = new Node\Param($this->semStack[$stackPos-(4-4)], null, $this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-2)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); $this->checkParam($this->semValue); - }, - 234 => function ($stackPos) { - $this->semValue = new Node\Param($this->semStack[$stackPos-(6-4)], $this->semStack[$stackPos-(6-6)], $this->semStack[$stackPos-(6-1)], $this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-3)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); $this->checkParam($this->semValue); - }, - 235 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 236 => function ($stackPos) { - $this->semValue = new Node\Identifier('array', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 237 => function ($stackPos) { - $this->semValue = new Node\Identifier('callable', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 238 => function ($stackPos) { - $this->semValue = null; - }, - 239 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 240 => function ($stackPos) { - $this->semValue = null; - }, - 241 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-2)]; - }, - 242 => function ($stackPos) { - $this->semValue = array(); - }, - 243 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 244 => function ($stackPos) { - $this->semValue = array(new Node\Arg($this->semStack[$stackPos-(3-2)], false, false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes)); - }, - 245 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 246 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 247 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos-(1-1)], false, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 248 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], true, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 249 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], false, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 250 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 251 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 252 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 253 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 254 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 255 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 256 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 257 => function ($stackPos) { - $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos-(1-1)], null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 258 => function ($stackPos) { - $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 259 => function ($stackPos) { - if ($this->semStack[$stackPos-(2-2)] !== null) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; } else { $this->semValue = $this->semStack[$stackPos-(2-1)]; } - }, - 260 => function ($stackPos) { - $this->semValue = array(); - }, - 261 => function ($stackPos) { - $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; }; - if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 262 => function ($stackPos) { - $this->semValue = new Stmt\Property($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->checkProperty($this->semValue, $stackPos-(3-1)); - }, - 263 => function ($stackPos) { - $this->semValue = new Stmt\ClassConst($this->semStack[$stackPos-(3-2)], 0, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 264 => function ($stackPos) { - $this->semValue = new Stmt\ClassMethod($this->semStack[$stackPos-(9-4)], ['type' => $this->semStack[$stackPos-(9-1)], 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-6)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); - $this->checkClassMethod($this->semValue, $stackPos-(9-1)); - }, - 265 => function ($stackPos) { - $this->semValue = new Stmt\TraitUse($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 266 => function ($stackPos) { - $this->semValue = array(); - }, - 267 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 268 => function ($stackPos) { - $this->semValue = array(); - }, - 269 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 270 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Precedence($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 271 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(5-1)][0], $this->semStack[$stackPos-(5-1)][1], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 272 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], null, $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 273 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 274 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 275 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); - }, - 276 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 277 => function ($stackPos) { - $this->semValue = array(null, $this->semStack[$stackPos-(1-1)]); - }, - 278 => function ($stackPos) { - $this->semValue = null; - }, - 279 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 280 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 281 => function ($stackPos) { - $this->semValue = 0; - }, - 282 => function ($stackPos) { - $this->semValue = 0; - }, - 283 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 284 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 285 => function ($stackPos) { - $this->checkModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)]; - }, - 286 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PUBLIC; - }, - 287 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PROTECTED; - }, - 288 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PRIVATE; - }, - 289 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_STATIC; - }, - 290 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; - }, - 291 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_FINAL; - }, - 292 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 293 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 294 => function ($stackPos) { - $this->semValue = new Node\VarLikeIdentifier(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 295 => function ($stackPos) { - $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos-(1-1)], null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 296 => function ($stackPos) { - $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 297 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 298 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 299 => function ($stackPos) { - $this->semValue = array(); - }, - 300 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 301 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 302 => function ($stackPos) { - $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 303 => function ($stackPos) { - $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 304 => function ($stackPos) { - $this->semValue = new Expr\AssignRef($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 305 => function ($stackPos) { - $this->semValue = new Expr\AssignRef($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 306 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 307 => function ($stackPos) { - $this->semValue = new Expr\Clone_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 308 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 309 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 310 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 311 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 312 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 313 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 314 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 315 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 316 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 317 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 318 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 319 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 320 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 321 => function ($stackPos) { - $this->semValue = new Expr\PostInc($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 322 => function ($stackPos) { - $this->semValue = new Expr\PreInc($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 323 => function ($stackPos) { - $this->semValue = new Expr\PostDec($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 324 => function ($stackPos) { - $this->semValue = new Expr\PreDec($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 325 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 326 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 327 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 328 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 329 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 330 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 331 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 332 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 333 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 334 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 335 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 336 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 337 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 338 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 339 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 340 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 341 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 342 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 343 => function ($stackPos) { - $this->semValue = new Expr\UnaryPlus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 344 => function ($stackPos) { - $this->semValue = new Expr\UnaryMinus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 345 => function ($stackPos) { - $this->semValue = new Expr\BooleanNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 346 => function ($stackPos) { - $this->semValue = new Expr\BitwiseNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 347 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 348 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 349 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 350 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 351 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Spaceship($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 352 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 353 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 354 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 355 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 356 => function ($stackPos) { - $this->semValue = new Expr\Instanceof_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 357 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 358 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 359 => function ($stackPos) { - $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(5-1)], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 360 => function ($stackPos) { - $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(4-1)], null, $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 361 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 362 => function ($stackPos) { - $this->semValue = new Expr\Isset_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 363 => function ($stackPos) { - $this->semValue = new Expr\Empty_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 364 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 365 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE_ONCE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 366 => function ($stackPos) { - $this->semValue = new Expr\Eval_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 367 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 368 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE_ONCE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 369 => function ($stackPos) { - $this->semValue = new Expr\Cast\Int_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 370 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes; - $attrs['kind'] = $this->getFloatCastKind($this->semStack[$stackPos-(2-1)]); - $this->semValue = new Expr\Cast\Double($this->semStack[$stackPos-(2-2)], $attrs); - }, - 371 => function ($stackPos) { - $this->semValue = new Expr\Cast\String_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 372 => function ($stackPos) { - $this->semValue = new Expr\Cast\Array_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 373 => function ($stackPos) { - $this->semValue = new Expr\Cast\Object_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 374 => function ($stackPos) { - $this->semValue = new Expr\Cast\Bool_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 375 => function ($stackPos) { - $this->semValue = new Expr\Cast\Unset_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 376 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes; - $attrs['kind'] = strtolower($this->semStack[$stackPos-(2-1)]) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE; - $this->semValue = new Expr\Exit_($this->semStack[$stackPos-(2-2)], $attrs); - }, - 377 => function ($stackPos) { - $this->semValue = new Expr\ErrorSuppress($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 378 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 379 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 380 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 381 => function ($stackPos) { - $this->semValue = new Expr\ShellExec($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 382 => function ($stackPos) { - $this->semValue = new Expr\Print_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 383 => function ($stackPos) { - $this->semValue = new Expr\Yield_(null, null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 384 => function ($stackPos) { - $this->semValue = new Expr\YieldFrom($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 385 => function ($stackPos) { - $this->semValue = new Expr\Closure(['static' => false, 'byRef' => $this->semStack[$stackPos-(10-2)], 'params' => $this->semStack[$stackPos-(10-4)], 'uses' => $this->semStack[$stackPos-(10-6)], 'returnType' => $this->semStack[$stackPos-(10-7)], 'stmts' => $this->semStack[$stackPos-(10-9)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); - }, - 386 => function ($stackPos) { - $this->semValue = new Expr\Closure(['static' => true, 'byRef' => $this->semStack[$stackPos-(11-3)], 'params' => $this->semStack[$stackPos-(11-5)], 'uses' => $this->semStack[$stackPos-(11-7)], 'returnType' => $this->semStack[$stackPos-(11-8)], 'stmts' => $this->semStack[$stackPos-(11-10)]], $this->startAttributeStack[$stackPos-(11-1)] + $this->endAttributes); - }, - 387 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 388 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 389 => function ($stackPos) { - $this->semValue = new Expr\Yield_($this->semStack[$stackPos-(2-2)], null, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 390 => function ($stackPos) { - $this->semValue = new Expr\Yield_($this->semStack[$stackPos-(4-4)], $this->semStack[$stackPos-(4-2)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 391 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes; $attrs['kind'] = Expr\Array_::KIND_LONG; - $this->semValue = new Expr\Array_($this->semStack[$stackPos-(4-3)], $attrs); - }, - 392 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes; $attrs['kind'] = Expr\Array_::KIND_SHORT; - $this->semValue = new Expr\Array_($this->semStack[$stackPos-(3-2)], $attrs); - }, - 393 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 394 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch(Scalar\String_::fromString($this->semStack[$stackPos-(4-1)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes), $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 395 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 396 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 397 => function ($stackPos) { - $this->semValue = array(new Stmt\Class_(null, ['type' => 0, 'extends' => $this->semStack[$stackPos-(7-3)], 'implements' => $this->semStack[$stackPos-(7-4)], 'stmts' => $this->semStack[$stackPos-(7-6)]], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes), $this->semStack[$stackPos-(7-2)]); - $this->checkClass($this->semValue[0], -1); - }, - 398 => function ($stackPos) { - $this->semValue = new Expr\New_($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 399 => function ($stackPos) { - list($class, $ctorArgs) = $this->semStack[$stackPos-(2-2)]; $this->semValue = new Expr\New_($class, $ctorArgs, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 400 => function ($stackPos) { - $this->semValue = array(); - }, - 401 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-3)]; - }, - 402 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 403 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 404 => function ($stackPos) { - $this->semValue = new Expr\ClosureUse($this->semStack[$stackPos-(2-2)], $this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 405 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 406 => function ($stackPos) { - $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 407 => function ($stackPos) { - $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 408 => function ($stackPos) { - $this->semValue = new Expr\StaticCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 409 => function ($stackPos) { - $this->semValue = new Expr\StaticCall($this->semStack[$stackPos-(6-1)], $this->semStack[$stackPos-(6-4)], $this->semStack[$stackPos-(6-6)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); - }, - 410 => function ($stackPos) { - $this->semValue = $this->fixupPhp5StaticPropCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 411 => function ($stackPos) { - $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 412 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 413 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 414 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 415 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 416 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 417 => function ($stackPos) { - $this->semValue = new Name\FullyQualified(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 418 => function ($stackPos) { - $this->semValue = new Name\Relative(substr($this->semStack[$stackPos-(1-1)], 10), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 419 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 420 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 421 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 422 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 423 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 424 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 425 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 426 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 427 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 428 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 429 => function ($stackPos) { - $this->semValue = null; - }, - 430 => function ($stackPos) { - $this->semValue = null; - }, - 431 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 432 => function ($stackPos) { - $this->semValue = array(); - }, - 433 => function ($stackPos) { - $this->semValue = array(new Scalar\EncapsedStringPart(Scalar\String_::parseEscapeSequences($this->semStack[$stackPos-(1-1)], '`', false), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes)); - }, - 434 => function ($stackPos) { - foreach ($this->semStack[$stackPos-(1-1)] as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '`', false); } }; $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 435 => function ($stackPos) { - $this->semValue = array(); - }, - 436 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 437 => function ($stackPos) { - $this->semValue = $this->parseLNumber($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes, true); - }, - 438 => function ($stackPos) { - $this->semValue = Scalar\DNumber::fromString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 439 => function ($stackPos) { - $this->semValue = Scalar\String_::fromString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes, false); - }, - 440 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Line($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 441 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\File($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 442 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Dir($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 443 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Class_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 444 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Trait_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 445 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Method($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 446 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Function_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 447 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Namespace_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 448 => function ($stackPos) { - $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)], false); - }, - 449 => function ($stackPos) { - $this->semValue = $this->parseDocString($this->semStack[$stackPos-(2-1)], '', $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(2-2)] + $this->endAttributeStack[$stackPos-(2-2)], false); - }, - 450 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 451 => function ($stackPos) { - $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 452 => function ($stackPos) { - $this->semValue = new Expr\ConstFetch($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 453 => function ($stackPos) { - $this->semValue = new Expr\Array_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 454 => function ($stackPos) { - $this->semValue = new Expr\Array_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 455 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 456 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 457 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 458 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 459 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 460 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 461 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 462 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 463 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 464 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 465 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 466 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 467 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 468 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 469 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 470 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 471 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 472 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 473 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 474 => function ($stackPos) { - $this->semValue = new Expr\UnaryPlus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 475 => function ($stackPos) { - $this->semValue = new Expr\UnaryMinus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 476 => function ($stackPos) { - $this->semValue = new Expr\BooleanNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 477 => function ($stackPos) { - $this->semValue = new Expr\BitwiseNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 478 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 479 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 480 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 481 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 482 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 483 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 484 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 485 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 486 => function ($stackPos) { - $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(5-1)], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 487 => function ($stackPos) { - $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(4-1)], null, $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 488 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 489 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 490 => function ($stackPos) { - $this->semValue = new Expr\ConstFetch($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 491 => function ($stackPos) { - $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 492 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 493 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 494 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes; $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED; - foreach ($this->semStack[$stackPos-(3-2)] as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '"', true); } }; $this->semValue = new Scalar\Encapsed($this->semStack[$stackPos-(3-2)], $attrs); - }, - 495 => function ($stackPos) { - $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)], true); - }, - 496 => function ($stackPos) { - $this->semValue = array(); - }, - 497 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 498 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 499 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 500 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 501 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 502 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 503 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 504 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 505 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 506 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 507 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 508 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-5)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); - }, - 509 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 510 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 511 => function ($stackPos) { - $this->semValue = new Expr\MethodCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 512 => function ($stackPos) { - $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 513 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 514 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 515 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 516 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 517 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 518 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 519 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 520 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 521 => function ($stackPos) { - $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 522 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 523 => function ($stackPos) { - $var = substr($this->semStack[$stackPos-(1-1)], 1); $this->semValue = \is_string($var) ? new Node\VarLikeIdentifier($var, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes) : $var; - }, - 524 => function ($stackPos) { - $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 525 => function ($stackPos) { - $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(6-1)], $this->semStack[$stackPos-(6-5)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); - }, - 526 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 527 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 528 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 529 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 530 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 531 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 532 => function ($stackPos) { - $this->semValue = null; - }, - 533 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 534 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 535 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 536 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 537 => function ($stackPos) { - $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->errorState = 2; - }, - 538 => function ($stackPos) { - $this->semValue = new Expr\List_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 539 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 540 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 541 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 542 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 543 => function ($stackPos) { - $this->semValue = null; - }, - 544 => function ($stackPos) { - $this->semValue = array(); - }, - 545 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 546 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 547 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 548 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 549 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 550 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(4-4)], $this->semStack[$stackPos-(4-1)], true, $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 551 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 552 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, true); - }, - 553 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 554 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 555 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 556 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); - }, - 557 => function ($stackPos) { - $this->semValue = new Scalar\EncapsedStringPart($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 558 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 559 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 560 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 561 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 562 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 563 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 564 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-4)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); - }, - 565 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 566 => function ($stackPos) { - $this->semValue = new Scalar\String_($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 567 => function ($stackPos) { - $this->semValue = $this->parseNumString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 568 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - ]; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php b/vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php deleted file mode 100644 index d41bb83..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php +++ /dev/null @@ -1,2899 +0,0 @@ -<?php - -namespace PhpParser\Parser; - -use PhpParser\Error; -use PhpParser\Node; -use PhpParser\Node\Expr; -use PhpParser\Node\Name; -use PhpParser\Node\Scalar; -use PhpParser\Node\Stmt; - -/* This is an automatically GENERATED file, which should not be manually edited. - * Instead edit one of the following: - * * the grammar files grammar/php5.y or grammar/php7.y - * * the skeleton file grammar/parser.template - * * the preprocessing script grammar/rebuildParsers.php - */ -class Php7 extends \PhpParser\ParserAbstract -{ - protected $tokenToSymbolMapSize = 396; - protected $actionTableSize = 1241; - protected $gotoTableSize = 629; - - protected $invalidSymbol = 168; - protected $errorSymbol = 1; - protected $defaultAction = -32766; - protected $unexpectedTokenRule = 32767; - - protected $YY2TBLSTATE = 435; - protected $numNonLeafStates = 737; - - protected $symbolToName = array( - "EOF", - "error", - "T_THROW", - "T_INCLUDE", - "T_INCLUDE_ONCE", - "T_EVAL", - "T_REQUIRE", - "T_REQUIRE_ONCE", - "','", - "T_LOGICAL_OR", - "T_LOGICAL_XOR", - "T_LOGICAL_AND", - "T_PRINT", - "T_YIELD", - "T_DOUBLE_ARROW", - "T_YIELD_FROM", - "'='", - "T_PLUS_EQUAL", - "T_MINUS_EQUAL", - "T_MUL_EQUAL", - "T_DIV_EQUAL", - "T_CONCAT_EQUAL", - "T_MOD_EQUAL", - "T_AND_EQUAL", - "T_OR_EQUAL", - "T_XOR_EQUAL", - "T_SL_EQUAL", - "T_SR_EQUAL", - "T_POW_EQUAL", - "T_COALESCE_EQUAL", - "'?'", - "':'", - "T_COALESCE", - "T_BOOLEAN_OR", - "T_BOOLEAN_AND", - "'|'", - "'^'", - "T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG", - "T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG", - "T_IS_EQUAL", - "T_IS_NOT_EQUAL", - "T_IS_IDENTICAL", - "T_IS_NOT_IDENTICAL", - "T_SPACESHIP", - "'<'", - "T_IS_SMALLER_OR_EQUAL", - "'>'", - "T_IS_GREATER_OR_EQUAL", - "T_SL", - "T_SR", - "'+'", - "'-'", - "'.'", - "'*'", - "'/'", - "'%'", - "'!'", - "T_INSTANCEOF", - "'~'", - "T_INC", - "T_DEC", - "T_INT_CAST", - "T_DOUBLE_CAST", - "T_STRING_CAST", - "T_ARRAY_CAST", - "T_OBJECT_CAST", - "T_BOOL_CAST", - "T_UNSET_CAST", - "'@'", - "T_POW", - "'['", - "T_NEW", - "T_CLONE", - "T_EXIT", - "T_IF", - "T_ELSEIF", - "T_ELSE", - "T_ENDIF", - "T_LNUMBER", - "T_DNUMBER", - "T_STRING", - "T_STRING_VARNAME", - "T_VARIABLE", - "T_NUM_STRING", - "T_INLINE_HTML", - "T_ENCAPSED_AND_WHITESPACE", - "T_CONSTANT_ENCAPSED_STRING", - "T_ECHO", - "T_DO", - "T_WHILE", - "T_ENDWHILE", - "T_FOR", - "T_ENDFOR", - "T_FOREACH", - "T_ENDFOREACH", - "T_DECLARE", - "T_ENDDECLARE", - "T_AS", - "T_SWITCH", - "T_MATCH", - "T_ENDSWITCH", - "T_CASE", - "T_DEFAULT", - "T_BREAK", - "T_CONTINUE", - "T_GOTO", - "T_FUNCTION", - "T_FN", - "T_CONST", - "T_RETURN", - "T_TRY", - "T_CATCH", - "T_FINALLY", - "T_USE", - "T_INSTEADOF", - "T_GLOBAL", - "T_STATIC", - "T_ABSTRACT", - "T_FINAL", - "T_PRIVATE", - "T_PROTECTED", - "T_PUBLIC", - "T_READONLY", - "T_VAR", - "T_UNSET", - "T_ISSET", - "T_EMPTY", - "T_HALT_COMPILER", - "T_CLASS", - "T_TRAIT", - "T_INTERFACE", - "T_ENUM", - "T_EXTENDS", - "T_IMPLEMENTS", - "T_OBJECT_OPERATOR", - "T_NULLSAFE_OBJECT_OPERATOR", - "T_LIST", - "T_ARRAY", - "T_CALLABLE", - "T_CLASS_C", - "T_TRAIT_C", - "T_METHOD_C", - "T_FUNC_C", - "T_LINE", - "T_FILE", - "T_START_HEREDOC", - "T_END_HEREDOC", - "T_DOLLAR_OPEN_CURLY_BRACES", - "T_CURLY_OPEN", - "T_PAAMAYIM_NEKUDOTAYIM", - "T_NAMESPACE", - "T_NS_C", - "T_DIR", - "T_NS_SEPARATOR", - "T_ELLIPSIS", - "T_NAME_FULLY_QUALIFIED", - "T_NAME_QUALIFIED", - "T_NAME_RELATIVE", - "T_ATTRIBUTE", - "';'", - "']'", - "'{'", - "'}'", - "'('", - "')'", - "'`'", - "'\"'", - "'$'" - ); - - protected $tokenToSymbol = array( - 0, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 56, 166, 168, 167, 55, 168, 168, - 163, 164, 53, 50, 8, 51, 52, 54, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 31, 159, - 44, 16, 46, 30, 68, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 70, 168, 160, 36, 168, 165, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 161, 35, 162, 58, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 1, 2, 3, 4, - 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 32, 33, 34, 37, 38, 39, 40, - 41, 42, 43, 45, 47, 48, 49, 57, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 69, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158 - ); - - protected $action = array( - 133, 134, 135, 580, 136, 137, 0, 749, 750, 751, - 138, 38, 327,-32766,-32766,-32766,-32766,-32766,-32766,-32767, - -32767,-32767,-32767, 102, 103, 104, 105, 106, 1110, 1111, - 1112, 1109, 1108, 1107, 1113, 743, 742,-32766, 1233,-32766, - -32766,-32766,-32766,-32766,-32766,-32766,-32767,-32767,-32767,-32767, - -32767, 2, 107, 108, 109, 752, 274, 381, 380,-32766, - -32766,-32766,-32766, 104, 105, 106, 1025, 423, 110, 265, - 139, 402, 756, 757, 758, 759, 467, 468, 429, 939, - 291,-32766, 287,-32766,-32766, 760, 761, 762, 763, 764, - 765, 766, 767, 768, 769, 770, 790, 581, 791, 792, - 793, 794, 782, 783, 344, 345, 785, 786, 771, 772, - 773, 775, 776, 777, 355, 817, 818, 819, 820, 821, - 582, 778, 779, 583, 584, 811, 802, 800, 801, 814, - 797, 798, 688, -545, 585, 586, 796, 587, 588, 589, - 590, 591, 592, -328, -593, -367, 1235, -367, 799, 593, - 594, -593, 140,-32766,-32766,-32766, 133, 134, 135, 580, - 136, 137, 1058, 749, 750, 751, 138, 38, 689, 1021, - 1020, 1019, 1022, 390,-32766, 7,-32766,-32766,-32766,-32766, - -32766,-32766,-32766,-32766,-32766,-32766, 379, 380, 1034, 690, - 691, 743, 742,-32766,-32766,-32766, 423, -545, -545, -590, - -32766,-32766,-32766, 1033,-32766, 127, -590, 1237, 1236, 1238, - 1319, 752, -545, 290,-32766, 283,-32766,-32766,-32766,-32766, - -32766, 1237, 1236, 1238, -545, 265, 139, 402, 756, 757, - 758, 759, 16, 482, 429, 459, 460, 461, 298, 723, - 35, 760, 761, 762, 763, 764, 765, 766, 767, 768, - 769, 770, 790, 581, 791, 792, 793, 794, 782, 783, - 344, 345, 785, 786, 771, 772, 773, 775, 776, 777, - 355, 817, 818, 819, 820, 821, 582, 778, 779, 583, - 584, 811, 802, 800, 801, 814, 797, 798, 129, 825, - 585, 586, 796, 587, 588, 589, 590, 591, 592, -328, - 83, 84, 85, -593, 799, 593, 594, -593, 149, 774, - 744, 745, 746, 747, 748, 825, 749, 750, 751, 787, - 788, 37, 145, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 291, 274, 836, - 254, 1110, 1111, 1112, 1109, 1108, 1107, 1113, -590, 861, - 110, 862, -590, 483, 752,-32766,-32766,-32766,-32766,-32766, - 142, 604, 1086, 743, 742, 1263, 326, 988, 753, 754, - 755, 756, 757, 758, 759, 309,-32766, 823,-32766,-32766, - -32766,-32766, 242, 554, 760, 761, 762, 763, 764, 765, - 766, 767, 768, 769, 770, 790, 813, 791, 792, 793, - 794, 782, 783, 784, 812, 785, 786, 771, 772, 773, - 775, 776, 777, 816, 817, 818, 819, 820, 821, 822, - 778, 779, 780, 781, 811, 802, 800, 801, 814, 797, - 798, 311, 941, 789, 795, 796, 803, 804, 806, 805, - 807, 808, 323, 610, 1275, 1034, 834, 799, 810, 809, - 50, 51, 52, 513, 53, 54, 861, 241, 862, 919, - 55, 56, -111, 57,-32766,-32766,-32766, -111, 827, -111, - 290, 1303, 1348, 356, 305, 1349, 339, -111, -111, -111, - -111, -111, -111, -111, -111,-32766, -194,-32766,-32766,-32766, - -193, 957, 958, 830, -86, 989, 959, 835, 58, 59, - 340, 429, 953, -544, 60, 833, 61, 247, 248, 62, - 63, 64, 65, 66, 67, 68, 69, 1242, 28, 267, - 70, 445, 514, -342,-32766, 141, 1269, 1270, 515, 919, - 834, 326, -272, 919, 1267, 42, 25, 516, 941, 517, - 14, 518, 909, 519, 829, 369, 520, 521, 373, 710, - 1034, 44, 45, 446, 376, 375, 388, 46, 522, 713, - -86, 441, 1102, 367, 338, -543, 442, -544, -544, 831, - 1228, 443, 524, 525, 526, 290, 1237, 1236, 1238, 361, - 1031, 444, -544, 1088, 527, 528, 840, 1256, 1257, 1258, - 1259, 1253, 1254, 297, -544, 151, -550, -584, 834, 1260, - 1255, -584, 1034, 1237, 1236, 1238, 298, -154, -154, -154, - 152, 71, 909, 321, 322, 326, 909, 921, 1031, 708, - 834, 154, -154, 1338, -154, 155, -154, 283, -154, -543, - -543, 82, 1233, 1087, 1323, 735, 156, 326, 374, 158, - 1034, 1322, -194, -79, -543, -88, -193, 743, 742, 957, - 958, 654, 26,-32766, 523, -51, -543, 33, -549, 895, - 953, -111, -111, -111, 32, 111, 112, 113, 114, 115, - 116, 117, 118, 119, 120, 121, 122, 123, -59, 75, - 28, 673, 674, 326, -58, 36, 250, 921, 124, 708, - 125, 921, 834, 708, -154, 130, 1267, 131,-32766, -547, - 144, -542, 150, 406, 1235, 377, 378, 1147, 1149, 382, - 383,-32766,-32766,-32766, -85,-32766, 1057,-32766, -542,-32766, - 645, 646,-32766, 159, 160, 161, 1233,-32766,-32766,-32766, - 162, -79, 1228,-32766,-32766, 743, 742, 163, -302,-32766, - 420, -75, -4, 919, -73, 287, 527, 528,-32766, 1256, - 1257, 1258, 1259, 1253, 1254, -72, -71, -70, -69, -68, - -67, 1260, 1255, -547, -547, -542, -542, 743, 742, -66, - -47, -18,-32766, 73, 148, 919, 322, 326, 1235, 273, - -542, 284, -542, -542, 724,-32766,-32766,-32766, 727,-32766, - -547,-32766, -542,-32766, 918, 147,-32766, -542, 288, 289, - -298,-32766,-32766,-32766,-32766, 714, 279,-32766,-32766, -542, - 1235, 280, 285,-32766, 420, 48, 286,-32766,-32766,-32766, - 332,-32766,-32766,-32766, 292,-32766, 909, 293,-32766, 935, - 274, 1031, 919,-32766,-32766,-32766, 110, 683, 132,-32766, - -32766, 834, 146,-32766, 560,-32766, 420, 660, 374, 825, - 436, 1350, 74, 1034,-32766, 296, 655, 1117, 909, 957, - 958, 306, 715, 699, 523, 556, 303, 13, 310, 853, - 953, -111, -111, -111, 701, 464, 493, 954, 283, 299, - 300,-32766, 49, 676, 919, 304, 661, 1235, 677, 937, - 1274,-32766, 10, 1264,-32766,-32766,-32766, 643,-32766, 919, - -32766, 921,-32766, 708, -4,-32766, 126, 34, 919, 566, - -32766,-32766,-32766,-32766, 0, 909,-32766,-32766, 0, 1235, - 919, 0,-32766, 420, 0, 0,-32766,-32766,-32766, 718, - -32766,-32766,-32766, 921,-32766, 708, 1034,-32766, 725, 1276, - 0, 488,-32766,-32766,-32766,-32766, 301, 302,-32766,-32766, - -507, 1235, 572, -497,-32766, 420, 608, 8,-32766,-32766, - -32766, 372,-32766,-32766,-32766, 17,-32766, 909, 371,-32766, - 833, 298, 320, 128,-32766,-32766,-32766, 40, 370, 41, - -32766,-32766, 909, -250, -250, -250,-32766, 420, 732, 374, - 974, 909, 708, 733, 900,-32766, 998, 975, 405, 982, - 957, 958, 972, 909, 983, 523, 898, 970, 1091, 1094, - 895, 953, -111, -111, -111, 28, 1095, 1092, 1093, -249, - -249, -249, 1242, 1099, 709, 374, 845, 834, 1289, 1307, - 1341, 1267, 648, 1268, 712, 716, 957, 958, 717, 1242, - 719, 523, 921, 720, 708, -250, 895, 953, -111, -111, - -111, 721, -16, 722, 726, 711, -511, 921, 409, 708, - -578, 1233, 729, 896, 1345, 1347, 921, 1228, 708, -577, - 856, 855, 947, 990, 1346, 946, 944, 945, 921, 948, - 708, -249, 528, 1219, 1256, 1257, 1258, 1259, 1253, 1254, - 928, 938, 926, 980, 981, 632, 1260, 1255, 1344, 1301, - -32766, 1290, 1308, 834, 1317, -275, 1235, -576, 73, -550, - -549, 322, 326,-32766,-32766,-32766, -548,-32766, -491,-32766, - 834,-32766, 1, 29,-32766, 30, 39, 43, 47,-32766, - -32766,-32766, 72, 76, 77,-32766,-32766, 1233, -111, -111, - 78,-32766, 420, -111, 79, 80, 81, 143, 153, -111, - -32766, 157, 246, 328, 1233, -111, -111, 356,-32766, 357, - -111, 358, 359, 360, 361, 362, -111, 363, 364, 365, - 366, 368, 437, 0, -273,-32766, -272, 19, 20, 298, - 21, 22, 24, 404, 75, 1204, 484, 485, 326, 492, - 0, 495, 496, 497, 498, 502, 298, 503, 504, 511, - 694, 75, 0, 1246, 1187, 326, 1265, 1060, 1059, 1040, - 1223, 1036, -277, -103, 18, 23, 27, 295, 403, 601, - 605, 634, 700, 1191, 1241, 1188, 1320, 0, 0, 0, - 326 - ); - - protected $actionCheck = array( - 2, 3, 4, 5, 6, 7, 0, 9, 10, 11, - 12, 13, 70, 9, 10, 11, 9, 10, 11, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 116, 117, - 118, 119, 120, 121, 122, 37, 38, 30, 116, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 8, 53, 54, 55, 57, 57, 106, 107, 137, - 9, 10, 11, 50, 51, 52, 1, 116, 69, 71, - 72, 73, 74, 75, 76, 77, 134, 135, 80, 1, - 30, 30, 30, 32, 33, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 80, 70, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 8, 1, 106, 80, 108, 150, 151, - 152, 8, 154, 9, 10, 11, 2, 3, 4, 5, - 6, 7, 164, 9, 10, 11, 12, 13, 116, 119, - 120, 121, 122, 106, 30, 108, 32, 33, 34, 35, - 36, 37, 38, 9, 10, 11, 106, 107, 138, 137, - 138, 37, 38, 9, 10, 11, 116, 134, 135, 1, - 9, 10, 11, 137, 30, 14, 8, 155, 156, 157, - 1, 57, 149, 163, 30, 163, 32, 33, 34, 35, - 36, 155, 156, 157, 161, 71, 72, 73, 74, 75, - 76, 77, 8, 31, 80, 129, 130, 131, 158, 161, - 8, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, 131, 132, 133, 8, 80, - 136, 137, 138, 139, 140, 141, 142, 143, 144, 164, - 9, 10, 11, 160, 150, 151, 152, 164, 154, 2, - 3, 4, 5, 6, 7, 80, 9, 10, 11, 12, - 13, 30, 8, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 30, 57, 1, - 8, 116, 117, 118, 119, 120, 121, 122, 160, 106, - 69, 108, 164, 161, 57, 9, 10, 11, 9, 10, - 161, 1, 1, 37, 38, 1, 167, 31, 71, 72, - 73, 74, 75, 76, 77, 8, 30, 80, 32, 33, - 34, 35, 14, 85, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 8, 122, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 8, 51, 146, 138, 82, 150, 151, 152, - 2, 3, 4, 5, 6, 7, 106, 97, 108, 1, - 12, 13, 101, 15, 9, 10, 11, 106, 80, 108, - 163, 1, 80, 163, 113, 83, 8, 116, 117, 118, - 119, 120, 121, 122, 123, 30, 8, 32, 33, 34, - 8, 117, 118, 80, 31, 159, 122, 159, 50, 51, - 8, 80, 128, 70, 56, 155, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 1, 70, 71, - 72, 73, 74, 162, 9, 161, 78, 79, 80, 1, - 82, 167, 164, 1, 86, 87, 88, 89, 122, 91, - 101, 93, 84, 95, 156, 8, 98, 99, 8, 161, - 138, 103, 104, 105, 106, 107, 8, 109, 110, 31, - 97, 8, 123, 115, 116, 70, 8, 134, 135, 156, - 122, 8, 124, 125, 126, 163, 155, 156, 157, 163, - 116, 8, 149, 162, 136, 137, 8, 139, 140, 141, - 142, 143, 144, 145, 161, 14, 163, 160, 82, 151, - 152, 164, 138, 155, 156, 157, 158, 75, 76, 77, - 14, 163, 84, 165, 166, 167, 84, 159, 116, 161, - 82, 14, 90, 85, 92, 14, 94, 163, 96, 134, - 135, 161, 116, 159, 1, 161, 14, 167, 106, 14, - 138, 8, 164, 16, 149, 31, 164, 37, 38, 117, - 118, 75, 76, 137, 122, 31, 161, 14, 163, 127, - 128, 129, 130, 131, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 16, 163, - 70, 75, 76, 167, 16, 147, 148, 159, 16, 161, - 16, 159, 82, 161, 162, 16, 86, 16, 74, 70, - 16, 70, 101, 102, 80, 106, 107, 59, 60, 106, - 107, 87, 88, 89, 31, 91, 1, 93, 70, 95, - 111, 112, 98, 16, 16, 16, 116, 103, 104, 105, - 16, 31, 122, 109, 110, 37, 38, 16, 35, 115, - 116, 31, 0, 1, 31, 30, 136, 137, 124, 139, - 140, 141, 142, 143, 144, 31, 31, 31, 31, 31, - 31, 151, 152, 134, 135, 134, 135, 37, 38, 31, - 31, 31, 74, 163, 31, 1, 166, 167, 80, 31, - 149, 31, 134, 135, 31, 87, 88, 89, 31, 91, - 161, 93, 161, 95, 31, 31, 98, 149, 37, 37, - 35, 103, 104, 105, 74, 31, 35, 109, 110, 161, - 80, 35, 35, 115, 116, 70, 35, 87, 88, 89, - 35, 91, 124, 93, 37, 95, 84, 37, 98, 38, - 57, 116, 1, 103, 104, 105, 69, 77, 31, 109, - 110, 82, 70, 85, 89, 115, 116, 96, 106, 80, - 108, 83, 154, 138, 124, 113, 90, 82, 84, 117, - 118, 114, 31, 80, 122, 85, 132, 97, 132, 127, - 128, 129, 130, 131, 92, 97, 97, 128, 163, 134, - 135, 74, 70, 94, 1, 133, 100, 80, 100, 154, - 146, 137, 150, 160, 87, 88, 89, 113, 91, 1, - 93, 159, 95, 161, 162, 98, 161, 161, 1, 153, - 103, 104, 105, 74, -1, 84, 109, 110, -1, 80, - 1, -1, 115, 116, -1, -1, 87, 88, 89, 31, - 91, 124, 93, 159, 95, 161, 138, 98, 31, 146, - -1, 102, 103, 104, 105, 74, 134, 135, 109, 110, - 149, 80, 81, 149, 115, 116, 153, 149, 87, 88, - 89, 149, 91, 124, 93, 149, 95, 84, 149, 98, - 155, 158, 161, 161, 103, 104, 105, 159, 161, 159, - 109, 110, 84, 100, 101, 102, 115, 116, 159, 106, - 159, 84, 161, 159, 159, 124, 159, 159, 162, 159, - 117, 118, 159, 84, 159, 122, 159, 159, 159, 159, - 127, 128, 129, 130, 131, 70, 159, 159, 159, 100, - 101, 102, 1, 159, 161, 106, 160, 82, 160, 160, - 160, 86, 160, 166, 161, 161, 117, 118, 161, 1, - 161, 122, 159, 161, 161, 162, 127, 128, 129, 130, - 131, 161, 31, 161, 161, 161, 165, 159, 162, 161, - 163, 116, 162, 162, 162, 162, 159, 122, 161, 163, - 162, 162, 162, 162, 162, 162, 162, 162, 159, 162, - 161, 162, 137, 162, 139, 140, 141, 142, 143, 144, - 162, 162, 162, 162, 162, 162, 151, 152, 162, 162, - 74, 162, 162, 82, 162, 164, 80, 163, 163, 163, - 163, 166, 167, 87, 88, 89, 163, 91, 163, 93, - 82, 95, 163, 163, 98, 163, 163, 163, 163, 103, - 104, 105, 163, 163, 163, 109, 110, 116, 117, 118, - 163, 115, 116, 122, 163, 163, 163, 163, 163, 128, - 124, 163, 163, 163, 116, 117, 118, 163, 137, 163, - 122, 163, 163, 163, 163, 163, 128, 163, 163, 163, - 163, 163, 163, -1, 164, 137, 164, 164, 164, 158, - 164, 164, 164, 164, 163, 165, 164, 164, 167, 164, - -1, 164, 164, 164, 164, 164, 158, 164, 164, 164, - 164, 163, -1, 164, 164, 167, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 164, 164, -1, -1, -1, - 167 - ); - - protected $actionBase = array( - 0, -2, 154, 542, 752, 893, 929, 52, 374, 431, - 398, 869, 793, 235, 307, 307, 793, 307, 784, 908, - 908, 917, 908, 538, 841, 468, 468, 468, 708, 708, - 708, 708, 740, 740, 849, 849, 881, 817, 634, 1036, - 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, - 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, - 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, - 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, - 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, - 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, - 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, - 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, - 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, - 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, - 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, - 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, - 1036, 1036, 1036, 1036, 348, 346, 370, 653, 1063, 1069, - 1065, 1070, 1061, 1060, 1064, 1066, 1071, 946, 947, 774, - 949, 950, 943, 952, 1067, 882, 1062, 1068, 291, 291, - 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, - 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, - 291, 291, 291, 291, 291, 525, 191, 359, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 174, 174, - 174, 620, 620, 51, 465, 356, 955, 955, 955, 955, - 955, 955, 955, 955, 955, 955, 658, 184, 144, 144, - 7, 7, 7, 7, 7, 1031, 371, 1048, -25, -25, - -25, -25, 50, 725, 526, 449, 39, 317, 80, 474, - 474, 13, 13, 512, 512, 422, 422, 512, 512, 512, - 808, 808, 808, 808, 443, 505, 360, 308, -78, 209, - 209, 209, 209, -78, -78, -78, -78, 803, 877, -78, - -78, -78, 63, 641, 641, 822, -1, -1, -1, 641, - 253, 790, 548, 253, 384, 548, 480, 402, 764, 759, - -49, 447, 764, 639, 755, 198, 143, 825, 609, 825, - 1059, 320, 768, 426, 749, 720, 874, 904, 1072, 796, - 941, 798, 942, 106, -58, 710, 1058, 1058, 1058, 1058, - 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1073, 336, 1059, - 423, 1073, 1073, 1073, 336, 336, 336, 336, 336, 336, - 336, 336, 336, 336, 619, 423, 586, 616, 423, 795, - 336, 814, 348, 348, 348, 348, 348, 348, 348, 348, - 348, 348, 750, 202, 348, 348, 346, 78, 78, 348, - 484, 65, 78, 78, 78, 78, 348, 348, 348, 348, - 609, 783, 766, 613, 813, 492, 783, 783, 783, 473, - 135, 378, 488, 713, 775, 67, 779, 779, 785, 969, - 969, 779, 769, 779, 785, 975, 779, 779, 969, 969, - 823, 280, 563, 478, 550, 568, 969, 377, 779, 779, - 779, 779, 746, 573, 779, 342, 314, 779, 779, 746, - 744, 760, 43, 762, 969, 969, 969, 746, 547, 762, - 762, 762, 839, 844, 794, 758, 444, 433, 588, 232, - 801, 758, 758, 779, 558, 794, 758, 794, 758, 745, - 758, 758, 758, 794, 758, 769, 502, 758, 717, 583, - 224, 758, 6, 979, 980, 624, 981, 973, 987, 1019, - 991, 992, 873, 965, 999, 974, 993, 972, 970, 773, - 682, 684, 818, 811, 963, 777, 777, 777, 956, 777, - 777, 777, 777, 777, 777, 777, 777, 682, 743, 829, - 765, 1006, 689, 691, 754, 911, 901, 1030, 1004, 1049, - 994, 828, 694, 1028, 1008, 910, 821, 1009, 1010, 1029, - 1050, 1052, 912, 782, 913, 918, 876, 1012, 883, 777, - 979, 992, 693, 974, 993, 972, 970, 748, 739, 737, - 738, 736, 735, 723, 734, 753, 1053, 954, 907, 878, - 1011, 957, 682, 879, 1023, 756, 1032, 1033, 827, 788, - 778, 880, 919, 1014, 1015, 1016, 884, 1054, 887, 830, - 1024, 951, 1035, 789, 846, 1037, 1038, 1039, 1040, 889, - 920, 892, 916, 900, 845, 776, 1020, 761, 921, 591, - 787, 791, 800, 1018, 606, 1000, 902, 906, 922, 1041, - 1043, 1044, 923, 924, 995, 847, 1026, 799, 1027, 1022, - 848, 850, 617, 797, 1055, 781, 786, 772, 621, 632, - 925, 927, 931, 998, 763, 770, 853, 855, 1056, 771, - 1057, 938, 635, 857, 718, 939, 1046, 719, 724, 637, - 678, 672, 731, 792, 903, 826, 757, 780, 1017, 724, - 767, 858, 940, 859, 860, 867, 1045, 868, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 458, 458, - 458, 458, 458, 458, 307, 307, 307, 307, 307, 307, - 307, 0, 0, 307, 0, 458, 458, 458, 458, 458, - 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, - 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, - 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, - 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, - 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, - 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, - 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, - 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, - 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, - 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, - 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, - 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, - 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, - 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, - 458, 291, 291, 291, 291, 291, 291, 291, 291, 291, - 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, - 291, 291, 291, 291, 291, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 291, 291, 291, 291, 291, 291, 291, 291, - 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, - 291, 291, 291, 291, 291, 291, 291, 291, 66, 66, - 291, 291, 291, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 0, 291, 291, 291, 291, 291, 291, - 291, 291, 66, 823, 66, -1, -1, -1, -1, 66, - 66, 66, -88, -88, 66, 384, 66, 66, -1, -1, - 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, - 66, 0, 0, 423, 548, 66, 769, 769, 769, 769, - 66, 66, 66, 66, 548, 548, 66, 66, 66, 0, - 0, 0, 0, 0, 0, 0, 0, 423, 548, 0, - 423, 0, 0, 769, 769, 66, 384, 823, 643, 66, - 0, 0, 0, 0, 423, 769, 423, 336, 779, 548, - 779, 336, 336, 78, 348, 643, 611, 611, 611, 611, - 0, 0, 609, 823, 823, 823, 823, 823, 823, 823, - 823, 823, 823, 823, 769, 0, 823, 0, 769, 769, - 769, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 769, 0, 969, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 975, - 0, 0, 0, 0, 0, 0, 0, 0, 769, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 777, 788, - 0, 788, 0, 777, 777, 777, 0, 0, 0, 0, - 797, 771 - ); - - protected $actionDefault = array( - 3,32767, 103,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767, 101,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767, 596, 596, - 596, 596,32767,32767, 254, 103,32767,32767, 469, 387, - 387, 387,32767,32767, 540, 540, 540, 540, 540, 540, - 32767,32767,32767,32767,32767,32767, 469,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767, 101, - 32767,32767,32767, 37, 7, 8, 10, 11, 50, 17, - 324,32767,32767,32767,32767, 103,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767, 589,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767, 473, 452, - 453, 455, 456, 386, 541, 595, 327, 592, 385, 146, - 339, 329, 242, 330, 258, 474, 259, 475, 478, 479, - 215, 287, 382, 150, 151, 416, 470, 418, 468, 472, - 417, 392, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 390, 391, 471, 449, 448, - 447,32767,32767, 414, 415, 419,32767,32767,32767,32767, - 32767,32767,32767,32767, 103,32767, 389, 422, 420, 421, - 438, 439, 436, 437, 440,32767,32767,32767, 441, 442, - 443, 444, 316,32767,32767, 366, 364, 316, 112,32767, - 32767, 429, 430,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767, 534, 446,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767, 103, - 32767, 101, 536, 411, 413, 503, 424, 425, 423, 393, - 32767, 510,32767, 103,32767, 512,32767,32767,32767,32767, - 32767,32767,32767, 535,32767, 542, 542,32767, 496, 101, - 195,32767,32767,32767, 195, 195,32767,32767,32767,32767, - 32767,32767,32767,32767, 603, 496, 111, 111, 111, 111, - 111, 111, 111, 111, 111, 111, 111,32767, 195, 111, - 32767,32767,32767, 101, 195, 195, 195, 195, 195, 195, - 195, 195, 195, 195, 190,32767, 268, 270, 103, 557, - 195, 515,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767, 508,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 496, 434, 139,32767, 139, 542, 426, 427, 428, 498, - 542, 542, 542, 312, 289,32767,32767,32767,32767, 513, - 513, 101, 101, 101, 101, 508,32767,32767,32767,32767, - 112, 100, 100, 100, 100, 100, 104, 102,32767,32767, - 32767,32767, 223, 100,32767, 102, 102,32767,32767, 223, - 225, 212, 102, 227,32767, 561, 562, 223, 102, 227, - 227, 227, 247, 247, 485, 318, 102, 100, 102, 102, - 197, 318, 318,32767, 102, 485, 318, 485, 318, 199, - 318, 318, 318, 485, 318,32767, 102, 318, 214, 100, - 100, 318,32767,32767,32767, 498,32767,32767,32767,32767, - 32767,32767,32767, 222,32767,32767,32767,32767,32767,32767, - 32767, 529,32767, 546, 559, 432, 433, 435, 544, 457, - 458, 459, 460, 461, 462, 463, 465, 591,32767, 502, - 32767,32767,32767, 338, 601,32767, 601,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767, 602,32767, 542,32767,32767,32767,32767, 431, - 9, 76, 491, 43, 44, 52, 58, 519, 520, 521, - 522, 516, 517, 523, 518,32767,32767, 524, 567,32767, - 32767, 543, 594,32767,32767,32767,32767,32767,32767, 139, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767, 529,32767, 137,32767,32767,32767,32767,32767,32767, - 32767,32767, 525,32767,32767,32767, 542,32767,32767,32767, - 32767, 314, 311,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767, 542, - 32767,32767,32767,32767,32767, 291,32767, 308,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767, 286,32767,32767, 381, 498, 294, - 296, 297,32767,32767,32767,32767, 360,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767, 153, 153, - 3, 3, 341, 153, 153, 153, 341, 341, 153, 341, - 341, 341, 153, 153, 153, 153, 153, 153, 280, 185, - 262, 265, 247, 247, 153, 352, 153 - ); - - protected $goto = array( - 196, 196, 1032, 704, 695, 431, 659, 1063, 1335, 1335, - 425, 313, 314, 335, 574, 319, 430, 336, 432, 636, - 652, 653, 851, 670, 671, 672, 1335, 167, 167, 167, - 167, 221, 197, 193, 193, 177, 179, 216, 193, 193, - 193, 193, 193, 194, 194, 194, 194, 194, 194, 188, - 189, 190, 191, 192, 218, 216, 219, 535, 536, 421, - 537, 539, 540, 541, 542, 543, 544, 545, 546, 1133, - 168, 169, 170, 195, 171, 172, 173, 166, 174, 175, - 176, 178, 215, 217, 220, 238, 243, 244, 245, 257, - 258, 259, 260, 261, 262, 263, 264, 268, 269, 270, - 271, 281, 282, 316, 317, 318, 426, 427, 428, 579, - 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, 234, 235, 236, 180, 237, 181, 198, 199, - 200, 239, 188, 189, 190, 191, 192, 218, 1133, 201, - 182, 183, 184, 202, 198, 185, 240, 203, 201, 165, - 204, 205, 186, 206, 207, 208, 187, 209, 210, 211, - 212, 213, 214, 854, 619, 656, 278, 278, 278, 278, - 852, 621, 621, 350, 419, 598, 1266, 1266, 1266, 1266, - 1266, 1266, 1266, 1266, 1266, 1266, 1284, 1284, 832, 1105, - 1106, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, - 1284, 353, 353, 353, 353, 826, 558, 551, 908, 903, - 904, 917, 860, 905, 857, 906, 907, 858, 1035, 1035, - 911, 864, 679, 950, 458, 863, 1027, 1043, 1044, 832, - 885, 832, 1085, 1080, 1081, 1082, 341, 551, 558, 567, - 568, 343, 577, 600, 614, 615, 547, 547, 547, 547, - 973, 602, 15, 394, 397, 559, 599, 603, 1213, 942, - 1234, 571, 1234, 1214, 1217, 943, 1218, 1032, 1032, 1234, - 440, 912, 1032, 913, 1032, 1032, 1038, 1037, 1032, 1032, - 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1316, - 1316, 1316, 1316, 1234, 476, 1309, 1310, 348, 1234, 1234, - 1234, 1234, 407, 408, 1234, 1234, 1234, 668, 1324, 669, - 354, 412, 413, 414, 867, 682, 466, 466, 415, 994, - 354, 354, 346, 924, 424, 466, 609, 925, 5, 879, - 6, 940, 866, 940, 354, 354, 1282, 1282, 354, 392, - 1351, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, - 1282, 553, 538, 538, 570, 354, 658, 538, 538, 538, - 538, 538, 538, 538, 538, 538, 538, 549, 565, 549, - 1041, 1042, 731, 635, 637, 850, 549, 657, 965, 410, - 703, 681, 685, 1008, 693, 702, 1004, 252, 252, 997, - 971, 971, 969, 971, 730, 1056, 550, 1006, 1001, 1182, - 456, 847, 1295, 1334, 1334, 967, 967, 967, 967, 325, - 308, 456, 961, 968, 249, 249, 249, 249, 251, 253, - 438, 1334, 351, 352, 684, 680, 552, 562, 450, 450, - 450, 552, 1306, 562, 1306, 479, 395, 462, 1337, 1311, - 1312, 1306, 664, 481, 500, 337, 501, 844, 469, 578, - 470, 471, 507, 847, 877, 553, 872, 1342, 1343, 1011, - 1011, 575, 612, 324, 275, 324, 1318, 1318, 1318, 1318, - 607, 622, 625, 626, 627, 628, 649, 650, 651, 706, - 956, 401, 692, 875, 1229, 828, 869, 692, 629, 631, - 633, 692, 433, 1302, 1225, 734, 613, 433, 880, 868, - 1068, 1072, 1069, 1016, 477, 1039, 1039, 881, 0, 976, - 663, 1050, 1046, 1047, 1073, 1116, 978, 0, 1227, 450, - 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, - 929, 1121, 450, 966, 1071, 0, 0, 617, 1304, 1304, - 1071, 1230, 1231, 1013, 0, 0, 0, 0, 0, 842, - 0, 871, 0, 662, 992, 1114, 884, 597, 1098, 865, - 707, 0, 0, 508, 698, 0, 1096, 1232, 1292, 1293, - 0, 1224, 0, 847, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 255, 255 - ); - - protected $gotoCheck = array( - 42, 42, 72, 9, 72, 65, 65, 126, 181, 181, - 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, - 85, 85, 26, 85, 85, 85, 181, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 15, 55, 55, 23, 23, 23, 23, - 27, 107, 107, 96, 43, 129, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 168, 168, 12, 143, - 143, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 24, 24, 24, 24, 6, 75, 75, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 88, 88, - 15, 15, 88, 88, 82, 15, 88, 88, 88, 12, - 45, 12, 15, 15, 15, 15, 75, 75, 75, 75, - 75, 75, 75, 75, 75, 75, 106, 106, 106, 106, - 49, 106, 75, 58, 58, 58, 58, 58, 78, 78, - 72, 170, 72, 78, 78, 78, 78, 72, 72, 72, - 82, 64, 72, 64, 72, 72, 117, 117, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 9, - 9, 9, 9, 72, 174, 174, 174, 177, 72, 72, - 72, 72, 81, 81, 72, 72, 72, 81, 179, 81, - 14, 81, 81, 81, 35, 81, 148, 148, 81, 102, - 14, 14, 81, 72, 13, 148, 13, 72, 46, 35, - 46, 9, 35, 9, 14, 14, 169, 169, 14, 61, - 14, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 14, 171, 171, 103, 14, 63, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 19, 48, 19, - 118, 118, 48, 48, 48, 25, 19, 48, 92, 92, - 92, 48, 48, 48, 48, 48, 48, 5, 5, 25, - 25, 25, 25, 25, 25, 113, 25, 25, 25, 150, - 19, 22, 14, 180, 180, 19, 19, 19, 19, 167, - 167, 19, 19, 19, 5, 5, 5, 5, 5, 5, - 112, 180, 96, 96, 14, 115, 9, 9, 23, 23, - 23, 9, 129, 9, 129, 83, 9, 9, 180, 176, - 176, 129, 119, 83, 154, 29, 154, 18, 9, 9, - 9, 9, 154, 22, 9, 14, 39, 9, 9, 106, - 106, 2, 2, 24, 24, 24, 129, 129, 129, 129, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 91, 28, 7, 9, 20, 7, 37, 7, 84, 84, - 84, 7, 116, 129, 159, 98, 79, 116, 16, 16, - 16, 16, 128, 109, 156, 116, 116, 41, -1, 16, - 116, 116, 116, 116, 131, 146, 95, -1, 14, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 17, 17, 23, 16, 129, -1, -1, 17, 129, 129, - 129, 20, 20, 17, -1, -1, -1, -1, -1, 20, - -1, 17, -1, 17, 17, 16, 16, 8, 8, 17, - 8, -1, -1, 8, 8, -1, 8, 20, 20, 20, - -1, 17, -1, 22, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 5, 5 - ); - - protected $gotoBase = array( - 0, 0, -249, 0, 0, 386, 192, 475, 549, -10, - 0, 0, -108, -13, 13, -184, 46, 65, 138, 102, - 93, 0, 123, 163, 198, 371, 18, 166, 144, 149, - 0, 0, 0, 0, 0, -56, 0, 147, 0, 133, - 0, 66, -1, 162, 0, 214, -406, 0, -341, 226, - 0, 0, 0, 0, 0, 124, 0, 0, 208, 0, - 0, 297, 0, 114, 251, -236, 0, 0, 0, 0, - 0, 0, -5, 0, 0, -138, 0, 0, -149, 153, - 113, -189, -54, -34, 9, -696, 0, 0, -61, 0, - 0, 151, 74, 0, 0, 73, -310, 0, 89, 0, - 0, 0, 284, 311, 0, 0, 218, -70, 0, 134, - 0, 0, 143, 122, 0, 142, 220, -3, 85, 152, - 0, 0, 0, 0, 0, 0, 5, 0, 129, 167, - 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -86, 0, 0, 71, 0, 282, 0, - 125, 0, 0, 0, -51, 0, 64, 0, 0, 126, - 0, 0, 0, 0, 0, 0, 0, 88, -55, 95, - 232, 111, 0, 0, -6, 0, 68, 267, 0, 277, - 96, -299, 0, 0 - ); - - protected $gotoDefault = array( - -32768, 512, 738, 4, 739, 933, 815, 824, 595, 529, - 705, 347, 623, 422, 1300, 910, 1120, 576, 843, 1243, - 1251, 457, 846, 330, 728, 892, 893, 894, 398, 385, - 859, 396, 647, 624, 494, 878, 453, 870, 486, 873, - 452, 882, 164, 418, 510, 886, 3, 889, 555, 920, - 386, 897, 387, 675, 899, 561, 901, 902, 393, 399, - 400, 1125, 569, 620, 914, 256, 563, 915, 384, 916, - 923, 389, 391, 686, 465, 505, 499, 411, 1100, 564, - 606, 644, 447, 473, 618, 630, 616, 480, 434, 416, - 329, 955, 963, 487, 463, 977, 349, 985, 736, 1132, - 638, 489, 993, 639, 1000, 1003, 530, 531, 478, 1015, - 272, 1018, 490, 12, 665, 1029, 1030, 666, 640, 1052, - 641, 667, 642, 1054, 472, 596, 1062, 454, 1070, 1288, - 455, 1074, 266, 1077, 277, 417, 435, 1083, 1084, 9, - 1090, 696, 697, 11, 276, 509, 1115, 687, 451, 1131, - 439, 1201, 1203, 557, 491, 1221, 1220, 678, 506, 1226, - 448, 1291, 449, 532, 474, 315, 533, 307, 333, 312, - 548, 294, 334, 534, 475, 1297, 1305, 331, 31, 1325, - 1336, 342, 573, 611 - ); - - protected $ruleToNonTerminal = array( - 0, 1, 3, 3, 2, 5, 5, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, - 7, 7, 7, 7, 7, 7, 8, 8, 9, 10, - 11, 11, 11, 12, 12, 13, 13, 14, 15, 15, - 16, 16, 17, 17, 18, 18, 21, 21, 22, 23, - 23, 24, 24, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 29, 29, 30, 30, 32, 34, - 34, 28, 36, 36, 33, 38, 38, 35, 35, 37, - 37, 39, 39, 31, 40, 40, 41, 43, 44, 44, - 45, 45, 46, 46, 48, 47, 47, 47, 47, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 25, 25, 68, 68, 71, 71, 70, - 69, 69, 62, 74, 74, 75, 75, 76, 76, 77, - 77, 78, 78, 79, 79, 26, 26, 27, 27, 27, - 27, 27, 87, 87, 89, 89, 82, 82, 90, 90, - 91, 91, 91, 83, 83, 86, 86, 84, 84, 92, - 93, 93, 56, 56, 64, 64, 67, 67, 67, 66, - 94, 94, 95, 57, 57, 57, 57, 96, 96, 97, - 97, 98, 98, 99, 100, 100, 101, 101, 102, 102, - 54, 54, 50, 50, 104, 52, 52, 105, 51, 51, - 53, 53, 63, 63, 63, 63, 80, 80, 108, 108, - 110, 110, 111, 111, 111, 111, 109, 109, 109, 113, - 113, 113, 113, 88, 88, 116, 116, 116, 117, 117, - 114, 114, 118, 118, 120, 120, 121, 121, 115, 122, - 122, 119, 123, 123, 123, 123, 112, 112, 81, 81, - 81, 20, 20, 20, 125, 124, 124, 126, 126, 126, - 126, 59, 127, 127, 128, 60, 130, 130, 131, 131, - 132, 132, 85, 133, 133, 133, 133, 133, 133, 133, - 138, 138, 139, 139, 140, 140, 140, 140, 140, 141, - 142, 142, 137, 137, 134, 134, 136, 136, 144, 144, - 143, 143, 143, 143, 143, 143, 143, 135, 145, 145, - 147, 146, 146, 61, 103, 148, 148, 55, 55, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 155, 149, 149, 154, 154, 157, 158, 158, - 159, 160, 161, 161, 161, 161, 19, 19, 72, 72, - 72, 72, 150, 150, 150, 150, 163, 163, 151, 151, - 153, 153, 153, 156, 156, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 169, 169, 169, 107, 171, 171, - 171, 171, 152, 152, 152, 152, 152, 152, 152, 152, - 58, 58, 166, 166, 166, 166, 172, 172, 162, 162, - 162, 173, 173, 173, 173, 173, 173, 73, 73, 65, - 65, 65, 65, 129, 129, 129, 129, 176, 175, 165, - 165, 165, 165, 165, 165, 165, 164, 164, 164, 174, - 174, 174, 174, 106, 170, 178, 178, 177, 177, 179, - 179, 179, 179, 179, 179, 179, 179, 167, 167, 167, - 167, 181, 182, 180, 180, 180, 180, 180, 180, 180, - 180, 183, 183, 183, 183 - ); - - protected $ruleToLength = array( - 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 1, 0, 1, 1, 2, 1, 3, 4, 1, - 2, 0, 1, 1, 1, 1, 1, 3, 5, 4, - 3, 4, 1, 3, 1, 1, 8, 7, 2, 3, - 1, 2, 3, 1, 2, 3, 1, 1, 3, 1, - 3, 1, 2, 2, 3, 1, 3, 2, 3, 1, - 3, 3, 2, 0, 1, 1, 1, 1, 1, 3, - 7, 10, 5, 7, 9, 5, 3, 3, 3, 3, - 3, 3, 1, 2, 5, 7, 9, 6, 5, 6, - 3, 2, 1, 1, 1, 0, 2, 1, 3, 8, - 0, 4, 2, 1, 3, 0, 1, 0, 1, 0, - 1, 3, 1, 1, 1, 8, 9, 7, 8, 7, - 6, 8, 0, 2, 0, 2, 1, 2, 1, 2, - 1, 1, 1, 0, 2, 0, 2, 0, 2, 2, - 1, 3, 1, 4, 1, 4, 1, 1, 4, 2, - 1, 3, 3, 3, 4, 4, 5, 0, 2, 4, - 3, 1, 1, 7, 0, 2, 1, 3, 3, 4, - 1, 4, 0, 2, 5, 0, 2, 6, 0, 2, - 0, 3, 1, 2, 1, 1, 2, 0, 1, 3, - 0, 2, 1, 1, 1, 1, 6, 8, 6, 1, - 2, 1, 1, 1, 1, 1, 1, 1, 1, 3, - 3, 3, 1, 3, 3, 3, 3, 3, 1, 3, - 3, 1, 1, 2, 1, 1, 0, 1, 0, 2, - 2, 2, 4, 3, 1, 1, 3, 1, 2, 2, - 3, 2, 3, 1, 1, 2, 3, 1, 1, 3, - 2, 0, 1, 5, 5, 6, 10, 3, 5, 1, - 1, 3, 0, 2, 4, 5, 4, 4, 4, 3, - 1, 1, 1, 1, 1, 1, 0, 1, 1, 2, - 1, 1, 1, 1, 1, 1, 1, 2, 1, 3, - 1, 1, 3, 2, 2, 3, 1, 0, 1, 1, - 3, 3, 3, 4, 1, 1, 2, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 5, 4, 3, - 4, 4, 2, 2, 4, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 1, 3, 2, 1, - 2, 4, 2, 2, 8, 9, 8, 9, 9, 10, - 9, 10, 8, 3, 2, 0, 4, 2, 1, 3, - 2, 1, 2, 2, 2, 4, 1, 1, 1, 1, - 1, 1, 1, 1, 3, 1, 1, 1, 0, 3, - 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 3, 5, 3, 3, 4, 1, - 1, 3, 1, 1, 1, 1, 1, 3, 2, 3, - 0, 1, 1, 3, 1, 1, 1, 1, 1, 3, - 1, 1, 4, 4, 1, 4, 4, 0, 1, 1, - 1, 3, 3, 1, 4, 2, 2, 1, 3, 1, - 4, 4, 3, 3, 3, 3, 1, 3, 1, 1, - 3, 1, 1, 4, 1, 1, 1, 3, 1, 1, - 2, 1, 3, 4, 3, 2, 0, 2, 2, 1, - 2, 1, 1, 1, 4, 3, 3, 3, 3, 6, - 3, 1, 1, 2, 1 - ); - - protected function initReduceCallbacks() { - $this->reduceCallbacks = [ - 0 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 1 => function ($stackPos) { - $this->semValue = $this->handleNamespaces($this->semStack[$stackPos-(1-1)]); - }, - 2 => function ($stackPos) { - if (is_array($this->semStack[$stackPos-(2-2)])) { $this->semValue = array_merge($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); } else { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }; - }, - 3 => function ($stackPos) { - $this->semValue = array(); - }, - 4 => function ($stackPos) { - $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; }; - if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 5 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 6 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 7 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 8 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 9 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 10 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 11 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 12 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 13 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 14 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 15 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 16 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 17 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 18 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 19 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 20 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 21 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 22 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 23 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 24 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 25 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 26 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 27 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 28 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 29 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 30 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 31 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 32 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 33 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 34 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 35 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 36 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 37 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 38 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 39 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 40 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 41 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 42 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 43 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 44 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 45 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 46 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 47 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 48 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 49 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 50 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 51 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 52 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 53 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 54 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 55 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 56 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 57 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 58 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 59 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 60 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 61 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 62 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 63 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 64 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 65 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 66 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 67 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 68 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 69 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 70 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 71 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 72 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 73 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 74 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 75 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 76 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 77 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 78 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 79 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 80 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 81 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 82 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 83 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 84 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 85 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 86 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 87 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 88 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 89 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 90 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 91 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 92 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 93 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 94 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 95 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 96 => function ($stackPos) { - $this->semValue = new Name(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 97 => function ($stackPos) { - $this->semValue = new Expr\Variable(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 98 => function ($stackPos) { - /* nothing */ - }, - 99 => function ($stackPos) { - /* nothing */ - }, - 100 => function ($stackPos) { - /* nothing */ - }, - 101 => function ($stackPos) { - $this->emitError(new Error('A trailing comma is not allowed here', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes)); - }, - 102 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 103 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 104 => function ($stackPos) { - $this->semValue = new Node\Attribute($this->semStack[$stackPos-(1-1)], [], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 105 => function ($stackPos) { - $this->semValue = new Node\Attribute($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 106 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 107 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 108 => function ($stackPos) { - $this->semValue = new Node\AttributeGroup($this->semStack[$stackPos-(4-2)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 109 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 110 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 111 => function ($stackPos) { - $this->semValue = []; - }, - 112 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 113 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 114 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 115 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 116 => function ($stackPos) { - $this->semValue = new Stmt\HaltCompiler($this->lexer->handleHaltCompiler(), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 117 => function ($stackPos) { - $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos-(3-2)], null, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_SEMICOLON); - $this->checkNamespace($this->semValue); - }, - 118 => function ($stackPos) { - $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos-(5-2)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); - $this->checkNamespace($this->semValue); - }, - 119 => function ($stackPos) { - $this->semValue = new Stmt\Namespace_(null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); - $this->checkNamespace($this->semValue); - }, - 120 => function ($stackPos) { - $this->semValue = new Stmt\Use_($this->semStack[$stackPos-(3-2)], Stmt\Use_::TYPE_NORMAL, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 121 => function ($stackPos) { - $this->semValue = new Stmt\Use_($this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-2)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 122 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 123 => function ($stackPos) { - $this->semValue = new Stmt\Const_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 124 => function ($stackPos) { - $this->semValue = Stmt\Use_::TYPE_FUNCTION; - }, - 125 => function ($stackPos) { - $this->semValue = Stmt\Use_::TYPE_CONSTANT; - }, - 126 => function ($stackPos) { - $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos-(8-3)], $this->semStack[$stackPos-(8-6)], $this->semStack[$stackPos-(8-2)], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); - }, - 127 => function ($stackPos) { - $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos-(7-2)], $this->semStack[$stackPos-(7-5)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); - }, - 128 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 129 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 130 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 131 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 132 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 133 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 134 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 135 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 136 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 137 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(1-1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(1-1)); - }, - 138 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(3-3)); - }, - 139 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(1-1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(1-1)); - }, - 140 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(3-3)); - }, - 141 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; $this->semValue->type = Stmt\Use_::TYPE_NORMAL; - }, - 142 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-2)]; $this->semValue->type = $this->semStack[$stackPos-(2-1)]; - }, - 143 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 144 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 145 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 146 => function ($stackPos) { - $this->semValue = new Node\Const_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 147 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 148 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 149 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 150 => function ($stackPos) { - $this->semValue = new Node\Const_(new Node\Identifier($this->semStack[$stackPos-(3-1)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributeStack[$stackPos-(3-1)]), $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 151 => function ($stackPos) { - $this->semValue = new Node\Const_(new Node\Identifier($this->semStack[$stackPos-(3-1)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributeStack[$stackPos-(3-1)]), $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 152 => function ($stackPos) { - if (is_array($this->semStack[$stackPos-(2-2)])) { $this->semValue = array_merge($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); } else { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }; - }, - 153 => function ($stackPos) { - $this->semValue = array(); - }, - 154 => function ($stackPos) { - $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; }; - if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 155 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 156 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 157 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 158 => function ($stackPos) { - throw new Error('__HALT_COMPILER() can only be used from the outermost scope', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 159 => function ($stackPos) { - - if ($this->semStack[$stackPos-(3-2)]) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; $attrs = $this->startAttributeStack[$stackPos-(3-1)]; $stmts = $this->semValue; if (!empty($attrs['comments'])) {$stmts[0]->setAttribute('comments', array_merge($attrs['comments'], $stmts[0]->getAttribute('comments', []))); }; - } else { - $startAttributes = $this->startAttributeStack[$stackPos-(3-1)]; if (isset($startAttributes['comments'])) { $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); } else { $this->semValue = null; }; - if (null === $this->semValue) { $this->semValue = array(); } - } - - }, - 160 => function ($stackPos) { - $this->semValue = new Stmt\If_($this->semStack[$stackPos-(7-3)], ['stmts' => is_array($this->semStack[$stackPos-(7-5)]) ? $this->semStack[$stackPos-(7-5)] : array($this->semStack[$stackPos-(7-5)]), 'elseifs' => $this->semStack[$stackPos-(7-6)], 'else' => $this->semStack[$stackPos-(7-7)]], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); - }, - 161 => function ($stackPos) { - $this->semValue = new Stmt\If_($this->semStack[$stackPos-(10-3)], ['stmts' => $this->semStack[$stackPos-(10-6)], 'elseifs' => $this->semStack[$stackPos-(10-7)], 'else' => $this->semStack[$stackPos-(10-8)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); - }, - 162 => function ($stackPos) { - $this->semValue = new Stmt\While_($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 163 => function ($stackPos) { - $this->semValue = new Stmt\Do_($this->semStack[$stackPos-(7-5)], is_array($this->semStack[$stackPos-(7-2)]) ? $this->semStack[$stackPos-(7-2)] : array($this->semStack[$stackPos-(7-2)]), $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); - }, - 164 => function ($stackPos) { - $this->semValue = new Stmt\For_(['init' => $this->semStack[$stackPos-(9-3)], 'cond' => $this->semStack[$stackPos-(9-5)], 'loop' => $this->semStack[$stackPos-(9-7)], 'stmts' => $this->semStack[$stackPos-(9-9)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); - }, - 165 => function ($stackPos) { - $this->semValue = new Stmt\Switch_($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 166 => function ($stackPos) { - $this->semValue = new Stmt\Break_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 167 => function ($stackPos) { - $this->semValue = new Stmt\Continue_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 168 => function ($stackPos) { - $this->semValue = new Stmt\Return_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 169 => function ($stackPos) { - $this->semValue = new Stmt\Global_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 170 => function ($stackPos) { - $this->semValue = new Stmt\Static_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 171 => function ($stackPos) { - $this->semValue = new Stmt\Echo_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 172 => function ($stackPos) { - $this->semValue = new Stmt\InlineHTML($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 173 => function ($stackPos) { - - $e = $this->semStack[$stackPos-(2-1)]; - if ($e instanceof Expr\Throw_) { - // For backwards-compatibility reasons, convert throw in statement position into - // Stmt\Throw_ rather than Stmt\Expression(Expr\Throw_). - $this->semValue = new Stmt\Throw_($e->expr, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - } else { - $this->semValue = new Stmt\Expression($e, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - } - - }, - 174 => function ($stackPos) { - $this->semValue = new Stmt\Unset_($this->semStack[$stackPos-(5-3)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 175 => function ($stackPos) { - $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-5)][0], ['keyVar' => null, 'byRef' => $this->semStack[$stackPos-(7-5)][1], 'stmts' => $this->semStack[$stackPos-(7-7)]], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); - }, - 176 => function ($stackPos) { - $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos-(9-3)], $this->semStack[$stackPos-(9-7)][0], ['keyVar' => $this->semStack[$stackPos-(9-5)], 'byRef' => $this->semStack[$stackPos-(9-7)][1], 'stmts' => $this->semStack[$stackPos-(9-9)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); - }, - 177 => function ($stackPos) { - $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos-(6-3)], new Expr\Error($this->startAttributeStack[$stackPos-(6-4)] + $this->endAttributeStack[$stackPos-(6-4)]), ['stmts' => $this->semStack[$stackPos-(6-6)]], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); - }, - 178 => function ($stackPos) { - $this->semValue = new Stmt\Declare_($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 179 => function ($stackPos) { - $this->semValue = new Stmt\TryCatch($this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-5)], $this->semStack[$stackPos-(6-6)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); $this->checkTryCatch($this->semValue); - }, - 180 => function ($stackPos) { - $this->semValue = new Stmt\Goto_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 181 => function ($stackPos) { - $this->semValue = new Stmt\Label($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 182 => function ($stackPos) { - $this->semValue = array(); /* means: no statement */ - }, - 183 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 184 => function ($stackPos) { - $startAttributes = $this->startAttributeStack[$stackPos-(1-1)]; if (isset($startAttributes['comments'])) { $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); } else { $this->semValue = null; }; - if ($this->semValue === null) $this->semValue = array(); /* means: no statement */ - }, - 185 => function ($stackPos) { - $this->semValue = array(); - }, - 186 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 187 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 188 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 189 => function ($stackPos) { - $this->semValue = new Stmt\Catch_($this->semStack[$stackPos-(8-3)], $this->semStack[$stackPos-(8-4)], $this->semStack[$stackPos-(8-7)], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); - }, - 190 => function ($stackPos) { - $this->semValue = null; - }, - 191 => function ($stackPos) { - $this->semValue = new Stmt\Finally_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 192 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 193 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 194 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 195 => function ($stackPos) { - $this->semValue = false; - }, - 196 => function ($stackPos) { - $this->semValue = true; - }, - 197 => function ($stackPos) { - $this->semValue = false; - }, - 198 => function ($stackPos) { - $this->semValue = true; - }, - 199 => function ($stackPos) { - $this->semValue = false; - }, - 200 => function ($stackPos) { - $this->semValue = true; - }, - 201 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 202 => function ($stackPos) { - $this->semValue = []; - }, - 203 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 204 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 205 => function ($stackPos) { - $this->semValue = new Stmt\Function_($this->semStack[$stackPos-(8-3)], ['byRef' => $this->semStack[$stackPos-(8-2)], 'params' => $this->semStack[$stackPos-(8-5)], 'returnType' => $this->semStack[$stackPos-(8-7)], 'stmts' => $this->semStack[$stackPos-(8-8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); - }, - 206 => function ($stackPos) { - $this->semValue = new Stmt\Function_($this->semStack[$stackPos-(9-4)], ['byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-6)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => $this->semStack[$stackPos-(9-1)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); - }, - 207 => function ($stackPos) { - $this->semValue = new Stmt\Class_($this->semStack[$stackPos-(7-2)], ['type' => $this->semStack[$stackPos-(7-1)], 'extends' => $this->semStack[$stackPos-(7-3)], 'implements' => $this->semStack[$stackPos-(7-4)], 'stmts' => $this->semStack[$stackPos-(7-6)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); - $this->checkClass($this->semValue, $stackPos-(7-2)); - }, - 208 => function ($stackPos) { - $this->semValue = new Stmt\Class_($this->semStack[$stackPos-(8-3)], ['type' => $this->semStack[$stackPos-(8-2)], 'extends' => $this->semStack[$stackPos-(8-4)], 'implements' => $this->semStack[$stackPos-(8-5)], 'stmts' => $this->semStack[$stackPos-(8-7)], 'attrGroups' => $this->semStack[$stackPos-(8-1)]], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); - $this->checkClass($this->semValue, $stackPos-(8-3)); - }, - 209 => function ($stackPos) { - $this->semValue = new Stmt\Interface_($this->semStack[$stackPos-(7-3)], ['extends' => $this->semStack[$stackPos-(7-4)], 'stmts' => $this->semStack[$stackPos-(7-6)], 'attrGroups' => $this->semStack[$stackPos-(7-1)]], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); - $this->checkInterface($this->semValue, $stackPos-(7-3)); - }, - 210 => function ($stackPos) { - $this->semValue = new Stmt\Trait_($this->semStack[$stackPos-(6-3)], ['stmts' => $this->semStack[$stackPos-(6-5)], 'attrGroups' => $this->semStack[$stackPos-(6-1)]], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); - }, - 211 => function ($stackPos) { - $this->semValue = new Stmt\Enum_($this->semStack[$stackPos-(8-3)], ['scalarType' => $this->semStack[$stackPos-(8-4)], 'implements' => $this->semStack[$stackPos-(8-5)], 'stmts' => $this->semStack[$stackPos-(8-7)], 'attrGroups' => $this->semStack[$stackPos-(8-1)]], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); - $this->checkEnum($this->semValue, $stackPos-(8-3)); - }, - 212 => function ($stackPos) { - $this->semValue = null; - }, - 213 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-2)]; - }, - 214 => function ($stackPos) { - $this->semValue = null; - }, - 215 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-2)]; - }, - 216 => function ($stackPos) { - $this->semValue = 0; - }, - 217 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 218 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 219 => function ($stackPos) { - $this->checkClassModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)]; - }, - 220 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; - }, - 221 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_FINAL; - }, - 222 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_READONLY; - }, - 223 => function ($stackPos) { - $this->semValue = null; - }, - 224 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-2)]; - }, - 225 => function ($stackPos) { - $this->semValue = array(); - }, - 226 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-2)]; - }, - 227 => function ($stackPos) { - $this->semValue = array(); - }, - 228 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-2)]; - }, - 229 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 230 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 231 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 232 => function ($stackPos) { - $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); - }, - 233 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-2)]; - }, - 234 => function ($stackPos) { - $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); - }, - 235 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-2)]; - }, - 236 => function ($stackPos) { - $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); - }, - 237 => function ($stackPos) { - $this->semValue = null; - }, - 238 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-2)]; - }, - 239 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 240 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 241 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 242 => function ($stackPos) { - $this->semValue = new Stmt\DeclareDeclare($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 243 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 244 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-3)]; - }, - 245 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-2)]; - }, - 246 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(5-3)]; - }, - 247 => function ($stackPos) { - $this->semValue = array(); - }, - 248 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 249 => function ($stackPos) { - $this->semValue = new Stmt\Case_($this->semStack[$stackPos-(4-2)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 250 => function ($stackPos) { - $this->semValue = new Stmt\Case_(null, $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 251 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 252 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 253 => function ($stackPos) { - $this->semValue = new Expr\Match_($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-6)], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); - }, - 254 => function ($stackPos) { - $this->semValue = []; - }, - 255 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 256 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 257 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 258 => function ($stackPos) { - $this->semValue = new Node\MatchArm($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 259 => function ($stackPos) { - $this->semValue = new Node\MatchArm(null, $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 260 => function ($stackPos) { - $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); - }, - 261 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-2)]; - }, - 262 => function ($stackPos) { - $this->semValue = array(); - }, - 263 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 264 => function ($stackPos) { - $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(5-3)], is_array($this->semStack[$stackPos-(5-5)]) ? $this->semStack[$stackPos-(5-5)] : array($this->semStack[$stackPos-(5-5)]), $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 265 => function ($stackPos) { - $this->semValue = array(); - }, - 266 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 267 => function ($stackPos) { - $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-6)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); $this->fixupAlternativeElse($this->semValue); - }, - 268 => function ($stackPos) { - $this->semValue = null; - }, - 269 => function ($stackPos) { - $this->semValue = new Stmt\Else_(is_array($this->semStack[$stackPos-(2-2)]) ? $this->semStack[$stackPos-(2-2)] : array($this->semStack[$stackPos-(2-2)]), $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 270 => function ($stackPos) { - $this->semValue = null; - }, - 271 => function ($stackPos) { - $this->semValue = new Stmt\Else_($this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->fixupAlternativeElse($this->semValue); - }, - 272 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)], false); - }, - 273 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(2-2)], true); - }, - 274 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)], false); - }, - 275 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)], false); - }, - 276 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 277 => function ($stackPos) { - $this->semValue = array(); - }, - 278 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 279 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 280 => function ($stackPos) { - $this->semValue = 0; - }, - 281 => function ($stackPos) { - $this->checkModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)]; - }, - 282 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PUBLIC; - }, - 283 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PROTECTED; - }, - 284 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PRIVATE; - }, - 285 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_READONLY; - }, - 286 => function ($stackPos) { - $this->semValue = new Node\Param($this->semStack[$stackPos-(6-6)], null, $this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-4)], $this->semStack[$stackPos-(6-5)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes, $this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-1)]); - $this->checkParam($this->semValue); - }, - 287 => function ($stackPos) { - $this->semValue = new Node\Param($this->semStack[$stackPos-(8-6)], $this->semStack[$stackPos-(8-8)], $this->semStack[$stackPos-(8-3)], $this->semStack[$stackPos-(8-4)], $this->semStack[$stackPos-(8-5)], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes, $this->semStack[$stackPos-(8-2)], $this->semStack[$stackPos-(8-1)]); - $this->checkParam($this->semValue); - }, - 288 => function ($stackPos) { - $this->semValue = new Node\Param(new Expr\Error($this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes), null, $this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-4)], $this->semStack[$stackPos-(6-5)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes, $this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-1)]); - }, - 289 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 290 => function ($stackPos) { - $this->semValue = new Node\NullableType($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 291 => function ($stackPos) { - $this->semValue = new Node\UnionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 292 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 293 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 294 => function ($stackPos) { - $this->semValue = new Node\Name('static', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 295 => function ($stackPos) { - $this->semValue = $this->handleBuiltinTypes($this->semStack[$stackPos-(1-1)]); - }, - 296 => function ($stackPos) { - $this->semValue = new Node\Identifier('array', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 297 => function ($stackPos) { - $this->semValue = new Node\Identifier('callable', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 298 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 299 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 300 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); - }, - 301 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 302 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 303 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 304 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); - }, - 305 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 306 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); - }, - 307 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 308 => function ($stackPos) { - $this->semValue = new Node\IntersectionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 309 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); - }, - 310 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 311 => function ($stackPos) { - $this->semValue = new Node\IntersectionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 312 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 313 => function ($stackPos) { - $this->semValue = new Node\NullableType($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 314 => function ($stackPos) { - $this->semValue = new Node\UnionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 315 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 316 => function ($stackPos) { - $this->semValue = null; - }, - 317 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 318 => function ($stackPos) { - $this->semValue = null; - }, - 319 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-2)]; - }, - 320 => function ($stackPos) { - $this->semValue = null; - }, - 321 => function ($stackPos) { - $this->semValue = array(); - }, - 322 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-2)]; - }, - 323 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(3-2)]); - }, - 324 => function ($stackPos) { - $this->semValue = new Node\VariadicPlaceholder($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 325 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 326 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 327 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos-(1-1)], false, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 328 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], true, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 329 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], false, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 330 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos-(3-3)], false, false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->semStack[$stackPos-(3-1)]); - }, - 331 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 332 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 333 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 334 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 335 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 336 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 337 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 338 => function ($stackPos) { - $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos-(1-1)], null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 339 => function ($stackPos) { - $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 340 => function ($stackPos) { - if ($this->semStack[$stackPos-(2-2)] !== null) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; } else { $this->semValue = $this->semStack[$stackPos-(2-1)]; } - }, - 341 => function ($stackPos) { - $this->semValue = array(); - }, - 342 => function ($stackPos) { - $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; }; - if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 343 => function ($stackPos) { - $this->semValue = new Stmt\Property($this->semStack[$stackPos-(5-2)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes, $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-1)]); - $this->checkProperty($this->semValue, $stackPos-(5-2)); - }, - 344 => function ($stackPos) { - $this->semValue = new Stmt\ClassConst($this->semStack[$stackPos-(5-4)], $this->semStack[$stackPos-(5-2)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes, $this->semStack[$stackPos-(5-1)]); - $this->checkClassConst($this->semValue, $stackPos-(5-2)); - }, - 345 => function ($stackPos) { - $this->semValue = new Stmt\ClassConst($this->semStack[$stackPos-(6-5)], $this->semStack[$stackPos-(6-2)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes, $this->semStack[$stackPos-(6-1)], $this->semStack[$stackPos-(6-4)]); - $this->checkClassConst($this->semValue, $stackPos-(6-2)); - }, - 346 => function ($stackPos) { - $this->semValue = new Stmt\ClassMethod($this->semStack[$stackPos-(10-5)], ['type' => $this->semStack[$stackPos-(10-2)], 'byRef' => $this->semStack[$stackPos-(10-4)], 'params' => $this->semStack[$stackPos-(10-7)], 'returnType' => $this->semStack[$stackPos-(10-9)], 'stmts' => $this->semStack[$stackPos-(10-10)], 'attrGroups' => $this->semStack[$stackPos-(10-1)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); - $this->checkClassMethod($this->semValue, $stackPos-(10-2)); - }, - 347 => function ($stackPos) { - $this->semValue = new Stmt\TraitUse($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 348 => function ($stackPos) { - $this->semValue = new Stmt\EnumCase($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-4)], $this->semStack[$stackPos-(5-1)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 349 => function ($stackPos) { - $this->semValue = null; /* will be skipped */ - }, - 350 => function ($stackPos) { - $this->semValue = array(); - }, - 351 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 352 => function ($stackPos) { - $this->semValue = array(); - }, - 353 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 354 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Precedence($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 355 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(5-1)][0], $this->semStack[$stackPos-(5-1)][1], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 356 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], null, $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 357 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 358 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 359 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); - }, - 360 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 361 => function ($stackPos) { - $this->semValue = array(null, $this->semStack[$stackPos-(1-1)]); - }, - 362 => function ($stackPos) { - $this->semValue = null; - }, - 363 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 364 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 365 => function ($stackPos) { - $this->semValue = 0; - }, - 366 => function ($stackPos) { - $this->semValue = 0; - }, - 367 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 368 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 369 => function ($stackPos) { - $this->checkModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)]; - }, - 370 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PUBLIC; - }, - 371 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PROTECTED; - }, - 372 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PRIVATE; - }, - 373 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_STATIC; - }, - 374 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; - }, - 375 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_FINAL; - }, - 376 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_READONLY; - }, - 377 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 378 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 379 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 380 => function ($stackPos) { - $this->semValue = new Node\VarLikeIdentifier(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 381 => function ($stackPos) { - $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos-(1-1)], null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 382 => function ($stackPos) { - $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 383 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 384 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 385 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 386 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 387 => function ($stackPos) { - $this->semValue = array(); - }, - 388 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 389 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 390 => function ($stackPos) { - $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 391 => function ($stackPos) { - $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 392 => function ($stackPos) { - $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 393 => function ($stackPos) { - $this->semValue = new Expr\AssignRef($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 394 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 395 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 396 => function ($stackPos) { - $this->semValue = new Expr\Clone_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 397 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 398 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 399 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 400 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 401 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 402 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 403 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 404 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 405 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 406 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 407 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 408 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 409 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 410 => function ($stackPos) { - $this->semValue = new Expr\PostInc($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 411 => function ($stackPos) { - $this->semValue = new Expr\PreInc($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 412 => function ($stackPos) { - $this->semValue = new Expr\PostDec($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 413 => function ($stackPos) { - $this->semValue = new Expr\PreDec($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 414 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 415 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 416 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 417 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 418 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 419 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 420 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 421 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 422 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 423 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 424 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 425 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 426 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 427 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 428 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 429 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 430 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 431 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 432 => function ($stackPos) { - $this->semValue = new Expr\UnaryPlus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 433 => function ($stackPos) { - $this->semValue = new Expr\UnaryMinus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 434 => function ($stackPos) { - $this->semValue = new Expr\BooleanNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 435 => function ($stackPos) { - $this->semValue = new Expr\BitwiseNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 436 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 437 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 438 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 439 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 440 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Spaceship($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 441 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 442 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 443 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 444 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 445 => function ($stackPos) { - $this->semValue = new Expr\Instanceof_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 446 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 447 => function ($stackPos) { - $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(5-1)], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 448 => function ($stackPos) { - $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(4-1)], null, $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 449 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 450 => function ($stackPos) { - $this->semValue = new Expr\Isset_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 451 => function ($stackPos) { - $this->semValue = new Expr\Empty_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 452 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 453 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE_ONCE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 454 => function ($stackPos) { - $this->semValue = new Expr\Eval_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 455 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 456 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE_ONCE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 457 => function ($stackPos) { - $this->semValue = new Expr\Cast\Int_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 458 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes; - $attrs['kind'] = $this->getFloatCastKind($this->semStack[$stackPos-(2-1)]); - $this->semValue = new Expr\Cast\Double($this->semStack[$stackPos-(2-2)], $attrs); - }, - 459 => function ($stackPos) { - $this->semValue = new Expr\Cast\String_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 460 => function ($stackPos) { - $this->semValue = new Expr\Cast\Array_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 461 => function ($stackPos) { - $this->semValue = new Expr\Cast\Object_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 462 => function ($stackPos) { - $this->semValue = new Expr\Cast\Bool_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 463 => function ($stackPos) { - $this->semValue = new Expr\Cast\Unset_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 464 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes; - $attrs['kind'] = strtolower($this->semStack[$stackPos-(2-1)]) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE; - $this->semValue = new Expr\Exit_($this->semStack[$stackPos-(2-2)], $attrs); - }, - 465 => function ($stackPos) { - $this->semValue = new Expr\ErrorSuppress($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 466 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 467 => function ($stackPos) { - $this->semValue = new Expr\ShellExec($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 468 => function ($stackPos) { - $this->semValue = new Expr\Print_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 469 => function ($stackPos) { - $this->semValue = new Expr\Yield_(null, null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 470 => function ($stackPos) { - $this->semValue = new Expr\Yield_($this->semStack[$stackPos-(2-2)], null, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 471 => function ($stackPos) { - $this->semValue = new Expr\Yield_($this->semStack[$stackPos-(4-4)], $this->semStack[$stackPos-(4-2)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 472 => function ($stackPos) { - $this->semValue = new Expr\YieldFrom($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 473 => function ($stackPos) { - $this->semValue = new Expr\Throw_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 474 => function ($stackPos) { - $this->semValue = new Expr\ArrowFunction(['static' => false, 'byRef' => $this->semStack[$stackPos-(8-2)], 'params' => $this->semStack[$stackPos-(8-4)], 'returnType' => $this->semStack[$stackPos-(8-6)], 'expr' => $this->semStack[$stackPos-(8-8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); - }, - 475 => function ($stackPos) { - $this->semValue = new Expr\ArrowFunction(['static' => true, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'returnType' => $this->semStack[$stackPos-(9-7)], 'expr' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); - }, - 476 => function ($stackPos) { - $this->semValue = new Expr\Closure(['static' => false, 'byRef' => $this->semStack[$stackPos-(8-2)], 'params' => $this->semStack[$stackPos-(8-4)], 'uses' => $this->semStack[$stackPos-(8-6)], 'returnType' => $this->semStack[$stackPos-(8-7)], 'stmts' => $this->semStack[$stackPos-(8-8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); - }, - 477 => function ($stackPos) { - $this->semValue = new Expr\Closure(['static' => true, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'uses' => $this->semStack[$stackPos-(9-7)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); - }, - 478 => function ($stackPos) { - $this->semValue = new Expr\ArrowFunction(['static' => false, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'returnType' => $this->semStack[$stackPos-(9-7)], 'expr' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => $this->semStack[$stackPos-(9-1)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); - }, - 479 => function ($stackPos) { - $this->semValue = new Expr\ArrowFunction(['static' => true, 'byRef' => $this->semStack[$stackPos-(10-4)], 'params' => $this->semStack[$stackPos-(10-6)], 'returnType' => $this->semStack[$stackPos-(10-8)], 'expr' => $this->semStack[$stackPos-(10-10)], 'attrGroups' => $this->semStack[$stackPos-(10-1)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); - }, - 480 => function ($stackPos) { - $this->semValue = new Expr\Closure(['static' => false, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'uses' => $this->semStack[$stackPos-(9-7)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => $this->semStack[$stackPos-(9-1)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); - }, - 481 => function ($stackPos) { - $this->semValue = new Expr\Closure(['static' => true, 'byRef' => $this->semStack[$stackPos-(10-4)], 'params' => $this->semStack[$stackPos-(10-6)], 'uses' => $this->semStack[$stackPos-(10-8)], 'returnType' => $this->semStack[$stackPos-(10-9)], 'stmts' => $this->semStack[$stackPos-(10-10)], 'attrGroups' => $this->semStack[$stackPos-(10-1)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); - }, - 482 => function ($stackPos) { - $this->semValue = array(new Stmt\Class_(null, ['type' => $this->semStack[$stackPos-(8-2)], 'extends' => $this->semStack[$stackPos-(8-4)], 'implements' => $this->semStack[$stackPos-(8-5)], 'stmts' => $this->semStack[$stackPos-(8-7)], 'attrGroups' => $this->semStack[$stackPos-(8-1)]], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes), $this->semStack[$stackPos-(8-3)]); - $this->checkClass($this->semValue[0], -1); - }, - 483 => function ($stackPos) { - $this->semValue = new Expr\New_($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 484 => function ($stackPos) { - list($class, $ctorArgs) = $this->semStack[$stackPos-(2-2)]; $this->semValue = new Expr\New_($class, $ctorArgs, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 485 => function ($stackPos) { - $this->semValue = array(); - }, - 486 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-3)]; - }, - 487 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 488 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 489 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 490 => function ($stackPos) { - $this->semValue = new Expr\ClosureUse($this->semStack[$stackPos-(2-2)], $this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 491 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 492 => function ($stackPos) { - $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 493 => function ($stackPos) { - $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 494 => function ($stackPos) { - $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 495 => function ($stackPos) { - $this->semValue = new Expr\StaticCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 496 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 497 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 498 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 499 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 500 => function ($stackPos) { - $this->semValue = new Name\FullyQualified(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 501 => function ($stackPos) { - $this->semValue = new Name\Relative(substr($this->semStack[$stackPos-(1-1)], 10), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 502 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 503 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 504 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 505 => function ($stackPos) { - $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->errorState = 2; - }, - 506 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 507 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 508 => function ($stackPos) { - $this->semValue = null; - }, - 509 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 510 => function ($stackPos) { - $this->semValue = array(); - }, - 511 => function ($stackPos) { - $this->semValue = array(new Scalar\EncapsedStringPart(Scalar\String_::parseEscapeSequences($this->semStack[$stackPos-(1-1)], '`'), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes)); - }, - 512 => function ($stackPos) { - foreach ($this->semStack[$stackPos-(1-1)] as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '`', true); } }; $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 513 => function ($stackPos) { - $this->semValue = array(); - }, - 514 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 515 => function ($stackPos) { - $this->semValue = new Expr\ConstFetch($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 516 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Line($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 517 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\File($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 518 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Dir($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 519 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Class_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 520 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Trait_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 521 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Method($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 522 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Function_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 523 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Namespace_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 524 => function ($stackPos) { - $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 525 => function ($stackPos) { - $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(5-1)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 526 => function ($stackPos) { - $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], new Expr\Error($this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)]), $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->errorState = 2; - }, - 527 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes; $attrs['kind'] = Expr\Array_::KIND_SHORT; - $this->semValue = new Expr\Array_($this->semStack[$stackPos-(3-2)], $attrs); - }, - 528 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes; $attrs['kind'] = Expr\Array_::KIND_LONG; - $this->semValue = new Expr\Array_($this->semStack[$stackPos-(4-3)], $attrs); - }, - 529 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 530 => function ($stackPos) { - $this->semValue = Scalar\String_::fromString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 531 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes; $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED; - foreach ($this->semStack[$stackPos-(3-2)] as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '"', true); } }; $this->semValue = new Scalar\Encapsed($this->semStack[$stackPos-(3-2)], $attrs); - }, - 532 => function ($stackPos) { - $this->semValue = $this->parseLNumber($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 533 => function ($stackPos) { - $this->semValue = Scalar\DNumber::fromString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 534 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 535 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 536 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 537 => function ($stackPos) { - $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)], true); - }, - 538 => function ($stackPos) { - $this->semValue = $this->parseDocString($this->semStack[$stackPos-(2-1)], '', $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(2-2)] + $this->endAttributeStack[$stackPos-(2-2)], true); - }, - 539 => function ($stackPos) { - $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)], true); - }, - 540 => function ($stackPos) { - $this->semValue = null; - }, - 541 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 542 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 543 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 544 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 545 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 546 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 547 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 548 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 549 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 550 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 551 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 552 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 553 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 554 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 555 => function ($stackPos) { - $this->semValue = new Expr\MethodCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 556 => function ($stackPos) { - $this->semValue = new Expr\NullsafeMethodCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 557 => function ($stackPos) { - $this->semValue = null; - }, - 558 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 559 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 560 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 561 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 562 => function ($stackPos) { - $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 563 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 564 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 565 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 566 => function ($stackPos) { - $this->semValue = new Expr\Variable(new Expr\Error($this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes), $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); $this->errorState = 2; - }, - 567 => function ($stackPos) { - $var = $this->semStack[$stackPos-(1-1)]->name; $this->semValue = \is_string($var) ? new Node\VarLikeIdentifier($var, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes) : $var; - }, - 568 => function ($stackPos) { - $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 569 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 570 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 571 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 572 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 573 => function ($stackPos) { - $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 574 => function ($stackPos) { - $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 575 => function ($stackPos) { - $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 576 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 577 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 578 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 579 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 580 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 581 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 582 => function ($stackPos) { - $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->errorState = 2; - }, - 583 => function ($stackPos) { - $this->semValue = new Expr\List_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 584 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; $end = count($this->semValue)-1; if ($this->semValue[$end] === null) array_pop($this->semValue); - }, - 585 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 586 => function ($stackPos) { - /* do nothing -- prevent default action of $$=$this->semStack[$1]. See $551. */ - }, - 587 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 588 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 589 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 590 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 591 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 592 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 593 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(4-4)], $this->semStack[$stackPos-(4-1)], true, $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 594 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 595 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, true); - }, - 596 => function ($stackPos) { - $this->semValue = null; - }, - 597 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 598 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 599 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 600 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); - }, - 601 => function ($stackPos) { - $this->semValue = new Scalar\EncapsedStringPart($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 602 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 603 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 604 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 605 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 606 => function ($stackPos) { - $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 607 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 608 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 609 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-4)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); - }, - 610 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 611 => function ($stackPos) { - $this->semValue = new Scalar\String_($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 612 => function ($stackPos) { - $this->semValue = $this->parseNumString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 613 => function ($stackPos) { - $this->semValue = $this->parseNumString('-' . $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 614 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - ]; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/Parser/Tokens.php b/vendor/nikic/php-parser/lib/PhpParser/Parser/Tokens.php deleted file mode 100644 index b76a5d9..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/Parser/Tokens.php +++ /dev/null @@ -1,148 +0,0 @@ -<?php - -namespace PhpParser\Parser; - -/* GENERATED file based on grammar/tokens.y */ -final class Tokens -{ - const YYERRTOK = 256; - const T_THROW = 257; - const T_INCLUDE = 258; - const T_INCLUDE_ONCE = 259; - const T_EVAL = 260; - const T_REQUIRE = 261; - const T_REQUIRE_ONCE = 262; - const T_LOGICAL_OR = 263; - const T_LOGICAL_XOR = 264; - const T_LOGICAL_AND = 265; - const T_PRINT = 266; - const T_YIELD = 267; - const T_DOUBLE_ARROW = 268; - const T_YIELD_FROM = 269; - const T_PLUS_EQUAL = 270; - const T_MINUS_EQUAL = 271; - const T_MUL_EQUAL = 272; - const T_DIV_EQUAL = 273; - const T_CONCAT_EQUAL = 274; - const T_MOD_EQUAL = 275; - const T_AND_EQUAL = 276; - const T_OR_EQUAL = 277; - const T_XOR_EQUAL = 278; - const T_SL_EQUAL = 279; - const T_SR_EQUAL = 280; - const T_POW_EQUAL = 281; - const T_COALESCE_EQUAL = 282; - const T_COALESCE = 283; - const T_BOOLEAN_OR = 284; - const T_BOOLEAN_AND = 285; - const T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG = 286; - const T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG = 287; - const T_IS_EQUAL = 288; - const T_IS_NOT_EQUAL = 289; - const T_IS_IDENTICAL = 290; - const T_IS_NOT_IDENTICAL = 291; - const T_SPACESHIP = 292; - const T_IS_SMALLER_OR_EQUAL = 293; - const T_IS_GREATER_OR_EQUAL = 294; - const T_SL = 295; - const T_SR = 296; - const T_INSTANCEOF = 297; - const T_INC = 298; - const T_DEC = 299; - const T_INT_CAST = 300; - const T_DOUBLE_CAST = 301; - const T_STRING_CAST = 302; - const T_ARRAY_CAST = 303; - const T_OBJECT_CAST = 304; - const T_BOOL_CAST = 305; - const T_UNSET_CAST = 306; - const T_POW = 307; - const T_NEW = 308; - const T_CLONE = 309; - const T_EXIT = 310; - const T_IF = 311; - const T_ELSEIF = 312; - const T_ELSE = 313; - const T_ENDIF = 314; - const T_LNUMBER = 315; - const T_DNUMBER = 316; - const T_STRING = 317; - const T_STRING_VARNAME = 318; - const T_VARIABLE = 319; - const T_NUM_STRING = 320; - const T_INLINE_HTML = 321; - const T_ENCAPSED_AND_WHITESPACE = 322; - const T_CONSTANT_ENCAPSED_STRING = 323; - const T_ECHO = 324; - const T_DO = 325; - const T_WHILE = 326; - const T_ENDWHILE = 327; - const T_FOR = 328; - const T_ENDFOR = 329; - const T_FOREACH = 330; - const T_ENDFOREACH = 331; - const T_DECLARE = 332; - const T_ENDDECLARE = 333; - const T_AS = 334; - const T_SWITCH = 335; - const T_MATCH = 336; - const T_ENDSWITCH = 337; - const T_CASE = 338; - const T_DEFAULT = 339; - const T_BREAK = 340; - const T_CONTINUE = 341; - const T_GOTO = 342; - const T_FUNCTION = 343; - const T_FN = 344; - const T_CONST = 345; - const T_RETURN = 346; - const T_TRY = 347; - const T_CATCH = 348; - const T_FINALLY = 349; - const T_USE = 350; - const T_INSTEADOF = 351; - const T_GLOBAL = 352; - const T_STATIC = 353; - const T_ABSTRACT = 354; - const T_FINAL = 355; - const T_PRIVATE = 356; - const T_PROTECTED = 357; - const T_PUBLIC = 358; - const T_READONLY = 359; - const T_VAR = 360; - const T_UNSET = 361; - const T_ISSET = 362; - const T_EMPTY = 363; - const T_HALT_COMPILER = 364; - const T_CLASS = 365; - const T_TRAIT = 366; - const T_INTERFACE = 367; - const T_ENUM = 368; - const T_EXTENDS = 369; - const T_IMPLEMENTS = 370; - const T_OBJECT_OPERATOR = 371; - const T_NULLSAFE_OBJECT_OPERATOR = 372; - const T_LIST = 373; - const T_ARRAY = 374; - const T_CALLABLE = 375; - const T_CLASS_C = 376; - const T_TRAIT_C = 377; - const T_METHOD_C = 378; - const T_FUNC_C = 379; - const T_LINE = 380; - const T_FILE = 381; - const T_START_HEREDOC = 382; - const T_END_HEREDOC = 383; - const T_DOLLAR_OPEN_CURLY_BRACES = 384; - const T_CURLY_OPEN = 385; - const T_PAAMAYIM_NEKUDOTAYIM = 386; - const T_NAMESPACE = 387; - const T_NS_C = 388; - const T_DIR = 389; - const T_NS_SEPARATOR = 390; - const T_ELLIPSIS = 391; - const T_NAME_FULLY_QUALIFIED = 392; - const T_NAME_QUALIFIED = 393; - const T_NAME_RELATIVE = 394; - const T_ATTRIBUTE = 395; -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/ParserAbstract.php b/vendor/nikic/php-parser/lib/PhpParser/ParserAbstract.php deleted file mode 100644 index 567e09a..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/ParserAbstract.php +++ /dev/null @@ -1,1060 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser; - -/* - * This parser is based on a skeleton written by Moriyoshi Koizumi, which in - * turn is based on work by Masato Bito. - */ -use PhpParser\Node\Expr; -use PhpParser\Node\Expr\Cast\Double; -use PhpParser\Node\Name; -use PhpParser\Node\Param; -use PhpParser\Node\Scalar\Encapsed; -use PhpParser\Node\Scalar\LNumber; -use PhpParser\Node\Scalar\String_; -use PhpParser\Node\Stmt\Class_; -use PhpParser\Node\Stmt\ClassConst; -use PhpParser\Node\Stmt\ClassMethod; -use PhpParser\Node\Stmt\Else_; -use PhpParser\Node\Stmt\ElseIf_; -use PhpParser\Node\Stmt\Enum_; -use PhpParser\Node\Stmt\Interface_; -use PhpParser\Node\Stmt\Namespace_; -use PhpParser\Node\Stmt\Nop; -use PhpParser\Node\Stmt\Property; -use PhpParser\Node\Stmt\TryCatch; -use PhpParser\Node\Stmt\UseUse; -use PhpParser\Node\VarLikeIdentifier; - -abstract class ParserAbstract implements Parser -{ - const SYMBOL_NONE = -1; - - /* - * The following members will be filled with generated parsing data: - */ - - /** @var int Size of $tokenToSymbol map */ - protected $tokenToSymbolMapSize; - /** @var int Size of $action table */ - protected $actionTableSize; - /** @var int Size of $goto table */ - protected $gotoTableSize; - - /** @var int Symbol number signifying an invalid token */ - protected $invalidSymbol; - /** @var int Symbol number of error recovery token */ - protected $errorSymbol; - /** @var int Action number signifying default action */ - protected $defaultAction; - /** @var int Rule number signifying that an unexpected token was encountered */ - protected $unexpectedTokenRule; - - protected $YY2TBLSTATE; - /** @var int Number of non-leaf states */ - protected $numNonLeafStates; - - /** @var int[] Map of lexer tokens to internal symbols */ - protected $tokenToSymbol; - /** @var string[] Map of symbols to their names */ - protected $symbolToName; - /** @var array Names of the production rules (only necessary for debugging) */ - protected $productions; - - /** @var int[] Map of states to a displacement into the $action table. The corresponding action for this - * state/symbol pair is $action[$actionBase[$state] + $symbol]. If $actionBase[$state] is 0, the - * action is defaulted, i.e. $actionDefault[$state] should be used instead. */ - protected $actionBase; - /** @var int[] Table of actions. Indexed according to $actionBase comment. */ - protected $action; - /** @var int[] Table indexed analogously to $action. If $actionCheck[$actionBase[$state] + $symbol] != $symbol - * then the action is defaulted, i.e. $actionDefault[$state] should be used instead. */ - protected $actionCheck; - /** @var int[] Map of states to their default action */ - protected $actionDefault; - /** @var callable[] Semantic action callbacks */ - protected $reduceCallbacks; - - /** @var int[] Map of non-terminals to a displacement into the $goto table. The corresponding goto state for this - * non-terminal/state pair is $goto[$gotoBase[$nonTerminal] + $state] (unless defaulted) */ - protected $gotoBase; - /** @var int[] Table of states to goto after reduction. Indexed according to $gotoBase comment. */ - protected $goto; - /** @var int[] Table indexed analogously to $goto. If $gotoCheck[$gotoBase[$nonTerminal] + $state] != $nonTerminal - * then the goto state is defaulted, i.e. $gotoDefault[$nonTerminal] should be used. */ - protected $gotoCheck; - /** @var int[] Map of non-terminals to the default state to goto after their reduction */ - protected $gotoDefault; - - /** @var int[] Map of rules to the non-terminal on their left-hand side, i.e. the non-terminal to use for - * determining the state to goto after reduction. */ - protected $ruleToNonTerminal; - /** @var int[] Map of rules to the length of their right-hand side, which is the number of elements that have to - * be popped from the stack(s) on reduction. */ - protected $ruleToLength; - - /* - * The following members are part of the parser state: - */ - - /** @var Lexer Lexer that is used when parsing */ - protected $lexer; - /** @var mixed Temporary value containing the result of last semantic action (reduction) */ - protected $semValue; - /** @var array Semantic value stack (contains values of tokens and semantic action results) */ - protected $semStack; - /** @var array[] Start attribute stack */ - protected $startAttributeStack; - /** @var array[] End attribute stack */ - protected $endAttributeStack; - /** @var array End attributes of last *shifted* token */ - protected $endAttributes; - /** @var array Start attributes of last *read* token */ - protected $lookaheadStartAttributes; - - /** @var ErrorHandler Error handler */ - protected $errorHandler; - /** @var int Error state, used to avoid error floods */ - protected $errorState; - - /** - * Initialize $reduceCallbacks map. - */ - abstract protected function initReduceCallbacks(); - - /** - * Creates a parser instance. - * - * Options: Currently none. - * - * @param Lexer $lexer A lexer - * @param array $options Options array. - */ - public function __construct(Lexer $lexer, array $options = []) { - $this->lexer = $lexer; - - if (isset($options['throwOnError'])) { - throw new \LogicException( - '"throwOnError" is no longer supported, use "errorHandler" instead'); - } - - $this->initReduceCallbacks(); - } - - /** - * Parses PHP code into a node tree. - * - * If a non-throwing error handler is used, the parser will continue parsing after an error - * occurred and attempt to build a partial AST. - * - * @param string $code The source code to parse - * @param ErrorHandler|null $errorHandler Error handler to use for lexer/parser errors, defaults - * to ErrorHandler\Throwing. - * - * @return Node\Stmt[]|null Array of statements (or null non-throwing error handler is used and - * the parser was unable to recover from an error). - */ - public function parse(string $code, ?ErrorHandler $errorHandler = null) { - $this->errorHandler = $errorHandler ?: new ErrorHandler\Throwing; - - $this->lexer->startLexing($code, $this->errorHandler); - $result = $this->doParse(); - - // Clear out some of the interior state, so we don't hold onto unnecessary - // memory between uses of the parser - $this->startAttributeStack = []; - $this->endAttributeStack = []; - $this->semStack = []; - $this->semValue = null; - - return $result; - } - - protected function doParse() { - // We start off with no lookahead-token - $symbol = self::SYMBOL_NONE; - - // The attributes for a node are taken from the first and last token of the node. - // From the first token only the startAttributes are taken and from the last only - // the endAttributes. Both are merged using the array union operator (+). - $startAttributes = []; - $endAttributes = []; - $this->endAttributes = $endAttributes; - - // Keep stack of start and end attributes - $this->startAttributeStack = []; - $this->endAttributeStack = [$endAttributes]; - - // Start off in the initial state and keep a stack of previous states - $state = 0; - $stateStack = [$state]; - - // Semantic value stack (contains values of tokens and semantic action results) - $this->semStack = []; - - // Current position in the stack(s) - $stackPos = 0; - - $this->errorState = 0; - - for (;;) { - //$this->traceNewState($state, $symbol); - - if ($this->actionBase[$state] === 0) { - $rule = $this->actionDefault[$state]; - } else { - if ($symbol === self::SYMBOL_NONE) { - // Fetch the next token id from the lexer and fetch additional info by-ref. - // The end attributes are fetched into a temporary variable and only set once the token is really - // shifted (not during read). Otherwise you would sometimes get off-by-one errors, when a rule is - // reduced after a token was read but not yet shifted. - $tokenId = $this->lexer->getNextToken($tokenValue, $startAttributes, $endAttributes); - - // map the lexer token id to the internally used symbols - $symbol = $tokenId >= 0 && $tokenId < $this->tokenToSymbolMapSize - ? $this->tokenToSymbol[$tokenId] - : $this->invalidSymbol; - - if ($symbol === $this->invalidSymbol) { - throw new \RangeException(sprintf( - 'The lexer returned an invalid token (id=%d, value=%s)', - $tokenId, $tokenValue - )); - } - - // Allow productions to access the start attributes of the lookahead token. - $this->lookaheadStartAttributes = $startAttributes; - - //$this->traceRead($symbol); - } - - $idx = $this->actionBase[$state] + $symbol; - if ((($idx >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol) - || ($state < $this->YY2TBLSTATE - && ($idx = $this->actionBase[$state + $this->numNonLeafStates] + $symbol) >= 0 - && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol)) - && ($action = $this->action[$idx]) !== $this->defaultAction) { - /* - * >= numNonLeafStates: shift and reduce - * > 0: shift - * = 0: accept - * < 0: reduce - * = -YYUNEXPECTED: error - */ - if ($action > 0) { - /* shift */ - //$this->traceShift($symbol); - - ++$stackPos; - $stateStack[$stackPos] = $state = $action; - $this->semStack[$stackPos] = $tokenValue; - $this->startAttributeStack[$stackPos] = $startAttributes; - $this->endAttributeStack[$stackPos] = $endAttributes; - $this->endAttributes = $endAttributes; - $symbol = self::SYMBOL_NONE; - - if ($this->errorState) { - --$this->errorState; - } - - if ($action < $this->numNonLeafStates) { - continue; - } - - /* $yyn >= numNonLeafStates means shift-and-reduce */ - $rule = $action - $this->numNonLeafStates; - } else { - $rule = -$action; - } - } else { - $rule = $this->actionDefault[$state]; - } - } - - for (;;) { - if ($rule === 0) { - /* accept */ - //$this->traceAccept(); - return $this->semValue; - } elseif ($rule !== $this->unexpectedTokenRule) { - /* reduce */ - //$this->traceReduce($rule); - - try { - $this->reduceCallbacks[$rule]($stackPos); - } catch (Error $e) { - if (-1 === $e->getStartLine() && isset($startAttributes['startLine'])) { - $e->setStartLine($startAttributes['startLine']); - } - - $this->emitError($e); - // Can't recover from this type of error - return null; - } - - /* Goto - shift nonterminal */ - $lastEndAttributes = $this->endAttributeStack[$stackPos]; - $ruleLength = $this->ruleToLength[$rule]; - $stackPos -= $ruleLength; - $nonTerminal = $this->ruleToNonTerminal[$rule]; - $idx = $this->gotoBase[$nonTerminal] + $stateStack[$stackPos]; - if ($idx >= 0 && $idx < $this->gotoTableSize && $this->gotoCheck[$idx] === $nonTerminal) { - $state = $this->goto[$idx]; - } else { - $state = $this->gotoDefault[$nonTerminal]; - } - - ++$stackPos; - $stateStack[$stackPos] = $state; - $this->semStack[$stackPos] = $this->semValue; - $this->endAttributeStack[$stackPos] = $lastEndAttributes; - if ($ruleLength === 0) { - // Empty productions use the start attributes of the lookahead token. - $this->startAttributeStack[$stackPos] = $this->lookaheadStartAttributes; - } - } else { - /* error */ - switch ($this->errorState) { - case 0: - $msg = $this->getErrorMessage($symbol, $state); - $this->emitError(new Error($msg, $startAttributes + $endAttributes)); - // Break missing intentionally - case 1: - case 2: - $this->errorState = 3; - - // Pop until error-expecting state uncovered - while (!( - (($idx = $this->actionBase[$state] + $this->errorSymbol) >= 0 - && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $this->errorSymbol) - || ($state < $this->YY2TBLSTATE - && ($idx = $this->actionBase[$state + $this->numNonLeafStates] + $this->errorSymbol) >= 0 - && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $this->errorSymbol) - ) || ($action = $this->action[$idx]) === $this->defaultAction) { // Not totally sure about this - if ($stackPos <= 0) { - // Could not recover from error - return null; - } - $state = $stateStack[--$stackPos]; - //$this->tracePop($state); - } - - //$this->traceShift($this->errorSymbol); - ++$stackPos; - $stateStack[$stackPos] = $state = $action; - - // We treat the error symbol as being empty, so we reset the end attributes - // to the end attributes of the last non-error symbol - $this->startAttributeStack[$stackPos] = $this->lookaheadStartAttributes; - $this->endAttributeStack[$stackPos] = $this->endAttributeStack[$stackPos - 1]; - $this->endAttributes = $this->endAttributeStack[$stackPos - 1]; - break; - - case 3: - if ($symbol === 0) { - // Reached EOF without recovering from error - return null; - } - - //$this->traceDiscard($symbol); - $symbol = self::SYMBOL_NONE; - break 2; - } - } - - if ($state < $this->numNonLeafStates) { - break; - } - - /* >= numNonLeafStates means shift-and-reduce */ - $rule = $state - $this->numNonLeafStates; - } - } - - throw new \RuntimeException('Reached end of parser loop'); - } - - protected function emitError(Error $error) { - $this->errorHandler->handleError($error); - } - - /** - * Format error message including expected tokens. - * - * @param int $symbol Unexpected symbol - * @param int $state State at time of error - * - * @return string Formatted error message - */ - protected function getErrorMessage(int $symbol, int $state) : string { - $expectedString = ''; - if ($expected = $this->getExpectedTokens($state)) { - $expectedString = ', expecting ' . implode(' or ', $expected); - } - - return 'Syntax error, unexpected ' . $this->symbolToName[$symbol] . $expectedString; - } - - /** - * Get limited number of expected tokens in given state. - * - * @param int $state State - * - * @return string[] Expected tokens. If too many, an empty array is returned. - */ - protected function getExpectedTokens(int $state) : array { - $expected = []; - - $base = $this->actionBase[$state]; - foreach ($this->symbolToName as $symbol => $name) { - $idx = $base + $symbol; - if ($idx >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol - || $state < $this->YY2TBLSTATE - && ($idx = $this->actionBase[$state + $this->numNonLeafStates] + $symbol) >= 0 - && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol - ) { - if ($this->action[$idx] !== $this->unexpectedTokenRule - && $this->action[$idx] !== $this->defaultAction - && $symbol !== $this->errorSymbol - ) { - if (count($expected) === 4) { - /* Too many expected tokens */ - return []; - } - - $expected[] = $name; - } - } - } - - return $expected; - } - - /* - * Tracing functions used for debugging the parser. - */ - - /* - protected function traceNewState($state, $symbol) { - echo '% State ' . $state - . ', Lookahead ' . ($symbol == self::SYMBOL_NONE ? '--none--' : $this->symbolToName[$symbol]) . "\n"; - } - - protected function traceRead($symbol) { - echo '% Reading ' . $this->symbolToName[$symbol] . "\n"; - } - - protected function traceShift($symbol) { - echo '% Shift ' . $this->symbolToName[$symbol] . "\n"; - } - - protected function traceAccept() { - echo "% Accepted.\n"; - } - - protected function traceReduce($n) { - echo '% Reduce by (' . $n . ') ' . $this->productions[$n] . "\n"; - } - - protected function tracePop($state) { - echo '% Recovering, uncovered state ' . $state . "\n"; - } - - protected function traceDiscard($symbol) { - echo '% Discard ' . $this->symbolToName[$symbol] . "\n"; - } - */ - - /* - * Helper functions invoked by semantic actions - */ - - /** - * Moves statements of semicolon-style namespaces into $ns->stmts and checks various error conditions. - * - * @param Node\Stmt[] $stmts - * @return Node\Stmt[] - */ - protected function handleNamespaces(array $stmts) : array { - $hasErrored = false; - $style = $this->getNamespacingStyle($stmts); - if (null === $style) { - // not namespaced, nothing to do - return $stmts; - } elseif ('brace' === $style) { - // For braced namespaces we only have to check that there are no invalid statements between the namespaces - $afterFirstNamespace = false; - foreach ($stmts as $stmt) { - if ($stmt instanceof Node\Stmt\Namespace_) { - $afterFirstNamespace = true; - } elseif (!$stmt instanceof Node\Stmt\HaltCompiler - && !$stmt instanceof Node\Stmt\Nop - && $afterFirstNamespace && !$hasErrored) { - $this->emitError(new Error( - 'No code may exist outside of namespace {}', $stmt->getAttributes())); - $hasErrored = true; // Avoid one error for every statement - } - } - return $stmts; - } else { - // For semicolon namespaces we have to move the statements after a namespace declaration into ->stmts - $resultStmts = []; - $targetStmts =& $resultStmts; - $lastNs = null; - foreach ($stmts as $stmt) { - if ($stmt instanceof Node\Stmt\Namespace_) { - if ($lastNs !== null) { - $this->fixupNamespaceAttributes($lastNs); - } - if ($stmt->stmts === null) { - $stmt->stmts = []; - $targetStmts =& $stmt->stmts; - $resultStmts[] = $stmt; - } else { - // This handles the invalid case of mixed style namespaces - $resultStmts[] = $stmt; - $targetStmts =& $resultStmts; - } - $lastNs = $stmt; - } elseif ($stmt instanceof Node\Stmt\HaltCompiler) { - // __halt_compiler() is not moved into the namespace - $resultStmts[] = $stmt; - } else { - $targetStmts[] = $stmt; - } - } - if ($lastNs !== null) { - $this->fixupNamespaceAttributes($lastNs); - } - return $resultStmts; - } - } - - private function fixupNamespaceAttributes(Node\Stmt\Namespace_ $stmt) { - // We moved the statements into the namespace node, as such the end of the namespace node - // needs to be extended to the end of the statements. - if (empty($stmt->stmts)) { - return; - } - - // We only move the builtin end attributes here. This is the best we can do with the - // knowledge we have. - $endAttributes = ['endLine', 'endFilePos', 'endTokenPos']; - $lastStmt = $stmt->stmts[count($stmt->stmts) - 1]; - foreach ($endAttributes as $endAttribute) { - if ($lastStmt->hasAttribute($endAttribute)) { - $stmt->setAttribute($endAttribute, $lastStmt->getAttribute($endAttribute)); - } - } - } - - /** - * Determine namespacing style (semicolon or brace) - * - * @param Node[] $stmts Top-level statements. - * - * @return null|string One of "semicolon", "brace" or null (no namespaces) - */ - private function getNamespacingStyle(array $stmts) { - $style = null; - $hasNotAllowedStmts = false; - foreach ($stmts as $i => $stmt) { - if ($stmt instanceof Node\Stmt\Namespace_) { - $currentStyle = null === $stmt->stmts ? 'semicolon' : 'brace'; - if (null === $style) { - $style = $currentStyle; - if ($hasNotAllowedStmts) { - $this->emitError(new Error( - 'Namespace declaration statement has to be the very first statement in the script', - $stmt->getLine() // Avoid marking the entire namespace as an error - )); - } - } elseif ($style !== $currentStyle) { - $this->emitError(new Error( - 'Cannot mix bracketed namespace declarations with unbracketed namespace declarations', - $stmt->getLine() // Avoid marking the entire namespace as an error - )); - // Treat like semicolon style for namespace normalization - return 'semicolon'; - } - continue; - } - - /* declare(), __halt_compiler() and nops can be used before a namespace declaration */ - if ($stmt instanceof Node\Stmt\Declare_ - || $stmt instanceof Node\Stmt\HaltCompiler - || $stmt instanceof Node\Stmt\Nop) { - continue; - } - - /* There may be a hashbang line at the very start of the file */ - if ($i === 0 && $stmt instanceof Node\Stmt\InlineHTML && preg_match('/\A#!.*\r?\n\z/', $stmt->value)) { - continue; - } - - /* Everything else if forbidden before namespace declarations */ - $hasNotAllowedStmts = true; - } - return $style; - } - - /** - * Fix up parsing of static property calls in PHP 5. - * - * In PHP 5 A::$b[c][d] and A::$b[c][d]() have very different interpretation. The former is - * interpreted as (A::$b)[c][d], while the latter is the same as A::{$b[c][d]}(). We parse the - * latter as the former initially and this method fixes the AST into the correct form when we - * encounter the "()". - * - * @param Node\Expr\StaticPropertyFetch|Node\Expr\ArrayDimFetch $prop - * @param Node\Arg[] $args - * @param array $attributes - * - * @return Expr\StaticCall - */ - protected function fixupPhp5StaticPropCall($prop, array $args, array $attributes) : Expr\StaticCall { - if ($prop instanceof Node\Expr\StaticPropertyFetch) { - $name = $prop->name instanceof VarLikeIdentifier - ? $prop->name->toString() : $prop->name; - $var = new Expr\Variable($name, $prop->name->getAttributes()); - return new Expr\StaticCall($prop->class, $var, $args, $attributes); - } elseif ($prop instanceof Node\Expr\ArrayDimFetch) { - $tmp = $prop; - while ($tmp->var instanceof Node\Expr\ArrayDimFetch) { - $tmp = $tmp->var; - } - - /** @var Expr\StaticPropertyFetch $staticProp */ - $staticProp = $tmp->var; - - // Set start attributes to attributes of innermost node - $tmp = $prop; - $this->fixupStartAttributes($tmp, $staticProp->name); - while ($tmp->var instanceof Node\Expr\ArrayDimFetch) { - $tmp = $tmp->var; - $this->fixupStartAttributes($tmp, $staticProp->name); - } - - $name = $staticProp->name instanceof VarLikeIdentifier - ? $staticProp->name->toString() : $staticProp->name; - $tmp->var = new Expr\Variable($name, $staticProp->name->getAttributes()); - return new Expr\StaticCall($staticProp->class, $prop, $args, $attributes); - } else { - throw new \Exception; - } - } - - protected function fixupStartAttributes(Node $to, Node $from) { - $startAttributes = ['startLine', 'startFilePos', 'startTokenPos']; - foreach ($startAttributes as $startAttribute) { - if ($from->hasAttribute($startAttribute)) { - $to->setAttribute($startAttribute, $from->getAttribute($startAttribute)); - } - } - } - - protected function handleBuiltinTypes(Name $name) { - $builtinTypes = [ - 'bool' => true, - 'int' => true, - 'float' => true, - 'string' => true, - 'iterable' => true, - 'void' => true, - 'object' => true, - 'null' => true, - 'false' => true, - 'mixed' => true, - 'never' => true, - 'true' => true, - ]; - - if (!$name->isUnqualified()) { - return $name; - } - - $lowerName = $name->toLowerString(); - if (!isset($builtinTypes[$lowerName])) { - return $name; - } - - return new Node\Identifier($lowerName, $name->getAttributes()); - } - - /** - * Get combined start and end attributes at a stack location - * - * @param int $pos Stack location - * - * @return array Combined start and end attributes - */ - protected function getAttributesAt(int $pos) : array { - return $this->startAttributeStack[$pos] + $this->endAttributeStack[$pos]; - } - - protected function getFloatCastKind(string $cast): int - { - $cast = strtolower($cast); - if (strpos($cast, 'float') !== false) { - return Double::KIND_FLOAT; - } - - if (strpos($cast, 'real') !== false) { - return Double::KIND_REAL; - } - - return Double::KIND_DOUBLE; - } - - protected function parseLNumber($str, $attributes, $allowInvalidOctal = false) { - try { - return LNumber::fromString($str, $attributes, $allowInvalidOctal); - } catch (Error $error) { - $this->emitError($error); - // Use dummy value - return new LNumber(0, $attributes); - } - } - - /** - * Parse a T_NUM_STRING token into either an integer or string node. - * - * @param string $str Number string - * @param array $attributes Attributes - * - * @return LNumber|String_ Integer or string node. - */ - protected function parseNumString(string $str, array $attributes) { - if (!preg_match('/^(?:0|-?[1-9][0-9]*)$/', $str)) { - return new String_($str, $attributes); - } - - $num = +$str; - if (!is_int($num)) { - return new String_($str, $attributes); - } - - return new LNumber($num, $attributes); - } - - protected function stripIndentation( - string $string, int $indentLen, string $indentChar, - bool $newlineAtStart, bool $newlineAtEnd, array $attributes - ) { - if ($indentLen === 0) { - return $string; - } - - $start = $newlineAtStart ? '(?:(?<=\n)|\A)' : '(?<=\n)'; - $end = $newlineAtEnd ? '(?:(?=[\r\n])|\z)' : '(?=[\r\n])'; - $regex = '/' . $start . '([ \t]*)(' . $end . ')?/'; - return preg_replace_callback( - $regex, - function ($matches) use ($indentLen, $indentChar, $attributes) { - $prefix = substr($matches[1], 0, $indentLen); - if (false !== strpos($prefix, $indentChar === " " ? "\t" : " ")) { - $this->emitError(new Error( - 'Invalid indentation - tabs and spaces cannot be mixed', $attributes - )); - } elseif (strlen($prefix) < $indentLen && !isset($matches[2])) { - $this->emitError(new Error( - 'Invalid body indentation level ' . - '(expecting an indentation level of at least ' . $indentLen . ')', - $attributes - )); - } - return substr($matches[0], strlen($prefix)); - }, - $string - ); - } - - protected function parseDocString( - string $startToken, $contents, string $endToken, - array $attributes, array $endTokenAttributes, bool $parseUnicodeEscape - ) { - $kind = strpos($startToken, "'") === false - ? String_::KIND_HEREDOC : String_::KIND_NOWDOC; - - $regex = '/\A[bB]?<<<[ \t]*[\'"]?([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)[\'"]?(?:\r\n|\n|\r)\z/'; - $result = preg_match($regex, $startToken, $matches); - assert($result === 1); - $label = $matches[1]; - - $result = preg_match('/\A[ \t]*/', $endToken, $matches); - assert($result === 1); - $indentation = $matches[0]; - - $attributes['kind'] = $kind; - $attributes['docLabel'] = $label; - $attributes['docIndentation'] = $indentation; - - $indentHasSpaces = false !== strpos($indentation, " "); - $indentHasTabs = false !== strpos($indentation, "\t"); - if ($indentHasSpaces && $indentHasTabs) { - $this->emitError(new Error( - 'Invalid indentation - tabs and spaces cannot be mixed', - $endTokenAttributes - )); - - // Proceed processing as if this doc string is not indented - $indentation = ''; - } - - $indentLen = \strlen($indentation); - $indentChar = $indentHasSpaces ? " " : "\t"; - - if (\is_string($contents)) { - if ($contents === '') { - return new String_('', $attributes); - } - - $contents = $this->stripIndentation( - $contents, $indentLen, $indentChar, true, true, $attributes - ); - $contents = preg_replace('~(\r\n|\n|\r)\z~', '', $contents); - - if ($kind === String_::KIND_HEREDOC) { - $contents = String_::parseEscapeSequences($contents, null, $parseUnicodeEscape); - } - - return new String_($contents, $attributes); - } else { - assert(count($contents) > 0); - if (!$contents[0] instanceof Node\Scalar\EncapsedStringPart) { - // If there is no leading encapsed string part, pretend there is an empty one - $this->stripIndentation( - '', $indentLen, $indentChar, true, false, $contents[0]->getAttributes() - ); - } - - $newContents = []; - foreach ($contents as $i => $part) { - if ($part instanceof Node\Scalar\EncapsedStringPart) { - $isLast = $i === \count($contents) - 1; - $part->value = $this->stripIndentation( - $part->value, $indentLen, $indentChar, - $i === 0, $isLast, $part->getAttributes() - ); - $part->value = String_::parseEscapeSequences($part->value, null, $parseUnicodeEscape); - if ($isLast) { - $part->value = preg_replace('~(\r\n|\n|\r)\z~', '', $part->value); - } - if ('' === $part->value) { - continue; - } - } - $newContents[] = $part; - } - return new Encapsed($newContents, $attributes); - } - } - - /** - * Create attributes for a zero-length common-capturing nop. - * - * @param Comment[] $comments - * @return array - */ - protected function createCommentNopAttributes(array $comments) { - $comment = $comments[count($comments) - 1]; - $commentEndLine = $comment->getEndLine(); - $commentEndFilePos = $comment->getEndFilePos(); - $commentEndTokenPos = $comment->getEndTokenPos(); - - $attributes = ['comments' => $comments]; - if (-1 !== $commentEndLine) { - $attributes['startLine'] = $commentEndLine; - $attributes['endLine'] = $commentEndLine; - } - if (-1 !== $commentEndFilePos) { - $attributes['startFilePos'] = $commentEndFilePos + 1; - $attributes['endFilePos'] = $commentEndFilePos; - } - if (-1 !== $commentEndTokenPos) { - $attributes['startTokenPos'] = $commentEndTokenPos + 1; - $attributes['endTokenPos'] = $commentEndTokenPos; - } - return $attributes; - } - - /** @param ElseIf_|Else_ $node */ - protected function fixupAlternativeElse($node) { - // Make sure a trailing nop statement carrying comments is part of the node. - $numStmts = \count($node->stmts); - if ($numStmts !== 0 && $node->stmts[$numStmts - 1] instanceof Nop) { - $nopAttrs = $node->stmts[$numStmts - 1]->getAttributes(); - if (isset($nopAttrs['endLine'])) { - $node->setAttribute('endLine', $nopAttrs['endLine']); - } - if (isset($nopAttrs['endFilePos'])) { - $node->setAttribute('endFilePos', $nopAttrs['endFilePos']); - } - if (isset($nopAttrs['endTokenPos'])) { - $node->setAttribute('endTokenPos', $nopAttrs['endTokenPos']); - } - } - } - - protected function checkClassModifier($a, $b, $modifierPos) { - try { - Class_::verifyClassModifier($a, $b); - } catch (Error $error) { - $error->setAttributes($this->getAttributesAt($modifierPos)); - $this->emitError($error); - } - } - - protected function checkModifier($a, $b, $modifierPos) { - // Jumping through some hoops here because verifyModifier() is also used elsewhere - try { - Class_::verifyModifier($a, $b); - } catch (Error $error) { - $error->setAttributes($this->getAttributesAt($modifierPos)); - $this->emitError($error); - } - } - - protected function checkParam(Param $node) { - if ($node->variadic && null !== $node->default) { - $this->emitError(new Error( - 'Variadic parameter cannot have a default value', - $node->default->getAttributes() - )); - } - } - - protected function checkTryCatch(TryCatch $node) { - if (empty($node->catches) && null === $node->finally) { - $this->emitError(new Error( - 'Cannot use try without catch or finally', $node->getAttributes() - )); - } - } - - protected function checkNamespace(Namespace_ $node) { - if (null !== $node->stmts) { - foreach ($node->stmts as $stmt) { - if ($stmt instanceof Namespace_) { - $this->emitError(new Error( - 'Namespace declarations cannot be nested', $stmt->getAttributes() - )); - } - } - } - } - - private function checkClassName($name, $namePos) { - if (null !== $name && $name->isSpecialClassName()) { - $this->emitError(new Error( - sprintf('Cannot use \'%s\' as class name as it is reserved', $name), - $this->getAttributesAt($namePos) - )); - } - } - - private function checkImplementedInterfaces(array $interfaces) { - foreach ($interfaces as $interface) { - if ($interface->isSpecialClassName()) { - $this->emitError(new Error( - sprintf('Cannot use \'%s\' as interface name as it is reserved', $interface), - $interface->getAttributes() - )); - } - } - } - - protected function checkClass(Class_ $node, $namePos) { - $this->checkClassName($node->name, $namePos); - - if ($node->extends && $node->extends->isSpecialClassName()) { - $this->emitError(new Error( - sprintf('Cannot use \'%s\' as class name as it is reserved', $node->extends), - $node->extends->getAttributes() - )); - } - - $this->checkImplementedInterfaces($node->implements); - } - - protected function checkInterface(Interface_ $node, $namePos) { - $this->checkClassName($node->name, $namePos); - $this->checkImplementedInterfaces($node->extends); - } - - protected function checkEnum(Enum_ $node, $namePos) { - $this->checkClassName($node->name, $namePos); - $this->checkImplementedInterfaces($node->implements); - } - - protected function checkClassMethod(ClassMethod $node, $modifierPos) { - if ($node->flags & Class_::MODIFIER_STATIC) { - switch ($node->name->toLowerString()) { - case '__construct': - $this->emitError(new Error( - sprintf('Constructor %s() cannot be static', $node->name), - $this->getAttributesAt($modifierPos))); - break; - case '__destruct': - $this->emitError(new Error( - sprintf('Destructor %s() cannot be static', $node->name), - $this->getAttributesAt($modifierPos))); - break; - case '__clone': - $this->emitError(new Error( - sprintf('Clone method %s() cannot be static', $node->name), - $this->getAttributesAt($modifierPos))); - break; - } - } - - if ($node->flags & Class_::MODIFIER_READONLY) { - $this->emitError(new Error( - sprintf('Method %s() cannot be readonly', $node->name), - $this->getAttributesAt($modifierPos))); - } - } - - protected function checkClassConst(ClassConst $node, $modifierPos) { - if ($node->flags & Class_::MODIFIER_STATIC) { - $this->emitError(new Error( - "Cannot use 'static' as constant modifier", - $this->getAttributesAt($modifierPos))); - } - if ($node->flags & Class_::MODIFIER_ABSTRACT) { - $this->emitError(new Error( - "Cannot use 'abstract' as constant modifier", - $this->getAttributesAt($modifierPos))); - } - if ($node->flags & Class_::MODIFIER_READONLY) { - $this->emitError(new Error( - "Cannot use 'readonly' as constant modifier", - $this->getAttributesAt($modifierPos))); - } - } - - protected function checkProperty(Property $node, $modifierPos) { - if ($node->flags & Class_::MODIFIER_ABSTRACT) { - $this->emitError(new Error('Properties cannot be declared abstract', - $this->getAttributesAt($modifierPos))); - } - - if ($node->flags & Class_::MODIFIER_FINAL) { - $this->emitError(new Error('Properties cannot be declared final', - $this->getAttributesAt($modifierPos))); - } - } - - protected function checkUseUse(UseUse $node, $namePos) { - if ($node->alias && $node->alias->isSpecialClassName()) { - $this->emitError(new Error( - sprintf( - 'Cannot use %s as %s because \'%2$s\' is a special class name', - $node->name, $node->alias - ), - $this->getAttributesAt($namePos) - )); - } - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/ParserFactory.php b/vendor/nikic/php-parser/lib/PhpParser/ParserFactory.php deleted file mode 100644 index 98b0aee..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/ParserFactory.php +++ /dev/null @@ -1,76 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser; - -use PhpParser\Lexer\Emulative; -use PhpParser\Parser\Php7; - -class ParserFactory -{ - const PREFER_PHP7 = 1; - const PREFER_PHP5 = 2; - const ONLY_PHP7 = 3; - const ONLY_PHP5 = 4; - - /** - * Creates a Parser instance, according to the provided kind. - * - * @param int $kind One of ::PREFER_PHP7, ::PREFER_PHP5, ::ONLY_PHP7 or ::ONLY_PHP5 - * @param Lexer|null $lexer Lexer to use. Defaults to emulative lexer when not specified - * @param array $parserOptions Parser options. See ParserAbstract::__construct() argument - * - * @return Parser The parser instance - */ - public function create(int $kind, ?Lexer $lexer = null, array $parserOptions = []) : Parser { - if (null === $lexer) { - $lexer = new Lexer\Emulative(); - } - switch ($kind) { - case self::PREFER_PHP7: - return new Parser\Multiple([ - new Parser\Php7($lexer, $parserOptions), new Parser\Php5($lexer, $parserOptions) - ]); - case self::PREFER_PHP5: - return new Parser\Multiple([ - new Parser\Php5($lexer, $parserOptions), new Parser\Php7($lexer, $parserOptions) - ]); - case self::ONLY_PHP7: - return new Parser\Php7($lexer, $parserOptions); - case self::ONLY_PHP5: - return new Parser\Php5($lexer, $parserOptions); - default: - throw new \LogicException( - 'Kind must be one of ::PREFER_PHP7, ::PREFER_PHP5, ::ONLY_PHP7 or ::ONLY_PHP5' - ); - } - } - - /** - * Create a parser targeting the newest version supported by this library. Code for older - * versions will be accepted if there have been no relevant backwards-compatibility breaks in - * PHP. - * - * All supported lexer attributes (comments, startLine, endLine, startTokenPos, endTokenPos, - * startFilePos, endFilePos) will be enabled. - */ - public function createForNewestSupportedVersion(): Parser { - return new Php7(new Emulative($this->getLexerOptions())); - } - - /** - * Create a parser targeting the host PHP version, that is the PHP version we're currently - * running on. This parser will not use any token emulation. - * - * All supported lexer attributes (comments, startLine, endLine, startTokenPos, endTokenPos, - * startFilePos, endFilePos) will be enabled. - */ - public function createForHostVersion(): Parser { - return new Php7(new Lexer($this->getLexerOptions())); - } - - private function getLexerOptions(): array { - return ['usedAttributes' => [ - 'comments', 'startLine', 'endLine', 'startTokenPos', 'endTokenPos', 'startFilePos', 'endFilePos', - ]]; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php b/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php deleted file mode 100644 index b8115d0..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php +++ /dev/null @@ -1,1126 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser\PrettyPrinter; - -use PhpParser\Node; -use PhpParser\Node\Expr; -use PhpParser\Node\Expr\AssignOp; -use PhpParser\Node\Expr\BinaryOp; -use PhpParser\Node\Expr\Cast; -use PhpParser\Node\Name; -use PhpParser\Node\Scalar; -use PhpParser\Node\Scalar\MagicConst; -use PhpParser\Node\Stmt; -use PhpParser\PrettyPrinterAbstract; - -class Standard extends PrettyPrinterAbstract -{ - // Special nodes - - protected function pParam(Node\Param $node) { - return $this->pAttrGroups($node->attrGroups, true) - . $this->pModifiers($node->flags) - . ($node->type ? $this->p($node->type) . ' ' : '') - . ($node->byRef ? '&' : '') - . ($node->variadic ? '...' : '') - . $this->p($node->var) - . ($node->default ? ' = ' . $this->p($node->default) : ''); - } - - protected function pArg(Node\Arg $node) { - return ($node->name ? $node->name->toString() . ': ' : '') - . ($node->byRef ? '&' : '') . ($node->unpack ? '...' : '') - . $this->p($node->value); - } - - protected function pVariadicPlaceholder(Node\VariadicPlaceholder $node) { - return '...'; - } - - protected function pConst(Node\Const_ $node) { - return $node->name . ' = ' . $this->p($node->value); - } - - protected function pNullableType(Node\NullableType $node) { - return '?' . $this->p($node->type); - } - - protected function pUnionType(Node\UnionType $node) { - $types = []; - foreach ($node->types as $typeNode) { - if ($typeNode instanceof Node\IntersectionType) { - $types[] = '('. $this->p($typeNode) . ')'; - continue; - } - $types[] = $this->p($typeNode); - } - return implode('|', $types); - } - - protected function pIntersectionType(Node\IntersectionType $node) { - return $this->pImplode($node->types, '&'); - } - - protected function pIdentifier(Node\Identifier $node) { - return $node->name; - } - - protected function pVarLikeIdentifier(Node\VarLikeIdentifier $node) { - return '$' . $node->name; - } - - protected function pAttribute(Node\Attribute $node) { - return $this->p($node->name) - . ($node->args ? '(' . $this->pCommaSeparated($node->args) . ')' : ''); - } - - protected function pAttributeGroup(Node\AttributeGroup $node) { - return '#[' . $this->pCommaSeparated($node->attrs) . ']'; - } - - // Names - - protected function pName(Name $node) { - return implode('\\', $node->parts); - } - - protected function pName_FullyQualified(Name\FullyQualified $node) { - return '\\' . implode('\\', $node->parts); - } - - protected function pName_Relative(Name\Relative $node) { - return 'namespace\\' . implode('\\', $node->parts); - } - - // Magic Constants - - protected function pScalar_MagicConst_Class(MagicConst\Class_ $node) { - return '__CLASS__'; - } - - protected function pScalar_MagicConst_Dir(MagicConst\Dir $node) { - return '__DIR__'; - } - - protected function pScalar_MagicConst_File(MagicConst\File $node) { - return '__FILE__'; - } - - protected function pScalar_MagicConst_Function(MagicConst\Function_ $node) { - return '__FUNCTION__'; - } - - protected function pScalar_MagicConst_Line(MagicConst\Line $node) { - return '__LINE__'; - } - - protected function pScalar_MagicConst_Method(MagicConst\Method $node) { - return '__METHOD__'; - } - - protected function pScalar_MagicConst_Namespace(MagicConst\Namespace_ $node) { - return '__NAMESPACE__'; - } - - protected function pScalar_MagicConst_Trait(MagicConst\Trait_ $node) { - return '__TRAIT__'; - } - - // Scalars - - protected function pScalar_String(Scalar\String_ $node) { - $kind = $node->getAttribute('kind', Scalar\String_::KIND_SINGLE_QUOTED); - switch ($kind) { - case Scalar\String_::KIND_NOWDOC: - $label = $node->getAttribute('docLabel'); - if ($label && !$this->containsEndLabel($node->value, $label)) { - if ($node->value === '') { - return "<<<'$label'\n$label" . $this->docStringEndToken; - } - - return "<<<'$label'\n$node->value\n$label" - . $this->docStringEndToken; - } - /* break missing intentionally */ - case Scalar\String_::KIND_SINGLE_QUOTED: - return $this->pSingleQuotedString($node->value); - case Scalar\String_::KIND_HEREDOC: - $label = $node->getAttribute('docLabel'); - if ($label && !$this->containsEndLabel($node->value, $label)) { - if ($node->value === '') { - return "<<<$label\n$label" . $this->docStringEndToken; - } - - $escaped = $this->escapeString($node->value, null); - return "<<<$label\n" . $escaped . "\n$label" - . $this->docStringEndToken; - } - /* break missing intentionally */ - case Scalar\String_::KIND_DOUBLE_QUOTED: - return '"' . $this->escapeString($node->value, '"') . '"'; - } - throw new \Exception('Invalid string kind'); - } - - protected function pScalar_Encapsed(Scalar\Encapsed $node) { - if ($node->getAttribute('kind') === Scalar\String_::KIND_HEREDOC) { - $label = $node->getAttribute('docLabel'); - if ($label && !$this->encapsedContainsEndLabel($node->parts, $label)) { - if (count($node->parts) === 1 - && $node->parts[0] instanceof Scalar\EncapsedStringPart - && $node->parts[0]->value === '' - ) { - return "<<<$label\n$label" . $this->docStringEndToken; - } - - return "<<<$label\n" . $this->pEncapsList($node->parts, null) . "\n$label" - . $this->docStringEndToken; - } - } - return '"' . $this->pEncapsList($node->parts, '"') . '"'; - } - - protected function pScalar_LNumber(Scalar\LNumber $node) { - if ($node->value === -\PHP_INT_MAX-1) { - // PHP_INT_MIN cannot be represented as a literal, - // because the sign is not part of the literal - return '(-' . \PHP_INT_MAX . '-1)'; - } - - $kind = $node->getAttribute('kind', Scalar\LNumber::KIND_DEC); - if (Scalar\LNumber::KIND_DEC === $kind) { - return (string) $node->value; - } - - if ($node->value < 0) { - $sign = '-'; - $str = (string) -$node->value; - } else { - $sign = ''; - $str = (string) $node->value; - } - switch ($kind) { - case Scalar\LNumber::KIND_BIN: - return $sign . '0b' . base_convert($str, 10, 2); - case Scalar\LNumber::KIND_OCT: - return $sign . '0' . base_convert($str, 10, 8); - case Scalar\LNumber::KIND_HEX: - return $sign . '0x' . base_convert($str, 10, 16); - } - throw new \Exception('Invalid number kind'); - } - - protected function pScalar_DNumber(Scalar\DNumber $node) { - if (!is_finite($node->value)) { - if ($node->value === \INF) { - return '\INF'; - } elseif ($node->value === -\INF) { - return '-\INF'; - } else { - return '\NAN'; - } - } - - // Try to find a short full-precision representation - $stringValue = sprintf('%.16G', $node->value); - if ($node->value !== (float) $stringValue) { - $stringValue = sprintf('%.17G', $node->value); - } - - // %G is locale dependent and there exists no locale-independent alternative. We don't want - // mess with switching locales here, so let's assume that a comma is the only non-standard - // decimal separator we may encounter... - $stringValue = str_replace(',', '.', $stringValue); - - // ensure that number is really printed as float - return preg_match('/^-?[0-9]+$/', $stringValue) ? $stringValue . '.0' : $stringValue; - } - - protected function pScalar_EncapsedStringPart(Scalar\EncapsedStringPart $node) { - throw new \LogicException('Cannot directly print EncapsedStringPart'); - } - - // Assignments - - protected function pExpr_Assign(Expr\Assign $node) { - return $this->pInfixOp(Expr\Assign::class, $node->var, ' = ', $node->expr); - } - - protected function pExpr_AssignRef(Expr\AssignRef $node) { - return $this->pInfixOp(Expr\AssignRef::class, $node->var, ' =& ', $node->expr); - } - - protected function pExpr_AssignOp_Plus(AssignOp\Plus $node) { - return $this->pInfixOp(AssignOp\Plus::class, $node->var, ' += ', $node->expr); - } - - protected function pExpr_AssignOp_Minus(AssignOp\Minus $node) { - return $this->pInfixOp(AssignOp\Minus::class, $node->var, ' -= ', $node->expr); - } - - protected function pExpr_AssignOp_Mul(AssignOp\Mul $node) { - return $this->pInfixOp(AssignOp\Mul::class, $node->var, ' *= ', $node->expr); - } - - protected function pExpr_AssignOp_Div(AssignOp\Div $node) { - return $this->pInfixOp(AssignOp\Div::class, $node->var, ' /= ', $node->expr); - } - - protected function pExpr_AssignOp_Concat(AssignOp\Concat $node) { - return $this->pInfixOp(AssignOp\Concat::class, $node->var, ' .= ', $node->expr); - } - - protected function pExpr_AssignOp_Mod(AssignOp\Mod $node) { - return $this->pInfixOp(AssignOp\Mod::class, $node->var, ' %= ', $node->expr); - } - - protected function pExpr_AssignOp_BitwiseAnd(AssignOp\BitwiseAnd $node) { - return $this->pInfixOp(AssignOp\BitwiseAnd::class, $node->var, ' &= ', $node->expr); - } - - protected function pExpr_AssignOp_BitwiseOr(AssignOp\BitwiseOr $node) { - return $this->pInfixOp(AssignOp\BitwiseOr::class, $node->var, ' |= ', $node->expr); - } - - protected function pExpr_AssignOp_BitwiseXor(AssignOp\BitwiseXor $node) { - return $this->pInfixOp(AssignOp\BitwiseXor::class, $node->var, ' ^= ', $node->expr); - } - - protected function pExpr_AssignOp_ShiftLeft(AssignOp\ShiftLeft $node) { - return $this->pInfixOp(AssignOp\ShiftLeft::class, $node->var, ' <<= ', $node->expr); - } - - protected function pExpr_AssignOp_ShiftRight(AssignOp\ShiftRight $node) { - return $this->pInfixOp(AssignOp\ShiftRight::class, $node->var, ' >>= ', $node->expr); - } - - protected function pExpr_AssignOp_Pow(AssignOp\Pow $node) { - return $this->pInfixOp(AssignOp\Pow::class, $node->var, ' **= ', $node->expr); - } - - protected function pExpr_AssignOp_Coalesce(AssignOp\Coalesce $node) { - return $this->pInfixOp(AssignOp\Coalesce::class, $node->var, ' ??= ', $node->expr); - } - - // Binary expressions - - protected function pExpr_BinaryOp_Plus(BinaryOp\Plus $node) { - return $this->pInfixOp(BinaryOp\Plus::class, $node->left, ' + ', $node->right); - } - - protected function pExpr_BinaryOp_Minus(BinaryOp\Minus $node) { - return $this->pInfixOp(BinaryOp\Minus::class, $node->left, ' - ', $node->right); - } - - protected function pExpr_BinaryOp_Mul(BinaryOp\Mul $node) { - return $this->pInfixOp(BinaryOp\Mul::class, $node->left, ' * ', $node->right); - } - - protected function pExpr_BinaryOp_Div(BinaryOp\Div $node) { - return $this->pInfixOp(BinaryOp\Div::class, $node->left, ' / ', $node->right); - } - - protected function pExpr_BinaryOp_Concat(BinaryOp\Concat $node) { - return $this->pInfixOp(BinaryOp\Concat::class, $node->left, ' . ', $node->right); - } - - protected function pExpr_BinaryOp_Mod(BinaryOp\Mod $node) { - return $this->pInfixOp(BinaryOp\Mod::class, $node->left, ' % ', $node->right); - } - - protected function pExpr_BinaryOp_BooleanAnd(BinaryOp\BooleanAnd $node) { - return $this->pInfixOp(BinaryOp\BooleanAnd::class, $node->left, ' && ', $node->right); - } - - protected function pExpr_BinaryOp_BooleanOr(BinaryOp\BooleanOr $node) { - return $this->pInfixOp(BinaryOp\BooleanOr::class, $node->left, ' || ', $node->right); - } - - protected function pExpr_BinaryOp_BitwiseAnd(BinaryOp\BitwiseAnd $node) { - return $this->pInfixOp(BinaryOp\BitwiseAnd::class, $node->left, ' & ', $node->right); - } - - protected function pExpr_BinaryOp_BitwiseOr(BinaryOp\BitwiseOr $node) { - return $this->pInfixOp(BinaryOp\BitwiseOr::class, $node->left, ' | ', $node->right); - } - - protected function pExpr_BinaryOp_BitwiseXor(BinaryOp\BitwiseXor $node) { - return $this->pInfixOp(BinaryOp\BitwiseXor::class, $node->left, ' ^ ', $node->right); - } - - protected function pExpr_BinaryOp_ShiftLeft(BinaryOp\ShiftLeft $node) { - return $this->pInfixOp(BinaryOp\ShiftLeft::class, $node->left, ' << ', $node->right); - } - - protected function pExpr_BinaryOp_ShiftRight(BinaryOp\ShiftRight $node) { - return $this->pInfixOp(BinaryOp\ShiftRight::class, $node->left, ' >> ', $node->right); - } - - protected function pExpr_BinaryOp_Pow(BinaryOp\Pow $node) { - return $this->pInfixOp(BinaryOp\Pow::class, $node->left, ' ** ', $node->right); - } - - protected function pExpr_BinaryOp_LogicalAnd(BinaryOp\LogicalAnd $node) { - return $this->pInfixOp(BinaryOp\LogicalAnd::class, $node->left, ' and ', $node->right); - } - - protected function pExpr_BinaryOp_LogicalOr(BinaryOp\LogicalOr $node) { - return $this->pInfixOp(BinaryOp\LogicalOr::class, $node->left, ' or ', $node->right); - } - - protected function pExpr_BinaryOp_LogicalXor(BinaryOp\LogicalXor $node) { - return $this->pInfixOp(BinaryOp\LogicalXor::class, $node->left, ' xor ', $node->right); - } - - protected function pExpr_BinaryOp_Equal(BinaryOp\Equal $node) { - return $this->pInfixOp(BinaryOp\Equal::class, $node->left, ' == ', $node->right); - } - - protected function pExpr_BinaryOp_NotEqual(BinaryOp\NotEqual $node) { - return $this->pInfixOp(BinaryOp\NotEqual::class, $node->left, ' != ', $node->right); - } - - protected function pExpr_BinaryOp_Identical(BinaryOp\Identical $node) { - return $this->pInfixOp(BinaryOp\Identical::class, $node->left, ' === ', $node->right); - } - - protected function pExpr_BinaryOp_NotIdentical(BinaryOp\NotIdentical $node) { - return $this->pInfixOp(BinaryOp\NotIdentical::class, $node->left, ' !== ', $node->right); - } - - protected function pExpr_BinaryOp_Spaceship(BinaryOp\Spaceship $node) { - return $this->pInfixOp(BinaryOp\Spaceship::class, $node->left, ' <=> ', $node->right); - } - - protected function pExpr_BinaryOp_Greater(BinaryOp\Greater $node) { - return $this->pInfixOp(BinaryOp\Greater::class, $node->left, ' > ', $node->right); - } - - protected function pExpr_BinaryOp_GreaterOrEqual(BinaryOp\GreaterOrEqual $node) { - return $this->pInfixOp(BinaryOp\GreaterOrEqual::class, $node->left, ' >= ', $node->right); - } - - protected function pExpr_BinaryOp_Smaller(BinaryOp\Smaller $node) { - return $this->pInfixOp(BinaryOp\Smaller::class, $node->left, ' < ', $node->right); - } - - protected function pExpr_BinaryOp_SmallerOrEqual(BinaryOp\SmallerOrEqual $node) { - return $this->pInfixOp(BinaryOp\SmallerOrEqual::class, $node->left, ' <= ', $node->right); - } - - protected function pExpr_BinaryOp_Coalesce(BinaryOp\Coalesce $node) { - return $this->pInfixOp(BinaryOp\Coalesce::class, $node->left, ' ?? ', $node->right); - } - - protected function pExpr_Instanceof(Expr\Instanceof_ $node) { - list($precedence, $associativity) = $this->precedenceMap[Expr\Instanceof_::class]; - return $this->pPrec($node->expr, $precedence, $associativity, -1) - . ' instanceof ' - . $this->pNewVariable($node->class); - } - - // Unary expressions - - protected function pExpr_BooleanNot(Expr\BooleanNot $node) { - return $this->pPrefixOp(Expr\BooleanNot::class, '!', $node->expr); - } - - protected function pExpr_BitwiseNot(Expr\BitwiseNot $node) { - return $this->pPrefixOp(Expr\BitwiseNot::class, '~', $node->expr); - } - - protected function pExpr_UnaryMinus(Expr\UnaryMinus $node) { - if ($node->expr instanceof Expr\UnaryMinus || $node->expr instanceof Expr\PreDec) { - // Enforce -(-$expr) instead of --$expr - return '-(' . $this->p($node->expr) . ')'; - } - return $this->pPrefixOp(Expr\UnaryMinus::class, '-', $node->expr); - } - - protected function pExpr_UnaryPlus(Expr\UnaryPlus $node) { - if ($node->expr instanceof Expr\UnaryPlus || $node->expr instanceof Expr\PreInc) { - // Enforce +(+$expr) instead of ++$expr - return '+(' . $this->p($node->expr) . ')'; - } - return $this->pPrefixOp(Expr\UnaryPlus::class, '+', $node->expr); - } - - protected function pExpr_PreInc(Expr\PreInc $node) { - return $this->pPrefixOp(Expr\PreInc::class, '++', $node->var); - } - - protected function pExpr_PreDec(Expr\PreDec $node) { - return $this->pPrefixOp(Expr\PreDec::class, '--', $node->var); - } - - protected function pExpr_PostInc(Expr\PostInc $node) { - return $this->pPostfixOp(Expr\PostInc::class, $node->var, '++'); - } - - protected function pExpr_PostDec(Expr\PostDec $node) { - return $this->pPostfixOp(Expr\PostDec::class, $node->var, '--'); - } - - protected function pExpr_ErrorSuppress(Expr\ErrorSuppress $node) { - return $this->pPrefixOp(Expr\ErrorSuppress::class, '@', $node->expr); - } - - protected function pExpr_YieldFrom(Expr\YieldFrom $node) { - return $this->pPrefixOp(Expr\YieldFrom::class, 'yield from ', $node->expr); - } - - protected function pExpr_Print(Expr\Print_ $node) { - return $this->pPrefixOp(Expr\Print_::class, 'print ', $node->expr); - } - - // Casts - - protected function pExpr_Cast_Int(Cast\Int_ $node) { - return $this->pPrefixOp(Cast\Int_::class, '(int) ', $node->expr); - } - - protected function pExpr_Cast_Double(Cast\Double $node) { - $kind = $node->getAttribute('kind', Cast\Double::KIND_DOUBLE); - if ($kind === Cast\Double::KIND_DOUBLE) { - $cast = '(double)'; - } elseif ($kind === Cast\Double::KIND_FLOAT) { - $cast = '(float)'; - } elseif ($kind === Cast\Double::KIND_REAL) { - $cast = '(real)'; - } - return $this->pPrefixOp(Cast\Double::class, $cast . ' ', $node->expr); - } - - protected function pExpr_Cast_String(Cast\String_ $node) { - return $this->pPrefixOp(Cast\String_::class, '(string) ', $node->expr); - } - - protected function pExpr_Cast_Array(Cast\Array_ $node) { - return $this->pPrefixOp(Cast\Array_::class, '(array) ', $node->expr); - } - - protected function pExpr_Cast_Object(Cast\Object_ $node) { - return $this->pPrefixOp(Cast\Object_::class, '(object) ', $node->expr); - } - - protected function pExpr_Cast_Bool(Cast\Bool_ $node) { - return $this->pPrefixOp(Cast\Bool_::class, '(bool) ', $node->expr); - } - - protected function pExpr_Cast_Unset(Cast\Unset_ $node) { - return $this->pPrefixOp(Cast\Unset_::class, '(unset) ', $node->expr); - } - - // Function calls and similar constructs - - protected function pExpr_FuncCall(Expr\FuncCall $node) { - return $this->pCallLhs($node->name) - . '(' . $this->pMaybeMultiline($node->args) . ')'; - } - - protected function pExpr_MethodCall(Expr\MethodCall $node) { - return $this->pDereferenceLhs($node->var) . '->' . $this->pObjectProperty($node->name) - . '(' . $this->pMaybeMultiline($node->args) . ')'; - } - - protected function pExpr_NullsafeMethodCall(Expr\NullsafeMethodCall $node) { - return $this->pDereferenceLhs($node->var) . '?->' . $this->pObjectProperty($node->name) - . '(' . $this->pMaybeMultiline($node->args) . ')'; - } - - protected function pExpr_StaticCall(Expr\StaticCall $node) { - return $this->pStaticDereferenceLhs($node->class) . '::' - . ($node->name instanceof Expr - ? ($node->name instanceof Expr\Variable - ? $this->p($node->name) - : '{' . $this->p($node->name) . '}') - : $node->name) - . '(' . $this->pMaybeMultiline($node->args) . ')'; - } - - protected function pExpr_Empty(Expr\Empty_ $node) { - return 'empty(' . $this->p($node->expr) . ')'; - } - - protected function pExpr_Isset(Expr\Isset_ $node) { - return 'isset(' . $this->pCommaSeparated($node->vars) . ')'; - } - - protected function pExpr_Eval(Expr\Eval_ $node) { - return 'eval(' . $this->p($node->expr) . ')'; - } - - protected function pExpr_Include(Expr\Include_ $node) { - static $map = [ - Expr\Include_::TYPE_INCLUDE => 'include', - Expr\Include_::TYPE_INCLUDE_ONCE => 'include_once', - Expr\Include_::TYPE_REQUIRE => 'require', - Expr\Include_::TYPE_REQUIRE_ONCE => 'require_once', - ]; - - return $map[$node->type] . ' ' . $this->p($node->expr); - } - - protected function pExpr_List(Expr\List_ $node) { - return 'list(' . $this->pCommaSeparated($node->items) . ')'; - } - - // Other - - protected function pExpr_Error(Expr\Error $node) { - throw new \LogicException('Cannot pretty-print AST with Error nodes'); - } - - protected function pExpr_Variable(Expr\Variable $node) { - if ($node->name instanceof Expr) { - return '${' . $this->p($node->name) . '}'; - } else { - return '$' . $node->name; - } - } - - protected function pExpr_Array(Expr\Array_ $node) { - $syntax = $node->getAttribute('kind', - $this->options['shortArraySyntax'] ? Expr\Array_::KIND_SHORT : Expr\Array_::KIND_LONG); - if ($syntax === Expr\Array_::KIND_SHORT) { - return '[' . $this->pMaybeMultiline($node->items, true) . ']'; - } else { - return 'array(' . $this->pMaybeMultiline($node->items, true) . ')'; - } - } - - protected function pExpr_ArrayItem(Expr\ArrayItem $node) { - return (null !== $node->key ? $this->p($node->key) . ' => ' : '') - . ($node->byRef ? '&' : '') - . ($node->unpack ? '...' : '') - . $this->p($node->value); - } - - protected function pExpr_ArrayDimFetch(Expr\ArrayDimFetch $node) { - return $this->pDereferenceLhs($node->var) - . '[' . (null !== $node->dim ? $this->p($node->dim) : '') . ']'; - } - - protected function pExpr_ConstFetch(Expr\ConstFetch $node) { - return $this->p($node->name); - } - - protected function pExpr_ClassConstFetch(Expr\ClassConstFetch $node) { - return $this->pStaticDereferenceLhs($node->class) . '::' . $this->pObjectProperty($node->name); - } - - protected function pExpr_PropertyFetch(Expr\PropertyFetch $node) { - return $this->pDereferenceLhs($node->var) . '->' . $this->pObjectProperty($node->name); - } - - protected function pExpr_NullsafePropertyFetch(Expr\NullsafePropertyFetch $node) { - return $this->pDereferenceLhs($node->var) . '?->' . $this->pObjectProperty($node->name); - } - - protected function pExpr_StaticPropertyFetch(Expr\StaticPropertyFetch $node) { - return $this->pStaticDereferenceLhs($node->class) . '::$' . $this->pObjectProperty($node->name); - } - - protected function pExpr_ShellExec(Expr\ShellExec $node) { - return '`' . $this->pEncapsList($node->parts, '`') . '`'; - } - - protected function pExpr_Closure(Expr\Closure $node) { - return $this->pAttrGroups($node->attrGroups, true) - . ($node->static ? 'static ' : '') - . 'function ' . ($node->byRef ? '&' : '') - . '(' . $this->pCommaSeparated($node->params) . ')' - . (!empty($node->uses) ? ' use(' . $this->pCommaSeparated($node->uses) . ')' : '') - . (null !== $node->returnType ? ' : ' . $this->p($node->returnType) : '') - . ' {' . $this->pStmts($node->stmts) . $this->nl . '}'; - } - - protected function pExpr_Match(Expr\Match_ $node) { - return 'match (' . $this->p($node->cond) . ') {' - . $this->pCommaSeparatedMultiline($node->arms, true) - . $this->nl - . '}'; - } - - protected function pMatchArm(Node\MatchArm $node) { - return ($node->conds ? $this->pCommaSeparated($node->conds) : 'default') - . ' => ' . $this->p($node->body); - } - - protected function pExpr_ArrowFunction(Expr\ArrowFunction $node) { - return $this->pAttrGroups($node->attrGroups, true) - . ($node->static ? 'static ' : '') - . 'fn' . ($node->byRef ? '&' : '') - . '(' . $this->pCommaSeparated($node->params) . ')' - . (null !== $node->returnType ? ': ' . $this->p($node->returnType) : '') - . ' => ' - . $this->p($node->expr); - } - - protected function pExpr_ClosureUse(Expr\ClosureUse $node) { - return ($node->byRef ? '&' : '') . $this->p($node->var); - } - - protected function pExpr_New(Expr\New_ $node) { - if ($node->class instanceof Stmt\Class_) { - $args = $node->args ? '(' . $this->pMaybeMultiline($node->args) . ')' : ''; - return 'new ' . $this->pClassCommon($node->class, $args); - } - return 'new ' . $this->pNewVariable($node->class) - . '(' . $this->pMaybeMultiline($node->args) . ')'; - } - - protected function pExpr_Clone(Expr\Clone_ $node) { - return 'clone ' . $this->p($node->expr); - } - - protected function pExpr_Ternary(Expr\Ternary $node) { - // a bit of cheating: we treat the ternary as a binary op where the ?...: part is the operator. - // this is okay because the part between ? and : never needs parentheses. - return $this->pInfixOp(Expr\Ternary::class, - $node->cond, ' ?' . (null !== $node->if ? ' ' . $this->p($node->if) . ' ' : '') . ': ', $node->else - ); - } - - protected function pExpr_Exit(Expr\Exit_ $node) { - $kind = $node->getAttribute('kind', Expr\Exit_::KIND_DIE); - return ($kind === Expr\Exit_::KIND_EXIT ? 'exit' : 'die') - . (null !== $node->expr ? '(' . $this->p($node->expr) . ')' : ''); - } - - protected function pExpr_Throw(Expr\Throw_ $node) { - return 'throw ' . $this->p($node->expr); - } - - protected function pExpr_Yield(Expr\Yield_ $node) { - if ($node->value === null) { - return 'yield'; - } else { - // this is a bit ugly, but currently there is no way to detect whether the parentheses are necessary - return '(yield ' - . ($node->key !== null ? $this->p($node->key) . ' => ' : '') - . $this->p($node->value) - . ')'; - } - } - - // Declarations - - protected function pStmt_Namespace(Stmt\Namespace_ $node) { - if ($this->canUseSemicolonNamespaces) { - return 'namespace ' . $this->p($node->name) . ';' - . $this->nl . $this->pStmts($node->stmts, false); - } else { - return 'namespace' . (null !== $node->name ? ' ' . $this->p($node->name) : '') - . ' {' . $this->pStmts($node->stmts) . $this->nl . '}'; - } - } - - protected function pStmt_Use(Stmt\Use_ $node) { - return 'use ' . $this->pUseType($node->type) - . $this->pCommaSeparated($node->uses) . ';'; - } - - protected function pStmt_GroupUse(Stmt\GroupUse $node) { - return 'use ' . $this->pUseType($node->type) . $this->pName($node->prefix) - . '\{' . $this->pCommaSeparated($node->uses) . '};'; - } - - protected function pStmt_UseUse(Stmt\UseUse $node) { - return $this->pUseType($node->type) . $this->p($node->name) - . (null !== $node->alias ? ' as ' . $node->alias : ''); - } - - protected function pUseType($type) { - return $type === Stmt\Use_::TYPE_FUNCTION ? 'function ' - : ($type === Stmt\Use_::TYPE_CONSTANT ? 'const ' : ''); - } - - protected function pStmt_Interface(Stmt\Interface_ $node) { - return $this->pAttrGroups($node->attrGroups) - . 'interface ' . $node->name - . (!empty($node->extends) ? ' extends ' . $this->pCommaSeparated($node->extends) : '') - . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; - } - - protected function pStmt_Enum(Stmt\Enum_ $node) { - return $this->pAttrGroups($node->attrGroups) - . 'enum ' . $node->name - . ($node->scalarType ? " : $node->scalarType" : '') - . (!empty($node->implements) ? ' implements ' . $this->pCommaSeparated($node->implements) : '') - . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; - } - - protected function pStmt_Class(Stmt\Class_ $node) { - return $this->pClassCommon($node, ' ' . $node->name); - } - - protected function pStmt_Trait(Stmt\Trait_ $node) { - return $this->pAttrGroups($node->attrGroups) - . 'trait ' . $node->name - . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; - } - - protected function pStmt_EnumCase(Stmt\EnumCase $node) { - return $this->pAttrGroups($node->attrGroups) - . 'case ' . $node->name - . ($node->expr ? ' = ' . $this->p($node->expr) : '') - . ';'; - } - - protected function pStmt_TraitUse(Stmt\TraitUse $node) { - return 'use ' . $this->pCommaSeparated($node->traits) - . (empty($node->adaptations) - ? ';' - : ' {' . $this->pStmts($node->adaptations) . $this->nl . '}'); - } - - protected function pStmt_TraitUseAdaptation_Precedence(Stmt\TraitUseAdaptation\Precedence $node) { - return $this->p($node->trait) . '::' . $node->method - . ' insteadof ' . $this->pCommaSeparated($node->insteadof) . ';'; - } - - protected function pStmt_TraitUseAdaptation_Alias(Stmt\TraitUseAdaptation\Alias $node) { - return (null !== $node->trait ? $this->p($node->trait) . '::' : '') - . $node->method . ' as' - . (null !== $node->newModifier ? ' ' . rtrim($this->pModifiers($node->newModifier), ' ') : '') - . (null !== $node->newName ? ' ' . $node->newName : '') - . ';'; - } - - protected function pStmt_Property(Stmt\Property $node) { - return $this->pAttrGroups($node->attrGroups) - . (0 === $node->flags ? 'var ' : $this->pModifiers($node->flags)) - . ($node->type ? $this->p($node->type) . ' ' : '') - . $this->pCommaSeparated($node->props) . ';'; - } - - protected function pStmt_PropertyProperty(Stmt\PropertyProperty $node) { - return '$' . $node->name - . (null !== $node->default ? ' = ' . $this->p($node->default) : ''); - } - - protected function pStmt_ClassMethod(Stmt\ClassMethod $node) { - return $this->pAttrGroups($node->attrGroups) - . $this->pModifiers($node->flags) - . 'function ' . ($node->byRef ? '&' : '') . $node->name - . '(' . $this->pMaybeMultiline($node->params) . ')' - . (null !== $node->returnType ? ' : ' . $this->p($node->returnType) : '') - . (null !== $node->stmts - ? $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}' - : ';'); - } - - protected function pStmt_ClassConst(Stmt\ClassConst $node) { - return $this->pAttrGroups($node->attrGroups) - . $this->pModifiers($node->flags) - . 'const ' - . (null !== $node->type ? $this->p($node->type) . ' ' : '') - . $this->pCommaSeparated($node->consts) . ';'; - } - - protected function pStmt_Function(Stmt\Function_ $node) { - return $this->pAttrGroups($node->attrGroups) - . 'function ' . ($node->byRef ? '&' : '') . $node->name - . '(' . $this->pCommaSeparated($node->params) . ')' - . (null !== $node->returnType ? ' : ' . $this->p($node->returnType) : '') - . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; - } - - protected function pStmt_Const(Stmt\Const_ $node) { - return 'const ' . $this->pCommaSeparated($node->consts) . ';'; - } - - protected function pStmt_Declare(Stmt\Declare_ $node) { - return 'declare (' . $this->pCommaSeparated($node->declares) . ')' - . (null !== $node->stmts ? ' {' . $this->pStmts($node->stmts) . $this->nl . '}' : ';'); - } - - protected function pStmt_DeclareDeclare(Stmt\DeclareDeclare $node) { - return $node->key . '=' . $this->p($node->value); - } - - // Control flow - - protected function pStmt_If(Stmt\If_ $node) { - return 'if (' . $this->p($node->cond) . ') {' - . $this->pStmts($node->stmts) . $this->nl . '}' - . ($node->elseifs ? ' ' . $this->pImplode($node->elseifs, ' ') : '') - . (null !== $node->else ? ' ' . $this->p($node->else) : ''); - } - - protected function pStmt_ElseIf(Stmt\ElseIf_ $node) { - return 'elseif (' . $this->p($node->cond) . ') {' - . $this->pStmts($node->stmts) . $this->nl . '}'; - } - - protected function pStmt_Else(Stmt\Else_ $node) { - return 'else {' . $this->pStmts($node->stmts) . $this->nl . '}'; - } - - protected function pStmt_For(Stmt\For_ $node) { - return 'for (' - . $this->pCommaSeparated($node->init) . ';' . (!empty($node->cond) ? ' ' : '') - . $this->pCommaSeparated($node->cond) . ';' . (!empty($node->loop) ? ' ' : '') - . $this->pCommaSeparated($node->loop) - . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; - } - - protected function pStmt_Foreach(Stmt\Foreach_ $node) { - return 'foreach (' . $this->p($node->expr) . ' as ' - . (null !== $node->keyVar ? $this->p($node->keyVar) . ' => ' : '') - . ($node->byRef ? '&' : '') . $this->p($node->valueVar) . ') {' - . $this->pStmts($node->stmts) . $this->nl . '}'; - } - - protected function pStmt_While(Stmt\While_ $node) { - return 'while (' . $this->p($node->cond) . ') {' - . $this->pStmts($node->stmts) . $this->nl . '}'; - } - - protected function pStmt_Do(Stmt\Do_ $node) { - return 'do {' . $this->pStmts($node->stmts) . $this->nl - . '} while (' . $this->p($node->cond) . ');'; - } - - protected function pStmt_Switch(Stmt\Switch_ $node) { - return 'switch (' . $this->p($node->cond) . ') {' - . $this->pStmts($node->cases) . $this->nl . '}'; - } - - protected function pStmt_Case(Stmt\Case_ $node) { - return (null !== $node->cond ? 'case ' . $this->p($node->cond) : 'default') . ':' - . $this->pStmts($node->stmts); - } - - protected function pStmt_TryCatch(Stmt\TryCatch $node) { - return 'try {' . $this->pStmts($node->stmts) . $this->nl . '}' - . ($node->catches ? ' ' . $this->pImplode($node->catches, ' ') : '') - . ($node->finally !== null ? ' ' . $this->p($node->finally) : ''); - } - - protected function pStmt_Catch(Stmt\Catch_ $node) { - return 'catch (' . $this->pImplode($node->types, '|') - . ($node->var !== null ? ' ' . $this->p($node->var) : '') - . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; - } - - protected function pStmt_Finally(Stmt\Finally_ $node) { - return 'finally {' . $this->pStmts($node->stmts) . $this->nl . '}'; - } - - protected function pStmt_Break(Stmt\Break_ $node) { - return 'break' . ($node->num !== null ? ' ' . $this->p($node->num) : '') . ';'; - } - - protected function pStmt_Continue(Stmt\Continue_ $node) { - return 'continue' . ($node->num !== null ? ' ' . $this->p($node->num) : '') . ';'; - } - - protected function pStmt_Return(Stmt\Return_ $node) { - return 'return' . (null !== $node->expr ? ' ' . $this->p($node->expr) : '') . ';'; - } - - protected function pStmt_Throw(Stmt\Throw_ $node) { - return 'throw ' . $this->p($node->expr) . ';'; - } - - protected function pStmt_Label(Stmt\Label $node) { - return $node->name . ':'; - } - - protected function pStmt_Goto(Stmt\Goto_ $node) { - return 'goto ' . $node->name . ';'; - } - - // Other - - protected function pStmt_Expression(Stmt\Expression $node) { - return $this->p($node->expr) . ';'; - } - - protected function pStmt_Echo(Stmt\Echo_ $node) { - return 'echo ' . $this->pCommaSeparated($node->exprs) . ';'; - } - - protected function pStmt_Static(Stmt\Static_ $node) { - return 'static ' . $this->pCommaSeparated($node->vars) . ';'; - } - - protected function pStmt_Global(Stmt\Global_ $node) { - return 'global ' . $this->pCommaSeparated($node->vars) . ';'; - } - - protected function pStmt_StaticVar(Stmt\StaticVar $node) { - return $this->p($node->var) - . (null !== $node->default ? ' = ' . $this->p($node->default) : ''); - } - - protected function pStmt_Unset(Stmt\Unset_ $node) { - return 'unset(' . $this->pCommaSeparated($node->vars) . ');'; - } - - protected function pStmt_InlineHTML(Stmt\InlineHTML $node) { - $newline = $node->getAttribute('hasLeadingNewline', true) ? "\n" : ''; - return '?>' . $newline . $node->value . '<?php '; - } - - protected function pStmt_HaltCompiler(Stmt\HaltCompiler $node) { - return '__halt_compiler();' . $node->remaining; - } - - protected function pStmt_Nop(Stmt\Nop $node) { - return ''; - } - - // Helpers - - protected function pClassCommon(Stmt\Class_ $node, $afterClassToken) { - return $this->pAttrGroups($node->attrGroups, $node->name === null) - . $this->pModifiers($node->flags) - . 'class' . $afterClassToken - . (null !== $node->extends ? ' extends ' . $this->p($node->extends) : '') - . (!empty($node->implements) ? ' implements ' . $this->pCommaSeparated($node->implements) : '') - . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; - } - - protected function pObjectProperty($node) { - if ($node instanceof Expr) { - return '{' . $this->p($node) . '}'; - } else { - return $node; - } - } - - protected function pEncapsList(array $encapsList, $quote) { - $return = ''; - foreach ($encapsList as $element) { - if ($element instanceof Scalar\EncapsedStringPart) { - $return .= $this->escapeString($element->value, $quote); - } else { - $return .= '{' . $this->p($element) . '}'; - } - } - - return $return; - } - - protected function pSingleQuotedString(string $string) { - return '\'' . addcslashes($string, '\'\\') . '\''; - } - - protected function escapeString($string, $quote) { - if (null === $quote) { - // For doc strings, don't escape newlines - $escaped = addcslashes($string, "\t\f\v$\\"); - } else { - $escaped = addcslashes($string, "\n\r\t\f\v$" . $quote . "\\"); - } - - // Escape control characters and non-UTF-8 characters. - // Regex based on https://stackoverflow.com/a/11709412/385378. - $regex = '/( - [\x00-\x08\x0E-\x1F] # Control characters - | [\xC0-\xC1] # Invalid UTF-8 Bytes - | [\xF5-\xFF] # Invalid UTF-8 Bytes - | \xE0(?=[\x80-\x9F]) # Overlong encoding of prior code point - | \xF0(?=[\x80-\x8F]) # Overlong encoding of prior code point - | [\xC2-\xDF](?![\x80-\xBF]) # Invalid UTF-8 Sequence Start - | [\xE0-\xEF](?![\x80-\xBF]{2}) # Invalid UTF-8 Sequence Start - | [\xF0-\xF4](?![\x80-\xBF]{3}) # Invalid UTF-8 Sequence Start - | (?<=[\x00-\x7F\xF5-\xFF])[\x80-\xBF] # Invalid UTF-8 Sequence Middle - | (?<![\xC2-\xDF]|[\xE0-\xEF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4]|[\xF0-\xF4][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF]{2})[\x80-\xBF] # Overlong Sequence - | (?<=[\xE0-\xEF])[\x80-\xBF](?![\x80-\xBF]) # Short 3 byte sequence - | (?<=[\xF0-\xF4])[\x80-\xBF](?![\x80-\xBF]{2}) # Short 4 byte sequence - | (?<=[\xF0-\xF4][\x80-\xBF])[\x80-\xBF](?![\x80-\xBF]) # Short 4 byte sequence (2) - )/x'; - return preg_replace_callback($regex, function ($matches) { - assert(strlen($matches[0]) === 1); - $hex = dechex(ord($matches[0]));; - return '\\x' . str_pad($hex, 2, '0', \STR_PAD_LEFT); - }, $escaped); - } - - protected function containsEndLabel($string, $label, $atStart = true, $atEnd = true) { - $start = $atStart ? '(?:^|[\r\n])' : '[\r\n]'; - $end = $atEnd ? '(?:$|[;\r\n])' : '[;\r\n]'; - return false !== strpos($string, $label) - && preg_match('/' . $start . $label . $end . '/', $string); - } - - protected function encapsedContainsEndLabel(array $parts, $label) { - foreach ($parts as $i => $part) { - $atStart = $i === 0; - $atEnd = $i === count($parts) - 1; - if ($part instanceof Scalar\EncapsedStringPart - && $this->containsEndLabel($part->value, $label, $atStart, $atEnd) - ) { - return true; - } - } - return false; - } - - protected function pDereferenceLhs(Node $node) { - if (!$this->dereferenceLhsRequiresParens($node)) { - return $this->p($node); - } else { - return '(' . $this->p($node) . ')'; - } - } - - protected function pStaticDereferenceLhs(Node $node) { - if (!$this->staticDereferenceLhsRequiresParens($node)) { - return $this->p($node); - } else { - return '(' . $this->p($node) . ')'; - } - } - - protected function pCallLhs(Node $node) { - if (!$this->callLhsRequiresParens($node)) { - return $this->p($node); - } else { - return '(' . $this->p($node) . ')'; - } - } - - protected function pNewVariable(Node $node): string { - if (!$this->newOperandRequiresParens($node)) { - return $this->p($node); - } else { - return '(' . $this->p($node) . ')'; - } - } - - /** - * @param Node[] $nodes - * @return bool - */ - protected function hasNodeWithComments(array $nodes) { - foreach ($nodes as $node) { - if ($node && $node->getComments()) { - return true; - } - } - return false; - } - - protected function pMaybeMultiline(array $nodes, bool $trailingComma = false) { - if (!$this->hasNodeWithComments($nodes)) { - return $this->pCommaSeparated($nodes); - } else { - return $this->pCommaSeparatedMultiline($nodes, $trailingComma) . $this->nl; - } - } - - protected function pAttrGroups(array $nodes, bool $inline = false): string { - $result = ''; - $sep = $inline ? ' ' : $this->nl; - foreach ($nodes as $node) { - $result .= $this->p($node) . $sep; - } - - return $result; - } -} diff --git a/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php b/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php deleted file mode 100644 index 5d87e5c..0000000 --- a/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php +++ /dev/null @@ -1,1576 +0,0 @@ -<?php declare(strict_types=1); - -namespace PhpParser; - -use PhpParser\Internal\DiffElem; -use PhpParser\Internal\PrintableNewAnonClassNode; -use PhpParser\Internal\TokenStream; -use PhpParser\Node\Expr; -use PhpParser\Node\Expr\AssignOp; -use PhpParser\Node\Expr\BinaryOp; -use PhpParser\Node\Expr\Cast; -use PhpParser\Node\Scalar; -use PhpParser\Node\Stmt; - -abstract class PrettyPrinterAbstract -{ - const FIXUP_PREC_LEFT = 0; // LHS operand affected by precedence - const FIXUP_PREC_RIGHT = 1; // RHS operand affected by precedence - const FIXUP_CALL_LHS = 2; // LHS of call - const FIXUP_DEREF_LHS = 3; // LHS of dereferencing operation - const FIXUP_BRACED_NAME = 4; // Name operand that may require bracing - const FIXUP_VAR_BRACED_NAME = 5; // Name operand that may require ${} bracing - const FIXUP_ENCAPSED = 6; // Encapsed string part - const FIXUP_NEW = 7; // New/instanceof operand - const FIXUP_STATIC_DEREF_LHS = 8; // LHS of static dereferencing operation - - protected $precedenceMap = [ - // [precedence, associativity] - // where for precedence -1 is %left, 0 is %nonassoc and 1 is %right - BinaryOp\Pow::class => [ 0, 1], - Expr\BitwiseNot::class => [ 10, 1], - Expr\PreInc::class => [ 10, 1], - Expr\PreDec::class => [ 10, 1], - Expr\PostInc::class => [ 10, -1], - Expr\PostDec::class => [ 10, -1], - Expr\UnaryPlus::class => [ 10, 1], - Expr\UnaryMinus::class => [ 10, 1], - Cast\Int_::class => [ 10, 1], - Cast\Double::class => [ 10, 1], - Cast\String_::class => [ 10, 1], - Cast\Array_::class => [ 10, 1], - Cast\Object_::class => [ 10, 1], - Cast\Bool_::class => [ 10, 1], - Cast\Unset_::class => [ 10, 1], - Expr\ErrorSuppress::class => [ 10, 1], - Expr\Instanceof_::class => [ 20, 0], - Expr\BooleanNot::class => [ 30, 1], - BinaryOp\Mul::class => [ 40, -1], - BinaryOp\Div::class => [ 40, -1], - BinaryOp\Mod::class => [ 40, -1], - BinaryOp\Plus::class => [ 50, -1], - BinaryOp\Minus::class => [ 50, -1], - BinaryOp\Concat::class => [ 50, -1], - BinaryOp\ShiftLeft::class => [ 60, -1], - BinaryOp\ShiftRight::class => [ 60, -1], - BinaryOp\Smaller::class => [ 70, 0], - BinaryOp\SmallerOrEqual::class => [ 70, 0], - BinaryOp\Greater::class => [ 70, 0], - BinaryOp\GreaterOrEqual::class => [ 70, 0], - BinaryOp\Equal::class => [ 80, 0], - BinaryOp\NotEqual::class => [ 80, 0], - BinaryOp\Identical::class => [ 80, 0], - BinaryOp\NotIdentical::class => [ 80, 0], - BinaryOp\Spaceship::class => [ 80, 0], - BinaryOp\BitwiseAnd::class => [ 90, -1], - BinaryOp\BitwiseXor::class => [100, -1], - BinaryOp\BitwiseOr::class => [110, -1], - BinaryOp\BooleanAnd::class => [120, -1], - BinaryOp\BooleanOr::class => [130, -1], - BinaryOp\Coalesce::class => [140, 1], - Expr\Ternary::class => [150, 0], - // parser uses %left for assignments, but they really behave as %right - Expr\Assign::class => [160, 1], - Expr\AssignRef::class => [160, 1], - AssignOp\Plus::class => [160, 1], - AssignOp\Minus::class => [160, 1], - AssignOp\Mul::class => [160, 1], - AssignOp\Div::class => [160, 1], - AssignOp\Concat::class => [160, 1], - AssignOp\Mod::class => [160, 1], - AssignOp\BitwiseAnd::class => [160, 1], - AssignOp\BitwiseOr::class => [160, 1], - AssignOp\BitwiseXor::class => [160, 1], - AssignOp\ShiftLeft::class => [160, 1], - AssignOp\ShiftRight::class => [160, 1], - AssignOp\Pow::class => [160, 1], - AssignOp\Coalesce::class => [160, 1], - Expr\YieldFrom::class => [165, 1], - Expr\Print_::class => [168, 1], - BinaryOp\LogicalAnd::class => [170, -1], - BinaryOp\LogicalXor::class => [180, -1], - BinaryOp\LogicalOr::class => [190, -1], - Expr\Include_::class => [200, -1], - ]; - - /** @var int Current indentation level. */ - protected $indentLevel; - /** @var string Newline including current indentation. */ - protected $nl; - /** @var string Token placed at end of doc string to ensure it is followed by a newline. */ - protected $docStringEndToken; - /** @var bool Whether semicolon namespaces can be used (i.e. no global namespace is used) */ - protected $canUseSemicolonNamespaces; - /** @var array Pretty printer options */ - protected $options; - - /** @var TokenStream Original tokens for use in format-preserving pretty print */ - protected $origTokens; - /** @var Internal\Differ Differ for node lists */ - protected $nodeListDiffer; - /** @var bool[] Map determining whether a certain character is a label character */ - protected $labelCharMap; - /** - * @var int[][] Map from token classes and subnode names to FIXUP_* constants. This is used - * during format-preserving prints to place additional parens/braces if necessary. - */ - protected $fixupMap; - /** - * @var int[][] Map from "{$node->getType()}->{$subNode}" to ['left' => $l, 'right' => $r], - * where $l and $r specify the token type that needs to be stripped when removing - * this node. - */ - protected $removalMap; - /** - * @var mixed[] Map from "{$node->getType()}->{$subNode}" to [$find, $beforeToken, $extraLeft, $extraRight]. - * $find is an optional token after which the insertion occurs. $extraLeft/Right - * are optionally added before/after the main insertions. - */ - protected $insertionMap; - /** - * @var string[] Map From "{$node->getType()}->{$subNode}" to string that should be inserted - * between elements of this list subnode. - */ - protected $listInsertionMap; - protected $emptyListInsertionMap; - /** @var int[] Map from "{$node->getType()}->{$subNode}" to token before which the modifiers - * should be reprinted. */ - protected $modifierChangeMap; - - /** - * Creates a pretty printer instance using the given options. - * - * Supported options: - * * bool $shortArraySyntax = false: Whether to use [] instead of array() as the default array - * syntax, if the node does not specify a format. - * - * @param array $options Dictionary of formatting options - */ - public function __construct(array $options = []) { - $this->docStringEndToken = '_DOC_STRING_END_' . mt_rand(); - - $defaultOptions = ['shortArraySyntax' => false]; - $this->options = $options + $defaultOptions; - } - - /** - * Reset pretty printing state. - */ - protected function resetState() { - $this->indentLevel = 0; - $this->nl = "\n"; - $this->origTokens = null; - } - - /** - * Set indentation level - * - * @param int $level Level in number of spaces - */ - protected function setIndentLevel(int $level) { - $this->indentLevel = $level; - $this->nl = "\n" . \str_repeat(' ', $level); - } - - /** - * Increase indentation level. - */ - protected function indent() { - $this->indentLevel += 4; - $this->nl .= ' '; - } - - /** - * Decrease indentation level. - */ - protected function outdent() { - assert($this->indentLevel >= 4); - $this->indentLevel -= 4; - $this->nl = "\n" . str_repeat(' ', $this->indentLevel); - } - - /** - * Pretty prints an array of statements. - * - * @param Node[] $stmts Array of statements - * - * @return string Pretty printed statements - */ - public function prettyPrint(array $stmts) : string { - $this->resetState(); - $this->preprocessNodes($stmts); - - return ltrim($this->handleMagicTokens($this->pStmts($stmts, false))); - } - - /** - * Pretty prints an expression. - * - * @param Expr $node Expression node - * - * @return string Pretty printed node - */ - public function prettyPrintExpr(Expr $node) : string { - $this->resetState(); - return $this->handleMagicTokens($this->p($node)); - } - - /** - * Pretty prints a file of statements (includes the opening <?php tag if it is required). - * - * @param Node[] $stmts Array of statements - * - * @return string Pretty printed statements - */ - public function prettyPrintFile(array $stmts) : string { - if (!$stmts) { - return "<?php\n\n"; - } - - $p = "<?php\n\n" . $this->prettyPrint($stmts); - - if ($stmts[0] instanceof Stmt\InlineHTML) { - $p = preg_replace('/^<\?php\s+\?>\n?/', '', $p); - } - if ($stmts[count($stmts) - 1] instanceof Stmt\InlineHTML) { - $p = preg_replace('/<\?php$/', '', rtrim($p)); - } - - return $p; - } - - /** - * Preprocesses the top-level nodes to initialize pretty printer state. - * - * @param Node[] $nodes Array of nodes - */ - protected function preprocessNodes(array $nodes) { - /* We can use semicolon-namespaces unless there is a global namespace declaration */ - $this->canUseSemicolonNamespaces = true; - foreach ($nodes as $node) { - if ($node instanceof Stmt\Namespace_ && null === $node->name) { - $this->canUseSemicolonNamespaces = false; - break; - } - } - } - - /** - * Handles (and removes) no-indent and doc-string-end tokens. - * - * @param string $str - * @return string - */ - protected function handleMagicTokens(string $str) : string { - // Replace doc-string-end tokens with nothing or a newline - $str = str_replace($this->docStringEndToken . ";\n", ";\n", $str); - $str = str_replace($this->docStringEndToken, "\n", $str); - - return $str; - } - - /** - * Pretty prints an array of nodes (statements) and indents them optionally. - * - * @param Node[] $nodes Array of nodes - * @param bool $indent Whether to indent the printed nodes - * - * @return string Pretty printed statements - */ - protected function pStmts(array $nodes, bool $indent = true) : string { - if ($indent) { - $this->indent(); - } - - $result = ''; - foreach ($nodes as $node) { - $comments = $node->getComments(); - if ($comments) { - $result .= $this->nl . $this->pComments($comments); - if ($node instanceof Stmt\Nop) { - continue; - } - } - - $result .= $this->nl . $this->p($node); - } - - if ($indent) { - $this->outdent(); - } - - return $result; - } - - /** - * Pretty-print an infix operation while taking precedence into account. - * - * @param string $class Node class of operator - * @param Node $leftNode Left-hand side node - * @param string $operatorString String representation of the operator - * @param Node $rightNode Right-hand side node - * - * @return string Pretty printed infix operation - */ - protected function pInfixOp(string $class, Node $leftNode, string $operatorString, Node $rightNode) : string { - list($precedence, $associativity) = $this->precedenceMap[$class]; - - return $this->pPrec($leftNode, $precedence, $associativity, -1) - . $operatorString - . $this->pPrec($rightNode, $precedence, $associativity, 1); - } - - /** - * Pretty-print a prefix operation while taking precedence into account. - * - * @param string $class Node class of operator - * @param string $operatorString String representation of the operator - * @param Node $node Node - * - * @return string Pretty printed prefix operation - */ - protected function pPrefixOp(string $class, string $operatorString, Node $node) : string { - list($precedence, $associativity) = $this->precedenceMap[$class]; - return $operatorString . $this->pPrec($node, $precedence, $associativity, 1); - } - - /** - * Pretty-print a postfix operation while taking precedence into account. - * - * @param string $class Node class of operator - * @param string $operatorString String representation of the operator - * @param Node $node Node - * - * @return string Pretty printed postfix operation - */ - protected function pPostfixOp(string $class, Node $node, string $operatorString) : string { - list($precedence, $associativity) = $this->precedenceMap[$class]; - return $this->pPrec($node, $precedence, $associativity, -1) . $operatorString; - } - - /** - * Prints an expression node with the least amount of parentheses necessary to preserve the meaning. - * - * @param Node $node Node to pretty print - * @param int $parentPrecedence Precedence of the parent operator - * @param int $parentAssociativity Associativity of parent operator - * (-1 is left, 0 is nonassoc, 1 is right) - * @param int $childPosition Position of the node relative to the operator - * (-1 is left, 1 is right) - * - * @return string The pretty printed node - */ - protected function pPrec(Node $node, int $parentPrecedence, int $parentAssociativity, int $childPosition) : string { - $class = \get_class($node); - if (isset($this->precedenceMap[$class])) { - $childPrecedence = $this->precedenceMap[$class][0]; - if ($childPrecedence > $parentPrecedence - || ($parentPrecedence === $childPrecedence && $parentAssociativity !== $childPosition) - ) { - return '(' . $this->p($node) . ')'; - } - } - - return $this->p($node); - } - - /** - * Pretty prints an array of nodes and implodes the printed values. - * - * @param Node[] $nodes Array of Nodes to be printed - * @param string $glue Character to implode with - * - * @return string Imploded pretty printed nodes - */ - protected function pImplode(array $nodes, string $glue = '') : string { - $pNodes = []; - foreach ($nodes as $node) { - if (null === $node) { - $pNodes[] = ''; - } else { - $pNodes[] = $this->p($node); - } - } - - return implode($glue, $pNodes); - } - - /** - * Pretty prints an array of nodes and implodes the printed values with commas. - * - * @param Node[] $nodes Array of Nodes to be printed - * - * @return string Comma separated pretty printed nodes - */ - protected function pCommaSeparated(array $nodes) : string { - return $this->pImplode($nodes, ', '); - } - - /** - * Pretty prints a comma-separated list of nodes in multiline style, including comments. - * - * The result includes a leading newline and one level of indentation (same as pStmts). - * - * @param Node[] $nodes Array of Nodes to be printed - * @param bool $trailingComma Whether to use a trailing comma - * - * @return string Comma separated pretty printed nodes in multiline style - */ - protected function pCommaSeparatedMultiline(array $nodes, bool $trailingComma) : string { - $this->indent(); - - $result = ''; - $lastIdx = count($nodes) - 1; - foreach ($nodes as $idx => $node) { - if ($node !== null) { - $comments = $node->getComments(); - if ($comments) { - $result .= $this->nl . $this->pComments($comments); - } - - $result .= $this->nl . $this->p($node); - } else { - $result .= $this->nl; - } - if ($trailingComma || $idx !== $lastIdx) { - $result .= ','; - } - } - - $this->outdent(); - return $result; - } - - /** - * Prints reformatted text of the passed comments. - * - * @param Comment[] $comments List of comments - * - * @return string Reformatted text of comments - */ - protected function pComments(array $comments) : string { - $formattedComments = []; - - foreach ($comments as $comment) { - $formattedComments[] = str_replace("\n", $this->nl, $comment->getReformattedText()); - } - - return implode($this->nl, $formattedComments); - } - - /** - * Perform a format-preserving pretty print of an AST. - * - * The format preservation is best effort. For some changes to the AST the formatting will not - * be preserved (at least not locally). - * - * In order to use this method a number of prerequisites must be satisfied: - * * The startTokenPos and endTokenPos attributes in the lexer must be enabled. - * * The CloningVisitor must be run on the AST prior to modification. - * * The original tokens must be provided, using the getTokens() method on the lexer. - * - * @param Node[] $stmts Modified AST with links to original AST - * @param Node[] $origStmts Original AST with token offset information - * @param array $origTokens Tokens of the original code - * - * @return string - */ - public function printFormatPreserving(array $stmts, array $origStmts, array $origTokens) : string { - $this->initializeNodeListDiffer(); - $this->initializeLabelCharMap(); - $this->initializeFixupMap(); - $this->initializeRemovalMap(); - $this->initializeInsertionMap(); - $this->initializeListInsertionMap(); - $this->initializeEmptyListInsertionMap(); - $this->initializeModifierChangeMap(); - - $this->resetState(); - $this->origTokens = new TokenStream($origTokens); - - $this->preprocessNodes($stmts); - - $pos = 0; - $result = $this->pArray($stmts, $origStmts, $pos, 0, 'File', 'stmts', null); - if (null !== $result) { - $result .= $this->origTokens->getTokenCode($pos, count($origTokens), 0); - } else { - // Fallback - // TODO Add <?php properly - $result = "<?php\n" . $this->pStmts($stmts, false); - } - - return ltrim($this->handleMagicTokens($result)); - } - - protected function pFallback(Node $node) { - return $this->{'p' . $node->getType()}($node); - } - - /** - * Pretty prints a node. - * - * This method also handles formatting preservation for nodes. - * - * @param Node $node Node to be pretty printed - * @param bool $parentFormatPreserved Whether parent node has preserved formatting - * - * @return string Pretty printed node - */ - protected function p(Node $node, $parentFormatPreserved = false) : string { - // No orig tokens means this is a normal pretty print without preservation of formatting - if (!$this->origTokens) { - return $this->{'p' . $node->getType()}($node); - } - - /** @var Node $origNode */ - $origNode = $node->getAttribute('origNode'); - if (null === $origNode) { - return $this->pFallback($node); - } - - $class = \get_class($node); - \assert($class === \get_class($origNode)); - - $startPos = $origNode->getStartTokenPos(); - $endPos = $origNode->getEndTokenPos(); - \assert($startPos >= 0 && $endPos >= 0); - - $fallbackNode = $node; - if ($node instanceof Expr\New_ && $node->class instanceof Stmt\Class_) { - // Normalize node structure of anonymous classes - $node = PrintableNewAnonClassNode::fromNewNode($node); - $origNode = PrintableNewAnonClassNode::fromNewNode($origNode); - } - - // InlineHTML node does not contain closing and opening PHP tags. If the parent formatting - // is not preserved, then we need to use the fallback code to make sure the tags are - // printed. - if ($node instanceof Stmt\InlineHTML && !$parentFormatPreserved) { - return $this->pFallback($fallbackNode); - } - - $indentAdjustment = $this->indentLevel - $this->origTokens->getIndentationBefore($startPos); - - $type = $node->getType(); - $fixupInfo = $this->fixupMap[$class] ?? null; - - $result = ''; - $pos = $startPos; - foreach ($node->getSubNodeNames() as $subNodeName) { - $subNode = $node->$subNodeName; - $origSubNode = $origNode->$subNodeName; - - if ((!$subNode instanceof Node && $subNode !== null) - || (!$origSubNode instanceof Node && $origSubNode !== null) - ) { - if ($subNode === $origSubNode) { - // Unchanged, can reuse old code - continue; - } - - if (is_array($subNode) && is_array($origSubNode)) { - // Array subnode changed, we might be able to reconstruct it - $listResult = $this->pArray( - $subNode, $origSubNode, $pos, $indentAdjustment, $type, $subNodeName, - $fixupInfo[$subNodeName] ?? null - ); - if (null === $listResult) { - return $this->pFallback($fallbackNode); - } - - $result .= $listResult; - continue; - } - - if (is_int($subNode) && is_int($origSubNode)) { - // Check if this is a modifier change - $key = $type . '->' . $subNodeName; - if (!isset($this->modifierChangeMap[$key])) { - return $this->pFallback($fallbackNode); - } - - $findToken = $this->modifierChangeMap[$key]; - $result .= $this->pModifiers($subNode); - $pos = $this->origTokens->findRight($pos, $findToken); - continue; - } - - // If a non-node, non-array subnode changed, we don't be able to do a partial - // reconstructions, as we don't have enough offset information. Pretty print the - // whole node instead. - return $this->pFallback($fallbackNode); - } - - $extraLeft = ''; - $extraRight = ''; - if ($origSubNode !== null) { - $subStartPos = $origSubNode->getStartTokenPos(); - $subEndPos = $origSubNode->getEndTokenPos(); - \assert($subStartPos >= 0 && $subEndPos >= 0); - } else { - if ($subNode === null) { - // Both null, nothing to do - continue; - } - - // A node has been inserted, check if we have insertion information for it - $key = $type . '->' . $subNodeName; - if (!isset($this->insertionMap[$key])) { - return $this->pFallback($fallbackNode); - } - - list($findToken, $beforeToken, $extraLeft, $extraRight) = $this->insertionMap[$key]; - if (null !== $findToken) { - $subStartPos = $this->origTokens->findRight($pos, $findToken) - + (int) !$beforeToken; - } else { - $subStartPos = $pos; - } - - if (null === $extraLeft && null !== $extraRight) { - // If inserting on the right only, skipping whitespace looks better - $subStartPos = $this->origTokens->skipRightWhitespace($subStartPos); - } - $subEndPos = $subStartPos - 1; - } - - if (null === $subNode) { - // A node has been removed, check if we have removal information for it - $key = $type . '->' . $subNodeName; - if (!isset($this->removalMap[$key])) { - return $this->pFallback($fallbackNode); - } - - // Adjust positions to account for additional tokens that must be skipped - $removalInfo = $this->removalMap[$key]; - if (isset($removalInfo['left'])) { - $subStartPos = $this->origTokens->skipLeft($subStartPos - 1, $removalInfo['left']) + 1; - } - if (isset($removalInfo['right'])) { - $subEndPos = $this->origTokens->skipRight($subEndPos + 1, $removalInfo['right']) - 1; - } - } - - $result .= $this->origTokens->getTokenCode($pos, $subStartPos, $indentAdjustment); - - if (null !== $subNode) { - $result .= $extraLeft; - - $origIndentLevel = $this->indentLevel; - $this->setIndentLevel(max($this->origTokens->getIndentationBefore($subStartPos) + $indentAdjustment, 0)); - - // If it's the same node that was previously in this position, it certainly doesn't - // need fixup. It's important to check this here, because our fixup checks are more - // conservative than strictly necessary. - if (isset($fixupInfo[$subNodeName]) - && $subNode->getAttribute('origNode') !== $origSubNode - ) { - $fixup = $fixupInfo[$subNodeName]; - $res = $this->pFixup($fixup, $subNode, $class, $subStartPos, $subEndPos); - } else { - $res = $this->p($subNode, true); - } - - $this->safeAppend($result, $res); - $this->setIndentLevel($origIndentLevel); - - $result .= $extraRight; - } - - $pos = $subEndPos + 1; - } - - $result .= $this->origTokens->getTokenCode($pos, $endPos + 1, $indentAdjustment); - return $result; - } - - /** - * Perform a format-preserving pretty print of an array. - * - * @param array $nodes New nodes - * @param array $origNodes Original nodes - * @param int $pos Current token position (updated by reference) - * @param int $indentAdjustment Adjustment for indentation - * @param string $parentNodeType Type of the containing node. - * @param string $subNodeName Name of array subnode. - * @param null|int $fixup Fixup information for array item nodes - * - * @return null|string Result of pretty print or null if cannot preserve formatting - */ - protected function pArray( - array $nodes, array $origNodes, int &$pos, int $indentAdjustment, - string $parentNodeType, string $subNodeName, $fixup - ) { - $diff = $this->nodeListDiffer->diffWithReplacements($origNodes, $nodes); - - $mapKey = $parentNodeType . '->' . $subNodeName; - $insertStr = $this->listInsertionMap[$mapKey] ?? null; - $isStmtList = $subNodeName === 'stmts'; - - $beforeFirstKeepOrReplace = true; - $skipRemovedNode = false; - $delayedAdd = []; - $lastElemIndentLevel = $this->indentLevel; - - $insertNewline = false; - if ($insertStr === "\n") { - $insertStr = ''; - $insertNewline = true; - } - - if ($isStmtList && \count($origNodes) === 1 && \count($nodes) !== 1) { - $startPos = $origNodes[0]->getStartTokenPos(); - $endPos = $origNodes[0]->getEndTokenPos(); - \assert($startPos >= 0 && $endPos >= 0); - if (!$this->origTokens->haveBraces($startPos, $endPos)) { - // This was a single statement without braces, but either additional statements - // have been added, or the single statement has been removed. This requires the - // addition of braces. For now fall back. - // TODO: Try to preserve formatting - return null; - } - } - - $result = ''; - foreach ($diff as $i => $diffElem) { - $diffType = $diffElem->type; - /** @var Node|null $arrItem */ - $arrItem = $diffElem->new; - /** @var Node|null $origArrItem */ - $origArrItem = $diffElem->old; - - if ($diffType === DiffElem::TYPE_KEEP || $diffType === DiffElem::TYPE_REPLACE) { - $beforeFirstKeepOrReplace = false; - - if ($origArrItem === null || $arrItem === null) { - // We can only handle the case where both are null - if ($origArrItem === $arrItem) { - continue; - } - return null; - } - - if (!$arrItem instanceof Node || !$origArrItem instanceof Node) { - // We can only deal with nodes. This can occur for Names, which use string arrays. - return null; - } - - $itemStartPos = $origArrItem->getStartTokenPos(); - $itemEndPos = $origArrItem->getEndTokenPos(); - \assert($itemStartPos >= 0 && $itemEndPos >= 0 && $itemStartPos >= $pos); - - $origIndentLevel = $this->indentLevel; - $lastElemIndentLevel = max($this->origTokens->getIndentationBefore($itemStartPos) + $indentAdjustment, 0); - $this->setIndentLevel($lastElemIndentLevel); - - $comments = $arrItem->getComments(); - $origComments = $origArrItem->getComments(); - $commentStartPos = $origComments ? $origComments[0]->getStartTokenPos() : $itemStartPos; - \assert($commentStartPos >= 0); - - if ($commentStartPos < $pos) { - // Comments may be assigned to multiple nodes if they start at the same position. - // Make sure we don't try to print them multiple times. - $commentStartPos = $itemStartPos; - } - - if ($skipRemovedNode) { - if ($isStmtList && ($this->origTokens->haveBracesInRange($pos, $itemStartPos) || - $this->origTokens->haveTagInRange($pos, $itemStartPos))) { - // We'd remove the brace of a code block. - // TODO: Preserve formatting. - $this->setIndentLevel($origIndentLevel); - return null; - } - } else { - $result .= $this->origTokens->getTokenCode( - $pos, $commentStartPos, $indentAdjustment); - } - - if (!empty($delayedAdd)) { - /** @var Node $delayedAddNode */ - foreach ($delayedAdd as $delayedAddNode) { - if ($insertNewline) { - $delayedAddComments = $delayedAddNode->getComments(); - if ($delayedAddComments) { - $result .= $this->pComments($delayedAddComments) . $this->nl; - } - } - - $this->safeAppend($result, $this->p($delayedAddNode, true)); - - if ($insertNewline) { - $result .= $insertStr . $this->nl; - } else { - $result .= $insertStr; - } - } - - $delayedAdd = []; - } - - if ($comments !== $origComments) { - if ($comments) { - $result .= $this->pComments($comments) . $this->nl; - } - } else { - $result .= $this->origTokens->getTokenCode( - $commentStartPos, $itemStartPos, $indentAdjustment); - } - - // If we had to remove anything, we have done so now. - $skipRemovedNode = false; - } elseif ($diffType === DiffElem::TYPE_ADD) { - if (null === $insertStr) { - // We don't have insertion information for this list type - return null; - } - - // We go multiline if the original code was multiline, - // or if it's an array item with a comment above it. - if ($insertStr === ', ' && - ($this->isMultiline($origNodes) || $arrItem->getComments()) - ) { - $insertStr = ','; - $insertNewline = true; - } - - if ($beforeFirstKeepOrReplace) { - // Will be inserted at the next "replace" or "keep" element - $delayedAdd[] = $arrItem; - continue; - } - - $itemStartPos = $pos; - $itemEndPos = $pos - 1; - - $origIndentLevel = $this->indentLevel; - $this->setIndentLevel($lastElemIndentLevel); - - if ($insertNewline) { - $result .= $insertStr . $this->nl; - $comments = $arrItem->getComments(); - if ($comments) { - $result .= $this->pComments($comments) . $this->nl; - } - } else { - $result .= $insertStr; - } - } elseif ($diffType === DiffElem::TYPE_REMOVE) { - if (!$origArrItem instanceof Node) { - // We only support removal for nodes - return null; - } - - $itemStartPos = $origArrItem->getStartTokenPos(); - $itemEndPos = $origArrItem->getEndTokenPos(); - \assert($itemStartPos >= 0 && $itemEndPos >= 0); - - // Consider comments part of the node. - $origComments = $origArrItem->getComments(); - if ($origComments) { - $itemStartPos = $origComments[0]->getStartTokenPos(); - } - - if ($i === 0) { - // If we're removing from the start, keep the tokens before the node and drop those after it, - // instead of the other way around. - $result .= $this->origTokens->getTokenCode( - $pos, $itemStartPos, $indentAdjustment); - $skipRemovedNode = true; - } else { - if ($isStmtList && ($this->origTokens->haveBracesInRange($pos, $itemStartPos) || - $this->origTokens->haveTagInRange($pos, $itemStartPos))) { - // We'd remove the brace of a code block. - // TODO: Preserve formatting. - return null; - } - } - - $pos = $itemEndPos + 1; - continue; - } else { - throw new \Exception("Shouldn't happen"); - } - - if (null !== $fixup && $arrItem->getAttribute('origNode') !== $origArrItem) { - $res = $this->pFixup($fixup, $arrItem, null, $itemStartPos, $itemEndPos); - } else { - $res = $this->p($arrItem, true); - } - $this->safeAppend($result, $res); - - $this->setIndentLevel($origIndentLevel); - $pos = $itemEndPos + 1; - } - - if ($skipRemovedNode) { - // TODO: Support removing single node. - return null; - } - - if (!empty($delayedAdd)) { - if (!isset($this->emptyListInsertionMap[$mapKey])) { - return null; - } - - list($findToken, $extraLeft, $extraRight) = $this->emptyListInsertionMap[$mapKey]; - if (null !== $findToken) { - $insertPos = $this->origTokens->findRight($pos, $findToken) + 1; - $result .= $this->origTokens->getTokenCode($pos, $insertPos, $indentAdjustment); - $pos = $insertPos; - } - - $first = true; - $result .= $extraLeft; - foreach ($delayedAdd as $delayedAddNode) { - if (!$first) { - $result .= $insertStr; - if ($insertNewline) { - $result .= $this->nl; - } - } - $result .= $this->p($delayedAddNode, true); - $first = false; - } - $result .= $extraRight === "\n" ? $this->nl : $extraRight; - } - - return $result; - } - - /** - * Print node with fixups. - * - * Fixups here refer to the addition of extra parentheses, braces or other characters, that - * are required to preserve program semantics in a certain context (e.g. to maintain precedence - * or because only certain expressions are allowed in certain places). - * - * @param int $fixup Fixup type - * @param Node $subNode Subnode to print - * @param string|null $parentClass Class of parent node - * @param int $subStartPos Original start pos of subnode - * @param int $subEndPos Original end pos of subnode - * - * @return string Result of fixed-up print of subnode - */ - protected function pFixup(int $fixup, Node $subNode, $parentClass, int $subStartPos, int $subEndPos) : string { - switch ($fixup) { - case self::FIXUP_PREC_LEFT: - case self::FIXUP_PREC_RIGHT: - if (!$this->origTokens->haveParens($subStartPos, $subEndPos)) { - list($precedence, $associativity) = $this->precedenceMap[$parentClass]; - return $this->pPrec($subNode, $precedence, $associativity, - $fixup === self::FIXUP_PREC_LEFT ? -1 : 1); - } - break; - case self::FIXUP_CALL_LHS: - if ($this->callLhsRequiresParens($subNode) - && !$this->origTokens->haveParens($subStartPos, $subEndPos) - ) { - return '(' . $this->p($subNode) . ')'; - } - break; - case self::FIXUP_DEREF_LHS: - if ($this->dereferenceLhsRequiresParens($subNode) - && !$this->origTokens->haveParens($subStartPos, $subEndPos) - ) { - return '(' . $this->p($subNode) . ')'; - } - break; - case self::FIXUP_STATIC_DEREF_LHS: - if ($this->staticDereferenceLhsRequiresParens($subNode) - && !$this->origTokens->haveParens($subStartPos, $subEndPos) - ) { - return '(' . $this->p($subNode) . ')'; - } - break; - case self::FIXUP_NEW: - if ($this->newOperandRequiresParens($subNode) - && !$this->origTokens->haveParens($subStartPos, $subEndPos)) { - return '(' . $this->p($subNode) . ')'; - } - break; - case self::FIXUP_BRACED_NAME: - case self::FIXUP_VAR_BRACED_NAME: - if ($subNode instanceof Expr - && !$this->origTokens->haveBraces($subStartPos, $subEndPos) - ) { - return ($fixup === self::FIXUP_VAR_BRACED_NAME ? '$' : '') - . '{' . $this->p($subNode) . '}'; - } - break; - case self::FIXUP_ENCAPSED: - if (!$subNode instanceof Scalar\EncapsedStringPart - && !$this->origTokens->haveBraces($subStartPos, $subEndPos) - ) { - return '{' . $this->p($subNode) . '}'; - } - break; - default: - throw new \Exception('Cannot happen'); - } - - // Nothing special to do - return $this->p($subNode); - } - - /** - * Appends to a string, ensuring whitespace between label characters. - * - * Example: "echo" and "$x" result in "echo$x", but "echo" and "x" result in "echo x". - * Without safeAppend the result would be "echox", which does not preserve semantics. - * - * @param string $str - * @param string $append - */ - protected function safeAppend(string &$str, string $append) { - if ($str === "") { - $str = $append; - return; - } - - if ($append === "") { - return; - } - - if (!$this->labelCharMap[$append[0]] - || !$this->labelCharMap[$str[\strlen($str) - 1]]) { - $str .= $append; - } else { - $str .= " " . $append; - } - } - - /** - * Determines whether the LHS of a call must be wrapped in parenthesis. - * - * @param Node $node LHS of a call - * - * @return bool Whether parentheses are required - */ - protected function callLhsRequiresParens(Node $node) : bool { - return !($node instanceof Node\Name - || $node instanceof Expr\Variable - || $node instanceof Expr\ArrayDimFetch - || $node instanceof Expr\FuncCall - || $node instanceof Expr\MethodCall - || $node instanceof Expr\NullsafeMethodCall - || $node instanceof Expr\StaticCall - || $node instanceof Expr\Array_); - } - - /** - * Determines whether the LHS of an array/object operation must be wrapped in parentheses. - * - * @param Node $node LHS of dereferencing operation - * - * @return bool Whether parentheses are required - */ - protected function dereferenceLhsRequiresParens(Node $node) : bool { - // A constant can occur on the LHS of an array/object deref, but not a static deref. - return $this->staticDereferenceLhsRequiresParens($node) - && !$node instanceof Expr\ConstFetch; - } - - /** - * Determines whether the LHS of a static operation must be wrapped in parentheses. - * - * @param Node $node LHS of dereferencing operation - * - * @return bool Whether parentheses are required - */ - protected function staticDereferenceLhsRequiresParens(Node $node): bool { - return !($node instanceof Expr\Variable - || $node instanceof Node\Name - || $node instanceof Expr\ArrayDimFetch - || $node instanceof Expr\PropertyFetch - || $node instanceof Expr\NullsafePropertyFetch - || $node instanceof Expr\StaticPropertyFetch - || $node instanceof Expr\FuncCall - || $node instanceof Expr\MethodCall - || $node instanceof Expr\NullsafeMethodCall - || $node instanceof Expr\StaticCall - || $node instanceof Expr\Array_ - || $node instanceof Scalar\String_ - || $node instanceof Expr\ClassConstFetch); - } - - /** - * Determines whether an expression used in "new" or "instanceof" requires parentheses. - * - * @param Node $node New or instanceof operand - * - * @return bool Whether parentheses are required - */ - protected function newOperandRequiresParens(Node $node): bool { - if ($node instanceof Node\Name || $node instanceof Expr\Variable) { - return false; - } - if ($node instanceof Expr\ArrayDimFetch || $node instanceof Expr\PropertyFetch || - $node instanceof Expr\NullsafePropertyFetch - ) { - return $this->newOperandRequiresParens($node->var); - } - if ($node instanceof Expr\StaticPropertyFetch) { - return $this->newOperandRequiresParens($node->class); - } - return true; - } - - /** - * Print modifiers, including trailing whitespace. - * - * @param int $modifiers Modifier mask to print - * - * @return string Printed modifiers - */ - protected function pModifiers(int $modifiers) { - return ($modifiers & Stmt\Class_::MODIFIER_PUBLIC ? 'public ' : '') - . ($modifiers & Stmt\Class_::MODIFIER_PROTECTED ? 'protected ' : '') - . ($modifiers & Stmt\Class_::MODIFIER_PRIVATE ? 'private ' : '') - . ($modifiers & Stmt\Class_::MODIFIER_STATIC ? 'static ' : '') - . ($modifiers & Stmt\Class_::MODIFIER_ABSTRACT ? 'abstract ' : '') - . ($modifiers & Stmt\Class_::MODIFIER_FINAL ? 'final ' : '') - . ($modifiers & Stmt\Class_::MODIFIER_READONLY ? 'readonly ' : ''); - } - - /** - * Determine whether a list of nodes uses multiline formatting. - * - * @param (Node|null)[] $nodes Node list - * - * @return bool Whether multiline formatting is used - */ - protected function isMultiline(array $nodes) : bool { - if (\count($nodes) < 2) { - return false; - } - - $pos = -1; - foreach ($nodes as $node) { - if (null === $node) { - continue; - } - - $endPos = $node->getEndTokenPos() + 1; - if ($pos >= 0) { - $text = $this->origTokens->getTokenCode($pos, $endPos, 0); - if (false === strpos($text, "\n")) { - // We require that a newline is present between *every* item. If the formatting - // is inconsistent, with only some items having newlines, we don't consider it - // as multiline - return false; - } - } - $pos = $endPos; - } - - return true; - } - - /** - * Lazily initializes label char map. - * - * The label char map determines whether a certain character may occur in a label. - */ - protected function initializeLabelCharMap() { - if ($this->labelCharMap) return; - - $this->labelCharMap = []; - for ($i = 0; $i < 256; $i++) { - // Since PHP 7.1 The lower range is 0x80. However, we also want to support code for - // older versions. - $chr = chr($i); - $this->labelCharMap[$chr] = $i >= 0x7f || ctype_alnum($chr); - } - } - - /** - * Lazily initializes node list differ. - * - * The node list differ is used to determine differences between two array subnodes. - */ - protected function initializeNodeListDiffer() { - if ($this->nodeListDiffer) return; - - $this->nodeListDiffer = new Internal\Differ(function ($a, $b) { - if ($a instanceof Node && $b instanceof Node) { - return $a === $b->getAttribute('origNode'); - } - // Can happen for array destructuring - return $a === null && $b === null; - }); - } - - /** - * Lazily initializes fixup map. - * - * The fixup map is used to determine whether a certain subnode of a certain node may require - * some kind of "fixup" operation, e.g. the addition of parenthesis or braces. - */ - protected function initializeFixupMap() { - if ($this->fixupMap) return; - - $this->fixupMap = [ - Expr\PreInc::class => ['var' => self::FIXUP_PREC_RIGHT], - Expr\PreDec::class => ['var' => self::FIXUP_PREC_RIGHT], - Expr\PostInc::class => ['var' => self::FIXUP_PREC_LEFT], - Expr\PostDec::class => ['var' => self::FIXUP_PREC_LEFT], - Expr\Instanceof_::class => [ - 'expr' => self::FIXUP_PREC_LEFT, - 'class' => self::FIXUP_NEW, - ], - Expr\Ternary::class => [ - 'cond' => self::FIXUP_PREC_LEFT, - 'else' => self::FIXUP_PREC_RIGHT, - ], - - Expr\FuncCall::class => ['name' => self::FIXUP_CALL_LHS], - Expr\StaticCall::class => ['class' => self::FIXUP_STATIC_DEREF_LHS], - Expr\ArrayDimFetch::class => ['var' => self::FIXUP_DEREF_LHS], - Expr\ClassConstFetch::class => [ - 'class' => self::FIXUP_STATIC_DEREF_LHS, - 'name' => self::FIXUP_BRACED_NAME, - ], - Expr\New_::class => ['class' => self::FIXUP_NEW], - Expr\MethodCall::class => [ - 'var' => self::FIXUP_DEREF_LHS, - 'name' => self::FIXUP_BRACED_NAME, - ], - Expr\NullsafeMethodCall::class => [ - 'var' => self::FIXUP_DEREF_LHS, - 'name' => self::FIXUP_BRACED_NAME, - ], - Expr\StaticPropertyFetch::class => [ - 'class' => self::FIXUP_STATIC_DEREF_LHS, - 'name' => self::FIXUP_VAR_BRACED_NAME, - ], - Expr\PropertyFetch::class => [ - 'var' => self::FIXUP_DEREF_LHS, - 'name' => self::FIXUP_BRACED_NAME, - ], - Expr\NullsafePropertyFetch::class => [ - 'var' => self::FIXUP_DEREF_LHS, - 'name' => self::FIXUP_BRACED_NAME, - ], - Scalar\Encapsed::class => [ - 'parts' => self::FIXUP_ENCAPSED, - ], - ]; - - $binaryOps = [ - BinaryOp\Pow::class, BinaryOp\Mul::class, BinaryOp\Div::class, BinaryOp\Mod::class, - BinaryOp\Plus::class, BinaryOp\Minus::class, BinaryOp\Concat::class, - BinaryOp\ShiftLeft::class, BinaryOp\ShiftRight::class, BinaryOp\Smaller::class, - BinaryOp\SmallerOrEqual::class, BinaryOp\Greater::class, BinaryOp\GreaterOrEqual::class, - BinaryOp\Equal::class, BinaryOp\NotEqual::class, BinaryOp\Identical::class, - BinaryOp\NotIdentical::class, BinaryOp\Spaceship::class, BinaryOp\BitwiseAnd::class, - BinaryOp\BitwiseXor::class, BinaryOp\BitwiseOr::class, BinaryOp\BooleanAnd::class, - BinaryOp\BooleanOr::class, BinaryOp\Coalesce::class, BinaryOp\LogicalAnd::class, - BinaryOp\LogicalXor::class, BinaryOp\LogicalOr::class, - ]; - foreach ($binaryOps as $binaryOp) { - $this->fixupMap[$binaryOp] = [ - 'left' => self::FIXUP_PREC_LEFT, - 'right' => self::FIXUP_PREC_RIGHT - ]; - } - - $assignOps = [ - Expr\Assign::class, Expr\AssignRef::class, AssignOp\Plus::class, AssignOp\Minus::class, - AssignOp\Mul::class, AssignOp\Div::class, AssignOp\Concat::class, AssignOp\Mod::class, - AssignOp\BitwiseAnd::class, AssignOp\BitwiseOr::class, AssignOp\BitwiseXor::class, - AssignOp\ShiftLeft::class, AssignOp\ShiftRight::class, AssignOp\Pow::class, AssignOp\Coalesce::class - ]; - foreach ($assignOps as $assignOp) { - $this->fixupMap[$assignOp] = [ - 'var' => self::FIXUP_PREC_LEFT, - 'expr' => self::FIXUP_PREC_RIGHT, - ]; - } - - $prefixOps = [ - Expr\BitwiseNot::class, Expr\BooleanNot::class, Expr\UnaryPlus::class, Expr\UnaryMinus::class, - Cast\Int_::class, Cast\Double::class, Cast\String_::class, Cast\Array_::class, - Cast\Object_::class, Cast\Bool_::class, Cast\Unset_::class, Expr\ErrorSuppress::class, - Expr\YieldFrom::class, Expr\Print_::class, Expr\Include_::class, - ]; - foreach ($prefixOps as $prefixOp) { - $this->fixupMap[$prefixOp] = ['expr' => self::FIXUP_PREC_RIGHT]; - } - } - - /** - * Lazily initializes the removal map. - * - * The removal map is used to determine which additional tokens should be removed when a - * certain node is replaced by null. - */ - protected function initializeRemovalMap() { - if ($this->removalMap) return; - - $stripBoth = ['left' => \T_WHITESPACE, 'right' => \T_WHITESPACE]; - $stripLeft = ['left' => \T_WHITESPACE]; - $stripRight = ['right' => \T_WHITESPACE]; - $stripDoubleArrow = ['right' => \T_DOUBLE_ARROW]; - $stripColon = ['left' => ':']; - $stripEquals = ['left' => '=']; - $this->removalMap = [ - 'Expr_ArrayDimFetch->dim' => $stripBoth, - 'Expr_ArrayItem->key' => $stripDoubleArrow, - 'Expr_ArrowFunction->returnType' => $stripColon, - 'Expr_Closure->returnType' => $stripColon, - 'Expr_Exit->expr' => $stripBoth, - 'Expr_Ternary->if' => $stripBoth, - 'Expr_Yield->key' => $stripDoubleArrow, - 'Expr_Yield->value' => $stripBoth, - 'Param->type' => $stripRight, - 'Param->default' => $stripEquals, - 'Stmt_Break->num' => $stripBoth, - 'Stmt_Catch->var' => $stripLeft, - 'Stmt_ClassConst->type' => $stripRight, - 'Stmt_ClassMethod->returnType' => $stripColon, - 'Stmt_Class->extends' => ['left' => \T_EXTENDS], - 'Stmt_Enum->scalarType' => $stripColon, - 'Stmt_EnumCase->expr' => $stripEquals, - 'Expr_PrintableNewAnonClass->extends' => ['left' => \T_EXTENDS], - 'Stmt_Continue->num' => $stripBoth, - 'Stmt_Foreach->keyVar' => $stripDoubleArrow, - 'Stmt_Function->returnType' => $stripColon, - 'Stmt_If->else' => $stripLeft, - 'Stmt_Namespace->name' => $stripLeft, - 'Stmt_Property->type' => $stripRight, - 'Stmt_PropertyProperty->default' => $stripEquals, - 'Stmt_Return->expr' => $stripBoth, - 'Stmt_StaticVar->default' => $stripEquals, - 'Stmt_TraitUseAdaptation_Alias->newName' => $stripLeft, - 'Stmt_TryCatch->finally' => $stripLeft, - // 'Stmt_Case->cond': Replace with "default" - // 'Stmt_Class->name': Unclear what to do - // 'Stmt_Declare->stmts': Not a plain node - // 'Stmt_TraitUseAdaptation_Alias->newModifier': Not a plain node - ]; - } - - protected function initializeInsertionMap() { - if ($this->insertionMap) return; - - // TODO: "yield" where both key and value are inserted doesn't work - // [$find, $beforeToken, $extraLeft, $extraRight] - $this->insertionMap = [ - 'Expr_ArrayDimFetch->dim' => ['[', false, null, null], - 'Expr_ArrayItem->key' => [null, false, null, ' => '], - 'Expr_ArrowFunction->returnType' => [')', false, ' : ', null], - 'Expr_Closure->returnType' => [')', false, ' : ', null], - 'Expr_Ternary->if' => ['?', false, ' ', ' '], - 'Expr_Yield->key' => [\T_YIELD, false, null, ' => '], - 'Expr_Yield->value' => [\T_YIELD, false, ' ', null], - 'Param->type' => [null, false, null, ' '], - 'Param->default' => [null, false, ' = ', null], - 'Stmt_Break->num' => [\T_BREAK, false, ' ', null], - 'Stmt_Catch->var' => [null, false, ' ', null], - 'Stmt_ClassMethod->returnType' => [')', false, ' : ', null], - 'Stmt_ClassConst->type' => [\T_CONST, false, ' ', null], - 'Stmt_Class->extends' => [null, false, ' extends ', null], - 'Stmt_Enum->scalarType' => [null, false, ' : ', null], - 'Stmt_EnumCase->expr' => [null, false, ' = ', null], - 'Expr_PrintableNewAnonClass->extends' => [null, ' extends ', null], - 'Stmt_Continue->num' => [\T_CONTINUE, false, ' ', null], - 'Stmt_Foreach->keyVar' => [\T_AS, false, null, ' => '], - 'Stmt_Function->returnType' => [')', false, ' : ', null], - 'Stmt_If->else' => [null, false, ' ', null], - 'Stmt_Namespace->name' => [\T_NAMESPACE, false, ' ', null], - 'Stmt_Property->type' => [\T_VARIABLE, true, null, ' '], - 'Stmt_PropertyProperty->default' => [null, false, ' = ', null], - 'Stmt_Return->expr' => [\T_RETURN, false, ' ', null], - 'Stmt_StaticVar->default' => [null, false, ' = ', null], - //'Stmt_TraitUseAdaptation_Alias->newName' => [T_AS, false, ' ', null], // TODO - 'Stmt_TryCatch->finally' => [null, false, ' ', null], - - // 'Expr_Exit->expr': Complicated due to optional () - // 'Stmt_Case->cond': Conversion from default to case - // 'Stmt_Class->name': Unclear - // 'Stmt_Declare->stmts': Not a proper node - // 'Stmt_TraitUseAdaptation_Alias->newModifier': Not a proper node - ]; - } - - protected function initializeListInsertionMap() { - if ($this->listInsertionMap) return; - - $this->listInsertionMap = [ - // special - //'Expr_ShellExec->parts' => '', // TODO These need to be treated more carefully - //'Scalar_Encapsed->parts' => '', - 'Stmt_Catch->types' => '|', - 'UnionType->types' => '|', - 'IntersectionType->types' => '&', - 'Stmt_If->elseifs' => ' ', - 'Stmt_TryCatch->catches' => ' ', - - // comma-separated lists - 'Expr_Array->items' => ', ', - 'Expr_ArrowFunction->params' => ', ', - 'Expr_Closure->params' => ', ', - 'Expr_Closure->uses' => ', ', - 'Expr_FuncCall->args' => ', ', - 'Expr_Isset->vars' => ', ', - 'Expr_List->items' => ', ', - 'Expr_MethodCall->args' => ', ', - 'Expr_NullsafeMethodCall->args' => ', ', - 'Expr_New->args' => ', ', - 'Expr_PrintableNewAnonClass->args' => ', ', - 'Expr_StaticCall->args' => ', ', - 'Stmt_ClassConst->consts' => ', ', - 'Stmt_ClassMethod->params' => ', ', - 'Stmt_Class->implements' => ', ', - 'Stmt_Enum->implements' => ', ', - 'Expr_PrintableNewAnonClass->implements' => ', ', - 'Stmt_Const->consts' => ', ', - 'Stmt_Declare->declares' => ', ', - 'Stmt_Echo->exprs' => ', ', - 'Stmt_For->init' => ', ', - 'Stmt_For->cond' => ', ', - 'Stmt_For->loop' => ', ', - 'Stmt_Function->params' => ', ', - 'Stmt_Global->vars' => ', ', - 'Stmt_GroupUse->uses' => ', ', - 'Stmt_Interface->extends' => ', ', - 'Stmt_Match->arms' => ', ', - 'Stmt_Property->props' => ', ', - 'Stmt_StaticVar->vars' => ', ', - 'Stmt_TraitUse->traits' => ', ', - 'Stmt_TraitUseAdaptation_Precedence->insteadof' => ', ', - 'Stmt_Unset->vars' => ', ', - 'Stmt_Use->uses' => ', ', - 'MatchArm->conds' => ', ', - 'AttributeGroup->attrs' => ', ', - - // statement lists - 'Expr_Closure->stmts' => "\n", - 'Stmt_Case->stmts' => "\n", - 'Stmt_Catch->stmts' => "\n", - 'Stmt_Class->stmts' => "\n", - 'Stmt_Enum->stmts' => "\n", - 'Expr_PrintableNewAnonClass->stmts' => "\n", - 'Stmt_Interface->stmts' => "\n", - 'Stmt_Trait->stmts' => "\n", - 'Stmt_ClassMethod->stmts' => "\n", - 'Stmt_Declare->stmts' => "\n", - 'Stmt_Do->stmts' => "\n", - 'Stmt_ElseIf->stmts' => "\n", - 'Stmt_Else->stmts' => "\n", - 'Stmt_Finally->stmts' => "\n", - 'Stmt_Foreach->stmts' => "\n", - 'Stmt_For->stmts' => "\n", - 'Stmt_Function->stmts' => "\n", - 'Stmt_If->stmts' => "\n", - 'Stmt_Namespace->stmts' => "\n", - 'Stmt_Class->attrGroups' => "\n", - 'Stmt_Enum->attrGroups' => "\n", - 'Stmt_EnumCase->attrGroups' => "\n", - 'Stmt_Interface->attrGroups' => "\n", - 'Stmt_Trait->attrGroups' => "\n", - 'Stmt_Function->attrGroups' => "\n", - 'Stmt_ClassMethod->attrGroups' => "\n", - 'Stmt_ClassConst->attrGroups' => "\n", - 'Stmt_Property->attrGroups' => "\n", - 'Expr_PrintableNewAnonClass->attrGroups' => ' ', - 'Expr_Closure->attrGroups' => ' ', - 'Expr_ArrowFunction->attrGroups' => ' ', - 'Param->attrGroups' => ' ', - 'Stmt_Switch->cases' => "\n", - 'Stmt_TraitUse->adaptations' => "\n", - 'Stmt_TryCatch->stmts' => "\n", - 'Stmt_While->stmts' => "\n", - - // dummy for top-level context - 'File->stmts' => "\n", - ]; - } - - protected function initializeEmptyListInsertionMap() { - if ($this->emptyListInsertionMap) return; - - // TODO Insertion into empty statement lists. - - // [$find, $extraLeft, $extraRight] - $this->emptyListInsertionMap = [ - 'Expr_ArrowFunction->params' => ['(', '', ''], - 'Expr_Closure->uses' => [')', ' use(', ')'], - 'Expr_Closure->params' => ['(', '', ''], - 'Expr_FuncCall->args' => ['(', '', ''], - 'Expr_MethodCall->args' => ['(', '', ''], - 'Expr_NullsafeMethodCall->args' => ['(', '', ''], - 'Expr_New->args' => ['(', '', ''], - 'Expr_PrintableNewAnonClass->args' => ['(', '', ''], - 'Expr_PrintableNewAnonClass->implements' => [null, ' implements ', ''], - 'Expr_StaticCall->args' => ['(', '', ''], - 'Stmt_Class->implements' => [null, ' implements ', ''], - 'Stmt_Enum->implements' => [null, ' implements ', ''], - 'Stmt_ClassMethod->params' => ['(', '', ''], - 'Stmt_Interface->extends' => [null, ' extends ', ''], - 'Stmt_Function->params' => ['(', '', ''], - 'Stmt_Interface->attrGroups' => [null, '', "\n"], - 'Stmt_Class->attrGroups' => [null, '', "\n"], - 'Stmt_ClassConst->attrGroups' => [null, '', "\n"], - 'Stmt_ClassMethod->attrGroups' => [null, '', "\n"], - 'Stmt_Function->attrGroups' => [null, '', "\n"], - 'Stmt_Property->attrGroups' => [null, '', "\n"], - 'Stmt_Trait->attrGroups' => [null, '', "\n"], - 'Expr_ArrowFunction->attrGroups' => [null, '', ' '], - 'Expr_Closure->attrGroups' => [null, '', ' '], - 'Expr_PrintableNewAnonClass->attrGroups' => [\T_NEW, ' ', ''], - - /* These cannot be empty to start with: - * Expr_Isset->vars - * Stmt_Catch->types - * Stmt_Const->consts - * Stmt_ClassConst->consts - * Stmt_Declare->declares - * Stmt_Echo->exprs - * Stmt_Global->vars - * Stmt_GroupUse->uses - * Stmt_Property->props - * Stmt_StaticVar->vars - * Stmt_TraitUse->traits - * Stmt_TraitUseAdaptation_Precedence->insteadof - * Stmt_Unset->vars - * Stmt_Use->uses - * UnionType->types - */ - - /* TODO - * Stmt_If->elseifs - * Stmt_TryCatch->catches - * Expr_Array->items - * Expr_List->items - * Stmt_For->init - * Stmt_For->cond - * Stmt_For->loop - */ - ]; - } - - protected function initializeModifierChangeMap() { - if ($this->modifierChangeMap) return; - - $this->modifierChangeMap = [ - 'Stmt_ClassConst->flags' => \T_CONST, - 'Stmt_ClassMethod->flags' => \T_FUNCTION, - 'Stmt_Class->flags' => \T_CLASS, - 'Stmt_Property->flags' => \T_VARIABLE, - 'Expr_PrintableNewAnonClass->flags' => \T_CLASS, - 'Param->flags' => \T_VARIABLE, - //'Stmt_TraitUseAdaptation_Alias->newModifier' => 0, // TODO - ]; - - // List of integer subnodes that are not modifiers: - // Expr_Include->type - // Stmt_GroupUse->type - // Stmt_Use->type - // Stmt_UseUse->type - } -} diff --git a/vendor/phar-io/manifest/.github/FUNDING.yml b/vendor/phar-io/manifest/.github/FUNDING.yml deleted file mode 100644 index 70388ed..0000000 --- a/vendor/phar-io/manifest/.github/FUNDING.yml +++ /dev/null @@ -1,3 +0,0 @@ -# These are supported funding model platforms - -github: [theseer] diff --git a/vendor/phar-io/manifest/.github/workflows/ci.yml b/vendor/phar-io/manifest/.github/workflows/ci.yml deleted file mode 100644 index c9e7feb..0000000 --- a/vendor/phar-io/manifest/.github/workflows/ci.yml +++ /dev/null @@ -1,86 +0,0 @@ -name: "CI" - -on: - push: - branches: - - "master" - pull_request: null - -jobs: - qa: - name: "QA" - - runs-on: "ubuntu-latest" - - steps: - - name: "Checkout" - uses: "actions/checkout@v3.5.2" - - - name: "Set up PHP" - uses: "shivammathur/setup-php@2.25.1" - with: - coverage: "none" - php-version: "8.0" - tools: "phive" - - - name: "Install dependencies with composer" - run: "composer install --no-interaction --optimize-autoloader --prefer-dist" - - - name: "Install dependencies with phive" - env: - GITHUB_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: "ant install-tools" - - - name: "Run php-cs-fixer" - run: "ant php-cs-fixer" - - - name: "Run psalm" - run: "ant psalm" - - tests: - name: "Tests" - - runs-on: "ubuntu-latest" - - strategy: - fail-fast: false - - matrix: - php-versions: - - "7.2" - - "7.3" - - "7.4" - - "8.0" - - "8.1" - - "8.2" - - steps: - - name: "Checkout" - uses: "actions/checkout@v3.5.2" - - - name: "Set up PHP" - uses: "shivammathur/setup-php@2.25.1" - env: - COMPOSER_TOKEN: "${{ secrets.GITHUB_TOKEN }}" - with: - coverage: "pcov" - extensions: "${{ env.extensions }}" - ini-values: "display_errors=On, error_reporting=-1, memory_limit=2G" - php-version: "${{ matrix.php-versions }}" - tools: "phive" - - - name: "Install dependencies with composer" - run: "composer install --no-interaction --optimize-autoloader --prefer-dist" - - - name: "Install dependencies with phive" - env: - GITHUB_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: "ant install-tools" - - - name: "Run PHPUnit" - run: "tools/phpunit --coverage-clover build/logs/clover.xml" - - - name: "Send code coverage report to codecov.io" - uses: "codecov/codecov-action@v3.1.4" - with: - files: "build/logs/clover.xml" diff --git a/vendor/phar-io/manifest/.php-cs-fixer.dist.php b/vendor/phar-io/manifest/.php-cs-fixer.dist.php deleted file mode 100644 index ca96514..0000000 --- a/vendor/phar-io/manifest/.php-cs-fixer.dist.php +++ /dev/null @@ -1,223 +0,0 @@ -<?php - -require __DIR__ . '/tools/php-cs-fixer.d/PhpdocSingleLineVarFixer.php'; - -$header = file_get_contents(__DIR__ . '/tools/php-cs-fixer.d/header.txt'); - -return (new PhpCsFixer\Config()) - ->registerCustomFixers([ - new \PharIo\CSFixer\PhpdocSingleLineVarFixer() - ]) - ->setRiskyAllowed(true) - ->setRules( - [ - 'PharIo/phpdoc_single_line_var_fixer' => true, - - 'align_multiline_comment' => true, - 'array_indentation' => true, - 'array_syntax' => ['syntax' => 'short'], - 'binary_operator_spaces' => [ - 'operators' => [ - '=' => 'align', - '=>' => 'align', - ], - ], - 'blank_line_after_namespace' => true, - 'blank_line_after_opening_tag' => false, - 'blank_line_before_statement' => [ - 'statements' => [ - 'break', - 'continue', - 'declare', - 'do', - 'for', - 'foreach', - 'if', - 'include', - 'include_once', - 'require', - 'require_once', - 'return', - 'switch', - 'throw', - 'try', - 'while', - 'yield', - ], - ], - 'braces' => [ - 'allow_single_line_closure' => false, - 'position_after_anonymous_constructs' => 'same', - 'position_after_control_structures' => 'same', - 'position_after_functions_and_oop_constructs' => 'same' - ], - 'cast_spaces' => ['space' => 'none'], - - // This fixer removes the blank line at class start, no way to disable that, so we disable the fixer :( - //'class_attributes_separation' => ['elements' => ['const', 'method', 'property']], - - 'combine_consecutive_issets' => true, - 'combine_consecutive_unsets' => true, - 'compact_nullable_typehint' => true, - 'concat_space' => ['spacing' => 'one'], - 'date_time_immutable' => true, - 'declare_equal_normalize' => ['space' => 'single'], - 'declare_strict_types' => true, - 'dir_constant' => true, - 'elseif' => true, - 'encoding' => true, - 'full_opening_tag' => true, - 'fully_qualified_strict_types' => true, - 'function_declaration' => [ - 'closure_function_spacing' => 'one' - ], - 'global_namespace_import' => [ - 'import_classes' => true, - 'import_constants' => true, - 'import_functions' => true, - ], - 'header_comment' => ['header' => $header, 'separate' => 'none'], - 'indentation_type' => true, - 'is_null' => true, - 'line_ending' => true, - 'list_syntax' => ['syntax' => 'short'], - 'logical_operators' => true, - 'lowercase_cast' => true, - 'constant_case' => ['case' => 'lower'], - 'lowercase_keywords' => true, - 'lowercase_static_reference' => true, - 'magic_constant_casing' => true, - 'method_argument_space' => ['on_multiline' => 'ensure_fully_multiline'], - 'modernize_types_casting' => true, - 'multiline_comment_opening_closing' => true, - 'multiline_whitespace_before_semicolons' => true, - 'new_with_braces' => false, - 'no_alias_functions' => true, - 'no_alternative_syntax' => true, - 'no_blank_lines_after_class_opening' => false, - 'no_blank_lines_after_phpdoc' => true, - 'no_blank_lines_before_namespace' => true, - 'no_closing_tag' => true, - 'no_empty_comment' => true, - 'no_empty_phpdoc' => true, - 'no_empty_statement' => true, - 'no_extra_blank_lines' => true, - 'no_homoglyph_names' => true, - 'no_leading_import_slash' => true, - 'no_leading_namespace_whitespace' => true, - 'no_mixed_echo_print' => ['use' => 'print'], - 'no_multiline_whitespace_around_double_arrow' => true, - 'no_null_property_initialization' => true, - 'no_php4_constructor' => true, - 'no_short_bool_cast' => true, - 'echo_tag_syntax' => ['format' => 'long'], - 'no_singleline_whitespace_before_semicolons' => true, - 'no_spaces_after_function_name' => true, - 'no_spaces_inside_parenthesis' => true, - 'no_superfluous_elseif' => true, - 'no_superfluous_phpdoc_tags' => true, - 'no_trailing_comma_in_list_call' => true, - 'no_trailing_comma_in_singleline_array' => true, - 'no_trailing_whitespace' => true, - 'no_trailing_whitespace_in_comment' => true, - 'no_unneeded_control_parentheses' => false, - 'no_unneeded_curly_braces' => false, - 'no_unneeded_final_method' => true, - 'no_unreachable_default_argument_value' => true, - 'no_unset_on_property' => true, - 'no_unused_imports' => true, - 'no_useless_else' => true, - 'no_useless_return' => true, - 'no_whitespace_before_comma_in_array' => true, - 'no_whitespace_in_blank_line' => true, - 'non_printable_character' => true, - 'normalize_index_brace' => true, - 'object_operator_without_whitespace' => true, - 'ordered_class_elements' => [ - 'order' => [ - 'use_trait', - 'constant_public', - 'constant_protected', - 'constant_private', - 'property_public_static', - 'property_protected_static', - 'property_private_static', - 'property_public', - 'property_protected', - 'property_private', - 'method_public_static', - 'construct', - 'destruct', - 'magic', - 'phpunit', - 'method_public', - 'method_protected', - 'method_private', - 'method_protected_static', - 'method_private_static', - ], - ], - 'ordered_imports' => [ - 'imports_order' => [ - PhpCsFixer\Fixer\Import\OrderedImportsFixer::IMPORT_TYPE_CLASS, - PhpCsFixer\Fixer\Import\OrderedImportsFixer::IMPORT_TYPE_CONST, - PhpCsFixer\Fixer\Import\OrderedImportsFixer::IMPORT_TYPE_FUNCTION, - ] - ], - 'phpdoc_add_missing_param_annotation' => true, - 'phpdoc_align' => true, - 'phpdoc_annotation_without_dot' => true, - 'phpdoc_indent' => true, - 'phpdoc_no_access' => true, - 'phpdoc_no_empty_return' => true, - 'phpdoc_no_package' => true, - 'phpdoc_order' => true, - 'phpdoc_return_self_reference' => true, - 'phpdoc_scalar' => true, - 'phpdoc_separation' => true, - 'phpdoc_single_line_var_spacing' => true, - 'phpdoc_to_comment' => true, - 'phpdoc_trim' => true, - 'phpdoc_trim_consecutive_blank_line_separation' => true, - 'phpdoc_types' => ['groups' => ['simple', 'meta']], - 'phpdoc_types_order' => true, - 'phpdoc_to_return_type' => true, - 'phpdoc_var_without_name' => true, - 'pow_to_exponentiation' => true, - 'protected_to_private' => true, - 'return_assignment' => true, - 'return_type_declaration' => ['space_before' => 'none'], - 'self_accessor' => false, - 'semicolon_after_instruction' => true, - 'set_type_to_cast' => true, - 'short_scalar_cast' => true, - 'simplified_null_return' => true, - 'single_blank_line_at_eof' => true, - 'single_import_per_statement' => true, - 'single_line_after_imports' => true, - 'single_quote' => true, - 'standardize_not_equals' => true, - 'ternary_to_null_coalescing' => true, - 'trailing_comma_in_multiline' => false, - 'trim_array_spaces' => true, - 'unary_operator_spaces' => true, - 'visibility_required' => [ - 'elements' => [ - 'const', - 'method', - 'property', - ], - ], - 'void_return' => true, - 'whitespace_after_comma_in_array' => true, - 'yoda_style' => false - ] - ) - ->setFinder( - PhpCsFixer\Finder::create() - ->files() - ->in(__DIR__ . '/build') - ->in(__DIR__ . '/src') - ->in(__DIR__ . '/tests') - ->notName('autoload.php') - ); diff --git a/vendor/phar-io/manifest/CHANGELOG.md b/vendor/phar-io/manifest/CHANGELOG.md deleted file mode 100644 index f363b16..0000000 --- a/vendor/phar-io/manifest/CHANGELOG.md +++ /dev/null @@ -1,45 +0,0 @@ -# Changelog - -All notable changes to phar-io/manifest are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. - -## [2.0.4] - 03-03-2024 - -### Changed - -- Make `EMail` an optional attribute for author -- Stick with PHP 7.2 compatibilty -- Do not use implict nullable type (thanks @sebastianbergmann), this should make things work on PHP 8.4 - -## [2.0.3] - 20.07.2021 - -- Fixed PHP 7.2 / PHP 7.3 incompatibility introduced in previous release - -## [2.0.2] - 20.07.2021 - -- Fixed PHP 8.1 deprecation notice - -## [2.0.1] - 27.06.2020 - -This release now supports the use of PHP 7.2+ and ^8.0 - -## [2.0.0] - 10.05.2020 - -This release now requires PHP 7.2+ - -### Changed - -- Upgraded to phar-io/version 3.0 - - Version strings `v1.2.3` will now be converted to valid semantic version strings `1.2.3` - - Abreviated strings like `1.0` will get expaneded to `1.0.0` - -### Unreleased - -[Unreleased]: https://github.com/phar-io/manifest/compare/2.1.0...HEAD -[2.1.0]: https://github.com/phar-io/manifest/compare/2.0.3...2.1.0 -[2.0.3]: https://github.com/phar-io/manifest/compare/2.0.2...2.0.3 -[2.0.2]: https://github.com/phar-io/manifest/compare/2.0.1...2.0.2 -[2.0.1]: https://github.com/phar-io/manifest/compare/2.0.0...2.0.1 -[2.0.0]: https://github.com/phar-io/manifest/compare/1.0.1...2.0.0 -[1.0.3]: https://github.com/phar-io/manifest/compare/1.0.2...1.0.3 -[1.0.2]: https://github.com/phar-io/manifest/compare/1.0.1...1.0.2 -[1.0.1]: https://github.com/phar-io/manifest/compare/1.0.0...1.0.1 diff --git a/vendor/phar-io/manifest/LICENSE b/vendor/phar-io/manifest/LICENSE deleted file mode 100644 index 64690cf..0000000 --- a/vendor/phar-io/manifest/LICENSE +++ /dev/null @@ -1,31 +0,0 @@ -Phar.io - Manifest - -Copyright (c) 2016-2019 Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de>, and contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of Arne Blankerts nor the names of contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT * NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, -OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - diff --git a/vendor/phar-io/manifest/README.md b/vendor/phar-io/manifest/README.md deleted file mode 100644 index fae2c9a..0000000 --- a/vendor/phar-io/manifest/README.md +++ /dev/null @@ -1,178 +0,0 @@ -# Manifest - -Component for reading [phar.io](https://phar.io/) manifest information from a [PHP Archive (PHAR)](http://php.net/phar). - -## Installation - -You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - - composer require phar-io/manifest - -If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - - composer require --dev phar-io/manifest - -## Usage Examples - -### Read from `manifest.xml` -```php -use PharIo\Manifest\ManifestLoader; -use PharIo\Manifest\ManifestSerializer; - -$manifest = ManifestLoader::fromFile('manifest.xml'); - -var_dump($manifest); - -echo (new ManifestSerializer)->serializeToString($manifest); -``` - -<details> - <summary>Output</summary> - -```shell -object(PharIo\Manifest\Manifest)#14 (6) { - ["name":"PharIo\Manifest\Manifest":private]=> - object(PharIo\Manifest\ApplicationName)#10 (1) { - ["name":"PharIo\Manifest\ApplicationName":private]=> - string(12) "some/library" - } - ["version":"PharIo\Manifest\Manifest":private]=> - object(PharIo\Version\Version)#12 (5) { - ["originalVersionString":"PharIo\Version\Version":private]=> - string(5) "1.0.0" - ["major":"PharIo\Version\Version":private]=> - object(PharIo\Version\VersionNumber)#13 (1) { - ["value":"PharIo\Version\VersionNumber":private]=> - int(1) - } - ["minor":"PharIo\Version\Version":private]=> - object(PharIo\Version\VersionNumber)#23 (1) { - ["value":"PharIo\Version\VersionNumber":private]=> - int(0) - } - ["patch":"PharIo\Version\Version":private]=> - object(PharIo\Version\VersionNumber)#22 (1) { - ["value":"PharIo\Version\VersionNumber":private]=> - int(0) - } - ["preReleaseSuffix":"PharIo\Version\Version":private]=> - NULL - } - ["type":"PharIo\Manifest\Manifest":private]=> - object(PharIo\Manifest\Library)#6 (0) { - } - ["copyrightInformation":"PharIo\Manifest\Manifest":private]=> - object(PharIo\Manifest\CopyrightInformation)#19 (2) { - ["authors":"PharIo\Manifest\CopyrightInformation":private]=> - object(PharIo\Manifest\AuthorCollection)#9 (1) { - ["authors":"PharIo\Manifest\AuthorCollection":private]=> - array(1) { - [0]=> - object(PharIo\Manifest\Author)#15 (2) { - ["name":"PharIo\Manifest\Author":private]=> - string(13) "Reiner Zufall" - ["email":"PharIo\Manifest\Author":private]=> - object(PharIo\Manifest\Email)#16 (1) { - ["email":"PharIo\Manifest\Email":private]=> - string(16) "reiner@zufall.de" - } - } - } - } - ["license":"PharIo\Manifest\CopyrightInformation":private]=> - object(PharIo\Manifest\License)#11 (2) { - ["name":"PharIo\Manifest\License":private]=> - string(12) "BSD-3-Clause" - ["url":"PharIo\Manifest\License":private]=> - object(PharIo\Manifest\Url)#18 (1) { - ["url":"PharIo\Manifest\Url":private]=> - string(26) "https://domain.tld/LICENSE" - } - } - } - ["requirements":"PharIo\Manifest\Manifest":private]=> - object(PharIo\Manifest\RequirementCollection)#17 (1) { - ["requirements":"PharIo\Manifest\RequirementCollection":private]=> - array(1) { - [0]=> - object(PharIo\Manifest\PhpVersionRequirement)#20 (1) { - ["versionConstraint":"PharIo\Manifest\PhpVersionRequirement":private]=> - object(PharIo\Version\SpecificMajorAndMinorVersionConstraint)#24 (3) { - ["originalValue":"PharIo\Version\AbstractVersionConstraint":private]=> - string(3) "7.0" - ["major":"PharIo\Version\SpecificMajorAndMinorVersionConstraint":private]=> - int(7) - ["minor":"PharIo\Version\SpecificMajorAndMinorVersionConstraint":private]=> - int(0) - } - } - } - } - ["bundledComponents":"PharIo\Manifest\Manifest":private]=> - object(PharIo\Manifest\BundledComponentCollection)#8 (1) { - ["bundledComponents":"PharIo\Manifest\BundledComponentCollection":private]=> - array(0) { - } - } -} -<?xml version="1.0" encoding="UTF-8"?> -<phar xmlns="https://phar.io/xml/manifest/1.0"> - <contains name="some/library" version="1.0.0" type="library"/> - <copyright> - <author name="Reiner Zufall" email="reiner@zufall.de"/> - <license type="BSD-3-Clause" url="https://domain.tld/LICENSE"/> - </copyright> - <requires> - <php version="7.0"/> - </requires> -</phar> -``` -</details> - -### Create via API -```php -$bundled = new \PharIo\Manifest\BundledComponentCollection(); -$bundled->add( - new \PharIo\Manifest\BundledComponent('vendor/packageA', new \PharIo\Version\Version('1.2.3-dev') - ) -); - -$manifest = new PharIo\Manifest\Manifest( - new \PharIo\Manifest\ApplicationName('vendor/package'), - new \PharIo\Version\Version('1.0.0'), - new \PharIo\Manifest\Library(), - new \PharIo\Manifest\CopyrightInformation( - new \PharIo\Manifest\AuthorCollection(), - new \PharIo\Manifest\License( - 'BSD-3-Clause', - new \PharIo\Manifest\Url('https://spdx.org/licenses/BSD-3-Clause.html') - ) - ), - new \PharIo\Manifest\RequirementCollection(), - $bundled -); - -echo (new ManifestSerializer)->serializeToString($manifest); -``` - -<details> - <summary>Output</summary> - -```xml -<?xml version="1.0" encoding="UTF-8"?> -<phar xmlns="https://phar.io/xml/manifest/1.0"> - <contains name="vendor/package" version="1.0.0" type="library"/> - <copyright> - <license type="BSD-3-Clause" url="https://spdx.org/licenses/BSD-3-Clause.html"/> - </copyright> - <requires> - <php version="*"/> - </requires> - <bundles> - <component name="vendor/packageA" version="1.2.3-dev"/> - </bundles> -</phar> -``` - -</details> - diff --git a/vendor/phar-io/manifest/composer.json b/vendor/phar-io/manifest/composer.json deleted file mode 100644 index dc5fa45..0000000 --- a/vendor/phar-io/manifest/composer.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "phar-io/manifest", - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "support": { - "issues": "https://github.com/phar-io/manifest/issues" - }, - "require": { - "php": "^7.2 || ^8.0", - "ext-dom": "*", - "ext-phar": "*", - "ext-libxml": "*", - "ext-xmlwriter": "*", - "phar-io/version": "^3.0.1" - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - } -} diff --git a/vendor/phar-io/manifest/composer.lock b/vendor/phar-io/manifest/composer.lock deleted file mode 100644 index fe18e08..0000000 --- a/vendor/phar-io/manifest/composer.lock +++ /dev/null @@ -1,76 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "279b3c4fe44357abd924fdcc0cfa5664", - "packages": [ - { - "name": "phar-io/version", - "version": "3.2.1", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Library for handling version information and constraints", - "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.2.1" - }, - "time": "2022-02-21T01:04:05+00:00" - } - ], - "packages-dev": [], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": "^7.2 || ^8.0", - "ext-dom": "*", - "ext-phar": "*", - "ext-libxml": "*", - "ext-xmlwriter": "*" - }, - "platform-dev": [], - "plugin-api-version": "2.3.0" -} diff --git a/vendor/phar-io/manifest/manifest.xsd b/vendor/phar-io/manifest/manifest.xsd deleted file mode 100644 index 63e3f1c..0000000 --- a/vendor/phar-io/manifest/manifest.xsd +++ /dev/null @@ -1,116 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="https://phar.io/xml/manifest/1.0" - xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ns="https://phar.io/xml/manifest/1.0"> - - <xs:element name="phar"> - <xs:complexType> - <xs:sequence> - <xs:element ref="ns:contains" maxOccurs="1" /> - <xs:element ref="ns:copyright" maxOccurs="1" /> - <xs:element ref="ns:requires" maxOccurs="1" /> - <xs:element ref="ns:bundles" minOccurs="0" maxOccurs="1" /> - </xs:sequence> - </xs:complexType> - </xs:element> - - <xs:element name="contains"> - <xs:complexType> - <xs:simpleContent> - <xs:extension base="xs:string"> - <xs:attribute type="xs:string" use="required" name="name"/> - <xs:attribute type="xs:string" use="required" name="version"/> - <xs:attribute use="required" name="type"> - <xs:simpleType> - <xs:restriction base="xs:string"> - <xs:enumeration value="application"/> - <xs:enumeration value="extension"/> - <xs:enumeration value="library"/> - <xs:enumeration value="stub"/> - </xs:restriction> - </xs:simpleType> - </xs:attribute> - </xs:extension> - </xs:simpleContent> - </xs:complexType> - </xs:element> - - <xs:element name="copyright"> - <xs:complexType> - <xs:sequence> - <xs:choice maxOccurs="unbounded"> - <xs:element ref="ns:author" minOccurs="1" maxOccurs="unbounded" /> - </xs:choice> - <xs:element ref="ns:license" minOccurs="1" maxOccurs="1" /> - </xs:sequence> - </xs:complexType> - </xs:element> - - <xs:element name="author"> - <xs:complexType> - <xs:simpleContent> - <xs:extension base="xs:string"> - <xs:attribute type="xs:string" use="required" name="name"/> - <xs:attribute type="xs:string" use="optional" name="email"/> - </xs:extension> - </xs:simpleContent> - </xs:complexType> - </xs:element> - - <xs:element name="license"> - <xs:complexType> - <xs:simpleContent> - <xs:extension base="xs:string"> - <xs:attribute type="xs:string" use="required" name="type"/> - <xs:attribute type="xs:string" use="required" name="url"/> - </xs:extension> - </xs:simpleContent> - </xs:complexType> - </xs:element> - - <xs:element name="requires"> - <xs:complexType> - <xs:sequence> - <xs:element ref="ns:php" /> - </xs:sequence> - </xs:complexType> - </xs:element> - - <xs:element name="php"> - <xs:complexType> - <xs:sequence> - <xs:element ref="ns:ext" maxOccurs="unbounded" minOccurs="0" /> - </xs:sequence> - <xs:attribute type="xs:string" use="required" name="version"/> - </xs:complexType> - </xs:element> - - <xs:element name="ext"> - <xs:complexType> - <xs:simpleContent> - <xs:extension base="xs:string"> - <xs:attribute type="xs:string" name="name" use="required" /> - </xs:extension> - </xs:simpleContent> - </xs:complexType> - </xs:element> - - <xs:element name="bundles"> - <xs:complexType> - <xs:sequence> - <xs:element ref="ns:component" maxOccurs="unbounded" minOccurs="0" /> - </xs:sequence> - </xs:complexType> - </xs:element> - - <xs:element name="component"> - <xs:complexType> - <xs:simpleContent> - <xs:extension base="xs:string"> - <xs:attribute type="xs:string" name="name" use="required"/> - <xs:attribute type="xs:string" name="version" use="required"/> - </xs:extension> - </xs:simpleContent> - </xs:complexType> - </xs:element> - -</xs:schema> diff --git a/vendor/phar-io/manifest/src/ManifestDocumentMapper.php b/vendor/phar-io/manifest/src/ManifestDocumentMapper.php deleted file mode 100644 index 3da6403..0000000 --- a/vendor/phar-io/manifest/src/ManifestDocumentMapper.php +++ /dev/null @@ -1,151 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -use PharIo\Version\Exception as VersionException; -use PharIo\Version\Version; -use PharIo\Version\VersionConstraintParser; -use Throwable; -use function sprintf; - -class ManifestDocumentMapper { - public function map(ManifestDocument $document): Manifest { - try { - $contains = $document->getContainsElement(); - $type = $this->mapType($contains); - $copyright = $this->mapCopyright($document->getCopyrightElement()); - $requirements = $this->mapRequirements($document->getRequiresElement()); - $bundledComponents = $this->mapBundledComponents($document); - - return new Manifest( - new ApplicationName($contains->getName()), - new Version($contains->getVersion()), - $type, - $copyright, - $requirements, - $bundledComponents - ); - } catch (Throwable $e) { - throw new ManifestDocumentMapperException($e->getMessage(), (int)$e->getCode(), $e); - } - } - - private function mapType(ContainsElement $contains): Type { - switch ($contains->getType()) { - case 'application': - return Type::application(); - case 'library': - return Type::library(); - case 'extension': - return $this->mapExtension($contains->getExtensionElement()); - } - - throw new ManifestDocumentMapperException( - sprintf('Unsupported type %s', $contains->getType()) - ); - } - - private function mapCopyright(CopyrightElement $copyright): CopyrightInformation { - $authors = new AuthorCollection(); - - foreach ($copyright->getAuthorElements() as $authorElement) { - $authors->add( - new Author( - $authorElement->getName(), - $authorElement->hasEMail() ? new Email($authorElement->getEmail()) : null - ) - ); - } - - $licenseElement = $copyright->getLicenseElement(); - $license = new License( - $licenseElement->getType(), - new Url($licenseElement->getUrl()) - ); - - return new CopyrightInformation( - $authors, - $license - ); - } - - private function mapRequirements(RequiresElement $requires): RequirementCollection { - $collection = new RequirementCollection(); - $phpElement = $requires->getPHPElement(); - $parser = new VersionConstraintParser; - - try { - $versionConstraint = $parser->parse($phpElement->getVersion()); - } catch (VersionException $e) { - throw new ManifestDocumentMapperException( - sprintf('Unsupported version constraint - %s', $e->getMessage()), - (int)$e->getCode(), - $e - ); - } - - $collection->add( - new PhpVersionRequirement( - $versionConstraint - ) - ); - - if (!$phpElement->hasExtElements()) { - return $collection; - } - - foreach ($phpElement->getExtElements() as $extElement) { - $collection->add( - new PhpExtensionRequirement($extElement->getName()) - ); - } - - return $collection; - } - - private function mapBundledComponents(ManifestDocument $document): BundledComponentCollection { - $collection = new BundledComponentCollection(); - - if (!$document->hasBundlesElement()) { - return $collection; - } - - foreach ($document->getBundlesElement()->getComponentElements() as $componentElement) { - $collection->add( - new BundledComponent( - $componentElement->getName(), - new Version( - $componentElement->getVersion() - ) - ) - ); - } - - return $collection; - } - - private function mapExtension(ExtensionElement $extension): Extension { - try { - $versionConstraint = (new VersionConstraintParser)->parse($extension->getCompatible()); - - return Type::extension( - new ApplicationName($extension->getFor()), - $versionConstraint - ); - } catch (VersionException $e) { - throw new ManifestDocumentMapperException( - sprintf('Unsupported version constraint - %s', $e->getMessage()), - (int)$e->getCode(), - $e - ); - } - } -} diff --git a/vendor/phar-io/manifest/src/ManifestLoader.php b/vendor/phar-io/manifest/src/ManifestLoader.php deleted file mode 100644 index f467d2d..0000000 --- a/vendor/phar-io/manifest/src/ManifestLoader.php +++ /dev/null @@ -1,47 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -use function sprintf; - -class ManifestLoader { - public static function fromFile(string $filename): Manifest { - try { - return (new ManifestDocumentMapper())->map( - ManifestDocument::fromFile($filename) - ); - } catch (Exception $e) { - throw new ManifestLoaderException( - sprintf('Loading %s failed.', $filename), - (int)$e->getCode(), - $e - ); - } - } - - public static function fromPhar(string $filename): Manifest { - return self::fromFile('phar://' . $filename . '/manifest.xml'); - } - - public static function fromString(string $manifest): Manifest { - try { - return (new ManifestDocumentMapper())->map( - ManifestDocument::fromString($manifest) - ); - } catch (Exception $e) { - throw new ManifestLoaderException( - 'Processing string failed', - (int)$e->getCode(), - $e - ); - } - } -} diff --git a/vendor/phar-io/manifest/src/ManifestSerializer.php b/vendor/phar-io/manifest/src/ManifestSerializer.php deleted file mode 100644 index 48b8efd..0000000 --- a/vendor/phar-io/manifest/src/ManifestSerializer.php +++ /dev/null @@ -1,172 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -use PharIo\Version\AnyVersionConstraint; -use PharIo\Version\Version; -use PharIo\Version\VersionConstraint; -use XMLWriter; -use function count; -use function file_put_contents; -use function str_repeat; - -/** @psalm-suppress MissingConstructor */ -class ManifestSerializer { - /** @var XMLWriter */ - private $xmlWriter; - - public function serializeToFile(Manifest $manifest, string $filename): void { - file_put_contents( - $filename, - $this->serializeToString($manifest) - ); - } - - public function serializeToString(Manifest $manifest): string { - $this->startDocument(); - - $this->addContains($manifest->getName(), $manifest->getVersion(), $manifest->getType()); - $this->addCopyright($manifest->getCopyrightInformation()); - $this->addRequirements($manifest->getRequirements()); - $this->addBundles($manifest->getBundledComponents()); - - return $this->finishDocument(); - } - - private function startDocument(): void { - $xmlWriter = new XMLWriter(); - $xmlWriter->openMemory(); - $xmlWriter->setIndent(true); - $xmlWriter->setIndentString(str_repeat(' ', 4)); - $xmlWriter->startDocument('1.0', 'UTF-8'); - $xmlWriter->startElement('phar'); - $xmlWriter->writeAttribute('xmlns', 'https://phar.io/xml/manifest/1.0'); - - $this->xmlWriter = $xmlWriter; - } - - private function finishDocument(): string { - $this->xmlWriter->endElement(); - $this->xmlWriter->endDocument(); - - return $this->xmlWriter->outputMemory(); - } - - private function addContains(ApplicationName $name, Version $version, Type $type): void { - $this->xmlWriter->startElement('contains'); - $this->xmlWriter->writeAttribute('name', $name->asString()); - $this->xmlWriter->writeAttribute('version', $version->getVersionString()); - - switch (true) { - case $type->isApplication(): { - $this->xmlWriter->writeAttribute('type', 'application'); - - break; - } - - case $type->isLibrary(): { - $this->xmlWriter->writeAttribute('type', 'library'); - - break; - } - - case $type->isExtension(): { - $this->xmlWriter->writeAttribute('type', 'extension'); - /* @var $type Extension */ - $this->addExtension( - $type->getApplicationName(), - $type->getVersionConstraint() - ); - - break; - } - - default: { - $this->xmlWriter->writeAttribute('type', 'custom'); - } - } - - $this->xmlWriter->endElement(); - } - - private function addCopyright(CopyrightInformation $copyrightInformation): void { - $this->xmlWriter->startElement('copyright'); - - foreach ($copyrightInformation->getAuthors() as $author) { - $this->xmlWriter->startElement('author'); - $this->xmlWriter->writeAttribute('name', $author->getName()); - $this->xmlWriter->writeAttribute('email', $author->getEmail()->asString()); - $this->xmlWriter->endElement(); - } - - $license = $copyrightInformation->getLicense(); - - $this->xmlWriter->startElement('license'); - $this->xmlWriter->writeAttribute('type', $license->getName()); - $this->xmlWriter->writeAttribute('url', $license->getUrl()->asString()); - $this->xmlWriter->endElement(); - - $this->xmlWriter->endElement(); - } - - private function addRequirements(RequirementCollection $requirementCollection): void { - $phpRequirement = new AnyVersionConstraint(); - $extensions = []; - - foreach ($requirementCollection as $requirement) { - if ($requirement instanceof PhpVersionRequirement) { - $phpRequirement = $requirement->getVersionConstraint(); - - continue; - } - - if ($requirement instanceof PhpExtensionRequirement) { - $extensions[] = $requirement->asString(); - } - } - - $this->xmlWriter->startElement('requires'); - $this->xmlWriter->startElement('php'); - $this->xmlWriter->writeAttribute('version', $phpRequirement->asString()); - - foreach ($extensions as $extension) { - $this->xmlWriter->startElement('ext'); - $this->xmlWriter->writeAttribute('name', $extension); - $this->xmlWriter->endElement(); - } - - $this->xmlWriter->endElement(); - $this->xmlWriter->endElement(); - } - - private function addBundles(BundledComponentCollection $bundledComponentCollection): void { - if (count($bundledComponentCollection) === 0) { - return; - } - $this->xmlWriter->startElement('bundles'); - - foreach ($bundledComponentCollection as $bundledComponent) { - $this->xmlWriter->startElement('component'); - $this->xmlWriter->writeAttribute('name', $bundledComponent->getName()); - $this->xmlWriter->writeAttribute('version', $bundledComponent->getVersion()->getVersionString()); - $this->xmlWriter->endElement(); - } - - $this->xmlWriter->endElement(); - } - - private function addExtension(ApplicationName $applicationName, VersionConstraint $versionConstraint): void { - $this->xmlWriter->startElement('extension'); - $this->xmlWriter->writeAttribute('for', $applicationName->asString()); - $this->xmlWriter->writeAttribute('compatible', $versionConstraint->asString()); - $this->xmlWriter->endElement(); - } -} diff --git a/vendor/phar-io/manifest/src/exceptions/ElementCollectionException.php b/vendor/phar-io/manifest/src/exceptions/ElementCollectionException.php deleted file mode 100644 index 7528afc..0000000 --- a/vendor/phar-io/manifest/src/exceptions/ElementCollectionException.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -use InvalidArgumentException; - -class ElementCollectionException extends InvalidArgumentException implements Exception { -} diff --git a/vendor/phar-io/manifest/src/exceptions/Exception.php b/vendor/phar-io/manifest/src/exceptions/Exception.php deleted file mode 100644 index 0c135d3..0000000 --- a/vendor/phar-io/manifest/src/exceptions/Exception.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -use Throwable; - -interface Exception extends Throwable { -} diff --git a/vendor/phar-io/manifest/src/exceptions/InvalidApplicationNameException.php b/vendor/phar-io/manifest/src/exceptions/InvalidApplicationNameException.php deleted file mode 100644 index ecfe514..0000000 --- a/vendor/phar-io/manifest/src/exceptions/InvalidApplicationNameException.php +++ /dev/null @@ -1,17 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -use InvalidArgumentException; - -class InvalidApplicationNameException extends InvalidArgumentException implements Exception { - public const InvalidFormat = 2; -} diff --git a/vendor/phar-io/manifest/src/exceptions/InvalidEmailException.php b/vendor/phar-io/manifest/src/exceptions/InvalidEmailException.php deleted file mode 100644 index 2424055..0000000 --- a/vendor/phar-io/manifest/src/exceptions/InvalidEmailException.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -use InvalidArgumentException; - -class InvalidEmailException extends InvalidArgumentException implements Exception { -} diff --git a/vendor/phar-io/manifest/src/exceptions/InvalidUrlException.php b/vendor/phar-io/manifest/src/exceptions/InvalidUrlException.php deleted file mode 100644 index c8b192b..0000000 --- a/vendor/phar-io/manifest/src/exceptions/InvalidUrlException.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -use InvalidArgumentException; - -class InvalidUrlException extends InvalidArgumentException implements Exception { -} diff --git a/vendor/phar-io/manifest/src/exceptions/ManifestDocumentException.php b/vendor/phar-io/manifest/src/exceptions/ManifestDocumentException.php deleted file mode 100644 index 0a158e6..0000000 --- a/vendor/phar-io/manifest/src/exceptions/ManifestDocumentException.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -use RuntimeException; - -class ManifestDocumentException extends RuntimeException implements Exception { -} diff --git a/vendor/phar-io/manifest/src/exceptions/ManifestDocumentLoadingException.php b/vendor/phar-io/manifest/src/exceptions/ManifestDocumentLoadingException.php deleted file mode 100644 index 816af12..0000000 --- a/vendor/phar-io/manifest/src/exceptions/ManifestDocumentLoadingException.php +++ /dev/null @@ -1,47 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -use LibXMLError; -use function sprintf; - -class ManifestDocumentLoadingException extends \Exception implements Exception { - /** @var LibXMLError[] */ - private $libxmlErrors; - - /** - * ManifestDocumentLoadingException constructor. - * - * @param LibXMLError[] $libxmlErrors - */ - public function __construct(array $libxmlErrors) { - $this->libxmlErrors = $libxmlErrors; - $first = $this->libxmlErrors[0]; - - parent::__construct( - sprintf( - '%s (Line: %d / Column: %d / File: %s)', - $first->message, - $first->line, - $first->column, - $first->file - ), - $first->code - ); - } - - /** - * @return LibXMLError[] - */ - public function getLibxmlErrors(): array { - return $this->libxmlErrors; - } -} diff --git a/vendor/phar-io/manifest/src/exceptions/ManifestDocumentMapperException.php b/vendor/phar-io/manifest/src/exceptions/ManifestDocumentMapperException.php deleted file mode 100644 index 0d1a5f5..0000000 --- a/vendor/phar-io/manifest/src/exceptions/ManifestDocumentMapperException.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -use RuntimeException; - -class ManifestDocumentMapperException extends RuntimeException implements Exception { -} diff --git a/vendor/phar-io/manifest/src/exceptions/ManifestElementException.php b/vendor/phar-io/manifest/src/exceptions/ManifestElementException.php deleted file mode 100644 index 46f82e3..0000000 --- a/vendor/phar-io/manifest/src/exceptions/ManifestElementException.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -use RuntimeException; - -class ManifestElementException extends RuntimeException implements Exception { -} diff --git a/vendor/phar-io/manifest/src/exceptions/ManifestLoaderException.php b/vendor/phar-io/manifest/src/exceptions/ManifestLoaderException.php deleted file mode 100644 index d00ed19..0000000 --- a/vendor/phar-io/manifest/src/exceptions/ManifestLoaderException.php +++ /dev/null @@ -1,14 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -class ManifestLoaderException extends \Exception implements Exception { -} diff --git a/vendor/phar-io/manifest/src/exceptions/NoEmailAddressException.php b/vendor/phar-io/manifest/src/exceptions/NoEmailAddressException.php deleted file mode 100644 index 2791312..0000000 --- a/vendor/phar-io/manifest/src/exceptions/NoEmailAddressException.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -use InvalidArgumentException; - -class NoEmailAddressException extends InvalidArgumentException implements Exception { -} diff --git a/vendor/phar-io/manifest/src/values/Application.php b/vendor/phar-io/manifest/src/values/Application.php deleted file mode 100644 index 11a44d9..0000000 --- a/vendor/phar-io/manifest/src/values/Application.php +++ /dev/null @@ -1,17 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -class Application extends Type { - public function isApplication(): bool { - return true; - } -} diff --git a/vendor/phar-io/manifest/src/values/ApplicationName.php b/vendor/phar-io/manifest/src/values/ApplicationName.php deleted file mode 100644 index 1a0ad1e..0000000 --- a/vendor/phar-io/manifest/src/values/ApplicationName.php +++ /dev/null @@ -1,41 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -use function preg_match; -use function sprintf; - -class ApplicationName { - /** @var string */ - private $name; - - public function __construct(string $name) { - $this->ensureValidFormat($name); - $this->name = $name; - } - - public function asString(): string { - return $this->name; - } - - public function isEqual(ApplicationName $name): bool { - return $this->name === $name->name; - } - - private function ensureValidFormat(string $name): void { - if (!preg_match('#\w/\w#', $name)) { - throw new InvalidApplicationNameException( - sprintf('Format of name "%s" is not valid - expected: vendor/packagename', $name), - InvalidApplicationNameException::InvalidFormat - ); - } - } -} diff --git a/vendor/phar-io/manifest/src/values/Author.php b/vendor/phar-io/manifest/src/values/Author.php deleted file mode 100644 index 7b243aa..0000000 --- a/vendor/phar-io/manifest/src/values/Author.php +++ /dev/null @@ -1,57 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -use function sprintf; - -class Author { - /** @var string */ - private $name; - - /** @var null|Email */ - private $email; - - public function __construct(string $name, ?Email $email = null) { - $this->name = $name; - $this->email = $email; - } - - public function asString(): string { - if (!$this->hasEmail()) { - return $this->name; - } - - return sprintf( - '%s <%s>', - $this->name, - $this->email->asString() - ); - } - - public function getName(): string { - return $this->name; - } - - /** - * @psalm-assert-if-true Email $this->email - */ - public function hasEmail(): bool { - return $this->email !== null; - } - - public function getEmail(): Email { - if (!$this->hasEmail()) { - throw new NoEmailAddressException(); - } - - return $this->email; - } -} diff --git a/vendor/phar-io/manifest/src/values/AuthorCollection.php b/vendor/phar-io/manifest/src/values/AuthorCollection.php deleted file mode 100644 index 549876d..0000000 --- a/vendor/phar-io/manifest/src/values/AuthorCollection.php +++ /dev/null @@ -1,40 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -use Countable; -use IteratorAggregate; -use function count; - -/** @template-implements IteratorAggregate<int,Author> */ -class AuthorCollection implements Countable, IteratorAggregate { - /** @var Author[] */ - private $authors = []; - - public function add(Author $author): void { - $this->authors[] = $author; - } - - /** - * @return Author[] - */ - public function getAuthors(): array { - return $this->authors; - } - - public function count(): int { - return count($this->authors); - } - - public function getIterator(): AuthorCollectionIterator { - return new AuthorCollectionIterator($this); - } -} diff --git a/vendor/phar-io/manifest/src/values/AuthorCollectionIterator.php b/vendor/phar-io/manifest/src/values/AuthorCollectionIterator.php deleted file mode 100644 index 36fee9f..0000000 --- a/vendor/phar-io/manifest/src/values/AuthorCollectionIterator.php +++ /dev/null @@ -1,47 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -use Iterator; -use function count; - -/** @template-implements Iterator<int,Author> */ -class AuthorCollectionIterator implements Iterator { - /** @var Author[] */ - private $authors; - - /** @var int */ - private $position = 0; - - public function __construct(AuthorCollection $authors) { - $this->authors = $authors->getAuthors(); - } - - public function rewind(): void { - $this->position = 0; - } - - public function valid(): bool { - return $this->position < count($this->authors); - } - - public function key(): int { - return $this->position; - } - - public function current(): Author { - return $this->authors[$this->position]; - } - - public function next(): void { - $this->position++; - } -} diff --git a/vendor/phar-io/manifest/src/values/BundledComponent.php b/vendor/phar-io/manifest/src/values/BundledComponent.php deleted file mode 100644 index 5817036..0000000 --- a/vendor/phar-io/manifest/src/values/BundledComponent.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -use PharIo\Version\Version; - -class BundledComponent { - /** @var string */ - private $name; - - /** @var Version */ - private $version; - - public function __construct(string $name, Version $version) { - $this->name = $name; - $this->version = $version; - } - - public function getName(): string { - return $this->name; - } - - public function getVersion(): Version { - return $this->version; - } -} diff --git a/vendor/phar-io/manifest/src/values/BundledComponentCollection.php b/vendor/phar-io/manifest/src/values/BundledComponentCollection.php deleted file mode 100644 index 28aaa06..0000000 --- a/vendor/phar-io/manifest/src/values/BundledComponentCollection.php +++ /dev/null @@ -1,40 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -use Countable; -use IteratorAggregate; -use function count; - -/** @template-implements IteratorAggregate<int,BundledComponent> */ -class BundledComponentCollection implements Countable, IteratorAggregate { - /** @var BundledComponent[] */ - private $bundledComponents = []; - - public function add(BundledComponent $bundledComponent): void { - $this->bundledComponents[] = $bundledComponent; - } - - /** - * @return BundledComponent[] - */ - public function getBundledComponents(): array { - return $this->bundledComponents; - } - - public function count(): int { - return count($this->bundledComponents); - } - - public function getIterator(): BundledComponentCollectionIterator { - return new BundledComponentCollectionIterator($this); - } -} diff --git a/vendor/phar-io/manifest/src/values/BundledComponentCollectionIterator.php b/vendor/phar-io/manifest/src/values/BundledComponentCollectionIterator.php deleted file mode 100644 index 5c72817..0000000 --- a/vendor/phar-io/manifest/src/values/BundledComponentCollectionIterator.php +++ /dev/null @@ -1,47 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -use Iterator; -use function count; - -/** @template-implements Iterator<int,BundledComponent> */ -class BundledComponentCollectionIterator implements Iterator { - /** @var BundledComponent[] */ - private $bundledComponents; - - /** @var int */ - private $position = 0; - - public function __construct(BundledComponentCollection $bundledComponents) { - $this->bundledComponents = $bundledComponents->getBundledComponents(); - } - - public function rewind(): void { - $this->position = 0; - } - - public function valid(): bool { - return $this->position < count($this->bundledComponents); - } - - public function key(): int { - return $this->position; - } - - public function current(): BundledComponent { - return $this->bundledComponents[$this->position]; - } - - public function next(): void { - $this->position++; - } -} diff --git a/vendor/phar-io/manifest/src/values/CopyrightInformation.php b/vendor/phar-io/manifest/src/values/CopyrightInformation.php deleted file mode 100644 index b4468ed..0000000 --- a/vendor/phar-io/manifest/src/values/CopyrightInformation.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -class CopyrightInformation { - /** @var AuthorCollection */ - private $authors; - - /** @var License */ - private $license; - - public function __construct(AuthorCollection $authors, License $license) { - $this->authors = $authors; - $this->license = $license; - } - - public function getAuthors(): AuthorCollection { - return $this->authors; - } - - public function getLicense(): License { - return $this->license; - } -} diff --git a/vendor/phar-io/manifest/src/values/Email.php b/vendor/phar-io/manifest/src/values/Email.php deleted file mode 100644 index dbaff84..0000000 --- a/vendor/phar-io/manifest/src/values/Email.php +++ /dev/null @@ -1,35 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -use const FILTER_VALIDATE_EMAIL; -use function filter_var; - -class Email { - /** @var string */ - private $email; - - public function __construct(string $email) { - $this->ensureEmailIsValid($email); - - $this->email = $email; - } - - public function asString(): string { - return $this->email; - } - - private function ensureEmailIsValid(string $url): void { - if (filter_var($url, FILTER_VALIDATE_EMAIL) === false) { - throw new InvalidEmailException; - } - } -} diff --git a/vendor/phar-io/manifest/src/values/Extension.php b/vendor/phar-io/manifest/src/values/Extension.php deleted file mode 100644 index abcd2f8..0000000 --- a/vendor/phar-io/manifest/src/values/Extension.php +++ /dev/null @@ -1,47 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -use PharIo\Version\Version; -use PharIo\Version\VersionConstraint; - -class Extension extends Type { - /** @var ApplicationName */ - private $application; - - /** @var VersionConstraint */ - private $versionConstraint; - - public function __construct(ApplicationName $application, VersionConstraint $versionConstraint) { - $this->application = $application; - $this->versionConstraint = $versionConstraint; - } - - public function getApplicationName(): ApplicationName { - return $this->application; - } - - public function getVersionConstraint(): VersionConstraint { - return $this->versionConstraint; - } - - public function isExtension(): bool { - return true; - } - - public function isExtensionFor(ApplicationName $name): bool { - return $this->application->isEqual($name); - } - - public function isCompatibleWith(ApplicationName $name, Version $version): bool { - return $this->isExtensionFor($name) && $this->versionConstraint->complies($version); - } -} diff --git a/vendor/phar-io/manifest/src/values/Library.php b/vendor/phar-io/manifest/src/values/Library.php deleted file mode 100644 index 97c292d..0000000 --- a/vendor/phar-io/manifest/src/values/Library.php +++ /dev/null @@ -1,17 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -class Library extends Type { - public function isLibrary(): bool { - return true; - } -} diff --git a/vendor/phar-io/manifest/src/values/License.php b/vendor/phar-io/manifest/src/values/License.php deleted file mode 100644 index c2d9429..0000000 --- a/vendor/phar-io/manifest/src/values/License.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -class License { - /** @var string */ - private $name; - - /** @var Url */ - private $url; - - public function __construct(string $name, Url $url) { - $this->name = $name; - $this->url = $url; - } - - public function getName(): string { - return $this->name; - } - - public function getUrl(): Url { - return $this->url; - } -} diff --git a/vendor/phar-io/manifest/src/values/Manifest.php b/vendor/phar-io/manifest/src/values/Manifest.php deleted file mode 100644 index 3646682..0000000 --- a/vendor/phar-io/manifest/src/values/Manifest.php +++ /dev/null @@ -1,93 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -use PharIo\Version\Version; - -class Manifest { - /** @var ApplicationName */ - private $name; - - /** @var Version */ - private $version; - - /** @var Type */ - private $type; - - /** @var CopyrightInformation */ - private $copyrightInformation; - - /** @var RequirementCollection */ - private $requirements; - - /** @var BundledComponentCollection */ - private $bundledComponents; - - public function __construct(ApplicationName $name, Version $version, Type $type, CopyrightInformation $copyrightInformation, RequirementCollection $requirements, BundledComponentCollection $bundledComponents) { - $this->name = $name; - $this->version = $version; - $this->type = $type; - $this->copyrightInformation = $copyrightInformation; - $this->requirements = $requirements; - $this->bundledComponents = $bundledComponents; - } - - public function getName(): ApplicationName { - return $this->name; - } - - public function getVersion(): Version { - return $this->version; - } - - public function getType(): Type { - return $this->type; - } - - public function getCopyrightInformation(): CopyrightInformation { - return $this->copyrightInformation; - } - - public function getRequirements(): RequirementCollection { - return $this->requirements; - } - - public function getBundledComponents(): BundledComponentCollection { - return $this->bundledComponents; - } - - public function isApplication(): bool { - return $this->type->isApplication(); - } - - public function isLibrary(): bool { - return $this->type->isLibrary(); - } - - public function isExtension(): bool { - return $this->type->isExtension(); - } - - public function isExtensionFor(ApplicationName $application, ?Version $version = null): bool { - if (!$this->isExtension()) { - return false; - } - - /** @var Extension $type */ - $type = $this->type; - - if ($version !== null) { - return $type->isCompatibleWith($application, $version); - } - - return $type->isExtensionFor($application); - } -} diff --git a/vendor/phar-io/manifest/src/values/PhpExtensionRequirement.php b/vendor/phar-io/manifest/src/values/PhpExtensionRequirement.php deleted file mode 100644 index f81bd25..0000000 --- a/vendor/phar-io/manifest/src/values/PhpExtensionRequirement.php +++ /dev/null @@ -1,24 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -class PhpExtensionRequirement implements Requirement { - /** @var string */ - private $extension; - - public function __construct(string $extension) { - $this->extension = $extension; - } - - public function asString(): string { - return $this->extension; - } -} diff --git a/vendor/phar-io/manifest/src/values/PhpVersionRequirement.php b/vendor/phar-io/manifest/src/values/PhpVersionRequirement.php deleted file mode 100644 index fb30c3b..0000000 --- a/vendor/phar-io/manifest/src/values/PhpVersionRequirement.php +++ /dev/null @@ -1,26 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -use PharIo\Version\VersionConstraint; - -class PhpVersionRequirement implements Requirement { - /** @var VersionConstraint */ - private $versionConstraint; - - public function __construct(VersionConstraint $versionConstraint) { - $this->versionConstraint = $versionConstraint; - } - - public function getVersionConstraint(): VersionConstraint { - return $this->versionConstraint; - } -} diff --git a/vendor/phar-io/manifest/src/values/Requirement.php b/vendor/phar-io/manifest/src/values/Requirement.php deleted file mode 100644 index d4b4640..0000000 --- a/vendor/phar-io/manifest/src/values/Requirement.php +++ /dev/null @@ -1,14 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -interface Requirement { -} diff --git a/vendor/phar-io/manifest/src/values/RequirementCollection.php b/vendor/phar-io/manifest/src/values/RequirementCollection.php deleted file mode 100644 index e4fe2a1..0000000 --- a/vendor/phar-io/manifest/src/values/RequirementCollection.php +++ /dev/null @@ -1,40 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -use Countable; -use IteratorAggregate; -use function count; - -/** @template-implements IteratorAggregate<int,Requirement> */ -class RequirementCollection implements Countable, IteratorAggregate { - /** @var Requirement[] */ - private $requirements = []; - - public function add(Requirement $requirement): void { - $this->requirements[] = $requirement; - } - - /** - * @return Requirement[] - */ - public function getRequirements(): array { - return $this->requirements; - } - - public function count(): int { - return count($this->requirements); - } - - public function getIterator(): RequirementCollectionIterator { - return new RequirementCollectionIterator($this); - } -} diff --git a/vendor/phar-io/manifest/src/values/RequirementCollectionIterator.php b/vendor/phar-io/manifest/src/values/RequirementCollectionIterator.php deleted file mode 100644 index a587468..0000000 --- a/vendor/phar-io/manifest/src/values/RequirementCollectionIterator.php +++ /dev/null @@ -1,47 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -use Iterator; -use function count; - -/** @template-implements Iterator<int,Requirement> */ -class RequirementCollectionIterator implements Iterator { - /** @var Requirement[] */ - private $requirements; - - /** @var int */ - private $position = 0; - - public function __construct(RequirementCollection $requirements) { - $this->requirements = $requirements->getRequirements(); - } - - public function rewind(): void { - $this->position = 0; - } - - public function valid(): bool { - return $this->position < count($this->requirements); - } - - public function key(): int { - return $this->position; - } - - public function current(): Requirement { - return $this->requirements[$this->position]; - } - - public function next(): void { - $this->position++; - } -} diff --git a/vendor/phar-io/manifest/src/values/Type.php b/vendor/phar-io/manifest/src/values/Type.php deleted file mode 100644 index 231e7fd..0000000 --- a/vendor/phar-io/manifest/src/values/Type.php +++ /dev/null @@ -1,42 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -use PharIo\Version\VersionConstraint; - -abstract class Type { - public static function application(): Application { - return new Application; - } - - public static function library(): Library { - return new Library; - } - - public static function extension(ApplicationName $application, VersionConstraint $versionConstraint): Extension { - return new Extension($application, $versionConstraint); - } - - /** @psalm-assert-if-true Application $this */ - public function isApplication(): bool { - return false; - } - - /** @psalm-assert-if-true Library $this */ - public function isLibrary(): bool { - return false; - } - - /** @psalm-assert-if-true Extension $this */ - public function isExtension(): bool { - return false; - } -} diff --git a/vendor/phar-io/manifest/src/values/Url.php b/vendor/phar-io/manifest/src/values/Url.php deleted file mode 100644 index 9806155..0000000 --- a/vendor/phar-io/manifest/src/values/Url.php +++ /dev/null @@ -1,38 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -use const FILTER_VALIDATE_URL; -use function filter_var; - -class Url { - /** @var string */ - private $url; - - public function __construct(string $url) { - $this->ensureUrlIsValid($url); - - $this->url = $url; - } - - public function asString(): string { - return $this->url; - } - - /** - * @throws InvalidUrlException - */ - private function ensureUrlIsValid(string $url): void { - if (filter_var($url, FILTER_VALIDATE_URL) === false) { - throw new InvalidUrlException; - } - } -} diff --git a/vendor/phar-io/manifest/src/xml/AuthorElement.php b/vendor/phar-io/manifest/src/xml/AuthorElement.php deleted file mode 100644 index b33eb3c..0000000 --- a/vendor/phar-io/manifest/src/xml/AuthorElement.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -class AuthorElement extends ManifestElement { - public function getName(): string { - return $this->getAttributeValue('name'); - } - - public function getEmail(): string { - return $this->getAttributeValue('email'); - } - - public function hasEMail(): bool { - return $this->hasAttribute('email'); - } -} diff --git a/vendor/phar-io/manifest/src/xml/AuthorElementCollection.php b/vendor/phar-io/manifest/src/xml/AuthorElementCollection.php deleted file mode 100644 index 0a2a2a3..0000000 --- a/vendor/phar-io/manifest/src/xml/AuthorElementCollection.php +++ /dev/null @@ -1,19 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -class AuthorElementCollection extends ElementCollection { - public function current(): AuthorElement { - return new AuthorElement( - $this->getCurrentElement() - ); - } -} diff --git a/vendor/phar-io/manifest/src/xml/BundlesElement.php b/vendor/phar-io/manifest/src/xml/BundlesElement.php deleted file mode 100644 index ef721a6..0000000 --- a/vendor/phar-io/manifest/src/xml/BundlesElement.php +++ /dev/null @@ -1,19 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -class BundlesElement extends ManifestElement { - public function getComponentElements(): ComponentElementCollection { - return new ComponentElementCollection( - $this->getChildrenByName('component') - ); - } -} diff --git a/vendor/phar-io/manifest/src/xml/ComponentElement.php b/vendor/phar-io/manifest/src/xml/ComponentElement.php deleted file mode 100644 index 84373c4..0000000 --- a/vendor/phar-io/manifest/src/xml/ComponentElement.php +++ /dev/null @@ -1,21 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -class ComponentElement extends ManifestElement { - public function getName(): string { - return $this->getAttributeValue('name'); - } - - public function getVersion(): string { - return $this->getAttributeValue('version'); - } -} diff --git a/vendor/phar-io/manifest/src/xml/ComponentElementCollection.php b/vendor/phar-io/manifest/src/xml/ComponentElementCollection.php deleted file mode 100644 index cd9ad5d..0000000 --- a/vendor/phar-io/manifest/src/xml/ComponentElementCollection.php +++ /dev/null @@ -1,19 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -class ComponentElementCollection extends ElementCollection { - public function current(): ComponentElement { - return new ComponentElement( - $this->getCurrentElement() - ); - } -} diff --git a/vendor/phar-io/manifest/src/xml/ContainsElement.php b/vendor/phar-io/manifest/src/xml/ContainsElement.php deleted file mode 100644 index 55a9c60..0000000 --- a/vendor/phar-io/manifest/src/xml/ContainsElement.php +++ /dev/null @@ -1,31 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -class ContainsElement extends ManifestElement { - public function getName(): string { - return $this->getAttributeValue('name'); - } - - public function getVersion(): string { - return $this->getAttributeValue('version'); - } - - public function getType(): string { - return $this->getAttributeValue('type'); - } - - public function getExtensionElement(): ExtensionElement { - return new ExtensionElement( - $this->getChildByName('extension') - ); - } -} diff --git a/vendor/phar-io/manifest/src/xml/CopyrightElement.php b/vendor/phar-io/manifest/src/xml/CopyrightElement.php deleted file mode 100644 index c11415a..0000000 --- a/vendor/phar-io/manifest/src/xml/CopyrightElement.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -class CopyrightElement extends ManifestElement { - public function getAuthorElements(): AuthorElementCollection { - return new AuthorElementCollection( - $this->getChildrenByName('author') - ); - } - - public function getLicenseElement(): LicenseElement { - return new LicenseElement( - $this->getChildByName('license') - ); - } -} diff --git a/vendor/phar-io/manifest/src/xml/ElementCollection.php b/vendor/phar-io/manifest/src/xml/ElementCollection.php deleted file mode 100644 index 9e1de56..0000000 --- a/vendor/phar-io/manifest/src/xml/ElementCollection.php +++ /dev/null @@ -1,68 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -use DOMElement; -use DOMNodeList; -use Iterator; -use ReturnTypeWillChange; -use function count; -use function get_class; -use function sprintf; - -/** @template-implements Iterator<int,DOMElement> */ -abstract class ElementCollection implements Iterator { - /** @var DOMElement[] */ - private $nodes = []; - - /** @var int */ - private $position; - - public function __construct(DOMNodeList $nodeList) { - $this->position = 0; - $this->importNodes($nodeList); - } - - #[ReturnTypeWillChange] - abstract public function current(); - - public function next(): void { - $this->position++; - } - - public function key(): int { - return $this->position; - } - - public function valid(): bool { - return $this->position < count($this->nodes); - } - - public function rewind(): void { - $this->position = 0; - } - - protected function getCurrentElement(): DOMElement { - return $this->nodes[$this->position]; - } - - private function importNodes(DOMNodeList $nodeList): void { - foreach ($nodeList as $node) { - if (!$node instanceof DOMElement) { - throw new ElementCollectionException( - sprintf('\DOMElement expected, got \%s', get_class($node)) - ); - } - - $this->nodes[] = $node; - } - } -} diff --git a/vendor/phar-io/manifest/src/xml/ExtElement.php b/vendor/phar-io/manifest/src/xml/ExtElement.php deleted file mode 100644 index 6a88a05..0000000 --- a/vendor/phar-io/manifest/src/xml/ExtElement.php +++ /dev/null @@ -1,17 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -class ExtElement extends ManifestElement { - public function getName(): string { - return $this->getAttributeValue('name'); - } -} diff --git a/vendor/phar-io/manifest/src/xml/ExtElementCollection.php b/vendor/phar-io/manifest/src/xml/ExtElementCollection.php deleted file mode 100644 index 3eec946..0000000 --- a/vendor/phar-io/manifest/src/xml/ExtElementCollection.php +++ /dev/null @@ -1,19 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -class ExtElementCollection extends ElementCollection { - public function current(): ExtElement { - return new ExtElement( - $this->getCurrentElement() - ); - } -} diff --git a/vendor/phar-io/manifest/src/xml/ExtensionElement.php b/vendor/phar-io/manifest/src/xml/ExtensionElement.php deleted file mode 100644 index 22016a0..0000000 --- a/vendor/phar-io/manifest/src/xml/ExtensionElement.php +++ /dev/null @@ -1,21 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -class ExtensionElement extends ManifestElement { - public function getFor(): string { - return $this->getAttributeValue('for'); - } - - public function getCompatible(): string { - return $this->getAttributeValue('compatible'); - } -} diff --git a/vendor/phar-io/manifest/src/xml/LicenseElement.php b/vendor/phar-io/manifest/src/xml/LicenseElement.php deleted file mode 100644 index d9f4cb2..0000000 --- a/vendor/phar-io/manifest/src/xml/LicenseElement.php +++ /dev/null @@ -1,21 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -class LicenseElement extends ManifestElement { - public function getType(): string { - return $this->getAttributeValue('type'); - } - - public function getUrl(): string { - return $this->getAttributeValue('url'); - } -} diff --git a/vendor/phar-io/manifest/src/xml/ManifestDocument.php b/vendor/phar-io/manifest/src/xml/ManifestDocument.php deleted file mode 100644 index 8745868..0000000 --- a/vendor/phar-io/manifest/src/xml/ManifestDocument.php +++ /dev/null @@ -1,115 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -use DOMDocument; -use DOMElement; -use Throwable; -use function count; -use function file_get_contents; -use function is_file; -use function libxml_clear_errors; -use function libxml_get_errors; -use function libxml_use_internal_errors; -use function sprintf; - -class ManifestDocument { - public const XMLNS = 'https://phar.io/xml/manifest/1.0'; - - /** @var DOMDocument */ - private $dom; - - public static function fromFile(string $filename): ManifestDocument { - if (!is_file($filename)) { - throw new ManifestDocumentException( - sprintf('File "%s" not found', $filename) - ); - } - - return self::fromString( - file_get_contents($filename) - ); - } - - public static function fromString(string $xmlString): ManifestDocument { - $prev = libxml_use_internal_errors(true); - libxml_clear_errors(); - - try { - $dom = new DOMDocument(); - $dom->loadXML($xmlString); - $errors = libxml_get_errors(); - libxml_use_internal_errors($prev); - } catch (Throwable $t) { - throw new ManifestDocumentException($t->getMessage(), 0, $t); - } - - if (count($errors) !== 0) { - throw new ManifestDocumentLoadingException($errors); - } - - return new self($dom); - } - - private function __construct(DOMDocument $dom) { - $this->ensureCorrectDocumentType($dom); - - $this->dom = $dom; - } - - public function getContainsElement(): ContainsElement { - return new ContainsElement( - $this->fetchElementByName('contains') - ); - } - - public function getCopyrightElement(): CopyrightElement { - return new CopyrightElement( - $this->fetchElementByName('copyright') - ); - } - - public function getRequiresElement(): RequiresElement { - return new RequiresElement( - $this->fetchElementByName('requires') - ); - } - - public function hasBundlesElement(): bool { - return $this->dom->getElementsByTagNameNS(self::XMLNS, 'bundles')->length === 1; - } - - public function getBundlesElement(): BundlesElement { - return new BundlesElement( - $this->fetchElementByName('bundles') - ); - } - - private function ensureCorrectDocumentType(DOMDocument $dom): void { - $root = $dom->documentElement; - - if ($root->localName !== 'phar' || $root->namespaceURI !== self::XMLNS) { - throw new ManifestDocumentException('Not a phar.io manifest document'); - } - } - - private function fetchElementByName(string $elementName): DOMElement { - $element = $this->dom->getElementsByTagNameNS(self::XMLNS, $elementName)->item(0); - - if (!$element instanceof DOMElement) { - throw new ManifestDocumentException( - sprintf('Element %s missing', $elementName) - ); - } - - return $element; - } -} diff --git a/vendor/phar-io/manifest/src/xml/ManifestElement.php b/vendor/phar-io/manifest/src/xml/ManifestElement.php deleted file mode 100644 index 461ba0c..0000000 --- a/vendor/phar-io/manifest/src/xml/ManifestElement.php +++ /dev/null @@ -1,72 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -use DOMElement; -use DOMNodeList; -use function sprintf; - -class ManifestElement { - public const XMLNS = 'https://phar.io/xml/manifest/1.0'; - - /** @var DOMElement */ - private $element; - - public function __construct(DOMElement $element) { - $this->element = $element; - } - - protected function getAttributeValue(string $name): string { - if (!$this->element->hasAttribute($name)) { - throw new ManifestElementException( - sprintf( - 'Attribute %s not set on element %s', - $name, - $this->element->localName - ) - ); - } - - return $this->element->getAttribute($name); - } - - protected function hasAttribute(string $name): bool { - return $this->element->hasAttribute($name); - } - - protected function getChildByName(string $elementName): DOMElement { - $element = $this->element->getElementsByTagNameNS(self::XMLNS, $elementName)->item(0); - - if (!$element instanceof DOMElement) { - throw new ManifestElementException( - sprintf('Element %s missing', $elementName) - ); - } - - return $element; - } - - protected function getChildrenByName(string $elementName): DOMNodeList { - $elementList = $this->element->getElementsByTagNameNS(self::XMLNS, $elementName); - - if ($elementList->length === 0) { - throw new ManifestElementException( - sprintf('Element(s) %s missing', $elementName) - ); - } - - return $elementList; - } - - protected function hasChild(string $elementName): bool { - return $this->element->getElementsByTagNameNS(self::XMLNS, $elementName)->length !== 0; - } -} diff --git a/vendor/phar-io/manifest/src/xml/PhpElement.php b/vendor/phar-io/manifest/src/xml/PhpElement.php deleted file mode 100644 index 9340c2e..0000000 --- a/vendor/phar-io/manifest/src/xml/PhpElement.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -class PhpElement extends ManifestElement { - public function getVersion(): string { - return $this->getAttributeValue('version'); - } - - public function hasExtElements(): bool { - return $this->hasChild('ext'); - } - - public function getExtElements(): ExtElementCollection { - return new ExtElementCollection( - $this->getChildrenByName('ext') - ); - } -} diff --git a/vendor/phar-io/manifest/src/xml/RequiresElement.php b/vendor/phar-io/manifest/src/xml/RequiresElement.php deleted file mode 100644 index 73ba54c..0000000 --- a/vendor/phar-io/manifest/src/xml/RequiresElement.php +++ /dev/null @@ -1,19 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Manifest. - * - * Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - */ -namespace PharIo\Manifest; - -class RequiresElement extends ManifestElement { - public function getPHPElement(): PhpElement { - return new PhpElement( - $this->getChildByName('php') - ); - } -} diff --git a/vendor/phar-io/manifest/tools/php-cs-fixer.d/PhpdocSingleLineVarFixer.php b/vendor/phar-io/manifest/tools/php-cs-fixer.d/PhpdocSingleLineVarFixer.php deleted file mode 100644 index ea5414e..0000000 --- a/vendor/phar-io/manifest/tools/php-cs-fixer.d/PhpdocSingleLineVarFixer.php +++ /dev/null @@ -1,72 +0,0 @@ -<?php -namespace PharIo\CSFixer; - -use PhpCsFixer\Fixer\FixerInterface; -use PhpCsFixer\FixerDefinition\FixerDefinition; -use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\Token; - -/** - * Main implementation taken from kubawerlos/php-cs-fixer-customere-fixers - * Copyright (c) 2018 Kuba Werłos - * - * Slightly modified to work without the gazillion of composer dependencies - * - * Original: - * https://github.com/kubawerlos/php-cs-fixer-custom-fixers/blob/master/src/Fixer/PhpdocSingleLineVarFixer.php - * - */ -class PhpdocSingleLineVarFixer implements FixerInterface { - - public function getDefinition(): FixerDefinition { - return new FixerDefinition( - '`@var` annotation must be in single line when is the only content.', - [new CodeSample('<?php - /** - * @var string - */ - ')] - ); - } - - public function isCandidate(Tokens $tokens): bool { - return $tokens->isTokenKindFound(T_DOC_COMMENT); - } - - public function isRisky(): bool { - return false; - } - - public function fix(\SplFileInfo $file, Tokens $tokens): void { - foreach($tokens as $index => $token) { - if (!$token->isGivenKind(T_DOC_COMMENT)) { - continue; - } - if (\stripos($token->getContent(), '@var') === false) { - continue; - } - - if (preg_match('#^/\*\*[\s\*]+(@var[^\r\n]+)[\s\*]*\*\/$#u', $token->getContent(), $matches) !== 1) { - continue; - } - $newContent = '/** ' . \rtrim($matches[1]) . ' */'; - if ($newContent === $token->getContent()) { - continue; - } - $tokens[$index] = new Token([T_DOC_COMMENT, $newContent]); - } - } - - public function getPriority(): int { - return 0; - } - - public function getName(): string { - return 'PharIo/phpdoc_single_line_var_fixer'; - } - - public function supports(\SplFileInfo $file): bool { - return true; - } - -} diff --git a/vendor/phar-io/manifest/tools/php-cs-fixer.d/header.txt b/vendor/phar-io/manifest/tools/php-cs-fixer.d/header.txt deleted file mode 100644 index dc8c4ff..0000000 --- a/vendor/phar-io/manifest/tools/php-cs-fixer.d/header.txt +++ /dev/null @@ -1,6 +0,0 @@ -This file is part of PharIo\Manifest. - -Copyright (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> and contributors - -For the full copyright and license information, please view the LICENSE -file that was distributed with this source code. diff --git a/vendor/phar-io/version/CHANGELOG.md b/vendor/phar-io/version/CHANGELOG.md deleted file mode 100644 index 4c0edfa..0000000 --- a/vendor/phar-io/version/CHANGELOG.md +++ /dev/null @@ -1,142 +0,0 @@ -# Changelog - -All notable changes to phar-io/version are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. - -## [3.2.1] - 2022-02-21 - -### Fixed - -- Have ExactVersionConstraint honor build metadata (added in 3.2.0) - - -## [3.2.0] - 2022-02-21 - -### Added - -- Build metadata is now supported and considered for equality checks only - - -## [3.1.1] - 2022-02-07 - -### Fixed - -- [#28](https://github.com/phar-io/version/issues/28): `VersionConstraintParser` does not support logical OR represented by single pipe (|) (Thanks @llaville) - - -## [3.1.0] - 2021-02-23 - -### Changed - -- Internal Refactoring -- More scalar types - -### Added - -- [#24](https://github.com/phar-io/version/issues/24): `Version::getOriginalString()` added (Thanks @addshore) -- Version constraints using the caret operator (`^`) now honor pre-1.0 releases, e.g. `^0.3` translates to `0.3.*`) -- Various integration tests for version constraint processing - -### Fixed - -- [#23](https://github.com/phar-io/version/pull/23): Tilde operator without patch level - - - -## [3.0.4] - 14.12.2020 - -### Fixed - -- [#22](https://github.com/phar-io/version/pull/22): make dev suffix rank works for uppercase too - -## [3.0.3] - 30.11.2020 - -### Added - -- Comparator method `Version::equals()` added - - -## [3.0.2] - 27.06.2020 - -This release now supports PHP 7.2+ and PHP ^8.0. No other changes included. - - -## [3.0.1] - 09.05.2020 - -__Potential BC Break Notice:__ -`Version::getVersionString()` no longer returns `v` prefixes in case the "input" -string contained one. These are not part of the semver specs -(see https://semver.org/#is-v123-a-semantic-version) and get stripped out. -As of Version 3.1.0 `Version::getOriginalString()` can be used to still -retrieve it as given. - -### Changed - -- Internal Refactoring -- More scalar types - -### Fixed - -- Fixed Constraint processing Regression for ^1.2 and ~1.2 - - -## [3.0.0] - 05.05.2020 - -### Changed - -- Require PHP 7.2+ -- All code now uses strict mode -- Scalar types have been added as needed - -### Added - -- The technically invalid format using 'v' prefix ("v1.2.3") is now properly supported - - -## [2.0.1] - 08.07.2018 - -### Fixed - -- Versions without a pre-release suffix are now always considered greater -than versions with a pre-release suffix. Example: `3.0.0 > 3.0.0-alpha.1` - - -## [2.0.0] - 23.06.2018 - -Changes to public API: - -- `PreReleaseSuffix::construct()`: optional parameter `$number` removed -- `PreReleaseSuffix::isGreaterThan()`: introduced -- `Version::hasPreReleaseSuffix()`: introduced - -### Added - -- [#11](https://github.com/phar-io/version/issues/11): Added support for pre-release version suffixes. Supported values are: - - `dev` - - `beta` (also abbreviated form `b`) - - `rc` - - `alpha` (also abbreviated form `a`) - - `patch` (also abbreviated form `p`) - - All values can be followed by a number, e.g. `beta3`. - - When comparing versions, the pre-release suffix is taken into account. Example: -`1.5.0 > 1.5.0-beta1 > 1.5.0-alpha3 > 1.5.0-alpha2 > 1.5.0-dev11` - -### Changed - -- reorganized the source directories - -### Fixed - -- [#10](https://github.com/phar-io/version/issues/10): Version numbers containing -a numeric suffix as seen in Debian packages are now supported. - - -[3.1.0]: https://github.com/phar-io/version/compare/3.0.4...3.1.0 -[3.0.4]: https://github.com/phar-io/version/compare/3.0.3...3.0.4 -[3.0.3]: https://github.com/phar-io/version/compare/3.0.2...3.0.3 -[3.0.2]: https://github.com/phar-io/version/compare/3.0.1...3.0.2 -[3.0.1]: https://github.com/phar-io/version/compare/3.0.0...3.0.1 -[3.0.0]: https://github.com/phar-io/version/compare/2.0.1...3.0.0 -[2.0.1]: https://github.com/phar-io/version/compare/2.0.0...2.0.1 -[2.0.0]: https://github.com/phar-io/version/compare/1.0.1...2.0.0 diff --git a/vendor/phar-io/version/LICENSE b/vendor/phar-io/version/LICENSE deleted file mode 100644 index ce32758..0000000 --- a/vendor/phar-io/version/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -Copyright (c) 2016-2017 Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de> and contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of the copyright holder nor the names of contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT * NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, -OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - diff --git a/vendor/phar-io/version/README.md b/vendor/phar-io/version/README.md deleted file mode 100644 index 76e6e98..0000000 --- a/vendor/phar-io/version/README.md +++ /dev/null @@ -1,61 +0,0 @@ -# Version - -Library for handling version information and constraints - -[![Build Status](https://travis-ci.org/phar-io/version.svg?branch=master)](https://travis-ci.org/phar-io/version) - -## Installation - -You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - - composer require phar-io/version - -If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - - composer require --dev phar-io/version - -## Version constraints - -A Version constraint describes a range of versions or a discrete version number. The format of version numbers follows the schema of [semantic versioning](http://semver.org): `<major>.<minor>.<patch>`. A constraint might contain an operator that describes the range. - -Beside the typical mathematical operators like `<=`, `>=`, there are two special operators: - -*Caret operator*: `^1.0` -can be written as `>=1.0.0 <2.0.0` and read as »every Version within major version `1`«. - -*Tilde operator*: `~1.0.0` -can be written as `>=1.0.0 <1.1.0` and read as »every version within minor version `1.1`. The behavior of tilde operator depends on whether a patch level version is provided or not. If no patch level is provided, tilde operator behaves like the caret operator: `~1.0` is identical to `^1.0`. - -## Usage examples - -Parsing version constraints and check discrete versions for compliance: - -```php - -use PharIo\Version\Version; -use PharIo\Version\VersionConstraintParser; - -$parser = new VersionConstraintParser(); -$caret_constraint = $parser->parse( '^7.0' ); - -$caret_constraint->complies( new Version( '7.0.17' ) ); // true -$caret_constraint->complies( new Version( '7.1.0' ) ); // true -$caret_constraint->complies( new Version( '6.4.34' ) ); // false - -$tilde_constraint = $parser->parse( '~1.1.0' ); - -$tilde_constraint->complies( new Version( '1.1.4' ) ); // true -$tilde_constraint->complies( new Version( '1.2.0' ) ); // false -``` - -As of version 2.0.0, pre-release labels are supported and taken into account when comparing versions: - -```php - -$leftVersion = new PharIo\Version\Version('3.0.0-alpha.1'); -$rightVersion = new PharIo\Version\Version('3.0.0-alpha.2'); - -$leftVersion->isGreaterThan($rightVersion); // false -$rightVersion->isGreaterThan($leftVersion); // true - -``` diff --git a/vendor/phar-io/version/composer.json b/vendor/phar-io/version/composer.json deleted file mode 100644 index 22687dc..0000000 --- a/vendor/phar-io/version/composer.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "phar-io/version", - "description": "Library for handling version information and constraints", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "support": { - "issues": "https://github.com/phar-io/version/issues" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "autoload": { - "classmap": [ - "src/" - ] - } -} - diff --git a/vendor/phar-io/version/src/BuildMetaData.php b/vendor/phar-io/version/src/BuildMetaData.php deleted file mode 100644 index d42f036..0000000 --- a/vendor/phar-io/version/src/BuildMetaData.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Version. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PharIo\Version; - -class BuildMetaData { - - /** @var string */ - private $value; - - public function __construct(string $value) { - $this->value = $value; - } - - public function asString(): string { - return $this->value; - } - - public function equals(BuildMetaData $other): bool { - return $this->asString() === $other->asString(); - } -} diff --git a/vendor/phar-io/version/src/PreReleaseSuffix.php b/vendor/phar-io/version/src/PreReleaseSuffix.php deleted file mode 100644 index 0056300..0000000 --- a/vendor/phar-io/version/src/PreReleaseSuffix.php +++ /dev/null @@ -1,82 +0,0 @@ -<?php declare(strict_types = 1); -namespace PharIo\Version; - -class PreReleaseSuffix { - private const valueScoreMap = [ - 'dev' => 0, - 'a' => 1, - 'alpha' => 1, - 'b' => 2, - 'beta' => 2, - 'rc' => 3, - 'p' => 4, - 'pl' => 4, - 'patch' => 4, - ]; - - /** @var string */ - private $value; - - /** @var int */ - private $valueScore; - - /** @var int */ - private $number = 0; - - /** @var string */ - private $full; - - /** - * @throws InvalidPreReleaseSuffixException - */ - public function __construct(string $value) { - $this->parseValue($value); - } - - public function asString(): string { - return $this->full; - } - - public function getValue(): string { - return $this->value; - } - - public function getNumber(): ?int { - return $this->number; - } - - public function isGreaterThan(PreReleaseSuffix $suffix): bool { - if ($this->valueScore > $suffix->valueScore) { - return true; - } - - if ($this->valueScore < $suffix->valueScore) { - return false; - } - - return $this->getNumber() > $suffix->getNumber(); - } - - private function mapValueToScore(string $value): int { - $value = \strtolower($value); - - return self::valueScoreMap[$value]; - } - - private function parseValue(string $value): void { - $regex = '/-?((dev|beta|b|rc|alpha|a|patch|p|pl)\.?(\d*)).*$/i'; - - if (\preg_match($regex, $value, $matches) !== 1) { - throw new InvalidPreReleaseSuffixException(\sprintf('Invalid label %s', $value)); - } - - $this->full = $matches[1]; - $this->value = $matches[2]; - - if ($matches[3] !== '') { - $this->number = (int)$matches[3]; - } - - $this->valueScore = $this->mapValueToScore($matches[2]); - } -} diff --git a/vendor/phar-io/version/src/Version.php b/vendor/phar-io/version/src/Version.php deleted file mode 100644 index 644af5c..0000000 --- a/vendor/phar-io/version/src/Version.php +++ /dev/null @@ -1,208 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Version. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PharIo\Version; - -class Version { - /** @var string */ - private $originalVersionString; - - /** @var VersionNumber */ - private $major; - - /** @var VersionNumber */ - private $minor; - - /** @var VersionNumber */ - private $patch; - - /** @var null|PreReleaseSuffix */ - private $preReleaseSuffix; - - /** @var null|BuildMetaData */ - private $buildMetadata; - - public function __construct(string $versionString) { - $this->ensureVersionStringIsValid($versionString); - $this->originalVersionString = $versionString; - } - - /** - * @throws NoPreReleaseSuffixException - */ - public function getPreReleaseSuffix(): PreReleaseSuffix { - if ($this->preReleaseSuffix === null) { - throw new NoPreReleaseSuffixException('No pre-release suffix set'); - } - - return $this->preReleaseSuffix; - } - - public function getOriginalString(): string { - return $this->originalVersionString; - } - - public function getVersionString(): string { - $str = \sprintf( - '%d.%d.%d', - $this->getMajor()->getValue() ?? 0, - $this->getMinor()->getValue() ?? 0, - $this->getPatch()->getValue() ?? 0 - ); - - if (!$this->hasPreReleaseSuffix()) { - return $str; - } - - return $str . '-' . $this->getPreReleaseSuffix()->asString(); - } - - public function hasPreReleaseSuffix(): bool { - return $this->preReleaseSuffix !== null; - } - - public function equals(Version $other): bool { - if ($this->getVersionString() !== $other->getVersionString()) { - return false; - } - - if ($this->hasBuildMetaData() !== $other->hasBuildMetaData()) { - return false; - } - - if ($this->hasBuildMetaData() && $other->hasBuildMetaData() && - !$this->getBuildMetaData()->equals($other->getBuildMetaData())) { - return false; - } - - return true; - } - - public function isGreaterThan(Version $version): bool { - if ($version->getMajor()->getValue() > $this->getMajor()->getValue()) { - return false; - } - - if ($version->getMajor()->getValue() < $this->getMajor()->getValue()) { - return true; - } - - if ($version->getMinor()->getValue() > $this->getMinor()->getValue()) { - return false; - } - - if ($version->getMinor()->getValue() < $this->getMinor()->getValue()) { - return true; - } - - if ($version->getPatch()->getValue() > $this->getPatch()->getValue()) { - return false; - } - - if ($version->getPatch()->getValue() < $this->getPatch()->getValue()) { - return true; - } - - if (!$version->hasPreReleaseSuffix() && !$this->hasPreReleaseSuffix()) { - return false; - } - - if ($version->hasPreReleaseSuffix() && !$this->hasPreReleaseSuffix()) { - return true; - } - - if (!$version->hasPreReleaseSuffix() && $this->hasPreReleaseSuffix()) { - return false; - } - - return $this->getPreReleaseSuffix()->isGreaterThan($version->getPreReleaseSuffix()); - } - - public function getMajor(): VersionNumber { - return $this->major; - } - - public function getMinor(): VersionNumber { - return $this->minor; - } - - public function getPatch(): VersionNumber { - return $this->patch; - } - - /** - * @psalm-assert-if-true BuildMetaData $this->buildMetadata - * @psalm-assert-if-true BuildMetaData $this->getBuildMetaData() - */ - public function hasBuildMetaData(): bool { - return $this->buildMetadata !== null; - } - - /** - * @throws NoBuildMetaDataException - */ - public function getBuildMetaData(): BuildMetaData { - if (!$this->hasBuildMetaData()) { - throw new NoBuildMetaDataException('No build metadata set'); - } - - return $this->buildMetadata; - } - - /** - * @param string[] $matches - * - * @throws InvalidPreReleaseSuffixException - */ - private function parseVersion(array $matches): void { - $this->major = new VersionNumber((int)$matches['Major']); - $this->minor = new VersionNumber((int)$matches['Minor']); - $this->patch = isset($matches['Patch']) ? new VersionNumber((int)$matches['Patch']) : new VersionNumber(0); - - if (isset($matches['PreReleaseSuffix']) && $matches['PreReleaseSuffix'] !== '') { - $this->preReleaseSuffix = new PreReleaseSuffix($matches['PreReleaseSuffix']); - } - - if (isset($matches['BuildMetadata'])) { - $this->buildMetadata = new BuildMetaData($matches['BuildMetadata']); - } - } - - /** - * @param string $version - * - * @throws InvalidVersionException - */ - private function ensureVersionStringIsValid($version): void { - $regex = '/^v? - (?P<Major>0|[1-9]\d*) - \\. - (?P<Minor>0|[1-9]\d*) - (\\. - (?P<Patch>0|[1-9]\d*) - )? - (?: - - - (?<PreReleaseSuffix>(?:(dev|beta|b|rc|alpha|a|patch|p|pl)\.?\d*)) - )? - (?: - \\+ - (?P<BuildMetadata>[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-@]+)*) - )? - $/xi'; - - if (\preg_match($regex, $version, $matches) !== 1) { - throw new InvalidVersionException( - \sprintf("Version string '%s' does not follow SemVer semantics", $version) - ); - } - - $this->parseVersion($matches); - } -} diff --git a/vendor/phar-io/version/src/VersionConstraintParser.php b/vendor/phar-io/version/src/VersionConstraintParser.php deleted file mode 100644 index 03d6a09..0000000 --- a/vendor/phar-io/version/src/VersionConstraintParser.php +++ /dev/null @@ -1,115 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Version. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PharIo\Version; - -class VersionConstraintParser { - /** - * @throws UnsupportedVersionConstraintException - */ - public function parse(string $value): VersionConstraint { - if (\strpos($value, '|') !== false) { - return $this->handleOrGroup($value); - } - - if (!\preg_match('/^[\^~*]?v?[\d.*]+(?:-.*)?$/i', $value)) { - throw new UnsupportedVersionConstraintException( - \sprintf('Version constraint %s is not supported.', $value) - ); - } - - switch ($value[0]) { - case '~': - return $this->handleTildeOperator($value); - case '^': - return $this->handleCaretOperator($value); - } - - $constraint = new VersionConstraintValue($value); - - if ($constraint->getMajor()->isAny()) { - return new AnyVersionConstraint(); - } - - if ($constraint->getMinor()->isAny()) { - return new SpecificMajorVersionConstraint( - $constraint->getVersionString(), - $constraint->getMajor()->getValue() ?? 0 - ); - } - - if ($constraint->getPatch()->isAny()) { - return new SpecificMajorAndMinorVersionConstraint( - $constraint->getVersionString(), - $constraint->getMajor()->getValue() ?? 0, - $constraint->getMinor()->getValue() ?? 0 - ); - } - - return new ExactVersionConstraint($constraint->getVersionString()); - } - - private function handleOrGroup(string $value): OrVersionConstraintGroup { - $constraints = []; - - foreach (\preg_split('{\s*\|\|?\s*}', \trim($value)) as $groupSegment) { - $constraints[] = $this->parse(\trim($groupSegment)); - } - - return new OrVersionConstraintGroup($value, $constraints); - } - - private function handleTildeOperator(string $value): AndVersionConstraintGroup { - $constraintValue = new VersionConstraintValue(\substr($value, 1)); - - if ($constraintValue->getPatch()->isAny()) { - return $this->handleCaretOperator($value); - } - - $constraints = [ - new GreaterThanOrEqualToVersionConstraint( - $value, - new Version(\substr($value, 1)) - ), - new SpecificMajorAndMinorVersionConstraint( - $value, - $constraintValue->getMajor()->getValue() ?? 0, - $constraintValue->getMinor()->getValue() ?? 0 - ) - ]; - - return new AndVersionConstraintGroup($value, $constraints); - } - - private function handleCaretOperator(string $value): AndVersionConstraintGroup { - $constraintValue = new VersionConstraintValue(\substr($value, 1)); - - $constraints = [ - new GreaterThanOrEqualToVersionConstraint($value, new Version(\substr($value, 1))) - ]; - - if ($constraintValue->getMajor()->getValue() === 0) { - $constraints[] = new SpecificMajorAndMinorVersionConstraint( - $value, - $constraintValue->getMajor()->getValue() ?? 0, - $constraintValue->getMinor()->getValue() ?? 0 - ); - } else { - $constraints[] = new SpecificMajorVersionConstraint( - $value, - $constraintValue->getMajor()->getValue() ?? 0 - ); - } - - return new AndVersionConstraintGroup( - $value, - $constraints - ); - } -} diff --git a/vendor/phar-io/version/src/VersionConstraintValue.php b/vendor/phar-io/version/src/VersionConstraintValue.php deleted file mode 100644 index 0762e7c..0000000 --- a/vendor/phar-io/version/src/VersionConstraintValue.php +++ /dev/null @@ -1,88 +0,0 @@ -<?php declare(strict_types = 1); -namespace PharIo\Version; - -class VersionConstraintValue { - /** @var VersionNumber */ - private $major; - - /** @var VersionNumber */ - private $minor; - - /** @var VersionNumber */ - private $patch; - - /** @var string */ - private $label = ''; - - /** @var string */ - private $buildMetaData = ''; - - /** @var string */ - private $versionString = ''; - - public function __construct(string $versionString) { - $this->versionString = $versionString; - - $this->parseVersion($versionString); - } - - public function getLabel(): string { - return $this->label; - } - - public function getBuildMetaData(): string { - return $this->buildMetaData; - } - - public function getVersionString(): string { - return $this->versionString; - } - - public function getMajor(): VersionNumber { - return $this->major; - } - - public function getMinor(): VersionNumber { - return $this->minor; - } - - public function getPatch(): VersionNumber { - return $this->patch; - } - - private function parseVersion(string $versionString): void { - $this->extractBuildMetaData($versionString); - $this->extractLabel($versionString); - $this->stripPotentialVPrefix($versionString); - - $versionSegments = \explode('.', $versionString); - $this->major = new VersionNumber(\is_numeric($versionSegments[0]) ? (int)$versionSegments[0] : null); - - $minorValue = isset($versionSegments[1]) && \is_numeric($versionSegments[1]) ? (int)$versionSegments[1] : null; - $patchValue = isset($versionSegments[2]) && \is_numeric($versionSegments[2]) ? (int)$versionSegments[2] : null; - - $this->minor = new VersionNumber($minorValue); - $this->patch = new VersionNumber($patchValue); - } - - private function extractBuildMetaData(string &$versionString): void { - if (\preg_match('/\+(.*)/', $versionString, $matches) === 1) { - $this->buildMetaData = $matches[1]; - $versionString = \str_replace($matches[0], '', $versionString); - } - } - - private function extractLabel(string &$versionString): void { - if (\preg_match('/-(.*)/', $versionString, $matches) === 1) { - $this->label = $matches[1]; - $versionString = \str_replace($matches[0], '', $versionString); - } - } - - private function stripPotentialVPrefix(string &$versionString): void { - if ($versionString[0] !== 'v') { - return; - } - $versionString = \substr($versionString, 1); - } -} diff --git a/vendor/phar-io/version/src/VersionNumber.php b/vendor/phar-io/version/src/VersionNumber.php deleted file mode 100644 index 4833a9b..0000000 --- a/vendor/phar-io/version/src/VersionNumber.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Version. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PharIo\Version; - -class VersionNumber { - - /** @var ?int */ - private $value; - - public function __construct(?int $value) { - $this->value = $value; - } - - public function isAny(): bool { - return $this->value === null; - } - - public function getValue(): ?int { - return $this->value; - } -} diff --git a/vendor/phar-io/version/src/constraints/AbstractVersionConstraint.php b/vendor/phar-io/version/src/constraints/AbstractVersionConstraint.php deleted file mode 100644 index 66201a1..0000000 --- a/vendor/phar-io/version/src/constraints/AbstractVersionConstraint.php +++ /dev/null @@ -1,23 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Version. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PharIo\Version; - -abstract class AbstractVersionConstraint implements VersionConstraint { - /** @var string */ - private $originalValue; - - public function __construct(string $originalValue) { - $this->originalValue = $originalValue; - } - - public function asString(): string { - return $this->originalValue; - } -} diff --git a/vendor/phar-io/version/src/constraints/AndVersionConstraintGroup.php b/vendor/phar-io/version/src/constraints/AndVersionConstraintGroup.php deleted file mode 100644 index 5096f2f..0000000 --- a/vendor/phar-io/version/src/constraints/AndVersionConstraintGroup.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Version. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PharIo\Version; - -class AndVersionConstraintGroup extends AbstractVersionConstraint { - /** @var VersionConstraint[] */ - private $constraints = []; - - /** - * @param VersionConstraint[] $constraints - */ - public function __construct(string $originalValue, array $constraints) { - parent::__construct($originalValue); - - $this->constraints = $constraints; - } - - public function complies(Version $version): bool { - foreach ($this->constraints as $constraint) { - if (!$constraint->complies($version)) { - return false; - } - } - - return true; - } -} diff --git a/vendor/phar-io/version/src/constraints/AnyVersionConstraint.php b/vendor/phar-io/version/src/constraints/AnyVersionConstraint.php deleted file mode 100644 index 1499f07..0000000 --- a/vendor/phar-io/version/src/constraints/AnyVersionConstraint.php +++ /dev/null @@ -1,20 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Version. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PharIo\Version; - -class AnyVersionConstraint implements VersionConstraint { - public function complies(Version $version): bool { - return true; - } - - public function asString(): string { - return '*'; - } -} diff --git a/vendor/phar-io/version/src/constraints/ExactVersionConstraint.php b/vendor/phar-io/version/src/constraints/ExactVersionConstraint.php deleted file mode 100644 index 1d675c9..0000000 --- a/vendor/phar-io/version/src/constraints/ExactVersionConstraint.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Version. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PharIo\Version; - -class ExactVersionConstraint extends AbstractVersionConstraint { - public function complies(Version $version): bool { - $other = $version->getVersionString(); - - if ($version->hasBuildMetaData()) { - $other .= '+' . $version->getBuildMetaData()->asString(); - } - - return $this->asString() === $other; - } -} diff --git a/vendor/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php b/vendor/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php deleted file mode 100644 index ec37172..0000000 --- a/vendor/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php +++ /dev/null @@ -1,26 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Version. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PharIo\Version; - -class GreaterThanOrEqualToVersionConstraint extends AbstractVersionConstraint { - /** @var Version */ - private $minimalVersion; - - public function __construct(string $originalValue, Version $minimalVersion) { - parent::__construct($originalValue); - - $this->minimalVersion = $minimalVersion; - } - - public function complies(Version $version): bool { - return $version->getVersionString() === $this->minimalVersion->getVersionString() - || $version->isGreaterThan($this->minimalVersion); - } -} diff --git a/vendor/phar-io/version/src/constraints/OrVersionConstraintGroup.php b/vendor/phar-io/version/src/constraints/OrVersionConstraintGroup.php deleted file mode 100644 index 59fd382..0000000 --- a/vendor/phar-io/version/src/constraints/OrVersionConstraintGroup.php +++ /dev/null @@ -1,35 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Version. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PharIo\Version; - -class OrVersionConstraintGroup extends AbstractVersionConstraint { - /** @var VersionConstraint[] */ - private $constraints = []; - - /** - * @param string $originalValue - * @param VersionConstraint[] $constraints - */ - public function __construct($originalValue, array $constraints) { - parent::__construct($originalValue); - - $this->constraints = $constraints; - } - - public function complies(Version $version): bool { - foreach ($this->constraints as $constraint) { - if ($constraint->complies($version)) { - return true; - } - } - - return false; - } -} diff --git a/vendor/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php b/vendor/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php deleted file mode 100644 index 302aa31..0000000 --- a/vendor/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php +++ /dev/null @@ -1,33 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Version. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PharIo\Version; - -class SpecificMajorAndMinorVersionConstraint extends AbstractVersionConstraint { - /** @var int */ - private $major; - - /** @var int */ - private $minor; - - public function __construct(string $originalValue, int $major, int $minor) { - parent::__construct($originalValue); - - $this->major = $major; - $this->minor = $minor; - } - - public function complies(Version $version): bool { - if ($version->getMajor()->getValue() !== $this->major) { - return false; - } - - return $version->getMinor()->getValue() === $this->minor; - } -} diff --git a/vendor/phar-io/version/src/constraints/SpecificMajorVersionConstraint.php b/vendor/phar-io/version/src/constraints/SpecificMajorVersionConstraint.php deleted file mode 100644 index 968b809..0000000 --- a/vendor/phar-io/version/src/constraints/SpecificMajorVersionConstraint.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Version. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PharIo\Version; - -class SpecificMajorVersionConstraint extends AbstractVersionConstraint { - /** @var int */ - private $major; - - public function __construct(string $originalValue, int $major) { - parent::__construct($originalValue); - - $this->major = $major; - } - - public function complies(Version $version): bool { - return $version->getMajor()->getValue() === $this->major; - } -} diff --git a/vendor/phar-io/version/src/constraints/VersionConstraint.php b/vendor/phar-io/version/src/constraints/VersionConstraint.php deleted file mode 100644 index e94f9e0..0000000 --- a/vendor/phar-io/version/src/constraints/VersionConstraint.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Version. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PharIo\Version; - -interface VersionConstraint { - public function complies(Version $version): bool; - - public function asString(): string; -} diff --git a/vendor/phar-io/version/src/exceptions/Exception.php b/vendor/phar-io/version/src/exceptions/Exception.php deleted file mode 100644 index 3ea458f..0000000 --- a/vendor/phar-io/version/src/exceptions/Exception.php +++ /dev/null @@ -1,15 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Version. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PharIo\Version; - -use Throwable; - -interface Exception extends Throwable { -} diff --git a/vendor/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php b/vendor/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php deleted file mode 100644 index bc0b0c3..0000000 --- a/vendor/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php +++ /dev/null @@ -1,5 +0,0 @@ -<?php declare(strict_types = 1); -namespace PharIo\Version; - -class InvalidPreReleaseSuffixException extends \Exception implements Exception { -} diff --git a/vendor/phar-io/version/src/exceptions/InvalidVersionException.php b/vendor/phar-io/version/src/exceptions/InvalidVersionException.php deleted file mode 100644 index e9e9310..0000000 --- a/vendor/phar-io/version/src/exceptions/InvalidVersionException.php +++ /dev/null @@ -1,5 +0,0 @@ -<?php declare(strict_types = 1); -namespace PharIo\Version; - -class InvalidVersionException extends \InvalidArgumentException implements Exception { -} diff --git a/vendor/phar-io/version/src/exceptions/NoBuildMetaDataException.php b/vendor/phar-io/version/src/exceptions/NoBuildMetaDataException.php deleted file mode 100644 index 09e9bee..0000000 --- a/vendor/phar-io/version/src/exceptions/NoBuildMetaDataException.php +++ /dev/null @@ -1,5 +0,0 @@ -<?php declare(strict_types = 1); -namespace PharIo\Version; - -class NoBuildMetaDataException extends \Exception implements Exception { -} diff --git a/vendor/phar-io/version/src/exceptions/NoPreReleaseSuffixException.php b/vendor/phar-io/version/src/exceptions/NoPreReleaseSuffixException.php deleted file mode 100644 index aa0b20f..0000000 --- a/vendor/phar-io/version/src/exceptions/NoPreReleaseSuffixException.php +++ /dev/null @@ -1,5 +0,0 @@ -<?php declare(strict_types = 1); -namespace PharIo\Version; - -class NoPreReleaseSuffixException extends \Exception implements Exception { -} diff --git a/vendor/phar-io/version/src/exceptions/UnsupportedVersionConstraintException.php b/vendor/phar-io/version/src/exceptions/UnsupportedVersionConstraintException.php deleted file mode 100644 index 6d98e82..0000000 --- a/vendor/phar-io/version/src/exceptions/UnsupportedVersionConstraintException.php +++ /dev/null @@ -1,13 +0,0 @@ -<?php declare(strict_types = 1); -/* - * This file is part of PharIo\Version. - * - * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PharIo\Version; - -final class UnsupportedVersionConstraintException extends \RuntimeException implements Exception { -} diff --git a/vendor/phpcompatibility/php-compatibility/CHANGELOG.md b/vendor/phpcompatibility/php-compatibility/CHANGELOG.md deleted file mode 100644 index b92ae25..0000000 --- a/vendor/phpcompatibility/php-compatibility/CHANGELOG.md +++ /dev/null @@ -1,1488 +0,0 @@ -# Change Log for the PHPCompatibility standard for PHP Codesniffer - -All notable changes to this project will be documented in this file. - -This projects adheres to [Keep a CHANGELOG](http://keepachangelog.com/). - -Up to version 8.0.0, the `major.minor` version numbers were based on the PHP version for which compatibility check support was added, with `patch` version numbers being specific to this library. -From version 8.0.0 onwards, [Semantic Versioning](http://semver.org/) is used. - -<!-- Legend to the icons used: https://github.com/PHPCompatibility/PHPCompatibility/pull/506#discussion_r131650488 --> - - -## [Unreleased] - -_Nothing yet._ - -## [9.3.5] - 2019-12-27 - -See all related issues and PRs in the [9.3.5 milestone]. - -### Added -- :star: `PHPCompatibility.Classes.NewClasses` sniff: recognize the new `FFI` extension related classes as introduced in PHP 7.4. [#949](https://github.com/PHPCompatibility/PHPCompatibility/pull/949) -- :star: `PHPCompatibility.IniDirectives.NewIniDirectives` sniff: detect use of the new `FFI` extension related ini directives as introduced in PHP 7.4. [#949](https://github.com/PHPCompatibility/PHPCompatibility/pull/949) - -### Changed -- :pencil: `PHPCompatibility.Syntax.NewShortArray`: improved clarity of the error message and made it consistent with other error messages in this standard. [#934](https://github.com/PHPCompatibility/PHPCompatibility/pull/934) -- :pencil: `PHPCompatibility.Interfaces.NewInterfaces`: updated the URL which is mentioned in select error messages. [#942](https://github.com/PHPCompatibility/PHPCompatibility/pull/942) -- :recycle: Another slew of code documentation fixes. [#937](https://github.com/PHPCompatibility/PHPCompatibility/pull/937), [#939](https://github.com/PHPCompatibility/PHPCompatibility/pull/939), [#940](https://github.com/PHPCompatibility/PHPCompatibility/pull/940), [#941](https://github.com/PHPCompatibility/PHPCompatibility/pull/941), [#943](https://github.com/PHPCompatibility/PHPCompatibility/pull/943), [#944](https://github.com/PHPCompatibility/PHPCompatibility/pull/944), [#951](https://github.com/PHPCompatibility/PHPCompatibility/pull/951), [#950](https://github.com/PHPCompatibility/PHPCompatibility/pull/950). Fixes [#734](https://github.com/PHPCompatibility/PHPCompatibility/issues/734). -- :green_heart: Travis: various tweaks. The builds against PHP 7.4 are no longer allowed to fail. [#935](https://github.com/PHPCompatibility/PHPCompatibility/pull/935), [#938](https://github.com/PHPCompatibility/PHPCompatibility/pull/938) - For running the sniffs on PHP 7.4, it is recommended to use PHP_CodeSniffer 3.5.0+ as PHP_CodeSniffer itself is - not compatible with PHP 7.4 until version 3.5.0. - -### Fixed -- :bug: `PHPCompatibility.Classes.NewClasses`: two new PHP 7.4 classes were being checked as if they were Exceptions. [#945](https://github.com/PHPCompatibility/PHPCompatibility/pull/945) - -### Credits -Thanks go out to [William Entriken] for their contribution to this version. :clap: - - -## [9.3.4] - 2019-11-15 - -See all related issues and PRs in the [9.3.4 milestone]. - -### Fixed -- :bug: `PHPCompatibility.Keywords.ForbiddenNames`: false positive for list when used in a `foreach()` condition. [#930](https://github.com/PHPCompatibility/PHPCompatibility/pull/930). Fixes [#928](https://github.com/PHPCompatibility/PHPCompatibility/issues/928), [#929](https://github.com/PHPCompatibility/PHPCompatibility/pull/929) - -### Credits -Thanks go out to [Sergii Bondarenko] for their contribution to this version. :clap: - - -## [9.3.3] - 2019-11-11 - -See all related issues and PRs in the [9.3.3 milestone]. - -### Added -- :star: `PHPCompatibility.Constants.NewConstants` sniff: detection of yet more (undocumented) PHP 7.2 Sodium constants. [#924](https://github.com/PHPCompatibility/PHPCompatibility/pull/924) -- :star: `PHPCompatibility.Keywords.ForbiddenNames` sniff: detect the use of more reserved keywords which are not allowed to be used to name certain constructs. [#923](https://github.com/PHPCompatibility/PHPCompatibility/pull/923). Fixes [#922](https://github.com/PHPCompatibility/PHPCompatibility/issues/922) - -### Fixed -- :bug: `PHPCompatibility.FunctionNameRestrictions.RemovedPHP4StyleConstructors`: false positive detecting PHP4-style constructors when declared in interfaces. The class implementing the interface will not have the same name as the interface, so the actual method would not be regarded as a PHP4 style constructor. [#921](https://github.com/PHPCompatibility/PHPCompatibility/pull/921) - -### Credits -Thanks go out to [Nikhil] for their contribution to this version. :clap: - - -## [9.3.2] - 2019-10-16 - -See all related issues and PRs in the [9.3.2 milestone]. - -### Added -- :star: `PHPCompatibility.Constants.NewConstants` sniff: detection of the PHP 7.2 `SODIUM_CRYPTO_PWHASH_ALG_ARGON2ID13` constant. [#915](https://github.com/PHPCompatibility/PHPCompatibility/pull/915) -- :books: Readme: a list of projects which are build upon or extend PHPCompatibility. [#904](https://github.com/PHPCompatibility/PHPCompatibility/pull/904) - -### Changed -- :pushpin: `PHPCompatibility.FunctionNameRestrictions.RemovedPHP4StyleConstructors`: minor efficiency fix to make the sniff faster. [#912](https://github.com/PHPCompatibility/PHPCompatibility/pull/912) -- :pushpin: `PHPCompatibility.FunctionNameRestrictions.ReservedFunctionNames`: functions marked as `@deprecated` in the function docblock will now be ignored by this sniff. [#917](https://github.com/PHPCompatibility/PHPCompatibility/pull/917). Fixes [#911](https://github.com/PHPCompatibility/PHPCompatibility/issues/911) -- :pencil: `PHPCompatibility.FunctionDeclarations.ForbiddenToStringParameters`: the `$ooScopeTokens` property is now `protected`, it should never have been `public` in the first place. [#907](https://github.com/PHPCompatibility/PHPCompatibility/pull/907) -- :recycle: More code documentation fixes. [#903](https://github.com/PHPCompatibility/PHPCompatibility/pull/903), [#916](https://github.com/PHPCompatibility/PHPCompatibility/pull/916) -- :books: Readme/Contributing: various tweaks. [#904](https://github.com/PHPCompatibility/PHPCompatibility/pull/904), [#905](https://github.com/PHPCompatibility/PHPCompatibility/pull/905) - -### Fixed -- :bug: `PHPCompatibility.FunctionUse.OptionalToRequiredFunctionParameters`: false positive when a class is instantiated which has the same name as one of the affected functions. [#914](https://github.com/PHPCompatibility/PHPCompatibility/pull/914). Fixes [#913](https://github.com/PHPCompatibility/PHPCompatibility/issues/913) -- :bug: `PHPCompatibility.FunctionUse.RequiredToOptionalFunctionParameters`: false positive when a class is instantiated which has the same name as one of the affected functions. [#914](https://github.com/PHPCompatibility/PHPCompatibility/pull/914) -- :bug: `PHPCompatibility.MethodUse.NewDirectCallsToClone`: false positive on calling `__clone()` from within the class being cloned [#910](https://github.com/PHPCompatibility/PHPCompatibility/pull/910). Fixes [#629 (comment)](https://github.com/PHPCompatibility/PHPCompatibility/issues/629#issuecomment-532607809) -- :bug: `PHPCompatibility.Miscellaneous.ValidIntegers`: binary numbers using an uppercase `B` were not always recognized correctly. [#909](https://github.com/PHPCompatibility/PHPCompatibility/pull/909) - - -## [9.3.1] - 2019-09-06 - -See all related issues and PRs in the [9.3.1 milestone]. - -### Changed -- :recycle: A whole slew of code documentation fixes. [#892](https://github.com/PHPCompatibility/PHPCompatibility/pull/892), [#895](https://github.com/PHPCompatibility/PHPCompatibility/pull/895), [#896](https://github.com/PHPCompatibility/PHPCompatibility/pull/896), [#897](https://github.com/PHPCompatibility/PHPCompatibility/pull/897), [#898](https://github.com/PHPCompatibility/PHPCompatibility/pull/898), [#899](https://github.com/PHPCompatibility/PHPCompatibility/pull/899), [#900](https://github.com/PHPCompatibility/PHPCompatibility/pull/900) -- :wrench: Travis: minor tweaks to the build script. [#893](https://github.com/PHPCompatibility/PHPCompatibility/pull/893) - -### Fixed -- :bug: `PHPCompatibility.ParameterValues.RemovedImplodeFlexibleParamOrder`: false positive when an array item in the second parameter contained a ternary. [#891](https://github.com/PHPCompatibility/PHPCompatibility/pull/891). Fixes [#890](https://github.com/PHPCompatibility/PHPCompatibility/issues/890) -- :bug: `PHPCompatibility.ParameterValues.RemovedImplodeFlexibleParamOrder`: will now take array casts into account when determining which parameter is `$pieces`. [#891](https://github.com/PHPCompatibility/PHPCompatibility/pull/891). -- :bug: `PHPCompatibility.ParameterValues.RemovedImplodeFlexibleParamOrder`: hardening of the logic to not examine the second parameter when the first is just and only a text string (`$glue`). [#891](https://github.com/PHPCompatibility/PHPCompatibility/pull/891). - - -## [9.3.0] - 2019-08-29 - -See all related issues and PRs in the [9.3.0 milestone]. - -To keep informed of the progress of covering "_everything PHP 7.4_" in PHPCompatibility, please subscribe to issue [#808](https://github.com/PHPCompatibility/PHPCompatibility/issues/808). - -### Changes expected in PHPCompatibility 10.0.0 -The next version of PHPCompatibility is expected to include a new external dependency. - -In this same release, support for PHP < 5.4 and PHP_CodeSniffer < 2.6.0 will be dropped. - -The `10.0.0` release is expected around the same time as the release of PHP 7.4 - end of November/beginning of December 2019. - -### Added -- :star2: New `PHPCompatibility.Miscellaneous.NewPHPOpenTagEOF` sniff to detect a stand-alone PHP open tag at the end of a file, without trailing newline, as will be supported as of PHP 7.4. [#843](https://github.com/PHPCompatibility/PHPCompatibility/pull/846) -- :star2: New `PHPCompatibility.ParameterValues.ForbiddenStripTagsSelfClosingXHTML` sniff to detect calls to `strip_tags()` passing self-closing XHTML tags in the `$allowable_tags` parameter. This has not been supported since PHP 5.3.4. [#866](https://github.com/PHPCompatibility/PHPCompatibility/pull/866) -- :star2: New `PHPCompatibility.ParameterValues.NewHTMLEntitiesEncodingDefault` sniff to detect calls to `html_entity_decode()`, `htmlentities()` and `htmlspecialchars()` which are impacted by the change to the default value of the `$encoding` parameter in PHP 5.4. [#862](https://github.com/PHPCompatibility/PHPCompatibility/pull/862) -- :star2: New `PHPCompatibility.ParameterValues.NewIconvMbstringCharsetDefault` sniff to detect code impacted by the change in the `default_charset` value in PHP 5.6. [#864](https://github.com/PHPCompatibility/PHPCompatibility/pull/864) Fixes [#839](https://github.com/PHPCompatibility/PHPCompatibility/issues/839) -- :star2: New `PHPCompatibility.ParameterValues.NewIDNVariantDefault` sniff to detect calls to `idn_to_ascii()` and `idn_to_utf8()` impacted by the PHP 7.4 change in the default value for the `$variant` parameter. [#861](https://github.com/PHPCompatibility/PHPCompatibility/pull/861) -- :star2: New `PHPCompatibility.ParameterValues.NewPasswordAlgoConstantValues` sniff to detect calls to `password_hash()` and `password_needs_rehash()` impacted by the changed value of the `PASSWORD_DEFAULT`, `PASSWORD_BCRYPT`, `PASSWORD_ARGON2I` and `PASSWORD_ARGON2ID` constants in PHP 7.4. [#865](https://github.com/PHPCompatibility/PHPCompatibility/pull/865) -- :star2: New `PHPCompatibility.ParameterValues.NewProcOpenCmdArray` sniff to detect calls to `proc_open()` passing an array for the `$cmd` parameter as supported as of PHP 7.4. [#869](https://github.com/PHPCompatibility/PHPCompatibility/pull/869) -- :star2: New `PHPCompatibility.ParameterValues.NewStripTagsAllowableTagsArray` sniff to detect calls to `strip_tags()` passing an array for the `$allowable_tags` parameter as will be supported as of PHP 7.4. [#867](https://github.com/PHPCompatibility/PHPCompatibility/pull/867) -- :star2: New `PHPCompatibility.ParameterValues.RemovedImplodeFlexibleParamOrder` sniff to detect `implode()` being called with `$glue` and `$pieces` in reverse order from the documented argument order. This was previously allowed for historical reasons, but will be deprecated in PHP 7.4. [#846](https://github.com/PHPCompatibility/PHPCompatibility/pull/846) -- :star2: New `PHPCompatibility.ParameterValues.RemovedMbStrrposEncodingThirdParam` sniff to detect the `$encoding` being passed as the third, instead of the fourth parameter, to `mb_strrpos()` as has been soft deprecated since PHP 5.2 and will be hard deprecated as of PHP 7.4. [#860](https://github.com/PHPCompatibility/PHPCompatibility/pull/860) -- :star2: New `PHPCompatibility.Syntax.RemovedCurlyBraceArrayAccess` sniff to detect array and string offset access using curly braces as will be deprecated as of PHP 7.4. [#855](https://github.com/PHPCompatibility/PHPCompatibility/pull/855) - - In contrast to any other sniff in the PHPCompatibility standard, this sniff contains an auto-fixer. -- :star2: New `PHPCompatibility.TextStrings.NewUnicodeEscapeSequence` sniff to detect use of the PHP 7.0+ unicode codepoint escape sequences and issues with invalid sequences. [#856](https://github.com/PHPCompatibility/PHPCompatibility/pull/856) -- :star2: New `PHPCompatibility.Upgrade.LowPHP` sniff to give users of old PHP versions advance warning when support will be dropped in the near future. [#838](https://github.com/PHPCompatibility/PHPCompatibility/pull/838) - At this moment, the intention is to drop support for PHP 5.3 by the end of this year. -- :star: `PHPCompatibility.Classes.NewClasses` sniff: recognize the new `WeakReference` class as introduced in PHP 7.4. [#857](https://github.com/PHPCompatibility/PHPCompatibility/pull/857) -- :star: `PHPCompatibility.Constants.NewConstants` sniff: detection of new Curl constants as introduced in PHP 7.3.5. [#878](https://github.com/PHPCompatibility/PHPCompatibility/pull/878) -- :star: `PHPCompatibility.Constants.NewConstants` sniff: detection of the revived `T_BAD_CHARACTER` constant as re-introduced in PHP 7.4. [#882](https://github.com/PHPCompatibility/PHPCompatibility/pull/882) -- :star: `PHPCompatibility.Constants.NewConstants` sniff: detection of the new `IMG_FILTER_SCATTER` and `PASSWORD_ARGON2_PROVIDER` constants as introduced in PHP 7.4. [#887](https://github.com/PHPCompatibility/PHPCompatibility/pull/887) -- :star: `PHPCompatibility.Constants.RemovedConstants` sniff: detection of use of the `CURLPIPE_HTTP1` constant which will be deprecated in PHP 7.4. [#879](https://github.com/PHPCompatibility/PHPCompatibility/pull/879) -- :star: `PHPCompatibility.Constants.RemovedConstants` sniff: detection of use of the `FILTER_SANITIZE_MAGIC_QUOTES` constant which will be deprecated in PHP 7.4. [#845](https://github.com/PHPCompatibility/PHPCompatibility/pull/845) -- :star: `PHPCompatibility.Constants.RemovedConstants` sniff: detection of use of the `T_CHARACTER` and `T_BAD_CHARACTER` constants which were removed in PHP 7.0. [#882](https://github.com/PHPCompatibility/PHPCompatibility/pull/882) -- :star: `PHPCompatibility.FunctionDeclarations.NewMagicMethods` sniff: recognize the new `__serialize()` and `__unserialize()` magic methods as introduced in PHP 7.4. [#868](https://github.com/PHPCompatibility/PHPCompatibility/pull/868) -- :star: `PHPCompatibility.FunctionDeclarations.NewMagicMethods` sniff: recognize the PHP 5.0 `__construct()` and `__destruct()` magic methods. [#884](https://github.com/PHPCompatibility/PHPCompatibility/pull/884) -- :star: `PHPCompatibility.FunctionDeclarations.NonStaticMagicMethods` sniff: recognize the new `__serialize()` and `__unserialize()` magic methods as introduced in PHP 7.4. [#868](https://github.com/PHPCompatibility/PHPCompatibility/pull/868) -- :star: `PHPCompatibility.FunctionUse.NewFunctions` sniff: recognize the new PHP 7.4 function `imagecreatefromtga()`. [#873](https://github.com/PHPCompatibility/PHPCompatibility/pull/873) -- :star: `PHPCompatibility.FunctionUse.RemovedFunctionParameters` sniff: recognize the deprecation of the `$age` parameter of the `curl_version()` function. [#874](https://github.com/PHPCompatibility/PHPCompatibility/pull/874) -- :star: `PHPCompatibility.FunctionUse.RemovedFunctions` sniff: recognize the PHP 7.4 deprecated `convert_cyr_string()()`, `ezmlm_hash()`, `get_magic_quotes_gpc()`, `get_magic_quotes_runtime()`, `hebrevc()`, `is_real()`, `money_format()` and `restore_include_path()` functions. [#847](https://github.com/PHPCompatibility/PHPCompatibility/pull/847) -- :star: `PHPCompatibility.IniDirectives.NewIniDirectives` sniff: detect use of the new PHP 7.4 `zend.exception_ignore_args` ini directive. [#871](https://github.com/PHPCompatibility/PHPCompatibility/pull/871) -- :star: `PHPCompatibility.IniDirectives.RemovedIniDirectives` sniff: detect use of the `allow_url_include` ini directive which is deprecated as of PHP 7.4. [#870](https://github.com/PHPCompatibility/PHPCompatibility/pull/870) -- :star: `PHPCompatibility.IniDirectives.RemovedIniDirectives` sniff: detection of use of the `opcache.load_comments` directive which was removed in PHP 7.0. [#883](https://github.com/PHPCompatibility/PHPCompatibility/pull/883) -- :star: `PHPCompatibility.ParameterValues.NewHashAlgorithms`: recognize use of the new PHP 7.4 `crc32c` hash algorithm. [#872](https://github.com/PHPCompatibility/PHPCompatibility/pull/872) -- :star: `PHPCompatibility.TypeCasts.RemovedTypeCasts` sniff: detect usage of the `(real)` type cast which will be deprecated in PHP 7.4. [#844](https://github.com/PHPCompatibility/PHPCompatibility/pull/844) -- :star: Recognize the `recode` extension functionality which will be removed in PHP 7.4 (moved to PECL) in the `RemovedExtensions` and `RemovedFunctions` sniffs. [#841](https://github.com/PHPCompatibility/PHPCompatibility/pull/841) -- :star: Recognize the `OPcache` extension functionality which was be introduced in PHP 5.5, but not yet fully accounted for in the `NewFunctions` and `NewIniDirectives` sniffs. [#883](https://github.com/PHPCompatibility/PHPCompatibility/pull/883) -- :star: New `getCompleteTextString()` utility method to the `PHPCompatibility\Sniff` class. [#856](https://github.com/PHPCompatibility/PHPCompatibility/pull/856) -- :umbrella: Unit test for the `PHPCompatibility.Upgrade.LowPHPCS` sniff. -- :umbrella: Some extra unit tests for the `PHPCompatibility.ParameterValues.NewNegativeStringOffset`, `PHPCompatibility.ParameterValues.RemovedMbStringModifiers` and sniffs. [#876](https://github.com/PHPCompatibility/PHPCompatibility/pull/876), [#877](https://github.com/PHPCompatibility/PHPCompatibility/pull/877) -- :books: `CONTRIBUTING.md`: Added a list of typical sources for information about changes to PHP. [#875](https://github.com/PHPCompatibility/PHPCompatibility/pull/875) - -### Changed -- :pushpin: `PHPCompatibility.FunctionDeclarations.NewExceptionsFromToString` sniff: the sniff will now also examine the function docblock, if available, and will throw an error when a `@throws` tag is found in the docblock. [#880](https://github.com/PHPCompatibility/PHPCompatibility/pull/880). Fixes [#863](https://github.com/PHPCompatibility/PHPCompatibility/issues/863) -- :pushpin: `PHPCompatibility.FunctionDeclarations.NonStaticMagicMethods` sniff: will now also check the visibility and `static` (or not) requirements of the magic `__construct()`, `__destruct()`, `__clone()`, `__debugInfo()`, `__invoke()` and `__set_state()` methods. [#885](https://github.com/PHPCompatibility/PHPCompatibility/pull/885) -- :pushpin: `PHPCompatibility.Syntax.NewArrayStringDereferencing` sniff: the sniff will now also recognize array string dereferencing using curly braces as was (silently) supported since PHP 7.0. [#851](https://github.com/PHPCompatibility/PHPCompatibility/pull/851) - - The sniff will now also throw errors for each dereference found on the array/string, not just the first one. -- :pushpin: `PHPCompatibility.Syntax.NewClassMemberAccess` sniff: the sniff will now also recognize class member access on instantiation and cloning using curly braces as was (silently) supported since PHP 7.0. [#852](https://github.com/PHPCompatibility/PHPCompatibility/pull/852) - - The sniff will now also throw errors for each access detected, not just the first one. - - The line number on which the error is thrown in now set more precisely. -- :pushpin: `PHPCompatibility.Syntax.NewFunctionArrayDereferencing` sniff: the sniff will now also recognize function array dereferencing using curly braces as was (silently) supported since PHP 7.0. [#853](https://github.com/PHPCompatibility/PHPCompatibility/pull/853) - - The sniff will now also throw errors for each access detected, not just the first one. - - The line number on which the error is thrown in now set more precisely. -- :recycle: Various code clean-up and improvements. [#849](https://github.com/PHPCompatibility/PHPCompatibility/pull/849), [#850](https://github.com/PHPCompatibility/PHPCompatibility/pull/850) -- :recycle: Various minor inline documentation fixes. [#854](https://github.com/PHPCompatibility/PHPCompatibility/pull/854), [#886](https://github.com/PHPCompatibility/PHPCompatibility/pull/886) -- :wrench: Travis: various tweaks to the build script. [#834](https://github.com/PHPCompatibility/PHPCompatibility/pull/834), [#842](https://github.com/PHPCompatibility/PHPCompatibility/pull/842) - -### Fixed -- :bug: `PHPCompatibility.FunctionDeclarations.ForbiddenParametersWithSameName` sniff: variable names are case-sensitive, so recognition of same named parameters should be done in a case-sensitive manner. [#848](https://github.com/PHPCompatibility/PHPCompatibility/pull/848) -- :bug: `PHPCompatibility.FunctionDeclarations.NewExceptionsFromToString` sniff: Exceptions thrown within a `try` should not trigger the sniff. [#880](https://github.com/PHPCompatibility/PHPCompatibility/pull/880). Fixes [#863](https://github.com/PHPCompatibility/PHPCompatibility/issues/863) -- :bug: `PHPCompatibility.FunctionDeclarations.NewExceptionsFromToString` sniff: the `$ooScopeTokens` property should never have been a public property. [#880](https://github.com/PHPCompatibility/PHPCompatibility/pull/880). -- :umbrella: Some of the unit tests for the `PHPCompatibility.Operators.RemovedTernaryAssociativity` sniff were not being run. [#836](https://github.com/PHPCompatibility/PHPCompatibility/pull/836) - - -## [9.2.0] - 2019-06-28 - -See all related issues and PRs in the [9.2.0 milestone]. - -To keep informed of the progress of covering "_everything PHP 7.4_" in PHPCompatibility, please subscribe to issue [#808](https://github.com/PHPCompatibility/PHPCompatibility/issues/808). - -### Added -- :star2: New `PHPCompatibility.Classes.ForbiddenAbstractPrivateMethods` sniff to detect methods declared as both `private` as well as `abstract`. This was allowed between PHP 5.0.0 and 5.0.4, but disallowed in PHP 5.1 as the behaviour of `private` and `abstract` are mutually exclusive. [#822](https://github.com/PHPCompatibility/PHPCompatibility/pull/822) -- :star2: New `PHPCompatibility.Classes.NewTypedProperties` sniff to detect PHP 7.4 typed property declarations. [#801](https://github.com/PHPCompatibility/PHPCompatibility/pull/801), [#829](https://github.com/PHPCompatibility/PHPCompatibility/pull/829) -- :star2: New `PHPCompatibility.Classes.RemovedOrphanedParent` sniff to detect the use of the `parent` keyword in classes without a parent (non-extended classes). This code pattern is deprecated in PHP 7.4 and will become a compile-error in PHP 8.0. [#818](https://github.com/PHPCompatibility/PHPCompatibility/pull/818) -- :star2: New `PHPCompatibility.FunctionDeclarations.NewExceptionsFromToString` sniff to detect throwing exceptions from `__toString()` methods. This would previously result in a fatal error, but will be allowed as of PHP 7.4. [#814](https://github.com/PHPCompatibility/PHPCompatibility/pull/814) -- :star2: New `PHPCompatibility.FunctionDeclarations.ForbiddenToStringParameters` sniff to detect `__toString()` function declarations expecting parameters. This was disallowed in PHP 5.3. [#815](https://github.com/PHPCompatibility/PHPCompatibility/pull/815) -- :star2: New `PHPCompatibility.MethodUse.ForbiddenToStringParameters` sniff to detect direct calls to `__toString()` magic methods passing parameters. This was disallowed in PHP 5.3. [#830](https://github.com/PHPCompatibility/PHPCompatibility/pull/830) -- :star2: New `PHPCompatibility.Operators.ChangedConcatOperatorPrecedence` sniff to detect code affected by the upcoming change in operator precedence for the concatenation operator. The concatenation operator precedence will be lowered in PHP 8.0, with deprecation notices for code affected being thrown in PHP 7.4. [#805](https://github.com/PHPCompatibility/PHPCompatibility/pull/805) -- :star2: New `PHPCompatibility.Operators.RemovedTernaryAssociativity` sniff to detect code relying on left-associativity of the ternary operator. This behaviour will be deprecated in PHP 7.4 and removed in PHP 8.0. [#810](https://github.com/PHPCompatibility/PHPCompatibility/pull/810) -- :star2: New `PHPCompatibility.Syntax.NewArrayUnpacking` sniff to detect the use of the spread operator to unpack arrays when declaring a new array, as introduced in PHP 7.4. [#804](https://github.com/PHPCompatibility/PHPCompatibility/pull/804) -- :star: `PHPCompatibility.Classes.NewClasses` sniff: recognize the new `ReflectionReference` class as introduced in PHP 7.4. [#820](https://github.com/PHPCompatibility/PHPCompatibility/pull/820) -- :star: `PHPCompatibility.Constants.NewConstants` sniff: detection of the new PHP 7.4 Core (Standard), MBString, Socket and Tidy constants. [#821](https://github.com/PHPCompatibility/PHPCompatibility/pull/821) -- :star: `PHPCompatibility.FunctionUse.NewFunctions` sniff: detect usage of the new PHP 7.4 `get_mangled_object_vars()`, `mb_str_split()`, `openssl_x509_verify()`, `password_algos()`, `pcntl_unshare()`, `sapi_windows_set_ctrl_handler()` and `sapi_windows_generate_ctrl_event()` functions. [#811](https://github.com/PHPCompatibility/PHPCompatibility/pull/811), [#819](https://github.com/PHPCompatibility/PHPCompatibility/pull/819), [#827](https://github.com/PHPCompatibility/PHPCompatibility/pull/827) -- :star: `PHPCompatibility.FunctionUse.NewFunctions` sniff: recognize the new OCI functions as introduced in PHP 7.2.14 and PHP 7.3.1. [#786](https://github.com/PHPCompatibility/PHPCompatibility/pull/786) -- :star: `PHPCompatibility.FunctionUse.RemovedFunctions` sniff: recognize the PHP 7.4 deprecated `ldap_control_paged_result_response()` and `ldap_control_paged_result()` functions. [#831](https://github.com/PHPCompatibility/PHPCompatibility/pull/831) -- :star: `PHPCompatibility.FunctionUse.RemovedFunctions` sniff: recognize the `Payflow Pro/pfpro` functions as removed in PHP 5.1. [#823](https://github.com/PHPCompatibility/PHPCompatibility/pull/823) -- :star: `PHPCompatibility.FunctionUse.RequiredToOptionalFunctionParameters` sniff: account for the parameters for `array_merge()` and `array_merge_recursive()` becoming optional in PHP 7.4. [#817](https://github.com/PHPCompatibility/PHPCompatibility/pull/817) -- :star: `PHPCompatibility.IniDirectives.RemovedIniDirectives` sniff: recognize the `Payflow Pro/pfpro` ini directives as removed in PHP 5.1. [#823](https://github.com/PHPCompatibility/PHPCompatibility/pull/823) -- :star: Recognize the `interbase/Firebird` extension functionality which will be removed in PHP 7.4 (moved to PECL) in the `RemovedConstants`, `RemovedExtensions`, `RemovedFunctions` and `RemovedIniDirectives` sniffs. [#807](https://github.com/PHPCompatibility/PHPCompatibility/pull/807) -- :star: Recognize the `wddx` extension functionality which will be removed in PHP 7.4 (moved to PECL) in the `RemovedExtensions` and `RemovedFunctions` sniffs. [#826](https://github.com/PHPCompatibility/PHPCompatibility/pull/826) -- :star: New `isShortTernary()` and `isUnaryPlusMinus()` utility methods to the `PHPCompatibility\Sniff` class. [#810](https://github.com/PHPCompatibility/PHPCompatibility/pull/810), [#805](https://github.com/PHPCompatibility/PHPCompatibility/pull/805) - -### Changed -- :pencil2: The `PHPCompatibility.Extensions.RemovedExtensions` sniff will now only report on the removed `Payflow Pro` extension when a function uses `pfpro_` as a prefix. Previously, it used the `pfpro` prefix (without underscore) for detection. [#812](https://github.com/PHPCompatibility/PHPCompatibility/pull/812) -- :pencil2: The error message thrown when the `T_ELLIPSIS` token, i.e. the spread operator, is detected. [#803](https://github.com/PHPCompatibility/PHPCompatibility/pull/803) - PHP 7.4 adds a third use-case for the spread operator. The adjusted error message accounts for this. -- :umbrella: `PHPCompatibility.FunctionDeclarations.NewParamTypeDeclarations` is now also tested with parameters using the splat operator. [#802](https://github.com/PHPCompatibility/PHPCompatibility/pull/802) -- :books: The documentation now uses the GitHub repo of `PHP_CodeSniffer` as the canonical entry point for `PHP_CodeSniffer`. Previously, it would point to the PEAR package. [#788](https://github.com/PHPCompatibility/PHPCompatibility/pull/788) -- :books: The links in the changelog now all point to the `PHPCompatibility/PHPCompatibility` repo and no longer to the (deprecated) `wimg/PHPCompatibility` repo. [#828](https://github.com/PHPCompatibility/PHPCompatibility/pull/828) -- :recycle: Various minor inline documentation improvements. [#825](https://github.com/PHPCompatibility/PHPCompatibility/pull/825) -- :wrench: Various performance optimizations and code simplifications. [#783](https://github.com/PHPCompatibility/PHPCompatibility/pull/783), [#784](https://github.com/PHPCompatibility/PHPCompatibility/pull/784), [#795](https://github.com/PHPCompatibility/PHPCompatibility/pull/795), [#813](https://github.com/PHPCompatibility/PHPCompatibility/pull/813) -- :green_heart: Travis: build tests are now being run against PHP 7.4 (unstable) as well. [#790](https://github.com/PHPCompatibility/PHPCompatibility/pull/790) - Note: the builds are currently not (yet) tested against PHP 8.0 (unstable) as there is no compatible PHPUnit version available (yet). -- :wrench: Travis: The build script has been refactored to use [stages](https://docs.travis-ci.com/user/build-stages/) to get the most relevant results faster. Additionally some more tweaks have been made to improve and/or simplify the build script. [#798](https://github.com/PHPCompatibility/PHPCompatibility/pull/798) -- :wrench: Build/PHPCS: warnings are no longer allowed for the PHPCompatibility native code. [#800](https://github.com/PHPCompatibility/PHPCompatibility/pull/800) -- :wrench: Build/PHPCS: added variable assignment alignment check and file include check to the PHPCompatibility native CS configuration. [#824](https://github.com/PHPCompatibility/PHPCompatibility/pull/824) -- :wrench: The minimum version for the recommended `DealerDirect/phpcodesniffer-composer-installer` Composer plugin has been upped to `0.5.0`. [#791](https://github.com/PHPCompatibility/PHPCompatibility/pull/791) - -### Fixed -- :bug: The `PHPCompatibility.Extensions.RemovedExtensions` sniff contained a typo in the alternative recommended for the removed `mcve` extension. [#806](https://github.com/PHPCompatibility/PHPCompatibility/pull/806) -- :bug: The `PHPCompatibility.Extensions.RemovedExtensions` sniff listed the wrong removal version number for the `Payflow Pro/pfpro` extension (PHP 5.3 instead of the correct 5.1). [#823](https://github.com/PHPCompatibility/PHPCompatibility/pull/823) - -### Credits -Thanks go out to [Yılmaz] and [Tim Millwood] for their contribution to this version. :clap: - - -## [9.1.1] - 2018-12-31 - -See all related issues and PRs in the [9.1.1 milestone]. - -### Fixed -- :bug: `ForbiddenThisUseContexts`: false positive for unsetting `$this['key']` on objects implementing `ArrayAccess`. [#781](https://github.com/PHPCompatibility/PHPCompatibility/pull/781). Fixes [#780](https://github.com/PHPCompatibility/PHPCompatibility/issues/780) - -## [9.1.0] - 2018-12-16 - -See all related issues and PRs in the [9.1.0 milestone]. - -### Added -- :star2: New `PHPCompatibility.FunctionUse.ArgumentFunctionsReportCurrentValue` sniff to detect code which could be affected by the PHP 7.0 change in the values reported by `func_get_arg()`, `func_get_args()`, `debug_backtrace()` and exception backtraces. [#750](https://github.com/PHPCompatibility/PHPCompatibility/pull/750). Fixes [#585](https://github.com/PHPCompatibility/PHPCompatibility/pull/585). -- :star2: New `PHPCompatibility.MethodUse.NewDirectCallsToClone` sniff to detect direct call to a `__clone()` magic method which wasn't allowed prior to PHP 7.0. [#743](https://github.com/PHPCompatibility/PHPCompatibility/pull/743). Fixes [#629](https://github.com/PHPCompatibility/PHPCompatibility/issues/629). -- :star2: New `PHPCompatibility.Variables.ForbiddenThisUseContext` sniff to detect most of the inconsistencies surrounding the use of the `$this` variable, which were removed in PHP 7.1. [#762](https://github.com/PHPCompatibility/PHPCompatibility/pull/762), [#771](https://github.com/PHPCompatibility/PHPCompatibility/pull/771). Fixes [#262](https://github.com/PHPCompatibility/PHPCompatibility/issues/262) and [#740](https://github.com/PHPCompatibility/PHPCompatibility/issues/740). -- :star: `NewClasses`: detection of more native PHP Exceptions. [#743](https://github.com/PHPCompatibility/PHPCompatibility/pull/743), [#753](https://github.com/PHPCompatibility/PHPCompatibility/pull/753) -- :star: `NewConstants` : detection of the new PHP 7.3 Curl, Stream Crypto and LDAP constants and some more PHP 7.0 Tokenizer constants. [#752](https://github.com/PHPCompatibility/PHPCompatibility/pull/752), [#767](https://github.com/PHPCompatibility/PHPCompatibility/pull/767), [#778](https://github.com/PHPCompatibility/PHPCompatibility/pull/778) -- :star: `NewFunctions` sniff: recognize (more) new LDAP functions as introduced in PHP 7.3. [#768](https://github.com/PHPCompatibility/PHPCompatibility/pull/768) -- :star: `NewFunctionParameters` sniff: recognize the new `$serverctrls` parameter which was added to a number of LDAP functions in PHP 7.3. [#769](https://github.com/PHPCompatibility/PHPCompatibility/pull/769) -- :star: `NewIniDirectives` sniff: recognize the new `imap.enable_insecure_rsh` ini directive as introduced in PHP 7.1.25, 7.2.13 and 7.3.0. [#770](https://github.com/PHPCompatibility/PHPCompatibility/pull/770) -- :star: `NewInterfaces` sniff: recognize two more Session related interfaces which were introduced in PHP 5.5.1 and 7.0 respectively. [#748](https://github.com/PHPCompatibility/PHPCompatibility/pull/748) -- :star: Duplicate of upstream `findStartOfStatement()` method to the `PHPCompatibility\PHPCSHelper` class to allow for PHPCS cross-version usage of that method. [#750](https://github.com/PHPCompatibility/PHPCompatibility/pull/750) - -### Changed -- :pushpin: `RemovedPHP4StyleConstructors`: will now also detect PHP4-style constructors when declared in interfaces. [#751](https://github.com/PHPCompatibility/PHPCompatibility/pull/751) -- :pushpin: `Sniff::validDirectScope()`: the return value of this method has changed. Previously it would always be a boolean. It will stil return `false` when no valid direct scope has been found, but it will now return the `stackPtr` to the scope token if a _valid_ direct scope was encountered. [#758](https://github.com/PHPCompatibility/PHPCompatibility/pull/758) -- :rewind: `NewOperators` : updated the version number for `T_COALESCE_EQUAL`. [#746](https://github.com/PHPCompatibility/PHPCompatibility/pull/746) -- :pencil: Minor improvement to an error message in the unit test suite. [#742](https://github.com/PHPCompatibility/PHPCompatibility/pull/742) -- :recycle: Various code clean-up and improvements. [#745](https://github.com/PHPCompatibility/PHPCompatibility/pull/745), [#756](https://github.com/PHPCompatibility/PHPCompatibility/pull/756), [#774](https://github.com/PHPCompatibility/PHPCompatibility/pull/774) -- :recycle: Various minor inline documentation fixes. [#749](https://github.com/PHPCompatibility/PHPCompatibility/pull/749), [#757](https://github.com/PHPCompatibility/PHPCompatibility/pull/757) -- :umbrella: Improved code coverage recording. [#744](https://github.com/PHPCompatibility/PHPCompatibility/pull/744), [#776](https://github.com/PHPCompatibility/PHPCompatibility/pull/776) -- :green_heart: Travis: build tests are now being run against PHP 7.3 as well. [#511](https://github.com/PHPCompatibility/PHPCompatibility/pull/511) - Note: full PHP 7.3 support is only available in combination with PHP_CodeSniffer 2.9.2 or 3.3.1+ due to an incompatibility within PHP_CodeSniffer itself. - -### Fixed -- :white_check_mark: Compatibility with the upcoming release of PHPCS 3.4.0. Deal with changed behaviour of the PHPCS `Tokenizer` regarding binary type casts. [#760](https://github.com/PHPCompatibility/PHPCompatibility/pull/760) -- :bug: `InternalInterfaces`: false negative for implemented/extended interfaces prefixed with a namespace separator. [#775](https://github.com/PHPCompatibility/PHPCompatibility/pull/775) -- :bug: `NewClasses`: the introduction version of various native PHP Exceptions has been corrected. [#743](https://github.com/PHPCompatibility/PHPCompatibility/pull/743), [#753](https://github.com/PHPCompatibility/PHPCompatibility/pull/753) -- :bug: `NewInterfaces`: false negative for implemented/extended interfaces prefixed with a namespace separator. [#775](https://github.com/PHPCompatibility/PHPCompatibility/pull/775) -- :bug: `RemovedPHP4StyleConstructors`: the sniff would examine methods in nested anonymous classes as if they were methods of the higher level class. [#751](https://github.com/PHPCompatibility/PHPCompatibility/pull/751) -- :rewind: `RemovedPHP4StyleConstructors`: the sniff will no longer throw false positives for the first method in an anonymous class when used in combination with PHPCS 2.3.x. [#751](https://github.com/PHPCompatibility/PHPCompatibility/pull/751) -- :rewind: `ReservedFunctionNames`: fixed incorrect error message text for methods in anonymous classes when used in combination with PHPCS 2.3.x. [#755](https://github.com/PHPCompatibility/PHPCompatibility/pull/755) -- :bug: `ReservedFunctionNames`: prevent duplicate errors being thrown for methods in nested anonymous classes. [#755](https://github.com/PHPCompatibility/PHPCompatibility/pull/755) -- :bug: `PHPCSHelper::findEndOfStatement()`: minor bug fix. [#749](https://github.com/PHPCompatibility/PHPCompatibility/pull/749) -- :bug: `Sniff::isClassProperty()`: class properties for classes nested in conditions or function calls were not always recognized as class properties. [#758](https://github.com/PHPCompatibility/PHPCompatibility/pull/758) - -### Credits -Thanks go out to [Jonathan Champ] for his contribution to this version. :clap: - - -## [9.0.0] - 2018-10-07 - -**IMPORTANT**: This release contains **breaking changes**. Please read the below information carefully before upgrading! - -All sniffs have been placed in meaningful categories and a number of sniffs have been renamed to have more consistent, meaningful and future-proof names. - -Both the `PHPCompatibilityJoomla` [[GH](https://github.com/PHPCompatibility/PHPCompatibilityJoomla) | [Packagist](https://packagist.org/packages/phpcompatibility/phpcompatibility-joomla)] as well as the `PHPCompatibilityWP` [[GH](https://github.com/PHPCompatibility/PHPCompatibilityWP)|[Packagist](https://packagist.org/packages/phpcompatibility/phpcompatibility-wp)] rulesets have already been adjusted for this change and have released a new version which is compatible with this version of PHPCompatibility. - -Aside from those CMS-based rulesets, this project now also offers a number of polyfill-library specific rulesets, such as `PHPCompatibilityPasswordCompat` [[GH](https://github.com/PHPCompatibility/PHPCompatibilityPasswordCompat) | [Packagist](https://packagist.org/packages/phpcompatibility/phpcompatibility-passwordcompat)] for @ircmaxell's [`password_compat`](https://github.com/ircmaxell/password_compat) libary, `PHPCompatibilityParagonieRandomCompat` and `PHPCompatibilityParagonieSodiumCompat` [[GH](https://github.com/PHPCompatibility/PHPCompatibilityParagonie)|[Packagist](https://packagist.org/packages/phpcompatibility/phpcompatibility-paragonie)] for the [Paragonie polyfills](https://github.com/paragonie?utf8=?&q=polyfill) and a number of rulesets related to various [polyfills offered by the Symfony project](https://github.com/symfony?utf8=?&q=polyfill) [[GH](https://github.com/PHPCompatibility/PHPCompatibilitySymfony)|[Packagist](https://packagist.org/packages/phpcompatibility/phpcompatibility-symfony)]. - -If your project uses one of these polyfills, please consider using these special polyfill rulesets to prevent false positives. - -Also as of this version, [Juliette Reinders Folmer] is now officially a co-maintainer of this package. - -### Upgrade instructions - -* If you have `<exclude name="..."/>` directives in your own project's custom ruleset which relate to sniffs from the PHPCompatibility library, you will need to update your ruleset to use the new sniff names. -* If you use the new [PHPCS 3.2+ inline annotations](https://github.com/squizlabs/PHP_CodeSniffer/releases/3.2.0), i.e. `// phpcs:ignore Standard.Category.SniffName`, in combination with PHPCompatibility sniff names, you will need to update these annotations. -* If you use neither of the above, you should be fine and upgrading should be painless. - -### Overview of all the sniff renames: - -Old Category.SniffName | New Category.SniffName ---- | --- -**PHP**.ArgumentFunctionsUsage | **FunctionUse**.ArgumentFunctionsUsage -**PHP**.CaseSensitiveKeywords | **Keywords**.CaseSensitiveKeywords -**PHP**.ConstantArraysUsingConst | **InitialValue**.**New**ConstantArraysUsingConst -**PHP**.ConstantArraysUsingDefine | **InitialValue**.**New**ConstantArraysUsingDefine -**PHP**.**Deprecated**Functions | **FunctionUse**.**Removed**Functions -**PHP**.**Deprecated**IniDirectives | **IniDirectives**.**Removed**IniDirectives -**PHP**.**Deprecated**MagicAutoload | **FunctionNameRestrictions**.**Removed**MagicAutoload -**PHP**.**Deprecated**NewReference | **Syntax**.**Removed**NewReference -**PHP**.**Deprecated**PHP4StyleConstructors | **FunctionNameRestrictions**.**Removed**PHP4StyleConstructors -**PHP**.**Deprecated**TypeCasts | **TypeCasts**.**Removed**TypeCasts -**PHP**.DiscouragedSwitchContinue | **ControlStructures**.DiscouragedSwitchContinue -**PHP**.DynamicAccessToStatic | **Syntax**.**New**DynamicAccessToStatic -**PHP**.EmptyNonVariable | **LanguageConstructs**.**New**EmptyNonVariable -**PHP**.ForbiddenBreakContinueOutsideLoop | **ControlStructures**.ForbiddenBreakContinueOutsideLoop -**PHP**.ForbiddenBreakContinueVariableArguments | **ControlStructures**.ForbiddenBreakContinueVariableArguments -**PHP**.ForbiddenCallTimePassByReference | **Syntax**.ForbiddenCallTimePassByReference -**PHP**.Forbidden**ClosureUseVariableNames** | **FunctionDeclarations**.Forbidden**VariableNamesInClosureUse** -**PHP**.ForbiddenEmptyListAssignment | **Lists**.ForbiddenEmptyListAssignment -**PHP**.Forbidden**Function**ParametersWithSameName | **FunctionDeclarations**.ForbiddenParametersWithSameName -**PHP**.ForbiddenGlobalVariableVariable | **Variables**.ForbiddenGlobalVariableVariable -**PHP**.ForbiddenNames | **Keywords**.ForbiddenNames -**PHP**.ForbiddenNamesAsDeclared | **Keywords**.ForbiddenNamesAsDeclared -**PHP**.ForbiddenNamesAsInvokedFunctions | **Keywords**.ForbiddenNamesAsInvokedFunctions -**PHP**.ForbiddenNegativeBitshift | **Operators**.ForbiddenNegativeBitshift -**PHP**.ForbiddenSwitchWithMultipleDefaultBlocks | **ControlStructures**.ForbiddenSwitchWithMultipleDefaultBlocks -**PHP**.InternalInterfaces | **Interfaces**.InternalInterfaces -**PHP**.LateStaticBinding | **Classes**.**New**LateStaticBinding -**PHP**.**MbstringReplaceE**Modifier | **ParameterValues**.**RemovedMbstring**Modifier**s** -**PHP**.NewAnonymousClasses | **Classes**.NewAnonymousClasses -**PHP**.NewArrayStringDereferencing | **Syntax**.NewArrayStringDereferencing -**PHP**.NewClasses | **Classes**.NewClasses -**PHP**.NewClassMemberAccess | **Syntax**.NewClassMemberAccess -**PHP**.NewClosure | **FunctionDeclarations**.NewClosure -**PHP**.NewConstants | **Constants**.NewConstants -**PHP**.NewConstantScalarExpressions | **InitialValue**.NewConstantScalarExpressions -**PHP**.NewConstVisibility | **Classes**.NewConstVisibility -**PHP**.NewExecutionDirectives | **ControlStructures**.NewExecutionDirectives -**PHP**.NewFunctionArrayDereferencing | **Syntax**.NewFunctionArrayDereferencing -**PHP**.NewFunctionParameters | **FunctionUse**.NewFunctionParameters -**PHP**.NewFunctions | **FunctionUse**.NewFunctions -**PHP**.NewGeneratorReturn | **Generators**.NewGeneratorReturn -**PHP**.NewGroupUseDeclarations | **UseDeclarations**.NewGroupUseDeclarations -**PHP**.NewHashAlgorithms | **ParameterValues**.NewHashAlgorithms -**PHP**.NewHeredoc**Initialize** | **InitialValue**.NewHeredoc -**PHP**.NewIniDirectives | **IniDirectives**.NewIniDirectives -**PHP**.NewInterfaces | **Interfaces**.NewInterfaces -**PHP**.NewKeywords | **Keywords**.NewKeywords -**PHP**.NewLanguageConstructs | **LanguageConstructs**.NewLanguageConstructs -**PHP**.NewMagicClassConstant | **Constants**.NewMagicClassConstant -**PHP**.NewMagicMethods | **FunctionNameRestrictions**.NewMagicMethods -**PHP**.NewMultiCatch | **ControlStructures**.NewMultiCatch -**PHP**.NewNullableTypes | **FunctionDeclarations**.NewNullableTypes -**PHP**.NewReturnTypeDeclarations | **FunctionDeclarations**.NewReturnTypeDeclarations -**PHP**.New**Scalar**TypeDeclarations | **FunctionDeclarations**.New**Param**TypeDeclarations -**PHP**.NewTrailingComma | **Syntax**.New**FunctionCall**TrailingComma -**PHP**.NewTypeCasts | **TypeCasts**.NewTypeCasts -**PHP**.NewUseConstFunction | **UseDeclarations**.NewUseConstFunction -**PHP**.NonStaticMagicMethods | **FunctionDeclarations**.NonStaticMagicMethods -**PHP**.OptionalRequiredFunctionParameters | **FunctionUse**.Optional**To**RequiredFunctionParameters -**PHP**.ParameterShadowSuperGlobals | **FunctionDeclarations**.**Forbidden**ParameterShadowSuperGlobals -**PHP**.**PCRENew**Modifiers | **ParameterValues**.**NewPCRE**Modifiers -**PHP**.**PregReplaceE**Modifier | **ParameterValues**.**RemovedPCRE**Modifier**s** -**PHP**.RemovedAlternativePHPTags | **Miscellaneous**.RemovedAlternativePHPTags -**PHP**.RemovedConstants | **Constants**.RemovedConstants -**PHP**.RemovedExtensions | **Extensions**.RemovedExtensions -**PHP**.RemovedFunctionParameters | **FunctionUse**.RemovedFunctionParameters -**PHP**.RemovedGlobalVariables | **Variables**.Removed**Predefined**GlobalVariables -**PHP**.RemovedHashAlgorithms | **ParameterValues**.RemovedHashAlgorithms -**PHP**.ReservedFunctionNames | **FunctionNameRestrictions**.ReservedFunctionNames -**PHP**.RequiredOptionalFunctionParameters | **FunctionUse**.Required**To**OptionalFunctionParameters -**PHP**.ShortArray | **Syntax**.**New**ShortArray -**PHP**.Ternary**Operators** | **Operators**.**NewShort**Ternary -**PHP**.ValidIntegers | **Miscellaneous**.ValidIntegers -**PHP**.**VariableVariables** | **Variables**.**NewUniformVariableSyntax** - -### Changelog for version 9.0.0 - -See all related issues and PRs in the [9.0.0 milestone]. - -### Added -- :star2: New `PHPCompatibility.ControlStructures.NewForeachExpressionReferencing` sniff to detect referencing of `$value` within a `foreach()` when the iterated array is not a variable. This was not supported prior to PHP 5.5. [#664](https://github.com/PHPCompatibility/PHPCompatibility/pull/664) -- :star2: New `PHPCompatibility.ControlStructures.NewListInForeach` sniff to detect unpacking nested arrays into separate variables via the `list()` construct in a `foreach()` statement. This was not supported prior to PHP 5.5. [#657](https://github.com/PHPCompatibility/PHPCompatibility/pull/657) -- :star2: New `PHPCompatibility.FunctionNameRestrictions.RemovedNamespacedAssert` sniff to detect declaring a function called `assert()` within a namespace. This has been deprecated as of PHP 7.3. [#735](https://github.com/PHPCompatibility/PHPCompatibility/pull/735). Partially fixes [#718](https://github.com/PHPCompatibility/PHPCompatibility/issues/718). -- :star2: New `PHPCompatibility.Lists.AssignmentOrder` sniff to detect `list()` constructs affected by the change in assignment order in PHP 7.0. [#656](https://github.com/PHPCompatibility/PHPCompatibility/pull/656) -- :star2: New `PHPCompatibility.Lists.NewKeyedList` sniff to detect usage of keys in `list()`, support for which was added in PHP 7.1. [#655](https://github.com/PHPCompatibility/PHPCompatibility/pull/655). Fixes [#252](https://github.com/PHPCompatibility/PHPCompatibility/issues/252). -- :star2: New `PHPCompatibility.Lists.NewListReferenceAssignment` sniff to detect reference assignments being used in `list()` constructs, support for which has been added in PHP 7.3. [#731](https://github.com/PHPCompatibility/PHPCompatibility/pull/731) -- :star2: New `PHPCompatibility.Lists.NewShortList` sniff to detect the shorthand array syntax `[]` being used for symmetric array destructuring as introduced in PHP 7.1. [#654](https://github.com/PHPCompatibility/PHPCompatibility/pull/654). Fixes [#248](https://github.com/PHPCompatibility/PHPCompatibility/issues/248). -- :star2: New `PHPCompatibility.Operators.NewOperators` sniff which checks for usage of the pow, pow equals, spaceship and coalesce (equals) operators. [#738](https://github.com/PHPCompatibility/PHPCompatibility/pull/738) - These checks were previously contained within the `PHPCompatibility.LanguageConstructs.NewLanguageConstructs` sniff. -- :star2: New `PHPCompatibility.ParameterValues.ForbiddenGetClassNull` sniff to detect `null` being passed to `get_class()`, support for which has been removed in PHP 7.2 [#659](https://github.com/PHPCompatibility/PHPCompatibility/pull/659). Fixes [#557](https://github.com/PHPCompatibility/PHPCompatibility/issues/557). -- :star2: New `PHPCompatibility.ParameterValues.NewArrayReduceInitialType` sniff to detect non-integers being passed as the `$initial` parameter to the `array_reduce()` function, which was not supported before PHP 5.3. [#666](https://github.com/PHPCompatibility/PHPCompatibility/pull/666). Fixes [#649](https://github.com/PHPCompatibility/PHPCompatibility/issues/649) -- :star2: New `PHPCompatibility.ParameterValues.NewFopenModes` sniff to examine the `$mode` parameter passed to `fopen()` for modes not available in older PHP versions. [#658](https://github.com/PHPCompatibility/PHPCompatibility/pull/658) -- :star2: New `PHPCompatibility.ParameterValues.NewNegativeStringOffset` sniff to detect negative string offsets being passed to string manipulation functions which was not supported before PHP 7.1. [#662](https://github.com/PHPCompatibility/PHPCompatibility/pull/662). Partially fixes [#253](https://github.com/PHPCompatibility/PHPCompatibility/issues/253). -- :star2: New `PHPCompatibility.ParameterValues.NewPackFormats` sniff to examine the `$format` parameter passed to `pack()` for formats not available in older PHP versions. [#665](https://github.com/PHPCompatibility/PHPCompatibility/pull/665) -- :star2: New `PHPCompatibility.ParameterValues.RemovedIconvEncoding` sniff to detect the PHP 5.6 deprecated encoding `$type`s being passed to `iconv_set_encoding()`. [#660](https://github.com/PHPCompatibility/PHPCompatibility/pull/660). Fixes [#475](https://github.com/PHPCompatibility/PHPCompatibility/issues/475). -- :star2: New `PHPCompatibility.ParameterValues.RemovedNonCryptoHashes` sniff to detect non-cryptographic hash algorithms being passed to various `hash_*()` functions. This is no longer accepted as of PHP 7.2. [#663](https://github.com/PHPCompatibility/PHPCompatibility/pull/663). Fixes [#559](https://github.com/PHPCompatibility/PHPCompatibility/issues/559) -- :star2: New `PHPCompatibility.ParameterValues.RemovedSetlocaleString` sniff to detect string literals being passed to the `$category` parameter of the `setlocale()` function. This behaviour was deprecated in PHP 4.2 and support has been removed in PHP 7.0. [#661](https://github.com/PHPCompatibility/PHPCompatibility/pull/661) -- :star2: New `PHPCompatibility.Syntax.NewFlexibleHeredocNowdoc` sniff to detect the new heredoc/nowdoc format as allowed as of PHP 7.3. [#736](https://github.com/PHPCompatibility/PHPCompatibility/pull/736). Fixes [#705](https://github.com/PHPCompatibility/PHPCompatibility/issues/705). - Note: This sniff is only supported in combination with PHP_CodeSniffer 2.6.0 and higher. -- :star: `PHPCompatibility.Classes.NewClasses` sniff: recognize the new `CompileError` and `JsonException` classes as introduced in PHP 7.3. [#676](https://github.com/PHPCompatibility/PHPCompatibility/pull/676) -- :star: `PHPCompatibility.Constants.NewConstants` sniff: recognize new constants which are being introduced in PHP 7.3. [#678](https://github.com/PHPCompatibility/PHPCompatibility/pull/678) -- :star: `PHPCompatibility.Constants.RemovedConstants` sniff: recognize constants which have been deprecated or removed in PHP 7.3. [#710](https://github.com/PHPCompatibility/PHPCompatibility/pull/710). Partially fixes [#718](https://github.com/PHPCompatibility/PHPCompatibility/issues/718). -- :star: `PHPCompatibility.FunctionUse.NewFunctions` sniff: recognize various new functions being introduced in PHP 7.3. [#679](https://github.com/PHPCompatibility/PHPCompatibility/pull/679) -- :star: `PHPCompatibility.FunctionUse.NewFunctions` sniff: recognize the `sapi_windows_*()`, `hash_hkdf()` and `pcntl_signal_get_handler()` functions as introduced in PHP 7.1. [#728](https://github.com/PHPCompatibility/PHPCompatibility/pull/728) -- :star: `PHPCompatibility.FunctionUse.RemovedFunctionParameters` sniff: recognize the deprecation of the `$case_insensitive` parameter for the `define()` function in PHP 7.3. [#706](https://github.com/PHPCompatibility/PHPCompatibility/pull/706) -- :star: `PHPCompatibility.FunctionUse.RemovedFunctions` sniff: recognize the PHP 7.3 deprecation of the `image2wbmp()`, `fgetss()` and `gzgetss()` functions, as well as the deprecation of undocumented Mbstring function aliases. [#681](https://github.com/PHPCompatibility/PHPCompatibility/pull/681), [#714](https://github.com/PHPCompatibility/PHPCompatibility/pull/714), [#720](https://github.com/PHPCompatibility/PHPCompatibility/pull/720). Partially fixes [#718](https://github.com/PHPCompatibility/PHPCompatibility/issues/718). -- :star: `PHPCompatibility.FunctionUse.RequiredToOptionalFunctionParameters` sniff: account for the second parameter for `array_push()` and `array_unshift()` becoming optional in PHP 7.3, as well as for the `$mode` parameter for a range of `ftp_*()` functions becoming optional. [#680](https://github.com/PHPCompatibility/PHPCompatibility/pull/680) -- :star: `PHPCompatibility.IniDirectives.NewIniDirectives` sniff: recognize new `syslog` and `session` ini directives as introduced in PHP 7.3. [#702](https://github.com/PHPCompatibility/PHPCompatibility/pull/702), [#719](https://github.com/PHPCompatibility/PHPCompatibility/pull/719), [#730](https://github.com/PHPCompatibility/PHPCompatibility/pull/730) -- :star: `PHPCompatibility.IniDirectives.NewIniDirectives` sniff: recognize some more ini directives which were introduced in PHP 7.1. [#727](https://github.com/PHPCompatibility/PHPCompatibility/pull/727) -- :star: `PHPCompatibility.IniDirectives.RemovedIniDirectived` sniff: recognize ini directives removed in PHP 7.3. [#677](https://github.com/PHPCompatibility/PHPCompatibility/pull/677), [#717](https://github.com/PHPCompatibility/PHPCompatibility/pull/717). Partially fixes [#718](https://github.com/PHPCompatibility/PHPCompatibility/issues/718). -- :star: New `isNumericCalculation()` and `isVariable()` utility methods to the `PHPCompatibility\Sniff` class. [#664](https://github.com/PHPCompatibility/PHPCompatibility/pull/664), [#666](https://github.com/PHPCompatibility/PHPCompatibility/pull/666) -- :books: A section about the new sniff naming conventions to the `Contributing` file. [#738](https://github.com/PHPCompatibility/PHPCompatibility/pull/738) - -### Changed -- :fire: All sniffs have been placed in meaningful categories and a number of sniffs have been renamed to have more consistent, meaningful and future-proof names. [#738](https://github.com/PHPCompatibility/PHPCompatibility/pull/738). Fixes [#601](https://github.com/PHPCompatibility/PHPCompatibility/issues/601), [#692](https://github.com/PHPCompatibility/PHPCompatibility/issues/692) - See the table at the top of this changelog for details of all the file renames. -- :umbrella: The unit test files have been moved about as well. [#738](https://github.com/PHPCompatibility/PHPCompatibility/pull/738) - * The directory structure for these now mirrors the default directory structure used by PHPCS itself. - * The file names of the unit test files have been adjusted for the changes made in the sniffs. - * The unit test case files have been renamed and moved to the same directory as the actual test file they apply to. - * The `BaseSniffTest::sniffFile()` method has been adjusted to match. The signature of this method has changed. Where it previously expected a relative path to the unit test case file, it now expects an absolute path. - * The unit tests for the utility methods in the `PHPCompatibility\Sniff` class have been moved to a new `PHPCompatibility\Util\Tests\Core` subdirectory. - * The bootstrap file used for PHPUnit has been moved to the project root directory and renamed `phpunit-bootstrap.php`. -- :twisted_rightwards_arrows: The `PHPCompatibility.LanguageConstructs.NewLanguageConstructs` sniff has been split into two sniffs. [#738](https://github.com/PHPCompatibility/PHPCompatibility/pull/738) - The `PHPCompatibility.LanguageConstructs.NewLanguageConstructs` sniff now contains just the checks for the namespace separator and the ellipsis. - The new `PHPCompatibility.Operators.NewOperators` sniff now contains the checks regarding the pow, pow equals, spaceship and coalesce (equals) operators. -- :pushpin: The `PHPCompatibility.ParameterValues.RemovedMbstringModifiers` sniff will now also recognize removed regex modifiers when used within a function call to one of the undocumented Mbstring function aliases for the Mbstring regex functions. [#715](https://github.com/PHPCompatibility/PHPCompatibility/pull/715) -- :pushpin: The `PHPCompatibility\Sniff::getFunctionCallParameter()` utility method now allows for closures called via a variable. [#723](https://github.com/PHPCompatibility/PHPCompatibility/pull/723) -- :pencil2: `PHPCompatibility.Upgrade.LowPHPCS`: the minimum supported PHPCS version is now 2.3.0. [#699](https://github.com/PHPCompatibility/PHPCompatibility/pull/699) -- :pencil2: Minor inline documentation improvements. [#738](https://github.com/PHPCompatibility/PHPCompatibility/pull/738) -- :umbrella: Minor improvements to the unit tests for the `PHPCompatibility.FunctionNameRestrctions.RemovedMagicAutoload` sniff. [#716](https://github.com/PHPCompatibility/PHPCompatibility/pull/716) -- :recycle: Minor other optimizations. [#698](https://github.com/PHPCompatibility/PHPCompatibility/pull/698), [#697](https://github.com/PHPCompatibility/PHPCompatibility/pull/697) -- :wrench: Minor improvements to the build tools. [#701](https://github.com/PHPCompatibility/PHPCompatibility/pull/701) -- :wrench: Removed some unnecessary inline annotations. [#700](https://github.com/PHPCompatibility/PHPCompatibility/pull/700) -- :books: Replaced some of the badges in the Readme file. [#721](https://github.com/PHPCompatibility/PHPCompatibility/pull/721), [#722](https://github.com/PHPCompatibility/PHPCompatibility/pull/722) -- :books: Composer: updated the list of package authors. [#739](https://github.com/PHPCompatibility/PHPCompatibility/pull/739) - -### Removed -- :no_entry_sign: Support for PHP_CodeSniffer 1.x and low 2.x versions. The new minimum version of PHP_CodeSniffer to be able to use this library is 2.3.0. [#699](https://github.com/PHPCompatibility/PHPCompatibility/pull/699). Fixes [#691](https://github.com/PHPCompatibility/PHPCompatibility/issues/691). - The minimum _recommended_ version of PHP_CodeSniffer remains the same, i.e. 2.6.0. -- :no_entry_sign: The `\PHPCompatibility\Sniff::inUseScope()` method has been removed as it is no longer needed now support for PHPCS 1.x has been dropped. [#699](https://github.com/PHPCompatibility/PHPCompatibility/pull/699) -- :no_entry_sign: Composer: The `autoload` section has been removed from the `composer.json` file. [#738](https://github.com/PHPCompatibility/PHPCompatibility/pull/738). Fixes [#568](https://github.com/PHPCompatibility/PHPCompatibility/issues/568). - Autoloading for this library is done via the PHP_CodeSniffer default mechanism, enhanced with our own autoloader, so the Composer autoloader shouldn't be needed and was causing issues in a particular use-case. - -### Fixed -- :bug: `PHPCompatibility.FunctionUse.NewFunctionParameters` sniff: The new `$mode` parameter of the `php_uname()` function was added in PHP 4.3, not in PHP 7.0 as was previously being reported. - The previous implementation of this check was based on an error in the PHP documentation. The error in the PHP documentation has been rectified and the sniff has followed suit. [#711](https://github.com/PHPCompatibility/PHPCompatibility/pull/711) -- :bug: `PHPCompatibility.Generators.NewGeneratorReturn` sniff: The sniff would throw false positives for `return` statements in nested constructs and did not correctly detect the scope which should be examined. [#725](https://github.com/PHPCompatibility/PHPCompatibility/pull/725). Fixes [#724](https://github.com/PHPCompatibility/PHPCompatibility/pull/724). -- :bug: `PHPCompatibility.Keywords.NewKeywords` sniff: PHP magic constants are case _in_sensitive. This sniff now accounts for this. [#707](https://github.com/PHPCompatibility/PHPCompatibility/pull/707) -- :bug: Various bugs in the `PHPCompatibility.Syntax.ForbiddenCallTimePassByReference` sniff [#723](https://github.com/PHPCompatibility/PHPCompatibility/pull/723): - - Closures called via a variable will now also be examined. (false negative) - - References within arrays/closures passed as function call parameters would incorrectly trigger an error. (false positive) -- :green_heart: Compatibility with PHPUnit 7.2. [#712](https://github.com/PHPCompatibility/PHPCompatibility/pull/712) - -### Credits -Thanks go out to [Jonathan Champ] for his contribution to this version. :clap: - - -## [8.2.0] - 2018-07-17 - -See all related issues and PRs in the [8.2.0 milestone]. - -### Important changes - -#### The repository has moved -As of July 13 2018, the PHPCompatibility repository has moved from the personal account of Wim Godden `wimg` to its own organization `PHPCompatibility`. -Composer users are advised to update their `composer.json`. The dependency is now called `phpcompatibility/php-compatibility`. - -#### Framework/CMS specific PHPCompatibility rulesets -Within this new organization, hosting will be offered for framework/CMS specific PHPCompatibility rulesets. - -The first two such repositories have been created and are now available for use: -* PHPCompatibilityJoomla [GitHub](https://github.com/PHPCompatibility/PHPCompatibilityJoomla)|[Packagist](https://packagist.org/packages/phpcompatibility/phpcompatibility-joomla) -* PHPCompatibilityWP [GitHub](https://github.com/PHPCompatibility/PHPCompatibilityWP)|[Packagist](https://packagist.org/packages/phpcompatibility/phpcompatibility-wp) - -If you want to make sure you have all PHPCompatibility rulesets available at any time, you can use the PHPCompatibilityAll package [GitHub](https://github.com/PHPCompatibility/PHPCompatibilityAll)|[Packagist](https://packagist.org/packages/phpcompatibility/phpcompatibility-all). - -For more information, see the [Readme](https://github.com/PHPCompatibility/PHPCompatibility#using-a-frameworkcms-specific-ruleset) and [Contributing guidelines](https://github.com/PHPCompatibility/PHPCompatibility/blob/master/.github/CONTRIBUTING.md#frameworkcms-specific-rulesets). - -#### Changes expected in PHPCompatibility 9.0.0 -The next version of PHPCompatibility will include a major directory layout restructuring which means that the sniff codes of all sniffs will change. - -In this same release, support for PHP_CodeSniffer 1.5.x will be dropped. The new minimum supported PHPCS version will be 2.3.0. - -For more information about these upcoming changes, please read the [announcement](https://github.com/PHPCompatibility/PHPCompatibility/issues/688). - -The `9.0.0` release is expected to be ready later this summer. - - -### Added -- :star2: New `ArgumentFunctionsUsage` sniff to detect usage of the `func_get_args()`, `func_get_arg()` and `func_num_args()` functions and the changes regarding these functions introduced in PHP 5.3. [#596](https://github.com/PHPCompatibility/PHPCompatibility/pull/596). Fixes [#372](https://github.com/PHPCompatibility/PHPCompatibility/issues/372). -- :star2: New `DiscouragedSwitchContinue` sniff to detect `continue` targetting a `switch` control structure for which `E_WARNINGS` will be thrown as of PHP 7.3. [#687](https://github.com/PHPCompatibility/PHPCompatibility/pull/687) -- :star2: New `NewClassMemberAccess` sniff to detect class member access on instantiation as added in PHP 5.4 and class member access on cloning as added in PHP 7.0. [#619](https://github.com/PHPCompatibility/PHPCompatibility/pull/619). Fixes [#53](https://github.com/PHPCompatibility/PHPCompatibility/issues/53). -- :star2: New `NewConstantScalarExpressions` sniff to detect PHP 5.6 scalar expression in contexts where PHP previously only allowed static values. [#617](https://github.com/PHPCompatibility/PHPCompatibility/pull/617). Fixes [#399](https://github.com/PHPCompatibility/PHPCompatibility/issues/399). -- :star2: New `NewGeneratorReturn` sniff to detect `return` statements within generators as introduced in PHP 7.0. [#618](https://github.com/PHPCompatibility/PHPCompatibility/pull/618) -- :star2: New `PCRENewModifiers` sniff to initially detect the new `J` regex modifier as introduced in PHP 7.2. [#600](https://github.com/PHPCompatibility/PHPCompatibility/pull/600). Fixes [#556](https://github.com/PHPCompatibility/PHPCompatibility/issues/556). -- :star2: New `ReservedFunctionNames` sniff to report on double underscore prefixed functions and methods. This was previously reported via an upstream sniff. [#581](https://github.com/PHPCompatibility/PHPCompatibility/pull/581) -- :star2: New `NewTrailingComma` sniff to detect trailing comma's in function calls, method calls, `isset()` and `unset()` as will be introduced in PHP 7.3. [#632](https://github.com/PHPCompatibility/PHPCompatibility/pull/632) -- :star2: New `Upgrade/LowPHPCS` sniff to give users of old PHP_CodeSniffer versions advance warning when support will be dropped in the near future. [#693](https://github.com/PHPCompatibility/PHPCompatibility/pull/693) -- :star: `NewClasses` sniff: check for some 40+ additional PHP native classes added in various PHP versions. [#573](https://github.com/PHPCompatibility/PHPCompatibility/pull/573) -- :star: `NewClosure` sniff: check for usage of `self`/`parent`/`static::` being used within closures, support for which was only added in PHP 5.4. [#669](https://github.com/PHPCompatibility/PHPCompatibility/pull/669). Fixes [#668](https://github.com/PHPCompatibility/PHPCompatibility/pull/668). -- :star: `NewConstants` sniff: recognize constants added by the PHP 5.5+ password extension. [#626](https://github.com/PHPCompatibility/PHPCompatibility/pull/626) -- :star: `NewFunctionParameters` sniff: recognize a number of additional function parameters added in PHP 7.0, 7.1 and 7.2. [#602](https://github.com/PHPCompatibility/PHPCompatibility/pull/602) -- :star: `NewFunctions` sniff: recognize the PHP 5.1 SPL extension functions, the PHP 5.1.1 `hash_hmac()` function, the PHP 5.6 `pg_lo_truncate()` function, more PHP 7.2 Sodium functions and the new PHP 7.3 `is_countable()` function. [#606](https://github.com/PHPCompatibility/PHPCompatibility/pull/606), [#625](https://github.com/PHPCompatibility/PHPCompatibility/pull/625), [#640](https://github.com/PHPCompatibility/PHPCompatibility/pull/640), [#651](https://github.com/PHPCompatibility/PHPCompatibility/pull/651) -- :star: `NewHashAlgorithms` sniff: recognize the new hash algorithms which were added in PHP 7.1. [#599](https://github.com/PHPCompatibility/PHPCompatibility/pull/599) -- :star: `NewInterfaces` sniff: check for the PHP 5.0 `Reflector` interface. [#572](https://github.com/PHPCompatibility/PHPCompatibility/pull/572) -- :star: `OptionalRequiredFunctionParameters` sniff: detect missing `$salt` parameter in calls to the `crypt()` function (PHP 5.6+). [#605](https://github.com/PHPCompatibility/PHPCompatibility/pull/605) -- :star: `RequiredOptionalFunctionParameters` sniff: recognize that the `$varname` parameter of `getenv()` and the `$scale` parameter of `bcscale()` have become optional as of PHP 7.1 and 7.3 respectively. [#598](https://github.com/PHPCompatibility/PHPCompatibility/pull/598), [#612](https://github.com/PHPCompatibility/PHPCompatibility/pull/612) -- :star: New `AbstractFunctionCallParameterSniff` to be used as a basis for sniffs examining function call parameters. [#636](https://github.com/PHPCompatibility/PHPCompatibility/pull/636) -- :star: New `getReturnTypeHintName()` utility method to the `PHPCompatibility\Sniff` class. [#578](https://github.com/PHPCompatibility/PHPCompatibility/pull/578), [#642](https://github.com/PHPCompatibility/PHPCompatibility/pull/642) -- :star: New `isNumber()`, `isPositiveNumber()` and `isNegativeNumber()` utility methods to the `PHPCompatibility\Sniff` class. [#610](https://github.com/PHPCompatibility/PHPCompatibility/pull/610), [#650](https://github.com/PHPCompatibility/PHPCompatibility/pull/650) -- :star: New `isShortList()` utility method to the `PHPCompatibility\Sniff` class. [#635](https://github.com/PHPCompatibility/PHPCompatibility/pull/635) -- :star: New `getCommandLineData()` method to the `PHPCompatibility\PHPCSHelper` class to provide PHPCS cross-version compatible access to command line info at run time. [#693](https://github.com/PHPCompatibility/PHPCompatibility/pull/693) -- :star: Duplicate of upstream `findEndOfStatement()` method to the `PHPCompatibility\PHPCSHelper` class to allow for PHPCS cross-version usage of that method. [#614](https://github.com/PHPCompatibility/PHPCompatibility/pull/614) -- :umbrella: additional unit test to confirm that the `PHPCompatibility\Sniff::isUseOfGlobalConstant()` method handles multi-constant declarations correctly. [#587](https://github.com/PHPCompatibility/PHPCompatibility/pull/587) -- :umbrella: additional unit tests to confirm that the `PHPCompatibility\Sniff::isClassProperty()` method handles multi-property declarations correctly. [#583](https://github.com/PHPCompatibility/PHPCompatibility/pull/583) -- :books: [Readme](https://github.com/PHPCompatibility/PHPCompatibility#using-a-frameworkcms-specific-ruleset) & [Contributing](https://github.com/PHPCompatibility/PHPCompatibility/blob/master/.github/CONTRIBUTING.md#frameworkcms-specific-rulesets): add information about the framework/CMS specific rulesets. Related PRs: [#615](https://github.com/PHPCompatibility/PHPCompatibility/pull/615), [#624](https://github.com/PHPCompatibility/PHPCompatibility/pull/624), [#648](https://github.com/PHPCompatibility/PHPCompatibility/pull/648), [#674](https://github.com/PHPCompatibility/PHPCompatibility/pull/674), [#685](https://github.com/PHPCompatibility/PHPCompatibility/pull/685), [#694](https://github.com/PHPCompatibility/PHPCompatibility/pull/694). Related to issue [#530](https://github.com/PHPCompatibility/PHPCompatibility/issues/530). -- :books: Readme: information about the PHPCS 3.3.0 change which allows for a `testVersion` in a custom ruleset to be overruled by the command-line. [#607](https://github.com/PHPCompatibility/PHPCompatibility/pull/607) - -### Changed -- :books: Adjusted references to the old repository location throughout the codebase to reflect the move to a GitHub organization. [#689](https://github.com/PHPCompatibility/PHPCompatibility/pull/689) - This repository will now live in [https://github.com/PHPCompatibility/PHPCompatibility](https://github.com/PHPCompatibility/PHPCompatibility) and the Packagist reference will now be `phpcompatibility/php-compatibility`. -- :white_check_mark: The `getReturnTypeHintToken()` utility method has been made compatible with the changes in the PHPCS tokenizer which were introduced in PHP_CodeSniffer 3.3.0. [#642](https://github.com/PHPCompatibility/PHPCompatibility/pull/642). Fixes [#639](https://github.com/PHPCompatibility/PHPCompatibility/issues/639). -- :pushpin: `ConstantArrayUsingConst`: improved handling of multi-constant declarations. [#593](https://github.com/PHPCompatibility/PHPCompatibility/pull/593) -- :pushpin: `NewHeredocInitialize`: improved handling of constant declarations using the `const` keyword. - The sniff will now also report on multi-declarations for variables, constants and class properties and on using heredoc as a function parameter default. [#641](https://github.com/PHPCompatibility/PHPCompatibility/pull/641) -- :pushpin: `ForbiddenEmptyListAssignment`: this sniff will now also report on empty list assignments when the PHP 7.1 short list syntax is used. [#653](https://github.com/PHPCompatibility/PHPCompatibility/pull/653) -- :pushpin: The `ForbiddenNegativeBitshift` sniff would previously only report on "bitshift right". As of this version, "bitshift left" and bitshift assignments will also be recognized. [#614](https://github.com/PHPCompatibility/PHPCompatibility/pull/614) -- :pushpin: The `NewClasses` and `NewInterfaces` sniffs will now also report on new classes/interfaces when used as _return type_ declarations. [#578](https://github.com/PHPCompatibility/PHPCompatibility/pull/578) -- :pushpin: The `NewScalarTypeDeclarations` sniff will now recognize `parent` as a valid type declaration. - The sniff will now also throw an error about using `self` and `parent` when PHP < 5.2 needs to be supported as PHP 5.1 and lower would presume these to be class names instead of keywords. [#595](https://github.com/PHPCompatibility/PHPCompatibility/pull/595) -- :pushpin: The `PregReplaceEModifier` sniff - and the `PCRENewModifiers` sniff by extension - will now correctly examine and report on modifiers in regexes passed via calls to `preg_replace_callback_array()`. [#600](https://github.com/PHPCompatibility/PHPCompatibility/pull/600), [#636](https://github.com/PHPCompatibility/PHPCompatibility/pull/636) -- :pushpin: `getReturnTypeHintToken()` utility method: improved support for interface methods and abstract function declarations. [#652](https://github.com/PHPCompatibility/PHPCompatibility/pull/652) -- :pushpin: The `findExtendedClassName()`, `findImplementedInterfaceNames()`, `getMethodParameters()` utility methods which are duplicates of upstream PHPCS methods, have been moved from the `PHPCompatibility\Sniff` class to the `PHPCompatibility\PHPCSHelper` class and have become static methods. [#613](https://github.com/PHPCompatibility/PHPCompatibility/pull/613) -- :white_check_mark: `getReturnTypeHintToken()` utility method: align returned `$stackPtr` with native PHPCS behaviour by returning the last token of the type declaration. [#575](https://github.com/PHPCompatibility/PHPCompatibility/pull/575) -- :white_check_mark: PHPCS cross-version compatibility: sync `getMethodParameters()` method with improved upstream version. [#643](https://github.com/PHPCompatibility/PHPCompatibility/pull/643) -- :pencil2: The `MbstringReplaceEModifier`, `PregReplaceEModifier` and the `PregReplaceEModifier` sniffs now `extend` the new `AbstractFunctionCallParameterSniff` class. This should yield more accurate results when checking whether one of the target PHP functions was called. [#636](https://github.com/PHPCompatibility/PHPCompatibility/pull/636) -- :pencil2: `DeprecatedNewReference` sniff: minor change to the error text and code - was `Forbidden`, now `Removed` -. Custom rulesets which explicitly excluded this error code will need to be updated. [#594](https://github.com/PHPCompatibility/PHPCompatibility/pull/594) -- :pencil2: `NewScalarTypeDeclarations` sniff: minor change to the error message text.[#644](https://github.com/PHPCompatibility/PHPCompatibility/pull/644) -- :umbrella: The unit test framework now allows for sniffs in categories other than `PHP`. [#634](https://github.com/PHPCompatibility/PHPCompatibility/pull/634) -- :umbrella: Boyscouting: fixed up some (non-relevant) parse errors in a unit test case file. [#576](https://github.com/PHPCompatibility/PHPCompatibility/pull/576) -- :green_heart: Travis: build tests are now also being run against the lowest supported PHPCS 3.x version. Previously only the highest supported PHPCS 3.x version was tested against. [#633](https://github.com/PHPCompatibility/PHPCompatibility/pull/633) -- :books: Readme: Improved Composer install instructions. [#690](https://github.com/PHPCompatibility/PHPCompatibility/pull/690) -- :books: Minor documentation fixes. [#672](https://github.com/PHPCompatibility/PHPCompatibility/pull/672) -- :wrench: Minor performance optimizations and code simplifications. [#592](https://github.com/PHPCompatibility/PHPCompatibility/pull/592), [#630](https://github.com/PHPCompatibility/PHPCompatibility/pull/630), [#671](https://github.com/PHPCompatibility/PHPCompatibility/pull/671) -- :wrench: Composer: Various improvements, including improved information about the suggested packages, suggesting `roave/security-advisories`, allowing for PHPUnit 7.x. [#604](https://github.com/PHPCompatibility/PHPCompatibility/pull/604/files), [#616](https://github.com/PHPCompatibility/PHPCompatibility/pull/616), [#622](https://github.com/PHPCompatibility/PHPCompatibility/pull/622), [#646](https://github.com/PHPCompatibility/PHPCompatibility/pull/646) -- :wrench: Various Travis build script improvements, including tweaks for faster build time, validation of the `composer.json` file, validation of the framework specific rulesets. [#570](https://github.com/PHPCompatibility/PHPCompatibility/pull/570), [#571](https://github.com/PHPCompatibility/PHPCompatibility/pull/571), [#579](https://github.com/PHPCompatibility/PHPCompatibility/pull/579), [#621](https://github.com/PHPCompatibility/PHPCompatibility/pull/621), [#631](https://github.com/PHPCompatibility/PHPCompatibility/pull/631) -- :wrench: Build/PHPCS: made some more CS conventions explicit and start using PHPCS 3.x options for the PHPCompatibility native ruleset. [#586](https://github.com/PHPCompatibility/PHPCompatibility/pull/586), [#667](https://github.com/PHPCompatibility/PHPCompatibility/pull/667), [#673](https://github.com/PHPCompatibility/PHPCompatibility/pull/673) -- :wrench: Some code style clean up and start using the new inline PHPCS 3.2+ annotations where applicable. [#586](https://github.com/PHPCompatibility/PHPCompatibility/pull/586), [#591](https://github.com/PHPCompatibility/PHPCompatibility/pull/591), [#620](https://github.com/PHPCompatibility/PHPCompatibility/pull/620), [#673](https://github.com/PHPCompatibility/PHPCompatibility/pull/673) - -### Removed -- :no_entry_sign: PHPCompatibility no longer explicitly supports PHP_CodeSniffer 2.2.0. [#687](https://github.com/PHPCompatibility/PHPCompatibility/pull/687), [#690](https://github.com/PHPCompatibility/PHPCompatibility/pull/690) -- :no_entry_sign: The PHPCompatibility ruleset no longer includes the PHPCS native `Generic.NamingConventions.CamelCapsFunctionName`. Double underscore prefixed function names are now being reported on by a new dedicated sniff. [#581](https://github.com/PHPCompatibility/PHPCompatibility/pull/581) -- :no_entry_sign: PHPCompatibility no longer explicitly supports HHVM and builds are no longer tested against HHVM. - For now, running PHPCompatibility on HHVM to test PHP code may still work for a little while, but HHVM has announced they are [dropping PHP support](https://hhvm.com/blog/2017/09/18/the-future-of-hhvm.html). [#623](https://github.com/PHPCompatibility/PHPCompatibility/pull/623). Fixes [#603](https://github.com/PHPCompatibility/PHPCompatibility/issues/603). -- :books: Readme: badges from services which are no longer supported or inaccurate. [#609](https://github.com/PHPCompatibility/PHPCompatibility/pull/609), [#628](https://github.com/PHPCompatibility/PHPCompatibility/pull/628) - -### Fixed -- :bug: Previously, the PHPCS native `Generic.NamingConventions.CamelCapsFunctionName` sniff was included in PHPCompatibility. Some error codes of this sniff were excluded, as well as some error messages changed (via the ruleset). - If/when PHPCompatibility would be used in combination with a code style-type ruleset, this could inadvertently lead to underreporting of issues which the CS-type ruleset intends to have reported - i.e. the error codes excluded by PHPCompatibility -. This has now been fixed. [#581](https://github.com/PHPCompatibility/PHPCompatibility/pull/581) -- :bug: The `ForbiddenNegativeBitshift` sniff would incorrectly throw an error when a bitshift was based on a calculation which included a negative number, but would not necessarily result in a negative number. [#614](https://github.com/PHPCompatibility/PHPCompatibility/pull/614). Fixes [#294](https://github.com/PHPCompatibility/PHPCompatibility/issues/294), [#466](https://github.com/PHPCompatibility/PHPCompatibility/issues/466). -- :bug: The `NewClosure` sniff would report the same issue twice when the issue was encountered in a nested closure. [#669](https://github.com/PHPCompatibility/PHPCompatibility/pull/669) -- :bug: The `NewKeywords` sniff would underreport on non-lowercase keywords. [#627](https://github.com/PHPCompatibility/PHPCompatibility/pull/627) -- :bug: The `NewKeywords` sniff would incorrectly report on the use of class constants and class properties using the same name as a keyword. [#627](https://github.com/PHPCompatibility/PHPCompatibility/pull/627) -- :bug: The `NewNullableTypes` sniff would potentially underreport when comments where interspersed in the (return) type declarations. [#577](https://github.com/PHPCompatibility/PHPCompatibility/pull/577) -- :bug: The `Sniff::getFunctionCallParameters()` utility method would in rare cases return incorrect results when it encountered a closure as a parameter. [#682](https://github.com/PHPCompatibility/PHPCompatibility/pull/682) -- :bug: The `Sniff::getReturnTypeHintToken()` utility method would not always return a `$stackPtr`. [#645](https://github.com/PHPCompatibility/PHPCompatibility/pull/645) -- :bug: Minor miscellanous other bugfixes. [#670](https://github.com/PHPCompatibility/PHPCompatibility/pull/670) -- :umbrella: `PHPCompatibility\Tests\BaseClass\MethodTestFrame::getTargetToken()` could potentially not find the correct token to run a test against. [#588](https://github.com/PHPCompatibility/PHPCompatibility/pull/588) - -### Credits -Thanks go out to [Michael Babker] and [Juliette Reinders Folmer] for their contributions to this version. :clap: - - -## [8.1.0] - 2017-12-27 - -See all related issues and PRs in the [8.1.0 milestone]. - -### Added -- :star2: New `NewConstants` and `RemovedConstants` sniffs to detect usage of new/removed PHP constants for all PHP versions from PHP 5 up. [#526](https://github.com/PHPCompatibility/PHPCompatibility/pull/525), [#551](https://github.com/PHPCompatibility/PHPCompatibility/pull/551), [#566](https://github.com/PHPCompatibility/PHPCompatibility/pull/566). Fixes [#263](https://github.com/PHPCompatibility/PHPCompatibility/issues/263). -- :star2: New `MagicAutoloadDeprecation` sniff to detect deprecated `__autoload()` functions as deprecated in PHP 7.2. [#540](https://github.com/PHPCompatibility/PHPCompatibility/pull/540) -- :star2: New `OptionalRequiredFunctionParameter` sniff to check for missing function call parameters which were required and only became optional in a later PHP version. [#524](https://github.com/PHPCompatibility/PHPCompatibility/pull/524) -- :star2: New `DynamicAccessToStatic` sniff to detect dynamic access to static methods and properties, as well as class constants, prior to PHP 5.3. [#535](https://github.com/PHPCompatibility/PHPCompatibility/pull/535). Fixes [#534](https://github.com/PHPCompatibility/PHPCompatibility/issues/534). -- :star: `DeprecatedFunctions` sniff: recognize yet more PHP 7.2 deprecated functions. [#561](https://github.com/PHPCompatibility/PHPCompatibility/pull/561), [#566](https://github.com/PHPCompatibility/PHPCompatibility/pull/566) -- :star: `DeprecatedIniDirectives` sniff: recognize the last of the PHP 7.2 deprecated ini directives. [#566](https://github.com/PHPCompatibility/PHPCompatibility/pull/566), [#567](https://github.com/PHPCompatibility/PHPCompatibility/pull/567) -- :star: `NewFunctions` : detection of all new PHP 7.2 functions added. [#522](https://github.com/PHPCompatibility/PHPCompatibility/pull/522), [#545](https://github.com/PHPCompatibility/PHPCompatibility/pull/545), [#551](https://github.com/PHPCompatibility/PHPCompatibility/pull/551), [#565](https://github.com/PHPCompatibility/PHPCompatibility/pull/565) -- :star: `RemovedExtensions` : report on usage of the `mcrypt` extension which has been removed in PHP 7.2. [#566](https://github.com/PHPCompatibility/PHPCompatibility/pull/566) -- :star: `RemovedGlobalVariables` : detection of the use of `$php_errormsg` with `track_errors` which has been deprecated in PHP 7.2. [#528](https://github.com/PHPCompatibility/PHPCompatibility/pull/528) -- :books: Documentation : added reporting usage instructions. [#533](https://github.com/PHPCompatibility/PHPCompatibility/pull/533), [#552](https://github.com/PHPCompatibility/PHPCompatibility/pull/552) - -### Changed -- :pushpin: `NewClosures` : downgraded "$this found in closure outside class" to warning. [#536](https://github.com/PHPCompatibility/PHPCompatibility/pull/535). Fixes [#527](https://github.com/PHPCompatibility/PHPCompatibility/issues/527). -- :pushpin: `ForbiddenGlobalVariableVariable` : the sniff will now throw an error for each variable in a `global` statement which is no longer supported and show the variable found to make it easier to fix this. Previously only one error would be thrown per `global` statement. [#564](https://github.com/PHPCompatibility/PHPCompatibility/pull/564) -- :pushpin: `ForbiddenGlobalVariableVariable` : the sniff will now throw `warning`s for non-bare variables used in a `global` statement as those are discouraged since PHP 7.0. [#564](https://github.com/PHPCompatibility/PHPCompatibility/pull/564) -- :rewind: `NewLanguageConstructs` : updated the version number for `T_COALESCE_EQUAL`. [#523](https://github.com/PHPCompatibility/PHPCompatibility/pull/523) -- :pencil2: `Sniff::getTestVersion()` : simplified regex logic. [#520](https://github.com/PHPCompatibility/PHPCompatibility/pull/520) -- :green_heart: Travis : build tests are now being run against PHP 7.2 as well. [#511](https://github.com/PHPCompatibility/PHPCompatibility/pull/511) -- :wrench: Improved check for superfluous whitespaces in files. [#542](https://github.com/PHPCompatibility/PHPCompatibility/pull/542) -- :wrench: Build/PHPCS : stabilized the exclude patterns. [#529](https://github.com/PHPCompatibility/PHPCompatibility/pull/529) -- :wrench: Build/PHPCS : added array indentation check. [#538](https://github.com/PHPCompatibility/PHPCompatibility/pull/538) -- :white_check_mark: PHPCS cross-version compatibility : sync `FindExtendedClassname()` method with upstream. [#507](https://github.com/PHPCompatibility/PHPCompatibility/pull/507) -- :wrench: The minimum version for the recommended `DealerDirect/phpcodesniffer-composer-installer` Composer plugin has been upped to `0.4.3`. [#548](https://github.com/PHPCompatibility/PHPCompatibility/pull/548) - -### Fixed -- :bug: `ForbiddenCallTimePassByReference` : a false positive was being thrown when a global constant was followed by a _bitwise and_. [#562](https://github.com/PHPCompatibility/PHPCompatibility/pull/562). Fixes [#39](https://github.com/PHPCompatibility/PHPCompatibility/issues/39). -- :bug: `ForbiddenGlobalVariableVariable` : the sniff was overzealous and would also report on `global` in combination with variable variables which are still supported. [#564](https://github.com/PHPCompatibility/PHPCompatibility/pull/564). Fixes [#537](https://github.com/PHPCompatibility/PHPCompatibility/issues/537). -- :bug: `ForbiddenGlobalVariableVariable` : variables interspersed with whitespace and/or comments were not being reported. [#564](https://github.com/PHPCompatibility/PHPCompatibility/pull/564) -- :rewind: `ForbiddenNamesAsInvokedFunctions` : improved recognition of function invocations using forbidden words and prevent warnings for keywords which are no longer forbidden as method names in PHP 7.0+. [#516](https://github.com/PHPCompatibility/PHPCompatibility/pull/516). Fixes [#515](https://github.com/PHPCompatibility/PHPCompatibility/issues/515) -- :bug: `VariableVariables` : variables interspersed with whitespace and/or comments were not being reported. [#563](https://github.com/PHPCompatibility/PHPCompatibility/pull/563) -- :umbrella: Fixed some unintentional syntax errors in test files. [#539](https://github.com/PHPCompatibility/PHPCompatibility/pull/539) -- :umbrella: Tests : fixed case numbering error. [#525](https://github.com/PHPCompatibility/PHPCompatibility/pull/525) -- :books: Tests : added missing test skip explanation. [#521](https://github.com/PHPCompatibility/PHPCompatibility/pull/521) -- :wrench: Fixed PHPCS whitespaces. [#543](https://github.com/PHPCompatibility/PHPCompatibility/pull/543) -- :wrench: Fixed code test coverage verification. [#550](https://github.com/PHPCompatibility/PHPCompatibility/pull/550). Fixes [#549](https://github.com/PHPCompatibility/PHPCompatibility/issues/549). - -### Credits -Thanks go out to [Juliette Reinders Folmer] and [Jonathan Van Belle] for their contributions to this version. :clap: - - -## [8.0.1] - 2017-08-07 - -See all related issues and PRs in the [8.0.1 milestone]. - -### Added -- :star2: New `DeprecatedTypeCasts` sniff to detect deprecated and removed type casts, such as the `(unset)` type cast as deprecated in PHP 7.2. [#498](https://github.com/PHPCompatibility/PHPCompatibility/pull/498) -- :star2: New `NewTypeCasts` sniff to detect type casts not present in older PHP versions such as the `(binary)` type cast as added in PHP 5.2.1. [#497](https://github.com/PHPCompatibility/PHPCompatibility/pull/497) -- :star: `NewGroupUseDeclaration`: Detection of PHP 7.2 trailing comma's in group use statements. [#504](https://github.com/PHPCompatibility/PHPCompatibility/pull/504) -- :star: `DeprecatedFunctions` sniff: recognize some more PHP 7.2 deprecated functions. [#501](https://github.com/PHPCompatibility/PHPCompatibility/pull/501) -- :star: `DeprecatedIniDirectives` sniff: recognize more PHP 7.2 deprecated ini directives. [#500](https://github.com/PHPCompatibility/PHPCompatibility/pull/500) -- :star: `ForbiddenNames` sniff: recognize `object` as a forbidden keyword since PHP 7.2. [#499](https://github.com/PHPCompatibility/PHPCompatibility/pull/499) -- :star: `NewReturnTypeDeclarations` sniff: recognize generic `parent`, PHP 7.1 `iterable` and PHP 7.2 `object` return type declarations. [#505](https://github.com/PHPCompatibility/PHPCompatibility/pull/505), [#499](https://github.com/PHPCompatibility/PHPCompatibility/pull/499) -- :star: `NewScalarTypeDeclarations` sniff: recognize PHP 7.2 `object` type declarion. [#499](https://github.com/PHPCompatibility/PHPCompatibility/pull/499) - -### Changed -- :pencil2: Improved clarity of the deprecated functions alternative in the error message. [#502](https://github.com/PHPCompatibility/PHPCompatibility/pull/502) - -### Fixed -- :fire_engine: Temporary hotfix for installed_paths (pending [upstream fix](https://github.com/squizlabs/PHP_CodeSniffer/issues/1591).) [#503](https://github.com/PHPCompatibility/PHPCompatibility/pull/503) - -### Credits -Thanks go out to [Juliette Reinders Folmer] for her contributions to this version. :clap: - - - -## [8.0.0] - 2017-08-03 - -**IMPORTANT**: This release contains a **breaking change**. Please read the below information carefully before upgrading! - -The directory layout of the PHPCompatibility standard has been changed for improved compatibility with Composer. -This means that the PHPCompatibility standard no longer extends from the root directory of the repository, but now lives in its own subdirectory `/PHPCompatibility`. - -This release also bring compatibility with PHPCS 3.x to the PHPCompatibility standard. - -There are two things you will need to be aware of: -* The path to the PHPCompatibility standard has changed. -* If you intend to upgrade to PHPCS 3.x, the path to the `phpcs` script has changed (upstream change). - -Please follow the below upgrade instructions carefully. This should be a one-time only action. - -### Upgrade instructions - -### Before upgrading - -If you had previously made accommodations for the old directory layout, you should remove any such _"hacks"_ (meant in the kindest of ways) now. - -By this we mean: symlinks for the PHPCompatibility install to the `PHP_CodeSniffer/CodeSniffer/Standards` directory, scripts to move the sniffs files to the PHPCS directory, scripts which made symlinks etc. - -So, please remove those first. - -> **Side-note**: -> -> If you had previously forked this repository to solve this issue, please consider reverting your fork to the official version or removing it all together. - -### Upgrading: re-registering PHPCompatibility with PHP CodeSniffer - -External PHP CodeSniffer standards need to be registered with PHP CodeSniffer. You have probably done this the first time you used PHPCompatibility or have a script or Composer plugin in place to do this for you. - -As the directory layout of PHPCompatibility has changed, the path previously registered with PHP CodeSniffer will no longer work and running `phpcs -i` will **_not_** list PHPCompatibility as one of the registered standards. - -#### Using a Composer plugin - -If you use Composer, we recommend you use a Composer plugin to sort this out. In previous install instructions we recommended the SimplyAdmin plugin for this. This plugin has since been abandoned. We now recommend the DealerDirect plugin. -```bash -composer remove --dev simplyadmire/composer-plugins -composer require --dev dealerdirect/phpcodesniffer-composer-installer:^0.4.3 -composer install -composer update phpcompatibility/php-compatibility squizlabs/php_codesniffer -vendor/bin/phpcs -i -``` -If all went well, you should now see PHPCompatibility listed again in the list of installed standards. - -#### Manually re-registering PHPCompatibility - -1. First run `phpcs --config-show` to check which path(s) are currently registered with PHP CodeSniffer for external standards. -2. Check in the below table what the new path for PHPCompatibility will be - the path should point to the root directory of your PHPCompatibility install (not to the sub-directory of the same name): - - Install type | Old path | New path - ------------ | -------- | --------- - Composer | `vendor/wimg` | `vendor/phpcompatibility/php-compatibility` - Unzipped release to arbitrary directory | `path/to/dir/abovePHPCompatibility` | `path/to/dir/abovePHPCompatibility/PHPCompatibility` - Git checkout | `path/to/dir/abovePHPCompatibility` | `path/to/dir/abovePHPCompatibility/PHPCompatibility` - PEAR | If the old install instruction has been followed, not registered. | `path/to/PHPCompatibility` - - > **Side-note**: - > - > If you used the old install instructions for a PEAR install, i.e. checking out the latest release to the `PHP/CodeSniffer/Standards/PHPCompatibility` directory, and you intend to upgrade to PHP CodeSniffer 3.x, it is recommended you move the PHPCompatibility folder out of the PEAR directory now, as the layout of the PHPCS directory has changed with PHPCS 3.x and you may otherwise lose your PHPCompatibility install when you upgrade PHP CodeSniffer via PEAR. - -3. There are two ways in which you can register the new `installed_paths` value with PHP CodeSniffer. Choose your preferred method: - * Run `phpcs --config-set installed_paths ...` and include all previously installed paths including the _adjusted_ path for the PHPCompatibility standard. - - For example, if the previous value of `installed_paths` was - - `/path/to/MyStandard,/path/to/dir/abovePHPCompatibility` - - you should now set it using - - `phpcs --config-set installed_paths /path/to/MyStandard,/path/to/PHPCompatibility` - - * If you use a custom ruleset in combination with PHPCS 2.6.0 or higher, you can pass the value to PHPCS from your custom ruleset: - ```xml - <config name="installed_paths" value="vendor/phpcompatibility/php-compatibility" /> - ``` -4. Run `phpcs -i` to verify that the PHPCompatibility standard is now listed again in the list of installed standards. - - -### Upgrading to PHPCS 3.x - -The path to the `phpcs` script has changed in PHPCS 3.x which will impact how you call PHPCS. - -Version | PHPCS 2.x | PHPCS 3.x -------- | --------- | --------- -Generic `phpcs` Command | `path/to/PHP_CodeSniffer/scripts/phpcs ....` | `path/to/PHP_CodeSniffer/bin/phpcs ....` -Composer command | `vendor/bin/phpcs ...` | `vendor/bin/phpcs ...` - -So, for Composer users, nothing changes. For everyone else, you may want to add the `path/to/PHP_CodeSniffer/bin/phpcs` path to your PATH environment variable or adjust any scripts - like build scripts - which call PHPCS. - - -### Upgrading a Travis build script - -If you run PHPCompatibility against your code as part of your Travis build: -* If you use Composer to install PHP CodeSniffer and PHPCompatibility on the travis image and you've made the above mentioned changes, your build should pass again. -* If you use `git clone` to install PHP CodeSniffer and PHPCompatibility on the travis image, your build will fail until you make the following changes: - 1. Check which branch of PHPCS is being checked out. If you previously fixed this to a pre-PHPCS 3.x branch or tag, you can now change this (back) to `master` or a PHPCS 3 tag. - 2. Check to which path PHPCompatibility is being cloned and adjust the path if necessary. - 3. Adjust the `phpcs --config-set installed_paths` command as described above to point to the root of the cloned PHPCompatibility repo. - 4. If you switched to using PHPCS 3.x, adjust the call to PHPCS. - - - -### Changelog for version 8.0.0 - -See all related issues and PRs in the [8.0.0 milestone]. - -### Added -- :two_hearts: Support for PHP CodeSniffer 3.x. [#482](https://github.com/PHPCompatibility/PHPCompatibility/pull/482), [#481](https://github.com/PHPCompatibility/PHPCompatibility/pull/481), [#480](https://github.com/PHPCompatibility/PHPCompatibility/pull/480), [#488](https://github.com/PHPCompatibility/PHPCompatibility/pull/488), [#489](https://github.com/PHPCompatibility/PHPCompatibility/pull/489), [#495](https://github.com/PHPCompatibility/PHPCompatibility/pull/495) - -### Changed -- :gift: As of this version PHPCompatibility will use semantic versioning. -- :fire: The directory structure of the repository has changed for better compatibility with installation via Composer. [#446](https://github.com/PHPCompatibility/PHPCompatibility/pull/446). Fixes [#102](https://github.com/PHPCompatibility/PHPCompatibility/issues/102), [#107](https://github.com/PHPCompatibility/PHPCompatibility/issues/107) -- :pencil2: The custom `functionWhitelist` property for the `PHPCompatibility.PHP.RemovedExtensions` sniff is now only supported in combination with PHP CodeSniffer 2.6.0 or higher (due to an upstream bug which was fixed in PHPCS 2.6.0). [#482](https://github.com/PHPCompatibility/PHPCompatibility/pull/482) -- :wrench: Improved the information provided to Composer from the `composer.json` file. [#446](https://github.com/PHPCompatibility/PHPCompatibility/pull/446), [#482](https://github.com/PHPCompatibility/PHPCompatibility/pull/482), [#486](https://github.com/PHPCompatibility/PHPCompatibility/pull/486) -- :wrench: Release archives will no longer contain the unit tests and other typical development files. You can still get these by using Composer with `--prefer-source` or by checking out a git clone of the repository. [#494](https://github.com/PHPCompatibility/PHPCompatibility/pull/494) -- :wrench: A variety of minor improvements to the build process. [#485](https://github.com/PHPCompatibility/PHPCompatibility/pull/485), [#486](https://github.com/PHPCompatibility/PHPCompatibility/pull/486), [#487](https://github.com/PHPCompatibility/PHPCompatibility/pull/487) -- :wrench: Some files for use by contributors have been renamed to use `.dist` extensions or moved for easier access. [#478](https://github.com/PHPCompatibility/PHPCompatibility/pull/478), [#479](https://github.com/PHPCompatibility/PHPCompatibility/pull/479), [#483](https://github.com/PHPCompatibility/PHPCompatibility/pull/483), [#493](https://github.com/PHPCompatibility/PHPCompatibility/pull/493) -- :books: The installation instructions in the Readme. [#496](https://github.com/PHPCompatibility/PHPCompatibility/pull/496) -- :books: The unit test instructions in the Contributing file. [#496](https://github.com/PHPCompatibility/PHPCompatibility/pull/496) -- :books: Improved the example code in the Readme. [#490](https://github.com/PHPCompatibility/PHPCompatibility/pull/490) - -### Removed -- :no_entry_sign: Support for PHP 5.1 and 5.2. - - The sniffs can now only be run on PHP 5.3 or higher in combination with PHPCS 1.5.6 or 2.x and on PHP 5.4 or higher in combination with PHPCS 3.x. [#484](https://github.com/PHPCompatibility/PHPCompatibility/pull/484), [#482](https://github.com/PHPCompatibility/PHPCompatibility/pull/482) - -### Credits -Thanks go out to [Gary Jones] and [Juliette Reinders Folmer] for their contributions to this version. :clap: - - -## [7.1.5] - 2017-07-17 - -See all related issues and PRs in the [7.1.5 milestone]. - -### Added -- :star: The `NewKeywords` sniff will now also sniff for `yield from` which was introduced in PHP 7.0. [#477](https://github.com/PHPCompatibility/PHPCompatibility/pull/477). Fixes [#476](https://github.com/PHPCompatibility/PHPCompatibility/issues/476) -- :books: The LGPL-3.0 license. [#447](https://github.com/PHPCompatibility/PHPCompatibility/pull/447) - -### Changed -- :rewind: The `NewExecutionDirectives` sniff will now also report on execution directives when used in combination with PHPCS 2.0.0-2.3.3. [#451](https://github.com/PHPCompatibility/PHPCompatibility/pull/451) -- :rewind: The `getMethodParameters()` utility method will no longer break when used with PHPCS 1.5.x < 1.5.6. This affected a number of sniffs. [#452](https://github.com/PHPCompatibility/PHPCompatibility/pull/452) -- :rewind: The `inUseScope()` utility method will no longer break when used with PHPCS 2.0.0 - 2.2.0. This affected a number of sniffs. [#454](https://github.com/PHPCompatibility/PHPCompatibility/pull/454) -- :recycle: Various (minor) refactoring for improved performance and sniff accuracy. [#443](https://github.com/PHPCompatibility/PHPCompatibility/pull/443), [#474](https://github.com/PHPCompatibility/PHPCompatibility/pull/474) -- :pencil2: Renamed a test file for consistency. [#453](https://github.com/PHPCompatibility/PHPCompatibility/pull/453) -- :wrench: Code style clean up. [#429](https://github.com/PHPCompatibility/PHPCompatibility/pull/429) -- :wrench: Prevent Composer installing PHPCS 3.x. **_PHPCS 3.x is not (yet) supported by the PHPCompatibility standard, but will be in the near future._** [#444](https://github.com/PHPCompatibility/PHPCompatibility/pull/444) -- :green_heart: The code base will now be checked for consistent code style during build testing. [#429](https://github.com/PHPCompatibility/PHPCompatibility/pull/429) -- :green_heart: The sniffs are now also tested against HHVM for consistent results. _Note: the sniffs do not contain any HHVM specific checks nor is there any intention to add them at this time._ [#450](https://github.com/PHPCompatibility/PHPCompatibility/pull/450) -- :books: Made it explicit that - at this moment - PHPCS 3.x is not (yet) supported. [#444](https://github.com/PHPCompatibility/PHPCompatibility/pull/444) -- :books: Minor improvements to the Readme. [#448](https://github.com/PHPCompatibility/PHPCompatibility/pull/448), [#449](https://github.com/PHPCompatibility/PHPCompatibility/pull/449), [#468](https://github.com/PHPCompatibility/PHPCompatibility/pull/468) -- :books: Minor improvements to the Contributing guidelines. [#467](https://github.com/PHPCompatibility/PHPCompatibility/pull/467) - -### Removed -- :no_entry_sign: The `DefaultTimeZoneRequired` sniff. This sniff was checking server settings rather than code. [#458](https://github.com/PHPCompatibility/PHPCompatibility/pull/458). Fixes [#457](https://github.com/PHPCompatibility/PHPCompatibility/issues/457) -- :no_entry_sign: The `NewMagicClassConstant` sniff as introduced in v 7.1.4 contained two additional checks for not strictly compatibility related issues. One of these was plainly wrong, the other opinionated. Both have been removed. [#442](https://github.com/PHPCompatibility/PHPCompatibility/pull/442). Fixes [#436](https://github.com/PHPCompatibility/PHPCompatibility/issues/436) - -### Fixed -- :bug: `NewClass` sniff: was reporting an incorrect introduction version number for a few of the Exception classes. [#441](https://github.com/PHPCompatibility/PHPCompatibility/pull/441). Fixes [#440](https://github.com/PHPCompatibility/PHPCompatibility/issues/440). -- :bug: `ForbiddenBreakContinueVariableArguments` sniff: was incorrectly reporting an error if the `break` or `continue` was followed by a PHP closing tag (breaking out of PHP). [#462](https://github.com/PHPCompatibility/PHPCompatibility/pull/462). Fixes [#460](https://github.com/PHPCompatibility/PHPCompatibility/issues/460) -- :bug: `ForbiddenGlobalVariableVariable` sniff: was incorrectly reporting an error if the `global` statement was followed by a PHP closing tag (breaking out of PHP). [#463](https://github.com/PHPCompatibility/PHPCompatibility/pull/463). -- :bug: `DeprecatedFunctions` sniff: was reporting false positives for classes using the same name as a deprecated function. [#465](https://github.com/PHPCompatibility/PHPCompatibility/pull/465). Fixes [#464](https://github.com/PHPCompatibility/PHPCompatibility/issues/464) - -### Credits -Thanks go out to [Juliette Reinders Folmer] and [Mark Clements] for their contributions to this version. :clap: - - -## [7.1.4] - 2017-05-06 - -See all related issues and PRs in the [7.1.4 milestone]. - -### Added -- :star2: New `CaseSensitiveKeywords` sniff to detect use of non-lowercase `self`, `static` and `parent` keywords which could cause compatibility issues pre-PHP 5.5. [#382](https://github.com/PHPCompatibility/PHPCompatibility/pull/382) -- :star2: New `ConstantArraysUsingConst` sniff to detect constants defined using the `const` keyword being assigned an array value which was not supported prior to PHP 5.6. [#397](https://github.com/PHPCompatibility/PHPCompatibility/pull/397) -- :star2: New `ForbiddenClosureUseVariableNames` sniff to detect PHP 7.1 forbidden variable names in closure use statements. [#386](https://github.com/PHPCompatibility/PHPCompatibility/pull/386). Fixes [#374](https://github.com/PHPCompatibility/PHPCompatibility/issues/374) -- :star2: New `NewArrayStringDereferencing` sniff to detect array and string literal dereferencing as introduced in PHP 5.5. [#388](https://github.com/PHPCompatibility/PHPCompatibility/pull/388) -- :star2: New `NewHeredocInitialize` sniff to detect initialization of static variables and class properties/constants using the heredoc syntax which is supported since PHP 5.3. [#391](https://github.com/PHPCompatibility/PHPCompatibility/pull/391). Fixes [#51](https://github.com/PHPCompatibility/PHPCompatibility/issues/51) -- :star2: New `NewMagicClassConstant` sniff to detect use of the magic `::class` constant as introduced in PHP 5.5. [#403](https://github.com/PHPCompatibility/PHPCompatibility/pull/403). Fixes [#364](https://github.com/PHPCompatibility/PHPCompatibility/issues/364). -- :star2: New `NewUseConstFunction` sniff to detect use statements importing constants and functions as introduced in PHP 5.6. [#401](https://github.com/PHPCompatibility/PHPCompatibility/pull/401) -- :star: `DeprecatedFunctions` sniff: recognize PHP 7.2 deprecated GD functions. [#392](https://github.com/PHPCompatibility/PHPCompatibility/pull/392) -- :star: `DeprecatedIniDirectives` sniff: recognize PHP 7.2 deprecated `mbstring.func_overload` directive. [#377](https://github.com/PHPCompatibility/PHPCompatibility/pull/377) -- :star: `NewClasses` sniff: check for the PHP 5.1 `libXMLError` class. [#412](https://github.com/PHPCompatibility/PHPCompatibility/pull/412) -- :star: `NewClasses` sniff: recognize all native PHP Exception classes. [#418](https://github.com/PHPCompatibility/PHPCompatibility/pull/418) -- :star: `NewClosure` sniff: check for closures being declared as static and closures using `$this`. Both of which was not supported pre-PHP 5.4. [#389](https://github.com/PHPCompatibility/PHPCompatibility/pull/389). Fixes [#24](https://github.com/PHPCompatibility/PHPCompatibility/issues/24). -- :star: `NewFunctionParameters` sniff: recognize new `exclude_disabled` parameter for the `get_defined_functions()` function as introduced in PHP 7.0.15. [#375](https://github.com/PHPCompatibility/PHPCompatibility/pull/375) -- :star: `NewFunctions` sniff: recognize new PHP 7.2 socket related functions. [#376](https://github.com/PHPCompatibility/PHPCompatibility/pull/376) -- :star: `NewInterfaces` sniff: check for some more PHP native interfaces. [#411](https://github.com/PHPCompatibility/PHPCompatibility/pull/411) -- :star: New `isClassProperty()`, `isClassConstant()` and `validDirectScope()` utility methods to the `PHPCompatibility_Sniff` class. [#393](https://github.com/PHPCompatibility/PHPCompatibility/pull/393), [#391](https://github.com/PHPCompatibility/PHPCompatibility/pull/391). -- :star: New `getTypeHintsFromFunctionDeclaration()` utility method to the `PHPCompatibility_Sniff` class. [#414](https://github.com/PHPCompatibility/PHPCompatibility/pull/414). -- :umbrella: Unit tests against false positives for the `NewMagicMethods` sniff. [#381](https://github.com/PHPCompatibility/PHPCompatibility/pull/381) -- :umbrella: More unit tests for the `getTestVersion()` utility method. [#405](https://github.com/PHPCompatibility/PHPCompatibility/pull/405), [#430](https://github.com/PHPCompatibility/PHPCompatibility/pull/430) -- :green_heart: The XML of the ruleset will now be validated and checked for consistent code style during the build testing by Travis. [#433](https://github.com/PHPCompatibility/PHPCompatibility/pull/433) -- :books: Readme: information about setting `installed_paths` via a custom ruleset. [#407](https://github.com/PHPCompatibility/PHPCompatibility/pull/407) -- :books: `Changelog.md` file containing a record of notable changes since the first tagged release. [#421](https://github.com/PHPCompatibility/PHPCompatibility/pull/421) - -### Changed -- :pushpin: The `ForbiddenNamesAsDeclared` sniff will now emit `warning`s for soft reserved keywords. [#406](https://github.com/PHPCompatibility/PHPCompatibility/pull/406), [#370](https://github.com/PHPCompatibility/PHPCompatibility/pull/370). -- :pushpin: The `ForbiddenNames` sniff will now allow for the more liberal rules for usage of reserved keywords as of PHP 7.0. [#417](https://github.com/PHPCompatibility/PHPCompatibility/pull/417) -- :pushpin: The `InternalInterfaces`, `NewClasses`, `NewConstVisibility`, `NewInterfaces`, `NewMagicMethods`, `NonStaticMagicMethods` and `RemovedGlobalVariables` sniffs will now also sniff for and correctly report violations in combination with anonymous classes. [#378](https://github.com/PHPCompatibility/PHPCompatibility/pull/378), [#383](https://github.com/PHPCompatibility/PHPCompatibility/pull/383), [#393](https://github.com/PHPCompatibility/PHPCompatibility/pull/393), [#394](https://github.com/PHPCompatibility/PHPCompatibility/pull/394), [#395](https://github.com/PHPCompatibility/PHPCompatibility/pull/395), [#396](https://github.com/PHPCompatibility/PHPCompatibility/pull/396). Fixes [#351](https://github.com/PHPCompatibility/PHPCompatibility/issues/351) and [#333](https://github.com/PHPCompatibility/PHPCompatibility/issues/333). -- :pushpin: The `NewClasses` and `NewInterfaces` sniffs will now also report on new classes/interfaces when used as type hints. [#414](https://github.com/PHPCompatibility/PHPCompatibility/pull/414), [#416](https://github.com/PHPCompatibility/PHPCompatibility/pull/416). Fixes [#352](https://github.com/PHPCompatibility/PHPCompatibility/issues/352) -- :pushpin: The `NewClasses` sniff will now also report on Exception classes when used in (multi-)`catch` statements. [#418](https://github.com/PHPCompatibility/PHPCompatibility/pull/418). Fixes [#373](https://github.com/PHPCompatibility/PHPCompatibility/issues/373). -- :pushpin: The `NewScalarTypeDeclarations` sniff will now report on new type hints even when the type hint is nullable. [#379](https://github.com/PHPCompatibility/PHPCompatibility/pull/379) -- :twisted_rightwards_arrows: The `NewNowdoc` sniff has been renamed to `NewNowdocQuotedHeredoc` and will now also check for double quoted heredoc identifiers as introduced in PHP 5.3. [#390](https://github.com/PHPCompatibility/PHPCompatibility/pull/390) -- :rewind: The `NewClasses` sniff will now also report anonymous classes which `extend` a new sniff when used in combination with PHPCS 2.4.0-2.8.0. [#432](https://github.com/PHPCompatibility/PHPCompatibility/pull/432). Fixes [#334](https://github.com/PHPCompatibility/PHPCompatibility/issues/334). -- :pencil2: `NewFunctionParameter` sniff: version number precision for two parameters. [#384](https://github.com/PHPCompatibility/PHPCompatibility/pull/384), [#428](https://github.com/PHPCompatibility/PHPCompatibility/pull/428) -- :umbrella: Skipping two unit tests for the `ForbiddenClosureUseVariable` sniff when run on PHPCS 2.5.1 as these cause an infinite loop due to an upstream bug. [#408](https://github.com/PHPCompatibility/PHPCompatibility/pull/408) -- :umbrella: Skipping unit tests involving `trait`s in combination with PHP < 5.4 and PHPCS < 2.4.0 as `trait`s are not recognized in those circumstances. [#431](https://github.com/PHPCompatibility/PHPCompatibility/pull/431) -- :recycle: Various (minor) refactoring for improved performance and sniff accuracy. [#385](https://github.com/PHPCompatibility/PHPCompatibility/pull/385), [#387](https://github.com/PHPCompatibility/PHPCompatibility/pull/387), [#415](https://github.com/PHPCompatibility/PHPCompatibility/pull/415), [#423](https://github.com/PHPCompatibility/PHPCompatibility/pull/423), [#424](https://github.com/PHPCompatibility/PHPCompatibility/pull/424) -- :recycle: Minor simplification of the PHPUnit 6 compatibility layer and other test code. [#426](https://github.com/PHPCompatibility/PHPCompatibility/pull/426), [#425](https://github.com/PHPCompatibility/PHPCompatibility/pull/425) -- General housekeeping. [#398](https://github.com/PHPCompatibility/PHPCompatibility/pull/398), [#400](https://github.com/PHPCompatibility/PHPCompatibility/pull/400) -- :wrench: Minor tweaks to the Travis build script. [#409](https://github.com/PHPCompatibility/PHPCompatibility/pull/409) -- :green_heart: The sniffs are now also tested against PHP nightly for consistent results. [#380](https://github.com/PHPCompatibility/PHPCompatibility/pull/380) - -### Fixed -- :fire: Using unbounded ranges in `testVersion` resulted in unreported errors when used with sniffs using the `supportsBelow()` method. This affected the results of approximately half the sniffs. [#430](https://github.com/PHPCompatibility/PHPCompatibility/pull/430) -- :bug: The `ForbiddenNames` sniff would throw false positives for `use` statements with the `final` modifier in traits. [#402](https://github.com/PHPCompatibility/PHPCompatibility/pull/402). -- :bug: The `ForbiddenNames` sniff would fail to report on functions declared to return by reference using a reserved keyword as the function name. [#413](https://github.com/PHPCompatibility/PHPCompatibility/pull/413) -- :bug: The `ForbiddenNames` sniff would only examine the first part of a namespace and not report on reserved keywords used in subsequent parts of a nested namespace. [#419](https://github.com/PHPCompatibility/PHPCompatibility/pull/419) -- :bug: The `ForbiddenNames` sniff would not always correctly report on use statements importing constants or functions using reserved keywords. [#420](https://github.com/PHPCompatibility/PHPCompatibility/pull/420) -- :bug: The `NewKeywords` sniff would sometimes fail to report on the `const` keyword when used in a class, but not for a class constant. [#424](https://github.com/PHPCompatibility/PHPCompatibility/pull/424) -- :green_heart: PHPCS has released version 3.0 and updated the `master` branch to reflect this. This was causing the builds to fail. [#422](https://github.com/PHPCompatibility/PHPCompatibility/pull/422) - -### Credits -Thanks go out to [Juliette Reinders Folmer] and [Mark Clements] for their contributions to this version. :clap: - - -## [7.1.3] - 2017-04-02 - -See all related issues and PRs in the [7.1.3 milestone]. - -### Added -- :zap: The `testVersion` config parameter now allows for specifying unbounded ranges. - For example: specifying `-5.6` means: check for compatibility with all PHP versions up to and including PHP 5.6; - Specifying `7.0-` means: check for compatibility with all PHP versions from PHP 7.0 upwards. - For more information about setting the `testVersion`, see [Using the compatibility sniffs](https://github.com/PHPCompatibility/PHPCompatibility#using-the-compatibility-sniffs) in the readme. -- :umbrella: Unit test for multi-line short arrays for the `ShortArray` sniff. [#347](https://github.com/PHPCompatibility/PHPCompatibility/pull/347) -- :umbrella: Various additional unit tests against false positives. [#345](https://github.com/PHPCompatibility/PHPCompatibility/pull/345), [#369](https://github.com/PHPCompatibility/PHPCompatibility/pull/369) -- :umbrella: Unit tests for the `supportsBelow()`, `supportsAbove()` and `getTestVersion()` utility methods. [#363](https://github.com/PHPCompatibility/PHPCompatibility/pull/363) -- :books: Readme: information about installation of the standard using git check-out. [#349](https://github.com/PHPCompatibility/PHPCompatibility/pull/349) -- :books: `Contributing.md` file with information about reporting bugs, requesting features, making pull requests and running the unit tests. [#350](https://github.com/PHPCompatibility/PHPCompatibility/pull/350) - -### Changed -- :pushpin: The `ForbiddenFunctionParametersWithSameName`, `NewScalarTypeDeclarations`, `ParameterShadowSuperGlobals` sniff will now also sniff for and report violations in closures. [#331](https://github.com/PHPCompatibility/PHPCompatibility/pull/331) -- :twisted_rightwards_arrows: :rewind: The check for the PHP 5.3 `nowdoc` structure has been moved from the `NewKeywords` sniff to a new stand-alone `NewNowdoc` sniff which will now also recognize this structure when the sniffs are run on PHP 5.2. [#335](https://github.com/PHPCompatibility/PHPCompatibility/pull/335) -- :rewind: The `ForbiddenNames` sniff will now also correctly recognize reserved keywords used in a declared namespace when run on PHP 5.2. [#362](https://github.com/PHPCompatibility/PHPCompatibility/pull/362) -- :recycle: Various (minor) refactoring for improved performance and sniff accuracy. [#360](https://github.com/PHPCompatibility/PHPCompatibility/pull/360) -- :recycle: The unit tests would previously run each test case file against all PHPCompatibility sniffs. Now, they will only be tested against the sniff which the test case file is intended to test. This allows for more test cases to be tested, more precise testing in combination with `testVersion` settings and makes the unit tests run ~6 x faster. - Relevant additional unit tests have been added and others adjusted. [#369](https://github.com/PHPCompatibility/PHPCompatibility/pull/369) -- :recycle: Refactoring/tidying up of some unit test code. [#343](https://github.com/PHPCompatibility/PHPCompatibility/pull/343), [#345](https://github.com/PHPCompatibility/PHPCompatibility/pull/345), [#356](https://github.com/PHPCompatibility/PHPCompatibility/pull/356), [#355](https://github.com/PHPCompatibility/PHPCompatibility/pull/355), [#359](https://github.com/PHPCompatibility/PHPCompatibility/pull/359) -- General housekeeping. [#346](https://github.com/PHPCompatibility/PHPCompatibility/pull/346) -- :books: Readme: Clarify minimum requirements and influence on the results. [#348](https://github.com/PHPCompatibility/PHPCompatibility/pull/348) - -### Removed -- :twisted_rightwards_arrows: Removed the `LongArrays` sniff. The checks it contained have been moved into the `RemovedGlobalVariables` sniff. Both sniffs essentially did the same thing, just for different PHP native superglobals. [#354](https://github.com/PHPCompatibility/PHPCompatibility/pull/354) - -### Fixed -- :bug: The `PregReplaceEModifier` sniff would throw a false positive if a quote character was used as the regex delimiter. [#357](https://github.com/PHPCompatibility/PHPCompatibility/pull/357) -- :bug: `RemovedGlobalVariables` sniff would report false positives for class properties shadowing the removed `$HTTP_RAW_POST_DATA` variables. [#354](https://github.com/PHPCompatibility/PHPCompatibility/pull/354). -- :bug: The `getFQClassNameFromNewToken()` utility function could go into an infinite loop causing PHP to run out of memory when examining unfinished code (examination during live coding). [#338](https://github.com/PHPCompatibility/PHPCompatibility/pull/338), [#342](https://github.com/PHPCompatibility/PHPCompatibility/pull/342) -- :bug: The `determineNamespace()` utility method would in certain cases not break out a loop. [#358](https://github.com/PHPCompatibility/PHPCompatibility/pull/358) -- :wrench: Travis script: Minor tweak for PHP 5.2 compatibility. [#341](https://github.com/PHPCompatibility/PHPCompatibility/pull/341) -- :wrench: The unit test suite is now also compatible with PHPUnit 6. [#365](https://github.com/PHPCompatibility/PHPCompatibility/pull/365) -- :books: Readme: Typo in the composer instructions. [#344](https://github.com/PHPCompatibility/PHPCompatibility/pull/344) - -### Credits -Thanks go out to [Arthur Edamov], [Juliette Reinders Folmer], [Mark Clements] and [Tadas Juozapaitis] for their contributions to this version. :clap: - - -## [7.1.2] - 2017-02-17 - -See all related issues and PRs in the [7.1.2 milestone]. - -### Added -- :star2: New `VariableVariables` sniff to detect variables variables for which the behaviour has changed in PHP 7.0. [#310](https://github.com/PHPCompatibility/PHPCompatibility/pull/310) Fixes [#309](https://github.com/PHPCompatibility/PHPCompatibility/issues/309). -- :star: The `NewReturnTypeDeclarations` sniff will now also sniff for non-scalar return type declarations, i.e. `array`, `callable`, `self` or a class name. [#323](https://github.com/PHPCompatibility/PHPCompatibility/pull/323) -- :star: The `NewLanguageConstructs` sniff will now also sniff for the null coalesce equal operator `??=`. This operator is slated to be introduced in PHP 7.2 and PHPCS already accounts for it. [#340](https://github.com/PHPCompatibility/PHPCompatibility/pull/340) -- :star: New `getReturnTypeHintToken()` utility method to the `PHPCompatibility_Sniff` class to retrieve return type hints from function declarations in a cross-PHPCS-version compatible way. [#323](https://github.com/PHPCompatibility/PHPCompatibility/pull/323). -- :star: New `stripVariables()` utility method to the `PHPCompatibility_Sniff` class to strip variables from interpolated text strings. [#341](https://github.com/PHPCompatibility/PHPCompatibility/pull/314). -- :umbrella: Additional unit tests covering previously uncovered code. [#308](https://github.com/PHPCompatibility/PHPCompatibility/pull/308) - -### Changed -- :pushpin: The `MbstringReplaceEModifier`, `PregReplaceEModifier` and `NewExecutionDirectives` sniffs will now also correctly interpret double quoted text strings with interpolated variables. [#341](https://github.com/PHPCompatibility/PHPCompatibility/pull/314), [#324](https://github.com/PHPCompatibility/PHPCompatibility/pull/324). -- :pushpin: The `NewNullableTypes` sniff will now also report on nullable (return) type hints when used with closures. [#323](https://github.com/PHPCompatibility/PHPCompatibility/pull/323) -- :pushpin: The `NewReturnTypeDeclarations` sniff will now also report on return type hints when used with closures. [#323](https://github.com/PHPCompatibility/PHPCompatibility/pull/323) -- :pushpin: Allow for anonymous classes in the `inClassScope()` utility method. [#315](https://github.com/PHPCompatibility/PHPCompatibility/pull/315) -- :pushpin: The function call parameter related utility functions can now also be used to get the individual items from an array declaration. [#300](https://github.com/PHPCompatibility/PHPCompatibility/pull/300) -- :twisted_rightwards_arrows: The `NewScalarReturnTypeDeclarations` sniff has been renamed to `NewReturnTypeDeclarations`. [#323](https://github.com/PHPCompatibility/PHPCompatibility/pull/323) -- :rewind: The `ForbiddenNames` sniff will now also correctly ignore anonymous classes when used in combination with PHPCS < 2.3.4. [#319](https://github.com/PHPCompatibility/PHPCompatibility/pull/319) -- :rewind: The `NewAnonymousClasses` sniff will now correctly recognize and report on anonymous classes when used in combination with PHPCS < 2.5.2. [#325](https://github.com/PHPCompatibility/PHPCompatibility/pull/325) -- :rewind: The `NewGroupUseDeclarations` sniff will now correctly recognize and report on group use statements when used in combination with PHPCS < 2.6.0. [#320](https://github.com/PHPCompatibility/PHPCompatibility/pull/320) -- :rewind: The `NewNullableTypes` sniff will now correctly recognize and report on nullable return types when used in combination with PHPCS < 2.6.0. [#323](https://github.com/PHPCompatibility/PHPCompatibility/pull/323) -- :rewind: The `NewReturnTypeDeclarations` sniff will now correctly recognize and report on new return types when used in combination with PHPCS < 2.6.0. [#323](https://github.com/PHPCompatibility/PHPCompatibility/pull/323) -- :recycle: Various (minor) refactoring for improved performance and sniff accuracy. [#317](https://github.com/PHPCompatibility/PHPCompatibility/pull/317) -- :recycle: Defer to upstream `hasCondition()` utility method where appropriate. [#315](https://github.com/PHPCompatibility/PHPCompatibility/pull/315) -- :recycle: Minor refactoring of some unit test code. [#304](https://github.com/PHPCompatibility/PHPCompatibility/pull/304), [#303](https://github.com/PHPCompatibility/PHPCompatibility/pull/303), [#318](https://github.com/PHPCompatibility/PHPCompatibility/pull/318) -- :wrench: All unit tests now have appropriate `@group` annotations allowing for quicker/easier testing of a select group of tests/sniffs. [#305](https://github.com/PHPCompatibility/PHPCompatibility/pull/305) -- :wrench: All unit tests now have appropriate `@covers` annotations to improve code coverage reporting and remove bleed through of accidental coverage. [#307](https://github.com/PHPCompatibility/PHPCompatibility/pull/307) -- :wrench: Minor tweaks to the travis script. [#322](https://github.com/PHPCompatibility/PHPCompatibility/pull/322) -- :green_heart: The PHPCompatibility code base itself will now be checked for cross-version compatibility during build testing. [#322](https://github.com/PHPCompatibility/PHPCompatibility/pull/322) - -### Fixed -- :bug: The `ConstantArraysUsingDefine` sniff would throw false positives if the value of the `define()` was retrieved via a function call and an array parameter was passed. [#327](https://github.com/PHPCompatibility/PHPCompatibility/pull/327) -- :bug: The `ForbiddenCallTimePassByReference` sniff would throw false positives on assign by reference within function calls or conditions. [#302](https://github.com/PHPCompatibility/PHPCompatibility/pull/302) Fixes the last two cases reported in [#68](https://github.com/PHPCompatibility/PHPCompatibility/issues/68#issuecomment-231366445) -- :bug: The `ForbiddenGlobalVariableVariableSniff` sniff would only examine the first variable in a `global ...` statement causing unreported issues if subsequent variables were variable variables. [#316](https://github.com/PHPCompatibility/PHPCompatibility/pull/316) -- :bug: The `NewKeywords` sniff would throw a false positive for the `const` keyword when encountered in an interface. [#312](https://github.com/PHPCompatibility/PHPCompatibility/pull/312) -- :bug: The `NewNullableTypes` sniff would not report on nullable return types for namespaced classnames used as a type hint. [#323](https://github.com/PHPCompatibility/PHPCompatibility/pull/323) -- :bug: The `PregReplaceEModifier` sniff would always consider the first parameter passed as a single regex, while it could also be an array of regexes. This led to false positives and potentially unreported use of the `e` modifier when an array of regexes was passed. [#300](https://github.com/PHPCompatibility/PHPCompatibility/pull/300) -- :bug: The `PregReplaceEModifier` sniff could misidentify the regex delimiter when the regex to be examined was concatenated together from various text strings taken from a compound parameter leading to false positives. [#300](https://github.com/PHPCompatibility/PHPCompatibility/pull/300) -- :white_check_mark: Compatibility with PHPCS 2.7.x. Deal with changed behaviour of the upstream PHP tokenizer and utility function(s). [#313](https://github.com/PHPCompatibility/PHPCompatibility/pull/313), [#323](https://github.com/PHPCompatibility/PHPCompatibility/pull/323), [#326](https://github.com/PHPCompatibility/PHPCompatibility/pull/326), [#340](https://github.com/PHPCompatibility/PHPCompatibility/pull/340) - -### Credits -Thanks go out to [Juliette Reinders Folmer] for her contributions to this version. :clap: - - -## [7.1.1] - 2016-12-14 - -See all related issues and PRs in the [7.1.1 milestone]. - -### Added -- :star: `ForbiddenNamesAsDeclared` sniff: detection of the PHP 7.1 `iterable` and `void` reserved keywords when used to name classes, interfaces or traits. [#298](https://github.com/PHPCompatibility/PHPCompatibility/pull/298) - -### Fixed -- :bug: The `ForbiddenNamesAsInvokedFunctions` sniff would incorrectly throw an error if the `clone` keyword was used with parenthesis. [#299](https://github.com/PHPCompatibility/PHPCompatibility/pull/299). Fixes [#284](https://github.com/PHPCompatibility/PHPCompatibility/issues/284) - -### Credits -Thanks go out to [Juliette Reinders Folmer] for her contributions to this version. :clap: - - -## [7.1.0] - 2016-12-14 - -See all related issues and PRs in the [7.1.0 milestone]. - -### Added -- :star: New `stringToErrorCode()`, `arrayKeysToLowercase()` and `addMessage()` utility methods to the `PHPCompatibility_Sniff` class. [#291](https://github.com/PHPCompatibility/PHPCompatibility/pull/291). - -### Changed -- :pushpin: All sniff error messages now have modular error codes allowing for selectively disabling individual checks - and even selectively disabling individual sniff for specific files - without disabling the complete sniff. [#291](https://github.com/PHPCompatibility/PHPCompatibility/pull/291) -- :pencil2: Minor changes to some of the error message texts for consistency across sniffs. [#291](https://github.com/PHPCompatibility/PHPCompatibility/pull/291) -- :recycle: Refactored the complex version sniffs to reduce code duplication. [#291](https://github.com/PHPCompatibility/PHPCompatibility/pull/291) -- :recycle: Miscellaneous other refactoring for improved performance and sniff accuracy. [#291](https://github.com/PHPCompatibility/PHPCompatibility/pull/291) -- :umbrella: The unit tests for the `RemovedExtensions` sniff now verify that the correct alternative extension is being suggested. [#291](https://github.com/PHPCompatibility/PHPCompatibility/pull/291) - -### Credits -Thanks go out to [Juliette Reinders Folmer] for her contributions to this version. :clap: - - -## [7.0.8] - 2016-10-31 - :ghost: Spooky! :jack_o_lantern: - -See all related issues and PRs in the [7.0.8 milestone]. - -### Added -- :star2: New `ForbiddenNamesAsDeclared` sniff: detection of the [other reserved keywords](http://php.net/manual/en/reserved.other-reserved-words.php) which are reserved as of PHP 7.0 (or higher). [#287](https://github.com/PHPCompatibility/PHPCompatibility/pull/287). Fixes [#115](https://github.com/PHPCompatibility/PHPCompatibility/issues/115). - These were previously sniffed for by the `ForbiddenNames` and `ForbiddenNamesAsInvokedFunctions` sniffs causing false positives as the rules for their reservation are different from the rules for "normal" [reserved keywords](http://php.net/manual/en/reserved.keywords.php). -- :star: New `inUseScope()` utility method to the `PHPCompatibility_Sniff` class which handles PHPCS cross-version compatibility when determining the scope of a `use` statement. [#271](https://github.com/PHPCompatibility/PHPCompatibility/pull/271). -- :umbrella: More unit tests for the `ForbiddenNames` sniff. [#271](https://github.com/PHPCompatibility/PHPCompatibility/pull/271). - -### Changed -- :pushpin: _Deprecated_ functionality should throw a `warning`. _Removed_ or otherwise unavailable functionality should throw an `error`. This distinction was previously not consistently applied everywhere. [#286](https://github.com/PHPCompatibility/PHPCompatibility/pull/286) - This change affects the following sniffs: - * `DeprecatedPHP4StyleConstructors` will now throw a `warning` instead of an `error` for deprecated PHP4 style class constructors. - * `ForbiddenCallTimePassByReference` will now throw a `warning` if the `testVersion` is `5.3` and an `error` if the `testVersion` if `5.4` or higher. - * `MbstringReplaceEModifier` will now throw a `warning` instead of an `error` for usage of the deprecated `e` modifier. - * `PregReplaceEModifier` will now throw a `warning` if the `testVersion` is `5.5` or `5.6` and an `error` if the `testVersion` if `7.0` or higher. Fixes [#290](https://github.com/PHPCompatibility/PHPCompatibility/issues/290). - * `TernaryOperators` will now throw an `error` when the `testVersion` < `5.3` and the middle part has been omitted. - * `ValidIntegers` will now throw a `warning` when an invalid binary integer is detected. -- :pencil2: `DeprecatedFunctions` and `DeprecatedIniDirectives` sniffs: minor change in the sniff error message text. Use _"removed"_ rather than the ominous _"forbidden"_. [#285](https://github.com/PHPCompatibility/PHPCompatibility/pull/285) - Also updated relevant internal variable names and documentation to match. - -### Fixed -- :bug: `ForbiddenNames` sniff would throw false positives for `use` statements which changed the visibility of methods in traits. [#271](https://github.com/PHPCompatibility/PHPCompatibility/pull/271). -- :bug: `ForbiddenNames` sniff would not report reserved keywords when used in combination with `use function` or `use const`. [#271](https://github.com/PHPCompatibility/PHPCompatibility/pull/271). -- :bug: `ForbiddenNames` sniff would potentially - unintentionally - skip over tokens, thereby - potentially - not reporting all errors. [#271](https://github.com/PHPCompatibility/PHPCompatibility/pull/271). -- :wrench: Composer config: `prefer-stable` should be a root element of the json file. Fixes [#277](https://github.com/PHPCompatibility/PHPCompatibility/issues/277). - -### Credits -Thanks go out to [Juliette Reinders Folmer] for her contributions to this version. :clap: - - -## [7.0.7] - 2016-10-20 - -See all related issues and PRs in the [7.0.7 milestone]. - -### Added -- :star2: New `ForbiddenBreakContinueOutsideLoop` sniff: verify that `break`/`continue` is not used outside of a loop structure. This will cause fatal errors since PHP 7.0. [#278](https://github.com/PHPCompatibility/PHPCompatibility/pull/278). Fixes [#275](https://github.com/PHPCompatibility/PHPCompatibility/issues/275) -- :star2: New `NewConstVisibility` sniff: detect visibility indicators for `class` and `interface` constants as introduced in PHP 7.1. [#280](https://github.com/PHPCompatibility/PHPCompatibility/pull/280). Fixes [#249](https://github.com/PHPCompatibility/PHPCompatibility/issues/249) -- :star2: New `NewHashAlgorithms` sniff to check used hash algorithms against the PHP version in which they were introduced. [#242](https://github.com/PHPCompatibility/PHPCompatibility/pull/242) -- :star2: New `NewMultiCatch` sniff: detect catch statements catching multiple Exceptions as introduced in PHP 7.1. [#281](https://github.com/PHPCompatibility/PHPCompatibility/pull/281). Fixes [#251](https://github.com/PHPCompatibility/PHPCompatibility/issues/251) -- :star2: New `NewNullableTypes` sniff: detect nullable parameter and return type hints (only supported in PHPCS >= 2.3.4) as introduced in PHP 7.1. [#282](https://github.com/PHPCompatibility/PHPCompatibility/pull/282). Fixes [#247](https://github.com/PHPCompatibility/PHPCompatibility/issues/247) -- :star: `DeprecatedIniDirectives` sniff: recognize PHP 7.1 removed `session` ini directives. [#256](https://github.com/PHPCompatibility/PHPCompatibility/pull/256) -- :star: `NewFunctions` sniff: recognize new `socket_export_stream()` function as introduced in PHP 7.0.7. [#264](https://github.com/PHPCompatibility/PHPCompatibility/pull/264) -- :star: `NewFunctions` sniff: recognize new `curl_...()`, `is_iterable()`, `pcntl_async_signals()`, `session_create_id()`, `session_gc()` functions as introduced in PHP 7.1. [#273](https://github.com/PHPCompatibility/PHPCompatibility/pull/273) -- :star: `NewFunctionParameters` sniff: recognize new OpenSSL function parameters as introduced in PHP 7.1. [#258](https://github.com/PHPCompatibility/PHPCompatibility/pull/258) -- :star: `NewIniDirectives` sniff: recognize new `session` ini directives as introduced in PHP 7.1. [#259](https://github.com/PHPCompatibility/PHPCompatibility/pull/259) -- :star: `NewScalarReturnTypeDeclarations` sniff: recognize PHP 7.1 `void` return type hint. [#250](https://github.com/PHPCompatibility/PHPCompatibility/pull/250) -- :star: `NewScalarTypeDeclarations` sniff: recognize PHP 7.1 `iterable` type hint. [#255](https://github.com/PHPCompatibility/PHPCompatibility/pull/255) -- :star: Recognize the PHP 7.1 deprecated `mcrypt` functionality in the `RemovedExtensions`, `DeprecatedFunctions` and `DeprecatedIniDirectives` sniffs. [#257](https://github.com/PHPCompatibility/PHPCompatibility/pull/257) - -### Changed -- :pushpin: `LongArrays` sniff used to only throw `warning`s. It will now throw `error`s for PHP versions in which the long superglobals have been removed. [#270](https://github.com/PHPCompatibility/PHPCompatibility/pull/270) -- :pushpin: The `NewIniDirectives` sniff used to always throw an `warning`. Now it will throw an `error` when a new ini directive is used in combination with `ini_set()`. [#246](https://github.com/PHPCompatibility/PHPCompatibility/pull/246). -- :pushpin: `RemovedHashAlgorithms` sniff: also recognize removed algorithms when used with the PHP 5.5+ `hash_pbkdf2()` function. [#240](https://github.com/PHPCompatibility/PHPCompatibility/pull/240) -- :pushpin: Properly recognize nullable type hints in the `getMethodParameters()` utility method. [#282](https://github.com/PHPCompatibility/PHPCompatibility/pull/282) -- :pencil2: `DeprecatedPHP4StyleConstructors` sniff: minor error message text fix. [#236](https://github.com/PHPCompatibility/PHPCompatibility/pull/236) -- :pencil2: `NewIniDirectives` sniff: improved precision for the introduction version numbers being reported. [#246](https://github.com/PHPCompatibility/PHPCompatibility/pull/246) -- :recycle: Various (minor) refactoring for improved performance and sniff accuracy. [#238](https://github.com/PHPCompatibility/PHPCompatibility/pull/238), [#244](https://github.com/PHPCompatibility/PHPCompatibility/pull/244), [#240](https://github.com/PHPCompatibility/PHPCompatibility/pull/240), [#276](https://github.com/PHPCompatibility/PHPCompatibility/pull/276) -- :umbrella: Re-activate the unit tests for the `NewScalarReturnTypeDeclarations` sniff. [#250](https://github.com/PHPCompatibility/PHPCompatibility/pull/250) - -### Fixed -- :bug: The `DeprecatedPHP4StyleConstructors` sniff would not report errors when the case of the class name and the PHP4 constructor function name did not match. [#236](https://github.com/PHPCompatibility/PHPCompatibility/pull/236) -- :bug: `LongArrays` sniff would report false positives for class properties shadowing removed PHP superglobals. [#270](https://github.com/PHPCompatibility/PHPCompatibility/pull/270). Fixes [#268](https://github.com/PHPCompatibility/PHPCompatibility/issues/268). -- :bug: The `NewClasses` sniff would not report errors when the case of the class name used and "official" class name did not match. [#237](https://github.com/PHPCompatibility/PHPCompatibility/pull/237) -- :bug: The `NewIniDirectives` sniff would report violations against the PHP version in which the ini directive was introduced. This should be the version below it. [#246](https://github.com/PHPCompatibility/PHPCompatibility/pull/246) -- :bug: `PregReplaceEModifier` sniff would report false positives for compound regex parameters with different quote types. [#266](https://github.com/PHPCompatibility/PHPCompatibility/pull/266). Fixes [#265](https://github.com/PHPCompatibility/PHPCompatibility/issues/265). -- :bug: `RemovedGlobalVariables` sniff would report false positives for lowercase/mixed cased variables shadowing superglobals. [#245](https://github.com/PHPCompatibility/PHPCompatibility/pull/245). -- :bug: The `RemovedHashAlgorithms` sniff would not report errors when the case of the hash function name used and "official" class name did not match. [#240](https://github.com/PHPCompatibility/PHPCompatibility/pull/240) -- :bug: The `ShortArray` sniff would report all violations on the line of the PHP open tag, not on the lines of the short array open/close tags. [#238](https://github.com/PHPCompatibility/PHPCompatibility/pull/238) - -### Credits -Thanks go out to [Juliette Reinders Folmer] for her contributions to this version. :clap: - - -## [7.0.6] - 2016-09-23 - -See all related issues and PRs in the [7.0.6 milestone]. - -### Added -- :star: New `stripQuotes()` utility method in the `PHPCompatibility_Sniff` base class to strip quotes which surround text strings in a consistent manner. [#224](https://github.com/PHPCompatibility/PHPCompatibility/pull/224) -- :books: Readme: Add _PHP Version Support_ section. [#225](https://github.com/PHPCompatibility/PHPCompatibility/pull/225) - -### Changed -- :pushpin: The `ForbiddenCallTimePassByReference` sniff will now also report the deprecation as of PHP 5.3, not just its removal as of PHP 5.4. [#203](https://github.com/PHPCompatibility/PHPCompatibility/pull/203) -- :pushpin: The `NewFunctionArrayDereferencing` sniff will now also check _method_ calls for array dereferencing, not just function calls. [#229](https://github.com/PHPCompatibility/PHPCompatibility/pull/229). Fixes [#227](https://github.com/PHPCompatibility/PHPCompatibility/issues/227). -- :pencil2: The `NewExecutionDirectives` sniff will now throw `warning`s instead of `error`s for invalid values encountered in execution directives. [#223](https://github.com/PHPCompatibility/PHPCompatibility/pull/223) -- :pencil2: Minor miscellaneous fixes. [#231](https://github.com/PHPCompatibility/PHPCompatibility/pull/231) -- :recycle: Various (minor) refactoring for improved performance and sniff accuracy. [#219](https://github.com/PHPCompatibility/PHPCompatibility/pull/219), [#203](https://github.com/PHPCompatibility/PHPCompatibility/pull/203) -- :recycle: Defer to upstream `findImplementedInterfaceNames()` utility method when it exists. [#222](https://github.com/PHPCompatibility/PHPCompatibility/pull/222) -- :wrench: Exclude the test files from analysis by Scrutinizer CI. [#230](https://github.com/PHPCompatibility/PHPCompatibility/pull/230) - -### Removed -- :no_entry_sign: Some redundant code. [#232](https://github.com/PHPCompatibility/PHPCompatibility/pull/232) - -### Fixed -- :bug: The `EmptyNonVariable` sniff would throw false positives for variable variables and for array access with a (partially) variable array index. [#212](https://github.com/PHPCompatibility/PHPCompatibility/pull/212). Fixes [#210](https://github.com/PHPCompatibility/PHPCompatibility/issues/210). -- :bug: The `NewFunctionArrayDereferencing` sniff would throw false positives for lines of code containing both a function call as well as square brackets, even when they were unrelated. [#228](https://github.com/PHPCompatibility/PHPCompatibility/pull/228). Fixes [#226](https://github.com/PHPCompatibility/PHPCompatibility/issues/226). -- :bug: `ParameterShadowSuperGlobals` sniff would report false positives for lowercase/mixed cased variables shadowing superglobals. [#218](https://github.com/PHPCompatibility/PHPCompatibility/pull/218). Fixes [#214](https://github.com/PHPCompatibility/PHPCompatibility/issues/214). -- :bug: The `determineNamespace()` utility method now accounts properly for namespaces within scoped `declare()` statements. [#221](https://github.com/PHPCompatibility/PHPCompatibility/pull/221) -- :books: Readme: Logo alignment in the Credits section. [#233](https://github.com/PHPCompatibility/PHPCompatibility/pull/233) - -### Credits -Thanks go out to [Jason Stallings], [Juliette Reinders Folmer] and [Mark Clements] for their contributions to this version. :clap: - - -## [7.0.5] - 2016-09-08 - -See all related issues and PRs in the [7.0.5 milestone]. - -### Added -- :star2: New `MbstringReplaceEModifier` sniff to detect the use of the PHP 7.1 deprecated `e` modifier in Mbstring regex functions. [#202](https://github.com/PHPCompatibility/PHPCompatibility/pull/202) -- :star: The `ForbiddenBreakContinueVariableArguments` sniff will now also report on `break 0`/`continue 0` which is not allowed since PHP 5.4. [#209](https://github.com/PHPCompatibility/PHPCompatibility/pull/209) -- :star: New `getFunctionCallParameters()`, `getFunctionCallParameter()` utility methods in the `PHPCompatibility_Sniff` base class. [#170](https://github.com/PHPCompatibility/PHPCompatibility/pull/170) -- :star: New `tokenHasScope()` utility method in the `PHPCompatibility_Sniff` base class. [#189](https://github.com/PHPCompatibility/PHPCompatibility/pull/189) -- :umbrella: Unit test for `goto` and `callable` detection and some other miscellanous extra unit tests for the `NewKeywords` sniff. [#189](https://github.com/PHPCompatibility/PHPCompatibility/pull/189) -- :books: Readme: Information for sniff developers about running unit tests for _other_ sniff libraries using the PHPCS native test framework without running into conflicts with the PHPCompatibility specific unit test framework. [#217](https://github.com/PHPCompatibility/PHPCompatibility/pull/217) - -### Changed -- :pushpin: The `ForbiddenNames` sniff will now also check interface declarations for usage of reserved keywords. [#200](https://github.com/PHPCompatibility/PHPCompatibility/pull/200) -- :pushpin: `PregReplaceEModifier` sniff: improved handling of regexes build up of a combination of variables, function calls and/or text strings. [#201](https://github.com/PHPCompatibility/PHPCompatibility/pull/201) -- :rewind: The `NewKeywords` sniff will now also correctly recognize new keywords when used in combination with older PHPCS versions and/or run on older PHP versions. [#189](https://github.com/PHPCompatibility/PHPCompatibility/pull/189) -- :pencil2: `PregReplaceEModifier` sniff: minor improvement to the error message text. [#201](https://github.com/PHPCompatibility/PHPCompatibility/pull/201) -- :recycle: Various (minor) refactoring for improved performance and sniff accuracy. [#170](https://github.com/PHPCompatibility/PHPCompatibility/pull/170), [#188](https://github.com/PHPCompatibility/PHPCompatibility/pull/188), [#189](https://github.com/PHPCompatibility/PHPCompatibility/pull/189), [#199](https://github.com/PHPCompatibility/PHPCompatibility/pull/199), [#200](https://github.com/PHPCompatibility/PHPCompatibility/pull/200), [#201](https://github.com/PHPCompatibility/PHPCompatibility/pull/201), [#208](https://github.com/PHPCompatibility/PHPCompatibility/pull/208) -- :wrench: The unit tests for the utility methods have been moved to their own subdirectory within `Tests`. [#215](https://github.com/PHPCompatibility/PHPCompatibility/pull/215) -- :green_heart: The sniffs are now also tested against PHP 7.1 for consistent results. [#216](https://github.com/PHPCompatibility/PHPCompatibility/pull/216) - -### Removed -- :no_entry_sign: Some redundant code. [26d0b6](https://github.com/PHPCompatibility/PHPCompatibility/commit/26d0b6cf0921f75d93a4faaf09c390f386dde9ff) and [841616](https://github.com/PHPCompatibility/PHPCompatibility/commit/8416162ea81f4067226324f5948f4a50f7958a9b) - -### Fixed -- :bug: `ConstantArraysUsingDefine` sniff: the version check logic was reversed causing the error not to be reported in certain circumstances. [#199](https://github.com/PHPCompatibility/PHPCompatibility/pull/199) -- :bug: The `DeprecatedIniDirectives` and `NewIniDirectives` sniffs could potentially trigger on the ini value instead of the ini directive name. [#170](https://github.com/PHPCompatibility/PHPCompatibility/pull/170) -- :bug: `ForbiddenNames` sniff: Reserved keywords when used as the name of a constant declared using `define()` would always be reported independently of the `testVersion` set. [#200](https://github.com/PHPCompatibility/PHPCompatibility/pull/200) -- :bug: `PregReplaceEModifier` sniff would not report errors when the function name used was not in lowercase. [#201](https://github.com/PHPCompatibility/PHPCompatibility/pull/201) -- :bug: `TernaryOperators` sniff: the version check logic was reversed causing the error not to be reported in certain circumstances. [#188](https://github.com/PHPCompatibility/PHPCompatibility/pull/188) -- :bug: The `getFQClassNameFromNewToken()` and `getFQClassNameFromDoubleColonToken()` utility methods would get confused when the class name was a variable instead of being hard-coded, resulting in a PHP warning being thown. [#206](https://github.com/PHPCompatibility/PHPCompatibility/pull/206). Fixes [#205](https://github.com/PHPCompatibility/PHPCompatibility/issues/205). -- :bug: The `getFunctionCallParameters()` utility method would incorrectly identify an extra parameter if the last parameter passed to a function would have an - unnecessary - comma after it. The `getFunctionCallParameters()` utility method also did not handle parameters passed as short arrays correctly. [#213](https://github.com/PHPCompatibility/PHPCompatibility/pull/213). Fixes [#211](https://github.com/PHPCompatibility/PHPCompatibility/issues/211). -- :umbrella: Unit tests for the `NewFunctionArrayDereferencing` sniff were not being run due to a naming error. [#208](https://github.com/PHPCompatibility/PHPCompatibility/pull/208) -- :books: Readme: Information about setting the `testVersion` from a custom ruleset was incorrect. [#204](https://github.com/PHPCompatibility/PHPCompatibility/pull/204) -- :wrench: Path to PHPCS in the unit tests breaking for non-Composer installs. [#198](https://github.com/PHPCompatibility/PHPCompatibility/pull/198) - -### Credits -Thanks go out to [Juliette Reinders Folmer] and [Yoshiaki Yoshida] for their contributions to this version. :clap: - - -## [7.0.4] - 2016-08-20 - -See all related issues and PRs in the [7.0.4 milestone]. - -### Added -- :star2: New `EmptyNonVariable` sniff: detection of empty being used on non-variables for PHP < 5.5. [#187](https://github.com/PHPCompatibility/PHPCompatibility/pull/187) -- :star2: New `NewMagicMethods` sniff: detection of declaration of magic methods before the method became "magic". Includes a check for the changed behaviour for the `__toString()` magic method in PHP 5.2. [#176](https://github.com/PHPCompatibility/PHPCompatibility/pull/176). Fixes [#64](https://github.com/PHPCompatibility/PHPCompatibility/issues/64). -- :star2: New `RemovedAlternativePHPTags` sniff: detection of ASP and script open tags for which support was removed in PHP 7.0. [#184](https://github.com/PHPCompatibility/PHPCompatibility/pull/184), [#193](https://github.com/PHPCompatibility/PHPCompatibility/pull/193). Fixes [#127](https://github.com/PHPCompatibility/PHPCompatibility/issues/127). -- :star: `NonStaticMagicMethods` sniff: detection of the `__callStatic()`, `__sleep()`, `__toString()` and `__set_state()` magic methods. -- :green_heart: Lint all non-test case files for syntax errors during the build testing by Travis. [#192](https://github.com/PHPCompatibility/PHPCompatibility/pull/192) - -### Changed -- :pushpin: `NonStaticMagicMethods` sniff: will now also sniff `trait`s for magic methods. [#174](https://github.com/PHPCompatibility/PHPCompatibility/pull/174) -- :pushpin: `NonStaticMagicMethods` sniff: will now also check for magic methods which should be declared as `static`. [#174](https://github.com/PHPCompatibility/PHPCompatibility/pull/174) -- :recycle: Various (minor) refactoring for improved performance and sniff accuracy. [#178](https://github.com/PHPCompatibility/PHPCompatibility/pull/178), [#179](https://github.com/PHPCompatibility/PHPCompatibility/pull/179), [#174](https://github.com/PHPCompatibility/PHPCompatibility/pull/174), [#171](https://github.com/PHPCompatibility/PHPCompatibility/pull/171) -- :recycle: The unit test suite now internally caches PHPCS run results in combination with a set `testVersion` to speed up the running of the unit tests. These are now ~3 x faster. [#148](https://github.com/PHPCompatibility/PHPCompatibility/pull/148) -- :books: Readme: Minor clarification of the minimum requirements. -- :books: Readme: Advise to use the latest stable version of this repository. -- :wrench: The unit tests can now be run with PHPCS installed in an arbitrary location by passing the location through an environment option. [#191](https://github.com/PHPCompatibility/PHPCompatibility/pull/191). -- :wrench: Improved coveralls configuration and compatibility. [#194](https://github.com/PHPCompatibility/PHPCompatibility/pull/194) -- :green_heart: The sniffs are now also tested against PHP 5.2 for consistent results. Except for namespace, trait and group use related errors, most sniffs work as intended on PHP 5.2. [#196](https://github.com/PHPCompatibility/PHPCompatibility/pull/196) - -### Fixed -- :bug: The `ForbiddenBreakContinueVariableArguments` sniff would not report on `break`/`continue` with a closure as an argument. [#171](https://github.com/PHPCompatibility/PHPCompatibility/pull/171) -- :bug: The `ForbiddenNamesAsInvokedFunctions` sniff would not report on reserved keywords which were not lowercase. [#186](https://github.com/PHPCompatibility/PHPCompatibility/pull/186) -- :bug: The `ForbiddenNamesAsInvokedFunctions` sniff would not report on the `goto` and `namespace` keywords when run on PHP 5.2. [#193](https://github.com/PHPCompatibility/PHPCompatibility/pull/193) -- :bug: `NewAnonymousClasses` sniff: the version check logic was reversed causing the error not to be reported in certain circumstances. [#195](https://github.com/PHPCompatibility/PHPCompatibility/pull/195). -- :bug: `NewGroupUseDeclarations` sniff: the version check logic was reversed causing the error not to be reported in certain circumstances. [#190](https://github.com/PHPCompatibility/PHPCompatibility/pull/190). -- :bug: The `NonStaticMagicMethods` sniff would not report on magic methods when the function name as declared was not in the same case as used in the PHP manual. [#174](https://github.com/PHPCompatibility/PHPCompatibility/pull/174) -- :wrench: The unit tests would exit with `0` if PHPCS could not be found. [#191](https://github.com/PHPCompatibility/PHPCompatibility/pull/191) -- :green_heart: The PHPCompatibility library itself was not fully compatible with PHP 5.2. [#193](https://github.com/PHPCompatibility/PHPCompatibility/pull/193) - -### Credits -Thanks go out to [Juliette Reinders Folmer] for her contributions to this version. :clap: - - -## [7.0.3] - 2016-08-18 - -See all related issues and PRs in the [7.0.3 milestone]. - -### Added -- :star2: New `InternalInterfaces` sniff: detection of internal PHP interfaces being which should not be implemented by user land classes. [#144](https://github.com/PHPCompatibility/PHPCompatibility/pull/144) -- :star2: New `LateStaticBinding` sniff: detection of PHP 5.3 late static binding. [#177](https://github.com/PHPCompatibility/PHPCompatibility/pull/177) -- :star2: New `NewExecutionDirectives` sniff: verify execution directives set with `declare()`. [#169](https://github.com/PHPCompatibility/PHPCompatibility/pull/169) -- :star2: New `NewInterfaces` sniff: detection of the use of newly introduced PHP native interfaces. This sniff will also detect unsupported methods when a class implements the `Serializable` interface. [#144](https://github.com/PHPCompatibility/PHPCompatibility/pull/144) -- :star2: New `RequiredOptionalFunctionParameters` sniff: detection of missing function parameters which were required in earlier PHP versions only to become optional in later versions. [#165](https://github.com/PHPCompatibility/PHPCompatibility/pull/165) -- :star2: New `ValidIntegers` sniff: detection of binary integers for PHP < 5.4, detection of hexademical numeric strings for which recognition as hex integers was removed in PHP 7.0, detection of invalid binary and octal integers. [#160](https://github.com/PHPCompatibility/PHPCompatibility/pull/160). Fixes [#55](https://github.com/PHPCompatibility/PHPCompatibility/issues/55). -- :star: `DeprecatedExtensions` sniff: detect removal of the `ereg` extension in PHP 7. [#149](https://github.com/PHPCompatibility/PHPCompatibility/pull/149) -- :star: `DeprecatedFunctions` sniff: detection of the PHP 5.0.5 deprecated `php_check_syntax()` and PHP 5.4 deprecated `mysqli_get_cache_stats()` functions. [#155](https://github.com/PHPCompatibility/PHPCompatibility/pull/155). -- :star: `DeprecatedFunctions` sniff: detect deprecation of a number of the `mysqli` functions in PHP 5.3. [#149](https://github.com/PHPCompatibility/PHPCompatibility/pull/149) -- :star: `DeprecatedFunctions` sniff: detect removal of the `call_user_method()`, `ldap_sort()`, `ereg_*()` and `mysql_*()` functions in PHP 7.0. [#149](https://github.com/PHPCompatibility/PHPCompatibility/pull/149) -- :star: `DeprecatedIniDirectives` sniff: detection of a _lot_ more deprecated/removed ini directives. [#146](https://github.com/PHPCompatibility/PHPCompatibility/pull/146) -- :star: `NewFunctionParameters` sniff: detection of a _lot_ more new function parameters. [#164](https://github.com/PHPCompatibility/PHPCompatibility/pull/164) -- :star: `NewFunctions` sniff: detection of numerous extra new functions. [#161](https://github.com/PHPCompatibility/PHPCompatibility/pull/161) -- :star: `NewIniDirectives` sniff: detection of a _lot_ more new ini directives. [#146](https://github.com/PHPCompatibility/PHPCompatibility/pull/146) -- :star: `NewLanguageConstructs` sniff: detection of the PHP 5.6 ellipsis `...` construct. [#175](https://github.com/PHPCompatibility/PHPCompatibility/pull/175) -- :star: `NewScalarTypeDeclarations` sniff: detection of PHP 5.1 `array` and PHP 5.4 `callable` type hints. [#168](https://github.com/PHPCompatibility/PHPCompatibility/pull/168) -- :star: `RemovedFunctionParameters` sniff: detection of a few extra removed function parameters. [#163](https://github.com/PHPCompatibility/PHPCompatibility/pull/163) -- :star: Detection of functions and methods with a double underscore prefix as these are reserved by PHP for future use. The existing upstream `Generic.NamingConventions.CamelCapsFunctionName` sniff is re-used for this with some customization. [#173](https://github.com/PHPCompatibility/PHPCompatibility/pull/173) -- :star: New `getFQClassNameFromNewToken()`, `getFQExtendedClassName()`, `getFQClassNameFromDoubleColonToken()`, `getFQName()`, `isNamespaced()`, `determineNamespace()` and `getDeclaredNamespaceName()` utility methods in the `PHPCompatibility_Sniff` base class for namespace determination. [#162](https://github.com/PHPCompatibility/PHPCompatibility/pull/162) -- :recycle: New `inClassScope()` utility method in the `PHPCompatibility_Sniff` base class. [#168](https://github.com/PHPCompatibility/PHPCompatibility/pull/168) -- :recycle: New `doesFunctionCallHaveParameters()` and `getFunctionCallParameterCount()` utility methods in the `PHPCompatibility_Sniff` base class. [#153](https://github.com/PHPCompatibility/PHPCompatibility/pull/153) -- :umbrella: Unit test for `__halt_compiler()` detection by the `NewKeywords` sniff. -- :umbrella: Unit tests for the `NewFunctions` sniff. [#161](https://github.com/PHPCompatibility/PHPCompatibility/pull/161) -- :umbrella: Unit tests for the `ParameterShadowSuperGlobals` sniff. [#180](https://github.com/PHPCompatibility/PHPCompatibility/pull/180) -- :wrench: Minimal config for Scrutinizer CI. [#145](https://github.com/PHPCompatibility/PHPCompatibility/pull/145). - -### Changed -- :pushpin: The `DeprecatedIniDirectives` and the `NewIniDirectives` sniffs will now indicate an alternative ini directive in case the directive has been renamed. [#146](https://github.com/PHPCompatibility/PHPCompatibility/pull/146) -- :pushpin: The `NewClasses` sniff will now also report on new classes being extended by child classes. [#140](https://github.com/PHPCompatibility/PHPCompatibility/pull/140). -- :pushpin: The `NewClasses` sniff will now also report on static use of new classes. [#162](https://github.com/PHPCompatibility/PHPCompatibility/pull/162). -- :pushpin: The `NewScalarTypeDeclarations` sniff will now throw an error on use of type hints pre-PHP 5.0. [#168](https://github.com/PHPCompatibility/PHPCompatibility/pull/168) -- :pushpin: The `NewScalarTypeDeclarations` sniff will now verify type hints used against typical mistakes. [#168](https://github.com/PHPCompatibility/PHPCompatibility/pull/168) -- :pushpin: The `ParameterShadowSuperGlobals` sniff will now do a case-insensitive variable name compare. [#180](https://github.com/PHPCompatibility/PHPCompatibility/pull/180) -- :pushpin: The `RemovedFunctionParameters` sniff will now also report `warning`s on deprecation of function parameters. [#163](https://github.com/PHPCompatibility/PHPCompatibility/pull/163) -- :twisted_rightwards_arrows: The check for `JsonSerializable` has been moved from the `NewClasses` sniff to the `NewInterfaces` sniff. [#162](https://github.com/PHPCompatibility/PHPCompatibility/pull/162) -- :rewind: The `NewLanguageConstructs` sniff will now also recognize new language constructs when used in combination with PHPCS 1.5.x. [#175](https://github.com/PHPCompatibility/PHPCompatibility/pull/175) -- :pencil2: `NewFunctionParameters` sniff: use correct name for the new parameter for the `dirname()` function. [#164](https://github.com/PHPCompatibility/PHPCompatibility/pull/164) -- :pencil2: `NewScalarTypeDeclarations` sniff: minor change in the sniff error message text. [#168](https://github.com/PHPCompatibility/PHPCompatibility/pull/168) -- :pencil2: `RemovedFunctionParameters` sniff: minor change in the sniff error message text. [#163](https://github.com/PHPCompatibility/PHPCompatibility/pull/163) -- :pencil2: The `ParameterShadowSuperGlobals` sniff now extends the `PHPCompatibility_Sniff` class. [#180](https://github.com/PHPCompatibility/PHPCompatibility/pull/180) -- :recycle: Various (minor) refactoring for improved performance and sniff accuracy. [#181](https://github.com/PHPCompatibility/PHPCompatibility/pull/181), [#182](https://github.com/PHPCompatibility/PHPCompatibility/pull/182), [#166](https://github.com/PHPCompatibility/PHPCompatibility/pull/166), [#167](https://github.com/PHPCompatibility/PHPCompatibility/pull/167), [#172](https://github.com/PHPCompatibility/PHPCompatibility/pull/172), [#180](https://github.com/PHPCompatibility/PHPCompatibility/pull/180), [#146](https://github.com/PHPCompatibility/PHPCompatibility/pull/146), [#138](https://github.com/PHPCompatibility/PHPCompatibility/pull/138) -- :recycle: Various refactoring to remove code duplication in the unit tests and add proper test skip notifications where relevant. [#139](https://github.com/PHPCompatibility/PHPCompatibility/pull/139), [#149](https://github.com/PHPCompatibility/PHPCompatibility/pull/149) - -### Fixed -- :bug: The `DeprecatedFunctions` sniff was reporting an incorrect deprecation/removal version number for a few functions. [#149](https://github.com/PHPCompatibility/PHPCompatibility/pull/149) -- :bug: The `DeprecatedIniDirectives` sniff was in select cases reporting deprecation of an ini directive prior to removal, while the ini directive was never deprecated prior to its removal. [#146](https://github.com/PHPCompatibility/PHPCompatibility/pull/146) -- :bug: The `DeprecatedPHP4StyleConstructors` sniff would cause false positives for methods with the same name as the class in namespaced classes. [#167](https://github.com/PHPCompatibility/PHPCompatibility/pull/167) -- :bug: The `ForbiddenEmptyListAssignment` sniff did not report errors when there were only comments or parentheses between the list parentheses. [#166](https://github.com/PHPCompatibility/PHPCompatibility/pull/166) -- :bug: The `ForbiddenEmptyListAssignment` sniff will no longer cause false positives during live coding. [#166](https://github.com/PHPCompatibility/PHPCompatibility/pull/166) -- :bug: The `NewClasses` sniff would potentially misidentify namespaced classes as PHP native classes. [#161](https://github.com/PHPCompatibility/PHPCompatibility/pull/162) -- :bug: The `NewFunctions` sniff would fail to identify called functions when the function call was not lowercase. [#161](https://github.com/PHPCompatibility/PHPCompatibility/pull/161) -- :bug: The `NewFunctions` sniff would potentially misidentify namespaced userland functions as new functions. [#161](https://github.com/PHPCompatibility/PHPCompatibility/pull/161) -- :bug: The `NewIniDirectives` sniff was reporting an incorrect introduction version number for a few ini directives. [#146](https://github.com/PHPCompatibility/PHPCompatibility/pull/146) -- :bug: `NewKeywords` sniff: the use of the `const` keyword should only be reported when used outside of a class for PHP < 5.3. [#147](https://github.com/PHPCompatibility/PHPCompatibility/pull/147). Fixes [#129](https://github.com/PHPCompatibility/PHPCompatibility/issues/129). -- :bug: The `RemovedExtensions` sniff was incorrectly reporting a number of extensions as being removed in PHP 5.3 while they were actually removed in PHP 5.1. [#156](https://github.com/PHPCompatibility/PHPCompatibility/pull/156) -- :bug: :recycle: The `NewFunctionParameters` and `RemovedFunctionParameters` now use the new `doesFunctionCallHaveParameters()` and `getFunctionCallParameterCount()` utility methods for improved accuracy in identifying function parameters. This fixes several false positives. [#153](https://github.com/PHPCompatibility/PHPCompatibility/pull/153) Fixes [#120](https://github.com/PHPCompatibility/PHPCompatibility/issues/120), [#151](https://github.com/PHPCompatibility/PHPCompatibility/issues/151), [#152](https://github.com/PHPCompatibility/PHPCompatibility/issues/152). -- :bug: A number of sniffs would return `false` if the examined construct was not found. This could potentially cause race conditions/infinite sniff loops. [#138](https://github.com/PHPCompatibility/PHPCompatibility/pull/138) -- :wrench: The unit tests would fail to run when used in combination with a PEAR install of PHPCS. [#157](https://github.com/PHPCompatibility/PHPCompatibility/pull/157). -- :green_heart: Unit tests failing against PHPCS 2.6.1. [#158](https://github.com/PHPCompatibility/PHPCompatibility/pull/158) - The unit tests *will* still fail against PHPCS 2.6.2 due to a bug in PHPCS itself. This bug does not affect the running of the sniffs outside of a unit test context. - -### Credits -Thanks go out to [Juliette Reinders Folmer] for her contributions to this version. :clap: - - -## [7.0.2] - 2016-08-03 - -See all related issues and PRs in the [7.0.2 milestone]. - -### Added -- :star: `RemovedExtensions` sniff: ability to whitelist userland functions for which the function prefix overlaps with a prefix of a deprecated/removed extension. [#130](https://github.com/PHPCompatibility/PHPCompatibility/pull/130). Fixes [#123](https://github.com/PHPCompatibility/PHPCompatibility/issues/123). - To use this feature, add the `functionWhitelist` property in your custom ruleset. For more information, see the [README](https://github.com/PHPCompatibility/PHPCompatibility#phpcompatibility-specific-options). - -### Changed -- :pencil2: A number of sniffs contained `public` class properties. Within PHPCS, `public` properties can be overruled via a custom ruleset. This was not the intention, so the visibility of these properties has been changed to `protected`. [#135](https://github.com/PHPCompatibility/PHPCompatibility/pull/135) -- :wrench: Composer config: Stable packages are preferred over unstable/dev. -- :pencil2: Ruleset name. [#134](https://github.com/PHPCompatibility/PHPCompatibility/pull/134) - -### Credits -Thanks go out to [Juliette Reinders Folmer] for her contributions to this version. :clap: - - -## [7.0.1] - 2016-08-02 - -See all related issues and PRs in the [7.0.1 milestone]. - -### Changed -- :pushpin: The `DeprecatedIniDirectives` sniff used to throw an `error` when a deprecated ini directive was used in combination with `ini_get()`. It will now throw a `warning` instead. [#122](https://github.com/PHPCompatibility/PHPCompatibility/pull/122) Fixes [#119](https://github.com/PHPCompatibility/PHPCompatibility/issues/119). - Usage of deprecated ini directives in combination with `ini_set()` will still throw an `error`. -- :pushpin: The `PregReplaceEModifier` sniff now also detects the `e` modifier when used with the `preg_filter()` function. While this is undocumented, the `e` modifier was supported by the `preg_filter()` function as well. [#128](https://github.com/PHPCompatibility/PHPCompatibility/pull/128) -- :pencil2: The `RemovedExtensions` sniff contained superfluous deprecation information in the error message. [#131](https://github.com/PHPCompatibility/PHPCompatibility/pull/131) - -### Removed -- :wrench: Duplicate builds from the Travis CI build matrix. [#132](https://github.com/PHPCompatibility/PHPCompatibility/pull/132) - -### Fixed -- :bug: The `ForbiddenNames` sniff did not allow for the PHP 5.6 `use function ...` and `use const ...` syntax. [#126](https://github.com/PHPCompatibility/PHPCompatibility/pull/126) Fixes [#124](https://github.com/PHPCompatibility/PHPCompatibility/issues/124). -- :bug: The `NewClasses` sniff failed to detect new classes when the class was instantiated without parenthesis, i.e. `new NewClass;`. [#121](https://github.com/PHPCompatibility/PHPCompatibility/pull/121) -- :bug: The `PregReplaceEModifier` sniff failed to detect the `e` modifier when using bracket delimiters for the regex other than the `{}` brackets. [#128](https://github.com/PHPCompatibility/PHPCompatibility/pull/128) -- :green_heart: Unit tests failing against PHPCS 2.6.1. - -### Credits -Thanks go out to [Jason Stallings], [Juliette Reinders Folmer] and [Ryan Neufeld] for their contributions to this version. :clap: - - -## [7.0] - 2016-07-02 - -See all related issues and PRs in the [7.0 milestone]. - -### Added -- :zap: Ability to specify a range of PHP versions against which to test your code base for compatibility, i.e. `--runtime-set testVersion 5.0-5.4` will now test your code for compatibility with PHP 5.0 up to PHP 5.4. [#99](https://github.com/PHPCompatibility/PHPCompatibility/pull/99) -- :star2: New `NewFunctionArrayDereferencing` sniff to detect function array dereferencing as introduced in PHP 5.4. Fixes [#52](https://github.com/PHPCompatibility/PHPCompatibility/issues/52). -- :star2: New `ShortArray` sniff to detect short array syntax as introduced in PHP 5.4. [#97](https://github.com/PHPCompatibility/PHPCompatibility/pull/97). Fixes [#47](https://github.com/PHPCompatibility/PHPCompatibility/issues/47). -- :star2: New `TernaryOperators` sniff to detect ternaries without the middle part (`elvis` operator) as introduced in PHP 5.3. [#101](https://github.com/PHPCompatibility/PHPCompatibility/pull/101), [#103](https://github.com/PHPCompatibility/PHPCompatibility/pull/103). Fixes [#49](https://github.com/PHPCompatibility/PHPCompatibility/issues/49). -- :star2: New `ConstantArraysUsingDefine` sniff to detect constants declared using `define()` being assigned an `array` value which was not allowed prior to PHP 7.0. [#110](https://github.com/PHPCompatibility/PHPCompatibility/pull/110) -- :star2: New `DeprecatedPHP4StyleConstructors` sniff to detect PHP 4 style class constructor methods which are deprecated as of PHP 7. [#109](https://github.com/PHPCompatibility/PHPCompatibility/pull/109). -- :star2: New `ForbiddenEmptyListAssignment` sniff to detect empty list() assignments which have been removed in PHP 7.0. [#110](https://github.com/PHPCompatibility/PHPCompatibility/pull/110) -- :star2: New `ForbiddenFunctionParametersWithSameName` sniff to detect functions declared with multiple same-named parameters which is no longer accepted since PHP 7.0. [#110](https://github.com/PHPCompatibility/PHPCompatibility/pull/110) -- :star2: New `ForbiddenGlobalVariableVariable` sniff to detect variable variables being made `global` which is not allowed since PHP 7.0. [#110](https://github.com/PHPCompatibility/PHPCompatibility/pull/110) -- :star2: New `ForbiddenNegativeBitshift` sniff to detect bitwise shifts by negative number which will throw an ArithmeticError in PHP 7.0. [#110](https://github.com/PHPCompatibility/PHPCompatibility/pull/110) -- :star2: New `ForbiddenSwitchWithMultipleDefaultBlocks` sniff to detect switch statements with multiple default blocks which is not allowed since PHP 7.0. [#110](https://github.com/PHPCompatibility/PHPCompatibility/pull/110) -- :star2: New `NewAnonymousClasses` sniff to detect anonymous classes as introduced in PHP 7.0. [#110](https://github.com/PHPCompatibility/PHPCompatibility/pull/110) -- :star2: New `NewClosure` sniff to detect anonymous functions as introduced in PHP 5.3. Fixes [#35](https://github.com/PHPCompatibility/PHPCompatibility/issues/35) -- :star2: New `NewFunctionParameters` sniff to detect use of new parameters in build-in PHP functions. Initially only sniffing for the new PHP 7.0 function parameters and the new PHP 5.3+ `before_needle` parameter for the `strstr()` function. [#110](https://github.com/PHPCompatibility/PHPCompatibility/pull/110), [#112](https://github.com/PHPCompatibility/PHPCompatibility/pull/112). Fixes [#27](https://github.com/PHPCompatibility/PHPCompatibility/issues/27). -- :star2: New `NewGroupUseDeclarations` sniff to detect group use declarations as introduced in PHP 7.0. [#110](https://github.com/PHPCompatibility/PHPCompatibility/pull/110) -- :star2: New `NewScalarReturnTypeDeclarations` sniff to detect scalar return type hints as introduced in PHP 7.0. [#110](https://github.com/PHPCompatibility/PHPCompatibility/pull/110) -- :star2: New `NewScalarTypeDeclarations` sniff to detect scalar function parameter type hints as introduced in PHP 7.0. [#110](https://github.com/PHPCompatibility/PHPCompatibility/pull/110) -- :star2: New `RemovedFunctionParameters` sniff to detect use of removed parameters in build-in PHP functions. Initially only sniffing for the function parameters removed in PHP 7.0. [#110](https://github.com/PHPCompatibility/PHPCompatibility/pull/110) -- :star2: New `RemovedGlobalVariables` sniff to detect the PHP 7.0 removed `$HTTP_RAW_POST_DATA` superglobal. [#110](https://github.com/PHPCompatibility/PHPCompatibility/pull/110) -- :star: `DeprecatedFunctions` sniff: detection of the PHP 5.4 deprecated OCI8 functions. [#93](https://github.com/PHPCompatibility/PHPCompatibility/pull/93) -- :star: `ForbiddenNamesAsInvokedFunctions` sniff: recognize PHP 5.5 `finally` as a reserved keywords when invoked as a function. [#110](https://github.com/PHPCompatibility/PHPCompatibility/pull/110) -- :star: `NewKeywords` sniff: detection of the use of the PHP 5.1+ `__halt_compiler` keyword. Fixes [#50](https://github.com/PHPCompatibility/PHPCompatibility/issues/50). -- :star: `NewKeywords` sniff: detection of the PHP 5.3+ `nowdoc` syntax. Fixes [#48](https://github.com/PHPCompatibility/PHPCompatibility/issues/48). -- :star: `NewKeywords` sniff: detection of the use of the `const` keyword outside of a class for PHP < 5.3. Fixes [#50](https://github.com/PHPCompatibility/PHPCompatibility/issues/50). -- :star: `DeprecatedFunctions` sniff: recognize PHP 7.0 deprecated and removed functions. [#110](https://github.com/PHPCompatibility/PHPCompatibility/pull/110) -- :star: `DeprecatedIniDirectives` sniff: recognize PHP 7.0 removed ini directives. [#110](https://github.com/PHPCompatibility/PHPCompatibility/pull/110) -- :star: `ForbiddenNamesAsInvokedFunctions` sniff: recognize new PHP 7.0 reserved keywords when invoked as functions. [#110](https://github.com/PHPCompatibility/PHPCompatibility/pull/110) -- :star: `ForbiddenNames` sniff: recognize new PHP 7.0 reserved keywords. [#110](https://github.com/PHPCompatibility/PHPCompatibility/pull/110) -- :star: `NewFunctions` sniff: recognize new functions as introduced in PHP 7.0. [#110](https://github.com/PHPCompatibility/PHPCompatibility/pull/110) -- :star: `NewLanguageConstructs` sniff: recognize new PHP 7.0 `<=>` "spaceship" and `??` null coalescing operators. [#110](https://github.com/PHPCompatibility/PHPCompatibility/pull/110) -- :star: `RemovedExtensions` sniff: recognize PHP 7.0 removed `ereg`, `mssql`, `mysql` and `sybase_ct` extensions. [#110](https://github.com/PHPCompatibility/PHPCompatibility/pull/110) -- :umbrella: Additional unit tests for the `NewLanguageConstructs` sniff. [#110](https://github.com/PHPCompatibility/PHPCompatibility/pull/110) -- :books: Readme: New section containing information about the use of the `testVersion` config variable. -- :books: Readme: Sponsor credits. - -### Changed -- :pushpin: The `DeprecatedIniDirectives` sniff used to always throw an `warning`. Now it will throw an `error` when a removed ini directive is used. [#110](https://github.com/PHPCompatibility/PHPCompatibility/pull/110). -- :pushpin: The `DeprecatedNewReference` sniff will now throw an error when the `testVersion` includes PHP 7.0 or higher. [#110](https://github.com/PHPCompatibility/PHPCompatibility/pull/110) -- :pushpin: The `ForbiddenNames` sniff now supports detection of reserved keywords when used in combination with PHP 7 anonymous classes. [#108](https://github.com/PHPCompatibility/PHPCompatibility/pull/108), [#110](https://github.com/PHPCompatibility/PHPCompatibility/pull/110). -- :pushpin: The `PregReplaceEModifier` sniff will now throw an error when the `testVersion` includes PHP 7.0 or higher. [#110](https://github.com/PHPCompatibility/PHPCompatibility/pull/110) -- :pencil2: `NewKeywords` sniff: clarified the error message text for the `use` keyword. Fixes [#46](https://github.com/PHPCompatibility/PHPCompatibility/issues/46). -- :recycle: Minor refactor of the `testVersion` related utility functions. [#98](https://github.com/PHPCompatibility/PHPCompatibility/pull/98) -- :wrench: Add autoload to the `composer.json` file. [#96](https://github.com/PHPCompatibility/PHPCompatibility/pull/96) Fixes [#67](https://github.com/PHPCompatibility/PHPCompatibility/issues/67). -- :wrench: Minor other updates to the `composer.json` file. [#75](https://github.com/PHPCompatibility/PHPCompatibility/pull/75) -- :wrench: Improved creation of the code coverage reports needed by coveralls via Travis. -- :green_heart: The sniffs are now also tested against PHP 7.0 for consistent results. - -### Fixed -- :bug: The `ForbiddenCallTimePassByReference` sniff was throwing `Undefined index` notices when used in combination with PHPCS 2.2.0. [#100](https://github.com/PHPCompatibility/PHPCompatibility/pull/100). Fixes [#42](https://github.com/PHPCompatibility/PHPCompatibility/issues/42). -- :bug: The `ForbiddenNamesAsInvokedFunctions` sniff would incorrectly throw an error if the `throw` keyword was used with parenthesis. Fixes [#118](https://github.com/PHPCompatibility/PHPCompatibility/issues/118). -- :bug: The `PregReplaceEModifier` sniff incorrectly identified `e`'s in the pattern as the `e` modifier when using `{}` bracket delimiters for the regex. [#94](https://github.com/PHPCompatibility/PHPCompatibility/pull/94) -- :bug: The `RemovedExtensions` sniff was throwing an `error` instead of a `warning` for deprecated, but not (yet) removed extensions. Fixes [#62](https://github.com/PHPCompatibility/PHPCompatibility/issues/62). - -### Credits -Thanks go out to AlexMiroshnikov, [Chris Abernethy], [dgudgeon], [djaenecke], [Eugene Maslovich], [Ken Guest], Koen Eelen, [Komarov Alexey], [Mark Clements] and [Remko van Bezooijen] for their contributions to this version. :clap: - - -## [5.6] - 2015-09-14 - -See all related issues and PRs in the [5.6 milestone]. - -### Added -- :star2: New: `NewLanguageConstructs` sniff. The initial version of this sniff checks for the PHP 5.6 `**` power operator and the `**=` power assignment operator. [#87](https://github.com/PHPCompatibility/PHPCompatibility/pull/87). Fixes [#60](https://github.com/PHPCompatibility/PHPCompatibility/issues/60). -- :star2: New: `ParameterShadowSuperGlobals` sniff which covers the PHP 5.4 change _Parameter names that shadow super globals now cause a fatal error.`_. [#74](https://github.com/PHPCompatibility/PHPCompatibility/pull/74) -- :star2: New: `PregReplaceEModifier` sniff which detects usage of the `e` modifier in literal regular expressions used with `preg_replace()`. The `e` modifier will not (yet) be detected when the regex passed is a variable or constant. [#81](https://github.com/PHPCompatibility/PHPCompatibility/pull/81), [#84](https://github.com/PHPCompatibility/PHPCompatibility/pull/84). Fixes [#71](https://github.com/PHPCompatibility/PHPCompatibility/issues/71), [#83](https://github.com/PHPCompatibility/PHPCompatibility/issues/83). -- :star: `DeprecatedIniDirectives` sniff: PHP 5.6 deprecated ini directives. -- :star: `NewKeywords` sniff: detection of the `goto` keyword introduced in PHP 5.3 and the `callable` keyword introduced in PHP 5.4. [#57](https://github.com/PHPCompatibility/PHPCompatibility/pull/57) -- :recycle: `PHPCompatibility_Sniff` base class initially containing the `supportsAbove()` and `supportsBelow()` utility methods. (Nearly) All sniffs now extend this base class and use these methods to determine whether or not violations should be reported for a set `testVersion`. [#77](https://github.com/PHPCompatibility/PHPCompatibility/pull/77) -- :books: Readme: Composer installation instructions. [#32](https://github.com/PHPCompatibility/PHPCompatibility/pull/32), [#61](https://github.com/PHPCompatibility/PHPCompatibility/pull/61) -- :wrench: `.gitignore` to ignore vendor and IDE related directories. [#78](https://github.com/PHPCompatibility/PHPCompatibility/pull/78) -- :green_heart: Code coverage checking via coveralls. - -### Changed -- :twisted_rightwards_arrows: The check for the `\` namespace separator has been moved from the `NewKeywords` sniff to the `NewLanguageConstructs` sniff. [#88](https://github.com/PHPCompatibility/PHPCompatibility/pull/88) -- :pencil2: `DeprecatedIniDirectives` sniff: minor change in the sniff error message text. -- :pencil2: `DeprecatedFunctions` sniff: minor change in the sniff error message text. -- :wrench: Minor updates to the `composer.json` file. [#31](https://github.com/PHPCompatibility/PHPCompatibility/pull/31), [34](https://github.com/PHPCompatibility/PHPCompatibility/pull/34), [#70](https://github.com/PHPCompatibility/PHPCompatibility/pull/70) -- :wrench: Tests: The unit tests can now be run without configuration. -- :wrench: Tests: Skipped unit tests will now be annotated as such. [#85](https://github.com/PHPCompatibility/PHPCompatibility/pull/85) -- :green_heart: The sniffs are now also tested against PHP 5.6 for consistent results. -- :green_heart: The sniffs are now also tested against PHPCS 2.0+. -- :green_heart: The sniffs are now tested using the new container-based infrastructure in Travis CI. [#37](https://github.com/PHPCompatibility/PHPCompatibility/pull/37) - -### Fixed -- :bug: The `ForbiddenCallTimePassByReference` sniff was throwing false positives when a bitwise and `&` was used in combination with class constants and class properties within function calls. [#44](https://github.com/PHPCompatibility/PHPCompatibility/pull/44). Fixes [#39](https://github.com/PHPCompatibility/PHPCompatibility/issues/39). -- :bug: The `ForbiddenNamesAsInvokedFunctions` sniff was throwing false positives in certain cases when a comment separated a `try` from the `catch` block. [#29](https://github.com/PHPCompatibility/PHPCompatibility/pull/29) -- :bug: The `ForbiddenNamesAsInvokedFunctions` sniff was incorrectly reporting `instanceof` as being introduced in PHP 5.4 while it has been around since PHP 5.0. [#80](https://github.com/PHPCompatibility/PHPCompatibility/pull/80) -- :white_check_mark: Compatibility with PHPCS 2.0 - 2.3. [#63](https://github.com/PHPCompatibility/PHPCompatibility/pull/63), [#65](https://github.com/PHPCompatibility/PHPCompatibility/pull/65) - -### Credits -Thanks go out to Daniel Jänecke, [Declan Kelly], [Dominic], [Jaap van Otterdijk], [Marin Crnkovic], [Mark Clements], [Nick Pack], [Oliver Klee], [Rowan Collins] and [Sam Van der Borght] for their contributions to this version. :clap: - - -## 5.5 - 2014-04-04 - -First tagged release. - -See all related issues and PRs in the [5.5 milestone]. - - - -[Unreleased]: https://github.com/PHPCompatibility/PHPCompatibility/compare/master...HEAD -[9.3.5]: https://github.com/PHPCompatibility/PHPCompatibility/compare/9.3.4...9.3.5 -[9.3.4]: https://github.com/PHPCompatibility/PHPCompatibility/compare/9.3.3...9.3.4 -[9.3.3]: https://github.com/PHPCompatibility/PHPCompatibility/compare/9.3.2...9.3.3 -[9.3.2]: https://github.com/PHPCompatibility/PHPCompatibility/compare/9.3.1...9.3.2 -[9.3.1]: https://github.com/PHPCompatibility/PHPCompatibility/compare/9.3.0...9.3.1 -[9.3.0]: https://github.com/PHPCompatibility/PHPCompatibility/compare/9.2.0...9.3.0 -[9.2.0]: https://github.com/PHPCompatibility/PHPCompatibility/compare/9.1.1...9.2.0 -[9.1.1]: https://github.com/PHPCompatibility/PHPCompatibility/compare/9.1.0...9.1.1 -[9.1.0]: https://github.com/PHPCompatibility/PHPCompatibility/compare/9.0.0...9.1.0 -[9.0.0]: https://github.com/PHPCompatibility/PHPCompatibility/compare/8.2.0...9.0.0 -[8.2.0]: https://github.com/PHPCompatibility/PHPCompatibility/compare/8.1.0...8.2.0 -[8.1.0]: https://github.com/PHPCompatibility/PHPCompatibility/compare/8.0.1...8.1.0 -[8.0.1]: https://github.com/PHPCompatibility/PHPCompatibility/compare/8.0.0...8.0.1 -[8.0.0]: https://github.com/PHPCompatibility/PHPCompatibility/compare/7.1.5...8.0.0 -[7.1.5]: https://github.com/PHPCompatibility/PHPCompatibility/compare/7.1.4...7.1.5 -[7.1.4]: https://github.com/PHPCompatibility/PHPCompatibility/compare/7.1.3...7.1.4 -[7.1.3]: https://github.com/PHPCompatibility/PHPCompatibility/compare/7.1.2...7.1.3 -[7.1.2]: https://github.com/PHPCompatibility/PHPCompatibility/compare/7.1.1...7.1.2 -[7.1.1]: https://github.com/PHPCompatibility/PHPCompatibility/compare/7.1.0...7.1.1 -[7.1.0]: https://github.com/PHPCompatibility/PHPCompatibility/compare/7.0.8...7.1.0 -[7.0.8]: https://github.com/PHPCompatibility/PHPCompatibility/compare/7.0.7...7.0.8 -[7.0.7]: https://github.com/PHPCompatibility/PHPCompatibility/compare/7.0.6...7.0.7 -[7.0.6]: https://github.com/PHPCompatibility/PHPCompatibility/compare/7.0.5...7.0.6 -[7.0.5]: https://github.com/PHPCompatibility/PHPCompatibility/compare/7.0.4...7.0.5 -[7.0.4]: https://github.com/PHPCompatibility/PHPCompatibility/compare/7.0.3...7.0.4 -[7.0.3]: https://github.com/PHPCompatibility/PHPCompatibility/compare/7.0.2...7.0.3 -[7.0.2]: https://github.com/PHPCompatibility/PHPCompatibility/compare/7.0.1...7.0.2 -[7.0.1]: https://github.com/PHPCompatibility/PHPCompatibility/compare/7.0...7.0.1 -[7.0]: https://github.com/PHPCompatibility/PHPCompatibility/compare/5.6...7.0 -[5.6]: https://github.com/PHPCompatibility/PHPCompatibility/compare/5.5...5.6 - -[9.3.5 milestone]: https://github.com/PHPCompatibility/PHPCompatibility/milestone/34 -[9.3.4 milestone]: https://github.com/PHPCompatibility/PHPCompatibility/milestone/33 -[9.3.3 milestone]: https://github.com/PHPCompatibility/PHPCompatibility/milestone/32 -[9.3.2 milestone]: https://github.com/PHPCompatibility/PHPCompatibility/milestone/31 -[9.3.1 milestone]: https://github.com/PHPCompatibility/PHPCompatibility/milestone/30 -[9.3.0 milestone]: https://github.com/PHPCompatibility/PHPCompatibility/milestone/29 -[9.2.0 milestone]: https://github.com/PHPCompatibility/PHPCompatibility/milestone/28 -[9.1.1 milestone]: https://github.com/PHPCompatibility/PHPCompatibility/milestone/27 -[9.1.0 milestone]: https://github.com/PHPCompatibility/PHPCompatibility/milestone/25 -[9.0.0 milestone]: https://github.com/PHPCompatibility/PHPCompatibility/milestone/24 -[8.2.0 milestone]: https://github.com/PHPCompatibility/PHPCompatibility/milestone/22 -[8.1.0 milestone]: https://github.com/PHPCompatibility/PHPCompatibility/milestone/21 -[8.0.1 milestone]: https://github.com/PHPCompatibility/PHPCompatibility/milestone/20 -[8.0.0 milestone]: https://github.com/PHPCompatibility/PHPCompatibility/milestone/19 -[7.1.5 milestone]: https://github.com/PHPCompatibility/PHPCompatibility/milestone/17 -[7.1.4 milestone]: https://github.com/PHPCompatibility/PHPCompatibility/milestone/15 -[7.1.3 milestone]: https://github.com/PHPCompatibility/PHPCompatibility/milestone/14 -[7.1.2 milestone]: https://github.com/PHPCompatibility/PHPCompatibility/milestone/13 -[7.1.1 milestone]: https://github.com/PHPCompatibility/PHPCompatibility/milestone/12 -[7.1.0 milestone]: https://github.com/PHPCompatibility/PHPCompatibility/milestone/11 -[7.0.8 milestone]: https://github.com/PHPCompatibility/PHPCompatibility/milestone/10 -[7.0.7 milestone]: https://github.com/PHPCompatibility/PHPCompatibility/milestone/9 -[7.0.6 milestone]: https://github.com/PHPCompatibility/PHPCompatibility/milestone/8 -[7.0.5 milestone]: https://github.com/PHPCompatibility/PHPCompatibility/milestone/7 -[7.0.4 milestone]: https://github.com/PHPCompatibility/PHPCompatibility/milestone/6 -[7.0.3 milestone]: https://github.com/PHPCompatibility/PHPCompatibility/milestone/5 -[7.0.2 milestone]: https://github.com/PHPCompatibility/PHPCompatibility/milestone/4 -[7.0.1 milestone]: https://github.com/PHPCompatibility/PHPCompatibility/milestone/3 -[7.0 milestone]: https://github.com/PHPCompatibility/PHPCompatibility/milestone/2 -[5.6 milestone]: https://github.com/PHPCompatibility/PHPCompatibility/milestone/1 -[5.5 milestone]: https://github.com/PHPCompatibility/PHPCompatibility/milestone/16 - -[Arthur Edamov]: https://github.com/edamov -[Chris Abernethy]: https://github.com/cabernet-zerve -[Declan Kelly]: https://github.com/declank -[dgudgeon]: https://github.com/dgudgeon -[djaenecke]: https://github.com/djaenecke -[Dominic]: https://github.com/dol -[Eugene Maslovich]: https://github.com/ehpc -[Gary Jones]: https://github.com/GaryJones -[Jaap van Otterdijk]: https://github.com/jaapio -[Jason Stallings]: https://github.com/octalmage -[Jonathan Champ]: https://github.com/jrchamp -[Jonathan Van Belle]: https://github.com/Grummfy -[Juliette Reinders Folmer]: https://github.com/jrfnl -[Ken Guest]: https://github.com/kenguest -[Komarov Alexey]: https://github.com/erdraug -[Marin Crnkovic]: https://github.com/anorgan -[Mark Clements]: https://github.com/MarkMaldaba -[Michael Babker]: https://github.com/mbabker -[Nick Pack]: https://github.com/nickpack -[Nikhil]: https://github.com/Nikschavan -[Oliver Klee]: https://github.com/oliverklee -[Remko van Bezooijen]: https://github.com/emkookmer -[Rowan Collins]: https://github.com/IMSoP -[Ryan Neufeld]: https://github.com/ryanneufeld -[Sam Van der Borght]: https://github.com/samvdb -[Sergii Bondarenko]: https://github.com/BR0kEN- -[Tadas Juozapaitis]: https://github.com/kasp3r -[Tim Millwood]: https://github.com/timmillwood -[William Entriken]: https://github.com/fulldecent -[Yılmaz]: https://github.com/edigu -[Yoshiaki Yoshida]: https://github.com/kakakakakku diff --git a/vendor/phpcompatibility/php-compatibility/LICENSE b/vendor/phpcompatibility/php-compatibility/LICENSE deleted file mode 100644 index 65c5ca8..0000000 --- a/vendor/phpcompatibility/php-compatibility/LICENSE +++ /dev/null @@ -1,165 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. diff --git a/vendor/phpcompatibility/php-compatibility/PHPCSAliases.php b/vendor/phpcompatibility/php-compatibility/PHPCSAliases.php deleted file mode 100644 index 97591a3..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCSAliases.php +++ /dev/null @@ -1,73 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * PHPCS cross-version compatibility helper. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - * - * @since 8.0.0 - */ - -/* - * Alias a number of PHPCS 3.x classes to their PHPCS 2.x equivalents. - * - * This file is auto-loaded by PHPCS 3.x before any sniffs are loaded - * through the PHPCS 3.x `<autoload>` ruleset directive. - * - * {@internal The PHPCS file have been reorganized in PHPCS 3.x, quite - * a few "old" classes have been split and spread out over several "new" - * classes. In other words, this will only work for a limited number - * of classes.} - * - * {@internal The `class_exists` wrappers are needed to play nice with other - * external PHPCS standards creating cross-version compatibility in the same - * manner.} - */ -if (defined('PHPCOMPATIBILITY_PHPCS_ALIASES_SET') === false) { - if (interface_exists('\PHP_CodeSniffer_Sniff') === false) { - class_alias('PHP_CodeSniffer\Sniffs\Sniff', '\PHP_CodeSniffer_Sniff'); - } - if (class_exists('\PHP_CodeSniffer_File') === false) { - class_alias('PHP_CodeSniffer\Files\File', '\PHP_CodeSniffer_File'); - } - if (class_exists('\PHP_CodeSniffer_Tokens') === false) { - class_alias('PHP_CodeSniffer\Util\Tokens', '\PHP_CodeSniffer_Tokens'); - } - if (class_exists('\PHP_CodeSniffer_Exception') === false) { - class_alias('PHP_CodeSniffer\Exceptions\RuntimeException', '\PHP_CodeSniffer_Exception'); - } - if (class_exists('\PHP_CodeSniffer_Standards_AbstractScopeSniff') === false) { - class_alias('PHP_CodeSniffer\Sniffs\AbstractScopeSniff', '\PHP_CodeSniffer_Standards_AbstractScopeSniff'); - } - if (class_exists('\Generic_Sniffs_NamingConventions_CamelCapsFunctionNameSniff') === false) { - class_alias('PHP_CodeSniffer\Standards\Generic\Sniffs\NamingConventions\CamelCapsFunctionNameSniff', '\Generic_Sniffs_NamingConventions_CamelCapsFunctionNameSniff'); - } - - define('PHPCOMPATIBILITY_PHPCS_ALIASES_SET', true); - - /* - * Register an autoloader. - * - * {@internal When `installed_paths` is set via the ruleset, this autoloader - * is needed to run the sniffs. - * Upstream issue: {@link https://github.com/squizlabs/PHP_CodeSniffer/issues/1591} } - * - * @since 8.0.0 - */ - spl_autoload_register(function ($class) { - // Only try & load our own classes. - if (stripos($class, 'PHPCompatibility') !== 0) { - return; - } - - $file = realpath(__DIR__) . DIRECTORY_SEPARATOR . strtr($class, '\\', DIRECTORY_SEPARATOR) . '.php'; - - if (file_exists($file)) { - include_once $file; - } - }); -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/AbstractComplexVersionSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/AbstractComplexVersionSniff.php deleted file mode 100644 index 95245b6..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/AbstractComplexVersionSniff.php +++ /dev/null @@ -1,147 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility; - -use PHP_CodeSniffer_File as File; - -/** - * Abstract base class for sniffs based on complex arrays with PHP version information. - * - * @since 7.1.0 - */ -abstract class AbstractComplexVersionSniff extends Sniff implements ComplexVersionInterface -{ - - - /** - * Handle the retrieval of relevant information and - if necessary - throwing of an - * error/warning for an item. - * - * @since 7.1.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the relevant token in - * the stack. - * @param array $itemInfo Base information about the item. - * - * @return void - */ - public function handleFeature(File $phpcsFile, $stackPtr, array $itemInfo) - { - $itemArray = $this->getItemArray($itemInfo); - $errorInfo = $this->getErrorInfo($itemArray, $itemInfo); - - if ($this->shouldThrowError($errorInfo) === true) { - $this->addError($phpcsFile, $stackPtr, $itemInfo, $errorInfo); - } - } - - - /** - * Determine whether an error/warning should be thrown for an item based on collected information. - * - * @since 7.1.0 - * - * @param array $errorInfo Detail information about an item. - * - * @return bool - */ - abstract protected function shouldThrowError(array $errorInfo); - - - /** - * Get an array of the non-PHP-version array keys used in a sub-array. - * - * @since 7.1.0 - * - * @return array - */ - protected function getNonVersionArrayKeys() - { - return array(); - } - - - /** - * Retrieve a subset of an item array containing only the array keys which - * contain PHP version information. - * - * @since 7.1.0 - * - * @param array $itemArray Version and other information about an item. - * - * @return array Array with only the version information. - */ - protected function getVersionArray(array $itemArray) - { - return array_diff_key($itemArray, array_flip($this->getNonVersionArrayKeys())); - } - - - /** - * Get the item name to be used for the creation of the error code and in the error message. - * - * @since 7.1.0 - * - * @param array $itemInfo Base information about the item. - * @param array $errorInfo Detail information about an item. - * - * @return string - */ - protected function getItemName(array $itemInfo, array $errorInfo) - { - return $itemInfo['name']; - } - - - /** - * Get the error message template for a specific sniff. - * - * @since 7.1.0 - * - * @return string - */ - abstract protected function getErrorMsgTemplate(); - - - /** - * Allow for concrete child classes to filter the error message before it's passed to PHPCS. - * - * @since 7.1.0 - * - * @param string $error The error message which was created. - * @param array $itemInfo Base information about the item this error message applies to. - * @param array $errorInfo Detail information about an item this error message applies to. - * - * @return string - */ - protected function filterErrorMsg($error, array $itemInfo, array $errorInfo) - { - return $error; - } - - - /** - * Allow for concrete child classes to filter the error data before it's passed to PHPCS. - * - * @since 7.1.0 - * - * @param array $data The error data array which was created. - * @param array $itemInfo Base information about the item this error message applies to. - * @param array $errorInfo Detail information about an item this error message applies to. - * - * @return array - */ - protected function filterErrorData(array $data, array $itemInfo, array $errorInfo) - { - return $data; - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/AbstractFunctionCallParameterSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/AbstractFunctionCallParameterSniff.php deleted file mode 100644 index 6db8cd0..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/AbstractFunctionCallParameterSniff.php +++ /dev/null @@ -1,193 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Abstract class to use as a base for examining the parameter values passed to function calls. - * - * @since 8.2.0 - */ -abstract class AbstractFunctionCallParameterSniff extends Sniff -{ - /** - * Is the sniff looking for a function call or a method call ? - * - * Note: the child class may need to do additional checks to make sure that - * the method called is of the right class/object. - * Checking that is outside of the scope of this abstract sniff. - * - * @since 8.2.0 - * - * @var bool False (default) if the sniff is looking for function calls. - * True if the sniff is looking for method calls. - */ - protected $isMethod = false; - - /** - * Functions the sniff is looking for. Should be defined in the child class. - * - * @since 8.2.0 - * - * @var array The only requirement for this array is that the top level - * array keys are the names of the functions you're looking for. - * Other than that, the array can have arbitrary content - * depending on your needs. - */ - protected $targetFunctions = array(); - - /** - * List of tokens which when they preceed the $stackPtr indicate that this - * is not a function call. - * - * @since 8.2.0 - * - * @var array - */ - private $ignoreTokens = array( - \T_DOUBLE_COLON => true, - \T_OBJECT_OPERATOR => true, - \T_FUNCTION => true, - \T_NEW => true, - \T_CONST => true, - \T_USE => true, - ); - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 8.2.0 - * - * @return array - */ - public function register() - { - // Handle case-insensitivity of function names. - $this->targetFunctions = $this->arrayKeysToLowercase($this->targetFunctions); - - return array(\T_STRING); - } - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 8.2.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->bowOutEarly() === true) { - return; - } - - $tokens = $phpcsFile->getTokens(); - $function = $tokens[$stackPtr]['content']; - $functionLc = strtolower($function); - - if (isset($this->targetFunctions[$functionLc]) === false) { - return; - } - - $prevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - - if ($this->isMethod === true) { - if ($tokens[$prevNonEmpty]['code'] !== \T_DOUBLE_COLON - && $tokens[$prevNonEmpty]['code'] !== \T_OBJECT_OPERATOR - ) { - // Not a call to a PHP method. - return; - } - } else { - if (isset($this->ignoreTokens[$tokens[$prevNonEmpty]['code']]) === true) { - // Not a call to a PHP function. - return; - } - - if ($tokens[$prevNonEmpty]['code'] === \T_NS_SEPARATOR - && $tokens[$prevNonEmpty - 1]['code'] === \T_STRING - ) { - // Namespaced function. - return; - } - } - - $parameters = $this->getFunctionCallParameters($phpcsFile, $stackPtr); - - if (empty($parameters)) { - return $this->processNoParameters($phpcsFile, $stackPtr, $function); - } else { - return $this->processParameters($phpcsFile, $stackPtr, $function, $parameters); - } - } - - - /** - * Do a version check to determine if this sniff needs to run at all. - * - * @since 8.2.0 - * - * If the check done in a child class is not specific to one PHP version, - * this function should return `false`. - * - * @return bool - */ - abstract protected function bowOutEarly(); - - - /** - * Process the parameters of a matched function. - * - * This method has to be made concrete in child classes. - * - * @since 8.2.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the stack. - * @param string $functionName The token content (function name) which was matched. - * @param array $parameters Array with information about the parameters. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - abstract public function processParameters(File $phpcsFile, $stackPtr, $functionName, $parameters); - - - /** - * Process the function if no parameters were found. - * - * Defaults to doing nothing. Can be overloaded in child classes to handle functions - * were parameters are expected, but none found. - * - * @since 8.2.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the stack. - * @param string $functionName The token content (function name) which was matched. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function processNoParameters(File $phpcsFile, $stackPtr, $functionName) - { - return; - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/AbstractNewFeatureSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/AbstractNewFeatureSniff.php deleted file mode 100644 index 25406fd..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/AbstractNewFeatureSniff.php +++ /dev/null @@ -1,115 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility; - -use PHP_CodeSniffer_File as File; - -/** - * Base class for new feature sniffs. - * - * @since 7.1.0 - */ -abstract class AbstractNewFeatureSniff extends AbstractComplexVersionSniff -{ - - - /** - * Determine whether an error/warning should be thrown for an item based on collected information. - * - * @since 7.1.0 - * - * @param array $errorInfo Detail information about an item. - * - * @return bool - */ - protected function shouldThrowError(array $errorInfo) - { - return ($errorInfo['not_in_version'] !== ''); - } - - - /** - * Retrieve the relevant detail (version) information for use in an error message. - * - * @since 7.1.0 - * - * @param array $itemArray Version and other information about the item. - * @param array $itemInfo Base information about the item. - * - * @return array - */ - public function getErrorInfo(array $itemArray, array $itemInfo) - { - $errorInfo = array( - 'not_in_version' => '', - 'error' => true, - ); - - $versionArray = $this->getVersionArray($itemArray); - - if (empty($versionArray) === false) { - foreach ($versionArray as $version => $present) { - if ($errorInfo['not_in_version'] === '' && $present === false - && $this->supportsBelow($version) === true - ) { - $errorInfo['not_in_version'] = $version; - } - } - } - - return $errorInfo; - } - - - /** - * Get the error message template for this sniff. - * - * @since 7.1.0 - * - * @return string - */ - protected function getErrorMsgTemplate() - { - return '%s is not present in PHP version %s or earlier'; - } - - - /** - * Generates the error or warning for this item. - * - * @since 7.1.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the relevant token in - * the stack. - * @param array $itemInfo Base information about the item. - * @param array $errorInfo Array with detail (version) information - * relevant to the item. - * - * @return void - */ - public function addError(File $phpcsFile, $stackPtr, array $itemInfo, array $errorInfo) - { - $itemName = $this->getItemName($itemInfo, $errorInfo); - $error = $this->getErrorMsgTemplate(); - - $errorCode = $this->stringToErrorCode($itemName) . 'Found'; - $data = array( - $itemName, - $errorInfo['not_in_version'], - ); - - $error = $this->filterErrorMsg($error, $itemInfo, $errorInfo); - $data = $this->filterErrorData($data, $itemInfo, $errorInfo); - - $this->addMessage($phpcsFile, $error, $stackPtr, $errorInfo['error'], $errorCode, $data); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/AbstractRemovedFeatureSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/AbstractRemovedFeatureSniff.php deleted file mode 100644 index 9410392..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/AbstractRemovedFeatureSniff.php +++ /dev/null @@ -1,156 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility; - -use PHP_CodeSniffer_File as File; - -/** - * Base class for removed feature sniffs. - * - * @since 7.1.0 - */ -abstract class AbstractRemovedFeatureSniff extends AbstractComplexVersionSniff -{ - - - /** - * Determine whether an error/warning should be thrown for an item based on collected information. - * - * @since 7.1.0 - * - * @param array $errorInfo Detail information about an item. - * - * @return bool - */ - protected function shouldThrowError(array $errorInfo) - { - return ($errorInfo['deprecated'] !== '' || $errorInfo['removed'] !== ''); - } - - - /** - * Get an array of the non-PHP-version array keys used in a sub-array. - * - * By default, removed feature version arrays, contain an additional 'alternative' array key. - * - * @since 7.1.0 - * - * @return array - */ - protected function getNonVersionArrayKeys() - { - return array('alternative'); - } - - - /** - * Retrieve the relevant detail (version) information for use in an error message. - * - * @since 7.1.0 - * - * @param array $itemArray Version and other information about the item. - * @param array $itemInfo Base information about the item. - * - * @return array - */ - public function getErrorInfo(array $itemArray, array $itemInfo) - { - $errorInfo = array( - 'deprecated' => '', - 'removed' => '', - 'alternative' => '', - 'error' => false, - ); - - $versionArray = $this->getVersionArray($itemArray); - - if (empty($versionArray) === false) { - foreach ($versionArray as $version => $removed) { - if ($this->supportsAbove($version) === true) { - if ($removed === true && $errorInfo['removed'] === '') { - $errorInfo['removed'] = $version; - $errorInfo['error'] = true; - } elseif ($errorInfo['deprecated'] === '') { - $errorInfo['deprecated'] = $version; - } - } - } - } - - if (isset($itemArray['alternative']) === true) { - $errorInfo['alternative'] = $itemArray['alternative']; - } - - return $errorInfo; - } - - - /** - * Get the error message template for suggesting an alternative for a specific sniff. - * - * @since 7.1.0 - * - * @return string - */ - protected function getAlternativeOptionTemplate() - { - return '; Use %s instead'; - } - - - /** - * Generates the error or warning for this item. - * - * @since 7.1.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the relevant token in - * the stack. - * @param array $itemInfo Base information about the item. - * @param array $errorInfo Array with detail (version) information - * relevant to the item. - * - * @return void - */ - public function addError(File $phpcsFile, $stackPtr, array $itemInfo, array $errorInfo) - { - $itemName = $this->getItemName($itemInfo, $errorInfo); - $error = $this->getErrorMsgTemplate(); - - $errorCode = $this->stringToErrorCode($itemName); - $data = array($itemName); - - if ($errorInfo['deprecated'] !== '') { - $error .= 'deprecated since PHP %s and '; - $errorCode .= 'Deprecated'; - $data[] = $errorInfo['deprecated']; - } - - if ($errorInfo['removed'] !== '') { - $error .= 'removed since PHP %s and '; - $errorCode .= 'Removed'; - $data[] = $errorInfo['removed']; - } - - // Remove the last 'and' from the message. - $error = substr($error, 0, (\strlen($error) - 5)); - - if ($errorInfo['alternative'] !== '') { - $error .= $this->getAlternativeOptionTemplate(); - $data[] = $errorInfo['alternative']; - } - - $error = $this->filterErrorMsg($error, $itemInfo, $errorInfo); - $data = $this->filterErrorData($data, $itemInfo, $errorInfo); - - $this->addMessage($phpcsFile, $error, $stackPtr, $errorInfo['error'], $errorCode, $data); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/ComplexVersionInterface.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/ComplexVersionInterface.php deleted file mode 100644 index f5f63bb..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/ComplexVersionInterface.php +++ /dev/null @@ -1,84 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility; - -use PHP_CodeSniffer_File as File; - -/** - * Complex Version Interface. - * - * Interface to be implemented by sniffs using a multi-dimensional array of - * PHP features (functions, classes etc) being sniffed for with version - * information in sub-arrays. - * - * @since 7.1.0 - */ -interface ComplexVersionInterface -{ - - - /** - * Handle the retrieval of relevant information and - if necessary - throwing of an - * error/warning for an item. - * - * @since 7.1.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the relevant token in - * the stack. - * @param array $itemInfo Base information about the item. - * - * @return void - */ - public function handleFeature(File $phpcsFile, $stackPtr, array $itemInfo); - - - /** - * Get the relevant sub-array for a specific item from a multi-dimensional array. - * - * @since 7.1.0 - * - * @param array $itemInfo Base information about the item. - * - * @return array Version and other information about the item. - */ - public function getItemArray(array $itemInfo); - - - /** - * Retrieve the relevant detail (version) information for use in an error message. - * - * @since 7.1.0 - * - * @param array $itemArray Version and other information about the item. - * @param array $itemInfo Base information about the item. - * - * @return array - */ - public function getErrorInfo(array $itemArray, array $itemInfo); - - - /** - * Generates the error or warning for this item. - * - * @since 7.1.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the relevant token in - * the stack. - * @param array $itemInfo Base information about the item. - * @param array $errorInfo Array with detail (version) information - * relevant to the item. - * - * @return void - */ - public function addError(File $phpcsFile, $stackPtr, array $itemInfo, array $errorInfo); -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/PHPCSHelper.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/PHPCSHelper.php deleted file mode 100644 index 4204bea..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/PHPCSHelper.php +++ /dev/null @@ -1,678 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility; - -use PHP_CodeSniffer_Exception as PHPCS_Exception; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * PHPCS cross-version compatibility helper class. - * - * A number of PHPCS classes were split up into several classes in PHPCS 3.x - * Those classes cannot be aliased as they don't represent the same object. - * This class provides helper methods for functions which were contained in - * one of these classes and which are used within the PHPCompatibility library. - * - * Additionally, this class contains some duplicates of PHPCS native methods. - * These methods have received bug fixes or improved functionality between the - * lowest supported PHPCS version and the latest PHPCS stable version and - * to provide the same results cross-version, PHPCompatibility needs to use - * the up-to-date versions of these methods. - * - * @since 8.0.0 - * @since 8.2.0 The duplicate PHPCS methods have been moved from the `Sniff` - * base class to this class. - */ -class PHPCSHelper -{ - - /** - * Get the PHPCS version number. - * - * @since 8.0.0 - * - * @return string - */ - public static function getVersion() - { - if (\defined('\PHP_CodeSniffer\Config::VERSION')) { - // PHPCS 3.x. - return \PHP_CodeSniffer\Config::VERSION; - } else { - // PHPCS 2.x. - return \PHP_CodeSniffer::VERSION; - } - } - - - /** - * Pass config data to PHPCS. - * - * PHPCS cross-version compatibility helper. - * - * @since 8.0.0 - * - * @param string $key The name of the config value. - * @param string|null $value The value to set. If null, the config entry - * is deleted, reverting it to the default value. - * @param boolean $temp Set this config data temporarily for this script run. - * This will not write the config data to the config file. - * - * @return void - */ - public static function setConfigData($key, $value, $temp = false) - { - if (method_exists('\PHP_CodeSniffer\Config', 'setConfigData')) { - // PHPCS 3.x. - \PHP_CodeSniffer\Config::setConfigData($key, $value, $temp); - } else { - // PHPCS 2.x. - \PHP_CodeSniffer::setConfigData($key, $value, $temp); - } - } - - - /** - * Get the value of a single PHPCS config key. - * - * @since 8.0.0 - * - * @param string $key The name of the config value. - * - * @return string|null - */ - public static function getConfigData($key) - { - if (method_exists('\PHP_CodeSniffer\Config', 'getConfigData')) { - // PHPCS 3.x. - return \PHP_CodeSniffer\Config::getConfigData($key); - } else { - // PHPCS 2.x. - return \PHP_CodeSniffer::getConfigData($key); - } - } - - - /** - * Get the value of a single PHPCS config key. - * - * This config key can be set in the `CodeSniffer.conf` file, on the - * command-line or in a ruleset. - * - * @since 8.2.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param string $key The name of the config value. - * - * @return string|null - */ - public static function getCommandLineData(File $phpcsFile, $key) - { - if (class_exists('\PHP_CodeSniffer\Config')) { - // PHPCS 3.x. - $config = $phpcsFile->config; - if (isset($config->{$key})) { - return $config->{$key}; - } - } else { - // PHPCS 2.x. - $config = $phpcsFile->phpcs->cli->getCommandLineValues(); - if (isset($config[$key])) { - return $config[$key]; - } - } - - return null; - } - - - /** - * Returns the position of the first non-whitespace token in a statement. - * - * {@internal Duplicate of same method as contained in the `\PHP_CodeSniffer_File` - * class and introduced in PHPCS 2.1.0 and improved in PHPCS 2.7.1. - * - * Once the minimum supported PHPCS version for this standard goes beyond - * that, this method can be removed and calls to it replaced with - * `$phpcsFile->findStartOfStatement($start, $ignore)` calls. - * - * Last synced with PHPCS version: PHPCS 3.3.2 at commit 6ad28354c04b364c3c71a34e4a18b629cc3b231e} - * - * @since 9.1.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile Instance of phpcsFile. - * @param int $start The position to start searching from in the token stack. - * @param int|array $ignore Token types that should not be considered stop points. - * - * @return int - */ - public static function findStartOfStatement(File $phpcsFile, $start, $ignore = null) - { - if (version_compare(self::getVersion(), '2.7.1', '>=') === true) { - return $phpcsFile->findStartOfStatement($start, $ignore); - } - - $tokens = $phpcsFile->getTokens(); - $endTokens = Tokens::$blockOpeners; - - $endTokens[\T_COLON] = true; - $endTokens[\T_COMMA] = true; - $endTokens[\T_DOUBLE_ARROW] = true; - $endTokens[\T_SEMICOLON] = true; - $endTokens[\T_OPEN_TAG] = true; - $endTokens[\T_CLOSE_TAG] = true; - $endTokens[\T_OPEN_SHORT_ARRAY] = true; - - if ($ignore !== null) { - $ignore = (array) $ignore; - foreach ($ignore as $code) { - if (isset($endTokens[$code]) === true) { - unset($endTokens[$code]); - } - } - } - - $lastNotEmpty = $start; - - for ($i = $start; $i >= 0; $i--) { - if (isset($endTokens[$tokens[$i]['code']]) === true) { - // Found the end of the previous statement. - return $lastNotEmpty; - } - - if (isset($tokens[$i]['scope_opener']) === true - && $i === $tokens[$i]['scope_closer'] - ) { - // Found the end of the previous scope block. - return $lastNotEmpty; - } - - // Skip nested statements. - if (isset($tokens[$i]['bracket_opener']) === true - && $i === $tokens[$i]['bracket_closer'] - ) { - $i = $tokens[$i]['bracket_opener']; - } elseif (isset($tokens[$i]['parenthesis_opener']) === true - && $i === $tokens[$i]['parenthesis_closer'] - ) { - $i = $tokens[$i]['parenthesis_opener']; - } - - if (isset(Tokens::$emptyTokens[$tokens[$i]['code']]) === false) { - $lastNotEmpty = $i; - } - }//end for - - return 0; - } - - - /** - * Returns the position of the last non-whitespace token in a statement. - * - * {@internal Duplicate of same method as contained in the `\PHP_CodeSniffer_File` - * class and introduced in PHPCS 2.1.0 and improved in PHPCS 2.7.1 and 3.3.0. - * - * Once the minimum supported PHPCS version for this standard goes beyond - * that, this method can be removed and calls to it replaced with - * `$phpcsFile->findEndOfStatement($start, $ignore)` calls. - * - * Last synced with PHPCS version: PHPCS 3.3.0-alpha at commit f5d899dcb5c534a1c3cca34668624517856ba823} - * - * @since 8.2.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile Instance of phpcsFile. - * @param int $start The position to start searching from in the token stack. - * @param int|array $ignore Token types that should not be considered stop points. - * - * @return int - */ - public static function findEndOfStatement(File $phpcsFile, $start, $ignore = null) - { - if (version_compare(self::getVersion(), '3.3.0', '>=') === true) { - return $phpcsFile->findEndOfStatement($start, $ignore); - } - - $tokens = $phpcsFile->getTokens(); - $endTokens = array( - \T_COLON => true, - \T_COMMA => true, - \T_DOUBLE_ARROW => true, - \T_SEMICOLON => true, - \T_CLOSE_PARENTHESIS => true, - \T_CLOSE_SQUARE_BRACKET => true, - \T_CLOSE_CURLY_BRACKET => true, - \T_CLOSE_SHORT_ARRAY => true, - \T_OPEN_TAG => true, - \T_CLOSE_TAG => true, - ); - - if ($ignore !== null) { - $ignore = (array) $ignore; - foreach ($ignore as $code) { - if (isset($endTokens[$code]) === true) { - unset($endTokens[$code]); - } - } - } - - $lastNotEmpty = $start; - - for ($i = $start; $i < $phpcsFile->numTokens; $i++) { - if ($i !== $start && isset($endTokens[$tokens[$i]['code']]) === true) { - // Found the end of the statement. - if ($tokens[$i]['code'] === \T_CLOSE_PARENTHESIS - || $tokens[$i]['code'] === \T_CLOSE_SQUARE_BRACKET - || $tokens[$i]['code'] === \T_CLOSE_CURLY_BRACKET - || $tokens[$i]['code'] === \T_CLOSE_SHORT_ARRAY - || $tokens[$i]['code'] === \T_OPEN_TAG - || $tokens[$i]['code'] === \T_CLOSE_TAG - ) { - return $lastNotEmpty; - } - - return $i; - } - - // Skip nested statements. - if (isset($tokens[$i]['scope_closer']) === true - && ($i === $tokens[$i]['scope_opener'] - || $i === $tokens[$i]['scope_condition']) - ) { - if ($i === $start && isset(Tokens::$scopeOpeners[$tokens[$i]['code']]) === true) { - return $tokens[$i]['scope_closer']; - } - - $i = $tokens[$i]['scope_closer']; - } elseif (isset($tokens[$i]['bracket_closer']) === true - && $i === $tokens[$i]['bracket_opener'] - ) { - $i = $tokens[$i]['bracket_closer']; - } elseif (isset($tokens[$i]['parenthesis_closer']) === true - && $i === $tokens[$i]['parenthesis_opener'] - ) { - $i = $tokens[$i]['parenthesis_closer']; - } - - if (isset(Tokens::$emptyTokens[$tokens[$i]['code']]) === false) { - $lastNotEmpty = $i; - } - }//end for - - return ($phpcsFile->numTokens - 1); - } - - - /** - * Returns the name of the class that the specified class extends - * (works for classes, anonymous classes and interfaces). - * - * Returns FALSE on error or if there is no extended class name. - * - * {@internal Duplicate of same method as contained in the `\PHP_CodeSniffer_File` - * class, but with some improvements which have been introduced in - * PHPCS 2.8.0. - * {@link https://github.com/squizlabs/PHP_CodeSniffer/commit/0011d448119d4c568e3ac1f825ae78815bf2cc34}. - * - * Once the minimum supported PHPCS version for this standard goes beyond - * that, this method can be removed and calls to it replaced with - * `$phpcsFile->findExtendedClassName($stackPtr)` calls. - * - * Last synced with PHPCS version: PHPCS 3.1.0-alpha at commit a9efcc9b0703f3f9f4a900623d4e97128a6aafc6} - * - * @since 7.1.4 - * @since 8.2.0 Moved from the `Sniff` class to this class. - * - * @param \PHP_CodeSniffer_File $phpcsFile Instance of phpcsFile. - * @param int $stackPtr The position of the class token in the stack. - * - * @return string|false - */ - public static function findExtendedClassName(File $phpcsFile, $stackPtr) - { - if (version_compare(self::getVersion(), '3.1.0', '>=') === true) { - return $phpcsFile->findExtendedClassName($stackPtr); - } - - $tokens = $phpcsFile->getTokens(); - - // Check for the existence of the token. - if (isset($tokens[$stackPtr]) === false) { - return false; - } - - if ($tokens[$stackPtr]['code'] !== \T_CLASS - && $tokens[$stackPtr]['type'] !== 'T_ANON_CLASS' - && $tokens[$stackPtr]['type'] !== 'T_INTERFACE' - ) { - return false; - } - - if (isset($tokens[$stackPtr]['scope_closer']) === false) { - return false; - } - - $classCloserIndex = $tokens[$stackPtr]['scope_closer']; - $extendsIndex = $phpcsFile->findNext(\T_EXTENDS, $stackPtr, $classCloserIndex); - if ($extendsIndex === false) { - return false; - } - - $find = array( - \T_NS_SEPARATOR, - \T_STRING, - \T_WHITESPACE, - ); - - $end = $phpcsFile->findNext($find, ($extendsIndex + 1), $classCloserIndex, true); - $name = $phpcsFile->getTokensAsString(($extendsIndex + 1), ($end - $extendsIndex - 1)); - $name = trim($name); - - if ($name === '') { - return false; - } - - return $name; - } - - - /** - * Returns the name(s) of the interface(s) that the specified class implements. - * - * Returns FALSE on error or if there are no implemented interface names. - * - * {@internal Duplicate of same method as introduced in PHPCS 2.7. - * This method also includes an improvement we use which was only introduced - * in PHPCS 2.8.0, so only defer to upstream for higher versions. - * Once the minimum supported PHPCS version for this sniff library goes beyond - * that, this method can be removed and calls to it replaced with - * `$phpcsFile->findImplementedInterfaceNames($stackPtr)` calls.} - * - * @since 7.0.3 - * @since 8.2.0 Moved from the `Sniff` class to this class. - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the class token. - * - * @return array|false - */ - public static function findImplementedInterfaceNames(File $phpcsFile, $stackPtr) - { - if (version_compare(self::getVersion(), '2.7.1', '>') === true) { - return $phpcsFile->findImplementedInterfaceNames($stackPtr); - } - - $tokens = $phpcsFile->getTokens(); - - // Check for the existence of the token. - if (isset($tokens[$stackPtr]) === false) { - return false; - } - - if ($tokens[$stackPtr]['code'] !== \T_CLASS - && $tokens[$stackPtr]['type'] !== 'T_ANON_CLASS' - ) { - return false; - } - - if (isset($tokens[$stackPtr]['scope_closer']) === false) { - return false; - } - - $classOpenerIndex = $tokens[$stackPtr]['scope_opener']; - $implementsIndex = $phpcsFile->findNext(\T_IMPLEMENTS, $stackPtr, $classOpenerIndex); - if ($implementsIndex === false) { - return false; - } - - $find = array( - \T_NS_SEPARATOR, - \T_STRING, - \T_WHITESPACE, - \T_COMMA, - ); - - $end = $phpcsFile->findNext($find, ($implementsIndex + 1), ($classOpenerIndex + 1), true); - $name = $phpcsFile->getTokensAsString(($implementsIndex + 1), ($end - $implementsIndex - 1)); - $name = trim($name); - - if ($name === '') { - return false; - } else { - $names = explode(',', $name); - $names = array_map('trim', $names); - return $names; - } - } - - - /** - * Returns the method parameters for the specified function token. - * - * Each parameter is in the following format: - * - * <code> - * 0 => array( - * 'name' => '$var', // The variable name. - * 'token' => integer, // The stack pointer to the variable name. - * 'content' => string, // The full content of the variable definition. - * 'pass_by_reference' => boolean, // Is the variable passed by reference? - * 'variable_length' => boolean, // Is the param of variable length through use of `...` ? - * 'type_hint' => string, // The type hint for the variable. - * 'type_hint_token' => integer, // The stack pointer to the type hint - * // or false if there is no type hint. - * 'nullable_type' => boolean, // Is the variable using a nullable type? - * ) - * </code> - * - * Parameters with default values have an additional array index of - * 'default' with the value of the default as a string. - * - * {@internal Duplicate of same method as contained in the `\PHP_CodeSniffer_File` - * class. - * - * Last synced with PHPCS version: PHPCS 3.3.0-alpha at commit 53a28408d345044c0360c2c1b4a2aaebf4a3b8c9} - * - * @since 7.0.3 - * @since 8.2.0 Moved from the `Sniff` class to this class. - * - * @param \PHP_CodeSniffer_File $phpcsFile Instance of phpcsFile. - * @param int $stackPtr The position in the stack of the - * function token to acquire the - * parameters for. - * - * @return array|false - * @throws \PHP_CodeSniffer_Exception If the specified $stackPtr is not of - * type T_FUNCTION or T_CLOSURE. - */ - public static function getMethodParameters(File $phpcsFile, $stackPtr) - { - if (version_compare(self::getVersion(), '3.3.0', '>=') === true) { - return $phpcsFile->getMethodParameters($stackPtr); - } - - $tokens = $phpcsFile->getTokens(); - - // Check for the existence of the token. - if (isset($tokens[$stackPtr]) === false) { - return false; - } - - if ($tokens[$stackPtr]['code'] !== \T_FUNCTION - && $tokens[$stackPtr]['code'] !== \T_CLOSURE - ) { - throw new PHPCS_Exception('$stackPtr must be of type T_FUNCTION or T_CLOSURE'); - } - - $opener = $tokens[$stackPtr]['parenthesis_opener']; - $closer = $tokens[$stackPtr]['parenthesis_closer']; - - $vars = array(); - $currVar = null; - $paramStart = ($opener + 1); - $defaultStart = null; - $paramCount = 0; - $passByReference = false; - $variableLength = false; - $typeHint = ''; - $typeHintToken = false; - $nullableType = false; - - for ($i = $paramStart; $i <= $closer; $i++) { - // Check to see if this token has a parenthesis or bracket opener. If it does - // it's likely to be an array which might have arguments in it. This - // could cause problems in our parsing below, so lets just skip to the - // end of it. - if (isset($tokens[$i]['parenthesis_opener']) === true) { - // Don't do this if it's the close parenthesis for the method. - if ($i !== $tokens[$i]['parenthesis_closer']) { - $i = ($tokens[$i]['parenthesis_closer'] + 1); - } - } - - if (isset($tokens[$i]['bracket_opener']) === true) { - // Don't do this if it's the close parenthesis for the method. - if ($i !== $tokens[$i]['bracket_closer']) { - $i = ($tokens[$i]['bracket_closer'] + 1); - } - } - - switch ($tokens[$i]['type']) { - case 'T_BITWISE_AND': - if ($defaultStart === null) { - $passByReference = true; - } - break; - case 'T_VARIABLE': - $currVar = $i; - break; - case 'T_ELLIPSIS': - $variableLength = true; - break; - case 'T_ARRAY_HINT': // Pre-PHPCS 3.3.0. - case 'T_CALLABLE': - if ($typeHintToken === false) { - $typeHintToken = $i; - } - - $typeHint .= $tokens[$i]['content']; - break; - case 'T_SELF': - case 'T_PARENT': - case 'T_STATIC': - // Self and parent are valid, static invalid, but was probably intended as type hint. - if (isset($defaultStart) === false) { - if ($typeHintToken === false) { - $typeHintToken = $i; - } - - $typeHint .= $tokens[$i]['content']; - } - break; - case 'T_STRING': - // This is a string, so it may be a type hint, but it could - // also be a constant used as a default value. - $prevComma = false; - for ($t = $i; $t >= $opener; $t--) { - if ($tokens[$t]['code'] === \T_COMMA) { - $prevComma = $t; - break; - } - } - - if ($prevComma !== false) { - $nextEquals = false; - for ($t = $prevComma; $t < $i; $t++) { - if ($tokens[$t]['code'] === \T_EQUAL) { - $nextEquals = $t; - break; - } - } - - if ($nextEquals !== false) { - break; - } - } - - if ($defaultStart === null) { - if ($typeHintToken === false) { - $typeHintToken = $i; - } - - $typeHint .= $tokens[$i]['content']; - } - break; - case 'T_NS_SEPARATOR': - // Part of a type hint or default value. - if ($defaultStart === null) { - if ($typeHintToken === false) { - $typeHintToken = $i; - } - - $typeHint .= $tokens[$i]['content']; - } - break; - case 'T_NULLABLE': - case 'T_INLINE_THEN': // Pre-PHPCS 2.8.0. - if ($defaultStart === null) { - $nullableType = true; - $typeHint .= $tokens[$i]['content']; - } - break; - case 'T_CLOSE_PARENTHESIS': - case 'T_COMMA': - // If it's null, then there must be no parameters for this - // method. - if ($currVar === null) { - break; - } - - $vars[$paramCount] = array(); - $vars[$paramCount]['token'] = $currVar; - $vars[$paramCount]['name'] = $tokens[$currVar]['content']; - $vars[$paramCount]['content'] = trim($phpcsFile->getTokensAsString($paramStart, ($i - $paramStart))); - - if ($defaultStart !== null) { - $vars[$paramCount]['default'] = trim( - $phpcsFile->getTokensAsString( - $defaultStart, - ($i - $defaultStart) - ) - ); - } - - $vars[$paramCount]['pass_by_reference'] = $passByReference; - $vars[$paramCount]['variable_length'] = $variableLength; - $vars[$paramCount]['type_hint'] = $typeHint; - $vars[$paramCount]['type_hint_token'] = $typeHintToken; - $vars[$paramCount]['nullable_type'] = $nullableType; - - // Reset the vars, as we are about to process the next parameter. - $defaultStart = null; - $paramStart = ($i + 1); - $passByReference = false; - $variableLength = false; - $typeHint = ''; - $typeHintToken = false; - $nullableType = false; - - $paramCount++; - break; - case 'T_EQUAL': - $defaultStart = ($i + 1); - break; - }//end switch - }//end for - - return $vars; - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniff.php deleted file mode 100644 index 38fb709..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniff.php +++ /dev/null @@ -1,2267 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility; - -use PHPCompatibility\PHPCSHelper; -use PHP_CodeSniffer_Exception as PHPCS_Exception; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Sniff as PHPCS_Sniff; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Base class from which all PHPCompatibility sniffs extend. - * - * @since 5.6 - */ -abstract class Sniff implements PHPCS_Sniff -{ - - /** - * Regex to match variables in a double quoted string. - * - * This matches plain variables, but also more complex variables, such - * as $obj->prop, self::prop and $var[]. - * - * @since 7.1.2 - * - * @var string - */ - const REGEX_COMPLEX_VARS = '`(?:(\{)?(?<!\\\\)\$)?(\{)?(?<!\\\\)\$(\{)?(?P<varname>[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)(?:->\$?(?P>varname)|\[[^\]]+\]|::\$?(?P>varname)|\([^\)]*\))*(?(3)\}|)(?(2)\}|)(?(1)\}|)`'; - - /** - * List of superglobals as an array of strings. - * - * Used by the ForbiddenParameterShadowSuperGlobals and ForbiddenClosureUseVariableNames sniffs. - * - * @since 7.0.0 - * @since 7.1.4 Moved from the `ForbiddenParameterShadowSuperGlobals` sniff to the base `Sniff` class. - * - * @var array - */ - protected $superglobals = array( - '$GLOBALS' => true, - '$_SERVER' => true, - '$_GET' => true, - '$_POST' => true, - '$_FILES' => true, - '$_COOKIE' => true, - '$_SESSION' => true, - '$_REQUEST' => true, - '$_ENV' => true, - ); - - /** - * List of functions using hash algorithm as parameter (always the first parameter). - * - * Used by the new/removed hash algorithm sniffs. - * Key is the function name, value is the 1-based parameter position in the function call. - * - * @since 5.5 - * @since 7.0.7 Moved from the `RemovedHashAlgorithms` sniff to the base `Sniff` class. - * - * @var array - */ - protected $hashAlgoFunctions = array( - 'hash_file' => 1, - 'hash_hmac_file' => 1, - 'hash_hmac' => 1, - 'hash_init' => 1, - 'hash_pbkdf2' => 1, - 'hash' => 1, - ); - - - /** - * List of functions which take an ini directive as parameter (always the first parameter). - * - * Used by the new/removed ini directives sniffs. - * Key is the function name, value is the 1-based parameter position in the function call. - * - * @since 7.1.0 - * - * @var array - */ - protected $iniFunctions = array( - 'ini_get' => 1, - 'ini_set' => 1, - ); - - - /** - * Get the testVersion configuration variable. - * - * The testVersion configuration variable may be in any of the following formats: - * 1) Omitted/empty, in which case no version is specified. This effectively - * disables all the checks for new PHP features provided by this standard. - * 2) A single PHP version number, e.g. "5.4" in which case the standard checks that - * the code will run on that version of PHP (no deprecated features or newer - * features being used). - * 3) A range, e.g. "5.0-5.5", in which case the standard checks the code will run - * on all PHP versions in that range, and that it doesn't use any features that - * were deprecated by the final version in the list, or which were not available - * for the first version in the list. - * We accept ranges where one of the components is missing, e.g. "-5.6" means - * all versions up to PHP 5.6, and "7.0-" means all versions above PHP 7.0. - * PHP version numbers should always be in Major.Minor format. Both "5", "5.3.2" - * would be treated as invalid, and ignored. - * - * @since 7.0.0 - * @since 7.1.3 Now allows for partial ranges such as `5.2-`. - * - * @return array $arrTestVersions will hold an array containing min/max version - * of PHP that we are checking against (see above). If only a - * single version number is specified, then this is used as - * both the min and max. - * - * @throws \PHP_CodeSniffer_Exception If testVersion is invalid. - */ - private function getTestVersion() - { - static $arrTestVersions = array(); - - $default = array(null, null); - $testVersion = trim(PHPCSHelper::getConfigData('testVersion')); - - if (empty($testVersion) === false && isset($arrTestVersions[$testVersion]) === false) { - - $arrTestVersions[$testVersion] = $default; - - if (preg_match('`^\d+\.\d+$`', $testVersion)) { - $arrTestVersions[$testVersion] = array($testVersion, $testVersion); - return $arrTestVersions[$testVersion]; - } - - if (preg_match('`^(\d+\.\d+)?\s*-\s*(\d+\.\d+)?$`', $testVersion, $matches)) { - if (empty($matches[1]) === false || empty($matches[2]) === false) { - // If no lower-limit is set, we set the min version to 4.0. - // Whilst development focuses on PHP 5 and above, we also accept - // sniffs for PHP 4, so we include that as the minimum. - // (It makes no sense to support PHP 3 as this was effectively a - // different language). - $min = empty($matches[1]) ? '4.0' : $matches[1]; - - // If no upper-limit is set, we set the max version to 99.9. - $max = empty($matches[2]) ? '99.9' : $matches[2]; - - if (version_compare($min, $max, '>')) { - trigger_error( - "Invalid range in testVersion setting: '" . $testVersion . "'", - \E_USER_WARNING - ); - return $default; - } else { - $arrTestVersions[$testVersion] = array($min, $max); - return $arrTestVersions[$testVersion]; - } - } - } - - trigger_error( - "Invalid testVersion setting: '" . $testVersion . "'", - \E_USER_WARNING - ); - return $default; - } - - if (isset($arrTestVersions[$testVersion])) { - return $arrTestVersions[$testVersion]; - } - - return $default; - } - - - /** - * Check whether a specific PHP version is equal to or higher than the maximum - * supported PHP version as provided by the user in `testVersion`. - * - * Should be used when sniffing for *old* PHP features (deprecated/removed). - * - * @since 5.6 - * - * @param string $phpVersion A PHP version number in 'major.minor' format. - * - * @return bool True if testVersion has not been provided or if the PHP version - * is equal to or higher than the highest supported PHP version - * in testVersion. False otherwise. - */ - public function supportsAbove($phpVersion) - { - $testVersion = $this->getTestVersion(); - $testVersion = $testVersion[1]; - - if (\is_null($testVersion) - || version_compare($testVersion, $phpVersion) >= 0 - ) { - return true; - } else { - return false; - } - } - - - /** - * Check whether a specific PHP version is equal to or lower than the minimum - * supported PHP version as provided by the user in `testVersion`. - * - * Should be used when sniffing for *new* PHP features. - * - * @since 5.6 - * - * @param string $phpVersion A PHP version number in 'major.minor' format. - * - * @return bool True if the PHP version is equal to or lower than the lowest - * supported PHP version in testVersion. - * False otherwise or if no testVersion is provided. - */ - public function supportsBelow($phpVersion) - { - $testVersion = $this->getTestVersion(); - $testVersion = $testVersion[0]; - - if (\is_null($testVersion) === false - && version_compare($testVersion, $phpVersion) <= 0 - ) { - return true; - } else { - return false; - } - } - - - /** - * Add a PHPCS message to the output stack as either a warning or an error. - * - * @since 7.1.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file the message applies to. - * @param string $message The message. - * @param int $stackPtr The position of the token - * the message relates to. - * @param bool $isError Whether to report the message as an - * 'error' or 'warning'. - * Defaults to true (error). - * @param string $code The error code for the message. - * Defaults to 'Found'. - * @param array $data Optional input for the data replacements. - * - * @return void - */ - public function addMessage(File $phpcsFile, $message, $stackPtr, $isError, $code = 'Found', $data = array()) - { - if ($isError === true) { - $phpcsFile->addError($message, $stackPtr, $code, $data); - } else { - $phpcsFile->addWarning($message, $stackPtr, $code, $data); - } - } - - - /** - * Convert an arbitrary string to an alphanumeric string with underscores. - * - * Pre-empt issues with arbitrary strings being used as error codes in XML and PHP. - * - * @since 7.1.0 - * - * @param string $baseString Arbitrary string. - * - * @return string - */ - public function stringToErrorCode($baseString) - { - return preg_replace('`[^a-z0-9_]`i', '_', strtolower($baseString)); - } - - - /** - * Strip quotes surrounding an arbitrary string. - * - * Intended for use with the contents of a T_CONSTANT_ENCAPSED_STRING / T_DOUBLE_QUOTED_STRING. - * - * @since 7.0.6 - * - * @param string $string The raw string. - * - * @return string String without quotes around it. - */ - public function stripQuotes($string) - { - return preg_replace('`^([\'"])(.*)\1$`Ds', '$2', $string); - } - - - /** - * Strip variables from an arbitrary double quoted string. - * - * Intended for use with the contents of a T_DOUBLE_QUOTED_STRING. - * - * @since 7.1.2 - * - * @param string $string The raw string. - * - * @return string String without variables in it. - */ - public function stripVariables($string) - { - if (strpos($string, '$') === false) { - return $string; - } - - return preg_replace(self::REGEX_COMPLEX_VARS, '', $string); - } - - - /** - * Make all top level array keys in an array lowercase. - * - * @since 7.1.0 - * - * @param array $array Initial array. - * - * @return array Same array, but with all lowercase top level keys. - */ - public function arrayKeysToLowercase($array) - { - return array_change_key_case($array, \CASE_LOWER); - } - - - /** - * Checks if a function call has parameters. - * - * Expects to be passed the T_STRING or T_VARIABLE stack pointer for the function call. - * If passed a T_STRING which is *not* a function call, the behaviour is unreliable. - * - * Extra feature: If passed an T_ARRAY or T_OPEN_SHORT_ARRAY stack pointer, it - * will detect whether the array has values or is empty. - * - * @link https://github.com/PHPCompatibility/PHPCompatibility/issues/120 - * @link https://github.com/PHPCompatibility/PHPCompatibility/issues/152 - * - * @since 7.0.3 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the function call token. - * - * @return bool - */ - public function doesFunctionCallHaveParameters(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Check for the existence of the token. - if (isset($tokens[$stackPtr]) === false) { - return false; - } - - // Is this one of the tokens this function handles ? - if (\in_array($tokens[$stackPtr]['code'], array(\T_STRING, \T_ARRAY, \T_OPEN_SHORT_ARRAY, \T_VARIABLE), true) === false) { - return false; - } - - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, $stackPtr + 1, null, true, null, true); - - // Deal with short array syntax. - if ($tokens[$stackPtr]['code'] === \T_OPEN_SHORT_ARRAY) { - if (isset($tokens[$stackPtr]['bracket_closer']) === false) { - return false; - } - - if ($nextNonEmpty === $tokens[$stackPtr]['bracket_closer']) { - // No parameters. - return false; - } else { - return true; - } - } - - // Deal with function calls & long arrays. - // Next non-empty token should be the open parenthesis. - if ($nextNonEmpty === false && $tokens[$nextNonEmpty]['code'] !== \T_OPEN_PARENTHESIS) { - return false; - } - - if (isset($tokens[$nextNonEmpty]['parenthesis_closer']) === false) { - return false; - } - - $closeParenthesis = $tokens[$nextNonEmpty]['parenthesis_closer']; - $nextNextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, $nextNonEmpty + 1, $closeParenthesis + 1, true); - - if ($nextNextNonEmpty === $closeParenthesis) { - // No parameters. - return false; - } - - return true; - } - - - /** - * Count the number of parameters a function call has been passed. - * - * Expects to be passed the T_STRING or T_VARIABLE stack pointer for the function call. - * If passed a T_STRING which is *not* a function call, the behaviour is unreliable. - * - * Extra feature: If passed an T_ARRAY or T_OPEN_SHORT_ARRAY stack pointer, - * it will return the number of values in the array. - * - * @link https://github.com/PHPCompatibility/PHPCompatibility/issues/111 - * @link https://github.com/PHPCompatibility/PHPCompatibility/issues/114 - * @link https://github.com/PHPCompatibility/PHPCompatibility/issues/151 - * - * @since 7.0.3 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the function call token. - * - * @return int - */ - public function getFunctionCallParameterCount(File $phpcsFile, $stackPtr) - { - if ($this->doesFunctionCallHaveParameters($phpcsFile, $stackPtr) === false) { - return 0; - } - - return \count($this->getFunctionCallParameters($phpcsFile, $stackPtr)); - } - - - /** - * Get information on all parameters passed to a function call. - * - * Expects to be passed the T_STRING or T_VARIABLE stack pointer for the function call. - * If passed a T_STRING which is *not* a function call, the behaviour is unreliable. - * - * Will return an multi-dimentional array with the start token pointer, end token - * pointer and raw parameter value for all parameters. Index will be 1-based. - * If no parameters are found, will return an empty array. - * - * Extra feature: If passed an T_ARRAY or T_OPEN_SHORT_ARRAY stack pointer, - * it will tokenize the values / key/value pairs contained in the array call. - * - * @since 7.0.5 Split off from the `getFunctionCallParameterCount()` method. - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the function call token. - * - * @return array - */ - public function getFunctionCallParameters(File $phpcsFile, $stackPtr) - { - if ($this->doesFunctionCallHaveParameters($phpcsFile, $stackPtr) === false) { - return array(); - } - - // Ok, we know we have a T_STRING, T_VARIABLE, T_ARRAY or T_OPEN_SHORT_ARRAY with parameters - // and valid open & close brackets/parenthesis. - $tokens = $phpcsFile->getTokens(); - - // Mark the beginning and end tokens. - if ($tokens[$stackPtr]['code'] === \T_OPEN_SHORT_ARRAY) { - $opener = $stackPtr; - $closer = $tokens[$stackPtr]['bracket_closer']; - - $nestedParenthesisCount = 0; - - } else { - $opener = $phpcsFile->findNext(Tokens::$emptyTokens, $stackPtr + 1, null, true, null, true); - $closer = $tokens[$opener]['parenthesis_closer']; - - $nestedParenthesisCount = 1; - } - - // Which nesting level is the one we are interested in ? - if (isset($tokens[$opener]['nested_parenthesis'])) { - $nestedParenthesisCount += \count($tokens[$opener]['nested_parenthesis']); - } - - $parameters = array(); - $nextComma = $opener; - $paramStart = $opener + 1; - $cnt = 1; - while (($nextComma = $phpcsFile->findNext(array(\T_COMMA, $tokens[$closer]['code'], \T_OPEN_SHORT_ARRAY, \T_CLOSURE), $nextComma + 1, $closer + 1)) !== false) { - // Ignore anything within short array definition brackets. - if ($tokens[$nextComma]['type'] === 'T_OPEN_SHORT_ARRAY' - && (isset($tokens[$nextComma]['bracket_opener']) - && $tokens[$nextComma]['bracket_opener'] === $nextComma) - && isset($tokens[$nextComma]['bracket_closer']) - ) { - // Skip forward to the end of the short array definition. - $nextComma = $tokens[$nextComma]['bracket_closer']; - continue; - } - - // Skip past closures passed as function parameters. - if ($tokens[$nextComma]['type'] === 'T_CLOSURE' - && (isset($tokens[$nextComma]['scope_condition']) - && $tokens[$nextComma]['scope_condition'] === $nextComma) - && isset($tokens[$nextComma]['scope_closer']) - ) { - // Skip forward to the end of the closure declaration. - $nextComma = $tokens[$nextComma]['scope_closer']; - continue; - } - - // Ignore comma's at a lower nesting level. - if ($tokens[$nextComma]['type'] === 'T_COMMA' - && isset($tokens[$nextComma]['nested_parenthesis']) - && \count($tokens[$nextComma]['nested_parenthesis']) !== $nestedParenthesisCount - ) { - continue; - } - - // Ignore closing parenthesis/bracket if not 'ours'. - if ($tokens[$nextComma]['type'] === $tokens[$closer]['type'] && $nextComma !== $closer) { - continue; - } - - // Ok, we've reached the end of the parameter. - $parameters[$cnt]['start'] = $paramStart; - $parameters[$cnt]['end'] = $nextComma - 1; - $parameters[$cnt]['raw'] = trim($phpcsFile->getTokensAsString($paramStart, ($nextComma - $paramStart))); - - /* - * Check if there are more tokens before the closing parenthesis. - * Prevents code like the following from setting a third parameter: - * `functionCall( $param1, $param2, );`. - */ - $hasNextParam = $phpcsFile->findNext(Tokens::$emptyTokens, $nextComma + 1, $closer, true, null, true); - if ($hasNextParam === false) { - break; - } - - // Prepare for the next parameter. - $paramStart = $nextComma + 1; - $cnt++; - } - - return $parameters; - } - - - /** - * Get information on a specific parameter passed to a function call. - * - * Expects to be passed the T_STRING or T_VARIABLE stack pointer for the function call. - * If passed a T_STRING which is *not* a function call, the behaviour is unreliable. - * - * Will return a array with the start token pointer, end token pointer and the raw value - * of the parameter at a specific offset. - * If the specified parameter is not found, will return false. - * - * @since 7.0.5 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the function call token. - * @param int $paramOffset The 1-based index position of the parameter to retrieve. - * - * @return array|false - */ - public function getFunctionCallParameter(File $phpcsFile, $stackPtr, $paramOffset) - { - $parameters = $this->getFunctionCallParameters($phpcsFile, $stackPtr); - - if (isset($parameters[$paramOffset]) === false) { - return false; - } else { - return $parameters[$paramOffset]; - } - } - - - /** - * Verify whether a token is within a scoped condition. - * - * If the optional $validScopes parameter has been passed, the function - * will check that the token has at least one condition which is of a - * type defined in $validScopes. - * - * @since 7.0.5 Largely split off from the `inClassScope()` method. - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the token. - * @param array|int $validScopes Optional. Array of valid scopes - * or int value of a valid scope. - * Pass the T_.. constant(s) for the - * desired scope to this parameter. - * - * @return bool Without the optional $scopeTypes: True if within a scope, false otherwise. - * If the $scopeTypes are set: True if *one* of the conditions is a - * valid scope, false otherwise. - */ - public function tokenHasScope(File $phpcsFile, $stackPtr, $validScopes = null) - { - $tokens = $phpcsFile->getTokens(); - - // Check for the existence of the token. - if (isset($tokens[$stackPtr]) === false) { - return false; - } - - // No conditions = no scope. - if (empty($tokens[$stackPtr]['conditions'])) { - return false; - } - - // Ok, there are conditions, do we have to check for specific ones ? - if (isset($validScopes) === false) { - return true; - } - - return $phpcsFile->hasCondition($stackPtr, $validScopes); - } - - - /** - * Verify whether a token is within a class scope. - * - * @since 7.0.3 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the token. - * @param bool $strict Whether to strictly check for the T_CLASS - * scope or also accept interfaces and traits - * as scope. - * - * @return bool True if within class scope, false otherwise. - */ - public function inClassScope(File $phpcsFile, $stackPtr, $strict = true) - { - $validScopes = array(\T_CLASS); - if (\defined('T_ANON_CLASS') === true) { - $validScopes[] = \T_ANON_CLASS; - } - - if ($strict === false) { - $validScopes[] = \T_INTERFACE; - $validScopes[] = \T_TRAIT; - } - - return $phpcsFile->hasCondition($stackPtr, $validScopes); - } - - - /** - * Returns the fully qualified class name for a new class instantiation. - * - * Returns an empty string if the class name could not be reliably inferred. - * - * @since 7.0.3 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of a T_NEW token. - * - * @return string - */ - public function getFQClassNameFromNewToken(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Check for the existence of the token. - if (isset($tokens[$stackPtr]) === false) { - return ''; - } - - if ($tokens[$stackPtr]['code'] !== \T_NEW) { - return ''; - } - - $start = $phpcsFile->findNext(Tokens::$emptyTokens, $stackPtr + 1, null, true, null, true); - if ($start === false) { - return ''; - } - - // Bow out if the next token is a variable as we don't know where it was defined. - if ($tokens[$start]['code'] === \T_VARIABLE) { - return ''; - } - - // Bow out if the next token is the class keyword. - if ($tokens[$start]['type'] === 'T_ANON_CLASS' || $tokens[$start]['code'] === \T_CLASS) { - return ''; - } - - $find = array( - \T_NS_SEPARATOR, - \T_STRING, - \T_NAMESPACE, - \T_WHITESPACE, - ); - - $end = $phpcsFile->findNext($find, ($start + 1), null, true, null, true); - $className = $phpcsFile->getTokensAsString($start, ($end - $start)); - $className = trim($className); - - return $this->getFQName($phpcsFile, $stackPtr, $className); - } - - - /** - * Returns the fully qualified name of the class that the specified class extends. - * - * Returns an empty string if the class does not extend another class or if - * the class name could not be reliably inferred. - * - * @since 7.0.3 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of a T_CLASS token. - * - * @return string - */ - public function getFQExtendedClassName(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Check for the existence of the token. - if (isset($tokens[$stackPtr]) === false) { - return ''; - } - - if ($tokens[$stackPtr]['code'] !== \T_CLASS - && $tokens[$stackPtr]['type'] !== 'T_ANON_CLASS' - && $tokens[$stackPtr]['type'] !== 'T_INTERFACE' - ) { - return ''; - } - - $extends = PHPCSHelper::findExtendedClassName($phpcsFile, $stackPtr); - if (empty($extends) || \is_string($extends) === false) { - return ''; - } - - return $this->getFQName($phpcsFile, $stackPtr, $extends); - } - - - /** - * Returns the class name for the static usage of a class. - * This can be a call to a method, the use of a property or constant. - * - * Returns an empty string if the class name could not be reliably inferred. - * - * @since 7.0.3 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of a T_NEW token. - * - * @return string - */ - public function getFQClassNameFromDoubleColonToken(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Check for the existence of the token. - if (isset($tokens[$stackPtr]) === false) { - return ''; - } - - if ($tokens[$stackPtr]['code'] !== \T_DOUBLE_COLON) { - return ''; - } - - // Nothing to do if previous token is a variable as we don't know where it was defined. - if ($tokens[$stackPtr - 1]['code'] === \T_VARIABLE) { - return ''; - } - - // Nothing to do if 'parent' or 'static' as we don't know how far the class tree extends. - if (\in_array($tokens[$stackPtr - 1]['code'], array(\T_PARENT, \T_STATIC), true)) { - return ''; - } - - // Get the classname from the class declaration if self is used. - if ($tokens[$stackPtr - 1]['code'] === \T_SELF) { - $classDeclarationPtr = $phpcsFile->findPrevious(\T_CLASS, $stackPtr - 1); - if ($classDeclarationPtr === false) { - return ''; - } - $className = $phpcsFile->getDeclarationName($classDeclarationPtr); - return $this->getFQName($phpcsFile, $classDeclarationPtr, $className); - } - - $find = array( - \T_NS_SEPARATOR, - \T_STRING, - \T_NAMESPACE, - \T_WHITESPACE, - ); - - $start = $phpcsFile->findPrevious($find, $stackPtr - 1, null, true, null, true); - if ($start === false || isset($tokens[($start + 1)]) === false) { - return ''; - } - - $start = ($start + 1); - $className = $phpcsFile->getTokensAsString($start, ($stackPtr - $start)); - $className = trim($className); - - return $this->getFQName($phpcsFile, $stackPtr, $className); - } - - - /** - * Get the Fully Qualified name for a class/function/constant etc. - * - * Checks if a class/function/constant name is already fully qualified and - * if not, enrich it with the relevant namespace information. - * - * @since 7.0.3 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the token. - * @param string $name The class / function / constant name. - * - * @return string - */ - public function getFQName(File $phpcsFile, $stackPtr, $name) - { - if (strpos($name, '\\') === 0) { - // Already fully qualified. - return $name; - } - - // Remove the namespace keyword if used. - if (strpos($name, 'namespace\\') === 0) { - $name = substr($name, 10); - } - - $namespace = $this->determineNamespace($phpcsFile, $stackPtr); - - if ($namespace === '') { - return '\\' . $name; - } else { - return '\\' . $namespace . '\\' . $name; - } - } - - - /** - * Is the class/function/constant name namespaced or global ? - * - * @since 7.0.3 - * - * @param string $FQName Fully Qualified name of a class, function etc. - * I.e. should always start with a `\`. - * - * @return bool True if namespaced, false if global. - * - * @throws \PHP_CodeSniffer_Exception If the name in the passed parameter - * is not fully qualified. - */ - public function isNamespaced($FQName) - { - if (strpos($FQName, '\\') !== 0) { - throw new PHPCS_Exception('$FQName must be a fully qualified name'); - } - - return (strpos(substr($FQName, 1), '\\') !== false); - } - - - /** - * Determine the namespace name an arbitrary token lives in. - * - * @since 7.0.3 - * - * @param \PHP_CodeSniffer_File $phpcsFile Instance of phpcsFile. - * @param int $stackPtr The token position for which to determine the namespace. - * - * @return string Namespace name or empty string if it couldn't be determined or no namespace applies. - */ - public function determineNamespace(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Check for the existence of the token. - if (isset($tokens[$stackPtr]) === false) { - return ''; - } - - // Check for scoped namespace {}. - if (empty($tokens[$stackPtr]['conditions']) === false) { - $namespacePtr = $phpcsFile->getCondition($stackPtr, \T_NAMESPACE); - if ($namespacePtr !== false) { - $namespace = $this->getDeclaredNamespaceName($phpcsFile, $namespacePtr); - if ($namespace !== false) { - return $namespace; - } - - // We are in a scoped namespace, but couldn't determine the name. Searching for a global namespace is futile. - return ''; - } - } - - /* - * Not in a scoped namespace, so let's see if we can find a non-scoped namespace instead. - * Keeping in mind that: - * - there can be multiple non-scoped namespaces in a file (bad practice, but it happens). - * - the namespace keyword can also be used as part of a function/method call and such. - * - that a non-named namespace resolves to the global namespace. - */ - $previousNSToken = $stackPtr; - $namespace = false; - do { - $previousNSToken = $phpcsFile->findPrevious(\T_NAMESPACE, ($previousNSToken - 1)); - - // Stop if we encounter a scoped namespace declaration as we already know we're not in one. - if (empty($tokens[$previousNSToken]['scope_condition']) === false && $tokens[$previousNSToken]['scope_condition'] === $previousNSToken) { - break; - } - - $namespace = $this->getDeclaredNamespaceName($phpcsFile, $previousNSToken); - - } while ($namespace === false && $previousNSToken !== false); - - // If we still haven't got a namespace, return an empty string. - if ($namespace === false) { - return ''; - } else { - return $namespace; - } - } - - /** - * Get the complete namespace name for a namespace declaration. - * - * For hierarchical namespaces, the name will be composed of several tokens, - * i.e. MyProject\Sub\Level which will be returned together as one string. - * - * @since 7.0.3 - * - * @param \PHP_CodeSniffer_File $phpcsFile Instance of phpcsFile. - * @param int|bool $stackPtr The position of a T_NAMESPACE token. - * - * @return string|false Namespace name or false if not a namespace declaration. - * Namespace name can be an empty string for global namespace declaration. - */ - public function getDeclaredNamespaceName(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Check for the existence of the token. - if ($stackPtr === false || isset($tokens[$stackPtr]) === false) { - return false; - } - - if ($tokens[$stackPtr]['code'] !== \T_NAMESPACE) { - return false; - } - - if ($tokens[($stackPtr + 1)]['code'] === \T_NS_SEPARATOR) { - // Not a namespace declaration, but use of, i.e. `namespace\someFunction();`. - return false; - } - - $nextToken = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true, null, true); - if ($tokens[$nextToken]['code'] === \T_OPEN_CURLY_BRACKET) { - /* - * Declaration for global namespace when using multiple namespaces in a file. - * I.e.: `namespace {}`. - */ - return ''; - } - - // Ok, this should be a namespace declaration, so get all the parts together. - $validTokens = array( - \T_STRING => true, - \T_NS_SEPARATOR => true, - \T_WHITESPACE => true, - ); - - $namespaceName = ''; - while (isset($validTokens[$tokens[$nextToken]['code']]) === true) { - $namespaceName .= trim($tokens[$nextToken]['content']); - $nextToken++; - } - - return $namespaceName; - } - - - /** - * Get the stack pointer for a return type token for a given function. - * - * Compatible layer for older PHPCS versions which don't recognize - * return type hints correctly. - * - * Expects to be passed T_RETURN_TYPE, T_FUNCTION or T_CLOSURE token. - * - * @since 7.1.2 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the token. - * - * @return int|false Stack pointer to the return type token or false if - * no return type was found or the passed token was - * not of the correct type. - */ - public function getReturnTypeHintToken(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (\defined('T_RETURN_TYPE') && $tokens[$stackPtr]['code'] === \T_RETURN_TYPE) { - return $stackPtr; - } - - if ($tokens[$stackPtr]['code'] !== \T_FUNCTION && $tokens[$stackPtr]['code'] !== \T_CLOSURE) { - return false; - } - - if (isset($tokens[$stackPtr]['parenthesis_closer']) === false) { - return false; - } - - // Allow for interface and abstract method declarations. - $endOfFunctionDeclaration = null; - if (isset($tokens[$stackPtr]['scope_opener'])) { - $endOfFunctionDeclaration = $tokens[$stackPtr]['scope_opener']; - } else { - $nextSemiColon = $phpcsFile->findNext(\T_SEMICOLON, ($tokens[$stackPtr]['parenthesis_closer'] + 1), null, false, null, true); - if ($nextSemiColon !== false) { - $endOfFunctionDeclaration = $nextSemiColon; - } - } - - if (isset($endOfFunctionDeclaration) === false) { - return false; - } - - $hasColon = $phpcsFile->findNext( - array(\T_COLON, \T_INLINE_ELSE), - ($tokens[$stackPtr]['parenthesis_closer'] + 1), - $endOfFunctionDeclaration - ); - if ($hasColon === false) { - return false; - } - - /* - * - `self`, `parent` and `callable` are not being recognized as return types in PHPCS < 2.6.0. - * - Return types are not recognized at all in PHPCS < 2.4.0. - * - The T_RETURN_TYPE token is defined, but no longer in use since PHPCS 3.3.0+. - * The token will now be tokenized as T_STRING. - * - An `array` (return) type declaration was tokenized as `T_ARRAY_HINT` in PHPCS 2.3.3 - 3.2.3 - * to prevent confusing sniffs looking for array declarations. - * As of PHPCS 3.3.0 `array` as a type declaration will be tokenized as `T_STRING`. - */ - $unrecognizedTypes = array( - \T_CALLABLE, - \T_SELF, - \T_PARENT, - \T_ARRAY, // PHPCS < 2.4.0. - \T_STRING, - ); - - return $phpcsFile->findPrevious($unrecognizedTypes, ($endOfFunctionDeclaration - 1), $hasColon); - } - - - /** - * Get the complete return type declaration for a given function. - * - * Cross-version compatible way to retrieve the complete return type declaration. - * - * For a classname-based return type, PHPCS, as well as the Sniff::getReturnTypeHintToken() - * method will mark the classname as the return type token. - * This method will find preceeding namespaces and namespace separators and will return a - * string containing the qualified return type declaration. - * - * Expects to be passed a T_RETURN_TYPE token or the return value from a call to - * the Sniff::getReturnTypeHintToken() method. - * - * @since 8.2.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the return type token. - * - * @return string The name of the return type token. - */ - public function getReturnTypeHintName(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // In older PHPCS versions, the nullable indicator will turn a return type colon into a T_INLINE_ELSE. - $colon = $phpcsFile->findPrevious(array(\T_COLON, \T_INLINE_ELSE, \T_FUNCTION, \T_CLOSE_PARENTHESIS), ($stackPtr - 1)); - if ($colon === false - || ($tokens[$colon]['code'] !== \T_COLON && $tokens[$colon]['code'] !== \T_INLINE_ELSE) - ) { - // Shouldn't happen, just in case. - return ''; - } - - $returnTypeHint = ''; - for ($i = ($colon + 1); $i <= $stackPtr; $i++) { - // As of PHPCS 3.3.0+, all tokens are tokenized as "normal", so T_CALLABLE, T_SELF etc are - // all possible, just exclude anything that's regarded as empty and the nullable indicator. - if (isset(Tokens::$emptyTokens[$tokens[$i]['code']])) { - continue; - } - - if ($tokens[$i]['type'] === 'T_NULLABLE') { - continue; - } - - if (\defined('T_NULLABLE') === false && $tokens[$i]['code'] === \T_INLINE_THEN) { - // Old PHPCS. - continue; - } - - $returnTypeHint .= $tokens[$i]['content']; - } - - return $returnTypeHint; - } - - - /** - * Check whether a T_VARIABLE token is a class property declaration. - * - * Compatibility layer for PHPCS cross-version compatibility - * as PHPCS 2.4.0 - 2.7.1 does not have good enough support for - * anonymous classes. Along the same lines, the`getMemberProperties()` - * method does not support the `var` prefix. - * - * @since 7.1.4 - * - * @param \PHP_CodeSniffer_File $phpcsFile Instance of phpcsFile. - * @param int $stackPtr The position in the stack of the - * T_VARIABLE token to verify. - * - * @return bool - */ - public function isClassProperty(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]) === false || $tokens[$stackPtr]['code'] !== \T_VARIABLE) { - return false; - } - - // Note: interfaces can not declare properties. - $validScopes = array( - 'T_CLASS' => true, - 'T_ANON_CLASS' => true, - 'T_TRAIT' => true, - ); - - $scopePtr = $this->validDirectScope($phpcsFile, $stackPtr, $validScopes); - if ($scopePtr !== false) { - // Make sure it's not a method parameter. - if (empty($tokens[$stackPtr]['nested_parenthesis']) === true) { - return true; - } else { - $parenthesis = array_keys($tokens[$stackPtr]['nested_parenthesis']); - $deepestOpen = array_pop($parenthesis); - if ($deepestOpen < $scopePtr - || isset($tokens[$deepestOpen]['parenthesis_owner']) === false - || $tokens[$tokens[$deepestOpen]['parenthesis_owner']]['code'] !== \T_FUNCTION - ) { - return true; - } - } - } - - return false; - } - - - /** - * Check whether a T_CONST token is a class constant declaration. - * - * @since 7.1.4 - * - * @param \PHP_CodeSniffer_File $phpcsFile Instance of phpcsFile. - * @param int $stackPtr The position in the stack of the - * T_CONST token to verify. - * - * @return bool - */ - public function isClassConstant(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]) === false || $tokens[$stackPtr]['code'] !== \T_CONST) { - return false; - } - - // Note: traits can not declare constants. - $validScopes = array( - 'T_CLASS' => true, - 'T_ANON_CLASS' => true, - 'T_INTERFACE' => true, - ); - if ($this->validDirectScope($phpcsFile, $stackPtr, $validScopes) !== false) { - return true; - } - - return false; - } - - - /** - * Check whether the direct wrapping scope of a token is within a limited set of - * acceptable tokens. - * - * Used to check, for instance, if a T_CONST is a class constant. - * - * @since 7.1.4 - * - * @param \PHP_CodeSniffer_File $phpcsFile Instance of phpcsFile. - * @param int $stackPtr The position in the stack of the - * token to verify. - * @param array $validScopes Array of token types. - * Keys should be the token types in string - * format to allow for newer token types. - * Value is irrelevant. - * - * @return int|bool StackPtr to the scope if valid, false otherwise. - */ - protected function validDirectScope(File $phpcsFile, $stackPtr, $validScopes) - { - $tokens = $phpcsFile->getTokens(); - - if (empty($tokens[$stackPtr]['conditions']) === true) { - return false; - } - - /* - * Check only the direct wrapping scope of the token. - */ - $conditions = array_keys($tokens[$stackPtr]['conditions']); - $ptr = array_pop($conditions); - - if (isset($tokens[$ptr]) === false) { - return false; - } - - if (isset($validScopes[$tokens[$ptr]['type']]) === true) { - return $ptr; - } - - return false; - } - - - /** - * Get an array of just the type hints from a function declaration. - * - * Expects to be passed T_FUNCTION or T_CLOSURE token. - * - * Strips potential nullable indicator and potential global namespace - * indicator from the type hints before returning them. - * - * @since 7.1.4 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the token. - * - * @return array Array with type hints or an empty array if - * - the function does not have any parameters - * - no type hints were found - * - or the passed token was not of the correct type. - */ - public function getTypeHintsFromFunctionDeclaration(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['code'] !== \T_FUNCTION && $tokens[$stackPtr]['code'] !== \T_CLOSURE) { - return array(); - } - - $parameters = PHPCSHelper::getMethodParameters($phpcsFile, $stackPtr); - if (empty($parameters) || \is_array($parameters) === false) { - return array(); - } - - $typeHints = array(); - - foreach ($parameters as $param) { - if ($param['type_hint'] === '') { - continue; - } - - // Strip off potential nullable indication. - $typeHint = ltrim($param['type_hint'], '?'); - - // Strip off potential (global) namespace indication. - $typeHint = ltrim($typeHint, '\\'); - - if ($typeHint !== '') { - $typeHints[] = $typeHint; - } - } - - return $typeHints; - } - - - /** - * Get the hash algorithm name from the parameter in a hash function call. - * - * @since 7.0.7 Logic was originally contained in the `RemovedHashAlgorithms` sniff. - * - * @param \PHP_CodeSniffer_File $phpcsFile Instance of phpcsFile. - * @param int $stackPtr The position of the T_STRING function token. - * - * @return string|false The algorithm name without quotes if this was a relevant hash - * function call or false if it was not. - */ - public function getHashAlgorithmParameter(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Check for the existence of the token. - if (isset($tokens[$stackPtr]) === false) { - return false; - } - - if ($tokens[$stackPtr]['code'] !== \T_STRING) { - return false; - } - - $functionName = $tokens[$stackPtr]['content']; - $functionNameLc = strtolower($functionName); - - // Bow out if not one of the functions we're targetting. - if (isset($this->hashAlgoFunctions[$functionNameLc]) === false) { - return false; - } - - // Get the parameter from the function call which should contain the algorithm name. - $algoParam = $this->getFunctionCallParameter($phpcsFile, $stackPtr, $this->hashAlgoFunctions[$functionNameLc]); - if ($algoParam === false) { - return false; - } - - // Algorithm is a text string, so we need to remove the quotes. - $algo = strtolower(trim($algoParam['raw'])); - $algo = $this->stripQuotes($algo); - - return $algo; - } - - - /** - * Determine whether an arbitrary T_STRING token is the use of a global constant. - * - * @since 8.1.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the T_STRING token. - * - * @return bool - */ - public function isUseOfGlobalConstant(File $phpcsFile, $stackPtr) - { - static $isLowPHPCS, $isLowPHP; - - $tokens = $phpcsFile->getTokens(); - - // Check for the existence of the token. - if (isset($tokens[$stackPtr]) === false) { - return false; - } - - // Is this one of the tokens this function handles ? - if ($tokens[$stackPtr]['code'] !== \T_STRING) { - return false; - } - - // Check for older PHP, PHPCS version so we can compensate for misidentified tokens. - if (isset($isLowPHPCS, $isLowPHP) === false) { - $isLowPHP = false; - $isLowPHPCS = false; - if (version_compare(\PHP_VERSION_ID, '50400', '<')) { - $isLowPHP = true; - $isLowPHPCS = version_compare(PHPCSHelper::getVersion(), '2.4.0', '<'); - } - } - - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($next !== false - && ($tokens[$next]['code'] === \T_OPEN_PARENTHESIS - || $tokens[$next]['code'] === \T_DOUBLE_COLON) - ) { - // Function call or declaration. - return false; - } - - // Array of tokens which if found preceding the $stackPtr indicate that a T_STRING is not a global constant. - $tokensToIgnore = array( - 'T_NAMESPACE' => true, - 'T_USE' => true, - 'T_CLASS' => true, - 'T_TRAIT' => true, - 'T_INTERFACE' => true, - 'T_EXTENDS' => true, - 'T_IMPLEMENTS' => true, - 'T_NEW' => true, - 'T_FUNCTION' => true, - 'T_DOUBLE_COLON' => true, - 'T_OBJECT_OPERATOR' => true, - 'T_INSTANCEOF' => true, - 'T_INSTEADOF' => true, - 'T_GOTO' => true, - 'T_AS' => true, - 'T_PUBLIC' => true, - 'T_PROTECTED' => true, - 'T_PRIVATE' => true, - ); - - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($prev !== false - && (isset($tokensToIgnore[$tokens[$prev]['type']]) === true - || ($tokens[$prev]['code'] === \T_STRING - && (($isLowPHPCS === true - && $tokens[$prev]['content'] === 'trait') - || ($isLowPHP === true - && $tokens[$prev]['content'] === 'insteadof')))) - ) { - // Not the use of a constant. - return false; - } - - if ($prev !== false - && $tokens[$prev]['code'] === \T_NS_SEPARATOR - && $tokens[($prev - 1)]['code'] === \T_STRING - ) { - // Namespaced constant of the same name. - return false; - } - - if ($prev !== false - && $tokens[$prev]['code'] === \T_CONST - && $this->isClassConstant($phpcsFile, $prev) === true - ) { - // Class constant declaration of the same name. - return false; - } - - /* - * Deal with a number of variations of use statements. - */ - for ($i = $stackPtr; $i > 0; $i--) { - if ($tokens[$i]['line'] !== $tokens[$stackPtr]['line']) { - break; - } - } - - $firstOnLine = $phpcsFile->findNext(Tokens::$emptyTokens, ($i + 1), null, true); - if ($firstOnLine !== false && $tokens[$firstOnLine]['code'] === \T_USE) { - $nextOnLine = $phpcsFile->findNext(Tokens::$emptyTokens, ($firstOnLine + 1), null, true); - if ($nextOnLine !== false) { - if (($tokens[$nextOnLine]['code'] === \T_STRING && $tokens[$nextOnLine]['content'] === 'const') - || $tokens[$nextOnLine]['code'] === \T_CONST // Happens in some PHPCS versions. - ) { - $hasNsSep = $phpcsFile->findNext(\T_NS_SEPARATOR, ($nextOnLine + 1), $stackPtr); - if ($hasNsSep !== false) { - // Namespaced const (group) use statement. - return false; - } - } else { - // Not a const use statement. - return false; - } - } - } - - return true; - } - - - /** - * Determine whether the tokens between $start and $end together form a positive number - * as recognized by PHP. - * - * The outcome of this function is reliable for `true`, `false` should be regarded as - * "undetermined". - * - * Note: Zero is *not* regarded as a positive number. - * - * @since 8.2.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $start Start of the snippet (inclusive), i.e. this - * token will be examined as part of the snippet. - * @param int $end End of the snippet (inclusive), i.e. this - * token will be examined as part of the snippet. - * @param bool $allowFloats Whether to only consider integers, or also floats. - * - * @return bool True if PHP would evaluate the snippet as a positive number. - * False if not or if it could not be reliably determined - * (variable or calculations and such). - */ - public function isPositiveNumber(File $phpcsFile, $start, $end, $allowFloats = false) - { - $number = $this->isNumber($phpcsFile, $start, $end, $allowFloats); - - if ($number === false) { - return false; - } - - return ($number > 0); - } - - - /** - * Determine whether the tokens between $start and $end together form a negative number - * as recognized by PHP. - * - * The outcome of this function is reliable for `true`, `false` should be regarded as - * "undetermined". - * - * Note: Zero is *not* regarded as a negative number. - * - * @since 8.2.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $start Start of the snippet (inclusive), i.e. this - * token will be examined as part of the snippet. - * @param int $end End of the snippet (inclusive), i.e. this - * token will be examined as part of the snippet. - * @param bool $allowFloats Whether to only consider integers, or also floats. - * - * @return bool True if PHP would evaluate the snippet as a negative number. - * False if not or if it could not be reliably determined - * (variable or calculations and such). - */ - public function isNegativeNumber(File $phpcsFile, $start, $end, $allowFloats = false) - { - $number = $this->isNumber($phpcsFile, $start, $end, $allowFloats); - - if ($number === false) { - return false; - } - - return ($number < 0); - } - - /** - * Determine whether the tokens between $start and $end together form a number - * as recognized by PHP. - * - * The outcome of this function is reliable for "true-ish" values, `false` should - * be regarded as "undetermined". - * - * @link https://3v4l.org/npTeM - * - * Mainly intended for examining variable assignments, function call parameters, array values - * where the start and end of the snippet to examine is very clear. - * - * @since 8.2.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $start Start of the snippet (inclusive), i.e. this - * token will be examined as part of the snippet. - * @param int $end End of the snippet (inclusive), i.e. this - * token will be examined as part of the snippet. - * @param bool $allowFloats Whether to only consider integers, or also floats. - * - * @return int|float|bool The number found if PHP would evaluate the snippet as a number. - * The return type will be int if $allowFloats is false, if - * $allowFloats is true, the return type will be float. - * False will be returned when the snippet does not evaluate to a - * number or if it could not be reliably determined - * (variable or calculations and such). - */ - protected function isNumber(File $phpcsFile, $start, $end, $allowFloats = false) - { - $stringTokens = Tokens::$heredocTokens + Tokens::$stringTokens; - - $validTokens = array(); - $validTokens[\T_LNUMBER] = true; - $validTokens[\T_TRUE] = true; // Evaluates to int 1. - $validTokens[\T_FALSE] = true; // Evaluates to int 0. - $validTokens[\T_NULL] = true; // Evaluates to int 0. - - if ($allowFloats === true) { - $validTokens[\T_DNUMBER] = true; - } - - $maybeValidTokens = $stringTokens + $validTokens; - - $tokens = $phpcsFile->getTokens(); - $searchEnd = ($end + 1); - $negativeNumber = false; - - if (isset($tokens[$start], $tokens[$searchEnd]) === false) { - return false; - } - - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, $start, $searchEnd, true); - while ($nextNonEmpty !== false - && ($tokens[$nextNonEmpty]['code'] === \T_PLUS - || $tokens[$nextNonEmpty]['code'] === \T_MINUS) - ) { - - if ($tokens[$nextNonEmpty]['code'] === \T_MINUS) { - $negativeNumber = ($negativeNumber === false) ? true : false; - } - - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($nextNonEmpty + 1), $searchEnd, true); - } - - if ($nextNonEmpty === false || isset($maybeValidTokens[$tokens[$nextNonEmpty]['code']]) === false) { - return false; - } - - $content = false; - if ($tokens[$nextNonEmpty]['code'] === \T_LNUMBER - || $tokens[$nextNonEmpty]['code'] === \T_DNUMBER - ) { - $content = (float) $tokens[$nextNonEmpty]['content']; - } elseif ($tokens[$nextNonEmpty]['code'] === \T_TRUE) { - $content = 1.0; - } elseif ($tokens[$nextNonEmpty]['code'] === \T_FALSE - || $tokens[$nextNonEmpty]['code'] === \T_NULL - ) { - $content = 0.0; - } elseif (isset($stringTokens[$tokens[$nextNonEmpty]['code']]) === true) { - - if ($tokens[$nextNonEmpty]['code'] === \T_START_HEREDOC - || $tokens[$nextNonEmpty]['code'] === \T_START_NOWDOC - ) { - // Skip past heredoc/nowdoc opener to the first content. - $firstDocToken = $phpcsFile->findNext(array(\T_HEREDOC, \T_NOWDOC), ($nextNonEmpty + 1), $searchEnd); - if ($firstDocToken === false) { - // Live coding or parse error. - return false; - } - - $stringContent = $content = $tokens[$firstDocToken]['content']; - - // Skip forward to the end in preparation for the next part of the examination. - $nextNonEmpty = $phpcsFile->findNext(array(\T_END_HEREDOC, \T_END_NOWDOC), ($nextNonEmpty + 1), $searchEnd); - if ($nextNonEmpty === false) { - // Live coding or parse error. - return false; - } - } else { - // Gather subsequent lines for a multi-line string. - for ($i = $nextNonEmpty; $i < $searchEnd; $i++) { - if ($tokens[$i]['code'] !== $tokens[$nextNonEmpty]['code']) { - break; - } - $content .= $tokens[$i]['content']; - } - - $nextNonEmpty = --$i; - $content = $this->stripQuotes($content); - $stringContent = $content; - } - - /* - * Regexes based on the formats outlined in the manual, created by JRF. - * @link https://www.php.net/manual/en/language.types.float.php - */ - $regexInt = '`^\s*[0-9]+`'; - $regexFloat = '`^\s*(?:[+-]?(?:(?:(?P<LNUM>[0-9]+)|(?P<DNUM>([0-9]*\.(?P>LNUM)|(?P>LNUM)\.[0-9]*)))[eE][+-]?(?P>LNUM))|(?P>DNUM))`'; - - $intString = preg_match($regexInt, $content, $intMatch); - $floatString = preg_match($regexFloat, $content, $floatMatch); - - // Does the text string start with a number ? If so, PHP would juggle it and use it as a number. - if ($allowFloats === false) { - if ($intString !== 1 || $floatString === 1) { - if ($floatString === 1) { - // Found float. Only integers targetted. - return false; - } - - $content = 0.0; - } else { - $content = (float) trim($intMatch[0]); - } - } else { - if ($intString !== 1 && $floatString !== 1) { - $content = 0.0; - } else { - $content = ($floatString === 1) ? (float) trim($floatMatch[0]) : (float) trim($intMatch[0]); - } - } - - // Allow for different behaviour for hex numeric strings between PHP 5 vs PHP 7. - if ($intString === 1 && trim($intMatch[0]) === '0' - && preg_match('`^\s*(0x[A-Fa-f0-9]+)`', $stringContent, $hexNumberString) === 1 - && $this->supportsBelow('5.6') === true - ) { - // The filter extension still allows for hex numeric strings in PHP 7, so - // use that to get the numeric value if possible. - // If the filter extension is not available, the value will be zero, but so be it. - if (function_exists('filter_var')) { - $filtered = filter_var($hexNumberString[1], \FILTER_VALIDATE_INT, \FILTER_FLAG_ALLOW_HEX); - if ($filtered !== false) { - $content = $filtered; - } - } - } - } - - // OK, so we have a number, now is there still more code after it ? - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($nextNonEmpty + 1), $searchEnd, true); - if ($nextNonEmpty !== false) { - return false; - } - - if ($negativeNumber === true) { - $content = -$content; - } - - if ($allowFloats === false) { - return (int) $content; - } - - return $content; - } - - - /** - * Determine whether the tokens between $start and $end together form a numberic calculation - * as recognized by PHP. - * - * The outcome of this function is reliable for `true`, `false` should be regarded as "undetermined". - * - * Mainly intended for examining variable assignments, function call parameters, array values - * where the start and end of the snippet to examine is very clear. - * - * @since 9.0.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $start Start of the snippet (inclusive), i.e. this - * token will be examined as part of the snippet. - * @param int $end End of the snippet (inclusive), i.e. this - * token will be examined as part of the snippet. - * - * @return bool - */ - protected function isNumericCalculation(File $phpcsFile, $start, $end) - { - $arithmeticTokens = Tokens::$arithmeticTokens; - - // phpcs:disable PHPCompatibility.Constants.NewConstants.t_powFound - if (\defined('T_POW') && isset($arithmeticTokens[\T_POW]) === false) { - // T_POW was not added to the arithmetic array until PHPCS 2.9.0. - $arithmeticTokens[\T_POW] = \T_POW; - } - // phpcs:enable - - $skipTokens = Tokens::$emptyTokens; - $skipTokens[] = \T_MINUS; - $skipTokens[] = \T_PLUS; - - // Find the first arithmetic operator, but skip past +/- signs before numbers. - $nextNonEmpty = ($start - 1); - do { - $nextNonEmpty = $phpcsFile->findNext($skipTokens, ($nextNonEmpty + 1), ($end + 1), true); - $arithmeticOperator = $phpcsFile->findNext($arithmeticTokens, ($nextNonEmpty + 1), ($end + 1)); - } while ($nextNonEmpty !== false && $arithmeticOperator !== false && $nextNonEmpty === $arithmeticOperator); - - if ($arithmeticOperator === false) { - return false; - } - - $tokens = $phpcsFile->getTokens(); - $subsetStart = $start; - $subsetEnd = ($arithmeticOperator - 1); - - while ($this->isNumber($phpcsFile, $subsetStart, $subsetEnd, true) !== false - && isset($tokens[($arithmeticOperator + 1)]) === true - ) { - // Recognize T_POW for PHPCS < 2.4.0 on low PHP versions. - if (\defined('T_POW') === false - && $tokens[$arithmeticOperator]['code'] === \T_MULTIPLY - && $tokens[($arithmeticOperator + 1)]['code'] === \T_MULTIPLY - && isset($tokens[$arithmeticOperator + 2]) === true - ) { - // Move operator one forward to the second * in T_POW. - ++$arithmeticOperator; - } - - $subsetStart = ($arithmeticOperator + 1); - $nextNonEmpty = $arithmeticOperator; - do { - $nextNonEmpty = $phpcsFile->findNext($skipTokens, ($nextNonEmpty + 1), ($end + 1), true); - $arithmeticOperator = $phpcsFile->findNext($arithmeticTokens, ($nextNonEmpty + 1), ($end + 1)); - } while ($nextNonEmpty !== false && $arithmeticOperator !== false && $nextNonEmpty === $arithmeticOperator); - - if ($arithmeticOperator === false) { - // Last calculation operator already reached. - if ($this->isNumber($phpcsFile, $subsetStart, $end, true) !== false) { - return true; - } - - return false; - } - - $subsetEnd = ($arithmeticOperator - 1); - } - - return false; - } - - - - /** - * Determine whether a ternary is a short ternary, i.e. without "middle". - * - * N.B.: This is a back-fill for a new method which is expected to go into - * PHP_CodeSniffer 3.5.0. - * Once that method has been merged into PHPCS, this one should be moved - * to the PHPCSHelper.php file. - * - * @since 9.2.0 - * - * @codeCoverageIgnore Method as pulled upstream is accompanied by unit tests. - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the ternary operator - * in the stack. - * - * @return bool True if short ternary, or false otherwise. - */ - public function isShortTernary(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - if (isset($tokens[$stackPtr]) === false - || $tokens[$stackPtr]['code'] !== \T_INLINE_THEN - ) { - return false; - } - - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($nextNonEmpty === false) { - // Live coding or parse error. - return false; - } - - if ($tokens[$nextNonEmpty]['code'] === \T_INLINE_ELSE) { - return true; - } - - return false; - } - - - /** - * Determine whether a T_OPEN/CLOSE_SHORT_ARRAY token is a list() construct. - * - * Note: A variety of PHPCS versions have bugs in the tokenizing of short arrays. - * In that case, the tokens are identified as T_OPEN/CLOSE_SQUARE_BRACKET. - * - * @since 8.2.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the function call token. - * - * @return bool - */ - public function isShortList(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Check for the existence of the token. - if (isset($tokens[$stackPtr]) === false) { - return false; - } - - // Is this one of the tokens this function handles ? - if ($tokens[$stackPtr]['code'] !== \T_OPEN_SHORT_ARRAY - && $tokens[$stackPtr]['code'] !== \T_CLOSE_SHORT_ARRAY - ) { - return false; - } - - switch ($tokens[$stackPtr]['code']) { - case \T_OPEN_SHORT_ARRAY: - if (isset($tokens[$stackPtr]['bracket_closer']) === true) { - $opener = $stackPtr; - $closer = $tokens[$stackPtr]['bracket_closer']; - } - break; - - case \T_CLOSE_SHORT_ARRAY: - if (isset($tokens[$stackPtr]['bracket_opener']) === true) { - $opener = $tokens[$stackPtr]['bracket_opener']; - $closer = $stackPtr; - } - break; - } - - if (isset($opener, $closer) === false) { - // Parse error, live coding or real square bracket. - return false; - } - - /* - * PHPCS cross-version compatibility: work around for square brackets misidentified - * as short array when preceded by a variable variable in older PHPCS versions. - */ - $prevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($opener - 1), null, true, null, true); - - if ($prevNonEmpty !== false - && $tokens[$prevNonEmpty]['code'] === \T_CLOSE_CURLY_BRACKET - && isset($tokens[$prevNonEmpty]['bracket_opener']) === true - ) { - $maybeVariableVariable = $phpcsFile->findPrevious( - Tokens::$emptyTokens, - ($tokens[$prevNonEmpty]['bracket_opener'] - 1), - null, - true, - null, - true - ); - - if ($tokens[$maybeVariableVariable]['code'] === \T_VARIABLE - || $tokens[$maybeVariableVariable]['code'] === \T_DOLLAR - ) { - return false; - } - } - - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($closer + 1), null, true, null, true); - - if ($nextNonEmpty !== false && $tokens[$nextNonEmpty]['code'] === \T_EQUAL) { - return true; - } - - if ($prevNonEmpty !== false - && $tokens[$prevNonEmpty]['code'] === \T_AS - && isset($tokens[$prevNonEmpty]['nested_parenthesis']) === true - ) { - $parentheses = array_reverse($tokens[$prevNonEmpty]['nested_parenthesis'], true); - foreach ($parentheses as $open => $close) { - if (isset($tokens[$open]['parenthesis_owner']) - && $tokens[$tokens[$open]['parenthesis_owner']]['code'] === \T_FOREACH - ) { - return true; - } - } - } - - // Maybe this is a short list syntax nested inside another short list syntax ? - $parentOpener = $opener; - do { - $parentOpener = $phpcsFile->findPrevious( - array(\T_OPEN_SHORT_ARRAY, \T_OPEN_SQUARE_BRACKET), - ($parentOpener - 1), - null, - false, - null, - true - ); - - if ($parentOpener === false) { - return false; - } - - } while (isset($tokens[$parentOpener]['bracket_closer']) === true - && $tokens[$parentOpener]['bracket_closer'] < $opener - ); - - if (isset($tokens[$parentOpener]['bracket_closer']) === true - && $tokens[$parentOpener]['bracket_closer'] > $closer - ) { - // Work around tokenizer issue in PHPCS 2.0 - 2.7. - $phpcsVersion = PHPCSHelper::getVersion(); - if ((version_compare($phpcsVersion, '2.0', '>') === true - && version_compare($phpcsVersion, '2.8', '<') === true) - && $tokens[$parentOpener]['code'] === \T_OPEN_SQUARE_BRACKET - ) { - $nextNonEmpty = $phpcsFile->findNext( - Tokens::$emptyTokens, - ($tokens[$parentOpener]['bracket_closer'] + 1), - null, - true, - null, - true - ); - - if ($nextNonEmpty !== false && $tokens[$nextNonEmpty]['code'] === \T_EQUAL) { - return true; - } - - return false; - } - - return $this->isShortList($phpcsFile, $parentOpener); - } - - return false; - } - - - /** - * Determine whether the tokens between $start and $end could together represent a variable. - * - * @since 9.0.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $start Starting point stack pointer. Inclusive. - * I.e. this token should be taken into account. - * @param int $end End point stack pointer. Exclusive. - * I.e. this token should not be taken into account. - * @param int $targetNestingLevel The nesting level the variable should be at. - * - * @return bool - */ - public function isVariable(File $phpcsFile, $start, $end, $targetNestingLevel) - { - static $tokenBlackList, $bracketTokens; - - // Create the token arrays only once. - if (isset($tokenBlackList, $bracketTokens) === false) { - - $tokenBlackList = array( - \T_OPEN_PARENTHESIS => \T_OPEN_PARENTHESIS, - \T_STRING_CONCAT => \T_STRING_CONCAT, - ); - $tokenBlackList += Tokens::$assignmentTokens; - $tokenBlackList += Tokens::$equalityTokens; - $tokenBlackList += Tokens::$comparisonTokens; - $tokenBlackList += Tokens::$operators; - $tokenBlackList += Tokens::$booleanOperators; - $tokenBlackList += Tokens::$castTokens; - - /* - * List of brackets which can be part of a variable variable. - * - * Key is the open bracket token, value the close bracket token. - */ - $bracketTokens = array( - \T_OPEN_CURLY_BRACKET => \T_CLOSE_CURLY_BRACKET, - \T_OPEN_SQUARE_BRACKET => \T_CLOSE_SQUARE_BRACKET, - ); - } - - $tokens = $phpcsFile->getTokens(); - - // If no variable at all was found, then it's definitely a no-no. - $hasVariable = $phpcsFile->findNext(\T_VARIABLE, $start, $end); - if ($hasVariable === false) { - return false; - } - - // Check if the variable found is at the right level. Deeper levels are always an error. - if (isset($tokens[$hasVariable]['nested_parenthesis']) - && \count($tokens[$hasVariable]['nested_parenthesis']) !== $targetNestingLevel - ) { - return false; - } - - // Ok, so the first variable is at the right level, now are there any - // blacklisted tokens within the empty() ? - $hasBadToken = $phpcsFile->findNext($tokenBlackList, $start, $end); - if ($hasBadToken === false) { - return true; - } - - // If there are also bracket tokens, the blacklisted token might be part of a variable - // variable, but if there are no bracket tokens, we know we have an error. - $hasBrackets = $phpcsFile->findNext($bracketTokens, $start, $end); - if ($hasBrackets === false) { - return false; - } - - // Ok, we have both a blacklisted token as well as brackets, so we need to walk - // the tokens of the variable variable. - for ($i = $start; $i < $end; $i++) { - // If this is a bracket token, skip to the end of the bracketed expression. - if (isset($bracketTokens[$tokens[$i]['code']], $tokens[$i]['bracket_closer'])) { - $i = $tokens[$i]['bracket_closer']; - continue; - } - - // If it's a blacklisted token, not within brackets, we have an error. - if (isset($tokenBlackList[$tokens[$i]['code']])) { - return false; - } - } - - return true; - } - - /** - * Determine whether a T_MINUS/T_PLUS token is a unary operator. - * - * N.B.: This is a back-fill for a new method which is expected to go into - * PHP_CodeSniffer 3.5.0. - * Once that method has been merged into PHPCS, this one should be moved - * to the PHPCSHelper.php file. - * - * @since 9.2.0 - * - * @codeCoverageIgnore Method as pulled upstream is accompanied by unit tests. - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the plus/minus token. - * - * @return bool True if the token passed is a unary operator. - * False otherwise or if the token is not a T_PLUS/T_MINUS token. - */ - public static function isUnaryPlusMinus(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]) === false - || ($tokens[$stackPtr]['code'] !== \T_PLUS - && $tokens[$stackPtr]['code'] !== \T_MINUS) - ) { - return false; - } - - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($next === false) { - // Live coding or parse error. - return false; - } - - if (isset(Tokens::$operators[$tokens[$next]['code']]) === true) { - // Next token is an operator, so this is not a unary. - return false; - } - - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - - if ($tokens[$prev]['code'] === \T_RETURN) { - // Just returning a positive/negative value; eg. (return -1). - return true; - } - - if (isset(Tokens::$operators[$tokens[$prev]['code']]) === true) { - // Just trying to operate on a positive/negative value; eg. ($var * -1). - return true; - } - - if (isset(Tokens::$comparisonTokens[$tokens[$prev]['code']]) === true) { - // Just trying to compare a positive/negative value; eg. ($var === -1). - return true; - } - - if (isset(Tokens::$booleanOperators[$tokens[$prev]['code']]) === true) { - // Just trying to compare a positive/negative value; eg. ($var || -1 === $b). - return true; - } - - if (isset(Tokens::$assignmentTokens[$tokens[$prev]['code']]) === true) { - // Just trying to assign a positive/negative value; eg. ($var = -1). - return true; - } - - if (isset(Tokens::$castTokens[$tokens[$prev]['code']]) === true) { - // Just casting a positive/negative value; eg. (string) -$var. - return true; - } - - // Other indicators that a plus/minus sign is a unary operator. - $invalidTokens = array( - \T_COMMA => true, - \T_OPEN_PARENTHESIS => true, - \T_OPEN_SQUARE_BRACKET => true, - \T_OPEN_SHORT_ARRAY => true, - \T_COLON => true, - \T_INLINE_THEN => true, - \T_INLINE_ELSE => true, - \T_CASE => true, - \T_OPEN_CURLY_BRACKET => true, - \T_STRING_CONCAT => true, - ); - - if (isset($invalidTokens[$tokens[$prev]['code']]) === true) { - // Just trying to use a positive/negative value; eg. myFunction($var, -2). - return true; - } - - return false; - } - - /** - * Get the complete contents of a multi-line text string. - * - * N.B.: This is a back-fill for a new method which is expected to go into - * PHP_CodeSniffer 3.5.0. - * Once that method has been merged into PHPCS, this one should be moved - * to the PHPCSHelper.php file. - * - * @since 9.3.0 - * - * @codeCoverageIgnore Method as pulled upstream is accompanied by unit tests. - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr Pointer to the first text string token - * of a multi-line text string or to a - * Nowdoc/Heredoc opener. - * @param bool $stripQuotes Optional. Whether to strip text delimiter - * quotes off the resulting text string. - * Defaults to true. - * - * @return string - * - * @throws \PHP_CodeSniffer_Exception If the specified position is not a - * valid text string token or if the - * token is not the first text string token. - */ - public function getCompleteTextString(File $phpcsFile, $stackPtr, $stripQuotes = true) - { - $tokens = $phpcsFile->getTokens(); - - // Must be the start of a text string token. - if ($tokens[$stackPtr]['code'] !== \T_START_HEREDOC - && $tokens[$stackPtr]['code'] !== \T_START_NOWDOC - && $tokens[$stackPtr]['code'] !== \T_CONSTANT_ENCAPSED_STRING - && $tokens[$stackPtr]['code'] !== \T_DOUBLE_QUOTED_STRING - ) { - throw new PHPCS_Exception('$stackPtr must be of type T_START_HEREDOC, T_START_NOWDOC, T_CONSTANT_ENCAPSED_STRING or T_DOUBLE_QUOTED_STRING'); - } - - if ($tokens[$stackPtr]['code'] === \T_CONSTANT_ENCAPSED_STRING - || $tokens[$stackPtr]['code'] === \T_DOUBLE_QUOTED_STRING - ) { - $prev = $phpcsFile->findPrevious(\T_WHITESPACE, ($stackPtr - 1), null, true); - if ($tokens[$stackPtr]['code'] === $tokens[$prev]['code']) { - throw new PHPCS_Exception('$stackPtr must be the start of the text string'); - } - } - - switch ($tokens[$stackPtr]['code']) { - case \T_START_HEREDOC: - $stripQuotes = false; - $targetType = \T_HEREDOC; - $current = ($stackPtr + 1); - break; - - case \T_START_NOWDOC: - $stripQuotes = false; - $targetType = \T_NOWDOC; - $current = ($stackPtr + 1); - break; - - default: - $targetType = $tokens[$stackPtr]['code']; - $current = $stackPtr; - break; - } - - $string = ''; - do { - $string .= $tokens[$current]['content']; - ++$current; - } while ($tokens[$current]['code'] === $targetType); - - if ($stripQuotes === true) { - return $this->stripQuotes($string); - } - - return $string; - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Classes/ForbiddenAbstractPrivateMethodsSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Classes/ForbiddenAbstractPrivateMethodsSniff.php deleted file mode 100644 index d0d74df..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Classes/ForbiddenAbstractPrivateMethodsSniff.php +++ /dev/null @@ -1,90 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Classes; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; - -/** - * Abstract private methods are not allowed since PHP 5.1. - * - * Abstract private methods were supported between PHP 5.0.0 and PHP 5.0.4, but - * were then disallowed on the grounds that the behaviours of `private` and `abstract` - * are mutually exclusive. - * - * PHP version 5.1 - * - * @link https://www.php.net/manual/en/migration51.oop.php#migration51.oop-methods - * - * @since 9.2.0 - */ -class ForbiddenAbstractPrivateMethodsSniff extends Sniff -{ - - /** - * Valid scopes to check for abstract private methods. - * - * @since 9.2.0 - * - * @var array - */ - public $ooScopeTokens = array( - 'T_CLASS' => true, - 'T_TRAIT' => true, - 'T_ANON_CLASS' => true, - ); - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 9.2.0 - * - * @return array - */ - public function register() - { - return array(\T_FUNCTION); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 9.2.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsAbove('5.1') === false) { - return; - } - - if ($this->validDirectScope($phpcsFile, $stackPtr, $this->ooScopeTokens) === false) { - // Function, not method. - return; - } - - $properties = $phpcsFile->getMethodProperties($stackPtr); - if ($properties['scope'] !== 'private' || $properties['is_abstract'] !== true) { - return; - } - - $phpcsFile->addError( - 'Abstract methods cannot be declared as private since PHP 5.1', - $stackPtr, - 'Found' - ); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Classes/NewAnonymousClassesSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Classes/NewAnonymousClassesSniff.php deleted file mode 100644 index 572b6fc..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Classes/NewAnonymousClassesSniff.php +++ /dev/null @@ -1,91 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Classes; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Anonymous classes are supported since PHP 7.0. - * - * PHP version 7.0 - * - * @link https://www.php.net/manual/en/language.oop5.anonymous.php - * @link https://wiki.php.net/rfc/anonymous_classes - * - * @since 7.0.0 - */ -class NewAnonymousClassesSniff extends Sniff -{ - - /** - * Tokens which in various PHP versions indicate the `class` keyword. - * - * The dedicated anonymous class token is added from the `register()` - * method if the token is available. - * - * @since 7.1.2 - * - * @var array - */ - private $indicators = array( - \T_CLASS => \T_CLASS, - ); - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 7.0.0 - * - * @return array - */ - public function register() - { - if (\defined('T_ANON_CLASS')) { - $this->indicators[\T_ANON_CLASS] = \T_ANON_CLASS; - } - - return array(\T_NEW); - } - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 7.0.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsBelow('5.6') === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, $stackPtr + 1, null, true, null, true); - if ($nextNonEmpty === false || isset($this->indicators[$tokens[$nextNonEmpty]['code']]) === false) { - return; - } - - // Still here ? In that case, it is an anonymous class. - $phpcsFile->addError( - 'Anonymous classes are not supported in PHP 5.6 or earlier', - $stackPtr, - 'Found' - ); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Classes/NewClassesSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Classes/NewClassesSniff.php deleted file mode 100644 index 19e5e43..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Classes/NewClassesSniff.php +++ /dev/null @@ -1,913 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Classes; - -use PHPCompatibility\AbstractNewFeatureSniff; -use PHP_CodeSniffer_File as File; - -/** - * Detect use of new PHP native classes. - * - * The sniff analyses the following constructs to find usage of new classes: - * - Class instantiation using the `new` keyword. - * - (Anonymous) Class declarations to detect new classes being extended by userland classes. - * - Static use of class properties, constants or functions using the double colon. - * - Function/closure declarations to detect new classes used as parameter type declarations. - * - Function/closure declarations to detect new classes used as return type declarations. - * - Try/catch statements to detect new exception classes being caught. - * - * PHP version All - * - * @since 5.5 - * @since 5.6 Now extends the base `Sniff` class. - * @since 7.1.0 Now extends the `AbstractNewFeatureSniff` class. - */ -class NewClassesSniff extends AbstractNewFeatureSniff -{ - - /** - * A list of new classes, not present in older versions. - * - * The array lists : version number with false (not present) or true (present). - * If's sufficient to list the first version where the class appears. - * - * @since 5.5 - * - * @var array(string => array(string => bool)) - */ - protected $newClasses = array( - 'ArrayObject' => array( - '4.4' => false, - '5.0' => true, - ), - 'ArrayIterator' => array( - '4.4' => false, - '5.0' => true, - ), - 'CachingIterator' => array( - '4.4' => false, - '5.0' => true, - ), - 'DirectoryIterator' => array( - '4.4' => false, - '5.0' => true, - ), - 'RecursiveDirectoryIterator' => array( - '4.4' => false, - '5.0' => true, - ), - 'RecursiveIteratorIterator' => array( - '4.4' => false, - '5.0' => true, - ), - 'php_user_filter' => array( - '4.4' => false, - '5.0' => true, - ), - 'tidy' => array( - '4.4' => false, - '5.0' => true, - ), - - 'SimpleXMLElement' => array( - '5.0.0' => false, - '5.0.1' => true, - ), - 'tidyNode' => array( - '5.0.0' => false, - '5.0.1' => true, - ), - - 'libXMLError' => array( - '5.0' => false, - '5.1' => true, - ), - 'PDO' => array( - '5.0' => false, - '5.1' => true, - ), - 'PDOStatement' => array( - '5.0' => false, - '5.1' => true, - ), - 'AppendIterator' => array( - '5.0' => false, - '5.1' => true, - ), - 'EmptyIterator' => array( - '5.0' => false, - '5.1' => true, - ), - 'FilterIterator' => array( - '5.0' => false, - '5.1' => true, - ), - 'InfiniteIterator' => array( - '5.0' => false, - '5.1' => true, - ), - 'IteratorIterator' => array( - '5.0' => false, - '5.1' => true, - ), - 'LimitIterator' => array( - '5.0' => false, - '5.1' => true, - ), - 'NoRewindIterator' => array( - '5.0' => false, - '5.1' => true, - ), - 'ParentIterator' => array( - '5.0' => false, - '5.1' => true, - ), - 'RecursiveArrayIterator' => array( - '5.0' => false, - '5.1' => true, - ), - 'RecursiveCachingIterator' => array( - '5.0' => false, - '5.1' => true, - ), - 'RecursiveFilterIterator' => array( - '5.0' => false, - '5.1' => true, - ), - 'SimpleXMLIterator' => array( - '5.0' => false, - '5.1' => true, - ), - 'SplFileObject' => array( - '5.0' => false, - '5.1' => true, - ), - 'XMLReader' => array( - '5.0' => false, - '5.1' => true, - ), - - 'SplFileInfo' => array( - '5.1.1' => false, - '5.1.2' => true, - ), - 'SplTempFileObject' => array( - '5.1.1' => false, - '5.1.2' => true, - ), - 'XMLWriter' => array( - '5.1.1' => false, - '5.1.2' => true, - ), - - 'DateTime' => array( - '5.1' => false, - '5.2' => true, - ), - 'DateTimeZone' => array( - '5.1' => false, - '5.2' => true, - ), - 'RegexIterator' => array( - '5.1' => false, - '5.2' => true, - ), - 'RecursiveRegexIterator' => array( - '5.1' => false, - '5.2' => true, - ), - 'ReflectionFunctionAbstract' => array( - '5.1' => false, - '5.2' => true, - ), - 'ZipArchive' => array( - '5.1' => false, - '5.2' => true, - ), - - 'Closure' => array( - '5.2' => false, - '5.3' => true, - ), - 'DateInterval' => array( - '5.2' => false, - '5.3' => true, - ), - 'DatePeriod' => array( - '5.2' => false, - '5.3' => true, - ), - 'finfo' => array( - '5.2' => false, - '5.3' => true, - ), - 'Collator' => array( - '5.2' => false, - '5.3' => true, - ), - 'NumberFormatter' => array( - '5.2' => false, - '5.3' => true, - ), - 'Locale' => array( - '5.2' => false, - '5.3' => true, - ), - 'Normalizer' => array( - '5.2' => false, - '5.3' => true, - ), - 'MessageFormatter' => array( - '5.2' => false, - '5.3' => true, - ), - 'IntlDateFormatter' => array( - '5.2' => false, - '5.3' => true, - ), - 'Phar' => array( - '5.2' => false, - '5.3' => true, - ), - 'PharData' => array( - '5.2' => false, - '5.3' => true, - ), - 'PharFileInfo' => array( - '5.2' => false, - '5.3' => true, - ), - 'FilesystemIterator' => array( - '5.2' => false, - '5.3' => true, - ), - 'GlobIterator' => array( - '5.2' => false, - '5.3' => true, - ), - 'MultipleIterator' => array( - '5.2' => false, - '5.3' => true, - ), - 'RecursiveTreeIterator' => array( - '5.2' => false, - '5.3' => true, - ), - 'SplDoublyLinkedList' => array( - '5.2' => false, - '5.3' => true, - ), - 'SplFixedArray' => array( - '5.2' => false, - '5.3' => true, - ), - 'SplHeap' => array( - '5.2' => false, - '5.3' => true, - ), - 'SplMaxHeap' => array( - '5.2' => false, - '5.3' => true, - ), - 'SplMinHeap' => array( - '5.2' => false, - '5.3' => true, - ), - 'SplObjectStorage' => array( - '5.2' => false, - '5.3' => true, - ), - 'SplPriorityQueue' => array( - '5.2' => false, - '5.3' => true, - ), - 'SplQueue' => array( - '5.2' => false, - '5.3' => true, - ), - 'SplStack' => array( - '5.2' => false, - '5.3' => true, - ), - - 'ResourceBundle' => array( - '5.3.1' => false, - '5.3.2' => true, - ), - - 'CallbackFilterIterator' => array( - '5.3' => false, - '5.4' => true, - ), - 'RecursiveCallbackFilterIterator' => array( - '5.3' => false, - '5.4' => true, - ), - 'ReflectionZendExtension' => array( - '5.3' => false, - '5.4' => true, - ), - 'SessionHandler' => array( - '5.3' => false, - '5.4' => true, - ), - 'SNMP' => array( - '5.3' => false, - '5.4' => true, - ), - 'Transliterator' => array( - '5.3' => false, - '5.4' => true, - ), - 'Spoofchecker' => array( - '5.3' => false, - '5.4' => true, - ), - - 'Generator' => array( - '5.4' => false, - '5.5' => true, - ), - 'CURLFile' => array( - '5.4' => false, - '5.5' => true, - ), - 'DateTimeImmutable' => array( - '5.4' => false, - '5.5' => true, - ), - 'IntlCalendar' => array( - '5.4' => false, - '5.5' => true, - ), - 'IntlGregorianCalendar' => array( - '5.4' => false, - '5.5' => true, - ), - 'IntlTimeZone' => array( - '5.4' => false, - '5.5' => true, - ), - 'IntlBreakIterator' => array( - '5.4' => false, - '5.5' => true, - ), - 'IntlRuleBasedBreakIterator' => array( - '5.4' => false, - '5.5' => true, - ), - 'IntlCodePointBreakIterator' => array( - '5.4' => false, - '5.5' => true, - ), - 'UConverter' => array( - '5.4' => false, - '5.5' => true, - ), - - 'GMP' => array( - '5.5' => false, - '5.6' => true, - ), - - 'IntlChar' => array( - '5.6' => false, - '7.0' => true, - ), - 'ReflectionType' => array( - '5.6' => false, - '7.0' => true, - ), - 'ReflectionGenerator' => array( - '5.6' => false, - '7.0' => true, - ), - - 'ReflectionClassConstant' => array( - '7.0' => false, - '7.1' => true, - ), - - 'FFI' => array( - '7.3' => false, - '7.4' => true, - ), - 'FFI\CData' => array( - '7.3' => false, - '7.4' => true, - ), - 'FFI\CType' => array( - '7.3' => false, - '7.4' => true, - ), - 'ReflectionReference' => array( - '7.3' => false, - '7.4' => true, - ), - 'WeakReference' => array( - '7.3' => false, - '7.4' => true, - ), - ); - - /** - * A list of new Exception classes, not present in older versions. - * - * The array lists : version number with false (not present) or true (present). - * If's sufficient to list the first version where the class appears. - * - * {@internal Classes listed here do not need to be added to the $newClasses - * property as well. - * This list is automatically added to the $newClasses property - * in the `register()` method.} - * - * {@internal Helper to update this list: https://3v4l.org/MhlUp} - * - * @since 7.1.4 - * - * @var array(string => array(string => bool)) - */ - protected $newExceptions = array( - 'com_exception' => array( - '4.4' => false, - '5.0' => true, - ), - 'DOMException' => array( - '4.4' => false, - '5.0' => true, - ), - 'Exception' => array( - // According to the docs introduced in PHP 5.1, but this appears to be. - // an error. Class was introduced with try/catch keywords in PHP 5.0. - '4.4' => false, - '5.0' => true, - ), - 'ReflectionException' => array( - '4.4' => false, - '5.0' => true, - ), - 'SoapFault' => array( - '4.4' => false, - '5.0' => true, - ), - 'SQLiteException' => array( - '4.4' => false, - '5.0' => true, - ), - - 'ErrorException' => array( - '5.0' => false, - '5.1' => true, - ), - 'BadFunctionCallException' => array( - '5.0' => false, - '5.1' => true, - ), - 'BadMethodCallException' => array( - '5.0' => false, - '5.1' => true, - ), - 'DomainException' => array( - '5.0' => false, - '5.1' => true, - ), - 'InvalidArgumentException' => array( - '5.0' => false, - '5.1' => true, - ), - 'LengthException' => array( - '5.0' => false, - '5.1' => true, - ), - 'LogicException' => array( - '5.0' => false, - '5.1' => true, - ), - 'mysqli_sql_exception' => array( - '5.0' => false, - '5.1' => true, - ), - 'OutOfBoundsException' => array( - '5.0' => false, - '5.1' => true, - ), - 'OutOfRangeException' => array( - '5.0' => false, - '5.1' => true, - ), - 'OverflowException' => array( - '5.0' => false, - '5.1' => true, - ), - 'PDOException' => array( - '5.0' => false, - '5.1' => true, - ), - 'RangeException' => array( - '5.0' => false, - '5.1' => true, - ), - 'RuntimeException' => array( - '5.0' => false, - '5.1' => true, - ), - 'UnderflowException' => array( - '5.0' => false, - '5.1' => true, - ), - 'UnexpectedValueException' => array( - '5.0' => false, - '5.1' => true, - ), - - 'PharException' => array( - '5.2' => false, - '5.3' => true, - ), - - 'SNMPException' => array( - '5.3' => false, - '5.4' => true, - ), - - 'IntlException' => array( - '5.4' => false, - '5.5' => true, - ), - - 'Error' => array( - '5.6' => false, - '7.0' => true, - ), - 'ArithmeticError' => array( - '5.6' => false, - '7.0' => true, - ), - 'AssertionError' => array( - '5.6' => false, - '7.0' => true, - ), - 'DivisionByZeroError' => array( - '5.6' => false, - '7.0' => true, - ), - 'ParseError' => array( - '5.6' => false, - '7.0' => true, - ), - 'TypeError' => array( - '5.6' => false, - '7.0' => true, - ), - 'ClosedGeneratorException' => array( - '5.6' => false, - '7.0' => true, - ), - 'UI\Exception\InvalidArgumentException' => array( - '5.6' => false, - '7.0' => true, - ), - 'UI\Exception\RuntimeException' => array( - '5.6' => false, - '7.0' => true, - ), - - 'ArgumentCountError' => array( - '7.0' => false, - '7.1' => true, - ), - - 'SodiumException' => array( - '7.1' => false, - '7.2' => true, - ), - - 'CompileError' => array( - '7.2' => false, - '7.3' => true, - ), - 'JsonException' => array( - '7.2' => false, - '7.3' => true, - ), - - 'FFI\Exception' => array( - '7.3' => false, - '7.4' => true, - ), - 'FFI\ParserException' => array( - '7.3' => false, - '7.4' => true, - ), - ); - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 5.5 - * @since 7.0.3 - Now also targets the `class` keyword to detect extended classes. - * - Now also targets double colons to detect static class use. - * @since 7.1.4 - Now also targets anonymous classes to detect extended classes. - * - Now also targets functions/closures to detect new classes used - * as parameter type declarations. - * - Now also targets the `catch` control structure to detect new - * exception classes being caught. - * @since 8.2.0 Now also targets the `T_RETURN_TYPE` token to detect new classes used - * as return type declarations. - * - * @return array - */ - public function register() - { - // Handle case-insensitivity of class names. - $this->newClasses = $this->arrayKeysToLowercase($this->newClasses); - $this->newExceptions = $this->arrayKeysToLowercase($this->newExceptions); - - // Add the Exception classes to the Classes list. - $this->newClasses = array_merge($this->newClasses, $this->newExceptions); - - $targets = array( - \T_NEW, - \T_CLASS, - \T_DOUBLE_COLON, - \T_FUNCTION, - \T_CLOSURE, - \T_CATCH, - ); - - if (\defined('T_ANON_CLASS')) { - $targets[] = \T_ANON_CLASS; - } - - if (\defined('T_RETURN_TYPE')) { - $targets[] = \T_RETURN_TYPE; - } - - return $targets; - } - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 5.5 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - switch ($tokens[$stackPtr]['type']) { - case 'T_FUNCTION': - case 'T_CLOSURE': - $this->processFunctionToken($phpcsFile, $stackPtr); - - // Deal with older PHPCS version which don't recognize return type hints - // as well as newer PHPCS versions (3.3.0+) where the tokenization has changed. - $returnTypeHint = $this->getReturnTypeHintToken($phpcsFile, $stackPtr); - if ($returnTypeHint !== false) { - $this->processReturnTypeToken($phpcsFile, $returnTypeHint); - } - break; - - case 'T_CATCH': - $this->processCatchToken($phpcsFile, $stackPtr); - break; - - case 'T_RETURN_TYPE': - $this->processReturnTypeToken($phpcsFile, $stackPtr); - break; - - default: - $this->processSingularToken($phpcsFile, $stackPtr); - break; - } - } - - - /** - * Processes this test for when a token resulting in a singular class name is encountered. - * - * @since 7.1.4 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - private function processSingularToken(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $FQClassName = ''; - - if ($tokens[$stackPtr]['type'] === 'T_NEW') { - $FQClassName = $this->getFQClassNameFromNewToken($phpcsFile, $stackPtr); - - } elseif ($tokens[$stackPtr]['type'] === 'T_CLASS' || $tokens[$stackPtr]['type'] === 'T_ANON_CLASS') { - $FQClassName = $this->getFQExtendedClassName($phpcsFile, $stackPtr); - - } elseif ($tokens[$stackPtr]['type'] === 'T_DOUBLE_COLON') { - $FQClassName = $this->getFQClassNameFromDoubleColonToken($phpcsFile, $stackPtr); - } - - if ($FQClassName === '') { - return; - } - - $className = substr($FQClassName, 1); // Remove global namespace indicator. - $classNameLc = strtolower($className); - - if (isset($this->newClasses[$classNameLc]) === false) { - return; - } - - $itemInfo = array( - 'name' => $className, - 'nameLc' => $classNameLc, - ); - $this->handleFeature($phpcsFile, $stackPtr, $itemInfo); - } - - - /** - * Processes this test for when a function token is encountered. - * - * - Detect new classes when used as a parameter type declaration. - * - * @since 7.1.4 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - private function processFunctionToken(File $phpcsFile, $stackPtr) - { - // Retrieve typehints stripped of global NS indicator and/or nullable indicator. - $typeHints = $this->getTypeHintsFromFunctionDeclaration($phpcsFile, $stackPtr); - if (empty($typeHints) || \is_array($typeHints) === false) { - return; - } - - foreach ($typeHints as $hint) { - - $typeHintLc = strtolower($hint); - - if (isset($this->newClasses[$typeHintLc]) === true) { - $itemInfo = array( - 'name' => $hint, - 'nameLc' => $typeHintLc, - ); - $this->handleFeature($phpcsFile, $stackPtr, $itemInfo); - } - } - } - - - /** - * Processes this test for when a catch token is encountered. - * - * - Detect exceptions when used in a catch statement. - * - * @since 7.1.4 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - private function processCatchToken(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Bow out during live coding. - if (isset($tokens[$stackPtr]['parenthesis_opener'], $tokens[$stackPtr]['parenthesis_closer']) === false) { - return; - } - - $opener = $tokens[$stackPtr]['parenthesis_opener']; - $closer = ($tokens[$stackPtr]['parenthesis_closer'] + 1); - $name = ''; - $listen = array( - // Parts of a (namespaced) class name. - \T_STRING => true, - \T_NS_SEPARATOR => true, - // End/split tokens. - \T_VARIABLE => false, - \T_BITWISE_OR => false, - \T_CLOSE_CURLY_BRACKET => false, // Shouldn't be needed as we expect a var before this. - ); - - for ($i = ($opener + 1); $i < $closer; $i++) { - if (isset($listen[$tokens[$i]['code']]) === false) { - continue; - } - - if ($listen[$tokens[$i]['code']] === true) { - $name .= $tokens[$i]['content']; - continue; - } else { - if (empty($name) === true) { - // Weird, we should have a name by the time we encounter a variable or |. - // So this may be the closer. - continue; - } - - $name = ltrim($name, '\\'); - $nameLC = strtolower($name); - - if (isset($this->newExceptions[$nameLC]) === true) { - $itemInfo = array( - 'name' => $name, - 'nameLc' => $nameLC, - ); - $this->handleFeature($phpcsFile, $i, $itemInfo); - } - - // Reset for a potential multi-catch. - $name = ''; - } - } - } - - - /** - * Processes this test for when a return type token is encountered. - * - * - Detect new classes when used as a return type declaration. - * - * @since 8.2.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - private function processReturnTypeToken(File $phpcsFile, $stackPtr) - { - $returnTypeHint = $this->getReturnTypeHintName($phpcsFile, $stackPtr); - if (empty($returnTypeHint)) { - return; - } - - $returnTypeHint = ltrim($returnTypeHint, '\\'); - $returnTypeHintLc = strtolower($returnTypeHint); - - if (isset($this->newClasses[$returnTypeHintLc]) === false) { - return; - } - - // Still here ? Then this is a return type declaration using a new class. - $itemInfo = array( - 'name' => $returnTypeHint, - 'nameLc' => $returnTypeHintLc, - ); - $this->handleFeature($phpcsFile, $stackPtr, $itemInfo); - } - - - /** - * Get the relevant sub-array for a specific item from a multi-dimensional array. - * - * @since 7.1.0 - * - * @param array $itemInfo Base information about the item. - * - * @return array Version and other information about the item. - */ - public function getItemArray(array $itemInfo) - { - return $this->newClasses[$itemInfo['nameLc']]; - } - - - /** - * Get the error message template for this sniff. - * - * @since 7.1.0 - * - * @return string - */ - protected function getErrorMsgTemplate() - { - return 'The built-in class ' . parent::getErrorMsgTemplate(); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Classes/NewConstVisibilitySniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Classes/NewConstVisibilitySniff.php deleted file mode 100644 index d2cb3fe..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Classes/NewConstVisibilitySniff.php +++ /dev/null @@ -1,80 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Classes; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Visibility for class constants is available since PHP 7.1. - * - * PHP version 7.1 - * - * @link https://wiki.php.net/rfc/class_const_visibility - * @link https://www.php.net/manual/en/language.oop5.constants.php#language.oop5.basic.class.this - * - * @since 7.0.7 - */ -class NewConstVisibilitySniff extends Sniff -{ - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 7.0.7 - * - * @return array - */ - public function register() - { - return array(\T_CONST); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 7.0.7 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsBelow('7.0') === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - $prevToken = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true, null, true); - - // Is the previous token a visibility indicator ? - if ($prevToken === false || isset(Tokens::$scopeModifiers[$tokens[$prevToken]['code']]) === false) { - return; - } - - // Is this a class constant ? - if ($this->isClassConstant($phpcsFile, $stackPtr) === false) { - // This may be a constant declaration in the global namespace with visibility, - // but that would throw a parse error, i.e. not our concern. - return; - } - - $phpcsFile->addError( - 'Visibility indicators for class constants are not supported in PHP 7.0 or earlier. Found "%s const"', - $stackPtr, - 'Found', - array($tokens[$prevToken]['content']) - ); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Classes/NewLateStaticBindingSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Classes/NewLateStaticBindingSniff.php deleted file mode 100644 index 9658a76..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Classes/NewLateStaticBindingSniff.php +++ /dev/null @@ -1,88 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Classes; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Detect use of late static binding as introduced in PHP 5.3. - * - * Checks for: - * - Late static binding as introduced in PHP 5.3. - * - Late static binding being used outside of class scope (unsupported). - * - * PHP version 5.3 - * - * @link https://www.php.net/manual/en/language.oop5.late-static-bindings.php - * @link https://wiki.php.net/rfc/lsb_parentself_forwarding - * - * @since 7.0.3 - * @since 9.0.0 Renamed from `LateStaticBindingSniff` to `NewLateStaticBindingSniff`. - */ -class NewLateStaticBindingSniff extends Sniff -{ - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 7.0.3 - * - * @return array - */ - public function register() - { - return array(\T_STATIC); - } - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 7.0.3 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, $stackPtr + 1, null, true, null, true); - if ($nextNonEmpty === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - if ($tokens[$nextNonEmpty]['code'] !== \T_DOUBLE_COLON) { - return; - } - - $inClass = $this->inClassScope($phpcsFile, $stackPtr, false); - - if ($inClass === true && $this->supportsBelow('5.2') === true) { - $phpcsFile->addError( - 'Late static binding is not supported in PHP 5.2 or earlier.', - $stackPtr, - 'Found' - ); - } - - if ($inClass === false) { - $phpcsFile->addError( - 'Late static binding is not supported outside of class scope.', - $stackPtr, - 'OutsideClassScope' - ); - } - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Classes/NewTypedPropertiesSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Classes/NewTypedPropertiesSniff.php deleted file mode 100644 index a609acc..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Classes/NewTypedPropertiesSniff.php +++ /dev/null @@ -1,132 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Classes; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Typed class property declarations are available since PHP 7.4. - * - * PHP version 7.4 - * - * @link https://www.php.net/manual/en/migration74.new-features.php#migration74.new-features.core.typed-properties - * @link https://wiki.php.net/rfc/typed_properties_v2 - * - * @since 9.2.0 - */ -class NewTypedPropertiesSniff extends Sniff -{ - - /** - * Valid property modifier keywords. - * - * @since 9.2.0 - * - * @var array - */ - private $modifierKeywords = array( - \T_PRIVATE => \T_PRIVATE, - \T_PROTECTED => \T_PROTECTED, - \T_PUBLIC => \T_PUBLIC, - \T_STATIC => \T_STATIC, - \T_VAR => \T_VAR, - ); - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 9.2.0 - * - * @return array - */ - public function register() - { - return array(\T_VARIABLE); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 9.2.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->isClassProperty($phpcsFile, $stackPtr) === false) { - return; - } - - $find = $this->modifierKeywords; - $find += array( - \T_SEMICOLON => \T_SEMICOLON, - \T_OPEN_CURLY_BRACKET => \T_OPEN_CURLY_BRACKET, - ); - - $tokens = $phpcsFile->getTokens(); - $modifier = $phpcsFile->findPrevious($find, ($stackPtr - 1)); - if ($modifier === false - || $tokens[$modifier]['code'] === \T_SEMICOLON - || $tokens[$modifier]['code'] === \T_OPEN_CURLY_BRACKET - ) { - // Parse error. Ignore. - return; - } - - $type = $phpcsFile->findNext(Tokens::$emptyTokens, ($modifier + 1), null, true); - if ($tokens[$type]['code'] === \T_VARIABLE) { - return; - } - - // Still here ? In that case, this will be a typed property. - if ($this->supportsBelow('7.3') === true) { - $phpcsFile->addError( - 'Typed properties are not supported in PHP 7.3 or earlier', - $type, - 'Found' - ); - } - - if ($this->supportsAbove('7.4') === true) { - // Examine the type to verify it's valid. - if ($tokens[$type]['type'] === 'T_NULLABLE' - // Needed to support PHPCS < 3.5.0 which doesn't correct to the nullable token type yet. - || $tokens[$type]['code'] === \T_INLINE_THEN - ) { - $type = $phpcsFile->findNext(Tokens::$emptyTokens, ($type + 1), null, true); - } - - $content = $tokens[$type]['content']; - if ($content === 'void' || $content === 'callable') { - $phpcsFile->addError( - '%s is not supported as a type declaration for properties', - $type, - 'InvalidType', - array($content) - ); - } - } - - $endOfStatement = $phpcsFile->findNext(\T_SEMICOLON, ($stackPtr + 1)); - if ($endOfStatement !== false) { - // Don't throw the same error multiple times for multi-property declarations. - return ($endOfStatement + 1); - } - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Classes/RemovedOrphanedParentSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Classes/RemovedOrphanedParentSniff.php deleted file mode 100644 index 7ecfd6c..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Classes/RemovedOrphanedParentSniff.php +++ /dev/null @@ -1,115 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Classes; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; - -/** - * Using `parent` inside a class without parent is deprecated since PHP 7.4. - * - * This will throw a compile-time error in the future. Currently an error will only - * be generated if/when the parent is accessed at run-time. - * - * PHP version 7.4 - * - * @link https://www.php.net/manual/en/migration74.deprecated.php#migration74.deprecated.core.parent - * - * @since 9.2.0 - */ -class RemovedOrphanedParentSniff extends Sniff -{ - - /** - * Class scopes to check the class declaration. - * - * @since 9.2.0 - * - * @var array - */ - public $classScopeTokens = array( - 'T_CLASS' => true, - 'T_ANON_CLASS' => true, - ); - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 9.2.0 - * - * @return array - */ - public function register() - { - return array(\T_PARENT); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 9.2.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsAbove('7.4') === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - - if (empty($tokens[$stackPtr]['conditions']) === true) { - // Use within the global namespace. Not our concern. - return; - } - - /* - * Find the class within which this parent keyword is used. - */ - $conditions = $tokens[$stackPtr]['conditions']; - $conditions = array_reverse($conditions, true); - $classPtr = false; - - foreach ($conditions as $ptr => $type) { - if (isset($this->classScopeTokens[$tokens[$ptr]['type']])) { - $classPtr = $ptr; - break; - } - } - - if ($classPtr === false) { - // Use outside of a class scope. Not our concern. - return; - } - - if (isset($tokens[$classPtr]['scope_opener']) === false) { - // No scope opener known. Probably a parse error. - return; - } - - $extends = $phpcsFile->findNext(\T_EXTENDS, ($classPtr + 1), $tokens[$classPtr]['scope_opener']); - if ($extends !== false) { - // Class has a parent. - return; - } - - $phpcsFile->addError( - 'Using "parent" inside a class without parent is deprecated since PHP 7.4', - $stackPtr, - 'Deprecated' - ); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Constants/NewConstantsSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Constants/NewConstantsSniff.php deleted file mode 100644 index 27ec421..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Constants/NewConstantsSniff.php +++ /dev/null @@ -1,3756 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Constants; - -use PHPCompatibility\AbstractNewFeatureSniff; -use PHP_CodeSniffer_File as File; - -/** - * Detect use of new PHP native global constants. - * - * PHP version All - * - * @since 8.1.0 - */ -class NewConstantsSniff extends AbstractNewFeatureSniff -{ - - /** - * A list of new PHP Constants, not present in older versions. - * - * The array lists : version number with false (not present) or true (present). - * If's sufficient to list the first version where the constant appears. - * - * Note: PHP constants are case-sensitive! - * - * @since 8.1.0 - * - * @var array(string => array(string => bool)) - */ - protected $newConstants = array( - 'E_STRICT' => array( - '4.4' => false, - '5.0' => true, - ), - // Curl: - 'CURLOPT_FTP_USE_EPRT' => array( - '4.4' => false, - '5.0' => true, - ), - 'CURLOPT_NOSIGNAL' => array( - '4.4' => false, - '5.0' => true, - ), - 'CURLOPT_UNRESTRICTED_AUTH' => array( - '4.4' => false, - '5.0' => true, - ), - 'CURLOPT_BUFFERSIZE' => array( - '4.4' => false, - '5.0' => true, - ), - 'CURLOPT_HTTPAUTH' => array( - '4.4' => false, - '5.0' => true, - ), - 'CURLOPT_PROXYPORT' => array( - '4.4' => false, - '5.0' => true, - ), - 'CURLOPT_PROXYTYPE' => array( - '4.4' => false, - '5.0' => true, - ), - 'CURLOPT_SSLCERTTYPE' => array( - '4.4' => false, - '5.0' => true, - ), - 'CURLOPT_HTTP200ALIASES' => array( - '4.4' => false, - '5.0' => true, - ), - // OpenSSL: - 'OPENSSL_ALGO_MD2' => array( - '4.4' => false, - '5.0' => true, - ), - 'OPENSSL_ALGO_MD4' => array( - '4.4' => false, - '5.0' => true, - ), - 'OPENSSL_ALGO_MD5' => array( - '4.4' => false, - '5.0' => true, - ), - 'OPENSSL_ALGO_SHA1' => array( - '4.4' => false, - '5.0' => true, - ), - 'OPENSSL_ALGO_DSS1' => array( - '4.4' => false, - '5.0' => true, - ), - // Tokenizer: - 'T_ABSTRACT' => array( - '4.4' => false, - '5.0' => true, - ), - 'T_CATCH' => array( - '4.4' => false, - '5.0' => true, - ), - - 'SORT_LOCALE_STRING' => array( - '5.0.1' => false, - '5.0.2' => true, - ), - 'PHP_EOL' => array( - '5.0.1' => false, - '5.0.2' => true, - ), - - 'PHP_INT_MAX' => array( - '5.0.4' => false, - '5.0.5' => true, - ), - 'PHP_INT_SIZE' => array( - '5.0.4' => false, - '5.0.5' => true, - ), - - '__COMPILER_HALT_OFFSET__' => array( - '5.0' => false, - '5.1' => true, - ), - 'GLOB_ERR' => array( - '5.0' => false, - '5.1' => true, - ), - // Curl: - 'CURLOPT_AUTOREFERER' => array( - '5.0' => false, - '5.1' => true, - ), - 'CURLOPT_BINARYTRANSFER' => array( - '5.0' => false, - '5.1' => true, - ), - 'CURLOPT_COOKIESESSION' => array( - '5.0' => false, - '5.1' => true, - ), - 'CURLOPT_FTPSSLAUTH' => array( - '5.0' => false, - '5.1' => true, - ), - 'CURLOPT_PROXYAUTH' => array( - '5.0' => false, - '5.1' => true, - ), - 'CURLOPT_TIMECONDITION' => array( - '5.0' => false, - '5.1' => true, - ), - // POSIX: - 'POSIX_F_OK' => array( - '5.0' => false, - '5.1' => true, - ), - 'POSIX_R_OK' => array( - '5.0' => false, - '5.1' => true, - ), - 'POSIX_W_OK' => array( - '5.0' => false, - '5.1' => true, - ), - 'POSIX_X_OK' => array( - '5.0' => false, - '5.1' => true, - ), - 'POSIX_S_IFBLK' => array( - '5.0' => false, - '5.1' => true, - ), - 'POSIX_S_IFCHR' => array( - '5.0' => false, - '5.1' => true, - ), - 'POSIX_S_IFIFO' => array( - '5.0' => false, - '5.1' => true, - ), - 'POSIX_S_IFREG' => array( - '5.0' => false, - '5.1' => true, - ), - 'POSIX_S_IFSOCK' => array( - '5.0' => false, - '5.1' => true, - ), - // Streams: - 'STREAM_IPPROTO_ICMP' => array( - '5.0' => false, - '5.1' => true, - ), - 'STREAM_IPPROTO_IP' => array( - '5.0' => false, - '5.1' => true, - ), - 'STREAM_IPPROTO_RAW' => array( - '5.0' => false, - '5.1' => true, - ), - 'STREAM_IPPROTO_TCP' => array( - '5.0' => false, - '5.1' => true, - ), - 'STREAM_IPPROTO_UDP' => array( - '5.0' => false, - '5.1' => true, - ), - 'STREAM_PF_INET' => array( - '5.0' => false, - '5.1' => true, - ), - 'STREAM_PF_INET6' => array( - '5.0' => false, - '5.1' => true, - ), - 'STREAM_PF_UNIX' => array( - '5.0' => false, - '5.1' => true, - ), - 'STREAM_SOCK_DGRAM' => array( - '5.0' => false, - '5.1' => true, - ), - 'STREAM_SOCK_RAW' => array( - '5.0' => false, - '5.1' => true, - ), - 'STREAM_SOCK_RDM' => array( - '5.0' => false, - '5.1' => true, - ), - 'STREAM_SOCK_SEQPACKET' => array( - '5.0' => false, - '5.1' => true, - ), - 'STREAM_SOCK_STREAM' => array( - '5.0' => false, - '5.1' => true, - ), - // Tokenizer: - 'T_HALT_COMPILER' => array( - '5.0' => false, - '5.1' => true, - ), - - // Date/Time: - 'DATE_ATOM' => array( - '5.1.0' => false, - '5.1.1' => true, - ), - 'DATE_COOKIE' => array( - '5.1.0' => false, - '5.1.1' => true, - ), - 'DATE_ISO8601' => array( - '5.1.0' => false, - '5.1.1' => true, - ), - 'DATE_RFC822' => array( - '5.1.0' => false, - '5.1.1' => true, - ), - 'DATE_RFC850' => array( - '5.1.0' => false, - '5.1.1' => true, - ), - 'DATE_RFC1036' => array( - '5.1.0' => false, - '5.1.1' => true, - ), - 'DATE_RFC1123' => array( - '5.1.0' => false, - '5.1.1' => true, - ), - 'DATE_RFC2822' => array( - '5.1.0' => false, - '5.1.1' => true, - ), - 'DATE_RFC3339' => array( - '5.1.0' => false, - '5.1.1' => true, - ), - 'DATE_RSS' => array( - '5.1.0' => false, - '5.1.1' => true, - ), - 'DATE_W3C' => array( - '5.1.0' => false, - '5.1.1' => true, - ), - - // Date/Time: - 'SUNFUNCS_RET_TIMESTAMP' => array( - '5.1.1' => false, - '5.1.2' => true, - ), - 'SUNFUNCS_RET_STRING' => array( - '5.1.1' => false, - '5.1.2' => true, - ), - 'SUNFUNCS_RET_DOUBLE' => array( - '5.1.1' => false, - '5.1.2' => true, - ), - // XSL: - 'LIBXSLT_VERSION' => array( - '5.1.1' => false, - '5.1.2' => true, - ), - 'LIBXSLT_DOTTED_VERSION' => array( - '5.1.1' => false, - '5.1.2' => true, - ), - 'LIBEXSLT_VERSION' => array( - '5.1.1' => false, - '5.1.2' => true, - ), - 'LIBEXSLT_DOTTED_VERSION' => array( - '5.1.1' => false, - '5.1.2' => true, - ), - // URL: - 'PHP_URL_SCHEME' => array( - '5.1.1' => false, - '5.1.2' => true, - ), - 'PHP_URL_HOST' => array( - '5.1.1' => false, - '5.1.2' => true, - ), - 'PHP_URL_PORT' => array( - '5.1.1' => false, - '5.1.2' => true, - ), - 'PHP_URL_USER' => array( - '5.1.1' => false, - '5.1.2' => true, - ), - 'PHP_URL_PASS' => array( - '5.1.1' => false, - '5.1.2' => true, - ), - 'PHP_URL_PATH' => array( - '5.1.1' => false, - '5.1.2' => true, - ), - 'PHP_URL_QUERY' => array( - '5.1.1' => false, - '5.1.2' => true, - ), - 'PHP_URL_FRAGMENT' => array( - '5.1.1' => false, - '5.1.2' => true, - ), - 'PHP_QUERY_RFC1738' => array( - '5.1.1' => false, - '5.1.2' => true, - ), - 'PHP_QUERY_RFC3986' => array( - '5.1.1' => false, - '5.1.2' => true, - ), - - // Curl: - 'CURLINFO_HEADER_OUT' => array( - '5.1.2' => false, - '5.1.3' => true, - ), - - // Core: - 'E_RECOVERABLE_ERROR' => array( - '5.1' => false, - '5.2' => true, - ), - // Math: - 'M_EULER' => array( - '5.1' => false, - '5.2' => true, - ), - 'M_LNPI' => array( - '5.1' => false, - '5.2' => true, - ), - 'M_SQRT3' => array( - '5.1' => false, - '5.2' => true, - ), - 'M_SQRTPI' => array( - '5.1' => false, - '5.2' => true, - ), - 'PATHINFO_FILENAME' => array( - '5.1' => false, - '5.2' => true, - ), - 'UPLOAD_ERR_EXTENSION' => array( - '5.1' => false, - '5.2' => true, - ), - // Curl: - 'CURLE_FILESIZE_EXCEEDED' => array( - '5.1' => false, - '5.2' => true, - ), - 'CURLE_FTP_SSL_FAILED' => array( - '5.1' => false, - '5.2' => true, - ), - 'CURLE_LDAP_INVALID_URL' => array( - '5.1' => false, - '5.2' => true, - ), - 'CURLFTPAUTH_DEFAULT' => array( - '5.1' => false, - '5.2' => true, - ), - 'CURLFTPAUTH_SSL' => array( - '5.1' => false, - '5.2' => true, - ), - 'CURLFTPAUTH_TLS' => array( - '5.1' => false, - '5.2' => true, - ), - 'CURLFTPSSL_ALL' => array( - '5.1' => false, - '5.2' => true, - ), - 'CURLFTPSSL_CONTROL' => array( - '5.1' => false, - '5.2' => true, - ), - 'CURLFTPSSL_NONE' => array( - '5.1' => false, - '5.2' => true, - ), - 'CURLFTPSSL_TRY' => array( - '5.1' => false, - '5.2' => true, - ), - 'CURLOPT_FTP_SSL' => array( - '5.1' => false, - '5.2' => true, - ), - // Ming: - 'SWFTEXTFIELD_USEFONT' => array( - '5.1' => false, - '5.2' => true, - ), - 'SWFTEXTFIELD_AUTOSIZE' => array( - '5.1' => false, - '5.2' => true, - ), - 'SWF_SOUND_NOT_COMPRESSED' => array( - '5.1' => false, - '5.2' => true, - ), - 'SWF_SOUND_ADPCM_COMPRESSED' => array( - '5.1' => false, - '5.2' => true, - ), - 'SWF_SOUND_MP3_COMPRESSED' => array( - '5.1' => false, - '5.2' => true, - ), - 'SWF_SOUND_NOT_COMPRESSED_LE' => array( - '5.1' => false, - '5.2' => true, - ), - 'SWF_SOUND_NELLY_COMPRESSED' => array( - '5.1' => false, - '5.2' => true, - ), - 'SWF_SOUND_5KHZ' => array( - '5.1' => false, - '5.2' => true, - ), - 'SWF_SOUND_11KHZ' => array( - '5.1' => false, - '5.2' => true, - ), - 'SWF_SOUND_22KHZ' => array( - '5.1' => false, - '5.2' => true, - ), - 'SWF_SOUND_44KHZ' => array( - '5.1' => false, - '5.2' => true, - ), - 'SWF_SOUND_8BITS' => array( - '5.1' => false, - '5.2' => true, - ), - 'SWF_SOUND_16BITS' => array( - '5.1' => false, - '5.2' => true, - ), - 'SWF_SOUND_MONO' => array( - '5.1' => false, - '5.2' => true, - ), - 'SWF_SOUND_STEREO' => array( - '5.1' => false, - '5.2' => true, - ), - // OpenSSL: - 'OPENSSL_KEYTYPE_EC' => array( - '5.1' => false, - '5.2' => true, - ), - 'OPENSSL_VERSION_NUMBER' => array( - '5.1' => false, - '5.2' => true, - ), - 'OPENSSL_VERSION_TEXT' => array( - '5.1' => false, - '5.2' => true, - ), - // PCRE: - 'PREG_BACKTRACK_LIMIT_ERROR' => array( - '5.1' => false, - '5.2' => true, - ), - 'PREG_BAD_UTF8_ERROR' => array( - '5.1' => false, - '5.2' => true, - ), - 'PREG_INTERNAL_ERROR' => array( - '5.1' => false, - '5.2' => true, - ), - 'PREG_NO_ERROR' => array( - '5.1' => false, - '5.2' => true, - ), - 'PREG_RECURSION_LIMIT_ERROR' => array( - '5.1' => false, - '5.2' => true, - ), - // Snmp: - 'SNMP_OID_OUTPUT_FULL' => array( - '5.1' => false, - '5.2' => true, - ), - 'SNMP_OID_OUTPUT_NUMERIC' => array( - '5.1' => false, - '5.2' => true, - ), - // Semaphore: - 'MSG_EAGAIN' => array( - '5.1' => false, - '5.2' => true, - ), - 'MSG_ENOMSG' => array( - '5.1' => false, - '5.2' => true, - ), - - // Curl: - 'CURLOPT_TCP_NODELAY' => array( - '5.2.0' => false, - '5.2.1' => true, - ), - - // Stream: - 'STREAM_SHUT_RD' => array( - '5.2.0' => false, - '5.2.1' => true, - ), - 'STREAM_SHUT_WR' => array( - '5.2.0' => false, - '5.2.1' => true, - ), - 'STREAM_SHUT_RDWR' => array( - '5.2.0' => false, - '5.2.1' => true, - ), - - 'GMP_VERSION' => array( - '5.2.1' => false, - '5.2.2' => true, - ), - - // Curl: - 'CURLOPT_TIMEOUT_MS' => array( - '5.2.2' => false, - '5.2.3' => true, - ), - 'CURLOPT_CONNECTTIMEOUT_MS' => array( - '5.2.2' => false, - '5.2.3' => true, - ), - - // Curl: - 'CURLOPT_PRIVATE' => array( - '5.2.3' => false, - '5.2.4' => true, - ), - 'CURLINFO_PRIVATE' => array( - '5.2.3' => false, - '5.2.4' => true, - ), - // GD: - 'GD_VERSION' => array( - '5.2.3' => false, - '5.2.4' => true, - ), - 'GD_MAJOR_VERSION' => array( - '5.2.3' => false, - '5.2.4' => true, - ), - 'GD_MINOR_VERSION' => array( - '5.2.3' => false, - '5.2.4' => true, - ), - 'GD_RELEASE_VERSION' => array( - '5.2.3' => false, - '5.2.4' => true, - ), - 'GD_EXTRA_VERSION' => array( - '5.2.3' => false, - '5.2.4' => true, - ), - // PCRE: - 'PCRE_VERSION' => array( - '5.2.3' => false, - '5.2.4' => true, - ), - - 'PHP_MAJOR_VERSION' => array( - '5.2.6' => false, - '5.2.7' => true, - ), - 'PHP_MINOR_VERSION' => array( - '5.2.6' => false, - '5.2.7' => true, - ), - 'PHP_RELEASE_VERSION' => array( - '5.2.6' => false, - '5.2.7' => true, - ), - 'PHP_VERSION_ID' => array( - '5.2.6' => false, - '5.2.7' => true, - ), - 'PHP_EXTRA_VERSION' => array( - '5.2.6' => false, - '5.2.7' => true, - ), - 'PHP_ZTS' => array( - '5.2.6' => false, - '5.2.7' => true, - ), - 'PHP_DEBUG' => array( - '5.2.6' => false, - '5.2.7' => true, - ), - 'FILE_BINARY' => array( - '5.2.6' => false, - '5.2.7' => true, - ), - 'FILE_TEXT' => array( - '5.2.6' => false, - '5.2.7' => true, - ), - // Sockets: - 'TCP_NODELAY' => array( - '5.2.6' => false, - '5.2.7' => true, - ), - - // Curl: - 'CURLOPT_PROTOCOLS' => array( - '5.2.9' => false, - '5.2.10' => true, - ), - 'CURLOPT_REDIR_PROTOCOLS' => array( - '5.2.9' => false, - '5.2.10' => true, - ), - 'CURLPROXY_SOCKS4' => array( - '5.2.9' => false, - '5.2.10' => true, - ), - - // Libxml: - 'LIBXML_PARSEHUGE' => array( - '5.2.11' => false, - '5.2.12' => true, - ), - - // Core: - 'ENT_IGNORE' => array( - '5.2' => false, - '5.3' => true, - ), - 'E_DEPRECATED' => array( - '5.2' => false, - '5.3' => true, - ), - 'E_USER_DEPRECATED' => array( - '5.2' => false, - '5.3' => true, - ), - 'INI_SCANNER_NORMAL' => array( - '5.2' => false, - '5.3' => true, - ), - 'INI_SCANNER_RAW' => array( - '5.2' => false, - '5.3' => true, - ), - 'PHP_MAXPATHLEN' => array( - '5.2' => false, - '5.3' => true, - ), - 'PHP_WINDOWS_NT_DOMAIN_CONTROLLER' => array( - '5.2' => false, - '5.3' => true, - ), - 'PHP_WINDOWS_NT_SERVER' => array( - '5.2' => false, - '5.3' => true, - ), - 'PHP_WINDOWS_NT_WORKSTATION' => array( - '5.2' => false, - '5.3' => true, - ), - 'PHP_WINDOWS_VERSION_BUILD' => array( - '5.2' => false, - '5.3' => true, - ), - 'PHP_WINDOWS_VERSION_MAJOR' => array( - '5.2' => false, - '5.3' => true, - ), - 'PHP_WINDOWS_VERSION_MINOR' => array( - '5.2' => false, - '5.3' => true, - ), - 'PHP_WINDOWS_VERSION_PLATFORM' => array( - '5.2' => false, - '5.3' => true, - ), - 'PHP_WINDOWS_VERSION_PRODUCTTYPE' => array( - '5.2' => false, - '5.3' => true, - ), - 'PHP_WINDOWS_VERSION_SP_MAJOR' => array( - '5.2' => false, - '5.3' => true, - ), - 'PHP_WINDOWS_VERSION_SP_MINOR' => array( - '5.2' => false, - '5.3' => true, - ), - 'PHP_WINDOWS_VERSION_SUITEMASK' => array( - '5.2' => false, - '5.3' => true, - ), - // Curl: - 'CURLINFO_CERTINFO' => array( - '5.2' => false, - '5.3' => true, - ), - 'CURLOPT_PROGRESSFUNCTION' => array( - '5.2' => false, - '5.3' => true, - ), - 'CURLE_SSH' => array( - '5.2' => false, - '5.3' => true, - ), - // GD: - 'IMG_FILTER_PIXELATE' => array( - '5.2' => false, - '5.3' => true, - ), - 'IMAGETYPE_ICO' => array( - '5.2' => false, - '5.3' => true, - ), - // Fileinfo: - 'FILEINFO_MIME_TYPE' => array( - '5.2' => false, - '5.3' => true, - ), - 'FILEINFO_MIME_ENCODING' => array( - '5.2' => false, - '5.3' => true, - ), - // JSON: - 'JSON_ERROR_CTRL_CHAR' => array( - '5.2' => false, - '5.3' => true, - ), - 'JSON_ERROR_DEPTH' => array( - '5.2' => false, - '5.3' => true, - ), - 'JSON_ERROR_NONE' => array( - '5.2' => false, - '5.3' => true, - ), - 'JSON_ERROR_STATE_MISMATCH' => array( - '5.2' => false, - '5.3' => true, - ), - 'JSON_ERROR_SYNTAX' => array( - '5.2' => false, - '5.3' => true, - ), - 'JSON_FORCE_OBJECT' => array( - '5.2' => false, - '5.3' => true, - ), - 'JSON_HEX_TAG' => array( - '5.2' => false, - '5.3' => true, - ), - 'JSON_HEX_AMP' => array( - '5.2' => false, - '5.3' => true, - ), - 'JSON_HEX_APOS' => array( - '5.2' => false, - '5.3' => true, - ), - 'JSON_HEX_QUOT' => array( - '5.2' => false, - '5.3' => true, - ), - // LDAP: - 'LDAP_OPT_NETWORK_TIMEOUT' => array( - '5.2' => false, - '5.3' => true, - ), - // Libxml: - 'LIBXML_LOADED_VERSION' => array( - '5.2' => false, - '5.3' => true, - ), - // Math: - 'PHP_ROUND_HALF_UP' => array( - '5.2' => false, - '5.3' => true, - ), - 'PHP_ROUND_HALF_DOWN' => array( - '5.2' => false, - '5.3' => true, - ), - 'PHP_ROUND_HALF_EVEN' => array( - '5.2' => false, - '5.3' => true, - ), - 'PHP_ROUND_HALF_ODD' => array( - '5.2' => false, - '5.3' => true, - ), - // Mysqli - 'MYSQLI_OPT_INT_AND_FLOAT_NATIVE' => array( - '5.2' => false, - '5.3' => true, - ), - 'MYSQLI_OPT_NET_CMD_BUFFER_SIZE' => array( - '5.2' => false, - '5.3' => true, - ), - 'MYSQLI_OPT_NET_READ_BUFFER_SIZE' => array( - '5.2' => false, - '5.3' => true, - ), - 'MYSQLI_OPT_SSL_VERIFY_SERVER_CERT' => array( - '5.2' => false, - '5.3' => true, - ), - // OCI8: - 'OCI_CRED_EXT' => array( - '5.2' => false, - '5.3' => true, - ), - // PCRE: - 'PREG_BAD_UTF8_OFFSET_ERROR' => array( - '5.2' => false, - '5.3' => true, - ), - // PCNTL: - 'BUS_ADRALN' => array( - '5.2' => false, - '5.3' => true, - ), - 'BUS_ADRERR' => array( - '5.2' => false, - '5.3' => true, - ), - 'BUS_OBJERR' => array( - '5.2' => false, - '5.3' => true, - ), - 'CLD_CONTIUNED' => array( - '5.2' => false, - '5.3' => true, - ), - 'CLD_DUMPED' => array( - '5.2' => false, - '5.3' => true, - ), - 'CLD_EXITED' => array( - '5.2' => false, - '5.3' => true, - ), - 'CLD_KILLED' => array( - '5.2' => false, - '5.3' => true, - ), - 'CLD_STOPPED' => array( - '5.2' => false, - '5.3' => true, - ), - 'CLD_TRAPPED' => array( - '5.2' => false, - '5.3' => true, - ), - 'FPE_FLTDIV' => array( - '5.2' => false, - '5.3' => true, - ), - 'FPE_FLTINV' => array( - '5.2' => false, - '5.3' => true, - ), - 'FPE_FLTOVF' => array( - '5.2' => false, - '5.3' => true, - ), - 'FPE_FLTRES' => array( - '5.2' => false, - '5.3' => true, - ), - 'FPE_FLTSUB' => array( - '5.2' => false, - '5.3' => true, - ), - 'FPE_FLTUND' => array( - '5.2' => false, - '5.3' => true, - ), - 'FPE_INTDIV' => array( - '5.2' => false, - '5.3' => true, - ), - 'FPE_INTOVF' => array( - '5.2' => false, - '5.3' => true, - ), - 'ILL_BADSTK' => array( - '5.2' => false, - '5.3' => true, - ), - 'ILL_COPROC' => array( - '5.2' => false, - '5.3' => true, - ), - 'ILL_ILLADR' => array( - '5.2' => false, - '5.3' => true, - ), - 'ILL_ILLOPC' => array( - '5.2' => false, - '5.3' => true, - ), - 'ILL_ILLOPN' => array( - '5.2' => false, - '5.3' => true, - ), - 'ILL_ILLTRP' => array( - '5.2' => false, - '5.3' => true, - ), - 'ILL_PRVOPC' => array( - '5.2' => false, - '5.3' => true, - ), - 'ILL_PRVREG' => array( - '5.2' => false, - '5.3' => true, - ), - 'POLL_ERR' => array( - '5.2' => false, - '5.3' => true, - ), - 'POLL_HUP' => array( - '5.2' => false, - '5.3' => true, - ), - 'POLL_IN' => array( - '5.2' => false, - '5.3' => true, - ), - 'POLL_MSG' => array( - '5.2' => false, - '5.3' => true, - ), - 'POLL_OUT' => array( - '5.2' => false, - '5.3' => true, - ), - 'POLL_PRI' => array( - '5.2' => false, - '5.3' => true, - ), - 'SEGV_ACCERR' => array( - '5.2' => false, - '5.3' => true, - ), - 'SEGV_MAPERR' => array( - '5.2' => false, - '5.3' => true, - ), - 'SI_ASYNCIO' => array( - '5.2' => false, - '5.3' => true, - ), - 'SI_KERNEL' => array( - '5.2' => false, - '5.3' => true, - ), - 'SI_MSGGQ' => array( - '5.2' => false, - '5.3' => true, - ), - 'SI_NOINFO' => array( - '5.2' => false, - '5.3' => true, - ), - 'SI_QUEUE' => array( - '5.2' => false, - '5.3' => true, - ), - 'SI_SIGIO' => array( - '5.2' => false, - '5.3' => true, - ), - 'SI_TIMER' => array( - '5.2' => false, - '5.3' => true, - ), - 'SI_TKILL' => array( - '5.2' => false, - '5.3' => true, - ), - 'SI_USER' => array( - '5.2' => false, - '5.3' => true, - ), - 'SIG_BLOCK' => array( - '5.2' => false, - '5.3' => true, - ), - 'SIG_SETMASK' => array( - '5.2' => false, - '5.3' => true, - ), - 'SIG_UNBLOCK' => array( - '5.2' => false, - '5.3' => true, - ), - 'TRAP_BRKPT' => array( - '5.2' => false, - '5.3' => true, - ), - 'TRAP_TRACE' => array( - '5.2' => false, - '5.3' => true, - ), - // Tokenizer: - 'T_DIR' => array( - '5.2' => false, - '5.3' => true, - ), - 'T_GOTO' => array( - '5.2' => false, - '5.3' => true, - ), - 'T_NAMESPACE' => array( - '5.2' => false, - '5.3' => true, - ), - 'T_NS_C' => array( - '5.2' => false, - '5.3' => true, - ), - 'T_NS_SEPARATOR' => array( - '5.2' => false, - '5.3' => true, - ), - 'T_USE' => array( - '5.2' => false, - '5.3' => true, - ), - - // OCI8: - 'OCI_NO_AUTO_COMMIT' => array( - '5.3.1' => false, - '5.3.2' => true, - ), - // OpenSSL: - 'OPENSSL_TLSEXT_SERVER_NAME' => array( - '5.3.1' => false, - '5.3.2' => true, - ), - - // JSON: - 'JSON_ERROR_UTF8' => array( - '5.3.2' => false, - '5.3.3' => true, - ), - 'JSON_NUMERIC_CHECK' => array( - '5.3.2' => false, - '5.3.3' => true, - ), - - 'DEBUG_BACKTRACE_IGNORE_ARGS' => array( - '5.3.5' => false, - '5.3.6' => true, - ), - - 'CURLINFO_REDIRECT_URL' => array( - '5.3.6' => false, - '5.3.7' => true, - ), - 'PHP_MANDIR' => array( - '5.3.6' => false, - '5.3.7' => true, - ), - - 'PHP_BINARY' => array( - '5.3' => false, - '5.4' => true, - ), - 'SORT_NATURAL' => array( - '5.3' => false, - '5.4' => true, - ), - 'SORT_FLAG_CASE' => array( - '5.3' => false, - '5.4' => true, - ), - 'ENT_HTML401' => array( - '5.3' => false, - '5.4' => true, - ), - 'ENT_XML1' => array( - '5.3' => false, - '5.4' => true, - ), - 'ENT_XHTML' => array( - '5.3' => false, - '5.4' => true, - ), - 'ENT_HTML5' => array( - '5.3' => false, - '5.4' => true, - ), - 'ENT_SUBSTITUTE' => array( - '5.3' => false, - '5.4' => true, - ), - 'ENT_DISALLOWED' => array( - '5.3' => false, - '5.4' => true, - ), - 'IPPROTO_IP' => array( - '5.3' => false, - '5.4' => true, - ), - 'IPPROTO_IPV6' => array( - '5.3' => false, - '5.4' => true, - ), - 'IPV6_MULTICAST_HOPS' => array( - '5.3' => false, - '5.4' => true, - ), - 'IPV6_MULTICAST_IF' => array( - '5.3' => false, - '5.4' => true, - ), - 'IPV6_MULTICAST_LOOP' => array( - '5.3' => false, - '5.4' => true, - ), - 'IP_MULTICAST_IF' => array( - '5.3' => false, - '5.4' => true, - ), - 'IP_MULTICAST_LOOP' => array( - '5.3' => false, - '5.4' => true, - ), - 'IP_MULTICAST_TTL' => array( - '5.3' => false, - '5.4' => true, - ), - 'MCAST_JOIN_GROUP' => array( - '5.3' => false, - '5.4' => true, - ), - 'MCAST_LEAVE_GROUP' => array( - '5.3' => false, - '5.4' => true, - ), - 'MCAST_BLOCK_SOURCE' => array( - '5.3' => false, - '5.4' => true, - ), - 'MCAST_UNBLOCK_SOURCE' => array( - '5.3' => false, - '5.4' => true, - ), - 'MCAST_JOIN_SOURCE_GROUP' => array( - '5.3' => false, - '5.4' => true, - ), - 'MCAST_LEAVE_SOURCE_GROUP' => array( - '5.3' => false, - '5.4' => true, - ), - // Curl: - 'CURLOPT_MAX_RECV_SPEED_LARGE' => array( - '5.3' => false, - '5.4' => true, - ), - 'CURLOPT_MAX_SEND_SPEED_LARGE' => array( - '5.3' => false, - '5.4' => true, - ), - // Directories: - 'SCANDIR_SORT_ASCENDING' => array( - '5.3' => false, - '5.4' => true, - ), - 'SCANDIR_SORT_DESCENDING' => array( - '5.3' => false, - '5.4' => true, - ), - 'SCANDIR_SORT_NONE' => array( - '5.3' => false, - '5.4' => true, - ), - // LibXML: - 'LIBXML_HTML_NODEFDTD' => array( - '5.3' => false, - '5.4' => true, - ), - 'LIBXML_HTML_NOIMPLIED' => array( - '5.3' => false, - '5.4' => true, - ), - 'LIBXML_PEDANTIC' => array( - '5.3' => false, - '5.4' => true, - ), - // OpenSSL: - 'OPENSSL_CIPHER_AES_128_CBC' => array( - '5.3' => false, - '5.4' => true, - ), - 'OPENSSL_CIPHER_AES_192_CBC' => array( - '5.3' => false, - '5.4' => true, - ), - 'OPENSSL_CIPHER_AES_256_CBC' => array( - '5.3' => false, - '5.4' => true, - ), - 'OPENSSL_RAW_DATA' => array( - '5.3' => false, - '5.4' => true, - ), - 'OPENSSL_ZERO_PADDING' => array( - '5.3' => false, - '5.4' => true, - ), - // Output buffering: - 'PHP_OUTPUT_HANDLER_CLEAN' => array( - '5.3' => false, - '5.4' => true, - ), - 'PHP_OUTPUT_HANDLER_CLEANABLE' => array( - '5.3' => false, - '5.4' => true, - ), - 'PHP_OUTPUT_HANDLER_DISABLED' => array( - '5.3' => false, - '5.4' => true, - ), - 'PHP_OUTPUT_HANDLER_FINAL' => array( - '5.3' => false, - '5.4' => true, - ), - 'PHP_OUTPUT_HANDLER_FLUSH' => array( - '5.3' => false, - '5.4' => true, - ), - 'PHP_OUTPUT_HANDLER_FLUSHABLE' => array( - '5.3' => false, - '5.4' => true, - ), - 'PHP_OUTPUT_HANDLER_REMOVABLE' => array( - '5.3' => false, - '5.4' => true, - ), - 'PHP_OUTPUT_HANDLER_STARTED' => array( - '5.3' => false, - '5.4' => true, - ), - 'PHP_OUTPUT_HANDLER_STDFLAGS' => array( - '5.3' => false, - '5.4' => true, - ), - 'PHP_OUTPUT_HANDLER_WRITE' => array( - '5.3' => false, - '5.4' => true, - ), - // Sessions: - 'PHP_SESSION_ACTIVE' => array( - '5.3' => false, - '5.4' => true, - ), - 'PHP_SESSION_DISABLED' => array( - '5.3' => false, - '5.4' => true, - ), - 'PHP_SESSION_NONE' => array( - '5.3' => false, - '5.4' => true, - ), - // Streams: - 'STREAM_META_ACCESS' => array( - '5.3' => false, - '5.4' => true, - ), - 'STREAM_META_GROUP' => array( - '5.3' => false, - '5.4' => true, - ), - 'STREAM_META_GROUP_NAME' => array( - '5.3' => false, - '5.4' => true, - ), - 'STREAM_META_OWNER' => array( - '5.3' => false, - '5.4' => true, - ), - 'STREAM_META_OWNER_NAME' => array( - '5.3' => false, - '5.4' => true, - ), - 'STREAM_META_TOUCH' => array( - '5.3' => false, - '5.4' => true, - ), - // Intl: - 'U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR' => array( - '5.3' => false, - '5.4' => true, - ), - 'IDNA_CHECK_BIDI' => array( - '5.3' => false, - '5.4' => true, - ), - 'IDNA_CHECK_CONTEXTJ' => array( - '5.3' => false, - '5.4' => true, - ), - 'IDNA_NONTRANSITIONAL_TO_ASCII' => array( - '5.3' => false, - '5.4' => true, - ), - 'IDNA_NONTRANSITIONAL_TO_UNICODE' => array( - '5.3' => false, - '5.4' => true, - ), - 'INTL_IDNA_VARIANT_2003' => array( - '5.3' => false, - '5.4' => true, - ), - 'INTL_IDNA_VARIANT_UTS46' => array( - '5.3' => false, - '5.4' => true, - ), - 'IDNA_ERROR_EMPTY_LABEL' => array( - '5.3' => false, - '5.4' => true, - ), - 'IDNA_ERROR_LABEL_TOO_LONG' => array( - '5.3' => false, - '5.4' => true, - ), - 'IDNA_ERROR_DOMAIN_NAME_TOO_LONG' => array( - '5.3' => false, - '5.4' => true, - ), - 'IDNA_ERROR_LEADING_HYPHEN' => array( - '5.3' => false, - '5.4' => true, - ), - 'IDNA_ERROR_TRAILING_HYPHEN' => array( - '5.3' => false, - '5.4' => true, - ), - 'IDNA_ERROR_HYPHEN_3_4' => array( - '5.3' => false, - '5.4' => true, - ), - 'IDNA_ERROR_LEADING_COMBINING_MARK' => array( - '5.3' => false, - '5.4' => true, - ), - 'IDNA_ERROR_DISALLOWED' => array( - '5.3' => false, - '5.4' => true, - ), - 'IDNA_ERROR_PUNYCODE' => array( - '5.3' => false, - '5.4' => true, - ), - 'IDNA_ERROR_LABEL_HAS_DOT' => array( - '5.3' => false, - '5.4' => true, - ), - 'IDNA_ERROR_INVALID_ACE_LABEL' => array( - '5.3' => false, - '5.4' => true, - ), - 'IDNA_ERROR_BIDI' => array( - '5.3' => false, - '5.4' => true, - ), - 'IDNA_ERROR_CONTEXTJ' => array( - '5.3' => false, - '5.4' => true, - ), - // Json: - 'JSON_PRETTY_PRINT' => array( - '5.3' => false, - '5.4' => true, - ), - 'JSON_UNESCAPED_SLASHES' => array( - '5.3' => false, - '5.4' => true, - ), - 'JSON_UNESCAPED_UNICODE' => array( - '5.3' => false, - '5.4' => true, - ), - 'JSON_BIGINT_AS_STRING' => array( - '5.3' => false, - '5.4' => true, - ), - 'JSON_OBJECT_AS_ARRAY' => array( - '5.3' => false, - '5.4' => true, - ), - // Snmp: - 'SNMP_OID_OUTPUT_SUFFIX' => array( - '5.3' => false, - '5.4' => true, - ), - 'SNMP_OID_OUTPUT_MODULE' => array( - '5.3' => false, - '5.4' => true, - ), - 'SNMP_OID_OUTPUT_UCD' => array( - '5.3' => false, - '5.4' => true, - ), - 'SNMP_OID_OUTPUT_NONE' => array( - '5.3' => false, - '5.4' => true, - ), - // Tokenizer: - 'T_INSTEADOF' => array( - '5.3' => false, - '5.4' => true, - ), - 'T_TRAIT' => array( - '5.3' => false, - '5.4' => true, - ), - 'T_TRAIT_C' => array( - '5.3' => false, - '5.4' => true, - ), - - // Curl: - 'CURLINFO_PRIMARY_IP' => array( - '5.4.6' => false, - '5.4.7' => true, - ), - 'CURLINFO_PRIMARY_PORT' => array( - '5.4.6' => false, - '5.4.7' => true, - ), - 'CURLINFO_LOCAL_IP' => array( - '5.4.6' => false, - '5.4.7' => true, - ), - 'CURLINFO_LOCAL_PORT' => array( - '5.4.6' => false, - '5.4.7' => true, - ), - - // OpenSSL: - 'OPENSSL_ALGO_RMD160' => array( - '5.4.7' => false, - '5.4.8' => true, - ), - 'OPENSSL_ALGO_SHA224' => array( - '5.4.7' => false, - '5.4.8' => true, - ), - 'OPENSSL_ALGO_SHA256' => array( - '5.4.7' => false, - '5.4.8' => true, - ), - 'OPENSSL_ALGO_SHA384' => array( - '5.4.7' => false, - '5.4.8' => true, - ), - 'OPENSSL_ALGO_SHA512' => array( - '5.4.7' => false, - '5.4.8' => true, - ), - - // Filter: - 'FILTER_VALIDATE_MAC' => array( - '5.4' => false, - '5.5' => true, - ), - // GD - 'IMG_AFFINE_TRANSLATE' => array( - '5.4' => false, - '5.5' => true, - ), - 'IMG_AFFINE_SCALE' => array( - '5.4' => false, - '5.5' => true, - ), - 'IMG_AFFINE_ROTATE' => array( - '5.4' => false, - '5.5' => true, - ), - 'IMG_AFFINE_SHEAR_HORIZONTAL' => array( - '5.4' => false, - '5.5' => true, - ), - 'IMG_AFFINE_SHEAR_VERTICAL' => array( - '5.4' => false, - '5.5' => true, - ), - 'IMG_CROP_DEFAULT' => array( - '5.4' => false, - '5.5' => true, - ), - 'IMG_CROP_TRANSPARENT' => array( - '5.4' => false, - '5.5' => true, - ), - 'IMG_CROP_BLACK' => array( - '5.4' => false, - '5.5' => true, - ), - 'IMG_CROP_WHITE' => array( - '5.4' => false, - '5.5' => true, - ), - 'IMG_CROP_SIDES' => array( - '5.4' => false, - '5.5' => true, - ), - 'IMG_FLIP_BOTH' => array( - '5.4' => false, - '5.5' => true, - ), - 'IMG_FLIP_HORIZONTAL' => array( - '5.4' => false, - '5.5' => true, - ), - 'IMG_FLIP_VERTICAL' => array( - '5.4' => false, - '5.5' => true, - ), - 'IMG_BELL' => array( - '5.4' => false, - '5.5' => true, - ), - 'IMG_BESSEL' => array( - '5.4' => false, - '5.5' => true, - ), - 'IMG_BILINEAR_FIXED' => array( - '5.4' => false, - '5.5' => true, - ), - 'IMG_BICUBIC' => array( - '5.4' => false, - '5.5' => true, - ), - 'IMG_BICUBIC_FIXED' => array( - '5.4' => false, - '5.5' => true, - ), - 'IMG_BLACKMAN' => array( - '5.4' => false, - '5.5' => true, - ), - 'IMG_BOX' => array( - '5.4' => false, - '5.5' => true, - ), - 'IMG_BSPLINE' => array( - '5.4' => false, - '5.5' => true, - ), - 'IMG_CATMULLROM' => array( - '5.4' => false, - '5.5' => true, - ), - 'IMG_GAUSSIAN' => array( - '5.4' => false, - '5.5' => true, - ), - 'IMG_GENERALIZED_CUBIC' => array( - '5.4' => false, - '5.5' => true, - ), - 'IMG_HERMITE' => array( - '5.4' => false, - '5.5' => true, - ), - 'IMG_HAMMING' => array( - '5.4' => false, - '5.5' => true, - ), - 'IMG_HANNING' => array( - '5.4' => false, - '5.5' => true, - ), - 'IMG_MITCHELL' => array( - '5.4' => false, - '5.5' => true, - ), - 'IMG_POWER' => array( - '5.4' => false, - '5.5' => true, - ), - 'IMG_QUADRATIC' => array( - '5.4' => false, - '5.5' => true, - ), - 'IMG_SINC' => array( - '5.4' => false, - '5.5' => true, - ), - 'IMG_NEAREST_NEIGHBOUR' => array( - '5.4' => false, - '5.5' => true, - ), - 'IMG_WEIGHTED4' => array( - '5.4' => false, - '5.5' => true, - ), - 'IMG_TRIANGLE' => array( - '5.4' => false, - '5.5' => true, - ), - // JSON: - 'JSON_ERROR_RECURSION' => array( - '5.4' => false, - '5.5' => true, - ), - 'JSON_ERROR_INF_OR_NAN' => array( - '5.4' => false, - '5.5' => true, - ), - 'JSON_ERROR_UNSUPPORTED_TYPE' => array( - '5.4' => false, - '5.5' => true, - ), - 'JSON_PARTIAL_OUTPUT_ON_ERROR' => array( - '5.4' => false, - '5.5' => true, - ), - // MySQLi - 'MYSQLI_SERVER_PUBLIC_KEY' => array( - '5.4' => false, - '5.5' => true, - ), - // Curl: - 'CURLOPT_SHARE' => array( - '5.4' => false, - '5.5' => true, - ), - 'CURLOPT_SSL_OPTIONS' => array( - '5.4' => false, - '5.5' => true, - ), - 'CURLSSLOPT_ALLOW_BEAST' => array( - '5.4' => false, - '5.5' => true, - ), - 'CURLOPT_USERNAME' => array( - '5.4' => false, - '5.5' => true, - ), - 'CURLINFO_RESPONSE_CODE' => array( - '5.4' => false, - '5.5' => true, - ), - 'CURLINFO_HTTP_CONNECTCODE' => array( - '5.4' => false, - '5.5' => true, - ), - 'CURLINFO_HTTPAUTH_AVAIL' => array( - '5.4' => false, - '5.5' => true, - ), - 'CURLINFO_PROXYAUTH_AVAIL' => array( - '5.4' => false, - '5.5' => true, - ), - 'CURLINFO_OS_ERRNO' => array( - '5.4' => false, - '5.5' => true, - ), - 'CURLINFO_NUM_CONNECTS' => array( - '5.4' => false, - '5.5' => true, - ), - 'CURLINFO_SSL_ENGINES' => array( - '5.4' => false, - '5.5' => true, - ), - 'CURLINFO_COOKIELIST' => array( - '5.4' => false, - '5.5' => true, - ), - 'CURLINFO_FTP_ENTRY_PATH' => array( - '5.4' => false, - '5.5' => true, - ), - 'CURLINFO_APPCONNECT_TIME' => array( - '5.4' => false, - '5.5' => true, - ), - 'CURLINFO_CONDITION_UNMET' => array( - '5.4' => false, - '5.5' => true, - ), - 'CURLINFO_RTSP_CLIENT_CSEQ' => array( - '5.4' => false, - '5.5' => true, - ), - 'CURLINFO_RTSP_CSEQ_RECV' => array( - '5.4' => false, - '5.5' => true, - ), - 'CURLINFO_RTSP_SERVER_CSEQ' => array( - '5.4' => false, - '5.5' => true, - ), - 'CURLINFO_RTSP_SESSION_ID' => array( - '5.4' => false, - '5.5' => true, - ), - 'CURLMOPT_PIPELINING' => array( - '5.4' => false, - '5.5' => true, - ), - 'CURLMOPT_MAXCONNECTS' => array( - '5.4' => false, - '5.5' => true, - ), - 'CURLPAUSE_ALL' => array( - '5.4' => false, - '5.5' => true, - ), - 'CURLPAUSE_CONT' => array( - '5.4' => false, - '5.5' => true, - ), - 'CURLPAUSE_RECV' => array( - '5.4' => false, - '5.5' => true, - ), - 'CURLPAUSE_RECV_CONT' => array( - '5.4' => false, - '5.5' => true, - ), - 'CURLPAUSE_SEND' => array( - '5.4' => false, - '5.5' => true, - ), - 'CURLPAUSE_SEND_CONT' => array( - '5.4' => false, - '5.5' => true, - ), - // Soap: - 'SOAP_SSL_METHOD_TLS' => array( - '5.4' => false, - '5.5' => true, - ), - 'SOAP_SSL_METHOD_SSLv2' => array( - '5.4' => false, - '5.5' => true, - ), - 'SOAP_SSL_METHOD_SSLv3' => array( - '5.4' => false, - '5.5' => true, - ), - 'SOAP_SSL_METHOD_SSLv23' => array( - '5.4' => false, - '5.5' => true, - ), - // Tokenizer: - 'T_FINALLY' => array( - '5.4' => false, - '5.5' => true, - ), - 'T_YIELD' => array( - '5.4' => false, - '5.5' => true, - ), - // Core/Password Hashing: - 'PASSWORD_BCRYPT' => array( - '5.4' => false, - '5.5' => true, - ), - 'PASSWORD_DEFAULT' => array( - '5.4' => false, - '5.5' => true, - ), - 'PASSWORD_BCRYPT_DEFAULT_COST' => array( - '5.4' => false, - '5.5' => true, - ), - - - // Libxml: - 'LIBXML_SCHEMA_CREATE' => array( - '5.5.1' => false, - '5.5.2' => true, - ), - - // Curl: - 'CURL_SSLVERSION_TLSv1_0' => array( - '5.5.18' => false, - '5.5.19' => true, - ), - 'CURL_SSLVERSION_TLSv1_1' => array( - '5.5.18' => false, - '5.5.19' => true, - ), - 'CURL_SSLVERSION_TLSv1_2' => array( - '5.5.18' => false, - '5.5.19' => true, - ), - - 'CURLPROXY_SOCKS4A' => array( - '5.5.22' => false, - '5.5.23' => true, - ), - 'CURLPROXY_SOCKS5_HOSTNAME' => array( - '5.5.22' => false, - '5.5.23' => true, - ), - - 'CURL_VERSION_HTTP2' => array( - '5.5.23' => false, - '5.5.24' => true, - ), - - 'ARRAY_FILTER_USE_KEY' => array( - '5.5' => false, - '5.6' => true, - ), - 'ARRAY_FILTER_USE_BOTH' => array( - '5.5' => false, - '5.6' => true, - ), - // LDAP: - 'LDAP_ESCAPE_DN' => array( - '5.5' => false, - '5.6' => true, - ), - 'LDAP_ESCAPE_FILTER' => array( - '5.5' => false, - '5.6' => true, - ), - // OpenSSL: - 'OPENSSL_DEFAULT_STREAM_CIPHERS' => array( - '5.5' => false, - '5.6' => true, - ), - 'STREAM_CRYPTO_METHOD_ANY_CLIENT' => array( - '5.5' => false, - '5.6' => true, - ), - 'STREAM_CRYPTO_METHOD_ANY_SERVER' => array( - '5.5' => false, - '5.6' => true, - ), - 'STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT' => array( - '5.5' => false, - '5.6' => true, - ), - 'STREAM_CRYPTO_METHOD_TLSv1_0_SERVER' => array( - '5.5' => false, - '5.6' => true, - ), - 'STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT' => array( - '5.5' => false, - '5.6' => true, - ), - 'STREAM_CRYPTO_METHOD_TLSv1_1_SERVER' => array( - '5.5' => false, - '5.6' => true, - ), - 'STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT' => array( - '5.5' => false, - '5.6' => true, - ), - 'STREAM_CRYPTO_METHOD_TLSv1_2_SERVER' => array( - '5.5' => false, - '5.6' => true, - ), - // PostgreSQL: - 'PGSQL_CONNECT_ASYNC' => array( - '5.5' => false, - '5.6' => true, - ), - 'PGSQL_CONNECTION_AUTH_OK' => array( - '5.5' => false, - '5.6' => true, - ), - 'PGSQL_CONNECTION_AWAITING_RESPONSE' => array( - '5.5' => false, - '5.6' => true, - ), - 'PGSQL_CONNECTION_MADE' => array( - '5.5' => false, - '5.6' => true, - ), - 'PGSQL_CONNECTION_SETENV' => array( - '5.5' => false, - '5.6' => true, - ), - 'PGSQL_CONNECTION_SSL_STARTUP' => array( - '5.5' => false, - '5.6' => true, - ), - 'PGSQL_CONNECTION_STARTED' => array( - '5.5' => false, - '5.6' => true, - ), - 'PGSQL_DML_ESCAPE' => array( - '5.5' => false, - '5.6' => true, - ), - 'PGSQL_POLLING_ACTIVE' => array( - '5.5' => false, - '5.6' => true, - ), - 'PGSQL_POLLING_FAILED' => array( - '5.5' => false, - '5.6' => true, - ), - 'PGSQL_POLLING_OK' => array( - '5.5' => false, - '5.6' => true, - ), - 'PGSQL_POLLING_READING' => array( - '5.5' => false, - '5.6' => true, - ), - 'PGSQL_POLLING_WRITING' => array( - '5.5' => false, - '5.6' => true, - ), - // Tokenizer: - 'T_ELLIPSIS' => array( - '5.5' => false, - '5.6' => true, - ), - 'T_POW' => array( - '5.5' => false, - '5.6' => true, - ), - 'T_POW_EQUAL' => array( - '5.5' => false, - '5.6' => true, - ), - - 'INI_SCANNER_TYPED' => array( - '5.6.0' => false, - '5.6.1' => true, - ), - - 'JSON_PRESERVE_ZERO_FRACTION' => array( - '5.6.5' => false, - '5.6.6' => true, - ), - - 'MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT' => array( - '5.6.15' => false, - '5.6.16' => true, - ), - - // GD: - // Also introduced in 7.0.10. - 'IMG_WEBP' => array( - '5.6.24' => false, - '5.6.25' => true, - ), - - - 'TOKEN_PARSE' => array( - '5.6' => false, - '7.0' => true, - ), - 'FILTER_VALIDATE_DOMAIN' => array( - '5.6' => false, - '7.0' => true, - ), - 'PHP_INT_MIN' => array( - '5.6' => false, - '7.0' => true, - ), - // Curl: - 'CURLPIPE_NOTHING' => array( - '5.6' => false, - '7.0' => true, - ), - 'CURLPIPE_HTTP1' => array( - '5.6' => false, - '7.0' => true, - ), - 'CURLPIPE_MULTIPLEX' => array( - '5.6' => false, - '7.0' => true, - ), - // JSON: - 'JSON_ERROR_INVALID_PROPERTY_NAME' => array( - '5.6' => false, - '7.0' => true, - ), - 'JSON_ERROR_UTF16' => array( - '5.6' => false, - '7.0' => true, - ), - // LibXML: - 'LIBXML_BIGLINES' => array( - '5.6' => false, - '7.0' => true, - ), - // PCRE: - 'PREG_JIT_STACKLIMIT_ERROR' => array( - '5.6' => false, - '7.0' => true, - ), - // POSIX: - 'POSIX_RLIMIT_AS' => array( - '5.6' => false, - '7.0' => true, - ), - 'POSIX_RLIMIT_CORE' => array( - '5.6' => false, - '7.0' => true, - ), - 'POSIX_RLIMIT_CPU' => array( - '5.6' => false, - '7.0' => true, - ), - 'POSIX_RLIMIT_DATA' => array( - '5.6' => false, - '7.0' => true, - ), - 'POSIX_RLIMIT_FSIZE' => array( - '5.6' => false, - '7.0' => true, - ), - 'POSIX_RLIMIT_LOCKS' => array( - '5.6' => false, - '7.0' => true, - ), - 'POSIX_RLIMIT_MEMLOCK' => array( - '5.6' => false, - '7.0' => true, - ), - 'POSIX_RLIMIT_MSGQUEUE' => array( - '5.6' => false, - '7.0' => true, - ), - 'POSIX_RLIMIT_NICE' => array( - '5.6' => false, - '7.0' => true, - ), - 'POSIX_RLIMIT_NOFILE' => array( - '5.6' => false, - '7.0' => true, - ), - 'POSIX_RLIMIT_NPROC' => array( - '5.6' => false, - '7.0' => true, - ), - 'POSIX_RLIMIT_RSS' => array( - '5.6' => false, - '7.0' => true, - ), - 'POSIX_RLIMIT_RTPRIO' => array( - '5.6' => false, - '7.0' => true, - ), - 'POSIX_RLIMIT_RTTIME' => array( - '5.6' => false, - '7.0' => true, - ), - 'POSIX_RLIMIT_SIGPENDING' => array( - '5.6' => false, - '7.0' => true, - ), - 'POSIX_RLIMIT_STACK' => array( - '5.6' => false, - '7.0' => true, - ), - 'POSIX_RLIMIT_INFINITY' => array( - '5.6' => false, - '7.0' => true, - ), - // Tokenizer: - 'T_COALESCE' => array( - '5.6' => false, - '7.0' => true, - ), - 'T_SPACESHIP' => array( - '5.6' => false, - '7.0' => true, - ), - 'T_YIELD_FROM' => array( - '5.6' => false, - '7.0' => true, - ), - - // Zlib: - // The first three are in the PHP 5.4 changelog, but the Extension constant page says 7.0. - 'ZLIB_ENCODING_RAW' => array( - '5.6' => false, - '7.0' => true, - ), - 'ZLIB_ENCODING_DEFLATE' => array( - '5.6' => false, - '7.0' => true, - ), - 'ZLIB_ENCODING_GZIP' => array( - '5.6' => false, - '7.0' => true, - ), - 'ZLIB_FILTERED' => array( - '5.6' => false, - '7.0' => true, - ), - 'ZLIB_HUFFMAN_ONLY' => array( - '5.6' => false, - '7.0' => true, - ), - 'ZLIB_FIXED' => array( - '5.6' => false, - '7.0' => true, - ), - 'ZLIB_RLE' => array( - '5.6' => false, - '7.0' => true, - ), - 'ZLIB_DEFAULT_STRATEGY' => array( - '5.6' => false, - '7.0' => true, - ), - 'ZLIB_BLOCK' => array( - '5.6' => false, - '7.0' => true, - ), - 'ZLIB_FINISH' => array( - '5.6' => false, - '7.0' => true, - ), - 'ZLIB_FULL_FLUSH' => array( - '5.6' => false, - '7.0' => true, - ), - 'ZLIB_NO_FLUSH' => array( - '5.6' => false, - '7.0' => true, - ), - 'ZLIB_PARTIAL_FLUSH' => array( - '5.6' => false, - '7.0' => true, - ), - 'ZLIB_SYNC_FLUSH' => array( - '5.6' => false, - '7.0' => true, - ), - - 'CURL_HTTP_VERSION_2' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURL_HTTP_VERSION_2TLS' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURL_REDIR_POST_301' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURL_REDIR_POST_302' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURL_REDIR_POST_303' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURL_REDIR_POST_ALL' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURL_VERSION_KERBEROS5' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURL_VERSION_PSL' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURL_VERSION_UNIX_SOCKETS' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLAUTH_NEGOTIATE' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLAUTH_NTLM_WB' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLFTP_CREATE_DIR' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLFTP_CREATE_DIR_NONE' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLFTP_CREATE_DIR_RETRY' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLHEADER_SEPARATE' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLHEADER_UNIFIED' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLMOPT_MAX_HOST_CONNECTIONS' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLMOPT_MAX_PIPELINE_LENGTH' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLMOPT_MAX_TOTAL_CONNECTIONS' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLOPT_CONNECT_TO' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLOPT_DEFAULT_PROTOCOL' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLOPT_DNS_INTERFACE' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLOPT_DNS_LOCAL_IP4' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLOPT_DNS_LOCAL_IP6' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLOPT_EXPECT_100_TIMEOUT_MS' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLOPT_HEADEROPT' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLOPT_LOGIN_OPTIONS' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLOPT_PATH_AS_IS' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLOPT_PINNEDPUBLICKEY' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLOPT_PIPEWAIT' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLOPT_PROXY_SERVICE_NAME' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLOPT_PROXYHEADER' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLOPT_SASL_IR' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLOPT_SERVICE_NAME' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLOPT_SSL_ENABLE_ALPN' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLOPT_SSL_ENABLE_NPN' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLOPT_SSL_FALSESTART' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLOPT_SSL_VERIFYSTATUS' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLOPT_STREAM_WEIGHT' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLOPT_TCP_FASTOPEN' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLOPT_TFTP_NO_OPTIONS' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLOPT_UNIX_SOCKET_PATH' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLOPT_XOAUTH2_BEARER' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLPROTO_SMB' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLPROTO_SMBS' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLPROXY_HTTP_1_0' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLSSH_AUTH_AGENT' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - 'CURLSSLOPT_NO_REVOKE' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - - 'PHP_FD_SETSIZE' => array( - '7.0' => false, - '7.1' => true, - ), - // Curl: - 'CURLMOPT_PUSHFUNCTION' => array( - '7.0' => false, - '7.1' => true, - ), - 'CURL_PUSH_OK' => array( - '7.0' => false, - '7.1' => true, - ), - 'CURL_PUSH_DENY' => array( - '7.0' => false, - '7.1' => true, - ), - // Filter: - 'FILTER_FLAG_EMAIL_UNICODE' => array( - '7.0' => false, - '7.1' => true, - ), - // GD: - 'IMAGETYPE_WEBP' => array( - '7.0' => false, - '7.1' => true, - ), - // Json: - 'JSON_UNESCAPED_LINE_TERMINATORS' => array( - '7.0' => false, - '7.1' => true, - ), - // LDAP: - 'LDAP_OPT_X_SASL_NOCANON' => array( - '7.0' => false, - '7.1' => true, - ), - 'LDAP_OPT_X_SASL_USERNAME' => array( - '7.0' => false, - '7.1' => true, - ), - 'LDAP_OPT_X_TLS_CACERTDIR' => array( - '7.0' => false, - '7.1' => true, - ), - 'LDAP_OPT_X_TLS_CACERTFILE' => array( - '7.0' => false, - '7.1' => true, - ), - 'LDAP_OPT_X_TLS_CERTFILE' => array( - '7.0' => false, - '7.1' => true, - ), - 'LDAP_OPT_X_TLS_CIPHER_SUITE' => array( - '7.0' => false, - '7.1' => true, - ), - 'LDAP_OPT_X_TLS_KEYFILE' => array( - '7.0' => false, - '7.1' => true, - ), - 'LDAP_OPT_X_TLS_RANDOM_FILE' => array( - '7.0' => false, - '7.1' => true, - ), - 'LDAP_OPT_X_TLS_CRLCHECK' => array( - '7.0' => false, - '7.1' => true, - ), - 'LDAP_OPT_X_TLS_CRL_NONE' => array( - '7.0' => false, - '7.1' => true, - ), - 'LDAP_OPT_X_TLS_CRL_PEER' => array( - '7.0' => false, - '7.1' => true, - ), - 'LDAP_OPT_X_TLS_CRL_ALL' => array( - '7.0' => false, - '7.1' => true, - ), - 'LDAP_OPT_X_TLS_DHFILE' => array( - '7.0' => false, - '7.1' => true, - ), - 'LDAP_OPT_X_TLS_CRLFILE' => array( - '7.0' => false, - '7.1' => true, - ), - 'LDAP_OPT_X_TLS_PROTOCOL_MIN' => array( - '7.0' => false, - '7.1' => true, - ), - 'LDAP_OPT_X_TLS_PROTOCOL_SSL2' => array( - '7.0' => false, - '7.1' => true, - ), - 'LDAP_OPT_X_TLS_PROTOCOL_SSL3' => array( - '7.0' => false, - '7.1' => true, - ), - 'LDAP_OPT_X_TLS_PROTOCOL_TLS1_0' => array( - '7.0' => false, - '7.1' => true, - ), - 'LDAP_OPT_X_TLS_PROTOCOL_TLS1_1' => array( - '7.0' => false, - '7.1' => true, - ), - 'LDAP_OPT_X_TLS_PROTOCOL_TLS1_2' => array( - '7.0' => false, - '7.1' => true, - ), - 'LDAP_OPT_X_TLS_PACKAGE' => array( - '7.0' => false, - '7.1' => true, - ), - 'LDAP_OPT_X_KEEPALIVE_IDLE' => array( - '7.0' => false, - '7.1' => true, - ), - 'LDAP_OPT_X_KEEPALIVE_PROBES' => array( - '7.0' => false, - '7.1' => true, - ), - 'LDAP_OPT_X_KEEPALIVE_INTERVAL' => array( - '7.0' => false, - '7.1' => true, - ), - // PostgreSQL: - 'PGSQL_NOTICE_LAST' => array( - '7.0' => false, - '7.1' => true, - ), - 'PGSQL_NOTICE_ALL' => array( - '7.0' => false, - '7.1' => true, - ), - 'PGSQL_NOTICE_CLEAR' => array( - '7.0' => false, - '7.1' => true, - ), - // SPL: - 'MT_RAND_PHP' => array( - '7.0' => false, - '7.1' => true, - ), - - // SQLite3: - 'SQLITE3_DETERMINISTIC' => array( - '7.1.3' => false, - '7.1.4' => true, - ), - - // Core: - 'PHP_OS_FAMILY' => array( - '7.1' => false, - '7.2' => true, - ), - 'PHP_FLOAT_DIG' => array( - '7.1' => false, - '7.2' => true, - ), - 'PHP_FLOAT_EPSILON' => array( - '7.1' => false, - '7.2' => true, - ), - 'PHP_FLOAT_MIN' => array( - '7.1' => false, - '7.2' => true, - ), - 'PHP_FLOAT_MAX' => array( - '7.1' => false, - '7.2' => true, - ), - - // Core/Password Hashing: - 'PASSWORD_ARGON2I' => array( - '7.1' => false, - '7.2' => true, - ), - 'PASSWORD_ARGON2_DEFAULT_MEMORY_COST' => array( - '7.1' => false, - '7.2' => true, - ), - 'PASSWORD_ARGON2_DEFAULT_TIME_COST' => array( - '7.1' => false, - '7.2' => true, - ), - 'PASSWORD_ARGON2_DEFAULT_THREADS' => array( - '7.1' => false, - '7.2' => true, - ), - - // Fileinfo: - 'FILEINFO_EXTENSION' => array( - '7.1' => false, - '7.2' => true, - ), - - // GD: - 'IMG_EFFECT_MULTIPLY' => array( - '7.1' => false, - '7.2' => true, - ), - 'IMG_BMP' => array( - '7.1' => false, - '7.2' => true, - ), - - // JSON: - 'JSON_INVALID_UTF8_IGNORE' => array( - '7.1' => false, - '7.2' => true, - ), - 'JSON_INVALID_UTF8_SUBSTITUTE' => array( - '7.1' => false, - '7.2' => true, - ), - - // LDAP: - 'LDAP_EXOP_START_TLS' => array( - '7.1' => false, - '7.2' => true, - ), - 'LDAP_EXOP_MODIFY_PASSWD' => array( - '7.1' => false, - '7.2' => true, - ), - 'LDAP_EXOP_REFRESH' => array( - '7.1' => false, - '7.2' => true, - ), - 'LDAP_EXOP_WHO_AM_I' => array( - '7.1' => false, - '7.2' => true, - ), - 'LDAP_EXOP_TURN' => array( - '7.1' => false, - '7.2' => true, - ), - - // PCRE: - 'PREG_UNMATCHED_AS_NULL' => array( - '7.1' => false, - '7.2' => true, - ), - - // Sodium: - 'SODIUM_LIBRARY_VERSION' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_LIBRARY_MAJOR_VERSION' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_LIBRARY_MINOR_VERSION' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_BASE64_VARIANT_ORIGINAL' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_BASE64_VARIANT_ORIGINAL_NO_PADDING' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_BASE64_VARIANT_URLSAFE' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_BASE64_VARIANT_URLSAFE_NO_PADDING' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_AEAD_AES256GCM_NSECBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_AEAD_AES256GCM_ABYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_NSECBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_ABYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_KEYBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_NSECBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_ABYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_KEYBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NSECBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_ABYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_AUTH_BYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_AUTH_KEYBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_BOX_SEALBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_BOX_SECRETKEYBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_BOX_PUBLICKEYBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_BOX_KEYPAIRBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_BOX_MACBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_BOX_NONCEBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_BOX_SEEDBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_KDF_BYTES_MIN' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_KDF_BYTES_MAX' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_KDF_CONTEXTBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_KDF_KEYBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_KX_SEEDBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_KX_SESSIONKEYBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_KX_PUBLICKEYBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_KX_SECRETKEYBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_KX_KEYPAIRBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_GENERICHASH_BYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_GENERICHASH_BYTES_MIN' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_GENERICHASH_BYTES_MAX' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_GENERICHASH_KEYBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_GENERICHASH_KEYBYTES_MIN' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_GENERICHASH_KEYBYTES_MAX' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_PWHASH_ALG_ARGON2I13' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_PWHASH_ALG_ARGON2ID13' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_PWHASH_ALG_DEFAULT' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_PWHASH_SALTBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_PWHASH_STRPREFIX' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_PWHASH_OPSLIMIT_MODERATE' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_PWHASH_MEMLIMIT_MODERATE' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_PWHASH_OPSLIMIT_SENSITIVE' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_PWHASH_MEMLIMIT_SENSITIVE' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_SALTBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_STRPREFIX' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_OPSLIMIT_INTERACTIVE' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_MEMLIMIT_INTERACTIVE' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_OPSLIMIT_SENSITIVE' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_MEMLIMIT_SENSITIVE' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_SCALARMULT_BYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_SCALARMULT_SCALARBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_SHORTHASH_BYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_SHORTHASH_KEYBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_SECRETBOX_KEYBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_SECRETBOX_MACBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_SECRETBOX_NONCEBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_ABYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_HEADERBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_KEYBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_MESSAGEBYTES_MAX' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_MESSAGE' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_PUSH' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_REKEY' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_FINAL' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_SIGN_BYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_SIGN_SEEDBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_SIGN_PUBLICKEYBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_SIGN_SECRETKEYBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_SIGN_KEYPAIRBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_STREAM_NONCEBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - 'SODIUM_CRYPTO_STREAM_KEYBYTES' => array( - '7.1' => false, - '7.2' => true, - ), - - 'CURLAUTH_BEARER' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLAUTH_GSSAPI' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLE_WEIRD_SERVER_REPLY' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLINFO_APPCONNECT_TIME_T' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLINFO_CONNECT_TIME_T' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLINFO_CONTENT_LENGTH_DOWNLOAD_T' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLINFO_CONTENT_LENGTH_UPLOAD_T' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLINFO_FILETIME_T' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLINFO_HTTP_VERSION' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLINFO_NAMELOOKUP_TIME_T' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLINFO_PRETRANSFER_TIME_T' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLINFO_PROTOCOL' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLINFO_PROXY_SSL_VERIFYRESULT' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLINFO_REDIRECT_TIME_T' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLINFO_SCHEME' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLINFO_SIZE_DOWNLOAD_T' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLINFO_SIZE_UPLOAD_T' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLINFO_SPEED_DOWNLOAD_T' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLINFO_SPEED_UPLOAD_T' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLINFO_STARTTRANSFER_TIME_T' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLINFO_TOTAL_TIME_T' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURL_LOCK_DATA_CONNECT' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURL_LOCK_DATA_PSL' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURL_MAX_READ_SIZE' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLOPT_ABSTRACT_UNIX_SOCKET' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLOPT_DISALLOW_USERNAME_IN_URL' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLOPT_DNS_SHUFFLE_ADDRESSES' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLOPT_HAPROXYPROTOCOL' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLOPT_KEEP_SENDING_ON_ERROR' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLOPT_PRE_PROXY' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLOPT_PROXY_CAINFO' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLOPT_PROXY_CAPATH' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLOPT_PROXY_CRLFILE' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLOPT_PROXY_KEYPASSWD' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLOPT_PROXY_PINNEDPUBLICKEY' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLOPT_PROXY_SSLCERT' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLOPT_PROXY_SSLCERTTYPE' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLOPT_PROXY_SSL_CIPHER_LIST' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLOPT_PROXY_SSLKEY' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLOPT_PROXY_SSLKEYTYPE' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLOPT_PROXY_SSL_OPTIONS' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLOPT_PROXY_SSL_VERIFYHOST' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLOPT_PROXY_SSL_VERIFYPEER' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLOPT_PROXY_SSLVERSION' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLOPT_PROXY_TLS13_CIPHERS' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLOPT_PROXY_TLSAUTH_PASSWORD' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLOPT_PROXY_TLSAUTH_TYPE' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLOPT_PROXY_TLSAUTH_USERNAME' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLOPT_REQUEST_TARGET' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLOPT_SOCKS5_AUTH' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLOPT_SSH_COMPRESSION' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLOPT_SUPPRESS_CONNECT_HEADERS' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLOPT_TIMEVALUE_LARGE' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLOPT_TLS13_CIPHERS' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLPROXY_HTTPS' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURLSSH_AUTH_GSSAPI' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURL_SSLVERSION_MAX_DEFAULT' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURL_SSLVERSION_MAX_NONE' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURL_SSLVERSION_MAX_TLSv1_0' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURL_SSLVERSION_MAX_TLSv1_1' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURL_SSLVERSION_MAX_TLSv1_2' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURL_SSLVERSION_MAX_TLSv1_3' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURL_SSLVERSION_TLSv1_3' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURL_VERSION_ASYNCHDNS' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURL_VERSION_BROTLI' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURL_VERSION_CONV' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURL_VERSION_DEBUG' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURL_VERSION_GSSAPI' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURL_VERSION_GSSNEGOTIATE' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURL_VERSION_HTTPS_PROXY' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURL_VERSION_IDN' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURL_VERSION_LARGEFILE' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURL_VERSION_MULTI_SSL' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURL_VERSION_NTLM' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURL_VERSION_NTLM_WB' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURL_VERSION_SPNEGO' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURL_VERSION_SSPI' => array( - '7.2' => false, - '7.3' => true, - ), - 'CURL_VERSION_TLSAUTH_SRP' => array( - '7.2' => false, - '7.3' => true, - ), - 'FILTER_SANITIZE_ADD_SLASHES' => array( - '7.2' => false, - '7.3' => true, - ), - 'JSON_THROW_ON_ERROR' => array( - '7.2' => false, - '7.3' => true, - ), - 'LDAP_CONTROL_MANAGEDSAIT' => array( - '7.2' => false, - '7.3' => true, - ), - 'LDAP_CONTROL_PROXY_AUTHZ' => array( - '7.2' => false, - '7.3' => true, - ), - 'LDAP_CONTROL_SUBENTRIES' => array( - '7.2' => false, - '7.3' => true, - ), - 'LDAP_CONTROL_VALUESRETURNFILTER' => array( - '7.2' => false, - '7.3' => true, - ), - 'LDAP_CONTROL_ASSERT' => array( - '7.2' => false, - '7.3' => true, - ), - 'LDAP_CONTROL_PRE_READ' => array( - '7.2' => false, - '7.3' => true, - ), - 'LDAP_CONTROL_POST_READ' => array( - '7.2' => false, - '7.3' => true, - ), - 'LDAP_CONTROL_SORTREQUEST' => array( - '7.2' => false, - '7.3' => true, - ), - 'LDAP_CONTROL_SORTRESPONSE' => array( - '7.2' => false, - '7.3' => true, - ), - 'LDAP_CONTROL_PAGEDRESULTS' => array( - '7.2' => false, - '7.3' => true, - ), - 'LDAP_CONTROL_AUTHZID_REQUEST' => array( - '7.2' => false, - '7.3' => true, - ), - 'LDAP_CONTROL_AUTHZID_RESPONSE' => array( - '7.2' => false, - '7.3' => true, - ), - 'LDAP_CONTROL_SYNC' => array( - '7.2' => false, - '7.3' => true, - ), - 'LDAP_CONTROL_SYNC_STATE' => array( - '7.2' => false, - '7.3' => true, - ), - 'LDAP_CONTROL_SYNC_DONE' => array( - '7.2' => false, - '7.3' => true, - ), - 'LDAP_CONTROL_DONTUSECOPY' => array( - '7.2' => false, - '7.3' => true, - ), - 'LDAP_CONTROL_PASSWORDPOLICYREQUEST' => array( - '7.2' => false, - '7.3' => true, - ), - 'LDAP_CONTROL_PASSWORDPOLICYRESPONSE' => array( - '7.2' => false, - '7.3' => true, - ), - 'LDAP_CONTROL_X_INCREMENTAL_VALUES' => array( - '7.2' => false, - '7.3' => true, - ), - 'LDAP_CONTROL_X_DOMAIN_SCOPE' => array( - '7.2' => false, - '7.3' => true, - ), - 'LDAP_CONTROL_X_PERMISSIVE_MODIFY' => array( - '7.2' => false, - '7.3' => true, - ), - 'LDAP_CONTROL_X_SEARCH_OPTIONS' => array( - '7.2' => false, - '7.3' => true, - ), - 'LDAP_CONTROL_X_TREE_DELETE' => array( - '7.2' => false, - '7.3' => true, - ), - 'LDAP_CONTROL_X_EXTENDED_DN' => array( - '7.2' => false, - '7.3' => true, - ), - 'LDAP_CONTROL_VLVREQUEST' => array( - '7.2' => false, - '7.3' => true, - ), - 'LDAP_CONTROL_VLVRESPONSE' => array( - '7.2' => false, - '7.3' => true, - ), - 'MB_CASE_FOLD' => array( - '7.2' => false, - '7.3' => true, - ), - 'MB_CASE_UPPER_SIMPLE' => array( - '7.2' => false, - '7.3' => true, - ), - 'MB_CASE_LOWER_SIMPLE' => array( - '7.2' => false, - '7.3' => true, - ), - 'MB_CASE_TITLE_SIMPLE' => array( - '7.2' => false, - '7.3' => true, - ), - 'MB_CASE_FOLD_SIMPLE' => array( - '7.2' => false, - '7.3' => true, - ), - 'PGSQL_DIAG_SCHEMA_NAME' => array( - '7.2' => false, - '7.3' => true, - ), - 'PGSQL_DIAG_TABLE_NAME' => array( - '7.2' => false, - '7.3' => true, - ), - 'PGSQL_DIAG_COLUMN_NAME' => array( - '7.2' => false, - '7.3' => true, - ), - 'PGSQL_DIAG_DATATYPE_NAME' => array( - '7.2' => false, - '7.3' => true, - ), - 'PGSQL_DIAG_CONSTRAINT_NAME' => array( - '7.2' => false, - '7.3' => true, - ), - 'PGSQL_DIAG_SEVERITY_NONLOCALIZED' => array( - '7.2' => false, - '7.3' => true, - ), - 'PASSWORD_ARGON2ID' => array( - '7.2' => false, - '7.3' => true, - ), - 'STREAM_CRYPTO_PROTO_SSLv3' => array( - '7.2' => false, - '7.3' => true, - ), - 'STREAM_CRYPTO_PROTO_TLSv1_0' => array( - '7.2' => false, - '7.3' => true, - ), - 'STREAM_CRYPTO_PROTO_TLSv1_1' => array( - '7.2' => false, - '7.3' => true, - ), - 'STREAM_CRYPTO_PROTO_TLSv1_2' => array( - '7.2' => false, - '7.3' => true, - ), - - 'CURL_VERSION_ALTSVC' => array( - '7.3.5' => false, - '7.3.6' => true, - ), - 'CURL_VERSION_CURLDEBUG' => array( - '7.3.5' => false, - '7.3.6' => true, - ), - - 'IMG_FILTER_SCATTER' => array( - '7.3' => false, - '7.4' => true, - ), - 'MB_ONIGURUMA_VERSION' => array( - '7.3' => false, - '7.4' => true, - ), - 'SO_LABEL' => array( - '7.3' => false, - '7.4' => true, - ), - 'SO_PEERLABEL' => array( - '7.3' => false, - '7.4' => true, - ), - 'SO_LISTENQLIMIT' => array( - '7.3' => false, - '7.4' => true, - ), - 'SO_LISTENQLEN' => array( - '7.3' => false, - '7.4' => true, - ), - 'SO_USER_COOKIE' => array( - '7.3' => false, - '7.4' => true, - ), - 'PASSWORD_ARGON2_PROVIDER' => array( - '7.3' => false, - '7.4' => true, - ), - 'PHP_WINDOWS_EVENT_CTRL_C' => array( - '7.3' => false, - '7.4' => true, - ), - 'PHP_WINDOWS_EVENT_CTRL_BREAK' => array( - '7.3' => false, - '7.4' => true, - ), - 'T_BAD_CHARACTER' => array( - '7.3' => false, - '7.4' => true, - ), - 'TIDY_TAG_ARTICLE' => array( - '7.3' => false, - '7.4' => true, - ), - 'TIDY_TAG_ASIDE' => array( - '7.3' => false, - '7.4' => true, - ), - 'TIDY_TAG_AUDIO' => array( - '7.3' => false, - '7.4' => true, - ), - 'TIDY_TAG_BDI' => array( - '7.3' => false, - '7.4' => true, - ), - 'TIDY_TAG_CANVAS' => array( - '7.3' => false, - '7.4' => true, - ), - 'TIDY_TAG_COMMAND' => array( - '7.3' => false, - '7.4' => true, - ), - 'TIDY_TAG_DATALIST' => array( - '7.3' => false, - '7.4' => true, - ), - 'TIDY_TAG_DETAILS' => array( - '7.3' => false, - '7.4' => true, - ), - 'TIDY_TAG_DIALOG' => array( - '7.3' => false, - '7.4' => true, - ), - 'TIDY_TAG_FIGCAPTION' => array( - '7.3' => false, - '7.4' => true, - ), - 'TIDY_TAG_FIGURE' => array( - '7.3' => false, - '7.4' => true, - ), - 'TIDY_TAG_FOOTER' => array( - '7.3' => false, - '7.4' => true, - ), - 'TIDY_TAG_HEADER' => array( - '7.3' => false, - '7.4' => true, - ), - 'TIDY_TAG_HGROUP' => array( - '7.3' => false, - '7.4' => true, - ), - 'TIDY_TAG_MAIN' => array( - '7.3' => false, - '7.4' => true, - ), - 'TIDY_TAG_MARK' => array( - '7.3' => false, - '7.4' => true, - ), - 'TIDY_TAG_MENUITEM' => array( - '7.3' => false, - '7.4' => true, - ), - 'TIDY_TAG_METER' => array( - '7.3' => false, - '7.4' => true, - ), - 'TIDY_TAG_NAV' => array( - '7.3' => false, - '7.4' => true, - ), - 'TIDY_TAG_OUTPUT' => array( - '7.3' => false, - '7.4' => true, - ), - 'TIDY_TAG_PROGRESS' => array( - '7.3' => false, - '7.4' => true, - ), - 'TIDY_TAG_SECTION' => array( - '7.3' => false, - '7.4' => true, - ), - 'TIDY_TAG_SOURCE' => array( - '7.3' => false, - '7.4' => true, - ), - 'TIDY_TAG_SUMMARY' => array( - '7.3' => false, - '7.4' => true, - ), - 'TIDY_TAG_TEMPLATE' => array( - '7.3' => false, - '7.4' => true, - ), - 'TIDY_TAG_TIME' => array( - '7.3' => false, - '7.4' => true, - ), - 'TIDY_TAG_TRACK' => array( - '7.3' => false, - '7.4' => true, - ), - 'TIDY_TAG_VIDEO' => array( - '7.3' => false, - '7.4' => true, - ), - ); - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 8.1.0 - * - * @return array - */ - public function register() - { - return array(\T_STRING); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 8.1.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $constantName = $tokens[$stackPtr]['content']; - - if (isset($this->newConstants[$constantName]) === false) { - return; - } - - if ($this->isUseOfGlobalConstant($phpcsFile, $stackPtr) === false) { - return; - } - - $itemInfo = array( - 'name' => $constantName, - ); - $this->handleFeature($phpcsFile, $stackPtr, $itemInfo); - } - - - /** - * Get the relevant sub-array for a specific item from a multi-dimensional array. - * - * @since 8.1.0 - * - * @param array $itemInfo Base information about the item. - * - * @return array Version and other information about the item. - */ - public function getItemArray(array $itemInfo) - { - return $this->newConstants[$itemInfo['name']]; - } - - - /** - * Get the error message template for this sniff. - * - * @since 8.1.0 - * - * @return string - */ - protected function getErrorMsgTemplate() - { - return 'The constant "%s" is not present in PHP version %s or earlier'; - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Constants/NewMagicClassConstantSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Constants/NewMagicClassConstantSniff.php deleted file mode 100644 index ccd5864..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Constants/NewMagicClassConstantSniff.php +++ /dev/null @@ -1,80 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Constants; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Detect usage of the magic `::class` constant introduced in PHP 5.5. - * - * The special `ClassName::class` constant is available as of PHP 5.5.0, and allows - * for fully qualified class name resolution at compile time. - * - * PHP version 5.5 - * - * @link https://wiki.php.net/rfc/class_name_scalars - * @link https://www.php.net/manual/en/language.oop5.constants.php#example-186 - * - * @since 7.1.4 - * @since 7.1.5 Removed the incorrect checks against invalid usage of the constant. - */ -class NewMagicClassConstantSniff extends Sniff -{ - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 7.1.4 - * - * @return array - */ - public function register() - { - return array(\T_STRING); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 7.1.4 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsBelow('5.4') === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - - if (strtolower($tokens[$stackPtr]['content']) !== 'class') { - return; - } - - $prevToken = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true, null, true); - if ($prevToken === false || $tokens[$prevToken]['code'] !== \T_DOUBLE_COLON) { - return; - } - - $phpcsFile->addError( - 'The magic class constant ClassName::class was not available in PHP 5.4 or earlier', - $stackPtr, - 'Found' - ); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Constants/RemovedConstantsSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Constants/RemovedConstantsSniff.php deleted file mode 100644 index b6c8f8d..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Constants/RemovedConstantsSniff.php +++ /dev/null @@ -1,574 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Constants; - -use PHPCompatibility\AbstractRemovedFeatureSniff; -use PHP_CodeSniffer_File as File; - -/** - * Detect use of deprecated and/or removed PHP native global constants. - * - * PHP version All - * - * @since 8.1.0 - */ -class RemovedConstantsSniff extends AbstractRemovedFeatureSniff -{ - - /** - * A list of removed PHP Constants. - * - * The array lists : version number with false (deprecated) or true (removed). - * If's sufficient to list the first version where the constant was deprecated/removed. - * - * Optional, the array can contain an `alternative` key listing an alternative constant - * to be used instead. - * - * Note: PHP Constants are case-sensitive! - * - * @since 8.1.0 - * - * @var array(string => array(string => bool|string)) - */ - protected $removedConstants = array( - // Disabled since PHP 5.3.0 due to thread safety issues. - 'FILEINFO_COMPRESS' => array( - '5.3' => true, - ), - - 'CURLOPT_CLOSEPOLICY' => array( - '5.6' => true, - ), - 'CURLCLOSEPOLICY_LEAST_RECENTLY_USED' => array( - '5.6' => true, - ), - 'CURLCLOSEPOLICY_LEAST_TRAFFIC' => array( - '5.6' => true, - ), - 'CURLCLOSEPOLICY_SLOWEST' => array( - '5.6' => true, - ), - 'CURLCLOSEPOLICY_CALLBACK' => array( - '5.6' => true, - ), - 'CURLCLOSEPOLICY_OLDEST' => array( - '5.6' => true, - ), - - 'PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT' => array( - '7.0' => true, - ), - 'T_CHARACTER' => array( - '7.0' => true, - ), - 'T_BAD_CHARACTER' => array( - '7.0' => true, - ), - - 'INTL_IDNA_VARIANT_2003' => array( - '7.2' => false, - ), - - 'MCRYPT_MODE_ECB' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_MODE_CBC' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_MODE_CFB' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_MODE_OFB' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_MODE_NOFB' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_MODE_STREAM' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_ENCRYPT' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_DECRYPT' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_DEV_RANDOM' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_DEV_URANDOM' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_RAND' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_3DES' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_ARCFOUR_IV' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_ARCFOUR' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_BLOWFISH' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_CAST_128' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_CAST_256' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_CRYPT' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_DES' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_DES_COMPAT' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_ENIGMA' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_GOST' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_IDEA' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_LOKI97' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_MARS' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_PANAMA' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_RIJNDAEL_128' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_RIJNDAEL_192' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_RIJNDAEL_256' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_RC2' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_RC4' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_RC6' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_RC6_128' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_RC6_192' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_RC6_256' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_SAFER64' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_SAFER128' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_SAFERPLUS' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_SERPENT' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_SERPENT_128' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_SERPENT_192' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_SERPENT_256' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_SKIPJACK' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_TEAN' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_THREEWAY' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_TRIPLEDES' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_TWOFISH' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_TWOFISH128' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_TWOFISH192' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_TWOFISH256' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_WAKE' => array( - '7.1' => false, - '7.2' => true, - ), - 'MCRYPT_XTEA' => array( - '7.1' => false, - '7.2' => true, - ), - - 'PHPDBG_FILE' => array( - '7.3' => true, - ), - 'PHPDBG_METHOD' => array( - '7.3' => true, - ), - 'PHPDBG_LINENO' => array( - '7.3' => true, - ), - 'PHPDBG_FUNC' => array( - '7.3' => true, - ), - 'FILTER_FLAG_SCHEME_REQUIRED' => array( - '7.3' => false, - ), - 'FILTER_FLAG_HOST_REQUIRED' => array( - '7.3' => false, - ), - - 'CURLPIPE_HTTP1' => array( - '7.4' => false, - ), - 'FILTER_SANITIZE_MAGIC_QUOTES' => array( - '7.4' => false, - 'alternative' => 'FILTER_SANITIZE_ADD_SLASHES', - ), - 'IBASE_BKP_CONVERT' => array( - '7.4' => true, - ), - 'IBASE_BKP_IGNORE_CHECKSUMS' => array( - '7.4' => true, - ), - 'IBASE_BKP_IGNORE_LIMBO' => array( - '7.4' => true, - ), - 'IBASE_BKP_METADATA_ONLY' => array( - '7.4' => true, - ), - 'IBASE_BKP_NO_GARBAGE_COLLECT' => array( - '7.4' => true, - ), - 'IBASE_BKP_NON_TRANSPORTABLE' => array( - '7.4' => true, - ), - 'IBASE_BKP_OLD_DESCRIPTIONS' => array( - '7.4' => true, - ), - 'IBASE_COMMITTED' => array( - '7.4' => true, - ), - 'IBASE_CONCURRENCY' => array( - '7.4' => true, - ), - 'IBASE_CONSISTENCY' => array( - '7.4' => true, - ), - 'IBASE_DEFAULT' => array( - '7.4' => true, - ), - 'IBASE_FETCH_ARRAYS' => array( - '7.4' => true, - ), - 'IBASE_FETCH_BLOBS' => array( - '7.4' => true, - ), - 'IBASE_NOWAIT' => array( - '7.4' => true, - ), - 'IBASE_PRP_ACCESS_MODE' => array( - '7.4' => true, - ), - 'IBASE_PRP_ACTIVATE' => array( - '7.4' => true, - ), - 'IBASE_PRP_AM_READONLY' => array( - '7.4' => true, - ), - 'IBASE_PRP_AM_READWRITE' => array( - '7.4' => true, - ), - 'IBASE_PRP_DENY_NEW_ATTACHMENTS' => array( - '7.4' => true, - ), - 'IBASE_PRP_DENY_NEW_TRANSACTIONS' => array( - '7.4' => true, - ), - 'IBASE_PRP_DB_ONLINE' => array( - '7.4' => true, - ), - 'IBASE_PRP_PAGE_BUFFERS' => array( - '7.4' => true, - ), - 'IBASE_PRP_RES' => array( - '7.4' => true, - ), - 'IBASE_PRP_RES_USE_FULL' => array( - '7.4' => true, - ), - 'IBASE_PRP_RESERVE_SPACE' => array( - '7.4' => true, - ), - 'IBASE_PRP_SET_SQL_DIALECT' => array( - '7.4' => true, - ), - 'IBASE_PRP_SHUTDOWN_DB' => array( - '7.4' => true, - ), - 'IBASE_PRP_SWEEP_INTERVAL' => array( - '7.4' => true, - ), - 'IBASE_PRP_WM_ASYNC' => array( - '7.4' => true, - ), - 'IBASE_PRP_WM_SYNC' => array( - '7.4' => true, - ), - 'IBASE_PRP_WRITE_MODE' => array( - '7.4' => true, - ), - 'IBASE_READ' => array( - '7.4' => true, - ), - 'IBASE_RES_CREATE' => array( - '7.4' => true, - ), - 'IBASE_RES_DEACTIVATE_IDX' => array( - '7.4' => true, - ), - 'IBASE_RES_NO_SHADOW' => array( - '7.4' => true, - ), - 'IBASE_RES_NO_VALIDITY' => array( - '7.4' => true, - ), - 'IBASE_RES_ONE_AT_A_TIME' => array( - '7.4' => true, - ), - 'IBASE_RES_REPLACE' => array( - '7.4' => true, - ), - 'IBASE_RES_USE_ALL_SPACE' => array( - '7.4' => true, - ), - 'IBASE_RPR_CHECK_DB' => array( - '7.4' => true, - ), - 'IBASE_RPR_FULL' => array( - '7.4' => true, - ), - 'IBASE_RPR_IGNORE_CHECKSUM' => array( - '7.4' => true, - ), - 'IBASE_RPR_KILL_SHADOWS' => array( - '7.4' => true, - ), - 'IBASE_RPR_MEND_DB' => array( - '7.4' => true, - ), - 'IBASE_RPR_SWEEP_DB' => array( - '7.4' => true, - ), - 'IBASE_RPR_VALIDATE_DB' => array( - '7.4' => true, - ), - 'IBASE_STS_DATA_PAGES' => array( - '7.4' => true, - ), - 'IBASE_STS_DB_LOG' => array( - '7.4' => true, - ), - 'IBASE_STS_HDR_PAGES' => array( - '7.4' => true, - ), - 'IBASE_STS_IDX_PAGES' => array( - '7.4' => true, - ), - 'IBASE_STS_SYS_RELATIONS' => array( - '7.4' => true, - ), - 'IBASE_SVC_GET_ENV' => array( - '7.4' => true, - ), - 'IBASE_SVC_GET_ENV_LOCK' => array( - '7.4' => true, - ), - 'IBASE_SVC_GET_ENV_MSG' => array( - '7.4' => true, - ), - 'IBASE_SVC_GET_USERS' => array( - '7.4' => true, - ), - 'IBASE_SVC_IMPLEMENTATION' => array( - '7.4' => true, - ), - 'IBASE_SVC_SERVER_VERSION' => array( - '7.4' => true, - ), - 'IBASE_SVC_SVR_DB_INFO' => array( - '7.4' => true, - ), - 'IBASE_SVC_USER_DBPATH' => array( - '7.4' => true, - ), - 'IBASE_UNIXTIME' => array( - '7.4' => true, - ), - 'IBASE_WAIT' => array( - '7.4' => true, - ), - 'IBASE_WRITE' => array( - '7.4' => true, - ), - ); - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 8.1.0 - * - * @return array - */ - public function register() - { - return array(\T_STRING); - } - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 8.1.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $constantName = $tokens[$stackPtr]['content']; - - if (isset($this->removedConstants[$constantName]) === false) { - return; - } - - if ($this->isUseOfGlobalConstant($phpcsFile, $stackPtr) === false) { - return; - } - - $itemInfo = array( - 'name' => $constantName, - ); - $this->handleFeature($phpcsFile, $stackPtr, $itemInfo); - } - - - /** - * Get the relevant sub-array for a specific item from a multi-dimensional array. - * - * @since 8.1.0 - * - * @param array $itemInfo Base information about the item. - * - * @return array Version and other information about the item. - */ - public function getItemArray(array $itemInfo) - { - return $this->removedConstants[$itemInfo['name']]; - } - - - /** - * Get the error message template for this sniff. - * - * @since 8.1.0 - * - * @return string - */ - protected function getErrorMsgTemplate() - { - return 'The constant "%s" is '; - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ControlStructures/DiscouragedSwitchContinueSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ControlStructures/DiscouragedSwitchContinueSniff.php deleted file mode 100644 index 8d56b93..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ControlStructures/DiscouragedSwitchContinueSniff.php +++ /dev/null @@ -1,238 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\ControlStructures; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Detect use of `continue` in `switch` control structures. - * - * As of PHP 7.3, PHP will throw a warning when `continue` is used to target a `switch` - * control structure. - * The sniff takes numeric arguments used with `continue` into account. - * - * PHP version 7.3 - * - * @link https://www.php.net/manual/en/migration73.incompatible.php#migration73.incompatible.core.continue-targeting-switch - * @link https://wiki.php.net/rfc/continue_on_switch_deprecation - * @link https://github.com/php/php-src/commit/04e3523b7d095341f65ed5e71a3cac82fca690e4 - * (actual implementation which is different from the RFC). - * @link https://www.php.net/manual/en/control-structures.switch.php - * - * @since 8.2.0 - */ -class DiscouragedSwitchContinueSniff extends Sniff -{ - - /** - * Token codes of control structures which can be targeted using continue. - * - * @since 8.2.0 - * - * @var array - */ - protected $loopStructures = array( - \T_FOR => \T_FOR, - \T_FOREACH => \T_FOREACH, - \T_WHILE => \T_WHILE, - \T_DO => \T_DO, - \T_SWITCH => \T_SWITCH, - ); - - /** - * Tokens which start a new case within a switch. - * - * @since 8.2.0 - * - * @var array - */ - protected $caseTokens = array( - \T_CASE => \T_CASE, - \T_DEFAULT => \T_DEFAULT, - ); - - /** - * Token codes which are accepted to determine the level for the continue. - * - * This array is enriched with the arithmetic operators in the register() method. - * - * @since 8.2.0 - * - * @var array - */ - protected $acceptedLevelTokens = array( - \T_LNUMBER => \T_LNUMBER, - \T_OPEN_PARENTHESIS => \T_OPEN_PARENTHESIS, - \T_CLOSE_PARENTHESIS => \T_CLOSE_PARENTHESIS, - ); - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 8.2.0 - * - * @return array - */ - public function register() - { - $this->acceptedLevelTokens += Tokens::$arithmeticTokens; - $this->acceptedLevelTokens += Tokens::$emptyTokens; - - return array(\T_SWITCH); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 8.2.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsAbove('7.3') === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['scope_opener'], $tokens[$stackPtr]['scope_closer']) === false) { - return; - } - - $switchOpener = $tokens[$stackPtr]['scope_opener']; - $switchCloser = $tokens[$stackPtr]['scope_closer']; - - // Quick check whether we need to bother with the more complex logic. - $hasContinue = $phpcsFile->findNext(\T_CONTINUE, ($switchOpener + 1), $switchCloser); - if ($hasContinue === false) { - return; - } - - $caseDefault = $switchOpener; - - do { - $caseDefault = $phpcsFile->findNext($this->caseTokens, ($caseDefault + 1), $switchCloser); - if ($caseDefault === false) { - break; - } - - if (isset($tokens[$caseDefault]['scope_opener']) === false) { - // Unknown start of the case, skip. - continue; - } - - $caseOpener = $tokens[$caseDefault]['scope_opener']; - $nextCaseDefault = $phpcsFile->findNext($this->caseTokens, ($caseDefault + 1), $switchCloser); - if ($nextCaseDefault === false) { - $caseCloser = $switchCloser; - } else { - $caseCloser = $nextCaseDefault; - } - - // Check for unscoped control structures within the case. - $controlStructure = $caseOpener; - $doCount = 0; - while (($controlStructure = $phpcsFile->findNext($this->loopStructures, ($controlStructure + 1), $caseCloser)) !== false) { - if ($tokens[$controlStructure]['code'] === \T_DO) { - $doCount++; - } - - if (isset($tokens[$controlStructure]['scope_opener'], $tokens[$controlStructure]['scope_closer']) === false) { - if ($tokens[$controlStructure]['code'] === \T_WHILE && $doCount > 0) { - // While in a do-while construct. - $doCount--; - continue; - } - - // Control structure without braces found within the case, ignore this case. - continue 2; - } - } - - // Examine the contents of the case. - $continue = $caseOpener; - - do { - $continue = $phpcsFile->findNext(\T_CONTINUE, ($continue + 1), $caseCloser); - if ($continue === false) { - break; - } - - $nextSemicolon = $phpcsFile->findNext(array(\T_SEMICOLON, \T_CLOSE_TAG), ($continue + 1), $caseCloser); - $codeString = ''; - for ($i = ($continue + 1); $i < $nextSemicolon; $i++) { - if (isset($this->acceptedLevelTokens[$tokens[$i]['code']]) === false) { - // Function call/variable or other token which make numeric level impossible to determine. - continue 2; - } - - if (isset(Tokens::$emptyTokens[$tokens[$i]['code']]) === true) { - continue; - } - - $codeString .= $tokens[$i]['content']; - } - - $level = null; - if ($codeString !== '') { - if (is_numeric($codeString)) { - $level = (int) $codeString; - } else { - // With the above logic, the string can only contain digits and operators, eval! - $level = eval("return ( $codeString );"); - } - } - - if (isset($level) === false || $level === 0) { - $level = 1; - } - - // Examine which control structure is being targeted by the continue statement. - if (isset($tokens[$continue]['conditions']) === false) { - continue; - } - - $conditions = array_reverse($tokens[$continue]['conditions'], true); - // PHPCS adds more structures to the conditions array than we want to take into - // consideration, so clean up the array. - foreach ($conditions as $tokenPtr => $tokenCode) { - if (isset($this->loopStructures[$tokenCode]) === false) { - unset($conditions[$tokenPtr]); - } - } - - $targetCondition = \array_slice($conditions, ($level - 1), 1, true); - if (empty($targetCondition)) { - continue; - } - - $conditionToken = key($targetCondition); - if ($conditionToken === $stackPtr) { - $phpcsFile->addWarning( - "Targeting a 'switch' control structure with a 'continue' statement is strongly discouraged and will throw a warning as of PHP 7.3.", - $continue, - 'Found' - ); - } - - } while ($continue < $caseCloser); - - } while ($caseDefault < $switchCloser); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ControlStructures/ForbiddenBreakContinueOutsideLoopSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ControlStructures/ForbiddenBreakContinueOutsideLoopSniff.php deleted file mode 100644 index 2cfbcc5..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ControlStructures/ForbiddenBreakContinueOutsideLoopSniff.php +++ /dev/null @@ -1,116 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\ControlStructures; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; - -/** - * Detect using `break` and/or `continue` statements outside of a looping structure. - * - * PHP version 7.0 - * - * @link https://www.php.net/manual/en/migration70.incompatible.php#migration70.incompatible.other.break-continue - * @link https://www.php.net/manual/en/control-structures.break.php - * @link https://www.php.net/manual/en/control-structures.continue.php - * - * @since 7.0.7 - */ -class ForbiddenBreakContinueOutsideLoopSniff extends Sniff -{ - - /** - * Token codes of control structure in which usage of break/continue is valid. - * - * @since 7.0.7 - * - * @var array - */ - protected $validLoopStructures = array( - \T_FOR => true, - \T_FOREACH => true, - \T_WHILE => true, - \T_DO => true, - \T_SWITCH => true, - ); - - /** - * Token codes which did not correctly get a condition assigned in older PHPCS versions. - * - * @since 7.0.7 - * - * @var array - */ - protected $backCompat = array( - \T_CASE => true, - \T_DEFAULT => true, - ); - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 7.0.7 - * - * @return array - */ - public function register() - { - return array( - \T_BREAK, - \T_CONTINUE, - ); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 7.0.7 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $token = $tokens[$stackPtr]; - - // Check if the break/continue is within a valid loop structure. - if (empty($token['conditions']) === false) { - foreach ($token['conditions'] as $tokenCode) { - if (isset($this->validLoopStructures[$tokenCode]) === true) { - return; - } - } - } else { - // Deal with older PHPCS versions. - if (isset($token['scope_condition']) === true && isset($this->backCompat[$tokens[$token['scope_condition']]['code']]) === true) { - return; - } - } - - // If we're still here, no valid loop structure container has been found, so throw an error. - $error = "Using '%s' outside of a loop or switch structure is invalid"; - $isError = false; - $errorCode = 'Found'; - $data = array($token['content']); - - if ($this->supportsAbove('7.0')) { - $error .= ' and will throw a fatal error since PHP 7.0'; - $isError = true; - $errorCode = 'FatalError'; - } - - $this->addMessage($phpcsFile, $error, $stackPtr, $isError, $errorCode, $data); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ControlStructures/ForbiddenBreakContinueVariableArgumentsSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ControlStructures/ForbiddenBreakContinueVariableArgumentsSniff.php deleted file mode 100644 index f63c848..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ControlStructures/ForbiddenBreakContinueVariableArgumentsSniff.php +++ /dev/null @@ -1,110 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\ControlStructures; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Detects using 0 and variable numeric arguments on `break` and `continue` statements. - * - * This sniff checks for: - * - Using `break` and/or `continue` with a variable as the numeric argument. - * - Using `break` and/or `continue` with a zero - 0 - as the numeric argument. - * - * PHP version 5.4 - * - * @link https://www.php.net/manual/en/migration54.incompatible.php - * @link https://www.php.net/manual/en/control-structures.break.php - * @link https://www.php.net/manual/en/control-structures.continue.php - * - * @since 5.5 - * @since 5.6 Now extends the base `Sniff` class. - */ -class ForbiddenBreakContinueVariableArgumentsSniff extends Sniff -{ - /** - * Error types this sniff handles for forbidden break/continue arguments. - * - * Array key is the error code. Array value will be used as part of the error message. - * - * @since 7.0.5 - * @since 7.1.0 Changed from class constants to property. - * - * @var array - */ - private $errorTypes = array( - 'variableArgument' => 'a variable argument', - 'zeroArgument' => '0 as an argument', - ); - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 5.5 - * - * @return array - */ - public function register() - { - return array(\T_BREAK, \T_CONTINUE); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 5.5 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsAbove('5.4') === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - $nextSemicolonToken = $phpcsFile->findNext(array(\T_SEMICOLON, \T_CLOSE_TAG), ($stackPtr), null, false); - $errorType = ''; - for ($curToken = $stackPtr + 1; $curToken < $nextSemicolonToken; $curToken++) { - if ($tokens[$curToken]['type'] === 'T_STRING') { - // If the next non-whitespace token after the string - // is an opening parenthesis then it's a function call. - $openBracket = $phpcsFile->findNext(Tokens::$emptyTokens, $curToken + 1, null, true); - if ($tokens[$openBracket]['code'] === \T_OPEN_PARENTHESIS) { - $errorType = 'variableArgument'; - break; - } - - } elseif (\in_array($tokens[$curToken]['type'], array('T_VARIABLE', 'T_FUNCTION', 'T_CLOSURE'), true)) { - $errorType = 'variableArgument'; - break; - - } elseif ($tokens[$curToken]['type'] === 'T_LNUMBER' && $tokens[$curToken]['content'] === '0') { - $errorType = 'zeroArgument'; - break; - } - } - - if ($errorType !== '') { - $error = 'Using %s on break or continue is forbidden since PHP 5.4'; - $errorCode = $errorType . 'Found'; - $data = array($this->errorTypes[$errorType]); - - $phpcsFile->addError($error, $stackPtr, $errorCode, $data); - } - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ControlStructures/ForbiddenSwitchWithMultipleDefaultBlocksSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ControlStructures/ForbiddenSwitchWithMultipleDefaultBlocksSniff.php deleted file mode 100644 index 26f41c0..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ControlStructures/ForbiddenSwitchWithMultipleDefaultBlocksSniff.php +++ /dev/null @@ -1,81 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\ControlStructures; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; - -/** - * Switch statements can not have multiple default blocks since PHP 7.0. - * - * PHP version 7.0 - * - * @link https://wiki.php.net/rfc/switch.default.multiple - * @link https://www.php.net/manual/en/control-structures.switch.php - * - * @since 7.0.0 - */ -class ForbiddenSwitchWithMultipleDefaultBlocksSniff extends Sniff -{ - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 7.0.0 - * - * @return array - */ - public function register() - { - return array(\T_SWITCH); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 7.0.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsAbove('7.0') === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - if (isset($tokens[$stackPtr]['scope_closer']) === false) { - return; - } - - $defaultToken = $stackPtr; - $defaultCount = 0; - $targetLevel = $tokens[$stackPtr]['level'] + 1; - while ($defaultCount < 2 && ($defaultToken = $phpcsFile->findNext(array(\T_DEFAULT), $defaultToken + 1, $tokens[$stackPtr]['scope_closer'])) !== false) { - // Same level or one below (= two default cases after each other). - if ($tokens[$defaultToken]['level'] === $targetLevel || $tokens[$defaultToken]['level'] === ($targetLevel + 1)) { - $defaultCount++; - } - } - - if ($defaultCount > 1) { - $phpcsFile->addError( - 'Switch statements can not have multiple default blocks since PHP 7.0', - $stackPtr, - 'Found' - ); - } - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ControlStructures/NewExecutionDirectivesSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ControlStructures/NewExecutionDirectivesSniff.php deleted file mode 100644 index 0e71a26..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ControlStructures/NewExecutionDirectivesSniff.php +++ /dev/null @@ -1,378 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\ControlStructures; - -use PHPCompatibility\AbstractNewFeatureSniff; -use PHPCompatibility\PHPCSHelper; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Check for valid execution directives set with `declare()`. - * - * The sniff contains three distinct checks: - * - Check if the execution directive used is valid. PHP currently only supports - * three execution directives. - * - Check if the execution directive used is available in the PHP versions - * for which support is being checked. - * In the case of the `encoding` directive on PHP 5.3, support is conditional - * on the `--enable-zend-multibyte` compilation option. This will be indicated as such. - * - Check whether the value for the directive is valid. - * - * PHP version All - * - * @link https://www.php.net/manual/en/control-structures.declare.php - * @link https://wiki.php.net/rfc/scalar_type_hints_v5#strict_types_declare_directive - * - * @since 7.0.3 - * @since 7.1.0 Now extends the `AbstractNewFeatureSniff` instead of the base `Sniff` class. - */ -class NewExecutionDirectivesSniff extends AbstractNewFeatureSniff -{ - - /** - * A list of new execution directives - * - * The array lists : version number with false (not present) or true (present). - * If the execution order is conditional, add the condition as a string to the version nr. - * If's sufficient to list the first version where the execution directive appears. - * - * @since 7.0.3 - * - * @var array(string => array(string => bool|string|array)) - */ - protected $newDirectives = array( - 'ticks' => array( - '3.1' => false, - '4.0' => true, - 'valid_value_callback' => 'isNumeric', - ), - 'encoding' => array( - '5.2' => false, - '5.3' => '--enable-zend-multibyte', // Directive ignored unless. - '5.4' => true, - 'valid_value_callback' => 'validEncoding', - ), - 'strict_types' => array( - '5.6' => false, - '7.0' => true, - 'valid_values' => array(1), - ), - ); - - - /** - * Tokens to ignore when trying to find the value for the directive. - * - * @since 7.0.3 - * - * @var array - */ - protected $ignoreTokens = array(); - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 7.0.3 - * - * @return array - */ - public function register() - { - $this->ignoreTokens = Tokens::$emptyTokens; - $this->ignoreTokens[\T_EQUAL] = \T_EQUAL; - - return array(\T_DECLARE); - } - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 7.0.3 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['parenthesis_opener'], $tokens[$stackPtr]['parenthesis_closer']) === true) { - $openParenthesis = $tokens[$stackPtr]['parenthesis_opener']; - $closeParenthesis = $tokens[$stackPtr]['parenthesis_closer']; - } else { - if (version_compare(PHPCSHelper::getVersion(), '2.3.4', '>=')) { - return; - } - - // Deal with PHPCS 2.3.0-2.3.3 which do not yet set the parenthesis properly for declare statements. - $openParenthesis = $phpcsFile->findNext(\T_OPEN_PARENTHESIS, ($stackPtr + 1), null, false, null, true); - if ($openParenthesis === false || isset($tokens[$openParenthesis]['parenthesis_closer']) === false) { - return; - } - $closeParenthesis = $tokens[$openParenthesis]['parenthesis_closer']; - } - - $directivePtr = $phpcsFile->findNext(\T_STRING, ($openParenthesis + 1), $closeParenthesis, false); - if ($directivePtr === false) { - return; - } - - $directiveContent = $tokens[$directivePtr]['content']; - - if (isset($this->newDirectives[$directiveContent]) === false) { - $error = 'Declare can only be used with the directives %s. Found: %s'; - $data = array( - implode(', ', array_keys($this->newDirectives)), - $directiveContent, - ); - - $phpcsFile->addError($error, $stackPtr, 'InvalidDirectiveFound', $data); - - } else { - // Check for valid directive for version. - $itemInfo = array( - 'name' => $directiveContent, - ); - $this->handleFeature($phpcsFile, $stackPtr, $itemInfo); - - // Check for valid directive value. - $valuePtr = $phpcsFile->findNext($this->ignoreTokens, $directivePtr + 1, $closeParenthesis, true); - if ($valuePtr === false) { - return; - } - - $this->addWarningOnInvalidValue($phpcsFile, $valuePtr, $directiveContent); - } - } - - - /** - * Determine whether an error/warning should be thrown for an item based on collected information. - * - * @since 7.1.0 - * - * @param array $errorInfo Detail information about an item. - * - * @return bool - */ - protected function shouldThrowError(array $errorInfo) - { - return ($errorInfo['not_in_version'] !== '' || $errorInfo['conditional_version'] !== ''); - } - - - /** - * Get the relevant sub-array for a specific item from a multi-dimensional array. - * - * @since 7.1.0 - * - * @param array $itemInfo Base information about the item. - * - * @return array Version and other information about the item. - */ - public function getItemArray(array $itemInfo) - { - return $this->newDirectives[$itemInfo['name']]; - } - - - /** - * Get an array of the non-PHP-version array keys used in a sub-array. - * - * @since 7.1.0 - * - * @return array - */ - protected function getNonVersionArrayKeys() - { - return array( - 'valid_value_callback', - 'valid_values', - ); - } - - - /** - * Retrieve the relevant detail (version) information for use in an error message. - * - * @since 7.1.0 - * - * @param array $itemArray Version and other information about the item. - * @param array $itemInfo Base information about the item. - * - * @return array - */ - public function getErrorInfo(array $itemArray, array $itemInfo) - { - $errorInfo = parent::getErrorInfo($itemArray, $itemInfo); - $errorInfo['conditional_version'] = ''; - $errorInfo['condition'] = ''; - - $versionArray = $this->getVersionArray($itemArray); - - if (empty($versionArray) === false) { - foreach ($versionArray as $version => $present) { - if (\is_string($present) === true && $this->supportsBelow($version) === true) { - // We cannot test for compilation option (ok, except by scraping the output of phpinfo...). - $errorInfo['conditional_version'] = $version; - $errorInfo['condition'] = $present; - } - } - } - - return $errorInfo; - } - - - /** - * Get the error message template for this sniff. - * - * @since 7.1.0 - * - * @return string - */ - protected function getErrorMsgTemplate() - { - return 'Directive ' . parent::getErrorMsgTemplate(); - } - - - /** - * Generates the error or warning for this item. - * - * @since 7.0.3 - * @since 7.1.0 This method now overloads the method from the `AbstractNewFeatureSniff` class. - * - Renamed from `maybeAddError()` to `addError()`. - * - Changed visibility from `protected` to `public`. - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the relevant token in - * the stack. - * @param array $itemInfo Base information about the item. - * @param array $errorInfo Array with detail (version) information - * relevant to the item. - * - * @return void - */ - public function addError(File $phpcsFile, $stackPtr, array $itemInfo, array $errorInfo) - { - if ($errorInfo['not_in_version'] !== '') { - parent::addError($phpcsFile, $stackPtr, $itemInfo, $errorInfo); - } elseif ($errorInfo['conditional_version'] !== '') { - $error = 'Directive %s is present in PHP version %s but will be disregarded unless PHP is compiled with %s'; - $errorCode = $this->stringToErrorCode($itemInfo['name']) . 'WithConditionFound'; - $data = array( - $itemInfo['name'], - $errorInfo['conditional_version'], - $errorInfo['condition'], - ); - - $phpcsFile->addWarning($error, $stackPtr, $errorCode, $data); - } - } - - - /** - * Generates a error or warning for this sniff. - * - * @since 7.0.3 - * @since 7.0.6 Renamed from `addErrorOnInvalidValue()` to `addWarningOnInvalidValue()`. - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the execution directive value - * in the token array. - * @param string $directive The directive. - * - * @return void - */ - protected function addWarningOnInvalidValue(File $phpcsFile, $stackPtr, $directive) - { - $tokens = $phpcsFile->getTokens(); - - $value = $tokens[$stackPtr]['content']; - if (isset(Tokens::$stringTokens[$tokens[$stackPtr]['code']]) === true) { - $value = $this->stripQuotes($value); - } - - $isError = false; - if (isset($this->newDirectives[$directive]['valid_values'])) { - if (\in_array($value, $this->newDirectives[$directive]['valid_values']) === false) { - $isError = true; - } - } elseif (isset($this->newDirectives[$directive]['valid_value_callback'])) { - $valid = \call_user_func(array($this, $this->newDirectives[$directive]['valid_value_callback']), $value); - if ($valid === false) { - $isError = true; - } - } - - if ($isError === true) { - $error = 'The execution directive %s does not seem to have a valid value. Please review. Found: %s'; - $errorCode = $this->stringToErrorCode($directive) . 'InvalidValueFound'; - $data = array( - $directive, - $value, - ); - - $phpcsFile->addWarning($error, $stackPtr, $errorCode, $data); - } - } - - - /** - * Check whether a value is numeric. - * - * Callback function to test whether the value for an execution directive is valid. - * - * @since 7.0.3 - * - * @param mixed $value The value to test. - * - * @return bool - */ - protected function isNumeric($value) - { - return is_numeric($value); - } - - - /** - * Check whether a value is a valid encoding. - * - * Callback function to test whether the value for an execution directive is valid. - * - * @since 7.0.3 - * - * @param mixed $value The value to test. - * - * @return bool - */ - protected function validEncoding($value) - { - static $encodings; - if (isset($encodings) === false && function_exists('mb_list_encodings')) { - $encodings = mb_list_encodings(); - } - - if (empty($encodings) || \is_array($encodings) === false) { - // If we can't test the encoding, let it pass through. - return true; - } - - return \in_array($value, $encodings, true); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ControlStructures/NewForeachExpressionReferencingSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ControlStructures/NewForeachExpressionReferencingSniff.php deleted file mode 100644 index a222769..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ControlStructures/NewForeachExpressionReferencingSniff.php +++ /dev/null @@ -1,99 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\ControlStructures; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; - -/** - * Detect `foreach` expression referencing. - * - * Before PHP 5.5.0, referencing `$value` in a `foreach` was only possible - * if the iterated array could be referenced (i.e. if it is a variable). - * - * PHP version 5.5 - * - * @link https://www.php.net/manual/en/control-structures.foreach.php - * - * @since 9.0.0 - */ -class NewForeachExpressionReferencingSniff extends Sniff -{ - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 9.0.0 - * - * @return array - */ - public function register() - { - return array(\T_FOREACH); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 9.0.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsBelow('5.4') === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['parenthesis_opener'], $tokens[$stackPtr]['parenthesis_closer']) === false) { - return; - } - - $opener = $tokens[$stackPtr]['parenthesis_opener']; - $closer = $tokens[$stackPtr]['parenthesis_closer']; - - $asToken = $phpcsFile->findNext(\T_AS, ($opener + 1), $closer); - if ($asToken === false) { - return; - } - - /* - * Note: referencing $key is not allowed in any version, so this should only find referenced $values. - * If it does find a referenced key, it would be a parse error anyway. - */ - $hasReference = $phpcsFile->findNext(\T_BITWISE_AND, ($asToken + 1), $closer); - if ($hasReference === false) { - return; - } - - $nestingLevel = 0; - if ($asToken !== ($opener + 1) && isset($tokens[$opener + 1]['nested_parenthesis'])) { - $nestingLevel = \count($tokens[$opener + 1]['nested_parenthesis']); - } - - if ($this->isVariable($phpcsFile, ($opener + 1), $asToken, $nestingLevel) === true) { - return; - } - - // Non-variable detected before the `as` keyword. - $phpcsFile->addError( - 'Referencing $value is only possible if the iterated array is a variable in PHP 5.4 or earlier.', - $hasReference, - 'Found' - ); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ControlStructures/NewListInForeachSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ControlStructures/NewListInForeachSniff.php deleted file mode 100644 index 2398cf1..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ControlStructures/NewListInForeachSniff.php +++ /dev/null @@ -1,84 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\ControlStructures; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; - -/** - * Detect unpacking nested arrays with `list()` in a `foreach()` as available since PHP 5.5. - * - * PHP version 5.5 - * - * @link https://www.php.net/manual/en/migration55.new-features.php#migration55.new-features.foreach-list - * @link https://wiki.php.net/rfc/foreachlist - * @link https://www.php.net/manual/en/control-structures.foreach.php#control-structures.foreach.list - * - * @since 9.0.0 - */ -class NewListInForeachSniff extends Sniff -{ - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 9.0.0 - * - * @return array - */ - public function register() - { - return array(\T_FOREACH); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 9.0.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsBelow('5.4') === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['parenthesis_opener'], $tokens[$stackPtr]['parenthesis_closer']) === false) { - return; - } - - $opener = $tokens[$stackPtr]['parenthesis_opener']; - $closer = $tokens[$stackPtr]['parenthesis_closer']; - - $asToken = $phpcsFile->findNext(\T_AS, ($opener + 1), $closer); - if ($asToken === false) { - return; - } - - $hasList = $phpcsFile->findNext(array(\T_LIST, \T_OPEN_SHORT_ARRAY), ($asToken + 1), $closer); - if ($hasList === false) { - return; - } - - $phpcsFile->addError( - 'Unpacking nested arrays with list() in a foreach is not supported in PHP 5.4 or earlier.', - $hasList, - 'Found' - ); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ControlStructures/NewMultiCatchSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ControlStructures/NewMultiCatchSniff.php deleted file mode 100644 index 256f37f..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ControlStructures/NewMultiCatchSniff.php +++ /dev/null @@ -1,78 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\ControlStructures; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; - -/** - * Catching multiple exception types in one statement is available since PHP 7.1. - * - * PHP version 7.1 - * - * @link https://www.php.net/manual/en/migration71.new-features.php#migration71.new-features.mulit-catch-exception-handling - * @link https://wiki.php.net/rfc/multiple-catch - * @link https://www.php.net/manual/en/language.exceptions.php#language.exceptions.catch - * - * @since 7.0.7 - */ -class NewMultiCatchSniff extends Sniff -{ - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 7.0.7 - * - * @return array - */ - public function register() - { - return array(\T_CATCH); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 7.0.7 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsBelow('7.0') === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - $token = $tokens[$stackPtr]; - - // Bow out during live coding. - if (isset($token['parenthesis_opener'], $token['parenthesis_closer']) === false) { - return; - } - - $hasBitwiseOr = $phpcsFile->findNext(\T_BITWISE_OR, $token['parenthesis_opener'], $token['parenthesis_closer']); - - if ($hasBitwiseOr === false) { - return; - } - - $phpcsFile->addError( - 'Catching multiple exceptions within one statement is not supported in PHP 7.0 or earlier.', - $hasBitwiseOr, - 'Found' - ); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Extensions/RemovedExtensionsSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Extensions/RemovedExtensionsSniff.php deleted file mode 100644 index 13f5dfc..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Extensions/RemovedExtensionsSniff.php +++ /dev/null @@ -1,346 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Extensions; - -use PHPCompatibility\AbstractRemovedFeatureSniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Detect the use of deprecated and/or removed PHP extensions. - * - * This sniff examines function calls made and flags function calls to functions - * prefixed with the dedicated prefix from a deprecated/removed native PHP extension. - * - * Suggests alternative extensions if available. - * - * As userland functions may be prefixed with a prefix also used by a native - * PHP extension, the sniff offers the ability to whitelist specific functions - * from being flagged by this sniff via a property in a custom ruleset - * (since PHPCompatibility 7.0.2). - * - * {@internal This sniff is a candidate for removal once all functions from all - * deprecated/removed extensions have been added to the RemovedFunctions sniff.} - * - * PHP version All - * - * @since 5.5 - * @since 7.1.0 Now extends the `AbstractRemovedFeatureSniff` instead of the base `Sniff` class. - */ -class RemovedExtensionsSniff extends AbstractRemovedFeatureSniff -{ - /** - * A list of functions to whitelist, if any. - * - * This is intended for projects using functions which start with the same - * prefix as one of the removed extensions. - * - * This property can be set from the ruleset, like so: - * <rule ref="PHPCompatibility.Extensions.RemovedExtensions"> - * <properties> - * <property name="functionWhitelist" type="array" value="mysql_to_rfc3339,mysql_another_function" /> - * </properties> - * </rule> - * - * @since 7.0.2 - * - * @var array - */ - public $functionWhitelist; - - /** - * A list of removed extensions with their alternative, if any. - * - * The array lists : version number with false (deprecated) and true (removed). - * If's sufficient to list the first version where the extension was deprecated/removed. - * - * @since 5.5 - * - * @var array(string => array(string => bool|string|null)) - */ - protected $removedExtensions = array( - 'activescript' => array( - '5.1' => true, - 'alternative' => 'pecl/activescript', - ), - 'cpdf' => array( - '5.1' => true, - 'alternative' => 'pecl/pdflib', - ), - 'dbase' => array( - '5.3' => true, - 'alternative' => null, - ), - 'dbx' => array( - '5.1' => true, - 'alternative' => 'pecl/dbx', - ), - 'dio' => array( - '5.1' => true, - 'alternative' => 'pecl/dio', - ), - 'ereg' => array( - '5.3' => false, - '7.0' => true, - 'alternative' => 'pcre', - ), - 'fam' => array( - '5.1' => true, - 'alternative' => null, - ), - 'fbsql' => array( - '5.3' => true, - 'alternative' => null, - ), - 'fdf' => array( - '5.3' => true, - 'alternative' => 'pecl/fdf', - ), - 'filepro' => array( - '5.2' => true, - 'alternative' => null, - ), - 'hw_api' => array( - '5.2' => true, - 'alternative' => null, - ), - 'ibase' => array( - '7.4' => true, - 'alternative' => 'pecl/ibase', - ), - 'ingres' => array( - '5.1' => true, - 'alternative' => 'pecl/ingres', - ), - 'ircg' => array( - '5.1' => true, - 'alternative' => null, - ), - 'mcrypt' => array( - '7.1' => false, - '7.2' => true, - 'alternative' => 'openssl (preferred) or pecl/mcrypt once available', - ), - 'mcve' => array( - '5.1' => true, - 'alternative' => 'pecl/mcve', - ), - 'ming' => array( - '5.3' => true, - 'alternative' => 'pecl/ming', - ), - 'mnogosearch' => array( - '5.1' => true, - 'alternative' => null, - ), - 'msql' => array( - '5.3' => true, - 'alternative' => null, - ), - 'mssql' => array( - '7.0' => true, - 'alternative' => null, - ), - 'mysql_' => array( - '5.5' => false, - '7.0' => true, - 'alternative' => 'mysqli', - ), - 'ncurses' => array( - '5.3' => true, - 'alternative' => 'pecl/ncurses', - ), - 'oracle' => array( - '5.1' => true, - 'alternative' => 'oci8 or pdo_oci', - ), - 'ovrimos' => array( - '5.1' => true, - 'alternative' => null, - ), - 'pfpro_' => array( - '5.1' => true, - 'alternative' => null, - ), - 'recode' => array( - '7.4' => true, - 'alternative' => 'iconv or mbstring', - ), - 'sqlite' => array( - '5.4' => true, - 'alternative' => null, - ), - // Has to be before `sybase` as otherwise it will never match. - 'sybase_ct' => array( - '7.0' => true, - 'alternative' => null, - ), - 'sybase' => array( - '5.3' => true, - 'alternative' => 'sybase_ct', - ), - 'w32api' => array( - '5.1' => true, - 'alternative' => 'pecl/ffi', - ), - 'wddx' => array( - '7.4' => true, - 'alternative' => 'pecl/wddx', - ), - 'yp' => array( - '5.1' => true, - 'alternative' => null, - ), - ); - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 5.5 - * - * @return array - */ - public function register() - { - // Handle case-insensitivity of function names. - $this->removedExtensions = $this->arrayKeysToLowercase($this->removedExtensions); - - return array(\T_STRING); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 5.5 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Find the next non-empty token. - $openBracket = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - - if ($tokens[$openBracket]['code'] !== \T_OPEN_PARENTHESIS) { - // Not a function call. - return; - } - - if (isset($tokens[$openBracket]['parenthesis_closer']) === false) { - // Not a function call. - return; - } - - // Find the previous non-empty token. - $search = Tokens::$emptyTokens; - $search[] = \T_BITWISE_AND; - $previous = $phpcsFile->findPrevious($search, ($stackPtr - 1), null, true); - if ($tokens[$previous]['code'] === \T_FUNCTION) { - // It's a function definition, not a function call. - return; - } - - if ($tokens[$previous]['code'] === \T_NEW) { - // We are creating an object, not calling a function. - return; - } - - if ($tokens[$previous]['code'] === \T_OBJECT_OPERATOR) { - // We are calling a method of an object. - return; - } - - $function = $tokens[$stackPtr]['content']; - $functionLc = strtolower($function); - - if ($this->isWhiteListed($functionLc) === true) { - // Function is whitelisted. - return; - } - - foreach ($this->removedExtensions as $extension => $versionList) { - if (strpos($functionLc, $extension) === 0) { - $itemInfo = array( - 'name' => $extension, - ); - $this->handleFeature($phpcsFile, $stackPtr, $itemInfo); - break; - } - } - } - - - /** - * Is the current function being checked whitelisted ? - * - * Parsing the list late as it may be provided as a property, but also inline. - * - * @since 7.0.2 - * - * @param string $content Content of the current token. - * - * @return bool - */ - protected function isWhiteListed($content) - { - if (isset($this->functionWhitelist) === false) { - return false; - } - - if (\is_string($this->functionWhitelist) === true) { - if (strpos($this->functionWhitelist, ',') !== false) { - $this->functionWhitelist = explode(',', $this->functionWhitelist); - } else { - $this->functionWhitelist = (array) $this->functionWhitelist; - } - } - - if (\is_array($this->functionWhitelist) === true) { - $this->functionWhitelist = array_map('strtolower', $this->functionWhitelist); - return \in_array($content, $this->functionWhitelist, true); - } - - return false; - } - - - /** - * Get the relevant sub-array for a specific item from a multi-dimensional array. - * - * @since 7.1.0 - * - * @param array $itemInfo Base information about the item. - * - * @return array Version and other information about the item. - */ - public function getItemArray(array $itemInfo) - { - return $this->removedExtensions[$itemInfo['name']]; - } - - - /** - * Get the error message template for this sniff. - * - * @since 7.1.0 - * - * @return string - */ - protected function getErrorMsgTemplate() - { - return "Extension '%s' is "; - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/ForbiddenParameterShadowSuperGlobalsSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/ForbiddenParameterShadowSuperGlobalsSniff.php deleted file mode 100644 index 0f52af7..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/ForbiddenParameterShadowSuperGlobalsSniff.php +++ /dev/null @@ -1,79 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\FunctionDeclarations; - -use PHPCompatibility\Sniff; -use PHPCompatibility\PHPCSHelper; -use PHP_CodeSniffer_File as File; - -/** - * Detect the use of superglobals as parameters for functions, support for which was removed in PHP 5.4. - * - * {@internal List of superglobals is maintained in the parent class.} - * - * PHP version 5.4 - * - * @link https://www.php.net/manual/en/migration54.incompatible.php - * - * @since 7.0.0 - */ -class ForbiddenParameterShadowSuperGlobalsSniff extends Sniff -{ - - /** - * Register the tokens to listen for. - * - * @since 7.0.0 - * @since 7.1.3 Allows for closures. - * - * @return array - */ - public function register() - { - return array( - \T_FUNCTION, - \T_CLOSURE, - ); - } - - /** - * Processes the test. - * - * @since 7.0.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsAbove('5.4') === false) { - return; - } - - // Get all parameters from function signature. - $parameters = PHPCSHelper::getMethodParameters($phpcsFile, $stackPtr); - if (empty($parameters) || \is_array($parameters) === false) { - return; - } - - foreach ($parameters as $param) { - if (isset($this->superglobals[$param['name']]) === true) { - $error = 'Parameter shadowing super global (%s) causes fatal error since PHP 5.4'; - $errorCode = $this->stringToErrorCode(substr($param['name'], 1)) . 'Found'; - $data = array($param['name']); - - $phpcsFile->addError($error, $param['token'], $errorCode, $data); - } - } - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/ForbiddenParametersWithSameNameSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/ForbiddenParametersWithSameNameSniff.php deleted file mode 100644 index e94461c..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/ForbiddenParametersWithSameNameSniff.php +++ /dev/null @@ -1,88 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\FunctionDeclarations; - -use PHPCompatibility\Sniff; -use PHPCompatibility\PHPCSHelper; -use PHP_CodeSniffer_File as File; - -/** - * Functions can not have multiple parameters with the same name since PHP 7.0. - * - * PHP version 7.0 - * - * @link https://www.php.net/manual/en/migration70.incompatible.php#migration70.incompatible.other.func-parameters - * - * @since 7.0.0 - */ -class ForbiddenParametersWithSameNameSniff extends Sniff -{ - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 7.0.0 - * @since 7.1.3 Allows for closures. - * - * @return array - */ - public function register() - { - return array( - \T_FUNCTION, - \T_CLOSURE, - ); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 7.0.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsAbove('7.0') === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - $token = $tokens[$stackPtr]; - // Skip function without body. - if (isset($token['scope_opener']) === false) { - return; - } - - // Get all parameters from method signature. - $parameters = PHPCSHelper::getMethodParameters($phpcsFile, $stackPtr); - if (empty($parameters) || \is_array($parameters) === false) { - return; - } - - $paramNames = array(); - foreach ($parameters as $param) { - $paramNames[] = $param['name']; - } - - if (\count($paramNames) !== \count(array_unique($paramNames))) { - $phpcsFile->addError( - 'Functions can not have multiple parameters with the same name since PHP 7.0', - $stackPtr, - 'Found' - ); - } - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/ForbiddenToStringParametersSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/ForbiddenToStringParametersSniff.php deleted file mode 100644 index 1625a4f..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/ForbiddenToStringParametersSniff.php +++ /dev/null @@ -1,99 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\FunctionDeclarations; - -use PHPCompatibility\Sniff; -use PHPCompatibility\PHPCSHelper; -use PHP_CodeSniffer_File as File; - -/** - * As of PHP 5.3, the __toString() magic method can no longer accept arguments. - * - * Sister-sniff to `PHPCompatibility.MethodUse.ForbiddenToStringParameters`. - * - * PHP version 5.3 - * - * @link https://www.php.net/manual/en/migration53.incompatible.php - * @link https://www.php.net/manual/en/language.oop5.magic.php#object.tostring - * - * @since 9.2.0 - */ -class ForbiddenToStringParametersSniff extends Sniff -{ - - /** - * Valid scopes for the __toString() method to live in. - * - * @since 9.2.0 - * @since 9.3.2 Visibility changed from `public` to `protected`. - * - * @var array - */ - protected $ooScopeTokens = array( - 'T_CLASS' => true, - 'T_INTERFACE' => true, - 'T_TRAIT' => true, - 'T_ANON_CLASS' => true, - ); - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 9.2.0 - * - * @return array - */ - public function register() - { - return array(\T_FUNCTION); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 9.2.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsAbove('5.3') === false) { - return; - } - - $functionName = $phpcsFile->getDeclarationName($stackPtr); - if (strtolower($functionName) !== '__tostring') { - // Not the right function. - return; - } - - if ($this->validDirectScope($phpcsFile, $stackPtr, $this->ooScopeTokens) === false) { - // Function, not method. - return; - } - - $params = PHPCSHelper::getMethodParameters($phpcsFile, $stackPtr); - if (empty($params)) { - // Function declared without parameters. - return; - } - - $phpcsFile->addError( - 'The __toString() magic method can no longer accept arguments since PHP 5.3', - $stackPtr, - 'Declared' - ); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/ForbiddenVariableNamesInClosureUseSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/ForbiddenVariableNamesInClosureUseSniff.php deleted file mode 100644 index 2e72c05..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/ForbiddenVariableNamesInClosureUseSniff.php +++ /dev/null @@ -1,122 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\FunctionDeclarations; - -use PHPCompatibility\Sniff; -use PHPCompatibility\PHPCSHelper; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Detect variable names forbidden to be used in closure `use` statements. - * - * Variables bound to a closure via the `use` construct cannot use the same name - * as any superglobals, `$this`, or any parameter since PHP 7.1. - * - * PHP version 7.1 - * - * @link https://www.php.net/manual/en/migration71.incompatible.php#migration71.incompatible.lexical-names - * @link https://www.php.net/manual/en/functions.anonymous.php - * - * @since 7.1.4 - */ -class ForbiddenVariableNamesInClosureUseSniff extends Sniff -{ - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 7.1.4 - * - * @return array - */ - public function register() - { - return array(\T_USE); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 7.1.4 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsAbove('7.1') === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - - // Verify this use statement is used with a closure - if so, it has to have parenthesis before it. - $previousNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true, null, true); - if ($previousNonEmpty === false || $tokens[$previousNonEmpty]['code'] !== \T_CLOSE_PARENTHESIS - || isset($tokens[$previousNonEmpty]['parenthesis_opener']) === false - ) { - return; - } - - // ... and (a variable within) parenthesis after it. - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true, null, true); - if ($nextNonEmpty === false || $tokens[$nextNonEmpty]['code'] !== \T_OPEN_PARENTHESIS) { - return; - } - - if (isset($tokens[$nextNonEmpty]['parenthesis_closer']) === false) { - // Live coding. - return; - } - - $closurePtr = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($tokens[$previousNonEmpty]['parenthesis_opener'] - 1), null, true); - if ($closurePtr === false || $tokens[$closurePtr]['code'] !== \T_CLOSURE) { - return; - } - - // Get the parameters declared by the closure. - $closureParams = PHPCSHelper::getMethodParameters($phpcsFile, $closurePtr); - - $errorMsg = 'Variables bound to a closure via the use construct cannot use the same name as superglobals, $this, or a declared parameter since PHP 7.1. Found: %s'; - - for ($i = ($nextNonEmpty + 1); $i < $tokens[$nextNonEmpty]['parenthesis_closer']; $i++) { - if ($tokens[$i]['code'] !== \T_VARIABLE) { - continue; - } - - $variableName = $tokens[$i]['content']; - - if ($variableName === '$this') { - $phpcsFile->addError($errorMsg, $i, 'FoundThis', array($variableName)); - continue; - } - - if (isset($this->superglobals[$variableName]) === true) { - $phpcsFile->addError($errorMsg, $i, 'FoundSuperglobal', array($variableName)); - continue; - } - - // Check whether it is one of the parameters declared by the closure. - if (empty($closureParams) === false) { - foreach ($closureParams as $param) { - if ($param['name'] === $variableName) { - $phpcsFile->addError($errorMsg, $i, 'FoundShadowParam', array($variableName)); - continue 2; - } - } - } - } - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/NewClosureSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/NewClosureSniff.php deleted file mode 100644 index b71bb32..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/NewClosureSniff.php +++ /dev/null @@ -1,264 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\FunctionDeclarations; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Detect closures and verify that the features used are supported. - * - * Version based checks: - * - Closures are available since PHP 5.3. - * - Closures can be declared as `static` since PHP 5.4. - * - Closures can use the `$this` variable within a class context since PHP 5.4. - * - Closures can use `self`/`parent`/`static` since PHP 5.4. - * - * Version independent checks: - * - Static closures don't have access to the `$this` variable. - * - Closures declared outside of a class context don't have access to the `$this` - * variable unless bound to an object. - * - * PHP version 5.3 - * PHP version 5.4 - * - * @link https://www.php.net/manual/en/functions.anonymous.php - * @link https://wiki.php.net/rfc/closures - * @link https://wiki.php.net/rfc/closures/object-extension - * - * @since 7.0.0 - */ -class NewClosureSniff extends Sniff -{ - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 7.0.0 - * - * @return array - */ - public function register() - { - return array(\T_CLOSURE); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 7.0.0 - * @since 7.1.4 - Added check for closure being declared as static < 5.4. - * - Added check for use of `$this` variable in class context < 5.4. - * - Added check for use of `$this` variable in static closures (unsupported). - * - Added check for use of `$this` variable outside class context (unsupported). - * @since 8.2.0 Added check for use of `self`/`static`/`parent` < 5.4. - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsBelow('5.2')) { - $phpcsFile->addError( - 'Closures / anonymous functions are not available in PHP 5.2 or earlier', - $stackPtr, - 'Found' - ); - } - - /* - * Closures can only be declared as static since PHP 5.4. - */ - $isStatic = $this->isClosureStatic($phpcsFile, $stackPtr); - if ($this->supportsBelow('5.3') && $isStatic === true) { - $phpcsFile->addError( - 'Closures / anonymous functions could not be declared as static in PHP 5.3 or earlier', - $stackPtr, - 'StaticFound' - ); - } - - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['scope_opener'], $tokens[$stackPtr]['scope_closer']) === false) { - // Live coding or parse error. - return; - } - - $scopeStart = ($tokens[$stackPtr]['scope_opener'] + 1); - $scopeEnd = $tokens[$stackPtr]['scope_closer']; - $usesThis = $this->findThisUsageInClosure($phpcsFile, $scopeStart, $scopeEnd); - - if ($this->supportsBelow('5.3')) { - /* - * Closures declared within classes only have access to $this since PHP 5.4. - */ - if ($usesThis !== false) { - $thisFound = $usesThis; - do { - $phpcsFile->addError( - 'Closures / anonymous functions did not have access to $this in PHP 5.3 or earlier', - $thisFound, - 'ThisFound' - ); - - $thisFound = $this->findThisUsageInClosure($phpcsFile, ($thisFound + 1), $scopeEnd); - - } while ($thisFound !== false); - } - - /* - * Closures declared within classes only have access to self/parent/static since PHP 5.4. - */ - $usesClassRef = $this->findClassRefUsageInClosure($phpcsFile, $scopeStart, $scopeEnd); - - if ($usesClassRef !== false) { - do { - $phpcsFile->addError( - 'Closures / anonymous functions could not use "%s::" in PHP 5.3 or earlier', - $usesClassRef, - 'ClassRefFound', - array(strtolower($tokens[$usesClassRef]['content'])) - ); - - $usesClassRef = $this->findClassRefUsageInClosure($phpcsFile, ($usesClassRef + 1), $scopeEnd); - - } while ($usesClassRef !== false); - } - } - - /* - * Check for correct usage. - */ - if ($this->supportsAbove('5.4') && $usesThis !== false) { - - $thisFound = $usesThis; - - do { - /* - * Closures only have access to $this if not declared as static. - */ - if ($isStatic === true) { - $phpcsFile->addError( - 'Closures / anonymous functions declared as static do not have access to $this', - $thisFound, - 'ThisFoundInStatic' - ); - } - - /* - * Closures only have access to $this if used within a class context. - */ - elseif ($this->inClassScope($phpcsFile, $stackPtr, false) === false) { - $phpcsFile->addWarning( - 'Closures / anonymous functions only have access to $this if used within a class or when bound to an object using bindTo(). Please verify.', - $thisFound, - 'ThisFoundOutsideClass' - ); - } - - $thisFound = $this->findThisUsageInClosure($phpcsFile, ($thisFound + 1), $scopeEnd); - - } while ($thisFound !== false); - } - - // Prevent double reporting for nested closures. - return $scopeEnd; - } - - - /** - * Check whether the closure is declared as static. - * - * @since 7.1.4 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return bool - */ - protected function isClosureStatic(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $prevToken = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true, null, true); - - return ($prevToken !== false && $tokens[$prevToken]['code'] === \T_STATIC); - } - - - /** - * Check if the code within a closure uses the $this variable. - * - * @since 7.1.4 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $startToken The position within the closure to continue searching from. - * @param int $endToken The closure scope closer to stop searching at. - * - * @return int|false The stackPtr to the first $this usage if found or false if - * $this is not used. - */ - protected function findThisUsageInClosure(File $phpcsFile, $startToken, $endToken) - { - // Make sure the $startToken is valid. - if ($startToken >= $endToken) { - return false; - } - - return $phpcsFile->findNext( - \T_VARIABLE, - $startToken, - $endToken, - false, - '$this' - ); - } - - /** - * Check if the code within a closure uses "self/parent/static". - * - * @since 8.2.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $startToken The position within the closure to continue searching from. - * @param int $endToken The closure scope closer to stop searching at. - * - * @return int|false The stackPtr to the first classRef usage if found or false if - * they are not used. - */ - protected function findClassRefUsageInClosure(File $phpcsFile, $startToken, $endToken) - { - // Make sure the $startToken is valid. - if ($startToken >= $endToken) { - return false; - } - - $tokens = $phpcsFile->getTokens(); - $classRef = $phpcsFile->findNext(array(\T_SELF, \T_PARENT, \T_STATIC), $startToken, $endToken); - - if ($classRef === false || $tokens[$classRef]['code'] !== \T_STATIC) { - return $classRef; - } - - // T_STATIC, make sure it is used as a class reference. - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($classRef + 1), $endToken, true); - if ($next === false || $tokens[$next]['code'] !== \T_DOUBLE_COLON) { - return false; - } - - return $classRef; - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/NewExceptionsFromToStringSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/NewExceptionsFromToStringSniff.php deleted file mode 100644 index 0564896..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/NewExceptionsFromToStringSniff.php +++ /dev/null @@ -1,171 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\FunctionDeclarations; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * As of PHP 7.4, throwing exceptions from a `__toString()` method is allowed. - * - * PHP version 7.4 - * - * @link https://wiki.php.net/rfc/tostring_exceptions - * @link https://www.php.net/manual/en/language.oop5.magic.php#object.tostring - * - * @since 9.2.0 - */ -class NewExceptionsFromToStringSniff extends Sniff -{ - - /** - * Valid scopes for the __toString() method to live in. - * - * @since 9.2.0 - * @since 9.3.0 Visibility changed from `public` to `protected`. - * - * @var array - */ - protected $ooScopeTokens = array( - 'T_CLASS' => true, - 'T_TRAIT' => true, - 'T_ANON_CLASS' => true, - ); - - /** - * Tokens which should be ignored when they preface a function declaration - * when trying to find the docblock (if any). - * - * Array will be added to in the register() method. - * - * @since 9.3.0 - * - * @var array - */ - private $docblockIgnoreTokens = array( - \T_WHITESPACE => \T_WHITESPACE, - ); - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 9.2.0 - * - * @return array - */ - public function register() - { - // Enhance the array of tokens to ignore for finding the docblock. - $this->docblockIgnoreTokens += Tokens::$methodPrefixes; - if (isset(Tokens::$phpcsCommentTokens)) { - $this->docblockIgnoreTokens += Tokens::$phpcsCommentTokens; - } - - return array(\T_FUNCTION); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 9.2.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsBelow('7.3') === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - if (isset($tokens[$stackPtr]['scope_opener'], $tokens[$stackPtr]['scope_closer']) === false) { - // Abstract function, interface function, live coding or parse error. - return; - } - - $functionName = $phpcsFile->getDeclarationName($stackPtr); - if (strtolower($functionName) !== '__tostring') { - // Not the right function. - return; - } - - if ($this->validDirectScope($phpcsFile, $stackPtr, $this->ooScopeTokens) === false) { - // Function, not method. - return; - } - - /* - * Examine the content of the function. - */ - $error = 'Throwing exceptions from __toString() was not allowed prior to PHP 7.4'; - $throwPtr = $tokens[$stackPtr]['scope_opener']; - $errorThrown = false; - - do { - $throwPtr = $phpcsFile->findNext(\T_THROW, ($throwPtr + 1), $tokens[$stackPtr]['scope_closer']); - if ($throwPtr === false) { - break; - } - - $conditions = $tokens[$throwPtr]['conditions']; - $conditions = array_reverse($conditions, true); - $inTryCatch = false; - foreach ($conditions as $ptr => $type) { - if ($type === \T_TRY) { - $inTryCatch = true; - break; - } - - if ($ptr === $stackPtr) { - // Don't check the conditions outside the function scope. - break; - } - } - - if ($inTryCatch === false) { - $phpcsFile->addError($error, $throwPtr, 'Found'); - $errorThrown = true; - } - } while (true); - - if ($errorThrown === true) { - // We've already thrown an error for this method, no need to examine the docblock. - return; - } - - /* - * Check whether the function has a docblock and if so, whether it contains a @throws tag. - * - * {@internal This can be partially replaced by the findCommentAboveFunction() - * utility function in due time.} - */ - $commentEnd = $phpcsFile->findPrevious($this->docblockIgnoreTokens, ($stackPtr - 1), null, true); - if ($commentEnd === false || $tokens[$commentEnd]['code'] !== \T_DOC_COMMENT_CLOSE_TAG) { - return; - } - - $commentStart = $tokens[$commentEnd]['comment_opener']; - foreach ($tokens[$commentStart]['comment_tags'] as $tag) { - if ($tokens[$tag]['content'] !== '@throws') { - continue; - } - - // Found a throws tag. - $phpcsFile->addError($error, $stackPtr, 'ThrowsTagFoundInDocblock'); - break; - } - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/NewNullableTypesSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/NewNullableTypesSniff.php deleted file mode 100644 index 8dc0c41..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/NewNullableTypesSniff.php +++ /dev/null @@ -1,169 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\FunctionDeclarations; - -use PHPCompatibility\Sniff; -use PHPCompatibility\PHPCSHelper; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Nullable parameter type declarations and return types are available since PHP 7.1. - * - * PHP version 7.1 - * - * @link https://www.php.net/manual/en/migration71.new-features.php#migration71.new-features.nullable-types - * @link https://wiki.php.net/rfc/nullable_types - * @link https://www.php.net/manual/en/functions.arguments.php#example-146 - * - * @since 7.0.7 - */ -class NewNullableTypesSniff extends Sniff -{ - /** - * Returns an array of tokens this test wants to listen for. - * - * {@internal Not sniffing for T_NULLABLE which was introduced in PHPCS 2.7.2 - * as in that case we can't distinguish between parameter type hints and - * return type hints for the error message.} - * - * @since 7.0.7 - * - * @return array - */ - public function register() - { - $tokens = array( - \T_FUNCTION, - \T_CLOSURE, - ); - - if (\defined('T_RETURN_TYPE')) { - $tokens[] = \T_RETURN_TYPE; - } - - return $tokens; - } - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 7.0.7 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsBelow('7.0') === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - $tokenCode = $tokens[$stackPtr]['code']; - - if ($tokenCode === \T_FUNCTION || $tokenCode === \T_CLOSURE) { - $this->processFunctionDeclaration($phpcsFile, $stackPtr); - - // Deal with older PHPCS version which don't recognize return type hints - // as well as newer PHPCS versions (3.3.0+) where the tokenization has changed. - $returnTypeHint = $this->getReturnTypeHintToken($phpcsFile, $stackPtr); - if ($returnTypeHint !== false) { - $this->processReturnType($phpcsFile, $returnTypeHint); - } - } else { - $this->processReturnType($phpcsFile, $stackPtr); - } - } - - - /** - * Process this test for function tokens. - * - * @since 7.0.7 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - protected function processFunctionDeclaration(File $phpcsFile, $stackPtr) - { - $params = PHPCSHelper::getMethodParameters($phpcsFile, $stackPtr); - - if (empty($params) === false && \is_array($params)) { - foreach ($params as $param) { - if ($param['nullable_type'] === true) { - $phpcsFile->addError( - 'Nullable type declarations are not supported in PHP 7.0 or earlier. Found: %s', - $param['token'], - 'typeDeclarationFound', - array($param['type_hint']) - ); - } - } - } - } - - - /** - * Process this test for return type tokens. - * - * @since 7.0.7 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - protected function processReturnType(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[($stackPtr - 1)]['code']) === false) { - return; - } - - $previous = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - - // Deal with namespaced class names. - if ($tokens[$previous]['code'] === \T_NS_SEPARATOR) { - $validTokens = Tokens::$emptyTokens; - $validTokens[\T_STRING] = true; - $validTokens[\T_NS_SEPARATOR] = true; - - $stackPtr--; - - while (isset($validTokens[$tokens[($stackPtr - 1)]['code']]) === true) { - $stackPtr--; - } - - $previous = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - } - - // T_NULLABLE token was introduced in PHPCS 2.7.2. Before that it identified as T_INLINE_THEN. - if ((\defined('T_NULLABLE') === true && $tokens[$previous]['type'] === 'T_NULLABLE') - || (\defined('T_NULLABLE') === false && $tokens[$previous]['code'] === \T_INLINE_THEN) - ) { - $phpcsFile->addError( - 'Nullable return types are not supported in PHP 7.0 or earlier.', - $stackPtr, - 'returnTypeFound' - ); - } - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/NewParamTypeDeclarationsSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/NewParamTypeDeclarationsSniff.php deleted file mode 100644 index 6ad98b6..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/NewParamTypeDeclarationsSniff.php +++ /dev/null @@ -1,237 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\FunctionDeclarations; - -use PHPCompatibility\AbstractNewFeatureSniff; -use PHPCompatibility\PHPCSHelper; -use PHP_CodeSniffer_File as File; - -/** - * Detect and verify the use of parameter type declarations in function declarations. - * - * Parameter type declarations - class/interface names only - is available since PHP 5.0. - * - Since PHP 5.1, the `array` keyword can be used. - * - Since PHP 5.2, `self` and `parent` can be used. Previously, those were interpreted as - * class names. - * - Since PHP 5.4, the `callable` keyword. - * - Since PHP 7.0, scalar type declarations are available. - * - Since PHP 7.1, the `iterable` pseudo-type is available. - * - Since PHP 7.2, the generic `object` type is available. - * - * Additionally, this sniff does a cursory check for typical invalid type declarations, - * such as: - * - `boolean` (should be `bool`), `integer` (should be `int`) and `static`. - * - `self`/`parent` as type declaration used outside class context throws a fatal error since PHP 7.0. - * - * PHP version 5.0+ - * - * @link https://www.php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration - * @link https://wiki.php.net/rfc/callable - * @link https://wiki.php.net/rfc/scalar_type_hints_v5 - * @link https://wiki.php.net/rfc/iterable - * @link https://wiki.php.net/rfc/object-typehint - * - * @since 7.0.0 - * @since 7.1.0 Now extends the `AbstractNewFeatureSniff` instead of the base `Sniff` class. - * @since 9.0.0 Renamed from `NewScalarTypeDeclarationsSniff` to `NewParamTypeDeclarationsSniff`. - */ -class NewParamTypeDeclarationsSniff extends AbstractNewFeatureSniff -{ - - /** - * A list of new types. - * - * The array lists : version number with false (not present) or true (present). - * If's sufficient to list the first version where the keyword appears. - * - * @since 7.0.0 - * @since 7.0.3 Now lists all param type declarations, not just the PHP 7+ scalar ones. - * - * @var array(string => array(string => bool)) - */ - protected $newTypes = array( - 'array' => array( - '5.0' => false, - '5.1' => true, - ), - 'self' => array( - '5.1' => false, - '5.2' => true, - ), - 'parent' => array( - '5.1' => false, - '5.2' => true, - ), - 'callable' => array( - '5.3' => false, - '5.4' => true, - ), - 'int' => array( - '5.6' => false, - '7.0' => true, - ), - 'float' => array( - '5.6' => false, - '7.0' => true, - ), - 'bool' => array( - '5.6' => false, - '7.0' => true, - ), - 'string' => array( - '5.6' => false, - '7.0' => true, - ), - 'iterable' => array( - '7.0' => false, - '7.1' => true, - ), - 'object' => array( - '7.1' => false, - '7.2' => true, - ), - ); - - - /** - * Invalid types - * - * The array lists : the invalid type hint => what was probably intended/alternative. - * - * @since 7.0.3 - * - * @var array(string => string) - */ - protected $invalidTypes = array( - 'static' => 'self', - 'boolean' => 'bool', - 'integer' => 'int', - ); - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 7.0.0 - * @since 7.1.3 Now also checks closures. - * - * @return array - */ - public function register() - { - return array( - \T_FUNCTION, - \T_CLOSURE, - ); - } - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 7.0.0 - * @since 7.0.3 - Added check for non-scalar type declarations. - * - Added check for invalid type declarations. - * - Added check for usage of `self` type declaration outside - * class scope. - * @since 8.2.0 Added check for `parent` type declaration outside class scope. - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - // Get all parameters from method signature. - $paramNames = PHPCSHelper::getMethodParameters($phpcsFile, $stackPtr); - if (empty($paramNames)) { - return; - } - - $supportsPHP4 = $this->supportsBelow('4.4'); - - foreach ($paramNames as $param) { - if ($param['type_hint'] === '') { - continue; - } - - // Strip off potential nullable indication. - $typeHint = ltrim($param['type_hint'], '?'); - - if ($supportsPHP4 === true) { - $phpcsFile->addError( - 'Type declarations were not present in PHP 4.4 or earlier.', - $param['token'], - 'TypeHintFound' - ); - - } elseif (isset($this->newTypes[$typeHint])) { - $itemInfo = array( - 'name' => $typeHint, - ); - $this->handleFeature($phpcsFile, $param['token'], $itemInfo); - - // As of PHP 7.0, using `self` or `parent` outside class scope throws a fatal error. - // Only throw this error for PHP 5.2+ as before that the "type hint not supported" error - // will be thrown. - if (($typeHint === 'self' || $typeHint === 'parent') - && $this->inClassScope($phpcsFile, $stackPtr, false) === false - && $this->supportsAbove('5.2') !== false - ) { - $phpcsFile->addError( - "'%s' type cannot be used outside of class scope", - $param['token'], - ucfirst($typeHint) . 'OutsideClassScopeFound', - array($typeHint) - ); - } - } elseif (isset($this->invalidTypes[$typeHint])) { - $error = "'%s' is not a valid type declaration. Did you mean %s ?"; - $data = array( - $typeHint, - $this->invalidTypes[$typeHint], - ); - - $phpcsFile->addError($error, $param['token'], 'InvalidTypeHintFound', $data); - } - } - } - - - /** - * Get the relevant sub-array for a specific item from a multi-dimensional array. - * - * @since 7.1.0 - * - * @param array $itemInfo Base information about the item. - * - * @return array Version and other information about the item. - */ - public function getItemArray(array $itemInfo) - { - return $this->newTypes[$itemInfo['name']]; - } - - - /** - * Get the error message template for this sniff. - * - * @since 7.1.0 - * - * @return string - */ - protected function getErrorMsgTemplate() - { - return "'%s' type declaration is not present in PHP version %s or earlier"; - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/NewReturnTypeDeclarationsSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/NewReturnTypeDeclarationsSniff.php deleted file mode 100644 index 3e22561..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/NewReturnTypeDeclarationsSniff.php +++ /dev/null @@ -1,194 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\FunctionDeclarations; - -use PHPCompatibility\AbstractNewFeatureSniff; -use PHP_CodeSniffer_File as File; - -/** - * Detect and verify the use of return type declarations in function declarations. - * - * Return type declarations are available since PHP 7.0. - * - Since PHP 7.1, the `iterable` and `void` pseudo-types are available. - * - Since PHP 7.2, the generic `object` type is available. - * - * PHP version 7.0+ - * - * @link https://www.php.net/manual/en/migration70.new-features.php#migration70.new-features.return-type-declarations - * @link https://www.php.net/manual/en/functions.returning-values.php#functions.returning-values.type-declaration - * @link https://wiki.php.net/rfc/return_types - * @link https://wiki.php.net/rfc/iterable - * @link https://wiki.php.net/rfc/void_return_type - * @link https://wiki.php.net/rfc/object-typehint - * - * @since 7.0.0 - * @since 7.1.0 Now extends the `AbstractNewFeatureSniff` instead of the base `Sniff` class. - * @since 7.1.2 Renamed from `NewScalarReturnTypeDeclarationsSniff` to `NewReturnTypeDeclarationsSniff`. - */ -class NewReturnTypeDeclarationsSniff extends AbstractNewFeatureSniff -{ - - /** - * A list of new types - * - * The array lists : version number with false (not present) or true (present). - * If's sufficient to list the first version where the keyword appears. - * - * @since 7.0.0 - * - * @var array(string => array(string => bool)) - */ - protected $newTypes = array( - 'int' => array( - '5.6' => false, - '7.0' => true, - ), - 'float' => array( - '5.6' => false, - '7.0' => true, - ), - 'bool' => array( - '5.6' => false, - '7.0' => true, - ), - 'string' => array( - '5.6' => false, - '7.0' => true, - ), - 'array' => array( - '5.6' => false, - '7.0' => true, - ), - 'callable' => array( - '5.6' => false, - '7.0' => true, - ), - 'parent' => array( - '5.6' => false, - '7.0' => true, - ), - 'self' => array( - '5.6' => false, - '7.0' => true, - ), - 'Class name' => array( - '5.6' => false, - '7.0' => true, - ), - - 'iterable' => array( - '7.0' => false, - '7.1' => true, - ), - 'void' => array( - '7.0' => false, - '7.1' => true, - ), - - 'object' => array( - '7.1' => false, - '7.2' => true, - ), - ); - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 7.0.0 - * @since 7.1.2 Now also checks based on the function and closure keywords. - * - * @return array - */ - public function register() - { - $tokens = array( - \T_FUNCTION, - \T_CLOSURE, - ); - - if (\defined('T_RETURN_TYPE')) { - $tokens[] = \T_RETURN_TYPE; - } - - return $tokens; - } - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 7.0.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Deal with older PHPCS version which don't recognize return type hints - // as well as newer PHPCS versions (3.3.0+) where the tokenization has changed. - if ($tokens[$stackPtr]['code'] === \T_FUNCTION || $tokens[$stackPtr]['code'] === \T_CLOSURE) { - $returnTypeHint = $this->getReturnTypeHintToken($phpcsFile, $stackPtr); - if ($returnTypeHint !== false) { - $stackPtr = $returnTypeHint; - } - } - - if (isset($this->newTypes[$tokens[$stackPtr]['content']]) === true) { - $itemInfo = array( - 'name' => $tokens[$stackPtr]['content'], - ); - $this->handleFeature($phpcsFile, $stackPtr, $itemInfo); - } - // Handle class name based return types. - elseif ($tokens[$stackPtr]['code'] === \T_STRING - || (\defined('T_RETURN_TYPE') && $tokens[$stackPtr]['code'] === \T_RETURN_TYPE) - ) { - $itemInfo = array( - 'name' => 'Class name', - ); - $this->handleFeature($phpcsFile, $stackPtr, $itemInfo); - } - } - - - /** - * Get the relevant sub-array for a specific item from a multi-dimensional array. - * - * @since 7.1.0 - * - * @param array $itemInfo Base information about the item. - * - * @return array Version and other information about the item. - */ - public function getItemArray(array $itemInfo) - { - return $this->newTypes[$itemInfo['name']]; - } - - - /** - * Get the error message template for this sniff. - * - * @since 7.1.0 - * - * @return string - */ - protected function getErrorMsgTemplate() - { - return '%s return type is not present in PHP version %s or earlier'; - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/NonStaticMagicMethodsSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/NonStaticMagicMethodsSniff.php deleted file mode 100644 index a86d56e..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionDeclarations/NonStaticMagicMethodsSniff.php +++ /dev/null @@ -1,216 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\FunctionDeclarations; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; - -/** - * Verifies the use of the correct visibility and static properties of magic methods. - * - * The requirements have always existed, but as of PHP 5.3, a warning will be thrown - * when magic methods have the wrong modifiers. - * - * PHP version 5.3 - * - * @link https://www.php.net/manual/en/language.oop5.magic.php - * - * @since 5.5 - * @since 5.6 Now extends the base `Sniff` class. - */ -class NonStaticMagicMethodsSniff extends Sniff -{ - - /** - * A list of PHP magic methods and their visibility and static requirements. - * - * Method names in the array should be all *lowercase*. - * Visibility can be either 'public', 'protected' or 'private'. - * Static can be either 'true' - *must* be static, or 'false' - *must* be non-static. - * When a method does not have a specific requirement for either visibility or static, - * do *not* add the key. - * - * @since 5.5 - * @since 5.6 The array format has changed to allow the sniff to also verify the - * use of the correct visibility for a magic method. - * - * @var array(string) - */ - protected $magicMethods = array( - '__construct' => array( - 'static' => false, - ), - '__destruct' => array( - 'visibility' => 'public', - 'static' => false, - ), - '__clone' => array( - 'static' => false, - ), - '__get' => array( - 'visibility' => 'public', - 'static' => false, - ), - '__set' => array( - 'visibility' => 'public', - 'static' => false, - ), - '__isset' => array( - 'visibility' => 'public', - 'static' => false, - ), - '__unset' => array( - 'visibility' => 'public', - 'static' => false, - ), - '__call' => array( - 'visibility' => 'public', - 'static' => false, - ), - '__callstatic' => array( - 'visibility' => 'public', - 'static' => true, - ), - '__sleep' => array( - 'visibility' => 'public', - ), - '__tostring' => array( - 'visibility' => 'public', - ), - '__set_state' => array( - 'visibility' => 'public', - 'static' => true, - ), - '__debuginfo' => array( - 'visibility' => 'public', - 'static' => false, - ), - '__invoke' => array( - 'visibility' => 'public', - 'static' => false, - ), - '__serialize' => array( - 'visibility' => 'public', - 'static' => false, - ), - '__unserialize' => array( - 'visibility' => 'public', - 'static' => false, - ), - ); - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 5.5 - * @since 5.6 Now also checks traits. - * @since 7.1.4 Now also checks anonymous classes. - * - * @return array - */ - public function register() - { - $targets = array( - \T_CLASS, - \T_INTERFACE, - \T_TRAIT, - ); - - if (\defined('T_ANON_CLASS')) { - $targets[] = \T_ANON_CLASS; - } - - return $targets; - } - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 5.5 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - // Should be removed, the requirement was previously also there, 5.3 just started throwing a warning about it. - if ($this->supportsAbove('5.3') === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['scope_closer']) === false) { - return; - } - - $classScopeCloser = $tokens[$stackPtr]['scope_closer']; - $functionPtr = $stackPtr; - - // Find all the functions in this class or interface. - while (($functionToken = $phpcsFile->findNext(\T_FUNCTION, $functionPtr, $classScopeCloser)) !== false) { - /* - * Get the scope closer for this function in order to know how - * to advance to the next function. - * If no body of function (e.g. for interfaces), there is - * no closing curly brace; advance the pointer differently. - */ - if (isset($tokens[$functionToken]['scope_closer'])) { - $scopeCloser = $tokens[$functionToken]['scope_closer']; - } else { - $scopeCloser = ($functionToken + 1); - } - - $methodName = $phpcsFile->getDeclarationName($functionToken); - $methodNameLc = strtolower($methodName); - if (isset($this->magicMethods[$methodNameLc]) === false) { - $functionPtr = $scopeCloser; - continue; - } - - $methodProperties = $phpcsFile->getMethodProperties($functionToken); - $errorCodeBase = $this->stringToErrorCode($methodNameLc); - - if (isset($this->magicMethods[$methodNameLc]['visibility']) && $this->magicMethods[$methodNameLc]['visibility'] !== $methodProperties['scope']) { - $error = 'Visibility for magic method %s must be %s. Found: %s'; - $errorCode = $errorCodeBase . 'MethodVisibility'; - $data = array( - $methodName, - $this->magicMethods[$methodNameLc]['visibility'], - $methodProperties['scope'], - ); - - $phpcsFile->addError($error, $functionToken, $errorCode, $data); - } - - if (isset($this->magicMethods[$methodNameLc]['static']) && $this->magicMethods[$methodNameLc]['static'] !== $methodProperties['is_static']) { - $error = 'Magic method %s cannot be defined as static.'; - $errorCode = $errorCodeBase . 'MethodStatic'; - $data = array($methodName); - - if ($this->magicMethods[$methodNameLc]['static'] === true) { - $error = 'Magic method %s must be defined as static.'; - $errorCode = $errorCodeBase . 'MethodNonStatic'; - } - - $phpcsFile->addError($error, $functionToken, $errorCode, $data); - } - - // Advance to next function. - $functionPtr = $scopeCloser; - } - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionNameRestrictions/NewMagicMethodsSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionNameRestrictions/NewMagicMethodsSniff.php deleted file mode 100644 index 4dc08f8..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionNameRestrictions/NewMagicMethodsSniff.php +++ /dev/null @@ -1,231 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\FunctionNameRestrictions; - -use PHPCompatibility\AbstractNewFeatureSniff; -use PHP_CodeSniffer_File as File; - -/** - * Warns for non-magic behaviour of magic methods prior to becoming magic. - * - * PHP version 5.0+ - * - * @link https://www.php.net/manual/en/language.oop5.magic.php - * @link https://wiki.php.net/rfc/closures#additional_goodyinvoke - * @link https://wiki.php.net/rfc/debug-info - * - * @since 7.0.4 - * @since 7.1.0 Now extends the `AbstractNewFeatureSniff` instead of the base `Sniff` class. - */ -class NewMagicMethodsSniff extends AbstractNewFeatureSniff -{ - - /** - * A list of new magic methods, not considered magic in older versions. - * - * Method names in the array should be all *lowercase*. - * The array lists : version number with false (not magic) or true (magic). - * If's sufficient to list the first version where the method became magic. - * - * @since 7.0.4 - * - * @var array(string => array(string => bool|string)) - */ - protected $newMagicMethods = array( - '__construct' => array( - '4.4' => false, - '5.0' => true, - ), - '__destruct' => array( - '4.4' => false, - '5.0' => true, - ), - '__get' => array( - '4.4' => false, - '5.0' => true, - ), - - '__isset' => array( - '5.0' => false, - '5.1' => true, - ), - '__unset' => array( - '5.0' => false, - '5.1' => true, - ), - '__set_state' => array( - '5.0' => false, - '5.1' => true, - ), - - '__callstatic' => array( - '5.2' => false, - '5.3' => true, - ), - '__invoke' => array( - '5.2' => false, - '5.3' => true, - ), - - '__debuginfo' => array( - '5.5' => false, - '5.6' => true, - ), - - // Special case - only became properly magical in 5.2.0, - // before that it was only called for echo and print. - '__tostring' => array( - '5.1' => false, - '5.2' => true, - 'message' => 'The method %s() was not truly magical in PHP version %s and earlier. The associated magic functionality will only be called when directly combined with echo or print.', - ), - - '__serialize' => array( - '7.3' => false, - '7.4' => true, - ), - '__unserialize' => array( - '7.3' => false, - '7.4' => true, - ), - ); - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 7.0.4 - * - * @return array - */ - public function register() - { - return array(\T_FUNCTION); - } - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 7.0.4 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $functionName = $phpcsFile->getDeclarationName($stackPtr); - $functionNameLc = strtolower($functionName); - - if (isset($this->newMagicMethods[$functionNameLc]) === false) { - return; - } - - if ($this->inClassScope($phpcsFile, $stackPtr, false) === false) { - return; - } - - $itemInfo = array( - 'name' => $functionName, - 'nameLc' => $functionNameLc, - ); - $this->handleFeature($phpcsFile, $stackPtr, $itemInfo); - } - - - /** - * Get the relevant sub-array for a specific item from a multi-dimensional array. - * - * @since 7.1.0 - * - * @param array $itemInfo Base information about the item. - * - * @return array Version and other information about the item. - */ - public function getItemArray(array $itemInfo) - { - return $this->newMagicMethods[$itemInfo['nameLc']]; - } - - - /** - * Get an array of the non-PHP-version array keys used in a sub-array. - * - * @since 7.1.0 - * - * @return array - */ - protected function getNonVersionArrayKeys() - { - return array('message'); - } - - - /** - * Retrieve the relevant detail (version) information for use in an error message. - * - * @since 7.1.0 - * - * @param array $itemArray Version and other information about the item. - * @param array $itemInfo Base information about the item. - * - * @return array - */ - public function getErrorInfo(array $itemArray, array $itemInfo) - { - $errorInfo = parent::getErrorInfo($itemArray, $itemInfo); - $errorInfo['error'] = false; // Warning, not error. - $errorInfo['message'] = ''; - - if (empty($itemArray['message']) === false) { - $errorInfo['message'] = $itemArray['message']; - } - - return $errorInfo; - } - - - /** - * Get the error message template for this sniff. - * - * @since 7.1.0 - * - * @return string - */ - protected function getErrorMsgTemplate() - { - return 'The method %s() was not magical in PHP version %s and earlier. The associated magic functionality will not be invoked.'; - } - - - /** - * Allow for concrete child classes to filter the error message before it's passed to PHPCS. - * - * @since 7.1.0 - * - * @param string $error The error message which was created. - * @param array $itemInfo Base information about the item this error message applies to. - * @param array $errorInfo Detail information about an item this error message applies to. - * - * @return string - */ - protected function filterErrorMsg($error, array $itemInfo, array $errorInfo) - { - if ($errorInfo['message'] !== '') { - $error = $errorInfo['message']; - } - - return $error; - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionNameRestrictions/RemovedMagicAutoloadSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionNameRestrictions/RemovedMagicAutoloadSniff.php deleted file mode 100644 index 0ea5b0d..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionNameRestrictions/RemovedMagicAutoloadSniff.php +++ /dev/null @@ -1,92 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\FunctionNameRestrictions; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; - -/** - * Detect declaration of the magic `__autoload()` method. - * - * This method has been deprecated in PHP 7.2 in favour of `spl_autoload_register()`. - * - * PHP version 7.2 - * - * @link https://www.php.net/manual/en/migration72.deprecated.php#migration72.deprecated.__autoload-method - * @link https://wiki.php.net/rfc/deprecations_php_7_2#autoload - * @link https://www.php.net/manual/en/function.autoload.php - * - * @since 8.1.0 - * @since 9.0.0 Renamed from `DeprecatedMagicAutoloadSniff` to `RemovedMagicAutoloadSniff`. - */ -class RemovedMagicAutoloadSniff extends Sniff -{ - /** - * Scopes to look for when testing using validDirectScope. - * - * @since 8.1.0 - * - * @var array - */ - private $checkForScopes = array( - 'T_CLASS' => true, - 'T_ANON_CLASS' => true, - 'T_INTERFACE' => true, - 'T_TRAIT' => true, - 'T_NAMESPACE' => true, - ); - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 8.1.0 - * - * @return array - */ - public function register() - { - return array(\T_FUNCTION); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 8.1.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsAbove('7.2') === false) { - return; - } - - $funcName = $phpcsFile->getDeclarationName($stackPtr); - - if (strtolower($funcName) !== '__autoload') { - return; - } - - if ($this->validDirectScope($phpcsFile, $stackPtr, $this->checkForScopes) !== false) { - return; - } - - if ($this->determineNamespace($phpcsFile, $stackPtr) !== '') { - return; - } - - $phpcsFile->addWarning('Use of __autoload() function is deprecated since PHP 7.2', $stackPtr, 'Found'); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionNameRestrictions/RemovedNamespacedAssertSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionNameRestrictions/RemovedNamespacedAssertSniff.php deleted file mode 100644 index 3c3fead..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionNameRestrictions/RemovedNamespacedAssertSniff.php +++ /dev/null @@ -1,101 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\FunctionNameRestrictions; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; - -/** - * Detect declaration of a namespaced function called `assert()`. - * - * As of PHP 7.3, a compile-time deprecation warning will be thrown when a function - * called `assert()` is declared. In PHP 8 this will become a compile-error. - * - * Methods are unaffected. - * Global, non-namespaced, `assert()` function declarations were always a fatal - * "function already declared" error, so not the concern of this sniff. - * - * PHP version 7.3 - * - * @link https://www.php.net/manual/en/migration73.deprecated.php#migration73.deprecated.core.assert - * @link https://wiki.php.net/rfc/deprecations_php_7_3#defining_a_free-standing_assert_function - * @link https://www.php.net/manual/en/function.assert.php - * - * @since 9.0.0 - */ -class RemovedNamespacedAssertSniff extends Sniff -{ - /** - * Scopes in which an `assert` function can be declared without issue. - * - * @since 9.0.0 - * - * @var array - */ - private $scopes = array( - \T_CLASS, - \T_INTERFACE, - \T_TRAIT, - \T_CLOSURE, - ); - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 9.0.0 - * - * @return array - */ - public function register() - { - // Enrich the scopes list. - if (\defined('T_ANON_CLASS')) { - $this->scopes[] = \T_ANON_CLASS; - } - - return array(\T_FUNCTION); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 9.0.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsAbove('7.3') === false) { - return; - } - - $funcName = $phpcsFile->getDeclarationName($stackPtr); - - if (strtolower($funcName) !== 'assert') { - return; - } - - if ($phpcsFile->hasCondition($stackPtr, $this->scopes) === true) { - return; - } - - if ($this->determineNamespace($phpcsFile, $stackPtr) === '') { - // Not a namespaced function declaration. This may be a parse error, but not our concern. - return; - } - - $phpcsFile->addWarning('Declaring a free-standing function called assert() is deprecated since PHP 7.3.', $stackPtr, 'Found'); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionNameRestrictions/RemovedPHP4StyleConstructorsSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionNameRestrictions/RemovedPHP4StyleConstructorsSniff.php deleted file mode 100644 index a888f51..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionNameRestrictions/RemovedPHP4StyleConstructorsSniff.php +++ /dev/null @@ -1,158 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\FunctionNameRestrictions; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Detect declarations of PHP 4 style constructors which are deprecated as of PHP 7.0.0. - * - * PHP 4 style constructors - methods that have the same name as the class they are defined in - - * are deprecated as of PHP 7.0.0, and will be removed in the future. - * PHP 7 will emit `E_DEPRECATED` if a PHP 4 constructor is the only constructor defined - * within a class. Classes that implement a `__construct()` method are unaffected. - * - * Note: Methods with the same name as the class they are defined in _within a namespace_ - * are not recognized as constructors anyway and therefore outside the scope of this sniff. - * - * PHP version 7.0 - * - * @link https://www.php.net/manual/en/migration70.deprecated.php#migration70.deprecated.php4-constructors - * @link https://wiki.php.net/rfc/remove_php4_constructors - * @link https://www.php.net/manual/en/language.oop5.decon.php - * - * @since 7.0.0 - * @since 7.0.8 This sniff now throws a warning instead of an error as the functionality is - * only deprecated (for now). - * @since 9.0.0 Renamed from `DeprecatedPHP4StyleConstructorsSniff` to `RemovedPHP4StyleConstructorsSniff`. - */ -class RemovedPHP4StyleConstructorsSniff extends Sniff -{ - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 7.0.0 - * - * @return array - */ - public function register() - { - return array( - \T_CLASS, - ); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 7.0.0 - * @since 7.0.8 The message is downgraded from error to warning as - for now - support - * for PHP4-style constructors is just deprecated, not yet removed. - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsAbove('7.0') === false) { - return; - } - - if ($this->determineNamespace($phpcsFile, $stackPtr) !== '') { - /* - * Namespaced methods with the same name as the class are treated as - * regular methods, so we can bow out if we're in a namespace. - * - * Note: the exception to this is PHP 5.3.0-5.3.2. This is currently - * not dealt with. - */ - return; - } - - $tokens = $phpcsFile->getTokens(); - - $class = $tokens[$stackPtr]; - - if (isset($class['scope_closer']) === false) { - return; - } - - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($nextNonEmpty === false || $tokens[$nextNonEmpty]['code'] !== \T_STRING) { - // Anonymous class in combination with PHPCS 2.3.x. - return; - } - - $scopeCloser = $class['scope_closer']; - $className = $tokens[$nextNonEmpty]['content']; - - if (empty($className) || \is_string($className) === false) { - return; - } - - $nextFunc = $stackPtr; - $classNameLc = strtolower($className); - $newConstructorFound = false; - $oldConstructorFound = false; - $oldConstructorPos = -1; - while (($nextFunc = $phpcsFile->findNext(array(\T_FUNCTION, \T_DOC_COMMENT_OPEN_TAG), ($nextFunc + 1), $scopeCloser)) !== false) { - // Skip over docblocks. - if ($tokens[$nextFunc]['code'] === \T_DOC_COMMENT_OPEN_TAG) { - $nextFunc = $tokens[$nextFunc]['comment_closer']; - continue; - } - - $functionScopeCloser = $nextFunc; - if (isset($tokens[$nextFunc]['scope_closer'])) { - // Normal (non-interface, non-abstract) method. - $functionScopeCloser = $tokens[$nextFunc]['scope_closer']; - } - - $funcName = $phpcsFile->getDeclarationName($nextFunc); - if (empty($funcName) || \is_string($funcName) === false) { - $nextFunc = $functionScopeCloser; - continue; - } - - $funcNameLc = strtolower($funcName); - - if ($funcNameLc === '__construct') { - $newConstructorFound = true; - } - - if ($funcNameLc === $classNameLc) { - $oldConstructorFound = true; - $oldConstructorPos = $nextFunc; - } - - // If both have been found, no need to continue looping through the functions. - if ($newConstructorFound === true && $oldConstructorFound === true) { - break; - } - - $nextFunc = $functionScopeCloser; - } - - if ($newConstructorFound === false && $oldConstructorFound === true) { - $phpcsFile->addWarning( - 'Use of deprecated PHP4 style class constructor is not supported since PHP 7.', - $oldConstructorPos, - 'Found' - ); - } - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionNameRestrictions/ReservedFunctionNamesSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionNameRestrictions/ReservedFunctionNamesSniff.php deleted file mode 100644 index 9ddb9e9..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionNameRestrictions/ReservedFunctionNamesSniff.php +++ /dev/null @@ -1,205 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\FunctionNameRestrictions; - -use Generic_Sniffs_NamingConventions_CamelCapsFunctionNameSniff as PHPCS_CamelCapsFunctionNameSniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Standards_AbstractScopeSniff as PHPCS_AbstractScopeSniff; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * All function and method names starting with double underscore are reserved by PHP. - * - * PHP version All - * - * {@internal Extends an upstream sniff to benefit from the properties contained therein. - * The properties are lists of valid PHP magic function and method names, which - * should be ignored for the purposes of this sniff. - * As this sniff is not PHP version specific, we don't need access to the utility - * methods in the PHPCompatibility\Sniff, so extending the upstream sniff is fine. - * As the upstream sniff checks the same (and more, but we don't need the rest), - * the logic in this sniff is largely the same as used upstream. - * Extending the upstream sniff instead of including it via the ruleset, however, - * prevents hard to debug issues of errors not being reported from the upstream sniff - * if this library is used in combination with other rulesets.} - * - * @link https://www.php.net/manual/en/language.oop5.magic.php - * - * @since 8.2.0 This was previously, since 7.0.3, checked by the upstream sniff. - * @since 9.3.2 The sniff will now ignore functions marked as `@deprecated` by design. - */ -class ReservedFunctionNamesSniff extends PHPCS_CamelCapsFunctionNameSniff -{ - - /** - * Overload the constructor to work round various PHPCS cross-version compatibility issues. - * - * @since 8.2.0 - */ - public function __construct() - { - $scopeTokens = array(\T_CLASS, \T_INTERFACE, \T_TRAIT); - if (\defined('T_ANON_CLASS')) { - $scopeTokens[] = \T_ANON_CLASS; - } - - // Call the grand-parent constructor directly. - PHPCS_AbstractScopeSniff::__construct($scopeTokens, array(\T_FUNCTION), true); - - // Make sure debuginfo is included in the array. Upstream only includes it since 2.5.1. - $this->magicMethods['debuginfo'] = true; - } - - - /** - * Processes the tokens within the scope. - * - * @since 8.2.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being processed. - * @param int $stackPtr The position where this token was - * found. - * @param int $currScope The position of the current scope. - * - * @return void - */ - protected function processTokenWithinScope(File $phpcsFile, $stackPtr, $currScope) - { - $tokens = $phpcsFile->getTokens(); - - /* - * Determine if this is a function which needs to be examined. - * The `processTokenWithinScope()` is called for each valid scope a method is in, - * so for nested classes, we need to make sure we only examine the token for - * the lowest level valid scope. - */ - $conditions = $tokens[$stackPtr]['conditions']; - end($conditions); - $deepestScope = key($conditions); - if ($deepestScope !== $currScope) { - return; - } - - if ($this->isFunctionDeprecated($phpcsFile, $stackPtr) === true) { - /* - * Deprecated functions don't have to comply with the naming conventions, - * otherwise functions deprecated in favour of a function with a compliant - * name would still trigger an error. - */ - return; - } - - $methodName = $phpcsFile->getDeclarationName($stackPtr); - if ($methodName === null) { - // Ignore closures. - return; - } - - // Is this a magic method. i.e., is prefixed with "__" ? - if (preg_match('|^__[^_]|', $methodName) > 0) { - $magicPart = strtolower(substr($methodName, 2)); - if (isset($this->magicMethods[$magicPart]) === false - && isset($this->methodsDoubleUnderscore[$magicPart]) === false - ) { - $className = '[anonymous class]'; - $scopeNextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($currScope + 1), null, true); - if ($scopeNextNonEmpty !== false && $tokens[$scopeNextNonEmpty]['code'] === \T_STRING) { - $className = $tokens[$scopeNextNonEmpty]['content']; - } - - $phpcsFile->addWarning( - 'Method name "%s" is discouraged; PHP has reserved all method names with a double underscore prefix for future use.', - $stackPtr, - 'MethodDoubleUnderscore', - array($className . '::' . $methodName) - ); - } - } - } - - - /** - * Processes the tokens outside the scope. - * - * @since 8.2.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being processed. - * @param int $stackPtr The position where this token was - * found. - * - * @return void - */ - protected function processTokenOutsideScope(File $phpcsFile, $stackPtr) - { - if ($this->isFunctionDeprecated($phpcsFile, $stackPtr) === true) { - /* - * Deprecated functions don't have to comply with the naming conventions, - * otherwise functions deprecated in favour of a function with a compliant - * name would still trigger an error. - */ - return; - } - - $functionName = $phpcsFile->getDeclarationName($stackPtr); - if ($functionName === null) { - // Ignore closures. - return; - } - - // Is this a magic function. i.e., it is prefixed with "__". - if (preg_match('|^__[^_]|', $functionName) > 0) { - $magicPart = strtolower(substr($functionName, 2)); - if (isset($this->magicFunctions[$magicPart]) === false) { - $phpcsFile->addWarning( - 'Function name "%s" is discouraged; PHP has reserved all method names with a double underscore prefix for future use.', - $stackPtr, - 'FunctionDoubleUnderscore', - array($functionName) - ); - } - } - } - - - /** - * Check whether a function has been marked as deprecated via a @deprecated tag - * in the function docblock. - * - * @since 9.3.2 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of a T_FUNCTION - * token in the stack. - * - * @return bool - */ - private function isFunctionDeprecated(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $find = Tokens::$methodPrefixes; - $find[] = \T_WHITESPACE; - - $commentEnd = $phpcsFile->findPrevious($find, ($stackPtr - 1), null, true); - if ($tokens[$commentEnd]['code'] !== \T_DOC_COMMENT_CLOSE_TAG) { - // Function doesn't have a doc comment or is using the wrong type of comment. - return false; - } - - $commentStart = $tokens[$commentEnd]['comment_opener']; - foreach ($tokens[$commentStart]['comment_tags'] as $tag) { - if ($tokens[$tag]['content'] === '@deprecated') { - return true; - } - } - - return false; - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionUse/ArgumentFunctionsReportCurrentValueSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionUse/ArgumentFunctionsReportCurrentValueSniff.php deleted file mode 100644 index 4e904de..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionUse/ArgumentFunctionsReportCurrentValueSniff.php +++ /dev/null @@ -1,455 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\FunctionUse; - -use PHPCompatibility\Sniff; -use PHPCompatibility\PHPCSHelper; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Functions inspecting function arguments report the current parameter value - * instead of the original since PHP 7.0. - * - * `func_get_arg()`, `func_get_args()`, `debug_backtrace()` and exception backtraces - * will no longer report the original parameter value as was passed to the function, - * but will instead provide the current value (which might have been modified). - * - * PHP version 7.0 - * - * @link https://www.php.net/manual/en/migration70.incompatible.php#migration70.incompatible.other.func-parameter-modified - * - * @since 9.1.0 - */ -class ArgumentFunctionsReportCurrentValueSniff extends Sniff -{ - - /** - * A list of functions that, when called, can behave differently in PHP 7 - * when dealing with parameters of the function they're called in. - * - * @since 9.1.0 - * - * @var array - */ - protected $changedFunctions = array( - 'func_get_arg' => true, - 'func_get_args' => true, - 'debug_backtrace' => true, - 'debug_print_backtrace' => true, - ); - - /** - * Tokens to look out for to allow us to skip past nested scoped structures. - * - * @since 9.1.0 - * - * @var array - */ - private $skipPastNested = array( - 'T_CLASS' => true, - 'T_ANON_CLASS' => true, - 'T_INTERFACE' => true, - 'T_TRAIT' => true, - 'T_FUNCTION' => true, - 'T_CLOSURE' => true, - ); - - /** - * List of tokens which when they preceed a T_STRING *within a function* indicate - * this is not a call to a PHP native function. - * - * This list already takes into account that nested scoped structures are being - * skipped over, so doesn't check for those again. - * Similarly, as constants won't have parentheses, those don't need to be checked - * for either. - * - * @since 9.1.0 - * - * @var array - */ - private $noneFunctionCallIndicators = array( - \T_DOUBLE_COLON => true, - \T_OBJECT_OPERATOR => true, - ); - - /** - * The tokens for variable incrementing/decrementing. - * - * @since 9.1.0 - * - * @var array - */ - private $plusPlusMinusMinus = array( - \T_DEC => true, - \T_INC => true, - ); - - /** - * Tokens to ignore when determining the start of a statement. - * - * @since 9.1.0 - * - * @var array - */ - private $ignoreForStartOfStatement = array( - \T_COMMA, - \T_DOUBLE_ARROW, - \T_OPEN_SQUARE_BRACKET, - \T_OPEN_PARENTHESIS, - ); - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 9.1.0 - * - * @return array - */ - public function register() - { - return array( - \T_FUNCTION, - \T_CLOSURE, - ); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 9.1.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsAbove('7.0') === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['scope_opener'], $tokens[$stackPtr]['scope_closer']) === false) { - // Abstract function, interface function, live coding or parse error. - return; - } - - $scopeOpener = $tokens[$stackPtr]['scope_opener']; - $scopeCloser = $tokens[$stackPtr]['scope_closer']; - - // Does the function declaration have parameters ? - $params = PHPCSHelper::getMethodParameters($phpcsFile, $stackPtr); - if (empty($params)) { - // No named arguments found, so no risk of them being changed. - return; - } - - $paramNames = array(); - foreach ($params as $param) { - $paramNames[] = $param['name']; - } - - for ($i = ($scopeOpener + 1); $i < $scopeCloser; $i++) { - if (isset($this->skipPastNested[$tokens[$i]['type']]) && isset($tokens[$i]['scope_closer'])) { - // Skip past nested structures. - $i = $tokens[$i]['scope_closer']; - continue; - } - - if ($tokens[$i]['code'] !== \T_STRING) { - continue; - } - - $foundFunctionName = strtolower($tokens[$i]['content']); - - if (isset($this->changedFunctions[$foundFunctionName]) === false) { - // Not one of the target functions. - continue; - } - - /* - * Ok, so is this really a function call to one of the PHP native functions ? - */ - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($i + 1), null, true); - if ($next === false || $tokens[$next]['code'] !== \T_OPEN_PARENTHESIS) { - // Live coding, parse error or not a function call. - continue; - } - - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($i - 1), null, true); - if ($prev !== false) { - if (isset($this->noneFunctionCallIndicators[$tokens[$prev]['code']])) { - continue; - } - - // Check for namespaced functions, ie: \foo\bar() not \bar(). - if ($tokens[ $prev ]['code'] === \T_NS_SEPARATOR) { - $pprev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($prev - 1), null, true); - if ($pprev !== false && $tokens[ $pprev ]['code'] === \T_STRING) { - continue; - } - } - } - - /* - * Address some special cases. - */ - if ($foundFunctionName !== 'func_get_args') { - $paramOne = $this->getFunctionCallParameter($phpcsFile, $i, 1); - if ($paramOne !== false) { - switch ($foundFunctionName) { - /* - * Check if `debug_(print_)backtrace()` is called with the - * `DEBUG_BACKTRACE_IGNORE_ARGS` option. - */ - case 'debug_backtrace': - case 'debug_print_backtrace': - $hasIgnoreArgs = $phpcsFile->findNext( - \T_STRING, - $paramOne['start'], - ($paramOne['end'] + 1), - false, - 'DEBUG_BACKTRACE_IGNORE_ARGS' - ); - - if ($hasIgnoreArgs !== false) { - // Debug_backtrace() called with ignore args option. - continue 2; - } - break; - - /* - * Collect the necessary information to only throw a notice if the argument - * touched/changed is in line with the passed $arg_num. - * - * Also, we can ignore `func_get_arg()` if the argument offset passed is - * higher than the number of named parameters. - * - * {@internal Note: This does not take calculations into account! - * Should be exceptionally rare and can - if needs be - be addressed at a later stage.} - */ - case 'func_get_arg': - $number = $phpcsFile->findNext(\T_LNUMBER, $paramOne['start'], ($paramOne['end'] + 1)); - if ($number !== false) { - $argNumber = $tokens[$number]['content']; - - if (isset($paramNames[$argNumber]) === false) { - // Requesting a non-named additional parameter. Ignore. - continue 2; - } - } - break; - } - } - } else { - /* - * Check if the call to func_get_args() happens to be in an array_slice() or - * array_splice() with an $offset higher than the number of named parameters. - * In that case, we can ignore it. - * - * {@internal Note: This does not take offset calculations into account! - * Should be exceptionally rare and can - if needs be - be addressed at a later stage.} - */ - if ($prev !== false && $tokens[$prev]['code'] === \T_OPEN_PARENTHESIS) { - - $maybeFunctionCall = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($prev - 1), null, true); - if ($maybeFunctionCall !== false - && $tokens[$maybeFunctionCall]['code'] === \T_STRING - && ($tokens[$maybeFunctionCall]['content'] === 'array_slice' - || $tokens[$maybeFunctionCall]['content'] === 'array_splice') - ) { - $parentFuncParamTwo = $this->getFunctionCallParameter($phpcsFile, $maybeFunctionCall, 2); - $number = $phpcsFile->findNext( - \T_LNUMBER, - $parentFuncParamTwo['start'], - ($parentFuncParamTwo['end'] + 1) - ); - - if ($number !== false && isset($paramNames[$tokens[$number]['content']]) === false) { - // Requesting non-named additional parameters. Ignore. - continue ; - } - - // Slice starts at a named argument, but we know which params are being accessed. - $paramNamesSubset = \array_slice($paramNames, $tokens[$number]['content']); - } - } - } - - /* - * For debug_backtrace(), check if the result is being dereferenced and if so, - * whether the `args` index is used. - * I.e. whether `$index` in `debug_backtrace()[$stackFrame][$index]` is a string - * with the content `args`. - * - * Note: We already know that $next is the open parenthesis of the function call. - */ - if ($foundFunctionName === 'debug_backtrace' && isset($tokens[$next]['parenthesis_closer'])) { - $afterParenthesis = $phpcsFile->findNext( - Tokens::$emptyTokens, - ($tokens[$next]['parenthesis_closer'] + 1), - null, - true - ); - - if ($tokens[$afterParenthesis]['code'] === \T_OPEN_SQUARE_BRACKET - && isset($tokens[$afterParenthesis]['bracket_closer']) - ) { - $afterStackFrame = $phpcsFile->findNext( - Tokens::$emptyTokens, - ($tokens[$afterParenthesis]['bracket_closer'] + 1), - null, - true - ); - - if ($tokens[$afterStackFrame]['code'] === \T_OPEN_SQUARE_BRACKET - && isset($tokens[$afterStackFrame]['bracket_closer']) - ) { - $arrayIndex = $phpcsFile->findNext( - \T_CONSTANT_ENCAPSED_STRING, - ($afterStackFrame + 1), - $tokens[$afterStackFrame]['bracket_closer'] - ); - - if ($arrayIndex !== false && $this->stripQuotes($tokens[$arrayIndex]['content']) !== 'args') { - continue; - } - } - } - } - - /* - * Only check for variables before the start of the statement to - * prevent false positives on the return value of the function call - * being assigned to one of the parameters, i.e.: - * `$param = func_get_args();`. - */ - $startOfStatement = PHPCSHelper::findStartOfStatement($phpcsFile, $i, $this->ignoreForStartOfStatement); - - /* - * Ok, so we've found one of the target functions in the right scope. - * Now, let's check if any of the passed parameters were touched. - */ - $scanResult = 'clean'; - for ($j = ($scopeOpener + 1); $j < $startOfStatement; $j++) { - if (isset($this->skipPastNested[$tokens[$j]['type']]) - && isset($tokens[$j]['scope_closer']) - ) { - // Skip past nested structures. - $j = $tokens[$j]['scope_closer']; - continue; - } - - if ($tokens[$j]['code'] !== \T_VARIABLE) { - continue; - } - - if ($foundFunctionName === 'func_get_arg' && isset($argNumber)) { - if (isset($paramNames[$argNumber]) - && $tokens[$j]['content'] !== $paramNames[$argNumber] - ) { - // Different param than the one requested by func_get_arg(). - continue; - } - } elseif ($foundFunctionName === 'func_get_args' && isset($paramNamesSubset)) { - if (\in_array($tokens[$j]['content'], $paramNamesSubset, true) === false) { - // Different param than the ones requested by func_get_args(). - continue; - } - } elseif (\in_array($tokens[$j]['content'], $paramNames, true) === false) { - // Variable is not one of the function parameters. - continue; - } - - /* - * Ok, so we've found a variable which was passed as one of the parameters. - * Now, is this variable being changed, i.e. incremented, decremented or - * assigned something ? - */ - $scanResult = 'warning'; - if (isset($variableToken) === false) { - $variableToken = $j; - } - - $beforeVar = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($j - 1), null, true); - if ($beforeVar !== false && isset($this->plusPlusMinusMinus[$tokens[$beforeVar]['code']])) { - // Variable is being (pre-)incremented/decremented. - $scanResult = 'error'; - $variableToken = $j; - break; - } - - $afterVar = $phpcsFile->findNext(Tokens::$emptyTokens, ($j + 1), null, true); - if ($afterVar === false) { - // Shouldn't be possible, but just in case. - continue; - } - - if (isset($this->plusPlusMinusMinus[$tokens[$afterVar]['code']])) { - // Variable is being (post-)incremented/decremented. - $scanResult = 'error'; - $variableToken = $j; - break; - } - - if ($tokens[$afterVar]['code'] === \T_OPEN_SQUARE_BRACKET - && isset($tokens[$afterVar]['bracket_closer']) - ) { - // Skip past array access on the variable. - while (($afterVar = $phpcsFile->findNext(Tokens::$emptyTokens, ($tokens[$afterVar]['bracket_closer'] + 1), null, true)) !== false) { - if ($tokens[$afterVar]['code'] !== \T_OPEN_SQUARE_BRACKET - || isset($tokens[$afterVar]['bracket_closer']) === false - ) { - break; - } - } - } - - if ($afterVar !== false - && isset(Tokens::$assignmentTokens[$tokens[$afterVar]['code']]) - ) { - // Variable is being assigned something. - $scanResult = 'error'; - $variableToken = $j; - break; - } - } - - unset($argNumber, $paramNamesSubset); - - if ($scanResult === 'clean') { - continue; - } - - $error = 'Since PHP 7.0, functions inspecting arguments, like %1$s(), no longer report the original value as passed to a parameter, but will instead provide the current value. The parameter "%2$s" was %4$s on line %3$s.'; - $data = array( - $foundFunctionName, - $tokens[$variableToken]['content'], - $tokens[$variableToken]['line'], - ); - - if ($scanResult === 'error') { - $data[] = 'changed'; - $phpcsFile->addError($error, $i, 'Changed', $data); - - } elseif ($scanResult === 'warning') { - $data[] = 'used, and possibly changed (by reference),'; - $phpcsFile->addWarning($error, $i, 'NeedsInspection', $data); - } - - unset($variableToken); - } - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionUse/ArgumentFunctionsUsageSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionUse/ArgumentFunctionsUsageSniff.php deleted file mode 100644 index 7c25111..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionUse/ArgumentFunctionsUsageSniff.php +++ /dev/null @@ -1,169 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\FunctionUse; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Detect usage of `func_get_args()`, `func_get_arg()` and `func_num_args()` in invalid context. - * - * Checks for: - * - Prior to PHP 5.3, these functions could not be used as a function call parameter. - * - Calling these functions from the outermost scope of a file which has been included by - * calling `include` or `require` from within a function in the calling file, worked - * prior to PHP 5.3. As of PHP 5.3, this will generate a warning and will always return false/-1. - * If the file was called directly or included in the global scope, calls to these - * functions would already generate a warning prior to PHP 5.3. - * - * PHP version 5.3 - * - * @link https://www.php.net/manual/en/migration53.incompatible.php - * - * @since 8.2.0 - */ -class ArgumentFunctionsUsageSniff extends Sniff -{ - - /** - * The target functions for this sniff. - * - * @since 8.2.0 - * - * @var array - */ - protected $targetFunctions = array( - 'func_get_args' => true, - 'func_get_arg' => true, - 'func_num_args' => true, - ); - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 8.2.0 - * - * @return array - */ - public function register() - { - return array(\T_STRING); - } - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 8.2.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $functionLc = strtolower($tokens[$stackPtr]['content']); - if (isset($this->targetFunctions[$functionLc]) === false) { - return; - } - - // Next non-empty token should be the open parenthesis. - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true, null, true); - if ($nextNonEmpty === false || $tokens[$nextNonEmpty]['code'] !== \T_OPEN_PARENTHESIS) { - return; - } - - $ignore = array( - \T_DOUBLE_COLON => true, - \T_OBJECT_OPERATOR => true, - \T_FUNCTION => true, - \T_NEW => true, - ); - - $prevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if (isset($ignore[$tokens[$prevNonEmpty]['code']]) === true) { - // Not a call to a PHP function. - return; - } elseif ($tokens[$prevNonEmpty]['code'] === \T_NS_SEPARATOR && $tokens[$prevNonEmpty - 1]['code'] === \T_STRING) { - // Namespaced function. - return; - } - - $data = $tokens[$stackPtr]['content']; - - /* - * Check for use of the functions in the global scope. - * - * As PHPCS can not determine whether a file is included from within a function in - * another file, so always throw a warning/error. - */ - if ($phpcsFile->hasCondition($stackPtr, array(\T_FUNCTION, \T_CLOSURE)) === false) { - $isError = false; - $message = 'Use of %s() outside of a user-defined function is only supported if the file is included from within a user-defined function in another file prior to PHP 5.3.'; - - if ($this->supportsAbove('5.3') === true) { - $isError = true; - $message .= ' As of PHP 5.3, it is no longer supported at all.'; - } - - $this->addMessage($phpcsFile, $message, $stackPtr, $isError, 'OutsideFunctionScope', $data); - } - - /* - * Check for use of the functions as a parameter in a function call. - */ - if ($this->supportsBelow('5.2') === false) { - return; - } - - if (isset($tokens[$stackPtr]['nested_parenthesis']) === false) { - return; - } - - $throwError = false; - - $closer = end($tokens[$stackPtr]['nested_parenthesis']); - if (isset($tokens[$closer]['parenthesis_owner']) - && $tokens[$tokens[$closer]['parenthesis_owner']]['type'] === 'T_CLOSURE' - ) { - $throwError = true; - } else { - $opener = key($tokens[$stackPtr]['nested_parenthesis']); - $prevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($opener - 1), null, true); - if ($tokens[$prevNonEmpty]['code'] !== \T_STRING) { - return; - } - - $prevPrevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($prevNonEmpty - 1), null, true); - if ($tokens[$prevPrevNonEmpty]['code'] === \T_FUNCTION) { - return; - } - - $throwError = true; - } - - if ($throwError === false) { - return; - } - - $phpcsFile->addError( - '%s() could not be used in parameter lists prior to PHP 5.3.', - $stackPtr, - 'InParameterList', - $data - ); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionUse/NewFunctionParametersSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionUse/NewFunctionParametersSniff.php deleted file mode 100644 index 7b0d60b..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionUse/NewFunctionParametersSniff.php +++ /dev/null @@ -1,1109 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\FunctionUse; - -use PHPCompatibility\AbstractNewFeatureSniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Detect use of new function parameters in calls to native PHP functions. - * - * PHP version All - * - * @link https://www.php.net/manual/en/doc.changelog.php - * - * @since 7.0.0 - * @since 7.1.0 Now extends the `AbstractNewFeatureSniff` instead of the base `Sniff` class.. - */ -class NewFunctionParametersSniff extends AbstractNewFeatureSniff -{ - /** - * A list of functions which have new parameters, not present in older versions. - * - * The array lists : version number with false (not present) or true (present). - * The index is the location of the parameter in the parameter list, starting at 0 ! - * If's sufficient to list the first version where the function appears. - * - * @since 7.0.0 - * @since 7.0.2 Visibility changed from `public` to `protected`. - * - * @var array - */ - protected $newFunctionParameters = array( - 'array_filter' => array( - 2 => array( - 'name' => 'flag', - '5.5' => false, - '5.6' => true, - ), - ), - 'array_slice' => array( - 1 => array( - 'name' => 'preserve_keys', - '5.0.1' => false, - '5.0.2' => true, - ), - ), - 'array_unique' => array( - 1 => array( - 'name' => 'sort_flags', - '5.2.8' => false, - '5.2.9' => true, - ), - ), - 'assert' => array( - 1 => array( - 'name' => 'description', - '5.4.7' => false, - '5.4.8' => true, - ), - ), - 'base64_decode' => array( - 1 => array( - 'name' => 'strict', - '5.1' => false, - '5.2' => true, - ), - ), - 'bcmod' => array( - 2 => array( - 'name' => 'scale', - '7.1' => false, - '7.2' => true, - ), - ), - 'class_implements' => array( - 1 => array( - 'name' => 'autoload', - '5.0' => false, - '5.1' => true, - ), - ), - 'class_parents' => array( - 1 => array( - 'name' => 'autoload', - '5.0' => false, - '5.1' => true, - ), - ), - 'clearstatcache' => array( - 0 => array( - 'name' => 'clear_realpath_cache', - '5.2' => false, - '5.3' => true, - ), - 1 => array( - 'name' => 'filename', - '5.2' => false, - '5.3' => true, - ), - ), - 'copy' => array( - 2 => array( - 'name' => 'context', - '5.2' => false, - '5.3' => true, - ), - ), - 'curl_multi_info_read' => array( - 1 => array( - 'name' => 'msgs_in_queue', - '5.1' => false, - '5.2' => true, - ), - ), - 'debug_backtrace' => array( - 0 => array( - 'name' => 'options', - '5.2.4' => false, - '5.2.5' => true, - ), - 1 => array( - 'name' => 'limit', - '5.3' => false, - '5.4' => true, - ), - ), - 'debug_print_backtrace' => array( - 0 => array( - 'name' => 'options', - '5.3.5' => false, - '5.3.6' => true, - ), - 1 => array( - 'name' => 'limit', - '5.3' => false, - '5.4' => true, - ), - ), - 'dirname' => array( - 1 => array( - 'name' => 'levels', - '5.6' => false, - '7.0' => true, - ), - ), - 'dns_get_record' => array( - 4 => array( - 'name' => 'raw', - '5.3' => false, - '5.4' => true, - ), - ), - 'fgetcsv' => array( - 4 => array( - 'name' => 'escape', - '5.2' => false, - '5.3' => true, - ), - ), - 'fputcsv' => array( - 4 => array( - 'name' => 'escape_char', - '5.5.3' => false, - '5.5.4' => true, - ), - ), - 'file_get_contents' => array( - 3 => array( - 'name' => 'offset', - '5.0' => false, - '5.1' => true, - ), - 4 => array( - 'name' => 'maxlen', - '5.0' => false, - '5.1' => true, - ), - ), - 'filter_input_array' => array( - 2 => array( - 'name' => 'add_empty', - '5.3' => false, - '5.4' => true, - ), - ), - 'filter_var_array' => array( - 2 => array( - 'name' => 'add_empty', - '5.3' => false, - '5.4' => true, - ), - ), - 'getenv' => array( - 1 => array( - 'name' => 'local_only', - '5.5.37' => false, - '5.5.38' => true, // Also introduced in PHP 5.6.24 and 7.0.9. - ), - ), - 'getopt' => array( - 2 => array( - 'name' => 'optind', - '7.0' => false, - '7.1' => true, - ), - ), - 'gettimeofday' => array( - 0 => array( - 'name' => 'return_float', - '5.0' => false, - '5.1' => true, - ), - ), - 'get_defined_functions' => array( - 0 => array( - 'name' => 'exclude_disabled', - '7.0.14' => false, - '7.0.15' => true, - ), - ), - 'get_headers' => array( - 2 => array( - 'name' => 'context', - '7.0' => false, - '7.1' => true, - ), - ), - 'get_html_translation_table' => array( - 2 => array( - 'name' => 'encoding', - '5.3.3' => false, - '5.3.4' => true, - ), - ), - 'get_loaded_extensions' => array( - 0 => array( - 'name' => 'zend_extensions', - '5.2.3' => false, - '5.2.4' => true, - ), - ), - 'gzcompress' => array( - 2 => array( - 'name' => 'encoding', - '5.3' => false, - '5.4' => true, - ), - ), - 'gzdeflate' => array( - 2 => array( - 'name' => 'encoding', - '5.3' => false, - '5.4' => true, - ), - ), - 'htmlentities' => array( - 3 => array( - 'name' => 'double_encode', - '5.2.2' => false, - '5.2.3' => true, - ), - ), - 'htmlspecialchars' => array( - 3 => array( - 'name' => 'double_encode', - '5.2.2' => false, - '5.2.3' => true, - ), - ), - 'http_build_query' => array( - 2 => array( - 'name' => 'arg_separator', - '5.1.1' => false, - '5.1.2' => true, - ), - 3 => array( - 'name' => 'enc_type', - '5.3' => false, - '5.4' => true, - ), - ), - 'idn_to_ascii' => array( - 2 => array( - 'name' => 'variant', - '5.3' => false, - '5.4' => true, - ), - 3 => array( - 'name' => 'idna_info', - '5.3' => false, - '5.4' => true, - ), - ), - 'idn_to_utf8' => array( - 2 => array( - 'name' => 'variant', - '5.3' => false, - '5.4' => true, - ), - 3 => array( - 'name' => 'idna_info', - '5.3' => false, - '5.4' => true, - ), - ), - 'imagecolorset' => array( - 5 => array( - 'name' => 'alpha', - '5.3' => false, - '5.4' => true, - ), - ), - 'imagepng' => array( - 2 => array( - 'name' => 'quality', - '5.1.1' => false, - '5.1.2' => true, - ), - 3 => array( - 'name' => 'filters', - '5.1.2' => false, - '5.1.3' => true, - ), - ), - 'imagerotate' => array( - 3 => array( - 'name' => 'ignore_transparent', - '5.0' => false, - '5.1' => true, - ), - ), - 'imap_open' => array( - 4 => array( - 'name' => 'n_retries', - '5.1' => false, - '5.2' => true, - ), - 5 => array( - 'name' => 'params', - '5.3.1' => false, - '5.3.2' => true, - ), - ), - 'imap_reopen' => array( - 3 => array( - 'name' => 'n_retries', - '5.1' => false, - '5.2' => true, - ), - ), - 'ini_get_all' => array( - 1 => array( - 'name' => 'details', - '5.2' => false, - '5.3' => true, - ), - ), - 'is_a' => array( - 2 => array( - 'name' => 'allow_string', - '5.3.8' => false, - '5.3.9' => true, - ), - ), - 'is_subclass_of' => array( - 2 => array( - 'name' => 'allow_string', - '5.3.8' => false, - '5.3.9' => true, - ), - ), - 'iterator_to_array' => array( - 1 => array( - 'name' => 'use_keys', - '5.2.0' => false, - '5.2.1' => true, - ), - ), - 'json_decode' => array( - 2 => array( - 'name' => 'depth', - '5.2' => false, - '5.3' => true, - ), - 3 => array( - 'name' => 'options', - '5.3' => false, - '5.4' => true, - ), - ), - 'json_encode' => array( - 1 => array( - 'name' => 'options', - '5.2' => false, - '5.3' => true, - ), - 2 => array( - 'name' => 'depth', - '5.4' => false, - '5.5' => true, - ), - ), - 'ldap_add' => array( - 3 => array( - 'name' => 'serverctrls', - '7.2' => false, - '7.3' => true, - ), - ), - 'ldap_compare' => array( - 4 => array( - 'name' => 'serverctrls', - '7.2' => false, - '7.3' => true, - ), - ), - 'ldap_delete' => array( - 2 => array( - 'name' => 'serverctrls', - '7.2' => false, - '7.3' => true, - ), - ), - 'ldap_list' => array( - 8 => array( - 'name' => 'serverctrls', - '7.2' => false, - '7.3' => true, - ), - ), - 'ldap_mod_add' => array( - 3 => array( - 'name' => 'serverctrls', - '7.2' => false, - '7.3' => true, - ), - ), - 'ldap_mod_del' => array( - 3 => array( - 'name' => 'serverctrls', - '7.2' => false, - '7.3' => true, - ), - ), - 'ldap_mod_replace' => array( - 3 => array( - 'name' => 'serverctrls', - '7.2' => false, - '7.3' => true, - ), - ), - 'ldap_modify_batch' => array( - 3 => array( - 'name' => 'serverctrls', - '7.2' => false, - '7.3' => true, - ), - ), - 'ldap_parse_result' => array( - 6 => array( - 'name' => 'serverctrls', - '7.2' => false, - '7.3' => true, - ), - ), - 'ldap_read' => array( - 8 => array( - 'name' => 'serverctrls', - '7.2' => false, - '7.3' => true, - ), - ), - 'ldap_rename' => array( - 5 => array( - 'name' => 'serverctrls', - '7.2' => false, - '7.3' => true, - ), - ), - 'ldap_search' => array( - 8 => array( - 'name' => 'serverctrls', - '7.2' => false, - '7.3' => true, - ), - ), - 'memory_get_peak_usage' => array( - 0 => array( - 'name' => 'real_usage', - '5.1' => false, - '5.2' => true, - ), - ), - 'memory_get_usage' => array( - 0 => array( - 'name' => 'real_usage', - '5.1' => false, - '5.2' => true, - ), - ), - 'mb_encode_numericentity' => array( - 3 => array( - 'name' => 'is_hex', - '5.3' => false, - '5.4' => true, - ), - ), - 'mb_strrpos' => array( - /* - * Note: the actual position is 2, but the original 3rd - * parameter 'encoding' was moved to the 4th position. - * So the only way to detect if offset is used is when - * both offset and encoding are set. - */ - 3 => array( - 'name' => 'offset', - '5.1' => false, - '5.2' => true, - ), - ), - 'mssql_connect' => array( - 3 => array( - 'name' => 'new_link', - '5.0' => false, - '5.1' => true, - ), - ), - 'mysqli_commit' => array( - 1 => array( - 'name' => 'flags', - '5.4' => false, - '5.5' => true, - ), - 2 => array( - 'name' => 'name', - '5.4' => false, - '5.5' => true, - ), - ), - 'mysqli_rollback' => array( - 1 => array( - 'name' => 'flags', - '5.4' => false, - '5.5' => true, - ), - 2 => array( - 'name' => 'name', - '5.4' => false, - '5.5' => true, - ), - ), - 'nl2br' => array( - 1 => array( - 'name' => 'is_xhtml', - '5.2' => false, - '5.3' => true, - ), - ), - 'openssl_decrypt' => array( - 4 => array( - 'name' => 'iv', - '5.3.2' => false, - '5.3.3' => true, - ), - 5 => array( - 'name' => 'tag', - '7.0' => false, - '7.1' => true, - ), - 6 => array( - 'name' => 'aad', - '7.0' => false, - '7.1' => true, - ), - ), - 'openssl_encrypt' => array( - 4 => array( - 'name' => 'iv', - '5.3.2' => false, - '5.3.3' => true, - ), - 5 => array( - 'name' => 'tag', - '7.0' => false, - '7.1' => true, - ), - 6 => array( - 'name' => 'aad', - '7.0' => false, - '7.1' => true, - ), - 7 => array( - 'name' => 'tag_length', - '7.0' => false, - '7.1' => true, - ), - ), - 'openssl_open' => array( - 4 => array( - 'name' => 'method', - '5.2' => false, - '5.3' => true, - ), - 5 => array( - 'name' => 'iv', - '5.6' => false, - '7.0' => true, - ), - ), - 'openssl_pkcs7_verify' => array( - 5 => array( - 'name' => 'content', - '5.0' => false, - '5.1' => true, - ), - 6 => array( - 'name' => 'p7bfilename', - '7.1' => false, - '7.2' => true, - ), - ), - 'openssl_seal' => array( - 4 => array( - 'name' => 'method', - '5.2' => false, - '5.3' => true, - ), - 5 => array( - 'name' => 'iv', - '5.6' => false, - '7.0' => true, - ), - ), - 'openssl_verify' => array( - 3 => array( - 'name' => 'signature_alg', - '5.1' => false, - '5.2' => true, - ), - ), - 'parse_ini_file' => array( - 2 => array( - 'name' => 'scanner_mode', - '5.2' => false, - '5.3' => true, - ), - ), - 'parse_url' => array( - 1 => array( - 'name' => 'component', - '5.1.1' => false, - '5.1.2' => true, - ), - ), - 'pg_fetch_all' => array( - 1 => array( - 'name' => 'result_type', - '7.0' => false, - '7.1' => true, - ), - ), - 'pg_last_notice' => array( - 1 => array( - 'name' => 'option', - '7.0' => false, - '7.1' => true, - ), - ), - 'pg_lo_create' => array( - 1 => array( - 'name' => 'object_id', - '5.2' => false, - '5.3' => true, - ), - ), - 'pg_lo_import' => array( - 2 => array( - 'name' => 'object_id', - '5.2' => false, - '5.3' => true, - ), - ), - 'pg_select' => array( - 4 => array( - 'name' => 'result_type', - '7.0' => false, - '7.1' => true, - ), - ), - 'php_uname' => array( - 0 => array( - 'name' => 'mode', - '4.2' => false, - '4.3' => true, - ), - ), - 'preg_replace' => array( - 4 => array( - 'name' => 'count', - '5.0' => false, - '5.1' => true, - ), - ), - 'preg_replace_callback' => array( - 4 => array( - 'name' => 'count', - '5.0' => false, - '5.1' => true, - ), - 5 => array( - 'name' => 'flags', - '7.3' => false, - '7.4' => true, - ), - ), - 'preg_replace_callback_array' => array( - 4 => array( - 'name' => 'flags', - '7.3' => false, - '7.4' => true, - ), - ), - 'round' => array( - 2 => array( - 'name' => 'mode', - '5.2' => false, - '5.3' => true, - ), - ), - 'sem_acquire' => array( - 1 => array( - 'name' => 'nowait', - '5.6' => false, - '5.6.1' => true, - ), - ), - 'session_regenerate_id' => array( - 0 => array( - 'name' => 'delete_old_session', - '5.0' => false, - '5.1' => true, - ), - ), - 'session_set_cookie_params' => array( - 4 => array( - 'name' => 'httponly', - '5.1' => false, - '5.2' => true, - ), - ), - 'session_set_save_handler' => array( - 6 => array( - 'name' => 'create_sid', - '5.5.0' => false, - '5.5.1' => true, - ), - 7 => array( - 'name' => 'validate_sid', - '5.6' => false, - '7.0' => true, - ), - 8 => array( - 'name' => 'update_timestamp', - '5.6' => false, - '7.0' => true, - ), - ), - 'session_start' => array( - 0 => array( - 'name' => 'options', - '5.6' => false, - '7.0' => true, - ), - ), - 'setcookie' => array( - 6 => array( - 'name' => 'httponly', - '5.1' => false, - '5.2' => true, - ), - ), - 'setrawcookie' => array( - 6 => array( - 'name' => 'httponly', - '5.1' => false, - '5.2' => true, - ), - ), - 'simplexml_load_file' => array( - 4 => array( - 'name' => 'is_prefix', - '5.1' => false, - '5.2' => true, - ), - ), - 'simplexml_load_string' => array( - 4 => array( - 'name' => 'is_prefix', - '5.1' => false, - '5.2' => true, - ), - ), - 'spl_autoload_register' => array( - 2 => array( - 'name' => 'prepend', - '5.2' => false, - '5.3' => true, - ), - ), - 'stream_context_create' => array( - 1 => array( - 'name' => 'params', - '5.2' => false, - '5.3' => true, - ), - ), - 'stream_copy_to_stream' => array( - 3 => array( - 'name' => 'offset', - '5.0' => false, - '5.1' => true, - ), - ), - 'stream_get_contents' => array( - 2 => array( - 'name' => 'offset', - '5.0' => false, - '5.1' => true, - ), - ), - 'stream_wrapper_register' => array( - 2 => array( - 'name' => 'flags', - '5.2.3' => false, - '5.2.4' => true, - ), - ), - 'stristr' => array( - 2 => array( - 'name' => 'before_needle', - '5.2' => false, - '5.3' => true, - ), - ), - 'strstr' => array( - 2 => array( - 'name' => 'before_needle', - '5.2' => false, - '5.3' => true, - ), - ), - 'str_word_count' => array( - 2 => array( - 'name' => 'charlist', - '5.0' => false, - '5.1' => true, - ), - ), - 'substr_count' => array( - 2 => array( - 'name' => 'offset', - '5.0' => false, - '5.1' => true, - ), - 3 => array( - 'name' => 'length', - '5.0' => false, - '5.1' => true, - ), - ), - 'sybase_connect' => array( - 5 => array( - 'name' => 'new', - '5.2' => false, - '5.3' => true, - ), - ), - 'timezone_transitions_get' => array( - 1 => array( - 'name' => 'timestamp_begin', - '5.2' => false, - '5.3' => true, - ), - 2 => array( - 'name' => 'timestamp_end', - '5.2' => false, - '5.3' => true, - ), - ), - 'timezone_identifiers_list' => array( - 0 => array( - 'name' => 'what', - '5.2' => false, - '5.3' => true, - ), - 1 => array( - 'name' => 'country', - '5.2' => false, - '5.3' => true, - ), - ), - 'token_get_all' => array( - 1 => array( - 'name' => 'flags', - '5.6' => false, - '7.0' => true, - ), - ), - 'ucwords' => array( - 1 => array( - 'name' => 'delimiters', - '5.4.31' => false, - '5.5.15' => false, - '5.4.32' => true, - '5.5.16' => true, - ), - ), - 'unpack' => array( - 2 => array( - 'name' => 'offset', - '7.0' => false, - '7.1' => true, - ), - ), - 'unserialize' => array( - 1 => array( - 'name' => 'options', - '5.6' => false, - '7.0' => true, - ), - ), - ); - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 7.0.0 - * - * @return array - */ - public function register() - { - // Handle case-insensitivity of function names. - $this->newFunctionParameters = $this->arrayKeysToLowercase($this->newFunctionParameters); - - return array(\T_STRING); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 7.0.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $ignore = array( - \T_DOUBLE_COLON => true, - \T_OBJECT_OPERATOR => true, - \T_FUNCTION => true, - \T_CONST => true, - ); - - $prevToken = $phpcsFile->findPrevious(\T_WHITESPACE, ($stackPtr - 1), null, true); - if (isset($ignore[$tokens[$prevToken]['code']]) === true) { - // Not a call to a PHP function. - return; - } - - $function = $tokens[$stackPtr]['content']; - $functionLc = strtolower($function); - - if (isset($this->newFunctionParameters[$functionLc]) === false) { - return; - } - - $parameterCount = $this->getFunctionCallParameterCount($phpcsFile, $stackPtr); - if ($parameterCount === 0) { - return; - } - - // If the parameter count returned > 0, we know there will be valid open parenthesis. - $openParenthesis = $phpcsFile->findNext(Tokens::$emptyTokens, $stackPtr + 1, null, true, null, true); - $parameterOffsetFound = $parameterCount - 1; - - foreach ($this->newFunctionParameters[$functionLc] as $offset => $parameterDetails) { - if ($offset <= $parameterOffsetFound) { - $itemInfo = array( - 'name' => $function, - 'nameLc' => $functionLc, - 'offset' => $offset, - ); - $this->handleFeature($phpcsFile, $openParenthesis, $itemInfo); - } - } - } - - - /** - * Get the relevant sub-array for a specific item from a multi-dimensional array. - * - * @since 7.1.0 - * - * @param array $itemInfo Base information about the item. - * - * @return array Version and other information about the item. - */ - public function getItemArray(array $itemInfo) - { - return $this->newFunctionParameters[$itemInfo['nameLc']][$itemInfo['offset']]; - } - - - /** - * Get an array of the non-PHP-version array keys used in a sub-array. - * - * @since 7.1.0 - * - * @return array - */ - protected function getNonVersionArrayKeys() - { - return array('name'); - } - - - /** - * Retrieve the relevant detail (version) information for use in an error message. - * - * @since 7.1.0 - * - * @param array $itemArray Version and other information about the item. - * @param array $itemInfo Base information about the item. - * - * @return array - */ - public function getErrorInfo(array $itemArray, array $itemInfo) - { - $errorInfo = parent::getErrorInfo($itemArray, $itemInfo); - $errorInfo['paramName'] = $itemArray['name']; - - return $errorInfo; - } - - - /** - * Get the item name to be used for the creation of the error code. - * - * @since 7.1.0 - * - * @param array $itemInfo Base information about the item. - * @param array $errorInfo Detail information about an item. - * - * @return string - */ - protected function getItemName(array $itemInfo, array $errorInfo) - { - return $itemInfo['name'] . '_' . $errorInfo['paramName']; - } - - - /** - * Get the error message template for this sniff. - * - * @since 7.1.0 - * - * @return string - */ - protected function getErrorMsgTemplate() - { - return 'The function %s() does not have a parameter "%s" in PHP version %s or earlier'; - } - - - /** - * Allow for concrete child classes to filter the error data before it's passed to PHPCS. - * - * @since 7.1.0 - * - * @param array $data The error data array which was created. - * @param array $itemInfo Base information about the item this error message applies to. - * @param array $errorInfo Detail information about an item this error message applies to. - * - * @return array - */ - protected function filterErrorData(array $data, array $itemInfo, array $errorInfo) - { - array_shift($data); - array_unshift($data, $itemInfo['name'], $errorInfo['paramName']); - return $data; - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionUse/NewFunctionsSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionUse/NewFunctionsSniff.php deleted file mode 100644 index c1a0ec4..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionUse/NewFunctionsSniff.php +++ /dev/null @@ -1,2008 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\FunctionUse; - -use PHPCompatibility\AbstractNewFeatureSniff; -use PHP_CodeSniffer_File as File; - -/** - * Detect calls to new native PHP functions. - * - * PHP version All - * - * @since 5.5 - * @since 5.6 Now extends the base `Sniff` class instead of the upstream - * `Generic.PHP.ForbiddenFunctions` sniff. - * @since 7.1.0 Now extends the `AbstractNewFeatureSniff` instead of the base `Sniff` class.. - */ -class NewFunctionsSniff extends AbstractNewFeatureSniff -{ - /** - * A list of new functions, not present in older versions. - * - * The array lists : version number with false (not present) or true (present). - * If's sufficient to list the first version where the function appears. - * - * @since 5.5 - * @since 5.6 Visibility changed from `protected` to `public`. - * @since 7.0.2 Visibility changed back from `public` to `protected`. - * The earlier change was made to be in line with the upstream sniff, - * but that sniff is no longer being extended. - * @since 7.0.8 Renamed from `$forbiddenFunctions` to the more descriptive `$newFunctions`. - * - * @var array(string => array(string => bool)) - */ - protected $newFunctions = array( - 'iterator_count' => array( - '5.0' => false, - '5.1' => true, - ), - 'iterator_to_array' => array( - '5.0' => false, - '5.1' => true, - ), - 'spl_autoload_call' => array( - '5.0' => false, - '5.1' => true, - ), - 'spl_autoload_extensions' => array( - '5.0' => false, - '5.1' => true, - ), - 'spl_autoload_functions' => array( - '5.0' => false, - '5.1' => true, - ), - 'spl_autoload_register' => array( - '5.0' => false, - '5.1' => true, - ), - 'spl_autoload_unregister' => array( - '5.0' => false, - '5.1' => true, - ), - 'spl_autoload' => array( - '5.0' => false, - '5.1' => true, - ), - 'hash_hmac' => array( - '5.1.1' => false, - '5.1.2' => true, - ), - 'array_fill_keys' => array( - '5.1' => false, - '5.2' => true, - ), - 'error_get_last' => array( - '5.1' => false, - '5.2' => true, - ), - 'image_type_to_extension' => array( - '5.1' => false, - '5.2' => true, - ), - 'memory_get_peak_usage' => array( - '5.1' => false, - '5.2' => true, - ), - 'sys_get_temp_dir' => array( - '5.1' => false, - '5.2' => true, - ), - 'timezone_abbreviations_list' => array( - '5.1' => false, - '5.2' => true, - ), - 'timezone_identifiers_list' => array( - '5.1' => false, - '5.2' => true, - ), - 'timezone_name_from_abbr' => array( - '5.1' => false, - '5.2' => true, - ), - 'stream_socket_shutdown' => array( - '5.1' => false, - '5.2' => true, - ), - 'imagegrabscreen' => array( - '5.1' => false, - '5.2' => true, - ), - 'imagegrabwindow' => array( - '5.1' => false, - '5.2' => true, - ), - 'libxml_disable_entity_loader' => array( - '5.1' => false, - '5.2' => true, - ), - 'mb_stripos' => array( - '5.1' => false, - '5.2' => true, - ), - 'mb_stristr' => array( - '5.1' => false, - '5.2' => true, - ), - 'mb_strrchr' => array( - '5.1' => false, - '5.2' => true, - ), - 'mb_strrichr' => array( - '5.1' => false, - '5.2' => true, - ), - 'mb_strripos' => array( - '5.1' => false, - '5.2' => true, - ), - 'ming_setSWFCompression' => array( - '5.1' => false, - '5.2' => true, - ), - 'openssl_csr_get_public_key' => array( - '5.1' => false, - '5.2' => true, - ), - 'openssl_csr_get_subject' => array( - '5.1' => false, - '5.2' => true, - ), - 'openssl_pkey_get_details' => array( - '5.1' => false, - '5.2' => true, - ), - 'spl_object_hash' => array( - '5.1' => false, - '5.2' => true, - ), - 'iterator_apply' => array( - '5.1' => false, - '5.2' => true, - ), - 'preg_last_error' => array( - '5.1' => false, - '5.2' => true, - ), - 'pg_field_table' => array( - '5.1' => false, - '5.2' => true, - ), - 'posix_initgroups' => array( - '5.1' => false, - '5.2' => true, - ), - 'gmp_nextprime' => array( - '5.1' => false, - '5.2' => true, - ), - 'xmlwriter_full_end_element' => array( - '5.1' => false, - '5.2' => true, - ), - 'xmlwriter_write_raw' => array( - '5.1' => false, - '5.2' => true, - ), - 'xmlwriter_start_dtd_entity' => array( - '5.1' => false, - '5.2' => true, - ), - 'xmlwriter_end_dtd_entity' => array( - '5.1' => false, - '5.2' => true, - ), - 'xmlwriter_write_dtd_entity' => array( - '5.1' => false, - '5.2' => true, - ), - 'filter_has_var' => array( - '5.1' => false, - '5.2' => true, - ), - 'filter_id' => array( - '5.1' => false, - '5.2' => true, - ), - 'filter_input_array' => array( - '5.1' => false, - '5.2' => true, - ), - 'filter_input' => array( - '5.1' => false, - '5.2' => true, - ), - 'filter_list' => array( - '5.1' => false, - '5.2' => true, - ), - 'filter_var_array' => array( - '5.1' => false, - '5.2' => true, - ), - 'filter_var' => array( - '5.1' => false, - '5.2' => true, - ), - 'json_decode' => array( - '5.1' => false, - '5.2' => true, - ), - 'json_encode' => array( - '5.1' => false, - '5.2' => true, - ), - 'zip_close' => array( - '5.1' => false, - '5.2' => true, - ), - 'zip_entry_close' => array( - '5.1' => false, - '5.2' => true, - ), - 'zip_entry_compressedsize' => array( - '5.1' => false, - '5.2' => true, - ), - 'zip_entry_compressionmethod' => array( - '5.1' => false, - '5.2' => true, - ), - 'zip_entry_filesize' => array( - '5.1' => false, - '5.2' => true, - ), - 'zip_entry_name' => array( - '5.1' => false, - '5.2' => true, - ), - 'zip_entry_open' => array( - '5.1' => false, - '5.2' => true, - ), - 'zip_entry_read' => array( - '5.1' => false, - '5.2' => true, - ), - 'zip_open' => array( - '5.1' => false, - '5.2' => true, - ), - 'zip_read' => array( - '5.1' => false, - '5.2' => true, - ), - - 'array_replace' => array( - '5.2' => false, - '5.3' => true, - ), - 'array_replace_recursive' => array( - '5.2' => false, - '5.3' => true, - ), - 'class_alias' => array( - '5.2' => false, - '5.3' => true, - ), - 'forward_static_call' => array( - '5.2' => false, - '5.3' => true, - ), - 'forward_static_call_array' => array( - '5.2' => false, - '5.3' => true, - ), - 'gc_collect_cycles' => array( - '5.2' => false, - '5.3' => true, - ), - 'gc_disable' => array( - '5.2' => false, - '5.3' => true, - ), - 'gc_enable' => array( - '5.2' => false, - '5.3' => true, - ), - 'gc_enabled' => array( - '5.2' => false, - '5.3' => true, - ), - 'get_called_class' => array( - '5.2' => false, - '5.3' => true, - ), - 'gethostname' => array( - '5.2' => false, - '5.3' => true, - ), - 'header_remove' => array( - '5.2' => false, - '5.3' => true, - ), - 'lcfirst' => array( - '5.2' => false, - '5.3' => true, - ), - 'parse_ini_string' => array( - '5.2' => false, - '5.3' => true, - ), - 'quoted_printable_encode' => array( - '5.2' => false, - '5.3' => true, - ), - 'str_getcsv' => array( - '5.2' => false, - '5.3' => true, - ), - 'stream_context_set_default' => array( - '5.2' => false, - '5.3' => true, - ), - 'stream_supports_lock' => array( - '5.2' => false, - '5.3' => true, - ), - 'stream_context_get_params' => array( - '5.2' => false, - '5.3' => true, - ), - 'date_add' => array( - '5.2' => false, - '5.3' => true, - ), - 'date_create_from_format' => array( - '5.2' => false, - '5.3' => true, - ), - 'date_diff' => array( - '5.2' => false, - '5.3' => true, - ), - 'date_get_last_errors' => array( - '5.2' => false, - '5.3' => true, - ), - 'date_parse_from_format' => array( - '5.2' => false, - '5.3' => true, - ), - 'date_sub' => array( - '5.2' => false, - '5.3' => true, - ), - 'timezone_version_get' => array( - '5.2' => false, - '5.3' => true, - ), - 'gmp_testbit' => array( - '5.2' => false, - '5.3' => true, - ), - 'hash_copy' => array( - '5.2' => false, - '5.3' => true, - ), - 'imap_gc' => array( - '5.2' => false, - '5.3' => true, - ), - 'imap_utf8_to_mutf7' => array( - '5.2' => false, - '5.3' => true, - ), - 'imap_mutf7_to_utf8' => array( - '5.2' => false, - '5.3' => true, - ), - 'json_last_error' => array( - '5.2' => false, - '5.3' => true, - ), - 'mysqli_get_cache_stats' => array( - '5.2' => false, - '5.3' => true, - ), - 'mysqli_fetch_all' => array( - '5.2' => false, - '5.3' => true, - ), - 'mysqli_get_connection_status' => array( - '5.2' => false, - '5.3' => true, - ), - 'mysqli_poll' => array( - '5.2' => false, - '5.3' => true, - ), - 'mysqli_read_async_query' => array( - '5.2' => false, - '5.3' => true, - ), - 'openssl_random_pseudo_bytes' => array( - '5.2' => false, - '5.3' => true, - ), - 'pcntl_signal_dispatch' => array( - '5.2' => false, - '5.3' => true, - ), - 'pcntl_sigprocmask' => array( - '5.2' => false, - '5.3' => true, - ), - 'pcntl_sigtimedwait' => array( - '5.2' => false, - '5.3' => true, - ), - 'pcntl_sigwaitinfo' => array( - '5.2' => false, - '5.3' => true, - ), - 'preg_filter' => array( - '5.2' => false, - '5.3' => true, - ), - 'msg_queue_exists' => array( - '5.2' => false, - '5.3' => true, - ), - 'shm_has_vars' => array( - '5.2' => false, - '5.3' => true, - ), - 'acosh' => array( - '5.2' => false, - '5.3' => true, - ), - 'asinh' => array( - '5.2' => false, - '5.3' => true, - ), - 'atanh' => array( - '5.2' => false, - '5.3' => true, - ), - 'expm1' => array( - '5.2' => false, - '5.3' => true, - ), - 'log1p' => array( - '5.2' => false, - '5.3' => true, - ), - 'enchant_broker_describe' => array( - '5.2' => false, - '5.3' => true, - ), - 'enchant_broker_dict_exists' => array( - '5.2' => false, - '5.3' => true, - ), - 'enchant_broker_free_dict' => array( - '5.2' => false, - '5.3' => true, - ), - 'enchant_broker_free' => array( - '5.2' => false, - '5.3' => true, - ), - 'enchant_broker_get_error' => array( - '5.2' => false, - '5.3' => true, - ), - 'enchant_broker_init' => array( - '5.2' => false, - '5.3' => true, - ), - 'enchant_broker_list_dicts' => array( - '5.2' => false, - '5.3' => true, - ), - 'enchant_broker_request_dict' => array( - '5.2' => false, - '5.3' => true, - ), - 'enchant_broker_request_pwl_dict' => array( - '5.2' => false, - '5.3' => true, - ), - 'enchant_broker_set_ordering' => array( - '5.2' => false, - '5.3' => true, - ), - 'enchant_dict_add_to_personal' => array( - '5.2' => false, - '5.3' => true, - ), - 'enchant_dict_add_to_session' => array( - '5.2' => false, - '5.3' => true, - ), - 'enchant_dict_check' => array( - '5.2' => false, - '5.3' => true, - ), - 'enchant_dict_describe' => array( - '5.2' => false, - '5.3' => true, - ), - 'enchant_dict_get_error' => array( - '5.2' => false, - '5.3' => true, - ), - 'enchant_dict_is_in_session' => array( - '5.2' => false, - '5.3' => true, - ), - 'enchant_dict_quick_check' => array( - '5.2' => false, - '5.3' => true, - ), - 'enchant_dict_store_replacement' => array( - '5.2' => false, - '5.3' => true, - ), - 'enchant_dict_suggest' => array( - '5.2' => false, - '5.3' => true, - ), - 'finfo_buffer' => array( - '5.2' => false, - '5.3' => true, - ), - 'finfo_close' => array( - '5.2' => false, - '5.3' => true, - ), - 'finfo_file' => array( - '5.2' => false, - '5.3' => true, - ), - 'finfo_open' => array( - '5.2' => false, - '5.3' => true, - ), - 'finfo_set_flags' => array( - '5.2' => false, - '5.3' => true, - ), - 'intl_error_name' => array( - '5.2' => false, - '5.3' => true, - ), - 'intl_get_error_code' => array( - '5.2' => false, - '5.3' => true, - ), - 'intl_get_error_message' => array( - '5.2' => false, - '5.3' => true, - ), - 'intl_is_failure' => array( - '5.2' => false, - '5.3' => true, - ), - - 'hex2bin' => array( - '5.3' => false, - '5.4' => true, - ), - 'http_response_code' => array( - '5.3' => false, - '5.4' => true, - ), - 'get_declared_traits' => array( - '5.3' => false, - '5.4' => true, - ), - 'getimagesizefromstring' => array( - '5.3' => false, - '5.4' => true, - ), - 'stream_set_chunk_size' => array( - '5.3' => false, - '5.4' => true, - ), - 'socket_import_stream' => array( - '5.3' => false, - '5.4' => true, - ), - 'trait_exists' => array( - '5.3' => false, - '5.4' => true, - ), - 'header_register_callback' => array( - '5.3' => false, - '5.4' => true, - ), - 'class_uses' => array( - '5.3' => false, - '5.4' => true, - ), - 'session_status' => array( - '5.3' => false, - '5.4' => true, - ), - 'session_register_shutdown' => array( - '5.3' => false, - '5.4' => true, - ), - 'mysqli_error_list' => array( - '5.3' => false, - '5.4' => true, - ), - 'mysqli_stmt_error_list' => array( - '5.3' => false, - '5.4' => true, - ), - 'libxml_set_external_entity_loader' => array( - '5.3' => false, - '5.4' => true, - ), - 'ldap_control_paged_result' => array( - '5.3' => false, - '5.4' => true, - ), - 'ldap_control_paged_result_response' => array( - '5.3' => false, - '5.4' => true, - ), - 'transliteral_create' => array( - '5.3' => false, - '5.4' => true, - ), - 'transliteral_create_from_rules' => array( - '5.3' => false, - '5.4' => true, - ), - 'transliteral_create_inverse' => array( - '5.3' => false, - '5.4' => true, - ), - 'transliteral_get_error_code' => array( - '5.3' => false, - '5.4' => true, - ), - 'transliteral_get_error_message' => array( - '5.3' => false, - '5.4' => true, - ), - 'transliteral_list_ids' => array( - '5.3' => false, - '5.4' => true, - ), - 'transliteral_transliterate' => array( - '5.3' => false, - '5.4' => true, - ), - 'zlib_decode' => array( - '5.3' => false, - '5.4' => true, - ), - 'zlib_encode' => array( - '5.3' => false, - '5.4' => true, - ), - - 'array_column' => array( - '5.4' => false, - '5.5' => true, - ), - 'boolval' => array( - '5.4' => false, - '5.5' => true, - ), - 'json_last_error_msg' => array( - '5.4' => false, - '5.5' => true, - ), - 'password_get_info' => array( - '5.4' => false, - '5.5' => true, - ), - 'password_hash' => array( - '5.4' => false, - '5.5' => true, - ), - 'password_needs_rehash' => array( - '5.4' => false, - '5.5' => true, - ), - 'password_verify' => array( - '5.4' => false, - '5.5' => true, - ), - 'hash_pbkdf2' => array( - '5.4' => false, - '5.5' => true, - ), - 'openssl_pbkdf2' => array( - '5.4' => false, - '5.5' => true, - ), - 'curl_escape' => array( - '5.4' => false, - '5.5' => true, - ), - 'curl_file_create' => array( - '5.4' => false, - '5.5' => true, - ), - 'curl_multi_setopt' => array( - '5.4' => false, - '5.5' => true, - ), - 'curl_multi_strerror' => array( - '5.4' => false, - '5.5' => true, - ), - 'curl_pause' => array( - '5.4' => false, - '5.5' => true, - ), - 'curl_reset' => array( - '5.4' => false, - '5.5' => true, - ), - 'curl_share_close' => array( - '5.4' => false, - '5.5' => true, - ), - 'curl_share_init' => array( - '5.4' => false, - '5.5' => true, - ), - 'curl_share_setopt' => array( - '5.4' => false, - '5.5' => true, - ), - 'curl_strerror' => array( - '5.4' => false, - '5.5' => true, - ), - 'curl_unescape' => array( - '5.4' => false, - '5.5' => true, - ), - 'imageaffinematrixconcat' => array( - '5.4' => false, - '5.5' => true, - ), - 'imageaffinematrixget' => array( - '5.4' => false, - '5.5' => true, - ), - 'imagecrop' => array( - '5.4' => false, - '5.5' => true, - ), - 'imagecropauto' => array( - '5.4' => false, - '5.5' => true, - ), - 'imageflip' => array( - '5.4' => false, - '5.5' => true, - ), - 'imagepalettetotruecolor' => array( - '5.4' => false, - '5.5' => true, - ), - 'imagescale' => array( - '5.4' => false, - '5.5' => true, - ), - 'mysqli_begin_transaction' => array( - '5.4' => false, - '5.5' => true, - ), - 'mysqli_release_savepoint' => array( - '5.4' => false, - '5.5' => true, - ), - 'mysqli_savepoint' => array( - '5.4' => false, - '5.5' => true, - ), - 'pg_escape_literal' => array( - '5.4' => false, - '5.5' => true, - ), - 'pg_escape_identifier' => array( - '5.4' => false, - '5.5' => true, - ), - 'socket_sendmsg' => array( - '5.4' => false, - '5.5' => true, - ), - 'socket_recvmsg' => array( - '5.4' => false, - '5.5' => true, - ), - 'socket_cmsg_space' => array( - '5.4' => false, - '5.5' => true, - ), - 'cli_get_process_title' => array( - '5.4' => false, - '5.5' => true, - ), - 'cli_set_process_title' => array( - '5.4' => false, - '5.5' => true, - ), - 'datefmt_format_object' => array( - '5.4' => false, - '5.5' => true, - ), - 'datefmt_get_calendar_object' => array( - '5.4' => false, - '5.5' => true, - ), - 'datefmt_get_timezone' => array( - '5.4' => false, - '5.5' => true, - ), - 'datefmt_set_timezone' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_create_instance' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_get_keyword_values_for_locale' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_get_now' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_get_available_locales' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_get' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_get_time' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_set_time' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_add' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_set_time_zone' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_after' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_before' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_set' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_roll' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_clear' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_field_difference' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_get_actual_maximum' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_get_actual_minumum' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_get_day_of_week_type' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_get_first_day_of_week' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_get_greatest_minimum' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_get_least_maximum' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_get_locale' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_get_maximum' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_get_minimal_days_in_first_week' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_get_minimum' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_get_time_zone' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_get_type' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_get_weekend_transition' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_in_daylight_time' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_is_equivalent_to' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_is_lenient' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_equals' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_get_repeated_wall_time_option' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_get_skipped_wall_time_option' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_set_repeated_wall_time_option' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_set_skipped_wall_time_option' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_from_date_time' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_to_date_time' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_get_error_code' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlcal_get_error_message' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlgregcal_create_instance' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlgregcal_set_gregorian_change' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlgregcal_get_gregorian_change' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlgregcal_is_leap_year' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlz_create_time_zone' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlz_create_default' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlz_get_id' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlz_get_gmt' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlz_get_unknown' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlz_create_enumeration' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlz_count_equivalent_ids' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlz_create_time_zone_id_enumeration' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlz_get_canonical_id' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlz_get_region' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlz_get_tz_data_version' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlz_get_equivalent_id' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlz_use_daylight_time' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlz_get_offset' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlz_get_raw_offset' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlz_has_same_rules' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlz_get_display_name' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlz_get_dst_savings' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlz_from_date_time_zone' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlz_to_date_time_zone' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlz_get_error_code' => array( - '5.4' => false, - '5.5' => true, - ), - 'intlz_get_error_message' => array( - '5.4' => false, - '5.5' => true, - ), - 'opcache_compile_file' => array( - '5.4' => false, - '5.5' => true, - ), - 'opcache_get_configuration' => array( - '5.4' => false, - '5.5' => true, - ), - 'opcache_get_status' => array( - '5.4' => false, - '5.5' => true, - ), - 'opcache_invalidate' => array( - '5.4' => false, - '5.5' => true, - ), - 'opcache_reset' => array( - '5.4' => false, - '5.5' => true, - ), - - 'opcache_is_script_cached' => array( - '5.5.10' => false, - '5.5.11' => true, - ), - - 'gmp_root' => array( - '5.5' => false, - '5.6' => true, - ), - 'gmp_rootrem' => array( - '5.5' => false, - '5.6' => true, - ), - 'hash_equals' => array( - '5.5' => false, - '5.6' => true, - ), - 'ldap_escape' => array( - '5.5' => false, - '5.6' => true, - ), - 'ldap_modify_batch' => array( - '5.4.25' => false, - '5.5.9' => false, - '5.4.26' => true, - '5.5.10' => true, - '5.6.0' => true, - ), - 'mysqli_get_links_stats' => array( - '5.5' => false, - '5.6' => true, - ), - 'openssl_get_cert_locations' => array( - '5.5' => false, - '5.6' => true, - ), - 'openssl_x509_fingerprint' => array( - '5.5' => false, - '5.6' => true, - ), - 'openssl_spki_new' => array( - '5.5' => false, - '5.6' => true, - ), - 'openssl_spki_verify' => array( - '5.5' => false, - '5.6' => true, - ), - 'openssl_spki_export_challenge' => array( - '5.5' => false, - '5.6' => true, - ), - 'openssl_spki_export' => array( - '5.5' => false, - '5.6' => true, - ), - 'pg_connect_poll' => array( - '5.5' => false, - '5.6' => true, - ), - 'pg_consume_input' => array( - '5.5' => false, - '5.6' => true, - ), - 'pg_flush' => array( - '5.5' => false, - '5.6' => true, - ), - 'pg_lo_truncate' => array( - '5.5' => false, - '5.6' => true, - ), - 'pg_socket' => array( - '5.5' => false, - '5.6' => true, - ), - 'session_abort' => array( - '5.5' => false, - '5.6' => true, - ), - 'session_reset' => array( - '5.5' => false, - '5.6' => true, - ), - - 'random_bytes' => array( - '5.6' => false, - '7.0' => true, - ), - 'random_int' => array( - '5.6' => false, - '7.0' => true, - ), - 'error_clear_last' => array( - '5.6' => false, - '7.0' => true, - ), - 'gmp_random_seed' => array( - '5.6' => false, - '7.0' => true, - ), - 'intdiv' => array( - '5.6' => false, - '7.0' => true, - ), - 'preg_replace_callback_array' => array( - '5.6' => false, - '7.0' => true, - ), - 'gc_mem_caches' => array( - '5.6' => false, - '7.0' => true, - ), - 'get_resources' => array( - '5.6' => false, - '7.0' => true, - ), - 'posix_setrlimit' => array( - '5.6' => false, - '7.0' => true, - ), - 'inflate_add' => array( - '5.6' => false, - '7.0' => true, - ), - 'deflate_add' => array( - '5.6' => false, - '7.0' => true, - ), - 'inflate_init' => array( - '5.6' => false, - '7.0' => true, - ), - 'deflate_init' => array( - '5.6' => false, - '7.0' => true, - ), - - 'socket_export_stream' => array( - '7.0.6' => false, - '7.0.7' => true, - ), - - 'curl_multi_errno' => array( - '7.0' => false, - '7.1' => true, - ), - 'curl_share_errno' => array( - '7.0' => false, - '7.1' => true, - ), - 'curl_share_strerror' => array( - '7.0' => false, - '7.1' => true, - ), - 'is_iterable' => array( - '7.0' => false, - '7.1' => true, - ), - 'pcntl_async_signals' => array( - '7.0' => false, - '7.1' => true, - ), - 'pcntl_signal_get_handler' => array( - '7.0' => false, - '7.1' => true, - ), - 'session_create_id' => array( - '7.0' => false, - '7.1' => true, - ), - 'session_gc' => array( - '7.0' => false, - '7.1' => true, - ), - 'sapi_windows_cp_set' => array( - '7.0' => false, - '7.1' => true, - ), - 'sapi_windows_cp_get' => array( - '7.0' => false, - '7.1' => true, - ), - 'sapi_windows_cp_is_utf8' => array( - '7.0' => false, - '7.1' => true, - ), - 'sapi_windows_cp_conv' => array( - '7.0' => false, - '7.1' => true, - ), - - 'hash_hkdf' => array( - '7.1.1' => false, - '7.1.2' => true, - ), - 'oci_register_taf_callback' => array( - '7.1.6' => false, - '7.1.7' => true, - ), - 'oci_unregister_taf_callback' => array( - '7.1.8' => false, - '7.1.9' => true, - ), - - 'stream_isatty' => array( - '7.1' => false, - '7.2' => true, - ), - 'sapi_windows_vt100_support' => array( - '7.1' => false, - '7.2' => true, - ), - 'ftp_append' => array( - '7.1' => false, - '7.2' => true, - ), - 'hash_hmac_algos' => array( - '7.1' => false, - '7.2' => true, - ), - 'imagebmp' => array( - '7.1' => false, - '7.2' => true, - ), - 'imagecreatefrombmp' => array( - '7.1' => false, - '7.2' => true, - ), - 'imagegetclip' => array( - '7.1' => false, - '7.2' => true, - ), - 'imageopenpolygon' => array( - '7.1' => false, - '7.2' => true, - ), - 'imageresolution' => array( - '7.1' => false, - '7.2' => true, - ), - 'imagesetclip' => array( - '7.1' => false, - '7.2' => true, - ), - 'ldap_exop' => array( - '7.1' => false, - '7.2' => true, - ), - 'ldap_exop_passwd' => array( - '7.1' => false, - '7.2' => true, - ), - 'ldap_exop_whoami' => array( - '7.1' => false, - '7.2' => true, - ), - 'ldap_parse_exop' => array( - '7.1' => false, - '7.2' => true, - ), - 'mb_chr' => array( - '7.1' => false, - '7.2' => true, - ), - 'mb_ord' => array( - '7.1' => false, - '7.2' => true, - ), - 'mb_scrub' => array( - '7.1' => false, - '7.2' => true, - ), - 'socket_addrinfo_lookup' => array( - '7.1' => false, - '7.2' => true, - ), - 'socket_addrinfo_connect' => array( - '7.1' => false, - '7.2' => true, - ), - 'socket_addrinfo_bind' => array( - '7.1' => false, - '7.2' => true, - ), - 'socket_addrinfo_explain' => array( - '7.1' => false, - '7.2' => true, - ), - 'spl_object_id' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_add' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_base642bin' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_bin2base64' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_bin2hex' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_compare' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_aead_aes256gcm_decrypt' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_aead_aes256gcm_encrypt' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_aead_aes256gcm_is_available' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_aead_aes256gcm_keygen' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_aead_chacha20poly1305_decrypt' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_aead_chacha20poly1305_encrypt' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_aead_chacha20poly1305_ietf_decrypt' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_aead_chacha20poly1305_ietf_encrypt' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_aead_chacha20poly1305_ietf_keygen' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_aead_chacha20poly1305_keygen' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_aead_xchacha20poly1305_ietf_decrypt' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_aead_xchacha20poly1305_ietf_encrypt' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_aead_xchacha20poly1305_ietf_keygen' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_auth_keygen' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_auth_verify' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_auth' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_box_keypair_from_secretkey_and_publickey' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_box_keypair' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_box_open' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_box_publickey_from_secretkey' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_box_publickey' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_box_seal_open' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_box_seal' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_box_secretkey' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_box_seed_keypair' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_box' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_generichash_final' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_generichash_init' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_generichash_keygen' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_generichash_update' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_generichash' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_kdf_derive_from_key' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_kdf_keygen' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_kx_client_session_keys' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_kx_keypair' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_kx_publickey' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_kx_secretkey' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_kx_seed_keypair' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_kx_server_session_keys' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_pwhash_scryptsalsa208sha256_str_verify' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_pwhash_scryptsalsa208sha256_str' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_pwhash_scryptsalsa208sha256' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_pwhash_str_needs_rehash' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_pwhash_str_verify' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_pwhash_str' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_pwhash' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_scalarmult_base' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_scalarmult' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_secretbox_keygen' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_secretbox_open' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_secretbox' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_secretstream_xchacha20poly1305_init_pull' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_secretstream_xchacha20poly1305_init_push' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_secretstream_xchacha20poly1305_keygen' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_secretstream_xchacha20poly1305_pull' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_secretstream_xchacha20poly1305_push' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_secretstream_xchacha20poly1305_rekey' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_shorthash_keygen' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_shorthash' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_sign_detached' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_sign_ed25519_pk_to_curve25519' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_sign_ed25519_sk_to_curve25519' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_sign_keypair_from_secretkey_and_publickey' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_sign_keypair' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_sign_open' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_sign_publickey_from_secretkey' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_sign_publickey' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_sign_secretkey' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_sign_seed_keypair' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_sign_verify_detached' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_sign' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_stream_keygen' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_stream_xor' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_crypto_stream' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_hex2bin' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_increment' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_memcmp' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_memzero' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_pad' => array( - '7.1' => false, - '7.2' => true, - ), - 'sodium_unpad' => array( - '7.1' => false, - '7.2' => true, - ), - // Introduced in 7.2.14 and 7.3.1 simultanously. - 'oci_set_call_timeout' => array( - '7.2.13' => false, - '7.2.14' => true, - ), - // Introduced in 7.2.14 and 7.3.1 simultanously. - 'oci_set_db_operation' => array( - '7.2.13' => false, - '7.2.14' => true, - ), - - 'hrtime' => array( - '7.2' => false, - '7.3' => true, - ), - 'is_countable' => array( - '7.2' => false, - '7.3' => true, - ), - 'array_key_first' => array( - '7.2' => false, - '7.3' => true, - ), - 'array_key_last' => array( - '7.2' => false, - '7.3' => true, - ), - 'fpm_get_status' => array( - '7.2' => false, - '7.3' => true, - ), - 'net_get_interfaces' => array( - '7.2' => false, - '7.3' => true, - ), - 'gmp_binomial' => array( - '7.2' => false, - '7.3' => true, - ), - 'gmp_lcm' => array( - '7.2' => false, - '7.3' => true, - ), - 'gmp_perfect_power' => array( - '7.2' => false, - '7.3' => true, - ), - 'gmp_kronecker' => array( - '7.2' => false, - '7.3' => true, - ), - 'ldap_add_ext' => array( - '7.2' => false, - '7.3' => true, - ), - 'ldap_bind_ext' => array( - '7.2' => false, - '7.3' => true, - ), - 'ldap_delete_ext' => array( - '7.2' => false, - '7.3' => true, - ), - 'ldap_exop_refresh' => array( - '7.2' => false, - '7.3' => true, - ), - 'ldap_mod_add_ext' => array( - '7.2' => false, - '7.3' => true, - ), - 'ldap_mod_replace_ext' => array( - '7.2' => false, - '7.3' => true, - ), - 'ldap_mod_del_ext' => array( - '7.2' => false, - '7.3' => true, - ), - 'ldap_rename_ext' => array( - '7.2' => false, - '7.3' => true, - ), - 'normalizer_get_raw_decomposition' => array( - '7.2' => false, - '7.3' => true, - ), - 'openssl_pkey_derive' => array( - '7.2' => false, - '7.3' => true, - ), - 'socket_wsaprotocol_info_export' => array( - '7.2' => false, - '7.3' => true, - ), - 'socket_wsaprotocol_info_import' => array( - '7.2' => false, - '7.3' => true, - ), - 'socket_wsaprotocol_info_release' => array( - '7.2' => false, - '7.3' => true, - ), - - 'get_mangled_object_vars' => array( - '7.3' => false, - '7.4' => true, - ), - 'imagecreatefromtga' => array( - '7.3' => false, - '7.4' => true, - ), - 'mb_str_split' => array( - '7.3' => false, - '7.4' => true, - ), - 'openssl_x509_verify' => array( - '7.3' => false, - '7.4' => true, - ), - 'password_algos' => array( - '7.3' => false, - '7.4' => true, - ), - 'pcntl_unshare' => array( - '7.3' => false, - '7.4' => true, - ), - 'sapi_windows_set_ctrl_handler' => array( - '7.3' => false, - '7.4' => true, - ), - 'sapi_windows_generate_ctrl_event' => array( - '7.3' => false, - '7.4' => true, - ), - ); - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 5.6 - * - * @return array - */ - public function register() - { - // Handle case-insensitivity of function names. - $this->newFunctions = $this->arrayKeysToLowercase($this->newFunctions); - - return array(\T_STRING); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 5.5 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $ignore = array( - \T_DOUBLE_COLON => true, - \T_OBJECT_OPERATOR => true, - \T_FUNCTION => true, - \T_CONST => true, - ); - - $prevToken = $phpcsFile->findPrevious(\T_WHITESPACE, ($stackPtr - 1), null, true); - if (isset($ignore[$tokens[$prevToken]['code']]) === true) { - // Not a call to a PHP function. - return; - - } elseif ($tokens[$prevToken]['code'] === \T_NS_SEPARATOR && $tokens[$prevToken - 1]['code'] === \T_STRING) { - // Namespaced function. - return; - } - - $function = $tokens[$stackPtr]['content']; - $functionLc = strtolower($function); - - if (isset($this->newFunctions[$functionLc]) === false) { - return; - } - - $itemInfo = array( - 'name' => $function, - 'nameLc' => $functionLc, - ); - $this->handleFeature($phpcsFile, $stackPtr, $itemInfo); - } - - - /** - * Get the relevant sub-array for a specific item from a multi-dimensional array. - * - * @since 7.1.0 - * - * @param array $itemInfo Base information about the item. - * - * @return array Version and other information about the item. - */ - public function getItemArray(array $itemInfo) - { - return $this->newFunctions[$itemInfo['nameLc']]; - } - - - /** - * Get the error message template for this sniff. - * - * @since 7.1.0 - * - * @return string - */ - protected function getErrorMsgTemplate() - { - return 'The function %s() is not present in PHP version %s or earlier'; - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionUse/OptionalToRequiredFunctionParametersSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionUse/OptionalToRequiredFunctionParametersSniff.php deleted file mode 100644 index 301e5e0..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionUse/OptionalToRequiredFunctionParametersSniff.php +++ /dev/null @@ -1,173 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\FunctionUse; - -use PHPCompatibility\Sniffs\FunctionUse\RequiredToOptionalFunctionParametersSniff; -use PHP_CodeSniffer_File as File; - -/** - * Detect missing required function parameters in calls to native PHP functions. - * - * Specifically when those function parameters used to be optional in older PHP versions. - * - * PHP version All - * - * @link https://www.php.net/manual/en/doc.changelog.php - * - * @since 8.1.0 - * @since 9.0.0 Renamed from `OptionalRequiredFunctionParametersSniff` to `OptionalToRequiredFunctionParametersSniff`. - */ -class OptionalToRequiredFunctionParametersSniff extends RequiredToOptionalFunctionParametersSniff -{ - - /** - * A list of function parameters, which were optional in older versions and became required later on. - * - * The array lists : version number with true (required) and false (optional use deprecated). - * - * The index is the location of the parameter in the parameter list, starting at 0 ! - * If's sufficient to list the last version in which the parameter was not yet required. - * - * @since 8.1.0 - * - * @var array - */ - protected $functionParameters = array( - // Special case, the optional nature is not deprecated, but usage is recommended - // and leaving the parameter out will throw an E_NOTICE. - 'crypt' => array( - 1 => array( - 'name' => 'salt', - '5.6' => 'recommended', - ), - ), - 'parse_str' => array( - 1 => array( - 'name' => 'result', - '7.2' => false, - ), - ), - ); - - - /** - * Determine whether an error/warning should be thrown for an item based on collected information. - * - * @since 8.1.0 - * - * @param array $errorInfo Detail information about an item. - * - * @return bool - */ - protected function shouldThrowError(array $errorInfo) - { - return ($errorInfo['optionalDeprecated'] !== '' - || $errorInfo['optionalRemoved'] !== '' - || $errorInfo['optionalRecommended'] !== ''); - } - - - /** - * Retrieve the relevant detail (version) information for use in an error message. - * - * @since 8.1.0 - * - * @param array $itemArray Version and other information about the item. - * @param array $itemInfo Base information about the item. - * - * @return array - */ - public function getErrorInfo(array $itemArray, array $itemInfo) - { - $errorInfo = array( - 'paramName' => '', - 'optionalRecommended' => '', - 'optionalDeprecated' => '', - 'optionalRemoved' => '', - 'error' => false, - ); - - $versionArray = $this->getVersionArray($itemArray); - - if (empty($versionArray) === false) { - foreach ($versionArray as $version => $required) { - if ($this->supportsAbove($version) === true) { - if ($required === true && $errorInfo['optionalRemoved'] === '') { - $errorInfo['optionalRemoved'] = $version; - $errorInfo['error'] = true; - } elseif ($required === 'recommended' && $errorInfo['optionalRecommended'] === '') { - $errorInfo['optionalRecommended'] = $version; - } elseif ($errorInfo['optionalDeprecated'] === '') { - $errorInfo['optionalDeprecated'] = $version; - } - } - } - } - - $errorInfo['paramName'] = $itemArray['name']; - - return $errorInfo; - } - - - /** - * Generates the error or warning for this item. - * - * @since 8.1.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the relevant token in - * the stack. - * @param array $itemInfo Base information about the item. - * @param array $errorInfo Array with detail (version) information - * relevant to the item. - * - * @return void - */ - public function addError(File $phpcsFile, $stackPtr, array $itemInfo, array $errorInfo) - { - $error = 'The "%s" parameter for function %s() is missing. Passing this parameter is '; - if ($errorInfo['optionalRecommended'] === '') { - $error .= 'no longer optional. The optional nature of the parameter is '; - } else { - $error .= 'strongly recommended '; - } - - $errorCode = $this->stringToErrorCode($itemInfo['name'] . '_' . $errorInfo['paramName']); - $data = array( - $errorInfo['paramName'], - $itemInfo['name'], - ); - - if ($errorInfo['optionalRecommended'] !== '') { - $error .= 'since PHP %s '; - $errorCode .= 'SoftRecommended'; - $data[] = $errorInfo['optionalRecommended']; - } else { - if ($errorInfo['optionalDeprecated'] !== '') { - $error .= 'deprecated since PHP %s and '; - $errorCode .= 'SoftRequired'; - $data[] = $errorInfo['optionalDeprecated']; - } - - if ($errorInfo['optionalRemoved'] !== '') { - $error .= 'removed since PHP %s and '; - $errorCode .= 'HardRequired'; - $data[] = $errorInfo['optionalRemoved']; - } - - // Remove the last 'and' from the message. - $error = substr($error, 0, (\strlen($error) - 5)); - } - - $this->addMessage($phpcsFile, $error, $stackPtr, $errorInfo['error'], $errorCode, $data); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionUse/RemovedFunctionParametersSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionUse/RemovedFunctionParametersSniff.php deleted file mode 100644 index b4cad10..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionUse/RemovedFunctionParametersSniff.php +++ /dev/null @@ -1,292 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\FunctionUse; - -use PHPCompatibility\AbstractRemovedFeatureSniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Detect use of deprecated/removed function parameters in calls to native PHP functions. - * - * PHP version All - * - * @link https://www.php.net/manual/en/doc.changelog.php - * - * @since 7.0.0 - * @since 7.1.0 Now extends the `AbstractRemovedFeatureSniff` instead of the base `Sniff` class. - */ -class RemovedFunctionParametersSniff extends AbstractRemovedFeatureSniff -{ - /** - * A list of removed function parameters, which were present in older versions. - * - * The array lists : version number with false (deprecated) and true (removed). - * The index is the location of the parameter in the parameter list, starting at 0 ! - * If's sufficient to list the first version where the function parameter was deprecated/removed. - * - * The optional `callback` key can be used to pass a method name which should be called for an - * additional check. The method will be passed the parameter info and should return true - * if the notice should be thrown or false otherwise. - * - * @since 7.0.0 - * @since 7.0.2 Visibility changed from `public` to `protected`. - * @since 9.3.0 Optional `callback` key. - * - * @var array - */ - protected $removedFunctionParameters = array( - 'curl_version' => array( - 0 => array( - 'name' => 'age', - '7.4' => false, - 'callback' => 'curlVersionInvalidValue', - ), - ), - 'define' => array( - 2 => array( - 'name' => 'case_insensitive', - '7.3' => false, // Slated for removal in PHP 8.0.0. - ), - ), - 'gmmktime' => array( - 6 => array( - 'name' => 'is_dst', - '5.1' => false, - '7.0' => true, - ), - ), - 'ldap_first_attribute' => array( - 2 => array( - 'name' => 'ber_identifier', - '5.2.4' => true, - ), - ), - 'ldap_next_attribute' => array( - 2 => array( - 'name' => 'ber_identifier', - '5.2.4' => true, - ), - ), - 'mktime' => array( - 6 => array( - 'name' => 'is_dst', - '5.1' => false, - '7.0' => true, - ), - ), - ); - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 7.0.0 - * - * @return array - */ - public function register() - { - // Handle case-insensitivity of function names. - $this->removedFunctionParameters = $this->arrayKeysToLowercase($this->removedFunctionParameters); - - return array(\T_STRING); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 7.0.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $ignore = array( - \T_DOUBLE_COLON => true, - \T_OBJECT_OPERATOR => true, - \T_FUNCTION => true, - \T_CONST => true, - ); - - $prevToken = $phpcsFile->findPrevious(\T_WHITESPACE, ($stackPtr - 1), null, true); - if (isset($ignore[$tokens[$prevToken]['code']]) === true) { - // Not a call to a PHP function. - return; - } - - $function = $tokens[$stackPtr]['content']; - $functionLc = strtolower($function); - - if (isset($this->removedFunctionParameters[$functionLc]) === false) { - return; - } - - $parameters = $this->getFunctionCallParameters($phpcsFile, $stackPtr); - $parameterCount = \count($parameters); - if ($parameterCount === 0) { - return; - } - - // If the parameter count returned > 0, we know there will be valid open parenthesis. - $openParenthesis = $phpcsFile->findNext(Tokens::$emptyTokens, $stackPtr + 1, null, true, null, true); - $parameterOffsetFound = $parameterCount - 1; - - foreach ($this->removedFunctionParameters[$functionLc] as $offset => $parameterDetails) { - if ($offset <= $parameterOffsetFound) { - if (isset($parameterDetails['callback']) && method_exists($this, $parameterDetails['callback'])) { - if ($this->{$parameterDetails['callback']}($phpcsFile, $parameters[($offset + 1)]) === false) { - continue; - } - } - - $itemInfo = array( - 'name' => $function, - 'nameLc' => $functionLc, - 'offset' => $offset, - ); - $this->handleFeature($phpcsFile, $openParenthesis, $itemInfo); - } - } - } - - - /** - * Get the relevant sub-array for a specific item from a multi-dimensional array. - * - * @since 7.1.0 - * - * @param array $itemInfo Base information about the item. - * - * @return array Version and other information about the item. - */ - public function getItemArray(array $itemInfo) - { - return $this->removedFunctionParameters[$itemInfo['nameLc']][$itemInfo['offset']]; - } - - - /** - * Get an array of the non-PHP-version array keys used in a sub-array. - * - * @since 7.1.0 - * - * @return array - */ - protected function getNonVersionArrayKeys() - { - return array('name', 'callback'); - } - - - /** - * Retrieve the relevant detail (version) information for use in an error message. - * - * @since 7.1.0 - * - * @param array $itemArray Version and other information about the item. - * @param array $itemInfo Base information about the item. - * - * @return array - */ - public function getErrorInfo(array $itemArray, array $itemInfo) - { - $errorInfo = parent::getErrorInfo($itemArray, $itemInfo); - $errorInfo['paramName'] = $itemArray['name']; - - return $errorInfo; - } - - - /** - * Get the item name to be used for the creation of the error code. - * - * @since 7.1.0 - * - * @param array $itemInfo Base information about the item. - * @param array $errorInfo Detail information about an item. - * - * @return string - */ - protected function getItemName(array $itemInfo, array $errorInfo) - { - return $itemInfo['name'] . '_' . $errorInfo['paramName']; - } - - - /** - * Get the error message template for this sniff. - * - * @since 7.1.0 - * - * @return string - */ - protected function getErrorMsgTemplate() - { - return 'The "%s" parameter for function %s() is '; - } - - - /** - * Filter the error data before it's passed to PHPCS. - * - * @since 7.1.0 - * - * @param array $data The error data array which was created. - * @param array $itemInfo Base information about the item this error message applies to. - * @param array $errorInfo Detail information about an item this error message applies to. - * - * @return array - */ - protected function filterErrorData(array $data, array $itemInfo, array $errorInfo) - { - array_shift($data); - array_unshift($data, $errorInfo['paramName'], $itemInfo['name']); - return $data; - } - - /** - * Check whether curl_version() was passed the default CURLVERSION_NOW. - * - * @since 9.3.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param array $parameter Parameter info array. - * - * @return bool True if the value was not CURLVERSION_NOW, false otherwise. - */ - protected function curlVersionInvalidValue(File $phpcsFile, array $parameter) - { - $tokens = $phpcsFile->getTokens(); - $raw = ''; - for ($i = $parameter['start']; $i <= $parameter['end']; $i++) { - if (isset(Tokens::$emptyTokens[$tokens[$i]['code']])) { - continue; - } - - $raw .= $tokens[$i]['content']; - } - - if ($raw !== 'CURLVERSION_NOW' - && $raw !== (string) \CURLVERSION_NOW - ) { - return true; - } - - return false; - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionUse/RemovedFunctionsSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionUse/RemovedFunctionsSniff.php deleted file mode 100644 index 33f3d39..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionUse/RemovedFunctionsSniff.php +++ /dev/null @@ -1,1104 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\FunctionUse; - -use PHPCompatibility\AbstractRemovedFeatureSniff; -use PHP_CodeSniffer_File as File; - -/** - * Detect calls to deprecated/removed native PHP functions. - * - * Suggests alternative if available. - * - * PHP version All - * - * @since 5.5 - * @since 5.6 Now extends the base `Sniff` class instead of the upstream - * `Generic.PHP.ForbiddenFunctions` sniff. - * @since 7.1.0 Now extends the `AbstractRemovedFeatureSniff` instead of the base `Sniff` class. - * @since 9.0.0 Renamed from `DeprecatedFunctionsSniff` to `RemovedFunctionsSniff`. - */ -class RemovedFunctionsSniff extends AbstractRemovedFeatureSniff -{ - /** - * A list of deprecated and removed functions with their alternatives. - * - * The array lists : version number with false (deprecated) or true (removed) and an alternative function. - * If no alternative exists, it is NULL, i.e, the function should just not be used. - * - * @since 5.5 - * @since 5.6 Visibility changed from `protected` to `public`. - * @since 7.0.2 Visibility changed back from `public` to `protected`. - * The earlier change was made to be in line with the upstream sniff, - * but that sniff is no longer being extended. - * @since 7.0.8 Property renamed from `$forbiddenFunctions` to `$removedFunctions`. - * - * @var array(string => array(string => bool|string|null)) - */ - protected $removedFunctions = array( - 'php_check_syntax' => array( - '5.0.5' => true, - 'alternative' => null, - ), - - 'pfpro_cleanup' => array( - '5.1' => true, - 'alternative' => null, - ), - 'pfpro_init' => array( - '5.1' => true, - 'alternative' => null, - ), - 'pfpro_process_raw' => array( - '5.1' => true, - 'alternative' => null, - ), - 'pfpro_process' => array( - '5.1' => true, - 'alternative' => null, - ), - 'pfpro_version' => array( - '5.1' => true, - 'alternative' => null, - ), - - 'call_user_method' => array( - '5.3' => false, - '7.0' => true, - 'alternative' => 'call_user_func()', - ), - 'call_user_method_array' => array( - '5.3' => false, - '7.0' => true, - 'alternative' => 'call_user_func_array()', - ), - 'define_syslog_variables' => array( - '5.3' => false, - '5.4' => true, - 'alternative' => null, - ), - 'dl' => array( - '5.3' => false, - 'alternative' => null, - ), - 'ereg' => array( - '5.3' => false, - '7.0' => true, - 'alternative' => 'preg_match()', - ), - 'ereg_replace' => array( - '5.3' => false, - '7.0' => true, - 'alternative' => 'preg_replace()', - ), - 'eregi' => array( - '5.3' => false, - '7.0' => true, - 'alternative' => 'preg_match()', - ), - 'eregi_replace' => array( - '5.3' => false, - '7.0' => true, - 'alternative' => 'preg_replace()', - ), - 'imagepsbbox' => array( - '7.0' => true, - 'alternative' => null, - ), - 'imagepsencodefont' => array( - '7.0' => true, - 'alternative' => null, - ), - 'imagepsextendfont' => array( - '7.0' => true, - 'alternative' => null, - ), - 'imagepsfreefont' => array( - '7.0' => true, - 'alternative' => null, - ), - 'imagepsloadfont' => array( - '7.0' => true, - 'alternative' => null, - ), - 'imagepsslantfont' => array( - '7.0' => true, - 'alternative' => null, - ), - 'imagepstext' => array( - '7.0' => true, - 'alternative' => null, - ), - 'import_request_variables' => array( - '5.3' => false, - '5.4' => true, - 'alternative' => null, - ), - 'ldap_sort' => array( - '7.0' => false, - 'alternative' => null, - ), - 'mcrypt_generic_end' => array( - '5.3' => false, - '7.0' => true, - 'alternative' => 'mcrypt_generic_deinit()', - ), - 'mysql_db_query' => array( - '5.3' => false, - '7.0' => true, - 'alternative' => 'mysqli::select_db() and mysqli::query()', - ), - 'mysql_escape_string' => array( - '5.3' => false, - '7.0' => true, - 'alternative' => 'mysqli::real_escape_string()', - ), - 'mysql_list_dbs' => array( - '5.4' => false, - '7.0' => true, - 'alternative' => null, - ), - 'mysqli_bind_param' => array( - '5.3' => false, - '5.4' => true, - 'alternative' => 'mysqli_stmt::bind_param()', - ), - 'mysqli_bind_result' => array( - '5.3' => false, - '5.4' => true, - 'alternative' => 'mysqli_stmt::bind_result()', - ), - 'mysqli_client_encoding' => array( - '5.3' => false, - '5.4' => true, - 'alternative' => 'mysqli::character_set_name()', - ), - 'mysqli_fetch' => array( - '5.3' => false, - '5.4' => true, - 'alternative' => 'mysqli_stmt::fetch()', - ), - 'mysqli_param_count' => array( - '5.3' => false, - '5.4' => true, - 'alternative' => 'mysqli_stmt_param_count()', - ), - 'mysqli_get_metadata' => array( - '5.3' => false, - '5.4' => true, - 'alternative' => 'mysqli_stmt::result_metadata()', - ), - 'mysqli_send_long_data' => array( - '5.3' => false, - '5.4' => true, - 'alternative' => 'mysqli_stmt::send_long_data()', - ), - 'magic_quotes_runtime' => array( - '5.3' => false, - '7.0' => true, - 'alternative' => null, - ), - 'session_register' => array( - '5.3' => false, - '5.4' => true, - 'alternative' => '$_SESSION', - ), - 'session_unregister' => array( - '5.3' => false, - '5.4' => true, - 'alternative' => '$_SESSION', - ), - 'session_is_registered' => array( - '5.3' => false, - '5.4' => true, - 'alternative' => '$_SESSION', - ), - 'set_magic_quotes_runtime' => array( - '5.3' => false, - '7.0' => true, - 'alternative' => null, - ), - 'set_socket_blocking' => array( - '5.3' => false, - '7.0' => true, - 'alternative' => 'stream_set_blocking()', - ), - 'split' => array( - '5.3' => false, - '7.0' => true, - 'alternative' => 'preg_split()', - ), - 'spliti' => array( - '5.3' => false, - '7.0' => true, - 'alternative' => 'preg_split()', - ), - 'sql_regcase' => array( - '5.3' => false, - '7.0' => true, - 'alternative' => null, - ), - 'php_logo_guid' => array( - '5.5' => true, - 'alternative' => null, - ), - 'php_egg_logo_guid' => array( - '5.5' => true, - 'alternative' => null, - ), - 'php_real_logo_guid' => array( - '5.5' => true, - 'alternative' => null, - ), - 'zend_logo_guid' => array( - '5.5' => true, - 'alternative' => null, - ), - 'datefmt_set_timezone_id' => array( - '5.5' => false, - '7.0' => true, - 'alternative' => 'IntlDateFormatter::setTimeZone()', - ), - 'mcrypt_ecb' => array( - '5.5' => false, - '7.0' => true, - 'alternative' => null, - ), - 'mcrypt_cbc' => array( - '5.5' => false, - '7.0' => true, - 'alternative' => null, - ), - 'mcrypt_cfb' => array( - '5.5' => false, - '7.0' => true, - 'alternative' => null, - ), - 'mcrypt_ofb' => array( - '5.5' => false, - '7.0' => true, - 'alternative' => null, - ), - 'ocibindbyname' => array( - '5.4' => false, - 'alternative' => 'oci_bind_by_name()', - ), - 'ocicancel' => array( - '5.4' => false, - 'alternative' => 'oci_cancel()', - ), - 'ocicloselob' => array( - '5.4' => false, - 'alternative' => 'OCI-Lob::close()', - ), - 'ocicollappend' => array( - '5.4' => false, - 'alternative' => 'OCI-Collection::append()', - ), - 'ocicollassign' => array( - '5.4' => false, - 'alternative' => 'OCI-Collection::assign()', - ), - 'ocicollassignelem' => array( - '5.4' => false, - 'alternative' => 'OCI-Collection::assignElem()', - ), - 'ocicollgetelem' => array( - '5.4' => false, - 'alternative' => 'OCI-Collection::getElem()', - ), - 'ocicollmax' => array( - '5.4' => false, - 'alternative' => 'OCI-Collection::max()', - ), - 'ocicollsize' => array( - '5.4' => false, - 'alternative' => 'OCI-Collection::size()', - ), - 'ocicolltrim' => array( - '5.4' => false, - 'alternative' => 'OCI-Collection::trim()', - ), - 'ocicolumnisnull' => array( - '5.4' => false, - 'alternative' => 'oci_field_is_null()', - ), - 'ocicolumnname' => array( - '5.4' => false, - 'alternative' => 'oci_field_name()', - ), - 'ocicolumnprecision' => array( - '5.4' => false, - 'alternative' => 'oci_field_precision()', - ), - 'ocicolumnscale' => array( - '5.4' => false, - 'alternative' => 'oci_field_scale()', - ), - 'ocicolumnsize' => array( - '5.4' => false, - 'alternative' => 'oci_field_size()', - ), - 'ocicolumntype' => array( - '5.4' => false, - 'alternative' => 'oci_field_type()', - ), - 'ocicolumntyperaw' => array( - '5.4' => false, - 'alternative' => 'oci_field_type_raw()', - ), - 'ocicommit' => array( - '5.4' => false, - 'alternative' => 'oci_commit()', - ), - 'ocidefinebyname' => array( - '5.4' => false, - 'alternative' => 'oci_define_by_name()', - ), - 'ocierror' => array( - '5.4' => false, - 'alternative' => 'oci_error()', - ), - 'ociexecute' => array( - '5.4' => false, - 'alternative' => 'oci_execute()', - ), - 'ocifetch' => array( - '5.4' => false, - 'alternative' => 'oci_fetch()', - ), - 'ocifetchinto' => array( - '5.4' => false, - 'alternative' => null, - ), - 'ocifetchstatement' => array( - '5.4' => false, - 'alternative' => 'oci_fetch_all()', - ), - 'ocifreecollection' => array( - '5.4' => false, - 'alternative' => 'OCI-Collection::free()', - ), - 'ocifreecursor' => array( - '5.4' => false, - 'alternative' => 'oci_free_statement()', - ), - 'ocifreedesc' => array( - '5.4' => false, - 'alternative' => 'OCI-Lob::free()', - ), - 'ocifreestatement' => array( - '5.4' => false, - 'alternative' => 'oci_free_statement()', - ), - 'ociinternaldebug' => array( - '5.4' => false, - 'alternative' => 'oci_internal_debug()', - ), - 'ociloadlob' => array( - '5.4' => false, - 'alternative' => 'OCI-Lob::load()', - ), - 'ocilogoff' => array( - '5.4' => false, - 'alternative' => 'oci_close()', - ), - 'ocilogon' => array( - '5.4' => false, - 'alternative' => 'oci_connect()', - ), - 'ocinewcollection' => array( - '5.4' => false, - 'alternative' => 'oci_new_collection()', - ), - 'ocinewcursor' => array( - '5.4' => false, - 'alternative' => 'oci_new_cursor()', - ), - 'ocinewdescriptor' => array( - '5.4' => false, - 'alternative' => 'oci_new_descriptor()', - ), - 'ocinlogon' => array( - '5.4' => false, - 'alternative' => 'oci_new_connect()', - ), - 'ocinumcols' => array( - '5.4' => false, - 'alternative' => 'oci_num_fields()', - ), - 'ociparse' => array( - '5.4' => false, - 'alternative' => 'oci_parse()', - ), - 'ociplogon' => array( - '5.4' => false, - 'alternative' => 'oci_pconnect()', - ), - 'ociresult' => array( - '5.4' => false, - 'alternative' => 'oci_result()', - ), - 'ocirollback' => array( - '5.4' => false, - 'alternative' => 'oci_rollback()', - ), - 'ocirowcount' => array( - '5.4' => false, - 'alternative' => 'oci_num_rows()', - ), - 'ocisavelob' => array( - '5.4' => false, - 'alternative' => 'OCI-Lob::save()', - ), - 'ocisavelobfile' => array( - '5.4' => false, - 'alternative' => 'OCI-Lob::import()', - ), - 'ociserverversion' => array( - '5.4' => false, - 'alternative' => 'oci_server_version()', - ), - 'ocisetprefetch' => array( - '5.4' => false, - 'alternative' => 'oci_set_prefetch()', - ), - 'ocistatementtype' => array( - '5.4' => false, - 'alternative' => 'oci_statement_type()', - ), - 'ociwritelobtofile' => array( - '5.4' => false, - 'alternative' => 'OCI-Lob::export()', - ), - 'ociwritetemporarylob' => array( - '5.4' => false, - 'alternative' => 'OCI-Lob::writeTemporary()', - ), - 'mysqli_get_cache_stats' => array( - '5.4' => true, - 'alternative' => null, - ), - - 'mcrypt_create_iv' => array( - '7.1' => false, - '7.2' => true, - 'alternative' => 'random_bytes() or OpenSSL', - ), - 'mcrypt_decrypt' => array( - '7.1' => false, - '7.2' => true, - 'alternative' => 'OpenSSL', - ), - 'mcrypt_enc_get_algorithms_name' => array( - '7.1' => false, - '7.2' => true, - 'alternative' => 'OpenSSL', - ), - 'mcrypt_enc_get_block_size' => array( - '7.1' => false, - '7.2' => true, - 'alternative' => 'OpenSSL', - ), - 'mcrypt_enc_get_iv_size' => array( - '7.1' => false, - '7.2' => true, - 'alternative' => 'OpenSSL', - ), - 'mcrypt_enc_get_key_size' => array( - '7.1' => false, - '7.2' => true, - 'alternative' => 'OpenSSL', - ), - 'mcrypt_enc_get_modes_name' => array( - '7.1' => false, - '7.2' => true, - 'alternative' => 'OpenSSL', - ), - 'mcrypt_enc_get_supported_key_sizes' => array( - '7.1' => false, - '7.2' => true, - 'alternative' => 'OpenSSL', - ), - 'mcrypt_enc_is_block_algorithm_mode' => array( - '7.1' => false, - '7.2' => true, - 'alternative' => 'OpenSSL', - ), - 'mcrypt_enc_is_block_algorithm' => array( - '7.1' => false, - '7.2' => true, - 'alternative' => 'OpenSSL', - ), - 'mcrypt_enc_is_block_mode' => array( - '7.1' => false, - '7.2' => true, - 'alternative' => 'OpenSSL', - ), - 'mcrypt_enc_self_test' => array( - '7.1' => false, - '7.2' => true, - 'alternative' => 'OpenSSL', - ), - 'mcrypt_encrypt' => array( - '7.1' => false, - '7.2' => true, - 'alternative' => 'OpenSSL', - ), - 'mcrypt_generic_deinit' => array( - '7.1' => false, - '7.2' => true, - 'alternative' => 'OpenSSL', - ), - 'mcrypt_generic_init' => array( - '7.1' => false, - '7.2' => true, - 'alternative' => 'OpenSSL', - ), - 'mcrypt_generic' => array( - '7.1' => false, - '7.2' => true, - 'alternative' => 'OpenSSL', - ), - 'mcrypt_get_block_size' => array( - '7.1' => false, - '7.2' => true, - 'alternative' => 'OpenSSL', - ), - 'mcrypt_get_cipher_name' => array( - '7.1' => false, - '7.2' => true, - 'alternative' => 'OpenSSL', - ), - 'mcrypt_get_iv_size' => array( - '7.1' => false, - '7.2' => true, - 'alternative' => 'OpenSSL', - ), - 'mcrypt_get_key_size' => array( - '7.1' => false, - '7.2' => true, - 'alternative' => 'OpenSSL', - ), - 'mcrypt_list_algorithms' => array( - '7.1' => false, - '7.2' => true, - 'alternative' => 'OpenSSL', - ), - 'mcrypt_list_modes' => array( - '7.1' => false, - '7.2' => true, - 'alternative' => 'OpenSSL', - ), - 'mcrypt_module_close' => array( - '7.1' => false, - '7.2' => true, - 'alternative' => 'OpenSSL', - ), - 'mcrypt_module_get_algo_block_size' => array( - '7.1' => false, - '7.2' => true, - 'alternative' => 'OpenSSL', - ), - 'mcrypt_module_get_algo_key_size' => array( - '7.1' => false, - '7.2' => true, - 'alternative' => 'OpenSSL', - ), - 'mcrypt_module_get_supported_key_sizes' => array( - '7.1' => false, - '7.2' => true, - 'alternative' => 'OpenSSL', - ), - 'mcrypt_module_is_block_algorithm_mode' => array( - '7.1' => false, - '7.2' => true, - 'alternative' => 'OpenSSL', - ), - 'mcrypt_module_is_block_algorithm' => array( - '7.1' => false, - '7.2' => true, - 'alternative' => 'OpenSSL', - ), - 'mcrypt_module_is_block_mode' => array( - '7.1' => false, - '7.2' => true, - 'alternative' => 'OpenSSL', - ), - 'mcrypt_module_open' => array( - '7.1' => false, - '7.2' => true, - 'alternative' => 'OpenSSL', - ), - 'mcrypt_module_self_test' => array( - '7.1' => false, - '7.2' => true, - 'alternative' => 'OpenSSL', - ), - 'mdecrypt_generic' => array( - '7.1' => false, - '7.2' => true, - 'alternative' => 'OpenSSL', - ), - 'jpeg2wbmp' => array( - '7.2' => false, - 'alternative' => 'imagecreatefromjpeg() and imagewbmp()', - ), - 'png2wbmp' => array( - '7.2' => false, - 'alternative' => 'imagecreatefrompng() or imagewbmp()', - ), - 'create_function' => array( - '7.2' => false, - 'alternative' => 'an anonymous function', - ), - 'each' => array( - '7.2' => false, - 'alternative' => 'a foreach loop', - ), - 'gmp_random' => array( - '7.2' => false, - 'alternative' => 'gmp_random_bits() or gmp_random_range()', - ), - 'read_exif_data' => array( - '7.2' => false, - 'alternative' => 'exif_read_data()', - ), - - 'image2wbmp' => array( - '7.3' => false, - 'alternative' => 'imagewbmp()', - ), - 'mbregex_encoding' => array( - '7.3' => false, - 'alternative' => 'mb_regex_encoding()', - ), - 'mbereg' => array( - '7.3' => false, - 'alternative' => 'mb_ereg()', - ), - 'mberegi' => array( - '7.3' => false, - 'alternative' => 'mb_eregi()', - ), - 'mbereg_replace' => array( - '7.3' => false, - 'alternative' => 'mb_ereg_replace()', - ), - 'mberegi_replace' => array( - '7.3' => false, - 'alternative' => 'mb_eregi_replace()', - ), - 'mbsplit' => array( - '7.3' => false, - 'alternative' => 'mb_split()', - ), - 'mbereg_match' => array( - '7.3' => false, - 'alternative' => 'mb_ereg_match()', - ), - 'mbereg_search' => array( - '7.3' => false, - 'alternative' => 'mb_ereg_search()', - ), - 'mbereg_search_pos' => array( - '7.3' => false, - 'alternative' => 'mb_ereg_search_pos()', - ), - 'mbereg_search_regs' => array( - '7.3' => false, - 'alternative' => 'mb_ereg_search_regs()', - ), - 'mbereg_search_init' => array( - '7.3' => false, - 'alternative' => 'mb_ereg_search_init()', - ), - 'mbereg_search_getregs' => array( - '7.3' => false, - 'alternative' => 'mb_ereg_search_getregs()', - ), - 'mbereg_search_getpos' => array( - '7.3' => false, - 'alternative' => 'mb_ereg_search_getpos()', - ), - 'mbereg_search_setpos' => array( - '7.3' => false, - 'alternative' => 'mb_ereg_search_setpos()', - ), - 'fgetss' => array( - '7.3' => false, - 'alternative' => null, - ), - 'gzgetss' => array( - '7.3' => false, - 'alternative' => null, - ), - - 'convert_cyr_string' => array( - '7.4' => false, - 'alternative' => 'mb_convert_encoding(), iconv() or UConverter', - ), - 'ezmlm_hash' => array( - '7.4' => false, - 'alternative' => null, - ), - 'get_magic_quotes_gpc' => array( - '7.4' => false, - 'alternative' => null, - ), - 'get_magic_quotes_runtime' => array( - '7.4' => false, - 'alternative' => null, - ), - 'hebrevc' => array( - '7.4' => false, - 'alternative' => null, - ), - 'is_real' => array( - '7.4' => false, - 'alternative' => 'is_float()', - ), - 'money_format' => array( - '7.4' => false, - 'alternative' => 'NumberFormatter::formatCurrency()', - ), - 'restore_include_path' => array( - '7.4' => false, - 'alternative' => "ini_restore('include_path')", - ), - 'ibase_add_user' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_affected_rows' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_backup' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_blob_add' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_blob_cancel' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_blob_close' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_blob_create' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_blob_echo' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_blob_get' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_blob_import' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_blob_info' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_blob_open' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_close' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_commit_ret' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_commit' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_connect' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_db_info' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_delete_user' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_drop_db' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_errcode' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_errmsg' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_execute' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_fetch_assoc' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_fetch_object' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_fetch_row' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_field_info' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_free_event_handler' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_free_query' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_free_result' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_gen_id' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_maintain_db' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_modify_user' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_name_result' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_num_fields' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_num_params' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_param_info' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_pconnect' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_prepare' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_query' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_restore' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_rollback_ret' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_rollback' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_server_info' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_service_attach' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_service_detach' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_set_event_handler' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_trans' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ibase_wait_event' => array( - '7.4' => true, - 'alternative' => null, - ), - 'ldap_control_paged_result_response' => array( - '7.4' => false, - 'alternative' => 'ldap_search()', - ), - 'ldap_control_paged_result' => array( - '7.4' => false, - 'alternative' => 'ldap_search()', - ), - 'recode_file' => array( - '7.4' => true, - 'alternative' => 'the iconv or mbstring extension', - ), - 'recode_string' => array( - '7.4' => true, - 'alternative' => 'the iconv or mbstring extension', - ), - 'recode' => array( - '7.4' => true, - 'alternative' => 'the iconv or mbstring extension', - ), - 'wddx_add_vars' => array( - '7.4' => true, - 'alternative' => null, - ), - 'wddx_deserialize' => array( - '7.4' => true, - 'alternative' => null, - ), - 'wddx_packet_end' => array( - '7.4' => true, - 'alternative' => null, - ), - 'wddx_packet_start' => array( - '7.4' => true, - 'alternative' => null, - ), - 'wddx_serialize_value' => array( - '7.4' => true, - 'alternative' => null, - ), - 'wddx_serialize_vars' => array( - '7.4' => true, - 'alternative' => null, - ), - ); - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 5.6 - * - * @return array - */ - public function register() - { - // Handle case-insensitivity of function names. - $this->removedFunctions = $this->arrayKeysToLowercase($this->removedFunctions); - - return array(\T_STRING); - } - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 5.5 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $ignore = array( - \T_DOUBLE_COLON => true, - \T_OBJECT_OPERATOR => true, - \T_FUNCTION => true, - \T_CLASS => true, - \T_CONST => true, - \T_USE => true, - \T_NS_SEPARATOR => true, - ); - - $prevToken = $phpcsFile->findPrevious(\T_WHITESPACE, ($stackPtr - 1), null, true); - if (isset($ignore[$tokens[$prevToken]['code']]) === true) { - // Not a call to a PHP function. - return; - } - - $function = $tokens[$stackPtr]['content']; - $functionLc = strtolower($function); - - if (isset($this->removedFunctions[$functionLc]) === false) { - return; - } - - $itemInfo = array( - 'name' => $function, - 'nameLc' => $functionLc, - ); - $this->handleFeature($phpcsFile, $stackPtr, $itemInfo); - } - - - /** - * Get the relevant sub-array for a specific item from a multi-dimensional array. - * - * @since 7.1.0 - * - * @param array $itemInfo Base information about the item. - * - * @return array Version and other information about the item. - */ - public function getItemArray(array $itemInfo) - { - return $this->removedFunctions[$itemInfo['nameLc']]; - } - - - /** - * Get the error message template for this sniff. - * - * @since 7.1.0 - * - * @return string - */ - protected function getErrorMsgTemplate() - { - return 'Function %s() is '; - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionUse/RequiredToOptionalFunctionParametersSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionUse/RequiredToOptionalFunctionParametersSniff.php deleted file mode 100644 index 9c32ccc..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/FunctionUse/RequiredToOptionalFunctionParametersSniff.php +++ /dev/null @@ -1,350 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\FunctionUse; - -use PHPCompatibility\AbstractComplexVersionSniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Detect missing required function parameters in calls to native PHP functions. - * - * Specifically when those function parameters are no longer required in more recent PHP versions. - * - * PHP version All - * - * @link https://www.php.net/manual/en/doc.changelog.php - * - * @since 7.0.3 - * @since 7.1.0 Now extends the `AbstractComplexVersionSniff` instead of the base `Sniff` class. - * @since 9.0.0 Renamed from `RequiredOptionalFunctionParametersSniff` to `RequiredToOptionalFunctionParametersSniff`. - */ -class RequiredToOptionalFunctionParametersSniff extends AbstractComplexVersionSniff -{ - - /** - * A list of function parameters, which were required in older versions and became optional later on. - * - * The array lists : version number with true (required) and false (optional). - * - * The index is the location of the parameter in the parameter list, starting at 0 ! - * If's sufficient to list the last version in which the parameter was still required. - * - * @since 7.0.3 - * - * @var array - */ - protected $functionParameters = array( - 'array_merge' => array( - 0 => array( - 'name' => 'array(s) to merge', - '7.3' => true, - '7.4' => false, - ), - ), - 'array_merge_recursive' => array( - 0 => array( - 'name' => 'array(s) to merge', - '7.3' => true, - '7.4' => false, - ), - ), - 'array_push' => array( - 1 => array( - 'name' => 'element to push', - '7.2' => true, - '7.3' => false, - ), - ), - 'array_unshift' => array( - 1 => array( - 'name' => 'element to prepend', - '7.2' => true, - '7.3' => false, - ), - ), - 'bcscale' => array( - 0 => array( - 'name' => 'scale', - '7.2' => true, - '7.3' => false, - ), - ), - 'ftp_fget' => array( - 3 => array( - 'name' => 'mode', - '7.2' => true, - '7.3' => false, - ), - ), - 'ftp_fput' => array( - 3 => array( - 'name' => 'mode', - '7.2' => true, - '7.3' => false, - ), - ), - 'ftp_get' => array( - 3 => array( - 'name' => 'mode', - '7.2' => true, - '7.3' => false, - ), - ), - 'ftp_nb_fget' => array( - 3 => array( - 'name' => 'mode', - '7.2' => true, - '7.3' => false, - ), - ), - 'ftp_nb_fput' => array( - 3 => array( - 'name' => 'mode', - '7.2' => true, - '7.3' => false, - ), - ), - 'ftp_nb_get' => array( - 3 => array( - 'name' => 'mode', - '7.2' => true, - '7.3' => false, - ), - ), - 'ftp_nb_put' => array( - 3 => array( - 'name' => 'mode', - '7.2' => true, - '7.3' => false, - ), - ), - 'ftp_put' => array( - 3 => array( - 'name' => 'mode', - '7.2' => true, - '7.3' => false, - ), - ), - 'getenv' => array( - 0 => array( - 'name' => 'varname', - '7.0' => true, - '7.1' => false, - ), - ), - 'preg_match_all' => array( - 2 => array( - 'name' => 'matches', - '5.3' => true, - '5.4' => false, - ), - ), - 'stream_socket_enable_crypto' => array( - 2 => array( - 'name' => 'crypto_type', - '5.5' => true, - '5.6' => false, - ), - ), - ); - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 7.0.3 - * - * @return array - */ - public function register() - { - // Handle case-insensitivity of function names. - $this->functionParameters = $this->arrayKeysToLowercase($this->functionParameters); - - return array(\T_STRING); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 7.0.3 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $ignore = array( - \T_DOUBLE_COLON => true, - \T_OBJECT_OPERATOR => true, - \T_FUNCTION => true, - \T_CONST => true, - \T_NEW => true, - ); - - $prevToken = $phpcsFile->findPrevious(\T_WHITESPACE, ($stackPtr - 1), null, true); - if (isset($ignore[$tokens[$prevToken]['code']]) === true) { - // Not a call to a PHP function. - return; - } - - $function = $tokens[$stackPtr]['content']; - $functionLc = strtolower($function); - - if (isset($this->functionParameters[$functionLc]) === false) { - return; - } - - $parameterCount = $this->getFunctionCallParameterCount($phpcsFile, $stackPtr); - $openParenthesis = $phpcsFile->findNext(Tokens::$emptyTokens, $stackPtr + 1, null, true, null, true); - - // If the parameter count returned > 0, we know there will be valid open parenthesis. - if ($parameterCount === 0 && $tokens[$openParenthesis]['code'] !== \T_OPEN_PARENTHESIS) { - return; - } - - $parameterOffsetFound = $parameterCount - 1; - - foreach ($this->functionParameters[$functionLc] as $offset => $parameterDetails) { - if ($offset > $parameterOffsetFound) { - $itemInfo = array( - 'name' => $function, - 'nameLc' => $functionLc, - 'offset' => $offset, - ); - $this->handleFeature($phpcsFile, $openParenthesis, $itemInfo); - } - } - } - - - /** - * Determine whether an error/warning should be thrown for an item based on collected information. - * - * @since 7.1.0 - * - * @param array $errorInfo Detail information about an item. - * - * @return bool - */ - protected function shouldThrowError(array $errorInfo) - { - return ($errorInfo['requiredVersion'] !== ''); - } - - - /** - * Get the relevant sub-array for a specific item from a multi-dimensional array. - * - * @since 7.1.0 - * - * @param array $itemInfo Base information about the item. - * - * @return array Version and other information about the item. - */ - public function getItemArray(array $itemInfo) - { - return $this->functionParameters[$itemInfo['nameLc']][$itemInfo['offset']]; - } - - - /** - * Get an array of the non-PHP-version array keys used in a sub-array. - * - * @since 7.1.0 - * - * @return array - */ - protected function getNonVersionArrayKeys() - { - return array('name'); - } - - - /** - * Retrieve the relevant detail (version) information for use in an error message. - * - * @since 7.1.0 - * - * @param array $itemArray Version and other information about the item. - * @param array $itemInfo Base information about the item. - * - * @return array - */ - public function getErrorInfo(array $itemArray, array $itemInfo) - { - $errorInfo = array( - 'paramName' => '', - 'requiredVersion' => '', - ); - - $versionArray = $this->getVersionArray($itemArray); - - if (empty($versionArray) === false) { - foreach ($versionArray as $version => $required) { - if ($required === true && $this->supportsBelow($version) === true) { - $errorInfo['requiredVersion'] = $version; - } - } - } - - $errorInfo['paramName'] = $itemArray['name']; - - return $errorInfo; - } - - - /** - * Get the error message template for this sniff. - * - * @since 7.1.0 - * - * @return string - */ - protected function getErrorMsgTemplate() - { - return 'The "%s" parameter for function %s() is missing, but was required for PHP version %s and lower'; - } - - - /** - * Generates the error or warning for this item. - * - * @since 7.1.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the relevant token in - * the stack. - * @param array $itemInfo Base information about the item. - * @param array $errorInfo Array with detail (version) information - * relevant to the item. - * - * @return void - */ - public function addError(File $phpcsFile, $stackPtr, array $itemInfo, array $errorInfo) - { - $error = $this->getErrorMsgTemplate(); - $errorCode = $this->stringToErrorCode($itemInfo['name'] . '_' . $errorInfo['paramName']) . 'Missing'; - $data = array( - $errorInfo['paramName'], - $itemInfo['name'], - $errorInfo['requiredVersion'], - ); - - $phpcsFile->addError($error, $stackPtr, $errorCode, $data); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Generators/NewGeneratorReturnSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Generators/NewGeneratorReturnSniff.php deleted file mode 100644 index 98ca246..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Generators/NewGeneratorReturnSniff.php +++ /dev/null @@ -1,158 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Generators; - -use PHPCompatibility\Sniff; -use PHPCompatibility\PHPCSHelper; -use PHP_CodeSniffer_File as File; - -/** - * As of PHP 7.0, a `return` statement can be used within a generator for a final expression to be returned. - * - * PHP version 7.0 - * - * @link https://www.php.net/manual/en/migration70.new-features.php#migration70.new-features.generator-return-expressions - * @link https://wiki.php.net/rfc/generator-return-expressions - * @link https://www.php.net/manual/en/language.generators.syntax.php - * - * @since 8.2.0 - */ -class NewGeneratorReturnSniff extends Sniff -{ - /** - * Scope conditions within which a yield can exist. - * - * @since 9.0.0 - * - * @var array - */ - private $validConditions = array( - \T_FUNCTION => \T_FUNCTION, - \T_CLOSURE => \T_CLOSURE, - ); - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 8.2.0 - * - * @return array - */ - public function register() - { - $targets = array( - \T_YIELD, - ); - - /* - * The `yield` keyword was introduced in PHP 5.5 with the token T_YIELD. - * The `yield from` keyword was introduced in PHP 7.0 and tokenizes as - * "T_YIELD T_WHITESPACE T_STRING". - * - * Pre-PHPCS 3.1.0, the T_YIELD token was not correctly back-filled for PHP < 5.5. - * Also, as of PHPCS 3.1.0, the PHPCS tokenizer adds a new T_YIELD_FROM - * token. - * - * So for PHP 5.3-5.4 icw PHPCS < 3.1.0, we need to look for T_STRING with content "yield". - * For PHP 5.5+ we need to look for T_YIELD. - * For PHPCS 3.1.0+, we also need to look for T_YIELD_FROM. - */ - if (version_compare(\PHP_VERSION_ID, '50500', '<') === true - && version_compare(PHPCSHelper::getVersion(), '3.1.0', '<') === true - ) { - $targets[] = \T_STRING; - } - - if (\defined('T_YIELD_FROM')) { - $targets[] = \T_YIELD_FROM; - } - - return $targets; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 8.2.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void|int Void or a stack pointer to skip forward. - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsBelow('5.6') !== true) { - return; - } - - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['code'] === \T_STRING - && $tokens[$stackPtr]['content'] !== 'yield' - ) { - return; - } - - if (empty($tokens[$stackPtr]['conditions']) === true) { - return; - } - - // Walk the condition from inner to outer to see if we can find a valid function/closure scope. - $conditions = array_reverse($tokens[$stackPtr]['conditions'], true); - foreach ($conditions as $ptr => $type) { - if (isset($this->validConditions[$type]) === true) { - $function = $ptr; - break; - } - } - - if (isset($function) === false) { - // Yield outside function scope, fatal error, but not our concern. - return; - } - - if (isset($tokens[$function]['scope_opener'], $tokens[$function]['scope_closer']) === false) { - // Can't reliably determine start/end of function scope. - return; - } - - $targets = array(\T_RETURN, \T_CLOSURE, \T_FUNCTION, \T_CLASS); - if (\defined('T_ANON_CLASS')) { - $targets[] = \T_ANON_CLASS; - } - - $current = $tokens[$function]['scope_opener']; - - while (($current = $phpcsFile->findNext($targets, ($current + 1), $tokens[$function]['scope_closer'])) !== false) { - if ($tokens[$current]['code'] === \T_RETURN) { - $phpcsFile->addError( - 'Returning a final expression from a generator was not supported in PHP 5.6 or earlier', - $current, - 'ReturnFound' - ); - - return $tokens[$function]['scope_closer']; - } - - // Found a nested scope in which return can exist without problems. - if (isset($tokens[$current]['scope_closer'])) { - // Skip past the nested scope. - $current = $tokens[$current]['scope_closer']; - } - } - - // Don't examine this function again. - return $tokens[$function]['scope_closer']; - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/IniDirectives/NewIniDirectivesSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/IniDirectives/NewIniDirectivesSniff.php deleted file mode 100644 index cd40fa6..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/IniDirectives/NewIniDirectivesSniff.php +++ /dev/null @@ -1,855 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\IniDirectives; - -use PHPCompatibility\AbstractNewFeatureSniff; -use PHP_CodeSniffer_File as File; - -/** - * Detect the use of new INI directives through `ini_set()` or `ini_get()`. - * - * PHP version All - * - * @link https://www.php.net/manual/en/ini.list.php - * @link https://www.php.net/manual/en/ini.core.php - * - * @since 5.5 - * @since 7.0.7 When a new directive is used with `ini_set()`, the sniff will now throw an error - * instead of a warning. - * @since 7.1.0 Now extends the `AbstractNewFeatureSniff` instead of the base `Sniff` class.. - */ -class NewIniDirectivesSniff extends AbstractNewFeatureSniff -{ - /** - * A list of new INI directives - * - * The array lists : version number with false (not present) or true (present). - * If's sufficient to list the first version where the ini directive appears. - * - * @since 5.5 - * @since 7.0.3 Support for 'alternative' has been added. - * - * @var array(string) - */ - protected $newIniDirectives = array( - 'auto_globals_jit' => array( - '4.4' => false, - '5.0' => true, - ), - 'com.code_page' => array( - '4.4' => false, - '5.0' => true, - ), - 'date.default_latitude' => array( - '4.4' => false, - '5.0' => true, - ), - 'date.default_longitude' => array( - '4.4' => false, - '5.0' => true, - ), - 'date.sunrise_zenith' => array( - '4.4' => false, - '5.0' => true, - ), - 'date.sunset_zenith' => array( - '4.4' => false, - '5.0' => true, - ), - 'ibase.default_charset' => array( - '4.4' => false, - '5.0' => true, - ), - 'ibase.default_db' => array( - '4.4' => false, - '5.0' => true, - ), - 'mail.force_extra_parameters' => array( - '4.4' => false, - '5.0' => true, - ), - 'mime_magic.debug' => array( - '4.4' => false, - '5.0' => true, - ), - 'mysqli.max_links' => array( - '4.4' => false, - '5.0' => true, - ), - 'mysqli.default_port' => array( - '4.4' => false, - '5.0' => true, - ), - 'mysqli.default_socket' => array( - '4.4' => false, - '5.0' => true, - ), - 'mysqli.default_host' => array( - '4.4' => false, - '5.0' => true, - ), - 'mysqli.default_user' => array( - '4.4' => false, - '5.0' => true, - ), - 'mysqli.default_pw' => array( - '4.4' => false, - '5.0' => true, - ), - 'report_zend_debug' => array( - '4.4' => false, - '5.0' => true, - ), - 'session.hash_bits_per_character' => array( - '4.4' => false, - '5.0' => true, - ), - 'session.hash_function' => array( - '4.4' => false, - '5.0' => true, - ), - 'soap.wsdl_cache_dir' => array( - '4.4' => false, - '5.0' => true, - ), - 'soap.wsdl_cache_enabled' => array( - '4.4' => false, - '5.0' => true, - ), - 'soap.wsdl_cache_ttl' => array( - '4.4' => false, - '5.0' => true, - ), - 'sqlite.assoc_case' => array( - '4.4' => false, - '5.0' => true, - ), - 'tidy.clean_output' => array( - '4.4' => false, - '5.0' => true, - ), - 'tidy.default_config' => array( - '4.4' => false, - '5.0' => true, - ), - 'zend.ze1_compatibility_mode' => array( - '4.4' => false, - '5.0' => true, - ), - - 'date.timezone' => array( - '5.0' => false, - '5.1' => true, - ), - 'detect_unicode' => array( - '5.0' => false, - '5.1' => true, - ), - 'fbsql.batchsize' => array( - '5.0' => false, - '5.1' => true, - 'alternative' => 'fbsql.batchSize', - ), - 'realpath_cache_size' => array( - '5.0' => false, - '5.1' => true, - ), - 'realpath_cache_ttl' => array( - '5.0' => false, - '5.1' => true, - ), - - 'mbstring.strict_detection' => array( - '5.1.1' => false, - '5.1.2' => true, - ), - 'mssql.charset' => array( - '5.1.1' => false, - '5.1.2' => true, - ), - - 'gd.jpeg_ignore_warning' => array( - '5.1.2' => false, - '5.1.3' => true, - ), - - 'fbsql.show_timestamp_decimals' => array( - '5.1.4' => false, - '5.1.5' => true, - ), - 'soap.wsdl_cache' => array( - '5.1.4' => false, - '5.1.5' => true, - ), - 'soap.wsdl_cache_limit' => array( - '5.1.4' => false, - '5.1.5' => true, - ), - - 'allow_url_include' => array( - '5.1' => false, - '5.2' => true, - ), - 'filter.default' => array( - '5.1' => false, - '5.2' => true, - ), - 'filter.default_flags' => array( - '5.1' => false, - '5.2' => true, - ), - 'pcre.backtrack_limit' => array( - '5.1' => false, - '5.2' => true, - ), - 'pcre.recursion_limit' => array( - '5.1' => false, - '5.2' => true, - ), - 'session.cookie_httponly' => array( - '5.1' => false, - '5.2' => true, - ), - - 'cgi.check_shebang_line' => array( - '5.2.0' => false, - '5.2.1' => true, - ), - - 'max_input_nesting_level' => array( - '5.2.2' => false, - '5.2.3' => true, - ), - - 'mysqli.allow_local_infile' => array( - '5.2.3' => false, - '5.2.4' => true, - ), - - 'max_file_uploads' => array( - '5.2.11' => false, - '5.2.12' => true, - ), - - 'cgi.discard_path' => array( - '5.2' => false, - '5.3' => true, - ), - 'exit_on_timeout' => array( - '5.2' => false, - '5.3' => true, - ), - 'intl.default_locale' => array( - '5.2' => false, - '5.3' => true, - ), - 'intl.error_level' => array( - '5.2' => false, - '5.3' => true, - ), - 'mail.add_x_header' => array( - '5.2' => false, - '5.3' => true, - ), - 'mail.log' => array( - '5.2' => false, - '5.3' => true, - ), - 'mbstring.http_output_conv_mimetype' => array( - '5.2' => false, - '5.3' => true, - ), - 'mysqli.allow_persistent' => array( - '5.2' => false, - '5.3' => true, - ), - 'mysqli.cache_size' => array( - '5.2' => false, - '5.3' => true, - ), - 'mysqli.max_persistent' => array( - '5.2' => false, - '5.3' => true, - ), - 'mysqlnd.collect_memory_statistics' => array( - '5.2' => false, - '5.3' => true, - ), - 'mysqlnd.collect_statistics' => array( - '5.2' => false, - '5.3' => true, - ), - 'mysqlnd.debug' => array( - '5.2' => false, - '5.3' => true, - ), - 'mysqlnd.net_read_buffer_size' => array( - '5.2' => false, - '5.3' => true, - ), - 'odbc.default_cursortype' => array( - '5.2' => false, - '5.3' => true, - ), - 'request_order' => array( - '5.2' => false, - '5.3' => true, - ), - 'user_ini.cache_ttl' => array( - '5.2' => false, - '5.3' => true, - ), - 'user_ini.filename' => array( - '5.2' => false, - '5.3' => true, - ), - 'zend.enable_gc' => array( - '5.2' => false, - '5.3' => true, - ), - - 'curl.cainfo' => array( - '5.3.6' => false, - '5.3.7' => true, - ), - - 'max_input_vars' => array( - '5.3.8' => false, - '5.3.9' => true, - ), - - 'sqlite3.extension_dir' => array( - '5.3.10' => false, - '5.3.11' => true, - ), - - 'cli.pager' => array( - '5.3' => false, - '5.4' => true, - ), - 'cli.prompt' => array( - '5.3' => false, - '5.4' => true, - ), - 'cli_server.color' => array( - '5.3' => false, - '5.4' => true, - ), - 'enable_post_data_reading' => array( - '5.3' => false, - '5.4' => true, - ), - 'mysqlnd.mempool_default_size' => array( - '5.3' => false, - '5.4' => true, - ), - 'mysqlnd.net_cmd_buffer_size' => array( - '5.3' => false, - '5.4' => true, - ), - 'mysqlnd.net_read_timeout' => array( - '5.3' => false, - '5.4' => true, - ), - 'phar.cache_list' => array( - '5.3' => false, - '5.4' => true, - ), - 'session.upload_progress.enabled' => array( - '5.3' => false, - '5.4' => true, - ), - 'session.upload_progress.cleanup' => array( - '5.3' => false, - '5.4' => true, - ), - 'session.upload_progress.name' => array( - '5.3' => false, - '5.4' => true, - ), - 'session.upload_progress.freq' => array( - '5.3' => false, - '5.4' => true, - ), - 'session.upload_progress.min_freq' => array( - '5.3' => false, - '5.4' => true, - ), - 'session.upload_progress.prefix' => array( - '5.3' => false, - '5.4' => true, - ), - 'windows_show_crt_warning' => array( - '5.3' => false, - '5.4' => true, - ), - 'zend.detect_unicode' => array( - '5.3' => false, - '5.4' => true, - 'alternative' => 'detect_unicode', - ), - 'zend.multibyte' => array( - '5.3' => false, - '5.4' => true, - ), - 'zend.script_encoding' => array( - '5.3' => false, - '5.4' => true, - ), - 'zend.signal_check' => array( - '5.3' => false, - '5.4' => true, - ), - 'mysqlnd.log_mask' => array( - '5.3' => false, - '5.4' => true, - ), - - 'intl.use_exceptions' => array( - '5.4' => false, - '5.5' => true, - ), - 'mysqlnd.sha256_server_public_key' => array( - '5.4' => false, - '5.5' => true, - ), - 'mysqlnd.trace_alloc' => array( - '5.4' => false, - '5.5' => true, - ), - 'sys_temp_dir' => array( - '5.4' => false, - '5.5' => true, - ), - 'xsl.security_prefs' => array( - '5.4' => false, - '5.5' => true, - ), - 'opcache.enable' => array( - '5.4' => false, - '5.5' => true, - ), - 'opcache.enable_cli' => array( - '5.4' => false, - '5.5' => true, - ), - 'opcache.memory_consumption' => array( - '5.4' => false, - '5.5' => true, - ), - 'opcache.interned_strings_buffer' => array( - '5.4' => false, - '5.5' => true, - ), - 'opcache.max_accelerated_files' => array( - '5.4' => false, - '5.5' => true, - ), - 'opcache.max_wasted_percentage' => array( - '5.4' => false, - '5.5' => true, - ), - 'opcache.use_cwd' => array( - '5.4' => false, - '5.5' => true, - ), - 'opcache.validate_timestamps' => array( - '5.4' => false, - '5.5' => true, - ), - 'opcache.revalidate_freq' => array( - '5.4' => false, - '5.5' => true, - ), - 'opcache.revalidate_path' => array( - '5.4' => false, - '5.5' => true, - ), - 'opcache.save_comments' => array( - '5.4' => false, - '5.5' => true, - ), - 'opcache.load_comments' => array( - '5.4' => false, - '5.5' => true, - ), - 'opcache.fast_shutdown' => array( - '5.4' => false, - '5.5' => true, - ), - 'opcache.enable_file_override' => array( - '5.4' => false, - '5.5' => true, - ), - 'opcache.optimization_level' => array( - '5.4' => false, - '5.5' => true, - ), - 'opcache.inherited_hack' => array( - '5.4' => false, - '5.5' => true, - ), - 'opcache.dups_fix' => array( - '5.4' => false, - '5.5' => true, - ), - 'opcache.blacklist_filename' => array( - '5.4' => false, - '5.5' => true, - ), - 'opcache.max_file_size' => array( - '5.4' => false, - '5.5' => true, - ), - 'opcache.consistency_checks' => array( - '5.4' => false, - '5.5' => true, - ), - 'opcache.force_restart_timeout' => array( - '5.4' => false, - '5.5' => true, - ), - 'opcache.error_log' => array( - '5.4' => false, - '5.5' => true, - ), - 'opcache.log_verbosity_level' => array( - '5.4' => false, - '5.5' => true, - ), - 'opcache.preferred_memory_model' => array( - '5.4' => false, - '5.5' => true, - ), - 'opcache.protect_memory' => array( - '5.4' => false, - '5.5' => true, - ), - 'opcache.mmap_base' => array( - '5.4' => false, - '5.5' => true, - ), - 'opcache.restrict_api' => array( - '5.4' => false, - '5.5' => true, - ), - 'opcache.file_update_protection' => array( - '5.4' => false, - '5.5' => true, - ), - 'opcache.huge_code_pages' => array( - '5.4' => false, - '5.5' => true, - ), - 'opcache.lockfile_path' => array( - '5.4' => false, - '5.5' => true, - ), - 'opcache.opt_debug_level' => array( - '5.4' => false, - '5.5' => true, - ), - - 'session.use_strict_mode' => array( - '5.5.1' => false, - '5.5.2' => true, - ), - - 'mysqli.rollback_on_cached_plink' => array( - '5.5' => false, - '5.6' => true, - ), - - 'assert.exception' => array( - '5.6' => false, - '7.0' => true, - ), - 'pcre.jit' => array( - '5.6' => false, - '7.0' => true, - ), - 'session.lazy_write' => array( - '5.6' => false, - '7.0' => true, - ), - 'zend.assertions' => array( - '5.6' => false, - '7.0' => true, - ), - 'opcache.file_cache' => array( - '5.6' => false, - '7.0' => true, - ), - 'opcache.file_cache_only' => array( - '5.6' => false, - '7.0' => true, - ), - 'opcache.file_cache_consistency_checks' => array( - '5.6' => false, - '7.0' => true, - ), - 'opcache.file_cache_fallback' => array( - '5.6' => false, - '7.0' => true, - ), // Windows only. - - 'opcache.validate_permission' => array( - '7.0.13' => false, - '7.0.14' => true, - ), - 'opcache.validate_root' => array( - '7.0.13' => false, - '7.0.14' => true, - ), - - 'hard_timeout' => array( - '7.0' => false, - '7.1' => true, - ), - 'session.sid_length' => array( - '7.0' => false, - '7.1' => true, - ), - 'session.sid_bits_per_character' => array( - '7.0' => false, - '7.1' => true, - ), - 'session.trans_sid_hosts' => array( - '7.0' => false, - '7.1' => true, - ), - 'session.trans_sid_tags' => array( - '7.0' => false, - '7.1' => true, - ), - 'url_rewriter.hosts' => array( - '7.0' => false, - '7.1' => true, - ), - - // Introduced in PHP 7.1.25, 7.2.13, 7.3.0. - 'imap.enable_insecure_rsh' => array( - '7.1.24' => false, - '7.1.25' => true, - ), - - 'syslog.facility' => array( - '7.2' => false, - '7.3' => true, - ), - 'syslog.filter' => array( - '7.2' => false, - '7.3' => true, - ), - 'syslog.ident' => array( - '7.2' => false, - '7.3' => true, - ), - 'session.cookie_samesite' => array( - '7.2' => false, - '7.3' => true, - ), - - 'ffi.enable' => array( - '7.3' => false, - '7.4' => true, - ), - 'ffi.preload' => array( - '7.3' => false, - '7.4' => true, - ), - 'opcache.cache_id' => array( - '7.3' => false, - '7.4' => true, - ), - 'opcache.preload' => array( - '7.3' => false, - '7.4' => true, - ), - 'zend.exception_ignore_args' => array( - '7.3' => false, - '7.4' => true, - ), - ); - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 5.5 - * - * @return array - */ - public function register() - { - return array(\T_STRING); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 5.5 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $ignore = array( - \T_DOUBLE_COLON => true, - \T_OBJECT_OPERATOR => true, - \T_FUNCTION => true, - \T_CONST => true, - ); - - $prevToken = $phpcsFile->findPrevious(\T_WHITESPACE, ($stackPtr - 1), null, true); - if (isset($ignore[$tokens[$prevToken]['code']]) === true) { - // Not a call to a PHP function. - return; - } - - $functionLc = strtolower($tokens[$stackPtr]['content']); - if (isset($this->iniFunctions[$functionLc]) === false) { - return; - } - - $iniToken = $this->getFunctionCallParameter($phpcsFile, $stackPtr, $this->iniFunctions[$functionLc]); - if ($iniToken === false) { - return; - } - - $filteredToken = $this->stripQuotes($iniToken['raw']); - if (isset($this->newIniDirectives[$filteredToken]) === false) { - return; - } - - $itemInfo = array( - 'name' => $filteredToken, - 'functionLc' => $functionLc, - ); - $this->handleFeature($phpcsFile, $iniToken['end'], $itemInfo); - } - - - /** - * Get the relevant sub-array for a specific item from a multi-dimensional array. - * - * @since 7.1.0 - * - * @param array $itemInfo Base information about the item. - * - * @return array Version and other information about the item. - */ - public function getItemArray(array $itemInfo) - { - return $this->newIniDirectives[$itemInfo['name']]; - } - - - /** - * Get an array of the non-PHP-version array keys used in a sub-array. - * - * @since 7.1.0 - * - * @return array - */ - protected function getNonVersionArrayKeys() - { - return array('alternative'); - } - - - /** - * Retrieve the relevant detail (version) information for use in an error message. - * - * @since 7.1.0 - * - * @param array $itemArray Version and other information about the item. - * @param array $itemInfo Base information about the item. - * - * @return array - */ - public function getErrorInfo(array $itemArray, array $itemInfo) - { - $errorInfo = parent::getErrorInfo($itemArray, $itemInfo); - $errorInfo['alternative'] = ''; - - if (isset($itemArray['alternative']) === true) { - $errorInfo['alternative'] = $itemArray['alternative']; - } - - // Lower error level to warning if the function used was ini_get. - if ($errorInfo['error'] === true && $itemInfo['functionLc'] === 'ini_get') { - $errorInfo['error'] = false; - } - - return $errorInfo; - } - - - /** - * Get the error message template for this sniff. - * - * @since 7.1.0 - * - * @return string - */ - protected function getErrorMsgTemplate() - { - return "INI directive '%s' is not present in PHP version %s or earlier"; - } - - - /** - * Allow for concrete child classes to filter the error message before it's passed to PHPCS. - * - * @since 7.1.0 - * - * @param string $error The error message which was created. - * @param array $itemInfo Base information about the item this error message applies to. - * @param array $errorInfo Detail information about an item this error message applies to. - * - * @return string - */ - protected function filterErrorMsg($error, array $itemInfo, array $errorInfo) - { - if ($errorInfo['alternative'] !== '') { - $error .= ". This directive was previously called '%s'."; - } - - return $error; - } - - - /** - * Allow for concrete child classes to filter the error data before it's passed to PHPCS. - * - * @since 7.1.0 - * - * @param array $data The error data array which was created. - * @param array $itemInfo Base information about the item this error message applies to. - * @param array $errorInfo Detail information about an item this error message applies to. - * - * @return array - */ - protected function filterErrorData(array $data, array $itemInfo, array $errorInfo) - { - if ($errorInfo['alternative'] !== '') { - $data[] = $errorInfo['alternative']; - } - - return $data; - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/IniDirectives/RemovedIniDirectivesSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/IniDirectives/RemovedIniDirectivesSniff.php deleted file mode 100644 index a6928ae..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/IniDirectives/RemovedIniDirectivesSniff.php +++ /dev/null @@ -1,424 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\IniDirectives; - -use PHPCompatibility\AbstractRemovedFeatureSniff; -use PHP_CodeSniffer_File as File; - -/** - * Detect the use of deprecated and removed INI directives through `ini_set()` or `ini_get()`. - * - * PHP version All - * - * @link https://www.php.net/manual/en/ini.list.php - * @link https://www.php.net/manual/en/ini.core.php - * - * @since 5.5 - * @since 7.0.0 This sniff now throws a warning (deprecated) or an error (removed) depending - * on the `testVersion` set. Previously it would always throw a warning. - * @since 7.0.1 The sniff will now only throw warnings for `ini_get()`. - * @since 7.1.0 Now extends the `AbstractRemovedFeatureSniff` instead of the base `Sniff` class. - * @since 9.0.0 Renamed from `DeprecatedIniDirectivesSniff` to `RemovedIniDirectivesSniff`. - */ -class RemovedIniDirectivesSniff extends AbstractRemovedFeatureSniff -{ - /** - * A list of deprecated/removed INI directives. - * - * The array lists : version number with false (deprecated) and true (removed). - * If's sufficient to list the first version where the ini directive was deprecated/removed. - * - * @since 5.5 - * @since 7.0.3 Support for 'alternative' has been added. - * - * @var array(string) - */ - protected $deprecatedIniDirectives = array( - 'fbsql.batchSize' => array( - '5.1' => true, - 'alternative' => 'fbsql.batchsize', - ), - 'pfpro.defaulthost' => array( - '5.1' => true, - ), - 'pfpro.defaultport' => array( - '5.1' => true, - ), - 'pfpro.defaulttimeout' => array( - '5.1' => true, - ), - 'pfpro.proxyaddress' => array( - '5.1' => true, - ), - 'pfpro.proxyport' => array( - '5.1' => true, - ), - 'pfpro.proxylogon' => array( - '5.1' => true, - ), - 'pfpro.proxypassword' => array( - '5.1' => true, - ), - - 'ifx.allow_persistent' => array( - '5.2.1' => true, - ), - 'ifx.blobinfile' => array( - '5.2.1' => true, - ), - 'ifx.byteasvarchar' => array( - '5.2.1' => true, - ), - 'ifx.charasvarchar' => array( - '5.2.1' => true, - ), - 'ifx.default_host' => array( - '5.2.1' => true, - ), - 'ifx.default_password' => array( - '5.2.1' => true, - ), - 'ifx.default_user' => array( - '5.2.1' => true, - ), - 'ifx.max_links' => array( - '5.2.1' => true, - ), - 'ifx.max_persistent' => array( - '5.2.1' => true, - ), - 'ifx.nullformat' => array( - '5.2.1' => true, - ), - 'ifx.textasvarchar' => array( - '5.2.1' => true, - ), - - 'zend.ze1_compatibility_mode' => array( - '5.3' => true, - ), - - 'allow_call_time_pass_reference' => array( - '5.3' => false, - '5.4' => true, - ), - 'define_syslog_variables' => array( - '5.3' => false, - '5.4' => true, - ), - 'detect_unicode' => array( - '5.4' => true, - 'alternative' => 'zend.detect_unicode', - ), - 'highlight.bg' => array( - '5.3' => false, - '5.4' => true, - ), - 'magic_quotes_gpc' => array( - '5.3' => false, - '5.4' => true, - ), - 'magic_quotes_runtime' => array( - '5.3' => false, - '5.4' => true, - ), - 'magic_quotes_sybase' => array( - '5.3' => false, - '5.4' => true, - ), - 'mbstring.script_encoding' => array( - '5.4' => true, - 'alternative' => 'zend.script_encoding', - ), - 'register_globals' => array( - '5.3' => false, - '5.4' => true, - ), - 'register_long_arrays' => array( - '5.3' => false, - '5.4' => true, - ), - 'safe_mode' => array( - '5.3' => false, - '5.4' => true, - ), - 'safe_mode_allowed_env_vars' => array( - '5.3' => false, - '5.4' => true, - ), - 'safe_mode_exec_dir' => array( - '5.3' => false, - '5.4' => true, - ), - 'safe_mode_gid' => array( - '5.3' => false, - '5.4' => true, - ), - 'safe_mode_include_dir' => array( - '5.3' => false, - '5.4' => true, - ), - 'safe_mode_protected_env_vars' => array( - '5.3' => false, - '5.4' => true, - ), - 'session.bug_compat_42' => array( - '5.3' => false, - '5.4' => true, - ), - 'session.bug_compat_warn' => array( - '5.3' => false, - '5.4' => true, - ), - 'y2k_compliance' => array( - '5.3' => false, - '5.4' => true, - ), - - 'always_populate_raw_post_data' => array( - '5.6' => false, - '7.0' => true, - ), - 'iconv.input_encoding' => array( - '5.6' => false, - ), - 'iconv.output_encoding' => array( - '5.6' => false, - ), - 'iconv.internal_encoding' => array( - '5.6' => false, - ), - 'mbstring.http_input' => array( - '5.6' => false, - ), - 'mbstring.http_output' => array( - '5.6' => false, - ), - 'mbstring.internal_encoding' => array( - '5.6' => false, - ), - - 'asp_tags' => array( - '7.0' => true, - ), - 'xsl.security_prefs' => array( - '7.0' => true, - ), - 'opcache.load_comments' => array( - '7.0' => true, - ), - - 'mcrypt.algorithms_dir' => array( - '7.1' => false, - '7.2' => true, - ), - 'mcrypt.modes_dir' => array( - '7.1' => false, - '7.2' => true, - ), - 'session.entropy_file' => array( - '7.1' => true, - ), - 'session.entropy_length' => array( - '7.1' => true, - ), - 'session.hash_function' => array( - '7.1' => true, - ), - 'session.hash_bits_per_character' => array( - '7.1' => true, - ), - - 'mbstring.func_overload' => array( - '7.2' => false, - ), - 'sql.safe_mode' => array( - '7.2' => true, - ), - 'track_errors' => array( - '7.2' => false, - ), - 'opcache.fast_shutdown' => array( - '7.2' => true, - ), - - 'birdstep.max_links' => array( - '7.3' => true, - ), - 'opcache.inherited_hack' => array( - '5.3' => false, // Soft deprecated, i.e. ignored. - '7.3' => true, - ), - 'pdo_odbc.db2_instance_name' => array( - '7.3' => false, // Has been marked as deprecated in the manual from before this time. Now hard-deprecated. - ), - - 'allow_url_include' => array( - '7.4' => false, - ), - 'ibase.allow_persistent' => array( - '7.4' => true, - ), - 'ibase.max_persistent' => array( - '7.4' => true, - ), - 'ibase.max_links' => array( - '7.4' => true, - ), - 'ibase.default_db' => array( - '7.4' => true, - ), - 'ibase.default_user' => array( - '7.4' => true, - ), - 'ibase.default_password' => array( - '7.4' => true, - ), - 'ibase.default_charset' => array( - '7.4' => true, - ), - 'ibase.timestampformat' => array( - '7.4' => true, - ), - 'ibase.dateformat' => array( - '7.4' => true, - ), - 'ibase.timeformat' => array( - '7.4' => true, - ), - ); - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 5.5 - * - * @return array - */ - public function register() - { - return array(\T_STRING); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 5.5 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $ignore = array( - \T_DOUBLE_COLON => true, - \T_OBJECT_OPERATOR => true, - \T_FUNCTION => true, - \T_CONST => true, - ); - - $prevToken = $phpcsFile->findPrevious(\T_WHITESPACE, ($stackPtr - 1), null, true); - if (isset($ignore[$tokens[$prevToken]['code']]) === true) { - // Not a call to a PHP function. - return; - } - - $functionLc = strtolower($tokens[$stackPtr]['content']); - if (isset($this->iniFunctions[$functionLc]) === false) { - return; - } - - $iniToken = $this->getFunctionCallParameter($phpcsFile, $stackPtr, $this->iniFunctions[$functionLc]); - if ($iniToken === false) { - return; - } - - $filteredToken = $this->stripQuotes($iniToken['raw']); - if (isset($this->deprecatedIniDirectives[$filteredToken]) === false) { - return; - } - - $itemInfo = array( - 'name' => $filteredToken, - 'functionLc' => $functionLc, - ); - $this->handleFeature($phpcsFile, $iniToken['end'], $itemInfo); - } - - - /** - * Get the relevant sub-array for a specific item from a multi-dimensional array. - * - * @since 7.1.0 - * - * @param array $itemInfo Base information about the item. - * - * @return array Version and other information about the item. - */ - public function getItemArray(array $itemInfo) - { - return $this->deprecatedIniDirectives[$itemInfo['name']]; - } - - - /** - * Retrieve the relevant detail (version) information for use in an error message. - * - * @since 7.1.0 - * - * @param array $itemArray Version and other information about the item. - * @param array $itemInfo Base information about the item. - * - * @return array - */ - public function getErrorInfo(array $itemArray, array $itemInfo) - { - $errorInfo = parent::getErrorInfo($itemArray, $itemInfo); - - // Lower error level to warning if the function used was ini_get. - if ($errorInfo['error'] === true && $itemInfo['functionLc'] === 'ini_get') { - $errorInfo['error'] = false; - } - - return $errorInfo; - } - - - /** - * Get the error message template for this sniff. - * - * @since 7.1.0 - * - * @return string - */ - protected function getErrorMsgTemplate() - { - return "INI directive '%s' is "; - } - - - /** - * Get the error message template for suggesting an alternative for a specific sniff. - * - * @since 7.1.0 - * - * @return string - */ - protected function getAlternativeOptionTemplate() - { - return str_replace('%s', "'%s'", parent::getAlternativeOptionTemplate()); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/InitialValue/NewConstantArraysUsingConstSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/InitialValue/NewConstantArraysUsingConstSniff.php deleted file mode 100644 index c9c2225..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/InitialValue/NewConstantArraysUsingConstSniff.php +++ /dev/null @@ -1,82 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\InitialValue; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; - -/** - * Detect declaration of constants using the `const` keyword with a (constant) array value - * as supported since PHP 5.6. - * - * PHP version 5.6 - * - * @link https://wiki.php.net/rfc/const_scalar_exprs - * @link https://www.php.net/manual/en/language.constants.syntax.php - * - * @since 7.1.4 - * @since 9.0.0 Renamed from `ConstantArraysUsingConstSniff` to `NewConstantArraysUsingConstSniff`. - */ -class NewConstantArraysUsingConstSniff extends Sniff -{ - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 7.1.4 - * - * @return array - */ - public function register() - { - return array(\T_CONST); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 7.1.4 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsBelow('5.5') !== true) { - return; - } - - $tokens = $phpcsFile->getTokens(); - $find = array( - \T_ARRAY => \T_ARRAY, - \T_OPEN_SHORT_ARRAY => \T_OPEN_SHORT_ARRAY, - ); - - while (($hasArray = $phpcsFile->findNext($find, ($stackPtr + 1), null, false, null, true)) !== false) { - $phpcsFile->addError( - 'Constant arrays using the "const" keyword are not allowed in PHP 5.5 or earlier', - $hasArray, - 'Found' - ); - - // Skip past the content of the array. - $stackPtr = $hasArray; - if ($tokens[$hasArray]['code'] === \T_OPEN_SHORT_ARRAY && isset($tokens[$hasArray]['bracket_closer'])) { - $stackPtr = $tokens[$hasArray]['bracket_closer']; - } elseif ($tokens[$hasArray]['code'] === \T_ARRAY && isset($tokens[$hasArray]['parenthesis_closer'])) { - $stackPtr = $tokens[$hasArray]['parenthesis_closer']; - } - } - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/InitialValue/NewConstantArraysUsingDefineSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/InitialValue/NewConstantArraysUsingDefineSniff.php deleted file mode 100644 index 7b99672..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/InitialValue/NewConstantArraysUsingDefineSniff.php +++ /dev/null @@ -1,101 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\InitialValue; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; - -/** - * Detect declaration of constants using `define()` with a (constant) array value - * as supported since PHP 7.0. - * - * PHP version 7.0 - * - * @link https://www.php.net/manual/en/migration70.new-features.php#migration70.new-features.define-array - * @link https://www.php.net/manual/en/language.constants.syntax.php - * - * @since 7.0.0 - * @since 9.0.0 Renamed from `ConstantArraysUsingDefineSniff` to `NewConstantArraysUsingDefineSniff`. - */ -class NewConstantArraysUsingDefineSniff extends Sniff -{ - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 7.0.0 - * - * @return array - */ - public function register() - { - return array(\T_STRING); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 7.0.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsBelow('5.6') !== true) { - return; - } - - $tokens = $phpcsFile->getTokens(); - - $ignore = array( - \T_DOUBLE_COLON => true, - \T_OBJECT_OPERATOR => true, - \T_FUNCTION => true, - \T_CONST => true, - ); - - $prevToken = $phpcsFile->findPrevious(\T_WHITESPACE, ($stackPtr - 1), null, true); - if (isset($ignore[$tokens[$prevToken]['code']]) === true) { - // Not a call to a PHP function. - return; - } - - $functionLc = strtolower($tokens[$stackPtr]['content']); - if ($functionLc !== 'define') { - return; - } - - $secondParam = $this->getFunctionCallParameter($phpcsFile, $stackPtr, 2); - if (isset($secondParam['start'], $secondParam['end']) === false) { - return; - } - - $targetNestingLevel = 0; - if (isset($tokens[$secondParam['start']]['nested_parenthesis'])) { - $targetNestingLevel = \count($tokens[$secondParam['start']]['nested_parenthesis']); - } - - $array = $phpcsFile->findNext(array(\T_ARRAY, \T_OPEN_SHORT_ARRAY), $secondParam['start'], ($secondParam['end'] + 1)); - if ($array !== false) { - if ((isset($tokens[$array]['nested_parenthesis']) === false && $targetNestingLevel === 0) || \count($tokens[$array]['nested_parenthesis']) === $targetNestingLevel) { - $phpcsFile->addError( - 'Constant arrays using define are not allowed in PHP 5.6 or earlier', - $array, - 'Found' - ); - } - } - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/InitialValue/NewConstantScalarExpressionsSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/InitialValue/NewConstantScalarExpressionsSniff.php deleted file mode 100644 index 8e1cddc..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/InitialValue/NewConstantScalarExpressionsSniff.php +++ /dev/null @@ -1,556 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\InitialValue; - -use PHPCompatibility\Sniff; -use PHPCompatibility\PHPCSHelper; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Detect constant scalar expressions being used to set an initial value. - * - * Since PHP 5.6, it is now possible to provide a scalar expression involving - * numeric and string literals and/or constants in contexts where PHP previously - * expected a static value, such as constant and property declarations and - * default values for function parameters. - * - * PHP version 5.6 - * - * @link https://www.php.net/manual/en/migration56.new-features.php#migration56.new-features.const-scalar-exprs - * @link https://wiki.php.net/rfc/const_scalar_exprs - * - * @since 8.2.0 - */ -class NewConstantScalarExpressionsSniff extends Sniff -{ - - /** - * Error message. - * - * @since 8.2.0 - * - * @var string - */ - const ERROR_PHRASE = 'Constant scalar expressions are not allowed %s in PHP 5.5 or earlier.'; - - /** - * Partial error phrases to be used in combination with the error message constant. - * - * @since 8.2.0 - * - * @var array - */ - protected $errorPhrases = array( - 'const' => 'when defining constants using the const keyword', - 'property' => 'in property declarations', - 'staticvar' => 'in static variable declarations', - 'default' => 'in default function arguments', - ); - - /** - * Tokens which were allowed to be used in these declarations prior to PHP 5.6. - * - * This list will be enriched in the setProperties() method. - * - * @since 8.2.0 - * - * @var array - */ - protected $safeOperands = array( - \T_LNUMBER => \T_LNUMBER, - \T_DNUMBER => \T_DNUMBER, - \T_CONSTANT_ENCAPSED_STRING => \T_CONSTANT_ENCAPSED_STRING, - \T_TRUE => \T_TRUE, - \T_FALSE => \T_FALSE, - \T_NULL => \T_NULL, - - \T_LINE => \T_LINE, - \T_FILE => \T_FILE, - \T_DIR => \T_DIR, - \T_FUNC_C => \T_FUNC_C, - \T_CLASS_C => \T_CLASS_C, - \T_TRAIT_C => \T_TRAIT_C, - \T_METHOD_C => \T_METHOD_C, - \T_NS_C => \T_NS_C, - - // Special cases: - \T_NS_SEPARATOR => \T_NS_SEPARATOR, - /* - * This can be neigh anything, but for any usage except constants, - * the T_STRING will be combined with non-allowed tokens, so we should be good. - */ - \T_STRING => \T_STRING, - ); - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 8.2.0 - * - * @return array - */ - public function register() - { - // Set the properties up only once. - $this->setProperties(); - - return array( - \T_CONST, - \T_VARIABLE, - \T_FUNCTION, - \T_CLOSURE, - \T_STATIC, - ); - } - - - /** - * Make some adjustments to the $safeOperands property. - * - * @since 8.2.0 - * - * @return void - */ - public function setProperties() - { - $this->safeOperands += Tokens::$heredocTokens; - $this->safeOperands += Tokens::$emptyTokens; - } - - - /** - * Do a version check to determine if this sniff needs to run at all. - * - * @since 8.2.0 - * - * @return bool - */ - protected function bowOutEarly() - { - return ($this->supportsBelow('5.5') !== true); - } - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 8.2.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void|int Null or integer stack pointer to skip forward. - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->bowOutEarly() === true) { - return; - } - - $tokens = $phpcsFile->getTokens(); - - switch ($tokens[$stackPtr]['type']) { - case 'T_FUNCTION': - case 'T_CLOSURE': - $params = PHPCSHelper::getMethodParameters($phpcsFile, $stackPtr); - if (empty($params)) { - // No parameters. - return; - } - - $funcToken = $tokens[$stackPtr]; - - if (isset($funcToken['parenthesis_owner'], $funcToken['parenthesis_opener'], $funcToken['parenthesis_closer']) === false - || $funcToken['parenthesis_owner'] !== $stackPtr - || isset($tokens[$funcToken['parenthesis_opener']], $tokens[$funcToken['parenthesis_closer']]) === false - ) { - // Hmm.. something is going wrong as these should all be available & valid. - return; - } - - $opener = $funcToken['parenthesis_opener']; - $closer = $funcToken['parenthesis_closer']; - - // Which nesting level is the one we are interested in ? - $nestedParenthesisCount = 1; - if (isset($tokens[$opener]['nested_parenthesis'])) { - $nestedParenthesisCount += \count($tokens[$opener]['nested_parenthesis']); - } - - foreach ($params as $param) { - if (isset($param['default']) === false) { - continue; - } - - $end = $param['token']; - while (($end = $phpcsFile->findNext(array(\T_COMMA, \T_CLOSE_PARENTHESIS), ($end + 1), ($closer + 1))) !== false) { - $maybeSkipTo = $this->isRealEndOfDeclaration($tokens, $end, $nestedParenthesisCount); - if ($maybeSkipTo !== true) { - $end = $maybeSkipTo; - continue; - } - - // Ignore closing parenthesis/bracket if not 'ours'. - if ($tokens[$end]['code'] === \T_CLOSE_PARENTHESIS && $end !== $closer) { - continue; - } - - // Ok, we've found the end of the param default value declaration. - break; - } - - if ($this->isValidAssignment($phpcsFile, $param['token'], $end) === false) { - $this->throwError($phpcsFile, $param['token'], 'default', $param['content']); - } - } - - /* - * No need for the sniff to be triggered by the T_VARIABLEs in the function - * definition as we've already examined them above, so let's skip over them. - */ - return $closer; - - case 'T_VARIABLE': - case 'T_STATIC': - case 'T_CONST': - $type = 'const'; - - // Filter out non-property declarations. - if ($tokens[$stackPtr]['code'] === \T_VARIABLE) { - if ($this->isClassProperty($phpcsFile, $stackPtr) === false) { - return; - } - - $type = 'property'; - - // Move back one token to have the same starting point as the others. - $stackPtr = ($stackPtr - 1); - } - - // Filter out late static binding and class properties. - if ($tokens[$stackPtr]['code'] === \T_STATIC) { - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true, null, true); - if ($next === false || $tokens[$next]['code'] !== \T_VARIABLE) { - // Late static binding. - return; - } - - if ($this->isClassProperty($phpcsFile, $next) === true) { - // Class properties are examined based on the T_VARIABLE token. - return; - } - unset($next); - - $type = 'staticvar'; - } - - $endOfStatement = $phpcsFile->findNext(array(\T_SEMICOLON, \T_CLOSE_TAG), ($stackPtr + 1)); - if ($endOfStatement === false) { - // No semi-colon - live coding. - return; - } - - $targetNestingLevel = 0; - if (isset($tokens[$stackPtr]['nested_parenthesis']) === true) { - $targetNestingLevel = \count($tokens[$stackPtr]['nested_parenthesis']); - } - - // Examine each variable/constant in multi-declarations. - $start = $stackPtr; - $end = $stackPtr; - while (($end = $phpcsFile->findNext(array(\T_COMMA, \T_SEMICOLON, \T_OPEN_SHORT_ARRAY, \T_CLOSE_TAG), ($end + 1), ($endOfStatement + 1))) !== false) { - - $maybeSkipTo = $this->isRealEndOfDeclaration($tokens, $end, $targetNestingLevel); - if ($maybeSkipTo !== true) { - $end = $maybeSkipTo; - continue; - } - - $start = $phpcsFile->findNext(Tokens::$emptyTokens, ($start + 1), $end, true); - if ($start === false - || ($tokens[$stackPtr]['code'] === \T_CONST && $tokens[$start]['code'] !== \T_STRING) - || ($tokens[$stackPtr]['code'] !== \T_CONST && $tokens[$start]['code'] !== \T_VARIABLE) - ) { - // Shouldn't be possible. - continue; - } - - if ($this->isValidAssignment($phpcsFile, $start, $end) === false) { - // Create the "found" snippet. - $content = ''; - $tokenCount = ($end - $start); - if ($tokenCount < 20) { - // Prevent large arrays from being added to the error message. - $content = $phpcsFile->getTokensAsString($start, ($tokenCount + 1)); - } - - $this->throwError($phpcsFile, $start, $type, $content); - } - - $start = $end; - } - - // Skip to the end of the statement to prevent duplicate messages for multi-declarations. - return $endOfStatement; - } - } - - - /** - * Is a value declared and is the value declared valid pre-PHP 5.6 ? - * - * @since 8.2.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * @param int $end The end of the value definition. - * This will normally be a comma or semi-colon. - * - * @return bool - */ - protected function isValidAssignment(File $phpcsFile, $stackPtr, $end) - { - $tokens = $phpcsFile->getTokens(); - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), $end, true); - if ($next === false || $tokens[$next]['code'] !== \T_EQUAL) { - // No value assigned. - return true; - } - - return $this->isStaticValue($phpcsFile, $tokens, ($next + 1), ($end - 1)); - } - - - /** - * Is a value declared and is the value declared constant as accepted in PHP 5.5 and lower ? - * - * @since 8.2.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param array $tokens The token stack of the current file. - * @param int $start The stackPtr from which to start examining. - * @param int $end The end of the value definition (inclusive), - * i.e. this token will be examined as part of - * the snippet. - * @param int $nestedArrays Optional. Array nesting level when examining - * the content of an array. - * - * @return bool - */ - protected function isStaticValue(File $phpcsFile, $tokens, $start, $end, $nestedArrays = 0) - { - $nextNonSimple = $phpcsFile->findNext($this->safeOperands, $start, ($end + 1), true); - if ($nextNonSimple === false) { - return true; - } - - /* - * OK, so we have at least one token which needs extra examination. - */ - switch ($tokens[$nextNonSimple]['code']) { - case \T_MINUS: - case \T_PLUS: - if ($this->isNumber($phpcsFile, $start, $end, true) !== false) { - // Int or float with sign. - return true; - } - - return false; - - case \T_NAMESPACE: - case \T_PARENT: - case \T_SELF: - case \T_DOUBLE_COLON: - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($nextNonSimple + 1), ($end + 1), true); - - if ($tokens[$nextNonSimple]['code'] === \T_NAMESPACE) { - // Allow only `namespace\...`. - if ($nextNonEmpty === false || $tokens[$nextNonEmpty]['code'] !== \T_NS_SEPARATOR) { - return false; - } - } elseif ($tokens[$nextNonSimple]['code'] === \T_PARENT - || $tokens[$nextNonSimple]['code'] === \T_SELF - ) { - // Allow only `parent::` and `self::`. - if ($nextNonEmpty === false || $tokens[$nextNonEmpty]['code'] !== \T_DOUBLE_COLON) { - return false; - } - } elseif ($tokens[$nextNonSimple]['code'] === \T_DOUBLE_COLON) { - // Allow only `T_STRING::T_STRING`. - if ($nextNonEmpty === false || $tokens[$nextNonEmpty]['code'] !== \T_STRING) { - return false; - } - - $prevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($nextNonSimple - 1), null, true); - // No need to worry about parent/self, that's handled above and - // the double colon is skipped over in that case. - if ($prevNonEmpty === false || $tokens[$prevNonEmpty]['code'] !== \T_STRING) { - return false; - } - } - - // Examine what comes after the namespace/parent/self/double colon, if anything. - return $this->isStaticValue($phpcsFile, $tokens, ($nextNonEmpty + 1), $end, $nestedArrays); - - case \T_ARRAY: - case \T_OPEN_SHORT_ARRAY: - ++$nestedArrays; - - $arrayItems = $this->getFunctionCallParameters($phpcsFile, $nextNonSimple); - if (empty($arrayItems) === false) { - foreach ($arrayItems as $item) { - // Check for a double arrow, but only if it's for this array item, not for a nested array. - $doubleArrow = false; - - $maybeDoubleArrow = $phpcsFile->findNext( - array(\T_DOUBLE_ARROW, \T_ARRAY, \T_OPEN_SHORT_ARRAY), - $item['start'], - ($item['end'] + 1) - ); - if ($maybeDoubleArrow !== false && $tokens[$maybeDoubleArrow]['code'] === \T_DOUBLE_ARROW) { - // Double arrow is for this nesting level. - $doubleArrow = $maybeDoubleArrow; - } - - if ($doubleArrow === false) { - if ($this->isStaticValue($phpcsFile, $tokens, $item['start'], $item['end'], $nestedArrays) === false) { - return false; - } - - } else { - // Examine array key. - if ($this->isStaticValue($phpcsFile, $tokens, $item['start'], ($doubleArrow - 1), $nestedArrays) === false) { - return false; - } - - // Examine array value. - if ($this->isStaticValue($phpcsFile, $tokens, ($doubleArrow + 1), $item['end'], $nestedArrays) === false) { - return false; - } - } - } - } - - --$nestedArrays; - - /* - * Find the end of the array. - * We already know we will have a valid closer as otherwise we wouldn't have been - * able to get the array items. - */ - $closer = ($nextNonSimple + 1); - if ($tokens[$nextNonSimple]['code'] === \T_OPEN_SHORT_ARRAY - && isset($tokens[$nextNonSimple]['bracket_closer']) === true - ) { - $closer = $tokens[$nextNonSimple]['bracket_closer']; - } else { - $maybeOpener = $phpcsFile->findNext(Tokens::$emptyTokens, ($nextNonSimple + 1), ($end + 1), true); - if ($tokens[$maybeOpener]['code'] === \T_OPEN_PARENTHESIS) { - $opener = $maybeOpener; - if (isset($tokens[$opener]['parenthesis_closer']) === true) { - $closer = $tokens[$opener]['parenthesis_closer']; - } - } - } - - if ($closer === $end) { - return true; - } - - // Examine what comes after the array, if anything. - return $this->isStaticValue($phpcsFile, $tokens, ($closer + 1), $end, $nestedArrays); - - } - - // Ok, so this unsafe token was not one of the exceptions, i.e. this is a PHP 5.6+ syntax. - return false; - } - - - /** - * Throw an error if a scalar expression is found. - * - * @since 8.2.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the token to link the error to. - * @param string $type Type of usage found. - * @param string $content Optional. The value for the declaration as found. - * - * @return void - */ - protected function throwError(File $phpcsFile, $stackPtr, $type, $content = '') - { - $error = static::ERROR_PHRASE; - $phrase = ''; - $errorCode = 'Found'; - - if (isset($this->errorPhrases[$type]) === true) { - $errorCode = $this->stringToErrorCode($type) . 'Found'; - $phrase = $this->errorPhrases[$type]; - } - - $data = array($phrase); - - if (empty($content) === false) { - $error .= ' Found: %s'; - $data[] = $content; - } - - $phpcsFile->addError($error, $stackPtr, $errorCode, $data); - } - - - /** - * Helper function to find the end of multi variable/constant declarations. - * - * Checks whether a certain part of a declaration needs to be skipped over or - * if it is the real end of the declaration. - * - * @since 8.2.0 - * - * @param array $tokens Token stack of the current file. - * @param int $endPtr The token to examine as a candidate end pointer. - * @param int $targetLevel Target nesting level. - * - * @return bool|int True if this is the real end. Int stackPtr to skip to if not. - */ - private function isRealEndOfDeclaration($tokens, $endPtr, $targetLevel) - { - // Ignore anything within short array definition brackets for now. - if ($tokens[$endPtr]['code'] === \T_OPEN_SHORT_ARRAY - && (isset($tokens[$endPtr]['bracket_opener']) - && $tokens[$endPtr]['bracket_opener'] === $endPtr) - && isset($tokens[$endPtr]['bracket_closer']) - ) { - // Skip forward to the end of the short array definition. - return $tokens[$endPtr]['bracket_closer']; - } - - // Skip past comma's at a lower nesting level. - if ($tokens[$endPtr]['code'] === \T_COMMA) { - // Check if a comma is at the nesting level we're targetting. - $nestingLevel = 0; - if (isset($tokens[$endPtr]['nested_parenthesis']) === true) { - $nestingLevel = \count($tokens[$endPtr]['nested_parenthesis']); - } - if ($nestingLevel > $targetLevel) { - return $endPtr; - } - } - - return true; - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/InitialValue/NewHeredocSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/InitialValue/NewHeredocSniff.php deleted file mode 100644 index 406237a..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/InitialValue/NewHeredocSniff.php +++ /dev/null @@ -1,100 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\InitialValue; - -use PHPCompatibility\Sniffs\InitialValue\NewConstantScalarExpressionsSniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Detect a heredoc being used to set an initial value. - * - * As of PHP 5.3.0, it's possible to initialize static variables, class properties - * and constants declared using the `const` keyword, using the Heredoc syntax. - * And while not documented, heredoc initialization can now also be used for function param defaults. - * See: https://3v4l.org/JVH8W - * - * These heredocs (still) cannot contain variables. That's, however, outside the scope of the - * PHPCompatibility library until such time as there is a PHP version in which this would be accepted. - * - * PHP version 5.3 - * - * @link https://www.php.net/manual/en/migration53.new-features.php - * @link https://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc - * - * @since 7.1.4 - * @since 8.2.0 Now extends the NewConstantScalarExpressionsSniff instead of the base Sniff class. - * @since 9.0.0 Renamed from `NewHeredocInitializeSniff` to `NewHeredocSniff`. - */ -class NewHeredocSniff extends NewConstantScalarExpressionsSniff -{ - - /** - * Error message. - * - * @since 8.2.0 - * - * @var string - */ - const ERROR_PHRASE = 'Initializing %s using the Heredoc syntax was not supported in PHP 5.2 or earlier'; - - /** - * Partial error phrases to be used in combination with the error message constant. - * - * @since 8.2.0 - * - * @var array - */ - protected $errorPhrases = array( - 'const' => 'constants', - 'property' => 'class properties', - 'staticvar' => 'static variables', - 'default' => 'default parameter values', - ); - - - /** - * Do a version check to determine if this sniff needs to run at all. - * - * @since 8.2.0 - * - * @return bool - */ - protected function bowOutEarly() - { - return ($this->supportsBelow('5.2') !== true); - } - - - /** - * Is a value declared and does the declared value not contain an heredoc ? - * - * @since 8.2.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * @param int $end The end of the value definition. - * - * @return bool True if no heredoc (or assignment) is found, false otherwise. - */ - protected function isValidAssignment(File $phpcsFile, $stackPtr, $end) - { - $tokens = $phpcsFile->getTokens(); - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), $end, true); - if ($next === false || $tokens[$next]['code'] !== \T_EQUAL) { - // No value assigned. - return true; - } - - return ($phpcsFile->findNext(\T_START_HEREDOC, ($next + 1), $end, false, null, true) === false); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Interfaces/InternalInterfacesSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Interfaces/InternalInterfacesSniff.php deleted file mode 100644 index e154a60..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Interfaces/InternalInterfacesSniff.php +++ /dev/null @@ -1,103 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Interfaces; - -use PHPCompatibility\Sniff; -use PHPCompatibility\PHPCSHelper; -use PHP_CodeSniffer_File as File; - -/** - * Detect classes which implement PHP native interfaces intended only for PHP internal use. - * - * PHP version 5.0+ - * - * @link https://www.php.net/manual/en/class.traversable.php - * @link https://www.php.net/manual/en/class.throwable.php - * @link https://www.php.net/manual/en/class.datetimeinterface.php - * - * @since 7.0.3 - */ -class InternalInterfacesSniff extends Sniff -{ - - /** - * A list of PHP internal interfaces, not intended to be implemented by userland classes. - * - * The array lists : the error message to use. - * - * @since 7.0.3 - * - * @var array(string => string) - */ - protected $internalInterfaces = array( - 'Traversable' => 'shouldn\'t be implemented directly, implement the Iterator or IteratorAggregate interface instead.', - 'DateTimeInterface' => 'is intended for type hints only and is not implementable.', - 'Throwable' => 'cannot be implemented directly, extend the Exception class instead.', - ); - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 7.0.3 - * - * @return array - */ - public function register() - { - // Handle case-insensitivity of interface names. - $this->internalInterfaces = $this->arrayKeysToLowercase($this->internalInterfaces); - - $targets = array(\T_CLASS); - - if (\defined('T_ANON_CLASS')) { - $targets[] = \T_ANON_CLASS; - } - - return $targets; - } - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 7.0.3 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $interfaces = PHPCSHelper::findImplementedInterfaceNames($phpcsFile, $stackPtr); - - if (\is_array($interfaces) === false || $interfaces === array()) { - return; - } - - foreach ($interfaces as $interface) { - $interface = ltrim($interface, '\\'); - $interfaceLc = strtolower($interface); - if (isset($this->internalInterfaces[$interfaceLc]) === true) { - $error = 'The interface %s %s'; - $errorCode = $this->stringToErrorCode($interfaceLc) . 'Found'; - $data = array( - $interface, - $this->internalInterfaces[$interfaceLc], - ); - - $phpcsFile->addError($error, $stackPtr, $errorCode, $data); - } - } - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Interfaces/NewInterfacesSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Interfaces/NewInterfacesSniff.php deleted file mode 100644 index 35c5939..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Interfaces/NewInterfacesSniff.php +++ /dev/null @@ -1,362 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Interfaces; - -use PHPCompatibility\AbstractNewFeatureSniff; -use PHPCompatibility\PHPCSHelper; -use PHP_CodeSniffer_File as File; - -/** - * Detect use of new PHP native interfaces and unsupported interface methods. - * - * PHP version 5.0+ - * - * @since 7.0.3 - * @since 7.1.0 Now extends the `AbstractNewFeatureSniff` instead of the base `Sniff` class.. - * @since 7.1.4 Now also detects new interfaces when used as parameter type declarations. - * @since 8.2.0 Now also detects new interfaces when used as return type declarations. - */ -class NewInterfacesSniff extends AbstractNewFeatureSniff -{ - - /** - * A list of new interfaces, not present in older versions. - * - * The array lists : version number with false (not present) or true (present). - * If's sufficient to list the first version where the interface appears. - * - * @since 7.0.3 - * - * @var array(string => array(string => bool)) - */ - protected $newInterfaces = array( - 'Traversable' => array( - '4.4' => false, - '5.0' => true, - ), - 'Reflector' => array( - '4.4' => false, - '5.0' => true, - ), - - 'Countable' => array( - '5.0' => false, - '5.1' => true, - ), - 'OuterIterator' => array( - '5.0' => false, - '5.1' => true, - ), - 'RecursiveIterator' => array( - '5.0' => false, - '5.1' => true, - ), - 'SeekableIterator' => array( - '5.0' => false, - '5.1' => true, - ), - 'Serializable' => array( - '5.0' => false, - '5.1' => true, - ), - 'SplObserver' => array( - '5.0' => false, - '5.1' => true, - ), - 'SplSubject' => array( - '5.0' => false, - '5.1' => true, - ), - - 'JsonSerializable' => array( - '5.3' => false, - '5.4' => true, - ), - 'SessionHandlerInterface' => array( - '5.3' => false, - '5.4' => true, - ), - - 'DateTimeInterface' => array( - '5.4' => false, - '5.5' => true, - ), - - 'SessionIdInterface' => array( - '5.5.0' => false, - '5.5.1' => true, - ), - - 'Throwable' => array( - '5.6' => false, - '7.0' => true, - ), - 'SessionUpdateTimestampHandlerInterface' => array( - '5.6' => false, - '7.0' => true, - ), - ); - - /** - * A list of methods which cannot be used in combination with particular interfaces. - * - * @since 7.0.3 - * - * @var array(string => array(string => string)) - */ - protected $unsupportedMethods = array( - 'Serializable' => array( - '__sleep' => 'https://www.php.net/serializable', - '__wakeup' => 'https://www.php.net/serializable', - ), - ); - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 7.0.3 - * - * @return array - */ - public function register() - { - // Handle case-insensitivity of interface names. - $this->newInterfaces = $this->arrayKeysToLowercase($this->newInterfaces); - $this->unsupportedMethods = $this->arrayKeysToLowercase($this->unsupportedMethods); - - $targets = array( - \T_CLASS, - \T_FUNCTION, - \T_CLOSURE, - ); - - if (\defined('T_ANON_CLASS')) { - $targets[] = \T_ANON_CLASS; - } - - if (\defined('T_RETURN_TYPE')) { - $targets[] = \T_RETURN_TYPE; - } - - return $targets; - } - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 7.0.3 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - switch ($tokens[$stackPtr]['type']) { - case 'T_CLASS': - case 'T_ANON_CLASS': - $this->processClassToken($phpcsFile, $stackPtr); - break; - - case 'T_FUNCTION': - case 'T_CLOSURE': - $this->processFunctionToken($phpcsFile, $stackPtr); - - // Deal with older PHPCS versions which don't recognize return type hints - // as well as newer PHPCS versions (3.3.0+) where the tokenization has changed. - $returnTypeHint = $this->getReturnTypeHintToken($phpcsFile, $stackPtr); - if ($returnTypeHint !== false) { - $this->processReturnTypeToken($phpcsFile, $returnTypeHint); - } - break; - - case 'T_RETURN_TYPE': - $this->processReturnTypeToken($phpcsFile, $stackPtr); - break; - - default: - // Deliberately left empty. - break; - } - } - - - /** - * Processes this test for when a class token is encountered. - * - * - Detect classes implementing the new interfaces. - * - Detect classes implementing the new interfaces with unsupported functions. - * - * @since 7.1.4 Split off from the `process()` method. - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - private function processClassToken(File $phpcsFile, $stackPtr) - { - $interfaces = PHPCSHelper::findImplementedInterfaceNames($phpcsFile, $stackPtr); - - if (\is_array($interfaces) === false || $interfaces === array()) { - return; - } - - $tokens = $phpcsFile->getTokens(); - $checkMethods = false; - - if (isset($tokens[$stackPtr]['scope_closer'])) { - $checkMethods = true; - $scopeCloser = $tokens[$stackPtr]['scope_closer']; - } - - foreach ($interfaces as $interface) { - $interface = ltrim($interface, '\\'); - $interfaceLc = strtolower($interface); - - if (isset($this->newInterfaces[$interfaceLc]) === true) { - $itemInfo = array( - 'name' => $interface, - 'nameLc' => $interfaceLc, - ); - $this->handleFeature($phpcsFile, $stackPtr, $itemInfo); - } - - if ($checkMethods === true && isset($this->unsupportedMethods[$interfaceLc]) === true) { - $nextFunc = $stackPtr; - while (($nextFunc = $phpcsFile->findNext(\T_FUNCTION, ($nextFunc + 1), $scopeCloser)) !== false) { - $funcName = $phpcsFile->getDeclarationName($nextFunc); - $funcNameLc = strtolower($funcName); - if ($funcNameLc === '') { - continue; - } - - if (isset($this->unsupportedMethods[$interfaceLc][$funcNameLc]) === true) { - $error = 'Classes that implement interface %s do not support the method %s(). See %s'; - $errorCode = $this->stringToErrorCode($interface) . 'UnsupportedMethod'; - $data = array( - $interface, - $funcName, - $this->unsupportedMethods[$interfaceLc][$funcNameLc], - ); - - $phpcsFile->addError($error, $nextFunc, $errorCode, $data); - } - } - } - } - } - - - /** - * Processes this test for when a function token is encountered. - * - * - Detect new interfaces when used as a type hint. - * - * @since 7.1.4 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - private function processFunctionToken(File $phpcsFile, $stackPtr) - { - $typeHints = $this->getTypeHintsFromFunctionDeclaration($phpcsFile, $stackPtr); - if (empty($typeHints) || \is_array($typeHints) === false) { - return; - } - - foreach ($typeHints as $hint) { - - $typeHintLc = strtolower($hint); - - if (isset($this->newInterfaces[$typeHintLc]) === true) { - $itemInfo = array( - 'name' => $hint, - 'nameLc' => $typeHintLc, - ); - $this->handleFeature($phpcsFile, $stackPtr, $itemInfo); - } - } - } - - - /** - * Processes this test for when a return type token is encountered. - * - * - Detect new interfaces when used as a return type declaration. - * - * @since 8.2.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - private function processReturnTypeToken(File $phpcsFile, $stackPtr) - { - $returnTypeHint = $this->getReturnTypeHintName($phpcsFile, $stackPtr); - if (empty($returnTypeHint)) { - return; - } - - $returnTypeHint = ltrim($returnTypeHint, '\\'); - $returnTypeHintLc = strtolower($returnTypeHint); - - if (isset($this->newInterfaces[$returnTypeHintLc]) === false) { - return; - } - - // Still here ? Then this is a return type declaration using a new interface. - $itemInfo = array( - 'name' => $returnTypeHint, - 'nameLc' => $returnTypeHintLc, - ); - $this->handleFeature($phpcsFile, $stackPtr, $itemInfo); - } - - - /** - * Get the relevant sub-array for a specific item from a multi-dimensional array. - * - * @since 7.1.0 - * - * @param array $itemInfo Base information about the item. - * - * @return array Version and other information about the item. - */ - public function getItemArray(array $itemInfo) - { - return $this->newInterfaces[$itemInfo['nameLc']]; - } - - - /** - * Get the error message template for this sniff. - * - * @since 7.1.0 - * - * @return string - */ - protected function getErrorMsgTemplate() - { - return 'The built-in interface ' . parent::getErrorMsgTemplate(); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Keywords/CaseSensitiveKeywordsSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Keywords/CaseSensitiveKeywordsSniff.php deleted file mode 100644 index 64002b4..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Keywords/CaseSensitiveKeywordsSniff.php +++ /dev/null @@ -1,76 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Keywords; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; - -/** - * Detect usage of `self`, `parent` and `static` and verify they are lowercase. - * - * Prior to PHP 5.5, cases existed where the `self`, `parent`, and `static` keywords - * were treated in a case sensitive fashion. - * - * PHP version 5.5 - * - * @link https://www.php.net/manual/en/migration55.incompatible.php#migration55.incompatible.self-parent-static - * - * @since 7.1.4 - */ -class CaseSensitiveKeywordsSniff extends Sniff -{ - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 7.1.4 - * - * @return array - */ - public function register() - { - return array( - \T_SELF, - \T_STATIC, - \T_PARENT, - ); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 7.1.4 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsBelow('5.4') === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - $tokenContentLC = strtolower($tokens[$stackPtr]['content']); - - if ($tokenContentLC !== $tokens[$stackPtr]['content']) { - $phpcsFile->addError( - 'The keyword \'%s\' was treated in a case-sensitive fashion in certain cases in PHP 5.4 or earlier. Use the lowercase version for consistent support.', - $stackPtr, - 'NonLowercaseFound', - array($tokenContentLC) - ); - } - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Keywords/ForbiddenNamesAsDeclaredSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Keywords/ForbiddenNamesAsDeclaredSniff.php deleted file mode 100644 index 7f4411b..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Keywords/ForbiddenNamesAsDeclaredSniff.php +++ /dev/null @@ -1,259 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Keywords; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Detects the use of some reserved keywords to name a class, interface, trait or namespace. - * - * Emits errors for reserved words and warnings for soft-reserved words. - * - * PHP version 7.0+ - * - * @link https://www.php.net/manual/en/reserved.other-reserved-words.php - * @link https://wiki.php.net/rfc/reserve_more_types_in_php_7 - * - * @since 7.0.8 - * @since 7.1.4 This sniff now throws a warning (soft reserved) or an error (reserved) depending - * on the `testVersion` set. Previously it would always throw an error. - */ -class ForbiddenNamesAsDeclaredSniff extends Sniff -{ - - /** - * List of tokens which can not be used as class, interface, trait names or as part of a namespace. - * - * @since 7.0.8 - * - * @var array - */ - protected $forbiddenTokens = array( - \T_NULL => '7.0', - \T_TRUE => '7.0', - \T_FALSE => '7.0', - ); - - /** - * T_STRING keywords to recognize as forbidden names. - * - * @since 7.0.8 - * - * @var array - */ - protected $forbiddenNames = array( - 'null' => '7.0', - 'true' => '7.0', - 'false' => '7.0', - 'bool' => '7.0', - 'int' => '7.0', - 'float' => '7.0', - 'string' => '7.0', - 'iterable' => '7.1', - 'void' => '7.1', - 'object' => '7.2', - ); - - /** - * T_STRING keywords to recognize as soft reserved names. - * - * Using any of these keywords to name a class, interface, trait or namespace - * is highly discouraged since they may be used in future versions of PHP. - * - * @since 7.0.8 - * - * @var array - */ - protected $softReservedNames = array( - 'resource' => '7.0', - 'object' => '7.0', - 'mixed' => '7.0', - 'numeric' => '7.0', - ); - - /** - * Combined list of the two lists above. - * - * Used for quick check whether or not something is a reserved - * word. - * Set from the `register()` method. - * - * @since 7.0.8 - * - * @var array - */ - private $allForbiddenNames = array(); - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 7.0.8 - * - * @return array - */ - public function register() - { - // Do the list merge only once. - $this->allForbiddenNames = array_merge($this->forbiddenNames, $this->softReservedNames); - - $targets = array( - \T_CLASS, - \T_INTERFACE, - \T_TRAIT, - \T_NAMESPACE, - \T_STRING, // Compat for PHPCS < 2.4.0 and PHP < 5.3. - ); - - return $targets; - } - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 7.0.8 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsAbove('7.0') === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - $tokenCode = $tokens[$stackPtr]['code']; - $tokenType = $tokens[$stackPtr]['type']; - $tokenContentLc = strtolower($tokens[$stackPtr]['content']); - - // For string tokens we only care about 'trait' as that is the only one - // which may not be correctly recognized as it's own token. - // This only happens in older versions of PHP where the token doesn't exist yet as a keyword. - if ($tokenCode === \T_STRING && $tokenContentLc !== 'trait') { - return; - } - - if (\in_array($tokenType, array('T_CLASS', 'T_INTERFACE', 'T_TRAIT'), true)) { - // Check for the declared name being a name which is not tokenized as T_STRING. - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($nextNonEmpty !== false && isset($this->forbiddenTokens[$tokens[$nextNonEmpty]['code']]) === true) { - $name = $tokens[$nextNonEmpty]['content']; - } else { - // Get the declared name if it's a T_STRING. - $name = $phpcsFile->getDeclarationName($stackPtr); - } - unset($nextNonEmpty); - - if (isset($name) === false || \is_string($name) === false || $name === '') { - return; - } - - $nameLc = strtolower($name); - if (isset($this->allForbiddenNames[$nameLc]) === false) { - return; - } - - } elseif ($tokenCode === \T_NAMESPACE) { - $namespaceName = $this->getDeclaredNamespaceName($phpcsFile, $stackPtr); - - if ($namespaceName === false || $namespaceName === '') { - return; - } - - $namespaceParts = explode('\\', $namespaceName); - foreach ($namespaceParts as $namespacePart) { - $partLc = strtolower($namespacePart); - if (isset($this->allForbiddenNames[$partLc]) === true) { - $name = $namespacePart; - $nameLc = $partLc; - break; - } - } - } elseif ($tokenCode === \T_STRING) { - // Traits which are not yet tokenized as T_TRAIT. - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($nextNonEmpty === false) { - return; - } - - $nextNonEmptyCode = $tokens[$nextNonEmpty]['code']; - - if ($nextNonEmptyCode !== \T_STRING && isset($this->forbiddenTokens[$nextNonEmptyCode]) === true) { - $name = $tokens[$nextNonEmpty]['content']; - $nameLc = strtolower($tokens[$nextNonEmpty]['content']); - } elseif ($nextNonEmptyCode === \T_STRING) { - $endOfStatement = $phpcsFile->findNext(array(\T_SEMICOLON, \T_OPEN_CURLY_BRACKET), ($stackPtr + 1)); - if ($endOfStatement === false) { - return; - } - - do { - $nextNonEmptyLc = strtolower($tokens[$nextNonEmpty]['content']); - - if (isset($this->allForbiddenNames[$nextNonEmptyLc]) === true) { - $name = $tokens[$nextNonEmpty]['content']; - $nameLc = $nextNonEmptyLc; - break; - } - - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($nextNonEmpty + 1), $endOfStatement, true); - } while ($nextNonEmpty !== false); - } - unset($nextNonEmptyCode, $nextNonEmptyLc, $endOfStatement); - } - - if (isset($name, $nameLc) === false) { - return; - } - - // Still here, so this is one of the reserved words. - // Build up the error message. - $error = "'%s' is a"; - $isError = null; - $errorCode = $this->stringToErrorCode($nameLc) . 'Found'; - $data = array( - $nameLc, - ); - - if (isset($this->softReservedNames[$nameLc]) === true - && $this->supportsAbove($this->softReservedNames[$nameLc]) === true - ) { - $error .= ' soft reserved keyword as of PHP version %s'; - $isError = false; - $data[] = $this->softReservedNames[$nameLc]; - } - - if (isset($this->forbiddenNames[$nameLc]) === true - && $this->supportsAbove($this->forbiddenNames[$nameLc]) === true - ) { - if (isset($isError) === true) { - $error .= ' and a'; - } - $error .= ' reserved keyword as of PHP version %s'; - $isError = true; - $data[] = $this->forbiddenNames[$nameLc]; - } - - if (isset($isError) === true) { - $error .= ' and should not be used to name a class, interface or trait or as part of a namespace (%s)'; - $data[] = $tokens[$stackPtr]['type']; - - $this->addMessage($phpcsFile, $error, $stackPtr, $isError, $errorCode, $data); - } - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Keywords/ForbiddenNamesAsInvokedFunctionsSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Keywords/ForbiddenNamesAsInvokedFunctionsSniff.php deleted file mode 100644 index c1c3828..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Keywords/ForbiddenNamesAsInvokedFunctionsSniff.php +++ /dev/null @@ -1,188 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Keywords; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Prohibits the use of reserved keywords invoked as functions. - * - * PHP version All - * - * @link https://www.php.net/manual/en/reserved.keywords.php - * - * @since 5.5 - */ -class ForbiddenNamesAsInvokedFunctionsSniff extends Sniff -{ - - /** - * List of tokens to register. - * - * @since 5.5 - * - * @var array - */ - protected $targetedTokens = array( - \T_ABSTRACT => '5.0', - \T_CALLABLE => '5.4', - \T_CATCH => '5.0', - \T_FINAL => '5.0', - \T_FINALLY => '5.5', - \T_GOTO => '5.3', - \T_IMPLEMENTS => '5.0', - \T_INTERFACE => '5.0', - \T_INSTANCEOF => '5.0', - \T_INSTEADOF => '5.4', - \T_NAMESPACE => '5.3', - \T_PRIVATE => '5.0', - \T_PROTECTED => '5.0', - \T_PUBLIC => '5.0', - \T_TRAIT => '5.4', - \T_TRY => '5.0', - - ); - - /** - * T_STRING keywords to recognize as targetted tokens. - * - * Compatibility for PHP versions where the keyword is not yet recognized - * as its own token and for PHPCS versions which change the token to - * T_STRING when used in a method call. - * - * @since 5.5 - * - * @var array - */ - protected $targetedStringTokens = array( - 'abstract' => '5.0', - 'callable' => '5.4', - 'catch' => '5.0', - 'final' => '5.0', - 'finally' => '5.5', - 'goto' => '5.3', - 'implements' => '5.0', - 'interface' => '5.0', - 'instanceof' => '5.0', - 'insteadof' => '5.4', - 'namespace' => '5.3', - 'private' => '5.0', - 'protected' => '5.0', - 'public' => '5.0', - 'trait' => '5.4', - 'try' => '5.0', - ); - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 5.5 - * - * @return array - */ - public function register() - { - $tokens = array_keys($this->targetedTokens); - $tokens[] = \T_STRING; - - return $tokens; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 5.5 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $tokenCode = $tokens[$stackPtr]['code']; - $tokenContentLc = strtolower($tokens[$stackPtr]['content']); - $isString = false; - - /* - * For string tokens we only care if the string is a reserved word used - * as a function. This only happens in older versions of PHP where the - * token doesn't exist yet for that keyword or in later versions when the - * token is used in a method invocation. - */ - if ($tokenCode === \T_STRING - && (isset($this->targetedStringTokens[$tokenContentLc]) === false) - ) { - return; - } - - if ($tokenCode === \T_STRING) { - $isString = true; - } - - // Make sure this is a function call. - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($next === false || $tokens[$next]['code'] !== \T_OPEN_PARENTHESIS) { - // Not a function call. - return; - } - - // This sniff isn't concerned about function declarations. - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($prev !== false && $tokens[$prev]['code'] === \T_FUNCTION) { - return; - } - - /* - * Deal with PHP 7 relaxing the rules. - * "As of PHP 7.0.0 these keywords are allowed as property, constant, and method names - * of classes, interfaces and traits...", i.e. they can be invoked as a method call. - * - * Only needed for those keywords which we sniff out via T_STRING. - */ - if (($tokens[$prev]['code'] === \T_OBJECT_OPERATOR || $tokens[$prev]['code'] === \T_DOUBLE_COLON) - && $this->supportsBelow('5.6') === false - ) { - return; - } - - // For the word catch, it is valid to have an open parenthesis - // after it, but only if it is preceded by a right curly brace. - if ($tokenCode === \T_CATCH) { - if ($prev !== false && $tokens[$prev]['code'] === \T_CLOSE_CURLY_BRACKET) { - // Ok, it's fine. - return; - } - } - - if ($isString === true) { - $version = $this->targetedStringTokens[$tokenContentLc]; - } else { - $version = $this->targetedTokens[$tokenCode]; - } - - if ($this->supportsAbove($version)) { - $error = "'%s' is a reserved keyword introduced in PHP version %s and cannot be invoked as a function (%s)"; - $errorCode = $this->stringToErrorCode($tokenContentLc) . 'Found'; - $data = array( - $tokenContentLc, - $version, - $tokens[$stackPtr]['type'], - ); - - $phpcsFile->addError($error, $stackPtr, $errorCode, $data); - } - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Keywords/ForbiddenNamesSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Keywords/ForbiddenNamesSniff.php deleted file mode 100644 index 6be1de4..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Keywords/ForbiddenNamesSniff.php +++ /dev/null @@ -1,442 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Keywords; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Detects the use of reserved keywords as class, function, namespace or constant names. - * - * PHP version All - * - * @link https://www.php.net/manual/en/reserved.keywords.php - * - * @since 5.5 - */ -class ForbiddenNamesSniff extends Sniff -{ - - /** - * A list of keywords that can not be used as function, class and namespace name or constant name. - * Mentions since which version it's not allowed. - * - * @since 5.5 - * - * @var array(string => string) - */ - protected $invalidNames = array( - 'abstract' => '5.0', - 'and' => 'all', - 'array' => 'all', - 'as' => 'all', - 'break' => 'all', - 'callable' => '5.4', - 'case' => 'all', - 'catch' => '5.0', - 'class' => 'all', - 'clone' => '5.0', - 'const' => 'all', - 'continue' => 'all', - 'declare' => 'all', - 'default' => 'all', - 'die' => 'all', - 'do' => 'all', - 'echo' => 'all', - 'else' => 'all', - 'elseif' => 'all', - 'empty' => 'all', - 'enddeclare' => 'all', - 'endfor' => 'all', - 'endforeach' => 'all', - 'endif' => 'all', - 'endswitch' => 'all', - 'endwhile' => 'all', - 'eval' => 'all', - 'exit' => 'all', - 'extends' => 'all', - 'final' => '5.0', - 'finally' => '5.5', - 'for' => 'all', - 'foreach' => 'all', - 'function' => 'all', - 'global' => 'all', - 'goto' => '5.3', - 'if' => 'all', - 'implements' => '5.0', - 'include' => 'all', - 'include_once' => 'all', - 'instanceof' => '5.0', - 'insteadof' => '5.4', - 'interface' => '5.0', - 'isset' => 'all', - 'list' => 'all', - 'namespace' => '5.3', - 'new' => 'all', - 'or' => 'all', - 'print' => 'all', - 'private' => '5.0', - 'protected' => '5.0', - 'public' => '5.0', - 'require' => 'all', - 'require_once' => 'all', - 'return' => 'all', - 'static' => 'all', - 'switch' => 'all', - 'throw' => '5.0', - 'trait' => '5.4', - 'try' => '5.0', - 'unset' => 'all', - 'use' => 'all', - 'var' => 'all', - 'while' => 'all', - 'xor' => 'all', - 'yield' => '5.5', - '__class__' => 'all', - '__dir__' => '5.3', - '__file__' => 'all', - '__function__' => 'all', - '__method__' => 'all', - '__namespace__' => '5.3', - ); - - /** - * A list of keywords that can follow use statements. - * - * @since 7.0.1 - * - * @var array(string => string) - */ - protected $validUseNames = array( - 'const' => true, - 'function' => true, - ); - - /** - * Scope modifiers and other keywords allowed in trait use statements. - * - * @since 7.1.4 - * - * @var array - */ - private $allowedModifiers = array(); - - /** - * Targeted tokens. - * - * @since 5.5 - * - * @var array - */ - protected $targetedTokens = array( - \T_CLASS, - \T_FUNCTION, - \T_NAMESPACE, - \T_STRING, - \T_CONST, - \T_USE, - \T_AS, - \T_EXTENDS, - \T_INTERFACE, - \T_TRAIT, - ); - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 5.5 - * - * @return array - */ - public function register() - { - $this->allowedModifiers = Tokens::$scopeModifiers; - $this->allowedModifiers[\T_FINAL] = \T_FINAL; - - $tokens = $this->targetedTokens; - - if (\defined('T_ANON_CLASS')) { - $tokens[] = \T_ANON_CLASS; - } - - return $tokens; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 5.5 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - /* - * We distinguish between the class, function and namespace names vs the define statements. - */ - if ($tokens[$stackPtr]['type'] === 'T_STRING') { - $this->processString($phpcsFile, $stackPtr, $tokens); - } else { - $this->processNonString($phpcsFile, $stackPtr, $tokens); - } - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 5.5 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * @param array $tokens The stack of tokens that make up - * the file. - * - * @return void - */ - public function processNonString(File $phpcsFile, $stackPtr, $tokens) - { - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($nextNonEmpty === false) { - return; - } - - /* - * Deal with anonymous classes - `class` before a reserved keyword is sometimes - * misidentified as `T_ANON_CLASS`. - * In PHPCS < 2.3.4 these were tokenized as T_CLASS no matter what. - */ - if ($tokens[$stackPtr]['type'] === 'T_ANON_CLASS' || $tokens[$stackPtr]['type'] === 'T_CLASS') { - $prevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($prevNonEmpty !== false && $tokens[$prevNonEmpty]['type'] === 'T_NEW') { - return; - } - } - - /* - * PHP 5.6 allows for use const and use function, but only if followed by the function/constant name. - * - `use function HelloWorld` => move to the next token (HelloWorld) to verify. - * - `use const HelloWorld` => move to the next token (HelloWorld) to verify. - */ - elseif ($tokens[$stackPtr]['type'] === 'T_USE' - && isset($this->validUseNames[strtolower($tokens[$nextNonEmpty]['content'])]) === true - ) { - $maybeUseNext = $phpcsFile->findNext(Tokens::$emptyTokens, ($nextNonEmpty + 1), null, true, null, true); - if ($maybeUseNext !== false && $this->isEndOfUseStatement($tokens[$maybeUseNext]) === false) { - $nextNonEmpty = $maybeUseNext; - } - } - - /* - * Deal with visibility modifiers. - * - `use HelloWorld { sayHello as protected; }` => valid, bow out. - * - `use HelloWorld { sayHello as private myPrivateHello; }` => move to the next token to verify. - */ - elseif ($tokens[$stackPtr]['type'] === 'T_AS' - && isset($this->allowedModifiers[$tokens[$nextNonEmpty]['code']]) === true - && $phpcsFile->hasCondition($stackPtr, \T_USE) === true - ) { - $maybeUseNext = $phpcsFile->findNext(Tokens::$emptyTokens, ($nextNonEmpty + 1), null, true, null, true); - if ($maybeUseNext === false || $this->isEndOfUseStatement($tokens[$maybeUseNext]) === true) { - return; - } - - $nextNonEmpty = $maybeUseNext; - } - - /* - * Deal with foreach ( ... as list() ). - */ - elseif ($tokens[$stackPtr]['type'] === 'T_AS' - && isset($tokens[$stackPtr]['nested_parenthesis']) === true - && $tokens[$nextNonEmpty]['code'] === \T_LIST - ) { - $parentheses = array_reverse($tokens[$stackPtr]['nested_parenthesis'], true); - foreach ($parentheses as $open => $close) { - if (isset($tokens[$open]['parenthesis_owner']) - && $tokens[$tokens[$open]['parenthesis_owner']]['code'] === \T_FOREACH - ) { - return; - } - } - } - - /* - * Deal with functions declared to return by reference. - */ - elseif ($tokens[$stackPtr]['type'] === 'T_FUNCTION' - && $tokens[$nextNonEmpty]['type'] === 'T_BITWISE_AND' - ) { - $maybeUseNext = $phpcsFile->findNext(Tokens::$emptyTokens, ($nextNonEmpty + 1), null, true, null, true); - if ($maybeUseNext === false) { - // Live coding. - return; - } - - $nextNonEmpty = $maybeUseNext; - } - - /* - * Deal with nested namespaces. - */ - elseif ($tokens[$stackPtr]['type'] === 'T_NAMESPACE') { - if ($tokens[$stackPtr + 1]['code'] === \T_NS_SEPARATOR) { - // Not a namespace declaration, but use of, i.e. `namespace\someFunction();`. - return; - } - - $endToken = $phpcsFile->findNext(array(\T_SEMICOLON, \T_OPEN_CURLY_BRACKET), ($stackPtr + 1), null, false, null, true); - $namespaceName = trim($phpcsFile->getTokensAsString(($stackPtr + 1), ($endToken - $stackPtr - 1))); - if (empty($namespaceName) === true) { - return; - } - - $namespaceParts = explode('\\', $namespaceName); - foreach ($namespaceParts as $namespacePart) { - $partLc = strtolower($namespacePart); - if (isset($this->invalidNames[$partLc]) === false) { - continue; - } - - // Find the token position of the part which matched. - for ($i = ($stackPtr + 1); $i < $endToken; $i++) { - if ($tokens[$i]['content'] === $namespacePart) { - $nextNonEmpty = $i; - break; - } - } - } - unset($i, $namespacePart, $partLc); - } - - $nextContentLc = strtolower($tokens[$nextNonEmpty]['content']); - if (isset($this->invalidNames[$nextContentLc]) === false) { - return; - } - - /* - * Deal with PHP 7 relaxing the rules. - * "As of PHP 7.0.0 these keywords are allowed as property, constant, and method names - * of classes, interfaces and traits, except that class may not be used as constant name." - */ - if ((($tokens[$stackPtr]['type'] === 'T_FUNCTION' - && $this->inClassScope($phpcsFile, $stackPtr, false) === true) - || ($tokens[$stackPtr]['type'] === 'T_CONST' - && $this->isClassConstant($phpcsFile, $stackPtr) === true - && $nextContentLc !== 'class')) - && $this->supportsBelow('5.6') === false - ) { - return; - } - - if ($this->supportsAbove($this->invalidNames[$nextContentLc])) { - $data = array( - $tokens[$nextNonEmpty]['content'], - $this->invalidNames[$nextContentLc], - ); - $this->addError($phpcsFile, $stackPtr, $tokens[$nextNonEmpty]['content'], $data); - } - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 5.5 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * @param array $tokens The stack of tokens that make up - * the file. - * - * @return void - */ - public function processString(File $phpcsFile, $stackPtr, $tokens) - { - $tokenContentLc = strtolower($tokens[$stackPtr]['content']); - - /* - * Special case for PHP versions where the target is not yet identified as - * its own token, but presents as T_STRING. - * - trait keyword in PHP < 5.4 - */ - if (version_compare(\PHP_VERSION_ID, '50400', '<') && $tokenContentLc === 'trait') { - $this->processNonString($phpcsFile, $stackPtr, $tokens); - return; - } - - // Look for any define/defined tokens (both T_STRING ones, blame Tokenizer). - if ($tokenContentLc !== 'define' && $tokenContentLc !== 'defined') { - return; - } - - // Retrieve the define(d) constant name. - $firstParam = $this->getFunctionCallParameter($phpcsFile, $stackPtr, 1); - if ($firstParam === false) { - return; - } - - $defineName = $this->stripQuotes($firstParam['raw']); - $defineNameLc = strtolower($defineName); - - if (isset($this->invalidNames[$defineNameLc]) && $this->supportsAbove($this->invalidNames[$defineNameLc])) { - $data = array( - $defineName, - $this->invalidNames[$defineNameLc], - ); - $this->addError($phpcsFile, $stackPtr, $defineNameLc, $data); - } - } - - - /** - * Add the error message. - * - * @since 7.1.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * @param string $content The token content found. - * @param array $data The data to pass into the error message. - * - * @return void - */ - protected function addError(File $phpcsFile, $stackPtr, $content, $data) - { - $error = "Function name, class name, namespace name or constant name can not be reserved keyword '%s' (since version %s)"; - $errorCode = $this->stringToErrorCode($content) . 'Found'; - $phpcsFile->addError($error, $stackPtr, $errorCode, $data); - } - - - /** - * Check if the current token code is for a token which can be considered - * the end of a (partial) use statement. - * - * @since 7.0.8 - * - * @param int $token The current token information. - * - * @return bool - */ - protected function isEndOfUseStatement($token) - { - return \in_array($token['code'], array(\T_CLOSE_CURLY_BRACKET, \T_SEMICOLON, \T_COMMA), true); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Keywords/NewKeywordsSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Keywords/NewKeywordsSniff.php deleted file mode 100644 index 61f79aa..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Keywords/NewKeywordsSniff.php +++ /dev/null @@ -1,391 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Keywords; - -use PHPCompatibility\AbstractNewFeatureSniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Detect use of new PHP keywords. - * - * PHP version All - * - * @link https://wiki.php.net/rfc/heredoc-with-double-quotes - * @link https://wiki.php.net/rfc/horizontalreuse (traits) - * @link https://wiki.php.net/rfc/generators - * @link https://wiki.php.net/rfc/finally - * @link https://wiki.php.net/rfc/generator-delegation - * - * @since 5.5 - * @since 7.1.0 Now extends the `AbstractNewFeatureSniff` instead of the base `Sniff` class.. - */ -class NewKeywordsSniff extends AbstractNewFeatureSniff -{ - - /** - * A list of new keywords, not present in older versions. - * - * The array lists : version number with false (not present) or true (present). - * If's sufficient to list the last version which did not contain the keyword. - * - * Description will be used as part of the error message. - * Condition is the name of a callback method within this class or the parent class - * which checks whether the token complies with a certain condition. - * The callback function will be passed the $phpcsFile and the $stackPtr. - * The callback function should return `true` if the condition is met and the - * error should *not* be thrown. - * - * @since 5.5 - * @since 7.0.3 Support for 'condition' has been added. - * - * @var array(string => array(string => bool|string)) - */ - protected $newKeywords = array( - 'T_HALT_COMPILER' => array( - '5.0' => false, - '5.1' => true, - 'description' => '"__halt_compiler" keyword', - ), - 'T_CONST' => array( - '5.2' => false, - '5.3' => true, - 'description' => '"const" keyword', - 'condition' => 'isClassConstant', // Keyword is only new when not in class context. - ), - 'T_CALLABLE' => array( - '5.3' => false, - '5.4' => true, - 'description' => '"callable" keyword', - 'content' => 'callable', - ), - 'T_DIR' => array( - '5.2' => false, - '5.3' => true, - 'description' => '__DIR__ magic constant', - 'content' => '__DIR__', - ), - 'T_GOTO' => array( - '5.2' => false, - '5.3' => true, - 'description' => '"goto" keyword', - 'content' => 'goto', - ), - 'T_INSTEADOF' => array( - '5.3' => false, - '5.4' => true, - 'description' => '"insteadof" keyword (for traits)', - 'content' => 'insteadof', - ), - 'T_NAMESPACE' => array( - '5.2' => false, - '5.3' => true, - 'description' => '"namespace" keyword', - 'content' => 'namespace', - ), - 'T_NS_C' => array( - '5.2' => false, - '5.3' => true, - 'description' => '__NAMESPACE__ magic constant', - 'content' => '__NAMESPACE__', - ), - 'T_USE' => array( - '5.2' => false, - '5.3' => true, - 'description' => '"use" keyword (for traits/namespaces/anonymous functions)', - ), - 'T_START_NOWDOC' => array( - '5.2' => false, - '5.3' => true, - 'description' => 'nowdoc functionality', - ), - 'T_END_NOWDOC' => array( - '5.2' => false, - '5.3' => true, - 'description' => 'nowdoc functionality', - ), - 'T_START_HEREDOC' => array( - '5.2' => false, - '5.3' => true, - 'description' => '(Double) quoted Heredoc identifier', - 'condition' => 'isNotQuoted', // Heredoc is only new with quoted identifier. - ), - 'T_TRAIT' => array( - '5.3' => false, - '5.4' => true, - 'description' => '"trait" keyword', - 'content' => 'trait', - ), - 'T_TRAIT_C' => array( - '5.3' => false, - '5.4' => true, - 'description' => '__TRAIT__ magic constant', - 'content' => '__TRAIT__', - ), - // The specifics for distinguishing between 'yield' and 'yield from' are dealt - // with in the translation logic. - // This token has to be placed above the `T_YIELD` token in this array to allow for this. - 'T_YIELD_FROM' => array( - '5.6' => false, - '7.0' => true, - 'description' => '"yield from" keyword (for generators)', - 'content' => 'yield', - ), - 'T_YIELD' => array( - '5.4' => false, - '5.5' => true, - 'description' => '"yield" keyword (for generators)', - 'content' => 'yield', - ), - 'T_FINALLY' => array( - '5.4' => false, - '5.5' => true, - 'description' => '"finally" keyword (in exception handling)', - 'content' => 'finally', - ), - ); - - /** - * Translation table for T_STRING tokens. - * - * Will be set up from the register() method. - * - * @since 7.0.5 - * - * @var array(string => string) - */ - protected $translateContentToToken = array(); - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 5.5 - * - * @return array - */ - public function register() - { - $tokens = array(); - $translate = array(); - foreach ($this->newKeywords as $token => $versions) { - if (\defined($token)) { - $tokens[] = constant($token); - } - if (isset($versions['content'])) { - $translate[strtolower($versions['content'])] = $token; - } - } - - /* - * Deal with tokens not recognized by the PHP version the sniffer is run - * under and (not correctly) compensated for by PHPCS. - */ - if (empty($translate) === false) { - $this->translateContentToToken = $translate; - $tokens[] = \T_STRING; - } - - return $tokens; - } - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 5.5 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $tokenType = $tokens[$stackPtr]['type']; - - // Allow for dealing with multi-token keywords, like "yield from". - $end = $stackPtr; - - // Translate T_STRING token if necessary. - if ($tokens[$stackPtr]['type'] === 'T_STRING') { - $content = strtolower($tokens[$stackPtr]['content']); - - if (isset($this->translateContentToToken[$content]) === false) { - // Not one of the tokens we're looking for. - return; - } - - $tokenType = $this->translateContentToToken[$content]; - } - - /* - * Special case: distinguish between `yield` and `yield from`. - * - * PHPCS currently (at least up to v 3.0.1) does not backfill for the - * `yield` nor the `yield from` keywords. - * See: https://github.com/squizlabs/PHP_CodeSniffer/issues/1524 - * - * In PHP < 5.5, both `yield` as well as `from` are tokenized as T_STRING. - * In PHP 5.5 - 5.6, `yield` is tokenized as T_YIELD and `from` as T_STRING, - * but the `T_YIELD_FROM` token *is* defined in PHP. - * In PHP 7.0+ both are tokenized as their respective token, however, - * a multi-line "yield from" is tokenized as two tokens. - */ - if ($tokenType === 'T_YIELD') { - $nextToken = $phpcsFile->findNext(\T_WHITESPACE, ($end + 1), null, true); - if ($tokens[$nextToken]['code'] === \T_STRING - && $tokens[$nextToken]['content'] === 'from' - ) { - $tokenType = 'T_YIELD_FROM'; - $end = $nextToken; - } - unset($nextToken); - } - - if ($tokenType === 'T_YIELD_FROM' && $tokens[($stackPtr - 1)]['type'] === 'T_YIELD_FROM') { - // Multi-line "yield from", no need to report it twice. - return; - } - - if (isset($this->newKeywords[$tokenType]) === false) { - return; - } - - $nextToken = $phpcsFile->findNext(Tokens::$emptyTokens, ($end + 1), null, true); - $prevToken = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - - if ($prevToken !== false - && ($tokens[$prevToken]['code'] === \T_DOUBLE_COLON - || $tokens[$prevToken]['code'] === \T_OBJECT_OPERATOR) - ) { - // Class property of the same name as one of the keywords. Ignore. - return; - } - - // Skip attempts to use keywords as functions or class names - the former - // will be reported by ForbiddenNamesAsInvokedFunctionsSniff, whilst the - // latter will be (partially) reported by the ForbiddenNames sniff. - // Either type will result in false-positives when targetting lower versions - // of PHP where the name was not reserved, unless we explicitly check for - // them. - if (($nextToken === false - || $tokens[$nextToken]['type'] !== 'T_OPEN_PARENTHESIS') - && ($prevToken === false - || $tokens[$prevToken]['type'] !== 'T_CLASS' - || $tokens[$prevToken]['type'] !== 'T_INTERFACE') - ) { - // Skip based on token scope condition. - if (isset($this->newKeywords[$tokenType]['condition']) - && \call_user_func(array($this, $this->newKeywords[$tokenType]['condition']), $phpcsFile, $stackPtr) === true - ) { - return; - } - - $itemInfo = array( - 'name' => $tokenType, - ); - $this->handleFeature($phpcsFile, $stackPtr, $itemInfo); - } - } - - - /** - * Get the relevant sub-array for a specific item from a multi-dimensional array. - * - * @since 7.1.0 - * - * @param array $itemInfo Base information about the item. - * - * @return array Version and other information about the item. - */ - public function getItemArray(array $itemInfo) - { - return $this->newKeywords[$itemInfo['name']]; - } - - - /** - * Get an array of the non-PHP-version array keys used in a sub-array. - * - * @since 7.1.0 - * - * @return array - */ - protected function getNonVersionArrayKeys() - { - return array( - 'description', - 'condition', - 'content', - ); - } - - - /** - * Retrieve the relevant detail (version) information for use in an error message. - * - * @since 7.1.0 - * - * @param array $itemArray Version and other information about the item. - * @param array $itemInfo Base information about the item. - * - * @return array - */ - public function getErrorInfo(array $itemArray, array $itemInfo) - { - $errorInfo = parent::getErrorInfo($itemArray, $itemInfo); - $errorInfo['description'] = $itemArray['description']; - - return $errorInfo; - } - - - /** - * Allow for concrete child classes to filter the error data before it's passed to PHPCS. - * - * @since 7.1.0 - * - * @param array $data The error data array which was created. - * @param array $itemInfo Base information about the item this error message applies to. - * @param array $errorInfo Detail information about an item this error message applies to. - * - * @return array - */ - protected function filterErrorData(array $data, array $itemInfo, array $errorInfo) - { - $data[0] = $errorInfo['description']; - return $data; - } - - - /** - * Callback for the quoted heredoc identifier condition. - * - * A double quoted identifier will have the opening quote on position 3 - * in the string: `<<<"ID"`. - * - * @since 8.0.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return bool - */ - public function isNotQuoted(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - return ($tokens[$stackPtr]['content'][3] !== '"'); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/LanguageConstructs/NewEmptyNonVariableSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/LanguageConstructs/NewEmptyNonVariableSniff.php deleted file mode 100644 index ffb9ef2..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/LanguageConstructs/NewEmptyNonVariableSniff.php +++ /dev/null @@ -1,91 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\LanguageConstructs; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Verify that nothing but variables are passed to empty(). - * - * Prior to PHP 5.5, `empty()` only supported variables; anything else resulted in a parse error. - * - * PHP version 5.5 - * - * @link https://wiki.php.net/rfc/empty_isset_exprs - * @link https://www.php.net/manual/en/function.empty.php - * - * @since 7.0.4 - * @since 9.0.0 The "is the parameter a variable" determination has been abstracted out - * and moved to a separate method `Sniff::isVariable()`. - * @since 9.0.0 Renamed from `EmptyNonVariableSniff` to `NewEmptyNonVariableSniff`. - */ -class NewEmptyNonVariableSniff extends Sniff -{ - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 7.0.4 - * - * @return array - */ - public function register() - { - return array(\T_EMPTY); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 7.0.4 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsBelow('5.4') === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - - $open = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true, null, true); - if ($open === false - || $tokens[$open]['code'] !== \T_OPEN_PARENTHESIS - || isset($tokens[$open]['parenthesis_closer']) === false - ) { - return; - } - - $close = $tokens[$open]['parenthesis_closer']; - - $nestingLevel = 0; - if ($close !== ($open + 1) && isset($tokens[$open + 1]['nested_parenthesis'])) { - $nestingLevel = \count($tokens[$open + 1]['nested_parenthesis']); - } - - if ($this->isVariable($phpcsFile, ($open + 1), $close, $nestingLevel) === true) { - return; - } - - $phpcsFile->addError( - 'Only variables can be passed to empty() prior to PHP 5.5.', - $stackPtr, - 'Found' - ); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/LanguageConstructs/NewLanguageConstructsSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/LanguageConstructs/NewLanguageConstructsSniff.php deleted file mode 100644 index 44488ed..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/LanguageConstructs/NewLanguageConstructsSniff.php +++ /dev/null @@ -1,159 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\LanguageConstructs; - -use PHPCompatibility\AbstractNewFeatureSniff; -use PHP_CodeSniffer_File as File; - -/** - * Detect use of new PHP language constructs. - * - * PHP version All - * - * @link https://wiki.php.net/rfc/namespaceseparator - * @link https://wiki.php.net/rfc/variadics - * @link https://wiki.php.net/rfc/argument_unpacking - * - * @since 5.6 - * @since 7.1.0 Now extends the `AbstractNewFeatureSniff` instead of the base `Sniff` class.. - * @since 9.0.0 Detection for new operator tokens has been moved to the `NewOperators` sniff. - */ -class NewLanguageConstructsSniff extends AbstractNewFeatureSniff -{ - - /** - * A list of new language constructs, not present in older versions. - * - * The array lists : version number with false (not present) or true (present). - * If's sufficient to list the first version where the keyword appears. - * - * @since 5.6 - * - * @var array(string => array(string => bool|string)) - */ - protected $newConstructs = array( - 'T_NS_SEPARATOR' => array( - '5.2' => false, - '5.3' => true, - 'description' => 'the \ operator (for namespaces)', - ), - 'T_ELLIPSIS' => array( - '5.5' => false, - '5.6' => true, - 'description' => 'the ... spread operator', - ), - ); - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 5.6 - * - * @return array - */ - public function register() - { - $tokens = array(); - foreach ($this->newConstructs as $token => $versions) { - $tokens[] = constant($token); - } - return $tokens; - } - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 5.6 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $tokenType = $tokens[$stackPtr]['type']; - - $itemInfo = array( - 'name' => $tokenType, - ); - $this->handleFeature($phpcsFile, $stackPtr, $itemInfo); - } - - - /** - * Get the relevant sub-array for a specific item from a multi-dimensional array. - * - * @since 7.1.0 - * - * @param array $itemInfo Base information about the item. - * - * @return array Version and other information about the item. - */ - public function getItemArray(array $itemInfo) - { - return $this->newConstructs[$itemInfo['name']]; - } - - - /** - * Get an array of the non-PHP-version array keys used in a sub-array. - * - * @since 7.1.0 - * - * @return array - */ - protected function getNonVersionArrayKeys() - { - return array('description'); - } - - - /** - * Retrieve the relevant detail (version) information for use in an error message. - * - * @since 7.1.0 - * - * @param array $itemArray Version and other information about the item. - * @param array $itemInfo Base information about the item. - * - * @return array - */ - public function getErrorInfo(array $itemArray, array $itemInfo) - { - $errorInfo = parent::getErrorInfo($itemArray, $itemInfo); - $errorInfo['description'] = $itemArray['description']; - - return $errorInfo; - } - - - /** - * Allow for concrete child classes to filter the error data before it's passed to PHPCS. - * - * @since 7.1.0 - * - * @param array $data The error data array which was created. - * @param array $itemInfo Base information about the item this error message applies to. - * @param array $errorInfo Detail information about an item this error message applies to. - * - * @return array - */ - protected function filterErrorData(array $data, array $itemInfo, array $errorInfo) - { - $data[0] = $errorInfo['description']; - return $data; - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Lists/AssignmentOrderSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Lists/AssignmentOrderSniff.php deleted file mode 100644 index f5ba477..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Lists/AssignmentOrderSniff.php +++ /dev/null @@ -1,188 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Lists; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Detect code affected by the changed list assignment order in PHP 7.0+. - * - * The `list()` construct no longer assigns variables in reverse order. - * This affects all list constructs where non-unique variables are used. - * - * PHP version 7.0 - * - * @link https://www.php.net/manual/en/migration70.incompatible.php#migration70.incompatible.variable-handling.list.order - * @link https://wiki.php.net/rfc/abstract_syntax_tree#changes_to_list - * @link https://www.php.net/manual/en/function.list.php - * - * @since 9.0.0 - */ -class AssignmentOrderSniff extends Sniff -{ - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 9.0.0 - * - * @return array - */ - public function register() - { - return array( - \T_LIST, - \T_OPEN_SHORT_ARRAY, - ); - } - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 9.0.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void|int Void if not a valid list. If a list construct has been - * examined, the stack pointer to the list closer to skip - * passed any nested lists which don't need to be examined again. - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsAbove('7.0') === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['code'] === \T_OPEN_SHORT_ARRAY - && $this->isShortList($phpcsFile, $stackPtr) === false - ) { - // Short array, not short list. - return; - } - - if ($tokens[$stackPtr]['code'] === \T_LIST) { - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($nextNonEmpty === false - || $tokens[$nextNonEmpty]['code'] !== \T_OPEN_PARENTHESIS - || isset($tokens[$nextNonEmpty]['parenthesis_closer']) === false - ) { - // Parse error or live coding. - return; - } - - $opener = $nextNonEmpty; - $closer = $tokens[$nextNonEmpty]['parenthesis_closer']; - } else { - // Short list syntax. - $opener = $stackPtr; - - if (isset($tokens[$stackPtr]['bracket_closer'])) { - $closer = $tokens[$stackPtr]['bracket_closer']; - } - } - - if (isset($opener, $closer) === false) { - return; - } - - /* - * OK, so we have the opener & closer, now we need to check all the variables in the - * list() to see if there are duplicates as that's the problem. - */ - $hasVars = $phpcsFile->findNext(array(\T_VARIABLE, \T_DOLLAR), ($opener + 1), $closer); - if ($hasVars === false) { - // Empty list, not our concern. - return ($closer + 1); - } - - // Set the variable delimiters based on the list type being examined. - $stopPoints = array(\T_COMMA); - if ($tokens[$stackPtr]['code'] === \T_OPEN_SHORT_ARRAY) { - $stopPoints[] = \T_CLOSE_SHORT_ARRAY; - } else { - $stopPoints[] = \T_CLOSE_PARENTHESIS; - } - - $listVars = array(); - $lastStopPoint = $opener; - - /* - * Create a list of all variables used within the `list()` construct. - * We're not concerned with whether these are nested or not, as any duplicate - * variable name used will be problematic, independent of nesting. - */ - do { - $nextStopPoint = $phpcsFile->findNext($stopPoints, ($lastStopPoint + 1), $closer); - if ($nextStopPoint === false) { - $nextStopPoint = $closer; - } - - // Also detect this in PHP 7.1 keyed lists. - $hasDoubleArrow = $phpcsFile->findNext(\T_DOUBLE_ARROW, ($lastStopPoint + 1), $nextStopPoint); - if ($hasDoubleArrow !== false) { - $lastStopPoint = $hasDoubleArrow; - } - - // Find the start of the variable, allowing for variable variables. - $nextStartPoint = $phpcsFile->findNext(array(\T_VARIABLE, \T_DOLLAR), ($lastStopPoint + 1), $nextStopPoint); - if ($nextStartPoint === false) { - // Skip past empty bits in the list, i.e. `list( $a, , ,)`. - $lastStopPoint = $nextStopPoint; - continue; - } - - /* - * Gather the content of all non-empty tokens to determine the "variable name". - * Variable name in this context includes array or object property syntaxes, such - * as `$a['name']` and `$b->property`. - */ - $varContent = ''; - - for ($i = $nextStartPoint; $i < $nextStopPoint; $i++) { - if (isset(Tokens::$emptyTokens[$tokens[$i]['code']])) { - continue; - } - - $varContent .= $tokens[$i]['content']; - } - - if ($varContent !== '') { - $listVars[] = $varContent; - } - - $lastStopPoint = $nextStopPoint; - - } while ($lastStopPoint < $closer); - - if (empty($listVars)) { - // Shouldn't be possible, but just in case. - return ($closer + 1); - } - - // Verify that all variables used in the list() construct are unique. - if (\count($listVars) !== \count(array_unique($listVars))) { - $phpcsFile->addError( - 'list() will assign variable from left-to-right since PHP 7.0. Ensure all variables in list() are unique to prevent unexpected results.', - $stackPtr, - 'Affected' - ); - } - - return ($closer + 1); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Lists/ForbiddenEmptyListAssignmentSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Lists/ForbiddenEmptyListAssignmentSniff.php deleted file mode 100644 index b9d4b7b..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Lists/ForbiddenEmptyListAssignmentSniff.php +++ /dev/null @@ -1,116 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Lists; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Support for empty `list()` expressions has been removed in PHP 7.0. - * - * PHP version 7.0 - * - * @link https://www.php.net/manual/en/migration70.incompatible.php#migration70.incompatible.variable-handling.list.empty - * @link https://wiki.php.net/rfc/abstract_syntax_tree#changes_to_list - * @link https://www.php.net/manual/en/function.list.php - * - * @since 7.0.0 - */ -class ForbiddenEmptyListAssignmentSniff extends Sniff -{ - - /** - * List of tokens to disregard when determining whether the list() is empty. - * - * @since 7.0.3 - * - * @var array - */ - protected $ignoreTokens = array(); - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 7.0.0 - * - * @return array - */ - public function register() - { - // Set up a list of tokens to disregard when determining whether the list() is empty. - // Only needs to be set up once. - $this->ignoreTokens = Tokens::$emptyTokens; - $this->ignoreTokens[\T_COMMA] = \T_COMMA; - $this->ignoreTokens[\T_OPEN_PARENTHESIS] = \T_OPEN_PARENTHESIS; - $this->ignoreTokens[\T_CLOSE_PARENTHESIS] = \T_CLOSE_PARENTHESIS; - - return array( - \T_LIST, - \T_OPEN_SHORT_ARRAY, - ); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 7.0.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsAbove('7.0') === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['code'] === \T_OPEN_SHORT_ARRAY) { - if ($this->isShortList($phpcsFile, $stackPtr) === false) { - return; - } - - $open = $stackPtr; - $close = $tokens[$stackPtr]['bracket_closer']; - } else { - // T_LIST. - $open = $phpcsFile->findNext(\T_OPEN_PARENTHESIS, $stackPtr, null, false, null, true); - if ($open === false || isset($tokens[$open]['parenthesis_closer']) === false) { - return; - } - - $close = $tokens[$open]['parenthesis_closer']; - } - - $error = true; - if (($close - $open) > 1) { - for ($cnt = $open + 1; $cnt < $close; $cnt++) { - if (isset($this->ignoreTokens[$tokens[$cnt]['code']]) === false) { - $error = false; - break; - } - } - } - - if ($error === true) { - $phpcsFile->addError( - 'Empty list() assignments are not allowed since PHP 7.0', - $stackPtr, - 'Found' - ); - } - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Lists/NewKeyedListSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Lists/NewKeyedListSniff.php deleted file mode 100644 index 7111b12..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Lists/NewKeyedListSniff.php +++ /dev/null @@ -1,227 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Lists; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Since PHP 7.1, you can specify keys in `list()`, or its new shorthand `[]` syntax. - * - * PHP version 7.1 - * - * @link https://wiki.php.net/rfc/list_keys - * @link https://www.php.net/manual/en/function.list.php - * - * @since 9.0.0 - */ -class NewKeyedListSniff extends Sniff -{ - /** - * Tokens which represent the start of a list construct. - * - * @since 9.0.0 - * - * @var array - */ - protected $sniffTargets = array( - \T_LIST => \T_LIST, - \T_OPEN_SHORT_ARRAY => \T_OPEN_SHORT_ARRAY, - ); - - /** - * The token(s) within the list construct which is being targeted. - * - * @since 9.0.0 - * - * @var array - */ - protected $targetsInList = array( - \T_DOUBLE_ARROW => \T_DOUBLE_ARROW, - ); - - /** - * All tokens needed to walk through the list construct and - * determine whether the target token is contained within. - * - * Set by the setUpAllTargets() method which is called from within register(). - * - * @since 9.0.0 - * - * @var array - */ - protected $allTargets; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 9.0.0 - * - * @return array - */ - public function register() - { - $this->setUpAllTargets(); - - return $this->sniffTargets; - } - - /** - * Prepare the $allTargets array only once. - * - * @since 9.0.0 - * - * @return void - */ - public function setUpAllTargets() - { - $this->allTargets = $this->sniffTargets + $this->targetsInList; - } - - /** - * Do a version check to determine if this sniff needs to run at all. - * - * @since 9.0.0 - * - * @return bool - */ - protected function bowOutEarly() - { - return ($this->supportsBelow('7.0') === false); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 9.0.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->bowOutEarly() === true) { - return; - } - - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['code'] === \T_OPEN_SHORT_ARRAY - && $this->isShortList($phpcsFile, $stackPtr) === false - ) { - // Short array, not short list. - return; - } - - if ($tokens[$stackPtr]['code'] === \T_LIST) { - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($nextNonEmpty === false - || $tokens[$nextNonEmpty]['code'] !== \T_OPEN_PARENTHESIS - || isset($tokens[$nextNonEmpty]['parenthesis_closer']) === false - ) { - // Parse error or live coding. - return; - } - - $opener = $nextNonEmpty; - $closer = $tokens[$nextNonEmpty]['parenthesis_closer']; - } else { - // Short list syntax. - $opener = $stackPtr; - - if (isset($tokens[$stackPtr]['bracket_closer'])) { - $closer = $tokens[$stackPtr]['bracket_closer']; - } - } - - if (isset($opener, $closer) === false) { - return; - } - - $this->examineList($phpcsFile, $opener, $closer); - } - - - /** - * Examine the contents of a list construct to determine whether an error needs to be thrown. - * - * @since 9.0.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $opener The position of the list open token. - * @param int $closer The position of the list close token. - * - * @return void - */ - protected function examineList(File $phpcsFile, $opener, $closer) - { - $start = $opener; - while (($start = $this->hasTargetInList($phpcsFile, $start, $closer)) !== false) { - $phpcsFile->addError( - 'Specifying keys in list constructs is not supported in PHP 7.0 or earlier.', - $start, - 'Found' - ); - } - } - - - /** - * Check whether a certain target token exists within a list construct. - * - * Skips past nested list constructs, so these can be examined based on their own token. - * - * @since 9.0.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $start The position of the list open token or a token - * within the list to start (resume) the examination from. - * @param int $closer The position of the list close token. - * - * @return int|bool Stack pointer to the target token if encountered. False otherwise. - */ - protected function hasTargetInList(File $phpcsFile, $start, $closer) - { - $tokens = $phpcsFile->getTokens(); - - for ($i = ($start + 1); $i < $closer; $i++) { - if (isset($this->allTargets[$tokens[$i]['code']]) === false) { - continue; - } - - if (isset($this->targetsInList[$tokens[$i]['code']]) === true) { - return $i; - } - - // Skip past nested list constructs. - if ($tokens[$i]['code'] === \T_LIST) { - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($i + 1), null, true); - if ($nextNonEmpty !== false - && $tokens[$nextNonEmpty]['code'] === \T_OPEN_PARENTHESIS - && isset($tokens[$nextNonEmpty]['parenthesis_closer']) === true - ) { - $i = $tokens[$nextNonEmpty]['parenthesis_closer']; - } - } elseif ($tokens[$i]['code'] === \T_OPEN_SHORT_ARRAY - && isset($tokens[$i]['bracket_closer']) - ) { - $i = $tokens[$i]['bracket_closer']; - } - } - - return false; - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Lists/NewListReferenceAssignmentSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Lists/NewListReferenceAssignmentSniff.php deleted file mode 100644 index ebcd7c8..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Lists/NewListReferenceAssignmentSniff.php +++ /dev/null @@ -1,74 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Lists; - -use PHPCompatibility\Sniffs\Lists\NewKeyedListSniff; -use PHP_CodeSniffer_File as File; - -/** - * Detect reference assignments in array destructuring using (short) list. - * - * PHP version 7.3 - * - * @link https://www.php.net/manual/en/migration73.new-features.php#migration73.new-features.core.destruct-reference - * @link https://wiki.php.net/rfc/list_reference_assignment - * @link https://www.php.net/manual/en/function.list.php - * - * @since 9.0.0 - */ -class NewListReferenceAssignmentSniff extends NewKeyedListSniff -{ - /** - * The token(s) within the list construct which is being targeted. - * - * @since 9.0.0 - * - * @var array - */ - protected $targetsInList = array( - \T_BITWISE_AND => \T_BITWISE_AND, - ); - - /** - * Do a version check to determine if this sniff needs to run at all. - * - * @since 9.0.0 - * - * @return bool - */ - protected function bowOutEarly() - { - return ($this->supportsBelow('7.2') === false); - } - - /** - * Examine the contents of a list construct to determine whether an error needs to be thrown. - * - * @since 9.0.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $opener The position of the list open token. - * @param int $closer The position of the list close token. - * - * @return void - */ - protected function examineList(File $phpcsFile, $opener, $closer) - { - $start = $opener; - while (($start = $this->hasTargetInList($phpcsFile, $start, $closer)) !== false) { - $phpcsFile->addError( - 'Reference assignments within list constructs are not supported in PHP 7.2 or earlier.', - $start, - 'Found' - ); - } - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Lists/NewShortListSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Lists/NewShortListSniff.php deleted file mode 100644 index ee100fb..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Lists/NewShortListSniff.php +++ /dev/null @@ -1,84 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Lists; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; - -/** - * Detect short list syntax for symmetric array destructuring. - * - * "The shorthand array syntax (`[]`) may now be used to destructure arrays for - * assignments (including within `foreach`), as an alternative to the existing - * `list()` syntax, which is still supported." - * - * PHP version 7.1 - * - * @link https://www.php.net/manual/en/migration71.new-features.php#migration71.new-features.symmetric-array-destructuring - * @link https://wiki.php.net/rfc/short_list_syntax - * - * @since 9.0.0 - */ -class NewShortListSniff extends Sniff -{ - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 9.0.0 - * - * @return array - */ - public function register() - { - return array(\T_OPEN_SHORT_ARRAY); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 9.0.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsBelow('7.0') === false) { - return; - } - - if ($this->isShortList($phpcsFile, $stackPtr) === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - $closer = $tokens[$stackPtr]['bracket_closer']; - - $hasVariable = $phpcsFile->findNext(\T_VARIABLE, ($stackPtr + 1), $closer); - if ($hasVariable === false) { - // List syntax is only valid if there are variables in it. - return; - } - - $phpcsFile->addError( - 'The shorthand list syntax "[]" to destructure arrays is not available in PHP 7.0 or earlier.', - $stackPtr, - 'Found' - ); - - return ($closer + 1); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/MethodUse/ForbiddenToStringParametersSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/MethodUse/ForbiddenToStringParametersSniff.php deleted file mode 100644 index d580bac..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/MethodUse/ForbiddenToStringParametersSniff.php +++ /dev/null @@ -1,103 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\MethodUse; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * As of PHP 5.3, the `__toString()` magic method can no longer be passed arguments. - * - * Sister-sniff to `PHPCompatibility.FunctionDeclarations.ForbiddenToStringParameters`. - * - * PHP version 5.3 - * - * @link https://www.php.net/manual/en/migration53.incompatible.php - * @link https://www.php.net/manual/en/language.oop5.magic.php#object.tostring - * - * @since 9.2.0 - */ -class ForbiddenToStringParametersSniff extends Sniff -{ - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 9.2.0 - * - * @return array - */ - public function register() - { - return array( - \T_DOUBLE_COLON, - \T_OBJECT_OPERATOR, - ); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 9.2.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsAbove('5.3') === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($nextNonEmpty === false || $tokens[$nextNonEmpty]['code'] !== \T_STRING) { - /* - * Not a method call. - * - * Note: This disregards method calls with the method name in a variable, like: - * $method = '__toString'; - * $obj->$method(); - * However, that would be very hard to examine reliably anyway. - */ - return; - } - - if (strtolower($tokens[$nextNonEmpty]['content']) !== '__tostring') { - // Not a call to the __toString() method. - return; - } - - $openParens = $phpcsFile->findNext(Tokens::$emptyTokens, ($nextNonEmpty + 1), null, true); - if ($openParens === false || $tokens[$openParens]['code'] !== \T_OPEN_PARENTHESIS) { - // Not a method call. - return; - } - - $closeParens = $phpcsFile->findNext(Tokens::$emptyTokens, ($openParens + 1), null, true); - if ($closeParens === false || $tokens[$closeParens]['code'] === \T_CLOSE_PARENTHESIS) { - // Not a method call. - return; - } - - // If we're still here, then this is a call to the __toString() magic method passing parameters. - $phpcsFile->addError( - 'The __toString() magic method will no longer accept passed arguments since PHP 5.3', - $stackPtr, - 'Passed' - ); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/MethodUse/NewDirectCallsToCloneSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/MethodUse/NewDirectCallsToCloneSniff.php deleted file mode 100644 index 873ef1d..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/MethodUse/NewDirectCallsToCloneSniff.php +++ /dev/null @@ -1,117 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\MethodUse; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Detect direct calls to the `__clone()` magic method, which is allowed since PHP 7.0. - * - * "Doing calls like `$obj->__clone()` is now allowed. This was the only magic method - * that had a compile-time check preventing some calls to it, which doesn't make sense. - * If we allow all other magic methods to be called, there's no reason to forbid this one." - * - * PHP version 7.0 - * - * @link https://wiki.php.net/rfc/abstract_syntax_tree#directly_calling_clone_is_allowed - * @link https://www.php.net/manual/en/language.oop5.cloning.php - * - * @since 9.1.0 - */ -class NewDirectCallsToCloneSniff extends Sniff -{ - - /** - * Tokens which indicate class internal use. - * - * @since 9.3.2 - * - * @var array - */ - protected $classInternal = array( - \T_PARENT => true, - \T_SELF => true, - \T_STATIC => true, - ); - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 9.1.0 - * - * @return array - */ - public function register() - { - return array( - \T_DOUBLE_COLON, - \T_OBJECT_OPERATOR, - ); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 9.1.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsBelow('5.6') === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($nextNonEmpty === false || $tokens[$nextNonEmpty]['code'] !== \T_STRING) { - /* - * Not a method call. - * - * Note: This disregards method calls with the method name in a variable, like: - * $method = '__clone'; - * $obj->$method(); - * However, that would be very hard to examine reliably anyway. - */ - return; - } - - if (strtolower($tokens[$nextNonEmpty]['content']) !== '__clone') { - // Not a call to the __clone() method. - return; - } - - $nextNextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($nextNonEmpty + 1), null, true); - if ($nextNextNonEmpty === false || $tokens[$nextNextNonEmpty]['code'] !== \T_OPEN_PARENTHESIS) { - // Not a method call. - return; - } - - $prevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($prevNonEmpty === false || isset($this->classInternal[$tokens[$prevNonEmpty]['code']])) { - // Class internal call to __clone(). - return; - } - - $phpcsFile->addError( - 'Direct calls to the __clone() magic method are not allowed in PHP 5.6 or earlier.', - $nextNonEmpty, - 'Found' - ); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Miscellaneous/NewPHPOpenTagEOFSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Miscellaneous/NewPHPOpenTagEOFSniff.php deleted file mode 100644 index 85e10bc..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Miscellaneous/NewPHPOpenTagEOFSniff.php +++ /dev/null @@ -1,147 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Miscellaneous; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; - -/** - * PHP 7.4 now supports stand-alone PHP tags at the end of a file (without new line). - * - * > `<?php` at the end of the file (without trailing newline) will now be - * > interpreted as an opening PHP tag. Previously it was interpreted either as - * > `<? php` and resulted in a syntax error (with short_open_tag=1) or was - * > interpreted as a literal `<?php` string (with short_open_tag=0). - * - * {@internal Due to an issue with the Tokenizer, this sniff will not work correctly - * on PHP 5.3 in combination with PHPCS < 2.6.0 when short_open_tag is `On`. - * As this is causing "Undefined offset" notices, there is nothing we can - * do to work-around this.} - * - * PHP version 7.4 - * - * @link https://www.php.net/manual/en/migration74.incompatible.php#migration74.incompatible.core.php-tag - * @link https://github.com/php/php-src/blob/30de357fa14480468132bbc22a272aeb91789ba8/UPGRADING#L37-L40 - * - * @since 9.3.0 - */ -class NewPHPOpenTagEOFSniff extends Sniff -{ - - /** - * Whether or not short open tags is enabled on the install running the sniffs. - * - * @since 9.3.0 - * - * @var bool - */ - protected $shortOpenTags; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 9.3.0 - * - * @return array - */ - public function register() - { - $targets = array( - \T_OPEN_TAG_WITH_ECHO, - ); - - $this->shortOpenTags = (bool) ini_get('short_open_tag'); - if ($this->shortOpenTags === false) { - $targets[] = \T_INLINE_HTML; - } else { - $targets[] = \T_STRING; - } - - if (version_compare(\PHP_VERSION_ID, '70399', '>')) { - $targets[] = \T_OPEN_TAG; - } - - return $targets; - } - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 9.3.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsBelow('7.3') === false) { - return; - } - - if ($stackPtr !== ($phpcsFile->numTokens - 1)) { - // We're only interested in the last token in the file. - return; - } - - $tokens = $phpcsFile->getTokens(); - $contents = $tokens[$stackPtr]['content']; - $error = false; - - switch ($tokens[$stackPtr]['code']) { - case \T_INLINE_HTML: - // PHP < 7.4 with short open tags off. - if ($contents === '<?php') { - $error = true; - } elseif ($contents === '<?=') { - // Also cover short open echo tags in PHP 5.3 with short open tags off. - $error = true; - } - break; - - case \T_STRING: - // PHP < 7.4 with short open tags on. - if ($contents === 'php' - && $tokens[($stackPtr - 1)]['code'] === \T_OPEN_TAG - && $tokens[($stackPtr - 1)]['content'] === '<?' - ) { - $error = true; - } - break; - - case \T_OPEN_TAG_WITH_ECHO: - // PHP 5.4+. - if (rtrim($contents) === '<?=') { - $error = true; - } - break; - - case \T_OPEN_TAG: - // PHP 7.4+. - if ($contents === '<?php') { - $error = true; - } - break; - } - - if ($error === true) { - $phpcsFile->addError( - 'A PHP open tag at the end of a file, without trailing newline, was not supported in PHP 7.3 or earlier and would result in a syntax error or be interpreted as a literal string', - $stackPtr, - 'Found' - ); - } - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Miscellaneous/RemovedAlternativePHPTagsSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Miscellaneous/RemovedAlternativePHPTagsSniff.php deleted file mode 100644 index 47143a3..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Miscellaneous/RemovedAlternativePHPTagsSniff.php +++ /dev/null @@ -1,172 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Miscellaneous; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; - -/** - * Check for use of alternative PHP tags, support for which was removed in PHP 7.0. - * - * {@internal Based on `Generic.PHP.DisallowAlternativePHPTags` by Juliette Reinders Folmer - * (with permission) which was merged into PHPCS 2.7.0.} - * - * PHP version 7.0 - * - * @link https://wiki.php.net/rfc/remove_alternative_php_tags - * @link https://www.php.net/manual/en/language.basic-syntax.phptags.php - * - * @since 7.0.4 - */ -class RemovedAlternativePHPTagsSniff extends Sniff -{ - - /** - * Whether ASP tags are enabled or not. - * - * @since 7.0.4 - * - * @var bool - */ - private $aspTags = false; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 7.0.4 - * - * @return array - */ - public function register() - { - if (version_compare(\PHP_VERSION_ID, '70000', '<') === true) { - // phpcs:ignore PHPCompatibility.IniDirectives.RemovedIniDirectives.asp_tagsRemoved - $this->aspTags = (bool) ini_get('asp_tags'); - } - - return array( - \T_OPEN_TAG, - \T_OPEN_TAG_WITH_ECHO, - \T_INLINE_HTML, - ); - } - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 7.0.4 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsAbove('7.0') === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - $openTag = $tokens[$stackPtr]; - $content = trim($openTag['content']); - - if ($content === '' || $content === '<?php') { - return; - } - - if ($openTag['code'] === \T_OPEN_TAG || $openTag['code'] === \T_OPEN_TAG_WITH_ECHO) { - - if ($content === '<%' || $content === '<%=') { - $data = array( - 'ASP', - $content, - ); - $errorCode = 'ASPOpenTagFound'; - - } elseif (strpos($content, '<script ') !== false) { - $data = array( - 'Script', - $content, - ); - $errorCode = 'ScriptOpenTagFound'; - } else { - return; - } - } - // Account for incorrect script open tags. - // The "(?:<s)?" in the regex is to work-around a bug in the tokenizer in PHP 5.2. - elseif ($openTag['code'] === \T_INLINE_HTML - && preg_match('`((?:<s)?cript (?:[^>]+)?language=[\'"]?php[\'"]?(?:[^>]+)?>)`i', $content, $match) === 1 - ) { - $found = $match[1]; - $data = array( - 'Script', - $found, - ); - $errorCode = 'ScriptOpenTagFound'; - } - - if (isset($errorCode, $data)) { - $phpcsFile->addError( - '%s style opening tags have been removed in PHP 7.0. Found "%s"', - $stackPtr, - $errorCode, - $data - ); - return; - } - - // If we're still here, we can't be sure if what we found was really intended as ASP open tags. - if ($openTag['code'] === \T_INLINE_HTML && $this->aspTags === false) { - if (strpos($content, '<%') !== false) { - $error = 'Possible use of ASP style opening tags detected. ASP style opening tags have been removed in PHP 7.0. Found: %s'; - $snippet = $this->getSnippet($content, '<%'); - $data = array('<%' . $snippet); - - $phpcsFile->addWarning($error, $stackPtr, 'MaybeASPOpenTagFound', $data); - } - } - } - - - /** - * Get a snippet from a HTML token. - * - * @since 7.0.4 - * - * @param string $content The content of the HTML token. - * @param string $startAt Partial string to use as a starting point for the snippet. - * @param int $length The target length of the snippet to get. Defaults to 25. - * - * @return string - */ - protected function getSnippet($content, $startAt = '', $length = 25) - { - $startPos = 0; - - if ($startAt !== '') { - $startPos = strpos($content, $startAt); - if ($startPos !== false) { - $startPos += \strlen($startAt); - } - } - - $snippet = substr($content, $startPos, $length); - if ((\strlen($content) - $startPos) > $length) { - $snippet .= '...'; - } - - return $snippet; - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Miscellaneous/ValidIntegersSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Miscellaneous/ValidIntegersSniff.php deleted file mode 100644 index 53dce43..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Miscellaneous/ValidIntegersSniff.php +++ /dev/null @@ -1,250 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Miscellaneous; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; - -/** - * Check for valid integer types and values. - * - * Checks: - * - PHP 5.4 introduced binary integers. - * - PHP 7.0 removed tolerance for invalid octals. These were truncated prior to PHP 7 - * and give a parse error since PHP 7. - * - PHP 7.0 removed support for recognizing hexadecimal numeric strings as numeric. - * Type juggling and recognition was inconsistent prior to PHP 7. As of PHP 7, they - * are no longer treated as numeric. - * - * PHP version 5.4+ - * - * @link https://wiki.php.net/rfc/binnotation4ints - * @link https://wiki.php.net/rfc/remove_hex_support_in_numeric_strings - * @link https://www.php.net/manual/en/language.types.integer.php - * - * @since 7.0.3 - * @since 7.0.8 This sniff now throws a warning instead of an error for invalid binary integers. - */ -class ValidIntegersSniff extends Sniff -{ - - /** - * Whether PHPCS is run on a PHP < 5.4. - * - * @since 7.0.3 - * - * @var bool - */ - protected $isLowPHPVersion = false; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 7.0.3 - * - * @return array - */ - public function register() - { - $this->isLowPHPVersion = version_compare(\PHP_VERSION_ID, '50400', '<'); - - return array( - \T_LNUMBER, // Binary, octal integers. - \T_CONSTANT_ENCAPSED_STRING, // Hex numeric string. - ); - } - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 7.0.3 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $token = $tokens[$stackPtr]; - - if ($this->couldBeBinaryInteger($tokens, $stackPtr) === true) { - if ($this->supportsBelow('5.3')) { - $error = 'Binary integer literals were not present in PHP version 5.3 or earlier. Found: %s'; - if ($this->isLowPHPVersion === false) { - $data = array($token['content']); - } else { - $data = array($this->getBinaryInteger($phpcsFile, $tokens, $stackPtr)); - } - $phpcsFile->addError($error, $stackPtr, 'BinaryIntegerFound', $data); - } - - if ($this->isInvalidBinaryInteger($tokens, $stackPtr) === true) { - $error = 'Invalid binary integer detected. Found: %s'; - $data = array($this->getBinaryInteger($phpcsFile, $tokens, $stackPtr)); - $phpcsFile->addWarning($error, $stackPtr, 'InvalidBinaryIntegerFound', $data); - } - return; - } - - $isError = $this->supportsAbove('7.0'); - $data = array( $token['content'] ); - - if ($this->isInvalidOctalInteger($tokens, $stackPtr) === true) { - $this->addMessage( - $phpcsFile, - 'Invalid octal integer detected. Prior to PHP 7 this would lead to a truncated number. From PHP 7 onwards this causes a parse error. Found: %s', - $stackPtr, - $isError, - 'InvalidOctalIntegerFound', - $data - ); - return; - } - - if ($this->isHexidecimalNumericString($tokens, $stackPtr) === true) { - $this->addMessage( - $phpcsFile, - 'The behaviour of hexadecimal numeric strings was inconsistent prior to PHP 7 and support has been removed in PHP 7. Found: %s', - $stackPtr, - $isError, - 'HexNumericStringFound', - $data - ); - return; - } - } - - - /** - * Could the current token potentially be a binary integer ? - * - * @since 7.0.3 - * - * @param array $tokens Token stack. - * @param int $stackPtr The current position in the token stack. - * - * @return bool - */ - private function couldBeBinaryInteger($tokens, $stackPtr) - { - $token = $tokens[$stackPtr]; - - if ($token['code'] !== \T_LNUMBER) { - return false; - } - - if ($this->isLowPHPVersion === false) { - return (preg_match('`^0b[0-1]+$`iD', $token['content']) === 1); - } - // Pre-5.4, binary strings are tokenized as T_LNUMBER (0) + T_STRING ("b01010101"). - // At this point, we don't yet care whether it's a valid binary int, that's a separate check. - else { - return($token['content'] === '0' && $tokens[$stackPtr + 1]['code'] === \T_STRING && preg_match('`^b[0-9]+$`iD', $tokens[$stackPtr + 1]['content']) === 1); - } - } - - /** - * Is the current token an invalid binary integer ? - * - * @since 7.0.3 - * - * @param array $tokens Token stack. - * @param int $stackPtr The current position in the token stack. - * - * @return bool - */ - private function isInvalidBinaryInteger($tokens, $stackPtr) - { - if ($this->couldBeBinaryInteger($tokens, $stackPtr) === false) { - return false; - } - - if ($this->isLowPHPVersion === false) { - // If it's an invalid binary int, the token will be split into two T_LNUMBER tokens. - return ($tokens[$stackPtr + 1]['code'] === \T_LNUMBER); - } else { - return (preg_match('`^b[0-1]+$`iD', $tokens[$stackPtr + 1]['content']) === 0); - } - } - - /** - * Retrieve the content of the tokens which together look like a binary integer. - * - * @since 7.0.3 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param array $tokens Token stack. - * @param int $stackPtr The position of the current token in - * the stack. - * - * @return string - */ - private function getBinaryInteger(File $phpcsFile, $tokens, $stackPtr) - { - $length = 2; // PHP < 5.4 T_LNUMBER + T_STRING. - - if ($this->isLowPHPVersion === false) { - $i = $stackPtr; - while ($tokens[$i]['code'] === \T_LNUMBER) { - $i++; - } - $length = ($i - $stackPtr); - } - - return $phpcsFile->getTokensAsString($stackPtr, $length); - } - - /** - * Is the current token an invalid octal integer ? - * - * @since 7.0.3 - * - * @param array $tokens Token stack. - * @param int $stackPtr The current position in the token stack. - * - * @return bool - */ - private function isInvalidOctalInteger($tokens, $stackPtr) - { - $token = $tokens[$stackPtr]; - - if ($token['code'] === \T_LNUMBER && preg_match('`^0[0-7]*[8-9]+[0-9]*$`D', $token['content']) === 1) { - return true; - } - - return false; - } - - /** - * Is the current token a hexidecimal numeric string ? - * - * @since 7.0.3 - * - * @param array $tokens Token stack. - * @param int $stackPtr The current position in the token stack. - * - * @return bool - */ - private function isHexidecimalNumericString($tokens, $stackPtr) - { - $token = $tokens[$stackPtr]; - - if ($token['code'] === \T_CONSTANT_ENCAPSED_STRING && preg_match('`^0x[a-f0-9]+$`iD', $this->stripQuotes($token['content'])) === 1) { - return true; - } - - return false; - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Operators/ChangedConcatOperatorPrecedenceSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Operators/ChangedConcatOperatorPrecedenceSniff.php deleted file mode 100644 index 3dfe738..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Operators/ChangedConcatOperatorPrecedenceSniff.php +++ /dev/null @@ -1,199 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Operators; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Detect code affected by the change in operator precedence of concatenation in PHP 8.0. - * - * In PHP < 8.0 the operator precedence of `.`, `+` and `-` are the same. - * As of PHP 8.0, the operator precedence of the concatenation operator will be - * lowered to be right below the `<<` and `>>` operators. - * - * As of PHP 7.4, a deprecation warning will be thrown upon encountering an - * unparenthesized expression containing an `.` before a `+` or `-`. - * - * PHP version 7.4 - * PHP version 8.0 - * - * @link https://wiki.php.net/rfc/concatenation_precedence - * @link https://www.php.net/manual/en/language.operators.precedence.php - * - * @since 9.2.0 - */ -class ChangedConcatOperatorPrecedenceSniff extends Sniff -{ - - /** - * List of tokens with a lower operator precedence than concatenation in PHP >= 8.0. - * - * @since 9.2.0 - * - * @var array - */ - private $tokensWithLowerPrecedence = array( - 'T_BITWISE_AND' => true, - 'T_BITWISE_XOR' => true, - 'T_BITWISE_OR' => true, - 'T_COALESCE' => true, - 'T_INLINE_THEN' => true, - 'T_INLINE_ELSE' => true, - 'T_YIELD_FROM' => true, - 'T_YIELD' => true, - ); - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 9.2.0 - * - * @return array - */ - public function register() - { - return array( - \T_PLUS, - \T_MINUS, - ); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 9.2.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsAbove('7.4') === false) { - return; - } - - if ($this->isUnaryPlusMinus($phpcsFile, $stackPtr) === true) { - return; - } - - $tokens = $phpcsFile->getTokens(); - - for ($i = ($stackPtr - 1); $stackPtr >= 0; $i--) { - if ($tokens[$i]['code'] === \T_STRING_CONCAT) { - // Found one. - break; - } - - if ($tokens[$i]['code'] === \T_SEMICOLON - || $tokens[$i]['code'] === \T_OPEN_CURLY_BRACKET - || $tokens[$i]['code'] === \T_OPEN_TAG - || $tokens[$i]['code'] === \T_OPEN_TAG_WITH_ECHO - || $tokens[$i]['code'] === \T_COMMA - || $tokens[$i]['code'] === \T_COLON - || $tokens[$i]['code'] === \T_CASE - ) { - // If we reached any of the above tokens, we've reached the end of - // the statement without encountering a concatenation operator. - return; - } - - if ($tokens[$i]['code'] === \T_OPEN_CURLY_BRACKET - && isset($tokens[$i]['bracket_closer']) - && $tokens[$i]['bracket_closer'] > $stackPtr - ) { - // No need to look any further, this is plus/minus within curly braces - // and we've reached the open curly. - return; - } - - if ($tokens[$i]['code'] === \T_OPEN_PARENTHESIS - && isset($tokens[$i]['parenthesis_closer']) - && $tokens[$i]['parenthesis_closer'] > $stackPtr - ) { - // No need to look any further, this is plus/minus within parenthesis - // and we've reached the open parenthesis. - return; - } - - if (($tokens[$i]['code'] === \T_OPEN_SHORT_ARRAY - || $tokens[$i]['code'] === \T_OPEN_SQUARE_BRACKET) - && isset($tokens[$i]['bracket_closer']) - && $tokens[$i]['bracket_closer'] > $stackPtr - ) { - // No need to look any further, this is plus/minus within a short array - // or array key square brackets and we've reached the opener. - return; - } - - if ($tokens[$i]['code'] === \T_CLOSE_CURLY_BRACKET) { - if (isset($tokens[$i]['scope_owner'])) { - // Different scope, we've passed the start of the statement. - return; - } - - if (isset($tokens[$i]['bracket_opener'])) { - $i = $tokens[$i]['bracket_opener']; - } - - continue; - } - - if ($tokens[$i]['code'] === \T_CLOSE_PARENTHESIS - && isset($tokens[$i]['parenthesis_opener']) - ) { - // Skip over statements in parenthesis, including long arrays. - $i = $tokens[$i]['parenthesis_opener']; - continue; - } - - if (($tokens[$i]['code'] === \T_CLOSE_SQUARE_BRACKET - || $tokens[$i]['code'] === \T_CLOSE_SHORT_ARRAY) - && isset($tokens[$i]['bracket_opener']) - ) { - // Skip over array keys and short arrays. - $i = $tokens[$i]['bracket_opener']; - continue; - } - - // Check for chain being broken by a token with a lower precedence. - if (isset(Tokens::$booleanOperators[$tokens[$i]['code']]) === true - || isset(Tokens::$assignmentTokens[$tokens[$i]['code']]) === true - ) { - return; - } - - if (isset($this->tokensWithLowerPrecedence[$tokens[$i]['type']]) === true) { - if ($tokens[$i]['code'] === \T_BITWISE_AND - && $phpcsFile->isReference($i) === true - ) { - continue; - } - - return; - } - } - - $message = 'Using an unparenthesized expression containing a "." before a "+" or "-" has been deprecated in PHP 7.4'; - $isError = false; - if ($this->supportsAbove('8.0') === true) { - $message .= ' and removed in PHP 8.0'; - $isError = true; - } - - $this->addMessage($phpcsFile, $message, $i, $isError); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Operators/ForbiddenNegativeBitshiftSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Operators/ForbiddenNegativeBitshiftSniff.php deleted file mode 100644 index 740e7df..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Operators/ForbiddenNegativeBitshiftSniff.php +++ /dev/null @@ -1,109 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Operators; - -use PHPCompatibility\Sniff; -use PHPCompatibility\PHPCSHelper; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Bitwise shifts by negative number will throw an ArithmeticError since PHP 7.0. - * - * PHP version 7.0 - * - * @link https://wiki.php.net/rfc/integer_semantics - * @link https://www.php.net/manual/en/migration70.incompatible.php#migration70.incompatible.integers.negative-bitshift - * - * @since 7.0.0 - */ -class ForbiddenNegativeBitshiftSniff extends Sniff -{ - /** - * Potential end tokens for which the end pointer has to be set back by one. - * - * {@internal The PHPCS `findEndOfStatement()` method is not completely consistent - * in how it returns the statement end. This is just a simple way to bypass - * the inconsistency for our purposes.} - * - * @since 8.2.0 - * - * @var array - */ - private $inclusiveStopPoints = array( - \T_COLON => true, - \T_COMMA => true, - \T_DOUBLE_ARROW => true, - \T_SEMICOLON => true, - ); - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 7.0.0 - * @since 8.2.0 Now registers all bitshift tokens, not just bitshift right (`T_SR`). - * - * @return array - */ - public function register() - { - return array( - \T_SL, - \T_SL_EQUAL, - \T_SR, - \T_SR_EQUAL, - ); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 7.0.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsAbove('7.0') === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - - // Determine the start and end of the part of the statement we need to examine. - $start = ($stackPtr + 1); - $next = $phpcsFile->findNext(Tokens::$emptyTokens, $start, null, true); - if ($next !== false && $tokens[$next]['code'] === \T_OPEN_PARENTHESIS) { - $start = ($next + 1); - } - - $end = PHPCSHelper::findEndOfStatement($phpcsFile, $start); - if (isset($this->inclusiveStopPoints[$tokens[$end]['code']]) === true) { - --$end; - } - - if ($this->isNegativeNumber($phpcsFile, $start, $end, true) !== true) { - // Not a negative number or undetermined. - return; - } - - $phpcsFile->addError( - 'Bitwise shifts by negative number will throw an ArithmeticError in PHP 7.0. Found: %s', - $stackPtr, - 'Found', - array($phpcsFile->getTokensAsString($start, ($end - $start + 1))) - ); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Operators/NewOperatorsSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Operators/NewOperatorsSniff.php deleted file mode 100644 index 7c50ad8..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Operators/NewOperatorsSniff.php +++ /dev/null @@ -1,317 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Operators; - -use PHPCompatibility\AbstractNewFeatureSniff; -use PHP_CodeSniffer_File as File; - -/** - * Detect use of new PHP operators. - * - * PHP version All - * - * @link https://wiki.php.net/rfc/pow-operator - * @link https://wiki.php.net/rfc/combined-comparison-operator - * @link https://wiki.php.net/rfc/isset_ternary - * @link https://wiki.php.net/rfc/null_coalesce_equal_operator - * - * @since 9.0.0 Detection of new operators was originally included in the - * `NewLanguageConstruct` sniff (since 5.6). - */ -class NewOperatorsSniff extends AbstractNewFeatureSniff -{ - - /** - * A list of new operators, not present in older versions. - * - * The array lists : version number with false (not present) or true (present). - * If's sufficient to list the first version where the operator appears. - * - * @since 5.6 - * - * @var array(string => array(string => bool|string)) - */ - protected $newOperators = array( - 'T_POW' => array( - '5.5' => false, - '5.6' => true, - 'description' => 'power operator (**)', - ), // Identified in PHP < 5.6 icw PHPCS < 2.4.0 as T_MULTIPLY + T_MULTIPLY. - 'T_POW_EQUAL' => array( - '5.5' => false, - '5.6' => true, - 'description' => 'power assignment operator (**=)', - ), // Identified in PHP < 5.6 icw PHPCS < 2.6.0 as T_MULTIPLY + T_MUL_EQUAL. - 'T_SPACESHIP' => array( - '5.6' => false, - '7.0' => true, - 'description' => 'spaceship operator (<=>)', - ), // Identified in PHP < 7.0 icw PHPCS < 2.5.1 as T_IS_SMALLER_OR_EQUAL + T_GREATER_THAN. - 'T_COALESCE' => array( - '5.6' => false, - '7.0' => true, - 'description' => 'null coalescing operator (??)', - ), // Identified in PHP < 7.0 icw PHPCS < 2.6.2 as T_INLINE_THEN + T_INLINE_THEN. - 'T_COALESCE_EQUAL' => array( - '7.3' => false, - '7.4' => true, - 'description' => 'null coalesce equal operator (??=)', - ), // Identified in PHP < 7.0 icw PHPCS < 2.6.2 as T_INLINE_THEN + T_INLINE_THEN + T_EQUAL and between PHPCS 2.6.2 and PHPCS 2.8.1 as T_COALESCE + T_EQUAL. - ); - - - /** - * A list of new operators which are not recognized in older PHPCS versions. - * - * The array lists an alternative token to listen for. - * - * @since 7.0.3 - * - * @var array(string => int) - */ - protected $newOperatorsPHPCSCompat = array( - 'T_POW' => \T_MULTIPLY, - 'T_POW_EQUAL' => \T_MUL_EQUAL, - 'T_SPACESHIP' => \T_GREATER_THAN, - 'T_COALESCE' => \T_INLINE_THEN, - 'T_COALESCE_EQUAL' => \T_EQUAL, - ); - - /** - * Token translation table for older PHPCS versions. - * - * The 'before' index lists the token which would have to be directly before the - * token found for it to be one of the new operators. - * The 'real_token' index indicates which operator was found in that case. - * - * If the token combination has multi-layer complexity, such as is the case - * with T_COALESCE(_EQUAL), a 'callback' index is added instead pointing to a - * separate function which can determine whether this is the targetted token across - * PHP and PHPCS versions. - * - * {@internal 'before' was chosen rather than 'after' as that allowed for a 1-on-1 - * translation list with the current tokens.} - * - * @since 7.0.3 - * - * @var array(string => array(string => string)) - */ - protected $PHPCSCompatTranslate = array( - 'T_MULTIPLY' => array( - 'before' => 'T_MULTIPLY', - 'real_token' => 'T_POW', - ), - 'T_MUL_EQUAL' => array( - 'before' => 'T_MULTIPLY', - 'real_token' => 'T_POW_EQUAL', - ), - 'T_GREATER_THAN' => array( - 'before' => 'T_IS_SMALLER_OR_EQUAL', - 'real_token' => 'T_SPACESHIP', - ), - 'T_INLINE_THEN' => array( - 'callback' => 'isTCoalesce', - 'real_token' => 'T_COALESCE', - ), - 'T_EQUAL' => array( - 'callback' => 'isTCoalesceEqual', - 'real_token' => 'T_COALESCE_EQUAL', - ), - ); - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 5.6 - * - * @return array - */ - public function register() - { - $tokens = array(); - foreach ($this->newOperators as $token => $versions) { - if (\defined($token)) { - $tokens[] = constant($token); - } elseif (isset($this->newOperatorsPHPCSCompat[$token])) { - $tokens[] = $this->newOperatorsPHPCSCompat[$token]; - } - } - return $tokens; - } - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 5.6 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $tokenType = $tokens[$stackPtr]['type']; - - // Translate older PHPCS token combis for new operators to the actual operator. - if (isset($this->newOperators[$tokenType]) === false) { - if (isset($this->PHPCSCompatTranslate[$tokenType]) - && ((isset($this->PHPCSCompatTranslate[$tokenType]['before'], $tokens[$stackPtr - 1]) === true - && $tokens[$stackPtr - 1]['type'] === $this->PHPCSCompatTranslate[$tokenType]['before']) - || (isset($this->PHPCSCompatTranslate[$tokenType]['callback']) === true - && \call_user_func(array($this, $this->PHPCSCompatTranslate[$tokenType]['callback']), $tokens, $stackPtr) === true)) - ) { - $tokenType = $this->PHPCSCompatTranslate[$tokenType]['real_token']; - } - } elseif ($tokenType === 'T_COALESCE') { - // Make sure that T_COALESCE is not confused with T_COALESCE_EQUAL. - if (isset($tokens[($stackPtr + 1)]) !== false && $tokens[($stackPtr + 1)]['code'] === \T_EQUAL) { - // Ignore as will be dealt with via the T_EQUAL token. - return; - } - } - - // If the translation did not yield one of the tokens we are looking for, bow out. - if (isset($this->newOperators[$tokenType]) === false) { - return; - } - - $itemInfo = array( - 'name' => $tokenType, - ); - $this->handleFeature($phpcsFile, $stackPtr, $itemInfo); - } - - - /** - * Get the relevant sub-array for a specific item from a multi-dimensional array. - * - * @since 7.1.0 - * - * @param array $itemInfo Base information about the item. - * - * @return array Version and other information about the item. - */ - public function getItemArray(array $itemInfo) - { - return $this->newOperators[$itemInfo['name']]; - } - - - /** - * Get an array of the non-PHP-version array keys used in a sub-array. - * - * @since 7.1.0 - * - * @return array - */ - protected function getNonVersionArrayKeys() - { - return array('description'); - } - - - /** - * Retrieve the relevant detail (version) information for use in an error message. - * - * @since 7.1.0 - * - * @param array $itemArray Version and other information about the item. - * @param array $itemInfo Base information about the item. - * - * @return array - */ - public function getErrorInfo(array $itemArray, array $itemInfo) - { - $errorInfo = parent::getErrorInfo($itemArray, $itemInfo); - $errorInfo['description'] = $itemArray['description']; - - return $errorInfo; - } - - - /** - * Filter the error data before it's passed to PHPCS. - * - * @since 7.1.0 - * - * @param array $data The error data array which was created. - * @param array $itemInfo Base information about the item this error message applies to. - * @param array $errorInfo Detail information about an item this error message applies to. - * - * @return array - */ - protected function filterErrorData(array $data, array $itemInfo, array $errorInfo) - { - $data[0] = $errorInfo['description']; - return $data; - } - - - /** - * Callback function to determine whether a T_EQUAL token is really a T_COALESCE_EQUAL token. - * - * @since 7.1.2 - * - * @param array $tokens The token stack. - * @param int $stackPtr The current position in the token stack. - * - * @return bool - */ - private function isTCoalesceEqual($tokens, $stackPtr) - { - if ($tokens[$stackPtr]['code'] !== \T_EQUAL || isset($tokens[($stackPtr - 1)]) === false) { - // Function called for wrong token or token has no predecessor. - return false; - } - - if ($tokens[($stackPtr - 1)]['type'] === 'T_COALESCE') { - return true; - } - if ($tokens[($stackPtr - 1)]['type'] === 'T_INLINE_THEN' - && (isset($tokens[($stackPtr - 2)]) && $tokens[($stackPtr - 2)]['type'] === 'T_INLINE_THEN') - ) { - return true; - } - - return false; - } - - /** - * Callback function to determine whether a T_INLINE_THEN token is really a T_COALESCE token. - * - * @since 7.1.2 - * - * @param array $tokens The token stack. - * @param int $stackPtr The current position in the token stack. - * - * @return bool - */ - private function isTCoalesce($tokens, $stackPtr) - { - if ($tokens[$stackPtr]['code'] !== \T_INLINE_THEN || isset($tokens[($stackPtr - 1)]) === false) { - // Function called for wrong token or token has no predecessor. - return false; - } - - if ($tokens[($stackPtr - 1)]['code'] === \T_INLINE_THEN) { - // Make sure not to confuse it with the T_COALESCE_EQUAL token. - if (isset($tokens[($stackPtr + 1)]) === false || $tokens[($stackPtr + 1)]['code'] !== \T_EQUAL) { - return true; - } - } - - return false; - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Operators/NewShortTernarySniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Operators/NewShortTernarySniff.php deleted file mode 100644 index b65da59..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Operators/NewShortTernarySniff.php +++ /dev/null @@ -1,73 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Operators; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; - -/** - * Detect usage of the short ternary (elvis) operator as introduced in PHP 5.3. - * - * Performs checks on ternary operators, specifically that the middle expression - * is not omitted for versions that don't support this. - * - * PHP version 5.3 - * - * @link https://www.php.net/manual/en/migration53.new-features.php - * @link https://www.php.net/manual/en/language.operators.comparison.php#language.operators.comparison.ternary - * - * @since 7.0.0 - * @since 7.0.8 This sniff now throws an error instead of a warning. - * @since 9.0.0 Renamed from `TernaryOperatorsSniff` to `NewShortTernarySniff`. - */ -class NewShortTernarySniff extends Sniff -{ - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 7.0.0 - * - * @return array - */ - public function register() - { - return array(\T_INLINE_THEN); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 7.0.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsBelow('5.2') === false) { - return; - } - - if ($this->isShortTernary($phpcsFile, $stackPtr) === false) { - return; - } - - $phpcsFile->addError( - 'Middle may not be omitted from ternary operators in PHP < 5.3', - $stackPtr, - 'MiddleMissing' - ); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Operators/RemovedTernaryAssociativitySniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Operators/RemovedTernaryAssociativitySniff.php deleted file mode 100644 index 21eca02..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Operators/RemovedTernaryAssociativitySniff.php +++ /dev/null @@ -1,157 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Operators; - -use PHPCompatibility\Sniff; -use PHPCompatibility\PHPCSHelper; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * The left-associativity of the ternary operator is deprecated in PHP 7.4 and - * removed in PHP 8.0. - * - * PHP version 7.4 - * PHP version 8.0 - * - * @link https://www.php.net/manual/en/migration74.deprecated.php#migration74.deprecated.core.nested-ternary - * @link https://wiki.php.net/rfc/ternary_associativity - * @link https://github.com/php/php-src/pull/4017 - * - * @since 9.2.0 - */ -class RemovedTernaryAssociativitySniff extends Sniff -{ - - /** - * List of tokens with a lower operator precedence than ternary. - * - * @since 9.2.0 - * - * @var array - */ - private $tokensWithLowerPrecedence = array( - 'T_YIELD_FROM' => true, - 'T_YIELD' => true, - 'T_LOGICAL_AND' => true, - 'T_LOGICAL_OR' => true, - 'T_LOGICAL_XOR' => true, - ); - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 9.2.0 - * - * @return array - */ - public function register() - { - return array(\T_INLINE_THEN); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 9.2.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsAbove('7.4') === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - $endOfStatement = PHPCSHelper::findEndOfStatement($phpcsFile, $stackPtr); - if ($tokens[$endOfStatement]['code'] !== \T_SEMICOLON - && $tokens[$endOfStatement]['code'] !== \T_COLON - && $tokens[$endOfStatement]['code'] !== \T_COMMA - && $tokens[$endOfStatement]['code'] !== \T_DOUBLE_ARROW - && $tokens[$endOfStatement]['code'] !== \T_OPEN_TAG - && $tokens[$endOfStatement]['code'] !== \T_CLOSE_TAG - ) { - // End of statement is last non-empty before close brace, so make sure we examine that token too. - ++$endOfStatement; - } - - $ternaryCount = 0; - $elseCount = 0; - $shortTernaryCount = 0; - - // Start at $stackPtr so we don't need duplicate code for short ternary determination. - for ($i = $stackPtr; $i < $endOfStatement; $i++) { - if (($tokens[$i]['code'] === \T_OPEN_SHORT_ARRAY - || $tokens[$i]['code'] === \T_OPEN_SQUARE_BRACKET - || $tokens[$i]['code'] === \T_OPEN_CURLY_BRACKET) - && isset($tokens[$i]['bracket_closer']) - ) { - // Skip over short arrays, array access keys and curlies. - $i = $tokens[$i]['bracket_closer']; - continue; - } - - if ($tokens[$i]['code'] === \T_OPEN_PARENTHESIS - && isset($tokens[$i]['parenthesis_closer']) - ) { - // Skip over anything between parentheses. - $i = $tokens[$i]['parenthesis_closer']; - continue; - } - - // Check for operators with lower operator precedence. - if (isset(Tokens::$assignmentTokens[$tokens[$i]['code']]) - || isset($this->tokensWithLowerPrecedence[$tokens[$i]['code']]) - ) { - break; - } - - if ($tokens[$i]['code'] === \T_INLINE_THEN) { - ++$ternaryCount; - - if ($this->isShortTernary($phpcsFile, $i) === true) { - ++$shortTernaryCount; - } - - continue; - } - - if ($tokens[$i]['code'] === \T_INLINE_ELSE) { - if (($ternaryCount - $elseCount) >= 2) { - // This is the `else` for a ternary in the middle part of a previous ternary. - --$ternaryCount; - } else { - ++$elseCount; - } - continue; - } - } - - if ($ternaryCount > 1 && $ternaryCount === $elseCount && $ternaryCount > $shortTernaryCount) { - $message = 'The left-associativity of the ternary operator has been deprecated in PHP 7.4'; - $isError = false; - if ($this->supportsAbove('8.0') === true) { - $message .= ' and removed in PHP 8.0'; - $isError = true; - } - - $message .= '. Multiple consecutive ternaries detected. Use parenthesis to clarify the order in which the operations should be executed'; - - $this->addMessage($phpcsFile, $message, $stackPtr, $isError); - } - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/ForbiddenGetClassNullSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/ForbiddenGetClassNullSniff.php deleted file mode 100644 index 30452a0..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/ForbiddenGetClassNullSniff.php +++ /dev/null @@ -1,84 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\ParameterValues; - -use PHPCompatibility\AbstractFunctionCallParameterSniff; -use PHP_CodeSniffer_File as File; - -/** - * Detect: Passing `null` to `get_class()` is no longer allowed as of PHP 7.2. - * This will now result in an `E_WARNING` being thrown. - * - * PHP version 7.2 - * - * @link https://wiki.php.net/rfc/get_class_disallow_null_parameter - * @link https://www.php.net/manual/en/function.get-class.php#refsect1-function.get-class-changelog - * - * @since 9.0.0 - */ -class ForbiddenGetClassNullSniff extends AbstractFunctionCallParameterSniff -{ - - /** - * Functions to check for. - * - * @since 9.0.0 - * - * @var array - */ - protected $targetFunctions = array( - 'get_class' => true, - ); - - - /** - * Do a version check to determine if this sniff needs to run at all. - * - * @since 9.0.0 - * - * @return bool - */ - protected function bowOutEarly() - { - return ($this->supportsAbove('7.2') === false); - } - - - /** - * Process the parameters of a matched function. - * - * @since 9.0.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the stack. - * @param string $functionName The token content (function name) which was matched. - * @param array $parameters Array with information about the parameters. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function processParameters(File $phpcsFile, $stackPtr, $functionName, $parameters) - { - if (isset($parameters[1]) === false) { - return; - } - - if ($parameters[1]['raw'] !== 'null') { - return; - } - - $phpcsFile->addError( - 'Passing "null" as the $object to get_class() is not allowed since PHP 7.2.', - $parameters[1]['start'], - 'Found' - ); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/ForbiddenStripTagsSelfClosingXHTMLSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/ForbiddenStripTagsSelfClosingXHTMLSniff.php deleted file mode 100644 index 9ecae5c..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/ForbiddenStripTagsSelfClosingXHTMLSniff.php +++ /dev/null @@ -1,113 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\ParameterValues; - -use PHPCompatibility\AbstractFunctionCallParameterSniff; -use PHP_CodeSniffer_File as File; - -/** - * Since PHP 5.3.4, `strip_tags()` ignores self-closing XHTML tags in allowable_tags - * - * PHP version 5.3.4 - * - * @link https://www.php.net/manual/en/function.strip-tags.php#refsect1-function.strip-tags-changelog - * - * @since 9.3.0 - */ -class ForbiddenStripTagsSelfClosingXHTMLSniff extends AbstractFunctionCallParameterSniff -{ - - /** - * Functions to check for. - * - * @since 9.3.0 - * - * @var array - */ - protected $targetFunctions = array( - 'strip_tags' => true, - ); - - /** - * Text string tokens to examine. - * - * @since 9.3.0 - * - * @var array - */ - private $textStringTokens = array( - \T_CONSTANT_ENCAPSED_STRING => true, - \T_DOUBLE_QUOTED_STRING => true, - \T_INLINE_HTML => true, - \T_HEREDOC => true, - \T_NOWDOC => true, - ); - - - /** - * Do a version check to determine if this sniff needs to run at all. - * - * @since 9.3.0 - * - * @return bool - */ - protected function bowOutEarly() - { - return ($this->supportsAbove('5.4') === false); - } - - - /** - * Process the parameters of a matched function. - * - * @since 9.3.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the stack. - * @param string $functionName The token content (function name) which was matched. - * @param array $parameters Array with information about the parameters. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function processParameters(File $phpcsFile, $stackPtr, $functionName, $parameters) - { - if (isset($parameters[2]) === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - $targetParam = $parameters[2]; - for ($i = $targetParam['start']; $i <= $targetParam['end']; $i++) { - if ($tokens[$i]['code'] === \T_STRING - || $tokens[$i]['code'] === \T_VARIABLE - ) { - // Variable, constant, function call. Ignore as undetermined. - return; - } - - if (isset($this->textStringTokens[$tokens[$i]['code']]) === true - && strpos($tokens[$i]['content'], '/>') !== false - ) { - - $phpcsFile->addError( - 'Self-closing XHTML tags are ignored. Only non-self-closing tags should be used in the strip_tags() $allowable_tags parameter since PHP 5.3.4. Found: %s', - $i, - 'Found', - array($targetParam['raw']) - ); - - // Only throw one error per function call. - return; - } - } - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewArrayReduceInitialTypeSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewArrayReduceInitialTypeSniff.php deleted file mode 100644 index 8045ac8..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewArrayReduceInitialTypeSniff.php +++ /dev/null @@ -1,116 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\ParameterValues; - -use PHPCompatibility\AbstractFunctionCallParameterSniff; -use PHP_CodeSniffer_File as File; - -/** - * In PHP 5.2 and lower, the `$initial` parameter for `array_reduce()` had to be an integer. - * - * PHP version 5.3 - * - * @link https://www.php.net/manual/en/migration53.other.php#migration53.other - * @link https://www.php.net/manual/en/function.array-reduce.php#refsect1-function.array-reduce-changelog - * - * @since 9.0.0 - */ -class NewArrayReduceInitialTypeSniff extends AbstractFunctionCallParameterSniff -{ - - /** - * Functions to check for. - * - * @since 9.0.0 - * - * @var array - */ - protected $targetFunctions = array( - 'array_reduce' => true, - ); - - /** - * Tokens which, for the purposes of this sniff, indicate that there is - * a variable element to the value passed. - * - * @since 9.0.0 - * - * @var array - */ - private $variableValueTokens = array( - \T_VARIABLE, - \T_STRING, - \T_SELF, - \T_PARENT, - \T_STATIC, - \T_DOUBLE_QUOTED_STRING, - ); - - - /** - * Do a version check to determine if this sniff needs to run at all. - * - * @since 9.0.0 - * - * @return bool - */ - protected function bowOutEarly() - { - return ($this->supportsBelow('5.2') === false); - } - - - /** - * Process the parameters of a matched function. - * - * @since 9.0.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the stack. - * @param string $functionName The token content (function name) which was matched. - * @param array $parameters Array with information about the parameters. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function processParameters(File $phpcsFile, $stackPtr, $functionName, $parameters) - { - if (isset($parameters[3]) === false) { - return; - } - - $targetParam = $parameters[3]; - if ($this->isNumber($phpcsFile, $targetParam['start'], $targetParam['end'], true) !== false) { - return; - } - - if ($this->isNumericCalculation($phpcsFile, $targetParam['start'], $targetParam['end']) === true) { - return; - } - - $error = 'Passing a non-integer as the value for $initial to array_reduce() is not supported in PHP 5.2 or lower.'; - if ($phpcsFile->findNext($this->variableValueTokens, $targetParam['start'], ($targetParam['end'] + 1)) === false) { - $phpcsFile->addError( - $error . ' Found %s', - $targetParam['start'], - 'InvalidTypeFound', - array($targetParam['raw']) - ); - } else { - $phpcsFile->addWarning( - $error . ' Variable value found. Found %s', - $targetParam['start'], - 'VariableFound', - array($targetParam['raw']) - ); - } - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewFopenModesSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewFopenModesSniff.php deleted file mode 100644 index 8329982..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewFopenModesSniff.php +++ /dev/null @@ -1,119 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\ParameterValues; - -use PHPCompatibility\AbstractFunctionCallParameterSniff; -use PHP_CodeSniffer_File as File; - -/** - * Check for valid values for the `fopen()` `$mode` parameter. - * - * PHP version 5.2+ - * - * @link https://www.php.net/manual/en/function.fopen.php#refsect1-function.fopen-changelog - * - * @since 9.0.0 - */ -class NewFopenModesSniff extends AbstractFunctionCallParameterSniff -{ - - /** - * Functions to check for. - * - * @since 9.0.0 - * - * @var array - */ - protected $targetFunctions = array( - 'fopen' => true, - ); - - - /** - * Do a version check to determine if this sniff needs to run at all. - * - * @since 9.0.0 - * - * @return bool - */ - protected function bowOutEarly() - { - // Version used here should be (above) the highest version from the `newModes` control, - // structure below, i.e. the last PHP version in which a new mode was introduced. - return ($this->supportsBelow('7.1') === false); - } - - - /** - * Process the parameters of a matched function. - * - * @since 9.0.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the stack. - * @param string $functionName The token content (function name) which was matched. - * @param array $parameters Array with information about the parameters. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function processParameters(File $phpcsFile, $stackPtr, $functionName, $parameters) - { - if (isset($parameters[2]) === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - $targetParam = $parameters[2]; - $errors = array(); - - for ($i = $targetParam['start']; $i <= $targetParam['end']; $i++) { - if ($tokens[$i]['code'] !== \T_CONSTANT_ENCAPSED_STRING) { - continue; - } - - if (strpos($tokens[$i]['content'], 'c+') !== false && $this->supportsBelow('5.2.5')) { - $errors['cplusFound'] = array( - 'c+', - '5.2.5', - $targetParam['raw'], - ); - } elseif (strpos($tokens[$i]['content'], 'c') !== false && $this->supportsBelow('5.2.5')) { - $errors['cFound'] = array( - 'c', - '5.2.5', - $targetParam['raw'], - ); - } - - if (strpos($tokens[$i]['content'], 'e') !== false && $this->supportsBelow('7.0.15')) { - $errors['eFound'] = array( - 'e', - '7.0.15', - $targetParam['raw'], - ); - } - } - - if (empty($errors) === true) { - return; - } - - foreach ($errors as $errorCode => $errorData) { - $phpcsFile->addError( - 'Passing "%s" as the $mode to fopen() is not supported in PHP %s or lower. Found %s', - $targetParam['start'], - $errorCode, - $errorData - ); - } - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewHTMLEntitiesEncodingDefaultSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewHTMLEntitiesEncodingDefaultSniff.php deleted file mode 100644 index 1889556..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewHTMLEntitiesEncodingDefaultSniff.php +++ /dev/null @@ -1,92 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\ParameterValues; - -use PHPCompatibility\AbstractFunctionCallParameterSniff; -use PHP_CodeSniffer_File as File; - -/** - * As of PHP 5.4, the default character set for `htmlspecialchars()`, `htmlentities()` - * and `html_entity_decode()` is now `UTF-8`, instead of `ISO-8859-1`. - * - * PHP version 5.4 - * - * @link https://www.php.net/manual/en/migration54.other.php - * @link https://www.php.net/manual/en/function.html-entity-decode.php#refsect1-function.html-entity-decode-changelog - * @link https://www.php.net/manual/en/function.htmlentities.php#refsect1-function.htmlentities-changelog - * @link https://www.php.net/manual/en/function.htmlspecialchars.php#refsect1-function.htmlspecialchars-changelog - * - * @since 9.3.0 - */ -class NewHTMLEntitiesEncodingDefaultSniff extends AbstractFunctionCallParameterSniff -{ - - /** - * Functions to check for. - * - * Key is the function name, value the 1-based parameter position of - * the $encoding parameter. - * - * @since 9.3.0 - * - * @var array - */ - protected $targetFunctions = array( - 'html_entity_decode' => 3, - 'htmlentities' => 3, - 'htmlspecialchars' => 3, - ); - - - /** - * Do a version check to determine if this sniff needs to run at all. - * - * Note: This sniff should only trigger errors when both PHP 5.3 or lower, - * as well as PHP 5.4 or higher need to be supported within the application. - * - * @since 9.3.0 - * - * @return bool - */ - protected function bowOutEarly() - { - return ($this->supportsBelow('5.3') === false || $this->supportsAbove('5.4') === false); - } - - - /** - * Process the parameters of a matched function. - * - * @since 9.3.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the stack. - * @param string $functionName The token content (function name) which was matched. - * @param array $parameters Array with information about the parameters. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function processParameters(File $phpcsFile, $stackPtr, $functionName, $parameters) - { - $functionLC = strtolower($functionName); - if (isset($parameters[$this->targetFunctions[$functionLC]]) === true) { - return; - } - - $phpcsFile->addError( - 'The default value of the $encoding parameter for %s() was changed from ISO-8859-1 to UTF-8 in PHP 5.4. For cross-version compatibility, the $encoding parameter should be explicitly set.', - $stackPtr, - 'NotSet', - array($functionName) - ); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewHashAlgorithmsSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewHashAlgorithmsSniff.php deleted file mode 100644 index 297f84e..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewHashAlgorithmsSniff.php +++ /dev/null @@ -1,185 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\ParameterValues; - -use PHPCompatibility\AbstractNewFeatureSniff; -use PHP_CodeSniffer_File as File; - -/** - * Detect the use of newly introduced hash algorithms. - * - * PHP version 5.2+ - * - * @link https://www.php.net/manual/en/function.hash-algos.php#refsect1-function.hash-algos-changelog - * - * @since 7.0.7 - * @since 7.1.0 Now extends the `AbstractNewFeatureSniff` instead of the base `Sniff` class.. - */ -class NewHashAlgorithmsSniff extends AbstractNewFeatureSniff -{ - /** - * A list of new hash algorithms, not present in older versions. - * - * The array lists : version number with false (not present) or true (present). - * If's sufficient to list the first version where the hash algorithm appears. - * - * @since 7.0.7 - * - * @var array(string => array(string => bool)) - */ - protected $newAlgorithms = array( - 'md2' => array( - '5.2' => false, - '5.3' => true, - ), - 'ripemd256' => array( - '5.2' => false, - '5.3' => true, - ), - 'ripemd320' => array( - '5.2' => false, - '5.3' => true, - ), - 'salsa10' => array( - '5.2' => false, - '5.3' => true, - ), - 'salsa20' => array( - '5.2' => false, - '5.3' => true, - ), - 'snefru256' => array( - '5.2' => false, - '5.3' => true, - ), - 'sha224' => array( - '5.2' => false, - '5.3' => true, - ), - 'joaat' => array( - '5.3' => false, - '5.4' => true, - ), - 'fnv132' => array( - '5.3' => false, - '5.4' => true, - ), - 'fnv164' => array( - '5.3' => false, - '5.4' => true, - ), - 'gost-crypto' => array( - '5.5' => false, - '5.6' => true, - ), - - 'sha512/224' => array( - '7.0' => false, - '7.1' => true, - ), - 'sha512/256' => array( - '7.0' => false, - '7.1' => true, - ), - 'sha3-224' => array( - '7.0' => false, - '7.1' => true, - ), - 'sha3-256' => array( - '7.0' => false, - '7.1' => true, - ), - 'sha3-384' => array( - '7.0' => false, - '7.1' => true, - ), - 'sha3-512' => array( - '7.0' => false, - '7.1' => true, - ), - 'crc32c' => array( - '7.3' => false, - '7.4' => true, - ), - ); - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 7.0.7 - * - * @return array - */ - public function register() - { - return array(\T_STRING); - } - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 7.0.7 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $algo = $this->getHashAlgorithmParameter($phpcsFile, $stackPtr); - if (empty($algo) || \is_string($algo) === false) { - return; - } - - // Bow out if not one of the algorithms we're targetting. - if (isset($this->newAlgorithms[$algo]) === false) { - return; - } - - // Check if the algorithm used is new. - $itemInfo = array( - 'name' => $algo, - ); - $this->handleFeature($phpcsFile, $stackPtr, $itemInfo); - } - - - /** - * Get the relevant sub-array for a specific item from a multi-dimensional array. - * - * @since 7.1.0 - * - * @param array $itemInfo Base information about the item. - * - * @return array Version and other information about the item. - */ - public function getItemArray(array $itemInfo) - { - return $this->newAlgorithms[$itemInfo['name']]; - } - - - /** - * Get the error message template for this sniff. - * - * @since 7.1.0 - * - * @return string - */ - protected function getErrorMsgTemplate() - { - return 'The %s hash algorithm is not present in PHP version %s or earlier'; - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewIDNVariantDefaultSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewIDNVariantDefaultSniff.php deleted file mode 100644 index 2c9748c..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewIDNVariantDefaultSniff.php +++ /dev/null @@ -1,91 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\ParameterValues; - -use PHPCompatibility\AbstractFunctionCallParameterSniff; -use PHP_CodeSniffer_File as File; - -/** - * The default value for the `$variant` parameter has changed from `INTL_IDNA_VARIANT_2003` - * to `INTL_IDNA_VARIANT_UTS46` in PHP 7.4. - * - * PHP version 7.4 - * - * @link https://www.php.net/manual/en/migration74.incompatible.php#migration74.incompatible.intl - * @link https://wiki.php.net/rfc/deprecate-and-remove-intl_idna_variant_2003 - * @link https://www.php.net/manual/en/function.idn-to-ascii.php - * @link https://www.php.net/manual/en/function.idn-to-utf8.php - * - * @since 9.3.0 - */ -class NewIDNVariantDefaultSniff extends AbstractFunctionCallParameterSniff -{ - - /** - * Functions to check for. - * - * Key is the function name, value the 1-based parameter position of - * the $variant parameter. - * - * @since 9.3.0 - * - * @var array - */ - protected $targetFunctions = array( - 'idn_to_ascii' => 3, - 'idn_to_utf8' => 3, - ); - - /** - * Do a version check to determine if this sniff needs to run at all. - * - * Note: This sniff should only trigger errors when both PHP 7.3 or lower, - * as well as PHP 7.4 or higher need to be supported within the application. - * - * @since 9.3.0 - * - * @return bool - */ - protected function bowOutEarly() - { - return ($this->supportsBelow('7.3') === false || $this->supportsAbove('7.4') === false); - } - - - /** - * Process the parameters of a matched function. - * - * @since 9.3.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the stack. - * @param string $functionName The token content (function name) which was matched. - * @param array $parameters Array with information about the parameters. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function processParameters(File $phpcsFile, $stackPtr, $functionName, $parameters) - { - $functionLC = strtolower($functionName); - if (isset($parameters[$this->targetFunctions[$functionLC]]) === true) { - return; - } - - $error = 'The default value of the %s() $variant parameter has changed from INTL_IDNA_VARIANT_2003 to INTL_IDNA_VARIANT_UTS46 in PHP 7.4. For optimal cross-version compatibility, the $variant parameter should be explicitly set.'; - $phpcsFile->addError( - $error, - $stackPtr, - 'NotSet', - array($functionName) - ); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewIconvMbstringCharsetDefaultSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewIconvMbstringCharsetDefaultSniff.php deleted file mode 100644 index 51cc894..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewIconvMbstringCharsetDefaultSniff.php +++ /dev/null @@ -1,231 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\ParameterValues; - -use PHPCompatibility\AbstractFunctionCallParameterSniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Detect calls to Iconv and Mbstring functions with the optional `$charset`/`$encoding` parameter not set. - * - * The default value for the iconv `$charset` and the MbString $encoding` parameters was changed - * in PHP 5.6 to the value of `default_charset`, which defaults to `UTF-8`. - * - * Previously, the iconv functions would default to the value of `iconv.internal_encoding`; - * The Mbstring functions would default to the return value of `mb_internal_encoding()`. - * In both case, this would normally come down to `ISO-8859-1`. - * - * PHP version 5.6 - * - * @link https://www.php.net/manual/en/migration56.new-features.php#migration56.new-features.default-encoding - * @link https://www.php.net/manual/en/migration56.deprecated.php#migration56.deprecated.iconv-mbstring-encoding - * @link https://wiki.php.net/rfc/default_encoding - * - * @since 9.3.0 - */ -class NewIconvMbstringCharsetDefaultSniff extends AbstractFunctionCallParameterSniff -{ - - /** - * Functions to check for. - * - * Only those functions where the charset/encoding parameter is optional need to be listed. - * - * Key is the function name, value the 1-based parameter position of - * the $charset/$encoding parameter. - * - * @since 9.3.0 - * - * @var array - */ - protected $targetFunctions = array( - 'iconv_mime_decode_headers' => 3, - 'iconv_mime_decode' => 3, - 'iconv_mime_encode' => 3, // Special case. - 'iconv_strlen' => 2, - 'iconv_strpos' => 4, - 'iconv_strrpos' => 3, - 'iconv_substr' => 4, - - 'mb_check_encoding' => 2, - 'mb_chr' => 2, - 'mb_convert_case' => 3, - 'mb_convert_encoding' => 3, - 'mb_convert_kana' => 3, - 'mb_decode_numericentity' => 3, - 'mb_encode_numericentity' => 3, - 'mb_ord' => 2, - 'mb_scrub' => 2, - 'mb_strcut' => 4, - 'mb_stripos' => 4, - 'mb_stristr' => 4, - 'mb_strlen' => 2, - 'mb_strpos' => 4, - 'mb_strrchr' => 4, - 'mb_strrichr' => 4, - 'mb_strripos' => 4, - 'mb_strrpos' => 4, - 'mb_strstr' => 4, - 'mb_strtolower' => 2, - 'mb_strtoupper' => 2, - 'mb_strwidth' => 2, - 'mb_substr_count' => 3, - 'mb_substr' => 4, - ); - - - /** - * Do a version check to determine if this sniff needs to run at all. - * - * Note: This sniff should only trigger errors when both PHP 5.5 or lower, - * as well as PHP 5.6 or higher need to be supported within the application. - * - * @since 9.3.0 - * - * @return bool - */ - protected function bowOutEarly() - { - return ($this->supportsBelow('5.5') === false || $this->supportsAbove('5.6') === false); - } - - - /** - * Process the parameters of a matched function. - * - * @since 9.3.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the stack. - * @param string $functionName The token content (function name) which was matched. - * @param array $parameters Array with information about the parameters. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function processParameters(File $phpcsFile, $stackPtr, $functionName, $parameters) - { - $functionLC = strtolower($functionName); - if ($functionLC === 'iconv_mime_encode') { - // Special case the iconv_mime_encode() function. - return $this->processIconvMimeEncode($phpcsFile, $stackPtr, $functionName, $parameters); - } - - if (isset($parameters[$this->targetFunctions[$functionLC]]) === true) { - return; - } - - $paramName = '$encoding'; - if (strpos($functionLC, 'iconv_') === 0) { - $paramName = '$charset'; - } elseif ($functionLC === 'mb_convert_encoding') { - $paramName = '$from_encoding'; - } - - $error = 'The default value of the %1$s parameter for %2$s() was changed from ISO-8859-1 to UTF-8 in PHP 5.6. For cross-version compatibility, the %1$s parameter should be explicitly set.'; - $data = array( - $paramName, - $functionName, - ); - - $phpcsFile->addError($error, $stackPtr, 'NotSet', $data); - } - - /** - * Process the parameters of a matched call to the iconv_mime_encode() function. - * - * @since 9.3.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the stack. - * @param string $functionName The token content (function name) which was matched. - * @param array $parameters Array with information about the parameters. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function processIconvMimeEncode(File $phpcsFile, $stackPtr, $functionName, $parameters) - { - $error = 'The default value of the %s parameter index for iconv_mime_encode() was changed from ISO-8859-1 to UTF-8 in PHP 5.6. For cross-version compatibility, the %s should be explicitly set.'; - - $functionLC = strtolower($functionName); - if (isset($parameters[$this->targetFunctions[$functionLC]]) === false) { - $phpcsFile->addError( - $error, - $stackPtr, - 'PreferencesNotSet', - array( - '$preferences[\'input/output-charset\']', - '$preferences[\'input-charset\'] and $preferences[\'output-charset\'] indexes', - ) - ); - - return; - } - - $tokens = $phpcsFile->getTokens(); - $targetParam = $parameters[$this->targetFunctions[$functionLC]]; - $firstNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, $targetParam['start'], ($targetParam['end'] + 1), true); - if ($firstNonEmpty === false) { - // Parse error or live coding. - return; - } - - if ($tokens[$firstNonEmpty]['code'] === \T_ARRAY - || $tokens[$firstNonEmpty]['code'] === \T_OPEN_SHORT_ARRAY - ) { - $hasInputCharset = preg_match('`([\'"])input-charset\1\s*=>`', $targetParam['raw']); - $hasOutputCharset = preg_match('`([\'"])output-charset\1\s*=>`', $targetParam['raw']); - if ($hasInputCharset === 1 && $hasOutputCharset === 1) { - // Both input as well as output charset are set. - return; - } - - if ($hasInputCharset !== 1) { - $phpcsFile->addError( - $error, - $firstNonEmpty, - 'InputPreferenceNotSet', - array( - '$preferences[\'input-charset\']', - '$preferences[\'input-charset\'] index', - ) - ); - } - - if ($hasOutputCharset !== 1) { - $phpcsFile->addError( - $error, - $firstNonEmpty, - 'OutputPreferenceNotSet', - array( - '$preferences[\'output-charset\']', - '$preferences[\'output-charset\'] index', - ) - ); - } - - return; - } - - // The $preferences parameter was passed, but it was a variable/constant/output of a function call. - $phpcsFile->addWarning( - $error, - $firstNonEmpty, - 'Undetermined', - array( - '$preferences[\'input/output-charset\']', - '$preferences[\'input-charset\'] and $preferences[\'output-charset\'] indexes', - ) - ); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewNegativeStringOffsetSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewNegativeStringOffsetSniff.php deleted file mode 100644 index f2aea60..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewNegativeStringOffsetSniff.php +++ /dev/null @@ -1,129 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\ParameterValues; - -use PHPCompatibility\AbstractFunctionCallParameterSniff; -use PHP_CodeSniffer_File as File; - -/** - * Detect negative string offsets as parameters passed to functions where this - * was not allowed prior to PHP 7.1. - * - * PHP version 7.1 - * - * @link https://wiki.php.net/rfc/negative-string-offsets - * - * @since 9.0.0 - */ -class NewNegativeStringOffsetSniff extends AbstractFunctionCallParameterSniff -{ - - /** - * Functions to check for. - * - * @since 9.0.0 - * - * @var array Function name => 1-based parameter offset of the affected parameters => parameter name. - */ - protected $targetFunctions = array( - 'file_get_contents' => array( - 4 => 'offset', - ), - 'grapheme_extract' => array( - 4 => 'start', - ), - 'grapheme_stripos' => array( - 3 => 'offset', - ), - 'grapheme_strpos' => array( - 3 => 'offset', - ), - 'iconv_strpos' => array( - 3 => 'offset', - ), - 'mb_ereg_search_setpos' => array( - 1 => 'position', - ), - 'mb_strimwidth' => array( - 2 => 'start', - 3 => 'width', - ), - 'mb_stripos' => array( - 3 => 'offset', - ), - 'mb_strpos' => array( - 3 => 'offset', - ), - 'stripos' => array( - 3 => 'offset', - ), - 'strpos' => array( - 3 => 'offset', - ), - 'substr_count' => array( - 3 => 'offset', - 4 => 'length', - ), - ); - - - /** - * Do a version check to determine if this sniff needs to run at all. - * - * @since 9.0.0 - * - * @return bool - */ - protected function bowOutEarly() - { - return ($this->supportsBelow('7.0') === false); - } - - /** - * Process the parameters of a matched function. - * - * @since 9.0.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the stack. - * @param string $functionName The token content (function name) which was matched. - * @param array $parameters Array with information about the parameters. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function processParameters(File $phpcsFile, $stackPtr, $functionName, $parameters) - { - $functionLC = strtolower($functionName); - foreach ($this->targetFunctions[$functionLC] as $pos => $name) { - if (isset($parameters[$pos]) === false) { - continue; - } - - $targetParam = $parameters[$pos]; - - if ($this->isNegativeNumber($phpcsFile, $targetParam['start'], $targetParam['end']) === false) { - continue; - } - - $phpcsFile->addError( - 'Negative string offsets were not supported for the $%s parameter in %s() in PHP 7.0 or lower. Found %s', - $targetParam['start'], - 'Found', - array( - $name, - $functionName, - $targetParam['raw'], - ) - ); - } - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewPCREModifiersSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewPCREModifiersSniff.php deleted file mode 100644 index 65339e5..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewPCREModifiersSniff.php +++ /dev/null @@ -1,127 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\ParameterValues; - -use PHPCompatibility\Sniffs\ParameterValues\RemovedPCREModifiersSniff; -use PHP_CodeSniffer_File as File; - -/** - * Check for the use of newly added regex modifiers for PCRE functions. - * - * Initially just checks for the PHP 7.2 new `J` modifier. - * - * PHP version 7.2+ - * - * @link https://www.php.net/manual/en/reference.pcre.pattern.modifiers.php - * @link https://www.php.net/manual/en/migration72.new-features.php#migration72.new-features.pcre - * - * @since 8.2.0 - * @since 9.0.0 Renamed from `PCRENewModifiersSniff` to `NewPCREModifiersSniff`. - */ -class NewPCREModifiersSniff extends RemovedPCREModifiersSniff -{ - - /** - * Functions to check for. - * - * @since 8.2.0 - * - * @var array - */ - protected $targetFunctions = array( - 'preg_filter' => true, - 'preg_grep' => true, - 'preg_match_all' => true, - 'preg_match' => true, - 'preg_replace_callback_array' => true, - 'preg_replace_callback' => true, - 'preg_replace' => true, - 'preg_split' => true, - ); - - /** - * Array listing newly introduced regex modifiers. - * - * The key should be the modifier (case-sensitive!). - * The value should be the PHP version in which the modifier was introduced. - * - * @since 8.2.0 - * - * @var array - */ - protected $newModifiers = array( - 'J' => array( - '7.1' => false, - '7.2' => true, - ), - ); - - - /** - * Do a version check to determine if this sniff needs to run at all. - * - * @since 8.2.0 - * - * @return bool - */ - protected function bowOutEarly() - { - // Version used here should be the highest version from the `$newModifiers` array, - // i.e. the last PHP version in which a new modifier was introduced. - return ($this->supportsBelow('7.2') === false); - } - - - /** - * Examine the regex modifier string. - * - * @since 8.2.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * @param string $functionName The function which contained the pattern. - * @param string $modifiers The regex modifiers found. - * - * @return void - */ - protected function examineModifiers(File $phpcsFile, $stackPtr, $functionName, $modifiers) - { - $error = 'The PCRE regex modifier "%s" is not present in PHP version %s or earlier'; - - foreach ($this->newModifiers as $modifier => $versionArray) { - if (strpos($modifiers, $modifier) === false) { - continue; - } - - $notInVersion = ''; - foreach ($versionArray as $version => $present) { - if ($notInVersion === '' && $present === false - && $this->supportsBelow($version) === true - ) { - $notInVersion = $version; - } - } - - if ($notInVersion === '') { - continue; - } - - $errorCode = $modifier . 'ModifierFound'; - $data = array( - $modifier, - $notInVersion, - ); - - $phpcsFile->addError($error, $stackPtr, $errorCode, $data); - } - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewPackFormatSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewPackFormatSniff.php deleted file mode 100644 index 7e42f3e..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewPackFormatSniff.php +++ /dev/null @@ -1,132 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\ParameterValues; - -use PHPCompatibility\AbstractFunctionCallParameterSniff; -use PHP_CodeSniffer_File as File; - -/** - * Check for valid values for the `$format` passed to `pack()`. - * - * PHP version 5.4+ - * - * @link https://www.php.net/manual/en/function.pack.php#refsect1-function.pack-changelog - * - * @since 9.0.0 - */ -class NewPackFormatSniff extends AbstractFunctionCallParameterSniff -{ - - /** - * Functions to check for. - * - * @since 9.0.0 - * - * @var array - */ - protected $targetFunctions = array( - 'pack' => true, - ); - - /** - * List of new format character codes added to pack(). - * - * @since 9.0.0 - * - * @var array Regex pattern => Version array. - */ - protected $newFormats = array( - '`([Z])`' => array( - '5.4' => false, - '5.5' => true, - ), - '`([qQJP])`' => array( - '5.6.2' => false, - '5.6.3' => true, - ), - '`([eEgG])`' => array( - '7.0.14' => false, - '7.0.15' => true, // And 7.1.1. - ), - ); - - - /** - * Do a version check to determine if this sniff needs to run at all. - * - * @since 9.0.0 - * - * @return bool - */ - protected function bowOutEarly() - { - return ($this->supportsBelow('7.1') === false); - } - - - /** - * Process the parameters of a matched function. - * - * @since 9.0.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the stack. - * @param string $functionName The token content (function name) which was matched. - * @param array $parameters Array with information about the parameters. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function processParameters(File $phpcsFile, $stackPtr, $functionName, $parameters) - { - if (isset($parameters[1]) === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - $targetParam = $parameters[1]; - - for ($i = $targetParam['start']; $i <= $targetParam['end']; $i++) { - if ($tokens[$i]['code'] !== \T_CONSTANT_ENCAPSED_STRING - && $tokens[$i]['code'] !== \T_DOUBLE_QUOTED_STRING - ) { - continue; - } - - $content = $tokens[$i]['content']; - if ($tokens[$i]['code'] === \T_DOUBLE_QUOTED_STRING) { - $content = $this->stripVariables($content); - } - - foreach ($this->newFormats as $pattern => $versionArray) { - if (preg_match($pattern, $content, $matches) !== 1) { - continue; - } - - foreach ($versionArray as $version => $present) { - if ($present === false && $this->supportsBelow($version) === true) { - $phpcsFile->addError( - 'Passing the $format(s) "%s" to pack() is not supported in PHP %s or lower. Found %s', - $targetParam['start'], - 'NewFormatFound', - array( - $matches[1], - $version, - $targetParam['raw'], - ) - ); - continue 2; - } - } - } - } - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewPasswordAlgoConstantValuesSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewPasswordAlgoConstantValuesSniff.php deleted file mode 100644 index 94a1360..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewPasswordAlgoConstantValuesSniff.php +++ /dev/null @@ -1,125 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\ParameterValues; - -use PHPCompatibility\AbstractFunctionCallParameterSniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * The constant value of the password hash algorithm constants has changed in PHP 7.4. - * - * Applications using the constants `PASSWORD_DEFAULT`, `PASSWORD_BCRYPT`, - * `PASSWORD_ARGON2I`, and `PASSWORD_ARGON2ID` will continue to function correctly. - * Using an integer will still work, but will produce a deprecation warning. - * - * PHP version 7.4 - * - * @link https://www.php.net/manual/en/migration74.incompatible.php#migration74.incompatible.core.password-algorithm-constants - * @link https://wiki.php.net/rfc/password_registry - * - * @since 9.3.0 - */ -class NewPasswordAlgoConstantValuesSniff extends AbstractFunctionCallParameterSniff -{ - - /** - * Functions to check for. - * - * Key is the function name, value the 1-based parameter position of - * the $algo parameter. - * - * @since 9.3.0 - * - * @var array - */ - protected $targetFunctions = array( - 'password_hash' => 2, - 'password_needs_rehash' => 2, - ); - - /** - * Tokens types which indicate that the parameter passed is not the PHP native constant. - * - * @since 9.3.0 - * - * @var array - */ - private $invalidTokenTypes = array( - \T_NULL => true, - \T_TRUE => true, - \T_FALSE => true, - \T_LNUMBER => true, - \T_DNUMBER => true, - \T_CONSTANT_ENCAPSED_STRING => true, - \T_DOUBLE_QUOTED_STRING => true, - \T_HEREDOC => true, - \T_NOWDOC => true, - ); - - - /** - * Do a version check to determine if this sniff needs to run at all. - * - * @since 9.3.0 - * - * @return bool - */ - protected function bowOutEarly() - { - return ($this->supportsAbove('7.4') === false); - } - - - /** - * Process the parameters of a matched function. - * - * @since 9.3.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the stack. - * @param string $functionName The token content (function name) which was matched. - * @param array $parameters Array with information about the parameters. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function processParameters(File $phpcsFile, $stackPtr, $functionName, $parameters) - { - $functionLC = strtolower($functionName); - if (isset($parameters[$this->targetFunctions[$functionLC]]) === false) { - return; - } - - $targetParam = $parameters[$this->targetFunctions[$functionLC]]; - $tokens = $phpcsFile->getTokens(); - - for ($i = $targetParam['start']; $i <= $targetParam['end']; $i++) { - if (isset(Tokens::$emptyTokens[$tokens[$i]['code']]) === true) { - continue; - } - - if (isset($this->invalidTokenTypes[$tokens[$i]['code']]) === true) { - $phpcsFile->addWarning( - 'The value of the password hash algorithm constants has changed in PHP 7.4. Pass a PHP native constant to the %s() function instead of using the value of the constant. Found: %s', - $stackPtr, - 'NotAlgoConstant', - array( - $functionName, - $targetParam['raw'], - ) - ); - - break; - } - } - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewProcOpenCmdArraySniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewProcOpenCmdArraySniff.php deleted file mode 100644 index 4e9f150..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewProcOpenCmdArraySniff.php +++ /dev/null @@ -1,136 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\ParameterValues; - -use PHPCompatibility\AbstractFunctionCallParameterSniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * As of PHP 7.4, `proc_open()` now also accepts an array instead of a string for the command. - * - * In that case, the process will be opened directly (without going through a shell) and - * PHP will take care of any necessary argument escaping. - * - * PHP version 7.4 - * - * @link https://www.php.net/manual/en/migration74.new-features.php#migration74.new-features.standard.proc-open - * @link https://www.php.net/manual/en/function.proc-open.php - * - * @since 9.3.0 - */ -class NewProcOpenCmdArraySniff extends AbstractFunctionCallParameterSniff -{ - - /** - * Functions to check for. - * - * @since 9.3.0 - * - * @var array - */ - protected $targetFunctions = array( - 'proc_open' => true, - ); - - - /** - * Do a version check to determine if this sniff needs to run at all. - * - * @since 9.3.0 - * - * @return bool - */ - protected function bowOutEarly() - { - return false; - } - - - /** - * Process the parameters of a matched function. - * - * @since 9.3.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the stack. - * @param string $functionName The token content (function name) which was matched. - * @param array $parameters Array with information about the parameters. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function processParameters(File $phpcsFile, $stackPtr, $functionName, $parameters) - { - if (isset($parameters[1]) === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - $targetParam = $parameters[1]; - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, $targetParam['start'], $targetParam['end'], true); - - if ($nextNonEmpty === false) { - // Shouldn't be possible. - return; - } - - if ($tokens[$nextNonEmpty]['code'] !== \T_ARRAY - && $tokens[$nextNonEmpty]['code'] !== \T_OPEN_SHORT_ARRAY - ) { - // Not passed as an array. - return; - } - - if ($this->supportsBelow('7.3') === true) { - $phpcsFile->addError( - 'The proc_open() function did not accept $cmd to be passed in array format in PHP 7.3 and earlier.', - $nextNonEmpty, - 'Found' - ); - } - - if ($this->supportsAbove('7.4') === true) { - if (strpos($targetParam['raw'], 'escapeshellarg(') === false) { - // Efficiency: prevent needlessly walking the array. - return; - } - - $items = $this->getFunctionCallParameters($phpcsFile, $nextNonEmpty); - - if (empty($items)) { - return; - } - - foreach ($items as $item) { - for ($i = $item['start']; $i <= $item['end']; $i++) { - if ($tokens[$i]['code'] !== \T_STRING - || $tokens[$i]['content'] !== 'escapeshellarg' - ) { - continue; - } - - // @todo Potential future enhancement: check if it's a call to the PHP native function. - - $phpcsFile->addWarning( - 'When passing proc_open() the $cmd parameter as an array, PHP will take care of any necessary argument escaping. Found: %s', - $i, - 'Invalid', - array($item['raw']) - ); - - // Only throw one error per array item. - break; - } - } - } - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewStripTagsAllowableTagsArraySniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewStripTagsAllowableTagsArraySniff.php deleted file mode 100644 index 9d9ede0..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/NewStripTagsAllowableTagsArraySniff.php +++ /dev/null @@ -1,152 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\ParameterValues; - -use PHPCompatibility\AbstractFunctionCallParameterSniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * As of PHP 7.4, `strip_tags()` now also accepts an array of `$allowable_tags`. - * - * PHP version 7.4 - * - * @link https://www.php.net/manual/en/migration74.new-features.php#migration74.new-features.standard.strip-tags - * @link https://www.php.net/manual/en/function.strip-tags.php - * - * @since 9.3.0 - */ -class NewStripTagsAllowableTagsArraySniff extends AbstractFunctionCallParameterSniff -{ - - /** - * Functions to check for. - * - * @since 9.3.0 - * - * @var array - */ - protected $targetFunctions = array( - 'strip_tags' => true, - ); - - /** - * Text string tokens to examine. - * - * @since 9.3.0 - * - * @var array - */ - private $textStringTokens = array( - \T_CONSTANT_ENCAPSED_STRING => true, - \T_DOUBLE_QUOTED_STRING => true, - \T_INLINE_HTML => true, - \T_HEREDOC => true, - \T_NOWDOC => true, - ); - - - /** - * Do a version check to determine if this sniff needs to run at all. - * - * @since 9.3.0 - * - * @return bool - */ - protected function bowOutEarly() - { - return false; - } - - - /** - * Process the parameters of a matched function. - * - * @since 9.3.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the stack. - * @param string $functionName The token content (function name) which was matched. - * @param array $parameters Array with information about the parameters. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function processParameters(File $phpcsFile, $stackPtr, $functionName, $parameters) - { - if (isset($parameters[2]) === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - $targetParam = $parameters[2]; - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, $targetParam['start'], $targetParam['end'], true); - - if ($nextNonEmpty === false) { - // Shouldn't be possible. - return; - } - - if ($tokens[$nextNonEmpty]['code'] !== \T_ARRAY - && $tokens[$nextNonEmpty]['code'] !== \T_OPEN_SHORT_ARRAY - ) { - // Not passed as a hard-coded array. - return; - } - - if ($this->supportsBelow('7.3') === true) { - $phpcsFile->addError( - 'The strip_tags() function did not accept $allowable_tags to be passed in array format in PHP 7.3 and earlier.', - $nextNonEmpty, - 'Found' - ); - } - - if ($this->supportsAbove('7.4') === true) { - if (strpos($targetParam['raw'], '>') === false) { - // Efficiency: prevent needlessly walking the array. - return; - } - - $items = $this->getFunctionCallParameters($phpcsFile, $nextNonEmpty); - - if (empty($items)) { - return; - } - - foreach ($items as $item) { - for ($i = $item['start']; $i <= $item['end']; $i++) { - if ($tokens[$i]['code'] === \T_STRING - || $tokens[$i]['code'] === \T_VARIABLE - ) { - // Variable, constant, function call. Ignore complete item as undetermined. - break; - } - - if (isset($this->textStringTokens[$tokens[$i]['code']]) === true - && strpos($tokens[$i]['content'], '>') !== false - ) { - - $phpcsFile->addWarning( - 'When passing strip_tags() the $allowable_tags parameter as an array, the tags should not be enclosed in <> brackets. Found: %s', - $i, - 'Invalid', - array($item['raw']) - ); - - // Only throw one error per array item. - break; - } - } - } - } - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/RemovedHashAlgorithmsSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/RemovedHashAlgorithmsSniff.php deleted file mode 100644 index 83d4b8b..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/RemovedHashAlgorithmsSniff.php +++ /dev/null @@ -1,117 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\ParameterValues; - -use PHPCompatibility\AbstractRemovedFeatureSniff; -use PHP_CodeSniffer_File as File; - -/** - * Detect the use of deprecated and removed hash algorithms. - * - * PHP version 5.4 - * - * @link https://www.php.net/manual/en/function.hash-algos.php#refsect1-function.hash-algos-changelog - * - * @since 5.5 - * @since 7.1.0 Now extends the `AbstractRemovedFeatureSniff` instead of the base `Sniff` class. - */ -class RemovedHashAlgorithmsSniff extends AbstractRemovedFeatureSniff -{ - - /** - * A list of removed hash algorithms, which were present in older versions. - * - * The array lists : version number with false (deprecated) and true (removed). - * If's sufficient to list the first version where the hash algorithm was deprecated/removed. - * - * @since 7.0.7 - * - * @var array(string => array(string => bool)) - */ - protected $removedAlgorithms = array( - 'salsa10' => array( - '5.4' => true, - ), - 'salsa20' => array( - '5.4' => true, - ), - ); - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 5.5 - * - * @return array - */ - public function register() - { - return array(\T_STRING); - } - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 5.5 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $algo = $this->getHashAlgorithmParameter($phpcsFile, $stackPtr); - if (empty($algo) || \is_string($algo) === false) { - return; - } - - // Bow out if not one of the algorithms we're targetting. - if (isset($this->removedAlgorithms[$algo]) === false) { - return; - } - - $itemInfo = array( - 'name' => $algo, - ); - $this->handleFeature($phpcsFile, $stackPtr, $itemInfo); - } - - - /** - * Get the relevant sub-array for a specific item from a multi-dimensional array. - * - * @since 7.1.0 - * - * @param array $itemInfo Base information about the item. - * - * @return array Version and other information about the item. - */ - public function getItemArray(array $itemInfo) - { - return $this->removedAlgorithms[$itemInfo['name']]; - } - - - /** - * Get the error message template for this sniff. - * - * @since 7.1.0 - * - * @return string - */ - protected function getErrorMsgTemplate() - { - return 'The %s hash algorithm is '; - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/RemovedIconvEncodingSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/RemovedIconvEncodingSniff.php deleted file mode 100644 index d7c7c66..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/RemovedIconvEncodingSniff.php +++ /dev/null @@ -1,86 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\ParameterValues; - -use PHPCompatibility\AbstractFunctionCallParameterSniff; -use PHP_CodeSniffer_File as File; - -/** - * Detect passing deprecated `$type` values to `iconv_get_encoding()`. - * - * "The iconv and mbstring configuration options related to encoding have been - * deprecated in favour of default_charset." - * - * {@internal It is unclear which mbstring functions should be targetted, so for now, - * only the iconv function is handled.} - * - * PHP version 5.6 - * - * @link https://www.php.net/manual/en/migration56.deprecated.php#migration56.deprecated.iconv-mbstring-encoding - * @link https://wiki.php.net/rfc/default_encoding - * - * @since 9.0.0 - */ -class RemovedIconvEncodingSniff extends AbstractFunctionCallParameterSniff -{ - - /** - * Functions to check for. - * - * @since 9.0.0 - * - * @var array - */ - protected $targetFunctions = array( - 'iconv_set_encoding' => true, - ); - - - /** - * Do a version check to determine if this sniff needs to run at all. - * - * @since 9.0.0 - * - * @return bool - */ - protected function bowOutEarly() - { - return ($this->supportsAbove('5.6') === false); - } - - - /** - * Process the parameters of a matched function. - * - * @since 9.0.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the stack. - * @param string $functionName The token content (function name) which was matched. - * @param array $parameters Array with information about the parameters. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function processParameters(File $phpcsFile, $stackPtr, $functionName, $parameters) - { - if (isset($parameters[1]) === false) { - return; - } - - $phpcsFile->addWarning( - 'All previously accepted values for the $type parameter of iconv_set_encoding() have been deprecated since PHP 5.6. Found %s', - $parameters[1]['start'], - 'DeprecatedValueFound', - $parameters[1]['raw'] - ); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/RemovedImplodeFlexibleParamOrderSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/RemovedImplodeFlexibleParamOrderSniff.php deleted file mode 100644 index 1ff0f90..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/RemovedImplodeFlexibleParamOrderSniff.php +++ /dev/null @@ -1,323 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\ParameterValues; - -use PHPCompatibility\AbstractFunctionCallParameterSniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Passing the `$glue` and `$pieces` parameters to `implode()` in reverse order has - * been deprecated in PHP 7.4. - * - * PHP version 7.4 - * - * @link https://www.php.net/manual/en/migration74.deprecated.php#migration74.deprecated.core.implode-reverse-parameters - * @link https://wiki.php.net/rfc/deprecations_php_7_4#implode_parameter_order_mix - * @link https://php.net/manual/en/function.implode.php - * - * @since 9.3.0 - */ -class RemovedImplodeFlexibleParamOrderSniff extends AbstractFunctionCallParameterSniff -{ - - /** - * Functions to check for. - * - * @since 9.3.0 - * - * @var array - */ - protected $targetFunctions = array( - 'implode' => true, - 'join' => true, - ); - - /** - * List of PHP native constants which should be recognized as text strings. - * - * @since 9.3.0 - * - * @var array - */ - private $constantStrings = array( - 'DIRECTORY_SEPARATOR' => true, - 'PHP_EOL' => true, - ); - - /** - * List of PHP native functions which should be recognized as returning an array. - * - * Note: The array_*() functions will always be taken into account. - * - * @since 9.3.0 - * - * @var array - */ - private $arrayFunctions = array( - 'compact' => true, - 'explode' => true, - 'range' => true, - ); - - /** - * List of PHP native array functions which should *not* be recognized as returning an array. - * - * @since 9.3.0 - * - * @var array - */ - private $arrayFunctionExceptions = array( - 'array_key_exists' => true, - 'array_key_first' => true, - 'array_key_last' => true, - 'array_multisort' => true, - 'array_pop' => true, - 'array_product' => true, - 'array_push' => true, - 'array_search' => true, - 'array_shift' => true, - 'array_sum' => true, - 'array_unshift' => true, - 'array_walk_recursive' => true, - 'array_walk' => true, - ); - - - /** - * Do a version check to determine if this sniff needs to run at all. - * - * @since 9.3.0 - * - * @return bool - */ - protected function bowOutEarly() - { - return ($this->supportsAbove('7.4') === false); - } - - - /** - * Process the parameters of a matched function. - * - * @since 9.3.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the stack. - * @param string $functionName The token content (function name) which was matched. - * @param array $parameters Array with information about the parameters. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function processParameters(File $phpcsFile, $stackPtr, $functionName, $parameters) - { - if (isset($parameters[2]) === false) { - // Only one parameter, this must be $pieces. Bow out. - return; - } - - $tokens = $phpcsFile->getTokens(); - - /* - * Examine the first parameter. - * If there is any indication that this is an array declaration, we have an error. - */ - - $targetParam = $parameters[1]; - $start = $targetParam['start']; - $end = ($targetParam['end'] + 1); - $isOnlyText = true; - - $firstNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, $start, $end, true); - if ($firstNonEmpty === false) { - // Parse error. Shouldn't be possible. - return; - } - - if ($tokens[$firstNonEmpty]['code'] === \T_OPEN_PARENTHESIS) { - $start = ($firstNonEmpty + 1); - $end = $tokens[$firstNonEmpty]['parenthesis_closer']; - } - - $hasTernary = $phpcsFile->findNext(\T_INLINE_THEN, $start, $end); - if ($hasTernary !== false - && isset($tokens[$start]['nested_parenthesis'], $tokens[$hasTernary]['nested_parenthesis']) - && count($tokens[$start]['nested_parenthesis']) === count($tokens[$hasTernary]['nested_parenthesis']) - ) { - $start = ($hasTernary + 1); - } - - for ($i = $start; $i < $end; $i++) { - $tokenCode = $tokens[$i]['code']; - - if (isset(Tokens::$emptyTokens[$tokenCode])) { - continue; - } - - if ($tokenCode === \T_STRING && isset($this->constantStrings[$tokens[$i]['content']])) { - continue; - } - - if ($hasTernary !== false && $tokenCode === \T_INLINE_ELSE) { - continue; - } - - if (isset(Tokens::$stringTokens[$tokenCode]) === false) { - $isOnlyText = false; - } - - if ($tokenCode === \T_ARRAY || $tokenCode === \T_OPEN_SHORT_ARRAY || $tokenCode === \T_ARRAY_CAST) { - $this->throwNotice($phpcsFile, $stackPtr, $functionName); - return; - } - - if ($tokenCode === \T_STRING) { - /* - * Check for specific functions which return an array (i.e. $pieces). - */ - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($i + 1), $end, true); - if ($nextNonEmpty === false || $tokens[$nextNonEmpty]['code'] !== \T_OPEN_PARENTHESIS) { - continue; - } - - $nameLc = strtolower($tokens[$i]['content']); - if (isset($this->arrayFunctions[$nameLc]) === false - && (strpos($nameLc, 'array_') !== 0 - || isset($this->arrayFunctionExceptions[$nameLc]) === true) - ) { - continue; - } - - // Now make sure it's the PHP native function being called. - $prevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($i - 1), $start, true); - if ($tokens[$prevNonEmpty]['code'] === \T_DOUBLE_COLON - || $tokens[$prevNonEmpty]['code'] === \T_OBJECT_OPERATOR - ) { - // Method call, not a call to the PHP native function. - continue; - } - - if ($tokens[$prevNonEmpty]['code'] === \T_NS_SEPARATOR - && $tokens[$prevNonEmpty - 1]['code'] === \T_STRING - ) { - // Namespaced function. - continue; - } - - // Ok, so we know that there is an array function in the first param. - // 99.9% chance that this is $pieces, not $glue. - $this->throwNotice($phpcsFile, $stackPtr, $functionName); - return; - } - } - - if ($isOnlyText === true) { - // First parameter only contained text string tokens, i.e. glue. - return; - } - - /* - * Examine the second parameter. - */ - - $targetParam = $parameters[2]; - $start = $targetParam['start']; - $end = ($targetParam['end'] + 1); - - $firstNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, $start, $end, true); - if ($firstNonEmpty === false) { - // Parse error. Shouldn't be possible. - return; - } - - if ($tokens[$firstNonEmpty]['code'] === \T_OPEN_PARENTHESIS) { - $start = ($firstNonEmpty + 1); - $end = $tokens[$firstNonEmpty]['parenthesis_closer']; - } - - $hasTernary = $phpcsFile->findNext(\T_INLINE_THEN, $start, $end); - if ($hasTernary !== false - && isset($tokens[$start]['nested_parenthesis'], $tokens[$hasTernary]['nested_parenthesis']) - && count($tokens[$start]['nested_parenthesis']) === count($tokens[$hasTernary]['nested_parenthesis']) - ) { - $start = ($hasTernary + 1); - } - - for ($i = $start; $i < $end; $i++) { - $tokenCode = $tokens[$i]['code']; - - if (isset(Tokens::$emptyTokens[$tokenCode])) { - continue; - } - - if ($tokenCode === \T_ARRAY || $tokenCode === \T_OPEN_SHORT_ARRAY || $tokenCode === \T_ARRAY_CAST) { - // Found an array, $pieces is second. - return; - } - - if ($tokenCode === \T_STRING && isset($this->constantStrings[$tokens[$i]['content']])) { - // One of the special cased, PHP native string constants found. - $this->throwNotice($phpcsFile, $stackPtr, $functionName); - return; - } - - if ($tokenCode === \T_STRING || $tokenCode === \T_VARIABLE) { - // Function call, constant or variable encountered. - // No matter what this is combined with, we won't be able to reliably determine the value. - return; - } - - if ($tokenCode === \T_CONSTANT_ENCAPSED_STRING - || $tokenCode === \T_DOUBLE_QUOTED_STRING - || $tokenCode === \T_HEREDOC - || $tokenCode === \T_NOWDOC - ) { - $this->throwNotice($phpcsFile, $stackPtr, $functionName); - return; - } - } - } - - - /** - * Throw the error/warning. - * - * @since 9.3.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the stack. - * @param string $functionName The token content (function name) which was matched. - * - * @return void - */ - protected function throwNotice(File $phpcsFile, $stackPtr, $functionName) - { - $message = 'Passing the $glue and $pieces parameters in reverse order to %s has been deprecated since PHP 7.4'; - $isError = false; - $errorCode = 'Deprecated'; - $data = array($functionName); - - /* - Support for the deprecated behaviour is expected to be removed in PHP 8.0. - Once this has been implemented, this section should be uncommented. - if ($this->supportsAbove('8.0') === true) { - $message .= ' and is removed since PHP 8.0'; - $isError = true; - $errorCode = 'Removed'; - } - */ - - $message .= '; $glue should be the first parameter and $pieces the second'; - - $this->addMessage($phpcsFile, $message, $stackPtr, $isError, $errorCode, $data); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/RemovedMbStrrposEncodingThirdParamSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/RemovedMbStrrposEncodingThirdParamSniff.php deleted file mode 100644 index 7406d9a..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/RemovedMbStrrposEncodingThirdParamSniff.php +++ /dev/null @@ -1,149 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\ParameterValues; - -use PHPCompatibility\AbstractFunctionCallParameterSniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Detect passing `$encoding` to `mb_strrpos()` as 3rd argument. - * - * The `$encoding` parameter was moved from the third position to the fourth in PHP 5.2.0. - * For backward compatibility, `$encoding` could be specified as the third parameter, but doing - * so is deprecated and will be removed in the future. - * - * Between PHP 5.2 and PHP 7.3, this was a deprecation in documentation only. - * As of PHP 7.4, a deprecation warning will be thrown if an encoding is passed as the 3rd - * argument. - * As of PHP 8, the argument is expected to change to accept an integer only. - * - * PHP version 5.2 - * PHP version 7.4 - * - * @link https://www.php.net/manual/en/migration74.deprecated.php#migration74.deprecated.mbstring - * @link https://wiki.php.net/rfc/deprecations_php_7_4#mb_strrpos_with_encoding_as_3rd_argument - * @link https://www.php.net/manual/en/function.mb-strrpos.php - * - * @since 9.3.0 - */ -class RemovedMbStrrposEncodingThirdParamSniff extends AbstractFunctionCallParameterSniff -{ - - /** - * Functions to check for. - * - * @since 9.3.0 - * - * @var array - */ - protected $targetFunctions = array( - 'mb_strrpos' => true, - ); - - /** - * Tokens which should be recognized as text. - * - * @since 9.3.0 - * - * @var array - */ - private $textStringTokens = array( - \T_CONSTANT_ENCAPSED_STRING, - \T_DOUBLE_QUOTED_STRING, - \T_HEREDOC, - \T_NOWDOC, - ); - - /** - * Tokens which should be recognized as numbers. - * - * @since 9.3.0 - * - * @var array - */ - private $numberTokens = array( - \T_LNUMBER => \T_LNUMBER, - \T_DNUMBER => \T_DNUMBER, - \T_MINUS => \T_MINUS, - \T_PLUS => \T_PLUS, - ); - - - /** - * Do a version check to determine if this sniff needs to run at all. - * - * @since 9.3.0 - * - * @return bool - */ - protected function bowOutEarly() - { - return $this->supportsAbove('5.2') === false; - } - - - /** - * Process the parameters of a matched function. - * - * @since 9.3.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the stack. - * @param string $functionName The token content (function name) which was matched. - * @param array $parameters Array with information about the parameters. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function processParameters(File $phpcsFile, $stackPtr, $functionName, $parameters) - { - if (isset($parameters[3]) === false) { - // Optional third parameter not set. - return; - } - - if (isset($parameters[4]) === true) { - // Encoding set as fourth parameter. - return; - } - - $targetParam = $parameters[3]; - $targets = $this->numberTokens + Tokens::$emptyTokens; - $nonNumber = $phpcsFile->findNext($targets, $targetParam['start'], ($targetParam['end'] + 1), true); - if ($nonNumber === false) { - return; - } - - if ($this->isNumericCalculation($phpcsFile, $targetParam['start'], $targetParam['end']) === true) { - return; - } - - $hasString = $phpcsFile->findNext($this->textStringTokens, $targetParam['start'], ($targetParam['end'] + 1)); - if ($hasString === false) { - // No text strings found. Undetermined. - return; - } - - $error = 'Passing the encoding to mb_strrpos() as third parameter is soft deprecated since PHP 5.2'; - if ($this->supportsAbove('7.4') === true) { - $error .= ' and hard deprecated since PHP 7.4'; - } - - $error .= '. Use an explicit 0 as the offset in the third parameter.'; - - $phpcsFile->addWarning( - $error, - $targetParam['start'], - 'Deprecated' - ); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/RemovedMbstringModifiersSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/RemovedMbstringModifiersSniff.php deleted file mode 100644 index 83e4de9..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/RemovedMbstringModifiersSniff.php +++ /dev/null @@ -1,135 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\ParameterValues; - -use PHPCompatibility\AbstractFunctionCallParameterSniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Check for use of deprecated and removed regex modifiers for MbString regex functions. - * - * Initially just checks for the PHP 7.1 deprecated `e` modifier. - * - * PHP version 7.1 - * - * @link https://wiki.php.net/rfc/deprecate_mb_ereg_replace_eval_option - * @link https://www.php.net/manual/en/function.mb-regex-set-options.php - * - * @since 7.0.5 - * @since 7.0.8 This sniff now throws a warning instead of an error as the functionality is - * only deprecated (for now). - * @since 8.2.0 Now extends the `AbstractFunctionCallParameterSniff` instead of the base `Sniff` class. - * @since 9.0.0 Renamed from `MbstringReplaceEModifierSniff` to `RemovedMbstringModifiersSniff`. - */ -class RemovedMbstringModifiersSniff extends AbstractFunctionCallParameterSniff -{ - - /** - * Functions to check for. - * - * Key is the function name, value the parameter position of the options parameter. - * - * @since 7.0.5 - * @since 8.2.0 Renamed from `$functions` to `$targetFunctions`. - * - * @var array - */ - protected $targetFunctions = array( - 'mb_ereg_replace' => 4, - 'mb_eregi_replace' => 4, - 'mb_regex_set_options' => 1, - 'mbereg_replace' => 4, // Undocumented, but valid function alias. - 'mberegi_replace' => 4, // Undocumented, but valid function alias. - ); - - - /** - * Do a version check to determine if this sniff needs to run at all. - * - * @since 8.2.0 - * - * @return bool - */ - protected function bowOutEarly() - { - // Version used here should be the highest version from the `$newModifiers` array, - // i.e. the last PHP version in which a new modifier was introduced. - return ($this->supportsAbove('7.1') === false); - } - - - /** - * Process the parameters of a matched function. - * - * @since 7.0.5 - * @since 8.2.0 Renamed from `process()` to `processParameters()` and removed - * logic superfluous now the sniff extends the abstract. - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the stack. - * @param string $functionName The token content (function name) which was matched. - * @param array $parameters Array with information about the parameters. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function processParameters(File $phpcsFile, $stackPtr, $functionName, $parameters) - { - $tokens = $phpcsFile->getTokens(); - $functionNameLc = strtolower($functionName); - - // Check whether the options parameter in the function call is passed. - if (isset($parameters[$this->targetFunctions[$functionNameLc]]) === false) { - return; - } - - $optionsParam = $parameters[$this->targetFunctions[$functionNameLc]]; - - $stringToken = $phpcsFile->findNext(Tokens::$stringTokens, $optionsParam['start'], $optionsParam['end'] + 1); - if ($stringToken === false) { - // No string token found in the options parameter, so skip it (e.g. variable passed in). - return; - } - - $options = ''; - - /* - * Get the content of any string tokens in the options parameter and remove the quotes and variables. - */ - for ($i = $stringToken; $i <= $optionsParam['end']; $i++) { - if (isset(Tokens::$stringTokens[$tokens[$i]['code']]) === false) { - continue; - } - - $content = $this->stripQuotes($tokens[$i]['content']); - if ($tokens[$i]['code'] === \T_DOUBLE_QUOTED_STRING) { - $content = $this->stripVariables($content); - } - $content = trim($content); - - if (empty($content) === false) { - $options .= $content; - } - } - - if (strpos($options, 'e') !== false) { - $error = 'The Mbstring regex "e" modifier is deprecated since PHP 7.1.'; - - // The alternative mb_ereg_replace_callback() function is only available since 5.4.1. - if ($this->supportsBelow('5.4.1') === false) { - $error .= ' Use mb_ereg_replace_callback() instead (PHP 5.4.1+).'; - } - - $phpcsFile->addWarning($error, $stackPtr, 'Deprecated'); - } - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/RemovedNonCryptoHashSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/RemovedNonCryptoHashSniff.php deleted file mode 100644 index 832a1f6..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/RemovedNonCryptoHashSniff.php +++ /dev/null @@ -1,121 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\ParameterValues; - -use PHPCompatibility\AbstractFunctionCallParameterSniff; -use PHP_CodeSniffer_File as File; - -/** - * Detect usage of non-cryptographic hashes. - * - * "The `hash_hmac()`, `hash_hmac_file()`, `hash_pbkdf2()`, and `hash_init()` - * (with `HASH_HMAC`) functions no longer accept non-cryptographic hashes." - * - * PHP version 7.2 - * - * @link https://www.php.net/manual/en/migration72.incompatible.php#migration72.incompatible.hash-functions - * - * @since 9.0.0 - */ -class RemovedNonCryptoHashSniff extends AbstractFunctionCallParameterSniff -{ - - /** - * Functions to check for. - * - * @since 9.0.0 - * - * @var array - */ - protected $targetFunctions = array( - 'hash_hmac' => true, - 'hash_hmac_file' => true, - 'hash_init' => true, - 'hash_pbkdf2' => true, - ); - - /** - * List of the non-cryptographic hashes. - * - * @since 9.0.0 - * - * @var array - */ - protected $disabledCryptos = array( - 'adler32' => true, - 'crc32' => true, - 'crc32b' => true, - 'fnv132' => true, - 'fnv1a32' => true, - 'fnv164' => true, - 'fnv1a64' => true, - 'joaat' => true, - ); - - - /** - * Do a version check to determine if this sniff needs to run at all. - * - * @since 9.0.0 - * - * @return bool - */ - protected function bowOutEarly() - { - return ($this->supportsAbove('7.2') === false); - } - - - /** - * Process the parameters of a matched function. - * - * @since 9.0.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the stack. - * @param string $functionName The token content (function name) which was matched. - * @param array $parameters Array with information about the parameters. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function processParameters(File $phpcsFile, $stackPtr, $functionName, $parameters) - { - if (isset($parameters[1]) === false) { - return; - } - - $targetParam = $parameters[1]; - - if (isset($this->disabledCryptos[$this->stripQuotes($targetParam['raw'])]) === false) { - return; - } - - if (strtolower($functionName) === 'hash_init' - && (isset($parameters[2]) === false - || ($parameters[2]['raw'] !== 'HASH_HMAC' - && $parameters[2]['raw'] !== (string) \HASH_HMAC)) - ) { - // For hash_init(), these hashes are only disabled with HASH_HMAC set. - return; - } - - $phpcsFile->addError( - 'Non-cryptographic hashes are no longer accepted by function %s() since PHP 7.2. Found: %s', - $targetParam['start'], - $this->stringToErrorCode($functionName), - array( - $functionName, - $targetParam['raw'], - ) - ); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/RemovedPCREModifiersSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/RemovedPCREModifiersSniff.php deleted file mode 100644 index 377ed79..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/RemovedPCREModifiersSniff.php +++ /dev/null @@ -1,241 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\ParameterValues; - -use PHPCompatibility\AbstractFunctionCallParameterSniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Check for the use of deprecated and removed regex modifiers for PCRE regex functions. - * - * Initially just checks for the `e` modifier, which was deprecated since PHP 5.5 - * and removed as of PHP 7.0. - * - * {@internal If and when this sniff would need to start checking for other modifiers, a minor - * refactor will be needed as all references to the `e` modifier are currently hard-coded.} - * - * PHP version 5.5 - * PHP version 7.0 - * - * @link https://wiki.php.net/rfc/remove_preg_replace_eval_modifier - * @link https://wiki.php.net/rfc/remove_deprecated_functionality_in_php7 - * @link https://www.php.net/manual/en/reference.pcre.pattern.modifiers.php - * - * @since 5.6 - * @since 7.0.8 This sniff now throws a warning (deprecated) or an error (removed) depending - * on the `testVersion` set. Previously it would always throw an error. - * @since 8.2.0 Now extends the `AbstractFunctionCallParameterSniff` instead of the base `Sniff` class. - * @since 9.0.0 Renamed from `PregReplaceEModifierSniff` to `RemovedPCREModifiersSniff`. - */ -class RemovedPCREModifiersSniff extends AbstractFunctionCallParameterSniff -{ - - /** - * Functions to check for. - * - * @since 7.0.1 - * @since 8.2.0 Renamed from `$functions` to `$targetFunctions`. - * - * @var array - */ - protected $targetFunctions = array( - 'preg_replace' => true, - 'preg_filter' => true, - ); - - /** - * Regex bracket delimiters. - * - * @since 7.0.5 This array was originally contained within the `process()` method. - * - * @var array - */ - protected $doublesSeparators = array( - '{' => '}', - '[' => ']', - '(' => ')', - '<' => '>', - ); - - - /** - * Process the parameters of a matched function. - * - * @since 5.6 - * @since 8.2.0 Renamed from `process()` to `processParameters()` and removed - * logic superfluous now the sniff extends the abstract. - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the stack. - * @param string $functionName The token content (function name) which was matched. - * @param array $parameters Array with information about the parameters. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function processParameters(File $phpcsFile, $stackPtr, $functionName, $parameters) - { - // Check the first parameter in the function call as that should contain the regex(es). - if (isset($parameters[1]) === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - $functionNameLc = strtolower($functionName); - $firstParam = $parameters[1]; - - // Differentiate between an array of patterns passed and a single pattern. - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, $firstParam['start'], ($firstParam['end'] + 1), true); - if ($nextNonEmpty !== false && ($tokens[$nextNonEmpty]['code'] === \T_ARRAY || $tokens[$nextNonEmpty]['code'] === \T_OPEN_SHORT_ARRAY)) { - $arrayValues = $this->getFunctionCallParameters($phpcsFile, $nextNonEmpty); - if ($functionNameLc === 'preg_replace_callback_array') { - // For preg_replace_callback_array(), the patterns will be in the array keys. - foreach ($arrayValues as $value) { - $hasKey = $phpcsFile->findNext(\T_DOUBLE_ARROW, $value['start'], ($value['end'] + 1)); - if ($hasKey === false) { - continue; - } - - $value['end'] = ($hasKey - 1); - $value['raw'] = trim($phpcsFile->getTokensAsString($value['start'], ($hasKey - $value['start']))); - $this->processRegexPattern($value, $phpcsFile, $value['end'], $functionName); - } - - } else { - // Otherwise, the patterns will be in the array values. - foreach ($arrayValues as $value) { - $hasKey = $phpcsFile->findNext(\T_DOUBLE_ARROW, $value['start'], ($value['end'] + 1)); - if ($hasKey !== false) { - $value['start'] = ($hasKey + 1); - $value['raw'] = trim($phpcsFile->getTokensAsString($value['start'], (($value['end'] + 1) - $value['start']))); - } - - $this->processRegexPattern($value, $phpcsFile, $value['end'], $functionName); - } - } - - } else { - $this->processRegexPattern($firstParam, $phpcsFile, $stackPtr, $functionName); - } - } - - - /** - * Do a version check to determine if this sniff needs to run at all. - * - * @since 8.2.0 - * - * @return bool - */ - protected function bowOutEarly() - { - return ($this->supportsAbove('5.5') === false); - } - - - /** - * Analyse a potential regex pattern for use of the /e modifier. - * - * @since 7.1.2 This logic was originally contained within the `process()` method. - * - * @param array $pattern Array containing the start and end token - * pointer of the potential regex pattern and - * the raw string value of the pattern. - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * @param string $functionName The function which contained the pattern. - * - * @return void - */ - protected function processRegexPattern($pattern, File $phpcsFile, $stackPtr, $functionName) - { - $tokens = $phpcsFile->getTokens(); - - /* - * The pattern might be build up of a combination of strings, variables - * and function calls. We are only concerned with the strings. - */ - $regex = ''; - for ($i = $pattern['start']; $i <= $pattern['end']; $i++) { - if (isset(Tokens::$stringTokens[$tokens[$i]['code']]) === true) { - $content = $this->stripQuotes($tokens[$i]['content']); - if ($tokens[$i]['code'] === \T_DOUBLE_QUOTED_STRING) { - $content = $this->stripVariables($content); - } - - $regex .= trim($content); - } - } - - // Deal with multi-line regexes which were broken up in several string tokens. - if ($tokens[$pattern['start']]['line'] !== $tokens[$pattern['end']]['line']) { - $regex = $this->stripQuotes($regex); - } - - if ($regex === '') { - // No string token found in the first parameter, so skip it (e.g. if variable passed in). - return; - } - - $regexFirstChar = substr($regex, 0, 1); - - // Make sure that the character identified as the delimiter is valid. - // Otherwise, it is a false positive caused by the string concatenation. - if (preg_match('`[a-z0-9\\\\ ]`i', $regexFirstChar) === 1) { - return; - } - - if (isset($this->doublesSeparators[$regexFirstChar])) { - $regexEndPos = strrpos($regex, $this->doublesSeparators[$regexFirstChar]); - } else { - $regexEndPos = strrpos($regex, $regexFirstChar); - } - - if ($regexEndPos !== false) { - $modifiers = substr($regex, $regexEndPos + 1); - $this->examineModifiers($phpcsFile, $stackPtr, $functionName, $modifiers); - } - } - - - /** - * Examine the regex modifier string. - * - * @since 8.2.0 Split off from the `processRegexPattern()` method. - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * @param string $functionName The function which contained the pattern. - * @param string $modifiers The regex modifiers found. - * - * @return void - */ - protected function examineModifiers(File $phpcsFile, $stackPtr, $functionName, $modifiers) - { - if (strpos($modifiers, 'e') !== false) { - $error = '%s() - /e modifier is deprecated since PHP 5.5'; - $isError = false; - $errorCode = 'Deprecated'; - $data = array($functionName); - - if ($this->supportsAbove('7.0')) { - $error .= ' and removed since PHP 7.0'; - $isError = true; - $errorCode = 'Removed'; - } - - $this->addMessage($phpcsFile, $error, $stackPtr, $isError, $errorCode, $data); - } - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/RemovedSetlocaleStringSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/RemovedSetlocaleStringSniff.php deleted file mode 100644 index 6f1eced..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/ParameterValues/RemovedSetlocaleStringSniff.php +++ /dev/null @@ -1,104 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\ParameterValues; - -use PHPCompatibility\AbstractFunctionCallParameterSniff; -use PHP_CodeSniffer_File as File; - -/** - * Detect passing a string literal as `$category` to `setlocale()`. - * - * Support for the category parameter passed as a string has been removed. - * Only `LC_*` constants can be used as of PHP 7.0.0. - * - * PHP version 4.2 - * PHP version 7.0 - * - * @link https://wiki.php.net/rfc/remove_deprecated_functionality_in_php7 - * @link https://www.php.net/manual/en/function.setlocale.php#refsect1-function.setlocale-changelog - * - * @since 9.0.0 - */ -class RemovedSetlocaleStringSniff extends AbstractFunctionCallParameterSniff -{ - - /** - * Functions to check for. - * - * @since 9.0.0 - * - * @var array - */ - protected $targetFunctions = array( - 'setlocale' => true, - ); - - - /** - * Do a version check to determine if this sniff needs to run at all. - * - * @since 9.0.0 - * - * @return bool - */ - protected function bowOutEarly() - { - return ($this->supportsAbove('4.2') === false); - } - - - /** - * Process the parameters of a matched function. - * - * @since 9.0.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the stack. - * @param string $functionName The token content (function name) which was matched. - * @param array $parameters Array with information about the parameters. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function processParameters(File $phpcsFile, $stackPtr, $functionName, $parameters) - { - if (isset($parameters[1]) === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - $targetParam = $parameters[1]; - - for ($i = $targetParam['start']; $i <= $targetParam['end']; $i++) { - if ($tokens[$i]['code'] !== \T_CONSTANT_ENCAPSED_STRING - && $tokens[$i]['code'] !== \T_DOUBLE_QUOTED_STRING - ) { - continue; - } - - $message = 'Passing the $category as a string to setlocale() has been deprecated since PHP 4.2'; - $isError = false; - $errorCode = 'Deprecated'; - $data = array($targetParam['raw']); - - if ($this->supportsAbove('7.0') === true) { - $message .= ' and is removed since PHP 7.0'; - $isError = true; - $errorCode = 'Removed'; - } - - $message .= '; Pass one of the LC_* constants instead. Found: %s'; - - $this->addMessage($phpcsFile, $message, $i, $isError, $errorCode, $data); - break; - } - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/ForbiddenCallTimePassByReferenceSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/ForbiddenCallTimePassByReferenceSniff.php deleted file mode 100644 index 96b4982..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/ForbiddenCallTimePassByReferenceSniff.php +++ /dev/null @@ -1,259 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2009-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Syntax; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Detect the use of call time pass by reference. - * - * This behaviour has been deprecated in PHP 5.3 and removed in PHP 5.4. - * - * PHP version 5.4 - * - * @link https://wiki.php.net/rfc/calltimebyref - * @link https://www.php.net/manual/en/language.references.pass.php - * - * @since 5.5 - * @since 7.0.8 This sniff now throws a warning (deprecated) or an error (removed) depending - * on the `testVersion` set. Previously it would always throw an error. - */ -class ForbiddenCallTimePassByReferenceSniff extends Sniff -{ - - /** - * Tokens that represent assignments or equality comparisons. - * - * Near duplicate of Tokens::$assignmentTokens + Tokens::$equalityTokens. - * Copied in for PHPCS cross-version compatibility. - * - * @since 8.1.0 - * - * @var array - */ - private $assignOrCompare = array( - // Equality tokens. - 'T_IS_EQUAL' => true, - 'T_IS_NOT_EQUAL' => true, - 'T_IS_IDENTICAL' => true, - 'T_IS_NOT_IDENTICAL' => true, - 'T_IS_SMALLER_OR_EQUAL' => true, - 'T_IS_GREATER_OR_EQUAL' => true, - - // Assignment tokens. - 'T_EQUAL' => true, - 'T_AND_EQUAL' => true, - 'T_OR_EQUAL' => true, - 'T_CONCAT_EQUAL' => true, - 'T_DIV_EQUAL' => true, - 'T_MINUS_EQUAL' => true, - 'T_POW_EQUAL' => true, - 'T_MOD_EQUAL' => true, - 'T_MUL_EQUAL' => true, - 'T_PLUS_EQUAL' => true, - 'T_XOR_EQUAL' => true, - 'T_DOUBLE_ARROW' => true, - 'T_SL_EQUAL' => true, - 'T_SR_EQUAL' => true, - 'T_COALESCE_EQUAL' => true, - 'T_ZSR_EQUAL' => true, - ); - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 5.5 - * - * @return array - */ - public function register() - { - return array( - \T_STRING, - \T_VARIABLE, - ); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 5.5 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsAbove('5.3') === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - - // Skip tokens that are the names of functions or classes - // within their definitions. For example: function myFunction... - // "myFunction" is T_STRING but we should skip because it is not a - // function or method *call*. - $findTokens = Tokens::$emptyTokens; - $findTokens[] = \T_BITWISE_AND; - - $prevNonEmpty = $phpcsFile->findPrevious( - $findTokens, - ($stackPtr - 1), - null, - true - ); - - if ($prevNonEmpty !== false && \in_array($tokens[$prevNonEmpty]['type'], array('T_FUNCTION', 'T_CLASS', 'T_INTERFACE', 'T_TRAIT'), true)) { - return; - } - - // If the next non-whitespace token after the function or method call - // is not an opening parenthesis then it can't really be a *call*. - $openBracket = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - - if ($openBracket === false || $tokens[$openBracket]['code'] !== \T_OPEN_PARENTHESIS - || isset($tokens[$openBracket]['parenthesis_closer']) === false - ) { - return; - } - - // Get the function call parameters. - $parameters = $this->getFunctionCallParameters($phpcsFile, $stackPtr); - if (\count($parameters) === 0) { - return; - } - - // Which nesting level is the one we are interested in ? - $nestedParenthesisCount = 1; - if (isset($tokens[$openBracket]['nested_parenthesis'])) { - $nestedParenthesisCount = \count($tokens[$openBracket]['nested_parenthesis']) + 1; - } - - foreach ($parameters as $parameter) { - if ($this->isCallTimePassByReferenceParam($phpcsFile, $parameter, $nestedParenthesisCount) === true) { - // T_BITWISE_AND represents a pass-by-reference. - $error = 'Using a call-time pass-by-reference is deprecated since PHP 5.3'; - $isError = false; - $errorCode = 'Deprecated'; - - if ($this->supportsAbove('5.4')) { - $error .= ' and prohibited since PHP 5.4'; - $isError = true; - $errorCode = 'NotAllowed'; - } - - $this->addMessage($phpcsFile, $error, $parameter['start'], $isError, $errorCode); - } - } - } - - - /** - * Determine whether a parameter is passed by reference. - * - * @since 7.0.6 Split off from the `process()` method. - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param array $parameter Information on the current parameter - * to be examined. - * @param int $nestingLevel Target nesting level. - * - * @return bool - */ - protected function isCallTimePassByReferenceParam(File $phpcsFile, $parameter, $nestingLevel) - { - $tokens = $phpcsFile->getTokens(); - - $searchStartToken = $parameter['start'] - 1; - $searchEndToken = $parameter['end'] + 1; - $nextVariable = $searchStartToken; - do { - $nextVariable = $phpcsFile->findNext(array(\T_VARIABLE, \T_OPEN_SHORT_ARRAY, \T_CLOSURE), ($nextVariable + 1), $searchEndToken); - if ($nextVariable === false) { - return false; - } - - // Ignore anything within short array definition brackets. - if ($tokens[$nextVariable]['type'] === 'T_OPEN_SHORT_ARRAY' - && (isset($tokens[$nextVariable]['bracket_opener']) - && $tokens[$nextVariable]['bracket_opener'] === $nextVariable) - && isset($tokens[$nextVariable]['bracket_closer']) - ) { - // Skip forward to the end of the short array definition. - $nextVariable = $tokens[$nextVariable]['bracket_closer']; - continue; - } - - // Skip past closures passed as function parameters. - if ($tokens[$nextVariable]['type'] === 'T_CLOSURE' - && (isset($tokens[$nextVariable]['scope_condition']) - && $tokens[$nextVariable]['scope_condition'] === $nextVariable) - && isset($tokens[$nextVariable]['scope_closer']) - ) { - // Skip forward to the end of the closure declaration. - $nextVariable = $tokens[$nextVariable]['scope_closer']; - continue; - } - - // Make sure the variable belongs directly to this function call - // and is not inside a nested function call or array. - if (isset($tokens[$nextVariable]['nested_parenthesis']) === false - || (\count($tokens[$nextVariable]['nested_parenthesis']) !== $nestingLevel) - ) { - continue; - } - - // Checking this: $value = my_function(...[*]$arg...). - $tokenBefore = $phpcsFile->findPrevious( - Tokens::$emptyTokens, - ($nextVariable - 1), - $searchStartToken, - true - ); - - if ($tokenBefore === false || $tokens[$tokenBefore]['code'] !== \T_BITWISE_AND) { - // Nothing before the token or no &. - continue; - } - - if ($phpcsFile->isReference($tokenBefore) === false) { - continue; - } - - // Checking this: $value = my_function(...[*]&$arg...). - $tokenBefore = $phpcsFile->findPrevious( - Tokens::$emptyTokens, - ($tokenBefore - 1), - $searchStartToken, - true - ); - - // Prevent false positive on assign by reference and compare with reference - // within function call parameters. - if (isset($this->assignOrCompare[$tokens[$tokenBefore]['type']])) { - continue; - } - - // The found T_BITWISE_AND represents a pass-by-reference. - return true; - - } while ($nextVariable < $searchEndToken); - - // This code should never be reached, but here in case of weird bugs. - return false; - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/NewArrayStringDereferencingSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/NewArrayStringDereferencingSniff.php deleted file mode 100644 index 2cc1e55..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/NewArrayStringDereferencingSniff.php +++ /dev/null @@ -1,199 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Syntax; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Detect array and string literal dereferencing. - * - * As of PHP 5.5, array and string literals can now be dereferenced directly to - * access individual elements and characters. - * - * As of PHP 7.0, this also works when using curly braces for the dereferencing. - * While unclear, this most likely has to do with the Uniform Variable Syntax changes. - * - * PHP version 5.5 - * PHP version 7.0 - * - * @link https://www.php.net/manual/en/migration55.new-features.php#migration55.new-features.const-dereferencing - * @link https://wiki.php.net/rfc/constdereference - * @link https://wiki.php.net/rfc/uniform_variable_syntax - * @link https://www.php.net/manual/en/language.types.array.php#example-63 - * - * {@internal The reason for splitting the logic of this sniff into different methods is - * to allow re-use of the logic by the PHP 7.4 `RemovedCurlyBraceArrayAccess` sniff.} - * - * @since 7.1.4 - * @since 9.3.0 Now also detects dereferencing using curly braces. - */ -class NewArrayStringDereferencingSniff extends Sniff -{ - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 7.1.4 - * - * @return array - */ - public function register() - { - return array( - \T_ARRAY, - \T_OPEN_SHORT_ARRAY, - \T_CONSTANT_ENCAPSED_STRING, - ); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 7.1.4 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsBelow('5.6') === false) { - return; - } - - $dereferencing = $this->isArrayStringDereferencing($phpcsFile, $stackPtr); - if (empty($dereferencing)) { - return; - } - - $tokens = $phpcsFile->getTokens(); - $supports54 = $this->supportsBelow('5.4'); - - foreach ($dereferencing['braces'] as $openBrace => $closeBrace) { - if ($supports54 === true - && ($tokens[$openBrace]['type'] === 'T_OPEN_SQUARE_BRACKET' - || $tokens[$openBrace]['type'] === 'T_OPEN_SHORT_ARRAY') // Work around bug #1381 in PHPCS 2.8.1 and lower. - ) { - $phpcsFile->addError( - 'Direct array dereferencing of %s is not present in PHP version 5.4 or earlier', - $openBrace, - 'Found', - array($dereferencing['type']) - ); - - continue; - } - - // PHP 7.0 Array/string dereferencing using curly braces. - if ($tokens[$openBrace]['type'] === 'T_OPEN_CURLY_BRACKET') { - $phpcsFile->addError( - 'Direct array dereferencing of %s using curly braces is not present in PHP version 5.6 or earlier', - $openBrace, - 'FoundUsingCurlies', - array($dereferencing['type']) - ); - } - } - } - - - /** - * Check if this string/array is being dereferenced. - * - * @since 9.3.0 Logic split off from the process method. - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return array Array containing the type of access and stack pointers to the - * open/close braces involved in the array/string dereferencing; - * or an empty array if no array/string dereferencing was detected. - */ - public function isArrayStringDereferencing(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - switch ($tokens[$stackPtr]['code']) { - case \T_CONSTANT_ENCAPSED_STRING: - $type = 'string literals'; - $end = $stackPtr; - break; - - case \T_ARRAY: - if (isset($tokens[$stackPtr]['parenthesis_closer']) === false) { - // Live coding. - return array(); - } else { - $type = 'arrays'; - $end = $tokens[$stackPtr]['parenthesis_closer']; - } - break; - - case \T_OPEN_SHORT_ARRAY: - if (isset($tokens[$stackPtr]['bracket_closer']) === false) { - // Live coding. - return array(); - } else { - $type = 'arrays'; - $end = $tokens[$stackPtr]['bracket_closer']; - } - break; - } - - if (isset($type, $end) === false) { - // Shouldn't happen, but for some reason did. - return array(); - } - - $braces = array(); - - do { - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($end + 1), null, true, null, true); - if ($nextNonEmpty === false) { - break; - } - - if ($tokens[$nextNonEmpty]['type'] === 'T_OPEN_SQUARE_BRACKET' - || $tokens[$nextNonEmpty]['type'] === 'T_OPEN_CURLY_BRACKET' // PHP 7.0+. - || $tokens[$nextNonEmpty]['type'] === 'T_OPEN_SHORT_ARRAY' // Work around bug #1381 in PHPCS 2.8.1 and lower. - ) { - if (isset($tokens[$nextNonEmpty]['bracket_closer']) === false) { - // Live coding or parse error. - break; - } - - $braces[$nextNonEmpty] = $tokens[$nextNonEmpty]['bracket_closer']; - - // Continue, just in case there is nested array access, i.e. `array(1, 2, 3)[$i][$j];`. - $end = $tokens[$nextNonEmpty]['bracket_closer']; - continue; - } - - // If we're still here, we've reached the end of the variable. - break; - - } while (true); - - if (empty($braces)) { - return array(); - } - - return array( - 'type' => $type, - 'braces' => $braces, - ); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/NewArrayUnpackingSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/NewArrayUnpackingSniff.php deleted file mode 100644 index f0f66b8..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/NewArrayUnpackingSniff.php +++ /dev/null @@ -1,142 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Syntax; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Using the spread operator for unpacking arrays in array expressions is available since PHP 7.4. - * - * PHP version 7.4 - * - * @link https://www.php.net/manual/en/migration74.new-features.php#migration74.new-features.core.unpack-inside-array - * @link https://wiki.php.net/rfc/spread_operator_for_array - * - * @since 9.2.0 - */ -class NewArrayUnpackingSniff extends Sniff -{ - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 9.2.0 - * - * @return array - */ - public function register() - { - return array( - \T_ARRAY, - \T_OPEN_SHORT_ARRAY, - ); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 9.2.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsBelow('7.3') === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - - /* - * Determine the array opener & closer. - */ - $closer = $phpcsFile->numTokens; - if ($tokens[$stackPtr]['code'] === \T_ARRAY) { - if (isset($tokens[$stackPtr]['parenthesis_opener']) === false) { - return; - } - - $opener = $tokens[$stackPtr]['parenthesis_opener']; - - if (isset($tokens[$opener]['parenthesis_closer'])) { - $closer = $tokens[$opener]['parenthesis_closer']; - } - } else { - // Short array syntax. - $opener = $stackPtr; - - if (isset($tokens[$stackPtr]['bracket_closer'])) { - $closer = $tokens[$stackPtr]['bracket_closer']; - } - } - - $nestingLevel = 0; - if (isset($tokens[($opener + 1)]['nested_parenthesis'])) { - $nestingLevel = count($tokens[($opener + 1)]['nested_parenthesis']); - } - - for ($i = $opener; $i < $closer;) { - $i = $phpcsFile->findNext(array(\T_ELLIPSIS, \T_OPEN_SHORT_ARRAY, \T_ARRAY), ($i + 1), $closer); - if ($i === false) { - return; - } - - if ($tokens[$i]['code'] === \T_OPEN_SHORT_ARRAY) { - if (isset($tokens[$i]['bracket_closer']) === false) { - // Live coding, unfinished nested array, handle this when the array opener - // of the nested array is passed. - return; - } - - // Skip over nested short arrays. These will be handled when the array opener - // of the nested array is passed. - $i = $tokens[$i]['bracket_closer']; - continue; - } - - if ($tokens[$i]['code'] === \T_ARRAY) { - if (isset($tokens[$i]['parenthesis_closer']) === false) { - // Live coding, unfinished nested array, handle this when the array opener - // of the nested array is passed. - return; - } - - // Skip over nested long arrays. These will be handled when the array opener - // of the nested array is passed. - $i = $tokens[$i]['parenthesis_closer']; - continue; - } - - // Ensure this is not function call variable unpacking. - if (isset($tokens[$i]['nested_parenthesis']) - && count($tokens[$i]['nested_parenthesis']) > $nestingLevel - ) { - continue; - } - - // Ok, found one. - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($i + 1), null, true); - $snippet = trim($phpcsFile->getTokensAsString($i, (($nextNonEmpty - $i) + 1))); - $phpcsFile->addError( - 'Array unpacking within array declarations using the spread operator is not supported in PHP 7.3 or earlier. Found: %s', - $i, - 'Found', - array($snippet) - ); - } - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/NewClassMemberAccessSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/NewClassMemberAccessSniff.php deleted file mode 100644 index 218f0c9..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/NewClassMemberAccessSniff.php +++ /dev/null @@ -1,192 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Syntax; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Detect class member access on object instantiation/cloning. - * - * PHP 5.4: Class member access on instantiation has been added, e.g. `(new Foo)->bar()`. - * PHP 7.0: Class member access on cloning has been added, e.g. `(clone $foo)->bar()`. - * - * As of PHP 7.0, class member access on instantiation also works when using curly braces. - * While unclear, this most likely has to do with the Uniform Variable Syntax changes. - * - * PHP version 5.4 - * PHP version 7.0 - * - * @link https://www.php.net/manual/en/language.oop5.basic.php#example-177 - * @link https://www.php.net/manual/en/language.oop5.cloning.php#language.oop5.traits.properties.example - * @link https://www.php.net/manual/en/migration54.new-features.php - * @link https://wiki.php.net/rfc/instance-method-call - * @link https://wiki.php.net/rfc/uniform_variable_syntax - * - * {@internal The reason for splitting the logic of this sniff into different methods is - * to allow re-use of the logic by the PHP 7.4 `RemovedCurlyBraceArrayAccess` sniff.} - * - * @since 8.2.0 - * @since 9.3.0 Now also detects class member access on instantiation using curly braces. - */ -class NewClassMemberAccessSniff extends Sniff -{ - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 8.2.0 - * - * @return array - */ - public function register() - { - return array( - \T_NEW, - \T_CLONE, - ); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 8.2.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsBelow('5.6') === false) { - return; - } - - $pointers = $this->isClassMemberAccess($phpcsFile, $stackPtr); - if (empty($pointers)) { - return; - } - - $tokens = $phpcsFile->getTokens(); - $supports53 = $this->supportsBelow('5.3'); - - $error = 'Class member access on object %s was not supported in PHP %s or earlier'; - $data = array('instantiation', '5.3'); - $errorCode = 'OnNewFound'; - - if ($tokens[$stackPtr]['code'] === \T_CLONE) { - $data = array('cloning', '5.6'); - $errorCode = 'OnCloneFound'; - } - - foreach ($pointers as $open => $close) { - $itemData = $data; - $itemErrorCode = $errorCode; - - if ($tokens[$stackPtr]['code'] === \T_NEW - && $tokens[$open]['code'] !== \T_OPEN_CURLY_BRACKET - ) { - if ($supports53 === true) { - $phpcsFile->addError($error, $open, $itemErrorCode, $itemData); - } - continue; - } - - if ($tokens[$stackPtr]['code'] === \T_NEW - && $tokens[$open]['code'] === \T_OPEN_CURLY_BRACKET - ) { - // Non-curlies was already handled above. - $itemData = array('instantiation using curly braces', '5.6'); - $itemErrorCode = 'OnNewFoundUsingCurlies'; - } - - $phpcsFile->addError($error, $open, $itemErrorCode, $itemData); - } - } - - - /** - * Check if the class being instantiated/cloned is being dereferenced. - * - * @since 9.3.0 Logic split off from the process method. - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return array Array containing the stack pointers to the object operator or - * the open/close braces involved in the class member access; - * or an empty array if no class member access was detected. - */ - public function isClassMemberAccess(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['nested_parenthesis']) === false) { - // The `new className/clone $a` has to be in parentheses, without is not supported. - return array(); - } - - $parenthesisCloser = end($tokens[$stackPtr]['nested_parenthesis']); - $parenthesisOpener = key($tokens[$stackPtr]['nested_parenthesis']); - - if (isset($tokens[$parenthesisOpener]['parenthesis_owner']) === true) { - // If there is an owner, these parentheses are for a different purpose. - return array(); - } - - $prevBeforeParenthesis = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($parenthesisOpener - 1), null, true); - if ($prevBeforeParenthesis !== false && $tokens[$prevBeforeParenthesis]['code'] === \T_STRING) { - // This is most likely a function call with the new/cloned object as a parameter. - return array(); - } - - $braces = array(); - $end = $parenthesisCloser; - - do { - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($end + 1), null, true, null, true); - if ($nextNonEmpty === false) { - break; - } - - if ($tokens[$nextNonEmpty]['code'] === \T_OBJECT_OPERATOR) { - // No need to walk any further if this is object access. - $braces[$nextNonEmpty] = true; - break; - } - - if ($tokens[$nextNonEmpty]['code'] === \T_OPEN_SQUARE_BRACKET - || $tokens[$nextNonEmpty]['code'] === \T_OPEN_CURLY_BRACKET // PHP 7.0+. - ) { - if (isset($tokens[$nextNonEmpty]['bracket_closer']) === false) { - // Live coding or parse error. - break; - } - - $braces[$nextNonEmpty] = $tokens[$nextNonEmpty]['bracket_closer']; - - // Continue, just in case there is nested array access, i.e. `(new Foo())[1][0];`. - $end = $tokens[$nextNonEmpty]['bracket_closer']; - continue; - } - - // If we're still here, we've reached the end. - break; - - } while (true); - - return $braces; - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/NewDynamicAccessToStaticSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/NewDynamicAccessToStaticSniff.php deleted file mode 100644 index 4fd3b2f..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/NewDynamicAccessToStaticSniff.php +++ /dev/null @@ -1,89 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Syntax; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Detect dynamic access to static methods and properties, as well as class constants. - * - * As of PHP 5.3, static properties and methods as well as class constants - * can be accessed using a dynamic (variable) class name. - * - * PHP version 5.3 - * - * @link https://www.php.net/manual/en/migration53.new-features.php - * - * @since 8.1.0 - * @since 9.0.0 Renamed from `DynamicAccessToStaticSniff` to `NewDynamicAccessToStaticSniff`. - */ -class NewDynamicAccessToStaticSniff extends Sniff -{ - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 8.1.0 - * - * @return array - */ - public function register() - { - return array( - \T_DOUBLE_COLON, - ); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 8.1.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsBelow('5.2') === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - $prevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - - // Disregard `static::` as well. Late static binding is reported by another sniff. - if ($tokens[$prevNonEmpty]['code'] === \T_SELF - || $tokens[$prevNonEmpty]['code'] === \T_PARENT - || $tokens[$prevNonEmpty]['code'] === \T_STATIC - ) { - return; - } - - if ($tokens[$prevNonEmpty]['code'] === \T_STRING) { - $prevPrevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($prevNonEmpty - 1), null, true); - - if ($tokens[$prevPrevNonEmpty]['code'] !== \T_OBJECT_OPERATOR) { - return; - } - } - - $phpcsFile->addError( - 'Static class properties and methods, as well as class constants, could not be accessed using a dynamic (variable) classname in PHP 5.2 or earlier.', - $stackPtr, - 'Found' - ); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/NewFlexibleHeredocNowdocSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/NewFlexibleHeredocNowdocSniff.php deleted file mode 100644 index b24590a..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/NewFlexibleHeredocNowdocSniff.php +++ /dev/null @@ -1,255 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Syntax; - -use PHPCompatibility\Sniff; -use PHPCompatibility\PHPCSHelper; -use PHP_CodeSniffer_File as File; - -/** - * Detect usage of flexible heredoc/nowdoc and related cross-version incompatibilities. - * - * As of PHP 7.3: - * - The body and the closing marker of a heredoc/nowdoc can be indented; - * - The closing marker no longer needs to be on a line by itself; - * - The heredoc/nowdoc body may no longer contain the closing marker at the - * start of any of its lines. - * - * PHP version 7.3 - * - * @link https://www.php.net/manual/en/migration73.new-features.php#migration73.new-features.core.heredoc - * @link https://wiki.php.net/rfc/flexible_heredoc_nowdoc_syntaxes - * - * @since 9.0.0 - */ -class NewFlexibleHeredocNowdocSniff extends Sniff -{ - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 9.0.0 - * - * @return array - */ - public function register() - { - $targets = array( - \T_END_HEREDOC, - \T_END_NOWDOC, - ); - - if (version_compare(\PHP_VERSION_ID, '70299', '>') === false) { - // Start identifier of a PHP 7.3 flexible heredoc/nowdoc. - $targets[] = \T_STRING; - } - - return $targets; - } - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 9.0.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - /* - * Due to a tokenizer bug which gets hit when the PHP 7.3 heredoc/nowdoc syntax - * is used, this part of the sniff cannot possibly work on PHPCS < 2.6.0. - * See upstream issue #928. - */ - if ($this->supportsBelow('7.2') === true && version_compare(PHPCSHelper::getVersion(), '2.6.0', '>=')) { - $this->detectIndentedNonStandAloneClosingMarker($phpcsFile, $stackPtr); - } - - $tokens = $phpcsFile->getTokens(); - if ($this->supportsAbove('7.3') === true && $tokens[$stackPtr]['code'] !== \T_STRING) { - $this->detectClosingMarkerInBody($phpcsFile, $stackPtr); - } - } - - - /** - * Detect indented and/or non-stand alone closing markers. - * - * @since 9.0.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - protected function detectIndentedNonStandAloneClosingMarker(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $indentError = 'Heredoc/nowdoc with an indented closing marker is not supported in PHP 7.2 or earlier.'; - $indentErrorCode = 'IndentedClosingMarker'; - $trailingError = 'Having code - other than a semi-colon or new line - after the closing marker of a heredoc/nowdoc is not supported in PHP 7.2 or earlier.'; - $trailingErrorCode = 'ClosingMarkerNoNewLine'; - - if (version_compare(\PHP_VERSION_ID, '70299', '>') === true) { - - /* - * Check for indented closing marker. - */ - if (ltrim($tokens[$stackPtr]['content']) !== $tokens[$stackPtr]['content']) { - $phpcsFile->addError($indentError, $stackPtr, $indentErrorCode); - } - - /* - * Check for tokens after the closing marker. - */ - $nextNonWhitespace = $phpcsFile->findNext(array(\T_WHITESPACE, \T_SEMICOLON), ($stackPtr + 1), null, true); - if ($tokens[$stackPtr]['line'] === $tokens[$nextNonWhitespace]['line']) { - $phpcsFile->addError($trailingError, $stackPtr, $trailingErrorCode); - } - } else { - // For PHP < 7.3, we're only interested in T_STRING tokens. - if ($tokens[$stackPtr]['code'] !== \T_STRING) { - return; - } - - if (preg_match('`^<<<([\'"]?)([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\1[\r\n]+`', $tokens[$stackPtr]['content'], $matches) !== 1) { - // Not the start of a PHP 7.3 flexible heredoc/nowdoc. - return; - } - - $identifier = $matches[2]; - - for ($i = ($stackPtr + 1); $i <= $phpcsFile->numTokens; $i++) { - if ($tokens[$i]['code'] !== \T_ENCAPSED_AND_WHITESPACE) { - continue; - } - - $trimmed = ltrim($tokens[$i]['content']); - - if (strpos($trimmed, $identifier) !== 0) { - continue; - } - - // OK, we've found the PHP 7.3 flexible heredoc/nowdoc closing marker. - - /* - * Check for indented closing marker. - */ - if ($trimmed !== $tokens[$i]['content']) { - // Indent found before closing marker. - $phpcsFile->addError($indentError, $i, $indentErrorCode); - } - - /* - * Check for tokens after the closing marker. - */ - // Remove the identifier. - $afterMarker = substr($trimmed, \strlen($identifier)); - // Remove a potential semi-colon at the beginning of what's left of the string. - $afterMarker = ltrim($afterMarker, ';'); - // Remove new line characters at the end of the string. - $afterMarker = rtrim($afterMarker, "\r\n"); - - if ($afterMarker !== '') { - $phpcsFile->addError($trailingError, $i, $trailingErrorCode); - } - - break; - } - } - } - - - /** - * Detect heredoc/nowdoc identifiers at the start of lines in the heredoc/nowdoc body. - * - * @since 9.0.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - protected function detectClosingMarkerInBody(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $error = 'The body of a heredoc/nowdoc can not contain the heredoc/nowdoc closing marker as text at the start of a line since PHP 7.3.'; - $errorCode = 'ClosingMarkerNoNewLine'; - - if (version_compare(\PHP_VERSION_ID, '70299', '>') === true) { - $nextNonWhitespace = $phpcsFile->findNext(\T_WHITESPACE, ($stackPtr + 1), null, true, null, true); - if ($nextNonWhitespace === false - || $tokens[$nextNonWhitespace]['code'] === \T_SEMICOLON - || (($tokens[$nextNonWhitespace]['code'] === \T_COMMA - || $tokens[$nextNonWhitespace]['code'] === \T_STRING_CONCAT) - && $tokens[$nextNonWhitespace]['line'] !== $tokens[$stackPtr]['line']) - ) { - // This is most likely a correctly identified closing marker. - return; - } - - // The real closing tag has to be before the next heredoc/nowdoc. - $nextHereNowDoc = $phpcsFile->findNext(array(\T_START_HEREDOC, \T_START_NOWDOC), ($stackPtr + 1)); - if ($nextHereNowDoc === false) { - $nextHereNowDoc = null; - } - - $identifier = trim($tokens[$stackPtr]['content']); - $realClosingMarker = $stackPtr; - - while (($realClosingMarker = $phpcsFile->findNext(\T_STRING, ($realClosingMarker + 1), $nextHereNowDoc, false, $identifier)) !== false) { - - $prevNonWhitespace = $phpcsFile->findPrevious(\T_WHITESPACE, ($realClosingMarker - 1), null, true); - if ($prevNonWhitespace === false - || $tokens[$prevNonWhitespace]['line'] === $tokens[$realClosingMarker]['line'] - ) { - // Marker text found, but not at the start of the line. - continue; - } - - // The original T_END_HEREDOC/T_END_NOWDOC was most likely incorrect as we've found - // a possible alternative closing marker. - $phpcsFile->addError($error, $stackPtr, $errorCode); - - break; - } - - } else { - if (isset($tokens[$stackPtr]['scope_closer'], $tokens[$stackPtr]['scope_opener']) === true - && $tokens[$stackPtr]['scope_closer'] === $stackPtr - ) { - $opener = $tokens[$stackPtr]['scope_opener']; - } else { - // PHPCS < 3.0.2 did not add scope_* values for Nowdocs. - $opener = $phpcsFile->findPrevious(\T_START_NOWDOC, ($stackPtr - 1)); - if ($opener === false) { - return; - } - } - - $quotedIdentifier = preg_quote($tokens[$stackPtr]['content'], '`'); - - // Throw an error for each line in the body which starts with the identifier. - for ($i = ($opener + 1); $i < $stackPtr; $i++) { - if (preg_match('`^[ \t]*' . $quotedIdentifier . '\b`', $tokens[$i]['content']) === 1) { - $phpcsFile->addError($error, $i, $errorCode); - } - } - } - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/NewFunctionArrayDereferencingSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/NewFunctionArrayDereferencingSniff.php deleted file mode 100644 index ac5e6b7..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/NewFunctionArrayDereferencingSniff.php +++ /dev/null @@ -1,187 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Syntax; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Detect function array dereferencing as introduced in PHP 5.4. - * - * PHP 5.4 supports direct array dereferencing on the return of a method/function call. - * - * As of PHP 7.0, this also works when using curly braces for the dereferencing. - * While unclear, this most likely has to do with the Uniform Variable Syntax changes. - * - * PHP version 5.4 - * PHP version 7.0 - * - * @link https://www.php.net/manual/en/language.types.array.php#example-63 - * @link https://www.php.net/manual/en/migration54.new-features.php - * @link https://wiki.php.net/rfc/functionarraydereferencing - * @link https://wiki.php.net/rfc/uniform_variable_syntax - * - * {@internal The reason for splitting the logic of this sniff into different methods is - * to allow re-use of the logic by the PHP 7.4 RemovedCurlyBraceArrayAccess sniff.} - * - * @since 7.0.0 - * @since 9.3.0 Now also detects dereferencing using curly braces. - */ -class NewFunctionArrayDereferencingSniff extends Sniff -{ - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 7.0.0 - * - * @return array - */ - public function register() - { - return array(\T_STRING); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 7.0.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsBelow('5.6') === false) { - return; - } - - $dereferencing = $this->isFunctionArrayDereferencing($phpcsFile, $stackPtr); - if (empty($dereferencing)) { - return; - } - - $tokens = $phpcsFile->getTokens(); - $supports53 = $this->supportsBelow('5.3'); - - foreach ($dereferencing as $openBrace => $closeBrace) { - if ($supports53 === true - && $tokens[$openBrace]['type'] === 'T_OPEN_SQUARE_BRACKET' - ) { - $phpcsFile->addError( - 'Function array dereferencing is not present in PHP version 5.3 or earlier', - $openBrace, - 'Found' - ); - - continue; - } - - // PHP 7.0 function array dereferencing using curly braces. - if ($tokens[$openBrace]['type'] === 'T_OPEN_CURLY_BRACKET') { - $phpcsFile->addError( - 'Function array dereferencing using curly braces is not present in PHP version 5.6 or earlier', - $openBrace, - 'FoundUsingCurlies' - ); - } - } - } - - - /** - * Check if the return of a function/method call is being dereferenced. - * - * @since 9.3.0 Logic split off from the process method. - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return array Array containing stack pointers to the open/close braces - * involved in the function dereferencing; - * or an empty array if no function dereferencing was detected. - */ - public function isFunctionArrayDereferencing(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Next non-empty token should be the open parenthesis. - $openParenthesis = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true, null, true); - if ($openParenthesis === false || $tokens[$openParenthesis]['code'] !== \T_OPEN_PARENTHESIS) { - return array(); - } - - // Don't throw errors during live coding. - if (isset($tokens[$openParenthesis]['parenthesis_closer']) === false) { - return array(); - } - - // Is this T_STRING really a function or method call ? - $prevToken = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($prevToken !== false - && \in_array($tokens[$prevToken]['code'], array(\T_DOUBLE_COLON, \T_OBJECT_OPERATOR), true) === false - ) { - if ($tokens[$prevToken]['code'] === \T_BITWISE_AND) { - // This may be a function declared by reference. - $prevToken = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($prevToken - 1), null, true); - } - - $ignore = array( - \T_FUNCTION => true, - \T_CONST => true, - \T_USE => true, - \T_NEW => true, - \T_CLASS => true, - \T_INTERFACE => true, - ); - - if (isset($ignore[$tokens[$prevToken]['code']]) === true) { - // Not a call to a PHP function or method. - return array(); - } - } - - $current = $tokens[$openParenthesis]['parenthesis_closer']; - $braces = array(); - - do { - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($current + 1), null, true, null, true); - if ($nextNonEmpty === false) { - break; - } - - if ($tokens[$nextNonEmpty]['type'] === 'T_OPEN_SQUARE_BRACKET' - || $tokens[$nextNonEmpty]['type'] === 'T_OPEN_CURLY_BRACKET' // PHP 7.0+. - ) { - if (isset($tokens[$nextNonEmpty]['bracket_closer']) === false) { - // Live coding or parse error. - break; - } - - $braces[$nextNonEmpty] = $tokens[$nextNonEmpty]['bracket_closer']; - - // Continue, just in case there is nested array access, i.e. `echo $foo->bar()[0][2];`. - $current = $tokens[$nextNonEmpty]['bracket_closer']; - continue; - } - - // If we're still here, we've reached the end of the function call. - break; - - } while (true); - - return $braces; - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/NewFunctionCallTrailingCommaSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/NewFunctionCallTrailingCommaSniff.php deleted file mode 100644 index 39208b3..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/NewFunctionCallTrailingCommaSniff.php +++ /dev/null @@ -1,120 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Syntax; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Detect trailing comma's in function calls, `isset()` and `unset()` as allowed since PHP 7.3. - * - * PHP version 7.3 - * - * @link https://www.php.net/manual/en/migration73.new-features.php#migration73.new-features.core.trailing-commas - * @link https://wiki.php.net/rfc/trailing-comma-function-calls - * - * @since 8.2.0 - * @since 9.0.0 Renamed from `NewTrailingCommaSniff` to `NewFunctionCallTrailingCommaSniff`. - */ -class NewFunctionCallTrailingCommaSniff extends Sniff -{ - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 8.2.0 - * - * @return array - */ - public function register() - { - return array( - \T_STRING, - \T_VARIABLE, - \T_ISSET, - \T_UNSET, - ); - } - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 8.2.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsBelow('7.2') === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($tokens[$nextNonEmpty]['code'] !== \T_OPEN_PARENTHESIS - || isset($tokens[$nextNonEmpty]['parenthesis_closer']) === false - ) { - return; - } - - if ($tokens[$stackPtr]['code'] === \T_STRING) { - $ignore = array( - \T_FUNCTION => true, - \T_CONST => true, - \T_USE => true, - ); - - $prevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if (isset($ignore[$tokens[$prevNonEmpty]['code']]) === true) { - // Not a function call. - return; - } - } - - $closer = $tokens[$nextNonEmpty]['parenthesis_closer']; - $lastInParenthesis = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($closer - 1), $nextNonEmpty, true); - - if ($tokens[$lastInParenthesis]['code'] !== \T_COMMA) { - return; - } - - $data = array(); - switch ($tokens[$stackPtr]['code']) { - case \T_ISSET: - $data[] = 'calls to isset()'; - $errorCode = 'FoundInIsset'; - break; - - case \T_UNSET: - $data[] = 'calls to unset()'; - $errorCode = 'FoundInUnset'; - break; - - default: - $data[] = 'function calls'; - $errorCode = 'FoundInFunctionCall'; - break; - } - - $phpcsFile->addError( - 'Trailing comma\'s are not allowed in %s in PHP 7.2 or earlier', - $lastInParenthesis, - $errorCode, - $data - ); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/NewShortArraySniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/NewShortArraySniff.php deleted file mode 100644 index c60ba5c..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/NewShortArraySniff.php +++ /dev/null @@ -1,77 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Syntax; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; - -/** - * Detect use of short array syntax which is available since PHP 5.4. - * - * PHP version 5.4 - * - * @link https://wiki.php.net/rfc/shortsyntaxforarrays - * @link https://www.php.net/manual/en/language.types.array.php#language.types.array.syntax - * - * @since 7.0.0 - * @since 9.0.0 Renamed from `ShortArraySniff` to `NewShortArraySniff`. - */ -class NewShortArraySniff extends Sniff -{ - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 7.0.0 - * - * @return array - */ - public function register() - { - return array( - \T_OPEN_SHORT_ARRAY, - \T_CLOSE_SHORT_ARRAY, - ); - } - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 7.0.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsBelow('5.3') === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - $token = $tokens[$stackPtr]; - - $error = '%s is not supported in PHP 5.3 or lower'; - $data = array(); - - if ($token['type'] === 'T_OPEN_SHORT_ARRAY') { - $data[] = 'Short array syntax (open)'; - } elseif ($token['type'] === 'T_CLOSE_SHORT_ARRAY') { - $data[] = 'Short array syntax (close)'; - } - - $phpcsFile->addError($error, $stackPtr, 'Found', $data); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/RemovedCurlyBraceArrayAccessSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/RemovedCurlyBraceArrayAccessSniff.php deleted file mode 100644 index b2c29e5..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/RemovedCurlyBraceArrayAccessSniff.php +++ /dev/null @@ -1,362 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Syntax; - -use PHPCompatibility\Sniff; -use PHPCompatibility\Sniffs\Syntax\NewArrayStringDereferencingSniff; -use PHPCompatibility\Sniffs\Syntax\NewClassMemberAccessSniff; -use PHPCompatibility\Sniffs\Syntax\NewFunctionArrayDereferencingSniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Using the curly brace syntax to access array or string offsets has been deprecated in PHP 7.4. - * - * PHP version 7.4 - * - * @link https://www.php.net/manual/en/migration74.deprecated.php#migration74.deprecated.core.array-string-access-curly-brace - * @link https://wiki.php.net/rfc/deprecate_curly_braces_array_access - * - * @since 9.3.0 - */ -class RemovedCurlyBraceArrayAccessSniff extends Sniff -{ - - /** - * Instance of the NewArrayStringDereferencing sniff. - * - * @since 9.3.0 - * - * @var \PHPCompatibility\Sniffs\Syntax\NewArrayStringDereferencingSniff - */ - private $newArrayStringDereferencing; - - /** - * Target tokens as register by the NewArrayStringDereferencing sniff. - * - * @since 9.3.0 - * - * @var array - */ - private $newArrayStringDereferencingTargets; - - /** - * Instance of the NewClassMemberAccess sniff. - * - * @since 9.3.0 - * - * @var \PHPCompatibility\Sniffs\Syntax\NewClassMemberAccessSniff - */ - private $newClassMemberAccess; - - /** - * Target tokens as register by the NewClassMemberAccess sniff. - * - * @since 9.3.0 - * - * @var array - */ - private $newClassMemberAccessTargets; - - /** - * Instance of the NewFunctionArrayDereferencing sniff. - * - * @since 9.3.0 - * - * @var \PHPCompatibility\Sniffs\Syntax\NewFunctionArrayDereferencingSniff - */ - private $newFunctionArrayDereferencing; - - /** - * Target tokens as register by the NewFunctionArrayDereferencing sniff. - * - * @since 9.3.0 - * - * @var array - */ - private $newFunctionArrayDereferencingTargets; - - - /** - * Constructor. - * - * @since 9.3.0 - */ - public function __construct() - { - $this->newArrayStringDereferencing = new NewArrayStringDereferencingSniff(); - $this->newClassMemberAccess = new NewClassMemberAccessSniff(); - $this->newFunctionArrayDereferencing = new NewFunctionArrayDereferencingSniff(); - } - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 9.3.0 - * - * @return array - */ - public function register() - { - $targets = array( - array( - \T_VARIABLE, - \T_STRING, // Constants. - ), - ); - - // Registers T_ARRAY, T_OPEN_SHORT_ARRAY and T_CONSTANT_ENCAPSED_STRING. - $additionalTargets = $this->newArrayStringDereferencing->register(); - $this->newArrayStringDereferencingTargets = array_flip($additionalTargets); - $targets[] = $additionalTargets; - - // Registers T_NEW and T_CLONE. - $additionalTargets = $this->newClassMemberAccess->register(); - $this->newClassMemberAccessTargets = array_flip($additionalTargets); - $targets[] = $additionalTargets; - - // Registers T_STRING. - $additionalTargets = $this->newFunctionArrayDereferencing->register(); - $this->newFunctionArrayDereferencingTargets = array_flip($additionalTargets); - $targets[] = $additionalTargets; - - return call_user_func_array('array_merge', $targets); - } - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 9.3.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsAbove('7.4') === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - $braces = array(); - - // Note: Overwriting braces in each `if` is fine as only one will match anyway. - if ($tokens[$stackPtr]['code'] === \T_VARIABLE) { - $braces = $this->isVariableArrayAccess($phpcsFile, $stackPtr); - } - - if (isset($this->newArrayStringDereferencingTargets[$tokens[$stackPtr]['code']])) { - $dereferencing = $this->newArrayStringDereferencing->isArrayStringDereferencing($phpcsFile, $stackPtr); - if (isset($dereferencing['braces'])) { - $braces = $dereferencing['braces']; - } - } - - if (isset($this->newClassMemberAccessTargets[$tokens[$stackPtr]['code']])) { - $braces = $this->newClassMemberAccess->isClassMemberAccess($phpcsFile, $stackPtr); - } - - if (isset($this->newFunctionArrayDereferencingTargets[$tokens[$stackPtr]['code']])) { - $braces = $this->newFunctionArrayDereferencing->isFunctionArrayDereferencing($phpcsFile, $stackPtr); - } - - if (empty($braces) && $tokens[$stackPtr]['code'] === \T_STRING) { - $braces = $this->isConstantArrayAccess($phpcsFile, $stackPtr); - } - - if (empty($braces)) { - return; - } - - foreach ($braces as $open => $close) { - // Some of the functions will sniff for both curlies as well as square braces. - if ($tokens[$open]['code'] !== \T_OPEN_CURLY_BRACKET) { - continue; - } - - // Make sure there is something between the braces, otherwise it's still not curly brace array access. - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($open + 1), $close, true); - if ($nextNonEmpty === false) { - // Nothing between the brackets. Parse error. Ignore. - continue; - } - - // OK, so we've found curly brace array access. - $snippet = $phpcsFile->getTokensAsString($stackPtr, (($close - $stackPtr) + 1)); - $fix = $phpcsFile->addFixableWarning( - 'Curly brace syntax for accessing array elements and string offsets has been deprecated in PHP 7.4. Found: %s', - $open, - 'Found', - array($snippet) - ); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($open, '['); - $phpcsFile->fixer->replaceToken($close, ']'); - $phpcsFile->fixer->endChangeset(); - } - } - } - - - /** - * Determine whether a variable is being dereferenced using curly brace syntax. - * - * @since 9.3.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return array An array with the stack pointers to the open/close braces of - * the curly brace array access, or an empty array if no curly - * brace array access was detected. - */ - protected function isVariableArrayAccess(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $current = $stackPtr; - $braces = array(); - - do { - $current = $phpcsFile->findNext(Tokens::$emptyTokens, ($current + 1), null, true); - if ($current === false) { - break; - } - - // Skip over square bracket array access. Bracket styles can be mixed. - if ($tokens[$current]['code'] === \T_OPEN_SQUARE_BRACKET - && isset($tokens[$current]['bracket_closer']) === true - && $current === $tokens[$current]['bracket_opener'] - ) { - $current = $tokens[$current]['bracket_closer']; - continue; - } - - // Handle property access. - if ($tokens[$current]['code'] === \T_OBJECT_OPERATOR) { - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($current + 1), null, true); - if ($nextNonEmpty === false || $tokens[$nextNonEmpty]['code'] !== \T_STRING) { - // Live coding or parse error. - break; - } - - $current = $nextNonEmpty; - continue; - } - - if ($tokens[$current]['code'] === \T_OPEN_CURLY_BRACKET) { - if (isset($tokens[$current]['bracket_closer']) === false) { - // Live coding or parse error. - break; - } - - $braces[$current] = $tokens[$current]['bracket_closer']; - - // Continue, just in case there is nested access using curly braces, i.e. `$a{$i}{$j};`. - $current = $tokens[$current]['bracket_closer']; - continue; - } - - // If we're still here, we've reached the end of the variable. - break; - - } while (true); - - return $braces; - } - - - /** - * Determine whether a T_STRING is a constant being dereferenced using curly brace syntax. - * - * {@internal Note: the first braces for array access to a constant, for some unknown reason, - * can never be curlies, but have to be square brackets. - * Subsequent braces can be curlies.} - * - * @since 9.3.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return array An array with the stack pointers to the open/close braces of - * the curly brace array access, or an empty array if no curly - * brace array access was detected. - */ - protected function isConstantArrayAccess(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $prevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - - if ($this->isUseOfGlobalConstant($phpcsFile, $stackPtr) === false - && $tokens[$prevNonEmpty]['code'] !== \T_DOUBLE_COLON // Class constant access. - ) { - return array(); - } - - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($nextNonEmpty === false) { - return array(); - } - - if ($tokens[$nextNonEmpty]['code'] !== \T_OPEN_SQUARE_BRACKET - || isset($tokens[$nextNonEmpty]['bracket_closer']) === false - ) { - // Array access for constants must start with square brackets. - return array(); - } - - $current = $tokens[$nextNonEmpty]['bracket_closer']; - $braces = array(); - - do { - $current = $phpcsFile->findNext(Tokens::$emptyTokens, ($current + 1), null, true); - if ($current === false) { - break; - } - - // Skip over square bracket array access. Bracket styles can be mixed. - if ($tokens[$current]['code'] === \T_OPEN_SQUARE_BRACKET - && isset($tokens[$current]['bracket_closer']) === true - && $current === $tokens[$current]['bracket_opener'] - ) { - $current = $tokens[$current]['bracket_closer']; - continue; - } - - if ($tokens[$current]['code'] === \T_OPEN_CURLY_BRACKET) { - if (isset($tokens[$current]['bracket_closer']) === false) { - // Live coding or parse error. - break; - } - - $braces[$current] = $tokens[$current]['bracket_closer']; - - // Continue, just in case there is nested access using curly braces, i.e. `$a{$i}{$j};`. - $current = $tokens[$current]['bracket_closer']; - continue; - } - - // If we're still here, we've reached the end of the variable. - break; - - } while (true); - - return $braces; - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/RemovedNewReferenceSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/RemovedNewReferenceSniff.php deleted file mode 100644 index ad76828..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Syntax/RemovedNewReferenceSniff.php +++ /dev/null @@ -1,80 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Syntax; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Detect the use of assigning the return value of `new` by reference. - * - * This syntax has been deprecated since PHP 5.3 and removed in PHP 7.0. - * - * PHP version 5.3 - * PHP version 7.0 - * - * @link https://wiki.php.net/rfc/remove_deprecated_functionality_in_php7 - * - * @since 5.5 - * @since 9.0.0 Renamed from `DeprecatedNewReferenceSniff` to `RemovedNewReferenceSniff`. - */ -class RemovedNewReferenceSniff extends Sniff -{ - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 5.5 - * - * @return array - */ - public function register() - { - return array(\T_NEW); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 5.5 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsAbove('5.3') === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - $prevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($prevNonEmpty === false || $tokens[$prevNonEmpty]['type'] !== 'T_BITWISE_AND') { - return; - } - - $error = 'Assigning the return value of new by reference is deprecated in PHP 5.3'; - $isError = false; - $errorCode = 'Deprecated'; - - if ($this->supportsAbove('7.0') === true) { - $error .= ' and has been removed in PHP 7.0'; - $isError = true; - $errorCode = 'Removed'; - } - - $this->addMessage($phpcsFile, $error, $stackPtr, $isError, $errorCode); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/TextStrings/NewUnicodeEscapeSequenceSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/TextStrings/NewUnicodeEscapeSequenceSniff.php deleted file mode 100644 index aa5a39a..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/TextStrings/NewUnicodeEscapeSequenceSniff.php +++ /dev/null @@ -1,162 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\TextStrings; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_Exception as PHPCS_Exception; -use PHP_CodeSniffer_File as File; - -/** - * PHP 7.0 introduced a Unicode codepoint escape sequence. - * - * Strings containing a literal `\u{` followed by an invalid sequence will cause a - * fatal error as of PHP 7.0. - * - * PHP version 7.0 - * - * @link https://www.php.net/manual/en/migration70.new-features.php#migration70.new-features.unicode-codepoint-escape-syntax - * @link https://www.php.net/manual/en/migration70.incompatible.php#migration70.incompatible.strings.unicode-escapes - * @link https://wiki.php.net/rfc/unicode_escape - * @link https://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.double - * - * @since 9.3.0 - */ -class NewUnicodeEscapeSequenceSniff extends Sniff -{ - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 9.3.0 - * - * @return array - */ - public function register() - { - return array( - \T_CONSTANT_ENCAPSED_STRING, - \T_DOUBLE_QUOTED_STRING, - \T_HEREDOC, - ); - } - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 9.3.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Check whether this is a single quoted or double quoted string. - if ($tokens[$stackPtr]['code'] === \T_CONSTANT_ENCAPSED_STRING) { - - // Find the start of the - potentially multi-line - text string. - $start = $stackPtr; - for ($i = ($stackPtr - 1); $i >= 0; $i--) { - if ($tokens[$i]['code'] === \T_WHITESPACE) { - continue; - } - - if ($tokens[$i]['code'] === \T_CONSTANT_ENCAPSED_STRING) { - $start = $i; - continue; - } - - break; - } - - try { - $textString = $this->getCompleteTextString($phpcsFile, $start, false); - } catch (PHPCS_Exception $e) { - // Something went wrong determining the start of the text string. - return; - } - - $startQuote = $textString[0]; - $endQuote = substr($textString, -1); - if (($startQuote === "'" && $endQuote === "'") - || $startQuote !== $endQuote - ) { - // Single quoted string, not our concern. - return; - } - } - - $content = $this->stripQuotes($tokens[$stackPtr]['content']); - $count = preg_match_all('`(?<!\\\\)\\\\u\{([^}\n\r]*)(\})?`', $content, $matches, \PREG_SET_ORDER); - if ($count === false || $count === 0) { - return; - } - - foreach ($matches as $match) { - $valid = false; // If the close curly is missing, we have an incomplete escape sequence. - if (isset($match[2])) { - $valid = $this->isValidUnicodeEscapeSequence($match[1]); - } - - if ($this->supportsBelow('5.6') === true && $valid === true) { - $phpcsFile->addError( - 'Unicode codepoint escape sequences are not supported in PHP 5.6 or earlier. Found: %s', - $stackPtr, - 'Found', - array($match[0]) - ); - } - - if ($this->supportsAbove('7.0') === true && $valid === false) { - $phpcsFile->addError( - 'Strings containing a literal \u{ followed by an invalid unicode codepoint escape sequence will cause a fatal error in PHP 7.0 and above. Escape the leading backslash to prevent this. Found: %s', - $stackPtr, - 'Invalid', - array($match[0]) - ); - } - } - } - - - /** - * Verify if the codepoint in a unicode escape sequence is valid. - * - * @since 9.3.0 - * - * @param string $codepoint The codepoint as a string. - * - * @return bool - */ - protected function isValidUnicodeEscapeSequence($codepoint) - { - if (trim($codepoint) === '') { - return false; - } - - // Check if it's a valid hex codepoint. - if (preg_match('`^[0-9A-F]+$`iD', $codepoint, $match) !== 1) { - return false; - } - - if (hexdec($codepoint) > 1114111) { - // Outside of the maximum permissable range. - return false; - } - - return true; - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/TypeCasts/NewTypeCastsSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/TypeCasts/NewTypeCastsSniff.php deleted file mode 100644 index 12e4731..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/TypeCasts/NewTypeCastsSniff.php +++ /dev/null @@ -1,222 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\TypeCasts; - -use PHPCompatibility\AbstractNewFeatureSniff; -use PHPCompatibility\PHPCSHelper; -use PHP_CodeSniffer_File as File; - -/** - * Detect use of newly introduced type casts. - * - * PHP version All - * - * @link https://www.php.net/manual/en/language.types.type-juggling.php#language.types.typecasting - * - * @since 8.0.1 - */ -class NewTypeCastsSniff extends AbstractNewFeatureSniff -{ - - /** - * A list of new type casts, not present in older versions. - * - * The array lists : version number with false (not present) or true (present). - * If's sufficient to list the first version where the keyword appears. - * - * @since 8.0.1 - * - * @var array(string => array(string => bool|string)) - */ - protected $newTypeCasts = array( - 'T_UNSET_CAST' => array( - '4.4' => false, - '5.0' => true, - 'description' => 'The unset cast', - ), - 'T_BINARY_CAST' => array( - '5.2.0' => false, - '5.2.1' => true, - 'description' => 'The binary cast', - ), - ); - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 8.0.1 - * - * @return array - */ - public function register() - { - $tokens = array(); - foreach ($this->newTypeCasts as $token => $versions) { - if (\defined($token)) { - $tokens[] = constant($token); - } - } - - /* - * Work around tokenizer issues. - * - * - (binary) cast is incorrectly tokenized as T_STRING_CAST by PHP and PHPCS. - * - b"something" binary cast is incorrectly tokenized as T_CONSTANT_ENCAPSED_STRING by PHP and PHPCS. - * - Since PHPCS 3.4.0, PHPCS *will* tokenize these correctly. - * - * @link https://github.com/squizlabs/PHP_CodeSniffer/issues/1574 - */ - if (version_compare(PHPCSHelper::getVersion(), '3.4.0', '<') === true) { - $tokens[] = \T_STRING_CAST; - $tokens[] = \T_CONSTANT_ENCAPSED_STRING; - } - - return $tokens; - } - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 8.0.1 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $tokenType = $tokens[$stackPtr]['type']; - - // Detect incorrectly tokenized binary casts. - if (isset($this->newTypeCasts[$tokenType]) === false) { - $tokenContent = $tokens[$stackPtr]['content']; - switch ($tokenType) { - case 'T_STRING_CAST': - if (preg_match('`^\(\s*binary\s*\)$`i', $tokenContent) !== 1) { - return; - } - - $tokenType = 'T_BINARY_CAST'; - break; - - case 'T_CONSTANT_ENCAPSED_STRING': - if ((strpos($tokenContent, 'b"') === 0 && substr($tokenContent, -1) === '"') - || (strpos($tokenContent, "b'") === 0 && substr($tokenContent, -1) === "'") - ) { - $tokenType = 'T_BINARY_CAST'; - } else { - return; - } - break; - - } - } - - // If the translation did not yield one of the tokens we are looking for, bow out. - if (isset($this->newTypeCasts[$tokenType]) === false) { - return; - } - - $itemInfo = array( - 'name' => $tokenType, - 'content' => $tokens[$stackPtr]['content'], - ); - $this->handleFeature($phpcsFile, $stackPtr, $itemInfo); - } - - - /** - * Get the relevant sub-array for a specific item from a multi-dimensional array. - * - * @since 8.0.1 - * - * @param array $itemInfo Base information about the item. - * - * @return array Version and other information about the item. - */ - public function getItemArray(array $itemInfo) - { - return $this->newTypeCasts[$itemInfo['name']]; - } - - - /** - * Get an array of the non-PHP-version array keys used in a sub-array. - * - * @since 8.0.1 - * - * @return array - */ - protected function getNonVersionArrayKeys() - { - return array('description'); - } - - - /** - * Retrieve the relevant detail (version) information for use in an error message. - * - * @since 8.0.1 - * - * @param array $itemArray Version and other information about the item. - * @param array $itemInfo Base information about the item. - * - * @return array - */ - public function getErrorInfo(array $itemArray, array $itemInfo) - { - $errorInfo = parent::getErrorInfo($itemArray, $itemInfo); - $errorInfo['description'] = $itemArray['description']; - - return $errorInfo; - } - - - /** - * Filter the error message before it's passed to PHPCS. - * - * @since 8.0.1 - * - * @param string $error The error message which was created. - * @param array $itemInfo Base information about the item this error message applies to. - * @param array $errorInfo Detail information about an item this error message applies to. - * - * @return string - */ - protected function filterErrorMsg($error, array $itemInfo, array $errorInfo) - { - return $error . '. Found: %s'; - } - - - /** - * Filter the error data before it's passed to PHPCS. - * - * @since 8.0.1 - * - * @param array $data The error data array which was created. - * @param array $itemInfo Base information about the item this error message applies to. - * @param array $errorInfo Detail information about an item this error message applies to. - * - * @return array - */ - protected function filterErrorData(array $data, array $itemInfo, array $errorInfo) - { - $data[0] = $errorInfo['description']; - $data[] = $itemInfo['content']; - return $data; - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/TypeCasts/RemovedTypeCastsSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/TypeCasts/RemovedTypeCastsSniff.php deleted file mode 100644 index 3791f0b..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/TypeCasts/RemovedTypeCastsSniff.php +++ /dev/null @@ -1,158 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\TypeCasts; - -use PHPCompatibility\AbstractRemovedFeatureSniff; -use PHP_CodeSniffer_File as File; - -/** - * Detect use of deprecated/removed type casts. - * - * PHP version All - * - * @link https://www.php.net/manual/en/language.types.type-juggling.php#language.types.typecasting - * @link https://wiki.php.net/rfc/deprecations_php_7_2#unset_cast - * @link https://wiki.php.net/rfc/deprecations_php_7_4#the_real_type - * - * @since 8.0.1 - * @since 9.0.0 Renamed from `DeprecatedTypeCastsSniff` to `RemovedTypeCastsSniff`. - */ -class RemovedTypeCastsSniff extends AbstractRemovedFeatureSniff -{ - /** - * A list of deprecated and removed type casts with their alternatives. - * - * The array lists : version number with false (deprecated) or true (removed) and an alternative function. - * If no alternative exists, it is NULL, i.e, the function should just not be used. - * - * @since 8.0.1 - * - * @var array(string => array(string => bool|string)) - */ - protected $deprecatedTypeCasts = array( - 'T_UNSET_CAST' => array( - '7.2' => false, - 'alternative' => 'unset()', - 'description' => 'unset', - ), - 'T_DOUBLE_CAST' => array( - '7.4' => false, - 'alternative' => '(float)', - 'description' => 'real', - ), - ); - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 8.0.1 - * - * @return array - */ - public function register() - { - $tokens = array(); - foreach ($this->deprecatedTypeCasts as $token => $versions) { - $tokens[] = constant($token); - } - - return $tokens; - } - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 8.0.1 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $tokenType = $tokens[$stackPtr]['type']; - - // Special case `T_DOUBLE_CAST` as the same token is used for (float) and (double) casts. - if ($tokenType === 'T_DOUBLE_CAST' && strpos($tokens[$stackPtr]['content'], 'real') === false) { - // Float/double casts, not (real) cast. - return; - } - - $itemInfo = array( - 'name' => $tokenType, - 'description' => $this->deprecatedTypeCasts[$tokenType]['description'], - ); - $this->handleFeature($phpcsFile, $stackPtr, $itemInfo); - } - - - /** - * Get an array of the non-PHP-version array keys used in a sub-array. - * - * @since 8.0.1 - * - * @return array - */ - protected function getNonVersionArrayKeys() - { - return array('description', 'alternative'); - } - - /** - * Get the relevant sub-array for a specific item from a multi-dimensional array. - * - * @since 8.0.1 - * - * @param array $itemInfo Base information about the item. - * - * @return array Version and other information about the item. - */ - public function getItemArray(array $itemInfo) - { - return $this->deprecatedTypeCasts[$itemInfo['name']]; - } - - - /** - * Get the error message template for this sniff. - * - * @since 8.0.1 - * - * @return string - */ - protected function getErrorMsgTemplate() - { - return 'The %s cast is '; - } - - - /** - * Filter the error data before it's passed to PHPCS. - * - * @since 8.0.1 - * - * @param array $data The error data array which was created. - * @param array $itemInfo Base information about the item this error message applies to. - * @param array $errorInfo Detail information about an item this error message applies to. - * - * @return array - */ - protected function filterErrorData(array $data, array $itemInfo, array $errorInfo) - { - $data[0] = $itemInfo['description']; - return $data; - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Upgrade/LowPHPCSSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Upgrade/LowPHPCSSniff.php deleted file mode 100644 index 1e79873..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Upgrade/LowPHPCSSniff.php +++ /dev/null @@ -1,187 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Upgrade; - -use PHPCompatibility\Sniff; -use PHPCompatibility\PHPCSHelper; -use PHP_CodeSniffer_File as File; - -/** - * Add a notification for users of low PHPCS versions. - * - * Originally PHPCompatibility supported PHPCS 1.5.x, 2.x and since PHPCompatibility 8.0.0, 3.x. - * Support for PHPCS < 2.3.0 has been dropped in PHPCompatibility 9.0.0. - * - * The standard will - up to a point - still work for users of lower - * PHPCS versions, but will give less accurate results and may throw - * notices and warnings (or even fatal out). - * - * This sniff adds an explicit error/warning for users of the standard - * using a PHPCS version below the recommended version. - * - * @link https://github.com/PHPCompatibility/PHPCompatibility/issues/688 - * @link https://github.com/PHPCompatibility/PHPCompatibility/issues/835 - * - * @since 8.2.0 - */ -class LowPHPCSSniff extends Sniff -{ - /** - * The minimum supported PHPCS version. - * - * Users on PHPCS versions below this will see an ERROR message. - * - * @since 8.2.0 - * @since 9.3.0 Changed from $minSupportedVersion property to a constant. - * - * @var string - */ - const MIN_SUPPORTED_VERSION = '2.3.0'; - - /** - * The minimum recommended PHPCS version. - * - * Users on PHPCS versions below this will see a WARNING. - * - * @since 8.2.0 - * @since 9.3.0 Changed from $minRecommendedVersion property to a constant. - * - * @var string - */ - const MIN_RECOMMENDED_VERSION = '2.6.0'; - - /** - * Keep track of whether this sniff needs to actually run. - * - * This will be set to `false` when either a high enough PHPCS - * version is detected or once the error/warning has been thrown, - * to make sure that the notice will only be thrown once per run. - * - * @since 8.2.0 - * - * @var bool - */ - private $examine = true; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 8.2.0 - * - * @return array - */ - public function register() - { - return array( - \T_OPEN_TAG, - ); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 8.2.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function process(File $phpcsFile, $stackPtr) - { - // Don't do anything if the warning has already been thrown or is not necessary. - if ($this->examine === false) { - return ($phpcsFile->numTokens + 1); - } - - $phpcsVersion = PHPCSHelper::getVersion(); - - // Don't do anything if the PHPCS version used is above the minimum recommended version. - if (version_compare($phpcsVersion, self::MIN_RECOMMENDED_VERSION, '>=')) { - $this->examine = false; - return ($phpcsFile->numTokens + 1); - } - - if (version_compare($phpcsVersion, self::MIN_SUPPORTED_VERSION, '<')) { - $isError = true; - $message = 'IMPORTANT: Please be advised that the minimum PHP_CodeSniffer version the PHPCompatibility standard supports is %s. You are currently using PHP_CodeSniffer %s. Please upgrade your PHP_CodeSniffer installation. The recommended version of PHP_CodeSniffer for PHPCompatibility is %s or higher.'; - $errorCode = 'Unsupported_' . $this->stringToErrorCode(self::MIN_SUPPORTED_VERSION); - $replacements = array( - self::MIN_SUPPORTED_VERSION, - $phpcsVersion, - self::MIN_RECOMMENDED_VERSION, - $errorCode, - ); - } else { - $isError = false; - $message = 'IMPORTANT: Please be advised that for the most reliable PHPCompatibility results, PHP_CodeSniffer %s or higher should be used. Support for lower versions will be dropped in the foreseeable future. You are currently using PHP_CodeSniffer %s. Please upgrade your PHP_CodeSniffer installation to version %s or higher.'; - $errorCode = 'BelowRecommended_' . $this->stringToErrorCode(self::MIN_RECOMMENDED_VERSION); - $replacements = array( - self::MIN_RECOMMENDED_VERSION, - $phpcsVersion, - self::MIN_RECOMMENDED_VERSION, - $errorCode, - ); - } - - /* - * Figure out the report width to determine how long the delimiter lines should be. - * - * This is not an exact calculation as there are a number of unknowns at the time the - * notice is thrown (whether there are other notices for the file, whether those are - * warnings or errors, whether there are auto-fixable issues etc). - * - * In other words, this is just an approximation to get a reasonably stable and - * readable message layout format. - * - * {@internal - * PHPCS has had some changes as to how the messages display over the years. - * Most significantly in 2.4.0 it was attempted to solve an issue with messages - * containing new lines. Unfortunately, that solution is buggy. - * An improved version has been pulled upstream and will hopefully make it - * into PHPCS 3.3.1/3.4.0. - * - * Anyway, this means that instead of new lines, delimiter lines will be used to improved - * the readability of the (long) message. - * - * Also, as of PHPCS 2.2.0, the report width when using the `-s` option is 8 wider than - * it should be. A patch for that is included in the same upstream PR. - * - * If/when the upstream PR has been merged and the minimum supported/recommended version - * of PHPCompatibility would go beyond that, the below code should be adjusted.} - */ - $reportWidth = PHPCSHelper::getCommandLineData($phpcsFile, 'reportWidth'); - if (empty($reportWidth)) { - $reportWidth = 80; - } - $showSources = PHPCSHelper::getCommandLineData($phpcsFile, 'showSources'); - if ($showSources === true) { - $reportWidth += 6; - } - - $messageWidth = ($reportWidth - 15); // 15 is length of " # | WARNING | ". - $delimiterLine = str_repeat('-', ($messageWidth)); - $disableNotice = 'To disable this notice, add --exclude=PHPCompatibility.Upgrade.LowPHPCS to your command or add <exclude name="PHPCompatibility.Upgrade.LowPHPCS.%s"/> to your custom ruleset. '; - $thankYou = 'Thank you for using PHPCompatibility!'; - - $message .= ' ' . $delimiterLine; - $message .= ' ' . $disableNotice; - $message .= ' ' . $delimiterLine; - $message .= ' ' . $thankYou; - - $this->addMessage($phpcsFile, $message, 0, $isError, $errorCode, $replacements); - - $this->examine = false; - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Upgrade/LowPHPSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Upgrade/LowPHPSniff.php deleted file mode 100644 index 7a17163..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Upgrade/LowPHPSniff.php +++ /dev/null @@ -1,182 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Upgrade; - -use PHPCompatibility\Sniff; -use PHPCompatibility\PHPCSHelper; -use PHP_CodeSniffer_File as File; - -/** - * Add a notification for users of low PHP versions. - * - * Originally PHPCompatibility supported PHP 5.1 and higher. - * As of PHPCompatibility 8.0.0, support for PHP < 5.3 has been dropped. - * - * The intention is to drop support for PHP 5.3 in the (near) future. - * - * This sniff adds an explicit error/warning for users of the standard - * using a PHP version below the recommended version. - * - * @link https://github.com/PHPCompatibility/PHPCompatibility/issues/835 - * - * @since 9.3.0 - */ -class LowPHPSniff extends Sniff -{ - /** - * The minimum supported PHP version. - * - * Users on PHP versions below this will see an ERROR message. - * - * @since 9.3.0 - * - * @var string - */ - const MIN_SUPPORTED_VERSION = '5.3'; - - /** - * The minimum recommended PHP version. - * - * Users on PHP versions below this will see a WARNING. - * - * @since 9.3.0 - * - * @var string - */ - const MIN_RECOMMENDED_VERSION = '5.4'; - - /** - * Keep track of whether this sniff needs to actually run. - * - * This will be set to `false` when either a high enough PHP - * version is detected or once the error/warning has been thrown, - * to make sure that the notice will only be thrown once per run. - * - * @since 9.3.0 - * - * @var bool - */ - private $examine = true; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 9.3.0 - * - * @return array - */ - public function register() - { - return array( - \T_OPEN_TAG, - ); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 9.3.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function process(File $phpcsFile, $stackPtr) - { - // Don't do anything if the warning has already been thrown or is not necessary. - if ($this->examine === false) { - return ($phpcsFile->numTokens + 1); - } - - $phpVersion = phpversion(); - - // Don't do anything if the PHPCS version used is above the minimum recommended version. - if (version_compare($phpVersion, self::MIN_RECOMMENDED_VERSION, '>=')) { - $this->examine = false; - return ($phpcsFile->numTokens + 1); - } - - if (version_compare($phpVersion, self::MIN_SUPPORTED_VERSION, '<')) { - $isError = true; - $message = 'IMPORTANT: Please be advised that the minimum PHP version the PHPCompatibility standard supports is %s. You are currently using PHP %s. Please upgrade your PHP installation. The recommended version of PHP for PHPCompatibility is %s or higher.'; - $errorCode = 'Unsupported_' . $this->stringToErrorCode(self::MIN_SUPPORTED_VERSION); - $replacements = array( - self::MIN_SUPPORTED_VERSION, - $phpVersion, - self::MIN_RECOMMENDED_VERSION, - $errorCode, - ); - } else { - $isError = false; - $message = 'IMPORTANT: Please be advised that for the most reliable PHPCompatibility results, PHP %s or higher should be used. Support for lower versions will be dropped in the foreseeable future. You are currently using PHP %s. Please upgrade your PHP installation to version %s or higher.'; - $errorCode = 'BelowRecommended_' . $this->stringToErrorCode(self::MIN_RECOMMENDED_VERSION); - $replacements = array( - self::MIN_RECOMMENDED_VERSION, - $phpVersion, - self::MIN_RECOMMENDED_VERSION, - $errorCode, - ); - } - - /* - * Figure out the report width to determine how long the delimiter lines should be. - * - * This is not an exact calculation as there are a number of unknowns at the time the - * notice is thrown (whether there are other notices for the file, whether those are - * warnings or errors, whether there are auto-fixable issues etc). - * - * In other words, this is just an approximation to get a reasonably stable and - * readable message layout format. - * - * {@internal - * PHPCS has had some changes as to how the messages display over the years. - * Most significantly in 2.4.0 it was attempted to solve an issue with messages - * containing new lines. Unfortunately, that solution is buggy. - * An improved version has been pulled upstream and will hopefully make it - * into PHPCS 3.3.1/3.4.0. - * - * Anyway, this means that instead of new lines, delimiter lines will be used to improved - * the readability of the (long) message. - * - * Also, as of PHPCS 2.2.0, the report width when using the `-s` option is 8 wider than - * it should be. A patch for that is included in the same upstream PR. - * - * If/when the upstream PR has been merged and the minimum supported/recommended version - * of PHPCompatibility would go beyond that, the below code should be adjusted.} - */ - $reportWidth = PHPCSHelper::getCommandLineData($phpcsFile, 'reportWidth'); - if (empty($reportWidth)) { - $reportWidth = 80; - } - $showSources = PHPCSHelper::getCommandLineData($phpcsFile, 'showSources'); - if ($showSources === true) { - $reportWidth += 6; - } - - $messageWidth = ($reportWidth - 15); // 15 is length of " # | WARNING | ". - $delimiterLine = str_repeat('-', ($messageWidth)); - $disableNotice = 'To disable this notice, add --exclude=PHPCompatibility.Upgrade.LowPHP to your command or add <exclude name="PHPCompatibility.Upgrade.LowPHP.%s"/> to your custom ruleset. '; - $thankYou = 'Thank you for using PHPCompatibility!'; - - $message .= ' ' . $delimiterLine; - $message .= ' ' . $disableNotice; - $message .= ' ' . $delimiterLine; - $message .= ' ' . $thankYou; - - $this->addMessage($phpcsFile, $message, 0, $isError, $errorCode, $replacements); - - $this->examine = false; - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/UseDeclarations/NewGroupUseDeclarationsSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/UseDeclarations/NewGroupUseDeclarationsSniff.php deleted file mode 100644 index a681a4a..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/UseDeclarations/NewGroupUseDeclarationsSniff.php +++ /dev/null @@ -1,118 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\UseDeclarations; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Detect group use declarations as introduced in PHP 7.0. - * - * Checks for: - * - Group use statements as introduced in PHP 7.0. - * - Trailing comma's in group use statements as allowed since PHP 7.2. - * - * PHP version 7.0 - * PHP version 7.2 - * - * @link https://www.php.net/manual/en/migration70.new-features.php#migration70.new-features.group-use-declarations - * @link https://www.php.net/manual/en/migration72.new-features.php#migration72.new-features.trailing-comma-in-grouped-namespaces - * @link https://wiki.php.net/rfc/group_use_declarations - * @link https://wiki.php.net/rfc/list-syntax-trailing-commas - * @link https://www.php.net/manual/en/language.namespaces.importing.php#language.namespaces.importing.group - * - * @since 7.0.0 - * @since 8.0.1 Now also checks for trailing comma's in group `use` declarations. - */ -class NewGroupUseDeclarationsSniff extends Sniff -{ - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 7.0.0 - * - * @return array - */ - public function register() - { - if (\defined('T_OPEN_USE_GROUP')) { - return array(\T_OPEN_USE_GROUP); - } else { - return array(\T_USE); - } - } - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 7.0.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsBelow('7.1') === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - $token = $tokens[$stackPtr]; - - // Deal with PHPCS pre-2.6.0. - if ($token['code'] === \T_USE) { - $hasCurlyBrace = $phpcsFile->findNext(\T_OPEN_CURLY_BRACKET, ($stackPtr + 1), null, false, null, true); - if ($hasCurlyBrace === false) { - return; - } - - $prevToken = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($hasCurlyBrace - 1), null, true); - if ($prevToken === false || $tokens[$prevToken]['code'] !== \T_NS_SEPARATOR) { - return; - } - - $stackPtr = $hasCurlyBrace; - } - - // Still here ? In that case, it is a group use statement. - if ($this->supportsBelow('5.6') === true) { - $phpcsFile->addError( - 'Group use declarations are not allowed in PHP 5.6 or earlier', - $stackPtr, - 'Found' - ); - } - - $closers = array(\T_CLOSE_CURLY_BRACKET); - if (\defined('T_CLOSE_USE_GROUP')) { - $closers[] = \T_CLOSE_USE_GROUP; - } - - $closeCurly = $phpcsFile->findNext($closers, ($stackPtr + 1), null, false, null, true); - if ($closeCurly === false) { - return; - } - - $prevToken = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($closeCurly - 1), null, true); - if ($tokens[$prevToken]['code'] === \T_COMMA) { - $phpcsFile->addError( - 'Trailing comma\'s are not allowed in group use statements in PHP 7.1 or earlier', - $prevToken, - 'TrailingCommaFound' - ); - } - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/UseDeclarations/NewUseConstFunctionSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/UseDeclarations/NewUseConstFunctionSniff.php deleted file mode 100644 index 2d166fb..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/UseDeclarations/NewUseConstFunctionSniff.php +++ /dev/null @@ -1,109 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\UseDeclarations; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Detect importing constants and functions via a `use` statement. - * - * The `use` operator has been extended to support importing functions and - * constants in addition to classes. This is achieved via the `use function` - * and `use const` constructs, respectively. - * - * PHP version 5.6 - * - * @link https://www.php.net/manual/en/migration56.new-features.php#migration56.new-features.use - * @link https://wiki.php.net/rfc/use_function - * @link https://www.php.net/manual/en/language.namespaces.importing.php - * - * @since 7.1.4 - */ -class NewUseConstFunctionSniff extends Sniff -{ - - /** - * A list of keywords that can follow use statements. - * - * @since 7.1.4 - * - * @var array(string => string) - */ - protected $validUseNames = array( - 'const' => true, - 'function' => true, - ); - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 7.1.4 - * - * @return array - */ - public function register() - { - return array(\T_USE); - } - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 7.1.4 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsBelow('5.5') !== true) { - return; - } - - $tokens = $phpcsFile->getTokens(); - - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($nextNonEmpty === false) { - // Live coding. - return; - } - - if (isset($this->validUseNames[strtolower($tokens[$nextNonEmpty]['content'])]) === false) { - // Not a `use const` or `use function` statement. - return; - } - - // `use const` and `use function` have to be followed by the function/constant name. - $functionOrConstName = $phpcsFile->findNext(Tokens::$emptyTokens, ($nextNonEmpty + 1), null, true); - if ($functionOrConstName === false - // Identifies as T_AS or T_STRING, this covers both. - || ($tokens[$functionOrConstName]['content'] === 'as' - || $tokens[$functionOrConstName]['code'] === \T_COMMA) - ) { - // Live coding or incorrect use of reserved keyword, but that is - // covered by the ForbiddenNames sniff. - return; - } - - // Still here ? In that case we have encountered a `use const` or `use function` statement. - $phpcsFile->addError( - 'Importing functions and constants through a "use" statement is not supported in PHP 5.5 or lower.', - $nextNonEmpty, - 'Found' - ); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Variables/ForbiddenGlobalVariableVariableSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Variables/ForbiddenGlobalVariableVariableSniff.php deleted file mode 100644 index c7f715d..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Variables/ForbiddenGlobalVariableVariableSniff.php +++ /dev/null @@ -1,125 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Variables; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Detect use of `global` with variable variables, support for which has been removed in PHP 7.0. - * - * PHP version 7.0 - * - * @link https://wiki.php.net/rfc/uniform_variable_syntax#global_keyword_takes_only_simple_variables - * - * @since 7.0.0 - */ -class ForbiddenGlobalVariableVariableSniff extends Sniff -{ - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 7.0.0 - * - * @return array - */ - public function register() - { - return array(\T_GLOBAL); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 7.0.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsAbove('7.0') === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - $endOfStatement = $phpcsFile->findNext(array(\T_SEMICOLON, \T_CLOSE_TAG), ($stackPtr + 1)); - if ($endOfStatement === false) { - // No semi-colon - live coding. - return; - } - - for ($ptr = ($stackPtr + 1); $ptr <= $endOfStatement; $ptr++) { - $errorThrown = false; - $nextComma = $phpcsFile->findNext(\T_COMMA, $ptr, $endOfStatement, false, null, true); - $varEnd = ($nextComma === false) ? $endOfStatement : $nextComma; - $variable = $phpcsFile->findNext(\T_VARIABLE, $ptr, $varEnd); - $varString = trim($phpcsFile->getTokensAsString($ptr, ($varEnd - $ptr))); - $data = array($varString); - - if ($variable !== false) { - - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($variable - 1), $ptr, true); - - if ($prev !== false && $tokens[$prev]['type'] === 'T_DOLLAR') { - - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($variable + 1), $varEnd, true); - - if ($next !== false - && \in_array($tokens[$next]['code'], array(\T_OPEN_SQUARE_BRACKET, \T_OBJECT_OPERATOR, \T_DOUBLE_COLON), true) === true - ) { - $phpcsFile->addError( - 'Global with variable variables is not allowed since PHP 7.0. Found %s', - $variable, - 'Found', - $data - ); - $errorThrown = true; - } else { - $phpcsFile->addWarning( - 'Global with anything other than bare variables is discouraged since PHP 7.0. Found %s', - $variable, - 'NonBareVariableFound', - $data - ); - $errorThrown = true; - } - } - } - - if ($errorThrown === false) { - $dollar = $phpcsFile->findNext(\T_DOLLAR, $ptr, $varEnd); - if ($dollar !== false) { - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($dollar + 1), $varEnd, true); - if ($tokens[$next]['code'] === \T_OPEN_CURLY_BRACKET) { - $phpcsFile->addWarning( - 'Global with anything other than bare variables is discouraged since PHP 7.0. Found %s', - $dollar, - 'NonBareVariableFound', - $data - ); - } - } - } - - // Move the stack pointer forward to the next variable for multi-variable statements. - if ($nextComma === false) { - break; - } - $ptr = $nextComma; - } - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Variables/ForbiddenThisUseContextsSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Variables/ForbiddenThisUseContextsSniff.php deleted file mode 100644 index fc0ddc6..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Variables/ForbiddenThisUseContextsSniff.php +++ /dev/null @@ -1,425 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Variables; - -use PHPCompatibility\Sniff; -use PHPCompatibility\PHPCSHelper; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Detect using `$this` in incompatible contexts. - * - * "Whilst `$this` is considered a special variable in PHP, it lacked proper checks - * to ensure it wasn't used as a variable name or reassigned. This has now been - * rectified to ensure that `$this` cannot be a user-defined variable, reassigned - * to a different value, or be globalised." - * - * This sniff only addresses those situations which did *not* throw an error prior - * to PHP 7.1, either at all or only in PHP 7.0. - * In other words, the following situation, while mentioned in the RFC, will NOT - * be sniffed for: - * - Using $this as static variable. (error _message_ change only). - * - * Also, the changes with relation to assigning `$this` dynamically can not be - * sniffed for reliably, so are not covered by this sniff. - * - Disable ability to re-assign `$this` indirectly through `$$`. - * - Disable ability to re-assign `$this` indirectly through reference. - * - Disable ability to re-assign `$this` indirectly through `extract()` and `parse_str()`. - * - * Other changes not (yet) covered: - * - `get_defined_vars()` always doesn't show value of variable `$this`. - * - Always show true `$this` value in magic method `__call()`. - * {@internal This could possibly be covered. Similar logic as "outside object context", - * but with function name check and supportsBelow('7.0').} - * - * PHP version 7.1 - * - * @link https://www.php.net/manual/en/migration71.other-changes.php#migration71.other-changes.inconsistency-fixes-to-this - * @link https://wiki.php.net/rfc/this_var - * - * @since 9.1.0 - */ -class ForbiddenThisUseContextsSniff extends Sniff -{ - - /** - * OO scope tokens. - * - * Duplicate of Tokens::$ooScopeTokens array in PHPCS which was added in 3.1.0. - * - * @since 9.1.0 - * - * @var array - */ - private $ooScopeTokens = array( - 'T_CLASS' => \T_CLASS, - 'T_INTERFACE' => \T_INTERFACE, - 'T_TRAIT' => \T_TRAIT, - ); - - /** - * Scopes to skip over when examining the contents of functions. - * - * @since 9.1.0 - * - * @var array - */ - private $skipOverScopes = array( - 'T_FUNCTION' => true, - 'T_CLOSURE' => true, - ); - - /** - * Valid uses of $this in plain functions or methods outside object context. - * - * @since 9.1.0 - * - * @var array - */ - private $validUseOutsideObject = array( - \T_ISSET => true, - \T_EMPTY => true, - ); - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 9.1.0 - * - * @return array - */ - public function register() - { - if (\defined('T_ANON_CLASS')) { - $this->ooScopeTokens['T_ANON_CLASS'] = \T_ANON_CLASS; - } - - $this->skipOverScopes += $this->ooScopeTokens; - - return array( - \T_FUNCTION, - \T_CLOSURE, - \T_GLOBAL, - \T_CATCH, - \T_FOREACH, - \T_UNSET, - ); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 9.1.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsAbove('7.1') === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - - switch ($tokens[$stackPtr]['code']) { - case \T_FUNCTION: - $this->isThisUsedAsParameter($phpcsFile, $stackPtr); - $this->isThisUsedOutsideObjectContext($phpcsFile, $stackPtr); - break; - - case \T_CLOSURE: - $this->isThisUsedAsParameter($phpcsFile, $stackPtr); - break; - - case \T_GLOBAL: - /* - * $this can no longer be imported using the `global` keyword. - * This worked in PHP 7.0, though in PHP 5.x, it would throw a - * fatal "Cannot re-assign $this" error. - */ - $endOfStatement = $phpcsFile->findNext(array(\T_SEMICOLON, \T_CLOSE_TAG), ($stackPtr + 1)); - if ($endOfStatement === false) { - // No semi-colon - live coding. - return; - } - - for ($i = ($stackPtr + 1); $i < $endOfStatement; $i++) { - if ($tokens[$i]['code'] !== \T_VARIABLE || $tokens[$i]['content'] !== '$this') { - continue; - } - - $phpcsFile->addError( - '"$this" can no longer be used with the "global" keyword since PHP 7.1.', - $i, - 'Global' - ); - } - - break; - - case \T_CATCH: - /* - * $this can no longer be used as a catch variable. - */ - if (isset($tokens[$stackPtr]['parenthesis_opener'], $tokens[$stackPtr]['parenthesis_closer']) === false) { - return; - } - - $varPtr = $phpcsFile->findNext( - \T_VARIABLE, - ($tokens[$stackPtr]['parenthesis_opener'] + 1), - $tokens[$stackPtr]['parenthesis_closer'] - ); - - if ($varPtr === false || $tokens[$varPtr]['content'] !== '$this') { - return; - } - - $phpcsFile->addError( - '"$this" can no longer be used as a catch variable since PHP 7.1.', - $varPtr, - 'Catch' - ); - - break; - - case \T_FOREACH: - /* - * $this can no longer be used as a foreach *value* variable. - * This worked in PHP 7.0, though in PHP 5.x, it would throw a - * fatal "Cannot re-assign $this" error. - */ - if (isset($tokens[$stackPtr]['parenthesis_opener'], $tokens[$stackPtr]['parenthesis_closer']) === false) { - return; - } - - $stopPtr = $phpcsFile->findPrevious( - array(\T_AS, \T_DOUBLE_ARROW), - ($tokens[$stackPtr]['parenthesis_closer'] - 1), - $tokens[$stackPtr]['parenthesis_opener'] - ); - if ($stopPtr === false) { - return; - } - - $valueVarPtr = $phpcsFile->findNext( - \T_VARIABLE, - ($stopPtr + 1), - $tokens[$stackPtr]['parenthesis_closer'] - ); - if ($valueVarPtr === false || $tokens[$valueVarPtr]['content'] !== '$this') { - return; - } - - $afterThis = $phpcsFile->findNext( - Tokens::$emptyTokens, - ($valueVarPtr + 1), - $tokens[$stackPtr]['parenthesis_closer'], - true - ); - - if ($afterThis !== false - && ($tokens[$afterThis]['code'] === \T_OBJECT_OPERATOR - || $tokens[$afterThis]['code'] === \T_DOUBLE_COLON) - ) { - return; - } - - $phpcsFile->addError( - '"$this" can no longer be used as value variable in a foreach control structure since PHP 7.1.', - $valueVarPtr, - 'ForeachValueVar' - ); - - break; - - case \T_UNSET: - /* - * $this can no longer be unset. - */ - $openParenthesis = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($openParenthesis === false - || $tokens[$openParenthesis]['code'] !== \T_OPEN_PARENTHESIS - || isset($tokens[$openParenthesis]['parenthesis_closer']) === false - ) { - return; - } - - for ($i = ($openParenthesis + 1); $i < $tokens[$openParenthesis]['parenthesis_closer']; $i++) { - if ($tokens[$i]['code'] !== \T_VARIABLE || $tokens[$i]['content'] !== '$this') { - continue; - } - - $afterThis = $phpcsFile->findNext( - Tokens::$emptyTokens, - ($i + 1), - $tokens[$openParenthesis]['parenthesis_closer'], - true - ); - - if ($afterThis !== false - && ($tokens[$afterThis]['code'] === \T_OBJECT_OPERATOR - || $tokens[$afterThis]['code'] === \T_DOUBLE_COLON - || $tokens[$afterThis]['code'] === \T_OPEN_SQUARE_BRACKET) - ) { - $i = $afterThis; - continue; - } - - $phpcsFile->addError( - '"$this" can no longer be unset since PHP 7.1.', - $i, - 'Unset' - ); - } - - break; - } - } - - /** - * Check if $this is used as a parameter in a function declaration. - * - * $this can no longer be used as a parameter in a *global* function. - * Use as a parameter in a method was already an error prior to PHP 7.1. - * - * @since 9.1.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - protected function isThisUsedAsParameter(File $phpcsFile, $stackPtr) - { - if ($this->validDirectScope($phpcsFile, $stackPtr, $this->ooScopeTokens) !== false) { - return; - } - - $params = PHPCSHelper::getMethodParameters($phpcsFile, $stackPtr); - if (empty($params)) { - return; - } - - $tokens = $phpcsFile->getTokens(); - - foreach ($params as $param) { - if ($param['name'] !== '$this') { - continue; - } - - if ($tokens[$stackPtr]['code'] === \T_FUNCTION) { - $phpcsFile->addError( - '"$this" can no longer be used as a parameter since PHP 7.1.', - $param['token'], - 'FunctionParam' - ); - } else { - $phpcsFile->addError( - '"$this" can no longer be used as a closure parameter since PHP 7.0.7.', - $param['token'], - 'ClosureParam' - ); - } - } - } - - /** - * Check if $this is used in a plain function or method. - * - * Prior to PHP 7.1, this would result in an "undefined variable" notice - * and execution would continue with $this regarded as `null`. - * As of PHP 7.1, this throws an exception. - * - * Note: use within isset() and empty() to check object context is still allowed. - * Note: $this can still be used within a closure. - * - * @since 9.1.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - protected function isThisUsedOutsideObjectContext(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['scope_opener'], $tokens[$stackPtr]['scope_closer']) === false) { - return; - } - - if ($this->validDirectScope($phpcsFile, $stackPtr, $this->ooScopeTokens) !== false) { - $methodProps = $phpcsFile->getMethodProperties($stackPtr); - if ($methodProps['is_static'] === false) { - return; - } else { - $methodName = $phpcsFile->getDeclarationName($stackPtr); - if ($methodName === '__call') { - /* - * This is an exception. - * @link https://wiki.php.net/rfc/this_var#always_show_true_this_value_in_magic_method_call - */ - return; - } - } - } - - for ($i = ($tokens[$stackPtr]['scope_opener'] + 1); $i < $tokens[$stackPtr]['scope_closer']; $i++) { - if (isset($this->skipOverScopes[$tokens[$i]['type']])) { - if (isset($tokens[$i]['scope_closer']) === false) { - // Live coding or parse error, will only lead to inaccurate results. - return; - } - - // Skip over nested structures. - $i = $tokens[$i]['scope_closer']; - continue; - } - - if ($tokens[$i]['code'] !== \T_VARIABLE || $tokens[$i]['content'] !== '$this') { - continue; - } - - if (isset($tokens[$i]['nested_parenthesis']) === true) { - $nestedParenthesis = $tokens[$i]['nested_parenthesis']; - $nestedOpenParenthesis = array_keys($nestedParenthesis); - $lastOpenParenthesis = array_pop($nestedOpenParenthesis); - - $previousNonEmpty = $phpcsFile->findPrevious( - Tokens::$emptyTokens, - ($lastOpenParenthesis - 1), - null, - true, - null, - true - ); - - if (isset($this->validUseOutsideObject[$tokens[$previousNonEmpty]['code']])) { - continue; - } - } - - $phpcsFile->addError( - '"$this" can no longer be used in a plain function or method since PHP 7.1.', - $i, - 'OutsideObjectContext' - ); - } - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Variables/NewUniformVariableSyntaxSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Variables/NewUniformVariableSyntaxSniff.php deleted file mode 100644 index f794807..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Variables/NewUniformVariableSyntaxSniff.php +++ /dev/null @@ -1,114 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Variables; - -use PHPCompatibility\Sniff; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * The interpretation of variable variables has changed in PHP 7.0. - * - * PHP version 7.0 - * - * @link https://www.php.net/manual/en/migration70.incompatible.php#migration70.incompatible.variable-handling.indirect - * @link https://wiki.php.net/rfc/uniform_variable_syntax - * - * @since 7.1.2 - * @since 9.0.0 Renamed from `VariableVariablesSniff` to `NewUniformVariableSyntaxSniff`. - */ -class NewUniformVariableSyntaxSniff extends Sniff -{ - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 7.1.2 - * - * @return array - */ - public function register() - { - return array(\T_VARIABLE); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 7.1.2 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsAbove('7.0') === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - - // Verify that the next token is a square open bracket. If not, bow out. - $nextToken = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true, null, true); - - if ($nextToken === false || $tokens[$nextToken]['code'] !== \T_OPEN_SQUARE_BRACKET || isset($tokens[$nextToken]['bracket_closer']) === false) { - return; - } - - // The previous non-empty token has to be a $, -> or ::. - $prevToken = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true, null, true); - if ($prevToken === false || \in_array($tokens[$prevToken]['code'], array(\T_DOLLAR, \T_OBJECT_OPERATOR, \T_DOUBLE_COLON), true) === false) { - return; - } - - // For static object calls, it only applies when this is a function call. - if ($tokens[$prevToken]['code'] === \T_DOUBLE_COLON) { - $hasBrackets = $tokens[$nextToken]['bracket_closer']; - while (($hasBrackets = $phpcsFile->findNext(Tokens::$emptyTokens, ($hasBrackets + 1), null, true, null, true)) !== false) { - if ($tokens[$hasBrackets]['code'] === \T_OPEN_SQUARE_BRACKET) { - if (isset($tokens[$hasBrackets]['bracket_closer'])) { - $hasBrackets = $tokens[$hasBrackets]['bracket_closer']; - continue; - } else { - // Live coding. - return; - } - - } elseif ($tokens[$hasBrackets]['code'] === \T_OPEN_PARENTHESIS) { - // Caught! - break; - - } else { - // Not a function call, so bow out. - return; - } - } - - // Now let's also prevent false positives when used with self and static which still work fine. - $classToken = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($prevToken - 1), null, true, null, true); - if ($classToken !== false) { - if ($tokens[$classToken]['code'] === \T_STATIC || $tokens[$classToken]['code'] === \T_SELF) { - return; - } elseif ($tokens[$classToken]['code'] === \T_STRING && $tokens[$classToken]['content'] === 'self') { - return; - } - } - } - - $phpcsFile->addError( - 'Indirect access to variables, properties and methods will be evaluated strictly in left-to-right order since PHP 7.0. Use curly braces to remove ambiguity.', - $stackPtr, - 'Found' - ); - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Variables/RemovedPredefinedGlobalVariablesSniff.php b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Variables/RemovedPredefinedGlobalVariablesSniff.php deleted file mode 100644 index c814e7d..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/Sniffs/Variables/RemovedPredefinedGlobalVariablesSniff.php +++ /dev/null @@ -1,318 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - */ - -namespace PHPCompatibility\Sniffs\Variables; - -use PHPCompatibility\AbstractRemovedFeatureSniff; -use PHPCompatibility\PHPCSHelper; -use PHP_CodeSniffer_File as File; -use PHP_CodeSniffer_Tokens as Tokens; - -/** - * Detect the use of removed global variables. Suggests alternatives if available. - * - * PHP version 5.3+ - * - * @link https://wiki.php.net/rfc/deprecations_php_7_2#php_errormsg - * - * @since 5.5 Introduced `LongArrays` sniff. - * @since 7.0 Introduced `RemovedGlobalVariables` sniff. - * @since 7.0.7 The `LongArrays` sniff now throws a warning for deprecated and an error for removed. - * Previously the `LongArrays` sniff would always throw a warning. - * @since 7.1.0 The `RemovedGlobalVariables` sniff now extends the `AbstractNewFeatureSniff` - * instead of the base `Sniff` class. - * @since 7.1.3 Merged the `LongArrays` sniff into the `RemovedGlobalVariables` sniff. - * @since 9.0.0 Renamed from `RemovedGlobalVariablesSniff` to `RemovedPredefinedGlobalVariablesSniff`. - */ -class RemovedPredefinedGlobalVariablesSniff extends AbstractRemovedFeatureSniff -{ - - /** - * A list of removed global variables with their alternative, if any. - * - * The array lists : version number with false (deprecated) and true (removed). - * If's sufficient to list the first version where the variable was deprecated/removed. - * - * @since 5.5 - * @since 7.0 - * - * @var array(string => array(string => bool|string)) - */ - protected $removedGlobalVariables = array( - 'HTTP_POST_VARS' => array( - '5.3' => false, - '5.4' => true, - 'alternative' => '$_POST', - ), - 'HTTP_GET_VARS' => array( - '5.3' => false, - '5.4' => true, - 'alternative' => '$_GET', - ), - 'HTTP_ENV_VARS' => array( - '5.3' => false, - '5.4' => true, - 'alternative' => '$_ENV', - ), - 'HTTP_SERVER_VARS' => array( - '5.3' => false, - '5.4' => true, - 'alternative' => '$_SERVER', - ), - 'HTTP_COOKIE_VARS' => array( - '5.3' => false, - '5.4' => true, - 'alternative' => '$_COOKIE', - ), - 'HTTP_SESSION_VARS' => array( - '5.3' => false, - '5.4' => true, - 'alternative' => '$_SESSION', - ), - 'HTTP_POST_FILES' => array( - '5.3' => false, - '5.4' => true, - 'alternative' => '$_FILES', - ), - - 'HTTP_RAW_POST_DATA' => array( - '5.6' => false, - '7.0' => true, - 'alternative' => 'php://input', - ), - - 'php_errormsg' => array( - '7.2' => false, - 'alternative' => 'error_get_last()', - ), - ); - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 5.5 - * @since 7.0 - * - * @return array - */ - public function register() - { - return array(\T_VARIABLE); - } - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 5.5 - * @since 7.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->supportsAbove('5.3') === false) { - return; - } - - $tokens = $phpcsFile->getTokens(); - $varName = substr($tokens[$stackPtr]['content'], 1); - - if (isset($this->removedGlobalVariables[$varName]) === false) { - return; - } - - if ($this->isClassProperty($phpcsFile, $stackPtr) === true) { - // Ok, so this was a class property declaration, not our concern. - return; - } - - // Check for static usage of class properties shadowing the removed global variables. - if ($this->inClassScope($phpcsFile, $stackPtr, false) === true) { - $prevToken = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true, null, true); - if ($prevToken !== false && $tokens[$prevToken]['code'] === \T_DOUBLE_COLON) { - return; - } - } - - // Do some additional checks for the $php_errormsg variable. - if ($varName === 'php_errormsg' - && $this->isTargetPHPErrormsgVar($phpcsFile, $stackPtr, $tokens) === false - ) { - return; - } - - // Still here, so throw an error/warning. - $itemInfo = array( - 'name' => $varName, - ); - $this->handleFeature($phpcsFile, $stackPtr, $itemInfo); - } - - - /** - * Get the relevant sub-array for a specific item from a multi-dimensional array. - * - * @since 7.1.0 - * - * @param array $itemInfo Base information about the item. - * - * @return array Version and other information about the item. - */ - public function getItemArray(array $itemInfo) - { - return $this->removedGlobalVariables[$itemInfo['name']]; - } - - - /** - * Get the error message template for this sniff. - * - * @since 7.1.0 - * - * @return string - */ - protected function getErrorMsgTemplate() - { - return "Global variable '\$%s' is "; - } - - - /** - * Filter the error message before it's passed to PHPCS. - * - * @since 8.1.0 - * - * @param string $error The error message which was created. - * @param array $itemInfo Base information about the item this error message applies to. - * @param array $errorInfo Detail information about an item this error message applies to. - * - * @return string - */ - protected function filterErrorMsg($error, array $itemInfo, array $errorInfo) - { - if ($itemInfo['name'] === 'php_errormsg') { - $error = str_replace('Global', 'The', $error); - } - return $error; - } - - /** - * Run some additional checks for the `$php_errormsg` variable. - * - * @since 8.1.0 - * - * @param \PHP_CodeSniffer_File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * @param array $tokens Token array of the current file. - * - * @return bool - */ - private function isTargetPHPErrormsgVar(File $phpcsFile, $stackPtr, array $tokens) - { - $scopeStart = 0; - - /* - * If the variable is detected within the scope of a function/closure, limit the checking. - */ - $function = $phpcsFile->getCondition($stackPtr, \T_CLOSURE); - if ($function === false) { - $function = $phpcsFile->getCondition($stackPtr, \T_FUNCTION); - } - - // It could also be a function param, which is not in the function scope. - if ($function === false && isset($tokens[$stackPtr]['nested_parenthesis']) === true) { - $nestedParentheses = $tokens[$stackPtr]['nested_parenthesis']; - $parenthesisCloser = end($nestedParentheses); - if (isset($tokens[$parenthesisCloser]['parenthesis_owner']) - && ($tokens[$tokens[$parenthesisCloser]['parenthesis_owner']]['code'] === \T_FUNCTION - || $tokens[$tokens[$parenthesisCloser]['parenthesis_owner']]['code'] === \T_CLOSURE) - ) { - $function = $tokens[$parenthesisCloser]['parenthesis_owner']; - } - } - - if ($function !== false) { - $scopeStart = $tokens[$function]['scope_opener']; - } - - /* - * Now, let's do some additional checks. - */ - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - - // Is the variable being used as an array ? - if ($nextNonEmpty !== false && $tokens[$nextNonEmpty]['code'] === \T_OPEN_SQUARE_BRACKET) { - // The PHP native variable is a string, so this is probably not it - // (except for array access to string, but why would you in this case ?). - return false; - } - - // Is this a variable assignment ? - if ($nextNonEmpty !== false - && isset(Tokens::$assignmentTokens[$tokens[$nextNonEmpty]['code']]) === true - ) { - return false; - } - - // Is this a function param shadowing the PHP native one ? - if ($function !== false) { - $parameters = PHPCSHelper::getMethodParameters($phpcsFile, $function); - if (\is_array($parameters) === true && empty($parameters) === false) { - foreach ($parameters as $param) { - if ($param['name'] === '$php_errormsg') { - return false; - } - } - } - } - - $skipPast = array( - 'T_CLASS' => true, - 'T_ANON_CLASS' => true, - 'T_INTERFACE' => true, - 'T_TRAIT' => true, - 'T_FUNCTION' => true, - 'T_CLOSURE' => true, - ); - - // Walk back and see if there is an assignment to the variable within the same scope. - for ($i = ($stackPtr - 1); $i >= $scopeStart; $i--) { - if ($tokens[$i]['code'] === \T_CLOSE_CURLY_BRACKET - && isset($tokens[$i]['scope_condition']) - && isset($skipPast[$tokens[$tokens[$i]['scope_condition']]['type']]) - ) { - // Skip past functions, classes etc. - $i = $tokens[$i]['scope_condition']; - continue; - } - - if ($tokens[$i]['code'] !== \T_VARIABLE || $tokens[$i]['content'] !== '$php_errormsg') { - continue; - } - - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($i + 1), null, true); - - if ($nextNonEmpty !== false - && isset(Tokens::$assignmentTokens[$tokens[$nextNonEmpty]['code']]) === true - ) { - return false; - } - } - - return true; - } -} diff --git a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/ruleset.xml b/vendor/phpcompatibility/php-compatibility/PHPCompatibility/ruleset.xml deleted file mode 100644 index 3eb0b67..0000000 --- a/vendor/phpcompatibility/php-compatibility/PHPCompatibility/ruleset.xml +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0"?> -<ruleset name="PHPCompatibility"> - <description>Coding Standard that checks for PHP version compatibility.</description> - - <autoload>./../PHPCSAliases.php</autoload> - -</ruleset> diff --git a/vendor/phpcompatibility/php-compatibility/README.md b/vendor/phpcompatibility/php-compatibility/README.md deleted file mode 100644 index 9b1fd51..0000000 --- a/vendor/phpcompatibility/php-compatibility/README.md +++ /dev/null @@ -1,250 +0,0 @@ -PHP Compatibility Coding Standard for PHP CodeSniffer -===================================================== -[![Latest Stable Version](https://poser.pugx.org/phpcompatibility/php-compatibility/v/stable.png)](https://packagist.org/packages/phpcompatibility/php-compatibility) -[![Latest Unstable Version](https://poser.pugx.org/phpcompatibility/php-compatibility/v/unstable.png)](https://packagist.org/packages/phpcompatibility/php-compatibility) -![Awesome](https://img.shields.io/badge/awesome%3F-yes!-brightgreen.svg) -[![License](https://poser.pugx.org/phpcompatibility/php-compatibility/license.png)](https://github.com/PHPCompatibility/PHPCompatibility/blob/master/LICENSE) -[![Flattr this git repo](http://api.flattr.com/button/flattr-badge-large.png)](https://flattr.com/submit/auto?user_id=wimg&url=https://github.com/PHPCompatibility/PHPCompatibility&title=PHPCompatibility&language=&tags=github&category=software) - -[![Build Status](https://travis-ci.org/PHPCompatibility/PHPCompatibility.svg?branch=develop)](https://travis-ci.org/PHPCompatibility/PHPCompatibility) -[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/PHPCompatibility/PHPCompatibility/badges/quality-score.png?b=develop)](https://scrutinizer-ci.com/g/PHPCompatibility/PHPCompatibility/) -[![Coverage Status](https://coveralls.io/repos/github/PHPCompatibility/PHPCompatibility/badge.svg?branch=develop)](https://coveralls.io/github/PHPCompatibility/PHPCompatibility?branch=develop) - -[![Minimum PHP Version](https://img.shields.io/packagist/php-v/phpcompatibility/php-compatibility.svg?maxAge=3600)](https://packagist.org/packages/phpcompatibility/php-compatibility) -[![Tested on PHP 5.3 to nightly](https://img.shields.io/badge/tested%20on-PHP%205.3%20|%205.4%20|%205.5%20|%205.6%20|%207.0%20|%207.1%20|%207.2%20|%207.3%20|%207.4%20-brightgreen.svg?maxAge=2419200)](https://travis-ci.org/PHPCompatibility/PHPCompatibility) - - -This is a set of sniffs for [PHP CodeSniffer](https://github.com/squizlabs/PHP_CodeSniffer) that checks for PHP cross-version compatibility. -It will allow you to analyse your code for compatibility with higher and lower versions of PHP. - -* [PHP Version Support](#php-version-support) -* [Requirements](#requirements) -* [Thank you](#thank-you) -* [Upgrading to PHPCompatibility 9.0.0](#warning-upgrading-to-phpcompatibility-900-warning) -* [Installation in a Composer project (method 1)](#installation-in-a-composer-project-method-1) -* [Installation via a git check-out to an arbitrary directory (method 2)](#installation-via-a-git-check-out-to-an-arbitrary-directory-method-2) -* [Sniffing your code for compatibility with specific PHP version(s)](#sniffing-your-code-for-compatibility-with-specific-php-versions) - + [Using a framework/CMS/polyfill specific ruleset](#using-a-frameworkcmspolyfill-specific-ruleset) -* [Using a custom ruleset](#using-a-custom-ruleset) - + [`testVersion` in the ruleset versus command-line](#testversion-in-the-ruleset-versus-command-line) - + [PHPCompatibility specific options](#phpcompatibility-specific-options) -* [Projects extending PHPCompatibility](#projects-extending-phpcompatibility) -* [Contributing](#contributing) -* [License](#license) - -PHP Version Support -------- - -The project aims to cover all PHP compatibility changes introduced since PHP 5.0 up to the latest PHP release. This is an ongoing process and coverage is not yet 100% (if, indeed, it ever could be). Progress is tracked on [our GitHub issue tracker](https://github.com/PHPCompatibility/PHPCompatibility/issues). - -Pull requests that check for compatibility issues in PHP 4 code - in particular between PHP 4 and PHP 5.0 - are very welcome as there are still situations where people need help upgrading legacy systems. However, coverage for changes introduced before PHP 5.1 will remain patchy as sniffs for this are not actively being developed at this time. - -Requirements -------- - -* PHP 5.3+ for use with PHP CodeSniffer 2.x. -* PHP 5.4+ for use with PHP CodeSniffer 3.x. - -PHP CodeSniffer: 2.3.0+ or 3.0.2+. - -The sniffs are designed to give the same results regardless of which PHP version you are using to run PHP CodeSniffer. You should get reasonably consistent results independently of the PHP version used in your test environment, though for the best results it is recommended to run the sniffs on PHP 5.4 or higher. - -PHP CodeSniffer 2.3.0 is required for 90% of the sniffs, PHP CodeSniffer 2.6.0 or later is required for full support, notices may be thrown on older versions. - -For running the sniffs on PHP 7.3, it is recommended to use PHP_CodeSniffer 3.3.1+, or, if needs be, PHP_CodeSniffer 2.9.2. -PHP_CodeSniffer < 2.9.2/3.3.1 is not fully compatible with PHP 7.3, which effectively means that PHPCompatibility can't be either. -While the sniffs will still work in _most_ cases, you can expect PHP warnings to be thrown. - -For running the sniffs on PHP 7.4, it is recommended to use PHP_CodeSniffer 3.5.0+. - -As of version 8.0.0, the PHPCompatibility standard can also be used with PHP CodeSniffer 3.x. - -As of version 9.0.0, support for PHP CodeSniffer 1.5.x and low 2.x versions < 2.3.0 has been dropped. - - -Thank you ---------- -Thanks to all [contributors](https://github.com/PHPCompatibility/PHPCompatibility/graphs/contributors) for their valuable contributions. - -Thanks to [WP Engine](https://wpengine.com) for their support on the PHP 7.0 sniffs. - - -:warning: Upgrading to PHPCompatibility 9.0.0 :warning: --------- -This library has been reorganized. All sniffs have been placed in categories and a significant number of sniffs have been renamed. - -If you use the complete `PHPCompatibility` standard without `exclude` directives in a custom ruleset and do not (yet) use the new-style PHP_CodeSniffer annotation as introduced in [PHP_CodeSniffer 3.2.0](https://github.com/squizlabs/PHP_CodeSniffer/releases/tag/3.2.0), this will have no noticeable effect and everything should work as before. - -However, if you do use `exclude` directives for PHPCompatibility sniffs in a custom ruleset or if you use the [new-style PHP_CodeSniffer inline annotations](https://github.com/squizlabs/PHP_CodeSniffer/releases/3.2.0), you will need to update these when upgrading. This should be a one-time only change. -The changelog contains detailed information about all the sniff renames. - -Please read the changelog for version [9.0.0](https://github.com/PHPCompatibility/PHPCompatibility/releases/tag/9.0.0) carefully before upgrading. - - -Installation in a Composer project (method 1) -------------------------------------------- - -* Add the following lines to the `require-dev` section of your `composer.json` file. - ```json - "require-dev": { - "phpcompatibility/php-compatibility": "*" - }, - "prefer-stable" : true - ``` -* Next, PHP CodeSniffer has to be informed of the location of the standard. - - If PHPCompatibility is the **_only_** external PHP CodeSniffer standard you use, you can add the following to your `composer.json` file to automatically run the necessary command: - ```json - "scripts": { - "post-install-cmd": "\"vendor/bin/phpcs\" --config-set installed_paths vendor/phpcompatibility/php-compatibility", - "post-update-cmd" : "\"vendor/bin/phpcs\" --config-set installed_paths vendor/phpcompatibility/php-compatibility" - } - ``` - - Alternatively - and **_strongly recommended_** if you use more than one external PHP CodeSniffer standard - you can use any of the following Composer plugins to handle this for you. - - Just add the Composer plugin you prefer to the `require-dev` section of your `composer.json` file. - - * [DealerDirect/phpcodesniffer-composer-installer](https://github.com/DealerDirect/phpcodesniffer-composer-installer):"^0.5.0" - * [higidi/composer-phpcodesniffer-standards-plugin](https://github.com/higidi/composer-phpcodesniffer-standards-plugin) - * [SimplyAdmire/ComposerPlugins](https://github.com/SimplyAdmire/ComposerPlugins). This plugin *might* still work, but appears to be abandoned. - - As a last alternative in case you use a custom ruleset, _and only if you use PHP CodeSniffer version 2.6.0 or higher_, you can tell PHP CodeSniffer the path to the PHPCompatibility standard by adding the following snippet to your custom ruleset: - ```xml - <config name="installed_paths" value="vendor/phpcompatibility/php-compatibility" /> - ``` -* Run `composer update --lock` to install both PHP CodeSniffer, the PHPCompatibility coding standard and - optionally - the Composer plugin. -* Verify that the PHPCompatibility standard is registered correctly by running `./vendor/bin/phpcs -i` on the command line. PHPCompatibility should be listed as one of the available standards. -* Now you can use the following command to inspect your code: - ```bash - ./vendor/bin/phpcs -p . --standard=PHPCompatibility - ``` - -Installation via a git check-out to an arbitrary directory (method 2) ------------------------ - -* Install [PHP CodeSniffer](https://github.com/squizlabs/PHP_CodeSniffer) via [your preferred method](https://github.com/squizlabs/PHP_CodeSniffer#installation). - - PHP CodeSniffer offers a variety of installation methods to suit your work-flow: Composer, [PEAR](http://pear.php.net/PHP_CodeSniffer), a Phar file, zipped/tarred release archives or checking the repository out using Git. - - **Pro-tip:** Register the path to PHPCS in your system `$PATH` environment variable to make the `phpcs` command available from anywhere in your file system. -* Download the [latest PHPCompatibility release](https://github.com/PHPCompatibility/PHPCompatibility/releases) and unzip/untar it into an arbitrary directory. - - You can also choose to clone the repository using git to easily update your install regularly. -* Add the path to the directory in which you placed your copy of the PHPCompatibility repo to the PHP CodeSniffer configuration using the below command from the command line: - ```bash - phpcs --config-set installed_paths /path/to/PHPCompatibility - ``` - I.e. if you placed the `PHPCompatibility` repository in the `/my/custom/standards/PHPCompatibility` directory, you will need to add that directory to the PHP CodeSniffer [`installed_paths` configuration variable](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Configuration-Options#setting-the-installed-standard-paths). - - **Warning**: :warning: The `installed_paths` command overwrites any previously set `installed_paths`. If you have previously set `installed_paths` for other external standards, run `phpcs --config-show` first and then run the `installed_paths` command with all the paths you need separated by comma's, i.e.: - ```bash - phpcs --config-set installed_paths /path/1,/path/2,/path/3 - ``` - - **Pro-tip:** Alternatively, in case you use a custom ruleset _and only if you use PHP CodeSniffer version 2.6.0 or higher_, you can tell PHP CodeSniffer the path to the PHPCompatibility standard(s) by adding the following snippet to your custom ruleset: - ```xml - <config name="installed_paths" value="/path/to/PHPCompatibility" /> - ``` -* Verify that the PHPCompatibility standard is registered correctly by running `phpcs -i` on the command line. PHPCompatibility should be listed as one of the available standards. -* Now you can use the following command to inspect your code: - ```bash - phpcs -p . --standard=PHPCompatibility - ``` - -Sniffing your code for compatibility with specific PHP version(s) ------------------------------- -* Run the coding standard from the command-line with `phpcs -p . --standard=PHPCompatibility`. -* By default, you will only receive notifications about deprecated and/or removed PHP features. -* To get the most out of the PHPCompatibility standard, you should specify a `testVersion` to check against. That will enable the checks for both deprecated/removed PHP features as well as the detection of code using new PHP features. - - You can run the checks for just one specific PHP version by adding `--runtime-set testVersion 5.5` to your command line command. - - You can also specify a range of PHP versions that your code needs to support. In this situation, compatibility issues that affect any of the PHP versions in that range will be reported: `--runtime-set testVersion 5.3-5.5`. - - As of PHPCompatibility 7.1.3, you can omit one part of the range if you want to support everything above or below a particular version, i.e. use `--runtime-set testVersion 7.0-` to run all the checks for PHP 7.0 and above. -* By default the report will be sent to the console, if you want to save the report to a file, add the following to the command line command: `--report-full=path/to/report-file`. - For more information and other reporting options, check the [PHP CodeSniffer wiki](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Reporting). - - -### Using a framework/CMS/polyfill specific ruleset - -As of mid 2018, a limited set of framework/CMS specific rulesets is available. These rulesets are hosted in their own repositories. -* `PHPCompatibilityJoomla` [GitHub](https://github.com/PHPCompatibility/PHPCompatibilityJoomla) | [Packagist](https://packagist.org/packages/phpcompatibility/phpcompatibility-joomla) -* `PHPCompatibilityWP` [GitHub](https://github.com/PHPCompatibility/PHPCompatibilityWP) | [Packagist](https://packagist.org/packages/phpcompatibility/phpcompatibility-wp) - -Since the autumn of 2018, there are also a number of PHP polyfill specific rulesets available: -* `PHPCompatibilityPasswordCompat` [GitHub](https://github.com/PHPCompatibility/PHPCompatibilityPasswordCompat) | [Packagist](https://packagist.org/packages/phpcompatibility/phpcompatibility-passwordcompat): accounts for @ircmaxell's [`password_compat`](https://github.com/ircmaxell/password_compat) polyfill library. -* `PHPCompatibilityParagonie` [GitHub](https://github.com/PHPCompatibility/PHPCompatibilityParagonie) | [Packagist](https://packagist.org/packages/phpcompatibility/phpcompatibility-paragonie): contains two rulesets which account for the Paragonie [`random_compat`](https://github.com/paragonie/random_compat) and [`sodium_compat`](https://github.com/paragonie/sodium_compat) polyfill libraries respectively. -* `PHPCompatibilitySymfony` [GitHub](https://github.com/PHPCompatibility/PHPCompatibilitySymfony) | [Packagist](https://packagist.org/packages/phpcompatibility/phpcompatibility-symfony): contains a number of rulesets which account for various PHP polyfill libraries offered by the Symfony project. For more details about the available rulesets, please check out the [README of the PHPCompatibilitySymfony](https://github.com/PHPCompatibility/PHPCompatibilitySymfony/blob/master/README.md) repository. - -If you want to make sure you have all PHPCompatibility rulesets available at any time, you can use the `PHPCompatibilityAll` package [GitHub](https://github.com/PHPCompatibility/PHPCompatibilityAll) | [Packagist](https://packagist.org/packages/phpcompatibility/phpcompatibility-all). - -**IMPORTANT:** Framework/CMS/Polyfill specific rulesets do not set the minimum PHP version for your project, so you will still need to pass a `testVersion` to get the most accurate results. - - -Using a custom ruleset ------------------------------- -Like with any PHP CodeSniffer standard, you can add PHPCompatibility to a custom PHP CodeSniffer ruleset. - -```xml -<?xml version="1.0"?> -<ruleset name="Custom ruleset"> - <description>My rules for PHP CodeSniffer</description> - - <!-- Run against the PHPCompatibility ruleset --> - <rule ref="PHPCompatibility"/> - - <!-- Run against a second ruleset --> - <rule ref="PSR2"/> - -</ruleset> -``` - -You can also set the `testVersion` from within the ruleset: -```xml - <!-- Check for cross-version support for PHP 5.6 and higher. --> - <config name="testVersion" value="5.6-"/> -``` - -Other advanced options, such as changing the message type or severity of select sniffs, as described in the [PHPCS Annotated ruleset](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Annotated-ruleset.xml) wiki page are, of course, also supported. - -### `testVersion` in the ruleset versus command-line - -In PHPCS 3.2.0 and lower, once you set the `testVersion` in the ruleset, you could not overrule it from the command-line anymore. -Starting with PHPCS 3.3.0, a `testVersion` set via the command-line will overrule the `testVersion` in the ruleset. - -This allows for more flexibility when, for instance, your project needs to comply with PHP `5.5-`, but you have a bootstrap file which needs to be compatible with PHP `5.2-`. - - -### PHPCompatibility specific options - -At this moment, there is one sniff which has a property which can be set via the ruleset. More custom properties may become available in the future. - -The `PHPCompatibility.Extensions.RemovedExtensions` sniff checks for removed extensions based on the function prefix used for these extensions. -This might clash with userland functions using the same function prefix. - -To whitelist userland functions, you can pass a comma-delimited list of function names to the sniff. -```xml - <!-- Whitelist the mysql_to_rfc3339() and mysql_another_function() functions. --> - <rule ref="PHPCompatibility.Extensions.RemovedExtensions"> - <properties> - <property name="functionWhitelist" type="array" value="mysql_to_rfc3339,mysql_another_function"/> - </properties> - </rule> -``` - -This property was added in PHPCompatibility version 7.0.1. -As of PHPCompatibility version 8.0.0, this custom property is only supported in combination with PHP CodeSniffer > 2.6.0 due to an upstream bug (which was fixed in PHPCS 2.6.0). - -Projects extending PHPCompatibility --------------------------------------- -There are hundreds of public projects using PHPCompatibility or extending on top of it. A short list of some that you might know or have a look at : -* [adamculp/php-code-quality](https://github.com/adamculp/php-code-quality) - a Docker image doing a lot of code quality checks -* [VFAC/PHP7Compatibility](https://vfac.fr/projects/php7compatibility) - a Docker container to check PHP7 Compatibility -* [grumphp-php-compatibility](https://github.com/wunderio/grumphp-php-compatibility) - A plugin for [GrumPHP](https://github.com/phpro/grumphp) -* PHPCompatibility Checker WordPress plugin : [Wordpress site](https://wordpress.org/plugins/php-compatibility-checker/) and [Github](https://github.com/wpengine/phpcompat/) -* [WordPress Tide project](https://wptide.org/) -* [PHPStorm has built-in support for PHPCompatibility](https://www.jetbrains.com/help/phpstorm/using-php-code-sniffer.html#788c81b6) - -Contributing -------- -Contributions are very welcome. Please read the [CONTRIBUTING](.github/CONTRIBUTING.md) documentation to get started. - -License -------- -This code is released under the GNU Lesser General Public License (LGPL). For more information, visit http://www.gnu.org/copyleft/lesser.html diff --git a/vendor/phpcompatibility/php-compatibility/composer.json b/vendor/phpcompatibility/php-compatibility/composer.json deleted file mode 100644 index 38fbe63..0000000 --- a/vendor/phpcompatibility/php-compatibility/composer.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name" : "phpcompatibility/php-compatibility", - "description" : "A set of sniffs for PHP_CodeSniffer that checks for PHP cross-version compatibility.", - "type" : "phpcodesniffer-standard", - "keywords" : [ "compatibility", "phpcs", "standards" ], - "homepage" : "http://techblog.wimgodden.be/tag/codesniffer/", - "license" : "LGPL-3.0-or-later", - "authors" : [ { - "name" : "Wim Godden", - "role" : "lead", - "homepage" : "https://github.com/wimg" - }, - { - "name" : "Juliette Reinders Folmer", - "role" : "lead", - "homepage" : "https://github.com/jrfnl" - }, - { - "name" : "Contributors", - "homepage" : "https://github.com/PHPCompatibility/PHPCompatibility/graphs/contributors" - } ], - "support" : { - "issues" : "https://github.com/PHPCompatibility/PHPCompatibility/issues", - "source" : "https://github.com/PHPCompatibility/PHPCompatibility" - }, - "require" : { - "php" : ">=5.3", - "squizlabs/php_codesniffer" : "^2.3 || ^3.0.2" - }, - "require-dev" : { - "phpunit/phpunit": "~4.5 || ^5.0 || ^6.0 || ^7.0" - }, - "conflict": { - "squizlabs/php_codesniffer": "2.6.2" - }, - "suggest" : { - "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically.", - "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." - }, - "scripts" : { - "post-install-cmd": "\"vendor/bin/phpcs\" --config-set installed_paths ../../..", - "post-update-cmd" : "\"vendor/bin/phpcs\" --config-set installed_paths ../../.." - } -} diff --git a/vendor/phpcompatibility/php-compatibility/phpunit-bootstrap.php b/vendor/phpcompatibility/php-compatibility/phpunit-bootstrap.php deleted file mode 100644 index f66ec0c..0000000 --- a/vendor/phpcompatibility/php-compatibility/phpunit-bootstrap.php +++ /dev/null @@ -1,86 +0,0 @@ -<?php -/** - * PHPCompatibility, an external standard for PHP_CodeSniffer. - * - * Bootstrap file for tests. - * - * @package PHPCompatibility - * @copyright 2012-2019 PHPCompatibility Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCompatibility/PHPCompatibility - * - * @since 5.5 - */ - -if (defined('PHP_CODESNIFFER_IN_TESTS') === false) { - define('PHP_CODESNIFFER_IN_TESTS', true); -} - -// The below two defines are needed for PHPCS 3.x. -if (defined('PHP_CODESNIFFER_CBF') === false) { - define('PHP_CODESNIFFER_CBF', false); -} - -if (defined('PHP_CODESNIFFER_VERBOSITY') === false) { - define('PHP_CODESNIFFER_VERBOSITY', 0); -} - -$ds = DIRECTORY_SEPARATOR; - -// Get the PHPCS dir from an environment variable. -$phpcsDir = getenv('PHPCS_DIR'); - -// This may be a Composer install. -if ($phpcsDir === false && is_dir(__DIR__ . $ds . 'vendor' . $ds . 'squizlabs' . $ds . 'php_codesniffer')) { - $vendorDir = __DIR__ . $ds . 'vendor'; - $phpcsDir = $vendorDir . $ds . 'squizlabs' . $ds . 'php_codesniffer'; -} elseif ($phpcsDir !== false) { - $phpcsDir = realpath($phpcsDir); -} - -// Try and load the PHPCS autoloader. -if ($phpcsDir !== false && file_exists($phpcsDir . $ds . 'autoload.php')) { - // PHPCS 3.x. - require_once $phpcsDir . $ds . 'autoload.php'; - - /* - * Alias the PHPCS 3.x classes to their PHPCS 2.x equivalent if necessary. - * Also provide a custom autoloader for our abstract base classes as the PHPCS native autoloader - * has trouble with them in combination with the PHPCompatibility custom unit test suite. - */ - require_once __DIR__ . $ds . 'PHPCSAliases.php'; - -} elseif ($phpcsDir !== false && file_exists($phpcsDir . $ds . 'CodeSniffer.php')) { - // PHPCS 2.x. - require_once $phpcsDir . $ds . 'CodeSniffer.php'; - - if (isset($vendorDir) && file_exists($vendorDir . $ds . 'autoload.php')) { - require_once $vendorDir . $ds . 'autoload.php'; - } - -} else { - echo 'Uh oh... can\'t find PHPCS. - -If you use Composer, please run `composer install --prefer-source`. -Otherwise, make sure you set a `PHPCS_DIR` environment variable in your phpunit.xml file -pointing to the PHPCS directory. - -Please read the contributors guidelines for more information: -https://is.gd/PHPCompatibilityContrib -'; - - die(1); -} - - -// PHPUnit cross version compatibility. -if (class_exists('PHPUnit\Runner\Version') - && version_compare(PHPUnit\Runner\Version::id(), '6.0', '>=') - && class_exists('PHPUnit_Framework_TestCase') === false -) { - class_alias('PHPUnit\Framework\TestCase', 'PHPUnit_Framework_TestCase'); -} - -require_once __DIR__ . $ds . 'PHPCompatibility' . $ds . 'Tests' . $ds . 'BaseSniffTest.php'; -require_once __DIR__ . $ds . 'PHPCompatibility' . $ds . 'Util' . $ds . 'Tests' . $ds . 'CoreMethodTestFrame.php'; -unset($ds, $phpcsDir, $vendorDir); diff --git a/vendor/phpcompatibility/phpcompatibility-paragonie/LICENSE b/vendor/phpcompatibility/phpcompatibility-paragonie/LICENSE deleted file mode 100644 index 65c5ca8..0000000 --- a/vendor/phpcompatibility/phpcompatibility-paragonie/LICENSE +++ /dev/null @@ -1,165 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. diff --git a/vendor/phpcompatibility/phpcompatibility-paragonie/PHPCompatibilityParagonieRandomCompat/ruleset.xml b/vendor/phpcompatibility/phpcompatibility-paragonie/PHPCompatibilityParagonieRandomCompat/ruleset.xml deleted file mode 100644 index 52fc0fa..0000000 --- a/vendor/phpcompatibility/phpcompatibility-paragonie/PHPCompatibilityParagonieRandomCompat/ruleset.xml +++ /dev/null @@ -1,41 +0,0 @@ -<?xml version="1.0"?> -<ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="PHPCompatibilityParagonieRandomCompat" xsi:noNamespaceSchemaLocation="https://schema.phpcodesniffer.com/phpcs.xsd"> - - <description>PHPCompatibility ruleset for PHP_CodeSniffer which accounts for polyfills provided by the Paragonie random_compat library.</description> - - <rule ref="PHPCompatibility"> - <!-- https://github.com/paragonie/random_compat/blob/master/lib/random.php --> - <exclude name="PHPCompatibility.Constants.NewConstants.php_version_idFound"/> - - <!-- https://github.com/paragonie/random_compat/blob/master/lib/random_bytes_*.php --> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.random_bytesFound"/> - - <!-- https://github.com/paragonie/random_compat/blob/master/lib/random_int.php --> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.random_intFound"/> - - <!-- https://github.com/paragonie/random_compat/blob/master/lib/error_polyfill.php --> - <exclude name="PHPCompatibility.Classes.NewClasses.errorFound"/> - <exclude name="PHPCompatibility.Classes.NewClasses.typeerrorFound"/> - </rule> - - <!-- Prevent false positives being thrown when run over the code of random_compat itself. --> - <rule ref="PHPCompatibility.IniDirectives.RemovedIniDirectives.mbstring_func_overloadDeprecated"> - <exclude-pattern>/random_compat/lib/byte_safe_strings\.php$</exclude-pattern> - </rule> - <rule ref="PHPCompatibility.FunctionUse.NewFunctions.stream_set_chunk_sizeFound"> - <exclude-pattern>/random_compat/lib/random_bytes_dev_urandom\.php$</exclude-pattern> - </rule> - <rule ref="PHPCompatibility.Constants.RemovedConstants.mcrypt_dev_urandomDeprecatedRemoved"> - <exclude-pattern>/random_compat/lib/random_bytes_mcrypt\.php$</exclude-pattern> - </rule> - <rule ref="PHPCompatibility.Extensions.RemovedExtensions.mcryptDeprecatedRemoved"> - <exclude-pattern>/random_compat/lib/random_bytes_mcrypt\.php$</exclude-pattern> - </rule> - <rule ref="PHPCompatibility.FunctionUse.RemovedFunctions.mcrypt_create_ivDeprecatedRemoved"> - <exclude-pattern>/random_compat/lib/random_bytes_mcrypt\.php$</exclude-pattern> - </rule> - <rule ref="PHPCompatibility.LanguageConstructs.NewLanguageConstructs.t_ns_separatorFound"> - <exclude-pattern>/random_compat/lib/random_bytes_libsodium\.php$</exclude-pattern> - </rule> - -</ruleset> diff --git a/vendor/phpcompatibility/phpcompatibility-paragonie/PHPCompatibilityParagonieSodiumCompat/ruleset.xml b/vendor/phpcompatibility/phpcompatibility-paragonie/PHPCompatibilityParagonieSodiumCompat/ruleset.xml deleted file mode 100644 index 7c9ce2c..0000000 --- a/vendor/phpcompatibility/phpcompatibility-paragonie/PHPCompatibilityParagonieSodiumCompat/ruleset.xml +++ /dev/null @@ -1,252 +0,0 @@ -<?xml version="1.0"?> -<ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="PHPCompatibilityParagonieSodiumCompat" xsi:noNamespaceSchemaLocation="https://schema.phpcodesniffer.com/phpcs.xsd"> - - <description>PHPCompatibility ruleset for PHP_CodeSniffer which accounts for polyfills provided by the Paragonie sodium_compat library.</description> - - <!-- - Note: this ruleset does **not** contain excludes for the `sodium_pwhash()` and - the sodium_memzero() functions as, while those functions do exist in the polyfill, - they do not work and are explicitly excluded features. - See: https://github.com/paragonie/sodium_compat#features-excluded-from-this-polyfill - - With that in mind, these functions should not be used in code which intends to be - PHP cross-version compatible. - --> - - <!-- https://github.com/paragonie/sodium_compat/blob/master/composer.json --> - <rule ref="PHPCompatibilityParagonieRandomCompat"/> - - <rule ref="PHPCompatibility"> - <!-- https://github.com/paragonie/sodium_compat/blob/master/src/SodiumException.php --> - <exclude name="PHPCompatibility.Classes.NewClasses.sodiumexceptionFound"/> - - <!-- https://github.com/paragonie/sodium_compat/blob/master/lib/php72compat.php --> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_base64_variant_originalFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_base64_variant_original_no_paddingFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_base64_variant_urlsafeFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_base64_variant_urlsafe_no_paddingFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_aead_aes256gcm_keybytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_aead_aes256gcm_nsecbytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_aead_aes256gcm_npubbytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_aead_aes256gcm_abytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_aead_chacha20poly1305_keybytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_aead_chacha20poly1305_nsecbytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_aead_chacha20poly1305_npubbytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_aead_chacha20poly1305_abytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_aead_chacha20poly1305_ietf_keybytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_aead_chacha20poly1305_ietf_nsecbytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_aead_chacha20poly1305_ietf_npubbytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_aead_chacha20poly1305_ietf_abytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_aead_xchacha20poly1305_ietf_keybytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_aead_xchacha20poly1305_ietf_nsecbytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_aead_xchacha20poly1305_ietf_npubbytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_aead_xchacha20poly1305_ietf_abytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_auth_bytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_auth_keybytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_box_sealbytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_box_secretkeybytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_box_publickeybytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_box_keypairbytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_box_macbytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_box_noncebytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_box_seedbytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_kdf_bytes_minFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_kdf_bytes_maxFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_kdf_contextbytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_kdf_keybytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_kx_bytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_kx_keypairbytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_kx_publickeybytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_kx_secretkeybytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_kx_seedbytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_kx_sessionkeybytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_generichash_bytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_generichash_bytes_minFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_generichash_bytes_maxFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_generichash_keybytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_generichash_keybytes_minFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_generichash_keybytes_maxFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_pwhash_saltbytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_pwhash_strprefixFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_pwhash_alg_argon2i13Found"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_pwhash_alg_argon2id13Found"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_pwhash_memlimit_interactiveFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_pwhash_opslimit_interactiveFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_pwhash_memlimit_moderateFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_pwhash_opslimit_moderateFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_pwhash_memlimit_sensitiveFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_pwhash_opslimit_sensitiveFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_pwhash_scryptsalsa208sha256_saltbytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_pwhash_scryptsalsa208sha256_strprefixFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_pwhash_scryptsalsa208sha256_opslimit_interactiveFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_pwhash_scryptsalsa208sha256_memlimit_interactiveFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_pwhash_scryptsalsa208sha256_opslimit_sensitiveFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_pwhash_scryptsalsa208sha256_memlimit_sensitiveFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_scalarmult_bytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_scalarmult_scalarbytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_secretstream_xchacha20poly1305_abytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_secretstream_xchacha20poly1305_headerbytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_secretstream_xchacha20poly1305_keybytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_secretstream_xchacha20poly1305_messagebytes_maxFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_secretstream_xchacha20poly1305_tag_pushFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_secretstream_xchacha20poly1305_tag_rekeyFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_secretstream_xchacha20poly1305_tag_finalFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_shorthash_bytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_shorthash_keybytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_secretbox_keybytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_secretbox_macbytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_secretbox_noncebytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_sign_bytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_sign_seedbytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_sign_publickeybytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_sign_secretkeybytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_sign_keypairbytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_stream_keybytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_crypto_stream_noncebytesFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_library_versionFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_library_major_versionFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.sodium_library_minor_versionFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_addFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_base642binFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_bin2base64Found"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_bin2hexFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_compareFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_aead_aes256gcm_decryptFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_aead_aes256gcm_encryptFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_aead_aes256gcm_is_availableFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_aead_chacha20poly1305_decryptFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_aead_chacha20poly1305_encryptFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_aead_chacha20poly1305_keygenFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_aead_chacha20poly1305_ietf_decryptFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_aead_chacha20poly1305_ietf_encryptFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_aead_chacha20poly1305_ietf_keygenFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_aead_xchacha20poly1305_ietf_decryptFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_aead_xchacha20poly1305_ietf_encryptFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_aead_xchacha20poly1305_ietf_keygenFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_authFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_auth_keygenFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_auth_verifyFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_boxFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_box_keypairFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_box_keypair_from_secretkey_and_publickeyFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_box_openFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_box_publickeyFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_box_publickey_from_secretkeyFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_box_sealFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_box_seal_openFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_box_secretkeyFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_box_seed_keypairFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_generichashFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_generichash_finalFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_generichash_initFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_generichash_keygenFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_generichash_updateFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_kdf_derive_from_keyFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_kdf_keygenFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_kxFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_kx_client_session_keysFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_kx_keypairFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_kx_publickeyFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_kx_secretkeyFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_kx_seed_keypairFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_kx_server_session_keysFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_pwhash_strFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_pwhash_str_needs_rehashFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_pwhash_str_verifyFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_pwhash_scryptsalsa208sha256Found"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_pwhash_scryptsalsa208sha256_strFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_pwhash_scryptsalsa208sha256_str_verifyFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_scalarmultFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_scalarmult_baseFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_secretboxFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_secretbox_keygenFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_secretbox_openFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_secretstream_xchacha20poly1305_keygenFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_secretstream_xchacha20poly1305_init_pullFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_secretstream_xchacha20poly1305_init_pushFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_secretstream_xchacha20poly1305_pullFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_secretstream_xchacha20poly1305_pushFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_secretstream_xchacha20poly1305_rekeyFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_shorthashFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_shorthash_keygenFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_signFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_sign_detachedFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_sign_keypairFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_sign_keypair_from_secretkey_and_publickeyFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_sign_openFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_sign_publickeyFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_sign_publickey_from_secretkeyFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_sign_secretkeyFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_sign_seed_keypairFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_sign_verify_detachedFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_sign_ed25519_pk_to_curve25519Found"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_sign_ed25519_sk_to_curve25519Found"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_streamFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_stream_keygenFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_stream_xorFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_hex2binFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_incrementFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_library_versionFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_library_version_majorFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_library_version_minorFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_version_stringFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_memcmpFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_padFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_randombytes_bufFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_randombytes_uniformFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_randombytes_random16Found"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.sodium_unpadFound"/> - </rule> - - <!-- Prevent false positives being thrown when run over the code of sodium_compat itself. --> - <rule ref="PHPCompatibility.FunctionUse.NewFunctionParameters.assert_descriptionFound"> - <exclude-pattern>/sodium_compat/autoload\.php$</exclude-pattern> - </rule> - <rule ref="PHPCompatibility.FunctionNameRestrictions.NewMagicMethods.__debuginfoFound"> - <exclude-pattern>/sodium_compat/src/Core(32)?/Curve25519/Fe\.php$</exclude-pattern> - <exclude-pattern>/sodium_compat/src/Core/AES/Block\.php$</exclude-pattern> - </rule> - <rule ref="PHPCompatibility.FunctionNameRestrictions.NewMagicMethods.__serializeFound"> - <exclude-pattern>/sodium_compat/src/PHP52/SplFixedArray\.php$</exclude-pattern> - </rule> - <rule ref="PHPCompatibility.FunctionNameRestrictions.NewMagicMethods.__unserializeFound"> - <exclude-pattern>/sodium_compat/src/PHP52/SplFixedArray\.php$</exclude-pattern> - </rule> - <rule ref="PHPCompatibility.FunctionUse.NewFunctions.hash_equalsFound"> - <exclude-pattern>/sodium_compat/src/Core/Util\.php$</exclude-pattern> - </rule> - <rule ref="PHPCompatibility.ParameterValues.NewPackFormat.NewFormatFound"> - <exclude-pattern>/sodium_compat/src/Core/Util\.php$</exclude-pattern> - </rule> - <rule ref="PHPCompatibility.FunctionUse.NewFunctionParameters.openssl_decrypt_ivFound"> - <exclude-pattern>/sodium_compat/src/Compat\.php$</exclude-pattern> - </rule> - <rule ref="PHPCompatibility.FunctionUse.NewFunctionParameters.openssl_decrypt_tagFound"> - <exclude-pattern>/sodium_compat/src/Compat\.php$</exclude-pattern> - </rule> - <rule ref="PHPCompatibility.FunctionUse.NewFunctionParameters.openssl_decrypt_aadFound"> - <exclude-pattern>/sodium_compat/src/Compat\.php$</exclude-pattern> - </rule> - <rule ref="PHPCompatibility.FunctionUse.NewFunctionParameters.openssl_encrypt_ivFound"> - <exclude-pattern>/sodium_compat/src/Compat\.php$</exclude-pattern> - </rule> - <rule ref="PHPCompatibility.FunctionUse.NewFunctionParameters.openssl_encrypt_tagFound"> - <exclude-pattern>/sodium_compat/src/Compat\.php$</exclude-pattern> - </rule> - <rule ref="PHPCompatibility.FunctionUse.NewFunctionParameters.openssl_encrypt_aadFound"> - <exclude-pattern>/sodium_compat/src/Compat\.php$</exclude-pattern> - </rule> - <rule ref="PHPCompatibility.Constants.NewConstants.openssl_raw_dataFound"> - <exclude-pattern>/sodium_compat/src/Compat\.php$</exclude-pattern> - </rule> - <rule ref="PHPCompatibility.FunctionUse.NewFunctions.sodium_crypto_pwhashFound"> - <exclude-pattern>/sodium_compat/src/Compat\.php$</exclude-pattern> - </rule> - <rule ref="PHPCompatibility.FunctionUse.NewFunctions.sodium_memzeroFound"> - <exclude-pattern>/sodium_compat/src/Compat\.php$</exclude-pattern> - </rule> - <rule ref="PHPCompatibility.IniDirectives.RemovedIniDirectives.mbstring_func_overloadDeprecated"> - <exclude-pattern>/sodium_compat/src/Core/Util\.php$</exclude-pattern> - </rule> - -</ruleset> diff --git a/vendor/phpcompatibility/phpcompatibility-paragonie/README.md b/vendor/phpcompatibility/phpcompatibility-paragonie/README.md deleted file mode 100644 index a3b752a..0000000 --- a/vendor/phpcompatibility/phpcompatibility-paragonie/README.md +++ /dev/null @@ -1,156 +0,0 @@ -[![Latest Stable Version](https://img.shields.io/packagist/v/phpcompatibility/phpcompatibility-paragonie?label=stable)](https://packagist.org/packages/phpcompatibility/phpcompatibility-paragonie) -[![Latest Unstable Version](https://img.shields.io/badge/unstable-dev--develop-e68718.svg?maxAge=2419200)](https://packagist.org/packages/phpcompatibility/phpcompatibility-paragonie) -[![License](https://img.shields.io/github/license/PHPCompatibility/PHPCompatibilityParagonie?color=00a7a7)](https://github.com/PHPCompatibility/PHPCompatibilityParagonie/blob/master/LICENSE) -[![Build Status](https://github.com/PHPCompatibility/PHPCompatibilityParagonie/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/PHPCompatibility/PHPCompatibilityParagonie/actions/workflows/ci.yml) - -# PHPCompatibilityParagonie - -Using PHPCompatibilityParagonie, you can analyse the codebase of a project using either of the Paragonie polyfills, for PHP cross-version compatibility. - - -## What's in this repo ? - -Two rulesets for PHP_CodeSniffer to check for PHP cross-version compatibility issues in projects, while accounting for polyfills provided by the Paragonie polyfill libraries. - -These rulesets prevent false positives from the [PHPCompatibility standard](https://github.com/PHPCompatibility/PHPCompatibility) by excluding back-fills and poly-fills which are provided by those libraries. - -Paragonie Polyfill Library | Corresponding PHPCompatibility Ruleset | Includes ---- | --- | --- -[`random_compat`](https://github.com/paragonie/random_compat) | `PHPCompatibilityParagonieRandomCompat` -[`sodium_compat`](https://github.com/paragonie/sodium_compat) | `PHPCompatibilityParagonieSodiumCompat` | `PHPCompatibilityParagonieRandomCompat` - -> Note: -> As the `sodium_compat` library has `random_compat` [as a dependency](https://github.com/paragonie/sodium_compat/blob/master/composer.json), the `PHPCompatibilityParagonieSodiumCompat` ruleset includes the `PHPCompatibilityParagonieRandomCompat` ruleset. -> -> In practice, this means that if your project uses both libraries, you just need to use the `PHPCompatibilityParagonieSodiumCompat` ruleset to prevent false positives from both. - - -## Requirements - -* [PHP_CodeSniffer](https://github.com/PHPCSStandards/PHP_CodeSniffer). - * PHP 5.3+ for use with [PHP_CodeSniffer](https://github.com/PHPCSStandards/PHP_CodeSniffer) 2.3.0+. - * PHP 5.4+ for use with [PHP_CodeSniffer](https://github.com/PHPCSStandards/PHP_CodeSniffer) 3.0.2+. - - Use the latest stable release of PHP_CodeSniffer for the best results. - The minimum _recommended_ version of PHP_CodeSniffer is version 2.6.0. -* [PHPCompatibility](https://github.com/PHPCompatibility/PHPCompatibility) 9.0.0+. - - -## Installation instructions - -The only supported installation method is via [Composer](https://getcomposer.org/). - -If you don't have a Composer plugin installed to manage the `installed_paths` setting for PHP_CodeSniffer, run the following from the command-line: -```bash -composer config allow-plugins.dealerdirect/phpcodesniffer-composer-installer true -composer require --dev dealerdirect/phpcodesniffer-composer-installer:"^0.7" phpcompatibility/phpcompatibility-paragonie:"*" -``` - -If you already have a Composer PHP_CodeSniffer plugin installed, run: -```bash -composer require --dev phpcompatibility/phpcompatibility-paragonie:"*" -``` - -Next, run: -```bash -vendor/bin/phpcs -i -``` -If all went well, you will now see that the `PHPCompatibility`, `PHPCompatibilityParagonieRandomCompat` and `PHPCompatibilityParagonieSodiumCompat` standards are installed for PHP_CodeSniffer. - - -## How to use - -Now you can use the following commands to inspect the code in your project for PHP cross-version compatibility: -```bash -./vendor/bin/phpcs -p . --standard=PHPCompatibilityParagonieRandomCompat - -./vendor/bin/phpcs -p . --standard=PHPCompatibilityParagonieSodiumCompat -``` - -By default, you will only receive notifications about deprecated and/or removed PHP features. - -To get the most out of the PHPCompatibilityParagonie rulesets, you should specify a `testVersion` to check against. That will enable the checks for both deprecated/removed PHP features as well as the detection of code using new PHP features. - -For example: -```bash -# For a project which should be compatible with PHP 5.3 up to and including PHP 7.0: -./vendor/bin/phpcs -p . --standard=PHPCompatibilityParagonieRandomCompat --runtime-set testVersion 5.3-7.0 - -# For a project which should be compatible with PHP 5.4 and higher: -./vendor/bin/phpcs -p . --standard=PHPCompatibilityParagonieSodiumCompat --runtime-set testVersion 5.4- -``` - -For more detailed information about setting the `testVersion`, see the README of the generic [PHPCompatibility](https://github.com/PHPCompatibility/PHPCompatibility#sniffing-your-code-for-compatibility-with-specific-php-versions) standard. - - -### Testing PHP files only - -By default PHP_CodeSniffer will analyse PHP, JavaScript and CSS files. As the PHPCompatibility sniffs only target PHP code, you can make the run slightly faster by telling PHP_CodeSniffer to only check PHP files, like so: -```bash -./vendor/bin/phpcs -p . --standard=PHPCompatibilityParagonieRandomCompat --extensions=php --runtime-set testVersion 5.3- -``` - -## License - -All code within the PHPCompatibility organisation is released under the GNU Lesser General Public License (LGPL). For more information, visit https://www.gnu.org/copyleft/lesser.html - - -## Changelog - -### 1.3.4 - 2025-09-19 - -* Prevent a new false positive when the ruleset is run over the code of the latest 1.x version of the `sodium_compat` polyfill itself. -* Rulesets now annotate which schema they comply with. -* Other housekeeping and minor documentation updates. - -### 1.3.3 - 2024-04-25 - -* Prevent a new false positive when the ruleset is run over the code of the latest 1.x version of the `sodium_compat` polyfill itself. -* The recommended version of the [Composer PHPCS plugin] is now `^1.0`. -* Other housekeeping. Includes a contribution from [@fredden]. - -### 1.3.2 - 2022-10-25 - -* README: Updated the installation instructions for [compatibility with Composer >= 2.2][composer22announce]. -* Composer: The package will now identify itself as a static analysis tool. Thanks [@GaryJones]! -* Other housekeeping and minor documentation updates. - -[composer22announce]: https://blog.packagist.com/composer-2-2/#more-secure-plugin-execution - -### 1.3.1 - 2021-02-15 - -* The recommended version of the [Composer PHPCS plugin] is now `^0.7.0`, which offers compatibility with Composer 2.0. -* The rulesets are now also tested against PHP 7.4 and 8.0. - Note: full PHP 7.4 support is only available in combination with PHP_CodeSniffer >= 3.5.6. - Note: runtime PHP 8.0 support is only available in combination with PHP_CodeSniffer >= 3.5.7, full support is expected in PHP_CodeSniffer 3.6.0. - -### 1.3.0 - 2019-11-04 - -* Ruleset update for full compatibility with version [`1.12.0` of `sodium_compat`](https://github.com/paragonie/sodium_compat/releases/tag/v1.12.0). - -### 1.2.0 - 2019-10-16 - -* Ruleset update for full compatibility with version [`1.11.0` of `sodium_compat`](https://github.com/paragonie/sodium_compat/releases/tag/v1.11.0). - -### 1.1.0 - 2019-08-29 - -* The `PHPCompatibilityParagonieSodiumCompat` ruleset has been updated to account for the latest changes in the `sodium_compat` polyfill. -* Prevent false positives when the ruleset is run over the code of the `sodium_compat` polyfill itself. -* Composer: The recommended version of the [Composer PHPCS plugin] has been upped to `^0.5.0`. -* CI: Improved integration test for the `SodiumCompat` ruleset. -* CI: Added early warning system for false positives due to changes in the polyfill libraries themselves. - -### 1.0.1 - 2018-12-16 - -* Prevent false positives when the ruleset is run over the code of the `random_compat` polyfill itself. -* The rulesets are now also tested against PHP 7.3. - Note: full PHP 7.3 support is only available in combination with PHP_CodeSniffer 2.9.2 or 3.3.1+ due to an incompatibility within PHP_CodeSniffer itself. - -### 1.0.0 - 2018-10-07 - -Initial release of PHPCompatibilityParagonie containing rulesets covering the `random_compat` and `sodium_compat` polyfill libraries. - -[Composer PHPCS plugin]: https://github.com/PHPCSStandards/composer-installer/ - -[@fredden]: https://github.com/fredden -[@GaryJones]: https://github.com/GaryJones diff --git a/vendor/phpcompatibility/phpcompatibility-paragonie/composer.json b/vendor/phpcompatibility/phpcompatibility-paragonie/composer.json deleted file mode 100644 index 1cc902a..0000000 --- a/vendor/phpcompatibility/phpcompatibility-paragonie/composer.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name" : "phpcompatibility/phpcompatibility-paragonie", - "description" : "A set of rulesets for PHP_CodeSniffer to check for PHP cross-version compatibility issues in projects, while accounting for polyfills provided by the Paragonie polyfill libraries.", - "type" : "phpcodesniffer-standard", - "keywords" : [ "compatibility", "phpcs", "standards", "static analysis", "paragonie", "polyfill" ], - "homepage" : "http://phpcompatibility.com/", - "license" : "LGPL-3.0-or-later", - "authors" : [ { - "name" : "Wim Godden", - "role" : "lead" - }, - { - "name" : "Juliette Reinders Folmer", - "role" : "lead" - } ], - "support" : { - "issues" : "https://github.com/PHPCompatibility/PHPCompatibilityParagonie/issues", - "source" : "https://github.com/PHPCompatibility/PHPCompatibilityParagonie", - "security": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie/security/policy" - }, - "config": { - "allow-plugins": { - "dealerdirect/phpcodesniffer-composer-installer": true - }, - "lock": false - }, - "require" : { - "phpcompatibility/php-compatibility" : "^9.0" - }, - "require-dev" : { - "dealerdirect/phpcodesniffer-composer-installer": "^1.0", - "paragonie/random_compat": "dev-master", - "paragonie/sodium_compat": "dev-master" - }, - "suggest" : { - "dealerdirect/phpcodesniffer-composer-installer": "^1.0 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.", - "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." - }, - "prefer-stable" : true -} diff --git a/vendor/phpcompatibility/phpcompatibility-wp/LICENSE b/vendor/phpcompatibility/phpcompatibility-wp/LICENSE deleted file mode 100644 index 65c5ca8..0000000 --- a/vendor/phpcompatibility/phpcompatibility-wp/LICENSE +++ /dev/null @@ -1,165 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. diff --git a/vendor/phpcompatibility/phpcompatibility-wp/PHPCompatibilityWP/ruleset.xml b/vendor/phpcompatibility/phpcompatibility-wp/PHPCompatibilityWP/ruleset.xml deleted file mode 100644 index e5cce51..0000000 --- a/vendor/phpcompatibility/phpcompatibility-wp/PHPCompatibilityWP/ruleset.xml +++ /dev/null @@ -1,89 +0,0 @@ -<?xml version="1.0"?> -<ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="PHPCompatibilityWP" xsi:noNamespaceSchemaLocation="https://schema.phpcodesniffer.com/phpcs.xsd"> - - <description>WordPress specific ruleset which checks for PHP cross version compatibility.</description> - - <!-- - The WordPress minimum PHP requirement was 5.2.4 up to WP 5.1. - As of WP 5.2, the new minimum PHP requirement is PHP 5.6.20. - As of WP 6.3, the new minimum PHP requirement is PHP 7.0.0. - As of WP 6.6, the new minimum PHP requirement is PHP 7.2.24. - Add the following in your project PHP_CodeSniffer ruleset to enforce this: - <config name="testVersion" value="7.2-"/> - - This directive is not included in this ruleset as individual projects may use - a different (higher) minimum PHP version. - --> - - <rule ref="PHPCompatibility"> - <!-- - Contained in /wp-includes/compat.php. - - History of the polyfills in WP: - * hash_hmac(): since WP 3.2.0. - * json_encode() and json_decode(): since unknown. - * hash_equals(): since WP 3.9.2. - * JSON_PRETTY_PRINT: since WP 4.1.0. - * json_last_error_msg(): since WP 4.4.0. - * JsonSerializable: since WP 4.4.0. - * array_replace_recursive(): since WP 4.5.3 up to 5.2.x. The polyfill was removed in WP 5.3. - * is_iterable(): since WP 4.9.6 - * is_countable(): since WP 4.9.6 - * IMAGETYPE_WEBP and IMG_WEBP: since WP 5.8.0. - * array_key_first(): since WP 5.9.0 - * array_key_last(): since WP 5.9.0 - * str_contains(): since WP 5.9.0 - * str_starts_with(): since WP 5.9.0 - * str_ends_with(): since WP 5.9.0 - * array_is_list(): since WP 6.5.0 - --> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.hash_hmacFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.json_encodeFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.json_decodeFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.hash_equalsFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.json_pretty_printFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.json_last_error_msgFound"/> - <exclude name="PHPCompatibility.Interfaces.NewInterfaces.jsonserializableFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.array_replace_recursiveFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.is_iterableFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.is_countableFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.imagetype_webpFound"/> - <exclude name="PHPCompatibility.Constants.NewConstants.img_webpFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.array_key_firstFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.array_key_lastFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.str_containsFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.str_starts_withFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.str_ends_withFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.array_is_listFound"/> - - <!-- - Contained in /wp-includes/spl-autoload-compat.php. - - History of the polyfills in WP: - * spl_autoload_register(), spl_autoload_unregister() and spl_autoload_functions() were - introduced in WP 4.6.0 and available up to WP 5.2.x. The polyfills were removed in WP 5.3. - --> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.spl_autoload_registerFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.spl_autoload_unregisterFound"/> - <exclude name="PHPCompatibility.FunctionUse.NewFunctions.spl_autoload_functionsFound"/> - </rule> - - <!-- - The ParagonieSodiumCompat ruleset includes the ParagonieRandomCompat ruleset. - - RandomCompat is contained in /wp-includes/random_compat/ since WP 4.4.0 and removed in WP 6.3.0 - SodiumCompat is contained in /wp-includes/sodium_compat/ since WP 5.2.0 - --> - <rule ref="PHPCompatibilityParagonieSodiumCompat"/> - - <!-- Whitelist the WP Core mysql_to_rfc3339() function. --> - <rule ref="PHPCompatibility.Extensions.RemovedExtensions"> - <properties> - <!-- Contained in /wp-includes/functions.php. --> - <property name="functionWhitelist" type="array"> - <element value="mysql_to_rfc3339"/> - </property> - </properties> - </rule> - -</ruleset> diff --git a/vendor/phpcompatibility/phpcompatibility-wp/README.md b/vendor/phpcompatibility/phpcompatibility-wp/README.md deleted file mode 100644 index 826be0f..0000000 --- a/vendor/phpcompatibility/phpcompatibility-wp/README.md +++ /dev/null @@ -1,159 +0,0 @@ -[![Latest Stable Version](https://img.shields.io/packagist/v/phpcompatibility/phpcompatibility-wp?label=stable)](https://packagist.org/packages/phpcompatibility/phpcompatibility-wp) -[![Latest Unstable Version](https://img.shields.io/badge/unstable-dev--develop-e68718.svg?maxAge=2419200)](https://packagist.org/packages/phpcompatibility/phpcompatibility-wp) -[![License](https://img.shields.io/github/license/PHPCompatibility/PHPCompatibilityWP?color=00a7a7)](https://github.com/PHPCompatibility/PHPCompatibilityWP/blob/master/LICENSE) -[![Build Status](https://github.com/PHPCompatibility/PHPCompatibilityWP/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/PHPCompatibility/PHPCompatibilityWP/actions/workflows/ci.yml) - -# PHPCompatibilityWP - -Using PHPCompatibilityWP, you can analyse the codebase of a WordPress-based project for PHP cross-version compatibility. - - -## What's in this repo ? - -A ruleset for PHP_CodeSniffer to check for PHP cross-version compatibility issues in projects based on the WordPress CMS. - -This WordPress specific ruleset prevents false positives from the [PHPCompatibility standard](https://github.com/PHPCompatibility/PHPCompatibility) by excluding back-fills and poly-fills which are provided by WordPress. - - -## Requirements - -* [PHP_CodeSniffer](https://github.com/PHPCSStandards/PHP_CodeSniffer). - * PHP 5.4+ for use with [PHP_CodeSniffer](https://github.com/PHPCSStandards/PHP_CodeSniffer) 3.3.0+. - - Use the latest stable release of PHP_CodeSniffer for the best results. -* [PHPCompatibility](https://github.com/PHPCompatibility/PHPCompatibility) 9.0.0+. -* [PHPCompatibilityParagonie](https://github.com/PHPCompatibility/PHPCompatibilityParagonie) 1.0.0+. - - -## Installation instructions - -The only supported installation method is via [Composer](https://getcomposer.org/). - -If you don't have a Composer plugin installed to manage the `installed_paths` setting for PHP_CodeSniffer, run the following from the command-line: -```bash -composer config allow-plugins.dealerdirect/phpcodesniffer-composer-installer true -composer require --dev dealerdirect/phpcodesniffer-composer-installer:"^1.0" phpcompatibility/phpcompatibility-wp:"*" -``` - -If you already have a Composer PHP_CodeSniffer plugin installed, run: -```bash -composer require --dev phpcompatibility/phpcompatibility-wp:"*" -``` - -Next, run: -```bash -vendor/bin/phpcs -i -``` -If all went well, you will now see that the `PHPCompatibility`, `PHPCompatibilityWP` and some more PHPCompatibility standards are installed for PHP_CodeSniffer. - - -## How to use - -Now you can use the following command to inspect your code: -```bash -./vendor/bin/phpcs -p . --standard=PHPCompatibilityWP -``` - -By default, you will only receive notifications about deprecated and/or removed PHP features. - -To get the most out of the PHPCompatibilityWP standard, you should specify a `testVersion` to check against. That will enable the checks for both deprecated/removed PHP features as well as the detection of code using new PHP features. - -The minimum PHP requirement of the WordPress project up to WP 5.1 was 5.2.4. As of WP 5.2 it will be PHP 5.6.20. If you want to enforce this, either add `--runtime-set testVersion 5.6-` to your command-line command or add `<config name="testVersion" value="5.6-"/>` to your [custom ruleset](https://github.com/PHPCompatibility/PHPCompatibility#using-a-custom-ruleset). - -For example: -```bash -# For a project which should be compatible with PHP 5.6 and higher: -./vendor/bin/phpcs -p . --standard=PHPCompatibilityWP --runtime-set testVersion 5.6- -``` - -For more detailed information about setting the `testVersion`, see the README of the generic [PHPCompatibility](https://github.com/PHPCompatibility/PHPCompatibility#sniffing-your-code-for-compatibility-with-specific-php-versions) standard. - - -### Testing PHP files only - -By default PHP_CodeSniffer will analyse PHP, JavaScript and CSS files. As the PHPCompatibility sniffs only target PHP code, you can make the run slightly faster by telling PHP_CodeSniffer to only check PHP files, like so: -```bash -./vendor/bin/phpcs -p . --standard=PHPCompatibilityWP --extensions=php --runtime-set testVersion 5.6- -``` - -## License - -All code within the PHPCompatibility organisation is released under the GNU Lesser General Public License (LGPL). For more information, visit https://www.gnu.org/copyleft/lesser.html - - -## Changelog - -### 2.1.8 - 2025-10-18 - -This is a maintenance release. - -* The ruleset now includes schema tags. -* General housekeeping and maintenance. - -### 2.1.7 - 2025-05-12 - -* Composer: The minimum supported version of PHP_CodeSniffer has been raised to 3.3.0. -* Ruleset: Prevent deprecation notice on PHP_CodeSniffer 3.13.0+. - -### 2.1.6 - 2025-01-16 - -* README: Fixed some broken badges. -* General housekeeping and documentation updates. Including a contribution by [@johnbillion]. - -### 2.1.5 - 2024-04-25 - -* Ruleset: Updated for compatibility with WordPress 6.5. Thanks [@swissspidy] -* The recommended version of the [Composer PHPCS plugin] is now `^1.0`. -* Other housekeeping and documentation updates. Includes contributions from [@fredden] and [@johnbillion]. - -### 2.1.4 - 2022-10-24 - -* Composer: The package will now identify itself as a static analysis tool. Thanks [@GaryJones]! -* Other housekeeping and minor documentation updates. - -### 2.1.3 - 2021-12-31 - -* Ruleset: Updated for compatibility with WordPress 5.9. -* README: Updated the installation instructions for [compatibility with Composer >= 2.2][composer22announce]. -* Minor housekeeping. - -[composer22announce]: https://blog.packagist.com/composer-2-2/#more-secure-plugin-execution - -### 2.1.2 - 2021-07-21 - -* Ruleset: Updated for compatibility with WordPress 5.8. -* Documentation: improved installation instructions. Props [Andy Fragen](https://github.com/afragen). - -### 2.1.1 - 2021-02-15 - -* The recommended version of the [Composer PHPCS plugin] is now `^0.7.0`, which offers compatibility with Composer 2.0. -* The ruleset is now also tested against PHP 7.4 and 8.0. - Note: full PHP 7.4 support is only available in combination with PHP_CodeSniffer >= 3.5.6. - Note: runtime PHP 8.0 support is only available in combination with PHP_CodeSniffer >= 3.5.7, full support is expected in PHP_CodeSniffer 3.6.0. - -### 2.1.0 - 2019-08-29 - -* Ruleset: Updated for the Sodium_Compat polyfill which is included in WordPress 5.2. -* Composer: The recommended version of the [Composer PHPCS plugin] has been upped to `^0.5.0`. -* Documentation: Updated the ruleset inline documentation and the Readme to reflect the change in minimum PHP requirements for WordPress as of WP 5.2. -* Documentation: Updated the ruleset inline documentation to include information on when each polyfill was added to/removed from WordPress. -* CI: The rulesets are now also tested against PHP 7.3. - Note: full PHP 7.3 support is only available in combination with PHP_CodeSniffer 2.9.2 or 3.3.1+ due to an incompatibility within PHP_CodeSniffer itself. - -### 2.0.0 - 2018-10-07 - -* Ruleset: Updated for compatibility with PHPCompatibility 9.0+. -* Composer: Added dependency for a dedicated polyfill-based PHPCompatibility ruleset. -* CI: Added a test for the ruleset. -* Readme: Removed the installation instructions for a non-Composer based install. - -### 1.0.0 - 2018-07-17 - -Initial release of the PHPCompatibilityWP ruleset. - -[Composer PHPCS plugin]: https://github.com/PHPCSStandards/composer-installer/ - -[@fredden]: https://github.com/fredden -[@GaryJones]: https://github.com/GaryJones -[@johnbillion]: https://github.com/johnbillion -[@swissspidy]: https://github.com/swissspidy diff --git a/vendor/phpcompatibility/phpcompatibility-wp/composer.json b/vendor/phpcompatibility/phpcompatibility-wp/composer.json deleted file mode 100644 index e3f655e..0000000 --- a/vendor/phpcompatibility/phpcompatibility-wp/composer.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name" : "phpcompatibility/phpcompatibility-wp", - "description" : "A ruleset for PHP_CodeSniffer to check for PHP cross-version compatibility issues in projects, while accounting for polyfills provided by WordPress.", - "type" : "phpcodesniffer-standard", - "keywords" : [ "compatibility", "phpcs", "standards", "static analysis", "wordpress" ], - "homepage" : "http://phpcompatibility.com/", - "license" : "LGPL-3.0-or-later", - "authors" : [ { - "name" : "Wim Godden", - "role" : "lead" - }, - { - "name" : "Juliette Reinders Folmer", - "role" : "lead" - } ], - "support" : { - "issues" : "https://github.com/PHPCompatibility/PHPCompatibilityWP/issues", - "source" : "https://github.com/PHPCompatibility/PHPCompatibilityWP", - "security": "https://github.com/PHPCompatibility/PHPCompatibilityWP/security/policy" - }, - "config": { - "allow-plugins": { - "dealerdirect/phpcodesniffer-composer-installer": true - }, - "lock": false - }, - "require" : { - "squizlabs/php_codesniffer" : "^3.3", - "phpcompatibility/php-compatibility" : "^9.0", - "phpcompatibility/phpcompatibility-paragonie" : "^1.0" - }, - "require-dev" : { - "dealerdirect/phpcodesniffer-composer-installer": "^1.0" - }, - "suggest" : { - "dealerdirect/phpcodesniffer-composer-installer": "^1.0 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.", - "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." - }, - "prefer-stable" : true -} diff --git a/vendor/phpcsstandards/phpcsextra/CHANGELOG.md b/vendor/phpcsstandards/phpcsextra/CHANGELOG.md deleted file mode 100644 index 56c4ce9..0000000 --- a/vendor/phpcsstandards/phpcsextra/CHANGELOG.md +++ /dev/null @@ -1,781 +0,0 @@ -# Change Log for the PHPCSExtra standard for PHP_CodeSniffer - -All notable changes to this project will be documented in this file. - -This projects adheres to [Keep a CHANGELOG](https://keepachangelog.com/) and uses [Semantic Versioning](https://semver.org/). - -**Legend**: -:wrench: = Includes auto-fixer. -:bar_chart: = Includes metrics. -:books: = Includes CLI documentation. - - -## [Unreleased] - -_Nothing yet._ - - -## [1.5.0] - 2025-11-12 - -### Added - -#### Universal - -* :wrench: :bar_chart: :books: New `Universal.Attributes.BracketSpacing` sniff to enforce a fixed number of spaces on the inside of attribute block brackets. [#386], [#406] - The sniff offers the following properties to influence its behaviour: - - `spacing` (defaults to `0`). - - `ignoreNewlines` (defaults to `false`). - When new lines are allowed (`ignoreNewlines`=`true`) and a new line is found, the sniff will verify that there are no superfluous blank lines at the start/end of an attribute block. -* :wrench: :bar_chart: :books: New `Universal.Attributes.DisallowAttributeParentheses` sniff to forbid parentheses for attribute instantiations without arguments. [#387], [#409] -* :wrench: :bar_chart: :books: New `Universal.Attributes.RequireAttributeParentheses` sniff to demand that all attribute instantiations always use parentheses, even if no argument is passed. [#387], [#410] -* :wrench: :bar_chart: :books: New `Universal.Attributes.TrailingComma` sniff to demand a trailing comma for multi-line, multi-attribute attribute blocks and forbid trailing commas in single-line attribute blocks and in multi-line attributes containing only a single attribute. [#397], [#413] -* :wrench: :bar_chart: :books: New `Universal.PHP.DisallowExitDieParentheses` sniff to forbid invocations of `exit`/`die` with parentheses when no argument is passed. [#399] -* :wrench: :bar_chart: :books: New `Universal.PHP.RequireExitDieParentheses` sniff to demand that invocations of `exit`/`die` always use parentheses, even if no argument is passed. [#398] -* :wrench: :books: New `Universal.WhiteSpace.FirstClassCallableSpacing` sniff to enforce the spacing around the ellipses for first class callables. [#385] - The sniff offers the following property to influence its behaviour: `spacing` (defaults to `0`). - -### Changed - -#### Universal - -* `Universal.WhiteSpace.CommaSpacing`: improved handling of commas in PHP attributes. [#391], [#412] - - The spacing after a trailing comma (after the last attribute in a block) will no longer be checked to prevent potential conflicts with attribute bracket spacing sniffs. - - Spacing errors for commas between attributes in an attribute block will now get an `*InAttributeBlock` error code suffix, so in-/excluding them selectively is more straight-forward. - Note: spacing around commas between _parameters passed to an attribute_ will still be reported with the `*InFunctionCall` error code suffix, same as before. - - Metrics for comma spacing in attribute blocks is now also measured and reported separately. - -#### Other - -* Composer: The minimum `PHP_CodeSniffer` requirement has been updated to `^3.13.5 || ^4.0.1` (was `^3.13.4 || ^4.0.0`). [#408] -* Composer: The minimum `PHPCSUtils` requirement has been updated to `^1.2.0` (was `^1.1.2`). [#408] -* Various housekeeping. - -[#385]: https://github.com/PHPCSStandards/PHPCSExtra/pull/385 -[#386]: https://github.com/PHPCSStandards/PHPCSExtra/issues/386 -[#387]: https://github.com/PHPCSStandards/PHPCSExtra/issues/387 -[#391]: https://github.com/PHPCSStandards/PHPCSExtra/issues/391 -[#397]: https://github.com/PHPCSStandards/PHPCSExtra/issues/397 -[#398]: https://github.com/PHPCSStandards/PHPCSExtra/pull/398 -[#399]: https://github.com/PHPCSStandards/PHPCSExtra/pull/399 -[#406]: https://github.com/PHPCSStandards/PHPCSExtra/pull/406 -[#408]: https://github.com/PHPCSStandards/PHPCSExtra/pull/408 -[#409]: https://github.com/PHPCSStandards/PHPCSExtra/pull/409 -[#410]: https://github.com/PHPCSStandards/PHPCSExtra/pull/410 -[#412]: https://github.com/PHPCSStandards/PHPCSExtra/pull/412 -[#413]: https://github.com/PHPCSStandards/PHPCSExtra/pull/413 - - -## [1.4.2] - 2025-10-28 - -### Changed - -#### Other - -* Various housekeeping. - -### Fixed - -#### Universal - -* `Universal.OOStructures.AlphabeticExtendsImplements` incorrectly displayed the "expected" and "found" names. [#378] -* `Universal.WhiteSpace.CommaSpacing` could accidentally cause a fatal error if the content adjacent to the comma was a text string containing percentage signs. Thanks [@westonruter] for reporting! [#400], [#401] - -[#378]: https://github.com/PHPCSStandards/PHPCSExtra/pull/378 -[#400]: https://github.com/PHPCSStandards/PHPCSExtra/issues/400 -[#401]: https://github.com/PHPCSStandards/PHPCSExtra/pull/401 - - -## [1.4.1] - 2025-09-05 - -### Changed - -#### Other - -* Various housekeeping. - - -### Fixed - -#### Universal - -* `Universal.PHP.NoFQNTrueFalseNull`: fix breakage due to upstream change in tokenization. [#375] - -[#375]: https://github.com/PHPCSStandards/PHPCSExtra/pull/375 - - -## [1.4.0] - 2025-06-14 - -### Added - -* All sniffs: compatibility with the new PHP_CodeSniffer `4.x` branch in anticipation of the PHP_CodeSniffer 4.0 release. [#367] - PHPCSExtra should now be fully compatible with PHP_CodeSniffer 4.0. If you still find an issue, please report it. - -### Changed - -#### Other - -* Composer: The minimum `PHP_CodeSniffer` requirement has been updated to `^3.13.0` (was `^3.12.1`). [#361] -* Composer: The minimum `PHPCSUtils` requirement has been updated to `^1.1.0` (was `^1.0.12`). [#361] -* Various housekeeping. - -### Deprecated - -#### Universal - -* `Universal.WhiteSpace.PrecisionAlignment`: support for scanning JS/CSS files via this sniff is now deprecated. [#367] - -### Fixed - -#### Universal - -* `Universal.Arrays.DuplicateArrayKey`: false positives for numeric strings with leading/trailing underscores. Fixed via the update to PHPCSUtils 1.1.0. [#363] -* `Universal.Arrays.DuplicateArrayKey`: false negatives for fully qualified `true`/`false`/`null` arrays keys. Fixed via the update to PHPCSUtils 1.1.0. [#363] -* `Universal.WhiteSpace.CommaSpacing`: wrong errorcode for comma's in closure use statements after the update to PHPCSUtils 1.1.0. [#362] - -[#361]: https://github.com/PHPCSStandards/PHPCSExtra/pull/361 -[#362]: https://github.com/PHPCSStandards/PHPCSExtra/pull/362 -[#363]: https://github.com/PHPCSStandards/PHPCSExtra/pull/363 -[#367]: https://github.com/PHPCSStandards/PHPCSExtra/pull/367 - - -## [1.3.1] - 2025-06-08 - -### Changed - -#### Other - -* Composer: The minimum `PHPCSUtils` requirement has been updated to `^1.0.12` (was `^1.0.9`). [#346] -* Various housekeeping. - -### Fixed - -#### Universal - -* `Universal.UseStatements.DisallowMixedGroupUse`: the fixer could get confused when the "base" name for the group name contained a leading backslash, leading to parse errors in the fixed code. [#350] - -[#346]: https://github.com/PHPCSStandards/PHPCSExtra/pull/346 -[#350]: https://github.com/PHPCSStandards/PHPCSExtra/pull/350 - - -## [1.3.0] - 2025-04-21 - -### Added - -#### Universal - -* :wrench: :books: New `Universal.PHP.NoFQNTrueFalseNull` sniff to forbid using `true`, `false` and `null` as fully qualified constants. Thanks [@rodrigoprimo] for reviewing. [#327] -* `Universal.Operators.TypeSeparatorSpacing`: support for checking the spacing around the parentheses used in PHP 8.2+ DNF types. [#329] - -### Changed - -#### Universal - -* The `Universal.WhiteSpace.DisallowInlineTabs` sniff will now also check for inline tabs in heredoc/nowdoc openers and between the `yield` and `from` keywords. [#320] - -#### Other - -* Composer: The minimum `PHP_CodeSniffer` requirement has been updated to `^3.12.1` (was `^3.8.0`). [#330] -* Developer happiness: prevent creating a `composer.lock` file. Thanks [@fredden]! [#307] -* Various housekeeping, including improvements to the documentation and tests. - -[#307]: https://github.com/PHPCSStandards/PHPCSExtra/pull/307 -[#320]: https://github.com/PHPCSStandards/PHPCSExtra/pull/320 -[#327]: https://github.com/PHPCSStandards/PHPCSExtra/pull/327 -[#329]: https://github.com/PHPCSStandards/PHPCSExtra/pull/329 -[#330]: https://github.com/PHPCSStandards/PHPCSExtra/pull/330 - - -## [1.2.1] - 2023-12-08 - -### Changed - -#### Other - -* Composer: The minimum `PHP_CodeSniffer` requirement has been updated to `^3.8.0` (was `^3.7.2`). [#298] -* Composer: The minimum `PHPCSUtils` requirement has been updated to `^1.0.9` (was `^1.0.8`). [#298] - -Please ensure you run `composer update phpcsstandards/phpcsextra --with-dependencies` to benefit from this. - -[#298]: https://github.com/PHPCSStandards/PHPCSExtra/pull/298 - - -## [1.2.0] - 2023-12-02 - -### Added - -#### Universal - -* :wrench: :books: New `Universal.CodeAnalysis.NoDoubleNegative` sniff to detect double negatives (!!) and advise to use a boolean cast instead. Thanks [@diedexx] for reviewing. [#277] -* :wrench: :books: New `Universal.Operators.ConcatPosition` sniff to enforce that the concatenation operator for multi-line concatenations is in a preferred position, either always at the start of the next line or always at the end of the previous line. [#294] -* :wrench: :bar_chart: :books: New `Universal.PHP.LowercasePHPTag` sniff to enforce that the "PHP" in a PHP open tag is lowercase. Thanks [@fredden] for reviewing. [#276] - -### Changed - -#### NormalizedArrays - -* `NormalizedArrays.Arrays.CommaAfterLast`: the sniff now has two extra error codes to distinguish between multi-line arrays with the last array item on the _same line_ as the array closer vs the last array item being on a line _before_ the array closer. Thanks [@stronk7] for suggesting and patching this. [#283], [#284] - These new error codes allow for selectively excluding that specific situation from triggering the sniff. - The new error codes are `FoundMultiLineCloserSameLine` (for `multiLine="forbid"`) and `MissingMultiLineCloserSameLine` (for `multiLine="enforce"`). - The pre-existing `FoundMultiLine` and `FoundSingleLine` error codes continue to be used for multi-line arrays with the last array item on a different line than the array closer. - -#### Other - -* Various housekeeping. - -[#276]: https://github.com/PHPCSStandards/PHPCSExtra/pull/276 -[#277]: https://github.com/PHPCSStandards/PHPCSExtra/pull/277 -[#283]: https://github.com/PHPCSStandards/PHPCSExtra/issues/283 -[#284]: https://github.com/PHPCSStandards/PHPCSExtra/pull/284 -[#294]: https://github.com/PHPCSStandards/PHPCSExtra/pull/294 - - -## [1.1.2] - 2023-09-21 - -### Changed - -#### Other - -* Various housekeeping. - -### Fixed - -#### Universal - -* `Universal.CodeAnalysis.ConstructorDestructorReturn`: the sniff will now correctly ignore methods mirroring the class name (PHP-4 style constructors) in namespaced code. [#207], [#272] - -[#272]: https://github.com/PHPCSStandards/PHPCSExtra/pull/272 - - -## [1.1.1] - 2023-08-26 - -### Changed - -#### Modernize - -* `Modernize.FunctionCalls.Dirname`: the sniff will now respect a potentially set [`php_version` configuration option][php_version-config] and only report on modernizations which are possible on the configured `php_version`. [#261] - If the `php_version` is not set, the sniff will continue to report on all modernization options. - -#### Other - -* Various documentation improvements. Props in part to [@szepeviktor]. -* Improved defensive coding in select places. -* Various housekeeping. - -[#261]: https://github.com/PHPCSStandards/PHPCSExtra/pull/261 - - -## [1.1.0] - 2023-07-19 - -### Added - -#### Universal - -* :wrench: :books: New `Universal.CodeAnalysis.NoEchoSprintf` sniff to detect use of the inefficient `echo [v]sprintf(...);` combi and recommends using `[v]printf()` instead. [#242] -* :bar_chart: :books: New `Universal.FunctionDeclarations.NoLongClosures` sniff to detect "long" closures and recommend using a named function instead. [#240] - The sniff offers the following properties to influence its behaviour: `recommendedLines` (defaults to `5`), `maxLines` (defaults to `8`), `ignoreCommentLines` (defaults to `true`) and `ignoreEmptyLines` (defaults to `true`). -* :wrench: :bar_chart: :books: New `Universal.FunctionDeclarations.RequireFinalMethodsInTraits` sniff to enforce non-private, non-abstract methods in traits to be declared as `final`. [#243], [#245] - There is a separate `NonFinalMagicMethodFound` error code for magic methods to allow those to be excluded from the check. -* :wrench: :bar_chart: :books: New `Universal.UseStatements.DisallowMixedGroupUse` sniff to disallow group use statements which import a combination of namespace/OO construct, functions and/or constants in one statement. [#241], [#246] - Note: the fixer will use a semi-standardized format for group use statements. If there are more specific requirements for the formatting of group use statements, the ruleset configurator should ensure that additional sniffs are included in the ruleset to enforce the required format. -* :wrench: :bar_chart: :books: New `Universal.UseStatements.KeywordSpacing` sniff to enforce the use of a single space after the `use`, `function`, `const` keywords and both before and after the `as` keyword in import `use` statements. [#247] - The sniff has modular error codes to allow for disabling individual checks. -* :wrench: :books: New `Universal.UseStatements.NoUselessAliases` sniff to detect useless aliases (aliasing something to its original name) in import use statements. [#244] - Note: as OO and function names in PHP are case-insensitive, aliasing to the same name, using a different case is also considered useless. -* :wrench: :bar_chart: :books: New `Universal.WhiteSpace.CommaSpacing` sniff to enforce that there is no space before a comma and exactly one space, or a new line, after a comma. [#254] - Additionally, the sniff also enforces that the comma should follow the code and not be placed after a trailing comment. - The sniff has modular error codes to allow for disabling individual checks and checks in certain contexts. - The sniff will respect a potentially set [`php_version` configuration option][php_version-config] when deciding how to handle the spacing after a heredoc/nowdoc closer. - -### Changed - -#### Universal - -* Minor performance improvements for the `Universal.Arrays.DuplicateArrayKey` and the `Universal.CodeAnalysis.ConstructorDestructorReturn` sniffs. [#251], [#252] - -#### Other - -* Composer: The minimum `PHPCSUtils` requirement has been updated to `^1.0.8` (was `^1.0.6`). [#249], [#254] -* Various housekeeping. - -[#240]: https://github.com/PHPCSStandards/PHPCSExtra/pull/240 -[#241]: https://github.com/PHPCSStandards/PHPCSExtra/pull/241 -[#242]: https://github.com/PHPCSStandards/PHPCSExtra/pull/242 -[#243]: https://github.com/PHPCSStandards/PHPCSExtra/pull/243 -[#244]: https://github.com/PHPCSStandards/PHPCSExtra/pull/244 -[#245]: https://github.com/PHPCSStandards/PHPCSExtra/pull/245 -[#246]: https://github.com/PHPCSStandards/PHPCSExtra/pull/246 -[#247]: https://github.com/PHPCSStandards/PHPCSExtra/pull/247 -[#249]: https://github.com/PHPCSStandards/PHPCSExtra/pull/249 -[#251]: https://github.com/PHPCSStandards/PHPCSExtra/pull/251 -[#252]: https://github.com/PHPCSStandards/PHPCSExtra/pull/252 -[#254]: https://github.com/PHPCSStandards/PHPCSExtra/pull/254 - - -## [1.0.4] - 2023-06-18 - -### Changed - -#### Other - -* Composer: The minimum `PHPCSUtils` requirement has been updated to `^1.0.6` (was `^1.0.0`). [#237] -* Various housekeeping. - -### Fixed - -#### Universal - -* `Universal.Constants.LowercaseClassResolutionKeyword`: prevent false positives for function calls to methods called `class`. [#226] - -[#226]: https://github.com/PHPCSStandards/PHPCSExtra/pull/226 -[#237]: https://github.com/PHPCSStandards/PHPCSExtra/pull/237 - - -## [1.0.3] - 2023-03-28 - -### Changed - -#### Universal - -* `Universal.WhiteSpace.DisallowInlineTabs`: significant performance improvement. [#216], [#217] - -#### Other - -* Various housekeeping. - -### Fixed - -#### Modernize - -* `Modernize.FunctionCalls.Dirname`: prevent false positives for attribute classes called `dirname`. [#211], [#213] - -[#211]: https://github.com/PHPCSStandards/PHPCSExtra/pull/211 -[#213]: https://github.com/PHPCSStandards/PHPCSExtra/pull/213 -[#216]: https://github.com/PHPCSStandards/PHPCSExtra/pull/216 -[#217]: https://github.com/PHPCSStandards/PHPCSExtra/pull/217 - - -## [1.0.2] - 2023-01-10 - -### Changed - -#### Universal - -* `Universal.CodeAnalysis.ConstructorDestructorReturn`: the sniff will now respect a potentially set [`php_version` configuration option][php_version-config] and only report on PHP4-style constructors when the `php_version` is below `'80000'`. Thanks [@anomiex] for reporting! [#207], [#208] - -[#207]: https://github.com/PHPCSStandards/PHPCSExtra/issues/207 -[#208]: https://github.com/PHPCSStandards/PHPCSExtra/pull/208 - - -## [1.0.1] - 2023-01-05 - -### Fixed - -#### Universal - -* `Universal.CodeAnalysis.ConstructorDestructorReturn`: fixed false positive for return statements in nested functions/closures declared within constructor/destructor methods. Thanks [@anomiex] for reporting! [#201], [#202] - -[#201]: https://github.com/PHPCSStandards/PHPCSExtra/issues/201 -[#202]: https://github.com/PHPCSStandards/PHPCSExtra/pull/202 - - -## [1.0.0] - 2023-01-04 - -:warning: Important: this package now requires [PHPCSUtils 1.0.0]. Please make sure you use `--with-[all-]dependencies` when running `composer update`. :exclamation: - -For the full list of features, please see the changelogs of the alpha/rc releases: -* [1.0.0-rc1](https://github.com/PHPCSStandards/PHPCSExtra/releases/tag/1.0.0-rc1) -* [1.0.0-alpha3](https://github.com/PHPCSStandards/PHPCSExtra/releases/tag/1.0.0-alpha3) -* [1.0.0-alpha2](https://github.com/PHPCSStandards/PHPCSExtra/releases/tag/1.0.0-alpha2) -* [1.0.0-alpha1](https://github.com/PHPCSStandards/PHPCSExtra/releases/tag/1.0.0-alpha1) - -### Changed - -#### Other - -* Updated various sniffs to take advantage of PHPCSUtils 1.0.0(-rc1). [#193], [#194], [#195] -* Minor documentation improvements. -* Various housekeeping. - -### Fixed - -#### Modernize - -* `Modernize.FunctionCalls.Dirname`: the sniff will now correctly recognize magic constants in a case-insensitive manner. [#187] - -[PHPCSUtils 1.0.0]: https://github.com/PHPCSStandards/PHPCSUtils/releases/tag/1.0.0 - -[#187]: https://github.com/PHPCSStandards/PHPCSExtra/pull/187 -[#193]: https://github.com/PHPCSStandards/PHPCSExtra/pull/193 -[#194]: https://github.com/PHPCSStandards/PHPCSExtra/pull/194 -[#195]: https://github.com/PHPCSStandards/PHPCSExtra/pull/195 - - -## [1.0.0-RC1] - 2022-12-07 - -:warning: Important: this package now requires [PHPCSUtils 1.0.0-alpha4]. Please make sure you use `--with-[all-]dependencies` when running `composer update`. :exclamation: - -### Added - -#### Modernize - -* This is a new standard with one sniff to start with. -* :wrench: :books: New `Modernize.FunctionCalls.Dirname` sniff to detect and auto-fix two typical code modernizations which can be made related to the [`dirname()`][php-manual-dirname] function. [#172] - -#### Universal - -* :wrench: :bar_chart: :books: New `Universal.Classes.DisallowAnonClassParentheses` sniff to disallow the use of parentheses when declaring an anonymous class without passing parameters. [#76], [#162] -* :wrench: :bar_chart: :books: New `Universal.Classes.RequireAnonClassParentheses` sniff to require the use of parentheses when declaring an anonymous class, whether parameters are passed or not. [#76], [#166] -* :wrench: :bar_chart: :books: New `Universal.Classes.DisallowFinalClass` sniff to disallow classes being declared `final`. [#108], [#114], [#148], [#163] -* :wrench: :bar_chart: :books: New `Universal.Classes.RequireFinalClass` sniff to require all non-`abstract` classes to be declared `final`. [#109], [#148], [#164] - Warning: the auto-fixer for this sniff _may_ have unintended side-effects for applications and should be used with care! This is considered a _risky_ fixer. -* :wrench: :bar_chart: :books: New `Universal.Classes.ModifierKeywordOrder` sniff to standardize the modifier keyword order for class declarations. [#142] - The sniff offers an `order` property to specify the preferred order. -* :wrench: :books: New `Universal.CodeAnalysis.ConstructorDestructorReturn` sniff to verify that class constructor/destructor methods 1) do not have a return type declaration and 2) do not return a value. [#137], [#140], [#146] Inspired by [@derickr]. -* :wrench: :books: New `Universal.CodeAnalysis.ForeachUniqueAssignment` sniff to detect `foreach` control structures which use the same variable for both the key as well as the value assignment as this will lead to unexpected - and most likely unintended - behaviour. [#110], [#175] - The fixer will maintain the existing behaviour of the code. Mind: this may not be the _intended_ behaviour. -* :wrench: :books: New `Universal.CodeAnalysis.StaticInFinalClass` sniff to detect using `static` instead of `self` in OO constructs which are `final`. [#116], [#180] - The sniff has modular error codes to allow for making exceptions based on the type of use for `static`. -* :wrench: :bar_chart: :books: New `Universal.Constants.LowercaseClassResolutionKeyword` sniff to enforce that the `class` keyword when used for class name resolution, i.e. `::class`, is in lowercase. [#72] -* :wrench: :bar_chart: :books: New `Universal.Constants.ModifierKeywordOrder` sniff to standardize the modifier keyword order for OO constant declarations. [#143] - The sniff offers an `order` property to specify the preferred order. -* :wrench: :books: New `Universal.ControlStructures.DisallowLonelyIf` sniff to disallow `if` statements as the only statement in an `else` block. [#85], [#168], [#169] - Inspired by the [ESLint "no lonely if"] rule. - Note: This sniff will not fix the indentation of the "inner" code. It is strongly recommended to run this sniff together with the `Generic.WhiteSpace.ScopeIndent` sniff to get the correct indentation. -* :bar_chart: :books: New `Universal.Files.SeparateFunctionsFromOO` sniff to enforce that a file should either declare (global/namespaced) functions or declare OO structures, but not both. [#95], [#170], [#171] - Nested function declarations, i.e. functions declared within a function/method will be disregarded for the purposes of this sniff. - The same goes for anonymous classes, closures and arrow functions. -* :books: New `Universal.NamingConventions.NoReservedKeywordParameterNames` sniff to verify that function parameters do not use reserved keywords as names, as this can quickly become confusing when people use them in function calls using named parameters. [#80], [#81], [#106], [#107], [#173] - The sniff has modular error codes to allow for making exceptions for specific keywords. -* :wrench: :bar_chart: :books: New `Universal.Operators.TypeSeparatorSpacing` sniff to enforce no spaces around union type and intersection type separators. [#117] -* :wrench: :books: New `Universal.PHP.OneStatementInShortEchoTag` sniff to disallow short open echo tags `<?=` containing more than one PHP statement. [#89], [#147], [#165] -* :wrench: :bar_chart: :books: New `Universal.WhiteSpace.AnonClassKeywordSpacing` sniff to standardize the amount of spacing between the `class` keyword and the open parenthesis (if any) for anonymous class declarations. [#120] - The sniff offers a `spacing` property to set the amount of spaces the sniff should check for. -* :wrench: :books: New `Universal.WhiteSpace.PrecisionAlignment` sniff to enforce indentation to always be a multiple of a tabstop, i.e. disallow precision alignment. [#119], [#122], [#123], [#124] - Note: - - This sniff does not concern itself with tabs versus spaces. - It is recommended to use the sniff in combination with the PHPCS native `Generic.WhiteSpace.DisallowTabIndent` or the `Generic.WhiteSpace.DisallowSpaceIndent` sniff. - - When using this sniff with tab-based standards, please ensure that the `tab-width` is set and either don't set the `$indent` property or set it to the tab-width (or a multiple thereof). - - The fixer works based on "best guess" and may not always result in the desired indentation. Combine this sniff with the `Generic.WhiteSpace.ScopeIndent` sniff for more precise indentation fixes. - - The behaviour of the sniff is customizable via the following properties: - + `indent`: the indent used for the codebase. - + `ignoreAlignmentBefore`: allows for providing a list of token names for which (preceding) precision alignment should be ignored. - + `ignoreBlankLines`: whether or not potential trailing whitespace on otherwise blank lines should be examined or ignored. - -### Changed - -#### Universal - -* `Universal.Arrays.DisallowShortArraySyntax`: the sniff will now record metrics about long vs short array usage. [#154] -* `Universal.Arrays.DuplicateArrayKey`: where relevant, the sniff will now make a distinction between keys which will be duplicate in all PHP version and (numeric) keys which will only be a duplicate key in [PHP < 8.0 or PHP >= 8.0][php-rfc-negative_array_index]. [#177], [#178] - If a [`php_version` configuration option][php_version-config] has been passed to PHPCS, it will be respected by the sniff and only report duplicate keys for the configured PHP version. -* `Universal.ControlStructures.DisallowAlternativeSyntax`: the sniff will now also record a metric when single-line (no body) control structures are encountered. [#158] -* `Universal.ControlStructures.DisallowAlternativeSyntax`: the error message thrown by the sniff is now more descriptive. [#159] -* `Universal.ControlStructures.DisallowAlternativeSyntax`: metrics will no longer be recorded for `elseif` and `else` keywords, but only on the `if` keyword as the type of syntax used has to be the same for the whole "chain". [#161] -* `Universal.Lists.DisallowLongListSyntax`: the sniff will no longer record (incomplete) metrics about long vs short list usage. [#155] -* `Universal.Lists.DisallowShortListSyntax`: the sniff will now record (complete) metrics about long vs short list usage. [#155] -* `Universal.OOStructures.AlphabeticExtendsImplements`: documented support for `enum ... implements`. [#150] -* `Universal.UseStatements.DisallowUseClass`: updated error message and metric name to take PHP 8.1 `enum`s into account. [#149] -* `Universal.UseStatements.NoLeadingBackslash`: the sniff will now also flag and auto-fix leading backslashes in group use statements. [#167] - -#### Other - -* Updated the sniffs for compatibility with PHPCSUtils 1.0.0-alpha4. [#134] -* Updated the sniffs to correctly handle PHP 8.0/8.1/8.2 features whenever relevant. -* Readme: Updated installation instructions for compatibility with Composer 2.2+. [#101] -* Composer: The minimum `PHP_CodeSniffer` requirement has been updated to `^3.7.1` (was `^3.3.1`). [#115], [#130] -* Composer: The package will now identify itself as a static analysis tool. Thanks [@GaryJones]! [#126] -* All non-`abstract` classes in this package are now `final`. [#121] -* All XML documentation now has a schema annotation. [#128] -* Various housekeeping. - -### Fixed - -The upgrade to PHPCSUtils 1.0.0-alpha4 took care of a number of bugs, which potentially could have affected sniffs in this package. - -#### NormalizedArrays - -* `NormalizedArrays.Arrays.ArrayBraceSpacing`: the sniff now allows for trailing comments after the array opener in multi-line arrays. [#118] -* `NormalizedArrays.Arrays.ArrayBraceSpacing`: trailing comments at the end of an array, but before the closer, in multi-line arrays will no longer confuse the sniff. [#135] -* `NormalizedArrays.Arrays.CommaAfterLast`: the fixer will now recognize PHP 7.3+ flexible heredoc/nowdocs and in that case, will add the comma on the same line as the heredoc/nowdoc closer. [#144] - -#### Universal - -* `Universal.Arrays.DisallowShortArraySyntax`: nested short arrays in short lists will now be detected and fixed correctly. [#153] -* `Universal.ControlStructures.DisallowAlternativeSyntax`: the sniff will no longer bow out indiscriminately when the `allowWithInlineHTML` property is set to `true`. [#90], [#161] -* `Universal.ControlStructures.DisallowAlternativeSyntax`: when alternative control structure syntax is allowed in combination with inline HTML (`allowWithInlineHTML` property set to `true`), inline HTML in functions declared within the control structure body will no longer be taken into account for determining whether or not the control structure contains inline HTML. [#160] -* `Universal.Lists.DisallowShortListSyntax`: the sniff will work around a tokenizer bug in PHPCS 3.7.1, which previously could lead to false negatives. [#151]. -* `Universal.Lists.DisallowShortListSyntax`: nested short lists in short arrays will now be detected and fixed correctly. [#152] -* `Universal.Operators.DisallowStandalonePostIncrementDecrement`: the sniff will now correctly recognize stand-alone statements which end on a PHP close tag. [#176] - -[#72]: https://github.com/PHPCSStandards/PHPCSExtra/pull/72 -[#76]: https://github.com/PHPCSStandards/PHPCSExtra/pull/76 -[#80]: https://github.com/PHPCSStandards/PHPCSExtra/pull/80 -[#81]: https://github.com/PHPCSStandards/PHPCSExtra/pull/81 -[#85]: https://github.com/PHPCSStandards/PHPCSExtra/pull/85 -[#89]: https://github.com/PHPCSStandards/PHPCSExtra/pull/89 -[#90]: https://github.com/PHPCSStandards/PHPCSExtra/pull/90 -[#95]: https://github.com/PHPCSStandards/PHPCSExtra/pull/95 -[#101]: https://github.com/PHPCSStandards/PHPCSExtra/pull/101 -[#106]: https://github.com/PHPCSStandards/PHPCSExtra/pull/106 -[#107]: https://github.com/PHPCSStandards/PHPCSExtra/pull/107 -[#108]: https://github.com/PHPCSStandards/PHPCSExtra/pull/108 -[#109]: https://github.com/PHPCSStandards/PHPCSExtra/pull/109 -[#110]: https://github.com/PHPCSStandards/PHPCSExtra/pull/110 -[#114]: https://github.com/PHPCSStandards/PHPCSExtra/pull/114 -[#115]: https://github.com/PHPCSStandards/PHPCSExtra/pull/115 -[#116]: https://github.com/PHPCSStandards/PHPCSExtra/pull/116 -[#117]: https://github.com/PHPCSStandards/PHPCSExtra/pull/117 -[#118]: https://github.com/PHPCSStandards/PHPCSExtra/pull/118 -[#119]: https://github.com/PHPCSStandards/PHPCSExtra/pull/119 -[#120]: https://github.com/PHPCSStandards/PHPCSExtra/pull/120 -[#121]: https://github.com/PHPCSStandards/PHPCSExtra/pull/121 -[#122]: https://github.com/PHPCSStandards/PHPCSExtra/pull/122 -[#123]: https://github.com/PHPCSStandards/PHPCSExtra/pull/123 -[#124]: https://github.com/PHPCSStandards/PHPCSExtra/pull/124 -[#126]: https://github.com/PHPCSStandards/PHPCSExtra/pull/126 -[#128]: https://github.com/PHPCSStandards/PHPCSExtra/pull/128 -[#130]: https://github.com/PHPCSStandards/PHPCSExtra/pull/130 -[#134]: https://github.com/PHPCSStandards/PHPCSExtra/pull/134 -[#135]: https://github.com/PHPCSStandards/PHPCSExtra/pull/135 -[#137]: https://github.com/PHPCSStandards/PHPCSExtra/pull/137 -[#140]: https://github.com/PHPCSStandards/PHPCSExtra/pull/140 -[#142]: https://github.com/PHPCSStandards/PHPCSExtra/pull/142 -[#143]: https://github.com/PHPCSStandards/PHPCSExtra/pull/143 -[#144]: https://github.com/PHPCSStandards/PHPCSExtra/pull/144 -[#146]: https://github.com/PHPCSStandards/PHPCSExtra/pull/146 -[#147]: https://github.com/PHPCSStandards/PHPCSExtra/pull/147 -[#148]: https://github.com/PHPCSStandards/PHPCSExtra/pull/148 -[#149]: https://github.com/PHPCSStandards/PHPCSExtra/pull/149 -[#150]: https://github.com/PHPCSStandards/PHPCSExtra/pull/150 -[#151]: https://github.com/PHPCSStandards/PHPCSExtra/pull/151 -[#152]: https://github.com/PHPCSStandards/PHPCSExtra/pull/152 -[#153]: https://github.com/PHPCSStandards/PHPCSExtra/pull/153 -[#154]: https://github.com/PHPCSStandards/PHPCSExtra/pull/154 -[#155]: https://github.com/PHPCSStandards/PHPCSExtra/pull/155 -[#158]: https://github.com/PHPCSStandards/PHPCSExtra/pull/158 -[#159]: https://github.com/PHPCSStandards/PHPCSExtra/pull/159 -[#160]: https://github.com/PHPCSStandards/PHPCSExtra/pull/160 -[#161]: https://github.com/PHPCSStandards/PHPCSExtra/pull/161 -[#162]: https://github.com/PHPCSStandards/PHPCSExtra/pull/162 -[#163]: https://github.com/PHPCSStandards/PHPCSExtra/pull/163 -[#164]: https://github.com/PHPCSStandards/PHPCSExtra/pull/164 -[#165]: https://github.com/PHPCSStandards/PHPCSExtra/pull/165 -[#166]: https://github.com/PHPCSStandards/PHPCSExtra/pull/166 -[#167]: https://github.com/PHPCSStandards/PHPCSExtra/pull/167 -[#168]: https://github.com/PHPCSStandards/PHPCSExtra/pull/168 -[#169]: https://github.com/PHPCSStandards/PHPCSExtra/pull/169 -[#170]: https://github.com/PHPCSStandards/PHPCSExtra/pull/170 -[#171]: https://github.com/PHPCSStandards/PHPCSExtra/pull/171 -[#172]: https://github.com/PHPCSStandards/PHPCSExtra/pull/172 -[#173]: https://github.com/PHPCSStandards/PHPCSExtra/pull/173 -[#175]: https://github.com/PHPCSStandards/PHPCSExtra/pull/175 -[#176]: https://github.com/PHPCSStandards/PHPCSExtra/pull/176 -[#177]: https://github.com/PHPCSStandards/PHPCSExtra/pull/177 -[#178]: https://github.com/PHPCSStandards/PHPCSExtra/pull/178 -[#180]: https://github.com/PHPCSStandards/PHPCSExtra/pull/180 - -[php-manual-dirname]: https://www.php.net/function.dirname -[php-rfc-negative_array_index]: https://wiki.php.net/rfc/negative_array_index -[ESLint "no lonely if"]: https://eslint.org/docs/latest/rules/no-lonely-if -[PHPCSUtils 1.0.0-alpha4]: https://github.com/PHPCSStandards/PHPCSUtils/releases/tag/1.0.0-alpha4 - - -## [1.0.0-alpha3] - 2020-06-29 - -### Added - -#### Universal - -* :wrench: :books: New `Universal.Arrays.DisallowShortArraySyntax` sniff to disallow short array syntax. [#40] - In contrast to the PHPCS native `Generic.Arrays.DisallowShortArraySyntax` sniff, this sniff will ignore short list syntax and not cause parse errors when the fixer is used. -* :wrench: :bar_chart: :books: New `Universal.Constants.UppercaseMagicConstants` sniff to enforce that PHP native magic constants are in uppercase. [#64] -* :bar_chart: :books: New `Universal.Namespaces.DisallowDeclarationWithoutName` sniff to disallow namespace declarations without a namespace name. [#50] -* :bar_chart: :books: New `Universal.Operators.DisallowLogicalAndOr` sniff to enforce the use of the boolean `&&` and `||` operators instead of the logical `and`/`or` operators. [#52] - Note: as the [operator precedence] of the logical operators is significantly lower than the operator precedence of boolean operators, this sniff does not contain an auto-fixer. -* :bar_chart: :books: New `Universal.Operators.DisallowShortTernary` sniff to disallow the use of short ternaries `?:`. [#42] - While short ternaries are useful when used correctly, the principle of them is often misunderstood and they are more often than not used incorrectly, leading to hard to debug issues and/or PHP warnings/notices. -* :wrench: :bar_chart: :books: New `Universal.Operators.DisallowStandalonePostIncrementDecrement` sniff disallow the use of post-in/decrements in stand-alone statements and discourage the use of multiple increment/decrement operators in a stand-alone statement. [#65] -* :wrench: :bar_chart: :books: New `Universal.Operators.StrictComparisons` sniff to enforce the use of strict comparisons. [#48] - Warning: the auto-fixer for this sniff _may_ cause bugs in applications and should be used with care! This is considered a _risky_ fixer. -* :wrench: :bar_chart: :books: New `Universal.OOStructures.AlphabeticExtendsImplements` sniff to verify that the names used in a class "implements" statement or an interface "extends" statement are listed in alphabetic order. [#55] - - This sniff contains a public `orderby` property to determine the sort order to use for the statement. - If all names used are unqualified, the sort order won't make a difference. - However, if one or more of the names are partially or fully qualified, the chosen sort order will determine how the sorting between unqualified, partially and fully qualified names is handled. - The sniff supports two sort order options: - + _'name'_ : sort by the interface name only (default); - + _'full'_ : sort by the full name as used in the statement (without leading backslash). - In both cases, the sorting will be done using natural sort, case-insensitive. - - The sniff has modular error codes to allow for selective inclusion/exclusion: - + `ImplementsWrongOrder` - for "class implements" statements. - + `ImplementsWrongOrderWithComments` - for "class implements" statements interlaced with comments. These will not be auto-fixed. - + `ExtendsWrongOrder` - for "interface extends" statements. - + `ExtendsWrongOrderWithComments` - for "interface extends" statements interlaced with comments. These will not be auto-fixed. - - When fixing, the existing spacing between the names in an `implements`/`extends` statement will not be maintained. - The fixer will separate each name with a comma and one space. - If alternative formatting is desired, a sniff which will check and fix the formatting should be added to the ruleset. -* :wrench: :bar_chart: :books: New `Universal.UseStatements.LowercaseFunctionConst` sniff to enforce that `function` and `const` keywords when used in an import `use` statement are always lowercase. [#58] -* :wrench: :bar_chart: :books: New `Universal.UseStatements.NoLeadingBackslash` sniff to verify that a name being imported in an import `use` statement does not start with a leading backslash. [#46] - Names in import `use` statements should always be fully qualified, so a leading backslash is not needed and it is strongly recommended not to use one. - This sniff handles all types of import use statements supported by PHP, in contrast to other sniffs for the same in, for instance, the PSR12 or the Slevomat standard, which are incomplete. -* :wrench: :books: New `Universal.WhiteSpace.DisallowInlineTabs` sniff to enforce using spaces for mid-line alignment. [#43] - -### Changed - -#### Other - -* The `master` branch has been renamed to `stable`. -* Composer: The version requirements for the [Composer PHPCS plugin] have been widened to allow for version 0.7.0 which supports Composer 2.0.0. [#62] -* Various housekeeping. - -[#40]: https://github.com/PHPCSStandards/PHPCSExtra/pull/40 -[#42]: https://github.com/PHPCSStandards/PHPCSExtra/pull/42 -[#43]: https://github.com/PHPCSStandards/PHPCSExtra/pull/43 -[#46]: https://github.com/PHPCSStandards/PHPCSExtra/pull/46 -[#48]: https://github.com/PHPCSStandards/PHPCSExtra/pull/48 -[#50]: https://github.com/PHPCSStandards/PHPCSExtra/pull/50 -[#52]: https://github.com/PHPCSStandards/PHPCSExtra/pull/52 -[#55]: https://github.com/PHPCSStandards/PHPCSExtra/pull/55 -[#58]: https://github.com/PHPCSStandards/PHPCSExtra/pull/58 -[#62]: https://github.com/PHPCSStandards/PHPCSExtra/pull/62 -[#64]: https://github.com/PHPCSStandards/PHPCSExtra/pull/64 -[#65]: https://github.com/PHPCSStandards/PHPCSExtra/pull/65 - -[operator precedence]: https://www.php.net/language.operators.precedence - - -## [1.0.0-alpha2] - 2020-02-18 - -### Added - -#### Universal - -* :wrench: :bar_chart: :books: New `Universal.ControlStructures.DisallowAlternativeSyntax` sniff to disallow using the alternative syntax for control structures. [#23] - - This sniff contains a `allowWithInlineHTML` property to allow alternative syntax when inline HTML is used within the control structure. In all other cases, the use of the alternative syntax will still be disallowed. - - The sniff has modular error codes to allow for making exceptions based on specific control structures and/or specific control structures in combination with inline HTML. -* :bar_chart: `Universal.UseStatements.DisallowUseClass/Function/Const`: new, additional metrics about the import source will be shown in the `info` report. [#25] - -#### Other - -* Readme: installation instructions and sniff list. [#26] - -### Changed - -#### Universal - -* `Universal.Arrays.DuplicateArrayKey`: wording of the error message. [#18] -* `Universal.UseStatements.DisallowUseClass/Function/Const`: the error codes have been made more modular. [#25] - Each of these sniffs now has four additional error codes: - <ul> - <li><code>FoundSameNamespace</code>, <code>FoundSameNamespaceWithAlias</code> for <code>use</code> statements importing from the same namespace;</li> - <li><code>FoundGlobalNamespace</code>, <code>FoundGlobalNamespaceWithAlias</code> for <code>use</code> statements importing from the global namespace, like import statements for PHP native classes, functions and constants.</li> - </ul> - In all other circumstances, the existing error codes <code>FoundWithAlias</code> and <code>FoundWithoutAlias</code> will continue to be used. - -#### Other - -* Improved formatting of the CLI documentation which can be viewed using `--generator=text`. [#17] -* Various housekeeping. - -### Fixed - -#### Universal - -* `Universal.Arrays.DuplicateArrayKey`: improved handling of parse errors. [#34] -* `Universal.ControlStructures.IfElseDeclaration`: the fixer will now respect tab indentation. [#19] -* `Universal.UseStatements.DisallowUseClass/Function/Const`: the determination of whether a import is aliased in now done in a case-insensitive manner. [#25] -* `Universal.UseStatements.DisallowUseClass/Function/Const`: an import from the global namespace would previously always be seen as non-aliased, even when it was aliased. [#25] -* `Universal.UseStatements.DisallowUseClass/Function/Const`: improved tolerance for `use` import statements with leading backslashes. [#25] - -[#17]: https://github.com/PHPCSStandards/PHPCSExtra/pull/17 -[#18]: https://github.com/PHPCSStandards/PHPCSExtra/pull/18 -[#19]: https://github.com/PHPCSStandards/PHPCSExtra/pull/19 -[#23]: https://github.com/PHPCSStandards/PHPCSExtra/pull/23 -[#25]: https://github.com/PHPCSStandards/PHPCSExtra/pull/25 -[#26]: https://github.com/PHPCSStandards/PHPCSExtra/pull/26 -[#34]: https://github.com/PHPCSStandards/PHPCSExtra/pull/34 - - -## 1.0.0-alpha1 - 2020-01-23 - -Initial alpha release containing: -* A `NormalizedArrays` standard which will contain a full set of sniffs to check the formatting of array declarations. -* A `Universal` standard which will contain a collection of universally applicable sniffs. - DO NOT INCLUDE THIS AS A STANDARD. - `Universal`, like the upstream PHPCS `Generic` standard, contains sniffs which contradict each other. - Include individual sniffs from this standard in a custom project/company ruleset to use them. - -This initial alpha release contains the following sniffs: - -### NormalizedArrays - -* :wrench: :bar_chart: :books: `NormalizedArrays.Arrays.ArrayBraceSpacing`: enforce consistent spacing for the open/close braces of array declarations. - The sniff allows for having different settings for: - - Space between the array keyword and the open parenthesis for long arrays via the `keywordSpacing` property. - Accepted values: (int) number of spaces or `false` to turn this check off. Defaults to `0` spaces. - - Spaces on the inside of the braces for empty arrays via the `spacesWhenEmpty` property. - Accepted values: (string) `newline`, (int) number of spaces or `false` to turn this check off. Defaults to `0` spaces. - - Spaces on the inside of the braces for single-line arrays via the `spacesSingleLine` property; - Accepted values: (int) number of spaces or `false` to turn this check off. Defaults to `0` spaces. - - Spaces on the inside of the braces for multi-line arrays via the `spacesMultiLine` property. - Accepted values: (string) `newline`, (int) number of spaces or `false` to turn this check off. Defaults to `newline`. - Note: if any of the above properties are set to `newline`, it is recommended to also include an array indentation sniff. This sniff will not handle the indentation. -* :wrench: :bar_chart: :books: `NormalizedArrays.Arrays.CommaAfterLast`: enforce/forbid a comma after the last item in an array declaration. - By default, this sniff will: - <ul> - <li>forbid a comma after the last array item for single-line arrays.</li> - <li>enforce a comma after the last array item for multi-line arrays.</li> - </ul> - This can be changed for each type or array individually by setting the <code>singleLine</code> or <code>multiLine</code> properties in a custom ruleset. - The valid values are: <code>enforce</code>, <code>forbid</code> or <code>skip</code> to not check the comma after the last array item for a particular type of array. - -### Universal - -* :books: `Universal.Arrays.DuplicateArrayKey`: detects duplicate array keys in array declarations. -* :books: `Universal.Arrays.MixedArrayKeyTypes`: best practice sniff: don't use a mix of integer and numeric keys for array items. -* :books: `Universal.Arrays.MixedKeyedUnkeyedArray`: best practice sniff: don't use a mix of keyed and unkeyed array items. -* :wrench: :bar_chart: :books: `Universal.ControlStructures.IfElseDeclaration`: verify that else(if) statements with braces are on a new line. -* :wrench: :bar_chart: :books: `Universal.Lists.DisallowLongListSyntax`: disallow the use of long `list`s. -* :wrench: :bar_chart: :books: `Universal.Lists.DisallowShortListSyntax`: disallow the use of short lists. -* :bar_chart: :books: `Universal.Namespaces.DisallowCurlyBraceSyntax`: disallow the use of the alternative namespace declaration syntax using curly braces. -* :bar_chart: :books: `Universal.Namespaces.EnforceCurlyBraceSyntax`: enforce the use of the alternative namespace syntax using curly braces. -* :books: `Universal.Namespaces.OneDeclarationPerFile`: disallow the use of multiple namespaces within a file. -* :bar_chart: :books: `Universal.UseStatements.DisallowUseClass`: forbid using import use statements for classes/traits/interfaces. - Individual sub-types can be allowed by excluding specific error codes. -* :bar_chart: :books: `Universal.UseStatements.DisallowUseConst`: forbid using import use statements for constants. - Individual sub-types can be allowed by excluding specific error codes. -* :bar_chart: :books: `Universal.UseStatements.DisallowUseFunction`: forbid using import use statements for functions. - Individual sub-types can be allowed by excluding specific error codes. - -[Composer PHPCS plugin]: https://github.com/PHPCSStandards/composer-installer -[php_version-config]: https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki/Configuration-Options#setting-the-php-version - -[Unreleased]: https://github.com/PHPCSStandards/PHPCSExtra/compare/stable...HEAD -[1.5.0]: https://github.com/PHPCSStandards/PHPCSExtra/compare/1.4.2...1.5.0 -[1.4.2]: https://github.com/PHPCSStandards/PHPCSExtra/compare/1.4.1...1.4.2 -[1.4.1]: https://github.com/PHPCSStandards/PHPCSExtra/compare/1.4.0...1.4.1 -[1.4.0]: https://github.com/PHPCSStandards/PHPCSExtra/compare/1.3.1...1.4.0 -[1.3.1]: https://github.com/PHPCSStandards/PHPCSExtra/compare/1.3.0...1.3.1 -[1.3.0]: https://github.com/PHPCSStandards/PHPCSExtra/compare/1.2.1...1.3.0 -[1.2.1]: https://github.com/PHPCSStandards/PHPCSExtra/compare/1.2.0...1.2.1 -[1.2.0]: https://github.com/PHPCSStandards/PHPCSExtra/compare/1.1.2...1.2.0 -[1.1.2]: https://github.com/PHPCSStandards/PHPCSExtra/compare/1.1.1...1.1.2 -[1.1.1]: https://github.com/PHPCSStandards/PHPCSExtra/compare/1.1.0...1.1.1 -[1.1.0]: https://github.com/PHPCSStandards/PHPCSExtra/compare/1.0.4...1.1.0 -[1.0.4]: https://github.com/PHPCSStandards/PHPCSExtra/compare/1.0.3...1.0.4 -[1.0.3]: https://github.com/PHPCSStandards/PHPCSExtra/compare/1.0.2...1.0.3 -[1.0.2]: https://github.com/PHPCSStandards/PHPCSExtra/compare/1.0.1...1.0.2 -[1.0.1]: https://github.com/PHPCSStandards/PHPCSExtra/compare/1.0.0...1.0.1 -[1.0.0]: https://github.com/PHPCSStandards/PHPCSExtra/compare/1.0.0-rc1...1.0.0 -[1.0.0-RC1]: https://github.com/PHPCSStandards/PHPCSExtra/compare/1.0.0-alpha3...1.0.0-rc1 -[1.0.0-alpha3]: https://github.com/PHPCSStandards/PHPCSExtra/compare/1.0.0-alpha2...1.0.0-alpha3 -[1.0.0-alpha2]: https://github.com/PHPCSStandards/PHPCSExtra/compare/1.0.0-alpha1...1.0.0-alpha2 - -[@anomiex]: https://github.com/anomiex -[@derickr]: https://github.com/derickr -[@diedexx]: https://github.com/diedexx -[@fredden]: https://github.com/fredden -[@GaryJones]: https://github.com/GaryJones -[@rodrigoprimo]: https://github.com/rodrigoprimo -[@stronk7]: https://github.com/stronk7 -[@szepeviktor]: https://github.com/szepeviktor -[@westonruter]: https://github.com/westonruter diff --git a/vendor/phpcsstandards/phpcsextra/LICENSE b/vendor/phpcsstandards/phpcsextra/LICENSE deleted file mode 100644 index 0a04128..0000000 --- a/vendor/phpcsstandards/phpcsextra/LICENSE +++ /dev/null @@ -1,165 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. diff --git a/vendor/phpcsstandards/phpcsextra/Modernize/Docs/FunctionCalls/DirnameStandard.xml b/vendor/phpcsstandards/phpcsextra/Modernize/Docs/FunctionCalls/DirnameStandard.xml deleted file mode 100644 index a4c65f7..0000000 --- a/vendor/phpcsstandards/phpcsextra/Modernize/Docs/FunctionCalls/DirnameStandard.xml +++ /dev/null @@ -1,40 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Function Calls to Dirname" - > - <standard> - <![CDATA[ - PHP >= 5.3: Usage of dirname(__FILE__) can be replaced with __DIR__. - ]]> - </standard> - <code_comparison> - <code title="Valid: Using __DIR__."> - <![CDATA[ -$path = <em>__DIR__</em>; - ]]> - </code> - <code title="Invalid: Using dirname(__FILE__)."> - <![CDATA[ -$path = <em>dirname(__FILE__)</em>; - ]]> - </code> - </code_comparison> - <standard> - <![CDATA[ - PHP >= 7.0: Nested calls to dirname() can be replaced by using dirname() with the $levels parameter. - ]]> - </standard> - <code_comparison> - <code title="Valid: Using dirname() with the $levels parameter."> - <![CDATA[ -$path = <em>dirname($file, 3)</em>; - ]]> - </code> - <code title="Invalid: Nested function calls to dirname()."> - <![CDATA[ -$path = <em>dirname(dirname(dirname($file)))</em>; - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Modernize/Sniffs/FunctionCalls/DirnameSniff.php b/vendor/phpcsstandards/phpcsextra/Modernize/Sniffs/FunctionCalls/DirnameSniff.php deleted file mode 100644 index d9da320..0000000 --- a/vendor/phpcsstandards/phpcsextra/Modernize/Sniffs/FunctionCalls/DirnameSniff.php +++ /dev/null @@ -1,389 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Modernize\Sniffs\FunctionCalls; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\BackCompat\Helper; -use PHPCSUtils\Tokens\Collections; -use PHPCSUtils\Utils\Context; -use PHPCSUtils\Utils\PassedParameters; - -/** - * Detect `dirname(__FILE__)` and nested uses of `dirname()`. - * - * @since 1.0.0 - */ -final class DirnameSniff implements Sniff -{ - - /** - * PHP version as configured or 0 if unknown. - * - * @since 1.1.1 - * - * @var int - */ - private $phpVersion; - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - return [ - \T_STRING, - \T_NAME_FULLY_QUALIFIED, - ]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if (isset($this->phpVersion) === false || \defined('PHP_CODESNIFFER_IN_TESTS')) { - // Set default value to prevent this code from running every time the sniff is triggered. - $this->phpVersion = 0; - - $phpVersion = Helper::getConfigData('php_version'); - if ($phpVersion !== null) { - $this->phpVersion = (int) $phpVersion; - } - } - - if ($this->phpVersion !== 0 && $this->phpVersion < 50300) { - // PHP version too low, nothing to do. - return; - } - - $tokens = $phpcsFile->getTokens(); - $contents = $tokens[$stackPtr]['content']; - if ($tokens[$stackPtr]['code'] === \T_NAME_FULLY_QUALIFIED) { - $contents = \ltrim($contents, '\\'); - } - - if (\strtolower($contents) !== 'dirname') { - // Not our target. - return; - } - - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($nextNonEmpty === false - || $tokens[$nextNonEmpty]['code'] !== \T_OPEN_PARENTHESIS - || isset($tokens[$nextNonEmpty]['parenthesis_owner']) === true - ) { - // Not our target. - return; - } - - if (isset($tokens[$nextNonEmpty]['parenthesis_closer']) === false) { - // Live coding or parse error, ignore. - return; - } - - if (Context::inAttribute($phpcsFile, $stackPtr) === true) { - // Class instantiation in attribute, not function call. - return; - } - - // Check if it is really a function call to the global function. - $prevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - - if (isset(Collections::objectOperators()[$tokens[$prevNonEmpty]['code']]) === true - || $tokens[$prevNonEmpty]['code'] === \T_NEW - ) { - // Method call, class instantiation or other "not our target". - return; - } - - if ($tokens[$prevNonEmpty]['code'] === \T_NS_SEPARATOR) { - $prevPrevToken = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($prevNonEmpty - 1), null, true); - if ($tokens[$prevPrevToken]['code'] === \T_STRING - || $tokens[$prevPrevToken]['code'] === \T_NAMESPACE - ) { - // Namespaced function. - return; - } - } - - /* - * As of here, we can be pretty sure this is a function call to the global function. - */ - $opener = $nextNonEmpty; - $closer = $tokens[$nextNonEmpty]['parenthesis_closer']; - - $parameters = PassedParameters::getParameters($phpcsFile, $stackPtr); - $paramCount = \count($parameters); - if (empty($parameters) || $paramCount > 2) { - // No parameters or too many parameter. - return; - } - - $pathParam = PassedParameters::getParameterFromStack($parameters, 1, 'path'); - if ($pathParam === false) { - // If the path parameter doesn't exist, there's nothing to do. - return; - } - - $levelsParam = PassedParameters::getParameterFromStack($parameters, 2, 'levels'); - if ($levelsParam === false && $paramCount === 2) { - // There must be a typo in the param name or an otherwise stray parameter. Ignore. - return; - } - - /* - * PHP 5.3+: Detect use of dirname(__FILE__). - */ - if (\strtoupper($pathParam['clean']) === '__FILE__') { - $levelsValue = false; - - // Determine if the issue is auto-fixable. - $hasComment = $phpcsFile->findNext(Tokens::$commentTokens, ($opener + 1), $closer); - $fixable = ($hasComment === false); - - if ($fixable === true) { - $levelsValue = $this->getLevelsValue($phpcsFile, $levelsParam); - if ($levelsParam !== false && $levelsValue === false) { - // Can't autofix if we don't know the value of the $levels parameter. - $fixable = false; - } - } - - $error = 'Use the __DIR__ constant instead of calling dirname(__FILE__) (PHP >= 5.3)'; - $code = 'FileConstant'; - - // Throw the error. - if ($fixable === false) { - $phpcsFile->addError($error, $stackPtr, $code); - return; - } - - $fix = $phpcsFile->addFixableError($error, $stackPtr, $code); - if ($fix === true) { - if ($levelsParam === false || $levelsValue === 1) { - // No $levels or $levels set to 1: we can replace the complete function call. - $phpcsFile->fixer->beginChangeset(); - - $phpcsFile->fixer->replaceToken($stackPtr, '__DIR__'); - - for ($i = ($stackPtr + 1); $i <= $closer; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - // Remove potential leading \. - if ($tokens[$prevNonEmpty]['code'] === \T_NS_SEPARATOR) { - $phpcsFile->fixer->replaceToken($prevNonEmpty, ''); - } - - $phpcsFile->fixer->endChangeset(); - } else { - // We can replace the $path parameter and will need to adjust the $levels parameter. - $filePtr = $phpcsFile->findNext(\T_FILE, $pathParam['start'], ($pathParam['end'] + 1)); - $levelsPtr = $phpcsFile->findNext(\T_LNUMBER, $levelsParam['start'], ($levelsParam['end'] + 1)); - - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($filePtr, '__DIR__'); - $phpcsFile->fixer->replaceToken($levelsPtr, ($levelsValue - 1)); - $phpcsFile->fixer->endChangeset(); - } - } - - return; - } - - /* - * PHP 7.0+: Detect use of nested calls to dirname(). - */ - if ($this->phpVersion !== 0 && $this->phpVersion < 70000) { - // No need to check for this issue if the PHP version would not allow for it anyway. - return; - } - - if (\preg_match('`^\s*\\\\?dirname\s*\(`i', $pathParam['clean']) !== 1) { - return; - } - - /* - * Check if there is something _behind_ the nested dirname() call within the same parameter. - * - * Note: the findNext() calls are safe and will always match the dirname() function call - * as otherwise the above regex wouldn't have matched. - */ - $innerDirnamePtr = $phpcsFile->findNext($this->register(), $pathParam['start'], ($pathParam['end'] + 1)); - $innerOpener = $phpcsFile->findNext(\T_OPEN_PARENTHESIS, ($innerDirnamePtr + 1), ($pathParam['end'] + 1)); - if (isset($tokens[$innerOpener]['parenthesis_closer']) === false) { - // Shouldn't be possible. - return; // @codeCoverageIgnore - } - - $innerCloser = $tokens[$innerOpener]['parenthesis_closer']; - if ($innerCloser !== $pathParam['end']) { - $hasContentAfter = $phpcsFile->findNext( - Tokens::$emptyTokens, - ($innerCloser + 1), - ($pathParam['end'] + 1), - true - ); - if ($hasContentAfter !== false) { - // Matched code like: `dirname(dirname($file) . 'something')`. Ignore. - return; - } - } - - /* - * Determine if this is an auto-fixable error. - */ - - // Step 1: Are there comments ? If so, not auto-fixable as we don't want to remove comments. - $fixable = true; - $outerLevelsValue = false; - $innerParameters = []; - $innerLevelsParam = false; - $innerLevelsValue = false; - - for ($i = ($opener + 1); $i < $closer; $i++) { - if (isset(Tokens::$commentTokens[$tokens[$i]['code']])) { - $fixable = false; - break; - } - - if ($tokens[$i]['code'] === \T_OPEN_PARENTHESIS - && isset($tokens[$i]['parenthesis_closer']) - ) { - // Skip over everything within the nested dirname() function call. - $i = $tokens[$i]['parenthesis_closer']; - } - } - - // Step 2: Does the `$levels` parameter exist for the outer dirname() call and if so, is it usable ? - if ($fixable === true) { - $outerLevelsValue = $this->getLevelsValue($phpcsFile, $levelsParam); - if ($levelsParam !== false && $outerLevelsValue === false) { - // Can't autofix if we don't know the value of the $levels parameter. - $fixable = false; - } - } - - // Step 3: Does the `$levels` parameter exist for the inner dirname() call and if so, is it usable ? - if ($fixable === true) { - $innerParameters = PassedParameters::getParameters($phpcsFile, $innerDirnamePtr); - $innerLevelsParam = PassedParameters::getParameterFromStack($innerParameters, 2, 'levels'); - $innerLevelsValue = $this->getLevelsValue($phpcsFile, $innerLevelsParam); - if ($innerLevelsParam !== false && $innerLevelsValue === false) { - // Can't autofix if we don't know the value of the $levels parameter. - $fixable = false; - } - } - - /* - * Throw the error. - */ - $error = 'Pass the $levels parameter to the dirname() call instead of using nested dirname() calls'; - $error .= ' (PHP >= 7.0)'; - $code = 'Nested'; - - if ($fixable === false) { - $phpcsFile->addError($error, $stackPtr, $code); - return; - } - - $fix = $phpcsFile->addFixableError($error, $stackPtr, $code); - if ($fix === false) { - return; - } - - /* - * Fix the error. - */ - $phpcsFile->fixer->beginChangeset(); - - // Remove the info in the _outer_ param call. - for ($i = $opener; $i < $innerOpener; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - for ($i = ($innerCloser + 1); $i <= $closer; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - if ($innerLevelsParam !== false) { - // Inner $levels parameter already exists, just adjust the value. - $innerLevelsPtr = $phpcsFile->findNext( - \T_LNUMBER, - $innerLevelsParam['start'], - ($innerLevelsParam['end'] + 1) - ); - $phpcsFile->fixer->replaceToken($innerLevelsPtr, ($innerLevelsValue + $outerLevelsValue)); - } else { - // Inner $levels parameter does not exist yet. We need to add it. - $content = ', '; - - $prevBeforeCloser = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($innerCloser - 1), null, true); - if ($tokens[$prevBeforeCloser]['code'] === \T_COMMA) { - // Trailing comma found, no need to add the comma. - $content = ' '; - } - - $innerPathParam = PassedParameters::getParameterFromStack($innerParameters, 1, 'path'); - if (isset($innerPathParam['name_token']) === true) { - // Non-named param cannot follow named param, so add param name. - $content .= 'levels: '; - } - - $content .= ($innerLevelsValue + $outerLevelsValue); - $phpcsFile->fixer->addContentBefore($innerCloser, $content); - } - - $phpcsFile->fixer->endChangeset(); - } - - /** - * Determine the value of the $levels parameter passed to dirname(). - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param array<string, int|string>|false $levelsParam The information about the parameter as retrieved - * via PassedParameters::getParameterFromStack(). - * - * @return int|false Integer levels value or FALSE if the levels value couldn't be determined. - */ - private function getLevelsValue($phpcsFile, $levelsParam) - { - if ($levelsParam === false) { - return 1; - } - - $ignore = Tokens::$emptyTokens; - $ignore[] = \T_LNUMBER; - - $hasNonNumber = $phpcsFile->findNext($ignore, $levelsParam['start'], ($levelsParam['end'] + 1), true); - if ($hasNonNumber !== false) { - return false; - } - - return (int) $levelsParam['clean']; - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Modernize/ruleset.xml b/vendor/phpcsstandards/phpcsextra/Modernize/ruleset.xml deleted file mode 100644 index 27a9d54..0000000 --- a/vendor/phpcsstandards/phpcsextra/Modernize/ruleset.xml +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0"?> -<ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="Modernize" namespace="PHPCSExtra\Modernize" xsi:noNamespaceSchemaLocation="https://schema.phpcodesniffer.com/phpcs.xsd"> - - <description>A collection of sniffs to detect code modernization opportunities.</description> -</ruleset> diff --git a/vendor/phpcsstandards/phpcsextra/NormalizedArrays/Docs/Arrays/ArrayBraceSpacingStandard.xml b/vendor/phpcsstandards/phpcsextra/NormalizedArrays/Docs/Arrays/ArrayBraceSpacingStandard.xml deleted file mode 100644 index 3c65548..0000000 --- a/vendor/phpcsstandards/phpcsextra/NormalizedArrays/Docs/Arrays/ArrayBraceSpacingStandard.xml +++ /dev/null @@ -1,94 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Array Brace Spacing" - > - <standard> - <![CDATA[ - There should be no space between the "array" keyword and the array open brace. - ]]> - </standard> - <code_comparison> - <code title="Valid: No space between the keyword and the open brace."> - <![CDATA[ -$args = array(1, 2); - ]]> - </code> - <code title="Invalid: Space between the keyword and the open brace."> - <![CDATA[ -$args = array<em> </em>(1, 2); - ]]> - </code> - </code_comparison> - <standard> - <![CDATA[ - There should be no space between the array open brace and the array close brace for an empty array. - ]]> - </standard> - <code_comparison> - <code title="Valid: No space between the braces."> - <![CDATA[ -$args = array(); - -$args = []; - ]]> - </code> - <code title="Invalid: Space between the braces."> - <![CDATA[ -$args = array(<em> </em>); - -$args = [<em> </em>]; - ]]> - </code> - </code_comparison> - <standard> - <![CDATA[ - There should be no space after the array open brace and before the array close brace in a single-line array. - ]]> - </standard> - <code_comparison> - <code title="Valid: No space on the inside of the braces."> - <![CDATA[ -$args = array(1, 2); - -$args = [1, 2]; - ]]> - </code> - <code title="Invalid: Space on the inside of the braces."> - <![CDATA[ -$args = array(<em> </em>1, 2<em> </em>); - -$args = [<em> </em>1, 2<em> </em>]; - ]]> - </code> - </code_comparison> - <standard> - <![CDATA[ - There should be a new line after the array open brace and before the array close brace in a multi-line array. - ]]> - </standard> - <code_comparison> - <code title="Valid: One new line after the open brace and before the close brace."> - <![CDATA[ -$args = array(<em> -</em> 1, - 2<em> -</em>); - -$args = [<em> -</em> 1, - 2<em> -</em>]; - ]]> - </code> - <code title="Invalid: No new lines after the open brace and/or before the close brace."> - <![CDATA[ -$args = array(1, - 2); - -$args = [1, - 2]; - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/NormalizedArrays/Docs/Arrays/CommaAfterLastStandard.xml b/vendor/phpcsstandards/phpcsextra/NormalizedArrays/Docs/Arrays/CommaAfterLastStandard.xml deleted file mode 100644 index 9afebbd..0000000 --- a/vendor/phpcsstandards/phpcsextra/NormalizedArrays/Docs/Arrays/CommaAfterLastStandard.xml +++ /dev/null @@ -1,43 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Comma After Last Array Item" - > - <standard> - <![CDATA[ - For single-line arrays, there should be <em>no</em> comma after the last array item. - - However, for multi-line arrays, there <em>should</em> be a comma after the last array item. - ]]> - </standard> - <code_comparison> - <code title="Valid: Single-line array without a comma after the last item."> - <![CDATA[ -$args = array(1, 2, 3); - ]]> - </code> - <code title="Invalid: Single-line array with a comma after the last item."> - <![CDATA[ -$args = array(1, 2, 3<em>,</em> ); - ]]> - </code> - </code_comparison> - <code_comparison> - <code title="Valid: Multi-line array with a comma after the last item."> - <![CDATA[ -$args = [ - 1 => 'foo', - 2 => 'bar'<em>,</em> -]; - ]]> - </code> - <code title="Invalid: Multi-line array without a comma after the last item."> - <![CDATA[ -$args = [ - 1 => 'foo', - 2 => 'bar' -]; - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/NormalizedArrays/Sniffs/Arrays/ArrayBraceSpacingSniff.php b/vendor/phpcsstandards/phpcsextra/NormalizedArrays/Sniffs/Arrays/ArrayBraceSpacingSniff.php deleted file mode 100644 index c20ae13..0000000 --- a/vendor/phpcsstandards/phpcsextra/NormalizedArrays/Sniffs/Arrays/ArrayBraceSpacingSniff.php +++ /dev/null @@ -1,305 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\NormalizedArrays\Sniffs\Arrays; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Fixers\SpacesFixer; -use PHPCSUtils\Tokens\Collections; -use PHPCSUtils\Utils\Arrays; - -/** - * Enforce consistent spacing for the open/close braces of arrays. - * - * The sniff allows for having different settings for: - * - space between the `array` keyword and the open parenthesis for long arrays; - * - spaces on the inside of the braces for single-line arrays; - * - spaces on the inside of the braces for multi-line arrays; - * - spaces on the inside of the braces for empty arrays. - * - * Note: If 'newline' is expected and _no_ new line is encountered, a new line will be - * added, but no assumptions will be made about the intended indentation of the code. - * This should be handled by a (separate) indentation sniff. - * - * @since 1.0.0 - */ -final class ArrayBraceSpacingSniff implements Sniff -{ - - /** - * Number of spaces which should be between the `array` keyword and the open parenthesis for long arrays. - * - * Accepted values: - * - (int) number of spaces. - * - or `false` to turn this check off. - * - * Defaults to 0 spaces. - * - * @since 1.0.0 - * - * @var int|false - */ - public $keywordSpacing = 0; - - /** - * Number of spaces to enforce between the braces for an empty array. - * - * Accepted values: - * - (string) 'newline' - * - (int) number of spaces. - * - or `false` to turn this check off. - * - * Defaults to 0 spaces. - * - * @since 1.0.0 - * - * @var string|int|false - */ - public $spacesWhenEmpty = 0; - - /** - * Number of spaces which should be on the inside of array braces for a single-line array. - * - * Accepted values: - * - (int) number of spaces. - * - or `false` to turn this check off. - * - * Defaults to 0 spaces. - * - * @since 1.0.0 - * - * @var int|false - */ - public $spacesSingleLine = 0; - - /** - * Number of spaces which should be on the inside of array braces for a multi-line array. - * - * Accepted values: - * - (string) 'newline' - * - (int) number of spaces. - * - or `false` to turn this check off. - * - * Defaults to 'newline'. - * - * @since 1.0.0 - * - * @var string|int|false - */ - public $spacesMultiLine = 'newline'; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - return Collections::arrayOpenTokensBC(); - } - - /** - * Processes this test when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where the - * token was found. - * @param int $stackPtr The position in the PHP_CodeSniffer - * file's token stack where the token - * was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - /* - * Normalize the public settings. - */ - if ($this->keywordSpacing !== false) { - $this->keywordSpacing = \max((int) $this->keywordSpacing, 0); - } - - if ($this->spacesSingleLine !== false) { - $this->spacesSingleLine = \max((int) $this->spacesSingleLine, 0); - } - - if ($this->spacesMultiLine !== false && $this->spacesMultiLine !== 'newline') { - $this->spacesMultiLine = \max((int) $this->spacesMultiLine, 0); - } - - if ($this->spacesWhenEmpty !== false && $this->spacesWhenEmpty !== 'newline') { - $this->spacesWhenEmpty = \max((int) $this->spacesWhenEmpty, 0); - } - - if ($this->keywordSpacing === false - && $this->spacesSingleLine === false - && $this->spacesMultiLine === false - && $this->spacesWhenEmpty === false - ) { - // Nothing to do. Why was the sniff turned on at all ? - return; - } - - $openClose = Arrays::getOpenClose($phpcsFile, $stackPtr); - if ($openClose === false) { - // Live coding, short list or real square brackets. - return; - } - - $tokens = $phpcsFile->getTokens(); - $opener = $openClose['opener']; - $closer = $openClose['closer']; - - /* - * Check the spacing between the array keyword and the open parenthesis for long arrays. - */ - if ($tokens[$stackPtr]['code'] === \T_ARRAY && $this->keywordSpacing !== false) { - $error = 'There should be %s between the "array" keyword and the open parenthesis. Found: %s'; - $code = 'SpaceAfterKeyword'; - - SpacesFixer::checkAndFix( - $phpcsFile, - $stackPtr, - $opener, - $this->keywordSpacing, - $error, - $code, - 'error', - 0, - 'Space between array keyword and open brace' - ); - } - - /* - * Check for empty arrays. - */ - $nextNonWhiteSpace = $phpcsFile->findNext(\T_WHITESPACE, ($opener + 1), null, true); - if ($nextNonWhiteSpace === $closer) { - if ($this->spacesWhenEmpty === false) { - // Check was turned off. - return; - } - - $error = 'There should be %s between the array opener and closer for an empty array. Found: %s'; - $code = 'EmptyArraySpacing'; - - SpacesFixer::checkAndFix( - $phpcsFile, - $opener, - $closer, - $this->spacesWhenEmpty, - $error, - $code, - 'error', - 0, - 'Space between open and close brace for an empty array' - ); - - return; - } - - /* - * Check non-empty arrays. - */ - if ($tokens[$opener]['line'] === $tokens[$closer]['line']) { - // Single line array. - if ($this->spacesSingleLine === false) { - // Check was turned off. - return; - } - - $error = 'Expected %s after the array opener in a single line array. Found: %s'; - $code = 'SpaceAfterArrayOpenerSingleLine'; - - SpacesFixer::checkAndFix( - $phpcsFile, - $opener, - $phpcsFile->findNext(\T_WHITESPACE, ($opener + 1), null, true), - $this->spacesSingleLine, - $error, - $code, - 'error', - 0, - 'Space after array opener, single line array' - ); - - $error = 'Expected %s before the array closer in a single line array. Found: %s'; - $code = 'SpaceBeforeArrayCloserSingleLine'; - - SpacesFixer::checkAndFix( - $phpcsFile, - $closer, - $phpcsFile->findPrevious(\T_WHITESPACE, ($closer - 1), null, true), - $this->spacesSingleLine, - $error, - $code, - 'error', - 0, - 'Space before array closer, single line array' - ); - - return; - } - - // Multi-line array. - if ($this->spacesMultiLine === false) { - // Check was turned off. - return; - } - - $error = 'Expected %s after the array opener in a multi line array. Found: %s'; - $code = 'SpaceAfterArrayOpenerMultiLine'; - - $nextNonWhitespace = $phpcsFile->findNext(\T_WHITESPACE, ($opener + 1), null, true); - if ($this->spacesMultiLine === 'newline') { - // Check for a trailing comment after the array opener and allow for it. - if (($tokens[$nextNonWhitespace]['code'] === \T_COMMENT - || isset(Tokens::$phpcsCommentTokens[$tokens[$nextNonWhitespace]['code']]) === true) - && $tokens[$nextNonWhitespace]['line'] === $tokens[$opener]['line'] - ) { - // We found a trailing comment after array opener. Treat that as the opener instead. - $opener = $nextNonWhitespace; - $nextNonWhitespace = $phpcsFile->findNext(\T_WHITESPACE, ($opener + 1), null, true); - } - } - - SpacesFixer::checkAndFix( - $phpcsFile, - $opener, - $nextNonWhitespace, - $this->spacesMultiLine, - $error, - $code, - 'error', - 0, - 'Space after array opener, multi-line array' - ); - - $error = 'Expected %s before the array closer in a multi line array. Found: %s'; - $code = 'SpaceBeforeArrayCloserMultiLine'; - - SpacesFixer::checkAndFix( - $phpcsFile, - $closer, - $phpcsFile->findPrevious(\T_WHITESPACE, ($closer - 1), null, true), - $this->spacesMultiLine, - $error, - $code, - 'error', - 0, - 'Space before array closer, multi-line array' - ); - } -} diff --git a/vendor/phpcsstandards/phpcsextra/NormalizedArrays/Sniffs/Arrays/CommaAfterLastSniff.php b/vendor/phpcsstandards/phpcsextra/NormalizedArrays/Sniffs/Arrays/CommaAfterLastSniff.php deleted file mode 100644 index 7384421..0000000 --- a/vendor/phpcsstandards/phpcsextra/NormalizedArrays/Sniffs/Arrays/CommaAfterLastSniff.php +++ /dev/null @@ -1,226 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\NormalizedArrays\Sniffs\Arrays; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Tokens\Collections; -use PHPCSUtils\Utils\Arrays; - -/** - * Enforce/forbid a comma after the last item in an array declaration. - * - * Allows for different settings for single-line and multi-line arrays. - * - * @since 1.0.0 - */ -final class CommaAfterLastSniff implements Sniff -{ - - /** - * Name of the metric. - * - * @since 1.0.0 - * - * @var string - */ - const METRIC_NAME = '%s array - comma after last item'; - - /** - * Whether or not to enforce a comma after the last array item in a single-line array. - * - * Valid values: - * - 'enforce' to always demand a comma after the last item in single-line arrays; - * - 'forbid' to disallow a comma after the last item in single-line arrays; - * - 'skip' to ignore single-line arrays. - * - * Defaults to: 'forbid'. - * - * @since 1.0.0 - * - * @var string - */ - public $singleLine = 'forbid'; - - /** - * Whether or not to enforce a comma after the last array item in a multi-line array. - * - * Valid values: - * - 'enforce' to always demand a comma after the last item in single-line arrays; - * - 'forbid' to disallow a comma after the last item in single-line arrays; - * - 'skip' to ignore multi-line arrays. - * - * Defaults to: 'enforce'. - * - * @since 1.0.0 - * - * @var string - */ - public $multiLine = 'enforce'; - - /** - * The input values to consider as valid for the public properties. - * - * Used for input validation. - * - * @since 1.0.0 - * - * @var array<string, true> - */ - private $validValues = [ - 'enforce' => true, - 'forbid' => true, - 'skip' => true, - ]; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - return Collections::arrayOpenTokensBC(); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - // Validate the property input. Invalid values will result in the check being skipped. - if (isset($this->validValues[$this->singleLine]) === false) { - $this->singleLine = 'skip'; - } - if (isset($this->validValues[$this->multiLine]) === false) { - $this->multiLine = 'skip'; - } - - $openClose = Arrays::getOpenClose($phpcsFile, $stackPtr); - if ($openClose === false) { - // Short list, real square bracket, live coding or parse error. - return; - } - - $tokens = $phpcsFile->getTokens(); - $opener = $openClose['opener']; - $closer = $openClose['closer']; - - $action = $this->singleLine; - $phrase = 'single-line'; - $errorCode = 'SingleLine'; - if ($tokens[$opener]['line'] !== $tokens[$closer]['line']) { - $action = $this->multiLine; - $phrase = 'multi-line'; - $errorCode = 'MultiLine'; - } - - if ($action === 'skip') { - // Nothing to do. - return; - } - - $lastNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($closer - 1), $opener, true); - if ($lastNonEmpty === false || $lastNonEmpty === $opener) { - // Bow out: empty array. - return; - } - - // If the closer is on the same line as the last element, change the error code for multi-line arrays. - if ($errorCode === 'MultiLine' - && $tokens[$lastNonEmpty]['line'] === $tokens[$closer]['line'] - ) { - $errorCode .= 'CloserSameLine'; - } - - $isComma = ($tokens[$lastNonEmpty]['code'] === \T_COMMA); - - $phpcsFile->recordMetric( - $stackPtr, - \sprintf(self::METRIC_NAME, \ucfirst($phrase)), - ($isComma === true ? 'yes' : 'no') - ); - - switch ($action) { - case 'enforce': - if ($isComma === true) { - return; - } - - $error = 'There should be a comma after the last array item in a %s array.'; - $errorCode = 'Missing' . $errorCode; - $data = [$phrase]; - $fix = $phpcsFile->addFixableError($error, $lastNonEmpty, $errorCode, $data); - if ($fix === true) { - $extraContent = ','; - - if (($tokens[$lastNonEmpty]['code'] === \T_END_HEREDOC - || $tokens[$lastNonEmpty]['code'] === \T_END_NOWDOC) - // Check for indentation, if indented, it's a PHP 7.3+ heredoc/nowdoc. - && $tokens[$lastNonEmpty]['content'] === \ltrim($tokens[$lastNonEmpty]['content']) - ) { - // Prevent parse errors in PHP < 7.3 which doesn't support flexible heredoc/nowdoc. - $extraContent = $phpcsFile->eolChar . $extraContent; - } - - $phpcsFile->fixer->addContent($lastNonEmpty, $extraContent); - } - - return; - - case 'forbid': - if ($isComma === false) { - return; - } - - $error = 'A comma after the last array item in a %s array is not allowed.'; - $errorCode = 'Found' . $errorCode; - $data = [$phrase]; - $fix = $phpcsFile->addFixableError($error, $lastNonEmpty, $errorCode, $data); - if ($fix === true) { - $start = $lastNonEmpty; - $end = $lastNonEmpty; - - // Make sure we're not leaving a superfluous blank line behind. - $prevNonWhitespace = $phpcsFile->findPrevious(\T_WHITESPACE, ($lastNonEmpty - 1), $opener, true); - $nextNonWhitespace = $phpcsFile->findNext(\T_WHITESPACE, ($lastNonEmpty + 1), ($closer + 1), true); - if ($prevNonWhitespace !== false - && $tokens[$prevNonWhitespace]['line'] < $tokens[$lastNonEmpty]['line'] - && $nextNonWhitespace !== false - && $tokens[$nextNonWhitespace]['line'] > $tokens[$lastNonEmpty]['line'] - ) { - $start = ($prevNonWhitespace + 1); - } - - $phpcsFile->fixer->beginChangeset(); - - for ($i = $start; $i <= $end; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - - return; - } - } -} diff --git a/vendor/phpcsstandards/phpcsextra/NormalizedArrays/ruleset.xml b/vendor/phpcsstandards/phpcsextra/NormalizedArrays/ruleset.xml deleted file mode 100644 index 092df23..0000000 --- a/vendor/phpcsstandards/phpcsextra/NormalizedArrays/ruleset.xml +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0"?> -<ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="NormalizedArrays" namespace="PHPCSExtra\NormalizedArrays" xsi:noNamespaceSchemaLocation="https://schema.phpcodesniffer.com/phpcs.xsd"> - - <description>A ruleset for PHP_CodeSniffer to check arrays for normalized format.</description> -</ruleset> diff --git a/vendor/phpcsstandards/phpcsextra/README.md b/vendor/phpcsstandards/phpcsextra/README.md deleted file mode 100644 index 7262233..0000000 --- a/vendor/phpcsstandards/phpcsextra/README.md +++ /dev/null @@ -1,614 +0,0 @@ -# PHPCSExtra - -<div aria-hidden="true"> - -[![Latest Stable Version](https://img.shields.io/packagist/v/phpcsstandards/phpcsextra?label=stable)][phpcsextra-packagist] -[![Release Date of the Latest Version](https://img.shields.io/github/release-date/PHPCSStandards/PHPCSExtra.svg?maxAge=1800)](https://github.com/PHPCSStandards/PHPCSExtra/releases) -:construction: -[![Latest Unstable Version](https://img.shields.io/badge/unstable-dev--develop-e68718.svg?maxAge=2419200)](https://packagist.org/packages/phpcsstandards/phpcsextra#dev-develop) -[![Last Commit to Unstable](https://img.shields.io/github/last-commit/PHPCSStandards/PHPCSExtra/develop.svg)](https://github.com/PHPCSStandards/PHPCSExtra/commits/develop) - -[![CS Build Status](https://github.com/PHPCSStandards/PHPCSExtra/actions/workflows/basics.yml/badge.svg?branch=develop)][gha-qa-results] -[![Test Build Status](https://github.com/PHPCSStandards/PHPCSExtra/actions/workflows/test.yml/badge.svg?branch=develop)][gha-test-results] -[![Coverage Status](https://coveralls.io/repos/github/PHPCSStandards/PHPCSExtra/badge.svg)](https://coveralls.io/github/PHPCSStandards/PHPCSExtra) - -[![Minimum PHP Version](https://img.shields.io/packagist/dependency-v/phpcsstandards/phpcsextra/php.svg)][phpcsextra-packagist] -[![Tested on PHP 5.4 to 8.4](https://img.shields.io/badge/tested%20on-PHP%205.4%20|%205.5%20|%205.6%20|%207.0%20|%207.1%20|%207.2%20|%207.3%20|%207.4%20|%208.0%20|%208.1%20|%208.2%20|%208.3%20|%208.4-brightgreen.svg?maxAge=2419200)][gha-test-results] - -[![License: LGPLv3](https://img.shields.io/github/license/PHPCSStandards/PHPCSExtra)](https://github.com/PHPCSStandards/PHPCSExtra/blob/stable/LICENSE) -![Awesome](https://img.shields.io/badge/awesome%3F-yes!-brightgreen.svg) - -</div> - -* [Introduction](#introduction) -* [Minimum Requirements](#minimum-requirements) -* [Installation](#installation) - - [Composer Project-based Installation](#composer-project-based-installation) - - [Composer Global Installation](#composer-global-installation) - - [Updating to a newer version](#updating-to-a-newer-version) -* [Features](#features) -* [Sniffs](#sniffs) - - [Modernize](#modernize) - - [NormalizedArrays](#normalizedarrays) - - [Universal](#universal) -* [Contributing](#contributing) -* [License](#license) - - -## Introduction - -PHPCSExtra is a collection of sniffs and standards for use with [PHP_CodeSniffer][phpcs-gh]. - - -## Minimum Requirements - -* PHP 5.4 or higher. -* [PHP_CodeSniffer][phpcs-gh] version **3.13.5**/**4.0.1** or higher. -* [PHPCSUtils][phpcsutils-gh] version **1.2.0** or higher. - - -## Installation - -Installing via Composer is highly recommended. - -[Composer](https://getcomposer.org/) will automatically install the project dependencies and register the rulesets from PHPCSExtra and other external standards with PHP_CodeSniffer using the [Composer PHPCS plugin][composer-installer-gh]. - -### Composer Project-based Installation - -Run the following from the root of your project: -```bash -composer config allow-plugins.dealerdirect/phpcodesniffer-composer-installer true -composer require --dev phpcsstandards/phpcsextra:"^1.3.0" -``` - -### Composer Global Installation - -Alternatively, you may want to install this standard globally: -```bash -composer global config allow-plugins.dealerdirect/phpcodesniffer-composer-installer true -composer global require --dev phpcsstandards/phpcsextra:"^1.3.0" -``` - -### Updating to a newer version - -If you installed PHPCSExtra using either of the above commands, you can update to a newer version as follows: -```bash -# Project local install -composer update phpcsstandards/phpcsextra --with-dependencies - -# Global install -composer global update phpcsstandards/phpcsextra --with-dependencies -``` - -> If your project includes `require[-dev]`s for the `squizlabs/php_codesniffer`, `phpcsstandards/phpcsutils` or -> `dealerdirect/phpcodesniffer-composer-installer` packages in its `composer.json` file, you may need to use -> `--with-all-dependencies` instead of `--with-dependencies`. -> -> :bulb: **Pro-tip**: Unless your project is a PHPCS standard which actually uses any of these packages directly, -> it is recommended to remove these packages from your own `composer.json` file, in favour of letting PHPCSExtra -> (and potential other external PHPCS standards you use), manage the version requirements for these packages. - - -## Features - -Once this project is installed, you will see three new rulesets in the list of installed standards when you run `vendor/bin/phpcs -i`: `Modernize`, `NormalizedArrays` and `Universal`. - -* The `Modernize` ruleset is a standard which checks code for modernization opportunaties. -* The `NormalizedArrays` ruleset is a standard to check the formatting of array declarations. -* The `Universal` ruleset is **NOT** a standard, but a sniff collection. - It should **NOT** be included in custom rulesets as a standard as it contains contradictory rules. - Instead include individual sniffs from this standard in a custom project/company ruleset to use them. - - -## Sniffs - -**Legend**: -* :wrench: = Includes auto-fixer. - _Use the `phpcbf` command to run the fixers._ -* :bar_chart: = Includes metrics. - _Use `phpcs` with `--report=info` to see the metrics._ -* :books: = Includes CLI documentation. - _Use `phpcs` with `--generator=Text` to see the documentation._ - - -### Modernize - -#### `Modernize.FunctionCalls.Dirname` :wrench: :books: - -This sniff will detect and auto-fix two typical code modernizations which can be made related to the `dirname()` function: -1. Since PHP 5.3, calls to `dirname(__FILE__)` can be replaced by `__DIR__`. - Errorcode: `Modernize.FunctionCalls.Dirname.FileConstant`. -2. Since PHP 7.0, nested function calls to `dirname()` can be changed to use the `$levels` parameter. - Errorcode: `Modernize.FunctionCalls.Dirname.Nested`. - -If a [`php_version` configuration option][php_version-config] has been passed to PHPCS using either `--config-set` or `--runtime-set`, it will be respected by the sniff. -In effect, this means that the sniff will only report on modernizations which can be applied for the PHP version as configured. - - -### NormalizedArrays - -#### `NormalizedArrays.Arrays.ArrayBraceSpacing` :wrench: :bar_chart: :books: - -Enforce consistent spacing for the open/close braces of array declarations. - -The sniff allows for having different settings for: -* Space between the array keyword and the open parenthesis for long arrays via the `keywordSpacing` property. - Accepted values: (int) number of spaces or `false` to turn this check off. Defaults to `0` spaces. -* Spaces on the inside of the braces for empty arrays via the `spacesWhenEmpty` property. - Accepted values: (string) `newline`, (int) number of spaces or `false` to turn this check off. Defaults to `0` spaces. -* Spaces on the inside of the braces for single-line arrays via the `spacesSingleLine` property; - Accepted values: (int) number of spaces or `false` to turn this check off. Defaults to `0` spaces. -* Spaces on the inside of the braces for multi-line arrays via the `spacesMultiLine` property. - Accepted values: (string) `newline`, (int) number of spaces or `false` to turn this check off. Defaults to `newline`. - -Note: if any of the above properties are set to `newline`, it is recommended to also include an array indentation sniff. This sniff will not handle the indentation. - -#### `NormalizedArrays.Arrays.CommaAfterLast` :wrench: :bar_chart: :books: - -Enforce/forbid a comma after the last item in an array declaration. - -By default, this sniff will: -* Forbid a comma after the last array item for single-line arrays. -* Enforce a comma after the last array item for multi-line arrays. - -This can be changed for each type or array individually by setting the `singleLine` and/or `multiLine` properties in a custom ruleset. - -Use any of the following values to change the properties: `enforce`, `forbid` or `skip` to not check the comma after the last array item for a particular type of array. - -The default for the `singleLine` property is `forbid`. The default for the `multiLine` property is `enforce`. - - -### Universal - -#### `Universal.Arrays.DisallowShortArraySyntax` :wrench: :bar_chart: :books: - -Disallow short array syntax. - -In contrast to the PHPCS native `Generic.Arrays.DisallowShortArraySyntax` sniff, this sniff will ignore short list syntax and not cause parse errors when the fixer is used. - -#### `Universal.Arrays.DuplicateArrayKey` :books: - -Detects duplicate array keys in array declarations. - -The sniff will make a distinction between keys which will be duplicate in all PHP version and (numeric) keys which will only be a duplicate key in [PHP < 8.0 or PHP >= 8.0][php-rfc-negative_array_index]. - -If a [`php_version` configuration option][php_version-config] has been passed to PHPCS using either `--config-set` or `--runtime-set`, it will be respected by the sniff and only report duplicate keys for the configured PHP version. - -[php-rfc-negative_array_index]: https://wiki.php.net/rfc/negative_array_index - -#### `Universal.Arrays.MixedArrayKeyTypes` :books: - -Best practice sniff: don't use a mix of integer and string keys for array items. - -#### `Universal.Arrays.MixedKeyedUnkeyedArray` :books: - -Best practice sniff: don't use a mix of keyed and unkeyed array items. - -#### `Universal.Attributes.BracketSpacing` :wrench: :bar_chart: :books: - -Standardize the amount of spaces on the inside of attribute block brackets. - -* This sniff contains an `spacing` property to set the amount of spaces the sniff should check for. - Accepted values: (int) number of spaces. Defaults to `0` (spaces). -* By default, the sniff does not make an exception for a new line after the attribute opener or before the attribute closer. - This can be changed by setting the `ignoreNewlines` property to `true`. - Accepted values: (bool) `true`|`false`. Defaults to `false`. - When the `ignoreNewlines` property is set to `true` and a new line is found, the sniff will flag stray blank lines at the start and/or end of an attribute block. - -#### `Universal.Attributes.DisallowAttributeParentheses` :wrench: :bar_chart: :books: - -Disallow the use of parentheses when instantiating an attribute without passing parameters. - -#### `Universal.Attributes.RequireAttributeParentheses` :wrench: :bar_chart: :books: - -Require the use of parentheses when instantiating an attribute, whether parameters are passed or not. - -#### `Universal.Attributes.TrailingComma` :wrench: :bar_chart: :books: - -Require a trailing comma for multi-line, multi-attribute attribute blocks and forbid trailing commas in single-line attribute blocks and in multi-line attributes containing only a single attribute. - -#### `Universal.Classes.DisallowAnonClassParentheses` :wrench: :bar_chart: :books: - -Disallow the use of parentheses when declaring an anonymous class without passing parameters. - -#### `Universal.Classes.RequireAnonClassParentheses` :wrench: :bar_chart: :books: - -Require the use of parentheses when declaring an anonymous class, whether parameters are passed or not. - -#### `Universal.Classes.DisallowFinalClass` :wrench: :bar_chart: :books: - -Disallow classes being declared `final`. - -#### `Universal.Classes.RequireFinalClass` :wrench: :bar_chart: :books: - -Require all non-`abstract` classes to be declared `final`. - -:warning: **Warning**: the auto-fixer for this sniff _may_ have unintended side-effects for applications and should be used with care! -This is considered a **_risky_ fixer**. - -#### `Universal.Classes.ModifierKeywordOrder` :wrench: :bar_chart: :books: - -Require a consistent modifier keyword order for class declarations. - -* This sniff contains an `order` property to specify the preferred order. - Accepted values: (string) `'extendability readonly'`|`'readonly extendability'`. Defaults to `'extendability readonly'`. - -#### `Universal.CodeAnalysis.ConstructorDestructorReturn` :wrench: :books: - -* Disallows return type declarations on constructor/destructor methods - error code: `ReturnTypeFound`, auto-fixable. -* Discourages constructor/destructor methods returning a value - error code: `ReturnValueFound`. - -If a [`php_version` configuration option][php_version-config] has been passed to PHPCS using either `--config-set` or `--runtime-set`, it will be respected by the sniff. -In effect, this means that the sniff will only report on PHP4-style constructors if the configured PHP version is less than 8.0. - -#### `Universal.CodeAnalysis.ForeachUniqueAssignment` :wrench: :books: - -Detects `foreach` control structures which use the same variable for both the key as well as the value assignment as this will lead to unexpected - and most likely unintended - behaviour. - -Note: The fixer will maintain the existing behaviour of the code. This may not be the _intended_ behaviour. - -#### `Universal.CodeAnalysis.NoDoubleNegative` :wrench: :books: - -Detects double negation `!!` in code, which is effectively the same as a boolean cast, but with a much higher cognitive load. -Also detects triple negation `!!!`, which is effectively the same as a single negation. - -The sniff has modular error codes to allow for disabling individual checks. The error codes are: `FoundDouble`, `FoundDoubleWithInstanceof` (not auto-fixable) and `FoundTriple`. - -#### `Universal.CodeAnalysis.NoEchoSprintf` :wrench: :books: - -Detects use of the inefficient `echo [v]sprintf(...);` combi. Use `[v]printf()` instead. - -#### `Universal.CodeAnalysis.StaticInFinalClass` :wrench: :books: - -Detects using `static` instead of `self` in OO constructs which are `final`. - -* The sniff has modular error codes to allow for making exceptions based on the type of use for `static`. - The available error codes are: `ReturnType`, `InstanceOf`, `NewInstance`, `ScopeResolution`. - -#### `Universal.Constants.LowercaseClassResolutionKeyword` :wrench: :bar_chart: :books: - -Enforce that the `class` keyword when used for class name resolution, i.e. `::class`, is in lowercase. - -#### `Universal.Constants.ModifierKeywordOrder` :wrench: :bar_chart: :books: - -Require a consistent modifier keyword order for OO constant declarations. - -* This sniff contains an `order` property to specify the preferred order. - Accepted values: (string) `'final visibility'`|`'visibility final'`. Defaults to `'final visibility'`. - -#### `Universal.Constants.UppercaseMagicConstants` :wrench: :bar_chart: :books: - -Enforce uppercase when using PHP native magic constants, like `__FILE__` et al. - -#### `Universal.ControlStructures.DisallowAlternativeSyntax` :wrench: :bar_chart: :books: - -Disallow using the alternative syntax for control structures. - -* This sniff contains an `allowWithInlineHTML` property to allow alternative syntax when inline HTML is used within the control structure. In all other cases, the use of the alternative syntax will still be disallowed. - Accepted values: (bool) `true`|`false`. Defaults to `false`. -* The sniff has modular error codes to allow for making exceptions based on specific control structures and/or specific control structures in combination with inline HTML. - The error codes follow the following pattern: `Found[ControlStructure][WithInlineHTML]`. Examples: `FoundIf`, `FoundSwitchWithInlineHTML`. - -#### `Universal.ControlStructures.DisallowLonelyIf` :wrench: :books: - -Disallow `if` statements as the only statement in an `else` block. - -Note: This sniff will not fix the indentation of the "inner" code. -It is strongly recommended to run this sniff together with the `Generic.WhiteSpace.ScopeIndent` sniff to get the correct indentation. - -#### `Universal.ControlStructures.IfElseDeclaration` :wrench: :bar_chart: :books: - -Verify that else(if) statements with braces are on a new line. - -#### `Universal.Files.SeparateFunctionsFromOO` :bar_chart: :books: - -Enforce for a file to either declare (global/namespaced) functions or declare OO structures, but not both. - -* Nested function declarations, i.e. functions declared within a function/method will be disregarded for the purposes of this sniff. - The same goes for anonymous classes, closures and arrow functions. -* Note: This sniff has no opinion on side effects. If you want to sniff for those, use the PHPCS native `PSR1.Files.SideEffects` sniff. -* Also note: This sniff has no opinion on multiple OO structures being declared in one file. - If you want to sniff for that, use the PHPCS native `Generic.Files.OneObjectStructurePerFile` sniff. - -#### `Universal.FunctionDeclarations.NoLongClosures` :bar_chart: :books: - -Detects "long" closures and recommends using a named function instead. - -The sniff is configurable by setting any of the following properties in a custom ruleset: -* `recommendedLines` (int): determines when a warning will be thrown. - Defaults to `5`, meaning a warning with the errorcode `ExceedsRecommended` will be thrown if the closure is more than 5 lines long. -* `maxLines` (int): determines when an error will be thrown. - Defaults to `8`, meaning that an error with the errorcode `ExceedsMaximum` will be thrown if the closure is more than 8 lines long. -* `ignoreCommentLines` (bool): whether or not comment-only lines should be ignored for the lines count. - Defaults to `true`. -* `ignoreEmptyLines` (bool): whether or not blank lines should be ignored for the lines count. - Defaults to `true`. - -#### `Universal.FunctionDeclarations.RequireFinalMethodsInTraits` :wrench: :bar_chart: :books: - -Enforce non-private, non-abstract methods in traits to be declared as `final`. - -The available error codes are: `NonFinalMethodFound` and `NonFinalMagicMethodFound`. - -#### `Universal.Lists.DisallowLongListSyntax` :wrench: :books: - -Disallow the use of long `list`s. - -> For metrics about the use of long lists vs short lists, please use the `Universal.Lists.DisallowShortListSyntax` sniff. - -#### `Universal.Lists.DisallowShortListSyntax` :wrench: :bar_chart: :books: - -Disallow the use of short lists. - -#### `Universal.Namespaces.DisallowDeclarationWithoutName` :bar_chart: :books: - -Disallow namespace declarations without a namespace name. - -This sniff only applies to namespace declarations using the curly brace syntax. - -#### `Universal.Namespaces.DisallowCurlyBraceSyntax` :bar_chart: :books: - -Disallow the use of the alternative namespace declaration syntax using curly braces. - -#### `Universal.Namespaces.EnforceCurlyBraceSyntax` :bar_chart: :books: - -Enforce the use of the alternative namespace syntax using curly braces. - -#### `Universal.Namespaces.OneDeclarationPerFile` :books: - -Disallow the use of multiple namespaces within a file. - -#### `Universal.NamingConventions.NoReservedKeywordParameterNames` :books: - -Disallow function parameters using reserved keywords as names, as this can quickly become confusing when people use them in function calls using named parameters - -* The sniff has modular error codes to allow for making exceptions for specific keywords. - The error codes follow the following pattern: `[keyword]Found`. - -#### `Universal.OOStructures.AlphabeticExtendsImplements` :wrench: :bar_chart: :books: - -Enforce that the names used in a class/enum "implements" statement or an interface "extends" statement are listed in alphabetic order. - -* This sniff contains a `orderby` property to determine the sort order to use for the statement. - If all names used are unqualified, the sort order won't make a difference. - However, if one or more of the names are partially or fully qualified, the chosen sort order will determine how the sorting between unqualified, partially and fully qualified names is handled. - The sniff supports two sort order options: - - _'name'_ : sort by the interface name only (default); - - _'full'_ : sort by the full name as used in the statement (without leading backslash). - In both cases, the sorting will be done using natural sort, case-insensitive. -* The sniff has modular error codes to allow for selective inclusion/exclusion: - - `ImplementsWrongOrder` - for "class implements" statements. - - `ImplementsWrongOrderWithComments` - for "class implements" statements interlaced with comments. These will not be auto-fixed. - - `ExtendsWrongOrder` - for "interface extends" statements. - - `ExtendsWrongOrderWithComments` - for "interface extends" statements interlaced with comments. These will not be auto-fixed. -* When fixing, the existing spacing between the names in an `implements`/`extends` statement will not be maintained. - The fixer will separate each name with a comma and one space. - If alternative formatting is desired, a sniff which will check and fix the formatting should be added to the ruleset. - -#### `Universal.Operators.ConcatPosition` :wrench: :bar_chart: :books: - -Enforce that the concatenation operator for multi-line concatenations is in a preferred position, either always at the start of the next line or always at the end of the previous line. - -* This sniff contains an `allowOnly` property to set the preferred position for the operator. - Accepted values: (string) `"start"` or `"end"`. Defaults to `"start"`. -* Note: mid-line concatenation is still allowed and will not be flagged by this sniff. - -#### `Universal.Operators.DisallowLogicalAndOr` :bar_chart: :books: - -Enforce the use of the boolean `&&` and `||` operators instead of the logical `and`/`or` operators. - -:information_source: Note: as the [operator precedence](https://www.php.net/language.operators.precedence) of the logical operators is significantly lower than the operator precedence of boolean operators, this sniff does not contain an auto-fixer. - -#### `Universal.Operators.DisallowShortTernary` :bar_chart: :books: - -Disallow the use of short ternaries `?:`. - -While short ternaries are useful when used correctly, the principle of them is often misunderstood and they are more often than not used incorrectly, leading to hard to debug issues and/or PHP warnings/notices. - -#### `Universal.Operators.DisallowStandalonePostIncrementDecrement` :wrench: :bar_chart: :books: - -* Disallow the use of post-in/decrements in stand-alone statements - error codes: `PostDecrementFound` and `PostIncrementFound`. - Using pre-in/decrement is more in line with the principle of least astonishment and prevents bugs when code gets moved around at a later point in time. -* Discourages the use of multiple increment/decrement operators in a stand-alone statement - error code: `MultipleOperatorsFound`. - -#### `Universal.Operators.StrictComparisons` :wrench: :bar_chart: :books: - -Enforce the use of strict comparisons. - -:warning: **Warning**: the auto-fixer for this sniff _may_ cause bugs in applications and should be used with care! -This is considered a **_risky_ fixer**. - -#### `Universal.Operators.TypeSeparatorSpacing` :wrench: :bar_chart: :books: - -Enforce spacing rules around the union, intersection and DNF type operators. -* No space on either side of a union or intersection type operator. -* No space on the inside of DNF type parenthesis or before/after if the previous/next "thing" is part of the type. -* One space before a DNF open parenthesis when it is at the start of a type. -* One space after a DNF close parenthesis when it is at the end of a type. - -The available error codes are: `UnionTypeSpacesBefore`, `UnionTypeSpacesAfter`, `IntersectionTypeSpacesBefore`, `IntersectionTypeSpacesAfter`, `DNFOpenSpacesBefore`, `DNFOpenSpacesAfter`, `DNFCloseTypeSpacesBefore`, `DNFCloseTypeSpacesAfter`. - -#### `Universal.PHP.DisallowExitDieParentheses` :wrench: :bar_chart: :books: - -Disallow the use of parentheses when calling `exit` or `die` without passing parameters. - -#### `Universal.PHP.RequireExitDieParentheses` :wrench: :bar_chart: :books: - -Require the use of parentheses when calling `exit` or `die`, whether parameters are passed or not. - -#### `Universal.PHP.LowercasePHPTag` :wrench: :bar_chart: :books: - -Enforces that the "PHP" in a PHP open tag is lowercase. - -#### `Universal.PHP.NoFQNTrueFalseNull` :wrench: :books: - -Forbids using `true`, `false` and `null` as fully qualified constants. - -#### `Universal.PHP.OneStatementInShortEchoTag` :wrench: :books: - -Disallow short open echo tags `<?=` containing more than one PHP statement. - -#### `Universal.UseStatements.DisallowMixedGroupUse` :wrench: :bar_chart: :books: - -Disallow group use statements which import a combination of namespace/OO construct, functions and/or constants in one statement. - -Note: the fixer will use a semi-standardized format for group use statements. -If there are more specific requirements for the formatting of group use statements, the ruleset configurator should ensure that additional sniffs are included in the ruleset to enforce the required format. - -#### `Universal.UseStatements.DisallowUseClass` :bar_chart: :books: - -Forbid using import `use` statements for classes/traits/interfaces/enums. - -Individual sub-types - with/without alias, global imports, imports from the same namespace - can be forbidden by including that specific error code and/or allowed including the whole sniff and excluding specific error codes. - -The available error codes are: `FoundWithoutAlias`, `FoundWithAlias`, `FromGlobalNamespace`, `FromGlobalNamespaceWithAlias`, `FromSameNamespace` and `FromSameNamespaceWithAlias`. - -#### `Universal.UseStatements.DisallowUseConst` :bar_chart: :books: - -Forbid using import `use` statements for constants. - -See [`Universal.UseStatements.DisallowUseClass`](#universalusestatementsdisallowuseclass-bar_chart-books) for information on the error codes. - -#### `Universal.UseStatements.DisallowUseFunction` :bar_chart: :books: - -Forbid using import `use` statements for functions. - -See [`Universal.UseStatements.DisallowUseClass`](#universalusestatementsdisallowuseclass-bar_chart-books) for information on the error codes. - -#### `Universal.UseStatements.KeywordSpacing` :wrench: :bar_chart: :books: - -Enforce the use of a single space after the `use`, `function`, `const` keywords and both before and after the `as` keyword in import `use` statements. - -Companion sniff to the PHPCS native `Generic.WhiteSpace.LanguageConstructSpacing` sniff which doesn't cover the `function`, `const` and `as` keywords when used in an import `use` statement. - -The sniff has modular error codes to allow for disabling individual checks. The error codes are: `SpaceAfterUse`, `SpaceAfterFunction`, `SpaceAfterConst`, `SpaceBeforeAs` and `SpaceAfterAs`. - -#### `Universal.UseStatements.LowercaseFunctionConst` :wrench: :bar_chart: :books: - -Enforce that `function` and `const` keywords when used in an import `use` statement are always lowercase. - -Companion sniff to the PHPCS native `Generic.PHP.LowerCaseKeyword` sniff which doesn't cover these keywords when used in an import `use` statement. - -#### `Universal.UseStatements.NoLeadingBackslash` :wrench: :bar_chart: :books: - -Verify that a name being imported in an import `use` statement does not start with a leading backslash. - -Names in import `use` statements should always be fully qualified, so a leading backslash is not needed and it is strongly recommended not to use one. - -This sniff handles all types of import use statements supported by PHP, in contrast to other sniffs for the same in, for instance, the PHPCS native `PSR12` or the Slevomat standard, which are incomplete. - -#### `Universal.UseStatements.NoUselessAliases` :wrench: :books: - -Detects useless aliases in import use statements. - -Aliasing something to the same name as the original construct is considered useless (though allowed in PHP). -Note: as OO and function names in PHP are case-insensitive, aliasing to the same name, using a different case is also considered useless. - -#### `Universal.WhiteSpace.AnonClassKeywordSpacing` :wrench: :bar_chart: :books: - -Standardize the amount of spacing between the `class` keyword and the open parenthesis (if any) for anonymous class declarations. - -* This sniff contains an `spacing` property to set the amount of spaces the sniff should check for. - Accepted values: (int) number of spaces. Defaults to `0` (spaces). - -#### `Universal.WhiteSpace.CommaSpacing` :wrench: :bar_chart: :books: - -Enforce that there is no space before a comma and exactly one space, or a new line, after a comma. - -Additionally, the sniff also enforces that the comma should follow the code and not be placed after a trailing comment. - -For the spacing part, the sniff makes the following exceptions: -1. A comma preceded or followed by a parenthesis, curly or square bracket. - These will not be flagged to prevent conflicts with sniffs handling spacing around braces. -2. A comma preceded or followed by another comma, like for skipping items in a list assignment. - These will not be flagged. - -* The sniff has a separate error code - `TooMuchSpaceAfterCommaBeforeTrailingComment` - for when a comma is found with more than one space after it, followed by a trailing comment. - Exclude this error code to allow trailing comment alignment. -* The other error codes the sniff uses, `SpaceBefore`, `TooMuchSpaceAfter` and `NoSpaceAfter`, may be suffixed with a context indicator - `*InFunctionDeclaration`, `*InFunctionCall`, `*InClosureUse`, `*InAttributeBlock` or `*InDeclare` -. - This allows for disabling the sniff in any of these contexts by excluding the specific suffixed error codes. -* The sniff will respect a potentially set [`php_version` configuration option][php_version-config] when deciding how to handle the spacing after a heredoc/nowdoc closer. - In effect, this means that the sniff will enforce a new line between the closer and a comma if the configured PHP version is less than 7.3. - When no `php_version` is passed, the sniff will handle the spacing between a heredoc/nowdoc closer and a comma based on whether it is a cross-version compatible heredoc/nowdoc (enforce new line) or a flexible heredoc/nowdoc (enforce no space). - -#### `Universal.WhiteSpace.DisallowInlineTabs` :wrench: :books: - -Enforce using spaces for mid-line alignment. - -While tab versus space based indentation is a question of preference, for mid-line alignment, spaces should always be preferred, as using tabs will result in inconsistent formatting depending on the dev-user's chosen tab width. - -> _This sniff is especially useful for tab-indentation based standards which use the `Generic.Whitespace.DisallowSpaceIndent` sniff to enforce this._ -> -> **DO** make sure to set the PHPCS native `tab-width` configuration for the best results. -> ```xml -> <arg name="tab-width" value="4"/> -> ``` -> -> The PHPCS native `Generic.Whitespace.DisallowTabIndent` sniff (used for space-based standards) oversteps its reach and silently does mid-line tab to space replacements as well. -> However, the sister-sniff `Generic.Whitespace.DisallowSpaceIndent` leaves mid-line tabs/spaces alone. -> This sniff fills that gap. - -#### `Universal.WhiteSpace.FirstClassCallableSpacing` :wrench: :bar_chart: :books: - -Standardize the amount of spacing around the `...` in a first class callable. - -* This sniff contains an `spacing` property to set the amount of spaces the sniff should check for. - Accepted values: (int) number of spaces. Defaults to `0` (spaces). - -#### `Universal.WhiteSpace.PrecisionAlignment` :wrench: :books: - -Enforce code indentation to always be a multiple of a tabstop, i.e. disallow precision alignment. - -Note: -* This sniff does not concern itself with tabs versus spaces. - It is recommended to use the sniff in combination with the PHPCS native `Generic.WhiteSpace.DisallowTabIndent` or the `Generic.WhiteSpace.DisallowSpaceIndent` sniff. -* When using this sniff with tab-based standards, please ensure that the `tab-width` is set and either don't set the `$indent` property or set it to the tab-width (or a multiple thereof). -* The fixer works based on "best guess" and may not always result in the desired indentation. Combine this sniff with the `Generic.WhiteSpace.ScopeIndent` sniff for more precise indentation fixes. - -The behaviour of the sniff is customizable via the following properties: -* `indent`: the indent used for the codebase. - Accepted values: (int|null) number of spaces. Defaults to `null`. - If this property is not set, the sniff will look to the `--tab-width` CLI value. - If that also isn't set, the default tab-width of `4` will be used. -* `ignoreAlignmentBefore`: allows for providing a list of token names for which (preceding) precision alignment should be ignored. - Accepted values: (`array<string>`) token constant names. Defaults to an empty array. - Usage example: - ```xml - <rule ref="Universal.WhiteSpace.PrecisionAlignment"> - <properties> - <property name="ignoreAlignmentBefore" type="array"> - <!-- Ignore precision alignment in inline HTML --> - <element value="T_INLINE_HTML"/> - <!-- Ignore precision alignment in multiline chained method calls. --> - <element value="T_OBJECT_OPERATOR"/> - <element value="T_NULLSAFE_OBJECT_OPERATOR"/> - </property> - </properties> - </rule> - ``` -* `ignoreBlankLines`: whether or not potential trailing whitespace on otherwise blank lines should be examined or ignored. - It is recommended to only set this to `false` if the standard including this sniff does not include the `Squiz.WhiteSpace.SuperfluousWhitespace` sniff (which is included in most standards). - Accepted values: (bool)`true`|`false`. Defaults to `true`. - - -## Contributing - -Contributions to this project are welcome. Clone the repo, branch off from `develop`, make your changes, commit them and send in a pull request. - -If unsure whether the changes you are proposing would be welcome, open an issue first to discuss your proposal. - - -## License - -This code is released under the [GNU Lesser General Public License (LGPLv3)](LICENSE). - - -[phpcsextra-packagist]: https://packagist.org/packages/phpcsstandards/phpcsextra -[gha-qa-results]: https://github.com/PHPCSStandards/PHPCSExtra/actions/workflows/basics.yml -[gha-test-results]: https://github.com/PHPCSStandards/PHPCSExtra/actions/workflows/test.yml - -[phpcs-gh]: https://github.com/PHPCSStandards/PHP_CodeSniffer -[phpcsutils-gh]: https://github.com/PHPCSStandards/PHPCSUtils -[composer-installer-gh]: https://github.com/PHPCSStandards/composer-installer - -[php_version-config]: https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki/Configuration-Options#setting-the-php-version diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Arrays/DisallowShortArraySyntaxStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/Arrays/DisallowShortArraySyntaxStandard.xml deleted file mode 100644 index 4a84b53..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Arrays/DisallowShortArraySyntaxStandard.xml +++ /dev/null @@ -1,27 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Disallow Short Array Syntax" - > - <standard> - <![CDATA[ - The array keyword must be used to define arrays. - ]]> - </standard> - <code_comparison> - <code title="Valid: Using long form array syntax."> - <![CDATA[ -$arr = <em>array(</em> - 'foo' => 'bar', -<em>)</em>; - ]]> - </code> - <code title="Invalid: Using short array syntax."> - <![CDATA[ -$arr = <em>[</em> - 'foo' => 'bar', -<em>]</em>; - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Arrays/DuplicateArrayKeyStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/Arrays/DuplicateArrayKeyStandard.xml deleted file mode 100644 index 02c0974..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Arrays/DuplicateArrayKeyStandard.xml +++ /dev/null @@ -1,44 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Duplicate Array Key" - > - <standard> - <![CDATA[ - When a second array item with the same key is declared, it will overwrite the first. - This sniff detects when this is happening in array declarations. - ]]> - </standard> - <code_comparison> - <code title="Valid: Arrays with unique keys."> - <![CDATA[ -$args = array( - <em>'foo'</em> => 22, - <em>'bar'</em> => 25, - <em>'baz'</em> => 28, -); - -$args = array( - 22, - 25, - 2 => 28, -); - ]]> - </code> - <code title="Invalid: Array with duplicate keys."> - <![CDATA[ -$args = array( - <em>'foo'</em> => 22, - <em>'bar'</em> => 25, - <em>'bar'</em> => 28, -); - -$args = array( - 22, - 25, - 1 => 28, -); - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Arrays/MixedArrayKeyTypesStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/Arrays/MixedArrayKeyTypesStandard.xml deleted file mode 100644 index f66b235..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Arrays/MixedArrayKeyTypesStandard.xml +++ /dev/null @@ -1,40 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Mixed Array Key Types" - > - <standard> - <![CDATA[ - In an array where the items have keys, all items should either have a numeric key assigned or a string key. A mix of numeric and string keys is not allowed. - ]]> - </standard> - <code_comparison> - <code title="Valid: Arrays with either numeric keys or string keys."> - <![CDATA[ -$args = array( - <em>'foo'</em> => 22, - <em>'bar'</em> => 25, -); - -$args = array( - <em>0</em> => 22, - <em>1</em> => 25, -); - ]]> - </code> - <code title="Invalid: Arrays with a mix of numeric and string keys."> - <![CDATA[ -$args = array( - 'foo' => 22, - 25, -); - -$args = array( - 'foo' => 22, - 12 => 25, -); - - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Arrays/MixedKeyedUnkeyedArrayStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/Arrays/MixedKeyedUnkeyedArrayStandard.xml deleted file mode 100644 index 5f2dbda..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Arrays/MixedKeyedUnkeyedArrayStandard.xml +++ /dev/null @@ -1,31 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Mixed Keyed Unkeyed Array" - > - <standard> - <![CDATA[ - All items in an array should either have an explicit key assigned or none. A mix of keyed and unkeyed items is not allowed. - ]]> - </standard> - <code_comparison> - <code title="Valid: Arrays with all items either keyed or unkeyed."> - <![CDATA[ -$args = array( - <em>'foo'</em> => 22, - <em>'bar'</em> => 25, -); - -$args = array(22, 25); - ]]> - </code> - <code title="Invalid: Array with a mix of keyed and unkeyed items."> - <![CDATA[ -$args = array( - 'foo' => 22, - 25, -); - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Attributes/BracketSpacingStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/Attributes/BracketSpacingStandard.xml deleted file mode 100644 index 4bfdab4..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Attributes/BracketSpacingStandard.xml +++ /dev/null @@ -1,54 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Attribute Bracket Spacing" - > - <standard> - <![CDATA[ - Enforce a fixed number of spaces on the inside of attribute block brackets. By default, 0 (no) spaces are allowed. - - Optionally allows for new lines. - ]]> - </standard> - <code_comparison> - <code title="Valid: No whitespace on the inside of attribute block brackets."> - <![CDATA[ -<em>#[</em>MyAttribute()<em>]<em> -class Foo {} - ]]> - </code> - <code title="Invalid: Whitespace on the inside of attribute block brackets."> - <![CDATA[ -<em>#[ </em>MyAttribute()<em> ]<em> -class Foo {} - ]]> - </code> - </code_comparison> - - <standard> - <![CDATA[ - When the option to allow a new line is turned on, the sniff will verify that there are no blank lines at the start/end of the attribute block. - ]]> - </standard> - <code_comparison> - <code title="Valid: No blank lines at the start/end of an attribute block."> - <![CDATA[ -#[<em> - </em>MyAttribute()<em> -<em>] -class Foo {} - ]]> - </code> - <code title="Invalid: Blank lines at the start/end of an attribute block."> - <![CDATA[ -#[<em> - - - </em>MyAttribute()<em> - -<em>] -class Foo {} - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Attributes/DisallowAttributeParenthesesStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/Attributes/DisallowAttributeParenthesesStandard.xml deleted file mode 100644 index 64a6652..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Attributes/DisallowAttributeParenthesesStandard.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Disallow Attribute Parentheses" - > - <standard> - <![CDATA[ - Disallows the use of parentheses when instantiating an attribute without passing parameters. - ]]> - </standard> - <code_comparison> - <code title="Valid: Attribute instantiation without parentheses or with parameters."> - <![CDATA[ -#[MyAttribute<em></em>] -#[MyAttribute<em>(self::BAZ)</em>] -class Foo {} - ]]> - </code> - <code title="Invalid: Attribute instantiation with parentheses, but without parameters."> - <![CDATA[ -#[MyAttribute<em>()</em>] -class Foo {} - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Attributes/RequireAttributeParenthesesStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/Attributes/RequireAttributeParenthesesStandard.xml deleted file mode 100644 index eee005a..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Attributes/RequireAttributeParenthesesStandard.xml +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Require Attribute Parentheses" - > - <standard> - <![CDATA[ - Require the use of parentheses when instantiating an attribute. - ]]> - </standard> - <code_comparison> - <code title="Valid: Attribute instantiation with parentheses."> - <![CDATA[ -#[MyAttribute<em>()</em>] -class Foo {} - ]]> - </code> - <code title="Invalid: Attribute instantiation without parentheses."> - <![CDATA[ -#[MyAttribute<em></em>] -class Foo {} - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Attributes/TrailingCommaStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/Attributes/TrailingCommaStandard.xml deleted file mode 100644 index be9cb22..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Attributes/TrailingCommaStandard.xml +++ /dev/null @@ -1,77 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Trailing Commas in Attribute Blocks" - > - <standard> - <![CDATA[ - Require a trailing comma for multi-line attribute blocks in which multiple attributes are being instantiated. - ]]> - </standard> - <code_comparison> - <code title="Valid: Multiple attributes in a multi-line attribute block with trailing comma."> - <![CDATA[ -#[ - AttributeOne(10), - AttributeTwo, - AttributeThree(MY_CONST)<em>,</em> -] -class Foo {} - ]]> - </code> - <code title="Invalid: Multiple attributes in a multi-line attribute block without trailing comma."> - <![CDATA[ -#[ - AttributeOne(10), - AttributeTwo, - AttributeThree(MY_CONST)<em> -</em>] -class Foo {} - ]]> - </code> - </code_comparison> - - <standard> - <![CDATA[ - Forbid trailing commas in attribute blocks in all other cases. - ]]> - </standard> - <code_comparison> - <code title="Valid: Single line attribute block without trailing comma."> - <![CDATA[ -#[AttributeOne, AttributeTwo] -class Foo {} - ]]> - </code> - <code title="Invalid: Single line attribute block with trailing comma."> - <![CDATA[ -#[AttributeOne, AttributeTwo<em>,<em>] -class Foo {} - ]]> - </code> - </code_comparison> - <code_comparison> - <code title="Valid: Single attribute in a multi-line attribute block without trailing comma."> - <![CDATA[ -#[ - MyAttribute( - paramA: 10, - paramB: 20, - ) -] -class Foo {} - ]]> - </code> - <code title="Invalid: Single attribute in a multi-line attribute block with trailing comma."> - <![CDATA[ -#[ - MyAttribute( - paramA: 10, - paramB: 20, - )<em>,</em> -] -class Foo {} - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Classes/DisallowAnonClassParenthesesStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/Classes/DisallowAnonClassParenthesesStandard.xml deleted file mode 100644 index ebfd7c6..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Classes/DisallowAnonClassParenthesesStandard.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Disallow Anonymous Class Parentheses" - > - <standard> - <![CDATA[ - Disallows the use of parentheses when declaring an anonymous class without passing parameters. - ]]> - </standard> - <code_comparison> - <code title="Valid: Anonymous class without parentheses or with parameters."> - <![CDATA[ -$anon = new class<em></em> {}; -$anon = new class<em>($param)</em> {}; - ]]> - </code> - <code title="Invalid: Anonymous class with parentheses."> - <![CDATA[ -$anon = new class<em>()</em> {}; - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Classes/DisallowFinalClassStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/Classes/DisallowFinalClassStandard.xml deleted file mode 100644 index fd7ddb6..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Classes/DisallowFinalClassStandard.xml +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Disallow Final Class" - > - <standard> - <![CDATA[ - Disallows the use of the `final` keyword for class declarations. - ]]> - </standard> - <code_comparison> - <code title="Valid: Non-final class."> - <![CDATA[ -<em>class</em> Foo {} -<em>abstract class</em> Bar implements MyInterface {} - ]]> - </code> - <code title="Invalid: Final class."> - <![CDATA[ -<em>final class</em> Foo {} -<em>final class</em> Bar extends MyAbstract {} - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Classes/ModifierKeywordOrderStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/Classes/ModifierKeywordOrderStandard.xml deleted file mode 100644 index a80ae0d..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Classes/ModifierKeywordOrderStandard.xml +++ /dev/null @@ -1,27 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Class Modifier Keyword Order" - > - <standard> - <![CDATA[ - Requires that class modifier keywords consistently use the same keyword order. - - By default the expected order is "abstract/final readonly", but this can be changed via the sniff configuration. - ]]> - </standard> - <code_comparison> - <code title="Valid: Modifier keywords ordered correctly."> - <![CDATA[ -<em>final readonly</em> class Foo {} -<em>abstract readonly</em> class Bar {} - ]]> - </code> - <code title="Invalid: Modifier keywords in reverse order."> - <![CDATA[ -<em>readonly final</em> class Foo {} -<em>readonly abstract</em> class Bar {} - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Classes/RequireAnonClassParenthesesStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/Classes/RequireAnonClassParenthesesStandard.xml deleted file mode 100644 index 48fa148..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Classes/RequireAnonClassParenthesesStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Require Anonymous Class Parentheses" - > - <standard> - <![CDATA[ - Require the use of parentheses when declaring an anonymous class. - ]]> - </standard> - <code_comparison> - <code title="Valid: Anonymous class with parentheses."> - <![CDATA[ -$anon = new class<em>()</em> {}; - ]]> - </code> - <code title="Invalid: Anonymous class without parentheses."> - <![CDATA[ -$anon = new class<em></em> {}; - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Classes/RequireFinalClassStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/Classes/RequireFinalClassStandard.xml deleted file mode 100644 index 107b8f4..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Classes/RequireFinalClassStandard.xml +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Require Final Class" - > - <standard> - <![CDATA[ - Requires the use of the `final` keyword for non-abstract class declarations. - ]]> - </standard> - <code_comparison> - <code title="Valid: Final class."> - <![CDATA[ -<em>final class</em> Foo {} -<em>final class</em> Bar extends MyAbstract {} - ]]> - </code> - <code title="Invalid: Non-final class."> - <![CDATA[ -<em>class</em> Foo {} -<em>abstract class</em> Bar implements MyInterface {} - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/CodeAnalysis/ConstructorDestructorReturnStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/CodeAnalysis/ConstructorDestructorReturnStandard.xml deleted file mode 100644 index 35b7678..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/CodeAnalysis/ConstructorDestructorReturnStandard.xml +++ /dev/null @@ -1,64 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Constructor Destructor Return" - > - <standard> - <![CDATA[ - A class constructor/destructor can not have a return type declarations. This would result in a fatal error. - ]]> - </standard> - <code_comparison> - <code title="Valid: No return type declaration."> - <![CDATA[ -class Foo { - public function __construct() {} -} - ]]> - </code> - <code title="Invalid: Return type declaration."> - <![CDATA[ -class Foo { - public function __construct()<em>: int</em> {} -} - ]]> - </code> - </code_comparison> - - <standard> - <![CDATA[ - A class constructor/destructor should not return anything. - ]]> - </standard> - <code_comparison> - <code title="Valid: Class constructor/destructor doesn't return anything."> - <![CDATA[ -class Foo { - public function __construct() { - // Do something. - } - - public function __destruct() { - // Do something. - return; - } -} - ]]> - </code> - <code title="Invalid: Class constructor/destructor returns a value."> - <![CDATA[ -class Foo { - public function __construct() { - // Do something. - return <em>$this</em>; - } - - public function __destruct() { - // Do something. - return <em>false</em>; - } -} - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/CodeAnalysis/ForeachUniqueAssignmentStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/CodeAnalysis/ForeachUniqueAssignmentStandard.xml deleted file mode 100644 index e92b33c..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/CodeAnalysis/ForeachUniqueAssignmentStandard.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Foreach Unique Assignment" - > - <standard> - <![CDATA[ - When a foreach control structure uses the same variable for both the $key as well as the $value assignment, the key will be disregarded and be inaccessible and the variable will contain the value. - Mix in reference assignments and the behaviour becomes even more unpredictable. - - This is a coding error. Either use unique variables for the key and the value or don't assign the key. - ]]> - </standard> - <code_comparison> - <code title="Valid: Using unique variables."> - <![CDATA[ -foreach ($array as $k => $v ) {} - ]]> - </code> - <code title="Invalid: Using the same variable for both the key as well as the value."> - <![CDATA[ -foreach ($array as $k => $k ) {} - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/CodeAnalysis/NoDoubleNegativeStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/CodeAnalysis/NoDoubleNegativeStandard.xml deleted file mode 100644 index 972a304..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/CodeAnalysis/NoDoubleNegativeStandard.xml +++ /dev/null @@ -1,27 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="No Double Negative" - > - <standard> - <![CDATA[ - Detects double negation in code, which is effectively the same as a boolean cast, but with a much higher cognitive load. - ]]> - </standard> - <code_comparison> - <code title="Valid: Using singular negation or a boolean cast."> - <![CDATA[ -$var = $a && <em>!</em> $b; - -if(<em>(bool)</em> callMe($a)) {} - ]]> - </code> - <code title="Invalid: Using double negation (or more)."> - <![CDATA[ -$var = $a && <em>! !</em> $b; - -if(<em>! ! !</em> callMe($a)) {} - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/CodeAnalysis/NoEchoSprintfStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/CodeAnalysis/NoEchoSprintfStandard.xml deleted file mode 100644 index 0881214..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/CodeAnalysis/NoEchoSprintfStandard.xml +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="No Echo Sprintf" - > - <standard> - <![CDATA[ - Detects use of `echo [v]sprintf(...);`. Use `[v]printf()` instead. - ]]> - </standard> - <code_comparison> - <code title="Valid: Using [v]printf() or echo with anything but [v]sprintf()."> - <![CDATA[ -<em>printf</em>('text %s text', $var); -<em>echo callMe</em>('text %s text', $var); - ]]> - </code> - <code title="Invalid: Using echo [v]sprintf()."> - <![CDATA[ -<em>echo sprintf</em>('text %s text', $var); -<em>echo vsprintf</em>('text %s text', [$var]); - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/CodeAnalysis/StaticInFinalClassStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/CodeAnalysis/StaticInFinalClassStandard.xml deleted file mode 100644 index 5f9f45b..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/CodeAnalysis/StaticInFinalClassStandard.xml +++ /dev/null @@ -1,43 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Static in Final Class" - > - <standard> - <![CDATA[ - When a class is declared as final, using the `static` keyword for late static binding is unnecessary and redundant. - This rule also covers using `static` in a comparison with `instanceof`, using `static` for class instantiations or as a return type. - - `self` should be used instead. - - This applies to final classes, anonymous classes (final by nature) and enums (final by design). - ]]> - </standard> - <code_comparison> - <code title="Valid: Using 'self' in a final OO construct."> - <![CDATA[ -final class Foo -{ - public function myMethod($param) : <em>self</em> - { - $var = <em>self</em>::functionCall(); - $var = $obj instanceof <em>self</em>; - $var = new <em>self</em>; - } -} - ]]> - </code> - <code title="Invalid: Using 'static' in a final OO construct."> - <![CDATA[ -$anon = new class { - public function myMethod( - ): int|<em>static</em>|false { - $var = <em>static</em>::$prop; - $var = $obj instanceof <em>static</em>; - $var = new <em>static</em>(); - } -}; - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Constants/LowercaseClassResolutionKeywordStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/Constants/LowercaseClassResolutionKeywordStandard.xml deleted file mode 100644 index 6d34f12..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Constants/LowercaseClassResolutionKeywordStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Lowercase Class Resolution Keyword" - > - <standard> - <![CDATA[ - The "class" keyword when used for class name resolution, i.e. `::class`, must be in lowercase. - ]]> - </standard> - <code_comparison> - <code title="Valid: Using lowercase."> - <![CDATA[ -echo MyClass::class; - ]]> - </code> - <code title="Invalid: Using uppercase or mixed case."> - <![CDATA[ -echo <em>MyClass::CLASS</em>; - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Constants/ModifierKeywordOrderStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/Constants/ModifierKeywordOrderStandard.xml deleted file mode 100644 index f42483a..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Constants/ModifierKeywordOrderStandard.xml +++ /dev/null @@ -1,30 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Constant Modifier Keyword Order" - > - <standard> - <![CDATA[ - Requires that constant modifier keywords consistently use the same keyword order. - - By default the expected order is "final visibility", but this can be changed via the sniff configuration. - ]]> - </standard> - <code_comparison> - <code title="Valid: Modifier keywords ordered correctly."> - <![CDATA[ -class CorrectOrder { - <em>final public</em> const FOO = 'foo'; -} - ]]> - </code> - <code title="Invalid: Modifier keywords in reverse order."> - <![CDATA[ -class IncorrectOrder { - #[SomeAttribute] - <em>protected final</em> const BAR = 'foo'; -} - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Constants/UppercaseMagicConstantsStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/Constants/UppercaseMagicConstantsStandard.xml deleted file mode 100644 index e89dcef..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Constants/UppercaseMagicConstantsStandard.xml +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Uppercase Magic Constants" - > - <standard> - <![CDATA[ - The PHP native `__...__` magic constant should be in uppercase. - ]]> - </standard> - <code_comparison> - <code title="Valid: Using uppercase."> - <![CDATA[ -echo <em>__LINE__</em>; -include <em>__DIR__</em> . '/file.php'; - ]]> - </code> - <code title="Invalid: Using lowercase or mixed case."> - <![CDATA[ -echo <em>__NameSpace__</em>; -include dirname(<em>__file__</em>) . '/file.php'; - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/ControlStructures/DisallowAlternativeSyntaxStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/ControlStructures/DisallowAlternativeSyntaxStandard.xml deleted file mode 100644 index 816e812..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/ControlStructures/DisallowAlternativeSyntaxStandard.xml +++ /dev/null @@ -1,35 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Disallow Alternative Control Structure Syntax" - > - <standard> - <![CDATA[ - The use of the alternative syntax for control structures is not allowed. - ]]> - </standard> - <code_comparison> - <code title="Valid: Using curly brace syntax for control structures."> - <![CDATA[ -if ($foo) <em>{</em> - $var = 1; -<em>}</em> - -while (++$i < 10) <em>{</em> - echo $i; -<em>}</em> - ]]> - </code> - <code title="Invalid: Using the alternative syntax for control structures."> - <![CDATA[ -if ($foo) <em>:</em> - $var = 1; -<em>endif;</em> - -while (++$i < 10)<em>:</em> - echo $i; -<em>endwhile;</em> - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/ControlStructures/DisallowLonelyIfStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/ControlStructures/DisallowLonelyIfStandard.xml deleted file mode 100644 index 8acb7bf..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/ControlStructures/DisallowLonelyIfStandard.xml +++ /dev/null @@ -1,49 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Disallow Lonely If" - > - <standard> - <![CDATA[ - Disallows `if` statements as the only statement in an `else` block. - - If an `if` statement is the only statement in the `else` block, use `elseif` instead. - ]]> - </standard> - <code_comparison> - <code title="Valid: Use of elseif or if followed by another statement."> - <![CDATA[ -if ($foo) { - // ... -} <em>elseif ($bar)</em> { - // ... -} - -if ($foo) { - // ... -} else { - <em>if ($bar) { - // ... - } - - doSomethingElse(); - </em> -} - - ]]> - </code> - <code title="Invalid: Lonely if in an else block."> - <![CDATA[ -if ($foo) { - // ... -} else { - <em>if ($bar) { - // ... - } else { - // ... - }</em> -} - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/ControlStructures/IfElseDeclarationStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/ControlStructures/IfElseDeclarationStandard.xml deleted file mode 100644 index b1506f6..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/ControlStructures/IfElseDeclarationStandard.xml +++ /dev/null @@ -1,37 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="If-else Declarations" - > - <standard> - <![CDATA[ - The `else` and `elseif` keywords should be on a new line. - ]]> - </standard> - <code_comparison> - <code title="Valid: `elseif` and `else` each on a new line."> - <![CDATA[ -if ($foo) { - $var = 1; -}<em> -elseif</em> ($bar) { - $var = 2; -} -else { - $var = 3; -} - ]]> - </code> - <code title="Invalid: `elseif` and `else` on the same line as the closing curly of the preceding (else)if."> - <![CDATA[ -if ($foo) { - $var = 1; -} <em>elseif</em> ($bar) { - $var = 2; -} <em>else</em> { - $var = 3; -} - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Files/SeparateFunctionsFromOOStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/Files/SeparateFunctionsFromOOStandard.xml deleted file mode 100644 index db0a267..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Files/SeparateFunctionsFromOOStandard.xml +++ /dev/null @@ -1,45 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Separate Functions From OO" - > - <standard> - <![CDATA[ - A file should either declare (global/namespaced) functions or declare OO structures, but not both. - - Nested function declarations, i.e. functions declared within a function/method will be disregarded for the purposes of this sniff. - The same goes for anonymous classes, closures and arrow functions. - ]]> - </standard> - <code_comparison> - <code title="Valid: Files containing only functions or only OO."> - <![CDATA[ -// Valid1.php -<?php -class Bar { - public function foo() {} -} - -// Valid2.php -<?php -function foo() {} -function bar() {} -function baz() {} - ]]> - </code> - <code title="Invalid: File containing both OO structure declarations as well as function declarations."> - <![CDATA[ -// Invalid.php -<?php -function foo() {} - -class Bar { - public function foo() {} -} - -function bar() {} -function baz() {} - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/FunctionDeclarations/NoLongClosuresStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/FunctionDeclarations/NoLongClosuresStandard.xml deleted file mode 100644 index dc84e0b..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/FunctionDeclarations/NoLongClosuresStandard.xml +++ /dev/null @@ -1,42 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="No Long Closures" - > - <standard> - <![CDATA[ - Forbids the use of long closures and recommends using named functions instead. - - By default a closure is considered "longish" (warning) when it contains more than 5 lines of code and too long (error) when it contains more than 8 lines of code. - Also, by default only code lines are counted and blank lines and comment lines are ignored. - Each of these settings can be changed via the sniff configuration. - ]]> - </standard> - <code_comparison> - <code title="Valid: Short closure."> - <![CDATA[ -$closure = function() { - line1(); - line2(); - line3(); -}; - ]]> - </code> - <code title="Invalid: Long closure."> - <![CDATA[ -$closure = function() { - line1(); - line2(); - line3(); - line4(); - line5(); - line6(); - line7(); - line8(); - line9(); - line10(); -}; - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/FunctionDeclarations/RequireFinalMethodsInTraitsStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/FunctionDeclarations/RequireFinalMethodsInTraitsStandard.xml deleted file mode 100644 index 4b2622d..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/FunctionDeclarations/RequireFinalMethodsInTraitsStandard.xml +++ /dev/null @@ -1,33 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Require Final Methods in Traits" - > - <standard> - <![CDATA[ - Requires the use of the `final` keyword for non-abstract, non-private methods in traits. - ]]> - </standard> - <code_comparison> - <code title="Valid: Final methods in a trait."> - <![CDATA[ -trait Foo { - <em>final</em> public function bar() {} - <em>final</em> public static function baz() {} - - // Also valid (out of scope): - protected abstract function overload() {} - private function okay() {} -} - ]]> - </code> - <code title="Invalid: Non-final methods in a trait."> - <![CDATA[ -trait Foo { - <em>public function</em> bar() {} - <em>protected static function</em> baz() {} -} - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Lists/DisallowLongListSyntaxStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/Lists/DisallowLongListSyntaxStandard.xml deleted file mode 100644 index 35475ea..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Lists/DisallowLongListSyntaxStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Disallow Long List Syntax" - > - <standard> - <![CDATA[ - Short list syntax must be used. - ]]> - </standard> - <code_comparison> - <code title="Valid: Short form of list."> - <![CDATA[ -<em>[</em>$a, $b<em>]</em> = $array; - ]]> - </code> - <code title="Invalid: Long form of list."> - <![CDATA[ -<em>list(</em>$a, $b<em>)</em> = $array; - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Lists/DisallowShortListSyntaxStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/Lists/DisallowShortListSyntaxStandard.xml deleted file mode 100644 index 214b686..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Lists/DisallowShortListSyntaxStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Disallow Short List Syntax" - > - <standard> - <![CDATA[ - Long list syntax must be used. - ]]> - </standard> - <code_comparison> - <code title="Valid: Long form of list."> - <![CDATA[ -<em>list(</em>$a, $b<em>)</em> = $array; - ]]> - </code> - <code title="Invalid: Short form of list."> - <![CDATA[ -<em>[</em>$a, $b<em>]</em> = $array; - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Namespaces/DisallowCurlyBraceSyntaxStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/Namespaces/DisallowCurlyBraceSyntaxStandard.xml deleted file mode 100644 index 95174d7..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Namespaces/DisallowCurlyBraceSyntaxStandard.xml +++ /dev/null @@ -1,27 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Disallow Curly Brace Namespace Syntax" - > - <standard> - <![CDATA[ - Namespace declarations using the curly brace syntax are not allowed. - ]]> - </standard> - <code_comparison> - <code title="Valid: Namespace declaration without braces."> - <![CDATA[ -namespace Vendor\Project\Sub<em>;</em> - -// Code - ]]> - </code> - <code title="Invalid: Namespace declaration with braces."> - <![CDATA[ -namespace Vendor\Project\Scoped <em>{</em> - // Code. -<em>}</em> - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Namespaces/DisallowDeclarationWithoutNameStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/Namespaces/DisallowDeclarationWithoutNameStandard.xml deleted file mode 100644 index 465ea55..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Namespaces/DisallowDeclarationWithoutNameStandard.xml +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Disallow Namespace Declaration Without Name" - > - <standard> - <![CDATA[ - Namespace declarations without a namespace name are not allowed. - ]]> - </standard> - <code_comparison> - <code title="Valid: Named namespace declaration."> - <![CDATA[ -namespace <em>Vendor\Name</em> { -} - ]]> - </code> - <code title="Invalid: Namespace declaration without a name (=global namespace)."> - <![CDATA[ -namespace<em> </em>{ -} - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Namespaces/EnforceCurlyBraceSyntaxStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/Namespaces/EnforceCurlyBraceSyntaxStandard.xml deleted file mode 100644 index 8e1892c..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Namespaces/EnforceCurlyBraceSyntaxStandard.xml +++ /dev/null @@ -1,27 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Enforce Curly Brace Namespace Syntax" - > - <standard> - <![CDATA[ - Namespace declarations without curly braces are not allowed. - ]]> - </standard> - <code_comparison> - <code title="Valid: Namespace declaration with braces."> - <![CDATA[ -namespace Vendor\Project\Scoped <em>{</em> - // Code. -<em>}</em> - ]]> - </code> - <code title="Invalid: Namespace declaration without braces."> - <![CDATA[ -namespace Vendor\Project\Sub<em>;</em> - -// Code - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Namespaces/OneDeclarationPerFileStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/Namespaces/OneDeclarationPerFileStandard.xml deleted file mode 100644 index 6aa0f15..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Namespaces/OneDeclarationPerFileStandard.xml +++ /dev/null @@ -1,27 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="One Namespace Declaration Per File" - > - <standard> - <![CDATA[ - There should be only one namespace declaration per file. - ]]> - </standard> - <code_comparison> - <code title="Valid: One namespace declaration in a file."> - <![CDATA[ -namespace Vendor\Project\Sub; - ]]> - </code> - <code title="Invalid: Multiple namespace declarations in a file."> - <![CDATA[ -namespace Vendor\Project\Sub\A { -} - -<em>namespace Vendor\Project\Sub\B { -}</em> - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/NamingConventions/NoReservedKeywordParameterNamesStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/NamingConventions/NoReservedKeywordParameterNamesStandard.xml deleted file mode 100644 index 2a0113e..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/NamingConventions/NoReservedKeywordParameterNamesStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="No Reserved Keyword Parameter Names" - > - <standard> - <![CDATA[ - It is recommended not to use reserved keywords as parameter names as this can become confusing when people use them in function calls using named parameters. - ]]> - </standard> - <code_comparison> - <code title="Valid: Parameter names do not use reserved keywords."> - <![CDATA[ -function foo( $input, $description ) {} - ]]> - </code> - <code title="Invalid: Parameter names use reserved keywords."> - <![CDATA[ -function foo( $string, $echo = true ) {} - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/OOStructures/AlphabeticExtendsImplementsStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/OOStructures/AlphabeticExtendsImplementsStandard.xml deleted file mode 100644 index f22a719..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/OOStructures/AlphabeticExtendsImplementsStandard.xml +++ /dev/null @@ -1,27 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Alphabetic Extends Implements" - > - <standard> - <![CDATA[ - The names used in class "implements" or interface "extends" statements should be listed in alphabetic order. - ]]> - </standard> - <code_comparison> - <code title="Valid: Names listed alphabetically."> - <![CDATA[ -class Baz implements <em>Bar, Foo</em> -{ -} - ]]> - </code> - <code title="Invalid: Names not listed alphabetically."> - <![CDATA[ -class Baz implements <em>Foo, Bar</em> -{ -} - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Operators/ConcatPositionStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/Operators/ConcatPositionStandard.xml deleted file mode 100644 index 4936f04..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Operators/ConcatPositionStandard.xml +++ /dev/null @@ -1,31 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Concatenation position" - > - <standard> - <![CDATA[ - Enforces that the concatenation operator for multi-line concatenations is in a preferred position, either always at the start of the next line or always at the end of the previous line. - - The preferred position is configurable and defaults to "start" for _start of the next line_. - - Note: mid-line concatenation is still allowed and will not be flagged by this sniff. - ]]> - </standard> - <code_comparison> - <code title="Valid: Multi-line concatenation with the concatenation operator at the start of each line."> - <![CDATA[ -$var = 'text' . $a - <em>.</em> $b . 'text' - <em>.</em> $c; - ]]> - </code> - <code title="Invalid: Multi-line concatenation with the concatenation operator not consistently at the start of each line."> - <![CDATA[ -$var = 'text' . $a <em>.</em> - $b . 'text' - <em>.</em> $c; - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Operators/DisallowLogicalAndOrStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/Operators/DisallowLogicalAndOrStandard.xml deleted file mode 100644 index 4e39878..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Operators/DisallowLogicalAndOrStandard.xml +++ /dev/null @@ -1,30 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Disallow Logical And Or" - > - <standard> - <![CDATA[ - Using the logical "and" and "or" operators is not allowed. - - The logical "and" and "or" operators have a significantly lower operator precedence than their boolean "&&" and "||" counter-parts, which often leads to unexpected bugs. - The boolean "&&" and "||" operators are nearly always the better choice. - ]]> - </standard> - <code_comparison> - <code title="Valid: Using boolean operators."> - <![CDATA[ -if (isset($var) <em>&&</em> $var > 10) {} - -if (empty($var) <em>||</em> $var < 0) {} - ]]> - </code> - <code title="Invalid: Using logical operators."> - <![CDATA[ -if (isset($var) <em>and</em> $var > 10) {} - -if (empty($var) <em>or</em> $var < 0) {} - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Operators/DisallowShortTernaryStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/Operators/DisallowShortTernaryStandard.xml deleted file mode 100644 index 0ef2ea3..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Operators/DisallowShortTernaryStandard.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Disallow Short Ternary" - > - <standard> - <![CDATA[ - Using short ternaries is not allowed. - - While short ternaries are useful when used correctly, the principle of them is often misunderstood and they are more often than not used incorrectly, leading to hard to debug issues and/or PHP warnings/notices. - ]]> - </standard> - <code_comparison> - <code title="Valid: Full ternary."> - <![CDATA[ -echo !empty($a) <em>?</em> $a <em>:</em> 'default'; - ]]> - </code> - <code title="Invalid: Short ternary."> - <![CDATA[ -echo !empty($a) <em>?:</em> 'default'; -echo $a <em>? :</em> 'default'; - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Operators/DisallowStandalonePostIncrementDecrementStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/Operators/DisallowStandalonePostIncrementDecrementStandard.xml deleted file mode 100644 index 0678003..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Operators/DisallowStandalonePostIncrementDecrementStandard.xml +++ /dev/null @@ -1,44 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Disallow Standalone Post-Increment/Decrement" - > - <standard> - <![CDATA[ - In a stand-alone in/decrement statement, pre-in/decrement should always be favoured over post-in/decrement. - - This reduces the chance of bugs when code gets moved around. - ]]> - </standard> - <code_comparison> - <code title="Valid: Pre-in/decrement in a stand-alone statement."> - <![CDATA[ -<em>++</em>$i; -<em>--</em>$j; - ]]> - </code> - <code title="Invalid: Post-in/decrement in a stand-alone statement."> - <![CDATA[ -$i<em>++</em>; -$j<em>--</em>; - ]]> - </code> - </code_comparison> - <standard> - <![CDATA[ - Using multiple increment/decrement operators in a stand-alone statement is strongly discouraged. - ]]> - </standard> - <code_comparison> - <code title="Valid: Single in/decrement operator in a stand-alone statement."> - <![CDATA[ -<em>++</em>$i; - ]]> - </code> - <code title="Invalid: Multiple in/decrement operators in a stand-alone statement."> - <![CDATA[ -<em>--</em>$i<em>++</em><em>++</em>; - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Operators/StrictComparisonsStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/Operators/StrictComparisonsStandard.xml deleted file mode 100644 index b4507ed..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Operators/StrictComparisonsStandard.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Strict Comparisons" - > - <standard> - <![CDATA[ - Using loose comparisons is not allowed. - - Loose comparisons will type juggle the values being compared, which often results in bugs. - ]]> - </standard> - <code_comparison> - <code title="Valid: Using strict comparisons."> - <![CDATA[ -if ($var <em>===</em> 'text') {} - -if ($var <em>!==</em> true) {} - ]]> - </code> - <code title="Invalid: Using loose comparisons."> - <![CDATA[ -if ($var <em>==</em> 'text') {} - -if ($var <em>!=</em> true) {} - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Operators/TypeSeparatorSpacingStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/Operators/TypeSeparatorSpacingStandard.xml deleted file mode 100644 index 58a3b56..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/Operators/TypeSeparatorSpacingStandard.xml +++ /dev/null @@ -1,39 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Type Separator Spacing" - > - <standard> - <![CDATA[ - Enforce spacing rules around the union, intersection and DNF type operators. - - No space on either side of a union or intersection type operator. - - No space on the inside of DNF type parenthesis or before/after if the previous/next "thing" is part of the type. - - One space before a DNF open parenthesis when it is at the start of a type. - - One space after a DNF close parenthesis when it is at the end of a type. - - This applies to all locations where type declarations can be used, i.e. property types, constant types, parameter types and return types. - ]]> - </standard> - <code_comparison> - <code title="Valid: Correct spacing around the separators."> - <![CDATA[ -function foo( - int<em>|</em>string $paramA, - TypeA<em>&</em>TypeB $paramB, - <em>(</em>TypeA&TypeB<em>)</em>|null $paramC -): int<em>|</em>false {} - ]]> - </code> - <code title="Invalid: Incorrect spacing around the separators."> - <![CDATA[ -function foo( - int<em> | </em>string $paramA, - TypeA<em> & </em>TypeB $paramB, - <em>( </em>TypeA&TypeB<em> ) </em>|null $paramC -): int<em> - | - </em>false {} - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/PHP/DisallowExitDieParenthesesStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/PHP/DisallowExitDieParenthesesStandard.xml deleted file mode 100644 index 5a32f51..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/PHP/DisallowExitDieParenthesesStandard.xml +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Disallow Exit/Die Parentheses" - > - <standard> - <![CDATA[ - Disallows the use of parentheses when calling `exit` or `die` without passing the `$status` parameter. - ]]> - </standard> - <code_comparison> - <code title="Valid: Exit/die without parentheses or with parameter."> - <![CDATA[ -die<em></em>; -exit<em>($status)</em>; - ]]> - </code> - <code title="Invalid: Exit/die with parentheses, but without parameter."> - <![CDATA[ -die<em>()</em>; -exit<em>()</em>; - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/PHP/LowercasePHPTagStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/PHP/LowercasePHPTagStandard.xml deleted file mode 100644 index 261f93c..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/PHP/LowercasePHPTagStandard.xml +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Lowercase PHP Tag" - > - <standard> - <![CDATA[ - Enforces that the PHP open tag is lowercase. - ]]> - </standard> - <code_comparison> - <code title="Valid: Lowercase open tag."> - <![CDATA[ -<?php -echo 'hello!'; - ]]> - </code> - <code title="Invalid: Uppercase open tag."> - <![CDATA[ -<?PHP -echo 'hello!'; - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/PHP/NoFQNTrueFalseNullStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/PHP/NoFQNTrueFalseNullStandard.xml deleted file mode 100644 index 205b466..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/PHP/NoFQNTrueFalseNullStandard.xml +++ /dev/null @@ -1,27 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="No FQN True False or Null" - > - <standard> - <![CDATA[ - Forbids using `true`, `false` and `null` as fully qualified constants. - ]]> - </standard> - <code_comparison> - <code title="Valid: Using true/false/null without namespace separator prefix."> - <![CDATA[ -$a = <em>null</em>; - -if ($something === <em>false</em>) {} - ]]> - </code> - <code title="Invalid: Using true/false/null as fully qualified constants."> - <![CDATA[ -$a = <em>\</em>null; - -if ($something === <em>\</em>false) {} - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/PHP/OneStatementInShortEchoTagStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/PHP/OneStatementInShortEchoTagStandard.xml deleted file mode 100644 index 103ca13..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/PHP/OneStatementInShortEchoTagStandard.xml +++ /dev/null @@ -1,41 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="One Statement In Short Echo Tag" - > - <standard> - <![CDATA[ - Best practice: Short open echo tags should only ever contain *one* statement. - Use normal "<?php" tags for multi-statement PHP. - ]]> - </standard> - <code_comparison> - <code title="Valid: Using short open echo tag with one statement."> - <![CDATA[ -div><?= $text ?></div> - ]]> - </code> - <code title="Invalid: Using short open echo tag with multiple statements."> - <![CDATA[ -<div><em><?=</em> $text; <em>echo $moreText;</em> ?></div> - ]]> - </code> - </code_comparison> - <code_comparison> - <code title="Valid: Using normal PHP tag with multiple statements."> - <![CDATA[ -<div><em><?php</em> -echo $text; -echo $moreText; -?></div> - ]]> - </code> - <code title="Invalid: Using short open echo tag with multiple statements."> - <![CDATA[ -<div><em><?=</em> $text; -<em>echo $moreText;</em> -?></div> - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/PHP/RequireExitDieParenthesesStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/PHP/RequireExitDieParenthesesStandard.xml deleted file mode 100644 index 677a4ce..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/PHP/RequireExitDieParenthesesStandard.xml +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Require Exit/Die Parentheses" - > - <standard> - <![CDATA[ - Require the use of parentheses when calling `exit` or `die`, even if no argument is given. - ]]> - </standard> - <code_comparison> - <code title="Valid: Calling exit/die with parentheses."> - <![CDATA[ -die<em>()</em>; -exit<em>($status)</em>; - ]]> - </code> - <code title="Invalid: Calling exit/die without parentheses."> - <![CDATA[ -die<em></em>; -exit<em></em>; - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/UseStatements/DisallowMixedGroupUseStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/UseStatements/DisallowMixedGroupUseStandard.xml deleted file mode 100644 index 2b930f2..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/UseStatements/DisallowMixedGroupUseStandard.xml +++ /dev/null @@ -1,39 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Disallow Mixed Group Use" - > - <standard> - <![CDATA[ - Disallow group use statements which combine imports for namespace/OO, functions and/or constants in one statement. - ]]> - </standard> - <code_comparison> - <code title="Valid: Single type group use statements."> - <![CDATA[ -use Some\NS\ { - ClassName, - AnotherClass, -}; -use function Some\NS\ { - SubLevel\functionName, - SubLevel\AnotherFunction, -}; -use const Some\NS\ { - Constants\MY_CONSTANT as SOME_CONSTANT, -}; - ]]> - </code> - <code title="Invalid: Mixed group use statement."> - <![CDATA[ -use Some\NS\ { - ClassName, - function SubLevel\functionName, - const MY_CONSTANT as SOME_CONSTANT, - function SubLevel\AnotherName, - AnotherLevel, -}; - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/UseStatements/DisallowUseClassStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/UseStatements/DisallowUseClassStandard.xml deleted file mode 100644 index 1699d9d..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/UseStatements/DisallowUseClassStandard.xml +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Disallow Use Class/Trait/Interface" - > - <standard> - <![CDATA[ - Disallow the use of `use` import statements for classes, traits and interfaces, with or without alias. - ]]> - </standard> - <code_comparison> - <code title="Valid: Other type of use import statements."> - <![CDATA[ -use function Vendor\Sub\functionName; -use const Vendor\Sub\CONST; - ]]> - </code> - <code title="Invalid: Class/trait/interface use import statement."> - <![CDATA[ -use Vendor\Sub\ClassName; -use Vendor\Sub\InterfaceName as Other; - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/UseStatements/DisallowUseConstStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/UseStatements/DisallowUseConstStandard.xml deleted file mode 100644 index b434095..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/UseStatements/DisallowUseConstStandard.xml +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Disallow Use Const" - > - <standard> - <![CDATA[ - Disallow the use of `use const` import statements, with or without alias. - ]]> - </standard> - <code_comparison> - <code title="Valid: Other type of use import statements."> - <![CDATA[ -use Vendor\Sub\ClassName; -use function Vendor\Sub\functionName; - ]]> - </code> - <code title="Invalid: `use const` import statements."> - <![CDATA[ -use const Vendor\Sub\CONST; -use const Vendor\Sub\BAR as otherConst; - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/UseStatements/DisallowUseFunctionStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/UseStatements/DisallowUseFunctionStandard.xml deleted file mode 100644 index c6ac6b4..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/UseStatements/DisallowUseFunctionStandard.xml +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Disallow Use Function" - > - <standard> - <![CDATA[ - Disallow the use of `use function` import statements, with or without alias. - ]]> - </standard> - <code_comparison> - <code title="Valid: Other type of use import statements."> - <![CDATA[ -use Vendor\Sub\ClassName; -use const Vendor\Sub\CONST; - ]]> - </code> - <code title="Invalid: `use function` import statements."> - <![CDATA[ -use function Vendor\Sub\functionName; -use function Vendor\Sub\functionName as other; - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/UseStatements/KeywordSpacingStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/UseStatements/KeywordSpacingStandard.xml deleted file mode 100644 index 55d430e..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/UseStatements/KeywordSpacingStandard.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Import Use Keyword Spacing" - > - <standard> - <![CDATA[ - Enforce a single space after the `use`, `function`, `const` keywords and both before and after the `as` keyword in import `use` statements. - ]]> - </standard> - <code_comparison> - <code title="Valid: Single space used around keywords."> - <![CDATA[ -use<em> </em>function<em> </em>strpos; -use<em> </em>const<em> </em>PHP_EOL<em> </em>as<em> </em>MY_EOL; - ]]> - </code> - <code title="Invalid: Incorrect spacing used around keywords."> - <![CDATA[ -use<em> </em>function<em> </em>strpos; -use<em> - </em>const<em> - </em>PHP_EOL<em> - </em>as<em> - </em>MY_EOL; - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/UseStatements/LowercaseFunctionConstStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/UseStatements/LowercaseFunctionConstStandard.xml deleted file mode 100644 index 66acd83..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/UseStatements/LowercaseFunctionConstStandard.xml +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Lowercase Function Const" - > - <standard> - <![CDATA[ - `function` and `const` keywords in import `use` statements should be in lowercase. - ]]> - </standard> - <code_comparison> - <code title="Valid: Lowercase keywords."> - <![CDATA[ -use <em>function</em> strpos; -use <em>const</em> PHP_EOL; - ]]> - </code> - <code title="Invalid: Non-lowercase keywords."> - <![CDATA[ -use <em>Function</em> strpos; -use <em>CONST</em> PHP_EOL; - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/UseStatements/NoLeadingBackslashStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/UseStatements/NoLeadingBackslashStandard.xml deleted file mode 100644 index ff0b786..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/UseStatements/NoLeadingBackslashStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="No Leading Backslash" - > - <standard> - <![CDATA[ - Import `use` statements must never begin with a leading backslash as they should always be fully qualified. - ]]> - </standard> - <code_comparison> - <code title="Valid: Import use statement without leading backslash."> - <![CDATA[ -<em>use Package</em>\ClassName; - ]]> - </code> - <code title="Invalid: Import use statement with leading backslash."> - <![CDATA[ -use <em>\</em>Package\ClassName; - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/UseStatements/NoUselessAliasesStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/UseStatements/NoUselessAliasesStandard.xml deleted file mode 100644 index 39bb90d..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/UseStatements/NoUselessAliasesStandard.xml +++ /dev/null @@ -1,30 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="No Useless Aliases" - > - <standard> - <![CDATA[ - Detects useless aliases for import use statements. - - Aliasing something to the same name as the original construct is considered useless. - Note: as OO and function names in PHP are case-insensitive, aliasing to the same name, using a different case is also considered useless. - ]]> - </standard> - <code_comparison> - <code title="Valid: Import use statement with an alias to a different name."> - <![CDATA[ -use Vendor\Package\ClassName as AnotherName; -use function functionName as my_function; -use const SOME_CONSTANT as MY_CONSTANT; - ]]> - </code> - <code title="Invalid: Import use statement with an alias to the same name."> - <![CDATA[ -use Vendor\Package\ClassName as ClassName; -use function functionName as FunctionName; -use const SOME_CONSTANT as SOME_CONSTANT; - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/WhiteSpace/AnonClassKeywordSpacingStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/WhiteSpace/AnonClassKeywordSpacingStandard.xml deleted file mode 100644 index 1770f74..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/WhiteSpace/AnonClassKeywordSpacingStandard.xml +++ /dev/null @@ -1,31 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Anonymous Class Keyword Spacing" - > - <standard> - <![CDATA[ - Checks the spacing between the "class" keyword and the open parenthesis for anonymous classes with parentheses. - - The desired amount of spacing is configurable and defaults to no space. - ]]> - </standard> - <code_comparison> - <code title="Valid: No space between the class keyword and the open parenthesis."> - <![CDATA[ -$foo = new <em>class(</em>$param) -{ - public function __construct($p) {} -}; - ]]> - </code> - <code title="Invalid: Space between the class keyword and the open parenthesis."> - <![CDATA[ -$foo = new <em>class (</em>$param) -{ - public function __construct($p) {} -}; - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/WhiteSpace/CommaSpacingStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/WhiteSpace/CommaSpacingStandard.xml deleted file mode 100644 index 503ae6f..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/WhiteSpace/CommaSpacingStandard.xml +++ /dev/null @@ -1,94 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Comma Spacing" - > - <standard> - <![CDATA[ - There should be no space before a comma and exactly one space, or a new line, after a comma. - - The sniff makes the following exceptions to this rule: - 1. A comma preceded or followed by a parenthesis, curly or square bracket. - These will not be flagged to prevent conflicts with sniffs handling spacing around braces. - 2. A comma preceded or followed by another comma, like for skipping items in a list assignment. - These will not be flagged. - 3. A comma preceded by a non-indented heredoc/nowdoc closer. - In that case, unless the `php_version` config directive is set to a version higher than PHP 7.3.0, - a new line before will be enforced to prevent parse errors on PHP < 7.3. - ]]> - </standard> - <code_comparison> - <code title="Valid: Correct spacing."> - <![CDATA[ -isset($param1<em>, </em>$param2<em>, </em>$param3); - -function_call( - $param1<em>,</em> - $param2<em>,</em> - $param3 -); - -$array = array($item1<em>, </em>$item2<em>, </em>$item3); -$array = [ - $item1<em>,</em> - $item2<em>,</em> -]; - -list(, $a<em>, </em>$b<em>,</em>,) = $array; -list( - , - $a<em>,</em> - $b<em>,</em> -) = $array; - ]]> - </code> - <code title="Invalid: Incorrect spacing."> - <![CDATA[ -unset($param1<em> , </em>$param2<em>,</em>$param3); - -function_call( - $a - <em>,</em>$b - <em>,</em>$c -); - -$array = array($item1<em>,</em>$item2<em> , </em>$item3); -$array = [ - $item1, - $item2<em> ,</em> -]; - -list( ,$a, $b<em> ,</em>,) = $array; -list( - , - $a, - $b<em> ,</em> -) = $array; - ]]> - </code> - </code_comparison> - <standard> - <![CDATA[ - A comma should follow the code and not be placed after a trailing comment. - ]]> - </standard> - <code_comparison> - <code title="Valid: Comma after the code."> - <![CDATA[ -function_call( - $param1<em>,</em> // Comment. - $param2<em>,</em> /* Comment. */ -); - ]]> - </code> - <code title="Invalid: Comma after a trailing comment."> - <![CDATA[ -function_call( - $param1 // Comment. - <em>,</em> - $param2 /* Comment. */<em>,</em> -); - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/WhiteSpace/DisallowInlineTabsStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/WhiteSpace/DisallowInlineTabsStandard.xml deleted file mode 100644 index b259ab4..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/WhiteSpace/DisallowInlineTabsStandard.xml +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Disallow Inline Tabs" - > - <standard> - <![CDATA[ - Spaces must be used for mid-line alignment. - ]]> - </standard> - <code_comparison> - <code title="Valid: Spaces used for alignment."> - <![CDATA[ -$title<em>[space]</em>= 'text'; -$text<em>[space][space]</em>= 'more text'; - ]]> - </code> - <code title="Invalid: Tabs used for alignment."> - <![CDATA[ -$title<em>[tab]</em>= 'text'; -$text<em>[tab]</em>= 'more text'; - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/WhiteSpace/FirstClassCallableSpacingStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/WhiteSpace/FirstClassCallableSpacingStandard.xml deleted file mode 100644 index e7714b1..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/WhiteSpace/FirstClassCallableSpacingStandard.xml +++ /dev/null @@ -1,33 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="First Class Callable Spacing" - > - <standard> - <![CDATA[ - There should be no space around the ellipsis when used in a first class callable. - ]]> - </standard> - <code_comparison> - <code title="Valid: No space around the ellipsis in a first class callable."> - <![CDATA[ -$callback = foo(<em>...</em>); -array_map( - $this->method(<em>...</em>), - $array -); - ]]> - </code> - <code title="Invalid: Space found around the ellipsis in a first class callable."> - <![CDATA[ -$callback = foo(<em> </em>...<em> </em>); -array_map( - $this->method(<em> - </em>...<em> - </em>), - $array -); - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Docs/WhiteSpace/PrecisionAlignmentStandard.xml b/vendor/phpcsstandards/phpcsextra/Universal/Docs/WhiteSpace/PrecisionAlignmentStandard.xml deleted file mode 100644 index 96dbd9c..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Docs/WhiteSpace/PrecisionAlignmentStandard.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://phpcsstandards.github.io/PHPCSDevTools/phpcsdocs.xsd" - title="Precision Alignment" - > - <standard> - <![CDATA[ - Detects when the indentation is not a multiple of a tab-width, i.e. when precision alignment is used. - ]]> - </standard> - <code_comparison> - <code title="Valid: Indentation equals (a multiple of) the tab width."> - <![CDATA[ -// Code samples presume tab width = 4. -<em>[space][space][space][space]</em>$foo = 'bar'; - -<em>[tab]</em>$foo = 'bar'; - ]]> - </code> - <code title="Invalid: Precision alignment used, indentation does not equal (a multiple of) the tab width."> - <![CDATA[ -// Code samples presume tab width = 4. -<em>[space][space]</em>$foo = 'bar'; - -<em>[tab][space]</em>$foo = 'bar'; - ]]> - </code> - </code_comparison> -</documentation> diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Helpers/DummyTokenizer.php b/vendor/phpcsstandards/phpcsextra/Universal/Helpers/DummyTokenizer.php deleted file mode 100644 index b131ee2..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Helpers/DummyTokenizer.php +++ /dev/null @@ -1,60 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Helpers; - -use PHP_CodeSniffer\Tokenizers\Tokenizer; - -/** - * Dummy tokenizer class to allow for accessing the replaceTabsInToken() method. - * - * @codeCoverageIgnore - * - * @since 1.0.0 - */ -final class DummyTokenizer extends Tokenizer -{ - - /** - * Initialise and (don't) run the tokenizer. - * - * @param string $content The content to tokenize, - * @param \PHP_CodeSniffer\Config | null $config The config data for the run. - * @param string $eolChar The EOL char used in the content. - * - * @return void - */ - public function __construct($content, $config, $eolChar = '\n') - { - $this->eolChar = $eolChar; - $this->config = $config; - } - - /** - * Creates an array of tokens when given some content. - * - * @param string $code The code to tokenize. - * - * @return array<int, array<string, mixed>> - */ - protected function tokenize($code) - { - return []; - } - - /** - * Performs additional processing after main tokenizing. - * - * @return void - */ - protected function processAdditional() - { - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Arrays/DisallowShortArraySyntaxSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Arrays/DisallowShortArraySyntaxSniff.php deleted file mode 100644 index 829daaa..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Arrays/DisallowShortArraySyntaxSniff.php +++ /dev/null @@ -1,89 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\Arrays; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHPCSUtils\Tokens\Collections; -use PHPCSUtils\Utils\Arrays; - -/** - * Disallow the use of the short array syntax. - * - * Improved version of the upstream `Generic.Arrays.DisallowShortArraySyntax` sniff which does - * not account for short lists and because of this can cause parse errors when auto-fixing. - * - * Other related sniffs: - * - `Generic.Arrays.DisallowLongArraySyntax` Forbids the use of the long array syntax. - * - * @since 1.0.0 This sniff is loosely based on and inspired by the upstream - * `Generic.Arrays.DisallowShortArraySyntax` sniff. - */ -final class DisallowShortArraySyntaxSniff implements Sniff -{ - - /** - * The phrase to use for the metric recorded by this sniff. - * - * @var string - */ - const METRIC_NAME = 'Short array syntax used'; - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - return Collections::arrayOpenTokensBC(); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['code'] === \T_ARRAY) { - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'no'); - return; - } - - if (Arrays::isShortArray($phpcsFile, $stackPtr) === false) { - // Square brackets, but not a short array. Probably short list or real square brackets. - return; - } - - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'yes'); - - $error = 'Short array syntax is not allowed'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Found'); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($tokens[$stackPtr]['bracket_opener'], 'array('); - $phpcsFile->fixer->replaceToken($tokens[$stackPtr]['bracket_closer'], ')'); - $phpcsFile->fixer->endChangeset(); - } - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Arrays/DuplicateArrayKeySniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Arrays/DuplicateArrayKeySniff.php deleted file mode 100644 index 1fe6841..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Arrays/DuplicateArrayKeySniff.php +++ /dev/null @@ -1,294 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\Arrays; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\AbstractSniffs\AbstractArrayDeclarationSniff; -use PHPCSUtils\BackCompat\Helper; - -/** - * Detect duplicate array keys in array declarations. - * - * This sniff will detect duplicate keys with high precision, though any array key - * set via a variable/constant/function call is excluded from the examination. - * - * The sniff will handle the change in how numeric array keys are set - * since PHP 8.0 and will flag keys which would be duplicates cross-version. - * {@link https://wiki.php.net/rfc/negative_array_index} - * - * @since 1.0.0 - */ -final class DuplicateArrayKeySniff extends AbstractArrayDeclarationSniff -{ - - /** - * Keep track of which array keys have been seen already on PHP < 8.0. - * - * @since 1.0.0 - * - * @var array<int, array<string, int>> - */ - private $keysSeenLt8 = []; - - /** - * Keep track of which array keys have been seen already on PHP >= 8.0. - * - * @since 1.0.0 - * - * @var array<int, array<string, int>> - */ - private $keysSeenGt8 = []; - - /** - * Keep track of the maximum seen integer key to know what the next value will be for - * array items without a key on PHP < 8.0. - * - * @since 1.0.0 - * - * @var int - */ - private $currentMaxIntKeyLt8; - - /** - * Keep track of the maximum seen integer key to know what the next value will be for - * array items without a key on PHP >= 8.0. - * - * @since 1.0.0 - * - * @var int - */ - private $currentMaxIntKeyGt8; - - /** - * PHP version as configured or -1 if unknown. - * - * @since 1.0.0 - * - * @var int - */ - private $phpVersion; - - /** - * Process every part of the array declaration. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where the - * token was found. - * - * @return void - */ - public function processArray(File $phpcsFile) - { - // Reset properties before processing this array. - $this->keysSeenLt8 = []; - $this->keysSeenGt8 = []; - - if (isset($this->phpVersion) === false) { - // Set default value to prevent this code from running every time the sniff is triggered. - $this->phpVersion = -1; - - $phpVersion = Helper::getConfigData('php_version'); - if ($phpVersion !== null) { - $this->phpVersion = (int) $phpVersion; - } - } - - unset($this->currentMaxIntKeyLt8, $this->currentMaxIntKeyGt8); - - parent::processArray($phpcsFile); - } - - /** - * Process the tokens in an array key. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where the - * token was found. - * @param int $startPtr The stack pointer to the first token in the "key" part of - * an array item. - * @param int $endPtr The stack pointer to the last token in the "key" part of - * an array item. - * @param int $itemNr Which item in the array is being handled. - * - * @return void - */ - public function processKey(File $phpcsFile, $startPtr, $endPtr, $itemNr) - { - $key = $this->getActualArrayKey($phpcsFile, $startPtr, $endPtr); - - if (isset($key) === false) { - // Key could not be determined. - return; - } - - $integerKey = \is_int($key); - - $errorMsg = 'Duplicate array key found. The value will be overwritten%s.' - . ' The %s array key "%s" was first seen on line %d'; - $errorCode = 'Found'; - $errors = []; - $baseData = [ - ($integerKey === true) ? 'integer' : 'string', - $key, - ]; - - /* - * Check if we've seen the key before. - */ - if (($this->phpVersion === -1 || $this->phpVersion < 80000) - && isset($this->keysSeenLt8[$key]) === true - ) { - $errors['phplt8'] = [ - 'data_subset' => $baseData, - 'error_suffix' => '', - 'code_suffix' => '', - ]; - - if ($integerKey === true) { - $errors['phplt8']['error_suffix'] = ' when using PHP < 8.0'; - $errors['phplt8']['code_suffix'] = 'ForPHPlt80'; - } - - $firstSeen = $this->keysSeenLt8[$key]; - $firstNonEmptyFirstSeen = $phpcsFile->findNext(Tokens::$emptyTokens, $firstSeen['ptr'], null, true); - - $errors['phplt8']['data_subset'][] = $this->tokens[$firstNonEmptyFirstSeen]['line']; - } - - if (($this->phpVersion === -1 || $this->phpVersion >= 80000) - && isset($this->keysSeenGt8[$key]) === true - ) { - $errors['phpgt8'] = [ - 'data_subset' => $baseData, - 'error_suffix' => '', - 'code_suffix' => '', - ]; - - if ($integerKey === true) { - $errors['phpgt8']['error_suffix'] = ' when using PHP >= 8.0'; - $errors['phpgt8']['code_suffix'] = 'ForPHPgte80'; - } - - $firstSeen = $this->keysSeenGt8[$key]; - $firstNonEmptyFirstSeen = $phpcsFile->findNext(Tokens::$emptyTokens, $firstSeen['ptr'], null, true); - - $errors['phpgt8']['data_subset'][] = $this->tokens[$firstNonEmptyFirstSeen]['line']; - } - - /* - * Throw the error(s). - * - * If no PHP version was passed, throw errors both for PHP < 8.0 and PHP >= 8.0. - * If a PHP version was set, only throw the error appropriate for the selected PHP version. - * If both errors would effectively be the same, only throw one. - */ - if ($errors !== []) { - $firstNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, $startPtr, null, true); - - if (isset($errors['phplt8'], $errors['phpgt8']) - && $errors['phplt8']['data_subset'] === $errors['phpgt8']['data_subset'] - ) { - // Only throw the error once if it would be the same for PHP < 8.0 and PHP >= 8.0. - $data = $errors['phplt8']['data_subset']; - \array_unshift($data, ''); - - $phpcsFile->addError($errorMsg, $firstNonEmpty, $errorCode, $data); - return; - } - - if (isset($errors['phplt8'])) { - $code = $errorCode . $errors['phplt8']['code_suffix']; - $data = $errors['phplt8']['data_subset']; - \array_unshift($data, $errors['phplt8']['error_suffix']); - - $phpcsFile->addError($errorMsg, $firstNonEmpty, $code, $data); - } - - if (isset($errors['phpgt8'])) { - $code = $errorCode . $errors['phpgt8']['code_suffix']; - $data = $errors['phpgt8']['data_subset']; - \array_unshift($data, $errors['phpgt8']['error_suffix']); - - $phpcsFile->addError($errorMsg, $firstNonEmpty, $code, $data); - } - - return; - } - - /* - * Key not seen before. Add to arrays. - */ - $this->keysSeenLt8[$key] = [ - 'item' => $itemNr, - 'ptr' => $startPtr, - ]; - $this->keysSeenGt8[$key] = [ - 'item' => $itemNr, - 'ptr' => $startPtr, - ]; - - if ($integerKey === true) { - if ((isset($this->currentMaxIntKeyLt8) === false && $key > -1) - || (isset($this->currentMaxIntKeyLt8) === true && $key > $this->currentMaxIntKeyLt8) - ) { - $this->currentMaxIntKeyLt8 = $key; - } - - if (isset($this->currentMaxIntKeyGt8) === false - || $key > $this->currentMaxIntKeyGt8 - ) { - $this->currentMaxIntKeyGt8 = $key; - } - } - } - - /** - * Process an array item without an array key. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where the - * token was found. - * @param int $startPtr The stack pointer to the first token in the array item, - * which in this case will be the first token of the array - * value part of the array item. - * @param int $itemNr Which item in the array is being handled. - * - * @return void - */ - public function processNoKey(File $phpcsFile, $startPtr, $itemNr) - { - // Track the key for PHP < 8.0. - if (isset($this->currentMaxIntKeyLt8) === false) { - $this->currentMaxIntKeyLt8 = -1; - } - - ++$this->currentMaxIntKeyLt8; - $this->keysSeenLt8[$this->currentMaxIntKeyLt8] = [ - 'item' => $itemNr, - 'ptr' => $startPtr, - ]; - - // Track the key for PHP 8.0+. - if (isset($this->currentMaxIntKeyGt8) === false) { - $this->currentMaxIntKeyGt8 = -1; - } - - ++$this->currentMaxIntKeyGt8; - $this->keysSeenGt8[$this->currentMaxIntKeyGt8] = [ - 'item' => $itemNr, - 'ptr' => $startPtr, - ]; - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Arrays/MixedArrayKeyTypesSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Arrays/MixedArrayKeyTypesSniff.php deleted file mode 100644 index 49d9260..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Arrays/MixedArrayKeyTypesSniff.php +++ /dev/null @@ -1,174 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\Arrays; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\AbstractSniffs\AbstractArrayDeclarationSniff; - -/** - * Forbid arrays which contain both array items with numeric keys as well as array items with string keys. - * - * @since 1.0.0 - */ -final class MixedArrayKeyTypesSniff extends AbstractArrayDeclarationSniff -{ - - /** - * Whether a string key was encountered. - * - * @var bool - */ - private $seenStringKey = false; - - /** - * Whether a numeric key was encountered. - * - * @var bool - */ - private $seenNumericKey = false; - - /** - * Process the array declaration. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where the - * token was found. - * - * @return void - */ - public function processArray(File $phpcsFile) - { - // Reset properties before processing this array. - $this->seenStringKey = false; - $this->seenNumericKey = false; - - parent::processArray($phpcsFile); - } - - /** - * Process the tokens in an array key. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where the - * token was found. - * @param int $startPtr The stack pointer to the first token in the "key" part of - * an array item. - * @param int $endPtr The stack pointer to the last token in the "key" part of - * an array item. - * @param int $itemNr Which item in the array is being handled. - * - * @return true|void Returning `TRUE` will short-circuit the array item loop and stop processing. - * In effect, this means that the sniff will not examine the double arrow, the array - * value or comma for this array item and will not process any array items after this one. - */ - public function processKey(File $phpcsFile, $startPtr, $endPtr, $itemNr) - { - $key = $this->getActualArrayKey($phpcsFile, $startPtr, $endPtr); - if (isset($key) === false) { - // Key could not be determined. - return; - } - - $integerKey = \is_int($key); - - // Handle integer key. - if ($integerKey === true) { - if ($this->seenStringKey === false) { - if ($this->seenNumericKey !== false) { - // Already seen a numeric key before. - return; - } - - $this->seenNumericKey = true; - return; - } - - // Ok, so we've seen a string key before and now see an explicit numeric key. - $firstNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, $startPtr, null, true); - $phpcsFile->addError( - 'Arrays should have either numeric keys or string keys. Explicit numeric key detected,' - . ' while all previous keys in this array were string keys.', - $firstNonEmpty, - 'ExplicitNumericKey' - ); - - // Stop the loop. - return true; - } - - // Handle string key. - if ($this->seenNumericKey === false) { - if ($this->seenStringKey !== false) { - // Already seen a string key before. - return; - } - - $this->seenStringKey = true; - return; - } - - // Ok, so we've seen a numeric key before and now see a string key. - $firstNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, $startPtr, null, true); - $phpcsFile->addError( - 'Arrays should have either numeric keys or string keys. String key detected,' - . ' while all previous keys in this array were integer based keys.', - $firstNonEmpty, - 'StringKey' - ); - - // Stop the loop. - return true; - } - - /** - * Process an array item without an array key. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where the - * token was found. - * @param int $startPtr The stack pointer to the first token in the array item, - * which in this case will be the first token of the array - * value part of the array item. - * @param int $itemNr Which item in the array is being handled. - * - * @return true|void Returning `TRUE` will short-circuit the array item loop and stop processing. - * In effect, this means that the sniff will not examine the array value or - * comma for this array item and will not process any array items after this one. - */ - public function processNoKey(File $phpcsFile, $startPtr, $itemNr) - { - if ($this->seenStringKey === false) { - if ($this->seenNumericKey !== false) { - // Already seen a numeric key before. - return; - } - - $this->seenNumericKey = true; - return; - } - - // Ok, so we've seen a string key before and now see an implicit numeric key. - $firstNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, $startPtr, null, true); - $phpcsFile->addError( - 'Arrays should have either numeric keys or string keys. Implicit numeric key detected,' - . ' while all previous keys in this array were string keys.', - $firstNonEmpty, - 'ImplicitNumericKey' - ); - - // Stop the loop. - return true; - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Arrays/MixedKeyedUnkeyedArraySniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Arrays/MixedKeyedUnkeyedArraySniff.php deleted file mode 100644 index c47f217..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Arrays/MixedKeyedUnkeyedArraySniff.php +++ /dev/null @@ -1,134 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\Arrays; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\AbstractSniffs\AbstractArrayDeclarationSniff; - -/** - * Forbid arrays which contain both array items with an explicit key and array items without a key set. - * - * @since 1.0.0 - */ -final class MixedKeyedUnkeyedArraySniff extends AbstractArrayDeclarationSniff -{ - - /** - * Whether or not any array items with a key were encountered in the array. - * - * @since 1.0.0 - * - * @var bool - */ - private $hasKeys = false; - - /** - * Cache of any array items encountered without keys up to the time an array item _with_ a key is encountered. - * - * @since 1.0.0 - * - * @var array<int, int> Key is the item number; value the stack point to the first non empty token in the item. - */ - private $itemsWithoutKey = []; - - /** - * Process the array declaration. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where the - * token was found. - * - * @return void - */ - public function processArray(File $phpcsFile) - { - // Reset properties before processing this array. - $this->hasKeys = false; - $this->itemsWithoutKey = []; - - parent::processArray($phpcsFile); - } - - /** - * Process the tokens in an array key. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where the - * token was found. - * @param int $startPtr The stack pointer to the first token in the "key" part of - * an array item. - * @param int $endPtr The stack pointer to the last token in the "key" part of - * an array item. - * @param int $itemNr Which item in the array is being handled. - * - * @return void - */ - public function processKey(File $phpcsFile, $startPtr, $endPtr, $itemNr) - { - $this->hasKeys = true; - - // Process any previously encountered items without keys. - if (empty($this->itemsWithoutKey) === false) { - foreach ($this->itemsWithoutKey as $itemNr => $stackPtr) { - $phpcsFile->addError( - 'Inconsistent array detected. A mix of keyed and unkeyed array items is not allowed.' - . ' The array item in position %d does not have an array key.', - $stackPtr, - 'Found', - [$itemNr] - ); - } - - // No need to do this again. - $this->itemsWithoutKey = []; - } - } - - /** - * Process an array item without an array key. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where the - * token was found. - * @param int $startPtr The stack pointer to the first token in the array item, - * which in this case will be the first token of the array - * value part of the array item. - * @param int $itemNr Which item in the array is being handled. - * - * @return void - */ - public function processNoKey(File $phpcsFile, $startPtr, $itemNr) - { - $firstNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, $startPtr, null, true); - if ($firstNonEmpty === false || $this->tokens[$firstNonEmpty]['code'] === \T_COMMA) { - // Shouldn't really be possible, but this must be a parse error (empty array item). - return; - } - - // If we already know there are keys in the array, throw an error message straight away. - if ($this->hasKeys === true) { - $phpcsFile->addError( - 'Inconsistent array detected. A mix of keyed and unkeyed array items is not allowed.' - . ' The array item in position %d does not have an array key.', - $firstNonEmpty, - 'Found', - [$itemNr] - ); - } else { - // Save the array item info for later in case we do encounter an array key later on in the array. - $this->itemsWithoutKey[$itemNr] = $firstNonEmpty; - } - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Attributes/BracketSpacingSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Attributes/BracketSpacingSniff.php deleted file mode 100644 index fb7e737..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Attributes/BracketSpacingSniff.php +++ /dev/null @@ -1,216 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\Attributes; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHPCSUtils\Fixers\SpacesFixer; - -/** - * Requires a configurable number of spaces on the inside of attribute block brackets. - * - * When newlines are allowed, will also safeguard against blank lines at the start/end of the attribute block. - * - * @since 1.5.0 - */ -final class BracketSpacingSniff implements Sniff -{ - - /** - * Name of the metric. - * - * @since 1.5.0 - * - * @var string - */ - const METRIC_NAME = 'Spaces on the inside of attribute brackets'; - - /** - * The amount of spacing to demand on the inside of attribute brackets. - * - * @since 1.5.0 - * - * @var int - */ - public $spacing = 0; - - /** - * Allow newlines instead of spaces. - * - * @since 1.5.0 - * - * @var bool - */ - public $ignoreNewlines = false; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.5.0 - * - * @return array<int|string> - */ - public function register() - { - return [\T_ATTRIBUTE]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.5.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['attribute_closer']) === false) { - // Live coding/parse error. Ignore. - return; - } - - if ($tokens[$stackPtr]['attribute_closer'] === ($stackPtr + 1)) { - // Empty attribute block. Ignore. - return; - } - - $this->spacing = (int) $this->spacing; - - $this->processOpener($phpcsFile, $stackPtr); - $this->processCloser($phpcsFile, $tokens[$stackPtr]['attribute_closer']); - } - - /** - * Processes the attribute block opener bracket. - * - * @since 1.5.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the attribute block opener - * in the stack passed in $tokens. - * - * @return void - */ - public function processOpener(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $nextNonWhitespace = $phpcsFile->findNext(\T_WHITESPACE, ($stackPtr + 1), null, true); - if ($this->ignoreNewlines === true - && $tokens[$stackPtr]['line'] !== $tokens[$nextNonWhitespace]['line'] - ) { - if (($tokens[$stackPtr]['line'] + 1) === $tokens[$nextNonWhitespace]['line']) { - // Single new line. - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'a new line'); - return; - } - - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'multiple new lines'); - - $error = 'Blank line(s) found at the start of an attribute block'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'BlankLineAtStart'); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->addNewline($stackPtr); - - // Remove all blank lines, but don't remove the indentation of the line containing the next bit of code. - for ($i = ($stackPtr + 1); $i < $nextNonWhitespace; $i++) { - if ($tokens[$i]['line'] === $tokens[$nextNonWhitespace]['line']) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - $phpcsFile->fixer->endChangeset(); - } - return; - } - - SpacesFixer::checkAndFix( - $phpcsFile, - $stackPtr, - $nextNonWhitespace, - $this->spacing, - 'Expected %s after the attribute block opener. Found: %s.', - 'SpaceAfterOpener', - 'error', - 0, - self::METRIC_NAME - ); - } - - /** - * Processes the attribute block closer bracket. - * - * @since 1.5.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the attribute block closer - * in the stack passed in $tokens. - * - * @return void - */ - public function processCloser(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $previousNonWhitespace = $phpcsFile->findPrevious(\T_WHITESPACE, ($stackPtr - 1), null, true); - if ($this->ignoreNewlines === true - && $tokens[$stackPtr]['line'] !== $tokens[$previousNonWhitespace]['line'] - ) { - if (($tokens[$stackPtr]['line'] - 1) === $tokens[$previousNonWhitespace]['line']) { - // Single new line. - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'a new line'); - return; - } - - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'multiple new lines'); - - $error = 'Blank line(s) found at the end of an attribute block'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'BlankLineAtEnd'); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->addNewline($previousNonWhitespace); - - // Remove all blank lines, but don't remove the indentation of the line containing the next bit of code. - for ($i = ($previousNonWhitespace + 1); $i < $stackPtr; $i++) { - if ($tokens[$i]['line'] === $tokens[$stackPtr]['line']) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - $phpcsFile->fixer->endChangeset(); - } - return; - } - - SpacesFixer::checkAndFix( - $phpcsFile, - $previousNonWhitespace, - $stackPtr, - $this->spacing, - 'Expected %s before the attribute block closer. Found: %s.', - 'SpaceBeforeCloser', - 'error', - 0, - self::METRIC_NAME - ); - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Attributes/DisallowAttributeParenthesesSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Attributes/DisallowAttributeParenthesesSniff.php deleted file mode 100644 index d9e4f73..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Attributes/DisallowAttributeParenthesesSniff.php +++ /dev/null @@ -1,121 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\Attributes; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Utils\AttributeBlock; - -/** - * Forbid for an attribute instantiation to have parentheses, except when - * parameters are being passed. - * - * @since 1.5.0 - */ -final class DisallowAttributeParenthesesSniff implements Sniff -{ - - /** - * Name of the metric. - * - * @since 1.5.0 - * - * @var string - */ - const METRIC_NAME = 'Attribute instantiation with parentheses'; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.5.0 - * - * @return array<int|string> - */ - public function register() - { - return [\T_ATTRIBUTE]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.5.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $instantiations = AttributeBlock::getAttributes($phpcsFile, $stackPtr); - if (empty($instantiations)) { - return; - } - - $tokens = $phpcsFile->getTokens(); - - foreach ($instantiations as $attribute) { - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($attribute['name_token'] + 1), null, true); - - // Note: no need to check for `false` as there will always be something after, if only the attribute closer. - if ($tokens[$nextNonEmpty]['code'] !== \T_OPEN_PARENTHESIS) { - // No parentheses found. - $phpcsFile->recordMetric($attribute['name_token'], self::METRIC_NAME, 'no'); - continue; - } - - if (isset($tokens[$nextNonEmpty]['parenthesis_closer']) === false) { - /* - * Incomplete set of parentheses. Ignore. - * Shouldn't be possible as PHPCS won't have matched the attribute opener with the closer in that case. - */ - // @codeCoverageIgnoreStart - $phpcsFile->recordMetric($attribute['name_token'], self::METRIC_NAME, 'yes'); - continue; - // @codeCoverageIgnoreEnd - } - - $opener = $nextNonEmpty; - $closer = $tokens[$opener]['parenthesis_closer']; - $hasParams = $phpcsFile->findNext(Tokens::$emptyTokens, ($opener + 1), $closer, true); - if ($hasParams !== false) { - // There is something between the parentheses. Ignore. - $phpcsFile->recordMetric($attribute['name_token'], self::METRIC_NAME, 'yes, with parameter(s)'); - continue; - } - - $phpcsFile->recordMetric($attribute['name_token'], self::METRIC_NAME, 'yes'); - - $fix = $phpcsFile->addFixableError( - 'Parentheses not allowed when instantiating an attribute class without passing parameters', - $opener, - 'Found' - ); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - for ($i = $opener; $i <= $closer; $i++) { - if (isset(Tokens::$commentTokens[$tokens[$i]['code']]) === true) { - continue; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Attributes/RequireAttributeParenthesesSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Attributes/RequireAttributeParenthesesSniff.php deleted file mode 100644 index 1ec335f..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Attributes/RequireAttributeParenthesesSniff.php +++ /dev/null @@ -1,90 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\Attributes; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Utils\AttributeBlock; - -/** - * Require that an attribute instantiation has parentheses, i.e. `#[MyAttribute()]`. - * - * @since 1.5.0 - */ -final class RequireAttributeParenthesesSniff implements Sniff -{ - - /** - * Name of the metric. - * - * @since 1.5.0 - * - * @var string - */ - const METRIC_NAME = 'Attribute instantiation with parentheses'; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.5.0 - * - * @return array<int|string> - */ - public function register() - { - return [\T_ATTRIBUTE]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.5.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $instantiations = AttributeBlock::getAttributes($phpcsFile, $stackPtr); - if (empty($instantiations)) { - return; - } - - $tokens = $phpcsFile->getTokens(); - - foreach ($instantiations as $attribute) { - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($attribute['name_token'] + 1), null, true); - - // Note: no need to check for `false` as there will always be something after, if only the attribute closer. - if ($tokens[$nextNonEmpty]['code'] === \T_OPEN_PARENTHESIS) { - // Parentheses found. - $phpcsFile->recordMetric($attribute['name_token'], self::METRIC_NAME, 'yes'); - continue; - } - - $phpcsFile->recordMetric($attribute['name_token'], self::METRIC_NAME, 'no'); - - $fix = $phpcsFile->addFixableError( - 'Parentheses required when instantiating an attribute class.', - $attribute['name_token'], - 'Missing' - ); - - if ($fix === true) { - $phpcsFile->fixer->addContent($attribute['name_token'], '()'); - } - } - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Attributes/TrailingCommaSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Attributes/TrailingCommaSniff.php deleted file mode 100644 index a39009c..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Attributes/TrailingCommaSniff.php +++ /dev/null @@ -1,144 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\Attributes; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Utils\AttributeBlock; - -/** - * Require a trailing comma for multi-line, multi-attribute attribute blocks and forbid trailing commas - * in single-line attribute blocks and multi-line attributes containing only a single attribute. - * - * @since 1.5.0 - */ -final class TrailingCommaSniff implements Sniff -{ - - /** - * Name of the metric for single-line attribute blocks. - * - * @since 1.5.0 - * - * @var string - */ - const METRIC_NAME_SINGLE_LINE = 'Trailing comma in single-line attribute block'; - - /** - * Name of the metric for multi-line attribute blocks. - * - * @since 1.5.0 - * - * @var string - */ - const METRIC_NAME_MULTI_LINE = 'Trailing comma in multi-line attribute block'; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.5.0 - * - * @return array<int|string> - */ - public function register() - { - return [\T_ATTRIBUTE]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.5.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['attribute_closer']) === false) { - // Live coding/parse error. Ignore. - return; - } - - $opener = $stackPtr; - $closer = $tokens[$stackPtr]['attribute_closer']; - - $beforeCloser = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($closer - 1), null, true); - if ($opener === $beforeCloser) { - // Empty attribute block. Ignore. - return; - } - - if ($tokens[$opener]['line'] === $tokens[$closer]['line']) { - // Single-line attribute block. - if ($tokens[$beforeCloser]['code'] === \T_COMMA) { - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME_SINGLE_LINE, 'yes'); - - $fix = $phpcsFile->addFixableError( - 'Trailing comma is not allowed in a single-line attribute block', - $beforeCloser, - 'ForbiddenSingleLine' - ); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($beforeCloser, ''); - } - } else { - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME_SINGLE_LINE, 'no'); - } - - return; - } - - // Multi-line attribute block, check whether it contains a single attribute or multiple. - $attributeCount = AttributeBlock::countAttributes($phpcsFile, $stackPtr); - if ($attributeCount > 1) { - // Multiple attributes in a multi-line attribute block, require trailing comma. - if ($tokens[$beforeCloser]['code'] !== \T_COMMA) { - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME_MULTI_LINE, 'No, multi-attribute'); - - $fix = $phpcsFile->addFixableError( - 'Trailing comma required after last attribute in a multi-line, multi-attribute attribute block', - $beforeCloser, - 'RequiredMultiAttributeMultiLine' - ); - if ($fix === true) { - $phpcsFile->fixer->addContent($beforeCloser, ','); - } - } else { - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME_MULTI_LINE, 'Yes, multi-attribute'); - } - - return; - } - - // Single attribute in a multi-line attribute block, forbid trailing comma. - if ($tokens[$beforeCloser]['code'] === \T_COMMA) { - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME_MULTI_LINE, 'Yes, single attribute'); - - $fix = $phpcsFile->addFixableError( - 'Trailing comma is not allowed when a multi-line attribute block only contains a single attribute', - $beforeCloser, - 'ForbiddenSingleAttributeMultiLine' - ); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($beforeCloser, ''); - } - } else { - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME_MULTI_LINE, 'No, single attribute'); - } - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Classes/DisallowAnonClassParenthesesSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Classes/DisallowAnonClassParenthesesSniff.php deleted file mode 100644 index dae0125..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Classes/DisallowAnonClassParenthesesSniff.php +++ /dev/null @@ -1,112 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\Classes; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -/** - * Forbid for an anonymous class declaration/instantiation to have parentheses, except when - * parameters are being passed. - * - * @since 1.0.0 - */ -final class DisallowAnonClassParenthesesSniff implements Sniff -{ - - /** - * Name of the metric. - * - * @since 1.0.0 - * - * @var string - */ - const METRIC_NAME = 'Anon class declaration with parenthesis'; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - return [\T_ANON_CLASS]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - - // Note: no need to check for `false` as PHPCS won't retokenize `class` to `T_ANON_CLASS` in that case. - if ($tokens[$nextNonEmpty]['code'] !== \T_OPEN_PARENTHESIS) { - // No parentheses found. - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'no'); - return; - } - - if (isset($tokens[$nextNonEmpty]['parenthesis_closer']) === false) { - /* - * Incomplete set of parentheses. Ignore. - * Shouldn't be possible as PHPCS won't retokenize `class` to `T_ANON_CLASS` in that case. - */ - // @codeCoverageIgnoreStart - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'yes'); - return; - // @codeCoverageIgnoreEnd - } - - $opener = $nextNonEmpty; - $closer = $tokens[$opener]['parenthesis_closer']; - $hasParams = $phpcsFile->findNext(Tokens::$emptyTokens, ($opener + 1), $closer, true); - if ($hasParams !== false) { - // There is something between the parentheses. Ignore. - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'yes, with parameter(s)'); - return; - } - - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'yes'); - - $fix = $phpcsFile->addFixableError( - 'Parenthesis not allowed when creating a new anonymous class without passing parameters', - $stackPtr, - 'Found' - ); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - for ($i = $opener; $i <= $closer; $i++) { - if (isset(Tokens::$commentTokens[$tokens[$i]['code']]) === true) { - continue; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Classes/DisallowFinalClassSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Classes/DisallowFinalClassSniff.php deleted file mode 100644 index 4e3f471..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Classes/DisallowFinalClassSniff.php +++ /dev/null @@ -1,116 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\Classes; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Utils\GetTokensAsString; -use PHPCSUtils\Utils\ObjectDeclarations; - -/** - * Forbids classes from being declared as "final". - * - * @since 1.0.0 - */ -final class DisallowFinalClassSniff implements Sniff -{ - - /** - * Name of the metric. - * - * @since 1.0.0 - * - * @var string - */ - const METRIC_NAME = 'Class is abstract or final ?'; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - return [\T_CLASS]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $classProp = ObjectDeclarations::getClassProperties($phpcsFile, $stackPtr); - if ($classProp['is_final'] === false) { - if ($classProp['is_abstract'] === true) { - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'abstract'); - return; - } - - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'not abstract, not final'); - return; - } - - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'final'); - - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($nextNonEmpty === false) { - // Live coding or parse error. - return; - } - - // No extra safeguards needed, we know the keyword will exist based on the check above. - $finalKeyword = $phpcsFile->findPrevious(\T_FINAL, ($stackPtr - 1)); - $snippetEnd = $nextNonEmpty; - $classCloser = ''; - - $tokens = $phpcsFile->getTokens(); - if (isset($tokens[$stackPtr]['scope_opener']) === true) { - $snippetEnd = $tokens[$stackPtr]['scope_opener']; - $classCloser = '}'; - } - - $snippet = GetTokensAsString::compact($phpcsFile, $finalKeyword, $snippetEnd, true); - $fix = $phpcsFile->addFixableError( - 'Declaring a class as final is not allowed. Found: %s%s', - $finalKeyword, - 'FinalClassFound', - [$snippet, $classCloser] - ); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($finalKeyword, ''); - - // Remove redundant whitespace. - for ($i = ($finalKeyword + 1); $i < $stackPtr; $i++) { - if ($tokens[$i]['code'] === \T_WHITESPACE) { - $phpcsFile->fixer->replaceToken($i, ''); - continue; - } - - break; - } - - $phpcsFile->fixer->endChangeset(); - } - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Classes/ModifierKeywordOrderSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Classes/ModifierKeywordOrderSniff.php deleted file mode 100644 index 88fdfe2..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Classes/ModifierKeywordOrderSniff.php +++ /dev/null @@ -1,188 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2022 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\Classes; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHPCSUtils\Utils\ObjectDeclarations; - -/** - * Standardize the modifier keyword order for class declarations. - * - * @since 1.0.0 - */ -final class ModifierKeywordOrderSniff implements Sniff -{ - - /** - * Name of the metric. - * - * @since 1.0.0 - * - * @var string - */ - const METRIC_NAME = 'Class modifier keyword order'; - - /** - * Order preference: abstract/final readonly. - * - * @since 1.0.0 - * - * @var string - */ - const EXTEND_READONLY = 'extendability readonly'; - - /** - * Order preference: readonly abstract/final. - * - * @since 1.0.0 - * - * @var string - */ - const READONLY_EXTEND = 'readonly extendability'; - - /** - * Preferred order for the modifier keywords. - * - * Accepted values: - * - "extendability readonly". - * - or "readonly extendability". - * - * Defaults to "extendability readonly". - * - * @since 1.0.0 - * - * @var string - */ - public $order = self::EXTEND_READONLY; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - return [\T_CLASS]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $classProp = ObjectDeclarations::getClassProperties($phpcsFile, $stackPtr); - - if ($classProp['readonly_token'] === false - || ($classProp['final_token'] === false && $classProp['abstract_token'] === false) - ) { - /* - * Either no modifier keywords found at all; or only one type of modifier - * keyword (abstract/final or readonly) declared, but not both. No ordering needed. - */ - return; - } - - if ($classProp['final_token'] !== false && $classProp['abstract_token'] !== false) { - // Parse error. Ignore. - return; - } - - $readonly = $classProp['readonly_token']; - - if ($classProp['final_token'] !== false) { - $extendability = $classProp['final_token']; - } else { - $extendability = $classProp['abstract_token']; - } - - if ($readonly < $extendability) { - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, self::READONLY_EXTEND); - } else { - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, self::EXTEND_READONLY); - } - - $message = 'Class modifier keywords are not in the correct order. Expected: "%s", found: "%s"'; - - switch ($this->order) { - case self::READONLY_EXTEND: - if ($readonly < $extendability) { - // Order is correct. Nothing to do. - return; - } - - $this->handleError($phpcsFile, $extendability, $readonly); - break; - - case self::EXTEND_READONLY: - default: - if ($extendability < $readonly) { - // Order is correct. Nothing to do. - return; - } - - $this->handleError($phpcsFile, $readonly, $extendability); - break; - } - } - - /** - * Throw the error and potentially fix it. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $firstKeyword The position of the first keyword found. - * @param int $secondKeyword The position of the second keyword token. - * - * @return void - */ - private function handleError(File $phpcsFile, $firstKeyword, $secondKeyword) - { - $tokens = $phpcsFile->getTokens(); - - $message = 'Class modifier keywords are not in the correct order. Expected: "%s", found: "%s"'; - $data = [ - $tokens[$secondKeyword]['content'] . ' ' . $tokens[$firstKeyword]['content'], - $tokens[$firstKeyword]['content'] . ' ' . $tokens[$secondKeyword]['content'], - ]; - - $fix = $phpcsFile->addFixableError($message, $firstKeyword, 'Incorrect', $data); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - $phpcsFile->fixer->replaceToken($secondKeyword, ''); - - // Prevent leaving behind trailing whitespace. - $i = ($secondKeyword + 1); - while ($tokens[$i]['code'] === \T_WHITESPACE) { - $phpcsFile->fixer->replaceToken($i, ''); - ++$i; - } - - // Use the original token content as the case used for keywords is not the concern of this sniff. - $phpcsFile->fixer->addContentBefore($firstKeyword, $tokens[$secondKeyword]['content'] . ' '); - - $phpcsFile->fixer->endChangeset(); - } - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Classes/RequireAnonClassParenthesesSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Classes/RequireAnonClassParenthesesSniff.php deleted file mode 100644 index 7ae25d0..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Classes/RequireAnonClassParenthesesSniff.php +++ /dev/null @@ -1,81 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\Classes; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -/** - * Require that an anonymous class declaration/instantiation has parentheses, i.e. `new class()`. - * - * @since 1.0.0 - */ -final class RequireAnonClassParenthesesSniff implements Sniff -{ - - /** - * Name of the metric. - * - * @since 1.0.0 - * - * @var string - */ - const METRIC_NAME = 'Anon class declaration with parenthesis'; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - return [\T_ANON_CLASS]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - - // Note: no need to check for `false` as PHPCS won't retokenize `class` to `T_ANON_CLASS` in that case. - if ($tokens[$nextNonEmpty]['code'] === \T_OPEN_PARENTHESIS) { - // Parentheses found. - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'yes'); - return; - } - - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'no'); - - $fix = $phpcsFile->addFixableError( - 'Parenthesis required when creating a new anonymous class.', - $stackPtr, - 'Missing' - ); - - if ($fix === true) { - $phpcsFile->fixer->addContent($stackPtr, '()'); - } - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Classes/RequireFinalClassSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Classes/RequireFinalClassSniff.php deleted file mode 100644 index 843f1ad..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Classes/RequireFinalClassSniff.php +++ /dev/null @@ -1,102 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\Classes; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Utils\GetTokensAsString; -use PHPCSUtils\Utils\ObjectDeclarations; - -/** - * Require classes being declared as "final". - * - * @since 1.0.0 - */ -final class RequireFinalClassSniff implements Sniff -{ - - /** - * Name of the metric. - * - * @since 1.0.0 - * - * @var string - */ - const METRIC_NAME = 'Class is abstract or final ?'; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - return [\T_CLASS]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $classProp = ObjectDeclarations::getClassProperties($phpcsFile, $stackPtr); - if ($classProp['is_final'] === true) { - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'final'); - return; - } - - if ($classProp['is_abstract'] === true) { - // Abstract classes can't be final. - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'abstract'); - return; - } - - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'not abstract, not final'); - - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($nextNonEmpty === false) { - // Live coding or parse error. - return; - } - - $snippetEnd = $nextNonEmpty; - $classCloser = ''; - - $tokens = $phpcsFile->getTokens(); - if (isset($tokens[$stackPtr]['scope_opener']) === true) { - $snippetEnd = $tokens[$stackPtr]['scope_opener']; - $classCloser = '}'; - } - - $snippet = GetTokensAsString::compact($phpcsFile, $stackPtr, $snippetEnd, true); - $fix = $phpcsFile->addFixableError( - 'A non-abstract class should be declared as final. Found: %s%s', - $stackPtr, - 'NonFinalClassFound', - [$snippet, $classCloser] - ); - - if ($fix === true) { - $phpcsFile->fixer->addContentBefore($stackPtr, 'final '); - } - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/CodeAnalysis/ConstructorDestructorReturnSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/CodeAnalysis/ConstructorDestructorReturnSniff.php deleted file mode 100644 index d38fb79..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/CodeAnalysis/ConstructorDestructorReturnSniff.php +++ /dev/null @@ -1,211 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\CodeAnalysis; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\BackCompat\BCFile; -use PHPCSUtils\BackCompat\Helper; -use PHPCSUtils\Tokens\Collections; -use PHPCSUtils\Utils\FunctionDeclarations; -use PHPCSUtils\Utils\GetTokensAsString; -use PHPCSUtils\Utils\Namespaces; -use PHPCSUtils\Utils\NamingConventions; -use PHPCSUtils\Utils\ObjectDeclarations; -use PHPCSUtils\Utils\Scopes; - -/** - * Verify that a class constructor/destructor does not return anything, nor has a - * return type declaration (fatal error). - * - * @since 1.0.0 - */ -final class ConstructorDestructorReturnSniff implements Sniff -{ - - /** - * PHP version as configured or 0 if unknown. - * - * @since 1.1.0 - * - * @var int - */ - private $phpVersion; - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - return [\T_FUNCTION]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if (isset($this->phpVersion) === false || \defined('PHP_CODESNIFFER_IN_TESTS')) { - // Set default value to prevent this code from running every time the sniff is triggered. - $this->phpVersion = 0; - - $phpVersion = Helper::getConfigData('php_version'); - if ($phpVersion !== null) { - $this->phpVersion = (int) $phpVersion; - } - } - - $scopePtr = Scopes::validDirectScope($phpcsFile, $stackPtr, Tokens::$ooScopeTokens); - if ($scopePtr === false) { - // Not an OO method. - return; - } - - $functionName = FunctionDeclarations::getName($phpcsFile, $stackPtr); - $functionNameLC = \strtolower($functionName); - - if ($functionNameLC === '__construct' || $functionNameLC === '__destruct') { - $functionType = \sprintf('A "%s()" magic method', $functionNameLC); - } else { - // If the PHP version is explicitly set to PHP 8.0 or higher, ignore PHP 4-style constructors. - if ($this->phpVersion >= 80000) { - return; - } - - // This may be a PHP 4-style constructor which should be handled. - $OOName = ObjectDeclarations::getName($phpcsFile, $scopePtr); - - if (empty($OOName) === true) { - // Anonymous class or parse error. The function can't be a PHP 4-style constructor. - return; - } - - if (NamingConventions::isEqual($functionName, $OOName) === false) { - // Class and function name not the same, so not a PHP 4-style constructor. - return; - } - - if (Namespaces::determineNamespace($phpcsFile, $stackPtr) !== '') { - /* - * Namespaced methods with the same name as the class are treated as - * regular methods, so we can bow out if we're in a namespace. - * - * Note: the exception to this is PHP 5.3.0-5.3.2. This is currently - * not dealt with. - */ - return; - } - - $functionType = 'A PHP 4-style constructor'; - } - - /* - * OK, so now we know for sure that this is a constructor/destructor method. - */ - - // Check for a return type. - $tokens = $phpcsFile->getTokens(); - $properties = FunctionDeclarations::getProperties($phpcsFile, $stackPtr); - if ($properties['return_type'] !== '' && $properties['return_type_token'] !== false) { - $data = [ - $functionType, - $properties['return_type'], - ]; - - $fix = $phpcsFile->addFixableError( - '%s can not declare a return type. Found: %s', - $properties['return_type_token'], - 'ReturnTypeFound', - $data - ); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - $parensCloser = $tokens[$stackPtr]['parenthesis_closer']; - for ($i = ($parensCloser + 1); $i <= $properties['return_type_end_token']; $i++) { - if (isset(Tokens::$commentTokens[$tokens[$i]['code']])) { - // Ignore comments and leave them be. - continue; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - - if (isset($tokens[$stackPtr]['scope_opener'], $tokens[$stackPtr]['scope_closer']) === false) { - // Abstract/interface method, live coding or parse error. - return; - } - - // Check for a value being returned. - $current = $tokens[$stackPtr]['scope_opener']; - $end = $tokens[$stackPtr]['scope_closer']; - - // Not searching for arrow functions as those have an implicit return, so won't use the `return` keyword. - $search = Collections::functionDeclarationTokens(); - $search[\T_RETURN] = \T_RETURN; - - do { - $current = $phpcsFile->findNext($search, ($current + 1), $end); - if ($current === false) { - break; - } - - if (isset(Collections::functionDeclarationTokens()[$tokens[$current]['code']]) - && isset($tokens[$current]['scope_closer']) - ) { - // Skip over nested function/closure declarations. - $current = $tokens[$current]['scope_closer']; - continue; - } - - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($current + 1), $end, true); - if ($next === false - || $tokens[$next]['code'] === \T_SEMICOLON - || $tokens[$next]['code'] === \T_CLOSE_TAG - ) { - // Return statement without value. - continue; - } - - $endOfStatement = BCFile::findEndOfStatement($phpcsFile, $next); - - $data = [ - $functionType, - GetTokensAsString::compact($phpcsFile, $current, $endOfStatement, true), - ]; - - $phpcsFile->addWarning( - '%s can not return a value. Found: "%s"', - $current, - 'ReturnValueFound', - $data - ); - } while ($current < $end); - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/CodeAnalysis/ForeachUniqueAssignmentSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/CodeAnalysis/ForeachUniqueAssignmentSniff.php deleted file mode 100644 index 8895c56..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/CodeAnalysis/ForeachUniqueAssignmentSniff.php +++ /dev/null @@ -1,153 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\CodeAnalysis; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Tokens\Collections; -use PHPCSUtils\Utils\GetTokensAsString; -use PHPCSUtils\Utils\Lists; - -/** - * Detects using the same variable for both the key as well as the value in a foreach assignment. - * - * @link https://twitter.com/exakat/status/1509103728934203397 - * @link https://3v4l.org/DdddX - * - * @since 1.0.0 - */ -final class ForeachUniqueAssignmentSniff implements Sniff -{ - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - return [\T_FOREACH]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['parenthesis_opener'], $tokens[$stackPtr]['parenthesis_closer']) === false) { - // Parse error or live coding, not our concern. - return; - } - - $opener = $tokens[$stackPtr]['parenthesis_opener']; - $closer = $tokens[$stackPtr]['parenthesis_closer']; - - $asPtr = $phpcsFile->findNext(\T_AS, ($opener + 1), $closer); - if ($asPtr === false) { - // Parse error or live coding, not our concern. - return; - } - - // Real target. - $find = [\T_DOUBLE_ARROW]; - // Prevent matching on double arrows within a list assignment. - $find += Collections::listTokens(); - - $doubleArrowPtr = $phpcsFile->findNext($find, ($asPtr + 1), $closer); - if ($doubleArrowPtr === false - || $tokens[$doubleArrowPtr]['code'] !== \T_DOUBLE_ARROW - ) { - // No key assignment. - return; - } - - $isListAssignment = $phpcsFile->findNext(Tokens::$emptyTokens, ($doubleArrowPtr + 1), $closer, true); - if ($isListAssignment === false) { - // Parse error or live coding, not our concern. - } - - $keyAsString = \ltrim(GetTokensAsString::noEmpties($phpcsFile, ($asPtr + 1), ($doubleArrowPtr - 1)), '&'); - $valueAssignments = []; - if (isset(Collections::listTokens()[$tokens[$isListAssignment]['code']]) === false) { - // Single value assignment. - $valueAssignments[] = GetTokensAsString::noEmpties($phpcsFile, ($doubleArrowPtr + 1), ($closer - 1)); - } else { - // List assignment. - $assignments = Lists::getAssignments($phpcsFile, $isListAssignment); - foreach ($assignments as $listItem) { - if ($listItem['assignment'] === '') { - // Ignore empty list assignments. - continue; - } - - // Note: this doesn't take nested lists into account (yet). - $valueAssignments[] = $listItem['assignment']; - } - } - - if (empty($valueAssignments)) { - // No assignments found. - return; - } - - foreach ($valueAssignments as $valueAsString) { - $valueAsString = \ltrim($valueAsString, '&'); - - if ($keyAsString !== $valueAsString) { - // Key and value not the same. - continue; - } - - $error = 'The variables used for the key and the value in a foreach assignment should be unique.'; - $error .= 'Both the key and the value will currently be assigned to: "%s"'; - - $fix = $phpcsFile->addFixableError($error, $doubleArrowPtr, 'NotUnique', [$valueAsString]); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - // Remove the key. - for ($i = ($asPtr + 1); $i < ($doubleArrowPtr + 1); $i++) { - if ($tokens[$i]['code'] === \T_WHITESPACE - && isset(Tokens::$commentTokens[$tokens[($i + 1)]['code']]) - ) { - // Don't remove whitespace when followed directly by a comment. - continue; - } - - if (isset(Tokens::$commentTokens[$tokens[$i]['code']])) { - // Don't remove comments. - continue; - } - - // Remove everything else. - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - - break; - } - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/CodeAnalysis/NoDoubleNegativeSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/CodeAnalysis/NoDoubleNegativeSniff.php deleted file mode 100644 index f85441d..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/CodeAnalysis/NoDoubleNegativeSniff.php +++ /dev/null @@ -1,269 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2023 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\CodeAnalysis; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\BackCompat\BCFile; -use PHPCSUtils\Tokens\Collections; -use PHPCSUtils\Utils\GetTokensAsString; -use PHPCSUtils\Utils\Parentheses; - -/** - * Detects double negation in code, which is effectively the same as a boolean cast, - * but with a much higher cognitive load. - * - * The sniff will only autofix if the precedence change from boolean not to boolean cast - * will not cause a behavioural change (as it would with instanceof). - * - * @since 1.2.0 - */ -final class NoDoubleNegativeSniff implements Sniff -{ - - /** - * Operators with lower precedence than the not-operator. - * - * Used to determine when to stop searching for `instanceof`. - * - * @since 1.2.0 - * - * @var array<int|string, int|string> - */ - private $operatorsWithLowerPrecedence; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.2.0 - * - * @return array<int|string> - */ - public function register() - { - // Collect all the operators only once. - $this->operatorsWithLowerPrecedence = Tokens::$assignmentTokens; - $this->operatorsWithLowerPrecedence += Tokens::$booleanOperators; - $this->operatorsWithLowerPrecedence += Tokens::$comparisonTokens; - $this->operatorsWithLowerPrecedence += Tokens::$operators; - $this->operatorsWithLowerPrecedence += Collections::ternaryOperators(); - - return [\T_BOOLEAN_NOT]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.2.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $notCount = 1; - $lastNot = $stackPtr; - for ($afterNot = ($stackPtr + 1); $afterNot < $phpcsFile->numTokens; $afterNot++) { - if (isset(Tokens::$emptyTokens[$tokens[$afterNot]['code']])) { - continue; - } - - if ($tokens[$afterNot]['code'] === \T_BOOLEAN_NOT) { - $lastNot = $afterNot; - ++$notCount; - continue; - } - - break; - } - - if ($notCount === 1) { - // Singular unary not-operator. Nothing to do. - return; - } - - $found = \trim(GetTokensAsString::compact($phpcsFile, $stackPtr, $lastNot)); - $data = [$found]; - - if (($notCount % 2) === 1) { - /* - * Oh dear... silly code time, found a triple negative (or other uneven number), - * this should just be a singular not-operator. - */ - $fix = $phpcsFile->addFixableError( - 'Triple negative (or more) detected. Use a singular not (!) operator instead. Found: %s', - $stackPtr, - 'FoundTriple', - $data - ); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - $this->removeNotAndTrailingSpaces($phpcsFile, $stackPtr, $lastNot); - - $phpcsFile->fixer->endChangeset(); - } - - // Only throw one error, even if there are more than two not-operators. - return $lastNot; - } - - /* - * Found a double negative, which should be a boolean cast. - */ - - $fixable = true; - - /* - * If whatever is being "cast" is within parentheses, we're good. - * If not, we need to prevent creating a change in behaviour - * when what follows is an `$x instanceof ...` expression, as - * the "instanceof" operator is right between a boolean cast - * and the ! operator precedence-wise. - * - * Note: this only applies to double negative, not triple negative. - * - * @link https://www.php.net/language.operators.precedence - */ - if ($tokens[$afterNot]['code'] !== \T_OPEN_PARENTHESIS) { - $end = Parentheses::getLastCloser($phpcsFile, $stackPtr); - if ($end === false) { - $end = BCFile::findEndOfStatement($phpcsFile, $stackPtr); - } - - for ($nextRelevant = $afterNot; $nextRelevant < $end; $nextRelevant++) { - if (isset(Tokens::$emptyTokens[$tokens[$nextRelevant]['code']])) { - continue; - } - - if ($tokens[$nextRelevant]['code'] === \T_INSTANCEOF) { - $fixable = false; - break; - } - - if (isset($this->operatorsWithLowerPrecedence[$tokens[$nextRelevant]['code']])) { - // The expression the `!` belongs to has ended. - break; - } - - // Skip over anything within some form of brackets. - if (isset($tokens[$nextRelevant]['scope_closer']) - && ($nextRelevant === $tokens[$nextRelevant]['scope_opener'] - || $nextRelevant === $tokens[$nextRelevant]['scope_condition']) - ) { - $nextRelevant = $tokens[$nextRelevant]['scope_closer']; - continue; - } - - if (isset($tokens[$nextRelevant]['bracket_opener'], $tokens[$nextRelevant]['bracket_closer']) - && $nextRelevant === $tokens[$nextRelevant]['bracket_opener'] - ) { - $nextRelevant = $tokens[$nextRelevant]['bracket_closer']; - continue; - } - - if ($tokens[$nextRelevant]['code'] === \T_OPEN_PARENTHESIS - && isset($tokens[$nextRelevant]['parenthesis_closer']) - ) { - $nextRelevant = $tokens[$nextRelevant]['parenthesis_closer']; - continue; - } - - // Skip over attributes (just in case). - if ($tokens[$nextRelevant]['code'] === \T_ATTRIBUTE - && isset($tokens[$nextRelevant]['attribute_closer']) - ) { - $nextRelevant = $tokens[$nextRelevant]['attribute_closer']; - continue; - } - } - } - - $error = 'Double negative detected. Use a (bool) cast %s instead. Found: %s'; - $code = 'FoundDouble'; - $data = [ - '', - $found, - ]; - - if ($fixable === false) { - $code = 'FoundDoubleWithInstanceof'; - $data[0] = 'and parentheses around the instanceof expression'; - - // Don't auto-fix in combination with instanceof. - $phpcsFile->addError($error, $stackPtr, $code, $data); - - // Only throw one error, even if there are more than two not-operators. - return $lastNot; - } - - $fix = $phpcsFile->addFixableError($error, $stackPtr, $code, $data); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - $this->removeNotAndTrailingSpaces($phpcsFile, $stackPtr, $lastNot); - - $phpcsFile->fixer->replaceToken($lastNot, '(bool)'); - - $phpcsFile->fixer->endChangeset(); - } - - // Only throw one error, even if there are more than two not-operators. - return $lastNot; - } - - /** - * Remove boolean not-operators and trailing whitespace after those, - * but don't remove comments or trailing whitespace after comments. - * - * @since 1.2.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $lastNot The position of the last boolean not token - * in the chain. - * - * @return void - */ - private function removeNotAndTrailingSpaces(File $phpcsFile, $stackPtr, $lastNot) - { - $tokens = $phpcsFile->getTokens(); - $ignore = false; - - for ($i = $stackPtr; $i < $lastNot; $i++) { - if (isset(Tokens::$commentTokens[$tokens[$i]['code']])) { - // Ignore comments and whitespace after comments. - $ignore = true; - continue; - } - - if ($tokens[$i]['code'] === \T_WHITESPACE && $ignore === false) { - $phpcsFile->fixer->replaceToken($i, ''); - continue; - } - - if ($tokens[$i]['code'] === \T_BOOLEAN_NOT) { - $ignore = false; - $phpcsFile->fixer->replaceToken($i, ''); - } - } - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/CodeAnalysis/NoEchoSprintfSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/CodeAnalysis/NoEchoSprintfSniff.php deleted file mode 100644 index 914d196..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/CodeAnalysis/NoEchoSprintfSniff.php +++ /dev/null @@ -1,144 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2023 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\CodeAnalysis; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -/** - * Detects use of `echo [v]sprintf();. - * - * @link https://www.php.net/manual/en/function.printf.php - * @link https://www.php.net/manual/en/function.sprintf.php - * @link https://www.php.net/manual/en/function.vprintf.php - * @link https://www.php.net/manual/en/function.vsprintf.php - * - * @since 1.1.0 - */ -final class NoEchoSprintfSniff implements Sniff -{ - - /** - * Functions to look for with their replacements. - * - * @since 1.1.0 - * - * @var array<string, string> - */ - private $targetFunctions = [ - 'sprintf' => 'printf', - 'vsprintf' => 'vprintf', - ]; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.1.0 - * - * @return array<int|string> - */ - public function register() - { - return [\T_ECHO]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.1.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $skip = Tokens::$emptyTokens; - $skip[] = \T_NS_SEPARATOR; - - $next = $phpcsFile->findNext($skip, ($stackPtr + 1), null, true); - if ($next === false - || ($tokens[$next]['code'] !== \T_STRING - && $tokens[$next]['code'] !== \T_NAME_FULLY_QUALIFIED) - ) { - // Definitely not our target. - return; - } - - $detectedFunction = \strtolower($tokens[$next]['content']); - if ($tokens[$next]['code'] === \T_NAME_FULLY_QUALIFIED) { - $detectedFunction = \ltrim($detectedFunction, '\\'); - } - - if (isset($this->targetFunctions[$detectedFunction]) === false) { - // Not one of our target functions. - return; - } - - $openParens = $phpcsFile->findNext(Tokens::$emptyTokens, ($next + 1), null, true); - if ($openParens === false - || $tokens[$openParens]['code'] !== \T_OPEN_PARENTHESIS - || isset($tokens[$openParens]['parenthesis_closer']) === false - ) { - // Live coding/parse error. - return; - } - - $closeParens = $tokens[$openParens]['parenthesis_closer']; - $afterFunctionCall = $phpcsFile->findNext(Tokens::$emptyTokens, ($closeParens + 1), null, true); - if ($afterFunctionCall === false - || ($tokens[$afterFunctionCall]['code'] !== \T_SEMICOLON - && $tokens[$afterFunctionCall]['code'] !== \T_CLOSE_TAG) - ) { - // Live coding/parse error or compound echo statement. - return; - } - - $fix = $phpcsFile->addFixableError( - 'Unnecessary "echo %s(...)" found. Use "%s(...)" instead.', - $next, - 'Found', - [ - $tokens[$next]['content'], - $this->targetFunctions[$detectedFunction], - ] - ); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - // Remove echo and whitespace. - $phpcsFile->fixer->replaceToken($stackPtr, ''); - - for ($i = ($stackPtr + 1); $i < $next; $i++) { - if ($tokens[$i]['code'] !== \T_WHITESPACE) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $replacement = $this->targetFunctions[$detectedFunction]; - if ($tokens[$next]['code'] === \T_NAME_FULLY_QUALIFIED) { - $replacement = '\\' . $replacement; - } - - $phpcsFile->fixer->replaceToken($next, $replacement); - - $phpcsFile->fixer->endChangeset(); - } - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/CodeAnalysis/StaticInFinalClassSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/CodeAnalysis/StaticInFinalClassSniff.php deleted file mode 100644 index 2136bcd..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/CodeAnalysis/StaticInFinalClassSniff.php +++ /dev/null @@ -1,216 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\CodeAnalysis; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Utils\Conditions; -use PHPCSUtils\Utils\FunctionDeclarations; -use PHPCSUtils\Utils\GetTokensAsString; -use PHPCSUtils\Utils\ObjectDeclarations; -use PHPCSUtils\Utils\Scopes; - -/** - * Forbid the use of the `static` keyword for late static binding in OO constructs which are final. - * - * @since 1.0.0 - */ -final class StaticInFinalClassSniff implements Sniff -{ - - /** - * OO Scopes in which late static binding is useless. - * - * @var array<int|string> - */ - private $validOOScopes = [ - \T_CLASS, // Only if final. - \T_ANON_CLASS, // Final by nature. - \T_ENUM, // Final by design. - ]; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - return [ - // These tokens are used to retrieve return types reliably. - \T_FUNCTION, - \T_FN, - // While this is our "real" target. - \T_STATIC, - // But we also need this as after "instanceof", `static` is tokenized as `T_STRING in PHPCS < 4.0.0. - // See: https://github.com/squizlabs/PHP_CodeSniffer/pull/3121 - \T_STRING, - ]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['code'] === \T_STRING - && \strtolower($tokens[$stackPtr]['content']) !== 'static' - ) { - return; - } - - if ($tokens[$stackPtr]['code'] === \T_FUNCTION - || $tokens[$stackPtr]['code'] === \T_FN - ) { - /* - * Check return types for methods in final classes, anon classes and enums. - * - * Will return the scope opener of the function to prevent potential duplicate notifications. - */ - $scopeOpener = $stackPtr; - if (isset($tokens[$stackPtr]['scope_opener']) === true) { - $scopeOpener = $tokens[$stackPtr]['scope_opener']; - } - - if ($tokens[$stackPtr]['code'] === \T_FUNCTION) { - $ooPtr = Scopes::validDirectScope($phpcsFile, $stackPtr, $this->validOOScopes); - if ($ooPtr === false) { - // Method in a trait (not known where it is used), interface (never final) or not in an OO scope. - return $scopeOpener; - } - } else { - $ooPtr = Conditions::getLastCondition($phpcsFile, $stackPtr, $this->validOOScopes); - if ($ooPtr === false) { - // Arrow function outside of OO. - return $scopeOpener; - } - } - - if ($tokens[$ooPtr]['code'] === \T_CLASS) { - $classProps = ObjectDeclarations::getClassProperties($phpcsFile, $ooPtr); - if ($classProps['is_final'] === false) { - // Method in a non-final class. - return $scopeOpener; - } - } - - $functionProps = FunctionDeclarations::getProperties($phpcsFile, $stackPtr); - if ($functionProps['return_type'] === '') { - return $scopeOpener; - } - - $staticPtr = $phpcsFile->findNext( - \T_STATIC, - $functionProps['return_type_token'], - ($functionProps['return_type_end_token'] + 1) - ); - - if ($staticPtr === false) { - return $scopeOpener; - } - - // Found a return type containing the `static` type. - $this->handleError($phpcsFile, $staticPtr, 'ReturnType', '"static" return type'); - - return $scopeOpener; - } - - /* - * Check other uses of static. - */ - $functionPtr = Conditions::getLastCondition($phpcsFile, $stackPtr, [\T_FUNCTION, \T_CLOSURE]); - if ($functionPtr === false || $tokens[$functionPtr]['code'] === \T_CLOSURE) { - /* - * When `false`, this code is absolutely invalid, but not something to be addressed via this sniff. - * When a closure, we're not interested in it. The closure class is final, but closures - * can be bound to other classes. This needs further research and should maybe get its own sniff. - */ - return; - } - - $ooPtr = Scopes::validDirectScope($phpcsFile, $functionPtr, $this->validOOScopes); - if ($ooPtr === false) { - // Not in an OO context. - return; - } - - if ($tokens[$ooPtr]['code'] === \T_CLASS) { - $classProps = ObjectDeclarations::getClassProperties($phpcsFile, $ooPtr); - if ($classProps['is_final'] === false) { - // Token in a non-final class. - return; - } - } - - $prevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($prevNonEmpty !== false) { - if ($tokens[$prevNonEmpty]['code'] === \T_INSTANCEOF) { - $prevPrevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($prevNonEmpty - 1), null, true); - $extraMsg = GetTokensAsString::compact($phpcsFile, $prevPrevNonEmpty, $stackPtr, true); - $this->handleError($phpcsFile, $stackPtr, 'InstanceOf', '"' . $extraMsg . '"'); - return; - } - - if ($tokens[$prevNonEmpty]['code'] === \T_NEW) { - $this->handleError($phpcsFile, $stackPtr, 'NewInstance', '"new static"'); - return; - } - } - - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($nextNonEmpty !== false && $tokens[$nextNonEmpty]['code'] === \T_DOUBLE_COLON) { - $nextNextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($nextNonEmpty + 1), null, true); - $extraMsg = GetTokensAsString::compact($phpcsFile, $stackPtr, $nextNextNonEmpty, true); - $this->handleError($phpcsFile, $stackPtr, 'ScopeResolution', '"' . $extraMsg . '"'); - return; - } - } - - /** - * Throw and potentially fix the error. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of erroneous `T_STATIC` token. - * @param string $errorCode The error code for the message. - * @param string $extraMsg Addition to the error message. - * - * @return void - */ - private function handleError($phpcsFile, $stackPtr, $errorCode, $extraMsg) - { - $fix = $phpcsFile->addFixableError( - 'Use "self" instead of "static" when using late static binding in a final OO construct. Found: %s', - $stackPtr, - $errorCode, - [$extraMsg] - ); - - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, 'self'); - } - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Constants/LowercaseClassResolutionKeywordSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Constants/LowercaseClassResolutionKeywordSniff.php deleted file mode 100644 index 7a67e47..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Constants/LowercaseClassResolutionKeywordSniff.php +++ /dev/null @@ -1,106 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\Constants; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -/** - * Verifies that the "::class" keyword when used for class name resolution is in lowercase. - * - * @link https://www.php.net/manual/en/language.constants.predefined.php - * @link https://www.php.net/manual/en/language.oop5.basic.php#language.oop5.basic.class.class - * - * @since 1.0.0 - */ -final class LowercaseClassResolutionKeywordSniff implements Sniff -{ - - /** - * Name of the metric. - * - * @since 1.0.0 - * - * @var string - */ - const METRIC_NAME = 'Magic ::class constant case'; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - return [\T_STRING]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $content = $tokens[$stackPtr]['content']; - $contentLC = \strtolower($content); - - if ($contentLC !== 'class') { - return; - } - - $nextToken = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($nextToken !== false && $tokens[$nextToken]['code'] === \T_OPEN_PARENTHESIS) { - // Function call or declaration for a function called "class". - return; - } - - $prevToken = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($prevToken === false || $tokens[$prevToken]['code'] !== \T_DOUBLE_COLON) { - return; - } - - if ($contentLC === $content) { - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'lowercase'); - return; - } - - $error = "The ::class keyword for class name resolution must be in lowercase. Expected: '::%s'; found: '::%s'"; - $data = [ - $contentLC, - $content, - ]; - - $errorCode = ''; - if (\strtoupper($content) === $content) { - $errorCode = 'Uppercase'; - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'uppercase'); - } else { - $errorCode = 'Mixedcase'; - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'mixed case'); - } - - $fix = $phpcsFile->addFixableError($error, $stackPtr, $errorCode, $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, $contentLC); - } - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Constants/ModifierKeywordOrderSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Constants/ModifierKeywordOrderSniff.php deleted file mode 100644 index 0251412..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Constants/ModifierKeywordOrderSniff.php +++ /dev/null @@ -1,181 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2022 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\Constants; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHPCSUtils\Utils\Constants; -use PHPCSUtils\Utils\Scopes; - -/** - * Standardize the modifier keyword order for OO constant declarations. - * - * @since 1.0.0 - */ -final class ModifierKeywordOrderSniff implements Sniff -{ - - /** - * Name of the metric. - * - * @since 1.0.0 - * - * @var string - */ - const METRIC_NAME = 'OO constant modifier keyword order'; - - /** - * Order preference: final visibility. - * - * @since 1.0.0 - * - * @var string - */ - const FINAL_VISIBILITY = 'final visibility'; - - /** - * Order preference: visibility final. - * - * @since 1.0.0 - * - * @var string - */ - const VISIBILITY_FINAL = 'visibility final'; - - /** - * Preferred order for the modifier keywords. - * - * Accepted values: - * - "final visibility". - * - or "visibility final". - * - * Defaults to "final visibility". - * - * @since 1.0.0 - * - * @var string - */ - public $order = self::FINAL_VISIBILITY; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - return [\T_CONST]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if (Scopes::isOOConstant($phpcsFile, $stackPtr) === false) { - return; - } - - $constantInfo = Constants::getProperties($phpcsFile, $stackPtr); - - if ($constantInfo['final_token'] === false || $constantInfo['scope_token'] === false) { - /* - * Either no modifier keywords found at all; or only one type of modifier - * keyword (final or visibility) declared, but not both. No ordering needed. - */ - return; - } - - $finalPtr = $constantInfo['final_token']; - $visibilityPtr = $constantInfo['scope_token']; - - if ($visibilityPtr < $finalPtr) { - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, self::VISIBILITY_FINAL); - } else { - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, self::FINAL_VISIBILITY); - } - - $message = 'OO constant modifier keywords are not in the correct order. Expected: "%s", found: "%s"'; - - switch ($this->order) { - case self::VISIBILITY_FINAL: - if ($visibilityPtr < $finalPtr) { - // Order is correct. Nothing to do. - return; - } - - $this->handleError($phpcsFile, $finalPtr, $visibilityPtr); - break; - - case self::FINAL_VISIBILITY: - default: - if ($finalPtr < $visibilityPtr) { - // Order is correct. Nothing to do. - return; - } - - $this->handleError($phpcsFile, $visibilityPtr, $finalPtr); - break; - } - } - - /** - * Throw the error and potentially fix it. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $firstKeyword The position of the first keyword found. - * @param int $secondKeyword The position of the second keyword token. - * - * @return void - */ - private function handleError(File $phpcsFile, $firstKeyword, $secondKeyword) - { - $tokens = $phpcsFile->getTokens(); - - $message = 'Constant modifier keywords are not in the correct order. Expected: "%s", found: "%s"'; - $data = [ - $tokens[$secondKeyword]['content'] . ' ' . $tokens[$firstKeyword]['content'], - $tokens[$firstKeyword]['content'] . ' ' . $tokens[$secondKeyword]['content'], - ]; - - $fix = $phpcsFile->addFixableError($message, $firstKeyword, 'Incorrect', $data); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - $phpcsFile->fixer->replaceToken($secondKeyword, ''); - - // Prevent leaving behind trailing whitespace. - $i = ($secondKeyword + 1); - while ($tokens[$i]['code'] === \T_WHITESPACE) { - $phpcsFile->fixer->replaceToken($i, ''); - ++$i; - } - - // Use the original token content as the case used for keywords is not the concern of this sniff. - $phpcsFile->fixer->addContentBefore($firstKeyword, $tokens[$secondKeyword]['content'] . ' '); - - $phpcsFile->fixer->endChangeset(); - } - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Constants/UppercaseMagicConstantsSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Constants/UppercaseMagicConstantsSniff.php deleted file mode 100644 index 348cf65..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Constants/UppercaseMagicConstantsSniff.php +++ /dev/null @@ -1,89 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\Constants; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -/** - * Verifies that PHP native `__...__` magic constants are in uppercase when used. - * - * @link https://www.php.net/manual/en/language.constants.predefined.php - * - * @since 1.0.0 - */ -final class UppercaseMagicConstantsSniff implements Sniff -{ - - /** - * Name of the metric. - * - * @since 1.0.0 - * - * @var string - */ - const METRIC_NAME = 'Magic constant case'; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - return Tokens::$magicConstants; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $content = $tokens[$stackPtr]['content']; - $contentUC = \strtoupper($content); - if ($contentUC === $content) { - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'uppercase'); - return; - } - - $error = 'Magic constants should be in uppercase. Expected: %s; found: %s'; - $errorCode = ''; - $data = [ - $contentUC, - $content, - ]; - - if (\strtolower($content) === $content) { - $errorCode = 'Lowercase'; - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'lowercase'); - } else { - $errorCode = 'Mixedcase'; - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'mixed case'); - } - - $fix = $phpcsFile->addFixableError($error, $stackPtr, $errorCode, $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, $contentUC); - } - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/ControlStructures/DisallowAlternativeSyntaxSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/ControlStructures/DisallowAlternativeSyntaxSniff.php deleted file mode 100644 index ab78a70..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/ControlStructures/DisallowAlternativeSyntaxSniff.php +++ /dev/null @@ -1,216 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\ControlStructures; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Tokens\Collections; -use PHPCSUtils\Utils\ControlStructures; - -/** - * Forbid the use of the alternative syntax for control structures. - * - * @since 1.0.0 - */ -final class DisallowAlternativeSyntaxSniff implements Sniff -{ - - /** - * Name of the metric. - * - * @since 1.0.0 - * - * @var string - */ - const METRIC_NAME = 'Control Structure Style'; - - /** - * Whether to allow the alternative syntax when it is wrapped around - * inline HTML, as is often seen in views. - * - * Note: inline HTML within "closed scopes" - like function declarations -, - * within the control structure body will not be taken into account. - * - * @since 1.0.0 - * - * @var bool - */ - public $allowWithInlineHTML = false; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - $targets = Collections::alternativeControlStructureSyntaxes(); - - // Don't look for elseif/else as they need to be dealt with in one go with the if. - unset($targets[\T_ELSEIF], $targets[\T_ELSE]); - - return $targets; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - /* - * Ignore control structures without body (i.e. single line control structures). - * This doesn't ignore _empty_ bodies. - */ - if (ControlStructures::hasBody($phpcsFile, $stackPtr, true) === false) { - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'single line (without body)'); - return; - } - - $tokens = $phpcsFile->getTokens(); - - /* - * Check if the control structure uses alternative syntax. - */ - if (isset($tokens[$stackPtr]['scope_opener'], $tokens[$stackPtr]['scope_closer']) === false) { - // No scope opener found: inline control structure or parse error. - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'inline'); - return; - } - - $opener = $tokens[$stackPtr]['scope_opener']; - $closer = $tokens[$stackPtr]['scope_closer']; - - if ($tokens[$opener]['code'] !== \T_COLON) { - // Curly brace syntax (not our concern). - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'curly braces'); - return; - } - - /* - * As of here, we *know* the control structure must be using alternative syntax and - * must have all scope openers/closers set as, in case of parse errors, PHPCS wouldn't - * have set the scope opener, even for the first `if`. - * - * Also note that alternative syntax cannot be used with `else if`, so we don't need to take that - * into account. - */ - - /* - * Determine whether there is inline HTML. - * - * For "chained" control structures (if - elseif - else), the complete control structure - * needs to be examined in one go as these cannot be changed individually, only as a complete group. - */ - $closedScopes = Collections::closedScopes(); - $find = $closedScopes; - $find[\T_INLINE_HTML] = \T_INLINE_HTML; - - $chainedIssues = []; - $hasInlineHTML = false; - $currentPtr = $stackPtr; - - do { - $opener = $tokens[$currentPtr]['scope_opener']; - $closer = $tokens[$currentPtr]['scope_closer']; - $chainedIssues[$opener] = $closer; - - if ($hasInlineHTML === true) { - // No need to search the contents, we already know there is inline HTML. - $currentPtr = $closer; - continue; - } - - $inlineHTMLPtr = $opener; - - do { - $inlineHTMLPtr = $phpcsFile->findNext($find, ($inlineHTMLPtr + 1), $closer); - if ($tokens[$inlineHTMLPtr]['code'] === \T_INLINE_HTML) { - $hasInlineHTML = true; - break; - } - - if (isset($closedScopes[$tokens[$inlineHTMLPtr]['code']], $tokens[$inlineHTMLPtr]['scope_closer'])) { - $inlineHTMLPtr = $tokens[$inlineHTMLPtr]['scope_closer']; - } - } while ($inlineHTMLPtr !== false && $inlineHTMLPtr < $closer); - - $currentPtr = $closer; - } while (isset(Collections::alternativeControlStructureSyntaxes()[$tokens[$closer]['code']]) === true); - - if ($hasInlineHTML === true) { - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'alternative syntax with inline HTML'); - } else { - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'alternative syntax'); - } - - if ($hasInlineHTML === true && $this->allowWithInlineHTML === true) { - return; - } - - $error = 'Using control structures with the alternative syntax is not allowed'; - if ($this->allowWithInlineHTML === true) { - $error .= ' unless the control structure contains inline HTML'; - } - $error .= '. Found: %1$s(): ... end%1$s;'; - - $code = 'Found' . \ucfirst($tokens[$stackPtr]['content']); - if ($hasInlineHTML === true) { - $code .= 'WithInlineHTML'; - } - - $data = [$tokens[$stackPtr]['content']]; - - foreach ($chainedIssues as $opener => $closer) { - $fix = $phpcsFile->addFixableError($error, $opener, $code, $data); - } - - if ($fix === false) { - return; - } - - /* - * Fix all issues for this chain in one go to diminish the chance of conflicts. - */ - $phpcsFile->fixer->beginChangeset(); - - foreach ($chainedIssues as $opener => $closer) { - $phpcsFile->fixer->replaceToken($opener, '{'); - - if (isset(Collections::alternativeControlStructureSyntaxClosers()[$tokens[$closer]['code']]) === true) { - $phpcsFile->fixer->replaceToken($closer, '}'); - - $semicolon = $phpcsFile->findNext(Tokens::$emptyTokens, ($closer + 1), null, true); - if ($semicolon !== false && $tokens[$semicolon]['code'] === \T_SEMICOLON) { - $phpcsFile->fixer->replaceToken($semicolon, ''); - } - } else { - /* - * This must be an if/else using alternative syntax. - * The closer will be the next control structure keyword. - */ - $phpcsFile->fixer->addContentBefore($closer, '} '); - } - } - - $phpcsFile->fixer->endChangeset(); - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/ControlStructures/DisallowLonelyIfSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/ControlStructures/DisallowLonelyIfSniff.php deleted file mode 100644 index f29a1fe..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/ControlStructures/DisallowLonelyIfSniff.php +++ /dev/null @@ -1,348 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\ControlStructures; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Utils\ControlStructures; -use PHPCSUtils\Utils\GetTokensAsString; - -/** - * Disallow `if` statements as the only statement in an `else` block. - * - * Note: This sniff will not fix the indentation of the "inner" code. It is strongly recommended to run - * this sniff together with the `Generic.WhiteSpace.ScopeIndent` sniff to get the correct indentation. - * - * Inspired by the {@link https://eslint.org/docs/rules/no-lonely-if ESLint "no lonely if"} rule - * in response to upstream {@link https://github.com/squizlabs/PHP_CodeSniffer/issues/3206 PHPCS issue 3206}. - * - * @since 1.0.0 - */ -final class DisallowLonelyIfSniff implements Sniff -{ - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - return [\T_ELSE]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - /* - * Deal with `else if`. - */ - if (ControlStructures::isElseIf($phpcsFile, $stackPtr) === true) { - // Ignore, not our real target. - return; - } - - if (isset($tokens[$stackPtr]['scope_opener'], $tokens[$stackPtr]['scope_closer']) === false) { - // Either an else without curly braces or a parse error. Ignore. - return; - } - - $outerScopeOpener = $tokens[$stackPtr]['scope_opener']; - $outerScopeCloser = $tokens[$stackPtr]['scope_closer']; - - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($outerScopeOpener + 1), $outerScopeCloser, true); - if ($nextNonEmpty === false || $tokens[$nextNonEmpty]['code'] !== \T_IF) { - // Definitely not a lonely if statement. - return; - } - - if (isset($tokens[$nextNonEmpty]['scope_closer']) === false) { - // Either a control structure without curly braces or a parse error. Ignore. - return; - } - - /* - * Find the end of an if - else chain. - */ - - $innerIfPtr = $nextNonEmpty; - $innerIfToken = $tokens[$innerIfPtr]; - $autoFixable = true; - $innerScopeCloser = $innerIfToken['scope_closer']; - - // For alternative syntax fixer only. - // Remember the individual inner scope opener and closers so the fixer doesn't need - // to do the same walking over the if/else chain again. - $innerScopes = [ - $innerIfToken['scope_opener'] => $innerScopeCloser, - ]; - - do { - /* - * Handle control structures using alternative syntax. - */ - if ($tokens[$innerScopeCloser]['code'] !== \T_CLOSE_CURLY_BRACKET) { - if ($tokens[$innerScopeCloser]['code'] === \T_ENDIF) { - $nextAfter = $phpcsFile->findNext( - Tokens::$emptyTokens, - ($innerScopeCloser + 1), - $outerScopeCloser, - true - ); - - if ($tokens[$nextAfter]['code'] === \T_CLOSE_TAG) { - // Not "lonely" as at the very least there must be a PHP open tag before the outer closer. - return; - } - - if ($tokens[$nextAfter]['code'] === \T_SEMICOLON) { - $innerScopeCloser = $nextAfter; - } else { - // Missing semicolon. Report, but don't auto-fix. - $autoFixable = false; - } - } else { - // This must be an else[if]. - --$innerScopeCloser; - } - } - - $innerNextNonEmpty = $phpcsFile->findNext( - Tokens::$emptyTokens, - ($innerScopeCloser + 1), - $outerScopeCloser, - true - ); - if ($innerNextNonEmpty === false) { - // This was the last closer. - break; - } - - if ($tokens[$innerNextNonEmpty]['code'] !== \T_ELSE - && $tokens[$innerNextNonEmpty]['code'] !== \T_ELSEIF - ) { - // Found another statement after the control structure. The "if" is not lonely. - return; - } - - if (isset($tokens[$innerNextNonEmpty]['scope_closer']) === false) { - // This may still be an "else if"... - $nextAfter = $phpcsFile->findNext( - Tokens::$emptyTokens, - ($innerNextNonEmpty + 1), - $outerScopeCloser, - true - ); - - if ($nextAfter === false - || $tokens[$nextAfter]['code'] !== \T_IF - || isset($tokens[$nextAfter]['scope_closer']) === false - ) { - // Defense in depth. Either a control structure without curly braces or a parse error. Ignore. - return; - } - - $innerNextNonEmpty = $nextAfter; - } - - $innerScopeCloser = $tokens[$innerNextNonEmpty]['scope_closer']; - $innerScopes[$tokens[$innerNextNonEmpty]['scope_opener']] = $innerScopeCloser; - } while (true); - - /* - * As of now, we know we have an error. Check if it can be auto-fixed. - */ - if ($phpcsFile->findNext(\T_WHITESPACE, ($innerScopeCloser + 1), $outerScopeCloser, true) !== false) { - // Comment between the inner and outer closers. - $autoFixable = false; - } - - if ($tokens[$innerScopeCloser]['code'] === \T_SEMICOLON) { - $hasComment = $phpcsFile->findPrevious(\T_WHITESPACE, ($innerScopeCloser - 1), null, true); - if ($tokens[$hasComment]['code'] !== \T_ENDIF) { - // Comment between the "endif" and the semi-colon. - $autoFixable = false; - } - } - - if ($tokens[$outerScopeOpener]['line'] !== $innerIfToken['line']) { - for ($startOfNextLine = ($outerScopeOpener + 1); $startOfNextLine < $innerIfPtr; $startOfNextLine++) { - if ($tokens[$outerScopeOpener]['line'] !== $tokens[$startOfNextLine]['line']) { - break; - } - } - - if ($phpcsFile->findNext(\T_WHITESPACE, $startOfNextLine, $innerIfPtr, true) !== false) { - // Comment between the inner and outer openers. - $autoFixable = false; - } - } - - if (isset($innerIfToken['parenthesis_opener'], $innerIfToken['parenthesis_closer']) === false) { - // Start/end of the condition of the if unclear. Most likely a parse error. - $autoFixable = false; - } - - /* - * Throw the error and potentially fix it. - */ - $error = 'If control structure block found as the only statement within an "else" block. Use elseif instead.'; - $code = 'Found'; - - if ($autoFixable === false) { - $phpcsFile->addError($error, $stackPtr, $code); - return; - } - - $fix = $phpcsFile->addFixableError($error, $stackPtr, $code); - if ($fix === false) { - return; - } - - /* - * Fix it. - */ - $outerInnerSameType = false; - if (($tokens[$outerScopeCloser]['code'] === \T_CLOSE_CURLY_BRACKET - && $tokens[$innerScopeCloser]['code'] === \T_CLOSE_CURLY_BRACKET) - || ($tokens[$outerScopeCloser]['code'] === \T_ENDIF - && $tokens[$innerScopeCloser]['code'] === \T_SEMICOLON) - ) { - $outerInnerSameType = true; - } - - $targetIsCurly = ($tokens[$outerScopeCloser]['code'] === \T_CLOSE_CURLY_BRACKET); - - $innerScopeCount = \count($innerScopes); - - $condition = GetTokensAsString::origContent($phpcsFile, ($innerIfPtr + 1), ($innerIfToken['scope_opener'] - 1)); - if ($targetIsCurly === true) { - $condition = \rtrim($condition) . ' '; - } - - $phpcsFile->fixer->beginChangeset(); - - // Remove the inner if + condition up to and including the scope opener. - for ($i = $innerIfPtr; $i <= $innerIfToken['scope_opener']; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - // Potentially remove trailing whitespace/new line if there is no comment after the inner condition. - while ($tokens[$i]['line'] === $innerIfToken['line'] - && $tokens[$i]['code'] === \T_WHITESPACE - ) { - $phpcsFile->fixer->replaceToken($i, ''); - ++$i; - } - - // Remove any potential indentation whitespace for the inner if. - if ($tokens[$outerScopeOpener]['line'] !== $innerIfToken['line'] - && $tokens[$i]['line'] !== $innerIfToken['line'] - ) { - $i = ($nextNonEmpty - 1); - while ($tokens[$i]['line'] === $innerIfToken['line'] - && $tokens[$i]['code'] === \T_WHITESPACE - ) { - $phpcsFile->fixer->replaceToken($i, ''); - --$i; - } - } - - // Remove the inner scope closer. - $phpcsFile->fixer->replaceToken($innerScopeCloser, ''); - $i = ($innerScopeCloser - 1); - - // Handle alternative syntax for the closer. - if ($tokens[$innerScopeCloser]['code'] === \T_SEMICOLON) { - // Remove potential whitespace between the "endif" and the semicolon. - while ($tokens[$i]['code'] === \T_WHITESPACE) { - $phpcsFile->fixer->replaceToken($i, ''); - --$i; - } - - // Remove the "endif". - $phpcsFile->fixer->replaceToken($i, ''); - --$i; - } - - // Remove superfluous whitespace before the inner scope closer. - while ($tokens[$i]['code'] === \T_WHITESPACE) { - $phpcsFile->fixer->replaceToken($i, ''); - --$i; - } - - // Replace the else. - $phpcsFile->fixer->replaceToken($stackPtr, 'elseif' . $condition); - - // Remove potential superfluous whitespace between the new condition and the scope opener. - $i = ($stackPtr + 1); - while ($tokens[$i]['line'] === $tokens[$stackPtr]['line'] - && $tokens[$i]['code'] === \T_WHITESPACE - ) { - $phpcsFile->fixer->replaceToken($i, ''); - ++$i; - } - - if ($outerInnerSameType === false - && $innerScopeCount > 1 - ) { - $loop = 1; - foreach ($innerScopes as $opener => $closer) { - if ($targetIsCurly === true) { - if ($loop !== 1) { - // Only handle the opener when it's not the first of the chain as that's already handled above. - $phpcsFile->fixer->replaceToken($opener, ' {'); - } - - if ($loop !== $innerScopeCount) { - // Only handle the closer when it's not the last of the chain as that's already handled above. - $phpcsFile->fixer->addContentBefore($closer, '} '); - } - } else { - if ($loop !== 1) { - // Only handle the opener when it's not the first of the chain as that's already handled above. - $phpcsFile->fixer->replaceToken($opener, ':'); - } - - if ($loop !== $innerScopeCount) { - // Only handle the closer when it's not the last of the chain as that's already handled above. - $phpcsFile->fixer->replaceToken($closer, ''); - - $j = ($closer + 1); - while ($tokens[$j]['code'] === \T_WHITESPACE) { - $phpcsFile->fixer->replaceToken($j, ''); - ++$j; - } - } - } - - ++$loop; - } - } - - $phpcsFile->fixer->endChangeset(); - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/ControlStructures/IfElseDeclarationSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/ControlStructures/IfElseDeclarationSniff.php deleted file mode 100644 index fb2c39d..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/ControlStructures/IfElseDeclarationSniff.php +++ /dev/null @@ -1,164 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\ControlStructures; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -/** - * Verifies that `else(if)` statements with braces are on a new line. - * - * Sister-sniff to the following two PHPCS native sniffs which each demand that `else[]if` is on the - * same line as the closing curly of the preceding `(else)if`: - * - `PEAR.ControlStructures.ControlSignature[.Found]` - * - `Squiz.ControlStructures.ControlSignature.SpaceAfterCloseBrace` - * - * Other related sniffs: - * - `Squiz.ControlStructures.ElseIfDeclaration` Forbids the use of "elseif", demands "else if". - * - `PSR2.ControlStructures.ElseIfDeclaration` Forbids the use of "else if", demands "elseif". - * - * @since 1.0.0 - */ -final class IfElseDeclarationSniff implements Sniff -{ - - /** - * Name of the metric. - * - * @since 1.0.0 - * - * @var string - */ - const METRIC_NAME = 'Else(if) on a new line'; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - return [ - \T_ELSE, - \T_ELSEIF, - ]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - /* - * Check for control structures without braces and alternative syntax. - */ - $scopePtr = $stackPtr; - if (isset($tokens[$stackPtr]['scope_opener']) === false) { - // Deal with "else if". - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($tokens[$next]['code'] === \T_IF) { - $scopePtr = $next; - } - } - - if (isset($tokens[$scopePtr]['scope_opener']) === false - || $tokens[$tokens[$scopePtr]['scope_opener']]['code'] === \T_COLON - ) { - // No scope opener found or alternative syntax (not our concern). - return; - } - - /* - * Check whether the else(if) is on a new line. - */ - $prevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($prevNonEmpty === false || $tokens[$prevNonEmpty]['code'] !== \T_CLOSE_CURLY_BRACKET) { - // Parse error or mixing braced and non-braced. Not our concern. - return; - } - - if ($tokens[$prevNonEmpty]['line'] !== $tokens[$stackPtr]['line']) { - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'yes'); - return; - } - - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'no'); - - $errorBase = \strtoupper($tokens[$stackPtr]['content']); - $error = $errorBase . ' statement must be on a new line.'; - - $prevNonWhitespace = $phpcsFile->findPrevious(\T_WHITESPACE, ($stackPtr - 1), null, true); - - if ($prevNonWhitespace !== $prevNonEmpty) { - // Comment found between previous scope closer and the keyword. - $fix = $phpcsFile->addError($error, $stackPtr, 'NoNewLine'); - return; - } - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoNewLine'); - if ($fix === false) { - return; - } - - /* - * Fix it. - */ - - // Figure out the indentation for the else(if). - $indentBase = $prevNonEmpty; - if (isset($tokens[$prevNonEmpty]['scope_condition']) === true - && ($tokens[$tokens[$prevNonEmpty]['scope_condition']]['column'] === 1 - || ($tokens[($tokens[$prevNonEmpty]['scope_condition'] - 1)]['code'] === \T_WHITESPACE - && $tokens[($tokens[$prevNonEmpty]['scope_condition'] - 1)]['column'] === 1)) - ) { - // Base the indentation off the previous if/elseif if on a line by itself. - $indentBase = $tokens[$prevNonEmpty]['scope_condition']; - } - - $indent = ''; - $firstOnIndentLine = $indentBase; - if ($tokens[$firstOnIndentLine]['column'] !== 1) { - while (isset($tokens[($firstOnIndentLine - 1)]) && $tokens[--$firstOnIndentLine]['column'] !== 1); - - if ($tokens[$firstOnIndentLine]['code'] === \T_WHITESPACE) { - $indent = $tokens[$firstOnIndentLine]['content']; - - // If tabs were replaced, use the original content. - if (isset($tokens[$firstOnIndentLine]['orig_content']) === true) { - $indent = $tokens[$firstOnIndentLine]['orig_content']; - } - } - } - - $phpcsFile->fixer->beginChangeset(); - - // Remove any whitespace between the previous scope closer and the else(if). - for ($i = ($prevNonEmpty + 1); $i < $stackPtr; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->addContent($prevNonEmpty, $phpcsFile->eolChar . $indent); - $phpcsFile->fixer->endChangeset(); - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Files/SeparateFunctionsFromOOSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Files/SeparateFunctionsFromOOSniff.php deleted file mode 100644 index 9cf191e..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Files/SeparateFunctionsFromOOSniff.php +++ /dev/null @@ -1,189 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Tokens\Collections; - -/** - * A file should either declare (global/namespaced) functions or declare OO structures, but not both. - * - * Nested function declarations, i.e. functions declared within a function/method will be disregarded - * for the purposes of this sniff. - * The same goes for anonymous classes, closures and arrow functions. - * - * Notes: - * - This sniff has no opinion on side effects. If you want to sniff for those, use the PHPCS - * native `PSR1.Files.SideEffects` sniff. - * - This sniff has no opinion on multiple OO structures being declared in one file. - * If you want to sniff for that, use the PHPCS native `Generic.Files.OneObjectStructurePerFile` sniff. - * - * @since 1.0.0 - */ -final class SeparateFunctionsFromOOSniff implements Sniff -{ - - /** - * Name of the metric. - * - * @since 1.0.0 - * - * @var string - */ - const METRIC_NAME = 'Functions or OO declarations ?'; - - /** - * Tokens this sniff searches for. - * - * Enhanced from within the register() methods. - * - * @since 1.0.0 - * - * @var array<int|string> - */ - private $search = [ - // Some tokens to help skip over structures we're not interested in. - \T_START_HEREDOC => \T_START_HEREDOC, - \T_START_NOWDOC => \T_START_NOWDOC, - ]; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - $this->search += Tokens::$ooScopeTokens; - $this->search += Collections::functionDeclarationTokens(); - - return Collections::phpOpenTags(); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return int Integer stack pointer to skip forward. - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $firstOO = null; - $firstFunction = null; - $functionCount = 0; - $OOCount = 0; - - for ($i = 0; $i < $phpcsFile->numTokens; $i++) { - // Ignore anything within square brackets. - if ($tokens[$i]['code'] !== \T_OPEN_CURLY_BRACKET - && isset($tokens[$i]['bracket_opener'], $tokens[$i]['bracket_closer']) - && $i === $tokens[$i]['bracket_opener'] - ) { - $i = $tokens[$i]['bracket_closer']; - continue; - } - - // Skip past nested arrays, function calls and arbitrary groupings. - if ($tokens[$i]['code'] === \T_OPEN_PARENTHESIS - && isset($tokens[$i]['parenthesis_closer']) - ) { - $i = $tokens[$i]['parenthesis_closer']; - continue; - } - - // Skip over potentially large docblocks. - if ($tokens[$i]['code'] === \T_DOC_COMMENT_OPEN_TAG - && isset($tokens[$i]['comment_closer']) - ) { - $i = $tokens[$i]['comment_closer']; - continue; - } - - // Ignore everything else we're not interested in. - if (isset($this->search[$tokens[$i]['code']]) === false) { - continue; - } - - // Skip over structures which won't contain anything we're interested in. - if (($tokens[$i]['code'] === \T_START_HEREDOC - || $tokens[$i]['code'] === \T_START_NOWDOC - || $tokens[$i]['code'] === \T_ANON_CLASS - || $tokens[$i]['code'] === \T_CLOSURE - || $tokens[$i]['code'] === \T_FN) - && isset($tokens[$i]['scope_condition'], $tokens[$i]['scope_closer']) - && $tokens[$i]['scope_condition'] === $i - ) { - $i = $tokens[$i]['scope_closer']; - continue; - } - - // This will be either a function declaration or an OO declaration token. - if ($tokens[$i]['code'] === \T_FUNCTION) { - if (isset($firstFunction) === false) { - $firstFunction = $i; - } - - ++$functionCount; - } else { - if (isset($firstOO) === false) { - $firstOO = $i; - } - - ++$OOCount; - } - - if (isset($tokens[$i]['scope_closer']) === true) { - $i = $tokens[$i]['scope_closer']; - } - } - - if ($functionCount > 0 && $OOCount > 0) { - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'Both function and OO declarations'); - - $reportToken = \max($firstFunction, $firstOO); - - $phpcsFile->addError( - 'A file should either contain function declarations or OO structure declarations, but not both.' - . ' Found %d function declaration(s) and %d OO structure declaration(s).' - . ' The first function declaration was found on line %d;' - . ' the first OO declaration was found on line %d', - $reportToken, - 'Mixed', - [ - $functionCount, - $OOCount, - $tokens[$firstFunction]['line'], - $tokens[$firstOO]['line'], - ] - ); - } elseif ($functionCount > 0) { - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'Only function(s)'); - } elseif ($OOCount > 0) { - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'Only OO structure(s)'); - } else { - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'Neither'); - } - - // Ignore the rest of the file. - return $phpcsFile->numTokens; - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/FunctionDeclarations/NoLongClosuresSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/FunctionDeclarations/NoLongClosuresSniff.php deleted file mode 100644 index a9ccf78..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/FunctionDeclarations/NoLongClosuresSniff.php +++ /dev/null @@ -1,233 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\FunctionDeclarations; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -/** - * Forbids long closures. - * - * @since 1.1.0 - */ -final class NoLongClosuresSniff implements Sniff -{ - - /** - * Name of the metric. - * - * @since 1.1.0 - * - * @var string - */ - const METRIC_NAME_CODE = 'Closure length (code only)'; - - /** - * Name of the metric. - * - * @since 1.1.0 - * - * @var string - */ - const METRIC_NAME_COMMENTS = 'Closure length (code + comments)'; - - /** - * Name of the metric. - * - * @since 1.1.0 - * - * @var string - */ - const METRIC_NAME_ALL = 'Closure length (code + comments + blank lines)'; - - /** - * Maximum number of lines allowed before a closure is considered a "long" closure. - * - * Defaults to 5 lines, i.e. when a closure contains 6 lines, a warning will be thrown. - * - * @since 1.1.0 - * - * @var int - */ - public $recommendedLines = 5; - - /** - * Maximum number of lines allowed before a closure is considered a "long" closure. - * - * Defaults to 8 lines, i.e. when a closure contains 9 lines, an error will be thrown. - * - * @since 1.1.0 - * - * @var int - */ - public $maxLines = 8; - - /** - * Whether or not to exclude lines which only contain documentation in the line count. - * - * Defaults to `true`. - * - * @since 1.1.0 - * - * @var bool - */ - public $ignoreCommentLines = true; - - /** - * Whether or not to exclude empty lines from the line count. - * - * Defaults to `true`. - * - * @since 1.1.0 - * - * @var bool - */ - public $ignoreEmptyLines = true; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.1.0 - * - * @return array<int|string> - */ - public function register() - { - return [\T_CLOSURE]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.1.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $this->recommendedLines = (int) $this->recommendedLines; - $this->maxLines = (int) $this->maxLines; - - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['scope_opener'], $tokens[$stackPtr]['scope_closer']) === false) { - // Live coding/parse error. Shouldn't be possible as in that case tokenizer won't retokenize to T_CLOSURE. - return; // @codeCoverageIgnore - } - - $opener = $tokens[$stackPtr]['scope_opener']; - $closer = $tokens[$stackPtr]['scope_closer']; - - $currentLine = $tokens[$opener]['line']; - $closerLine = $tokens[$closer]['line']; - - $codeLines = 0; - $commentLines = 0; - $blankLines = 0; - - // Check whether the line of the scope opener needs to be counted, but ignore trailing comments on that line. - $firstNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($opener + 1), $closer, true); - if ($firstNonEmpty !== false && $tokens[$firstNonEmpty]['line'] === $currentLine) { - ++$codeLines; - } - - // Check whether the line of the scope closer needs to be counted. - if ($closerLine !== $currentLine) { - $hasCommentTokens = false; - $hasCodeTokens = false; - for ($i = ($closer - 1); $tokens[$i]['line'] === $closerLine && $i > $opener; $i--) { - if (isset(Tokens::$emptyTokens[$tokens[$i]['code']]) === false) { - $hasCodeTokens = true; - } elseif (isset(Tokens::$commentTokens[$tokens[$i]['code']]) === true) { - $hasCommentTokens = true; - } - } - - if ($hasCodeTokens === true) { - ++$codeLines; - } elseif ($hasCommentTokens === true) { - ++$commentLines; - } - } - - // We've already examined the opener line, so move to the next line. - for ($i = ($opener + 1); $tokens[$i]['line'] === $currentLine && $i < $closer; $i++); - $currentLine = $tokens[$i]['line']; - - // Walk tokens. - while ($currentLine !== $closerLine) { - $hasCommentTokens = false; - $hasCodeTokens = false; - - while ($tokens[$i]['line'] === $currentLine) { - if (isset(Tokens::$emptyTokens[$tokens[$i]['code']]) === false) { - $hasCodeTokens = true; - } elseif (isset(Tokens::$commentTokens[$tokens[$i]['code']]) === true) { - $hasCommentTokens = true; - } - - ++$i; - } - - if ($hasCodeTokens === true) { - ++$codeLines; - } elseif ($hasCommentTokens === true) { - ++$commentLines; - } else { - // Only option left is that this is an empty line. - ++$blankLines; - } - - $currentLine = $tokens[$i]['line']; - } - - $nonBlankLines = ($codeLines + $commentLines); - $totalLines = ($codeLines + $commentLines + $blankLines); - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME_CODE, $codeLines . ' lines'); - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME_COMMENTS, $nonBlankLines . ' lines'); - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME_ALL, $totalLines . ' lines'); - - $lines = $codeLines; - if ($this->ignoreCommentLines === false) { - $lines += $commentLines; - } - if ($this->ignoreEmptyLines === false) { - $lines += $blankLines; - } - - $errorSuffix = ' Declare a named function instead. Found closure containing %s lines'; - - if ($lines > $this->maxLines) { - $phpcsFile->addError( - 'Closures which are longer than %s lines are forbidden.' . $errorSuffix, - $stackPtr, - 'ExceedsMaximum', - [$this->maxLines, $lines] - ); - - return; - } - - if ($lines > $this->recommendedLines) { - $phpcsFile->addWarning( - 'It is recommended for closures to contain %s lines or less.' . $errorSuffix, - $stackPtr, - 'ExceedsRecommended', - [$this->recommendedLines, $lines] - ); - } - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/FunctionDeclarations/RequireFinalMethodsInTraitsSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/FunctionDeclarations/RequireFinalMethodsInTraitsSniff.php deleted file mode 100644 index 505c19b..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/FunctionDeclarations/RequireFinalMethodsInTraitsSniff.php +++ /dev/null @@ -1,120 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2023 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\FunctionDeclarations; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHPCSUtils\Utils\FunctionDeclarations; -use PHPCSUtils\Utils\ObjectDeclarations; -use PHPCSUtils\Utils\Scopes; - -/** - * Require non-abstract, non-private methods in traits to be declared as "final". - * - * @since 1.1.0 - */ -final class RequireFinalMethodsInTraitsSniff implements Sniff -{ - - /** - * Name of the metric. - * - * @since 1.1.0 - * - * @var string - */ - const METRIC_NAME = 'Non-private method in trait is abstract or final ?'; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.1.0 - * - * @return array<int|string> - */ - public function register() - { - return [\T_FUNCTION]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.1.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - if (isset($tokens[$stackPtr]['parenthesis_opener']) === false) { - // Parse error/live coding. - return; - } - - $scopePtr = Scopes::validDirectScope($phpcsFile, $stackPtr, \T_TRAIT); - if ($scopePtr === false) { - // Not a trait method. - return; - } - - $methodProps = FunctionDeclarations::getProperties($phpcsFile, $stackPtr); - if ($methodProps['scope'] === 'private') { - // Private methods can't be final. - return; - } - - if ($methodProps['is_final'] === true) { - // Already final, nothing to do. - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'final'); - return; - } - - if ($methodProps['is_abstract'] === true) { - // Abstract classes can't be final. - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'abstract'); - return; - } - - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'not abstract, not final'); - - $methodName = FunctionDeclarations::getName($phpcsFile, $stackPtr); - $magic = ''; - $code = 'NonFinalMethodFound'; - if (FunctionDeclarations::isMagicMethodName($methodName) === true) { - // Use separate error code for magic methods. - $magic = 'magic '; - $code = 'NonFinalMagicMethodFound'; - } - - $data = [ - $methodProps['scope'], - $magic, - $methodName, - ObjectDeclarations::getName($phpcsFile, $scopePtr), - ]; - - $fix = $phpcsFile->addFixableError( - 'The non-abstract, %s %smethod "%s()" in trait %s should be declared as final.', - $stackPtr, - $code, - $data - ); - - if ($fix === true) { - $phpcsFile->fixer->addContentBefore($stackPtr, 'final '); - } - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Lists/DisallowLongListSyntaxSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Lists/DisallowLongListSyntaxSniff.php deleted file mode 100644 index de7447e..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Lists/DisallowLongListSyntaxSniff.php +++ /dev/null @@ -1,71 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\Lists; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHPCSUtils\Utils\Lists; - -/** - * Bans the use of the PHP long list syntax. - * - * @since 1.0.0 - */ -final class DisallowLongListSyntaxSniff implements Sniff -{ - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - return [\T_LIST]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $openClose = Lists::getOpenClose($phpcsFile, $stackPtr); - if ($openClose === false) { - // Live coding or parse error. - return; - } - - $fix = $phpcsFile->addFixableError('Long list syntax is not allowed', $stackPtr, 'Found'); - - if ($fix === true) { - $opener = $openClose['opener']; - $closer = $openClose['closer']; - - $phpcsFile->fixer->beginChangeset(); - - $phpcsFile->fixer->replaceToken($stackPtr, ''); - $phpcsFile->fixer->replaceToken($opener, '['); - $phpcsFile->fixer->replaceToken($closer, ']'); - - $phpcsFile->fixer->endChangeset(); - } - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Lists/DisallowShortListSyntaxSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Lists/DisallowShortListSyntaxSniff.php deleted file mode 100644 index af2a948..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Lists/DisallowShortListSyntaxSniff.php +++ /dev/null @@ -1,86 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\Lists; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHPCSUtils\Tokens\Collections; -use PHPCSUtils\Utils\Lists; - -/** - * Bans the use of the PHP short list syntax. - * - * @since 1.0.0 - */ -final class DisallowShortListSyntaxSniff implements Sniff -{ - - /** - * The phrase to use for the metric recorded by this sniff. - * - * @var string - */ - const METRIC_NAME = 'Short list syntax used'; - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - return Collections::listOpenTokensBC(); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['code'] === \T_LIST) { - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'no'); - return; - } - - $openClose = Lists::getOpenClose($phpcsFile, $stackPtr); - - if ($openClose === false) { - // Not a short list, live coding or parse error. - return; - } - - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'yes'); - - $fix = $phpcsFile->addFixableError('Short list syntax is not allowed', $stackPtr, 'Found'); - - if ($fix === true) { - $opener = $openClose['opener']; - $closer = $openClose['closer']; - - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($opener, 'list('); - $phpcsFile->fixer->replaceToken($closer, ')'); - $phpcsFile->fixer->endChangeset(); - } - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Namespaces/DisallowCurlyBraceSyntaxSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Namespaces/DisallowCurlyBraceSyntaxSniff.php deleted file mode 100644 index 3b6ad98..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Namespaces/DisallowCurlyBraceSyntaxSniff.php +++ /dev/null @@ -1,81 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\Namespaces; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHPCSUtils\Utils\Namespaces; - -/** - * Disallow the use of namespace declarations using the curly brace syntax. - * - * @since 1.0.0 - */ -final class DisallowCurlyBraceSyntaxSniff implements Sniff -{ - - /** - * Name of the metric. - * - * @since 1.0.0 - * - * @var string - */ - const METRIC_NAME = 'Namespace declaration using curly brace syntax'; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - return [\T_NAMESPACE]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if (Namespaces::isDeclaration($phpcsFile, $stackPtr) === false) { - // Namespace operator, not a declaration; or live coding/parse error. - return; - } - - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['scope_condition']) === false - || $tokens[$stackPtr]['scope_condition'] !== $stackPtr - ) { - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'no'); - return; - } - - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'yes'); - - $phpcsFile->addError( - 'Namespace declarations using the curly brace syntax are not allowed.', - $stackPtr, - 'Forbidden' - ); - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Namespaces/DisallowDeclarationWithoutNameSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Namespaces/DisallowDeclarationWithoutNameSniff.php deleted file mode 100644 index 5348e70..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Namespaces/DisallowDeclarationWithoutNameSniff.php +++ /dev/null @@ -1,80 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\Namespaces; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHPCSUtils\Utils\Namespaces; - -/** - * Forbids the use of namespace declarations without a namespace name. - * - * @since 1.0.0 - */ -final class DisallowDeclarationWithoutNameSniff implements Sniff -{ - - /** - * Name of the metric. - * - * @since 1.0.0 - * - * @var string - */ - const METRIC_NAME = 'Namespace declaration declares a name'; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - return [\T_NAMESPACE]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $name = Namespaces::getDeclaredName($phpcsFile, $stackPtr); - if ($name === false) { - // Use of the namespace keyword as an operator or live coding/parse error. - return; - } - - if ($name !== '') { - // Named namespace. - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'yes'); - return; - } - - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'no'); - - // Namespace declaration without namespace name (= global namespace). - $phpcsFile->addError( - 'Namespace declarations without a namespace name are not allowed.', - $stackPtr, - 'Forbidden' - ); - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Namespaces/EnforceCurlyBraceSyntaxSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Namespaces/EnforceCurlyBraceSyntaxSniff.php deleted file mode 100644 index 78fa326..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Namespaces/EnforceCurlyBraceSyntaxSniff.php +++ /dev/null @@ -1,81 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\Namespaces; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHPCSUtils\Utils\Namespaces; - -/** - * Enforce the use of namespace declarations using the curly brace syntax. - * - * @since 1.0.0 - */ -final class EnforceCurlyBraceSyntaxSniff implements Sniff -{ - - /** - * Name of the metric. - * - * @since 1.0.0 - * - * @var string - */ - const METRIC_NAME = 'Namespace declaration using curly brace syntax'; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - return [\T_NAMESPACE]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if (Namespaces::isDeclaration($phpcsFile, $stackPtr) === false) { - // Namespace operator, not a declaration; or live coding/parse error. - return; - } - - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['scope_condition']) === true - && $tokens[$stackPtr]['scope_condition'] === $stackPtr - ) { - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'yes'); - return; - } - - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'no'); - - $phpcsFile->addError( - 'Namespace declarations without curly braces are not allowed.', - $stackPtr, - 'Forbidden' - ); - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Namespaces/OneDeclarationPerFileSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Namespaces/OneDeclarationPerFileSniff.php deleted file mode 100644 index 65f3e58..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Namespaces/OneDeclarationPerFileSniff.php +++ /dev/null @@ -1,96 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\Namespaces; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHPCSUtils\Utils\Namespaces; - -/** - * Disallow having more than one namespace declaration in a file. - * - * @since 1.0.0 - */ -final class OneDeclarationPerFileSniff implements Sniff -{ - - /** - * Current file being scanned. - * - * @since 1.0.0 - * - * @var string - */ - private $currentFile; - - /** - * Stack pointer to the first namespace declaration seen in the file. - * - * @since 1.0.0 - * - * @var int|false - */ - private $declarationSeen = false; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - return [\T_NAMESPACE]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $fileName = $phpcsFile->getFilename(); - if ($this->currentFile !== $fileName) { - // Reset the properties for each new file. - $this->currentFile = $fileName; - $this->declarationSeen = false; - } - - if (Namespaces::isDeclaration($phpcsFile, $stackPtr) === false) { - // Namespace operator, not a declaration; or live coding/parse error. - return; - } - - if ($this->declarationSeen === false) { - // This is the first namespace declaration in the file. - $this->declarationSeen = $stackPtr; - return; - } - - $tokens = $phpcsFile->getTokens(); - - // OK, so this is a file with multiple namespace declarations. - $phpcsFile->addError( - 'There should be only one namespace declaration per file. The first declaration was found on line %d', - $stackPtr, - 'MultipleFound', - [$tokens[$this->declarationSeen]['line']] - ); - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/NamingConventions/NoReservedKeywordParameterNamesSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/NamingConventions/NoReservedKeywordParameterNamesSniff.php deleted file mode 100644 index 7815e7e..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/NamingConventions/NoReservedKeywordParameterNamesSniff.php +++ /dev/null @@ -1,190 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\NamingConventions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHPCSUtils\Tokens\Collections; -use PHPCSUtils\Utils\FunctionDeclarations; - -/** - * Verifies that parameters in function declarations do not use PHP reserved keywords - * as this can lead to confusing code when using PHP 8.0+ named parameters in function calls. - * - * Note: while parameters (variables) are case-sensitive in PHP, keywords are not, - * so this sniff checks for the keywords used in parameter names in a - * case-insensitive manner to make this sniff independent of code style rules - * regarding the case for parameter names. - * - * @link https://www.php.net/manual/en/reserved.keywords.php - * - * @since 1.0.0 - */ -final class NoReservedKeywordParameterNamesSniff implements Sniff -{ - - /** - * A list of PHP reserved keywords. - * - * @since 1.0.0 - * - * @var array<string, string> Key is the lowercased keyword, value the "proper" cased keyword. - */ - private $reservedNames = [ - 'abstract' => 'abstract', - 'and' => 'and', - 'array' => 'array', - 'as' => 'as', - 'break' => 'break', - 'callable' => 'callable', - 'case' => 'case', - 'catch' => 'catch', - 'class' => 'class', - 'clone' => 'clone', - 'const' => 'const', - 'continue' => 'continue', - 'declare' => 'declare', - 'default' => 'default', - 'die' => 'die', - 'do' => 'do', - 'echo' => 'echo', - 'else' => 'else', - 'elseif' => 'elseif', - 'empty' => 'empty', - 'enddeclare' => 'enddeclare', - 'endfor' => 'endfor', - 'endforeach' => 'endforeach', - 'endif' => 'endif', - 'endswitch' => 'endswitch', - 'endwhile' => 'endwhile', - 'enum' => 'enum', - 'eval' => 'eval', - 'exit' => 'exit', - 'extends' => 'extends', - 'final' => 'final', - 'finally' => 'finally', - 'fn' => 'fn', - 'for' => 'for', - 'foreach' => 'foreach', - 'function' => 'function', - 'global' => 'global', - 'goto' => 'goto', - 'if' => 'if', - 'implements' => 'implements', - 'include' => 'include', - 'include_once' => 'include_once', - 'instanceof' => 'instanceof', - 'insteadof' => 'insteadof', - 'interface' => 'interface', - 'isset' => 'isset', - 'list' => 'list', - 'match' => 'match', - 'namespace' => 'namespace', - 'new' => 'new', - 'or' => 'or', - 'print' => 'print', - 'private' => 'private', - 'protected' => 'protected', - 'public' => 'public', - 'readonly' => 'readonly', - 'require' => 'require', - 'require_once' => 'require_once', - 'return' => 'return', - 'static' => 'static', - 'switch' => 'switch', - 'throw' => 'throw', - 'trait' => 'trait', - 'try' => 'try', - 'unset' => 'unset', - 'use' => 'use', - 'var' => 'var', - 'while' => 'while', - 'xor' => 'xor', - 'yield' => 'yield', - '__class__' => '__CLASS__', - '__dir__' => '__DIR__', - '__file__' => '__FILE__', - '__function__' => '__FUNCTION__', - '__line__' => '__LINE__', - '__method__' => '__METHOD__', - '__namespace__' => '__NAMESPACE__', - '__trait__' => '__TRAIT__', - 'int' => 'int', - 'float' => 'float', - 'bool' => 'bool', - 'string' => 'string', - 'true' => 'true', - 'false' => 'false', - 'null' => 'null', - 'void' => 'void', - 'iterable' => 'iterable', - 'object' => 'object', - 'resource' => 'resource', - 'mixed' => 'mixed', - 'numeric' => 'numeric', - 'never' => 'never', - - /* - * Not reserved keywords, but equally confusing when used in the context of function calls - * with named parameters. - */ - 'parent' => 'parent', - 'self' => 'self', - ]; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - return Collections::functionDeclarationTokens(); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - // Get all parameters from method signature. - $parameters = FunctionDeclarations::getParameters($phpcsFile, $stackPtr); - if (empty($parameters)) { - return; - } - - $message = 'It is recommended not to use reserved keyword "%s" as function parameter name. Found: %s'; - - foreach ($parameters as $param) { - $name = \ltrim($param['name'], '$'); - $nameLC = \strtolower($name); - if (isset($this->reservedNames[$nameLC]) === true) { - $errorCode = $nameLC . 'Found'; - $data = [ - $this->reservedNames[$nameLC], - $param['name'], - ]; - - $phpcsFile->addWarning($message, $param['token'], $errorCode, $data); - } - } - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/OOStructures/AlphabeticExtendsImplementsSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/OOStructures/AlphabeticExtendsImplementsSniff.php deleted file mode 100644 index 1ffe051..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/OOStructures/AlphabeticExtendsImplementsSniff.php +++ /dev/null @@ -1,275 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\OOStructures; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Tokens\Collections; -use PHPCSUtils\Utils\ObjectDeclarations; - -/** - * Verifies that the interface names used in a class/enum "implements" statement or an interface "extends" statement, - * are listed in alphabetic order. - * - * @since 1.0.0 - */ -final class AlphabeticExtendsImplementsSniff implements Sniff -{ - - /** - * Name of the "Alphabetically ordered" metric. - * - * @since 1.0.0 - * - * @var string - */ - const METRIC_NAME_ALPHA = 'Interface names in implements/extends ordered alphabetically (%s)'; - - /** - * Name of the "interface count" metric. - * - * @since 1.0.0 - * - * @var string - */ - const METRIC_NAME_COUNT = 'Number of interfaces being implemented/extended'; - - /** - * The sort order to use for the statement. - * - * If all names used are unqualified, the sort order won't make a difference. - * However, if one or more of the names are partially or fully qualified, the chosen - * sort order will determine how the sorting between unqualified, partially and - * fully qualified names is handled. - * - * The sniff supports two sort order options: - * - 'name' : sort by the interface name only (default); - * - 'full' : sort by the full name as used in the statement (without leading backslash). - * - * In both cases, the sorting will be done using natural sort, case-insensitive. - * - * Example: - * <code> - * class Foo implements \Vendor\DiffIterator, My\Count, DateTimeInterface {} - * </code> - * - * If sorted using the "name" sort-order, the sniff looks just at the interface name, i.e. - * `DiffIterator`, `Count` and `DateTimeInterface`, which for this example would mean - * the correct order would be `My\Count, DateTimeInterface, \Vendor\DiffIterator`. - * - * If sorted using the "full" sort-order, the sniff will look at the full name as used - * in the `implements` statement, without leading backslashes. - * For the example above, this would mean that the correct order would be: - * `DateTimeInterface, My\Count, \Vendor\DiffIterator`. - * - * @since 1.0.0 - * - * @var string - */ - public $orderby = 'name'; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - return (Collections::ooCanExtend() + Collections::ooCanImplement()); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - /* - * Validate the setting. - */ - if ($this->orderby !== 'full') { - // Use the default. - $this->orderby = 'name'; - } - $metricNameAlpha = \sprintf(self::METRIC_NAME_ALPHA, $this->orderby); - - $tokens = $phpcsFile->getTokens(); - if (isset($tokens[$stackPtr]['scope_opener']) === false) { - // Parse error or live coding. Ignore. - return; - } - - $scopeOpener = $tokens[$stackPtr]['scope_opener']; - - /* - * Get the names. - */ - if (isset(Collections::ooCanImplement()[$tokens[$stackPtr]['code']]) === true) { - $names = ObjectDeclarations::findImplementedInterfaceNames($phpcsFile, $stackPtr); - } else { - $names = ObjectDeclarations::findExtendedInterfaceNames($phpcsFile, $stackPtr); - } - - if (\is_array($names) === false) { - // Class/interface/enum doesn't extend or implement. - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME_COUNT, 0); - $phpcsFile->recordMetric($stackPtr, $metricNameAlpha, 'n/a'); - return; - } - - $count = \count($names); - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME_COUNT, $count); - - if ($count < 2) { - // Nothing to sort. - $phpcsFile->recordMetric($stackPtr, $metricNameAlpha, 'n/a'); - return; - } - - /* - * Check the order. - */ - if ($this->orderby === 'name') { - $sorted = $this->sortByName($names); - } else { - $sorted = $this->sortByFull($names); - } - - if ($sorted === $names) { - // Order is already correct. - $phpcsFile->recordMetric($stackPtr, $metricNameAlpha, 'yes'); - return; - } - - $phpcsFile->recordMetric($stackPtr, $metricNameAlpha, 'no'); - - /* - * Throw the error. - */ - $keyword = \T_IMPLEMENTS; - if (isset(Collections::ooCanImplement()[$tokens[$stackPtr]['code']]) === false) { - $keyword = \T_EXTENDS; - } - - $fixable = true; - $keywordPtr = $phpcsFile->findNext($keyword, ($stackPtr + 1), $scopeOpener); - $hasComment = $phpcsFile->findNext(Tokens::$commentTokens, ($keywordPtr + 1), $scopeOpener); - if ($hasComment !== false) { - $fixable = false; - } - - $error = "The interface names in a \"%s %s\" statement should be ordered alphabetically.\n"; - $error .= 'Expected: %s; Found: %s'; - $code = \ucfirst(\strtolower($tokens[$keywordPtr]['content'])) . 'WrongOrder'; - $data = [ - $tokens[$stackPtr]['content'], - $tokens[$keywordPtr]['content'], - \implode(', ', $sorted), - \implode(', ', $names), - ]; - - if ($fixable === false) { - $code .= 'WithComments'; - $phpcsFile->addError($error, $keywordPtr, $code, $data); - return; - } - - // OK, so we appear to have a fixable error. - $fix = $phpcsFile->addFixableError($error, $keywordPtr, $code, $data); - if ($fix === false) { - return; - } - - $phpcsFile->fixer->beginChangeset(); - - // Remove the complete previous extends/implements part. - for ($i = ($keywordPtr + 1); $i < $scopeOpener; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->addContent($keywordPtr, ' ' . \implode(', ', $sorted) . ' '); - - $phpcsFile->fixer->endChangeset(); - } - - /** - * Sort an array of potentially mixed qualified and unqualified names by the interface name. - * - * @since 1.0.0 - * - * @param string[] $names Interface names, potentially mixed qualified and unqualified. - * - * @return string[] - */ - protected function sortByName(array $names) - { - $getLastName = function ($name) { - $last = \strrchr($name, '\\'); - if ($last === false) { - $last = $name; - } else { - $last = \substr($last, 1); - } - - return $last; - }; - - return $this->sortNames($names, $getLastName); - } - - /** - * Sort an array of potentially mixed qualified and unqualified names by the full name. - * - * @since 1.0.0 - * - * @param string[] $names Interface names, potentially mixed qualified and unqualified. - * - * @return string[] - */ - protected function sortByFull(array $names) - { - $trimLeadingBackslash = function ($name) { - return \ltrim($name, '\\'); - }; - - return $this->sortNames($names, $trimLeadingBackslash); - } - - /** - * Sort an array of names. - * - * @since 1.0.0 - * - * @param string[] $names Interface names, potentially mixed qualified and unqualified. - * @param callable $prepareNames Function to call to prepare the names before sorting. - * - * @return string[] - */ - private function sortNames(array $names, callable $prepareNames) - { - $preppedNames = \array_map($prepareNames, $names); - $names = \array_combine($names, $preppedNames); - - \natcasesort($names); - - return \array_keys($names); - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Operators/ConcatPositionSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Operators/ConcatPositionSniff.php deleted file mode 100644 index 1a03576..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Operators/ConcatPositionSniff.php +++ /dev/null @@ -1,203 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2023 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\Operators; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -/** - * Enforces that the concatenation operator in multi-line concatenations is in a preferred position, - * either always at the start of the next line or always at the end of the previous line. - * - * Note: this sniff has no opinion on spacing before/after the concatenation operator. - * It will normalize based on the "one space before/after" PSR-12 industry standard. - * If different spacing is preferred, use the `Squiz.Strings.ConcatenationSpacing` to enforce/correct that. - * - * @since 1.2.0 - */ -final class ConcatPositionSniff implements Sniff -{ - - /** - * The phrase to use for the metric recorded by this sniff. - * - * @since 1.2.0 - * - * @var string - */ - const METRIC_NAME = 'Multi-line concatenation operator position'; - - /** - * Position indication: start of next line. - * - * @since 1.2.0 - * - * @var string - */ - const POSITION_START = 'start'; - - /** - * Position indication: end of previous line. - * - * @since 1.2.0 - * - * @var string - */ - const POSITION_END = 'end'; - - /** - * Position indication: neither start of next line nor end of previous line. - * - * @since 1.2.0 - * - * @var string - */ - const POSITION_STANDALONE = 'stand-alone'; - - /** - * Preferred position for the concatenation operator. - * - * Valid values are: 'start' and 'end'. - * Defaults to 'start'. - * - * @since 1.2.0 - * - * @var string - */ - public $allowOnly = self::POSITION_START; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.2.0 - * - * @return array<int|string> - */ - public function register() - { - return [\T_STRING_CONCAT]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.2.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - /* - * Validate the setting. - */ - if ($this->allowOnly !== self::POSITION_END) { - // Use the default. - $this->allowOnly = self::POSITION_START; - } - - $prevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - - if ($nextNonEmpty === false) { - // Parse error/live coding. - return; - } - - $tokens = $phpcsFile->getTokens(); - if ($tokens[$prevNonEmpty]['line'] === $tokens[$nextNonEmpty]['line']) { - // Not multi-line concatenation. Not our target. - return; - } - - $position = self::POSITION_STANDALONE; - if ($tokens[$prevNonEmpty]['line'] === $tokens[$stackPtr]['line']) { - $position = self::POSITION_END; - } elseif ($tokens[$nextNonEmpty]['line'] === $tokens[$stackPtr]['line']) { - $position = self::POSITION_START; - } - - // Record metric. - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, $position); - - if ($this->allowOnly === $position) { - // All okay. - return; - } - - $fix = $phpcsFile->addFixableError( - 'The concatenation operator for multi-line concatenations should always be at the %s of a line.', - $stackPtr, - 'Incorrect', - [$this->allowOnly] - ); - - if ($fix === true) { - if ($this->allowOnly === self::POSITION_END) { - $phpcsFile->fixer->beginChangeset(); - - // Move the concat operator. - $phpcsFile->fixer->replaceToken($stackPtr, ''); - $phpcsFile->fixer->addContent($prevNonEmpty, ' .'); - - if ($position === self::POSITION_START - && $tokens[($stackPtr + 1)]['code'] === \T_WHITESPACE - ) { - // Remove trailing space. - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ''); - } elseif ($position === self::POSITION_STANDALONE) { - // Remove potential indentation space. - if ($tokens[($stackPtr - 1)]['code'] === \T_WHITESPACE) { - $phpcsFile->fixer->replaceToken(($stackPtr - 1), ''); - } - - // Remove new line. - if ($tokens[($stackPtr + 1)]['code'] === \T_WHITESPACE) { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ''); - } - } - - $phpcsFile->fixer->endChangeset(); - return; - } - - // Fixer for allowOnly === self::POSITION_START. - $phpcsFile->fixer->beginChangeset(); - - // Move the concat operator. - $phpcsFile->fixer->replaceToken($stackPtr, ''); - $phpcsFile->fixer->addContentBefore($nextNonEmpty, '. '); - - if ($position === self::POSITION_END - && $tokens[($stackPtr - 1)]['code'] === \T_WHITESPACE - ) { - // Remove trailing space. - $phpcsFile->fixer->replaceToken(($stackPtr - 1), ''); - } elseif ($position === self::POSITION_STANDALONE) { - // Remove potential indentation space. - if ($tokens[($stackPtr - 1)]['code'] === \T_WHITESPACE) { - $phpcsFile->fixer->replaceToken(($stackPtr - 1), ''); - } - - // Remove new line. - if ($tokens[($stackPtr + 1)]['code'] === \T_WHITESPACE) { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ''); - } - } - - $phpcsFile->fixer->endChangeset(); - } - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Operators/DisallowLogicalAndOrSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Operators/DisallowLogicalAndOrSniff.php deleted file mode 100644 index 19e4971..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Operators/DisallowLogicalAndOrSniff.php +++ /dev/null @@ -1,112 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\Operators; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -/** - * Enforce the use of the boolean `&&` and `||` operators instead of the logical `and`/`or` operators. - * - * Note: as the {@link https://www.php.net/manual/en/language.operators.precedence.php operator precedence} - * of the logical operators is significantly lower than the operator precedence of boolean operators, - * this sniff does not contain an auto-fixer. - * - * @since 1.0.0 - */ -final class DisallowLogicalAndOrSniff implements Sniff -{ - - /** - * Name of the metric. - * - * @since 1.0.0 - * - * @var string - */ - const METRIC_NAME = 'Type of and/or operator used'; - - /** - * The tokens this sniff records metrics for. - * - * @since 1.0.0 - * - * @var array<int|string, string> - */ - private $metricType = [ - \T_LOGICAL_AND => 'logical (and/or)', - \T_LOGICAL_OR => 'logical (and/or)', - \T_BOOLEAN_AND => 'boolean (&&/||)', - \T_BOOLEAN_OR => 'boolean (&&/||)', - ]; - - /** - * The tokens this sniff targets with error code and replacements. - * - * @since 1.0.0 - * - * @var array<int|string, array<string, string>> - */ - private $targetTokenInfo = [ - \T_LOGICAL_AND => [ - 'error_code' => 'LogicalAnd', - 'replacement' => '&&', - ], - \T_LOGICAL_OR => [ - 'error_code' => 'LogicalOr', - 'replacement' => '||', - ], - ]; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - return \array_keys($this->metricType); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $tokenCode = $tokens[$stackPtr]['code']; - - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, $this->metricType[$tokenCode]); - - if (isset($this->targetTokenInfo[$tokenCode]) === false) { - // Already using boolean operator. - return; - } - - $error = 'Using logical operators is not allowed. Expected: "%s"; Found: "%s"'; - $data = [ - $this->targetTokenInfo[$tokenCode]['replacement'], - $tokens[ $stackPtr ]['content'], - ]; - - $phpcsFile->addError($error, $stackPtr, $this->targetTokenInfo[$tokenCode]['error_code'], $data); - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Operators/DisallowShortTernarySniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Operators/DisallowShortTernarySniff.php deleted file mode 100644 index 37a39a1..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Operators/DisallowShortTernarySniff.php +++ /dev/null @@ -1,76 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\Operators; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHPCSUtils\Utils\Operators; - -/** - * Disallow the use of short ternaries. - * - * While short ternaries are useful when used correctly, the principle of them is - * often misunderstood and they are more often than not used incorrectly, leading to - * hard to debug issues and/or PHP warnings/notices. - * - * @since 1.0.0 - */ -final class DisallowShortTernarySniff implements Sniff -{ - - /** - * Name of the metric. - * - * @since 1.0.0 - * - * @var string - */ - const METRIC_NAME = 'Ternary usage'; - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - return [\T_INLINE_THEN]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if (Operators::isShortTernary($phpcsFile, $stackPtr) === false) { - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'long'); - return; - } - - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'short'); - - $phpcsFile->addError( - 'Using short ternaries is not allowed as they are rarely used correctly', - $stackPtr, - 'Found' - ); - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Operators/DisallowStandalonePostIncrementDecrementSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Operators/DisallowStandalonePostIncrementDecrementSniff.php deleted file mode 100644 index b853888..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Operators/DisallowStandalonePostIncrementDecrementSniff.php +++ /dev/null @@ -1,197 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\Operators; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\BackCompat\BCFile; -use PHPCSUtils\Tokens\Collections; -use PHPCSUtils\Utils\GetTokensAsString; - -/** - * Disallow the use of post-in/decrements in stand-alone statements and discourage the use of - * multiple increment/decrement operators in a stand-alone statement. - * - * Post-in/decrement returns the value and in/decrements afterwards. - * Pre-in/decrement in/decrements the value and returns afterwards. - * Using pre-in/decrement is more in line with the principle of least astonishment - * and prevents bugs when code gets moved around at a later point in time. - * - * @since 1.0.0 - */ -final class DisallowStandalonePostIncrementDecrementSniff implements Sniff -{ - - /** - * Name of the metric. - * - * @since 1.0.0 - * - * @var string - */ - const METRIC_NAME = 'In/decrement usage in stand-alone statements'; - - /** - * Tokens which can be expected in a stand-alone in/decrement statement. - * - * {@internal This array is enriched in the register() method.} - * - * @since 1.0.0 - * - * @var array<int|string> - */ - private $allowedTokens = [ - \T_VARIABLE => \T_VARIABLE, - ]; - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - $this->allowedTokens += Collections::ooHierarchyKeywords(); - $this->allowedTokens += Collections::objectOperators(); - $this->allowedTokens += Collections::namespacedNameTokens(); - - /* - * Remove nullsafe object operator. In/decrement not allowed in write context, - * so ignore. - */ - unset($this->allowedTokens[\T_NULLSAFE_OBJECT_OPERATOR]); - - return Collections::incrementDecrementOperators(); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (empty($tokens[$stackPtr]['nested_parenthesis']) === false) { - // Not a stand-alone statement. - return; - } - - $start = BCFile::findStartOfStatement($phpcsFile, $stackPtr); - $end = BCFile::findEndOfStatement($phpcsFile, $stackPtr); - - if (isset(Collections::incrementDecrementOperators()[$tokens[$end]['code']])) { - // Statement ends on a PHP close tag, set the end pointer to the close tag. - $end = $phpcsFile->findNext(Tokens::$emptyTokens, ($end + 1), null, true); - } - - if ($tokens[$end]['code'] !== \T_SEMICOLON - && $tokens[$end]['code'] !== \T_CLOSE_TAG - ) { - // Not a stand-alone statement. - return $end; - } - - $counter = 0; - $lastCode = null; - $operators = Collections::incrementDecrementOperators(); - for ($i = $start; $i < $end; $i++) { - if (isset(Tokens::$emptyTokens[$tokens[$i]['code']]) === true) { - continue; - } - - if (isset($operators[$tokens[$i]['code']]) === true) { - $lastCode = $tokens[$i]['code']; - ++$counter; - continue; - } - - if (isset($this->allowedTokens[$tokens[$i]['code']]) === true) { - $lastCode = $tokens[$i]['code']; - continue; - } - - if ($tokens[$i]['code'] === \T_OPEN_SQUARE_BRACKET - && isset($tokens[$i]['bracket_closer']) - && ($lastCode === \T_VARIABLE || $lastCode === \T_STRING) - ) { - // Array access. - $i = $tokens[$i]['bracket_closer']; - continue; - } - - // Came across an unexpected token. This is (probably) not a stand-alone statement. - return $end; - } - - if ($counter > 1) { - $phpcsFile->addWarning( - 'Using multiple increment/decrement operators in a stand-alone statement is strongly discouraged.' - . ' Found: %s', - $stackPtr, - 'MultipleOperatorsFound', - [GetTokensAsString::compact($phpcsFile, $start, ($end - 1), true)] - ); - - return $end; - } - - $type = 'increment'; - if ($tokens[$stackPtr]['code'] === \T_DEC) { - $type = 'decrement'; - } - - $lastNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($end - 1), $start, true); - if ($start === $stackPtr && $lastNonEmpty !== $stackPtr) { - // This is already pre-in/decrement. - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'pre-' . $type); - return $end; - } - - if ($lastNonEmpty === false || $lastNonEmpty === $start || $lastNonEmpty !== $stackPtr) { - // Parse error or otherwise unsupported syntax. Ignore. - return $end; - } - - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'post-' . $type); - - $error = 'Stand-alone post-%1$s statement found. Use pre-%1$s instead: %2$s.'; - $errorCode = 'Post' . \ucfirst($type) . 'Found'; - $replacement = $tokens[$stackPtr]['content']; - $replacement .= GetTokensAsString::compact($phpcsFile, $start, ($lastNonEmpty - 1), true); - $data = [ - $type, - $replacement, - ]; - - $fix = $phpcsFile->addFixableError($error, $stackPtr, $errorCode, $data); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($stackPtr, ''); - $phpcsFile->fixer->addContentBefore($start, $tokens[$stackPtr]['content']); - $phpcsFile->fixer->endChangeset(); - } - - return $end; - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Operators/StrictComparisonsSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Operators/StrictComparisonsSniff.php deleted file mode 100644 index c828df9..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Operators/StrictComparisonsSniff.php +++ /dev/null @@ -1,116 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\Operators; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -/** - * Enforce the use of strict comparisons. - * - * Warning: the auto-fixer for this sniff _may_ cause bugs in applications and should be used with care! - * This is considered a _risky_ fix. - * - * @since 1.0.0 - */ -final class StrictComparisonsSniff implements Sniff -{ - - /** - * Name of the metric. - * - * @since 1.0.0 - * - * @var string - */ - const METRIC_NAME = 'Type of comparison used'; - - /** - * The tokens this sniff records metrics for. - * - * @since 1.0.0 - * - * @var array<int|string, string> - */ - private $metricType = [ - \T_IS_EQUAL => 'loose', - \T_IS_NOT_EQUAL => 'loose', - \T_IS_IDENTICAL => 'strict', - \T_IS_NOT_IDENTICAL => 'strict', - ]; - - /** - * The tokens this sniff targets with error code and replacements. - * - * @since 1.0.0 - * - * @var array<int|string, array<string, string>> - */ - private $targetTokenInfo = [ - \T_IS_EQUAL => [ - 'error_code' => 'LooseEqual', - 'replacement' => '===', - ], - \T_IS_NOT_EQUAL => [ - 'error_code' => 'LooseNotEqual', - 'replacement' => '!==', - ], - ]; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - return \array_keys($this->metricType); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $tokenCode = $tokens[$stackPtr]['code']; - - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, $this->metricType[$tokenCode]); - - if (isset($this->targetTokenInfo[$tokenCode]) === false) { - // Already using strict comparison operator. - return; - } - - $error = 'Loose comparisons are not allowed. Expected: "%s"; Found: "%s"'; - $data = [ - $this->targetTokenInfo[$tokenCode]['replacement'], - $tokens[ $stackPtr ]['content'], - ]; - - $fix = $phpcsFile->addFixableError($error, $stackPtr, $this->targetTokenInfo[$tokenCode]['error_code'], $data); - if ($fix === false) { - return; - } - - $phpcsFile->fixer->replaceToken($stackPtr, $this->targetTokenInfo[$tokenCode]['replacement']); - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Operators/TypeSeparatorSpacingSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Operators/TypeSeparatorSpacingSniff.php deleted file mode 100644 index 34d9c47..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/Operators/TypeSeparatorSpacingSniff.php +++ /dev/null @@ -1,148 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\Operators; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Fixers\SpacesFixer; -use PHPCSUtils\Tokens\Collections; - -/** - * Enforce spacing rules around union, intersection and DNF type separators. - * - * @since 1.0.0 - * @since 1.3.0 Support for DNF types. - */ -final class TypeSeparatorSpacingSniff implements Sniff -{ - - /** - * Tokens this sniff targets. - * - * @since 1.3.0 - * - * @var array<int|string, int|string> - */ - private $targetTokens = [ - \T_TYPE_UNION => \T_TYPE_UNION, - \T_TYPE_INTERSECTION => \T_TYPE_INTERSECTION, - \T_TYPE_OPEN_PARENTHESIS => \T_TYPE_OPEN_PARENTHESIS, - \T_TYPE_CLOSE_PARENTHESIS => \T_TYPE_CLOSE_PARENTHESIS, - ]; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - return $this->targetTokens; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $type = 'union'; - $code = 'UnionType'; - if ($tokens[$stackPtr]['code'] === \T_TYPE_INTERSECTION) { - $type = 'intersection'; - $code = 'IntersectionType'; - } elseif ($tokens[$stackPtr]['code'] === \T_TYPE_OPEN_PARENTHESIS) { - $type = 'DNF parenthesis open'; - $code = 'DNFOpen'; - } elseif ($tokens[$stackPtr]['code'] === \T_TYPE_CLOSE_PARENTHESIS) { - $type = 'DNF parenthesis close'; - $code = 'DNFClose'; - } - - $expectedSpaces = 0; - $prevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($tokens[$stackPtr]['code'] === \T_TYPE_OPEN_PARENTHESIS) { - if ($tokens[$prevNonEmpty]['code'] === \T_COLON - || $tokens[$prevNonEmpty]['code'] === \T_CONST - || isset(Collections::propertyModifierKeywords()[$tokens[$prevNonEmpty]['code']]) === true - ) { - // Start of return type or property/const type. Always demand 1 space. - $expectedSpaces = 1; - } - - if ($tokens[$prevNonEmpty]['code'] === \T_OPEN_PARENTHESIS - || $tokens[$prevNonEmpty]['code'] === \T_COMMA - ) { - // Start of parameter type. Allow new line/indent before. - if ($tokens[$prevNonEmpty]['line'] === $tokens[$stackPtr]['line']) { - $expectedSpaces = 1; - } else { - $expectedSpaces = 'skip'; - } - } - } - - if (isset($this->targetTokens[$tokens[$prevNonEmpty]['code']]) === true) { - // Prevent duplicate errors when there are two adjacent operators. - $expectedSpaces = 'skip'; - } - - if ($expectedSpaces !== 'skip') { - SpacesFixer::checkAndFix( - $phpcsFile, - $stackPtr, - $prevNonEmpty, - $expectedSpaces, - 'Expected %s before the ' . $type . ' type separator. Found: %s', - $code . 'SpacesBefore', - 'error', - 0, // Severity. - 'Space before ' . $type . ' type separator' - ); - } - - $expectedSpaces = 0; - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($tokens[$stackPtr]['code'] === \T_TYPE_CLOSE_PARENTHESIS) { - if ($tokens[$nextNonEmpty]['code'] === \T_OPEN_CURLY_BRACKET - || $tokens[$nextNonEmpty]['code'] === \T_VARIABLE - || $tokens[$nextNonEmpty]['code'] === \T_STRING - ) { - // End of return type, parameter or property/const type. Always demand 1 space. - $expectedSpaces = 1; - } - } - - SpacesFixer::checkAndFix( - $phpcsFile, - $stackPtr, - $nextNonEmpty, - $expectedSpaces, - 'Expected %s after the ' . $type . ' type separator. Found: %s', - $code . 'SpacesAfter', - 'error', - 0, // Severity. - 'Space after ' . $type . ' type separator' - ); - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/PHP/DisallowExitDieParenthesesSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/PHP/DisallowExitDieParenthesesSniff.php deleted file mode 100644 index 2fa0a2c..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/PHP/DisallowExitDieParenthesesSniff.php +++ /dev/null @@ -1,110 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\PHP; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -/** - * Forbids calling `exit`/`die` with parentheses, except when the `$status` parameter is passed. - * - * @since 1.5.0 - */ -final class DisallowExitDieParenthesesSniff implements Sniff -{ - - /** - * Name of the metric. - * - * @since 1.5.0 - * - * @var string - */ - const METRIC_NAME = 'Exit/die with parentheses'; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.5.0 - * - * @return array<int|string> - */ - public function register() - { - return [\T_EXIT]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.5.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($nextNonEmpty === false) { - // Live coding. Do not flag (yet). - return; - } - - if ($tokens[$nextNonEmpty]['code'] !== \T_OPEN_PARENTHESIS) { - // No parentheses found. - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'no'); - return; - } - - if (isset($tokens[$nextNonEmpty]['parenthesis_closer']) === false) { - // Incomplete set of parentheses. Ignore. - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'yes'); - return; - } - - $opener = $nextNonEmpty; - $closer = $tokens[$opener]['parenthesis_closer']; - $hasParams = $phpcsFile->findNext(Tokens::$emptyTokens, ($opener + 1), $closer, true); - if ($hasParams !== false) { - // There is something between the parentheses. Ignore. - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'yes, with parameter(s)'); - return; - } - - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'yes'); - - $fix = $phpcsFile->addFixableError( - 'Parentheses not allowed when calling %s without passing parameters', - $stackPtr, - 'Found', - [\strtolower(\ltrim($tokens[$stackPtr]['content'], '\\'))] - ); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - for ($i = ($stackPtr + 1); $i <= $closer; $i++) { - if (isset(Tokens::$commentTokens[$tokens[$i]['code']]) === true) { - continue; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/PHP/LowercasePHPTagSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/PHP/LowercasePHPTagSniff.php deleted file mode 100644 index b231b22..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/PHP/LowercasePHPTagSniff.php +++ /dev/null @@ -1,87 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\PHP; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -/** - * Enforce that the "PHP" in a PHP open tag is lowercase. - * - * @since 1.2.0 - */ -final class LowercasePHPTagSniff implements Sniff -{ - - /** - * Name of the metric. - * - * @since 1.2.0 - * - * @var string - */ - const METRIC_NAME = 'PHP open tag case'; - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @since 1.2.0 - * - * @return array<int> - */ - public function register() - { - return [\T_OPEN_TAG]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.2.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $content = $tokens[$stackPtr]['content']; - $contentLC = \strtolower($content); - - if ($contentLC === $content) { - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'lowercase'); - return; - } - - $errorCode = ''; - if (\strtoupper($content) === $content) { - $errorCode = 'Uppercase'; - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'uppercase'); - } else { - $errorCode = 'Mixedcase'; - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'mixed case'); - } - - $fix = $phpcsFile->addFixableError( - 'The php open tag should be in lowercase. Found: %s', - $stackPtr, - $errorCode, - [\trim($content)] - ); - - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, $contentLC); - } - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/PHP/NoFQNTrueFalseNullSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/PHP/NoFQNTrueFalseNullSniff.php deleted file mode 100644 index e46c903..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/PHP/NoFQNTrueFalseNullSniff.php +++ /dev/null @@ -1,116 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\PHP; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -/** - * Forbids the use of `true`/`false`/`null` as fully qualified constants. - * - * @since 1.3.0 - */ -final class NoFQNTrueFalseNullSniff implements Sniff -{ - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @since 1.3.0 - * - * @return array<int|string> - */ - public function register() - { - $targets = [ - \T_TRUE, - \T_FALSE, - \T_NULL, - ]; - - if (\version_compare(Config::VERSION, '4.0.0', '>=') === true) { - $targets[] = \T_NS_SEPARATOR; - } - - return $targets; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.3.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $content = $tokens[$stackPtr]['content']; - $contentLC = \strtolower($content); - - if ($contentLC === '\true' || $contentLC === '\false' || $contentLC === '\null') { - // PHPCS 4.x. - } elseif ($tokens[$stackPtr]['code'] === \T_NS_SEPARATOR) { - // PHPCS 4.x for code which is a parse error on PHP 8.0+. - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($tokens[$next]['code'] !== \T_STRING) { - return; - } - - $nextContentLC = \strtolower($tokens[$next]['content']); - if ($nextContentLC !== 'true' && $nextContentLC !== 'false' && $nextContentLC !== 'null') { - return; - } - } else { - // PHPCS 3.x. - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($tokens[$prev]['code'] !== \T_NS_SEPARATOR) { - return; - } - - $prevPrev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($prev - 1), null, true); - if ($tokens[$prevPrev]['code'] === \T_STRING || $tokens[$prevPrev]['code'] === \T_NAMESPACE) { - return; - } - - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($tokens[$next]['code'] === \T_NS_SEPARATOR) { - return; - } - } - - $fix = $phpcsFile->addFixableError( - 'The special PHP constant "%s" should not be fully qualified.', - $stackPtr, - 'Found', - [$contentLC] - ); - - if ($fix === true) { - if ($contentLC === '\true' || $contentLC === '\false' || $contentLC === '\null') { - // PHPCS 4.x. - $phpcsFile->fixer->replaceToken($stackPtr, \ltrim($tokens[$stackPtr]['content'], '\\')); - } elseif ($tokens[$stackPtr]['code'] === \T_NS_SEPARATOR) { - // PHPCS 4.x for code which is a parse error on PHP 8.0+. - $phpcsFile->fixer->replaceToken($stackPtr, ''); - } else { - // PHPCS 3.x. - $phpcsFile->fixer->replaceToken($prev, ''); - } - } - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/PHP/OneStatementInShortEchoTagSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/PHP/OneStatementInShortEchoTagSniff.php deleted file mode 100644 index d68c38e..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/PHP/OneStatementInShortEchoTagSniff.php +++ /dev/null @@ -1,101 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\PHP; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -/** - * Disallows multiple statements when PHP is opened with a short open echo tag. - * - * When using short open echo tags, PHP will echo out the result of the first statement. - * Subsequent statements will not be echo-ed out, but will be treated as "normal" PHP. - * - * As a best practice, short open echo tags should contain only one statement. - * - * @since 1.0.0 - */ -final class OneStatementInShortEchoTagSniff implements Sniff -{ - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - return [\T_OPEN_TAG_WITH_ECHO]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - for ($endOfStatement = ($stackPtr + 1); $endOfStatement < $phpcsFile->numTokens; $endOfStatement++) { - if ($tokens[$endOfStatement]['code'] === \T_CLOSE_TAG - || $tokens[$endOfStatement]['code'] === \T_SEMICOLON - ) { - break; - } - - // Skip over anything within parenthesis. - if ($tokens[$endOfStatement]['code'] === \T_OPEN_PARENTHESIS - && isset($tokens[$endOfStatement]['parenthesis_closer']) - ) { - $endOfStatement = $tokens[$endOfStatement]['parenthesis_closer']; - } - } - - if ($endOfStatement === $phpcsFile->numTokens - || $tokens[$endOfStatement]['code'] === \T_CLOSE_TAG - ) { - return; - } - - // Semicolon, so check for any code between it and the close tag. - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($endOfStatement + 1), null, true); - if ($nextNonEmpty === false - || $tokens[$nextNonEmpty]['code'] === \T_CLOSE_TAG - ) { - return; - } - - $fix = $phpcsFile->addFixableError( - 'Only one statement is allowed when using short open echo PHP tags.' - . ' Use the "<?php" open tag for multi-statement PHP.', - $nextNonEmpty, - 'MultipleFound' - ); - - if ($fix === true) { - if ($tokens[($stackPtr + 1)]['code'] === \T_WHITESPACE) { - $phpcsFile->fixer->replaceToken($stackPtr, '<?php echo'); - } else { - $phpcsFile->fixer->replaceToken($stackPtr, '<?php echo '); - } - } - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/PHP/RequireExitDieParenthesesSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/PHP/RequireExitDieParenthesesSniff.php deleted file mode 100644 index 47ce20a..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/PHP/RequireExitDieParenthesesSniff.php +++ /dev/null @@ -1,85 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\PHP; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -/** - * Require that `exit`/`die` always be called with parentheses, even if no argument is given. - * - * @since 1.5.0 - */ -final class RequireExitDieParenthesesSniff implements Sniff -{ - - /** - * Name of the metric. - * - * @since 1.5.0 - * - * @var string - */ - const METRIC_NAME = 'Exit/die with parentheses'; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.5.0 - * - * @return array<int|string> - */ - public function register() - { - return [\T_EXIT]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.5.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($nextNonEmpty === false) { - // Live coding. Do not flag (yet). - return; - } - - if ($tokens[$nextNonEmpty]['code'] === \T_OPEN_PARENTHESIS) { - // Parentheses found. - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'yes'); - return; - } - - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'no'); - - $fix = $phpcsFile->addFixableError( - 'Parentheses required when calling %s, even if no argument is given.', - $stackPtr, - 'Missing', - [\strtolower(\ltrim($tokens[$stackPtr]['content'], '\\'))] - ); - - if ($fix === true) { - $phpcsFile->fixer->addContent($stackPtr, '()'); - } - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/UseStatements/DisallowMixedGroupUseSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/UseStatements/DisallowMixedGroupUseSniff.php deleted file mode 100644 index a57d363..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/UseStatements/DisallowMixedGroupUseSniff.php +++ /dev/null @@ -1,252 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\UseStatements; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Utils\GetTokensAsString; -use PHPCSUtils\Utils\UseStatements; - -/** - * Disallow group use statements which combine imports for namespace/OO, functions - * and/or constants in one statement. - * - * Note: the fixer will use a semi-standardized format for group use statements. - * If there are more specific requirements for the formatting of group use statements, - * the ruleset configurator should ensure that additional sniffs are included in the - * ruleset to enforce the required format. - * - * @since 1.1.0 - */ -final class DisallowMixedGroupUseSniff implements Sniff -{ - - /** - * Name of the "Use import source" metric. - * - * @since 1.1.0 - * - * @var string - */ - const METRIC_NAME = 'Import use statement type'; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.1.0 - * - * @return array<int|string> - */ - public function register() - { - return [\T_USE]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.1.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if (UseStatements::isImportUse($phpcsFile, $stackPtr) === false) { - // Closure or trait use statement. Bow out. - return; - } - - $useStatements = UseStatements::splitImportUseStatement($phpcsFile, $stackPtr); - - $ooCount = \count($useStatements['name']); - $functionCount = \count($useStatements['function']); - $constantCount = \count($useStatements['const']); - $totalCount = $ooCount + $functionCount + $constantCount; - - if ($totalCount === 0) { - // There must have been a parse error. Bow out. - return; - } - - // End of statement will always be found, otherwise the import statement parsing would have failed. - $endOfStatement = $phpcsFile->findNext([\T_SEMICOLON, \T_CLOSE_TAG], ($stackPtr + 1)); - $groupStart = $phpcsFile->findNext(\T_OPEN_USE_GROUP, ($stackPtr + 1), $endOfStatement); - - if ($groupStart === false) { - // Not a group use statement. Just record the metric. - if ($totalCount === 1) { - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'single import'); - } else { - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'multi import'); - } - - return; - } - - if ($totalCount === 1 - || ($ooCount !== 0 && $functionCount === 0 && $constantCount === 0) - || ($ooCount === 0 && $functionCount !== 0 && $constantCount === 0) - || ($ooCount === 0 && $functionCount === 0 && $constantCount !== 0) - ) { - // Not a *mixed* group use statement. - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'group use, single type'); - return; - } - - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME, 'group use, multi type'); - - // Build up the error message. - $foundPhrases = []; - if ($ooCount > 1) { - $foundPhrases[] = \sprintf('%d namespaces/OO names', $ooCount); - } elseif ($ooCount === 1) { - $foundPhrases[] = \sprintf('%d namespace/OO name', $ooCount); - } - - if ($functionCount > 1) { - $foundPhrases[] = \sprintf('%d functions', $functionCount); - } elseif ($functionCount === 1) { - $foundPhrases[] = \sprintf('%d function', $functionCount); - } - - if ($constantCount > 1) { - $foundPhrases[] = \sprintf('%d constants', $constantCount); - } elseif ($constantCount === 1) { - $foundPhrases[] = \sprintf('%d constant', $constantCount); - } - - if (\count($foundPhrases) === 2) { - $found = \implode(' and ', $foundPhrases); - } else { - $found = \array_shift($foundPhrases) . ', '; - $found .= \implode(' and ', $foundPhrases); - } - - $error = 'Group use statements should import one type of construct.' - . ' Mixed group use statement found importing %s.'; - $code = 'Found'; - $data = [$found]; - - $hasComment = $phpcsFile->findNext(Tokens::$commentTokens, ($stackPtr + 1), $endOfStatement); - if ($hasComment !== false) { - // Don't attempt to auto-fix is there are comments or PHPCS annotations in the statement. - $phpcsFile->addError($error, $stackPtr, $code, $data); - return; - } - - $fix = $phpcsFile->addFixableError($error, $stackPtr, $code, $data); - - if ($fix === false) { - return; - } - - /* - * Fix it. - * - * This fixer complies with the following (arbitrary) requirements: - * - It will re-use the original base "group" name, i.e. the part before \{, - * though it will remove a potential leading backslash from it. - * - It takes aliases into account, but only when something is aliased to a different name. - * Aliases re-using the original name will be removed. - * - The fix will not add a trailing comma after the last group use sub-statement. - * This is a PHP 7.2+ feature. - * If a standard wants to enforce trailing commas, they should use a separate sniff for that. - * - If there is only 1 statement of a certain type, the replacement will be a single - * import use statement, not a group use statement. - * - If any of the partial use statements within a group contain leading backslashes, - * the sniff will not correct for this. This is a parse error and the fixed version will - * still contain a parse error. - */ - - $phpcsFile->fixer->beginChangeset(); - - // Ensure that a potential close PHP tag ending the statement is not removed. - $tokens = $phpcsFile->getTokens(); - $endRemoval = $endOfStatement; - if ($tokens[$endOfStatement]['code'] !== \T_SEMICOLON) { - $endRemoval = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($endOfStatement - 1), null, true); - } - - // Remove old statement with the exception of the `use` keyword. - for ($i = ($stackPtr + 1); $i <= $endRemoval; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - // Build up the new use import statements. - $newStatements = []; - - $useIndent = \str_repeat(' ', ($tokens[$stackPtr]['column'] - 1)); - $insideIndent = $useIndent . \str_repeat(' ', 4); - - $baseGroupName = \ltrim(GetTokensAsString::noEmpties($phpcsFile, ($stackPtr + 1), ($groupStart - 1)), '\\'); - - foreach ($useStatements as $type => $statements) { - $count = \count($statements); - if ($count === 0) { - continue; - } - - $typeName = $type . ' '; - if ($type === 'name') { - $typeName = ''; - } - - if ($count === 1) { - $qualifiedName = \reset($statements); - $alias = \key($statements); - - $newStatement = 'use ' . $typeName . $qualifiedName; - - $unqualifiedName = \ltrim(\substr($qualifiedName, (int) \strrpos($qualifiedName, '\\')), '\\'); - if ($unqualifiedName !== $alias) { - $newStatement .= ' as ' . $alias; - } - - $newStatement .= ';'; - - $newStatements[] = $newStatement; - continue; - } - - // Multiple statements, add a single-type group use statement. - $newStatement = 'use ' . $typeName . $baseGroupName . '{' . $phpcsFile->eolChar; - - foreach ($statements as $alias => $qualifiedName) { - $partialName = \str_replace($baseGroupName, '', $qualifiedName); - $newStatement .= $insideIndent . $partialName; - - $unqualifiedName = \ltrim(\substr($partialName, (int) \strrpos($partialName, '\\')), '\\'); - if ($unqualifiedName !== $alias) { - $newStatement .= ' as ' . $alias; - } - - $newStatement .= ',' . $phpcsFile->eolChar; - } - - // Remove trailing comma after last statement as that's PHP 7.2+. - $newStatement = \rtrim($newStatement, ',' . $phpcsFile->eolChar); - - $newStatement .= $phpcsFile->eolChar . $useIndent . '};'; - $newStatements[] = $newStatement; - } - - $replacement = \implode($phpcsFile->eolChar . $useIndent, $newStatements); - - $phpcsFile->fixer->replaceToken($stackPtr, $replacement); - - $phpcsFile->fixer->endChangeset(); - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/UseStatements/DisallowUseClassSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/UseStatements/DisallowUseClassSniff.php deleted file mode 100644 index aa84e73..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/UseStatements/DisallowUseClassSniff.php +++ /dev/null @@ -1,265 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\UseStatements; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Exceptions\ValueError; -use PHPCSUtils\Utils\Namespaces; -use PHPCSUtils\Utils\UseStatements; - -/** - * Disallow class/trait/interface/enum import `use` statements. - * - * Related sniffs: - * - `Universal.UseStatements.DisallowUseFunction` - * - `Universal.UseStatements.DisallowUseConst` - * - * @since 1.0.0 - */ -final class DisallowUseClassSniff implements Sniff -{ - - /** - * Name of the "Use import source" metric. - * - * @since 1.0.0 - * - * @var string - */ - const METRIC_NAME_SRC = 'Use import statement source for class/interface/trait/enum'; - - /** - * Name of the "Use import with/without alias" metric. - * - * @since 1.0.0 - * - * @var string - */ - const METRIC_NAME_ALIAS = 'Use import statement for class/interface/trait/enum'; - - /** - * Keep track of which file is being scanned. - * - * @since 1.0.0 - * - * @var string - */ - private $currentFile = ''; - - /** - * Keep track of the current namespace. - * - * @since 1.0.0 - * - * @var string - */ - private $currentNamespace = ''; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - return [ - \T_USE, - \T_NAMESPACE, - ]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $file = $phpcsFile->getFilename(); - if ($file !== $this->currentFile) { - // Reset the current namespace for each new file. - $this->currentFile = $file; - $this->currentNamespace = ''; - } - - $tokens = $phpcsFile->getTokens(); - - // Get the name of the current namespace. - if ($tokens[$stackPtr]['code'] === \T_NAMESPACE) { - $namespaceName = Namespaces::getDeclaredName($phpcsFile, $stackPtr); - if ($namespaceName !== false) { - $this->currentNamespace = $namespaceName; - } - - return; - } - - // Ok, so this is a T_USE token. - try { - $statements = UseStatements::splitImportUseStatement($phpcsFile, $stackPtr); - } catch (ValueError $e) { - // Not an import use statement. Bow out. - return; - } - - if (empty($statements['name'])) { - // No class/trait/interface/enum import statements found. - return; - } - - $endOfStatement = $phpcsFile->findNext([\T_SEMICOLON, \T_CLOSE_TAG], ($stackPtr + 1)); - - foreach ($statements['name'] as $alias => $qualifiedName) { - /* - * Determine which token to flag. - * - * - If there is an alias, the alias should be flagged. - * - If there isn't an alias, the class name at the end of the qualified name should be flagged - * on PHPCS 3.x and the complete qualified class name on PHPCS 4.x. - */ - $reportPtr = $stackPtr; - do { - $reportPtr = $phpcsFile->findNext(\T_STRING, ($reportPtr + 1), $endOfStatement, false, $alias); - if ($reportPtr === false) { - // Shouldn't be possible on 3.x, but perfectly possible on 4.x when the class is not aliased. - break; - } - - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($reportPtr + 1), $endOfStatement, true); - if ($next !== false && $tokens[$next]['code'] === \T_NS_SEPARATOR) { - // Namespace level with same name. Continue searching. - continue; - } - - break; - } while (true); - - if ($reportPtr === false) { - // Find the non-aliased name on PHPCS 4.x. - $reportPtr = $phpcsFile->findNext( - [\T_NAME_QUALIFIED], - ($stackPtr + 1), - $endOfStatement, - false, - $qualifiedName - ); - - if ($reportPtr === false) { - // This may be an imported class (incorrectly) passed as an FQN. - $reportPtr = $phpcsFile->findNext( - [\T_NAME_FULLY_QUALIFIED], - ($stackPtr + 1), - $endOfStatement, - false, - '\\' . $qualifiedName - ); - - if ($reportPtr === false) { - // This may be a partial name in a group use statement. - $groupStart = $phpcsFile->findNext(\T_OPEN_USE_GROUP, ($stackPtr + 1), $endOfStatement); - if ($groupStart === false) { - // Shouldn't be possible. - continue; // @codeCoverageIgnore - } - - for ($i = ($groupStart + 1); $i < $endOfStatement; $i++) { - if ($tokens[$i]['code'] === \T_NAME_QUALIFIED - || $tokens[$i]['code'] === \T_NAME_FULLY_QUALIFIED - ) { - $contentLength = \strlen($tokens[$i]['content']); - if (\substr($qualifiedName, -$contentLength) === $tokens[$i]['content']) { - $reportPtr = $i; - break; - } - } - } - - if ($reportPtr === false) { - // Shouldn't be possible. - continue; // @codeCoverageIgnore - } - } - } - } - - /* - * Build the error message and code. - * - * Check whether this is a non-namespaced (global) import and check whether this is an - * import from within the same namespace. - * - * Takes incorrect use statements with leading backslash into account. - * Takes case-INsensitivity of namespaces names into account. - * - * The "GlobalNamespace" error code takes precedence over the "SameNamespace" error code - * in case this is a non-namespaced file. - */ - - $error = 'Use import statements for class/interface/trait/enum%s are not allowed.'; - $error .= ' Found import statement for: "%s"'; - $errorCode = 'Found'; - $data = [ - '', - $qualifiedName, - ]; - - $globalNamespace = false; - $sameNamespace = false; - if (\strpos($qualifiedName, '\\') === false) { - $globalNamespace = true; - $errorCode = 'FromGlobalNamespace'; - $data[0] = ' from the global namespace'; - - $phpcsFile->recordMetric($reportPtr, self::METRIC_NAME_SRC, 'global namespace'); - } elseif ($this->currentNamespace !== '' - && \stripos($qualifiedName, $this->currentNamespace . '\\') === 0 - ) { - $sameNamespace = true; - $errorCode = 'FromSameNamespace'; - $data[0] = ' from the same namespace'; - - $phpcsFile->recordMetric($reportPtr, self::METRIC_NAME_SRC, 'same namespace'); - } else { - $phpcsFile->recordMetric($reportPtr, self::METRIC_NAME_SRC, 'different namespace'); - } - - $hasAlias = false; - $lastLeaf = \strtolower(\substr($qualifiedName, -(\strlen($alias) + 1))); - $aliasLC = \strtolower($alias); - if ($lastLeaf !== $aliasLC && $lastLeaf !== '\\' . $aliasLC) { - $hasAlias = true; - $error .= ' with alias: "%s"'; - $errorCode .= 'WithAlias'; - $data[] = $alias; - - $phpcsFile->recordMetric($reportPtr, self::METRIC_NAME_ALIAS, 'with alias'); - } else { - $phpcsFile->recordMetric($reportPtr, self::METRIC_NAME_ALIAS, 'without alias'); - } - - if ($errorCode === 'Found') { - $errorCode = 'FoundWithoutAlias'; - } - - $phpcsFile->addError($error, $reportPtr, $errorCode, $data); - } - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/UseStatements/DisallowUseConstSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/UseStatements/DisallowUseConstSniff.php deleted file mode 100644 index 1e5571c..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/UseStatements/DisallowUseConstSniff.php +++ /dev/null @@ -1,265 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\UseStatements; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Exceptions\ValueError; -use PHPCSUtils\Utils\Namespaces; -use PHPCSUtils\Utils\UseStatements; - -/** - * Disallow constant import `use` statements. - * - * Related sniffs: - * - `Universal.UseStatements.DisallowUseClass` - * - `Universal.UseStatements.DisallowUseFunction` - * - * @since 1.0.0 - */ -final class DisallowUseConstSniff implements Sniff -{ - - /** - * Name of the "Use import source" metric. - * - * @since 1.0.0 - * - * @var string - */ - const METRIC_NAME_SRC = 'Use import statement source for constant'; - - /** - * Name of the "Use import with/without alias" metric. - * - * @since 1.0.0 - * - * @var string - */ - const METRIC_NAME_ALIAS = 'Use import statement for constant'; - - /** - * Keep track of which file is being scanned. - * - * @since 1.0.0 - * - * @var string - */ - private $currentFile = ''; - - /** - * Keep track of the current namespace. - * - * @since 1.0.0 - * - * @var string - */ - private $currentNamespace = ''; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - return [ - \T_USE, - \T_NAMESPACE, - ]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $file = $phpcsFile->getFilename(); - if ($file !== $this->currentFile) { - // Reset the current namespace for each new file. - $this->currentFile = $file; - $this->currentNamespace = ''; - } - - $tokens = $phpcsFile->getTokens(); - - // Get the name of the current namespace. - if ($tokens[$stackPtr]['code'] === \T_NAMESPACE) { - $namespaceName = Namespaces::getDeclaredName($phpcsFile, $stackPtr); - if ($namespaceName !== false) { - $this->currentNamespace = $namespaceName; - } - - return; - } - - // Ok, so this is a T_USE token. - try { - $statements = UseStatements::splitImportUseStatement($phpcsFile, $stackPtr); - } catch (ValueError $e) { - // Not an import use statement. Bow out. - return; - } - - if (empty($statements['const'])) { - // No import statements for constants found. - return; - } - - $endOfStatement = $phpcsFile->findNext([\T_SEMICOLON, \T_CLOSE_TAG], ($stackPtr + 1)); - - foreach ($statements['const'] as $alias => $qualifiedName) { - /* - * Determine which token to flag. - * - * - If there is an alias, the alias should be flagged. - * - If there isn't an alias, the constant name at the end of the qualified name should be flagged - * on PHPCS 3.x and the complete qualified constant name on PHPCS 4.x. - */ - $reportPtr = $stackPtr; - do { - $reportPtr = $phpcsFile->findNext(\T_STRING, ($reportPtr + 1), $endOfStatement, false, $alias); - if ($reportPtr === false) { - // Shouldn't be possible on 3.x, but perfectly possible on 4.x when the class is not aliased. - break; - } - - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($reportPtr + 1), $endOfStatement, true); - if ($next !== false && $tokens[$next]['code'] === \T_NS_SEPARATOR) { - // Namespace level with same name. Continue searching. - continue; - } - - break; - } while (true); - - if ($reportPtr === false) { - // Find the non-aliased name on PHPCS 4.x. - $reportPtr = $phpcsFile->findNext( - [\T_NAME_QUALIFIED], - ($stackPtr + 1), - $endOfStatement, - false, - $qualifiedName - ); - - if ($reportPtr === false) { - // This may be an imported constant (incorrectly) passed as an FQN. - $reportPtr = $phpcsFile->findNext( - [\T_NAME_FULLY_QUALIFIED], - ($stackPtr + 1), - $endOfStatement, - false, - '\\' . $qualifiedName - ); - - if ($reportPtr === false) { - // This may be a partial name in a group use statement. - $groupStart = $phpcsFile->findNext(\T_OPEN_USE_GROUP, ($stackPtr + 1), $endOfStatement); - if ($groupStart === false) { - // Shouldn't be possible. - continue; // @codeCoverageIgnore - } - - for ($i = ($groupStart + 1); $i < $endOfStatement; $i++) { - if ($tokens[$i]['code'] === \T_NAME_QUALIFIED - || $tokens[$i]['code'] === \T_NAME_FULLY_QUALIFIED - ) { - $contentLength = \strlen($tokens[$i]['content']); - if (\substr($qualifiedName, -$contentLength) === $tokens[$i]['content']) { - $reportPtr = $i; - break; - } - } - } - - if ($reportPtr === false) { - // Shouldn't be possible. - continue; // @codeCoverageIgnore - } - } - } - } - - /* - * Build the error message and code. - * - * Check whether this is a non-namespaced (global) import and check whether this is an - * import from within the same namespace. - * - * Takes incorrect use statements with leading backslash into account. - * Takes case-INsensitivity of namespaces names into account. - * - * The "GlobalNamespace" error code takes precedence over the "SameNamespace" error code - * in case this is a non-namespaced file. - */ - - $error = 'Use import statements for constants%s are not allowed.'; - $error .= ' Found import statement for: "%s"'; - $errorCode = 'Found'; - $data = [ - '', - $qualifiedName, - ]; - - $globalNamespace = false; - $sameNamespace = false; - if (\strpos($qualifiedName, '\\') === false) { - $globalNamespace = true; - $errorCode = 'FromGlobalNamespace'; - $data[0] = ' from the global namespace'; - - $phpcsFile->recordMetric($reportPtr, self::METRIC_NAME_SRC, 'global namespace'); - } elseif ($this->currentNamespace !== '' - && \stripos($qualifiedName, $this->currentNamespace . '\\') === 0 - ) { - $sameNamespace = true; - $errorCode = 'FromSameNamespace'; - $data[0] = ' from the same namespace'; - - $phpcsFile->recordMetric($reportPtr, self::METRIC_NAME_SRC, 'same namespace'); - } else { - $phpcsFile->recordMetric($reportPtr, self::METRIC_NAME_SRC, 'different namespace'); - } - - $hasAlias = false; - $lastLeaf = \strtolower(\substr($qualifiedName, -(\strlen($alias) + 1))); - $aliasLC = \strtolower($alias); - if ($lastLeaf !== $aliasLC && $lastLeaf !== '\\' . $aliasLC) { - $hasAlias = true; - $error .= ' with alias: "%s"'; - $errorCode .= 'WithAlias'; - $data[] = $alias; - - $phpcsFile->recordMetric($reportPtr, self::METRIC_NAME_ALIAS, 'with alias'); - } else { - $phpcsFile->recordMetric($reportPtr, self::METRIC_NAME_ALIAS, 'without alias'); - } - - if ($errorCode === 'Found') { - $errorCode = 'FoundWithoutAlias'; - } - - $phpcsFile->addError($error, $reportPtr, $errorCode, $data); - } - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/UseStatements/DisallowUseFunctionSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/UseStatements/DisallowUseFunctionSniff.php deleted file mode 100644 index a9b98b0..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/UseStatements/DisallowUseFunctionSniff.php +++ /dev/null @@ -1,265 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\UseStatements; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Exceptions\ValueError; -use PHPCSUtils\Utils\Namespaces; -use PHPCSUtils\Utils\UseStatements; - -/** - * Disallow function import `use` statements. - * - * Related sniffs: - * - `Universal.UseStatements.DisallowUseClass` - * - `Universal.UseStatements.DisallowUseConst` - * - * @since 1.0.0 - */ -final class DisallowUseFunctionSniff implements Sniff -{ - - /** - * Name of the "Use import source" metric. - * - * @since 1.0.0 - * - * @var string - */ - const METRIC_NAME_SRC = 'Use import statement source for functions'; - - /** - * Name of the "Use import with/without alias" metric. - * - * @since 1.0.0 - * - * @var string - */ - const METRIC_NAME_ALIAS = 'Use import statement for functions'; - - /** - * Keep track of which file is being scanned. - * - * @since 1.0.0 - * - * @var string - */ - private $currentFile = ''; - - /** - * Keep track of the current namespace. - * - * @since 1.0.0 - * - * @var string - */ - private $currentNamespace = ''; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - return [ - \T_USE, - \T_NAMESPACE, - ]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $file = $phpcsFile->getFilename(); - if ($file !== $this->currentFile) { - // Reset the current namespace for each new file. - $this->currentFile = $file; - $this->currentNamespace = ''; - } - - $tokens = $phpcsFile->getTokens(); - - // Get the name of the current namespace. - if ($tokens[$stackPtr]['code'] === \T_NAMESPACE) { - $namespaceName = Namespaces::getDeclaredName($phpcsFile, $stackPtr); - if ($namespaceName !== false) { - $this->currentNamespace = $namespaceName; - } - - return; - } - - // Ok, so this is a T_USE token. - try { - $statements = UseStatements::splitImportUseStatement($phpcsFile, $stackPtr); - } catch (ValueError $e) { - // Not an import use statement. Bow out. - return; - } - - if (empty($statements['function'])) { - // No import statements for functions found. - return; - } - - $endOfStatement = $phpcsFile->findNext([\T_SEMICOLON, \T_CLOSE_TAG], ($stackPtr + 1)); - - foreach ($statements['function'] as $alias => $qualifiedName) { - /* - * Determine which token to flag. - * - * - If there is an alias, the alias should be flagged. - * - If there isn't an alias, the function name at the end of the qualified name should be flagged - * on PHPCS 3.x and the complete qualified function name on PHPCS 4.x. - */ - $reportPtr = $stackPtr; - do { - $reportPtr = $phpcsFile->findNext(\T_STRING, ($reportPtr + 1), $endOfStatement, false, $alias); - if ($reportPtr === false) { - // Shouldn't be possible on 3.x, but perfectly possible on 4.x when the class is not aliased. - break; - } - - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($reportPtr + 1), $endOfStatement, true); - if ($next !== false && $tokens[$next]['code'] === \T_NS_SEPARATOR) { - // Namespace level with same name. Continue searching. - continue; - } - - break; - } while (true); - - if ($reportPtr === false) { - // Find the non-aliased name on PHPCS 4.x. - $reportPtr = $phpcsFile->findNext( - [\T_NAME_QUALIFIED], - ($stackPtr + 1), - $endOfStatement, - false, - $qualifiedName - ); - - if ($reportPtr === false) { - // This may be an imported function (incorrectly) passed as an FQN. - $reportPtr = $phpcsFile->findNext( - [\T_NAME_FULLY_QUALIFIED], - ($stackPtr + 1), - $endOfStatement, - false, - '\\' . $qualifiedName - ); - - if ($reportPtr === false) { - // This may be a partial name in a group use statement. - $groupStart = $phpcsFile->findNext(\T_OPEN_USE_GROUP, ($stackPtr + 1), $endOfStatement); - if ($groupStart === false) { - // Shouldn't be possible. - continue; // @codeCoverageIgnore - } - - for ($i = ($groupStart + 1); $i < $endOfStatement; $i++) { - if ($tokens[$i]['code'] === \T_NAME_QUALIFIED - || $tokens[$i]['code'] === \T_NAME_FULLY_QUALIFIED - ) { - $contentLength = \strlen($tokens[$i]['content']); - if (\substr($qualifiedName, -$contentLength) === $tokens[$i]['content']) { - $reportPtr = $i; - break; - } - } - } - - if ($reportPtr === false) { - // Shouldn't be possible. - continue; // @codeCoverageIgnore - } - } - } - } - - /* - * Build the error message and code. - * - * Check whether this is a non-namespaced (global) import and check whether this is an - * import from within the same namespace. - * - * Takes incorrect use statements with leading backslash into account. - * Takes case-INsensitivity of namespaces names into account. - * - * The "GlobalNamespace" error code takes precedence over the "SameNamespace" error code - * in case this is a non-namespaced file. - */ - - $error = 'Use import statements for functions%s are not allowed.'; - $error .= ' Found import statement for: "%s"'; - $errorCode = 'Found'; - $data = [ - '', - $qualifiedName, - ]; - - $globalNamespace = false; - $sameNamespace = false; - if (\strpos($qualifiedName, '\\') === false) { - $globalNamespace = true; - $errorCode = 'FromGlobalNamespace'; - $data[0] = ' from the global namespace'; - - $phpcsFile->recordMetric($reportPtr, self::METRIC_NAME_SRC, 'global namespace'); - } elseif ($this->currentNamespace !== '' - && \stripos($qualifiedName, $this->currentNamespace . '\\') === 0 - ) { - $sameNamespace = true; - $errorCode = 'FromSameNamespace'; - $data[0] = ' from the same namespace'; - - $phpcsFile->recordMetric($reportPtr, self::METRIC_NAME_SRC, 'same namespace'); - } else { - $phpcsFile->recordMetric($reportPtr, self::METRIC_NAME_SRC, 'different namespace'); - } - - $hasAlias = false; - $lastLeaf = \strtolower(\substr($qualifiedName, -(\strlen($alias) + 1))); - $aliasLC = \strtolower($alias); - if ($lastLeaf !== $aliasLC && $lastLeaf !== '\\' . $aliasLC) { - $hasAlias = true; - $error .= ' with alias: "%s"'; - $errorCode .= 'WithAlias'; - $data[] = $alias; - - $phpcsFile->recordMetric($reportPtr, self::METRIC_NAME_ALIAS, 'with alias'); - } else { - $phpcsFile->recordMetric($reportPtr, self::METRIC_NAME_ALIAS, 'without alias'); - } - - if ($errorCode === 'Found') { - $errorCode = 'FoundWithoutAlias'; - } - - $phpcsFile->addError($error, $reportPtr, $errorCode, $data); - } - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/UseStatements/KeywordSpacingSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/UseStatements/KeywordSpacingSniff.php deleted file mode 100644 index 8036312..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/UseStatements/KeywordSpacingSniff.php +++ /dev/null @@ -1,207 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2023 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\UseStatements; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Fixers\SpacesFixer; -use PHPCSUtils\Utils\UseStatements; - -/** - * Enforce a single space after the keywords in import `use` statements. - * - * The keywords this sniff checks are `use`, `function`, `const` and `as`. - * For `as`, the space *before* the keyword is also checked to be a single space. - * - * @since 1.1.0 - */ -final class KeywordSpacingSniff implements Sniff -{ - - /** - * Name of the metric for spacing before. - * - * @since 1.1.0 - * - * @var string - */ - const METRIC_NAME_BEFORE = 'Space before "%s" keyword in import use statement'; - - /** - * Name of the metric for spacing after. - * - * @since 1.1.0 - * - * @var string - */ - const METRIC_NAME_AFTER = 'Space after "%s" keyword in import use statement'; - - /** - * A list of keywords that are tokenized as `T_STRING` in import `use` statements. - * - * @since 1.1.0 - * - * @var array<string, true> - */ - protected $keywords = [ - 'const' => true, - 'function' => true, - ]; - - /** - * Returns an array of tokens this sniff wants to listen for. - * - * @since 1.1.0 - * - * @return array<int|string> - */ - public function register() - { - return [\T_USE]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.1.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if (UseStatements::isImportUse($phpcsFile, $stackPtr) === false) { - // Trait or closure use statement. - return; - } - - $tokens = $phpcsFile->getTokens(); - $endOfStatement = $phpcsFile->findNext([\T_SEMICOLON, \T_CLOSE_TAG], ($stackPtr + 1)); - if ($endOfStatement === false) { - // Live coding or parse error. - return; - } - - // Check the spacing after the `use` keyword. - $this->checkSpacingAfterKeyword($phpcsFile, $stackPtr, $tokens[$stackPtr]['content']); - - // Check the spacing before and after each `as` keyword. - $current = $stackPtr; - do { - $current = $phpcsFile->findNext(\T_AS, ($current + 1), $endOfStatement); - if ($current === false) { - break; - } - - // Prevent false positives when "as" is used within a "name". - if (isset(Tokens::$emptyTokens[$tokens[($current - 1)]['code']]) === true) { - $this->checkSpacingBeforeKeyword($phpcsFile, $current, $tokens[$current]['content']); - $this->checkSpacingAfterKeyword($phpcsFile, $current, $tokens[$current]['content']); - } - } while (true); - - /* - * Check the spacing after `function` and `const` keywords. - */ - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if (isset($this->keywords[\strtolower($tokens[$nextNonEmpty]['content'])]) === true) { - // Keyword found at start of statement, applies to whole statement. - $this->checkSpacingAfterKeyword($phpcsFile, $nextNonEmpty, $tokens[$nextNonEmpty]['content']); - return; - } - - // This may still be a group use statement with function/const substatements. - $openGroup = $phpcsFile->findNext(\T_OPEN_USE_GROUP, ($stackPtr + 1), $endOfStatement); - if ($openGroup === false) { - // Not a group use statement. - return; - } - - $closeGroup = $phpcsFile->findNext(\T_CLOSE_USE_GROUP, ($openGroup + 1), $endOfStatement); - - $current = $openGroup; - do { - $current = $phpcsFile->findNext(Tokens::$emptyTokens, ($current + 1), $closeGroup, true); - if ($current === false) { - return; - } - - if (isset($this->keywords[\strtolower($tokens[$current]['content'])]) === true) { - $this->checkSpacingAfterKeyword($phpcsFile, $current, $tokens[$current]['content']); - } - - // We're within the use group, so find the next comma. - $current = $phpcsFile->findNext(\T_COMMA, ($current + 1), $closeGroup); - } while ($current !== false); - } - - /** - * Check the spacing before a found keyword. - * - * @since 1.1.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the keyword in the token stack. - * @param string $content The keyword as found. - * - * @return void - */ - public function checkSpacingBeforeKeyword(File $phpcsFile, $stackPtr, $content) - { - $contentLC = \strtolower($content); - $prevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - - SpacesFixer::checkAndFix( - $phpcsFile, - $stackPtr, - $prevNonEmpty, - 1, // Expected spaces. - 'Expected %s before the "' . $contentLC . '" keyword. Found: %s', - 'SpaceBefore' . \ucfirst($contentLC), - 'error', - 0, // Severity. - \sprintf(self::METRIC_NAME_BEFORE, $contentLC) - ); - } - - /** - * Check the spacing after a found keyword. - * - * @since 1.1.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the keyword in the token stack. - * @param string $content The keyword as found. - * - * @return void - */ - public function checkSpacingAfterKeyword(File $phpcsFile, $stackPtr, $content) - { - $contentLC = \strtolower($content); - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - - SpacesFixer::checkAndFix( - $phpcsFile, - $stackPtr, - $nextNonEmpty, - 1, // Expected spaces. - 'Expected %s after the "' . $contentLC . '" keyword. Found: %s', - 'SpaceAfter' . \ucfirst($contentLC), - 'error', - 0, // Severity. - \sprintf(self::METRIC_NAME_AFTER, $contentLC) - ); - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/UseStatements/LowercaseFunctionConstSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/UseStatements/LowercaseFunctionConstSniff.php deleted file mode 100644 index b9f87f2..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/UseStatements/LowercaseFunctionConstSniff.php +++ /dev/null @@ -1,156 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\UseStatements; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Utils\UseStatements; - -/** - * Verify that the `function` and `const` keyword in import `use` statements are lowercase. - * - * Companion sniff to the upstream `Generic.PHP.LowerCaseKeyword` sniff which doesn't cover - * these keywords as they are not tokenized as `T_FUNCTION`/`T_CONST`, but as `T_STRING`. - * - * @since 1.0.0 - */ -final class LowercaseFunctionConstSniff implements Sniff -{ - - /** - * Name of the metric. - * - * @since 1.0.0 - * - * @var string - */ - const METRIC_NAME = 'Import use statement %s keyword case'; - - /** - * A list of keywords that can follow use statements. - * - * @since 1.0.0 - * - * @var array<string, true> - */ - protected $keywords = [ - 'const' => true, - 'function' => true, - ]; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - return [\T_USE]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if (UseStatements::isImportUse($phpcsFile, $stackPtr) === false) { - // Trait or closure use statement. - return; - } - - $tokens = $phpcsFile->getTokens(); - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($nextNonEmpty === false) { - // Live coding or parse error. - return; - } - - if (isset($this->keywords[\strtolower($tokens[$nextNonEmpty]['content'])]) === true) { - // Keyword found at start of statement, applies to whole statement. - $this->processKeyword($phpcsFile, $nextNonEmpty, $tokens[$nextNonEmpty]['content']); - return; - } - - // This may still be a group use statement with function/const substatements. - $openGroup = $phpcsFile->findNext([\T_SEMICOLON, \T_CLOSE_TAG, \T_OPEN_USE_GROUP], ($stackPtr + 1)); - if ($openGroup === false || $tokens[$openGroup]['code'] !== \T_OPEN_USE_GROUP) { - // Not a group use statement. - return; - } - - $closeGroup = $phpcsFile->findNext([\T_SEMICOLON, \T_CLOSE_TAG, \T_CLOSE_USE_GROUP], ($openGroup + 1)); - if ($closeGroup === false || $tokens[$closeGroup]['code'] !== \T_CLOSE_USE_GROUP) { - // Live coding or parse error. - return; - } - - $current = $openGroup; - do { - $current = $phpcsFile->findNext(Tokens::$emptyTokens, ($current + 1), $closeGroup, true); - if ($current === false) { - return; - } - - if (isset($this->keywords[\strtolower($tokens[$current]['content'])]) === true) { - $this->processKeyword($phpcsFile, $current, $tokens[$current]['content']); - } - - // We're within the use group, so find the next comma. - $current = $phpcsFile->findNext(\T_COMMA, ($current + 1), $closeGroup); - } while ($current !== false); - } - - /** - * Processes a found keyword. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the keyword in the token stack. - * @param string $content The keyword as found. - * - * @return void - */ - public function processKeyword(File $phpcsFile, $stackPtr, $content) - { - $contentLC = \strtolower($content); - $metricName = \sprintf(self::METRIC_NAME, $contentLC); - if ($contentLC === $content) { - // Already lowercase. Bow out. - $phpcsFile->recordMetric($stackPtr, $metricName, 'lowercase'); - return; - } - - if (\strtoupper($content) === $content) { - $phpcsFile->recordMetric($stackPtr, $metricName, 'uppercase'); - } else { - $phpcsFile->recordMetric($stackPtr, $metricName, 'mixed case'); - } - - $error = 'The "%s" keyword when used in an import use statements must be lowercase.'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NotLowercase', [$contentLC]); - - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, $contentLC); - } - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/UseStatements/NoLeadingBackslashSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/UseStatements/NoLeadingBackslashSniff.php deleted file mode 100644 index 75af972..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/UseStatements/NoLeadingBackslashSniff.php +++ /dev/null @@ -1,178 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\UseStatements; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Utils\UseStatements; - -/** - * Verifies that names being imported in import use statements do not start with a leading backslash. - * - * This sniff handles all types of import use statements supported by PHP, in contrast to any - * of the other sniffs for the same in, for instance, the PSR12 or the Slevomat standard, - * all of which are incomplete. - * - * @since 1.0.0 - */ -final class NoLeadingBackslashSniff implements Sniff -{ - - /** - * Name of the metric. - * - * @since 1.0.0 - * - * @var string - */ - const METRIC_NAME = 'Import use with leading backslash'; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - return [\T_USE]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if (UseStatements::isImportUse($phpcsFile, $stackPtr) === false) { - // Trait or closure use statement. - return; - } - - $endOfStatement = $phpcsFile->findNext([\T_SEMICOLON, \T_CLOSE_TAG, \T_OPEN_USE_GROUP], ($stackPtr + 1)); - if ($endOfStatement === false) { - // Live coding or parse error. - return; - } - - $tokens = $phpcsFile->getTokens(); - $current = $stackPtr; - - do { - $continue = $this->processImport($phpcsFile, $current, $endOfStatement); - if ($continue === false) { - break; - } - - // Move the stackPtr forward to the next part of the use statement, if any. - $current = $phpcsFile->findNext(\T_COMMA, ($current + 1), $endOfStatement); - } while ($current !== false); - - if ($tokens[$endOfStatement]['code'] !== \T_OPEN_USE_GROUP) { - // Finished the statement. - return; - } - - $current = $endOfStatement; // Group open brace. - $endOfStatement = $phpcsFile->findNext([\T_CLOSE_USE_GROUP], ($endOfStatement + 1)); - if ($endOfStatement === false) { - // Live coding or parse error. - return; - } - - do { - $continue = $this->processImport($phpcsFile, $current, $endOfStatement, true); - if ($continue === false) { - break; - } - - // Move the stackPtr forward to the next part of the use statement, if any. - $current = $phpcsFile->findNext(\T_COMMA, ($current + 1), $endOfStatement); - } while ($current !== false); - } - - /** - * Examine an individual import statement. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token. - * @param int $endOfStatement End token for the current import statement. - * @param bool $groupUse Whether the current statement is a partial one - * within a group use statement. - * - * @return bool Whether or not to continue examining this import use statement. - */ - private function processImport(File $phpcsFile, $stackPtr, $endOfStatement, $groupUse = false) - { - $tokens = $phpcsFile->getTokens(); - - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), $endOfStatement, true); - if ($nextNonEmpty === false) { - // Reached the end of the statement. - return false; - } - - // Skip past 'function'/'const' keyword. - $contentLC = \strtolower($tokens[$nextNonEmpty]['content']); - if ($tokens[$nextNonEmpty]['code'] === \T_STRING - && ($contentLC === 'function' || $contentLC === 'const') - ) { - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($nextNonEmpty + 1), $endOfStatement, true); - if ($nextNonEmpty === false) { - // Reached the end of the statement. - return false; - } - } - - if ($tokens[$nextNonEmpty]['code'] === \T_NS_SEPARATOR - || $tokens[$nextNonEmpty]['code'] === \T_NAME_FULLY_QUALIFIED - ) { - $phpcsFile->recordMetric($nextNonEmpty, self::METRIC_NAME, 'yes'); - - $error = 'An import use statement should never start with a leading backslash'; - $code = 'LeadingBackslashFound'; - - if ($groupUse === true) { - $error = 'Parse error: partial import use statement in a use group starting with a leading backslash'; - $code = 'LeadingBackslashFoundInGroup'; - } - - $fix = $phpcsFile->addFixableError($error, $nextNonEmpty, $code); - - if ($fix === true) { - if ($tokens[$nextNonEmpty]['code'] === \T_NS_SEPARATOR) { - // PHPCS 3.x. - if ($tokens[$nextNonEmpty - 1]['code'] !== \T_WHITESPACE) { - $phpcsFile->fixer->replaceToken($nextNonEmpty, ' '); - } else { - $phpcsFile->fixer->replaceToken($nextNonEmpty, ''); - } - } else { - // PHPCS 4.x / T_NAME_FULLY_QUALIFIED. - $phpcsFile->fixer->replaceToken($nextNonEmpty, \ltrim($tokens[$nextNonEmpty]['content'], '\\')); - } - } - } else { - $phpcsFile->recordMetric($nextNonEmpty, self::METRIC_NAME, 'no'); - } - - return true; - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/UseStatements/NoUselessAliasesSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/UseStatements/NoUselessAliasesSniff.php deleted file mode 100644 index 310b407..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/UseStatements/NoUselessAliasesSniff.php +++ /dev/null @@ -1,169 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2023 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\UseStatements; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Tokens\Collections; -use PHPCSUtils\Utils\NamingConventions; -use PHPCSUtils\Utils\UseStatements; - -/** - * Detects useless aliases for import use statements. - * - * Aliasing something to the same name as the original construct is considered useless. - * Note: as OO and function names in PHP are case-insensitive, aliasing to the same name, - * using a different case is also considered useless. - * - * @since 1.1.0 - */ -final class NoUselessAliasesSniff implements Sniff -{ - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.1.0 - * - * @return array<int|string> - */ - public function register() - { - return [\T_USE]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.1.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if (UseStatements::isImportUse($phpcsFile, $stackPtr) === false) { - // Closure or trait use statement. Bow out. - return; - } - - $endOfStatement = $phpcsFile->findNext([\T_SEMICOLON, \T_CLOSE_TAG], ($stackPtr + 1)); - if ($endOfStatement === false) { - // Parse error or live coding. - return; - } - - $hasAliases = $phpcsFile->findNext(\T_AS, ($stackPtr + 1), $endOfStatement); - if ($hasAliases === false) { - // This use import statement does not alias anything, bow out. - return; - } - - $useStatements = UseStatements::splitImportUseStatement($phpcsFile, $stackPtr); - if (\count($useStatements, \COUNT_RECURSIVE) <= 3) { - // No statements found. Shouldn't be possible, but still. Bow out. - return; - } - - $tokens = $phpcsFile->getTokens(); - - // Collect all places where aliases are used in this use statement. - $aliasPtrs = []; - $currentAs = $hasAliases; - do { - $aliasPtr = $phpcsFile->findNext(Tokens::$emptyTokens, ($currentAs + 1), null, true); - if ($aliasPtr !== false && $tokens[$aliasPtr]['code'] === \T_STRING) { - $aliasPtrs[$currentAs] = $aliasPtr; - } - - $currentAs = $phpcsFile->findNext(\T_AS, ($currentAs + 1), $endOfStatement); - } while ($currentAs !== false); - - // Now check the names in each use statement for useless aliases. - foreach ($useStatements as $type => $statements) { - foreach ($statements as $alias => $qualifiedName) { - $unqualifiedName = \ltrim(\substr($qualifiedName, (int) \strrpos($qualifiedName, '\\')), '\\'); - - $uselessAlias = false; - if ($type === 'const') { - // Do a case-sensitive comparison for constants. - if ($unqualifiedName === $alias) { - $uselessAlias = true; - } - } elseif (NamingConventions::isEqual($unqualifiedName, $alias)) { - $uselessAlias = true; - } - - if ($uselessAlias === false) { - continue; - } - - // Now check if this is actually used as an alias or just the actual name. - foreach ($aliasPtrs as $asPtr => $aliasPtr) { - if ($tokens[$aliasPtr]['content'] !== $alias) { - continue; - } - - // Make sure this is really the right one. - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($asPtr - 1), null, true); - if (isset(Collections::nameTokens()[$tokens[$prev]['code']]) === false) { - // Shouldn't be possible. - continue; // @codeCoverageIgnore - } elseif ($tokens[$prev]['code'] === \T_STRING - && $tokens[$prev]['content'] !== $unqualifiedName - ) { - continue; - } elseif ($tokens[$prev]['code'] === \T_NAME_QUALIFIED - && $tokens[$prev]['content'] !== $qualifiedName - && \substr($qualifiedName, -(\strlen($tokens[$prev]['content']))) !== $tokens[$prev]['content'] - ) { - continue; - } elseif ($tokens[$prev]['code'] === \T_NAME_FULLY_QUALIFIED - && $tokens[$prev]['content'] !== '\\' . $qualifiedName - && \substr($qualifiedName, -(\strlen($tokens[$prev]['content']))) !== $tokens[$prev]['content'] - ) { - continue; - } - - $error = 'Useless alias "%s" found for import of "%s"'; - $code = 'Found'; - $data = [$alias, $qualifiedName]; - - // Okay, so this is the one which should be flagged. - $hasComments = $phpcsFile->findNext(Tokens::$commentTokens, ($prev + 1), $aliasPtr); - if ($hasComments !== false) { - // Don't auto-fix if there are comments. - $phpcsFile->addError($error, $aliasPtr, $code, $data); - break; - } - - $fix = $phpcsFile->addFixableError($error, $aliasPtr, $code, $data); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - for ($i = ($prev + 1); $i <= $aliasPtr; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - - break; - } - } - } - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/WhiteSpace/AnonClassKeywordSpacingSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/WhiteSpace/AnonClassKeywordSpacingSniff.php deleted file mode 100644 index 3116316..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/WhiteSpace/AnonClassKeywordSpacingSniff.php +++ /dev/null @@ -1,79 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Fixers\SpacesFixer; - -/** - * Checks the spacing between the "class" keyword and the open parenthesis for anonymous classes with parentheses. - * - * @since 1.0.0 - */ -final class AnonClassKeywordSpacingSniff implements Sniff -{ - - /** - * The amount of spacing to demand between the class keyword and the open parenthesis. - * - * @since 1.0.0 - * - * @var int - */ - public $spacing = 0; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - return [\T_ANON_CLASS]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($nextNonEmpty === false || $tokens[$nextNonEmpty]['code'] !== \T_OPEN_PARENTHESIS) { - // No parentheses, nothing to do. - return; - } - - SpacesFixer::checkAndFix( - $phpcsFile, - $stackPtr, - $nextNonEmpty, - (int) $this->spacing, - 'There must be %1$s between the class keyword and the open parenthesis for an anonymous class. Found: %2$s', - 'Incorrect', - 'error', - 0, - 'Anon class: space between keyword and open parenthesis' - ); - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/WhiteSpace/CommaSpacingSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/WhiteSpace/CommaSpacingSniff.php deleted file mode 100644 index 0c4a3e2..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/WhiteSpace/CommaSpacingSniff.php +++ /dev/null @@ -1,421 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\BackCompat\Helper; -use PHPCSUtils\Fixers\SpacesFixer; -use PHPCSUtils\Tokens\Collections; -use PHPCSUtils\Utils\Context; -use PHPCSUtils\Utils\Parentheses; - -/** - * Check spacing around commas. - * - * - Demands there is no whitespace between the preceeding code and the comma. - * - Demands exactly one space or a new line after a comma. - * - Demands that when there is a trailing comment, the comma follows the code, not the comment. - * - * The following exclusions are in place: - * - A comma preceded or followed by a parenthesis, curly or square bracket, including attribute brackets. - * These will not be flagged to prevent conflicts with sniffs handling spacing around braces/brackets. - * - A comma preceded or followed by another comma, like for skipping items in a list assignment. - * These will not be flagged. - * - A comma preceded by a non-indented heredoc/nowdoc closer. - * In that case, unless the `php_version` config directive is set to a version higher than PHP 7.3.0, - * a new line before will be enforced to prevent parse errors on PHP < 7.3. - * - * The sniff has a separate error code for when a comma is found with more than one space after it, followed - * by a trailing comment. That way trailing comment alignment can be allowed by excluding that error code. - * - * The sniff uses modular error code suffixes for select situations, like `*InFunctionDeclaration`, - * `*InFunctionCall`, to allow for preventing duplicate messages if another sniff is already - * handling the comma spacing. - * - * @since 1.1.0 - */ -final class CommaSpacingSniff implements Sniff -{ - - /** - * Name of the "Spacing before" metric. - * - * @since 1.1.0 - * - * @var string - */ - const METRIC_NAME_BEFORE = 'Spaces found before comma'; - - /** - * Name of the "Spacing after" metric. - * - * @since 1.1.0 - * - * @var string - */ - const METRIC_NAME_AFTER = 'Spaces found after comma'; - - /** - * PHP version as configured or 0 if unknown. - * - * @since 1.1.0 - * - * @var int - */ - private $phpVersion; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.1.0 - * - * @return array<int|string> - */ - public function register() - { - return [\T_COMMA]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.1.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if (isset($this->phpVersion) === false || \defined('PHP_CODESNIFFER_IN_TESTS')) { - // Set default value to prevent this code from running every time the sniff is triggered. - $this->phpVersion = 0; - - $phpVersion = Helper::getConfigData('php_version'); - if ($phpVersion !== null) { - $this->phpVersion = (int) $phpVersion; - } - } - - $this->processSpacingBefore($phpcsFile, $stackPtr); - $this->processSpacingAfter($phpcsFile, $stackPtr); - } - - /** - * Check the spacing before the comma. - * - * @since 1.1.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - protected function processSpacingBefore(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $prevNonWhitespace = $phpcsFile->findPrevious(\T_WHITESPACE, ($stackPtr - 1), null, true); - $prevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - - if ($prevNonWhitespace !== $prevNonEmpty - && $tokens[$prevNonEmpty]['code'] !== \T_COMMA - && $tokens[$prevNonEmpty]['line'] !== $tokens[$nextNonEmpty]['line'] - ) { - // Special case: comma after a trailing comment - the comma should be moved to before the comment. - $fix = $phpcsFile->addFixableError( - 'Comma found after comment, expected the comma after the end of the code', - $stackPtr, - 'CommaAfterComment' - ); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - $phpcsFile->fixer->replaceToken($stackPtr, ''); - $phpcsFile->fixer->addContent($prevNonEmpty, ','); - - // Clean up potential trailing whitespace left behind, but don't remove blank lines. - $nextNonWhitespace = $phpcsFile->findNext(\T_WHITESPACE, ($stackPtr + 1), null, true); - if ($tokens[($stackPtr - 1)]['code'] === \T_WHITESPACE - && $tokens[($stackPtr - 1)]['line'] === $tokens[$stackPtr]['line'] - && $tokens[$stackPtr]['line'] !== $tokens[$nextNonWhitespace]['line'] - ) { - $phpcsFile->fixer->replaceToken(($stackPtr - 1), ''); - } - - $phpcsFile->fixer->endChangeset(); - } - return; - } - - if ($tokens[$prevNonWhitespace]['code'] === \T_COMMA) { - // This must be a list assignment with ignored items. Ignore. - return; - } - - if (isset(Tokens::$blockOpeners[$tokens[$prevNonWhitespace]['code']]) === true - || $tokens[$prevNonWhitespace]['code'] === \T_OPEN_SHORT_ARRAY - || $tokens[$prevNonWhitespace]['code'] === \T_OPEN_USE_GROUP - || $tokens[$prevNonWhitespace]['code'] === \T_ATTRIBUTE - ) { - // Should only realistically be possible for lists. Leave for a block brace spacing sniff to sort out. - return; - } - - $expectedSpaces = 0; - - if ($tokens[$prevNonEmpty]['code'] === \T_END_HEREDOC - || $tokens[$prevNonEmpty]['code'] === \T_END_NOWDOC - ) { - /* - * If php_version is explicitly set to PHP < 7.3, enforce a new line between the closer and the comma. - * - * If php_version is *not* explicitly set, let the indent be leading and only enforce - * a new line between the closer and the comma when this is an old-style heredoc/nowdoc. - */ - if ($this->phpVersion !== 0 && $this->phpVersion < 70300) { - $expectedSpaces = 'newline'; - } - - if ($this->phpVersion === 0 - && \ltrim($tokens[$prevNonEmpty]['content']) === $tokens[$prevNonEmpty]['content'] - ) { - $expectedSpaces = 'newline'; - } - } - - $error = 'Expected %1$s between "' . $this->escapePlaceholders($tokens[$prevNonWhitespace]['content']) - . '" and the comma. Found: %2$s'; - $codeSuffix = $this->getSuffix($phpcsFile, $stackPtr); - $metricSuffix = $this->codeSuffixToMetric($codeSuffix); - - SpacesFixer::checkAndFix( - $phpcsFile, - $stackPtr, - $prevNonWhitespace, - $expectedSpaces, - $error, - 'SpaceBefore' . $codeSuffix, - 'error', - 0, - self::METRIC_NAME_BEFORE . $metricSuffix - ); - } - - /** - * Check the spacing after the comma. - * - * @since 1.1.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - protected function processSpacingAfter(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $nextNonWhitespace = $phpcsFile->findNext(\T_WHITESPACE, ($stackPtr + 1), null, true); - if ($nextNonWhitespace === false) { - // Live coding/parse error. Ignore. - return; - } - - if ($tokens[$nextNonWhitespace]['code'] === \T_COMMA) { - // This must be a list assignment with ignored items. Ignore. - return; - } - - if ($tokens[$nextNonWhitespace]['code'] === \T_CLOSE_CURLY_BRACKET - || $tokens[$nextNonWhitespace]['code'] === \T_CLOSE_SQUARE_BRACKET - || $tokens[$nextNonWhitespace]['code'] === \T_CLOSE_PARENTHESIS - || $tokens[$nextNonWhitespace]['code'] === \T_CLOSE_SHORT_ARRAY - || $tokens[$nextNonWhitespace]['code'] === \T_CLOSE_USE_GROUP - || $tokens[$nextNonWhitespace]['code'] === \T_ATTRIBUTE_END - ) { - // Ignore. Leave for a block spacing sniff to sort out. - return; - } - - $nextToken = $tokens[($stackPtr + 1)]; - - $error = 'Expected %1$s between the comma and "' - . $this->escapePlaceholders($tokens[$nextNonWhitespace]['content']) . '". Found: %2$s'; - - $codeSuffix = $this->getSuffix($phpcsFile, $stackPtr); - $metricSuffix = $this->codeSuffixToMetric($codeSuffix); - - if ($nextToken['code'] === \T_WHITESPACE) { - if ($nextToken['content'] === ' ') { - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME_AFTER . $metricSuffix, '1 space'); - return; - } - - // Note: this check allows for trailing whitespace between the comma and a new line char. - // The trailing whitespace is not the concern of this sniff. - if (\ltrim($nextToken['content'], ' ') === $phpcsFile->eolChar) { - $phpcsFile->recordMetric($stackPtr, self::METRIC_NAME_AFTER . $metricSuffix, 'a new line'); - return; - } - - $errorCode = 'TooMuchSpaceAfter' . $codeSuffix; - - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if (isset(Tokens::$commentTokens[$tokens[$nextNonWhitespace]['code']]) === true - && ($nextNonEmpty === false || $tokens[$stackPtr]['line'] !== $tokens[$nextNonEmpty]['line']) - ) { - // Separate error code to allow for aligning trailing comments. - $errorCode = 'TooMuchSpaceAfterCommaBeforeTrailingComment'; - } - - SpacesFixer::checkAndFix( - $phpcsFile, - $stackPtr, - $nextNonWhitespace, - 1, - $error, - $errorCode, - 'error', - 0, - self::METRIC_NAME_AFTER . $metricSuffix - ); - return; - } - - SpacesFixer::checkAndFix( - $phpcsFile, - $stackPtr, - $nextNonWhitespace, - 1, - $error, - 'NoSpaceAfter' . $codeSuffix, - 'error', - 0, - self::METRIC_NAME_AFTER . $metricSuffix - ); - } - - /** - * Escape arbitrary token content for *printf() placeholders. - * - * @since 1.1.0 - * - * @param string $text Arbitrary text string. - * - * @return string - */ - private function escapePlaceholders($text) - { - $escapeSinglePercentSign = function ($text) { - return \preg_replace('`(^|[^%])%([^%]|$)`', '\1%%\2', \trim($text)); - }; - - // We need to "double" escape to make sure chars involved in the `\2` match will - // be taken into account for the decision on whether or not to escape the char _after_ that. - return $escapeSinglePercentSign($escapeSinglePercentSign($text)); - } - - /** - * Retrieve a text string for use as a suffix to an error code. - * - * This allows for modular error codes, which in turn allow for selectively excluding - * error codes. - * - * {@internal Closure use will be parentheses owner in PHPCS 4.x, this code will - * need an update for that in due time.} - * - * @since 1.1.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return string - */ - private function getSuffix($phpcsFile, $stackPtr) - { - $opener = Parentheses::getLastOpener($phpcsFile, $stackPtr); - if ($opener === false) { - if (Context::inAttribute($phpcsFile, $stackPtr) === true) { - return 'InAttributeBlock'; - } - - return ''; - } - - $tokens = $phpcsFile->getTokens(); - - $owner = Parentheses::getOwner($phpcsFile, $opener); - if ($owner !== false) { - switch ($tokens[$owner]['code']) { - case \T_FUNCTION: - case \T_CLOSURE: - case \T_FN: - return 'InFunctionDeclaration'; - - case \T_USE: - return 'InClosureUse'; - - case \T_DECLARE: - return 'InDeclare'; - - case \T_ANON_CLASS: - case \T_ISSET: - case \T_UNSET: - return 'InFunctionCall'; - - // Long array, long list, empty, exit, eval, control structures. - default: - return ''; - } - } - - $prevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($opener - 1), null, true); - - if (isset(Collections::nameTokens()[$tokens[$prevNonEmpty]['code']]) === true) { - return 'InFunctionCall'; - } - - switch ($tokens[$prevNonEmpty]['code']) { - case \T_VARIABLE: - case \T_SELF: - case \T_STATIC: - case \T_PARENT: - return 'InFunctionCall'; - - default: - return ''; - } - } - - /** - * Transform a suffix for an error code into a suffix for a metric. - * - * @since 1.1.0 - * - * @param string $suffix Error code suffix. - * - * @return string - */ - private function codeSuffixToMetric($suffix) - { - return \strtolower(\preg_replace('`([A-Z])`', ' $1', $suffix)); - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/WhiteSpace/DisallowInlineTabsSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/WhiteSpace/DisallowInlineTabsSniff.php deleted file mode 100644 index 446a93e..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/WhiteSpace/DisallowInlineTabsSniff.php +++ /dev/null @@ -1,176 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSExtra\Universal\Helpers\DummyTokenizer; -use PHPCSUtils\BackCompat\Helper; -use PHPCSUtils\Tokens\Collections; - -/** - * Enforces using spaces for mid-line alignment. - * - * While tab versus space based indentation is a question of preference, for mid-line - * alignment, spaces should always be preferred, as using tabs will result in inconsistent - * formatting depending on the dev-user's chosen tab width. - * - * This sniff is especially useful for tab-indentation based standards which use the - * `Generic.Whitespace.DisallowSpaceIndent` sniff to enforce this. - * - * **DO** make sure to set the PHPCS native `tab-width` configuration for the best results. - * <code> - * <arg name="tab-width" value="4"/> - * </code> - * - * The PHPCS native `Generic.Whitespace.DisallowTabIndent` sniff oversteps its reach and silently - * does mid-line tab to space replacements as well. - * However, the sister-sniff `Generic.Whitespace.DisallowSpaceIndent` leaves mid-line tabs/spaces alone. - * This sniff fills that gap. - * - * @since 1.0.0 - */ -final class DisallowInlineTabsSniff implements Sniff -{ - - /** - * The --tab-width CLI value that is being used. - * - * @since 1.0.0 - * - * @var int - */ - private $tabWidth; - - /** - * Tokens to check for mid-line tabs. - * - * @since 1.0.0 - * - * @var array<int|string, true> - */ - private $find = [ - \T_WHITESPACE => true, - \T_DOC_COMMENT_WHITESPACE => true, - \T_DOC_COMMENT_STRING => true, - \T_COMMENT => true, - \T_START_HEREDOC => true, - \T_START_NOWDOC => true, - \T_YIELD_FROM => true, - ]; - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - return Collections::phpOpenTags(); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return int Integer stack pointer to skip the rest of the file. - */ - public function process(File $phpcsFile, $stackPtr) - { - if (isset($this->tabWidth) === false) { - $this->tabWidth = (int) Helper::getTabWidth($phpcsFile); - } - - if (\defined('PHP_CODESNIFFER_IN_TESTS')) { - $this->tabWidth = (int) Helper::getCommandLineData($phpcsFile, 'tabWidth'); - } - - $tokens = $phpcsFile->getTokens(); - $dummy = new DummyTokenizer('', $phpcsFile->config); - - for ($i = 0; $i < $phpcsFile->numTokens; $i++) { - // Skip all non-target tokens and skip whitespace at the start of a new line. - if (isset($this->find[$tokens[$i]['code']]) === false - || (($tokens[$i]['code'] === \T_WHITESPACE - || $tokens[$i]['code'] === \T_DOC_COMMENT_WHITESPACE) - && $tokens[$i]['column'] === 1) - ) { - continue; - } - - // If tabs haven't been converted to spaces by the tokenizer, do so now. - $token = $tokens[$i]; - if (isset($token['orig_content']) === false) { - if ($token['content'] === '' || \strpos($token['content'], "\t") === false) { - // If there are no tabs, we can continue, no matter what. - continue; - } - - $dummy->replaceTabsInToken($token); - } - - /* - * Tokens only have the 'orig_content' key if they contain tabs, - * so from here on out, we **know** there will be tabs in the content. - */ - $origContent = $token['orig_content']; - $commentOnly = ''; - - $multiLineComment = false; - if (($tokens[$i]['code'] === \T_COMMENT - || isset(Tokens::$phpcsCommentTokens[$tokens[$i]['code']])) - && $tokens[$i]['column'] === 1 - && ($tokens[($i - 1)]['code'] === \T_COMMENT - || isset(Tokens::$phpcsCommentTokens[$tokens[($i - 1)]['code']])) - ) { - $multiLineComment = true; - } - - if ($multiLineComment === true) { - // This is the subsequent line of a multi-line comment. Account for indentation. - $commentOnly = \ltrim($origContent); - if ($commentOnly === '' || \strpos($commentOnly, "\t") === false) { - continue; - } - } - - $fix = $phpcsFile->addFixableError( - 'Spaces must be used for mid-line alignment; tabs are not allowed', - $i, - 'NonIndentTabsUsed' - ); - - if ($fix === false) { - continue; - } - - $indent = ''; - if ($multiLineComment === true) { - // Take the original indent (tabs/spaces) and combine with the tab-replaced comment content. - $indent = \str_replace($commentOnly, '', $origContent); - $token['content'] = \ltrim($token['content']); - } - - $phpcsFile->fixer->replaceToken($i, $indent . $token['content']); - } - - // Scanned the whole file in one go. Don't scan this file again. - return $phpcsFile->numTokens; - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/WhiteSpace/FirstClassCallableSpacingSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/WhiteSpace/FirstClassCallableSpacingSniff.php deleted file mode 100644 index 07f5df6..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/WhiteSpace/FirstClassCallableSpacingSniff.php +++ /dev/null @@ -1,101 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Fixers\SpacesFixer; - -/** - * Checks the spacing around the ellipses for first class callables. - * - * @since 1.5.0 - */ -final class FirstClassCallableSpacingSniff implements Sniff -{ - - /** - * The number of spaces to demand before and after the ellipsis for a first class callable. - * - * @since 1.5.0 - * - * @var int - */ - public $spacing = 0; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.5.0 - * - * @return array<int|string> - */ - public function register() - { - return [\T_ELLIPSIS]; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.5.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Verify this is an ellipsis for a first class callable. - $previousNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($tokens[$previousNonEmpty]['code'] !== \T_OPEN_PARENTHESIS) { - return; - } - - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($nextNonEmpty === false || $tokens[$nextNonEmpty]['code'] !== \T_CLOSE_PARENTHESIS) { - return; - } - - $spacing = (int) $this->spacing; - - // Check spacing before the ellipsis. - SpacesFixer::checkAndFix( - $phpcsFile, - $previousNonEmpty, - $stackPtr, - $spacing, - 'Incorrect spacing between first class callable open parentheses and ellipsis. Expected: %s, found: %s.', - 'SpacingBefore', - 'error', - 0, - 'First class callables: space before ellipsis' - ); - - // Check spacing after the ellipsis. - SpacesFixer::checkAndFix( - $phpcsFile, - $stackPtr, - $nextNonEmpty, - $spacing, - 'Incorrect spacing between first class callable ellipsis and close parentheses. Expected: %s, found: %s.', - 'SpacingAfter', - 'error', - 0, - 'First class callables: space after ellipsis' - ); - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/WhiteSpace/PrecisionAlignmentSniff.php b/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/WhiteSpace/PrecisionAlignmentSniff.php deleted file mode 100644 index 6d42a40..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/Sniffs/WhiteSpace/PrecisionAlignmentSniff.php +++ /dev/null @@ -1,437 +0,0 @@ -<?php -/** - * PHPCSExtra, a collection of sniffs and standards for use with PHP_CodeSniffer. - * - * @package PHPCSExtra - * @copyright 2020 PHPCSExtra Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSExtra - */ - -namespace PHPCSExtra\Universal\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\BackCompat\Helper; -use PHPCSUtils\Tokens\Collections; - -/** - * Detects when the indentation is not a multiple of a tab-width, i.e. when precision alignment is used. - * - * In rare cases, spaces for precision alignment can be intentional and acceptable, - * but more often than not, precision alignment is a typo. - * - * Notes: - * - When using this sniff with tab-based standards, please ensure that the `tab-width` is set - * and either don't set the `$indent` property or set it to the tab-width. - * - Precision alignment *within* text strings (multi-line text strings, heredocs, nowdocs) - * will NOT be flagged by this sniff. - * - The fixer works based on "best guess" and may not always result in the desired indentation. - * - This fixer will use tabs or spaces based on whether tabs were present in the original indent. - * Use the PHPCS native `Generic.WhiteSpace.DisallowTabIndent` or the - * `Generic.WhiteSpace.DisallowSpaceIndent` sniff to clean up the results if so desired. - * - * @since 1.0.0 - * @since 1.4.0 Support for scanning JS and CSS files is deprecated and will be removed in the next major. - */ -final class PrecisionAlignmentSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @since 1.0.0 - * - * @var string[] - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - 'CSS', - ]; - - /** - * The indent used for the codebase. - * - * This property is used to determine whether something is indentation or precision alignment. - * If this property is not set, the sniff will look to the `--tab-width` CLI value. - * If that also isn't set, the default tab-width of 4 will be used. - * - * @since 1.0.0 - * - * @var int|null - */ - public $indent = null; - - /** - * Allow for providing a list of tokens for which (preceding) precision alignment should be ignored. - * - * By default, precision alignment will always be flagged. - * - * Example usage: - * ```xml - * <rule ref="Universal.WhiteSpace.PrecisionAlignment"> - * <properties> - * <property name="ignoreAlignmentBefore" type="array"> - * <!-- Ignore precision alignment in inline HTML --> - * <element value="T_INLINE_HTML"/> - * <!-- Ignore precision alignment in multiline chained method calls. --> - * <element value="T_OBJECT_OPERATOR"/> - * </property> - * </properties> - * </rule> - * ``` - * - * @since 1.0.0 - * - * @var string[] - */ - public $ignoreAlignmentBefore = []; - - /** - * Whether or not potential trailing whitespace on otherwise blank lines should be examined or ignored. - * - * Defaults to `true`, i.e. ignore blank lines. - * - * It is recommended to only set this to `false` if the standard including this sniff does not - * include the `Squiz.WhiteSpace.SuperfluousWhitespace` sniff (which is included in most standards). - * - * @since 1.0.0 - * - * @var bool - */ - public $ignoreBlankLines = true; - - /** - * The --tab-width CLI value that is being used. - * - * @since 1.0.0 - * - * @var int - */ - private $tabWidth; - - /** - * Whitespace tokens and tokens which can contain leading whitespace. - * - * A few additional tokens will be added to this list in the register() method. - * - * @since 1.0.0 - * - * @var array<int|string, int|string> - */ - private $tokensToCheck = [ - \T_WHITESPACE => \T_WHITESPACE, - \T_INLINE_HTML => \T_INLINE_HTML, - \T_DOC_COMMENT_WHITESPACE => \T_DOC_COMMENT_WHITESPACE, - \T_COMMENT => \T_COMMENT, - \T_END_HEREDOC => \T_END_HEREDOC, - \T_END_NOWDOC => \T_END_NOWDOC, - ]; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.0.0 - * - * @return array<int|string> - */ - public function register() - { - // Add the ignore annotation tokens to the list of tokens to check. - $this->tokensToCheck += Tokens::$phpcsCommentTokens; - - return Collections::phpOpenTags(); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return int Integer stack pointer to skip the rest of the file. - */ - public function process(File $phpcsFile, $stackPtr) - { - /* - * Handle the properties. - */ - if (isset($this->tabWidth) === false || \defined('PHP_CODESNIFFER_IN_TESTS') === true) { - $this->tabWidth = Helper::getTabWidth($phpcsFile); - } - - if (isset($this->indent) === true) { - $indent = (int) $this->indent; - } else { - $indent = $this->tabWidth; - } - - $ignoreTokens = (array) $this->ignoreAlignmentBefore; - if (empty($ignoreTokens) === false) { - $ignoreTokens = \array_flip($ignoreTokens); - } - - /* - * Check the whole file in one go. - */ - $tokens = $phpcsFile->getTokens(); - - for ($i = 0; $i < $phpcsFile->numTokens; $i++) { - if ($tokens[$i]['column'] !== 1) { - // Only interested in the first token on each line. - continue; - } - - if (isset($this->tokensToCheck[$tokens[$i]['code']]) === false) { - // Not one of the target tokens. - continue; - } - - if ($tokens[$i]['content'] === $phpcsFile->eolChar) { - // Skip completely blank lines. - continue; - } - - if (isset($ignoreTokens[$tokens[$i]['type']]) === true - || (isset($tokens[($i + 1)]) && isset($ignoreTokens[$tokens[($i + 1)]['type']])) - ) { - // This is one of the tokens being ignored. - continue; - } - - $origContent = null; - if (isset($tokens[$i]['orig_content']) === true) { - $origContent = $tokens[$i]['orig_content']; - } - - $spaces = 0; - $length = 0; - $content = ''; - $closer = ''; - - switch ($tokens[$i]['code']) { - case \T_WHITESPACE: - if ($this->ignoreBlankLines === true - && isset($tokens[($i + 1)]) - && $tokens[$i]['line'] !== $tokens[($i + 1)]['line'] - ) { - // Skip blank lines which only contain trailing whitespace. - continue 2; - } - - $spaces = ($tokens[$i]['length'] % $indent); - break; - - case \T_DOC_COMMENT_WHITESPACE: - /* - * Blank lines with trailing whitespace in docblocks are tokenized as - * two T_DOC_COMMENT_WHITESPACE tokens: one for the trailing whitespace, - * one for the new line character. - */ - if ($this->ignoreBlankLines === true - && isset($tokens[($i + 1)]) - && $tokens[($i + 1)]['content'] === $phpcsFile->eolChar - && isset($tokens[($i + 2)]) - && $tokens[$i]['line'] !== $tokens[($i + 2)]['line'] - ) { - // Skip blank lines which only contain trailing whitespace. - continue 2; - } - - $spaces = ($tokens[$i]['length'] % $indent); - - if (isset($tokens[($i + 1)]) === true - && ($tokens[($i + 1)]['code'] === \T_DOC_COMMENT_STAR - || $tokens[($i + 1)]['code'] === \T_DOC_COMMENT_CLOSE_TAG) - && $spaces !== 0 - ) { - // One alignment space expected before the *. - --$spaces; - } - break; - - case \T_COMMENT: - case \T_INLINE_HTML: - if ($this->ignoreBlankLines === true - && \trim($tokens[$i]['content']) === '' - && isset($tokens[($i + 1)]) - && $tokens[$i]['line'] !== $tokens[($i + 1)]['line'] - ) { - // Skip blank lines which only contain trailing whitespace. - continue 2; - } - - // Deliberate fall-through. - - case \T_PHPCS_ENABLE: - case \T_PHPCS_DISABLE: - case \T_PHPCS_SET: - case \T_PHPCS_IGNORE: - case \T_PHPCS_IGNORE_FILE: - /* - * Indentation is included in the contents of the token for: - * - inline HTML - * - PHP 7.3+ flexible heredoc/nowdoc closer identifiers (see below); - * - subsequent lines of multi-line comments; - * - PHPCS native annotations when part of a multi-line comment. - */ - $content = \ltrim($tokens[$i]['content']); - $whitespace = \str_replace($content, '', $tokens[$i]['content']); - - /* - * If there is no content, this is a blank line in a comment or in inline HTML. - * In that case, use the predetermined length as otherwise the new line character - * at the end of the whitespace will throw the count off. - */ - $length = ($content === '') ? $tokens[$i]['length'] : \strlen($whitespace); - $spaces = ($length % $indent); - - /* - * For multi-line star-comments, which use (aligned) stars on subsequent - * lines, we don't want to trigger on the one extra space before the star. - * - * While not 100% correct, don't exclude inline HTML from this check as - * otherwise the sniff would trigger on multi-line /*-style inline javascript comments. - * This may cause false negatives as there is no check for being in a - * <script> tag, but that will be rare. - */ - if (isset($content[0]) === true && $content[0] === '*' && $spaces !== 0) { - --$spaces; - } - break; - - case \T_END_HEREDOC: - case \T_END_NOWDOC: - $content = $tokens[$i]['content']; - $closer = \ltrim($content); - $whitespace = \str_replace($closer, '', $content); - $length = \strlen($whitespace); - $spaces = ($length % $indent); - break; - } - - if ($spaces === 0) { - continue; - } - - $fix = $phpcsFile->addFixableWarning( - 'Found precision alignment of %s spaces.', - $i, - 'Found', - [$spaces] - ); - - if ($fix === true) { - if ($tokens[$i]['code'] === \T_END_HEREDOC || $tokens[$i]['code'] === \T_END_NOWDOC) { - // For heredoc/nowdoc, always round down to prevent introducing parse errors. - $tabstops = (int) \floor($spaces / $indent); - } else { - // For everything else, use "best guess". - $tabstops = (int) \round($spaces / $indent, 0); - } - - switch ($tokens[$i]['code']) { - case \T_WHITESPACE: - /* - * More complex than you'd think as "length" doesn't include new lines, - * but we don't want to remove new lines either. - */ - $replaceLength = (((int) ($tokens[$i]['length'] / $indent) + $tabstops) * $indent); - $replace = $this->getReplacement($replaceLength, $origContent); - $newContent = \substr_replace($tokens[$i]['content'], $replace, 0, $tokens[$i]['length']); - - $phpcsFile->fixer->replaceToken($i, $newContent); - break; - - case \T_DOC_COMMENT_WHITESPACE: - $replaceLength = (((int) ($tokens[$i]['length'] / $indent) + $tabstops) * $indent); - $replace = $this->getReplacement($replaceLength, $origContent); - - if (isset($tokens[($i + 1)]) === true - && ($tokens[($i + 1)]['code'] === \T_DOC_COMMENT_STAR - || $tokens[($i + 1)]['code'] === \T_DOC_COMMENT_CLOSE_TAG) - && $tabstops === 0 - ) { - // Maintain the extra space before the star. - $replace .= ' '; - } - - $newContent = \substr_replace($tokens[$i]['content'], $replace, 0, $tokens[$i]['length']); - - $phpcsFile->fixer->replaceToken($i, $newContent); - break; - - case \T_COMMENT: - case \T_INLINE_HTML: - case \T_PHPCS_ENABLE: - case \T_PHPCS_DISABLE: - case \T_PHPCS_SET: - case \T_PHPCS_IGNORE: - case \T_PHPCS_IGNORE_FILE: - $replaceLength = (((int) ($length / $indent) + $tabstops) * $indent); - $replace = $this->getReplacement($replaceLength, $origContent); - - if (isset($content[0]) === true && $content[0] === '*' && $tabstops === 0) { - // Maintain the extra space before the star. - $replace .= ' '; - } - - if ($content === '') { - // Preserve new lines in blank line comment tokens. - $newContent = \substr_replace($tokens[$i]['content'], $replace, 0, $length); - } else { - $newContent = $replace . $content; - } - - $phpcsFile->fixer->replaceToken($i, $newContent); - break; - - case \T_END_HEREDOC: - case \T_END_NOWDOC: - $replaceLength = (((int) ($length / $indent) + $tabstops) * $indent); - $replace = $this->getReplacement($replaceLength, $origContent); - - $phpcsFile->fixer->replaceToken($i, $replace . $closer); - break; - } - } - } - - // No need to look at this file again. - return $phpcsFile->numTokens; - } - - /** - * Get the whitespace replacement. Respect tabs vs spaces. - * - * @param int $length The target length of the replacement. - * @param string|null $origContent The original token content without tabs replaced (if available). - * - * @return string - */ - private function getReplacement($length, $origContent) - { - if ($origContent !== null) { - // Check whether tabs were part of the indent or inline alignment. - $content = \ltrim($origContent); - $whitespace = $origContent; - if ($content !== '') { - $whitespace = \str_replace($content, '', $origContent); - } - - if (\strpos($whitespace, "\t") !== false) { - // Original indent used tabs. Use tabs in replacement too. - $tabs = (int) ($length / $this->tabWidth); - $spaces = $length % $this->tabWidth; - return \str_repeat("\t", $tabs) . \str_repeat(' ', (int) $spaces); - } - } - - return \str_repeat(' ', $length); - } -} diff --git a/vendor/phpcsstandards/phpcsextra/Universal/ruleset.xml b/vendor/phpcsstandards/phpcsextra/Universal/ruleset.xml deleted file mode 100644 index e29238f..0000000 --- a/vendor/phpcsstandards/phpcsextra/Universal/ruleset.xml +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0"?> -<ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="Universal" namespace="PHPCSExtra\Universal" xsi:noNamespaceSchemaLocation="https://schema.phpcodesniffer.com/phpcs.xsd"> - - <description>A collection of universal sniffs. This standard is not designed to be used to check code. Include individual sniffs from this standard in a custom ruleset instead.</description> -</ruleset> diff --git a/vendor/phpcsstandards/phpcsextra/composer.json b/vendor/phpcsstandards/phpcsextra/composer.json deleted file mode 100644 index 89b7f22..0000000 --- a/vendor/phpcsstandards/phpcsextra/composer.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "name" : "phpcsstandards/phpcsextra", - "description" : "A collection of sniffs and standards for use with PHP_CodeSniffer.", - "type" : "phpcodesniffer-standard", - "keywords" : [ "phpcs", "phpcbf", "standards", "static analysis", "php_codesniffer", "phpcodesniffer-standard" ], - "license" : "LGPL-3.0-or-later", - "authors" : [ - { - "name" : "Juliette Reinders Folmer", - "role" : "lead", - "homepage" : "https://github.com/jrfnl" - }, - { - "name" : "Contributors", - "homepage" : "https://github.com/PHPCSStandards/PHPCSExtra/graphs/contributors" - } - ], - "support" : { - "issues" : "https://github.com/PHPCSStandards/PHPCSExtra/issues", - "source" : "https://github.com/PHPCSStandards/PHPCSExtra", - "security": "https://github.com/PHPCSStandards/PHPCSExtra/security/policy" - }, - "require" : { - "php" : ">=5.4", - "squizlabs/php_codesniffer" : "^3.13.5 || ^4.0.1", - "phpcsstandards/phpcsutils" : "^1.2.0" - }, - "require-dev" : { - "php-parallel-lint/php-parallel-lint": "^1.4.0", - "php-parallel-lint/php-console-highlighter": "^1.0", - "phpcsstandards/phpcsdevcs": "^1.2.0", - "phpcsstandards/phpcsdevtools": "^1.2.1", - "phpunit/phpunit": "^4.5 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" - }, - "minimum-stability": "dev", - "prefer-stable": true, - "extra": { - "branch-alias": { - "dev-stable": "1.x-dev", - "dev-develop": "1.x-dev" - } - }, - "scripts" : { - "lint": [ - "@php ./vendor/php-parallel-lint/php-parallel-lint/parallel-lint . --show-deprecated -e php --exclude vendor --exclude .git" - ], - "checkcs": [ - "@php ./vendor/squizlabs/php_codesniffer/bin/phpcs" - ], - "fixcs": [ - "@php ./vendor/squizlabs/php_codesniffer/bin/phpcbf" - ], - "check-complete": [ - "@php ./vendor/phpcsstandards/phpcsdevtools/bin/phpcs-check-feature-completeness ./Modernize ./NormalizedArrays ./Universal" - ], - "test-phpcs3": [ - "@php ./vendor/phpunit/phpunit/phpunit --filter PHPCSExtra --no-coverage ./vendor/squizlabs/php_codesniffer/tests/AllTests.php" - ], - "test-phpcs4": [ - "@php ./vendor/phpunit/phpunit/phpunit --no-coverage" - ], - "coverage-phpcs3": [ - "@php ./vendor/phpunit/phpunit/phpunit --filter PHPCSExtra ./vendor/squizlabs/php_codesniffer/tests/AllTests.php" - ], - "coverage-phpcs4": [ - "@php ./vendor/phpunit/phpunit/phpunit" - ], - "coverage-phpcs3-local": [ - "@php ./vendor/phpunit/phpunit/phpunit --filter PHPCSExtra ./vendor/squizlabs/php_codesniffer/tests/AllTests.php --coverage-html ./build/coverage-html" - ], - "coverage-phpcs4-local": [ - "@php ./vendor/phpunit/phpunit/phpunit --coverage-html ./build/coverage-html" - ] - }, - "config": { - "allow-plugins": { - "dealerdirect/phpcodesniffer-composer-installer": true - }, - "lock": false - } -} diff --git a/vendor/phpcsstandards/phpcsutils/CHANGELOG.md b/vendor/phpcsstandards/phpcsutils/CHANGELOG.md deleted file mode 100644 index d986022..0000000 --- a/vendor/phpcsstandards/phpcsutils/CHANGELOG.md +++ /dev/null @@ -1,1425 +0,0 @@ -# Change Log for PHPCSUtils for PHP CodeSniffer - -All notable changes to this project will be documented in this file. - -This projects adheres to [Keep a CHANGELOG](https://keepachangelog.com/) and uses [Semantic Versioning](https://semver.org/). - - -## [Unreleased] - -_Nothing yet._ - - -## [1.2.2] - 2025-12-08 - -### Added - -#### PHPCS Backcompat - -* `BCTokens::castTokens()`: sync with PHPCS 4.0.2 - added the `T_VOID_CAST` token (when available). [#742] - -### Changed - -#### Utils - -* `FunctionDeclarations::getProperties()`: more defensive coding against parse errors/live coding. [#740] - -#### Other - -* Various housekeeping. - -[#740]: https://github.com/PHPCSStandards/PHPCSUtils/pull/740 -[#742]: https://github.com/PHPCSStandards/PHPCSUtils/pull/742 - - -## [1.2.1] - 2025-11-17 - -### Fixed - -#### Abstract Sniffs - -* The `AbstractArrayDeclarationSniff::getActualArrayKey()` method could cause deprecation notices and even fatal errors, when a PHPCS scan would be run on a different PHP version than the "code under scan" is targeting and the "code under scan" contained deprecated/removed type casts. [#733] - -[#733]: https://github.com/PHPCSStandards/PHPCSUtils/pull/733 - - -## [1.2.0] - 2025-11-11 - -### Added - -#### Utils - -* New [`PHPCSUtils\Utils\AttributeBlock`][`AttributeBlock`] class: Utility functions to examine attribute blocks. [#720], [#729] - For the purposes of these utilities, an "attribute block" is defined as being an attribute opener, an attribute closer and everything between. I.e. `#[MyAttribute(1, 2), AnotherAttribute]` is one attribute block. - Initial set of available methods: - - `getAttributes()` to retrieve information about each attribute being instantiated within a particular attribute block. - - `countAttributes()` to retrieve a count of the number of attribute instantiations with a particular attribute block. - - `appliesTo()` to find the stack pointer to the language construct an attribute block applies to. -* New `PHPCSUtils\Utils\Constants::getAttributeOpeners()`, `PHPCSUtils\Utils\FunctionDeclarations::getAttributeOpeners()`, `PHPCSUtils\Utils\ObjectDeclarations::getAttributeOpeners()` and `PHPCSUtils\Utils\Variables::getAttributeOpeners()` utility methods. [#719] - These methods will each return an array with the stack pointers to the attribute openers for applicable attribute blocks. - This may be an empty array if no attributes apply to the constant/function/OO structure/property. - -### Changed - -#### Other - -* Dropped support for [PHP_CodeSniffer] < 3.13.5/4.0.1. [#729] - Please ensure you run `composer update phpcsstandards/phpcsutils --with-dependencies` to benefit from this. -* Various housekeeping. - -[#719]: https://github.com/PHPCSStandards/PHPCSUtils/pull/719 -[#720]: https://github.com/PHPCSStandards/PHPCSUtils/pull/720 -[#729]: https://github.com/PHPCSStandards/PHPCSUtils/pull/729 - - -## [1.1.3] - 2025-10-16 - -### Changed - -#### Other - -* Various housekeeping. - -### Fixed - -#### PHPCS Backcompat - -* `BCFile::getMemberProperties()`: sync with PHPCS 3.13.4 - fix PHP 8.5 "Using null as an array offset" deprecation notice. [#711] - -[#711]: https://github.com/PHPCSStandards/PHPCSUtils/pull/711 - - -## [1.1.2] - 2025-09-05 - -### Added - -#### PHPCS BackCompat - -* `BCFile::getMemberProperties()`: sync with PHPCS 3.13.3 - support for PHP 8.4 abstract properties. [#698] - -#### Utils - -* `Variables::getMemberProperties()`: support for PHP 8.4 abstract properties. [#698] - -### Changed - -#### Utils - -* `TypeString::normalizeCase()` will now also normalize a fully qualified `true`, `false` or `null` type to unqualified. [#702] - -#### Other - -* Dropped support for [PHP_CodeSniffer] < 3.13.3. [#698] - Please ensure you run `composer update phpcsstandards/phpcsutils --with-dependencies` to benefit from this. -* Various housekeeping. - -### Fixed - -#### Utils - -* `TypeString::isNullable()`: a type string with a fully qualified `null` was not recognized as nullable. [#702] -* `TypeString::isKeyword()`: a fully qualified `true`, `false` or `null` type was not recognized as a keyword type. [#702] - -_Note: using fully qualified `true`, `false` or `null` in a typestring is not allowed by PHP. Even so, the `TypeString` utility will now handle this in a parse error tolerant manner._ - -[#698]: https://github.com/PHPCSStandards/PHPCSUtils/pull/698 -[#702]: https://github.com/PHPCSStandards/PHPCSUtils/pull/702 - - -## [1.1.1] - 2025-08-10 - -### Changed - -#### TestUtils - -* The [`PHPCSUtils\TestUtils\UtilityMethodTestCase`][`UtilityMethodTestCase`] now uses the PHP_CodeSniffer `LocalFile` instead of the `DummyFile` class under the hood. [#692] - -### Fixed - -#### TestUtils - -* Prevent PHP 8.5 deprecation notices for `Reflection*::setAccessible()` in the [`PHPCSUtils\TestUtils\UtilityMethodTestCase`][`UtilityMethodTestCase`] and the [`PHPCSUtils\TestUtils\ConfigDouble`][`ConfigDouble`] classes. [#695] - -[#692]: https://github.com/PHPCSStandards/PHPCSUtils/pull/692 -[#695]: https://github.com/PHPCSStandards/PHPCSUtils/pull/695 - - -## [1.1.0] - 2025-06-12 - -### Added - -Compatibility with the new PHP_CodeSniffer `4.x` branch in anticipation of the PHP_CodeSniffer 4.0 release. [#674], [#679] -PHPCSUtils should now be fully compatible with PHP_CodeSniffer 4.0 (again). If you still find an issue, please report it. - -#### PHPCS BackCompat - -* `BCFile::findExtendedClassName()`: sync with PHPCS 4.0.0 - support for namespace relative names when used as the _extended_ parent class name. [#674] -* `BCFile::findImplementedInterfaceNames()`: sync with PHPCS 4.0.0 - support for namespace relative names when used in _implemented_ interface names. [#674] -* `BCFile::getMemberProperties()`: sync with PHPCS 3.12.0 - support for PHP 8.4 final properties. Thanks [@DanielEScherzer]! [#646] -* `BCFile::getMemberProperties()`: sync with PHPCS 3.13.1 - support for PHP 8.4 asymmetric visibility. [#677] -* `BCFile::getMemberProperties()`: sync with PHPCS 4.0.0. [#674] - - Add support for PHP 8.4 properties in interfaces. - - Removed parse error warning. -* `BCFile::getMethodParameters()`: sync with PHPCS 3.13.1 - support for PHP 8.4 asymmetric visibility. [#677] -* `BCFile::findStartOfStatement()`: sync with PHPCS 3.12.1 - support for `goto` as a `switch` - `case` terminating statement. [#661] -* `BCTokens::nameTokens()` as introduced in PHPCS 4.0.0. [#674] - The same token array previously already existed in PHPCSUtils as `Collections::nameTokens()`. -* `BCTokens::functionNameTokens()`: sync with PHPCS 4.0.0 - added the `T_ANON_CLASS` token. [#674] -* `BCTokens::parenthesisOpeners()`: sync with PHPCS 4.0.0 - added the `T_USE`, `T_ISSET`, `T_UNSET`, `T_EMPTY`, `T_EVAL` and `T_EXIT` tokens. [#674] - Note: While `T_USE`, `T_ISSET`, `T_UNSET`, `T_EMPTY`, `T_EVAL` and `T_EXIT` will be included in the return value for this method, - the associated parentheses will not have the `'parenthesis_owner'` index set unless PHPCS 4.0.0 is used. - Use the [`Parentheses::getOwner()`][`Parentheses`] or the [`Parentheses::hasOwner()`][`Parentheses`] methods if you need to check - whether any of these tokens are a parentheses owner. The methods in the `Parentheses` class are PHPCS cross-version compatible. - -#### TestUtils - -* New [`PHPCSUtils\TestUtils\ConfigDouble`][`ConfigDouble`] class as a lightweight and more stable alternative to directly using the PHPCS native `Config` class in tests. [#550], [#612] - Props to [@fredden] for helping me find and fix a bug in this feature before it was released. -* New [`PHPCSUtils\TestUtils\RulesetDouble`][`RulesetDouble`] class which allows for creating a `Ruleset` object without registering any sniffs. [#674] - This allows for the [`PHPCSUtils\TestUtils\UtilityMethodTestCase`][`UtilityMethodTestCase`] class to be cross-version compatible with both PHP_CodeSniffer 3.x as well as 4.x. -* New [`PHPCSUtils\TestUtils\UtilityMethodTestCase::parseFile()`][`UtilityMethodTestCase`] method to allow for on-demand tokenizing of a (secondary) test case file. [#591], [#610] - This method is intended for tests which need to use multiple test case files, like, for example, tests which need to verify that a utility resets a `$fileName` property on seeing another file. -* New [`PHPCSUtils\TestUtils\UtilityMethodTestCase::testTestMarkersAreUnique()` and `PHPCSUtils\TestUtils\UtilityMethodTestCase::assertTestMarkersAreUnique()`][`UtilityMethodTestCase`] methods which automatically check that code sample files used with this `TestCase` do not contain duplicate test case markers. [#642] - If needs be, the test method can be disabled by overloading it (discouraged). If a test uses multiple test case/code sample files, the assertion method can be called directly. - -#### Tokens - -* New [`Collections::constantTypeTokens()`][`Collections`] method to support PHP 8.3 typed class constants. [#562] -* New [`Collections::ternaryOperators()`][`Collections`] method. [#549] -* `T_EXIT` to the `Collections::functionCallTokens()` and `Collections::parameterPassingTokens()` in light of the PHP 8.4 "exit as function" change. [#618] -* The PHP 8.4 asymmetric visibility tokens have been added to the [`Collections::propertyModifierKeywords()`][`Collections`] method. [#653] -* `T_INTERFACE` has been added to the [`Collections::ooPropertyScopes()`][`Collections`] method for PHP 8.4 interface properties support. [#674] - -#### Utils - -* New [`PHPCSUtils\Utils\Constants`][`Constants`] class: Utility functions to examine (class) constants. [#562] - Initially available method: `getProperties()` to retrieve an array of information about an OO constant declaration. -* New [`PHPCSUtils\Utils\FileInfo`][`FileInfo`] class: Utility functions to check characteristics of the file under scan. [#572] - Initial set of available methods: `hasByteOrderMark()` and `hasSheBang()`. -* New [`PHPCSUtils\Utils\FilePath`][`FilePath`] class: Utility functions for handling and comparing file paths. [#593] - Initial set of available methods: `getName()` to retrieve the normalized path for the current file, `isStdin()`, `normalizeAbsolutePath()`, `normalizeDirectorySeparators()`, `trailingSlashIt()` and `startsWith()`. -* New [`PHPCSUtils\Utils\TypeString`][`TypeString`] class: Utility functions for analysing typestrings as retrieved via the various available `getParameters()`/`getProperties()` methods. [#588] - Initial set of available methods: `getKeywordTypes()`, `isKeyword()`, `normalizeCase()`, `isSingular()`, `isNullable()`, `isUnion()`, `isIntersection()`, `isDNF()`, `toArray()`, `toArrayUnique()`, `filterKeywordTypes()` and `filterOOTypes()`. - Note: The `is*()` methods will not check if the type string provided is valid, as doing so would inhibit what sniffs can flag. The `is*()` methods will only look at the form of the type string to determine if it could be valid for a certain type. -* New `PHPCSUtils\Utils\ObjectDeclarations::getDeclaredConstants()`, `PHPCSUtils\Utils\ObjectDeclarations::getDeclaredEnumCases()`, `PHPCSUtils\Utils\ObjectDeclarations::getDeclaredProperties()` and `PHPCSUtils\Utils\ObjectDeclarations::getDeclaredMethods()` utility methods. [#592] - These methods will each return an array with the name of the constant/case/property/method as the key and the typical stack pointer needed for further processing. - The retrieval of this information is highly optimized for performance. If a sniff needs to search for a named constant/enum case/property/method in an OO structure, in most cases, these methods should be the recommended way for finding the declaration, instead of the sniff attempting to do this itself. - Mind: the return value of the `getDeclaredProperties()` method includes constructor promoted properties. Passing the stack pointer of constructor promoted properties onto a call to the `Variables::getMemberProperties()` method, however, is currently not supported. -* `FunctionDeclarations::getParameters()`: support for PHP 8.4 asymmetric visibility. [#677] -* `Variables::getMemberProperties()`: support for PHP 8.4 final properties. Thanks [@DanielEScherzer]! [#646] -* `Variables::getMemberProperties()`: support for PHP 8.4 asymmetric visibility. [#677] - -### Changed - -* The exceptions thrown by PHPCSUtils native utilities have been made more modular and more specific. [#598], [#599], [#600] - - Passing a parameter of the wrong type will now result in a `PHPCSUtils\Exceptions\TypeError` being thrown. - - Passing a parameter of the correct type, but with an invalid value, like an empty string when only non-empty strings are expected/accepted, will now result in a `PHPCSUtils\Exceptions\ValueError` being thrown. - - Passing a (positive) integer stack pointer, which doesn't exist in the token stack of the current file, will now result in a `PHPCSUtils\Exceptions\OutOfBoundsStackPtr` being thrown. - - Passing a stack pointer to a token which is not within the range of token types which is accepted by the method, will now result in a `PHPCSUtils\Exceptions\UnexpectedTokenType` being thrown. - - Logic errors will now result in a `PHPCSUtils\Exceptions\LogicException` being thrown. - This can occur, for instance, when a method takes a `$start` and `$end` parameter and the `$end` pointer is before the `$start` pointer. - - Missing, conditionally required, parameters, will now result in a `PHPCSUtils\Exceptions\MissingArgumentError` being thrown. - - Generic errors will now result in a `PHPCSUtils\Exceptions\RuntimeException` being thrown. - - Previously the PHPCS native `PHP_CodeSniffer\Exceptions\RuntimeException` was used for all these exceptions. - Catching the PHPCS native `RuntimeException` will still catch the new exceptions, but it is strongly recommended to be more selective when catching exceptions to prevent accidentally hiding errors in sniffs. - - Also note that the PHPCSUtils native utilities now include more and stricter type checking to help surface bugs in sniffs. - -#### Abstract Sniffs - -* The `AbstractArrayDeclarationSniff::process()` method will no longer hide exceptions about a non-integer or non-existent stack pointer being passed. [#600] -* The `AbstractArrayDeclarationSniff::processArray()` method will no longer hide exceptions about non-integer or non-existent stack pointers being passed. [#600] - -#### PHPCS BackCompat - -* `BCFile::getDeclarationName()`: sync with PHPCS 3.12.0 - prevent incorrect result during live coding for unfinished closures. [#644] -* `BCFile::getDeclarationName()`: sync with PHPCS 4.0.0 - no longer accept the `T_CLOSURE` or `T_ANON_CLASS` tokens. [#674] - Passing these will now result in an exception. -* `BCFile::getDeclarationName()`: sync with PHPCS 4.0.0 - the method will now always return a string. [#674] - Previously, the method could return `null` when the name could not be determined. Now it will return an empty string. - -#### TestUtils - -* The [`PHPCSUtils\TestUtils\UtilityMethodTestCase`][`UtilityMethodTestCase`] is now officially compatible with PHPUnit 11 and will no longer generate any deprecation notices on PHPUnit 11. - -#### Utils - -* [`Parentheses`]: all methods will now recognize closer `use()` as a parentheses owner. [#674] - Note: PHPCS natively does not recognize closure `use` as a parentheses owners until PHP_CodeSniffer 4.0. -* All methods in the [`PassedParameters`] class will now be able to analyze exit/die when used as a function call. [#618] -* The `Scopes::isOOProperty()` method now allows for PHP 8.4 properties in interfaces. [#674] - - This also adds support for properties in interfaces to the `Variables::getMemberProperties()` method. -* The `UseStatements::splitAndMergeImportUseStatement()` method will no longer hide exceptions about a non-integer, non-existent or non-`T_USE` stack pointer being passed. [#600] - -#### Other - -* Dropped support for [PHP_CodeSniffer] < 3.13.0. [#629], [#653] - Please ensure you run `composer update phpcsstandards/phpcsutils --with-dependencies` to benefit from this. -* Various housekeeping, including making the test suite compatible with PHPUnit 11. - -### Deprecated - -#### TestUtils - -* The (internal) `PHPCSUtils\TestUtils\UtilityMethodTestCase::setStaticConfigProperty()` method. [#550] - This method has become redundant with the introduction of the `ConfigDouble` class. - -### Removed - -#### PHPCS BackCompat - -* The javascript specific `T_ZSR_EQUAL` token from the `BCTokens::assignmentTokens()` array, as per PHPCS 4.0.0. [#674] -* The javascript specific `T_OBJECT` token from the `BCTokens::blockOpeners()` array, as per PHPCS 4.0.0. [#674] -* The javascript specific `T_PROPERTY` and `T_OBJECT` tokens from the `BCTokens::blockOpeners()` array, as per PHPCS 4.0.0. [#674] - -### Fixed - -#### Abstract Sniffs - -* `AbstractArrayDeclarationSniff::getActualArrayKey()`: will now handle FQN `true`/`false`/`null` correctly. [#668] - -#### Utils - -* `Context::inForeachCondition()` could misidentify the `as` keyword for `foreach` when the iterable expression contained an array declaration in which the `as` keyword was being used. [#617] -* The `Numbers::is*()` methods could misidentify strings which look like numeric literals with underscores, but are in actual fact invalid as numeric literals, as valid numbers. [#619], [#620] -* `UseStatements::getType()` will now handle unfinished closure `use` statements (parse errors) more consistently and return `'closure'` for those cases. [#667] - -[#549]: https://github.com/PHPCSStandards/PHPCSUtils/pull/549 -[#550]: https://github.com/PHPCSStandards/PHPCSUtils/pull/550 -[#562]: https://github.com/PHPCSStandards/PHPCSUtils/pull/562 -[#572]: https://github.com/PHPCSStandards/PHPCSUtils/pull/572 -[#588]: https://github.com/PHPCSStandards/PHPCSUtils/pull/588 -[#591]: https://github.com/PHPCSStandards/PHPCSUtils/pull/591 -[#592]: https://github.com/PHPCSStandards/PHPCSUtils/pull/592 -[#593]: https://github.com/PHPCSStandards/PHPCSUtils/pull/593 -[#598]: https://github.com/PHPCSStandards/PHPCSUtils/pull/598 -[#599]: https://github.com/PHPCSStandards/PHPCSUtils/pull/599 -[#600]: https://github.com/PHPCSStandards/PHPCSUtils/pull/600 -[#610]: https://github.com/PHPCSStandards/PHPCSUtils/pull/610 -[#612]: https://github.com/PHPCSStandards/PHPCSUtils/pull/612 -[#617]: https://github.com/PHPCSStandards/PHPCSUtils/pull/617 -[#618]: https://github.com/PHPCSStandards/PHPCSUtils/pull/618 -[#619]: https://github.com/PHPCSStandards/PHPCSUtils/issues/619 -[#620]: https://github.com/PHPCSStandards/PHPCSUtils/pull/620 -[#629]: https://github.com/PHPCSStandards/PHPCSUtils/pull/629 -[#642]: https://github.com/PHPCSStandards/PHPCSUtils/pull/642 -[#644]: https://github.com/PHPCSStandards/PHPCSUtils/pull/644 -[#646]: https://github.com/PHPCSStandards/PHPCSUtils/pull/646 -[#653]: https://github.com/PHPCSStandards/PHPCSUtils/pull/653 -[#661]: https://github.com/PHPCSStandards/PHPCSUtils/pull/661 -[#667]: https://github.com/PHPCSStandards/PHPCSUtils/pull/667 -[#668]: https://github.com/PHPCSStandards/PHPCSUtils/pull/668 -[#674]: https://github.com/PHPCSStandards/PHPCSUtils/pull/674 -[#677]: https://github.com/PHPCSStandards/PHPCSUtils/pull/677 -[#679]: https://github.com/PHPCSStandards/PHPCSUtils/pull/679 - - -## [1.0.12] - 2024-05-20 - -### Added - -#### PHPCS BackCompat - -* `BCFile::getMemberProperties()`: sync with PHPCS 3.10.0 - support for PHP 8.2 DNF types. [#604] -* `BCFile::getMethodProperties()`: sync with PHPCS 3.10.0 - support for PHP 8.2 DNF types. [#604] -* `BCFile::getMethodParameters()`: sync with PHPCS 3.10.0 - support for PHP 8.2 DNF types. [#604] - -#### Utils - -* `FunctionDeclarations::getParameters()`: support for PHP 8.2 DNF types. [#604] -* `FunctionDeclarations::getProperties()`: support for PHP 8.2 DNF types. [#604] -* `Variables::getMemberProperties()`: support for PHP 8.2 DNF types. [#604] - -### Changed - -#### Tokens - -* `Collections::parameterTypeTokens()`, `Collections::propertyTypeTokens()` and `Collections::returnTypeTokens()`: now include the new `T_TYPE_OPEN_PARENTHESIS` and `T_TYPE_CLOSE_PARENTHESIS` tokens for PHP 8.2 DNF type support. [#604] - -#### Utils - -* `ControlStructures::getCaughtExceptions()`: will now silently ignore parse errors in the code under scan which prevent the method from analyzing a `catch` statement. [#594] - The method will now return an empty array instead of throwing a `PHP_CodeSniffer\Exceptions\RuntimeException`. - -#### Other - -* Dropped support for [PHP_CodeSniffer] < 3.10.0. [#603] - Please ensure you run `composer update phpcsstandards/phpcsutils --with-dependencies` to benefit from this. -* Various housekeeping and documentation improvements. - -### Fixed - -#### Utils - -* `UseStatements::splitImportUseStatement()`: the values in the return array will now never include a leading backslash. [#590] - Previously the behaviour around import `use` statements declared with a leading backslash was undefined and the backslash would be included in the return value. - -[#590]: https://github.com/PHPCSStandards/PHPCSUtils/pull/590 -[#594]: https://github.com/PHPCSStandards/PHPCSUtils/pull/594 -[#603]: https://github.com/PHPCSStandards/PHPCSUtils/pull/603 -[#604]: https://github.com/PHPCSStandards/PHPCSUtils/pull/604 - - -## [1.0.11] - 2024-04-24 - -### Changed - -#### Other - -* Various housekeeping and documentation improvements. Includes a contribution from [@fredden]. - -### Fixed - -#### PHPCS BackCompat - -* `BCFile::getMethodProperties()`: small performance improvement & more defensive coding, in line with same fix in PHPCS 3.9.2. [#573] - -#### Utils - -* `FunctionDeclarations::getProperties()`: small performance improvement & more defensive coding, in line with same fix in PHPCS 3.9.2. [#573] - -[#573]: https://github.com/PHPCSStandards/PHPCSUtils/pull/573 - - -## [1.0.10] - 2024-03-18 - -### Changed - -#### Other - -* Dropped support for [PHP_CodeSniffer] < 3.9.0. [#561] - Please ensure you run `composer update phpcsstandards/phpcsutils --with-dependencies` to benefit from this. -* Various housekeeping and documentation improvements. - -### Deprecated - -#### Utils - -* `NamingConventions::AZ_UPPER` constant. [#563] -* `NamingConventions::AZ_LOWER` constant. [#563] - -### Fixed - -#### PHPCS BackCompat - -* `BackCompat\Helper::getEncoding()`: PHP 8.4 deprecation notice. [#568] -* `BackCompat\Helper::ignoreAnnotations()`: PHP 8.4 deprecation notice. [#568] - -[#561]: https://github.com/PHPCSStandards/PHPCSUtils/pull/561 -[#563]: https://github.com/PHPCSStandards/PHPCSUtils/pull/563 -[#568]: https://github.com/PHPCSStandards/PHPCSUtils/pull/568 - - -## [1.0.9] - 2023-12-08 - -### Added - -#### PHPCS BackCompat - -* `BCFile::getMemberProperties()`: sync with PHPCS 3.8.0 - support for PHP 8.2 `true` type. [#524] -* `BCFile::getMethodProperties()`: sync with PHPCS 3.8.0 - support for PHP 8.2 `true` type. [#524] -* `BCFile::getMethodParameters()`: sync with PHPCS 3.8.0 - support for PHP 8.2 `true` type. [#524] - -### Changed - -#### TestUtils - -* Significant performance improvement for the [`UtilityMethodTestCase`]. [#525] - -#### Other - -* Dropped support for [PHP_CodeSniffer] < 3.8.0. [#523] - Please ensure you run `composer update phpcsstandards/phpcsutils --with-dependencies` to benefit from this. -* Small improvements to the documentation website generation. Includes a contribution from [@fredden]. -* Various housekeeping and documentation improvements. Includes a contribution from [@fredden]. - -[#523]: https://github.com/PHPCSStandards/PHPCSUtils/pull/523 -[#524]: https://github.com/PHPCSStandards/PHPCSUtils/pull/524 -[#525]: https://github.com/PHPCSStandards/PHPCSUtils/pull/525 - - -## [1.0.8] - 2023-07-17 - -### Changed - -#### PHPCS BackCompat - -* `BCFile::getDeclarationName()`: sync with PHPCS 3.8.0 - support for functions called `self`, `parent` or `static` which return by reference. [#494] - -#### Other - -* Various housekeeping and minor documentation improvements. - -### Fixed - -#### Fixers - -* The [`SpacesFixer`] will no longer throw an (incorrect) exception when the second pointer passed is a comment token and this comment token is the last content in a file. [#493] - -[#493]: https://github.com/PHPCSStandards/PHPCSUtils/pull/493 -[#494]: https://github.com/PHPCSStandards/PHPCSUtils/pull/494 - - -## [1.0.7] - 2023-07-10 - -### Changed - -#### Other - -* Various housekeeping and maintenance updates, including making the test suite compatible with PHPUnit 10. - -### Fixed - -#### Utils - -* The `Arrays::getDoubleArrowPtr()` method could previously get confused over a double arrow in a keyed list used as an array value. [#485] - -[#485]: https://github.com/PHPCSStandards/PHPCSUtils/pull/485 - - -## [1.0.6] - 2023-05-27 - -### Changed - -#### PHPCS BackCompat - -* `BCFile::getClassProperties()`: sync with PHPCS 3.8.0 - support for PHP 8.2 `readonly` classes. [#470] -* `BCFile::getMethodParameters()`: sync with PHPCS 3.8.0 - support for constructor property promotion with `readonly` properties without explicit visibility. [#472] - -#### Utils - -* The results of the following methods will now (also) be cached for improved performance when multiple sniffs call these functions for the same token during a PHPCS run. [#464], [#466] - - `FunctionDeclarations::getProperties()` - - `Variables::getMemberProperties()` -* Additionally, the results of the `UseStatements::splitImportUseStatement()` method will be cached more often and the cache checked earlier. [#467] -* The return value of the `ControlStructures::getCaughtExceptions()` method will no longer contain "empty" entries for catch statements without a named exception. It will return an empty array instead. [#474] - -#### Other - -* Various small housekeeping and maintenance updates. - -### Fixed - -### Abstract Sniffs - -* `AbstractArrayDeclarationSniff`: fixed a potential "Trying to access array offset on value of type bool" PHP notice. [#476] -* `AbstractArrayDeclarationSniff`: the abstract will no longer trigger potentially available magic `__get()`/`__set()` etc methods. [#477] - -[#464]: https://github.com/PHPCSStandards/PHPCSUtils/pull/464 -[#466]: https://github.com/PHPCSStandards/PHPCSUtils/pull/466 -[#467]: https://github.com/PHPCSStandards/PHPCSUtils/pull/467 -[#470]: https://github.com/PHPCSStandards/PHPCSUtils/pull/470 -[#472]: https://github.com/PHPCSStandards/PHPCSUtils/pull/472 -[#474]: https://github.com/PHPCSStandards/PHPCSUtils/pull/474 -[#476]: https://github.com/PHPCSStandards/PHPCSUtils/pull/476 -[#477]: https://github.com/PHPCSStandards/PHPCSUtils/pull/477 - - -## [1.0.5] - 2023-04-17 - -### Fixed - -#### Utils - -* The `Lists::getAssignments()` method could previously get confused over exotic list keys. Fixed now. [#459] - -[#459]: https://github.com/PHPCSStandards/PHPCSUtils/pull/459 - - -## [1.0.4] - 2023-04-15 - -### Changed - -#### Other - -* Minor documentation improvements. - -### Fixed - -#### Utils - -* The `FunctionDeclarations::getParameters()` method will now correctly handle constructor promoted properties with `readonly`, but without explicit visibility set. [#456] - -[#456]: https://github.com/PHPCSStandards/PHPCSUtils/pull/456 - - -## [1.0.3] - 2023-04-13 - -### Changed - -#### Other - -* Various small housekeeping and maintenance updates. - -### Fixed - -#### Utils - -* The `PassedParameters` class now allows for function calls to global functions called `self()`, `parent()` or `static()`. [#452] - -[#452]: https://github.com/PHPCSStandards/PHPCSUtils/pull/452 - - -## [1.0.2] - 2023-03-28 - -### Changed - -#### Tokens - -* The `Collections::arrayOpenTokensBC()`, `Collections::arrayTokensBC()`, `Collections::listOpenTokensBC()`, `Collections::listTokensBC()`, `Collections::shortArrayListOpenTokensBC()`, `Collections::shortArrayTokensBC()` and `Collections::shortListTokensBC()` token arrays will no longer contain the `T_OPEN_SQUARE_BRACKET` and/or the `T_CLOSE_SQUARE_BRACKET` token constants if PHP_CodeSniffer 3.7.2 or higher is used. [#444] - An upstream bugfix makes it unnecessary to check those tokens for being a short array or short list. - Sniff which use these token arrays is combination with using the `Arrays`/`Lists` classes, should experience a performance boost on PHPCS 3.7.2+ due to this change. - -#### Other - -* Minor documentation improvements. -* Various small housekeeping and maintenance updates. - -### Fixed - -#### Utils - -* The `Lists::isShortList()` method will now correctly recognize a short list nested in a long list as a short list. [#446] - Note: this is a parse error in PHP, but the method should still handle this correctly. - -[#444]: https://github.com/PHPCSStandards/PHPCSUtils/pull/444 -[#446]: https://github.com/PHPCSStandards/PHPCSUtils/pull/446 - - -## [1.0.1] - 2023-01-05 - -### Changed - -#### Other - -* Composer: The version requirements for the [Composer PHPCS plugin] have been widened to allow for version 1.0.0. [#428] - Please ensure you run `composer update phpcsstandards/phpcsutils --with-dependencies` to benefit from this. -* Removed the references to pre-1.0.0 QA releases from the docs. [#425] -* Various small housekeeping and maintenance updates. Thanks [@szepeviktor] for contributing. - -[#425]: https://github.com/PHPCSStandards/PHPCSUtils/pull/425 -[#428]: https://github.com/PHPCSStandards/PHPCSUtils/pull/428 - - -## [1.0.0] - 2023-01-04 - -For the full list of features, please see the changelogs of the alpha/rc releases: -* [1.0.0-rc1](https://github.com/PHPCSStandards/PHPCSUtils/releases/tag/1.0.0-rc1) -* [1.0.0-alpha4](https://github.com/PHPCSStandards/PHPCSUtils/releases/tag/1.0.0-alpha4) -* [1.0.0-alpha3](https://github.com/PHPCSStandards/PHPCSUtils/releases/tag/1.0.0-alpha3) -* [1.0.0-alpha2](https://github.com/PHPCSStandards/PHPCSUtils/releases/tag/1.0.0-alpha2) -* [1.0.0-alpha1](https://github.com/PHPCSStandards/PHPCSUtils/releases/tag/1.0.0-alpha1) - -### Changed - -#### Other - -* Minor documentation improvements. -* Maintainability improvements. - - -## [1.0.0-rc1] - 2022-12-27 - -### Added - -#### Tokens - -* New [`Collections::constantModifierKeywords()`][`Collections`] method. [#400] -* New [`Collections::listOpenTokensBC()`][`Collections`] method. [#405] - -### Changed - -#### Utils - -* `ObjectDeclarations::getClassProperties()`: the array return value will now include `'abstract_token'`, `'final_token'`, and `'readonly_token'` indexes identifying the stack pointers to these keyword, where applicable. If the keyword is not used, the value will be set to `false`. [#401] - -#### Other - -* Various housekeeping and CI maintenance. - -### Removed - -Everything which was previously deprecated in the [1.0.0-alpha4 release], has now been removed. [#410] - -This includes: -* The `PHPCS23Utils` standard. -* [`Collections`] class: direct access to the properties in the class. -* [`Collections`] class: the `Collections::arrowFunctionTokensBC()`, `Collections::functionDeclarationTokensBC()`, `Collections::parameterTypeTokensBC()`, `Collections::propertyTypeTokensBC()` and `Collections::returnTypeTokensBC()` methods. -* The `ControlStructures::getDeclareScopeOpenClose()` method. -* The `FunctionDeclarations::getArrowFunctionOpenClose()` method. -* The `FunctionDeclarations::isArrowFunction()` method. - -See the changelog for the [1.0.0-alpha4 release] for details about replacements for the removed functionality. - -### Fixed - -#### Utils - -* `Arrays::getOpenClose()`: small efficiency fix. [#406] -* `ControlStructures::hasBody()`: correctly identify that a control structure does not have a body - `'has_body' = false` -, when the control structure is ended by a PHP close tag. [#403] -* `Lists::getOpenClose()`: small efficiency fix. [#407] - -[1.0.0-alpha4 release]: https://github.com/PHPCSStandards/PHPCSUtils/releases/tag/1.0.0-alpha4 - -[#400]: https://github.com/PHPCSStandards/PHPCSUtils/pull/400 -[#401]: https://github.com/PHPCSStandards/PHPCSUtils/pull/401 -[#403]: https://github.com/PHPCSStandards/PHPCSUtils/pull/403 -[#405]: https://github.com/PHPCSStandards/PHPCSUtils/pull/405 -[#406]: https://github.com/PHPCSStandards/PHPCSUtils/pull/406 -[#407]: https://github.com/PHPCSStandards/PHPCSUtils/pull/407 -[#410]: https://github.com/PHPCSStandards/PHPCSUtils/pull/410 - - -## [1.0.0-alpha4] - 2022-10-25 - -Notes: -* While still in alpha, some BC-breaks may be introduced. These are clearly indicated in the changelog with the :warning: symbol. -* Until PHPCS 4.x has been released, PHPCSUtils does not formally support it, though an effort is made to keep up with the changes and anticipate potential compatibility issues. - For testing purposes only, the composer configuration allows for PHPCSUtils to be installed with PHPCS 4.x. - -### Breaking Changes - -Support for PHP_CodeSniffer < 3.7.1 has been dropped after consultation with the principle external standards which depend on PHPCSUtils. [#347] - -This was unfortunately necessary as the incessant additions of new syntaxes since PHP 7.4 made it impossible to continue to support PHPCS < 3.7.1, while still providing reliable results for modern PHP code. - -### Added - -Now support for PHPCS < 3.7.1 has been dropped, this edition adds support to all functionality in PHPCSUtils for new syntaxes and features from PHP 8.0 and 8.1 and preliminary support for PHP 8.2. - -This means that support for the following syntaxes/features has been added (or existing support verified/improved): -* PHP 7.4 - - Array unpacking in array expressions. -* PHP 8.0 - - The `mixed` type. [#163] - - Union types, including supporting the `false` and `null` types. [#168], [#225] - - Constructor property promotion. [#169], [#226] - - Nullsafe object operators. [#176], [#183] - - Namespaced names as single token (cross-version PHPCS 3.x vs 4.x). [#205], [#206], [#207], [#208], [#209], [#210], [#211], [#212], [#213], [#217], [#241] - - Dereferencing of interpolated text strings. - - Named arguments in function calls. [#235], [#243], [#383] - - Match expressions. [#247], [#335], [#356] - - Trailing commas in parameter lists and closure `use` lists. - - Attributes. [#357] -* PHP 8.1 - - Enumerations. [#285], [#358] - - Explicit octal notation. [#293] - - Array unpacking with string keys. - - `never` type. - - Named parameters after argument unpacking. [#383] - - First class callables. [#362] - - Readonly properties. [#363] - - `new` in initializers. - - Intersection types. [#365] -* PHP 8.2 - - Constants in traits. [#366] - - Readonly classes. [#367] - - `true` type. [#368] - - `null` and `false` as stand-alone types. - -Please report any bugs/oversights you encounter! - -#### PHPCS Backcompat - -* `BCTokens::magicConstants()` as introduced in PHPCS 3.5.6. [#172] - The same token array previously already existed in PHPCSUtils as `Collections::$magicConstants` (which has now been deprecated). - -#### TestUtils - -* New [`UtilityMethodTestCase::usesPhp8NameTokens()`][UtilityMethodTestCase::usesPhp8NameTokens] method as a helper for tests using token position calculations when testing against both PHPCS 3.x as well as 4.x. [#200], [#217], [#241] - -#### Tokens - -* New [`PHPCSUtils\Tokens\TokenHelper`][`TokenHelper`] class: Utility functions for working with tokens and token collections. [#304] - This class initially contains a `tokenExists()` method to work around potential interference from PHP-Parser also backfilling tokens. - :point_right: External standards using a function call to `defined()` to determine whether a token is available should replace those with a function call to the `TokenHelper::tokenExists()` method. -* New [`Collections::arrayOpenTokensBC()`][`Collections`] method. [#233], [#311] -* New [`Collections::functionCallTokens()`][`Collections`] method to retrieve the tokens which can represent function calls and function-call-like language constructs, like class instantiations. [#233] -* New [`Collections::nameTokens()`][`Collections`] method to retrieve the tokens which can be used for "names", be it namespace, OO, function or constant names. [#204], [#217] -* New [`Collections::namespacedNameTokens()`][`Collections`] method to retrieve the tokens which can be encountered in a fully, partially or unqualified name and in namespace relative names. [#202], [#217] -* New [`Collections::parameterPassingTokens()`][`Collections`] method to retrieve the tokens which can be passed to the methods in the [`PassedParameters`] class. [#233] -* New [`Collections::phpOpenTags()`][`Collections`] method. [#254] -* New [`Collections::shortArrayListOpenTokensBC()`][`Collections`] method. [#381] - -#### Utils - -* New [`PHPCSUtils\Utils\Context`][`Context`] class: Utility functions to determine the context in which an arbitrary token is used. [#219]. [#390] - Initial set of available methods: `inEmpty()`, `inIsset()`, `inUnset()`, `inAttribute`, `inForeachCondition()` and `inForCondition()`. -* New [`PHPCSUtils\Utils\MessageHelper`][`MessageHelper`] class: Utility functions for creating error/warning messages. [#249], [#391] - Initial set of available methods: `addMessage()`, `addFixableMessage()`, `stringToErrorcode()` and `showEscapeChars()`. -* New [`PHPCSUtils\Utils\PassedParameters::getParameterFromStack()`][PassedParameters::getParameterFromStack] efficiency method to retrieve a potentially named function call parameter from a parameter information stack as previously retrieved via `PassedParameters::getParameters()`. [#235], [#237], [#383] -* New [`PHPCSUtils\Utils\TextStrings::getEndOfCompleteTextString()`][TextStrings::getEndOfCompleteTextString] method. [#320] - This method allows to retrieve the stack pointer to the last token within a - potentially multi-line - text string. - This method compliments the `TextStrings::getCompleteTextString()` method which will retrieve the contents of the complete text string. -* New [`PHPCSUtils\Utils\TextStrings::getEmbeds()`][TextStrings::getEmbeds] method to retrieve an array with all variables/expressions as embedded in a text string. [#321] -* New [`PHPCSUtils\Utils\TextStrings::stripEmbeds()`][TextStrings::stripEmbeds] method to strip all embedded variables/expressions from a text string. [#321] -* New [`PHPCSUtils\Utils\TextStrings::getStripEmbeds()`][TextStrings::getStripEmbeds] method. [#321] - This method is `public` for those rare cases where both the embeds, as well as the text stripped off embeds, is needed. -* New [`PHPCSUtils\Utils\UseStatements::mergeImportUseStatements()`][UseStatements::mergeImportUseStatements] method. [#196] - -#### Other - -* PHPCSUtils will now cache the results of (potentially) token walking intensive or processing intensive function calls during a run. [#332], [#377] - This should significantly improve performance when multiple sniffs call these functions for the same token during a PHPCS run. - The results of the following functions will now be cached: - - `Arrays::getDoubleArrowPtr()` - - `Arrays::isShortArray()` - - `FunctionDeclarations::getParameters()` - - `Lists::getAssignments()` - - `Lists::isShortList()` - - `Namespaces::findNamespacePtr()` - - `PassedParameters::getParameters()` - - `TextStrings::getEndOfCompleteTextString()` - - `TextStrings::getStripEmbeds()` - - `UseStatements::splitImportUseStatement()` - -### Changed - -#### PHPCS Backcompat - -* All token array methods in the [`BCTokens`] class are fully up-to-date with the upstream `PHP_CodeSniffer\Util\Tokens` properties as per PHPCS `master` at the time of this release. [#327], [#347], [#360] -* All methods in the [`BCFile`] class are fully up-to-date with the upstream `PHP_CodeSniffer\Files\File` methods as per PHPCS `master` at the time of this release. [#347] -* `BCFile::getMethodParameters()`: forward compatibility with PHPCS 4.x in which closure `use` will be a parenthesis owner. [#251] -* If a non-existent token array is requested from the `BCTokens` class, a `PHPCSUtils\Exceptions\InvalidTokenArray` exception will be thrown. [#344] - The `PHPCSUtils\Exceptions\InvalidTokenArray` exception extends the PHPCS native `PHP_CodeSniffer\Exceptions\RuntimeException`. - Previously, an empty array would be returned. - -#### TestUtils - -* `UtilityMethodTestCase`: all properties contained in the test case class will now always be reset after the tests have run. [#325] -* `UtilityMethodTestCase::getTargetToken()`: when the target token cannot be found, the method will now throw a (catchable) `PHPCSUtils\Exceptions\TestTargetNotFound` exception instead of failing the test. [#248], [#371] - If uncaught, this means that the test will be marked as _errored_ instead of _failed_. -* `UtilityMethodTestCase::getTargetToken()`: this method is now `static`, which allows for it to be used in "set up before class" fixtures. [#382]. [#385] - -#### Tokens - -* `Collections::functionCallTokens()` and `Collections::parameterPassingTokens()`: now include the `T_PARENT` token. [#328] - This accounts for a change in PHPCS 3.7.0 for how `parent` in `new parent` is tokenized. -* If a non-existent token array is requested from the `Collections` class, a `PHPCSUtils\Exceptions\InvalidTokenArray` exception will be thrown. [#349] - The `PHPCSUtils\Exceptions\InvalidTokenArray` exception extends the PHPCS native `PHP_CodeSniffer\Exceptions\RuntimeException`. - -#### Utils - -* `Arrays::isShortArray()`/`Lists::isShortList()`: the underlying logic has been completely refactored for improved accuracy and improved performance. [#392] -* `FunctionDeclarations::getParameters()`: the return array of the method may contain two new keys - `property_visibility` and `visibility_token`. [#169] - These keys will only be included if constructor property promotion is detected. -* `FunctionDeclarations::getParameters()`: forward compatibility with PHPCS 4.x in which closure `use` will be a parenthesis owner. [#251] -* [`GetTokensAsString`]: previously the `tabReplaced()` method was an alias for the `normal()` method. This has now been reversed. [#297] -* `Operators::isReference()`: forward compatibility with PHPCS 4.x in which closure `use` will be a parenthesis owner. [#195] -* [`Parentheses`]: all methods will now recognize `isset()`, `unset()`, `empty()`, `exit()`, `die()` and `eval()` as parentheses owners. [#215] - Note: PHPCS natively does not recognize these constructs as parentheses owners, though this _may_ change in the future. See: [PHPCS#3118] -* [`PassedParameters`]: all methods will now recognize anonymous class instantiations as constructs which can pass parameters. [#234] -* `PassedParameters::getParameters()`: when a named parameter is encountered in a function call, the returned parameter information array for that parameter will now contain the following additional keys: `'name'`, `'name_token'` and the top-level index for the parameter will be set to the parameter `'name'` instead of its position. [#235], [#243], [#383] - The existing `'start'`, `'end'`, `'raw'` and `'clean'` keys will contain the same content as before: the information about the parameter value (excluding the name part). -* `PassedParameters::getParameters()`: new, optional parameter `$limit` to allow for limiting the number of parameters/array items to be parsed. [#261] - This allows for higher efficiency when retrieving the parameters/array entries, especially for large arrays if only the first few entries need to be examined. - Use with care on function calls, as this can break support for named parameters! -* `PassedParameters::getParameters()`: new, optional parameter `$isShortArray` to allow for skipping the "is short array" check for predetermined short arrays. [#269], [#270] - Use judiciously and with extreme care! -* `PassedParameters::getParameter()`: new _semi-optional_ `$paramNames` parameter to allow for retrieving a parameter from a function call using named parameters. [#235] - :warning: This parameter is **_required_** when examining a function call and an exception will be thrown if it was not passed. - This new `$paramNames` parameter allows for passing either the parameter name as a _string_ or as an _array of strings_. - _While a parameter can only have one name, a lot of packages have been, and may still be, reviewing and renaming parameters to more descriptive names to support named parameters in PHP 8.0, so, to allow for supporting multiple versions of packages, different names can be used for the same parameter in a PHP 8.0+ function call and by allowing multiple names to be passed, the method supports this._ -* `PassedParameters::getParameter()`: efficiency improvement applicable to function calls not using named parameters and arrays. [#261], [#262] -* `PassedParameters::hasParameters()`: now allows for the `T_PARENT` token for `new parent()` class instantiations. [#328] - This accounts for a change in PHPCS 3.7.0 regarding how `parent` in `new parent` is tokenized. -* `PassedParameters::hasParameters()`: new, optional parameter `$isShortArray` to allow for skipping the "is short array" check for predetermined short arrays. [#269], [#270] - Use judiciously and with extreme care! -* `UseStatements::getType()`: forward compatibility with PHPCS 4.x in which closure `use` will be a parenthesis owner. [#251] - -#### Other - -* The `master` branch has been renamed to `stable`. [#397] -* :warning: All non-`abstract` classes in this package are now `final`. [#376] -* The parameter names in various function declarations have been changed to not intersect with reserved keywords. [#256] - :warning: In the unlikely event an external standard using PHPCSUtils would be using function calls with named parameters, the parameter names will need to be updated to match. -* Composer: The package will now identify itself as a static analysis tool. Thanks [@GaryJones]! [#341] -* Readme/website homepage: the installation instructions have been updated to include information on installing this library and the included [Composer PHPCS plugin] in combination with Composer >= 2.2. [#291], [#292] -* Various documentation improvements. [#216], [#309], [#394], [#395], [#396], [#398] -* Various housekeeping and CI maintenance. - Amongst other things, CI is now run via GitHub Actions ([#239]), the PHPCSUtils native tests now use the [PHPUnit Polyfills] package ([#277]) and the tests are now run against PHP 5.4 - 8.2. - -### Deprecated - -:warning: Everything which has currently been deprecated, will be removed before the final `1.0.0` version of PHPCSUtils is tagged. - -#### Tokens - -[`Collections`] class: direct access to the properties in the class is now deprecated for forward-compatibility reasons. -All properties have a replacement which should be used instead, in most cases this will be a method with the same name as the previously used property, - -| Deprecated | Replacement | PR | Remarks | -| ------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | -------------- | ---------------------------------------- | -| `Collections::$alternativeControlStructureSyntaxTokens` | `Collections::alternativeControlStructureSyntaxes()` | [#311] | Mind the change in the name! | -| `Collections::$alternativeControlStructureSyntaxCloserTokens` | `Collections::alternativeControlStructureSyntaxClosers()` | [#311] | Mind the change in the name! | -| `Collections::$arrayTokens` | `Collections::arrayTokens()` | [#311] | | -| `Collections::$arrayTokensBC` | `Collections::arrayTokensBC()` | [#311] | | -| `Collections::$classModifierKeywords` | `Collections::classModifierKeywords()` | [#311] | | -| `Collections::$closedScopes` | `Collections::closedScopes()` | [#311] | | -| `Collections::$controlStructureTokens` | `Collections::controlStructureTokens()` | [#311] | | -| `Collections::$incrementDecrementOperators` | `Collections::incrementDecrementOperators()` | [#311] | | -| `Collections::$listTokens` | `Collections::listTokens()` | [#311] | | -| `Collections::$listTokensBC` | `Collections::listTokensBC()` | [#311] | | -| `Collections::$magicConstants` | `PHPCSUtils\BackCompat\BCTokens::magicConstants()` or `PHP_CodeSniffer\Util\Tokens::$magicConstants` | [#311] | | -| `Collections::$namespaceDeclarationClosers` | `Collections::namespaceDeclarationClosers()` | [#311] | | -| `Collections::$objectOperators` | `Collections::objectOperators()` | [#176] | | -| `Collections::$OOCanImplement` | `Collections::ooCanImplement()` | [#311] | Mind the case change in the `oo` prefix! | -| `Collections::$OOCanExtend` | `Collections::ooCanExtend()` | [#311] | Mind the case change in the `oo` prefix! | -| `Collections::$OOConstantScopes` | `Collections::ooConstantScopes()` | [#311] | Mind the case change in the `oo` prefix! | -| `Collections::$OOPropertyScopes` | `Collections::ooPropertyScopes()` | [#311] | Mind the case change in the `oo` prefix! | -| `Collections::$OOHierarchyKeywords` | `Collections::ooHierarchyKeywords()` | [#311] | Mind the case change in the `oo` prefix! | -| `Collections::$OONameTokens` | `Collections::namespacedNameTokens()` | [#202] | Mind the change name! | -| `Collections::$parameterTypeTokens` | `Collections::parameterTypeTokens()` | [#168] | | -| `Collections::$propertyModifierKeywords` | `Collections::propertyModifierKeywords()` | [#311] | | -| `Collections::$propertyTypeTokens` | `Collections::propertyTypeTokens()` | [#168] | | -| `Collections::$returnTypeTokens` | `Collections::returnTypeTokens()` | [#168] | | -| `Collections::$shortArrayTokens` | `Collections::shortArrayTokens()` | [#311] | | -| `Collections::$shortArrayTokensBC` | `Collections::shortArrayTokensBC()` | [#311] | | -| `Collections::$shortListTokens` | `Collections::shortListTokens()` | [#311] | | -| `Collections::$shortListTokensBC` | `Collections::shortListTokensBC()` | [#311] | | -| `Collections::$textStingStartTokens` | `Collections::textStringStartTokens()` | [#311], [#319] | Mind the fixed typo in the name! | - -Additionally, the following methods in the `Collections` class have been deprecated: - -| Deprecated | Replacement | PR | -| -------------------------------------------- | ------------------------------------------ | ------ | -| `Collections::arrowFunctionTokensBC()` | Use the `T_FN` token instead. | [#347] | -| `Collections::functionDeclarationTokensBC()` | `Collections::functionDeclarationTokens()` | [#347] | -| `Collections::parameterTypeTokensBC()` | `Collections::parameterTypeTokens()` | [#347] | -| `Collections::propertyTypeTokensBC()` | `Collections::propertyTypeTokens()` | [#347] | -| `Collections::returnTypeTokensBC()` | `Collections::returnTypeTokens()` | [#347] | - -#### Utils - -* `ControlStructures::getDeclareScopeOpenClose()`: this method is no longer needed, check the `scope_opener`/`scope_closer` on the `T_DECLARE` token instead. [#347] -* `FunctionDeclarations::getArrowFunctionOpenClose()`: this method is no longer needed, check the `scope_opener`/`scope_closer` etc on the `T_FN` token instead. [#347] -* `FunctionDeclarations::isArrowFunction()`: this method is no longer needed, use the `T_FN` token instead. [#347] - -#### Other - -* The `PHPCS23Utils` standard, which is no longer needed now support for PHPCS < 3.7.1 has been dropped. [#347] - -### Removed - -* Support for PHPCS < 3.7.1. [#347] - -#### Utils - -* The following constants, which were only intended for internal use, have been removed: [#347] - - `PHPCSUtils\Utils\Numbers::REGEX_NUMLIT_STRING` - - `PHPCSUtils\Utils\Numbers::REGEX_HEX_NUMLIT_STRING` - - `PHPCSUtils\Utils\Numbers::UNSUPPORTED_PHPCS_VERSION` - -### Fixed - -#### Abstract Sniffs - -* `AbstractArrayDeclarationSniff::getActualArrayKey()`: will now handle escaped vars in heredoc array keys better. [#379] - -#### Fixers - -* [`SpacesFixer`]: in a specific new line vs trailing comment situation, the fixer would incorrectly add a stray new line. [#229] - -#### TestUtils - -* `UtilityMethodTestCase::getTargetToken()`: will now throw a `PHPCSUtils\Exceptions\TestMarkerNotFound` exception if the provided test marker comment is not found. [#273], [#372] - This prevents the method potentially misidentifying the target token. - -#### Tokens - -* `Collections::parameterTypeTokens()`, `Collections::propertyTypeTokens()` and `Collections::returnTypeTokens()`: include the `namespace` keyword for namespace relative identifier names. [#180] - -#### Utils - -* `Arrays::isShortArray()`/`Lists::isShortList()`: fixed a number of bugs which previously resulted in an incorrect short list/short array determination. [#392] -* `FunctionDeclarations::getParameters()`: will now correctly recognize namespace relative names when used in a parameter type. [#180] -* `FunctionDeclarations::getProperties()`: will now correctly recognize namespace relative names when used in the return type. [#180] -* `ObjectDeclarations::findExtendedClassName()`: will now correctly recognize namespace relative names when used as the _extended_ parent class name. [#181] -* `ObjectDeclarations::findExtendedInterfaceNames()`: will now correctly recognize namespace relative names when used in _extended_ interface names. [#181] -* `ObjectDeclarations::findImplementedInterfaceNames()`: will now correctly recognize namespace relative names when used in _implemented_ interface names. [#181] -* `ObjectDeclarations::getClassProperties()`: will now correctly handle classes declared with both the `final` as well as the `abstract` keyword. [#252] -* `Operators::isReference()`: if one parameter in a function declaration was passed by reference, then all `T_BITWISE_AND` (not intersection type `&`'s) tokens would be regarded as references. [#188] -* `Operators::isReference()`: the `&` would not be recognized as a reference for arrow function parameters passed by reference. [#192] -* `Operators::isUnaryPlusMinus()`: a preceding `exit`, `break`, `continue` or arrow function `=>` is now recognized as an indicator that a plus/minus sign is unary. [#187], [#197] -* `Variables::getMemberProperties()`: will now correctly recognize namespace relative names when used in a property type. [#180] - -[UtilityMethodTestCase::usesPhp8NameTokens]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-TestUtils-UtilityMethodTestCase.html#method_usesPhp8NameTokens -[PassedParameters::getParameterFromStack]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-Utils-PassedParameters.html#method_getParameterFromStack -[TextStrings::getEndOfCompleteTextString]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-Utils-TextStrings.html#method_getEndOfCompleteTextString -[TextStrings::getEmbeds]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-Utils-TextStrings.html#method_getEmbeds -[TextStrings::getStripEmbeds]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-Utils-TextStrings.html#method_getStripEmbeds -[TextStrings::stripEmbeds]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-Utils-TextStrings.html#method_stripEmbeds -[UseStatements::mergeImportUseStatements]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-Utils-UseStatements.html#method_mergeImportUseStatements - -[#163]: https://github.com/PHPCSStandards/PHPCSUtils/pull/163 -[#168]: https://github.com/PHPCSStandards/PHPCSUtils/pull/168 -[#169]: https://github.com/PHPCSStandards/PHPCSUtils/pull/169 -[#172]: https://github.com/PHPCSStandards/PHPCSUtils/pull/172 -[#176]: https://github.com/PHPCSStandards/PHPCSUtils/pull/176 -[#180]: https://github.com/PHPCSStandards/PHPCSUtils/pull/180 -[#181]: https://github.com/PHPCSStandards/PHPCSUtils/pull/181 -[#183]: https://github.com/PHPCSStandards/PHPCSUtils/pull/183 -[#187]: https://github.com/PHPCSStandards/PHPCSUtils/pull/187 -[#188]: https://github.com/PHPCSStandards/PHPCSUtils/pull/188 -[#192]: https://github.com/PHPCSStandards/PHPCSUtils/pull/192 -[#195]: https://github.com/PHPCSStandards/PHPCSUtils/pull/195 -[#196]: https://github.com/PHPCSStandards/PHPCSUtils/pull/196 -[#197]: https://github.com/PHPCSStandards/PHPCSUtils/pull/197 -[#200]: https://github.com/PHPCSStandards/PHPCSUtils/pull/200 -[#202]: https://github.com/PHPCSStandards/PHPCSUtils/pull/202 -[#204]: https://github.com/PHPCSStandards/PHPCSUtils/pull/204 -[#205]: https://github.com/PHPCSStandards/PHPCSUtils/pull/205 -[#206]: https://github.com/PHPCSStandards/PHPCSUtils/pull/206 -[#207]: https://github.com/PHPCSStandards/PHPCSUtils/pull/207 -[#208]: https://github.com/PHPCSStandards/PHPCSUtils/pull/208 -[#209]: https://github.com/PHPCSStandards/PHPCSUtils/pull/209 -[#210]: https://github.com/PHPCSStandards/PHPCSUtils/pull/210 -[#211]: https://github.com/PHPCSStandards/PHPCSUtils/pull/211 -[#212]: https://github.com/PHPCSStandards/PHPCSUtils/pull/212 -[#213]: https://github.com/PHPCSStandards/PHPCSUtils/pull/213 -[#215]: https://github.com/PHPCSStandards/PHPCSUtils/pull/215 -[#216]: https://github.com/PHPCSStandards/PHPCSUtils/pull/216 -[#217]: https://github.com/PHPCSStandards/PHPCSUtils/pull/217 -[#219]: https://github.com/PHPCSStandards/PHPCSUtils/pull/219 -[#225]: https://github.com/PHPCSStandards/PHPCSUtils/pull/225 -[#226]: https://github.com/PHPCSStandards/PHPCSUtils/pull/226 -[#229]: https://github.com/PHPCSStandards/PHPCSUtils/pull/229 -[#233]: https://github.com/PHPCSStandards/PHPCSUtils/pull/233 -[#234]: https://github.com/PHPCSStandards/PHPCSUtils/pull/234 -[#235]: https://github.com/PHPCSStandards/PHPCSUtils/pull/235 -[#237]: https://github.com/PHPCSStandards/PHPCSUtils/pull/237 -[#239]: https://github.com/PHPCSStandards/PHPCSUtils/pull/239 -[#241]: https://github.com/PHPCSStandards/PHPCSUtils/pull/241 -[#243]: https://github.com/PHPCSStandards/PHPCSUtils/pull/243 -[#247]: https://github.com/PHPCSStandards/PHPCSUtils/pull/247 -[#248]: https://github.com/PHPCSStandards/PHPCSUtils/pull/248 -[#249]: https://github.com/PHPCSStandards/PHPCSUtils/pull/249 -[#251]: https://github.com/PHPCSStandards/PHPCSUtils/pull/251 -[#252]: https://github.com/PHPCSStandards/PHPCSUtils/pull/252 -[#254]: https://github.com/PHPCSStandards/PHPCSUtils/pull/254 -[#256]: https://github.com/PHPCSStandards/PHPCSUtils/pull/256 -[#261]: https://github.com/PHPCSStandards/PHPCSUtils/pull/261 -[#262]: https://github.com/PHPCSStandards/PHPCSUtils/pull/262 -[#269]: https://github.com/PHPCSStandards/PHPCSUtils/pull/269 -[#270]: https://github.com/PHPCSStandards/PHPCSUtils/pull/270 -[#273]: https://github.com/PHPCSStandards/PHPCSUtils/pull/273 -[#277]: https://github.com/PHPCSStandards/PHPCSUtils/pull/277 -[#285]: https://github.com/PHPCSStandards/PHPCSUtils/pull/285 -[#291]: https://github.com/PHPCSStandards/PHPCSUtils/pull/291 -[#292]: https://github.com/PHPCSStandards/PHPCSUtils/pull/292 -[#293]: https://github.com/PHPCSStandards/PHPCSUtils/pull/293 -[#297]: https://github.com/PHPCSStandards/PHPCSUtils/pull/297 -[#304]: https://github.com/PHPCSStandards/PHPCSUtils/pull/304 -[#309]: https://github.com/PHPCSStandards/PHPCSUtils/pull/309 -[#311]: https://github.com/PHPCSStandards/PHPCSUtils/pull/311 -[#319]: https://github.com/PHPCSStandards/PHPCSUtils/pull/319 -[#320]: https://github.com/PHPCSStandards/PHPCSUtils/pull/320 -[#321]: https://github.com/PHPCSStandards/PHPCSUtils/pull/321 -[#325]: https://github.com/PHPCSStandards/PHPCSUtils/pull/325 -[#327]: https://github.com/PHPCSStandards/PHPCSUtils/pull/327 -[#328]: https://github.com/PHPCSStandards/PHPCSUtils/pull/328 -[#332]: https://github.com/PHPCSStandards/PHPCSUtils/pull/332 -[#335]: https://github.com/PHPCSStandards/PHPCSUtils/pull/335 -[#341]: https://github.com/PHPCSStandards/PHPCSUtils/pull/341 -[#344]: https://github.com/PHPCSStandards/PHPCSUtils/pull/344 -[#347]: https://github.com/PHPCSStandards/PHPCSUtils/pull/347 -[#349]: https://github.com/PHPCSStandards/PHPCSUtils/pull/349 -[#356]: https://github.com/PHPCSStandards/PHPCSUtils/pull/356 -[#357]: https://github.com/PHPCSStandards/PHPCSUtils/pull/357 -[#358]: https://github.com/PHPCSStandards/PHPCSUtils/pull/358 -[#360]: https://github.com/PHPCSStandards/PHPCSUtils/pull/360 -[#362]: https://github.com/PHPCSStandards/PHPCSUtils/pull/362 -[#363]: https://github.com/PHPCSStandards/PHPCSUtils/pull/363 -[#365]: https://github.com/PHPCSStandards/PHPCSUtils/pull/365 -[#366]: https://github.com/PHPCSStandards/PHPCSUtils/pull/366 -[#367]: https://github.com/PHPCSStandards/PHPCSUtils/pull/367 -[#368]: https://github.com/PHPCSStandards/PHPCSUtils/pull/368 -[#371]: https://github.com/PHPCSStandards/PHPCSUtils/pull/371 -[#372]: https://github.com/PHPCSStandards/PHPCSUtils/pull/372 -[#376]: https://github.com/PHPCSStandards/PHPCSUtils/pull/376 -[#377]: https://github.com/PHPCSStandards/PHPCSUtils/pull/377 -[#379]: https://github.com/PHPCSStandards/PHPCSUtils/pull/379 -[#381]: https://github.com/PHPCSStandards/PHPCSUtils/pull/381 -[#382]: https://github.com/PHPCSStandards/PHPCSUtils/pull/382 -[#383]: https://github.com/PHPCSStandards/PHPCSUtils/pull/383 -[#385]: https://github.com/PHPCSStandards/PHPCSUtils/pull/385 -[#390]: https://github.com/PHPCSStandards/PHPCSUtils/pull/390 -[#391]: https://github.com/PHPCSStandards/PHPCSUtils/pull/391 -[#392]: https://github.com/PHPCSStandards/PHPCSUtils/pull/392 -[#394]: https://github.com/PHPCSStandards/PHPCSUtils/pull/394 -[#395]: https://github.com/PHPCSStandards/PHPCSUtils/pull/395 -[#396]: https://github.com/PHPCSStandards/PHPCSUtils/pull/396 -[#397]: https://github.com/PHPCSStandards/PHPCSUtils/pull/397 -[#398]: https://github.com/PHPCSStandards/PHPCSUtils/pull/398 - -[PHPCS#3118]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3118 -[PHPUnit Polyfills]: https://github.com/Yoast/PHPUnit-Polyfills - - -## [1.0.0-alpha3] - 2020-06-29 - -Notes: - -* While still in alpha, some BC-breaks may be introduced. These are clearly indicated in the changelog with the :warning: symbol. -* Until PHPCS 4.x has been released, PHPCSUtils does not formally support it, though an effort is made to keep up with the changes and anticipate potential compatibility issues. - For testing purposes, the composer configuration allows for PHPCSUtils to be installed with PHPCS 4.x. -* Until PHP 8.0 has been released, PHPCSUtils does not formally support it, though an effort is made to keep up with the changes and anticipate potential compatibility issues. - For testing purposes, the composer configuration allows for PHPCSUtils to be installed with PHP 8. - -### Added - -* New [`PHPCSUtils\Utils\NamingConventions`][`NamingConventions`] class: Utility functions for working with identifier names (namespace names, class/trait/interface names, function names, variable and constant names). [#119] -* New [`PHPCSUtils\BackCompat\Helper::getEncoding()`][Helper::getEncoding] method. [#118] -* New [`PHPCSUtils\Utils\ControlStructures::getCaughtExceptions()`][ControlStructures::getCaughtExceptions] method. [#114], [#138] -* New [`PHPCSUtils\Utils\UseStatements::splitAndMergeImportUseStatement()`][UseStatements::splitAndMergeImportUseStatement] method. [#117] - -#### PHPCS BackCompat - -* `BCFile::getMethodProperties()`: support for "static" as a return type (PHP 8.0). [#134], [PHPCS#2952] - -#### TestUtils - -* [`UtilityMethodTestCase`]: new public `$phpcsVersion` property for use in tests. [#107] - **Note**: if the PHPCS version is needed within a data provider method for a test, `Helper::getVersion()` still needs to be used as the data providers are run before the `setUpBeforeClass()`-like methods which set the property. - -#### Tokens - -* New [`Collections::$incrementDecrementOperators`][`Collections`] property. [#130] -* New [`Collections::$magicConstants`][`Collections`] property. [#106] -* New [`Collections::$objectOperators`][`Collections`] property. [#130] -* New [`Collections::$OOHierarchyKeywords`][`Collections`] property representing the keywords to access properties or methods from inside a class definition, i.e `self`, `parent` and `static`. [#115] -* New [`Collections::$OONameTokens`][`Collections`] property containing tokens which can be part of a partially/fully qualified name when used in inline code. [#113] -* New [`Collections::functionDeclarationTokens()`][`Collections`] method to retrieve the tokens which represent a keyword starting a function declaration. [#133] - This method is compatible with PHPCS 3.5.3 and higher. -* New [`Collections::functionDeclarationTokensBC()`][`Collections`] method to retrieve the tokens which represent a keyword starting a function declaration (cross-version compatible). [#133] - This method is compatible with PHPCS 2.6.0 and higher. -* New [`Collections::parameterTypeTokensBC()`][`Collections`] method to retrieve the tokens which need to be recognized for parameter types cross-version. [#109] - Use this method when the implementing standard needs to support PHPCS < 3.3.0. -* New [`Collections::propertyTypeTokensBC()`][`Collections`] method to retrieve the tokens which need to be recognized for property types cross-version. [#109] - Use this method when the implementing standard needs to support PHPCS < 3.3.0. -* New [`Collections::returnTypeTokensBC()`][`Collections`] method to retrieve the tokens which need to be recognized for return types cross-version. [#109] - Use this method when the implementing standard needs to support PHPCS < 3.5.4. -* `Collections::$returnTypeTokens`: support for "static" as a return type (PHP 8.0). [#134] - -#### Utils - -* `FunctionDeclarations::getProperties()`: support for "static" as a return type (PHP 8.0). [#134] - -### Changed - -#### PHPCS BackCompat - -* `BCFile::getDeclarationName()`: has been made compatible with PHPCS 4.x. [#110] -* `BCFile::getMethodProperties()`: has been made compatible with PHPCS 4.x. [#109] -* `BCFile::getMemberProperties()`: has been made compatible with PHPCS 4.x. [#109] -* `BCTokens`: :warning: The visibility of the `BCTokens::$phpcsCommentTokensTypes`, `BCTokens::$ooScopeTokens`, `BCTokens::$textStringTokens` properties has changed from `protected` to `private`. [#139] -* `Helper::setConfigData()`: has been made compatible with PHPCS 4.x. [#137] - A new `$config` parameter has been added to the method. This parameter is a required parameter when the method is used with PHPCS 4.x. - -#### TestUtils - -* [`UtilityMethodTestCase`]: tests for JS/CSS will now automatically be skipped when run in combination with PHPCS 4.x (which drops JS/CSS support). [#111] -* Confirmed that the currently available test utils are compatible with PHPUnit 9.x. [#103] - -#### Tokens - -* `Collections::$parameterTypeTokens`: has been made compatible with PHPCS 4.x. [#109] - :warning: This removes support for PHPCS < 3.3.0 from the property. Use the [`Collections::parameterTypeTokensBC()`][`Collections`] method instead if PHPCS < 3.3.0 needs to be supported. -* `Collections::$propertyTypeTokens`: has been made compatible with PHPCS 4.x. [#109] - :warning: This removes support for PHPCS < 3.3.0 from the property. Use the [`Collections::propertyTypeTokensBC()`][`Collections`] method instead if PHPCS < 3.3.0 needs to be supported. -* `Collections::$returnTypeTokens`: has been made compatible with PHPCS 4.x. [#109] - :warning: This removes support for PHPCS < 3.5.4 from the property. Use the [`Collections::returnTypeTokensBC()`][`Collections`] method instead if PHPCS < 3.5.4 needs to be supported. - -#### Utils - -* `FunctionDeclarations::getArrowFunctionOpenClose()`: has been made compatible with PHPCS 4.x. [#109] -* `FunctionDeclarations::getProperties()`: has been made compatible with PHPCS 4.x. [#109] -* :warning: `Lists::getAssignments()`: the return value of the method has been consolidated to be less fiddly to work with. [#129] - - :warning: The `nested_list` index key in the return value has been renamed to `is_nested_list`. -* `ObjectDeclarations::getName()`: has been made compatible with PHPCS 4.x. [#110] -* `Variables::getMemberProperties()`: has been made compatible with PHPCS 4.x. [#109] - -#### Other - -* Composer: PHPCSUtils can now be installed in combination with PHPCS `4.0.x-dev@dev` for testing purposes. -* Composer: The version requirements for the [Composer PHPCS plugin] have been widened to allow for version 0.7.0 which supports Composer 2.0.0. -* Readme/website homepage: textual improvements. Props [@GaryJones]. [#121] -* Readme/website homepage: added additional FAQ question & answers. [#157] -* The website homepage is now generated using the GitHub Pages gem with Jekyll, making maintenance easier. [#141] -* Significant improvements to the docblock documentation and by extension the [generated API documentation]. [#145], [#146], [#147], [#148], [#149], [#150], [#151], [#152], [#153], [#154], [#155], [#156] -* Various housekeeping. - -### Fixed - -#### Abstract Sniffs - -* `AbstractArrayDeclarationSniff`: improved parse error handling. [#99] - -#### PHPCS BackCompat - -* `BCFile::findEndOfStatement()`: now supports arrow functions when used as a function argument, in line with the same change made in PHPCS 3.5.5. [#143] -* `BcFile::isReference()`: bug fix, the reference operator was not recognized as such for closures declared to return by reference. [#160], [PHPCS#2977] - -#### Utils - -* `FunctionDeclarations::getArrowFunctionOpenClose()`: now supports arrow functions when used as a function argument, in line with the same change made in PHPCS 3.5.5. [#143] -* `FunctionDeclarations::getArrowFunctionOpenClose()`: now supports for arrow functions returning heredoc/nowdocs, in line with the same change made in PHPCS `master` and expected to be released in PHPCS 3.5.6. [#143] -* `FunctionDeclarations::getName()`: bug fix for functions declared to return by reference. [#131] -* `FunctionDeclarations::isMagicFunction()`: bug fix for nested functions. [#127] -* `Operators::isReference()`: bug fix, the reference operator was not recognized as such for closures declared to return by reference. [#142] -* `Namespaces::getType()`: improved type detection for when the `namespace` keyword is used as an operator in the global namespace. [#132] -* `TextStrings::getCompleteTextString()`: will now remove the newline at the end of a heredoc/nowdoc. [#136] - PHP itself does not include the last new line in a heredoc/nowdoc text string when handling it, so the method shouldn't either. - -[generated API documentation]: https://phpcsutils.com/phpdoc/ -[Helper::getEncoding]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-BackCompat-Helper.html#method_getEncoding -[ControlStructures::getCaughtExceptions]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-Utils-ControlStructures.html#method_getCaughtExceptions -[UseStatements::splitAndMergeImportUseStatement]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-Utils-UseStatements.html#method_splitAndMergeImportUseStatement - -[#99]: https://github.com/PHPCSStandards/PHPCSUtils/pull/99 -[#103]: https://github.com/PHPCSStandards/PHPCSUtils/pull/103 -[#106]: https://github.com/PHPCSStandards/PHPCSUtils/pull/106 -[#107]: https://github.com/PHPCSStandards/PHPCSUtils/pull/107 -[#109]: https://github.com/PHPCSStandards/PHPCSUtils/pull/109 -[#110]: https://github.com/PHPCSStandards/PHPCSUtils/pull/110 -[#111]: https://github.com/PHPCSStandards/PHPCSUtils/pull/111 -[#113]: https://github.com/PHPCSStandards/PHPCSUtils/pull/113 -[#114]: https://github.com/PHPCSStandards/PHPCSUtils/pull/114 -[#115]: https://github.com/PHPCSStandards/PHPCSUtils/pull/115 -[#117]: https://github.com/PHPCSStandards/PHPCSUtils/pull/117 -[#118]: https://github.com/PHPCSStandards/PHPCSUtils/pull/118 -[#119]: https://github.com/PHPCSStandards/PHPCSUtils/pull/119 -[#129]: https://github.com/PHPCSStandards/PHPCSUtils/pull/129 -[#121]: https://github.com/PHPCSStandards/PHPCSUtils/pull/121 -[#127]: https://github.com/PHPCSStandards/PHPCSUtils/pull/127 -[#130]: https://github.com/PHPCSStandards/PHPCSUtils/pull/130 -[#131]: https://github.com/PHPCSStandards/PHPCSUtils/pull/131 -[#132]: https://github.com/PHPCSStandards/PHPCSUtils/pull/132 -[#133]: https://github.com/PHPCSStandards/PHPCSUtils/pull/133 -[#134]: https://github.com/PHPCSStandards/PHPCSUtils/pull/134 -[#136]: https://github.com/PHPCSStandards/PHPCSUtils/pull/136 -[#137]: https://github.com/PHPCSStandards/PHPCSUtils/pull/137 -[#138]: https://github.com/PHPCSStandards/PHPCSUtils/pull/138 -[#139]: https://github.com/PHPCSStandards/PHPCSUtils/pull/139 -[#141]: https://github.com/PHPCSStandards/PHPCSUtils/pull/141 -[#142]: https://github.com/PHPCSStandards/PHPCSUtils/pull/142 -[#143]: https://github.com/PHPCSStandards/PHPCSUtils/pull/143 -[#145]: https://github.com/PHPCSStandards/PHPCSUtils/pull/145 -[#146]: https://github.com/PHPCSStandards/PHPCSUtils/pull/146 -[#147]: https://github.com/PHPCSStandards/PHPCSUtils/pull/147 -[#148]: https://github.com/PHPCSStandards/PHPCSUtils/pull/148 -[#149]: https://github.com/PHPCSStandards/PHPCSUtils/pull/149 -[#150]: https://github.com/PHPCSStandards/PHPCSUtils/pull/150 -[#151]: https://github.com/PHPCSStandards/PHPCSUtils/pull/151 -[#152]: https://github.com/PHPCSStandards/PHPCSUtils/pull/152 -[#153]: https://github.com/PHPCSStandards/PHPCSUtils/pull/153 -[#154]: https://github.com/PHPCSStandards/PHPCSUtils/pull/154 -[#155]: https://github.com/PHPCSStandards/PHPCSUtils/pull/155 -[#156]: https://github.com/PHPCSStandards/PHPCSUtils/pull/156 -[#157]: https://github.com/PHPCSStandards/PHPCSUtils/pull/157 -[#160]: https://github.com/PHPCSStandards/PHPCSUtils/pull/160 -[PHPCS#2952]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2952 -[PHPCS#2977]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2977 - - -## [1.0.0-alpha2] - 2020-02-16 - -Note: - -* While still in alpha, some BC-breaks may be introduced. These are clearly indicated in the changelog with the :warning: symbol. - -### Added - -* New [`PHPCSUtils\Utils\ControlStructures`][`ControlStructures`] class: Utility functions for use when examining control structures. [#70] -* New [`PHPCSUtils\Utils\FunctionDeclarations::isArrowFunction()`][FunctionDeclarations::isArrowFunction] method. [#77], [#79] -* New [`PHPCSUtils\Utils\FunctionDeclarations::getArrowFunctionOpenClose()`][FunctionDeclarations::getArrowFunctionOpenClose] method. [#77], [#79] - -#### PHPCS BackCompat - -* `BCFile::isReference()`: support for arrow functions returning by reference. [#77] -* `BCFile::getMethodParameters()`: support for arrow functions. [#77], [#79] -* `BCFile::getMethodProperties()`: support for arrow functions. [#77], [#79], [#89] -* `BCFile::getDeclarationName()`: allow functions to be called "fn". [#77] -* `BCFile::findEndOfStatement()`: support for arrow functions. [#77], [#79] -* `BCFile::findStartOfStatement()`: support for arrow functions. [#77] - -#### Tokens - -* New [`Collections::$alternativeControlStructureSyntaxTokens`][`Collections`] property. [#70] -* New [`Collections::$alternativeControlStructureSyntaxCloserTokens`][`Collections`] property. [#68], [#69] -* New [`Collections::$controlStructureTokens`][`Collections`] property. [#70] -* New [`Collections::arrowFunctionTokensBC()`][`Collections`] method. [#79] - -#### Utils - -* `Arrays::getDoubleArrowPtr()`: support for arrow functions. [#77], [#79], [#84] -* `FunctionDeclarations::getParameters()`: support for arrow functions. [#77], [#79] -* `FunctionDeclarations::getProperties()`: support for arrow functions. [#77], [#79] -* `Operators::isReference()`: support for arrow functions returning by reference. [#77] -* `Parentheses::getOwner()`: support for arrow functions. [#77] -* `Parentheses::isOwnerIn()`: support for arrow functions. [#77], [#79] - -#### Other - -* Documentation website at <https://phpcsutils.com/> - -### Changed - -#### PHPCS BackCompat - -* `BCFile::getCondition()`: sync with PHPCS 3.5.4 - added support for new `$first` parameter. [#73] - -#### Tokens - -* The `Collections::$returnTypeTokens` property now includes `T_ARRAY` to allow for supporting arrow functions in PHPCS < 3.5.3. [#77] - -#### Utils - -* :warning: `Conditions::getCondition()`: sync with PHPCS 3.5.4 - renamed the existing `$reverse` parameter to `$first` and reversing the meaning of the boolean values, to stay in line with PHPCS itself. [#73] -* :warning: `Numbers`: the `$unsupportedPHPCSVersions` property has been replaced with an `UNSUPPORTED_PHPCS_VERSION` constant. [#88] - -#### Other - -* Various housekeeping. - -[FunctionDeclarations::isArrowFunction]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-Utils-FunctionDeclarations.html#method_isArrowFunction -[FunctionDeclarations::getArrowFunctionOpenClose]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-Utils-FunctionDeclarations.html#method_getArrowFunctionOpenClose - -[#68]: https://github.com/PHPCSStandards/PHPCSUtils/pull/68 -[#69]: https://github.com/PHPCSStandards/PHPCSUtils/pull/69 -[#70]: https://github.com/PHPCSStandards/PHPCSUtils/pull/70 -[#73]: https://github.com/PHPCSStandards/PHPCSUtils/pull/73 -[#77]: https://github.com/PHPCSStandards/PHPCSUtils/pull/77 -[#79]: https://github.com/PHPCSStandards/PHPCSUtils/pull/79 -[#84]: https://github.com/PHPCSStandards/PHPCSUtils/pull/84 -[#88]: https://github.com/PHPCSStandards/PHPCSUtils/pull/88 -[#89]: https://github.com/PHPCSStandards/PHPCSUtils/pull/89 - - -## 1.0.0-alpha1 - 2020-01-23 - -Initial alpha release containing: - -* A `PHPCS23Utils` standard which can be used to allow an external PHPCS standard to be compatible with both PHPCS 2.x as well as 3.x. -* A `PHPCSUtils` standard which contains generic utilities which can be used when writing sniffs. - **_This standard does not contain any sniffs!_** - To use these utilities in PHPCS 3.x, all that is needed is for this package to be installed and registered with PHPCS using `installed_paths`. If the package is requested via Composer, this will automatically be handled by the [Composer PHPCS plugin]. - To use these utilities in PHPCS 2.x, make sure the external standard includes the `PHPCS23Utils` standard in the `ruleset.xml` file like so: `<rule ref="PHPCS23Utils"/>`. - -All utilities offered are compatible with PHP_CodeSniffer 2.6.0 up to the latest stable release. - -This initial alpha release contains the following utility classes: - -### Abstract Sniffs - -* [`AbstractArrayDeclarationSniff`]: to examine array declarations. - -### BackCompat - -* [`BCFile`]: Backport of the latest versions of PHPCS native utility functions from the `PHP_CodeSniffer\Files\File` class to make them available in older PHPCS versions without the bugs and other quirks that the older versions of the native functions had. -* [`BCTokens`]: Backport of the latest versions of PHPCS native token arrays from the `PHP_CodeSniffer\Util\Tokens` class to make them available in older PHPCS versions. -* [`Helper`]: Utility methods to retrieve (configuration) information from PHP_CodeSniffer 2.x as well as 3.x. - -### Fixers - -* [`SpacesFixer`]: Utility to check and, if necessary, fix the whitespace between two tokens. - -### TestUtils - -* [`UtilityMethodTestCase`]: Base class for use when testing utility methods for PHP_CodeSniffer. - Compatible with both PHPCS 2.x as well as 3.x. Supports PHPUnit 4.x up to 8.x. - See the usage instructions in the class docblock. - -### Tokens - -* [`Collections`]: Collections of related tokens as often used and needed for sniffs. - These are additional "token groups" to compliment the ones available through the PHPCS native `PHP_CodeSniffer\Util\Tokens` class. - -### Utils - -* [`Arrays`]: Utility functions for use when examining arrays. -* [`Conditions`]: Utility functions for use when examining token conditions. -* [`FunctionDeclarations`]: Utility functions for use when examining function declaration statements. -* [`GetTokensAsString`]: Utility functions to retrieve the content of a set of tokens as a string. -* [`Lists`]: Utility functions to retrieve information when working with lists. -* [`Namespaces`]: Utility functions for use when examining T_NAMESPACE tokens and to determine the namespace of arbitrary tokens. -* [`Numbers`]: Utility functions for working with integer/float tokens. -* [`ObjectDeclarations`]: Utility functions for use when examining object declaration statements. -* [`Operators`]: Utility functions for use when working with operators. -* [`Orthography`]: Utility functions for checking the orthography of arbitrary text strings. -* [`Parentheses`]: Utility functions for use when examining parenthesis tokens and arbitrary tokens wrapped in parentheses. -* [`PassedParameters`]: Utility functions to retrieve information about parameters passed to function calls, array declarations, isset and unset constructs. -* [`Scopes`]: Utility functions for use when examining token scopes. -* [`TextStrings`]: Utility functions for working with text string tokens. -* [`UseStatements`]: Utility functions for examining use statements. -* [`Variables`]: Utility functions for use when examining variables. - - -[Unreleased]: https://github.com/PHPCSStandards/PHPCSUtils/compare/stable...HEAD -[1.2.2]: https://github.com/PHPCSStandards/PHPCSUtils/compare/1.2.1...1.2.2 -[1.2.1]: https://github.com/PHPCSStandards/PHPCSUtils/compare/1.2.0...1.2.1 -[1.2.0]: https://github.com/PHPCSStandards/PHPCSUtils/compare/1.1.3...1.2.0 -[1.1.3]: https://github.com/PHPCSStandards/PHPCSUtils/compare/1.1.2...1.1.3 -[1.1.2]: https://github.com/PHPCSStandards/PHPCSUtils/compare/1.1.1...1.1.2 -[1.1.1]: https://github.com/PHPCSStandards/PHPCSUtils/compare/1.1.0...1.1.1 -[1.1.0]: https://github.com/PHPCSStandards/PHPCSUtils/compare/1.0.12...1.1.0 -[1.0.12]: https://github.com/PHPCSStandards/PHPCSUtils/compare/1.0.11...1.0.12 -[1.0.11]: https://github.com/PHPCSStandards/PHPCSUtils/compare/1.0.10...1.0.11 -[1.0.10]: https://github.com/PHPCSStandards/PHPCSUtils/compare/1.0.9...1.0.10 -[1.0.9]: https://github.com/PHPCSStandards/PHPCSUtils/compare/1.0.8...1.0.9 -[1.0.8]: https://github.com/PHPCSStandards/PHPCSUtils/compare/1.0.7...1.0.8 -[1.0.7]: https://github.com/PHPCSStandards/PHPCSUtils/compare/1.0.6...1.0.7 -[1.0.6]: https://github.com/PHPCSStandards/PHPCSUtils/compare/1.0.5...1.0.6 -[1.0.5]: https://github.com/PHPCSStandards/PHPCSUtils/compare/1.0.4...1.0.5 -[1.0.4]: https://github.com/PHPCSStandards/PHPCSUtils/compare/1.0.3...1.0.4 -[1.0.3]: https://github.com/PHPCSStandards/PHPCSUtils/compare/1.0.2...1.0.3 -[1.0.2]: https://github.com/PHPCSStandards/PHPCSUtils/compare/1.0.1...1.0.2 -[1.0.1]: https://github.com/PHPCSStandards/PHPCSUtils/compare/1.0.0...1.0.1 -[1.0.0]: https://github.com/PHPCSStandards/PHPCSUtils/compare/1.0.0-rc1...1.0.0 -[1.0.0-rc1]: https://github.com/PHPCSStandards/PHPCSUtils/compare/1.0.0-alpha4...1.0.0-rc1 -[1.0.0-alpha4]: https://github.com/PHPCSStandards/PHPCSUtils/compare/1.0.0-alpha3...1.0.0-alpha4 -[1.0.0-alpha3]: https://github.com/PHPCSStandards/PHPCSUtils/compare/1.0.0-alpha2...1.0.0-alpha3 -[1.0.0-alpha2]: https://github.com/PHPCSStandards/PHPCSUtils/compare/1.0.0-alpha1...1.0.0-alpha2 - -[Composer PHPCS plugin]: https://github.com/PHPCSStandards/composer-installer -[PHP_CodeSniffer]: https://github.com/PHPCSStandards/PHP_CodeSniffer - -[`AbstractArrayDeclarationSniff`]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-AbstractSniffs-AbstractArrayDeclarationSniff.html -[`BCFile`]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-BackCompat-BCFile.html -[`BCTokens`]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-BackCompat-BCTokens.html -[`Helper`]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-BackCompat-Helper.html -[`SpacesFixer`]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-Fixers-SpacesFixer.html -[`ConfigDouble`]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-TestUtils-ConfigDouble.html -[`RulesetDouble`]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-TestUtils-RulesetDouble.html -[`UtilityMethodTestCase`]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-TestUtils-UtilityMethodTestCase.html -[`Collections`]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-Tokens-Collections.html -[`TokenHelper`]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-Tokens-TokenHelper.html -[`Arrays`]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-Utils-Arrays.html -[`AttributeBlock`]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-Utils-AttributeBlock.html -[`Conditions`]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-Utils-Conditions.html -[`Constants`]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-Utils-Constants.html -[`Context`]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-Utils-Context.html -[`ControlStructures`]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-Utils-ControlStructures.html -[`FunctionDeclarations`]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-Utils-FunctionDeclarations.html -[`GetTokensAsString`]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-Utils-GetTokensAsString.html -[`FileInfo`]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-Utils-FileInfo.html -[`FilePath`]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-Utils-FilePath.html -[`Lists`]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-Utils-Lists.html -[`MessageHelper`]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-Utils-MessageHelper.html -[`Namespaces`]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-Utils-Namespaces.html -[`NamingConventions`]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-Utils-NamingConventions.html -[`Numbers`]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-Utils-Numbers.html -[`ObjectDeclarations`]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-Utils-ObjectDeclarations.html -[`Operators`]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-Utils-Operators.html -[`Orthography`]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-Utils-Orthography.html -[`Parentheses`]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-Utils-Parentheses.html -[`PassedParameters`]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-Utils-PassedParameters.html -[`Scopes`]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-Utils-Scopes.html -[`TextStrings`]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-Utils-TextStrings.html -[`TypeString`]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-Utils-TypeString.html -[`UseStatements`]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-Utils-UseStatements.html -[`Variables`]: https://phpcsutils.com/phpdoc/classes/PHPCSUtils-Utils-Variables.html - -[@DanielEScherzer]: https://github.com/DanielEScherzer -[@fredden]: https://github.com/fredden -[@GaryJones]: https://github.com/GaryJones -[@szepeviktor]: https://github.com/szepeviktor diff --git a/vendor/phpcsstandards/phpcsutils/LICENSE b/vendor/phpcsstandards/phpcsutils/LICENSE deleted file mode 100644 index 0a04128..0000000 --- a/vendor/phpcsstandards/phpcsutils/LICENSE +++ /dev/null @@ -1,165 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/AbstractSniffs/AbstractArrayDeclarationSniff.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/AbstractSniffs/AbstractArrayDeclarationSniff.php deleted file mode 100644 index 897e208..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/AbstractSniffs/AbstractArrayDeclarationSniff.php +++ /dev/null @@ -1,602 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2020 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\AbstractSniffs; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Exceptions\LogicException; -use PHPCSUtils\Exceptions\UnexpectedTokenType; -use PHPCSUtils\Tokens\Collections; -use PHPCSUtils\Utils\Arrays; -use PHPCSUtils\Utils\Numbers; -use PHPCSUtils\Utils\PassedParameters; -use PHPCSUtils\Utils\TextStrings; - -/** - * Abstract sniff to easily examine all parts of an array declaration. - * - * @since 1.0.0 - */ -abstract class AbstractArrayDeclarationSniff implements Sniff -{ - - /** - * The stack pointer to the array keyword or the short array open token. - * - * @since 1.0.0 - * - * @var int - */ - protected $stackPtr; - - /** - * The token stack for the current file being examined. - * - * @since 1.0.0 - * - * @var array<int, array<string, mixed>> - */ - protected $tokens; - - /** - * The stack pointer to the array opener. - * - * @since 1.0.0 - * - * @var int - */ - protected $arrayOpener; - - /** - * The stack pointer to the array closer. - * - * @since 1.0.0 - * - * @var int - */ - protected $arrayCloser; - - /** - * A multi-dimentional array with information on each array item. - * - * The array index is 1-based and contains the following information on each array item: - * ```php - * 1 => array( - * 'start' => int, // The stack pointer to the first token in the array item. - * 'end' => int, // The stack pointer to the last token in the array item. - * 'raw' => string, // A string with the contents of all tokens between `start` and `end`. - * 'clean' => string, // Same as `raw`, but all comment tokens have been stripped out. - * ) - * ``` - * - * @since 1.0.0 - * - * @var array<int, array<string, int|string>> - */ - protected $arrayItems; - - /** - * How many items are in the array. - * - * @since 1.0.0 - * - * @var int - */ - protected $itemCount = 0; - - /** - * Whether or not the array is single line. - * - * @since 1.0.0 - * - * @var bool - */ - protected $singleLine; - - /** - * List of tokens which can safely be used with an eval() expression. - * - * This list gets enhanced with additional token groups in the constructor. - * - * @since 1.0.0 - * - * @var array<int|string, int|string> - */ - private $acceptedTokens = [ - \T_NULL => \T_NULL, - \T_TRUE => \T_TRUE, - \T_FALSE => \T_FALSE, - \T_LNUMBER => \T_LNUMBER, - \T_DNUMBER => \T_DNUMBER, - \T_CONSTANT_ENCAPSED_STRING => \T_CONSTANT_ENCAPSED_STRING, - \T_STRING_CONCAT => \T_STRING_CONCAT, - \T_BOOLEAN_NOT => \T_BOOLEAN_NOT, - ]; - - /** - * Set up this class. - * - * @since 1.0.0 - * - * @codeCoverageIgnore - * - * @return void - */ - final public function __construct() - { - // Enhance the list of accepted tokens. - $this->acceptedTokens += Tokens::$assignmentTokens; - $this->acceptedTokens += Tokens::$comparisonTokens; - $this->acceptedTokens += Tokens::$arithmeticTokens; - $this->acceptedTokens += Tokens::$operators; - $this->acceptedTokens += Tokens::$booleanOperators; - $this->acceptedTokens += Tokens::$castTokens; - $this->acceptedTokens += Tokens::$bracketTokens; - $this->acceptedTokens += Tokens::$heredocTokens; - $this->acceptedTokens += Collections::ternaryOperators(); - } - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.0.0 - * - * @codeCoverageIgnore - * - * @return array<int|string> - */ - public function register() - { - return Collections::arrayOpenTokensBC(); - } - - /** - * Processes this test when one of its tokens is encountered. - * - * This method fills the properties with relevant information for examining the array - * and then passes off to the {@see AbstractArrayDeclarationSniff::processArray()} method. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where the - * token was found. - * @param int $stackPtr The position in the PHP_CodeSniffer - * file's token stack where the token - * was found. - * - * @return void - */ - final public function process(File $phpcsFile, $stackPtr) - { - try { - $this->arrayItems = PassedParameters::getParameters($phpcsFile, $stackPtr); - } catch (UnexpectedTokenType $e) { - // Parse error, short list, real square open bracket or incorrectly tokenized short array token. - return; - } - - $openClose = Arrays::getOpenClose($phpcsFile, $stackPtr, true); - if ($openClose === false) { - // Parse error or live coding. - return; - } - - $this->stackPtr = $stackPtr; - $this->tokens = $phpcsFile->getTokens(); - $this->arrayOpener = $openClose['opener']; - $this->arrayCloser = $openClose['closer']; - $this->itemCount = \count($this->arrayItems); - - $this->singleLine = true; - if ($this->tokens[$openClose['opener']]['line'] !== $this->tokens[$openClose['closer']]['line']) { - $this->singleLine = false; - } - - $this->processArray($phpcsFile); - - // Reset select properties between calls to this sniff to lower memory usage. - $this->tokens = []; - $this->arrayItems = []; - } - - /** - * Process every part of the array declaration. - * - * Controller which calls the individual `process...()` methods for each part of the array. - * - * The method starts by calling the {@see AbstractArrayDeclarationSniff::processOpenClose()} method - * and subsequently calls the following methods for each array item: - * - * Unkeyed arrays | Keyed arrays - * -------------- | ------------ - * processNoKey() | processKey() - * - | processArrow() - * processValue() | processValue() - * processComma() | processComma() - * - * This is the default logic for the sniff, but can be overloaded in a concrete child class - * if needed. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where the - * token was found. - * - * @return void - */ - public function processArray(File $phpcsFile) - { - if ($this->processOpenClose($phpcsFile, $this->arrayOpener, $this->arrayCloser) === true) { - return; - } - - if ($this->itemCount === 0) { - return; - } - - foreach ($this->arrayItems as $itemNr => $arrayItem) { - try { - $arrowPtr = Arrays::getDoubleArrowPtr($phpcsFile, $arrayItem['start'], $arrayItem['end']); - } catch (LogicException $e) { - // Parse error: empty array item. Ignore. - continue; - } - - if ($arrowPtr !== false) { - if ($this->processKey($phpcsFile, $arrayItem['start'], ($arrowPtr - 1), $itemNr) === true) { - return; - } - - if ($this->processArrow($phpcsFile, $arrowPtr, $itemNr) === true) { - return; - } - - if ($this->processValue($phpcsFile, ($arrowPtr + 1), $arrayItem['end'], $itemNr) === true) { - return; - } - } else { - if ($this->processNoKey($phpcsFile, $arrayItem['start'], $itemNr) === true) { - return; - } - - if ($this->processValue($phpcsFile, $arrayItem['start'], $arrayItem['end'], $itemNr) === true) { - return; - } - } - - $commaPtr = ($arrayItem['end'] + 1); - if ($itemNr < $this->itemCount || $this->tokens[$commaPtr]['code'] === \T_COMMA) { - if ($this->processComma($phpcsFile, $commaPtr, $itemNr) === true) { - return; - } - } - } - } - - /** - * Process the array opener and closer. - * - * Optional method to be implemented in concrete child classes. By default, this method does nothing. - * - * @since 1.0.0 - * - * @codeCoverageIgnore - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where the - * token was found. - * @param int $openPtr The position of the array opener token in the token stack. - * @param int $closePtr The position of the array closer token in the token stack. - * - * @return true|void Returning `TRUE` will short-circuit the sniff and stop processing. - * In effect, this means that the sniff will not examine the individual - * array items if `TRUE` is returned. - */ - public function processOpenClose(File $phpcsFile, $openPtr, $closePtr) - { - } - - /** - * Process the tokens in an array key. - * - * Optional method to be implemented in concrete child classes. By default, this method does nothing. - * - * Note: The `$startPtr` and `$endPtr` do not discount whitespace or comments, but are all inclusive - * to allow for examining all tokens in an array key. - * - * @since 1.0.0 - * - * @codeCoverageIgnore - * - * @see \PHPCSUtils\AbstractSniffs\AbstractArrayDeclarationSniff::getActualArrayKey() Optional helper function. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where the - * token was found. - * @param int $startPtr The stack pointer to the first token in the "key" part of - * an array item. - * @param int $endPtr The stack pointer to the last token in the "key" part of - * an array item. - * @param int $itemNr Which item in the array is being handled. - * 1-based, i.e. the first item is item 1, the second 2 etc. - * - * @return true|void Returning `TRUE` will short-circuit the array item loop and stop processing. - * In effect, this means that the sniff will not examine the double arrow, the array - * value or comma for this array item and will not process any array items after this one. - */ - public function processKey(File $phpcsFile, $startPtr, $endPtr, $itemNr) - { - } - - /** - * Process an array item without an array key. - * - * Optional method to be implemented in concrete child classes. By default, this method does nothing. - * - * Note: This method is _not_ intended for processing the array _value_. Use the - * {@see AbstractArrayDeclarationSniff::processValue()} method to implement processing of the array value. - * - * @since 1.0.0 - * - * @codeCoverageIgnore - * - * @see \PHPCSUtils\AbstractSniffs\AbstractArrayDeclarationSniff::processValue() Method to process the array value. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where the - * token was found. - * @param int $startPtr The stack pointer to the first token in the array item, - * which in this case will be the first token of the array - * value part of the array item. - * @param int $itemNr Which item in the array is being handled. - * 1-based, i.e. the first item is item 1, the second 2 etc. - * - * @return true|void Returning `TRUE` will short-circuit the array item loop and stop processing. - * In effect, this means that the sniff will not examine the array value or - * comma for this array item and will not process any array items after this one. - */ - public function processNoKey(File $phpcsFile, $startPtr, $itemNr) - { - } - - /** - * Process the double arrow. - * - * Optional method to be implemented in concrete child classes. By default, this method does nothing. - * - * @since 1.0.0 - * - * @codeCoverageIgnore - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where the - * token was found. - * @param int $arrowPtr The stack pointer to the double arrow for the array item. - * @param int $itemNr Which item in the array is being handled. - * 1-based, i.e. the first item is item 1, the second 2 etc. - * - * @return true|void Returning `TRUE` will short-circuit the array item loop and stop processing. - * In effect, this means that the sniff will not examine the array value or - * comma for this array item and will not process any array items after this one. - */ - public function processArrow(File $phpcsFile, $arrowPtr, $itemNr) - { - } - - /** - * Process the tokens in an array value. - * - * Optional method to be implemented in concrete child classes. By default, this method does nothing. - * - * Note: The `$startPtr` and `$endPtr` do not discount whitespace or comments, but are all inclusive - * to allow for examining all tokens in an array value. - * - * @since 1.0.0 - * - * @codeCoverageIgnore - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where the - * token was found. - * @param int $startPtr The stack pointer to the first token in the "value" part of - * an array item. - * @param int $endPtr The stack pointer to the last token in the "value" part of - * an array item. - * @param int $itemNr Which item in the array is being handled. - * 1-based, i.e. the first item is item 1, the second 2 etc. - * - * @return true|void Returning `TRUE` will short-circuit the array item loop and stop processing. - * In effect, this means that the sniff will not examine the comma for this - * array item and will not process any array items after this one. - */ - public function processValue(File $phpcsFile, $startPtr, $endPtr, $itemNr) - { - } - - /** - * Process the comma after an array item. - * - * Optional method to be implemented in concrete child classes. By default, this method does nothing. - * - * @since 1.0.0 - * - * @codeCoverageIgnore - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where the - * token was found. - * @param int $commaPtr The stack pointer to the comma. - * @param int $itemNr Which item in the array is being handled. - * 1-based, i.e. the first item is item 1, the second 2 etc. - * - * @return true|void Returning `TRUE` will short-circuit the array item loop and stop processing. - * In effect, this means that the sniff will not process any array items - * after this one. - */ - public function processComma(File $phpcsFile, $commaPtr, $itemNr) - { - } - - /** - * Determine what the actual array key would be. - * - * Helper function for processsing array keys in the processKey() function. - * Using this method is up to the sniff implementation in the child class. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where the - * token was found. - * @param int $startPtr The stack pointer to the first token in the "key" part of - * an array item. - * @param int $endPtr The stack pointer to the last token in the "key" part of - * an array item. - * - * @return string|int|void The string or integer array key or void if the array key could not - * reliably be determined. - */ - public function getActualArrayKey(File $phpcsFile, $startPtr, $endPtr) - { - /* - * Determine the value of the key. - */ - $firstNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, $startPtr, null, true); - $lastNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, $endPtr, null, true); - - $content = ''; - - for ($i = $firstNonEmpty; $i <= $lastNonEmpty; $i++) { - if (isset(Tokens::$commentTokens[$this->tokens[$i]['code']]) === true) { - continue; - } - - if ($this->tokens[$i]['code'] === \T_WHITESPACE) { - $content .= ' '; - continue; - } - - // Handle FQN true/false/null for PHPCS 3.x. - if ($this->tokens[$i]['code'] === \T_NS_SEPARATOR) { - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($i + 1), null, true); - $nextNonEmptyLC = \strtolower($this->tokens[$nextNonEmpty]['content']); - if ($nextNonEmpty !== false - && ($this->tokens[$nextNonEmpty]['code'] === \T_TRUE - || $this->tokens[$nextNonEmpty]['code'] === \T_FALSE - || $this->tokens[$nextNonEmpty]['code'] === \T_NULL) - ) { - $content .= $this->tokens[$nextNonEmpty]['content']; - $i = $nextNonEmpty; - continue; - } - } - - if (isset($this->acceptedTokens[$this->tokens[$i]['code']]) === false - || \T_UNSET_CAST === $this->tokens[$i]['code'] - ) { - // This is not a key we can evaluate. Might be a variable or constant. - return; - } - - // Take PHP 7.4 numeric literal separators into account. - if ($this->tokens[$i]['code'] === \T_LNUMBER || $this->tokens[$i]['code'] === \T_DNUMBER) { - $number = Numbers::getCompleteNumber($phpcsFile, $i); - $content .= $number['content']; - $i = $number['last_token']; - continue; - } - - /* - * Make sure that when new/deprecated/removed casts are used in the code under scan and the sniff is run - * on a PHP version which doesn't support the cast, the eval() won't cause a deprecation notice, - * borking the scan of the file. - * - * - (unset) was deprecated in PHP 7.2 and removed in PHP 8.0; - * - (real) was deprecated in PHP 7.4 and removed in PHP 8.0; - * - (boolean) was deprecated in PHP 8.5 and will be removed in PHP 9.0; - * - (integer) was deprecated in PHP 8.5 and will be removed in PHP 9.0; - * - (double) was deprecated in PHP 8.5 and will be removed in PHP 9.0; - * - (string) was deprecated in PHP 8.5 and will be removed in PHP 9.0; - */ - if (\T_DOUBLE_CAST === $this->tokens[$i]['code']) { - $content .= '(float)'; - continue; - } - - if (\PHP_VERSION_ID >= 80500) { - if (\T_INT_CAST === $this->tokens[$i]['code']) { - $content .= '(int)'; - continue; - } - - if (\T_BOOL_CAST === $this->tokens[$i]['code']) { - $content .= '(bool)'; - continue; - } - - if (\T_BINARY_CAST === $this->tokens[$i]['code']) { - $content .= '(string)'; - continue; - } - } - - // Account for heredoc with vars. - if ($this->tokens[$i]['code'] === \T_START_HEREDOC) { - $text = TextStrings::getCompleteTextString($phpcsFile, $i); - - // Check if there's a variable in the heredoc. - if ($text !== TextStrings::stripEmbeds($text)) { - return; - } - - for ($j = $i; $j <= $this->tokens[$i]['scope_closer']; $j++) { - $content .= $this->tokens[$j]['content']; - } - - $i = $this->tokens[$i]['scope_closer']; - continue; - } - - $content .= $this->tokens[$i]['content']; - } - - // The PHP_EOL is to prevent getting parse errors when the key is a heredoc/nowdoc. - $key = eval('return ' . $content . ';' . \PHP_EOL); - - /* - * Ok, so now we know the base value of the key, let's determine whether it is - * an acceptable index key for an array and if not, what it would turn into. - */ - - switch (\gettype($key)) { - case 'NULL': - // An array key of `null` will become an empty string. - return ''; - - case 'boolean': - return ($key === true) ? 1 : 0; - - case 'integer': - return $key; - - case 'double': - return (int) $key; // Will automatically cut off the decimal part. - - case 'string': - if (Numbers::isDecimalInt($key) === true) { - return (int) $key; - } - - return $key; - - default: - /* - * Shouldn't be possible. Either way, if it's not one of the above types, - * this is not a key we can handle. - */ - return; // @codeCoverageIgnore - } - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/BackCompat/BCFile.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/BackCompat/BCFile.php deleted file mode 100644 index 15b42f1..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/BackCompat/BCFile.php +++ /dev/null @@ -1,1070 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2020 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - * - * The methods in this class are imported from the PHP_CodeSniffer project. - * Note: this is not a one-on-one import of the `File` class! - * - * Copyright of the original code in this class as per the import: - * @author Greg Sherwood <gsherwood@squiz.net> - * @author Jaroslav Hanslík <kukulich@kukulich.cz> - * @author jdavis <jdavis@bamboohr.com> - * @author Klaus Purer <klaus.purer@gmail.com> - * @author Juliette Reinders Folmer <jrf@phpcodesniffer.info> - * @author Nick Wilde <nick@briarmoon.ca> - * @author Martin Hujer <mhujer@gmail.com> - * @author Chris Wilkinson <c.wilkinson@elifesciences.org> - * - * With documentation contributions from: - * @author Pascal Borreli <pascal@borreli.com> - * @author Diogo Oliveira de Melo <dmelo87@gmail.com> - * @author Stefano Kowalke <blueduck@gmx.net> - * @author George Mponos <gmponos@gmail.com> - * @author Tyson Andre <tysonandre775@hotmail.com> - * @author Klaus Purer <klaus.purer@protonmail.ch> - * - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHPCSUtils\BackCompat; - -use PHP_CodeSniffer\Exceptions\RuntimeException; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Tokens\Collections; - -/** - * PHPCS native utility functions. - * - * Backport of the latest versions of PHPCS native utility functions to make them - * available in older PHPCS versions without the bugs and other quirks that the - * older versions of the native functions had. - * - * Additionally, this class works round the following tokenizer issues for - * any affected utility functions: - * - `readonly` classes. - * - Constructor property promotion with `readonly` without visibility. - * - OO methods called `self`, `parent` or `static`. - * - * Most functions in this class will have a related twin-function in the relevant - * class in the `PHPCSUtils\Utils` namespace. - * These will be indicated with `@see` tags in the docblock of the function. - * - * The PHPCSUtils native twin-functions will often have additional features and/or - * improved functionality, but will generally be fully compatible with the PHPCS - * native functions. - * The differences between the functions here and the twin functions are documented - * in the docblock of the respective twin-function. - * - * @see \PHP_CodeSniffer\Files\File Original source of these utility methods. - * - * @since 1.0.0 - */ -final class BCFile -{ - - /** - * Returns the declaration name for classes, interfaces, traits, enums, and functions. - * - * PHPCS cross-version compatible version of the `File::getDeclarationName()` method. - * - * Changelog for the PHPCS native function: - * - Introduced in PHPCS 0.0.5. - * - PHPCS 4.0: The method no longer accepts `T_CLOSURE` and `T_ANON_CLASS` tokens. - * - PHPCS 4.0: The method will now always return a string. - * - * @see \PHP_CodeSniffer\Files\File::getDeclarationName() Original source. - * @see \PHPCSUtils\Utils\ObjectDeclarations::getName() PHPCSUtils native improved version. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the declaration token - * which declared the class, interface, - * trait, enum or function. - * - * @return string The name of the class, interface, trait, or function or an empty string - * if the name could not be determined (live coding). - * - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If the specified token is not of type - * `T_FUNCTION`, `T_CLASS`, `T_TRAIT`, `T_ENUM`, or `T_INTERFACE`. - */ - public static function getDeclarationName(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $tokenCode = $tokens[$stackPtr]['code']; - - if ($tokenCode !== T_FUNCTION - && $tokenCode !== T_CLASS - && $tokenCode !== T_INTERFACE - && $tokenCode !== T_TRAIT - && $tokenCode !== T_ENUM - ) { - throw new RuntimeException('Token type "' . $tokens[$stackPtr]['type'] . '" is not T_FUNCTION, T_CLASS, T_INTERFACE, T_TRAIT or T_ENUM'); - } - - if ($tokenCode === T_FUNCTION - && strtolower($tokens[$stackPtr]['content']) !== 'function' - ) { - // This is a function declared without the "function" keyword. - // So this token is the function name. - return $tokens[$stackPtr]['content']; - } - - $stopPoint = $phpcsFile->numTokens; - if (isset($tokens[$stackPtr]['parenthesis_opener']) === true) { - // For functions, stop searching at the parenthesis opener. - $stopPoint = $tokens[$stackPtr]['parenthesis_opener']; - } elseif (isset($tokens[$stackPtr]['scope_opener']) === true) { - // For OO tokens, stop searching at the open curly. - $stopPoint = $tokens[$stackPtr]['scope_opener']; - } - - $content = ''; - for ($i = $stackPtr; $i < $stopPoint; $i++) { - if ($tokens[$i]['code'] === T_STRING) { - $content = $tokens[$i]['content']; - break; - } - } - - return $content; - } - - /** - * Returns the method parameters for the specified function token. - * - * Also supports passing in a `T_USE` token for a closure use group. - * - * Each parameter is in the following format: - * ```php - * 0 => array( - * 'name' => string, // The variable name. - * 'token' => integer, // The stack pointer to the variable name. - * 'content' => string, // The full content of the variable definition. - * 'has_attributes' => boolean, // Does the parameter have one or more attributes attached ? - * 'pass_by_reference' => boolean, // Is the variable passed by reference? - * 'reference_token' => integer|false, // The stack pointer to the reference operator - * // or FALSE if the param is not passed by reference. - * 'variable_length' => boolean, // Is the param of variable length through use of `...` ? - * 'variadic_token' => integer|false, // The stack pointer to the ... operator - * // or FALSE if the param is not variable length. - * 'type_hint' => string, // The type hint for the variable. - * 'type_hint_token' => integer|false, // The stack pointer to the start of the type hint - * // or FALSE if there is no type hint. - * 'type_hint_end_token' => integer|false, // The stack pointer to the end of the type hint - * // or FALSE if there is no type hint. - * 'nullable_type' => boolean, // TRUE if the param type is preceded by the nullability - * // operator. - * 'comma_token' => integer|false, // The stack pointer to the comma after the param - * // or FALSE if this is the last param. - * ) - * ``` - * - * Parameters with default values have the following additional array indexes: - * ```php - * 'default' => string, // The full content of the default value. - * 'default_token' => integer, // The stack pointer to the start of the default value. - * 'default_equal_token' => integer, // The stack pointer to the equals sign. - * ``` - * - * Parameters declared using PHP 8 constructor property promotion, have these additional array indexes: - * ```php - * 'property_visibility' => string, // The property visibility as declared. - * 'visibility_token' => integer|false, // The stack pointer to the visibility modifier token. - * // or FALSE if the visibility is not explicitly declared. - * 'property_readonly' => boolean, // TRUE if the readonly keyword was found. - * 'readonly_token' => integer, // The stack pointer to the readonly modifier token. - * // This index will only be set if the property is readonly. - * ``` - * - * ... and if the promoted property uses asymmetric visibility, these additional array indexes will also be available: - * ```php - * 'set_visibility' => string, // The property set-visibility as declared. - * 'set_visibility_token' => integer, // The stack pointer to the set-visibility modifier token. - * ``` - * - * PHPCS cross-version compatible version of the `File::getMethodParameters()` method. - * - * Changelog for the PHPCS native function: - * - Introduced in PHPCS 0.0.5. - * - PHPCS 3.8.0: Added support for constructor property promotion with readonly without explicit visibility. - * - * @see \PHP_CodeSniffer\Files\File::getMethodParameters() Original source. - * @see \PHPCSUtils\Utils\FunctionDeclarations::getParameters() PHPCSUtils native improved version. - * - * @since 1.0.0 - * @since 1.0.6 Sync with PHPCS 3.8.0, support for readonly properties without explicit visibility. PHPCS#3801. - * @since 1.1.0 Sync with PHPCS 3.13.1, support for asymmetric properties. PHPCS(new)#851 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position in the stack of the function token - * to acquire the parameters for. - * - * @return array<int, array<string, mixed>> - * - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If the specified `$stackPtr` is not of - * type `T_FUNCTION`, `T_CLOSURE`, `T_USE`, - * or `T_FN`. - */ - public static function getMethodParameters(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset(Collections::functionDeclarationTokens()[$tokens[$stackPtr]['code']]) === false - && $tokens[$stackPtr]['code'] !== T_USE - ) { - throw new RuntimeException('$stackPtr must be of type T_FUNCTION or T_CLOSURE or T_USE or T_FN'); - } - - if ($tokens[$stackPtr]['code'] === T_USE) { - $opener = $phpcsFile->findNext(T_OPEN_PARENTHESIS, ($stackPtr + 1)); - if ($opener === false - || (isset($tokens[$opener]['parenthesis_owner']) === true - // BC: as of PHPCS 4.x, closure use tokens are parentheses owners. - && $tokens[$opener]['parenthesis_owner'] !== $stackPtr) - ) { - throw new RuntimeException('$stackPtr was not a valid T_USE'); - } - } else { - if (isset($tokens[$stackPtr]['parenthesis_opener']) === false) { - // Live coding or syntax error, so no params to find. - return []; - } - - $opener = $tokens[$stackPtr]['parenthesis_opener']; - } - - if (isset($tokens[$opener]['parenthesis_closer']) === false) { - // Live coding or syntax error, so no params to find. - return []; - } - - $closer = $tokens[$opener]['parenthesis_closer']; - - $vars = []; - $currVar = null; - $paramStart = ($opener + 1); - $defaultStart = null; - $equalToken = null; - $paramCount = 0; - $hasAttributes = false; - $passByReference = false; - $referenceToken = false; - $variableLength = false; - $variadicToken = false; - $typeHint = ''; - $typeHintToken = false; - $typeHintEndToken = false; - $nullableType = false; - $visibilityToken = null; - $setVisibilityToken = null; - $readonlyToken = null; - - for ($i = $paramStart; $i <= $closer; $i++) { - // Check to see if this token has a parenthesis or bracket opener. If it does - // it's likely to be an array which might have arguments in it. This - // could cause problems in our parsing below, so lets just skip to the - // end of it. - if ($tokens[$i]['code'] !== T_TYPE_OPEN_PARENTHESIS - && isset($tokens[$i]['parenthesis_opener']) === true - ) { - // Don't do this if it's the close parenthesis for the method. - if ($i !== $tokens[$i]['parenthesis_closer']) { - $i = ($tokens[$i]['parenthesis_closer'] + 1); - } - } - - if (isset($tokens[$i]['bracket_opener']) === true) { - // Don't do this if it's the close parenthesis for the method. - if ($i !== $tokens[$i]['bracket_closer']) { - $i = ($tokens[$i]['bracket_closer'] + 1); - } - } - - switch ($tokens[$i]['code']) { - case T_ATTRIBUTE: - $hasAttributes = true; - - // Skip to the end of the attribute. - $i = $tokens[$i]['attribute_closer']; - break; - case T_BITWISE_AND: - if ($defaultStart === null) { - $passByReference = true; - $referenceToken = $i; - } - break; - case T_VARIABLE: - $currVar = $i; - break; - case T_ELLIPSIS: - $variableLength = true; - $variadicToken = $i; - break; - case T_CALLABLE: - if ($typeHintToken === false) { - $typeHintToken = $i; - } - - $typeHint .= $tokens[$i]['content']; - $typeHintEndToken = $i; - break; - case T_SELF: - case T_PARENT: - case T_STATIC: - // Self and parent are valid, static invalid, but was probably intended as type hint. - if (isset($defaultStart) === false) { - if ($typeHintToken === false) { - $typeHintToken = $i; - } - - $typeHint .= $tokens[$i]['content']; - $typeHintEndToken = $i; - } - break; - case T_STRING: - case T_NAME_QUALIFIED: - case T_NAME_FULLY_QUALIFIED: - case T_NAME_RELATIVE: - // This is an identifier name, so it may be a type declaration, but it could - // also be a constant used as a default value. - $prevComma = false; - for ($t = $i; $t >= $opener; $t--) { - if ($tokens[$t]['code'] === T_COMMA) { - $prevComma = $t; - break; - } - } - - if ($prevComma !== false) { - $nextEquals = false; - for ($t = $prevComma; $t < $i; $t++) { - if ($tokens[$t]['code'] === T_EQUAL) { - $nextEquals = $t; - break; - } - } - - if ($nextEquals !== false) { - break; - } - } - - if ($defaultStart === null) { - if ($typeHintToken === false) { - $typeHintToken = $i; - } - - $typeHint .= $tokens[$i]['content']; - $typeHintEndToken = $i; - } - break; - case T_NAMESPACE: - case T_NS_SEPARATOR: - case T_TYPE_UNION: - case T_TYPE_INTERSECTION: - case T_TYPE_OPEN_PARENTHESIS: - case T_TYPE_CLOSE_PARENTHESIS: - case T_FALSE: - case T_TRUE: - case T_NULL: - // Part of a type hint or default value. - if ($defaultStart === null) { - if ($typeHintToken === false) { - $typeHintToken = $i; - } - - $typeHint .= $tokens[$i]['content']; - $typeHintEndToken = $i; - } - break; - case T_NULLABLE: - if ($defaultStart === null) { - $nullableType = true; - $typeHint .= $tokens[$i]['content']; - $typeHintEndToken = $i; - } - break; - case T_PUBLIC: - case T_PROTECTED: - case T_PRIVATE: - if ($defaultStart === null) { - $visibilityToken = $i; - } - break; - case T_PUBLIC_SET: - case T_PROTECTED_SET: - case T_PRIVATE_SET: - if ($defaultStart === null) { - $setVisibilityToken = $i; - } - break; - case T_READONLY: - if ($defaultStart === null) { - $readonlyToken = $i; - } - break; - case T_CLOSE_PARENTHESIS: - case T_COMMA: - // If it's null, then there must be no parameters for this - // method. - if ($currVar === null) { - continue 2; - } - - $vars[$paramCount] = []; - $vars[$paramCount]['token'] = $currVar; - $vars[$paramCount]['name'] = $tokens[$currVar]['content']; - $vars[$paramCount]['content'] = trim($phpcsFile->getTokensAsString($paramStart, ($i - $paramStart))); - - if ($defaultStart !== null) { - $vars[$paramCount]['default'] = trim($phpcsFile->getTokensAsString($defaultStart, ($i - $defaultStart))); - $vars[$paramCount]['default_token'] = $defaultStart; - $vars[$paramCount]['default_equal_token'] = $equalToken; - } - - $vars[$paramCount]['has_attributes'] = $hasAttributes; - $vars[$paramCount]['pass_by_reference'] = $passByReference; - $vars[$paramCount]['reference_token'] = $referenceToken; - $vars[$paramCount]['variable_length'] = $variableLength; - $vars[$paramCount]['variadic_token'] = $variadicToken; - $vars[$paramCount]['type_hint'] = $typeHint; - $vars[$paramCount]['type_hint_token'] = $typeHintToken; - $vars[$paramCount]['type_hint_end_token'] = $typeHintEndToken; - $vars[$paramCount]['nullable_type'] = $nullableType; - - if ($visibilityToken !== null || $setVisibilityToken !== null || $readonlyToken !== null) { - $vars[$paramCount]['property_visibility'] = 'public'; - $vars[$paramCount]['visibility_token'] = false; - - if ($visibilityToken !== null) { - $vars[$paramCount]['property_visibility'] = $tokens[$visibilityToken]['content']; - $vars[$paramCount]['visibility_token'] = $visibilityToken; - } - - if ($setVisibilityToken !== null) { - $vars[$paramCount]['set_visibility'] = $tokens[$setVisibilityToken]['content']; - $vars[$paramCount]['set_visibility_token'] = $setVisibilityToken; - } - - $vars[$paramCount]['property_readonly'] = false; - if ($readonlyToken !== null) { - $vars[$paramCount]['property_readonly'] = true; - $vars[$paramCount]['readonly_token'] = $readonlyToken; - } - } - - if ($tokens[$i]['code'] === T_COMMA) { - $vars[$paramCount]['comma_token'] = $i; - } else { - $vars[$paramCount]['comma_token'] = false; - } - - // Reset the vars, as we are about to process the next parameter. - $currVar = null; - $paramStart = ($i + 1); - $defaultStart = null; - $equalToken = null; - $hasAttributes = false; - $passByReference = false; - $referenceToken = false; - $variableLength = false; - $variadicToken = false; - $typeHint = ''; - $typeHintToken = false; - $typeHintEndToken = false; - $nullableType = false; - $visibilityToken = null; - $setVisibilityToken = null; - $readonlyToken = null; - - ++$paramCount; - break; - case T_EQUAL: - $defaultStart = $phpcsFile->findNext(Tokens::$emptyTokens, ($i + 1), null, true); - $equalToken = $i; - break; - } - } - - return $vars; - } - - /** - * Returns the visibility and implementation properties of a method. - * - * The format of the return value is: - * ```php - * array( - * 'scope' => string, // Public, private, or protected - * 'scope_specified' => boolean, // TRUE if the scope keyword was found. - * 'return_type' => string, // The return type of the method. - * 'return_type_token' => integer|false, // The stack pointer to the start of the return type - * // or FALSE if there is no return type. - * 'return_type_end_token' => integer|false, // The stack pointer to the end of the return type - * // or FALSE if there is no return type. - * 'nullable_return_type' => boolean, // TRUE if the return type is preceded by - * // the nullability operator. - * 'is_abstract' => boolean, // TRUE if the abstract keyword was found. - * 'is_final' => boolean, // TRUE if the final keyword was found. - * 'is_static' => boolean, // TRUE if the static keyword was found. - * 'has_body' => boolean, // TRUE if the method has a body - * ); - * ``` - * - * PHPCS cross-version compatible version of the `File::getMethodProperties()` method. - * - * Changelog for the PHPCS native function: - * - Introduced in PHPCS 0.0.5. - * - The upstream method has received no significant updates since PHPCS 3.13.5. - * - * @see \PHP_CodeSniffer\Files\File::getMethodProperties() Original source. - * @see \PHPCSUtils\Utils\FunctionDeclarations::getProperties() PHPCSUtils native improved version. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position in the stack of the function token to - * acquire the properties for. - * - * @return array<string, mixed> - * - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If the specified position is not a - * `T_FUNCTION`, `T_CLOSURE`, or `T_FN` token. - */ - public static function getMethodProperties(File $phpcsFile, $stackPtr) - { - return $phpcsFile->getMethodProperties($stackPtr); - } - - /** - * Returns the visibility and implementation properties of a class member var. - * - * The format of the return value is: - * ```php - * array( - * 'scope' => string, // Public, private, or protected. - * 'scope_specified' => boolean, // TRUE if the scope was explicitly specified. - * 'set_scope' => string|false, // Scope for asymmetric visibility. - * // Either public, private, or protected or - * // FALSE if no set scope is specified. - * 'is_static' => boolean, // TRUE if the static keyword was found. - * 'is_readonly' => boolean, // TRUE if the readonly keyword was found. - * 'is_final' => boolean, // TRUE if the final keyword was found. - * 'is_abstract' => boolean, // TRUE if the abstract keyword was found. - * 'type' => string, // The type of the var (empty if no type specified). - * 'type_token' => integer|false, // The stack pointer to the start of the type - * // or FALSE if there is no type. - * 'type_end_token' => integer|false, // The stack pointer to the end of the type - * // or FALSE if there is no type. - * 'nullable_type' => boolean, // TRUE if the type is preceded by the - * // nullability operator. - * ); - * ``` - * - * PHPCS cross-version compatible version of the `File::getMemberProperties() method. - * - * Changelog for the PHPCS native function: - * - Introduced in PHPCS 0.0.5. - * - PHPCS 3.13.3: support for PHP 8.4 abstract properties. - * - PHPCS 4.0: properties in interfaces (PHP 8.4+) are accepted. - * - PHPCS 4.0: will no longer throw a parse error warning. - * - * @see \PHP_CodeSniffer\Files\File::getMemberProperties() Original source. - * @see \PHPCSUtils\Utils\Variables::getMemberProperties() PHPCSUtils native improved version. - * - * @since 1.0.0 - * @since 1.1.0 Sync with PHPCS 4.0.0, remove parse error warning and support PHP 8.4 properties in interfaces. PHPCS(new)#991 - * @since 1.1.2 Sync with PHPCS 3.13.3, support for abstract properties. PHPCS(new)#1183 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position in the stack of the `T_VARIABLE` token to - * acquire the properties for. - * - * @return array<string, mixed> - * - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If the specified position is not a - * `T_VARIABLE` token, or if the position is not - * a class member variable. - */ - public static function getMemberProperties(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['code'] !== T_VARIABLE) { - throw new RuntimeException('$stackPtr must be of type T_VARIABLE'); - } - - if (empty($tokens[$stackPtr]['conditions']) === true) { - throw new RuntimeException('$stackPtr is not a class member var'); - } - - $conditions = $tokens[$stackPtr]['conditions']; - $conditions = array_keys($conditions); - $ptr = array_pop($conditions); - if (isset($tokens[$ptr]) === false - || isset(Tokens::$ooScopeTokens[$tokens[$ptr]['code']]) === false - || $tokens[$ptr]['code'] === T_ENUM - ) { - throw new RuntimeException('$stackPtr is not a class member var'); - } - - // Make sure it's not a method parameter. - if (empty($tokens[$stackPtr]['nested_parenthesis']) === false) { - $parenthesis = array_keys($tokens[$stackPtr]['nested_parenthesis']); - $deepestOpen = array_pop($parenthesis); - if ($deepestOpen > $ptr - && isset($tokens[$deepestOpen]['parenthesis_owner']) === true - && $tokens[$tokens[$deepestOpen]['parenthesis_owner']]['code'] === T_FUNCTION - ) { - throw new RuntimeException('$stackPtr is not a class member var'); - } - } - - $valid = [ - T_STATIC => T_STATIC, - T_VAR => T_VAR, - T_READONLY => T_READONLY, - T_FINAL => T_FINAL, - T_ABSTRACT => T_ABSTRACT, - ]; - - $valid += Tokens::$scopeModifiers; - $valid += Tokens::$emptyTokens; - - $scope = 'public'; - $scopeSpecified = false; - $setScope = false; - $isStatic = false; - $isReadonly = false; - $isFinal = false; - $isAbstract = false; - - $startOfStatement = $phpcsFile->findPrevious( - [ - T_SEMICOLON, - T_OPEN_CURLY_BRACKET, - T_CLOSE_CURLY_BRACKET, - T_ATTRIBUTE_END, - ], - ($stackPtr - 1) - ); - - for ($i = ($startOfStatement + 1); $i < $stackPtr; $i++) { - if (isset($valid[$tokens[$i]['code']]) === false) { - break; - } - - switch ($tokens[$i]['code']) { - case T_PUBLIC: - $scope = 'public'; - $scopeSpecified = true; - break; - case T_PRIVATE: - $scope = 'private'; - $scopeSpecified = true; - break; - case T_PROTECTED: - $scope = 'protected'; - $scopeSpecified = true; - break; - case T_PUBLIC_SET: - $setScope = 'public'; - break; - case T_PROTECTED_SET: - $setScope = 'protected'; - break; - case T_PRIVATE_SET: - $setScope = 'private'; - break; - case T_STATIC: - $isStatic = true; - break; - case T_READONLY: - $isReadonly = true; - break; - case T_FINAL: - $isFinal = true; - break; - case T_ABSTRACT: - $isAbstract = true; - break; - } - } - - $type = ''; - $typeToken = false; - $typeEndToken = false; - $nullableType = false; - - if ($i < $stackPtr) { - // We've found a type. - $valid = Collections::propertyTypeTokens(); - - for ($i; $i < $stackPtr; $i++) { - if ($tokens[$i]['code'] === T_VARIABLE) { - // Hit another variable in a group definition. - break; - } - - if ($tokens[$i]['code'] === T_NULLABLE) { - $nullableType = true; - } - - if (isset($valid[$tokens[$i]['code']]) === true) { - $typeEndToken = $i; - if ($typeToken === false) { - $typeToken = $i; - } - - $type .= $tokens[$i]['content']; - } - } - - if ($type !== '' && $nullableType === true) { - $type = '?' . $type; - } - } - - return [ - 'scope' => $scope, - 'scope_specified' => $scopeSpecified, - 'set_scope' => $setScope, - 'is_static' => $isStatic, - 'is_readonly' => $isReadonly, - 'is_final' => $isFinal, - 'is_abstract' => $isAbstract, - 'type' => $type, - 'type_token' => $typeToken, - 'type_end_token' => $typeEndToken, - 'nullable_type' => $nullableType, - ]; - } - - /** - * Returns the implementation properties of a class. - * - * The format of the return value is: - * ```php - * array( - * 'is_abstract' => boolean, // TRUE if the abstract keyword was found. - * 'is_final' => boolean, // TRUE if the final keyword was found. - * 'is_readonly' => boolean, // TRUE if the readonly keyword was found. - * ); - * ``` - * - * PHPCS cross-version compatible version of the `File::getClassProperties()` method. - * - * Changelog for the PHPCS native function: - * - Introduced in PHPCS 1.3.0. - * - The upstream method has received no significant updates since PHPCS 3.13.5. - * - * @see \PHP_CodeSniffer\Files\File::getClassProperties() Original source. - * @see \PHPCSUtils\Utils\ObjectDeclarations::getClassProperties() PHPCSUtils native improved version. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position in the stack of the `T_CLASS` - * token to acquire the properties for. - * - * @return array<string, bool> - * - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If the specified position is not a - * `T_CLASS` token. - */ - public static function getClassProperties(File $phpcsFile, $stackPtr) - { - return $phpcsFile->getClassProperties($stackPtr); - } - - /** - * Determine if the passed token is a reference operator. - * - * PHPCS cross-version compatible version of the `File::isReference()` method. - * - * Changelog for the PHPCS native function: - * - Introduced in PHPCS 0.0.5. - * - The upstream method has received no significant updates since PHPCS 3.13.5. - * - * @see \PHP_CodeSniffer\Files\File::isReference() Original source. - * @see \PHPCSUtils\Utils\Operators::isReference() PHPCSUtils native improved version. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the `T_BITWISE_AND` token. - * - * @return bool `TRUE` if the specified token position represents a reference. - * `FALSE` if the token represents a bitwise operator. - */ - public static function isReference(File $phpcsFile, $stackPtr) - { - return $phpcsFile->isReference($stackPtr); - } - - /** - * Returns the content of the tokens from the specified start position in - * the token stack for the specified length. - * - * PHPCS cross-version compatible version of the `File::getTokensAsString()` method. - * - * Changelog for the PHPCS native function: - * - Introduced in PHPCS 0.0.5. - * - The upstream method has received no significant updates since PHPCS 3.13.5. - * - * @see \PHP_CodeSniffer\Files\File::getTokensAsString() Original source. - * @see \PHPCSUtils\Utils\GetTokensAsString Related set of functions. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $start The position to start from in the token stack. - * @param int $length The length of tokens to traverse from the start pos. - * @param bool $origContent Whether the original content or the tab replaced - * content should be used. - * - * @return string The token contents. - * - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If the specified start position does not exist. - */ - public static function getTokensAsString(File $phpcsFile, $start, $length, $origContent = false) - { - return $phpcsFile->getTokensAsString($start, $length, $origContent); - } - - /** - * Returns the position of the first non-whitespace token in a statement. - * - * PHPCS cross-version compatible version of the `File::findStartOfStatement()` method. - * - * Changelog for the PHPCS native function: - * - Introduced in PHPCS 2.1.0. - * - The upstream method has received no significant updates since PHPCS 3.13.5. - * - * @see \PHP_CodeSniffer\Files\File::findStartOfStatement() Original source. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $start The position to start searching from in the token stack. - * @param int|string|array<int|string> $ignore Token types that should not be considered stop points. - * - * @return int - */ - public static function findStartOfStatement(File $phpcsFile, $start, $ignore = null) - { - return $phpcsFile->findStartOfStatement($start, $ignore); - } - - /** - * Returns the position of the last non-whitespace token in a statement. - * - * PHPCS cross-version compatible version of the `File::findEndOfStatement() method. - * - * Changelog for the PHPCS native function: - * - Introduced in PHPCS 2.1.0. - * - The upstream method has received no significant updates since PHPCS 3.13.5. - * - * @see \PHP_CodeSniffer\Files\File::findEndOfStatement() Original source. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $start The position to start searching from in the token stack. - * @param int|string|array<int|string> $ignore Token types that should not be considered stop points. - * - * @return int - */ - public static function findEndOfStatement(File $phpcsFile, $start, $ignore = null) - { - return $phpcsFile->findEndOfStatement($start, $ignore); - } - - /** - * Determine if the passed token has a condition of one of the passed types. - * - * PHPCS cross-version compatible version of the `File::hasCondition()` method. - * - * Changelog for the PHPCS native function: - * - Introduced in PHPCS 0.0.5. - * - The upstream method has received no significant updates since PHPCS 3.13.5. - * - * @see \PHP_CodeSniffer\Files\File::hasCondition() Original source. - * @see \PHPCSUtils\Utils\Conditions::hasCondition() PHPCSUtils native alternative. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the token we are checking. - * @param int|string|array<int|string> $types The type(s) of tokens to search for. - * - * @return bool - */ - public static function hasCondition(File $phpcsFile, $stackPtr, $types) - { - return $phpcsFile->hasCondition($stackPtr, $types); - } - - /** - * Return the position of the condition for the passed token. - * - * PHPCS cross-version compatible version of the `File::getCondition()` method. - * - * Changelog for the PHPCS native function: - * - Introduced in PHPCS 1.3.0. - * - The upstream method has received no significant updates since PHPCS 3.13.5. - * - * @see \PHP_CodeSniffer\Files\File::getCondition() Original source. - * @see \PHPCSUtils\Utils\Conditions::getCondition() More versatile alternative. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the token we are checking. - * @param int|string $type The type of token to search for. - * @param bool $first If `true`, will return the matched condition - * furthest away from the passed token. - * If `false`, will return the matched condition - * closest to the passed token. - * - * @return int|false Integer stack pointer to the condition or `FALSE` if the token - * does not have the condition. - */ - public static function getCondition(File $phpcsFile, $stackPtr, $type, $first = true) - { - return $phpcsFile->getCondition($stackPtr, $type, $first); - } - - /** - * Returns the name of the class that the specified class extends. - * (works for classes, anonymous classes and interfaces) - * - * PHPCS cross-version compatible version of the `File::findExtendedClassName()` method. - * - * Changelog for the PHPCS native function: - * - Introduced in PHPCS 1.2.0. - * - PHPCS 4.0.0: Handling of the namespace relative parent class using the namespace keyword as operator. - * - * @see \PHP_CodeSniffer\Files\File::findExtendedClassName() Original source. - * @see \PHPCSUtils\Utils\ObjectDeclarations::findExtendedClassName() PHPCSUtils native improved version. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The stack position of the class or interface. - * - * @return string|false The extended class name or `FALSE` on error or if there - * is no extended class name. - */ - public static function findExtendedClassName(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Check for the existence of the token. - if (isset($tokens[$stackPtr]) === false) { - return false; - } - - if ($tokens[$stackPtr]['code'] !== T_CLASS - && $tokens[$stackPtr]['code'] !== T_ANON_CLASS - && $tokens[$stackPtr]['code'] !== T_INTERFACE - ) { - return false; - } - - if (isset($tokens[$stackPtr]['scope_opener']) === false) { - return false; - } - - $classOpenerIndex = $tokens[$stackPtr]['scope_opener']; - $extendsIndex = $phpcsFile->findNext(T_EXTENDS, $stackPtr, $classOpenerIndex); - if ($extendsIndex === false) { - return false; - } - - $find = Collections::namespacedNameTokens(); - $find[] = T_WHITESPACE; - - $end = $phpcsFile->findNext($find, ($extendsIndex + 1), ($classOpenerIndex + 1), true); - $name = $phpcsFile->getTokensAsString(($extendsIndex + 1), ($end - $extendsIndex - 1)); - $name = trim($name); - - if ($name === '') { - return false; - } - - return $name; - } - - /** - * Returns the names of the interfaces that the specified class or enum implements. - * - * PHPCS cross-version compatible version of the `File::findImplementedInterfaceNames()` method. - * - * Changelog for the PHPCS native function: - * - Introduced in PHPCS 2.7.0. - * - PHPCS 4.0.0: Handling of the namespace relative parent class using the namespace keyword as operator. - * - * @see \PHP_CodeSniffer\Files\File::findImplementedInterfaceNames() Original source. - * @see \PHPCSUtils\Utils\ObjectDeclarations::findImplementedInterfaceNames() PHPCSUtils native improved version. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The stack position of the class or enum token. - * - * @return array<string>|false Array with names of the implemented interfaces or `FALSE` on - * error or if there are no implemented interface names. - */ - public static function findImplementedInterfaceNames(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Check for the existence of the token. - if (isset($tokens[$stackPtr]) === false) { - return false; - } - - if ($tokens[$stackPtr]['code'] !== T_CLASS - && $tokens[$stackPtr]['code'] !== T_ANON_CLASS - && $tokens[$stackPtr]['code'] !== T_ENUM - ) { - return false; - } - - if (isset($tokens[$stackPtr]['scope_closer']) === false) { - return false; - } - - $classOpenerIndex = $tokens[$stackPtr]['scope_opener']; - $implementsIndex = $phpcsFile->findNext(T_IMPLEMENTS, $stackPtr, $classOpenerIndex); - if ($implementsIndex === false) { - return false; - } - - $find = Collections::namespacedNameTokens(); - $find[] = T_WHITESPACE; - $find[] = T_COMMA; - - $end = $phpcsFile->findNext($find, ($implementsIndex + 1), ($classOpenerIndex + 1), true); - $name = $phpcsFile->getTokensAsString(($implementsIndex + 1), ($end - $implementsIndex - 1)); - $name = trim($name); - - if ($name === '') { - return false; - } else { - $names = explode(',', $name); - $names = array_map('trim', $names); - return $names; - } - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/BackCompat/BCTokens.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/BackCompat/BCTokens.php deleted file mode 100644 index de59738..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/BackCompat/BCTokens.php +++ /dev/null @@ -1,280 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2020 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\BackCompat; - -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Exceptions\InvalidTokenArray; -use PHPCSUtils\Tokens\Collections; - -/** - * Token arrays related utility methods. - * - * PHPCS provides a number of static token arrays in the {@see \PHP_CodeSniffer\Util\Tokens} - * class. - * Some of these token arrays will not be available in older PHPCS versions. - * Some will not contain the same set of tokens across PHPCS versions. - * - * This class is a compatibility layer to allow for retrieving these token arrays - * with a consistent token content across PHPCS versions. - * The one caveat is that the token constants do need to be available. - * - * Recommended usage: - * Only use the methods in this class when needed. I.e. when your sniff unit tests indicate - * a PHPCS cross-version compatibility issue related to inconsistent token arrays. - * - * All PHPCS token arrays are supported, though only a limited number of them are different - * across PHPCS versions. - * - * The names of the PHPCS native token arrays translate one-on-one to the methods in this class: - * - `PHP_CodeSniffer\Util\Tokens::$emptyTokens` => `PHPCSUtils\BackCompat\BCTokens::emptyTokens()` - * - `PHP_CodeSniffer\Util\Tokens::$operators` => `PHPCSUtils\BackCompat\BCTokens::operators()` - * - ... etc - * - * The order of the tokens in the arrays may differ between the PHPCS native token arrays and - * the token arrays returned by this class. - * - * @since 1.0.0 - * - * @method static array<int|string, int|string> arithmeticTokens() Tokens that represent arithmetic operators. - * @method static array<int|string, int|string> booleanOperators() Tokens that perform boolean operations. - * @method static array<int|string, int|string> bracketTokens() Tokens that represent brackets and parenthesis. - * @method static array<int|string, int|string> commentTokens() Tokens that are comments. - * @method static array<int|string, int|string> comparisonTokens() Tokens that represent comparison operator. - * @method static array<int|string, int|string> contextSensitiveKeywords() Tokens representing context sensitive keywords - * in PHP. - * @method static array<int|string, int|string> emptyTokens() Tokens that don't represent code. - * @method static array<int|string, int|string> equalityTokens() Tokens that represent equality comparisons. - * @method static array<int|string, int|string> heredocTokens() Tokens that make up a heredoc string. - * @method static array<int|string, int|string> includeTokens() Tokens that include files. - * @method static array<int|string, int|string> magicConstants() Tokens representing PHP magic constants. - * @method static array<int|string, int|string> methodPrefixes() Tokens that can prefix a method name. - * @method static array<int|string, int|string> ooScopeTokens() Tokens that open class and object scopes. - * @method static array<int|string, int|string> operators() Tokens that perform operations. - * @method static array<int|string, int|string> phpcsCommentTokens() Tokens that are comments containing PHPCS - * instructions. - * @method static array<int|string, int|string> scopeModifiers() Tokens that represent scope modifiers. - * @method static array<int|string, int|string> stringTokens() Tokens that represent strings. - * Note that `T_STRING`s are NOT represented in this - * list as this list is about _text_ strings. - * @method static array<int|string, int|string> textStringTokens() Tokens that represent text strings. - */ -final class BCTokens -{ - - /** - * Handle calls to (undeclared) methods for token arrays which haven't received any - * changes since PHPCS 3.13.5. - * - * @since 1.0.0 - * - * @param string $name The name of the method which has been called. - * @param array<mixed> $args Any arguments passed to the method. - * Unused as none of the methods take arguments. - * - * @return array<int|string, int|string> Token array - * - * @throws \PHPCSUtils\Exceptions\InvalidTokenArray When an invalid token array is requested. - */ - public static function __callStatic($name, $args) - { - if (isset(Tokens::${$name})) { - return Tokens::${$name}; - } - - // Unknown token array requested. - throw InvalidTokenArray::create($name); - } - - /** - * Tokens that represent assignments. - * - * Retrieve the PHPCS assignments tokens array in a cross-version compatible manner. - * - * Changelog for the PHPCS native array: - * - PHPCS 4.0.0: The JS specific `T_ZSR_EQUAL` token is no longer available and has been removed from the array. - * - * @see \PHP_CodeSniffer\Util\Tokens::$assignmentTokens Original array. - * - * @since 1.0.0 - * - * @return array<int|string, int|string> Token array. - */ - public static function assignmentTokens() - { - $tokens = Tokens::$assignmentTokens; - - if (\defined('T_ZSR_EQUAL') && isset($tokens[\T_ZSR_EQUAL])) { - unset($tokens[\T_ZSR_EQUAL]); - } - - return $tokens; - } - - /** - * Tokens that open code blocks. - * - * Retrieve the PHPCS block opener tokens array in a cross-version compatible manner. - * - * Changelog for the PHPCS native array: - * - PHPCS 4.0.0: The JS specific `T_OBJECT` token is no longer available and has been removed from the array. - * - * @see \PHP_CodeSniffer\Util\Tokens::$blockOpeners Original array. - * - * @since 1.0.0 - * - * @return array<int|string, int|string> Token array. - */ - public static function blockOpeners() - { - $tokens = Tokens::$blockOpeners; - - if (\defined('T_OBJECT') && isset($tokens[\T_OBJECT])) { - unset($tokens[\T_OBJECT]); - } - - return $tokens; - } - - /** - * Tokens that represent casting. - * - * Retrieve the PHPCS cast tokens array in a cross-version compatible manner. - * - * Changelog for the PHPCS native array: - * - PHPCS 4.0.2: The PHP 8.5 T_VOID_CAST token was added. - * - * @see \PHP_CodeSniffer\Util\Tokens::$castTokens Original array. - * - * @since 1.2.1 - * - * @return array<int|string, int|string> Token array. - */ - public static function castTokens() - { - $tokens = Tokens::$castTokens; - - if (\defined('T_VOID_CAST')) { - $tokens[\T_VOID_CAST] = \T_VOID_CAST; - } - - return $tokens; - } - - /** - * Tokens that represent the names of called functions. - * - * Retrieve the PHPCS function name tokens array in a cross-version compatible manner. - * - * Changelog for the PHPCS native array: - * - Introduced in PHPCS 2.3.3. - * - PHPCS 4.0.0: `T_NAME_QUALIFIED`, `T_NAME_FULLY_QUALIFIED`, `T_NAME_RELATIVE` and `T_ANON_CLASS` added to the array. - * - * @see \PHP_CodeSniffer\Util\Tokens::$functionNameTokens Original array. - * - * @since 1.0.0 - * - * @return array<int|string, int|string> Token array. - */ - public static function functionNameTokens() - { - $tokens = Tokens::$functionNameTokens; - $tokens += Collections::nameTokens(); - $tokens[\T_ANON_CLASS] = \T_ANON_CLASS; - - return $tokens; - } - - /** - * Tokens used for "names", be it namespace, OO, function or constant names. - * - * Retrieve the PHPCS name tokens array in a cross-version compatible manner. - * - * Changelog for the PHPCS native array: - * - Introduced in PHPCS 4.0.0. - * - * @see \PHP_CodeSniffer\Util\Tokens::NAME_TOKENS Original array. - * - * @since 1.1.0 - * - * @return array<int|string, int|string> Token array. - */ - public static function nameTokens() - { - return Collections::nameTokens(); - } - - /** - * Token types that open parentheses. - * - * Retrieve the PHPCS parenthesis openers tokens array in a cross-version compatible manner. - * - * Changelog for the PHPCS native array: - * - Introduced in PHPCS 0.0.5. - * - PHPCS 4.0.0: `T_USE` (for closures), `T_ISSET`, `T_UNSET`, `T_EMPTY`, `T_EVAL` and `T_EXIT` added to the array. - * - * **Important**: While `T_USE`, `T_ISSET`, `T_UNSET`, `T_EMPTY`, `T_EVAL` and `T_EXIT` will be included - * in the return value for this method, the associated parentheses will not have the `'parenthesis_owner'` index - * set until PHPCS 4.0.0. - * Use the {@see \PHPCSUtils\Utils\Parentheses::getOwner()} or {@see \PHPCSUtils\Utils\Parentheses::hasOwner()} methods - * if you need to check for whether any of these tokens are a parentheses owner. - * - * @see \PHP_CodeSniffer\Util\Tokens::$parenthesisOpeners Original array. - * @see \PHPCSUtils\Utils\Parentheses Class holding utility methods for - * working with the `'parenthesis_...'` - * index keys in a token array. - * - * @since 1.0.0 - * - * @return array<int|string, int|string> Token array. - */ - public static function parenthesisOpeners() - { - $tokens = Tokens::$parenthesisOpeners; - $tokens[\T_USE] = \T_USE; - $tokens[\T_ISSET] = \T_ISSET; - $tokens[\T_UNSET] = \T_UNSET; - $tokens[\T_EMPTY] = \T_EMPTY; - $tokens[\T_EVAL] = \T_EVAL; - $tokens[\T_EXIT] = \T_EXIT; - - return $tokens; - } - - /** - * Tokens that are allowed to open scopes. - * - * Retrieve the PHPCS scope opener tokens array in a cross-version compatible manner. - * - * Changelog for the PHPCS native array: - * - PHPCS 4.0.0: The JS specific `T_PROPERTY` and `T_OBJECT` tokens are no longer available - * and have been removed from the array. - * - * @see \PHP_CodeSniffer\Util\Tokens::$scopeOpeners Original array. - * - * @since 1.0.0 - * - * @return array<int|string, int|string> Token array. - */ - public static function scopeOpeners() - { - $tokens = Tokens::$scopeOpeners; - - if (\defined('T_PROPERTY') && isset($tokens[\T_PROPERTY])) { - unset($tokens[\T_PROPERTY]); - } - - if (\defined('T_OBJECT') && isset($tokens[\T_OBJECT])) { - unset($tokens[\T_OBJECT]); - } - - return $tokens; - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/BackCompat/Helper.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/BackCompat/Helper.php deleted file mode 100644 index 408959d..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/BackCompat/Helper.php +++ /dev/null @@ -1,204 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2020 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\BackCompat; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Files\File; -use PHPCSUtils\Exceptions\MissingArgumentError; - -/** - * Utility methods to retrieve (configuration) information from PHP_CodeSniffer. - * - * PHP_CodeSniffer cross-version compatibility helper. - * - * @since 1.0.0 The initial methods in this class have been ported over from - * the external PHPCompatibility & WPCS standards. - */ -final class Helper -{ - - /** - * The default tab width used by PHP_CodeSniffer. - * - * @since 1.0.0 - * - * @var int - */ - const DEFAULT_TABWIDTH = 4; - - /** - * Get the PHP_CodeSniffer version number. - * - * @since 1.0.0 - * - * @return string - */ - public static function getVersion() - { - return Config::VERSION; - } - - /** - * Pass config data to PHP_CodeSniffer. - * - * @since 1.0.0 - * - * @param string $key The name of the config value. - * @param mixed $value The value to set. If `null`, the config entry - * is deleted, reverting it to the default value. - * @param bool $temp Set this config data temporarily for this script run. - * This will not write the config data to the config file. - * @param \PHP_CodeSniffer\Config $config The PHPCS config object. - * This parameter is required for PHPCS 4.x, optional - * for PHPCS 3.x and not possible to pass for PHPCS 2.x. - * Passing the `$phpcsFile->config` property should work - * in PHPCS 3.x and higher. - * - * @return bool Whether the setting of the data was successfull. - * - * @throws \PHPCSUtils\Exceptions\MissingArgumentError When using PHPCS 4.x and not passing the $config parameter. - */ - public static function setConfigData($key, $value, $temp = false, $config = null) - { - if (isset($config) === true) { - // PHPCS 3.x and 4.x. - return $config->setConfigData($key, $value, $temp); - } - - if (\version_compare(self::getVersion(), '3.99.99', '>') === true) { - throw MissingArgumentError::create(4, '$config', 'when running on PHPCS 4.x'); - } - - // PHPCS 3.x. - return Config::setConfigData($key, $value, $temp); - } - - /** - * Get the value of a single PHP_CodeSniffer config key. - * - * @see Helper::getCommandLineData() Alternative for the same which is more reliable - * if the `$phpcsFile` object is available. - * - * @since 1.0.0 - * - * @param string $key The name of the config value. - * - * @return string|null - */ - public static function getConfigData($key) - { - return Config::getConfigData($key); - } - - /** - * Get the value of a CLI overrulable single PHP_CodeSniffer config key. - * - * Use this for config keys which can be set in the `CodeSniffer.conf` file, - * on the command-line or in a ruleset. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being processed. - * @param string $key The name of the config value. - * - * @return string|null - */ - public static function getCommandLineData(File $phpcsFile, $key) - { - if (isset($phpcsFile->config->{$key})) { - return $phpcsFile->config->{$key}; - } - - return null; - } - - /** - * Get the applicable tab width as passed to PHP_CodeSniffer from the - * command-line or the ruleset. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being processed. - * - * @return int Tab width. Defaults to the PHPCS native default of 4. - */ - public static function getTabWidth(File $phpcsFile) - { - $tabWidth = self::getCommandLineData($phpcsFile, 'tabWidth'); - if ($tabWidth > 0) { - return (int) $tabWidth; - } - - return self::DEFAULT_TABWIDTH; - } - - /** - * Get the applicable (file) encoding as passed to PHP_CodeSniffer from the - * command-line or the ruleset. - * - * @since 1.0.0 - * @since 1.0.10 The `File` type declaration has been removed from the parameter declaration. - * - * @param \PHP_CodeSniffer\Files\File|null $phpcsFile Optional. The current file being processed. - * - * @return string Encoding. Defaults to the PHPCS native default, which is 'utf-8' - * for PHPCS 3.x. - */ - public static function getEncoding($phpcsFile = null) - { - $default = 'utf-8'; - - if ($phpcsFile instanceof File) { - // Most reliable. - $encoding = self::getCommandLineData($phpcsFile, 'encoding'); - if ($encoding === null) { - $encoding = $default; - } - - return $encoding; - } - - // Less reliable. - $encoding = self::getConfigData('encoding'); - if ($encoding === null) { - $encoding = $default; - } - - return $encoding; - } - - /** - * Check whether the "--ignore-annotations" option is in effect. - * - * @since 1.0.0 - * @since 1.0.10 The `File` type declaration has been removed from the parameter declaration. - * - * @param \PHP_CodeSniffer\Files\File|null $phpcsFile Optional. The current file being processed. - * - * @return bool `TRUE` if annotations should be ignored, `FALSE` otherwise. - */ - public static function ignoreAnnotations($phpcsFile = null) - { - if (isset($phpcsFile) - && $phpcsFile instanceof File - && isset($phpcsFile->config->annotations) - ) { - return ! $phpcsFile->config->annotations; - } - - $annotations = Config::getConfigData('annotations'); - if (isset($annotations)) { - return ! $annotations; - } - - return false; - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/InvalidTokenArray.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/InvalidTokenArray.php deleted file mode 100644 index c3050b2..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/InvalidTokenArray.php +++ /dev/null @@ -1,44 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2020 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Exceptions; - -use PHPCSUtils\Exceptions\RuntimeException; - -/** - * Exception thrown when an non-existent token array is requested. - * - * @since 1.0.0 - */ -final class InvalidTokenArray extends RuntimeException -{ - - /** - * Create a new invalid token array exception with a standardized text. - * - * @since 1.0.0 - * - * @param string $name The name of the token array requested. - * - * @return \PHPCSUtils\Exceptions\InvalidTokenArray - */ - public static function create($name) - { - $stack = \debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS, 2); - - return new self( - \sprintf( - 'Call to undefined method %s::%s()', - $stack[1]['class'], - $name - ) - ); - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/LogicException.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/LogicException.php deleted file mode 100644 index 1bd890b..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/LogicException.php +++ /dev/null @@ -1,47 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2024 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Exceptions; - -use PHPCSUtils\Exceptions\RuntimeException; - -/** - * Exception for reporting a logic error. - * - * {@internal This exception should probably extend the PHP native `LogicException`, but - * that would inhibit the use of this exception, as replacing existing exceptions with this - * (better) one would then be a breaking change.} - * - * @since 1.1.0 - */ -final class LogicException extends RuntimeException -{ - - /** - * Create a new LogicException with a standardized start of the text. - * - * @param string $message Arbitrary message text. - * - * @return \PHPCSUtils\Exceptions\LogicException - */ - public static function create($message) - { - $stack = \debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS, 2); - - return new self( - \sprintf( - '%s::%s(): %s', - $stack[1]['class'], - $stack[1]['function'], - $message - ) - ); - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/MissingArgumentError.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/MissingArgumentError.php deleted file mode 100644 index 296342a..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/MissingArgumentError.php +++ /dev/null @@ -1,52 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2024 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Exceptions; - -use PHPCSUtils\Exceptions\RuntimeException; - -/** - * Exception for when a (conditionally) required parameter is not passed. - * - * {@internal This exception should probably extend the PHP native `ArgumentCountError`, but - * that would inhibit the use of this exception, as replacing existing exceptions with this - * (better) one would then be a breaking change.} - * - * @since 1.1.0 - */ -final class MissingArgumentError extends RuntimeException -{ - - /** - * Create a new MissingArgumentError exception with a standardized start of the text. - * - * @param int $position The argument position in the function signature. 1-based. - * @param string $name The argument name in the function signature. - * @param string $message Arbitrary message text, which should indicate under what - * conditions the parameter is required. - * - * @return \PHPCSUtils\Exceptions\MissingArgumentError - */ - public static function create($position, $name, $message) - { - $stack = \debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS, 2); - - return new self( - \sprintf( - '%s::%s(): Argument #%d (%s) is required %s.', - $stack[1]['class'], - $stack[1]['function'], - $position, - $name, - $message - ) - ); - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/OutOfBoundsStackPtr.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/OutOfBoundsStackPtr.php deleted file mode 100644 index 447a409..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/OutOfBoundsStackPtr.php +++ /dev/null @@ -1,51 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2024 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Exceptions; - -use PHPCSUtils\Exceptions\RuntimeException; - -/** - * Exception for when a stack pointer which doesn't exist in the current file is passed. - * - * {@internal This exception should probably extend the PHP native `OutOfBoundsException`, but - * that would inhibit the use of this exception, as replacing existing exceptions with this - * (better) one would then be a breaking change.} - * - * @since 1.1.0 - */ -final class OutOfBoundsStackPtr extends RuntimeException -{ - - /** - * Create a new OutOfBoundsStackPtr exception with a standardized text. - * - * @param int $position The argument position in the function signature. 1-based. - * @param string $name The argument name in the function signature. - * @param mixed $received The received stack pointer position. - * - * @return \PHPCSUtils\Exceptions\OutOfBoundsStackPtr - */ - public static function create($position, $name, $received) - { - $stack = \debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS, 2); - - return new self( - \sprintf( - '%s::%s(): Argument #%d (%s) must be a stack pointer which exists in the $phpcsFile object, %s given.', - $stack[1]['class'], - $stack[1]['function'], - $position, - $name, - \is_scalar($received) ? \var_export($received, true) : \gettype($received) - ) - ); - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/RuntimeException.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/RuntimeException.php deleted file mode 100644 index 2ea6d03..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/RuntimeException.php +++ /dev/null @@ -1,24 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2024 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Exceptions; - -use PHP_CodeSniffer\Exceptions\RuntimeException as PHPCSRuntimeException; - -/** - * Exception for reporting a runtime error. - * - * @phpcs:disable Universal.Classes.RequireFinalClass -- Deliberately not final. - * - * @since 1.1.0 - */ -class RuntimeException extends PHPCSRuntimeException -{ -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/TestFileNotFound.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/TestFileNotFound.php deleted file mode 100644 index de75ffc..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/TestFileNotFound.php +++ /dev/null @@ -1,47 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2020 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Exceptions; - -use BadMethodCallException; - -/** - * Exception thrown when the UtilityMethodTestCase::getTargetToken() method is run without a - * tokenized test case file being available. - * - * @since 1.0.0 - */ -final class TestFileNotFound extends BadMethodCallException -{ - - /** - * Create a new "test file not found" exception with a standardized text. - * - * @since 1.0.0 - * - * @param string $message The Exception message to throw. - * @param int $code The Exception code. - * @param \Throwable|null $previous The previous exception used for the exception chaining. - * - * @return void - */ - public function __construct($message = '', $code = 0, $previous = null) - { - if ($message === '') { - $message = \sprintf( - 'Failed to find a tokenized test case file.%sMake sure the UtilityMethodTestCase::setUpTestFile()' - . ' method has run before calling UtilityMethodTestCase::getTargetToken()', - \PHP_EOL - ); - } - - parent::__construct($message, $code, $previous); - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/TestMarkerNotFound.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/TestMarkerNotFound.php deleted file mode 100644 index 1c0bf17..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/TestMarkerNotFound.php +++ /dev/null @@ -1,43 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2020 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Exceptions; - -use OutOfBoundsException; - -/** - * Exception thrown when a delimiter comment can not be found in a test case file. - * - * @since 1.0.0 - */ -final class TestMarkerNotFound extends OutOfBoundsException -{ - - /** - * Create a new "test marker not found" exception with a standardized text. - * - * @since 1.0.0 - * - * @param string $marker The delimiter comment. - * @param string $file The file in which the delimiter was not found. - * - * @return \PHPCSUtils\Exceptions\TestMarkerNotFound - */ - public static function create($marker, $file) - { - return new self( - \sprintf( - 'Failed to find the test marker: %s in test case file %s', - $marker, - $file - ) - ); - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/TestTargetNotFound.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/TestTargetNotFound.php deleted file mode 100644 index 0a7dffa..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/TestTargetNotFound.php +++ /dev/null @@ -1,50 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2020 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Exceptions; - -use OutOfBoundsException; - -/** - * Exception thrown when a test target token can not be found in a test case file. - * - * @since 1.0.0 - */ -final class TestTargetNotFound extends OutOfBoundsException -{ - - /** - * Create a new "test target token not found" exception with a standardized text. - * - * @since 1.0.0 - * - * @param string $marker The delimiter comment. - * @param string|null $content The (optional) target token content. - * @param string $file The file in which the target token was not found. - * - * @return \PHPCSUtils\Exceptions\TestTargetNotFound - */ - public static function create($marker, $content, $file) - { - $contentPhrase = ''; - if (\is_string($content)) { - $contentPhrase = ' with token content: ' . $content; - } - - return new self( - \sprintf( - 'Failed to find test target token for comment string: %s%s in test case file: %s', - $marker, - $contentPhrase, - $file - ) - ); - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/TypeError.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/TypeError.php deleted file mode 100644 index 5944467..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/TypeError.php +++ /dev/null @@ -1,53 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2024 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Exceptions; - -use PHPCSUtils\Exceptions\RuntimeException; - -/** - * Exception for an invalid argument type passed. - * - * {@internal This exception should probably extend the PHP native `InvalidArgumentException`, or - * the PHP 7.0+ `TypeError`, but that would inhibit the use of this exception, as replacing existing - * exceptions with this (better) one would then be a breaking change.} - * - * @since 1.1.0 - */ -final class TypeError extends RuntimeException -{ - - /** - * Create a new TypeError exception with a standardized text. - * - * @param int $position The argument position in the function signature. 1-based. - * @param string $name The argument name in the function signature. - * @param string $expected The argument type expected as a string. - * @param mixed $received The actual argument received. - * - * @return \PHPCSUtils\Exceptions\TypeError - */ - public static function create($position, $name, $expected, $received) - { - $stack = \debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS, 2); - - return new self( - \sprintf( - '%s::%s(): Argument #%d (%s) must be of type %s, %s given.', - $stack[1]['class'], - $stack[1]['function'], - $position, - $name, - $expected, - \gettype($received) - ) - ); - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/UnexpectedTokenType.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/UnexpectedTokenType.php deleted file mode 100644 index 60a8e0d..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/UnexpectedTokenType.php +++ /dev/null @@ -1,53 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2024 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Exceptions; - -use PHPCSUtils\Exceptions\RuntimeException; - -/** - * Exception for when a stack pointer is passed which is not of the expected token type. - * - * {@internal This exception should probably extend the PHP native `InvalidArgumentException`, but - * that would inhibit the use of this exception, as replacing existing exceptions with this - * (better) one would then be a breaking change.} - * - * @since 1.1.0 - */ -final class UnexpectedTokenType extends RuntimeException -{ - - /** - * Create a new UnexpectedTokenType exception with a standardized text. - * - * @param int $position The argument position in the function signature. 1-based. - * @param string $name The argument name in the function signature. - * @param string $acceptedTypes Phrase listing the accepted token type(s). - * @param string $receivedType The received token type. - * - * @return \PHPCSUtils\Exceptions\UnexpectedTokenType - */ - public static function create($position, $name, $acceptedTypes, $receivedType) - { - $stack = \debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS, 2); - - return new self( - \sprintf( - '%s::%s(): Argument #%d (%s) must be of type %s; %s given.', - $stack[1]['class'], - $stack[1]['function'], - $position, - $name, - $acceptedTypes, - $receivedType - ) - ); - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/ValueError.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/ValueError.php deleted file mode 100644 index 4826bd9..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Exceptions/ValueError.php +++ /dev/null @@ -1,55 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2024 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Exceptions; - -use PHPCSUtils\Exceptions\RuntimeException; - -/** - * Exception for an invalid argument value passed. - * - * This exception should be used when the argument uses the correct type, but doesn't comply with - * predefined restrictions, like an empty string being passed, when only a non-empty string is accepted - * or a negative integer being passed when a positive integer is expected. - * - * {@internal This exception should probably extend the PHP native `InvalidArgumentException`, or the - * PHP 8.0+ `ValueError`, but that would inhibit the use of this exception, as replacing existing - * exceptions with this (better) one would then be a breaking change.} - * - * @since 1.1.0 - */ -final class ValueError extends RuntimeException -{ - - /** - * Create a new ValueError exception with a standardized start of the text. - * - * @param int $position The argument position in the function signature. 1-based. - * @param string $name The argument name in the function signature. - * @param string $message Arbitrary message text. - * - * @return \PHPCSUtils\Exceptions\ValueError - */ - public static function create($position, $name, $message) - { - $stack = \debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS, 2); - - return new self( - \sprintf( - '%s::%s(): The value of argument #%d (%s) %s.', - $stack[1]['class'], - $stack[1]['function'], - $position, - $name, - $message - ) - ); - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Fixers/SpacesFixer.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Fixers/SpacesFixer.php deleted file mode 100644 index 6787abb..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Fixers/SpacesFixer.php +++ /dev/null @@ -1,267 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2020 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Fixers; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Exceptions\LogicException; -use PHPCSUtils\Exceptions\OutOfBoundsStackPtr; -use PHPCSUtils\Exceptions\TypeError; -use PHPCSUtils\Exceptions\UnexpectedTokenType; -use PHPCSUtils\Exceptions\ValueError; -use PHPCSUtils\Utils\Numbers; - -/** - * Utility to check and, if necessary, fix the whitespace between two tokens. - * - * @since 1.0.0 - */ -final class SpacesFixer -{ - - /** - * Check the whitespace between two tokens, throw an error if it doesn't match the - * expected whitespace and if relevant, fix it. - * - * Note: - * - This method will not auto-fix if there is anything but whitespace between the two - * tokens. In that case, it will throw a non-fixable error/warning. - * - If `'newline'` is expected and _no_ new line is encountered, a new line will be added, - * but no assumptions will be made about the intended indentation of the code. - * This should be handled by a (separate) indentation sniff. - * - If `'newline'` is expected and multiple new lines are encountered, this will be accepted - * as valid. - * No assumptions are made about whether additional blank lines are allowed or not. - * If _exactly_ one line is desired, combine this fixer with the {@see \PHPCSUtils\Fixers\BlankLineFixer} - * (upcoming). - * - The fixer will not leave behind any trailing spaces on the original line when fixing - * to `'newline'`, but it will not correct _existing_ trailing spaces when there already - * is a new line in place. - * - This method can optionally record a metric for this check which will be displayed - * when the end-user requests the "info" report. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the token which should be used - * when reporting an issue. - * @param int $secondPtr The stack pointer to the second token. - * This token can be before or after the `$stackPtr`, - * but should only be separated from the `$stackPtr` - * by whitespace and/or comments/annotations. - * @param string|int $expectedSpaces Number of spaces to enforce. - * Valid values: - * - (int) Number of spaces. Must be `0` or more. - * - (string) `'newline'`. - * @param string $errorTemplate Error message template. - * Note: _The placeholder replacement phrase will be - * in human readable English and include "spaces"/ - * "new line", so no need to include that in the template._ - * This string should contain two placeholders: - * - `%1$s` = expected spaces phrase. - * - `%2$s` = found spaces phrase. - * @param string $errorCode A violation code unique to the sniff message. - * Defaults to `"Found"`. - * It is strongly recommended to change this if - * this fixer is used for different errors in the - * same sniff. - * @param string $errorType Optional. Whether to report the issue as a - * `"warning"` or an `"error"`. Defaults to `"error"`. - * @param int $errorSeverity Optional. The severity level for this message. - * A value of `0` will be converted into the default - * severity level. - * @param string $metricName Optional. The name of the metric to record. - * This can be a short description phrase. - * Leave empty to not record metrics. - * - * @return void - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $stackPtr or $secondPtr parameters are not integers. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the tokens passed do not exist in the $phpcsFile. - * @throws \PHPCSUtils\Exceptions\UnexpectedTokenType If the tokens passed are whitespace tokens. - * @throws \PHPCSUtils\Exceptions\ValueError If `$expectedSpaces` parameter is not a valid value. - * @throws \PHPCSUtils\Exceptions\LogicException If the tokens passed are separated by more than just - * empty (whitespace + comments/annotations) tokens. - */ - public static function checkAndFix( - File $phpcsFile, - $stackPtr, - $secondPtr, - $expectedSpaces, - $errorTemplate, - $errorCode = 'Found', - $errorType = 'error', - $errorSeverity = 0, - $metricName = '' - ) { - $tokens = $phpcsFile->getTokens(); - - /* - * Validate the received function input. - */ - - if (\is_int($stackPtr) === false) { - throw TypeError::create(2, '$stackPtr', 'integer', $stackPtr); - } - - if (\is_int($secondPtr) === false) { - throw TypeError::create(3, '$secondPtr', 'integer', $secondPtr); - } - - if (isset($tokens[$stackPtr]) === false) { - throw OutOfBoundsStackPtr::create(2, '$stackPtr', $stackPtr); - } - - if (isset($tokens[$secondPtr]) === false) { - throw OutOfBoundsStackPtr::create(3, '$secondPtr', $secondPtr); - } - - if ($tokens[$stackPtr]['code'] === \T_WHITESPACE) { - throw UnexpectedTokenType::create(2, '$stackPtr', 'any, except whitespace', 'T_WHITESPACE'); - } - - if ($tokens[$secondPtr]['code'] === \T_WHITESPACE) { - throw UnexpectedTokenType::create(3, '$secondPtr', 'any, except whitespace', 'T_WHITESPACE'); - } - - $expected = false; - if ($expectedSpaces === 'newline') { - $expected = $expectedSpaces; - } elseif (\is_int($expectedSpaces) === true && $expectedSpaces >= 0) { - $expected = $expectedSpaces; - } elseif (\is_string($expectedSpaces) === true && Numbers::isDecimalInt($expectedSpaces) === true) { - $expected = (int) $expectedSpaces; - } - - if ($expected === false) { - $message = \sprintf('should be either "newline", 0 or a positive integer; %s given', $expectedSpaces); - throw ValueError::create(4, '$expectedSpaces', $message); - } - - $ptrA = $stackPtr; - $ptrB = $secondPtr; - if ($stackPtr > $secondPtr) { - $ptrA = $secondPtr; - $ptrB = $stackPtr; - } - - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($ptrA + 1), null, true); - if ($nextNonEmpty !== false && $nextNonEmpty < $ptrB) { - throw LogicException::create( - 'The $stackPtr and the $secondPtr token must be adjacent tokens separated only' - . ' by whitespace and/or comments' - ); - } - - /* - * Determine how many spaces are between the two tokens. - */ - - $found = 0; - $foundPhrase = 'no spaces'; - if ($tokens[$ptrA]['line'] !== $tokens[$ptrB]['line']) { - $found = 'newline'; - $foundPhrase = 'a new line'; - if (($tokens[$ptrA]['line'] + 1) !== $tokens[$ptrB]['line']) { - $foundPhrase = 'multiple new lines'; - } - } elseif (($ptrA + 1) !== $ptrB) { - if ($tokens[($ptrA + 1)]['code'] === \T_WHITESPACE) { - $found = $tokens[($ptrA + 1)]['length']; - $foundPhrase = $found . (($found === 1) ? ' space' : ' spaces'); - } else { - $found = 'non-whitespace tokens'; - $foundPhrase = 'non-whitespace tokens'; - } - } - - if ($metricName !== '') { - $phpcsFile->recordMetric($stackPtr, $metricName, $foundPhrase); - } - - if ($found === $expected) { - return; - } - - /* - * Handle the violation message. - */ - - $expectedPhrase = 'no space'; - if ($expected === 'newline') { - $expectedPhrase = 'a new line'; - } elseif ($expected === 1) { - $expectedPhrase = $expected . ' space'; - } elseif ($expected > 1) { - $expectedPhrase = $expected . ' spaces'; - } - - $fixable = true; - $nextNonWhitespace = $phpcsFile->findNext(\T_WHITESPACE, ($ptrA + 1), null, true); - if ($nextNonWhitespace !== $ptrB) { - // Comment found between the tokens and we don't know where it should go, so don't auto-fix. - $fixable = false; - } - - if ($found === 'newline' - && $tokens[$ptrA]['code'] === \T_COMMENT - && \substr($tokens[$ptrA]['content'], -2) !== '*/' - ) { - /* - * $ptrA is a slash-style trailing comment, removing the new line would comment out - * the code, so don't auto-fix. - */ - $fixable = false; - } - - $method = 'add'; - $method .= ($fixable === true) ? 'Fixable' : ''; - $method .= ($errorType === 'error') ? 'Error' : 'Warning'; - - $recorded = $phpcsFile->$method( - $errorTemplate, - $stackPtr, - $errorCode, - [$expectedPhrase, $foundPhrase], - $errorSeverity - ); - - if ($fixable === false || $recorded === false) { - return; - } - - /* - * Fix the violation. - */ - - $phpcsFile->fixer->beginChangeset(); - - /* - * Remove existing whitespace. No need to check if it's whitespace as otherwise the fixer - * wouldn't have kicked in. - */ - for ($i = ($ptrA + 1); $i < $ptrB; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - // If necessary: add the correct amount whitespace. - if ($expected !== 0) { - if ($expected === 'newline') { - $phpcsFile->fixer->addContent($ptrA, $phpcsFile->eolChar); - } else { - $replacement = $tokens[$ptrA]['content'] . \str_repeat(' ', $expected); - $phpcsFile->fixer->replaceToken($ptrA, $replacement); - } - } - - $phpcsFile->fixer->endChangeset(); - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Internal/AttributeHelper.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Internal/AttributeHelper.php deleted file mode 100644 index fc57a9e..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Internal/AttributeHelper.php +++ /dev/null @@ -1,227 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2025 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Internal; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Exceptions\OutOfBoundsStackPtr; -use PHPCSUtils\Exceptions\TypeError; -use PHPCSUtils\Exceptions\UnexpectedTokenType; -use PHPCSUtils\Exceptions\ValueError; -use PHPCSUtils\Internal\Cache; -use PHPCSUtils\Tokens\Collections; -use PHPCSUtils\Utils\FunctionDeclarations; -use PHPCSUtils\Utils\Parentheses; -use PHPCSUtils\Utils\Scopes; - -/** - * Helper methods for PHP attributes. - * - * --------------------------------------------------------------------------------------------- - * This class is only intended for internal use by PHPCSUtils and is not part of the public API. - * This also means that it has no promise of backward compatibility. - * - * End-users should use the {@see \PHPCSUtils\Utils\Constants::getAttributeOpeners()}, - * {@see \PHPCSUtils\Utils\FunctionDeclarations::getAttributeOpeners()}, - * {@see \PHPCSUtils\Utils\ObjectDeclarations::getAttributeOpeners()}, - * or the {@see \PHPCSUtils\Utils\Variables::getAttributeOpeners()} methods instead. - * --------------------------------------------------------------------------------------------- - * - * @internal - * - * @since 1.2.0 - */ -final class AttributeHelper -{ - - /** - * Retrieve a list of stack pointers to the attribute openers for any attributes - * which apply to the current stack pointer. - * - * @since 1.2.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the token for a construct which can take an attribute. - * Currently, this means: - * - All OO declaration tokens; - * - All function declaration tokens; - * - T_VARIABLE tokens for function parameters and OO properties; - * - T_CONST tokens. - * @param string $type The expected type of construct. - * Should be one of the following values: - * 'constant', 'function', 'OO', 'variable'. - * - * @return array<int> - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $stackPtr parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\TypeError If the $type parameter is not a string. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the token passed does not exist in the $phpcsFile. - * @throws \PHPCSUtils\Exceptions\UnexpectedTokenType If the token passed is not of a token type accepted for $type. - * @throws \PHPCSUtils\Exceptions\ValueError For T_VARIABLE tokens: if the token passed does not point - * to an OO property token or a parameter in a function declaration. - */ - public static function getOpeners(File $phpcsFile, $stackPtr, $type) - { - $tokens = $phpcsFile->getTokens(); - - if (\is_int($stackPtr) === false) { - throw TypeError::create(2, '$stackPtr', 'integer', $stackPtr); - } - - if (isset($tokens[$stackPtr]) === false) { - throw OutOfBoundsStackPtr::create(2, '$stackPtr', $stackPtr); - } - - if (\is_string($type) === false) { - throw TypeError::create(3, '$type', 'string', $type); - } - - $isOOProperty = false; - $isFunctionParam = false; - switch ($type) { - case 'constant': - if ($tokens[$stackPtr]['code'] !== \T_CONST) { - throw UnexpectedTokenType::create(2, '$stackPtr', 'T_CONST', $tokens[$stackPtr]['type']); - } - break; - - case 'function': - if (isset(Collections::functionDeclarationTokens()[$tokens[$stackPtr]['code']]) === false) { - $acceptedTokens = 'T_FUNCTION, T_CLOSURE or T_FN'; - throw UnexpectedTokenType::create(2, '$stackPtr', $acceptedTokens, $tokens[$stackPtr]['type']); - } - break; - - case 'OO': - if (isset(Tokens::$ooScopeTokens[$tokens[$stackPtr]['code']]) === false) { - $acceptedTokens = 'T_CLASS, T_ANON_CLASS, T_INTERFACE, T_TRAIT or T_ENUM'; - throw UnexpectedTokenType::create(2, '$stackPtr', $acceptedTokens, $tokens[$stackPtr]['type']); - } - break; - - case 'variable': - if ($tokens[$stackPtr]['code'] !== \T_VARIABLE) { - throw UnexpectedTokenType::create(2, '$stackPtr', 'T_VARIABLE', $tokens[$stackPtr]['type']); - } - - $isOOProperty = Scopes::isOOProperty($phpcsFile, $stackPtr); - $isFunctionParam = Parentheses::lastOwnerIn($phpcsFile, $stackPtr, Collections::functionDeclarationTokens()); - - if ($isOOProperty === false && $isFunctionParam === false) { - $message = 'must be the pointer to an OO property or a parameter in a function declaration'; - throw ValueError::create(2, '$stackPtr', $message); - } - - // Allow for multi-property declarations. - if ($isOOProperty === true) { - do { - $prevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($tokens[$prevNonEmpty]['code'] !== \T_COMMA) { - break; - } - - $stackPtr = $phpcsFile->findPrevious(T_VARIABLE, ($prevNonEmpty - 1), null, false, null, true); - } while ($stackPtr !== false); - - if ($stackPtr === false) { - $message = 'must be the pointer to an OO property or a parameter in a function declaration'; - throw ValueError::create(2, '$stackPtr', $message); - } - } - break; - - default: - throw ValueError::create(3, '$type', 'must be one of the following: constant, function, OO, variable'); - } - - if (Cache::isCached($phpcsFile, __METHOD__, "$stackPtr-$type") === true) { - return Cache::get($phpcsFile, __METHOD__, "$stackPtr-$type"); - } - - $allowedBetween = Tokens::$emptyTokens; - switch ($type) { - case 'constant': - if (Scopes::isOOConstant($phpcsFile, $stackPtr) === true) { - $allowedBetween += Collections::constantModifierKeywords(); - } - break; - - case 'function': - $allowedBetween += [\T_STATIC => \T_STATIC]; - if (Scopes::isOOMethod($phpcsFile, $stackPtr) === true) { - $allowedBetween += Tokens::$methodPrefixes; - } - break; - - case 'OO': - if ($tokens[$stackPtr]['code'] === \T_CLASS) { - $allowedBetween += Collections::classModifierKeywords(); - } elseif ($tokens[$stackPtr]['code'] === \T_ANON_CLASS) { - $allowedBetween[\T_READONLY] = \T_READONLY; - } - break; - - case 'variable': - $allowedBetween += [\T_NULLABLE => \T_NULLABLE]; - if ($isOOProperty === true) { - $allowedBetween += Collections::propertyModifierKeywords(); - $allowedBetween += Collections::propertyTypeTokens(); - } elseif ($isFunctionParam !== false) { - $allowedBetween += Collections::parameterTypeTokens(); - $allowedBetween += [ - \T_BITWISE_AND => \T_BITWISE_AND, - \T_ELLIPSIS => \T_ELLIPSIS, - ]; - - if ($tokens[$isFunctionParam]['code'] === \T_FUNCTION - && Scopes::isOOMethod($phpcsFile, $isFunctionParam) === true - ) { - $functionName = FunctionDeclarations::getName($phpcsFile, $isFunctionParam); - if (empty($functionName) === false && \strtolower($functionName) === '__construct') { - $allowedBetween += Collections::propertyModifierKeywords(); - } - } - } - - break; - } - - $seenAttributes = []; - - for ($i = ($stackPtr - 1); $i >= 0; $i--) { - if (isset($tokens[$i]['comment_opener'])) { - // Skip over docblocks. - $i = $tokens[$i]['comment_opener']; - continue; - } - - if (isset($allowedBetween[$tokens[$i]['code']])) { - continue; - } - - if (isset($tokens[$i]['attribute_opener'])) { - $seenAttributes[] = $tokens[$i]['attribute_opener']; - $i = $tokens[$i]['attribute_opener']; - continue; - } - - // In all other cases, we've reached the end of our search. - break; - } - - if ($seenAttributes !== []) { - $seenAttributes = \array_reverse($seenAttributes); - } - - Cache::set($phpcsFile, __METHOD__, "$stackPtr-$type", $seenAttributes); - return $seenAttributes; - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Internal/Cache.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Internal/Cache.php deleted file mode 100644 index 2f7873f..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Internal/Cache.php +++ /dev/null @@ -1,218 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2020 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Internal; - -use PHP_CodeSniffer\Files\File; - -/** - * Results cache. - * - * Allows to cache the return value of utility functions which do a lot of token walking. - * Those type of utilities can significantly slow down file scanning, especially - * with large files and when multiple sniffs use the same utility function. - * - * Caching the results can significantly speed things up, though it can also eat memory, - * so use with care. - * - * Typical usage: - * ```php - * function doSomething() - * { - * if (Cache::isCached($phpcsFile, __METHOD__, $stackPtr) === true) { - * return Cache::get($phpcsFile, __METHOD__, $stackPtr); - * } - * - * // Do something. - * - * Cache::set($phpcsFile, __METHOD__, $stackPtr, $returnValue); - * return $returnValue; - * } - * ``` - * - * --------------------------------------------------------------------------------------------- - * This class is only intended for internal use by PHPCSUtils and is not part of the public API. - * This also means that it has no promise of backward compatibility. - * --------------------------------------------------------------------------------------------- - * - * @internal - * - * @since 1.0.0 - */ -final class Cache -{ - - /** - * Whether caching is enabled or not. - * - * Note: this switch is ONLY intended for use within test suites and should never - * be touched in any other circumstances! - * - * Don't forget to always turn the cache back on in a `tear_down()` method! - * - * @since 1.0.0 - * - * @var bool - */ - public static $enabled = true; - - /** - * Results cache. - * - * @since 1.0.0 - * - * @var array<int, array<string, array<string, array<string|int, mixed>>>> - * Format: $cache[$loop][$fileName][$key][$id] = mixed $value; - */ - private static $cache = []; - - /** - * Check whether a result has been cached for a certain utility function. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param string $key The key to identify a particular set of results. - * It is recommended to pass __METHOD__ to this parameter. - * @param int|string $id Unique identifier for these results. - * Generally speaking this will be the $stackPtr passed - * to the utility function, but it can also something else, - * like a serialization of args passed to a function or an - * md5 hash of an input. - * - * @return bool - */ - public static function isCached(File $phpcsFile, $key, $id) - { - if (self::$enabled === false) { - return false; - } - - $fileName = $phpcsFile->getFilename(); - $loop = $phpcsFile->fixer->enabled === true ? $phpcsFile->fixer->loops : 0; - - return isset(self::$cache[$loop][$fileName][$key]) - && \array_key_exists($id, self::$cache[$loop][$fileName][$key]); - } - - /** - * Retrieve a previously cached result for a certain utility function. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param string $key The key to identify a particular set of results. - * It is recommended to pass __METHOD__ to this parameter. - * @param int|string $id Unique identifier for these results. - * Generally speaking this will be the $stackPtr passed - * to the utility function, but it can also something else, - * like a serialization of args passed to a function or an - * md5 hash of an input. - * - * @return mixed - */ - public static function get(File $phpcsFile, $key, $id) - { - if (self::$enabled === false) { - return null; - } - - $fileName = $phpcsFile->getFilename(); - $loop = $phpcsFile->fixer->enabled === true ? $phpcsFile->fixer->loops : 0; - - if (isset(self::$cache[$loop][$fileName][$key]) - && \array_key_exists($id, self::$cache[$loop][$fileName][$key]) - ) { - return self::$cache[$loop][$fileName][$key][$id]; - } - - return null; - } - - /** - * Retrieve all previously cached results for a certain utility function and a certain file. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param string $key The key to identify a particular set of results. - * It is recommended to pass __METHOD__ to this parameter. - * - * @return array<string|int, mixed> - */ - public static function getForFile(File $phpcsFile, $key) - { - if (self::$enabled === false) { - return []; - } - - $fileName = $phpcsFile->getFilename(); - $loop = $phpcsFile->fixer->enabled === true ? $phpcsFile->fixer->loops : 0; - - if (isset(self::$cache[$loop][$fileName]) - && \array_key_exists($key, self::$cache[$loop][$fileName]) - ) { - return self::$cache[$loop][$fileName][$key]; - } - - return []; - } - - /** - * Cache the result for a certain utility function. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param string $key The key to identify a particular set of results. - * It is recommended to pass __METHOD__ to this parameter. - * @param int|string $id Unique identifier for these results. - * Generally speaking this will be the $stackPtr passed - * to the utility function, but it can also something else, - * like a serialization of args passed to a function or an - * md5 hash of an input. - * @param mixed $value An arbitrary value to write to the cache. - * - * @return mixed - */ - public static function set(File $phpcsFile, $key, $id, $value) - { - if (self::$enabled === false) { - return; - } - - $fileName = $phpcsFile->getFilename(); - $loop = $phpcsFile->fixer->enabled === true ? $phpcsFile->fixer->loops : 0; - - /* - * If this is a phpcbf run and we've reached the next loop, clear the cache - * of all previous loops to free up memory. - */ - if (isset(self::$cache[$loop]) === false - && empty(self::$cache) === false - ) { - self::clear(); - } - - self::$cache[$loop][$fileName][$key][$id] = $value; - } - - /** - * Clear the cache. - * - * @since 1.0.0 - * - * @return void - */ - public static function clear() - { - self::$cache = []; - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Internal/IsShortArrayOrList.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Internal/IsShortArrayOrList.php deleted file mode 100644 index 8fd22fd..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Internal/IsShortArrayOrList.php +++ /dev/null @@ -1,693 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2020 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Internal; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\BackCompat\Helper; -use PHPCSUtils\Exceptions\OutOfBoundsStackPtr; -use PHPCSUtils\Exceptions\TypeError; -use PHPCSUtils\Exceptions\UnexpectedTokenType; -use PHPCSUtils\Internal\Cache; -use PHPCSUtils\Internal\IsShortArrayOrListWithCache; -use PHPCSUtils\Internal\StableCollections; -use PHPCSUtils\Tokens\Collections; -use PHPCSUtils\Utils\Arrays; -use PHPCSUtils\Utils\Context; -use PHPCSUtils\Utils\Parentheses; -use PHPCSUtils\Utils\PassedParameters; - -/** - * Determination of short array vs short list vs square brackets. - * - * Short list versus short array determination is done based on the following: - * - For "outer" arrays/lists the determination is straight forward, the surrounding - * tokens give enough clues. This includes "outer" arrays/lists in `foreach()` conditions - * or in attributes. - * - For nested short arrays/lists, it's a whole different matter. - * - Both arrays as well as lists can be used when setting _keys_ in arrays and lists - * (with array access or as a parameter in a function call etc). - * For arrays, a nested array used as a key will always need array access. - * For lists, a plain array can be used as the key. (seriously ^@!%&#?) - * When used as a key though, the nesting is irrelevant and if there is nesting, the "outer" - * set of brackets will also be part of the key. - * - Both arrays as well as lists can be used as _values_ in arrays. - * - Only nested lists (or variables) can be used as _values_ in lists. - * - * --------------------------------------------------------------------------------------------- - * This class is only intended for internal use by PHPCSUtils and is not part of the public API. - * This also means that it has no promise of backward compatibility. - * - * End-users should use the {@see \PHPCSUtils\Utils\Arrays::isShortArray()} - * or the {@see \PHPCSUtils\Utils\Lists::isShortList()} method instead. - * --------------------------------------------------------------------------------------------- - * - * @internal - * - * @since 1.0.0 - */ -final class IsShortArrayOrList -{ - - /** - * Type annotation for short arrays. - * - * @since 1.0.0 - * - * @var string - */ - const SHORT_ARRAY = 'short array'; - - /** - * Type annotation for short lists. - * - * @since 1.0.0 - * - * @var string - */ - const SHORT_LIST = 'short list'; - - /** - * Type annotation for square brackets. - * - * @since 1.0.0 - * - * @var string - */ - const SQUARE_BRACKETS = 'square brackets'; - - /** - * Limit for the amount of items to retrieve from inside a nested array/list. - * - * @since 1.0.0 - * - * @var int - */ - const ITEM_LIMIT = 5; - - /** - * Limit for recursing over inner nested arrays/lists. - * - * @since 1.0.0 - * - * @var int - */ - const RECURSION_LIMIT = 3; - - /** - * The PHPCS file in which the current stackPtr was found. - * - * @since 1.0.0 - * - * @var \PHP_CodeSniffer\Files\File - */ - private $phpcsFile; - - /** - * The token stack from the current file. - * - * @since 1.0.0 - * - * @var array<int, array<string, mixed>> - */ - private $tokens; - - /** - * Stack pointer to the open bracket. - * - * @since 1.0.0 - * - * @var int - */ - private $opener; - - /** - * Stack pointer to the close bracket. - * - * @since 1.0.0 - * - * @var int - */ - private $closer; - - /** - * Stack pointer to the first non-empty token before the open bracket. - * - * @since 1.0.0 - * - * @var int - */ - private $beforeOpener; - - /** - * Stack pointer to the first non-empty token after the close bracket. - * - * @since 1.0.0 - * - * @var int|false Will be `false` if the close bracket is the last token in the file. - */ - private $afterCloser; - - /** - * Current PHPCS version being used. - * - * @since 1.0.0 - * - * @var string - */ - private $phpcsVersion; // @phpstan-ignore property.onlyWritten - - /** - * Tokens which can open a short array or short list (PHPCS cross-version compatible). - * - * @since 1.0.0 - * - * @var array<int|string, int|string> - */ - private $openBrackets; - - /** - * Constructor. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the short array opener token. - * - * @return void - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $stackPtr parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the token passed does not exist in the $phpcsFile. - * @throws \PHPCSUtils\Exceptions\UnexpectedTokenType If the token passed is not one of the accepted types. - */ - public function __construct(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $openBrackets = StableCollections::$shortArrayListOpenTokensBC; - - if (\is_int($stackPtr) === false) { - throw TypeError::create(2, '$stackPtr', 'integer', $stackPtr); - } - - if (isset($tokens[$stackPtr]) === false) { - throw OutOfBoundsStackPtr::create(2, '$stackPtr', $stackPtr); - } - - if (isset($openBrackets[$tokens[$stackPtr]['code']]) === false) { - $acceptedTokens = 'T_OPEN_SHORT_ARRAY or T_OPEN_SQUARE_BRACKET'; - throw UnexpectedTokenType::create(2, '$stackPtr', $acceptedTokens, $tokens[$stackPtr]['type']); - } - - $this->phpcsFile = $phpcsFile; - $this->tokens = $tokens; - $this->opener = $stackPtr; - - $this->closer = $stackPtr; - if (isset($this->tokens[$stackPtr]['bracket_closer'])) { - $this->closer = $this->tokens[$stackPtr]['bracket_closer']; - } - - $this->beforeOpener = $this->phpcsFile->findPrevious(Tokens::$emptyTokens, ($this->opener - 1), null, true); - $this->afterCloser = $this->phpcsFile->findNext(Tokens::$emptyTokens, ($this->closer + 1), null, true); - - $this->phpcsVersion = Helper::getVersion(); - $this->openBrackets = $openBrackets; - } - - /** - * Determine whether the bracket is a short array, short list or real square bracket. - * - * @since 1.0.0 - * - * @return string Either 'short array', 'short list' or 'square brackets'. - */ - public function solve() - { - if ($this->isSquareBracket() === true) { - return self::SQUARE_BRACKETS; - } - - if ($this->afterCloser === false) { - // Live coding. Short array until told differently. - return self::SHORT_ARRAY; - } - - // If the bracket closer is followed by an equals sign, it's always a short list. - if ($this->tokens[$this->afterCloser]['code'] === \T_EQUAL) { - return self::SHORT_LIST; - } - - // Attributes can only contain constant expressions, i.e. lists not allowed. - if (Context::inAttribute($this->phpcsFile, $this->opener) === true) { - return self::SHORT_ARRAY; - } - - $type = $this->isInForeach(); - if ($type !== false) { - return $type; - } - - /* - * Check if this can be a nested set of brackets used as a value. - * That's the only "confusing" syntax left. In all other cases, it will be a short array. - */ - $hasRiskyTokenBeforeOpener = false; - if (isset($this->openBrackets[$this->tokens[$this->beforeOpener]['code']]) === true - || $this->tokens[$this->beforeOpener]['code'] === \T_COMMA - || $this->tokens[$this->beforeOpener]['code'] === \T_DOUBLE_ARROW - ) { - $hasRiskyTokenBeforeOpener = true; - } - - $hasRiskyTokenAfterCloser = false; - if ($this->tokens[$this->afterCloser]['code'] === \T_COMMA - || $this->tokens[$this->afterCloser]['code'] === \T_CLOSE_SHORT_ARRAY - || $this->tokens[$this->afterCloser]['code'] === \T_CLOSE_SQUARE_BRACKET - ) { - $hasRiskyTokenAfterCloser = true; - } - - if ($hasRiskyTokenBeforeOpener === false || $hasRiskyTokenAfterCloser === false) { - return self::SHORT_ARRAY; - } - - /* - * Check if this is the first/last item in a "parent" set of brackets. - * If so, skip straight to the parent and determine the type of that, the type - * of the inner set of brackets will be the same (as all other options have - * already been eliminated). - */ - if (isset($this->openBrackets[$this->tokens[$this->beforeOpener]['code']]) === true) { - return IsShortArrayOrListWithCache::getType($this->phpcsFile, $this->beforeOpener); - } - - $nextEffectiveAfterCloser = $this->afterCloser; - if ($this->tokens[$this->afterCloser]['code'] === \T_COMMA) { - // Skip over potential trailing commas. - $nextEffectiveAfterCloser = $this->phpcsFile->findNext( - Tokens::$emptyTokens, - ($this->afterCloser + 1), - null, - true - ); - } - - if ($this->tokens[$nextEffectiveAfterCloser]['code'] === \T_CLOSE_SHORT_ARRAY - || $this->tokens[$nextEffectiveAfterCloser]['code'] === \T_CLOSE_SQUARE_BRACKET - ) { - return IsShortArrayOrListWithCache::getType($this->phpcsFile, $nextEffectiveAfterCloser); - } - - /* - * Okay, so as of here, we know this set of brackets is preceded by a comma or double arrow - * and followed by a comma. This is the only ambiguous syntax left. - */ - - /* - * Check if this could be a (nested) short list at all. - * A list must have at least one variable inside and can not be empty. - * An array, however, cannot contain empty items. - */ - $type = $this->walkInside($this->opener); - if ($type !== false) { - return $type; - } - - // Last resort: walk up in the file to see if we can find a set of parent brackets... - $type = $this->walkOutside(); - if ($type !== false) { - return $type; - } - - // If everything failed, this will be a short array (shouldn't be possible). - return self::SHORT_ARRAY; // @codeCoverageIgnore - } - - /** - * Check if the brackets are in actual fact real square brackets. - * - * @since 1.0.0 - * - * @return bool TRUE if these are real square brackets; FALSE otherwise. - */ - private function isSquareBracket() - { - if ($this->opener === $this->closer) { - // Parse error (unclosed bracket) or live coding. Bow out. - return true; - } - - // Check if this is a bracket we need to examine or a mistokenization. - return ($this->isShortArrayBracket() === false); - } - - /** - * Verify that the current set of brackets is not affected by known PHPCS cross-version tokenizer issues. - * - * List of previous tokenizer issues which affected the short array/short list tokenization for reference: - * - {@link https://github.com/squizlabs/PHP_CodeSniffer/issues/1284 PHPCS#1284} (PHPCS < 2.8.1) - * - {@link https://github.com/squizlabs/PHP_CodeSniffer/issues/1381 PHPCS#1381} (PHPCS < 2.9.0) - * - {@link https://github.com/squizlabs/PHP_CodeSniffer/issues/1971 PHPCS#1971} (PHPCS 2.8.0 - 3.2.3) - * - {@link https://github.com/squizlabs/PHP_CodeSniffer/pull/3013 PHPCS#3013} (PHPCS < 3.5.6) - * - {@link https://github.com/squizlabs/PHP_CodeSniffer/pull/3172 PHPCS#3172} (PHPCS < 3.6.0) - * - {@link https://github.com/squizlabs/PHP_CodeSniffer/pull/3632 PHPCS#3632} (PHPCS < 3.7.2) - * - * @since 1.0.0 - * - * @return bool TRUE if this is actually a short array bracket which needs to be examined, - * FALSE if it is an (incorrectly tokenized) square bracket. - */ - private function isShortArrayBracket() - { - if ($this->tokens[$this->opener]['code'] === \T_OPEN_SQUARE_BRACKET) { - // Currently there are no known issues with the tokenization in PHPCS. - return false; - } - - return true; - } - - /** - * Check is this set of brackets is used within a foreach expression. - * - * @since 1.0.0 - * - * @return string|false The determined type or FALSE if undetermined. - */ - private function isInForeach() - { - $inForeach = Context::inForeachCondition($this->phpcsFile, $this->opener); - if ($inForeach === false) { - return false; - } - - switch ($inForeach) { - case 'beforeAs': - if ($this->tokens[$this->afterCloser]['code'] === \T_AS) { - return self::SHORT_ARRAY; - } - - break; - - case 'afterAs': - if ($this->tokens[$this->afterCloser]['code'] === \T_CLOSE_PARENTHESIS) { - $owner = Parentheses::getOwner($this->phpcsFile, $this->afterCloser); - if ($owner !== false && $this->tokens[$owner]['code'] === \T_FOREACH) { - return self::SHORT_LIST; - } - } - - break; - } - - /* - * Everything else will be a nested set of brackets (provided we're talking valid PHP), - * so disregard as it can not be determined yet. - */ - return false; - } - - /** - * Walk the first part of the contents between the brackets to see if we can determine if this - * is a short array or short list based on its contents. - * - * Short lists can only have another (nested) list or variable assignments, including property assignments - * and array index assignment, as the value inside the brackets. - * - * This won't walk the complete contents as that could be a huge performance drain. Just the first x items. - * - * @since 1.0.0 - * - * @param int $opener The position of the short array open bracket token. - * @param int $recursions Optional. Keep track of how often we've recursed into this methd. - * Prevent infinite loops for extremely deeply nested arrays. - * Defaults to 0. - * - * @return string|false The determined type or FALSE if undetermined. - */ - private function walkInside($opener, $recursions = 0) - { - // Get the first 5 "parameters" and ignore the "is short array" check. - $items = PassedParameters::getParameters($this->phpcsFile, $opener, self::ITEM_LIMIT, true); - - if ($items === []) { - /* - * A list can not be empty, so this must be an array, however as this is a nested - * set of brackets, let the outside brackets be the decider as it may be - * a coding error which a sniff needs to flag. - */ - return false; - } - - // Make sure vars assigned by reference are handled correctly. - $skip = Tokens::$emptyTokens; - $skip[] = \T_BITWISE_AND; - - $skipNames = Collections::namespacedNameTokens() + Collections::ooHierarchyKeywords(); - - foreach ($items as $item) { - /* - * If we encounter a completely empty item, this must be a short list as arrays cannot contain - * empty items. - */ - if ($item['clean'] === '') { - return self::SHORT_LIST; - } - - /* - * If the "value" part of the entry doesn't start with a variable, a (nested) short list/array, - * or a static property assignment, we know for sure that the outside brackets will be an array. - */ - $arrow = Arrays::getDoubleArrowPtr($this->phpcsFile, $item['start'], $item['end']); - if ($arrow === false) { - $firstNonEmptyInValue = $this->phpcsFile->findNext($skip, $item['start'], ($item['end'] + 1), true); - } else { - $firstNonEmptyInValue = $this->phpcsFile->findNext($skip, ($arrow + 1), ($item['end'] + 1), true); - } - - if ($this->tokens[$firstNonEmptyInValue]['code'] !== \T_VARIABLE - && isset(Collections::namespacedNameTokens()[$this->tokens[$firstNonEmptyInValue]['code']]) === false - && isset(Collections::ooHierarchyKeywords()[$this->tokens[$firstNonEmptyInValue]['code']]) === false - && isset($this->openBrackets[$this->tokens[$firstNonEmptyInValue]['code']]) === false - ) { - return self::SHORT_ARRAY; - } - - /* - * Check if this is a potential list assignment to a static variable. - * If not, again, we can be sure it will be a short array. - */ - if (isset(Collections::namespacedNameTokens()[$this->tokens[$firstNonEmptyInValue]['code']]) === true - || isset(Collections::ooHierarchyKeywords()[$this->tokens[$firstNonEmptyInValue]['code']]) === true - ) { - $nextAfter = $this->phpcsFile->findNext($skipNames, ($firstNonEmptyInValue + 1), null, true); - - if ($this->tokens[$nextAfter]['code'] !== \T_DOUBLE_COLON) { - return self::SHORT_ARRAY; - } else { - /* - * Double colon, so make sure there is a variable after it. - * If not, it's constant or function call, i.e. a short array. - */ - $nextNextAfter = $this->phpcsFile->findNext(Tokens::$emptyTokens, ($nextAfter + 1), null, true); - if ($this->tokens[$nextNextAfter]['code'] !== \T_VARIABLE) { - return self::SHORT_ARRAY; - } - } - - continue; - } - - if (isset($this->openBrackets[$this->tokens[$firstNonEmptyInValue]['code']]) === true) { - /* - * If the "value" part starts with an open bracket, but has other tokens after it, the current, - * outside set of brackets will always be an array (the brackets in the value can still be both, - * but that's not the concern of the current determination). - */ - $lastNonEmptyInValue = $this->phpcsFile->findPrevious( - Tokens::$emptyTokens, - $item['end'], - $item['start'], - true - ); - if (isset($this->tokens[$firstNonEmptyInValue]['bracket_closer']) === true - && $this->tokens[$firstNonEmptyInValue]['bracket_closer'] !== $lastNonEmptyInValue - ) { - return self::SHORT_ARRAY; - } - - /* - * Recursively check the inner set of brackets for contents indicating this is not a short list. - */ - if ($recursions < self::RECURSION_LIMIT) { - $innerType = $this->walkInside($firstNonEmptyInValue, ($recursions + 1)); - if ($innerType !== false) { - return $innerType; - } - } - } - } - - // Undetermined. - return false; - } - - /** - * Walk up in the file to try and find an "outer" set of brackets for an ambiguous, potentially - * nested set of brackets. - * - * This should really be the last resort, if all else fails to determine the type of the brackets. - * - * @since 1.0.0 - * - * @return string|false The determined type or FALSE if undetermined. - */ - private function walkOutside() - { - $stopPoints = Collections::phpOpenTags(); - $stopPoints[\T_SEMICOLON] = \T_SEMICOLON; - - for ($i = ($this->opener - 1); $i >= 0; $i--) { - // Skip over block comments (just in case). - if ($this->tokens[$i]['code'] === \T_DOC_COMMENT_CLOSE_TAG) { - $i = $this->tokens[$i]['comment_opener']; - continue; - } - - if (isset(Tokens::$emptyTokens[$this->tokens[$i]['code']]) === true) { - continue; - } - - // Stop on an end of statement. - if (isset($stopPoints[$this->tokens[$i]['code']]) === true) { - // End of previous statement or start of document. - return self::SHORT_ARRAY; - } - - if (isset($this->tokens[$i]['scope_opener'], $this->tokens[$i]['scope_closer']) === true) { - if ($i === $this->tokens[$i]['scope_opener'] - && $this->tokens[$i]['scope_closer'] > $this->closer - ) { - // Found a scope wrapping this set of brackets before finding a outer set of brackets. - // This will be a short array. - return self::SHORT_ARRAY; - } - - if ($i === $this->tokens[$i]['scope_closer'] - && isset($this->tokens[$i]['scope_condition']) === true - ) { - $i = $this->tokens[$i]['scope_condition']; - continue; - } - - // Scope opener without scope condition shouldn't be possible, but just in case. - // @codeCoverageIgnoreStart - $i = $this->tokens[$i]['scope_opener']; - continue; - // @codeCoverageIgnoreEnd - } - - if (isset($this->tokens[$i]['parenthesis_opener'], $this->tokens[$i]['parenthesis_closer']) === true) { - if ($i === $this->tokens[$i]['parenthesis_opener'] - && $this->tokens[$i]['parenthesis_closer'] > $this->closer - ) { - $beforeParensOpen = $this->phpcsFile->findPrevious(Tokens::$emptyTokens, ($i - 1), null, true); - if ($this->tokens[$beforeParensOpen]['code'] === \T_LIST) { - // Parse error, mixing long and short list, but that's not our concern. - return self::SHORT_LIST; - } - - // Found parentheses wrapping this set of brackets before finding a outer set of brackets. - // This will be a short array. - return self::SHORT_ARRAY; - } - - if ($i === $this->tokens[$i]['parenthesis_closer']) { - if (isset($this->tokens[$i]['parenthesis_owner']) === true) { - $i = $this->tokens[$i]['parenthesis_owner']; - continue; - } - } - - // Parenthesis closer without owner (function call and such). - $i = $this->tokens[$i]['parenthesis_opener']; - continue; - } - - /* - * Skip over attributes. - * No special handling needed, brackets within attributes won't reach this - * method as they are already handled within the solve() method. - */ - if (isset($this->tokens[$i]['attribute_opener'], $this->tokens[$i]['attribute_closer']) === true - && $i === $this->tokens[$i]['attribute_closer'] - ) { - $i = $this->tokens[$i]['attribute_opener']; - continue; - } - - /* - * This is a close bracket, but it's not the outer wrapper. - * As we skip over parentheses and curlies above, we *know* this will be a - * set of brackets at the same bracket "nesting level" as the set we are examining. - */ - if (isset($this->tokens[$i]['bracket_opener'], $this->tokens[$i]['bracket_closer']) === true - && $i === $this->tokens[$i]['bracket_closer'] - ) { - /* - * Now, if the set of brackets follows the same code pattern (comma or double arrow before, - * comma after), this will be an adjacent set of potentially nested brackets. - * If so, check if the type of the previous set of brackets has already been determined - * as adjacent sets of brackets will have the same type. - */ - $adjOpener = $this->tokens[$i]['bracket_opener']; - $prevNonEmpty = $this->phpcsFile->findPrevious(Tokens::$emptyTokens, ($adjOpener - 1), null, true); - $nextNonEmpty = $this->phpcsFile->findNext(Tokens::$emptyTokens, ($i + 1), null, true); - - if ($this->tokens[$prevNonEmpty]['code'] === $this->tokens[$this->beforeOpener]['code'] - && $this->tokens[$nextNonEmpty]['code'] === $this->tokens[$this->afterCloser]['code'] - && Cache::isCached($this->phpcsFile, IsShortArrayOrListWithCache::CACHE_KEY, $adjOpener) === true - ) { - return Cache::get($this->phpcsFile, IsShortArrayOrListWithCache::CACHE_KEY, $adjOpener); - } - - // If not, skip over it. - $i = $this->tokens[$i]['bracket_opener']; - continue; - } - - // Open bracket. - if (isset($this->openBrackets[$this->tokens[$i]['code']]) === true) { - if (isset($this->tokens[$i]['bracket_closer']) === false - || $this->tokens[$i]['code'] === \T_OPEN_SQUARE_BRACKET - ) { - /* - * If the type of the unclosed "outer" brackets cannot be determined or - * they are identified as plain square brackets, the inner brackets - * we are examining should be regarded as a short array. - */ - return self::SHORT_ARRAY; - } - - if ($this->tokens[$i]['bracket_closer'] > $this->closer) { - // This is one we have to examine further as an outer set of brackets. - // As all the other checks have already failed to get a result, we know that - // whatever the outer set is, the inner set will be the same. - return IsShortArrayOrListWithCache::getType($this->phpcsFile, $i); - } - } - } - - // Reached the start of the file without finding an outer set of brackets. - // Shouldn't be possible, but just in case. - return false; // @codeCoverageIgnore - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Internal/IsShortArrayOrListWithCache.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Internal/IsShortArrayOrListWithCache.php deleted file mode 100644 index b4772bb..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Internal/IsShortArrayOrListWithCache.php +++ /dev/null @@ -1,269 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2020 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Internal; - -use PHP_CodeSniffer\Files\File; -use PHPCSUtils\Internal\Cache; -use PHPCSUtils\Internal\IsShortArrayOrList; -use PHPCSUtils\Internal\StableCollections; - -/** - * Determination of short array vs short list vs square brackets. - * - * Uses caching of previous results to mitigate performance issues. - * - * --------------------------------------------------------------------------------------------- - * This class is only intended for internal use by PHPCSUtils and is not part of the public API. - * This also means that it has no promise of backward compatibility. - * - * End-users should use the {@see \PHPCSUtils\Utils\Arrays::isShortArray()} - * or the {@see \PHPCSUtils\Utils\Lists::isShortList()} method instead. - * --------------------------------------------------------------------------------------------- - * - * @internal - * - * @since 1.0.0 - */ -final class IsShortArrayOrListWithCache -{ - - /** - * Key used for caching the return value of the short array/short list determination. - * - * @since 1.0.0 - * - * @var string - */ - const CACHE_KEY = __CLASS__; - - /** - * The PHPCS file in which the current stackPtr was found. - * - * @since 1.0.0 - * - * @var \PHP_CodeSniffer\Files\File - */ - private $phpcsFile; - - /** - * The token stack from the current file. - * - * @since 1.0.0 - * - * @var array<int, array<string, mixed>> - */ - private $tokens; - - /** - * The current stack pointer. - * - * @since 1.0.0 - * - * @var int - */ - private $stackPtr; - - /** - * Stack pointer to the open bracket. - * - * @since 1.0.0 - * - * @var int - */ - private $opener; - - /** - * Determine whether a T_OPEN/CLOSE_SHORT_ARRAY token is a short array construct - * and not a short list. - * - * This method also accepts `T_OPEN/CLOSE_SQUARE_BRACKET` tokens to allow it to be - * PHPCS cross-version compatible as the short array tokenizing has been plagued by - * a number of bugs over time. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the short array bracket token. - * - * @return bool `TRUE` if the token passed is the open/close bracket of a short array. - * `FALSE` if the token is a short list bracket, a plain square bracket - * or not one of the accepted tokens. - */ - public static function isShortArray(File $phpcsFile, $stackPtr) - { - return (self::getType($phpcsFile, $stackPtr) === IsShortArrayOrList::SHORT_ARRAY); - } - - /** - * Determine whether a T_OPEN/CLOSE_SHORT_ARRAY token is a short list construct - * in contrast to a short array. - * - * This method also accepts `T_OPEN/CLOSE_SQUARE_BRACKET` tokens to allow it to be - * PHPCS cross-version compatible as the short array tokenizing has been plagued by - * a number of bugs over time, which affects the short list determination. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the short array bracket token. - * - * @return bool `TRUE` if the token passed is the open/close bracket of a short list. - * `FALSE` if the token is a short array bracket or plain square bracket - * or not one of the accepted tokens. - */ - public static function isShortList(File $phpcsFile, $stackPtr) - { - return (self::getType($phpcsFile, $stackPtr) === IsShortArrayOrList::SHORT_LIST); - } - - /** - * Determine whether a T_OPEN/CLOSE_SHORT_ARRAY token is a short array or short list construct. - * - * This method also accepts `T_OPEN/CLOSE_SQUARE_BRACKET` tokens to allow it to be - * PHPCS cross-version compatible as the short array tokenizing has been plagued by - * a number of bugs over time, which affects the short list determination. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the short array bracket token. - * - * @return string|false The type of construct this bracket was determined to be. - * Either 'short array', 'short list' or 'square brackets'. - * Or FALSE if this was not a bracket token. - */ - public static function getType(File $phpcsFile, $stackPtr) - { - return (new self($phpcsFile, $stackPtr))->process(); - } - - /** - * Constructor. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the short array bracket token. - * - * @return void - */ - private function __construct(File $phpcsFile, $stackPtr) - { - $this->phpcsFile = $phpcsFile; - $this->tokens = $phpcsFile->getTokens(); - $this->stackPtr = $stackPtr; - } - - /** - * Determine whether a T_[OPEN|CLOSE}_[SHORT_ARRAY|SQUARE_BRACKET] token is a short array - * or short list construct using previously cached results whenever possible. - * - * @since 1.0.0 - * - * @return string|false The type of construct this bracket was determined to be. - * Either 'short array', 'short list' or 'square brackets'. - * Or FALSE is this was not a bracket token. - */ - private function process() - { - if ($this->isValidStackPtr() === false) { - return false; - } - - $this->opener = $this->getOpener(); - - /* - * Check the cache in case we've seen this token before. - */ - $type = $this->getFromCache(); - if ($type !== false) { - return $type; - } - - /* - * If we've not seen the token before, try and solve it and cache the results. - * - * Make sure to safeguard against unopened/unclosed square brackets (parse error), - * which should always be regarded as real square brackets. - */ - $type = IsShortArrayOrList::SQUARE_BRACKETS; - if (isset($this->tokens[$this->stackPtr]['bracket_opener'], $this->tokens[$this->stackPtr]['bracket_closer'])) { - $solver = new IsShortArrayOrList($this->phpcsFile, $this->opener); - $type = $solver->solve(); - } - - $this->updateCache($type); - - return $type; - } - - /** - * Verify the passed token could potentially be a short array or short list token. - * - * @since 1.0.0 - * - * @return bool - */ - private function isValidStackPtr() - { - return (isset($this->tokens[$this->stackPtr]) === true - && isset(StableCollections::$shortArrayListTokensBC[$this->tokens[$this->stackPtr]['code']]) === true); - } - - /** - * Get the stack pointer to the short array/list opener. - * - * @since 1.0.0 - * - * @return int - */ - private function getOpener() - { - $opener = $this->stackPtr; - if (isset($this->tokens[$this->stackPtr]['bracket_opener'])) { - $opener = $this->tokens[$this->stackPtr]['bracket_opener']; - } - - return $opener; - } - - /** - * Retrieve the bracket "type" of a token from the cache. - * - * @since 1.0.0 - * - * @return string|false The previously determined type (which could be an empty string) - * or FALSE if no cache entry was found for this token. - */ - private function getFromCache() - { - if (Cache::isCached($this->phpcsFile, self::CACHE_KEY, $this->opener) === true) { - return Cache::get($this->phpcsFile, self::CACHE_KEY, $this->opener); - } - - return false; - } - - /** - * Update the cache with information about a particular bracket token. - * - * @since 1.0.0 - * - * @param string $type The type this bracket has been determined to be. - * Either 'short array', 'short list' or 'square brackets'. - * - * @return void - */ - private function updateCache($type) - { - Cache::set($this->phpcsFile, self::CACHE_KEY, $this->opener, $type); - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Internal/NoFileCache.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Internal/NoFileCache.php deleted file mode 100644 index 2f7a247..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Internal/NoFileCache.php +++ /dev/null @@ -1,164 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2020 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Internal; - -/** - * Cache for function results which are not directly related to a $phpcsFile. - * - * Allows to cache the return value of utility functions which don't use PHPCS File objects. - * - * Caching the results can significantly speed things up, though it can also eat memory, - * so use with care. - * - * Typical usage: - * ```php - * function doSomething() - * { - * if (NoFileCache::isCached(__METHOD__, $paramHash) === true) { - * return NoFileCache::get(__METHOD__, $paramHash); - * } - * - * // Do something. - * - * NoFileCache::set(__METHOD__, $paramHash, $returnValue); - * return $returnValue; - * } - * ``` - * - * --------------------------------------------------------------------------------------------- - * This class is only intended for internal use by PHPCSUtils and is not part of the public API. - * This also means that it has no promise of backward compatibility. - * --------------------------------------------------------------------------------------------- - * - * @internal - * - * @since 1.0.0 - */ -final class NoFileCache -{ - - /** - * Whether caching is enabled or not. - * - * Note: this switch is ONLY intended for use within test suites and should never - * be touched in any other circumstances! - * - * Don't forget to always turn the cache back on in a `tear_down()` method! - * - * @since 1.0.0 - * - * @var bool - */ - public static $enabled = true; - - /** - * Results cache. - * - * @since 1.0.0 - * - * @var array<string, array<int|string, mixed>> Format: $cache[$key][$id] = mixed $value; - */ - private static $cache = []; - - /** - * Check whether a result has been cached for a certain utility function. - * - * @since 1.0.0 - * - * @param string $key The key to identify a particular set of results. - * It is recommended to pass `__METHOD__` to this parameter. - * @param int|string $id Unique identifier for these results. - * It is recommended for this to be a serialization of arguments passed - * to the function or an md5 hash of an input. - * - * @return bool - */ - public static function isCached($key, $id) - { - return self::$enabled === true && isset(self::$cache[$key]) && \array_key_exists($id, self::$cache[$key]); - } - - /** - * Retrieve a previously cached result for a certain utility function. - * - * @since 1.0.0 - * - * @param string $key The key to identify a particular set of results. - * It is recommended to pass `__METHOD__` to this parameter. - * @param int|string $id Unique identifier for these results. - * It is recommended for this to be a serialization of arguments passed - * to the function or an md5 hash of an input. - * - * @return mixed - */ - public static function get($key, $id) - { - if (self::$enabled === true && isset(self::$cache[$key]) && \array_key_exists($id, self::$cache[$key])) { - return self::$cache[$key][$id]; - } - - return null; - } - - /** - * Retrieve all previously cached results for a certain utility function. - * - * @since 1.0.0 - * - * @param string $key The key to identify a particular set of results. - * It is recommended to pass `__METHOD__` to this parameter. - * - * @return array<int|string, mixed> - */ - public static function getForKey($key) - { - if (self::$enabled === true && \array_key_exists($key, self::$cache)) { - return self::$cache[$key]; - } - - return []; - } - - /** - * Cache the result for a certain utility function. - * - * @since 1.0.0 - * - * @param string $key The key to identify a particular set of results. - * It is recommended to pass `__METHOD__` to this parameter. - * @param int|string $id Unique identifier for these results. - * It is recommended for this to be a serialization of arguments passed - * to the function or an md5 hash of an input. - * @param mixed $value An arbitrary value to write to the cache. - * - * @return mixed - */ - public static function set($key, $id, $value) - { - if (self::$enabled === false) { - return; - } - - self::$cache[$key][$id] = $value; - } - - /** - * Clear the cache. - * - * @since 1.0.0 - * - * @return void - */ - public static function clear() - { - self::$cache = []; - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Internal/StableCollections.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Internal/StableCollections.php deleted file mode 100644 index 593392d..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Internal/StableCollections.php +++ /dev/null @@ -1,75 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2020 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Internal; - -/** - * Stable collections of related tokens. - * - * The {@see \PHPCSUtils\Tokens\Collections} class contains a range of token collections for use by sniffs, - * some of which may change depending on the availability of a token in PHP/PHPCS. - * The contents of token collections may also vary based on the PHPCS version to allow for optimized sniffing. - * - * The functionality _within_ PHPCSUtils, however, should be stable and reliably testable, so for internal - * use, the most volatile token arrays are replicated here in stable versions to be used by the PHPCSUtils - * functions (and tests) internally. - * - * --------------------------------------------------------------------------------------------- - * This class is only intended for internal use by PHPCSUtils and is not part of the public API. - * This also means that it has no promise of backward compatibility. - * - * End-users should use the methods in the {@see \PHPCSUtils\Tokens\Collections} class instead. - * --------------------------------------------------------------------------------------------- - * - * @internal - * - * @since 1.0.0 - */ -final class StableCollections -{ - - /** - * Tokens which can open a short array or short list (PHPCS cross-version compatible). - * - * This array will ALWAYS include the `T_OPEN_SQUARE_BRACKET` token to allow for handling - * intermittent tokenizer issues related to the retokenization to `T_OPEN_SHORT_ARRAY`. - * - * @internal - * @ignore This array is only for internal use by PHPCSUtils and is not part of the public API. - * - * @since 1.0.2 - * - * @var array<int|string, int|string> - */ - public static $shortArrayListOpenTokensBC = [ - \T_OPEN_SHORT_ARRAY => \T_OPEN_SHORT_ARRAY, - \T_OPEN_SQUARE_BRACKET => \T_OPEN_SQUARE_BRACKET, - ]; - - /** - * Tokens which are used for short lists. - * - * This array will ALWAYS include the `T_OPEN_SQUARE_BRACKET` and `T_CLOSE_SQUARE_BRACKET` tokens - * to allow for handling intermittent tokenizer issues related to the retokenization to `T_OPEN_SHORT_ARRAY`. - * - * @internal - * @ignore This array is only for internal use by PHPCSUtils and is not part of the public API. - * - * @since 1.0.2 - * - * @var array<int|string, int|string> - */ - public static $shortArrayListTokensBC = [ - \T_OPEN_SHORT_ARRAY => \T_OPEN_SHORT_ARRAY, - \T_CLOSE_SHORT_ARRAY => \T_CLOSE_SHORT_ARRAY, - \T_OPEN_SQUARE_BRACKET => \T_OPEN_SQUARE_BRACKET, - \T_CLOSE_SQUARE_BRACKET => \T_CLOSE_SQUARE_BRACKET, - ]; -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/TestUtils/ConfigDouble.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/TestUtils/ConfigDouble.php deleted file mode 100644 index 1dcf06a..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/TestUtils/ConfigDouble.php +++ /dev/null @@ -1,249 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2024 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\TestUtils; - -use PHP_CodeSniffer\Config; -use PHPCSUtils\BackCompat\Helper; -use ReflectionProperty; - -/** - * Config class for use in the tests. - * - * The PHP_CodeSniffer Config class contains a number of static properties. - * As the value of these static properties will be retained between instantiations of the class, - * config values set in one test can influence the results for another test, which makes tests unstable. - * - * This class is a "double" of the Config class which prevents this from happening. - * In _most_ cases, tests should be using this class instead of the "normal" Config, - * with the exception of select tests for the PHPCS Config class itself. - * - * @since 1.1.0 - */ -final class ConfigDouble extends Config -{ - - /** - * The PHPCS version the tests are being run on. - * - * @since 1.1.0 - * - * @var string - */ - private $phpcsVersion = '0'; - - /** - * Whether or not the setting of a standard should be skipped. - * - * @since 1.1.0 - * - * @var bool - */ - private $skipSettingStandard = false; - - /** - * Creates a clean Config object and populates it with command line values. - * - * @since 1.1.0 - * - * @param array<string> $cliArgs An array of values gathered from CLI args. - * @param bool $skipSettingStandard Whether to skip setting a standard to prevent - * the Config class trying to auto-discover a ruleset file. - * Should only be set to `true` for tests which actually test - * the ruleset auto-discovery. - * Note: there is no need to set this to `true` when a standard - * is being passed via the `$cliArgs`. Those settings will always - * respected. - * Defaults to `false`. Will result in the standard being set - * to "PSR1" if not provided via `$cliArgs`. - * @param bool $skipSettingReportWidth Whether to skip setting a report-width to prevent - * the Config class trying to auto-discover the screen width. - * Should only be set to `true` for tests which actually test - * the screen width auto-discovery. - * Note: there is no need to set this to `true` when a report-width - * is being passed via the `$cliArgs`. Those settings will always - * respected. - * Defaults to `false`. Will result in the reportWidth being set - * to "80" if not provided via `$cliArgs`. - * - * @return void - */ - public function __construct(array $cliArgs = [], $skipSettingStandard = false, $skipSettingReportWidth = false) - { - $this->skipSettingStandard = $skipSettingStandard; - $this->phpcsVersion = Helper::getVersion(); - - $this->resetSelectProperties(); - $this->preventReadingCodeSnifferConfFile(); - - parent::__construct($cliArgs); - - if ($skipSettingReportWidth !== true) { - $this->preventAutoDiscoveryScreenWidth(); - } - } - - /** - * Ensures the static properties in the Config class are reset to their default values - * when the ConfigDouble is no longer used. - * - * @since 1.1.0 - * - * @return void - */ - public function __destruct() - { - $this->setStaticConfigProperty('overriddenDefaults', []); - $this->setStaticConfigProperty('executablePaths', []); - $this->setStaticConfigProperty('configData', null); - $this->setStaticConfigProperty('configDataFile', null); - } - - /** - * Sets the command line values and optionally prevents a file system search for a custom ruleset. - * - * {@internal Note: `array` type declaration can't be added as the parent class does not have a type declaration - * for the parameter in the original method.} - * - * @since 1.1.0 - * - * @param array<string> $args An array of command line arguments to set. - * - * @return void - */ - public function setCommandLineValues($args) - { - parent::setCommandLineValues($args); - - if ($this->skipSettingStandard !== true) { - $this->preventSearchingForRuleset(); - } - } - - /** - * Reset a few properties on the Config class to their default values. - * - * @since 1.1.0 - * - * @return void - */ - private function resetSelectProperties() - { - $this->setStaticConfigProperty('overriddenDefaults', []); - $this->setStaticConfigProperty('executablePaths', []); - } - - /** - * Prevent the values in a potentially available user-specific `CodeSniffer.conf` file - * from influencing the tests. - * - * This also prevents some file system calls which can influence the test runtime. - * - * @since 1.1.0 - * - * @return void - */ - private function preventReadingCodeSnifferConfFile() - { - $this->setStaticConfigProperty('configData', []); - $this->setStaticConfigProperty('configDataFile', ''); - } - - /** - * Prevent searching for a custom ruleset by setting a standard, but only if the test - * being run doesn't set a standard itself. - * - * This also prevents some file system calls which can influence the test runtime. - * - * The standard being set is the smallest one available so the ruleset initialization - * will be the fastest possible. - * - * @since 1.1.0 - * - * @return void - */ - private function preventSearchingForRuleset() - { - $overriddenDefaults = $this->getStaticConfigProperty('overriddenDefaults'); - if (isset($overriddenDefaults['standards']) === false) { - $this->standards = ['PSR1']; - $overriddenDefaults['standards'] = true; - } - - self::setStaticConfigProperty('overriddenDefaults', $overriddenDefaults); - } - - /** - * Prevent a call to stty to figure out the screen width, but only if the test being run - * doesn't set a report width itself. - * - * @since 1.1.0 - * - * @return void - */ - private function preventAutoDiscoveryScreenWidth() - { - $settings = $this->getSettings(); - if ($settings['reportWidth'] === 'auto') { - $this->reportWidth = self::DEFAULT_REPORT_WIDTH; - } - } - - /** - * Helper function to retrieve the value of a private static property on the Config class. - * - * Note: As of PHPCS 4.0, the "overriddenDefaults" property is no longer static, but this method - * will still handle this property. - * - * @since 1.1.0 - * - * @param string $name The name of the property to retrieve. - * - * @return mixed - */ - public function getStaticConfigProperty($name) - { - $property = new ReflectionProperty('PHP_CodeSniffer\Config', $name); - (\PHP_VERSION_ID < 80100) && $property->setAccessible(true); - - if ($name === 'overriddenDefaults' && \version_compare($this->phpcsVersion, '3.99.99', '>')) { - return $property->getValue($this); - } - - return $property->getValue(); - } - - /** - * Helper function to set the value of a private static property on the Config class. - * - * Note: As of PHPCS 4.0, the "overriddenDefaults" property is no longer static, but this method - * will still handle this property. - * - * @since 1.1.0 - * - * @param string $name The name of the property to set. - * @param mixed $value The value to set the property to. - * - * @return void - */ - public function setStaticConfigProperty($name, $value) - { - $property = new ReflectionProperty('PHP_CodeSniffer\Config', $name); - (\PHP_VERSION_ID < 80100) && $property->setAccessible(true); - - if ($name === 'overriddenDefaults' && \version_compare($this->phpcsVersion, '3.99.99', '>')) { - $property->setValue($this, $value); - } else { - $property->setValue(null, $value); - } - - (\PHP_VERSION_ID < 80100) && $property->setAccessible(false); - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/TestUtils/RulesetDouble.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/TestUtils/RulesetDouble.php deleted file mode 100644 index 10a3b6c..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/TestUtils/RulesetDouble.php +++ /dev/null @@ -1,57 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2024 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\TestUtils; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Exceptions\RuntimeException; -use PHP_CodeSniffer\Ruleset; - -/** - * Ruleset class for use in the tests. - * - * The PHP_CodeSniffer Ruleset will throw an error when no (valid) sniffs are registered, - * but for utility method tests, we're not concerned about that. - * - * This ruleset double will catch this error and discard it. - * - * @since 1.1.0 - */ -final class RulesetDouble extends Ruleset -{ - - /** - * Initialise the ruleset that the run will use. - * - * @since 1.1.0 - * - * @param \PHP_CodeSniffer\Config $config The config data for the run. - * - * @return void - */ - public function __construct(Config $config) - { - try { - parent::__construct($config); - } catch (RuntimeException $e) { - /* - * In the UtilityMethodTestCase, we're using a fake sniff name for the tests. - * As PHPCS 4.0 will check more strictly that sniffs exist and comply with naming conventions, - * this means, as of PHPCS 4.0, the ruleset creation will end with an error. - * This error is not something we are concerned about, as we're not testing sniffs, - * so we should be able to safely ignore it. - */ - if (\rtrim($e->getMessage()) !== 'ERROR: No sniffs were registered.') { - // Rethrow the exception to fail the test, as this is not the exception we expected. - throw $e; - } - } - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/TestUtils/UtilityMethodTestCase.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/TestUtils/UtilityMethodTestCase.php deleted file mode 100644 index 8871c42..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/TestUtils/UtilityMethodTestCase.php +++ /dev/null @@ -1,524 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2020 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\TestUtils; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Exceptions\TokenizerException; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Files\LocalFile; -use PHP_CodeSniffer\Ruleset; -use PHPCSUtils\BackCompat\Helper; -use PHPCSUtils\Exceptions\TestFileNotFound; -use PHPCSUtils\Exceptions\TestMarkerNotFound; -use PHPCSUtils\Exceptions\TestTargetNotFound; -use PHPCSUtils\TestUtils\ConfigDouble; -use PHPCSUtils\TestUtils\RulesetDouble; -use PHPUnit\Framework\Attributes\AfterClass; -use PHPUnit\Framework\Attributes\Before; -use PHPUnit\Framework\Attributes\BeforeClass; -use PHPUnit\Framework\TestCase; -use ReflectionClass; -use ReflectionProperty; - -/** - * Base class for use when testing utility methods for PHP_CodeSniffer. - * - * This class is compatible with PHP_CodeSniffer 3.x and 4.x. - * - * This class is compatible with {@link https://phpunit.de/ PHPUnit} 4.5 - 11.x providing the PHPCSUtils - * autoload file is included in the test bootstrap. For more information about that, please consult - * the project's {@link https://github.com/PHPCSStandards/PHPCSUtils/blob/develop/README.md README}. - * - * To allow for testing of tab vs space content, the `tabWidth` is set to `4` by default. - * - * Typical usage: - * - * Test case file `path/to/ClassUnderTestUnitTest.inc`: - * ```php - * <?php - * - * /* testTestCaseDescription * / - * const BAR = false; - * ``` - * - * Test file `path/to/ClassUnderTestUnitTest.php`: - * ```php - * <?php - * - * use PHPCSUtils\TestUtils\UtilityMethodTestCase; - * use YourStandard\ClassUnderTest; - * - * class ClassUnderTestUnitTest extends UtilityMethodTestCase { - * - * /** - * * Testing utility method MyMethod. - * * - * * @dataProvider dataMyMethod - * * - * * @covers \YourStandard\ClassUnderTest::MyMethod - * * - * * @param string $commentString The comment which prefaces the target token in the test file. - * * @param string $expected The expected return value. - * * - * * @return void - * * / - * public function testMyMethod($commentString, $expected) - * { - * $stackPtr = $this->getTargetToken($commentString, [\T_TOKEN_CONSTANT, \T_ANOTHER_TOKEN]); - * $class = new ClassUnderTest(); - * $result = $class->MyMethod(self::$phpcsFile, $stackPtr); - * // Or for static utility methods: - * $result = ClassUnderTest::MyMethod(self::$phpcsFile, $stackPtr); - * - * $this->assertSame($expected, $result); - * } - * - * /** - * * Data Provider. - * * - * * @see ClassUnderTestUnitTest::testMyMethod() For the array format. - * * - * * @return array - * * / - * public static function dataMyMethod() - * { - * return array( - * array('/* testTestCaseDescription * /', false), - * ); - * } - * } - * ``` - * - * Note: - * - Remove the space between the comment closers `* /` for a working example. - * - Each test case separator comment MUST start with `/* test`. - * This is to allow the {@see UtilityMethodTestCase::getTargetToken()} method to - * distinquish between the test separation comments and comments which may be part - * of the test case. - * - The test case file and unit test file should be placed in the same directory. - * - For working examples using this abstract class, have a look at the unit tests - * for the PHPCSUtils utility functions themselves. - * - * @since 1.0.0 - * @since 1.0.7 Compatible with PHPUnit 10. - * @since 1.1.0 Compatible with PHPUnit 11. - * @since 1.1.0 Compatible with PHP_CodeSniffer 4.0.0. - */ -abstract class UtilityMethodTestCase extends TestCase -{ - - /** - * The PHPCS version the tests are being run on. - * - * @since 1.0.0 - * - * @var string - */ - protected static $phpcsVersion = '0'; - - /** - * The file extension of the test case file (without leading dot). - * - * This allows concrete test classes to overrule the default `"inc"` with, for instance, - * `"js"` or `"css"` when applicable. - * - * @since 1.0.0 - * - * @var string - */ - protected static $fileExtension = 'inc'; - - /** - * Full path to the test case file associated with the concrete test class. - * - * Optional. If left empty, the case file will be presumed to be in - * the same directory and named the same as the test class, but with an - * `"inc"` file extension. - * - * @since 1.0.0 - * - * @var string - */ - protected static $caseFile = ''; - - /** - * The tab width setting to use when tokenizing the file. - * - * This allows for test case files to use a different tab width than the default. - * - * @since 1.0.0 - * - * @var int - */ - protected static $tabWidth = 4; - - /** - * The \PHP_CodeSniffer\Files\File object containing the parsed contents of the test case file. - * - * @since 1.0.0 - * - * @var \PHP_CodeSniffer\Files\File|null - */ - protected static $phpcsFile; - - /** - * Set the name of a sniff to pass to PHPCS to limit the run (and force it to record errors). - * - * Normally, this propery won't need to be overloaded, but for utility methods which record - * violations and contain fixers, setting a dummy sniff name equal to the sniff name passed - * in the error code for `addError()`/`addWarning()` during the test, will allow for testing - * the recording of these violations, as well as testing the fixer. - * - * @since 1.0.0 - * - * @var array<string> - */ - protected static $selectedSniff = ['Dummy.Dummy.Dummy']; - - /** - * Initialize PHPCS & tokenize the test case file. - * - * The test case file for a unit test class has to be in the same directory - * directory and use the same file name as the test class, using the `.inc` extension - * or be explicitly set using the {@see UtilityMethodTestCase::$fileExtension}/ - * {@see UtilityMethodTestCase::$caseFile} properties. - * - * Note: This is a PHPUnit cross-version compatible {@see \PHPUnit\Framework\TestCase::setUpBeforeClass()} - * method. - * - * @since 1.0.0 - * - * @beforeClass - * - * @return void - */ - #[BeforeClass] - public static function setUpTestFile() - { - parent::setUpBeforeClass(); - - self::$phpcsVersion = Helper::getVersion(); - - $caseFile = static::$caseFile; - if (\is_string($caseFile) === false || $caseFile === '') { - $testClass = \get_called_class(); - $testFile = (new ReflectionClass($testClass))->getFileName(); - $caseFile = \substr($testFile, 0, -3) . static::$fileExtension; - } - - $config = new ConfigDouble(); - - /* - * Limiting the run to just one (dummy) sniff will make it, yet again, slightly faster. - */ - $config->sniffs = static::$selectedSniff; - - // Disable caching. - $config->cache = false; - - // Also set a tab-width to enable testing tab-replaced vs `orig_content`. - $config->tabWidth = static::$tabWidth; - - $ruleset = new RulesetDouble($config); - - self::$phpcsFile = self::parseFile($caseFile, $ruleset, $config); - } - - /** - * Create a File object. - * - * The file will only be parsed, not processed. - * - * This helper method can also be used to create a secondary file object using the same sniff objects - * as used for the original test case file. - * To do so, pass `self::$phpcsFile->ruleset` for the $ruleset and `self::$phpcsFile->config` for the $config. - * - * @param string $caseFile The absolute path to the file. - * @param \PHP_CodeSniffer\Ruleset $ruleset The ruleset for the run. - * @param \PHP_CodeSniffer\Config $config The config data for the run. - * - * @return \PHP_CodeSniffer\Files\File - */ - protected static function parseFile($caseFile, Ruleset $ruleset, Config $config) - { - if (\is_readable($caseFile) === false) { - parent::fail("Test case file missing. Expected case file location: $caseFile"); - } - - $file = new LocalFile($caseFile, $ruleset, $config); - - // Only tokenize the file, do not process it. - try { - $file->parse(); - } catch (TokenizerException $e) { - // PHPCS 3.5.0 and higher. This is handled below. - } - - // Fail the test if the file failed to tokenize. - if ($file->numTokens === 0) { - parent::fail("Tokenizing of the test case file failed for case file: $caseFile"); - } - - return $file; - } - - /** - * Skip JS and CSS related tests on PHPCS 4.x. - * - * PHPCS 4.x drops support for the JS and CSS tokenizers. - * This method takes care of automatically skipping tests involving JS/CSS case files - * when the tests are being run with PHPCS 4.x. - * - * Note: This is a PHPUnit cross-version compatible {@see \PHPUnit\Framework\TestCase::setUp()} - * method. - * - * @since 1.0.0 - * - * @before - * - * @return void - */ - #[Before] - public function skipJSCSSTestsOnPHPCS4() - { - if (static::$fileExtension !== 'js' && static::$fileExtension !== 'css') { - return; - } - - if (\version_compare(self::$phpcsVersion, '3.99.99', '<=')) { - return; - } - - $this->markTestSkipped('JS and CSS support has been removed in PHPCS 4.'); - } - - /** - * Clean up after finished test by resetting all static properties to their default values. - * - * Note: This is a PHPUnit cross-version compatible {@see \PHPUnit\Framework\TestCase::tearDownAfterClass()} - * method. - * - * @since 1.0.0 - * - * @afterClass - * - * @return void - */ - #[AfterClass] - public static function resetTestFile() - { - /* - * Explicitly trigger __destruct() on the ConfigDouble to reset the Config statics. - * The explicit method call prevents potential stray test-local references to the $config object - * preventing the destructor from running the clean up (which without stray references would be - * automagically triggered when `self::$phpcsFile` is reset, but we can't definitively rely on that). - */ - if (isset(self::$phpcsFile)) { - self::$phpcsFile->config->__destruct(); - } - - self::$phpcsVersion = '0'; - self::$fileExtension = 'inc'; - self::$caseFile = ''; - self::$tabWidth = 4; - self::$phpcsFile = null; - self::$selectedSniff = ['Dummy.Dummy.Dummy']; - } - - /** - * Helper function to set the value of a private static property on the PHPCS Config class. - * - * @since 1.0.9 - * @deprecated 1.1.0 Use the `PHPCSUtils\TestUtils\ConfigDouble::setStaticConfigProperty()` method instead. - * - * @codeCoverageIgnore - * - * @param string $name The name of the property to set. - * @param mixed $value The value to set the property to. - * - * @return void - */ - public static function setStaticConfigProperty($name, $value) - { - $property = new ReflectionProperty('PHP_CodeSniffer\Config', $name); - (\PHP_VERSION_ID < 80100) && $property->setAccessible(true); - $property->setValue(null, $value); - (\PHP_VERSION_ID < 80100) && $property->setAccessible(false); - } - - /** - * Check whether or not the PHP 8.0 identifier name tokens will be in use. - * - * The expected token positions/token counts for certain tokens will differ depending - * on whether the PHP 8.0 identifier name tokenization is used or the PHP < 8.0 - * identifier name tokenization. - * - * Tests can use this method to determine which flavour of tokenization to expect and - * to set test expectations accordingly. - * - * @codeCoverageIgnore Nothing to test. - * - * @since 1.0.0 - * - * @return bool - */ - public static function usesPhp8NameTokens() - { - return \version_compare(Helper::getVersion(), '3.99.99', '>='); - } - - /** - * Test QA: verify that a test case file does not contain any duplicate test markers. - * - * When a test case file contains a lot of test cases, it is easy to overlook that a test marker name - * is already in use. - * A test wouldn't necessarily fail on this, but would not be testing what is intended to be tested as - * it would be verifying token properties for the wrong token. - * - * This test safeguards against this. - * - * @since 1.1.0 - * - * @coversNothing - * - * @return void - */ - public function testTestMarkersAreUnique() - { - $this->assertTestMarkersAreUnique(self::$phpcsFile); - } - - /** - * Assertion to verify that a test case file does not contain any duplicate test markers. - * - * @since 1.1.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file to validate. - * - * @return void - */ - public static function assertTestMarkersAreUnique(File $phpcsFile) - { - $tokens = $phpcsFile->getTokens(); - - // Collect all marker comments in the file. - $seenComments = []; - for ($i = 0; $i < $phpcsFile->numTokens; $i++) { - if ($tokens[$i]['code'] !== \T_COMMENT) { - continue; - } - - if (\stripos($tokens[$i]['content'], '/* test') !== 0) { - continue; - } - - $seenComments[] = $tokens[$i]['content']; - } - - self::assertSame(\array_unique($seenComments), $seenComments, 'Duplicate test markers found.'); - } - - /** - * Get the token pointer for a target token based on a specific comment. - * - * Note: the test delimiter comment MUST start with `/* test` to allow this function to - * distinguish between comments used *in* a test and test delimiters. - * - * @since 1.0.0 - * - * @param string $commentString The complete delimiter comment to look for as a string. - * This string should include the comment opener and closer. - * @param int|string|array<int|string> $tokenType The type of token(s) to look for. - * @param string|null $tokenContent Optional. The token content for the target token. - * - * @return int - * - * @throws \PHPCSUtils\Exceptions\TestMarkerNotFound When the delimiter comment for the test was not found. - * @throws \PHPCSUtils\Exceptions\TestTargetNotFound When the target token cannot be found. - */ - public static function getTargetToken($commentString, $tokenType, $tokenContent = null) - { - if ((self::$phpcsFile instanceof File) === false) { - throw new TestFileNotFound(); - } - - $start = (self::$phpcsFile->numTokens - 1); - $comment = self::$phpcsFile->findPrevious( - \T_COMMENT, - $start, - null, - false, - $commentString - ); - - if ($comment === false) { - throw TestMarkerNotFound::create($commentString, self::$phpcsFile->getFilename()); - } - - $tokens = self::$phpcsFile->getTokens(); - $end = ($start + 1); - - // Limit the token finding to between this and the next delimiter comment. - for ($i = ($comment + 1); $i < $end; $i++) { - if ($tokens[$i]['code'] !== \T_COMMENT) { - continue; - } - - if (\stripos($tokens[$i]['content'], '/* test') === 0) { - $end = $i; - break; - } - } - - $target = self::$phpcsFile->findNext( - $tokenType, - ($comment + 1), - $end, - false, - $tokenContent - ); - - if ($target === false) { - throw TestTargetNotFound::create($commentString, $tokenContent, self::$phpcsFile->getFilename()); - } - - return $target; - } - - /** - * Helper method to tell PHPUnit to expect a PHPCS Exception in a PHPUnit and PHPCS cross-version - * compatible manner. - * - * @since 1.0.0 - * - * @param string $msg The expected exception message. - * @param string $type The PHPCS native exception type to expect. Either 'runtime' or 'tokenizer'. - * Defaults to 'runtime'. - * - * @return void - */ - public function expectPhpcsException($msg, $type = 'runtime') - { - $exception = 'PHP_CodeSniffer\Exceptions\RuntimeException'; - if ($type === 'tokenizer') { - $exception = 'PHP_CodeSniffer\Exceptions\TokenizerException'; - } - - if (\method_exists($this, 'expectException')) { - // PHPUnit 5+. - $this->expectException($exception); - $this->expectExceptionMessage($msg); - } else { - // PHPUnit 4. - $this->setExpectedException($exception, $msg); - } - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Tokens/Collections.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Tokens/Collections.php deleted file mode 100644 index 43288ee..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Tokens/Collections.php +++ /dev/null @@ -1,911 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2020 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Tokens; - -use PHPCSUtils\Exceptions\InvalidTokenArray; - -/** - * Collections of related tokens as often used and needed for sniffs. - * - * These are additional "token groups" to compliment the ones available through the PHPCS - * native {@see \PHP_CodeSniffer\Util\Tokens} class. - * - * @see \PHP_CodeSniffer\Util\Tokens PHPCS native token groups. - * @see \PHPCSUtils\BackCompat\BCTokens Backward compatible version of the PHPCS native token groups. - * - * @since 1.0.0 - * - * @method static array<int|string, int|string> alternativeControlStructureSyntaxes() Tokens for control structures - * which can use the alternative - * control structure syntax. - * @method static array<int|string, int|string> alternativeControlStructureSyntaxClosers() Tokens representing alternative - * control structure syntax closer - * keywords. - * @method static array<int|string, int|string> arrayTokens() Tokens which are used to create - * arrays. - * @method static array<int|string, int|string> classModifierKeywords() Modifier keywords which can be - * used for a class declaration. - * @method static array<int|string, int|string> closedScopes() List of tokens which represent - * "closed" scopes. - * @method static array<int|string, int|string> constantModifierKeywords() Tokens which can be used as - * modifiers for a constant - * declaration (in OO structures). - * @method static array<int|string, int|string> controlStructureTokens() Control structure tokens. - * @method static array<int|string, int|string> functionDeclarationTokens() Tokens which represent a keyword - * which starts a function - * declaration. - * @method static array<int|string, int|string> incrementDecrementOperators() Increment/decrement operator - * tokens. - * @method static array<int|string, int|string> listTokens() Tokens which are used to create - * lists. - * @method static array<int|string, int|string> namespaceDeclarationClosers() List of tokens which can end a - * namespace declaration statement. - * @method static array<int|string, int|string> nameTokens() Tokens used for "names", be it - * namespace, OO, function or - * constant names. - * @method static array<int|string, int|string> objectOperators() Object operator tokens. - * @method static array<int|string, int|string> ooCanExtend() OO structures which can use the - * "extends" keyword. - * @method static array<int|string, int|string> ooCanImplement() OO structures which can use the - * "implements" keyword. - * @method static array<int|string, int|string> ooConstantScopes() OO scopes in which constants can - * be declared. - * @method static array<int|string, int|string> ooHierarchyKeywords() Tokens types used for "forwarding" - * calls within OO structures. - * @method static array<int|string, int|string> ooPropertyScopes() OO scopes in which properties can - * be declared. - * @method static array<int|string, int|string> phpOpenTags() Tokens which open PHP. - * @method static array<int|string, int|string> propertyModifierKeywords() Modifier keywords which can be - * used for a property declaration. - * @method static array<int|string, int|string> shortArrayTokens() Tokens which are used for - * short arrays. - * @method static array<int|string, int|string> shortListTokens() Tokens which are used for - * short lists. - * @method static array<int|string, int|string> ternaryOperators() Tokens which represent ternary - * operators. - * @method static array<int|string, int|string> textStringStartTokens() Tokens which can start a - * - potentially multi-line - - * text string. - */ -final class Collections -{ - - /** - * Tokens for control structures which can use the alternative control structure syntax. - * - * @since 1.0.0 Use the {@see Collections::alternativeControlStructureSyntaxes()} method for access. - * - * @var array<int, int> - */ - private static $alternativeControlStructureSyntaxes = [ - \T_IF => \T_IF, - \T_ELSEIF => \T_ELSEIF, - \T_ELSE => \T_ELSE, - \T_FOR => \T_FOR, - \T_FOREACH => \T_FOREACH, - \T_SWITCH => \T_SWITCH, - \T_WHILE => \T_WHILE, - \T_DECLARE => \T_DECLARE, - ]; - - /** - * Tokens representing alternative control structure syntax closer keywords. - * - * @since 1.0.0 Use the {@see Collections::alternativeControlStructureSyntaxClosers()} method for access. - * - * @var array<int, int> - */ - private static $alternativeControlStructureSyntaxClosers = [ - \T_ENDIF => \T_ENDIF, - \T_ENDFOR => \T_ENDFOR, - \T_ENDFOREACH => \T_ENDFOREACH, - \T_ENDWHILE => \T_ENDWHILE, - \T_ENDSWITCH => \T_ENDSWITCH, - \T_ENDDECLARE => \T_ENDDECLARE, - ]; - - /** - * Tokens which can open an array (PHPCS cross-version compatible). - * - * Should only be used selectively. - * Depending on the PHPCS version, the token array will be expanded in the associated method. - * - * @see \PHPCSUtils\Tokens\Collections::arrayTokensBC() Related method to retrieve tokens used - * for arrays (PHPCS cross-version). - * @see \PHPCSUtils\Tokens\Collections::shortArrayTokensBC() Related method to retrieve only tokens used - * for short arrays (PHPCS cross-version). - * - * @since 1.0.0 Use the {@see Collections::arrayOpenTokensBC()} method for access. - * - * @var array<int|string, int|string> - */ - private static $arrayOpenTokensBC = [ - \T_ARRAY => \T_ARRAY, - \T_OPEN_SHORT_ARRAY => \T_OPEN_SHORT_ARRAY, - ]; - - /** - * Tokens which are used to create arrays. - * - * @see \PHPCSUtils\Tokens\Collections::arrayOpenTokensBC() Related method to retrieve only the "open" tokens - * used for arrays (PHPCS cross-version compatible). - * @see \PHPCSUtils\Tokens\Collections::arrayTokensBC() Related method to retrieve tokens used - * for arrays (PHPCS cross-version compatible). - * @see \PHPCSUtils\Tokens\Collections::shortArrayTokens() Related method to retrieve only tokens used - * for short arrays. - * - * @since 1.0.0 Use the {@see Collections::arrayTokens()} method for access. - * - * @var array<int|string, int|string> - */ - private static $arrayTokens = [ - \T_ARRAY => \T_ARRAY, - \T_OPEN_SHORT_ARRAY => \T_OPEN_SHORT_ARRAY, - \T_CLOSE_SHORT_ARRAY => \T_CLOSE_SHORT_ARRAY, - ]; - - /** - * Modifier keywords which can be used for a class declaration. - * - * @since 1.0.0 Use the {@see Collections::classModifierKeywords()} method for access. - * - * @var array<int|string, int|string> - */ - private static $classModifierKeywords = [ - \T_FINAL => \T_FINAL, - \T_ABSTRACT => \T_ABSTRACT, - \T_READONLY => \T_READONLY, - ]; - - /** - * List of tokens which represent "closed" scopes. - * - * I.e. anything declared within that scope - except for other closed scopes - is - * outside of the global namespace. - * - * This list doesn't contain the `T_NAMESPACE` token on purpose as variables declared - * within a namespace scope are still global and not limited to that namespace. - * - * @since 1.0.0 Use the {@see Collections::closedScopes()} method for access. - * - * @var array<int|string, int|string> - */ - private static $closedScopes = [ - \T_CLASS => \T_CLASS, - \T_ANON_CLASS => \T_ANON_CLASS, - \T_INTERFACE => \T_INTERFACE, - \T_TRAIT => \T_TRAIT, - \T_ENUM => \T_ENUM, - \T_FUNCTION => \T_FUNCTION, - \T_CLOSURE => \T_CLOSURE, - ]; - - /** - * Modifier keywords which can be used for constant declarations (in OO structures). - * - * - PHP 7.1 added class constants visibility support. - * - PHP 8.1 added support for final class constants. - * - * @since 1.0.0 Use the {@see Collections::constantModifierKeywords()} method for access. - * - * @var array<int|string, int|string> - */ - private static $constantModifierKeywords = [ - \T_PUBLIC => \T_PUBLIC, - \T_PRIVATE => \T_PRIVATE, - \T_PROTECTED => \T_PROTECTED, - \T_FINAL => \T_FINAL, - ]; - - /** - * Token types which can be encountered in an OO constant type declaration. - * - * @since 1.1.0 Use the {@see Collections::constantTypeTokens()} method for access. - * - * @var array<int|string, int|string> - */ - private static $constantTypeTokens = [ - \T_CALLABLE => \T_CALLABLE, // Not allowed in PHP, but in this list to allow for flagging code errors. - \T_FALSE => \T_FALSE, - \T_TRUE => \T_TRUE, - \T_NULL => \T_NULL, - \T_TYPE_UNION => \T_TYPE_UNION, - \T_TYPE_INTERSECTION => \T_TYPE_INTERSECTION, - \T_TYPE_OPEN_PARENTHESIS => \T_TYPE_OPEN_PARENTHESIS, - \T_TYPE_CLOSE_PARENTHESIS => \T_TYPE_CLOSE_PARENTHESIS, - ]; - - /** - * Control structure tokens. - * - * @since 1.0.0 Use the {@see Collections::controlStructureTokens()} method for access. - * - * @var array<int|string, int|string> - */ - private static $controlStructureTokens = [ - \T_IF => \T_IF, - \T_ELSEIF => \T_ELSEIF, - \T_ELSE => \T_ELSE, - \T_FOR => \T_FOR, - \T_FOREACH => \T_FOREACH, - \T_SWITCH => \T_SWITCH, - \T_DO => \T_DO, - \T_WHILE => \T_WHILE, - \T_DECLARE => \T_DECLARE, - \T_MATCH => \T_MATCH, - ]; - - /** - * Tokens which represent a keyword which starts a function declaration. - * - * @since 1.0.0 Use the {@see Collections::functionDeclarationTokens()} method for access. - * - * @var array<int|string, int|string> - */ - private static $functionDeclarationTokens = [ - \T_FUNCTION => \T_FUNCTION, - \T_CLOSURE => \T_CLOSURE, - \T_FN => \T_FN, - ]; - - /** - * Increment/decrement operator tokens. - * - * @since 1.0.0 Use the {@see Collections::incrementDecrementOperators()} method for access. - * - * @var array<int, int> - */ - private static $incrementDecrementOperators = [ - \T_DEC => \T_DEC, - \T_INC => \T_INC, - ]; - - /** - * Tokens which can open a list construct (PHPCS cross-version compatible). - * - * Should only be used selectively. - * Depending on the PHPCS version, the token array will be expanded in the associated method. - * - * @see \PHPCSUtils\Tokens\Collections::listTokensBC() Related method to retrieve tokens used - * for lists (PHPCS cross-version). - * @see \PHPCSUtils\Tokens\Collections::shortListTokensBC() Related method to retrieve only tokens used - * for short lists (PHPCS cross-version). - * - * @since 1.0.0 Use the {@see Collections::listOpenTokensBC()} method for access. - * - * @var array<int|string, int|string> - */ - private static $listOpenTokensBC = [ - \T_LIST => \T_LIST, - \T_OPEN_SHORT_ARRAY => \T_OPEN_SHORT_ARRAY, - ]; - - /** - * Tokens which are used to create lists. - * - * @see \PHPCSUtils\Tokens\Collections::listTokensBC() Related method to retrieve tokens used - * for lists (PHPCS cross-version). - * @see \PHPCSUtils\Tokens\Collections::shortListTokens() Related method to retrieve only tokens used - * for short lists. - * - * @since 1.0.0 Use the {@see Collections::listTokens()} method for access. - * - * @var array<int|string, int|string> - */ - private static $listTokens = [ - \T_LIST => \T_LIST, - \T_OPEN_SHORT_ARRAY => \T_OPEN_SHORT_ARRAY, - \T_CLOSE_SHORT_ARRAY => \T_CLOSE_SHORT_ARRAY, - ]; - - /** - * List of tokens which can end a namespace declaration statement. - * - * @since 1.0.0 Use the {@see Collections::namespaceDeclarationClosers()} method for access. - * - * @var array<int|string, int|string> - */ - private static $namespaceDeclarationClosers = [ - \T_SEMICOLON => \T_SEMICOLON, - \T_OPEN_CURLY_BRACKET => \T_OPEN_CURLY_BRACKET, - \T_CLOSE_TAG => \T_CLOSE_TAG, - ]; - - /** - * Tokens used for "names", be it namespace, OO, function or constant names. - * - * Includes the tokens introduced in PHP 8.0 for "Namespaced names as single token". - * - * Note: the PHP 8.0 namespaced name tokens are backfilled in PHPCS since PHPCS 3.5.7, - * but are not used yet (the PHP 8.0 tokenization is "undone" in PHPCS). - * As of PHPCS 4.0.0, these tokens _will_ be used and the PHP 8.0 tokenization is respected. - * - * @link https://wiki.php.net/rfc/namespaced_names_as_token PHP RFC on namespaced names as single token - * - * @since 1.0.0 Use the {@see Collections::nameTokens()} method for access. - * - * @var array<int|string, int|string> - */ - private static $nameTokens = [ - \T_STRING => \T_STRING, - \T_NAME_QUALIFIED => \T_NAME_QUALIFIED, - \T_NAME_FULLY_QUALIFIED => \T_NAME_FULLY_QUALIFIED, - \T_NAME_RELATIVE => \T_NAME_RELATIVE, - ]; - - /** - * Object operator tokens. - * - * @since 1.0.0 Use the {@see Collections::objectOperators()} method for access. - * - * @var array<int|string, int|string> - */ - private static $objectOperators = [ - \T_DOUBLE_COLON => \T_DOUBLE_COLON, - \T_OBJECT_OPERATOR => \T_OBJECT_OPERATOR, - \T_NULLSAFE_OBJECT_OPERATOR => \T_NULLSAFE_OBJECT_OPERATOR, - ]; - - /** - * OO structures which can use the "extends" keyword. - * - * @since 1.0.0 Use the {@see Collections::ooCanExtend()} method for access. - * - * @var array<int|string, int|string> - */ - private static $ooCanExtend = [ - \T_CLASS => \T_CLASS, - \T_ANON_CLASS => \T_ANON_CLASS, - \T_INTERFACE => \T_INTERFACE, - ]; - - /** - * OO structures which can use the "implements" keyword. - * - * @since 1.0.0 Use the {@see Collections::ooCanImplement()} method for access. - * - * @var array<int|string, int|string> - */ - private static $ooCanImplement = [ - \T_CLASS => \T_CLASS, - \T_ANON_CLASS => \T_ANON_CLASS, - \T_ENUM => \T_ENUM, - ]; - - /** - * OO scopes in which constants can be declared. - * - * - PHP 8.2 added support for constants in traits. - * - * @since 1.0.0 Use the {@see Collections::ooConstantScopes()} method for access. - * - * @var array<int|string, int|string> - */ - private static $ooConstantScopes = [ - \T_CLASS => \T_CLASS, - \T_ANON_CLASS => \T_ANON_CLASS, - \T_INTERFACE => \T_INTERFACE, - \T_ENUM => \T_ENUM, - \T_TRAIT => \T_TRAIT, - ]; - - /** - * Tokens types used for "forwarding" calls within OO structures. - * - * @link https://www.php.net/language.oop5.paamayim-nekudotayim PHP Manual on OO forwarding calls - * - * @since 1.0.0 Use the {@see Collections::ooHierarchyKeywords()} method for access. - * - * @var array<int|string, int|string> - */ - private static $ooHierarchyKeywords = [ - \T_PARENT => \T_PARENT, - \T_SELF => \T_SELF, - \T_STATIC => \T_STATIC, - ]; - - /** - * OO scopes in which properties can be declared. - * - * - PHP 8.4 added support for properties in interfaces. - * - * @since 1.0.0 Use the {@see Collections::ooPropertyScopes()} method for access. - * - * @var array<int|string, int|string> - */ - private static $ooPropertyScopes = [ - \T_CLASS => \T_CLASS, - \T_ANON_CLASS => \T_ANON_CLASS, - \T_INTERFACE => \T_INTERFACE, - \T_TRAIT => \T_TRAIT, - ]; - - /** - * Token types which can be encountered in a parameter type declaration. - * - * @since 1.0.0 Use the {@see Collections::parameterTypeTokens()} method for access. - * - * @var array<int|string, int|string> - */ - private static $parameterTypeTokens = [ - \T_CALLABLE => \T_CALLABLE, - \T_SELF => \T_SELF, - \T_PARENT => \T_PARENT, - \T_FALSE => \T_FALSE, - \T_TRUE => \T_TRUE, - \T_NULL => \T_NULL, - \T_TYPE_UNION => \T_TYPE_UNION, - \T_TYPE_INTERSECTION => \T_TYPE_INTERSECTION, - \T_TYPE_OPEN_PARENTHESIS => \T_TYPE_OPEN_PARENTHESIS, - \T_TYPE_CLOSE_PARENTHESIS => \T_TYPE_CLOSE_PARENTHESIS, - ]; - - /** - * Tokens which open PHP. - * - * @since 1.0.0 Use the {@see Collections::phpOpenTags()} method for access. - * - * @var array<int, int> - */ - private static $phpOpenTags = [ - \T_OPEN_TAG => \T_OPEN_TAG, - \T_OPEN_TAG_WITH_ECHO => \T_OPEN_TAG_WITH_ECHO, - ]; - - /** - * Modifier keywords which can be used for a property declaration. - * - * @since 1.0.0 Use the {@see Collections::propertyModifierKeywords()} method for access. - * - * @var array<int|string, int|string> - */ - private static $propertyModifierKeywords = [ - \T_PUBLIC => \T_PUBLIC, - \T_PUBLIC_SET => \T_PUBLIC_SET, - \T_PROTECTED => \T_PROTECTED, - \T_PROTECTED_SET => \T_PROTECTED_SET, - \T_PRIVATE => \T_PRIVATE, - \T_PRIVATE_SET => \T_PRIVATE_SET, - \T_STATIC => \T_STATIC, - \T_VAR => \T_VAR, - \T_READONLY => \T_READONLY, - \T_FINAL => \T_FINAL, - \T_ABSTRACT => \T_ABSTRACT, - ]; - - /** - * Token types which can be encountered in a property type declaration. - * - * @since 1.0.0 Use the {@see Collections::propertyTypeTokens()} method for access. - * - * @var array<int|string, int|string> - */ - private static $propertyTypeTokens = [ - \T_CALLABLE => \T_CALLABLE, // Not allowed in PHP, but in this list to allow for flagging code errors. - \T_SELF => \T_SELF, - \T_PARENT => \T_PARENT, - \T_FALSE => \T_FALSE, - \T_TRUE => \T_TRUE, - \T_NULL => \T_NULL, - \T_TYPE_UNION => \T_TYPE_UNION, - \T_TYPE_INTERSECTION => \T_TYPE_INTERSECTION, - \T_TYPE_OPEN_PARENTHESIS => \T_TYPE_OPEN_PARENTHESIS, - \T_TYPE_CLOSE_PARENTHESIS => \T_TYPE_CLOSE_PARENTHESIS, - ]; - - /** - * Token types which can be encountered in a return type declaration. - * - * @since 1.0.0 Use the {@see Collections::returnTypeTokens()} method for access. - * - * @var array<int|string, int|string> - */ - private static $returnTypeTokens = [ - \T_CALLABLE => \T_CALLABLE, - \T_FALSE => \T_FALSE, - \T_TRUE => \T_TRUE, - \T_NULL => \T_NULL, - \T_TYPE_UNION => \T_TYPE_UNION, - \T_TYPE_INTERSECTION => \T_TYPE_INTERSECTION, - \T_TYPE_OPEN_PARENTHESIS => \T_TYPE_OPEN_PARENTHESIS, - \T_TYPE_CLOSE_PARENTHESIS => \T_TYPE_CLOSE_PARENTHESIS, - ]; - - /** - * Tokens which can open a short array or short list (PHPCS cross-version compatible). - * - * Should only be used selectively. - * Depending on the PHPCS version, the token array will be expanded in the associated method. - * - * @since 1.0.0 Use the {@see Collections::shortArrayListOpenTokensBC()} method for access. - * - * @var array<int|string, int|string> - */ - private static $shortArrayListOpenTokensBC = [ - \T_OPEN_SHORT_ARRAY => \T_OPEN_SHORT_ARRAY, - ]; - - /** - * Tokens which are used for short arrays. - * - * @see \PHPCSUtils\Tokens\Collections::arrayTokens() Related method to retrieve all tokens used for arrays. - * - * @since 1.0.0 Use the {@see Collections::shortArrayTokens()} method for access. - * - * @var array<int|string, int|string> - */ - private static $shortArrayTokens = [ - \T_OPEN_SHORT_ARRAY => \T_OPEN_SHORT_ARRAY, - \T_CLOSE_SHORT_ARRAY => \T_CLOSE_SHORT_ARRAY, - ]; - - /** - * Tokens which are used for short lists. - * - * @see \PHPCSUtils\Tokens\Collections::listTokens() Related method to retrieve all tokens used for lists. - * - * @since 1.0.0 Use the {@see Collections::shortListTokens()} method for access. - * - * @var array<int|string, int|string> - */ - private static $shortListTokens = [ - \T_OPEN_SHORT_ARRAY => \T_OPEN_SHORT_ARRAY, - \T_CLOSE_SHORT_ARRAY => \T_CLOSE_SHORT_ARRAY, - ]; - - /** - * Tokens which represent ternary operators. - * - * @since 1.1.0 Use the {@see Collections::ternaryOperators()} method for access. - * - * @var array<int|string, int|string> - */ - private static $ternaryOperators = [ - \T_INLINE_THEN => \T_INLINE_THEN, - \T_INLINE_ELSE => \T_INLINE_ELSE, - ]; - - /** - * Tokens which can start a - potentially multi-line - text string. - * - * @since 1.0.0 Use the {@see Collections::textStringStartTokens()} method for access. - * - * @var array<int|string, int|string> - */ - private static $textStringStartTokens = [ - \T_START_HEREDOC => \T_START_HEREDOC, - \T_START_NOWDOC => \T_START_NOWDOC, - \T_CONSTANT_ENCAPSED_STRING => \T_CONSTANT_ENCAPSED_STRING, - \T_DOUBLE_QUOTED_STRING => \T_DOUBLE_QUOTED_STRING, - ]; - - /** - * Handle calls to (undeclared) methods for token arrays which don't need special handling. - * - * @since 1.0.0 - * - * @param string $name The name of the method which has been called. - * @param array<mixed> $args Any arguments passed to the method. - * Unused as none of the methods take arguments. - * - * @return array<int|string, int|string> Token array - * - * @throws \PHPCSUtils\Exceptions\InvalidTokenArray When an invalid token array is requested. - */ - public static function __callStatic($name, $args) - { - if (isset(self::${$name})) { - return self::${$name}; - } - - // Unknown token array requested. - throw InvalidTokenArray::create($name); - } - - /** - * Throw a deprecation notice with a standardized deprecation message. - * - * @since 1.0.0 - * - * @param string $method The name of the method which is deprecated. - * @param string $version The version since which the method is deprecated. - * @param string $replacement What to use instead. - * - * @return void - */ - private static function triggerDeprecation($method, $version, $replacement) - { - \trigger_error( - \sprintf( - 'The %1$s::%2$s() method is deprecated since PHPCSUtils %3$s.' - . ' Use %4$s instead.', - __CLASS__, - $method, - $version, - $replacement - ), - \E_USER_DEPRECATED - ); - } - - /** - * Tokens which can open an array (PHPCS cross-version compatible). - * - * For those PHPCS versions which need it, includes `T_OPEN_SQUARE_BRACKET` to allow for - * handling tokenizer issues related to the retokenization to `T_OPEN_SHORT_ARRAY`. - * Should only be used selectively. - * - * @see \PHPCSUtils\Tokens\Collections::arrayTokensBC() Related method to retrieve tokens used - * for arrays (PHPCS cross-version). - * @see \PHPCSUtils\Tokens\Collections::shortArrayTokensBC() Related method to retrieve only tokens used - * for short arrays (PHPCS cross-version). - * - * @since 1.0.0 - * - * @return array<int|string, int|string> - */ - public static function arrayOpenTokensBC() - { - return self::$arrayOpenTokensBC; - } - - /** - * Tokens which are used to create arrays (PHPCS cross-version compatible). - * - * For those PHPCS versions which need it, includes `T_OPEN_SQUARE_BRACKET` and `T_CLOSE_SQUARE_BRACKET` - * to allow for handling tokenizer issues related to the retokenization to `T_OPEN_SHORT_ARRAY`. - * Should only be used selectively. - * - * @see \PHPCSUtils\Tokens\Collections::arrayOpenTokensBC() Related method to retrieve only the "open" tokens - * used for arrays (PHPCS cross-version compatible). - * @see \PHPCSUtils\Tokens\Collections::shortArrayTokensBC() Related method to retrieve only tokens used - * for short arrays (PHPCS cross-version compatible). - * - * @since 1.0.0 - * - * @return array<int|string, int|string> - */ - public static function arrayTokensBC() - { - return self::$arrayTokens; - } - - /** - * Token types which can be encountered in OO constant type declaration. - * - * @since 1.1.0 - * - * @return array<int|string, int|string> - */ - public static function constantTypeTokens() - { - $tokens = self::$constantTypeTokens; - // Self and static are only allowed in enums, but that's not the concern of this method. - $tokens += self::$ooHierarchyKeywords; - $tokens += self::namespacedNameTokens(); - - return $tokens; - } - - /** - * Tokens which can represent function calls and function-call-like language constructs. - * - * @see \PHPCSUtils\Tokens\Collections::parameterPassingTokens() Related method. - * - * @since 1.0.0 - * - * @return array<int|string, int|string> - */ - public static function functionCallTokens() - { - // Function calls and class instantiation. - $tokens = self::$nameTokens; - $tokens[\T_VARIABLE] = \T_VARIABLE; - - // Class instantiation only. - $tokens[\T_ANON_CLASS] = \T_ANON_CLASS; - $tokens += self::$ooHierarchyKeywords; - - // As of PHP 8.4, exit()/die() should be treated as function call tokens. - // Sniffs using this collection should safeguard against use as a constant. - $tokens[\T_EXIT] = \T_EXIT; - - return $tokens; - } - - /** - * Tokens which can open a list construct (PHPCS cross-version compatible). - * - * For those PHPCS versions which need it, includes `T_OPEN_SQUARE_BRACKET` to allow for - * handling tokenizer issues related to the retokenization to `T_OPEN_SHORT_ARRAY`. - * Should only be used selectively. - * - * @see \PHPCSUtils\Tokens\Collections::listTokensBC() Related method to retrieve tokens used - * for lists (PHPCS cross-version). - * @see \PHPCSUtils\Tokens\Collections::shortListTokensBC() Related method to retrieve only tokens used - * for short lists (PHPCS cross-version). - * - * @since 1.0.0 - * - * @return array<int|string, int|string> - */ - public static function listOpenTokensBC() - { - return self::$listOpenTokensBC; - } - - /** - * Tokens which are used to create lists (PHPCS cross-version compatible). - * - * For those PHPCS versions which need it, includes `T_OPEN_SQUARE_BRACKET` and `T_CLOSE_SQUARE_BRACKET` - * to allow for handling tokenizer issues related to the retokenization to `T_OPEN_SHORT_ARRAY`. - * Should only be used selectively. - * - * @see \PHPCSUtils\Tokens\Collections::shortListTokensBC() Related method to retrieve only tokens used - * for short lists (cross-version). - * - * @since 1.0.0 - * - * @return array<int|string, int|string> - */ - public static function listTokensBC() - { - return self::$listTokens; - } - - /** - * Tokens types which can be encountered in a fully, partially or unqualified name. - * - * Example: - * ```php - * echo namespace\Sub\ClassName::method(); - * ``` - * - * @since 1.0.0 - * - * @return array<int|string, int|string> - */ - public static function namespacedNameTokens() - { - $tokens = [ - \T_NS_SEPARATOR => \T_NS_SEPARATOR, - \T_NAMESPACE => \T_NAMESPACE, - ]; - - $tokens += self::$nameTokens; - - return $tokens; - } - - /** - * Tokens which can be passed to the methods in the PassedParameter class. - * - * @see \PHPCSUtils\Utils\PassedParameters - * - * @since 1.0.0 - * - * @return array<int|string, int|string> - */ - public static function parameterPassingTokens() - { - // Function call and class instantiation tokens. - $tokens = self::functionCallTokens(); - - // Function-look-a-like language constructs which can take multiple "parameters". - $tokens[\T_ISSET] = \T_ISSET; - $tokens[\T_UNSET] = \T_UNSET; - - // Array tokens. - $tokens += self::arrayOpenTokensBC(); - - return $tokens; - } - - /** - * Token types which can be encountered in a parameter type declaration. - * - * @since 1.0.0 - * - * @return array<int|string, int|string> - */ - public static function parameterTypeTokens() - { - $tokens = self::$parameterTypeTokens; - $tokens += self::namespacedNameTokens(); - - return $tokens; - } - - /** - * Token types which can be encountered in a property type declaration. - * - * @since 1.0.0 - * - * @return array<int|string, int|string> - */ - public static function propertyTypeTokens() - { - $tokens = self::$propertyTypeTokens; - $tokens += self::namespacedNameTokens(); - - return $tokens; - } - - /** - * Token types which can be encountered in a return type declaration. - * - * @since 1.0.0 - * - * @return array<int|string, int|string> - */ - public static function returnTypeTokens() - { - $tokens = self::$returnTypeTokens; - $tokens += self::$ooHierarchyKeywords; - $tokens += self::namespacedNameTokens(); - - return $tokens; - } - - /** - * Tokens which can open a short array or short list (PHPCS cross-version compatible). - * - * For those PHPCS versions which need it, includes `T_OPEN_SQUARE_BRACKET` to allow for - * handling tokenizer issues related to the retokenization to `T_OPEN_SHORT_ARRAY`. - * Should only be used selectively. - * - * @since 1.0.0 - * - * @return array<int|string, int|string> - */ - public static function shortArrayListOpenTokensBC() - { - return self::$shortArrayListOpenTokensBC; - } - - /** - * Tokens which are used for short arrays (PHPCS cross-version compatible). - * - * For those PHPCS versions which need it, includes `T_OPEN_SQUARE_BRACKET` and `T_CLOSE_SQUARE_BRACKET` - * to allow for handling tokenizer issues related to the retokenization to `T_OPEN_SHORT_ARRAY`. - * Should only be used selectively. - * - * @see \PHPCSUtils\Tokens\Collections::arrayTokensBC() Related method to retrieve all tokens used for arrays - * (cross-version). - * - * @since 1.0.0 - * - * @return array<int|string, int|string> - */ - public static function shortArrayTokensBC() - { - return self::$shortArrayTokens; - } - - /** - * Tokens which are used for short lists (PHPCS cross-version compatible). - * - * For those PHPCS versions which need it, includes `T_OPEN_SQUARE_BRACKET` and `T_CLOSE_SQUARE_BRACKET` - * to allow for handling tokenizer issues related to the retokenization to `T_OPEN_SHORT_ARRAY`. - * Should only be used selectively. - * - * @see \PHPCSUtils\Tokens\Collections::listTokensBC() Related method to retrieve all tokens used for lists - * (cross-version). - * - * @since 1.0.0 - * - * @return array<int|string, int|string> - */ - public static function shortListTokensBC() - { - return self::$shortListTokens; - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Tokens/TokenHelper.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Tokens/TokenHelper.php deleted file mode 100644 index 4466b77..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Tokens/TokenHelper.php +++ /dev/null @@ -1,55 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2020 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Tokens; - -/** - * Helpers for working with tokens. - * - * @since 1.0.0 - */ -final class TokenHelper -{ - - /** - * Check whether a PHP native token exists (for real). - * - * Under normal circumstances, checking whether a token exists (either defined by PHP or by PHPCS) - * is as straight-forward as running `defined('T_TOKEN_NAME')`. - * - * Unfortunately, this doesn't work in all circumstances, most notably, if an external standard - * also uses PHP-Parser or when code coverage is run on a standard using PHPUnit >= 9.3 (which uses PHP-Parser), - * this logic breaks because PHP-Parser also polyfills tokens. - * This method takes potentially polyfilled tokens from PHP-Parser into account and will regard the token - * as undefined if it was declared by PHP-Parser. - * - * Note: this method only _needs_ to be used for PHP native tokens, not for PHPCS specific tokens. - * Also, realistically, it only needs to be used for tokens introduced in PHP in recent versions (PHP 7.4 and up). - * Having said that, the method _will_ also work correctly when a name of a PHPCS native token is passed or - * of an older PHP native token. - * - * {@internal PHP native tokens have a positive integer value. PHPCS polyfilled tokens are strings. - * PHP-Parser polyfilled tokens will always have a negative integer value < 0, which is how - * these are filtered out.} - * - * @link https://github.com/sebastianbergmann/php-code-coverage/issues/798 PHP-Code-Coverage#798 - * @link https://github.com/nikic/PHP-Parser/blob/master/lib/PhpParser/Lexer.php PHP-Parser Lexer code - * - * @since 1.0.0 - * - * @param string $name The token name. - * - * @return bool - */ - public static function tokenExists($name) - { - return (\defined($name) && (\is_int(\constant($name)) === false || \constant($name) > 0)); - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Arrays.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Arrays.php deleted file mode 100644 index ff39d53..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Arrays.php +++ /dev/null @@ -1,246 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2020 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Utils; - -use PHP_CodeSniffer\Files\File; -use PHPCSUtils\Exceptions\LogicException; -use PHPCSUtils\Exceptions\OutOfBoundsStackPtr; -use PHPCSUtils\Exceptions\TypeError; -use PHPCSUtils\Internal\Cache; -use PHPCSUtils\Internal\IsShortArrayOrListWithCache; -use PHPCSUtils\Tokens\Collections; - -/** - * Utility functions for use when examining arrays. - * - * @since 1.0.0 - */ -final class Arrays -{ - - /** - * The tokens to target to find the double arrow in an array item. - * - * @since 1.0.0 - * - * @var array<int|string, int|string> - */ - private static $doubleArrowTargets = [ - \T_DOUBLE_ARROW => \T_DOUBLE_ARROW, - - // Nested arrays. - \T_ARRAY => \T_ARRAY, - \T_OPEN_SHORT_ARRAY => \T_OPEN_SHORT_ARRAY, - - // Inline function, control structures and other things to skip over. - \T_LIST => \T_LIST, - \T_FN => \T_FN, - \T_MATCH => \T_MATCH, - \T_ATTRIBUTE => \T_ATTRIBUTE, - ]; - - /** - * Determine whether a T_OPEN/CLOSE_SHORT_ARRAY token is a short array construct - * and not a short list. - * - * This method also accepts `T_OPEN/CLOSE_SQUARE_BRACKET` tokens to allow it to be - * PHPCS cross-version compatible as the short array tokenizing has been plagued by - * a number of bugs over time. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the short array bracket token. - * - * @return bool `TRUE` if the token passed is the open/close bracket of a short array. - * `FALSE` if the token is a short list bracket, a plain square bracket - * or not one of the accepted tokens. - */ - public static function isShortArray(File $phpcsFile, $stackPtr) - { - return IsShortArrayOrListWithCache::isShortArray($phpcsFile, $stackPtr); - } - - /** - * Find the array opener and closer based on a T_ARRAY or T_OPEN_SHORT_ARRAY token. - * - * This method also accepts `T_OPEN_SQUARE_BRACKET` tokens to allow it to be - * PHPCS cross-version compatible as the short array tokenizing has been plagued by - * a number of bugs over time, which affects the short array determination. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the `T_ARRAY` or `T_OPEN_SHORT_ARRAY` - * token in the stack. - * @param true|null $isShortArray Short-circuit the short array check for `T_OPEN_SHORT_ARRAY` - * tokens if it isn't necessary. - * Efficiency tweak for when this has already been established, - * i.e. when encountering a nested array while walking the - * tokens in an array. - * Use with care. - * - * @return array<string, int>|false An array with the token pointers; or `FALSE` if this is not a - * (short) array token or if the opener/closer could not be determined. - * The format of the array return value is: - * ```php - * array( - * 'opener' => integer, // Stack pointer to the array open bracket. - * 'closer' => integer, // Stack pointer to the array close bracket. - * ) - * ``` - */ - public static function getOpenClose(File $phpcsFile, $stackPtr, $isShortArray = null) - { - $tokens = $phpcsFile->getTokens(); - - // Is this one of the tokens this function handles ? - if (isset($tokens[$stackPtr]) === false - || isset(Collections::arrayOpenTokensBC()[$tokens[$stackPtr]['code']]) === false - ) { - return false; - } - - switch ($tokens[$stackPtr]['code']) { - case \T_ARRAY: - if (isset($tokens[$stackPtr]['parenthesis_opener'])) { - $opener = $tokens[$stackPtr]['parenthesis_opener']; - - if (isset($tokens[$opener]['parenthesis_closer'])) { - $closer = $tokens[$opener]['parenthesis_closer']; - } - } - break; - - case \T_OPEN_SHORT_ARRAY: - case \T_OPEN_SQUARE_BRACKET: - if ($isShortArray === true || self::isShortArray($phpcsFile, $stackPtr) === true) { - $opener = $stackPtr; - $closer = $tokens[$stackPtr]['bracket_closer']; - } - break; - } - - if (isset($opener, $closer)) { - return [ - 'opener' => $opener, - 'closer' => $closer, - ]; - } - - return false; - } - - /** - * Get the stack pointer position of the double arrow within an array item. - * - * Expects to be passed the array item start and end tokens as retrieved via - * {@see \PHPCSUtils\Utils\PassedParameters::getParameters()}. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being examined. - * @param int $start Stack pointer to the start of the array item. - * @param int $end Stack pointer to the last token in the array item. - * - * @return int|false Stack pointer to the double arrow if this array item has a key; or `FALSE` otherwise. - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $start or $end parameters are not integers. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the tokens passed do not exist in the $phpcsFile. - * @throws \PHPCSUtils\Exceptions\LogicException If $end pointer is before the $start pointer. - */ - public static function getDoubleArrowPtr(File $phpcsFile, $start, $end) - { - $tokens = $phpcsFile->getTokens(); - - if (\is_int($start) === false) { - throw TypeError::create(2, '$start', 'integer', $start); - } - - if (\is_int($end) === false) { - throw TypeError::create(3, '$end', 'integer', $end); - } - - if (isset($tokens[$start]) === false) { - throw OutOfBoundsStackPtr::create(2, '$start', $start); - } - - if (isset($tokens[$end]) === false) { - throw OutOfBoundsStackPtr::create(3, '$end', $end); - } - - if ($start > $end) { - throw LogicException::create( - \sprintf('The $start token must be before the $end token. Received: $start %d, $end %d', $start, $end) - ); - } - - $cacheId = "$start-$end"; - if (Cache::isCached($phpcsFile, __METHOD__, $cacheId) === true) { - return Cache::get($phpcsFile, __METHOD__, $cacheId); - } - - $targets = self::$doubleArrowTargets; - $targets += Collections::closedScopes(); - - $doubleArrow = ($start - 1); - $returnValue = false; - ++$end; - do { - $doubleArrow = $phpcsFile->findNext( - $targets, - ($doubleArrow + 1), - $end - ); - - if ($doubleArrow === false) { - break; - } - - if ($tokens[$doubleArrow]['code'] === \T_DOUBLE_ARROW) { - $returnValue = $doubleArrow; - break; - } - - // Skip over closed scopes which may contain foreach structures or generators. - if ((isset(Collections::closedScopes()[$tokens[$doubleArrow]['code']]) === true - || $tokens[$doubleArrow]['code'] === \T_FN - || $tokens[$doubleArrow]['code'] === \T_MATCH) - && isset($tokens[$doubleArrow]['scope_closer']) === true - ) { - $doubleArrow = $tokens[$doubleArrow]['scope_closer']; - continue; - } - - // Skip over attributes which may contain arrays as a passed parameters. - if ($tokens[$doubleArrow]['code'] === \T_ATTRIBUTE - && isset($tokens[$doubleArrow]['attribute_closer']) - ) { - $doubleArrow = $tokens[$doubleArrow]['attribute_closer']; - continue; - } - - // Skip over potentially keyed long lists. - if ($tokens[$doubleArrow]['code'] === \T_LIST - && isset($tokens[$doubleArrow]['parenthesis_closer']) - ) { - $doubleArrow = $tokens[$doubleArrow]['parenthesis_closer']; - continue; - } - - // Start of nested long/short array. - break; - } while ($doubleArrow < $end); - - Cache::set($phpcsFile, __METHOD__, $cacheId, $returnValue); - return $returnValue; - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/AttributeBlock.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/AttributeBlock.php deleted file mode 100644 index 75e31d0..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/AttributeBlock.php +++ /dev/null @@ -1,292 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2025 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Utils; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Exceptions\OutOfBoundsStackPtr; -use PHPCSUtils\Exceptions\TypeError; -use PHPCSUtils\Exceptions\UnexpectedTokenType; -use PHPCSUtils\Internal\Cache; -use PHPCSUtils\Tokens\Collections; - -/** - * Utility functions to retrieve information related to attributes. - * - * @since 1.2.0 - */ -final class AttributeBlock -{ - - /** - * Given an attribute opener, find the relevant construct token the attribute applies to. - * - * @since 1.2.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the T_ATTRIBUTE (attribute opener) token. - * - * @return int|false The stackPtr to the OO, function, closure, fn, constant, or variable token the attribute block - * applies to; or FALSE if the attribute target could not be determined. - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $stackPtr parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the token passed does not exist in the $phpcsFile. - * @throws \PHPCSUtils\Exceptions\UnexpectedTokenType If the token passed is not an attribute token and - * not within an attribute. - */ - public static function appliesTo(File $phpcsFile, $stackPtr) - { - static $allowedTokens; - - $tokens = $phpcsFile->getTokens(); - - if (\is_int($stackPtr) === false) { - throw TypeError::create(2, '$stackPtr', 'integer', $stackPtr); - } - - if (isset($tokens[$stackPtr]) === false) { - throw OutOfBoundsStackPtr::create(2, '$stackPtr', $stackPtr); - } - - if ($tokens[$stackPtr]['code'] !== \T_ATTRIBUTE - && $tokens[$stackPtr]['code'] !== \T_ATTRIBUTE_END - && Context::inAttribute($phpcsFile, $stackPtr) === false - ) { - $acceptedTokens = 'T_ATTRIBUTE, T_ATTRIBUTE_END or a token within an attribute'; - throw UnexpectedTokenType::create(2, '$stackPtr', $acceptedTokens, $tokens[$stackPtr]['type']); - } - - if (isset($tokens[$stackPtr]['attribute_closer']) === false) { - return false; - } - - if (Cache::isCached($phpcsFile, __METHOD__, $stackPtr) === true) { - return Cache::get($phpcsFile, __METHOD__, $stackPtr); - } - - $attributeTarget = false; - - if (isset($allowedTokens) === false) { - /* - * Allow every type of token which could be encountered between the attribute and the target construct, - * even though some are only allowed in specific circumstances or for specific constructs. - * That, however, is not a concern for this method. - * Parse error tolerance prevails to give sniffs the most flexibility. - */ - $allowedTokens = Tokens::$emptyTokens; - - // OO constants. - $allowedTokens += Collections::constantModifierKeywords(); - - // Functions, closures, arrow functions and methods. - $allowedTokens += [\T_STATIC => \T_STATIC]; - $allowedTokens += Tokens::$methodPrefixes; - - // OO declarations. - $allowedTokens += Collections::classModifierKeywords(); - - // Properties and parameters - $allowedTokens += [\T_NULLABLE => \T_NULLABLE]; - $allowedTokens += Collections::propertyModifierKeywords(); - $allowedTokens += Collections::propertyTypeTokens(); - $allowedTokens += Collections::parameterTypeTokens(); - $allowedTokens += [ - \T_BITWISE_AND => \T_BITWISE_AND, - \T_ELLIPSIS => \T_ELLIPSIS, - ]; - } - - for ($i = ($tokens[$stackPtr]['attribute_closer'] + 1); $i <= $phpcsFile->numTokens; $i++) { - // Skip over potentially large docblocks. - if ($tokens[$i]['code'] === \T_DOC_COMMENT_OPEN_TAG - && isset($tokens[$i]['comment_closer']) - ) { - $i = $tokens[$i]['comment_closer']; - continue; - } - - if ($tokens[$i]['code'] === \T_ATTRIBUTE - && isset($tokens[$i]['attribute_closer']) === true - ) { - $i = $tokens[$i]['attribute_closer']; - continue; - } - - if (isset($allowedTokens[$tokens[$i]['code']])) { - continue; - } - - // Okay, so this _must_ be the token for the construct. - if (isset(Tokens::$ooScopeTokens[$tokens[$i]['code']]) === true - || isset(Collections::functionDeclarationTokens()[$tokens[$i]['code']]) === true - || $tokens[$i]['code'] === \T_CONST - || $tokens[$i]['code'] === \T_VARIABLE - ) { - $attributeTarget = $i; - } - - break; - } - - Cache::set($phpcsFile, __METHOD__, $stackPtr, $attributeTarget); - return $attributeTarget; - } - - /** - * Retrieve information on each attribute instantiation within an attribute block. - * - * @since 1.2.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the T_ATTRIBUTE (attribute opener) token. - * - * @return array<array<string, int|string|false>> - * A multi-dimentional array with information on each attribute instantiation in the block. - * The information gathered about each attribute instantiation is in the following format: - * ```php - * array( - * 'name' => string, // The full name of the attribute being instantiated. - * // This will be name as passed without namespace resolution. - * 'name_token' => int, // The stack pointer to the last token in the attribute name. - * // Pro-tip: this token can be passed on to the methods in the - * // {@see PassedParameters} class to retrieve the - * // parameters passed to the attribute constructor. - * 'start' => int, // The stack pointer to the first token in the attribute instantiation. - * // Note: this may be a leading whitespace/comment token. - * 'end' => int, // The stack pointer to the last token in the attribute instantiation. - * // Note: this may be a trailing whitespace/comment token. - * 'comma_token' => int|false, // The stack pointer to the comma after the attribute instantiation - * // or FALSE if this is the last attribute and there is no comma. - * ) - * ``` - * If no attributes are found, an empty array will be returned. - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $stackPtr parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the token passed does not exist in the $phpcsFile. - * @throws \PHPCSUtils\Exceptions\UnexpectedTokenType If the token passed is not a `T_ATTRIBUTE` token. - */ - public static function getAttributes(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (\is_int($stackPtr) === false) { - throw TypeError::create(2, '$stackPtr', 'integer', $stackPtr); - } - - if (isset($tokens[$stackPtr]) === false) { - throw OutOfBoundsStackPtr::create(2, '$stackPtr', $stackPtr); - } - - if ($tokens[$stackPtr]['code'] !== \T_ATTRIBUTE) { - throw UnexpectedTokenType::create(2, '$stackPtr', 'T_ATTRIBUTE', $tokens[$stackPtr]['type']); - } - - if (isset($tokens[$stackPtr]['attribute_closer']) === false) { - return []; - } - - if (Cache::isCached($phpcsFile, __METHOD__, $stackPtr) === true) { - return Cache::get($phpcsFile, __METHOD__, $stackPtr); - } - - $opener = $stackPtr; - $closer = $tokens[$stackPtr]['attribute_closer']; - - $attributes = []; - $currentName = ''; - $nameToken = null; - $start = ($opener + 1); - - for ($i = ($opener + 1); $i <= $closer; $i++) { - // Skip over potentially large docblocks. - if ($tokens[$i]['code'] === \T_DOC_COMMENT_OPEN_TAG - && isset($tokens[$i]['comment_closer']) - ) { - $i = $tokens[$i]['comment_closer']; - continue; - } - - if (isset(Tokens::$emptyTokens[$tokens[$i]['code']])) { - continue; - } - - if (isset(Collections::namespacedNameTokens()[$tokens[$i]['code']])) { - $currentName .= $tokens[$i]['content']; - $nameToken = $i; - continue; - } - - if ($tokens[$i]['code'] === \T_OPEN_PARENTHESIS - && isset($tokens[$i]['parenthesis_closer']) === true - ) { - // Skip over whatever is passed to the Attribute constructor. - $i = $tokens[$i]['parenthesis_closer']; - continue; - } - - if ($tokens[$i]['code'] === \T_COMMA - || $i === $closer - ) { - // We've reached the end of the name. - if ($currentName === '') { - // Parse error. Stop parsing this attribute block. - break; - } - - $attributes[] = [ - 'name' => $currentName, - 'name_token' => $nameToken, - 'start' => $start, - 'end' => ($i - 1), - 'comma_token' => ($tokens[$i]['code'] === \T_COMMA ? $i : false), - ]; - - if ($i === $closer) { - break; - } - - // Check if there are more tokens before the attribute closer. - // Prevents atrtibute blocks with trailing comma's from setting an extra attribute. - $hasNext = $phpcsFile->findNext(Tokens::$emptyTokens, ($i + 1), $closer, true); - if ($hasNext === false) { - break; - } - - // Prepare for the next attribute instantiation. - $currentName = ''; - $nameToken = null; - $start = ($i + 1); - } - } - - Cache::set($phpcsFile, __METHOD__, $stackPtr, $attributes); - return $attributes; - } - - /** - * Count the number of attributes being instantiated in an attribute block. - * - * @since 1.2.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the T_ATTRIBUTE (attribute opener) token. - * - * @return int - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $stackPtr parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the token passed does not exist in the $phpcsFile. - * @throws \PHPCSUtils\Exceptions\UnexpectedTokenType If the token passed is not a `T_ATTRIBUTE` token. - */ - public static function countAttributes(File $phpcsFile, $stackPtr) - { - return \count(self::getAttributes($phpcsFile, $stackPtr)); - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Conditions.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Conditions.php deleted file mode 100644 index 76f0e88..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Conditions.php +++ /dev/null @@ -1,156 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2020 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Utils; - -use PHP_CodeSniffer\Files\File; - -/** - * Utility functions for use when examining token conditions. - * - * @since 1.0.0 The `Conditions::getCondition()` and `Conditions::hasCondition()` - * methods are based on and inspired by the methods of the same name in the - * PHPCS native `PHP_CodeSniffer\Files\File` class. - * Also see {@see \PHPCSUtils\BackCompat\BCFile}. - */ -final class Conditions -{ - - /** - * Retrieve the position of a condition for the passed token. - * - * If no types are specified, the first condition for the token - or if `$first=false`, - * the last condition - will be returned. - * - * Main differences with the PHPCS version: - * - The singular `$type` parameter has become the more flexible `$types` parameter allowing to - * search for several types of conditions in one go. - * - The `$types` parameter is now optional. - * - * @see \PHP_CodeSniffer\Files\File::getCondition() Original source. - * @see \PHPCSUtils\BackCompat\BCFile::getCondition() Cross-version compatible version of the original. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the token we are checking. - * @param int|string|array<int|string> $types Optional. The type(s) of tokens to search for. - * @param bool $first Optional. Whether to search for the first (outermost) - * (`true`) or the last (innermost) condition (`false`) of - * the specified type(s). - * - * @return int|false Integer stack pointer to the condition; or `FALSE` if the token - * does not have the condition or has no conditions at all. - */ - public static function getCondition(File $phpcsFile, $stackPtr, $types = [], $first = true) - { - $tokens = $phpcsFile->getTokens(); - - // Check for the existence of the token. - if (isset($tokens[$stackPtr]) === false) { - return false; - } - - // Make sure the token has conditions. - if (empty($tokens[$stackPtr]['conditions'])) { - return false; - } - - $types = (array) $types; - $conditions = $tokens[$stackPtr]['conditions']; - - if (empty($types) === true) { - // No types specified, just return the first/last condition pointer. - if ($first === false) { - \end($conditions); - } else { - \reset($conditions); - } - - return \key($conditions); - } - - if ($first === false) { - $conditions = \array_reverse($conditions, true); - } - - foreach ($conditions as $ptr => $type) { - if (isset($tokens[$ptr]) === true - && \in_array($type, $types, true) === true - ) { - // We found a token with the required type. - return $ptr; - } - } - - return false; - } - - /** - * Determine if the passed token has a condition of one of the passed types. - * - * This method is not significantly different from the PHPCS native version. - * - * @see \PHP_CodeSniffer\Files\File::hasCondition() Original source. - * @see \PHPCSUtils\BackCompat\BCFile::hasCondition() Cross-version compatible version of the original. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the token we are checking. - * @param int|string|array<int|string> $types The type(s) of tokens to search for. - * - * @return bool - */ - public static function hasCondition(File $phpcsFile, $stackPtr, $types) - { - return (self::getCondition($phpcsFile, $stackPtr, $types) !== false); - } - - /** - * Return the position of the first (outermost) condition of a certain type for the passed token. - * - * If no types are specified, the first condition for the token, independently of type, - * will be returned. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position of the token we are checking. - * @param int|string|array<int|string> $types Optional. The type(s) of tokens to search for. - * - * @return int|false Integer stack pointer to the condition; or `FALSE` if the token - * does not have the condition or has no conditions at all. - */ - public static function getFirstCondition(File $phpcsFile, $stackPtr, $types = []) - { - return self::getCondition($phpcsFile, $stackPtr, $types, true); - } - - /** - * Return the position of the last (innermost) condition of a certain type for the passed token. - * - * If no types are specified, the last condition for the token, independently of type, - * will be returned. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position of the token we are checking. - * @param int|string|array<int|string> $types Optional. The type(s) of tokens to search for. - * - * @return int|false Integer stack pointer to the condition; or `FALSE` if the token - * does not have the condition or has no conditions at all. - */ - public static function getLastCondition(File $phpcsFile, $stackPtr, $types = []) - { - return self::getCondition($phpcsFile, $stackPtr, $types, false); - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Constants.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Constants.php deleted file mode 100644 index 82e3e2d..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Constants.php +++ /dev/null @@ -1,217 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2020 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Utils; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Exceptions\OutOfBoundsStackPtr; -use PHPCSUtils\Exceptions\TypeError; -use PHPCSUtils\Exceptions\UnexpectedTokenType; -use PHPCSUtils\Exceptions\ValueError; -use PHPCSUtils\Internal\AttributeHelper; -use PHPCSUtils\Internal\Cache; -use PHPCSUtils\Tokens\Collections; -use PHPCSUtils\Utils\Scopes; - -/** - * Utility functions for use when examining constants declared using the "const" keyword. - * - * @since 1.1.0 - */ -final class Constants -{ - - /** - * Retrieve the visibility and implementation properties of an OO constant. - * - * @since 1.1.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position in the stack of the `T_CONST` token - * to acquire the properties for. - * - * @return array<string, string|int|bool> Array with information about the constant declaration. - * The format of the return value is: - * ```php - * array( - * 'scope' => string, // Public, private, or protected. - * 'scope_token' => integer|false, // The stack pointer to the scope keyword or - * // FALSE if the scope was not explicitly specified. - * 'is_final' => boolean, // TRUE if the final keyword was found. - * 'final_token' => integer|false, // The stack pointer to the final keyword - * // or FALSE if the const is not declared final. - * 'type' => string, // The type of the const (empty if no type specified). - * 'type_token' => integer|false, // The stack pointer to the start of the type - * // or FALSE if there is no type. - * 'type_end_token' => integer|false, // The stack pointer to the end of the type - * // or FALSE if there is no type. - * 'nullable_type' => boolean, // TRUE if the type is preceded by the - * // nullability operator. - * 'name_token' => integer, // The stack pointer to the constant name. - * // Note: for group declarations this points to the - * // name of the first constant. - * 'equal_token' => integer, // The stack pointer to the equal sign. - * // Note: for group declarations this points to the - * // equal sign of the first constant. - * ); - * ``` - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $stackPtr parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the token passed does not exist in the $phpcsFile. - * @throws \PHPCSUtils\Exceptions\UnexpectedTokenType If the token passed is not a `T_CONST` token. - * @throws \PHPCSUtils\Exceptions\ValueError If the specified position is not an OO constant. - */ - public static function getProperties(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (\is_int($stackPtr) === false) { - throw TypeError::create(2, '$stackPtr', 'integer', $stackPtr); - } - - if (isset($tokens[$stackPtr]) === false) { - throw OutOfBoundsStackPtr::create(2, '$stackPtr', $stackPtr); - } - - if ($tokens[$stackPtr]['code'] !== \T_CONST) { - throw UnexpectedTokenType::create(2, '$stackPtr', 'T_CONST', $tokens[$stackPtr]['type']); - } - - if (Scopes::isOOConstant($phpcsFile, $stackPtr) === false) { - throw ValueError::create(2, '$stackPtr', 'must be the pointer to an OO constant'); - } - - if (Cache::isCached($phpcsFile, __METHOD__, $stackPtr) === true) { - return Cache::get($phpcsFile, __METHOD__, $stackPtr); - } - - $find = [\T_EQUAL, \T_SEMICOLON, \T_OPEN_CURLY_BRACKET, \T_CLOSE_CURLY_BRACKET, \T_CLOSE_TAG]; - $assignmentPtr = $phpcsFile->findNext($find, ($stackPtr + 1)); - if ($assignmentPtr === false || $tokens[$assignmentPtr]['code'] !== \T_EQUAL) { - // Probably a parse error. Don't cache the result. - throw ValueError::create(2, '$stackPtr', 'must be the pointer to an OO constant'); - } - - $namePtr = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($assignmentPtr - 1), ($stackPtr + 1), true); - - $returnValue = [ - 'scope' => 'public', - 'scope_token' => false, - 'is_final' => false, - 'final_token' => false, - 'type' => '', - 'type_token' => false, - 'type_end_token' => false, - 'nullable_type' => false, - 'name_token' => $namePtr, - 'equal_token' => $assignmentPtr, - ]; - - for ($i = ($stackPtr - 1);; $i--) { - // Skip over potentially large docblocks. - if ($tokens[$i]['code'] === \T_DOC_COMMENT_CLOSE_TAG - && isset($tokens[$i]['comment_opener']) - ) { - $i = $tokens[$i]['comment_opener']; - continue; - } - - if (isset(Tokens::$emptyTokens[$tokens[$i]['code']]) === true) { - continue; - } - - switch ($tokens[$i]['code']) { - case \T_PUBLIC: - $returnValue['scope'] = 'public'; - $returnValue['scope_token'] = $i; - break; - - case \T_PROTECTED: - $returnValue['scope'] = 'protected'; - $returnValue['scope_token'] = $i; - break; - - case \T_PRIVATE: - $returnValue['scope'] = 'private'; - $returnValue['scope_token'] = $i; - break; - - case \T_FINAL: - $returnValue['is_final'] = true; - $returnValue['final_token'] = $i; - break; - - default: - // Any other token means that the start of the statement has been reached. - break 2; - } - } - - $type = ''; - $typeToken = false; - $typeEndToken = false; - $constantTypeTokens = Collections::constantTypeTokens(); - - // Now, let's check for a type. - for ($i = ($stackPtr + 1); $i < $namePtr; $i++) { - if (isset(Tokens::$emptyTokens[$tokens[$i]['code']]) === true) { - continue; - } - - if ($tokens[$i]['code'] === \T_NULLABLE) { - $returnValue['nullable_type'] = true; - continue; - } - - if (isset($constantTypeTokens[$tokens[$i]['code']]) === true) { - $typeEndToken = $i; - if ($typeToken === false) { - $typeToken = $i; - } - - $type .= $tokens[$i]['content']; - } - } - - if ($type !== '' && $returnValue['nullable_type'] === true) { - $type = '?' . $type; - } - - $returnValue['type'] = $type; - $returnValue['type_token'] = $typeToken; - $returnValue['type_end_token'] = $typeEndToken; - - Cache::set($phpcsFile, __METHOD__, $stackPtr, $returnValue); - return $returnValue; - } - - /** - * Retrieve the stack pointers to the attribute openers for any attribute block - * which applies to the constant declaration. - * - * @since 1.2.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position in the stack of the `T_CONST` token - * to acquire the attributes for. - * - * @return array<int> Array with the stack pointers to the applicable attribute openers - * or an empty array if there are no attributes attached to the constant declaration. - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $stackPtr parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the token passed does not exist in the $phpcsFile. - * @throws \PHPCSUtils\Exceptions\UnexpectedTokenType If the token passed is not a `T_CONST` token. - */ - public static function getAttributeOpeners(File $phpcsFile, $stackPtr) - { - return AttributeHelper::getOpeners($phpcsFile, $stackPtr, 'constant'); - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Context.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Context.php deleted file mode 100644 index 98bcdda..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Context.php +++ /dev/null @@ -1,248 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2020 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Utils; - -use PHP_CodeSniffer\Files\File; -use PHPCSUtils\Utils\Parentheses; - -/** - * Utility functions for examining in which context a certain token is used. - * - * Example use-cases: - * - A sniff looking for the use of certain variables may want to disregard the "use" - * of these variables within a call to `isset()` or `empty()`. - * - A sniff looking for incrementor/decrementors may want to disregard these when used - * as the third expression in a `for()` condition. - * - * @since 1.0.0 - */ -final class Context -{ - - /** - * Check whether an arbitrary token is within a call to empty(). - * - * _This method is a thin, descriptive wrapper around the {@see Parentheses::getLastOwner()} method. - * For more complex/combined queries, it is recommended to call the {@see Parentheses::getLastOwner()} - * method directly._ - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the token we are checking. - * - * @return bool - */ - public static function inEmpty(File $phpcsFile, $stackPtr) - { - return (Parentheses::getLastOwner($phpcsFile, $stackPtr, \T_EMPTY) !== false); - } - - /** - * Check whether an arbitrary token is within a call to isset(). - * - * _This method is a thin, descriptive wrapper around the {@see Parentheses::getLastOwner()} method. - * For more complex/combined queries, it is recommended to call the {@see Parentheses::getLastOwner()} - * method directly._ - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the token we are checking. - * - * @return bool - */ - public static function inIsset(File $phpcsFile, $stackPtr) - { - return (Parentheses::getLastOwner($phpcsFile, $stackPtr, \T_ISSET) !== false); - } - - /** - * Check whether an arbitrary token is within a call to unset(). - * - * _This method is a thin, descriptive wrapper around the {@see Parentheses::getLastOwner()} method. - * For more complex/combined queries, it is recommended to call the {@see Parentheses::getLastOwner()} - * method directly._ - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the token we are checking. - * - * @return bool - */ - public static function inUnset(File $phpcsFile, $stackPtr) - { - return (Parentheses::getLastOwner($phpcsFile, $stackPtr, \T_UNSET) !== false); - } - - /** - * Check whether an arbitrary token is within an attribute. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the token we are checking. - * - * @return bool - */ - public static function inAttribute(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Check for the existence of the token. - if (isset($tokens[$stackPtr]) === false) { - return false; - } - - if (isset($tokens[$stackPtr]['attribute_opener'], $tokens[$stackPtr]['attribute_closer']) === false) { - return false; - } - - return ($stackPtr !== $tokens[$stackPtr]['attribute_opener'] - && $stackPtr !== $tokens[$stackPtr]['attribute_closer']); - } - - /** - * Check whether an arbitrary token is in a foreach condition and if so, in which part: - * before or after the "as". - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the token we are checking. - * - * @return string|false String `'beforeAs'`, `'as'` or `'afterAs'` when the token is within - * a `foreach` condition. - * `FALSE` in all other cases, including for parse errors. - */ - public static function inForeachCondition(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Check for the existence of the token. - if (isset($tokens[$stackPtr]) === false) { - return false; - } - - $foreach = Parentheses::getLastOwner($phpcsFile, $stackPtr, \T_FOREACH); - if ($foreach === false) { - return false; - } - - $opener = $tokens[$foreach]['parenthesis_opener']; - $closer = $tokens[$foreach]['parenthesis_closer']; - - for ($i = ($opener + 1); $i < $closer; $i++) { - // Skip past a short array declaration in the "before as" part. - if (isset($tokens[$i]['bracket_closer'])) { - $i = $tokens[$i]['bracket_closer']; - continue; - } - - // Skip past a long array declaration in the "before as" part. - if (isset($tokens[$i]['parenthesis_closer'])) { - $i = $tokens[$i]['parenthesis_closer']; - continue; - } - - if ($tokens[$i]['code'] === \T_AS) { - $asPtr = $i; - break; - } - } - - if (isset($asPtr) === false) { - // Parse error or live coding. - return false; - } - - if ($asPtr === $stackPtr) { - return 'as'; - } - - if ($stackPtr < $asPtr) { - return 'beforeAs'; - } - - return 'afterAs'; - } - - /** - * Check whether an arbitrary token is in a for condition and if so, in which part: - * the first, second or third expression. - * - * Note: the semicolons separating the conditions are regarded as belonging with the - * expression before it. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the token we are checking. - * - * @return string|false String `'expr1'`, `'expr2'` or `'expr3'` when the token is within - * a `for` condition. - * `FALSE` in all other cases, including for parse errors. - */ - public static function inForCondition(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Check for the existence of the token. - if (isset($tokens[$stackPtr]) === false) { - return false; - } - - $for = Parentheses::getLastOwner($phpcsFile, $stackPtr, \T_FOR); - if ($for === false) { - return false; - } - - $semicolons = []; - $count = 0; - $opener = $tokens[$for]['parenthesis_opener']; - $closer = $tokens[$for]['parenthesis_closer']; - $level = $tokens[$for]['level']; - $parens = 1; - - if (isset($tokens[$for]['nested_parenthesis'])) { - $parens = (\count($tokens[$for]['nested_parenthesis']) + 1); - } - - for ($i = ($opener + 1); $i < $closer; $i++) { - if ($tokens[$i]['code'] !== \T_SEMICOLON) { - continue; - } - - if ($tokens[$i]['level'] !== $level - || \count($tokens[$i]['nested_parenthesis']) !== $parens - ) { - // Disregard semicolons at lower nesting/condition levels. - continue; - } - - ++$count; - $semicolons[$count] = $i; - } - - if ($count !== 2) { - return false; - } - - foreach ($semicolons as $key => $ptr) { - if ($stackPtr <= $ptr) { - return 'expr' . $key; - } - } - - return 'expr3'; - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/ControlStructures.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/ControlStructures.php deleted file mode 100644 index e8d8169..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/ControlStructures.php +++ /dev/null @@ -1,285 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2020 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Utils; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Exceptions\OutOfBoundsStackPtr; -use PHPCSUtils\Exceptions\TypeError; -use PHPCSUtils\Exceptions\UnexpectedTokenType; -use PHPCSUtils\Tokens\Collections; - -/** - * Utility functions for use when examining control structures. - * - * @since 1.0.0 - */ -final class ControlStructures -{ - - /** - * Check whether a control structure has a body. - * - * Some control structures - `while`, `for` and `declare` - can be declared without a body, like: - * ```php - * while (++$i < 10); - * ``` - * - * All other control structures will always have a body, though the body may be empty, where "empty" means: - * no _code_ is found in the body. If a control structure body only contains a comment, it will be - * regarded as empty. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the token we are checking. - * @param bool $allowEmpty Whether a control structure with an empty body should - * still be considered as having a body. - * Defaults to `true`. - * - * @return bool `TRUE` when the control structure has a body, or in case `$allowEmpty` is set to `FALSE`: - * when it has a non-empty body. - * `FALSE` in all other cases, including when a non-control structure token has been passed. - */ - public static function hasBody(File $phpcsFile, $stackPtr, $allowEmpty = true) - { - $tokens = $phpcsFile->getTokens(); - - // Check for the existence of the token. - if (isset($tokens[$stackPtr]) === false - || isset(Collections::controlStructureTokens()[$tokens[$stackPtr]['code']]) === false - ) { - return false; - } - - // Handle `else if`. - if ($tokens[$stackPtr]['code'] === \T_ELSE && isset($tokens[$stackPtr]['scope_opener']) === false) { - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($next !== false && $tokens[$next]['code'] === \T_IF) { - $stackPtr = $next; - } - } - - /* - * The scope markers are set. This is the simplest situation. - */ - if (isset($tokens[$stackPtr]['scope_opener']) === true) { - if ($allowEmpty === true) { - return true; - } - - // Check whether the body is empty. - $start = ($tokens[$stackPtr]['scope_opener'] + 1); - $end = $phpcsFile->numTokens; - if (isset($tokens[$stackPtr]['scope_closer']) === true) { - $end = $tokens[$stackPtr]['scope_closer']; - } - - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, $start, $end, true); - if ($nextNonEmpty !== false) { - return true; - } - - return false; - } - - /* - * Control structure without scope markers. - * Either single line statement or inline control structure. - * - * - Single line statement doesn't have a body and is therefore always empty. - * - Inline control structure has to have a body and can never be empty. - * - * This code also needs to take live coding into account where a scope opener is found, but - * no scope closer. - */ - $searchStart = ($stackPtr + 1); - if (isset($tokens[$stackPtr]['parenthesis_closer']) === true) { - $searchStart = ($tokens[$stackPtr]['parenthesis_closer'] + 1); - } - - $nextNonEmpty = $phpcsFile->findNext( - Tokens::$emptyTokens, - $searchStart, - null, - true - ); - if ($nextNonEmpty === false - || $tokens[$nextNonEmpty]['code'] === \T_SEMICOLON - || $tokens[$nextNonEmpty]['code'] === \T_CLOSE_TAG - ) { - // Parse error or single line statement. - return false; - } - - if ($tokens[$nextNonEmpty]['code'] === \T_OPEN_CURLY_BRACKET) { - if ($allowEmpty === true) { - return true; - } - - // Unrecognized scope opener due to parse error. - $nextNext = $phpcsFile->findNext( - Tokens::$emptyTokens, - ($nextNonEmpty + 1), - null, - true - ); - - if ($nextNext === false) { - return false; - } - - return true; - } - - return true; - } - - /** - * Check whether an IF or ELSE token is part of an "else if". - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the token we are checking. - * - * @return bool - */ - public static function isElseIf(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Check for the existence of the token. - if (isset($tokens[$stackPtr]) === false) { - return false; - } - - if ($tokens[$stackPtr]['code'] === \T_ELSEIF) { - return true; - } - - if ($tokens[$stackPtr]['code'] !== \T_ELSE && $tokens[$stackPtr]['code'] !== \T_IF) { - return false; - } - - if ($tokens[$stackPtr]['code'] === \T_ELSE && isset($tokens[$stackPtr]['scope_opener']) === true) { - return false; - } - - switch ($tokens[$stackPtr]['code']) { - case \T_ELSE: - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($next !== false && $tokens[$next]['code'] === \T_IF) { - return true; - } - break; - - case \T_IF: - $previous = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($previous !== false && $tokens[$previous]['code'] === \T_ELSE) { - return true; - } - break; - } - - return false; - } - - /** - * Retrieve the exception(s) being caught in a CATCH condition. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the token we are checking. - * - * @return array<int, array<string, string|int>> - * Array with information about the caught Exception(s). - * The returned array will contain the following information for - * each caught exception: - * ```php - * 0 => array( - * 'type' => string, // The type declaration for the exception being caught. - * 'type_token' => integer, // The stack pointer to the start of the type declaration. - * 'type_end_token' => integer, // The stack pointer to the end of the type declaration. - * ) - * ``` - * In case of an invalid catch structure, the array may be empty. - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $stackPtr parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the token passed does not exist in the $phpcsFile. - * @throws \PHPCSUtils\Exceptions\UnexpectedTokenType If the token passed is not a `T_CATCH` token. - */ - public static function getCaughtExceptions(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (\is_int($stackPtr) === false) { - throw TypeError::create(2, '$stackPtr', 'integer', $stackPtr); - } - - if (isset($tokens[$stackPtr]) === false) { - throw OutOfBoundsStackPtr::create(2, '$stackPtr', $stackPtr); - } - - if ($tokens[$stackPtr]['code'] !== \T_CATCH) { - throw UnexpectedTokenType::create(2, '$stackPtr', 'T_CATCH', $tokens[$stackPtr]['type']); - } - - if (isset($tokens[$stackPtr]['parenthesis_opener'], $tokens[$stackPtr]['parenthesis_closer']) === false) { - return []; - } - - $opener = $tokens[$stackPtr]['parenthesis_opener']; - $closer = $tokens[$stackPtr]['parenthesis_closer']; - $exceptions = []; - - $foundName = ''; - $firstToken = null; - $lastToken = null; - - for ($i = ($opener + 1); $i <= $closer; $i++) { - if (isset(Tokens::$emptyTokens[$tokens[$i]['code']])) { - continue; - } - - if (isset(Collections::namespacedNameTokens()[$tokens[$i]['code']]) === false) { - // Add the current exception to the result array if one was found. - if ($foundName !== '') { - $exceptions[] = [ - 'type' => $foundName, - 'type_token' => $firstToken, - 'type_end_token' => $lastToken, - ]; - } - - if ($tokens[$i]['code'] === \T_BITWISE_OR) { - // Multi-catch. Reset and continue. - $foundName = ''; - $firstToken = null; - $lastToken = null; - continue; - } - - break; - } - - if (isset($firstToken) === false) { - $firstToken = $i; - } - - $foundName .= $tokens[$i]['content']; - $lastToken = $i; - } - - return $exceptions; - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/FileInfo.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/FileInfo.php deleted file mode 100644 index 7e4540e..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/FileInfo.php +++ /dev/null @@ -1,92 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2024 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Utils; - -use PHP_CodeSniffer\Files\File; - -/** - * Utility functions to retrieve information about the file under scan. - * - * @since 1.1.0 - */ -final class FileInfo -{ - - /** - * List of supported BOM definitions. - * - * Use encoding names as keys and hex BOM representations as values. - * - * @since 1.1.0 - * - * @var array<string, string> - */ - private static $bomDefinitions = [ - 'UTF-8' => 'efbbbf', - 'UTF-16 (BE)' => 'feff', - 'UTF-16 (LE)' => 'fffe', - ]; - - /** - * Determine whether the file under scan has a byte-order mark at the start. - * - * Inspired by similar code being used in a couple of PHPCS native sniffs. - * - * @since 1.1.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * - * @return string|false Name of the type of BOM found or FALSE when the file does not start with a BOM. - */ - public static function hasByteOrderMark(File $phpcsFile) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[0]['code'] !== \T_INLINE_HTML) { - return false; - } - - foreach (self::$bomDefinitions as $bomName => $expectedBomHex) { - $bomByteLength = (int) (\strlen($expectedBomHex) / 2); - $htmlBomHex = \bin2hex(\substr($tokens[0]['content'], 0, $bomByteLength)); - if ($htmlBomHex === $expectedBomHex) { - return $bomName; - } - } - - return false; - } - - /** - * Determine whether the file under scan has a shebang line at the start. - * - * @since 1.1.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * - * @return bool - */ - public static function hasSheBang(File $phpcsFile) - { - $tokens = $phpcsFile->getTokens(); - if ($tokens[0]['code'] !== \T_INLINE_HTML) { - return false; - } - - $start = 0; - $hasByteOrderMark = self::hasByteOrderMark($phpcsFile); - if ($hasByteOrderMark !== false) { - $start = (int) (\strlen(self::$bomDefinitions[$hasByteOrderMark]) / 2); - } - - return (\substr($tokens[0]['content'], $start, 2) === '#!'); - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/FilePath.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/FilePath.php deleted file mode 100644 index f08651f..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/FilePath.php +++ /dev/null @@ -1,154 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2024 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Utils; - -use PHP_CodeSniffer\Files\File; -use PHPCSUtils\Utils\TextStrings; - -/** - * Helper functions for working with arbitrary file/directory paths. - * - * Typically, these methods are useful for sniffs which examine the name of the file - * under scan and need to act differently depending on the path in which the file - * under scan is found. - * - * @see \PHP_CodeSniffer\Files\getFilename Retrieves the absolute path to the file under scan. - * @see \PHPCSUtils\BackCompat\getCommandLineData Can be used to retrieve "basepath" setting. - * - * @since 1.1.0 - */ -final class FilePath -{ - - /** - * Get the file name of the current file under scan. - * - * In contrast to the PHPCS native {@see \PHP_CodeSniffer\Files\getFilename()} method, - * the name returned by this method will have been normalized. - * - * @since 1.1.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * - * @return string The file name without surrounding quotes and with forward slashes - * as directory separators. - */ - public static function getName(File $phpcsFile) - { - // Usage of `stripQuotes` is to ensure `stdin_path` passed by IDEs does not include quotes. - $fileName = TextStrings::stripQuotes($phpcsFile->getFileName()); - if ($fileName !== 'STDIN') { - $fileName = self::normalizeAbsolutePath($fileName); - } - - return \trim($fileName); - } - - /** - * Check whether the input was received via STDIN. - * - * @since 1.1.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * - * @return bool - */ - public static function isStdin(File $phpcsFile) - { - return (self::getName($phpcsFile) === 'STDIN'); - } - - /** - * Normalize an absolute path to forward slashes and to include a trailing slash for directories. - * - * @since 1.1.0 - * - * @param string $path Absolute file or directory path. - * - * @return string - */ - public static function normalizeAbsolutePath($path) - { - return self::trailingSlashIt(self::normalizeDirectorySeparators($path)); - } - - /** - * Normalize all directory separators to be a forward slash. - * - * {@internal We cannot rely on the OS on which PHPCS is being run to determine the - * the expected slashes, as the file name could also come from a text string in a - * tokenized file or have been set by an IDE...} - * - * @since 1.1.0 - * - * @param string $path File or directory path. - * - * @return string - */ - public static function normalizeDirectorySeparators($path) - { - return \strtr((string) $path, '\\', '/'); - } - - /** - * Ensure that a directory path ends on a trailing slash. - * - * Includes safeguard against adding a trailing slash to path ending on a file name. - * - * @since 1.1.0 - * - * @param string $path File or directory path. - * - * @return string - */ - public static function trailingSlashIt($path) - { - if (\is_string($path) === false || $path === '') { - return ''; - } - - $extension = ''; - $lastChar = \substr($path, -1); - if ($lastChar !== '/' && $lastChar !== '\\') { - // This may be a file, check if it has a file extension. - $extension = \pathinfo($path, \PATHINFO_EXTENSION); - } - - if ($extension !== '') { - return $path; - } - - return \rtrim((string) $path, '/\\') . '/'; - } - - /** - * Check whether one file/directory path starts with another path. - * - * Recommended to be used only when both paths are absolute. - * - * Note: this function does not normalize paths prior to comparing them. - * If this is needed, normalization should be done prior to passing - * the `$haystack` and `$needle` parameters to this function. - * - * Also note that this function does a case-sensitive comparison as most OS-es are case-sensitive. - * - * @since 1.1.0 - * - * @param string $haystack Path to examine. - * @param string $needle Partial path which the haystack path should start with. - * - * @return bool - */ - public static function startsWith($haystack, $needle) - { - return (\strncmp($haystack, $needle, \strlen($needle)) === 0); - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/FunctionDeclarations.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/FunctionDeclarations.php deleted file mode 100644 index 53b8486..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/FunctionDeclarations.php +++ /dev/null @@ -1,894 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2020 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Utils; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Exceptions\OutOfBoundsStackPtr; -use PHPCSUtils\Exceptions\TypeError; -use PHPCSUtils\Exceptions\UnexpectedTokenType; -use PHPCSUtils\Exceptions\ValueError; -use PHPCSUtils\Internal\AttributeHelper; -use PHPCSUtils\Internal\Cache; -use PHPCSUtils\Tokens\Collections; -use PHPCSUtils\Utils\GetTokensAsString; -use PHPCSUtils\Utils\ObjectDeclarations; -use PHPCSUtils\Utils\Scopes; -use PHPCSUtils\Utils\UseStatements; - -/** - * Utility functions for use when examining function declaration statements. - * - * @since 1.0.0 The `FunctionDeclarations::getProperties()` and the - * `FunctionDeclarations::getParameters()` methods are based on and - * inspired by respectively the `getMethodProperties()` - * and `getMethodParameters()` methods in the PHPCS native - * `PHP_CodeSniffer\Files\File` class. - * Also see {@see \PHPCSUtils\BackCompat\BCFile}. - */ -final class FunctionDeclarations -{ - - /** - * A list of all PHP magic functions. - * - * The array keys contain the function names. The values contain the name without the double underscore. - * - * The function names are listed in lowercase as these function names in PHP are case-insensitive - * and comparisons against this list should therefore always be done in a case-insensitive manner. - * - * @since 1.0.0 - * - * @var array<string, string> - */ - public static $magicFunctions = [ - '__autoload' => 'autoload', - ]; - - /** - * A list of all PHP magic methods. - * - * The array keys contain the method names. The values contain the name without the double underscore. - * - * The method names are listed in lowercase as these method names in PHP are case-insensitive - * and comparisons against this list should therefore always be done in a case-insensitive manner. - * - * @since 1.0.0 - * - * @var array<string, string> - */ - public static $magicMethods = [ - '__construct' => 'construct', - '__destruct' => 'destruct', - '__call' => 'call', - '__callstatic' => 'callstatic', - '__get' => 'get', - '__set' => 'set', - '__isset' => 'isset', - '__unset' => 'unset', - '__sleep' => 'sleep', - '__wakeup' => 'wakeup', - '__tostring' => 'tostring', - '__set_state' => 'set_state', - '__clone' => 'clone', - '__invoke' => 'invoke', - '__debuginfo' => 'debuginfo', // PHP >= 5.6. - '__serialize' => 'serialize', // PHP >= 7.4. - '__unserialize' => 'unserialize', // PHP >= 7.4. - ]; - - /** - * A list of all PHP native non-magic methods starting with a double underscore. - * - * These come from PHP modules such as SOAPClient. - * - * The array keys are the method names, the values the name of the PHP class containing - * the function. - * - * The method names are listed in lowercase as function names in PHP are case-insensitive - * and comparisons against this list should therefore always be done in a case-insensitive manner. - * - * @since 1.0.0 - * - * @var array<string, string> - */ - public static $methodsDoubleUnderscore = [ - '__dorequest' => 'SOAPClient', - '__getcookies' => 'SOAPClient', - '__getfunctions' => 'SOAPClient', - '__getlastrequest' => 'SOAPClient', - '__getlastrequestheaders' => 'SOAPClient', - '__getlastresponse' => 'SOAPClient', - '__getlastresponseheaders' => 'SOAPClient', - '__gettypes' => 'SOAPClient', - '__setcookie' => 'SOAPClient', - '__setlocation' => 'SOAPClient', - '__setsoapheaders' => 'SOAPClient', - '__soapcall' => 'SOAPClient', - ]; - - /** - * Returns the declaration name for a function. - * - * Alias for the {@see \PHPCSUtils\Utils\ObjectDeclarations::getName()} method. - * - * @see \PHPCSUtils\BackCompat\BCFile::getDeclarationName() Original function. - * @see \PHPCSUtils\Utils\ObjectDeclarations::getName() PHPCSUtils native improved version. - * - * @since 1.0.0 - * - * @codeCoverageIgnore - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the function keyword token. - * - * @return string|null The name of the function; or `NULL` if the passed token doesn't exist, - * the function is anonymous or in case of a parse error/live coding. - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $stackPtr parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\UnexpectedTokenType If the token passed is not a `T_FUNCTION` token. - */ - public static function getName(File $phpcsFile, $stackPtr) - { - return ObjectDeclarations::getName($phpcsFile, $stackPtr); - } - - /** - * Retrieves the visibility and implementation properties of a method. - * - * Main differences with the PHPCS version: - * - Bugs fixed: - * - Handling of PHPCS annotations. - * - `"has_body"` index could be set to `true` for functions without body in the case of - * parse errors or live coding. - * - Defensive coding against incorrect calls to this method. - * - Defensive coding against incorrect results due to parse errors in the code under scan. - * - More efficient checking whether a function has a body. - * - Support for PHP 8.0 identifier name tokens in return types, cross-version PHP & PHPCS. - * - The results of this function call are cached during a PHPCS run for faster response times. - * - * @see \PHP_CodeSniffer\Files\File::getMethodProperties() Original source. - * @see \PHPCSUtils\BackCompat\BCFile::getMethodProperties() Cross-version compatible version of the original. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position in the stack of the function token to - * acquire the properties for. - * - * @return array<string, mixed> Array with information about a function declaration. - * The format of the return value is: - * ```php - * array( - * 'scope' => string, // Public, private, or protected - * 'scope_specified' => bool, // TRUE if the scope keyword was found. - * 'return_type' => string, // The return type of the method. - * 'return_type_token' => int|false, // The stack pointer to the start of the return type - * // or FALSE if there is no return type. - * 'return_type_end_token' => int|false, // The stack pointer to the end of the return type - * // or FALSE if there is no return type. - * 'nullable_return_type' => bool, // TRUE if the return type is preceded - * // by the nullability operator. - * 'is_abstract' => bool, // TRUE if the abstract keyword was found. - * 'is_final' => bool, // TRUE if the final keyword was found. - * 'is_static' => bool, // TRUE if the static keyword was found. - * 'has_body' => bool, // TRUE if the method has a body - * ); - * ``` - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $stackPtr parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the token passed does not exist in the $phpcsFile. - * @throws \PHPCSUtils\Exceptions\UnexpectedTokenType If the token passed is not a T_FUNCTION, T_CLOSURE - * or T_FN token. - */ - public static function getProperties(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (\is_int($stackPtr) === false) { - throw TypeError::create(2, '$stackPtr', 'integer', $stackPtr); - } - - if (isset($tokens[$stackPtr]) === false) { - throw OutOfBoundsStackPtr::create(2, '$stackPtr', $stackPtr); - } - - if (isset(Collections::functionDeclarationTokens()[$tokens[$stackPtr]['code']]) === false) { - throw UnexpectedTokenType::create(2, '$stackPtr', 'T_FUNCTION, T_CLOSURE or T_FN', $tokens[$stackPtr]['type']); - } - - if (Cache::isCached($phpcsFile, __METHOD__, $stackPtr) === true) { - return Cache::get($phpcsFile, __METHOD__, $stackPtr); - } - - if ($tokens[$stackPtr]['code'] === \T_FUNCTION) { - $valid = Tokens::$methodPrefixes; - } else { - $valid = [\T_STATIC => \T_STATIC]; - } - - $valid += Tokens::$emptyTokens; - - $scope = 'public'; - $scopeSpecified = false; - $isAbstract = false; - $isFinal = false; - $isStatic = false; - - for ($i = ($stackPtr - 1); $i > 0; $i--) { - if (isset($valid[$tokens[$i]['code']]) === false) { - break; - } - - switch ($tokens[$i]['code']) { - case \T_PUBLIC: - $scope = 'public'; - $scopeSpecified = true; - break; - case \T_PRIVATE: - $scope = 'private'; - $scopeSpecified = true; - break; - case \T_PROTECTED: - $scope = 'protected'; - $scopeSpecified = true; - break; - case \T_ABSTRACT: - $isAbstract = true; - break; - case \T_FINAL: - $isFinal = true; - break; - case \T_STATIC: - $isStatic = true; - break; - } - } - - $returnType = ''; - $returnTypeToken = false; - $returnTypeEndToken = false; - $nullableReturnType = false; - $hasBody = false; - $returnTypeTokens = Collections::returnTypeTokens(); - - $parenthesisCloser = null; - if (isset($tokens[$stackPtr]['parenthesis_closer']) === true) { - $parenthesisCloser = $tokens[$stackPtr]['parenthesis_closer']; - } - - if (isset($parenthesisCloser) === true) { - $scopeOpener = null; - if (isset($tokens[$stackPtr]['scope_opener']) === true) { - $scopeOpener = $tokens[$stackPtr]['scope_opener']; - } - - for ($i = $parenthesisCloser; $i < $phpcsFile->numTokens; $i++) { - if ($i === $scopeOpener) { - // End of function definition. - $hasBody = true; - break; - } - - if ($scopeOpener === null - && ($tokens[$i]['code'] === \T_SEMICOLON - || $tokens[$i]['code'] === \T_OPEN_CURLY_BRACKET) - ) { - // End of abstract/interface function definition. - break; - } - - if ($tokens[$i]['code'] === \T_USE) { - // Skip over closure use statements. - for ( - $j = ($i + 1); - $j < $phpcsFile->numTokens && isset(Tokens::$emptyTokens[$tokens[$j]['code']]) === true; - $j++ - ); - - if ($tokens[$j]['code'] === \T_OPEN_PARENTHESIS) { - if (isset($tokens[$j]['parenthesis_closer']) === false) { - // Live coding/parse error, stop parsing. - break; - } - - $i = $tokens[$j]['parenthesis_closer']; - continue; - } - } - - if ($tokens[$i]['code'] === \T_NULLABLE) { - $nullableReturnType = true; - } - - if (isset($returnTypeTokens[$tokens[$i]['code']]) === true) { - if ($returnTypeToken === false) { - $returnTypeToken = $i; - } - - $returnType .= $tokens[$i]['content']; - $returnTypeEndToken = $i; - } - } - } - - if ($returnType !== '' && $nullableReturnType === true) { - $returnType = '?' . $returnType; - } - - $returnValue = [ - 'scope' => $scope, - 'scope_specified' => $scopeSpecified, - 'return_type' => $returnType, - 'return_type_token' => $returnTypeToken, - 'return_type_end_token' => $returnTypeEndToken, - 'nullable_return_type' => $nullableReturnType, - 'is_abstract' => $isAbstract, - 'is_final' => $isFinal, - 'is_static' => $isStatic, - 'has_body' => $hasBody, - ]; - - Cache::set($phpcsFile, __METHOD__, $stackPtr, $returnValue); - return $returnValue; - } - - /** - * Retrieves the method parameters for the specified function token. - * - * Also supports passing in a `T_USE` token for a closure use group. - * - * The returned array will contain the following information for each parameter: - * - * ```php - * 0 => array( - * 'name' => string, // The variable name. - * 'token' => int, // The stack pointer to the variable name. - * 'content' => string, // The full content of the variable definition. - * 'has_attributes' => bool, // Does the parameter have one or more attributes attached ? - * 'pass_by_reference' => bool, // Is the variable passed by reference? - * 'reference_token' => int|false, // The stack pointer to the reference operator - * // or FALSE if the param is not passed by reference. - * 'variable_length' => bool, // Is the param of variable length through use of `...` ? - * 'variadic_token' => int|false, // The stack pointer to the ... operator - * // or FALSE if the param is not variable length. - * 'type_hint' => string, // The type hint for the variable. - * 'type_hint_token' => int|false, // The stack pointer to the start of the type hint - * // or FALSE if there is no type hint. - * 'type_hint_end_token' => int|false, // The stack pointer to the end of the type hint - * // or FALSE if there is no type hint. - * 'nullable_type' => bool, // TRUE if the var type is preceded by the nullability - * // operator. - * 'comma_token' => int|false, // The stack pointer to the comma after the param - * // or FALSE if this is the last param. - * ) - * ``` - * - * Parameters with default values have the following additional array indexes: - * ```php - * 'default' => string, // The full content of the default value. - * 'default_token' => int, // The stack pointer to the start of the default value. - * 'default_equal_token' => int, // The stack pointer to the equals sign. - * ``` - * - * Parameters declared using PHP 8 constructor property promotion, have these additional array indexes: - * ```php - * 'property_visibility' => string, // The property visibility as declared. - * 'visibility_token' => int|false, // The stack pointer to the visibility modifier token. - * // or FALSE if the visibility is not explicitly declared. - * 'property_readonly' => bool, // TRUE if the readonly keyword was found. - * 'readonly_token' => int, // The stack pointer to the readonly modifier token. - * // This index will only be set if the property is readonly. - * ``` - * - * ... and if the promoted property uses asymmetric visibility, these additional array indexes will also be available: - * ```php - * 'set_visibility' => string, // The property set-visibility as declared. - * 'set_visibility_token' => int, // The stack pointer to the set-visibility modifier token. - * ``` - * - * Main differences with the PHPCS version: - * - Defensive coding against incorrect calls to this method. - * - More efficient and more stable checking whether a `T_USE` token is a closure use. - * - More efficient and more stable looping of the default value. - * - Clearer exception message when a non-closure use token was passed to the function. - * - Support for PHP 8.0 identifier name tokens in parameter types, cross-version PHP & PHPCS. - * - The results of this function call are cached during a PHPCS run for faster response times. - * - * @see \PHP_CodeSniffer\Files\File::getMethodParameters() Original source. - * @see \PHPCSUtils\BackCompat\BCFile::getMethodParameters() Cross-version compatible version of the original. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position in the stack of the function token - * to acquire the parameters for. - * - * @return array<int, array<string, mixed>> - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $stackPtr parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the token passed does not exist in the $phpcsFile. - * @throws \PHPCSUtils\Exceptions\UnexpectedTokenType If the token passed is not a T_FUNCTION, T_CLOSURE, - * T_FN or T_USE token. - * @throws \PHPCSUtils\Exceptions\ValueError If a passed `T_USE` token is not a closure use token. - */ - public static function getParameters(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (\is_int($stackPtr) === false) { - throw TypeError::create(2, '$stackPtr', 'integer', $stackPtr); - } - - if (isset($tokens[$stackPtr]) === false) { - throw OutOfBoundsStackPtr::create(2, '$stackPtr', $stackPtr); - } - - if (isset(Collections::functionDeclarationTokens()[$tokens[$stackPtr]['code']]) === false - && $tokens[$stackPtr]['code'] !== \T_USE - ) { - $acceptedTokens = 'T_FUNCTION, T_CLOSURE, T_FN or T_USE'; - throw UnexpectedTokenType::create(2, '$stackPtr', $acceptedTokens, $tokens[$stackPtr]['type']); - } - - if ($tokens[$stackPtr]['code'] === \T_USE) { - // This will work PHPCS 3.x/4.x cross-version without much overhead. - $opener = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($opener === false - || $tokens[$opener]['code'] !== \T_OPEN_PARENTHESIS - || UseStatements::isClosureUse($phpcsFile, $stackPtr) === false - ) { - throw ValueError::create(2, '$stackPtr', 'must be the pointer to a closure use statement'); - } - } else { - if (isset($tokens[$stackPtr]['parenthesis_opener']) === false) { - // Live coding or syntax error, so no params to find. - return []; - } - - $opener = $tokens[$stackPtr]['parenthesis_opener']; - } - - if (isset($tokens[$opener]['parenthesis_closer']) === false) { - // Live coding or syntax error, so no params to find. - return []; - } - - if (Cache::isCached($phpcsFile, __METHOD__, $stackPtr) === true) { - return Cache::get($phpcsFile, __METHOD__, $stackPtr); - } - - $closer = $tokens[$opener]['parenthesis_closer']; - - $vars = []; - $currVar = null; - $paramStart = ($opener + 1); - $defaultStart = null; - $equalToken = null; - $paramCount = 0; - $hasAttributes = false; - $passByReference = false; - $referenceToken = false; - $variableLength = false; - $variadicToken = false; - $typeHint = ''; - $typeHintToken = false; - $typeHintEndToken = false; - $nullableType = false; - $visibilityToken = null; - $setVisibilityToken = null; - $readonlyToken = null; - - $parameterTypeTokens = Collections::parameterTypeTokens(); - - for ($i = $paramStart; $i <= $closer; $i++) { - if (isset($parameterTypeTokens[$tokens[$i]['code']]) === true - /* - * Self and parent are valid, static invalid, but was probably intended as type declaration. - * Note: constructor property promotion does not support static properties, so this should - * still be a valid assumption. - */ - || $tokens[$i]['code'] === \T_STATIC - ) { - if ($typeHintToken === false) { - $typeHintToken = $i; - } - - $typeHint .= $tokens[$i]['content']; - $typeHintEndToken = $i; - continue; - } - - switch ($tokens[$i]['code']) { - case \T_ATTRIBUTE: - $hasAttributes = true; - - // Skip to the end of the attribute. - $i = $tokens[$i]['attribute_closer']; - break; - - case \T_BITWISE_AND: - $passByReference = true; - $referenceToken = $i; - break; - - case \T_VARIABLE: - $currVar = $i; - break; - - case \T_ELLIPSIS: - $variableLength = true; - $variadicToken = $i; - break; - - case \T_NULLABLE: - $nullableType = true; - $typeHint .= $tokens[$i]['content']; - $typeHintEndToken = $i; - break; - - case \T_PUBLIC: - case \T_PROTECTED: - case \T_PRIVATE: - $visibilityToken = $i; - break; - - case \T_PUBLIC_SET: - case \T_PROTECTED_SET: - case \T_PRIVATE_SET: - $setVisibilityToken = $i; - break; - - case \T_READONLY: - $readonlyToken = $i; - break; - - case \T_CLOSE_PARENTHESIS: - case \T_COMMA: - // If it's null, then there must be no parameters for this - // method. - if ($currVar === null) { - continue 2; - } - - $vars[$paramCount] = []; - $vars[$paramCount]['token'] = $currVar; - $vars[$paramCount]['name'] = $tokens[$currVar]['content']; - $vars[$paramCount]['content'] = \trim( - GetTokensAsString::normal($phpcsFile, $paramStart, ($i - 1)) - ); - - if ($defaultStart !== null) { - $vars[$paramCount]['default'] = \trim( - GetTokensAsString::normal($phpcsFile, $defaultStart, ($i - 1)) - ); - $vars[$paramCount]['default_token'] = $defaultStart; - $vars[$paramCount]['default_equal_token'] = $equalToken; - } - - $vars[$paramCount]['has_attributes'] = $hasAttributes; - $vars[$paramCount]['pass_by_reference'] = $passByReference; - $vars[$paramCount]['reference_token'] = $referenceToken; - $vars[$paramCount]['variable_length'] = $variableLength; - $vars[$paramCount]['variadic_token'] = $variadicToken; - $vars[$paramCount]['type_hint'] = $typeHint; - $vars[$paramCount]['type_hint_token'] = $typeHintToken; - $vars[$paramCount]['type_hint_end_token'] = $typeHintEndToken; - $vars[$paramCount]['nullable_type'] = $nullableType; - - if ($visibilityToken !== null || $setVisibilityToken !== null || $readonlyToken !== null) { - $vars[$paramCount]['property_visibility'] = 'public'; - $vars[$paramCount]['visibility_token'] = false; - - if ($visibilityToken !== null) { - $vars[$paramCount]['property_visibility'] = $tokens[$visibilityToken]['content']; - $vars[$paramCount]['visibility_token'] = $visibilityToken; - } - - if ($setVisibilityToken !== null) { - $vars[$paramCount]['set_visibility'] = $tokens[$setVisibilityToken]['content']; - $vars[$paramCount]['set_visibility_token'] = $setVisibilityToken; - } - - $vars[$paramCount]['property_readonly'] = false; - if ($readonlyToken !== null) { - $vars[$paramCount]['property_readonly'] = true; - $vars[$paramCount]['readonly_token'] = $readonlyToken; - } - } - - if ($tokens[$i]['code'] === \T_COMMA) { - $vars[$paramCount]['comma_token'] = $i; - } else { - $vars[$paramCount]['comma_token'] = false; - } - - // Reset the vars, as we are about to process the next parameter. - $currVar = null; - $paramStart = ($i + 1); - $defaultStart = null; - $equalToken = null; - $hasAttributes = false; - $passByReference = false; - $referenceToken = false; - $variableLength = false; - $variadicToken = false; - $typeHint = ''; - $typeHintToken = false; - $typeHintEndToken = false; - $nullableType = false; - $visibilityToken = null; - $setVisibilityToken = null; - $readonlyToken = null; - - ++$paramCount; - break; - - case \T_EQUAL: - $defaultStart = $phpcsFile->findNext(Tokens::$emptyTokens, ($i + 1), null, true); - $equalToken = $i; - - // Skip past everything in the default value before going into the next switch loop. - for ($j = ($i + 1); $j <= $closer; $j++) { - // Skip past array()'s et al as default values. - if (isset($tokens[$j]['parenthesis_opener'], $tokens[$j]['parenthesis_closer'])) { - $j = $tokens[$j]['parenthesis_closer']; - - if ($j === $closer) { - // Found the end of the parameter. - break; - } - - continue; - } - - // Skip past short arrays et al as default values. - if (isset($tokens[$j]['bracket_opener'])) { - $j = $tokens[$j]['bracket_closer']; - continue; - } - - if ($tokens[$j]['code'] === \T_COMMA) { - break; - } - } - - $i = ($j - 1); - break; - } - } - - Cache::set($phpcsFile, __METHOD__, $stackPtr, $vars); - return $vars; - } - - /** - * Retrieve the stack pointers to the attribute openers for any attribute block - * which applies to the function declaration. - * - * @since 1.2.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position in the stack of the function token to - * acquire the attributes for. - * - * @return array<int> Array with the stack pointers to the applicable attribute openers - * or an empty array if there are no attributes attached to the function declaration. - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $stackPtr parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the token passed does not exist in the $phpcsFile. - * @throws \PHPCSUtils\Exceptions\UnexpectedTokenType If the token passed is not a T_FUNCTION, T_CLOSURE - * or T_FN token. - */ - public static function getAttributeOpeners(File $phpcsFile, $stackPtr) - { - return AttributeHelper::getOpeners($phpcsFile, $stackPtr, 'function'); - } - - /** - * Checks if a given function is a PHP magic function. - * - * @todo Add check for the function declaration being namespaced! - * - * @see \PHPCSUtils\Utils\FunctionDeclaration::$magicFunctions List of names of magic functions. - * @see \PHPCSUtils\Utils\FunctionDeclaration::isMagicFunctionName() For when you already know the name of the - * function and scope checking is done in the - * sniff. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The `T_FUNCTION` token to check. - * - * @return bool - */ - public static function isMagicFunction(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - if (isset($tokens[$stackPtr]) === false || $tokens[$stackPtr]['code'] !== \T_FUNCTION) { - return false; - } - - if (Scopes::isOOMethod($phpcsFile, $stackPtr) === true) { - return false; - } - - $name = self::getName($phpcsFile, $stackPtr); - return self::isMagicFunctionName($name); - } - - /** - * Verify if a given function name is the name of a PHP magic function. - * - * @see \PHPCSUtils\Utils\FunctionDeclaration::$magicFunctions List of names of magic functions. - * - * @since 1.0.0 - * - * @param string $name The full function name. - * - * @return bool - */ - public static function isMagicFunctionName($name) - { - $name = \strtolower($name); - return (isset(self::$magicFunctions[$name]) === true); - } - - /** - * Checks if a given function is a PHP magic method. - * - * @see \PHPCSUtils\Utils\FunctionDeclaration::$magicMethods List of names of magic methods. - * @see \PHPCSUtils\Utils\FunctionDeclaration::isMagicMethodName() For when you already know the name of the - * method and scope checking is done in the - * sniff. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The `T_FUNCTION` token to check. - * - * @return bool - */ - public static function isMagicMethod(File $phpcsFile, $stackPtr) - { - if (Scopes::isOOMethod($phpcsFile, $stackPtr) === false) { - return false; - } - - $name = self::getName($phpcsFile, $stackPtr); - return self::isMagicMethodName($name); - } - - /** - * Verify if a given function name is the name of a PHP magic method. - * - * @see \PHPCSUtils\Utils\FunctionDeclaration::$magicMethods List of names of magic methods. - * - * @since 1.0.0 - * - * @param string $name The full function name. - * - * @return bool - */ - public static function isMagicMethodName($name) - { - $name = \strtolower($name); - return (isset(self::$magicMethods[$name]) === true); - } - - /** - * Checks if a given function is a non-magic PHP native double underscore method. - * - * @see \PHPCSUtils\Utils\FunctionDeclaration::$methodsDoubleUnderscore List of the PHP native non-magic - * double underscore method names. - * @see \PHPCSUtils\Utils\FunctionDeclaration::isPHPDoubleUnderscoreMethodName() For when you already know the - * name of the method and scope - * checking is done in the sniff. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The `T_FUNCTION` token to check. - * - * @return bool - */ - public static function isPHPDoubleUnderscoreMethod(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - if (isset($tokens[$stackPtr]) === false || $tokens[$stackPtr]['code'] !== \T_FUNCTION) { - return false; - } - - $scopePtr = Scopes::validDirectScope($phpcsFile, $stackPtr, Tokens::$ooScopeTokens); - if ($scopePtr === false) { - return false; - } - - /* - * If this is a class, make sure it extends something, as otherwise, the methods - * still can't be overloads for the SOAPClient methods. - * For a trait/interface we don't know the concrete implementation context, so skip - * this check. - */ - if ($tokens[$scopePtr]['code'] === \T_CLASS || $tokens[$scopePtr]['code'] === \T_ANON_CLASS) { - $extends = ObjectDeclarations::findExtendedClassName($phpcsFile, $scopePtr); - if ($extends === false) { - return false; - } - } - - $name = self::getName($phpcsFile, $stackPtr); - return self::isPHPDoubleUnderscoreMethodName($name); - } - - /** - * Verify if a given function name is the name of a non-magic PHP native double underscore method. - * - * @see \PHPCSUtils\Utils\FunctionDeclaration::$methodsDoubleUnderscore List of the PHP native non-magic - * double underscore method names. - * - * @since 1.0.0 - * - * @param string $name The full function name. - * - * @return bool - */ - public static function isPHPDoubleUnderscoreMethodName($name) - { - $name = \strtolower($name); - return (isset(self::$methodsDoubleUnderscore[$name]) === true); - } - - /** - * Checks if a given function is a magic method or a PHP native double underscore method. - * - * {@internal Not the most efficient way of checking this, but less efficient ways will get - * less reliable results or introduce a lot of code duplication.} - * - * @see \PHPCSUtils\Utils\FunctionDeclaration::isSpecialMethodName() For when you already know the name of the - * method and scope checking is done in the - * sniff. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The `T_FUNCTION` token to check. - * - * @return bool - */ - public static function isSpecialMethod(File $phpcsFile, $stackPtr) - { - if (self::isMagicMethod($phpcsFile, $stackPtr) === true) { - return true; - } - - if (self::isPHPDoubleUnderscoreMethod($phpcsFile, $stackPtr) === true) { - return true; - } - - return false; - } - - /** - * Verify if a given function name is the name of a magic method or a PHP native double underscore method. - * - * @since 1.0.0 - * - * @param string $name The full function name. - * - * @return bool - */ - public static function isSpecialMethodName($name) - { - $name = \strtolower($name); - return (isset(self::$magicMethods[$name]) === true || isset(self::$methodsDoubleUnderscore[$name]) === true); - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/GetTokensAsString.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/GetTokensAsString.php deleted file mode 100644 index a9b31da..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/GetTokensAsString.php +++ /dev/null @@ -1,272 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2020 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Utils; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Exceptions\OutOfBoundsStackPtr; -use PHPCSUtils\Exceptions\TypeError; - -/** - * Utility functions to retrieve the content of a set of tokens as a string. - * - * In contrast to the PHPCS native {@see \PHP_CodeSniffer\Files\File::getTokensAsString()} method, - * which has `$length` as the third parameter, all methods in this class expect a stack pointer to - * an `$end` token (inclusive) as the third parameter. - * - * @since 1.0.0 The principle of this class is loosely based on and inspired by the - * {@see \PHP_CodeSniffer\Files\File::getTokensAsString()} method in the - * PHPCS native `File` class. - * Also see {@see \PHPCSUtils\BackCompat\BCFile::getTokensAsString()}. - */ -final class GetTokensAsString -{ - - /** - * Retrieve the tab-replaced content of the tokens from the specified start position in - * the token stack to the specified end position (inclusive). - * - * Alias for the {@see \PHPCSUtils\Utils\GetTokensAsString::tabReplaced()} method. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $start The position to start from in the token stack. - * @param int $end The position to end at in the token stack (inclusive). - * - * @return string The token contents. - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $start parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the $start token does not exist in the $phpcsFile. - */ - public static function normal(File $phpcsFile, $start, $end) - { - return self::tabReplaced($phpcsFile, $start, $end); - } - - /** - * Retrieve the tab-replaced content of the tokens from the specified start position in - * the token stack to the specified end position (inclusive). - * - * This is the default behaviour for PHPCS. - * - * If the `tabWidth` is set, either via a (custom) ruleset, the config file or by passing it - * on the command-line, PHPCS will automatically replace tabs with spaces. - * The `'content'` index key in the `$tokens` array will contain the tab-replaced content. - * The `'orig_content'` index key in the `$tokens` array will contain the original content. - * - * @see \PHP_CodeSniffer\Files\File::getTokensAsString() Similar length-based function. - * @see \PHPCSUtils\BackCompat\BCFile::getTokensAsString() Cross-version compatible version of the original. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $start The position to start from in the token stack. - * @param int $end The position to end at in the token stack (inclusive). - * - * @return string The token contents. - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $start parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the $start token does not exist in the $phpcsFile. - */ - public static function tabReplaced(File $phpcsFile, $start, $end) - { - return self::getString($phpcsFile, $start, $end); - } - - /** - * Retrieve the original content of the tokens from the specified start position in - * the token stack to the specified end position (inclusive). - * - * In contrast to the {@see GetTokensAsString::tabReplaced()} method, this method will return - * the original token content for the specified tokens. - * That means that if the original content contained tabs, the return value of this function - * will also contain tabs. - * - * The same can be achieved in PHPCS since version 3.3.0, by calling the - * {@see \PHP_CodeSniffer\Files\File::getTokensAsString()} method and passing `true` as the - * value for the `$origContent` parameter. - * - * @see \PHP_CodeSniffer\Files\File::getTokensAsString() Similar length-based function. - * @see \PHPCSUtils\BackCompat\BCFile::getTokensAsString() Cross-version compatible version of the original. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $start The position to start from in the token stack. - * @param int $end The position to end at in the token stack (inclusive). - * - * @return string The token contents. - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $start parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the $start token does not exist in the $phpcsFile. - */ - public static function origContent(File $phpcsFile, $start, $end) - { - return self::getString($phpcsFile, $start, $end, true); - } - - /** - * Retrieve the content of the tokens from the specified start position in the token - * stack to the specified end position (inclusive) without comments. - * - * @see \PHP_CodeSniffer\Files\File::getTokensAsString() Loosely related function. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $start The position to start from in the token stack. - * @param int $end The position to end at in the token stack (inclusive). - * - * @return string The token contents stripped off comments. - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $start parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the $start token does not exist in the $phpcsFile. - */ - public static function noComments(File $phpcsFile, $start, $end) - { - return self::getString($phpcsFile, $start, $end, false, true); - } - - /** - * Retrieve the code-tokens only content of the tokens from the specified start position - * in the token stack to the specified end position (inclusive) without whitespace or comments. - * - * This is useful, for instance, to retrieve a namespace name without stray whitespace or comments. - * Use this function selectively and with care! - * - * @see \PHP_CodeSniffer\Files\File::getTokensAsString() Loosely related function. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $start The position to start from in the token stack. - * @param int $end The position to end at in the token stack (inclusive). - * - * @return string The token contents stripped off comments and whitespace. - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $start parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the $start token does not exist in the $phpcsFile. - */ - public static function noEmpties(File $phpcsFile, $start, $end) - { - return self::getString($phpcsFile, $start, $end, false, true, true); - } - - /** - * Retrieve the content of the tokens from the specified start position in the token - * stack to the specified end position (inclusive) with all consecutive whitespace tokens - tabs, - * new lines, multiple spaces - replaced by a single space and optionally without comments. - * - * @see \PHP_CodeSniffer\Files\File::getTokensAsString() Loosely related function. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $start The position to start from in the token stack. - * @param int $end The position to end at in the token stack (inclusive). - * @param bool $stripComments Whether comments should be stripped from the contents. - * Defaults to `false`. - * - * @return string The token contents with compacted whitespace and optionally stripped off comments. - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $start parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the $start token does not exist in the $phpcsFile. - */ - public static function compact(File $phpcsFile, $start, $end, $stripComments = false) - { - return self::getString($phpcsFile, $start, $end, false, $stripComments, false, true); - } - - /** - * Retrieve the content of the tokens from the specified start position in the token stack - * to the specified end position (inclusive). - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $start The position to start from in the token stack. - * @param int $end The position to end at in the token stack (inclusive). - * @param bool $origContent Whether the original content or the tab replaced - * content should be used. - * Defaults to `false` (= tabs replaced with spaces). - * @param bool $stripComments Whether comments should be stripped from the contents. - * Defaults to `false`. - * @param bool $stripWhitespace Whether whitespace should be stripped from the contents. - * Defaults to `false`. - * @param bool $compact Whether all consecutive whitespace tokens should be - * replaced with a single space. Defaults to `false`. - * - * @return string The token contents. - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $start parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the $start token does not exist in the $phpcsFile. - */ - protected static function getString( - File $phpcsFile, - $start, - $end, - $origContent = false, - $stripComments = false, - $stripWhitespace = false, - $compact = false - ) { - $tokens = $phpcsFile->getTokens(); - - if (\is_int($start) === false) { - throw TypeError::create(2, '$start', 'integer', $start); - } - - if (isset($tokens[$start]) === false) { - throw OutOfBoundsStackPtr::create(2, '$start', $start); - } - - if (\is_int($end) === false || $end < $start) { - return ''; - } - - $str = ''; - if ($end >= $phpcsFile->numTokens) { - $end = ($phpcsFile->numTokens - 1); - } - - $lastAdded = null; - for ($i = $start; $i <= $end; $i++) { - if ($stripComments === true && isset(Tokens::$commentTokens[$tokens[$i]['code']])) { - continue; - } - - if ($stripWhitespace === true && $tokens[$i]['code'] === \T_WHITESPACE) { - continue; - } - - if ($compact === true && $tokens[$i]['code'] === \T_WHITESPACE) { - if (isset($lastAdded) === false || $tokens[$lastAdded]['code'] !== \T_WHITESPACE) { - $str .= ' '; - $lastAdded = $i; - } - continue; - } - - // If tabs are being converted to spaces by the tokenizer, the - // original content should be used instead of the converted content. - if ($origContent === true && isset($tokens[$i]['orig_content']) === true) { - $str .= $tokens[$i]['orig_content']; - } else { - $str .= $tokens[$i]['content']; - } - - $lastAdded = $i; - } - - return $str; - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Lists.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Lists.php deleted file mode 100644 index 31c8936..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Lists.php +++ /dev/null @@ -1,365 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2020 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Utils; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Exceptions\UnexpectedTokenType; -use PHPCSUtils\Internal\Cache; -use PHPCSUtils\Internal\IsShortArrayOrListWithCache; -use PHPCSUtils\Tokens\Collections; -use PHPCSUtils\Utils\GetTokensAsString; - -/** - * Utility functions to retrieve information when working with lists. - * - * @since 1.0.0 - */ -final class Lists -{ - - /** - * Default values for individual list items. - * - * Used by the `getAssignments()` method. - * - * @since 1.0.0 - * - * @var array<string, mixed> - */ - private static $listItemDefaults = [ - 'raw' => '', - 'assignment' => '', - 'is_empty' => false, - 'is_nested_list' => false, - 'variable' => false, - 'assignment_token' => false, - 'assignment_end_token' => false, - 'assign_by_reference' => false, - 'reference_token' => false, - ]; - - /** - * Determine whether a T_OPEN/CLOSE_SHORT_ARRAY token is a short list() construct. - * - * This method also accepts `T_OPEN/CLOSE_SQUARE_BRACKET` tokens to allow it to be - * PHPCS cross-version compatible as the short array tokenizing has been plagued by - * a number of bugs over time, which affects the short list determination. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the short array bracket token. - * - * @return bool `TRUE` if the token passed is the open/close bracket of a short list. - * `FALSE` if the token is a short array bracket or plain square bracket - * or not one of the accepted tokens. - */ - public static function isShortList(File $phpcsFile, $stackPtr) - { - return IsShortArrayOrListWithCache::isShortList($phpcsFile, $stackPtr); - } - - /** - * Find the list opener and closer based on a T_LIST or T_OPEN_SHORT_ARRAY token. - * - * This method also accepts `T_OPEN_SQUARE_BRACKET` tokens to allow it to be - * PHPCS cross-version compatible as the short array tokenizing has been plagued by - * a number of bugs over time, which affects the short list determination. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the T_LIST or T_OPEN_SHORT_ARRAY - * token in the stack. - * @param true|null $isShortList Short-circuit the short list check for T_OPEN_SHORT_ARRAY - * tokens if it isn't necessary. - * Efficiency tweak for when this has already been established, - * i.e. when encountering a nested list while walking the - * tokens in a list. - * Use with care. - * - * @return array<string, int>|false An array with the token pointers; or `FALSE` if this is not a (short) list - * token or if the opener/closer could not be determined. - * The format of the array return value is: - * ```php - * array( - * 'opener' => integer, // Stack pointer to the list open bracket. - * 'closer' => integer, // Stack pointer to the list close bracket. - * ) - * ``` - */ - public static function getOpenClose(File $phpcsFile, $stackPtr, $isShortList = null) - { - $tokens = $phpcsFile->getTokens(); - - // Is this one of the tokens this function handles ? - if (isset($tokens[$stackPtr]) === false - || isset(Collections::listOpenTokensBC()[$tokens[$stackPtr]['code']]) === false - ) { - return false; - } - - switch ($tokens[ $stackPtr ]['code']) { - case \T_LIST: - if (isset($tokens[$stackPtr]['parenthesis_opener'])) { - $opener = $tokens[$stackPtr]['parenthesis_opener']; - - if (isset($tokens[$opener]['parenthesis_closer'])) { - $closer = $tokens[$opener]['parenthesis_closer']; - } - } - break; - - case \T_OPEN_SHORT_ARRAY: - case \T_OPEN_SQUARE_BRACKET: - if ($isShortList === true || self::isShortList($phpcsFile, $stackPtr) === true) { - $opener = $stackPtr; - $closer = $tokens[$stackPtr]['bracket_closer']; - } - break; - } - - if (isset($opener, $closer)) { - return [ - 'opener' => $opener, - 'closer' => $closer, - ]; - } - - return false; - } - - /** - * Retrieves information on the assignments made in the specified (long/short) list. - * - * This method also accepts `T_OPEN_SQUARE_BRACKET` tokens to allow it to be - * PHPCS cross-version compatible as the short array tokenizing has been plagued by - * a number of bugs over time, which affects the short list determination. - * - * The returned array will contain the following basic information for each assignment: - * - * ```php - * 0 => array( - * 'raw' => string, // The full content of the variable definition, - * // including whitespace and comments. - * // This may be an empty string when a list - * // item is being skipped. - * 'assignment' => string, // The content of the assignment part, - * // cleaned of comments. - * // This may be an empty string for an empty - * // list item; it could also be a nested list - * // represented as a string. - * 'is_empty' => bool, // Whether this is an empty list item, i.e. - * // the second item in `list($a, , $b)`. - * 'is_nested_list' => bool, // Whether this is a nested list. - * 'variable' => string|false, // The base variable being assigned to; or - * // FALSE in case of a nested list or - * // a variable variable. - * // I.e. `$a` in `list($a['key'])`. - * 'assignment_token' => int|false, // The start pointer for the assignment. - * // For a nested list, this will be the pointer - * // to the `list` keyword or the open square - * // bracket in case of a short list. - * 'assignment_end_token' => int|false, // The end pointer for the assignment. - * 'assign_by_reference' => bool, // Is the variable assigned by reference? - * 'reference_token' => int|false, // The stack pointer to the reference operator; - * // or FALSE when not a reference assignment. - * ) - * ``` - * - * Assignments with keys will have the following additional array indexes set: - * ```php - * 'key' => string, // The content of the key, cleaned of comments. - * 'key_token' => int, // The stack pointer to the start of the key. - * 'key_end_token' => int, // The stack pointer to the end of the key. - * 'double_arrow_token' => int, // The stack pointer to the double arrow. - * ``` - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position in the stack of the function token - * to acquire the parameters for. - * - * @return array<int, array<string, mixed>> - * An array with information on each assignment made, including skipped assignments (empty), - * or an empty array if no assignments are made at all (fatal error in PHP >= 7.0). - * - * @throws \PHPCSUtils\Exceptions\UnexpectedTokenType If the token passed is not a T_LIST, T_OPEN_SHORT_ARRAY or - * T_OPEN_SQUARE_BRACKET token. - */ - public static function getAssignments(File $phpcsFile, $stackPtr) - { - $openClose = self::getOpenClose($phpcsFile, $stackPtr); - if ($openClose === false) { - // The `getOpenClose()` method does the $stackPtr validation. - $received = $stackPtr; - $tokens = $phpcsFile->getTokens(); - if (\is_int($stackPtr) && isset($tokens[$stackPtr])) { - $received = $tokens[$stackPtr]['type']; - } elseif (\is_int($stackPtr) === false) { - $received = \gettype($stackPtr); - } - throw UnexpectedTokenType::create(2, '$stackPtr', 'long/short list', $received); - } - - if (Cache::isCached($phpcsFile, __METHOD__, $stackPtr) === true) { - return Cache::get($phpcsFile, __METHOD__, $stackPtr); - } - - $opener = $openClose['opener']; - $closer = $openClose['closer']; - - $tokens = $phpcsFile->getTokens(); - - $vars = []; - $start = null; - $lastNonEmpty = null; - $reference = null; - $list = null; - $lastComma = $opener; - $keys = []; - - for ($i = ($opener + 1); $i <= $closer; $i++) { - if (isset(Tokens::$emptyTokens[$tokens[$i]['code']])) { - continue; - } - - switch ($tokens[$i]['code']) { - case \T_DOUBLE_ARROW: - $keys['key'] = GetTokensAsString::compact($phpcsFile, $start, $lastNonEmpty, true); - $keys['key_token'] = $start; - $keys['key_end_token'] = $lastNonEmpty; - $keys['double_arrow_token'] = $i; - - // Partial reset. - $start = null; - $lastNonEmpty = null; - $list = null; // Prevent confusion when short array was used as the key. - $reference = null; - break; - - case \T_COMMA: - case $tokens[$closer]['code']: - // Check if this is the end of the list or only a token with the same type as the list closer. - if ($tokens[$i]['code'] === $tokens[$closer]['code']) { - if ($i !== $closer) { - /* - * Shouldn't be possible anymore now nested brackets are being skipped over, - * but keep it just in case. - */ - // @codeCoverageIgnoreStart - $lastNonEmpty = $i; - break; - // @codeCoverageIgnoreEnd - } elseif ($start === null && $lastComma === $opener) { - // This is an empty list. - break 2; - } - } - - // Ok, so this is actually the end of the list item. - $current = self::$listItemDefaults; - $current['raw'] = \trim(GetTokensAsString::normal($phpcsFile, ($lastComma + 1), ($i - 1))); - - if ($start === null) { - $current['is_empty'] = true; - } else { - $current['assignment'] = \trim( - GetTokensAsString::compact($phpcsFile, $start, $lastNonEmpty, true) - ); - $current['is_nested_list'] = isset($list); - - $current['variable'] = false; - if (isset($list) === false && $tokens[$start]['code'] === \T_VARIABLE) { - $current['variable'] = $tokens[$start]['content']; - } - $current['assignment_token'] = $start; - $current['assignment_end_token'] = $lastNonEmpty; - - if (isset($reference)) { - $current['assign_by_reference'] = true; - $current['reference_token'] = $reference; - } - } - - if (empty($keys) === false) { - $current += $keys; - } - - $vars[] = $current; - - // Reset. - $start = null; - $lastNonEmpty = null; - $reference = null; - $list = null; - $lastComma = $i; - $keys = []; - - break; - - case \T_LIST: - case \T_OPEN_SHORT_ARRAY: - if ($start === null) { - $start = $i; - } - - /* - * As the top level list has an open/close, we know we don't have a parse error and - * any nested (short) arrays/lists will be tokenized correctly, so no need for extra checks here. - */ - $nestedOpenClose = self::getOpenClose($phpcsFile, $i, true); - $list = $i; - $i = $nestedOpenClose['closer']; - - $lastNonEmpty = $i; - break; - - case \T_BITWISE_AND: - $reference = $i; - $lastNonEmpty = $i; - break; - - default: - if ($start === null) { - $start = $i; - } - - // Skip over everything within all types of brackets which may be used in keys. - if (isset($tokens[$i]['bracket_opener'], $tokens[$i]['bracket_closer']) - && $i === $tokens[$i]['bracket_opener'] - ) { - $i = $tokens[$i]['bracket_closer']; - } elseif ($tokens[$i]['code'] === \T_OPEN_PARENTHESIS - && isset($tokens[$i]['parenthesis_closer']) - ) { - $i = $tokens[$i]['parenthesis_closer']; - } elseif (isset($tokens[$i]['scope_condition'], $tokens[$i]['scope_closer']) - && $tokens[$i]['scope_condition'] === $i - ) { - $i = $tokens[$i]['scope_closer']; - } elseif ($tokens[$i]['code'] === \T_ATTRIBUTE - && isset($tokens[$i]['attribute_closer']) - ) { - $i = $tokens[$i]['attribute_closer']; - } - - $lastNonEmpty = $i; - break; - } - } - - Cache::set($phpcsFile, __METHOD__, $stackPtr, $vars); - return $vars; - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/MessageHelper.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/MessageHelper.php deleted file mode 100644 index eb7c150..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/MessageHelper.php +++ /dev/null @@ -1,145 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2020 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Utils; - -use PHP_CodeSniffer\Files\File; - -/** - * Helper functions for creating PHPCS error/warning messages. - * - * @since 1.0.0 - */ -final class MessageHelper -{ - - /** - * Add a PHPCS message to the output stack as either a warning or an error. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param string $message The message. - * @param int $stackPtr The position of the token - * the message relates to. - * @param bool $isError Whether to report the message as an - * 'error' or 'warning'. - * Defaults to true (error). - * @param string $code The error code for the message. - * Defaults to 'Found'. - * @param scalar[] $data Optional input for the data replacements. - * @param int $severity Optional. Severity level. Defaults to 0 which will - * translate to the PHPCS default severity level. - * - * @return bool - */ - public static function addMessage( - File $phpcsFile, - $message, - $stackPtr, - $isError = true, - $code = 'Found', - array $data = [], - $severity = 0 - ) { - if ($isError === true) { - return $phpcsFile->addError($message, $stackPtr, $code, $data, $severity); - } - - return $phpcsFile->addWarning($message, $stackPtr, $code, $data, $severity); - } - - /** - * Add a PHPCS message to the output stack as either a fixable warning or a fixable error. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param string $message The message. - * @param int $stackPtr The position of the token - * the message relates to. - * @param bool $isError Whether to report the message as an - * 'error' or 'warning'. - * Defaults to true (error). - * @param string $code The error code for the message. - * Defaults to 'Found'. - * @param scalar[] $data Optional input for the data replacements. - * @param int $severity Optional. Severity level. Defaults to 0 which will - * translate to the PHPCS default severity level. - * - * @return bool - */ - public static function addFixableMessage( - File $phpcsFile, - $message, - $stackPtr, - $isError = true, - $code = 'Found', - array $data = [], - $severity = 0 - ) { - if ($isError === true) { - return $phpcsFile->addFixableError($message, $stackPtr, $code, $data, $severity); - } - - return $phpcsFile->addFixableWarning($message, $stackPtr, $code, $data, $severity); - } - - /** - * Convert an arbitrary text string to an alphanumeric string with underscores. - * - * Pre-empt issues in XML and PHP when arbitrary strings are being used as error codes. - * - * @since 1.0.0 - * - * @param string $text Arbitrary text string intended to be used in an error code. - * @param bool $strtolower Whether or not to convert the text string to lowercase. - * - * @return string - */ - public static function stringToErrorcode($text, $strtolower = false) - { - $text = \preg_replace('`[^a-z0-9_]`i', '_', $text); - - if ($strtolower === true) { - $text = \strtolower($text); - } - - return $text; - } - - /** - * Make the whitespace escape codes used in an arbitrary text string visible. - * - * At times, it is useful to show a code snippet in an error message. - * If such a code snippet contains new lines and/or tab or space characters, those would be - * displayed as-is in the command-line report, often breaking the layout of the report - * or making the report harder to read. - * - * This method will convert these characters to their escape codes, making them visible in the - * display string without impacting the report layout. - * - * @see \PHPCSUtils\Utils\GetTokensToString Methods to retrieve a multi-token code snippet. - * @see \PHP_CodeSniffer\Util\Common\prepareForOutput() Similar PHPCS native method. - * - * @since 1.0.0 - * - * @param string $text Arbitrary text string. - * - * @return string - */ - public static function showEscapeChars($text) - { - $search = ["\n", "\r", "\t"]; - $replace = ['\n', '\r', '\t']; - - return \str_replace($search, $replace, $text); - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Namespaces.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Namespaces.php deleted file mode 100644 index 1a39dfb..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Namespaces.php +++ /dev/null @@ -1,403 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2020 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Utils; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\BackCompat\BCFile; -use PHPCSUtils\Exceptions\OutOfBoundsStackPtr; -use PHPCSUtils\Exceptions\RuntimeException; -use PHPCSUtils\Exceptions\TypeError; -use PHPCSUtils\Exceptions\UnexpectedTokenType; -use PHPCSUtils\Internal\Cache; -use PHPCSUtils\Tokens\Collections; -use PHPCSUtils\Utils\Conditions; -use PHPCSUtils\Utils\GetTokensAsString; -use PHPCSUtils\Utils\Parentheses; - -/** - * Utility functions for use when examining T_NAMESPACE tokens and to determine the - * namespace of arbitrary tokens. - * - * @link https://www.php.net/language.namespaces PHP Manual on namespaces. - * - * @since 1.0.0 - */ -final class Namespaces -{ - - /** - * Determine what a T_NAMESPACE token is used for. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the `T_NAMESPACE` token. - * - * @return string Either `'declaration'`, `'operator'` or an empty string. - * An empty string will be returned if it couldn't be - * reliably determined what the `T_NAMESPACE` token is used for, - * which, in most cases, will mean the code contains a parse/fatal error. - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $stackPtr parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the token passed does not exist in the $phpcsFile. - * @throws \PHPCSUtils\Exceptions\UnexpectedTokenType If the token passed is not a `T_NAMESPACE` token. - */ - public static function getType(File $phpcsFile, $stackPtr) - { - static $findAfter; - - if (isset($findAfter) === false) { - /* - * Set up array of tokens which can only be used in combination with the keyword as operator - * and which cannot be confused with other keywords. - */ - $findAfter = Tokens::$assignmentTokens - + Tokens::$comparisonTokens - + Tokens::$operators - + Tokens::$castTokens - + Tokens::$blockOpeners - + Collections::incrementDecrementOperators() - + Collections::objectOperators() - + Collections::shortArrayListOpenTokensBC(); - - $findAfter[\T_OPEN_CURLY_BRACKET] = \T_OPEN_CURLY_BRACKET; - } - - $tokens = $phpcsFile->getTokens(); - - if (\is_int($stackPtr) === false) { - throw TypeError::create(2, '$stackPtr', 'integer', $stackPtr); - } - - if (isset($tokens[$stackPtr]) === false) { - throw OutOfBoundsStackPtr::create(2, '$stackPtr', $stackPtr); - } - - if ($tokens[$stackPtr]['code'] !== \T_NAMESPACE) { - throw UnexpectedTokenType::create(2, '$stackPtr', 'T_NAMESPACE', $tokens[$stackPtr]['type']); - } - - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($next === false) { - // Live coding or parse error. - return ''; - } - - if (empty($tokens[$stackPtr]['conditions']) === false - || empty($tokens[$stackPtr]['nested_parenthesis']) === false - ) { - /* - * Namespace declarations are only allowed at top level, so this can definitely not - * be a namespace declaration. - */ - if ($tokens[$next]['code'] === \T_NS_SEPARATOR) { - return 'operator'; - } - - return ''; - } - - $start = BCFile::findStartOfStatement($phpcsFile, $stackPtr); - if ($start === $stackPtr - && ($tokens[$next]['code'] === \T_STRING - || $tokens[$next]['code'] === \T_NAME_QUALIFIED - || $tokens[$next]['code'] === \T_OPEN_CURLY_BRACKET) - ) { - return 'declaration'; - } - - if (($tokens[$next]['code'] === \T_NS_SEPARATOR - || $tokens[$next]['code'] === \T_NAME_FULLY_QUALIFIED) // PHP >= 8.0 parse error. - && ($start !== $stackPtr - || $phpcsFile->findNext($findAfter, ($stackPtr + 1), null, false, null, true) !== false) - ) { - return 'operator'; - } - - return ''; - } - - /** - * Determine whether a T_NAMESPACE token is the keyword for a namespace declaration. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of a `T_NAMESPACE` token. - * - * @return bool `TRUE` if the token passed is the keyword for a namespace declaration. - * `FALSE` if not. - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $stackPtr parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the token passed does not exist in the $phpcsFile. - * @throws \PHPCSUtils\Exceptions\UnexpectedTokenType If the token passed is not a `T_NAMESPACE` token. - */ - public static function isDeclaration(File $phpcsFile, $stackPtr) - { - return (self::getType($phpcsFile, $stackPtr) === 'declaration'); - } - - /** - * Determine whether a T_NAMESPACE token is used as an operator. - * - * @link https://www.php.net/language.namespaces.nsconstants PHP Manual about the use of the - * namespace keyword as an operator. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of a `T_NAMESPACE` token. - * - * @return bool `TRUE` if the namespace token passed is used as an operator. `FALSE` if not. - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $stackPtr parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the token passed does not exist in the $phpcsFile. - * @throws \PHPCSUtils\Exceptions\UnexpectedTokenType If the token passed is not a `T_NAMESPACE` token. - */ - public static function isOperator(File $phpcsFile, $stackPtr) - { - return (self::getType($phpcsFile, $stackPtr) === 'operator'); - } - - /** - * Get the complete namespace name as declared. - * - * For hierarchical namespaces, the namespace name will be composed of several tokens, - * i.e. "MyProject\Sub\Level", which will be returned together as one string. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of a `T_NAMESPACE` token. - * @param bool $clean Optional. Whether to get the name stripped - * of potentially interlaced whitespace and/or - * comments. Defaults to `true`. - * - * @return string|false The namespace name; or `FALSE` if the specified position is not a - * `T_NAMESPACE` token, the token points to a namespace operator - * or when parse errors are encountered/during live coding. - * > Note: The name can be an empty string for a valid global - * namespace declaration. - */ - public static function getDeclaredName(File $phpcsFile, $stackPtr, $clean = true) - { - try { - if (self::isDeclaration($phpcsFile, $stackPtr) === false) { - // Not a namespace declaration. - return false; - } - } catch (RuntimeException $e) { - // Non-existent token or not a namespace keyword token. - return false; - } - - $endOfStatement = $phpcsFile->findNext(Collections::namespaceDeclarationClosers(), ($stackPtr + 1)); - if ($endOfStatement === false) { - // Live coding or parse error. - return false; - } - - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), ($endOfStatement + 1), true); - if ($next === $endOfStatement) { - // Declaration of global namespace. I.e.: namespace {}. - // If not a scoped {} namespace declaration, no name/global declarations are invalid - // and result in parse errors, but that's not our concern. - return ''; - } - - if ($clean === false) { - return \trim(GetTokensAsString::origContent($phpcsFile, $next, ($endOfStatement - 1))); - } - - return \trim(GetTokensAsString::noEmpties($phpcsFile, $next, ($endOfStatement - 1))); - } - - /** - * Find the stack pointer to the namespace declaration applicable for an arbitrary token. - * - * Take note: - * 1. When a namespace declaration token or a token which is part of the namespace - * name is passed to this method, the result will be `false` as technically, these tokens - * are not _within_ a namespace. - * 2. This method has no opinion on whether the token passed is actually _subject_ - * to namespacing. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The token for which to determine - * the namespace. - * - * @return int|false Token pointer to the namespace keyword for the applicable namespace - * declaration; or `FALSE` if it couldn't be determined or - * if no namespace applies. - */ - public static function findNamespacePtr(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Check for the existence of the token. - if (isset($tokens[$stackPtr]) === false) { - return false; - } - - // The namespace keyword in a namespace declaration is itself not namespaced. - if ($tokens[$stackPtr]['code'] === \T_NAMESPACE - && self::isDeclaration($phpcsFile, $stackPtr) === true - ) { - return false; - } - - // Check for scoped namespace {}. - $namespacePtr = Conditions::getCondition($phpcsFile, $stackPtr, \T_NAMESPACE); - if ($namespacePtr !== false) { - return $namespacePtr; - } - - /* - * Not in a scoped namespace, so let's see if we can find a non-scoped namespace instead. - * Keeping in mind that: - * - there can be multiple non-scoped namespaces in a file (bad practice, but is allowed); - * - the namespace keyword can also be used as an operator; - * - a non-named namespace resolves to the global namespace; - * - and that namespace declarations can't be nested in anything, so we can skip over any - * nesting structures. - */ - if (Cache::isCached($phpcsFile, __METHOD__, $stackPtr) === true) { - return Cache::get($phpcsFile, __METHOD__, $stackPtr); - } - - // Start by breaking out of any scoped structures this token is in. - $prev = $stackPtr; - $firstCondition = Conditions::getFirstCondition($phpcsFile, $stackPtr); - if ($firstCondition !== false) { - $prev = $firstCondition; - } - - // And break out of any surrounding parentheses as well. - $firstParensOpener = Parentheses::getFirstOpener($phpcsFile, $prev); - if ($firstParensOpener !== false) { - $prev = $firstParensOpener; - } - - $find = [ - \T_NAMESPACE, - \T_CLOSE_CURLY_BRACKET, - \T_CLOSE_PARENTHESIS, - \T_CLOSE_SHORT_ARRAY, - \T_CLOSE_SQUARE_BRACKET, - \T_DOC_COMMENT_CLOSE_TAG, - \T_ATTRIBUTE_END, - ]; - $returnValue = false; - - do { - $prev = $phpcsFile->findPrevious($find, ($prev - 1)); - if ($prev === false) { - break; - } - - if ($tokens[$prev]['code'] === \T_CLOSE_CURLY_BRACKET) { - // Stop if we encounter a scoped namespace declaration as we already know we're not in one. - if (isset($tokens[$prev]['scope_condition']) === true - && $tokens[$tokens[$prev]['scope_condition']]['code'] === \T_NAMESPACE - ) { - break; - } - - // Skip over other scoped structures for efficiency. - if (isset($tokens[$prev]['scope_condition']) === true) { - $prev = $tokens[$prev]['scope_condition']; - } elseif (isset($tokens[$prev]['scope_opener']) === true) { - // Shouldn't be possible, but just in case. - $prev = $tokens[$prev]['scope_opener']; // @codeCoverageIgnore - } - - continue; - } - - // Skip over other nesting structures for efficiency. - if (isset($tokens[$prev]['bracket_opener']) === true) { - $prev = $tokens[$prev]['bracket_opener']; - continue; - } - - if (isset($tokens[$prev]['parenthesis_owner']) === true) { - $prev = $tokens[$prev]['parenthesis_owner']; - continue; - } elseif (isset($tokens[$prev]['parenthesis_opener']) === true) { - $prev = $tokens[$prev]['parenthesis_opener']; - continue; - } - - // Skip over potentially large attributes. - if (isset($tokens[$prev]['attribute_opener'])) { - $prev = $tokens[$prev]['attribute_opener']; - continue; - } - - // Skip over potentially large docblocks. - if (isset($tokens[$prev]['comment_opener'])) { - $prev = $tokens[$prev]['comment_opener']; - continue; - } - - // So this is a namespace keyword, check if it's a declaration. - if ($tokens[$prev]['code'] === \T_NAMESPACE - && self::isDeclaration($phpcsFile, $prev) === true - ) { - // Now make sure the token was not part of the declaration. - $endOfStatement = $phpcsFile->findNext(Collections::namespaceDeclarationClosers(), ($prev + 1)); - if ($endOfStatement > $stackPtr) { - // Token is part of the declaration, return false. - break; - } - - $returnValue = $prev; - break; - } - } while (true); - - Cache::set($phpcsFile, __METHOD__, $stackPtr, $returnValue); - return $returnValue; - } - - /** - * Determine the namespace name an arbitrary token lives in. - * - * Note: this method has no opinion on whether the token passed is actually _subject_ - * to namespacing. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The token for which to determine - * the namespace. - * - * @return string Namespace name; or an empty string if the namespace couldn't be - * determined or when no namespace applies. - */ - public static function determineNamespace(File $phpcsFile, $stackPtr) - { - $namespacePtr = self::findNamespacePtr($phpcsFile, $stackPtr); - if ($namespacePtr === false) { - return ''; - } - - $namespace = self::getDeclaredName($phpcsFile, $namespacePtr); - if ($namespace !== false) { - return $namespace; - } - - return ''; - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/NamingConventions.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/NamingConventions.php deleted file mode 100644 index cec7a27..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/NamingConventions.php +++ /dev/null @@ -1,116 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2020 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Utils; - -/** - * Utility functions for working with identifier names. - * - * Identifier names in PHP are: - * - {@link https://www.php.net/language.namespaces.definition namespace} names; - * - {@link https://www.php.net/language.oop5.basic class}, - * {@link https://www.php.net/language.oop5.traits trait}, - * {@link https://www.php.net/language.oop5.interfaces interface} and - * {@link https://www.php.net/language.types.enumerations enum} names; - * - {@link https://www.php.net/functions.user-defined function and method} names; - * - {@link https://www.php.net/language.variables.basics variable} names; - * - {@link https://www.php.net/language.constants constant} names. - * - * @since 1.0.0 - */ -final class NamingConventions -{ - - /** - * Regular expression to check if a given identifier name is valid for use in PHP. - * - * @since 1.0.0 - * - * @var string - */ - const PHP_LABEL_REGEX = '`^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$`'; - - /** - * Uppercase A-Z. - * - * @since 1.0.0 - * @deprecated 1.0.10 - * - * @var string - */ - const AZ_UPPER = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; - - /** - * Lowercase a-z. - * - * @since 1.0.0 - * @deprecated 1.0.10 - * - * @var string - */ - const AZ_LOWER = 'abcdefghijklmnopqrstuvwxyz'; - - /** - * Verify whether an arbitrary text string is valid as an identifier name in PHP. - * - * @since 1.0.0 - * - * @param string $name The name to verify. - * > Note: for variable names, the leading dollar sign - `$` - needs to be - * removed prior to passing the name to this method. - * - * @return bool - */ - public static function isValidIdentifierName($name) - { - if (\is_string($name) === false || $name === '' || \strpos($name, ' ') !== false) { - return false; - } - - return (\preg_match(self::PHP_LABEL_REGEX, $name) === 1); - } - - /** - * Check if two arbitrary identifier names will be seen as the same in PHP. - * - * This method should not be used for variable or constant names, but *should* be used - * when comparing namespace, class/trait/interface and function names. - * - * Variable and constant names in PHP are case-sensitive, except for constants explicitely - * declared case-insensitive using the third parameter for - * {@link https://www.php.net/function.define `define()`}. - * - * All other names are case-insensitive for the most part, but as it's PHP, not completely. - * Basically ASCII chars used are case-insensitive, but anything from 0x80 up is case-sensitive. - * - * This method takes this case-(in)sensitivity into account when comparing identifier names. - * - * Note: this method does not check whether the passed names would be valid for identifiers! - * The {@see \PHPCSUtils\Utils\NamingConventions::isValidIdentifierName()} method should be used - * to verify that, if necessary. - * - * @since 1.0.0 - * - * @param string $nameA The first identifier name. - * @param string $nameB The second identifier name. - * - * @return bool `TRUE` if these names would be considered the same in PHP; `FALSE` otherwise. - */ - public static function isEqual($nameA, $nameB) - { - // Simple quick check first. - if ($nameA === $nameB) { - return true; - } - - // Comparing via strcasecmp will only compare ASCII letters case-insensitively. - return (\strcasecmp($nameA, $nameB) === 0); - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Numbers.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Numbers.php deleted file mode 100644 index 32305fb..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Numbers.php +++ /dev/null @@ -1,314 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2020 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Utils; - -use PHP_CodeSniffer\Files\File; -use PHPCSUtils\Exceptions\OutOfBoundsStackPtr; -use PHPCSUtils\Exceptions\TypeError; -use PHPCSUtils\Exceptions\UnexpectedTokenType; - -/** - * Utility functions for working with integer/float tokens. - * - * PHP 7.4 introduced numeric literal separators. PHPCS backfills this since PHPCS 3.5.3/4. - * PHP 8.1 introduced an explicit octal notation. This is backfilled in PHPCS since PHPCS 3.7.0. - * - * While there are currently no unsupported numeric syntaxes, the methods in this class - * can still be useful for external standards which need to examine the - * contents of `T_LNUMBER` or `T_DNUMBER` tokens. - * - * @link https://www.php.net/migration74.new-features.php#migration74.new-features.core.numeric-literal-separator - * PHP Manual on numeric literal separators. - * @link https://www.php.net/manual/en/migration81.new-features.php#migration81.new-features.core.octal-literal-prefix - * PHP Manual on the introduction of the integer octal literal prefix. - * - * @since 1.0.0 - */ -final class Numbers -{ - - /** - * Regex to determine whether the contents of an arbitrary string represents a decimal integer. - * - * @since 1.0.0 - * - * @var string - */ - const REGEX_DECIMAL_INT = '`^(?:0|[1-9](?:[0-9_]*[0-9])?)$`D'; - - /** - * Regex to determine whether the contents of an arbitrary string represents an octal integer. - * - * @since 1.0.0 - * - * @var string - */ - const REGEX_OCTAL_INT = '`^0[o]?[0-7](?:[0-7_]*[0-7])?$`iD'; - - /** - * Regex to determine whether the contents of an arbitrary string represents a binary integer. - * - * @since 1.0.0 - * - * @var string - */ - const REGEX_BINARY_INT = '`^0b[0-1](?:[0-1_]*[0-1])?$`iD'; - - /** - * Regex to determine whether the contents of an arbitrary string represents a hexidecimal integer. - * - * @since 1.0.0 - * - * @var string - */ - const REGEX_HEX_INT = '`^0x[0-9A-F](?:[0-9A-F_]*[0-9A-F])?$`iD'; - - /** - * Regex to determine whether the contents of an arbitrary string represents a float. - * - * @link https://www.php.net/language.types.float PHP Manual on floats - * - * @since 1.0.0 - * - * @var string - */ - const REGEX_FLOAT = '` - ^(?: - (?: - (?: - (?P<LNUM>[0-9](?:[0-9_]*[0-9])?) - | - (?P<DNUM>((?:[0-9](?:[0-9_]*[0-9])?)*\.(?P>LNUM)|(?P>LNUM)\.(?:[0-9](?:[0-9_]*[0-9])?)*)) - ) - [e][+-]?(?P>LNUM) - ) - | - (?P>DNUM) - | - (?:0|[1-9](?:[0-9_]*[0-9])?) - )$ - `ixD'; - - /** - * Retrieve information about a number token. - * - * Helper function to deal with numeric literals, potentially with underscore separators - * and/or explicit octal notation. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of a T_LNUMBER or T_DNUMBER token. - * - * @return array<string, string|int> An array with information about the number. - * The format of the array return value is: - * ```php - * array( - * 'orig_content' => string, // The original content of the token(s); - * 'content' => string, // The content, underscore(s) removed; - * 'code' => int, // The token code of the number, either - * // T_LNUMBER or T_DNUMBER. - * 'type' => string, // The token type, either 'T_LNUMBER' - * // or 'T_DNUMBER'. - * 'decimal' => string, // The decimal value of the number; - * 'last_token' => int, // The stackPtr to the last token which was - * // part of the number. - * // At this time, this will be always be the original - * // stackPtr. This may change in the future if - * // new numeric syntaxes would be added to PHP. - * ) - * ``` - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $stackPtr parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the token passed does not exist in the $phpcsFile. - * @throws \PHPCSUtils\Exceptions\UnexpectedTokenType If the token passed is not a `T_LNUMBER` or `T_DNUMBER` token. - */ - public static function getCompleteNumber(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (\is_int($stackPtr) === false) { - throw TypeError::create(2, '$stackPtr', 'integer', $stackPtr); - } - - if (isset($tokens[$stackPtr]) === false) { - throw OutOfBoundsStackPtr::create(2, '$stackPtr', $stackPtr); - } - - if ($tokens[$stackPtr]['code'] !== \T_LNUMBER && $tokens[$stackPtr]['code'] !== \T_DNUMBER) { - throw UnexpectedTokenType::create(2, '$stackPtr', 'T_LNUMBER or T_DNUMBER', $tokens[$stackPtr]['type']); - } - - $content = $tokens[$stackPtr]['content']; - return [ - 'orig_content' => $content, - 'content' => \str_replace('_', '', $content), - 'code' => $tokens[$stackPtr]['code'], - 'type' => $tokens[$stackPtr]['type'], - 'decimal' => self::getDecimalValue($content), - 'last_token' => $stackPtr, - ]; - } - - /** - * Get the decimal number value of a numeric string. - * - * Takes PHP 7.4 numeric literal separators and explicit octal literals in numbers into account. - * - * @since 1.0.0 - * - * @param string $textString Arbitrary text string. - * This text string should be the (combined) token content of - * one or more tokens which together represent a number in PHP. - * - * @return string|false Decimal number as a string or `FALSE` if the passed parameter - * was not a numeric string. - * > Note: floating point numbers with exponent will not be expanded, - * but returned as-is. - */ - public static function getDecimalValue($textString) - { - if (\is_string($textString) === false || $textString === '') { - return false; - } - - /* - * Remove potential PHP 7.4 numeric literal separators. - * - * {@internal While the is..() functions also do this, this is still needed - * here to allow the hexdec(), bindec() functions to work correctly and for - * the decimal/float to return a cross-version compatible decimal value.} - */ - $textString = \str_replace('_', '', $textString); - - if (self::isDecimalInt($textString) === true) { - return $textString; - } - - if (self::isHexidecimalInt($textString) === true) { - return (string) \hexdec($textString); - } - - if (self::isBinaryInt($textString) === true) { - return (string) \bindec($textString); - } - - if (self::isOctalInt($textString) === true) { - return (string) \octdec($textString); - } - - if (self::isFloat($textString) === true) { - return $textString; - } - - return false; - } - - /** - * Verify whether the contents of an arbitrary string represents a decimal integer. - * - * Takes PHP 7.4 numeric literal separators in numbers into account in the regex. - * - * @since 1.0.0 - * - * @param string $textString Arbitrary string. - * - * @return bool - */ - public static function isDecimalInt($textString) - { - if (\is_string($textString) === false || $textString === '') { - return false; - } - - return (\preg_match(self::REGEX_DECIMAL_INT, $textString) === 1); - } - - /** - * Verify whether the contents of an arbitrary string represents a hexidecimal integer. - * - * Takes PHP 7.4 numeric literal separators in numbers into account in the regex. - * - * @since 1.0.0 - * - * @param string $textString Arbitrary string. - * - * @return bool - */ - public static function isHexidecimalInt($textString) - { - if (\is_string($textString) === false || $textString === '') { - return false; - } - - return (\preg_match(self::REGEX_HEX_INT, $textString) === 1); - } - - /** - * Verify whether the contents of an arbitrary string represents a binary integer. - * - * Takes PHP 7.4 numeric literal separators in numbers into account in the regex. - * - * @since 1.0.0 - * - * @param string $textString Arbitrary string. - * - * @return bool - */ - public static function isBinaryInt($textString) - { - if (\is_string($textString) === false || $textString === '') { - return false; - } - - return (\preg_match(self::REGEX_BINARY_INT, $textString) === 1); - } - - /** - * Verify whether the contents of an arbitrary string represents an octal integer. - * - * Takes PHP 7.4 numeric literal separators and explicit octal literals in numbers into account in the regex. - * - * @since 1.0.0 - * - * @param string $textString Arbitrary string. - * - * @return bool - */ - public static function isOctalInt($textString) - { - if (\is_string($textString) === false || $textString === '') { - return false; - } - - return (\preg_match(self::REGEX_OCTAL_INT, $textString) === 1); - } - - /** - * Verify whether the contents of an arbitrary string represents a floating point number. - * - * Takes PHP 7.4 numeric literal separators in numbers into account in the regex. - * - * @since 1.0.0 - * - * @param string $textString Arbitrary string. - * - * @return bool - */ - public static function isFloat($textString) - { - if (\is_string($textString) === false || $textString === '') { - return false; - } - - return (\preg_match(self::REGEX_FLOAT, $textString) === 1); - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/ObjectDeclarations.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/ObjectDeclarations.php deleted file mode 100644 index be52708..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/ObjectDeclarations.php +++ /dev/null @@ -1,661 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2020 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Utils; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Exceptions\OutOfBoundsStackPtr; -use PHPCSUtils\Exceptions\TypeError; -use PHPCSUtils\Exceptions\UnexpectedTokenType; -use PHPCSUtils\Internal\AttributeHelper; -use PHPCSUtils\Internal\Cache; -use PHPCSUtils\Tokens\Collections; -use PHPCSUtils\Utils\FunctionDeclarations; -use PHPCSUtils\Utils\GetTokensAsString; - -/** - * Utility functions for use when examining object declaration statements. - * - * @since 1.0.0 The `ObjectDeclarations::get(Declaration)Name()`, - * `ObjectDeclarations::getClassProperties()`, `ObjectDeclarations::findExtendedClassName()` - * and `ObjectDeclarations::findImplementedInterfaceNames()` methods are based on and - * inspired by the methods of the same name in the PHPCS native - * PHP_CodeSniffer\Files\File` class. - * Also see {@see \PHPCSUtils\BackCompat\BCFile}. - */ -final class ObjectDeclarations -{ - - /** - * Retrieves the declaration name for classes, interfaces, traits, enums and functions. - * - * Main differences with the PHPCS version: - * - Defensive coding against incorrect calls to this method. - * - Improved handling of invalid names, like names starting with a number. - * This allows sniffs to report on invalid names instead of ignoring them. - * - Bug fix: improved handling of parse errors. - * Using the original method, a parse error due to an invalid name could cause the method - * to return the name of the *next* construct, a partial name and/or the name of a class - * being extended/interface being implemented. - * Using this version of the utility method, either the complete name (invalid or not) will - * be returned or `null` in case of no name (parse error). - * - The PHPCS 4.0 change to no longer accept tokens for anonymous structures (T_CLOSURE/T_ANON_CLASS) - * has not been applied to this method (yet). This will change in PHPCSUtils 2.0. - * - The PHPCS 4.0 change to normalize the return type to `string` and no longer return `null` - * has not been applied to this method (yet). This will change in PHPCSUtils 2.0. - * - * @see \PHP_CodeSniffer\Files\File::getDeclarationName() Original source. - * @see \PHPCSUtils\BackCompat\BCFile::getDeclarationName() Cross-version compatible version of the original. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the declaration token - * which declared the class, interface, - * trait, enum or function. - * - * @return string|null The name of the class, interface, trait, enum, or function; - * or `NULL` if the passed token doesn't exist, the function or - * class is anonymous or in case of a parse error/live coding. - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $stackPtr parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\UnexpectedTokenType If the token passed is not a `T_FUNCTION`, `T_CLASS`, - * `T_ANON_CLASS`, `T_CLOSURE`, `T_TRAIT`, `T_ENUM` - * or `T_INTERFACE` token. - */ - public static function getName(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (\is_int($stackPtr) === false) { - throw TypeError::create(2, '$stackPtr', 'integer', $stackPtr); - } - - if (isset($tokens[$stackPtr]) === false - || ($tokens[$stackPtr]['code'] === \T_ANON_CLASS || $tokens[$stackPtr]['code'] === \T_CLOSURE) - ) { - return null; - } - - $tokenCode = $tokens[$stackPtr]['code']; - - if ($tokenCode !== \T_FUNCTION - && $tokenCode !== \T_CLASS - && $tokenCode !== \T_INTERFACE - && $tokenCode !== \T_TRAIT - && $tokenCode !== \T_ENUM - ) { - $acceptedTokens = 'T_FUNCTION, T_CLASS, T_INTERFACE, T_TRAIT or T_ENUM'; - throw UnexpectedTokenType::create(2, '$stackPtr', $acceptedTokens, $tokens[$stackPtr]['type']); - } - - if ($tokenCode === \T_FUNCTION - && \strtolower($tokens[$stackPtr]['content']) !== 'function' - ) { - // This is a function declared without the "function" keyword. - // So this token is the function name. - return $tokens[$stackPtr]['content']; - } - - /* - * Determine the name. Note that we cannot simply look for the first T_STRING - * because an (invalid) class name starting with a number will be multiple tokens. - * Whitespace or comment are however not allowed within a name. - */ - - $stopPoint = $phpcsFile->numTokens; - if ($tokenCode === \T_FUNCTION && isset($tokens[$stackPtr]['parenthesis_opener']) === true) { - $stopPoint = $tokens[$stackPtr]['parenthesis_opener']; - } elseif (isset($tokens[$stackPtr]['scope_opener']) === true) { - $stopPoint = $tokens[$stackPtr]['scope_opener']; - } - - $exclude = Tokens::$emptyTokens; - $exclude[] = \T_OPEN_PARENTHESIS; - $exclude[] = \T_OPEN_CURLY_BRACKET; - $exclude[] = \T_BITWISE_AND; - $exclude[] = \T_COLON; // Backed enums. - - $nameStart = $phpcsFile->findNext($exclude, ($stackPtr + 1), $stopPoint, true); - if ($nameStart === false) { - // Live coding or parse error. - return null; - } - - $tokenAfterNameEnd = $phpcsFile->findNext($exclude, $nameStart, $stopPoint); - - if ($tokenAfterNameEnd === false) { - return $tokens[$nameStart]['content']; - } - - // Name starts with number, so is composed of multiple tokens. - return GetTokensAsString::noEmpties($phpcsFile, $nameStart, ($tokenAfterNameEnd - 1)); - } - - /** - * Retrieves the implementation properties of a class. - * - * Main differences with the PHPCS version: - * - Bugs fixed: - * - Handling of PHPCS annotations. - * - Handling of unorthodox docblock placement. - * - Defensive coding against incorrect calls to this method. - * - Additional `'abstract_token'`, `'final_token'`, and `'readonly_token'` indexes in the return array. - * - * @see \PHP_CodeSniffer\Files\File::getClassProperties() Original source. - * @see \PHPCSUtils\BackCompat\BCFile::getClassProperties() Cross-version compatible version of the original. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position in the stack of the `T_CLASS` - * token to acquire the properties for. - * - * @return array<string, int|bool> Array with implementation properties of a class. - * The format of the return value is: - * ```php - * array( - * 'is_abstract' => bool, // TRUE if the abstract keyword was found. - * 'abstract_token' => int|false, // The stack pointer to the `abstract` keyword or - * // FALSE if the abstract keyword was not found. - * 'is_final' => bool, // TRUE if the final keyword was found. - * 'final_token' => int|false, // The stack pointer to the `final` keyword or - * // FALSE if the abstract keyword was not found. - * 'is_readonly' => bool, // TRUE if the readonly keyword was found. - * 'readonly_token' => int|false, // The stack pointer to the `readonly` keyword or - * // FALSE if the abstract keyword was not found. - * ); - * ``` - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $stackPtr parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the token passed does not exist in the $phpcsFile. - * @throws \PHPCSUtils\Exceptions\UnexpectedTokenType If the token passed is not a T_CLASS token. - */ - public static function getClassProperties(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (\is_int($stackPtr) === false) { - throw TypeError::create(2, '$stackPtr', 'integer', $stackPtr); - } - - if (isset($tokens[$stackPtr]) === false) { - throw OutOfBoundsStackPtr::create(2, '$stackPtr', $stackPtr); - } - - if ($tokens[$stackPtr]['code'] !== \T_CLASS) { - throw UnexpectedTokenType::create(2, '$stackPtr', 'T_CLASS', $tokens[$stackPtr]['type']); - } - - $valid = Collections::classModifierKeywords() + Tokens::$emptyTokens; - $properties = [ - 'is_abstract' => false, - 'abstract_token' => false, - 'is_final' => false, - 'final_token' => false, - 'is_readonly' => false, - 'readonly_token' => false, - ]; - - for ($i = ($stackPtr - 1); $i > 0; $i--) { - if (isset($valid[$tokens[$i]['code']]) === false) { - break; - } - - switch ($tokens[$i]['code']) { - case \T_ABSTRACT: - $properties['is_abstract'] = true; - $properties['abstract_token'] = $i; - break; - - case \T_FINAL: - $properties['is_final'] = true; - $properties['final_token'] = $i; - break; - - case \T_READONLY: - $properties['is_readonly'] = true; - $properties['readonly_token'] = $i; - break; - } - } - - return $properties; - } - - /** - * Retrieves the name of the class that the specified class extends. - * - * Works for classes, anonymous classes and interfaces, though it is strongly recommended - * to use the {@see \PHPCSUtils\Utils\ObjectDeclarations::findExtendedInterfaceNames()} - * method to examine interfaces instead. Interfaces can extend multiple parent interfaces, - * and that use-case is not handled by this method. - * - * Main differences with the PHPCS version: - * - Bugs fixed: - * - Handling of PHPCS annotations. - * - Handling of comments. - * - Improved handling of parse errors. - * - The returned name will be clean of superfluous whitespace and/or comments. - * - Support for PHP 8.0 tokenization of identifier/namespaced names, cross-version PHP & PHPCS. - * - * @see \PHP_CodeSniffer\Files\File::findExtendedClassName() Original source. - * @see \PHPCSUtils\BackCompat\BCFile::findExtendedClassName() Cross-version compatible version of - * the original. - * @see \PHPCSUtils\Utils\ObjectDeclarations::findExtendedInterfaceNames() Similar method for extended interfaces. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The stack position of the class or interface. - * - * @return string|false The extended class name or `FALSE` on error or if there - * is no extended class name. - */ - public static function findExtendedClassName(File $phpcsFile, $stackPtr) - { - $names = self::findNames($phpcsFile, $stackPtr, \T_EXTENDS, Collections::ooCanExtend()); - if ($names === false) { - return false; - } - - // Classes can only extend one parent class. - return \array_shift($names); - } - - /** - * Retrieves the names of the interfaces that the specified class or enum implements. - * - * Main differences with the PHPCS version: - * - Bugs fixed: - * - Handling of PHPCS annotations. - * - Handling of comments. - * - Improved handling of parse errors. - * - The returned name(s) will be clean of superfluous whitespace and/or comments. - * - Support for PHP 8.0 tokenization of identifier/namespaced names, cross-version PHP & PHPCS. - * - * @see \PHP_CodeSniffer\Files\File::findImplementedInterfaceNames() Original source. - * @see \PHPCSUtils\BackCompat\BCFile::findImplementedInterfaceNames() Cross-version compatible version of - * the original. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The stack position of the class or enum token. - * - * @return array<string>|false Array with names of the implemented interfaces or `FALSE` on - * error or if there are no implemented interface names. - */ - public static function findImplementedInterfaceNames(File $phpcsFile, $stackPtr) - { - return self::findNames($phpcsFile, $stackPtr, \T_IMPLEMENTS, Collections::ooCanImplement()); - } - - /** - * Retrieves the names of the interfaces that the specified interface extends. - * - * @see \PHPCSUtils\Utils\ObjectDeclarations::findExtendedClassName() Similar method for extended classes. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The stack position of the interface keyword. - * - * @return array<string>|false Array with names of the extended interfaces or `FALSE` on - * error or if there are no extended interface names. - */ - public static function findExtendedInterfaceNames(File $phpcsFile, $stackPtr) - { - return self::findNames( - $phpcsFile, - $stackPtr, - \T_EXTENDS, - [\T_INTERFACE => \T_INTERFACE] - ); - } - - /** - * Retrieves the names of the extended classes or interfaces or the implemented - * interfaces that the specific class/interface declaration extends/implements. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The stack position of the - * class/interface declaration keyword. - * @param int $keyword The token constant for the keyword to examine. - * Either `T_EXTENDS` or `T_IMPLEMENTS`. - * @param array<int|string, int|string> $allowedFor Array of OO types for which use of the keyword - * is allowed. - * - * @return array<string>|false Returns an array of names or `FALSE` on error or when the object - * being declared does not extend/implement another object. - */ - private static function findNames(File $phpcsFile, $stackPtr, $keyword, array $allowedFor) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]) === false - || isset($allowedFor[$tokens[$stackPtr]['code']]) === false - || isset($tokens[$stackPtr]['scope_opener']) === false - ) { - return false; - } - - $scopeOpener = $tokens[$stackPtr]['scope_opener']; - $keywordPtr = $phpcsFile->findNext($keyword, ($stackPtr + 1), $scopeOpener); - if ($keywordPtr === false) { - return false; - } - - $find = Collections::namespacedNameTokens() + Tokens::$emptyTokens; - $names = []; - $end = $keywordPtr; - do { - $start = ($end + 1); - $end = $phpcsFile->findNext($find, $start, ($scopeOpener + 1), true); - $name = GetTokensAsString::noEmpties($phpcsFile, $start, ($end - 1)); - - if (\trim($name) !== '') { - $names[] = $name; - } - } while ($tokens[$end]['code'] === \T_COMMA); - - if (empty($names)) { - return false; - } - - return $names; - } - - /** - * Retrieve the stack pointers to the attribute openers for any attribute block which applies to the OO declaration. - * - * @since 1.2.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position in the stack of the OO token to - * acquire the attributes for. - * - * @return array<int> Array with the stack pointers to the applicable attribute openers - * or an empty array if there are no attributes attached to the OO declaration. - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $stackPtr parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the token passed does not exist in the $phpcsFile. - * @throws \PHPCSUtils\Exceptions\UnexpectedTokenType If the token passed is not a `T_CLASS`, `T_ANON_CLASS`, - * `T_TRAIT`, `T_ENUM` or `T_INTERFACE` token. - */ - public static function getAttributeOpeners(File $phpcsFile, $stackPtr) - { - return AttributeHelper::getOpeners($phpcsFile, $stackPtr, 'OO'); - } - - /** - * Retrieve all constants declared in an OO structure. - * - * @since 1.1.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The stack position of the OO keyword. - * - * @return array<string, int> Array with names of the found constants as keys and the stack pointers - * to the T_CONST token for each constant as values. - * If no constants are found or a parse error is encountered, - * an empty array is returned. - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $stackPtr parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the token passed does not exist in the $phpcsFile. - * @throws \PHPCSUtils\Exceptions\UnexpectedTokenType If the token passed is not an OO keyword token. - */ - public static function getDeclaredConstants(File $phpcsFile, $stackPtr) - { - return self::analyzeOOStructure($phpcsFile, $stackPtr)['constants']; - } - - /** - * Retrieve all cases declared in an enum. - * - * @since 1.1.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The stack position of the OO keyword. - * - * @return array<string, int> Array with names of the found cases as keys and the stack pointers - * to the T_ENUM_CASE token for each case as values. - * If no cases are found or a parse error is encountered, - * an empty array is returned. - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $stackPtr parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the token passed does not exist in the $phpcsFile. - * @throws \PHPCSUtils\Exceptions\UnexpectedTokenType If the token passed is not a T_ENUM token. - */ - public static function getDeclaredEnumCases(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - if (\is_int($stackPtr) === false) { - throw TypeError::create(2, '$stackPtr', 'integer', $stackPtr); - } - - if (isset($tokens[$stackPtr]) === false) { - throw OutOfBoundsStackPtr::create(2, '$stackPtr', $stackPtr); - } - - if ($tokens[$stackPtr]['code'] !== \T_ENUM) { - throw UnexpectedTokenType::create(2, '$stackPtr', 'T_ENUM', $tokens[$stackPtr]['type']); - } - - return self::analyzeOOStructure($phpcsFile, $stackPtr)['cases']; - } - - /** - * Retrieve all properties declared in an OO structure. - * - * Notes: - * - Properties declared via PHP 8.0+ contructor property promotion **will** be included - * in the return value. - * However, keep in mind that passing the stack pointer of such a property to the - * {@see Variables::getMemberProperties()} method is not supported. - * - Interfaces (prior to PHP 8.4) and enums cannot contain properties. This method does not take this into - * account to allow sniffs to flag this kind of incorrect PHP code. - * - * @since 1.1.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The stack position of the OO keyword. - * - * @return array<string, int> Array with names of the found properties as keys and the stack pointers - * to the T_VARIABLE token for each property as values. - * If no properties are found or a parse error is encountered, - * an empty array is returned. - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $stackPtr parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the token passed does not exist in the $phpcsFile. - * @throws \PHPCSUtils\Exceptions\UnexpectedTokenType If the token passed is not an OO keyword token. - */ - public static function getDeclaredProperties(File $phpcsFile, $stackPtr) - { - return self::analyzeOOStructure($phpcsFile, $stackPtr)['properties']; - } - - /** - * Retrieve all methods declared in an OO structure. - * - * @since 1.1.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The stack pointer to the OO keyword. - * - * @return array<string, int> Array with names of the found methods as keys and the stack pointers - * to the T_FUNCTION keyword for each method as values. - * If no methods are found or a parse error is encountered, - * an empty array is returned. - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $stackPtr parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the token passed does not exist in the $phpcsFile. - * @throws \PHPCSUtils\Exceptions\UnexpectedTokenType If the token passed is not an OO keyword token. - */ - public static function getDeclaredMethods(File $phpcsFile, $stackPtr) - { - return self::analyzeOOStructure($phpcsFile, $stackPtr)['methods']; - } - - /** - * Retrieve all constants, cases, properties and methods in an OO structure. - * - * @since 1.1.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The stack position of the OO keyword. - * - * @return array<string, array<string, int>> Multi-dimensional array with four keys: - * - "constants" - * - "cases" - * - "properties" - * - "methods" - * Each index holds an associative array with the name of the "thing" - * as the key and the stack pointer to the related token as the value. - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $stackPtr parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the token passed does not exist in the $phpcsFile. - * @throws \PHPCSUtils\Exceptions\UnexpectedTokenType If the token passed is not an OO keyword token. - */ - private static function analyzeOOStructure(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (\is_int($stackPtr) === false) { - throw TypeError::create(2, '$stackPtr', 'integer', $stackPtr); - } - - if (isset($tokens[$stackPtr]) === false) { - throw OutOfBoundsStackPtr::create(2, '$stackPtr', $stackPtr); - } - - if (isset(Tokens::$ooScopeTokens[$tokens[$stackPtr]['code']]) === false) { - $acceptedTokens = 'T_CLASS, T_ANON_CLASS, T_INTERFACE, T_TRAIT or T_ENUM'; - throw UnexpectedTokenType::create(2, '$stackPtr', $acceptedTokens, $tokens[$stackPtr]['type']); - } - - // Set defaults. - $found = [ - 'constants' => [], - 'cases' => [], - 'properties' => [], - 'methods' => [], - ]; - - if (isset($tokens[$stackPtr]['scope_opener'], $tokens[$stackPtr]['scope_closer']) === false) { - return $found; - } - - if (Cache::isCached($phpcsFile, __METHOD__, $stackPtr) === true) { - return Cache::get($phpcsFile, __METHOD__, $stackPtr); - } - - for ($i = ($tokens[$stackPtr]['scope_opener'] + 1); $i < $tokens[$stackPtr]['scope_closer']; $i++) { - // Skip over potentially large docblocks. - if (isset($tokens[$i]['comment_closer']) === true) { - $i = $tokens[$i]['comment_closer']; - continue; - } - - // Skip over attributes. - if (isset($tokens[$i]['attribute_closer']) === true) { - $i = $tokens[$i]['attribute_closer']; - continue; - } - - // Skip over trait imports with conflict resolution. - if ($tokens[$i]['code'] === \T_USE - && isset($tokens[$i]['scope_closer']) === true - ) { - $i = $tokens[$i]['scope_closer']; - continue; - } - - // Defensive coding against parse errors. - if ($tokens[$i]['code'] === \T_CLOSURE - && isset($tokens[$i]['scope_closer']) === true - ) { - $i = $tokens[$i]['scope_closer']; - continue; - } - - switch ($tokens[$i]['code']) { - case \T_CONST: - $assignmentPtr = $phpcsFile->findNext([\T_EQUAL, \T_SEMICOLON, \T_CLOSE_CURLY_BRACKET], ($i + 1)); - if ($assignmentPtr === false || $tokens[$assignmentPtr]['code'] !== \T_EQUAL) { - // Probably a parse error. Ignore. - continue 2; - } - - $namePtr = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($assignmentPtr - 1), ($i + 1), true); - if ($namePtr === false || $tokens[$namePtr]['code'] !== \T_STRING) { - // Probably a parse error. Ignore. - continue 2; - } - - $found['constants'][$tokens[$namePtr]['content']] = $i; - - // Skip to the assignment pointer, no need to double walk. - $i = $assignmentPtr; - break; - - case \T_ENUM_CASE: - $namePtr = $phpcsFile->findNext(Tokens::$emptyTokens, ($i + 1), null, true); - if ($namePtr === false || $tokens[$namePtr]['code'] !== \T_STRING) { - // Probably a parse error. Ignore. - continue 2; - } - - $name = $tokens[$namePtr]['content']; - $found['cases'][$name] = $i; - - // Skip to the name pointer, no need to double walk. - $i = $namePtr; - break; - - case \T_VARIABLE: - $name = $tokens[$i]['content']; - $found['properties'][$name] = $i; - break; - - case \T_FUNCTION: - $name = self::getName($phpcsFile, $i); - if (\is_string($name) && $name !== '') { - $found['methods'][$name] = $i; - - if (\strtolower($name) === '__construct') { - // Check for constructor property promotion. - $parameters = FunctionDeclarations::getParameters($phpcsFile, $i); - foreach ($parameters as $param) { - if (isset($param['property_visibility'])) { - $found['properties'][$param['name']] = $param['token']; - } - } - } - } - - if (isset($tokens[$i]['scope_closer']) === true) { - // Skip over the contents of the method, including the parameters. - $i = $tokens[$i]['scope_closer']; - } elseif (isset($tokens[$i]['parenthesis_closer']) === true) { - // Skip over the contents of an abstract/interface method, including the parameters. - $i = $tokens[$i]['parenthesis_closer']; - } - break; - } - } - - Cache::set($phpcsFile, __METHOD__, $stackPtr, $found); - return $found; - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Operators.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Operators.php deleted file mode 100644 index 7b28511..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Operators.php +++ /dev/null @@ -1,251 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2020 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Utils; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Tokens\Collections; -use PHPCSUtils\Utils\FunctionDeclarations; -use PHPCSUtils\Utils\Parentheses; - -/** - * Utility functions for use when working with operators. - * - * @link https://www.php.net/language.operators PHP manual on operators. - * - * @since 1.0.0 The `isReference()` method is based on and inspired by - * the method of the same name in the PHPCS native `File` class. - * Also see {@see \PHPCSUtils\BackCompat\BCFile}. - * The `isUnaryPlusMinus()` method is, in part, inspired by the - * `Squiz.WhiteSpace.OperatorSpacing` sniff. - */ -final class Operators -{ - - /** - * Tokens which indicate that a plus/minus is unary when they preceed it. - * - * @since 1.0.0 - * - * @var array<int|string, true> Note: value is irrelevant, only key is used. - */ - private static $extraUnaryIndicators = [ - \T_STRING_CONCAT => true, - \T_RETURN => true, - \T_EXIT => true, - \T_CONTINUE => true, - \T_BREAK => true, - \T_ECHO => true, - \T_PRINT => true, - \T_YIELD => true, - \T_COMMA => true, - \T_OPEN_PARENTHESIS => true, - \T_OPEN_SQUARE_BRACKET => true, - \T_OPEN_SHORT_ARRAY => true, - \T_OPEN_CURLY_BRACKET => true, - \T_COLON => true, - \T_CASE => true, - \T_FN_ARROW => true, - \T_MATCH_ARROW => true, - ]; - - /** - * Determine if the passed token is a reference operator. - * - * Main differences with the PHPCS version: - * - Defensive coding against incorrect calls to this method. - * - * @see \PHP_CodeSniffer\Files\File::isReference() Original source. - * @see \PHPCSUtils\BackCompat\BCFile::isReference() Cross-version compatible version of the original. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the `T_BITWISE_AND` token. - * - * @return bool `TRUE` if the specified token position represents a reference. - * `FALSE` if the token represents a bitwise operator. - */ - public static function isReference(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]) === false || $tokens[$stackPtr]['code'] !== \T_BITWISE_AND) { - return false; - } - - $tokenBefore = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - - if (isset(Collections::functionDeclarationTokens()[$tokens[$tokenBefore]['code']]) === true) { - // Function returns a reference. - return true; - } - - if ($tokens[$tokenBefore]['code'] === \T_DOUBLE_ARROW) { - // Inside a foreach loop or array assignment, this is a reference. - return true; - } - - if ($tokens[$tokenBefore]['code'] === \T_AS) { - // Inside a foreach loop, this is a reference. - return true; - } - - if (isset(Tokens::$assignmentTokens[$tokens[$tokenBefore]['code']]) === true) { - // This is directly after an assignment. It's a reference. Even if - // it is part of an operation, the other tests will handle it. - return true; - } - - $tokenAfter = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - - if ($tokens[$tokenAfter]['code'] === \T_NEW) { - return true; - } - - $lastOpener = Parentheses::getLastOpener($phpcsFile, $stackPtr); - if ($lastOpener !== false) { - $lastOwner = Parentheses::getOwner($phpcsFile, $lastOpener); - - if (isset(Collections::functionDeclarationTokens()[$tokens[$lastOwner]['code']]) === true - // As of PHPCS 4.x, `T_USE` is a parenthesis owner. - || $tokens[$lastOwner]['code'] === \T_USE - ) { - $params = FunctionDeclarations::getParameters($phpcsFile, $lastOwner); - foreach ($params as $param) { - if ($param['reference_token'] === $stackPtr) { - // Function parameter declared to be passed by reference. - return true; - } - } - } - } - - /* - * Pass by reference in function calls, assign by reference in arrays and - * closure use by reference in PHPCS 3.x. - */ - if ($tokens[$tokenBefore]['code'] === \T_OPEN_PARENTHESIS - || $tokens[$tokenBefore]['code'] === \T_COMMA - || $tokens[$tokenBefore]['code'] === \T_OPEN_SHORT_ARRAY - ) { - if ($tokens[$tokenAfter]['code'] === \T_VARIABLE) { - return true; - } else { - $skip = Tokens::$emptyTokens; - $skip += Collections::namespacedNameTokens(); - $skip += Collections::ooHierarchyKeywords(); - $skip[] = \T_DOUBLE_COLON; - - $nextSignificantAfter = $phpcsFile->findNext( - $skip, - ($stackPtr + 1), - null, - true - ); - if ($tokens[$nextSignificantAfter]['code'] === \T_VARIABLE) { - return true; - } - } - } - - return false; - } - - /** - * Determine whether a T_MINUS/T_PLUS token is a unary operator. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the plus/minus token. - * - * @return bool `TRUE` if the token passed is a unary operator. - * `FALSE` otherwise, i.e. if the token is an arithmetic operator, - * or if the token is not a `T_PLUS`/`T_MINUS` token. - */ - public static function isUnaryPlusMinus(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]) === false - || ($tokens[$stackPtr]['code'] !== \T_PLUS - && $tokens[$stackPtr]['code'] !== \T_MINUS) - ) { - return false; - } - - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($next === false) { - // Live coding or parse error. - return false; - } - - if (isset(Tokens::$operators[$tokens[$next]['code']]) === true) { - // Next token is an operator, so this is not a unary. - return false; - } - - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - - /* - * Check the preceeding token for an indication that this is not an arithmetic operation. - */ - if (isset(Tokens::$operators[$tokens[$prev]['code']]) === true - || isset(Tokens::$comparisonTokens[$tokens[$prev]['code']]) === true - || isset(Tokens::$booleanOperators[$tokens[$prev]['code']]) === true - || isset(Tokens::$assignmentTokens[$tokens[$prev]['code']]) === true - || isset(Tokens::$castTokens[$tokens[$prev]['code']]) === true - || isset(Collections::ternaryOperators()[$tokens[$prev]['code']]) === true - || isset(self::$extraUnaryIndicators[$tokens[$prev]['code']]) === true - ) { - return true; - } - - return false; - } - - /** - * Determine whether a ternary is a short ternary/elvis operator, i.e. without "middle". - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the ternary then/else - * operator in the stack. - * - * @return bool `TRUE` if short ternary; or `FALSE` otherwise. - */ - public static function isShortTernary(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - if (isset($tokens[$stackPtr]) === false) { - return false; - } - - if ($tokens[$stackPtr]['code'] === \T_INLINE_THEN) { - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($nextNonEmpty !== false && $tokens[$nextNonEmpty]['code'] === \T_INLINE_ELSE) { - return true; - } - } - - if ($tokens[$stackPtr]['code'] === \T_INLINE_ELSE) { - $prevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($prevNonEmpty !== false && $tokens[$prevNonEmpty]['code'] === \T_INLINE_THEN) { - return true; - } - } - - // Not a ternary operator token. - return false; - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Orthography.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Orthography.php deleted file mode 100644 index cd9f35b..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Orthography.php +++ /dev/null @@ -1,120 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2020 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Utils; - -use PHPCSUtils\BackCompat\Helper; - -/** - * Utility functions for checking the orthography of arbitrary text strings. - * - * > An orthography is a set of conventions for writing a language. It includes norms of spelling, - * > hyphenation, capitalization, word breaks, emphasis, and punctuation. - * > Source: https://en.wikipedia.org/wiki/Orthography - * - * @since 1.0.0 - */ -final class Orthography -{ - - /** - * Characters which are considered terminal points for a sentence. - * - * @link https://www.thepunctuationguide.com/terminal-points.html Punctuation guide on terminal points. - * - * @since 1.0.0 - * - * @var string - */ - const TERMINAL_POINTS = '.?!'; - - /** - * Check if the first character of an arbitrary text string is a capital letter. - * - * Letter characters which do not have a concept of lower/uppercase will - * be accepted as correctly capitalized. - * - * @since 1.0.0 - * - * @param string $textString The text string to examine. - * This can be the contents of a text string token, - * but also, for instance, a comment text. - * Potential text delimiter quotes should be stripped - * off a text string before passing it to this method. - * Also see: {@see \PHPCSUtils\Utils\TextStrings::stripQuotes()}. - * - * @return bool `TRUE` when the first character is a capital letter or a letter - * which doesn't have a concept of capitalization. - * `FALSE` otherwise, including for non-letter characters. - */ - public static function isFirstCharCapitalized($textString) - { - $textString = \ltrim($textString); - return (\preg_match('`^[\p{Lu}\p{Lt}\p{Lo}]`u', $textString) > 0); - } - - /** - * Check if the first character of an arbitrary text string is a lowercase letter. - * - * @since 1.0.0 - * - * @param string $textString The text string to examine. - * This can be the contents of a text string token, - * but also, for instance, a comment text. - * Potential text delimiter quotes should be stripped - * off a text string before passing it to this method. - * Also see: {@see \PHPCSUtils\Utils\TextStrings::stripQuotes()}. - * - * @return bool `TRUE` when the first character is a lowercase letter. - * `FALSE` otherwise, including for letters which don't have a concept of - * capitalization and for non-letter characters. - */ - public static function isFirstCharLowercase($textString) - { - $textString = \ltrim($textString); - return (\preg_match('`^\p{Ll}`u', $textString) > 0); - } - - /** - * Check if the last character of an arbitrary text string is a valid punctuation character. - * - * @since 1.0.0 - * - * @param string $textString The text string to examine. - * This can be the contents of a text string token, - * but also, for instance, a comment text. - * Potential text delimiter quotes should be stripped - * off a text string before passing it to this method. - * Also see: {@see \PHPCSUtils\Utils\TextStrings::stripQuotes()}. - * @param string $allowedChars Characters which are considered valid punctuation - * to end the text string. - * Defaults to `'.?!'`, i.e. a full stop, question mark - * or exclamation mark. - * - * @return bool - */ - public static function isLastCharPunctuation($textString, $allowedChars = self::TERMINAL_POINTS) - { - $encoding = Helper::getEncoding(); - $textString = \rtrim($textString); - - if (\function_exists('iconv_substr') === true) { - $lastChar = \iconv_substr($textString, -1, 1, $encoding); - } else { - $lastChar = \substr($textString, -1); - } - - if (\function_exists('iconv_strpos') === true) { - return (\iconv_strpos($allowedChars, $lastChar, 0, $encoding) !== false); - } else { - return (\strpos($allowedChars, $lastChar) !== false); - } - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Parentheses.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Parentheses.php deleted file mode 100644 index 651ba41..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Parentheses.php +++ /dev/null @@ -1,421 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2020 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Utils; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; - -/** - * Utility functions for use when examining parenthesis tokens and arbitrary tokens wrapped - * in parentheses. - * - * In contrast to PHPCS natively (< 4.0), `isset()`, `unset()`, `empty()`, `exit()`, `die()`, `eval()` - * and closure `use()` will be considered parentheses owners by the functions in this class. - * - * @since 1.0.0 - */ -final class Parentheses -{ - - /** - * Extra tokens which should be considered parentheses owners. - * - * - `T_ISSET`, `T_UNSET`, `T_EMPTY`, `T_EXIT` and `T_EVAL` are not PHPCS native parentheses - * owners until PHPCS 4.0.0, but are considered such for the purposes of this class. - * Also see {@link https://github.com/squizlabs/PHP_CodeSniffer/issues/3118 PHPCS#3118}. - * - `T_USE` when used for a closure use statement also became a parentheses owner in PHPCS 4.0.0. - * - * @since 1.0.0 - * - * @var array<int|string, int|string> - */ - private static $extraParenthesesOwners = [ - \T_ISSET => \T_ISSET, - \T_UNSET => \T_UNSET, - \T_EMPTY => \T_EMPTY, - \T_EXIT => \T_EXIT, - \T_EVAL => \T_EVAL, - \T_USE => \T_USE, - ]; - - /** - * Get the stack pointer to the parentheses owner of an open/close parenthesis. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position of `T_OPEN/CLOSE_PARENTHESIS` token. - * - * @return int|false Integer stack pointer to the parentheses owner; or `FALSE` if the - * parenthesis does not have a (direct) owner or if the token passed - * was not a parenthesis. - */ - public static function getOwner(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['parenthesis_owner'])) { - return $tokens[$stackPtr]['parenthesis_owner']; - } - - /* - * As the 'parenthesis_owner' index is only set on parentheses, we didn't need to do any - * input validation before, but now we do. - */ - if (isset($tokens[$stackPtr]) === false - || ($tokens[$stackPtr]['code'] !== \T_OPEN_PARENTHESIS - && $tokens[$stackPtr]['code'] !== \T_CLOSE_PARENTHESIS) - ) { - return false; - } - - if ($tokens[$stackPtr]['code'] === \T_CLOSE_PARENTHESIS) { - $stackPtr = $tokens[$stackPtr]['parenthesis_opener']; - } - - $prevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($prevNonEmpty !== false - && isset(self::$extraParenthesesOwners[$tokens[$prevNonEmpty]['code']]) === true - ) { - return $prevNonEmpty; - } - - return false; - } - - /** - * Check whether the parenthesis owner of an open/close parenthesis is within a limited - * set of valid owners. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position of `T_OPEN/CLOSE_PARENTHESIS` token. - * @param int|string|array<int|string> $validOwners Array of token constants for the owners - * which should be considered valid. - * - * @return bool `TRUE` if the owner is within the list of `$validOwners`; `FALSE` if not and - * if the parenthesis does not have a (direct) owner. - */ - public static function isOwnerIn(File $phpcsFile, $stackPtr, $validOwners) - { - $owner = self::getOwner($phpcsFile, $stackPtr); - if ($owner === false) { - return false; - } - - $tokens = $phpcsFile->getTokens(); - $validOwners = (array) $validOwners; - - return \in_array($tokens[$owner]['code'], $validOwners, true); - } - - /** - * Check whether the passed token is nested within parentheses owned by one of the valid owners. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position of the token we are checking. - * @param int|string|array<int|string> $validOwners Array of token constants for the owners - * which should be considered valid. - * - * @return bool - */ - public static function hasOwner(File $phpcsFile, $stackPtr, $validOwners) - { - return (self::nestedParensWalker($phpcsFile, $stackPtr, $validOwners) !== false); - } - - /** - * Retrieve the stack pointer to the parentheses opener of the first (outer) set of parentheses - * an arbitrary token is wrapped in. - * - * If the optional `$validOwners` parameter is passed, the stack pointer to the opener to - * the first set of parentheses, which has an owner which is in the list of valid owners, - * will be returned. This may be a nested set of parentheses. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position of the token we are checking. - * @param int|string|array<int|string> $validOwners Array of token constants for the owners - * which should be considered valid. - * - * @return int|false Integer stack pointer to the parentheses opener; or `FALSE` if the token - * does not have parentheses owned by any of the valid owners or if - * the token is not nested in parentheses at all. - */ - public static function getFirstOpener(File $phpcsFile, $stackPtr, $validOwners = []) - { - return self::nestedParensWalker($phpcsFile, $stackPtr, $validOwners, false); - } - - /** - * Retrieve the stack pointer to the parentheses closer of the first (outer) set of parentheses - * an arbitrary token is wrapped in. - * - * If the optional `$validOwners` parameter is passed, the stack pointer to the closer to - * the first set of parentheses, which has an owner which is in the list of valid owners, - * will be returned. This may be a nested set of parentheses. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position of the token we are checking. - * @param int|string|array<int|string> $validOwners Array of token constants for the owners - * which should be considered valid. - * - * @return int|false Integer stack pointer to the parentheses closer; or `FALSE` if the token - * does not have parentheses owned by any of the valid owners or if - * the token is not nested in parentheses at all. - */ - public static function getFirstCloser(File $phpcsFile, $stackPtr, $validOwners = []) - { - $opener = self::getFirstOpener($phpcsFile, $stackPtr, $validOwners); - $tokens = $phpcsFile->getTokens(); - if ($opener !== false && isset($tokens[$opener]['parenthesis_closer']) === true) { - return $tokens[$opener]['parenthesis_closer']; - } - - return false; - } - - /** - * Retrieve the stack pointer to the parentheses owner of the first (outer) set of parentheses - * an arbitrary token is wrapped in. - * - * If the optional `$validOwners` parameter is passed, the stack pointer to the owner of - * the first set of parentheses, which has an owner which is in the list of valid owners, - * will be returned. This may be a nested set of parentheses. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position of the token we are checking. - * @param int|string|array<int|string> $validOwners Array of token constants for the owners - * which should be considered valid. - * - * @return int|false Integer stack pointer to the parentheses owner; or `FALSE` if the token - * does not have parentheses owned by any of the valid owners or if - * the token is not nested in parentheses at all. - */ - public static function getFirstOwner(File $phpcsFile, $stackPtr, $validOwners = []) - { - $opener = self::getFirstOpener($phpcsFile, $stackPtr, $validOwners); - if ($opener !== false) { - return self::getOwner($phpcsFile, $opener); - } - - return false; - } - - /** - * Retrieve the stack pointer to the parentheses opener of the last (inner) set of parentheses - * an arbitrary token is wrapped in. - * - * If the optional `$validOwners` parameter is passed, the stack pointer to the opener to - * the last set of parentheses, which has an owner which is in the list of valid owners, - * will be returned. This may be a set of parentheses higher up. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position of the token we are checking. - * @param int|string|array<int|string> $validOwners Array of token constants for the owners - * which should be considered valid. - * - * @return int|false Integer stack pointer to the parentheses opener; or `FALSE` if the token - * does not have parentheses owned by any of the valid owners or if - * the token is not nested in parentheses at all. - */ - public static function getLastOpener(File $phpcsFile, $stackPtr, $validOwners = []) - { - return self::nestedParensWalker($phpcsFile, $stackPtr, $validOwners, true); - } - - /** - * Retrieve the stack pointer to the parentheses closer of the last (inner) set of parentheses - * an arbitrary token is wrapped in. - * - * If the optional `$validOwners` parameter is passed, the stack pointer to the closer to - * the last set of parentheses, which has an owner which is in the list of valid owners, - * will be returned. This may be a set of parentheses higher up. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position of the token we are checking. - * @param int|string|array<int|string> $validOwners Array of token constants for the owners - * which should be considered valid. - * - * @return int|false Integer stack pointer to the parentheses closer; or `FALSE` if the token - * does not have parentheses owned by any of the valid owners or if - * the token is not nested in parentheses at all. - */ - public static function getLastCloser(File $phpcsFile, $stackPtr, $validOwners = []) - { - $opener = self::getLastOpener($phpcsFile, $stackPtr, $validOwners); - $tokens = $phpcsFile->getTokens(); - if ($opener !== false && isset($tokens[$opener]['parenthesis_closer']) === true) { - return $tokens[$opener]['parenthesis_closer']; - } - - return false; - } - - /** - * Retrieve the stack pointer to the parentheses owner of the last (inner) set of parentheses - * an arbitrary token is wrapped in. - * - * If the optional `$validOwners` parameter is passed, the stack pointer to the owner of - * the last set of parentheses, which has an owner which is in the list of valid owners, - * will be returned. This may be a set of parentheses higher up. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position of the token we are checking. - * @param int|string|array<int|string> $validOwners Array of token constants for the owners - * which should be considered valid. - * - * @return int|false Integer stack pointer to the parentheses owner; or `FALSE` if the token - * does not have parentheses owned by any of the valid owners or if - * the token is not nested in parentheses at all. - */ - public static function getLastOwner(File $phpcsFile, $stackPtr, $validOwners = []) - { - $opener = self::getLastOpener($phpcsFile, $stackPtr, $validOwners); - if ($opener !== false) { - return self::getOwner($phpcsFile, $opener); - } - - return false; - } - - /** - * Check whether the owner of the outermost wrapping set of parentheses of an arbitrary token - * is within a limited set of acceptable token types. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position in the stack of the - * token to verify. - * @param int|string|array<int|string> $validOwners Array of token constants for the owners - * which should be considered valid. - * - * @return int|false Integer stack pointer to the valid parentheses owner; or `FALSE` if - * the token was not wrapped in parentheses or if the outermost set - * of parentheses in which the token is wrapped does not have an owner - * within the set of owners considered valid. - */ - public static function firstOwnerIn(File $phpcsFile, $stackPtr, $validOwners) - { - $opener = self::getFirstOpener($phpcsFile, $stackPtr); - - if ($opener !== false && self::isOwnerIn($phpcsFile, $opener, $validOwners) === true) { - return self::getOwner($phpcsFile, $opener); - } - - return false; - } - - /** - * Check whether the owner of the innermost wrapping set of parentheses of an arbitrary token - * is within a limited set of acceptable token types. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position in the stack of the - * token to verify. - * @param int|string|array<int|string> $validOwners Array of token constants for the owners - * which should be considered valid. - * - * @return int|false Integer stack pointer to the valid parentheses owner; or `FALSE` if - * the token was not wrapped in parentheses or if the innermost set - * of parentheses in which the token is wrapped does not have an owner - * within the set of owners considered valid. - */ - public static function lastOwnerIn(File $phpcsFile, $stackPtr, $validOwners) - { - $opener = self::getLastOpener($phpcsFile, $stackPtr); - - if ($opener !== false && self::isOwnerIn($phpcsFile, $opener, $validOwners) === true) { - return self::getOwner($phpcsFile, $opener); - } - - return false; - } - - /** - * Helper method. Retrieve the position of a parentheses opener for an arbitrary passed token. - * - * If no `$validOwners` are specified, the opener to the first set of parentheses surrounding - * the token - or if `$reverse = true`, the last set of parentheses - will be returned. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position of the token we are checking. - * @param int|string|array<int|string> $validOwners Optional. Array of token constants for the owners - * which should be considered valid. - * @param bool $reverse Optional. Whether to search for the first/outermost - * (`false`) or the last/innermost (`true`) set of - * parentheses with the specified owner(s). - * - * @return int|false Integer stack pointer to the parentheses opener; or `FALSE` if the token - * does not have parentheses owned by any of the valid owners or if - * the token is not nested in parentheses at all. - */ - private static function nestedParensWalker(File $phpcsFile, $stackPtr, $validOwners = [], $reverse = false) - { - $tokens = $phpcsFile->getTokens(); - - // Check for the existence of the token. - if (isset($tokens[$stackPtr]) === false) { - return false; - } - - // Make sure the token is nested in parenthesis. - if (empty($tokens[$stackPtr]['nested_parenthesis']) === true) { - return false; - } - - $validOwners = (array) $validOwners; - $parentheses = $tokens[$stackPtr]['nested_parenthesis']; - - if (empty($validOwners) === true) { - // No owners specified, just return the first/last parentheses opener. - if ($reverse === true) { - \end($parentheses); - } else { - \reset($parentheses); - } - - return \key($parentheses); - } - - if ($reverse === true) { - $parentheses = \array_reverse($parentheses, true); - } - - foreach ($parentheses as $opener => $closer) { - if (self::isOwnerIn($phpcsFile, $opener, $validOwners) === true) { - // We found a token with a valid owner. - return $opener; - } - } - - return false; - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/PassedParameters.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/PassedParameters.php deleted file mode 100644 index 7dab549..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/PassedParameters.php +++ /dev/null @@ -1,515 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2020 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Utils; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Exceptions\MissingArgumentError; -use PHPCSUtils\Exceptions\OutOfBoundsStackPtr; -use PHPCSUtils\Exceptions\TypeError; -use PHPCSUtils\Exceptions\UnexpectedTokenType; -use PHPCSUtils\Internal\Cache; -use PHPCSUtils\Tokens\Collections; -use PHPCSUtils\Utils\Arrays; -use PHPCSUtils\Utils\GetTokensAsString; - -/** - * Utility functions to retrieve information about parameters passed to function calls, - * class instantiations, array declarations, isset and unset constructs. - * - * @since 1.0.0 - */ -final class PassedParameters -{ - - /** - * Tokens which are considered stop point, either because they are the end - * of the parameter (comma) or because we need to skip over them. - * - * @since 1.0.0 - * - * @var array<int|string, int|string> - */ - private static $callParsingStopPoints = [ - \T_COMMA => \T_COMMA, - \T_OPEN_SHORT_ARRAY => \T_OPEN_SHORT_ARRAY, - \T_OPEN_SQUARE_BRACKET => \T_OPEN_SQUARE_BRACKET, - \T_OPEN_PARENTHESIS => \T_OPEN_PARENTHESIS, - \T_DOC_COMMENT_OPEN_TAG => \T_DOC_COMMENT_OPEN_TAG, - \T_ATTRIBUTE => \T_ATTRIBUTE, - ]; - - /** - * Checks if any parameters have been passed. - * - * - If passed a `T_STRING`, `T_NAME_FULLY_QUALIFIED`, `T_NAME_RELATIVE`, `T_NAME_QUALIFIED`, - * or `T_VARIABLE` stack pointer, it will treat it as a function call. - * If a token which is *not* a function call is passed, the behaviour is undetermined. - * - If passed a `T_ANON_CLASS` stack pointer, it will accept it as a class instantiation. - * - If passed a `T_SELF`, `T_STATIC` or `T_PARENT` stack pointer, it will accept it as a - * class instantiation function call when used like `new self()` (with or without parentheses). - * When these hierarchical keywords are not preceded by the `new` keyword, parentheses - * will be required for the token to be accepted. - * - If passed a `T_ARRAY` or `T_OPEN_SHORT_ARRAY` stack pointer, it will detect - * whether the array has values or is empty. - * For purposes of backward-compatibility with older PHPCS versions, `T_OPEN_SQUARE_BRACKET` - * tokens will also be accepted and will be checked whether they are in reality - * a short array opener. - * - If passed a `T_ISSET` or `T_UNSET` stack pointer, it will detect whether those - * language constructs have "parameters". - * - If passed a `T_EXIT` stack pointer, it will treat it as a function call and detect whether - * it has been passed parameters. When the `T_EXIT` is used as a constant, the return value - * will be `false` (no parameters). - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position of function call name, - * language construct or array open token. - * @param true|null $isShortArray Optional. Short-circuit the short array check for - * `T_OPEN_SHORT_ARRAY` tokens if it isn't necessary. - * Efficiency tweak for when this has already been established, - * Use with EXTREME care. - * - * @return bool - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $stackPtr parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the token passed does not exist in the $phpcsFile. - * @throws \PHPCSUtils\Exceptions\UnexpectedTokenType If the token passed is not one of the accepted types. - */ - public static function hasParameters(File $phpcsFile, $stackPtr, $isShortArray = null) - { - $tokens = $phpcsFile->getTokens(); - - if (\is_int($stackPtr) === false) { - throw TypeError::create(2, '$stackPtr', 'integer', $stackPtr); - } - - if (isset($tokens[$stackPtr]) === false) { - throw OutOfBoundsStackPtr::create(2, '$stackPtr', $stackPtr); - } - - $acceptedTokens = 'function call, array, isset, unset or exit'; - if (isset(Collections::parameterPassingTokens()[$tokens[$stackPtr]['code']]) === false) { - throw UnexpectedTokenType::create(2, '$stackPtr', $acceptedTokens, $tokens[$stackPtr]['type']); - } - - // Only accept self/static/parent if preceded by `new` or followed by an open parenthesis. - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if (isset(Collections::ooHierarchyKeywords()[$tokens[$stackPtr]['code']]) === true) { - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($tokens[$prev]['code'] !== \T_NEW - && ($next !== false && $tokens[$next]['code'] !== \T_OPEN_PARENTHESIS) - ) { - throw UnexpectedTokenType::create(2, '$stackPtr', $acceptedTokens, $tokens[$stackPtr]['type']); - } - } - - if (isset(Collections::shortArrayListOpenTokensBC()[$tokens[$stackPtr]['code']]) === true - && $isShortArray !== true - && Arrays::isShortArray($phpcsFile, $stackPtr) === false - ) { - throw UnexpectedTokenType::create(2, '$stackPtr', $acceptedTokens, $tokens[$stackPtr]['type']); - } - - if ($next === false) { - return false; - } - - // Deal with short array syntax. - if (isset(Collections::shortArrayListOpenTokensBC()[$tokens[$stackPtr]['code']]) === true) { - if ($next === $tokens[$stackPtr]['bracket_closer']) { - // No parameters. - return false; - } - - return true; - } - - // Deal with function calls, long arrays, isset, unset and exit/die. - // Next non-empty token should be the open parenthesis. - if ($tokens[$next]['code'] !== \T_OPEN_PARENTHESIS) { - return false; - } - - if (isset($tokens[$next]['parenthesis_closer']) === false) { - return false; - } - - $ignore = Tokens::$emptyTokens; - $ignore[\T_ELLIPSIS] = \T_ELLIPSIS; // Prevent PHP 8.1 first class callables from being seen as function calls. - - $closeParenthesis = $tokens[$next]['parenthesis_closer']; - $nextNextNonEmpty = $phpcsFile->findNext($ignore, ($next + 1), ($closeParenthesis + 1), true); - - if ($nextNextNonEmpty === $closeParenthesis) { - // No parameters. - return false; - } - - return true; - } - - /** - * Get information on all parameters passed. - * - * See {@see PassedParameters::hasParameters()} for information on the supported constructs. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position of function call name, - * language construct or array open token. - * @param int $limit Optional. Limit the parameter retrieval to the first # - * parameters/array entries. - * Use with care on function calls, as this can break - * support for named parameters! - * @param true|null $isShortArray Optional. Short-circuit the short array check for - * `T_OPEN_SHORT_ARRAY` tokens if it isn't necessary. - * Efficiency tweak for when this has already been established, - * Use with EXTREME care. - * - * @return array<int|string, array<string, int|string>> - * A multi-dimentional array with information on each parameter/array item. - * The information gathered about each parameter/array item is in the following format: - * ```php - * 1 => array( - * 'start' => int, // The stack pointer to the first token in the parameter/array item. - * 'end' => int, // The stack pointer to the last token in the parameter/array item. - * 'raw' => string, // A string with the contents of all tokens between `start` and `end`. - * 'clean' => string, // Same as `raw`, but all comment tokens have been stripped out. - * ) - * ``` - * If a named parameter is encountered in a function call, the top-level index will not be - * the parameter _position_, but the _parameter name_ and the array will include two extra keys: - * ```php - * 'parameter_name' => array( - * 'name' => string, // The parameter name (without the colon). - * 'name_token' => int, // The stack pointer to the parameter name token. - * ... - * ) - * ``` - * The `'start'`, `'end'`, `'raw'` and `'clean'` indexes will always contain just and only - * information on the parameter value. - * _Note: The array starts at index 1 for positional parameters._ - * _The key for named parameters will be the parameter name._ - * If no parameters/array items are found, an empty array will be returned. - * - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the token passed does not exist in the $phpcsFile. - * @throws \PHPCSUtils\Exceptions\UnexpectedTokenType If the token passed is not one of the accepted types. - */ - public static function getParameters(File $phpcsFile, $stackPtr, $limit = 0, $isShortArray = null) - { - if (self::hasParameters($phpcsFile, $stackPtr, $isShortArray) === false) { - return []; - } - - $effectiveLimit = (\is_int($limit) && $limit > 0) ? $limit : 0; - - if (Cache::isCached($phpcsFile, __METHOD__, "$stackPtr-$effectiveLimit") === true) { - return Cache::get($phpcsFile, __METHOD__, "$stackPtr-$effectiveLimit"); - } - - if ($effectiveLimit !== 0 && Cache::isCached($phpcsFile, __METHOD__, "$stackPtr-0") === true) { - return \array_slice(Cache::get($phpcsFile, __METHOD__, "$stackPtr-0"), 0, $effectiveLimit, true); - } - - // Ok, we know we have a valid token with parameters and valid open & close brackets/parenthesis. - $tokens = $phpcsFile->getTokens(); - - // Mark the beginning and end tokens. - if (isset(Collections::shortArrayListOpenTokensBC()[$tokens[$stackPtr]['code']]) === true) { - $opener = $stackPtr; - $closer = $tokens[$stackPtr]['bracket_closer']; - } else { - $opener = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - $closer = $tokens[$opener]['parenthesis_closer']; - } - - $mayHaveNames = (isset(Collections::functionCallTokens()[$tokens[$stackPtr]['code']]) === true); - - $parameters = []; - $nextComma = $opener; - $paramStart = ($opener + 1); - $cnt = 1; - $stopPoints = self::$callParsingStopPoints + Tokens::$scopeOpeners; - $stopPoints[] = $tokens[$closer]['code']; - - while (($nextComma = $phpcsFile->findNext($stopPoints, ($nextComma + 1), ($closer + 1))) !== false) { - // Ignore anything within square brackets. - if (isset($tokens[$nextComma]['bracket_opener'], $tokens[$nextComma]['bracket_closer']) - && $nextComma === $tokens[$nextComma]['bracket_opener'] - ) { - $nextComma = $tokens[$nextComma]['bracket_closer']; - continue; - } - - // Skip past nested arrays, function calls and arbitrary groupings. - if ($tokens[$nextComma]['code'] === \T_OPEN_PARENTHESIS - && isset($tokens[$nextComma]['parenthesis_closer']) - ) { - $nextComma = $tokens[$nextComma]['parenthesis_closer']; - continue; - } - - // Skip past closures, anonymous classes and anything else scope related. - if (isset($tokens[$nextComma]['scope_condition'], $tokens[$nextComma]['scope_closer']) - && $tokens[$nextComma]['scope_condition'] === $nextComma - ) { - $nextComma = $tokens[$nextComma]['scope_closer']; - continue; - } - - // Skip over potentially large docblocks. - if ($tokens[$nextComma]['code'] === \T_DOC_COMMENT_OPEN_TAG - && isset($tokens[$nextComma]['comment_closer']) - ) { - $nextComma = $tokens[$nextComma]['comment_closer']; - continue; - } - - // Skip over attributes. - if ($tokens[$nextComma]['code'] === \T_ATTRIBUTE - && isset($tokens[$nextComma]['attribute_closer']) - ) { - $nextComma = $tokens[$nextComma]['attribute_closer']; - continue; - } - - if ($tokens[$nextComma]['code'] !== \T_COMMA - && $tokens[$nextComma]['code'] !== $tokens[$closer]['code'] - ) { - // Just in case. - continue; // @codeCoverageIgnore - } - - // Ok, we've reached the end of the parameter. - $paramEnd = ($nextComma - 1); - $key = $cnt; - - if ($mayHaveNames === true) { - $firstNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, $paramStart, ($paramEnd + 1), true); - if ($firstNonEmpty !== $paramEnd) { - $secondNonEmpty = $phpcsFile->findNext( - Tokens::$emptyTokens, - ($firstNonEmpty + 1), - ($paramEnd + 1), - true - ); - - if ($tokens[$secondNonEmpty]['code'] === \T_COLON - && $tokens[$firstNonEmpty]['code'] === \T_PARAM_NAME - ) { - if (isset($parameters[$tokens[$firstNonEmpty]['content']]) === false) { - // Set the key to be the name, but only if we've not seen this name before. - $key = $tokens[$firstNonEmpty]['content']; - } - - $parameters[$key]['name'] = $tokens[$firstNonEmpty]['content']; - $parameters[$key]['name_token'] = $firstNonEmpty; - $paramStart = ($secondNonEmpty + 1); - } - } - } - - $parameters[$key]['start'] = $paramStart; - $parameters[$key]['end'] = $paramEnd; - $parameters[$key]['raw'] = \trim(GetTokensAsString::normal($phpcsFile, $paramStart, $paramEnd)); - $parameters[$key]['clean'] = \trim(GetTokensAsString::noComments($phpcsFile, $paramStart, $paramEnd)); - - // Check if there are more tokens before the closing parenthesis. - // Prevents function calls with trailing comma's from setting an extra parameter: - // `functionCall( $param1, $param2, );`. - $hasNextParam = $phpcsFile->findNext( - Tokens::$emptyTokens, - ($nextComma + 1), - $closer, - true - ); - if ($hasNextParam === false) { - // Reached the end, so for the purpose of caching, this should be saved as if no limit was set. - $effectiveLimit = 0; - break; - } - - // Stop if there is a valid limit and the limit has been reached. - if ($effectiveLimit !== 0 && $cnt === $effectiveLimit) { - break; - } - - // Prepare for the next parameter. - $paramStart = ($nextComma + 1); - ++$cnt; - } - - if ($effectiveLimit !== 0 && $cnt === $effectiveLimit) { - Cache::set($phpcsFile, __METHOD__, "$stackPtr-$effectiveLimit", $parameters); - } else { - // Limit is 0 or total items is less than effective limit. - Cache::set($phpcsFile, __METHOD__, "$stackPtr-0", $parameters); - } - - return $parameters; - } - - /** - * Get information on a specific parameter passed. - * - * See {@see PassedParameters::hasParameters()} for information on the supported constructs. - * - * @see PassedParameters::getParameterFromStack() For when the parameter stack of a function call is - * already retrieved. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position of function call name, - * language construct or array open token. - * @param int $paramOffset The 1-based index position of the parameter to retrieve. - * @param string|array<string> $paramNames Optional. Either the name of the target parameter - * to retrieve as a string or an array of names for the - * same target parameter. - * Only relevant for function calls. - * An arrays of names is supported to allow for functions - * for which the parameter names have undergone name - * changes over time. - * When specified, the name will take precedence over the - * offset. - * For PHP 8 support, it is STRONGLY recommended to - * always pass both the offset as well as the parameter - * name when examining function calls. - * - * @return array<string, int|string>|false Array with information on the parameter/array item at the specified - * offset, or with the specified name. - * Or `FALSE` if the specified parameter/array item is not found. - * See {@see PassedParameters::getParameters()} for the format of the - * returned (single-dimensional) array. - * - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the token passed does not exist in the $phpcsFile. - * @throws \PHPCSUtils\Exceptions\UnexpectedTokenType If the token passed is not one of the accepted types. - * @throws \PHPCSUtils\Exceptions\MissingArgumentError If a function call parameter is requested and - * the `$paramName` parameter is not passed. - */ - public static function getParameter(File $phpcsFile, $stackPtr, $paramOffset, $paramNames = []) - { - $tokens = $phpcsFile->getTokens(); - - if (empty($paramNames) === true) { - $parameters = self::getParameters($phpcsFile, $stackPtr, $paramOffset); - } else { - $parameters = self::getParameters($phpcsFile, $stackPtr); - } - - /* - * Non-function calls. - */ - if (isset(Collections::functionCallTokens()[$tokens[$stackPtr]['code']]) === false) { - if (isset($parameters[$paramOffset]) === true) { - return $parameters[$paramOffset]; - } - - return false; - } - - /* - * Function calls. - */ - return self::getParameterFromStack($parameters, $paramOffset, $paramNames); - } - - /** - * Count the number of parameters which have been passed. - * - * See {@see PassedParameters::hasParameters()} for information on the supported constructs. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position of function call name, - * language construct or array open token. - * - * @return int - * - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the token passed does not exist in the $phpcsFile. - * @throws \PHPCSUtils\Exceptions\UnexpectedTokenType If the token passed is not one of the accepted types. - */ - public static function getParameterCount(File $phpcsFile, $stackPtr) - { - if (self::hasParameters($phpcsFile, $stackPtr) === false) { - return 0; - } - - return \count(self::getParameters($phpcsFile, $stackPtr)); - } - - /** - * Get information on a specific function call parameter passed. - * - * This is an efficiency method to correctly handle positional versus named parameters - * for function calls when multiple parameters need to be examined. - * - * See {@see PassedParameters::hasParameters()} for information on the supported constructs. - * - * @since 1.0.0 - * - * @param array<int|string, array<string, int|string>> $parameters The output of a previous call to - * {@see PassedParameters::getParameters()}. - * @param int $paramOffset The 1-based index position of the parameter - * to retrieve. - * @param string|array<string> $paramNames Either the name of the target parameter to retrieve - * as a string or an array of names for the same target - * parameter. - * An array of names is supported to allow for functions - * for which the parameter names have undergone name - * changes over time. - * The name will take precedence over the offset. - * - * @return array<string, int|string>|false Array with information on the parameter at the specified offset, - * or with the specified name. - * Or `FALSE` if the specified parameter is not found. - * See {@see PassedParameters::getParameters()} for the format of the - * returned (single-dimensional) array. - * - * @throws \PHPCSUtils\Exceptions\MissingArgumentError If the `$paramNames` parameter is not passed and the - * requested parameter was not passed as a positional - * parameter in the function call being examined. - */ - public static function getParameterFromStack(array $parameters, $paramOffset, $paramNames) - { - if (empty($parameters) === true) { - return false; - } - - // First check for a named parameter. - if (empty($paramNames) === false) { - $paramNames = (array) $paramNames; - foreach ($paramNames as $name) { - // Note: parameter names are case-sensitive!. - if (isset($parameters[$name]) === true) { - return $parameters[$name]; - } - } - } - - // Next check for positional parameters. - if (isset($parameters[$paramOffset]) === true - && isset($parameters[$paramOffset]['name']) === false - ) { - return $parameters[$paramOffset]; - } - - if (empty($paramNames) === true) { - throw MissingArgumentError::create(3, '$paramNames', 'to allow for support for PHP 8 named parameters'); - } - - return false; - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Scopes.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Scopes.php deleted file mode 100644 index 99011fb..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Scopes.php +++ /dev/null @@ -1,143 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2020 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Utils; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Tokens\Collections; -use PHPCSUtils\Utils\Conditions; -use PHPCSUtils\Utils\Parentheses; - -/** - * Utility functions for use when examining token scopes. - * - * @since 1.0.0 - */ -final class Scopes -{ - - /** - * Check whether the direct wrapping scope of a token is within a limited set of - * acceptable tokens. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position in the stack of the - * token to verify. - * @param int|string|array<int|string> $validScopes Array of token constants representing - * the scopes considered valid. - * - * @return int|false Integer stack pointer to the valid direct scope; or `FALSE` if - * no valid direct scope was found. - */ - public static function validDirectScope(File $phpcsFile, $stackPtr, $validScopes) - { - $ptr = Conditions::getLastCondition($phpcsFile, $stackPtr); - - if ($ptr !== false) { - $tokens = $phpcsFile->getTokens(); - $validScopes = (array) $validScopes; - - if (\in_array($tokens[$ptr]['code'], $validScopes, true) === true) { - return $ptr; - } - } - - return false; - } - - /** - * Check whether a T_CONST token is a class/interface/trait/enum constant declaration. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position in the stack of the - * `T_CONST` token to verify. - * - * @return bool - */ - public static function isOOConstant(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]) === false || $tokens[$stackPtr]['code'] !== \T_CONST) { - return false; - } - - if (self::validDirectScope($phpcsFile, $stackPtr, Collections::ooConstantScopes()) !== false) { - return true; - } - - return false; - } - - /** - * Check whether a T_VARIABLE token is a class/trait property declaration. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position in the stack of the - * `T_VARIABLE` token to verify. - * - * @return bool - */ - public static function isOOProperty(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]) === false || $tokens[$stackPtr]['code'] !== \T_VARIABLE) { - return false; - } - - $scopePtr = self::validDirectScope($phpcsFile, $stackPtr, Collections::ooPropertyScopes()); - if ($scopePtr !== false) { - // Make sure it's not a method parameter. - $deepestOpen = Parentheses::getLastOpener($phpcsFile, $stackPtr); - if ($deepestOpen === false - || $deepestOpen < $scopePtr - || Parentheses::isOwnerIn($phpcsFile, $deepestOpen, \T_FUNCTION) === false - ) { - return true; - } - } - - return false; - } - - /** - * Check whether a T_FUNCTION token is a class/interface/trait/enum method declaration. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position in the stack of the - * `T_FUNCTION` token to verify. - * - * @return bool - */ - public static function isOOMethod(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]) === false || $tokens[$stackPtr]['code'] !== \T_FUNCTION) { - return false; - } - - if (self::validDirectScope($phpcsFile, $stackPtr, Tokens::$ooScopeTokens) !== false) { - return true; - } - - return false; - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/TextStrings.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/TextStrings.php deleted file mode 100644 index 53bbff1..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/TextStrings.php +++ /dev/null @@ -1,342 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2020 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Utils; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Exceptions\OutOfBoundsStackPtr; -use PHPCSUtils\Exceptions\TypeError; -use PHPCSUtils\Exceptions\UnexpectedTokenType; -use PHPCSUtils\Exceptions\ValueError; -use PHPCSUtils\Internal\Cache; -use PHPCSUtils\Internal\NoFileCache; -use PHPCSUtils\Tokens\Collections; -use PHPCSUtils\Utils\GetTokensAsString; - -/** - * Utility functions for working with text string tokens. - * - * @since 1.0.0 - */ -final class TextStrings -{ - - /** - * Regex to match the start of an embedded variable/expression. - * - * Prevents matching escaped variables/expressions. - * - * @since 1.0.0 - * - * @var string - */ - const START_OF_EMBED = '`(?<!\\\\)(\\\\{2})*(\{\$|\$\{|\$(?=[a-zA-Z_\x7f-\xff]))`'; - - /** - * Regex to match a "type 1" - directly embedded - variable without the dollar sign. - * - * Allows for array access and property access in as far as supported (single level). - * - * @since 1.0.0 - * - * @var string - */ - const TYPE1_EMBED_AFTER_DOLLAR = - '`(?P<varname>[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)(?:\??->(?P>varname)|\[[^\]\'"\s]+\])?`'; - - /** - * Get the complete contents of a - potentially multi-line - text string. - * - * PHPCS tokenizes multi-line text strings with a single token for each line. - * This method can be used to retrieve the text string as it would be received and - * processed in PHP itself. - * - * This method is particularly useful for sniffs which examine the contents of text strings, - * where the content matching might result in false positives/false negatives if the text - * were to be examined line by line. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr Pointer to the first text string token - * of a - potentially multi-line - text string - * or to a Nowdoc/Heredoc opener. - * @param bool $stripQuotes Optional. Whether to strip text delimiter - * quotes off the resulting text string. - * Defaults to `true`. - * - * @return string The contents of the complete text string. - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $stackPtr parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the token passed does not exist in the $phpcsFile. - * @throws \PHPCSUtils\Exceptions\UnexpectedTokenType If the token passed is not a valid text string token. - * @throws \PHPCSUtils\Exceptions\ValueError If the specified token is not the _first_ token in - * a text string. - */ - public static function getCompleteTextString(File $phpcsFile, $stackPtr, $stripQuotes = true) - { - $tokens = $phpcsFile->getTokens(); - $end = self::getEndOfCompleteTextString($phpcsFile, $stackPtr); - - $stripNewline = false; - if ($tokens[$stackPtr]['code'] === \T_START_HEREDOC || $tokens[$stackPtr]['code'] === \T_START_NOWDOC) { - $stripQuotes = false; - $stripNewline = true; - $stackPtr = ($stackPtr + 1); - } - - $contents = GetTokensAsString::normal($phpcsFile, $stackPtr, $end); - - if ($stripNewline === true) { - // Heredoc/nowdoc: strip the new line at the end of the string to emulate how PHP sees the string. - $contents = \rtrim($contents, "\r\n"); - } - - if ($stripQuotes === true) { - return self::stripQuotes($contents); - } - - return $contents; - } - - /** - * Get the stack pointer to the end of a - potentially multi-line - text string. - * - * @see \PHPCSUtils\Utils\TextStrings::getCompleteTextString() Retrieve the contents of a complete - potentially - * multi-line - text string. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr Pointer to the first text string token - * of a - potentially multi-line - text string - * or to a Nowdoc/Heredoc opener. - * - * @return int Stack pointer to the last token in the text string. - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $stackPtr parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the token passed does not exist in the $phpcsFile. - * @throws \PHPCSUtils\Exceptions\UnexpectedTokenType If the token passed is not a valid text string token. - * @throws \PHPCSUtils\Exceptions\ValueError If the specified token is not the _first_ token in - * a text string. - */ - public static function getEndOfCompleteTextString(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (\is_int($stackPtr) === false) { - throw TypeError::create(2, '$stackPtr', 'integer', $stackPtr); - } - - if (isset($tokens[$stackPtr]) === false) { - throw OutOfBoundsStackPtr::create(2, '$stackPtr', $stackPtr); - } - - if (isset(Collections::textStringStartTokens()[$tokens[$stackPtr]['code']]) === false) { - $acceptedTokens = 'T_START_HEREDOC, T_START_NOWDOC, T_CONSTANT_ENCAPSED_STRING or T_DOUBLE_QUOTED_STRING'; - throw UnexpectedTokenType::create(2, '$stackPtr', $acceptedTokens, $tokens[$stackPtr]['type']); - } - - // Must be the start of a text string token. - if (isset(Tokens::$stringTokens[$tokens[$stackPtr]['code']]) === true) { - $prev = $phpcsFile->findPrevious(\T_WHITESPACE, ($stackPtr - 1), null, true); - if ($tokens[$stackPtr]['code'] === $tokens[$prev]['code']) { - throw ValueError::create(2, '$stackPtr', 'must be the start of the text string'); - } - } - - if (Cache::isCached($phpcsFile, __METHOD__, $stackPtr) === true) { - return Cache::get($phpcsFile, __METHOD__, $stackPtr); - } - - switch ($tokens[$stackPtr]['code']) { - case \T_START_HEREDOC: - $targetType = \T_HEREDOC; - $current = ($stackPtr + 1); - break; - - case \T_START_NOWDOC: - $targetType = \T_NOWDOC; - $current = ($stackPtr + 1); - break; - - default: - $targetType = $tokens[$stackPtr]['code']; - $current = $stackPtr; - break; - } - - while (isset($tokens[$current]) && $tokens[$current]['code'] === $targetType) { - ++$current; - } - - $lastPtr = ($current - 1); - - Cache::set($phpcsFile, __METHOD__, $stackPtr, $lastPtr); - return $lastPtr; - } - - /** - * Strip text delimiter quotes from an arbitrary text string. - * - * Intended for use with the "content" of a `T_CONSTANT_ENCAPSED_STRING` / `T_DOUBLE_QUOTED_STRING`. - * - * - Prevents stripping mis-matched quotes. - * - Prevents stripping quotes from the textual content of the text string. - * - * @since 1.0.0 - * - * @param string $textString The raw text string. - * - * @return string Text string without quotes around it. - */ - public static function stripQuotes($textString) - { - return \preg_replace('`^([\'"])(.*)\1$`Ds', '$2', $textString); - } - - /** - * Get the embedded variables/expressions from an arbitrary string. - * - * Note: this function gets the complete variables/expressions _as they are embedded_, - * i.e. including potential curly brace wrappers, array access, method calls etc. - * - * @since 1.0.0 - * - * @param string $text The contents of a T_DOUBLE_QUOTED_STRING or T_HEREDOC token. - * - * @return array<int, string> Array of encountered variable names/expressions with the offset at which - * the variable/expression was found in the string, as the key. - */ - public static function getEmbeds($text) - { - return self::getStripEmbeds($text)['embeds']; - } - - /** - * Strip embedded variables/expressions from an arbitrary string. - * - * @since 1.0.0 - * - * @param string $text The contents of a T_DOUBLE_QUOTED_STRING or T_HEREDOC token. - * - * @return string String without variables/expressions in it. - */ - public static function stripEmbeds($text) - { - return self::getStripEmbeds($text)['remaining']; - } - - /** - * Split an arbitrary text string into embedded variables/expressions and remaining text. - * - * PHP contains four types of embedding syntaxes: - * 1. Directly embedding variables ("$foo"); - * 2. Braces outside the variable ("{$foo}"); - * 3. Braces after the dollar sign ("${foo}"); - * 4. Variable variables ("${expr}", equivalent to (string) ${expr}). - * - * Type 3 and 4 are deprecated as of PHP 8.2 and will be removed in PHP 9.0. - * - * This method handles all types of embeds, including recognition of whether an embed is escaped or not. - * - * @link https://www.php.net/language.types.string#language.types.string.parsing PHP Manual on string parsing - * @link https://wiki.php.net/rfc/deprecate_dollar_brace_string_interpolation PHP RFC on deprecating select - * string interpolation syntaxes - * - * @since 1.0.0 - * - * @param string $text The contents of a T_DOUBLE_QUOTED_STRING or T_HEREDOC token. - * - * @return array<string, mixed> Array containing two values: - * 1. An array containing a string representation of each embed encountered. - * The keys in this array are the integer offset within the original string - * where the embed was found. - * 2. The textual contents, embeds stripped out of it. - * The format of the array return value is: - * ```php - * array( - * 'embeds' => array<int, string>, - * 'remaining' => string, - * ) - * ``` - */ - public static function getStripEmbeds($text) - { - if (\strpos($text, '$') === false) { - return [ - 'embeds' => [], - 'remaining' => $text, - ]; - } - - $textHash = \md5($text); - if (NoFileCache::isCached(__METHOD__, $textHash) === true) { - return NoFileCache::get(__METHOD__, $textHash); - } - - $offset = 0; - $strLen = \strlen($text); // Use iconv ? - $stripped = ''; - $variables = []; - - while (\preg_match(self::START_OF_EMBED, $text, $matches, \PREG_OFFSET_CAPTURE, $offset) === 1) { - $stripped .= \substr($text, $offset, ($matches[2][1] - $offset)); - - $matchedExpr = $matches[2][0]; - $matchedOffset = $matches[2][1]; - $braces = \substr_count($matchedExpr, '{'); - $newOffset = $matchedOffset + \strlen($matchedExpr); - - if ($braces === 0) { - /* - * Type 1: simple variable embed. - * Regex will always return a match due to the look ahead in the above regex. - */ - \preg_match(self::TYPE1_EMBED_AFTER_DOLLAR, $text, $endMatch, 0, $newOffset); - $matchedExpr .= $endMatch[0]; - $variables[$matchedOffset] = $matchedExpr; - $offset = $newOffset + \strlen($endMatch[0]); - continue; - } - - for (; $newOffset < $strLen; $newOffset++) { - if ($text[$newOffset] === '{') { - ++$braces; - continue; - } - - if ($text[$newOffset] === '}') { - --$braces; - if ($braces === 0) { - $matchedExpr = \substr($text, $matchedOffset, (1 + $newOffset - $matchedOffset)); - $variables[$matchedOffset] = $matchedExpr; - $offset = ($newOffset + 1); - break; - } - } - } - } - - if ($offset < $strLen) { - // Add the end of the string. - $stripped .= \substr($text, $offset); - } - - $returnValue = [ - 'embeds' => $variables, - 'remaining' => $stripped, - ]; - - NoFileCache::set(__METHOD__, $textHash, $returnValue); - return $returnValue; - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/TypeString.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/TypeString.php deleted file mode 100644 index 0eab1cd..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/TypeString.php +++ /dev/null @@ -1,406 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2024 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Utils; - -use PHPCSUtils\Exceptions\TypeError; - -/** - * Utility functions for use when examining type strings. - * - * The methods in this class are intended to be used with type strings as returned by: - * - [BC]File::getMethodParameters()['type_hint'] - * - [BC]File::getMethodProperties()['return_type'] - * - [BC]File::getMemberProperties()['type'] - * - Constants::getProperties()['type'] - * - FunctionDeclarations::getParameters()['type_hint'] - * - FunctionDeclarations::getProperties()['return_type'] - * - Variables::getMemberProperties()['type'] - * - * Notes: - * - Type strings as retrieved from the above listed sources will not contain any whitespace, - * so the methods in this class have limited or no handling for surrounding or internal whitespace. - * - The behaviour with type strings retrieved by other means, or non-type strings, is undefined. - * :warning: Using these methods with type strings retrieved from docblocks is **strongly discouraged**. - * - The `is*()` methods will **not** check if the type string provided is **_valid_**, as doing so would inhibit - * what sniffs can flag. - * The `is*()` methods will only look at the _form_ of the type string to determine if it _could_ be valid - * for a certain type. - * - Use the {@see \PHPCSUtils\Utils\NamingConventions::isValidIdentifierName()} method if additional validity - * checks are needed on the individual "types" seen in a type string. - * - And, if needed, use token walking on the tokens of the type to determine whether a type string actually - * complies with the type rules as set by PHP. - * - * @see \PHPCSUtils\BackCompat\BCFile::getMethodParameters() - * @see \PHPCSUtils\BackCompat\BCFile::getMethodProperties() - * @see \PHPCSUtils\BackCompat\BCFile::getMemberProperties() - * @see \PHPCSUtils\Utils\Constants::getProperties() - * @see \PHPCSUtils\Utils\FunctionDeclarations::getParameters() - * @see \PHPCSUtils\Utils\FunctionDeclarations::getProperties() - * @see \PHPCSUtils\Utils\Variables::getMemberProperties() - * - * @since 1.1.0 - */ -final class TypeString -{ - - /** - * Regex to filter out some matches for invalid "DNF-lookalike" types. - * - * A type string should **not** match against this regex to be considered potentially valid. - * - * @internal - * - * @since 1.1.0 - * - * @var string - */ - const INVALID_DNF_REGEX = '`(?: - [()|]\s*& # Make sure that a "&" is always preceeded by something different than "(", ")" or "|". - | - &\s*[()|] # Make sure that a "&" is always followed by something different than "(", ")" or "|". - | - \S+\s*[^|\s]\s*\( # Make sure that a "(" not at the start of the type string is always preceeded by something + "|". - | - \)\s*[^|\s]\s*\S+ # Make sure that a ")" not at the end of the type string is always followed by "|" + something. - )`x'; - - /** - * A list of all keyword based types in PHP. - * - * The names are listed in lowercase as type names in PHP are case-insensitive - * and comparisons against this list should therefore always be done in a case-insensitive manner. - * - * @since 1.1.0 - * - * @var array<string, string> - */ - private static $keywordTypes = [ - 'array' => 'array', - 'bool' => 'bool', - 'callable' => 'callable', - 'false' => 'false', - 'float' => 'float', - 'int' => 'int', - 'iterable' => 'iterable', - 'mixed' => 'mixed', - 'never' => 'never', - 'null' => 'null', - 'object' => 'object', - 'parent' => 'parent', - 'self' => 'self', - 'static' => 'static', - 'string' => 'string', - 'true' => 'true', - 'void' => 'void', - ]; - - /** - * Retrieve a list of all PHP native keyword types. - * - * @since 1.1.0 - * - * @return array<string, string> Key and value both contain the type name in lowercase. - */ - public static function getKeywordTypes() - { - return self::$keywordTypes; - } - - /** - * Check if a singular type is a PHP native keyword based type. - * - * @since 1.1.0 - * - * @param string $type The singular type. - * - * @return bool - */ - public static function isKeyword($type) - { - if (\is_string($type) === false) { - return false; - } - - $typeLC = \strtolower(\ltrim(\trim($type), '\\')); - return isset(self::$keywordTypes[$typeLC]); - } - - /** - * Normalize the case for a single type. - * - * - Types which are recognized PHP "keyword" types will be returned in lowercase. - * - Types which are recognized PHP "keyword" types and are incorrectly provided as fully qualified - * (typically: true/false/null) will be returned as unqualified. - * - Class/Interface/Enum names will be returned in their original case. - * - * @since 1.1.0 - * @since 1.1.2 Will now also normalize (illegal) FQN true/false/null to unqualified. - * - * @param string $type Type to normalize the case for. - * - * @return string The case-normalized type or an empty string if the input was invalid. - */ - public static function normalizeCase($type) - { - if (\is_string($type) === false) { - return ''; - } - - if (self::isKeyword($type)) { - return \strtolower(\ltrim($type, '\\')); - } - - return $type; - } - - /** - * Check if a type string represents a plain, singular type. - * - * Note: Nullable types are not considered plain, singular types for the purposes of this method. - * - * @since 1.1.0 - * - * @param string $typeString Type string. - * - * @return bool - */ - public static function isSingular($typeString) - { - if (\is_string($typeString) === false) { - return false; - } - - $typeString = \trim($typeString); - - return empty($typeString) === false - && \strpos($typeString, '?') === false - && \strpos($typeString, '|') === false - && \strpos($typeString, '&') === false - && \strpos($typeString, '(') === false - && \strpos($typeString, ')') === false; - } - - /** - * Check if a type string represents a nullable type. - * - * A nullable type in the context of this method is a type which - * - starts with the nullable operator and has something after it which is being made nullable; - * - or contains `null` as part of a union or DNF type. - * - * A stand-alone `null` type is not considered a nullable type, but a singular type. - * - * @since 1.1.0 - * - * @param string $typeString Type string. - * - * @return bool - */ - public static function isNullable($typeString) - { - if (\is_string($typeString) === false) { - return false; - } - - $typeString = \trim($typeString); - if (empty($typeString) === true) { - return false; - } - - // Check for plain nullable type with something which is being made nullable. - if (\preg_match('`^\?\s*[^|&()?\s]+`', $typeString) === 1) { - return true; - } - - // Check for nullable union type. - $matched = \preg_match( - '`(?<before>^|[^|&(?\s]+\s*\|)\s*[\\\\]?null\s*(?<after>\|\s*[^|&)?\s]+|$)`i', - $typeString, - $matches - ); - return ($matched === 1 - && (empty($matches['before']) === false || empty($matches['after']) === false)); - } - - /** - * Check if a type string represents a pure union type. - * - * Note: DNF types are not considered union types for the purpose of this method. - * - * @since 1.1.0 - * - * @param string $typeString Type string. - * - * @return bool - */ - public static function isUnion($typeString) - { - return \is_string($typeString) - && \strpos($typeString, '?') === false - && \strpos($typeString, '|') !== false - && \strpos($typeString, '&') === false - && \strpos($typeString, '(') === false - && \strpos($typeString, ')') === false - // Make sure there is always something before and after each |. - && \preg_match('`^[^|&()?\s]+(\s*\|\s*[^|&()?\s]+)+$`', $typeString) === 1; - } - - /** - * Check if a type string represents a pure intersection type. - * - * Note: DNF types are not considered intersection types for the purpose of this method. - * - * @since 1.1.0 - * - * @param string $typeString Type string. - * - * @return bool - */ - public static function isIntersection($typeString) - { - return \is_string($typeString) - && \strpos($typeString, '?') === false - && \strpos($typeString, '|') === false - && \strpos($typeString, '&') !== false - && \strpos($typeString, '(') === false - && \strpos($typeString, ')') === false - // Make sure there is always something before and after each &. - && \preg_match('`^[^|&()?\s]+(\s*&\s*[^|&()?\s]+)+$`', $typeString) === 1; - } - - /** - * Check if a type string represents a disjunctive normal form (DNF) type. - * - * This check for a strict - * - * @since 1.1.0 - * - * @param string $typeString Type string. - * - * @return bool - */ - public static function isDNF($typeString) - { - return \is_string($typeString) - && \strpos($typeString, '?') === false - && \strpos($typeString, '|') !== false - && \strpos($typeString, '&') !== false - && \strpos($typeString, '(') !== false - && \strpos($typeString, ')') !== false - // Now make sure that it is not a definitely invalid format. - && \preg_match(self::INVALID_DNF_REGEX, $typeString) !== 1; - } - - /** - * Split a type string to its individual types and optionally normalize the case of the types. - * - * @since 1.1.0 - * - * @param string $typeString Type to split. - * @param bool $normalize Whether or not to normalize the case of types. - * Defaults to true. - * - * @return array<string> List containing all seen types in the order they were encountered. - * - * @throws \PHPCSUtils\Exceptions\TypeError If passed $typeString is not a string. - */ - public static function toArray($typeString, $normalize = true) - { - if (\is_string($typeString) === false) { - throw TypeError::create(1, '$typeString', 'string', $typeString); - } - - if (\trim($typeString) === '') { - return []; - } - - $addNull = false; - if ($typeString[0] === '?') { - $addNull = true; - $typeString = \substr($typeString, 1); - } - - $typeString = \preg_replace('`\s+`', '', $typeString); - $types = \preg_split('`[|&()]+`', $typeString, -1, \PREG_SPLIT_NO_EMPTY); - - // Normalize the types. - if ($normalize === true) { - $types = \array_map([__CLASS__, 'normalizeCase'], $types); - } - - if ($addNull === true) { - \array_unshift($types, 'null'); - } - - return $types; - } - - /** - * Split a type string to the unique types included and optionally normalize the case of the types. - * - * @since 1.1.0 - * - * @param string $typeString Type to split. - * @param bool $normalize Whether or not to normalize the case of types. - * Defaults to true. - * - * @return array<string, string> Associative array with the unique types as both the key as well as the value. - * - * @throws \PHPCSUtils\Exceptions\TypeError If passed $typeString is not a string. - */ - public static function toArrayUnique($typeString, $normalize = true) - { - $types = self::toArray($typeString, $normalize); - return \array_combine($types, $types); - } - - /** - * Filter a list of types down to only the keyword based types. - * - * @since 1.1.0 - * - * @param array<int|string, string> $types Array of types. - * Typically, this is an array as retrieved from the - * {@see TypeString::toArray()} method or the - * {@see TypeString::toArrayUnique()} method. - * - * @return array<int|string, string> Array with only the PHP native keyword based types. - * The result may be an empty array if the input array didn't contain - * any keyword based types or if the input was invalid. - */ - public static function filterKeywordTypes(array $types) - { - return \array_filter($types, [__CLASS__, 'isKeyword']); - } - - /** - * Filter a list of types down to only the OO name based types. - * - * @since 1.1.0 - * - * @param array<int|string, string> $types Array of types. - * Typically, this is an array as retrieved from the - * {@see TypeString::toArray()} method or the - * {@see TypeString::toArrayUnique()} method. - * - * @return array<int|string, string> Array with only the OO name based types. - * The result may be an empty array if the input array didn't contain - * any OO name based types or if the input was invalid. - */ - public static function filterOOTypes(array $types) - { - return \array_filter( - $types, - static function ($type) { - return \is_string($type) === true && self::isKeyword($type) === false; - } - ); - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/UseStatements.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/UseStatements.php deleted file mode 100644 index 7055fab..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/UseStatements.php +++ /dev/null @@ -1,446 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2020 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Utils; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Exceptions\OutOfBoundsStackPtr; -use PHPCSUtils\Exceptions\TypeError; -use PHPCSUtils\Exceptions\UnexpectedTokenType; -use PHPCSUtils\Exceptions\ValueError; -use PHPCSUtils\Internal\Cache; -use PHPCSUtils\Utils\Conditions; -use PHPCSUtils\Utils\Parentheses; - -/** - * Utility functions for examining use statements. - * - * @since 1.0.0 - */ -final class UseStatements -{ - - /** - * Determine what a T_USE token is used for. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the `T_USE` token. - * - * @return string Either `'closure'`, `'import'` or `'trait'`. - * An empty string will be returned if the token is used in an - * invalid context or if it couldn't be reliably determined what - * the `T_USE` token is used for. An empty string being returned will - * normally mean the code being examined contains a parse error. - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $stackPtr parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the token passed does not exist in the $phpcsFile. - * @throws \PHPCSUtils\Exceptions\UnexpectedTokenType If the token passed is not a `T_USE` token. - */ - public static function getType(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (\is_int($stackPtr) === false) { - throw TypeError::create(2, '$stackPtr', 'integer', $stackPtr); - } - - if (isset($tokens[$stackPtr]) === false) { - throw OutOfBoundsStackPtr::create(2, '$stackPtr', $stackPtr); - } - - if ($tokens[$stackPtr]['code'] !== \T_USE) { - throw UnexpectedTokenType::create(2, '$stackPtr', 'T_USE', $tokens[$stackPtr]['type']); - } - - // More efficient & simpler check for closure use in PHPCS 4.x. - if (isset($tokens[$stackPtr]['parenthesis_owner']) - && $tokens[$stackPtr]['parenthesis_owner'] === $stackPtr - ) { - return 'closure'; - } - - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($prev !== false && $tokens[$prev]['code'] === \T_CLOSE_PARENTHESIS - // T_FUNCTION is included to handle certain parse errors, which are still clearly closure use, correctly. - && Parentheses::isOwnerIn($phpcsFile, $prev, [\T_CLOSURE, \T_FUNCTION]) === true - ) { - return 'closure'; - } - - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($next === false) { - // Live coding or parse error. - return ''; - } - - $lastCondition = Conditions::getLastCondition($phpcsFile, $stackPtr); - if ($lastCondition === false || $tokens[$lastCondition]['code'] === \T_NAMESPACE) { - // Global or scoped namespace and not a closure use statement. - return 'import'; - } - - $traitScopes = Tokens::$ooScopeTokens; - // Only classes, traits and enums can import traits. - unset($traitScopes[\T_INTERFACE]); - - if (isset($traitScopes[$tokens[$lastCondition]['code']]) === true) { - return 'trait'; - } - - return ''; - } - - /** - * Determine whether a T_USE token represents a closure use statement. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the `T_USE` token. - * - * @return bool `TRUE` if the token passed is a closure use statement. - * `FALSE` if it's not. - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $stackPtr parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the token passed does not exist in the $phpcsFile. - * @throws \PHPCSUtils\Exceptions\UnexpectedTokenType If the token passed is not a `T_USE` token. - */ - public static function isClosureUse(File $phpcsFile, $stackPtr) - { - return (self::getType($phpcsFile, $stackPtr) === 'closure'); - } - - /** - * Determine whether a T_USE token represents a class/function/constant import use statement. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the `T_USE` token. - * - * @return bool `TRUE` if the token passed is an import use statement. - * `FALSE` if it's not. - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $stackPtr parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the token passed does not exist in the $phpcsFile. - * @throws \PHPCSUtils\Exceptions\UnexpectedTokenType If the token passed is not a `T_USE` token. - */ - public static function isImportUse(File $phpcsFile, $stackPtr) - { - return (self::getType($phpcsFile, $stackPtr) === 'import'); - } - - /** - * Determine whether a T_USE token represents a trait use statement. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the `T_USE` token. - * - * @return bool `TRUE` if the token passed is a trait use statement. - * `FALSE` if it's not. - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $stackPtr parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the token passed does not exist in the $phpcsFile. - * @throws \PHPCSUtils\Exceptions\UnexpectedTokenType If the token passed is not a `T_USE` token. - */ - public static function isTraitUse(File $phpcsFile, $stackPtr) - { - return (self::getType($phpcsFile, $stackPtr) === 'trait'); - } - - /** - * Split an import use statement into individual imports. - * - * Handles single import, multi-import and group-import use statements. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position in the stack of the `T_USE` token. - * - * @return array<string, array<string, string>> - * A multi-level array containing information about the use statement. - * The first level is `'name'`, `'function'` and `'const'`. These keys will always exist. - * If any statements are found for any of these categories, the second level - * will contain the alias/name as the key and the full original use name as the - * value for each of the found imports or an empty array if no imports were found - * in this use statement for a particular category. - * - * For example, for this function group use statement: - * ```php - * use function Vendor\Package\{ - * LevelA\Name as Alias, - * LevelB\Another_Name, - * }; - * ``` - * the return value would look like this: - * ```php - * array( - * 'name' => array(), - * 'function' => array( - * 'Alias' => 'Vendor\Package\LevelA\Name', - * 'Another_Name' => 'Vendor\Package\LevelB\Another_Name', - * ), - * 'const' => array(), - * ) - * ``` - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $stackPtr parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the token passed does not exist in the $phpcsFile. - * @throws \PHPCSUtils\Exceptions\UnexpectedTokenType If the token passed is not a `T_USE` token. - * @throws \PHPCSUtils\Exceptions\ValueError If the `T_USE` token is not for an import use statement. - */ - public static function splitImportUseStatement(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (self::isImportUse($phpcsFile, $stackPtr) === false) { - throw ValueError::create(2, '$stackPtr', 'must be the pointer to an import use statement'); - } - - if (Cache::isCached($phpcsFile, __METHOD__, $stackPtr) === true) { - return Cache::get($phpcsFile, __METHOD__, $stackPtr); - } - - $statements = [ - 'name' => [], - 'function' => [], - 'const' => [], - ]; - - $endOfStatement = $phpcsFile->findNext([\T_SEMICOLON, \T_CLOSE_TAG], ($stackPtr + 1)); - if ($endOfStatement === false) { - // Live coding or parse error. - Cache::set($phpcsFile, __METHOD__, $stackPtr, $statements); - return $statements; - } - - ++$endOfStatement; - - $start = true; - $useGroup = false; - $hasAlias = false; - $baseName = ''; - $name = ''; - $type = ''; - $fixedType = false; - $alias = ''; - - for ($i = ($stackPtr + 1); $i < $endOfStatement; $i++) { - if (isset(Tokens::$emptyTokens[$tokens[$i]['code']]) === true) { - continue; - } - - $tokenCode = $tokens[$i]['code']; - switch ($tokenCode) { - case \T_STRING: - // Only when either at the start of the statement or at the start of a new sub within a group. - if ($start === true && $fixedType === false) { - $content = \strtolower($tokens[$i]['content']); - if ($content === 'function' - || $content === 'const' - ) { - $type = $content; - $start = false; - if ($useGroup === false) { - $fixedType = true; - } - - break; - } else { - $type = 'name'; - } - } - - $start = false; - - if ($hasAlias === false) { - $name .= $tokens[$i]['content']; - } - - $alias = $tokens[$i]['content']; - break; - - case \T_NAME_QUALIFIED: - case \T_NAME_FULLY_QUALIFIED: // This would be a parse error, but handle it anyway. - /* - * PHPCS 4.x. - * - * These tokens can only be encountered when either at the start of the statement - * or at the start of a new sub within a group. - */ - if ($start === true && $fixedType === false) { - $type = 'name'; - } - - $start = false; - - if ($hasAlias === false) { - $name .= $tokens[$i]['content']; - } - - $alias = \substr($tokens[$i]['content'], (\strrpos($tokens[$i]['content'], '\\') + 1)); - break; - - case \T_AS: - $hasAlias = true; - break; - - case \T_OPEN_USE_GROUP: - $start = true; - $useGroup = true; - $baseName = $name; - $name = ''; - break; - - case \T_SEMICOLON: - case \T_CLOSE_TAG: - case \T_CLOSE_USE_GROUP: - case \T_COMMA: - if ($name !== '') { - if ($useGroup === true) { - $statements[$type][$alias] = \ltrim($baseName, '\\') . $name; - } else { - $statements[$type][$alias] = \ltrim($name, '\\'); - } - } - - if ($tokenCode !== \T_COMMA) { - break 2; - } - - // Reset. - $start = true; - $name = ''; - $hasAlias = false; - if ($fixedType === false) { - $type = ''; - } - break; - - case \T_NS_SEPARATOR: - $name .= $tokens[$i]['content']; - break; - - /* - * Fall back in case reserved keyword is (illegally) used in name. - * Parse error, but not our concern. - */ - default: - if ($hasAlias === false) { - // Defensive coding, just in case. Should no longer be possible since PHPCS 3.7.0. - $name .= $tokens[$i]['content']; // @codeCoverageIgnore - } - - $alias = $tokens[$i]['content']; - break; - } - } - - Cache::set($phpcsFile, __METHOD__, $stackPtr, $statements); - return $statements; - } - - /** - * Split an import use statement into individual imports and merge it with an array of previously - * seen import use statements. - * - * Beware: this method should only be used to combine the import use statements found in *one* file. - * Do NOT combine the statements of multiple files as the result will be inaccurate and unreliable. - * - * In most cases when tempted to use this method, the {@see \PHPCSUtils\AbstractSniffs\AbstractFileContextSniff} - * (upcoming) should be used instead. - * - * @see \PHPCSUtils\AbstractSniffs\AbstractFileContextSniff - * @see \PHPCSUtils\Utils\UseStatements::splitImportUseStatement() - * @see \PHPCSUtils\Utils\UseStatements::mergeImportUseStatements() - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position in the stack of the - * `T_USE` token. - * @param array<string, array<string, string>> $previousUseStatements The import `use` statements collected so far. - * This should be either the output of a - * previous call to this method or the output of - * an earlier call to the - * {@see UseStatements::splitImportUseStatement()} - * method. - * - * @return array<string, array<string, string>> - * A multi-level array containing information about the current `use` statement combined with - * the previously collected `use` statement information. - * See {@see UseStatements::splitImportUseStatement()} for more details about the array format. - */ - public static function splitAndMergeImportUseStatement(File $phpcsFile, $stackPtr, array $previousUseStatements) - { - try { - $useStatements = self::splitImportUseStatement($phpcsFile, $stackPtr); - $previousUseStatements = self::mergeImportUseStatements($previousUseStatements, $useStatements); - } catch (ValueError $e) { - // Not an import use statement. - } - - return $previousUseStatements; - } - - /** - * Merge two import use statement arrays. - * - * Beware: this method should only be used to combine the import use statements found in *one* file. - * Do NOT combine the statements of multiple files as the result will be inaccurate and unreliable. - * - * @see \PHPCSUtils\Utils\UseStatements::splitImportUseStatement() - * - * @since 1.0.0 - * - * @param array<string, array<string, string>> $previousUseStatements The import `use` statements collected so far. - * This should be either the output of a - * previous call to this method or the output of - * an earlier call to the - * {@see UseStatements::splitImportUseStatement()} - * method. - * @param array<string, array<string, string>> $currentUseStatement The parsed import `use` statements to merge with - * the previously collected use statements. - * This should be the output of a call to the - * {@see UseStatements::splitImportUseStatement()} - * method. - * - * @return array<string, array<string, string>> - * A multi-level array containing information about the current `use` statement combined with - * the previously collected `use` statement information. - * See {@see UseStatements::splitImportUseStatement()} for more details about the array format. - */ - public static function mergeImportUseStatements(array $previousUseStatements, array $currentUseStatement) - { - if (isset($previousUseStatements['name']) === false) { - $previousUseStatements['name'] = $currentUseStatement['name']; - } else { - $previousUseStatements['name'] += $currentUseStatement['name']; - } - if (isset($previousUseStatements['function']) === false) { - $previousUseStatements['function'] = $currentUseStatement['function']; - } else { - $previousUseStatements['function'] += $currentUseStatement['function']; - } - if (isset($previousUseStatements['const']) === false) { - $previousUseStatements['const'] = $currentUseStatement['const']; - } else { - $previousUseStatements['const'] += $currentUseStatement['const']; - } - - return $previousUseStatements; - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Variables.php b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Variables.php deleted file mode 100644 index cfc68d1..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/Utils/Variables.php +++ /dev/null @@ -1,405 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * @package PHPCSUtils - * @copyright 2019-2020 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - */ - -namespace PHPCSUtils\Utils; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; -use PHPCSUtils\Exceptions\OutOfBoundsStackPtr; -use PHPCSUtils\Exceptions\TypeError; -use PHPCSUtils\Exceptions\UnexpectedTokenType; -use PHPCSUtils\Exceptions\ValueError; -use PHPCSUtils\Internal\AttributeHelper; -use PHPCSUtils\Internal\Cache; -use PHPCSUtils\Tokens\Collections; -use PHPCSUtils\Utils\Scopes; -use PHPCSUtils\Utils\TextStrings; - -/** - * Utility functions for use when examining variables. - * - * @since 1.0.0 The `Variables::getMemberProperties()` method is based on and inspired by - * the method of the same name in the PHPCS native `PHP_CodeSniffer\Files\File` class. - * Also see {@see \PHPCSUtils\BackCompat\BCFile}. - */ -final class Variables -{ - - /** - * List of PHP Reserved variables. - * - * The array keys are the variable names without the leading dollar sign, the values indicate - * whether the variable is a superglobal or not. - * - * The variables names are set without the leading dollar sign to allow this array - * to be used with array index keys as well. Think: `'_GET'` in `$GLOBALS['_GET']`.} - * - * @link https://php.net/reserved.variables PHP Manual on reserved variables - * - * @since 1.0.0 - * - * @var array<string, bool> - */ - public static $phpReservedVars = [ - '_SERVER' => true, - '_GET' => true, - '_POST' => true, - '_REQUEST' => true, - '_SESSION' => true, - '_ENV' => true, - '_COOKIE' => true, - '_FILES' => true, - 'GLOBALS' => true, - 'http_response_header' => false, - 'argc' => false, - 'argv' => false, - - // Deprecated. - 'php_errormsg' => false, - - // Removed PHP 5.4.0. - 'HTTP_SERVER_VARS' => false, - 'HTTP_GET_VARS' => false, - 'HTTP_POST_VARS' => false, - 'HTTP_SESSION_VARS' => false, - 'HTTP_ENV_VARS' => false, - 'HTTP_COOKIE_VARS' => false, - 'HTTP_POST_FILES' => false, - - // Removed PHP 5.6.0. - 'HTTP_RAW_POST_DATA' => false, - ]; - - /** - * Retrieve the visibility and implementation properties of a class member variable. - * - * Main differences with the PHPCS version: - * - Removed the parse error warning for properties in enums (PHPCS 4.0 makes the same change). - * This will now throw the same _"$stackPtr is not a class member var"_ runtime exception as - * other non-property variables passed to the method. - * - Defensive coding against incorrect calls to this method. - * - Support PHP 8.0 identifier name tokens in property types, cross-version PHP & PHPCS. - * - The results of this function call are cached during a PHPCS run for faster response times. - * - * @see \PHP_CodeSniffer\Files\File::getMemberProperties() Original source. - * @see \PHPCSUtils\BackCompat\BCFile::getMemberProperties() Cross-version compatible version of the original. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position in the stack of the `T_VARIABLE` token - * to acquire the properties for. - * - * @return array<string, mixed> Array with information about the class member variable. - * The format of the return value is: - * ```php - * array( - * 'scope' => string, // Public, private, or protected. - * 'scope_specified' => boolean, // TRUE if the scope was explicitly specified. - * 'set_scope' => string|false, // Scope for asymmetric visibility. - * // Either public, private, or protected or - * // FALSE if no set scope is specified. - * 'is_static' => boolean, // TRUE if the static keyword was found. - * 'is_readonly' => boolean, // TRUE if the readonly keyword was found. - * 'is_final' => boolean, // TRUE if the final keyword was found. - * 'is_abstract' => boolean, // TRUE if the abstract keyword was found. - * 'type' => string, // The type of the var (empty if no type specified). - * 'type_token' => integer|false, // The stack pointer to the start of the type - * // or FALSE if there is no type. - * 'type_end_token' => integer|false, // The stack pointer to the end of the type - * // or FALSE if there is no type. - * 'nullable_type' => boolean, // TRUE if the type is preceded by the - * // nullability operator. - * ); - * ``` - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $stackPtr parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the token passed does not exist in the $phpcsFile. - * @throws \PHPCSUtils\Exceptions\UnexpectedTokenType If the token passed is not a `T_VARIABLE` token. - * @throws \PHPCSUtils\Exceptions\ValueError If the specified position is not a class member variable. - */ - public static function getMemberProperties(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (\is_int($stackPtr) === false) { - throw TypeError::create(2, '$stackPtr', 'integer', $stackPtr); - } - - if (isset($tokens[$stackPtr]) === false) { - throw OutOfBoundsStackPtr::create(2, '$stackPtr', $stackPtr); - } - - if ($tokens[$stackPtr]['code'] !== \T_VARIABLE) { - throw UnexpectedTokenType::create(2, '$stackPtr', 'T_VARIABLE', $tokens[$stackPtr]['type']); - } - - if (Scopes::isOOProperty($phpcsFile, $stackPtr) === false) { - throw ValueError::create(2, '$stackPtr', 'must be the pointer to a class member var'); - } - - if (Cache::isCached($phpcsFile, __METHOD__, $stackPtr) === true) { - return Cache::get($phpcsFile, __METHOD__, $stackPtr); - } - - $valid = Collections::propertyModifierKeywords() + Tokens::$emptyTokens; - - $scope = 'public'; - $scopeSpecified = false; - $setScope = false; - $isStatic = false; - $isReadonly = false; - $isFinal = false; - $isAbstract = false; - - $startOfStatement = $phpcsFile->findPrevious( - [ - \T_SEMICOLON, - \T_OPEN_CURLY_BRACKET, - \T_CLOSE_CURLY_BRACKET, - \T_ATTRIBUTE_END, - ], - ($stackPtr - 1) - ); - - for ($i = ($startOfStatement + 1); $i < $stackPtr; $i++) { - if (isset($valid[$tokens[$i]['code']]) === false) { - break; - } - - switch ($tokens[$i]['code']) { - case \T_PUBLIC: - $scope = 'public'; - $scopeSpecified = true; - break; - case \T_PRIVATE: - $scope = 'private'; - $scopeSpecified = true; - break; - case \T_PROTECTED: - $scope = 'protected'; - $scopeSpecified = true; - break; - case \T_PUBLIC_SET: - $setScope = 'public'; - if ($scopeSpecified === false) { - $scope = 'public'; - } - break; - case \T_PROTECTED_SET: - $setScope = 'protected'; - if ($scopeSpecified === false) { - $scope = 'public'; - } - break; - case \T_PRIVATE_SET: - $setScope = 'private'; - if ($scopeSpecified === false) { - $scope = 'public'; - } - break; - case \T_STATIC: - $isStatic = true; - break; - case \T_READONLY: - $isReadonly = true; - break; - case \T_FINAL: - $isFinal = true; - break; - case \T_ABSTRACT: - $isAbstract = true; - break; - } - } - - $type = ''; - $typeToken = false; - $typeEndToken = false; - $nullableType = false; - $propertyTypeTokens = Collections::propertyTypeTokens(); - - if ($i < $stackPtr) { - // We've found a type. - for ($i; $i < $stackPtr; $i++) { - if ($tokens[$i]['code'] === \T_VARIABLE) { - // Hit another variable in a group definition. - break; - } - - if ($tokens[$i]['code'] === \T_NULLABLE) { - $nullableType = true; - } - - if (isset($propertyTypeTokens[$tokens[$i]['code']]) === true) { - $typeEndToken = $i; - if ($typeToken === false) { - $typeToken = $i; - } - - $type .= $tokens[$i]['content']; - } - } - - if ($type !== '' && $nullableType === true) { - $type = '?' . $type; - } - } - - $returnValue = [ - 'scope' => $scope, - 'scope_specified' => $scopeSpecified, - 'set_scope' => $setScope, - 'is_static' => $isStatic, - 'is_readonly' => $isReadonly, - 'is_final' => $isFinal, - 'is_abstract' => $isAbstract, - 'type' => $type, - 'type_token' => $typeToken, - 'type_end_token' => $typeEndToken, - 'nullable_type' => $nullableType, - ]; - - Cache::set($phpcsFile, __METHOD__, $stackPtr, $returnValue); - return $returnValue; - } - - /** - * Retrieve the stack pointers to the attribute openers for any attribute block which applies to an OO property - * or function declaration parameters. - * - * @since 1.2.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position in the stack of the variable token to - * acquire the attributes for. - * - * @return array<int> Array with the stack pointers to the applicable attribute openers - * or an empty array if there are no attributes attached to the OO property - * or function declaration parameter. - * - * @throws \PHPCSUtils\Exceptions\TypeError If the $stackPtr parameter is not an integer. - * @throws \PHPCSUtils\Exceptions\OutOfBoundsStackPtr If the token passed does not exist in the $phpcsFile. - * @throws \PHPCSUtils\Exceptions\UnexpectedTokenType If the token passed is not a `T_VARIABLE` token. - * @throws \PHPCSUtils\Exceptions\ValueError If the token passed does not point to an OO property token - * or a parameter in a function declaration. - */ - public static function getAttributeOpeners(File $phpcsFile, $stackPtr) - { - return AttributeHelper::getOpeners($phpcsFile, $stackPtr, 'variable'); - } - - /** - * Verify if a given variable name is the name of a PHP reserved variable. - * - * @see \PHPCSUtils\Utils\Variables::$phpReservedVars List of variables names reserved by PHP. - * - * @since 1.0.0 - * - * @param string $name The full variable name with or without leading dollar sign. - * This allows for passing an array key variable name, such as - * `'_GET'` retrieved from `$GLOBALS['_GET']`. - * > Note: when passing an array key, string quotes are expected - * to have been stripped already. - * Also see: {@see \PHPCSUtils\Utils\TextStrings::stripQuotes()}. - * - * @return bool - */ - public static function isPHPReservedVarName($name) - { - if (\strpos($name, '$') === 0) { - $name = \substr($name, 1); - } - - return (isset(self::$phpReservedVars[$name]) === true); - } - - /** - * Verify if a given variable or array key token points to a PHP superglobal. - * - * @since 1.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position in the stack of a `T_VARIABLE` - * token or of the `T_CONSTANT_ENCAPSED_STRING` - * array key to a variable in `$GLOBALS`. - * - * @return bool `TRUE` if this points to a superglobal; `FALSE` when not. - * > Note: This includes returning `FALSE` when an unsupported token has - * been passed, when a `T_CONSTANT_ENCAPSED_STRING` has been passed which - * is not an array index key; or when it is, but is not an index to the - * `$GLOBALS` variable. - */ - public static function isSuperglobal(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]) === false - || ($tokens[$stackPtr]['code'] !== \T_VARIABLE - && $tokens[$stackPtr]['code'] !== \T_CONSTANT_ENCAPSED_STRING) - ) { - return false; - } - - $content = $tokens[$stackPtr]['content']; - - if ($tokens[$stackPtr]['code'] === \T_CONSTANT_ENCAPSED_STRING) { - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if (($prev === false || $tokens[$prev]['code'] !== \T_OPEN_SQUARE_BRACKET) - || ($next === false || $tokens[$next]['code'] !== \T_CLOSE_SQUARE_BRACKET) - ) { - // Not a single string array index key. - return false; - } - - $pprev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($prev - 1), null, true); - if ($pprev === false - || $tokens[$pprev]['code'] !== \T_VARIABLE - || $tokens[$pprev]['content'] !== '$GLOBALS' - ) { - // Not accessing the `$GLOBALS` array. - return false; - } - - // Strip quotes. - $content = TextStrings::stripQuotes($content); - } - - return self::isSuperglobalName($content); - } - - /** - * Verify if a given variable name is the name of a PHP superglobal. - * - * @since 1.0.0 - * - * @param string $name The full variable name with or without leading dollar sign. - * This allows for passing an array key variable name, such as - * `'_GET'` retrieved from `$GLOBALS['_GET']`. - * > Note: when passing an array key, string quotes are expected - * to have been stripped already. - * Also see: {@see \PHPCSUtils\Utils\TextStrings::stripQuotes()}. - * - * @return bool - */ - public static function isSuperglobalName($name) - { - if (\strpos($name, '$') === 0) { - $name = \substr($name, 1); - } - - if (isset(self::$phpReservedVars[$name]) === false) { - return false; - } - - return self::$phpReservedVars[$name]; - } -} diff --git a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/ruleset.xml b/vendor/phpcsstandards/phpcsutils/PHPCSUtils/ruleset.xml deleted file mode 100644 index 72cf3b4..0000000 --- a/vendor/phpcsstandards/phpcsutils/PHPCSUtils/ruleset.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0"?> -<ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="PHPCSUtils" xsi:noNamespaceSchemaLocation="https://schema.phpcodesniffer.com/phpcs.xsd"> - <description>Utility methods for external PHPCS standards.</description> -</ruleset> diff --git a/vendor/phpcsstandards/phpcsutils/README.md b/vendor/phpcsstandards/phpcsutils/README.md deleted file mode 100644 index 7fd3d55..0000000 --- a/vendor/phpcsstandards/phpcsutils/README.md +++ /dev/null @@ -1,297 +0,0 @@ -# PHPCSUtils: A suite of utility functions for use with PHP_CodeSniffer - -<div aria-hidden="true"> - -[![Latest Stable Version](https://img.shields.io/packagist/v/phpcsstandards/phpcsutils?label=stable)][phpcsutils-packagist] -[![Release Date of the Latest Version](https://img.shields.io/github/release-date/PHPCSStandards/PHPCSUtils.svg?maxAge=1800)][phpcsutils-releases] -:construction: -[![Latest Unstable Version](https://img.shields.io/badge/unstable-dev--develop-e68718.svg?maxAge=2419200)](https://packagist.org/packages/phpcsstandards/phpcsutils#dev-develop) -[![Last Commit to Unstable](https://img.shields.io/github/last-commit/PHPCSStandards/PHPCSUtils/develop.svg)](https://github.com/PHPCSStandards/PHPCSUtils/commits/develop) - -[![Docs website](https://github.com/PHPCSStandards/PHPCSUtils/actions/workflows/update-docs.yml/badge.svg)][phpcsutils-web] -[![CS Build Status](https://github.com/PHPCSStandards/PHPCSUtils/actions/workflows/basics.yml/badge.svg?branch=develop)](https://github.com/PHPCSStandards/PHPCSUtils/actions/workflows/basics.yml) -[![Test Build Status](https://github.com/PHPCSStandards/PHPCSUtils/actions/workflows/test.yml/badge.svg?branch=develop)][phpcsutils-tests-gha] -[![Coverage Status](https://coveralls.io/repos/github/PHPCSStandards/PHPCSUtils/badge.svg?branch=develop)](https://coveralls.io/github/PHPCSStandards/PHPCSUtils?branch=develop) - -[![Minimum PHP Version](https://img.shields.io/packagist/dependency-v/phpcsstandards/phpcsutils/php.svg)][phpcsutils-packagist] -[![Tested on PHP 5.4 to 8.5](https://img.shields.io/badge/tested%20on-PHP%205.4%20|%205.5%20|%205.6%20|%207.0%20|%207.1%20|%207.2%20|%207.3%20|%207.4%20|%208.0%20|%208.1%20|%208.2%20|%208.3%20|%208.4%20|%208.5-brightgreen.svg?maxAge=2419200)][phpcsutils-tests-gha] - -[![License: LGPLv3](https://img.shields.io/github/license/PHPCSStandards/PHPCSUtils)](https://github.com/PHPCSStandards/PHPCSUtils/blob/stable/LICENSE) -![Awesome](https://img.shields.io/badge/awesome%3F-yes!-brightgreen.svg) - -</div> - -* [Features](#features) -* [Minimum Requirements](#minimum-requirements) -* [Integrating PHPCSUtils in your external PHPCS standard](#integrating-phpcsutils-in-your-external-phpcs-standard) - - [Composer-based](#composer-based) - - [Non-Composer based integration](#non-composer-based-integration) -* [Frequently Asked Questions](#frequently-asked-questions) -* [Potential Support Questions from your End-Users](#potential-support-questions-from-your-end-users) -* [Contributing](#contributing) -* [License](#license) - - -## Features - -[PHPCSUtils][phpcsutils-repo] is a set of utilities to aid developers of sniffs for [PHP_CodeSniffer] (or "PHPCS" for short). - -This package offers the following features: - -<div id="feature-list"> - -### An ever-growing number of utility functions for use with PHP_CodeSniffer - -Whether you need to split an `array` into the individual items, are trying to determine which variables are being assigned to in a `list()` or are figuring out whether a function has a DocBlock, PHPCSUtils has got you covered! - -Includes improved versions of the PHPCS native utility functions and plenty of new utility functions. - -These functions are compatible with PHPCS 3.13.5 up to PHPCS `4.x`. - -### A collection of static properties and methods for often-used token groups - -Collections of related tokens often-used and needed for sniffs. -These are additional "token groups" to compliment the ones available through the PHPCS native `PHP_CodeSniffer\Util\Tokens` class. - -### Several abstract sniff classes which your sniffs can extend - -These classes take most of the heavy lifting away for some frequently occurring sniff types. - -### Test utilities - -An abstract `UtilityMethodTestCase` class to support testing of your utility methods written for PHP_CodeSniffer. -Supports PHPUnit 4.x up to 11.x. - -### Use the latest version of PHP_CodeSniffer native utility functions - -Normally to use the latest version of PHP_CodeSniffer native utility functions, you would have to raise the minimum requirements of your external PHPCS standard. - -Now you won't have to anymore. This package allows you to use the latest version of those utility functions in all PHP_CodeSniffer versions from PHPCS 3.13.0 and up. - -### Fully documented - -To see detailed information about all the available abstract sniffs, utility functions and PHPCS helper functions, have a read through the [extensive documentation][phpcsutils-web]. - -</div> - - -## Minimum Requirements - -* PHP 5.4 or higher. -* [PHP_CodeSniffer] 3.13.5+/4.0.1+. -* Recommended PHP extensions for optimal functionality: - - PCRE with Unicode support (normally enabled by default) - - -## Integrating PHPCSUtils in your external PHPCS standard - -### Composer-based - -If your external PHP_CodeSniffer standard only supports Composer-based installs, integrating PHPCSUtils is pretty straight forward. - -Run the following from the root of your external PHPCS standard's project: - -```bash -composer config allow-plugins.dealerdirect/phpcodesniffer-composer-installer true -composer require phpcsstandards/phpcsutils:"^1.0" -``` - -No further action needed. You can start using all the utility functions, abstract sniff classes and other features of PHPCSUtils straight away. - -> :information_source: The PHPCSUtils package includes the [Composer PHPCS plugin]. -> -> This plugin will automatically register PHPCSUtils (and your own external standard) with PHP_CodeSniffer, so you and your users don't have to worry about this anymore. -> -> :warning: Note: if your end-user installation instructions include instructions on adding a Composer PHPCS plugin or on manually registering your standard with PHPCS using the `--config-set installed_paths` command, you can remove those instructions as they are no longer needed. -> -> :information_source: As of Composer 2.2, Composer will [ask for permission](https://blog.packagist.com/composer-2-2/#more-secure-plugin-execution) to allow the Composer PHPCS plugin to execute code. For the plugin to be functional, permission needs to be granted. -> This can be done ahead of time by instructing your users to run the following command before installing your standard: -> -> ```bash -> composer config allow-plugins.dealerdirect/phpcodesniffer-composer-installer true -> ``` - -#### Running your unit tests - -If your unit tests use the PHP_CodeSniffer native unit test suite, all is good. - -If you have your own unit test suite to test your sniffs, make sure to load the Composer `vendor/autoload.php` file in your PHPUnit bootstrap file or _as_ the PHPUnit bootstrap file. - -If you intend to use the test utilities provided in the `PHPCSUtils/TestUtils` directory, make sure you also load the `vendor/phpcsstandards/phpcsutils/phpcsutils-autoload.php` file in your PHPUnit bootstrap file. - - -### Non-Composer based integration - -In this case, more than anything, you will need to update the non-Composer installation instructions for your end-users. - -To use a non-Composer based installation for your sniff development environment, the same instructions would apply. - -Your installation instructions for a non-Composer based installation will probably look similar to this: - -> * Install [PHP_CodeSniffer] via [your preferred method](https://github.com/PHPCSStandards/PHP_CodeSniffer#installation). -> * Register the path to PHPCS in your system `$PATH` environment variable to make the `phpcs` command available from anywhere in your file system. -> * Download the \[latest _YourStandardName_ release\] and unzip/untar it into an arbitrary directory. -> You can also choose to clone the repository using git. -> * Add the path to the directory in which you placed your copy of the _YourStandardName_ repo to the PHP_CodeSniffer configuration using the below command: -> -> ```bash -> phpcs --config-set installed_paths /path/to/YourStandardName -> ``` -> -> **Warning**: :warning: The `installed_paths` command overwrites any previously set `installed_paths`. If you have previously set `installed_paths` for other external standards, run `phpcs --config-show` first and then run the `installed_paths` command with all the paths you need separated by comma's, i.e.: -> -> ```bash -> phpcs --config-set installed_paths /path/1,/path/2,/path/3 -> ``` - -For things to continue working when you add PHPCSUtils to your standard, you need to replace the last bullet with this: - -> * **Next, download the [latest PHPCSUtils release][phpcsutils-releases] and unzip/untar it into an arbitrary directory.** -> You can also choose to clone the repository using git. -> * Add the path to the **directories** in which you placed your copy of the _YourStandardName_ repo **and the PHPCSUtils repo** to the PHP_CodeSniffer configuration using the below command: -> -> ```bash -> phpcs --config-set installed_paths /path/to/YourStandardName,/path/to/PHPCSUtils -> ``` -> -> **Warning**: :warning: The `installed_paths` command overwrites any previously set `installed_paths`. If you have previously set `installed_paths` for other external standards, run `phpcs --config-show` first and then run the `installed_paths` command with all the paths you need separated by comma's, i.e.: -> -> ```bash -> phpcs --config-set installed_paths /path/1,/path/2,/path/3 -> ``` - -#### Running your unit tests - -To support non-Composer based installs for running your sniff unit tests, you will need to adjust the PHPUnit `bootstrap.php` file to allow for passing an environment variable pointing to your PHPCSUtils installation. - -<details> - <summary><b>Example bootstrap code using a <code>PHPCSUtils_DIR</code> environment variable</b></summary> - -```php -// Get the PHPCS dir from an environment variable. -$phpcsUtilDir = getenv('PHPCSUtils_DIR'); - -// This may be a Composer install. -if ($phpcsUtilDir === false && file_exists(__DIR__ . '/vendor/autoload.php')) { - $vendorDir = __DIR__ . '/vendor'; - $phpcsUtilDir = $vendorDir . '/phpcsstandards/phpcsutils'; - - // Load the Composer autoload file. - require_once $vendorDir . '/autoload.php'; - - // This snippet is only needed when you use the PHPCSUtils TestUtils. - if (file_exists($phpcsUtilDir . '/phpcsutils-autoload.php')) { - require_once $phpcsUtilDir . '/phpcsutils-autoload.php'; - } - -} elseif ($phpcsUtilDir !== false) { - $phpcsUtilDir = realpath($phpcsUtilDir); - - require_once $phpcsUtilDir . '/phpcsutils-autoload.php'; -} else { - echo 'Uh oh... can\'t find PHPCSUtils. - -If you use Composer, please run `composer install`. -Otherwise, make sure you set a `PHPCSUtils_DIR` environment variable in your phpunit.xml file -pointing to the PHPCS directory. -'; - - die(1); -} -``` - -</details> - -Once that's done, you will need to make a small tweak to your own dev environment to get the unit tests running for a non-Composer based install: - -* Copy your project's `phpunit.xml.dist` file to `phpunit.xml`. -* Add the following to the `phpunit.xml` file within the `<phpunit>` tags, replacing `/path/to/PHPCSUtils` with the path in which you installed PHPCSUtils on your local system: - - ```xml - <php> - <env name="PHPCSUtils_DIR" value="/path/to/PHPCSUtils"/> - </php> - ``` - - -## Frequently Asked Questions - -<div class="faq"> - -### Q: How does this all work without an external standard needing to register an autoloader? - -A: As PHPCSUtils is registered with PHPCS as an external standard and PHPCSUtils complies with the naming requirements of PHPCS, the PHPCS native autoloader will automatically take care of loading the classes used from PHPCSUtils. - -### Q: Does using PHPCSUtils have any effect on the PHPCS native sniffs? - -A: No. PHPCSUtils will only work for those sniffs which explicitly use the PHPCSUtils functionality. - -If your standard includes both PHPCS native sniffs as well as your own sniffs, your own sniffs can benefit from the back-compat layer offered by PHPCSUtils, as well as from the additional utility functions. However, the PHPCS native sniffs will not receive those benefits, as PHPCS itself does not use PHPCSUtils. - -### Q: Do the utilities work with javascript/CSS files? - -A: JS/CSS support will be removed from `PHP_CodeSniffer` in PHPCS 4.x. -While at this time, some of the utilities _may_ work with JS/CSS files, PHPCSUtils does not offer formal support for JS/CSS sniffing with `PHP_CodeSniffer` and will stop any existing support once PHPCS 4.x has been released. - -### Q: Are all file encodings supported? - -A: No. The UTF-8 file encoding is the only officially supported encoding. Support for other encodings may incidentally work, but is not officially supported. - -> **It is recommended to advise your users to save their files as UTF-8 encoded for the best results.** - -Note: `PHP_CodeSniffer` 3.x defaults to UTF-8 as the expected file encoding. - -</div> - - -## Potential Support Questions from your End-Users - -<div class="faq"> - -### Q: A user reports a fatal "class not found" error for a class from PHPCSUtils - -1. Check that the version of PHPCSUtils the user has installed complies with the minimum version of PHPCSUtils your standard requires. If not, they will need to upgrade. -2. If the version is correct, this indicates that the end-user does not have PHPCSUtils installed and/or registered with PHP_CodeSniffer. - - Please review your standard's installation instructions to make sure that PHPCSUtils will be installed when those are followed. - - Inform the user to install PHPCSUtils and register it with PHP_CodeSniffer. - ---- - -> :bulb: **Pro-tip**: if you want to prevent the fatal error and show a _friendlier_ error message instead, add `<rule ref="PHPCSUtils"/>` to your standard's `ruleset.xml` file. -> -> With that in place, `PHP_CodeSniffer` will show a _"ERROR: the "PHPCSUtils" coding standard is not installed."_ message if PHPCSUtils is missing as soon as the ruleset loading is finished. - ---- - -> :bulb: **Pro-tip**: provide upgrade instructions for your end-users. For Composer-based installs, those should look like this: -> -> ```bash -> composer update your/cs-package --with-[all-]dependencies -> ``` -> -> That way, when the user updates your coding standards package, they will automatically also update PHPCSUtils. - ---- - -</div> - - -## Contributing - -Contributions to this project are welcome. Clone the repo, branch off from `develop`, make your changes, commit them and send in a pull request. - -If you are unsure whether the changes you are proposing would be welcome, please open an issue first to discuss your proposal. - - -## License - -This code is released under the [GNU Lesser General Public License (LGPLv3)](LICENSE). - - -[PHP_CodeSniffer]: https://github.com/PHPCSStandards/PHP_CodeSniffer -[Composer PHPCS plugin]: https://github.com/PHPCSStandards/composer-installer -[phpcsutils-repo]: https://github.com/PHPCSStandards/PHPCSUtils -[phpcsutils-web]: https://phpcsutils.com/ -[phpcsutils-packagist]: https://packagist.org/packages/phpcsstandards/phpcsutils -[phpcsutils-releases]: https://github.com/PHPCSStandards/PHPCSUtils/releases -[phpcsutils-tests-gha]: https://github.com/PHPCSStandards/PHPCSUtils/actions/workflows/test.yml diff --git a/vendor/phpcsstandards/phpcsutils/composer.json b/vendor/phpcsstandards/phpcsutils/composer.json deleted file mode 100644 index 39890d8..0000000 --- a/vendor/phpcsstandards/phpcsutils/composer.json +++ /dev/null @@ -1,92 +0,0 @@ -{ - "name" : "phpcsstandards/phpcsutils", - "description" : "A suite of utility functions for use with PHP_CodeSniffer", - "type" : "phpcodesniffer-standard", - "keywords" : [ "phpcs", "phpcbf", "standards", "static analysis", "php_codesniffer", "phpcs3", "phpcs4", "tokens", "utility", "phpcodesniffer-standard" ], - "license" : "LGPL-3.0-or-later", - "homepage": "https://phpcsutils.com/", - "authors" : [ - { - "name" : "Juliette Reinders Folmer", - "role" : "lead", - "homepage" : "https://github.com/jrfnl" - }, - { - "name" : "Contributors", - "homepage" : "https://github.com/PHPCSStandards/PHPCSUtils/graphs/contributors" - } - ], - "support" : { - "issues" : "https://github.com/PHPCSStandards/PHPCSUtils/issues", - "source" : "https://github.com/PHPCSStandards/PHPCSUtils", - "docs" : "https://phpcsutils.com/", - "security": "https://github.com/PHPCSStandards/PHPCSUtils/security/policy" - }, - "require" : { - "php" : ">=5.4", - "squizlabs/php_codesniffer" : "^3.13.5 || ^4.0.1", - "dealerdirect/phpcodesniffer-composer-installer" : "^0.4.1 || ^0.5 || ^0.6.2 || ^0.7 || ^1.0" - }, - "require-dev" : { - "ext-filter": "*", - "phpcsstandards/phpcsdevcs": "^1.2.0", - "php-parallel-lint/php-parallel-lint": "^1.4.0", - "php-parallel-lint/php-console-highlighter": "^1.0", - "yoast/phpunit-polyfills": "^1.1.0 || ^2.0.0 || ^3.0.0" - }, - "minimum-stability": "dev", - "prefer-stable": true, - "autoload": { - "classmap": ["PHPCSUtils/"] - }, - "autoload-dev" : { - "psr-4": { - "PHPCSUtils\\Tests\\": "Tests/", - "PHPCSUtils\\GHPages\\": ".github/GHPages/" - } - }, - "extra": { - "branch-alias": { - "dev-stable": "1.x-dev", - "dev-develop": "1.x-dev" - } - }, - "scripts" : { - "lint-lt72": [ - "@php ./vendor/php-parallel-lint/php-parallel-lint/parallel-lint . --show-deprecated -e php --exclude vendor --exclude .git --exclude .github/GHPages" - ], - "lint": [ - "@php ./vendor/php-parallel-lint/php-parallel-lint/parallel-lint . -e php --exclude vendor --exclude .git" - ], - "checkcs": [ - "@php ./vendor/squizlabs/php_codesniffer/bin/phpcs" - ], - "fixcs": [ - "@php ./vendor/squizlabs/php_codesniffer/bin/phpcbf" - ], - "test": [ - "@php ./vendor/phpunit/phpunit/phpunit --no-coverage" - ], - "test10": [ - "@php ./vendor/phpunit/phpunit/phpunit -c phpunit10.xml.dist --no-coverage" - ], - "coverage": [ - "@php ./vendor/phpunit/phpunit/phpunit" - ], - "coverage10": [ - "@php ./vendor/phpunit/phpunit/phpunit -c phpunit10.xml.dist" - ], - "coverage-local": [ - "@php ./vendor/phpunit/phpunit/phpunit --coverage-html ./build/coverage-html" - ], - "coverage-local10": [ - "@php ./vendor/phpunit/phpunit/phpunit -c phpunit10.xml.dist --coverage-html ./build/coverage-html" - ] - }, - "config": { - "allow-plugins": { - "dealerdirect/phpcodesniffer-composer-installer": true - }, - "lock": false - } -} diff --git a/vendor/phpcsstandards/phpcsutils/phpcsutils-autoload.php b/vendor/phpcsstandards/phpcsutils/phpcsutils-autoload.php deleted file mode 100644 index 39b47fc..0000000 --- a/vendor/phpcsstandards/phpcsutils/phpcsutils-autoload.php +++ /dev/null @@ -1,67 +0,0 @@ -<?php -/** - * PHPCSUtils, utility functions and classes for PHP_CodeSniffer sniff developers. - * - * Autoloader for the PHPCSUtils files. - * - * - If an external standard only supports PHPCS >= 3.1.0 and uses the PHPCS - * native unit test framework, this file does not need to be included. - * - * - If an external standard uses its own unit test setup, this file should - * be included from the unit test bootstrap file. - * - * - If an external standard uses the PHPCSUtils {@see PHPCSUtils\TestUtils\UtilityMethodTestCase} - * class to test their own utility methods, this file should be included from - * the unit test bootstrap file. - * - * @package PHPCSUtils - * @copyright 2019-2020 PHPCSUtils Contributors - * @license https://opensource.org/licenses/LGPL-3.0 LGPL3 - * @link https://github.com/PHPCSStandards/PHPCSUtils - * - * @since 1.0.0 - */ - -if (defined('PHPCSUTILS_AUTOLOAD') === false) { - /* - * Register an autoloader. - * - * External PHPCS standards which have their own unit test suite - * should include this file in their test runner bootstrap. - */ - spl_autoload_register(function ($fqClassName) { - // Only try & load our own classes. - if (stripos($fqClassName, 'PHPCSUtils\\') !== 0) { - return; - } - - $file = realpath(__DIR__) . DIRECTORY_SEPARATOR . strtr($fqClassName, '\\', DIRECTORY_SEPARATOR) . '.php'; - - if (file_exists($file)) { - include_once $file; - } - }); - - define('PHPCSUTILS_AUTOLOAD', true); -} - -if (defined('PHPCSUTILS_PHPUNIT_ALIASES_SET') === false) { - /* - * Alias the PHPUnit 4/5 TestCase class to its PHPUnit 6+ name. - * - * This allows both the PHPCSUtils native unit tests as well as the - * `UtilityMethodTestCase` class to work cross-version with PHPUnit - * below 6.x and above. - * - * {@internal The `class_exists` wrappers are needed to play nice with - * PHPUnit bootstrap files of external standards which may be creating - * cross-version compatibility in a similar manner.}} - */ - if (class_exists('PHPUnit_Framework_TestCase') === true - && class_exists('PHPUnit\Framework\TestCase') === false - ) { - class_alias('PHPUnit_Framework_TestCase', 'PHPUnit\Framework\TestCase'); - } - - define('PHPCSUTILS_PHPUNIT_ALIASES_SET', true); -} diff --git a/vendor/phpstan/phpstan/LICENSE b/vendor/phpstan/phpstan/LICENSE deleted file mode 100644 index 7c0f2b7..0000000 --- a/vendor/phpstan/phpstan/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2016 Ondřej Mirtes - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/phpstan/phpstan/README.md b/vendor/phpstan/phpstan/README.md deleted file mode 100644 index e3bb940..0000000 --- a/vendor/phpstan/phpstan/README.md +++ /dev/null @@ -1,108 +0,0 @@ -<h1 align="center">PHPStan - PHP Static Analysis Tool</h1> - -<p align="center"> - <img src="https://i.imgur.com/WaRKPlC.png" alt="PHPStan" width="300" height="300"> -</p> - -<p align="center"> - <a href="https://github.com/phpstan/phpstan/actions"><img src="https://github.com/phpstan/phpstan/workflows/Tests/badge.svg" alt="Build Status"></a> - <a href="https://packagist.org/packages/phpstan/phpstan"><img src="https://poser.pugx.org/phpstan/phpstan/v/stable" alt="Latest Stable Version"></a> - <a href="https://packagist.org/packages/phpstan/phpstan/stats"><img src="https://poser.pugx.org/phpstan/phpstan/downloads" alt="Total Downloads"></a> - <a href="https://choosealicense.com/licenses/mit/"><img src="https://poser.pugx.org/phpstan/phpstan/license" alt="License"></a> - <a href="https://phpstan.org/"><img src="https://img.shields.io/badge/PHPStan-enabled-brightgreen.svg?style=flat" alt="PHPStan Enabled"></a> -</p> - ------- - -PHPStan focuses on finding errors in your code without actually running it. It catches whole classes of bugs -even before you write tests for the code. It moves PHP closer to compiled languages in the sense that the correctness of each line of the code -can be checked before you run the actual line. - -**[Read more about PHPStan »](https://phpstan.org/)** - -**[Try out PHPStan on the on-line playground! »](https://phpstan.org/try)** - -## Sponsors - -<a href="https://coders.thecodingmachine.com/phpstan"><img src="website/src/images/sponsor/tcm.png" alt="TheCodingMachine" width="247" height="64"></a> -    -<a href="https://packagist.com/?utm_source=phpstan&utm_medium=readme&utm_campaign=sponsorlogo"><img src="website/src/images/sponsor/packagist.png" alt="Private Packagist" width="283" height="64"></a> -<br> -<a href="https://www.cdn77.com/"><img src="website/src/images/sponsor/cdn77.png" alt="CDN77" width="283" height="64"></a> -    -<a href="https://blackfire.io/docs/introduction?utm_source=phpstan&utm_medium=github_readme&utm_campaign=logo"><img src="website/src/images/sponsor/blackfire.png" alt="Blackfire.io" width="254" height="64"></a> -<br> -<a href="https://www.iodigital.com/"><img src="website/src/images/sponsor/io.png" alt="iO" width="254" height="65"></a> -    -<a href="https://www.fame.fi/"><img src="website/src/images/sponsor/fame.png" alt="Fame Helsinki" width="283" height="64"></a> -<br> -<a href="https://www.startupjobs.cz/startup/shipmonk"><img src="website/src/images/sponsor/shipmonk.jpg" alt="ShipMonk" width="290" height="64"></a> -    -<a href="https://togetter.com/"><img src="website/src/images/sponsor/togetter.png" alt="Togetter" width="283" height="64"></a> -<br> -<a href="https://join.rightcapital.com/?utm_source=phpstan&utm_medium=github&utm_campaign=sponsorship"><img src="website/src/images/sponsor/rightcapital.png" alt="RightCapital" width="283" height="64"></a> -    -<a href="https://www.contentkingapp.com/?ref=php-developer&utm_source=phpstan&utm_medium=referral&utm_campaign=sponsorship"><img src="website/src/images/sponsor/contentking.png" alt="ContentKing" width="283" height="64"></a> -<br> -<a href="https://zol.fr?utm_source=phpstan"><img src="website/src/images/sponsor/zol.png" alt="ZOL" width="283" height="64"></a> -    -<a href="https://www.edgenext.com/"><img src="website/src/images/sponsor/edgenext.png" alt="EdgeNext" width="283" height="64"></a> -<br> -<a href="https://www.shopware.com/en/"><img src="website/src/images/sponsor/shopware.png" alt="Shopware" width="284" height="64"></a> -    -<a href="https://craftcms.com/"><img src="website/src/images/sponsor/craftcms.png" alt="Craft CMS" width="283" height="64"></a> -<br> -<a href="https://www.worksome.com/"><img src="website/src/images/sponsor/worksome.png" alt="Worksome" width="283" height="64"></a> -    -<a href="https://www.campoint.net/"><img src="website/src/images/sponsor/campoint.png" alt="campoint AG" width="283" height="64"></a> -<br> -<a href="https://www.crisp.nl/"><img src="website/src/images/sponsor/crisp.png" alt="Crisp.nl" width="283" height="64"></a> -    -<a href="https://inviqa.com/"><img src="website/src/images/sponsor/inviqa.png" alt="Inviqa" width="254" height="65"></a> -<br> -<a href="https://www.getresponse.com/"><img src="website/src/images/sponsor/getresponse.png" alt="GetResponse" width="283" height="64"></a> -    -<a href="https://www.shoptet.cz/"><img src="website/src/images/sponsor/shoptet.png" alt="Shoptet" width="283" height="64"></a> -<br> -<a href="https://route4me.com/"><img src="website/src/images/sponsor/route4me.png" alt="Route4Me: Route Optimizer and Route Planner Software" width="283" height="64"></a> -    -<a href="https://jobs.ticketswap.com/"><img src="website/src/images/sponsor/ticketswap.png" alt="TicketSwap" width="269" height="64"></a> - - -[**You can now sponsor my open-source work on PHPStan through GitHub Sponsors.**](https://github.com/sponsors/ondrejmirtes) - -Does GitHub already have your 💳? Do you use PHPStan to find 🐛 before they reach production? [Send a couple of 💸 a month my way too.](https://github.com/sponsors/ondrejmirtes) Thank you! - -One-time donations [through Revolut.me](https://revolut.me/ondrejmirtes) are also accepted. To request an invoice, [contact me](mailto:ondrej@mirtes.cz) through e-mail. - -## Documentation - -All the documentation lives on the [phpstan.org website](https://phpstan.org/): - -* [Getting Started & User Guide](https://phpstan.org/user-guide/getting-started) -* [Config Reference](https://phpstan.org/config-reference) -* [PHPDocs Basics](https://phpstan.org/writing-php-code/phpdocs-basics) & [PHPDoc Types](https://phpstan.org/writing-php-code/phpdoc-types) -* [Extension Library](https://phpstan.org/user-guide/extension-library) -* [Developing Extensions](https://phpstan.org/developing-extensions/extension-types) -* [API Reference](https://apiref.phpstan.org/) - -## PHPStan Pro - -PHPStan Pro is a paid add-on on top of open-source PHPStan Static Analysis Tool with these premium features: - -* Web UI for browsing found errors, you can click and open your editor of choice on the offending line. -* Continuous analysis (watch mode): scans changed files in the background, refreshes the UI automatically. - -Try it on PHPStan 0.12.45 or later by running it with the `--pro` option. You can create an account either by following the on-screen instructions, or by visiting [account.phpstan.com](https://account.phpstan.com/). - -After 30-day free trial period it costs 7 EUR for individuals monthly, 70 EUR for teams (up to 25 members). By paying for PHPStan Pro, you're supporting the development of open-source PHPStan. - -You can read more about it on [PHPStan's website](https://phpstan.org/blog/introducing-phpstan-pro). - -## Code of Conduct - -This project adheres to a [Contributor Code of Conduct](https://github.com/phpstan/phpstan/blob/master/CODE_OF_CONDUCT.md). By participating in this project and its community, you are expected to uphold this code. - -## Contributing - -Any contributions are welcome. PHPStan's source code open to pull requests lives at [`phpstan/phpstan-src`](https://github.com/phpstan/phpstan-src). diff --git a/vendor/phpstan/phpstan/bootstrap.php b/vendor/phpstan/phpstan/bootstrap.php deleted file mode 100644 index 2d950b0..0000000 --- a/vendor/phpstan/phpstan/bootstrap.php +++ /dev/null @@ -1,135 +0,0 @@ -<?php declare(strict_types = 1); - -namespace PHPStan; - -use Composer\Autoload\ClassLoader; -use function class_exists; -use const PHP_VERSION_ID; - -final class PharAutoloader -{ - /** @var ClassLoader */ - private static $composerAutoloader; - - /** @var bool */ - private static $polyfillsLoaded = false; - - final public static function loadClass(string $class): void { - if (!extension_loaded('phar') || defined('__PHPSTAN_RUNNING__')) { - return; - } - - if (strpos($class, '_PHPStan_') === 0) { - if (!in_array('phar', stream_get_wrappers(), true)) { - throw new \Exception('Phar wrapper is not registered. Please review your php.ini settings.'); - } - - if (self::$composerAutoloader === null) { - self::$composerAutoloader = require 'phar://' . __DIR__ . '/phpstan.phar/vendor/autoload.php'; - require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/jetbrains/phpstorm-stubs/PhpStormStubsMap.php'; - require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/react/async/src/functions_include.php'; - require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/react/promise/src/functions_include.php'; - } - self::$composerAutoloader->loadClass($class); - - return; - } - if (strpos($class, 'PHPStan\\') !== 0 || strpos($class, 'PHPStan\\PhpDocParser\\') === 0) { - return; - } - - if (!in_array('phar', stream_get_wrappers(), true)) { - throw new \Exception('Phar wrapper is not registered. Please review your php.ini settings.'); - } - - if (!self::$polyfillsLoaded) { - self::$polyfillsLoaded = true; - - if ( - PHP_VERSION_ID < 80000 - && empty($GLOBALS['__composer_autoload_files']['a4a119a56e50fbb293281d9a48007e0e']) - && !class_exists(\Symfony\Polyfill\Php80\Php80::class, false) - ) { - $GLOBALS['__composer_autoload_files']['a4a119a56e50fbb293281d9a48007e0e'] = true; - require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-php80/Php80.php'; - require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-php80/bootstrap.php'; - } - - if ( - empty($GLOBALS['__composer_autoload_files']['0e6d7bf4a5811bfa5cf40c5ccd6fae6a']) - && !class_exists(\Symfony\Polyfill\Mbstring\Mbstring::class, false) - ) { - $GLOBALS['__composer_autoload_files']['0e6d7bf4a5811bfa5cf40c5ccd6fae6a'] = true; - require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-mbstring/Mbstring.php'; - require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-mbstring/bootstrap.php'; - } - - if ( - empty($GLOBALS['__composer_autoload_files']['e69f7f6ee287b969198c3c9d6777bd38']) - && !class_exists(\Symfony\Polyfill\Intl\Normalizer\Normalizer::class, false) - ) { - $GLOBALS['__composer_autoload_files']['e69f7f6ee287b969198c3c9d6777bd38'] = true; - require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-intl-normalizer/Normalizer.php'; - require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-intl-normalizer/bootstrap.php'; - } - - if ( - PHP_VERSION_ID < 70300 - && empty($GLOBALS['__composer_autoload_files']['0d59ee240a4cd96ddbb4ff164fccea4d']) - && !class_exists(\Symfony\Polyfill\Php73\Php73::class, false) - ) { - $GLOBALS['__composer_autoload_files']['0d59ee240a4cd96ddbb4ff164fccea4d'] = true; - // already loaded by bootstrap inside the hrtime condition - // require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-php73/Php73.php'; - require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-php73/bootstrap.php'; - } - - if ( - PHP_VERSION_ID < 70400 - && empty($GLOBALS['__composer_autoload_files']['b686b8e46447868025a15ce5d0cb2634']) - && !class_exists(\Symfony\Polyfill\Php74\Php74::class, false) - ) { - $GLOBALS['__composer_autoload_files']['b686b8e46447868025a15ce5d0cb2634'] = true; - require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-php74/Php74.php'; - require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-php74/bootstrap.php'; - } - - if ( - !extension_loaded('intl') - && empty($GLOBALS['__composer_autoload_files']['8825ede83f2f289127722d4e842cf7e8']) - && !class_exists(\Symfony\Polyfill\Intl\Grapheme\Grapheme::class, false) - ) { - $GLOBALS['__composer_autoload_files']['8825ede83f2f289127722d4e842cf7e8'] = true; - require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-intl-grapheme/Grapheme.php'; - require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-intl-grapheme/bootstrap.php'; - } - - if ( - PHP_VERSION_ID < 80100 - && empty ($GLOBALS['__composer_autoload_files']['23c18046f52bef3eea034657bafda50f']) - && !class_exists(\Symfony\Polyfill\Php81\Php81::class, false) - ) { - $GLOBALS['__composer_autoload_files']['23c18046f52bef3eea034657bafda50f'] = true; - require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-php81/Php81.php'; - require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-php81/bootstrap.php'; - } - } - - $filename = str_replace('\\', DIRECTORY_SEPARATOR, $class); - if (strpos($class, 'PHPStan\\BetterReflection\\') === 0) { - $filename = substr($filename, strlen('PHPStan\\BetterReflection\\')); - $filepath = 'phar://' . __DIR__ . '/phpstan.phar/vendor/ondrejmirtes/better-reflection/src/' . $filename . '.php'; - } else { - $filename = substr($filename, strlen('PHPStan\\')); - $filepath = 'phar://' . __DIR__ . '/phpstan.phar/src/' . $filename . '.php'; - } - - if (!file_exists($filepath)) { - return; - } - - require $filepath; - } -} - -spl_autoload_register([PharAutoloader::class, 'loadClass']); diff --git a/vendor/phpstan/phpstan/composer.json b/vendor/phpstan/phpstan/composer.json deleted file mode 100644 index 67020db..0000000 --- a/vendor/phpstan/phpstan/composer.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "phpstan/phpstan", - "description": "PHPStan - PHP Static Analysis Tool", - "license": ["MIT"], - "keywords": ["dev", "static analysis"], - "require": { - "php": "^7.2|^8.0" - }, - "conflict": { - "phpstan/phpstan-shim": "*" - }, - "bin": [ - "phpstan", - "phpstan.phar" - ], - "autoload": { - "files": ["bootstrap.php"] - }, - "source": { - "type": "", - "url": "", - "reference": "" - }, - "support": { - "issues": "https://github.com/phpstan/phpstan/issues", - "forum": "https://github.com/phpstan/phpstan/discussions", - "source": "https://github.com/phpstan/phpstan-src", - "docs": "https://phpstan.org/user-guide/getting-started", - "security": "https://github.com/phpstan/phpstan/security/policy" - } -} diff --git a/vendor/phpstan/phpstan/conf/bleedingEdge.neon b/vendor/phpstan/phpstan/conf/bleedingEdge.neon deleted file mode 100644 index 01fee97..0000000 --- a/vendor/phpstan/phpstan/conf/bleedingEdge.neon +++ /dev/null @@ -1,2 +0,0 @@ -includes: - - phar://phpstan.phar/conf/bleedingEdge.neon diff --git a/vendor/phpstan/phpstan/phpstan b/vendor/phpstan/phpstan/phpstan deleted file mode 100644 index 7a08ef4..0000000 --- a/vendor/phpstan/phpstan/phpstan +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env php -<?php - -declare (strict_types=1); - -Phar::loadPhar(__DIR__ . '/phpstan.phar', 'phpstan.phar'); - -require 'phar://phpstan.phar/bin/phpstan'; diff --git a/vendor/phpstan/phpstan/phpstan.phar b/vendor/phpstan/phpstan/phpstan.phar deleted file mode 100644 index 0cc7a68ade36dadea722566f827f7a135f07b6e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23796390 zcmb?k2bh#a(iRmE6fg@06qN(zU;z<OL3UZ9fZ!5DREF7^+1-KJnPCF#f*3H1U;;CU z0TbpdilAb^oO8mg9KV>s#9wcBRZq{(viJ43_dm~nFLSrw+tt<8)z#JMpbkaZbgHO4 z8ZU~(XB?2MO1A7b0RP!?OjR&-<dN0EB>vI46a9DTOfcRpNxwQBa#YKfsmSzfG!;33 z{ulbgq9Xeb6d(T=o#<}^fng;h#|279j~X+4<lwT-ha7dlfTLTrobzJyZO+(hn{9U4 zW}9uA(EscIqyJ)?P$FJYg#U<Ec8f)3L}I<W#UqLM6WeXG&AYdJSOpw#&MT+h#9y_m z@003ajrynq{g3zv*miCED*341a=NQel3nyC!0~rgbe2zcu2T+Vx^I*ITi~FPzwIi2 zyQlnZc`OnMN8^=)!<7-mzPh>o0=V?c8wSZ2^$K*D`eevX`V-)t>js&M?=6KSgQ;M3 zBoj%c$A+pR)j{=DyZ!W6z=app?9pIBebgr>5FwNWoLv6Iqy|6ft3DaTp8(Te9208r zlOF1m2dLdp3UJGSPY!PIlV0kR-@EEhfSq2wZeRJNJ(X%(OFEM+pAd{i!@*1<rM~RC zz5Wu|_U(73$(Qx2`v~>PFs>4C|EIElHuy<T^~nNi3RDT$>fSH=HTcQl>XU(N2f*_e zj_xF%989IABI!gn6^f*bDzfoVCYp$k3MK>8rTX>^M`D>E^~2<5t{AY@<z=tR_dOc? zzPtK9kY|-dwuQ-nqwn~%sgR*-<%B7VR7PrslBrb(Q{9ru<@@VO17GPgptk;xtQtV< zTW7RUngafP%_r04qkrX<WPMa1>#&i!Sm5%7m1~6I;H@%1ak}D=AU0Kh5A1jDh}%4U z-=~*R{NZi%_rMEVEWcR3hb`uGWoi(~1j!mzlkIY16IFNM(R&ZyN4{)W@*bw-AIYo0 z%7BMnd)YtUzCX--|6ViwJ@B(PpFYRi_qm$y%T@wB`_rDg%lA7{&6BA}ED;Pt!SDZ| zs|g%;%gLY0pOGKh1|2kAR2Hd-MU-8SNhOkzRHn8Y{)b2D4^Thg#1F3dKtAkP&xb>} zW0aJqGpS%GqX>3o&jOsVHuSs@>~07K*MuTTbSU-rU0dh^fydvrZ?*hAwJb{-N~9v{ zPp>>s|0(e3i+^4xe~QsdSE{-;Jv|mxe>}0N{$t>kI}Mp2e~eK<|8Yqw6|5ayK9#hf zzG%CH{sQ>d^HWF37j4ZK=|pH+BojzSpgHx;8(dppMbV=FlW%f*&ih9B5B1^W{2_4l zt}nkYAGXdFmW-*tEMg}GY<c0v4f2=!n7<sGjOl8OC661VF%I=x#`On2(&Ze}$<al0 z{c{#jlF6i^<=Kq>az_>oIDOFt#>C;S^_Rn|gO$<Hv@y||h?X(Qp8&i3z2XazaaZ$6 zw7fbHF7K&CYr}sHygan&4f$(o)&kK=W5IN~G!aMWqgDO{{S_<}IB0E6SiauZd~JKy zqOxpESL;$P75M2*JDn!qb*TTl(nL0%2@;hOIl+YjTP_&?wS0Vl`8ZRXjFeVILenVF zkdBd7-%jQ(4;+8^PEX0VxgL>UR+!5Ie*Ei~OXTl!4W1&=qScY2T)R=1KZ5N9c-)5< zER@eW8WH8QT*Hr#Q#Tw(lEY_E_@opI{QRmx{e|G)4G;{EBjVA1M0lF9qJf)!z2_+5 zDJtL@9M4u;jtD;o2C0jMOM_`8(s~vNcvPR-W<o`y9b1ajNl{UCGWZ8-^CEu={N>th z_Lom7da3WzoK8RhB9UPpR|oi?O>2G<q7L;F=?aJxE%{^M<@b#;!%bnMs0!pufog1E z0^r|IRu7fZ3kh=H=9$IUOaR>Fi~a`+0m6#9en3f$|FUXZZ3@7Tmku$*$8P4MD7Cxk z9iJSe{~WmPkZDHOIgc@B(CD$5U?x%>;a<F!O8{Q>>$Pn}temr*noh(6Gjt%SJK<MU zI(k0vtr;Jb6@GJkBsh)q5J^SiA^pu1E(f^Fn^RWEH}$!}F%rV7Zo7g@1HO0oeXq!u zImHDrfaLe}!)by75rMa^eZ8A}lpD<`5YdwD!;%3%d!!;Lf0`QsW<`@ql3v_|z-AXM zJ*e<6!-;D3m!o(H18y^_mFdDc*O9Z5QISklBCI|;kE;s&cDJW*k^(4_F0c{hkkwb) z@>~$O@W%&DsE`|uBQ=?>VeJHG_SK33w))pge@PKLQW2Q@lBvVR?@dKQf4~dR|Kv6K zGgM$kBpyzric%2@HH!4GS~PNa>EL6>4$g8^1l)GX?0e+1L$>l+Iu$CSK3+ouOPrh+ z%~PoSyVy?yn{J736q17*AQ=)K8%fQGsPFgU$sX|W4n1F#@4Gbc{n$t-n~LO#aSU}b zr~tUn+%ujL8o1B;RDilL0XcK!kSl^@{ZylBY6?&R|N42sa-r(n0M%F(<K$|!=0ME> z{Ce2bwZef>VQb=yqroYW&E!=pNG%OnfcKQVYK-{E26%=AlgZk_wUL3rSPVe`+KTEp zFdL19wa(}9q!ieBPNbtq2QR-h>4s3)5+0w5=84yjEeJSqOS|`k=+Fj;Mn<cn85-_$ z%GylM0hI(kzj$Z|VQEm|$^>#8`;cn_2XNEerLBacX9JSdrzmaIi&*Wz<0f2rjj%N& z(V(~}TXQUDGXn0uuFdJffiY-nO3qX6N8B@jZ~Qp$5HAGdLdl#?o@XNj&OCj;)<Qr( zw<<yI>kr7KLZiSYx4-<beBG^quZ{e99jgBhnhDrz{0(~w)4v*Ef}hFB@&fm6V872- znv_99?Ln$A;-FjaN!}3k0nUoPX%b!yNx=k|brHiaG%|w$xa_fmyGuP9>eOR1<aw(H z$3v-FJ$oabHz|e%5Ac#9<!RyR(ttj+F7nj+Fw+3LH+!?I&>*DGGq7YTQ5{W3#O+sd zrv+ZO_mI!!y8=bXckq>x6-Yx7%c;hw0PwWpwg(8q!CNaC3^ZYe6!`uiYBzijY_a>) z8S;JahQ3#Ij|XE#L$a}oXe<^9Ta4p)J`AimC~fN0#}i{|kOH4rEC@GwTsD$bLUwAZ zg#>19+&n^rJlqpySp+lWJQ-hYr3rx#?Ru68GYTAnt@lBQ%Tf`Qp6JL82mGvg2jfu+ zdZbNY8ZHoxhho{Vs@s)R2Q&b%?1vR&rEW(wR5z1>pn<bGnMhMGYyK;=YK9{l;JH_h zHjzz(t!fyGMn>Y5nJV)ejMG_6;IB80GETi<oU$v-R*~0Lswsbg`U1Z$-Diu`w{6|} zhU01JCR>Y+y4Uv&47@BtIhXLUiOdk11c&n~GL0(&+~(+2k4pIkJs#zQYhaK=q&%7m zrU8yQ>6FKWrl98v&8P&W(27Py(rF|(NTctvB7n!u%9wsqV1xM#x@sW!p2uq7w3Gho zAtLl5k@B355Kw<g)fU-3EU!v4xJtkSC%@c8_zHY#K3`cRld2tDLqPzCp(9%A76x{% z*weU_!y1-rd^kBS6^y5oiB!g>!>S7m23S^m`+5<ppsVGJ#UY%{)O<(H1e}%_zS$#F zX)siU#TToJ<GG5!3)_EshcIo`h*<TBMAD`?o81s_(UgC`D>Ma>@>Z%QX-G1LsoZ$L zX170O64C{3B%f-m$^=GdMCw(2%bm2sfV*G)yUADn7x{)zv|CPT5WA{&+W4{^JH9Se z-D(%s8XJ~KXVOEWF>-G?1N)QP5%}aKFPNM}!I+m{SH*~q(~N>2SQPNNrOOWWD2s@Y z=gywzp$T|@<;iCV*MBi~iiqmf_|o25G~kVai%t<b8lCI!)8t|^iBKX|M05YNo>H`? z4vXpmKka`>QaHBSVGPH>Xgrvz9h9x6bUGAu+@6{V_{z)k62eq4D-}hT(VA0?W|Kuj zXo{Oi)q>=^12hS6<Q1O|5|Tr=RwY9s{{YL*l!-;9fb0M6yjWPas%QC_#sV!<UbCG| z`3%qj?|$)9lWW{+%_#h&mE<C0kC16C%LH7vxaH*{(^kg-CeZ+f5qoGcfZb|C{}Be{ zE%ID=h<uQV8n-qa76`Au!XO487Rl2<cWxHoGoK7LMHdV|ITE$rpqL<gfQ<vVtkpZS zMfSo>hl;!Z+gRSCZk1_ChQf6<1P{t4W04vizvorrwPsp>z@N`~;uDd9>XffPi)?%* z8iV{BsQ1GJfOmg&>#g!_&j!9Ni_kh8rPN_lSX<R1fo&sCNPyGs{>lV|1@>u4B5d_k zY$Zj@5DxhMKkJJ{xB_=+(P=FeigqVYUV-=Dag&KK8xrmKR8*}U)Favo8d4w{@YuIk zoGPL<q&J}}6mDm>BH)=j-+P>}71**>(Q#F&M7FX@%Le6N$<r@j?|;s|T}TRsV~fND z&N-SYUVs3Oy?I@^&>&f#*Bfa&Nj%dvMx*(Ev+9B&$@&!iawKt}21jrk0k3%AtRgA8 zpuOvSuZ7p6xNx<l;Ta7CZ2oAvi*OZ$>UFsAeO~W6cZ4Pae*e=_Gpp^?fId(u%lY?X zl>%4ZyT@darJ#B1$TGMlGk%6tXyrlN83^Awt<AYYQqa70NDu<1iqwBX$Gv%|27dg? zGs}dAhRLlqFREkFs44fO6b(VYz#aNLWY!iu)M>D((>(SUz`K^j%@Sfk@Lo`-&@`HM zXDI19j#e-!rqNU6$9O^td}r0Z_j#=xDSBkIJYwYfoBJcM|F<h92oKp(gGv$}>KM{& zH*??){Al~@{}!r(IHXP$$3`nDw~!tdjE7@74(Y-z2R!1F4Q9^v-<VX(<(c%~O?2A< z2ejPtB$4UA*#K2<Fgm@|?Rnm|0_=Y4Z<WGRkk6y3LoD2tCdIT7=fBQp3qqp&uVIW7 ztAPpj{03#7VTZs6SHEQ3RYC9&OxMQA)##Om$!sXVwzcE-6Uh&*+rauOlxgx7DD~oj zx>R83+a|;0`vMKt^Szz-SWD$Wdf;I%wJ@vT<N)&xttyjA7L6$xS2}F)*lwAc%w7B; zutWbxYDEB=1=sW8e_3BCuJ<EUdQ>z_<~K8#ickbOJsU}91}4I_1G5#B1j_wy(8yuC z=$ZiE9&)wGP!I9Kty1t55Yj3Nt@&lRsC0e_pYrGcyy}D7$4Ql4rPp(WeD2BIw}4Yl z7&t|^2Y8WQ4?i?HX1VjJi&|>M0Drvyl|O~Lz)`9uR!Z0D5z#obdteJq0=#agPsa#J zLG)4&3FQ*v>HN&tpKSiXcY24-ic*1pE1=V9U#=)5YsTX&@ZlaunW<mLt!s{}M{74A z7)gJLE&y!4@K3YTsK5;r$U<?Hsv214a6AU=S9zN04+W#NVJVG8$<&H8fMW5sS`gra zZ_eCKbbP>8Ym!?J7{cEIe?4yMneuIcKQP4)PZY_9D@&Vy?W|=0cG~C6y@aRpR%IX_ zHHW6DCa(%?p+cch;M!%wqry=TDA=+LBmaV~or?qSYolp^^Lh{5dal!^$(epxme%>y z{P`-Lo&c{*t!gLo6b$k<k!}`p3A|W1Dj27Xq2l|VJq_^QH|HHFd<Qn9qtX~Hh@zGM zrXCLM05^93vX^{a5Mvff!|jw)QB&%}-~w*=<sFk_psrAl6Gqpj){^;7zP9(|BpC36 z<!#Jvp#~eRv??2?Z8o%+Lupl=tKjL}afDlDe)o%~+Ht*x(X=j-%4JZR&=88+0blue zo5zK#Al|SwH71x%NA&oR(^Fe+G2mm%dY>4eCi-fYCYjTTt_L<<JFK{ngN8go;{V z>nhjsM8Z%xNFHR<2EP2}*=83*!Q{=Z8Cg&|f+Ue%z0TFH_l{amz*Fz}%=qR8MH-*P z9?wV^Sv`ofxrHVHuG;NSvli2!S?U!EHF!qCIf3?Pfq+YY{P8={QJ02v#I`hu)(qH| zia0F;Y}a|?lS0#=Pt#K5t)?G0OjixK<dkQdc;Xpcoy^qccadRSE#QAndc*7@D~Q?b zRvR9VN~$BxgC20NZfkxPIcPq$b<-J3yH#}8I+H>xbO+!ryMAq!d>d59sBA0~O$Jk$ zT({~>@`49=>i*qK(A*%83>DVO$-R_s0}t@jkB;0^s?%Ys)ft#d%;fCov8U*d6)r9| zeu8A$iY|uH0FfK-7WC8K10(ls8YzWal}N<Hw7<P56zv+O^At#gsw`G%bP)f9*?+;o z5wQ7D8FRA2@-bWC8JALN+K~y`!V0DVJjVw9Ic@!eA`wLuQlqUf4UW$M!E@|cfa4Os zm<;W}|4tw~p^HkRwA!ZYM{ZgEYp`EIENCs@1?zsOFFCUn@k*l@;AceDZ0AiLOM&|y z_j+@wrIpoafQB-OrBT`;PV&4+odEIxmxKqIfW`6=TPG@wrb60nox!6i@bx{vxl`n^ zJp0yZ#HdSE9C#J$AK3YTlMWE79{*MUq@j|TwAUp}0}stJQN0gYF5tH(jWYJ_sd_`B znUTSA&}`2}1-!lGr_YK^)<CiK>JiPbY<Y=_%T(iS!)(C7b@x0iY*wVZb+$pNL|ly& zJ-KSYkB=GiniI>wY*-J0yRabv$KKicSYh$ffs2lb#A$!Ds?&RHN5JN(|11<9Pa2}| zjy7Ip6WKKB8v2fM-GGVsq9=sS8U?qmq0(qxlH*6_0&f0hq*+<^)Ky?i=_=Z|NkZ+% zM8KNC=b4bhld6u7q-ZC!ip{z)53toc+nKcnPXd)BlM^DfdL!3jZad&>^UgQhsQP&6 zDFdUK@+{6jjEN>Av1mM^n(<SX4H!RqnaPKE>MsL>)#Zr<RMnRy0}hFe{X*K$3eD-S zutO9(MZ5Oxs<$q4dZLJJ3ApD$znYm~=Ulz&`#O)~tev!91O9p6O(t{K-wQ{iCR0>X z9mD?zXwasyGEk9<=zYFN69F71@QsN_d?HmF>`I)bqbIc9j4jlGD$eeq3J1{C5d{E0 zee0;86j16~085T?61f99yRv%)4nL`8v(T5h(u0>;FqH|!>7-;jNt;vy;YcW!SD72Q zG~iu3-D&1%BmI;XqJyzCy`|Q`@vppcF6MH8cmKYt$^MP=Qx4}RDR`w6T{@G>D%YJ? z-mP37@TJ+unuQvFjYP#{5~NI&r1oM*m>ziL&=*WNWW^v`?*a8#Z-^ETGm!wfYIPid zlmZK@B3yCK(p$s?#`sYd#l;O7z_nZx;M?bRHS40j%q<&NHXRO7pP~4rVRJj>lxxgl z1VyJ3{CU%x>NL5tWDl~&fK#t|&@7f%p4J<$l3z8#$xI2{t<{ZY;2lA~d3ntnB}9!U z=rjhUeF`-)pY;#iwdq-AjG#G~TQQYX45wuS<+Wr?QJN6dsH%Vq_5?g_dg~!#PyRYX zDuALakF}2Jflu_mKO^+;z)qT?{fdbcx*7FsB{;IW5F9wO>4>j|x!9E%5^HwMniV%V zzzwYaXW@~;J)C|!No^}0<8*)yG?h~%fu0O96ark=@9q{-h?TDPW<)$zXg{H-<4g^l z_T-qoh1$vFCyp99M(@Odv>lidxcaCTB|>=|{dQ6bOrE@4Bt<J@;tNudiaZZ}T@$Su z;9F}ynl6Po_b*%jw6!Q(9k*KmbZ7yE6OP$Mit!Z=gd-I}N)+VPV>Z_V*yM-Lf0qJ| z@~X5@Fh)K)m@1-wP^Ya(sOBBbasww+JYYPU=lICbPL0frrmHfEsrv8{Dh`DJfBNN) z>qTB4#MxMsPKnk>ykX%s^M%;68!!?_f@uySbXT3oA_Ko3wfP(W%u~bRU~QseW+XCA zY1w8j|6`xCh1p#h6o1A;^=o<kBl|T*%VE;6(zKGeFY5yM#G@ZC7Kz=>ElUR_Oyd<Z zE%2A}879pzh<<zO`lj(<#iZmknR1|-=8aWK>@@QOPixuMg!{$L{FSLlWg=x8o;|#E ztepIisKmVyr;@I9Ll)@zq3~QIw7W%54J%b35Le7lD>@<Y*1s~>iOBBEP<I6#kO*-1 zp3Ka^nqS^FhUd;~dSR`OO6|V#)wqd0MP`3$)?P^|!xni~$)=ly*mF>rXL}T=vns~2 zDu9W{PcVz8?p+0Tf$pNjJ&b9AYY+LCS(GTI-)>z6w8oqjH$;P7C~W(<S<CaRigdg> zS%m-Si6|{jgRtVA&%D4v`<?Q=sCbB1nGLTB{^*!6ZO*5i^w9|Yvp_4`jo5LLlmIPx z(uyi!?6IT9D7yRi(~1DLopZ{;Lg(3xjlewvG`ETcW(H&0<u77Y0Ove(?h0XcSMgza zDz<M~n6&-EkA>HBJZU7R3oj_Xj)nttrZbt%1S%4#>Y#4N>sWY&M@|_fh0tQUgO*X! zVL6T18HY1FonlBm_Y)&IG;I`pDa#7nz3K^*lf}s8-6FuPY+0Gb`OFFYa<>r=Nc|h3 zWQx`!sc0yWq*;en@{e2y@a(Cty&{G5rr&OYQ$s4T?`B3|>$wYV6-Ljoy3w%F?gFL+ zmc7x;Y?E~tlKg}c@-}7!K6?DlCUNFDr(uLt1{@*9T1vf)*@4mh&$v)j;BL7+bC!EC zlLFUWpZ!2c{g{}v)xFFKJn+6HLE&`s4{&6;btO!$P*J#c;P?G!wijL>E*Soy9v6HS zmjIl1&$FfhX~UhP-P%LPJZ1&{{^DteiQMiwR{m0%ntkO>*ULJXRY`a6epnsvz8BBN zfZv}{YW9cukyb3?Fy;h4Sku-l33^VS<aZ3ZMKCnY>KXQc)a<_5=6JDtv%xvgxS>>h z2R9q=m`6%pl4kQEG$z<}h3>)hz<ZAT=^~+b>m^VO8ZaEFj+QI2QEBuNV0_nm#tW}! zv6JCMpn|SxERUwbMPtH=q9Oc4(cinBrU#y05-@A}L#a4VuAQ<Ne2o|F50Zb<W|Q2F zUI+4)WZ-r~FKQ+=z(n4E5pwN`EXAtYEN-J~1N`fbQ_QYx&&m6GYcq+m5rZjt6HjBG z8eG>GtTo_s@Bh6)s^mFGS#LRXP@gYDLKz8ec;MW>-&^;;DI?znPvSCw&;D!f5-9_@ zA^%N-TYRW4`T`?V<y7_;z;6e=)KQ9QoRQHQEY{=nSiKjoK>@!!|KJf)#OOxVL@mqO zw@aZm=d#j(za(-;UOfBi!p5i7Q7~g_fW8i#JMZdyr4o%ZtK4l&C}Sfl3V7t(8_gWB zab2YFmb7j=>bd}jx4d%S|4m(nMrdoMy4MqRd62sy@VG_0{~={~&e0UM1oglnbe=-D z$6B^q;H7(Rzf|~3seKyPJydh|;-&yj@BOaXm({rDF3Y=qs+_9;oP5ESzEXw8l|d<T zeb=n2$6nmjz?H`x+FQzKoSM{aZfNE2xeCA|w%yk3ejC;3R<Q1RLqQw3`vE5}dbmpJ z;W;y2uQ^#4JkI0-fRA20cV{WU^WsOn1*kT-ovDFmJbBwyLfyD_K9*WJY#O2+Hw19x zO>dbc<i_d8x(4ivR@!F(U+?{w*=^gnaY7;mr6+sj9(4K(anX~XI!Kf=ERmRIlvK$L z0lcQo6mus);~FAA{J5Jps{qIKSZY$5jq`iCi`9l6tlI&&=8Z?*7A1Ke;i7bDcoF^s z3r`f!hG_X)so$Pb58l$dk1%_ljpUfqA-ank-F7saC2;b<h{@I<V)o>vElygL&g$eY zt|P}-4D8&o=WimZ=f0X_&BoJo;cbX+IMuoCSJ^~>oi3bhwq<!vFXgDCX<B!VXgy#v z1SAGtbn8B|L}DMh&1Ne4D&3YaC-DE~?r2uB@!L_i)kNASK*?xBjy?y0fy?(k@}ouw zoRkG}J0Cc_cyn<hIIDwn&>RN#G|LGLEl8dsoSyUix%SdCN80<Kh=-GHK>@(+%U<dy z#6D~+7ENa$aCw4r@=T2>de!~UPiq9VYB$;^CHn+0tV3$x#`nt)7iu5oTcr+e=ni*3 z(*lD#ePISiAKjR=91Q8Udy`p#tD4<n^x%Uv6)|0{6>AsR=g7phq5>Zlfz;LXtXRbF zEH3cPr`um9#6HBO>xyW*y0WtriwoTAxy#L#CLgS{s4Gi$b~tcG`-$&}te!I-xo$z1 zJmsXVVQGOkUvRWp>G0vl`j$uaxC5DBv%n8mFFRgj^}!h<XRfsRD{}&G-M58V-zcHq zj=oXvVzK+LZMO%tzr{?MeKZ;ErbuOUA1h*!fji%Jfe9RZ4D56*Ht!%(%D|C0C>XeI z@AW3hGmw5eDudNfovt){KUOk3uxH<|&5mdv+Q?KPy{2UTm|1}{9zWL@g%9^z5y^zA zv^P`KP1uHk`)|2%qu5)26h-MII#SZ`Hm6+QfI4X3zzp4$?R0MQ^A34Sh&_jwIpS1B zsBh1ndb@DI_QXln3vlz!Pv0+P_^=X9Yud4t)dHL|;Wsln`>+zFalHYR?ov=nx4rU% zZ%kP)a{CyV5Vn#5D%!hQ9l-LddVDRke%msXNb08!?6!R8?~DmCi>V+#MiNqY32I$n z8!`GL@VkGy-ylL`vBi-)gyVxs6J5FafXAHo$;m?MqZ`t&Cqr~|W(7XC%Mmk#)rV2g z*`8pkA{ML+RAgg10JxpmfzSRPGAm*}Iyq(>wvRrUseuD-dfgn0@F6(DH#14l-suQt z2d*4&#F3&FA7*EmRV%*8rUC4_sKTsNl(?G)1zLt%OKmr1`z=3Q-Uz8x53i;>V3gGR zvpRqu9eB~5LhQr#=u&5L!HRV}vjXq`q4Q*6_3ut+(#=beKrkFm;hGOjAEvXuf#<h= z|4}KU*j?Y$Yx1odT<GS&>AzQ%2)7THm(h1-E0K?5k%6x+jGL2Mp4ZZIqfBK;F}7tv zfgRqx=UWl9#9awG1hqTjS1c}Y>EC_F2)Pg2u=W$%rhI>-w>gaL!*i%96m5r;DHQrJ znhkjD`3IOixIVOj*)(R=YI?0yeG-!cpLwaZNn`pT*HO8xYCA4ncIaAj62r&1LgQ;( zZ|$`w*!xcI)2$KhH$As&1>p*m419F^YyTEj|9xBSIj6pzg1c6_4saR33%>g+BxU$; z(#qYH<D5U7hVAY)Ja(`-1>s}DVrH#pQs09@fXzP~WEA3~o2a7$g>#C<saqC{3NY1j zj5O3JC}}-g109Bc_M!0lkhYv&bLrhn>D4xhC&um5NmzYIn-0#1nD)xDZh^<0b6rw+ zeYBV1{F#jlxasjdPZv%f8c0)I6w(`y?I5nKYrm<&>LY4VCL5rsNoqzkGE?cdDeD2a zs9BeDh23rLFnm<W80$?5#cVI0ymZOr3SlmBw=<K4OC=JzAFpFo1J8Qq2@~V{Xg=c` z?EFAkyTQ+kz<zy0M)t1SEqHq*HBX3r_+YwKlrEQn!+DrB09>)#0JBi&)^Hg212ACg zXyEQ-3UE8XKUz*Q*GTy=V|u8CF1Rh|$g9$OniliCdn^~CAjaegFpi_iAZ_Q<+b3fw zQFAeA$kDNp!SNtUhnAsjyPItMzTKO`-N&6f%ln(`uzv0yhprS#AE98RCYg=%Gj7{) z>j8Ip<@#kp>!W9+>1J?M`#H=BytC^7llb>s`wF^Jj{ZN8st!l>QvH*pI2ajl`)l_! z*V22AScNha&gw^xuxSvCzynvVGO1W+AwyO53E6$W$it#b&w~$y95SxJHO^pBfk!2m z8;9U5YK-nA(ThnxG9~bzRRa$cQ4gozo{V4gnVhL-TDLGE@P-+KhX|ol-O=W7-qu;m z=a?6G{Q2WM_~u0--r}`)WS%+sl8EqnwtG>4mD#q9blrV{BZSl0NGoU;yy{8S)PrE8 zz{6_4-p@B<bu3*tfq(ywA54PL^WY-&4(S`vl$iUnn7}FfKR8{)^gI*_X}ml@ytsNp zX9bpV>jOhiwR%p7oz0Z2N=Z6`B?UhF%q?w&(7B25riWsDj70>#-ERAzgweTkR!<W@ z@;Xxj+rIT+5219nO;V>++|Gpj{`+E+6>_e4GMJvBD*hl#2@I}UcdAI~+%{tDcH8`` z&7)>U;H=5GiP2hea|4$@b@C4)qq8QhbuqhjZkYVJnGiW^G98^&XhLl}?LAnebncVX z-o|xI=c)snZ9muSVRhDKE<bz?w>a?GvzJV0l$>Iiwwyn&8fYr-E@xFWKR0M^^h&Jx zZm4fL(-i08@lu3z_A<fK&%a}K7CAS2h1A@3?suO$q`8Rc%ow4^Hwt{w=83t>Vx7(1 zN}(399Rbhyc4ixq(z%<bf_e)1J6jQOQMXBpgwVOc=^2xRuJ;}+Bk<76ZZ|&Ix!%-) z#2eB3-D>CshD#3`Ct^CcPIWk=AJ4Q$isE)}oh^*cqhvZA!!U^pNL8~R%Ax|N&6sNr z*E)+zhaNQJT5coY4S{RF5>cH!5;eMU#>Ffq@Pa0RZ-mtI%`35JIW9rcpwC>@xpP5X zU8!dbleh}NitAFbMwUjMw%~>bt2BE(E_m*?CQ<J>>ylqLRT?e_Da^rr)PAE``ScuI zGyBMBIbDD;7{tnOkm^Qw34Hj9)~0WdqTilo0r^sgqiMXpAs1j+>Y2g?0iRs+%3snL zo@ev<1wlP^HYgNx3BU^<JmhC7VFdm5Q5DP<D91tf5~fu|D!CauA)H*7?b66%=t^2# zwZ!*^<QjZ5*9I8BK5Mcyo_B!e>r1Vh>ib}{L3L+-V5duOeO#(Bn0|ZGR<bfZJyw*g zq|KjcTo9t~nyH9J=$1o_mMyri13x%*(j`)W=X8@PAeIQwHB|ACJZt<Aiw=CIc(@6_ zJog2|tfV#LdwZ4`xaHj$CXMCUI~!hDr&fzn#V;%{u;1Ay{3xn$7npV}D4BH|+B;aU zxqf0(;q`1IMqo1bkh*hREn&%4%lWJj;NGXKG^YTMqI$U52sNQvHdX5Qp49<7;FEo` zBDQBwX~fntleeLio(TOBvjdO#`pTBV?s?!c>~zr@?W<BE+dI}C?QwZ$A$8X@kJ`8x zi_SL5UgT$4Xy8S)HykDWo+Bb7G#=+uBEQd+z-M1=|Ey5D8yz)Xl-{sp-Y?lGfV;hP zmzhR-PWI+RO+{$EO~=+VnHBiumicBIGR7r0Q&WD3F8@=nIKmNiXKLWzvwk)kW!xQ+ zUJX%ivMUvzz|6pJs%wpk-I?`U<AG#?_q1HZjR!1#Vz$X6dLAu}k}-^F*G!8z<#>ox zXV<&1?7)u>T70#bhd*aWm%T+RH1Uy447{}Cg7bvfT`6jO2Qxi2j)t_C8Ri}zpD4`k zoiI(iLugMfJ+_I>aWuj!{+(EIV4oX`%!NSiJq8=V)D<;~H_W`i@Ht~EL~eK9SOQxc zY1X57e`6y7M&{kzOL*OTBK2^yXYvbX1%^krS}3f3q@{S-_>E^+3&7?pHk-9hce}v7 zr}pq_pZk9N>_MN2#KlwtH{ZdbjOCbHvDCm`$85KQaJzRCNNvRg&6pT?@w+#evD@9@ zsephE*JtQXHDwp;m>RgDQ?Fk|X7>?LyCp^XE1Lyy?Q55r#S-7~Vs)gN-k%JZ6j&`6 z0Q~T`pUgHsce|^mormf=RwcMSi+}#thn9;r+!d|71~M&KPW;*qY00l;UkkOnqOBza zTi#(01Ud?-yB?Hbn9cllbo<*U>&*!3Z%C;x@;Zd=4tV>pvkno--8IcYQf@qaoQ(sx z!(qMd5NaRJ0~3^hdOA^=hwb#Y{rSBi!t5?I@0G~i&>CfZ0F!V2`#qs{51(~QW_1#2 zZ>9xan5Z->BJL6^gHBpem~GG}9lGE~k=T7i!3-$L>(=*i;{hvoNVO7HcZ&{DCJir* z>haokp-0`cV-w*mp>o{(euOsuCL@6ut>~oqaxXhowdAW>v$w;&@nQ*U6l}At&bI*j z-SEx;k-6Ae<{-UuMi)<q19&+@netu4fm{yor>b2{X2M-$T)~BVT@`H`wm0DOO<S8N z*WJtM@I{dx$fUr5U+imkQ~8(!(naN!5sKr|>6!GTykftGH395;#DWw3YZ;nQ(HyS# zR@{}$4XnKS;*G-X-u>*viK4dGm97l_{4b$)_i`N21te5l!a@U+!yYxqGTgf$&w)4u z-I<#axS&Tbv-8>AHnK_5ur|0_CI#Mh(_asY8hpfD%GsMC@O{<-@Zz1{3JS5i7D&HY zT4RjsomE{~VBm=pj;$2lVk*a%BeL#;?#bN1o7)XHOGG8k+&WG~whK4yDTDitNZ>Jm z)y>PMiQw)tD)yk!Fs?zTl5}=?2n!E9YGKT5zISiQI=S9ASa9Hml6B@m9Arz~G@hFu zW7`2Gc?0yEO|(2pV}YK}Udu%RXDwKNuIR|UzZ+j7XA^Mz3hD=5^wItA3bp%iOL;*v z3~XXn;J07xT_ddSO3zJ`m9>1v#J~lAO*88$?!-A$RK#}nYfz8R%pMo_?3Y;woye94 zT(Dw6nJB^YdZ0<5Waxbd?U(LhPT)%&uUa9T?#&fT<g%ehGb?cTxX5<G>TX}OuR0Wo z>AZ&0>l55yz(bzzIZmjLrr&P8L^W769hWm#7qig7&ugzUm%JA{GgGfi({+@z1|rL@ ztBC`>0{CQ;!4Z+#-OO;tPf4!hqg$C6xZ{Ow%>g6#!75E>nR(^)Jr3xACyzL$tw@Wr z^KLq}GQ$)Z@NOl$YdkUPF>`{ow=?}zUf8{YwE(PWw#J;ab=N|;+>ERrGb!++LnikY zEx32L++GuVIytq;@b87wy}ME7(_HMfBU>);^cEdVaN!sOjHw(;t6ybm=}Yys3~K;5 zV&6GWinPV_+rbVrZ>f1(RB_iZH*ivM3$q){vB@;|$b>%JKAlN{ZEkL6ZiaJI1T6sS zE+$)<aQ+M37ufgwax?stP&p2YAl`abq-<w-Y5DTKMa%9}92HPV9ApRHV;AQh>UK|V z(P$A*>-TQ$^_}Ng*}%i@{(eW1+ufG4@!Wu9Z_H`8=l<>evy$(jPNEl%BHVz$jxXNb zh|#zz!H1|2aKk2mAK#R$_Ae;y_c4c+|BqRLP1juYt+2Wq1C|5Kq3su#78tL*#%v{W zACUE2$x8a}&w~YU!~CzzF*tW>j<@mZjh>cv=T-wAU%hs?D8oI5GB@o!#fkvFxNGyF zLh0ys%oYLV%NDYnz^_l**6dVrCygb{xwlnJ3OpxqcR!KThcCl54@jvfVaGBraKbn7 z>xI{60A=Oq7cevM`5kt8L70b;uHC#OCNLrW*s@9m<udA*ar*(M7X7kP%5Zl&G~LZa zc*=h{vjSf~_Q9KlwS<1VNuH$#{#4#AXT?w~90l-;IXg8XV&&vYTAn>w&CI}OAAiO4 zkAd{tO>8SpE6=9&BykP116Lh)m)YIq!vJ;4f^)q#?>qbV{kJH)*jZ{l<)YifObq`e zn;`Im-e;I?G``Hk==pQj1n~HE51Cz9?wTN@v(9Q)v9!Rx+g)W`r;o0vx;Ui^dF!Yh zXAX*ebB5^HeHfv^iI!10i*+Ll3|zDBNOQi%oi@o9r(DvvtY6^32Oe1?(z?%%v_+Wp zx7ADxyx_52pAuqsbI@mO^qlKcW(Dp%vtq2Uy3b!SoR4{z8G)mAI`3m)beB`*bu;>a z`bFGYz{SNsnqva)trbgHn`P_)f65M<%+iPZfM2j%VKGY#Y`t=^S-5gH1X`;>G%Ufe z9l+0S@q?MkxT^y5Z<Cg~iQ5f0XGK*X|LsPO!HoRpu@-=BhCOHo4EKp=MJ$`v=cgZG zNr9bC+}mu|bGI;ivG`$@6gYY2ufItB2T>_*1CU9<Q_PCD-*iv2*X~~W^~J%$@7`>1 zye7!Lnw0^(?1YZyt~NikR?6Jo@73z>mZyod?r9UXfrswF!z+qrKb^gL_v$UzH_A!m zcG>U1O$cnW*S&X%(C)^jdb9H9rOXLD`n1>0QkCaG5M6<e0~9f;)01>X#ta&VrbTpg zVyF3!4L@vpwCCw<-7;zp?|y{6w`U<63Gl>k?l(JdJntf}TL8_X!}P#cG9Ag%;|7Qi zwUM931pzybNSe(N$Ix$2ov3a>swNe*cQlg9-79h>mjW!=;o9w`oqd;*q?WK7Mzy>h z+dcFCp$RF)a~G&v7gY+j87cY`xe~w=r>=fT=zTYOIyo(BH#!^_Vs+rjTmCRB<i6$C zZ6WdpnI70})bO`N{^9i7S5wOhaey)%vRUywE(AF6sM9+)z7W&W+45LapG{iEg#cH) zyTcSI#PiOZ!iEl|``Fd6cS3x9+KX>X37*H6`b$VhEA@`DLF}Y}pUvxNHj56W8u@FB zX`ytFp0+jFcQN%JzT70beODorPTBldaU%dfh~7U}ROI<pgt{sMzuM)Z8ag1pb`h5Y z9KC4bt5S~Vc}m@K@LP50KbRTV<E51uVID)jeKmsWZ|Z&!Jk5gv!_;Cmmj&Eu<d3^a zS-v|TG(}G}&!DG*>2_J|%%^f8z;EY%Zn7)Bn?w~7O;%AXKzjhI5@B6Vn9Bh!|Ljr| z!uTGYtl<wAb5%rR+T||bf`FwhTbMMb@3yB)ee_n}^~?-hxMsv6X%ElYi@H{&_RxyW z&SG}pNp0UaTiAV%cOl&f(HQ~SlUm8|p+emlFM#`=y74h7#kWm~(bDmcRBcixum9vi zfIBt4dXg04>}y9;w;MZlWJ$WVnrw+)%NxPL)W5j|;Ow^--XkS6DqyRo=b$W$ox)`R zTMfV6q-K1N-61-}W~*t!wz@5V_ipU|id4e${)xKwl(ZdsUZ=1x%I)=MxpBO{d!Gt( z^p?83g6u_{YiB-ikkrYy(yW4%1GX~{?~k5VD+Ty&`J^5??1tIIEf4(X*4sNt8O8M5 zmy@@Gop+cU*mwIxYvFFxDBcGbDw*!rnga!3x9{$JS&H!O(sQGDUR&F#?W6wbkd|_M z`$KdPa|9yGiUM~2eW{7ei|MzoMhHhMBfJ!5FT0-l_N5C%a?ht!>-IeMwTL?{XB*%u z0CyYqOEW3P*$;AYe1^!{n1%%#xN~5iyN8-ZY2Oveg(JyqDk(P--^;}S=l*)R(U<?Y zkXqX66rI^(f#=`3?n6;j36<xst*!2GDw6~I?$cy{A@^;j$|c45Cca6m8sM?tUTbnF z&Z^<Du9Q}QY44snXNyjY76y(yVUihz8a-g!9>X56*UWz0EaH|?p-%cQti)KFzR=9R zEJE29?tOi^O2C<)R-0Ld@79KYlJ@wETN@ahT=KWHb|d|(Jv_AJaT{3Gr9}rR!uJ@b zCiPZ#z%mWm9N7GaM~{^P{D-hIhqOc3%U9oP(gnUl4l5r)3!t>qnL<q+habz806xCz zvoE9)zPlY-*-VBX;x+&-`S8uBh23`>D92~D0nSOF4S-FjjoL>F@ZIlZs!BI`PnCUZ z_I$X@E$Jpwh<_cCUo|>9nY#k;gj=in3cK&Fkeg}Cq-8B@33&6`@n)g1n0`As4jJK+ z<<r6yJyoQ433CI}w{N^v#CP_rhMU6UKDhv+n)!jdEWUo0@HaM+v>mG*NzT9SG_%po zx0!N?Z=$5LxDvn{PP<|csYD6=_SFEkqx*=-fw51=8Ut!va?!|cryj~X&o+BZeK)Y` z!|L{EWk7Z&V136W`-*OSYFk4_M#!;R6HPHfm_G-&zL=4^oPKCE1-3}-ld4mSjB zdvdokqz=Agd6k}_7$ZRI<iQNxfS_xE0RZIyf7*V)cT$dTUttoxRY6|SyN8PaUKE>k zm=xi=zlE!4?X8-2Eay^Y)42@bj=gtoe7+r161zk9VxJ1UpmbJKsYD|>G|d^plnm#W zXPR;Wz|)3bZuWa27Vy-e(+NBZNW%bOpdv`O!l=%GEof+9;I;4Gey9kJnS*!Uu|!&` z?kG{D19#A*z`qCf`%*{|*}0JpF@o;J3IHzsu!jk#J!@Dg05|$54d`nZ=y+O~-e*!m zSFt95YnF%Ci_o5TL#P6vi3vf?_!ct)$GvxoIg{b8hB3GZK}lK8oWPe?hmRI1-P>!J zdi_n2u4Gc+bF1HQzd6uUeJou@&iedUQ*8vm&2uKjMN(Lrn-LU^4eLxR&f>sWfp?s9 zyvbnrpd6nnq};h|huI?K0IyP3*V0u>(IO22-2EoU1MC|}ejI&*xy8xzIF?UMC-UWH z1?`&=_Cp)M=hoJKEut6u6Fo)uo0JFnKJqEV0dC+Edo^1j+@6Q{I<k|yiCTwW?AdGC z=V!JPde8e~^66D)R+fxz0J(wfhfR4>h&_kr`NZ_9V@53`%?ze6T`gR*IO(fS#ua%U z6t_}{wHevY`cHat&Qhs|PyN#r4Cipk`)SXVVKo8!m2NP5ay`!^^J_q-)a3@EGnpBf zeEDXx*>V{D_SEb1nN<VOz4LUEI(MAoBrXHE^5TjUML9mLCmboy>bJ(`F)^@tm(wm0 zV$XwYzVOqcye$`o0jmTyDH>?@w-(cHKT4S%!*&`ypN4GU29{iTRWFgbF&0nz&5W;6 z-OBE--#of9Duwt|jM>GGu@%At2MxJohVXjMgyt(;Sqlz>lMjyQ<G&NQ1mJ|}ua1)v zJO}&vB_K?uPDEoI@|5P_61pYo0c?NZLig!beko=XnNq%;Pd{eR?7>n6&!b)*xuWdZ zUds#oHu&6hq4YU4K`VJ4(w;Wl+w_f7gntC-$B)6o4XXpMu|&KwcYREZ)eijXpVXdG zjL*iU8E7oP+up5Yx@|)JdhD`XO7T3C%hNyYgrmyPh{dljLFF(V;AcH&^cHrXT?>vu zH8ET{c!6!&eQ11HW27b@%ts#)b%Pz4xZ)kNlfq}%WN)H=hN*$OJ)1OB+Y<Wi!*=vV zfdM{L4-&`?eD<pJzM}2M3{QHmb|^uozm(=-eJBICvGs`Cr3{~)OIf9@pmod-Y@PVT z%&vS6f4S|X=QA<z&hy)SB7!%@WRxpYYJpFOT7ZA8`NZVa8Z%H8#Kg8oIOxeg9+4`b zy?q#u>Z{Q>pU#D(r~$BRk3)YGa-Ut*yvu3_t?}wTOd#)@m*wrj@&aorUb$1`^{Md` z9jvCOyaIT6E195saaFTU<U)WCY<lM|DFmLuhsN2^^^&G4pcfYatl7BOM3g>b1dLV5 zRD!k!8U4d)p<RK^yKn3uRlsQOqY7&Kjuoy#6QBncf79OF!{W1B1+$q1<+rN2k!^2t zbnm~+l{Y@s!xoRrRmEr8gZVlC`TYn{k57N5O0X}svd7ocub*<Y@cXnN#h-V&VLUeg z@S_dGFOvd%wr?C4kyz~uzl-(-E*Twb>|9wtkxjj<LI?OoOb@(#=mTpSDZNVcRs~Zs zlG}5WD{r4^oW9S=Y&ct;q`W1~sB--a&KC*-cKLa{$zA%?KS#&rjF_FcJ8{~I&7vSg zK0dl{7&%uxO}2G&Z%NdgHul+bk$kl5#-3EIesM`lk=u8_sxxUjnbi)wbo!=Wg}*Ve zPF>qaK#!&cc3RWx0x84ic&nRMPWV<ZIq<td7gh?nPsdOg+1GLbz=dyhH=8JY7NDiq z8+~-9D8dB*|DOHPEm8xx3LmDKn>F-iV&DbeeQ(ATpOPz|8O&tVu4y&u9?t~;H_h43 z<e7a=t#knex8jZEQh-mcdv28I$7eNo4ob^E5{uijpc6XW(oqWV>D`p`RO=i$?`C&_ zo>!dpkrd(6NvLo?cLd31e{c7VW(~oohEM_A{E!phcFuQP{j@m%;j@68CCLC2<~9aC z`P_-$h<<#!2p%4JK6fOO17CjXgo#4l7#~+RezTik{&)Z0P0H{&*G)yJ0ABlqk|i{} zY|WnUH<H>u()b5c126oke@Li(jxO4_>Dy$KgP6?xz(wDz-&Ob<(X()8A1zQ)219#K zTk+}Q8@o2L2xXcom#mH@s#;9tS^%>XU%EqzXq1-p$xp?98uJ5}te9+acRuZtoI^4Y zOxMOk)?$jixc$tCcMgy`G%CDOEv>46z2LA>;4=rje!kHA90@EJYG+Un=Td+#?mMVd zO7S@dMq4ZC`?k{315?ee4hwIi8aR>Lsx_bG26h_Xd<Wt88GKq3JG+A&bMe9@!tB%S z*a!dPEHv<$m-jIHc6}xW$|Lk{DLn&YZdX#8k8&ZvZ)PrdP2~64qUQO9>zEh#>z|R8 z!i#X)M@*%>f{w~@%!6+5=euMBTn=!<=}U}n_BpPra&ilm_S9m|yN525TKKdZYg*B< zg|>L$#1-3^4f2h02f24O&SSLzAHVIrb475U!@0h#FA&!Eo{eI1V6z_{H7k2QeGM&p z(gl&~_&LQr=0ZHAM&Qwa&-Gq&ja0#}hSaSvxtJ3M4tn4-LxxTedY?gmE*6}_#0qC@ zFp1yBSY$5yyNua^`|o){jfm}&oo_Iab-2fv9r)$7KQ=awExcgc4yC@n;>nvu`~g&; z54XTm3FXP=vh2X(DQEQ)YM=H(fid<(n+yzgLc?Bw{crAMR)A0=ACfCaLwizkOT_3s zC;<4^oaG}#e!m4wr&Y3=P$Y?Mf=WS`Z~?##-I`n|1^66fwX3w=a#+p$z<(|3X^xxw ztN@3}RtR-A7Xa)WJ?BHIKqG=#UL`h3W*7?^0l2C6{yR$%KJC*^pq|Xsz;&&cejwC7 zU2^^c`WPk$zBT7lV>~{GTNVD98#Jw8|5Ppqxa-a{%%Lcsk+QNO73W*o0J|f6bm0X< zL{UD67i&%wpvR$Q_x=>F3Gj*cD$R`AXLIB)w+v@;;D&ik%*LQbd1-ThoNc7bui3?j zUQDI=a7B4pcr+wB0PwOgtIRyYX9HXFh}?|PPO09v_^(#dz&^E8=Z<1qJL#{F{*SQx zbVJrs7w-k=&ME?qed*|jqyV2j0s{?&{mMnpV`^Zt3m5hmYM&l17tPXJ6nuWGoQnVs z-@fuJDZ;1nRjiz2AII##jlG8+C+z*{w<pu2w`pnmOk1jp=#ka3+~(I$J88QFW?t@J zE5vARPsI8mrgRa%69>c8lP#tA8kQS)@+-ry5_->VT8G}c#m-)OE!*bu(T$}JhA^lr zsnKTWtiY*l9(r4-i|Mx?rC{?;bz1MT3otkEo#{!l?%`J>)`j0^GBvR6q|s(E%d-jA zQ8s!|Ih}~md&%s;evfzinRR0LVn0d=hH0%SUO_i{S+7OoY$Y@gJayR6heh*#wL|78 zKHv<d24;SlWhN$`{Z~EOi6`PY1wls04*cl4?!!cO&y(6Z1>`0teVG}!a=V+|w=&dW zHmaw)3Sz;i4r7B{2=JKAJDKy9emw#EUx|{>VtU}`e?PvxXb00!Kjx#aGNcfS+?qZd zFojD1E-mZxjFeDJzx|XzA<YcwwcteC0zbU${LRAc+5gsQ0r+C&YNAXGd~*73<-Una zs5{ZqqQj|2DdK~e7}&m~#O(D#B<n{TGt)t}afH&lYWc*z!6?IJ0hf-MVHWy4&w%P^ z$9fW4)x}O(1h&kcBuet@6@r=SU`l(nDi$5Mreo_<gc@DVNljzPPxAJ_V&(*vU7awd z?m5=0qYl$u>0aq+*`!j*`CJBY?n&8{$nD=CLo*cd93}?t^XSpP2(e!;mU~WQ3Nr(* zJ!H|P!t7UMEM_Q??bX_CIxhG>AwG@@a%w}Z_dtQE^WHC2n7u4>-q#DSl*0VF$vV#m z+4R5M@sF7ZmiVkox+<FqCuV9FUqK}BV!%soxbr-b-ETiaT*J52+V<G{(jU#9YTt5` zU&oX4O6RZ;$PMgt<!ff2g<t<dQ30CTq(m1mKXC4t;XOq!e#a&qrK;$iZ%BKUO91}e zq>q{YHKGPddbG9P8az_7t-1QiZ_8p@!=l?3`9a5+nb`PM4&RSt4cvAlf9*|GV;ZY| z<1dYe7|rSjUNHO|lYa86es17oFscpIUI#nlfJG+1>sS30J4x8Oltl-wIe&XIU-+Mm z<JO(f_J)+d_uawlMfB_2=$vq6Af1#~s^E{&je#fK($q|={0;zcKgvIZm>76$w-e1N zpkn&%X8^EgB$JsNc;Xf3n52+j$A+k~B9+h~>+?(we7RSL7sc|6>9;4rX~i@UPGsVd zOwo*BDjJMaa=ltd2sO+N{HyH%bGzA5KDc!eO4o~-7WmJmDTj*4$lv=F8Sg9N60J;> zE?~?AxdKSez+8Y2H(&pRl;qj+>rsv>3F@y?mYo~@a@O}|my73+%_<B3#Qs&aYKYy| zHTte&^di&;`1r?Dn@D|%>9=3a(FtzVDwxEA8#sIBbQ1!3p4?jUiy>hGhc_8j0mHcf z;IyfU8~zu<S7-GpWLx;dA3O19;YP!|DhBmX*Ci{_&HBT+EIx3_o&(IXu;<*jr62qg zX)e5_M7M@o+aXTkQh+}n(%y9E#<T)TGOYkliDm|_KlZ*sqN!r~?W!qh<{A#N>{fX1 zqAq4l-gEZIQju_{Xe**NP`iUY)~4IpBDo)S6qLUNhjA8q0gm~)!i?{pope32hv?yf z0@L5+&}N3*^Ayn{r++HW<t#98#Qaz97IhTUZ@&#mcPJJ3f~!j^5BpzmC;8bS+er3( z_xMWT_G95tODqwjC(p^r#G+dG6In69$~!i1kpdc{n8<WJwY7zx|KlHK6`(QPau5i{ z01E_m9x&M?y8SAK2Eud@k4Mvq0@bQ^2fFCKw*UMu6cbPIHZe>1y@s4W|9`<9EZ5r@ zZN>Ea{3jFi`B6;i=uu;E?l_$p7KtVKn8GdFYRv<GTmGMWM0gCdu3ZTx8KIBpysf;T zJezd`9N7IW<G6}_(2H9PM+*(|sn*YZE24XzmgIXDev~LsndSY#y;yeOcP9-zNcbBg zJ53h~yiCvcd%NFPXvr>miHc${w?uCO?p^i1S!=`^gln5Jxf1$3<^}dDFHZh16hgDj z0)<@OY0}}s?RgGZk3x88hCM(Xz)yc0`#-Tkitd!yQRW7|*5apIMeJhw?Nils?WA7o zvip9b<{uN4Hio-8QK;?{mi;vEe<628v_|Q~miwa(LrlJ@F>=$rVg+V0b&p+s61kCP z@ucrWG8Ck%@#$3+g(?)K32Q~PGMiF&m#JdL5gkkhIBV0#+etB=W9qua&?CLH7)Uqd zm=$lkhz;ky^QaWz*?ZM3A{w6&j72d;E2zRxD<1CAXnus!*e#LOBa?0UlQs=IQ20G3 zw(81H9XLrB?&ogZNBD_G03P}DC2vRxo?SxS5@>~oyRE&~BRlW>--O!pgr+VvE=LQc zqDe|1z`P1OS@^}@I!Y;+e|R$1NKLe&2>%htRAsB_RpzLk@_opf0shu?pF<i!9Id7} z$;^<7nHYG-j1!FA`;ZuGbh+C$USeY4vQvNjmq>gR{dQGFu+k)MPi9)+F`pk&;Y?dm z5iJ@rWO&iwygiBb$)FEzS$?n3dY%voE#19Fd-?Lok?Mh21A9(y(Ot;<&~Hzw5c1M- zl3p0nMN<MdG}&mj-?~!{k{#?_SxVsQ4ZrLyQuc6^Qu(5*chvF$f4aZa%zHe$Qy3GS z@QD=3KLQjt1ga>MO{8>s$ezPiynV)HBCqE_S(tN0q$1&HnpXIA0Y$73;C*Lx>Ldjq zDekG+3JZY8i$$;#Hc*j`Q$B>Z#E#&ifYZxzPw67T?6)YoMj02h1^CuNI!j!g;OimL zxnYpNTkc<6D>d_+y(_F4M!CG^L2emk0QWw3cjF2@_y2-2lwn1f7TEE+Ti+AWJ*QI( zXvu%Grtm+hz1FHEJE%EzdgKQwsSzej%}!Uc(mGeXFiDtM@%$rFL?hZk)xqv2_9DW; zeKx%&Wgs!>)3nqQbzWoJ_FMc!d6^Va?7t9`ioBUPU`W8BD{nHXW`t8dD_~k&`UYM5 zlOZcm?S2}U2YmkNK4ucw2!-kW8Fs52#)SY6{_+QNZIS2n9=WNa(b>%Cih)QOrt=4! zyf)wO855~_?t9E0Ne!ptFhO#;N;7w`(7^uf`?r%;_P*7Dgf64Q*0gMqFEBz#v@!6^ zq37%)%=qo8jUn)G9S)bIDznv;lE^Q?UaI@<_?N$z5}Z^*rEvOMZacwv3&DXWwmPhh zFWQn+Dp;GR=?8Yzw7~4=t;Yy$v5P*2P;8y9rFH4*JnrE;Yi{6YcOJa6a67f4FbXRB z`1f|28Tf3~HxCN4XLp8HEQ`?NVrg0^7^L>d(`cVp#;=^c0{*gh#vFg~oas<y;C{<| z`>;LO`aYE}i|n4K9^f6DjE##_C!zS!xkH~wp1?+ci*Kl!A=J3Y$+K}Q8?i`FZmmgy zH+&E{Q%IfcndGe_>!Lk0E%1uX+sqPLC-s&j>BX&ZUbD?((*T|@?sv1e>ZD#{8hO<1 znrM-Mmp^c!IgNwh#<O~<^`vK;tHx1hv>UMI)JM%86ekszMJgjTdGc;)scC`jSM@L} zgH9@rvR@7algXG4SMBNf`A<K&NtzB*8z(*B$|$Tes6Kr>D*<@;o%fkF07OTgSwpmG zD~<bPbt2&^<^+~*dC@pcCl5rntGmNk8lGrItE8RSO6wN5@$+SCMF*be1Y`#}4@7-~ z)STCNce1eon=NhMS_<%-!^tb4&^VT{djmeydxM!Zk8)AB=_jQe+168$7F-bU$Y{zG z<kSYbT`9vIi(tgnt@|XmE^zv>v0_nCsjn)Gqeo=(T3`ZqA7HN@FANZRCr^UzE@rOc ze`P)B*y!-U+0UHiFKi;a91^XGgq6cqwBI(<w7@w%=2nZuPF;v-M@8dw3%g!Tc$h^6 zo_F%TW<Au&>6KFAims{7Q}3%gX<>mco%U)o5!Rn~${lmQf&~VS?X}(Q!s}!edCiuh zdju%B(V^)~rU$NyFP<&*PUbw8jvoihWBK-WJu?IMx@WI<d@<85bKDD=&-@iL0}q=p z>_=fPq2HcetC|Cp6~;4|55ty$XC3%?Um<sLR0D(IQR*#AIFkH$=|tuSUV8e6#(y}C zHbY~H@;vJcHPKQ7TV4O?jUu&EsHA!zwW93o-^8I3@cPx4o*<-7CS8vUUCqJ*Z<_av z$>+QF>#^2bPE(l^cv<SKS4CE*emzpX)SBO3$8dWAd;Wf*ahvdUo{dfWdpaj;oc*;- z3%p|FOml|E$;`}nRX7ov&chUN(jf<#BU(=Ud2U1UZhEll#qtBIlV?Rm-%b-x>Lx=t zn^)LT?1^We)8?2p4L8q}jEzY}6RBvX_PA^$tAm}*JL=8?tXcK?WRcy;u16*+qoI6L z39(Lq<6ryZDB<;-_#%Dhf+*?Vf@(-SgGU))VB8;O_q$V^me;J=c;0w`_JjKap0#4N zS#8G+c%IFj97#^w^SEaMGjC2XyDN)b7{|xyL}^7VF*9G|$S6Zv;1%zdm~4=f+k-k( z2jwUmf`JtHM!bz_Mkm8NHc=LtN#{oLTJK`+l)#5ZR9`Fx;;P)S8F@gY56cQXdhL5= ztEZC!sJTX$>x&eWkv+tuz!jsOHR*^F`t4!^gA(+(Z|z9h;1UUsq>w|Ar#OoOT-A2x z6`}(t$1$ER$V}2j0Fm&7U@TiFBQc)E2VS}F%~eu@Q=nUa5~V{^Z5qJnhl5Ln+R3Xn zFuB;mq605$@!odA?=;wqjMAmWd3N_0+a2(Z=Qn;Kw1-nME)8m;=t<4A9)P`0m|~7< zILSG<I+@AOQB7qzfkQty<71K2X%HWjsHT&q`F_G4#P2#~m`Srcb?H%fU593Dd8&=J z)S3W>CVpw|WN|XKs3aw5YkCklP1RH0XJY^!+4}^uV&mV}(~ZiJI9}7xW4PT>LM_iX z?#QVtni!<MNzq&E`+;9Sf5=tRpibHuO&8b|x_&!O|8wpq&kD8EAWn<U6p`gMXdf0C zc+=C>=7f!Fa5^ejW4g=3+>*f3uTJkSvU)Z@+WZ+S!hi4^)Miy5wZ&MaYCWrm>DdG6 zzxUL$6*C?qr0pcwwn9&f&P=4j+CYNL4t({|x8fqV=eeh1$3B}1e&7i!7_$<*igz;8 z11Epj-<;-kqmL(2)wG*u7QGc?{;B#;4buaE=(OiwBE6e#Z0VD9cQ2iVQ|xx<d3x+k z6NP;wmF8XZP!Q=JkD1YKo)j$whl90&L`7hx-01Z&*8+HM=8WB?9M40JY6G-yJRD5X zT2CfM1CaWm>hS~hc32RwZ<n*ok$=yLvqJu%6j4&h9gOD{v~hb~5OD64<>RCxo|hw4 zLHG|S47N(|VMWNc!t^LkET+!c*f)YqWW@m={_;Nad{}?_?cPB2fOe3d9JPtRkIXkA zvRiMa<Lxml5b|DH)fRR*+hV_0%@HuS4nb$((A{XZNf)8>_HIRg8fygDwB$UqSI4bG zNDIJZ$&RArKo$FQ%nscAz)6ow`+9cBs(o4b3Uq4C3-15}1x_pqm}u0ESEN=e%1Yj6 zm=}27gr{E+dEK?4j8WgC6H0{j9Mg8p$6Z>~RM<Ta-bx#^4KI;Rh3KAtJfNu_jiseY zC4PX#2aXQRSu6!$+U#!LYRBTVD6Kzjr8gbV#Q~pwySA+qSL{?=Wh$7gqLepo)1WPY z30;*ia|8Q-y@%N^G{}h?3d_vWjv+Xcd}xJiVZ<^jEC_hTkAwaY*%1|bSCu^wh< zWZBC|6AtY%M@kvsR7#$PL_tU>paQ@_Pkv-lA)a%F%9x^Ix;-`#$Yv_~DhqmmS%DWF zlifuG_MEQJtXl1Obb*GhShTW=j*-zQuZqB62*H8pe0#SM-1AN_RfM|oHfDlkJ`=4D zSEjPkA5Q0@fHRjrXO8B&`A)iu489Y-4fpg%%jtPzRg*Z=1KYHmXl4+wDStMk9fs|n z?U3Tkp9dwRLEJnN2Xmny-5C@mL#4<_)u4oH0K9nrOOF(Ge||JrAu9;BXZZ4l=f(?f zv6E)35LE9DRx+dSz<z)$hrF;#xZUihju(ZmD^&gjE(-X2vkhi{gqy>Ly-IjeXGE|E z_kVZ%>Mp5^TcBkZfEbYiIejH`)a;3@<eC7VnYlhC1-Uge_XKMo#x@Kz2Jr9F6_bS5 ztug9!=K34M9uW>4v8@^NvDw6XZ>v+3{Zn^|%eh9t4)NQJraVu8jR!=VvtLqM;^HA) z!u?zVaR0aanOlF{Vnq}apndZdw5vUv(#-b8>)EweeJ8Eq=I`u54gWUV+wJW8rrP#q z^PrpH_Gm`2qUzH&^V!XJGLG79oV5Fa5gP3V3k7a>%9bsn6JLP@H)lAKd&M2;E${<x zJ7VDe!td6zhEr?ir>8Il0xvN1&HZ}`ubbQ)I_G+n2}a>!zz>}H>e-hHzvrEq#?Cpw zA|PuC<~`18`|1(nCm$_^xG9I-j#j?1msu=4@bC}L%LuRgJdTC0<Tnd?F)?tjWj`1b zFQ(t#os7)mib{Dxr-UAI09zvAywY)IS>0V|c$V@AxnbSy?aAk=!+tZfXgAMj_nu1H z`JAEKFap)I(q5g_$Hwi<&pnHK%o3&hvKSSq!Mo@=y2=08bvYxmdaxAYmO`=JdLmUc z4(}tFU{N*3was;706%|k<7z3#%`$a_QZ!QK$`o&6FU<?w?Wy@@^~qgH5;D+D50qxe zYl#3^Bl<3|<G`QIt{}IdQ2cz|N&8964vg=8=uA<K+X$H71nN2}+UKh$clJe_-3~nB zD=A?pmFT^fiNVqX7!A)d&YQb_qZHvb6w=W~N;FecTQt5@{;8U|GackX3ji<swDl&T zcdr3EAj&00=>Q@nPGmQ<-3<HQa@FBdgqypNMz)-1Xj?5iu;`|}vqJ1PZ4vF~hL){O zTTa`*?YUBh|4>2Zz2$73z$2<YHz$=E5h}>c6#f#83S7U<$=is~ZbL2<BaMnn<mif7 z&i~lU6Z<_lem~)Nvq@=Dblbet`7uqj_`qAg{rDWA$K=j?ud*gxc9?^PgKmIBE+1p| z=eRiq85rx!j@j#RFLZnSc@f`T`{FsFoj|=K%iE<FKk1L3W09QIo7T1S8gu`??qK0} zGfWd5)4CiUP*L9IHda2c^)+9cLB(ybGRjXUQkplxyujz?-*btG?B9zigSQ=l9mdvP zx2JLSZn257d6oWEixq<?ZWy9|O2T1bdu^V;zfKLB2?RzO@3vo0F=O=d&d^BQI=gc$ z_cY)qm;Td1^oGiMFU|I#yu=ouAs`!}NgcTj-4Rv$&*gRkF1UHWZ=^goCFZq%U}iK^ z6@VpRc~1|^CvY*qgU?L`q!_o@%dS@a%U5<<Wz(3_m!upwUt&8deb6-b%utkT0=(?y zzHdtjp7$c45^8Z3z9dCaylRIO(*jpNG9)6jZb@TsQ-ECw>iY5n^Vzz9(Qgx@q?F-Q zs(0(c%un~2QTjHY{0{S5Gu>f;ca1#T++g9B+A<~uf0&;fwT-D$X$#{H-F*x6q@Oej zN9h?;TAk-aitWAz+_tkxcN9A*%JS$|mzz!;81I0`{C4hn(g?n6RNw9&P;;KDOs4Qo zrOJQaT`48_j|NClxi#D*R{(hYA-Q$K68i1kieRf8%w*%!;&PX7UnU3s^=Y#mM0Pjp z0l5_k*uw^PAwm7Xw@Z&Q*5h+9rKKgavJ_%!;2v*()<R@=R}2i3GH{%7RUTprlLH?) zFLa2Iy9F_9l6tk4PVm9x_5Pm~%n!W$mY>Zfe*@{aTdP8N^jdp{Z%@AW82D3Xf70hU z1>Ce7ugp{_?LbPjD)7m(dYvfz#ZJ;o0IYheSyoy~9N-3Ceo@5i{c+Pg4=NSvuu_1Q zo9Q+ZJviFFf9Eydn8`sSERuAi)MERZw^p<rFKTgXR8b4&1@@+t$*dS)Y1g03W{#uj zw|A2<aVZHca@#JZ^Gk=HEpoeg0XB9$SOxN|eI|<zd~MXKuoU1nQ%xrmi3(~*x*|VC zr%H1_l=3gyQ`-&j>hR*Al;Ji`nO#OHcm(rHAN#XC&Mv21b%hk+7FTU`#mdY;#<048 zPaW~H2~XUrQjjvX{j!~?pV0J#&!j4Du}PkXC|q{4>+$o+XCEYmxOr&q%IFUEM0OD? z3D`e;^FBiEX0+D07^XBSJrqV~zqF%(D&UBKr7wJTpA_Kch^zvzWjrx6EqNh()p_>8 z&zQ)~EpDh|O}VpWFcydp{A=&c=4_eUT$7E+$~sjtFYvc7A1@cR_;o|sa&bdpW(J;r z`#%>5vs<vw600#+IfgXT0xx*)F0(<?P0v<znI9k9`nYoTT(e8lZB7R>k&)cmC78Rk zH^Q|5_Pp^1v!LNCj#W`UZL8y34Yj?)u3<31_BU>8HpjYGgagfJSj~UynEf;^23Xd0 z*+tUIZp|TsBx-`t!7LNnj%~_~V}25PH=iT)GzQq);Ox}U(0{IdOUTj3ybr->YneBy z0_Z{VTDs_4S?d&55AgN{ub8=z+fd2Ys#1%TfT}a4v&Z{4gWG*A)o_bbY?G}H)|llb zJNVpd^K7&A$SuG!Lkn()qMh7IId&)L*T2j(?s!s`oBpM*si>JEXzFw1nCSv4wNKY< z&<${F0QVVEe7$I@F(W>m0@EA+2C9vJs$x}5b>9PC)a5DDyNjJG#(fXxzW5p~SPuF% z@c4EClcjO9C>_>e1?5<}f-jQF&q91diySBexZ#IYZ-}1U<hOimy0*GJp_4Us+`Igu zlADCvU!$W-{Fg@miWLSNwL|}Vq(HaISmBqIj<7vQmmM!N+;F<yE!cDp)P{!7+{|nh z%MQHjwR4gpyIW&($OY%hcfawqj>=eV558edc$$>q7CY8chJDFyj4J}{xn!J~V)|P( z)7Gn`zm183tCsb8M5K2cAnJr&q$x$-vx)8pz|rp?Z8nh<Q(@kl*HVquj|Z^ez>RM- zZ!dzonU0y#P)9~uQ5~*OvY)<_mL0fsU6r{#!A*8+<gxm2gk=Y|9RBV5BD>p&LqkDz zBCb{r@{aXHx7CsZubOymiLkpFq&=R=TD>)_1-J^pPMc@dN+JH^78-+cX+Aq{nf?0w zi-q281D+jPp!XuoP^UF;gCAY*q#D|Gs84(mHW?PTnuxk+*D<1{+`eGDCLQ{xK9`yt zNs9B{2ZWwHoD%v>?peTpz3^bEunzXcn!jsB6<{Z!e>vvO5mG>jQvnh<Liv{4&kza5 zN8qv}N1DLVjocbi?8K0*@Fv-X3q*1^#~_k({>FNc<P{bkxc3V^%{~%0el#crCv=e% z&9Z4dH@CaHg83Cb`+iH2-<NVQBHGHKfJA8?c<b|9%v!yh@O9k1H66Z``GIYx{pU*& zz90SeZtbG{+^lsz^8)`_{&gSWbyJG;qB`>!Od4U1!1R!j(}f(ry$j7P3R5>5(j~bu zmrDSibxEHUQi9v?%>yB(0Ex7AUZ_7r2cA0R#n*(m(E*M%(%J#edEay~>!)tIw==Eu zei?0BQ+`HSIaL7oVAr(Ky&Jiudpe636t$ni+5!H0?-X;A$IaSJc!{Q!rDY}jiOdh2 zJL10GMf>gxr{oG$t}2kXVM=Er>;dZFPR-0T&#h0f@mSBDUck}=Q`5iORit;b9cz}7 zDV$qJxeQ>tcXmBf%5X~&SY;HZRm->t;Ct;BUn)ho4TYwW;W6`5T2r_H;1!RqHzT-P z9oR(e_#n55$2O$L=d?4Uty`{-)s*v^53uCGKbu}*=Amx(UuVms<?YX9e&EcG|Ew3) zyG3ca7~Gs_3rDn*%boPNn2Q1~dTQlzDay@HSmC%mD%$FQ;?9H3z6yUa8o3GO9qfF6 z@u2%#iO6nF-xy}l>~FFYRzFO>piGF}bRmObo!HFY;Bd#v)n*;p-P(~<qLJ3}X#B2i zIkzS7jOnRgMSeH8X-x}dRvx3EJ}dV;R&y!9Gv8g_MoJk;zuiW4$&LkQ(4iDu{+4$- z)%HJ!z7`oE<@l}*J+((qY1anwYJ<re272Hg#iyD~iSHOibY|{XxP?nlSatmGQV)Nf zKwj`Uo>_slw;g46*Sn{yFhr{T`?;<4G|mSi)TgnBP4av5xIp0l%{|gAK)CrNbPh>M zV??NT=4j86_ULz|IR@+IUZo$RnEb7s2%^#Ezy&QfpC&EhHbC>h!@8@huA8_F;90*d zI9$qb^Ci{*ZTnTbYmE5#$t^<e<^i)bS?Ajv=pV|p9`oC_N;AMgZ|-OY9=DK)H3J98 zk9*m@Y=@Uhnu@^VNIUL611;L{#SP!E_JNb9#P*c(20E2zhKM?@98$x6fV&j+J6+h_ ze1=TMKo0xF&STM+Jy<N9_QcOpf?E&Zi9AoW?REJot^sh@3wPh_k6)x#sj_iYg-LQP zOY{A;hJZ_sztZgIcZ(fu4K;8Qw%48Aj8k=Mg8VL=?<DLfWA+Zen;9U|ApT4?-O%L- zUvY~7e?R7$E2Tx;M%6kYB}}W1;_OM!&et6}MantaSG7<8?ebH;qbt_{_~)d5dJ3~! ztj#wJ1k<5tRMD<tT43wLhOH7>H(w`%0mV(^JruEhydrw%%l(DeeH4&5CKjP*SZNnn zZjsW~_A6!go9pL`sWNUx#0zfLl@yP#Vt~`ro!5%|Zu;hEFE_V2f@y)t<&Vu5+C~{7 z50dm~8a;_wxX60yq8?^yHh{`?Qw`KFgS={4d&79U^u-TI70}||smm!SnkF|!C>J*n z|4rVKz{vL6&jFLIjyGAB#+EcDn98K{N-Ex7mjpcR=4x}d0OG&K)TxYazZe)yN5X}b zJ9ArIB(UO|cK;SNHnzx8I^Z-WK|Qjt$j7KQ7+HY>=705v6xrKrEz3i+3A3uGJS4Ak z+M&|tXSP}@jD4ILLlJ%t&K~}6`t>5SLgp@{yi|;!9n}WT`r+57MaaI+LZ+!R=>By$ za{|x4uAd2kJUe<;<-pJ=X!KaM9Iv`p?`B$B;6sm}e7Q*LUVnL1-EO3c{?|V!jPCWP zOaA!599yRgF8bbF-R91jdl>vW)+unWr3;scoIZ?+a?MJac9@ZQ^DUFi@S#k8Y}8if z;kTYMMudbz_v9(;J|r)gUd%NI{t)WZ*FP!QypSS!39|<txM_fyBe~aIo)fq0o|-yn zorvkqDD&(L%Lsh&?$^x1j(d}*r}Hs71o5agaDD$5M~RT0M?Tta9>Eh`MRc)!MIun1 z#W5FUO=maJ)WF_5riKZ%XQR)jR-8v~r#XQw9-6naaC#2F@;P%aj^4<^0w0+%>zc+A zC+OuHCGpNo4D5I4w#$Ur^X#vV#0V}bVnN=pdjPWoyPVy-qp+hnJ@qfcUX25%bY`4x zRHZ4PJTGZ43pKrUPB-EA?6?iTHjhwD7PXeL;Q>Ec`o8JJo+HL&I1xyM%R@zD!il2M z^be)(fgC3Q@7izbB_gnAb<;yxGtyPnMPmuaQYs=sFCSFPQ<F&dp|=2s{}$*X?4DB+ z!cHY%0fOG$P*TU47uaHWhwp{An0|X|Mw?f^?}&}AihBfe13x%qdNbknC384pWJZ^R zE`UdlS#yT)dhUw0%vd59fidR+G4O~B7Me+xFM+r6*yX_XgN-7535?062y7>mRzJ8T z+bB&WvpM1ktO?*#PrS3g5F?E8WEOOHNH|el1W>ksXc?*n_UiD!JR$U){$;{gsFG?= z$9)wm96DHmzg@Jg36wo|Wo9Lv;$JjpRkZdVkCmsEnLQYu$4{nB0~O<6EGY1?-ZlNC z`kpO-88rmTYw4aDMLda#f#c2{vyBjY9_pBwuIe+w+MFL>ymqp1dUm}z&N_-kYoon@ z^UvG0QkY%ai`77rC#3|t8=SZ9gbhOLd5;wfT&9gy!(g1sSM;`zZ2j5H6NKJ#&Oe`i zU@AeE&2b^|N_vSkSJb(zAmBGk-ik_5o(GZqqI4m+(OFewJ;yM>1Lj9g7IxQ$)wD%} zmGFug8B{bZ@QdyDI#ih9NnQK}Gnb}nlbOWWU`50#Bgka{KWqK@04c+BHZ@;2nz?8! z9(&Z@WOoi}fX^+P_L&smIh$H<0i!ZKjyU45K1xk^rw3{R?!Vhwv(}G*-G`dE3S&Z* zqvQ0<{PZ3@`%X;9%2K_1snY)8hy-}%DX|VxpW_-;+QdY<Dw<04JiIqOo{_@;tHKUs z+X6O;w=jhb^;eiSg#63hW)Ky$2iz^V&V=ATjchnYoGBVh)bq8pBC4tZV?r6gTOW9I zxaiFDw2^H9SD)gaiu5fe1%~h6GFM3920b-99)v8ye_**=ZqG(DLR8?#^V^!k_J=vM zDj^SL+XO!P+g-<ske+Lv6OtnCpgvA8j%5UPxh=X}NIefvInt`?pboSn%n7_<(syQF z<AW0~qN&RN$(+DdH;gfJf>QeJy@je(6Cpq=r-bsfKw55$wF8Qp?JoaMW7IG$T%km+ zVUdB)HT(1GMsQ-Pq&S<i4FJde=UJ1A=;f{k#fR__CJMZ&)s*c;MjwWsET@Y1RICA( z5;*9^A71yzsv9eJgtHUN3Y@XuQnNF~hy4d*m3$$$oqjvxhG)&jQqOT;zWwL21{szX zSiS4Q8$<`5vnM&?Y!WMsIqEB!8hHC}Cz(xkZjCmKycOO4hE02_(d;*Jce?F4V+wt# z6z@Gub+Aw(shu@?C(H}@&?i%O5hZwzXL3q_cM0U$Z4xsBKO8mwJ7F%N-;UC<dU0?l zsIP>a!{or<k6$=R$UO&nO6;7oQA#lzZ6G3)0^I$u_+G;9W*M5DE;*`<!~^M`(^MPU zIhhY`T>qp{yIF=3S8GMF-pc|5!+qPC6t(9*f_zMMZF+i4C1gh7Uy69+4q6kyML+y{ zy@=bJ3i8y5mDR~2`hU7Dn6DIrFMw`=_YM5UbPdnbVquI&DwT+^eh>ne-1U<=P2fx@ zsb4#h{#HrU_yy11OeCBd3?<6-+OwTbe(c93Q$>%?Ldt5?e6BU{x1;wnJDZ#dCBU+4 z9jboCY|?cn4C{!^CTzd`dNW@yCW)O)CrK|Z(erA7G{tQ^&9J>zWbmQgMV+1}!O}$2 zQnb+o_j4#y8qZ1v?tkt<Px+>$7vVD4B&b6I_)=IXaIagwSuM2Aod_!)N>F<`J*#Zx zdSUeJMWp`8L^3ygBS!~0f&JHhWI`8bIZaGxw^OI5Rvja9dJcv}PEI2rT>uGz$M$M# z4uV5sH=9Z&$^*F;vK#)*&zG6>gmcZ!(v0oqdM+JyhSc2IiG*UQa*nX=_PJ%>uI~w_ za~BQqlA*26rmvl8PAWSS)^PjSeZKkHi>pOK&jFycH|~IzYGZDSMh6B*-#$@DosGRb z8c$S5d0J(g=9X((KH-}+7NPMy%#LXs%L;t_u3O9u(DNdnD1esV<2_VgN9qLC2X5bc z!LK5yb0f(f0i+W^2;BREGfj%#-Pog*dYQ}~g6DrY=PnV^xrJzSi_}P@V0X$T=e%sj zOkcX}UZBfi?b}WeL7jUgz4$42nV!Mw1ZJ*jw?#NT2aD3=GR{#u@py!27A*z*W%%@0 zgxa|~RRybQH@Tig*c0jQhrDy3kUHB_WvFnVf3o+U#-5y|g!7~&AJtNJN4jG2K39m8 z&Ml>Ois_o4!0H4}Zt<$QfytSZ%rr1vhYS}pC$P;$Elt+eS)0Lfy&7TnrH>XRS4hP@ zhw@@hI*Ug8*&@1`>`Bf3m-aO?J?CzpN+h&CZ5KM^@<+_9!&#p+v7;oSYWGpBPvAMD zyPDwJS)X(~NfFxm9Q*8BW(%L^32q&Il3Mv#y1gFva@RMula_M!Ps*H>urs;#z-`ye zG<S?UcO|rubfw8m3QWHpnIdxfwI~{wwW*>_;GTes=igyW)w!)=A>CGX_;Br{$IXTa zXF}NyW)m(P^1~3Ry1Ru&OgLh5w(RnV*~jC|N&ZtZJ9bv!)W-&x`HU}9(vHbCrT^#c zJ)op4miJ-79Jz{m#e@kJ5tkeUafuQn3y6eqc6N4m*x8w70xU^E1ymFTMN~jRMNC)3 zfMAZ8a}F01W(6@LhOeIPs+wNF|DArv-*?WHhq>qQbiLKp)z#J2-SK35-Rfyhot1Z} zd`jN|#x6V7u{{mk>zU{DeopUirtL-<=?D&BJ;43WIpeCpeG{X@)?5(fe)NbNhhHz8 z{szP)aBgRxJ>Xf*Gr{%crA1TZf<HnToJ*r6$2iIqm-E*1p0uq59RTb8(Njw+^Ipg1 z=;??_wu;|Uc3-*gc4b^c#=N^LM;on)+AV{P++DzXdcUhNUfzB*$4O_AC{-Gb^P?P( zF*ERz6Q`6(r{(RRa?JL&X1b-sSnZok47_G^^kX5;J2G>K>B$?4cJ;>c)jS}8U+j4D z4598qO?lcyn%<75MTy&g^Ozl2erCBY!~+OUdFe16iO0L0Mkn_%HSp&X>gWb-0A-tU zFiQAtJ#qgsYRu81kpMEslL<P_7p6x>Z9l%s{RphPWZ`0=4lqip>9m(5k-lVF;AM|} zqMLttuUc~Efs1~4k$ye10=JvozpDrvfR!%spjX~aw|&E`z{CzaOcvGvqc5GIqnPPT zEMh0|N;U}K<z*wZ20MUq;Va~c%C}iy;J(j>q9U-L8v3I|kglH-HB>Px@cnt6N`%!< z4ThCARw(nQhf>EfGw}Uk8!Lr5fEp;xKy}G>xUFGYVEdu7ZV}o5qr&>OTv`6ROby(% z<Skvx7SnG}7gQFd>!#i3V|%bs0M8rwWQB+wz)M)M$>ke6exHQ~K0K{j7t2A2jnFAR zGv?actp_#UC=%x#Ip+qmIp=1iUCq)0FPrqKmedF7JtJ*6l?vN^x8Io>*y!yyM~b{1 z>9=R^Q3ltTvJtt0dk(l@@YR|$3BZfjCrZK*yKl9O<pr+mcc|vD0|Y|WBFGa*Vre-O zelUv-{A|EdO>G9yG;;5Bs8@Z)VN4CIx~-2Ehv!{-ma`02GzpDM4C&%!+@3Hto1|yo zjq=m1B;a-fV%5^A0i1~2r)B&Fz{kJ6_eP=3yH4Ew0z`>hM4@gmz;2rd>JGb~S4AVC za5j^4Cc_ez960ybUiXOP0lJk+LQvR_a|%Y+n_1VufersUK&S%@_*`B45+((nerCVJ zgcRl1o}+SWTQP=WWFN-O0MGri^E=W^0EM%Ar3=ao^IB#GZa#2ljr{$lUDK6jy<%g8 zncR)Q+4tP@i^v<mYtspcWVOz^+c7b4R&{et!UtA_o_%l?ap>^+S_K+}*|=_6xmv^P z!!iReXuU{-^SlcX-O(s9i1?FqMKT*NwLZmk=t%BR;H<F+YF%yse~x7rO_#Py?_gfw zfPKz>TDmmA$iy}p)&A+)s5L7HczF2dyM#J`4N_ex-Kk>~@em6PT=IEb%isbCT$YN` zb$+=SVii*ZSJ%AJO#}|0V-q{jZ3#x?hnW}HKekTy=mXfGl~xy9ZjssQ_|l0Yaex`2 zI+ct>OR0X>U4V9_d<60mz*p{y+#&n{Bv*cGcQG~&VEZ>u(WAh5XQ6YWr__$e-I)<M z`_uXwVz(o$=jF3$L6j&Br%H>;==g?}ays`M@R-;4Ov(4>Z4t_8j>CttDZ5Bs#Js?p z(%&}`-n^qI<*mq6#U*n<2c5R|)2ntE_NLJ1?WdK#G?BKC^w`rJ7qZ;IM!)Q}L5Th3 z2C;b(g$7_GnX+-yG^Pj6+NF+v+FRw$R_YyGSb)QZf!&@s?*Wk++sJ-)Ve8J!%>a=K zdW|Yqlp5nUfEPYf+*sNu4$=l)=T5g9RM8PW<2?{_Kz?B6;(y;O+<A|2RSL^rlBGfy zx@9A3Z`r8B;|AE~>lu0kIqxx^<F81LcXLcBmK->4*~M){avZ$#(>zTq<#bao#eE^V zmX8AaXhN3^ZVmGnA4IfZsk3)0W>rQPhnJP%NkXH1hzjKcKRl_f4%EEoFjY=GVy@^n ztSEZ{EAXIQkJnsFG5z*a40S0zF7tQhGV#_yb42NFy}8L9+JlY9(?5l{z<Jlab+b_V zD*>w|`p+oA9W(uJp7<YO%{z6fs-+OSELLv(6bd2@ySuwxfA&!AIP53-sTeir@UkI$ z6^^;T%qH<oL+A7G0bcP|>|gR3{=SwJlS#&P(;poMtpgvr`pW%<IPXA5^<(YY&g(|z zaZC-Y)2NPisK4r~!|C*Ra^E4kh9y?E^_aQwo4fR`Re#l!MySx&9%!b;JWfs9MT4E@ zc4O58Up}Vd3DHpAOFz|68Om(zS%8aKH^9tIBX$>3|0&;|nwAV8*8b>DV7$!{eTBCd z{q{4+P-sBU0ij+AT)Y{NQn`88IQ4?**wNew@YGY<^^`{ZeYv$6I-XQ!XCcI85Ffa* z*<hU|{AYd|PZSGgk|h&pAwmyw7{Mb<5B#G3E*FU4{*#<qB*v{~30(d??z#Qn!k_no zUQH#Nz=g|cI`2extkJ=gvTP!kJ$6f~F4<?2t_h3jv-~>Q>YsKg;$hygaf|dOU(+@s zpAe`A_?f#*D4XUUa69<+LEq^#8pz2<($#j$rjq*=_{F-jwA98w_^Pg`rtXZ<dmdq0 zEYk~3w0&xg9umSdfy4HFN4FUK{f+i)x+0sQC(r0v9k+L1<c5H~&$+*k^nkzHbRvzc zgc@bc4t%riG)*%5_b-)rRZ^Uk!7WzRVm{rO9@wSkTzyTaGyV26%?RB}Mo%!()0A}c zflW8L-Tc~9`)iRw(77s`h>hiQ>F&<^<d(g)s?6Um%g7@{(&LQ3d7QNYeDK)C$4FQD z3q07&QC&<-ZK(I)SqXSVtgTLe{<9KIe{_AkAsx>00_S|%Ulr^h)s@M~0e9H^I%=x! zl=xHX;mjT^CGgrqR-PwX^`ARSlUb^gkP;C$3NK%Btfub$RZ6jPMbxfko3gOLiyoUd zM1=J>EJ}RQbt`rvdzx8+^N*ONg})efe#5LPIW8K?R>za!Qg(O765J_fNS&ElXo$GN zuK|<pjwfx7%3VeETKBK1qKyFA6KvTVQAe>ZfWKAtzg#%|U5?G3!2Rp_$|Xz=JmB2j z)a(1}0rD#CrA!NabzMEJJM=eU>*K=-8x#*?USPw=-_zWpzr!J~U?SphjH`SQL1O*` z#!hVcoT%A9vP@<(xVeOGs-mpS_!M1LsMn+P<3@m^F8`{PG~%xpx}<?#I?3=OZ$p?D z_{`-iwi90eQAk;Vl$4B5W>(<pduM4WQ2=XBPe|CpC)Wix+3r@Ip99C%@fb&T8I~5< z@Zhi3iw^u}e!7jvEQ2#qI%-!Mvo6Vv?ABjCaIDb#cU`v_CF?SBkJ2WZ;9z&a%q8RX z3Jm|1uN^A7aWIqh0o-k$+qAmFUtkRDa=LBL-i+ri!Dh7DUdOh-p6%Kq63>=K@o0}t zIiR=@`T$m}dovtd&luvgL~7pBxKX$NzPMvS2jTTkqivZiM(Rk`r$4gvz(<xgxl&p= zm45rpD<r+UYKN}Ke}}7VB;zIpZ^*3JEbaJrF1aXrm{_d*OqL&b)p;lB3esPG_JXw4 zLXtav(8}-j#`g1e(n$^fzn`9D>V*S=-2gxS?<v2DM*IV@bZi?LyX8MMIYB7>eN{G7 z){buOS2KYJg|NWTfw`Mw{0BYR1?4R=a&@DdWW4N$`LBt{{xKfepDaJeu(ZIvzN*ov z#(()~T@=N6xNevZp;E>rY3GH3+y?NmyJns$g8R=kRHDiK=f<YLFYK@95dF0bSK_RD z=CiQC15a$bs|Z_6zx}M2M|nCLCv_M<)t~1B;7gBQ@L%B$pa?Z&R}pJ|xofR(`ujeX zSC{zXQ{ielX=Nn8fVBd=XVKZ+r4|3+j8tv*D)hRN^O+j>%*Pk#-0mOWl$m9QO;Wn+ z?MH`P+)xDeA1qY3L`H42P{g7Fzq@O+){OXjP}Vi8IFw77nReV&;(lv(o*=^eJ10!< zv>Qa(IP05T=QR4J+jUdfe{R98?xwQKNZf)o1FYHQ2VK|td+4%g()OUcj63P~s`;V> z|6EdOv?N;|nn-KqP-&JA^kR6xO9M+=zo3($zd={f;)q;cC{9W?y6DW*z^ls-d{P7t zY$ddNW1b_+W%o@x?!~iz_IYVHX~*AnYeqOhN8r*lqw6LSrUj@8*tX82{iO|mOGJ=U zf}$GsC<~YwSih*gPQd<Y0P(YQ36cq<IH<pv8vvf(V8UJ^y1z+M0jAA~xslE0E9b<8 z(tq^W$+DW$0PfOp&7`w*&ha-!8kJ^MiW4-(NZeh%>#yBO_Yi}4*Q_Q7&*q5?SZ8$c z5uyl;CcjCt_P({bomVT<T-oO~pY)=%;%|IhjIhm@8Xs>uW|J`c`xZ7nSa+P(?MCO5 z+46wb-}vaV;Oy2+=!_nnLy(hO*D*UV@q1hsQT}Ni61Y<Le_Y#Mb@hKQ7NPy4cFD-X z7{tY{`D(|Vgt3_Ze?KF!YRD#Xn{DuM;0Bi5Gy6>8_MhG<*-2|W({C6PAO&_lZKt}y zNh1|{^w&*Yy!7Rzp9`t~08E54Y6MeQRN!$(F4GzYOqzbWrN;~6W{=D4<b;f>jW*n< zy~+OfjSnt3IVG5yVQs~N120>A-G0LApJAvn_f?x@PBtwM<zY7zT?p)cTfYZ|-rqx~ zE5gllxzy8`7g*YTm^wWF$s|mXyU~QZoNKcAp!OoFzhNNjOAcr&8{T`)4)cW7e_&9i zOxE9v`0Ih27k^tLr2gxcT+!Kb<^&G8@V5dIkdX?>aI|Dj;H0{P28x{iDkZm0DH)rj zpUAAh=qDc^F0B44rB0&i4AW0HGAVHC)%A1+3Sg*|B}nQMB(s?pIRCI-B_eDw{q}PV zBrL^h<4PvznPGQL)#J-y-wQY9X+Q3YOr|<yc1h`FNP54CGD+3RL^>McVA`n2jfy(& zb>u2(uCI4<JV{F&jmg@rlBpp=I1S*3_n)^!8uIUpGDOmuid5EoKp*A>UVPj6=Ljzr z27dbDtTlGJ!sG0AR5_CaC%s)dPRNVB$u;`dsK0`_f!DpzYPfLwD}-FX-KaDQ!F~%A z4gB%)rJo3|e~clQrz1iJBk<1|e`>DOKXNXi2br*IL}glbgt{(&_~9A7vmwy1k0$I2 zVjRm0{AlcUnnU&{%_ekCjWH?k+=ma*6AJ#_Rr|tw*PW)e-=G_*{_d2_K=%(Z^P|gv zn|jyNmG?>X+jCS@L@9RBbN2`#Knz@R$*`-$y8LIUNQLBF-68zu-m?xC&HzI=TY^c& ztyj981qO~7v1}h9_mAYsqg72P=Z8O!V_IOHgT8GYoEBq3uljUD?or{r-x6B?p+*<V z(LG?s|JzWgF-r_Q;^vbzyXc<_FlDGz7aq$@aJOy_<@G9X(A4RZMD~9qCF5+}{KOvu z{HgtR9i<(A9g(fXs?#(%R&Wg$JOr#8`0v#ZR|&QMu%Y)nXwc}a4jq6PIHz)?p1tv3 zO4wyuZU;aMx7@&C{p8;kitGi?<j9DXM$5u->U|i03-Ig*x@p$e-;g+DK&U{T3ws)7 z27^+dEMTkS_t15xzdwjlnO=32x;GvVr|gstM+I`=@;zt0FKR+M*v~W4^RwgWoDOAZ zsTeyF!Wz$rk4OzI02ll<?^kKT--wLIp<4p^^uD{8S$*$OdJNuwsvyOuX!&f!{e#5? zUbXA?8sqrSmUbs}s~}`Sm)9;89r%k{8ZB>;;zfeHHPCgRv+fmEf5RZnO7*XtRSmHo zfMfT)Mx%ya^xMxc*sQHd(`01pbd6qya3jE`i66F?FYup@#-*K&7<WZ}a^$ryh1Nfb zM~bOPrZYMrjbMR+%^Tl3TbTXB9tuyAC1Yfl&fUxS^@roe2(Q0^pb}TsrYl)m;Lj^h zTo;@*`#0xg7H!^BU55V%p|U0kQr(&Ui6+yAim3j{4!z{n^$+tF&$(JC{S(G)!SMXH z{>piZuatERtn=Kydic)YgegS9^3;YWjhGhLcjYUuitqspqJrKH<jnjOW(7WbS>!BX z4bXL{uC$wGNMOUk19$%Z*aAYzaqey^Ru-TI&Ti28nc%WkMCpxRyB2cmmV2L6w^wjd z6zT95dsCJa_~`6I^i-37e$gCIc9ImvNxJmuv0t<knFE+YCPn9s?6mA=${+r=nI`T0 zSxb`1xYPtUV^si;e5tcKbbnRQXu$4fsDj*CTtXqlRImwPx6}5}^3s#&x8J0MgU_UB zc{0(>`z%@WmL8<>AH^m}souu2=-&O41=MGf?};Rnl`*^9^DyfH*zc?rx}H7RTMssV zPSY+Gmp!_bV2>|)R9ABTc0tzzq~y4)8)m-MFZHq5u)pK6**Y^Ys#y!bwxh3mBseKK zc(LH-ObWdB@@YE@ssD<e-YDkld6qCIuyNC)*9)ir*HhGx;2FYo3x^(gkZuq7M}L$* zqy$v0^kjdQ7&ztOuS-SZV*2ej&`7mddD9+oj4Lu-&$H&u-nzf<KQHqhowNGO6@Vr9 z3xIo{bN_Pr0=N#pFW^?p3FK_90e61t()(&HjSJw5%BX6sQlGW`m?Z~J8nIZ{HN^oX zr@0U1ac0Q43C71BXxvP+(#D&+s<gFX97O*TE*W^|pNks{qyKoxR)y1c!_JL{kAD4- zzQXBm+VpA&3=oGh<zm5$SYY70FJF0zko)`2bgU{y3+a$P0W_Yefj92FKvOaPs{<06 zwqE5W0C(D}n0M;=BC`MNL_R63cf7i4{(N%_O=SDil3OyP#8`yuL7)BZvjrlpe<)uj zDN#&5Ffw4nvyW&hlmYq-5222Crqail8o2LKZ=WmFSdjSn3F<RcSo1{=xXY6Kp3%t9 z+y-#d*z+`xRve^_SarnB(YdNw-Y;~z$nQV?aG8(YhQR(P)D3LjX{6>x1FfG!kutn! zYqKlv%DnUauY4oY`ZJTsA;qLcN3&RF;Isq&bF47?&nouHIJ`fSFt=>Eh1Rb8&E_Ah zwT$@x{j7zyefWk;lQGNMT%S9sC$4{6>+AeI2<eAX0py;H1-e7M#k6<T0t5JcE+xRw zgN*=xe)iYbMc@7@Tpl-=18IRx+5b|$%j;5Z0(ke+<$p*M{{D#uW?WB%AnJnTz@lTe z*F~`Zh@o1A=Jx4|TK#tQr@C0}LT&ij1(FP=g4W3~oWl|WpWo15k2nYLsPfE+8@=qY zYA;Q5`VW_MxH?9`9leG<o`xhH2TzA^Ji(ZqyYDu1{>!tZ2mQ^N?r3t(JHTwwg}_-8 zFDPIgNXMJpTIF#}3@mQEw1Ws7%r@)+C)YOKJF~rJi2S4fc%-5{Wl7y~?Qn;$J`zED zk>Gv?w^b0G3vsJh8^FGe$7?yXfA^K)rfWU4H;Q?It2P#|65;*5s1<(8&>S@cFc0AT z^KZRS_yZWXoztaezE<+u9hH5K`qwVfivOrY-Ip0JZg~E{pL;wel>TdqoMH^IYcAJy zUA{<&{qr(ht`N#*o$=_VPo`e<oVrwOW&2s9UEb?1ftlm=n%m*ruLl1;_GtME|IMl` zofdgrqo*jh0PHtz+6ZX@AL#cXwP!Wj(x&R@P{cg@ZCZMnTLMmgX^bx4i@jT-Oc^De z+$drMa|2(SHca*8Z$?CndjzEP1=AS@7VzNsK3WG{OuzlqW9^gHWpp36U7EU!oTnp~ z={9Eo*NZJkqvQcBFYwakzb=*T^mkxZ-m0+mzGpBmuutUo0=7V?%8HH!8)1`73T*r8 z0==^e5x$>tY5zxetT4jSWx&J7{Q0t|z<=q)c19OKL~RQBSf&O}IDTPWp)RK1egZ3X zqMVaNMa&J{u<Kjuu>74X6*XA>4r5B-6{{C%n%-Z(G`3?>aqgNzm%*K15heJWZG<lB zvztHeDkJ^ck2<sXOG;bCEojTw*q5u)MWy|95#5vY;n!U}cquhc_x~Y+icryxX~Wg= zqgM<(RJ7smd2Ac>(7IhhyRQGsL`PjX`kOJiG&&7PC%#JgvUfxw7$LyV#&*zKT>Rs+ zGP65q6fu@bfp^T__a{+A0JBI%TDCBpP$C2cK3!Z-&BA{Y&)wVsQ%+d>xS#2Pdpx)* zBO?0`IZY(|hbe)_9x|@5qE4~}y8FUtq8al7@3^>gN<{Uq3a%9h&{L7o6rKu?WKvY* zM}xvnBW{_(j%VI_i!|py9&rT(xn}bbefcARohHpXN?1G4Z@=+q_MEc3=Y)R_D*;~G z>XhAu7IU^Atqegbc+^`U+(2^4<yF56yT2+RbWO^pCl<2I!2g`}`3J)4FSEI2%UmIy zyJX9Cr^hcm?NMR(S2T?lx*nZxbDzmV0~c+Wra^Bp{q|F|y>c%^6;xFmxLm^Azym&Q zrPH5(2Hb3PQY~3kj1tOr^teIpOWFRa5C4HqQ<e>g+-kc|o@}V4Nd7*QHr3^96rwa( zGH{pI_ir!#=5K41lSpKF<J<KetGl<mQCR&~&b32)vS-?xW7|lw=)fHh8>pv3{M~<8 zo#}Gs1l}=Z;o%~<zfDxc$}8gZpUpHGXLLG~10U~s;sZkNZxeXo!%(_On(0Gk4iL%! zI*26s0@<c4CUCC}EwyR^CgL~dOqRDQnh9?u>m}C@-BV=sw_i#c%T_Xy+OS{X$HRZP zTS(#X{e)#pa}SfaC8!~82zb$3x4kV5`FGx!B&T=Fm=bu&7vTc7_0oC~-RH~+9Cuhh z-IDbWK%H}V)zNSzoh6jRco@adIk55iKaUetoPstfwVX^9(VdmJHx$^kUDI@iwg`*t zpJci8H@<IPMt8OvWy^G&P<Hc&aTCCrU2l6rn(&{jc-dpRHNm$fxGB@!syhu5cK_TM zC)DAWups6gh8mV0c+dy?y&?SmqcR<jMz_vzzS}Z#s&M+tOt1LSTYmOzXt+f7qu}At zslY{>S5Fguco@G<r8vfncXwz`TJip3Ve}6PkgL~wMKCi#P~g%hH*OSKe;17?1En6x zoR%jrIq;K9n(1=ee>y~|ft<7agIR$`uT2$@b}7@eO9^uVE86~WrKrJwu||8fwKM;4 z$j~tG`A2@;NvH#lZ!Sy5wKKfbyp5XxF7Gh^KhlK1p3Tj;oLPL7S%Ek1v%k)U_z*uE zreH=2eBIMh8*jN#SDF3;L(1RX=;+nGTP5V<1BjW($fc%kBrxjbu;!ow<ZW#}9zKn8 z@^;@8QwYog`0ITeH8%3!SGJ3uEVdMkr*Lg~!Ou_Y-kZO-$6d*|*qIM^81_HvSh;~E zUlv!2y8UNvTvKHzk7rc?@2mgX3qpzfs-K}bThzuE^E+xMa09@$cigj58t^v}Di4%^ z+0B<MnS0O<Lh2vb!68@aBF$Y5-!k}|hlJN(Sc(Uvir5`?cU<<JY9Oe!RYg<$YB|Ib z_co`&16p_IA0llLGSXudvix&ZJ?P=q8es%d2{mJ^u7U*zHu$>ZFQR9ELq`7@%6Uu) zy!y&FbmaMKIg-rMRlpH_iDx1+1KTc4Och~U({H~aQff2dZnrfZa@GtXEcPZOeWLJ- z@~Kk%<wmrfLuVf&-2S18DR-8s!(B6Uo6viv(E7)LxlL(z3+MNF$7%J7e~)34fv#T3 z(2Ih`7M77BF)o06-*~5<v+eAy;8K1&$$8+YK09Gxc*K|OL>2xTrlQE)p<^T?Av5r* zqi=anX#HJURV+dmk4oOj%`NPmd_vd2{vnW^>&A!Um9*iC*W6;`?9ki9q62@7?9@U; z_s=w&IM&3lbm3ekW`~QL$gWuQvDTLbh_KQj96vBN;)X6$|JtN`5B@^u@*^}HB|W~D zbpkx6vP4&}#q`_HX;AcnLuK^ThRl923787--jnO}6Mg$zAkEoW!P*QA>K#A}ti1R5 z`-Rqjj8|2P-&nw$z>O>G=ot66KAxd?nHq`5B;DSe$0P8r^t>7oJMbnvUG+gnRHAso ztM=u<1NdWr^^WN=T3Yg-3MpqvJK4q#-5k}5!}}Bva?pbgvIJhik^<-6ws$v?)IX}T zgWgVwl&Q+{S??G(08HI@hL%+MPvBw7))_^(k?3BTw;mLkJ5v*WBgUSKLe!6|TMW6I z)F0CPz~_bBzw5{jGf7)`?%KnJr{oH)gDhMr*F?p@6Edt{cW&%o=kq^BUjL<<yvyhM zyB6Psi-Zv$;iukOn_wtFH2YtC^2%s?G+PJoif1PODsA~&M<iKoQ!wr{*5~^MCkbVM z?5JCTI4;w?S+h{uX6=mZ=dtX-duPqm{at@ANH-W%*+MOMjDOXoOwR!q5T{p9z$<#z zDH^$NWVwMezB*asUw@tJbtShmC9ut^nYw#dOuzk12G?}7Y2}tiyK(Bv4PHAy`g5Q+ zx4EfF20KM2|KpyflWtqBIaq()=+=Vkt;)Z>RUKe}poCrklS>NRAaLx-Lq8R*__NaV z(n4NIK}ds%9k{qhy#hi@I~%04c1s%S121s)^S7@SY5j+anO}?<<6satfv3Fw_#wjS zuYs}zZI4Fmwf^pOwQ9T9N`w`mrJp5JT80+Kr7_OGU&Z1A>+O0-VM{rj2Z^P_^ftOt zg*&}`S9!xDBD8;)M>#-ql*iCEXOV$dUij<+p$#w<;`RWW_ewJ<aL-W-E(uOrk<z70 zm`Q<8yx3w_Aq^Zna`u)UW~Fy|j54C!1h8FIqaURS|3FC&4N!FxJx`>!9YR*vGw{u2 z2kXN5RQl~_dE2-##W_Ybl-mJ5GPc7K`4E2#HvtY!h<ppOJILFg(PXm_`)kNJYW2_h z8i6|#Ojup6O9cOgFXjGm&YmxPans0S589+>7W};vJwC$8{sU-@f!+jGPp%p(%J7%f zq<3{i2k!=6;Nk@f^qF=4NYZ*}Yv{(p-9dECL%$a=GP4PKh|Wg7Ggw~W;3=oQBYNme zzx}M*%8RN%jn$DWhcbZE(rq<4=&y`H=r~%D_Z6G?nyG=$*UzXj0(%rbzUS-*{m4xK z8&s}7PgLV?b`^B5rCq%s(+G_K>&`f~m2mo-on0EqZr;Vr3vBxH%{sRIXBZrp(u<ni z@}BG3jL>k)e-3xA>2Vho3-2GiN|fMlbDhlz_E<8}J(Wt@gmf`$0{BXssgDV{|9VR{ zR+=y)@VHK0&Jad_E9Rh!9&Fr3G!tI4T}-I`%>mhSa`gPH54s&@27I(fLp|KuiGKTy zYQFC`B)58HnHf0mx!m&G-y$+q)td6h_d;IavXht96FvB|((*y?bnn5ez~@3M>I-Wz z{r1y>o=(wl1Db@yz|B+c(Px7Ed(Ij~H5b&mWgvU~P^A@-{sWncOv>U}uAgee;sWP> zd{lQ)g?~_?(~?cTx>5emJ1l=ri2Z{KJqMbhr+leSJ8M1W0+t*&<hMbeO9TGnSuVqN z$MgMfUU<7O`iISAY?1M{PTf6dyR2Qir-ansr%}`vGLLxYmQv@i4uJ2EpK_3p`_DwQ zcwj&2E*_HAUlicgq?$?ZuyU!_OngjBjW7=V#vNiSc%Utx-Nc7u^Z{2i+oPc<#NS_# zwyR50HWosj8LYr>p6~NtVf7z-v4j)Q4`*87vCZ##TxbLAPv9!+l58wq8lnezQ+9EA zC({FOU4OyBLSIb3{j`l5YLrmtDyYvS4rl~;XXR>5MFnshrKRre1@2m8!0^{}>FVEs zRdk~_RqmMx*<FB4J+Z<5q6&Yfj6sOYk*p6YWi<ewc<D_ot?(azBr5Ot*Q;Yy3mnsE zV<(Z-e~M1TDdJ9)YtZJJ@n@HJETEK!P6W#h)itaF;0xFFO^Uew{!Om{568>5v0<?9 zq5HoToZPwTG*V@a!i_DuHw{e}@?!cDzwtq)Mjqci7ulG#0&MtcxLmmXI}u)vR@C&I zr%h+LYu?y?mHP^FfRUF<g(pxb5VJL#VHO#<SEDa<;S@BQr4(A0uMl&o_x${p&LVSv zYRXU3H2j<^RjR_3(Jh`DI;M^tJ-`9C|MH?V<?mB%JY!Ch=MKOlrvtwS+|cF0YlPn4 zJ<)gQqnKsP3cPkr`?kW`jeh&-2Z3`4j|0~#A-;n7f%ngurRB2z^A}C&w42Pg!lYQ& zz$qPXT`FSxPv=`?*0g-Khy@2u-0PmWv=Fp6vwAa_nHI{K9$0_qlRDY>PYc#qWGys| zd4W&A{*Ep+1H``8-mwMe#=bXj1He_WcQoZ#OuzjMhVsVP49c2|ZH!W2$}n-@!98ED z7M%z61J0K6X-o}Ve)ezo3$_0>3|n2v<75R#b1T4liJw$C{@RD{wI?ITW~qdN?sGR9 za<lezTJCy<e1^XZrZjS-k_wRc)LSJ>4*YQQwRMEpf1Hw^%$-Oc!L-0{&VB4vp+&6a zXDyK^7wouO&4U_#s6mSVQmHI==cXH_RZo6qJCW0$G@FQx<<pOo`Qw2nwLMUCO2ytE zj}1ti4+>?%<+h%|jeTZs9Hc`fz${Pid(xRay}Zg@?YDb!(aoX?|3S!$u-uB@U4+#v zK6tZG`&%yp9x7=dpK68$f?hZd;2SR=nHFMyXH8BiOFO3Yq-ANYdJgh|9{BpbDJ?<s zU++s@zngPCd)eDj5jcRo<ql=IJ-4*}!FndUGl}gv*l0S*J&I;j>_+f+Jon}IBC-F3 z1=kkFlLCf!BkLAeK4q3B`~4lWoe24Xku8b{vCc&g0)Oi?T&4F9p3=zrM{A7i2$H}G zY*I8;3!wre{N1t<y10sBsI4E&`MlSt8$|8?fey#7n9oaaeoSf!OZg*!GoSr7D=lCw z`B_b>N(%F0%n7XSf8<BP=|9kEJR)!^XKO)C3p5U#`@>-u3$ef3v({oB#x#8yVrJkO zn^tPFteAfLsezoeeK<@v;M`#Eh37t9FH-xfxD4b*-YClpy!NH3>XQO!qO`QuEspL& zBm8oG-G=mcrm(fG>KxsvcAr~j-YLrPAByHCRlfK9T2=>e;(edIEvzTgZ@=!-Yg(yB z*l0Sz)W8?_IjE;l`+I*G9&SCu-6!9&K^XmowP(_t2ow_t1_-dtlJoZy>cIX2p+~J1 z-E?jN_*1i^)Rp>&bh_c|E?S!3da))s{l`a2Z`e7V#RO)W-_g1NMaX54TR6@c+yZd7 z_lnPw7W@sFQp%bsyP8>ne||9cVPW+T#3?nDJMa7f(*lpVY0<|*>#t%Q?rLEMh8x68 z?0m=G!s$OSsF=|(y4xU+{`}~B!sxG3nm6J}zD%Y&e>-rmo_}ewz+a_!I!d2VM+yl; z4fy4hYu1Ud{-c;*eZ+mE*5yoPYTz{=FH@HjAh5_CQZx$)+<j<NJ(8OM-gQE!V?}zn zXFrE&XHrdXgq(ZHtGE$hy^~IyERFb2QgB18CL{iJ%naOZQ`fG-?C<Bc6km>IyWP9{ z*I(*d9-h@tL3CB7+@>{z#Rfi5fA~!zw*Qck%Tr+zutMO-C9Pf(#=xe+d!FG)B+75K zuHa-F@QGt@4M`LJrsBk)NJ7%SQCS&Bb`ky#-~%(NbddUojMPZ1I=4~|F){F!9UmzZ z>HU2QRlK&4gBAGKP&=@A;K=5}>aTX}Ct8umSI|N{x6y@o3rzqYys?p<hWB3?@f8)6 z%coJa#U&N4bNuq&Rwv7c_?tOWr%79|S<a#ZyRBZSI|W!M`HdZuRo*HFd5rmiZ@hA) zX084Ebe!{4S242!e;mD??iKi}qB@sZa#t)TWq#EpP#0>%PZictp_r{Kmg18qu8s6e zJ$rBP-mBd9`JRhQ`fL<Z|2zUZt~6SbEe~k{43r702L90eXk9b=2O^1hixQhdz=!}R zu*0xS7ZKQ>(+m+a!62LkC-CmMC#%!*&v(#bFcyx};4r*ylIG(dFV=lU|0yv`4@SGp zt`>fo_sm?;g1`BalcObt5!X$9Ri3_mSV;ZdGDT!`w-`xmiCeOMftOB8slWHv0})fV zC9^5s@^dx(-SW$Zh{*odP?n+BDUBNXvb4a{o@k|&_<^Uu+%3+z{Z)4`Z|EFdUVz}~ zXw=q^#946Qstc~2Eu8-SXWb7D=o*cD%EZ72&zN(I5c~HZpE1|th0~cC*m=gcT7c-^ zfAMXu2A_ViL(|~WnuL^d{i9oC^>XFUNn!R^Fa-f*$TU6MHGpdkFE)AkY$5hvwO|fa z|LYFudVBA$_ag;9Ek^8=%cUnOa&L_MhkFn>dxyrF;_;tAWcQKYU#sH67k8)X_}{7~ z2G<KJ+At1{Jx^qrfsuE*mk2EuxqkC>b<7YR#)Lpxi)w+6{{SJA!)30zLxX{UsR{U1 z$(;|1sQ%FpE?<(Q)FsRcyzs~~Q^FcFP|*dU(MBI;2VU^)s1JqRKWkJb2V~2b5?FNi zF<%L#zrc8tiVC)CJ<W7Bvjfj)U4ChBc3$*QFH+h)Z0D2V%nt0e&#|uvyMJ_nReg0u zk}ocIb@IU{U+V2f{-zPDZlMVjcdq_${_h%P`b%rKv`HhzD9&Il0H2;YpqFT&n11_> zIbOt*is_w3!;OU)1_|(kf3;JC^S2K8Wm9?Lyc_4{$bWurzu_YJ$=;IFCMk_Ur!2ZL z3l99_k7r*MYJcZR(Rc1{hpp{y<$LQV33;)%+<fTPNj(o`!GW#!j}H`X|J;Tg+Hb;) zz-xy0I8GS-T`143@i51T?=Um)U-#XAwJ`fzG$z-G9xBA-466fve{)NX!TrZydO}q^ zmawr_F|z`9{<>&PaA{-JnTQ#KW{kK!_V`<u*ArfUX|oYbrgmrQbe0zQ$K><14$eQq zu%p`CNVUa&t{WWHo&QZok=%beDUT;hj53leHt_ScAE--iPrv<~5j}A%XB@CTfIR?9 zj|yoH2UE8nDILa$+B-dlF(>e`<dPHQ+l#$9)j?1_p!LYEUJttYfQ7>CFK;H9-Nu2U zdiQnKbV9JPMwwL37`kJv?t}d+L{|R}Bkv%04o+d^0xw(HL-$Gi9eYKlik^w0%B>jR zx-p8<r?3U!pi5)AU*sRqqg**tk;)po{govK*6Y9BXi<azAjW*(f=hB|Gb`}FKMcH5 zSp7SVj4YMA6W85LUHa%c9k~9JM7YGdn_`v}*ez71Z=d>4^yYeUq^xjxC|^-q!R)~O zLh(_e2mef_b!O%=$55`S*X2L=g#qf?{Rdpm=^Vi_1M7WvZg-K{e_+s7j$Hb4J(B{5 zCVJ{UgZ_fjXxm2o*YUPFe~F;Q)P|pTw92Ipq{43-|GD1b^06Cr#qU2uz#7a*>(43x z9{=!}I$gqP1`!vj+-MC2tk#f6F+FhR=oT7f`wwK=PSs04E@oEXt2Z3mS9I*}b+BWj zA;~zV1@;{9$WKCh68-km1?_+E`pYO8Q3AXq@cC0WT`0u<j>imVoi%r1?+e^@-2<Nq zZ+CBjQ&BqTM6bcywM<E})RyMn%z^`dn>(UO@CFj(g5ZYC3c8F!R%;*Ua|6Kj-)EXj z1BfmBR8HivD!Qc{J2qvhWEG7_sRp~08v$OlbizH-i2txrQ-MjKM}fPo-Ro|l^p~6D z#1RbMp`>d9$3c2yHg|C&z#(H>A0>@o`RAvc+Kr%+i{p)^Y(c>C`##Y%A1pOc6X;_c z-Jv^$=u&s{8Ey{$j|J~*6`KEaL+i>I-Tf1b#OP%OjYm7Pnt&V5{q{allmChe?`qQC zj$Vj?c>ui(Tsmp)@xmN%+$LhYQp1;n7x>5J({~hJe@A1oFC;KmRwAMUF>tS)ChZ)Y z*iJquNj81hmx+NpzuHCD!Tx@nOfj{sx4r70GG#Xrx6o0PuE=KSxm3Hfn82a~*B<fU zp3;baCt_I~)@8AqE_rkEZ`z6e!9$rk^xIih;DIxr(HY3U0;JZJb5wjw<I;3wF}DDG z?w$5}*aCycZ@^m%!2@D=y~vP{Vsc>3tw&xQT-EewA-(pJ;luiFg~?yTGg?pWAN<)u zNF%IE`cU^H|1HA$8=t&dN@t29m7%h1f^sKGYkVVFBf#Gh4YeZ4-#5{?36WjXI^6EL zy1r?<wqwo_@dKD2*@oS}bWh?ue^;fhKK(hf8e=bE4FIRDT==EP=|B9C=ZRL8@Ga?8 z%nSUZX!dc!>mRtnd(!b+dU4fp{h)y-1-5y-WSY?XubC-FZf+RRtq$zIfExJ7Z|n77 zhrgE1bEn3b`!Of*z}wo+6LJ0RjKoDytkSx6Hloi3x;0fyE%`YNQxt?V0a`=u?lYeM z)>9gN_y=ZHVLnN96DtB(7Fn-J&;S#abHfQHW^@^_?hP+C5cT>SaTz5J5)rv79_cRd z0$;o6wd)JuMF6Su$Oh&G7Olxu{Xl-dPUA(W<o*UTF>v(l+jkIw{f7noS&R?17!zK} z)WG4_x7YbJ@183y2^Z0SA--4D2A`)hE3n@;O>_%1@4+UlF;u45IkcvZ?KNQgBab>? zl;AC?sd<vga|KHZoU!+&>x4D$Nlqli17SkCoJoPto%Xuk;@gIP=Vb^&s-{(0*M2<k z$3M^2(!;#RtT5)v$riAXz<2Kd<v)SH+%>03+)2R8R&`Nx^6q#io6(0kf$RQ^A0mQ! zbCyP_dcn@)E@#!4=ls_g&}TRLuWK@qz^)BP9!O%qwE!z-HCZjPdiPT<Nq-G@J@CRt zyRQvQSw;bey=L?~rUc&iaxXpNl6NLYtO<Fi+(jbpM(NZ6OFtD!z0E#7Az?$Kt5}`D zJ4d{sIdpGE-ON3j8G-vB+F+T;=<P+4crsH;@s=<vaL~7F{}k4|XDSK?GkB-1G(tD1 zn7<nDJePTa^Da8~GT|+z-+4I_;YA%D8la=DVZPA)1Lg)k^>l@D=N*Z=+@Tyf#a*Q+ z4>ljrmB%iy`wwd`kPq-yOpf31e#XKBr#&_A6XDI<ZHw@(w%rhMQ2V!Z%Qf#|A*7`d zmv$)23QRS<?KF|qpSG55Ok-N$^8Od;QNX+{S){GSTEVQqYd(8Nvvw`%x0l6*Og|wf z3V#T!*l^cW`F3w1OI?ljU{+wmuRG|9H~&>gG>tNyqO`@3eMcz7r|mHUAT)4?x{bAL zu$X@5r30od8f@u%Qa&fnslVmhTW;X&C+aj5h2%Zzw$0s(PPV3y;5Ax*nf*I(!O=T6 zmPSxA<@Eug9~93;lF7;#-OCbAh4~)FJBSW?0^a{lEA0k!OQ2@#mBh5?Kq0F6ke=KE z@QuCySRo&hf8e`CN9SH&JdUY>qZX}vLZ~~_??A$n)61liHYIaBlLPBL+^>$17Y8M$ z1FBNB=q3ddd!D3TD*x?=Ep%d@cMs(P!)7czaCy(V?L>HFlmlr7){_p?OC|2x3m>qJ z0z>y)tDCL)r`fmo3~M~5x|7FRfBq2Q;<-aVmk$YSJ-M2G*LvREIj$wOfvHh~Z>LO` z`mh0wG=we=s{Uv~Q|s{J7_q?Jlkc_?jRfX)ayJNZ!3~`A&^NlC2&|Ia9ZhZ`p!xlE zbOy~o&$5NBXfC9jg$C~5wZjHc2o|nhw$848NHracjGjg}e3JB4)$I9ed*>z;3qeu9 z**|pAos+-=xQh0w>BcPmC^s#Yx_YH<8x;F~l)C?16@zP?1EYUxF>Brdoy=dtU2Y?N z*JB<$^Mb|F5rKJmE{8jZvVjeMn0A}+26i))c8*fr5cRTz3xl``VBbiErnCdkwiN1Y zW43jB^~Aa(_54iWpvSmmT!?L^T6lLT3V1^OC1;4D^4~AyF~%dIS7~jlpUwQhh9w_q z(k-x-H2+^~-w7*2d<O8sO??K-XXNdLs!Qp)nz3{@X0&KPX|iar`K!@T)lQZgc<t;x z?hxv{JHVyx);~0O;HlI~s5?I_Kc6Q=;4i}(YPJ)rlDu5e#CWWvsC*(>k4?f&WK{q! z=pJ7r^5&h3V8T>%Jgpv$3eIFo;9+N#Y7G+(O8Lkrr#nY5AF%z2ajiJ>{bsr>(0=m_ zCIqgpSHD!gIqyC)-;6&@-2_dXRL-#NBZukw4K=X#RjD&=y2E<ZQ#CpR`Kkchq^6JJ ztODSBOBd_(;-><-MIsI#2VZ0kSW^X}p?5>_b{FomR5YCTiq2?Q=&4-Puufp1fnTh< zFDtBhujdUb1TCMani$5Uz@3_RY$>F9Ck_p1`9v1h2<pa^n;Nw7&&DyQ6O<)bOyKR^ z+Mgw2`dR?K-pH6@Lg3P0rt3*PUqb48J2^+05V&T)GrkrH^WNAnAKfi#Oo}q5Nah$x zk7i=v+fUuLK#2Xiy?kP=GS*Ti1+E*jNRK__oo_MHiiOf0V^-FYObcxK^Aatn@s$;K z4beiv`l~dP0;6BNsi#3Pefc=l-0CgFjKFnMUyq1NeHqQF&~(yFW(3ylHdR9?zuxa< z9g5rgt}A(`*PEIz_O(+zqB@Nw1@^dq{=V|<zJ$8%l3_yN8wVWPMhN|!9qh?1a2m+0 zz#DFUyh{PBjvI09v$WSry&k~#<MpI+35y9F_27%;!Ne@Jqdv4PPru{LYuXDd0`&YX zUPdRTC#S}`2a62so9@4hkoygN5qX<Kf9H!k9w@ZF6A2TWQRRC5Nzuh)h0{+|T#Px< zO{=)M%fou?*en=r`9#_-cm0&R#(AMbqDE+ujLNIm$WTelOc7(KG#1IgCd})QcI9By z;yUkh|6DU%8bXf-Zz!EDry5o3$FpoB!2fLCq&X0Hqu?#T5Y3}S<|~GC8^8v!-uuW` z<Q;>Fy1HAnbt7$2zB<g0A~a@tVD^NQG;Hodzk`2*j8IqjgN_+CQiMmO8i>6lm8_(5 z-ADtPZr3&EB>oQIXRmDRFD>Q0I2Se5vMNf%MpCg78x2=*6ToHrj+r7&1U6jfW9Xb3 zT|&WEgP|e{3s2y(?|1x48X7>q18L2u%3SGyv-~)3SS6QwoyBbdyZ0V9MB2jIJy2Wx zQMHYDFt-9+(BX5<&<3^xcg)jkPH8e|dzSQaZVCAN1<&fPd0}=yHC1HNT(~xxn*i?A zZn~ZpDpX~7QN&oa8TVz}3h?fR_Z%i2lXvz(44TJ%7c+7UHFN>{0v^6N_lPNih(h{Y z&mfGC=f0zc8v{-{u3uaEjzUL`GzLpBUzOyBfL|XK(pu!avreM0S{}gMNN)H?Fh6kG zU2}C^nRl*rOMV_H8X6RH1HgJSHk>G$DzpLEmH7hK8_)iE%D2)$V8b<|aBLPuvpGFo z$)5pCZQuERX(jLM+~4R4br;60>~hDQ-Q#lxzb?(3O3fBx#O9lvlA$yBbAUUY(%~&> zC$Q^s9HePWr!Y5~sCj+YN@*$Y{oKD%T&+pWjl^F%^x!$tNMN;@Zy^6jFFA1@-q_lF zRvYl<*Iv+lmb_zgx=<sUprV*mk@=g+9?5$WF(wBtYImxhYU)J4^XmI8$#uWO-LQP; zs9m~?dh*^o$T1J7s6GwfVAQcgUF&jzO%hjKCcJsC{wU#FG@x7m?lrgoQA)&I+r0Pt zyEOi6p06I5)reR^Y?u{*O%H80J*bF-X@@5lU-a4CvI4K%p+++(tvp2>lpJrQJe2+& zqy)Zp%i%3V%Jx2d$ex#`VmRSvNQ;>i_+;1p?-tSy^gAzmsw$xkdkWu*s!Bq+`<*5; zE%3wSN4E%V-m!>FYtG$Klw)6%mrxNQA=Ck!^wo9SNfUXi!)=0sP@@i)bf?gCjiK@$ z1THBlM)JLw@*ynnxSc;3Bf{pL{n>&yCdZJ*GcoY$>n}|Rao#IEmpDqhLFCHt^e9Ek z{IbPa+yd~MF)MUWF{tQN`(kx{6B7gXT-HLX&jJx=Be_c$T}MCotnJ<tophpxylt8~ zG536m8__*|_q}=osW=F;c_BNNpj{VZdJ*D)i2&dHaF<g=>Oktin56#<@eC#g&bfBI zCh&{tcMx^ZO%nQE_-V`y+<e(pg^hD;3fGtgF3Lia3G1N{qCqdf9S5zwQuGqY!sWaS z#S3Or$|z_Vw*dUEaqn@`Lf+A*JBCWBIGU0&wHlbp4FG?=cCAjWft)M`slCz6O?%gU z<Dj2K?k?1fcgKomBH^?RnZqnJ@Tazo^;(mjLD*f-LKzJ4Ua)QSE%4!GrJ8~XWb^UA zaRDDM9HKdqykju8OU*!~w`OIex)yob?<agCde3`(>XOqP<E0@z0(31a1i0y(-#ZI+ z-s=>X+U}3aEuZG@6I)m}hFbyd*m9kg90r=5xs@ua*0C3Yn=u7Nqi2CvzxCip@*#o7 zlxsa=I#aj-;62kie;^G6ovG>FGb8v|<^`U=V5b4X8^|OvdB{yRt{c8<uP-$Y4&($V zH<z{7B)MCu#||3gUohrc49V-9L~v)MP74ylL=}0j%3NyNt)r{O=_SYzEG1WFg|#sZ z1$gw`!!<Gr<ixgmD<sP7!0Ug0rMG-SpvgmgI=z+@BQI&Er_;FwVBLdOYQ;}bJCs>_ zI`aZw?=ny8WP+KCK2z(?8TD4~wzDWCXlyh-R?4MMt|9KU)57C~IhZ1{SXOK`An#eW zO06)c#B||tg=L<}Dh3W(yXH%gIFRWXALSn6a>skOWd~@=DUjUADbsFU(rBcpjvX?< zk`LzZCUOUI-!kvhQyMWGoV8Z%s%FX=pVyNnib+-8p#}A1tSV<Hu3`?3tkXa@koaay zMvYH#W*>KHac=a*BSrkYcaB`oWdbhQJun^MYNt`#TUH8v-uYIS-lPv}$BX4`n7|ib z8L+SL2cCmu(sWmgC5vM^`U6?KSWaa)VV^LmWU+x02KLetoIoxs_j1r=rUm}++l$4b zjbi#8#1=Ejcyc@!x4Y|?jy20$3wPehDYqwKD8@eA(xE1wJ)-q<fmktk4C^G;1F-(H zbu{4-DD13#@#`q21|IXthNDFdfehM4%C(LuxRd;x-(tF-9*EyA6J;_sstL3Fz>-Fb z`-uFV>9@CuIMJpdAHn3ng~K{NCggz<O)~em+k)q{ze<nJ1{#UH<}^F0Mr3y+UcBt4 zp(1jiWdyreek{OQMoeMF0Auej&?~$G^{Uz9kWRIeP!aP3?<#A0qkILdDOj)a{2Zcd zpW`Lrh`r5qHa7!2clFnYN;AP?M6ymvq3QNkHMam9yxUtLX`$eyG=&A?+L8E191UDG zs`XFOMxbyb9!`{J=|VDNOzxJ$n$2UU3Ujc)E~7Unjbn*{4=;FG3%CLqsfqk!nJg9C zQi)6|9Fg}--J#Gr{qsvAeV|2*;~KClLw#*6bs&EVaK*6g@03Q0>31+otqRLA^AhF; zj-I+sgMqgBa#xc+iU!ah-Q=yY6OOgE0&Ma9X+<J#OK(bJAkik44mk9Z?{%NBgEw6d zD!--@M;qqew3DR;?sE79JwTeb-RXzd-a2yU{LSN@(cDnpBV`QLTomDtP&`Z<v$=vL z`hGJ8fgfCQyw-Z;EwN$lP0Y0=Zo$030h^BbUivHV$zod)hpN&xT5;L$Sk+(;VfT~T z=z|`3kKyRnR(@mCrh1PGZ{AT*PHLyp-;J#*c4@qK0jzdnGqO%)4FfNz`Qip)%{#U- zvi7E)8_aJ2=_N$&^b%g#^CqD_iJHpGH;{*q)fAaOksPls=R;Y;SZ3gcmm2jeh!``8 z5D#Kv;2twuMTIzTgK#A#V&Qe?^RixxH4Pq!x2m!%#*Sh%%L|-v+ieGlym@z?D{mQ! z5@=~-A5OcGsevmxzN~?9Ad#VC?mKe4#!~?Az2LILMdZAFkSj7&oT7bvW64998MyS@ zBPIxQ-a*+G%v<_6Ogo4(fL$M1(^mM4>9@BzBSI=q(SDMhM%{$tRl|pE7Vi8f5@)E8 zTTa-C1OWv^23~pVLr)29piZO_DE5rQ0N@2yyqi%67j$IPzK-1)?Zd>tdGk}coC!p1 zMs~_Rs?&^#fi)Lgx2zyd;6+M4fH8o1fwAoxTqL}KIu5r~T6^fhw7^e8n{{I@=qQON z%lX<CH(5El^xr*2;6Tij-^#@RFe(@Y@Yi2XSSrkcjE(v(y$x@FUd<(1J06Iaj5y1@ ztyx~++|N3#7kL9YPm(v4dl{-B<tL#EV3Qqp-XzpP%{VGDH)ffE1J+*Is379>gtWSQ zw@l-`jpv_U5HSXx_<L94O>@@1Da3&WNL6JbX&uEBRs?YSRtN7Sw1G67$xP5<uq+b; zS6{nP55ET*AGK!GDrN?5Jhem%*aC?hb$n2giGioBt2{<@5lCe8-FTT&-Qv;8c5mpG zV9+7r%y@35ckYI=f<3)XA+EvAIl9|*qK!cAg0vACZ!OMEGd#Su*9hSa)P3ZJbWFRG z^!V!O)j}L-gk;r_-4T66MQX0l2GxVOAUA+}_w#0jx%pT+OoPv^rP+$HVfk9W_kR<4 z1KAqs*Kx;g@lwU!)w<3LIzY-(60Zzpp@Dy{ZLCFvd9U=`n6om*Z+t=pm_C44uTL}= zRRrofQiaT<uqf~X?>jHRBj~QQ#!-k-3}I&AZyi3kLL?3}IFP}r;z`;Kga#)2))nHs zyDnZDt}enK^uUFAiy~BNt8>d(WZ-v4AEAfx@*Z|MX1YLy&S%=QD7*9254^t3`KOA& zd1owgw4~t>4G%htM9DoH7j|HF;K)|L>l!ETL6T!{*RFMYoSw_HX>P_J1cY$_?{3<8 zdl9@H{myH7lcUz#6619(CosCa(E{Pjdw3YmQ@eE@P&6o-&c<z_io28lNawaE39Fw? z7}l<}uiqTcIskTf<EB@H*-yQWyxkKSK6B^#pyb%=juq;>$8=7;xQvmk*(zfMTLf^$ z^H*pBHt#)}9B=Lr_#3PT;74u7>?p$e=>g0k9vdoedzKe?_0E6jLM-nM>YTiGC(l&Z zP(sV5-exg9u;+#)FN)-TwqYd4@T0UIy|7}&#}Z}+Zr|;jGle;C7nc(}9ZttX=tV<( zI1duw2QRPwT8ING8;4@WI9z4F{MRmedNIJ5R&h78Z2<Ruc9m9l1n59hxJ>m0R34=r zcp$48xUprY+e90FF2i)7b6@YbEHtqC;DI+6z)GTqtE{oT!m<Ld`=UdAVGUvunJ`^u zpNU&r+sNVq5BaWK&!Kmr-=4l0_e$qx5o2)Mv)I74tw-uv#=H|{IZHNo<mY<OO8)~( z4;=LGvvoa!#F?k`a;Df7`L&X-28*VP{VB;I#mXjxN_3maEh?&Ceu&=17r=w&GH=(C zV3<vT-@f`y2N5{HppMogtLf-KI?W4_jof{}Sx+|7l7b*3B+(*UX2T);YX}T1xpVH5 z1qe(L1p*5M7{=b*Rph~Yy`<rH0FQy$M7FZU$#rIZ0O##k)KDZ3;PNR}4%rHPBY1OW z23EA`yGWP=XxdtxVLgRefv;ZG?hauMAg}dB>h9+-Gq6=WdaE!8kQb952g>ener3wX zYHtCY5v7}O+j(d_RUz<om7lWR0l#^qbvKbYz(9e_RHTuTXD&OjI)HnuJa)2B7gJN7 ze#neLnyBdF9edqfW9A0_zGCGg!W}@>blpI>+D<6$HbA!#r(}dRfU1q(|NE(RQPl)> zbOE9P=))NEPup9!0lebXMW>0x!JKE(mZvUdn*i<<?|Y$;2Ix465q0r!5DN@E{im+F zbrE3M=SEttt7yFX?lKWMz@Ua1|BVy6Yxns&{JQ#Ev5mKMNohK8M>b^O+UMHrE`kRz zxm>^;lGA@x%nm%E@sBSEdjPfAo>aqYT-O>NFnq-Fb;2BA0A>>!+^%5D1E$yA|BSE( zi0F*V(3c2KWpROxmlW+O!~x8Xov7)(_gKHcPd>R)XYByA6uY#L%JbH&2H=S;*IrtH zw3x9aigR-#$${hi>o{|PrxOSmMbu|S08bkGi7qPxOe1!bU?Q=J$$gj__{rcE2N$3W z+=&$CyU9B+E%3a_C%+@K0VFo2HohVmuCmAD{^ITf?r_`{=LvOZ`t3RK*#O_2Ro$i3 zd2PED5)|13x2FH9d3*rR7}4_$5jlXDLlBpWnj{GxUN!XdSlPgJYs<6`1Nb2`v2NQs zj#||IDiJ&Yvt6%hG<Oio41D~oE5-|R00S|%%uwti8MIs3K!9KOU7>p!0U`mtHF6^N zAaIxG&T1**!iVH#bR`p86qQWOC868|?VBSXtrEgkeuOIEDE?^RVXxfKRrvCrF|2^7 z$Z~FAJd;_0cN}z{794wicJ8`Fw`!{Srcs)Q^(4&g%YVQU0{46MuQ~GFo`kulTiuRX zapBLJoj^5+M^BT4GT*rNIPCTxp9&~qZuxyZe>3ox|2AzRgr2se7dc+ee880#b<_IB zyax;$w`)12%n3YsV3po2ly|Iw8!f8K>9T2a)ARuR%{aReyV%eOIHh6BqvYc|Q$u<6 zk3&rNOb<APF0s~YrptG><iM|YUhsgB=iT`eW7S3UABDJlP09?`1MtJH>pKZ!-svJ? z%()IX<4|(<WvYQ*`D#EYji0B>)a`($llfKAOa+%9oXv6rC*QbkhRB_F|83DoJjv(J zE14KL=8<3YXig9Momc;DLCn%eOYzFKv5*Pe0&tg&{Wgl|d7Cp@I3rfwna=pqjVgw7 z-8I%QfS0eIvrssTgGr5Bm{neP$7k0GkEDb<@6D6i8qq1?T-F2d!J?b>=s-YTO$@uG zx~tc9*K}n-UL7i~Tf1fO_PYJ&J@`}uxaAvZKj7!T^u9$jTTH+6vb9XCbV3pS;8*Bz z<dLs5T*BPIvX74QFEz_?V`=H!(~9qf)WEjCx6}>tV*2eVH7cND<ut^z3A>?&F#vAh z!fT$KFB-|)d*-AbA5JAm84fwpA|MA&yMAv?!JJILJq3qKQuHFB+*;w*7>`)k<`j`T z05xS;!?9FIFG9bTr3QX}&z-us%G*P$O8U{;ZpK?I=V%eQ_LV!=inPVS6j70>iihZG zC&TUb;4Swo*+IDT9(^jVxquAZh8K%!bRMw$>(;u62%urk@q|iweKLlrfvcL{p+{W; zh)mbA)u_mb@gOqr^-eoz@+bhWvA1N>4iZ-ty}sOZqo_FVRZnddJ6DXjBV^I6-unx4 z-kVdknN1iRDxnv+**LnhMu11Z(?myL-m8EdKQzsz(UMt#o91lL<!eAamn2JV?!nb_ z<8^mvjcPzWTW4pC8Ac1s0Iq)hUs^<gFYxn3hHm&CmJT>}&NUZFw-tNS(Mw{{a00tL z<bw>iYZ8%5NBtq(0X#B$HfNHWMgl?)z$+qm=;l;_o-2)o%M%jBxg+nLwd?ilYye)2 zJRI@g$_afr=}gV-1aLxjY~*G>xO1oi`1tgN#iHi`#%7bXI)N-=X5g|=jULzuFz84b zlpHsz=*O(Uxg$?&D)JW7Z$A?b*=ky6qITzy>7Sqdt8imL=EYr;ju)Li_|($|Pzs6; z3-Hdya$cGNL&Kl=Q)u&EGbAIic183@C{9<mhv_ylE+TQ=+C8t%?HHJtvS;SP8aae{ zDSa@E0{CG2Th$-uZEqrRB0An)N?M&^W!%Elzz?6Dq4A+NH6lZE`($PUZ=}s(YGC-G z$EOEY2kwxfKqwk7wY3dHnHYHMY2(!{U@v*ug{Z@MFmVWT0*@KpPYZyGeK{k^IGxK( z$I25F7urKn*D*J6w?0GvEsDt74T-!+Ax5%v>9+OB?xOw7;m;i-yxx6BW&yFCH?Y^R z$iSty&fHt5^Nu!EWPPx@hADxEyn3+Scayhg6G{>_Ta}2V6Im|RUBJx1XZLzb-ErQY z&0)@6BI-^`mp@QP18#3t<0j;_EF`}$l!4ujzbPS#^>;qhX(7iL#xgPR**!mdR*1XM zZ@)odMp}p*P$Y&2c8#0QGCT01hVN>I-P_bm$z7;qLhcH#tC<@3;u$|~62bG1ETs2n z<`5gEEA48wnx3i`evuS%zoFN^Yp<@#ZFuYLXuA>k(b&^R1>+^jtubrT;u=;4@YcH@ z(yPe*U7HCkjI38OC-9Ns7igJ;pAJY?W5~HA`Do?^?%%FbLqdd#UKSTmhD&KGHNwW2 z6nJFxN)3tqt-<WK=&WSOM=&|C$u(^>Bi)I9dr53(qYxF1@Plpc=(}O@tDD6hymbK^ z7UP}B;sS5^{+r{4w1cm>@b9^4V?NUYGYj6hUTD3wKu_Vs648>}xvjgI8CdU%t7i$b zxAju8SDs3q%$&ekZ@%!VaC$4jSg+>XdNVC>(IX8m5L$1CW(P2Wo>bW0l<iLU|LK{1 zT&TUZkf0Nz?0>&tae<|~?><sEy~V|-s68kyU}|7=<sJ_QrVf>1t`8+k#!w((#+$p1 zHuThCT6yB_d90E(6}^B(1~#i(?>-UP+euj7+Ed+9CI@c+RFQ6ZdJE0^Nbv>gqnH=? z>V3axwk?<;t1eDtTHxXJo9T?<9Z=vYS@OcVUYx+hz`;M<S1n2oCNF%vu?fh900{Wm z{xg;br>%C2a2{e>;EYe2j1yY#0g{fUD2Is~>LvEMjH!X&J+p6xP<w0GTrN#_0|~J^ z*L8b*@tZ>IuVE~Z$j<EY=nR$@xNN`O*951<`W9wkI_@;41>QTM+i^mBD*g7GJTb@F zwMGbQB--B#*%gy%$302=YUjtNN;}@;FXx#Juj`f{?y=`I;q~uE8z5`UmS)8OZ(h_$ z>(z>V6=Rlnsv9Hp6y^r*c-GXg2<>koDI(TO$A&R2a7edzHGJ(#zy10Wg+7w2zzl1o zb{D4Se7CD6LV5<GkHljzkyt7H86(}>#qW6j1mI8UYc30}8CZEFS#6WOr!y_^z3H!9 zEwtXjks0jK(wL5RbQv5U@Z{93dM4U`fd-w6QslZSR~;K)>D?~4+$L^z!bNu;NWc5_ zzyg>}d_Y5;H(Wxj5#a65#vT-A?~%?kt-Mn6I`aaLz4Bz;ne0Ws{j7T%o{Dmx#>T6; z5#ZNr_xM(X_cs(9Hic8Eur<N+nHhNDz@4@78Z*3?_~=Qb`;5HqWRvN(*Rdk6zxg>z z(c3}Y$)QR8dAiwN>?^ZbUebunBsCDZkvK4LfLFY-d}oo|TOTya&Cv&=k4KpmSTd^W zdtuFck84|L2PYXkg86~VXUtRk@LmOA5m09DgPP2oz$b2NrlkjPDPERg)<XJ7EEEX^ z11G%DXPv0RThvIHj)2;I+KJ2w92#1_NI1P0#L*f`dGeiZ*D@*afE}`532Arw?f3nr zGSv*ZTDhn<xdGriqmNQk^Y=)YRC3jN5D*#$E;;8(U2+%GZ!f`(uc*C#`-{1OyFVGN z5v2r^nO3n}0TpFl;Pl7V|02A>VuaEX6q}{OIvu)U-tkj*ED?I|H5^T}2-i`0pdq^} z`}r5Gx-B@l$+Fgt$*yF@0KaXuZciciHf@U9$(P!o{VXO0_8Wfv{X**9i}22l8@iBr zfz4b0z9cX&MvRl{d6Id7%imw6r=;LRyezs_TsoCmf!7~8bCpP2OuxNY%~4Idkr)pa z^F^|s5(ma0aP}uR=q8#sHz)t7@<4YW63h+!^V8lsR!*khUUHkLQQ~PcPq`JUZ!K%^ zsi?$%*#egotEx_>Yyg932>JlFZ~c|7KHK`rZ1$OrtP7YDc>bzkTGH+<D~y-|E!{y| z%*4PsNBni5C;{0!KmBGCbZss@PDKtQ6E3TL6>}N40zB}(Z*}49?UE=!x799Gct%<` zx;cf(fdjfVds#lg-$YD5rbE%OS$=xg?a9GwhJPs3-g2{LBbgbJY-Wb#1~z$Qex;Cm zdppv#MhAnL6nN=*kAEzr{=ukSt<-kVunJf<@S(nwHB9nn$4ZM%Ic4L{lQF2$1UvBZ zmy+coyLYtYoCUdrIf2XjzTH7My?c-b%~qC&=nw(}|0rGdw2*rXY?oQan%zrUe>(aX zt+n#E3P%eSEGY1lKO3o_-g62a-^m4y?#lSKo?~>C>HYb1bCIOu-MQrV8z0vMhqt7Z zw9D20paL2l1$=$kT~|m)`7bGL)Uxfx&PQW=>bx4v`D9YrL`3dcb_d%V`<`82gziZn z;pdwF-Z4*L#Q?ABx7$)_!+UsypqMQxV6d2i)`9=(dc-$E?rk5o_}UB)SKvEtcwe`G zT2mYOD}}b5PvzO8<DOPX;O4J(enN!wo>?6iZzOd`$EB~G(ol%K2QqIT7}BY%QedMA z9XAN6cW9B@#CA_7o%2E{B$PoFp!+9o9;au^FZ8k^@1cyCMOj^=dS~Z{{7<+`cEK$8 z=m}bTm+%d&SYV?S>vgbs_ZFo>bcYosPZ$8e>((Ewk%|9w2^DZ+Up3L6*@36ueAA`U zasFdhm%Sk^F^e!cFgBx6Pa(%tm;X4E(uQ<2YTx7-&9uNT>$m=|&=!^(GDTr#e4N4j zz}tR4P<7(3aarf!*$G+b+{f&|=LW35MWpxFI47Cim34C_2kyP!qR)lgUvv|>ZQ+Zt z+Jz|sk36j2wZiW0IC4|<Crk;Pv@y~`D7_sA88?-k<w`ylF)^_F=RI`I*Oh+z*`CSg zQ}Q~5yQirP-`GeM(*yVUWx2|YVBe3PVnVF@;;~2!r&VwOnOZcBOyWj>b+3Ez;K0h^ z;)?NdpBg$09SJ<G&7hlw*xv?ikx8vA-OWr69KGrt&F*-2sgatlq?9GGyOVc+&rUjW zux86k=hf-zXgpqI0qJHOYoaG9!l6>Gqko!Z2i`cQqt0V_hfCXR0+TPQ^=<C;0d52M z*a1C06XoY^ncHkb=^tWx;O<`!*0Q7?^gDo-aDxloR7EdZYWmJq(jg6&>Rv@*A3zH^ zyOVtfe*kb%=N7uD+CA6@a5qP&wutl8$Jepe51et!vHy||$lFQQ?f{PF$(GEZUBTi5 zue@{KPQqT8_*Af*<XbTw;Rb+bJ~Ma^X`sMi5Ti?{wlxgi&YZ60S3$plj;qkyv5pDd z!ruT)o_&snb$L(WTXzAaujz#q&bdtHE(XrHq<V6JI^sc4tBGg%6Mz$s{;#Gn@}2=| ze?po{{;iV;M@-R$F{a<S5#UZUFV$)bUsD}0*m%Bf)X7xd66R}L+;!0X4F_vgeJ5(o z$5k+USL0BP+$coG1Ox1G%g#MS|Ghn#t&YT1)512Br1`Rfiwqv)R)FJI?{K5ElJ~lK zi!R8Pms9nf`2hDe#mVpfYnf0NHpprj&>EH=_;$11-;*W+4l*;zjHjf!UM-Blg-!sD z7}kG|G?4d1Tw6WnEmEVLl}rr0=I3@V331+WeQjcLpoX@B2QBd2L#{hnXj@Y=d6{Fn zqAFQkG#GyxLf8Qm09;ho<VPVq(T~v3<}PC>VOHSNU;L>heR+Sq71Ofj>b2dK*uVOA zKU#zhM4P+k0g(%I0Bj!pwUN*U(t$1;TQV!~+Mf>6Ls}i_w?|i59XOZJwqai2U%&mV zTNHt$)oNm#euEBxFAUmFXPdl7S{ea*luoi14K{x}z3-{LXpbT+$Fwk_&;W3^?dx76 zO3piM%r&5Y<INyC|7?#b9m%5uxG?*JZV2T)-zamD{*5B+a4Fpyp!X5Hz#js<IeoSU zk9p6_N}bbGcUwegM&ygTTSWoCe{!eqL{WLW)f~V6&3=T|qip0)0A8@)0e?sndFzR~ z*^J6mk^YVD%%mHmo$r7?(BZ%}-(R3*vVG`xUiPolP9vt(TFtnt%mbF~cj!OzEw-5m z);*?AkXXXE0IxppkdLI1yu<lzeM_#m;&i459+bH0NulpczYA1V?Q0sN+z@cZBX{Vm zl(%hd>pQHnWVa0)Vo(+E>dIBm{UhH3+bYe_6@ZzHPTj889^U(eFQlQo7jfJA7Ru1k z1=`j20=$9zDZu$%AKff1z()q|7TbbU4JT~v#AI#>c<WPFcaoM08j!Z7oDsVNa^U;3 zG#^ut!ffZW!rW=U!GDLYkk9xB6o%eM^(;U0QpO4cUNygTwX{@_AzOt}OJ>Yp%uN7q zs_A#8G*QsUSaogjF|Tk-z)WeAXQidQ>(aMn$ueXdr9n9un!uy08a0%53R0SWkx|+r zZUT701IaI?iGn<t?U&k~Y$!JbZ1Uw%L!_aCdZ&!e<8C#NVGKfR!1a5aIZ|3GXl$Z) zuz^9nWAx^Z%|C{&zegG=XtHDn;537wj&A{$Ty|Dcnknd8aIaLTDq5A~B{P=BXaxA) zgNI%&jpV(s{abTRMzX3g1g2;O*rPK0nY4m6LSW~t##}4Jh;dWEYcJegcMJ+@N}Wxu zro!A5aQ4v^T9np>eh2=ljNEaL!2z8C2c1;8R&-X-ps_mJVnUn8Edjs&`p5&MrGo4k zgQm6@aP9ff>ps^)#sSo9V0CTbZbCdqpT(a9yyWs(6aSG<vTeCxvs;IL>+!#pN;B{f zfj<eF<2l-0@ONFcxtZ|)L&oezXl_`0$UVF00hhv>!d_4UCu!V8S%^Ca7@Al8n|xJ4 zhF~pQElv!<4GbP#^Yu_^3oBdC9->9^uvCne$z~Eb@lZQFfv25*nBKBc(4es&;m$R~ zSXaQ(8T;yr34_T~e)ZHQ^%KgbY~WnMEdb}HKV2^xD(FM(?OyIgGm@JDKGd;kYiR~k zLf{YKxXE-#F*g7lvi1%C6uIihS;CsBUsslJ>~P7zM}HVrEZ<O2?8kG9J6+D_c7XLy z82_5IlXv=MTc3h$Upp3!y4>~B!re-=mZ6~FkNcz6Ea@)&cJ19$U2#E<#SWA$SDEhI ze?-OnpG0qYuly<LLgTy00%@x{OJ_y(q|`L-7GR%`uhgRtc_;I>ptnnxw#*7#^6U4y zC6c#?+JY5An;yn4JFFEr<ILiAqK(e<JFgK}n|K^;dF6C*4wD0$OxnMXkarA5u8D$T z<^_KJ@geH3^UfM?CA87S7^Ve&ADN*geVAYa=%ON=rg!4(M37)=;HNKSb?KRR1f8bW zsj^i?7DAEK1iCFNRFbR-RYoW1g?K0rL}vn@D}7gYFp=cS>jSpgN|>&g3x%WU7OmTq zN2;h)(X?(fc0D%;y#AmMwT^W}K@CRCrXUr>r=pomvPJ9G=28=~tg5UnCUCXc>D4`S zvpnzqul=3!42A22&U^Hu?qaTakA>Q_u>@_u>*@wJkG=uE*Rh*_q+XkxEugZ7c9^53 zwXDGXj7!#BoRZJLgcQIEO6c%an^rC8tc~e%OwITX;2)>FI9J$<J=q5vgYI4viB{|R zt5(bnT($5+U6_}6a$8l&DEV7+q7aHUIJAe{;Xh&JA-a8=_wcXXLlw~)RT_d;C=Gbj zL#<nh(h3`x)cITu$5jR}1Dk%V;s$|pjyztoHs$m?fDLTzZ$f3MWEI&SnRtd;4TZ5D z$(B$-7ya65W;yBOv)0HrV>uLD1a?MrT!!2cWp;AD=t=%$VAbbyG<%$Ph+4b*as#aP zXCbkIt^|J8wy$p171oto_*nP5W^#kT*HRnwoMztf$~M0%oXyw=%iPuJeM6tVUAign zkb9f-)#GXQvkg4M@&gYzr)YsRa3=jO&<?1;l>XPES#>f#p?S+@twXVBrVN9ioSzUt z8U&pM%-;30o-x2yMuBaIabycN=rre^Kslz_>H4X#mEg@)me%?vHxxYg(Oyr9J`t-2 zZ-g`!O~pu?>55Rcniey*EbTQSg#v+dhJL4eKk)v+8#C6vRp+^Z#Wmb6aKe9&(X?h^ zGl6NhW~+vc)wr#@>H7v1BTp3-7d9pk&xGx^_8I(nz>PZ{cZ@Vpm|AhcXU++4;i0#h zypNr}_g>O2<OtrKTTifNa!?O|PJ<Bvr|s~ej>3T9S~cI=<i<JopV41E@jo{ZoS}^% z0N((7^xKXJ(Of6`9YAxGT#r=QdL1|iFaw+PJU}ZO^G<aAKO8U;YB+>W58ImlckOP` zzuT*`FKk%ZD8QO`XzSrso#mO}RsK@oOW}*MqQigz7Q#1qG!5%0C=qz<6Xm^xx|Dtg z=pLT@|Hp?p<}riY2fnw@rFvaO-s|()otRCCk-HzZ-7gpIBOey|zx=RNls?TE%qadY z;2ztzzeJiZEQs6MVWhM6L^9%2^ds=G<cS)@{nPEql5Y;T2ORlQ`Frwxqv>~WyV=I~ z(XE`cfK5e9v-}`^8Mh34vD?p@vn_1cn<-$c6`^ZHn<o@6l&^#b4gQsObWje$SW1|` z2YA@5#3RziDFwBG42QmQ<1YIr?bG>BY2yFbd-09V*!Y5J0yjJq-&tBOP>B_E&_id+ z;oJtW=DBHlmJWO3!8^(Z<7O^MP_iIRW~eQG!7T#EP8!xtzAEp;Yi-9Rj#IwMjgH|9 zp+MjjqxwBBO%)b=$j6zM)8TlU)&uR*v?^%b#@OZa+$!*?1Ckd@tFY7HD&2MjyHy~$ zkQ)b{_IQ=%=%WQS{{Q&oEhqdW3jn;WSx7U2|3IJ_Ev3v{^Y)>1C63C_<!s}k=KnBS z2S556_}Gt!Ye^+MQ2|<~MXMXmgt!&p=3(=Xl)f!&w%B4V?#%LCxIN%$H+OF&?G?Db ztDVGk*LNL`-lWAAg*#GuR@LTD-EG|FJ$KPnUEbR|+aB~L8C1(-yXM#I;<m?%!V2?e zTSl6$lR+8=h6il$_^sbdiv@mKt(BFraHN&c5O8w;=QM2pKZ+a@(Q;XnyOF~|L$1<u z_egRCA6qy?8ctD$JrhF4*L>q_{zl;NQ*S?9l=%<%&aIaTTjp*s13|&S7k1jzMj9_{ zZvp113B7GCkwK4UfoER-^fGDoAMq)iGIDbbpKyD?AKrONw<G`IAySh}g<|&B#Rs@W z;F9xB)Ga@FwE*@*8v`xu9)YnLH}hO}%^M$x{xBc|uya7cKAH5_yhXcstv#qu`E!6* zpZ<|{7?u#h8~h(jzgU9KEmzB9AJr@Zu;CFuYI2~k$YzUqi0<|Zj|<1*;S#>zzk*u@ z*6+A}gJ`<2Io3%8n*KbWTLIp*{N}f$m4CpYS{=($({-qSy!6I#(hw&1;QhGuQjGLC zE*y{1c14ozurS|<a13J}cy{x4w@K55&FeBv@yj?^rJxbuh^03iB8>#heqh+q7L$=5 zi8N3H4;XR$4?>Nmf~(Hh-{1IYcZ1?`ZXNi@+363Z_5Y)pFqWW%mhCrpCT#f0_?6Of z-laC%jAJlGAXLgNJds6$eu4klTwX`o`3L5~Z6~8$^<Kt}1J8TD_x;lNF!~+5bGIHB zDcZv0Q&*UK@V&sBHlL@}IECdV9M3{G{>Y)_N!%8&!>ixwq8`(J@Xxb-xW&e}n`s@j z%Ywe5$pVMD22N%yx_dweH2F?L-Vp_T&(_^#<F$|^vfSKA%T5<p$+s0Y8DN*tjjr7S zlQWAC)O)uJA8;Cz86~<2tC#04Zz*3BFht=Xf{enjpGjQ-^9HV4vyX<gg_)eVdl}KD zsq48Z;Loq`t0So}g_$g0X*5H-pHW*M=H_YN+;xZ^G3-h01|LPH9ZkQv-uBA5!?il2 zFhBo4k{L#e6IqME@|&;I4Wz<iN>e*yuIb&Xe4>UM1U5QkA1&ENs8ygkDcrG-DF3he ziODPjaMRKj@5&e`%v*`NGqx_xjeOE8_dHA*`KMMpCR%qgD1-T<fPFU{qC4b;4Lx^e zL1b=>#?{}DZtc?YX=u8@KD0Y(v<h)XV3xlOc*JFA50d6a7Sx=H!Nj9znS&c1xNG#C zkJ*3RKhv%m`I6zQ{$ClsL*{q>UD`z$A6&g=Oma<;=|y+WF28s16ln(2Yyr(sNku7b zi_#56W~*A(AXAAIGXwC5@PjW(YX#bj+4#@xjD~12Za!`bHwS#Da>%XHTw$?-lgUZB zMU<M>iEy*Prte&GmNZ*f*BO&x?`FOZ7XU(;z;8Far{%PT&3!hqb4|nz76$IKVn6wu z!hDMEZn^Ofwl45V!0qm@uVpEPb=bBCx#Kn6LC|qx?+fJ%3v2doV@lbKbz{mtGuCKK zS=faCx6L{WkWs8>VA;g&wC1hAq?ktPA$MRHW4(-91P-fcxKUJGSct(X97$WbetQi! z2z=n(X$_>o!bS%Np^ojG$n5}&($8!D=KqiM7}tHc+ca&Ds?u$ft|U@$9}a(Gx(=}l z1|@LW;tmgpCIco`s5EC{G-dBLb(Qzop$F@IiuqGdNRLZLtBM8_4vtoZt7&7@=GL*D z1F3;;P98Q@q=vW5Pbo}I^dY()%BW%nlL9NRJ6O+y!(Vxmrsxo(>;!aXV&GAY*B&9# z1|kke#%5!z26v=iIk#K`!j8ctu1fODaK$Vz@REgp=^C#C{mx4h5nSk6Wd01LtLb_& zqu`cI3q0qEHX1JnqAiV;bFAvpuKoV=J4C&KXd{VC%I@>IwCCJ$^Q#5XR?~es*2-Mk z$7kK*e`%Ae+wv3*imh}TnwGk^AZfGJbnVzyv@g}K(yUJ)-B!~r<6A4?@V};w7HRV~ zTvrJ-Ia6rG76xoEE34ZXfy52R={*;t1<Ye`H^7rxMcRtE0coo%>@_;BDctz*fxi|+ z8&8hkMxV`_|Fo8h<n3<CON(Mv;qoZn(4*^RV-q<~@)WB9cymdg_eI`f`kj|sP-1hl zCKeClqb0VG(_Kps-~B>8bJ50|TOR(qmi{F=4Y*?Q91S<~o+CtBnjh$-h!qn_T#y1& zpLBUcRDj%`mkPpVcxu^Lm;31r7eBh2aJKg4tWMbbL~mdrfv2C+byp$u)}{8&)yxQN zbY98X!kG7X6<v}!(XGpRX31TDH@>KW#&O=fWyu8H@fa(wu>NHh%L^PZrjMST#0>1! zO>{>z#T+&C#%nk(!#2+3!272@xLK5ucU&XNpmi9PC14n2%B@Fm7nf~1P1ni6yXPqD zVIBA{EG)3$`gf;`u*LM-PZKKanChstGdKKreearUgd5)1i#u&o%Pr{NVQ>MD9a!<C z@cAp2d_Yw+RUW1J(U#)g$<)ARk<+#Q(Ayc%8E<t4BbgL<;3suvi@g3;W^_xhaFEL- zdox~P5R(JzFIlx#$Wh_srCfw!_FUW1ObJXL_Hl2a^p@8;uc|QJ0$3x_^K>Q$e)H3$ z_ClWb94VtBMGp?p)%UzlKZa?6XLW7+d0<+2i1D#fKDc!O(*kFdo~6NEC;IKBT{;XM z&m>Fe5>=jkUGFe`!uI+Mp1%?6fU7C7VTe2VeDmrs-7EGsV&p>Q<(n*P0{BeVhi8g{ zy`u$W%UlD7565T*?s;KxnGkoQ-(D)N4#(*zb2O8z&5s2z_<^6@)$1eS_wGV7=FG&z z%OBUTZT$X79eTySlII+JcwEfB_<0UX4ScuHBb!8OES9~rf_pe&)5cjWVpiZ0na^(& zR&P&SZg<4ooY`0H|I)m;w^78y6QZeTSs9IKBdAMUHu|rFL{M)pfxC-yQ!;kyU<<$= zGe$frwBDW#!#P@7+XYoKIdEv{480=Adqi7uckoSOYGC7QZtN~{dyi;(b|aHY+PMyL zK^eeZ|9i`FA@!CwXTCMn)&sdS-is%Woh#Jd)@#O`JX*0=9V;+!<b>-_5Y}S)0IxBT z6L@?H9}vTNHYfwQ@7;UW7jAE5*v_NJAY#>A;5m({fvegcuFE0sU`+$6tC$fuuxy!@ z<ai6qE4MI?=-Uzf3{wNM?N({MoA<y2wTZ3Fc)p!!fh{(T>?G>#OuzlQ4uMZ84e59? zBDK26=A!R_Z|-o4ZsKCyoG<w)r9H$+qM!?Oz~A0((otmfpD=W0W_RhjpVz)_n-XU4 zRbg4CMCvT=VrhXl-*$y&Uh>ZSN<5Vt6y>EY=**vW#N(JA*mGus`$S}K&y&fNsm#|i zDX_t(rCQ<QZDf=zi>Bg|H+18k4%;u%ncjP#saKfGf&zz}yzqSadT+)uNemP-Be1gR z8CucqJ!7I`#GN80FfnlL^i!`BQ4v<<I|w+NLnDl0_J~aw_G4b)f2W-Kl<@ld8XXOi ze~2(OaQTw24-o2LPQhGEpUzZ_w}%|hWOCsDN85J?MqM=T3n+?!4HZO0lp@j&5D*(C zq(CHrm;_J+<0W@VPLjLh3M8OnZ-~7h*aZ>mi(L@~m1e`<#fA+V3U<`rJi9Y{pGz*u zelFkNALhB^eec=X+1c6I**0*&dk+Y?Ya7!J-5b&Sy6<IL;C~0L_Xw@)2r8-v;i1e2 z44kmptWLYO2R%|!@XN<fP)~R<;9pyE!y>5bj;n~h+8ba$GDv~Bef~F3NJrCmcSdH6 zf#MN*ELRN@PWSlVW#uM1Yk{fB@a_yq?#;f@1W>Lg8O|v!z5hdFkP_V)`>o9zWbU5H za;+GQZ#>CJ#H~TrJ8;OmRg*;Tu2X;H+LgR}w$cp=y!7P?Z~BBhUzyGl0{3pen~9%X zD_ENw5AO*LIH#XCoOFxXf8cuP)We)of^(AbO|J{g>Y!`R2=zL?%VQ!d7PxTyBW6bA zx}{_??>y>pvnOa)M_q@~x}(K)e%kp6&4D@3{wMA4+B-M{-8pOnz;9nUdgruBDd3L< zII-h&3O78vApKPeP7fe1ZP5C^Jv`NPS=X&k1B6^fdKPN{xcZ?pOkNgF*p+|u(w*&e ze!{C0a!wtbT(W=qVTegDJj#LsPw4BtUz*Bwv_P5DGCckl(hu!8tu=hk)vJWpwY8Q< zLSfn%t#=4q%F+VgI&k?wVRbF7k8a-a(=$fAqT+N~lWsrWBn@4McaT;Ym2(=|{<(wA zCR*16B&ADLa7!Vc*DQl%upWS~O+GX(dT>26sr1&=cxjIi5*SME3T6g&emb^5m|bgF zxo@=)qIgeXUf`4G>|>@6t~HD(tbvAoKYqEBNa{LBP-6=n^9uST{&3DCe<}auue7O? z#xNzdkM#h&=<TO&6KdDa1`9Uq!~bSZ;H9g-Fw<Vwwx-05(atd1f)SCc^-Gu?c>i-B zZ4`-J4`dR8-N1yv+Or?;FNEoZNF41a0t9D>RQSXivq<jR^U&ZE4%GU!wM}H9fujSH z&2-JR7G(Z#BNGCrMX$^iEu<r6G*-uhq;sFs6Vom?OO0-3C6zw9X178+Ty%TH`M|et z9J5fQbZuIs%!Y2vIq&OLv&y`8;@a6@@QG4D#~0DTsX%IA`H#O(5UE`+g(cqlbq?sc zL(edIs|+f_)qt-0ShONUlN}!)D0Hgfp(iICFXFoP2^F;JQLFv<T2=w@f>XO2dv!fR zD0#V)DGxS{nSr&N!)Di;>xhvOK}OtHnH0FA-|63r3f$Q37+)SXp(r6UnGaYRZ1<e- zrPI60B66kH3Cs$Nwi;z}qOJ!q6L>hca$I=TO|>GY>p?6jX{S`+oYXAYzS$(nU0VQx z@G81#G)RxDDrV>8f8)oObP=J`NL2)9I(K)R&iV!Rx^eZ#LfjH<@U+yajliwb&5kVB z(^9jh7^ApUturc}l(Fc*$M<~97_jR;>_~(B$DF{=Gxpk7)M2gX=!|N59N`F0@rn7s z;#iG#4j=BU{Uh-H%k$R@v2_=&N31mPD*YNx7kJzOZy60+4;A%DlP@cFM(At%y>zmO zY;79#*o)LF=t}TGZM5LPwhwpsMW`{BTDf-I-|4~2?XyEcf2oR}0tnTkW~cCd+>*fG zcIs$i5^KkyilC{0xhk}X8G+ME!tU256k|3?KB4S%3jT8<5#C4Q9F2Y+^X61h2WB+( z>Hu?rx0=Se8o#fQ4*!IF#VWy<+^n;?8o*cj>|P>;S%+1s8a30Qebt!PG9hr+?K8|- zLTksb2=Rw5v^LLqS2HWnGxsZ#(6A0v6ss{2bI8-_l`b9hvk8DO&$rjLlGf+1@Zvfd zQwX_jr4eV&;I!|b@r#N}+?SyuIJ(Y(RijUHsnQ)@%ged~dfz?UL>|_jQ0WS*dex>? zL(B>6IrDbo3Ek;mOBxR*!rLhG0{a~P!xqua|Aqc#pA+g0zX<F&_TCXvMh1PiZ{uvT z$PzO0yqcPL%v?&+eh<wJEPX6GM7XUTxzcrI4K-hdQMPlcbJq8zGlbN7s8pm%*}4nS zGqX;i=dwb87rpS?{=%Q-N+F8h7$p1*XW&m_dSK_hp3W9}>v2elZ@N*aqJnyo@#M~N z{=Y6AzY_LbSHc_iptpt(MS9E1^gg~I%MbkXjz3HSJq`7c36@rSqp?yyyt@wGa83{A z2z+PRDc48^+<Dx}8fZ!RmvKx8^nd-w?Lz3T4;hUF@HADRBH)iiOU)A`S8*A@g_r+k zw*6X9=v13#b01P-@5x;U*lGReW<wvU;jUYnVJ_7G7h}nRvFR7h6766LVPA~V4y?pK zGoUho4*fV6ybBkPFncNUU6lg;<OS7rJrn3Whbkm_xQ=sefc;Oq>r1H(rdjs2L1U<K zir!hO37f9v9H=}?yvGUoG49Eu@gSW!)b{xf%M5(!wwKKYI(M{UJ5wmcQ}*NCSN9{} z_WRa8l%BL&<+N%*T358)DF{XP1nyDsXj`Gpajyi*;YHcGINYN%kS=)oWRp5hV<?4H z(%n5e%y4@3$deysh~VzrmN9fX^dF@V+8D<X+=@W&kad>{J-*vp9_W>tdoUfatN#L% zhD{?(BwG_5yv?k@)2^LSDMF^9Th&K|*BMg1ALz5E@Mcgs_LVo?PEAuJJekZg10Q** z{TafIaK)aR0tni1Alj{CPT=yq+g=yWG_+eo57+Q@>XVoi*s;@`iNfkmQuMgQWanh& z1Rij}`n`qoDEe++dvNMGjxw${ch!9un9=jUDMFgznzRHFAGS7C$kwJOJ8EuV*Mq<O zPPnb-!LS04GKB!$#|2L;R_0u?`}ogU)k5uVkkyoY!FUPP7~Tvx<IJ!25K8MDR6^Q% zaTxp|n1MG>IsAHIcIOX3ubRv`5qoIe$=3;88g-XDqMUUfeq=>Ap-iI_INZ0Bbw=Ob zZwjkB7n4o(P9E8vE~d@36=sIzu5+ozrw*&Pu3yA$1T0>1*5e|p`w)wx5_AU)z{#S= zxESE0XDu)rAKlGY;JlP$RQpMtLyt2@d-TK4nq0Cw+o-H@WGSv^k%7-G*zGsbjJsKc z(l$@A)Ws?eJ2{(60PZ&IpmU@IckM|xUX@Qboy6JaF1vKD+0@`p5lM5+Viptl%uRR4 zM9g9I-QNEOjEK(E^pGVZHw<f36g(!YAb%oKvRW|12=O4q6oTir1aU8UXhG@)HyF zX1LOTv0gQyl(F5}VEdeKkI8Iex?rzer<s|Vyw3eN4DK4@ghK`{`C?s_Xg<SzS*9|g zBj=LSgBL&2SGZv{_Vvgnr)TDBYE-45JJp=+45CF<fT7jvZ;;}w^X|}?2gMc9xim+# z;Y=QU(KqgX;Ur48P}D>#J@g+vD^TvIE0vUm9@<Jv42<qI(5%T>M+Ht|WDRD-{c%lw zDk}qcLI1c}MzT()2sJL{D4-=ITB1AAuwxnwRRd4?c!crYuGygxC3LC3mJXKbT*q)` z2Od0orHN?LQVSWQLoH69u<5#U&3dr)=q_r3;8EIpqT2CW78p3-<~wc{%gdneR)(I$ zN_!C<5<6A>#JaQ0;{<7`nx5LEyFVQ4PFK_I*;|*pmYkk6sP^Cw;?Ypp`N*$xFIDZI zmHEPL-HZut+C7w%*guOE4jl4TuhWIvIysP_<{7JM$1zL`e5f?{AEC7#h7z>21(;{p z7;ey4fbko?Giu17?^ec<Af*>OA}a7FMJs_TnH%`j9t*D(fvv+z2RGfnW)_q1d&mrY z{^9FPE;$X}IITaId&Al*IY-UykDp`Gu<jI`Mdmh^F5>0QGYA+VEO4jW6Za2U$2Up| zSrd!$b7j+NH%{jOgBy<=EqcwM5?r<!9t#Li=ctygdS2pyxWLnDyUZ7E>$o@3W}2HE zKka0X$;K~dK5p)3dyEu*YZsT`kB6uG{d!~Me3lxx+eJT_9%ntc8YSzY+o<|(CI%jM z=?jxYTz4h`c6#SE#K}X{6*>lP7<`nm-%<44zWuU@v;fWLFt)>(8F<>Niqk~gG&~Qr zo7u4CTo*p#>c`AVvwMMy;UgLmc-YioPl>>3n1lB4%JDdpI%WTSv#YSC;oG%SBi|F$ zd)J%;-k%qCH<?cB0WV>{-1nTG4J@z>;7>b#Yb}Cj(06;wQ068*8^c}$Z~WW!XTBud zX($D|+)JwxKF&Eox}?X;CVw<0U9mY5a1?<t1eyU}xqY7+k={BJTwm`nZVGq#A<Da$ z9{9tfZ=EajX*4SjgN-$7&5Q336?W@+b3%B3tzRD%gKnV^;00%Ujl}Nyq{CDU^BiUd zw$Ho5T+oq*&r9?h{21Z_cm2D&S=mTiTyse<ln7?vgUg1m73HR3*SgOngm!lJj(=8} zt$As9Cr6lZJ_`)IXVbgeTP$#5WI+-Px&UTh(d%%bPQ%cQevv)`CvfzzB_=7Fc0@qA zOsDhkF+XtRiJ3=>%xRb#o$25qb|#Yoe{L5zrUj&_<IYj7V*w#e!_u^qNZoLwHU`ZC zdK%qBQ=8^<c8@8ajNKqYBjC3hQUVmd&Ge|hr8Sh##Eb1ApN^O#tY%>C=RGbJa_dOk zNlrPua7fRw>zEh#_0Xz*!fPGR)#Ek90VW1|hwf+A4$>1iUPdyj!PV(A4|{O^2oX4a zEz<*2qU9PE8u<CV_e>8-PiVSXl6SP%GB0qSC(d6YLR$}dNm`~%hO!Jf@8S#!UjJ~p zIW>U1iCe={I(9mWcV=%g*?_z>2(=|^9hX*76hJG(s*uZAC&1ZLzk9GnIziGaNhejz z4!rw;$0rNB^<<EqckyITD9EAREHQo1Z~#*RADMZ{4xzMGGgD^9*pxqGLg0dH?_42- z)~<*NvnbT38|(ZL%311r<$CR`M-t#}hwN}421)I!{WUV5e35tD0H0YDeKI|1NvmT^ z3i7i<<#EIO4$rcIPwzG3LSeS{_DWh}9#7k`)b+D@asVc)l~x4s;;H>=g*uZ|Zq+q} zIy>eAyKg+XiUO~m3r}RZfsgq<>LKLT-a^O=)p0FQtDaHELIc14x!lZJt-XctX8KO2 zh38<bFceignic!IY<0lbmiISDhOK9=!k$$Xs8;$=w4GRJV7t2)t`TLp>u}VFClz}6 z(zaLGih(;l()}Buw2oIq(j12wFW*mF1hDs}mp&3w>qt{b$K$X#Ei|gyBjbzE4On^J zdnUOzg1)=5Gh+mYad!ibEt>gm+Hxj!wZ(gBIf3ntn=?;XGu_Im{bG^7g0A}t@_o<F z#qHmNADcx>*LEu+=SIAh#!H;X)&QK^Kf}yRU3-a!?y~<bS}VZY|GCNRfppz^C31f2 zZ0-%f%<UJN4GGp^l~~zH^?c<v)&lUSqKnK@QHI+F%)?z#P;SDAUuB_z%T`@%7S7y_ zN7RM0vNKCEiz(45-NU&Au+v)=X6EQx!Dj3{j(sn1*VSj6ZSmIgFHx{IWYvj}<@y89 zoc5quZ^FdiRVOZtgvx2DjN-GrAjPfmgd!d!D)<Rt!OelO(*IoB1qM;4Tf<r^h=D78 zN6r@FG~AlcpHEA0N+Un8Mu58<zWcwz>Uyjw2~GD04ed&9Jm4#jZdfn0t{p|7CQL8F zmqrPz{k1iE4<=?DPzA7G>zvPoJ%hfxYDVZdD?}FrCfe`F)|wkwwYL8h;db3c8Uz!) zStr1(j(yt*v+KbwD^z2A=JTuy;I41pWLB(Qiz^<vgf5p=meH5}5b&H2`__rLZi8Xt zG5=*#1CIRWDs!v9E1RHBO{W!7*n~4(^Xa0TUqxJZ?qWiLQ@L?gE--xDkSm2VlfK*A z*@OboZPIAxG_)R1EO=GO-RjrG6DvDt%LUH({LjOL&|O!aP*5*c&E#eSuK8u2*?8v8 z!X^};KNRET2qUmFpe%fA?1v(-JC8;)xY}}m*o;I7N8ucRt!IrjLw$zJMoSg{gqR!H z@0KlJip1`myVgb0MB`reI>31s{j<LiBT?wa(i$I^E@9DuZ;$@mcx1Pti!B>J;fx7G zllL_Hqudf_(WV@)Go+|yiGh1O{Ir>Tx$~Ea-lx3U1)a2Y0Kd5YDr3#=;*<#mi8;)H z>?eWecRDXmn$E45NwbYXTzBC7T@Nf5Qny_rc?OrqT^U%lkKfE;+y&SZ3Q|OtgV=z9 z9X@!^44dw?;0R8fbNel0PW)W7fW0hMy&_DHzf^nFUkV{A>5<)1Ux4xla%JLBRx|ME zLk~2&Dy(hSS->oBfbJvF`-GM<F)*|B?`E~b+G#q8DZor5&a;>qSn=*8b1)*4zPr{5 zCDrI18@lR(6JTdBIdIM9MRP^r)<cL>Y}$J`T|WbG3ey6I-0=4<hbzPTE<43fe&y z<6Cf@+nR0})^4~^TX&QsYHC5{C9YwCfwA-MFuUH;QZfmwZI4CHU~=I3`*i<SM7B;U z)fbs<&UxwbM^Aj$PI%L5Ja4r(qHl;kg2e^KH*Yi>>9Xm&YlEYW1?Azmx|&gJF39}A z`_DSg%pB9=#}1i#{1-64!n}imqL#EQ#4PMOP5Rjfw!A2;qtn#Nj8K$zwRrgg5A2jj z3<I2-UFJR$t4*X(xxW)b(JaI4bWDNwV`dXhT8?Q}ly*drZL2;5GlR^)_OHauZjQA2 z43UOuie2N4PFLjDGdXa-nHQO9YI^DpRAL9S4-Q+gJ5R3$+H^K)$h6q0yJM49AQ<QV z?o5qT-E`hFVk&73GIW*=+kTYTV_7M{MNdpOzAr6}&w^8>^PaJ|Uc7-ppgDnWUfJ#t zkvc6erTw20`W)s3p7&7emJKnfw-=1q^uk#pZUz<O+DpM>lVyjw0WpPyDuCgCuP`E~ zrDswF?9S{5ThHXct%n{wK?G0N{W;E)D}4`Ue&Fv_LyT?1Xk05sw<FGc@~#8DVmpb; z0A70MvffgM^qdMUbJb8mN_wYL$=}iXL}5<Lc_Scc&~a|Qbi*6Miqc%`Bw}ct6P6Bt zx4Thj({dxE<K!{H8Jn%R^&6w)w1lQ{IH>#irQCMFFAnZHMubkQpX=dQ>G)*k1rA;J zr`hL-xYf0ez0ta0IY;nXY;+IwN#NR1J4TAw>GjEaVeot=2R?h$?~e(&y~p;2N_}P3 zfih2_FXYL_C#94V+i0nQ8w&=SG17XL6sFT;o^ZrpS(>=_{TY@Pcz=gS`irz_kVeCF zAC;2yLM8>C`NM*fgw%yw5=kTeFfRTtrTb#4%e>{f3%<hqz>Syv^1AT5a2dj%xIjZm z-k+I)N6k6CgD|^r8Ny755y%-S)~A>icv|k8V}&&hCC`Y5_)zNvCI#NJY~X!DioJ4{ zeMCg9ujEp1L|#gJgi8Tl-TC+<q!fE=PBywyYDcA$+n5;mb?rl^3bA#{HDS$_B){UE z!kobSuSje+cHu)sB?-GIr87K=-8tWXB=+Mtk=TU~6?Rs*qWy%01}^&h*j7So)mft6 zaKJ+^(BVHEttmy|OKVGX0Y{9_Jz$;;X9qlX`ZH!>)XGO2esa##a?TAp&aN`=lBJ{5 zmm3j5L%EU4hTOn2{yx*ZY+#kuG;(_>X<X%}{l(ERUD@VO+G6A^;rhGh?<O^{$`Cay zfextAWjsz54dW^Rv#Z9M{bE+*j4GfaT;t*YRN&-@v7P34{YxKq6zTJ*ux9&zGC5r$ zR9+b<r6))O(JIoFs);hriChC<QDn85OJ=w(q@e*7GB<Gk_Pz_#uYhS}`zEmOUE!** zudLFep_CecRun_w>X3E{9<BuN@UJc%FO{%b6jrT}%#Xf+Jb~jHFc>^K0`RF#hv!NW zR>4q;BIu4G?{sQx_7Bb^Smc<kCR=PZn5LjFr<cz4uy;5M4m^F<BhQN9@I-bNnyef0 z5jA{<!a1uN{&un1f@tOGQwU8*G#!l!7HAyUC3J(?VP!SwrDB(}0?;Xlfjf12-7gwR z*IKwK@sPIcrEtnV=bt`{q=>Ye(>y_nE(76#8!!I!S7Ekym&whkg|G3)szN&NUBCqZ zPuTwJe^Nlp3_U2DZk+z+WncaPp|@AQ_A^8EX_$zI-41nGe{iO9m(#cgz;&&snP>^? z%XSu@x`^sfXnH(c8jl22F;!d)aKGuZ2TD!sTOxHaL5VG$^*Hj2*UUYe_5)YF0%isx zu{d9X<#d^IPP)!qa*}pC*bgoFEo=vPXS%Z}Ud>PFA}@k20bH=)NRtcrzbMCf;@G(? zJ?f(u-;oASTV-sz6fuhF`nW2<?&F^LSc*UbvL&YLD)K@XZCPRV5rBPXq1Z_JdO0?= zmLka%2+|D@4PvAxFKxe3H0L6~rULAZ*hK)G5ZqNWq@@}T8?6H1@z(8(E3Ttqzu)IE zpCmv{DhZh)^hDqb{|+mbMz9YE41bEIC}wuxe-~GpJ!2TD?CdqcZa$@ox1Cdx${j^% zj8TSOOxD(CA&-!LT~gYYGu-*$htuztMzME~4Qi9J9H;NP{qypCDaU@;O;JumPcoIQ z0Jy&GNHbrw3Ja%Di0R3URH}0gS)q8)aVfXcz5iFy)r{v@HEp&@6!8QaEh2Qes&Yt6 zSWe(sXI@|&Qie4hX*m|6J0#T3fuwBxT;>M$D(ro@sM;!~SE9lm>AVju5&M05)shEO zOkB~0fg7h@a=uVw_H3sGY%9t!w^Q_EKH#mL*O)=mzPTW3AXr`<_mQZWFzNI$MqLOB zyyo?i4kD;kI?w1pE!dXMq-#7?qdB9~_3=y0!oF2@Ns&^V>kq1HHSriYFF!fE;LuaP zGlysFm72Uk&c{h;;ELl<2}s?o(soKrx+lJ}(jU>brK<iq>l1j)GxN+0)XH}oeb&%z zO!T~QX-M68pHM7j4`?mmd0p=^J7-7GcRRE42jex)i-(+k;H_mV%w7q59l)@tkA>n9 zO4cbIp#MNhVByej9}vA_K(Lc?G-b#Az8sQO5kAX=z_GV3Gl_kxsKh8$8>yb7X+fR7 zcH?i;%s^|ePTG+~4{ApJ<@_dh2}=s>_k5Y@PWDx=ET_|bxHetSBM)Oj;7*Y<?-E@e zO<(PFsr?>hX=(eo9HVsFQD(`zCLd`vu{H`#bkYi%wQH4@vb?~D??1$-)Lvf7jL?<N zu{x)f&S6$yo9}KnTd?g}AtCY#PF9!?>=f9m=7qgPxAt0?7}WD;UjcT~CEPVU5}1Jl z*JXYs%orT)T5UG6IL>L4Gof(b-(Q+7*!C*$`OD&!rC4~Phd=ln(>W|CaMsE*W{aQ@ z+)mIj{va;k<|jFhZmla0y!@7R2MV9PJ3&LK^sqNlsZGk6oL{+R#2vzE-%Cp(UZ~PM zM&LC6pVpjfwhr1i4{eSQ(-@j)@qw&J;0FhFH)E51$1hfoju;uS^aT?Fp1JAb)lzGF z<4g)psL5$pi}I$}@Bn7uoRL2mmv28ht1Ag<4{07v9!=AK(@N6<U)#IKneGM74$KT- z%pYAh#UBYJbn6`VJAX0qZDF?8ZML75is|8FcB-W;Dsb!9|C-at_JnjaAnIs+=lVsL zg>%gwA^Rvw_4im6?v5$tZH&$sa_|iYg{0a;sNL-PCXG%qFd_axqXW;Mf7M|3Wb|x{ zJVLsI$$)qM_m<g7h-{dhWPxa@KE8bgQvp|f-{ljL3v${~C7HQ;W&>AHYg5PM47CQv ze{XL#hS@jtByV-x(a=s`^h=-h=Ej+9YjKP8ij*>-(IH=5a!87aD+E?JWmu`G14ERh zI?7AwAv_%9DlM<0^$V>Cr+fNn@-GhxuYI4_YK95WxFmr-k}D7w_}M<EnDtouX-P4{ z{21L1N(!NKF|y0xAtnYc`g>2a-3iG_J3S=a$IflFkifhB*IgoY&#>k~-Ss?#!Uvw1 zXuVbv2NVEYJz>Pf!fih)gImI9>G>0x6?o~?4yIGsn=N|2BP>Ol4PpYnd~>7O#Nu*T z#@xXS%UB5mCvd_Yg;i2@d!I*6AQ~^zVR=Yj#Jzw?fv<P|aEOrF$0I5oVMft2nGg8W z8_&)cK6|@29>p0sIvePYf9rl0T6^=%4V3YQn%&!IJpz}#v4`nH_Ti1zVB+oVQ@GN= zv#&kp1(D94F%x@cGRv|1LWK;&DV#%F1N-z}dATs!Cv_$U12Hq7t78Fyv&O{Dfq#21 zCy_^HC2g3gl<f80%nLmGl7TrQroHu`H!5|iYG*JXF!STEi4*O+&171hPQE$dXXXUX zn9=oYk<q?y({)tNj6)j^W`M_TnRl`f+6S}6^ynQ~&ur6cma&Y$E*mzR#E5<SVEc|A z*{h_4+gZ#DTvz;-@#-$xM`p*WeflsTaMBgqJW_T0_R-k@XV;#^oWRoUAKWUO_9MJW zILc|vBpqDD{J@<yZ8FPjne^3eWXr6s4$aE03wmn;<%N2(9N=O8S|$fR{?|0KHP*hL zO2<<A-HW?DaNlWPUnIJ)AKfzPL{$|jIZ&P$kKrWYOn~b?xMDwHwKrJp@Eq4?J1564 z^~=f?%F$GWol+adAu94yYS@>17%*%0guR8`KFZO9{ET=2dE!L!)j5phw+$X3#P+^G z4I>HFhFP`1b0@YrLI^QGvD1S}XmK*DklBELAO4BSHrh9ob26_~iJzkFf%`AJXD1Ob zgTC7dsIwS!ST7i>m&+((Zr}q?-DOrz?6pa`H#!w*+~8qM2;A`f+`mLvdu?XX^}KOD zr1B425wPusNBas}2C>^!9af}gVYJvlI{;(eAW!MbSW@5}izjUmZhJ|YS2YqMI5ZM4 zxV&GPupLj|?IbPo$KsJ7mM|s<s;lW18hTtnQBP-T;A?-JY`m+zM}ZRRr^OM?L15s} zOJ<v-yZyLQQWXi!G7TT%rUEW`cYduXz<yjIORDkL&`xjKu&G0+!7L;2@|RvrLq=Q( z6DW)GO8w`%={f`N?mEZhFrWjwMuH~8>N+k*$TN+_1U_;8o?E2q_LhW@N3IRarhx+u z104A1ik*cGmSrcT@@>g;<R08Qz_!nIGy$`#yog*^=xmnG$KLpzNQe}norLJ)exFH$ zCd-N;0tx_5Kk=u|LT~RvRpQPWpg706UpHQ94t!)-ORR#kl)*_Qiwo>IwYRwxz&?J6 z#(Y`kjHNS&dFayiCYxa|s?+633cumZd#9aG?IW7C@AK409b1r{NyfnwR_`x-?)nps zcF+)?m_m41qYA&e-y|RGLushMBnV=1Da{n-1@`@U(@P>Q5>!ptZDCb-WO0nH7)1}I zEsX!((^}alu-~xm9|%palr+9j`9Sg*H2?7A=Vj%LFU}dXv$k(w_piDPl;5Wwa~;2r zM#?>f7{rMyo1Wpq1y2y@KAsH&*G?JnwGgJZz$OT3c1?6k_S5nKi{4mgW?QMPq!Bun z6MUy%p!tA-A>R~;c&Qy)eLk%^bwQMgvx#&?PfZFO)AN4wuwiP`OHHcsiIIf!A==7z znid%MRGR(nsYkI!Xsg26p>j=*`k%Z)a{?C~x58wm+=!Zm&?Tof97)g~OCc8AByjE} z|HMSCsWTR-MMbocU|e;BW(0ou$;oETz>T1KMP?$u=ArCq)b5%V*gy8lQ6gyS;jx~e znbDXhF^H2kkK&OGxb}^<ON9;D+J>Dt1)I7-h=^t}5%BopV|Ev!)Wb|8L`JkITKaw- zx`9hhKB+_~Gi_xnRHoyhCh^vkcq`R(O5~l#ZUeabz6T!{@+_C+^4eZK`ahW-IO?j8 z%t3~1m-I^Z3GrBc@rROgg1G|sZB=8AIh~RYKfROg_t87a{^~la4qYDS%c4O9v1t8b zALk|k4lnLvCeCiPrec*qd42k~*@%D(`g~-9HH?f_)+jBm8XmWuNpnBR%)k|I{%P6+ zp^O`5tewyl+T6MmtzU)vSVO=yN9UMPG4&?B6#YP|0Hfu}TS--*K{-dW0RXqW|H6%8 zzj-bzlpQL^sxLjk#vf!;9eUvPTnI3~ZGpM398r}UtqHfI5X$b-0Hg-oeC{j2J=YF4 zN8jAGO@mVEx6L+g8{ny5oo8kiSd(aZb)c{kE&+JP{WVuftBh-L2|+qdpf3-lV&3Os zfPLR6c}0pD?XsB6C<Rgtd`p<y19<VM&GUsl+a)_^2J7lK!$7tw;K?r?zef1oO3zdL zdY<=o)(!B%v7Jr$=C%n6)JYnVUHM_G4T?iKVi)azfe&{1&P3I2y9PUy94zYj8uapI zTp8f#!@f0pWK-use2L%~!7T=R@g~Y4CT<`j8(KuIi4g>N+1qV@l~%}d*~-QK>WUNt z)MAz#_}k+{#|eF=OZtL9Z6GMEAj-du$${RrUH%aA(JslgcIva=LM+e>aOv|$nPX*c z*^@0uWPh)%W(N-YXOtNr+_I~DQ3Hc<TK|T(Mx<?)#xqDKP70oWVh;iQws5Q27c$YU z{xQhqQ{WM4Chk~H4UHxNPI&L>bEUz@x-8ICOSer@rM~1!0Uvl_p-;+i+t(&}BlRt6 zG<!VY^zmPsIjZY{$7~|1U&5ZOAmGq>H_Q^@k@ayiw3!|u=GvD<2kv)LWTg;ixg>7H z!8rrUc+OY%3w^dr`Vv1~N=$}SUoS_qn+8t2ZSPgWpW%{!V$|QDuRX##2fqKulBb0` z$0awWjhWQ}Z-WA6aRI;)eGWByy4=QiD1f%%L{m<LTCv#!|M$e|W2F{u$4gTSij8TX zZ~cb2gY5_ye(kBvQjFU!(0Jti6l)8(&+)e{mJ(7Y_M00k#r{W79toZYc*mJRvpsc^ z%SJAwMVN^}w1Uj7@}g81`q%oJdWh=*oN~~vCKF-ZmC+I&nPJgqsY(%#Jivoy+<uyC z1u0@R8F8@o<(U<*{{_$8B&=466ND(5)xmf*sTL{+zBTPNGeTM=P7EV$_Xw%=AF2NF zY=OYJC9i!Zf?7{Al%SM4@~P)Nyw&)g8$u3AZyS?>GPy?qM|sb`T?$H_a7|%|svxxi zrnrh8aTVTP?8|^_J8geict_isqT-!UQ9;>vy|V`YAnc{A9^lx6Us)&Y)&ZMlSI0$^ z*qGi4c~@2maLu~?e-UzbHZ8dpht$O^HSp^%_qkVy$GFmobV*d9L32LNvID1%*kojP zr<i(nBZ?W%<iJPfW&9-aXSk9-VJl9hU&`FTgCBUy?6|bfrl=MjALmq%L+kHzp9hW` z@n)JmR7veL!Qa^P0Uv$!78BOH6WH09qUPth>i|7n2blb}b^NGQkx=tQy8OmV%Pdam z4`EXTZu+tFchZ#Z+?GmBJ88SHQh<ltG05b*N4v6+JS=n2At4+<akA&K(7+?V+i!#j z?XF`^Nc4KqcmazId}T?|Z9?qMu=9NMW=fzU;Ey<keu&Kvn0xRR_dU|&|2^tcF5OgH zC4#@rf&+g)Wq&jK!xj{)NIF4&B5oJUoJ9-V=HGNeU&<=%phr63KTCF+CQ7mn@C>i6 z2$nRIkviSLKHS8>VfUV4l116>D`bj;Q;<p=!>s{aP`UecQVHvpHmr$C2=`4SBSHb- z;0+&)6YiWA$gUJ51>|yT1G5)gWKIjEK2o1ztWF4@%?VWVFUf5kXKxJrb-=9Gr7G3| zu;ERpDY=Ao+z`MQ=C{97O0XUaQ<MO|LB~r)UF*3B;2RHL_pB7rlJ>~;R!2<~avT=` zEF3ax$p1+Jv~k`n1gzx(fbBZ%db1SJlHO1fiJJ;Id&4&`T#_UFS+*7nRZpTrNOYdf zL;3$89hl^=NHA|;@qt@>D}NVytJP%0#twS$ZRFKNVCdYx%`%vEteT0pLg_ukdc146 zUjc9NoYzI<w4N1!j}Oi1b@Vm;v?~B!GJ1en@WA$&X8m$LT>?fs2JjcPez=?F0`7iA z<wYW0=LA<d9j~KZH7U0l^muzWvlFp<il0RNHFVfdHYjxCjt^`*y6OihtZ(DLMD|vV z*fXhbK;Tv6kKhM^uidoY7sAoIX^vtg2nb3#Y69RB<s;3c^6;h!aLACRH#l2KBxP(Y zz<BEs--{FjnkJb<kq3nx6j+l!!E<(r76ur)BzKtbV227frBOfY5*ktNi4GA4W1i7; z<AV=WIV=+JoasGNZH#S(D#5BWj+0v;er{JSBe3gvz0JJevCX0x;(~Z}ERbLaX+}>? z3jA#N<XffUj^5TBDNgy)_UmNcjTF|xJb({Rz3&|1bwqJCyyHVb9jPcKL*SQ~82Cru zy;E%&Y=$^l(7&m-LQvpYe_S3FL7Q!PoOLBns17-6BRagjrUKq|?dm6l>aeDbNV*kj zw}{&q*x`k3J2ge&jmPNfHaZ$fo8I-ar>bMlqtZ|z;H93uO}{!cg%pNDZ@(r1X0ZUk z4u`Ka(Z?Z8{W=_t41@Id?4^qa?%MNKlkz3oYS4>J(b#SlD96uVFW5y%4qP^8su^i} zr}#M@)>GTcxGSrwZ=)d%RR`{QY|xZ{a0&voAuk{IXebBp7v<FPQ{d2yZgElkK`DM3 zkg_54RoCku0>7wzbG`hqNrlmg)@uCtBF=vSw`C7E7L%&RMqz3nU5(zVcHR9uE3ttS z-WgOYrT0l8cCFeaK2R>V<IQS^^H>1v`PMP!nqJ57ZTeF^26(`e6zN!R&{wS$c_w>O zVD^~JyNE=CnwJQCw78=VSdnsqJQV?ETsYCVChDjStSN<Lg;ind=@oQUJaOGf8-mfi zz#~q+&PX-Tj;mO|d_Y8g8jwK*{9@-R4@mV=wOF}#U>OYx)qYQ5W=YoAoZ>;T+SsF1 zA_#zyvYN?4kjh>X1l(B8fxF)!r<#0es)0N4W7;U`p-tDcu0AO2ubF*88zlg+_m30I zmV<sNRFU9Nqn&rOsty$TUw>T<VC(s-%w(Fvmj;caE^<y$gR086jJc(95$bp5Z0Vq& zKNNIMj!wuw{XEg0BZxEBs(uc+m5ZhkYBC+W(YeNGkv~dfAu4h=+duHYYhN`_Lr}d^ zSH#Jfpt-h<)(7x`*tr1_%&|qY5y4VQ^&`^(zxiyc2_jN8baFitBDH1?;3e^U%=$(u zOEVmWbaD`CnV6&N1N{1lPt7Re*gV%reMr%m1eV9fL_+bfL(`YCJiw)o&;D6dlxkoy z@)XfruNDHm!T~aH<ey9bkzc2Ze$20Fn__L4QcU!2H>C&keI&BS8>F3iP5_KPeN~;1 zrs@lZv`F7rpHTF#%mR$}@88{urI4;oPuiKf8;=FRA5VHNPgqhpVk3*HQfhVY%<2Ya z{qGoa{EHg2al<YgTS&exNN(7#BO4^Sib;imiaH8*)RHM8XDIJs_RqlcS080Y+kD#s zSdqw%;sO@gT1F)%mGeB81Dr6c^T(o?Cc9RHisV*%>FN{`+s8uz@WH%eOoZcDRBve6 zLPuFvZ-w8fa7bT7_l1Jm%TpTQ`wMSrEs~D0)re|NlkUeJmio##o}~xA;5lcE6p<=k zH&!Cj^J<0aQ}oI@<zIs$`f(h(0lWXRuQ@e(XhL*9O@!2o(VoO7_Ub*@i2~Qp$vaM@ za_p*3{3h`Ut~7^OV>vYeNRu?(na8~f=<9dEa^ZCJhXhmNQ+-aFvD2d!)Ho+|4S@%b z4wz$rjzB-blK51g4^)v>+BpJ$>3iWS5v@l;S#+nI-xKtm9t{NtQnXhdlezcNtSaD- z*#XmleVh6%gvj=nQvyN-tFP>%%Lld{vUHA=-z-N?&~V(dx8?wj`t#Qtgu@Z=M(b)S zLcux@rBkTyO9cjS1%PkgRk~4r=oo_Q{V*?BfvYztdt^Q(we%$RR6u`^31*;jv~;74 zIdmr+-Dz)#(LC3V)>Q+xJ?k6O(hi5wC|@p~vrne$)kV_*ADhvthg7&%qQ&abjjoF+ z9}!eT>DSaZ5%B>F&t75<(Kr$v^?sj44P6)t1Y>YCnq)c6VL$?0I<d$I(YV&l;Nmf# zlC)mVMhxtDz)!2CT8(Sn@OX;oc1wCA&HMwjelGI?pS^mq3D+H-sa`eB&&e(*trYOd zMql$kfcI+V1x{JKj~T}fYgGNT&JHtADDSnQT6w^A-LEZ@sye!UJ<%kG*nr9#&{V+7 zSIjXBJ&hYfzIS$ALX=1+{d-_=|5tj6C?uJT%JoDku8!k6MGs?A8~)5b5?K4q-)1+o zW3tr<TV}L85MWAZ`3RoZ0K0AI;T5?Y6Qp`f6#wY!4Lyl7Xham|&J1i<`G|>J8#jXl z5#IRq%qox03ix7Gr7>*xFP%-dUO~VG`)S1i-#cZg*)E?hFO{Lj?1Q;MfRAVYwN@(b z@TK)CF1C?q)K4d9*?^xfKVyw>I3|U{5!UltPhnNqG1dK~ohAT&eE8NQg}{-@txv!s zuhSc!zih=s`DKdUVT#rwOpFC|CU+{Odf-}s(a6^i3xy+xP`~iJU^ouv<oBxW^7B}H z;MQJ~O(b||L!+)I1X^~*MqNH|mmNK>mhw{=vH3NnS<M?7xq%>$i(XE>0#CbZo;jQD zn9J3#Nh+GnTpi%=y$i1rfgE$6hBW-hcq7jCEp}qS-->(o7Rup`Ysfgkl-_n569Q+x z^s<R!9ZUO-%gC0O>!sWJe5M?<McyvDEr92L`<PGUbfj&Yr7gkhnH0Mw5ud@c8{p-6 zx1KM=N7yJJKU7I~WjH5po4NYHd991h3Wggwi`A3Q^%U?HyD#9~qaHAqfLakZHH@`p zR}JiO(hDYW)RdJ6!j!oYcT<ROXrmqMv4H;gk8g@99h27jZKQtdp~0-yusphlZfW45 zj}>eX7Ej|1qFL16q)})K8x8Q6=k_>Ts8Wm_rUR?0O{Sh3niVxNg?JDGj$3m6Eke{g zg-oI9I!ans4<v;gc|@w%^xK0Ln<POh2arrq77Ee(rV*W0-Nr@$Jo}Bk%-)<-PBodP z5YnKL%9sLpLYswV536IAX&Nb+A~76BaVFVw0!<;3Y(Ix>A2_o3db8%0O5H+Dv1IkY zN~&HJ&EQgL>-_5u8Y}8f)hAOEC28$Tnv!B10q*?Q=Q|5siqIyUnr;jW2nCL$;RkHM zf4e_w(jlolW@<Jg+{nQotmMG~c;hoUX42G*ag7|3N?n7u?q@>3W{isnj3kibb9My4 zw#T+A6g4$tTtrhyS{VY0wM+q=_rG4o`R6v>Pl%$vaizSIgi2V#HU=Et^`ibFWQOY! zvL+Vg>qsdV4^k2LB6b(RzrQ)5M7UE$T>i++K)HWlIX#(-CH-isws3az6sAiny!ALp z3I14;2m6zIEAa90t4|k^QdGAgojD@xDW?8fPS=t6eZ{&^RM&YdGGozwcL;ZiXrd`@ zK9!}GnD6BF2lih0UaEb4;#?Y1vS>!uh{=$AzNhYTz?DyI_(~*oWO16M%@5IyvY`ZL zJLUxXr^n5%ixlH&qoPu{GLxe9<n+)doQ437S+sPX2%EyeHcFh(L6S9m$c_v+YeVHX zLfxFF7@W#FJB<6$<cFH`6oZpJ#SZQ$z(3jydO_r9&QlClo<cdjKPeLlFA6Ll`?OhL zOcg7L7bTk=sVLN)3^3tKSRufDr&XBDeX3wHnWetJF?|KJTiJ|(1>-(4V`NS<PG)ce zH<s$kaVlU8dokcU7xy<iWE|%&#GuWHq-$Sa?n2tHLZ{GG-rISvz;Q>GjFe_cF%xZu zRr^JC!x9yH8A}U{O`B@29dXaA4w2~#(1>>w^8zdHx_q0+JGh~m$<IbZv|c&ZUrpD| zdrriImz3?-U(saSD7g=N0<IbS-Ads~VcGS#N>I%#KRpghH2cw16EwilufJ(-j7X8q zsz;NJ``YP<LybybCj^_yh7NpqkJdRN*uZ8hN#2F7%Zx@x)1!tY+Jv!MG~l-tId=+C z^V(81EcQEgC-r6n2hKX?sma1+sjVW4jUmz`rUAD7>lGtXiV>uqwu*HIw_!VuVRZqo zx%;QXMKZ^AQPMN&QEHVZ`O8yz^aN&=T(e2YQUreW$g=$yFT*roBwF$(o_zyfJY~bb z!Zx7UmedUptJ7h|ThwB(F<{BIN&5&-^Hoe?UT3pVz%irFxK_xTucAtos2$gdDmwS& z=YPD&tN}D{7n-BkuU0giJI(rMb-z@EN-;jv)4S3XOl!}mRub@^g^P|C3QKE8e=Zh< zI~Ufj+4+bQg)2o&R!<!1f_Ze1Nrev(ZRLSlG~mkT+utN~o@VWU=&*+*q3_o_X)54h zr(RnvRDGMJN^pG79Ke8ojX9RkJV$oChMXy?bkc5G4&a<uD;~FyBTIYa9ITQlXYfDf z0ABv@i^c<|NEM2fn@JU>2*u==S)m$wb;qZ-NqKT90uM#%lKv6Z@^hR5oP2iG#Zs*l zp;&6-B*rAyaxS|T;D>p?zLo}cFh=_`{gI?HAoc!~iGqIsZhQK|y@a|6Kco7xM~~X- zGk8|>yb^d%=v))UqzJL3_L_%QJ7yY|=h#~Tr!0H%50NHCdMKGiG04IR<hh+)JJ8?z z`h~(o^XU333@Mnva2%)Ffln_z+9Vj7a0<Fc>TfolL{R4u!Bs*PfR=%0bsBC?lciW? zN+FH%n@I+d&toBQ#orfplG-)l6&$i9QQb%@pAZdLv+CtzgsNEsP=pi0h>TFh)4FON z;1!2XH-{@7J5%b9rCKC1BubzoE>ho<gqzKV4?O3*Crl!?i6KIh>cck3&qKCn_t&xk z_j`GeSy)JsDG>FW(a$rP(lKF(N6B2`Gyg-9pwDuH09U@e`|hH}CcKIv@-#)9&0Yog zNr&O53GwL0?YL25HAW?g9pLFB@WNgG87AyaG+NW_(DrrhwYGux<yD&eWr_)OLv3S+ zQaycuGsJ2D22Z`>3=!0E0<pezH7zLZ?<t=S=Kk!sfP25R%_z8uuGuIv_*V7MwFeIT z^z|tssg)(9sJ#g+p5V3u{xG*!M2L@Q+!Bgu*_@^udicr=hpQ1+aDP3DCm+CRBW~DL z=$del^%%PRPuCQ9^o94A3qupm+Dv@u4jdK>Ivda392gxi;zeO<BCh0L)7b;MUxM!c zaj^ZwEdVUK_-wQO)r4HahE-|@Q!Wnyz!%>;%gk|Ym;%w5gK57GT35i$OV*g#XA^xw zWJ2IXpHWL{ItS+pj>Uj=%dRx@`X($*IQ62Bnu}`VNb(9R*_i=9`|h4)(i}~U<wEQb zZ&e|81j0UdU2B#@EtH3N)4|l8l?NO;W6^w(XK>?|FY-_#ZaS)IvU|PQ?16X2emq6E znix50-3>brvUCipzrkuB*-KXtSUbCu$-Onvrdsc`^Ng$`Qs+tj3eIc_!!Q~HPw#n; z2^5;@33;9|w52y*mZ=UA({@6-<wHl>Jy~%;@0@%0mC6opQgLi)(zVFw)R+qKPT{Tv zoN?(cX8A5f3QSx(wM0Y0Vr=G6Nfi~%2RWJtcFNvqoyeJKC8r)PJfpqQszhP>A0hL8 z>^FfU*PLR4=OzaK1PzbP4qa&Cr2g^;_ZMK-2iDvs;x}!dqLqX$Anh~E1-$N=|4i2P zkS0_Sk3{u3u;bYxf&Xj^nr#qGB$U*YN^HAC9{g7S3UN+n<pDP@UjDvRt%*S=iBVg) zp?jYlJ@ARa-~T6cO$@e4blj~C-*Frk0B;+8rP*pauyJiA@fo6*nFx69BR!XjU`_P9 zWFkChV%QGlUJQKc)2|l`TXXG@Pi_HkCVEuXQof-bPUV;iShAt5Ul^OHs0tiBocl6S z#8(vB!NCAq<;=(sq5+L-OcQClH$3_5T7Wh0Jl;ikn((765E3Ox-KU5nFyP%KT{jC= z6WvF;e7vH<Pw!?VI(s=A7;r=HZ%ri8M7oQ)G$aWYW2FO^{d>~_5v&PaF<ByxL*tF) zv>EW#1*?sFYhom19z8eGU%>R`p1SpbBOX1%WCfehIy3R;m7qGDqX*#jW4oG-k9`|A z1g1)GRPx*rn0-#(HKL#<>^xbVVtw&Ng7H4~V8DN?em9HpO^m6@jQU$rGY(;!09J;l z*^GkBSrQ502Hw%i%o0L|xO)S~4Zq76Y!gBzQoM8yCo-M(dju2zgqEGoc|PE^e>}Cb zsIm#qm>}@rM%~0$@a;jK3;i6J_rL5h!q>#iE<r%MtR*9zq{$O`a033k>B<2@+C)!H zFgZveU{`h^z*g@(cB*itSm%*Y!olU3ipan6yrwsI5#Z1(r&kDX6C;)|(AMmeYN`|8 zAm*UMv>t)q?zPJsLTA@5*tL?(_cBi@fV<uP>082=-FUa77fR_0QreJBmq4GcJB%mO z=i?sDLt>$q-eV(q@8iuwz>D(UG21hmm=u_8HHdPM=o}xSEC-!&GyemKH*zEZ%<*4i z+N+7>7xVi@wgawcrF9D&JnG&XL>EnjrwPhbo3B?fA+W6L-DeBo(TyuNL0AxoMrppR zVqNpEsQFH8^}quICq68!O(b^B?>*z?RB}qCe$N5}-<WjM5klRBu_mY+?gxCD>41OU z^~~2o*F<=ppyO?OI-_U)847To58FCo%3VThWm8S<27Ha>1=buC{z8bGh`MAE&y!UZ zqCGM46=H7T5e@jpfF<_}TN7?sevSaRB7o&o@*?t&;5?jNJ#bY{y90!?i4Z`3Zq|*# za~8XI;J_POy(&CC8@Egj#??x3&Az&)0Pp$v60>`z32$CP^D8xLRb4tUqtX8knew@A zz(238G<(Z3nv#i0>Fl?@@PS=MUbHx_-h`}(D}kNKs*B$J!i0xS7&Z&+@azduujUXD zIDN&It)jjr!e6G-V5a{sv3msm{lhuags6!Ciix<Q37Jmds1Epa_^f+{sz>AM%c7eK z)DqYfHdWxNecv$a^i2$;iM<%*W=1`zjOM%>SU14kZkyd#<Y;1qN^q40f}W~?k4Be( zN|w__EIakmwg$Xz{*sx(m%>zOiGwyIA^kv`h(q+48Cg|t9@l}7-SfA}{vOm&E&TIl z7Up_4`orRIHFnd{sV8+dVgP3mfCvBZ*9s9lMT2n3xn|G&nv-;;fn_(JRwBPm(ZTq) z#zT7am5te?!g{-?SF(Fk_~Ef;E}tT4-GDTk9y3tuj48*BN0}M;$Ylj)!8*nACo_+! z4wa#KPS`_N6zJ>s&XZEn6djX)3D=>on(<`QMZSrzpu3Fc&A`i|J0C1`Df&}Gx@4*y zJlg`kFm$nrTv9{>4XMV*Yv|G3WWs~FV*m^8+~4f(Xk0eBolV`T<3S!+zMz`RIRpUK zE&qLyR5L|j!LrG(mClOr$Q_v~(aXPsbsZ}Y*ki$wR|{*35V$@o?4H76$`-^L@;=SH zz`wrjw3F~Q-o_%8r<ihwYAKF20WnXfNE%ZKVCHih9uhi>$`=P_`x~kJEi5GPofAJd zLN?yqMo2oeTh*}EtC<k^WYy1Rk+1PCYzU!ETp!brbOlGfz)@GWH|dfT5mo&rqOd(y z)kx)UWm$m-?PxVgRGK29s!v<wFQ<GTy^3x;gj54<^&iilfm^T3?k2=3qV)R2S@CEr zRMSueM{t+`{A2Z|qlGfFQNJt#A?&Y?`x25iB)^dRD6s0biZ_MaLcf#Bqj_r7@inBq zl}#47@WqGE6k1DLz<KkAq~~y>0jKpp%}iG;8ckg}MG0SAchHb{H4mA<WBpwY6=?@F z)Ub~)nx`<e>Fwao4Yw(hU#WTI2qP?MC|f@8m#gQTAVQ_c?U?<Y0i3U(K%fRsMpIxg z-h2e3uebIi!1%J|-wLCrVKp0NOcg6Q&TOP`9*t5Z9Y=6pF4{AEZwHYrMZamDP@lBe z$YTcZ`vL3s5z1T_)lCFy`V>sELa*g00C@Svb-ks8lC(;Q2LtNlX}LE@mm8LQDG^dm zLw|^FJml2MoCUf8fe)STe@e>BZ&`Vv8j3<`=B*!xBtyxjW>kw{g!9k-r@fR@)UtA< zUWgJLwfZ7kmj*oS-7J%lp-8a)PN7DdKG9A_i-?+Hfik)sEmqe+lc8N&sTu;yzZhV) zucesJm@;c{p(CluQ@|h4r%sr!g$JI0_ZqVxmm-VXkf@o?lp;OdkRz!V?Rkin2Ke%i zull6nQcP=_VA9=ZFHXDx^LtJ$5U!@Wk5N&>_J{>yv=hP`^{Z<?!qDAOU9_~oQD@8^ zCnaPw(eO=_5D(M-Mw9^VH!3tY@SA-Ke{CT*z3QIe{;*VY1K<AQWuxWM>B(JABIkyx zePmjY+{@Ei;8$mSZn9nEv>WXX^s^&}r8@TEycvVqu^ECw&_IS?IVu2VPWs5?@%lGQ zkz|g&Iq?tNaYqM}HE60T<uMxjQ&q)zzN#rXG(nOa19sI725hy@60`o(ltwg77Nmhj zHXNWSfbaah-)&+~O*xEulIU(##j*hZncnGgA<9Uo_H=)&49T6ShYF^cFj6y6k3J#F zL(^M?baoP(7m~gW!vCX?^$q;v`U8yVI2=i%+}@fQVGsT&rXxPq)djYhv-uy9(h+<# z%2Z7!&#+I}BOeswp(krb;LfWDZxKdEs<BbV@_1P!;PYruY_V;c4Y+Ro?q>;`BVucm zt+uAxL;oqBTc&6p;5FY&J4ASF>PaIsEem)fbg7;GpctR(qZxt!Rn&egjE-zjqmotn zy%f3yJ&cO4)fUYM{Pey{%*@w@&qo(#Q7GtPRD8$M<Q8K)aJSjd*NJ>K?NEGTejw)e zXi#j`pJ+B<$KCeN7d9J<iw0}L9{f>E-!0Zmz&E=7X*TmXhOS2S7NScjt32wj;wtN* zxqvHfEDO7lYBs%+?ZF?#bkM$<3HV?BO=g~G(_3rmqBE*X=}O3%-f+N^^i6SJxKVQh zPyK1z|3pd~+lvNj)TK@y`Jfm*JoyAZ|7)RHB67IPMs*m82a#H(2fV9J+gS?+{IF>D z5E0C#DdKVJsQ6P_u0*<)rc^LD;F*iAKV7(N45Y#v40`ZKF;!ixnSdL&d;1BKjp5eP zy^~dbj|Rnd!5*3oxb4(mO>W9YRgP;kb9e>-{Px2sW?8{8vNWo3j{YW-&w_@41v?&p zS?Xn@A?n>>5B{h+9rLed0zUuRb=M1%jjK>hv<MT_>zj&iEDcGJ448ZV@lUwoqgOfU zvOZ5hqv9LSoe3Dct&7<g>PU+<s;r7w7;8jM@y4)tz<GCdHNKnlC~;1cbVR95A;6|U z_-0*SGyAtO_sU>AT<KAN71xwJ%>~^0^X_In(S}QT2<;~n*BNs)7x3-DZRUvjZ491< zUJP>@6x+I9nhki@q@z+T&NZs7DKyThdwM+Plj0o7)(_lz`$w0Fgf=bUr7QR8KgHAI z6fGO@?4?1|i);+HnqrM=Um0CtPnbPg@%=*n4~7dorp=`$VQQnfa3y(dkNV3l>;}#w z0B?9@lVP)IQwN)ptaVh+JAsQkl(=$-m633{2Y(dPR~%0PPkLaS*%)Y}GenNjXtjzU z2^HVG&$Z5g54^D9HEBy5Hxvz#8^RyOG-jb@0<QgNii!Gd^ktYzwbQ?X`#7-mzVXLJ zDn~}GQLBy4tnn02Dkz{k*mM=I+(!!r?0C`bCM>WqS0+;xTzP=z0iNG^eWeIxV_p$| zwYQF*ub^BnZ4pM$zU_Ez62KomD>YKtG^A!TD`ASSoK*&lY+P&HqK*1BpFWle*&;Ma zK}Q1aGv>}$q^9;<MX0Zm>zKK^p1@sxxXNT7ZJLtnsZSq5Fy}^-uMYg#4Bs|Gi6$$i z844Z9)0XiA?Vm$Efs6XgJlTCc_105}_H!G}1-x;<k(t6}Zyn?Obx43Kt^JRk4{*bW zPn$JWJDUx9qBC_zs=iT61-!0Z(f)3vQUeo5umL62&`r86fybY7@Xf+Dl5CC|$wwQx z8ts-eF41{2EL)pTiZhz6B?NZrKj$Ukw5e%sZk~t!Q#{`mXddAGvD>=}k4=A~D2T53 znvRePsQ7BW)fbfmuRCjp+2VY(MO`Z*-XLAqK+||n;-g|+$~_BM`@}QXiIk3Ymqs;M z6AD&_XvixfHPQ{q*nt}?*XEMVVJ&duovY2_e};vyLR%7|++e7ZlBRkOB9hNA><4zy ziUnRbpp{wLvgvcejay&X?_GYFrUSM<=01}}%W@&==;8_EJ^GEcJYQm`B&7Y5I}R|b zbZ0YfwrMtzHi=&8;3jT1;6<@&v+hqe+pOUyvEp_*dOD&eoGkSkb{@c-_8*wRz_rx$ z=2pChT%3~nS8h3ARoOhVxx$TAC|%%nzeoU!OIV{;+@G<YfrrM<D-}a_EZj6}$cmd3 zF=CjaoX}QV25{lOKlKtyn~8C<lEsV8qvnBs2Of69_XCA7(`~aAcx%Z!C%4(I90dd4 z`Rdc2Lhjf_V5b3Er69*sJ!I%erG`Cr(?SF9nEblA;W)>w&?k6jdUaP$7W_&!HsG`g z?_DH<=ejLmVo4Turog6?OX$xf0EZ6vbzdpLW}HZB$<cwJH=^T+=i6zu0FS@sZ^P-j zEj4Gd!1GyP;BSLR<%+<L9Yc0)NscbLpM1*9z>G65GHZ9PRiRB#S;)EEuYo^3^TuS6 z*0r~g4FihxC$?u`$D4LD1D>0qiM@pnhw%M6l{SH0Cvf79n=ch%9jo_ts&!bKl6O2C z1kktT9WySu?k9=<muwUx*~J0R%|FgKW!Dy05C}HuJ;po`H?vFE+BPGKQpyZg3b144 zLUWG8wOdxpb&7Hl`y*g{;oj4w0bN@#9f>Ln>A>5=Mgc7P<K}yX({=4-=LF?1Y4AU_ zqxKQNqdwbv7ol}+YlU=3-A@;SM|cwR<Ib8Gc;zE^yeq`6eSN|wD}kS4-2!{waqR2D z>sq(k#1yB~J9O{(gvriixOMN!1d_XipS>CIyyZ)3L|)hJmOWbCFwZgJm23{cPrrHQ zNTGG#Zg^Rb;wy<#u4JDEJS4XHdm*-&6v#kC+ZJ#*L+SPju0L?oGnbg))m4ZRubw_R zLJKO2@uBwGvVb>V)pLqS=w{^6(RKZ}{a#ioaL|nxn<=Cl+rm_X(y#P*lb#E7;00pf ztVb_16F|rQpJttTmO3_@rxiMjV?N;Cw;gQ)Yd8K%DO2A!2PfcM#waZvw^%glrp*hy zK`)&>S1t5IKixvWO}^>>37^fxUTlcYCU6*YFAplf8{c}&tVz3(j#-s-x$K#MzYlus zT#?RAFjqkPj%c|Vdt8dMGYb;;Qfdq3A>|>$J=b3Oqm(etg+FnWAk$2|w?q53k=s$l zJj`7c_~*!@{*+=)NUs>~wS39ADdoq#*pU;Ke|P28Qc9YY;Zo>Q6FU0us7%*Abuqw_ z>s~Txm;Cf9V{}HZ=T$n(`JDX`&_C=U6I~XkSB`chV`(`$R_6E875nw7Rm;Tzm(*Ti zPM4(FM!L8Ol$9paOIX58E(Q4Kh)ah`8%_MbsT9u3_<c?-PULtRc+=22v*O|=l5|)& zoe!(mg`Vb451bo(`2wj?UV1eWtCRbFwV(Q&V+r6f6E+<vg|w(~vg%vhb*wAk$Kidy zlu|~gSCx8-`hlGQu*+q;Y!&u26{QWVzNd+>eF2ZY?5<)dq$tfQsN9z6H1$2sG*%dJ z>+mJ3q_oWRN=puSoo}eOUAxjONl*^dIxpq0Tw_=by2u0U(17>vcVk>?(L#sTpzk{m z*qr>!WK)itNHD89K!XZBHWjJUx1=E|sOY9WGH~R&<wr>cj&h+X6=*oap&Sn0fW_b4 z`>Bw+39%F@?VH4dkPy_jyA~Aq@xtY1=x{UD;1G*8jYZV+&EQ?c?g9AtJ8e6PtZve{ znpcVWHyZ@7O`EUHMAJ<iQ%u)nN|w2#tFAWigC~x>NyKww$!0;!Q(T;%*fn7OSqVOr zT@3KmZ|9lAVPjkvf?;g<I0{tld?xh1oQuueenMJBG<uL1MHO>xfWxO>d9<i4BdwxL zy_BYoW^Q1?UI&{+*z`2Tz9qSc_B=2G$Nlw(+1%r1%rcCgM3*=JrYbUkD+26z!Elpp z7@wAsGHKHp77_K8ZpkGL=aPVJ#@%hkU^nBJVf2ianWFh8Rh@mf5a1(Eoj+IFyfCfm z=qHG%8zPYua=x1b`x?t-0W)vwW+u>X{JxQ%u5_enFFR24uc}UUBs((oz}0vCWqM_L zhR|5wcizaJS$*K$qPd*3G*|B)0H~`os|z?~?t^QjfD_XyAW@B!ZR6v@fX{arc#IU5 zUTyR&+Prdv+BkQ>jJfqn6J4a|#}cpM>I>qNiaMR^0$f&5vt8=qW*TcO%A?~x^Icik zJT3uv=U1nhz|~FaM)PKd^=kMwW(02e_^WqBW;dyuq#l90tdy*+cv25sIq7Ya6tWpy zqjdA0pPnjVRD8$nq}T0%r-fVJAd=c_@(GuRW_s{PF?Hpn5^(COlgv!!cpC%v)BAdK zaXvj!5|80&DWq46tGvAB!TAnnrwK>iDMDtYL7l_zE-OpZx#4vj{{UaV`m85~-m10g zNuF0z6Hg==H*;$NU-KTeRG6(|)_Tn2L;6h|rEKS0J!^*jvr>pN($I)rEl+6s9Uggs z=TC2M7B|vqNIG##hvsP|Q0Mfvv5f$)x_7$Sj%*cb*V9K~oNhOOFPg{l0*_g<aJlHh zDsfYfG=RW3NE_r!XdI`*Vl(|_-_3KRT8u-$zK7pw2Jn(JRBnpNr>sq!@`-A%B8pNM zORH*y*oOdbUeo(osn#hiDX*|9T#Vx*#iX}r4$h4PW0^DQxjmB?|AUJK9^gO1Tw!Vz zLNun$#A{A8aM3j-<$6L>#bp849ow;1s+dmq5KSuGea*zc>kCf!M~H1^U$xcISqMgG zH<El(oQIJ+K>GuipO<0G%*OKuaX_5>8l&RdvQ+Z{``!7@GLg|{skS^+Q|b%Fg8rB% z@lml>cr+{U=Do^{mD)&I6Rix>>XwI5@twq3c;HaqRCDfYu!R-U{#!cpqy8$czhBX^ z0e`%CcAnJOW~}ko1}Z%GqnMuVq?v&22DdYdV>V3jP<XZne-zU@eKZqr;Ql>L+-H-* zr)|N}$V`t0#dg+tdNc(t-(zt=YG`A3*hrnF4kegRinDbGEg|r}&fYTN>}SyezNp8i z$G8LT(2@Z^FItr&EH*I??i#7C_R}6{{-EUQ&XxiE_@J({h0$i}Bt(XhF2xMelj{g` zJb6@BrMFrQ(5fUq)f7DsII6>}R#H-?g$9}`Ns*6ba^NL*lo@|#6PGt6M^cowkTzD6 z>0B7_->!R^1z4M*s=2~+F0+Bco?J1zgD5P$rb(_-POZ8Tm3J3bafN`tKUVj=l$1^1 zo7?u;OodcUpcphgaQ>%z^%j1c(5xXpUr?u*pWII~0|#IHvDsXjUQ?(giYPZbPsvm< zKCS@p&J%7QAr-JmUNx*hQZdObQNaZP=NElv+{7gM?!G0sAa(OzW5yik5`lsHA2zuY zn-!);tL7{*xq=Zc4tU|pBSWG|n*@qYajLlx<-p#6$N%=OS<$qaX*6Akq944ArUz~t z)!FRvh4V?fkyKlGOq@E1!(rgYTc(WqKhcveBe9b1)YH5Vi++<rTBN50J#sr}28C;$ zF-zAiqenQRn&Apo5%A@+SBw<tC#Tg6>{XJxNnVhyhKQ@{-&K(_xJJM!kBl+Ve0uIC zxyVL5|LSnqyp)-q=T9zXw0Vgbvo5FSpLp!pKSYNU|L=5INZ|$@Z0F4uA=V(U=Yv;t zl>%+%Uk$rva@9=8L0dFsgHVvm1D@CQl-B<r%FB%h6Bgnu?}~GJERynU)*dbE=SUz_ zbM1h=w*59=O8dXC$8q%hHBb1Rq1#hOet4A>lU{Tsjixge^lUh7V|GkkGq_H`qwia1 zE=5f*7?HvfUJ1I9VC2p#|1c&$f&SgS_ZEIQ?gmvse1oEZU!A&mhv>~_X57#i^k}a9 z(B_Vs82I7V$37Bbn>EA~#3nC^St|qv&Y5?+*@K;)z`605WOq*EX$El6@!2NAOfP`a z#O$iGytIAIm})840J#3u?q-=Wy&jQN5WP<1r|URX15D#$fM@Q!)6dcXHp>|e8z89| zN57lOr2s!XcK4m6l=KErXDO-@&hh!HbIPt2dYjFj4J(1UpQ2sHZ4Dguc+ovVn_jff z^A^S2cTa7ez-RWnyN@v2On-4Ut(rEid*p*+%-UBo0?WU?Vzn^ZBu28x9_Z|P#Lwr6 z-<qenfM<_*(sUkoTsp<tv6tooPN~~&hRH!>3C%evBbTaS>G_%oShRAfxjSaG1yhl~ zf^NgaEoF2jO+M1|mvkRfOds0tl0a}6z@K{zG<zp)`ay!y!7hVoChp=g8OFZ4lq$k` z|MfJ3_?UF-fZR+@EnV_ywkO=m9u?TNY|d$72sT|UWkn_ivE(WTm3HS?75K_GFB!L# zHhuEi*J4rxngMuO&*4{!^ttIOC?^=Np&G>0wOa@j|HrvlV9qhEZj}<!HX}+Q(>`tv z<sW2r;Jvr~eul88ZANNWdsN%5X@u8UOTZCVl$!~I&ALUyHs+<gd%0zSYfF}yho#bP zS@V>e>b}>oGgWx~w!K9&X`8;f3@}Og!@6kW0j|E|d!zicYcK{+?RaT{Le;?epiTcR z<IE(}W+AGf)~QqF(mhm~`g}GUV84C67m9LhMw*n=FncBRUv0EbfJ<H(|E(~mtrIHF zah&%p&L9BayYSKBEv7F_nq<9yn3f*+Ue1*hgg$M(m@f1Rn<Mb%ZcB=U*(UYTsK!UD z!#Kv(6mqKqU#)!pJ1HY0U1z2z8me9I-C1h}*lqAN_X)Sna!pG473-JG3Vbwc>y5&i zwzc4K3!hPXn2iy5*ufthEc9tBq`)7m3h6*&Vn3}A;N?$0Yz~&E?bl@hSBhD(hh_(M zE?Z{Som@&TA;;KIXu8qL5o{*FM|N45D_Tig>B#}XQ1*(z{hvRplhCK_w)8Em7)yVm zcpjrQ@WTtQFz28thH5srn>q6Is0V+Pe&=@9Ou$VOmzYhjHtSxrdR^_Iak82sZ1&V1 zy}Fc7c>VloF{!eRT#5~Ulw5;oPJ|i)w-?@eyD-^Um5~cakLgBoEafMUC<k)O1ACn} z?*w7DsdZU7y+u;x(V%4gxu@14@ZN7OGbwi)8?6aNXT$@sSZE-wf=K$NxMvL4+`zHh zPyJOSrOwuDONVE8!ZQ@hgZ*{809SOmW3#Z>)K~414tX>vwjpG}XdB>xAKYt>I@(O4 zD(F7<0KE#~kq?S7a)@RGPCj|aUT);0YxK(El^zX>?LOMD4Ecb2ox10GH*9{jEr?c_ z!xZ`{w#Rtg6_|J7Aj3Amq6H#!2PFNcc-|=0QUMRhInm4ytau_mPb8xK?M^fsMD2hN zZEox8N~~yIbY`@w#>1%O8pTs$g)g@^i3ppW0?~LCUDr%^$!Ju3=W{p<+|g~-iEgw{ zm!kMWHKa0tV!P}hU0dL(8-{->Y&OGfc_?09MenfqOJ@%C#6on*J6!~(SSKH#S%Kc2 z2b#4Jo4iF5tNEg6SG}&g8PIq4?A=9Jn~o9m&!X#x0_7h0pctQ?s|5v~w`HR_sc7R+ ztLOz95B?~o=W{d@@Pn6cGfB~r7G^w~Mom9Gbr$iMPm1%<!!;+c-9ej7s+ugbS?5$s zlV`6-{Z(8qP-p_P2L7*C@B`7EjTzSXYm`r6RD8FR4B!JUi<E5;KAY}VN!O3ke~RZH zTGj*)@P-N9%%%ey1I&+mi^-JBLbaa6N5#4aw+8U@KW=+Wq_b&Py5OhWgFlMtwmK~z zaNg2g?hq!MiF-6u9l={zkpS&UDyA>=3R1N<OqWhO7bG6rTbBUL>DXpli%Ot7*8&x4 zaYaoybPzI~+aB2a<Jad(37Hml)SwR8fhb*skvLA<d7u^_xLe*KCO$nj9dd`z5A36P zfqmz`l`TTs_>cxdC&Z18(mn*(_Ux@)gq94Y**>Lc<$fRCqG}yo{z)0k1ASO-!sAb9 z|7Z&f5boRnUACwSIFRQu!0x;6K2-|HNUsJ`fZ|^7(ZU0_=JqiQ=Qh1jX-8jHSxmO> znA3IHU9$rJi0%HDNPLv7#0ggQNr}3#ohAid`04}`{@XY-B`So}2h|kcH3gavn03be zCedt@$5DKAf-FoaGw$jtAP$tvKdK^}m+~xK^skwPTHBtmY1>mqE&rqnIEXtsaN!<% z7^j?Vt7u`<1r*YuVEGrte+Qc$aMSIVZIXtxHa%g}{PIn4pGOIP3<N+=-ZrxZ$=cBh zo93PvrYAk<$phUcs)XLG9pI?3m%cC3Qy6R4^~*UU8dY@J9EbrQzpZ__(Ai{Kl);z` zv6h$*O(q@6h_cAQKgJXuBxMxYid?S@UVx`VpOpTiOr80kRgJFY(trcU_coKEbZeCA z5J(-D0nD1;>k6sS=rn7TT!XXOK!FFg?$b@!ZPvk4wF&DhGg7JUbW1MmBCZPX@Lz^~ zCWYDT98XmkKf_8lUy$jBB6TKZm|W~qnpC5s0G~ZCc)k>CZN?QGeP}a&m+63+2mF;O zbT)yj3D0SJG|vT;A^o&o53<02v%0MnPMh#+Hm&@4@JBIiKS@^>_}<H-&6!!75ZEx4 zYOXeIH5YL0z%x!4soZhtoza7MRtFsM=Js0QvZ-O6moA9LA63IDnj@h(fve{HXXd|F zgCnia&^rh|4;E_hp>)V#MfxY3CNN|17_%N{lV27tPpNz=rQ3JnUM;TkS=cS_tuSGk zjkyS4Lfqj>+UL*LDgYk*NXKEKOq+R~;SAF=(6d53i9f8nW&}Py;kLLirYGeHCFPxW zXii|+$9tNIw=12BxTX4nHr)l=U8k9WXWjIn38Ae*88Ly<7%gRLzR$^F!=!)<b{sUh zWwk$2)&3V=I|uGR=#4ck;~b_qe_x{I1Xg}ibZ5&rhbYeKMVb@1V?j5wvXWlQ4^^Cp zo~Jp11Ajj8#g@sb@0i^48qEnj_qg#7wv6*ACFjG-G$+tgevGGOoZ6H0Vyg$<f7vK= z1l?-15!<9BQ9w_p-=q8hOcOXhd$0XlCgKsQ+I4lB6ByiU!+7DenSs(J*-<)3Ug{0k zcpRS<@8@S}Uf{0h{%g$BCdJ_^^Lpq%#gjt=4C)NrH2y8aW1~Xw&{}X~uP=nQW*i~a zwedp{-*j)qbg!q#H%?)4WRXcR7z71odro{nm~Cc%^_gjM64&PjH!>@5{<~FG!kR_j zo7*W<pOx0dyc8UHJ#-%vThx9WzW{e^=xoApn|WKK^b~s0vuP9{s|H-eMF6{XxwEs> zAiE_s7#*RcpH5vbU=0EDPK>)+vu(5r$Tc~h6#0eg09>BGuZit#!i@T5kU{DwXvQwu zV1U<be$DLHI4%vvV8;Um*;*ryu(ZHyOO~H38c)Y&l&K^)=pk*i+`x^ijyhK8N4G%k zghh6v$p^X-aQi{8nCy2t-6+92hm8dIXKc=KBD0N`tKWbHbnOeBhE>KLX|1INmR)d( z2^P}P1uX;n;&fGELTWE-8u;UrFYF{zr_(!?%Mvq56tOGY3h?i&zs$5goeCrsq0}>j zb63D!bMHAsDv*x1RWh5-(}5Ka?6kSoc-wS3kN8C;vU9K21y63gTtrTXSXxvOAH|Ic zJm-^#Ok>*Q2kM)k(zM$1oje9@V66a8eDAY;M0lIIfRs_5l&875r#5il!VZ^TC5$%F zwJ`E{sV!nx%{PPa{$sYjA$)EmOrC=8%X$U=u;r#bgwbaCxJE4;do(Edek|4U0RtyZ zGJCFU>RTMH#`X;lqvE@Vdw{~wLpO_bHW4*FkfrZG_n1$LbL%>tAOOyJ>Wp#1X%kw7 zy)|^6wMOym%Tsz_blQ<-o@-OrN<ZyfsEyH^e+m`f)V;LsfE7Q^-&N!~#$sTg%r7>p z($yyl$I^_vnuoJf`f6HW&2JUmh1Nz)p=DHJ2FQJ4gaI!6^%|3hwaGrvQeLG8e-u;X zP|XA!dcn~>M6%&F6|TeLFD-VfHDF%OKeDSP1opi3cH=MYtR+w#_R<M{vKIcNgq(G- z<^*06+3!mc(q`zRhqz`2A~Ci7!|_@1UUZbULg4&gk3LO!ZPYlM$UOL?n3j#x5&}P+ z^3YqtWYdGgz6x*^X6Fi<r$oyI9NxQw=^ZxaLJyMA*=V{BK%<iGfy1?Qz!$m}nURL( zBh5zOwX~jCLAyWbui`qCO&Pd!@kd`sO>KIvKM?ZJe~PDqCvCu;TJ6~GhNn92_0WHc z=h$|-Zoq5XKX<n9*m&bWB|X1QuN!#egJOJoH_ZqP?dviA)8<0t7{&BK^#DBG08)Z4 zit-<JQ@}o7?SHWdY11hZl;)G-T(!Rz6S)76eO&G7@!^J|$UwT&f}R8S52~xFp29&C zaQ66bXNZJ0&00OX!bATlsUGB^4EVrpYfa|YCR~~o2p%ysN_Tk%%KaYa7sZ@YuImeY zrs&}hMM9g-I?Ly)_27?UTE`{>+-dhy@`cH!t`(Fgp#K!lcdRqukF7>87akkatMgV+ z3b>*)Nc%{mbQ_3{#ZNs&cYNU7nYWnas*PmKs3iO9G|dCN@t5gWyOGSi^DQ3~;}?%< z?E}YkxUoPOZ7i6!jg;fU4WGw+Qk-9Yt2u#VGrBw@oHi{Q#XT1IqnHBJH`RDZIBE2a zW;3{r-U_oPknf$Kc*@6Uy#dGdiJC;8jT^71s0sTkJsK3-`fge(;GUJee{@s7)1wqg z;E!VZggig$2kd%j%&gJaIB@FWfm)CHtGG(0Yc8N~UJqAWW4z(=xCeg}(<wpC1k63~ zu?12;8>y;&^l%}q&dQyuNTr~Lz&o#>IYqc^hCIbZ(<*0@Y%KEu_d56~6LHzZH4fQw z=oTe?jw+7{frYhOOGQ8%V^xIsqtrI<cU@KBudVMi(Tq)3DyycQ_!R*<)@D8_&ao7) zLVds~bDuUVC^qU#x~r;ygruFahrY49;sd_qn`&})Hcd-Q9Ju@rf0b;9QX4=v;NpM% zX2*?(G}&DKkB;|aqbP;d(LwZR-C7#!Kn0xDwt8P_gb@~0;(Lq}Qo{A3m2@xyCoX)i zpD@~Zj<VT9J@lXAnZc3)FC5n1oW8PY)N)$6qRB$UOYfQUC&k&Ro!+AjJmS9(O;Bmm z2sKeWrmFrbt`WSu1^CY7myCR)Ei@MoSBJd5a3oY2p{b20`Kw}grZUz>KAtC9>}SEA zGt-l!Z#KOCU)>hKXa4;%A}luE*Gpq4y)&&r$uy8#1i1F6d=nVjuu%{2l~sB)D7H#U zN5D>ind_f1%St0GY8Z}H;Ye%LBOesw4csk&|BO1y-NMSOP^g+}TOFVYnC@jKb<hF= zFS_$HvvbSF;nBJ&=#tYWFK22(V8&~83#Bz|A~_~3*1Th5^n|qD3!-X%8tDwW1a>?5 z&(DPUc>3O)LrB3~<ew3z7yT6V3QkA^AKyA{fKX?oOYPV`^a(BXLu}yV_m^KI+%~h& zWU-SoUQ<Xm@B(jGyvNhRo8?;O$^Nopb@!-K+xJo=4tn5^hh$a=J*5s@YCA!%ZbHe$ ztszS5_i_z@3wkeHEJfHjmt@T(ib${@%v}$d-FcB2%57FIlGz<LIHQl&3h>-_b6yaU zZTxjIDQ=<CixzWO)4+$mnrISbN4wTE-&vuQyBnJ{aF;jdntn)b!)5!?v2(gz8Yk@Q z_s9cSa^RPBf16Q|2E~?@q4%_Tk_~<qvBDyO2Osp9=}0ZEkz+UK;d|&ZfbA>$m>?^+ z1vM(h940O~y$#$hz*ml1X#DrM7L-7@`_r9vNjm_;tSsQ1^GZz+;J$Aqn!m{J3+Pef z_ZqDx;P&1nW~rbh>;-kjC*~{DJ(e=$XlUSlede3{@v>T=qT)Jwzgy40S8`$+SiCjU zWCU77ul%Qy-n);M9=M_4?%TyhV2a{ym`Z4#W+})yEB*(#Wq}X9_@P;mr3fu;es=%K zCKTa<fCJCyaj#S)rv(Kiy<54Q3jhx5)ae*0Aio6#C@ZSh7iMrdz!UF$-t3uac{#;2 zTTz$vs+PHf-63%E-ovk#`V_aIK5)51>G^p)j8d;!wOlP=VaK2Ukm4}aOxMty#i=@l zDD{ZG2z+Ysm{C$lOFE0g-~PTEI}*b1r*E4SbBj8QzT{Jh-;J9DxPHP9W<r{dKbJ&- zC&`F6bC?0F2(2-h%QPYabGO;{y|q?=YtNnawkZ8b*Dae*en~0fU{(b1_d(YLh0=W# zYP^!-eXz3@6}aE{n_m)M_rVJ-8JE*MQL)~_!!U5<u^*U;VU}wJr0h9WL<6G+&VOc` zaXjwZEOGl-5px1R{r-j$Q3OqcT=qs4873PUZSYhA11m@Fa+r|2k7YAsp&H%+buC*i z@NWOOSA;YTEs(p>gOl@-u{USkWClO?b2K&wPa(}Ql}#+&S?d6pKkN{*!k^(<!P?0= z=YOBDeu2;bJa&kv!hPcjw_^ghe=99GFmPa3bK=PTj953GCqKlius<;~@TG2-m<g17 zvv9cNUD|1Jft$8&e_eFpUe9zvY%DpX=)nR5uehk2$%eW&4;70#=c`LuY~cKTk3Ubu zcCTeU-Sd=qquO;|%|ZkHQ;v-bv->!RnF|A9zjG_qVzxfuE;GM3%QxBd-Q7UW1t2Vm zNAu`Bzv?+}FhB6_L6_Yx705`JUp=y{JG_&-|Bmh^=1E(2sNIp^e~M)Xwi)-#4w2ox z#jtMFWs6EJ_c1l_pS@ohCe&$LOkpUZmGUGHw!qRkTfP=%7fH3`ojxNE)qN5;;*9NW zgs?w}-kgQZ2>Iwu+(9@v(xaoM0Umb3NoL#|WI+>+Rt@#w&;O(Cx&xyszOI5|0YQo= zMWiEj=~!q<NFWeMAcSIrC0UY{WH)3JNKipU0lNZ<D1rsViWTf2Vpqh9BB(z*ief=U zMd7<==H7YlZAsp4^8FzvMCRNwcV_OCH=}&__&J&hxTMZ=K~c!f#z9H3{w$nP@iptN z`GC(KUiO3VxfzSRzLH?5*gu07HsvS9*}HFTHE04)+WC}EINj)Im^{f9^x}=yu`cUK z_}N!)Tq}ItTzGGezt}_nDW1A?q8Zr-@NmkRX35o!t+c&OXAkn|lYjG*;w*nta{|9R zYva$Nn;T9#J`$qOzsrg|<|oDJqudaB0voKE+Fdx$a$&DwvN)&co&KfVHh`aevb1Y; zS@kzsLphfL?(4eBWZ`ZiyVRdo;lUru>I}-UU^VdakCu)R{oK@Yd8p7s|0$lcTWKC( z`^E3QCOmF53g-IH@Zb-{v@580mw^Rsif<GqH~Tq;X;vS_l}f1rtOIUsaoUf<<)+WW z-HO9-sSCZY?XmwwF*o5+5;*(&Hb)6_Zx_)*Zx99ZaDgX4vE6Z$))Tn@=9A36iJQy@ zs<qC{QfCJ|jEb~~yFcL4^f!t`MK_Mj_XVj5t3MT2v-Vm+VE<OnG!QN~<`&cDWFbA* zp+K?Cq^Ll(0H5u7-nYW$rmJ$W@r|X8xH5p_*57ZA=ee<zE}{t*d(@vwx5w&h-GD9r z>}@^{chj}d-m5&;BR?t5EB0tkVCKgI>x#V|SHY6+EBDZyd-^2eoYtBOI4Jj(ETM8! z5u{#8ajr*$QtV!yc>{m072nx}5KXPfarjelCGnsQY%^;6fp|2dYnbrFkp{)~Fr6hu zhyZ8x-tnNYx!Fl9ni<lUiO3I%aqVHv2yAw0uMWcKrl*@zG}A->DV{lHTmyu)58q|Z zV2pH8nIV4>-TyOX2EHnqlB-v_veobOk$UwTCFMq5hywo8=3a9)X?#sd30qyuBVPC$ zxP0<mv&1`-YfPRTzPEjpl+EoHc-}V~_KVQ-YhI}H%a&hRFtE`B&GJPsrFT^(n6B#3 zW307(z(nU~m5+hz%7W$~?FBV2HSDvd<2YXcu3vr6|HNKbOSNud7GK|4-z81t9Sz{} z<tq=0xS9(l^^J(LPCFi@y$k$&@Go;kXjYAR*ZP>|PtNLqj~wx+*|Hf|W3ucM=I1zW zfHQu7@(!`A=4wx(RdqdQa<Bl~>}=qzd2x=<W$xp81HN<1Z{~z<&9#bHAJOb*LxEfU zow|vklWMFMsZ~t(=a=bQM3i&O*;?R-&&@JTBRN5t&WZCsY!NW|wXrvdMQ#$IB3fn( z(%p~rr_%HmzMTSic3{1kqq@m7c!H%tvE6rrZk@nwCp=>oecYsc`9<D*KfMIVsQB)s z2Y4}F0Vkig%A{13QC8W5XVFEW9{i!0PJdNv2K?-e{-eZaZZZv;mFm1(eo&0_yqXdC z*gFeM@8HH(btj^a??&Vu+-rCT7kK2nIg>;~H<?QweM~_ADZTFKp!EX2-09Aa!sEtg z%)@tttf9j_@IJ6X^OVzs$xWQ);syqf`cr8&uCe9<*2%j2G2!avrY5~5bRuh9hOe9t zm+Wt@$$<4{-*APHxtYY%a6)ACCuNV$b=-1N1?B=XPF`kaKW?UHnpJ7&B*nQ7kOD8r zDZNirb>l-Dsq$eLt`FeZpR|5BelF`PjLUhn0ggGi_`mqMXg!v<;gWcq1ojvlGz;Kv z`Vej7I9(sg%By(u4S4_SYu^#g+_WprruMJQLU9sX3Vf{A&t}HrKJskJbz|j#`+xq` zq*!iDEia&BqxAWZ0%hvo$Lin!evseRY>B#Qsx)g4Vd}1z@wO&uCgAGR-pCQBxna7n zjFyV<htesnt!4twT=`NTVRB<(iI-N~LUg4nK(ReMT(bdx?VJCAu(_#B|1^4Vc3N)_ zqvCtwPt6B>;;o1G2%j4}^Yc8z^U~<hiDK%*4HG!Eak}}0ybJxks?}#=%IEtBuhs)p z3&N(WmzcSY8~f-`GCld*2XDCol~y~aYx{uz-2cJzVxODt0(ZQ5@CUD#ym+hT0uD(E zE=`O}+u8PL%>}&tPTw`c<;L$uFJ)oZw=@&*n^Qu|gvpi1=t^OFC|F%7OsM!??x^{I zi>|!zZQ=8{sK){v#>F4n`R8xYl?mLq<#BTpf*T_Zl~QWee9Z(r`Jo3EiBfKYt8A7h zXM$p>*HW7Xe7a!Z5yIleRm4&@Yl<^(e2Ie#c-z&bW*^(l02c~)i;F8f4p2%q<75<g zO5@fKijr<t(&+MZUy1r|*8HS6_kE@f2j0H+$CKjWq*t#CJt;ZkGO|lc=)>MLx&vHs z{?6?k*lcKXb8)(xmZdoH2Pa1J#?(@SI<Tb2#37=en?NyKN~^{p9Voz$|NZ+?VH)5f zdP{I}k-i(EKT`_J=p>-dbh~|}DS>ybN;gA+8$)fBO1%eGXhVTr?p|)L9&uB-Hm+<s zNkK<#^&Y}Qr|HTC&Z&1ONlfk+pUFujC0^d#;4wLa@U-bKW(c7hCH1o0q|q53^OG`s zY=%}6cwgq%reAmCL_d8yFw3L<R9s(?Wk>;my>9F}T=a7jEx4ha{+psdeOtzxb-=Ix ze8(()baUZ4W>OkeG}Rgb-#+szv#k-2M*3sJeN%L>0l#>o)_k$eO}0>+i#HwApFCpy zOm@Iiz&XdJnuBd_yl!JtHcp<Txq!QF9%#0z-1w@3W{&iq;%U)L^8mkk`}JM%SU9aD zSX$`!Xi#kLpQ_n_#RL1jA#83upPfZfnw7y@jzujr6Y$H-v$hJ8n{iK=a`iQFCk)Y* z2+Y{s#00w=S22|`?s?iKL-hgc6#Q#u#6w(!XQ+&>Va+cLPV*Lq=(0uI-xPIo9tweJ zzJ;5_S~q?x&ZSQT@rPoXlcoIz{Nt_3hRIFDW_!znffSDh#a4KYW>eU%^=i?}Hlzk{ zrG}>@I4xM(9p8@84oIjZ*E0^k$k2bc{frL|9~r7ifiE6PF()nhTYl7}Av%O#<W+Py zk550+1NMH(x9A%|YZ^+7pYaS0c=GJ2W<a$ytXPbxh3YJD$dgQ;S3$c2^|f}uJ?}67 zOiYf4OFfH2T!*+L0@m(4X`gV}=4Msul@zGRoDRh%uwuYDz0<l1nQdUHl8llDdO#WP zfD+-|CuvK8b51zcEC|@zMJz%-=tqx=5zh&HiVJvK-j}UKvCdW3r><6zRB)aJJm=yo z%$X!xN*PNTS!E`cgRBa0W5bgUi7J={@vJ8n%diUiKHr~9lVN@!nds~t_Q(5j?h!f{ zO3CSeVmZXCrNDh3E-|OvT(FGr6;i(uf`jUwqH7D-;hsOHi!Ls_oT^`7A(9<D!UE^F zSnn4ST4-|mhrS)6jw+C=KE?fkml%LY9d6LlMJbYX2A2Y!SZ}P^{OcNB7CH@m_q+A9 z7wo=>az*sIz{`X0n4QW9yS2&|O^Ua$a2nQdh~x?mb>L+WPBcqPovPG@KGvn@Q;6a{ zu0>$_E#qGiC-kU_LSK$=tI0IZ5P|n!u)wsJh<FIMNachh@Cpg(GlmyefW=GiX)F5B zvS_rbwEQBS(+xbr0w28P{h$!gM6+^&bXv()9moe$b=3g#U$D+*RH?#<Qo0bCY`FCt zO#p1rp{rS>sIpp=Csebzh5Ay22XK%7WAn{al~Kk+Nl>@0OX=T(2Dtg73r*Hur6y@K z=F!LRWK0qFJ-|OZ4Y*wVS*0dE`3OwWEax}_4!ih-&O+lZIx_t9bu20Kd0lM}aQBnn z{wge|S5>*TIK7q)0*>60)lN7f#)t4Y)e%41U+xb;mm}CB;D!so?=3u?tI}l{E%xAG zJxHeT=m&hV<T5kAtuod|;$jUV*j`6_1i12_>3@h8Rr)oH_H6>{0Zn3=-$=6ni!Z!l zj<8heS3O-<H9T{y<^VR{-q859%0R(npTCJCRW`NOG{EzB>^2`SRH6zl0ix__nx9tW zD&Ul3IdK9WeZ`KkVooJqbw=we)cc^_0PF9#bF&asQnzUQ+8gTI8PcMVM+#t<hF6)M zs1hy4)4NuoLaCKKOaN^1i?s(@NmrI#MAyFZyCtMTt%lkTU{1d-roB|gKnJ${x%weN zVtA7i7~qu7y;g}QY^zy1^{`rte3KONq|l89w3;KoK-K)h2j75~&A;62Tvie#Qat3L zt34=h0L@xf3)rsjw(~?S>hztxe4gKvl{7wOL~3@A((=-$>3^eMfotE{Wpeb0DxqQ+ zS|TFrPL3?#xj(HpTf`Ba2NMiS_Y9+FvFMm=Ah#l=z=un#p#MpnLIWG@?Y&X-uY@Os zqMTX^ZGXv|(!{fbD;U^nV(VPtX&1#0Fo^V_6YasmSz3*a)3iT;k2ZM7^kKbX7dPTV zL}va1o6h8_1wQF{-)wOAcSq)%?x)9~X%1v%&p}QpfP>c!dO@t~=ZY~sa3Nj1;!yDw zPMClTKHX~4ad(8-K5t2GfrIb^+89MZ0hj&q>7SzE8Ll+M!5q3^yfozC{ElNA*n8h> zvztJfVnl3notp9?^&JY`KIWus+)Aqn+@7(%nWz~t;kClnMrr+MenNdWI$DzgAHS~Q z`$Fo@_F;6wRz2YC;LPX28Ti$$7p4lQJ4MYb$7%gVJjepS?R}2PaeKRRXjVb7L&fiT z#0Bo?@}J3M+Q(+YtjSADsjBIpMQt1*18g?(O_Lo~;<jO?ZJ7GCeub*=b6f-8yJERX z(p+-Vr<oXYoSbFM2~0lqO0x+Vv0`Awj75MIZh4HF^!uE1CE&*LzfYBFb;)IY+e};^ z9K%hHaPB8pnT)5BKFh9`^)npTi4z}S-3B|&4w*~GrFnDl%#D+CICZ|LVBoCb<+H@t zN@Ca|2zion@$G4NZM5eY1|D_cQgcPLOVV_@Cb6W{M~CL6mxc95aSH~f%&R{^G>sUH zZB-m)J%K(3PzD31UUQQ9dZ|O~7U4{{`qO9%j{#StJ!5L2lF`t-U>~CQh0)K$o;Iuq zFmT*kCU<NbTM^sD;A5^g;PapT@RoR^5;Ky@N`tfg*s+56+$P!#;19>1w^0Zpa&gO@ zrf1M=ieSlTpjm+Teb@hLVTqWtSu9xv#n$V^M6rSvKHyK__4j0dC=?Ott3^SI&}leN z5?%3zEh!?omz@dx>Z#5Xg`|?<+({DhjPV5nHpV|s)@lI<f73We82iPpo^VF8)JAxa zM@ryhEAFW)gjL&Vt9JXFYVDS1JR>9#6OIUHS#{QzTPJYh+=gZiy^@AxYCgHlUr5W# zaQSxn_oz387j!h!Fbc?6Bfn&YD1JXhDvAToz3=i7Vo9tTOD^%}<<nz-!_sNqkz0Xt z!g`p>@?zVM82!g<M&Q?PooMcLNQ<FRI3wLiQB2brk`cyT>YYaXG-Y~$nmlv{4o-W) zeAzXkx)O@n29oh7&*p&V@4elucSh9Cv|z9_R9Zs!IwG&qv4;bqdO`RlZV<rIe^38L z+#BHxCrz>;HED!$N0iL3GsiRVy-(l&NhAyncZLfI)KZK*ROMJsTYxu@?_qYoBN|^U z?r?Y1=R5}3IMBDgDBCt%SrXno-$&UG9H|yx={KF&nZWu@o0_2~Vmxz}M!jU&dOMF9 z2VmnA4kqA(%{%`tDn*RuRgjXYs&>HnB69+7?)Q+{D~(rCstjsm97^>D>!=6zxOMm_ zQ8XgOuR>AIKcMF|v>AYg1bqC^fc8QeF;TCAQr1x?ahe58xn{mu-jCOp)V26abMz+E z-Rw)?zO&bw8AH5g<MKA%?b&p+HXFDlqt*9fcD!n)2Fi+3c&}_JH$&i!^-E2!msELV zN5m#=Clv)L=`zz2)YCWY1K^8WuQE$ZXT?iSnF1X^E1^g2i1i?qM(qRpz5KBGHl5<j zIdW7{`@_{<ZkjyqO#gZ>r|!UWPMdUwI5^%qvyHe{ouZWmzW?ymCQXYNr>anvzKkdc z=E3~0>S{*dj{R%RoGji(s+PT^1*Dy=Nr5|m+wg3nmS<6Z$T`)y)EZGuz;(y|XEMZr zaaL0nZIqa6x5@q#N)EvbJZ<|YokZ2RgDO;F)AniZqk)UkzgjG;DRFA6x&VxMMMZR^ zC~3A=Z`5w%W(FM5Daq`lMU1CagaOk}@P~K_*hsM7-sTzE`e!j9H8BIsSYrg(Z&#?@ zrmjf|67-O?y9~NP0Abyervkv?!y21~i=m0>kB~8{FXny-*!Qs=UyE<zZP&I==y;|C zzWdnvd5Ka|bgKh^<bgX+)PW7``eLD3-;B3mJG$VmoYev!Sh)CJ(KFsLgZg(`j@DZa ztC$mb;_{bI63%%0v|(j*2fLaKoY7934qV;%`_F}u&LBCv^Z?DW?2Fw0qkn+T0N8WM z9hp*)7Ez-Vq&pluVCY^*z0@eql!0qk&mAU3Pmfv@10JS$w$D|m$_8++0sQsL@#c$| zj+Jv@J&>nC&v3^8%<6Nfk!aDSat8I81Z~0i=w%(!qX*jp>|OSeS=+9{7V1rCahyIg z0mp@$1OYdlzr-t=P?bb+rSZoY+#Nv0H?kqXKmIxHB`My%^5Xh?4=R5Nmj^CA^S9bk z-cxybi1%>26jf4rgajVCZ&o{@>fwS)Z)*wD7aZxpuTKAbyD&wprmDDf_{5W3NSDB= zU2b7}j!guP8g^uXuyuE#mxE|N69J!m<>bafMCou<Rpm*ggRZ5tJwt1>qE`z}dw|ov zIR1a}(4_~cE%_YUO=0bTIepVU6}pH;%P3A$M6?N3B)VP0Q3>?Dd8?V`xT#BRsxVDv zD}lQnm||KQEg)3pG);mCe~s+|)}J(BkJ#0|asvHP7?rQb!33Px`{mdha!$Wccg`*J z>o&Tx1AZ~6JY5v1qPIy6nBJy<RRAuTdGnRRP*oeJjt?GK$rBLZA2auwBNh?e3@yCM zDZ(6e3@J_h0vy+L(MABzt2fdtg3zXtRD+jR8tF`i%65Nbrvu;pVb%`O*yePs<>BLo z?({Yb-bw6^?O9JodP?e;?9@SA>%aw9o@kZ=D9;sf(aWPT^Idg1_fAJ*I~{MokQMgp zC+}VU&O@S>ZCH&>izWWDPzv>24$cbBfPk-z95`DzZLK;;?+*AbETR{(Xqjmmj%}87 zFY!(1mqY0$mq2h9EkX6bQzSQ#g%}!v8*abIEHvACn=0toh5gxuz=^ZpJ3{mtZn>}u zBKR_$wuMXm)BSX~)cR4TA1gSpfD67XG$%GEB`U(4Eu|InSvYZO$wX#|D)jN#4XnTT zoRMNyN}@6?5uo2gYfo@LaOSi&cM5${T=aa9j@FXQPatp1<iKgmDy|dq^aRNz8FvWz zkCO_Z_xUs46Cr5{3Q-eIhlDR!0`U3fwapIbhy*3jj*pj~sBy?RnzL%)KR^DrLaa#C zRkB{@5Mp=LBM-GVhKx_p5L@_~W-}&Oniebzs9rInwhk`fXKOk&7o*~fT{eM^AxL!5 zj|i`qxoH5$m5usQ=o9jplipg#cy5rk0r>8|fdfQHRw6!g3Q>_J6$OJHqg@g-MxghI z@{dGTcJ*aR(@C0!)pWf#cOk8DKpb$#&l$@^+=N8MWtSCWPt%iBh^I*^F#V^sHf1K= zl1B!f&jA7K(DVI&L}Crpn03PHZJOZ0EMQjhcRmr4P?V#_k^+Gsj$k={)Qe{@sy7=2 z^j~-Un<6hGQ8!uvpA#UVGWvYR^9A5DHxD#hQ8f@9YJd;vH<3i#d``lE8y@@XZZT_A z_06)!{0p6QZ2_NcWZgMe17hq8$m>tmVt|7h?la4AHBd<ysq@5ZJ(_4az%L#+?-TLb zd5L<>tZ>;nKl3{)2>aC2a)G06ZdH@DWnWWiOVxt51w458eA8tlG!#bZ4bh(7`ccaO zE<FC!bHs)5Wm#4uk{xtUns<iJ`n7Q)WbWn64!E#kiP^TEoN%@2U3*)lAsUnED*@^d zc~fHtpL79!H~NGWF?4Lr3AM(t36xNy=78CCPc+|TSKF(WM<d3wf)-jP@U*ucZ1ewM zpw;b{P@)e5fe$S9-6p~k@Af0A(9s<?;^Y>1@m(z*5P9d;T<t~cmV2>S;NpvBUn*j2 z&`d{%wwUDsue>vRjL1uP)ZxP-ww7V<U|P4-wFtcT{(H(qTn&2FG<@4ut^K&u+eck< zw1`bO%Zs#9wGQ+(ZF01Uz=sYEHmk7{Yc6om*HEyQN>B3{&n|$yhP*Xb%&WmllmrtN zp4V1e2>f8QcZrD0tT_v1yj{xU9&lW)Crw0EyW_UzHZ-H5vwHgLO`n?AtRp+n)c{XP zA6EkzW<*!x*c~Ztr{w`Z@3GYE`qf~YH;n@IH}4oN5BO?Iw`atuHCTU$P>9OrgaY{V z&WQ^|6#Z2ezFe%@SYwc_Td_yvy`265Yp+fDK*UT<RE%DLr}kAEMWXdTVPeC&+MB?% zbNiT2MSV3Y+cEe$6}XC5#(+iZe(Nj7duvny6R}R=K8_{eaa~?An*cTIc}ex1vYYVC z47jNG1&77(gp+ZL-d5}Aimd;E8b6C|1{U_(e!0lKphg|8b33Qx3Qj43Ew9_&RV1HZ zqmosuIR&52T@>)+oRyD>;F^sw(@Qyp+b>WpxOba57hAJ2CTWUO_DG&N0M{?@n6a*A zWy_4&Df<bIGhp$9o7afbhbLOwRzE7^>jdt+fP+q5VYXWnPFAdORr=>)L0^c*Sb7ge ze^Gi7FY5s}eUxi<e?}#0l_hdaka{Uv;721}L39|zfnWZ2$ZX~(y!vH{kw{60UD!sU zH<d`@xojA4-kl$RFV&UsFm6dq@t5S56?#jk0_pDafZqKnVtK&Rnl>;WZr6Z?yj>w- zDVvv#c^eFP!iUR$7Yl1ZBKD!wM=`W&Fxnpq@d1DP!ve3r`q_UXG2zVC^68kMo?KFG z&hqE!%&!Hz6xiTrkJ+uNf#x7V6W$!oXOTe90ROpSVZt*a%R+4*@>_MdHrJOq-ON(T zSuC*L^Bc@IUrhvSA-zZ*ZYEt7r<x=1h1&yPiJ9kAzt!u3lKfj5ETyrU>@_<Sk8vje z?7eD$IrBWG`cg?uQovfCc#!P_?z?p5ku_)^H%8u8qU#3AeA0bC$o2uZmgOaj)G5`s zkEPO4h~RAL%9De6719@U<Guj6u6X1&5uK5!XlrmXsU~{WA*niWfa{N2VU8QrfE<%< zK+a!{wH#pmOYb!&hiYK3mC4YBJWU7IJFWL}ahdJNu#3r1vf6OByana!G||cfM`j26 z2(ve?%E%6umE`JPn6`TL-?B@~rcI;Wa!a1$_Yi*i94#F9;SWzQ6yeirOn4SeB<UP~ z5tK3CxU20a{hdf@E3E<W-?tB#BrWg%M}r6tEWTLF2i`T}Q8O-1tugsY`T6wb2_344 zkll!PuYrGT?0mI&KfWPL)ACoTVO1X?az4+yfQRO7H^)wjYRp_~3`+@?73QH!r=vTL zFhJz><W3j3_Pe<zl^j=NiXh_X_7E?m+0XC3_DXy6jbD5{gwxYFb!)q%U^92Bz|NO0 z8ZDI>-*T5zgsN0u9vwlUb2<TUA^%<fBiPlNs}s2Ui#aC8iZ82+E;Omo?+ryr%w#ix zn-<)4x0o4UG7v*zAQ-493YJAmE#+td*15K*wMeZ_OA+U$((xW&UWB22StRhHlA|sZ zk@0N-MK?4;*a<XE#Eb`+UAy+%B5YbUS_2Xd+8}3_s_aqcJPw@@MZ<Uq0>0jCj7cct z+kkS=dX)5RnhF&9)Ri^%@d+}=^X3I`PU=O&#p3EjuC|!Z{yEfv#65K46FvsMa92gP zNUTl+RT8rbilu=@2<=@@3kB}@_vO7Jlr|XRSVVQuYS;2tU5@_)D=#@&3j~gC|AM(% zzWRRU<0%mm2OXy+0(W(}#XNIYowliK(m8OdMx&F4<{Ui08%8{Qvv{?*x?aU6>Nq&+ zFw%nn9!JM!=(IZ}GdMCok$&PY59ZQ(9>NN^dh5ukqD!?Mj*pdtba2<93#xb*TMumf z-NyGsVzmQVBzm$!CHSu=t`Oqc{BZ7}fIoCPU^Z5~)pfZ;sFggJpJ4HQBm_PN?rd_j zIZjsi|0J9zP+28(0YtgY2_YVCfj91dV&(sv=lj}(*5}hc!0mrrcfAO$_SoR?JXN;@ zzpun5eHIUcz<XZrWR6eAw_xswVeY^<yb)-YWLqQO$^8m&Qr{zr#O|7_blzpAo3due z)F~}kB5sjO<Bn{qgAaJ)+6=RBPZNe}cH!cIs`W?;<f(<ALdsM`uV8Df7x1jryUh1` z)k)=5zbg))Q#tCwmN5TBDDrMgtqAbT7VU;gMfqynL8eo1enj;U2}1V(eEppNnfuLZ z-V>GrX<ix>^2TG;I^>fo*};tk*y+WA<^)La|Irh?;wqIUs{F#L0Jn{wVs7EC_7Ew8 zOmtX2VO1gm<RI$;Tzy5`pae+h|Isa`3lHMHn_+%>qn4H-)P;xNusXo|+w?6Ib*i1P zjP?};{c~u*baZzZz&_zV95`j+SGz>y`09E<?>a@u>qT2$Xc54HgV&e~kg79FQ+)$c zA-Q5OLTarOv{c|5H_kMhebr7(r2726P=wIGco7A7#@Jbt#kJL*yy$r$Ha8+<e$Fz1 z6W{%AmdG4a?dlAlCUxZl0>G5d4i6GZ)rnQB!OG%r4t;DzUtH;plnFe;2af6a>Zu~K zI<;tt<aUWTQe!>s8KHqZK%PUu0&jY7<uVakoq3WabWD(^OPPTTG7|!exf1~H`{2kL znSWXW*-D99)$JT&iNMu)E60n8)tM+*64h3bUL`UcMQhlpz!h^odRQb@Cv&tUa{JJ? zi==pQ5<gkjsg9%eY%j1@-lFXy{XEi!?_qbbWbSBt*0Apx6AWA0Ff}`m<pQrgud$gd z)J!PZ;#WPtMxoS|8w_w{+w08caeUi=u?!tQTY@)~8OWvs?GnKyY$x#AS5A9h{F_@N z{w1+a2m8XrFJSS&(Viz)i+F#Hh}Xg8)F4WX^<gD|ul9d+y(m$gx=x~lV_34bwoO9m zf$=3i)ot`_ru!*iUc=Teh`{01uo?nw^Pbb`JO{c$;Fhm{Fy}g|(@#Kz%2Z3}J!ei* z^xx4J{=nG+F#p}-Hj7c!31CRH`U)j$e2{*LyjgA|;&qHogd@K@Ym<nr&eRfODJP=c zmi!72{e_M};DQ1gW#qRo_&Xj|fnQv=y+-Eo4$0VQ9UrtJ2tq&N`7H3_xsA=yvypLy z4w#XG)A(6}OJdXyWM!$ZT%Dbn!pl*>bMCMXT#cx<lsvV44NJCis{>AXeyN$}jIOo} z?KdOn(muK=0Dt=JTQg+Fm)kj9X2oPq0C$g%53&>SuVCC2yciCgHRe5Y!Zs}~<M7cs zRgb<IO(|eqXZ<-hH{j<_J)9zOpOJtBZy^pBmD)a@p$F5;id0VZ8_NOqTQtRN4$<e5 zaSXu95~OR^7fsW-hXN**Wz-P^M#WETRmYeh+>{lh4-+{j+{j@DY=85W--?*5>WJa- zJ6zTTmIWM~v*A;bH7tHv!+oV0-caeVU@k=#?r=g>*>?wDYI3Ml_~RQlxGwBtla<l_ zOh*$iZUD3T{q?4Zh_B`Az{N2jb?OfX)@+-c7x4lpaLc;==9Bl<mYWKKUJt$0hihJ~ z0RS#o%qz&itodukiGH;4FX3n}o1-~U@*SVH3|RNTl3S%@yXYm8>5`r_x=jw3R-pK& zwD$tX0MA}u)J%%EiCuhrPzwLbg@Ic(Jp8p3?jF4`)p{A~Tz`|AMpqTk)T+Ekc|~Dr zKx+X!>F>1SxQJ2%7E!ALO$6Nh^sEL#bZT^s^gZnGL%sUCAn>d2Th)tEa5}YhIy2(U zn^;2M2&3S(wz?qj&b`m>mx3*v5>-Ll`vGs#|AyazH?CRLxw2yFMqYguvu|Hr3^=j& zc^)ZdyO9ZTqNHUP7ouyDOuQCX7Vx`qqs$8qVXjd{9donq>0dxq;HC+;nmKRtC>B~b zk#wNm0i}RjUir-2;om7rDXXJ1Kf$$saH9a`d~?@LVr-8}DPVK>DZOi%2{`ISzd6bi zt&%2sOX)2&b!pR8+-m?|x_Xv5e{)I{1t1nmKhZ(k4Qx2^)DuMMPEpE?r%P?=>iUuj zXGk67kOHp0Z13;xC=402*xyiV0qpt6nMVl)G1~hRRoSMX(gLN6Xnz!S2mJHXK8>Vw zSf3JB+BAv!JP!b-^*>~e?nH|;ny}5F8>Ry46)O89@vBGw_LInsrnM^QXo(-Q+kk&< z{bQSyjwu$UVQv<i3%qaA!2VJ&tn*doDzV1WCn*x(DB%7^!;g@X(E>!IC9yQ%JN1{h zmont6h^jGy>@NLtY0uG8sJ*jLE+tiT934-DILDV8xB&paEZS*4-V5`ry}YfndYq)d zOknfigdrlGLfo#hy|lG!1rK|<3juEVyorhE%EXuW3d{5u)q<|<fq3BLslWO~d?m(D z%B9E6<oTS^*19~fbnX8RNcoPj)kk*9j)eYmnF09quM18ThOh|n(bA1=W`~lOv*Upu zpSo?3lnm>zbxAx<<x`nAiY_`<s}0=0ba<u|rJW?Z*X>2sZ53}*<_UKJ-)VQUS%3}e z>~y*0GWxVzWnsg3fg0Gi?29fUE^0BoAOkI@uz|o2f4%iDDHb+5uxsETl&a0!V!+{V zm%SyW!rH3cHr*xLpGmp$&s8QD4RgvY+~GloJ=I}K2)v)23H;}q$NGuDuo{$d{OTo2 zuH%xx)xNjP!&+gn>yt;yoDDCNM_u4ghZ?pLx#5PI(&>469N9~np%#HJJT}Oz)KLUF zYTp#Jwbuvf-=Hk;->JcX2n{pVrZSy|RwLdBRu|Z1+WwAJmK<IZEGvea&Y=p2OyK(I zn@qPB))f|cOAFL9hA1<cT?_mq_k1%}hE=92gT$3yEL2~lY&=QJ0zTYvf%z^ttV&cl zS{0;^VCkT*d8qJDZXdv`JuN$kjbWpkqcpQX={7vN0b5-?+AOPuwG&mGx)E7>s81CK z{{TmNRxA>!ov4m@#TS{IDrT}EXDr$Cp?6Q%WR{}B((N#coWP7gaCShpGho8i+-8Bb zp8ne8HI!6Vq6=S-qaOaC+aP%U4!$MK2fX~%L1qr(O0fyv62J7+cEz4=@}lX3ToKtd zvJ>r^Y25-7*6ft4k|>ogDDtVVor-Vf%}8K_du}(IgI%JyhNiG|=PB-@_vhkL;xfE) zuHNsUcvh7S3{74!Kq{M-Y9bsQ&Z0SKn(rCzEh<tcbcgV|74V_=e>3~lXU0V*f_Met zE^g|;V~=}sl;}7(K2mxm&KL4~1N5Cr9zC6laJa0owjTJygWsD;ShQLcrL+%mL1iFc zJva=aSZ?fErHV8Uq4`<19@%2iRIN{zucW9<&sQtcCoGXrQN_pjJ@)9L=LR}y*8sbJ zddVl^^swnR>8{^6Fg*dpU&YM~_}Ji&%!*%FE@29*h}6U8T|B)7e%Aj(vmp_ysBJKL zkDQH;3;5inZ}t|ITRSVkNX_>7W=MOU$r=MMJ@CJeq-<E?Xvz-r710fIe(JExwcg*c z-oUe3ziG}FogPDYIy+7fZkxqQ0R3ARv=b#_88DhvK-tYaRsfIu=e^caHf*dg287MI z3s`;N9l=9|QaqOW<9xYgv>-prhhvpw3RJMqU7y<j-W9?T%ZC;Rom2zC#cV$?>*Psi z2|-vZGB#KQj%9$?c}fZFKR?Z!C8(Ol5JH>pSsUOvCC5K4+VqT3qoy!MfAwCm<(f6j z1-$*Q)67;ySbL0O*=V{w7}^B6f`E^%dULjD6V_2jVHoGj$Cs=0baV+_jLLoLKAx!n z=N0aFOz6T!k0^BM9Jo-*ek<?&H+&Kjmaz2AuviYsXNLg&C%$JM8VJixOi7NA30w?# z)Ac_XFU0DV9C2|XyAW9Cj$ceN7E9YCIvlL;S-gP70=MqGC{65)Reg~GFqavCk7l$q z$E(8<L1S-5FgRnHk6sd0^ZvfPyaW94+Ae)Xek{$C%cj$3%BZ1_IROQ}GrH6a$g#Q< zT7y#q63R|zoq?~OdcVnW!cr5Xb7mQL1onbg|N6WMu2@3H&>q`tHq~Bsz&V~v#MI6) zTAjGs@fg@{&KQ9GN8EL$kc6e{MssOo_6J~^&b!#$rxi<h)TXtYf)T?I@PhO*)7E3T zEyG{rSJ}up>~G-BZOTpeA4_XIT!MPCH;Tt!eb!ve70cb@=yg`wY*O*jk0T5C-pp;^ zh^JyTDDxQ{1Y?|nrNAa1eP{M6ViiVEdkc6iYbN*7z_+(ec|at`Y7x|T*q%(@%flUT z@8dt4b&gmzr`vk1XIO3E(zZvN-TyGPi}5{kZm`ffwXvr*{cm~OoKg+TPfTH3e)2Yj zFx&;)yy1r|u{dmqHbpU!<d<vV?YlX*1}5EopIKRpr8YLl=zxu0nR<`9DwP`%9`o)0 z=7{XDl_?`z70&Qa!<sLIKg2BxxaGM4&7^#ozfJipb{@*M<h4iO?IS*EC}m^0%=TGE z$26@r@Z1y5F`KMmMQM|XKId>&)IzRhps&yEw}{lRX2?Zt)wG_g3Am)WcdQg7&)KI$ zTu={bPSKaKXyB`-9%~j6!z$XzV2zEh(jbVs0#5Gunn{DgdLd`=3~JFdMJc8}SPdDu z+^~UtzZqUjtO#pfPLgDANblY}!%M%w7EeD`E~Uf5g-fSrYyWFNl|RoO0OmLOpox_4 z6xD}PetfVjw?H!Tb=*Gy8+Gr$K`6p9(nu9(ZbuK;sVAZu*4Lf{KKk@bGvZgSMpn>I zTYq$_0G2f1jt02tsQj6tM)YV9OXwhwnOfK{+y8FMtq;0m$fD&Z(IG_hLIeabz2$(P zg(0lvhq;1=V;J!43A!+F-K(q3M~ST~t%`JY_8`Fi12)|`{&*2wx$(G=MO43$r33w6 z?J|9B<+Z5u7vcDpS2}=`8}Bq#5H>Ed`Bo6_O461C&u?^>S@4Zs&RSo-l=~~7uj%%m z#Oml#!@ZTW2e2=uH#~BZ`OeA{)#*Z!9{vOB?<1~!;GILBY$4iocSmKpqbK<sQ3RZ_ zbG!L+va35HjK9$5Xa0}|`015{9v6MWW_es2Vi6+<e&C)7_)x}5)4xXVm~9J_J}wA6 zwXpaLksN(6Kxc?!C`#%3xfKJSe(_<`5wv#NK4&`Jao`Qx7_pytXf$TcbP*e)EFF@g z<DHydH6N~h4*YNBkONXStO1E!Q`SF6f`893ngRI3sDLp#EcK_m34G<TW3YMawPrdV zHpS8<hm+DpUP=jzkK^TWVA2s8CV3B2Sr?PFqx4X)lwO9?gU4VRB@k%9l=Qr_#ptkl z%9ZnPwz2o@BXv>W%i}}0O3^TDO;MysS!(TI6AzleMjh7fm6EZ9W)#wHZlRi5U(rJg z1>Vwei5V)xEH*+>bX*x7uSgA)>g=e1D+&1aCtbIR@TwVR%+a}jkQsmzzHEB2Fpx_2 zq$5%XY9I8FIqk*Cd8;|h1UzX<&}5la>SCT?8pMM?aD)F%b9AFqmAVuJ{rYAs`=x}> zXMV9l%n9pjBF(|vgdQg1Rf;b->jX9#-^*<Bgk?gJG)Z*LLd6_C#c9hYQGkbkFE^9- zDs`blW_To?b+Nxu{pKr{Nn!n7q%H^*^m}c2J4Rta{s8ewSV!(4kUb&C>gvs0!@&EF znm<E`Dl<rkY}-ShaWw;HY#V5%_x&oVW}!*O3lzS*)bau^of4yEKp6N4g&5jBFz4qw z!Fcqd%XHEAf@TAysGtEh`Sh?^8tUdkuaqF26Q;L+z;jWW<^e8fnPTP+vHB9zBNV?& zqXaYnHX2^CNepRIi3a9*r`L!dg@G5>UX>|@!xC>tHCu<cj~}Z`1D_aq>FH8BEb(@f z#;JCh=gp(!2GW7)Dd+8y^0E4n*eBge|JF>v6{$_?#K&Ym>h|w<nh99vnmp5=#EMrF z?9TD5E+<03ABQ|*b_QaZX3?b62e<j&Les%5=7bWMI<fUCF|AjO`n8yH0>1KM`UVl- zjLz_>9C-t`M&Lj9dDaNopeo5|>&IJ&WZ5^ui;E1CeZByly`eK*Y6kZ>69fO47TPYv zovI`@vABpSfRDZY&ox3p4K(VgVi_u()=Fjo_FFh`s4#>rJDYg47;*w7^t@qyz(2?4 ztR?Ju;Ovu*{aEP2auP$AQP>MjdFl)uLBRLZI-8s%R;!S-1TRaX{1Bdn05djydzFZ_ z%>;_+vV>fD3|?Lht2j!_1-_BFv{=g7(s*Y%yl{n#m0s2Jm8k1Prt?c-ZJ7!<V#+`> zBRIpVib|-ATOFKlP+2r~V3Ua-PZIS8RK|&`oX~qmr+kztftNhn&#W|4vM&(>H4B6J z;v@UZYQ>LUXZkx^;w2^Eos3|91|61B)AJ0@_JE&_8aYbzw{;9*Me}_n>NQt~8wN5B z@cR{4{vkBBk=afoFZ7TmM2GNrlnH<*7MxdK2--v%4HL$c71A9}Quyaux)OkA-*lrf z!q(s0rR#!p2Z_%6GV1Hnzy`O!_koD+6kW6~tz2Lzo@4ESQ@+1-j8NDbd87gk2R7yA z0sQ*f9w!S!SeO@5rK>00^iyg{CHd-*v<W1*GDLbKB!S&pv^`g-!lJ?cPG7V@`lRW1 zKS)tqJ_0)&MWIekG46Wt<za&AFsqmsOo6*zf7I*(^mO_*f^f8cKhVK7j;9yE$qz3y zlfeE}aAo^SC?nwq1Rad`QWe8fz_xXcGka&YG$*>bC4L9bO*CqO2lzwt2fr4#g;idJ zm3m>oLG=bZ4EV-RIZK7ADu+cguWn<l7O>a*8;=t%($e0MM5sjz-o<oa$61p(JZu2# zr<b23WVWGyx<8LjC+8NIb<Yi!_~;Kh<3fk2=-7)V&+p9-&>cL8&xN(MTEOqNE;R>4 zZCy?!O!P^bp5G*MZw{RM`_cKLP<P9^N@(cJKrXG*LZ2DjdjRM6*kq1Co?RsoLLch| zl-m^gLu#5rzM~TXpj}79HG%>-@VPlAhaT*THdX0IhZ1QOKbIPV{2k1Ha&H4np7OLg zV?QK*=1kgNwNo!=rvi68^RP+qY=^yKI2FD~DK1N)nztP#S=ff_nlR_pzsyG5S*}#o z9|#Do{u>-nkF^Aj>^SNMsd{$~VAhF6{@kpB3R-RV(x(r2Bo)*TFg5VEr3>y7>S1vy zT;xwFqNACmk^BdkANbiR2Wks{dOZ9SN!{S=5N&<Z8Q_u%8j+kvl(P`v{%5U2y>a;` zBSbAZf_gMl151y4W{c?WE~;&=k6?a*nSp~oX>3x6q<B1&J;Ps|8OY2|^A`CFE39f= z&l4Bm@ej_pQq&$A54rM4WR;d5tz#Vc?(o;l7#EjIkkD}Rv9#XFJrnTKqd$3Bw6@J_ zDrt@E>=CmgRi49LFmT(T6&VQ;kKwK<SYl~>m^B9WIB}`TUE_*8nlcnsL^vaf;{(|F z^1sXg6qlQ)L{s_zD-CSfv2>Yu!`%SDZq^`85?#rEJOBXGPQK)z(8i^3YG9U}d9}R! zB1atX@K2Y&D$E1piRKZrBbwkW4h!I{CogO$ytWBa)$yi0Z0Xvtj&2>mOJ6vAhj6CE zqibfMup&K>6`W0%_!amHZT<C+92LO9fi31G@VMwxq`!{v$S+I}TyRUd>F(m{H_%Qn z(9+f}Qe+uw<{zg$1N`gqm&~SQykjH2*|S(%F)Q%!d4979A6GXDe@E*^AK`8k_}Ki} z=46m9(XAvvhH(<82HK0bbpV$?dX+iO@2+nfQ&vP5a?@4*I^&QDHJV*}Zq2~j86C_+ zQm0t~7x2&U=X&Vhb}v>hy36$E7j9R;wO=nY%du&d6fN{m^JLLyVVZ~*9zyiWM{x<R z-6&HTp<`|~k(iJa0_(on)~x8+@~a5toD#6gXw~)xu5I9fS)0sejm?WL_;{^GX65jr z{c5i>HtyLk&DJ&(tb!Q#rwya!Cr+&FUkqKJ^7Jqv9O~M)u$*SxxP>BYVdpBYa^T4A zU!5Y{wuw#^%BEN!m_K={t|H*={`J2JnQcX<3NjrFeCHpWIjpXx1m1jXw%LlYjfz!J zrsA8M5%g6GzD^lmK+h5I#{+>QH8t?5bCS%7BwKTjhnns@P%qf)FB2~2@c?-E#Q6`1 zD{OPVD#&F`d_e=PCeZiVRc4LFHWpUFq-M#qSnE-%zSfrdAMG?VuuJLW<3+~|*KuW- zv*=TMb!uXaZ#FK>QP)3-1#`IT1NLjt{~VEHOA_2#Fw8%FI=&f0Xm~hufvX>Q-Lx~? z*BbHA>PgIzJn;v9-f8gJqN{BjuYy#Eu)Rb0ewFq!@QSrt>I$d(_Dh$*mX=m1CsPp9 zqI)3ETcVcP-(RD-fwQ0dwW)Bs*EhM$Uq~H|N3F<Bfn&Gu_yW9sSN~nYX&YUu@PUIf zN3UIYIGX_uUwPG6!s<Q>gjGJVQp)yXTHxvLU1;+0VXlK%Xq5v<S@kxj**KlX$2Nd_ zyw7eBwc~e&JVFN-_h1(TcbvY)94v~z+EhzZp16t^V}ZMW_;sCV>c00CPf!SZRTDdx zjR&6hPgXynv}MaKBSERDhIp92fmH>*{M<D?g*Sdx;Z$XPJ`WVYdNYDsh0=XDDb`DP zW%y^PMXs+o!hpYQdb^1*$L|EZoEs{pML4B#2TF{Q&;XY&eD(?9jXwtT3r2A4MeJCh zx7*q6gfo6!&C;sU^#M+nfU|df+e&zC3&<`5ff|@%e3GpP*728{b{l`YqB#OxgI=l* z`VQp55}48AsEwkh`=m~yfbuW;?8I~fFY|Z~9CFG<^Mu&F127ueM}@gfboB$zeR$$U z!sx#G!RT>3LNt`M1lDQ%#8lx-cHJ2&PQ<Avjh0m^#+G>t{nPz=OZO43GGLoc@1G{@ z?t{x>ALpYRqxj^-L(B_&Y27U&g|~NnTGNgWn!uSn69KL~cf)*P>k}UvW+I@wf{LM) z0?+#UZnF&QzN=D3kH&2$N&1M$&78OZFYGqcq{;3_LhVPYAe^(qow(4{zLmH3qTObI zb>E^CE#>q0E>KugI7<dzTlfA7ac7)i>UbO7ei79t+xD2nk~jkiRYdpeh5Y$}Otn$| zK06jT^qPHdCaA08r9@WsQ}zYntRJsCMmXK~D9WpfbF$x8n1@@TP+hmMvOs_PC!Q4I zM4TY&Tq<Ch_X@%e{ii-Bym5wsQdmW;a>Ej41(vt|pqsG98MBIYJl+w~M-M;a4h#6} z56eafZ6e;KyYxybvI@)8<s8dcU*LzGPB#NqB3@9{ro1qQ)dj9!Zk<kapJZ6UknAs= z?GNF(LDZUk9^SS0#xukbi9`bum=xMs18-06TY=rCXPf=iMEsCiR9sr2{4kfj3*5C~ zhgqLZgf%@B@|7yqdCUs@(EnDs_`v;y&hjo6kre4gObVQP=;d#PG?55X3#i!hgJ&OR zV&Ilr)|*XK_sa*Cw)h^uVwk@u%}1jI$Om(v0gq^2+a$<|1e(qcB_Ia!@CZEPj>Bfv zH<7AS6Vix)sJ(c|>Eh)$M+wzE;MH{apcgwBxMknw8N!)}50ZnyLZ3IljcqwI17B>v z)MWJT7nQ84lebZW)0HFAx#EDg4KDmhlpad;$k&flktkc#>iKy6T$bYANgPN;fKxYZ zeM`6#QCo2j3zqSBLRa%B51f(N&Kv<xq?IUYnm#C<-)EhH_w5J{5}gyNL`966RLmbT zGcd3A^Cs0#*c&-?ZbK{m5mN()E`QD}iVmf}Csc{F=0=N-5tUeU_f37oAqlIk`VK{H zSNn|4BhMG=M4GlvtI!OO;fMwvtUJgYuNt0!GbCB_WEc3SmyYx27pRv03sE7kfdkSO zn6pzut0Q8Ve-_mLlDUDo|7`wIoKh|B(LuHNX6Jr&$>*DeyIQW{ykL^PD9Y}d(_2sf zQ$(ay$2BY>Q%!L8v4em;UbwPm97Ow#;m$wmlZzh_?Nh3wJ*^_qcMYK5!>R*Uta|ck zp-*TC=6QriGRUu)99Z}GRmno0N`H^H6EJa~5~Oz?L;4ifk1POK=a{kPEK+iH1dR3v zbOQV>vjcOUSzBAwA6hN;GL=-?<36X|)YpZ(CgPr6nL^dt<Nnd|qne3`YQ??kbuxU@ zRq)v3e)iU9z84AU2{;HxP(t46K3R$~dE8F!Jb_QNIPj7PNyJk)YftB{c(u!jsKXgP zaMg9A&F(@XGc$gn1Ql>OA6f(sT<0-Mzlmf7I{fJ-dJvz%E&<+nYiASoiDU$7%4b5} zK8HH<y1y5SvlE#^(WiMdo7Bq+Q`p16jg9*z32#EKK&DUEIjAK7KNABVJTfp|h!b&z zT3a_kabGPxq5|tKDl}VriA<$%Tc*k{b}%WhOPy=dMcqV#S^OK82_$hI3fx(eVdg!f z5@?i0#BjP^flkwAmZZ+4<xIq2I*S3`c4+x1u_Tes(TL%Mqc?K{-&*p(6yZ*!=Q7;c z*fj_h_|-DkP?iAP{mK!IL_)Q+=aj~-eXoC>I7+yyr9Gbw()q>^)*hJm*V$&4Uo8pg zd350^PI97l?f%)=tj7?sp;~e3Ov~&de)x3NKO&-9MmW;4!R#jB+sl73Eunfw=xH#I zvG&HcX7A}H?H*PGjScm17MlP(e8c9y#YxrT&o085ah18+`A4;Q_*vmku8#huj~Kw( z15aPOcA2nOtCewHY=1K7vNNBUAl%ieTyAAtxyh_P@X*KWOm3V~9p_l7_ZdtNY}@j6 zv&x)Q9ePQ<?a!Xi^*88MlkVYpmEAq7hi@nr5!D)KI5uMpH0{<uR4QT;nM9bufL5_g zln&y00QM{1)?WlvuOrgkL}Y*cZ0iBNMMAYqu+M|+CR}^gA#=i_TFuxbh5gw<z&k#_ zvRd;XQv-B$B|13!V7b%3$}6s^Rx{>NfSa*>pt&n!lu6_gnWY%@DS#XUW*YklxM1gA z)848TM2^Xpeb9gR+70)KrxKZ@(DOW{=>fF{Z{LU5-}k^+p-rTdvred(EP4-5Re(v& z=Di{GNeOgv>KI~nS+Tmt62W8Np}O$kfB{0D$ZQ3R`*K{xJ|FzLxZXR$n@H+U&+q8e z|4&Z+f%D%ushYb6^m&}BKKtIxiw*8;EUG5rUs?tY&X%J)@NWShSpjAgUSPfeNn|xt z9UE11Ap5TEzaKtsSQGND+y?&}dlz_3!`Dm~n`rBxvn%j`y>;C1%{L>(y@^B^)fk?M zP(E0~%>tPD>qyg>6PmW_r#tzK;B00F7H|E$foPmaKtwE*Y-Vy`qfdqn7xF{`f(~S| zlkG8_QPI<E<0sO0$}*C3$1a<8>aaQv{JPIoW^X1Dck4AI*$W)W%)l#}9IVzRIV~Lp zba>c3^7_$}7gfj4*5=0PTzkMX`#jM}SmQj_lU-V*R{yS`E?kcF{FGX1hP*h}bj;~1 z^FG6k+?IhkS#ORLJ>&aKL46ym)`;x4=S{oqM)Q6A(D=q6Iw67qLJ#|Npi51l>aniC z@xT7tLv&4!o7?Zrqov70TBIll;xsY3ANz9LyRWC3&s5^<eo$j{IJqJPC#b;Ng;&jh zn~%TdH_<xI_MmvN;cQ(i{T}-R*tNyE=B!toox5hvEeNXK(mu|=)^+=TqHdhsjv`H_ zm8=<x^;uRGxVY}-*20>I6Vd~Pbm7N{@uM@~-s_kdcx3~>`RXjrS-a9#`d~ruzs(I9 zxG}KVTwjxjKddwB$8t~rKQ7*BZs|!R*ytM}%BS>6m(}bIVAIu;UlBhiqOFQxReL_x z7Pzt9VDs%!oQDdPkJI(RgD%{c1HYd4vk9|=Vz-bF>DmuU%uf02FR?xmugdXy#K0ns z0pN>`$C^)X;_Q8u{gU%3$2Q?z3*hd{4;6^QagN4{SQK`C4{$uqkuY!o+YG$Vq$qLb zYDz-(Y(MpBO7RZt5#Z<dH8R6nBA(Vqm-S$5&!}3wa-2E0mq=I)ryHe}vVU=-0OtCi zTr6HrBz(sN)tYusb}KM9!+O&?5&P{QTCC)j23$DhtXD<VgxW7&BvlS5X{dt$_~KRj z%(sY%uud$Xn_m=bKaK(5rx#e)ZMy#+OPw8x5xkzHLcdp?jqJr;1@P^$XPUj$vGEQ2 zvE)#0oa>|Yc)iO#k}Cjs*3@-o=9o}>Q9Gc@R~tA4fmi%K@)D`nL}*i~yW?K;Os)dp zb)`T5Dzu3VtJZ=7y1Wm0ItpC>;qV+`PENq-+`t*YZoe32^+#(>I-5u{H=oob*U?c9 z+&lM|*F@zwk1DA+QO>ZwQz_@WdVp(=I%sy66KU>gbZ-h>JEy{83abp<)u`Z7Q8~_Y zh)QMRRh&Jzxd3zTXf{zehbB;SBfN$59K3!o9rbpA!x*@&b>|a>JCS&EeqHnkM=~&N zL@=*9%+7Ct_Hv5`mcKCWf5Mzd=VvXftYS|9kNoasb5J>vlt2ZWtcRUePe(Cu@RmQ! zI$I(kAs;WD#~}fHVqUlP;(|n)8=Y#@-T!%9W58=CrIrb4B3&9D*Wd%t_p)Pw_bh4p zqR=KXSP#?Ve{a?lxbmkV4+v!<tyfK)dHLrUjx6BjPv31Lyop4Xb(-@Ib^vg1Zig?0 zHKE9&+Y#x6m9DTim>Bp_&Xo;?I3aaIK6ZkayD;FH&0jZNV<KTN&PR_41XM4!j+F&I zc+^>YMcG6`Hp4qjUx8?!Fu(D?3X^Up;sJGlMXCA>s|rjT<jW9M6R9x0;6<w+=xs0M zxCOTVDQBh-Cla^zDeYRGbpRW0_0$vII0s7A&4%cHR=TrUKEK+|z5sd~40}kZ<BSHG zBuS_E6Vn2>bjvg;p!+*2bgD@wF0^YyG#Fx91e{kk)||bHb9oM97;38FX_^i=VM{-= zy&Pw>I+wdX<(36}vFHZ##bvy4rHuAu=!;aKt)J^3xaL4F^Epgn#KSD&R(x{;aOVZ@ znge3-rXE`3(O$ajOf@qooy{QtJko!(IfoN(>Y=$)=}c}h-O&T)EzAsDpV#mhiP<=} zMYF@Twp~#$jHiphl<OC75)r9!=425f=-qJ@fcAaY4IRgJ6agcvD?nPJ>gh(a8NlnN zC*3Pjs_iM20Vxsi5E>@1YtIud6A{CzYY06~hsw6^-gmxXxH$<G=Ru0d%66u+S!@Py z-?62p!>YEYtT~B&7rfEx!{*D3YR8nkJz|fkUCr}NCN?6Ws*o0^zb&CF8`Qpr{fy?x z&wqHkRCi)sk?p&c$-LwNeDq-NGlV$K5yKkgf9Js%c-xBu-;JM8-?ZY%Dk$!UNPMbm zEfwj&tiyMiv)1m%3?{TcOuC524B){%X=XdeefG?x>h2x2{L<<~-6DY%uUK!ex%Z@H z_y8FG_IPbL@VT2djSx?IT*sBUa=qiZS~uXm-)@^BR6Si&Y2BdKd>#gX&!qHzU%1?7 zTPj$vMZ;Hu=}%&2b<jEjZ`-}abOr7wbbQBy?V73YyJ=3~gCAs?UNXL2J6zbV_r4}H z*L=Xer+j&m*zW$i2>Z2F@TUE&(a9Mnej|+TD_Jpu>XF7;Ibesz)6Ce`%XKBQ13~r? z6~g!etaD%OlSQxi#uvHr9@n$cmva19@E7u&5cuYxE@r!Ev}<LNsR}<uCmj@~xC$W6 zb_hD3`y=2@ztlaVdWK*-+{ynBk6^&fi`%3Le|!U_7y_fBno)YRt`Fdj88?0+V$u`x zSDL>hR2o?+ySY+;J74KqON1mRBm^TpzZ9ubiU&Jt6M$R$FS=IP&v(tP`ZImqSt`AB zji=-3-uogSJs_W<o=q*x_7&rHmtcwff5e)PZp}d~1IPGIHpg-&R!gux>*!NQHq|I# z7ulSv3;4~1j&sD;>WNIF3q1VvX)nExqK9z1$V+%78hHJfJC75Q+10XA&aOmQ_~kL$ zslf8(-Tn}9?i+Bl+8jr(FwkX&cDq_}Py!z+e#|TzRL?GY(j+fPcX~$HbuRZ8z?-IY zG98oq_8iTw2r)%GiUNz)&lxW6tDaRfs22Kj{iT_?rQSlj6CdGt1U^1+da{VCUTviX zBJ8ri`|!^#kC;zzGOHDZ<~)wwra##xV3&=3%p!aBY#QaOm>n$1vkUrxlSSY+*Qc9q zk&-EwpNvKe35h_NIYzj0KSv_)%i>8U60@o$R^9y)A?sxx#emQDpW8v=qk7ebEvE=k z_GQ2hEApC(DEIli_NJ~OzH4e{TiqK0GsfPRE2Qq1>S%k@x{J|%q1TDuYii(&$G>Ej zJ>2K@woC=X(IM_Rfs<d@{=4WJccMGOS4erOntUAWpp^tZc--S{h10!~eBY~w#ug}9 zKtYBv6L@3Ay0!5WV)&<2rqoxiX0X4qhQN!9S{lLuuA>=lq{AEfwp-}<PbaM-@bHrh z&8&v<izD#(!Z3QakFJ&u<W|s|UB$r?dLRoN>KwSv=j|uK_jI}7N3pV9B*VBMeV$=s zfda2`s{x+hzn_^7RH1+^4L+8;7T}AQt(+_h(E4a)CP28Cg#%kmm~T!HBHgdVdgBVU zmIQx*Ec+DgO5h2>#`8oEOqAS^Nhc<J+jv<4*uQLpIRfrhIdw=!$ewSal>?r&y5-_{ zm6L-b!uL8iK;R1}t@=gyFpG0zEbkHcee^z>c3*p*`vZHwSGZFc(fnL7;$}`f&nkqw z>uQsMn;I{8O$f0A<AyN$A*VE6&;~aA{g2MViW~Xdu<AuM(eWLw7GR6y8<z;1TOCyZ zs<i-bpwzhXE#B7!E;`)Vu^{C}N0TaunkRB?1Do~y)NB-Eym3S5P*X^AIN1h1>s@BX zODw3kAw@_E*8vV5;A00Sn2*Wa29Mds7s7h%Lf|F;CGD4raa+w<bU$}6SJ*n!CIv<U z;KG%cnZ@i*m78jx`Mud!QvgryetCOQh=zi2Z&`h|ouI+hngF=%-_i$!AWA<CwG9b1 zQS@$qaW4zJ?78pFQ4dNMw0ypX-y`?&r<T*>wIP0EbrGfLZ~$=gZC`vO!aIkT&Ki-0 zJDj7E{M$m40GGbL-z2Nem}I<<UMvmddw@7P&?Ddr2A<&z5O{XCHl`O1FEpKQhQscn zGWHi%7x-WI++Rgqakh~}_e;`42|ijm$@Lkr<gJq_@L(@6JNMj2g`isuRkMR-CAmI& zTpsgo+v1!5B+Ua{+Tbd4Xs2Zu4_<Y&%g=13%K<<9IsFll-!ZJ5TKJ;VJoGj;^_+Hw zv-ubj@U~@#&Fou7RdE4Vn7wElPE&w$#;)2c!bukuDpFKE7Z|daY{@kYd@Siq)9PAt z$?Sq)Ss^7Lr6at>>W!&fU$H#ndkl}|z*R>dV_YR|3|kHKgrhD$v4qw-@EgZF3J)*^ z@R^o-Ojg;R#Vd-mvN>}q<c`)XZ)t%}A<;&%c##CS{Fjwxbw*-Mm)BD9$&gyoxuAir zD&WUw<(MVvK6atm6(PD9BMGma(YO5Be%wPEU5Cvay1=Wh*}YAiFQKb+sEnWoHyGeO zxed)p0I7orBW&S1iu*a>?^iZDSA@5-+X4b|yK=xd?`&J~J@n7eYJi>VO*dzU9L2Gk z65aIQxHxdm?nb7mx23;hKv9~b#wdWCFJ+?gp5e*|W{&K4ljwf3y)-DScQP*JVG;Pw zf%bJ`7O_HP6(=RYRvlL@lp;OsQuI<R?IO}jY_KFouzk$Jfo~=km@Y<InW?AIwA@NG zG#2n1a(D4+5U}Z<lgzg*r`mO}EVT-r!?6XN*ZOC3N`Mkx%fTqfB2`w*{YW<9;G)*o zh`|wVRZUX0i2t}Ifa7kw`k9zTF#Xq!=oAiGVDiK#Ow>z%r<@^;AI0zsN87)ag#w$D z_sSQc(%&hD=yA7>%tzP)A3xN!P>Nz&hPb2Kebn<8!GLG9pYGBM<m)65*WFtG&!NpM z)&`g|=cZ{wd3q$J%B@EG@N$hs2G8d)2XJzq4^2YdJCb8!3HnodIhKZOdT>*#=Va^4 z85Xc?@U3RCjRv@IBdy$C>1OdbQi5!*GGO;Xmz%yqIx4Fe9^MU6Qc#NNu+@|<<7foF ze{}LK;v;EFHiC3&0e-r!n;wqGo*7OM*;Au#H2*^d0-KC|D@B-kMzKw18KI<H3_ih< ziT=`pES2r4)S)qJ1<bsmeX4M^jpPdR4(hDeejQ4{ZEF^GlG0J?OjlAUjKtyMv)IMJ z;rU}02%8KoHV?(3u|GYw`2?*T@S<avwG+B1A&^2}3E={6nbWFUm;<F@zPg*|Qoz1l z&iPCTB})p|Pe(Z%9||P}LiBEzZvCa~b6~BX>X@&2W!$#$WYKpDzPx1WQ#osc*E?`m z3VbMeUv1GtrZ=|o+<@hXTP02S5^jFL+lJj~685f<flyhyOXs{B_|&BH?hxIgbS~ob zkVk%^fke-VO|-(?pV?i&H`-dKl%q5pAqshP%8*`ETvp=C3i<<TLF#B4=h1M0_Z~4n zAj)-*v@x7X9d9;7SMrbqTsR}e4Ba%@3GZDjA_*?}4F?%aET#E06ay~oHl|l4ibeV; z+lTI2@2Ic5SrY*t{@~r4g{W;5#qbS`vx_=`Jq=v6)oVI~C}xFq!4hCr=)tT39H_we z&wu(?(dO((ZIS|kAifEquG3@v9G!LsS0gZW*PR~-ZIt-8sO+@S28>^L`3e{;{L0(_ zn&DR0kh^iDi1TM)&MxnFqI|k*IWBtAR*iKS06V<)(+MIZB~BqG*qrs+gDU{I|H)nd z6Z$AEQaxkoQGZ7B`U1``fsK3Tn|<0SLz#^!dRSy~*8`mOed;37O4j%+8?-*2lmc%c z-<OBsH9F%mUh)CXD|-A}VXRy`8U8JKXbWZB7Jwh_Ofp+LQ3f}grHZSh49(j~cO)(J zpvM5#J9zzUQ7uYS)pRyvqg6yx%9FqcoY%9<!@?KE)G_M0508duTy=R`3{3jB)nMU@ zk`*|(q=R%?`X*}z%-OoboZE`xI0svd*tI``>n**}+ypZ?vS~!8vn2&iMVE1v02`io zQ$H~~$_ScOP&|RQaj3V`r`mOnpu2GUOWZS8Z8LY?$r`IAl)eKjq}M?6vdg9+hAYjj z?&91Em{T~-9K((>^vUoZy-l3TV+62i_Ts<A$|yuqpV70a=G<I?_rKoC9A3bovao4L zHoXhtrSBhnqrJuSnvGuhvj37)o#p4bRozZHl7ZW1jVl%fvDa1^FV)Ezu{eJjqd9?7 zM{h0@&M2+TPC;3SrMO+kzmL{@z)2@8Hw)BJ21YwYR6g5+#5hh%fE_-$-i%>Gt1w*$ zx;WMfFuTf2TWghp1Gelin|V<hb!?T@`=ICzS5r=o?gqGMQrX?&P}wZ9ba2=lS@|Ga z!)612|M&HlLROV(riU;JgKY?R)WDSuzj#vEq6{NEDa#Yj*#bSY#GjAL2f#RwmW^R7 zuw%~OHwxqU$Z8qqn^{KdC}vtjlX2@8c`j3oLbd=nc=M%eMBdoA<+(^T(pVVq#zhCr zq^NzQFeIDm(KP#HXgmEoI0ty%?)qjR>l9f&xg<ElSCTZFPW~AO!M~^S)CKs<$jeR^ zdu4&h7EE-1F+DIQ>*oJ)_5qwR>DX7KV3a5{v0{<g1_EgDE^7gNz2b%gLe?$P5baiK zU8TWNHMf@q7x3)kqyyOQgg1r?Pn3lQOBZ`fy`DQ4;L86>%(r)KBNYh?T!`<*xgD^5 z#fKk>_$Xc7a9;rD@QiEBtj)eyk;<tku=T-L1_@tUq&67DJmz_+oIr^$6fB(O%Om5| zvv4sS_5n}Jf#<)UGesnfiXkEV<19;1rS)R}H0;!Uon90%QO0FuNVpiW!m2d5JHXQc z;H~4=nW%{}T191zmVez!fsZByy!p#DhegxTaXUnGj^X(|?0MkQl!~`R(6AVSqSS4r zE?>_4z+-!6za#wVG59gF_T^=&PwuQ*t-^@h`r2E-VaM(<8!=JlN~#7RWSTd3h9#g< z8+tU+^uSwuPvwgZgJRfV(N>}N+uYv(SNt)4st`x%yqpayTF8v2^=*U<aQ6`3(?S*{ zAz?CUoRu2?BI^je?9&vpbRQ*mcj_p%I~z+eHx}Sqo<(y-%i%G689g2<)p$r#?Fisw zxqpli5vi4ka7KfuP8h9wFW_(kcE7LBFCri-Qa~~tPqVL*d-S$zc4^r(T0OU|(>s1| z%LjLJt`01C^pII{&W>AF7M&NOIcO1NhhmAlg69~(RUce+wU{>4g*dKgI^9jHra}K4 z+I29$LO;2fs~-4A{Z3|wA<Aqa!foNdpqeqWg+fZg5ct5)+HO8VbdJ*c!)ZL>zYtzq z4YcD10DQM|MJ=Hp;ld^1^szSGUv8sK0Iq2}!^lW>A;ZC`b{uh-B4j%+XP>HE7^q|V z_$X~ITw#t^J|^HvDk}{Z2EBO>nW)<!rPine;FDi<Fnjlt<2E3Zw%3bj+axcW;s;xw zg+7NgTg^1%ngRO%xWOFcqc{kkCRSk=y)S9xnoUrLSQvRsYi%TOT=6BRNF<DlTOPGV zUOY&qYx-ss(xVO$(q5-YHCzfj<&_^yObm@%S_)mrLe8`uV0^Zb<_6}rpKjLdqNEp9 zcrJT}zgX?$s0)oEjChNU0EX`Q-VFa!<2QmXY6(*2KQa^y&~?n}r8lGs_`5^wXfMq$ zP+d=V(MAHBOr2vkNu$i6sxZ<;Z2a9<3j_Y!_$iYkN68VY5T+ZhI`axEj^~*%@Xwz= z{!)U@{a_=FcbsoF&Y)CMTkmph0dMPe@OhCHe}Eg0#c0K_tOHGl5a7U3JFE*vq9pxQ zxr{mqY_Ze%NgCryeBL6xx1qwIGaXNW7~m%}FJ3A}Magih5`zaJ^=ae~&5!tOLnn3` zaBuUmUkHC@+#zn9mK7?Ip4L~w)d!Dl<B1)x`MJ}QMbx>8i;CXcjq_1k!x0Ykj`yRS z6ac5aw6>v$9U8aTtb$^6=qY&qQ8&`vG^IuD0B@iA%j3d5DQ<4#z33*{#tlE6uz*b9 zy8k}<OJtsxxXc(~?)2ko_9Jje@(ss`-1wWaM2AfNIiItI%5xklz@=B8YtDF$iQ7gi ze^)(+qpw9!X3(k;ya~MX<F010dqUijObtehe_Q>9c-#lRdbh_+o2Z`;ANQ5Y(RXvs z<1r9;-u97Znh<5NXMBl&79Hk@TqS}1Y3ylWk0ImC?67O3HoT}3^|Z?%p1uK3TDEwZ z1V<F3ghp!LwhR3by9QY3?_~B>yT?{WCOcL=!>Uo7tOGANX}4K|k9P8c&&qhlmC=1n z>hlqGcE(BgAuVMgOn_658EUfhj**%fKRX%LvTeX!Q!g<)>@<9YSG#z|N$>`%09?Cf z)eGX{-jM`Jd3khxCrGQmw(Yx+W6AP+nvuaEVBO;<4iq+8Ar4n3>@W~f%J(%5xYmJJ zwEfDQ=Zg|N`WCV1v235D&${;<vm+M8HPNekA{zr7_}ZL_Voa1-zU5PyEJbdB+3&aN zz3m9o`$TD5JW@wj>p$`(d<=Z0|K6dZRusGJ^<<scy7PEV06cx{i)L*u76Bdkvg|`U zxR`?u*sb-Tx|L`kAFMbD7IUW${Iun$Cxjr1E3yiTJ@j96SNzsQTLPT*%$`QV6J@Q4 zdBPWoY(3}_PAY+QKKXTvkoAm=U66@op>RrgD4X_wP)ER|*`1AxqvTiMq6I{J3+64< zZz-qHci)w7d)ikh#~iWU^wUvVEgP;neXAB6t+xLgT3cYJUeDYrmM6!yJdQ2ex?I`7 zZ*Q;ntgy$>m0x(o8do&WZm0Ejcoz8N<X7$zwkXThY`OG%I3z~BC{35J7GSvo_4Ox3 z9$10no3wpRSbIeG0B)C{ZyciOSC>bA;3LgGHWREEQKSwrn7%!1>t!Ej(ZKEdFYGQ_ zMH#r*R>R~pZ_bI@Jm9C(*BmcIQC8!bNSjuf%PysrM7Rvt|G!J83ug@F@KB4?gj2aS zbu|%i&Dx{PygL>VeQy-KH@Jn}1ss3H60<DWC3+>2rO_&|JWZ<ue0Ki-Hi=zPdVTmR zTGJKv5LqKR9)P7o4m~M!G$jrn5kaT7tSgDHhj^V8*k%3Oql7PZ*BRaGM^b2``heXx zkNi-0Jkj;i=ME>0&PXlv710GHb`x)46M^?!-_kVjq0y<(ak}0O_>(&i;Nu574G=X` zqjTFj4@-ouWzsm>y7k<nwI6_Aj@nux0;22?pnm8-)5a=m9V4jYhkJpy{d$2Jq-iNI zTD4~f=>!P=NGbG_ccaCnJ*D=a)bwXjG=?XlGFEz&#-6)%-S~((0n;J6%Fdn(p<a*M zAMmwF_nVn`6q{pY>*)W`@#D-g7$4?@8@RXG8}EzF)HK7rX!R*n(P|molO49tApb)U z61<$_DeQCda*+^appGIT!;5c_WS3ib1;Ia+`GG4>ZD4ZQp{^{bocnv?K#T#8Kkm3D zqI;C(wMZg;RxtASP<k;pXkf3K5408HBv(p@Z*<U%!S0dI>uIfl<2!$B8r%?9<dF*7 zGC2E%k;A+G(Ny$y7cP2<BvOD~`7EwZ;Ddp;?iUG}k;?NIdEBF0wCMiyt+&G}0^TBj zuKo-52^~q<67HCQk1Ts`xQL?uIz0AA`^)|KsD=KF)^qgb$vCj}fp+H$)6hzp$ZVWW zpzlsAOC4A8;0+vh!LE;lJ4y^jXjv)oSsW(73n#o|&fm0)qO`BHAed))7$I!G_xFaf z@4ARy(K@rJr}NXfrh)x)?l4n}ZjtgM2UuH7rt+);c>AJKGyX?8)Xg6?$ZWQfj~eU~ zus8qeRN2%vJ>XRzYT&XZ9UO2^7Y+$v%Ey;oEAHva)+Ny-zk)Jl`ivM~zo|1H^sDS# ziV2%>Kk-Z*c<!sc%uYtLa2nx*>_$9k1Kz(W<0_HeI=qm2<pv)MS?kIf+$ew#KfAzW zKT@qChn8LF!!o>HN6X)V&~)13)k~{wj?=vlaP{09)`@T#qbvfomW^E^AMHqEU0eM; z+8glZ`|RHax8}((@Q$n*=Ib6wq+Bv8&pf4-YeZQ8=M~?Ia&D=xgv{UKjN<SG-n3}F zIoT;oRaI$4tskHFSe~EFgusKd{`yIDJ3YMCY|gSf4)*Qhng`ao<caHqL)w&43Y}qg zu`kz;cfcYK#=T22G4KJu|M8u%!V?h%4j$VI)3F={z&}z?G#`X?3^xXg$A#(iy>E#R zhZNxweVX|`&hLQ3CLTFiRFKa;jVaP}%-x3NwCV!of!`K&ESHiIPKYYos*p1&%K{H@ z<8gt5!V?k6seuq3F{Zt<0KVDvPV*P~ODStXNaHI!>v6GS?y7*3Q$9RL7~6+?C8;Ez zuBuZvUC<}%>U%y^?*iUJ03KJ^+^lAH4lh5>Ppzs%btc1orKlupajGr52e|l}XUx-$ zZNo`0iB}Y43XapMeXa6~j?&I09G&yCNf=v)m(DCJ&77{+?$M_~{U3O$0sOpSJEQ)o z;bpN~BlU}d^HX$90H0ca(pTcQh=SqWXLD{-z?4gOn!S3tRzQS!!oK&~!Br2uYu0~e zcOjzp&Y{mpr_+7Wd1^JBMgYgxt!J~rzz_deWe!xf2shaIk=SY;JAj?q`OJoBoA6>- z0#%bmTg!WhO$L5B<?b`YSM9<J+nsC$eKE~?5%j>|LnF+(S46XOw0u-j@45QpQsA?z zo0udhqW==7YoTTg0>`V=!9Y6jVDUp{X`pqu^2TyY^Xr@HvcMkO&iYLZ?-X8Et|`o< z><iaWSWROCHx1y5?Z>SYiU{AO2J)h4;AhtZ2fzR4Q&K#l<Du%3g?_7p7-3#bT+Go2 z++94tw3CS5mpe?JlUuHM^l0r0;0bqKWA-efw-;OR{L2mi-gwtmlhj3YFqoG~#~a@0 zUg5PcV5^7E^otv)UQ}K!_3u#yQSH}q3E-p6&%a1YL<GF$Ez8&()){#9t+h<HLw%%E zoXE9`UUHK56L9pOpP3^{5stRxs=n0J)RkOQ!1uZwHtUBGrkcTN9d$j3aNu|OulI>* zD%DB|--462rt`gn`X3Yq?*6oosn>|cIl2s=L<aJWhkv9OWl$1$#`RB_#t{+OCakfX zXg*t=$&n5GExpBqqIKJFA6t&HMV0;fh(Nd9UMU^n=2#JRnBy6^ea$N-#gAxMm5juQ zvx(FX!wbO17Y!<ksfeR<v!&yMxMv2wP?32^2zrM5L1#1`4SA~ebvI)L-^<i7LK)!D znN0==S45RKxYT`yu%&{-9(eqQL1s*h$R!-bwJIpzx1JUceBky47l`;Su1x_;9d1Fu zJD<H{uCU1DOWGWJB8o$}5A)IVQqH!Vz|{@xyY7q>A&sbRhiPi(!7=>WZ#udE(w`O! zPxEjS@qLMDD(T!pfk*fTohhXv`V+~Y)pwxkPJ|11>jZeqIfHJKqEy4qt|+{5+d^yz z$0+c*g`GPJM{DNL6DBMH;XPbR^KiVDW=yD!OfCyN;qw`0eUK)PO1>_u{!FLD0Y%Q> zBEZZW(<h2JvLL(&{&_xk1i)t3-9A<RxwzCO!KRn}WyjsEF1uYyNx!8_sWUp^7IBnj z61MHS??)+Vyb&xa@&@wg0BSkSV~TO3t@;)my0*&E5f0p*T)VlHmB}7%u|!#V*IeJO zMAzkHm#Mk@^s+)nBwa_|KwAa=a?7peOA(0)p_1#o`0vnS2q#p)HQzQhNkMo~qlMKD z=Fk}tNCp0yb-C$nq}LUx%J_-F5;}os6MXGpT^cy*i#BhH`NrvNzBExfN5Q9~&S#Z@ zcU@m(($;Xfs#^;omV<O$wzNVoDgSbcmJ592gSH=4A=jpH-79oSV6Dq;dR0owXe##7 z)S|dd-OI3_mj-}0*E;hiDG{zI+ZYxg>jr3f!2Hpd+#;nVV-$I6)~~BYMXF8Z20Tjz z2A}@oU!mwA&Bq>}+|@ZE>vE1P;PbbPxI_rf2qRFwHW!$AlIhwvyx5#oQ0)9a2)Qg) z3b^6myVnb+Y_N%4&XS(tv^P*T&G}2v74S#{Z1&g$bGk?R_!xAe;uyM|E|S##1>LfZ zCz@_f_N-%&jx3`aZX((0)zvi#ye?;JSFxBXR`+6D4bGDE9ltMkMhJoH{2#FT=mwe+ zIH=AeeTA}WC(;T)BwasV@dw`RTll)r^{ZUN@pP(`?&z+FBs`IGX5gsjdVDE_axx>9 z1L@#$B-uF1XVB9CTeb~)gsgkz+C>uGPvZiJfGa{@nT%Qzq!?P!^=Oe?7t-(#F5uVm zo~|WIRS_cNv9}e;mPP#@*nk&qn~@`IRfULu7~Qp+OV<HMQeMT`KXBOi<Le8hOtZw; zh^~1BWirqOc=W}|=So3J>mA|B=_B1u<SU;*%RqUUu3F>6es&OWO`q${Dn*Ad8rn#- z_Ef3AR>K}*JdI-<`1twvnbB3&C&U2V;hG+PDd!Bpj|b<QEw^yHxwtjI{`^X9H?Y>8 z0XxO+aD}7V4TT?Qs0o1e@BHmoA&5Sv`E9GKxs=er<-qOx+WVwrxX#m&NOUhQz>{`m z(`NW8TC=ghvLnB~UkZlnoLx~gJs7C)Fj`|&ZH^M)yF(9{6MK@Vi<83$jJMz6o&z{# z?NQ@I0b1f!!9vGG1KyH~j3B-21|KasSz8LcvQHONsqOgR%Os0#8!MVdMb$^mRvp!0 zdx00-6g2DFGA}U2&4K3>I{Hp==@{0|;C=x3z}#AUMQNGQ$7F#8_UB6Hd{$xBzoeE; z;p}3vy>z;z{NH3FY8m)y-TvmBl_XoHB-yUM>#&O2hmZkDpUo4E`$oDgQ0k?jx1{pj z#m-!9!1?QDn@J326}U~psFGYkN6{=j7P9Anclj<hw_7yha$f!zO7_Im#A6%%PuLA? z@<Q`>MR}Qc=nvq{B?wXPh5U^L1555W;xggr#DbY4DL_$P6fDzwi_UAH7E(t9HGng| z=xIV-Y-S1#wmHw+Tn^ZO?AyylbeQ^THCYa!)9QvJ;_Ua|wkiAD9C8Zh;ANGlF1Vdt z0DSbATyuc5gVO~{kEjH@m;iY91#><ZLuhuaD&64#g!(C*;sZNgw(JWjAl(utu6Zf6 z7Vj|k5n_a^f&Q7PX8JCXj>UTqC7kN}ce=d5pC7=lAae|R8~Aw3`XfcAqiA|ymL70O zY_Yj&d<)wLTzgf^tEDK7W6C}ym6pQCd-M6)AZtMgYbv6G{Zg6t`g%-;D$_{ClN_XJ zg*T9Cq+fNEwi(#v?inYGbed>b($fQu``|0sSYXTg%ZEytj?OY_sm-tYLOC8Ix;AC0 zz`4s0wG)Qcb_Nv^>~7m#?~{jWje$G&Jz}yx8DQ;p(&uF&av6&R4p^FNYDl6&6-zDm z<(8rIrp0I}crsfHTt47|{-UcxUV1?K4k@;R<pB>(*><WFleWY1ic37So0K_yddOEw z=}4ImRf-BmRQ2U?19)eL0j9^7?!)4sl|^-bby7)*w_=#TNPT(+3j3SV&6YI#TGWu_ z(W0P(N5T?A9sARQ(|7bY2cTsbv$*8K6=^JXqpoM8fID9~Y*ylBP_S6cnKju65?bXb zanje^et@-F4>KK%Bku8!J$5Z#<x;>ukIdgHeu-K=w6Ifx44B@gv2)za9KeZ1z0J~) zqva~e;s^8jfNB+D!3WF(ENr}Thv*^$yX6t}`nIkeDcq6W37q&<ZeuANX$VztjEen^ zIe=H()ZgsUI2yDvB&l$=w}Mi@B6VjhZhh5}+JmDVID78tW}u4<4T^SgXGFZ;%8mg3 z(Yj*`v898(Tfh-XTG2v%n1ywC2+@8l8v;D>nWYDXz~M=0so|YcL$(2UcCDkXk-`p7 zntdU>0B+=)*Au>``8<XY;QulA9bi%xN!Vs!6-6;%Msi+~fZ!>c!1V|#yNC#iv%9mq z1G6*h%r3BEj)-UWJhNiXik_IyoD~!1j5!C)@vpbLs=w|p%naW7|NnE(`LZ+9)z#J2 z)z#J2-IvTh`dXpkSQ%y5bXtokcr$ynz_~BZ*hC8Uw3}W^EuWX9z3&-Kw3|CAoo<na z+h+WW316Ke#k<?ZD^p}1(hH>hQg#Nn8+h7v6~@DGq>iR0>NL}S!Hr`J3G6?jVyIN^ zjKInii%zQT&(#8tUbIWKl<H-(Tm@&8GI~%5Ly!MPUq8*Y0{^&Ufr%-LV}v3!TkG;x zxf3}O2RyOY(#xe@M^sV{`fZi{4=X5e#>(?oNZB4X&uaHI*={y_OdoH@90SKceBdG} zEjxjVW9c28U>DS|vp3Qj2K?v94$FjyIP!{!J$1I@6A0|nF1jRe>1!_zmy(W;qDo3A z-Eh8wwG-ImgeGGxeLYOEGz?9t@LQG^u=>C=OfsNTp?VJsV%8}gB^eb$zn%v&aMLGS zP2!F-9D+ql)Aj0{>j<tH`0(-(9i*v_khC(>6&FavgHA(8n{&m$YiFHoc0PStseM47 zGl=pTt{M2qADy~O%{^=lk?FvcpGHTXQF<e;9XR8Iwf-Zed*&>yZa+uy?RZE559xTl z2_iVms~-0BY9iffFLxooO!dHe0pIxf`SqlF#~HM&7wWY4M+V3Hjg~TwkD_H9rPBZ4 z5efXD?g?XfT|F_~1j{cf_87Mqcw_qNwAAhtokE7v(=aLeZ;~+@3%u{*=XaK(PGk2@ zWLn!|Nhxy#^#jTPe;<GK(^AH%&bON5(RVQ`2C(+AYi^XHvW!6$=FSfYwu<=!b~t;l z`=o%Q!?3D!bFh}LaQQIX8Q?}gc6eP%I<sI@XQa7W;IE@kFdHQ9EGP#>9dluvPCIGi z()+$%Ul?%2Bu<^XkUEY#6!^q*oz|72z3mZDo;DL8nJS(3A&uXa2>?%8w2{#Wr(0QU zQf4@p0oGo<);?0HGi&n;r^>^Yf`_uOfV;d@oRNY~AC;x)b_+y1%VVuEDS0l1FrZ1m zZ%=;ULMa(prED(RyM?{Cn)itm>~0IlXBnl^jae~(AG~~{nW$wm2)`??q+9t^jvbWn zbk<tn;MFIjq&8=g^{Eod9meH=$A9KseksvdRa04vZehUbiRr1<CUQ(tW;HGhug?qv zk9g)AGlMwF=xZ#^AVw*`%5TgHu+N4AP2@{hQ7RnI7SrTao2aMf>eL4a!Z?}jlenva zhy3x(a*+fD8Pr0#K3?1A<%XP3pQ3w#-)y~+sZ@ghYGYlmNN8z|W0diXx(J2#P16n5 z{Vx4j0>D@II&XqhE1@eUgycm1Pc->dT1%mJVEyIOu9rfx#F9d^;XOY-J=I3H+9McJ z+FoUDv#G4Nn5bs27WmEE)suu?4{kftQ$vHipL$BQv`TNqk^??@)9%;gDm^2XoadH) zkh>2!aKigrN@+1>TsLv9|5YBZqrH2Iok9?Ian-<{U)*eBN3wS3!YTp8ik+R$#eluO zD>bfVAGf{i(3Vn*Ytm%StTx}wTm#Q7z1*z+i(Lwp&CT(83X#N<l=(HEF4U}Nnii?G znH2D$<I;DE0DPn-$0$}UjvKWr)?6NMh*7$%MQS}J1^oPzQsc&n(P43@OFbwSsQ-i< zA7=vzJZt5$a^a!3+Z-xD3AWX(%_==MYt@`$0>Dli^)XYDj{tREl4w-n$`XpgSOi|? zE&;yTT=J7}(9`9htSv)tP`A?k6RsB7%l)f2FR7E_z1-sN)NNJYz{3zYXySbzN%`(> zc{~s_Elm+5TX<iw#}0h%$n_>mSzp^#h>hn8DsNSO&)Rx80}mP5??EBp8v<(h(WT68 z%k8U51|9U7$(8W6T=%uwkE6>Gtf#Tw<emdQ^}(+FrE=d8(nl>ljj^-%Cd9ToU5bgj zqkmcK6<E%V1RgtQ%&k(uH|CrbtlLt1u>X3`>n7E~*GD|U+_G1*dI1}+e&7kIy@%Vs zHOLR5NefF+tAoDg<q`0>zwc%OV?G(FM2C8>$)B@X1&$h-JV`3`b&X|aT&6c=rhx}+ zvOFQ>d%8?diqVsH;wD*KpTyMz|B?RHgnngW<SwEc)wGL7m-DA(<zkVscb2Z&=k6VZ z3tuaEa!Ar@-fhL>Y?OdgntnHa_yD&RvM$C#&8%K9+2|bl6|APfC--bOD<|>9xG`ed zEdFPA(xVG_$wgnA_@Pl7^*&EAE?Y!46;4!`3kz2hkC<qI7q9GXqN`?P>asLB@q>=E z(QGnLJ12Bu;2pg->nVaWv$QU366s2kw7RZuFO8FRQ2T=jzgZ*obY=!v{9CcvZSyf> z8sfM&t=tR1#nY}eQIQ@*3|niu2{;?0Zvj@kl_t}5^DsX=ceZW{@UE|K9V1PVMIe_( z)y}O$)|@+HLrntsuQQfBB_xa*X=$h#4vRUsh_*C$Aj^WT0B(I+U6GWRH3zeRk?SwI z>ULdJ;m4nLlcHnXw)=}3`N=y+wq`uRodIka+wTgYX&gY^96!zAv7uL(5OB(mgR(+M zJa9|26i?OZ4Cs;zC<z1d0KR|bImXxDjp$e%s&}0IY~*ZOA66CM4lBD)5stdMlxe>T zM?mz+`z-whuI8|n2lg&mJWk3Q4}`@+Wfc$gQgAjG1nxX@Co`Y;Gz^vUE$xB28<+&J z>%nWCA$1!o?bQu=)HBOJP_rON;2Q((GD%Bj`u2+HWjK{1Yop&zLYuc|-vRjIt}!z> zwhqcmZ}XwhK5W~8cXaCz$jYelYE_j{ZUpnYJ$DcA(B`g2#Ksa@C3!ECOWw~m6!^{= zUCj{k4MF;~$k^?pIu<Z+kCV!;5&`>E73FD0p<}vS@3TDgf#3f=!dTG|38Q05l8IQB zdY2v)X98nbSipamv@Vc}{bQdhHUzk+of>@8Q(Jv3MRy8z4n6JE05KB_T(~=n8n|lN zTDME#?!m(JBrcsvB~M?}$`;lwdw=wulnrUL5tgG?cd%LkKY953ZG}LHI;%s>%=5n7 zNx;M@OIAoR3FTUfH9Z@b;Wv{@0k2;))WnWMx>iR6xVBl`Gr+r3Kbx(s5GGaQxY&;@ zSl}+7?PoTmLaI~8yoAkJ%qH;C0YxUgEu@?os~BzFS(d=gU2a$^LJ1i&HF2_O)Q`+* zEsq&s?Aag9hL3Sut<eUfz|LGvQ$lzi$ZZ9_c;%a$OWnJ=N`%uvP(6F{%4w!AV$lOX zx$*6jg|5$H@+#4I1@<KNA-hJvstXQ#O-T4Av1;-H;;s7SGegJl2KnyKZ3JFe{<3ke zd%A7Zx<~hZl80l@?N@PAfSZpy&8!}Gc8f=fN6o4-OM{;SnILellJ(!0hV2w2806+A z?sDKmn|wZ33QJH*w?bK((9Qw_U6=vjdfksOtE%2E1IF8-!9fPoa+h9aO$UDUuX|n+ zCVX9kJ9XJDpxsjTV4bcR!d(L#IryeGgpec%<ZF#B)|JFPrb=MjPa7Js`Xr-CR;Fm* zAwkEn>Ks4rbN1taqv{vGApDr+fF4lv9xJ7csXgGZR`udm0kh{!-&?5oIv66++}LVA zfwE!I4B(h``!`BqpNZ53jSu_)1!PbP`1()tzK~KTPNNz3ZhXL<8sU91fVl^5)bWPH zg_PtW<DP(Qv7EKcQr_EqxPH@-v#39%;0b;NRXdqySKwJ^PCr11QR9>&7(tBAPEa%^ zK<y&ls{y9^Crm72RBmd>4UA<Hq>TZJYjcMKJ9d3~ZQ*ZFZi;$MN)D5>bA4XU0)IVa z*0Dk-Pdh1k7bdlyyjcqDJLa@1p*GOrinNBW8!=mX<?(D?CV|IYA^anGVgdeR>fU<^ z8FI=k;ag;|6G+xiZRt%-CELBPq@AC4)OrSd{=M-h3Q4z}UOC~6Qm86ZDnqg%MnjIZ z!+w=u>AoME7{t!G7*yPOH8}R<Xtr#?D^I<53t`Vy5U((~k}-NE#I&?scPtGPVR2X5 zBEi4{E<SMs<NAxK!|$?ID~t65ZeA5aXcT$eAO!s4@lRh7)=Hz=DiKu4%gSortUw3} zRjBvpegS@W<gDX_x~w7tY)ZBjZ$MPy!Xefsp?Lz2HsH_gttSXg2@wQn`kt7@j7S&8 zw+g*dwgtfM-|caM&>I^i0j3wxN326r*-Zd8pMPw-P?aepz@>UXom*>NMTG$~lv@m( zv&Xi^zR0pQKucItn->&i5wZa_TF7byymVNXbA`*@quMTNl$cNMo{)vR+1A*k(_uuc zf8+Qc@Yj#p9uv}$LsE{*3stpqD%6VDzW_cs_Q_L)TI2{qFXvRvjvRpo9^ZYp-GpLU zRMX{FsaSo~P$$k!6s(D-E8ywd#|H@c5mDr&&!qX>SFBF2unGWA+Mv3tkSmEIr!O=s zj91(7+H&awM+ot8QN)GU2>oK7&)!6v7T`Bs4>BnXGWiG8)-=79yxrP1N>`We-;50? zFmu*1qlLr2<>IiAZW_WaBXG{e=a{CuUIjBohD}VWHA203>r$Q{fv;}9ViVyq(w6!x zNp5l43y+5%x}&2|kF=#|KTVr8Y3VMn86wxEY@dNojd}2*yfoRXl598WF^o2$c`grp z;AWRy*(5Y0XHT&yV(2L)Pvwyd!MC~df&H)F!Yo81=Q>||+lA0|%o*_fG1p!yoJEdF z&6&1qLE%;O(E1HrZ&=%9LN2nQ!k53Fg+JR(xb?MbCJMnwlSx;W(lJH4yB#meNM8uG z57@Q?$4+l~MyN%O>hRY3d&5psfA=3lUKO&Dqk1as<Yy9a;QSo^(p?J>_&|@fUKUca ztU*h%>H@Gy@%izjKDz=gTUxCXS4&wvfCt^S=Y~SX^-A@QzHFG7pix#G&BP@8RA<c$ z@bOdbTq$H^^{JUreu>G7z&3;-u$*Un;9;l#%><>Xah6+Kj+6*o+1O%_nG4t@2EKLQ z6VFTKeIm+MsdbZ0VF2qk@SxIdOuUeEGf=y_kw*m^MOSX#N;e*O=w0uccuQDm)dF>k zft22Z>jwVk<W6RvL?TR<=p2ci%#%9sqt)Iq7-GWW8Ku=8EP81PeFb+F*gF1aqtp^B z*HtNBN=e7u^{|@j0<PCI%dB4|=*9(UGs~&(Ev^r^(>wp1FCEjD{#I}GDiu{)QAS6l ztK%u`($A-pv_>zE=5YvIQT31s0Jtodm^sfBOj4*8Z3V7;e8McLTbA6KWj)b1(oqNf zoXL({9WdSX>C>c?JEN(io-MS_Xl$e80xuDeHtT6K(yWs&W48l1f2XxRTr*;OwWTou zflu_^{S-Mwdw|#O*J9k*U0hk3RdKONXww<?HJP@!*|Qa**RuBxT=>Qqlf>XICcUM0 zu{rId;z)GyO@QQL(h2Yh>^$%1T50t7C_WK)rx}X^FRJgLczVvz@l;Hf!tSqhpcJ%$ z)gNrSTxd^>qCKUpnV!<~_}8I=bVgl=fO~ra?6<IE3mo+2hU-feuAksh6p7G5vq+KL z!BPf(chAiIgr>VjvS|9cZbB@X4ffq|_CA2isz#bql#vQy9doE5Eu|Pm1<@^~iy`Zp zM8Yq#8CJOU{_o~xHKg}~{q`-pcECkT);?OO4vOkGUjm+Rw;PRm^gr;qnf=BK9e43+ z2~xU*4mLo75-}2bukio{mbYzaCXPt;pPr>VT&6bcolew8u-Jp=Q{Z9$zGjKA=z1X@ zE7;KVtG{>5w8sS9U|_{J3m*|`63ItHvN$5lp|CJ&GHcrdX)kU#aMiVYncRlIMRf=( zjEo<VYhd`C&PoX!zUzi&lW}Mi;mU?cS|>3r;L3{oW=P{B72HkY&4!NecX)gQE4rOx z%u}QaVT|Np@=6}tzzr`y%FO+d{cVlH$_737yp`IH>_!3WD)0NdG&!I3p;L*GVmyis zGVrH&ul-DDMz%PVlBbjQ-s-%gAO2bBMe?Z5yvLIJq{$HL+tLViinR>HZ8y_;4*cqt zcPfQuq&{K~rH(AFDE`!j@<c-eojOSAL_r~JznnDghuiuHVYl({tJKToS;`U6#~#&3 zm8ppon`xn4OQE-#2M%z%QR|*9^j!Zvnw~|fi5B)SX28mSzGV)i$cBO*+f{UDX)*qz zt*Y>`13P5E*N%C~WDoXn#+fQC<DdSp9jmu^E(JdO-m4~`v}ce4$Osi-;48Ls!0Z3E zdPfn2Pwy#FO!g9J)j+2OD^hi_7RnChO)z$Dma*FfyldARjoI+|z@VniP6-z?+4BeP z)o{)I!iDR3lW%Fbz`v#RTRe7w{f__8L>XzI*zPGxSJXA7rPv2tDe$dT^G!Uud$5=~ zU1?W&7>f<K`m}?e6NcS>Q!lS0<2YM9GZ9a!tIMSJ>1@D&_tb8_jZhfu)b6K1nvB=n z)y*U<^B!zofrsqW+00b#`q30)R&X1)y>jZYInPjpSL}6)X^=a><YWd#fFzHF@*Yg= z+lqfY&lV8)+*aewYRDZG9=(d@7P`fkn>2j`%?$9ATjSG2HiI15c!ibysH0QTnFKce zOu)=ObNSN|zm^D{ei3vKd@W1Ih=R8b@*ma`;IK1m%=%+s1P$65uy3f9CSAuP19;g> z`<p;;lswc~3n}~oTM6LN&#k&g+R;0L2bK9?_wHUSP~c5JKR#6mxVGNN&*@$J<hxDt z2ex~_xvi_V5}Hwh5$crZKmi-G9{QG910MDK;E#n&lwj0Q6u~^oQUz9DI&)_!+}{z5 z*gSYnMsK~C$Eo#N+kmT<#m&}-8&xl-%_tm&D5ey2ta92tV-C8Uo~`%xUT3y|Pn@>B z8It21whTq#4+mZ-MVvfIGSuoeP+H%p6GEEo=B$dq#7`R-AH{Xb3|SrQAv=p*3YoG+ zay2{w0?!@O#ds)X;VhzwHEBI}VO6K@K@Q<p$TzW30v`YPRc}kj&?4S4$%a*&!;_*v zvG9P~{rI-ocdQIAsyVY)nuYN9BUb{vpzXE~gufx-l{lhwXYh-7Ed$(U_#N8{CD*$( zE!BlXB<J+>ecaQ)i*LQ_Dk0iCoIU-ftt~|RX~(l}J!!TOaLu{l%GPOUV?d)1XNG_S z8)lkT7NUCofM*#EZ8%K8ov%1OkbeqA$QB#kl;&pI>S!9xCpP;O+okb47fY-62p5}H z9gBV;n)4Y;0@(fa(mSM%;_y1GWrCqDnttj!Y<LKF+U6_M%LN!7t?z+uI*FMBetG`f zbMr7~cRMBXJ1RJW?K1Ga4Sq9Q;uYcT)Up&yW||t(W77KPnOES!?_9b{cy$MkP|VVM zFl2XAjq(8}6OzkeZ)0y&q(urmbIb!{g{a#*LW9EUbR}uJnQ|Yzc|rKIcZDwa<MR82 z)b5S|JW{+VL?_1RR@9`-c9dDciG9|R!6se5qRq???&$PLyTT2!`U$rhIQaeKmcpvL z2jizlFDR&060No5D`|UQHs8RDkGpV)5R4RKyk5IKLEheA-vv1G^9wi5PYU;E$ToN> zwit!0eOY6Gcf53=@hM%mP}+iBN=k5O2(pxA-xT=N#LYJlmIg=kET4l+rt$Cub))ew z|HEwq{;~WgbAHPW>v#-N<`h=Ctq78G28rR$cC8-f*$H^e!;9|{2BYZuhK57a9v!z* z+zyr(_~@dw{}8&vA{wp*sLtmYnx^r`bkoFu9k%KCnh@&~LChPl(x3g<!~k1+jec4v zxX}Vne6prDX)%&A%SOPkHk<nexV+y#lR`MEgPBf{!|^;0fDKn2nG!<oUa7~Sa|SI) z?tSi8;P$hxH2M-{@~SD3-3T7bPpocg((amjv#z=yfWvzy7YUD1qe8faQ2{;ajX%hb zhjIYl*zm>|g-+jy{#0tAF6uFIuVE6vSGt{J%!WIm2?Jh`#&jqK0Tk9yyq$+U@ZMiv zS|Loiiwut<`OZml(&Ynb+uCd(fo1njyF|!@uM?0qNsDYhkvOmUffc{rW3(!Y2m~xb zHVvxc-U7b9=>^92M2U#Z4S7RZ!%H02QAu6ewyKlvH(=8i%gq|7GNRvXBjo67E{n8+ zH5a&~+`Cu1S41V+a(KbU@ysN!`szzf=90Srl~$7X*QPHQH$AD(|EkNeq~Vt_Prxpt zpSw;vHOfjljn#uQbej2w`x!W@`#&}kx=}i(MyR)QDeS$@WPpvI^)l9NM1;s3_JZWP zGdW=MJ44NKyKgkPSUc@;(?+Inw3?%{z;Q#)G20~lB1k}aN&nP95E?ITsI?9F&99f3 zbz_v!c|hj1V&Cwb3_SnT%We^&mqqYqYcZSeT>875bp<%%r2Zz@9c3hm7Vi6&AeR}w z_R*S!ho5D1BZ|$yl;!ktz}&sSYy!`neo-%xg1apBhKc+us4iVuU4YLV_WX}RDbExb zB(yOT0*-FDXBQz9<y#t=Ma@^|b58?*TKe&ALa-vDr=f*4X=$l{Wl^1=t2$}Npw62! z_Fyjuczxf?O-^IfEUR4g`b3@KJR4$chO<inJg@7#n}usvf#@2*1?fyZtt;XOw$W3A z$T3kWU=(Nzo+5##Z`$uHq2u<8p~Kf6=xq|Hiy?G5s|s-Otm{gJkgF<&5Up}43!#m+ ziRq%a$`o#hlOcUIJ2}85L$AyTB?@R*u^Rl^N<cy?!{kzJ3xErkPK(IYQjzCG9WCJ0 zJx$egH)@O~vA7aDj(Bj;w-bAVz@m-USx?w-C1a@3nk}9|zIqAK$Rfrrgx+Qa1OBZg zYxZ_}JMA%q$imgD8x{<KbD02e)>}`QT&n)z1eEs@;Nl0?Lg2#5qbsF3#o<Imzs(^s z>T7Axbv$_j8)B7%gp}*Hn+BC-C_<@nFpP|>8;?74<A7h?`Kih9a>uhFraO&}wAqX) zaS3+=*+l~mJZ|<+!rkEThBD=;wR36ALZeNl&z77S16)4%&?khDJH!lUiV2%5VQ60# z7x1PL-At-cgt$UmXqfsBiwpSPRvj)DrrbHxFolyl0aZvb4dANR?lik%5j5;J89w^= z)ng6#^@($hcRn~=%G@Y9k!UGXe+u}*%?F;j>$p#(L9Qof8YH9CFfxes8rb{H#iOKr zL@%kqVYf(n=@+(Nz>oj+(Un5S^|A~f5=0b!gv_yQHGm)PzUi+*#to$yGBV5}t<cwO z=YexG!_9WY&~Q1M5f;|O-?@pv*sy=E7TzM72;B)Ivn{g(T=~L^O@&MZOQHHK;%epD z9Js^t=bHFfMDMZOj7A$RDCMj?V0!oaO+478V`fypFJS1*<+%rV)>@NHo|0=Nb(6Bi zIs*;{TYuslFS4JAJ!RtOaS@ZdvJz62w6D?_qiq|?WYEE7FQh8M`jrg{uy^Bw#<ERt zbU`R;KgCDT-X{rhRc_(t1D`$ilZa)JT?23D=#N5=oV>{P7&xrGvvGAxa&WE572sRh zBH47eStj$;&9oARBm0X+vpFNue{D8Mgtz~8bA|MqJ4%Ekq^x_2KatM5Vk1okxcJrQ zj}<a*a-NW}mk+tt4cl=C0Z%z|^}Ry1SEw+95ua<>+5&Gaf6YXC!}Z%zo*=2S*wO*V zHlJ>G3*05NG>}7r`cE?sWx*jrTS7@Am<)hVj{l-on%6J1d72n{z>XVj!Xg6he|ma~ z&~P_9g)b!P7Niy@@a72c>Q6p5C%X$B&K|SU*sqx)aP3DH?kbGBQ-v@ZSh<PpjGOp5 zcL;Fqjw6bMp6f{oJ*Pvw-nGNCTeAuS*J>PXMsB#Wl+=>tiq*9`7D3v&isuaAq5ZG9 zNq8F&+Ogi@1kJ5bxtjJmpdP@^KRni3s1(pbtoxPmb3!&(u*iUiT)fRgLa=uzTV5BM z`Qo$9HAlc(wp;(-LLh=8wc@~yPWqMTkW;R^v!H<gS^u9#P;UNHXeU~?eu%&(bDR;_ za_FXAg*`W-E!6Z`x`IYSH`ZO?6D7;dJUKB`aC$1T&13<ly^^&L_|KO*nb1bK9kz+1 zI@3ef_tiZFoU^LRcq{!wIn|;t-k8X-;}A^*c>VqTXNercM*_?yW&6=SmTf?JSviVT z4*1}1%gl^Ll&#gRbcw%NwxQdV4IS{xW7ad90fRy*NoY}1hKQtbE$o8<Uuo-?XAqzy zb0-9L<emb4JEQhQkxuwjCx!>NKvvVe3OFaF2BnW`H`ZNXhyLGxB~)__Ei<ur8Ju3s z_jj6^U_F3azVzhoLU2H+yfin#_|qmVE#R{4rknUvcw@yVYHF4A3QI~pQY#S=VKuqr z;0?HS_w%|5Z{dAOhZ|$bP&?a|oh{(Wecv*%26s+TYDuRQvc*$K^7GYw^>m+SjF#z~ zNh^G9!sZCL@S`6m316<SFQq7^V&CmaAGgLAnzYFItgpbw?pSS(t+<-+(eh>i`AoRl zrkj=)aNm38eJ)&4$68}ZN|~*Cr-d?o3e5^uVqnn&tIX{pZj{cW>6uA~EL}-S13yc* zS|B2I51UEgn@iU>p)A+<ctlml%Adm7m#lHX*zjvEmDcu(Xsy5ev&;lAz5lDmQH$zB z)t(al!jqrYA<PT#xO=uX!O|$ntDPZ}kC}EvCGERl6WyD@!*8AWg|yEd=)wu@#k8kl z&2)pTt*_3p^b2_~0f#;iyHN<bD-Mrf-mbKl2Nk?L08YE+9b-i*B6`DhFde2nU9l_J ziA4<ja_;Z%3-{xl3To2n85C+3EzTD62injWJIJ?yiKxG2+Q6rdfAl+{P5zWMaH41j zwxw-n@ogU6z(mnyW?n0dZHa?~JEBMMQ~<o<qX*9rws$LtZ7q^;%9Fcj-2>kFT9X;| zu2&x=5D5aI7evI*@P;a|!+YcU3a_qyL{W6MW5QWJjU5Q!enm6Pa49WF7$WE>4S9w& z1lai7kN*<(-PKbR`+lm%3)`JTj==N|R~;;5dpJz9YamK(N`JJS?j>O6?z%gqwCf6@ zn7Ls{{ZW~sv)JDKLX(&Y;NKsAcBqh{n31LZq%JXfYBPoot)N$E)a^L0(oZly13&ow z1#^7f-8@yJn|N^6YH;$i>hh?mCUfXDR%qb(kA@s4oVZ@TkeigQizU$@6=J4vle$;X z+j_C@VR&lJ{Pl&JZ-RimB<A#Rpa{AV?;hmFqH(}OE`QLtG(H2&<vIJv3sjj-H!IPj z*%km_*?O~Ug(0`U0?p%Q8NNo5(t$5vzuP}(6Ec0B{t_~Bj$i#Pqwx~<hkzTdPMBRO z-vrD}D@i8P3+N0<Tdh(bA+izAC&1Ak-cc@m3=ZW(b&~NL9d4?4Z~>36n7u#<4G1M< ztP5>+WMT>9M;*^T8SsjeU-?m}^v*{`+GD@tciZk?87I-*GZ(qaMG#Kfc4(yUH5N8- z)jw|8LKt&5I)tuokce&zllSmo1(v>WgV`4f*P*~oszT;G<_UP&QLjEOJh|?AC{MVB zN_}Bs2S&knW@iz&|LH@{5vu({yMUQfo?*SAaUTy7;PYo+lMos`LupVttX>OB!)|7! z1WsM?(P2`&duVZWucjGTzig`q7I4-5Z(Sp0!>cw1L#n=$9ZKLc6K=mjiidZNDemuK z`?-t$>vb{1%I9(O*mTqdU4!k3V9z|xmK7M=V((3aw{RU)-7Aiu8MCH~dhvJ#F5Uje z79r+au`q`wM<`^w{#*`h0*g0#)?_+{k9=eBeTM!S7CdnJuM-aue!^!V!;flZ2vcj* zJ_773aM<4_T`lBj8nEU=85?>QqkB#8-T|Tjb}Zt2<_!48<(pk0r22-Ea>OoLwUm_- z_|caKJRl_cgp#m~qfzVGR2$j@?7VW9Z-qj*csM_r2sNkavRfu-U6Zygs}iv8<$oR} z<igwJh)3GgiKbw11YFYa#XdqJeELyh32Naq)<WQUbq_BTBCgva-K0jk)PDna3$SkW z$_`SL*a_)jefh3E)hwVX2K)n0S^T}(eGIpA?noCNj$#_Xx$WPX46Sf6dOVPyBP8rd z`SxcXYW7mXCtyo8{3d5z7A0`O^R@Fu9^syjV{&*d@EP%eJg$K~sum0ug1)siTL_B& zxP7etl2$hGga90T^h`6ahYv?%BUBrGhT<%iIq>jBFB=Ce+;EW<<*NdMp6W;3Kw!rO z9i~bH$AxN;BQfU|N1xm_-%u+Su<!62hY8tU;bh6wSI6j5C37Nke~thFuY7CFCsLkl zho#t)C}$4RHE#S>^fmMuc+9NcqotUui&gsmQ&}oe_=0W#mtH!aRS5Xm^c_v&gWKaw zLTrp8NT~wITd~%P9k$Wz0QY+Rg-e7Tx0{$2?|s{r*Nbg_yNRX*?7VyvGtk{BnJM86 z5FST>0S7xCnF?+k@YBxs8IQZSBUUEk$;BgZIsFm>2F`!?+<m1*?wrm90#2LCa#Zi> zD5VyWU(d<{Jn;8x8-%E9g<PVnZ)R>NXBxmR>#yEfXt<V`X}CS*wQkRzx^=*h_pA6! zhztu85BI$~`<m5+ojmCk%n`8Lk3EkOV(!*8b7b!ii+$5y+4{6C#T+1g;N2ard{an< zcAqYeA>uV~EcZWf)Q5+d*g|=D1HIEDY7H3jMwHJ@Sjue%uKm@P(}h8I-OFvBkxA3z zLVSiAS07YTqB(|;=*7(xr9pFn$!<5rgqj=dW@@@<=)2@XuZdd^TyOCcOLEfFlO6ev z`o@V^(u>vzz0;T;aHl74jo30~{@g`^HxisFV(9w1#lW9R@0%bTMi?Kje?s;K>v@3% zT(ad4#<IJUDsv}>Y>z5hg{0{6QmY&6i<W<gm3}QuxiK^*Bt|u-;7(=10hb=J)HE|x zk99|Q#t3ou#Y_Nr+0)0FeNT6VYue_?Nl9B41p0e>fEDoo1J3>U@Ux_;?i3wDH%O|E zj69SV*uP}i2q6_}`$hcvg1H!t3VMHC)NFf-U4jyD)hB<uTqv!n&2=>GT9zR2+iPc; zbhyw?jnZAmig#w+1x_gY=x@Si=xB{p56@OT%zXiD-{Rp@gr3_MB`pcMtB`Vyo9XWM z2E1-bs~1s1k>IxMc>#Z$-o3Msawiy&qW^m;;%quJuxSIHHfQ)jLc?_}n1=XS=>}W7 zc4c<}c-N7?UMD2n6%a_2)=j6Qdvt|kyxwH|LGRyXzYqB7H{D+m3a*SnAs~~`^~+dZ z0s$vCt>0Vd1vw&`p%f19q?Hr+){ieO6AJFUYsA7i)IM*qKg$+)(B-2{l-^wdF%fjC zrzK5XKXB=(!}gT=T~mUh^xS(`w&SBr0QmlUKYkNUfQTsF@G*Z869B${;=0p>Ku>2* zW#)NSp=nceb2sh+;J^b8zBy-c9U_8@D8(=1NEPt>doDG_qg6W?QyIwO2cCA!OhaR* zuon22T*r0L3IIHOok<%A|E`;Z=97)Y<YF#4s!WZ@;0?Og_NrLjJh~uF+Vnn46!`Rc zwPt#7S8*VTS1rhtq%iEwLxsT=_IE5};I;=GZ_>^}yT}{6!p|%=z`$?jCXLhU>X<P) z>c||%y>U*fSirzXuRrY~k&(L^LUn2-qi<hT|J-F5hW)c_tbvCYy)vNi@;i@4`G>hY zu<q{5yBA)5<Or0%n9BpNKYPYzg_j?#__tq8S#|S8w@Z0ffMM+)Hgp#-a1z@+;18#b z8Y=|y3vi5Lz<yKi(W4f}3ok!>XVm{L$60`bukQ6w;pNAu@=vh<fv1n(W$nVtk5=XX z;QE2@opiW4j8}jFhbaN<y1pKzz{a6Ft%(4Y1})+a03Mm{FthLmj8gUQ$n^tnd#Zg6 z%8yVQSiu4Seo}PH<ihJ8uK2e-&TA%aY}()3F>#?9s5RgKZUFF-QwRPg4D`%PK=Ho` z^A9}ZjROvl;`tSLgyR1KRv_RpwVl5&y!>!g|2XbH;CZvkjfu}+|1eemNai27)}yy? zTzLJ%)Bs+^<$*&EU11i6`NgM-cj4l|1N*#XmLLUm-!L_RHsJOHfB3%0>`&)!|1OGw z5iEb;?j3JCcMaOF<Ug0o1JC>CUB-a)%&R_1{PxOq*QrAuE4=y<s`;x~e!!;RPw!E9 z`CU}`0j&MNXZw5^;bnymAKm|Rm;kVS*{>$hT!8$Q0FL1X0E-^})$H@;FTb<uzgFsZ ztf7EizWn#Eg$rPWDnE(K10Q>NqwfkYzq9K97A_CmbMXMPb<rzt|7-hgCz>5O;waMr z`OA+|^*_b(2PP(MXLbbhm)}|0?}u1_fwyfj)R@2g<wq&`{lfhRoYwoXHRyjme!H!w z`w#f${X70rxco<}`uE}Tz?mBkI6=zy&M*I=N`NOa0pR_=F8*Bz^vX+MXElO$;0^%Z z-g-o$@bV*71MH{k2flHQnLr9?fSv(v;RXP=-RAUD*MI?~0pD^D0^1iIv<4P%xGH}l zYY=c+&xPj~UjHtt0}f{Xf#2`BNs*K<L;#9`4om<z{L9WJT2}}GWrH@Rge=$);FWtH zU~**(ATU(vz|JfJ;F8**YtRLwRQZcJH4%8yx7~JK0}%{UGPIv^oj3K-^MpXJyh=P= zDdDaxLg0kWelwA%{N+ceF8GAY17CjW(OU|yf3)I%FV;ce^rH@369EiW47|lX0Q}_5 z>&;ec{sxRu4A{4HzwpD&)zW}MR6yy_yUYM^djGS}5d!%c7^zfXGD{G6{ng`+m-0RH z_MmEij5P@OY~ss9rFj18M=SR2$LWuqP-Bun3uwRgBbPD%zzx5x-%S|E&%bK^9jpMr zd3QXr1`FYlivM4@dSI7Fz8ogi_sT22QL20u*AM)0<?^=*FF!^Npq||Q!0(gCneAjc zfo^SU8b7MEEs?C(ugd?EH$;J#d|Ujb)Jz$ZR!Mm+%X^rj_xjps0nhkhn>H!uhM~>t z?Q~)wjhmL~!UPJal*L-TEB@^%c&lFL9i5kwB$3iPWec2e$c5Yszz?_E`&pqh!fA`e z6I0^+1EB{oVR3F>;CbtuL$?ufrBUQK4ON9_te5L6Q&t5gN9ZaRAh7X{PFo9gHy9OU zR>DDnyK(JX<*Hv@W+uY2D0cM@qk20)oiD>3hxB$xGEtXkRo|(rTSXe5a_|gT{Nh0- zlQoiGK8|Wypd!|4|5$6@`5S8u0zPoYA10~M4e*)b^sE51224&*wW6=+);~NRWF_j> za6BHkY@egLh)f6M6an5#vBT+m^Lz}P+|RpGwmgbTWWPIoWqSS)?s?#sYkhc(a5*T7 zzUmC`RTt@zB|PYXPwaQtKZH(2PC8k1xG<Kx%kSeZ2R{F=yG(Q`vdhb2^l)IS=@ymM z5x1^J*^&tY5506jf8p3YR%pt52XLC=^!{?a`JytVb=L$!S8=cyc=n;omkQyrQKG;Z zp#^mRJe|2AE?bqRm(n#;bUrF+l0|wkRp5Uv-sKRX8foJUgMMBAh%FQFi0nsZu+xT( zWo2s;>Mk3Tb#gU*3&#++`hg7&mipaf6*-`1gz*6D7x20Vu02wUk%hM^Qx|iaGV9as z7pel@Q1_W}A$vPzL~X2HX7mh<<)sap0Pw;qravc@x?3%3p96t<1lX%$36&$i1y6p! z#l4!IlA?W_x~r10_C|XBAXQIONmWw|?y#1Tus4qc;Mj`JCg;~3_Z9_d$P{{s%v>ur zo#h5x@$8~kgb#Pi!=hqJd)r2LGbh0DPpujvG<=)mc3WCYNa@<;@*Zi@ab$eZA;35H zef(G<6v>R9V+>2^lLg!$;OYBiOipW0N3b+8S2m{78A;1D>h}-&8CU?0THXGnu&||5 z+<qOqFS~&XfBMQq^LBDdsEwLp+<u|{B`v;#Gsb}PSD*EsROgO1wM|5)mXK{|rKUPp z{?1~B0-k#Nr$%;ewg^+AZJq|2^3>akAS#>q#$2CH;({1}y|$`)N%(S=%cGXXJ1>-H ztUr;~4PXlZJpbh%jdJyOM8j0*@upCvIDwS{xN!dujGNjgjEJH|Qg%dh6N?78^qa0@ zq%nOR3Ou37RmD0(MOxCbnU)7|`D3F#5fZM7(}AQ|JH6oD(2$L{>Z1UZYC(5qO*Qv* zU09?E0Xq#E-A@R)9nOSGT3X_%`gpziv$8erJo@k=Qvx3Q;3X!#qL<Suri2T*>CL}* z%yU7vqtS{k29{jf?NQ;xRTwVMITdsx89k<mR+cB4ogMvk*$V-#-Er~<Ld~6wm>P|~ zIG%W+L*H6fKBC4#+fUN8pLD#*)N`{nn5r#yzPcJ*rZYI~Vm(^$6RQL8u){l=Ly4h% z>2v`#-}ag89$5Kl{A+2mt5?jOdLu*q8yzWnW#^E+Ix}OoQbN^Xda8x?cB!~BTP!o7 zw3>$rF!S%@O;Y)QFm>=~_>`iQsQ_CJy7gbuq)>hWN@2I`3AV$)-S%y`ODKi%Q=-oj zDe;hyvygHY)_f5=PryUJZZ@Infnlvu#p$7TbtjNobBS>F?W}bjxW#3|vcgQL9_7<c zA^J5F1!fLeloq0)-LH7l9cZayBRN?ZgTS|5S#_0=@TH&x&5CtYxS2+gu(Ubb1Ynox zf9x&vT<2BsVqMb;iPNou2`E-le<=hL8*2uEMK4sDtukNUP>?}w_iWxiX5N5fpWD$y zz1_(`&C2m&4V2H2)w}q@PbtqRz}j~QN6eQv?LxO!;cy}UE11TxJ)1w^nEl=}(~3K7 zSJsns6AcONFc~l5Hc~(I8*p;X2s7uqU0+U5ZPZXMRcNkHF?T(1$0rBwFI`0wjODOO zyI*9R1)O>QtEbDa-Elxq7SfB;WF+FnxV+N)Q^?HW+zH@qKRvspkP(L!<F0rTu|3Vn zdB#Y5n41iIbFE<}gG{0=swn;g(`#H_l$^~D60q-euf8soidUyfs;<t!L&l#q=_;K( zi9bN&Uz=!w1D_jy>KQ_#2TM!Q@I5f-IjA?V6#?#Y$6?0Vb~xaaaZr*xS}g^=a$n8% z47m1ML(Qxq>CB3QvP7m1uaV*pb;`h7G?--)nsW*Z6Zp`wFU;|s0d{jZfI_6ITjF(z zhITR>DqTu0Oz6vl0a!D8Xk3IMYih-krlL}g<21nejJrd}P5|xtaQDlEjx5v^9sGy9 zD_S~Gf<M|YfE5_nQhDW>QmU`r2Hgk#bTQCUVqgn;3gPcB7n#v4E{LjFr)d??3_G#r z^V`lfQN4hMs-Cg?b|h;k@R@U$7(N{B+OsX&ie;x91W>LfS}~k6nt)U5nkI@M#IUJW zXm2o`X)oR*mern$vf(0%6Uaovq5$7$c=m`qM6i_4;>m1fu7$`v(jO23*7S}&FGM63 z=;OrjG>H!KX6o?xFTLnT&#iO!q<d*{z$F*`<L5%jO((ZC54m5yO&19{X9O9Zip{@x zVsd#qfq4Vg?|4Ox5F2c3pCRE9Q}UWbzNa*D*ihX_;5A>2G=T%hHh6@{Iq*C=q46-8 zVaOf$(Pr<xAj}YN%9i`&ZZts3Po)uy^1$W&ci2VB_lYbo#~OsfWt`s&eDul#ZV(F2 zNb*`?{w2+Eh1-QH20y^Ze!tnol%w0@*(!{PE?aYX!lRZv64;pW$-{6XtvQ<7jrxIG zjeFdr_~p}-DQ(SkM^c^JnB~1SG2nUMo-}X`M1wbf+g)mXNd{mIxZdkKH3&7QtI!U| z$WV8gD-&<z#sPmmZ>N+{kQ<woaOhNhEAEFAV*{yP$5sls`SNRTmVy$RPzA}Co2v4p zQKApIT3{BKJ!4z5{wDL_=_T%5$;t3G?0W#~o|$)>)ay76)@vRUh;K4<U?54nfdSy| zw>|cT6m{l^z@(|%EU*L;C$PAHvktk*xX7|sqgt&mB(83X(HzC)ewnDN2EG$}#uzV$ zYl<(^Qj|PAa(O&=VY@E6DDdOYjxqUh5`t7!?j6t6rs<{hc6F~dIBlc(5{(5u_ha>~ z(pYCYmLMExL`>^zuczq%8)rXRC3GZ|sjJ7K2Ct`=Y^cisD=xbHZYkr8f2rFz16HRw z4#9Ek8w2NbyYqITMnNi1Z$!}R57kuzujting8Y~Ui1%X($uzX7YdM^80kN&zLYD`2 zJo1@)q`afn>S_|HvEMDa1n~G->wGLF9F<Tms5^Eivyg!Qyyc4@q@1G?5(-0Qo=R-X z9whML@^?+jkJGn$!w?0XM%sgaJswNI)%{P{Mp$rJ_s&U4lOLxaK(~PFY<-kDVdB=W z?|NceEIWHn&o*+;0&jowI<x9<JOsWo%67cG^I8tM+n5~iq_@k=MB$7Sv;mhNdD1+R zO)~KOeGf6|FQaUgv8&Ikv1c(Oz`8FEF>wONg{5mDyqn9RdZXAr0#E(v{Z7&wu0qi6 zh?rro3HIfyJ!-ysT#9bxHo<nMDtFR-2%Ok?`D`iD-7Zp@t!^Xl2{NM_aN^mvWGgt` zo7X?UZVwDKWsB{y+;1|>Bl_%678UT1OAj;aaGI;V@hSl#(Z5@0w+i|Pd|~~#S$~Gr zA5yO!FTb0t2uK0nPxUb&1!ugYUNwl&_yik7;4U41G>)TFg3iLzQvg&9CB_`7>j1ue z>;_+ms3op~-xbR{>i8qX6x%!(t*_|;kNkF|u~E+O^EN9%QPvmEc&X&!4=fvVomqc7 zOBAj6pkd9VPjjyUABdlPqO{1-H&?qCzNwi8P8dGsa4F)rD%FW*Qn6Sno^Df7H)n}= zI13&)=;F1EUrUzSQx&X<z%1mRrZo@x7Wnp{SH??~J?#P{*!V(vWP|=&f){S+MG4x@ zM)8$gA8`Mo=JTYu<1Sdm)x+R3V##^lKv~H{8d$f^XWI#hC=L_}9ee->$Jgiv0OJoH zv5yp|_INF}I3WMIOcFd4DG+Jyposu4`nGqu5OD-=5eZWGk;87lvjz@+RVX-%5{rVT zdY*;4ZF9{9aAm*ipB5Tqb3>a_l5KTGc@52V=uF@R4<-x~j-h~>w`J;#+qGaLT?qKo z^0Q1#+$m(wu@Kn7#1d)(UiIE?W(Dm`Bh%t_ZM5c1rzW<=GW95S9*-vAAt#<NRa)ps ziRzL=$7)EWGiEXYjiXsgz#C5fV1>|dym5PHK~()VZYXfqbxt}=3Oc%Kg_5aOax|4! zA|&4Bx`8Kee2@t{IM$#v(Yhd!jZa9%8oj>#g##zRPX-KLB$bm3=Jl;FWD@1<W!bU- z-<tfK$*6E>*^@EY53!e!=0qOAz=M8xWt{NkNK+lc%<99XB8u5}YYhOtHDlccQgD#n zpgaZ}44lA?0lwI|HQX6RP}oF<U7L9XIoZ%eVA0}djO*|C-j*a$=kqaL2Doy<IOBVh ztLAkEJkh#VXOe28$rE(}zkl)e3#H9YU8U)CG9F8boKEYa%K(eY_xn)F1O(hj5$jm0 z(TvNw*}5R`)0wC2Ck34af{e>z`A0R~rAN`sv~YpFVl;WnwKX+hpXKKmHip<u79xh4 ziB(ytc<+;%K?uOxPx`x=*XU1Ac+r$fQv8|(xcZ!DX<&yRhMX;JbcSR!Es$vWP_qNP zy0rZvA>r8n010R`30yj9T^^mlx#xcPi4YkW+9o%YXNl%co&<pN=U&}c$mHflx{7Dy zAD9>5iVr((B}8(|WI{3>GZC^oc-aIjz5INmr+zb=MGk=JY<KDP&%bNA0(U>;@kfM> z9=1rxS|Sug*=?ytmD3>teUZ%y@P>*JW^>tb0G$#?&{9H;W5Qb>>~ojY=eSEC?|BaI zu}%Yz|9UI4GvD22u{55F&!-WYYIRnm-N++Cb-?m#8!}RzGrB^SRVt$kY&c%x5p2YO zU#xYZX|8V$rHhCtF-T;zF3Siw{pRm35EdL?t)?lVygaD-?mU437rgV^U@72;$n!-} zq|5%gnZP?Mw=s^*09!;>EJmV~-em%y^7ICp3h>3cdpbzPBW)_4N5j2DSMbC$Moi@U zPz+ZGnfkID0NlELGZRpAw8M!hJ;bsC?$hBEv;E?(`}lTmwt+mJ-XkW_)4={SxBg0) zcNUsji?g0?J<YNPE<E@@W_ojb)LLjlPL0*ND&Um^HZ<dIj4dZU%=D$qX7K1Pz($<B zH!E6ldq+(ZIP=O*CerN4zN)FESlQ~yv6eiG$!3mu0q4iQxn9KKtP4S}D!m{NsYR^y zz^{**W8BTbc5^`r+p0lYo^!N(6WvDO8yDR_M|c|TC#2d~)|P=|#)C6t?TW7Wo)rc- z`r<21KrBGAGOLIRdk}kstMmhp0^sSrp1UzOm($|)ZFM27HUk1&e#@N;Jn#NRCOzG; z^^l-iIVeU|$aFGtjP<78)#X}tz;iyi+r+1K^UIEXpb2y#pj@(*TZD&p(3F9Tvc1d> zg%i^Ub7f@Jyf@9w`G2RS_i=v!=MHK9NrdMN4G_~^oNlhAo13IlBKmlLj!OV<{Oqv% zh34P<O;<E0$1{zFV(yk-$b^B(^*%Mbayy3-o{&uB8+048p99?c+%9_wr_OAH*6)$Q zRW5nj{V*#c@V74Az7uL={p?}fDc^m*^Ym8u9QGY|H}LJMk)ws`ct2HdZjjkRxmWsG zuW;Jm@WK>$&0!t?5Zb%?X{(+>c8iE0cSnt7xdMl-wfUh!cU&ml>Ub<u*Cdp4jPyNN zz`!rQoM#esclVQ}OI6Tc>4tjBuhX$yAs?Z$d$N>)T@RnOn{XVkOEnqFglkKw3w?46 z;TskL@c8+UZY?AO7C?ln65fr3bI75ACqdxNN1lD1P!5P!Es_f+dktGX;8u@!nk!@j z`nyM>u_;OaZ`E^VZZT}lod!H@-k8gUYM|4I*bI6#*0EZ-N%vxgfhXQ^@JJyYn1hLQ zHJwb!XAHmGOj}l9mjTxq%Sx`Vw}eubHJQ%R+pVRERDEs^ALOYRxZg!fwigbE`6<#) zwiyBB?%;WID1c+D$1{7td!FuLoW=lq`c^X0(j1EP7F&N{pBoyE74`xGoLno^!k9A& z9QIpa>E7LqQxs5n3YOBtSo=(#RH2{8%4?|>@c0C_{<iNE!f8N@Xy>|?-s(<gnq#KB zbN7+0pv#Kpn@J#i3Y->iNm5#vh$Et_=JHGh{B2cji?AD*sYo+h(*?{ecH-5rv-(#H z!GI!FW#Wy>4aw2%BRRASe5GUJ??P-BzgChRg-;UKuk_>=<G)$efrnjn#{eN3&?V({ zs{YY&wFnXRVe<)G>zG~4WbbUSVK9P8+;p3pz20myfeW5qdW^6a96Ytg1m~vs0XG=< z$_wRPgknH%h{5uBZJWvl%A+^;bEE?J^rSz`<<Efuq~;8j_f#Oa<5`@*iX(dLF5Ctt zI7OL~9%(-z53^mEBrv^tzPU%%i8!H$%Cofo$t}#WJWBwdy!hxVguTF&=H}T5hhbI; zj{KHP7Ff5}-%U<Zu-B1zTTLf9@{R0vrU=~jsC~?~NJ+@pu_D#ndf_)h=Wk&p1wPTU z$pp;;!~^yd13=t9&k=N{kNa6)frsrr{xA`7Ko&3|1u4M0tN_53k9>NtPz<bDqo{dH z&5@;g>IH7!bvLu^92iVsj%_eZQ!VB3TTx`E!I$xz0sQ{gBIAz__ji@rwIWMw_A|nA zJKtq$!0Wbn<XUNLzyeRA0JU)uBRYB(OAc5$X~|<kEMVN!i*j{lCW|1~$_5=+`|gp( za|=k1MFq#DCY^gkUc~AGy#D?BR||{d{nGQ)O|(1jY(AG|3A}3YQNx9H&~k)ED4bqC zmwg!E$0wGXML}SybsWnav*Rl68({4tdzmEOz&KHsvaG2sHBTBI(LD)nF0lPyE7y_c z23RB=B;AgCo=XJ5dwH4wZai@66d@QsO}Oi;+`Zn1U25QAQ=i>PC<lf#;+eTgrI-}( z)k~|4yBZjNYUG(i#Su;J&ngc5Al70w`~&U<41{v_b90yFJ^_Bc`DtHBLjy}+<dM|Y z!M;vykbcggJ#R6ez*P?nctz+2Mm8?Iq$GVI8PV*IH`jI%_)PmTW=Rrgwj7ZlW^<)2 zb!O!Te!l(fCJ`Y(PZQB=#~jUloI4r#<moRNk3X<xtjtO#jI=lh)ge5|0;iof;#Lu2 zxU)iWiAk|+9&LP#%>?kh-P=vFPGAh$&Ppyxp3n9Xcv+_g<B<o<gr58=Q!Q<ISUi{e z2DpE}&&)Z(z^JB3Ym%JGM5-Yz!pyDg&u*u+2>A8Fl{<+%14=1cl$+c*9y`FH4}LaO z$OYUKO6^3RfttiJM%8l@KbkkmfPb7<w4o3W@G4=G+~k&XzXJyhyZCQHF3bwiZj{I~ zVmK~l2Mt)g-zGZ>wLqtPi<~?ZpJM)i_g_|)6^hQ@B%Ejp7}h7|hsW_6dAtD2Zs=e( z>B7egtYcn3_exf8;QL*-HG4sUi6D1q08aQ0+@rt)mUS5<O$^waoJ$YSS6rK1F6<lu zck2AHS-u9kbaEm!IkqrQ2W&_?{-6e2aPOT-;Vuwa@cZ2Rw8UDQaxP&{;cfxW+`ZV? zoIoJlbD`8qHn0C=uZ>UN<%0hR&jDXlWiI3qz|ORH1_1z1+GeAhgjj$})jcNXgsg5J z!k4m{0CrpA9XTD~_aG}%2{LC9Lv9%h5qSEH_l>U;&}}}(D@^5>Ue4S?w;1?a?*Ru% zivwL=N~;UHIE1oXusx&uI=8twh;<!!`LX{tiLilnteOoeyT2x_wVp%D5kiQu5P;3o zOU-&A;EXF`>OK;0`JN{-@(xcsz_wS*OkzV|W>mCEqw=|GJF!my{Px;A&82{$MzV(D z^m+BY8&d=xwruNdrNaUf4!M%_W=STF<Fa(WgZ_tTM1*W#W@j3B+V=zY72<(tm`sjk zbo#$Fo?8!W4`x}vVY7s2z~)V^C7$z7JZEmjDoc3P{xe?}dVyJy_D!X|IYz)9?4<&? zS#eZc$OZa*a-uF%NPO~ZRwCd%cV1}r`~vM|1<kiJ_b^Y3z>B}V_F-W#phKl~6zyyx z8B(gt)C^K+Bf5ERKP^GvjG4R66pDdagJ{*H^DXI)<n{u$f3JthQwa!=sF8ZN#u6z$ z4;ZnFeI%zB0guWa6&*eWK{{Y4og5YU8q`fU7x?HVhkY*14HzO{Ks%4IICNW07PwA_ zdBz$C$W~FW6z-sI%B=@Z|M}a~h1-CUr|q{!N)S^?D7i=A3Z8v{s}B6m9JUH*kkZKN zrbI)&D9aP9lfZ5}pKm;c07Z3HSz9$q<jOG&k7Bb9JaYdt-j!wtMvY!W&}r)2ZT^t8 z5;*#*BaELPh^s_e3D3*gj`xOv!&fX{CA<YDNxxrIlBIo}oPN<b79?=psr#6OsX%Xw z#hsk4r&HUxR%0jd3<134p<#w(AOc3ihj!g3&{OWoeE!Qr+&jSIzkJ3dmITH)=EQU} zc}6lQBTSI}g2Y>QjvOc=4H$9qhFWR&FAup1>}vprJ@Jq^Hy&6oDh=0fP?6VWTaO4v zKiyJ~a$x)5u13=-IO}eNy1Fg==CL8g%r|h=RVSNsD*?GGzDf0yLO6om{%k#fSJXad z^56ys*lnVV|8N8;g3wp2MZoORYfMlmY>vpp=jUOoGmjwP;H%GCCfywvL8WBRM~x(Z zh2lXx!1IuPl~ohCW8*ZF*ccLak)$G_=ysVCN_~$R1}-|_y%&Yy096^6`_h@uyw2M* zY>0seeYkmU|Eh|P9j7S=fZi_Gi7OF3)r(mLp4>da_(K6!DgDt7v*os*hx76t*zni@ zqnQE2R86n;SOYYNOvkaZ11H|J!v>KuEo&u$<%vcwOCbl<huD7uUUmEolUEREet9Bo zMQTL{B82)1+hyP-Uv>XXcnzq(^uM;t5!7~J9)at=x4>Mh6<DNF$dY<Hch96Z(-sN% zSi=#o3Tpw=Y4*Q!Zss(xP6GGneAD$pF3{0vsibP<=I}u#2|RG}wkCrp&?Ra+xPj8> z>S;bVySEWSyqjlqV5heioiB_ARz6+`f#`de^yHj}ZTDlV!I?dUc%X-9LdVr#bm<9Q zqZYyG?aV3gho)`T6JmiGSXuRHxH{4EVk2li%QS&!KiuO9p&6LrM6nCbbt>WB0zTVm zMUhbM>z^|A%%=5qp%{&hwVc8vfaL@4HJexgS6Dlk6hkN|ZEQKuLBJRGo?=up;AP5o zZ{8UF+H8V=R~9#$=wNuyAg+_h<O`=i$)*B$a{DRKM%{R>N(#A$(8t~NAO}vIe?zo8 ztY}S%FU%8Af0mg94p^(gsN{HmC(|MvHYm~B)=JM~#c*FlJdZ(|-Bt4n?9}zN{-Qtu z3!-?XTNK-x^97eT+d-2AR?hnR86ml&pItRQ(#pbf*7xO>0$YFE#cb9FVi?ugx>(BW zW99CSMmFHU)E`;1gbbL6X*fP1+8r^JzhGj(QzzG%#Qgw=C7DLLd?eKhrzjs$`ziTb z7jE#YNGvb})eiskjBzA$H~a+d2;etMRva&6ck_3IXLPllwfvUwK>Z;+6oJnT*mQ+Z z4lMYji}Ofz3-$wn*Ppsw^yatHLb{+hpF~HnQ3HNc{r;E2V7RRS!TfRHfvlXs0askm zLumH*i&N(<hD)v&69G=Xa^<~3Bt(BGlLw0iVl3b6I)UdGVA(ZEGYbUtM}_6RCkpfQ z$|5%5z(?wO8(k0B1|2BS?r!c#!I|7Iz~^sVVwN}o@1nYeB4Mosj_}nK7(nPBc+Juq zN<^rE-p0INolRCyY_+|mHK%LUnHvwhVEW_l2+cBoZ+nABOV`?G&*Ayr&KeIKbogn; zNCtK*CfCv!A}6Djn5OVSsxeQey~`dZ@Rr7RdJ5kGT`(TO)KmdsDEnUG%?6+Fnvm^g zivu2}b?otTo?C$HbhxIglySm1D(N;`Je{t!txM3=wtAB_0e6Kw6_b*?1MlMje?K8* zvc3k`^)s!SOj~PHyLIl-Q0ca|Rute7N8e<&HNvP+hTgPzGd&Y4cYPQtE2&PX8*t>R z#29H;-w<9V$J%S-%4#{yxroOBaLXS~TqGnM?}(ctHk2>3iV#qLUP%IX{(i|ZLa}EE zQ{EA0)22n+=r#efyLB*o;r&92lVoHy?lfuzOBeXU<v*Lv0w;dKjUpQAe#KZaaZo_O zhch8y!%?H(khTmDVMYnqK98TExQN5nLRKB%W*^?Wu}}-^bX@Qi4^^G5nJ3`Li{=dz zDg#4!3SO9L<a`|saOe*3r{Bir)Iim=P)Wbb%mCLr_oR=7nXul{0;-)$=j$D@6mhf( zxc#lejS7Z|MbVJN7l%qEPd&inw_L{vw|9tGsLz8V;WQozz&DOQ%-Ac(cC*ri7zvC9 zIrVCU{1S@?xYko2Z<<Ry#8ha*><3vc9<t%VLL<z05sjQ0coJ(M@TYf9SYK%M2^Uhx z@N6s6Y6IM^bW^hn&^Mfdb#<u`$_p$M;P*Gad4w<#Had-<!;I)#R3}sz_~@-qnTUGW zND$lQotZWKjH1(+AOk#TT*eG2haYxub1wfcVCe$aFMFq#G;D}18<{n8&iVE$YLE8n zeZNqm@Ua&!hWbx$O(fNI)Q6HuLL-2E)*ZB#l-Sl^g7lP*9L8v;9H}JdJgSQUE2bSc zSBg0mnX!Tr57+4uz*U#DToPKsIi>#^Crbh6j=jvR8XeZi!BobQ65HvLDO5D_C|wco zp|PJ{E*15(TjZT5PPe&Nm|V{D2=L~8&M_DMbhnEe%O9sOS6xD`ueG1C9r~1)+fNPf z#BYw-d#lDn$<<MvKzLV=v{~Re){uupvHeQ9b)8ZT^9@Wq{ZXYf+i~vwG;G5G+1V?E ztvl|2v=A9&H^5Is%hI{3@Csfe0B<dNrB>)TrrA#idP%-0y=qTy&48O{==eLt0xZ32 z%qc>}u{wS#M!cXfn2kH|fUBCDgaRqM*CBoi;KPhE+NPq&W23tJ@$hvuKfr!pu6u}3 z%PC?|Q@1a3qqZaUMWcYPcKppGO*w`zj3rN9j^9F)02Y7Wp||jnvzMqL{_9$vVd(&0 z|L{Ju>ewltbRgP;Ss1{de$5mM6M2PUOLSK@>A>k74>G$4Ia^{&l!iT+xtjG2*z2Tq zhX^w{HO0BQ#tuXu`Ehy+p^&p%AXD#h;k}s&;HdUWBau)hxQE@_C?4yrI~KU?h?n*g zCY&kTuNx5;cvNhlX#qdm<WaMS6v~ZlQ>yFI`s%Z_J8BBROHZG;RJd`bN#TZ3tsq^o z+_JqU1N>y$Me7I|XLb`Z!U+HEITGmQ6Iow@>-@Z;hfvCCCM^d5G-h!p0k?SXxQ;@@ znY8`fsEr5T{Z4nV{sSNEbi><1D5t`>?b(QV0iONxy=EB}K7?SEGHH0hl*#KEgDe|K z;2!&5ZoH73{p`%MdodfpUi;o~r?kY$F!hVX_(jeTIGafU7Z0p?Pe}F3XHj?@&*4c7 z`1RFW*GT!$#)Rs~F|+`Mc?Hh7xUUII<kS)0vftK`i=H@tl5mkzV?`j2)AI|<1K97E z*?ojkXnREWVc(3Cxebkdv<G<XVZGXgf)o4ocMd2>_|`VJH}e1jHaxqnA(oRJ3g3CR z@-AWuz%8F^*iP8VX`w_kJ~3aw!U0Y!8Dow>jL4-d(T>|7CI>un*Ry{V)^aw^=`H&W z;Y~I@;8LML)2!z$;N3mQ7sliqR#)KTM<tEB?I;Sb0K|U}kE$lwng9p>c>D=cbr-I> zzOA`MYAxYO6L`+{S9F%&ii(q!sEcQ_#f)V!@;vD1u=8BQaYPqt1za$GpVNc}1=>|p zeKhFLX1cNuZ9a&$<WUlMz<ul86;-mVrLByfXHti~v}1lGTPol>``mS^loX5UtFtUa zNAZ1ZAIoe5H|lf08QnCsgt6^e$(fxr*TCY~=Kq$urKig2v=;^NQg!qi6r0%M(quf2 zcx6RBT{@R;Y}C(*p2N}yj$Ru3LnukoOc*8OO=hd<TAJpVvwis-69g8Ww|~756!RNO zP)`Ijuo@E9C5m@!pj!!iuha7Vg_MlWFj7+}#VKB_{!8SLAE|q5N0u1y#xpasg_i7) zgwY}b=4Q%RW7cWrExcL=UUqxan?jH5wCcJrdPZ*alG+3WNgN%nV!;77DqsI=p*S@M zMK9J}tXviEZ^P^~zKDy|(cExf#8m-r%bc>cR8?JARk)CTO{yEnV+>ezX8Yq(orILa zWW`Tck%W?Mc$BfViR8}@t76>RcZxl@@{B`;W-j@cQxed8y32Mxl8dxzSS!x2Iiv$T zYNMOYioSOap%^+~>1H;1z?V<>d77{!1|h7OQ{ohZtEUTUwU&O)t0~~~#UC1zJ*W^K zthV&oRgWBC`Ki5s5>|5AhshLNPaH%B!fDj{9W*82*UvVagk)LzhBXS08M&inJr)h{ zien!<Q26Peqg|8I$PBR>HHar`;F9CAM+%WXIfy{Mnh<)(zBXm;gX;{1(i{{pO%<Dw z>p#J5kE%0xLIB=<({0A_+%q3_j3-k=*r{{7mPPCr0MFZS?FU2(dE3AfcW}bCsoQOM zujORp#8l;LL!PT&!>mwOwnD(CUeETImQ2W37vxn?Yi6;mfY*FD;1Q{zrjQ!`M2oiK z`hYLT`}LLj3TlzjfLuCex9Il8b4N-Ixh4sv!IsQIGAY8kXD1$Rz;T1;nh<whRVeUg zNL%e}RoLO34=$5t<rSO}TE1a(7Y|Ng<+>fr?#kcusRAonfkIo4bs9J>^MzTD7o>52 zLU7NpVFf-mZL^m|aFV_dW}fMKmqa~90o}Qk-ujfd?*g6)fd{7s{~|=k=8%;T)$an< zs~v224%n%?o=Jem?r`IULUr6)(H>KI8_txfTuJ2z)FVFbIsz@+vA~r#j!OtxSw4hG zfMz&yG}|Z?s>A=AZKzoT{@m#gvuhwxlrS2YS?GlVL@#1V_$QcPI&${|514rGL&D7X z9BpJz#}*us!?pWvLyNhgz>QxYb)L{BaVn3~yr@fW(x>TiCCW9cr!><T_}Z6eabVX} zY&|L4BUn~Ufi>~k?+abJ$pYiQ$v!}^W-Zo@SUG{qPX2J5)Jo2cpJS;N%+6=S1MK(f z2`06<7Z<CdQ_J*!J_OEuTI@cxf$mM<*h~ArCDoc$Rakjc{5hL%;QpPiH_NdtLn}s! zfh0hz9)VS}*EX9oTT2Pb`J=8#7Gt4QPi_$kEu{`bA>dv2zG?gfN!@@=Q-#PvV&#i6 zH}jSXaGS23-jg;-7x>Fm(XHetXWxkO?&`}IOSzr=3<?2$;aP1x?L><}Fbb@CyYClL zSiCkVBTI9fxvZzz%W>2fQ%xWOTz|)7Om9$(L9cP8wIU)_^##0K1D@7#x!D{|q?8@V zjxFjmxO<%%#zT^n^PAjx2)&SzDk^Fra?N;05kDcJ*UjT-l1>InNuEQZ&I?|S?M{aR z;{0=dWm>k9)LmGZLBoDT8zD6@b^jKg&k6elO5(dLe_51)Z>+fI2Q+6ZZ+SMEq^x?P zdp0wm_?1tE41SB2yJaO7la;dafj4P^hw#FBE7uhD@9ahwB<-Xv%GN~Ol;uy<V`ZjX z5%rS2il(-^+=nty9Zxo}9|X3kP$$x6NN7j~5>)>k+r4)K9hs#Y6LmZzJ0w<{r4&y{ zs|;PA?Ojwvk73TIYYCLhiAo)ATp3%a0HNVZo7@iQ6ys!4P$karE8;fDk9>pT#7n16 ztrSO4Wd?T-wugQ&IEuwkDgA%Wp05*&iXunvE}^5B-t$bWhq&pnc6y(zer)#!qyrV@ zRjHDe#B97&OT#CH4Te<X-n6Mrlf8F<VNJ9u6-EjK(50?22L}ZXI803?+e_Q4np(=! zbuvgODK*iUS`#+tc(_9;XYEnd{$&-?Ms+Gd@AOgrSiD{unX@)!ox_TeNeQ-11^`T= zewkhwM?TH91~!81QIJ5eKIjnr-!sD#;&cgj&Ib96QHHL`rWw(T$)Rva%eW@}2z4FZ zF8o(jGR@DBnJ3mjd~4FGK!t&awhJ}vh1M!s!jtIaSR=hQN?|{h)(Bsnf3PMZrmcc3 znUEkY5D6-dQcKFZrfCti%b$d;bh2cPDz?kh{4%wHi3BT^p3KfBLrGfZ%TQNd%$ii) zrm1KLLY2-{XO+qgSDQ~}O3JQDbvn7+M<7@utrFr3TV@mB4R3F`yjL6DC6Q`elN#sq zA{giTP&}j~X{T@jT^yaI`VMSM&^=SM_SA=>)}*40zi_Zw%EpizH7Q*eQ!llt?NaK< zl4OETtE`bELp-1i%nl7SzuV~89lWqg!vigg{H5YkZ7kF)o^t=tJJyhsD0WdZ4RrN! zA%yklMG9_CnmP?7@6SZc(X{ByqrHtC{X?4DsnXOG@)ol#)R@ZDh)g|=g;ome*3FAG z#v_X2df4o26Xw9#lFAgnr>%xVl%RD%@1<*6uP9e3q)+ru?Sxo7Jd&ns<LExoG~Emt z!?s{JgLJ6Bb@ucWIbir##BbnIllqn<lk`k^Jso+2yBoo{=(<AJ9SgGV{8$X>pDL7_ zb0dE`D^G?c$4C&4aCcL6j2xc!+?18QAn9_s%9Q#?zM)}iSxBCaT^iN?>B5DLw9vXM zQ@O{A6bj7m(S7RtRFdj*3zH*d<XkqB!4@Zzyv5wbj9InJX*6Hv*Q&(@6`^NqwZ+NJ z2ZbJ#oQwjizjBumH@<+MYJOWOfvFb9O))4VXq!-jW+$sahF88a91nNO7}q#Ntfn$L z)W^?~kaLu;mMLnR7IsA65ucko3=3R8lASI8GBS>kfeBG%X`z^^lNUnE@X$^;Z&nGl zh30u5;lKAhGP2{|+e-NuizucYF<e8HjWxte+i6jeuUg&_DZD~`YS4Ayf*tBH7_e<l zLnUGo(E%PAjQtvO;pl%+y|o3TLT>p46yU#LmWBDkWm`#s2=CteP$x@>W@odVn-pJ2 zdml-aZB1vW$T8p+l4qE&ZAy%Vv!@;S!evjdUB%T^6KhfgkB=0f!FnTPwg#e~jjPS1 zd@WXDs!!B;9Oa$Njf0P6RU*|EFQpL6Jo3NN>6Y;7ObJapj?`d%j4MLTWj$Jgt4Qeh zzy7-tVQBd%ho$zHrf#DAmAL*moI@#sQN{nx|3f`{74~!3bN>}OxocR{aVAYr6UG`e zS(nT0N(gO@hziyw=m8%}lQZ5??#4)9Ax<82y>Z2Ic#Lk1`G%zY+U}9uEmBJktorNK zzrwkfTn1xXbo7zNO!)7uFectCG;ctVuSM6Pn#g5vb_f*I4e>rMxHua@X*^R<dkcAa z=1vmlNy-+;xXo-Ht?+(2+f*VRScFBeium~pZ<q4xve+PMpuKP`2h=Cx5k*wvmCCAZ zCHCN>evJj2%sXoJR+&;KkHT3pQ<7d9hW}_rQ=(NbhG!#k;{B<9UeLZwbPP7vR*4hW zka+4E6@UbEqkKC(@f6NR(?*1U<0+wb?@$@a_QtMIeY}MZ(;3S^1BZG7j~-F!$nOvw z`tzGaXn6tq9{FSu2-}KlqI)iSlM3|*3OftEd=%7V2tVFl`SPmS2@w5xAw^W7*{q9C zWyd;i1wPeKyBT^_L@SYMWYbWlDNQZZ-I3p+yCb*!gi&`z>V^e#mA6(bWwADTR?mE( zq>E#TtmOH2CI9lKih_}uQ>y`TkC;dA?n~t~|EXRP>X;z0Oq3q+f1bNH%t99LfoBqk znTZV!wH2z<^`4)e)vIa0PwiII{<Btz@NfS+8z3Hp$EE({f6XIVxJG(woBUsz(dex? zGJBKBQJ_#Kwa&K_7V$%6CTSTFOUmYGu&DF3Dxl=bGdwqvJ!0criF|Ya>VG3==s@Ux zWUisfj7h$RUfoCc5XBm3>QA()Bc8^&!Fozs8vP4TW~^;`H%nJ3#Y4XO@1$b_;hrg1 zA62F%X3}jfW(E8IZahbG`2PWO0e_utpQk0K{@85Otf}zGbulM^f+NlT)>9fhNRRXd z(G>YRr>(SnT>tXn&&@cQcuP9ds`gVo+Qd@m=N|JMt8|Je^AY%B&6?w1)D+mL$eG?_ z&~<#U+VZ|Du$KSLWKHH>NlN;Ajrw0E*6eKgmn`F=ZJhiv|0GSUNx#!wPMA#XKmR+s z<w@JK&2H8W|DxSmOy=<6EPCFAEF_|Z5$+gBAB2Ca)ZUhaPcTN6I1x!L^ZsYjlC`YN z<W3t46Hr(xkltP^to)1&dEB%*P75!d@S`Q2OTY8l*Fpv~m?5sfTpWh<{~c4_s$E@K zR@Z7ih!&5!XbQIvsc5e$AetEQ^?#>Trk2@!kD+`J&So+pXT!7dLwdZT5k6T)Ew<}& z|H7LtB3kp8Ha04yg^vJmlk+Xm!W1#yfHMH(Ea==~9kb2qGsF~Ra8p=g^^&8j)-?QM zYI*n<Ij2imfv}?*%$wpLsJ7)8+OoQePNd4^V#|DzFC(fj8hV4om!Ood0a1Nxr7PvC z-E205<{t&Ru&ymbR}Hn&Tle$G-jq|qQXOTyD#tDS8|p+SA-6@6o%vXISWa$jI^Bw$ zj23ke2ibdryAK&soNc9hj*B@-uh`3YR53(MG&qZp@5g5O7X9M_e&SWGVz<6)PDtKy zeWW-$Cq@g;c0>ba?Poq!2aU&ePtiteQ73h<K>ldK5oGh*xH|ZwQn?fK;3gJlYFC(k zq0bVqi!wc>yeRA3e>u$uYMa^olCJMYvbyyfr8w|xz*(o@_Z%7G?{k;-e;ZO(C8Rg& zbzzy06^a|<aSP%_=U$WZ)tXMvpqoL>K~njusFS<w2U&YjA-|*0Xd<g#%kbx;(%h)d zs2kB_=OtPcNA@8OmCOdk!zKFqVF#*-{)Ur@hnq<^$@Z%g95e#-cVVARi_@6N;y8GY zf+chjTdLkAHicY_1$0NT`{|@abE4J#sFKc^QIb&H{j@ArM;p|Q?uV++{U3=5M_L1^ zF6pin2tbH_UMjsnU)-6fqcjvx#Lh1%%WGmXU2E+nNBnT_M2w#BLBg2#gBbqQ;`4nt zJw>T*FgCu=RlcaDF`@bM$_HuX?Kjimp+AM4^{SvNnB$F{NuuW|J)fWxy<f44Ddpjb zNC}q|Qn3f4<o%jV8f~pi$7un?urlqkPc3e&%5d?1pG>E-bh@CKOeSu|^}eVJiw0R= zV{}bVW#ZX%az2KD*{xRIxc9>hSqb~pfcFg<Qk){dzBr}ssl-%oYo#>aK$n!1$Fp^r zgtAcK<tUnfTNNhJ<rr2s>CFwj@2<Aov&a)nr1Wyb`eAr7wpUdu-O9(v>eV)s_YIA= zB)xG$$0mL4O_ICjb_pf2(mX?(>zNn@zSMTBM~977(6w+?1!kPQ2;^PU5WrP8I_yO% zYup2mXd6j`GJ({leu|Fi7>gH6E}$$;rAjs0_GvO;cml$g?9g~6>gC*OH6}*y^JJPb z!ehyO(i!iwTHIKYnL;@S-e-x_e9|o3bOR+zV=KYdGR+WOt4tZfU~QTTk9Y@UjD>}& zk+FfMm1c-slg^d1IHG#^2%A@XT{4}eLsjH`$J&zKt=wp?PrmU5_+Sza;AzLwBjWCe zd7mpUgOb^muTBm0zM=6e8GcH~EiU!=)L|DbY&$JCNUBAjO=}N+6A_B`xX@L3$vSkE zm-i+5g$_^a5kYdp2=czIr*nsO^gd)v-KbQVnoQD5@LVsm=RxsITKi5$y@*-d(L=`+ z)Il}69ELW@wQoWx#LDZC(xf{{3Qwv`BClR2M(%yw9Cdua`-yahJM>zp^S$4Y($vi} zb_!|0P^X%7wYn-TY#as74tT^`G6}jx-seZ#U*r1GI2&w<QA_IsIs0D0R2sP$aKmOK zlJ#}5j5#cZV399<-zr9vTY7<c+XvQ=-8Xh}#QwVilF3!MKpr)J?!A0Nj*&V#z(?$r z*Qn0_(Uh*FTT(wCW4*qT@~G()A-7k5r3N^LdKvmbnH+xaMNfGCy_P83K+9YoLD}(4 zH_$rIb=`&(P6cXE*J{s&f1Va4Ub)li8j#YFFKrJYE=uDfRVC}M7q+fc!}n=zxjP#w zZeh_hwHxDpC8I$i66h|^j4AocPrNv%U9Iissw^@7z&@;O|6Z+e$X4WUP+liUamT-c zYGIU{ElanV{427qJa-`9(*21@AX^n9rLI>Qs}zs14Zf}r_wk1XnCw=<8v{E&QF^gE zJ!lm{v*h&sIOJYY-!Ggl4>v)o25tTG|3LXHMuLIL$h$E@a%IP)p*$*))%`Z$g6K^G zOg-`Xl2m<FTP+zvze^&r37pZSlrEQkU~j~H9htRaenBs@#xtC<XPZtubFIQT+F>`p zcf-}(<@Sd(iAIUh{h8FpQ?oPf^e=7iA*5IIk7i`jsYZ`RWlHO~kKvM(%0t5{7|-uU z{HiKViE_2cc1mW5Bb|kUGio%)l4}0b2XcIrL&_+*QObN+Aw7ij$~|%~oW<IlSeT%! z3g!7bK>$46#4ZWq4fs={M@l*HAshwVNr5%}+;nX<9r7L9efUuNi@X=CnQ-?59Vr^y zebmsQL-2WXY+<6gt$9jYb1l8^)<FG(pF!D149C~BF1EhjGhLgdr9A(NNYhVh+Zsrl z#&#bzV&w2)qel-PL(^r8x%b1wW$3OGI`5#a`Net#$-9+W%k>rw9(|%(wTWo){aVi# zvNEJa0^DWuWA-BTj}XD9J|v4r)Rat|uMy|>zH3M<jAv?^TS$;Jxsr^Aw5mU777mZ7 zYLcx~f2*f{*^+D-U9muy7z#^mS#=kl=mdVic`4c*v(%|M4#|r`(WFIQolHKmLf1lR zO|&SVBwy`Co$yP#J+&!bjtGG+E#r_@Hh!aHeMLRXw?!BhDIJF7tyh}5`812rwKuV( z{!HDqse&qFyYEaYRYzT;Zh}CNAX|!<1TBv!hBP_0khEmz@R6i6{GFDD_wDeVN0Ihu zex|3Iam<6<EyV!eRV2;H;=X7#KD=8Z<WiK`liOM;p)b{_w2j0;W`<7)=?1i=D4LYX z#*%uzraM0=1yTkZaW}YowpAZ!A#M;f)#FZmW5TFj1k($5;<r)1QuK%9{e>t>&R>dx zNOF44AM5VU`4h8l$o(rGNg+Q<kVatY5BW+PMD>tL$hR{nm7gT3eU6atDJC$uJ{$5y zrCK-5tD+H{4EegMd@5#=ILu1O*SJ_K<l{tb^PKwH;UV8Nw`UJbCPKbADA5w~DLn`s z@@cjujMeHE*28KFgHmEvNI{bl81fyhjVSQPi;XZz)zR<`DTh%}hQ*2<X3@W+ID0IU zY_ExD$o{L5q;&}XCR<hi4}<~hCuG@ZV?$X6j2|+vY+Q?n=&$A^5sIbp8E<Zx7SGZ$ z93fX_IjtX46i&X$!Zw({u;>o|o!*(SeyZA;CF6z_yh>2TC2DF^n@huN4~rJht%*8s zgsZWOr2y3l+s8tvZ%@%n;^yuE{D4=Dm1R?>>^-M)a@8bd4klHW(j%&K_O6&#T{(4% z{ZaYUnwpAo=Nr1=Q`yk^v19ir*}Gy+#gwwC<&{$=s$%{xD<_s#PAQo-GxW<ntGP0N zsmaw7t4hlL9$Kinq*^oWFH~JoZMdiFR2-i1_vDg2r%nrgS~(@;(`glxDoUy=0>5Sn z&8aL`yn$@RJ~h)y0zaHlIi-B+jB5E@S8mD#z6BGJ-<D3VoaEKFZ%wuNWqC#EbS-z? zz<sJpYWA2^p?eS?P4#{|wR+BklF5~mbXVZZ>XNETL#kq`mMXreoKiy!?_<7Ge^+`` z@ppCQz7^&N6DCb9shLw=>G7gJsi>;1oWy+$!ur$67AgLOD=V*<P%?c|4KYwQX?l6Z z95hE)Qc*IEKCP}PnKX&&VOilr5`V=M^t<;lRTTbd)wGHUm0q(*GYu&!V<{?lom}F4 zOGCu|ad}BiiT!u=%xW4^6YP&BO)V>#L>$xj5r&B@epNYf&V<TIcJq8+RF{>w?Wx{_ z>Yr0ReS*#Zgz`Dn6*Z<KrdE+4s?8{#GiCbZ(h4o9eJiGv&r!-U$5STtVa*=XDoTh> z$pqb-6>~_!2q*<_P13uWl=?^006kVJp0oL&CeaEj%0HusScV*7@{#1DY<re3LQwAP z*s=7%oW^+T9N5=6^@&Ws{^ZT1+cI@=<f>CGRmoU;BPDvK>gg$OFP2DtFcuK?sVst> z`i?d@MSX`2!T*N$CH^~UTTb@ZskV19x&CB5Q-hUjO+TD7N8*9(x)srst}n5Kt;|qh znye`)1Wnf|N+k*0h^}v5Ge(<4C&41Rg+qDyxeAjzB`Fj5u|-A&Rn--A`g-)-Oc)Qz zf0=qwCuyJ0PtC;@Iri#qPp62*n~>ynAcvO=p=g)z2u9v#S01lzYb2@Df0eV0eFDn$ zF#UnQ>Ea9hD|!vUTlD1nCBh=PeuK%ER(`Z@QoqW3S(tHw%sqB$Qn$9_E6oebdM_Mw zp~tL|?u~SDxurZigj|lgc|)3WZ>%GgM&u8|NSNk(&T}xN-KPKB>~QEwTr!gZux0|` z(7Gv|QvzJ2)n4iU!h0aJ!lo7)d88%kz!YB(7k+rku877ql^H@I?<QS*3fVU<O(x41 zMGxK0b~e84wlhCvW{;G@gF@QUwl!nHx8oX8ALL1!tT4xvG?9Xh#W}YBx@LC+kSZqf zVK*_Fjwo%Tts8UWI}MAFtTvVr9gUCrp&@7W%xpN&v=E?8_jrax8FQ|0OnbRJ2xrB? zXMAcV(TJ^G?Rx7_M=p*^Qt4ECbGl8h_E~tC&4L#`=IX$ltyT+OGH<j{@KocksUubY z*VaJ0s()<-Gh)eke_0K3wT2m=|Km<z`lXa&RFkF%^k1V+RxN*>q(Y2YP94u}jdB*H z;bGmg@>lhZ$~lo(8kwV5Gv`VCHJwCBT{?^%Csp7eYWrVP6*Y!pTGg%1IyvXBsiY>; zt}-If&wot~&bIIWs*3PgCG1|<a23U5L{|i;05>^!E!ZSOu)Ba?=lo@9COwaQ7<cx; zoE4GhorxzY05xBQ!X#s7d=@FJG(Y;k3TKWy_1X0Qy~$soP#0M~y1b8;e6$}hUi?`1 zCww*g*s*ok-G~=Lm5UTk{Lk0nRTXo*0{BDJzDgX|Cr6)~OZzu;FiPcQ(Ini~nog=$ zYB&JM%c<VEe*hmW%(bx+`(`T#NB_5gU$a+)F{S@WT)M3}5LaB5ET9ptOcyjzHjMmE zt1k_%5N^4CL)tLW5T+WGzNn8RsBxeiYG3zJJR!e`xKh$JlMfkaHmCmNOpx@qpE}zR z%%5PX6hfRvbO7%MVJnie+3+bvBJ^$<rE^m{gxT0pQQc0Rk~$MJ7b|woW<h<z#wMrv z(87!8jes<Lnh{*@_<oR+P1q2Ub7iWD&XB7$hjGwz^gWk?IbDOFYgI3(fYITCt3dbu z=^vX&3Z;Kjia-X(!&C}93EvDJ%dBGT;3*$}rO|Y92@_P-KsHEb<p7gPt9MO|Kj+o2 z%<lKObwh33sstq2BQ*^SXeDh97JRCi3WqGn%towNNiL~Xr|GZ;rEB7N6-1(Td%U9m ziz?WqG}JAvaD{GIN4!*c`Cm;^onkb>ElA)L-Tz_lT^HLra&*z(@l$ZRPqyu}EjyRV zMU#nJmgPh}wxto}q<ca)H$^T<j43WQ7in8*_XC~RI8Syy0EN1(S{G81nVy;6dt$K` z3WY+UP$(1%1;%;KJEJzr<khk5PY9G(_oS_Py=-&mYII@Zx*M@k0QyHs6szMGKCb#y zF%Pr}Say6#38DUUJjv1Kh`lL0G3rAbKCb)RL;^ch4H=~_&v^ZY?KhHWaiMpNus?Dq zrI&H-lO((rS2dlXQh*Q?OHznz9r87Dd<cA2(*oBWE*hJW7EDG#3HPWlkH<ks%E$gs zo>X;g#0;$a+{ER8NH+f(7(vUxz6qFN7kiZ@>qoSF?0yhIl{4J3JJ~}02nEE{gVMUm z;C5|}4c7+wf?Ar(MOV5~@yBV5&u9d>1r`T?RfURu+zwDozjgs-C6vj)GsYMPKm-vI zAJ=?M)>dD=37;s{556-7+6?;l89(+;G{SETUK2F-apgCzS$AEcWIR+}tzcBOaaWy> z>ppXRNEyH2Lk3aVto6SNIPTV#uPMYdQ~I|UimPYl79XF0l$#4aH>nNvM0pd)+KqNU zZfA20-E!a6RNrVSb|X++lsoaXHD&$cFdV$6U_))552grA(pO$ftBZ!FV%@{Z04De; z4)^3o7h$S^m#9EmqD<7z+##nDW;hz5o4$IR=HuXZ8Nx&><B32FP5|q^aIN}%J}TD( zFb>)d@&zh@+rI@n@)j5m1ND#4g(VCX-N^2I92PK)vJtybEC43j*M13tefhgrB9zcU zraeJNJQK(BmP4L^-eZ5u*r+B6_oT&_oZSgjVZspN2&X!Es9%weaI%-pc}=322j~N1 zDkQ6kJoA6cvMWJ%5Lzb5#NeeDb@zfIJ#NAqLEtM-<OEzag<In{^{U`6E(X()TA#QB zjU@q&LwaE^<-6L=19)VWrF_@*uumyO+Q%F({lUzGXa&DTF4Kt(Xr`pUaIM)qPe*14 zktq_j?Lt+g!K-@yps*0?2sI4lLPAP2GAxjG!ii2D3QHI&oaq1x3mC=*`QWqto4;6P zgD>{)ipgl_{-qa4gNZ2zs!5UXs=&{O>|IDu4C{<9QYWTugPpfZ6Km0>2L%lc?N3ST zVIGjrOrDVUC#rgCT<2W{L_J3DtCv(pZVsI-ZYYmBlrQM&aF73MtE4AgilAie>McQQ z6s=kK1fD<SGp7U$%1qTtu`Z~X&onV=W;(^E=~_mKP|R-@|KJ*iKO6l_I9e_>8m)-> z<(`PG)gR?noV|g{f&Oz}>LxSP4PSW1vCCs5J|#D^F(p#Pj44tyM07&+(1U1nWTXiy z4AxXJV~syhoC&2kIIXA{d~Z}rZjw2QdK_Bqep^qIF0h_Y%`UWclg*)G4{U4nt)~MS z8$EOT&LtSQGTn@Jwddd4>kvkMsELDct)B`k$*Z#1lG==MHLlW06P!!X+th?E5SGq$ zMZ(g%D*n}|*KDBFTz7^|<>@7+-}O<yD*n}|Hxg~b{Vd&UOGh)t)hM*mW+GyU&sV3i z9o8hJq!c-6eubM7&l0xJ@s+aIZ3BokrA#oD8*p69%qQ@@7`S3b)<CQZ@Cs2)n?{S( zyeZUkaQ~+&@r0A0M9tCQZIvOAO7svrUdk}k_$iobx-r*ozycf6Ls`yYQKH2+@2oLa zf->Z4jDx{XVA>?b$b0TqljI>Ji+mb%)N&&<5%RVKiHoHLmjsY{76eb6dL1`j8|8yR ziYjqd41~{eH4WmYL961J^8wZIYjx^~Nmn2(5!OL0=ehhm$F1bVx#>Wr6u}9-ft$-? zmwIjzP)fGJb?uHWZF(&SQc}f1JK}r@yGh9UJi{$zPI08Wu;dx)jH{$$uhSNbX=MN6 z0$X3$z!Mypyg|U!$SC^jZ;mg?_ek~AZFw_z<<q*V(?ICes!yz6;kpPe+kXt6a7$a^ z7X}_>Lu|O`kNFzC+}L;Ua=BiWa-?vS{vKUm8R5XK+yk2gz@aon+;;Wte+OR$BM9pA z19({K09l13PW&MaIO)U7VtQk!R(||55?m(2E)qU&qg&F#EyL8?oh^59N0y@*tUD~R z0D4;sZOau^t%MkQ%pfR>6;56qRy_8D8Hd|KI7}w%)whdF>KyJNTGFvgr`rLGMAiZF zAk~6YNSa5`&J=m$*vE*cWZmC#{3T)a4!U9B9H5WN{~N}q$w#ouFJ;=DY<tX)IdPlU zRM)=(hnGw^%cJU;q@Z|}8?e#xK>oAhIvr^3n}>sUhWRq5AP(f1;cFuFmJ$69y8V2B zc+~W4YTp|21L6Yrui3~tZ-O?eW(1iJRg2>l+226X5fboW1w$09>3aPnZy0Oa*kR$t zn3}7V+Ii{F^|aGvZw`rAlF!%0yNYH?%!^hdPi{;+rk$huG&>iJimU312K3jUGmtZE zJjK%j_-_-ju}z)K-}7;zv{}`9RJ7>R4HAMtGK%P|RKao64Qn3u6s<E*!O&`zt4g_9 zKhsP{WK5mF>SSH9A59aETI=Qm`OofT40EJOn%bbGpt+s!5%-#rNtjh9d>dg47ODRb zd?k)HG$EZEMdBwi>NqZ2bpXSqnkrbx%`1Mik7Z57hjjHJB#k{Wx6tKTYmahpTwJ}? ze&5<ojU-Ws${jrk6?m_(9HqKMH$<Gz!_gBv%~AWK3r@f$HE`)a?n2{QuRis-B1zkC zs_!(b=ng6pJSji*cq73F*|}ojWbtm~g5xnXE=PD{?Nanwr2nG1Q@uH%>~qkGihLsB zAQX@O+en?whlhKaxGYOYa^;PP#TJXy+>5|FiHu@HR8?4~qq!H*;QzpGv@(>ms=iVm z;Ble#p|=Wg_efz1C#cDF#3_Gcr(yz#cb8Q$(rZ!Hq(}Vj(8Bq(U*L~VMc{T7QI)7x zA}B?Su7FoY<j)D~hpp;Q4JGQLt-50*IT*|vvh<@a{>K2@Cx1EQ36zHNHCp#2*n~UL zv`DGB3ZyHrnI$EgBoar{mnY*3-X^BWktk(;?1ub#{!ezjta70O>x0zSJcAxdsbrU? zwN}tfOeJ=8MsSBUmu5Bk1h`suyvTd2At&Krtxk)c@GvdD4w9Y~_1=6<Gk!>6bQ)02 z4Mf%Gu)PVUnQA2OIT??TnzTLn$U0(QnKc*K(p@;?XC%nPFkm2g;ePRuaTm%tY^7^) zxvNpfkkmJ>Sx&hf>+Kk#nSWr0tpCS@vosgDhbfwL08`&wPh%cvt+>1$skE28ZZc!0 zfx;-YNeppAy~CPDM*HP&dnn)>lZQa$CM8^?P&bkt%3DF=WuY=Up5|0lB3R~g^!y05 zu~+pnc?4T8Q?4WX<nN>O#V+rB#bI>a&ImoJ`^=rG>}n$$+CA?POKzK5wOqnUrg{De z$5;GBhApZ0qF2B3<lnI<Klg<26y&=pm|NwqtZR6WnpwiOD#6@5^%7i}2EcF+1uMBS zP!d6sh8TeXBHnt(y7=MUEEMy`@{=-z)o{3GRrXLAwaPlu>rX1HSH(t&*ZDRW&AP!a zW>HtJijRY4<mH)?RcVLH7djjVCCgh9QkURsH548vn7;PRFf`bBAz9mMhFZ66bj1mK zMc8cE%T+LqWpc;FDiC300dt{Z2|hYu*W%QB27;g(!eN1@D#-dTHN#Q|9oqv+YFzGW z)IBW~>p|{yb%k0LsLaCb#PKV|L(3?|OB}b6GKRD(sc)`3?tuqkl>TOj*a88{MjNGt z6uHPt=~7J<D{S$jIE^)VYcw7fz1=xhSqA5Q0lYq$KG9jzu&r+X*g?j&0;f-PLT^Bs z;rml;(@cT?vWRfG8It*5^)_E=7%Bj7Vh|1KMX%Jk_CsQA|6@dtBPC8oYNCDha;<Bc z6m8@|-@6iWlMS=b2Jdgh(+0LIUxrj<GTQ7Tqv(h6P(PGsoH)q@%J9)+qSmWbE&K*j z4gJwuNk;ej4=6Fc>syu5hvv5cW45)cSKD`CnQlL6J*#1a>R{gG!~LKtH7;j%sFTNk zq``WATwyEf{Neqr(kPs?Za}uh;_09~NjxH7es;#=qVyl^76d*!Y=dH~V~N6gAH881 z%S{5P)i6jG-5O-~ZWa5qvkX`A#zX9=7x@Az?KuMCard@7i7No>iIOC@q$=sjq8hO^ z#*03=f{Y+b*03tRRo{64+P&%-bGS_{Mn5Fyn^`)pZ=qzYrdu>$qKCCagH?TJx++%C z^3YWP)(+hZJg!v?PMeoFb)mvnh}093z~CirFN+PQv0?Tw)*eUHEL^JaLWEMf5+WR6 zP--OWb{R~Z9Y>SD*@<s3xXjTN)5sr96?eOdFr#S8om8a^T^0G%H?DcjCa&qCZ}StS zt$Cv}!^rSTe8t)iA09R5Rf{z;^Oj(C&hX|@;k|?eR*AN)c%VzB3EL?8D%UPeW?Qe~ z$*$U&;j-A{jwPZHJj!ci+PExnOWvHy4o38JROZT8lWZHdfc%l-4Au92D-TuKU*X!b z72R=JUGyq-v*;b-xu~An68JG*Trx-N+yGS5dknVZvf%M0ePbT;6V+!6+-%W}p3V^c z?H~{rBA2=B+;b%k3X!dx%LD;W^g6Dz7Zf^Jcs$FnK_SCV6K~$e3r-ovHIsgaP$)}% ztCi4~Q@XirM=5fC)Cj3MS<HG}^h|*@C(Kp8njxoo$`>2x4;-1pPhT4FndVJhElinF zvmTg?2YB7sChjgpMKB~5q0{9g1wROGr8FL1B^j0`2D7U&PaoHyC9On~tySI9<MHAx zvc^1}49@BlGq(YS-rG4Tbo{RtL!?;T!fEwXdd@o%443JOu@%M?n!4~T6UlTHDsb|> zdp?++W&e>O$uM|m;yE@$3OjTPWD5W_o26v;d^vr+VG{Dm^1?o&v6%ru4EqUPfZwQ8 z>`J<V%}rH$(``JNY?cc|0j7o3T$>RHP~k;=IU3sOU49*}0)x|>H?Q)ZPR6rMkLGm4 zYM;#6jjLG@u+eFa_V?(WVLPj6fllNLfR&brl3rNgF&?-%HA=DyMYa9HHVMrQ8jtb3 zSZtan^d7*bX|O}GQ9@v(Z&pz}&*o=#{oN=lUS#h!D-?(MhR5Ov`Q0`v4M(_IJhbBA zmfsJ#cphaq;@dnCbj4-Eoamm9PZygNh%Wpuo8|)ffHqA75?c<>btpEfCc6PCRmQ-F zu_ySX=(n+uc9$0$A0B?;(gsO2=**E^6H}rS)#?qp#{)chFrph<ly^?fXRaog{;6q7 z^*7N|WM6)PD_FP@Z|KmzrH~~B)Ld4KSd*&WK+EtsawBwc_Aos=n3FR*h2us^@LqD; z<fwRL9OqXfL_{pb$oj!BBye^_b4+zLLarvKlr{n9|2Ha|(Pbk(W8up^FOf4F;d$AJ z<8BbiZI4PSK35zyklLrqW;VF}M!S=^^Hd_Bm4k+}u56IhC33_x?4pxOVR4Ncad;ai zNMntw?zz%(wdtT(R-c(q5J^|A-D)JcD!)ixM$oYEU6+z~Bvfmr<Y<NjR9CK7YiZ_v zz`pZg#+w0Uu0}}Hk{<j^7!gShjKucv6=|YsbN`ius|m1A#(F}0JjSI!e#!7^l+?*` zGdGBeO}GC%A0ZWKii=4>Xg?LAC2d4OxWsiy)ku?pem0y+D%ggpMDn@ig5n)olDokf zMoblMiJnSK)8xRK8D3eboiulsCzTj(u-X5@9qLW-ynsjcYLj^F1;uOngK~YGlLj`O zu2X@@ArDnZUG;jIqYxl^jKJ7uR~rMxl2U~AWL)V0QY!CHXG>*gihvtsqmY2@#by}@ z0wnE$SQ;Ok4Y05&uGd7uZi*K~1uc*pZ2w7ivg8=gx+!s^5(y^ooiyI`T4&)VBm$9i zNXzAq$R?RWo63#057Qz)9U(PI=!yK`BlE+cu&#AP7M2rc-Kco}Fg`n<;Q#P$EV&Ce zHC3^d8jatqXx^##B&yY~a>z7`Y5Bo<O{qx}v?j-Q6iQ{HT74G}X4$k`O!lV3`Q>a8 z2hld{(@%{RQeCaSanwWdnZ>-iezMP3Zg!rX!Sg*lC->Y&!b}d8f(`WC930cSe}cmi z<98-jtUB7ss`Vqz`5M^d>7EZL_!^^7m35a$qDSSjck<uw=lOERB2$s3H?Bb0q2=wA zR?a$i$3U*NY{p^as8F@Fp*@}>M7CKQCqplhY={u(DYQ&4r(ylunC9qmHrGEtf3`Q_ zWbQ1g${9Cg4O7|dMrZbh4x>p`ub<8(YBn=xyp8z{EY_Un1@}P;WRTwq_wnmGF{GZv zJZ?;sRBAR%#&aYs9lTRzcLU>BFTyXD7bi%d8647V%DSa@2!0DEUSytBd3f4smdGqk zjcWa{5D8s`G;Pd7<dh-n#{B|b-XVD@4o<HyV=p)*aTS7kmP8SM8*`Vi`F5C(r`{EW zjS=$<+ff_RloGS#4kFazb-Jg1NS>c)-4DMbe|`dU1mTwp?A>sjH9b>OHoyhUjbbrg zEEl+okE@)Nl6X@(^!W)4wMn+Q8(YuELnNwz*Jxwo@xy$h&C|_e?}*}qiz6~b?On_k zm*T0?QTXr^v@5T$D*;tXKdGP=)-!SSJ1w+v@$QsvfDxOWkm&zD+*`a|Lg1zRp`-G_ zr4!T~4mNjx0nNjX$ObmTYZDBZXKyyge_E<GwmPwYmSQT_Wc#`sPIjBUoZHK@n_8WZ z@lO01-ff%D^UaNcXEAPy4?p7C4CS8W)K}J0*c3H~`P+@n$D@3?!RuU5hsY_mNn?#} zv*i~!*V^0&P~wS=wJvF^wE2x0NxaGbja)(&hXbr=Hd!_o3n1|b>~2S5_>B#X35(b` z9V(;05h*b*rYKb#8=n1w9YP<3jwrk~i;`qTS(Jm%KaK~6(x%HI`-SE@{2+a*yEd|4 zXtv4U04dG^x_M&YU>Z;)e;&x*nntyDCsn=P{|AZE%A1^jX&PD`dhagaX?QX|8(aHh zV;!+!F9*}j?hmZ*<<j%2)_b_abZzUWaISlE1X%#<K1+^2T;ilt>g?SDM_NDT<B<rp z-x1)66y>x<Ez+8)>?_yhN{^3{cM2SGS8sP)&{AEwep1Jj{CS3BxoTuLNy%c)XJ9(N zQwpj@^L5o5Sh0YL-CP2;?hLVpi&Le4Q`_TiF&s=cPsL)6Yiv&k7vst1vhrcS{8K(3 z1vgYTH7w8%N7-PM%_)X)&8bm0t?{@|I_l$UH}TxTGGa@2>;sH-l!U7bpF+#4whkBX z8C$97>W1odfotp9>DH~?KOz09n~=<u6XyRDcEQG={xi~U5=-AG>2x3S5HAqq(0le0 z@tO)}ecj<j+v?M_aTf9!zc-AG#Y4%}iPQ(i(Tu+uBWHCM_6{hi)A-kH#G5O6SQ<(e z98T<1CF8bE0_5K21>5dCk}rB~!;oYh7QbA&XJ3Kq**|GFl1iiO9@6EU-xj{{-8I_p zNX$1*RuiP`Ob3%oyxQDz`yc><WShbHj{yoZ7Wz0Z*p&QS?sK{!9ok!Xofc2{;5lmw z3KNDVs6~_(#Yo4HKDqh~H-kQ1{`xEKJtyF!HAVyoYyE3%9iEKm$OfFxFDVgu`U~$q z2Ew}$kxVH&g5L~rYNF1|BtU8*zPNZ~8!N+rxdq3+mOotsZ^Z5|qXsjt%pAgDU$*Xm z3kBV(ZtQSXuP~PzI2F?zHB~o|X<B8UmmuizJb#VpBLDb;_eZG`PY|CI0Qa6y3^CpM zD69|INNWV}ZsH6FxKq%DxY8Rj<yyP+nbW`XUj`6x;UJGZnO|JYAeA3KV9XE9gu?ix z#<Zk*kH*7uj2Bc&f*ASGb1)@3FmP10R;PoD6TGvTgnC9Ffc2w{-&x&1o96S3{VT;! zV+uFL(trm@Xu3vTfrbj~5J(7hi2*XNnpm(q$p#czFK{I`yq!~?erT2|Zb&PlJPeMO z15~bAJy3pMN;J+YiSw7=l+YmE(O@}Q$dWL|OO5s7!h&mfQKBNp5&Ia5*s_Y;7dT}_ zE*;0*k64sPFA%3yJT{S1ys1MdHt7bMBU{td*Q#Nksf9tg&Dc3x%|*)&3tQ?%Jl;tT zwVi@I2Yhmr)}GFeQ^YLt`eyA4VV?j*D(uePmXc-rnQYs%0HCi*-EWxA>GlyajU>ug zrSUmZm13vS%MQ3u#XtcH{P6U!09!yTx{Kur$b_1}odJG4BGH5Z^tvTjYAJZlVy5$? zYEb9d=>!G`0wlCO9f3s8EG+DxxLTq}*NK=Y-0r{wfn^lXyeHWL=MCjg5Wg~|#F?@* zxylKW5=GkIZG@{~_dzVQ<^z8CgJnCNKm!V6;=B2BKFprwLpnc64CCXdv%R1KTg72f zQ-4bc<AR`px{h1BNmX2o$#A({zbvr6)NBig+kwCq0nf?;5%eIzbBj5_Z}SbZ-iy1V z1Del!&$Eks{3|rLMO7klE`os0cmCMOpbE`-5)D3km28s<>T5_2>z2q}m8aeWuyPQS ztNYM3DK1t2AVll7drhKC)o+AoG6lLrJmRH$@qk*V@8S`$U__PGV3h-?>OLW922*mL z#8RkeO01ZBbEJ;ckLnKEU?0_et}>8P-V>+0<1UnxL7-!dmMrzpuB<b)aC{5vBb0tE zRtN32>4$;=(?@j5K~4hN3fRAS*G|85TaMS^%y+M(<?eroaK{|GnH@;NBq!HBM(P)= z^y)CE2Pn6~*;4cA>G%vZ1>Oetg=-;K`sEq!k55NP6GktG2I|K>mq%Zv%h0tHrK=VN zF@~xoifO=UaM?3)fql8>*Ru6X<5?<Dp{*L*I++7yb)S{O*eI-_PQ;CjIoyt<9ICWW zzM$Vl@TrPgNLPiV3A3EaQ2&(Ub%`~`;Al;aI^!ZkorL^;N82mSxL}60Zqf|?Rr=$4 zo?`9wcc!8})04G@qynu<2;5!JI1O8|-rmJhoRb)=GEYUMlAAJHF&cEc)==w^V<VM7 zuN~F0p1}^F>J6FgLxly!tu$=k+c^;!lhRhzTD-MSES%b_7!(``t=y91#(AYu?kD$^ z=2fY(-^o;U|2rY@7-!Zd<|2JcDcu@foH8_kov!ac84uw9DqN<M1iuufXB370_Afq1 zjJu9yjpKH(km(8xM>$M8Em*;*z@35%#FY2g$0zsNv3u?9j-O-;EVW36PnR$32NDBo zm=U*~hFlfXt&g$*_11jwHo@Quv`2%t5oINOoQ<?S#$&o@6XA@7zNk7+==`zj6N}_| z{`Po0qs!pu*^>bsj4ZsLY(iwCG1g36y1_^LclhOaykN7!e&zxi?1+<a#|>W>i%USG zdDUD$9O5`}itOg;5w~?3crY)W2Vufi_P#{hFGyF_o+^s+YoG^Ndln0@RF6p_Ui<=6 zXR$(q1m4i%6*(XTQ_of)t34l(wmK_|1VT3P8gcsuzi0THWdvwCU#><I;BS_uMK-t? z;tlBboH{l&u9vQved8FEghwqz8dMdu!1Qcygj1^y4>?x8*W=kPO=Eq)oDxuE#lLKK zetv~IL4f=I^yT#RG=DoaurIQ=7Eb^O)&Kn@KN(EC*A+~A0i27Nw|EBb>Bz9`<rJ?) z&{1(%EHB^KGV&r|QJa!)cY5~YxF7`y?S&JH@yQs;KJ29b=%XYod8RG4(YPQ5&-^jZ z*K4#qw@U~378ri<@o@2y+D1yS!Tge*J1GXI`ndV!(+sJ|EchgcmB5tE$26^VK!yka zf%}~DW4cff_mzgqf21C^*Wd!n?wn}BzS*!DKHbs5baMIl@{qmi_5;ima<a4KbCmsU zi8IKb&hY|!0q$mxvr`=1=@aU3ge0rss`F$y%AVo*4A)@8QJzIK$I}nE4CgF)J_@j( zr@1+z%0|cY0hF+I2-e>O*WC|hd`rl+I{~kPVHlV&DXuP&Xco!ExFAdK`QU6k>>}J| zFd6>}!N{k<sJDq#wkVfi!Vr1p5Vi=+j;_Jv?clOt$uZA|yKo-7$T^q@X|BR(NzZG+ z6VE$fi+_@X*1_b@<a9M-D{iG1c|Nm6<LR3Lx-%WJMCFirfAEBsW9axDrV7`y^Eu2k zTiwVx$rX;}NaP>Sf$Tgh!qGt^#{<qxW~&Y-d9fs!;p4?X8bhWgo`yI586)C}NY6R# zjm6B`3{S1I4#8*p0e0&?`a2nqM7A9dWeUP#!8wcY_c+5PH_C~R*-=6?Gof9j4`<mF z(m_X2xVnj&&uK#YN|UELaypsplt@)>siUE=q=8#BP3*@J8^}*EIf<bC>2n;(j&~_V zp#}Lho9D(tH~aya<iUc#zQOxz#fyA_i&<eDjDdupOz_}4(`6CjnVZ3+qz5i&4zPy7 z#XE5M;1oY7sNdF8{s*&bhOxE~5Rl<(JLJd!!PfIJvY69cQ0BPdSr!?5e<nKwD^QC{ z!mv3S%p!CZVf_s8?z>UJGLdXmW;eyp;c)Ulm-)icH_a(g$QVoWPY5s@4(3kc7kU2E zcw|*`&_`XO_$Iw=26_cLnE-iGJL2Y|MQP0B-kzx<hng~!SV`}9wzeJ=<lTDUFT@XM zmTXb^ty^PJtOXY9`yH$U*qUukvNze}v#n{CPjB5q87zKG?ZE_+MR4kB;(6L*{uT0% zT`zeWf&jBY-I`N48~+!(hR{mb;?>vIq+LST0A|Dt`GDY|#mP~)!kAB&xNSQ=L$LJe zD(%M0)m2)i1-xZ<o110Tfbl}yp)RzTEYe3TQILjJy6I1;au?HW?Y+x}h^)YtW_s23 zc;s2Q!cq0b28%zG$q>1pF@>pbB#TLKwS@MkF!yNPsD(Z_JuMK7J|x>n*hhZs6{{S~ zT32B8(y}2Dc-J51N4h013Y68u9umN+6qGq-RUl2tR0f1}Bd(f>$aSVeQ-vl-w%qAl zzUcjBoK37mm1#Hj3Ff)x0Z+H>sRUyLFzbmaW}q=oatGCjMHNe=P?DnP&{};IRTDi_ z?w(h3MN-`~wW+YveR6>M7lxAp&=~v{D+99JNsr4?%C@;Mz6&Kf0OzfVeGBV4um3cG zq2D484dFDJzvvnB2(OHrE8I_z!H#wxLTKcbowGT}@7`fm``G_UN-A|FZ%(c88Ulco zsliOU*a#)a+m+EP@X$P>k2cDlSeF!ZnNsIIMNUGwu=T=n#_14~T+1}5ofT15<P${K z!@rg+$9R5Zwn1#iz*(!+_a!Af$$+g|Y_Vi+HB`BpoLCBq9(R=)A=BW05*uROOb5(v zZTV1>Hl|`<ygjsLB&E++7dN3jcrmsnDU(p6ay+%J>xgcB(hI}2;G(su29c`&dLwdm z3@Ov_mbb2SF?TNpST9cUd;zm=Ff$uVa+(~R-l6UC^z6=E1e;>QlTWAUn-GWXP9=<q zq$n8qox$`{FtN>;-T8YZf`8n-*HPQj!R<^(UBrHr+e?F&;qG-zi#3?gGC6g~vBACN zP1SZM=mM?*-w_IhCs7p&afW70awVIQeU7hQ_vp}vcAlcpwmTSt3E`LN@{*h@{A{!; zU-AhUM}UIDxex&%U>33V2{P_=%D}tg$t}}-ud@Q)7_<p%z=VcX!*RuI$E`u7U;c6T z9}v!PlNz+(Z>6=;y^ir`9mT#zr~rvAw!=~3{!TGX-2%_Y@3K+S6|MspK&E`*NkHEj zt^fny8y*x|jp%yKz-)X&LKHaZ<c=KTwXmdd9l9}|@;VEiI+b;r^4U13c7Ahhmef!i z$GO6nJm>lW?va%1+<tEIohxAM7H}O~)qAcO{d%GMTp=3$=L%TmK-ceO54wISxzP24 z^Py`=(uuAg&8)8SqAOTCH@ZTX{OJ0jy(3*~#GZ65_g(2)=KIpMtiqYDpR2v;3eo6J zSHL%(KV8cj9qI}=O?cGxTkKNTa&<tlMZ!LH{gQC1>nE9?&0ckdpOxI|`lZsZt^m?h z<XG2_Y0tWTt#hp_jOSa|A`si;TvyQ0yRM~?dtHlb{Oby$gF!aFr()Q{t}wj(9;)lH z#>K7`Qa*P5R^eoKpHp6T{hDyI>!*~T-G0NWl)ok4yu8HZElo)uyw=k-luZK1ow65R zD<s_T@`)`7cFtqpPbpCo_LFhI?2O*fLDXm;N8mUJk^1_LkIs&9h_*}X2o0L<)&0e< z1if!hw<-~Kc>(m#f-72n7M~d_oLH4|x<@4LPoLp51}8dlToAR)HXJ4F?h-?A1Dub= z6&H(~x*piriK^?NO6r@kWXIfYAvW0|H@s08N-#oHMCf?~inA#)U-zeQ*_eWZ6Pl?0 zWHI=V*)*HuNTfx#p34ESx_YgrG9tl%(YVr{!TRFTU{I#!R1|kzOJbwfd=Al_Z1fnn z<4!YNt)}zLfaC0cdpX60H5?d@?3OWtqL>0ADdy?%`M99-{s{c#6!M-LgU2}Ge3Ro5 z0|YEofCM67IHE^y0p)TE+X8}LCb7(nyMXA&`9S3+{%EjMSBS~+=h6{7BnQU6L?dEj zc(^>lZp^r}%REB(7RLhM_OCtQil9siqSW_MM(2|@jsQ*LAe5fGbtv%U4&6i;zu|LA zK0~{tzL+}%SoW}erXzl3EQR_78=abjZ&HWUoF5?QaD^TkZNV?aL3HKVgm9++CaNTo zECKZmh16gR)KBvqmxbBkO<4A)GK*rWcc#oII;$nmc@@}Uj#I~z$))Gu6+hO5-ACf= zjd3R`L1SX<ri)}PR*XgvDS^oxL<!$)jwROwE$)y3Y>H%Xv8vzs`!D%P7g<lXJI2{C zo9A>Mc8q`++@3}_BCf2k7vf^@ZhW!4ke8zlPQi78qgiiiUf_*558zMvNrC(^2F^mA zEKebK<|hdV_8~t?UU1Nb{#*>yfg?X0_B&ra{Pf{NI4nTQov$B$@y$1P@5XMFSw5NI zK^DHXMUGl5PcuAdN^{Abym?bKhL`n9m9aTR^jK)@NCEq4KE@r{DW7{M+%RAzolIW} zF!}zfAO|BoL+8<!nFlJ%uARm?ck3gVTjUQ@xxtB-{z;2E1*^IFc9GFLU@CQ3MIjTq z7KYn)y7fyTI=sayX)W&?2Hc#-yM}OZWb-fBURgICJGTNy+@lMK7NT1cEV$QsL=$f@ zKBY`HB*~`wBXWlY1wz!z=>@;HX;ok3#nZNesyE-n5ZAIWy>!;av{w+YewQkoh1Kj_ zt*PWlU0<8z4+g8)rs4oq$Tax(Y<xlSc+5mtUX;Iqhfy8B<Y_{t2XZmHJP(HD=9|ok z=qu@^sQ;2eM6MBd`lF!hp={+j`H^HuJCiXCNr18sEOc!nI2+2k7)-=~+(qVytY9oD zk@ur^5-K4Z%qN$}*&O;83qC>#dEF#K(Q7=`B<NsVPv^a<8P~Y=5tIe8MKI5aqd|ue z(}qj32p!`r9i)H!&p0w}@oASfF$MGo8P)dU37-!<!RsxsL#IQ&h^hJu>tc|-fH_De zJlZE&NeJbwk4Ex#wCY3xPr?nC#Ukf3VQjn*!3O<dmM3XGa>mbbo`Jieey=5gj$dN# z3zZX0sTzY2PsY~Zv=+ByrGSlYl^8~2{BAtOF(sXm)QOI}-&!8g(iPV-$SGXQ^J7j0 z<oCqh-LPEIE<}8>facbR;b9fDyGql97^^E2q;q{VEhrq3Vi$Cv;@-e=7*FqfN=8FG zHZ<e2>6`LwrL!D5PBL0U=_Z9#Toy<QN#UH)z!!ezgz%cJTN6jw$?{C@<*GcROCxj# zo1d^8u?cY#{k}Rs9LB(k&^uJ+9)WUpdO_zrhK8D8Z)c{n7+l)LXdumzmZmw2d3)<4 zC>%^G*KQeN*l=a6Tq9`I-EOuvgwl#W!R#45qsT;-3N{L4HkoVJZTgtLb5}32aUI%f zQ5@oFiw3L1E59`1mF$oUB69rAG4^N(hLe>_gJrm^8u3?^h`oJ$1CEE4I4V5`LMa4n z_&VNHhn+wOu(d8rUwqqAXq;2jPa=NMXvE&jDai#Zd$Fpm<C5dZaY7zN66(58;DVWK zyd=aRhSSxu&?Y4491BGSVynz?+ZXTjrLj67_V+ab(U9%t1F&GoL7%s($Nh6NW>pO1 z?Iq=r#4~Mmv6Fl#46_Q|#+j5v=F|3?Uu{X#>s6t_Fg}NR_NMEIWTad1B6ese{8sj6 z2!CF1m=almaL7$681IIY%%9_2f7`CnW)d6XE)4TM>|lqBieWaw+Y>bM>xxLIy3UHV zQIV+7%^#tNs7tfaxUH;Lt7i%zAE{_j@_em^s1!fCItm>e7YAx_G{&Plm$seYkqeu; z1C7!uI6XS|EeBBZl^?{A(ZwNTC7HklL+kr4+!T-@$=L)CNC6Me*3cG~g5cv5)cS^? zgl?<>T=m$&JVLTqxec`nx0-w5jm|TB%Sbf^{uMXLDs8$G)-unml98+!bbV<R)b60R zjJj$Xsp#5e2%-Bl*H&qlZ30uTeakZOZ?0X-OwoKiXtLzSI!oM4td&`bww-L`oGSO% zwyR#OLxABL=&CcI0lU{9vlRH<xbDVk*C4;)mE@*9|42+}9Iv@wD*YddgX!h>1MttS zve(Q(LHwckS7&*A04_@N*C&TnO4)2H_*iF^3AHHS*n@sz^&D*3qBDHixwN@Ep}QFH zT27O2C`G2iFgxJ8Y_L+Iq%5?-^3U7_IzL4iG;h9A-#9x*&B4OQmEX9gY(IU((Lukt zzEKHL-#!wKfOtAa+^V4ioLI>9L%P<e7S)_~hmChaJfq_=LSm7T8OO6pqoc&{N{WbN z?2i`iIFZg_a2hliPr1KglxTeE(f|72mB|N4f*?C={Ob(6|K;&D3Nozqn`ZJq{q(m6 zq}u-_2^2#gQ#y?L-U>GW>nk8j!OEs{-31MYm8O}P;&p~YD_m7ZcB{(LJv9Ppb!V?p zf+$*rTcK2B2^`k)YK6$}SjqZrg+Y4P&g5)`u-VpYg~sn$!Y*xvL;5E6*fsXhCryx3 zL#qv(czB~gCYGPrI2v%cWDvCRF^*ik7!B_muewshMQ%jk`hj8Dyn=H+9k?adSH)-A z)UK~RJoDvAj>I_=<T=l0H?8(7t(y;OukGPUnSDwVLUyhTE=>-9CB==l+CTjg=ZVP8 zbE}fiA5=2jmT5N?8=aJpXor-n2w`ah#wwwb6aTX$&Td{UL)|j;zvJ-1_O^)`;V<a4 z^8W8=e6Z1IINm7jLH_A=No7h7yH9z{?{L^%Sk3KqZ$0BHJh&Ht5Hq?+(?){3rMoS$ zN{=B}o0qT9m3M??m>_E%<GEpLqJC|;CPP!Az}+w$z=-A)J~wTORZfEsYFxzfad7%% zOkwSaOXm9rHz<Xb45%M>q*%FOx%;34pkkIdx-V(Y$Xtu6fNk{v|2-_ZO6}|Ba1SxW zQ{;%%xvV_Kzc=EYt(4>sDoI`#)BdTitV?oKNpIuKGphpNA_rod<)X6LO|i*{32nWF zUrB9ON%sE)ZdoskoOwN^mv8@jPot>E$8;z8zn|WaeJeskIX;6GWIDv96ebv*)5==> zBKJ^~wSz{atnV7EI`Ec$B*N!nmnkoeI3BOMwJK|;X~yBJyXwm8sW?{IAHZRm<<5H$ zCG=dyjK$S_r!JtlrvZ{04B#gxT>C_>Dg3X_`R>>CBl=p@Nd@WERr6wJIpGtXro5ak z&JprSS4<?CR8q}n`jvy&S|s`t$*)Z|<)`{<1i#w&S4|K-R!W7-)iJUPp9t%9VN(&+ zz`<0^iMxF-4~j@SPYx(4rCH#B6ai?H>A(XwSC93+te3o?3`EpYoG$L?ls}S2jq(~8 zy8W9j=53Vv&>0E2;3s*5$IbLfu2{z*SfuKGz+3zv179Y_?KVzg$s9CK1xWa=d$5aA zX4_8?6Z$Pq4O0pS1;(!GEnx>#ehaP&P031~%ky@0asQ7YJ=g-)-#cu4P0xEX$v#sP zv_X-ah;c43#G0QuCfs}8)#T=N9E(RLxJPCB6AUSMTt!m=*M_d3LfaRA8)U8G6+6p3 zGgy&WgaQ>aPz5OHI)3;!S=<wcPNr<V>N_G|SKjLh5^rcS`O4hzpH|{&)IVvpC2Wq; zd9V_>HLtn=gk&?lz2SK-%T|1Shtd{lPGb7I84Ai92`cxdcv%Cn@8kihN=DAOaUflF zGlH2wnUOj3cyt|xk_#=*&c!odK^46n!!NY-UeYc3gHy`Vn{<Shx@}HMiyo_LNr^zo zuw`J(*L1VGCQ>fvp?SV$Qu)e8`DT?_T3|hshS)(6BQDs^E3VOmz;wq_pUg-TXW{pz z%Zs+S33dh4%78Vh*rX$T!3$k)=*2$Wb%!3v+IGcOSb;b(N>;Cc=T_Q}hcvQk|Jn9k zp%vK2avh~YoXlo{H*RLancg=~H?6y#)T=kmW<YliH~C}_E#kRq))tjIyPY0P+(s)c zMy93^zIr`v5!wL(t1X&n0q8TYn@vu=YcFL@Vd(ek1o}z7TkF?f`DituhkNm$RG_BT zsbWHdT36*8*_<4%kUFemYx(DQk#`6C7Z<oOkHEMI^5nnCU*qnov5YJ5*la7|a$>g# z&GN0wk$HLx$HWs3%d4155jf{*7*)WUfhb{y<;QVSxClpUK}FYO6isE*&UMse<-%<? z-xehDAW=qH4EUXdw)d6d#DKI_RkN6yH!Go!-ja6HZ9riX2{+ITrKPyZZdm*`)&)Cv zZfdx_25yj3aVyu(FI^`>gD|)#Y_@pT@u51qt=u(ao-NO)G)?Bt@du~ITBTNh_%_WA zjJ>s0YI0()GVkkhYnPc{-MS0zy}8!SVgm~sY1Ven2h%fpNJIleR+YRrjD~8J`)P+& zr<iZmw-xP~F)y@kxf#01+N1xdP_M!}Jv;~(9E(zhY7K<-zBfYXEo-E!sR-_gwO#0H zZy>d+x3JVXVaqj)>T6Yrvu8nqnC`k5q}VjD(|M(4xYi2vsmQHBp;u)k8smB`s0<B0 zW3%xw54o!}?<`G`I)AjBD)BHzzG|8zm7xq_<IawCHlyqQwNbOaVC$@2WBIJ(LK<zu z3fK-IZAElDVvP1^Q02HrQxTbqpYoH2ZhdB1m0Q1(*7c)$b&@aCv!+R3jU!y)>gX_H zY92(BUzp9_W-(%_iBBrMFdIjcfc^k!!AGs>6!mf46x7v5EY(d}n{_F^E|s9l#Q29@ zBXrt?lV#>#^5eDk@P|Xlz!Z)LRn18qvl9<e>gc;Pj#rsFW*~$um3C1JiRJvrY_8yX zGUZLw)W>FtPw00V>YX#(c`g<&koe{eKYCp5@teTdx&|$wOBYjX-L28Q!u{;%LGpN3 z#1Qq%Ps&`YWvf;Yt<t1>N}j~WNNA<ude(~=_0hjbUgo?1^=fmWMBK{{P20HYrQ$Ct zPos3H)P$QPt>Njkekl^E^5y(#s8LQ8?;mR$<{?ZZ1%zjxhPv%Ofz!uIH5#JOo{zBe z8p12{O4y}Z9d=q9VgB(e-m4Hl^y<~&w+;e2JEJ%NeX)C`#^|C~B__+NIy%T`L~^@I zBp;ZZE)s5kU|Qz1gM;+Mrx8!!lcuEbl7IyH)G3V_vEx>&S70sodq;!mD8ImYmF?IE zHYFV?ob%Al$dWy>ehh16&9*_im7AQ1dN<?$$*7MtO5H-~`fTQ>7O?!qW|j%6Mylj^ zIcG!Aie0Q~6e-N+tC(9BjeDLwZb_z1^+wjAXrqtXajsF7+`9GcquKfF)~zXJ#Gc{o zxzjg`P5<Px&%XTEe;s~)`fs;xJ$OLrb%w>ZB=x5(x3?aA^2x2vC!O7VHqJ(!9O*YZ zr+6v0bG}&M&5#EV&Ja(yJVAoPiw83}=Hx#oll<ht*I$46<><?kZ@xaszWL(h^RK@7 z=F88&c{m!N!R+hd7bh7a=0E#pFnCbRhYt>^?lU;{mWX<Iz(?LlMfgD3We=I34`zMP z`1Qm7D4Q$>ThuKf?{YpqJ709}4DWV6d-&<Uc8&(c#j@x;%jTneep&&9Y(VquZRdH8 z=QWCa3aAI#V+vR4zyzSQK1FA7o*@_gX+Fn`1JI70X_k$^k3~)(V9J6aPLW%UKNt2r z?GEY?S36&CJtT1Y^Q)~dI(P|V)S(x)JCxUYa2HJzjoj+_01dv)I|cGcqOoF2zGR)- zc!lk@7CYj!*#{Tw;p*@(%P^%F*tvslcLrpwAgz2>-0O@_JA)a$AWG}=U36uz=#26X zk~((y1#5Jj2q(JHoAbe&43A!#TTvaauL4G0Ws*Cc{Zr!0W#=s}P<4Jm+V#$IHbR>t zr0E7nW5VCUDcw2AI^@~Kg)3^7z-}Y`bv8oBEms{!@=5T)F@-9+3eu+msBnZEYSAl0 ztum`XV*d<1pMn1}$e?MC6!~vx3gF!%BJ5)D3wSZlkW>oCh@JeDI7EnOu>M$NSx3=z zm23#F5m<(y`Evghlk9%6oUt>zL(|}JvOF74`ME1Rss19ze>!()yV5ziWPr}w^K2^b z(Ef@@C3FpvN_a?!9^9H|c*uR)`B{YJ-@n6OV+=Lj;p_9$6t_EE`0)KK=l8g>``Aq1 zzSpr}3?RQC54T@=pZbfu&t|JZB7b`TQC)ml7Fqvwc3J$pe4>o#jIvnF`vrt<VNg+u z@NZFwE`3MT;7_R`Wn4tyeY_)ewm3KFf<C+=QduIXhp%4!+Z7aFf{l2D2RuaDQA06z z1udE<O=4<IaeslmhoSc2`%mA0{{9Q<3!bmQlMbv+%tzPHj2@@zpJU9S8^W*DLyR>B zv_GECmdZRl8GsprZ`7C&vj5`n<#GS}z2o=t*Wp1||J*$|_>cWPQ{LS>`f=~b{MdW( zBVoa=eN4KbPpTyDmo#t4GNO~qqr|3=rQ$t(ipebt&wGyieLqDK<Lje;WTOxqneVNv zLY?#x=CrspAFW72@t*h3Uyn}B08evFP~7mjyzj<lFgeSGBdM<t^q5_NxF#kYRuw~s zYXt9yEW$!!B$GEg0ezo&1aePW6F5WE!`plgrHLs*a}3js_)aaxWui7{1(GkpTtl6P zp3Mhu`^c*eA&vPw#(S075ISuk!u9j*e*eV25%=x)qkRGp$zWaZc05{~3lWg2Z$IUS zqWH^sM$3Nr6Y<MyhIaJBe3FYwxuNzhPGFVLeVRTPoM}@eUGG`B#R9_}z{@B32!qfk z5W^?}lwnQRdmm$x=~GsJ4`9wb==_im@Q?ie&L6SN;~_>^cKi+LbUTl`Pdd+nQkZ+j zp8Eg(Uzk%5zq${b>Z^N%2`lWy1)|Ltms=fpJUeW56<7%A_%Iu78N5e`bt36HS+YSy z)(#c|S~w;28|xPqG<I{5iF5%g<Sk4|vM=ag$PEy6F2I^om?eY*&vjr`#%**w3`EQF zOv3G9gps+z<^-~A=Wl6Aw5}Uj%3&966FU0eC!LTqUb+oU7>TR{t8szukln{v2Patf zfzfb8@pQ;M0@KKn!TL)BMMi+%GI|)21(pma18lYD#HI>z(5%N7B?rC510vbYQDlrQ zrK<x2aJamH6($BRhU)>wCP#<nuzj%p;N7*t4FV4y_0}JDua_?}j4G-U2rVkaEBc!x z3NMJ+avqNHLQHQK9|RJk!AsbMjy8xA8{c?22%murHa2!8xXecX(n~8v2Qv^}>5<sM zJVr%+x_C=M<VhG0LZ^VKM}mghW0F95VL*h9lTWBvAOEo5?Q{>G9{;p+wAaDkheroL z?myXk(s}%s&hZa>o!x`OzZ~s<|HE<Thl6KN_Kv!pofl6~`r`O#|MAP?0~Gvjr;D1u zqu$WBofm)U?EU%hXs_Gt92|A_pC3Nk2R<}#wDaP4f3JJ5v;SiE*~=&UFTTIm0gld# zgX7M#{pb6~06RXoN9_`_a?Q@c)6Vm~qun2XXy@_%v;E`0aFb8>k6%!8Pto2^=Wyrf zcz^fhvz?>P;maeK35<>U_hi4j`)p_b`QDQ)(13P3dq3{IIPP?R*m?G>ZFe6tx@Y@4 zkDu*Hi|Fu^{iD6zW9pgvYZrV3ozL!dx`%ta`}D`&pZCCyouj|p18b;{U}SgiKVJe4 z-#brsp6`6W*X`VCU=Rjr_vO*vbE5s=DdFk9eB3?WKYn?<*ZKb7;0be{459tqz3#tt zo*mFwJng*f?%hKp$2-(K4K)~t&-nZC%kDn0koo@Nc<<=w<>B%E!Hc^X_MgC{qt5OQ zYSZXG=^VV^LB=p09Q}px5;J%-?sb0pVGrdP_7|pm$45KFm@edHmxkFwqE(2`vDewo zi@ook?SH@bVt0>dIv_+p?RWR?5~`h}eUSJ)jT=eWPdjKCvV+zEMm>{1J#hxRF}j`o zr=6WAKLQO1XJEnxsp#$-2|{W2<?auL`#LkepARlB2J=o2Ga5I6&a!tsQ=|}wqOdz> z1`-<Ja2HZ`=P;X3;9<bkhXtP1%%GspmUvE~<3fDy(k`0R#j|I3UUT<m1I+vR7H!>w zojDZ#f}IoaP0V0oY~}Ma`D5{JftLu)mbydV&>ro9JO77zNCm|u)ZII!_m5WRcgX*d zSP-N2kkIJzN_r)+wh{;q>gEINEax381{8xz4Z=6@8q0F0z$2Pu%gbu`yVGI+cf9UV z=L^!C@C_LC1=!)asnEeXi*=ONKh(uW@pp`SyU+jp?$*bQ9&1*11}4ABq`VLGq5wO+ zpL>73^XT7uukM<HPUrr2LLi`QeMaY1v%tNdquR;(THVlPYj--mSKbf#Q`@(VN5s1d zM7;aOf0Zgr(-9Q??EPFSj4N~9Z8Cq~3FB;y-p|{;zdrhTaR1j=f7tH5Qc|Tts>$BZ zAxwmi5vO^9J<VV_S%lT+6bommkw1F(S)K-vC(mJroim&OSh7h{41HD*$>Y>Jfh^7F zAyD`@Ada)nos$7x?PGr-j1oKu6pHQLkQDdb(bMbQ`FW6?PUnl0SMP^E_uf5xc)$1V ztJ7CeUGs8Z-^W39AKw4!)!#q=$NP8q>l-k6=l*}a`uk`2{dce64|w6t$amB)-g+CR z0Nd{9$@vd2j*9M^AK(7;=U4B4o*lmW`_F&<$Ey+s!z|Yk{MGAiz2AD@o3fvD-@I7a zF&kf=!d*Ch)Gzw>?b|IpLr;3_K0Ha#E&Le#7C8|g;Buf?w%Fcpoi8pXG+<;9`?blP zG|d(dE(X&jT%p+%)u2^pKx^Lg1~SrLgUNlR0(F!Xu;=7sUp~6N^zQT?{XD)X-cA4X z^3Q*L^~rtz*B^R!xr4~1^LjuY2&QX-Ung|M7eD#xh`1$HtI%f#R&An<QB(hJDYEl7 zh9|Ipv0$#T2pxfaTY*lflL`#?FWik?J;Q~PRcgun9Q7?1T_aSlcjsFrp8ka<m^$r; zu>YLiATCvwnxp|osy|7G*e2m76tx?-YAgQS`$O+OE8n2va2q_&-uWcS-va-rH~NG9 zhKiAnaDx?7EbST=;bIEzZaW6i4i6=cG1>&x`n~>;e~H@M_H&p+vrFv|tfy>o#R+mz zJz2Z6^~obJ_s*kl|E1Tv+rtZuG+~|(=C84c!he2JSPEc*ps-AO2ef~(?OLb5KmmaV zb+>tQ62f(U{_EXWe+a?)(og_c-$^2QcQAu<mUgITxC;t*aVV3xfGVFI{lxOaM>R4z z9d5IiZq&E6g{bcW+W1F;<*07!F&?e8^#_mT-&qZd&Dzwp<miNc1f|=qLjhQ<iwL$_ z1yx}oAA^xfLeP6}TZ41^Vm$0KQ+=A4sP8P8>#6qA{M);uFs^SANXIC~|6C#+F+WjV zV1c~UDR&PeiZh|hyKYQ>&E`2gLH&H1^<g`}&?{hh0WC;((&R%;2ESg~W&!m`sp@!8 z7J&aqz~Cw0u)*FZiS`)EZxB%B_6RCyu=k0jiTZ`^m7427mAU@;P=0d+<=XS0g605a z+sod;YMxy7ry&IR$=1NDKlJ`#VW)IZaS^gz_+?=4kpV$fyar6AfXa$Wj&i9KlZ4+& zm2Jr*F3C2pN<@}|N0iwX0PYiHz+;*`aMqtY<^&LHxfNPH6+~H79kY!z*fTLBZ3W+A z3u`#rufp_88GV9cCDRW?9r7U@?d~$(Qg;6WKf<5ye2&+EIl6d&?Im1RXL#e9{6mx$ z9<NQ`lkF$_egFY4BSTOx9T1y8#c)2JE%aO!ThZR^@BiR0y~Dr%qs$A>?sOe$V}0WN zpL3v3{Et|2@_6UJe*ON{-S@q}zVH1%Do$|54bLIz(6LzMp&@PUUhh8?C}q$pX=>I| z$0>dRmcXswJDYX;76E#KaR<w<_fx*Z?@0`l1FbuEA9e0@zV(2}N{9e{?|tsv{p1$i z*mNia>m9TltsTXkyPfyWu;E{SGdda7A-G%wWRlttzi=*!|J}j=y9QjH-v@Lu<-d>d z3iaPc#ovLimM+slCXLA3X3N93OSiW>-?|lx?2_*Q6)*OH`aN5;7PCS5zH`SSmj)76 zDAm^D7y(s!j}{YFFICgxay8*MRR;%Py?$pY0y5n`cor$Jd9r{3`@Mw<kqct*z_Mjq z*cepj)*_%=7Gs(3ZZ`r#-2Z-W%RTZFTNtYJdo54Z@%A%*1B_p`EmaMeO$}-V4S1D= zBhB3pXNci}xB+;&6l1y@PICpbM1iw8jfMV_$<?|0=+-SQ%I1RUThBc4)?8Si?>oUa zTEI%BBpx1IWKVoo`X)%C8U~4HN0bQhzd1s@QiH?V8RmD%mQc$YBzPu6snk~2<=Yv7 z49nH^n<0ofF;%mQ6$beT%R;LH=Nx&yl&~MfNEK$G01-X(Kbq6xnu7b!Odu*xfJLoT zHQ_KCbRw4DvUln`UJE?u8IPzCKz}k21kFOf$6*@#sz@9^vE@uXO>1VzHgqZ16xO&J z+uKr156K%Wh+}2(7Er4@u#OQkJh0!}Zvwi#ZMKu>__tO8OBwNk{$d<psM#|Ur1={i zCvxQjftx?MhSSZe_-)%5lhqWz?i!gxGQQz1jT%RZZNUPDV9|0#D{Z<ONDj7lvN4NW z;ZoZaRKLGTBVZ}uO`8X1sZ`l)tK&kN;?Bs3ep?HK`DUcSKwIn9%;l2FYRWAfTYjcc zj5+h8WTlyM)82Oysnmf9hGPec2cR2AqrrSs?4RL$G<%BpuFf6!_l7uYU*ezuC**X7 zdV#RC`6W3-)(+Ghot%7?4Zb-UJ^bRE>}2%mr(X^qo;>{e<lz?x+Wcbp<u_k_@%5Kq zKm2snKurzK<fGvt$Jqtg1a~zZmcKRub+Eh9348p?Avzt37Gvw0?if%Q5^b_gR*`~2 z=iF(`)x$lNaZfq66WFPN+uv$vBAZ*^aeT?ox4)I3Fd1Y7n0$+SQ3l}Ozms1SfA!t% zSA@i_%GmVVNJNeYwTC&{N}|o)?N8TgmQd|<ZvUU#bfAw=U4&7ZqjpCvq-J1(TG4|J z!WSebYlotP<ow7wDmgat&Uh=^!nxcjJ#7vX+eTX7|888qKywEUI#9u}tZ#9$0Ppvk zalR}NILXnIe0onO3LH6!Xh!%Lh$YI64)*zQc>^40a@bUG7zJU}ur%r#RhZ<EkWPVf zx{S%}l8{--ac*|T5e#%<hDa5TTLmq2zE%(lk0FT6g{exBCPK<v1RPKcih_7VWOFmS z%Q?LVFu9Z{R_>F<%hFE#B`+TZ8{D41?cbIN&ifQtfB;)^_21@FDPXL}=Q$!7ES^z5 zy}jUp0{A837l4jVL7~9z+b&|O2Da={*vhgX2+#~9R@!i$h)|lz2uz{qReTQG;7D#0 zrbr<?FxKb9?VS6L{vu8V_&?o(JfRnkUnE?@EeegsiR%EOgJWHK8&^&)2N<l$5=XN| z97t<qY)k<?;DdyAm`ESPU>GA52`j^fh>a;lDARCQ0iXjb0N`erJ2s}NcaK6rXspl` zs0@SeGwMKV`Ws0WN~m`lu#5;_=x9VWdp)99c@s#&T>N|sGXfHIg3x9J@?cVeX)KLI zFkdT?smEQXHu$`kBoUp3@S5?}N+Lik@`i_^UU~dT=*VEXeV1E>OeCfNhgEkd`yP)o z4Rtra$5N(K(dg;|r-HBs%v8;W=Tl4-nxI6cQ6VRnB$xLHiwXySw!$hRavL(K0ns?9 zraH_uig1?s!6?w>|I0!rQJYY&^2h%r`~?Xpq)vo{CyHo_&e#Txd%6KtsMZfS8^@SP z2M12u@M?sSID=0gt`yf#^zHLGPP~kYM9lSkj?th6Yk6{CqX)PW6v`bMdpT<xOzv_g zIO>S1({%xiaZbVQY(COCn%{fY1NTXjK!&*MZ-tr+@xQL~BuLa1D0qYl%6Y$vg`1t0 z|1>!vTc!g_n<61;^ePQ8pH4D_p34Njy|uM<n@A1@)1cyc2nE1`O^_(3KxKu6dc{DX zhlm%GNef^e=9q}zu*y~~&7J&EI+iD`$HyDcu0|U+wsbRkki=IK@=D|-5-Fp*r#UQc z7HupxN7l|DV33PY#Dc6zIuD2b=>GTui`6XWVA1RZml&Y;X|%9&CpQM>A|1u+4&Z_Q zVf79pV;coZ`A5XM!#Kem6~=_XK@<2$6N>~INu6Ph06E;7e27m}eX%8ZkYP1;C{Z%n zgarvI%u;<Z#%T{N*>qWowIqj;N}y@MZDW;dK_(h|aLZomxOE%01Yh59q1$@>0BXV% zzPfkoHr5#fc{<4li}&TobEHTm)dKFkXAlJIqZ%^TPRwnQGn}@;0e3n+TjKf%%szuq zG;s=A9Oc?@4IH9MmmwI;>C=on*@^?CnZW#zD&AHaN=hWt0U@p#JLGSWKbPa%r4UF> zom`ujzN2~Y;{;LL0P)$87ZP~>vnj0t9F2wrJQJ|LN&|#ZA*^o1XuC)O!(J(Kb2Ms) zf`E6P|L5T@jHGEcftP{C3HTBCYFgKRqkJkhJ2l3YTuBMf$)Feyj}R%3buvOU&;GW| zmbl0QG<IA9BFMclULX<Aw15Hc#Dz&IH3i`^<nPO61YA>+(0<%U{QO_Bhl)E%H5~0S z3z|BFI)`L{K(Kc6B`%~$HEQYMy-rO_TB|$$RqrU6N*9B73F5|up^Yx8@dQmX>2Fr< zbc70O0ZavY5>&aO<$j;xF6CfS!}d9%{wPqZE#omov~xa7l$@ab(inJ^J<e!dzboac z3#8d@BGQg;txUtz#{P=}&^_bGHt69n((j9M3XJ0NrB)Lp<mrbT6F1PoDU<-DcOX?| zdWty|+3jsWJ|Da@b3v6y#Z>URMv{%)y1mQuv+9=$Y7Sw-8?sv=KY~3@Spnc@GS!?` zOmtxd(3jXpuhZQhv3XTm>iPK-ZL`}_)HHKFp2OFHh&?E7NS|R!ILkfQSxbqUwHH3@ zQCcEx4T$;d$+OO5W;9e#4VO{Tmv60!%aM@z#;TFzYHe~2us}B>aMElmQ<2e|sW||O z%QCH%7e><S>xUw>T3ugywdR|4j82HNVyK{d4|mch@QSf^*_qAk5-THWu8WxkHUNH{ zkK_hpNuLB@yYMSw65!1Qc2)=aum-!ScC43FwUOE?aJEtOWIk=*iznFxp;q(D=kSa< zrDsiwpeqWC++Gf}h9JC}#BS^t<X-XDf!aE=abQ9>j>8Xp`PbmLw|nJEFt=QuB0;aD zzAh(hiJQyS_ZXWqVS;MU5u}Ezm+d)?l>0fft;$TwMhY4@%4U<xW4S@wV)T!&{9qe} zJMaOk(<4dK6UP6=tkpQKB7|77<}G<LE^xolh@YV&SR+(?Y7HE*>q(n=7PjlOk-+V3 zTohDuQ#Asf?Q-Jjgano)B2Eo2*=q7d5MSZJ5odYAq;fQmG916oGc7P3<hE7k>bLD} zumKKX9|rCC^m%lU>3cdEkQXV^!44lxo*hG_L0Z5IIhf1D^ZHOVK`h@qOvx#NGX;y- zn<;*MW5F0g>W2x<LG$T8Oms$QLnX!*m7WqqObfI<D6<$qO?t>Dx=H3O>}+|04XW;Z zRkq5W1~9!|tb#GM10{OQNt&vrPOO_OL0G+`u~(v0aHB!@#DOy@u~FhiHNi`-31xcR zMnPBtW!fYuK<ba8B4oB0NsrbIzsug(YE6IsaG&@Je+>?A%wrt<$?AwI9LwnkQZxTa z4u&h}MN=Pp;YjDGKBgt!XqQ;sgq=5-K5W0?fQRobA{_>Q0lhp2>Atp9O<)K$P;p%x z(U50=D^h}u_jG7O2kLi7`{=rSuS35W)7@>EfhBD$>;co#^dz}w)(S?PP-2GkV38mt z*J@;-_Y6wECzi^D)`>U<1d%@RRQ`LO;_nGH>kj_w39g7=3?}@yvot(46DgqT235N_ z|EL`RHrSh&7Q;JqqV2lkYWV8NUsN1~r*(WIA?ncd`sNuj+MlVNkRWNE{Q?(eB;4!H zX-~^X7}r}!R*;p5fgU9)5vrh-6t~{k^~wy>%Ik`&=MAs6H>JIdT?pc~KF9(vz&+D* z+)F+mPey&5NMBHLBozv4K^rItKJJ~2C|KPLqMJ(|2)2N9U}HdxEOWjg?xKUtrf*U} znA{q1;Bg0~ZwHgtbi)L<WLde!^ijy~a@NOHFM~EeArY30Hmu<g&Xr)gp$M5pwC4fQ zXqi6A$-WydE#`=ec$F|H*?nIuG^v!&HA59irv-+1_0_i!xw9S23~N)?4kPe69y7Np zdCR?M&F*0zQ4FRxikFfw1>C_PQi0t@FBalZS6wrhF&czi`Fx>qVq&~mh@$0`0)d## z1d+l8yP-c?+I^^up$@z6vnF)dTJ}MpUo1m0>?<Bh?q(>{6%r*8S&D~xDzgFDsb(Z+ zR2powP=Hl^f%8r76wcT3<$Oqa-$)>Y3LGKETt*(hLCEG1ZCu^!gbq}ix+F0rsulf^ z)drm)$73g77VtIsa{`DaW1Lf&A@pYM5Z4M+ohXGRQKIZ}V6Yhm%ExGaS$c3635oWI zsz@x;^w@d`WWr$eJvLc+P4h{@XSr`dFJO0t!cyu49N40_Og9i4g<KMNwNr#J!bWja za=wV0kBtl>0}-LC0QBXMLjC#(e3FENDVjZ3L6Z6JWfuMX>iy2)?mk6!BcY*{QL!SE z%tP;)7U8C{oAX*GI>Vr5!iKO3?VzZYG)oR2IGRDQqiBY~{;uOX0^6=}3~BbRFoF$Z zRa^{^d$2s;DyJ1a1{+U?l1v&MU8PbPM`8$8SJ0mL)b2HT21ACO_AW59he$k$LRRJ+ zG0Z>BJQ|)ar?2~T3hI~ANx%I~G8IrTlwi_8SV};!caHPLVB#OxQk#{4KOlvcCqR{O z-XU%h9}Sc5<1V*2#kyfY*qSUgg#^2im$C$cK^zCm3qfG%S+20SR|pQHh~!4SP3SSF z;EQBPKl4OofaWECDH^{tFUq*8W(i@?AxkPi>R{9A10?C?$1?PK76*`$uzQx2l-YTF zlf5AAy^PhjR&?V;bH?zFM<7raKfh8%yX@l-YOW$`HERG(d^<yONm(#3chw0}DKRUo z4ItnhNG%-Y*7O1q-eTg@T(>%iws~(?6cAstPAnmC*RfDkjpwSWeu?0#cDmkb(WD$* ztG2h|R;TVg-5w2rb1Gdy-+MIFD0~m9LE|SN(<(m!nAZ6oV3pGMKq|Dp2T`f^J(vo; zKkA<#8vHe1X*WxY>XK1*vOGfuXdG{chBu`@nM`1LTIa9t5y008mS%sQg2>a&0vs+9 zBDctsUx~H{bCyt3F6xtQC>)_JV`HX{s(C)Rdb_ll>}yPZpPy0j`=aDA7_u9f5EV)X zz*{+8S3;IBw8>G`0E&oz-CpTP;4qQWPdnZz5#*bp_&+3>D=sfi@=3aN@-QIld4AeQ zu50Wz11kfA!_<w&h-86AL8fNc5I&yH2WOO`$S>CR2{Gqdv5p`0a@7ozS1F*UrfMyX z31S3qzsQHLt@B!$xfsqsGxFy~fuaJ;_svw?(JbX?^L|!z3t=C)(4$LjrS2n2V^BN> zfU3TPp;ej_yywD5C{{5CqlPLKTm%O}*`W&+7MVF14a!pFq2fMHQ|D1dOJG$U(}8`; zNnko>joyehrvk;ONTE#Xzz9!;7L1_MdXV@)8S!vsk`m~XeW=sK8X1xU9wTB)2#TkL zc8$LPkJEo_TyZhmR%IL-$4QsAX(H<b0SG{2DK+{0(JTuvF~_um^k^6AZ?z=J9|4gJ zM`%cnt=)!wLiUbIxdV>#iu?i&v4926p^8eO$00K6#bOkeQXnu~Zn(e|sHSiI?xr~7 z`bm#S7zy%w`6>0rFZe7du=ivvREV*U@V8veIUmhc@e-e9a$P6Z<(lM@;}G5mv!W4) z)FQvbLoNYIcaix{Hn>c4pIF|PCKJXsU>cYNh|h!3z!}RIw!oc?mPml=!@xoEWwl{y zEVw6DLf~4gMx}Kbf~vnEcGL|ZoS1sJ%{-*-7won9Le&6`H_F_#6#9i}N`n;Z0z$@G zD3)vRqofBa5MVioYnN3aiKab6Ps=IkKr0Z!fxFwfvXf6dp^i@{V~tX?%m^E&<UwW| zC=o~uhy5PNrYy!W>G<3*1M1X|MSBxE$RS^AcC@2=U2UXu4^eGwVUw_=#~I!5rn~FZ zW|dM|g{6sHi}lyQ9H7{gf-1A7PCrp!t2{r1$+!hb3P^LYFW9!=@tp9Sj_3BO0xFn! zY&{7w<$+WFa8>}-#U(PG+$&a9YsT4k_kl2F$=D8v8RVH;^aT-RLs{%1^X_6$Qd+7X zi4%`>-VlSLKBA;<9wWlZMu137K@qC7Mhw`-V)sF5HXGGrEiUBQ#(Qw~!i*|&rYs~$ zim<E0I>xWQFfX~3A3#!0d@3OBh%^8x5yN$zT+Hn0D_0}_hN}gY0Eo{XXef-7QV|=v zR2HwHvs_10z5oSfc@Q5;LO8Kmr<XMhXGu2g)yaq$kMN}pA~hr>nn1(x2|XBM&%|T8 zalugcrrrc$#?Yd95C8X_MCI^LnYR_Q0LBJn=5NX}M>sX&^p<NU!FsP!MsKtj23e*? z%t3GcNuzTnR83xG?7+<ZzY-%5OYdAKRx<EMNk-dmL~ya1kghP3(B3NODJVyIWN9w* zNcWmNpCUbEl&@@Q+}OC?Amv*?$b=Po@cevm8A&z@t5scbK0Z}Zw}X+8T{rjzJ**U~ zopQhO(^EK`RNz2^zM=(UAE7TilbiP0^lo0cF(PlZ22Fcr%&kW)7Boblt~BeH>+O%% z+Zb|VZmL?5YMuswxPdKUIFX6NPDYs4bxmwC4p!badoBJ`@n~IhzFLN8VqJlS8?y4@ zrTAA;7A)4$F4K3EpmSI=E4&o7A_)mycSmWNz3S#^X&e1#5lTz&y0iBhcqL8$^KtCT zbGe;(dGotn1y3)#;r(wr&!^+R*@H`eksPoO-j=u>3V7l#T~psA@?GVmSQC~JN>{P! z1Ajd4VA%>u+3jxJC=T0LCb~x}8$s_S_?pN}8QxS*LAW$Qy^V0#NXZ<&iRO0bcw&d+ zFt@kGPTb?@lBkQ$gmi{lqVD(hn9&-rEo*jdO+EjNEArst0L7Wu#IFPqFA*ZHc61do zTU8JADi15sEDNf)$##QVmRzRCAx$1@Cbq|MHO~{kT}aR?SyN;~5@lLSL0856`A45} zcb`fq-D$9~NT9@-=+o3~(GVl-AJ33C9xZnvBI@|-79GbW4LWgb2iXQH6;2p-qGo3B z0V2ty=^9kndzz`<{j?OW#7tQeQ+ejpBZ5F9hP-sh5e<a&I5m~(u_xrD;y^m&3f|FB zwW@Pg6h1;Kz+7DzA}XOn;i+)>l4J~c2`NDa!m4fX1a_mBs)^Ovx#hH8N~@<$-iVH6 zNy0H6No)gR5P4JY*}vQYWsDUnFXV(0YRmZ!K{bCM59N4RZsmaQ5!LBOb^x@{kLale zOh`&~uEWXI^)YcPKHBO^3e;ALN34Xljq+4%di|NX5hz7o8xrf0)`W)SO4ZubgRIo0 z9*iz5hKfK6oa`nl>{14MQ!5q%1uscviEB-oS1|#uaRl0^)X3IQ^is7>gVt88QJB_h zsnn1m4Ym5Qf(Sb!8-@c$j4u*8p{>RWRHBlFN-87%kZa{|`la-qB5JMm%3^n&D$bI# zx`M;~HmA3J+j&5WwGS@`^`C!`Jx;)VW-e<b<u0-lYH*P~dPrt%1f1rsXaKwxsvt#b z<7(e9!|9bNSul+?qTfcD<haCF?w<L4d_K?L((Qa_tq2zLf~TqsJ1^cM2QsmZ*aN1q zCCdn%u;VPT2gTQa4MRb$jf#zG)DCLV7ezukMr$CK_kgxUzK-Sd6asi|KAOk`(};OK z7LRM1i?>QKkE=bKAzGovC(BWW3j>tYjB>m);mjeWf@#LitPn{sgeVhJbiY8lr@FO~ z>R5pS6`_QofNvio4>|);M+svOH~%NNcc#DTPm)^v3(n)e!c6?ZvW9<&M*Kr57ZCRk zyb|X!LG+q!UVF(8S;Mbu6IE$5RF8|TIm?4g(Y?+LqfVGBo{ZUyYlxg6bQn#a2$fd! zG!IJk&a`LeK?>SUJHUNr8nV-ly$kl&J8DdRF^#CvYN9?KjGiv1oK<ue5jn^Sl+9>% z@n}!*hL35Mbt_@6tx%CG)ugxa8EMAAjv9VLVEHuzF1z!{&f2^0?>wq%^)4&ss;|_E zMc(B^E~X#eI9Auf#HO^=riv=bTKK0<6xufN%*9-`YQm%tTd^aDhO4I9HSrZ3LdH>h zQsx39{;t9F+rox>G&dhn$l*Pj7LT-;?cqoAT#_-1@6nCoN87#I+xWltz1#P{>)pn# z;H-GG&3gCeSNC$Z(jRThzyA;|SvxLF<xWu}15ml=`KYz<SApN8=qK8=f}i--DE7%Z zl|o+yT`BTa719D<1zjiZRdpJLJyEfqlfN-RPtecqtOhYh`swV;FJKgS%b`(IP`vmn zT&n1k2~=`EtN@2QD-kp<LZA*A@@Px;1A`0ibvQLEh-6Xs>7hl3;IWh=`KGl89k?@8 zT^VJEr%Gyop_dD!dv*nim2)`6rW;<MIFC58JjLra{sP7bPKbWGOWVi&OgiN^T2^hT z69J&a3j^pu?iP*`B@G18G>~VG!p5j{&M8>1ri<wwwN_j}m#W9HZDXbqa5_F|P|As) z*u!f~UjHz?@+mhx<Hw^06Wp9K2?k5#!X{tL^Ob1z+Gis!T=BrRMz-dCsp$IZ;l%Ed z_C*4sk;-kEXqxuwqYcZLs1@18igdMYAlUh$ugJy|+O{V{mzV{j50BVT{Yn6zWT%Li z!&Nnk<#OG}m-+bYyy6pO=!zSmfC$5QvQDlOHC}!&m_zz)80WQh0?hkREiE+$KkU=B zGEOp?%=?L?F^N3~3nL99bcNJG7_J(%Dvpiy%r?sNtZ7v?;X)bnUA#uggjCRDL}o-3 z4N-u*SSGA2oJy8@e#S@KsqLymUYWjfjvjt)WF!e$k~EsOOuCi!&6x^Oi(&r-H-@2q znj_&<tbHnYfzI$o7iR^;Z{00maWR7{XsLE<avKNU;9P;sR9AI7(4H={8*RZx#SK3O zmU}-(O@nNKpDnvD`BYmIFFb>lQnD1Hp+a^6a?^~MXwL?@0^zg#t)a85fz<MG3qPJA z$L1c2Jy;`B3jy#ps?oOiIkg<#r)g}I2{GL<%TJ27;&0X-EO$D&3MR2EPbxWgT}#n; z`q{a?9P5UG9f6J;JcG!iNJ+y+`2~zd_F%zeF%(KwXKo8n$WSs$sYV&EO<={IBJ#4) z`h?4$gZX7295m1L_-YZ<IAUsvNMz5$HS-b`czG3BvigJNBFCgaMgW6UMIQ}<QJ~$b zxv{A-oZykg7&`E=o><ToF-sC@gIfhIac`XBS-c*BdGxe`S0W>52!@{5Tc-wR&^gp5 z2wV*CaRwOtj3&(tIvr<|k*7_ZoW<=9^B~QG<(pveqmoHLg4!W{^9(Or7P!_Ck4xn! z;#_N;!4Fy~5d|Vmm)Id_`=f98G*X9P@gZ{F4Cj|K?TX_b0{1a~6hPso6b&A4Uq`&` z#vcd|+^F`>wLhic#HPT6a9<FFbP<mqcMo3l9`n?!bG=6z1Z3e2Me?M1w3g7ptI=Ja zaF%MJLfoj-A}ysm<b^l%IWEZ7&UMscr7C|y-BOKT3jdhKwehFHn}M9v)b;Ea3*~i% z`bW>w#tSTSOU}{upVVO;%Rz-V9;K=^E@R@*QFfNSt82nMU>Q<v_jPg07G1k$F?3J8 zcqGSEg9qOa2Md^%da~dkx+Z#pj>7Q70R~4)RIA3c*>ucx-GwcKS8z+V1Z6pe)rwtY zLSzEO4IN+PzC4N)LJWxh6zWBul*KA=I^33^62}%-ri>wlqccq?u+snXc=rj;*{Hj9 zT!P02UUGV8XcVs(EPxT32A%}ai<}4`mYNyJLrxtIJ$`kpW9SNhoW8wC+;%6RC%>lF z<C9+rD%{2WO2#jW^wd(MOsx;&4Rb<5V~a;-UsJM-Pai&%EbC_d#3M$pPmu&C7Ymz8 zX&_F1CD&#}BhFY#HHA!ElQ3!R$*<XbKGn25rr~720EbkWqCp*VQyc&!dR<bGNvx+6 zcehX1{3IaMpiXjSxa(`UD!o?#5@d2IMKkB*S8r!-#z$PgG#X)#P~u&!azntIAJavY zI#SB@bt)Nslg7A<M3KlMrI8+WlS?B$s8<S4J!PfKO9hKb0%P?&D*-n|Q<dQ>f>BF= zP}x+bv)AdD6r`{GmG>#QR3abC8k#euN_hJFg$oj8$xFhySXZYEO2|?<d`duVqN9w6 zBq?bQk!r5pwOcD2KBT6rlg?D2R7G!UgQe=oNe7UYTEWK77Xc-jC7r~-QYMnIkGq5M zJm21ir8VaFE1u${Le;b{hapsVIfoJsll+(o#(-G%@lfn>^5h+}Qa*>oay<=^5RK}3 z;(zQ`oaPUyCw&Q|gliuMIL5L?gL<CBF#H3BbSPs?dM?-BBxwfOTz7AzOS}jR{0gHl z=7Z5#+!{6@1KFh}8DAF;i$0@%+ahfgWz|IVr`Z|aX|s3lH%W~O3jCKTNimGGP(_ub z2;k6VYoSgxbAu|ti%n1Dg<{&iHd!LHv-jkqWxJFzkB7BS@eZcGUH97{f&U_w%@);g zO98cP8i$sgl3I2i?9%+e&ft8->J%fUeO(m?Yzq6{0@vL&a}J|rB!gxH%Yy!P(+>$J zkm_)uh8RnIIH4}XpYOuCbs7GA_jxe$F2kSA!!Sa060Yy#aSC<<MOI&(c32fRQgT5> z;?1I1#IDu|EJAfUw37j<u>NG@+G|ZVQY}|#mul1U)Q4Rq86Mqw0>LBf^w~<DEpVd8 z6fh36R;`C2XCF|}4^Gi}B0L2V2lAB{PM!j+Q#B^Fk7vP4P9lRaAYIGQwR~|d?ny>R zozRa_*Gw^U2u}*o?Gl?Ko0eU|WvJ8n*%BKpcDx{yQ2>c5=xab&EH3TQ*45C#IW`-= z%O;Xj#!RsFQNm_cLt}j;evTfs=jzzM&Pc;-?8hVBvMpB)vOvA85GHCOG5jrC32L@% z$QO%Mnvr_VjU<JoWkXTjhQ`=nUQZh57X#$w#e_p7(rG^Lza5Y4qHkmp#Q-9$VG0DM zL=!1YH`;;DYhJ^svdK`}_cKhdU?35Sk(*I#)Wm5Sa*&3MY)3jTR}^)%R%KmtOyzd# zD|MGw8Vt^SteJCHtgDJbMyq}0GdwRkL);e9gDJn-SEis|q|J>2gxWEh>;9743nxY- zSE%eu_zF8IV)vSy=Dg*w`rT>eitX}QG`yDU2p1n&BT@h|wz7B`kLRkwv8Groazq+= zhU+R!nq1D#<Gs-t6|%Q{1yz70IjM)#mD((5(4?@57MJTt3tqBBR%x@DNf>_n^t~&) zVw!LDsu=+18O80X?siLWsv*|@>|2!qXHzq7vFv+Ykp>VY%MCkLLxUhq6-DRF@E$-7 zRZzdNPg-o^5TmRR_VSeRrx8VlrC8Ir9#_-CDz1qF=Cx5sGrCCYt&GeJ*7YD0CWjhh zZOVL|xneJ;6r`j(N1a8y6?N?Q!-p{%E#}yiY?l1BF1Oc(msgk2XFzl33Y1<93ca&W z6Bh16K3rAV(BG|kO}JD!c)C0uRs9W|LCiUR#}76bPV-b`!B^HhnU^)s=%T(KStZwK zs8>bkS|~jCW(g6+d>i5&f_Flw)%cgu?{`AD`yTy%_mI2bzWcwEB=l8HhqR<&=Xm7H zx}qG_<hLD6d4-Xd)3vXMXY@|Rw178FW!}-T2-&}=XTNs~LN_DEu2G>hKTEy2p!}<| ziN<#D`tV$gPY8k3VxJm|lEGrXus_ZJQo<jwndHi#i0HzHX3qOeZxB)7Q?b{U^mmCw z9t2wPD!pu#G>^hj8r6-GYbLoDy1q6%d8!u%FsYrG<t4A{6*VYM&tl6?ho^eDs1o+j zt5=*+td^%-o15Yq*f%fE`-92sTyJKR(8+I5=@yVS_<(8cLkhE?@U0@mv|&e&N4sYI z`I!c(>M-ldqdYvLIR(pA%R#;zkkas3#X8S8V$%LTLj)hk(b$p`lYT1Jh}DEC$384& z{_s@MDxO!ii*-@;jL<`~mIIT1Rc7jMr$4m&1|=C9c>Oqy?cKwG=a=Encj2*xe~MAr z9P3Lp!dP#6#Md`BZ{0fhAQ_Gu*y&_3rsV3<W!Q@*RI0ApMjJVyoq#vl5?&-T{4}n- z1je(iJaQ3EuSa$_+k_OPmtt?ZbyACDhO!5rRgGS&F~+@z*{H5GfiUgeHI#B)Zp_RD zMVUq<^Fcg+>iMtirvNJpJ%_U2Ewe^?GwiuFRg@MT4gH;_O(su&IG*Db&qm?|x`DVh zqgmw0HdRlVsu{17UFRIoy4uTD1HrMsg0Esc6>XVW<iZc6DWTEbN@yTKU8RT-!a&3l z2vaf!!8g@_ow|{xH4u?1)Y@I(Oq*Q^+zEfYqS3+7-(Ky}sc!BPo}a_fsW-Ifo$v1e zZPq7m7h>o7Dd}UcC1NqZD<)&ETu{lf<c?0YXw}AGeXzH9HKR&v(TVvQZpc}|x{Y6? z45zHe@Iqd!<R%hvLFj1dMN6YTi@K32u5X}RJELOQKgrH;qlaQS@G9YAss8iIF)MV) zf<BwVzQcG;$ml)}#c?-ClBEj#)hbCP;5tuhVK&ooRA-O&&dR98oa`?Gcj#Ohhx)mB zsdNQGn+1U;lB2PCOnm9$9wmuxJ3VdJSDl>*7G7t1+G?`#;a!a#dfNJEi5pohlzT8d zk#sZUx^9D{JZ(|$EVPQxtt?LSxiW1^g++h+O;5=4U)sL1x$O{%z3qNW*pT}zaYOF6 z1P;015;^34D<SoSUB6>;jwptUYu~I>bR2BqRRi;AZn_7mt^CxBitm(jE*{5OaYMS_ zRh))ka$KJ0r*KkH3|5Twiycq((pyE7M*wA4kn_8QS<vOLPw8+E-JnChbZ`<rrmYv6 zm5U3zFEKy{m!1x*Y!ZGgOH)|kw_v7>_zY5Uc|~bdya57fqNR5!0P(rC;Jw-_AtVww zyvs-X6opSIrVHJ^5@N$Wk77c7U}B-Jid{K>{ph*V;d$jX@w>d8Sc}1Yyt|fcf$8x% za9Z3_p?d4kN>Sle?z?(?AXP)kjneWcMTQ`lF0uIXq#xjNSagDhbAs>{Zs2~)N5Onf zQqqZa2SB9I<FFoT*Osk^(u>p~Z1fYGYfNUl?HBjsdf2f+ns62*&yGMx@Jf92u6zpx zjQ%J2j;UR#Y*#=VC=FtTDNwy;e&WLlNJCx0VghotR8dp6v}`r}-j<P&>&w(7!LkdB z((a4&0x>Z`BoL!of0P)T7aMdP==_s!!j~{NwQI^%{T+7ox`(+OR7B)SkP#?ZbtIw? zqbssb6dg|+e*&_xLPBT7!qbSY1+e4}Fm7YlWqT^&iu72*m8@_$1JcxAql2u!!$B6( z)H&dHJqj?<y(=(Z!x=rP=s0?cM$nb5DiP;79lEV}X{4Z9yo8B~!X#ihq|tVK*Xg00 z)ZZQ_6aF)WYN}P^%qd?S6K@VkbCD!ObDOrPO4Tyoy8c@C8`OV;JO;tVo+_7vikin? z5k?!+fxyH`co@}nUSzGVjMv}FCz;H~S8TOo3ooQW1PAYQY{TGJ?}UHfdG*?I%7UwW z)_GxiqTP(UUFIU8Ft>ZmfvHHpwPRL8#ioWX$~C5bg+fWwmoURy*S{FdUnAOKj<6CT zXLT++6!c(|+=6R~j1(m44=Ye!*aW_<BXFcGQv=r2uR2o7Y^PRm2cBQ4N3U_3v*f(< z?RdCiTamhM>PdpygvxC%x01LFepMHy*+c?52)&yP*!4i{S<bNm_XvA)#vXigsaJi! zGO0o^RV3wmQr$OaU8l*ec4$(7AZ>}J{0fATcS}9b;U(otF1<NZ?t@WU2h$)t%p#i1 z$C`DovU=TCHQI@Sisn^~@xd_CJ56jv%E1aqZ?*u?NYtzwXd4mb8C6%<D8<2aY^p@A zI*FreMRruv-;KL2(8W(0Ceb~nA9j_fLD7o&A@<7fw5v9w!X#=e6h{?B!!iLeKZp(N zQ`&|351X(qABT!Qgodl=94_OK3;Tzm$gu>XE?al}qk(}TU4zZu+b<FG;x}-8KO|}e z_kOwJ-s;!y%SaBPQdhWzUq*1GX2`P@@8ZX(a3?<!zdAh`)rJLs*nX3hs%&*Fe`HEl z5_Z}|P%R_{(SzG{G11Z4@#e4Fhg=d}dz`<7xFj`hg<aWx5d9XOT=UKQurK7(^j5$2 zBvQpIPdh?#rD;bSn=4ZR%WEfn<GejPfMZvZD;?q<p^Cj-h*v`NWX1cY;fR6~La@8q zt<w^Yrx==}mF}LFQDAWR2uv33CND^`{_|Dtp(ZgLn3J+KiTIu_r5>+xC$&VyGdQGo zSGk#*#PFw;?x!YE{N&xkwmNDh(Y)GlJg1~+&sM#%TI$LHy(O^H&D9c$t~=shQ!cu) zxm>gM)dcEzolC6|59stWGBV;b&6O5?+;L4PKn<&EFJyX!>I#xJo|5u1tC~`<{vIV{ z+<4mcUAxzfo{pPBgC}%!`@6uE#^-wO42HZQoVt&46T#bQ4Jp7ve}mjB9ZN)QBh2VV z7=>Ft(Y$Ccyr|n<o~&Jcm3u-VH@N0cxGuDFwcA25*2Vdit*co+<27_GD^n{Yao_s- zc80*hE0CbIiM_kzXt3s;wP@tLqS>ocb~ePWYeHGCs;qa~HMeSPVmQhO+JokfXVV5F z6ieih0d*sD9bJEZQ+kBF35(tKL5p#(R|#H>>c&BgaU|kO3&#q<iXj<%4DZeQda-V= zWD5>kdRpFGoZeW_Qq-~Xevzi_TCqzd%--gYkX}m&Q>l??b4Lw9SXT>VDkDvd2#VGU zXG$V3nS>XzIaIf-`MH{OBX=!`EN>FYv!ExY+JIlSPAgrc5BDa-Y5`6qmW12N>ls7B z>1{Nx52?TPB&>;5Y!wZ#xFK06?NEu<72}^u0~PI8uZOA09jq7mq%!Ljttzr5lWVqK zqLC6q1o6@LkG;vTUc6P6%%H1P#FlL^s6I>4&Xq~Jz7VhqzHMs91vbTw2NLBq;=!Vh zA<$s$6AKCtJI)Xe=Jub_aqntUp9oo~lCgv!`JMsd&8k(eyxGE@05N1&a;X#hD(JWh zXQ^(qF*X|*Xezgrsp1$38ZdaykTUzP?KnS_&(yL0b=k6Xz<!)R;XKYpgzcHZO|(&a znB+!bRWFko<CO>ScCZ{I&MCatp7hY4S?_>S7bwUIOB<CzE5@X2N0J3jra0Cd#)d)Z zX0C9GME$iC0M8HL2A<W95*AlBOW@ro9dRWv{8OB5_+UP=r<Wz>TVkSQ!fC9@WWlX? zh9xCFc_X#C{!S|3B(Rq`snJn!a^KpqHJE%R2Y77u-X<(5?kgsw7V`5zJGGeRdTMG^ zX-^LWr54=YCOSvi(|qpR<s=5+etqsmi|Tum+XqUW(thB@j?rkBk^^<IZ#pWa26B0S z43Ea7|+<~3D|a`&3rC+TDtYhrjx9Klq!9Es0kt2^S?0w1*_c3rUPS7KpHwa+WL zpNOTpT?lyqt(?QMo5{=Ffu8V_cvdReMsWgw^Iq2AmpDuaEZ!AUjwpdQls=S~qOg~S z3M3CbTse1W0v$%$>rOnJVbg#`?=g9enNY(kfc_vUTE!@?2ko*dXoWRa7FL$XZ7`Ut z{MAWAeO{=BG*ryOxGnUSLoUkEybLamf?ATIypY$PCo-UeQdRDoY`%u+Ch4N(rjksc zN4_uDWoP7sKyjAHQakJ;2phqCYe=kF!g9QBj>rfTA~{ufdFGb-djqK;0}@K9AcYfd zJ-XuM{-81TyBOZns#?Q!d~IB~RVM5nr^=F-jF7HRk`gl3EhTixsHHV<dAT2{*OK1R zQFDFa&&+IVd-RbiZHi`=!?cK5Kxhl;yEinA%=c?o?O7}gmeEoR7i&AJ9ols~6E4A1 zodQG@-dc&DWC&~yDOi<oq&XM2F3$;9uUqnC!93JNM>j{XYXRAc9#i@w@;-Ir<VRLL zc_e9tw!pi|>_zDWMZ!%-93*uwOiz@e2vE<mH`%0O_48=wY(td~;FWR_#pLLHljEG* zGt)=M*jBF@Pe_OB(25nWDpp67Re5rC1LaDIE19J+B^bcnL=r$d*1U#~XkS}9Bk)~P zkYHcJ?NAL4zJwNb>W4oW^+d~#WNC>?bN9}YMP)n!e3^<1eY$vu5WRkv>;QE(nSG@S z+V;Y^cN?{}PZ=5{6eWec4iaU-`lK*r0WF~+6j5Ha)C6D@$H&{Yi2oQ}7ta^ZN*}{o zegq%E^*W5Zl%dkDdKK$BI=5<CS5)DRJE#7T;8!PfL7R}7(ze@y%GJNhxmX62+Yqg9 zz02g%R%FB34K7ow>I|P&^P=onxFsZswtndON=vXgU)tU-U!pGeu5?qn3__D0bI^rN z1^ZFk8o<O4esFq<rNS&Q;`K-(rHQ@HoK)VT!O9t?Fm%cINqkMYOpOJzSAe4RvEG-z z-td4)35Kb3)U;TpAE=(1YsE)Zw~ALoxW<{Dm4x*)k`5W)8$QmRgGM<LnYl3+TId{| zW4gu~ioHcqh_I+2Vu4F7CHX!u;&Q^&$CX3^v$ihlQM8gogplneZafbfih);d&c0qt z8p(%Gn#WS2H{lC)x1=joC7O?h#Me~zeuCR8#9G^4#NOTpJATaO#Tc8w3dP|8J5$!w zi6*PLa@y1_16FBLduWuoxOITn<SvUoQm$S=ed(oU`i{=irG)7SSu?;;QzTIC_a$X` zH$O=@2;(U|X7r0Xd99xqC9YnKTI-Idr+U54R#aGCDt*#%&)7E8o@8{`BP7v*;d0VH zzZmGt*2Y*Net;eRkuQph@jP1$^HH>6o#Cu3Dw=1f**v2sYrzGFliwW2OIl&+V(<>n zS?B!ffP<xLctunnNzl%gbidMJHM~SO+V&#ySQ`Wre#W<dx|}L2<TZPAo63|v3=cny zP7<@VwKW^e2YB5S($C{1RmvFqGQ2YV8}T}%)K9MZEk^tvSNzVTR6sT~z95d)&vO+& zi&{$iQxNCz3N*uuNd?ZCX&du8AbrENtLk2v29o_+v2m9pF7D;7Sr$e8?Ssv9^Qcaz z(H$qgorFFrJPj2OE6VKf(HK>s9}I`tOl=^W$+rp`8D=5r3hpGJ3Le^We>%<PmOPOP z`?HR+*O{hlX>MnV<;B;nb$I95TO4e)h2~jofGvB5*;sG=^pV$kn!Uk2sp;ZdUN_z& zZ%UDUM<X#^UYy9P<yMs8`RJr>RA;!)9Emc|F|G!F8d{w0AU<KVO@YFO*;e)PPy#u~ zR3#w-ZZM4X#<A8#5*=JS&*$aVvf*o>(125gj~A2%?R-vHro}vN_B<~l&AhmrWjuj{ zE}zXcqqq`4YktH@bXKytTZX;2%g*_QRW0=x0LO~P)y%bNH!Aqc8x^!WJcs%mV#*>@ zY4N&DfBtsriy3O9=_f_#Fni=H<EHuaes(ciT;6xo42t1+Otl=%^E_8s((YD|@N$Z$ z+h!B{_L;++=qG@|c<$jWFUE`Uo9sTdi!Q<FKn}}N=O=@r!1F`y9d4zFwf>Mlmq(H- zB-H+3iAceGFydwy6N@xs$=>0TyIOAA3OA6zUxR0SF`HzRFJ5uU$|Zcchu&s$iX1XS z@SW%c;=tQ;d5l;VrT31JbyQ>Bs%na9FE=yB83jK^iZNfQDR4a5B^(Eh7v*-=>CWr% zq7VM%_K;5WPFmva&`~X2h)1fv8%9vz6C;b&-pwHzma?IDIvE&~z|I+xAdd|4w?tER z#KRGy9tjm;VUYkV1TZ-}yk_B#%HS}G)oq0k-z*E}86{zln6L^Zso{mJlPM>r!kQzD z`;pPG+m;SaeyLl3Cxc5-u>1#rSv+XyX#}}%R2ZT|MAEatNv1}D(RMJNQG{CjN4XZ< zXV|(S*10QbrliM4C4>!#d+u3w1`WE8dWJjv(yO7-`gTm~ZaW(YFrc@$N4VLvKwhuQ z_{nb@@{_1DAG|FSAbP#NZOpGRXG-(Q9Tkf|6K@Q)`1u$88Fu{?kF=TYTGxXP1MkQ8 z-ccq>+LAZ(5eAe$P<CL5#OWww*HgLcsP#Ns47?B;Lv^i;p_U)V$J{n!Ro~Vztl8$S z(9C0;BWF4ovTD%VTJ`~!7Ilg~=F=|C0is{TREL13$69knbjKQ_Ar;pc5IC1~-iX-F z=9D-Xk6lOOh%TYSec1j>w)CRe&OR=cxe#M!Ws!tAIh9en740Cx5>SPRBh_U*%rGWm z*L9?}x0f@r)1ShN6Ns0oT1>~Y8CVn(4o46<N{55tc`y+{Ap9nSIr2l|zysTsK7%;3 z3jk`vmKU`#CrHEy3^8~6cyipTqM);5dMv1)0@IZNTla|M-3jtqjlRdejQ7WT?`Vq) z^}uTX|7Y*rdgQv1bkV<}r|ua*9&~#)&O^ayL6)U%ov|)krS6`yw>J`5nX9VO%A50| zQn}^-e!hrckipwpT$v@?I5-c6RVx|6xG@+ElELN1Po3VK^Z^{I-nkBik^hVq2|+XD z(t6ut*{|&l|Ggk|K5a}FuOR49udB5eT=Dq0*c>$|e1E&!+)b~R-RBx@pVvp!#2924 zhrN(76A3L5lz+of;J-Bg#0Q7hH;<QK^2r4(^f8&z6aCCK{p5oG=c3Zbv@U#d@xvc4 z@ZaYj{`l2je)!{K%IiG2-~__|{y&d5S3hD2`{Y9Y|BIxTYJBkA!c;!pN5jQPZpN18 zm&%&0#zJaxJ6+G0vQEY9WD0~5$a13(!m|~tu#UT~8k!_+7VD33*=Ho^d=kq`pAlYR zI&gxHvK7QQ8nC`NU9nkmBG-K<$9~w*(0U^Bq7Qony~31ya|@VQ=e}2emA=1U_}Zi! zd};5A@?4I;Kyx5D&s@ghp`<qDugIt!8Y2Nh&c8qo{@<jF+48u@D(?-2Qw@P!Xbk6o z!4A;6QALfpphQbsI7&h6xNvU0XG#kF0M-_+7y`v%bDY2HPfsp4keAKKvITp<={_s~ z)s_EYcSqS{G6ugUq-GOZjPVpggvEGp#)+24f#<N+#z0MqOW@1b>15$4k{H_|dZH|H zeACYgH2U;_5dP}ulVDDOxUs<8<YWWp`EIw_mF5Xgkv6J(Zrk*Gp;BBbIHlJ@Xbi(G z63;~%E+O6j@`=^}gnw1#1gb7k{CIs6?JC7ufjy-nQ6*cMfIP%FW$J(;=|(YtIO)B} z)mXcdyniko!b6o<oQQM+R3b84WvAfuF)3O13_lX9^ncFVgZm5%`PibxD-_P3Rt>(? z1B5j^2m*4%a^8rC$AE`}O-x9!$ruP@u|%4+gh+aXt)tNaW^EYNgRTO<D#ScvusA1X z$5an^VYEdOV$Ftq4X6fVv>zYZBm*(Vs6!!ynjj(*b|f7PtV~yG)fptPSvBF$WWaiI z2(2HPLQWr6-_#7^fD1#wIpRJXCyX9e0Y7)I%18%xNd#F(B+zFV$5e<Hal^&MV*l6a z?ka@WOtusIMxq1==x@j{M4Gyll!I6T&ur-4wLfe^bJO72n^znp#!-*1V9DcC97skZ zGo@=@I<=0r*vvrf&B6khD-`ee2cCKTb}J1@dR)cN$G}2!%yMy+uJRnI7|xDsqRvyw zG8F0{no<k2_Df(VoYe%mHte`-a}n`MUjw;0E;QB^k-5>O&2WMl=U4ZO^#_L_nAggM zj1XK19;s#RJEjcD@*DYRKkN^&k&gE`9k{4HV8)X62DG9#r&};fqUDEcylfR8P6uE! zF{c@aJ4k<o=Hqm?z<pLPC)xs;IK?D@?rTBov+2IWnGy6R8#fst&Y@1W$CYk+sR$2? zRkt}FR`G<2=?cqt$ckw(r$7`84MZvv_<N-{Qo?+(-^RiYBD(|2q$DQP47wGv5=c(q zP=yFy#j?d7ocqKf<~M@s@gufxUIt;o09mqdgcWB=5|WZeVApTy5YQe2dWj5Db<xH; zU8xBKrpieEinPITSIGoqU841?>8DG6hQgd$_km0X@DjJYUSp{h98j5z?_oHUBQk`j zuC9w)s=QS~CRp!VaSFMr6Nm@0b<b$1w@M^?i6>0oZ<=XAa<J1)cW(~4z65JT4H2Ic zM9~&9M!W6@3=OrM_Y_j2EgUV!R`l=SCA_HxxXIN$>`|Ro6ZraivBSujZzhW?xHpgi z*{g4JUEpX1AJ&;nuP|ZyU;p&^&uN47q~lk#3H{BpH?LnmfA;?6o7a=qZ{EFn`u%6~ z<>|L?-o1bRo&EIw<*Vm!{{G$_%h~wu-N;WY3#($<gjAuK2?XC$-y@EW_d_PL`yE9R zw0;p=b$^I<VwXv)_xOwCEF6eMdpyoN6HiKu5Pj(>h$1A8cZEnakW+-ob_FH-gQudR z<uJIJBZ0qI^LensuaF;QbJ?@SDWr|YEdK0b@ubPdKTOrz4j0B}w^wkLKRjJem-mOo zZ2v!x-R{2X)!1!Rfk-2lR(m!4GTN}*;CI*IK8)l83<z7yzGKDh{_$sL5Z;!q?y-#( z>p${FBxKy<rfEeT6phtz@5DHD&k=X|oHZW0^a%+ck$55o(0#kX>7Xe}1$WE&CGzF7 z+cDy;Lc_axhZMwBX-={h0LVEUMjC{pv-u#~iG8p+bt3>Zbyn!RxcG68{ksk!%rac; zD=EhzI9ZSppom1AOvapP*(yE*avn!3q~>ZuH=Ph&2v>f>a9wl~tgy`ZaA9D`K)jvq z4leKQ?Y$&YBH*<@Arw&MZND51D7kg4+n!<Sfk-&cK6LfVZ?V_=);A8T8y7+70;lNC z0$f=0l;NOS?`nKt6?EqMmp6nmQ~7Q)JCa-d?A_L4&VG{rHph;97pXVnX{R^<UC%Rm z_W?&G($Ul0H4Y&hrhb6|cAXy`>=`#KH8Sw*?K(P8^imFe^-4bID_C_i&8;M&lc(!B zGP1hPJfSb-o<6+Cnkt{T1|=ljzb9)sT|d}3SjcHlXP_gPr}e|T4krd@T0`Xo0krl< z>s6mGI-#G_#{g|yJ}(_9Ojq_v7iC{U*#7D>A$~xnxU$n7fo1hBgy}8Hi96+!e@wA7 zQ}oWB@hV|zr03FeHi*Q!J`qD*V3)UxYn>`fh@1IL*3hZQDimxsACB9XdLAoi;(PbQ zx5vej>YuftTTR!<tmQsc^!m#ES|(*R-9GgPBeVX{e|%89RmMQuV3RTKDuIKx)QIOK zU9FB-2y_Kqy>dU)bOlji@o!ccW&V((%BCgCqT<3(NQnVg`&5N9Mq8?gb@CLO7(Y61 z^{Et6>gm>yw3M%i?SrAmYsSyvhu44pX~_#6^UcI;_A3q#A@2XjqPt50{5LXaS|U8% zKi%!7_dEk4dS9CSZs=OwAjmy-{evQrP+7B#=i&T3ql<<@+1K|FbJ74nZY-SE4bpn> z;0IQ_42OG8=qORj2(!hVJ*<R2mPWa<`C>P{;fw>&rjsI{6*=6dD=CR5vt^SDgb~O$ z+L#zD67vVTx1mvZS<S#Y&f-QQkL<5BU3evoM0}EIf?FK5TI0}9C>BaYN#2dOK>g_( ze3nFB{JAW~!*3J=AJ-JVpYFL^{q%AB+r+*u7HP~8M)3>IOYtcKnjl{Cp=+7nNZ-lY z8DBV^6qc^k=<XKz_-D&0?yB%S;Ff#%WpT6K?7ElNJaW=G0>9(tM7K-7mkh_V7f5}( z!}0aqeM<2RiIUCgHEt|?aa!g$uG}Uxl>;(3MN#y!tlgZ-@JXH8@*c7il%zVmMzFU1 zuG@n{b?9!8`BXq+L%qD3{m6Q*!*?wU&0_Cm<DI)S48@KO_-WY|W7kA~Be1uQ_!3vY zKqV}Q`!x&4G2#?&)QXA*<bZ%M%5k$}_VkD<&v-d?CWj8Mc;>Cs2*g{!-EDSugFQBc zGG=$G)1am+h=~Z=(8Dhb?F_H65tbhB3E|Q+Ibn)=$ANp@&gL`Lpu_yMVN3x$l38K_ zMbuB#*cAD>tgkAoS=YN8Ry1<7r^JP-67A<yi%!fqmb{i(#_28y!hJ?Jq(_U(DAIl| zcHx~srBYNskW3>Hfn|>|H1Ef<<1^}ihlM((y$@7@nnf#^oo`mth1|@|Gs-FE0oRx| zC*LLfsTq}gRtbvek734=DjsY|y8Rjw97dL9{frW!xWhr52!82BEDmyl*%H{L{xT?$ z&H6`Ixx=in8>6#l6<`GZg<Ys}Ym%0<uWT@u!7eVaSo4X7z<jwib#nf8R~dKve%*J- zBE3U#7F6=2&0MN|*t%;}2E~as#+P|6YHm6yTO`g{Ao&fcn<XXWM0un5V{HFrQd)Om z6KGD`G+J93v}|jowu6>d0>YJ7$dYzbumKwUWiYrB5cQORL88UYr4l%7yOg_&t%oH? z9p(DM$HjVvAONQbd3utCI8_%(rt@;|<(>OdTk5}m+r9*K@`!QPB8HpgHY@U}n0Y}$ zD9)S;2<yJ-af#U4<`;a@?Sw-l@mO-`-I0-WF7}C((pCnlYoG48YrvJkRP1VaI2FNQ z+_)Rz0}nHhip{B)^F4Qs-)65>r0oLt1M>}>a$m#;wHD8s4#Umt<q0Qzu#Qc@D*8*> z4Qnm|fD@!I8fzJyB@Lanba4g{_CFlZ@zIiULNsTj;(`j@4Y;2KqTTge<J9Kz=Vv%R zNi_o8&<qKqIX&`GbLs+1PU95lzjm8%aYTX&-h8|HG(IZpfiK%f6=2X%s*ttgUsV9= zs$Z2=&~}{y1x6>=w>e3yMc}GT3$0rOS^(>jW}$VHC<}1ya!mH98{@YOs{7Q<!p+CX ztMC~lzu^*3ngu*ist(bBCTT}vp<)AO)Z)v~vN=J*>*g%nP8vO2PhiF$gMMJfP~>}d z`*gV+KM;zL<xx;*IyeLhFzuGfz^`$B{zSGi&>p^$wrz|hKqEPOd%MGN>l1k^03*+~ zy#KinjIkUu0AkUD)F!_&=*2~kB#RwMd-PH|bzJMD95<9(6F2=+P8n{b&Q8=;1m=aF zE_#?k)3jYf2B=pzrd^wb8-UupRie5<6EWuF&p)HYhY!tydn{u2t&0J83UZE$5iedZ zK7DVmx%bl+0hGy$&lxq&x5?=wYzNQ*7@Rox`+9+sB-t#Mv?p!n^JTIoEzO{xF>+lU z7rzyk;8t2tHmH#4NE-iYgkUy2Ln!f9a~4;$OXX$xRO&-XC0TnWXq{$+hA%3RCOY0$ z4zeXw{|YAJDEXoyX|j=7<@kJ)NciZyCLvB9ye9_k35B@({$(w_Nt{%a7x@QXaJbP= z)|A%jH7-1L#<Br)n&-&e#L%dy9g$09d-8x7>c4Vq=%KoAQW;fYK<!4lW01u|v2sWZ z;Wk3hq5BrEE13r_28m4am^n7UU_-{(kSpGWDLwS8re;pD>L*?9x~n(6#PRLbBJ)ZN zvHm3pc#rB~QV_3H7@|zHgSq0<7q3H&*5Zzcs=)ynPKhOh19A=dxR3I~OWnJow(i^C zskB4Xc#k*KaX_$p?aQpUP?A82^jiP}Z32^Tp(i|B!h5>$hjto`mD;;4l%}%?ru}q& zyU`~ff-(CBByDK|ITyk|-;hh5QT+pmKOeom8R473zO*5*=0fwW4N@+=lz9c;lJFw` zheAcb82C`}U-D0}4SQHReYn~0qr(CLg>S~Bn}&k|>AChCA!WLIZ#?_v*qE4p!hYox zb!Kq9Ld$<ts7=}q$(qi>;Q2E=>5-@0JOw0$t+WBY(t!@&^x|T>pdv8q?psPp^(!xK zIz+0rem2#TBNY+YhJ#4CH2nsdlLr+7PPWcB>*c_p@U1{)|2W&vrt3kzwNaU8#6)<s z=EM^V@U3O&>Y)V(A**~o96?r;AE9&GXudQ7?3adfDNR%*qIKghM=;8PW-@TllG{q> z?@DJR1p#R0(sfhLhV^vQpM<FZwkJ!f2uOt^q!DQx(kbla^IIxOFkA1wu#H=3Ov*?N zu+V+sC;^>GJlyV%@mYcp!JK`VKsy*ZO;8M3-nwJ2(cw?HW<3p?YNyy<y#B!X*&-xL zOyh73kM-uBJOqYCnWq!8<yktqmLSa<4i41}qLw1f8WQUM;hBN74@@LCkh6^Pt4$GN z0j})YvWCNw%1J7_vm)vNN#(d(Cj|Damt3W0ytrz>Wto**4+^df)@}>$@K(g9?Re%2 zaAm%-hJ!3+5VcX0H5?u_8A!XNT4cnt6W)j5Rc~-q`1})Hltl>1M=(QNYLN1e@oL2U zicIZ%E@4vYGEFNIKpsNT6GO#*1z%5}P$|_U%4X|t<-6^97|V;XC4&6!1Cf!;?xt&A z5c27`e2G#%#7km2|Cm`yf~;T5Yf{seIv=?zHPCWGwSErR#P94H`oxA)O>#oHY*)!) zPH6<<Q*Vn;OFRgzhl_iAbSLX_Md5@>;eg{8P}H2xh-C(itXy=s&UK8&oGNZT+7>Aa zeszg^6j@)U5p|=@;4X&joF$*jE<p&(mWEBI@eD8>cd>`jGRmumvWSnvX8V12efWN} zzF8blLock-%#XOipZ#{VIpAvKyT#3I1=u#o5cK#RaH9vGO04K_MgqhKUj8UBfKuE! z<#Ttu%;Xz;$hifFOX4ykCZRwcT#BZTGj!S->lh*~E@VIt%rvc|epSr$q`UAWdubUs z?~x`qE$+|dN1ggy662wBI+<3Oz~ltaASMaR%eb<TomhruaRJa(!yP(08|i3m@(o#s zwFPaDL@mDZjF2OJh)H3~@p;BUG17N!n=FJwE(zW<<mIrL^kJczy4i6Ao%N7KnuOf7 zZNiHcGVVNGF6Mk61r?LCE{ru0@*DvD<cV|xb#Z}*3iD*CX~B4@O#`Y>jJ+7&5-J!w z)l*L<rqG;zOzUSDYA!BlsAO_@kB_Dmb;RwO#7r&A)*jG4gq2f2<*<$V856eMp;Xjt ziaX1xd;X{UA(4e|UzJBvSf_D==`sVmy4vKKy|fvrhZ};N(pEv*-t6}jHj&cSgne)? zDFs3oT%N&6lyUF}&iV6O<}?7>sKs7ar~%vxQn}fe5=xZq=uTlfIhC0_(H$Y~o6eKw z7Z<oQUpPowqE}i%d<9pOp)LEPq!|&*4O@}Y)yMMKD-ql);L>1i94}>1#QcTZv!%Ag zwzLM{rTvc*P%U>-YD*oYi@P{pC_%MnP|DDy-GEX{qRwpvxco0Z6q50!y?_$F@_nvS zOYT{2bM^LI*ajeU;*NO^8DS|ARBH?$y5j(6baxJ_Zj;H>GH8ybeV-+oW^G1j0D#vY z_f2QSL>`RWH!gaQ1Y(?VM^s6uS~(e<bVGzi?TfV8tNz6Ga>;qdlxf>cICc$z)Y)%5 zsx3gzCXj8$1nX{58{QpKiCM^!;^amFAH*UjeK=w)67Ng@H5$8VZ{vhih`t$dY8w_c z<69?@M2KvC3&z(NTzDY5BR&vSn6~B+RfT|gR2eDHR)0i|#pG*jGD&Z48qL&OnqD8W z@0;DmKTup@RhmF+@KtFN*>J(lzDJdb{7|@WMXEFHhAd%G3F;zz$OQA#dU`BSj<kho z1}EnKtGh4$TGa?uNA0y|S3b3L(cBYvae-EOuF?Na!r&GVLn+Gj4Qt6H-+(an#Gbxg zE$H+O2vJY8>DyggNQl=fBUKDV+P(yUXe0XMBar87sVYu(RxCGa`|svQ|Ez7raCg#X z&~l3*v+s*!Qje8=Gd@KiPm~RMn!+-((f1Z1%fUvWDY4QUa1>x_K}Vq}q3@4=3qbAh z!OwX3?6mvk1Uc?@`OI7-{nO_yA7T60eMJi}Fo{>I$bw;ZYkrk36#u7V@I2G%QjHN! zX16GY;yj8U3XAm?DJkFyzRH8+WuebsfBw(U|3lNI(h;rX!wuJjF!E+IJofwn-F3bs zCOd7=JYVn&MkuUET@n}mtV$rkppXZb{Tp668fG(oE{8iu*+A5iJCq)TWM+g!DkDZD zIiYww8Kov<0c5DOE~L)>^J|B}sRqrBNTm_Iv^mlDu3hsWbA7}weBn4D70UfqX<cvD zUv;bP;oiN6O|p!;r4Q4kB<UPlri5O{nM{{R6FVwYsxzWFOeQneaC@so{d*hE)`y)= zy1fnO3+&6ZbbYg%ZuMkoFUIBO&L=T?8}iF^EnRP^x>ifWJzkj8aJaYYBW}%U-L~F_ zpIYQ|yxJ}1lj-#}UIgpr6Fkzc1KU~PuKQ_%lrxGb!WT*nRIz)3G>?QUF);+0f*lS7 zfVT>9ewco7o$yD$yYF2}_{<Odr7{0ZNSG}b^f)6=Q=yc)wg2_Hj|F~=Jyj7NDI0{r z`-FJW(!U|yz&{Tgr5f+K<8e1^FZguNNDQ0h1m4L}E+H3&D%K{J^i=+v^fm-N(^`C0 z&C!Wo_TgzIr?7|b<hWYP(}^iRJ?3P^xmgkh@-%9|ULvg+R&-`TVnEeIAD>b0{HC1) zw&s3I$-Llvp&xp0#+d&6DnFld#LmqkdXk3VXmuTZ%n6wA3$;h@J}o883jGvOb3#|g z9iGuXOvsQ#SYfEONt%l1O!i%;Wv*4&IW)~ha7hzPF;{SU&S4n7=T~C7IU#%0?IHkg z1=({W&V2v{yCcf#r?%Iqer)?wOSsU}%!eu`kAQ?w;!$h_g6FT-8;7erR@sYM7tSwc zJCLAC#}Mw5l>w3`wljqM`{a5$TPzm`U49ZpF|l~Nb+y;$FKloj-Y33ls)kZf3r8(K zCB`k+E17;L3z!)B+dkKR-Gyr?ekQ^|a`t406nPtu-SEXICSrMFncfNmBBFQz!G7;= zU6l}IJ<4iDdJK<m#9eZm$>#bR)kEvFFS&j}!IP>OtQv(~*I|F}GpftXLzepv=Eg(N zlncx8!w)zk9g+ndE1bx4j&;94;<vIWI2ZXDqKL;+U7l4O?BXAQmZH=2DoHphYL{ih ztGsN)pTHN{@0oaZ9YsORg9u0mc|IGU+2*)Ilxz$?1VDbQ7QBOp%v>ivPyocTGAkDG zK0rP}rR)s~xt$yu5Ds21`$#PqeIKPUkCQNPGI{r5$@tCCa_nqsHs?N=ICy|blF-2U z?(Qe~v%es-S>1>n=o}1Q8^6|xZnQ+D@&IOmAz`vzc<V93TkPq%bFL-laFl0TatR*3 zPa9MR8)D8}Zb7@&{`s|b%I{BZmMV@qCFJzt&;cLlec_%3z;bi-_2jf=UKDbnr?8$Q zvG@TSKKCv2n2yp~4L_LqJQBE37=z<zZ8(&qj;05`Q928}_3a-Ld^ogg|LD54pu`|z z3kAVGrpQM!%Yg2XW@g_n1DXQ!*qgBxW~6>x5_u>((7V|ojT0A_cagd8;Q#s`j^H-g zhAx6*80sZk;r4KmS`{siJ&B>q5f~1guRY`j??~YDy1&~ka3?;VetQU@k$k)+6&6hl za}`n>z35zQ3=9&>#S)zqhiPK>(KrW1{q*9%&~3kuJ0X>_kJcLr4|^np6B(S&L5e$A z>v(fRLfyCk9Z>_c#gj%v4)B%i=TwCB)ZAot+~MS>6JJ=m)!aOJ5nj+VxfQroGg$@! z7AU6q(nMat;_-c8+FW;^4z<8mBX;lBjX;s=z|wiCalkP12`n#KGHC75h7Q!zP`)=B zWu~Vs2`l6~JR^|Huaxmp3Vw~0mwBPHGG2HVw!)25!&W{8GqXQCzzMdTlEh(>&9K_= zXTdAvMQWtcQc40d4`DcPI-b8}>mm;0-RQKm%lBxMB;00lf-721IuxS7R+8>_+z= z=8=A%YlD#;n6+i#4rIH84vlfjEdZ+<Y&?W=N;k{p6}BTsICZ0<{S<EPurZFub(RQ- z$T%fR-(!<>rQ2&hK~g|&^(8<YbQ|`A!%Hl}?-bbYmPbr^Co&je`Dt=)LKG_X#1dyg z@6nPZ={2fHcg{#kBMp!f^^3nzO={9DyFx)97yMEK+E9<9vH^t_$MwTdgG`98ZuY>k zK_+rY7ANLmAZV@R$23O@FJ?6wS>tqNI&kEp-^Qc?o_2U<qQ7p}O)@N{UzFjV{0n;3 zl#O$ehOOfoYXQ8D3HSVf(*hDadu%;8>vzLfdfhFf1;$6Rc~FSbQ6SEHx6pR8y`S7p z*K>c^RNJ^SSv|0&&6G+vl}(gdYo5>|?yA&)KJah6m}iYPM~r{acY%8t;+R$5lyiX3 z{{HU!7f1k+2<g{+GjfH;kJ6k18siYrK>_ml07^o>&!p&lvM13KFcsq(AXu#ZcI;$w z)vddaI550Ed=u;MFGM-EHH$Q?Fvl;*am5zkrruSo9pFib^O6=kc3rDxm*7Ys3I;R) z5L8+v@(*_igci%?WOrPz>A*uYC?PnZ7V^hzfl7NihsY@Utgkfo^Gd3->qHJIf{i9z zKy;uA8+nu!B|mUX_r*L}Myskw=Ouj;si^uOD%)d@^}DiFi8}AbCKT?`U=gaagm;CN znz2Skm&-sbS@nS?elD;fbijJpRon*M7fZFerFV-R367IQh3N2Vaac|FA2MKw+V4N8 z=_b(Lbc@U;jnP#zvw|<$4%JDghSe0)4rJlbAu<Cdx1@~V6kXBv?-`;n2KxbeEmUw8 zMU-G2B_gI219XHvjBBlnC}%*<7s%BpP?{?OEl8@;FpSW6Votn*`;o^HnJDQ_Cz$Gq zVDzr@i0KetPndXYXLr*NoxcmfrV^6_|40*GzBQXQdxaVBeYVq?HG7L0u>~WHC&8$O zOdJ~-#61A4(1U^|^EQFPf6+l5r*S_4v(7LYdEO8Ox~+Q#y5Al5wCSnuCacTQj%Wn} zmrB8z9dx9xZiaFe`{<k~KGSyHVkYx}vnG6{b4PZ{W__>s`)hAJ^kw=f`9g#ds|l!{ z{k5M1H-*isIu|okO{Hai>VjA<*86xLRu)L;-u315;3qxsN2xMPGCt8pQu2vUGVnJY zQ!^&UhTE)14ui|o0JAhthBPBW2#@8dqi=vMAVT%Cn;UGv7EF!`2t^)-!^+JLH8qS~ z6AoB9c28H^h%W*+%S@^_^d1dE*x?KnOb}v-1GY8gLqF_m7(NPba}?CG5wH)3==;y8 z`oX_FQMms_bwEg!2K9uuTd##HS)Ob2K&ksVh}$upi=na8#cGA(=2w0dqg}q#@1gI6 zMH1Br?tDi*d=@%=IEGo&@OI9Sl+nOnYz6mtO_!ufY_1USaxg%D%%^fUz^l(ax5?)Z zNa|+G$4qnFebzM4qXR@mnrupBm=@R9hLe|Svmg+B{Fx|M4*55nnB&D5e*C)n<Me8e z^R5RmRwl?Z8QEp<w?J3LmZ{Doqca<H`(eUyiS8<}v-#KEbVsWXY*ye3$Hk-g_QvB! z?&tl*BbpPw5la5@_z`2O0ZBJ8$S+Ruo+usm6B+4ZreZW)n6V)3U^}EW5=5#dkF+j7 zT1Yr;SuNJ3x7crltR`DlD<IQVn+8?%=N+AuMc3|67`D32&tYM~T_M}GxYpB_iZO5> zMvnd_qlSSBQjuLXGfo@@RcrD}LN3g&R>WS2r;A5GAmluL#Dg{Z0>+}hZ*kl!`he2A zu=?oJ9?xv9=h3HYT->1m<>C=9=Cr@WU_ptsQZb1C{eKb*<yLBzp$(4zEH?-h$eb=7 z(FlC}h+PV0N}dQc;cN5(p!59!pXB$$&y(rZ)ee6P_Q#L#WidB@?>eeA_L0yglC&~> z{79wu_>q?z8U%?weq>|?)?rit0alTO{JGb^uNONykTku=S<wlr3cm=+>=6pT{PK&q zU8%31jxe@}!km)uq}uxbt%Gdp|8v%nc}t$C%NDagUKwBh9z$)&lfjaGL`WX)rT*>x z(*B6cG2!H3lvor?M2p>G@0<)9JicK1H-q|s>%#km{W4p8Tr4MtI~;aLJwIeCZx(Pr zActSHd7S)=eKPao8jG3*d`TTVZxLg_487Z|H>-Xu<yH|UH`j7bRcA^tLBqOO@32rB z(Mp=+=rrh;p9xyA2c6DrNBm8)an!vQVT?cj+#yMP8-Kf5;c`ki-yRZrJVS~ye{WQg zRB*7hHRdG;PXPhX-t6J^FLCiK5c!c_E#WCr4%dgp40Xv%uv4b@0Nh5j4L6SK#U~H1 zVU0H%`Xvd@75IN4W{*4o0qc)E)H!(0QH`fjsjxjz_g;M0FtTW+iT;;F%L`r?!VLvV zIa1)L^NE`joztUWfqHo2#u)Wl`bP3#l?wQ0<(UOS9lr-4|KXGSQ)IU0Q%SJ^`)6wP z%zgB0UYv>pp>p;znXZXH=d0~`jKCBc5b1<BVw<ear@fWXxO?`qpFve5P3djoLez4n zA%1oLLTAQ<cqbzgHzJFAqE!w2Eepsw0uqr=hE`cq%Oc@eBr(yEs2Qmjcr)fXEQu{a z<Zv2!y41pEf=5H@X{JID6tBLILF4SdtkNnm=;7{mF%##W8VgC^S+C>G4UO?i^n=dJ z=mbmf{z8zD3HUK7B&D{a5Qz29;eZw*m;*zemm-#CCHpmuBSA*yuneJ_1D$WgfhG>? z?MTCKf7sp0_X&21`L|Smc6rFgje86&Bk=5wF%_g^e^6p-iRAB6MhIW508Nzl8MZ<I zA@^>LgD}RX-9n&30As<E6HYZar)ot?a|<yRClWwBg(Ds)SgFGGv8Ol<B{UOYRB&|O zw-vPC;!H!#L<&lDA#m}TX8Su?J{vLNkbjVDZ4>Ifyf+lLlG*(QuGY}^%ac+|F~-7t z$|E(+k1NG*aSMDi@0Au6iy~I3BXT$_Vof2!R?Dj)2x-@0dx#*(pz*it=Ej4SkQQk8 z;g5fIHl(HwZJbC3=HM#%qe#-aDM}J@Z-m%cU=xFNqfjAW*0CCOQiwjKx&z4b^_-fx z)_!XtsHy;SNfI?s^v_to3PfM~OoWDg;-2Xf4N?B=>7n?M!zAsCu%=^;#@%ApGs={l zx-g|hI7}E&R_!(BH4Mxbb`M7In7KP0RxkqMJT{9+7Rot^LSnXB&wc~MX*DnrLR7^T z+Q!(Bbgk_S%%N_gZ0rtzc8Mxiv1oR5P6z^UpTo$ANrJV0k2Jya-EQLxJh2!3O|t!g z8_@MeE_nDLEiqNJAj5(lR$5AdJX^*dHR9<>5NQ_$<BwA5QJ%<J8mCHJ)0$K<h^U{; zRFW*e-@I}z85ve}&@mgp_ww>h3(ES&K_VHTB*|nXYNElBB-v!83if2u4ZcZ|amdx+ zI<vY8<ENS(P*tHuy%1~E7{F=N@DEUiLKKu6Qi}l;gqEjED}6thzl_g~(1Xt?&<Uhg zLL5?IgrVOHo2DnbV}s+j^2<dM=uO|SSso-ecb=7OSnVSk3kKU4bkL@kQ#`c+|9!gb zn804&9XBNthPJ9sJa28>fGRW_@CNFk+`2)DaY{XB&hs??9wUBOM<3(<wLE^_tJQEA zn}e=DM`V;A@HEW<7MI^=3OL#(1DY{twS`C6zFaW(GW2qiuL$5nVU+2qA)d-x8*NmF zB8|<Vxs&mfqbUVX=f<c%1SUN*q@w7b9HkX`SM2liaYu<5B^>5MFDPX~wKc=ez3!2@ zg9ncv`CTjjg-XdFS%+gWvNW})TPzRs^xEMyPC9z8!Xdm3MLdO>dj<dV!aU~{7EO2_ z&3oC^#K8$Y=))&>gkhq1K_@0?a4GSRAIUzO`)RSq!3I4fK!+N%-7kJakq5qPkNUhI zs3oNG6A}Xchn!g==qV6)9~Z0>C6sA&XN(|qI&dUp8-gNI)kPq$r9|?A@0Y*GYeTUr z2;oa#15-QYZbXaB-`(w0j&4FuwAOMqVi(`U(H!MevZ6xYef#y~>EGYKdG_YjtC#O5 zZ(h9koPK)ETgigBb_AC<Ubw>)x`dF;fXLwjEJ(?sCZ`y=Ci(OdvOToQ?WkB@Qk4%J zqmb}|qOSC4D1Hi1w5{P)j9*}>(@^)t$qu)mXA8OkW?SOY)G~moEM56ev#Gy7%%4%6 zv5*U>9QO?<@`4pZAX0A<bzrgaj|achC{$8|eS`C#j?-nRsv1&NaxK@|4H|Pe%YsdQ zK(PR=ooRpZyz$S!WAZAcwF+m<152oI%6n6>bA*(F)>sy*4R7i6yMSg@2OFWobs|L` zR86LQHN}~SFn0kf9d%F6O5>{@S&!S=oF{v*KslGhkSnJl2?9jf7*#R#->MgLo1i#j zx055(&Hz1lxQdo@8stp$>+j^8D1=I{HRE%gv2uyWj4KuyJQP2^#mbH4lh<4fg{|3B z^9ILXg0f0Igj%EA134oVhr@45G6ww7^z$J7;Du8ySk1`KBs<wuPu=55q6qaE`(}$i ziE=GM)K0~#xc5no;eLL_<&ou?T`SCEQm~Q7nhX&!>9dge;^r`ha}fC%&H1b|(eYgP zFsRHqgY)Hex0rj&J)OnPu3Ox!C+5KsbumE&br<C4)!4VX5*d+i4zsFh>xX=`Hf1(o zA`t#{Adpf3MEMi(jnP~d*i^<-KkI-3H;R!@=avf``g15nq#gn4>6r>qjW$8A0Du^B znQ+zE;J%TY81z9g=QWX(kic(Mv{bGrDsB|tIB3KGf26U{X!vdE`j>JL=|>sXB1KNO z+BVSoB_oD%38K(<eE^M~!x09r@D#^yJzyOf#%*}h+wL|qyq`lih|dp*jjy1HM@sL6 zkw~G6b{9AGt042)+lqq31m+y5{pQwG*XRhBSR!3%M3+=GNqn2ky(9ovs!9oxH7c!2 zh|PG4#(QqHDoQ;Of2rha8pKqXSJEkA6ggUrT0GUD)&Cn@xrmimkVq5X^l+wiYCs&} z^$Me-EDId#j`gWsw2Z?MS}RUuq?;L@rXe08l7+IEus}EM@uR}T><b%Ojbx;OaaWaS zW)*n_!pbVEJ~F`adXIjoulMS3Lfdb>x>wejnv58)F#h>0WwG$w`j3r<iiss3gSv`8 z__U5gBeYM81shyB9y{Q)`5Xm1{8ow%Q8;umhd^Ktg6<P+SA}s30$%7<g0YMc`;r<2 z*FzVh4M(Tas4BzUhl;Ld5kPs7(*r3##Ya2HThr5_d@Y7mYlhtvU*UY!<yYnDPkcA& z2((YI>htA&k|k~|3$+Yd#5<0~AL|bkRh}dbdbG=7%)K%WRPs&Yzz}v0lgy42CoMRW zF@bmO=^-xrRmr8vVigLwsz`gZw*74g#p6cH{7tG@Ik25^s^8zQZOtk&zB=c4Ac<-> zAs38S9G#|AUUN#cA$^a{6waZNgHSCJRtJQyk+lG(6vg*qbDASitc$#N(%!;MUan)} z7A*xz#Mzz0Uy_3ll+wEL7L~r^Lis+BY2=r%MAC0V;Kkodo*<U`tu%zxX+KmSSTIKG zMYl9<WF62#pprEXym!c!?L_@ch}6i!@hn_ga<q{HH-2LUo;rN`Rk~eL(HLJJ(uqng zF6V_}4#zFZSR~^?P@tl=Olmr~Xeg(ZOYlh+1lGOc<NS)8w*4sMfl<$H=L@YU9eg@! zLF01`#MGMdi=84<wjWg8aXg$X2JCH^$DISU_`cpSvB5@|IsU=)YUsHRrCkQ-!2$|h zP0`BKzJXZ1y6j4hyX8CLrdu>FipL_c-dK>pb~M-BN1^2ji8++%!R-~4=@ENL1agfQ z^t1W3g*Yebq^n)pQ4N)WgXesZ{(;A>hXS9q?(tpPN_FQ%BxZxOPs~7)P4O6vu2^!W zJ<2wY6mpIOih|uVpfLibsILJ6?0EalIxaYA@;Aw5o#_-QwU6g^x|`kN0Z-j&A5euY z=11y<--}m5{QS82WQg4rqm=@KKs?{9IKGBc_MQ%f_;*~{pFIvw95HrW0Yjk;Cl3#n zNDs(sK4G|n<>G@LfH@m~G8|}vS$<UPVj70l^az9H97k2KL4m7nXPW{>nj-Q1)uffF z$dWYLl6SUx*uZ4lJFilWxo}Krz?>7?upHndxzxxOKQ~?+P+p#%;~55ZQkRQ$%Uoay z`gv+E5*X8nRvHF^O1!rjg$1H2x%2K*n<*{kpLz@vnMlTUb&uec-pg#7G8kv}z9w`| zF&#Z|B3K4&WPCt&m?`QI;OxW91%dBpy9KJQ!YAePGD>CAOCfD6CNls~yV{8C*|KTj zxSl6ZX%)w$(IP>_+bw+qAp)c*Vf5rj1xfP4wu4k|vE9@tvdxk&=6SzJZ&8&Z_D?6# z{|O^<B;TK+b-NQU4eKNa;Ep<oi~+P+VbdjL8c)hj13NUf@#QM|BFS;u(J}^zmU%VC z`4x3zpF;`739zO+%38-ewETUP^EUwzQ0$Q&LoOs)9ek=}%!dWne|o464-wJTa3eHT zg`A)X$40zFB)sg`qn)liU@sMLU2=OSd1IlfL%cYo!Hlkwg)-tLsFY$bHLJ-rJ@4*n zp;{+3L)^|{5a$^@9A<H>uu>-uns6RXoL^{*bI0AyW*6N8o6pw$sEyziD;F6IXt^i8 zSs1?g_uT+f?6#ZU-0ZrW;6EsibV7;5Q+_>!ZJ@h4-b|>rDpr~Pt$RM3#ct+bD$EO^ z>oL@eqGuTDk11jDL_c#6PcHa>U%93<^FO)x;g1*i@AD6T{OT`1{P8g*V4qyDv7oG* z(E8*;{{IV~*mYZcI%fO<+a(gT$w*?_u?2&NuTu{6%JEoiKO=KGnIHXC7sZ3zF%Hs_ z9>vhT?5OB!>}X^Qh-fpv;YsDKFDenYfa&P-nb_ms$^CvehsG_L)#5J#IHykI-)A^R z?7jrUnj@@Rfln8afGKj_!V>n)HSP%jXh^J^RvW*@2(9|iBIBX{UdJ(~Hm1;B5`e;n zefrval^G|NF~d@gFVx*jmOmZgpX~4V%gxP1PdsZB&pH(Ds9Bn{PP%suac#hsy%jD) zRvE;rN3}s1%^LAwzotwIYW2;NL((1QEc8&QYaTl3*2p-S#{_6}W1|8op)^M7Zoc06 z7bJasuApC2Z>!%^6_k-WK^D+r6HWa(Os+XV@e<Ld*E7^!ac1aMnzSV+w_<QIGyLWE zYRrg3w}n+zkXSj1E6+|l0|w??8^D{Lt|A(88gYn9U6YI$fSUI<9ql<BEkXhXcc|p; z%5VEYMToG=@5IF3*Pjhb@Tpu6Gb}IYQ6&eYLn~<xMx5Oc2`02gmj^7wXmT0G5IyFn z6xde=tGwr<BA24F@ZAC#ek|qhgHn+UmQV4>azl`{5m}r^ae?_LTp~~#1v>YPMK5S( z4-r9a816!zcU12$>HIf@(03;**$X9wc*ZUKVRLEAq&Rn7X&#rS&+xIuXJ7eR)YJF4 zF64|zO}gCjTexzQoe1;C9&Z*cKCx2zse}uAcDq>4k>zkbzN5-1d&~=2mpvpuYbN>m zCxr3kw~w+8SsE`88@&t_EiboA{{@4w9*)(q<r1r?5W@NEZsQ+W=-0)|HSM2=ltdlp z_gK}vhfDV55C>KCs#&~m?$%Laq)x?KIsg!b@BM8bP6yQU7#*NI%}N81ejU8Sw#gX2 zF2gy6e#Gyol3|Om7JJy8Yw1(U1ye-3jm}T~?VjVFN_5%3zc~$#rvAwan;Jr>b5m=e zzx#jUspZDTlzM0pso4qf;b%dj6wDarou7Df^&{PAvXM&gl33~@YMd>PbJ~Y?TdT|; zc@_yvdnUFpHSD@{da8^i6W-`7hG+(1xa=bL7$Kq);_ew;{BvSc45NG?@X$y;8xPhM zei7zPV!n`@V3ArOOA>AzaV)!!-BMz25x~dpE9D+nW<H>hc8666P6wzpbKD&QhXf_b zo8b<d1D0ds0ja;yP<*oo-IB%6L$XBJmzY*#bu}yGj%5DBVSj{fw6%ah(#!z!FOmS^ z%evH)7xH>P!2*?E%Pt&0%CmUI1CT(1X>796b*^$r;0bRq1A0U46a5r#z~l2B?!(-2 zQq6?a4!ImtaW)^)DdwtMxi?QRu`Ipw^E!6L=RVKp2YFymddJt@^o~b<FzwB1GT+RO zlx@QTXF2`!`mb0XV-V2VlXPjFDKOO3+l%MZDz%qAN+DwmBsOA^xL0nKmV}H9o=96x zZ~PL9M@|pEM&1U|esZ4H(dU$67E|6bLCj)B4+Y`U+zLl&f>6GD^Xj=gDjOUDhg}fQ zCAa<WSKqr9GW>w+6S;~>M~RTII3t7TK5diTW|N9QSFb6cLp$UJDfx`EDL9SCa*M1& z@Y@8ggZ-XPbUt)HO3cJpG0-uG4I0G!#!}GraknrZRMkSU$F#lOdf%mUi^Tez%zgf8 z)^VzYmryAApq3tH<3c+=Y;*LfEuE`y3~oQYNsp7#X&@eM&MN2}!eVojk@{~>-rpjt zPCoYEKmXg4@8Zt>y+&!zVlBo%Y*lJyqz!4cREY8m&1kN6mTr7|LOZW-5Qk|?9Ra0g zuS9TdINv(?xz=8OpA*cc2w;H+6wL6mZ}7XnavGZhsTy%l_m{N=`I}cyk<95^_2=^w zxroR#xpT#|*uRYOosKf<W^qN&wp>&eHJg=bgZPW44O{?`C_zUryB<tbv7?8+EG*q? z!I{qiGAw#)d~aSoqx8|GTtw;<jbKPf0XUv<#EF=0_Z`q&TuiqJxvBQ2zRRwIoO($a z$)M$MZ~<BhnGn4523hO^|C*2@r}$ftHPPmdmbT!Fh=a#%!jJNNq8QVI(-cs&2|x<% z3~DjU0lj(koeN`nVda5p3r#bb%c9%QZj1z^axBZ6t+Vr}!Xy+(zsn@fTUE(m976i~ zvK=i)_3=aqR`l-KyshVF-#vZ*)Qy}<*S3k_tZWdexSokR9cnUg_n~T1DF*%f#cq1T zTf*XBfGYc?B3%uf1Ta-t6nK?%21;uVR4G6f8M)v?=WtcESng|_BFB(}I~IrgcO5<R zj=hA6exJv!jEdV#=q+7<-S4pp^^y)EBQ~N{e_7bYwx&mHZc_R%cxY!P4FmH%R-hc& zdi$U+6sK0EpkP28uQ=U&d+%pMn3yU|-{<HgN=JqukeFE=IB;<LZ|~nvZ(fIUc0frq zY6Lwb;1VWpTm@WZOTv+z>2jzmS((HF<i8+5`K_C;DMke2u4j_%yzAsGP``A*k6~Eg zd4OnA2Sj20h_80j(ua#FroX*^^}RDJ4KGT|z-C+~m{ojdP=_VjLlC#73eZa=a8-&9 zX;_t5vFKulRAqBt$`9SP;yju$ScsdmHS=zs{*>9W%Lx3#B?J-%3(^|Ga4GA48Kg>O zro{{k9ny52!#u=eko^@XXt5?jXRJwLlz^2Con6ioHT5Dvgu&R*5Mf0e!D@zyXyS~k z8no++WJqZfX16%<BoCt)+w?b#6;mpwn5;!*0_x4J)F{?Kp&AAz-GufM_y>)sd6q&Q zJTKwGP1-}bxS;!thedK3j(bX5LdaBD49Q$X%YLtn`zp3)&n@G{#nR<wND%YE4=2%( zaKvIOrgeL~S}tZdxaXSop~Zn2)CDWI_48v@)UbnO;=vcFK3<OE8{*i)9Pg%4o}VXE zU6969=Uq7cmVqZciMbfTtU}3|B&3$`xBy^3xw@YmrZ+}6KE*nWC0#=}`8QGEVaek= zNx(_b=Qb811U8tkC`JboR@k8jUCqP{o`u|XbXsI(smu^rS&(pTkajxBw^Q7(Oe|OZ z%7CQ+)Qi$-`UFVNmW4f?A348&DoX-=B3B8p834)}PQUZ;mKc?~ku0ilR4EcQQAI&I zIbAxG1xvMUb6tfYic!xF(FACz<B6~)4veJ$9Mr3g%?mhEvDe*38%-Xc(S*TiD592` zCcssM!5iwSI8>FIuB)rEmLzH8`{mrz?S`f8(dZHAPz;yXifmp5ofuq3ii$54;Yft- z0x2yKhdPU=KN~|}xWzez5%GbO(M#GOqjV3)G*$RYYstoF&=Y1!{{_5R>#(5*eu~T^ z`E8D4%~}Z=hN>7T2viGCX^*MlmOe)j!4GsTVcS9qZHFmUBDDB(MJ||8ULa3}a%#zZ za_zo`tOjVoJyJf<7Ct((ui+!-WUjBKTco}=N96Z~qqsJo3M6iiqy~S$F%!K_>z7$h zFJ=rCyR<00+end&_Tn*_i!ym~>klIFYo*PKM1gGslssAM?2*VfOVehXn#`w1#XAr< z$AA-z!Ft(2kc7IsH3fe%%kfv0k`ThseEe}d@UuVvkJk<=m{|7-hl%LyBo79iD(~=w zGu^16VJhoK{e?GTxowDw_Y>i{v*#2dx~c1UIZe}LvNFJzUxyl;3to3DTt8S<0mY;j z{pdG7U)zg_5tC%PX!({-4hiBXvFj8(Hul@QhIS6|tys<USG|>NB7NK86$%~q@LUAL z;Ye;xkTLe$*J!{x)W#7XIOx}1Pf=cgMhy=&OC?#UevfTGL2`*!Oo_-s4T$=#+V^6A zdEC-Dig?2ieU5Zv=;Y#Jx!HU;Zao)&fA=!c3-E@~T2z*xz~(faQxHbN*lCf2&-poM zo9iR#TwF-lS{c)E*vsOK#O${HD$oUY0+#!6(%PuW^MiP4+w4x?yee)IR6_t~YG%s7 zmtsV{SyeD|ekal!i?7<=?Na0rZ(h-!Lm#PG?!zfc;1+wgDt$(WG}niJ-a>5I;7UM3 zqnGO#+>Xcyh>N)K_K5I+5l(-F1ZccfOR)3J3g?w3Fcvy4<}jPg61kFcz~CV19IHKZ zmB5x0xzRNo^nijn8!7t}(pwh)%7+vQdW^@|LPlU#wlaOYo*@@pYxk}-WZOt4amPlI zpY}_7ChmUO?Qc7u1_asvjUO(<ci=$N$<^`NFi^)6Yp0Bh6ez)ihMyd%DLXM?iO$Lx zNqary#S-+9)0<cSP4i&ic&U&IgLR<E`8R)cj1IxkuB0454(`|;g`)|ECpQ~4>ShZ4 z=q}LNIoI`AIT05I&zI|33G}m-9pNyPFi!=B`{y6WlOle5yM5uVMr%BwYf(rO2ZCmD zzc$>r%MAA7Vk;ZMWgkIKq@Yx>a(Y1<Z$;P$5kKIqbUE3_KSm)ax+2qK8zn~hN5?yR zymUCxOiD$O_yVsr?I18vSSGOGq8j=LE@`L>M)v0Y>*w$LMg-2ucdM)Aec>7=@8*@h z!=AT#I#Ea8d~;YMTV-}==@*E*rvsWOY4yu}SXl#%&N>!4!BzteQD+SP-l@AOP0t}r zcc0mrf7Tm%=JekFhi51}tp~ei%MKT;#SMoLDQUCW>h+87>@TtwwO=kSFx{@U2W=jP zdfe);dAi%-O;_nR%sW8;T?c2-r!1cC#hlHM@qj3XMz56V)S*LdHpTq_oZKLfs_F{8 zVV7#D)C34uo*NJl>5{Lius!*{JW}B!$6J%GW0D*vN+76P&`6zcy<<P8&Lk>XE4j*q zD#N4h&mednFaoi6rjEsZCYvRm>3%=kWJLhD*sY6cKTG&Hv7{YaCa?56mU7k@$y0Gj zprY1f5!Tlp@WaBao2--NkDJ16{+ndOEw+pw_nY-4-mK?S2R&wPYQ~ksv6^b(C9h_q z8M5VyVpbgv{S=fcgNFc1-J!a!gDL(RiWBM>85ZsiFAex(Qi8R{0V^9DzEinhQ6fQ> zY!QtNMOCAUCW6Dw$hfH_tb=p9bq&;ty_jQl?r0-8!h&x3Bb5axcOCYjRa%iL13~Xd z+21a%bu5%bvB!3^Qsk*lg@M0uaR|?k@F0GYJ1A4=MX8iBL39tgZ{!o8&lTAI8^PnZ zgfL^e2g<!)8lECh`N_yg$?q}AzfJeI<i&BafYQ;a+eJB)Y+wWsWREnv6sd#rwG%2v zf><QK#88{97;M~JB_JbbDh8_0Q}S~q29O`4sRo~PqH(_tO*7ogJ_)=3fsnv5SNI<W zEsTdgxB<t_(>cij^v*~Q5ar;5+j~331zU?aOfTLQxvEzF@42Ml*!FWp!wUY(-$m8= zIznN)L+gJO&hMAUJu`q2O8&~<g>k~^l~#TJVw8hZ5w`*lIv&vHC8lA^$cOQMLa?T8 z0$(|{;8J8&AH%R_Y6L}@Dp$ZHVONlm8VH$HIx#ZNWLk98$QaGWK0|C_LXlt)ozl5q zE1m68ZBCs~WD!takH!J~bg8kt!uL`1Kr<?HSDsH(>idU8eTsEm@C<AwSdzLGA3q%7 zRmqBm$clHJ*;QOzBy%4j1VlQ$R%Sk?>O^}!!<_f^8ILLIneX^_lr#26z=OrFz<Sw- zIur78y`*(jYPp{_Ch|u&Rkuu9>06Y+WQ@mDi#MN~!Ua#fd|{18zYn@BLDM6$x4Xp# z<pu8l=dtTqO=_oc<8iZc(o=n^O&eAw-LzRW{YF3PAc{T??;yaJ#{AajkEG$ST4Kc8 zuG6v+(M+14t*koIR{829@v7uB904>YOt71v>am-Cdr`YCEX*C?INNbRb(_%!6<g7t zBOBq5Y8$@AP?+W#)@{Kx7_<S`uBLnaxxCWUUvpjeg!K-nN2}`laG+pRcF4eu47&ql zUAd;s=sZw>O=D&Kg~KecTTS6;!;6ddERKZ<k#;n=Lz6<V9Zk{B`v!n>^Em<2n2b$; zG7%>SVi|!n+vXE0yh2~#8Sp33r~W{issw!61RDV50b?4B8Z!azfx=0P&{U)L%c_3O z*JDVFHw`59H+6RUH#Q{3<ZA-hsVN(S!DJ*V!y*Y@6?Q}fs~`x3L!Dk-It=7rVpyBO z(O=kc^smpfDF~=XwV~1IL=BdoeZi&-mOQv*u<-PbN~CA%5Qvd;0-e&(-30LlCe&bz zwY0zdc!IO1E~7~vn1a>wuR{|&_Z{b92nl@89{-ayM2a<^TjcU*|Fi;fs%d_vqIqHf zrb0qwknDO8!`+XY96-Zh%)@BS?2(Loph#wpMlog+2E$e73iR_}-kfn6N8UP^`aC(~ z%$;~_$(eg(o}=jlHd|TSvm#D$iXbgr+dDHG^rr;c=LPY5Z)l3&leN9;d0!ou(Xzd_ z^#L1rC%IAq92qVPP>*wT4Jyl-OZRi^>FA^Pb=qRk+eyP7PaqA3hqkn<EoU6bwdl+N zj|<HNsK;jhf&6fPmD<`2sgUFJ>Y+w1f)uW95WYplBK+^8=ga_Ucgp3fT2p8<WKP;L zoe&*9vjX6#B+Wes@Ye0}08v?HX@kbORGXi>#PWEm$2_#fm|51t4DFh0!`fV{zem%p zeB`j!1uhis)O3{0xdFH`?P`}57vO&$<pUJzfu{3-&dlh&OS1q`+dofQnEbx{k`A&_ zOEN`HQ=o*{8h@mL0BeQx8O2;4zP23m4dPvNM>@uH+D|3m@OVZq#4My;h6NG^A`g$C z9(-t%hPh<i8m*hobTeEIZ$V;z*x@B1JopJ+gach2-bBPx9XRBsXBB9zgx2>scE-L^ z*G|5r--j%<1mvna+-~H;mWM?}{j1|%k3{LAH|hta!*I?FG&yX@5c_WNvnFn0w@q+3 zmd781U3KVXHpLc7x?8vFexe?Hx0E;H#<w^T?d;e82;50MT703C(+^1G?dDFa1@-rP zl$(@JHh6W%%H~{AnMVLD74k}g_de(La>NUSdgsk{({U|qma2F4BzviH={Q#Plk9D) ziuUKn?bii;CLCSQzb1SS#UV~Gp^Pl<!)Wf&AF3o9yG}wmD}scs#K_|N2oR09xQ8>t z>siJA`{_E<Akb^s`jcM2r0HLi{g~(7dz5l6x907V{$7k;M_T<g_3`mqPeFXSZtmB5 z38udf>!g&IRtJ8ayu8xWlME2s*}2L(9>QxKJssnIwv_tzN4r<qmorJhvH@j|$+6(n zS~pb(8c%lAh$8LE!+Eu7?`Ef-%JQg+s=8WtlwT)LU@_0AYxqaF?Nkf5)k8*kx=wM} z9{IVmB;-unldGgx(R4&9ym?fL$<^<8yG^&jtw8c9fG&dNU(eL^vf?3%9Vts-aZq2e zt*kzvpnqX*%)3dZp)=WAeZbA4Q~I6b`D$3w!-R!vKRHJlJ}=f>Q^{O<hb-P?pjm&7 zF+10Amsn6+!w)~HqmI5GZV9CHQ{iPV3Y>GrMWx`;B3Gml=t%R~;z~+^PolY?++-@x z0+%ebfsvg~8xb+RZK5RWI3w*$b0=C_2U@DHkwQrPG4<T+$<FR-$>t}99}TJOb&zwr zqAP9%6U)v2i+JbVs#Tk38jg8Q#>z7pNtyl1i+N`3oK41hjwEVH;+x}Pl8}SfVUsTz zf#(mf#Lkg&nyjXuP@T_Hslmruov52P)afb+-KE6MI(1~tVDNo-CdB(~569nXeG!le zCp{1jk8jp+^neS`Ptu&hR6?Q+RHh<9{NFT0Mvlcef~c=D^09bcNB65{NA^VqePv~M z?$E;WiErOdc2m3yR8ZK^SXy7*qcnmU?1dS`E{AlEZ(Vy4-;K-2bGqqS;pLVj4#jqN zrW){^duzOZZck?TTc4gY`710a?Te(An8fDbS;)SegQ1mFxSr-h@dwoiUq(h%EcdQw z{Lp6bKS?vX03oqQwMprvxdco3rMILJ_Ah+R*pS#;&u;07=BwT217*+g06pFf(IM?K z?(#Fq(@UJEqy!oT1}5DnRF~1{U+*my;Gq%Jpff5eAf)HdoOpULRRAY*kdr|3rvWY~ z7eVc0fh@`qD+)y-%KR`C-LO~3R-la2Ayfy&QPzODfW;&LR3VPILgOVA!W^kqSgqe+ z5a6|T+>QU&5?-9@;p$uOsLSwiF^4%&#F~918_7OWq~$*TV%|V2$f-aeq7Pg_7aE;d z60Tq@1yn62q`0?ts9X^Yq7^^!#c_LZB?Sg3;7LuU$6!HsW-9pRHyEAIs&us3K{a8q z-rr9=#L$U{E;Gb*Q7yc~X0pZozzs@WJC$hM$5OOo2w3lcwlb70#=WcQB7^E2g#1Y0 z(BN($tmg1CCap4<rJ;d5i~*HV5G2PkQEg_>4ZQqxT;Sov6D0%u`{T_Gh9TWE=P1SO ztvWx?jAIvU*I^ZbXC`M{<g>v(RtpaH!eorc9sBIXk>W7>X{cE$n#z$$6}-7E<LNy% zj(O5yoS$(Kn{L3ea#2Oc_2<F^L^qhu*M?3Kl05AdMi0ILGLsm-sf--fz<d$06=;M# z>rts)JS@43FG=rnn)3K~VCkv8@N4C6`}q&_aToF|pYN^y7@uo`F<y9CFZ}o-<QJTl zNH^j4@AFsm!jILr^Fk98CFB<eoub2wdE6va+6fT9o7eFYlIm~bbz~V6KF7{mK#o_Q z9K_P;ck;I8DAp4RTqxF}bK8%deP~!>qLIf~BXOHw+$bk(%Z(0o^|uZ|Jl5UE33X%F zZJ0C;i#69a=FeedqYU3}I-v|M=1%)t-~{6wCwRjA?VJrQ|3wu12(j<Z8`SWFmn`zQ z*;&JBPZdpYv(?iASEuoi<qe-n$m@-5h+<~d$1-C=&7h2k9~hmcZO<@`TlI|BxM6MJ z#;y8CaNM?kDEqd_nD*bfHtnTTi1GU+^ME*hUv41gf@$mV2dFBxrK*akgN3QuuD@ur z$W7nI-C{YS0JD`&{9#DqY};yz!?0maWtn}vxS;!r*!N1MiC<6)%@_Ek@u?6f-PX<d z+4*k;R##NE(RJ6&FBf=RBn_PR_=pp9Af(*<Iqi~L_Xl>%FsLhvG()(hZ}F`+cMeBL z%035A`2P2;IUVO6Ed5BYSyLrwJSx@085T`=Y1&e#g4rGQ6qp9}`LjgS&why)$1DP3 zv6M#U#s|OGsaSE~#yc79d#~k$dnn%@_q4@ndsc9h+KL56&hJ{YGe%m^=za3On+}?+ zBu&%5xttpqO^$lu3(|62J0Ri7^&pk!FCm4kKep)tR>0a`g0=fT!l$ScGj5)L<dVXD zoNS{*dzji#js#5Uq-jYwkx`UL$AvTO_#L_$qrVanSi@WMAno*UFV^#%{6U`pH-}qP zyo1Pcy|K<ulA7zaBsCo;U$Wm^P-$<GaQ1h}ke6TK>iPsnFW-^e*e8BVe?TEghWG9k zn?-0t-j4>v75!l)in)TNY*MS_V!7DA)3us1c>!z-a&zkjw0Y#vTY=sKspk2bU~q)k z(q$xtUvd)S-?QG#&nA&-JQ*{GXu%g`f5iu$by5rKf7SwShDWDFl%r_t#`GENL|e8h z)w@I1YBo@+YDJH4wJe9k4cfE%KsA?`%uI6Vw@B*<6QhaSM*uRj*RaNO{5VS{yHykG z@1=$Ij?d|Zd(A37{!X&fv?+}@>RN}41|WifWH(7o4iMqj2p1_M{AAA`yOAA!jNpJV zk1|4AMs$U#MUTWq+)Px#o}~gA*vrsKVE}ko9$4VHv0dv?jTBkI5#6pG7`<NToMFPr zu4_k_faYVE<(sM@2tE46AUj^;8Do|?oer>04wAb%3+a5Z=Ljnv@jW<8auWKG>POMW zcIxVwuIGkNot4Wp$*fi~3L&a6kP3)0Sr_aLqDK5jXK<6DOee0yKlp?x@3JP}I6skm z%bl?^1|i<tbgR}CpkT{_k!W=q3Nda$AYhh);mID4@m7(6DxBPP)t6%fD%#|i6O{9& z%~nH{@TnZQU}X<1v)a<{nQh!5+{Qb_yARFXu{6B7qod{Kju4oxZx=VW_EX*~l1XiY zixfwggMz&(eQXfWCs7lK%XJr87lu<`^TIF+xYSsU7^8WDc<=)obZL8)TELVKkDMqV zNFv}&E8dpTu^-B{A<D6XIr-j8dVRJRG~<*YFhRD|wXYyAiCPXtq+L1gEDC6d%tkp| zIX0{)zD2;(x0;z<%R=NiG4*V-zFyq8oD%*PV9a9J7V>u;<0xI46rvH!ZnA6<nAF<I z;+P8g8Nt7MQci<@jpX7+vM|WpZUbMGj6|UL=K8zo{WIL<^qGtzxi_1`^Cad<Dc<0D z6`vPklTBKr_t$9HWN%~}_H<Cb%%d(GVU+bm5?mSRU6;Zo<Y2p0GhPX`JfBs~CZKWc z@~}K{lO>36890q-<TV=MLK@_-{0!ZToxkzuVsZD9jfI7PaY(}YH1n&J6QW5<rdNmN z4|s?ubMkZ;HaZxXQ8nM;5rc%AzP=@(`+hU~5H?(rq2;8DXJ05w9LE5CsA*&&vWNku zI9R+x1ql*HS=)FrLf0c@La=dSQk9GZ0#1aL3C2O4tnTe`xjd?!hG{nqo+8B-Be7u} z5?F3m$;^gC@9GF|2sy?c$*GHwm`$2Maks(K?DYOp6?BjL;NH*rNm7$Z0TWIM?<67Q zY!=y%DEf$mAy}VpG=bw0=V+9|9%Oi19>*8Owi1ezFBx@OaK9*|<N8D+#mUlOre!;} zr!bv-$||gJ$<nKOKX7+dN&)UcS7%=_Lc`5AoLO<Cka^6mxNAFoyG2d*y`y<KZJ&%W zM=u_h%pZ9$mY~fx>vgEDuA>+(JU#YO1^wH`*OyoD`5G_RTd91v-qSoz*_c~2PY$Z# zD{VC!gSnor7R#`oTj3DGJK%{+f62}tzlr+Rj#KHEk(L+f9m(CVD$0<>HF*nQJ@jE8 z;uMAW1XAQ3=}S4<6OFnuO#ph%sREra3d1kpf4L52+xe^W(pB7Vj)yT2WbC=GNS3{( zV@DZ*oj6}O3<##5xy7@FkDBU`0Z67-7=P*KPKIClS=TMj0hYxD8s3h~`3lp42Z~P- zpePGE+FWdnQ&A8v7?FS#gGzr87wCVf()UkYZ965YjF@e2{XpEdre?xp9`;K%;MfQ% z^z4^71%c(iYn);uUs4?BM{Ex7miH7#f#nj|?7&as@K2ZfCDu6yoQENVbm7KN$oRX> zXYBXOzrw;6TkN5|Twm*>y#3~2U|xs&cFi#Vz`32UuigNLM@bKxnV<HDAl`NB4vU-x z$wM4XDGFo}Vz+$1yyW?Atgd91Bt7{s<e`;g=YJhB{Xwc@iUCLa9a%J2!v$~a+HOi> zjaIEnq!jfb*`&HsSUNJk*mcRmSmDhp#gW%nXgH)-(@)>I<@`%}Wd#Sjt+Fuy_}ZWT z1X5hsLZ8WB(#aI-7*=$dPQ9FK?pbz0Kvg!i0Zp3%?$t1$WcG5Lh*)SC?ZE^Fp)L?q z77H$skjl{$1mH^>Y^&qLQ>C<wE2zMO@_E1<I46+buMZ@u6OUBmvC?yi6jy00<%5DJ zmUopETxHyM@4EeF`H>Xu)T!{%7AWMcr{sEBgrU6Q$TdMG&e4DZVd-iBk0;L>u!*={ z<7vp0zcqhL4d-u%!*;aQz>jeFoO*e$8NoW8&2WY);VgAaDGZql+1b<OVw$pm%S-rH zFd6CZ3RTpSF-E~Q?i&~w2+{_`N%!(X&B+u%0Z&oh`L1(rM;TC~7r*02b<#PYHIz!& z$nV(64vaHZ@KlSFL^8na-g>WeFd7})+qawf{Ut@1W)8Dv8Vx^B2LS(uU<y<0cvu&t zHFt<nN((T|<)ck}-m}aaG%84;X^2?*u$<u4ln9eY7XKaDNCNP-^C6sC7;<Vw^6<TC z_7>}E`T;JEuVOhdtAE3cNW+LJBW-FcFl(>7;m@O#zexQk0oks|+-V_QGfCZ&L#H$! zR!-1W<pcD{`AwHkoePMqG#An!qPKa`#U_!0kost$*<KTD4Fc;OJtJ|w>#)|vfq_^s zJNLCTQ6$<c4@b8$B3sEkfU}vt(MYPM(1+k#)$Y+ktKwV|+jUQj1$UXwrHK(ow&1bn z)fg-7sJyUqa#p&v)-(pZry2&J_fsM+b?j$c>bNW!mglOPA~A!UPoA6QrXy0kRLG=+ z{j3!BnLB`OY^^K}xWP;o-sPBIs?a87*2^|J;+#yh3NZ}Td10_vy~!!LlzYkLjPFU{ z;;vZPRqhd;ZgJlO_Jj(bBJBDggb4l)S1rwYg(YFp0~*~Pd32kuP!s0UCF(jbD3N!; z^-~TudkG|b?{FJ2I;stLdeS^YM;{zEG`TunhhWy}s4QRK$+O#|ud$|-0}bIFwjht? zc^s_{^m$1;5!N|0aOY8ekK5l!I`qD&S4{XwT$uV{V$>%U(sd6xZ@OEBHe`Ar6O_Z$ z0#JdhLTb3sDo+C!8lfu_NX5e?$N{Y+tzr^H8tDwgP;4#2exZAcYIF)S-j1}@dNw&w z31mD<dNHO0Bc$E>=GiO-0t#J9jx?1b{rh3DtfKQ`kXDfG_o(A2@&)~C&DuG8kR@PA zjAi(wP68(r(=DK!1nK^Tt_Y*P3%2OHu9}6A9Y7(l6D&pgfnuef;_AQ96JH3Vz8xP> z)tXY9(HF`w;X`7ZuE+iI9X7Y$hRSzlXuR0$zU*xl>7aC5A-@zsEClyV`9$mgA$84y z+0UZ?m#CsuwNe^_Ix^8k>eP%qrhSmiZ3k!Z;T>nhhUsF{$3e2c+C`gZ55gh3FY)*M z<I4?=ykCU?43A{0>+M!_^F3--_lhn$00dUNX?c~PZW$E8$yzptY`drMtL>cTK13o} z<Rzrpstk1T3RlQTqSh!+w0p&mn^dlEcd?7`yDLlqwZFp^K0O!>?(t?K$Wy|9km-DR z1@Pre-!Wg3A`$q@Njb;XiJ+yoiO@0{r|z>=`Zb)V?~)u{s??J_ji}U=1;hZP8iAnE zD(f8F>yN1S^cMD7JQw8%(7F3p8~@Vp5(dPwG%=JFdijQ{!1mm7l?Etkv)G`Hh}YU% z{Xn*IeNFBMGlU=gI_jg352OV;v^Cx7V(s}y+!5!$A5PCmfERD<iY(f0?MmC^K9jqQ z21@hWOXp6suES6Y^7%)sfOt8PC&Ry_e$3HLUFzi*kR7$P3&!#@CC0*zJ0;I{G@7T^ zv=ML3jSm0GtwwKw4`gh$>&$BZebeW_xCs6d_C`m1kIQb7FL};pB#=723FkmfENdEQ z5Fug|_Yr<BM>+aCPaBP{;Md|f4~qtr5-~20rBB6HIYFPJrbOqyYBA(PdN*-Def&JU zThczuwj;li<$SrGa~p{J5-TTP*(aG_%ZCabsG+5f&t^*H$C4=3)Bd_-Vk-XVLIUGY zgvwm(Ewou>?898fi6;4tr-43A{W{ZwBctL{-LEB0J^%PCPh^gkTpz=N5{cs^9;T;y zDl}<jA6G`4;qm|;2^D&=HiNNGZ_;KbT0H<I$Fjvy(&vIB^HFF&puhr-M|{*kQgfNS z(Zy>VV|1PvNb#9QY9`PI6Lu<~fAj8ZLMALaPDy9K`$b?FPoL;ai0;T2>%c`V&MIC- z1A4JJN)fJqd*Vx{{rl&Cd*bU6xzba%*Pg0Vp&1luc3Di$EoxG!HWjrocNn~dMGfjT zrlMw;Ty3SeW`@DZ@26H&#L-ZhC_K96Mu~(gp*U||@d-wabS=*K;#f5g2!Es<pRwzG z+^r{Jw5TF*-|l*{SWO`#s_83(1V4tJ_(wYIW%8CZ5Ezoq4a+4bf#f~|Y<@;8T!5q~ zLJqI&Cu?|_PA;B=xNLvCq8AXS_hR2V;<?Mi?QwOro-UU0&}W)Z4wh5LLQyKX=p{<e zhsReDcg_e!K@jZSVt%+~B1oe0?Y6@$;pkQk8hRP~#?rZ_k^E8!<+HBrg2^?5s8Du# zi~s34OV^=%B;_DX-yC-+Uj#B{xH7@#u)GzlXkIXeVesOyRorb8c`1^h#N5;z=rU}= zQu*a?MAW7-@}8FZQ<PFQrbBAas+QCHPpMp1e|8iNNCq2!beb8JFmUQh=PET8oXvJW z>u!RxFJXZ)g}R9P)93AGkJF+byRV#NMRX9XmtmISg9pA|$YDWeXlq<D<4Lspd9_?k zZl`;F+EcOS_hWEn#l5XHS#5A))o%zX8)%R!m|(QA)jcuB_|iK(5PXV8+d4cG9PwVt zkW7q$EGh-YCp@;2h?PEaT{)2C_+3r+eAvYZ-q4Pc(x}S@j&)~S?XS7ZlnHiKu`O3{ z6$Z5;qk8o6qMMUMFo8rB3eh`+rrRwEicLI`LwxVs$t;z%b^_rb)#ddrT%KVhu4LRp zAzZIv#;8;{#~CZ+E+!b2w77O6R63_?J{D~i&8@5z!;a{**Sb66rl~(qim&d=<f=QM z=GL0Z`Qq4`ZGpn2FsZqFWe-S0lHeL$XA~NH>7lS-D_@dEI$<?|BvEtphM$;O={dF< zjbb9i-^M@DZbh6*J+#M!dZ1E9n-#xzQW*L(zRiD>a*Wala*Yg`Iu=CxTPS4a??S^t zcDoMG{L&!A+=dFb_c$C&?#vlGeROL5bNTbv=JS92$A93sg@gozAmu~5m(ZcWOp%5_ zlnnF?E1!)|u-Pe658~pr7`X*xXRR;JGgDXO_zW5cWpcoN`xG_tb7xzW@dNAG^<Lz< zYHLG0vEQmNq)y71?SgMT#-=P0xLRy#Na7fIu=youS$-#VhcR}<J(kJ!an0w#iHvA@ z%PtTu5+6J41&1q`HNOIk+-&lZr)ff%3=zfV7>_5V)a?MBv>V1}b<sneNK~ceU7i;_ z$UE#d8eY^8rOhX$-UqunZkLN0c~jFe*KVCwtimRUNEaWu@NLkd;Bbal5Gk9rnjHCA zo;US_=Pf~xGjrW`P1i>Rzjs;Z^>BqtEYYa+u~UjSBJ65`x)NB?Ibtfz7C|QVo!KfE z5vYq(O43$ww2|G12y^ifQ&g|^hN$vN@+a9(rpur@nKGOapD$p**!#kpN;ecYkil+r z`8ZDc0o&;s3^<Ul!^)qCnII~h-KrwT(L`}4;f!&#n4_8kVStl60|8>^GfAN6`y3Kz zvJR5H*=>$n73UaHL}*Sy;3kWQFgAy(W+h|Ty5kJbWOZB~7I67~+q==y{AGv}+$3Ug zcjrq&%>maPxfh&1PtU626Gk)56#2|a(*=IV^yyrfi}*3Y41w{4bOLv@?pf2CXSG44 z_5&)(kKxZla}YiT^3~<@Q9Z4({KQEpel=r+f2ZMKgRT~vBN!L9wofDkB=$anI(}OT z@1kw-MBZ$w5mTE@2iVndlq7fBAy$u6Q5Um`Pk*&_tr(UlgbCMsQtu4wt8R_&_vdb> z2gw*XEW3JR9wB|Prls>~%<rdy19SV<y{)ppU0iF>(Z)#u3BApWrSx)sibfRQp<8X~ z5r?Bc|22*t=VsX&C*#>VY!1^UA{}*@W9A=$)%;WYz>~lq?h!BW_(j-Qa5|H9GBkP5 z>GFo&T)0*DIpk-kOu|H@twO3Tl;Hf$;-)xnprRZ~cI9gzM@4=4gA-$jC=GfMoS&J{ zHvw~&DE-JeBLC4(d*0*bXa~s&PV@v|oT|l>qihJyBk7@!Fn6XIG`uv7vJtp)-mVL( znjwm#IouB~3PID)UM6rhD67jE+P<t`A?0aMU~8SY^YKK^U9Jp#NkfWuurNg@rkP36 zztd7(DZ!9@>P8xQ&i2#nj6v$c0o|4nC0rtCX97xjHUxl@#LbV9k|I-{9x`8JaOHNb z6q-S3$2jOjLE8zeE;2X%hN;(^U=SxKnxardyC{g&h3M5(laTIO84|@$C}Q)&1JKUc z68#lOuXLIS!nFEAH1}qZR6+&%OKB%a&pFA)1QQMK0;0+7Vm|jf%%>3%1X<}rNQ|X= z9-o6<wwiT8Bs5e=wzWQdu4dTs4E6x!M<Pb-Y0C4sPSKtRF1dtQfxfA%avqxBK>^3> zq&DO9G*{TuTxOJ*>_MHh_sWZiPxcFX(D{}?ME~}O+c^7AgH%&h#&$GXZ3qB+q0whL zrItJNLiCx<UY6kd=biN~2HvGJ`@0V5ta3J~q4zq9n#zRg0B7@@qdFA8)^2J^u2Eg) zNYH)ewA2{NdDDgtQ^284;C18FYGWS;uD6R~^0lRp1aPPmL(kx><%JyQb^E%Y)l0Cu zD1+O;OcA=TJDCeBy8;azR^ZX4ENT*0DC5cj<%ZfU&?<&LUR_=yOaC^onS+)&lng?6 z!?$OhL^J&6rg|)c+`a7JQuN$>o&;D;unHpma?Y&*1ZQa_;C?Bu2SANa(<VvY9`WTM zWwH5oCIj4pHa@ix*_v9&g9^_fElE#*s){e9T5X!PhszY8EV|IjXK<TvqIDUe=4DIC z%^u8Uu>LOM)NccF1!zF)v%;-t?b<l9B;|}cHwoiLybRGtZ#j)Th&=@>ccCd=1YM;( zb5Ac-$mWhJx#)3yW=Q(G&r{b8-C3Z1^llo+GusWl6ksczJ*dkX<?r1bp}x!xiR7oM zo0Hi`=0RPX3@;9o_7F@KunOW*j=fL#QA)mwwv>GD!OEn>FeTKY@nPmUn;W0~p=o^M zj#p~V0pA?PvfVfXlU3YsBxUwjfG=J9-J*OR5}PKLh%uTU0PTZ};5hM22x11)OyGS> za8pXB;xNDASGFYdgGYYA*|1@;vgH%3@J1cFGsa@y;im|(J^Snv^M#C5Mt#6icnPS0 z;1v2e`_HFj9RFufc>XzWcU%V|cKJs6aK<Tbu@{^KI`??@gOc{*>Fd|e{CMfR7JJ@M zPW!=0ju$xJ{aTI%$^cToSZMox)7tW%d=SQ&5U)|lcvF-Zz)?f>h-ELdKg@0x(A#>k zzs33ftX3}%kE{Jp%gGcEuFeiP>%ZIFY1+ye5EeQgCJQ8;4~uJ@&*7UFPrT1CD30{9 z!3y_}5<ie2pfT>j;Q=;llqO)T%uGOdwcK1u#oHiewCB$_F-IkCfGV7%N&2Z0>T*_e zx;LSeKSemV)BPUDQ}{)X&=dI?DuQTlp@6bx0?Lfxt)MI1ayo-Cb5ThRqnV}#&DA9; z1JOy-Dp%hbN+d;sPOtGmfGTa<I@p7|6+!xUJq3-hQK<V5pPRXt3m2q;3^l9eY}9i_ ztcp<^N;fJ8?FbD#tSiG<mKU|cQ=^@hoYJ15ADp&Jham?31gR=_VNzY%HG2o`FOy9o z-xR09)#;;Agj+dokjXf&s;`FLBdGLqHG$_VUW-!#V@D#bBR`NZ${m%Q;2a(c)f<k9 z57mA~D?3>KoKKTIm=y)Y_UOS#m(NRtA)~0u>bk=<+VaW9iixt}@<~BP8XKuYw?|1# zN0JXR3+Mv>0*9&1SHug2CJTTVe%y8<1$C-~NSv&8FoqP@y$pt4T2dx3hR3l^Oi!dN zZ#wo)W1SJwJDAaweFiSR6+4DDzLj3m3X|6C4u^Ei*boIE2pL0N-Dm`1s2mWy;Azss zd!q>X*wYJvJ?=l)5#MV;AO|P5qhz;#M#~#;t0&Z%KNC-aAa&{l$8M5!=%f$`T%cq* zQKon0MtUr|T|b#$>9B-={5}7KF7CeM;u!^-M+r-hr)O(9V+P=k8A)Hq@l@8z6yMSw zZ!WaA6^X*BqhPW@g#?r@GkQTzjSv*BY)e~rpw*eEH3qd_3kc7DQrub#K1PQbAmEBh zPw=9MDT`-7K8;upkIz|JFzR}Ed>(4!q<nqdf;oVFn2qOKCu05(it0$jx<ma1ej6nA zeXYZR%yYtlfv<znV%htSiax-<IEzx38##r<q*_VhvnIDF0)k~a9v9O^w(e#oXi~3= zHE)1KWb3$bd*D~7dh6vH1}b$)YtmJyPNE!@)#Dqx9%58F7!%<PP~N&GrvvuBhY-8R zBp{cy-qT4Pf6J~>e)PaGvdbh^6&)UT;~R4N&Gf{RXTKGUanrDLZ$Z5)KF-8HT)%-M zGj+8^J6UZY8J6ll#|8xoXU9&U?oMtx>8z+WT1qUzh57fGwcRy8OX$5n<DFmA<5-jV zW;Xe8`Vo~lc8lzNx@$B-1C$ZL=|dQX#{hi^Kw+|XKj>>CHokFv($*I&OXEsUWlwK7 zG`vOKDYZoQj0nPA)&CGldemWjpe<@jnD+sceJd#)Bvp<*5a&_S`BZ=HXy)g_S*fb3 zh>4Zb1$=xbo1kHl`hUnNUDA32=rT!Wd$Q3*8i{=%5OFxHb){M~!NE{Gws8+@Kr>1n z_jWi;XSZxpGSYnD-76znJ*XCgzUkC_Qhd_(g<2x0Z4IxMj_GPw7TRnFgdW=<sk*!C z)Oph?9NTh{xx3rN>^6E*#!?4A>3Z-X#R+|2J||Ta?IOzajFbQmf(M|FWl*FJ^_%mT ziAk8ojWD41S}MI;esj?g=Qkn<ju#2CFfK03E$-AIG8jQ|r%qhjWpBl&+T|G#L~zKr z;eL?Xu;)fug@Z7|Q9G1ZswN9KM8|0J;Lb-GV{w6jc2Kzc(k~rx*CpZb)t89L5ynO# z+;p@9E6iKNUJMeaNvM=WhN_5=#NV`t+=GM}%ZnHojSp(UcHHr+H$i^#-V{|{C>thG zZPQ~dop?((b_dzy?g}3<aTh%p^&8?2KC0~_)-!0pNV&O@iipndy1=F^UF`WTR#X(s z&@y7UWVpfbRfjh)I^NHBxJgRPlGSVQ-e+*@oHuo#+#Ys(<1rWj{>9fF-4{zk<lkG! zZ~$dlq68;)MknBY^=qmVBCi^lHU1H5<-wAA2rD={xwXixGGGJ^r0FN{#okXKq|m6( zXu50ZRVT<qUEL;ot-G*1xLzK8F-qTAsU2=@;|}o}B}-{@{bq69cT&Nf@gk>&rR?E0 zaUfJ5)fltXMl~NqF?#;infwwJq~%UW941^BD8q{91$jbe3|#Ax{+{666Mmzvt_6;} z5(StKeZ1YwrEV)B@sl)bFhVfHE|=+^{zUIAS;r86Lc-#(S$U3N<@|ZsU58jrKf>pk z60&)hh`Rq~&t7=biU>n16ivp9jM&{n_JC@OW4y1F*gDYrOUF;O$v;`K5`&i;q2us+ zHmQYc<r>vzwxEK`MD&o7J8b^?-AgKX>^Lmxb+!4p=zVC744n*Y)y)?+R0Ef&c(CW^ zD0z9!<IJefVTNL!?ha_?h_IeqG-w(g=Znp^i^IFHyiNq3w0(xe=DJ(j#Y&k1LQFNj zb?b4Eic8qevTGycfI5&3+%+;r5A0ILB3kqnxq62BmppnJ+J5J1TDqoHvA%$F%NGyD z?yWD1{0>Zm9Z=!8LaK4b@hqtwR`0FP5d_m<q_5?yL~+<AO<T0gID0%nK>62h?Tdi) znb~U;-u<uco)J5(L{cnD;qBs6x5R5&n6Dg+_40v;_lrZi^I63A9$DuPsi;2pk^K)G zHESKC+_rVt{XZy(6s)sO1L{marQz(_R@@F+aqn3x_@mefgaS6DL?bod>sumG?Qc%} z{OeB_kEjmzFM{PW*Tg3KkAn?-!LUN95cc<R{cR63@A&4UJHqF507$H{kQGH`83s1r zam#5NePk7bV)cj8w#r~1Rbp0z>miV#CtS|m+|hpg1hwm=sI4_Ks=6;@H4^gmbcuX0 zzzbOh`kKB&h#kWN#uZB{p6)1UL(%-b7mkk$)#D|RCINtds;Yy^>K-hUX$}s;ko?5% z{A_u|MP8agnIP@a5*c=|0hOFSz!%&Yh2a#eM)X58qOfU7V`5;D5Gg7NHbe<p`r>2w zUWo=`+0xKEf-N79VooupmWxGUu)Q-HhA(v*?+~$+q<plW#X9VZwbHgafws*Z-s2ug z8$u^v=em_Pln=As4Av1U$_J$?_h>C!|7m5;tU*5A1GP&d<_8X;SC85}q!CQ22~q;& zFgZ8$h=)CP3p~i<WDq*UW^j_!YQeU-s|m)$@_hrTV09Ec?eB4MZ1obG!1NqM-;yg| zLdJuS6jj1FJMOS0r1QV?N0-|rwS7q^f@*;9W-pS|ey!<;PK)9>IoBFe&e>_i=b}qQ z@47qeIkvP!Zp~8Z_qHNePvl&K-^>DAJP>q4uT@~HONXs`W=4mxMBy=v2n`lIWfgRd z-U*LA=oIyhAA6uoIco2E8#`y?roMSraFp6@XAVq0(+^HcOegi2ALbO2eF&0}fG2>d zUK-ZZ+Sg~l-9_84*a<z{hpEkUN0Ycy_Ik7aiW`2#GdulB-uwP5v8=yXDuYJ6R8$A? zEXBfCqDWO%00L{M0gge|btd!-Cd_++DvZPEA?KEHkNpVt4aAYQ*D)KRn9k^hEhk1F z=cXOS?jZ1<w!`RuiN&%f(c$f-Ah>}#-iil^IH`{Qs1-7bemHq{VS(4Z@2FeNyU~E0 z$705t4{RdFg*j~eKkJMV3u?u4g)4u4?suNphbFGuFg2GuvC&`>vNGpzH1V7lxtXkx z+G(BCHd35$$y9?w0a=q?&PBX{@%(_Q2NB1_9(z!)op&c=pXltB9vTp5mP%@$CeKe1 zDerwc3sd|-aRr;jQy)cR<()YW46GvnNjcYn&PZQ)F6w}x<-q;zNAk5~o47hX-HBiK zPnOAqz*3}>RcX)J;uagdaA|aE%NYttp(n#O$K@Oc9%moCt9Cej!fb+@kL&K^2CJOI zH%yyI=`ZBeLjp;t7T}QD_Yuc6j=-h-nHqgSbx)KTENgxwEMW{085|Nb;j9&qWD&_s zPG9qIWb7_Eu<*$}QiAM}<4g0x(HoV2h6{UFIB7NK3odYf(5vd)&t0{%I(TY^-Y;8q zU|-he!QU6qMw96v@_?Ci!1L=ja3+r#&`tkzG7xnOw4ib|?v5>w?P0s(WqPz7$esLa zyV)!+9*JxpKf<bIh8G~dT20qTiSI5R{qV>6Jrui`{qV=nKj50<yu(j({)3Rw_s4+7 zLHn<0Re13TM1S+A$B(ck|BL>x$09%dMW*d;{uMm?I)S1Ps9S%9qs7M*3}`t*s{Cvr zzk)?3h!?nS`ITd_+b2JA?X&FXKPxL-0XPNrzY<*o2&l>IcCnmeUGf!<n9-x*7mxn* z894UH`rs27M&>0Ui^#>dU=i}qe{C0lCSiZA6p}t5uOI&S5^S=D-W}IeJ^e%#RS0sQ zznZ&bc|x!LjA3%S0f}l^`u(_DgpYiB+{L)zt2TuKkqu1n(}}szRJP~C-^=O#ppyJ* zwmn`vVt4lVQS`&ATj7Pd2=Om}aoI_Uw7FcbZlcnp4zB}Fy5zMt@^O-9j{Flm1#kR{ zmzcQIJx|y3OLk$jTB4=LXL04^n?8q74oi@bOl=(FL<gOo;~EFvR9t%a@uOx6ctSZX z#Y&~VWVIz4cXB-XoM1aEK){o(_xEB5JUzx(q!T*V?<OhNH_0RRg7_j>2y^tZBl|~s zlI-@d`BCvWmE$GEXuEojGWdXZzur?a-u)?97FUb;0>{m7zW%s~Q^L-GV!k9b<syPW zI!O|-W`r6M$Xe}@mxwYkh#6`A7bqGn^bau6J6hY@By(buB3yIX>`$M+`ZMv7i&k>7 zN-&z--9n&}b|+!6ba1EfL+|vj_f=vc(b*jz838pyCO#UQe*^pcF-Vf8BpgWKuO_Y` zPw5PX2TO=K6V{mSL+4`z9<(a$V%v?zfzC!Kf0YMDaOyuAE~T3->a-&aOv0_QPC5M+ zED<t6sI$e}i1}8>0eH9ctYm`t`jCwfI#Eb(|IuO!$b%d~7E0&m-zhZndQdKA^P`?9 z(8WiA3E%n_qaY!z&>V`dCUU_cP8<8+Hd0a<m4=i~NrmXulUF!vU%=^`7mEl4`yvyM zMVp$pHCZB0F~ch(@N5!Pq9?`Bh3BJt^a4SbU-*T+Os<h1X(OTCwjvus?=WQCMu3aX z4C^|7p01z@Mp3cjWXPgv+B=7`rOsP9uML&z*h(o7{wEb0uw*tDfBdqdEC<)tPEk-I zrl+ikT^XKYt%CE?N(aG3sEMuS2R)1IhE^GI&wyKf2>t-T2w%hKDI@Fi3#;W`{a)(n zA&K$$)>piZxL6-`DAxH@p#a8=n|ga#V{V@#&8B2E)PEQ`z5Q2v%Lz-(wmNXoeHc6F zeMp^OasYvrND@P|ROL}4vRx_^#5q@*Smt=EL}EZsU-Wx+ZirzURvQ=vK_dOYUrrd? zI~}AABVLEqZkpAJC`+zBodLx|sDWo3>@e){SUgW!k$BzBG}*@Om+*c!i-QAttkit* ztgnKP?8n&W8!4R~%_jY*;>iR&Cuf_LxIMORnqq|6%2uQb;6E#PudC{rLiT(A%#$O; z=K=k`!|8z-?Omr8E_(flaJIt@z;I$yMV<RqjqFPcU7(QLd^^1=<O2X?#%X__jAZ~) z*QI6^DM2P-2MXjZ{l&HlDvCfV=Y-rn$8>jqWpIZ#s8qKx<{-a<K*nVQZjjW)y?MIA zKD(dcsDU#9GA5z|zt0zYQ}e{<$MFkt*r6Co{)2ic)}BL#ToSU#NahtfqIIUPqQqYQ zUoeCH1!#Hfh(r#M{_^E$`LEq(gFGO<{~{#g*g5UOhznsn@*VjHWMi?-bR+NHyB5)p zGrUKMm#1h$Rz|SWNh^8xqpQyY+o6wPpw|!~EX2(N?X8AKhZy0cRSwx^KgL1Qq+`x< z)i52VdtHK8In)flw^C|J4>)2Mh<y@6$|*Uf8b2S`3uG(%c%YsqRIh=~Vfp3uZ$ZQ@ zZVL=)=L^b!y8nF$0(te{P!8z*_aTPJ4^<8F$Eb2+It19=Ifvui2D~fIj9hD-tTN&v z+-9xwKs%5dj^YH{!H^O4lTI_#T%Bzh0`8z``1JdXISvRsthX5K@4*~HQ%}D-d&YuC znhA9AP`+YNG+)3i4EDLET`Jw_ZZ~RKj!}C%JBF{JU-zvr+9BEo|5E_$X19aG(2`Y( z2y79JGTWt&O@)nSAhNv%J|RkDrIm=NB~UBSO$&6qFxdhPGWx?j93(#O@a%jz9o{Sn zgt)lAu>WAAIXyU7(h;pgu|~&DGTM9SpG`nF9ogWjSQX(3I=<mBH21qxWwoG=G4cF? z`jQVq7m4A4P<5Z^+#@Z-9)`5*=>j`E55nbx7$6B>#?u2)<u+D^Y(ks$SeGl+^gwi} z3wr=`O8dyk?{4bLoevLk@?LT96MCcH%v#dADC6{`ePP0&Hf6svfEYKL=iY@F1t(x| z9<;e4WuqfcL=71U`>85JKu~mK9^4PgULr!P)W|#{8jW=vsbHD(Z1TyuM|LNiswP#V zAU+<LUehIv%n5p0oVnM@0U~WvWGKsmP}hV$tGJjl=HiR0Lelm+mg=<DAZ(3(C9h)2 zyv|Pyg})88Px}}KGU^F37zC>g&q2V&e)3_Bn_5PEEijny>6qCVD5L!mj0O800krF8 zAMM*Kq}`M&8VWQu<A_i;4!CXEEv0Czaq(|FFbhVR0=oXoeP@Fpg|^)yFL#CNfRfn? zQgWZO4zz%XYiThN*|@tyi9<Cgqha@}F?sNy?V`Mze&oI_qxiQ@SgG4EedobMvFl1S zYY=5g%Oak^q-BQDhPg$QwWOtMjKlg-HYCSU(26`Gq53E^NES~yQb?aZ`iy4@$8NW_ zE3h0%8OWbor=ivabhDdYP2dxhp;ovS<0#O$>u%_XvCUxTWP%1Y-N>E?Y__@xEB4TD zwq>uABPy^+;d6_0z-2!Tgh*Kq{v@XXh_qQ{H0#fOSPGmRQ7Ph7b@ig7<91^WE(w)$ zF%){FMuYwQRZ^?Zc(<l{A(pTwE#aTv@H$ZakZvui_Mr{k`^rHt?M{wDk`Ls4?2zb* zPN|it5L77@&iPq%W$^c5-^P*2UrM7ekVT?Z4;H@K%VK_mRA$jOI=)TQvcEY+e+xT0 zzYAJ^e-irMZ}t4<0s<+&KlxnRRahb-6OF@Lln0XgS{S^%4fM=q<)ZOlY#gE;M}_!2 zUXMp#E-o}bCo@K!0<#$FX{4b{;4hos!%t<;(&R+un@sxw@0aS*IEY`Tv)_Qn|9f-w zH+flZ&>%L!9ejCll*ap)@Ab9a()se;MgAk4K}kleS$1eNQ5Z=Dzrgj&U6kaQDYU{t z(&uJTQi*He&I;5bk|_GQLN^*Zxk$CpVjJ=u<M@>2!Ko3OEC{Grm=je+0?5cv^fcs* z5!;LNRqySvYB>?R)k6Q~!%+ok5FWRIlVDQejKXC1Zaji;8mDd^M2GCxG?3AY<~u6+ zB<fcRc#;XzV_6IY*U&eKqeqy}b#Lc<R4<T7J|D}e_6mi_NIai}_i~jhQHri9>x&$a z@K1SK<9r(a>6RO3Vp5{TzA8i5t~8CUVGe9r9da|>R83?S_CWF>z;Gs<8a9502s;|_ zm<ivD1BYSFRtNW%GOH2O>rm9ULbuya5E3eFhCC>fL}^=fXk&#(u%o<(@6nI?q{|i| zQm-`BEodr8Y7@<is@#xPcf$x%WwJAr7^$b(4K3R(fX!}DMGY90@A!m40(s+3n7PbX zdidQ%8`8a9(45Iilwz-ttW3ogu3zi+?c<+byVO>fp+<5dbDGdwhQ73m62wkyoKP`V zAuY{l&p8iGh6vMP>J(Z-rOkRrv-G;y|CiZ}N_~U2c^7Rym0SHdxNs0`v{huru0**s z7|h;KQ7c1UMbIa%fiOAbv^P?d7(wa8<AmD?d4R=ymu(>y8K9=G{qC?>YO&$KND)Sl zM_-~U=Zbhi35SabcI?;q`8d;iQ2xNZvsZ126z2<fuOM+3YE3>t@4ACn^(PYTOv5dF zFD3`wjLg}=gl$7aUlc^$)FIDJvl=3L)2wAXQfRx=RFn1S1)L)9U%+Xr{so+Gh3z2t zc&BWe8PXQ<3aujeWZyvN2(^rY(KOh>@B*&K6o&kSvWMyMWpvpDhKnIp^b!W<L<2={ z??*=0+G%entBtZ9oFPq^IV#8T)bHA)&R*M^(7D<q?8%rWsBX0T0j0_Dzp8&CkG+>t zkCAVSVBuuexPg>-E5KzcOu&xogMZ`QPd{9P6`vy)69GmSY-v)-Z*4myiHnP{EcUM# zzK)siolyPB(Cx4%Z_qTL-!E1RR8gauUlS8iCvhJYgrQ>W-Sk7}3r!ezhU$${RJK<0 z5en8OkXsan%5IUEpKnyE?`Uw8N;{gL%T*ms1DfBRq4>?J!qrLxfy-ikv%`Z#s|3H4 z`23#QnpA`53SIa~+7E%7ZnHqSkUdreldF4ikWttQ<<st9VqPRL0j1e>v8D@WbaMDq z96Smb!+)NS;yet*>1h}!XuO(oiF1E<FN7!hYcw83hV!clUh9n4a^!U!KI;ZNfWHl! zYO5Ct=1-g8wcCYc3-irtiU)R2GKR%GfunhP$buI8Z2}d9)@yoel;PiY-F${}J*Q#V z;12CcjAGreK~2FJ*88?zswqan8SXPc)k4it{U9;tMR_d6{?&ENP;p!#Muni@h`KsQ zJjc7jjajgWL!w&mS`)-cb?)E?C@z@%jIBQ6Oo_nW4bJxxzs}zYo#FDYHcW_u$rx(W zEqpTKD|+kNpXc#D(S2q=X2BRC-)~?g@lVDF!g<lC*y9mXe{e%slV9)%)(rLJbQ0r# zyCQb(R599J-<Z<bo+61`)5y~!uVDqja?*}Tb%*XEC_Ftx_4bq|zTBNxkp>>292ysz zVkA@$%<0CPF9TF5mNM%TsuU9`)e8d831QM#k@=aQ3AB=v8keL@4*_@4?dZ)$rHO(3 z*Qhpj1c(>17ryQs1M!yv0P4dMX|xcXhUY7o_iw~HQC$(w$;`Pj9$nzS+3b*_$xVhU zVFQ=0E|g}*^)DuRJzZWTg}!xVs-!*U@`fTDw`kR$ej(S1S)QNEa97ypbvja2rtGNV zQJTJ6(<`e?xl&!EAPm$1REz`;6M27Cv9SySboPR!)KFwz+!SF~=~}$Oo7C-LwVd!P z=<;|uZX1PL``&K(qs19lqa|Uwr-QkX^O-6Z`!0zy?5GN_bzQ-99TcnpCDfFAmZh{0 zE$P$}ti=nm*cdeajOfs`%JnT}yni~PaNB-zv(@r(Qs_dti5g*ZkleH5Drwl^6g0g( zW4%DooDVa?i~$;9vz2#Tw14qfTyM}KPHpo4<?h{^<I0VE!LQ<&KRmk|?FqMfJa;a` zVTVLX-L&=Ki0tn1U2jwrtBT~Y>eclS$+rC6_m`PSAn`n>id6gV{$aOx3P>dKg+wBe z04%hmbt*A&sE*4%WyL-Q1f?HSDYkD^QxuEX0M4kmjj}2qq=5L9@Y6<KCiO!^IIiIP zEB%R02mvj~8+5&(G75d->*ECTVFggz!P!%`irLx1F<DMSN!j21PZZ_Fg^xXi#g{+j zkGCt-ukoLreM9X~?NYv=MC~_U<IA1@f(pO?K}}Y!#4cKV{R|(dBqsO4KW*c0{^NJl ze>VHbU;pJT&>BDd%jbW&M9o|I*N?O5QvZE<3vA@`>rE&BxIirpyp>L!E>K<p|KRbd zK<vN#X}sKzH}uo%+11AV^X+&uxy7gFDCRoHf8TQ7Kkb(@{PCy#oSHx1-@wDcKQ3^Y zZnn6ZZSe2+aCPKg?{J^eeSA5a$UndO6`r$#nPPiPiiD+Ov1Xo<@p2+RTWUq7h*6Lr z80N%i;-l1)S}o_vOA%Ps0O_y)`gKul5~D(n=G6nDrSVc6w1f6`_!R}7jW6gBmd=b> zx`(Jbu<$r&MCzm`PuAFlf!h$WL0w0O8QvYev2RC;XoCrH4H-ya{^^+$#&1H2;00I~ z{z9!)ejM?SuHh9N2l=<w0|s{(1G0UFZ1{|-n^c#DSue{@it+VkwGbv*{?U7AzZmYc z0UU@n)ksDGGlwdKIp)LSexriL&N3)a;H%JOaZf*ma>Qghsn$KeQJNEM@o?jV5&5_e z<wvR<u@?_0g<Zw@Asj_yfZ>e0e$mp-tkk8+shE`h*N?nr{vrOxf-kP(AB1jf?=?^z zEtt6Raf2VE!lg)#(1%(t#i=v41l3|;kXX&Kd7@upO&nRYlYQYaHAUQpgu@KB!7dG@ z%ELfv(Kh>ScqNsQ4*Gp}D_UUSU_<b!jx+t*O%i=#bWj(`h^w270OKM;);I+Ow7w7_ z0Fu-p(ZhFcZcZ`Le6c0*3oLS@a&Y?^D~;>mCJon(2cazo9!TQ4!YtBu3t4m?VESnk z<C)C;DM#6GmLFTlo>ll3aP*CuR^&R_uVd=5Q%n<&VUZ)A$U@ox?xbrG8#NZ3Z`t*% zA6yd(?(GPsp<@aoqFu3Ou?2RcIFQ8W8)-sB)qkcvm#c0&t90kzsI$tg#}<pi3i$=K zj&86i)gTOG^Pj+~`ltqe8!vBU8If|-_`(tiAf=gK%~39&mcM-JoAI<mZ83E8khUH0 zioUqjjVYVW@d`1kSq(hYQ0@e~sjlfwRU&!&)#ix$RL6X>LY(>786?nF>k6bcPRbEy z8{%^ml`&3YPpBLZFE0*PFhHsmzeil*BV}T(s4!xs`xf4}SVKo{qO^2k8|hGI!D>$f zZ;e;RcnTr``tBAh$`aw}qlSq|8okl?t<&YW36=0;SzL^36GJRyJx7$NsK^K=X_f&a ztoyU#XehV2o=rZ^i)@PUqQab;l`ah4@H?m{Cu9mL1acfM*^X$4+4QD}2P7la{kY!( z7l3ircBIvaVJ+bvPl{;7?S9%r&42E1cs=imY>c46pbcn5FY#1nd8F|IWjlKO4X-VI zg0X`xJ6*#Q0_oQX;hXUSrzB;H^KZc@$Nlhba{YO7FHCSWbd7Wts<c+16{B$FFRuw1 z#9?y4_-X8TVfOvzdpueS5I)K;o@t7)48m*2VFS3uXo{V-Rws1yb-zf&#gV-@EDxwE zOr0C8)?^Z7@{N{cmwTI`_P%!ltFY2}6;UHwHDEwEsmL?Y4D<#c4v-7?P>uDU%j6S@ zm3HD=6sK~tna!4i1?HA_etrD7#kK4eE`w_k`Nqt#PnxB>6ss{TreM}=Lu<np1zLT` zv&up&(DFiCuZZDcG#_fKg5ySq=?FG19A}8Q1iMt&<7JaYbaOB}5KblEZ+Sx$^8R~u zCKSS)@6E#l4aRII$gk*QG+b3woxyYM0}PtkN>vd=TB1MjsW!U11%uZs`d#STm__>b za;gHbE+4VNW}&N0rLZzCcl(944&`Atc;Ex+0w#uAvGQAl8|PphPR4K~tD;&4%GIP> zlZ^|26oB9jV9Ib|b#i3O-5oSqZ)Tsm)jo1O@`fEyM`DPDCcEK2uLjp;W|7P3yYVly zz?R50r<J@o+7-;gM-c|}^?RsfxdvKBYHY*i)(Wn`vb%oB2ad$3?$X{kUl;@GKY_`# z+uh=r6(4iLE@smXFGTVCx^`GSsc*WBI1xy&b;c!@X2b^fIB|=(rwxJL)drW;cZlI9 zyHe6~|L&zH^sN+AE-Wy3y9LLQkKOtv8|{ejOT4pP_SSkgNx{1^B8SPFBg~Q<_N$Oo z=&bnA7@#R{t8TtVnogvphBHm(4^v#XFjdHwEKfjJ7cvNIi5_ef>yt(PnRE5fpX@ae zfFcrG_Ugh%xJffHt>IguCg{3=VZ~Y_DavS=t51ZFnp8u<e*!|Y&BHZ<Z^-M|bQ48M z3^b-x+CJiQE11NOEfUBKn2R!218}Y<O2{7Gmt=1|Z)kI(sKjYGlPO27klIm==k;oD zF@S;*8EDzC;y$UKE*N?6emA74B;VAlqAP>D;!R*pfj1*FR8Ef|Muy=r3x!<eqsNL` zy2adp&fi`b0CBp9zt@PdHf@h2)0YSp*=y5G?aCnzGQ3xEnQH6Sz42~APrpJvRK9~K z*e4L_on<27raud789>ynT(7wHjKnOLN<Fzn+u#w55@FG)s0A^>TfuMH(O|yb1)I)j zGia9m2pBz{U8DT~64WNRoza`g&Kq$iBbRCY!Eq}_Os=hiN0k5cUlhXHX-Lng1=a@s zp#nm6Bp=)Vf}SNKffP&TQ1B@Vn?=9$k%ZldUns%&bS?rbi{hA>R1YS~plUIm15t7; zusa}wQ^FvKXSALdF*B}!*Z~VKa}z2cY~&~E??Uye;KlAXB4j$t=Zc^(e=1bypK}~J zvSUg}iFe7Zk-ao#B=f)Y$Y~ToG8pj0+>bpVY;4IuNOoOCk{9Al2Et*YZG%S!h<t7l z5f;A?P>Mjf22JtF0!<b|2tu_mi5EiC|6pHS%}^FUGC&U_Z#lYT!1)G9pyBvaYo=xy z&P4a1wYw-*He6*el+P`+OjyeF>lQb?nrMSnrmLA}Yg`kL$jK4h5ExQE=`1)UV0bx( zWRTI|5-=$Qg$M%tntaKFW!^8A><KvMh%)obx`2eo-qUCAV%%@3c|5)3Q_S8Kvd-(S zmw#`oj2iaDRsX%|(9$yBe|ELK>ozs#tnEuZ?)0_kFamR=#uZNuulGOy97rG0*}myU zenH<_!tHCrxI_>d%K1xxNLMkg>99}IrBYA#B~DsTPBdR5mPq=Ikg8fQ{8ryFJIHvG zG14;yx{aZ3jkW<S&L%Jmzn7TBzv5Ba=vVWnp{^isHT${qmn)oxDh`tsd^D=xKEtbh z8+n{QQ&$0lTT$KGA9W>gRx!3X*tY0x;$P(^s-GItU*&B#|Aj6z`u^E`<TP_$aCNi8 zNx|H8SRwQi{PWDLg|;DMDR;V~R>p+2!QsJ2zh5S^R-6-tmGnj@F13b0YV}ca8e+k! zPhYwWC4jV+os~##eRd@Mlp^5*w9>qWIW^Wh6Atwng>gQStPVtZ(#50ICL_8%$w}ln z7FZ+A1t9Z>8-F1!0Ta}Vm#~UvtylAh`g{Y7UKOP~b`lLM8k~E+a_zP3A^!9JS<pF< z`N8~|O&a;6Fd4D*DSuk)k7y6SZuq5e1?mlRlg)%<3+0InmjQS)Shh+QNr@uH3O21K z?+!$)qKP!o7^ulDR;+Fx2~;p)DGd6h2M;tcmMsCmO2a?*VqmRa0!4lTgrcc%Gl;BV z0>J&&fFM?^uu5b+xv2z2L|TE2fKtjAbxWEI<Bqho_BEYcH${d^lfFf}n}9KPxk0Cb zQBL4^lMN`q9Vf?j0pnGtl{3sNsDzYVXROecQQm1sb~M{e?#+%H)Y~6)rN0^FPT=yr zV5jAY#3e1IaDrX+FrwGqa$iV@#okem0Y{OpD(w`29lQ#KZ~#ue!b4b_Z*bwtTV*#G zT4sS2d_&x@bnR%d_(;D5N`(Y@y5HpwQ~&`-zV=UC6tjQgUYGq7De(4By5!~mX0E+G zuS$^leYd(0@e}@7dJ+I6`QxN0Y%9~>@p5v~LJzn7_biEjfg4X(dfxTz+jAm4r%2=9 zpJjm0Dit@>c<K*(>Wu;8iqyLX!`Jg@4A=wX3RhkhpoT7Oz}7!q&P8OBu>tNQp=9SW znQw5L$w5$3l_rnQS>%g|F<GpGDAg#}GZ7>)hdI<>kc`lP(@rnV9Zosm!H!8Jm=5UZ zr+yqN^Js(B`%vN;qHTq|C2?s&R=`h7huJ++hK?qMa%py-UBn^Ag4Q@C$GypdYT)NP z>{R&yEYBc(bho4YCmn*KPX#=!bl*%Kuc?56EsY!K7#=FVx8nuk^9sqC_yc4?;UGPV z9!hsEiddlh0^dQTL~2h0FmMToIwMF7q+&H0C(r~-mBYwQti@?RlO;0C%)r5X9YL1A zjVG(CE=J-AFdsK4NHRh3!AC=yPX<^uB56SvltS|v(g$%F_tD6NE1QQ~3q@wJR~{b^ zV>#0&;2JP=KuU<BY*n59fG+-7sYcr#ny*n$1e@&9dUfZeK>gB^Kq<D`Z;P{F&#^%r zSL@Vy1&Ym~d}%K?O;XE(7y%3nak}PXVu@t-cE>Q*69QZksJeTDgQu&JWnJ6cZDwl; z+)^{8CtWg49Rmc!=~yhYK+<+Z7qgwJC}HSJ;`6x1_)oYqCuS55Z(&k2TU>Un&(;Cl zBF)T=uAUTsYIIz!jQOj1J{W%~d&P)6=!={eHy|%eTuK5H=S#&U`6)v}d}R6CK^De` zaV;X$T}uzN*<9{E+a2eDVlvoNp~{l(G<?*bJUU7q@1K*(+V&^A4%HZ8TPLLN?Xug1 zCDLtLFoD)8iJyzB?RM`ozK-60ptOgfddo-wi=y9u|7c4KDqNeLsM~1y9n1k++U0(I zgX5j)6w#2)!+IBrG3v}v!s%wVfkBEQW0>0-CA!wP8)rTpW0=n#C_*EL0F6777#@WV zo46bwmi91BwRS=D1#NB?5N|efDAwAz!JICoT%yPlS;ibwq`9CjNj`V_5;}kdIJ;Zj z;bmo1BWF<QTpR*$6_I~#&0TO86D$Dq*SPHoW>>Luw5iN$SZ8BmQnK^`$ahC!GG$pc zVueWBj4tKOsIZ77h%B8V0n})-@k$yY7{kI^y;~u;<sf;}?%|;P_I5|52cof9d2qpL zlh&)fk&e+eg_ox=MaV$1V=*Y1%?M>X@TF%A=C*+(JAY(wf2U()t~vL|6Peyuw<}Z> zL>)r?@DEE744M)wV3gNTFc{I?iP?M^N%cgKAiGb1v!Id?0SnZ4v+!I{b0ps|lZ4o4 z&P;=Ir9Q8E65)HX8=+@<=|KK-p;K5OBjF&vwsohai8LSzXeEjVn4W$?`2+QXwieAE zMcjhTb5f{N?C=W3uDhn=Z%ookOj(g=eodoKqXpCX$kDtM5mcf9nLpXOKgk5j^lGgV zn16+20oT^@F}S~*t?En9bi?571*d{Luu5bu1DJ~~Dequ-Xxr2al%y;#c=ZuT79g{t ze(XUum%>qd(W;Nr#@j(9b~(vR?ZMHITgzM>XjyLqKkMsXou6^<+QK-ne__QO*t5En z)~V50nMSQOwhj?uS6h9NYUv|^)|A>9>@lnFh}Ou&TM6dBj%sW2J*#pZDB)6Eui=Ci zm+LyH@<L8<!g?*%Uf1zDtk5G}tO*{eXJLV_gYzA7Xiu-{xosW7T|)6morTpJcV9=i z@_{SToknnd%$^EVNBciE3Y#%H!EMA=VG~XiQWJ>3V^gi^5#+%^`CV_WPT`|d_|72@ z`vC>+D6Hu}ML5u?DE;8fFhB<?-i{vt3$>=B1!IYjQ(AFwb$tzasSiL?v4^Y2i~$lS zS8h;{LFfqZ^O>$Baj~y3QcTX2249*4U!KUDFFl1X&BXmxeT0~KD&!=XP8q=eo84_9 zfm{?DWe!$<(;%s9jXZ)7-2^nMr59jP9)bQTa?(xTU;T|T0dzm=;9ylo2!7{Yq)61{ z4t0fb>xm#qV#{Vd`Rge{57nFmU}CNvear3T&ME1;R8l8!pax~j;2V+%r~n3bphyho zWIz1O9WQZ)LE%3%qLP;*RE*uAWUZW}NhS=<O$K445L3k)1x`;>jNt&C<Dzn;#c3Om z2hW`H-e^2G7KLy?q-DAtxhl$jP}@AghOO9(@ou6ud0gpbz`EkEn5dZ9sH1_1ce;@- zznh(Eku!&Uadd|w=PtGyJR|xS8}y;^8Z}qX=X(TE`tSfZ=;|GfbUI(r4RJ$hk%yKD z!Jh!P5;@u2*s7iZR|SVRxO@_JVKe|dmA8YsPe^vYFnO9z74SaLXt$!0_4L9JD<W;b zoc+xQ1jI{0)GiE#q3?*>wZV0VM<rtEVFctUfocvV)rm;#R4-DD1`Cc*%rsZ=HnLM~ zGemr{&ML?+XV>HXTuqP&Vb(aKputoDogrfhuMlaxXSv7IRRid8u~q9(8yi}*o-IZj zoD+>EFpMH|Vy-^(Fs=o{;-A1Q^3hpT3Qeg02<FfwgxMBNTw#SAp*{eO?YTd%B0ed0 zd_d>SsE2le;;-!&wji)+#x)sf?TC2Gce~yC*?CBoPyxkH)|<=5#P1i(lYs!7y^2k$ z;9(dZxT+{py?GqO&@!Z!9-vTJA1)%-3{`c;7q=idh00K73#~wsUkwf_bU}K8C0BNc zu*4>deluc{{}=?s{O0j+dfqaWcpqS*<|6M0j#xvjb_3K}X}KF#1N|X~K!q~HvAiR! zoRN~$Xh%Sld<^?BhlaiE>%A#W)iXGnpTj7YrjWzNd#1x0y0_9?V=vr9#R#9`oJi1a zvBke#&E+7!J>l(qHd}v>K&zM39B~{>+AUOy!%$BBJlp80Mg)QeyxFgp$T@_^h&|K@ z%hrhfsZMhcofX04TpJ>W4`h@fm~1L17Q_2u%G(LH6I6_7w1bz2Dv*vJ2f^Z5AlRY) zl`^x02_`2m0dRZFFHCyNMiU!gaj1<=jR{BQMOJ!G8$flWG;07`Y1q%$m5+D;3qNX5 zLBk%Ei73g8S&K1s4NT5$4`~vJBnifa3t8uz8=h2fzT<KC%L7?5g!Cx4fvh43hI@;O zoFt!j;OFJ*jd|Y0a$A71Qu#juh?0kbOo=I(<fwq26t%%##<A=e0*4ut1+gY9sV^Pq zGDTgv3GO#eSP>gjVsA)VN2Z}PF9$8ZE3fbgLa#(Q)F}E%2FsDy2c>EVWph&i;FFZa z&lR`^3zO6P=9x(_eb}DztAggKB$X)BE+SmO)3jhns8xuHZl7i&vR0-nWH48z#{ifI z$%-E{vX7|9?5#Bg2*Z!%X^?R{lpr8>=z;;5fEDls^*@XzsDzrTem?*wK&mZ4D1$7s z9z{ICv~opIsiL(mOfi8k?-?hiMRY3~p$EW-<Kz8cfGD?wmw-cbFu*Ou^3h0uUFWJ} z=SH!Bc`t3yz=xmG6-TLcjp|50BcB0<4Skx6Dxa!6W>Z)c6oOia)Wje#cF!TT0ez{~ z#%4to&W*-;xyT`5W@-)1dWx^G)#gJ^-)J1R7aTF5=f65*e!QKG+DCH3#Fb9P7YNy1 zQ5p><FQB&NoriTH#TrkUUJX4f(lZEHu#|07a_U9{=Q8|=aT7TP71~C?VKSYTCA)}; zA0rUJ4uUaN=135{boPmyprTz1{!S5@$GJNycQQ6@Se&zb<#UBq$@9@`e3epnk059b zFg-Kv#I@gufDI*4#Y4bUb8TT_GiZr@QTDlx#X(d8bVJj8#Z?yUZpS!#JIK8LY$LJC zr=K~YKDMPlQ+NTNG|(=B8_v6u^LC)jMTgl!>iT3Knxt<`o}ZBo6OzG(fX$Cy00S@h zB)3MN0ykui9EKa}ESIJ{qJwS!gUoxjx=z;mBHbwm(6uW+jzkS|>sfq_G7uelss&wA zk{7W+`x@ty_RRSLiwMG@AdGW^Ev~%a&hK(EDV^;UYQi-*Pyz}#;&@GuOH}%U6qV`B z84FNJhYV)lLwQQgLtJX_cnX$;Arex`%+`BP`c`8y5^_)%VN*J({F&-Hx$%3r@42b0 z5S%tB9qsS;Hq8d^hv@6kBz=IFOcGz@JYPq^hr3%SUaBuU)b1Hfv^^B}V0%@N2wT|c zX{i6*c(Z>l?`k2W#;3e5xWwdzDX*g>^@Txwy_4y9dpkm<7BJb-Q@&hZ>nGw+VUX`o zmV8d7$=?Qxro*TZ6U0jQGlVQ0^|e<=pBx^QUhkn$nHxY_hL7mUkhJSd928IyC#A}3 zpQqK=?1e?F0q(_jwjtz<_Le{+6dxeE74UfRL(*|RyXGU$-k!&f_@Ox<P`_I3@Fab} z9-p}IeDr1L{EnO6fB)rw^<fzy02F^-S)4tqR+H+%Nz?|1B<G<tn>*MkwRl7CBqYdP zcN?7AuBm@eo~VQi5R^u^8*JLZ?YZvm(<O&Rg%F?cvH$x$E)e)?PvOjI*X`2uB|4=+ zgcJ@V^<cQ6y?7jQ|F1MbETgCLVAw16O*BWM-L{8n09u3wf-pXm{sEeq1=r6WU0+i* z9*Nb3c~J45+$&LNRbm3%8RCe~cS#BtEgW`-6fqs0Xo7FX5AoqdsgbdM*4n)!P6Eya zZXAvm7oq${)~KWU8$4b%XO*oIFX*N7Kb^n&HtSSyD<Zt9<N3Qm{Xio)!UzM+<nh$l zZqf`1*auV~%eYnaA^qy(RvPzuQP3VP7&D4qBgk;SygYToIq@MagK)548-xm9qg#0R zn;x2OP2}?O^+3qIknkM2UhoW9j;|Lvl56=`6<|mp95#nn&H(bfC^bjqEJOe50rwWw z^hBhDKMEx^Y278*Xc7U=+ib_5bT`325;JIn5f~ATO3g2+UJaC@Iwy=uNl&yn#M*5X zOh+iW7p!p9vt-P)qne8<dTh7o?qdJIm?_dfM(~H3cbQ%Tm&EcY7S`^tnBq=aja~xe zCHA7mgjE39#6Q4oX9-f}A{7j3EcdvbVw%hXM$qPd;{*I_oFYg4>63vGGkvxrzwNmV zkm?i=T~;TJuqjzO5HhpI+8qzbk%>mn68)*$f#O45wx=sR`E#Ss>xgaB5y>WxkTuB* ze_6E{;q8{{iC7sY!rjq3h_qwl9|P0z8@74HpHfnu&o+yWH6sBIr1XapJpljo-32ep zSblZq%+rd7kan~N_q4ej2<x&J7S=Hr%4rVyr}JJ&fBrBC(w{$6A#s07qr&3-0@m{q zrrZ(QDMxZ^N)$v2(^?_4fD#}|Z`<ViCAL5Q4x<|i`D2t}FBkP{z<=CyP@x+m=(Z(I zlqd6?YH#a8QfzTLUVm45Pmp{w4+guLJ~+yPcc?DxNaq$oow$ca{}|Bh61gisa``_| zMt{bU@FIinsA~K6k=En(-#x@|&mR$PeFEYgAHVIs#>Ba96WK2RmG~XpAOBe@6X_dG z@#j0-BH#rm(&RI$I4v@aavm@lw4kC)Pf-9u<5PO&;erPeLMMC+EvvK%O^nkUGM!15 zLX(s)%0JhFmUF`B?Rcv(A2q`;bv{-A4a6HtTyDfM_a^@JCjRv*{`JcInj=7CGdhX2 zUEn)zlYz{Ib?d!s#W)yaw*Lu;_S$D*91`}R6%3^ve0^=DSha8~kxwoVc*#PYm$(cr zK5*`@v`{L^P*<~?ZfUe25=3b-={C3^n@oQ&Lh*2Xz;K=<ekDy-OXN=^!*S-KpCP9# z`oB1j(*MQYj{mEQW-=!4+H+<n9*v_1H-6JCKZeMiLpSVrLoHyK2ygM)LSw-bOAZE~ z7*xo{Ou_<eV;YnB{==Jt2itErDJn5CZVr27Ghb?2qZi^>EQc3s#zgMFiEQnI`7>dq z4E-z-phhX^BcOkiLT}H^AdA83xKB|JykxFYOGOyR<cR*t7p$;X7tM%C7MH>I+=^gw zLPb!k)aE=y9}@6O#OdNx )0^x8Bb)qfJ69B8%_#GQl6p^>BKqodhaN6Ddtb%!K zgQj1P1PmYa6fS{XkxSI4W^e!UXPSY-Jzj7{qg<;9m0CO5M3XDz02Vc$AcmG^y{{oD zjnDmk&Gzub(cZQ%aemRBG?4}Vapv1tAJ|jqH4gpwtyS@VDiis(;%s{`-$IxTJ8EFi zDq=^aUF2-l+N|&{3-~pjUm#zD0<6s$VC|W~-*=6Qq@X5$Lhfx}8|%bXkb6rd=-yBz zx;9oHzI|b+R*?=giilQe#%%`kon-9|y-w3dIBNKIjDt~qCA~5{wfmsYf%l0EH^u{; zZR${~oY=5XJN!VVb}Q$#v1NmjUZULIb_mir^bFRIh-&oNBZyyN>8>pX@eq&NRnbPN zyde_JT;LihQ88GRAxjmuAqexaY~(vF12}V52F{p}TD=2Wq;XCJ3ad=;2Su}opnm8& zPCKq-!O>w#d()V8)Hz;;eBX!?@hM~M7Vx#vk`-~lBh7zW@Ma}Zz*zKQxOk%}Y7S*v z<5hNl;+GL1Sw9pI<&wltc;`J~yq_<pW)=0FX&HukhpoYu&XauLAOn@GJ_^St30CM! z-HP<>>lm$1I$GOd1UtX0tXK+w9w8xfT%RZDOIXCT-vrAV`s8aG#-tu*P17!aqh+qu z#~McMl;~E*g>2E&j$D$pF|BwN)LtB|7tTQn4O#G)+0ABXq|4=_;n`Pi6d2+Ia_Cc} zdO@aDf~h?wK!rwp27MXE9Jl{3Zv9O^9XUBnq4zxbT3Mhkz~hqLa+`e42t^A+>;m{P z@Qbbh0d5gMw90D#FC2P+TodjkZ$mLyP-wX(;M_TQAKGU_pX$nYj7p@=gAP>+a3<sh z=Lt`{JQ8E+6L2hgKDepLeM(Df-WOj28obVXWeZE6`JUi++|H5kN1!j6RcmM7oH70Q z0g9Bsi?fSp>NZaaf9IJ#g>;}~WORdlzKKsiu{P>%Y`I$ghDy^u{6?4)vJ%Jh8++gh zKzXt+!Wfj$f}`))<)Q&b1VB%UXqeezy?gi#XS1fG{(<w)xYuO0)<S~c0SXTJct#i= zd1pE~`wMZHd*af0s0gAm`w_Q}m$;9}wM>Et0vw;@Wj}am*C7En#kNHw>Xs+KH0gx0 zaJY6T-eNiwS>4LK@k<lz?Z>HR8mCZO6ToS?QB@3*q>|zb-N#{mJL=)nc03mmaGyLG zZx>_DI6ef6T+}kW+LOnyM+zWeJbF^@ABMWARA<E;M9wwRmalVbGzPQ0@r+nsK^`<% z`hTRn_%+h3XPXIpW@iWf&z6jokH$#`V$m@#J-bz{C{ImJ?$?loXuky*b(Kg2$4_6t zSiY)-sKYAj^44`=D*w^4C>;#C5E5t{d+MX1$cig@rb+0e{E7DI5SMh7>^+r>;*zG$ zdhn(6ya{3pu0c@PSSIs6RLhOph*=8#kni)UTkW@hj?6^fU#{}F?m;w-eB^!LA+<Vy z8h(po%?$SZzGjqO%g1}k^f5B{c#L5_cKPMX{99B~8G+t7b=}VRW+k&#eOm#81~;gb zjKmMUW986PDE>3Xqkr=~Kb{|>f&LWIaGexIS|u_~<@VbVEt0OeUoU0(l!?3b(zV9z zCT*=4p&B1auZ0it;VbrPafbcv><TP(g9Se0UorJ?{7Qv#Hd{`ssen;a{}?#;&+z_N zgikO<CGDQw<0_GB559f&{@^WMe8NvSQ<;y#vp)_s=8opZTeBd)e^x>g71P_7prqXW zW%6>%7@Ql!>W&BKeoG`1C0E2n3(z)H@xjfD!y148?Fr`h)z|d@|DcE4WU7HW(DM;q z9hAAoxPABG643sN6a#*K0M{%|S9`cql0oxoKE~_F)5~u1Q5`mbmpcK?j<31W&vK%6 zVpy*?C>e9~kcT75JuW)TIY<eaRw+{97A9g~gGk->!+yC8VQ0^#Mju-Q!&~NNdw=IW zZGM5Rz>id-jFUzBX;*3Q<;m;F9%XS^QWDO^0ERKF(dVdv`)F>)Ymqu?mQ(n4x0s^< zH4^q8P~XrbcR596LCJRyKkZkjEXMZ;JpIs=kKrLE{LMjN+kjDckPeBy)-H%3J_<gD zov!xq2dIv=UO4muO7o*@?|4s<&G$cd^v9A|Xt`Ve_0{szUq48hvF0TbTHxcxbR4=` zeeBd4_-oebf(*J+*os-{8zIvkPDuKV3Z(NlBD*ulWmGZxYb+@$1mRe!i0JFpMia0- z2EP=V|Fxgtv3rr#UubY~!-n!RwC<Ll@`QlIR{%HhbQdE0u12LAJVSQ{*lkb8liS(! z#lx%1v7XRUd%$oWVakMr**PRKp*UZp_Z&3c_$Y{Ulie|eRU9b6%wU_r;^%h`6@1`f z^VCieN<pzA2Ph)}O>{ye;EH6_Ft{rX$P}Mh?p`9cyV@ez)!!T}!lw|hYlf_i_+EYQ z7@E7<oPeMsM$w&6G?-4Lksc-uxQID#;gA=qG406AduyX2z;KPZset4bpt5LModB?V z&g`}3K3jgmrh|(x66<)(x45W5d5{g*sL<GiO1}@0go3aar#+{Fst9_ERseFFKbN<7 z(FgbHK7@ck5$xo4zx?RacAc8x6$|%}Gdn;2;bVrtw(f$1gjMSUod7{Ms8*h=)}EjV zl=_R$`IupgPP&&`7kqk>l_)|GLq6Y7HkX)qe{xEL8!lt)Bi6ihq!(Bh-9T!#zQ{PQ zan()t!rsaKA|rh}UtNvoC~~`_iq=+b%-n;rnUCzlpZP7jlg}@L<QaB&<DGw|N&kF) zbAyluX;E2rAsUD+g%b*u$tM>JQ8`CEr&vz@pLQ%5nHq~Qo~%E{sVkF33KqP&@9=6? zBFv$dL1MrozDuibeVEI;RflxH@ZB|%l=jAqe4wl!o$nF(QkAJeEYky5p=xi|=N2vu zlKw{06+D0z!n>8VSlsge{(mYme2Dek)8*c1DoP0dowLm=L*1JaB-!LV>Av4IYx1L9 z?FgCHMhHm}W_S6=iVy4HC-V*{^Y4is;G3g9B-(o)7&wgKSIf@{XBb}05z%1F64$7t z=SrB-)xN{rCw5O3Oo96h+~Td0>-Ce_q=ZiVRsDbN_c>(c<oEh9UzFHF-7JzqSWD(X zfQDUl{QOCRIa+2GOz`qplZ1zI0)Gs!tK%kP?7^rsY=CbD)6aeZ$1LKS=>C_$Rb6z9 zd?oZ1{~zxLsY|HqHhnVVdI3XloOTScPbWBQSBhw2y~HcFs}0_zStFe!ejb^$2T^9Y zZ+JeZ5{;1{hrR3SX$6++N*qY+2W6yb;-P(^eiZ40icSC$Q_cejZd+(dtODc12YX28 zS>ex66S4!MdhVmE)l|JR2h9!~HKP;maMqM<16|!xNF^L@*~01ymW)q7mL%;FQ^Hh@ zfeds>sO;yqpg`xSB6%?$2xgD?xohSvi&+B3?=C8m=!JreUN1Dar*b4rd;p<qjG$kK z!?b03bktfvdWqL$b{)i6&RYD!9J+7!Ybxw5m2|u~f#Z0zfdM8AH4xo~nD?!zF*zRW z99d<1+E_joB<vQS!I{l+u-aiA2&9OWlB_sY3xnmr*(F{+E>T0qC}{w?XAJbRB;8=V zcn2*L4Y=v|p!G>dbf>z3X+QoP%S$|^0A{w?!s|qIWhBSMTYerqJ|-i}#m}bk#2uNM zAm|7v#;VnvVP{-!j7Tp6v682fk(tQE6ks9;8BGL|b~wYE&8JG_ASBhXyzbBupB0va zM@I?BUuK#Zh>*>Akj;@>1#vuPMxbC=P#WZP?JyY0-$86c!5U5|b@Nd#0kg3Z45*?% zMxXI*D|JWsqxOVvvD+6s3Jry&au^=Fa{f?8NLqpuWDcC7thofo9nWOkbAk&B#v)0U zAu;B<{s`i*b7m{*rV!>7{G6m4hZ@?n@OB{Ss+kaO64{teP-@-x%LIUOu8g(BP^I9t z;EMtMNjlcNTG|G=kzDgtW3?vQoJbp~N*;UZmOjHF_9`N%W+l~$=zu<6mr{fQ7;~W= z6BFnu$nA~RYx_jS<MxA`aF%Q0VBA-fD4~-32#G9pFqT5mGiD)x7uO}0ool?FhF79; zWKb=WqrI*<Sr=FE#s~JeZc^0qJ8=G`c=Z=-z*^zle6cNbzeZ(`l|Kl}8W37B9DJC7 z{>Z~9B=}_gPfn2j+4*!_CoO<M@?b3wQL)r}zCXTmlv@`MZQK$a8FiA#k3W{KN%x$t zQG+As8udSzu4(Us=$dpsjIQorrX{J)!z{^z>79gr97C0Tz9GsfekYk@Mzz!>_G=DA zaJ)u6sI(Lt6wE`K7zZ+b5tVHUiEC&pw~F16A(j+1nqt@I-(obs<lu7gaU+r7P(tZK zoOMgGUd{B#UZYkUPTCx@77@U3kp20eTLjxmAAyDng;b&h`lE421mQ(7a9{@FBM1=! zH^-p;#a&RjuX@|TOUc?n1b(2+i$4smNhQ#R7U|{8oZ<NWoGWNLN)~vNNjmy`kW<jN zv)!#f0%)M%ntz{$+sdHD|2T~cLbaM+u!9<tywv_OE@zcDK_G|fpV5xcv<*x|#hcD$ zu|uQN?+A*-3vR@=koHU7R*hJcAnYa*vem4@Bj8Eq!?hu`bc#bu%Pm^!pZEpoZLFy5 zJ!G>*ekw#rw><{eTuPz})n&ZMp>jx-hx0N29zNkj!zda}ki7iD!s&G%JqB3bZ2r_O z(<61Xh%}^Kfz74<R<(dAksmLjNJYb(iWsn@H#%f+)@#BM00d3a-tiu*gzN|B*c-*t z&YYizsj3%hgn`RAY1c^6v~zG`8+aRaB9@XLPqZx#xLY~aQm5#|l<;yS{4D<#TanYc zyl7)&B&^Q&Q&cfztJhGEgHEp^f+0HD6?Ngi=vd{VHy`4L&%gs}z#7g4|LrH5fGST{ zr66h?FY&|-8IRaOe@Rq8{|d`5e<?!5dSJ{E>>Q)&gaHtV*@8X(Fj)^Y8uCYMl3#g# z7~r|dsi1zkw-gwZJg688#3r^cLfXWmVcFD(M*}<afx}0GiuC5u&_rkrmyf4^I4dQk zF``LG8sRI7nw-fG&J{>TI5{~eRiM)Q!i&2eXAjF1sDK-qD3EpUSx^mS*@nl<?f_bE z;Y>q0y^EP3K<r8_Rgq`$VRr1)Mo1oD#D*H@WJQXGv-t(OmLYvPtoWGV%Kojhb1P75 zXNlD~F@hWMn6ZH(mzjU0#gE3|g3C5ko(%-^pZG)yj(j5tlau)_b(E}Z-Baj9<=}_2 z6Jn0|$z}Ul?V9arOQWL53^KCK(Si2nLj{e>)rXe;J}9rf)$D}DB?;Jpo~>9R$*`T_ z`F{5j5h14=ItngcdzvN^WIMAo6}taK%X~5WHXZ)M_>Lx8fI<7!h*S+c@H+Q<k)dQB zPO?a(E0pGIj^82N9b$305FwC@YY+uF$`~(61c|7IKs-r1@r%VSA1C)roKs8vf_H3m zM%Vm`m*SaqO<|{a0{QT<8)JqxWTdfwoq70v9DuNs&*+2StJ}+RV>-1}-L3EtK;!LC zqg}*ll1Arg7pW2L?yaY8=Nn62eP~f=V-Wh9mTq%I`h$7L>RVG0Y4|!j;ww=+)#(Pz zTzT7#9o3ZL(MeGW6~Nbh*YG|Xm$66ceSFqYjOeyzl5ZnxvY~)u%@f9xDTr>3;6pRf zAmzORH^#FrQrcJ)CGlhJN?l}xn{l$+uN_2K?a*;!1`cINwB2s7BwGOLg!sM|g7a9@ z@@@!plpPdf9l7a=4bSK-UEYPN>7m02yXm5LBYi%&YvcxL`N3Z>&aIm?_&z;14P%xE zq!ro78#OodnUW_#h~o3`HG^PAp3>7mjU1b&0%>e$0#e<u1LwYvpIAwNLgXn~;$V_) z=y{je=%{Pw@*D8z+g!pF{6i*<CYsq)R*Yk;rVg@kzW$Xu=S>U4xTY~@1!bLCB1Fv! zR3|*)1mNcG0)1l#LI)>PfH){)Uok1@`_>);XjdhHC>mj2TqMvvb|AFB)1RK9Gp9nk zlTvvXzK*)|51vNU-FvEy{*jjX-fsKQ$8~rwMxnGf4cpf<^-{F2>^!_3Dv0$i_gb`b zwB_i-AX{=2$}q--Wk~xuJ6e`+vbh(il7ZU(Bf30^R(oIQD>{#G%UINbs>Yl4>1trw zqT*#ZC?#X$#F*sQ_#X`j1I})96r=OmqlV45PH|ATy+JY*VAH89X(B(SSsEK6q|Jy) z$8*G6tDFl|W|_OirbMY;0n@`z87*R^3Yh{1JA20&&Pf??(m08CESH86w~xV0_T#TU z;gnLhhD3k)%&TRQaPs?kx1J#hD;$&$>53f`Uf`mO2vau|9k^&4WuEBtnv-x2>C`+W zjmTI#DUBMn#96ScA8kf}j6=XID^hs7nta5jRI0%^CF*N^fdde4%2XQYas>(ivO-8& zR&l)QL6dGfP{(S#raZ7*qvhaCUdh>C<DElOr!-!wO-sJzUY=OmisBsME_`OzZF4zr z&o8(S=wyx+Tdm1*Ika2NOkILjGqY&7ntl6orzPeSAuy9aU_)wpy(yPH2ts1oIx#kG zY71%8`og9vLy_?29d6{d#)!Sh)HE2J4gjsU(_hj>bH~F}B|PLWkiQXBDaorQy9uYo zI!gE=2Uz@3=8ta!bE?I`(7B`r2XH7@yBw{q7<xsd;84Fv)mg1d{vIYr!^4PD#lq@0 zjY?*pR+ajQY!+gL*D-1T5?8taNGf`Ut1UbavNiN+4~HEYDRgv>Y{;G|(pbfs7&<ID z(fL_HDg8L5dLcloKxr;?S45K+s(J(_7>lFbF)s-Z<SK*?#`b6jzN-box5hEHNW0P8 ziC?X5scixWZpd6U*&Nv_9WAFac(@Pe{aJay;_M3sO$YE74GFpO$^`O77Dc;)0vbOk zj#{!UzAuVaEphP$gVxNAOMH<)uJ0$gXbG<0?>czEd?i=n5>ClT^ks)W5_5rm-o%<t zn4amu+dRUIy2}k%{mb2a<v(@K22R*_IrF9cV7KJ1GJWU3tp4)r3B8_&I(7w^?oR1T zTi}ZTxXYxbKyWfC(s47Ph{tKu=r$?Ocs`bj^)asTba6;yu16ZA3e(`bgRjD!TtA3h zmvn^o_ZVvs-fGDekqCkk-xwGQ$SuN=z7e!rj>m+sX86Q9ryQe8kaSOjss*7wW-e0x z^5Q8~p7iMqG(>b^kv{wyD?jc)Hlc`JG``reklw_X9uEWq8OAfO_QE>>aO&l(VNMM0 z6?-n!O=!KXi!k?#<NDNZAqmnw{m$*xMd}7<<Av>nZ$S-X(RMsC`r~eUcqZN6jmGN^ z-v8}v^3j+5R1?KxA?u1ukp?d<>V(~ggFm<z$_;F0dUw)0KYfFV?6|SM`*HOA{A}cw zcTblFuA!{CpwFeXut*Q+JG~+U?nZXK!|l@^yr+}LbVlFh<aV`*chM>a_32J=P=CEe zL22%NB<i>sqX#@gxpcjI#B6Wx9?_Za!FJc``41FEKA{&YJamd36)QPb8l>~1xFR4X zt2u=OLSFx&aw%Y@tI2*rS|Bty6bRx&>65cP>M%#-!woi&MW%G~z#dLFkDHQozIu2R zk3a+v^-!ga%2W@WtMi(V<R6xFIBj@v4)qK)k^MNbd0TVnq|tG^x`w@SQy8j-`{m)H zL{Cl}Nh#`Ts)7&0a)j9Orn}mE7uGFX2$8zau;giW06v9{k#k09S$DeWL7tq15NNX* z6^NM5*5dgIcU^l7<*P@)-)TZAbT4DY4Pz-V4c*q*aUoyE_4j}dkX#_jS=dWEinuN( zC%#!U$$apW6YTbMWecRZ;&2GLM&TQR1N1?6lWxS>X0t-&?w-JZ+!#Y{Lx!xlFCXNa z!SE5L3-KN*8HY!$w_7|o<0w4HjD)TbOcVv!aRGgy;$Z+9Bmp0rYlBB3T3~f}FZRTa zR26t5=sqeHipDgFL1ctKIYAw2pGz9VU>M>B6~UzIV~R+eoZy&hvgtT6({U}=L~YAz zAe?c^6ARIEy8iI&{ng*_QdkTOs0eLB070ynqXMc^FK=ejBoQ87=A9Y{7)i8oAvw>R zBuf|^IlV1A`_S2?b6+C3^o`>OM&lF)Cgt$**7qPVbHpZ+iRJwrF-`?P*WAtX7P$hk zd7w%_Y9BxtS|keQT%T*<SY^!GfPh>F6VB3}#L`?jq^AT9pU~Oh;CS3kQ#J#pc@^EI zN*OXEZjSv#k^ilMb}JMLqn?U`L-yrr^5WsS-F~#N7H=zKy#W%qAJnplR~;04x+A~% z>KYZ`L14W@99w-LBE9K!<kHt<Yjy>}P0_iS?;hT1w5@Hz3xpL^E_{w~BGrXy02dI8 zg3?BSGl2A7rbwVle3c;6{bHeet$?)^S_~QZi9Z(GoA9?A`W4oi%W#oZjeU`?g;^;S zT8?AHa|pKW+pQMW3#eCn;Ej#hNcq)IX*bTdI0!HA-1C7z98tTBJ^@M)|D%i_1Dd`G zo3GZyoA|Ib#w+1k5Aj%ZJe<eRj6s1zPlc5O^?1Yp0SlUw88Yg<yr)JSv@fg`;GqC~ z@xW<a4sM$P{sbT}oDS7)I|<?&`=5e8nwmNVV`=c|fKiVn{G$dQI_N<JJuk-rdc`1S zi-R&0!xc+iW=n2n@a^X&ViP1HG25FJY9M+q3{;g9{pb_B6246^dLQuAmf!BSR{R#0 z1Y#0<jy>9g6X6M7H8&y`P`cQ_6M2c$zDE)e3S!o(L*@n&8c#rXD`1E^j82sUM{)^q z^EsPh4G&??&?DiYhYUX^G*VAAr_<Sz^j%zXb&T4UMHmP_vfyY=JgoBX@_ZLU@L|Z< z-!eBS0`_&HEK!WZuSf@S#?3<}3oPUxO77(rtAS%r5ikiRwui(OuMYU+pk`u;pXd?Q zf_b;0Vda22M7MWSVBtsv5aQ#`CT7EhucVXI$ny<ZCn9%IeZ?>}#IZ3u8vrg&(S4Lz znvDa7tUG0A943d#g%z*`JkZO?CI-Nuxar}JpqwbU2`q4OrBR#~Xl%+5+l=vc!v&T( zn0zw(Aip}UD-Uw%19}b)HbJs|Hav0x2+I%Ll#Te4)qw#y7h3hGH6@RJLHER1$J1?Y z{NAAmby*DDFeM>|JjyOalU0J6`k(CU<&M692x!klLS?JrrL{2{PSkPq&Po%hCmw~S zE4T^v%CWj|u1|lV{XHeoCfN1!HAp2S3_3ijEAa;`)y6tGDkH2<%K@$9=0^Za7KwPF z*UsUrGw{@QbnU(`1>hS>5@zK9{CKO?ro0H`-K8xwJ;c&SsLJoA^|*LCLB)uis+GZn zgz$D5RC8@&!{md_Q1Hku5!Bn8$yS3kf+H;x6hBI$f%r->B$jLvj4)lN4FNAmGl7=x zZq*5<(Wu44+Ou5}k}wF~r2Lxjw;!H`4>W9dMcE)QQ6usl65~fUw42Oa^<(Pj^E?5a zI{0LhAT$MU1C6h{4Knx&VX{Rx#RI&hUpP4??O||6R`LWVSfkDAPFGH+WhA#Sh3qqR zGkICSV;&$}jVB-X$}p*o2Ta?Oc6N4p70U&gTB#Bo1Ou?_Z5M|d7NskMB$@YYvJ5^b z>_e<@T+s3%SM<63PH|#}6Ht@~Fw-5on#UTnw6BSq2Hp<sjJUPm4tT<Y9zz*JGsa#( zErsHqbSD;&N-$PpXpByZWb<zX>aYL$bt2up-QcRbF8vgs$;GEeX8aBraz1$=z^Y7# z5;P6J**aKYp<bW2pcP2HGo(a_Ko}3Mx8Dji<{W91z2QOJW04`C0U3qc$KZ(()QX(2 zu6cMt(B%+3k%|QSc3*5jRYVRRn~y>gBGP0@r^zVu$U#_iYnOahYny!LM@MJThJzG^ z&pJb?ZW;{_@W706cW0rHj~xvj2sXX4=M@3Bw#iIwB})6c(s^z`B&D)f>5(ua@*%^M zuT2THo_=wfZdU6NCN9qIfwF;vX0Eswg7SeN_zfX-2iI}H{CYo|guDYU^5C-%VA+p& z@|*VY^016w0RQdZ{te$mN<zh0u|U^I9l6DG*SN~$aPUS0fL$V}9YQ+9r5pmj@~d-h zWV*rAIUXQ9f+xX_3KUt1_j6@xLivj`=3e3Ha}shhV>(wrWljI4MCx<#Z;`8&bQVs= zf|YYO>Euw2dlm2x-EL+}+D!%-gb?AId)Y4Xa!@l7+g?n`D=^v)w4)2;YVYvBTv@)H zQNacrv9u>QDzQiS^frZDVU@XFMuG#$rX#QxvKhbI;p}i#s^hL4oJl<HmH^UlxsNWw zXS{Uw=E6ukN?rLP4Z&o&iqxp4b!)f9bmEM$<+d6+{%^e8A^<?qw*u0Maxv*J7te*T zG~-F0<+e^`=^@f&sgex9ifw<F0g`1jT27oy*~P?|LBK*yF`b%UdfGbg_Fl;aCgLIO zzEU^iu)P<Yo;mFY9kCBwv9<T{{vgeq!j-|f4?JvBC3dHR0%<Sg>4c&MmWO#_%k*l@ zRxz<0L}C1*uBNeb`Dn%4>xxQY6Kf&tiVLGfIT1^h`w1#TG4rr2(Z4y74OsJ9nh0q{ zAQ3!^M=$S0nj;y)U~o4O;}~X1SDCIC>83#<opFC0lk68u%KY-nssTf4T`&xy?%sWK zN|=z1;n7y3LW{d`=ZN7(2%?xkQU)AA=m0!WIKcPbPxzG45w={T<<cr_J>f^Voli_l zTvsXo005>X)0e>W%YA%HEfhlVM#{6q;TU>Rbg=Y*Vn8sz`4%P`oeO|Fg*{wxsM6Dd zVMKRP$;=X<4<AYpkK`eY;TB&i&J{U^@?8=nqaP@=J;UkQL}Xk1>M%K0#wGSZf%<BY zlZ4<vCNr`DwA)ZrM%K6Zt&D(uECT_eH5?I0Tz7OJp<e;c?HI3=(-IO*bvc_Mz8Qa$ zg1}y_2MoD+^q5U)+U{}LNp~V5kzrmLeL_8BwJ)>f&F*%{e5T*9YF*Ru-e|sB-besh z7$gIeVdCHOh+fotiwjZ`QI4dtzdLp@n^|dZ1Aip2jydiIlpfhdfV>GWoatozcmPfW zv)#g_Qopw(_a<L}-8~IYV++Ln7G#oXkb}`aaz;4{W2<r<HZ*DJP#Dw>)Ay4sPbUP8 zBgHDMj{Zt;LXjn1lH^SNOe*+m`jkO8U5;>$JKj#ZF6t5Ff4ZVgsu2wcXvw)8<1y=a z5B%#ph}m+?ULE6U44sU--(CObFFNcsN-NY4PT*@HhC{jmW_ibp<pv!oEDQ&g!qc>X zIJ{MO_>&cJ>hZ9{Wrt7W4OyQ7?T-uQVxXh;cb(MP4rWI^T;`SgtdpPMDk)RIO~aYK zE1{LwYr=(3KMHMi?Q&f$!5~t+;Wbj`2NrOKg06q9!!$iMX>+x#EQzDX6v+gFyJq1? z%*Cr(teqf^MEt4&x>WRtE-SjIzFIOU6OSZd6lz-|)QXgrv<@<Qw&%^Ai6y$2d*js8 zk0N-a3W+=yB;lHx8pf%r)SAk`3EVa|IHR)21X(VOL2V5-eQmct%_mwGX&`NGcZ>P% zY92?aoVb?f0X9)5EF`EQKC)&t(ZA(>K6eX&EU-#Ut469bwFp-k2ivO=s4CjT<04B3 zS)O_rs1WZ-^ftm7v_=)WE#BM4D=S_z@s$nxlzCjxvRaJj=+XTK%1K6hcuJf*WDSvL z0IgD}q!^VTQWS4SbTBIpf>D(NA?)d)XdLp7wnNMWwH6z1nitjxC#Go5cEvO<pcfj` zv8qKxi5?a%5Tl?(7zbEQZP%j3K<{N%ItpY&|Ltt{(f02h8nEKcMVQ78S<G!%q3zwK z!&~l#K*fP80&oK#XN(6L5VXSCXt*3BlmAS1i2Q56t2IlKcFmt3@xcQ?N!R$BB_g35 zcN>kbLY}~HKY#7VVXb5?^CY`1XY5c|&FAd6DXz!6TQdL<rBiO4&BPz2>qtsE1-2$P z+bBX<$ne>8H@D#;0fxY~7h5rhj&%WnC@ng8a2mhD_H;YFJ><|;JW#Tgl2r&v_sgel zv)hl61s6|9=TBhe{^ST5p>D|x6FC?z&4RCE(lho{8z+0*t#gxcpsya_bP8o<J#u*K zN6f^b6QL|&UUcSpMLk<Hm2QskQLlq%nxaDqUQ~fY{dvO~`YGRqgAQ&7DPzYDaRnb8 zl{Srd;S}Pq+abE6zLy!4qu@iu0c-=bc{dr8iwKE;wKI}#M}0ye#HjLyI-W%t`7%5- z2RmRUo{yMhLpFg7!Y|#D-mFV?pI=OHdP1?ZL^p{Uj$cnAS_9}}EyWNy_5}4EA(Xkq zRV5Y2OeAc%q3n}W?RUU%c>Z(t?Cxrz=17<2j%(Dz_w<L38fam={>Nap@cQ-)ajkiH z0E*{NfVr$7g(`x568cH+5U%K`b+XmeR}H5tIin9tNd%hX*WA^Drd22d>hVG}0kY>f zqH_$`pwI_No&G?uTn~KpyNb!Ylcz}KO9C7VHT2sJ;rmExYxt8BTZ{dXM84_nb0~lR z?Fnbbe)YBc?=$z`Z`^<X-Tn7>^51`iX&pK^IAZaC#K;L}-HwT9%ya)7su42J#`E<p zZLOAtSb8p(vgpOqftVKgL1Q)5b*V1)2LDBv>is77YM3A$6MoCpnaVr!1G_b9Ld|#U zG~mokfAKO@(nn|rwX;&WTd^`aZPH)7yN6{R`>-wQ945XPDNtdjkkj@W`wc}7^R#oe zQ)YDu7NImF8qVh}*U9>X1Fq()4Xq_mLsfNf;`hJ(>Q}hn`G=qu`K(b`#7z1I0TEwX z1w^<)DNy~{GYnG>qp|!t33~D&$rzD-R8UZr9XM{0qw%bGSLll#8MtC&2@jP#`f@Ds z+%Of|J$9@%)!f*(cN!o2VzZpi5|ON{0`eSZo;@*3X7@;-_)-E^7^=dQr_rG{Yq*YS zW{vrVh?Tl-!Aq(C6i<Ra&rvqiJ8x<Q9xGPGVJg&m>{x9&!7X;v(<>OcT{Cw1AVt-Y zc@=?b$c}**5i)yQgg8Z5g}%I|{~dPV<X29Qp8f83fB5QGY)F%DWK5G!Og{hZ>u3Mt z5C15W&P*rf1N`S59#4+A{p@%D@rMGKxFctxQ2H9?=zAA>fgl*XM2_VrWWbnOhpOIi zDMvX&#L4^S{u?r)-YcATpXhIY0V+h75<iKKcO0HN4yw}?#wm|ZZM}iPl<04}s#7of zJN=#hZk-+a-8(#nu<M7#Yy;;-D5{v&amwlRMKQ(9*RZCbcp};k?;Dh<`u`yAuzBOf zdJb16ru#1`AvBhi5c=Co2<T2SV1KVm5N3m@=Kl}o!a;M#lF{f2$?32dus6TgrAro7 zwpI5ddoLOELV%ZIyP2pm(Cf`=5%vu+II>~7f2Z!wR}V_+A>1g9j|cF~P45v9V1v~H z4}v1Hlo%^(tM0m~#F<FP(fW2q@!$p}Z@TM8PUCOuncjIBG=~B+)(C%z_8tqtF}enX zx7%%jFtMRyk+_>(X?W>a5cgM$M^fT`{TK*%Yz<{w;Osaoo=$aFb<*SuAu1BE&?X_H z3DOD1`<>=c<V4OP(czhQV4x6j6wmt}JZIm|i|BN`#k*NJw@p{|e4u;w)t%Zs*gx*s zW!GQqA0^L@^5r+HbR|y4^9WM;pmkP6F=>ryA0EaLDM(E)jH^1F>fq#qS^H#-Q)#*c zaE9aUe^Mlh4C?MdazG=uNbve+kasp+ujUUozA|l{&g&JS3>JBpnsO`nE0>{hB3CCn zsToR)`tqvvp`J>*iLAR7PEzqWsWUN+L3P~%m#iGQ?oKvIx(lI2j6^kRVyCd|j7!rb zc#Ay!uf0LQ82I~H^7l8%-~aCa_WF4Z^-OTc^(8ytr!6N%2;J%}b8y_Wk;5<y8q3l@ zpzZGJYIX0BV#x{d4RyP`T@>j6rTrHgzfetqGC|A&3xeUp2DzEn61z<-`8DdBqk~|Z zAdwSj09pfV4sd!J<Zs4{#TdoSc$JC;EXTcDq8<+SAo6%J;?_g{-Sg9Xr*-9k&~hp= z%bd7BpZ$W!i4X>wx~h)>M|yU<NAV8ghL?1FCB^Z7he2^0IS9YEPzixTbMJ>f2FCzy zGrq#PEJd`1L7p_%<2lyLsNo%=I{sF2(h&2LpH0;VwX5?E8yeivo{jVAqYcW_kJIze zWcq;a8x~-It+6{+p^cx7@x?1mF=D^upwUmr??6UKjuf8q!|f1GQ|>ivu9-8`9?M_U zpPH}6Q?{AjG6r*}lrV<NBl-U7Zzm^6I^NCB$Q--5YS0l2$=O2A?CDoDrrnl_tDTY) z{apxb<5xrl{@bi*`13F3Pj6{Sx?(K0<4+M1PW}qmW0cifq}+hw$h;w}a!5bUuI!B5 z&dIl<l(d=yLUaIVRS}wU@HV`P*PIY+DpE;Uqre4L0u$g<0)sl~P@sAA$)oI`AR1ax zmwHdX@qA)+0cF4*n1E2wBcS``-MjTRUE^6ivo%_s3HntRStniFH5o6*F#NouK*AEI ztmd1SSy|S?4Do^)UFI-)r}X6&*dO^=N#ZU@gdwq}F;c<AHixpmtTGP(%3TOth9V_u z4oA?;EwLze4h5Ao9k+PeV>f(A;tBOAVxPKC#6chBuqfq@S)B!m2;jV9cC%US@#a*J z1G>wbeXMz3EJS_{u~K9|vKa9P?;iQY2Bg2u)&(W{<+m<G)acB^=ZzNWj^?9#J4^ad zSWh=N!|@0A%DAvZm3J(O;(@SNH&g6_f{7(@;N(@aCV6bUOw!6?kMUHYayO-vKeEM* zYh4&~%ySs1oHt4Xl=MxuIUYNpj{2gvt3sj`PXDep`|WM!c@$PAX$Zkp)WTW_Fvd5n zPx|0pZy@Xp8I&;pSV=kiF+-R%$|L4yta@hQth@WHP+U&ing*7(#+beYJ^J=8+{#q6 zwP@{byU9mh5Bi{lmd=VqV94615DMJHBdoFS5r80pY{)V`EX4<_4l%(kK446dfIQ^W zrTGjSRQK!<tlxhv**#+QBUuV`(HP>u_TG6ycBQyw8DFA-KpVUjaXZ^kk}dtBdc<~U zdj}I9@{2rHyWMr_niyl}PJPTWK*1@%_Fs7MN?ZhBlB{xexOAlq!{u6}3!on^H?#v3 z4fq_2rn%}y{+Gw!oJuHpbF9_tU<)den}h-wBVEkBp$(&igNsLwQr$L&gN;Xy5S)@| z9<-%_K{`1Z(S1`8Ved1CbW1^G5>JBZYkKTf7uJXf3FAiN=@`#JeVV<P?>E#lHCmhT zwA-_(^s<9DzZRUn=D#305S0bvgbI&_j_`qxfJ<XQu~2oyI^cXG&RJFP_zGtS*IklE zoDFb+6h&<EN+UeoEbu<JWJ{NZNu7ZBloAsOsUWHiW){;DNSD7&v=B*1**AT+>bB7~ zS_N@QKlqp7X+U7mW)<gEUs9bHy7pMYM^awMbUA#coAF(O(-J?q@Isoviz9K#iwA(B zI4+m$H<pH`k-{C01OrTsEtr={4y^mXa(h>>tTZU=8m@O>L&iAh1l(`Dq11vKOlUGT zp(76QzNIKC_f6KBHtEsx4Jy&hkLvk;Lm@jmUW^v5Y(cddbULA^;T0l#ADbfX&lyPs z!ZkEc0ZItFxb3cYrFmQ<?Qtcgk%cqK;9trF$-znqBl(3__AnvHQd^T_wD}qfd5ouU z#Wskn6$kRIqGca8ox8*zTjrD!u_vo>QBL~JT!c9)6t7FTwkNNe<_wBIz=}c7k-Sub z-Bg0fd={5%NMLq3$a0Hwx|Jl}x2}?OQ7JERf~PQ0vzw@2vPQI-B2cA?^uf!G1G1F; zc{@Rbsfi8e1l#b^P;<N=zhBFBbwagsoxuq(f!&3II+2jzxyJ!o&*J|YqfFsS6a|aE z)5tzFaJ~Qe=SXI2id1wfW2Vve9u9J8=8Tzhp8eQx<0o{f)8mtad&{?Pst|E~lWyk_ zgm8XGt=anH+6AuTmgxqPI|;VOstE#oL$f@1dM!5XNy)3+^HgkrT5Cr0?+(SUnA<L^ z*6k^~AQJ@yfi^-9n{Lv=+K>H)jzV-~HzqB761^a*W!?*2RZ-NnXANi9mf-}f1-~kA zD#%e05fnP7AN9QgLN9=&!T4u|jCmAgGH|x+e|tbgklDAJ@uzUHSUoNs7bqCAoxXp2 z{{G_Z^3~|{{kx0H=kG2JF5iB5{=?bjU$UPP!Kg1RTk(1cWWnUP<ptXSDx%D&TQ32V z<|SW}D+q=d5`4eI!)>_Usi_$Ld)t7cjvZy{mj?QX7fTWF!5IETr3cpDyEJhbHI_x2 z{}dAo$yBBBpJG)5=*!#v;%YhWigvPhjQQ+lJdtQ=fm?eVz56+<1jUnkz#4f<78B=S zrCCn9?V68gLFY_Mr?W}7Mr5PZk?IhwZ{faFS3~sH9Vi1(Juf0EFST;J=O~mzo?jw( zND-CKz_hgZ8VKi7Zbt(@x}+z|c|<6rn|++!l_nZ_up-uJ&-HBbah?lt+APgyi+^WE zJd`kyEl?AC(^<)^MrKfNxY<QlA~xYrbEN-p9efiFC8Ho4?y^y#eOPH)yb~m`6YHCA z3};if2T3F$bz37k&K7vOWLp|9?FPJ)&_oPq`557!EwLawXUd`<55Zxgf-4iZqB0)3 zLAJ0k0c4Xp#l;`2ZqY#*eQa$GW)^fRIIn(q{^tAVg=Hwl?w$&AFul(yLa$J$65;P* zQ6#h7VCgpiK(5#RQQeH7@904#nbn1X=}S<dcaci0?;WSO#7Ds4(&l+|G!}foKl`OB z{s4SWzkB}f-K#fc9{~|#occ=yO6lex#51GxxoloBdgPA3hTDBk#p<)Rz@*<NNBIJ} z0}gt7-?>N^0PB_r5pYvAGfg>z+3drAwYeK_rms<c0IwnWkWxp^QzG;DwCr|!*@oq- zBG=_C5dcm+Jd{KC?mSsMDS*2hh_)CxM&?@jHRi~E$&ZMXP`P%$8E|F8+NSEgg-!pa zEg}$}-Sa*0xIPTNH=%KEo&~6!&6D<e;Ow_sRGIv85n>1_yEKxTA=`F0`;(K?_ix^R zxHx})`fBul#Y)88<c2&^ChPb1{KKn@i?jFd+8zH(GQwQ{%xB_JP=NAgznQ&9s2nbk zYg%$zxb^yhgFWqLukl<JK=uHG1(3q5GP}x<ujvf1rv*K0*lrW=X*>gThmuqOyO$r% zUM;E8gI+o+QSZCeV)p%qH|?>loVt-SW^<e8ba(z#)<6d`HyPl9G*%Zgq74+M&-e5I zcGxsuh1YEy{Q=?QjMu#iLwNKTKBI)C+hOZw$7^eOiZ4O|w<dT*TF*D#0(HY2XxVVz zy8<E)u7F5o5KdJ;3^7Ocm$S8xt`Wn7AyV@f*-fRT_J$t;2P0^#-&y+l+zcjIKWCj3 zIEHJ)3aX>2qV*0J0}qocFZs!MuaF!*!|9j^oG@h3(SgWGyodb?MJ)2K9MehW+al(l z_nRG}8#*@`@1y(Z<bd`;6rEOaIB-U9XJfUkZaVm&pmECrcU-0~XP-Jw2g%1!uC-?I z0jD$S6htIrUMZ#ck3$J`fg~gdT!;6IBbJ0YIPT;_eMR-a3bXraO7edK$^S=LwNByO zy&Z4$Sr4c1m9}mxUsXhK%V!mqtSdp6fPl`hrxm9^3N0LFJ!`BRfx>9YB-2qtTlwnX z`(cse(stRPtpz&m-M>n6kC!v#aXVI536UDGqHMmz7Q8UymuD9U=9PRA8Go2{6XS+d zlBtWUA~f67l!{#`7?tExMMj7D6+ETa{35cWX=_2^gHP8^tZb36-_GC=?2<)`H*};^ zU&)zyL%j}mQ+O8N(w&Lpm&@<uzOjgKRj|Gz?xWs--c;p1GYt<vo)`Q-l&!!Smx}2D zex^4sE+)5l`OFd8K|eV;dw2Qj!<(|3%oO1MoVPc7%V~&32<PwLP>7(S&S%&nv7zrZ zHg8ZL(0d8-(pRRzTc*+*l)l4r?gOL^M?5~gwC(|NtEzD=%I8}=sB($CC5OXuwfxO& zvEDuWrX~Aw0B=(wJ!9U(Nq%?v{Ia|eVb+|7O|h(hC3X1fp7rCQp&Be>)!AYxDQ^FZ zR6xiT0R|<4n>rx0qL%6lxxOkRJSDPoI5LI&NKy3wakZR3aKTr}VXE`eMS%-N*PjNk zt{VZhA(Q<un;vggKFn@{BkUxGDD?#KEoH_BWU`>D@bZTA-)|GWbbfgC?&YfwXYalx z`|<9wruazSij%}ePKWI^wgY!G7tno`xFIIv0-4~vi5_4sF6b0lEbI`_m$2B|^V#Nt z&OCH?JE$X-E;?I&d`b0uedXcCa%fDAXUf^zZ!iCHUbVvCBV4A+Rb7jIkXpuU5+ZwF z?eQa>_?`2CpAhO09{<P%I))MW5epfwKdVjOg82?-bnci-3Dv_q3GKv!1VwCb^Utxv zhv|Mtk5I|fD{I6P7<gu+tiQgBg%g<gr_`MDuVQG1bjPHNs|3DJnt7VpxFktN?aDd; zzka#ftHad8B-hyb?;@i=2^9X}4PJOkoZzqQ?-!gBdxG11FpCqns^@O98!O+NI#~Qe zV=VrC;8?^RNKU>0wZ-oP9;(K9?aOe_rXqf1z4x2+&Tcgq1WSkZc+)L94I7f-fE2X4 zT~Ns?tTnGW(N9&6-C$;a?*AGA5mq`OOF2jx!O6FrX9Vp1^>wJFSF&|KAh#tfx-uvZ zKj@p7jbxaw+>gpj_=9xUTK&NUi`(&hdRocjqWrFMY^xkwx*c!d;cg&lx!RZ9J3^!L z4dO4WeSSz9sU-5;P*wN(p|GC|R|jy~I-6c%P{Ok$O$x;#B{b{^O)`Zi((kJU9BC33 z{hLyX$2<LNPm7rT0j94u7ZjS%FSaA4-nbxw{!G3paa;esahu8$!A1P%*qZ3hGXDCH zuK?M(Hm-B()O>|gW$`oIXdHx+9AO-VOT`1`V9uS0T$f>2kqKr8#X(AoB`ZUN!lmcj zF;@|nDIM2p=bA0=^)UNRYJu2V&W9l>O!atQ$0v&0S$Y6injrCa&X0MM)KLp}?uCD~ zP6o+3%CZY`elAHXUS%z3RPzrt8K2kkusK&MPl?J8)Hr!6Z|EYsWo@VG0pks<Ofyp} z2U;2{5|MfL)4rR+qSLj;68(E+0jW5<vDA{3Rh*=<yXkOGicdibOFP;8WLaY&`Mom^ z@}FcqpkmMS(?%9`stUjZfF#ra(JA1;B6OXn;Y1Xw<We~m=z>7X#W0eaT-9OQcC**5 zELypd>hT2fPnbr#m`!m=i?|+K<Pwup(!~Uz0-xNgmix)&F-9=xxW7vC&kPvF(R=B< zn(mPzQ53?fa)SJpHh2<Ov4p#o8r~&_Lwv9hSrX8{okc0-D1i@j3lp!#xWFU^67ghr zNAvwEzuO{5#8G->v}RZqtIb-HFx53OsKFt{o(1nL0f4^?6?2KYW2L-Nv!_O$;qnh| zr{@?1e6Xd{h+X*TMs1|IG%eL)wH<e;69O`)^GNWeW4=e_4dnNBnwTw-URf3|L}l4j zDam@k6cgOwrFh1GwCN=^f80y#_Zc_h^{~lzLKV>n_r%Y)v;B0%<aEoKN3yx$0t%=d zfvyg25Zhz~UyzCuC$k^3k>eKRwb7GQSu>2^q~fZpCoeUv5fc3I&RaF{sgTwLcd+Mv z!hs1+^u)zNCmq?u-0<^BI--E!19p^ULiwaqemN>|s*i?i%KmCDD*aPG=xW9wgx)iQ zN&;~dZ<<oX6yW?Zx?oUFg)5BOx7J27zNYXfnX^RyXqVB70sDR?z^S_1F}%R(@_<;c zOM@c6#XaCnyA$5JgE5Lu)tJ!f&SupWFOse$hnk}2K#H)#lE}*;ASY%v#<eBa>?&KM z*z%CDiTl*Kq-<R{lw9t&qHDpw_3m#mK_XCzj|mSkVb_?3)2EQ4Npp~=qRX;S^On`l zTt4veIuY0fOK|MS`2spIjGd4OUls`CAQwzt#YN}b#zgp}wEO2EG}|DQu-w7pKp0I? zlI=GXdV>hiY{OAumn`Bx%2}%Wibt^dfWrNWwEgIBx}|G@(BDyiq|tmw*T=}~n?Ij^ zq9knx>xwG;K(k-0?saFck1pNot4k01<-vXV$5()M(=Gqo0g=D{B7gD5zo|&ctzzOW z9=GmjZ&!&B@QbEINF^ah%VbICT<gN&RwAm*35u;83xZbT@x11!CB^}BY8q@5$1LAR z@7-qBVigRL6e!n=4GiUK(Y&!dM+rpqm8}AhzeT~X=tFxpc#gDWQq&d`q>^8U;)&94 zz|sJu6kOG`dw8#(bj9#sRdi^sZm*;`v5_m!k!@ayJP^kE1xq|FvY*VVbqkulA!XO) zspp{JX2$oP^x4ra%p=&_Y||=lN@f#?^vkq4KjKgvK1)&)IDszDJY+avO84}pwH~`# z5q_xs0G7e(l1#ew2iNiW&%#C-uw9z0Ii2#$F*!q3(WZ{Puk<HTaqJJED{ChNrd{fz zX9l23yBNr3MrBQ%AD8cUHmmXl=c4I}8C9)I5m%1$8^0-P%+18xDp8-nVRu|NyV5D} z08?*UDq8MNSGZ*9@9ru$AxLg5j0_*dsPq}CzWO+mie_w&yy?`-h4EM7HLhWB*<j4b z{Fo3h;8&4$gAIjVV*Kb!h8lg0u;Nw)gkk}$>s(tvqX|{xseoY}!!%Bi7PG+=n%6?N zvm3H%C7QAQO)FaBn2C0xBfsa2n7&=CR=eBEk2vbWZM&MQvc-8LuE0F9SWp?Qrf6?x z*!yW<=QL0L2L)Y!HGMIoX6tTziQ)?-5*E-&I`5w2-0Zn|jndgx99+9cDxsvgYXT!# zz5$?GS+X1H(5G}TX79yl=bZC-SAS}jY-`PVT7_P?kK;SzAe<^DCor%f;jeC~Ne3q{ zg?C+YKBHKxOF_eyJPOe4b+<tUm3Vb264zXM@!;V`w?NxW*3gG<#?%pt^G&rI;)z@U zpfdlGq&W|TN$$Lplx*CMuec=SPQn@Wer4^jLF#hf_@<1`vT#oZy5^suudq;NkzAco zka0@GP-u_WBu45*{-o>`eF7H?Yqa`D)C*c*@>KK&x^`|60^6$Oo{o}&oesaa)=ttq z7TJv*g(CqznuItXMGiZ`u(>nZKe3(QNffeZfiw3UXyr{Hm3zk5BRmrLjNmA)O^`~p z^n-08b^-j~L{Fl-5`+-hPXm#UtP@|rdBF_sI8)2AMJ6*`81U0_Ut4y<7~5nz11z;4 z8%{UnupDKs8Hl|*q3Gk}SI$kct&@snNuc`0C%#?bM{{>BTEu!qm9I4=Njrkgjcr9y z43A%-m{?I3jiMoEJtS@|gJADTXwM{tposDD3sK?ngARO{4YGNc3L#RtBI0MogwN0) zi#?Sr8ExfaLyP+is&I)xfi(`ORba)pfTn23L;L1OrN!C2O)nn6%<$Pi@ttASyOm6q z@7plmIB?;TSFtx`3Sl)?ul#C)P8hLGsFFWiuc~+<K5$$tuSl3UsG_(vL-sB00yylu zx7)WXqz;An1ej!<&+-z0zH5|0NPXQLmq8v-b~8Zdc9_nU6ZjRDgqINI9)W#i7+c!& zA%v4+NjfmnROF-0-dF4>n9p&fs%#Y#?X^4ZZGPO2z!H@G<UIV=<V<#*_V3_E#1&AB znA?1M?aJwiO=4CP>=ncSTa=~TYv17_@-(*9?Y9oL?{BEw<$%pvlwPlsJa{Yc#S9VO zdZ2vL#Q)-KJO5~F*~pd+j?NJYZFAb_lPJ-@sais2e3C>t?RzkNzLb6wTsnld+2D#K zCF-i4z{t)yVZ5TJ<@9icB-LSgGgina#qwQX&|!`r0f_R$b?7!2Osi428HgQWdTz(% zWZyJTY5a4y*vr$mey4~q+$X<kmxL0)SH%pb%wxdRklmb=^Je2i78}3vt~9saU$WFT zDjJq62)4NtoAz7e(z2tTXmly)hH0WMHT57t_GHFu&GEN*1dt7>7VUi1v^XP1N+LP< zay8o>P)>ad1w)nxB64<m^lx`;M~fc)6H_r?e@(|Ga9t;S_9^;>v40)FMRO0IE0JO> zZnZn>C^%86HJP650fAillH=x>=nFiO!t++=-Aobn8f4n4)h(r^Oc_`MhLwm&6cLVZ z3nZ2sQR%G|Uns#rECD|!IkO}I#gcn2bi$`6xxV36O`-T4fIWpHj{KVPA$Q8Jm={`F zqcrzqRp`aCJ^LNfI+sy~q+$CV4h9gy-FzHzJq22Nf-<y30NrL0&{%FVaLMd9eI?ws zdwGyfv`!pugSY-O(bKz;;LL&$^c0ovz2etS*tU1wrdXD=eH2MKE66?~eANF@+#q1? z*ETi0%2*&uPXA+MVVWG@Y0`BGUV9k;%Gn7qzG3qx?^7sN%_BE@<ft?>eWzLYLte9> z7Pjvw?Vi7+U}#J4eiJyip9PwQ9P~)+Vu+_lo(?e-NvAv{%Qj!Svil23nr)6dg-A2X z=FRBNU2nUt_(DaDQv@2DI;30i@IpFk`IDBsbW?ac!xn5x4I@4k7P1A-vsqlcOL2rM zAk@%lJ_E~cgy$z*O{144OGs93E0yjG0snrd@2=vO@tset-{_}`^FJy80_iSzsEos9 z>nW9pQU%qzg9lWcwMKc^NR|Rcp(llatptDy)Vq>=%ZG;ywU{v)z^ZGamPRp(HGMq& z8!kxGx16g6))V6R5|<UL?+6*Gl6GT$3nn3t`v|179h&PU@3$bjn)Iv&G(hwuX);Fz z52VKNs%;EzYtGI9PhO|>k|>q>{GVICzvTavx4beLmFZl~en$1uWbnxfCvhEagi3Nx zg%Xo)gHqi|SG-T|6#|H^V!YS!uWR#bMw8Z48G?J^xe5Bgy0ESxpOM7`jxjNa0Bg?3 zuLidiro40zL&b5H=I7;_={sVHfNm$0qmwW?T?6@O4F(!56urOc*(_zHBI*lB43+wg z8L^R-+^F>}h|lIY!1R@iRQKBq-^6o30RSr<*w08wUOx$>5{4ETmbkY6B0D3dg#o)k zE&`FW9$lzf-FbK}rN$T6^26TCbh1eiD!67gqFQSgS4g3k-3wQEJyh61+zh3|+{lrx z&x<<5$0ijW2g=me%*@g3<mC0)n>Qc6f0Gnq2{=)@iJ;RU8|A6I9%Iw4#|k}dvmjo@ zz!2U5ZGvKr2~tD3Ssc^v<mBS=!>h~F@8ZHg(G)Ls51#3sG#8hDY0~A#M!_@>JwDO& zu!|LEeW#&J#e9**NV!|^ppfHXOi@X7r1?Q2CS6{Rx3|wXbiGhUsIx1ye{YLa)Y&E- z-r(}UDe9(2f`4-I=Iq_8)92?E#)YnbA~&PZ_fPN7lFG=Q#M1dKOykCed~2F4%@5<t zkEUKwodB2Enm(Vy$K_=snZ)xqXW!Olz#WIOo*KWz0h7CDoDB2w)#>{Wh4O8lTHL*( zhno|(rzB?7_!T`Ojw3tAl`R*fDH>;Lea0s|kbw(21opk!MB`3(SPc&8ME8M*4)8r? zwI8G{KY&214OD)O7j{)0YjdXyGmbpElpgK#Wo(cWcVV+ak5}S&As*uJ;Fiwq={(8* z$wuZ@`^~4><?8trr}n3_l&6`6xo~nGz77jM`8>~}KOf>ht8-}KfqbDU3I5~-`?|-W z6=N0tI$&TFGXfT$4x~pIiij2dI$+=nPKd6}JAi!T0JZrYGe8YiEG%DMcG{$ih4U$7 zRmQ8${t3r>Mb12Q;`wG$5sbF$em_EW?=7xZgzOrx(l~fPQUV@v9HkFTZ|`Qab@ufz ztu~lf==8rU=C4seWUH?>rZEv&Y{`6*H&nNt2WgXlGS^2dCOH5tnw1nxh3<xr4KV$k z2iPIO=m(@Sb;voWNN}IEjDb|}>I3q2)mrNUVFye~KvnQC#2o+%RpGI-HV#0}5K{)T z*F`Awo<H1VA+TX_BP2II%yaK&XlLCfR1|2nPWJoNb}whw>ZDcMAZ~yyg6=LV&2VDd zCN&zAkOChkniD=k2ppl2nzy(Hh<<$0sDLnrfmxwx#Dm~_RjBY=e}pNM3fdva;kJ=H z8s^w#yD&oIuBn*N4c+=Iy5i|&N!OmQJz53=<JNhicEe@A4^KT|4Bc40GIH<*y#)0t zPxIcTa2m@v(3t4G0vlhe#;-u~J_&D$x9e^qREowm0#~CA#pGOEv@{DE+6LsbGiz5Z z&r#Tjk>fC(_C+m8DsMb;8rjfIfS~YN=~9z9Jgw|zU1z(`R1A3Pa-9RC4`l<P5(g?Q zyuk=LI})BXvQS3*4HqM-St~cGW7%1`_r@jEd!#4}MS8Rm9~@mvkg|uDXqiPQ70f}( zl>{#p2B%zZDHRilG{ho{Xexkf`~uQb4pK`icz6@p)b3mUhOvv$F5(^FN6}5~Ndu4W zB<|Vh9|t|P^G)?Wq1VJ%ZuJV<AeqfLroE3({Pt*FNSu}4<w|VrAk<v<QmhVk7L263 z=*_FP2__|D;lLbhE(EzW!mB)+BJwNIUa-3o_JzO%AW_)YLUB1iZIKr^<d%nMumT~E zae^3eL+(O%6A`xk^*p*J_yQn{3M&W{ipD*jO8RfYqga#`!d94lfY?;+umja^iDgnY z8l7O1IC`Z8mZG$2lv<(S?7>B^8?0df6%80B`UD{hVJi;waI=eT_aO1I6vifp&wuX$ zkc74sgPBIW(H*RzAajk7m2kHjEV`gc-2te+IQX!69sxfXP8<~1?jK#KycdluPOc<@ ze~f!A2m6sl*Ii-WFZvvhA5eeo3Ww6A9SG??cr9T=_lE?W^%st?(H}YU@W|YMCs6x$ z3G_7GUk>iY*=tlrHt9LU`;d~SCnw|SRQ~B;C|{i)>3#!u;}2%u1`;{f4>`C(<Lk|8 z@nVl6J?W90>kaaMgk;U;e4_xvJIc#P*eWObxef_{lM@;N38z$iNq8Jj00ZFkBPz{= zPg3N}WSkaI$8mE6m&=re%KlP9{tr<>XT{0x!<5kS&8rWPSZbls*Yh#!cOqyWnkxq4 z=9jIzoDxvYbHYHZbCvWk*SVEl<C~zMh?O2gGuNb@HsTsl#)Qdh;OYE*bMh<9{xe&+ zuYPqC{dE=nH8y{7c{)$VDNpgYpTGY6%<5}0?DMUYDv_34u#)ztoYN?c69y$M<BADc z3SZLt2fT@{<P^iMoGSP<rM`oQ`|d*DqOFMzSYj{2m8aQl8H)?a%65XFhPY_f$+%XN zQ{9wesPUXK;Eq`iY+ItcZ4aiMBnqvmrvDI3;n-Tats$3d1v)Z$CPtFfD)0{?VlWL= zVbrl-!`Lz567p|16ZsqrxcptjhNofWFPjTV0I2M5{brsALq9oDyck%_yl93h(iUb- zK>#yItYQ|GKL?abm2?zE=$4dCR}Rw$tgW~!rnP(h-0KX!{usykEj!ytt4m<?n%gkk zWRE&yKJBVZw9tBh1rCkL5({+w_5r0M#nhEeg|<66A(P=q5;~O(hqmG_{JKllZNOM- z($dcLbSRR9y2YO4OaGaQe1rhQ+3+KD!=PadcC%<O7ApD&v{tKc(4SiGEL(M=q0jZv znuF)x_v}X^TvTD5$fctvwqm%HDj>S8yIKwerv!5*glXpfZOG=nDCOFMv&3G{O@ei` z&S4Jrmk@1rY1B`Q=*Z?yfpgWaAo*;k>Vv?hX-B$1eoVilkBFVx)yBvV%ZUzc1)<&p zMnAuQfyHt?`p+x>G?uJX;TfeJu_#`_xC<U&+4w5Gtmm!|jV~?MYs&H!tE1)~;Ai87 zJD&nmLq+h_oQjKvkw6E$9<hz9cj6<}vq!}f>m%SR<P5uw@q9GJZp!}V(YeC=V*l~) z4xOR1yh3t(@|amaX|7gN&7e%jsZM{fy%{Z6%JpQLszgjyf(|hIiE7SvhiAIR+igH> z_$Vkw!Kr?M?4DkzV1qlT>PrtBB6P-cZW~Gp8C@eAdZ-L+XSmaZs@Jg;Xl{wnlFYId zfrvJ^D3Il?SBX)F0ujx&<W(?>aW|(pM2Un9NE-}P1Z`e`hZ0t^0}%5fHGpygTE~7o zs$2kGPu+{=VRpaXFa0&mwtet&bxmg>BV=N1sQkW@D+?adQRP%wysBcrV?Bv3=UUbh zVjdUQ^+T;?;omX(-JTphYv(nb0y4)8am3^>ADAy()b)c8GcTapa68Fl<kd@U*s(LL z67eRx%vD|8U<!R9T`$dWwMRegk(O|vApf*M;oFkI@c_Aj%zLPIEGk9}Fvk-$;e&zI zjUwPVGvl9J8VYqYyEe0iG`MsZ^U=~4x7N3lO^0V752WuQ<0OiDydYD!b0k+y*?*yh zjjY-J>Tg)23%^Wf*JHfMFuKL7CPj}&Q0tc0t0&O2r$X;DU611Z6nis*V`-tFxfj*R zvlvd#ZX_>_6jVGk!~1<-Pyi@!9Iu;SLY!$71e!HL?Fokfol%fX3$Dph6Zpg9{t|jL zhoFB!E)j<ucy%>)>~6aW2Te1^1RslA5FEL5Qt^J|<k#vS5p<G#xXQk4V7qQ@D=)8v zDo)dE306Tetj@FLr`a3@{s>nV1+o<Es`w8nI9$OU>eX#;i0cU*GJ}p0s|zDfVF5R7 z=$K{KOw}s5!hM5c4TFbpgvkr!f=}eQI-=9&sm>u+IYXh)eS3p#oKPATJg}^6%P=3L ztzp+QBF9EjL!%uHDrQ~(kI`;5!hiqM!A+$>?%q2=_L$%)B?3Aem#8N)JVR`9z(jm! zNTnJn-QEWx6dAhTru+UicC&QeZ3tXoJU%V)dI*jHXA%u?D<&1#U&t5XS-j%VOJ{?` z(ogB9H9SXMLQ>+_;v)#{(({=Ebq>LgH0zC~H@i!}dZYxt67&lWV;HKIvntDqPE%ov zd<*lsp8V&tXCo;%h5KA=ie!4;(!u^hwzhf7CO})S$jDC_e(Zf{Acc&n{u0f^!Y-Qb zjUdlOFGdc_iqaZVX%P+@7QP%|Z9bu9=$0N=v7h~HwkTv`wy3=fLaM2Wu6$Mvr5R^C zE4Q(;6GgMC&Hrb3Cp4xK(#S|KI8{j<;NoMl4aaDU02k6S4;vM`5rio_u94^Lb%CTb zFtYIwTDG(gJWqCwy-ZKHi-7Nl=Ien*YYqkuJHB4%O8-bxqDu}Kk6%RQ4X~TGoy{*F zC*0zp`A4wMEi^dxq1sNQnC?re9GJPt$w)bGIoii(+_>B8&PZ+30MRZo#9^km2J)+K zKXj$ap?g?V=xBWCUOOdOfCfiwwO2OD@hB*U$872IC@IV5J~MeEVa9v$Zff{EgnB+| z8iPTO+hc>TB<I0X@e|!IeW2nAn85yG<hY8)g{fcdZ4@P-L5?P8H>%eXEL6Qq?3403 zLJqXRnT~4S5qY!Z)v|l*W}V_$aBJ7|;ExCFZYbX-GC%7M?rTzhw_9-Uzy9mj(RhS% zv-z{$=75l(AVgim%D_Q|caJ#5Clu+Vipi?bYF9~)tzjf|usC)1)>1IMC2rb=+8o+{ ziC0-=P4_BtJH`Q#D<JB9CL-5F78LF(Ao0M~Y>MaLcXVzRg&`#bfQoFR<qoC&WSz@d z#9odezJNuq_0HcK%zCZ8Zxpyj9nY56xH*erXzn1rm6AaVDWz@D*xFu>=`$duQ)X-t zDesaHsmzVnemVQJZjwqi(<`74wq4_~vfB~8PZV1rHxdz<>?1|;+>nt)@`C`V|F@7+ zP$dB1YgiKw>rRw)<0|-I6L?lGBa`eNreh7WNRc2zPZEsA``wC4V0n-#j>z8Udc8V? z6QiUP&qK}3kgm=jidaQRwuUPm1~%ItIv+>~t}3KNCA3I5=)BqLFh0{xmv)88XWi~5 zpPLLo@(`Suj2<96Lc*jIB?cf?YJ(F>KpwZ!zAy&Su+?Sz)11Uq*&FP1yCZ!0H6BiZ znezMdxN9^kP*ZXTv`0`yBc`+a*<|lAQ9&yZ3E<MO0a1sIvt^5cEk}{oBzs$19zedb z<H8`lf3alkaPYR<m7XfK;AM!c_?W;6g!=<Ccmyiz&1ypNmA$_f?JPq9W`+*(e;h7D zXVJ|N197D`Wwogfhlyo5eGnTUHo9gwCiW79sDO7rAe>h4LkEIVTZGy;VOgJa^sbd7 z%p;};UGa6y9s!1ZXuGnL%pXW4JPZpVVXM<iA|oZVCP!yCO4+87pqM5zSiPwF<n37K z1$jKE&-$Nf+#xAc(%8v~_v^C73*3TpDYX`zn44+KPr{UgU;yl)#!w^xZ`;f?Wk~s1 z7AG!@NvZ&|O*}Mc)4Rs}%t$Ow+2l<Z1T3)Q_|$Dywz`^PkoCm;%ywAplYzEhV!LyV zit1Aw&J%UNI0?Jam>;{AfrOL6H^a^$f3^vsVV}btvA!d3-l5zNNv6$xfP<cpF-Zaf zP*u7k@7_cHqZ<xXoFY)v&1Fl=)K+j{I$U!VU`@l$C!+1az`-bE-0I|4yYBjde0tP) zr%Tg9Pzc!Xzy4}5zW+m*6OzffZMTH4;!@6lwNFQ+)481L{!vFSvI@mJ!XAjsO@4<Q z;fN=4{D1#j#)vF#6Bi4{gjXmm{(I)r-|wa;VTJ&@{m6d{{I5`L<zqLqUuaq<!o+_J zrAUOuBBHLUS#uVcC36HvYLt?J%^`2xg6i+4-KW4Vq6%z%*x^w_d_$v-+}_A)U?Yh4 zb`WzwohqM^s#r}ZGcso+?O*1rv0N-NqPv^Rq9n&IRv&42&NaZ%EY1XD4CcIrHa~m8 zbCwNoY5OKE^h`MdFBC>Q6x+InR)y>+or(c(Mn7Bb<}V-^A9WL4-89n(h1L^v-px)C za2`)U$}?36!Hzmmd50I+%}k?lh#>P7IU=cpTpt9K<M*iwgPiJb@gPm4-{7iv0o0S> zdx0ZR?2NzY7?<5{{zV7)5eKPXh)B@|md@G40{5@!A#9`F6{cQe<zFFZUyo-AB805) z@JTN7(5_dT%?foq{egW0A#MHEC75TLSeOL*ykT*VR;r){J|b<F<1(0Yl<eB7x;kjo zGX9R4<9bNgE@mxGPX7GrFIqFVNRi8My`qg&w|#*tY}1hHt~O^7?I{ndpSvas*IC9! zd*K4XXxlV1HD;sE)()5Ze(F~K5QVx{WDg#Qp_Wd+6ut(fVf0MkP#fbbp+jh#!YUFu zNjiAHqIlx(v42ZL(ZPQO<TdQCBV-TI)$Uf3CZf@3ZVK#bh9`X01A8>I>{=Tp(wc9? zR7FWv8oci5T&}RfSbEV(&i}%NWCjuTEya~aAtS~<p6mYZ(UX-B!nET}0QrW3C<Y^b zR;GP-i?A-(?{EA@e7Bt8OiH?@GNP#({kK%0-!JKBfPCrxZHsd0%wd%Vp;yHQ07h8& zK|efMevcRW7EcEcA?K%o_X!RWMPWwba44tk)=gB1W-}c>pa>1h7tKD3O&-ENbb5dN zBW+)eZ)J##umjdG3%j38mg$5T;#1%xpx`R&(+~y=1m#KLa0%x)@EcbfM<JCecSsWU zJ=sH?LQ$G^*w;~Hf3=)Hd=H<GeqoJDXM-C)G?k~48HY!-64$j&T3?z6J5%(Y3^8UF zUo3mr!ge`9An7_>0-lWVOCMeh7r3poB7j7)M*Cot)gwDIl90#YIB!38xXAYukc_$W zR<dMGQ&uwiKZhC>XIL-EHqt5)Bzq7f5||+(mZCuH#)>}Tf-Ri;+fPVHZ)8=B3#P1s zIH3vZD%~QXAuI;170hCWts+*w4%&~63XanqPOa`hs^512TtK83)dxUK5DKB39yF>e z5=M9A9xyr++1>ceRe@rO!+=EC0H}Cr?>FDC-)~;7?s#bzXT;9;xXA*%kKI8Me24%N zj0oy3WGM7d@WDOvN-zKuCR<)9bAPk&;q7>rX70Y;BE;prGwRhXaYAOlAn$Lrl*mW{ zyXr#NgKVS<CAh;S4p?{FH%>rH%M*x*Gl{kZ>_M08CfS(xeA~F>6wn|&w(&{E7-$zj z6!IAf(_9Y-SAsJ#R<s8>YEA~00Oo>^)Sc9W^<L^VT=7}WQzq>>GdrZ-Xq7s}T<9v% z<+9RRX2nB|3mdGuHH`Zf_ftbVm$pxgyw|&&F0xxHL~fKKL}KOAkj+v&pW>Ej=zJLW zmz51t|4t~zg!V%!JdVM(0Zo%+?UL3<2%|Q&yCK`2%aJ%Zomj?5PI5}aH-FAMptmJw zc5vsCQ$L`y?rq-i4maQ0WOI9|TNQSHqs>jx$Yuaqfie{?rXn|N#>k@PTsgyIXIM}q z`L}L2^!7Nq{aLm?Kk&}y^=c#JQ~7cG9+I8M?RYZcy`gQ-k%AK87`9vG%}h4(k%KaQ z$8+#yd$wd2@isTeO_4iCa^+oNUy@DagIk(^jMvy6j4os!a#$xe8Ui@1iWx%Giq|@6 zNx%C~Md}#MGhTfLmk5nr!zI0)T-Y>3+FFIvEx|h8BAChW;+><`ZD0BQz-77}7;4;u zZzbfYj&<Q<PwGqbn7eN4DB{#qyODY46|Baif*&6Z1vPIw>@jQL4kZ|*&@%r#1CV>^ zznnXsAyc%xfx3mzRt7@-X~T0+HOK;1-l~X#o=q#Gm@LTDiz%u*X#mzV5DKjBp=Wbz znT{jCrF!Tb6q-^^fH5g=QDO@3)b>Pvc07gMN}V1jw*F6V0&skLaza_M&wWW1iH-s} z`t0bPIZeLb%kHMz@oMVE=)`xT({3(gPY}XJfDtsEaY$p{3_PUoYq)>!!c|GvH9xYa zFO%C<Hwl~7eD-fUIs|kx@P`M3=3sCLOLKvAAm|`e%o;JA9E!TZppX7jVqC(roZ-Nl zUV4{X1%yvbyBV@AC<TCspf0GU?clUV9`E(^^rg}LmkE|~PTGQy(7!ol(oyQP#WWq5 zsFe;px#C5^!;4YIY4P+FSqWk4D%@p}$5)$Cozno(b5?=?khdO8UQEj|k*SzjFV+O? zBVKgV?tF|A<H(i34Gh1|1VZ((lYqb>{FoeMm**5y1YJ*83zRIw5js}{i)YfS1?d0! zboB1^pHD~h{$t2MG18bzR))jba(BMLt>Mk?0WNF7q#&`Ff2~r{Lg<!{h45Gu3gef} zLhroZQA$%cu>fVk7|2~E>nmt$%v)6U!@Izc(sYeh!PKrrE0-b;bb3u3ghgTUd~%#B zP={d25UZ%F+yKo_a^~)Ia|qI?a88PV7v)SUb~s3c=*`Ixo}Ao{w=cN*pH9<JTpfmE zWT4xQ=Ye+~QlCwrZuy%ez53j3=?+SYcK={k^D!>*#BR!f!6wTcUJE+78!pu&jZ1G~ z9Y7Pi@Ey<%&(o|mGxUINXD`oC*<(|<3ow8*XD=zY=WyDby}U@@_ajr$&%(2d_os;b zW8ZZ6pnn>F8Xt?W^gR-3>P(M3b28%Lcq4Z#PoL>0mAH(@2%s$sa)2bE?4iFjc0f0J zF60Ph-cf$x;l%u&Upc#);n~e2I=>-SOpY=>dmJ{a7kmJ9zW<*39XI6nKi=XtDNEkr zbLGBA^5*_16Gnw`#LBv5k5(ei-KB+5Jk8iCqg>~p8^e9k9kSPh^c>R9a&b^U=qYCg zN7=s|gnol~>#6>1CazPYy)fdx{1SSzh`WSYiAMGc1A6aV8p$6WJ!wl``bLLmyd$B4 zLT<D1nH&b)+JDx4IR_KTQoB6B&<jIwms67==&BfUqr`tpCMRb?jtDez^t+VS!?6GC znLcik*oT3cZjwTekmZ3Fr`gZ-``3s9cr=DPzqgkmQxNWQB;+7mlay}E0WYpX#Q|KQ zeV4M+E2cxaBBiEFge&n>VF`p#FEQgcs|Sl*NNXX|%K>bC<ktC5LQde>e+ZQKd6Oqf z_hNM(y}%nWtv(gfyg1O(JB})=(IWjcxbK--;2~&+7^?A&D^p^b+hI};JKmT$w4m6O zk4$AVa6M1z&dB%_r}*`qtC@wXbu6=xgqo5_cO$B}3Zr84bfX~VsiN#=<JWW57U*CN zNA!+E(i)D^JdyvGyf<x<>$uT{|BB;&@Dd?8#+oJkG8|@5BxTViMVd|7;~7m<R9Btu zF0nS%!X`bO|NcJMGLhRkr>dK>?%WTy*rzg)NB{{Skw_%^GQ0*Q(La?a8(g(*WgD8w zaevH~i~+&u!QaFxNQ<FheIxg-R#KXySmOaaj!UocxYcxRH09MFzuw?IW|NvU3LV=h z*&jS0k(_S-M)^ZdCc%1thGB%Q^ap9;S3k1Na1OId)JZY1I}eCdCs#*A<=S|$6&>9Q zeoCpbiMv%0Uyy(jjX-u?^%;ny4Z;YaOi&_J$(4*8?e%8;dAHggK75{`m-T`YP23ut z6Y)CzZqut@U}~nyfNwio(em*he8L4{L<6@d_$Ikr8IG+n?tUGtva$vSGw-gJ>|(#2 zMk$%anfJp^p1>XMiJd&wx%b6R9_Y+_W2cOhC;@M;TJpk4__};XwLj%XS!+;Qz8nao z26jd<ay6O%L>rhB@V0Kfxi>xdR{SsW5yYcyT~zCVmnbx+zS8d)0UA5rSR2D3%=A36 zQZK}rl4?l7SoTaM_QU(5I+Zm1+tb-y5gRE0C*G`Ujor9n*J|#pA~6Ask&AqVW7q<4 z(xtl|Ag$YXtuEwq#Y>CkO;oPoJ%jNy{|a`Q9^i|qFVCLXGS%6W!v!x44oSu~2ZGbl zo=8o7C*sy3$d-M;sN97PKIo!)EbKzKng2nwXY6(#UhZB`Z{^)=x6w44pM$l(Yp4L` z=ouNDXHSL^C7`^U0-=<0@}ipG1Y_`BG7oB5&cbJP{s;NW;>Zzg3?-sXoCkT|;g=E~ z6vg8yJg&uTx_tITp(!^LIPn{{M0hI_weY&tvnM=-#J97-WE;KMZ<o^#)ibBX-ZHQv z5Dd9Le9*h^N-I&Xo>tXqJh^ytF@1+KS}&y4mR_Pq&A2E)<jKwR?A!Y%1R37;C(Zxx z;!Tai)oJDIYcxVo@2{8;3isq4K>P#t$Rs;%P2+1RtyS2v2o+ytUb<reEaoPGH!TEl z3W87HwIe>y_Xh>3pR1#W)$azbH{@6Oh8bS%{N_Kfkf!PJW>e{5QGL69i_2tIlgi6W zWl^L3Nh~Qb#Hs29a!g47oA?`jIX}^aiU>S_Ow5XM`ei_ipaP$*Wg1Co9Ml3>x;*?H z6+U22{MD+(+>k|!7><d`%Td^1uyH_HqSLJd%{^|3Q+Ooz{ualxramoEN-rLdgHq5_ z(SamPP<&hTF+E)1_vt+p!ovD_RLWs_k)SxpbJ50S6_yAYvD-pM06gmI02^OfRnrHI z5glRrP*RCzh6O!AY4uD;15j<$40l|tup4<Nk)_bxjvgIlwMpR_p)-E#Cq<4F13+#U zzo%H|)rh$@Cp4n3c%V-AHOPt2BXn_96Ib=HBO^NDX80AH%waS#0zxYQtLcO)en(GF zq~{b)^w>#76dDq;hgH6->Bzd&535cE?(c1R1>l!?F&#Dp3IGbU_sXgYLg)fzDvD6w zPEf)>^J+^;O}RWlx@nc7UKlS?czn~{M+t>nd985P70RpvLA6*M&3m-FhUUet;Qg%Q zJA52ITSiaRg$sK+;H6Rj)}{rabtQRU4+v9Y27e-4@Hci*yaD2GzkK-S22}_tf#g>o zfBEp)x<2Z!1}AaYTvUpr5)oT4+4HN0AnG`9`>*J!2(Kvy5QE;Nc$;J4AWA*qjUL2a zDOGi(KvkTp)_eIQw0aAkFs^BY1PfPQ?TXShu;jI5+Gi*y*gd3rYM;?#8V~I=7aDu` zfd8ZM;Lqp~`Qd}_e(?bR`}o~2KL7o9zxa#}Fdsf(^ZuXz^%<565~m+NkpKSA?}us3 zSU%dfL}0P~0y6F@D8<#hXqDYYIks81iqGV!Rx`hhekR@L%q3*|`)!BET|t5Tg&O>} z-)=U`un>581ICsQtwf@DG5<~m0!2~FPX7ISUy!aGmqDTWw6fkX6zWZ2A_WRzD&Krc zFja!9Ad76}&8>E1oTE30kt!9}RV_IWZ9m~YGBrc0)(o1gR!uf(O7#1%K1|<Fs02sE z2;Z^QFbF&m{!yo_q+!>!lBAXlp>5}j{P>6XNlBEB)z)@%gyPERu0UC6sTKiOTdoY= z21~zWK>Hd~armq`7BpcS51N38{4vZ96oE&w^eB*|(Z>Khbk{}tQbr~WSW6?UaR|C5 zPsD7K$F2KJ28}`M@P1%yP*RVd%Nm|5Z)}R}Ft9@&V@Q^VEXEN8gs(6^Nr2G7yoNX@ zb{lNc<}r*IoysZ~N22u^?KgNfo!{Tg;ObN%k_iQLl@5~?Z-KB4fumZ5{3)~?s<@)i zq3z*}j!~DUD&~lHH1Ig_oV9<3BM#SZO65WCVV%TPen4w{4-2;D2egp`u|+&nuKnr) z=g~jZ%ft^JG>($P@9bQ7im>w3pC{Apc4_C?|MXERAiwKAS6`8}f|f;vji-GE698)8 zJP;zR>3?=Fvxn|P;%zv#1d7b~;S!9oTkr-@{tbkBaHahLNSxIKHu68ZzD9@+fnIjF z?5iT_XH96>&-UNG^Y4Yunn*MZr<r}AP~wPiYM<eehn;;HjcT8m8L$Tr`ot}^>KD7% zt}1@tBdK~q$44;Fx)YlCauh5ywMLk_&Q?_#@q`=h@b+l>&J#%^Jy!Vrl%F*vF8DuP zPXtFoRl*=o)RvW=sgLwS=#GuMyet%Jga#P?1(Wdar00V2_d9q{;ZB6@=HwT`TK^UL z;Ylkvhk<ey1+<R*Gxd{yP&Z0qcY97y@$nRkqC(0!?tgEtsML}EC<+Or{QijRJg6V} zLDn$gB^%1(ahdPuT=j>2HnA<LtB0WQWOc{<{rs@G!h4dTVD=CUCJ#E%V&<GAoxs?B z-y<bwZ+9?;I$<U^-6hsQ;tF4-`wN<aQ0+ui@cQa|?E)Id&C>UvenKNg8H1RW3>+zn zE?GAqo~KiNzq!;>;JC)RhN^Tg)rurDX*YQKD(7bQ!W4klUak5bUE|I4NZM*!?BKq* zy<FMjPG<LMXP0dPFd8*1zoMKs9w6_ifSH>%f4yDIlX6s8BHjK5mo}{-PZdvFrqArg zMS!2EX`BT1ZyR}7nNST8Aly&Z5?8rRt=;$ho<?K^VQVr^<BCFHyWW6P4iI!{j2<Q@ zs@L60{^P~VZzfM)zkd08^3BU{o_=(HKY9A<&DZ|J#hXWOo=#poyLj>F&Ew>k$8TOg zpFIBh(d(r7-@bYC=->U9Z{K|NTmSd#r;opVeevw&H~!<ZZ@!ukHjk38-+puP?W<QW zU%z?!Wb)>3uM$L`ee;(`&!0V+yn6le)zjB+{)WCUk_H&}H~%K4h3FlL;GQH_#uBCe zh(^!Wh!j%9Zc2ra@lsNsy=SVEbdcpyuJE5d(4s**trMSw>U!iUHL&&Z4H|(YZ3rjs z^HtmgQ$N4M>l+WtDVXTc?t-2dT`vAkzT<-jgo1rBagT2AACL17eMJ5qzlUTY(sxW; z?L=#QcMKPq+;5j39@F_*)T%ToXh|r$dH0?ulENBrRH+lfGq^v;20-;L!@@dF>(t4N ze3n>Py4-;w<OJa6PbrTxMY*R39=&mGBUvC~X*Rke3#|d|WbQ*8!LJ1-FtzT*DW&16 zTWxlz*E$V3!0GSK(M%~q?8pg1jay@v?2`kPr?tly^sJ>ag#7Y{Ain{rp)MDpi<zsu z2ZXJ%Wf#eiw%@|?8Y@~*B2OuZuY3zwGUIBbqsD!t%SpXo{M{re>^I}G6CXe&Ui<^l zl745o;)b;YDgBk4$h&$hZ>RIszfNX1^hVu;E<DZ_+altE3~+seG6Y+|h1eQMM=Nfx z-4Xem*y})YSQNXa0h6-^@=;Qt<!yNMxny{G<MkfqN#bK5G0Bao78AG1L}C|yNK!>^ zR0pV?$#%0`%oZW3BJ7KLN8*kdQ~P>0xEfJU0NQS;4`S>}k=V)Y0(K%uh%n#F6r>R~ zbKx97?41AsFA4;%(oa!}qNvdfAj(uV+cl0@V24Fd2*s{<5J2abI6(_{8nCYI5+R3N zff_eM%;lPJ<3B#S%{L|2Rv)>cU_+SVN7WblK)C^8o$!_(jm%Zw&v&;H=1B%7qfLzw zOwV5}etRE4{`6*gy<A*Qo;~^JcVA2%9q?f7O*emqH)>IL<f|PHAvi|#MBfX_&)j)B zBVoKi&Wtn5PU(yU;5wUG9n%vTB%MwuTg~3ZI}sh2uKIkyFFJ3Gf-ssy0GXnhd!eVJ z=qN_O46!=(l-m>BY`bWjY^UUo;&Bn}XB{@Aj4Q`-mz)bEWkj#H2a(0a{GTC<SNxe& zLOLpgf`VgE&v9m{;Nsf0_Ag#N{lnzZalY7S?GWf?mgX-P2V@GH#m_Nrc0)lD1R=u% z7o+<<pMD63QR6#x>uYS>qwnD<(L@nReOtT|b>95`k|foP!*sEKyxD%(QRE>#xfn)w zv44qvxYCiF9F6G*b{?eA+0!-cuq+tFR=NN{`#NTOCJIX1L|S+c*oHt_@;4B`tSf(> z(042{NwkSkvVLe^)S-Pb2AZveN6X7lh^V3?LbKf=u9lv5xUNR~f1P7b!#{NE5Jc{2 z##g0=q2at>W+B*I_G}97s${hZ3U9g%WDo}&_IG&N2bS&S<@dOpj(y`}`b&{Y+i{Z# zvivG3N5o48#*NSf{?Fk}Q(eZU;?Z7Es=5wJ_(NL47RKfi`w*JiIBZJduh4+F4&@$X zQVswnH$wd}{t<dL?sk&yPv2vkw5K$>i-x*SntS9qkrOl+m;rF4Yb3+qSDSYo!{-|R zQRnp&DD?W)VyDAIMQjUWrIgcNW5^bFtlG({YgIB@==3CPf!Pa)^aPv}Z~z$sAh*yG zaFLs-fOUb(nM;!NcDH?WVwKB2vBz<Xm@M4G%_`xocHOV(sS=JvJ8Yj%Q90-Bg9nIG zcT!BQ*qCr`lh|<*<L*jgP2mfh8P=@P*c;fz96D<ef=8hb$NmU0TD#VmAI-VIYgJeP zUw-%sRa<a=viFyVLjM$}OCn-9cna_0FHe*Qr$O27yW@O=^f}mJTlqBzekOaI!5xt; z@fR+@-7{>`X|sISQI_Czhr2DOPa8LMx*e-Pyz%-KUbu-h3QYuV@QOSO9Q}hdg{aQZ zj}GB4o*SL4*K+=T#hEZFH;@84?3nX_h5Y8gzJ2{XmHqv4enc%au<Rswd@c(gV@BFB zB=I>NYy;0wp3xXp`+3+t7^FFJqEp;ap%+0!pw9m&DM&s3?A}FI5)O5%8x=zXE0gZf zb&)e}0Y|PwuRlg))YdPb8LKtme?QA3%w<<;l4$z9$qai@1pj)sIc|vt^aY7d3|ubQ zXYvG$p3?Kk=Cx2A+>&N!1qTn=1s6?&7b$_#3Jbj0iPm_Dg)&bcZxF43yNb8Nl696! zHpW0Iz-pk$3q0A3WN*u$ROV#|dj;Tcj;q)F#=AkMenqQ7a-+UV_<(kl^;+H1Ck<sx zoijA%amlm=PvB#uM+udF@}{L>++@rJb6*64B|!yB#v>t!BNtQt>x&CjL(kS%o2Uok zvY#O=_x9g;J&EJRAO7Y(T!|i&Llate(vFUXaRrV_A>m_nIV|>nS?m{CUS^6TIUOv$ zxJPG)%3**e4MQ)if@G=m(0zsE+V1wbYH00dY@v0un(~suf0V-fBTX)}N^z%ih$?r| zW+*1>XO{lRFSvjC0r92X;t~%XnK&p7epq11IQjz3AC%OQ=!84n-&fvL2T&=<!0*Ep z%LSvDan-Yw$f4Xe|3iu8F#tmHL_MJtGhdC24<0D&*H~pKXj%o-slFPto2R+bi5CXb zscu%qyM5fy%{@{h9na88cXfzO-vSOQWv)dZxv-T^99u2@&Bw67fbH^#5W)l@%pE<O z8>J-`4}cfVpYox{Id+JRA`5V-`{)i(p>cI~TWDe`8#RU5=$XM^|MccA5YBPhmotBg z8`UZPm18=)*4>V1Dz_eHH`hB;V0MslRi?Oug2CX+NE}0FMxx?;(3|}rkmTi1ixB2W z6#ngR|MmZ)x?P8V`;E$hjuYO>s<M!}!qL?(HasPT<HjZJI`C`-j|mHfXWejn1yh-4 zSu<!S@)<mOIX;18Q+-&;)O40w2gON)=?;S)6Jve^6ex^v+Qg~HWH(>C^S+QH#J}0W zPpyH{1Qm>{1mXU7pvb4h&2I+A$Oy|daT(9NV(r^LVocYHc%f>a6MGWCT$J%?SmIRA zD#uHSyV>kzPaajl7N=9pN>yg`AV`-tl8<tvnAE`nR@39*rpTyV3T1e0pxZU_+{OPp zO&F;sAMQh~Dt?Ro40-TWzk;zgde1hSw+p#8sB?1+D$yWpwg?fP$TpcnkJ_NSMFl1x z622qT2fI6j*#os5hI~^VXvU*wo$i2+P@=LgqRJ~km7wKm1kcspu*m6Q{~cEK8Dp-$ zI9{2zn%jT`Tp$MSet&_MN{uM~_`cqdEhKvT*7%zE?0t;z{ldE`ag1?Yac!pZtZqdO zNOrYTzoah8^JQLw-TRH1Ziot7w~w}D2rZhq{Xk%L-47dFPsi7YKE6>3XEtC})dx!f zdEa%1N;mldV|Z|pen3~XOv0&NoXKVI&@c_;$8IIlIZgxHs^VL95>5;Von42ZOUSc^ zn4|_gr(hy}K;>}Y2v#ay1o!r4GhHo4PSa5c_lD-UJ#OO9K1W0;AD&Y|$hs^z_L-o; zzTrfE#HKDqCHPc*(#sM<0R`j`!ar&$#(=$yD87`eE)%{ugK^_EJhyBl@UEkje4E=R z8x3bYbpwYHi9AE-BJ30yVcXx}YK|kxI2O=IL3m_!oJ#xg15wLp(lSvUH>)v}lN2G9 zU$5R;bSD*&JV}fXqM4v?X+^s;H}YhNXsn47*4!)IfI(b|QU3;kjwsNp;yTx}DB8=u zAvEZgxei`mOkN*KwF$B-R9}L`E=~*|v57=@HvL94@OuZv2N~FUi<>kUK9X0+4`{LG z*N;@zr}#LB2DtLAhJ6~iv;UYKqYnI!-Zc^$@as-nP&s#5%!s)`jg2Eb2L36`A1|LT zV<n4`O69(2po9Me=zuiNdliGA&md!zB6>MJgbQ<L5}6@!<n07Wqo{baxH`p8X%2Zn zSrd2je0tS)ATJMh5AKipPb2+1zK8><4Vw<nQg0b#uR*R+{`JhAgN&R{*bm?13xsa{ z(}daKmb)pE2!mn^BsUazR>I@a<2NXQ-6>T=qQTU}fjkHzP?B#Fq9c0ZC$wMfud~e% zQxtq8wE3s7Oz_LV4u~pA{I56n*db5~>q#ujH9dBh2$~Y3(j6xvgK$`q&k`}g7F9c# zkPMqgLG(VY!jFRXe!5>yD0X`qiK#~+<dx_%yMr_Yy=<GwJ`c^88frgK=yC?V(E9D~ z<!?Ca*~%(XK8NM6HwDg6?*F&C$vBmpoVxW25u#%M1yQVTzG#?T$FYA<->Qw<su|ct zQl*dLN!`e^@*c+ky#D<>ZA<{N*x1AY=?3QH5R%Zx%p!EgxfdOO(J@%VVacO~q3dyd z;`-yB-PAIAX^kO+XL9+04*%60SsQGPaa}ehP*CIW32o_bq}aXX+K<$kXDz*vvNXrp zJQW`w%Em=aC~aHKf{H&wV3a;;G-=V&L%QR#JR_iUj$HBF4if)e?F!@~*XkwK+SPKF zLA$$`Nz4Y5>WJA#y2ISQI#M)7JfczyvDOSH_hww3&aAb3URFM=HER|;tTk@dIm{Z1 zVj`i;e&D+Yl-+KV_=i?CY$De#X1MI$p-KiWc!YWw7DGAgev`T;;LjKCi!9O5JC?*4 z3jo49!;vHItOuoGpRmO>Jz}3I<lt4y;u7hkQf7xd+s)3RZ!uX@nxN1zsUPy*kwQG- z!diCJV;WZ5u&IywNBUE2Eg674<lkYIpFLk({`-sPPib^1D~VJU!iu`k?Q-d->c%zJ z*dS9-dXO2zrnB4O#!N4!6jwun?`~49Sd~Ep$2#Pl(0vC^`4;zs2?Vm{zk<3JwUbj0 zL5<2yVX}&vr?gRzS_p+w0zO}?7L+iFtkX?zsR?9=aT{W=wI{nEcgY#33KbVJ2p@Ps zrh~NVPGz`&L$#t)VekrMba}Pe<8&D%CxnoMQ>9_8E>$)>ZNL>s5ZA0py&_fCXdf#Z zDS@Oui&VvE;0He-6q$CyzLpC#eYazvf!Q3#gqbiZ{R7+!>2xBAvHidQ%@GZ(<suc5 zM})sPxhwp|*@7;|$PN4NfBTQ|aQ;ph4MNqVN*P3f!_SL}?KZsR3<~SRJc0Zo)k`{O zxD}Lvn_>$kOGFCExte&mISTQT?@B>)vTU)zM}#C27`2zcfZS5|#d^BRM_^Apkf`Km zNf)?p+m5p_kfz90hfsttC{~FK<Sivr0tJeSrcTSrV@bFrI-~k%bhqT|!@<s;+r@zd zXf`v06-wjB`>6#ayYwy3hO_`7M+dq70$2GZw2dS~$;bolXcL4;2E#-=`WGB|F)Kvu z3fmbx_I{1-ZhT^zJm8ry($6W=rQBMsIxd%gA)k7Eu)!FmI9d*vSZ26FcG3rUa+--o zi=#b}cLJVc3ddObr0CU{kiIe?qw|bZYIB^5w_!ff2(SIaAD?K93nU?JZRNXFn)3xT zJCQ!h_e4l}19b<`f9gI^sfP1p>D3NtOS=yP(lJ^z6Yl659JPia))lIc8+VDEtdNAC z52|91OR910H)OrOc!|mK;#L15-~h2SQTCp&s^LDStJ<u^G8YV1-~4eR${2U?H>=6b z+3HwEh!2&VtBnngDC0!J2h_0k6fLX)aFgcyR>L|L#BGAuk;FDm(!&mbiiJ+K&_#|@ zG@NP*>?`hH5qqS{XJHD=8uH((%PK>lvSsw8Kh+?V5PBcFxPm`NvEcTKM|cN4?_gu^ zaH2AHol#MTl<|;=^lL>2FJVxw7<&{8iED-KqsARl#_C3i6V?#K^Axd8ob~W{4XnLr z|DLYr5gM4HntmkNbrWGJS0(ucGo^2+(YM-$?Jqv!BIRbbz%Ac*ofH^Ky~gFn%2|YM z5CXNAl2;Qxh4)?LizuG!-~5we5ZdKkt)V&cy$zplt{1Zrk<YT(rwe>0V`<zo`8E*t z%-TZkYf;a#RU_zGHmt=w%U11>XW6zL@l4vvS|tYOe8VJvI`Pf~=NOCa33uY*mM<12 zu&UESHme*3P<9srVIe5VVvdz(nqK^}(5bbXMsnjyS5UMK_*c3MoZaAR*bMP6I4=9Q z#SZB><?5mEH562+kGMQeIR;4Je8qZt{D#2<6-nW_eYcEhZp>DN+*n)$T~xR{K@fMT zp)*tulFf6pvTM#zQMF^I=QKKDop-;FS#@+$C`LI@i`d7NZ<(vgk1!R;bXp%NZ-APN z%VT(6IzT1XJ9Y+mWH|98>h7_fFJ{=3L~2HJL8-^6M1Ud;BnXT3yUkm(3>L@LT6O`e zU;p~oK?vj{A-4Sc72if;$<AFC%EiwnLha`r-CsJT2OZq5um!-&72&Rfg&|j{aoNq@ z5-X18pKJV(t|rm=A^r@xNppK05TJxhNFANeqq4`}xx~c?c(NWahzG?tPgPi2xDfS# zd$^^_p>FLHS9UQ4=_dIcC`pDx4xzd^21SRSIddi84QkbcOaoACSYWpKfa69)FSSdE zG_UA@V%CM#*E5MKPWU+6ERU-!qXlLBiHDKAI?Ck-I1a<~8Xig+R2>I(tq_1*(qTX- z8FuQtgml1K<Bs_%8OO0eoe51lAqdsqbUX~wE(7yBNuFUkUve?|)B&(`O4?zM<ylU< zCC60)3#8TbJ>f+zCdHx$L=1pXHY2f*s|g-SSkT)l(zk_!3<tu90NI*oHSa+gFdztb z0Kks^eGw3><Qs$7zZpuw{*DtHp^U)+a??Ak89IW>r3F{6jyu#nyPNjKM&}X&`8L+h z>EYesDwTh9o+I0W&1S!xfbn=b4d*8)xn0ZzV1f(RGdkU8b$tPnuCo>x?f2#_+zTv3 z!p6-{+vRM+<bV--T_#CAc%dnHo%tcOKKIKRl3KDKM8+^ey3qUJ!vk0&Hk_z21r95+ zp5Q4}D`XkfEe)IbI5ITbLAbk!`|S6W``9l9uG3<TBPl$4Ho61I68*rQ8J2Da$d|4k ze5g6Gs|imBscGY}!lW(H@g$st635%=BBR-AG27wrD%ZxqcLArabF=HG9Ojs>R%96< z37@o=RPNAO_W3V$5GpUH_n#tUF!|w#f}ndm)yw8dfzY7`2#<XYWEo|=AfFsPSxpzV znhnnb-{6hHiK9F|n2ie$ur!M*RTtO?@^L>>GW2-U?a%bFTsxg`ZCQ82LDj2D-edzi zHaqaF@jL2lcauvxXnl_iY@~f4ojdB)i18IC!=&CqfP|E8eg9WU)6))F2ejFwawH~3 zwuxB5^fU25mH>eWv%kLFpcsBaE!w$J-X!f>m?U8X%5s|E=EwBU*~RI#hW1({Y;MjO z8kcF2|3i~LAAyMODHyn1L=(sAY)i7i3-xR=mc*lwDjZ@Mg$Z@RMy9m~ki1J#4#8!q z0<XgWVemvrEE0Gs3|<eJYN!s6xmC8QB(t)lXd%eI*y_oQjBcbaygVs8(<$w)X21R7 z3k9M<pis>!%q#xTA}@d=?Ml|OSuA6}T(i$sG))a^p!^zCLTjiaq7rlogifQBhyl?I zoXnL9gK<cy5%@vrFkU2$Y*_l)UXV*@C~)!qBBkLT58LBG3#%n&2b+ud3+5z$BUFHE zE0hc4apbogVSTO^*OCtI-JzmktZJxs74;$0dXu#-v6@`$l~$GXy?_jCVoyzAsk`>z zfv@;Tr5^LC(eKZxZn3XatQgdbJbK8_IR{y}&CP4@|Lp5Wwvc#jSKwbvEhgFocmc)N zeHq?vt+wMQu2cNr<UzdqXT{wZ{$+$erlZrZF}lIU?<g4DQ}5E~2{rp@x%>mwqWlKe zd`!e-4SC*6!{=0bZ?NIx&2qE5{P2tmD2n`JySt&Ps!R(6^yD|J0OEQ!&SRGOmvRMN zy6aK{AydyZ>&Y^ug24rSxi0n#B5xQxuj=S1!Ltk9rM4L(Jk;mQ4@8qnPcE02tC9j~ zjI@7(B>~^(<qipF3aH8i#&OT&`|<<xEolu3ah<W+?jy*>VN}t#49#zjtBVh-OH}jH z0V|xVD85|7(OT#s=c|wcsH0SrEJRT-Nyu&rjBy+wxpap(!cX|}!!z5F?76Q>sr(`3 zUh=6@4mC6e1l6S#D*_cOi#g*BNbKKmG7Vk_<k%*9G85dFf4z7`!4Gzz9jO5XwPq+S zk$lmYw|o6d(S>5BYUj>R^?<3^CQD9PgPc)nvLtlO%a9Lr<3gPv5wI&NY0HYEg@u2K zu~jZdD~}&(dqWL+%&p`{KlR0Nl?%=ET2B>(&z>ON!(Fo0-c3UL-Z&S4yVX78TE=SS zYj#H4d3#joY8<>#L1wWWZ#o3{v3E^Z04Rdtw2ES>8WaMLG8zD2nw4M!#c_^8Di!oS zLxm{sKA=9iRHpSx1z43uO+{!z*-^0{iEoukB#GAnVVEG<^npu^CSTyp9yW{$t(?RX zDT1%?+^KCARXijS8tr`+G%nivtH`zDso5OHl}^n%jV_#O{iOOSFMbs$CX}iTJc*fA z=uP{bY$;^8iXl+i^%y34%P3WN6<z9AAa!^#UJd76d94f%2(iH?3U~3-AfOsk)FoSX zH3jtd&1QAQwf9M|LS_g;9^3_`H8(EJAA{fsqV`LIbhm`TYSY%r$5w16;za38v8c!2 z`ZJjTl*fo#1`kDfig$+Tn_mzq+Eo4)+nB_q)4r)c2Rc+EjYjRP5_$~YtW$*#GG|vR zrth;B)Az1LhVEA|>=!x3NEq48!#wL09<^A8r}!%OflTe-J8jO>O1gk|30%L$>C^tv zdM>h9SL9&d>kZC7V%DKT#*;(*b%NYVInft^&B&6ygoTmw2bj}mn)B}LUY$YLlWPN? zKoeT06&1h!4}6!mGf1wLPMcSY_uUe=pb}ZfXlwQY{+c~UEnmORpRV5gp~EBbSKt(Z z@ny1Yoe@%G9fTc;l@k=QzMlpI-jJqRW6j^56w2#U5(bmoyqLc4A)39eP9|QGKltXR zcaq-6>zULF`61jy|IODrV{geHQfJ`({IV}zR4E#Zd?Q?ATqX5ZF(wyh$g3&LFKaEc zs<TLOe4AFCm6gS)O|PyXDRgP6I1RRIQGO=K8re`D4Dtk&wHBERt%0jKGtL*}!H})B zzV0S8!=B#!bJUVH_w+qXe5G(E<zCV<NHnUArI}&STe4@$g8>0$M~_yiVj9E~qMrs1 zAkw<|{w!5{*~@JKq^d<DNODs{1Zgt0GO0Np^=z6NKvd#h&cVCl;p<vsil38gB4z5z zinS_@8~C2k5bUR_jVb~y0=!*>m~2hPbX$?{u$lLGY1&Fg+RmT=;aIeSd$zzq8Fmys zVj0~0Qr5H}RHHai&N8H4R92gKiFw;JbX!aUypR^uPpwSwfV{YF<H1+~#8E;wn@R=v zl=DkGY`)?cWDpY!+CvNQ<*-4#Zek&YF{{qgK9PsYSokEgA}zzmXEbp)2`Wir`DQ)* zB=N3j&mUL)GOl<)7UhXSXuNZ53Fno?hKWl{{6_pP<&dFyS{A&n(9=_HqXk`rXGL${ zbi0%lGvRGR;$#F#aqW>o3p+EJU-ocBtXX|(bn<_fB`O7=#;Y@Jp9-<Au<HDNSaOoA zPOri~PYh(Jz$*2SqS)6^I*OwV_&D<^r~G#o>Y{Ip?Tu`$N?{>%$6*Tv0Kx@}zmWt0 zfUgn)IY*{^TN8AoINXq7jMkus#8{bW9bkVtSwrP^x?5vKjk9@^5uQ*OFic=V4pF}^ z06NwEA>{M^Snd!Fb-Fi1#dWGx{7Dd_#vSknBdu@%NVza76@i!_&_CD>Hfup;I1;C; zz&$BRlCLSw1;E1Y@}dJ`ub66>tc0EEuf%X6spax$>fb^W@~xum=|bZfer4<i{f%Hi zlf8jEkp%POYAZ;3HJTfVN=H7QoMVsC7Jzai6URj^92KA;JyCO@#~`2(PM>ow5KigU zCQ9X9nmV=8;R=c5H*)h#yOH;UhFZKc{zX={bao~RfUdDA0NJ*tP$Dg*J#Pi-16G?t zYADW7?}4Eh-kP0~RHWT-=7`5BWm-hqBJ&X?zN~R&GEFL~SrShq+NelO{g%&=^5LaZ z8@2IUCmcx8HfvA`v`NPO5Ak||TEsYy8U>0P`OUe|&JGX!A?E5=aiPjwv(g8OBpkO- ztYAzXd8<&tqJNQ5&oSOyW6&{<U8QU9_O{wS_)FDafri@yhx|NqV=8^l-Vf8&IK&%z zz2`6<Xy4r2;gUjd?QDgP(7t!vUgOP1l#>R6q!a5KlYo5`Oxk4g8Z$)4ETf^Fd1ajY z*`QBG?a#4b_{><TaK`pLkpWT>CU5lbobUJ~RIhKe$sqq<vd<P&?`fMYz|P)fqdVWD zNF|w{7%E*tp+D|=9(PphSR`86UkJ4G$gLlRNQZ4v%ON!=>SUnEwZ+FW>k=fT;iY7N zMtdu1KVHs5rn=JQZ11H4%d|;GfT(xUKBxO6Y5x(vN$Ak>QKUiUY^A-<_f`TNI3QzL zGw9-ZK^_~Cn(WNEN8&K;7c9K2%fu8N5SDi+9m}ZaZgXi97-7<AFxCL0qF-2n{lTw* z6c$oD2nH~BiGi8Z6tB>@JR%PCc00IwKGI{95TA*+AHgH%JVAd|J`!|46blRUb$$Nv zAu$ACM@7UqB93Bw?UOSOnWr%l`t;y|6xyaUcwH=k!W3ku9*_W1qI^UggNQ%Jx#aGa z>Lq3CI0qZgDaS&NV3Pw+4g4$0vdnvM#%l*aE*y#yzWgOW3su_H0!vMzabpyoMI?`J zFr=0<bOYr$yJ1q>hzgxr=8z+|D;QW~LCYcvm`YF}VBsX1IbJ`XYd3%2&Ej)$1rKxR zY?)hZDH>NdiA_}M&TzB2(7tlK*zS>dvn2VUDgK>%qxozgl0^hP^sh9=?g5V&9Hvf$ zf*SHe=UrLpo+Eq!%45}ncZBGJ2lW4<)LZa#fgS@h?$Nwpq|@pPb{i1`b+WGK>M*Y# ze2ooaJbrW5r8eOGYM^Rl+a~VZ59ZK)>7QnJ_$2jH#HgL{wpiA$gqpoh(M1x8^b+Ur z$|*|sPOuMhJNjhxXZ#;|^u(rxibhlp*NwHUsSYZyX2(0|FrvU%6{gfWLxc4z7$XeP z|5Rl&Y5I8vwMDgk`;5@KCL&W;X+YV$de?g3K(T_7_SjFak{v*l!V?c3CnL@sQ#3B6 zv`>D8+04IbNAU;c=JfC6kKYsH?3yF1P#?)9xaoOByZ}4%PXzQqkXw7G%Mi|rqF*X| zDg8SdI^bkSp1S=SF@QBu9U?&Wns}%dhU6CV(fp4@0VJh`?%`+pfvdCHPfVX!(rE?q z=;Yo`*VANN>We|*SoA?+eV)qrm;hHwu;@hS;2%HXV!;E&K1^yH_Jj+&=pS_y4E}TR z-ra6N2^P;k;?_ZYaUEPB`6H1_u2+S-uylR6QNl+@jwIHZ>MdF*Ulcu{d~Q4yQKKj2 zx5Unv05Je*t6^?LW}~QU8HPDf5=m$vJAs^>_}g`L04Maih!X<*M15!SjaOSb5K<14 zOvR7<JPFlWCEk7bTt-gTU_OQdWR!<Un_^8z_OK6`xN*%4U+y6L9U2jrQoB4+ly0r8 z1s1Ky6s!AXTZYhLkLnNa`J<<>@ent!7tk!WH0lJ7TFbgQQrTQkHBLniGmJfu6obPL zf3r>5o{J(s<tK&bim=8dysqwAiX-bFrkqE^FSUomoT9?+NmMV=q3&ySB<*LLSLvwQ zt5|KLP=KaSvcSgU5;|gu)4wSU_e)kZ^xTW8t<Qd@tL9hO|8T-vgCG6KCNIKeyvQVQ z3?M4$hF1)t0EHz&e3!wf4gRu5qCrK8droR&=d~JoI^RSADpSuvIpXV40X6RcvoXKB z0fiQexEe9=MIM6zIlM{&1`EfAII>&v4T%|E!Hb@CMvLYXE-^Z`c8AE}#5Ww7sC1|( zQAK&QN4W<j#;6W*U0Qnxz>h|7Q=MMabTH80o=&RN&=~_EE32LjZNFBACWRjix-G3( z&Ae_8Y;n?+0Pz75m5<R=VZqcZLkqD`f@?ir1~ac*fGof@IlyK*-%8Xf7l2EJ7CR>@ z5{qHe*d&u2c~1&7S@<lhv;$_$cm><EaLh|j%AzB=V&&b1XxxmaZo0}+ETisyAneH! zA>FZX^$|+rOeBwJRqs<8`Y3#Rv^3w?o~V-$pw1KyxBaBbP*o&nzg>px4wg`v=I<k8 zs)|I3kx+q4Zt@UL38EpQzzNgTq^BfA;3!t)gUHIs8bf<X;PA;Lq&5pGu`E~cydyno zr2OU{fkN^8x1GfCbf&}ON4xM(AH^cP>po8w^Ud@FraAKuGy&`yE^bmh7~dplA80u| zIIv7;9N9O1P%M47eHa`Q9MU0M^ChGb3F+tHKazmEc68yB5fIz8W=P``4*Cxz^FMO% zf4~|!pxDoCFv$FG3O?y>yQ-f0*T@0oiEvw87asrnZUDW~OxN+r*c~tT2$tZ;FQ(`# zp26Wm#l=0+g!PCdiC^(gHnFI53mtMtLqQ1a5G;#V2g_NHUwlnw&2}HQNKU=9ROUFL z;vNeWZE-~=J8eUgEC{)HS6D$E@~ZS#KJ}2uo&(bt_JT>A>z<x~f(1|mE+N)n)!4lg ztPyl0f+Z%5<nNA{M@*XZ>SjMWy&yES|3<jz8dd8LH}vdeESeQ@KFo=BX?R`8We~Xj z@`R}z_6|h0;hu|kXLW<1p4E?}_v~5jq2_Q89D4{G-duRuY79;oaXX<@ptuT}?I-)` zRdz@AaCidZL>MRcr1v@|D0^#*L)TI-%KxCXbWL^k7NyF|a0S0I{pK`*!axAO5_QS| zRl3EDuwlN~P;Q_)ae;85p`q=fYnvc)P+=>VWlftw9*&9kpTUwobp;XO(KbUBN7lc( z&|}A_ZH5rBwWmu*DRn9&j**0ASgd2bnoTLL4co?@X#t(sPo`E)lxRzob}~iXWNMg< zlLrV)|4ee=b>iL?^a#aymmx~Mn5otK1zuCSBn)TJJz&oL(?HjmAW=igw!>zz;~u=W zO5~d+bf<3{KzvFp=u5S=TkvQDWr7%gYBEd}p2d&NkLgg(|5ZgOKbZXasJ#;^hfX9E z${K{{&E%Q?D_2)k;J+M%{;SBlO64{1r#+H*vh*Ut`L+;sTDe{;GIQq^7B(gpmIz1k zv;@K)i|$_p9~-E4@3*+}7`_la68IOKE1fM}y2YF>EONmD5P-!lbWcxP=~1kqcgr=N zd_#R<!hga8BzT+>CImxIm;M*ZA3I7U)*xP?t~ZK`hqF9xZfA1r?IN-auCJsU8K!iO zMTTznb8?m2Mja+VKCcui?P&O!F(s_p%L@0F#};$s#i)!k1%!S)u9nB}EC<gmMHA*t z;RpFC2KYJO=m}gZ0K`OXhVh^O6&DX+xkHEl{4Zix3J%{2fLyr^m#i-!427xB519ZF zH8L+3k|v;JE<@2#<S}Itc><q5KQ_Sj0@Y83;$O6iZ4%B-hsRTNcNVd2dXN3Sq(4mo zFsOxO-AQ$o35WL%|FOP#_Xd?c_INrX*Ts}>C*Na`0|gf+D94F}1<^;beqa<qpe`c# zN@^IU9>{<ULg4cyk5BigQc22IYJrkU4#vmLdV&KAG7p7DnU6GCP<n~cVk5<s7pr<k zz<&ARPk7BLC6?Uhp~ygLu8I$#mQ+x5qsBbJIuZh^e=;lR*R4!Nz?yP1!pdY=W5!cd z6C3Ktk1AvoXwTH`2n!(hL(BRIh)8ER;>+ZK_bNGeDU^V1V}1gU0J=7p`iP%YS}G<# zv4p9BmPdRPhgjeqGD~V$23XrHs2{?YOq#;5o(zz~IQHmS-y=@+E@vhL1-nU&wP!^T z{FKr~GGfIKgMWdX1<TM0u|%NhR-kIzel!`*iMWm*!{3amss(O<$19ZH^)|U5h>5|! zoHoU3jAzK36r6G}bsl=3yzMeVjR7>U{ZsZpqRML~-Dv9x8x+H6nda4W7LHGdJmK=K ziC-Zew+P`=N;wn3S|y_f!jyB<G5iz_M9&OU*%?M4vZlnKSOZaS6jL4IYOxN&q8dG! zp&?%S$54VaNCuA?;Bu0$`GQX6Np@!!A!*XA`G|Vj_=5M%o^$=PEwK^^&#{Z{Te-li zf0yyFZiUe=-9%LNLS++?2*4*YT47jEzkjgNTI^qin1(l98RO7w2bRUxlzG8sji|gy zc@}{MmC`dfrF9l66i=fO+To-jemI8oui89DZ{$vQ=oR$+OfG1GVW%EjHrsx=rB|E$ zs2%3%69?EIebN}yD|(Y6JdwRhjma?m4Ad!eICGpt*&EKOu7?{F7Lf=+wi1D^fXVkH z0>{n1?07NVFCXD?`6sA7qZ+}g8R8-xmo`rq8&@_@t9xfqk-#&vXL4;ug<6PAAn>%O ztU)=20VfXeYO`66+{vFEe3mhKgR{~kY;cqXy2mc2#Bxw|)D6zqO$nmOJ#czMsxlO8 zuOb^1Q-N+82TeE}fZS(jH30pT;ngsR_%?S8u|{a0AQBvar(ROU5=+bAvfNP&N1N0; zt}G}%#k8qs?ht<!nqZ7i6C(}aMUH;TaZ;S!ayr+xo4&<+5P0NM$?lWD>EMHl%yEOb zRV2N>>QIbOV4Txkw=43<Do)h;-so6vuoulv%**_KF*bXeii3*7hWHd)J}AxaF2LpC zS0x-@M6-Mr0LB|7g_+K=69DPfEr&A>!I1+(#XqGQxz$Z&j-545@k>-qrOR{SR^<q& z()g8L4js{&@AxRK!=5#GQN37k*K`&E!f5hp*)q5`y<<VSq?0l|R+m_+h_k)ftZn%z zY_OA`ri`QE3%5(pi_!gNGoN(tv9~K+#qdtN+%k8vDczhG$SeA08V+3rjku@gpW;bD zmI(*k;3%+uaI{%brzC0Fd_wsJ;#JL0s*f5lWVOYhi~Q4}o<I^A4wL;CRv&y|ntc5a zRl4{4+tfYAg!fZaLrvIo`2h)!-t}EAW_XJO;bN8A;8oGgakjum3Yk`=`(}Fa&6l>z z5w-k|$!15F+wfd>#N{LQimt@o!ZLhF+tr^}TCAhXMy<v_uSC`TK~-$|_a=Vo=u*CX z#EBh695T{X-oxy8i97${6jIi{ZBgQP6*p$Q_T(4#l$zE-zM*kEv$TQsw^w)?fRT%D zrdhvb_pakw7C|a$5bTgZ{ym=V3hT)_;HQ+k(j0@JY9Bw|n$E<&`gy!Xo}l9I^ui5G zaw1HWI2F8kumt75j~L{ge6+qSDeuMYPr3fq$=zgfiM*b78{B<5@I`PoF<dp_27=;; z0p<LkAcp^QwMl-RyEr^h{LtwQi9k@OwGWfTNUC~3YyF%|I%xCA$``0Qx9M{Zu%iW` z8OsP<cgg%UX!`jM<lEVOO7|Ok4mJ+frZR|!e)1(Ph-yv9fZAbmAs6XOD<)9u+eQ7Y zOyqI+XrjZncnZ~vjcYN-Ly$mHhK_T+BvF;^nT!K^&pNjK4M3RqW5ES$#TK&wbi<+5 z*T}N!`<=Yt?5V*Nz-v4t@QSb4;!1!i$J$62%lM?IGB<_94PL$tWpR03q)q;c%L*MP zhWA@c5f(#HW$(vWUg7Nk;<*SGZYRSiCQ>RdUNQHdtq=e9FCR_bRUnqA_U#GH!$}bd zhZ>~?Kl!pr$L(|hC(S?Ck<X1<Xy~`n5EHOqPqsG9ocYfVFU^p<SC9~hC+=;Hg8tCZ z?+S`};pOOOZwsmLikIuD&}&ro%o6vN*K*2EJe6gABAXpS1aeqn3{kW~rnQqkhiny? z#`c$s(hk*CVclTi{gR1@VnT<hChZh-g{`fw5OmtSW&Y<vwa2mC?51zseYsduV6jgn zm)>DWe@m8%12v#RAM<+&ePiCI8Hl5uXbfV<k@G1G12{7aN;q)HJog|lHjuWhYIJMU zXCPecnXH6$8Dk1u+a819T2<vc6Is`MSZ`b7LVMey8PMR6#g9>oM|ERxdo{E*`c!%+ zg@20ni9K;LoM;X45sW&dQs_YgRJvd@JW8iH;1vcL=v&gTVYhQju4oaQ_VPBYbtqoZ zxBO8xB?}PkXSm$JD=3#S1vRupgIVYs7tiTosv~Sdv_S+e(<|{uay(jQCAK0EC!jyQ zzD7Bb7zPu9kP%4hzHPRSUijG;i7kj|MiU1v20m^g!wB2Owxfz@M5XYt^v<JVb5sv- z6W2^FI*MJa=lTOHP5yAsFqczUyk~1D3v>K~<njZ5r=s0|OPi}Ir({mkzA>5o+l6o< zv6i0w64iY2<?HS$_xv5sRjNwYXDCN!&o0}l#XjBzELl9rlahc_5C0|M-$M)}GmzrE zOKC)>XdSa1knEydbryJh4Y>^AMJzuc$w1r*=Jc*Z!yYQ3W3^Sc-s47xpXXgEcZI5e zI<APd>_I^K9Bq7($8?<NRFNc*ct-xkX1=(xtm8nPP|`bmId0*sc{N!ZXuK%U=r2Po zlSc{F^Uj_Ulx0=YVY=dauMz`2nO)D~8_F{CR_kwy8||%@RnyuJyy}X#;8(0`AM_n6 zY$Os4p4s9H>P%C0Bhk<ZMXrw6gOj}`i_CU(JiixSZPIGcB@PHq4~>V1Kt0M9cFU;i z@L;`d+e^(aS97T1GzG^tyCnLm&7+;dwUf;|3pb?5&L~KL8nJG5jYk^yCJbsIb)5aj zSP6Ed-NUY}DqW^+&U4(Hu03^I7`cIx`Q4!+nugkF$IoGN*zg*yh0wr*REVpqMRb@- zzhPn=O@w{j-GUp*r;$8CWO6~8GGAi|KCii~JWCD_?r?NYN}m%McYK7J$SrSp*&Ae` zjs}h1x`pc#C(#;@{TdgCE0+&}kF79t=5HkEi{J3oZnJu_nW4-u(tBh-QHR?*r!uBC zH<-Yp&~qss@)B3Vh!zRv*y4D(Xtjf#sIItvOk6R^{)UiY#iEbE^va$#;}eG#vb*jU zR(90<TbiWKvNQEc!X4e}DR%X7BzLcm6ujCLMz*F{&)?f(I?X51v2nZkrO)S<Sq9gQ zxD6?eD>j^Jh;@j3HF&qv#ergK3Dp8T`n9HAw0B&<emRETFph*xN^R}hzf-wFwW;}L zy_9p^IvZei=~=vnFzPVvRcH-1e?E3QTO*n9Ya1jNE~nurGhc7oD0y!(V@uUn)P7k1 z-^A6|06tbpC`{-$2eVGT8)8e9Z4e@yJBPyA4U|yw5%=3sk-rLKiQ_Ju`rw#Tj>qaa z^k^}iNmO4d(}e`{4z`X&pZwwd%r^)Py|}1%t?3Cx$?3`lY2ZoHwX{0q4Ni=DmK2{h zXwSMdCOWv@1iJSt)HJ9gK=(y#S;7dTZ4WyATAV3Dmi#>RtpufzLmkyV2JY#6&K<vH zOKyP7`}K5-d&spFP)Hb@`&v6pTi1NWZ_ue7P>F#Gq1UHJzxL3+X3qk}djxdIf<1jd z>)3{{DZ}eihF(pW(#DjXusep(2X_D+R>;6W>Ko4`+8)}^@h8$WXhkP&i;dQ*_~pX@ z`Bxu*`4IQTH@8HoU%3zsPc}3g6L>6p+)m$iVS73-L1<Zu^(wO}X3OD%wqGp*W9!N( zZB8c@3VKZQ=kdDCASP*g*%;_J0%u+*LIKl{fe}4?z}(;Lrs4FQ&MJP#s_?(Bj);pP zZl~4#Kcn#L!w10sGfEnIXrE^|rrtk%!2i+8o}bY%-NOgp{o(=s_wl=5eE$3Ie(@Ql zF+P02uFHS^*JrYsefU8B`#--Qf#IY5MPGJ=#BiTcRh28ur|H^dD#3N=@qj|Bfvpb9 zY-k*w`&G_V{WjNnz`=1XPx2vLzab;-nnr8ANXx4^<?Na}OIll*uH~T3b8SbMtkC+7 zwkyDS@Sv%zLmL{askK9^2M^ln8-99QMgcv`n4)yDpnro18<2rB9BFpg(0|EMQgIA_ zMtEN~mkm&&tvERwA^<V4K(S7I&Q;YD1_nvh;iOv#*boU@CsfjPXjXtf#q}iY8y2%l zNX61t9BvrWvR2&JWcn5s5l>j0LY{joT0*!=Oe2Q3M$ecaQ&|fs-@}eIK2dH*U^f1S ze;fWxk%g~z=&C{OStNAi4PbFVF=|`Fo(}dE<ID-RUyGSJy5QnH21p@x$%BKgu^g@v z>&YDOq$)!Wq?i#_5UYq(5tax1o_Ji*pQ80?0@Wx0Rl3&?6LiQw>=yH{l3j{^!FY6n zz7RgwRuU%sYPW&qMRMtL&NvkbUBDkpWMZUgP>lM|60}hzP+Q?zHC-*mjl7G<wv^<_ zB*?w&Nz)>{aFGa!Yl++n6**gj%3ZEeGnZVIv^K#do*+1Gk?*{?UaV1XBx{kNF_bPw zc#Kcn=+kyEbWQeRT1AdAD^nT19&$8Ya@KB60at~CmPRe-OZ!x0#ZVa=)PM5jcVAw- z{N_7)^6!uMhw@lg1;+n=zwyt2IhMtaufBd&^a}wr@jCNkWE=Oec|1jpL>QH&T^6jO zaXEm-VRL4;h<k!4W}Xd+FXU?D-91*N4~tbP^f+u@qnOA0Zhr1`o^ZzVcM!S-9{hv` z`VO(n3lx*b>BwcM$8S4Gs%5V~n707ZmM|Ou&%&~y9JsmWqWbP>JeD=25Kea=`n;bx z1y&PNT2DqaDKd!A$8fYPCR?g@VUcV71{_t<&6IoEbTD-%#{`NIkt`}oFZ3J2<w%FJ zNe`oVMhnlqgqpNaFESX}CMZSHxz4B1E$udrfUeJIN<R7W)doC~TZV(~sj$oS$;sJb zfa`KT4;+va*zlyAEmqUzZ@&0#-&zQYv^j$W%vegfPNPZX`rLt54$4`?I!l=JsPe%B zGIX?VbX}@#SMjj}%~Jap%gzo|1)?)PO^8F5G=&)LQWId1jKp&FV2Wj~(-y^mX{HBX z{e7QdF-~EVYNQLl^?<<Xigq<GW%THWO{7OMTeZqB2CQ<V?I?$%XA&dqdrxmEd-t?@ z^YiKojwxBahSrXA5Ga2rxhX%K0OKOSFmscG0D*&?jYRBQ*fJBe7T6vdjkgeCQIFPO zp~w093+m_J{^bOPo!&Gu6C9w7)Ysa6>_oNsoo9K1f;J5>5Qq%~P-XJqK@5J1g=-Kj zv~NZ~OVB;x&$2PZ9Jj>8U1J4R$mk!Z@22E!Zx4O^?@Md<x+}X~W(fH~ps?M+O3MMr zdR$Nvz0TvI4Co^RV(NUK(F@LZ8Y_vu&-vo$p`0L-u^SeIomHGl)U@k~)ODRllljH; z{hvDQkH(VN+MiEegKz?AUo6(AA*t=}fTTh=0m+wKP2m{|fllaxJ{C}U2CL=VlhTHi zRcq@p!hqmVL?8FeR~Exvq!B?`Td~Jzmd7q*nI3zbPtgeD44OL0K9w-8>u3tSLMXAD zKici4SQ+HRM~5(RkX<_peFxvA5w3B~Inb?oGx*2I+QXd-IAv8%=e^AaDwG7V@LOS4 z5-6pUd;$u0b(0fJ?&7Of0R18Ogn_uZuh~x-X?-sqYX!Y;&v9B4IOmD-*!7+ab^emq z%jc9a^56kQI4`o0(f%-hOj!nU%hHsf?LAsy+}HGQcAu7Yd2#B-U~$F@ye-#8;X=Wr z^?8QdQy!OXHwRjeW}IR(mSx)fd}b+t6O=ReaO(9m!lfNYQ_yuAO-d8Hvjs8Ht!{C& zB=q9L>XIr=j>k|tjODfsa6Y>Y!U_Bi{z%{2i{%7ENS*gs6gvt2O!`xyiQPbBt$o_% zS>*|tzEMW=$qh4>Rj$kV+;Tw9VVGMqClfU7dm3e3-_a!g_RV9<U+I&x6)LhUxD?Y| zj)ARH7*lH^ko0}zazTwfa5CViTpIDblYZw-Z>$U@L!B>0378Y)$n^`<MKaZxw4;Jl z4#0St!7s+e(T=xPBV$<K#y+E|9J}0s#u3OV6b>hH(MEk6zFC09;+u9#S8g-(i1o|k z@-3g&_pKnGNK-jrE<yR*AXrpMoTqFp_qBC%VwfW*1ECSx;%s=gtOgXuL7L088ClSy za7yl%248<}XDj(Y-UyT^C-(%0QO0FKY-($h5kTW6BLy>_!eZg2aLUT<2_GoSXvik- zOL#caNA%>;^58BnTdWS0M@aM;-xf@~967h9T`hjMzQJzScwY`I*>h0LQ;c8Rrn*5^ zcz$5>ZZQ|>h;I8hDJ{pQ>e}(?^&lBxi(Z>-MLKGLsoZv)kO;C8s!hmIuu*2kAzece z{0LJBlRB41I^5Iu$jaKg`h;;xxKveLt>=yi?;}!ftPGAKok0FFh^mCv(;?0jV*zdZ zJL8I~53MjV3P(wI0Raq=8j@`hy3<<3>BMfjeKB2sNY`WJbz3)&<hI;9?$cjQy^N`8 ze(p<Ff<qQSsGgtx$Xvvxl+IqlFpj^0)WU%(Pw{Jwt9%oHyI=ShW-}1_TMvN6{z>cd zF#;hOvTuX_eAuwOMv=Y)s|;xWfmPNRr>vBIgR}3<q*JmK^3?imk`nE(;h3sIXqzx? z-g`)v;3rY{Vb`$eG{QG5`kdt)rcjatqVvVjInz*5cacX2=>)-az3xFi9JG;w5^h9& zN6(q)eF6AT;X5g#(NYn5eHZ-a@aarIk3}asFyPZ`eznV@oVplP4_6dM==@y??X1~7 z4)p^A=(DHC^+!Q*3Q(Ye+g$-hH~7ww{Qb!@MBpjkbhy8nJzKLjd$hae(inH0-t*1% zVs=*`uaCH4v+5ie90+lC{`2W2N?*J51Q_U!o&}H}diMbV+;=7Xv*h*S;`#lFtSHHV z<C%j0EzIl|b!5BwU#55|>#pE<ukL_AN$@Ap6v~Ip!|)AywMGv71RlU$#Es$Jr#Ftf zg`}v*EgL>nyf{eEoU_d<zg6%LL;nZ~={8Hf?Zp@1q9&@7Ki?SA22lOvURNm0ORrJ| zQ&S(ta~UJhO_TkWZuQ0`h|iaZ_t2M2L?Y~n95X9x$Ae&rQ3dP)?>R?bO;R0s-5X(W zse&0rM4kN#&IYg_<JU>u(i3s^wL~&XM2s7h=6Wy{v<2oTM4D!7wCUNjkQm;X*zL$$ z&VIs5rAMw&{&Z0Lsi6g(t~#Zgf3@hA^L^Y)joP>d+OrEu(%?(hXM!x^A`SYqtHMI1 z0ju&`<zTwrYWrf3o!D3lm^8O}zKd5ub!C#Y=$q1~y;P+8xPZId5*)Gh!ou7oT1(7k zg>Q}-ee*<W*baL>AGpha*^il8>RI0L9+>KyuTcF2*UR2vZ>4v0d7ZmRawXrvXfz1z z$q_mJ@UdUeJ2)mUi~7+5=4N-)8o2p;rNNo1%IYAfmw4oWF$;V1yG-+Sw_RHNyS>jF zp5W^a=4XGn7o0{&Y)$wEDMxS@vo7HH&}5SDkG<3!$@91(ILEy}9Avc2;N`|0y!Jw% zRp*?-offDw*G2)3;<T63eRp5*?k3X(dUp}V0@!^?V-@gyiDMObXOFNzjh!Qp;Yuxn z*%B<$VN@dR7!s8MpchLYztkEY&2j52Ucik=9A~qxn|Br=KLZVez-#SnM8p7{O$=wh z#-gATFI2?2>oB1M8_~O&y^9jy9hY_q@LY>k!R=0ZqQvapG({csz3GZN_;a-d!hL>` zE;m*-(AH&AM}qc%n-vwqOrit`9q==*@ngS*zj*TKg&%d#=UtC)rt9l-^nzM%={`m& zG{#?U_IDVbd!Ii#R@xe65>D4gGJEZQ{`g<x3BAK5iUXai7X^<D%st?9w$;iII>CC? z<s(cj=%RC(RYE$4PKV8QgZ291>~-@d1#l-E&RjbIg|k<WQQ_?MV<?=mg1o+Bva$7j z6)S}fZyQRb#V~rxM8?B==bAOZeAC@N>Ex0p+((sD+c4=aTDtmX16sQ=Ypo^e0aZgi z_cWgIEBM4VtyA`aO13C<XEQJZaVGyVDEBzWplh7NdKX_&DA$B~PN-x6<QdDViQaka zse@bWA5nqy;4&1qt;=XtHdAks&K1CbTLJ8jb4}sh!(>ax^~~)`PQ?=N$-9hUkav;7 z;4nm6aaZPKb3U6r-s+tzf(4B8CRc#D7cFQ&)JuvS7-J%>v$t*iM$&o|!y)$0C6_&@ zs+lwhzTuf;8mK#&N(1uvQ`jg2eviE815?Vrm^H4-x6@Ji40c==!D~J><zukEv3U2K zq%l-jnZUxinJ?B^yU?$8CFw@Fbyw5l(kj-pj8W35@8)bRsFify7guhn%->+QyW}|1 z`0)&@kM8t_eT-3rdxFzzT)a+FfJdKT<zs_SUw89syFp|5;0^YAtkDydDqvoh-5P<D ziw=T1A2_3`jE;BqZ1BczqtWT2uO@ojWK?>;5&G$NqIvw9_dG|;Ji$(rG~e?s!X_@k zg9rDWPQ%B|m3aFn$f?Pu@MC3p*oMsMsmPRpl$s1>$$qKY$)8R}O@=dx|BprL_KAB1 zsh>#VN`~1_3@g&>?Wa1TdbC-feNjxjVgy|C=P1Cwp4qW|>)M6uFue6}jpd)-d91FU zvROaUQ2l12ntI=1(Nj=0i9S7efSt?k61!-t$JlaQ4ESRI^<qBnET%Qw{1wW8;5jNa zS|i%;P|h?w2{znb?DyCnkG6|GzXcCw@pZX)k^%>XGDK$bOw&WghmK*o?XJTc28ix) z$VHu+esp>8Q?0QOp1bZxyL_(G-EFWFX5ONH-7S}>Prcv5!8g7R2xS3c{1VT*KA-Ln z-}2kVbTvW6s^NhN8FC0?*K^+QH9d>>28H|F!2RkYhv1fFJMBo5yYN)TB?8)b>Sw*5 z^0PiVS3Vi6Y75R7L%;dEDRxGWm&ZNUwL{j<6ld-iNV-o_tnD8nLIN0@MaiM6fZim( z0k}CM937?(dn$bP%<f6`jz@VDi*qQ@t>=~^C)#(AW-ucqy?QnkfhOq4S2m_g{S-F) z?UW<mxkk)1wJH#;msY?-q+O*Xz)1A{5C|u2x(_#SJqujL4j8!Z*k6S=b4SQJ_Rovm z!HjZSjp|s7{j;?jOpzSy2H9(_sL?x7i<#t$TgX3XrCZ%c>4s`&-0dNsmkLZIB4D;^ zmu%b5%ua2MOzvZS<cf+?Uvn^Q!|zUr)L87`_8=G01bx!?VA%JY;|?!^$hQ{v(?KDn zf0SM(*`xdYReMClns<?lG5@OQD~N`@O1q7XDW$zm^)J%i`_V2&+V3u2hKIz?6nh!2 zWbFuQ#eQx#(4)WWW4_Qt8ZjDewZ*;TkRwrz9r)Sv5u)IGTy0EX+lD2>>!j((l{6;( zGb&JngSE$Scr2jVa&&k|*Z0NrFuOUk>t?>do1SM4`=q1d9cOj@c6<J86Mbv0&Y;E3 zX=WHa3t`BnwavTo-+Ez$rNx9KL#AxkQqPW;+=-zMTD2T6?nTFdi|n1Qp<%HfoxNRe zZgDvwCZpvl`gM1OgjU$K;9>~DU=muds4ch>PN=Lxm6j+6n@vZ#(0Kru3Z-U%E;q1N zRM{8*#BjJ?L$SnyUkqRYyL_b}qA}(Uf=DC=i|?1TcKWub>ExKj@o_Ff=N8tuo9J~# zo?C`lxIV$dG+&=hn>7w{H0{unkQs2dcW0BK2kv(#ZF}CDb?v~^mby+`ebs(nHf`8? zDmHD^uZz>Rh}MpN9yaX>pZF*AFl+_4fhS?*alO7JAS+O{8;LyPFxe}7B!oA|^;?O_ zWGgL>5SMplA*~xvWXA3TqG=7M*Vnu5x}vDIi)}{_^hWgoyz#7K&?YoDZ6lk+&2Arm z4XUFUNCWdO?5NT37_m3F5gd<A(X759__<wi4pgfJeaa7Q1vS~DfDBz<bMBu$Za4eI z0a3!w)v@Q3U{x$yNjOtv0S;S%>cfr>r-E8yJiH$kkVi=#M}$b2nmRQslA3s?>b=P+ z5Re|j2xzg(xN%R1WB@G_8=B$~N0e_(tl3Ayk}42E=F|pax{>zz=|+Ipe16ngbnE?b z*ZJAG;ZCM5N<`Xq6<(?`N)+daabTjn4d2Hy0{Un@$1(2W%Hj^8J3~xXhgAM!fJzpS z%8e2~df{(TkOqGlUVe9zVylxdAuKUBSVN~}8coP#5PPK&J*!Ko?%o)e(TiE^wp@)> zik3aMY#claWW>YD#QiFk5P(+SyDS^-HsKNaz+zkGfxZh|L&e*93D<Ys{3taU)JEXU zAKamg0W{vM`vfehV9CRVH5WD0N8QW;sF#}t8MjAU!vSk#({!1!0<7-+VK?nVPVQ1? zz9}B1LBM$7JC4I^KMe;w_cKuxovKQLX%Q&>`GhQgx5HVUOEn?x9O$epn9)KS0J|zS zG}ZV_>PNit(Un?vkC)53FFzcD$_<RT<d2Ca&ABj=m^6g*KEnv(Sbf4E-)@(iscF_Q zOesw^Fbh<^S+d1@*sw0RsARVQrF69wJV^?)8k0>NBQF66wOO%bl20QR4wq=EIAQzQ zbUmTHAWw}3{&+QA;#4ccP;5<~UwVy)qOVx&oHkcou|`25x&{E@*mZkEA0e?c6>gpx z-ehK?^5drlR;Z-&lB+A~dKO*9wf1P7!oq_ZkZoWiJa0jz>}tBJT!%`(Myl0TixG|8 z#*6rhX@*|>85kv@J`pVg)9*1(ml6gZ=HcwPgVHcX>bS*gu0f1B6pq)Ht!A4)AG>gP zot`?Svq71uC0*nbH@&LwZQ?2g-k}e?twkTwfynei5qTy`gTCpaQ&s==;)!zzHxjSn z2AOV%&DHrpRwwS2k6r;?tX4Q6g~hHyT4Fo#6*MW1^v8+mVjV)Pz0;)SBqP>Up|Neb zz~N;bxAk#F%dbb+SJU@&?)T!N4q(Nqqo;qfT4*X9TbzfH&r_w~=I!*uIMP9@g;-gi z(DxK3P4NOadN`zx7d`l5<b!%c+i_T;VO6LzeRRHWVVvK;U05;I4E8YN_e=OvFG2bG z+{g1|zn*UQH=CLSHdf_6-k;0R9%+XTs3}8dfpygB*Kv$W&&o1f21TE3y`oSmp{qUV zy|XMixj{`^EKs30y>nPs5TPmkgT1XjbrM=5FfXoyv<{v`#?8>)S=@@EkY*e&R$5Ub zET=0)idmIUVALac(n+3vLN-LePdZ~2PH+w%BKOQ*G{ewa#1(3u`=}zo)ClCK<iQ@A zYAd{U;%1#-2pF%PJ?Z(C^fD*0wAw88s2z#zw(yBX5R+>;T@p|G5kmjZ)`x%oqEGMx zh6UHH=RnL8Bb@Z8trHFFIWPiJZRBtm?%pNd@>3em@Fy#tz)5T9?{Xxoz#1U_a|{}* zYyoL~oQ`GuTyCx>S4TwE)U$8k0015bOTprcDQ3h{tkEMu%DSus)7)=(g-r|7q_y6q zLEF2L-!ZBKV3XXF*Pf544~n&K_#ogd&mHE16nYM@8LAFfY25Jv#%i8b)f)e(Csq{% zPM=@T=~V$ADynscRco6Sq|Th%S`RV~y0l6bW~>1+trM^s=>BuCT8~ps!)pD1T4!QS z3<pleg4OBM;CMER%{J*Vm>k6X!=FLNB!C9wRPt<p1lyDhgm6Y?I}w)T4O1q%NiV%8 zq&=l2Xpo$USG+e)T)6uTIfyZ#ClhE4T{I^SKYHFC=etbX@<x0`^|qenQL9~kRBhWt zV?dUh{dzQSqfd|iZTINc!tH)Ny13n`rIFh``t@?V-znO;4dth$qX+P8YwDF$(VWbX zdB0gr5PJ%7F7x7M^ek?wBMuavOSHzGqE?cdq^kUg9JLszj$tty@#b(q<~{28R|l0} zW_l^tK<@agE9$CjRI(Tbeu?sFND7=(y+~`c#mpu=lqzAHGrp}iG(#O3e`C~i%J@b* z&*Gz{NKjXg5&YGO<yOE0pSX~s4a=V*U8VQCZgS*fk8VEU0n=R?Vvjc|4mfb2h@}6@ zkbVG1klZ$L+mJ9Y&IgNVKQ1$DjRQN|%ELk++=K^|Y0U67h2LF=Fmdkym()<tLI_+i zf#;44QxNX=^p1R^Co*9In3h9CxqdbpF^t-a#o6$QSt11n|A&>l98eyG-P|W@3D*13 zLsM%<)xh3+MQOg+TV%wDaj)=UI<pB^!Pg{e#TlGo+Se;qDdF$S;}uSW5m399wW?CL z+H<TpYB@UXn-tB?6`sZVhjZs61;#f!IoFEX(Z0J#7}gV}Gd&!N#`-x?A80+hnc|Ap zp(Ka>P;@v`JK?@pzIdt(g@%};AX=iAM40K5@~X!5a~Ts;C3@w!He@Df+f2|9{mZIt z62Z@;AJF{G7y)wh^I8_tZDjSI6=nZPmIo0#E`@WEhV31LbB(qp-1i~$=>jpyE|<2h zg{=9R3<LGNixY_%?Knv@oACYQ4|p4byt0=_Sr8M$o$1fm;xBsXSQ;qA;^$|<m2~hI z8z|I^!yGSkeaZUIpFZU6_S{YcK}T_BPX}CVkhg?G)g@ZP+uLncDmnd4fxuzY(-NZC z9Z(^5zQkm`@PuIrqpe2~_6`^I@%q~oZ^xe2hxg$%a=s=sm?O`T6IsFI&E_rY!2aDm zhZqbD-a=%LaguojG6N_Dazn{TBilnETNw3*t~)17Z%b!w@k<6HUb~4rv;iPz;q1iV z@8w4akW>=wGzeFJl7sId-6fGU1rKd<*lq0a(ct&Zm^_AL(yVWj3Ay~uK+Oy!@Twg@ ztaN6R=r<_V=un;Y>2N24lZZ>euLPb<3Hb1KOc~vWRMHP2xe;A3xojQ@kY$uz!MFJJ z-PGzigbDQm+=QbP61aikx65PPlJw17n3_r@G7hFIFOdoExa>X$#DYZJivShtA=)An z){=AOd;~K|g3=izcmQf57Un}#VIQ!eL_Q#}t8jxL(TdA7LKRT&3P=ydl}%MJk;DbH zj_ZZ_tC4XDaY3206vuJBEQF|voo1s&)UIi9Pmpm9cE}<$zeRKLfRgKkzYytI$>k0Y zg&|D3_gEZeElea_cVYAO1l2pbtSkv23l`v{p+IW^I&pzSVE9@V-&N}W{B}})MCOh^ zHA8=D2K9;u_ee%Uo~64o%j?0ArSz6KJL%6}14R##cs>TlJXRaTG(7nXP&pZ!{2m1o zGJz}`W8}*0DifhV2oAjeF38#Fmn09UNSDkFq-altmddz!5L0MPWlQdw6AKa;ydt9< zm9tcmT&)h1<U*mwLy<wY!bS?^aWE!kgradYs$V?xt1rm!AYO6rM4LriFeJ-^P*j@g zK+|2G!3<6iiqa~GlXr0<;BjbTKFwihK{B7<&m>ju(5Z#Cn|ADOa_<o(N{$4gGbwrp zrqFuI>6am5*@PZQq}2#SpdLdQEEA_zZ_Kc+%bAG`Fymnccr*(&B`Audn?0?kboRD3 zd+@dnIm929lPLl$^fKyXx4AV9tC|q%l4@U~Q&60O2)g+&q9K5&?%T-%Wuy*t<69Cm zA6B|1j%D~A<Ry=qJetyzpb^<ep5UsWFx^Haok5p=a}OTyMj}KICi||l#1n&DnLmJn zP7`GOT|#?+GSOB6#rY+vsgNn`r)F5DdPZ7DuAG1~vZ_7>Em%P$x=r`AnBG-~o6Ly^ zC9V+>r4*I$l@Cxe6BnRy5~7ZWa0u<PLdQh%@Ri$6Hdj|z11)$8Lqwz(U=U@Q7TBt2 z^i3*uqBkKYY}He0jl#Z=9GM!T915(x0y8=^Ao0GyE5~tEZ9p5nHav$Ku(+<wJ<YO= z2%Jg%UDv_qVr`cymx^2m5ugnlmY^w3zuHGC9)`d)s{yI245nYU?Zd238IeJZA8{mT z=tM+P=%v&_?gkQ4pVIEIR&<7hBq>lg^u@WGkIIAwAV#kpX=&*5b+HP`xaCHAM(u_z zW!7cx^mh;KC?VB**YE`T64z9fMP}*t2XR|H5qSeyF{%`Wzy!jMC)++P_7j8+5dr5} z*#P*uKDx_1q>iwsg2KxbIUzXKw+PsZOmNqxOkh8Q<M-UV02*`%U-?Yu-nX0Gobii0 z13EaS1rcW#2k-YIS^^CeS}q06C`|<lRIhQ2ZYZc4ldUFGKjL?f_M0$MaQpqnqF<Ti z#EdITH+JRps*%bf_F^5Qy?PD2Ew8%A5CNX*GQ^&z_zc{Ood!M25OvXO=&P<y1ayLt zAAocZ20o&7f>my#b-G1n1gIO|Ls-Qm9n(R@l8GyW_O=MDAF};h5=12U*T=;i@VO>` zuI`~$sa|d3%;T!g&i3~;jX}55Rg{A=gV^r36}?+C!=Y20%4)IJT|Q_2EJFFk80~}} zq|a)F(yqGkhW*i2GR@)6bT_TfhiWT>lN|@*MBQ@$J?cAF>eAyd{0PRuyB$G`kMubL zn;{#LlS;wJisjV#=b~95i&!0#0aKOqw|7K{Y~-JXC_$>NGm)g;0o5p0_vFf?kPj4J zrh^4|5e_LH6>^9l+*eEw%fd~TI(hMz9^d`KPVK|49=Dntthfp~@e5RY;}S>8jTex@ z1<ntiA@n!J&Huji?ldw?6DWHlSUH{D7&M)kVMFB|Xb_rFXo4wITA%m<PLGwa=|mQH zmiM8nNRMgFD)c&*eEe@<{4Su;Jh`$hzC*p`ygPOJbvO{2uP6@hM5Ep?-UjYNt9l)` z;C$nHY|#!ujT|{zmW;2H)sle-N~ZVHXilpSw03)fd)eA$Ws)v2hA=~|zcu2<Ys8G> zORCWy9t|dD9hzi~?OJu|W3X3rH{&1Cx~o$U%InO_<te1Sr*LG2<o(--M9Bip#@>OM zhj?V+BSyku=-gNeJX4J%e&n$-ZJk*#*xsbsJVG^`di3H{gBL}4ejfo(!%||JJP!ms zk;W`KPu2NI!K{QzL9wx&QKV!`zG~H%JmL)_`aL+CPykMeiv%{dbAt?KwpW6(OpeB; zt`}%zlJvfx9hyT&c1)(WStXx@P-TbL+aGM?<8od-nP%azh?v!A8$3g@O=0gqj&hB7 za&LEApt{4gb(=#?!pipn@MNXJ5;1_~-S?m(F-%AwWsX*%uJOhocfy`_0NlwNTb>nd zP}Ly0+Zu&Rpk@^O^jA8hQDpl_1x286b^oyOu%IB%0wgxtLpl?yV)7@WBL&=OHyU*Q z$uJs`|MTFmyqIn?0~JA;9j!zJSja2iM{<~F0T$12)*dRKl?a>y?H*1R3;}1NYXO2t zpvt0-3a|_ljO^G57R287;C2ppnA_-YpXf68I%em)U^swBJi6()MB4PYFXKHV<*Scn z#1Se?2V^q6x>YjMSoK{$NkoG6G-YQ{&N}|9`o&mhU!x~Co)i?(RB);{=`e-PP)06J zUY93Z?S&CDuBXEdgkXL*?Ri{FN;$mSPa~+kkAabS%v`#@&0>E3GruG<W&kMfn?LCW z0w*GGHANve(ZFqbJZx}DBVK?r5uq>=k(~byG)E7<1UR8^SNdp_bxilD5Q`i~4-A61 zzQ%n?D6mXK`BNgFb_hmT=}Z9KOp^PW4S<5>2udM{d?+`dQL$rY#Zg}Zs79od<~r{# zk5+HYh-KMpaY}wnB)(J48AP(D^ZkTwN=#Nb7)WWAbU3b%h(qIe_oiSWJ8+3&&`pVl zHO|We*|?#^Md*G4=?C*5{O%}+eLLN)VN|Rs?^+fU{i@2<_i@J)(l+7U+XZw`8Z1<A zLeBkYF?eXG>t|UOhCxB56@|qTwP0+^&6bDUID7C-?2cuMZ*f^IB=}|F4$wR|#~%82 z6G)M`$jFQ(L865sn?<Z1%a+YQ?mEtX@=a0sgIcLp!SYNie+W;2*{;K`)bgyAt905G z?PVYJyb>mAe^dx+V}Wws8=vIIBJgb}v8#|KXc!}d0)7}ZN}_??ch*0mg56iAgWcDl zgddh#*fmS_hi4+=+;(rs+{&-OyP^6RL{3lYm{TwtcRQKxKdfho;3r(DEKbx(1`}?w z6=-s<Vv~-u#I1D1oKTB!iwj}qQW#^{KR~~V$=X4_-IaLjk<t>=?6W(&?Na6^1y#cC zYlu8&pxgBC*myU1N9pqk18kOkygS9;^Sq#boDNJz0~HcrLHtAWe6-WsUT@uH+$Uwj z^~=~BNs5=*%G~cMxhUto-ld2ua)!5}9HGG58E59Z7SpVN0<~FeZzM0aB1EMZ8>=!0 z?4Y$kl5i@ni-3>r6M9fN?ew_0wqAgeEQsKpc_8Y{?x$C#JDKIa2^7=tD6vE9z~y(J z|K>BCIsP6`%dK$uKKne9kvw=Jw4m<{=A`K-W?eAJhUYjLavV!YCoE~&=rlaZ67IeD zmb|s<b1gxNY-q=u!q@C?U2{G&-~ezEy^@nGVYn!Ed2$fof^m!jlGw)h*_p=p(OJg$ zF&M_uE@~rBB*BqVNRnfbdJ`NvC;M~Wmb#|HM_I|LB~u_NL9`+WT@UL-Uw$&mmG6~- z00E|p?{{SCHWLSr><-t^aO~gVo&X-!#yJkBAL1O<;*Ob$pUfLQpf#b1Q@2&VDTy!x zT={`sSz`}?Z^6;LrUx?ICy!ox)6z?j@zcp$ev)aR&hFq|t$#iW;AH;h%cFl3Di%;# zD8rqQY8o!I2fnIXtrbd3yP-#TVMh`=#-LfT>f|Rn<)~On%k<psLIG=r$yzJ!G42XJ zPbB@FXs6HQKlEhm$16N-ao}OelrHUE2N1F~xD$Gz3trnhuI!ox!-#-&Byme3P+ELy zpUoM-j|!+%ROKP)FHr&EF<spMxorCXoBZSlKhydBY_q#gKXAA%`91prZ!!Knzl{IJ z<MmV2uzm2e|AQv~=d+)|>Cmz`4}OMue)cmtO4UC!Cb`~40Bq0nXA%ef=e(OOR(L~$ z|NNg{4Kux<yBv$napyJ^Quu$6ERY)}#5%n^MzQ0CF0<r3h}J*W!T&1h`8}EW(d%{O z*?+3h3h8TR00hsgg%GWDTDk+d0PamNMMcy=o(*7u`_^zCb3V!T52TPs1bo_Vhb*$* zlk}8O{qiVB>0PiSI{p~ki(_ufR!osMed?you}x$<N+P#K3dM-!&1wPFUIO(-ShXix zKp~U&KV4Va$tH*u;Tf)epyzvV1gVOQIsin&d>X@%+`&oJPyPF)g=R$T*iVWH<tWxN z0fvFMj{QgXEJ-&=h%qtlULY>Tz=aJ{vGwFBq7|hu)N&5Q`1ezy5@FBqz)X5#?#x}P zUWCDp!R!_X4|>8;4Stp5wZmbPR)oKo-tCb8Nn<z80D6b6B^Hz%spzOOt>Ab6G%mnX z0cIiFbdOg~e*9s@BtNU@r9$iQf`W<3hEft9{TB1wGYfj<Z|KOPBtVbk$xlMT#KMJq z)M0QSl32FJsRmew{D=CX20{0B1F%9U$7zuymgBy=V2=ChqB-ts2<M!4&LOktKjtWD z)qn6IFg*_}c3wj2VIt@|_8_EJpz9|iB`UV?$}QXuFSqv{m6WiWhbN#7aV(4A@HVRw z<PrhwyDm}=JtVZ0<(;0i=dmXnwH2;w#^kKyK**sLSID}LiZ6_Wb$&3xIcF(;r$i2# z!GRPc`|Bzi|66y%O?t{^<^Pq40ME9%?XQT0Z7%+IZvUGSQQM{4hIz~;yx1hBq^<77 zYsm1vx3Y^K!9(nObv?I~EKcpSGsU81{j|N*{HGi~(eXQ<Vc-mcqULrEF&I<ej=RmJ z&8uPBJso>a`pZf5I0UVu{}M>s{011<3|+Eo=uNT1x|K9g4kmsXS#RCMB~Th!1SOch zi8s?oOE6_(X@bsho<XlKRU|6Z6AwzXLMj5$sgj8>;WshwzUM^bl%f|VonyAu^%RJ5 z3ZFhHVnV2^JPPJ9vYz4NnTjNd(_BOrHQt|8B$lC3U3piJmybZ`$c47U^jpPOrKAjG zvr@-0p~UwA2uo1NqF(}n3eu2nny&oPL@)C7_y99<71d{cL%4)1^uPY~uc_jpY`zxn zq1OsZF?=xv*#OAJGk`SFp92_w5pX4>B88wBD|ewS?Adgog#>Apmn;nhQbLqwC)-Ux zLe~Wb!}dkMQS>h%O1f{(b8{34>NO_BR-o024HXR=ft<2kQ9G&;gDHBZ!3VQved?I$ z4`QWxQw3llCyIz1rX&Z-t5J02>@&QEcwMV2%xhy3okxf&!>?N)Mix&M<q1+XsX8NJ ziKK^Dpd4E9pBW`4nKr?yk9w`v9~1HlqY5q~KDvy6gjPMOhf85qHBSTdy(lCZHCcKl zgN<QNQ&ZLYSvANxnOnN6))$2BRcS>6QG;JO4)sgbH4LgfeZmB9o_I^}-<+<YN7?2u z#4~Rm)BgM)KAs#k;QMZN430-13v*QKntUXMWZUeI1^?;ecC%j`ka6_6TI@0CH|)en zEJj(66JU+8DI>uZ2QqBBq5|r7tdM<*V=E+~+6IXngE91M8Mu+%8)k28@6;HcClO+1 z?k-t%`&y$RW;bAV$wf)6?nsJ^x5Xm?_FCx1<W4r+6Vp!WJFGYB&%4$3@WEva*T%{< zOw0U_nQP%V)EpQ9%GMFSG;^&dm3xEbL7Vrt2XnLO0^6|vTB7MFr8=j%m8vzRW$Juz zkFtWp2~qmeOAij%_pG|rjI$j`qvCMsYGD`FB$|cZS;Aks$?+h{mBOsEGb_s&WB`C0 zhK>X9HtL0<G$$5m>2SY!B$V{|bpBlK?g^>=WKLP8k^^7?&GB=><-6%6Qsn_)iIlO) z^>TALwfknhV1OQ{%Y~cq*<CI{E``2FCW$HhbAV$^1~Ji?L3K#tFjpD8J_PF$cearU zaeo^mP;d?aAp3LARXO<VMZ5y4C+kDT!y^eO_<g%r8fnbQN$DHsKuu>v$;!?|K(e}@ zpd75QRhN>wElpb>eIeeHA2udRhD(iZ#114}<9$<PKfdeuNmO%<{P#(wvCvPxAS|#v zN-k`bm4pf%=HjG%_Eu%ws|5hMI<992U2=KUMdtH<Di<_TA~fc6jY>hDt{6cdkKr{) zv&&cv@X0k}CBR7dC9rEN^Ev`hrY;uOYqBbojk-hGKD@BX4VZ=HK-q1x5yLg)?T4A& zQK?5Q?JJ};As+R^0q}0Zn%VQ!Ba2qFAgAx9izVlwD>xHSS&o$+qVHXvQM)Bkt$&#+ z7B&^H2`WQ_4M^if@kqVuMwiNIk!(_<Q|T!ScT{s)95P49+8i5`ko@M>tb7lTt4Ahl z2k<1s_yQPRuXP0pO3=u;Zi!ITX0?Tdx|8RGM|~zKK@D;HTGwxi0V{?~7z_YO%*_<n zHX{Vm6%+wg)rjZj$R9`>VAULV>j|pyRDQ%0^V->dpDeB>>kZ2G$-7C(Sh)sHemrgw z1mK5<b{{6YBSu`TOahaJG!GHX<g;Hk@dqzX#~U(SNbEb%Y}h{ucVghPZ;rcJ$FbNQ z9$4a<8kxf4uv4;J0g^>7rcoj%?tT8;-Om9qf}+|+XaXEx5Ww~P+ndLse=`2U^<u5X zSS@N85J5V+h@;Tcj4nbTZ{f$ku-**1f>y7iT5T^k^uC3m@=6Q>7YRWm;2A*z-B+|B zF;1m$bU6t0-s4s)Y!aZG=u46lT}Pm=wBSiDT6j|lm2YrOLJ^NXhC{NBdK;>H`r42h zghs@oeu<`P4<Ryi2DK?&ETuN+pME%n{G4;7WF~HKMUoU8b6uY>8Da?Tt-ZQHov5lR zr?)X}Zy}4xOHz|ol2dk3uYfp)FKH4Rrr_MHs#rm3J<{inUKg(&4UX8H2*5t2D_-Bo zt3a~qqd_~9JO=e#0`;N$6=gU)F88T-qQTdY;Af~gOmC}2Ik}I83sO8s5te5hnR{lN zk^7)9fqfxwjp>@T1G_ts;uRInLk`#{BgX|_C;i0W$spnW(PCyE?LF~QkpD|@ErL{S zw81ATcgV;^D;3~wP;)A@w%I4BJ|O#sD{0-UF#lD```qigcER+~CbOw|=sv^a$l=sI z8e|g0V=G(WUf+R^eOSMl)Q;yDM&QUsYA4~1AC5Sf<v7R)D?<ppz`NKRQ&gi>3dYYv zAo$c6pU9!f5JPs4jwW7n*<Yi{-FZoYP=R@>v(prh%B_V#p=bgVLY^*SIRp9!c#S&} zO4;u4HU2ou(>DJ*iR{B454(l7r%XBXe|B#U-kq_UJugc7RNg`;D_QkbXAGM?Ds6D@ zZlwekpXAR(4oVVGrvq?$O46<WCj03)=<zulie89ku@ab%mRjuTu=jp~$ovzkr%`$k zcNZXR+#a<`9FE~ap0H7s9t`q0x&1jBZ&0hAGT9u5pFnuIbx!RmgUNazky3{>)R^lv zW0;^U!DQf5Oi4O$TkLL*hxz7qoh*18=f&SH{`~x#CzEf#p1gi~F|j|tdGz9`TO=T9 z2(u5_qWxlphfyA*x=wtf<rH#KNSk^_dLsQV#bxsrIXzT?(={r?5gL<5i4=-Ok*Ym% zt|24Srj|$lYap^D%euuCON&&TGMRChmQy|x_x<vsI7=V1B0ps!Y<<-s$Lv|G0tQnN z;(~+twpm9habm31tlbaX!+VnEP_k?^|C@*&-oLKj062f{h$Y?A%wNgP%{grjIo3HY zDp~1P$$5n$i9V0p0BS}_(<7=t*Djd@GZuQoq^@xw3jbhVUg)FXE^jpO|E!MUnGQOg z*kN`=^b?P6&F3?#?`XjeJ~%MLvGxt=lDE!Q8)vE0N!T^%+S`-F)U`f)m|~CvrBbB( zsW8rdkAhZK6cN$H<z{DF7oFS{Q(6DG41XlpA~hXJiYZYj&vbE#ygjB)K}qW3OEo|c zhI_zPpEAhh^f<?hU1l(H94@<V>%jRLUB11xO{LD9kRx}-OkLhOqGl$&w+9|P4LcYe zVcA`IL%LgB-}t`|o2`uvT3v1qht0};IM9vh-C9l(6e2DR6yGi@?Jo0n$>ew>82UAi z_mhyTe1c#F_3r!4rZ`~3;T(?mSgf>fu=*x~vrBBPk{96<D0DpB?7G|?HlRfB@7>1G zE{7&@2X^ZNouDLh6O^Ox6Zj6=hc!TaFcu_8Gu$W<%8u=H5x^wPp@ryREydv7V!yat zEVBnBjcTYmMQ2~vC<TF9=5F`x0aK&>4a&+4wOXt@PN+#pfZi08(gO!|H!)>6DR`rd z_ii+?bU?cM76rvjbibs`yXEwQK4zTKV1+o=0@avtx?R;G=ou7u!Cm~=9lE6{ncDBS zc&yOT4wJ(d_~^vcs!-2S>5mR>eJ@XdZgyjDTovQdZ>&KQD$^IPv{@6RSj8}>G+rW1 z9pMBE`q2%gyz@;^3pdtUXN{HoitH&fh{ZgvmdE|gVr{Ck_#H9Vz?2+q{D$0=5B8Fz zsmcn~!He*6D*l~3BWa6(pl#^%F6H40nMiUX>U;yW;OKH+qu)%IS1h`z%#tptIuFQ3 z5KU+XwxArfSXlB;{nw^0qrS9#NQA3rsopH+U9wh#lA`6?lK&gzq8hoi0}C*WqscFr zRds+C>mU^sd353LLK^9}#D>_&q-Nc){@;T-nt`%LPAKMeG-fiw`9T_cn3y5fx2Dk^ zQWMmYb>TBYwKsk#N|t=mJp1_+e-F@d=T+VaAu`t3LeaNOOZwp<U>mdDI+IN1Kt#C* zO(PUCjmBFPze!k7R|c0?bpWss{hE&MdhxAg8Kg2vx<)nzg~@L(vH7e`gS8N)cwHsh zA9JtjFnm93_ITJ*GBgURFgTDCA;gf0tJEE`h};zqX=F@Ucenge1q=vmmUz(@&Gd_B z>T2^YTjSMP<Xy&T6AX>L;qDL=x_t;^ByitV_GY0ax_U6-4TlPZQtn$&#%$(Rf>yDX z#=tC)`vj=n17fh3>6(DRO#J-lZ%=)QSn@ml9ez(I?cFw&YY(~6EB7nF{Smz?7OUC| z(DDr%K2<H*>YcM?<MDr2+RnRUa*Op*aJ#NSTZ8q42iDW=%Dk143W(V5w*bM71~n^q zdBH%}XbgNm)DsErKfqvb7XHloM^iPjKfqP#lE7^`UF%K%?sdKC+YsQ+Q4i!F7VK#2 zA}pLDBp6R`^~b`1kQY<m*XI6>>3`6nx|L;CPNtX9BzVI1@9U)RWw*qJN{sKReN|vi z?!4X{4{32Sm0prBSiA%eyjV{KYock~;tOQVec2an=u6&a`aXrT$5zL+@gjwwsee@F zr-t3}V7oiTtVc%-$Z3z1R%rlVy5f=`7QUqXd9PUl(ee$;u%-e3kyf3@PY9rAlC&xU zDAi^M+j$jhk?P_cdVZem`2JREZ0V_*N~s;&_`-MekGCi#Ms&iI=y2xb!HVeA@K~nW z6gj!9S7Gh`W|LYB?a;4V_RF_i{J_n`v(A1lqS64a=LR%PwTp#>6p!H^1#$YjaO%F| zT}lh)1)UL|F&Kq}+dMNsEC9(4tt}-YO{pKNh?EO7Cs-*@d5cIKLk)L$5S8<rb^b!Q z>gH?^|HI~(?75Rc4>&At2hOnhK!oq;gRNO_98%{T@GY<_L*DHn9Fr83qXzvOPQ6d2 zGGIY4+uGHbhT#7=-IrjBsy@>jDlVJsudl+HzHf}gyDV-8E@XT8qW!7SH@)@3OWXX) z!m~j@uYMp^P?}nH>vtI)saPA)u-^PV;&b#)3~|U%&_&kl_-=uiZyq;kFY=0`KQ>54 z?tCKIbz6q7bvt>&c7S#b$&y<q_Z!XB+|tYoHCplHfs-tYijEf`nPNQ$M${(Cvr~aw zRu10kFn*%Pakt)lw29!C>Mg6Y@`R~AZ)xoJ2?;EJ@Gx@tiejk@os3f1wO6|EGQjc4 zi0JceJ49CpT-_C7z}~<eM#)2GCqPdqP@3qG)Gm!Su&!W{jK)?mHJW34rM7fLuZnuC zpa(#MN)tXjWDA}!Ozsu72d2;Y*vGvNfWQI@O{2sCwCiMcgbTcaHANXboDW)*%e)hq zyi_fQEJE=XE1>wUZVtz8rHA4O>f12c4G2B;Nw0??1^N4pCDNKdK;|gDy&dK;n{IJU zm9|5egw5LeNw~e$Q)Z8uqvV5kLP2l&m?MlI0txt8sFV)&bQ?XQxH~3=1(T^lxF(yc z%G=t}{u@=ODQMbwgIiMa8q*_jxTJ6qDh9yI!W+z!tIZ~IIXalwzAukB0y|8#reSm! z437#h@}`2woCHiW38&k6mz;hkMAAm(<Vzxv|I$OH+UC*bg$v76u)$XVGubKM><0V0 z_p^?Za+&B)?XQoxS+lvN3;C%;c<|r-;y0Ohc3i`2n@_m5WF%m9Ty6SAx*qlGKhsxL ziTdeZ7{3%5yn+RbZ;M_IhQ%AUDQA?ze94}~%q4e*Yy?!Gl*KOffA-xq-A2}_hKul| z0|?Dfw*|n1-r*2t1vp%s$#lDAv;<RAO(mw#X&n+`dESwj?~x<fSRVu&^xyH`S?8Dz zLcgX2pU%SGJ&u9c$(&v~i5_Gk$b7`pBc3+F*d3&)%tnD?QOC!T{93>dM<ha-XNm1- z$Y0I;w={jK7SHN#4cg=~<Q#d3GE~Vo>=(iOZU?beLze8fZWr^I5P)gkba`gi;;>A3 z7-o&~1hco78&en_nNy~RK`9j|sPV|gefNVGo?>9OuhLKE6uSo8z{7x834kPy%V%eL zpxPaXN?X9xwT%O4xhFz@*TH-IY*n|w=QJoGB5-W+u`n$X&NMqO6{muwJPW359c>zf zy^#fSdmEHtL_BeUMJBhzSgL=DR#EA|Z3xFBXn=$!Se!^uU&prxIj)r9uoF!Mct+V8 zdMPq>+OkODba7Wvm`&I{pa2FXG`tLyGI}Rm<=rH??G&$DkD>>b7hW(bl_WHVu59Q? zNCJ5prw`B|3gfFXb-n}xb%!_jK1!r%wWqwz7v$NjAkfU~6P8OVkC;TZei{@ELnUH$ z`b;q3IDNxqRm4t+n$5>zF(H0<h9-t3PK669VH*R}h#CyGFJXwTQL<}@-#07V=rKEZ zst`4)3#gklm?s-BD-V=S)f(l~Brhs#N`jh8S({8ihB{2&BDMc&gZ*AEF|Cn&7tq@8 z2q4x-Q%1#}YpM<=n0sCzYT}hHZ9!-rse(nGFY=9JFfHSW{%p=n`m4`0H0f9^W;;|& zDbr)gl|knFEvCQA%?p3>k`!piJ$BeGO_-4>dwT6(i}8NFdTR9oOT-#Wh%@zg9eG!! zt&zkakV>r^1wpDx0qKh6pGi#FrLwf~iIPmg;VEgVdEtVq{^G@6=HH@wbr@|4eEl|} zA^u?kRiCR4Kl2yr4i}|@<0RBXKap!EWS+@fdJ3L2)4~6MjP&g|RuW{<8DYt$QdtNy zF(I_A^0<VV>xW*THTOS&yusR`0Mam$8fGf!h?5VvFPlLSVbSu~B<!i#_4F?0lXgb+ zu@MNP!WmuO<mW9x*JR@g51$xCW-~^#a+o{0uHq4MjRCTx1p!podYGcA51vku0PRtX zFUN_rV_Qh57ai3lCKLiz&=cS6@UFP2K&m)Ur)J`7&=M7xP6bCPC>4q`ykUxfTOFSI z@Dn8LX}$CEO9;*`D5s>>C^g2sk!4I5>z*pl@%&O`*@ot5<-7o@h_gVU@=cS}7V}Uj zAb^l=vg7u`Wj4uwTP^0eN1Ri{?dwD1Ky)68O1NhPug#$!U#4&=gf&13|3Qd`Y%^{s z^T%b=5OTp)Y?F&H5%k7A7>Z8)CaJ9EzUTDtJH!AdB?t-u{+PpY^3MncwEc<{eOlRE z-hTv4h&~aB77K}Fk|{>dRJb4EZ{)N@!WjzjB^UeXQyM;?FZp#p`c_=>o8k^da^<15 zm}x0W0e~N8fxP=i2;sXQR|s!+h+5_`K6AxutN1{1JrW2FNTf2Df`iXELKbs~5Xelp zoM46FTzXKV@+Iv?RC8G8y&&<UsnvW=42)fX+U9{$e)6T!goLtAXT&^H9SKYuYlEsr z0X)Un>7Yq`;?zEAlL3S=M8gZWA^cIj2@3tTx#WOcpn2d_(h<a@g6uKm<UtUDyag>l zV84jd%~PhQE~)IW3wWiAsS-c}qa5o+h|OO%qYy+J1wpPtoie3N#0rk#L;tKP0E%p| z$~yxhqrEd0{!LsEwU2{2F8I5?6*D0rBbGY-1K>3jnd$&t4G!4k@<U}4Q{zyMav?MX zmDk9q_2uvb<bkzCpifx4DeO!xs(9CY^#&0VcP#<tcpp|f=GIo)_%TBcUr=cq=QmS4 zFHLLSjsuZH{!WC;OJPAdeCW}HEa0>>9h*Xojj{K@i@A})&+Jywshm;(vw;du9Tau5 zdI^+}8_)~Q&t}p`7{Y*C<WW-i0nb;3d#t=_k`~FHBKsM4pX(5Gn$=-<)A?dkIr#80 zK?043LN4X_HT)6~V;J{x+6hd1Bua+hX;hHtI7rw}LS!J}%7+gkMpID=ch1eLW%qtU zb+Sm-RUG)+(bvB~koq`XLUz)#RsEbwL?mHy=^|w;=8C=9L~muL`U)qz2&OVg(tRj8 zp?r#80C6nTbaz|dKuQq5*zt!>dxZE5obPeca=1F8;6pffNVGk}udG=a*ROP-IYr7G zHa*G(hod|j;U6P4!vpGZK_$*0@DsSb!ST3(qLs2a$X+Q$4@-bWiz1yA9P*SU!nv0| zGB<@*&;Gb)mu^Jw5usFt=1~YVASph>Ma`u(6;qmEJvO7mu>yf1W94N*OI;y`k>_EK zE}jITg;|Xe^h%g5TE1uvH1m0kTe1U_BMvG-($!a+8jwhdSIm{bG2Wwq*$net4aKk* z5Ejx4D%k?h3wJN=QZ#|LybSXHv-h@5Zr(=P=wI=tO;ROq#rE#Ad!|xW$&#F?BH3C= z_U^NBip3#0GmJPS!xw4fDF6Lj-HmQEUhkVTBX73O`H)z16KM218V#T!R}6q8dlePp z6$+b|zZh-rr^vy=d*tC+Y_O!7I~$w|3Tmr>vy~{&5I2vUP+A<ye)+QU3pp;VQ=wzg zp=WObqrXodWmbxbm4i0COEZXIiP-*ld5P>eFTqo{KTZKD#3^PB3RhfC-{{W{sClAt zB_XPiU_0K0q?$=pCc$J5#Pvc7NDB=sNup*Nmj#sw^7r9NCc8SB`#m0Q@lFxFDrpG; z|EY8+92d-Qe%uEhq}|!(2FVx4yVld4Zp+-SSqZPcx_4&T19}$F*Nf+U+?@Xfi3T}c zg|&clo6*j%_m|6gW)%D_JDzD_8#|@dm*={B5<%f#sSiOkdUJKSUS$#13Xiz0FPC`f zAn2Qbh!2c<m8Rjo+q_y(?EVbWn&LQevtlB27Ja!5VWRDs10|4jksV!H*%Hiqwnhy$ z11OV){aHsc?ilu9y9W_1axF2~F$27P*2hGAXy+I#ru~lmJ3U$j&ViIy)AvtsxBzE2 z=+Rp{WErHeMwm$%aa4lBZMrxo$aoRZa&KUDb3#|Jc~?NADaNM69F$C*aSNr;hYXb( zJcF_0aEcB|%x_1eg9HV(zivaMb>2ldEu9}lBdRW9_h7F6%JOVD+>4OLNee8x#<OZ6 zohS??slv1;2sOiMl>8kD14p|7c(&Pon9TLMf(r8j8@!xFpu*mEUME7tRv=BlwO<`* zIb>4+AKjBM44hNMT783d<fuku<~w8yZh;CPopgwV*`k9-d9s^!mi*itv63qYxb$Lf zF}QEgb1&khU;(d+;t;8LFXJN@hzJ6W_*_qSZ?UqlTc*~$A#9+@C(uipiDmR0bm~h) z=XjLk`jd~do?<JDl`yBiO-@EhWX&G6EA2L?*<eQxFcZATbp?(`3q~i@kAYTWb3_h) zz`ZghH+vwP7IxfmKiw`NYZSqUiijermbjQHw31@o1I^woca+G<n0?$Wb1gVrT~GDG zQgkZVVUZL?{6qxgo!OCbI>xryY7ag~hiB}d<u>MrCFaEm??T6;6U3|qJ%vbDIuLC* zbN#53BOWI??s4Iq>U*}D5of<+48P^|6#|o9;Ii6aJ?gg=$?gvy<Wq1pmA8beqa>Q1 z;Xt#%eU23tkK$8ATrrXZn@MIgrg=V{bTYio&IHn9K0-dzDXsz01Svrrny22S0FJol zk>39aS{az?ubEc4iLU%S+2dG}wMm1veUZG06|}eo{ke$Vvv3^8FxpF?k2OpnX<(q& zAFj`>Y;I@^(Tw518{`vm2A%)`Mq>3mS$0uJ0L2L}*A)Css~e3~(-<<hE*>RQprO(J z39nkJ%0(SIX;`Fta@Oc<=~)YymcErGNsd1NrSeoT!SEfQs=9>!iHNm(hQ(ggAX3`` zRug&yrcvfp5Y~TjttYI5hGvF&M{g8H==va_Kzu_}M7`1y7DEFw&a6@9P6{uTj1V=& z+iFzhfuRTu8>ymnB!(~^EIZ!ii~efNP+r&>M7|n|INwT32N&4DyV_f?bb1aDGsnRQ zGmq~)hNhNSh)rr6C&A1}3l?z_2+-VNH6>dL35souA-Dm#<3=0&S2cI81D_Ip;_s%5 z4eH3_=Gvcm){_u8-RlNS;Nl9ls!M8P;MwUpqVu=|o~qL@Xl<W*QwK27tzmdAR7<}~ ztf;Ely$td_-k`eb1+2K9Lc650YZ0jjd+it8VZp=Osp{=<86Hms(QEen#-9tX$&H}i zz!e{8O=fyShL6$H1!XZ+o<_rup<)3)%N2fRMv$qeO<pbLOPuLF=o+Wd?DgyCkLfyJ ztC<vJ=#3{WhK7??L!(`|GESEG#dYli2*K8gZd^@{J3f&Y)CC-cBic=4T?|?1*gEs- zaM;!*!M}vXAPXZd1p_-T7s!d?^3-b;X<&OC+d)sYU>ue)Z)zhR9?eh?WdCOK7Dbjt z2^g>FRB^8z4R90}ElO^%e&KN#S|f)y>N5?*0(yx<#3(dD5d4o$lQ8i-e)MvR3*Zh1 zuZ?IxZ{xm7-?nl_94Yec{=kJORO6(1AT1r;ccMq=I(WR2g}s1IL=>6!2?P~}?MO;9 z4h>Q1em@DZAqKcWa#L^UytW8JeV_Re(mQqYf#>Lz2+z!EMs{+z@`I5(n{rmpe|53| zu<tf&+nF_3NJQXc^owbiz?`SF52C2+X$!DrA>XU0zk2=XF>PO8U<2EdqBiUdKQ%|K z`WR5S-=o+%JYAhvZ*W%z*8;A!cBqX-muTdN7MWi7DjAlxLlNVP0u-}F%CaAm#Fj$S zbXSVOhQ&|O;r=`|CYob9%I@=1XsH^C_(!S=dGAT+$v{xh1<J-+SREZ;nek#Be7W18 z_*_3B#AD(StKDw;fpstQzYzw?ACW#`PMg0}L^E>$AzD=^<y3|a*_=+_@;aaH^V#N9 zrH5$<Tf+E$EccPkNk4gLA{A;E2vnm1qrHJbc4c^B`V?8$p%oy^1Njq5^wFy0WX#YR z(d&Iw2EM8mY#Pw<1Ku!TtkVc2qPN_C`Fw%X5%Z_(`F2BYOuU>@?RA7qN=&mt=W-v| z#+Wsr;eqDWWQnK47M2WV2@&KLhPwsTM!PTdLp@+T4F~#BeMm1jNB*&~S=FM{h0uc* znv?Fb6#klxBr_1^Bp<+u_5m5mXCw+3W|O@D>iO#e1NBohuQ-e=A~J8<GNRikWXr-v z!P?-^5~>bpoMkG2?>M)-!t8^0z;N+ST||^rmaNBU`J=ReK@w}hr{8>?bU!wp^|-v# zz%9TuUwDLs9v6NAX>KDgi=`7w*~|~q0)=_w(t=3XcL_xvh845dI40nMxtHEt^${pI z&F4hrr_>Or*UvS^#W1jx8=vkY#dTvZ;Wgid;JK7Nex$dO{AL%h3b<x~@RaRxMu*?% z?WxSS(a21IA9;Ouwc~xzzy@XB#dNh_e57A~CzAS_V|j24cq5=nV@uwE(<y;b4C0lQ zh)xi;TQs{muHW+YTcd~MR2&M$aEImmLrp{!wp5N)kX0E>_9>5_ef}6H8s&n~*_qsi z%J8>bt@CGjKP-?g6T>Hr!(H$1lg6^@Nj_m*?*BA;arJ|F*&@TG0|vK?bTSwO(<aGX z_BC&kQo^TW9L~aYS7xckVK@YbpA65!8t8{penBj%-#IewW_zm%3fkqILFUPuD*=7J zId5pf3M%KNik2n^?!|YIz4|B%_}9fo9|ui1D!;jx><E4E1Qk*+QJTKui?~1gk^;Y> zSip}>Dp(fK$5%E|gE9cu`x;fJ!q*tvT3W+2LiXQqF&-48^oS;OppjJU={3Tu*rSL| zAg?xdIzt>#Dm!<mBK&NescJ}a#;g=5J$T@W1h8_t$V8l=O8`iI84xehlz{zWp;rY| zPy%1k2MV}>fOWRXJ{_<j9&|(UhwAktfvs8!bhIk4p>FX2n>SZh6u1aI3sL@tLLF`; zuax#o<NXfD90MDJZIz-J1n_1-N*7PR>c|yPG&AYRrGfy)=CBzOE!ZcMDVR>)AcQ{j z7fEe1TTad~JA_xDaaobi-=s6|9`Bly&@|ggaI#}M_(HoG@8n5eSu^7s+%0OtVp)M} z`y6rsN?;xR1b*WF1^;5YgkA;FhUGosXY&Oe`W`nt9^joVRGU<01!I(@v(*y8*hJGL z!cONch@isBgK|W1YY8F}ej8YeF~WuG%&2Wz&xdmTP7E;^)7YIRU7}1PjcoWzltE;) zkx^)H)&Z2XjiK>+Zq*hmOh{&PAH)-TBhu-V-flNMuM0P>Q4%&IeNb>L*U(ArD3V#$ ziQR(3j(O0H`8nH2;3g>x9>&y}J$}_Jdl94(?)(bzg6<^W-ptL)&5Ek_>I))EgwEkU z`3|L@>Cr#T9W8E9sKy*^)6@W`N}}JfX?9j!;>HuCmV#v9o1#z(>&B4SK}Cu7a7NqQ z-2UxSYH&s0Mm6iaPphmuAdfIUB^v_<8LMhIw8<v3+~~Q!AxJ3?!m(HJRPslM6KP*6 z<02hLkGWjn!9zOeP3PW+XPZzqCN48bnYreSSLEDz)R@<Sge%}PJQHq5^9Plo1Iyn% zy%U@yyy-}U{DIWgsWFKxG_cvM_C)RwhzSn(2QarJit4ih&$JW=o2jW3H{sHMLyD1f z!5;N&x7_0BsPC3Ep==0GU%mwxS8zgmVP2YGjlkKGMjvxqzAfzwqrL!~bLgc`&I?d+ z@qv{N4DQkusTCad`B4`+nttA_^B|h6VTEY1ns>ktG?9e0mElY6ix5P|=O1w~AtRbT zA2uEuxJMuJ)hvBZ<0=oivVc_zvIkKjzltSD8c-(SPh7$hJz#hm9n%L7w6%WK&c5v_ z%St62z7RVs#o28zm#>Mb^n~AhOH4ock&CryV4!bPEKnnp+dQqWQWg0V7O6FUjbCwA zd)Hi~CpcXORycw>jP12xZOCjT7#SGCuo(23AvD3@Fj0L$7}ioTvSaHbM;`Q5X{1MD z3!h5b@z@+~#IO;l0?)&oEjx~fm)IBAQy+AuBmQHAv`oF9E=ph9pxIMX%pSqIMlmj5 zqmx-6At(WgCcA(8QBG68TYTQ1I}I&B;L67m9-Z7Dn`n0Udo)j=2XU5+YOFZXs)X*; z;9fi~lWItzVRp)A@~5<}DKiE1*tJ3;WsWLG!mRva!-o-?v+6Ikj@m6Qv1>u6m8KUH z-LK9j%aj``0pf~wVAIll3!81wl4=u))P*%s3yV;Nz-?B?YrZL*hJI3G!Rmh0rDS+1 zkLA`|HFXiuXwVj6AVc7btqqI~B3h{n#83!RIGci_8*4g%V>_Ss12rDwx*NRt`2-c1 za568hAnpbb=Ort!dW^!#@Q7SnWo_RO*Z||{VP$s!Qpu?)p*9tlmCaD*Qlx0=NYz$t zqN{qhHn#wT$$;P06MIz`Otx8H;MbPieun{5v$y^*s84BUEie*g1jzd_SEa`RSKtC1 zMiAkgY~jpM;K$t{4i1w$&Cl@?8=ecp)$*8@vPE8$d$<c~_6`hqA;C^4;y~b#5GH~> zMQAO4DS!cb#4T>-g-zZ4szTQ+Z9I$!?&fka+%^8nPHwwfzQbMy3YP@rJUQ(#fGKkQ z)76F<9;X|LaMCG=)79yx=wNfk%P%J*LxDa!G9O%#K;GkMZ}v^n=Va2^4>C3zyZ^;; z%qfJLZktE0Uq7&$?|H6?T&z#J6eeVBlzRS~`1%=XQ5@F?aRNO~IEnI^(5)|Ro=n1P zRpMQ;OjMh0uwAlnoFmC~88NZIvoT4REK6T8DjbtTWfQ=O465Y*$WDBQG&W9vvtVs# zBbR&PQhC7b#LmdCW<*6kC!-S;HaO@$fwXE47qAf7RCvbcz3BPK`oYT$aceMDD$sMB z5kVsq#~n0gWukBb5ua4X_-Euq6Isj<;WySX8c_ZL4h@dhO|wP{2+uL#V&+v1yoolN zh8d*72~Nji^&j+N93w*hmAOk?Af!!22a~f+M8|-&r!h~$6h4&j4Ca!d+Rgsn1=(gQ z_%1+QLRZKcp}2j<ZgzM{Z;hG>C(mZvw-cMt9Dkv|_=Tsm;%jA+y=X$gFBK^GnnQ^a zr5v)bH)wR<Jgg&PI^wJ=2LdSe2x8Yc@)Sg!OY>Ucz%garqJj0%0p}{2IC6qiw&+%b z73m1|Fjbdq{Ge`d9I6uII&A}=vPp&<+NX*gV7!<^G-6emMVshKE}zzndPJM3l=9&= zHqkJMiXJzWc)Q!o7IR$LJ0Zv<9*-ZIMo3Mw9qAf2std|w8nR&TX?SEABIAEz!M3E4 zuazi*{TtEa(ja6sp+jSrw+)W#hp;v0Gsa+MCCAQ4!je$p-%)-EtbKpAMA4ftyW;QA zJASZyKr;QJcI#|8#ibHT4UG~R_+XCChr%amRIbeEyhnj6OIhP@+VSO!9D#($8tl$d zWyRUa=#JO;Ow)kQalM57I|kz-<8e2Y(k2N@nYP<6KyQttF^CbkJ#)M!gK&05*|*9n zlLzIrjT~q2rm&q&u|<HrhwCjC<w$o|PZ>H7!=!{>v|kFpak0DvyIr2kFWmC>lt)UB z-bWWt@MH&A5alV>16ZzMDoae$I!)*#EWI3>;0`KQg!7Fh9F!m8on|C{L4IDLu7Kuo zfRWjrumg;{$gA+cWLhuFj8cI3c6?q?)}~5Gc%l-9W&MPdP-iww-`o?8f+(rUPTnUq zeMjZzh*A28T4%5lNeCq_DQHrtqln1`nbQL=o9j5x#^(E}mMHDufHBaHRWXw25QEC` z?fs-!lV{g_@s29~dM4JoCr|DwJ^}bp=Q=}2cIJr~XTws_kL;Y5;U0;$a3o3VY0o~h zLPvU+Ad3Z~*@iZ>|K^>MV>#Uqp)2on2`GTESfHag)-AI*C`jH5pU~()C&eLl7d?m> z$h<ggn4w)=x?yr{s8#4%p|H}gLV;sf0JWVWEte@t1y-fw%Fd#xlt=X|PY4iOC8X$6 zT?(kutwQuTvEhLry+S>b9(m}mO#9Wb3RRFmVsNiin}PJmJ2F(hXj(vaM-fy7V`h6W z*QAo7Bz9{1ye~#0Mu%QRi5Jt^a<wcyEbgFBX3H%e6qqdE=^<?a5B#H<%C%lMh@!&) z_PfcVcIaldcSXiN8Yv)AwpkoJe52ZwH*!&hB~>2+2asx!Mtdln*YuYiB9n&3qljXA zJjdxTS0Y}Ch^%Rk3=5p>@x<JL;;JGlS*(?JG|>JiWut}nJ_sU(X!3FF5ZG96D&U;+ z`If_kXei31I?CQ|MK2MqS&e$@!L?4Pg3j_>sFYuF`MJAor*QG+Uw`}mL`5+zvU`4n zY<h(_wlNgvQ{=Uxjl#k}2`)W^$2+YZcE7P~V$1XPOOnFg-0s6xryx<Is0C$ERhSGo z7?>J$Pz+VL7W~KZou3HN2^Vj(FVm^KhaBK|M$hqrCE{@$pms`|BMYrgIYyxwdgd}u z059pefS^P<z;V=5d1yI3&GZyTjypyFGaQD>4>DN<k>6JF9FjV3K_+6y37>phy5Qyn zq}!wr08$5b%)#5A?@bPaN{-;rC-yaQ-ax}a*5luy2+HSl*#5)kGX8_l<iFv1EutFI zX9gm!UsP3rBo}f)Hdak2Lf!CR4CRPA*t`*00}*T_$NzdB3Lw?`kUkC$ONNiRmXubw zU3!(m-so`A_KGe^dXvg=6R+O`tOZ|e$RKtP$;G`Ec`Q(Eb}r9@B@;HyhmcF<mjy0; zmt+K=7xGL&%~<;8{D_BTH4c1C9gN3#d;WHQ@nyrtE9bHRY(JHE)B^qZ0%SFihz=Jw zy=0Z|z3`k}3by<&H@I4N#W!dxeB8dB?Z5c49$_>l2co?eVpQgel4(R}oN!nb(|ICc znMbY>n{<$@M<$;PO?UQJRZ_T{(hJs+f-@IvYRuS@GvVK|2~y!>F9ms_GV#_7%jg!y zR_!Zjwwf6UgMWvTIRiGG|0vj&xTRA|id#y1z$^V|I61}02L)<c#2b2VY)d!)(MZDW zrOe=YkU`S;H)O2sigAi+$;MJtCGjrsO2MT>Rw<{x9bu5BCf@0`T;Uj!mCngkwv)qr zC9L5(aq94invWrDs%sf@pU4cYoYwhqNGwy@_2Z8wyE;<TSgLJgAh!Q@u2}eAQh~rb zq6F2_ZgmF@x65%ZHuGBVU4s7(=EJ&pxKfueR&`w#B<A5%y=85(w76Sh=q!XTXqE9B zjxodIW8j7H-$^S~)#@~UB4)0}fD6B99OFwt4MjV1RKi)VG-_d7<1!$lC{tj_gCLMB zV;WjVD}aQl5b9PXw*i|Mtj&OkEKF<IIZ6ZPOOU;F<FEn<osEg1Tr)ri!y*e=bzm16 z5ZD^@!#HM&g7@9$NZ-}XAYf6S0;*W>GUQ%ykTgQNgj8Q#Md2hy(6rcPfeim?I50H$ z4%Mpgn9X*-IL<e?dW=VJ8WCoC=m9j*<VGvP4GIF4Rof_FriBb12GKjDaDmZ`s(hu! ztq44X+F95mYh^^*>Gx`A4TRg#b!8f^qiBU)6C2POAlqA3(*?U|04ef|kXmg)fA_v@ zzkRz*XNF)|v^g6Yh-P>tBqGrOL6<>rqch$IxgD_RYO4KRq@ngtnit28c;d6IDU=O~ zYh(J0NP@uiNKQI@{>8`Ne*7Zxs+6Qj!*LKJg!%m*q)5vO@E#Q!bw+U+1$8c+*sbeS zy{zLv+v5(mnEbwihF{dCGnRIQkU}I@i?{GX?(Rr$Qc@Vjk`q-(gvZ!a!y5V}GTS0i zlB<L_>Dy}f+)DwwaT?)EXS`<QGB_gMySiNLpzSzKSxF)R>CUiMQ#`1h>VDuL`VFPu znBYoOq~n>{6}sWCnq>hIb?)fJP<otka?2sbAsU_zkQ!hVJ|l~x=)y~I^>@F0@Y$FD z`mbLH?}4)($W27GVO{$k`BQs$kPDOzzC?&F-(P%#N1o^Vr#G_&A9CkH?l}FY24hzm znvIdlg9%urbq!3z^AFx6AW*7(YyJ&?;}qPxC7wv)Z@+%{<_bsm=%~$aKK}Y)ZN%Rw ztyRPio7c$bTZt`ai8WZvq{>@8&9>jh(;{O)KaUlg$udZ)P0%k|&j2-hybPQRT4J30 zSnDC{j4lRmpj9e#PN%X}{7tJDo(aVdRv_x(8R&UH4)39Uo~^L(dU(eF(G)Hn$$EJ9 z)346(zmGrt>hrIE`qcwkdp$hk{pvsc`GFiQe|RSU{ktT4YxuLM7{f>Vu83dJ9nX=< zTxt7hbvYf-sdD-Qnc#pX=N+&_YbkQ2X-AJMty^kbY1-G~N{7A@ryVjKPJfIF671oB zUWHo-wl#ReWqKx97$Tj<7xuY2nM?y39hLbsJ5K4GQUHay2a9(HOxH0Cjr{>aM7+=P zeuT|bTYfr=$%hN}l7Aksma=)nR;mpfmQrn7vy*DWwv|+yw{0YE?kpt#=^xBK+URwx z1D#y45RQdt){(ozaVf>o6WZ>uD>>2WD|iJpBK@5AMMPph(NyJPEdLW%@J~nFPVLru zFhlCV=dn{D{vr8zZtEqk0;~`EPIT`z9od#b$smmX3T4Oei08Y7cH|%<hehw4*dYKj z{Ja&J#no~(2Ofc0X^Sdo1n*g=Cj8p-)#(UlXUTyqi#+pId?q&Fs93EQKRrhkHawg; zoxh{Hhv9b*B(^y}g3xXYDsccG>f1n`@-{66bNE9`B9I`GiU`0r4uy;(J${q{N+bW0 zi22bT(Wp}ZY5AuEWJvi!`k$b%T;qty;l*^e(_4cYqnC3DuB|V)e4(355@6f1{&wCc zVN`()Pe~a&us|m+YLqMk;{Sp7fIziTN21zflq7)riu8!k5j0q>oP-oyTSVG|4_CM+ zcLd(k-EOnvuaPy{W3{-*RnFd3C<LONaC8D*&}!(ZY==8y?S<Pq$gt+xIihRSf?y35 zRYF|{Vq+8WnkMkj&p4G{*M{Bl^6GRRA+fd8gllxqOR3Z;Dfv<w!Ul=H#&cCEu*Ez1 zieZl8=`E8(lVgqB0GT%#*5OxUe5E$(n3guVySFq*r@2e*);30MG0I_T<BF5xdLT}n z!Q_hHLqhm9RqS&Oqh5LF(kjuBe1x)N&0wmo^OgFB?qq1KdJ<Mh_vAfo%#Or#$npNu zpq}JFt=GvO)Oy~+g~q;j@u3E#rW5LdiYYbrI?0P#x0Bqc^*YUurrj_VBu3J9q_JPm zlUl3$a-}fj+1s<Tt)1A<;x+v}3R|ZV1oHCcIT`wvf*rgbM<rtIN?MkereDfwHe9a3 zmLgZLa%UdlqHvKPl~Hz+q8LydFHAPV<!nU4C;T2Ka)7<dn1Gi>e~3Vk6`of|!X^kb z93?n7K^$jl!Ji(7^oS#5&;uFrPz%@U1;WKElK8-fj*;kI$A>0@%iS+HNNc9T*+Io7 zpDYCu$C2De{JWp@@a^i^j;uvJ&5<>#<TtVw&BR95u9?w@?P4k;e*4GDVbt(yCoi^S z-*54NQRU{TXf?F7Zs0r(idkFB{0zRi5I;m|*%XRyuTbm&m9i3pK6wnvlF(fQI)LU) zkVeo93Jno69CRS)aJ4&T#!ofCaM~h8hpiq@|E`h$Tpi<vk&qecIYP7fxy^id+E8@h zl0N*Kc#O&999Q(-ZQxT6eEb|WO%HnfT=wc%33=0vkT0u4(XM42Nw<}~Y`nt?XkSm? z;))F&K^8nTB~>4yN6dP$nD5~p9Z?D_>jt4Hu3@=0fF#mq%L{*Gku|5vgls5b_u(p6 z3_a698koLthc6x*UG{B#O}2pb#g^EO2|@1Y@mRAp>N6oQc|S$z!KjU)2VK-d7c(4a z76mcX&OQe)hZVM=r#pQn$p9eom2)%^vo*Ede}D-97_J>BS#_dEPB&UEY&)YKFtW88 zOA3qL4=B_jc?OUqn4ajy7aacaej(C<yraH{lMX~SgPiFhDdbf&!A?G%Zddu^_qcbx zb*F%Vf<^-I28iwMMsy&A45aF*eTFay4T5-^0aywd2T3$6<p5Y-OCzyswoWY;3Pq2% zP4*wC@X^YJP>u#3VuH8Bp}r_@;f%LvL|jhaW+N5`cMK8}%#z;3&g<!3g{N$~!fOSQ zLlvDyd0KqUV<gr(3`P$|;wrkm0Fnr_0u5crLL4|k8bw`T2qs>9T2I$FS(AQF$SG|y zD$=NN9W-2VrOa7id}O9rRp3r+pOQ<8MW!#s7$Pfk$0N;fpl5n1vyOA%%uNCd4GmaC zm388|pK%s9%R@j{R4o-+LWrY!c>!_24<5@R5A7~A)+y~tf9Xh~Hv-a-_6T&Nc{{!X zHOC;4%T8@tgW&Yb_2@n?pM1;Je(6jzKk1Z_vYlVdrO=Q~HXtyj|B2%a16#GLDPo~3 zoQue<whm;q;`}=HT%}OzYQ>jU?eF6*{rxDV8SVE<keFbD>vgN~$ZXzYQw>??bWH3A z%jXO=$Pn9VNWiAekM=!nzl9Y!!=Ney^k=YLk2Ni8=lr|#tKfK@h2<g`c1#=oE$FzV zJxaiLl?~Y*!pUsg@UT22nQ+o1v~<Yg3*WqRUQD$M92hOl^UdLaW6LDZNh%@#ODdz| zcES?PI@ss5bw&9|N~7g0rFrlwnXcQ_gI4X0TRR1crM^NpswEknIbFrinc7neYEMTW zqMPCPqmGKUy~A)<C_A~vJ&aMRh%#=`c)Y2+U*LNGSYM-doNB{8nRl90F&uYAC`&@| zel*1<)iB<9GiNtlZLg-(-M*aTDogy}2Gw0_jhWJ=0<`oKjCw%w@5*QFZ1AcQ-POI+ zt&i%^&?`bz!yTN8kr7I4qmo1V?HZw=mP(5)Gk2t1Jx2|5-0$7Yuz_tyd%G4}$FS|4 zWrPd3%~3{C2k-O&V&<2FOkMacfc?d32K$TWCi{!u__V)<P`+G!*d~hra)VW&bIWqZ zdY`J}om3;07w45NX6(2$spTHEV2EZ^*(u&JsM9PhgR4xj<GEtYB>#Rnmld$d<O<bZ zvG;4<pahHyBI6Wk7&zoP#1AY45p=5G>DtAp@osR9fW4Mc{Gs@=#g$L4_eyM_AyX#M z!#t~aPw$R6)nPj(-w}S7$Ft>bW;-E$znYp-b3RdW@HR(YUMZa{V#D;}2-^}d-X^o8 zCEi`5IXhGCq&+CEPVDlKz;?bI>K#@kUh>u#&(I7H?_;$Dd(O)Ba4%ZZ#D}YFxaRh@ zPj%VzlujFZ=xT^B_dW+0&S5!?H?K<HlFK%WKn(_NgJ7Nc)%@MkY8rJ-hn^=Wr;N5g zlFEST`!(GG$`D`}_!{?seAUaoP2OojgPGg{Lm>1P#gBCv-e&+w6P7$?_6yvVTD_Tt zRHyvA(q4-G7TjQTFL#?`;p?h6mtziU#3dzs)bhLB9t5?0cad9o70Y@6Se}0x9Pre& z-)LQ-x<d9kgPBO~C~o+L#5m8Vf8Kma?c=ZMpEqBnzq&uw;e<DneZbb0&nd#6;{|M! zx)E4PE8;@!CsD#(OezA-07+6{j2Y(XgSJu#P3+>qbxjC#h$9D;WdsyWKFxqTXgH98 z-Cn$RJxZ~)SE^_G)rP%PU|C}+aePO;s7=HH1)I`kTc4OVYZmMIWZe494?c2v<h!_K zOCQ%V3rje9UGMbwBMyd3d1Dv(c82IiwS;QAZZJqB#3Hby_E}Ir*kN=eNAX*(omDJ2 z(Br`M9Oc_aO|U-B1V^}E>1L8(xXU<30jte>M!;umgO#;yfpIt?bmjKsC+->PEX*9> z+j{QoSDkMnW&ofjrFiOIX@R$i(i7U)O}W6?mg@SaoEb1&F8AIFt|t!^rkO9R>z?Yc znNr?<R6hyD5VD>O$)};aMu&ZV*t8@w<REg{EC$(pdi;>T*09l>Syf)8qTfzrv>`v; zE?L1x@J0PTbqm$si(ZKV`3~42t37j8(T%JZ9<B+_SdFygiSKef{mTZyChmVB@hkZG z7=Vz!Uap6l;9wf|-l&{FpF}7|QhbAQAvjekZ<|`Q>hTlHyghW6>cCi;>0+W>fcU}< z5!Ey>pBoD#Ss<Ned1@5hddypn*XAG{!0>@rB%;&`P{J-gM1ewBd0egSICwC;xG=jq z-`o^js}6{U<$OUZ+(SaugU9nebbz|tg+dcE@>0m^)I_C+fNSgVn4^dDVI$xZSE4H} z(TB)-(perZchfDN)yWT<r5deFAlyc*K?y0t-DOP;3?8sR(u!Bt(Z2xIiZ3G-tR7Eq zlSOxVy@t2F9sxfgJ{cHtIh)~_6=CbVW|OMWwAA&XQCu##OBshkWq#*WZql*R{dRM} z9=RQo(s7fy3Y1d2j3AZy^=4H1Vn}sjVXR_B!!?6vv*kf^x{77h&D7ao+bN-M+!+cV z&X+hYMsuS-fAW^F)&?tF+gR;6??RuHe#Xw}hQ%j24=aczFnlZ=#!QVBa%hM?KH3mn zMw#L&D$flvg^r%{eFwX23mne3yhW-gQZ(R?uaq?T?QZRrGp9jVg=eIVT(XDb5P}nF z26X#MBPF<8FRnK`R35LGSrwb)V*)Aex+pm(XkzIFKoLYk!xcDFV3MU}bjSoffT**o z94)8BuZ3E$%OD5yHlCYRoH2ZRAY2~Ub4Ae5C!b<-Lh`|qQ_YIK0fq1vQw@WoCKQ&F zLM^cc37iFq`cxaLs1!xrZbtyz2@VoEWi-c8RVHZ}-BE8@BagA7t<2R%2oEVicDe0W z9W{%gyMv}b?knMe9{nC^KdHzvR7wddnYg2_6NRxf7g36<LlyEguV|4@oGem?Vx~Ia zMcEJ()CY@LQBenPY}UTY`3`-wsn#EqwDM|6M5hSvr&f{KMo(Cy*!t&u>n$<FKILLf z;*`-o#~bOmQ0T*qCdi$v&y4ezctL_aqkTEY?Vbu@ahy3_<`Exb!&EtZP7`_rMUuZl zN;!TpW<=oo0}4@(f-WtiHz^g%gHJZb`e=uy!4r5Ov_{HtOQZ`NiWRvmLnEFZAZN%? ztr#U}spx~=?&#xJ2BvLQCiTeE2?qU6s8b$jLO0zrO~`?!D(oDA=YwCW-vYhN1{X=h z-Gp}m4U#uS<E+LugzF@z`w%4tsm{{fz*)NeH*@=a)c9YhbAi-&yNTUNspDUcWdy9T zX;HPsu8N?%ec{lnP^jS=Wf7|=xs<l?ybguV76$VIfz)rm{JHKIu*fc~g8JGT1_1cI zy@K7;laIp;X=tZA6l3ThO>=x&@z18kPJfQPHVgc4BBo#dvRP^((Ri9eFbCs<TNpm| zm#KEZM6>zWp@96;ZmHR)CIX-Apbv<+#)Pq3E%BdRj8)a*=ER^v9d?)JpL&ASAx3H4 z9VTKMXPkQ8dZeo<Rl^T_*Og0^?fa|JmEQa|$^l05A^o#|+Tzyk76WxWoe+cxar7b4 zec(a#Rz2`oAr_mr4Sor0bEBtAg_*Hd`)8XlX0hmxXz<2vb*a#Dmyz`c*SJcH*$qC> zdzb$2%t@d{9<<{V)wG~qaYDVoF*`gy?>;8T-V8eT64l{|;;kL&Yx}H`w-|&H??%P5 zfY@SLTB4e50d!`%;fcohcEqdfd}Lwd60@zbC~&pjyR*qnZe^Ft<N?ss#o~F)Fa8fz zILAN!Jt%QhgL-<J`-DbOYm`v@`qh^K;ursCJjk!UEI>k9yhb8-RvqZyZ!yllpES(( zy#kW+eRfYoPn+`9-iMBlbl+dzd~#nQVS2q!8prFgFQ4$B`_%$x*u||RkMaqlxy^f| zs_j%_ESEz7_&x~gJg@gCaUS<ISyv1Km5fNI==js|9A!W8*!k7sdK%EMyZ`c)ABHEv z1b@YQOI!z(Ns8oS1}{F_KztY3m0Xr?u4)NU!;PNBbzH_Rck3Ux#4E0UJuc+VXTZe< z#pdQCezFv$-UD&84J*%>(zifW(%~I$oKZ#fC-i{RPM1&_D$Df{)2V8}GcF`)C7A-v z_6*d1@mJba@N6_pwwL?At{!i;AHLmft{?5nKs$=T84ZZT6+d19m=tkVk0P|i&X0qJ zRO$ys8M3c@3O4yzN9o(R9i)z_g;6~<d;e&?*?2w~{VlXU1p@zIT>1Ut@ZAP)LFqhh zJi!7DC8F4}S^mMaulExweSkWy_BEA00KQBv^QS*Q|NfiDd~`pZ4~j<LV~z|>{8Div zCl#Ydu_|1-VY78$v>(=3N9pl8)x#7_9DKJxvPJzsQq2aw_%&q}>DHdO6)s}K$F=z; zU!0a`vT_bxIBH{vClYU70wv!At9JI9cKqpAUj(j<=?h>NNT$$Rz^mi6ZJ^*YKEy&E z`4C^;Y6z+ut=^JGpue*nQTmL0uvUStaptFAeRZ4Bp`E@ii9CKl*o1#M663}7s72vl zi3~aIM$4j7(RZ8G>YG@cI-N?f=*?#oRl8zV0Yhx{ANJxf$3X$$jKxeIT_VGKS*EkK zAXKH=HeGPzBHcv4)@32Z!kaR9P4{Q1;GO@7y{GsPHW|CI%%k%dl-Dk-R0NHZ3Fjey zY)DjLev4WUd0;}=hR+oW30?skT?!fq%xW55_g12|cz<l(p1EDsegp?D9#M{@4V*u( zH+YUTPEhH3gS5n3y-il$t=<UnhSj_MAAPF<zA0rAW0qBNQyR>zQh+@a>n4qxL9c6d zzFg0twB-HLg?V&|Qcn%4f+{n%Ic^^l4}eD3(;MtXn@_+O(Iq-fz+Yo|Ht(VlhXa$B zbQT~(gootQf-qMb7P!2d;t_g8nPjQ<orWnUWjVJ{;)KVf<HDkc*N;>ZZWLbTt~wY6 zD|b@h`;?DSSKrRjc%SJTvZx;8{Ups7{`Mm_DNu&&-QsgK;FPcP#rg5_35vTjb2S+E zYaj=I#2O=S-CAt;cBnNL*AMFL&*>E?l+(j=W1?5J1)hV#Q*{u6aTggOFIUtMLjb}a zIQe{WfoaFSlmcMbk1V^zGjCiSWrIk}fLWSr6ev`!0&312s!y|doHZUM6M9ZrVudo{ z^4d<&(7It_mJ>M%p+i?(1>^Yr`CsBzwy}&Ok7AiQ9^1;2&|nucc*$y>G|1t+pt2g` zbTWQN-&0p<de`9<7HKH7=bTnK6c%zPnaXWL6CuAGAMn1V`0@p%4IQTBCPOB%PN44? zLs~T)(Z7^QB)&?_>Xa;nsWEH@^Ryt9^{=Vb>3|xxrUQcf!MJpLftLo}a<L-ep)Pp5 zf$sCug<!~bvx_#5zcFXPzpbUn95LR$!Q7aZ81ec=TucORFDKKB3)mD&2XmG{5DKtl zNl4R?V#tPxPAG|t0z?zPwoyLdHW2pFIKHcOT#-MU*rga5FQOTHGycW6tFoHFP#3`` zsH*~utd8C38h)B^WF=&B(kYlMgSa4|v8!&5HgGNit#Z#;gsTxaB$8Uv=)RyObr=!d zP{&58HL=Bk_n1_UI(d%8nh)&o1a~UVNSmo|%Y5UUi_I9Opn<b9#J8vx9EGGgEFbC+ z{w9+xc9D@F8;79|S6Ou2C2Qu9u~Xz3;SD)=FghVU6%d%CSe8AU6WJMuu38z!iPw{D zDjX%K{JG?YlxRO>hD>HtNL9R0q-nZc@LSS4(bi~6Ob+bK&iw|~cwli#itxI<VyV_Z zf%L0+m6NcEa8E{wQV2VH5&NF-2|!OqCa|&X-B03*Ksy16Bs^EwGDbN2!*y-mwG-Vj z;D!6Ay$7rUB3|W4C&3G0xXmRzm@BL8_JX9UHfJO;DDt*BKjmw6*0NzjmQW{w%stiN zw!?KWBtUjM6Qf|l(XzQeOu~*H?(V53ygTx_R2>&~iLN|gul02ld7YYM<lq;Ch>%7U z1(rW*z$oHMfY9HSM0y2wRGToCbtPHW0Qc89oK}z(Cv!q4M4>0pFZ3{QQycn=w|KHS zkXL94;sPWhUcvz{!cvZi2=W{W+>TO2k+R0$LX^hJx)LoHE3DJ;=pnYdg8v4pE%`?D zCs_Q3Bl{MeBwX@<BbySncEYW)XxtdZtX@MN;*uKgQNYO^1(hvh4Z0#LQo&Z>P*7nk zFim4X+Z`&kYVz$CY^_22q`c&#jA9stq$;GhStxO<K(eSwY=)RM1PfBaHq~UaUVUJ9 z$P21OMto*V;D-s;6n)G91*{2eiy7s2QK40Qn#U-QL1u!SVu5q);aQr1f-WE{91DGr zX_=saR<?N=@otQ0OsaYV0-97KAB5+y3AhRmRlqd>)p+)5gL2EcJR=d+KJpM{=w-Yf z6`PM=MA1Qo<avXrZY}gkdr{ds%~S?XF*p*O?N-#_C0fGZD2c#KAiMOiqTULi$nm!F ztTq$>8ir~cUaPoVOu`iGtyITDH@|<Kc(e{PJY2Ffro)KXAb6x~PNw=1Ucn662M-Ra za(p79E0CkhR7#0yATWTSt6kY9UIekkB}YT9L2-^@1t1Ag26coB?1)|)pKAAR+H5TU zG+7zcFcJ<)t4GW=%L_E8-ER=3!0;T33o&S3ZNiBi_lre-fT7uon8cd_PPXr_kY7u; zu@Rla01idb@Fv`d&0&X)*>Xd=*%KJ)?EsQ(1az#O%oruI2!mgA4_1>XW)GcgDNjOh zJ9+^)3V2K>+)_MpwsaZgVUfnCi$P-Se*UJ7YB@#~ac=}!0UhdrXj&I%!AjchEhJh3 z_?myMPA9e*iR7nC2<FP)mJ$QVRt_rj9C$SP9DWx{7(9^Hn`KYV;G&+5o|jiQ8A+`( zEOCq^!=Vnz8KWNdxmT$t4{9eHVcmE|6HL5CGNJ_!o0xPVC2+muPL6G6WI>H-FO<MU z(JQ2Sd%vS_3a=Ve@aH&o39;8NY~qg4yPOv}RA>onxXWM%{&34M&?$JfA%aFa$HyDr zi8mM%B>B$buqq(rgf1|U);aO)=k$3zHv<INmC3CRC!N*;zZ8gfRu%=<;e;;9xsCvB zk3_d!jW#f&T>Vg@+t^cGbnGbs9`c8yEv)Vj8j8gu1gCJv5pr!d=79$JO=e8B?C214 z)fj}7n%wCC+h&2SGQ|J2&Brjcwz0O&$|B=Y0UC`s!0q>DGo4^}?3@n0=za*gMr&;& z7Q2PG-Xs(3KLRe$YWBs}wCyUwbU1@Fh)fvx;0~mz@G5H+NGU(Yi%*fx>ck7!dZQtY zRr>N%%#63ALnAy95V;n51!zaysqJh<)u%QbajLLqfa=gGBEoD{G`1K?XXw-1R|rO- zH<By{|A#zU7!-=*s^wYl9vv@H!MAst<|12&0-5v_CqCdHYkDz(&=J7X`TQxpJNjg) z1^6f|n=kY7?@14TjFZNry9?32@dZU%rz=8?wb9An2Bm8lujR;qI6z+BX}1&_*pt6% z<<QwKe@wVqjK;6a(|Di}GZw1$1fOpFKcC|5YtWnyi=)Jgn>qmo@)_+L0%Q)6_7e%3 z{SKz+D1t*BFwTZNMwKM^4qd#cE5H)#Y9osyGTO)hbooy_mZ_?2IxeiHnoABEeU!Lc zK8Ldo>TYQXMhe<MF2KUkIMRUqH~;<YWpZ@LA(b`#{eSy;v~0)lLX!r5zSA0pba=CQ zg7clB6A{LLl0I&BxXaBnn13^J{bycs_UH}cJmt+wK3*!ys%*T!k&5knyr@~)74Eoa zA3az4=RnzyNILGx;$n(8_x0g;9@rO*2F%03+r<qH;&lMu@$6Uir-;BDFL73tZGg?O zpVxv+kCS5+Y7;mORbEtMI?<d?6!K)^0<4HEaKeNF9rAh!GAR=$r_drxh#US2*GEZj z=-ck7ShwTU3Ue&Oo6bj)_f7d6@xbpHqB0kyEu_w=X4lFgUeb%kLTBOrFv4qkFOzR3 zOB=@jZ}f2TnKXa!8U4Z0cKGsl=V1s!p(+W2ukivS*7ggW9ydb^_=uCOw>G?#J(b1- z&K-DX{L8ol53tzH7TW_U7u}xFu^fTR{WnLP<l_TuRc%@Bl`y+)o^)r}>~%7A5(hyu zLF%-Zdz>O)&dHBZU$-Txx=l(~PVKVnAx~6Ow&k8?0_UePUQoqLc3qB0@|V@2Izhwr zbXx&abO2~FKv|2L-;Jtp?M|-q5p=RYaD;3yor=kWAR<|1zc^6G_2p|S$g49kO(NI$ zNW0(!E7vSR>gf%BR)tW`$F*}|OY+n2Eyh>*@v(P|IN0^IbtMFg=J;lJ1{#C^fIG1H z)<*#+G6wnQb<EQRm>6b<C$Yimnic`RcUj677OxXa90MK78AZGCq`||)!F4Y2pA&GI zNwYB3okN(;_As`2kw>dbdN%w@H{+=rUgYJS-(Z3Gf+xS})m@aXY7XzboszL92M8dM zh&&BWx`69w^pJP%O+3CRHPQJQ{wa%`yhDjRlI?&;yV(`)diW+Fa2mcwY-2xgp70Dk zh(R^0t;y`-Uw->9o?+;!Z#nvdGx)q)@NDS6DgqRt-TPt&LuPSUI$XKLQK7b%If5v9 zl6Q98B3GHIfv#CRa|#5C<&L6YE2R`_XUQX|*$U*o7Bv}ITe!H0fz;)83mXBhsvY=A ziby{YSpDgQ^+*bn<di$|3eZ$A;PNl9kWfT_nZ<;TcGm@kz=^SWMQGi)KJQ-$C>6y? z@x8+C#`x0cmx=RbtbX_<ZEhVw`0lSQ0wCKdW`BHZMG+p#Ns)wfJTWw|PWKlc7|7u{ zS`~~mj{>yb#M4?y#=f&Fq+Np%Sg^X-T`%{PK(NdF<)G??LSJ?K`q_EBvTtF2+`HDU zYYLGHEae`D0An$KO?3#xzx&lm)|zu~p;;D_rY&DR{z|h!O>kLYm#%daa5Ou7OV`o6 z7!EA|BE-rHt|EzYzlqT>1@cgu*{}Mb^$b|j_SNIZR}1VQsG2o|4I_*)9DzmBeh3XT z&Sa#@e(eJAmfX<$2a8}!I<{Byi+#@w@h)zRTH(g{Bvt%Eif=IR>^M%>*bXGe*x|>J zPxlt*x>oMa$W9HFGR&eo8U%$P=rCRWtB1&k+$e*b<d;>!Dy!CjXm!@>G+*xfq%CUe z*)}|)7k93$&aW(ziSOwO+>uJ_>4MM^{ffh3G;?Lc;0qR2mxrr7ln&h5)$%0BlVamD zPZ%Ikntydflt;NT2(B%!WxOU;@eZ#vMO8(se49>yZt*4~jC`{HfUD_wwNVmCCF!%< z;qd%5_5|?0a><)5M7YEWwJ8oyiIR#>k5>W2ZHJ9WMT0tFBMvt-rI$L|YU9=Bax=L+ z+L32B5p1uvlRX}{l5<QlbW#ndj>p%*V9^=dK-&pd%a&rq0wW9oMzWe_Y*8wXE_D`r zv{+A-=7>eeCY_zhf8F$gp-_MpGSsbGj;@Zy{h)u^y{GG|bfMFq3Z)aW;R>vIZemU{ z=w|)cUBk7)3$=Fs<g5pX9R7S+WUXk^k99-mUVxmRUrx>e=B-x?B8oVgdRjiN1k&rh zk(S^~$s!qspr4}32a&`<F=JrMDlnKj@g<ye+|Z^2h3@w&3^xScW{-Ic|J}VmLu2BU zik6%r+6W77Q5}&^mTb0A_AsD1Hh&c}rV;~-@el#FP!&gv5I$6g-~>@Jh#G=(#5!}l zzjFInfk>=a-5zpkh~c-m<1IhOBM7!+b5anvho2rDHrLD9GsJtBWF8aNaX-asB*2S{ zOxKF;2wek5oRSx<5RZmdQSpjK%k>yg?qSg0hzL<UUXYfpl{zRO-xl8;O~C&F8z*ll z<$iWHqDgjNMp^HGv`6}n<Kl=>a6cP*ES4DKu<h01r_i8<M)-M)TDP6v+jtu#kvAz! zb+`seVYD_muaKD*z9C2LMWRgkk%Ot8BGS;Nhbl?_kYcKkB;0zW+*A7E0@`bUc9KgY zMJLl5849EK!L+2J!?eU=zmJxS_P{I_7kEl5e}X89(h(fnUo9_`U3H$iF>2gv%U{tv zuKgg2XU5)KCyso2=XOF_24!=VJl2<AzCXWKyHM}DU1QrcxvU3{QM>XhtrI4(Ms(mV zf3;fD;p5>7g1JK2N)}}-L+Sg&_ve3UYCAK)8qE=fQx%an8&@zb)@tVW8@8b}iFwOU zIM|mKu$R;&;STlP$Y)?X2;lV<Y7FE6P*yy=JVE~ekuu>$Vs=w41Rhv~{Y7>+(=D|I z4)VA*FyMcLkIQSWZ_G~_g->$Jm$xsJyXc*js!pj#jZQ2Um_!01p0PnF=5<#?DIhB$ zWB3W{#DEHlei91l_jG7XMgR4G!-xS`v)nhx;HNE}(i#I9jvlZX0qAE!%(Nu~`*O2c zHMI~}WDcYf($NtscET}G5}*jY+>zmcX!wXDR6y!6Zv61}H8Dy$4SKQIbboa`%s20g z$wUC{kLR&!a~S+E-SeA0Z(x(Od}7V?&Fy?h=zv#0-zE>0RUyEa+bv#QOT-uqnZN7l zn$165u@DD*JZJCC*c8JYr5a+?G_se9zTHfwvsrm;tc>(+ZA2uALQ-#(F+ws^qxB?i zjE%TrlGE7u3j(=Gaq}@90ZnG_2L?c!#ie0U^k2jkXz^R8+vP6)$XxpydGNE(gvtk> zZMo2R{2Q&$KEnVHKEo@2c$jW~_L-|6@%7)MED0_|Q6fX<Cj+DIdBol3m`^~77%r)S zF6J3+V5ij_l9pKK*n=w#fkPhK$U6Xvq|?3M8tL21olc|$TavrNPWfn<-f!<SZbmGa z+H5{fh}^!9Ix|KRXdPr9wcrvb+n@ugF39u6KlWF+7pQ+a&7e_h>`C5tVT1xP3D$dW z1CiPm&m)N`%aP;3%e_t?G_=V$2EWdyQ@QP=hWT=jYJPffR-s%liRR(bvENqS2Z@k* zCXx9&aYNT{FP4^%)Nv>~S7J<#tYq=^+qLB!#`mY`m7X*As|kL*+&)C{V7hfaO2??m zo0>-13^k30Hq_GDq&9V`0b;m8p?*LoQ9tdg5>#%Ia5fisQ;8<b00rN$BQsCFB|J$~ z*4Z`&9m@hdzDcRh;5WtGDEyOYryz&Q@~NY%TM|^3^+uw)#K!?_SABhAF$ew<wFjoF zpPt@qF^}V!1^({@r$xX>MMwtw)1L`{{RI?6qKcH#@8ma3I!ioiBl*!V(#t7c5=Kr2 z_myx`UBL-ejGXor5M0|xTa6r4dx}goAm=Di%Z-wY2<q_B!biF>zsB}y`U6A30s4?^ zO(dEfpXFor)LSr+Ux{nDlu1vF)_y`P$ANgI7b~b)Ex@4A<BSd(+Bd`P5+nFII{MiR zC&ET5_hCThH+@O3Ss2uI6h!>sNAAO*zy0_{91=c`&NxPDX^4VO`UryXJ+$}dl1154 zw9sDi5+(VJio0W<77rH8?7HHe&}*=)gWF$^jmq;We~{2wUSmTg9Ap#?65m72Rt-wb zUyNA~Z)cMJ1+_0AhjO5yKKpI3w9ZgW`Zq0}ek~q>f;C~tgAloV{hM&OyQ*4|^b<@d zCjx7e__T^Q=$ax4o&iV2US5j07yI6CQGzennvdUaV|0-xT4^n{vta)3!f>`?qrD=g zGg-BL+=%~@UXauzo%B8;?Y<x>p{zM+yn(~9-Q!NK=kVlh04~D76oa8(Ja-;!0^k1m zpZ}S&YT`0bKAx{%JzCFS^FK&+$kU5!XL)^eV{B$g379Yr(i^<!1dbL&2u^5^s6M@I z$c*?~SpRCwjOCYw+~KtH*=IB`)RyiotQH8!!{0bOyN!Qhw;PY2&asdKHV;0d1uS}m zzwnmwR{wHgc^BbzEV9FtgK0P|OlOMuDOaM|h&z3Wk8I!!JDtdm;7v1r^j?ewqrjza zms<ogj*sHav0`S={V>XLv3@6?to!D0g?-H;poqxw+8)OkG&dKiE5!$Ngzwpm!Kp9F zZ}sv+G2ta@<s5e49nIVd2P*Od)+ib@IS%_)Ax9_Kw~%5JZy84mX}9>HH9QI}9X{ax zc<tmrTP0PIv$U2NYH*}vSr|YdWD61|Zcnip9wpqoy`Jv042_z~KD<C~h5~3=YLeii z5QPg?@P#xjm4ytmnqm+33LCdNkV&;R(rT6F7FR3xJTXQ&?$Y0na<j_fJW3?BNyhF5 zW}jaOmF(?y%ChHLCLBW9tU}{I1#fT|AitnWvR$H>pF<3vmS~xNVK)M+H_aE!@r2+n z#m$Off$3--<3_<Rh3RpZzxA{Qw|2TY+*SWnxl`5O;eAq+^M({m+i}(CDtqY{$KPTT zwf5aiv(5hlqw`~hIObG7jagH2+lMkD<9?NV3PdT`+Pks00}Oq-p@)_t|M2BQ@nt)O z75Lja2|{>I4C_HN=$=;{P3mm9!#R==I^CND1KOyVq07rQXlq;6=HC{~_KhdJ?-fwj zUDL7)Ih|{0NX)!>Ae2}eq(1LJfn(*N@Fuo!j?49NfdXoFkf+TL;G4~fI{Xp0`>Y&% z7eN2H<s04$H6!?t{(19Ns-*7EfJpt!W{Y|{Q8daz19WNcO|MO=>yjDAU>`VrEv+}I z?TIqS<7sn#4p^eJo~=@|EUthKR0_Y)S8T@Q_2Krs%n0W%{SumkwU$_DX~M;Skf2SM zUiEGmyhIWS=p|}_NYXfQp#)w|FbGDbZB+w31@hI0EeaGyH)v~sD&)E;;XKvqILFI& zbP7-qY%2jM=XRJK!xAK@9cKNp_L!Pf{3}4Z#(TW`?FMVPl_h_BDpT?cAvIn8P0M2- zIJm~${E<E*Vg-s_d=PNN8G*nm3*W;p6v3UuN<yFG`IMgw$2;{N3v`wYAb@fxR~^NK zZ*#g`mwb`))$}bux2ZDx9b<y<0jqUM@N$3@KAvxR{TlvaL*k!X6nXw=r@}OWa7k7@ zI+byFT+c~B0QC5ohVoLvZZ4|7Br|6Zo6B?uZ$IIDbke<RH`&As?0Qis&SJ}QA@L-1 zqhO4U_8^;#%?(8<XM-VYVo$oZX$w5vZBR*Wlm|h}XkVfCep=jIE`6A`W!{W%RZTW1 zAUNi8ejS}2a4>JvCKW=%aqEaY{>HWePIthBjGgE7AfSCHhnnMz=olfMW50vXqZnj9 z72gBBKYSSH#HC^43^KiNcvp@hbMS7y4{X2%dO|FEAWV4fgM*e&v|VnO&fSgzrrrhn ziX2kn1u0D*bpel24L@ghfpxG<EDA`D*0a+2aaXw$k#Ks(2mDM)W@!jJb1^IAH2asD z{)|;g$yeA=*h{KGLoR%jmoic2Ome|um+#arE@eQS9!JXoUdC;RE<kQqF<pvoP^E5+ z)vDawYy+_qfWP2~-rXRGiH>l5O<U%t>UsBK3?@whQIR9$!q*2rbuj{=;&jG-0<Pe- zw+~}g520<TYgfqCSlQv;<gHSP{^{no5gat<L;7cb(Rgc%!$8Q()9w=uo_R1KhAyh{ z)~|52M--0I68VV*bij{V<&hEPVAXl!t<y1DQ(tD_kn?-J5ZtxFtUC}wm`d#O76o9K zxp6QeAk<@14IqxOo0(&T^UVR*U6N0k387IQCebI=>!?>33$Cr@15wAn$xVK0s*G{~ zw?uhxz9Np?Abl~y7)$7m!x;T$wvhw4=IB49Uz8x;Da49<gL_+L9mSE9i4(Ui4UA7- zoc~VUIFIICprLpFBb|`Z+JCq{-wdZuKo=s-T#vc0zbhFPsY;Xs0e~6nR4f8?Jg2%q zoATf)vMvSNHR=KN-Qv_FZ<ZZ46YQt$H`wScG?^MH|9}+^Uo$%sFX{p9ar_F~gSUsn zS99;so$e%Jnj6MK1jo2zOXy;W_fY+HPdK-DNMSWyUmhvRA14qJ5p~8~;N1>B{{@G` z)B2tGsM$2%w#0z41zZI+btr_N6GFV?9?_}5TF&^Ic*e_H!NMVca#5N=3T=`(!*jP1 zwPX;~ug5vZ_iw0Z2E$tQSVKo<`fTAAT@X0Vwn2^&yZ!@^Ttfh4gDr(cD{($6)d$84 z_6n4k8v6y*7TQdbvdP0yLwEj3AWOZyo1hbZ0sfhUshbJTLa=Cl_FI$)koYu4*`bbw zL>`c1$<#!*><rXM9ZNW!qsQR*8g#ECjgE3Qr1z<>nQeBQhl(8VV;nCpX$M{)b3WQJ z&!7?4F+k0S;~mho9-PuS1#1QD8u0;f@9uF=#a*A*#@n0xXa(bk#_Uul7sWcR=m69- z&FzyMT<V(+?hr#H*B(H_TQ0r~s0rzABCmnBrB&cWaYRc2`v-&vDU{tPh!`@`(74?R zRMK08-Ux1Z|AguEBIIq58X4SjZSS-Pq-n#$C5_^)L;=Ee$n!!249s#a4p2gUXY7=G z{8hRVVaFbUz_pf^?gMOr@TsI2wifIll+rt<fiAgroC-E*PO0vIqPhM=Nuz5vr4Hbs z1}sTUoi#zn_QK_{9b{YNc7_+mr1x(U(RLL(v@|;fPw)xJ!E~;;0Z6PX7ChxSqv=c8 zSxrN2;IJm=tIfIJ>geKI+1Utm6R6xax}Y)*0*2;nQs+sKxjr!W5VvJ#2gd8BfWg~; zaNIb6851&HEUj%ejoeUTDA_LUg6R<JR*yFmz8!LyUT<&brOjqrep;@epP-<rg+fS9 zsYvpFoo}uyPY>}97XOCpF}mCGA5ZX{!DfaEG%~G*`OiuFugAsi11?hIT;$mqf*&b# z`I?v1!O^!`U&L`(IT$$)4)O{h)NM2lMG}z+uS^?-77t3eSd>Q%aQEva4*ce+v;R0Q zXK$%w#<TT-{?j{-s`=pn(4Uc|PefV?4u?1ceX5CJvm-!ZdJ?x%!l)h-abW5rSC6F* z_JSd%@)*<Obu13i<^)xhBH?@+j|$|ZQlwDvW%xRd**Zj`nzcco#FbN);|8JV`OU^r zp<b_od0jFBAwkmFPmV7NL7PlEI^-j<5`@^suqL*kyj~pc(KHxZ*D`X(agS5&fIFRP z2HXi&Frd@iO!dtvgJ(V3v^CoDlq20qGGL-Rl_Bf;eXAkwqVA0Icx@M|?%54{pk0-N zm$AvEVU8Zw$;!ynr4V<rPP)F)LEBB9j*Ipfk5Fni&X8_f(|c5LgGmLjWVR3jg5ydw z-5L`D_oVO!6HfOIZr*eKcIv-3mml1Nlktg)dW!4cGXv64Mu>TKzwuE9v}u?DAy0A< zVPvp+h8e&mvrE>!XPYCsx6N~0=iaoFVX7uln|+d|_hg|7%pnU+8sC$JCNS?{p;b8Y zF*ut2upP84G;}>hV|y0b0mm1caU`6MQqYad36=Op9g94L2oMz3Ihu-|yq+H2lgc-b z7zKA>zML;KgKmppELBklhcJq3Y`Hc=Wrq&9d)O*?L}sfkaW{_7>E^o@;rA<4Q;;K& zmaT$Bu25{DT=Q#X=-_Gh3#5AeIuRWy0T8Nig;v*7qy>=sv7@XWx#Qt#92vC?bejS< z1m?TAIiah9c2AH%tCLI(Li>=}-Yu}sx8(aMn0hcqU9tjvci_Sjg^p<2!l|O`LQq6^ z1CRU71CU(X+nwgf!{QaEQq8-3lRo)oap<BTC)da=OlXeI(YZZr%p?<>=1~Q=Xs->? z=?8T_OtG6XXBZRaN{(BbRe5)S8Y>#=`VLo5aP!q+Zz<9Cn3SSL9H8``tbovQ?w-23 zz%2$InRy%FwZ(yh9<}#Qz%x@Kyc0#g6Y$dR2);_|MBYm`O&E}q{2;X%gZ1`>p@W_% zlc7NegcL?SQC6b|tq3oSc)AQn4_XQ}c=E{<^AM7{%b9ytHnfJgM){Hbl-{sk&vqZS zi8mSp24l3Xo!>=Ir<|ZS<M84K`Va!}T%9|%aUfbHqK0~--l7Z`5Jqt?X9Wlh^e^$p z>v^o99Tfx)@_KUq;b2v#^3wJcGsi17*n3(Y@IKq;83g+CBxLM@uX*GZ4ran<0#Yc~ z5oLR|yyVvtYroNzTg_XC5>7<#D@?JAr#JLUCXP>W&TxgIP60{V1E@4Z75rL-@XA{S z;0y)2Iy!L*4->yzZjQ1+_v?o!!nt`*G4XFc{`z4$)^B)qn|>oS51ZE#^e4(xBMCFy z;}~bFKyrv^<rZdvrwwq=alqS&vC--U4ui!D+I@&G13v;(<HyGoO(~_*81IdHCY@{E zu*&@HB9!ab_g?9A`olA@;Q@u15A`#by?A)W|M^^yeLyqB!?T}$b%y_a{OMPpfBn<1 z9^jDK{^1!%H-Gx`1F4bm@J#;ucd1;K;(T@n)-rC7_AQa^aCQzwB<P$k-7j9#wqRgI zoIrOP62F@6^!Y=mlJ7@`!5xT21T=tK>eh81n)a%P`L*$_2MW8wb<=^0fVZ&FY99fa z3i{d|U2!=rb_Rt{=~FySQ|}M*xofsaQn2p4kV5>^pNC*-XSc3H=fLpTnW)KzCA+3_ zsyL3qwjNX-pWkg(*srvDSNyA1ePa6td6WGH&*Dx_6xI9P6rnt-woGwu1EJT{3d)4h ziJXZ4kmpc3v2U6mHp&4(T6l}eoviW_uQVos()v^URUwZ?4_%>X`zU~x;61T;-I(pk z+fqKza{rnb-)r)Vs)ENKZr~BQg_4S%;VZ8Oh0QibMI8A-aL)mN$7xq`CsBz><Ed&w zrrQmb=jS%)Ssse1xQjWah#z$5QH-eL)Fjr=p7XI4IY|{d;0_4i0<Skncm(`g&HjL7 z%J-^%)uCSaM_Z~bzN7O>l?m73`x5sUtMAJtRHL{h;v+k+T^;Nd-n!Yn!F-eZ)H)-j zIjw0dz!GEelcq!THR4Gt)T~*jXkIn32GfbG|6#oyMedKu!!0GX%l(tu17hiT%l%Uc z?Cl~<g%Qg=^8r_f-)w3yQ)a}tkG+{CBRz&m8`8D90wm3<0n*NenHa7U9%U`F;K;yy zv@j{eh*`gXpn#}`SvwpeQ;Gas?th@irR<B^a3cNK96qz&Ue7%o2^y-Pg_xf+q6P~O zGN9Jd=*+Y<ADxb-Qu|bY?ZPLxY-Ll16d%<tY0ZGeBe@KEv|$0qnz>=rMU`rcvZi2y z(1}MpTp@?Oo-S9ZAEw{P%ZtCr7j)4Tpv^=Q)ZE{2BJ(5|gm(Z^E2K)em!#2GJP(GW zvr>`6W){Vqw@7cKc5N}_<<Iv!s2V(xLkon&#v><C0T0hzF&7@Xc}9Ejt)44fctoj% z070pdo^C=_=Fw;t7zQ@)z!fU9oL`nGfPjY-MxKYe^Jz#KNGXBuPzxe0Ku|}9$l?mK zffid08@>Dz*`z{o3J^?NEl77Kx){s2L!UL6t`p%-SX*Wp6+)>~W(YWS7Z0h`ghZ=? z3}-RH1Zf~k=l7g4l;ksmD%3lL_sAviQCeY%Dy>shloC2WznCGa>ZJD60Iy{ch5V?$ z+O5>Xm8*x<_5|E028Dqj?i*GhF<41>>YLE9o*@5dcGaCg&9}u7!CBB$pijMPr;n=u ztemxZ6+p#q8FI@6*uDyN3_7S$68WK16?_%H!3U0TUR&DC{|BA~vcWH`Xs~U6+SOo^ z6=;qZgPrgMb*WYQN+<~u4xnX`t2Dxo-Tg5kLptV40*U~SB{3?Us!Ivt1NP;STn~oV zESkX3Z~^Jk^g<^-xFSgaiWF+rVv3v3P^GwG45l3McHz6lBPtU840qls$Ia=+MjnyP zhs~S+rDc;bTv>g&1)Wj@mi<+FY|BCXC~0}K|9-Pe*wJgumF9!g(=b4y(*_5?7pnRi zIu7Fm2g5vkyxFSjWCnEyq3Hf<xxym_dPBBO@(_@3-K*T@u<M}C&aS5WY*6;zJs!p# z*^B9FFEy!y@^-tOA}3T(o8dKs6T6($JXSj#WRg_qf9gvTtD@RlW+ONtV192aWs4C` z2lCp0v=9+L0z1m)p_U>DazCu2qiR9!33<184`PCy4DxlqSZENSgUOzZRJBpx-9i~> zRhH9LoTx{L0Mr%cq26jFqmI*D%>bYl;QpHB`+)!dH<Zio8t(D!Sg`C#K8F<|%@03K z{~7@vf~|53$lEXZfs7X8p;eV!r25Xs$ns+GI%fV@hB<~<ukCpy#x4vWQ<fEwJ1#S8 zI{;{m8+;rVG2in0)QWCzdi3NOFSR4ni6sTmo-8M<Woy7L)w0k^am<OYwW&=7r2$*E zN~!3Pp9SJ-XB;mS=1_rL(kVMwDLM6yuaD<1WAWUYXXy6hpe%``6R%h4+t45o4Yk3Z z8P;fTUDjg=T%2S_;_jZ|9woK`Pn{}IPs)8IPw32nmI5~2Pn)I^Pk*Z^ZW+TweeDdY zjnd)t>uCeUUhRjvm(Kke<=XM1{^QZ*C0@ayN{&#b<T`WTqO`yM_w0--hiBnlsVv%F z{~P+rpK&{&K)BAe2!)*7@7po1HXH*6H$E~l+7ef|*ex82;<c&%7rRdDc{b1(exa9u zxC6JKrcZF*L+er&{!($&|MEW6v-Nth(=Q<kJ6TQ``Ni}m8$6_E5_8sp^uLS(9IyV} zL;!lb!Ub>1^p2n`I>XA+OGnfHo}G1Fp*GY1O7o|yh1(<^BjW-8so?d$eBm%-D-T09 zjbqPql68G%R1o^#v$KBu^=fgsxQUH#>3+!B@Z(!Pdq>D-hlJ9FJ{sWE5T2Ez0Ip6> zhF-@VCoNOAko+{xF~7mB={s|!?vzt%!GqcIkg*`=Tw+KmYU8|grH@cI+UKMYZsnaz z5Mw-Z)+_PKwP+`8KgJ~&J#yBR7M^y2R`LdNaACt(p#!$d4;Raule+8{r}T(^a2TPk z6HJMvrb7-e?J?l|(#BYGr>s%G2TwuNWBoHs4guljFQ;j?k30^20u-7_!~u;4+wi2= z_2`AX{!aTtUWEURZo$|wJ-YlNr}wZwh&r_gI{AU*{lha(wmzUU#1GGCi|21bIdAyO z6#GEF{QaZ*`R@<*`_;oU9!Xyk4X=<splvneZtB1OJ$Ox_hf2j`<3P8j1Jl7Va6t-W zCvuQZSfSpgTaazCgu+Oq!H|@n#$_1GK?L)W7K6Cu-6}MdW6^Pt(}r<9#*8qX>87ZW zft~N!wa>4BG(7l62Q~c!E7JnAB*}|UCg+Rw0w?s4h5j8K9@)!NfRupc7a0R%E7+AX zCG`vRSKv}4%^-0Ke2(FeVsmc?gqPOv_?<)b919fQ2%K*8ox>*Jq}%IQV}4WzdQT7~ z^V-P61&A5dnS%Z5U3_R3BEV!~Q40P%|8TyP-`#qGrGf7oEtXV4H653BcBXuCD*84+ zN1d`lO#2;9Vr7Nep%?OEAbxSIPdL6rsb)3gL41l4Kn<B86A8rbz?PNUrLW*2%I8D^ zdY!{3rX-b@@!>tHCN3^;h9PaopYc{m!cljH&~Iaj#8!A1qa!jlO`No)mu4M;1xTQj z${{@CTVPneV$6n$<@4(0EfB$=^wMEEb~Hbr6;KVWB4@&tgD@RJn=rrcru4umYg6G6 z8NYa+f~OgpNDH+o2PD0ZKBpMU{p{_2_Yckw!tWR52NZR+J=!A__hU#-li5AtYP)Vh zh=KeJGO;9Wds8(L-sdYl>NsT_uZE0|RphTQ;g`neAH{+238v@M{o(0um%fSOtcn}q zH064KvA}Ni{2O-<$}M+T^mzI%-_C};Bdm>1gdBhmPztY6KYLH13Dq;Z#uZ=P2b8Wd z0ME91EG-T}<CY`%``8Xhb#e{v66*x2ODaKCEnqgK4gZj{w!nmg-~>I-T#4g@spz~( zL4V3Iiu`>*5p0k@*=ZH3Sc}*n5|}I{{BR7R>W6p&38l1lz{tbmgIraB{uE+ZkKAI3 zalioA**b!`{&lj9n8h;<6%)1Sad@IHS5d!{spLUe+xUQIe(s8RRK{fwC(*DI+kA0; z)JxWtPBL8S*ph*98?x;o-LO!hV!}NCU;<3An(e;Pb0HP927uaX4efGFzxnVjyLnl6 znZ^}}8H^%qLZz2mk&8$w2?SyU%Pa`LC0tm=IhIJt8JMmyk_t4ZG3_>}p>*a+*e&rq zm=*Y~peJ_W$v<9qg3~dYxtLvT+M*H&F0jQ1=c^nh3n)W?V@_6HLU-*U99yeefQYIi z9G}*doS;s2ir_s1#)BvY##d8*btx#?t?&id8p`(o`4}H!JDnAO#4@nT;u}0uFP2`> zI37oD5{5gUGCL>Lm?}NV|Ck?#>u_sOn>|B#Flgm6R$)qrEK<PUku7evxM<U+%;T1- zXd3boj<#K)Q><5f9_LXfop8S+5q52=dS2fleSsSi^w?7ykRg58u+~UKK+KrpX+4+T zz!x7*WYft7?FfWXOlL2$=g~=s&cDmjICB&pd4gFnvAcp@VeRzDu&t=H@nrvDJrl0b zC$DuE1mwy22)=e;glpV=AR2kHALZzykud7U-+1H)H)Gl(_4EmnUrF(P3lZprI0WJL zH{Rk56{Vs_1wLZ%xFn0q5_sGluP6I3PV~eH97tk8(6KNc&&^U$sMMspc*u`l1HD8s zI8NnsQk}9s0HZ?E{p(MMNH<#-@!)^`?YDa0|BLXCzuy@%$JA6jQkbKyMiDm_?$?!Q zd4x8FQM`g3*OG*c>g6>_hLzvs2xT&bL9_z${6kQX<~;bngn;N3EAHzbmWDkZRGN*l zu%7n7IOL)+^dpkW|Ek(TR2f8UQXgqdH};6UJc7pFRsDo={~qrMxn-L+Mee&;H2*K; zj5>RZ8B&*?c%Q?gxD_Qr6%Xt#KugGq?e%Z$+E0bi1C!lyp41Ntd3oC8?_@s%LKZrt zbU=lIzarNfvMx{mOSXMqhW|eOuSak6i~Z~AtJlw7<1+zHGAqF6$v5BO{TK0Npedcr za3D+rvI-0O=%#F^G6P|hU`y%mf25#au!x2wE!qF$WH0hlJ{C;-=ef#C@C{;LR0{r> zxL+Js2MRJg8X-mC)+1?-05HGj5=oAOkdxl9DjE9HGI7tIgg$jtU&cE|B@`~D6S}tr z(@3HdO}zg`YDBQ{H+CiUuavK^aM|@uD4QwbDe^bq0dk;s!Nzh!m1s^+G6eW8ddpO` zk%*4kq~0AQKlp-fNBljR;IF#6j^@2kO<qd^KZA0Er53u%t2%DY;t{_}?)X$>*>(o` zm`-q4zrUM6iV!%1-Cg+z3t}Dsyht6H2lfoLEAEh)%z1#ZOqocv%b~t?*~$vLoqpBh z&fbWHX<RwCRvGLhPCd6vdKE}L_4GV=0b^}js@RHPr77`2t#A6qs~26jFre5FBSU7K z5;?;8&A(kPR-KioknpiaPhG0z#QOOAAHEAS>3=?Z^M@ZFJ^$h9>&g^*g*2?*o~#I_ zhC-6+a?2zr?>{Zw0sV)h!T1>FK1m`7Y4o|d`+xPiC*+>00BT|S_+}<m_-7jGyG}$i zAmo&I8z#``75DXFcWVOx1-aFF&_9x<H5YS&%Q$a_q8*(q*#P6~J2wRK4*t<tN~+|D z7O;2qg$BKFe6B9VSfhy13T93%>e84sm;1-EJzA-GB=H<(oQ_b%D#4QnpNV{Zwxb(r zuCOQW&X8qnUCla!%1GjrvSk^t&9)No<;&DMN*DFw*>^7<y?OkH=TE<rke?h?{6e<( zfPdqEJ$r&B0{tsl0nq)Jp#0=hFl;)iT@=nKML!>fRy&W2GI39BzEB^+XQKkASR<-{ zn^--gOQ%XuMe{&KZ$hJ-SqzG|%Xb@2QQE@N6uxkTbawX5ZmBD&D%LqWu$15GaLzVY zw{~<M$ctFZroso$VV)6-JV22t7=234W6?j);>?g4`gMLZj;+|D>XVPb^-sZ(Eofq# zhyT-`>%l>Dq6Pepy|XIwAf$EO5i-4kA(qze0+LsczWbwC{EJ8brPiOC^~>(rt^qTE z1IClHbUjHD-KDk@cs1FIdJVwO$n^??(?nL=xB@tEv1h}%mDQKFD^z=GPx`0f4{^0s zq#KKocGPt)@o*TR!!mbFrF1)<x7b7J(A>sl97nHDURo&S%@xG;@)D<-H6c?`2gA93 zE=rwiKCvZx%5Ze^bJw!m(WUc89Ei|x#A14meL9m0Tl&qNUFWui&Ge5g8zrM>;Oo(= zD|u}*uBLt`-d|UEJ}xAnsO!^=hCQ06fTh&h2&k;(%syD4$17aJZ{kG;Th3{?0TGS` z+8olg5LeJv#adS^LlMg0H?$=V#>fBN2ky4v5>b%Y|F?M|3EL6Mn_8}OyxZh>iE=Y- z9u>*CqTW%G0QB}}N#NCS9xO(?BL*W?Z!@AdX?kv43>_lSd4Z4<qb94>h=jg!;OPCs z_JU{N6Ob!!I>bYJ3AWb@lp1aWHjh{Y%m}HA_|-$kq2V^z;LHrVe?OtJVX$3p7p^8_ zbE@>?|Nq`jQUzPgdA9y+at<0;SZuKCXhZENZHw!8bj0yoRY~1I$Tp-g5C)rZOhTuZ z=mCsG*AIuzrrcO7Jf368+Sx}>;mlCzc8$Hj#3F-Ex{qGHK<`n{HnF`@&VvlOIw#`< zml<}L$rGB7>zsiVNy#u~Gs;??t;L|y-8(Ec@P5l5k@IK<7HLr7=tDh9B}6()z}KP= zODa30R)mJAzZWa0SLiZ|HmiA~dZX?*27l=hW#ExWRXlM|PIy2aJ}g!80?w#p@9oeW z5zi**p#5t+>=0zfWTn5Ol%!f)kEtoe-~!oK#ij#m(I70&S+BxA{G)GPzj^aq5^N7% zJ$?E7(c`D#uV+u5KYjD;1^$EqJoxt2)BoUqCF}Ja?%4)HO6}<0U6UM&;HDA1hQg*d z1&Ph|>h5+I!-@gAn)GRt6T459oY+6Q!|BItYJe8m1~LECI#Ni3KBB67K|O*KEf_99 z%!hjCNpBaoJ)9_svmCdfCCWu=D+(6U<mAO~w^OBCTJ(gFm`~}j2JSTgn`ZjQQ-K|V z!xRO>1Lfty4@8(yYFOaJsXCWC_;x(uaM8J<PI=?79`}0?g?LR_@JmxwXsFkHua|PK zh*@tpE<*E}va084W1hte$~GV>T}3XP4O5e#iO4%=*5AYw7KeB<Kxe{&=n|-3<dX%a z_zxZwYdd0hPR#2gqm~Zx$wSl=Qa@?bkg+R8`+I*pN;xhvs!g)R><6s;K2t?UQk5=* z+03L?Y#uL?C1;%!-vX!$5j?rr6nnv^*wyQZ0z$GW1mEWwUA%0&=X-S!VAW#RzcyBI zvsjs|me-+V1==Q-z@(hyfD*RE1vnTs%Hb{dLuawume<kRRh%$Y1L}D|)nG4A>RkGm z)A|n=H35eRWHN{1TXGvX!D{n<wb6Wo^Oe<`&8YcuS=5H(Yu5Wzy(`u@N?$!@FO~sl z+XkR#odXykyLM>B6i9w-PMZCVQq!N|4bqN6#j~935OgJ+Xg>uge(nkji`U=3!Z9TA zRSzCLfBA<;VOjC~*^6iRg#qHsI(QULH9q*}|5}INKef)udV?xI$MgUHC`fe|Iw2Gg zT;pMpf``qe%^vf}T=ciCYIh&yem53Pi&?uG+p&1u%k3_aSB5SXj1fD?&Y2ke0V{Ef zf{M`#*ZMYky9EOg<Gn?m1ycVU5>&-x)lQ=UXZX3cCZvxwj9PLuQhc|-4Up`~_^L3+ z?a3b3R0KNCMm5z)Q)2rc*0G#pMbe|(JG9UA3ToJNy*$=Q@xnbVSVm<ND@t9Jq*u@P z(=8S`&1_;mn*@0Tsxn>g@3xeFKRM0b%@Ke8<;TyzD374IsNT`U@4+`I0?uPhLlm*i zm~qC|4iM|8pC)D#&XAOk>-Tspq?0=rNREf^r*@Ud7)EA|at3sk08hKK;|l5!7Mqpe za@4rF?{9O>CC0szy@}Nd6Ksna<#M+<@)n|)3Q@G2GbOB@Da>B(O!_w!iQzgC<8PS` z>6;9NPbg{(ht4zwMxvnMZgaz5be>pmuHRxb)SZc+ouF>;&~@*S%wY6UVF@<V_ju;m z*TNudmuuAGLDn~BniJlkiH`<LhTgVpN>@sPezu{}xGN5IU>@prBrxXg`A59ojH+_V zh5Xl29Dsw9XY?rYgbEOG2NI|klRIBLw3xxR%NO~e`1WP~tr<6xR<%8sSx9Bq+G9*l zPIY&DZ=+fq1>}Tig-Iuulr}K9Dh-eBz&SiY);wn687w@Bo*|sWiyu;?lEESNHpjEE z#hRVhVe(M3(-a3E&R3h+Tl<iY<+Z*N^JD{#Ht{=S_U?{SC|F(*OIr&4<AQ_gdbmR6 z-z#hdrjEPfli><ORWkL`%@otm!&@+PzpFQs>}S{(B##u_tIZ)&#FE@2g4b(m#7(8< z1eQmQ#TTK}kFW`3J{Wyt@Vp+gb7MTMWlJ<}ChjV2C*Pt$al`Le%hQJPEi`n>|MTN+ z1*ws)?dQjLuaKMSNUFCUVcgNgVU6G$!Yp4nA6d$#AZ<O;U+4ZT18~Oqn-BPpmTe|^ z6$6<$1xy0o^jC>=fccu#FA&fNYBCI9<!=vo=<+1@=-Gm$tZb~vyCM_+^Rs@Yy5bRv z<@o!>^71O2Dvwoye4rD)dNM~`BDm*^13$B{hNhrS63R3~j7}4NiDK(VPko$fih=}! z(>EWU_cnqmGDz(JzBc=Sa;(Xz9(k6}=1S;&+Z$JOx;cN2=N6eo!YTSta49h{XQ>qg zV30j4=;=H%Yi%_c4LADev3}@;j9x0f69x#<yA$tB(aGsWxzS(Vgh9?YT^V4h4Hr3@ zYDzljJ07$xz(I4d@k;VQEKj%+7Et6OSNs0<etE#9V0ihxT(_%O@<I^1voYtkTUhr= z#%x&mIjUk#gIvQ(JXOjPFWwav)<vI}sSGhm=idq%1FF)q>V7tRkiL6KW&b?D<-y6j zN8s2yK|c?qdn>GH&FLiZaZ~yuI?mL4?WA>>vFsQFZ++s0c17c2@OMxWyW<<C5vO(G z<V|d0?n8&VNbBq6F|;<5Q6+CO<<nXPq}{@mh9gw;Y%fo>`bRVY1&s$J;?1h)_R?U~ zMth8!g4p99&t36O<jfX}xv)kCLE4aRFcPNO>6f@rqWsLH`D?rc!zAkBjtWKd2g}?b z8-WwpvS4TKWiB%kb&c!SxR4P%ddBJ4tnn6%g}Yg78$0H&yBLbYU6E|g-n%V3=jvkv zCr_`0xh9n`#9%ly!Bn0_QLe91`Uo!>O|PB(MrAWZ&M)0*!BhJ#4}K|FC8JbSybSWa z)+G*I8VN@fD*t1CKOIcUmdp5(-JHjluUO&QeDjZ+RPhG;!xJXqXO0XQYWRRS#Qv;M z>Fy$n+5#dFi>}HU8o5$}S^?u8vbYnN?3i!h3~<6Zhd<^_#{N|Ct+h#Enl$1G0oT^O z4nT~kYAa!PJbx^Y8c{1cQBS<8Fv`CbQ2m+RWbh+qsI6i3q<^wd!stlr<Bl|;(DEqS z)2Gx+vBCjfEcJAb$+d+|!#to(gh>?Tu)j!Z+y_0bj#{ETk5%eJ$8`L94=ZI-?E{e- z&UO8dn;sDW+dux)Ya@UHR3tf8d=^LGK3DKeDyvtNXC4cwM`jOE?`o$Hs@wIRFT*t5 zRlk0^S_XR~Hl`!pagn*bLJmQDT`6yl+e+I5{g5aX*&IWTYU;p~R7#F6V%c!+^)Y=N z#N0qqCR`_<LB{&p-Stk;h}wZoH!hX`wyTtFAUGTfzaOtnmZWk`=U5(1L5(yjsR;c| za7!n4Mupm#9VfY`oWqCJW_`Il9Ou00XemF`VJ<($#YIyKG2W9{X}LO}K*=U(`Iybo zR2-GnsyAE~KnMD0WH(U!Q(S;qo3xQ!c*|XbCaM7=-rA8Afif}i&)bdhYC2yYE5k&0 za)PL&EHPQBiBvveZI?Y3Q|v;N3JeYicHew>AqBY$W<)H7rKy9sZ*=rx0a-)p;@!A4 zI$Zr$a!WOXkn{+_sXHz#yz;`L9sO*U7d1x%c;EZ;@BuGf?>3R}X{^Zo!oEA%sw#tC z+trH>P@9pPl)K8AEk={&{;>$v!`FNtD}1i+S{X0X%9-jb3!VgEU0reIGCPbI3n_Yk zn<7)JN?BYbJ2?YPbfiG1O+0nw36Q^aRWHp;q*wt~UL_Bos8F0dRBryIf<8p6-fTS0 z&+S-6mEg)SFL1viS^C#(I*7?FtZI;=>JMp7AJFSq{jotga7^-rfmmPEF)CeSH$EzT z#JkEg3|6WsKAM)ajTn&aa_<mN8Y<WZ{$s4M*kDsBBvQQ~?JBMH9(P?~(5PeIv>Ig` z?x<3fvrNSOfCuJT7*(e>q3KAaL?JX_WCVJ<dVq24XRelCB)9N1$)&7PkgKGQUsd`b z$(O2EtJ0EvaqMB$cLn#VLsjsLHx=SQDUr2Ku_jw}9JSLdUS<OFIg&pP%#bU85xP5~ zv*!xlKKf`_FHk=z_*lh#)v<_S2=<PIEA^=$8l7X)fhCHk4DXZg$~umxzFOPS%*547 zGm!ER5GVgA$#Vt2l)O=Wte#ik^l&Fvt&1Nn;N=eT$Lz1_yiW>rMVpX+c|Ql9!%+N} zlG3nokS&9U>}&h<?wNo9<6cq$+l#mySAnH8fES&rMy4&>i(91Cw-+y5;UXO$4}zDe z-2LXbn=SsBB%>=riKkbid`HeINr@fBrQn6j(TuXpqNa{5^|kT~8Mdf90MZuQIUQ}s z$3Q`a%6M_2>X<4$l1e(EQ@BFlh5`bedO1<nMcEuOzABsX9V~pm!6T57B7DRN5KT=F znAvgtI=iw&gZb+Z{I}y<#p~{}B04842P)}2uD{;fB3qN{3E4_>Hyxi;+EGOuwdGL? zUSJh5^R1y_%CM7xirSrR#1)n?L#VQ~Lf>tIoV<Qa)P~#g#TARGS|l`<gQ5G1nv(J{ z-4UJHmE7A$=idc#Uue^KkH*%Ck%s0RE7+Ge;74kWJ6dB3cYo{Oy*sg7Wov~L-p2^B zgv}6DYRLK33WgSM(^f`tWnTOpNphet;!Mi;lI6ec*dBh8{gvhv#T8}zt;xWM+AeK5 z^eF>bwx#Kg^2HUX^~XV21NfY4g=7AKt*R^mEKShjgAGV1wISOX*(T<v1{-@<7`F-3 zuxkr1%K$4Vp91z|wl*q&j$f8VHw%e7ztm-68_8$xq<2M|(*aJ=C<Z)UckeJzT2w;W zTySTE#8#X4&#iPuFB+@*4h>6)6!SjDGW}IdzA0?kiP3COUm_Jtb0sd65u;{fXiu@j zQvsh<w+JpTm7Pm?$+S>`bDMahEb1UWr(+O9IaaEs(91g-S2Cw=LKU73dGUM69P0_a zL7IHAgY>d>DXxlWvSorPvR^CMbU$jLl@uDVu6LWSih2T{YG$N4E~tp1UX3V9R-U}R zbocM8vt&6$a@oGx2P$mZ3YHJ3>bPa10aTsf#b;%~m|mZ+H1N0F^;mD=xNW#${M~(a zQg*n8Ndb;NRxWlzy11p?-2%Fq+RgSZ^kue8C(yj%=AZ++<;2}%CxGzS6S*|GyvAb) zEv_av*Sm;R$Rz6ZN^t78fsVVVPH+pBgm3WhqDNv8rCQ#^!&^=K3g8tm{<f|HY8;6R zqV{PJU`t;y@ye}mg@6x|V|O3EYBJkx>S+6!oJ$07N|c3Rpl6lAnF9a4LS?*kPOyT$ zR*dB)y;$xBP6bIsHzXgAvTAQV%SwMQp&5FcT7Oqv8K42FAuFA(U8|O7dk5MoT<R&t zuP}<vpa)+}%}IkmD+)a1c9oK`oWwifHMSDinx-{)s2oX|et*a$SHYD__s&aq<-0kC zIw+!)8jbW%?&fxDO5#gX98}p61rE=%IE$N!t)}hrJu+@6dt_<DfqgT7ExL+psfEcM z=xQHu%CtQCh@j`;Lj~?L|Nfs*Q3&3aG1g>6;4T+>E32{ZkB99sJ398?*j)Q#vPA%j z{<C_WcY1lbTU=tU`Zipi>AQ)aaijIIyF%V#U${gTehzoc=&uUf{MuONBVb!_%>)u) z25E%9;ypgbpI1(;q5Mt0_IOPSfZXVtdbU-d7lQpgvi8`0T4j0GpTB85y^a@HRB&{R z*8L*OtDi9nE5RKlQxmvB9>I_f+q<B>P+QD4*lhIfY-G^m<a2ej<bLdJb;s<aZzguT zG+tnDk9gmfVuO3Wwud*)Rvp7QW8oq1!(Q$sQ4pt`7zPn>6}9jzvgzbjmfl*AfBO05 zf+~`ukm1=G-e`&WDdB?MYvht#y9GDi>?oMQ6|>`Rohx#Lh6B7WHuELcZM*OAWQS(t zOq1}46934tXXLK}c#N}Id%l~A^WB<3aF-#<cBmb8*d499x-N$`Z%9Fy9KBHU7l9Ul z4x87qFp<;TK^>}%dmQuQ24;qnAA`&bw1b0>iKr=*&tHl{f6amSkaOJ==KoGQJ>blg zRzl3UpnZv-5Vwr}O2iLcd9gTLZRY;!Y1#kD;$n)^F)w$t;5?v2na=_#4xbGm@nkcj z4R2f>3%vs;<-OagOn~~+_5AtLlt#|Jy<2<^C6n3~!IVp!pWYl6>wT>187a13`b1kZ zQu$L*{&u-qxIXL6`t!y0_VD5JQ3OAuO^6G;v*<02bKfY^x8DaKZCP9Yx{x9pSToyj zL@yfZLQZ3(-U=K=h6#x{$d6n@?qazD;p~H&9t8TJen<iK+BzY4-ZfQ*Ilc|7PbA*# zg1f~~Xl7->D*ig4rG-gl3<|%0IE6*pr$ESl7%#mjs?2@4A4o0r*Ff%F22janoM3M1 zFm1JceT8|?34Xw<zDAva!|falx*nFZLV!Fej`fKNj1NCfS4Z_Uw%3rE88|x^Z_K75 z&05a$%?=e<AFY<tecfdXbK1=0{%jRNmslnTf;#AjxUb4GVM?Ytjp1>iU!@%e*G;^P zBUR$jJ8@tq_BBh9+47X$%j<1;MA|%YhCf`Ec=+s5vyT~L>P~05W`U5K@^GtMSneND zMeV5tQf@V$&6sG4iR#1k#xCgf+CHX0j$i0=3~He8?Q%WUm-~7!arhnKQA!oGJp@`7 z@in-zm+pt<NUW;DX;8pzM-l<ij>UkQ9>#JJM;3Vw`(9sFQk~?lG5<PJiS}%sBNXTd zl=ndRhY(ED&21U37w<D6#wZyfwB%XLv0*DK`&eba1Nw*xABe(L0LyA*2*!V+Ox5Nn z!FUo82Z+`FICj$Z)Vesy+!9pR(vwXutsbsdxW)u*oXbY4pzPs}UIWEWm9-E>e1n*v zO@Ar**vATIXNc#XEC7}Ej`*h_-4Tv3B1=F{U0Ni)M~0M1AM(Kg*>;4H^e89yuH2UU zm%HV=_zZl@>f#vGV{<?PV9-*NK6H+I)^-H83L3F~Pun)u@LlCiAdFF5*P)`cmh#93 z9n@0?7V5>SS&yJHP0eGO3LMfL^<o@OLI0b}x~zZ5AZYg_s$%cZAOFdMc1;)SSz`rX z4+m2mbaSJML*#}w>m&5+yJt_O=6O)SQz;rU!xZ-)=~45IRyD8Mt?S@6yDPaW-*Ep@ zUQ3UujiC;2kPz7HraOJ!vSQuJ!QRx6s`W=iW&0xz)2EKb0~%vevHg8oRD{X~C5Xyg zK7@AcfE?|1F@B<`jrrzksjAy$`iZkjGSrDVtF-U!(pGgCg?Uu75lP?MB(D+xZp=LM z)l^I{o4W1C<X+Ojj@Rdl-S-z<;teITtwtW!Sl!V=zgLUD9#I2lero@seU_}S-*f+$ zVE>BK?r-oYY;b=MqXXryEkg#sM&&t@(GbC&mg>lRBir#KLN!|6s0r0#?$~YAQq?zq zw|T3quwZv+nUME)iv)u~>kL{V4WPSMPt;u0y219CO?QhKBDBuJC~3dk6YEB{{{3Q2 z%R@`pcb(M|t6wO8cZupz8MUbM9a!%3UYr<P%L)L;i7yt&ji&4Qx<YG`Vnm3k!}u<z zOlq;;_*td4O;F+y;khYB7L}s`oU)FoVsOiuC*g`kHo+-HpJcy`CdhiYSwZ5i?o5>6 zbC($@0pxHPIWraAPnx09-lxx0)&94bu@X2oGpP$db>>Q--Esy?V4O6Qr9E#uqvcRe zoY`V`q?rpAbUbzJc+%A9x{aTre5X^UD&OyfNyv8_KN<O6CrwJe<M_!b_8LD)84r33 zu}hn+TX|{+1~bJ|l!iPWko6+x7W`~=J=*AIpF`jHcRIt`ch0rhsBXin43yJ8I?WW5 zf&QR8&BE;zN--t&TVuyUxx(&=<F>zDgmabpEHEDVTs-6#fU$Rse+dI0a6aYXnNO=c zpxY!5&wl#V8UFY2r(b>k^-sTgKtbWdGma7e^yddMQ$IYD|Nfo#Tf>PbiX2Ne$@WrD zDHsEnnGYFeB%julJp|OM$SZ)$dhZN-a?NKqMnD=9BI&rjRewfO<ru(VYE6fU@lsGN z4ZZ;(a0(oH82*{6wS#es{ITmjoceW*DZRRJ_mW~@B#kni)}G6CZCO*22)c*XIw{E7 zN~a38xBM}XBen`-Th1US+b5M-FE)RI`YYpG4{R7lu!9+L-*hlF?ivr|#A8d@6$%R6 zVF5Of9?fQp{eFoRU}&!UM(>vL71~~bKtb!Ak^$st#+b3|fC?s?_xtbYIfLek)-{Jk z(qEx%)i=4;%l$V;9NEFcN=?|`pZ^8h5j__P&E#U@<ie_!t{{3&sRCrs3t1S<*!7Pk zrfnPB8ag=<CFB;j^ymO(r1(SXz7l|AWa>JMk*RBrI*s4p0fha2G5;nxUs6#u*R98H zPiat+oZk3Z;;h!mQa2(`2f#CEQ}nHmX?vu$;7mJ@nFmgQqR~x(j{eXHdvc`s+~m;K zU%Qj;)H%D<_f4BBm74LuN;e()<z~O6^TUDaGU!R0bB<E1Kgx?f4lo+4CfBvEi8z<y z%DW7;eGK#HAHQ%EERn*C@_F=by1Z>)6;s<4Cc}Qu#gKc4Vv^=+zTojtMlI<#ye`sX zPGg*)oc--SU}Vu@B`(a=)j=EO0Ihw`Guil-_+6)g_VBb|<G_l>xRfmBiwvdyC!9)1 zIu1vrNpt5MhOFI_S9&F|M<!wR*VXwr4s6!bQF<G0#AyZ(8UG$S$dEK2h}V4Ep@=QE zy?xA<!0>F=kT0+np#oL1_!#~K``_^iPzoVh_5!RJV!0%2^*tqcl(u7H3~4zc2>fpx zIj}VF2uD-4Z$w;~ZKn(?pp5Y{S*M<>$p#;EEE#Bchevo1%yxIG!FJi_@n-vBM^DKH zn;Y59If#)xet7l#v>}F$R&4lfwm~6KvxMzwv~#(*dB&$E1>CHm8OzXyLT_zPQxdM{ zqCyrv#`yHw*LOvei`6uoQ>5SrAF#)FIZ3~YrX{#cvAEl+R9ujfG=k8-CGdf>F}liI z!T;+jtlj7(5E}>X6_YJ-S|a~sTsRgFj)?&MIDRSQ6W<!xpsPdK_ayfAJLY8g-pqF2 z9VFxFmBntdc!#q#lPlEVTw#Uf7NEd5`E5e06#`NDinam5!~m;Z*MBhR2L!pOShDA; zsscKGBK<Ic`>W$&zInf9L|kmGQ-NPi*=vXx2dSW~E+Mm%{stS{7H@O7%D)=iU;pOp zGaa{{YN{3r#bfr_Np+6zpcu-nXiqRnd(#k4!E%XRp34Ms3)>C68XXg_KqLjs#t{ZX z>w@Gh-2129dz3iAGn*uF{)f)3VzYwJH%C&NURq+cfhc^276LivUKu9%j_Ye&UpHUl zrepE-(|~SPh^mGfUZ03ZKXEF=10&|&KZ0;h0X>3m^}<E6`eyeyS^?_mZnxPzuDLN! ziEK(x(-%mMO|583;-rcW&sjL?MMc~#`2<a2H536#S(iX+@bTe7tc)bhg3kI+lTR-c zwU~fvDw7(Pr;4f^V6q_ogDc6D1Gu%}D(nP~0R+x(l`<R;NK`rzYrITWHNJoi)ejCR zq!R*C&T<wKR7;~9nx&E7$YzeBAzrvx;k~d43Tj^kRbjs=Bff`qgs<jpx8!k@yFq!V z-F&Ij6G!@T*A+~`_kaZZjkM==?4<+XOX+&r&K7k=6vgBTX{n9CSnv+lnolJV?sny! z4mBYoy^-tS!9pxd`r_l4AHVweFGAt=dNRY2Q;k&=*WLCyQ66hdx^kH6gOBF5i}v6T zngKULOk)nTnk@Gdta4CNES>Rb`!C}TOA0-3UR1ML%Hyb2oqq3HM}>F0dFlw1>IyK> z;kFRPQ!!$I!DbieaQ=?KUn~wYRXcNUCxX9N?)K`?gA54*F*HuryXll2J*%Mc85msd zrrWz>;EqrCh){kY%Ui*>CRN}^jgQ-ToFd1J5WGO9J2%%W)T1jnLt-et)+=C;$PP!l zqJB$#NXWS*jIPr9f)K{8mU_-6b36ySS+B8w6BuR=@YSm)k10Iquff=LCfc^A(>hc_ zlGQD0Ap-hsqJe$@R2h7<n_Vs6sgu$86;C>Fg=@-I$6-jDvhGi&hv{pHL&a;H1|feJ zI*jmpvXEW~nbH6Ma`!eoZXG$==wAtNf%yQOnMr1Mv9~dZ;rL_X_qAiM+nMa%nSr2| zj=Hs$bQB%Q?ap}q`+Z0jt5{#>97*jYyTI<meN;uVSR{+ZVzJ_G2B=I${xdezSHZLv zTWL*YT{CrH#YqKMzGIE)eI&h1weMIIQjR;B^jfms$t=_Gc3mh)qVnzibt+6q)93}0 z8W*<RJ5#F7N)WF%;R9-M(xq2y6lsrU<&7yhY~C&RSh{eqG?~u9uEZwrFNx{FsIVWy zt~2?b0c_T|#JU6{Rbq9pC8)NyyW9hc()Eqw90^{~;{$%Ol9pg0wVm&7rUN8gIY4Z+ zM!{USULF153J?uJx*IJFj(*BXfjm&=k5O$5n4Q$1?D#ToXH<R~)54Q%qeVNJWs5n) zOqJ|1a&l_u9t}{Lq?99Y;hIWxvj>!xF~KClDN2T4;#*}R%TVv1d5Zog<KV6-2w7pY zWnM8u6CbfCW{~(g^Kp|uH(6yrj3ZUiBId*oIck}8aWOGxuFMFivA7)x?G^u4Bpg`= zDBx4jtdhZjBue{a*!T{qVJmLTXiO<daT*>SR*FDgE<8t4Sk}waX)37coJoq!&Rm8N zf9whkJ84*1ZyY03l~R*Tt5H5F(kcJ`X(vl*{Kd^!(JUMzMMm5Fd@y%ojXMS;)S}mn zND2&XTo29UfJ7WS^F+@Z(c?=*v#;6@eNJU%10wx9=|4er1C%jMLL7dx?OKsAhhs-A zUC)vmyos2w36cxK4OiaO7aLRuV0hmhP)O{0)n26!q&j|(1Nl^=H4LzrqJ;v@S;NYi zkc&=P-NeL^N8!yj{zmZQ{SqZm_}gzDzP;JCx0Fxv+mF9_h`~nKeyc2qz7nxL$6N^v zj)0cpq@{MxXhSM;YSxaFECyLh@GgO@$6ZUUaaP0JaYT6Td`xLD`9CE%s6F!Y=XaMS z4c-`2_o%z96b`(6^zyN6jIs5+xFGiv@68+YL4dPHb|<aQ=a%w`XYDFpSn$;q*<&FL zJHG^Gwn1mG1>}e{ZCXd526+-#m0(oTYDoo|C?b%Xu%zX-X|x0=eo-NVeu=+(+JFh@ zBcICZcZ%nLM5wa~p@sV+HCm?b5p3(8a_pD34jC7*ov3hr-SMWon_>qgv3oXw<Kz#= zZ%>-5gGO`d)Tl#ETtqIhwA5s=OI}n7zNSp$zTM)IY1rZw#QCsEfv7&Y?;PPzpPew^ z?GoVNI|;qGxN7IRaWf`1%;3ev4GQG@BWIH$)lIj{2}S&oaXp!B>0OEU*(Bgi30iTs zbkv1GLL0SyDY%DqyXRL7j*_Vp-lSMzz7kDOTOfpf*f0Lwwes_nHVcQV%3UHH2O^$w zUj3qO@AqH);SUom?S*X<xQVw3h<XjflfWQqkHwWI#8Yzl_z|ospMO&5?v)H%B>wWr ztBLst2z=^J4jkXioE&yb!y)^-`OK3}Sir5zX7_&S7bBvnWKXUzuehvbB?m1r#fznU zG*<fYqY0l-A_?pRvL%0tkxVYz>Gr3>hnEgl&DC^=iJ{eRgP`;NZMDp9)OxXN)PeEQ z<fuWAI$Ef}Vz(IHr5OPDiShz`v`U20QU*}Z*O1o7?aF6aIiT3xkTkfzu0a%sklo)` zRD;p|Op+22C;`xCyLKJ92d-<kS#Gz`K=d}&0{|dBdJM?-+2q%+!bueU9(rMP6#s<8 zP4LXEDT*pWS5B~C-FS34d5lBQ>*n&XUZcDWEE-Z~Hh9Pl|LaXPD*&ld-W*HE_{Pv5 z!8Q*{sljL>=LJRZdXV}4luT&s7KS;8>O1R7e3`cs^Q9l;tJNHS${t5s-cILsgP=`L zNAMTg%w<D$be{xw*~NSh_RvifvG^H++AYm0V#LsQ@)PggwuXDGGrUck3|U5rW`}06 z{Pif_5Mcj%46(d-RjEx!myF57Ji^RlHjcmvSu`{_VJuJ=$usqk1xhw@R`n7Pky=JT z-ZU!|l5LUwRNXl{!MZ{nSGw~#odYj%*E_*@DGOEH7|dkXwm4>oMkUJ?DG}^7DFy}1 zk@M!R6LcOX_b_Xj6Fo~IVY-vSsQi=A5k*X%q+k$n+j&dBFgf&dtQPde>7P|+i%OQx zHyF+nG!{Mwu9|N(01e-=Zm?}7VW0oUq45Q`FtY|g?*I@J;O=-|35Pmdzg$Ka{ziWZ z@93F@pBQZK4(rXN+ajrg%IA;Zu%r4!YP%m+F`;fH0*NDOxomJsySa98gl_*FCF4FA z>ukAg+p0l2w*9xoJBO-z76V&dM@ghYzR|M7KV6H=g8t{r7i>AnwpiKy&}E1Hc8uIj zWHCq|ubudXBwYLR-1<Npo{q2zSb=DSu;${P;@vvMHKgM*irlm`Xt4aF#l-(aYT%kp z8YyC2aJ-65Dt3A9wOn{nU&oo$RXd%VC>O~9zFYbV=^7bl2}<OisVt>~C16fH$jOj^ zPX>+->kUyn<KO|WZWs@MC`b6GVm=A>4|+yPzG4waM6x4>q^pjrAF7{M*5sNQwfm`r ztQ^2o5sH3|wOsb7UC-~{Ja;-&=C(oE(c2H$bQ-@E+(1Do`Ba^-7zBwASD59sQEdmY z71KsPP!V@YAt~953>eZfObJOh;hJ|-pb7B3(-zqfP1ZQYv+?ufmqqNvR?SrR7=Clb zf^Qp*-BvG2TzSDFF%R-;V3G6Q?`D_CM6XNK+%t8-h(`aZ(uFK`kI=<bX=64?Re>|7 z3pA1`4rWw3lnC0sT%f)PDq!oHqO;~Vp5EM(E`DGmXBC{TMXV;eGK!NZOoLbxp=L#q zw){~kD0FvMR#RFFE$a*`G(Mgdjs~kU>BxyxD8;huUQRa}T`RN<SBS%+IOGw>K4oc- zC{&bTM>mc9Ozz;fk|x8puX+05D7$x+!g5BMU%J~)(%gqKXbm}%Dj1m*_#a|PC=UZL zwd}g<m(=(5`a3|`SRtTxEX!YGLvnPdA-VL>sbRko%XoZ;QKL^=t3-yG^UTK_R}7&= z93ELPtSHF0AjY*>n5%Iubylr*fhLl|v4XEiUm*{A98$H#Ty(@@R#DUjECHTZ!L1bD z_#Z%U=Pdq&jU*|TwUGhdNK>oeVv`FzTNe@ulV)7<oP3jEq;`GZMkE5}0<pg68^gg- z6h*G}a^b~A7f!qsmb_IZzJ-prYu1zLjBCzX)-sQf-X5*GHc-C7G4xV$+`MEFEU3PN zqpd?s(Y;+qr~w}jhbm^jN)gMN-P-;=J?vXV2H;F|;b5GGOxWD_@sx*-hSxlR{t*k0 zQEGOz{E_%f{FT3S!L;t9`$-z&cqnPA^WneS7s-XfB5aWO-j%y0kqv1PmpC(Mc2tNF z_ew4<=po4G8+tj`>45#2Sij^Shd|)?2MHGRescv3f)MU?XH2P{8#zv;^f06vpdc6u zg@?-L(7mG^OJ6UL?{->^DB>eA>VTiXCKG^itn9YP>VOm=?D>s7f77W&-Hs+XM)w|C zEGf(=1qVZ#$P<X*kDx;OeT21c-Xh85xjxz>i)lg_^e`gKAqBXUG&^BRhwrU(FWvw8 z_ZluLV&LEDQQM;IG*JH%?N)j?fz4J#|Cx*hxQIjrM-em74er*6M$edN?TU%xjhCMp z<_+GpqOX(bRg$SGdM!WBrn4K|5c{x2rEjMbq(S~J7MHr^iQKvqj6d-!7oCn5zv zt{p=%Y*%v2NhAJO-lbtRaKxr)5RhCfWv@|yja@CgR@YT+Ex8QD_F{W{Y}E@gtBWv? zH{1#?qQr9NT3-+ejE#QA#jjc0zFX1>vaxZj>Hk<QapMUpb`f8UeL$BHE~ugjF<4(u zd@yg<h+u26#}0KgcMZ<%+tq`c{T_B=btiuztD!+PqsF!TXCyCG-a;0Z^V+oG>|F0& z$0;z-^9@BY%N$;}^TVo<NSfI8h>z4+(vWL-8MgFH*%3)GwX4C{UQ=Wk1~j^Prt%?| zKv%fQ&SsRf6J*I(u#xU{_5+3qivaroIIWKEcBTcC$(hhcU=Su>#iAcgoiv2I<6WN$ zEHsE<=~zoEgQ}hYcV<dB9#$i51R0QWuT9WV1&-}LioQ+g%DijNe9K5wIZE_YrO0na z%h&V`B~lMTs|+}BY&5L`_Ogotoc5~gk<v+gE-AONMAci(J_L(2+sYF@iCXhVy~TmA zqTYdp_@r7MKH7n1#N;W=?og1(iS3Wnk|o-FEm@)J;e{jVfzb0Xwm0riH8|Qiwm3u> zGdjMbtW3gLE+-*SCN4R$zmZ9JApiL-BP5lS`?et6Hw?dF*<jb!|D>JeztsJ92a8A} zPugU7aJ`OKg}iCN2czHjvxGY*owKJN<8PfsCVHTYOLDmKR!X}vNHQ-bv`#=h*K%Xf z!;D&|@?hDXi-Xf8ofeGfQk;r!q`Js+@A!dURojUwTty0zM5NmR9YFakS~WQ`Ij_HY zJ-K{(dHMX+x07#Qef#vI{qW@Z<)g1(Jbe;<eDwJ3^S?Ze?Brpi#8zyKlM2f%+B`*c z+aFnW@(bV8B<2_eqr=rj9)GcsxH*syN8k*%_IL;>I2A@Q$jZ<t#jk{*;FMqru@O!! zQmHd5WQ;J_NeGGK9sueTs_iy>O$WjnDnLX3!EuP_(<X!^KbcNNAAvDs6<oiREY-s2 zIupv`BJ2{k#ID5bN(mYy#B16p0Wz)2@-dQl1Lq8ZF;K=!&Y;8?s728^eu$-sDnc10 zLC@!g!eH;6gyxFy9p6CqlI$$(#YMk_j~ApG{7k^v)L@7aXd~EVKxVN06uSsZ&~Xqz zYvovu7(^NAs+%zmqMcj}aoKe-6NP-J%OpDxu3Qn3!zD@d$KNbBd*=q|f9MOlNMX$v z_<PEr;H3{u+^PfIdSNHIdlaMbw?=+@p?mwhV@6!sOUFysF(+4t1yY%u)DcCP*+pED z1z%h%fVM;zO1;P|MLR1*u1!UlcqWPM$TVHfCO;fdwi0_px$~0PX^JwSDW%pB@BOk! z-N~z&aLgd-1b?&L%%g}2+KacHG);^N1`N?TMB6relPE}-JACSQ#)AwW;fp&8b7yND zk(sOXkIx+4;-Y^R`RJdilP;t__$+eLKhyn!^U^;HZu;MT{ViUx<_95OOh52{FOdT> z+w(uM)0W>>?l%HYzo}opf6*-VNDR?%rb_ep^kOi7nre}`xupORkw6(DC%5Qx9s*Z7 z%z7a~)ag01Yh;)jY_7eRdAZvKGVIpWNr}@+=@MpNejSPBq1|xf?eg1SzO;KH!;sZV z|F07GH&lA`-X(s2L%z*^x%amlm3i{bOP($?wE85*j|z$4u!h9ehfcUz()nikh3lCH z(td@f5}Mr%$6lX1VTOp~Uj#CIz)ZXQwaLa0fbGrw-wcBPZBPeV!*V(4LA6Evchw*v zwl6)R3{{!pm%y8;fktWNI04lypj%3}{0V&Ee*mpaMB4L`J~-~Wo*jQ84$?o$J&Tt@ zBG?EDasgo_3%B<61Pc?yw|&ZEK`%QNPr+a>JC5<aaBFnaE!rJk>u@}<eb-ZVNARCv z!q?pdz5-L>rr842PZ-7#GYqVKvQm@^?gNR4rxZ0RIDka|rLnNdce6|P=TLYqJZtP( z5Vvw!=z7|v>fR$~OpA77*2GjXqAyujGfC6F@0$-d;VG0FX}cD0WhiCCV$8tjOY%QW zPMZf#HiQW3p$zwU|2x;Y!Co*AF$*#gTTSoa6hry=A2e4a`fK(+mvl9XKE)G*Bkgb@ zf8^k+`pc|=7CwS`cce;@!5Al6JVq+iuEkzVoRZwkD5w{7&TF;0r)jgf_Qe}3cp1`n z9X#@v$akQMKM4U~7~ff}^#2Q2Yqy>hvAD>0($#rl<YPX7-8kZeX`^&h2UBHvgc$km zD!ZyxLz2V_E%;QYNlr*`NCILaVVhL8=@Q)c@6;yiS7N{|zLL!k`PBOB#RV!y?N-yR z5;;=Fkl4eQUxiH92`>);i~9*oa}tg`iu`*#3T&YqhaD(Q94chH)3%K_QUo;N2H<>6 z2G5Qr!Gsz@h&Jl!s`7!jv~N+m8l}S6Hk1UcyF(q&GYkvvQseI9^&PIiAob-vr2O&> zYWD2`r|5R1BZP9_8VM<h!(nrpw9~1ge|gFZQE3fmRx89N8a<*m$4j$ymJ4))1g-rZ z83Rs22J@<#b+`Ocw%IC8Hm6GDVLh4S+Li|zbhDcDrTt(Y*|QbV_s*>Zu9P^EC(Tuw zg!CRKu4}|&sBo%ANJd~EfJgOZ?gO4dL+TashB{0`R77C}&B`(9cQ5ogkS(tBn-dM) zmxIV;8bW(H2X-=Kh_7}qQDdFeutP9Y3YPh@_+ejy6a%&+stS-uVkrF?Xex)0vq1m@ z&KYoi<pAJssa~D|B*BjjX&*~$=vnD3Ay3W;fWBQU$Ye+OTSU`rRZmg@T4cQmrw@{$ zO&uK@5Gc%cnUx}x%(vzBra@NPcDj^{e{NkCQ$~!z&dn}%_>_<@VAgnAYB!;a+X=t+ zyDx~mFq8O~*f5XdSGN;nY0iL%_nc;_AamZ(B_^p<H$foGfoDtK;PQ*RcjJRL8z(4F zUcLO5{>fvYI+)~}Fnqggdjxc)%I<G7_&x`!yeZ*&S{V)?x1l~K6dQ?729_Z0#-u#4 zGC8ig;WKrvz06RZzGQl;<3EqK6o235E2pTy6lz4}uOW;f@&FpgGOI)omKG;2boz|C zD+Di3V=8s6SGdYsV+;9c4{5$S_-sqHpb0kMFU73mG1Al*kvzUx`n;j2=(&uJRX~cK z$73vD4eDZLQNC92cThIZ%^jSrk81T*BU0@u3_{tYZdU&=ENwJ*6+OxEpq}z-j{T~m zw;v0b#g{N%?chkpd54}&<1xcsR-uct{n$X~q(Vk<{qtKTLK!2<{@1^UB@#iQ12RP4 zixKm@$0mg@#0RA*&mZs*l4u6&Bvt8=MJJ=Aj8pS7{_{0bjyy<5f{s8eU%W<aY@N<B z><@HA;zvW;t<3V1#x26y6Tt}=8!#4A_0La`Hi&toU*)1(EM=p+!dYci4g%^;eg@;> zf?OlJDm#g&jAj#7V75V(W;<ko`Wjk&4PmZ)*uqnZfPy1Q)@m}V$vX>#7tM5r2HO4D zv<nB(t&uL){g~8=(#1Z?p$RaNC&<F?eZN)HY(wv$F{QJ`&3gN#xl|%*7P{QDc}eE= z8k@L1pBRNDyXC4)lpYxb48+knC-&!_K74|Uw!?Kb|A{%HWSHstSxJHCyqerjS6bAL zx&1S-B?K?jM4UY<be<B;lMi@=89i$1ei5wt<57YPZSY%%Flzehv!cUi+>*M1Pg*M9 zC_llY-rnqRm=yDMyIa1m^pl?|{mxe>X2wzK^uL}VM=SOJdX9`SE&n5#aL)$rk4LQq z|06jzZlS*X_T}rot*yDV<s27Ut2WvGi|#`eyoix&j!<DEblw${pTb607VgxSD45sa zP{9GG@OeXVRdG{t=ub-}c9}OojURmlLbrsl+o`|jRylDm>f{ADx$4$?ks}sqL>R1J z_(LdGSP1x+w8J7#Puy+wK1jTWmPq#Q(&f{yb;+;MB3b;c){_p1;oy^eCH>qlI1|LN zb$-E1##r}S3cRG9UWahv64$Cbk`2bFOhNhw;@4Yx#BmpVTXdmo*z^NZTX6Cbep0uW zd=}&p(!-wMgWoHAk?Y_Za~qy1ah~zd;NMH2lUh-@cd}kyCG(}>2;-S}<e242gS|?Q z8>E{b;4J#>1)-vTIKQ2sD=uHpqV5{&q2DP#Vj2f>ZFg)9=w!jQip6Z8dxd2n+x}9b zyU0kLM|mTFr`8TQ7?jkMob8K`GrS}QAR;#%J`Vd65<-qtU3Y#$LUJQ`HuA_$lFla< z5?@BHQZ!}12rdy3A=x5XYlvZ^*XN2^9LW$WTKssm#JL8$5Xeh+mdYP;(tAH-CJP%g zynn*w>^Ks}V~|Kx472hU#BDd{bbOD<2Hb@ql(SxdIB#9q2S=(?e{Ky?*hx(YV_NZ% zvSGExm{|iQ(Ieh=hdb`hT|y2rd`($f)BweNgB5tpH>))?T4M$pK6CtxnwqF~#5}Zr zfoB%$<7MZgr;8L6P+XQ%Jw2s(L4mu2eU3!;7MiWJ^-ejAiZIv_MMfak5H<_e>B#8? zpcg6%QN&WEhf+;cSO!6n6vRW;HLJrfH(Vt{+>3%3Q<KMMD;yY+DGqUm>zzz234z$) zYT{Vat@pNNS$e6zm<l%uVtEMJvAX<hdRU3UsThX^HQ*8ok#0K8jlOYHF3D`C3q(<} z$5IaJyp7?;1=mzY&%ZJh<9TD$&y?Jr6SvTe_{2RjHZlDB8&$Al40yz_Tn|-?Z&*P4 z_KpOT51wLcnyVfijT+8@{p$mshebU;Jb{Zly!@LgM>bn2K|xeA9{$7>akZU34(Y+M z7qNslIy47}M#lfl1~wLuRG8@_Nwv}BSmh={=~8ewAl8-1k*0eFbpUvkj}^mo&ZbPe zJ1apti?NHMd26TuSb!6};}j*6C9nBnc!QGA#8?xNa-g<0XT-|IzJyvD9CmwLj;ap} ztz`7dT+%({X2hCi@As5>4}h=i^Bjin1j?~L9V~jiCPxSF{!;d%EQQ+DCNiZRX`W@) zT&H{$7$tXqnfAVcn`r}=z;W01oL@%qlQf;hAFTQx*?gH9@hvC|r`p~BSnjS|;ZYDv z@Q;ii{{zO*wX=5!8%$@j#y`NDXTC`*k|zC)bwWGO=LnK4+6g_-;+UZAnAzcs4n~HX z4uV3c$h>-eE;QU*T%lZ%qfNXUn2FKUtl--p^!QeZ(W88JMO{KyFg6_}`_9DP_@x2a zvU{;g!NYP)G`!PQvcPpmbZjE%p&yoS-J3X&T#PuX2c-Hf4Y-ev#!jdW;>KNS^ESgH zRw%C@9+Yz$>O+!7V+lq|X*ApSHhzRee6o{{GsvP`SXFAkSq;ZJTJ6bVN-smkU174G zsl@x>4?n=<1`F_4)7d*@f){5>;32_LjfnE#SR#Q3F8zW}{B_8#f}N8J=mO+r0!gK( zpv3NL%fOt1?2*ZHFtAci#G`Nkyo49}fuvLn&{w^rgtLH*A3p(9yj!<poN++2OfOhS zwjowC$^fls8mJ~fpA5dsEFGG&{B<ugXYe`V;$Tk9g#%Sv5XrboWtnR|0uEWzl|f8o zucWcW@Wr8^J*1o^)j`IYzVL<t4S~fRq5wfWuSgy?M!=_aCxS_Ms0ytU&HKkCnyYFN z7Lp#ZBbw;-KoRM2Bw;&8b>w0e#E&-{q3KXa4bR;b5P&S2RG1px7N`ZmqNsrsw2)#& zy-lR*L=Tw#dmL<VjVl_U0>@X>il3=O$oGhF?~07z%ZV~UPdpyQf5Uw5gwzC%fbY$V zp+lm5%oreRxqYh{H|!K9SBQvd+EtGch$dh^!TH;19iz3S2jB40f))TqXLDjoT&-Of z0JHSo9QJrMQdjeSq&MxYN}lzb$Uf)C%pd_@@%U@*_av7wPMKm{uPl*ri#H)%W)!NX zz&Dp=-)VAYgY%UGRLdKTlda?rLXGTLGX%0mIRt7B!ib_IM8o$CPPx2w*8LI>kQ~;3 zgBUxM<c9xhg<>GFY1>h?1oMedyS{L_zr68}Dg}#+?{s+@)8)RIKFE<k?Nr?_6HkEl zD6F&H-4@lor(`^*P50%${@eA8E~fGKXnqK^J`U^ep+KkPvSOgu-Af7|rdjP&H{vpG z?5v5Vp9ME^)~D|grKR*)M*ypyWw~J(Dn{Y|zWf93RNj5@$3Oh*&%n2ggrAmu$ax%| zs8}Kjyrj%Yqy>dLv1;$uQ~U65NdSjnU$y#7SrEvPQq23Gvf7CZ05&Cgn0-<~L$jt6 z^4rLXK%xeEPY{isY!6p>s*lDZzD=Ojw=)I+d<Y$e2sC#H1JwKEKp-WhU3oJ^qKA;M zW)w4WaiVGIkbaPLH~vmwg-31}T!)E$rr%-*7*6Np3EA*@?D)eRpUOeJG%+uWB4mYr z>>V6eE?&Ztbh$G7cM76m@fsh#V9$~+{IQ8Q7;s|{uUckvL-(<gZNO1bm$+|`0mTHI zL#fpBb5PYJ{fgLhnNy25FySKi^7&nEio(<fC8?-4KF>Ha!dQ!_6UF$NUGdjkptrZh z>Bi|R68G#5bc@4*TRSe2sOic&G5FGMJ1JEMikus=Zr0JK8V!?<*L%S1u$2Bg$|1lB z$)@s`LKsD=GU7@+x^IpU;_@QN6B$WDMo*phKgDS7m2i4`d%9cWJU*L-W;VZhWHb<R zNuRzppK?Y7coTZ7HUrwd>+jC%c*)D)7(d_cj^<|2V=j=WILfQfY>8vc-Th#?K}fM^ z7>a8rIV@pt1;TMvK4WMRQppaM;klw2p`w=Gi<}F%nSc4O|N6!MJK4UQU`K?!=JySM z$VSj%SZFmk^oc_3MnN2sG{UMbMdT<{80Fd~PSvOMH<>Y+hZJ_*^gA4t;zW(}!-Vx! zZ&}$hB$Q#1Ot_QJwfgD9vmInOnjKi7(PW+H$1!tcAC+o}dN0%j&+Q;&5Lg5Pv;Dxx z*|4WJsXIs*oGWmO&12A$59uul5PJ`X6>*j?5m(7(o8m8lF-EUY>K7$ssIEskx4%jU zXL_xcS3AURXxZi$iPqEq_T$k2mUEP|rpryODIBZWT91EEiTMD)kIhblxg4pI;97a? zC`g5KzpFbcV@zS)lmp_Y>vWsp+m7<@FVwLE+4{~{r30@1P|m-@=7xEIlfC2eTHm&t z=Tv@~Zub{ZE61HsMkEu$j^lN7td<Q&x=ivCEXekl*fJ~z4tWm$_Af<|lAjD`A;Gw* zy_`apf`&jX+g+9p<fx>`paT;P1dy`eU=H1qc}$4WAuom)PvKEH+E<D+h6Mw87Ylg+ z5qGV7mW}dnsb+#Vu*7C63~S2N)q-h1H(h;kN}V?orwoBzj30aPSmrBS$Rdls#Hq@N z{AJBpM&7d7FN#s(pIhe3l>SfP<~bsLMBfi(4*e39qC)B~YceZDj+~L=xkD+J0Py+^ zKAk;`M_P`+<i`}JkWvaFIR7R1q*%jFSk`(^D&hshG)?wKqjrwOOT%!GD_e==d%orn z-kz;vaq%y3!nN}o<-oZz%CON%T`LTvZ~~Mw%R@-m6)&=2MA#n=5q19QMNTHcJet8s z=~-^+Hr{A{hC!an&tvz%@lef4gPQ;d$>+^_yVu7;i|5#wY(6P4x#H&d;h}EUs<@(4 zjS@zGzES$|I8^4SqXg{ip#VVe5i<<A8X1;Pibp2BW6vyHj^N##d?u91X+*_9V6I$; zD|}AQE;{)bGDe_<?$&>7qX=T3QW6CbTO8E|T7T9vo>)HLeL#s?)?R(h3uDlm9-Q&@ zCkVEC*omtky5?w>m_9aNe7rQss-83Pj682Uv-!+PDDgTRqn{4oxRcXt2=3HvEQek5 ze0U_9GFd|$t{mOPVHkkpQ=oQtA7^)fHeIE;;*{|;ar<VWY1~oXrzA8Nk{-(HXL%Xd zMxN%y(lLO#>`PWo^J0qX!>pa>#r-j#XN?FadK+XF(9_rEv`B-@Wx+cap#-*_o-3*o zxfKrmGP`j`Xe&T1A0-Ycw)jq^ZNNDp?^q^1j*;tGXy4<UpLGIRq7RdR>mZZD9ua9C zIK1&?A>29)d3HBB!zzw%;}|}K%xA^;B<VBZqI+<#+z4`w7S30RGfZH*LIBCTTY))A z7G0i^dDJ9q51u6fMFDGesubhJ1nsANi^>28b`8ygY%~15up}|3z}9n*xD!?>xUu?# zNWY^wbFIOU;x<?K;Dj#gRTv_0qz8amw|hmV2i=vU^Ad8`MUK(429-f6p2~rG1_pz4 zT{=Fl&l*(lfY&Cg^T=LF9H1CB$v}cqnP!qB+KZH0#G#a|MP)EOhPx<k!6`41Q9%+q zi9%+?VSvijQ@|!n?NOnVv?X-9SMm$7j1prsLo@rW!t5i?_%o0-y$=&Oa(eFb>_4%o zvid_@#w?TdM1i7ogCYGl77WkFr3rwey~npbxdU>1OZyO4O2GZg(2ykt6mke0`?98m z90J$0ltUo6k30B|Qwekx{*|axIi#{p?p{(n?y$kvd6cG%ukl9F@Wdt-jLS%H!?qp! zGZG3NPRvMfka&pMZsVw74<|LC@cd+fx1gyIb)y$ib+3e5P{^8e_1E3ysnt#jN4g?o zQOuSYe%Y>ek3&7SN_iv+T)f(H`AV8~@sx7_^9Dk8@K-pQ2#W$jfR`P(h?`>-{VETy zzd_|6;OFOQ=B;?N_>mLT@waq>)S!e_dpkdDrLutzo~p?%_wqzobVIFzUc+Qn{HDm< zc}Rt_-r=G^XxCg*`jHIEWy9P~m-_`$VC2f3j+DM4*uTTeY&#w)|B%jwyhZi(-E&QV zDG#)8(Jcr>fYHybrCiD_3xxvtj{_pSzWQ338dS64HdP6;z;tU+2bIQrsig`#?$9U9 zAp-BL5ccxM^|y>E05C$7P7nY*X|4`>o!Tr637M*PqPt}#(+$>jc$llql20IITUyqH zFv9s7e|iq41E$HfbC$778er}_fWo!M>AK4dh!$H6ICJAck0@(9f+mY^O3tobt*C^6 zAwL0?_Q1_#9o+Y*iHvtvg$i92cg}$EHCtQFp#bO-cR5!6DJE6zq$G$hJ6ah+cZY%? znnA}@q?qKHZ57f&lcyi35)aC4^6M?n={Zu|-g%BIyl!xbyn$(W$g|PXT~rpVuSgyA zE$acnf3|G=t4-<HO6|WPgDA`%)BNQ$Ii&GyDFJ_(=85*U{uZ&R*DWsdsVI*j=rX7# zjiinMB4&BRmLQ>-+^Gfe@7uVddM{AJz#2>{7L+)2rKT4bpfNDG)PxUUF$D$POU5F= zJpZe}&|)O8Y<g-isj`Ec$C04TB-ViP+lT;XC;7>;1H0JR^%c?k!Cqw3xs3Y4clvsH z4XgN?9~nvI#I*GyVz>sWft5*L^66IXb`)aj%40C*au{Q3z?6tFD4*grtIhn`as`u= zVwS&25q>a3tZ_{sUE=0T%Ci864N?#UfX0D}yri8dxEb}u1?J=#s!;8p;BsRXIO?*w z9|M9KtsdH|J={CPY)@)|r)&-;^vd!M$+ROl!dR;GGPto&>Qh5}kzYp)+bjsATz<5p zX}JeE`SY$lY^z*J`Cgkrf#QlTkD0(;Kvni0Mb62xUo~V9{BKa|VnyXHsw^8jc`sM@ z0)u%qni#c3B<SIJRT92b!)^Uk`knvo$jIj9lg3WV&tSug>@j2QTQ$ZQ?309y0ryGS zB@TQ#wpS%x8Y^J}<y<547S&yTp7r-Tq?M$SJur1evodoISc#YVoBH;o7)3{?2pL|z z1L}+O@fI#E<6rA6i?jm~MKsJfd6SYl1|g^r?^VkEtU(>q{!M$U+o!6SV(f{Jp<Vhh zSh4OMviAy}`Z8nAD<L0<#Cr7VPrI+kV>yCU@^bz>)thPeLBTiE-TZ#XWc{Z5pb(Y= zucAkL&y#u18hix5Um&KVxJmd<M*Onb-?SPCJeMojFY^<mjw$C6w(RgCs)mrxrR<eF z884G{7G3h{@jXpDnVevx+#qXqkd>2`(sS8MRzYQL2&Z?RN0Z53t|PJ6baBJSD5KS& z{x`j6Z^l*Qfw<6QrAA{oLbU|CJW3Vmbw4?!XH<M7CtYh8N2<QP@Lz_4(Zl@wmf`E{ z4!4gKW4L)Nu>EToQ{r7eC22&Tw>xl@Y68g|^it)w8b>vLM4<!RhL3jUXV@4|#Sy|5 z`mn%-pz*!Xv77Rtkq;Ey7f_C4oo7b<!2Lg7;&5{Lw((cK$IUomXYo9~;96A1ikz}4 z2BH8S0q?sXoB89L=}zUh&(#Zko85Ku7|#zbuMh1(yYjHkqUlX@-F%>NpGp`5!29wf z{*F-tD}WypcfCYZ(Dm!t8N-t_-SFbxP899s6z9`NDXP5i{+gnbkwHF-iw>wSo_Qa- zak*KdK*3(8`cxOgvklui2?Y2rUX^>b0|ApU3`VoBIp#aU#G-BL)z#K34c90e`i(tW zLzcfita;}}`mg=^l+5>f+rDcy<9mFMux(}`dIkb#76}Q@__%Q6&vb?;TW)9^$M-sx zI%e4stBs9Rowf~ku`Lmp{)vT;j2(V6KcWkdC)V-W+>G3JAL)76-CW-!bG&Gbib-IJ zTve6Pex^x#>znttxBAj+61X9Y$~gXVd#<oDZ(g*wuIkE|A={qc`Fbs*dye&r8BIpn zz&ggAU~a~mGHIW0Xlqi*?Ms`(-VSdXRAkz`ncj|OQnCT;g`Um95RdTM>?6vd@+H=) znt+l>I8{31)UimogL=Y|Vh^}9DyYZv@oCcFaiP$bMDyIV#h^HtJaDol(BgR8eF3w9 zu86Yq2;yij%1~_$N`z!_<nXQKj{v3A_Du1;5aUA~X9<Y+*Y1NR^{39141fv#LJ8In zlz=4!kCNMy&Zv6kuSlJVocQ?W(Al#Hs9*X^V?9DX!xCNsbcB3{wY>!B2#U@*XX@eq zeH|j<ENVGjg_Neg^#;j8h8fOPghlE(IV}g(04Q6B)a4?BQj#Oiz8s*=0yX>I0!Yf0 z8Inw*lGZhUh9-`50h+#YITm7SK$GzfE^MIe>FlQc201k=zsZa&F}(~!)YRQf2P1O$ zBM_RuIKXpRUX5JH;2;)W+xm&%)S#3j9>^$OFbK2Bh{oZ`sCq`k3VG$Px(@%q`K|+& z7I4@-C^2Kygm~v79HW(o;^yRNZ$K%G5C1+Lj`&FM)8T=&_J=H=2FugUVa+EW6l7@l z$=Nhy5FuXpC<KItB=6+8vU{uu#fnc9&jlYHCr0qsa?lur{^TJfr;ITc+_-8FlCF9d zpI%1Cj}eYY`A!~1bnp_vZ{@7=+^LB6q7j1au30Q?67I=^Fq_c`!-B#d{Nov;;Pa!B z_478kcPZfRh2zDDP}G#=lSfBp(M5upV^~#dd;~qu?BQZWi3c*ULNX~;E%s3QmL~>b zP8Cn5BR*{`!x^5Wx+;txPI6{=0x5puRuZ{L=W9~pA;ia0MR>_3`4kQG=tQXY72nOD zE}mz41Ge;NG2-<i{Cbc0%&B99&1Th~#X>*2^e8eycbpXTpHIesNgUka#67XCa!MGX z9i?7@HN`{C2w=pZvnHhPq%%UfPESJzOt~LU;V3i$?3puQkYj+!M$zv)up;hJ)g8q3 zoSR~$G0@8ArV))1zX#1yc9<H$>hNyjs^O#7dlJF)oVA25eU5-*A)`|kEyI!%*a(@Q z%Ts+qKP^4yvJu8nGXqa{xjwAzu{Z%qHt?SK0YOBRuej8V*}S9g*XBI<grUTT#1VkV zBd<v*D1gZ-9R^3RJTv+n91klxB0d#Pb~GCSg8eZK28<68Ry<aYK_*Q`0j2Y&-aX_x zJ(?Z`){HF#th`kNOw(Wh;47r8euKwGD}KrtG3EG@5%Tk*h9-)AAMru~mn;B@E{}{9 z3WEy_9~(Jh0B}PMuM$eegu)ogJr1iDRNGM|{ebjb;;Cc46>n}JM_Mz=;#NaD9mjlz zXrLP>hNUu1<mZeLUOpi{ueTi06y$=J%_MSOv$RY{?R@`umRfMxf%A#rs{7k0O4U2S zEI%M3h0eI;HJK4nb{-)XC!0DDLCeB(y_8`ExF<+Qgm`)>O0y8+!Ht&fS~RFb&idQC zZSq)8<md2pZ{~Bq2pvLJ33PS9A$q%PzD6<0chQ2An8AH$GX`Lq9}#g1g*JTp#DFEq z&+)8XNoZu{9&=(9LA{rS$R7-zO<uVc1Z?MFx0>L6igqq<AW^u;6|^kM>;ZLv;zLF) zvf;nmvd3i@U1L}bCjwoKVK%>&PaF?j^VBpN2f)=S;+y`fcB9$tQRNM-fK)99;D=+N z)ha7lVBroPNv!@N%ZcvOYs-g0g`l`UwdJ_p5q-z?RDj;kPj%c-L!zJ_&T-Vx<$R97 z$x_<ac|1Y06-qBTF=B}MWZ`AWUAX9yPetBC${LL&Ht)~2<LQTG=N*^6!RGxTIFE0Z zD_@&S?Ld;7=w~HsZ<o4g&t|*W@#S36DHs$`AZJM9aej+RDI<pTe6v05Rcnl;h`;CD zLyhVp_bTE+^*==-t5UzFAe<F4FsEw|IK`NU!f5!XuZc#rAGqug->0r1-ZURnkt+5` z4yDczBmwYeudruKvw*tvpmYIXSx<ySWoOu)2-NS4P3eQ1&oyd1d5S7*-Zi&Ne@(Z- zXupaLNdkFQnIP;CWW)yhitC%XU>7x<;|j)%iaF)C>b)NB+ef?IR3)&c;HR#?9t~y! z<<pGeO<Bn*JbDH6t!vAmsbe+4qZpNyH*QracIc{#+L8y5FYmfIe&cxc{Svo+xY=(W zddR>1_?w4sZ?M;$Uagwnde6fDPD3txNy?$9=`9@FgI>mogvm4`a}3YQvD@0;xDkr! zXrsjR#O<CBl>v*JzgT)dr;hujdoinM`C@q3@GxuLc>IqaJzq;~1ry%xa3bw`t*{vW ziN*ULnrd|+gMP3Ay$>%y>VpLs@=!m|R@1I~c)|bq+%=_yriT}Q`}GC>|Ks0&{rOja z`}KqA?i$Vbdc|M={-C}3Z|K~^3;FLqzv?6HQFpoLLa;?9{JGh{=bdSZxk241w6AGL z))dTovb;vI&StLo9N!YbDE0hizu!`>qrdWIXT85euN0KJB5D3jgLqhaHB6PIzmEhW zb?F~5G)CvjkdB)qaME--9-$2GyWMI$|C1S`HTD%tp_jdkD_FF6|MD`J3H1=SyfK=r zb!*l;ncZPFgCaXxqXqE!YSmm%SC4kr?3H+}WjU@H<las{rG4%rq~Bck^{iX(dat@M z@9k5!?Y-Te51IPj-WAK=+o#tA^!7YrUFe1Li&`dzDeYf1T>n?dahj6rca+{$di@NF zSEgi?=9Rk+s$Qwvpzc*V4Ju!y-&pOdbnjQcN~baUSLu4Z0#*S15;d@o)BzQ=afANl zE^Ap*HT7+xxC6nhxpzrJ#J!?;gj=n3qdTKW4;_e*;}CWA{zLSYt6W9^b^TX}h(r_$ zUFSe}7iWD3-M5e2&TDh{9o?Sy`n>y!b8Ql|)p%Xf?z9kG0)%4|M~6=mATUB-n=Fmq z(UHL#4&3Dk;!d?lTHepj;L)+23b=f*I?st%RP+KoV6u)JMLj5(&^ao+m-HDGz*~|v z7#YP&;8(*?Njv!cmc3A%72PUOr1;w@Ql7JxLt-wMz_HjTlcjTb42t`SbtQ!N1-!5w zS}v9pslo0D<>m+X+@%gRtDLumVRqJ!bVpFqbmXk71u}~;8PL50hFUq8<0?tyqyd5@ z?OZUr>clb2GTPzN6nVdam~5$oa%l8)`W3ba&2sBLK$hKS2;A^#Y);>aAz_J33@TP= zR#PW!K~lAAvEA9<)lIlI?m5udIv}+Ir7?&<7qsCh0Qo^ijR4G#|EXpNV&Y2286HGp zTyzl?>oYhn+U$JOWgwj-=SlQV!5wR+Og~FT!8q9ifRt-$+R8S`;uy9>+IqnLgl1}W z)csCo81hpS8v}#?dFG;_;Eu5~-U4dp6YYw9YGzo9&AT+zxMpKwpqS)wLGr9yZ-l(3 zb?@Fh>o*h|@9EGRr!M#Fi;DO4I1<%BJUqvwuZ9)F^>OnPqu>dUdI+2|MXSOHy(~WR z;d|Aj(lt2W1P4H;SIbFZP�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�K#J zX@V?)ift@hGdX!%VGv>B3;`8J;SZ(^!#_(<BFv$5WYMmhSNLXJ05>ul{w3J?`N<|} zik{Okk~8b?@!zly*MU}={{}4EMv-sqk^NLlihgPK>%whAC?a|K2SQ%H+qF@ITq{ns z%Qf{|LB@$D%6uwZ;{s(`y&5^r72c4`0p9<zEsZk178byve0m6}K`WMaT%$ZkejZ}; zU^=5E(G<KA1a-5Q>og>=L^#}g6OS&ejC2|}=pWhzvs+teJ2cNrA`Z71ylvVyby`7{ z*qOsMkR8I7ic_?k>%sARF^|j4DXQ^YbXXh{j2gQP`-9w|`6(=zG-8S=5o!#1klQlU zgebwPR7^c~P=y0#X3BoUkhpRpG#Zk<dx}7kA#<0eq0~;bd7HCvyQ%iWwe{8A177;O zgXbsxLzo`j(0tE<5DP2P-(D6}{f1~9cG2(SxnB3;ne+{NadCPwKX`WZ^_O3NGx5Wy zMDx|BLygj&{c;YseY{$3Te9I86r2yLhTMB>K2pDRV%SsC^y2V?-YXiHoJ1?eC>afl z9`WjF=gmXZ{NKd|yYf2pZyXUA*r)K++S&Q##g8Brx#IH^zV{ey+dG~#7;MNsZ#}el zHQ?bscsp=$F|153u5IlbRNTZXZOQCy13yD_oa0ZJ?m=kt$~x5`A4zNbD-+x1zU7VV z(W4(XBsCvbA4E48<=|+tfg<zU7LWru=;qezY#GJ9Kr)~hwCtKY>t4*O;d#D$HqXTP zIT+*6eC~1}moxUF`xFbA1N^fB|19BeL`%f6R8q1#VKmEOY4G<~k#g2W-tpP<_6gLY zlkwP5bTHIb@xh*s1G=-UP1RRl6fHemh9bIZN*MnTn6X97$|6RiXj9j_&gJ47_th7p zsRz08AW|e3zG*)L%~B1{k(4dSEaQH@bbt*ddA>e+KA)(q?^Wn^IaCWddCP9c(j2R} zN!a`qtO{XmH;eAGXJjZ?r*zR`ITJ8ca9oC4jM<fJ5r8T=vATj_%MPsF59A8dIst{z zV0aMuw1}yy|4xwG^raXCo4!PSxgpMJm@XlCGm?{wLCS#2&B0OG6C)WnQ9Iic=9MhG zOj(zQD0>jElBqF$sxkxM<IM?LRT-D|d2V_}W-^xqn`EyIOG;~+bP>5&dX13l86T&e z)>2e5Tcp`4Fh<HHEZ7OJ>W1=^MkQnf1SOX7exPKhaWqJ>(i+TS-F3Ip+D(WU)qzSU zJ6%hH3AOapOpG><5+%2^gngnI43TJ+hZ99F?nXjd*z5{r*t(eE9O!`O#1A^cexx+d zG@e*MSfFArK1-U(p7)2cxgr5X;Hq+#Fe)xel=NBhX|f_6Q_+|QQHu^YuESF0Oh7); zu|S2Apx7lyOpWRX(8@#h*et7|r#njW`6S8rZcWc44dd(>ksE)z`CV)7_II~#em6Cb zyC&UuK9ihSWR`b_6%)Vf=>|wdVug0>i3IBSu%T2?LJr!Ro}HCqyOPk}9X?rnnz}R6 zRm<b4h0bvjcd7!LO&1~J(WyW)j;E7X*ho45O}?sO_{p~<O_Z1|$%EwUI;Nj|4H6`= z@zi0p<wewPj8US=<zNAfc!#k-sexBt#07Q-6$*qg4U;kW6TdN&Q(s69H?E5)d&~Zg zP%u33#yURY5VON0E=l?titT9N2jU@RwK`w2$bef;Ddi{>Fhb~qcnypM2sGV8i@MMj zO$B7Lc;HnVWsT9?Czg>3!?#c%0bNX?%)`G4+Yu{&L^ug+Tr#?*LxpCgKjsm$`LVth z2eSq9{;s#g+1Z=r(aKcy8O}M8{#kJ+(x@PaL+DnN@S^oVG}SrmrZO!>W`ZV;BQizC zYLuRQY;5rkAVDZeECKk9wnT~Yl5SFlU*3@E%VU1E>Jl6qKPeB`#>+9LIP7=225dh; zp7r-^W!ciom;@s6P8o?@JZga$Pxt#}S&c)Ll)&?=BB9Q<HWF8Q3P+tqS-;krt(-q> zb-L+d!)Do#nl4(hvGRQ5#wweLC`s71C))>!C!4EMX4ncgoDlkLkkD#}IZG`05Ih|~ zH@?FcK;K^^yGPhRLDf<yexAkuB$UoP?!i4V1SdhAxTg&=sdi0T^~SdoS|u=zipdDi zVxW<(ZQOkDtZ|rJtXf5#21RTHo+$&a2`(S10-JvkLK||TO-~<XiWmKv@;4EL*RUC) zV?2Gb@bngRu<BlguPtdq_;xw_UtI6?`nu5EHZDy8AktDoC*u!O!*VhO$JCu+<-8FA zpxqQfkL5z#J=T#UhMI<qq$np+N4z?rC=ZHSi-8ohAxe`JG-QM5D`2&(1*B*!jiNs4 zWI0Im!3L2W@ecv@b3BS&rIWT2ifO`!@cmx`_m|uZ<7uK(guRG}gKR<VT)`Xy(r~AT zRBcJl1nmhTXheOGM+knDsDg8OiZ=zVukCwgmxuf`L~+jMD2QG`v1nwY93mVP!OU?Y z6jDv>cPht3oCb-KXmH_<z{ySNOC?LVm*&uL+?;>#v&gIC6B3JA+7J4=?u#ndJr-pd z4mj*B5rSB%$J^^$Xb+0sLTwb^q4C%D-AEw01yl|lXB~|x*{>W&+>d~t23$M@igXo~ z%49hvA{GFPOvpX!A{qOp&Rn|Q(%>F!fPn%diG&T&cQ>NVD&G}_<2~@bwz<~cUHi|g zBfPZ8jpcvHw#iV1R6Q#%D`+mnsazGR;ca2n$&KRL*ZXj5XX70fJTab~+YIZ;d+UdB zls$^Yl|+zWITsY8PXg2x+y}}P0!s&h59mcO-Hb+_(0mHYQXxvNl9+(n1K)(OgUMt> z@<JjY6cGty;F8k3K#?S7qA5{oC0)zFNC=P$Bdn09<}TAjSwOxcC$>u3!r^nu<@2?} zmv78`EHV@QZ4^nkCTuECP7kgLVHp+!A6I}2kXC5iM-;&c+d1o<O@do{r>=oQvt_A9 zxo+m_5fme2XW;hdBcMDZ2%OKNzFe{;To$qA%Cx))gGxnh=7VJS?8zHJ<);xV{L8X- zb(<w!v4xOaLajqX5zMBy8j~ex|3YX3Eamx<=LL1(;ODJr&cT<28ix54c3XKu=$>LG zdn^td7hxR5H%K38*y)BVf`H}9t}aBc5jhovownIzL%HmnNaf_jLX0rXi2)3c>cF_p zPv<5&j)Td~NLIU{zSd|+ix??yZ3RE^bTr_mq*juDJrw>1h_DB~Q8_~NR$HdrC)`%N zlkBOW;|TU0DE@M>gdPCxZ81k1Z;m!^w)N$8Iv(QV@%y;)$ivB6ki;f^%fOR*r<bP? z_2MQ(I2rwB_+Ax_B)pJN+cimneiHePu=3Q_Up;}70jc=-K~m@U2YT{swgs3;r=O;` zKOQmIi;KUZ!gJl)X^Lr0^>APo|Kc}12fg?7)?bRL-e;dxk!~#jR~SI2kOZhAUP)iX zNa%nVAIDZg4b6BOpEr1)@CaAfCLiF>KCC#xZLqS0X7tN2hOSwb|70Iq8QyqW2C+8e zg<}!+gll55CzYk((#x8S%&u2(eE~I3)~%QGG`}(m36W|!27gL>t?RBrk*z)GiZX!g zd@W^7^(v$l0gz3O@78XvFEaAx2ubY@_zQusYTpd-H=Ugi9VcWd+iRX)+n8lsN!8xX z3$BURwp7f_tN3bBYAeizJWGbs!_YiLoWbtS?APG25-?N_&_Q*VB8N^QYGMwkjNy~m zvuW9?%Im)fz7zLy5(l-@eU6g)2v$O!!amX#;V?o9&`AhVQweQKFs@;E2*G}GYGxRl zboNp_^Y>nMPcF}TFU3j>pVQGxnv9t)BbB*X+Dv0;Ecog2T+Qghv61uJeWNrH!dnuo zkjRl7N>8ym!|hRZ^+WlAl3ps5i~~45|6i>q|JAzn*Sq&-{<5@>pPT#p^ZWZx_V=HD z_qSjEwZH#nVPO{ky|aM-eEsk#_~jD5)V~+LeR}(|R_nX$6Zw9TZ+*Rr|9m3@Jd}5D ze|D?<HvSqs{qD2<{j>Q~YoUw{&{YWb{;F%4(SM#iy&LK_c>snfM>#tgHB8eWn@~rF z>+os}R!D{!mkuK;EEPZy#FyrHDGLZM?UqkO<!ze&!Yj6Q9<N{%g5i~B$eyaf*RK(6 zt`TN0<zPufZHaO?soJE1PpuRRkpX3SRIWb`(Wf(8xlEC(PPs0LV^AsNp34|v&7v`j z=~rb`t)|E)6ES92yBZPALli;Lu>r{cHH84se0o0XKl~o_5}W}1JIVlmivLE*;-A(^ z2>()5{XmLw0$oFOj_UYGP6kC|i1b#Ym)Gj+#FS}ydIQztRX!O{bjYfbSAlw8Hl>ZK zLC;}!Pe&ZO`Z#I=$Yn)9jV8poE>TqhO7zvotr@QdaoM;u8`cTxu<G>rdW>Ng1oLIY z$Eo9Qwy5lMm1r#cE{<vMlBICM$XayxJX(YIz%plPs)$t&lulefHtqKL;NB4;=K-X> zguvNX2?3@wd(_XHA4pe|xD62*2};4;hb-{$Hx^FDft6w7lioBPIUr?pl&}uBKjDh6 z`Ls6rC~N@Jk0hhDvF4bq)P&lov0}ERo@HU$zbNYlMH*D&&vKP3;A$kp)bD6mgL<v< zO`M3^Obnbe8hYQ-(={3QfLG3h!bA&_@S;)3+-KEOTC{Md=e1rT$`LXWdpr+H0>SC0 zoIKmUM7Hq&G{`n5Jq3hg$G(3#hgUH(ktDo|1RO8<;sLCcbQ4RsIL<^gb~Q;R8O|w% zHSuq3M&wbH2$eS{q)p*#y7!qPlJ2S!E+tH|{4sniS-CxlJXT>l^^2;gOeR*dm$9zw zlltMDebfW(pkOp&uTGv$HVq{kM~E15ycv|E&ODC_Lan>UALcAZnBuNEbn&c~=dM$g za@GPHdNjru?SM1NZ-LpF#^i=-g&>#tb-W^DK@*=cw<C=|J{3w!ky3{=Cxs@F{hpKx z9zGFCC+ea@JOPnm_rwd8i%1_r@ik66<4(yi6WyakZg9v{Z{pt{PFd2~QZ<t&-xrzT z>8j;S|8k?LvR%dIR7v%2G*_YM#nDAp9`H&JkGF{F6fC;4AL>4hnZh5IniK#~luYKw zHJ0_0H#StMMWrc8l$&G{e+8u+#yk$y{avaV=9RK0#g~#ei)PgoB~e(L3ZaJd#d})k zc8^{TwIt#f{fsf2TC$&INg0+awe4Zm!zCa2;dqcW!ZZ;PU!QgcXc}ZMBX_KWbP%R8 zg1S$-FcC3((Ce>xMYdmrjfSKcsSN15$%7HTp{eunz+$t*r`4;6)CN-K7@o4^E0rL0 zIH`g-{TL-VW|yDCoG%?sQ1F4VQIEFg(bZdrfI&(ClpIVH*9#Smuy(7A5DGA|oDvO` z);3V+OYE4a&8F?V5%`K`^8+7|_|2*#p4%89q0<J_8Vr@<!C57?LoIWM1v1npIaCI= zXUt+Xc+<deXc7uwQyf748f9qDd9V<r-5ESbz8}i~(oe*83n(-2ie+(-0ncmVQZ`%} zG`Q2mrpn}2ywBoD=$yzwkS+YIc(pk9<=lcpGBtJ`6O~ItRkfO0YeWu<q?!B-+Y1P- zlV3fc7PWq5NSi^JwCbBfTC-<s)xv*(UMv22IviXBECvW_?Vnt7H)o2y^<BniLmgyM zOqkqJ_XJm=p|wA{%|_mDm?lSRg>&=bXbzzsEHTJ}febU~9rajNk`-`p%&q327w_PX z!b<Pknbg7zoNY`|OD&4|X;=$f1X}*~)@U+g;E%07Jp(y|wYql>Ao<KR>S!txSiJM~ z+yee@aXO$w9=JF<mj{%0r0>ethbUfu(YGPKy)(D?)i-mC7-eZ;I(_z5Ht31Y+At{4 z-+T79ectU3WaMYa!S*Iqw>ho+Oec@EspQ9JOH=zFuIt9U-|;6dVm6$d8hWho5Rgk? zAqS<SV9AFkD9m^eiILtPbOy(3kSFFqa<GNi=>37y9e!-S3Ez>{=Axg8!k^5Eiek~1 z0-<xIDwmz&fJgrzjg7l4`N|k47DnYboaTwAHFKt?El+TN4h{425b4RM^8?BYWG2rG zL|PM;4~HyYP2ATDM^e@lYt!1H)=V2GYZ|<eh4bW;z3yOrSW$A)2vo;0kry5fXsG0| z$|)Cy_v?xujc^EmT?ee;ucY3j&vP$%z4UC&U|CU3sf9i)_M7w%*(vYc8H9^XTq>to z??)*ebWJ5C=AFCCK)>j4I3r;0!`GejOp1--_u*Au5t2%l0oCAfC6rj3%D{eL`4Bln zgNK$ZO<%2UhP<y!@K^Io$ds%B7kNHrQo&e&e1yfvW14-R;!DPf-^WY0T!-S5X>{l( zapXzYQGQ*P=EpThUcS;vD(O$JdROI}qt$_%5)*#2P8q;guGhH6M}$U<1iT9P-z~|W zFD>D&8gwZ<Z>G&ec{LR*xtt)slT~gfsAh|6HfJ+FtFR<`D954OTlLKESN9;=Mc1^$ zWB-slgEjeI&fz7@zcqC^I6+l9aJjRj^4j=2Vp<N&PS<UrK={$yC^>Z=JQB#gRGn2O zlpA>zJH@}!qGO@r8f*NxaZiWs9=+%n)2plkv{XnGTvx`kD;Y}Z&9MYUdv$Bw==pXL zYU<P}x$H3}C6u2eh_n7`V7DDuth-NJb93|d`*40?(Q0$gV$)|0)htI5n7pIdxaClC z>kFb-P{YE3Dwab1C}-2|u@>nMGE%dnSG6eanN`59m4Q=NOTLb-^Ga$ZIJvVKM5=nn zt<g3YTl7Zf?ftIaIdRQtO#_28>&w6n`ea1QGBa1CT1Kq39Mi<B%$t7jB>jU=gfgg1 zkygcw#ol^HQc-07pF^aKrSCi~sb>5-R7qqh9>o!^P9Nsr$b83LmJS(xh@$@WJ2*wM zlYigc+8lj`zVI`|ZJgy&Yfq4<k6O}|#sxX3(6i8@5O)pJ23h-^#pxdHZOFMgl@fJh zt_4!X?r%kjM5ZyIYSq)rAPN*hOo?Hd+UD#2Kzp4|qZknmV;~og8w|I{$X>6XP~XhH ze*JnDEaY?+XH5%t9tTiJ>1E2LqS`*Z?42C9Ar}USb}W-`;FORMwq##<x&g0yh}g=i z8l$jaN8`C@=wOe7q_%OWn(Ct|J7e%9)oENXpZEEiv6E0p3~IUZ%!9c?FSJyKFQu79 zP<inLs(MylZymtOQD^-+z=ai5B8zZ6o?R~ZbK3?V)%lvmj(FikOHAqJl&Ioz521O> zN0R`zQ3$~ugN2!`KU9AVv6_WAnsAio?(e-A^e>;k(7%HEaobc96n)&oHGa@SiR@Im zN_9YJpe3vJZNY<lrahu>zCe?_egT3%ISws{Qd#P2%?LdaE0wa-ED1Ng2vZt_gv>sI z@XE4NpsV>0XVZ@-7pgVG$VV=*d|@RBer=#CT}XK4n&h*vj0BTG5r_iXP>2r@EG_f@ zqEKKh?mOVUHx%E^g|*e`)>(Y*<&7DmX+BzAe&A=<FyM%2QZ-5TA5hmU>zI$^j3HFy zcOW23#PoYo1;dV9vo1*DcvoeRCF8G1Smz8W{!<-9TZ7*Nwg0I#NXA3=_~1{if!bBP zfxCc6v<5l3iLm=qZE)YlRj>8R1QS$#5WPVfdgRyqD=7|W4RTfXet8Xd{R?=j=ii*3 zjJPRH;p^GEo#8(=)-8q?)caws_Z|gT)>(dsb}{Z2@G<&6|7Ez(UtY`tiDPf`e_kg4 zyiAT13pnu!C;L+<yt7a!Bl3fY1Znm39yiGctLv+Kt5=i>$A}@iKvoP)0DnjhUA|H_ zS~dR9w2&m5-+Xa>ZySlyW#t+>sj|}<9QNP>9K0<>fVr>7RpC9DLQ&kox*)NoDjfX` z9Sbf!w~xXCjv|w42c-eEbJ%|sgKGRK>wp&9`_9@YFuT$1WR5J2XgCnZC4z50#V^63 zVHWosjsrM&f=xGH#<I8|J15f4lx4MHZq;BU4_=Un1rH5MW8$o7n*<a&Rv7WY7ihz> z@5fn5HP$T{yjs&++k0zUo4dAue@G_rA#dVRH%%kEnr->oR*8X)p>?5CPVo@bh;7!I zX->X03=8RqhA566>#_z<L*`&WlR$S^xbSexy7?G<RHNw2p?0!`@g6z3j8yXnIBn75 zbWVZd8f4UCzc`RK7&G|yv3JAR<~8V`;_|JyE38Y)Rs9qWMCPuzx}U-as&iM2cicEO zrStFb{}4ZgZF$REReoeO(@3!>35CD{yK~Ry3h>!^8c^rOo62ZQ-^ObY`q@wxYS5@Z zsHbXJ6tT5JI5hTMHlq6OMte+Tx{?f#1Bg%~`VX%?;K8>X=_<(aJ9g`ZuHBs<@8Vox zcFC56L=P>7bUHXDCBncu4nX)A44EG$gUDfdKNUmbn^>0`Vwg-WfP|gXAe_)1T?;6a zJyD|wUvoE{=zM$sT@{sLwS#gaDyX1QC<zSJ6RgYk6%qxnU-VJbwS)-7x8W^>xTCuj z8sKSfo4L?~37HI{vq6Ibrcrmxt3KV9eSixU)l1;4Mvz125OE8y;aL?;Y<P+qDDVRN zWR+<CwX<T_M~WoM8DC0_3PQ7c7wF8?K{V_IG_9g{-0gU%Yr4-6UV}cCJ%jb2{f;kC z#HmcH4G!6!M%~$nKz-RgmkvL=)N-V3qK08QAI`PZdPO&-!dfDPcmIM)UO4W={}AEI z${H>8saW1#n?YN#iy|~5)LpAmEH=tP^F?3=Sv1hWYOR##Ih}KROE^Iag2adP0$_HQ zsFEX{r9XI$ral}Ax~V+L@I-jxizjdsOTq~DNZs;;esrj?9?qaiC|N1dP+f1a>0&4_ zdn*zPDLNva%2<Vdn%uC)iWEYe{WNszTGeE6^MkL}899UVpRxe4HEjQ_&nH2ll?X(I zIYhoi*Y2oMWLNg})%^xfei+Fqhyz+c1ba_%pK+52!N*p6E{jj(OA@1~rKw75teU&B zDZII1oMS{JWSHrS(U5#^EF{t&vb5T!bxuEdu(i4Rl%be;++}&D-$RIJV{FhQC-hUW za0x8Z1KV?hT(~upH;}nJ@dp^$q~aF$>+m5$M)kv6A_OFJ>bQ&M<tH)S#)D0T-yj-f zC^=<dm9t04daIoCKW}*w?`)zSBIVCpUJ-)Q{@AxXW%?rHN)b;Q=Nuw}*SlxWFJ5R& z@byNh{dwJ^WraT<{kj+TzTuYjVQzeA*oxK&*L&exK@G&`ro4L1SxeHS1}#cy@w$Vy zC%DN`ZS=fhQ}rq$<7dm=bT&c36|_v4pK%kXhO0?*P>4H{LF`jX0^4NvSZaTkzKb^B zxGpm&6`{W^<U%e4rK_lh9_J9^&Vx>}#et+e9uPFNdclPXc5rCO2H6mIiZfNrDJeq) zx1&Ka32{k7rm7`Y16gcE^`46npx$LQBo<lBpgW6JFI-NDPF6(WigtF4+TE}VQO>)1 zDwaX25@N{Io}vf#YFpD~+lCah?6pRiEg$=<h2gl&*_d-(zkfpJLBXx=U(BrWy@3|w zzgBf0dNXjxvj^g$ZN0wi&He>K^RdIo3KeB5WZ+|T1NoNZ3ZRMo>FMQ#pj4ATae1EW z&Ixt+aK@c+X;YO!LuX0uw-IiQf~)nzdy*;XnPB*EnuqCY&@@lABOmA16tm=!rjhw7 z{X?egMIY^+1@fY+$us+`J`plKRz64`6byqnD*YKrv3L>+vx850dX;c!Ca(DtlB{Uk zi!WpOtM~{9QNnK?Wp;7o7=JAmMu1=)QVCnkz$-^L*BIbz2_noLSdWUVgfu&2ebImI z0_wPj>pq+Va>8I2@m6j54(1Gs<mkLPveH4<#{<XGq27_#Jd~DkJ3e0P%TfGhPpllO z7Ry4)i5pnfp!-j)O9~4SS!T-r1JF*2Fm!lD^Jo}y*#W=Ig7Gj8DPtMK6<GxS?Bj%i z(W72UxWhPgd`<X>(!^(rjLS3LuGPAMBx12G(X-_XgDCd<ol(#kD2v`)6eCVeaU|-H zBw4nP{GI~Wb0Tk+!b;oJKPZnKA0m)_Kg3`rav9$XZ5ob%vi=DSk<L%U>!?l<@F{7= zxP$v>uz$rlNx!Hkps9RxQk$JyT@=?uVPz@raC~?wD<M?*(z{ZX6lt7xL`^$iWRPxZ z+!|qcy7m;@CK4N=8aZ`U)C9GjnwBH_Ya|gSs%f_dP|o5)pt0dKQOD#8k%K>k&Juoa zREhkF%3_@W{~dIqun1R0Cs2!EVnd_3veff6-@A%#^sqbz`p}g>$aST$Dn|Ccsv6mc zNyBlJI|b?Oxa3yHASw}3`KtnhVy!F`fr5k;I8EX=YB3PyV1($P3W+qlJfg?r+2x5V zHpUWh{kgbAZ7(DiqZH5=Z{CQN@yj=FZUvRcb%Sv#PqQ@85hx8p<tpdN;R+*4JcE2X z1);#L6+lGRoxqvh>hMe=J)9(Jgov%!JxQp@Bgx((qY5#%vkKL*bPIh)F0dnNlvE_x zF`?7?E#*Y1KG?g;id`X*6{emuS<`n;N-e;D0#D}livjM}zl+?ucaR?mX;rvtRfI%Z zRzX~Mj^IP23KHo!P$dmF*GO9>DdUrT92KOIqsRs0>Ke(1q%yhgc12}mO*%+?bpmEJ zA9X8(wiE86x2c}X50rfFdihu>>u|O*ZuuN1oFUr7v}Q?Q7x5maQ#M`<-UVSCvRpVi zuI*h^IT_FCE;<rx40!(zYRTl<NHNtv?7rPqp-Rr^IJlA~QYS6)fv>EMWPqtQl6~lk zexvF@?j_xWm`N`tW!NiRq@rFY;!kiv!<W>mbG<;r9w|$o^`1)=$1oPcv*kKy0$T=6 z2Qw>+W7Fd_ju~q6tT#Z{9R-4_gxntkEEtMFtIZ9Ki&)K2*WiNzS_{(|UY?)#*%dJk z7REu^+zWh;0BqPKs1ixE;{j^^9B8FOU#&_8m_kqm4OYm@lg>cPkWj~xSdE?4-97wq zi%}miHJ_Z|e#=Y0G&_P3;2iZXVsu-J*hC*ke1F25D=TNRBoy=^Epif&=n(kAU~R1_ z<y0}X-=~P4X8Dh$`T5Q{te;xYNNUx+`g}f=xC&)U!0lv1+<epgE=Xh$G`X_;kwPlN zX}7if@BjI~B8RKmiL2uKK#TGPY80A5aZnbJWf2UI55e}s3hYrqjvG}d{pEL*yn;C? z*EYh!y?k_pdN3f&6GSYRs9a<81BKbC0r+lIp8#@kRh;#u&MwFSb*M-n3^K4I1DbUU z9?Z}*o--Z`;5a5ibaPHVm3RRyuZCFcgQoI)2VS*Bj+@VLFhx8+9-xGx*G;4ColtjJ zRIztVj*(A)ErJ2&9$JfJqi!9T>)+veUwghW6(^!%^ko&H9l*NPuQY_foslpkV!>g% zSG~Cw_hbWx@LdVgmaPU|&`V0lhd)h`o})TUna;*mZ*(9mEfHOy62+K7)9g=>$9$$- zB>8y<$Ej@vBiffkNoRvrKKw;zH7&;nnY|mH%$yE<(C^}QauRPs7_4?6@CnrCMnsw7 z$~h25Byi};c;;OhZR7xk+;Vo&UhY(GKNcxKPKbyo;ilki(%Z2zvAp_-mC3BJaix)^ zo-}f?#!8s2Y2uzFQ=DEx{=ru7I~y1_mQnSHlu$HM(2F(;Q7aAC3fA<cp;efYGZ#?- zDAd@e4<)vSymG@J<5%zeP%q;#iepJiDxSCiv1nT{bcqTOvXP>nQ`4Oi#^rOc7&Jkh zUz}SsK@RT1Sz^Le{Zd}P=pDWA6DMWEu-aFMmPNoO;-ayR!_Lu53FDk4bA@(u*gNT6 zAUc;WJu3uibB8+AR{waeK(Z4qLx`>gERfz>6TLvH7i*t$zaXc;tRc9Pyo)38;p3I) z#Lc%LN2=*no<WriMkz-`WRS8@b7@nrC#kBUS!|a(Jhf0{eIXEM&?e&f$o(&4bb@P< z5E0GS?B(U@&G9^uh(H_GGT!uB=^w^}C}9^f;rO%J7H+UNaSU$KOom?;ZaQ_pi#)M+ zo4J3!zd7K!K*)KjFX=~REtaFHWCA9Ng|G^kx}d|Qo9rGxkwrF%!`8HYQ;)wfhzoRz zxgryFT5S?({{86gX4$%<w5k<jBYCttD<sX1j5wxhP_Z*3)SrnO2_kSa_-zt3?uWDx z5een(v5gCA`$-SwDpfixepPJr?n{+JFmpfArOh?JJH;MkUrH1{m59|ax?c)%QIcP? zC_H?$7_D&l_JUDneS`TOZ%;c$o%b)F;Z}`EuRCAB!N`AH4Vyqj#3=Ym5`d2%(g31) zEijYY!b@<UEn`#E8{SVeoS|6c1~}sR$~d3=Owzy1hZeQ(KH?mI7xr)n&m=&~VbtoH zmN|pwhqB3e(vMg%kirsFCy$bIb?)-)qIZHEB)mT8oDH$Nyo8jmr(R`KVj~zoGk`AS zDDFIC+EOQk-}%581%{JnC^6bSPV_4{j}Ue*l|NJZ_t9)Q!XiPmP*o9Z0kh0=%#kj< z2cpId9vII3M~n{&$>PF{`FyxF#C0LSAa=HJE$hjF!5KqJ!<{p#wzvmsNm7-LAbGJ| zNE%)MhY=6ZFtf}Z`H)xmz~q61#Ju1TrbuwUBCB^pCU^D>Y9|gJB5|P92cRMZzFr^n z_pNQIeb3i7`X(+OW8-SO$cXY4-mANF$D46=bM3`u1!<?u;-->GbKS^AKle^UV6%+T z<XyGhCLc7~ZIO<PW8}w2!(24lO0o-i5^$sP2P*Nu6Iu{86seUqMuPgbyt1(xw5SPK z`FL$VVOZ3zZ8^fMQR8CpdH{(jCN}*BCRjx6_WGAY+_yj)a(sNVDcK~8keyG87UPX( zVKVHVA&n9?>|1jvJdmSD#it#2T&-*xA2OzW!a{ojuR8BuZ^d$(+{p-t+?W%CcYfB& z3EY<M>(gXkO8jW}&dBJ#mbtKxn+eo*&SroUS4PWe)3sV&@FIPJ5tUzeu?_j?Z_M7c zC>wne{U{Y@bsZ`F1dKLN>>$M!E(RJ>JxsYw-j!W{)$2HVxam(0$XX5Zlt1%hg)XF7 z`g;?egNTvzC^%ZK_XtqUlQeaWF6;;^7m9PTgi`_L4I~oN_F&Xciu6U<>nS?aM(Nd` zW+)cO9*ioM3L`5or{N=I6sbrIUtW<UBNB~PMo?p|SrJVyihEGd4EkS%-M_>^L>D<x z_wXMaKq@e3STBaVHohLh3h2dQ%0vt2%dnWjBSCGnVR)ZqXJ;~xBXqIgGdM#=MA96x z61dD)t)XVabWb?UQ>Pl6ivJt}=9lrZ$dBU9H2yZ(Ir5NZITG4ziGgPJ+bt?3V05`^ zzb6OC$pFvW8g9YD%cfr7bA6^y51B22{%<y%Fg(uWSqd;zIDLp|F6n`SSWwIY?&|MC zMeCk2<w3ICVd0Q827mpDye}mo-awVnDhrya33nF!Uvp>Oi}};e8AA8xyJz$E<Qy%v zQh$)n5+BSuNb#8gxIeC6U>-a(Sbz%yI_+AP#n~G;6B?H&fh)#w7ve}9cs|_}q?qBd zVmsR^)r;^qxaZSp=sHd2Gt#IC7JPEBJxiQHdV}hzrB}1)Gf^ZMD^eOl1z!k6gO$2& zD5xLd5gBI@1>~_zDog}qvQaVzbUi?I{_uLBf*vaaNraUE6>$%y1^}zNT)swEsi2=% zy^*^ZLi@qkUhwGnuP|A`ux;`DqW9bH;3JXLV*W2431C;lJ9E|G_pOHenH{ZwTSXOn z*a>uu`duRK@J>|EYiX|Gxmtp<XH8ie^j^W&9y9qleCbRg)I*QxRpnC@GYQv=s#Wq~ z`5qAFiy~k$R$ms+WFd7wmi-torcK;T1E_m}pRp=Z_J(e5(+e&gLr_2oxY6Z+!bG-g zn4j4<H`sT^RzlAA)VRRtVmn5xD%4{aSVlZbHKMxS3RDbCQ+BVVw>8Uk2yjf?IT#J| zy2}P8!6|*%rI~`VheJf)uwj;%2hqTLxwHfc$;60k${7iR5cejY4g3u6M_nQ4K?ZGE z@o~L}EjdgF%yYQ>V)IDaD6GEe4Po{1jIT(j1Uk%B(zy(;s$=ONKU6g>zF*O{!qeCa z(az{Yu2s1B`cxCBlz(MN`8a=S6fS-o(O3OTTpYDi<r~j;O;yCTh$<g>fZV^z(8THD zZ+`IgHdbO84DV?1dc33I&#i{EW}{#Hql08l38$BT-MGGP;;ZPu34i&SwFO^=g&TIh zG2OBG(#1MD+wJo|S9&;bhB0qFf-cAo;%jHU$FN*Z`1D5a`1qs??{IhL68#&;t-~kT zb^G70^vRuMvN+TJI^6;*{j;OX0Rqu3Y>$WWi7Sp5ps|tOc_4eA_H8xjU&lz>odLY* z6OUvKdlj+C=1UvI+q_m32Rp32v@e^%|LC&^c74I6+6=;>J$JaVgbW4T4%jRhu@J}r z)@m+iXi-jQFH<RaVV1jPctLI`13isU=U@l8UHrs!N{Qf;kS&iKRxb_Bvxi+g;1#7< z&<jd6Y<9h~SN)gj)VCO`+pf&&<q9@!_la0Agw0&}TA~l!!p|&C@iq}S3LUHxvS0gd zbCn+Pp#bo2O==c|5gjnfcsvI+S|M(4d<Yfkw)NH(lz|oF6(&&Q6?M&}@8~DD{0;c) zl;7btD#&wl%xy4G>>>E3^1GUy9o45&_udFMkPE#;vJJwpZ<9^i^!Y5-P7<}E6kv3g z(Z~5pLTCANOG~?Z%X^P^+gm@N^gw(?G>y_A94J&DiTwzrN5T0?r^il&@qIRlj(^>J zB)z$QVsEZb_RkOrpx@E3V9hq{Y9lyZr8%UQWMO9-vQ;~MBb^hJ9_AszRThGV4oX-( zK`$Kh$@cEf?AOIXJzkUE-Dph5tM@Fzfam&y=kw>o0snvY>-kSVzq2@tU%9O|tx}Th zNiWn>lC@I%mwQ;eo;TAVirIC}=~trlH7%&*XHrlA^ON?Qvs0^Edu1FrO$4%<aQUBS ztM}tE(ZUthx|1|+>3eh=s|n|#^AZLeM0x7<21XoY%q9(=uhM}VOp#V0@)H<@5KqMp zwQ|#Dx`o-8%s2!9Ch5NY!8&hKJ^%($z=~_>x_#RML~EArB!@C22o45K!rX>*qX94k z4Z3?qAwn{xnL8ZHMDVCr{~(oMj3vXZO5BMIF1xtEiPiuDY$h!@f^!<)Sg}I+Q@zAY zXtl0wxz-Ia79R;y=C%@t-0>#|x|Y^0Ru0$SZ@JML5)NT@M}yuWK(w@|aELjQQLN<j z(UW|NcuADFWP~#@a~j>Rx>67sc8~7ey7l#sUUn~(FHN{Oc|&=RNH4&c?G)V8WWi*{ zD!%n;ZP!R>-bGwZiN4Vt2$$wcrWD&H8Rxr}tg1DQLOJ}urEeC#(I7jMj<a`d8*C)y z|6<b;#vg21<M)i#E6`5T^by9i0W7_+`_}Y8{&I0vzn+yhW~EJ}*jzbG6Bo{-WJ*M? zj&IewV4(0yogP{c&kDIWXL02R+m{sktW~ALv$h36k79O)B<^v*FqMyN7g*72{4+5O zRJ1tL$4<M5i3l>&UP+m@X&=fBg@fube%rrfz=G?DsP~g7d#<1fYGD+9E08i`6$eI? zHI>dSidKZzib#i-Q<xr9R}Fg|b`V5pMgYWG^amX7n}z?d!nkw^Ame~&r%uQNhl8F3 zNuauvRJm0jDZW4H9ZGKlb%=5_tb%q9F?rzkg0<g)VdQAoH^*%E>I`yAGba0(XCN9Z zi@Y*kh#WHPMXF&VhQs$7jur-@;9X#&bH>@h8BI@D)nznJeXFF55LTlSQsZJc8j8}N z^x@$}M7q@GfpbFQwv-XQ>Las(di14qpuOn#5vvI;D-dF2DIAP~SMVviN$2<#`Lzrn z=~7bKmnHOxC&vY@1=J8knfBm^XE2Kyq6c8Ybb<8FdI{Sz^(%9X;2C8647%zRAtOcC zYe*kvBHebHz<Ix5^)PYL03rBa2TKNPR=-U69t#Qh3J{VEWu-5=@SNDkyg0ZgSA=iM zH~F-pt1XBv7Vmts!4KK|v<(+TTjE;2*`Vj)2oM8d*sQO<_yG^`Ijxq}md9C~wGAH{ zvtNou85#rh&dx6{+GpJ%*VR6Ous*^2<!|9l93nDp0Wsb(Dk6}&?Mv)^2j$OXB>h7m z;+F!|9f6cUmY%=EQPim*gRPz6jC-n>3HH+RVr4EPE|wumC<$A@Tjz-=;ptIOjU8r0 z<sV9l;07-MVRDQpUY)Iwb173GkfKvisN&ej+&nb!Vd?RvTUoe2-DY;GNDhpwN=}3g zEo1}`%yPkOsG;WO*(j%A9p{Kj!<j{h7Wo%X4m24Xv2)tTc_yJLMG!#Y3$I}W2F%c) zG=Hyn(R)sI5hgoIOL7y#AWhZtNTWhE91MhW0Llsdq+$LX_MY>aZUf3Y@h&c*YZ^@^ z@1=FWIo=vdF9*bGBq13l<`i6Vpfci}hZmR?CsFgb?B>q_OUz61599d4;t|u8ZX{O( z_~r`Ac(o@ROLto+ag=Zu>@)*u21tQWK<&6YH!jQOaKJ^JUZC(fxkkqIgqa~{<P6;V z<QaF5?2D^8NDuab=mU|ppI)9^^r-8FO*AFTsVNEnOW2AfmN-9gZpCR2$U2Y$)_D_m z&|r2-1Ns8E0^wI*;0-D&R|Slg9Rw3WRD*|eJ`N{nQZ`1h8CC}J1mX@D`Fc<?1X&ay zAJ&8!m(0E&YbeDICVYAhXS-NnBsm8NcG3m6(}MC{C3q1`B0u0nhoI~QhRq=h9nS+G zQ@IWR84u|vEaD^FPEy7rXI&`L4{!Rd2AQ^`iG?x?@<)`u5`GGu1P6y}u!I%@hFQ22 zqe`6}Oz*#eTX~YEF)vat27%-S-ZL+7jg4Hx_P|3ygC-hwBqlH+ju)XbB~mTET)YFa zFe8GRwx|K0pY)D;7hqgEd>HJAJrbPLhdV@a&U|+xQhlG}B?qHf(ln@n7%8d6aq?Jq z&3H7QeR8lq&TOn#G}x8{*f3Lzra3$fc5ZWE>-AB-tTXp=D0`REL|2s#0+bp%66Arj zBK(0NsVby97qu&g3ET<1&B8TQU#H;bVj*EDtVEZ3w>ua|;ZJ5%jAm#n5)YZXqd1CR zp%TjY*T?P#g5ek7V1!PCUm~MO0)O3_D<^F<um)q@R<-V6scGQ7%z1~=?ufk(myPi& zO6JII_6bJ(a?A0=zm%y#A{*^0iJlZV7ZR$S7}il959E>|B@hKjg1gV*c|8#;ynU&( zA~y%t*dxEiAuip>$VjMzI3Ic0?VhVO0Wza^dU+~R<j%qZ55FrRA{_z`^vOu~CNrQZ zmqWDW1|*slq39g{li8bO@g*jMOzOy-<v~FOSrwiIBh+Ih+kbw7LQTTd)p@L0W?JM9 z7PsfUBjbId9H4F`U2v#i0Cb<dEDp--%z4#aq#46ldPY^uR3^RsluJaaiX`_y02NPp zMxW)E<US2y`{bb6{X{MT2ZV;o8(!n^!Z_d(9;%70jAIcA<PG5#YBWVW2EL1h`MpEw zJ17fyO6*KTlXs#Mp3eAaVdTqVAWhoXapcIpxtrl`TB3<?H4U6yi1h@TFoCUW&O+-0 z?#rTVmKu<N2Boct(<`(?HfQ00VVZX_K`A!goBfpzyZ9WU%?Vc?IqO>G(KK8@9ei7k zw2CQ4xI6Jng@TZVCnW&ETGiyvGZyqc?Bei<u>uW`cmw1p$$f)^$)(CNLn<0eiCOUF z5w3=kJ57#efD@dlWVa#9p=yQgLvBlx-Nq(ow(9MI7yjNe6e;85Fr(tSpf^0&+0ND2 zQ??<Hw$yB+#3VXX2h`0jJ+P>=y$>g+sA1%zoD%-wrVFe#Fu4k1$ZR=GP#vJq`eD+$ zhsMf<;~d8_tfXfhQTRAJ*r1a0Fx*~hJvVm?4QB<jD_$+meF-zD8n&Xr#z=zE{*rQC z(w}HDAw6&vMaUX(Pgd{_M|+K3b7-FLoF1Z@4Uz_=;|AZ~BVk$QK_Te{!4w$d5Jf^+ zO1N!5c8OQMx7<5&n)w^gdf>lib&9rrs7tsd!}1`Z5f(*p<Chy$1H{$MU)0_0l1q7$ zXv}0ZS_wXtkC;#1vVRnN*Kz�d1$52KLS-03R#21SDpFY#F@x!qw5NtCmE9@Fb($ z93l6_(Shx-88l3gN93Z|SpLV_#^a6l{l^a<uI{vV*Zy-A_WG~B{POd!G?WL5+*e-| zKUfZ7vPTl99)#eom{Up<oLkJ=R5(2Pkd1pA;z;(bSb?ZyRwl%r98fc=h@PyBRfM#; zq{up0+d$M8p#wj4r3+|=O|b27e+l*;906d#BO=s(Ws|4$Q}#zW)QMZlLo?jDA-E77 z<XPtk)$cW%p^GaDQuJ5=>EtcBc)*JfnE(Sm69LBY7DF3YVOXokPq?CpG2d`8mMFt= z{}tGiyRX7s(VFr2TRyvmGZMe7DgSH9bs9no9;p!68u06eSD!pB=H})+7{T5M&+-bT z1zQ|Q`^v&sFAs4WjUJ44TPT(B9Ib3f1p*2cew2ssx9lN}>AO5TYNJL2N}@a;wvq$| ziOhpJw_6z;g{ypvp{|sWk;lVLiEkL8gAxYO9=_;3s~Jw|o)DJH)$tSj_#m8VX^HhD z5-?-<T)w&$u`FV4sWzTtXqb$_r8d0H;KSnAUwsf;2TU7Kqbu(qKMti`olICM=C2i; z3sgCpV%>ugrD4{zLQqtWOzDu2p^%dYd?hFe2MMf83-(7`Q*)AZ8Es#As{$(QO^C(O zS#pR4Wv<92)DYO7@#lDn&PR})Ex}hGvsn|b85bCTn~L`ctW~3KvMv53^4lC3CUG)r z6t7z3B*<)o$q*uC_*F`D0y_?$n!TYJrLV2{=OK_!Oam>{9qRF<wWd=WDT`tF><PS_ zL2#VT(iCni;KcQV$!PG@c$36bGJH0BL~YaXBSbLbQx&1vppcm>FS<uB$>hm(A=tDB zGzfv8MLz_t{kRB<3sFlA!@;WDkl^44LrE$KAJa%ODq7Mf-4G2e+LPFH<?MqX*f zc)X6q!S12a%FBX|)Y=pyj2S#>pYjiNLe0{tGfR;J%~qUHIgn$<4RL)Ka~9M=PaQ06 z&yaj}u{fK5I}5GSn`YL5J_PKazxv`tBC!6Szh4YHC2*z`=xxCK03h#}+YG$HP}Z7m z@~x!|hBFIs)(=NAovxI>;!DXP4MdtyQPs*6xfNfJBpH88h6L3ce?INPTLl^nMoyfu zfgWX(xheY(svGCHT|5-#E>2lq1#m(VXG%IGj2%>lsBI1|8P2GtRopqWB`8zdXpZ5n zRLJ>k8W(y0f%}y{ao!E|Au+A<3Tgu-6q+PCCX0&eb$OIR=cEJC*1*Fp-ux5)K9%at zd^~PRC;^Kl8P^Q_Toqd5Lt!xev?T&vGZ{9*7HPb7x@jJ*PK;rEpwQTC1fhP~*}H7p zDV2Iloh+y1qg%WzF|DF=Q4s_DaP}_s(fGc~5_>n{XTE%;#Xv;2(f$>lU-|>nps)0T zji5M<fUp7w67u7IR~M#ADd8%>`=>tsVZywKWZ0O<OC{nk#7Ywx(p!wAS*N3?HwCq5 z80e)tOVhOhcA`|FPi`PS3J#!OL~vM+89S3``+?%rZUzAmE&?gaeK3zdEr+1NHgSqA zfkYY^f~Gji@t*{2CGi-eV(iLcXomUZR--|KlZ2wlyS_G$pw<D$M^XE^cbX2g_U_?n z$<%crYWlU93`>ynMz6QC>j*>BS;k%J_UN;B8?tzD>tZ!i8VbiYu@O7&<vG?FE)E#0 z2WJ983?#H47X{vRVVXae``gJ|I763nTeG;YW7#_R>nVAJDj{BI>SI&@KE`i2BX3}$ z!cjnBSjZNvL#DS2y7C=kF%BQA44=GUxMho1GMWi^i!<QV5RIU3tzOHMZliRLkHHXN zptP-9yz{k$BrZxwA{`o1H^(fQ2ozHrxXh&93j`cV=LN82TpX40`Ec&iFJTV_WwA6d zjYEziUDGY2E*Qn%9hU85>FV>V`#OAv3?(6c(V4r!3top`Tzu81)Il>1THqA}(94+D zM~HVLKv-6~mR;DONeW+l@%cf~+FRc(fM}RMCETl&F`O(j2A)Pug0VE^?X9I9VA|oM zi$so+f(@xs2e0WG<)Insq81(KB|e_a4-!OHM;2auJ$z3o4n7ivlej9A9tsE+N9YhP zws9u!GOR!-L^5@Q?XEbWeg0gUQygH7=qr|u^YwguCV6o}tvp2Xf+nDpcv^@O75_Vp z=On?s`jvbwC%8>a$W!h1gSDM@8_l<;=fmNiJMW$%dxSr?<-ckH!XH7G8WBLOuT9FG z^#s($2!B-<BRtEi)zBh^b*gbJ+U#zsH3qApM^D>2>uqC7L#>8aD~2&r`Rv`GOXzD2 z60D-{8JKvR`aCi-Ve5aZp^d&5*(0S$!0?Re<KKZTm)Dl3IOCeQ(qLpL&5m17X{LPH za)(R7MRk*6b}`qA4K7xth?;kD1M9p(2Xh)mH)Q3|($_TSa%l<IO4?5L`uAB~kXfq{ zH@AxU;!Yeenj(VT1S7S8j9ak2b$e)+lutC@JW+YwuHk^}Y%w*nDJV_5`<-uZY2<wG zCfT~otW@42-k5;re5c%;G77gPz@$zMM?y=fc)2e<f*U&eOqD*W!Ba4dxg|7!a`$g$ ztgiEvd^h4d%xa@L%0o6XDm24Wi_%@h_R&TA;_Z2N__syCMVH&~9Ew!Yh7|`_th4sv zojY*H9DV+5f9vdc(An5u={-QD{G*FL(spl9rcd%H-opO^cWF$ut<13>YP941&HjbX z-8~K;|K)~U3U3#W&mg>DD6lws9AAVmzv>P8XA+HoK;#~e4`TD_vb0!QUaN5Lx<sWj zQPiF@8W4Jh>N(;`R7YrBwYdvb&*b}1_g2>0%iG&OuKv8W1LB!pK0p7l`?f!rR@7G> z{b{$ovh`r~{^Pav2lD(+y9HaG+`sId95=jle|h8n))t?>55H-@-}Knp-u=fbKdkPx zx7W5;*Vi^zcjcYl#o;A0d5Z1cc^5{w?yzZq#}6L-EU#Q1AHQvQXk~3@Wu2b7>6PB# z=%l-{*7P8jx%+5sTOMUYv=_be#z!~z);1q+J>I1O5ktqVfwivTr3X7(n*zr%_PN{e z(D!S5j~?G|FR$#aZEXrVzVBT;x;#X9k>nybzqY=7pOE13_0D0#V}D=W{9#Rp{d@Ne zM%O0H?yW9wtgP(`a`zCOvx0Ky4P)-@EdRJBknRmSub@CSBKW7(9qhJH-A~;CcG!sy zr$TFat)9K|`dz^#njDN0i3W34>h-FyNtNTt7{C!D{xFl<@0GzD;p57Ob}rGS#si3F z{b;uEJ8DeC56Ch@Pv&2g`$MQq!Eq>j$EMR^eMTxf;R#rm;&6C89bFg9$6ZSKxcW^+ zHm$+)t~CQn3<XyJhWS1}gXlfR1{u%zuB=sL-o)O}8A<mT)uEQ8=eoR+tn;X+su2NK zTq}et3dM?jovz%M5?*yLM#GwvjfQmv=tbwZ!Q4j1kUhGNJut-<X#a%X8ujdXBsO$e zf`>#nTmw4PsT0r$sVee5@zQetqeHMB_SW=fKW;4Uo+Ll)HB4zW1d-bAqu!QpOv8TM zv*%R*dGfT3HWanjnZx;{a%#(iKN)l+_n8cHHs%w^UYAHqOCru@3V!x_7=%vxxyqN) zCoVmL@F;ytL6Lr-GNJT|vHtRBE_uP;(=Q&7m8Tylw>D;-eF46leqtOr{m5Bu=`-P~ z=_kfK?W3pZHo+2<qrc%iVjsSnfRGsyU<bRrk2)(!6PGr18&CO(hAj(@;-lUQs|Dtl zhp7;i^0(rNKO~NFJ?P!zX<HHp=MPWFe&R=Og(2Wj|3%49pA3(OC%jrx!eeV+;+sZ; z6b}wp-Rp7XK50Bc{3QMrfAgWkjVUR(bB!vlsh9T{HzK!d*crNKbFX_Zp-CP0I^qT7 zU-Nq}P>Fk1Qk{<55<SeQxYCP>!5UN#33kRpi~M(XI5?U=Jn0|KBX#lU+i#zJx%lks z!*7niS^RS0^RK$!e)IX_S6>}}eRTNcV(0LSufG2Li+R4WhwE@>@OGWC%DnbtMwt|M zBnd$l6*diqOJ8tR)~>#)%l<4H<D%|}YYh6;#`4eisckLPeYr{Hbk^Pr+6U!0ypZNw z^WjV*fV=QH{5P<|f^3aI!<$$^{#sh&$%hIoF;!Xku9e-&c%q#<&0)halwWi?N?8p$ z3zKLrx~O+{h!}->{lr<gG=tLTTN-F2c(ZHY1hYJZesmwLi{XrKv4ycOW%6ltS-6$z z{M=Gisg{;Dx5|Ln-rJ4@Y#RItA}5$V?B^2&fFTkJLG_#O(1jUHfnT?5tI}<dQ^%8k zyV!w^7`^EjxI(r?RfL((;z`nEXmMN8p03*peVGrJWoV{|y@jEqLI1LSEK>?ph=9w< z;beGf1}nmd0jcC7l)+_Ml*C$$gc~u>MuDV^jJQWbE>t)<>>1ou9FGU~tp9E}-rO1u zrdf$XEgikHLro1d;2w(N=Fi>XO(p`UFStY?GsVr#zI{omvZALq<&-C%kJv@NCWPsm z=M&c(OucZ2vJf$4W?Sf-5vIN_x?6%TD%p{{-YuYz!mO>I7&FF)0&n<S_%}Yq!c(E| zw4nn(NvS(%J0HSAWa4x64B5g%wDe@1d1;)^hz{;oqDA09n2|=rmRep`&t6p{w9ESP zuNtF-C;d(tMzS;J+d~GTM4}Ug?v`*;LK2NUdeGIxVn*{b4Q2Vg*f6}0=dh-hK9dr% ziI%`)@!+n|KzUd)+B(v(@$F$m66)QMV3p^(_HB$tIGFt09#&_J3-R^)2sB|;-(aT0 z7G6JCE4{0kAXOQr;c{ZTC1~mjPp8V&Ukp=b!ST$4<wI;Pvdva{u6?OwQVmNDKkfU= zyQ^(BD1`CJbxynmOVI35j|ykmZj=k}-q6+lU|Sg@>p-y5WT!Q)5Ws9r3ql&rT2fq6 z8ph=rr=gjp8Qr?!qd!<$g1uDd8Ff5*!)>VcI~wpM!>8!Y_@+&gK7qTOC~c`aWoO2h zYsb$P-QIq@zTVzh{l6ch&9Gr$T3CzU?Hh3*mfKA!Wil2Kqha{_*8TS8<Bj{PJCjX{ z=CEUD+#f<)KD&6<n*NXBJpT93{vrPjA|s<Zc(j6vuS6BV&GuG%cm47A5>VUl5LdAF z0D;+~HWyqA*ZLI%Umyxh6zUNyF9RprwUw=njWz7o`04JWr_#}j=IO+2q^rt^Z}u*A znfzvKL^m3|`#Z~<D~}w!@?{ngv1=-j4r%&lWEkDG+dDJi;*6t31001G>Hz_K%~Ipv ze2lsYe@8SNP>PT2DV1cH4O2J=NiLs(nas!Edc)ymcR2smS6|)<Z%?$s^w_k^%WXU` zJ6-t1dT=7WorrmiMsY%xV~8M5JIT43Ha5#m10K<QLd&FByR8pkZ-A5Q-$A6A_acb< zCZTq%g2~(`?H^ZncHzkR2qMa697R(ZpMdU`ilE7blvx%=O@;G)4Pr)|j@K?>#-0=& zp&I@7y=8zd=f{=ZNtc8f$B6-BdhfcX$YUmAZSOzLpR8=M7=-j>x^}L<ijT_3)Oik% z?g!Vgb*51~<+|9{1Ufc!{!~$L{n{0yMor-wc%I?`Nydn`AfK3Q&Pk3{gI-da5cjyT z6TUYev>A6FEu-`Es2x|udqNgCW_cyews8Zm$Pcs23N9(5q1fKp`upn2Ui<Ox>dxje z8z)Zs2GvG=V;sif65gLEIP31(-qy~~yy3^q`mN0)V(BnzoySsjj<xPLldrnCpdmKC z-d=arpsJ2pL99YU)E{I07zDk<fU#%+tO;sy_bj74l=O2=BlQhooe~d{o9`l(!Riu+ z`ok*uX?VcLm5&}8*ZvqXaybpg8^t(3gs9v<J#51qh^uho6c>|=+c-j;VEd=l`;WG^ zerT`$xVi~z2fX{4IMp6Lqn2<zH;4#Q5UAH`t%?V+0TViHiFtmg>qT7a&g$;g`j4v* z+PhnicUD&8Ep!aRC%A7+J?|kJ8<m+^@{-J_Y*=e1g-5H)4`7pf=t6{8u*=In%IG{t z$zJ5U9CcgM|Kq=y?L5zl+r#<)0hu~Yxth*<tAIz=?;_VF%Y8foR%<}v7df*Am0pj$ z4SdA5Ow2?jviYrLZnTMC!O0+kdSVAg-K7UKiMXkc%G42qi(uN1!qIiAQOEK_u=4EC zwx)64*;w8Ae$^ccViQliDlB+X_tNS=_Nd6Nmu^e#HCoh@x5sI$SGhHPBGn-pCD2+s zSo9H5l7SqUQ+x_Gu;z!9cXKhLHpm6lduiM4a5JEqEje6bWgpH@;|~MTXL8@o7^rY^ zCiGd1MXI_j+PJZ?hRrC%rcX|Q+(aNW@^P$V!YkmU>%gpSyG%{8nE3c)E3&c2Y)_OM z6Pezc$<#?_dwDOoZW@spXPtyz$09VpAdV)E{OO6%xxE$7-yc^7A_c^PipPpV_0C%& zNu75ds?>|iLlmz${cx`Navn=b9E>>^@8+T}&o^p{k04N8&=^p13o@o4X?WA;2o`|C zE9GG#bvG!OR}qg5T*3g^dAvEP>p>=+ghgZ~Fmzt0o1C6|^rbp_86EcqgA-)M@YR}j zD1*_d#yl3DQdu-=qaiLQ7lES@CzFkzYn+&xIv?mG%@-%bLEUX>oX4L^nrTNqPbCVV zbd4GdMIxO^oBX+!D;oz=36%^PkTV9)QG&gX+^nIsiRXQXV-dnv-suzs{qqkh|0K(1 ztlYa!2fkSIXr!7>lQkQ)s&|uFk`OwI>OP{V5?D&txR2@d(%C<%i7uTIsmDKz6~pf> zOLWHcf;4LHReFt+D8`N(q*rOij~eWxGgIFmi`U4{C*i9jS1Lxc@@D=)Ip%%lIet`* zd7ruXA70OwX-1u!kH|9xmiFpDR#zS~Tff9TqXi9xFGs<f8+C9e9>RNR^_G5_FuE}Z z<s%ra@+nKkYU*`0w(|Gpq4}gctEfF70d`|>jG4#r(x8Ag>&5x>saLBlI(wPR5)Id( zwvT4>IaE~`eq&`@0Tk}60oh|V>smyDPP)6Y@%sv0_>J5smTdk}MS@iuQT!+VfHAxO zZpySxHfrqa5)J?6@vjXk)JODG;}VRbLf4fEF`7AYt};Vxyv0SfGm&NCH+2|uStW`4 z2UT=eLQO0b6!@szZDlK|0R_cZtOc;WTZt}!W7hRXdV4oUSDN=@u)9g(Wl;tTF3gXt z^saE$kLIKutH!^#ax3e(UfwvNy*JF9S$wa>+S^F~|4#fi?*4DhXx}HK28oqge7Zhf zRWF;BDi#d!Vr{9{sOqEDge<8n)I8C&;42tlm2V}5GrmVc;8~JC7^{4-;-djpU#I{# z=n5yTjK3p=IZzNQjWH_vhyO&eDwKiNS_@M28y)(*d<T;iy?T~}V@T2?OERJqJ6w44 z(pCaK5pm?9B`kk#dlwRx|6tA|YWt#m^(l*C@G^*orzpuheIcl14QPCNF}f7PXvMX% zR>7s@_i8pKb`Nq13C5^rAj|OC9AI(wc`tW7?M1OsI3HQb>^kpXdb4X(%SW5&7yU~n zf_m3xsRG4JdSrQG6!}l=d0!xt*C!+;u|tLy|BiLb=86qgBwtx045;%h4LWUZLgCX( zHRq*bai+L4Q+$pFTH^>rR_Jjv!NgLFIcQZ{?g2{>Y)v$F*>+hw@N<xZdPmXKhO6P| zW6L<yNtN2+)6>JL4lM)sMGtwnT+5Z_tQbosnsX2`Wv!9h)#hy!2(^=Qqb%E)>%F$Q z^R4`?8UAl%F<`wtmO%ZuO7&VPPU5IshP6?XsPKO|v%l!c1y43TCSp>`Ixt|G1z(lA z>IWaqdh4f2Ma&fnJ2WJneYBzunE#`C;KF>Rdn`rhhp-%*-)#cJI5=*F`_*rBgC&Iv z`ylCN&GU(ERYMv_Q8QGf$YaZVu6~7MZ5)44=4d52KPqpu^2u&$ppyDwEDSc$C_=g} zw)oLZskWvzL*ORh0irKXazGl6WIEkPVQ)U+^_mY%ZjM>xhcmHGF!9z;n=C&hA@fPB zJkl#m8CfZQ$SgIhHQwqQ#Ll1Ga<KnC1_v#`<`tbkD!cS12hK0|J{Z6BnLY-?oWL0C z;FRMLyiS++;XX=CLV)ALXqBbFW7NH-C5K_h_@7+ct!h}tLR!-SEaA&FVaVZu<&~AK z$D4b0BN_Fir(iUe8w+DbbM?5Wkh+V1y^@wK(WB49oT40FpTBK_IEgTIH9$guDXYii zy&pbGBEZxDf!_ZJi%UI^q8@dwOB(e=Zo`Ro>rYjF!d^Y^FP!dI8U}n+F?ByQ!SNIN zp(7>YjG^t$C<?zWReu7>l|c5feTi}Ek07nkL$i-!`rh4W{ssC%fBMNh`f6UDTr|n8 z2qE=tHrs1&?W}#jhT?KHqA5OIUe5=YI&osB=TXE3_W9oCmN;WstkfIyu8m>GX+@ws zWIfgoz_z2BGaSA^I|nI+n#qvXbOeUPvAg>y&_>wsKd7ZfJH&icmVPKr&)TAe{?L7k z3&;nqPptjcMxC>dz{FeAw(jVNX`c_;FEa!LdZeaRW9SvjOT|-nCB-+zzm7Eap8vk~ zp0IS`;4mDGo$<ZZdz%tPQ_iB50!gJPyp67algvNP$~}RiAJ**^a=GQh{^j7PtD`#{ z-0csq<JaTlP&}b2B)_q)Uk@f7xDMn5vg<vpllAk*b6cX{f89XE>SDcj)IA$^Z`@ev zpT8aSp1(lf@S|JBorT4(3N*s}|Nh_ZKZ}jt06krA+}LJo>mjL-erGfg>7tJ`x>X|h z<ah?v*U+2@e%qrLECW45Uwh~5ZE=oH=6Iohc+o+RSa`?L<QY@l5Dzbg8TOxDyk;j* z22-G|RR5@l{tU-xig0wvrkUDTgT0{9Se=0zH+Sugo6wIi$#EB*q0tVF-}zTkpBgR2 zaphyu#SvR9qA~c{(aGg8VPIEmetptIPP5Ly*Jb^~8yFN(3Nr%dOmW&j?ma`dbBPI= zQPwtmF;g6~Yf$eHeaq1eLjq-pNC^s=NBwLx$T+!ymG%I)d9xil4IIHNzzya%6d|yp z5AQmHP)aL7tN3SVJ<}V$08+TzK2Rnz(lEkL`1rH_$w~h;mxhRt<DRsXT)J^%4_|c- z`>2>loa^=?as_)X=+;P%xU2Tn@C6&%Gpa=prrqZ7QCJREcZuS8*!W)OL^_}Yzm;Xq zVg5&}#qQR_y`PqMRtq$fggxcQwFj#Yikr*3`1|He@e}%DZav;B@C00IXiT~Fuvp&w zxj;M12Q$U$KekcxYPZ<hxv{pfy}q`J&(=0q)*nAu+x)(`kM}mWK*MXGWDL5uRd7NZ zY7GsCFc|9JtUSWV%lFsT(fD%a#>2HeG$h?E9->d`a<RR<v$wYLczt=N*nYeN`|&EK ze}G{(*ES#SV3ySllsZFL%qBi7B;&t8*7*85r@FEH7|`z!zG7u-`)8=_kM@d3Tk8){ z9=brAs`a(y`{+?BQ(;jn>&t5!GsT1DjpgqN-A=KEQFd<dF@>)9>Cq}b;(W{a-wG3u zxC};z?%>ZEta4{By!zAH?&?gjyn|#JAmriB*2c^Yq7!dmbPR&`Hc^?9qY%}Cps*u& zga|{`$}nK@V09UpcHd)rHf4$a@Z62rYxog)Pni*aNTckwYMf}Mcm<9@9`pI!!eYjj z7Qg-W+hUg7>D$8J`+m^BJfAC;L9%*&dFZ=?SKZ@l0{O-cTCCYwCtPGyjA8=MQHdy@ z97+!~md-yN&S-snZ~<d9H-w4wj)c{K5e@C=lhMJ%`Kou!!~LS8b@b~F^9{1d)9wWh zbx|zNp&?ZYlbk&RhOrgJ=_SIgVDAFY75<Ph0o?{Y?qH&f>S7;tVc&s&7>h`m3+9C7 zACX`K9PXmHQ-uTbC75tHu*Ty{Fdee0YX=1zq3hx3WwC*+A}{Xan*k#A5F`nP1>`%* zxjh6*-%l|r>-&68s7xZTZh}T{>Uw}Ta!1gBaOCdUaen}Mz(g4M6qP{vFV=f8v~e*l z$WiN)3bKRHb3ugO7^Id#?*e^$lsH7t&J_>)10ALMC4>?BvtedNr=y(<WHFAyJw&L_ zoplj<i1)sjE4B?52+Bq<5X2~59Iz^OaRjWgT()+w+4+Q`pmToS?F>l$KwNJi(Va^0 zl&DP$(KS3{jAa?hqWHOg$tX&Uc+3+*D#1Z`3uQAZ2e12sm+X$M!(hGtygU=Bt|yKB z1G>nt^Ohp;=EHtpdsuMG*h2RIXYXB`8##`2;qUV+5L$*zozTeAc-QNd_g#rYVk91M zNFIVCTlP5mfIyRk2Lxzb=Hi(1-`^**ZrRmUUDfC&CGXl1yW#+-s;s<cR#p~T4l-|J zZ}@?l1csM31O(&#Eg=6B;O!cJ6Wabw5uUzg^}_IRP_w>;SiuzsiZpZ43vyaz855`$ zm@C&xlby>aVXX1rF9yRgYWIwuGu5d#U=nB-HJEr2pl)IJX-np}3oifEWszsps&NAA zz5+BX_P40Nyef%<$RS~uVY>j`sjhXrg5AgCS1U7_T1fjQ8raVX@4Vab9FLfDfhk>l z08!W}qS9A2BMBSi=}z-FPXn@PK)<k5g}g1{6E2tFQ$5Fei``4O6(rugL@;t7$<?4j zTs)^}uuz3rjdnW*BM@+wcwY?ggf5<Q)oK9TrF5eG!2oDelh8QjB>`0B`0-r4(E&Ig zXrc$)X(w_61NF+!w7L;!Rc+K*7JpmUmU@e1G~oJ;H|r(38$(lh+S?igHUD@*@8Us9 zZ^%LZT7CG*C24W3c);}J>caJ;O&V>ZeDwK;!T9ZXhBw%-4-!Z<{y*u37UZGcy?aM* zc#;PBwHf&9|M~<wxcnX-oN)&#-rVz_*pHyKj^HAloSl=?G@!@E2mkl~va9#2Uy)z+ zgj_rA)WKmR7e%>s!f6v8-sb@q?{ju4>%#)R9(!^XckfBa-MbhLj*ds{n+=b?7=&Ft zLgbU$=4b<#BjubO!yP4Gu<rI99bdo&`}_%9TJ;x}ID{Jvr}X6W!RUN=cuarb!a0y} zaPiaUgcvw(BYFi2myr%mjLZ0B-+I46+>nEP`09dvRzk?=)$`Hi@#U+_;o!Tovm<t- z(W3mv<HO<T_k)u&a;;yG|3^;g<pD2@DS$J44IrMsf?r9_^6@DeLSDQ&Cr9$LC*Pm_ z0b~Y@2N-(9Xoi1Dw1qo~rs6bd*r&B_?32;u#qlBe?$-6idhFY}Jq}KX-<=$PH#|Lb z4k~%PpFJ@iFT2S<fqSr~a(k^q`vSlSh6R4nw0Llg@Ztz}%ZEo#03`hwKL6-gx!($9 zhu>>-gXep2d7n}k2GKOa1jVsfL%XxFc)OhAkvcq{OP{K6l0&JxF`PIkvO8!%1h>-} zT*NK8F7Q9EO2lW^CaAPpj3iX5J-UrRZi;peU?Sem#)IJ<M1KH9UA4kbp1{w5#)FeN zTaY@^&sqAKl6+sIT%l_y1pWMp_Cn}!;(!+UF91eBT9riO{{*LLFkIZ=mP9}+jW<u^ zM1RMRsjD4k`p<8mn+8u15^MAS{%&5tw87yoC;_qm`j0P9&iUViJ@xr#`hj~q{%1z( z4)fpQ2je^Tcvu<kA*5Yx3fPC~yoBF_ca!~J021;2ub=$OpI^U16g=Pm)$hJ|_N&kS zQUwgJ)feTwBrR=51pve;Pi0~JTP!2Mf6^=5BM<~#nKj&UBmeqP8==xheuNRL+2wa% zja*eC+(!z|7B?RkxVlrrW%x%`1RJ;ne;Cs1sofjIbT>*O>o+xIDYh$!_{)3B!~|*1 zGpg@FaK5MHk-84TNAVJ~hQp%qVc-a0#2|FArv=5wNLUUOi&H4IzDGOof?h{&779Im z1S>HxEJ7FzNvSZSb%D$94KajWx2I*y{;JIFaAMZ(k3y8VMHC55IvsDuzXaOs29d!` z231-t@c8tAeVvrZ0xWI{ieXnsC_tI~66n$mvKI8&VWA!9BrN@SwL&IBsbj>1)&tO= z!xJmt^SjVevEa2M&+xMe0M#~2dRha73z`6BTLyb1Zl4c6)vMB9ybjtGkwt_4!$fR0 ztM<PQtX4Zc2CV8SY=YP*r;xj*Lgr$z-v7oR0&h>?um$N3wR4<uuwjQyFUb+ZOP%=U zldnGkN}Qi3*8zfz)iiw2(oB(K@XIq&yF=AN*jg@P5d3%sYP(>$nilY<XPXbd7#E@o zTrKF+dYQHqk~%Hy#HoArL1m`C8tke6N~cXaN8P722#c$hAb3WTC|#@k=-Ils#;MI5 zN`)_DI!$XP@2*d9R=}b3FNRrn0>~ge!==ifzb$)Kj0np83f;n?xcaauVQgWV1EjAL zRkC?BYNGk`qBks{nCqi3(}QpE*3o2%+|J;u>_~0LH90DjR<MGoa<y8bbcYS;J_nuZ z6FM&d=-T#1hZ9V0Ko)*0%S$@p?4>N!2}agLEPXfSqJ-%$pPFf(Li^(tz%`-Od^Qki zAmvv?oeJzZ>^mq`pe{DqB$C8ScV$q%M|1^+V+<I0<d@*icL1w}VraWcZ|Y%!9P8bp zHRF-TDU*Y(vK`a%dW@RyUjlVog3^MbIWxDVB7}^?E~h>@+_Hj>`Jn2rmr9l4U+`LS zr1}31o_+<%=8#CrtR45)@*U1YH_N|H)yO-f+fl^D3UN9{c^Cin0Vms-Mk{jT1-MDJ z^BIbsx=n%;d!1t`_rI~L+K`7o!O<f<!gq)lxP}KK9K94r!xsmyPA;2(n_?f!>vv`O zMs4x03@ws5W_M!Nqq9F0M+ZNho~a474<E!F(&~#zXUt83HHOEB4FD+P6kL3}n7wCw zD@@VpITChv_ZnRqdiLJr_!gFf7z!v_gR2T=iYjMm#*pliV3Hd=dbmWLNmoAkD^R9z z-wtJeoieZ##QFp6X4v%C(VioGbYff>DXOuU5l9dwE{j$IJ|On*RRX{&Ea&x&E06!S zyjr1LL;L$09oO^m%^IJ5+02T>D9GoSt(%=%obIAeKw{!>A6&)OlA)an!Vt@0fpK-B z+M(;k-Tkuy4%q^xcwhYx*%376B3^OH7V2dMs5Vd=Ohc_4OlVikQ0&W8BWa|XA5y;h zBb1!6Z>II}-RwPD%7qd^1PsAa@X3c7hClb~TUQ?0==9||CZe)I=2H3txt_ONiDa5> z4ZfZ5bOZXec^$R*N)<TZ*Kk1J3~1#qcv74xBCiTTU4Nk~OP-qFs*ZHE$dy*Dg%9+h zzVN^k4sbM1y~~TQfSFgPKb)eKfx5%d7V>A47NFZ7_X7K~$v-mihh2gHO$)@E-}Zv{ z-|PT6PS*?Oc$8?Io)xEO_%AA^i7!b;;#`lwZn1p2SaN`;f8S{r6#%;L1QjLOyP!e| zwc{RkK&340W!Iwv>Q;uRamn5RN4hg3@;&TA1JHdZm&Y%MD6h%hi8c)V(L)2!eJ3m# z#qlW~#63UBXD$|yr?bUV+@+cK$Y)h>x^M67_z2>Ei47iJAaFn(e>TmQvne#e2Aed! zLHi?L9jtz~ifTUEW6@6E(N5_g0S8S_d)9ok(F#!A_xTc0-|_j$uow+53)BN%;9g5M zQSXq0n4vuDDT+~^qK1}yv;N2$0?psBc8shOS`_Rf@tG()k=pZe?q{Pzn&o%$4wbK{ z?%PSf3-$Gsk$+o4mN&Rq^;GmBrmQV}HlS#sf+v3)lR4^{_dk1tl|Z>siA*>AaqF|M z^#>=Y7M?rIjklZI^VM>*M8*qr_ypIhjF-<};db5q?TRi8RKG;c{@d~7Lu9D=Ha42- z3lUJ9B8Kqh)!(QxzvC%?+XKo}P$6x-PaVV+`=QX~7?Fz#1n>17Azb68&`%xzbf;z( zXdHfp!RrA#YU6{Ca!-^hCw%#MdN-cGNg!&yy}q8kKUf1%22Up99lyu@<Ps;bT(K&G zz{QeoE|+xOhLDTQTzAYSB@%KH-AWbNB=CM{tLpE%g9-h_lf*C%&K#1{-G}PXp?*RT zu-tN$SnlDXW<Fmd2xZjF6>{{U=0_DZlWK2@oFl=#!L*FkcUwRcF1(J7uAAa1lSQyU zt~>ENA|x1&#~|GeCBY?r(Krc3`90$#v_vCLOfn#cP0Vk5<C0MFAdHaT?8YOZ1$=aP zQE=bch?WAB%1BuBgu!lyrqp5yRP~ka*a=19lt&Cb^lR-@<SAZ-n(!hCwDg@v*$F-I zTuKZ@X2cF?GD90uP}*dBT-$e|W+zm|lQl6^nGrjn$_#CdD$W@^SSDyE#8p9p=j<OI z#PH`0+yRZ=4E3cGGFs2@*a4~ZbBn~&PFSsj)&jGE!8>3#Fw0IDuB4V)AviDJwKIMz zfVD(#b?lDVtxnP!xuHx}Hhx<r*>*y42)q_p4i4V|(ZP8HuIuIg>c|;yP0b6=HJEf% zV~(#Ht*d(CHiyn?e61$LrXUHZ-(;MFn=BjO2XLu0`|-S<eM6Ttm40(Sr_38}sG8K9 z`$Ff{0z>RKVpLb8)K21MK+a5A!H>GVIGYwY-@o5(3Uwt|)f=e4aZt}W8656cs)Bc% z%aonfYOWNu65L~HQmtgLAOAy<Du;hbq!Kvkv5X@JBCag48R`cW@ER{8zd!hPjM_Zh zvZuNdzIy93FU2dFOph969F<HUnn+5;n7+-T_WD(WbTlp6C>@mf?50?&$|af~%`W>f ziXkY>KReqp;quDLiJRy!p&NR$4z0c()Yv+MTT5__W>a;rQ7-64d`smVpQVxUp8dj% z`ZE&zj<kAcQE=64!}pVt+XL7h#;-4MUj#LE_8VC_m%$8PDIK#NTE^Wjr!D!RaiT_+ zfUx{hstei0Yv2a!9Q=3i8EU$t;?4aA?Ss=U_<t*e<hU%qN$87z41_$i#>!AUf7{L` zZ@QbIhG~4I<2hf(9VQ>I!ujNEAi>n21|Hc>=9*`@QK6cH?h=Xaw78pH**#D%WYSrI zk@PXQR~ej7m%o2v8wQd8GTA&ubc&Y48!iHZ$4up3Xq<$Wn6tl=*I*hOSZ|fjQI*Ad zF+;cK*=p*H)%nqxE68@4$)mI4#q;9e@)CDe4laiUdf&c0xHN|awG-dk4@EwKj)<Ai zCfP0Kro3;~-13Jl<{n)hpoBaJcv_(H>+~w<<a;_&y?u-0(b>rXwN)!lsC8ZxQB7mg zE20|ks8A1gP^V;_{HamH`&rJs=R-7(Lz81vR30=<T>V{oX0)k8<GbTOaRcQTyp<oN z=lsLPv4T|~Gm4AgkG(ZC0&$4|y)_3`^S}!_xS#!~`WTxl4aCi+D9vWdlyF^?*K>4I zLmdrjut-AD4D}9Wd(=2=J$S9ZMk`i(0b=m2{Q+Muf2yKiH__o7$)m5oM!DUbT3>1e zN?p#KKnN&x@s*QKXufJUp@$OqZ=pgt9ctjGVJw-uLSa>mg`)NP8ut=jy3WCsg(_)i zFRn0_W#&yGxn7o3pL4SusjJgKgNgz}h_Jchtm;BBk0Fe|FgWNGx;#<0leL<14T)k6 zi~TsBZ*d*5+Qb1VW^O>!eaDu8Vjv)JQy?(3=Bm-zia$i}eY!`a+w!=?cb$IVZ_8PJ z5s+mR;PzttPAym6Flg+sC3!t-UhE+<Z*>DPfoi+RAJiiTC*!|=IL37?WyZPRTy<A{ zuKs3rpIk4tKPZfLa+0k1o2~7}%jv^$Zw4Ia`~XBB;+nG<)$4A0Q4U$Fp`$t4!c7Ca z%VJr)QKSGKAv*)+uxqxKFq%mN(=^vZFxrSsd;$f|m@zvzTRK}`z>7ay%s)gC@DM;B zsV)QwsH2K<wm$lRh+;O00-Z_!13VT&tp&Tz^CKRjK^NTUG`<yOexZi^;N1w{wMIL# zYFdkhYpP*gUeb#(GkAXi#J670bLmoRAEB-0n7W~|1K0-uChp9tD97%PmXkx=AcpJO z$Lcwr!@-36BqD;{C*3mG8`}@+E<$Sp>^llvqH-LS_0B1Zxidfm{WgGrEQ!Hz=(i2U z<Z2r9>8V1|-6gYHIJO5g#gFX47c=})YZ~QL^(Jf18H)i){HBzgUOI#rd#%Ue@L&V4 zp5AWy^IsaKw!acR3Ms{+9b<hSCi@3)GOh+g7SVyl@0ZIrP#SSnWp~2s{HF>eKF4D) zCVqU$>HhyRd&*iEIJ66QhkxIMurwzN%-#l~5ZhE62;)-==};KhjRdpx3+e~gL;;?- zq4U6>hNnjb9vCl>62ik$`seiuZ*GJ~F&PkGJBa(1SY3=b9_h(k<nw!;7plzW-Mn>k z7{Fb-Xj&nA!<7FyJGGZ;yKdP`m$hm8W0&WM#(|Y>+kswUM_P$Uj|q$M^H<MLdZV<O zENj#Hr){?!T_Ky&cp>5v4_e>}1!CY3tF_~9J73<m&FZ0r!xBU%q2TeRby{rx_($Zm zd)qqCmbr2D+tviX$Y0|C?}gAabFFb}2i66tuA?j==u&g*rK+Rz)?*CpxSAWAv(}5_ zQ@q#GmPTrnnBQiI$2xWza1v9P`WN~M3=>@aGi5x;NLgDs&&r)9o#feq(zJZ!7I5~Z z73pcc^&xJaZ&#tv;vrT$DsfYq9%Tz<e;#7NV_YVu7MYKP%~v@8L;!)tq>r`1?^Hk2 z<el8U_~l1r1IBn*FO1N^x50Hn`l}(iWs+m@z@?qo?dt?~W~i-2f?in)@3Q6UE}Y^d zN^Zoj!5HDG-Lk*zOE+K+`8CHFG&1;#k{98j-Wh~t%It)^1c#~NXtA|g_<1u-T;H3U z+!`*XCr}nWv)K@Rf$=67-uBAmcsrmMKvWtbuVn<d!7kp{31wUQzd!*@Uu!?^S#17l z>{9f#$&8%!DL*WFc70A=k4x&@(Fbd_Soi{Oe4@r^+Ajc3d)j&b{Fh4X<|i}3;P$7z z;2@9Yqub@Gw<G^nDh<YawdqT#Ig4OihyZ?-yC5tH6GWZ{wl*P2M_n~`!ZF-6UdyG2 z?|L{HNG^($?gclLiX_roZ*#}9h(;i?oB%ouFpab1Y!QzyYfea7WKNOJCCr7`!)C&r zgxhTWgXi>ZaPG(C^sJ>dkN*tFlL5J}9AtMm?Un2;V2|p;S|9n3U#XR6DQsC`NG!Bz zi-dLdTcr(UL0f~mKEMsue!|tf4ZgZK=|el`Eq1uP|G+PPdrL+|{M7<}I-hHm<h4&- zeWw0g7iszoO4<&(ED|@_<zNy9-!@)O^L38BE#ykG?ML1PB6}vn!Cq}5+$F>AHiy(9 zFt9m}A`f-T?8q*q0IMKAR)opNFzCIV7HtYS02-ajIb~0uGzvgYWvbcC*I#1|K0vk- zg1*S;<~6&nHhT>a)gE~h>S|C)y7Idg#Fe{N;>#Cm945>r8qJLcT*<_Mb*ef;^mil) zD1V(rCKazl3uXPafOHxmLY+24g~!}xn5CC1E|8w54<l-zL<%(G?)ZZWJQOf$DjT+J zQFD}hq2zohE+SD~=fi0o#A)T~8qe|?3ByZ^Rs*P=@C6ak$=?UmdS4OEpovXVtoW)X zy*?H(;&Qyg|EDn~l5D1xZaWz-_X@0Wu)4u@Zxq_oGA@2;T4+(eJLZ=ID317gpcGwg zKQ-FYVW|&5l2v$+s-JZAgsFp$P%*tNj<1Wdj6)))-50|bCphz^dn$Bg=lJ<6-0i`c z>hUQG9ZnC2XD_ts?0W9+CTuzsO@m_`8cBu5)8X*KR#JU_uUNxI-ODCD#~l6hx&{?4 z4)z$;?z%?4r;sH~lG)+FrJF&wO;7ffwQ~l_@UpKwpc@;?-mEW^waa8O1I4ueEOL*Y zlC&uu%c6%dcn!4wXPt3Vo$=3_AtI|SEl&gAP|QFf7kLs^2&MNS=kYC=z0{QDr^=aZ zBQjs9P^yn>movbLPC~w$o+KlgXEjyC`S@q4-9Jn10u@zls|@qY;Ldf)TwqaO0@*v^ z_t3b)Ft$cEi*qGdPrh`ms*KbUyQBI>y%ns!tJcD)3S0XUi4kS;!Txrzr_*7}RdeLh zmsuUY$MYH+c%pqBiivo)!J6A;>3G}AMryiQCd%5Xi)9;Dy~MpN{Z6EM?wVd~I2t~G z^<DA&;P3}31|3r2?2pGs!{Y4u|3(bh0~K8M%CBOqaK3MvU{%cT`#@03GNZogi!5iS z_G&r8jtJ~p+H_wx3GaYPcp}%}Y>3O6!EXveyd&3OPbMthFJ@Pz=~3X5PKq}FZm@Sv zKd&>BKaz+}za;-itw7Qs9i+eri#jDt?w#{CW0m}4tntMYi&C)_rO60VJP*o$GmR7D zc9FqQs>%|wMlU~kK|ZHT@HuJZq=r_`n8aR8v6eP~>gVIh8z{?Mch8?eGKP0zp#FKb zVyM!L0>_p8Xr*pdk~`*8`%r+%LSr3f2xI1OB!{LnTZ@e1Y)xp42q^KaB<XI{ptQu4 zs8j*p@=REyfdEx6QMK4>ui*(j3Vg6yjXw-k(-Qp%(H@&1z9wgnf!>rKKok)axFs@V z^O#e+!k|jg+C9-0%9m2#6q00n163{+8W2gaS`7O_Xv>WLnLSJv3NUH!sWwfY9(-ih z`lwU{Y>B=M5%YAUma#vsGA7TS)-n&1V-y@6+X7TnUztUlW{9nYTp!v8mDA@RtaJuk z4-iGWFq!oR$#o~=#q-iE-CJtYX>sE{nmaQZ{OC=7dz;=2>;ns;h>I;-Zqcs=hDZIJ zkn{#Xk|As|s$#UrP_$+~fp)TjxmZ_zP50%KTb-@hg7!hzjJ2Gv`UqQtFT8xWKHbiH zxz=O6@tE?0qC8)&`B}n8LgpFw@qM&QOS0p^!Q1gn2OZrBnRVhMSAQh@$|X&?OCL+S zlfA5#9w9Iu(Ij)hboeHhAI{`8zWG^CNUU2Nz2M4P+Mb)E&ThmdHM$T*+kk&ILTqmd zljfmOU;Dh4bcijbWegjwKvZ!sh0mb`MI{VZ0a+a$PRVEVfy^%~fJxD54qHA3E2LxE zir%%G^`pJBtG}X(E3_x}rmFF^4QFKBVqzWj-)f{1T~^QA+FMcqN%*deAN>P6<|vxf z;aa_zac8<<WkPE66CoUN-a^rP$E`4x8eE1)ROHXMGd#<_@GMxAgsP)W2rDKkvEfW> ziBP<Bwo+?+KKMq_eXxf+V0bqGX93PK%KV2EW&aS^XO9UwSZ~S~ND--37}M2tkY-V% zDzZc>zAoK~(n@U?G`af<O#jCgzqFRNq;Wx<W7`4N$o&w@y-+=!9%U`|PRaE2b73L_ znMWl=ska67O>Zqd(Y%QM*~7J5&4}@g$?4^iW;*hjE#5BQ)LJB)-nw6W@dc9IH|wgc z+esJYf`Ynbw56*$1^QWgbU^F}7MD3wP6}<P!G`vqp>hBy+mT{S>JPizaOF`=-lffo z9-$!NB<6^eK(*FV_6#A0JoJv<xr=40XzG7lC%S(&WMkeB@;g4Xr@DT*0LMeAMrjS* zybN>8g~Mw=y{FdEl0Nu0#ooGBtD+es1Xk2Dw;rqD3T<5d_GhRPGws%T+O?Uk>B@zz z6|+BXyKg&C^f~iQWQyAVJ<8+!<bVm}dJ6KiduGqvO**0Oo$M4|1*OZM32y#kx%hCm z+;SO&^<-rf+1ifUS&XWwuX;3FQ--jYc3!!z*gpSo@N+qVd=%cB&(|^psPmMhYD%1s zhUXW<L-f<^tH9Y!n5E0a&)aG<F;wU?o5hhr!bY&9nyXrKWP2M@$;E{7p5K)l0RJnb z)qeGRR`C2OI)c-u@D%Z>UB=fW|Li`|;+CZMN`p+cn*7w_e@yp@mWN?IwxMuAp0R`B zyt6T514xGXWiQb`E6|E7<=Yjk$f+GPEO@*Xk57+>3!HgTAt6K8$#yy{b1a`mG5@Te zwUsnwE=l>}UUr;CR$T8#7Z0?A>Iu!sP=B_#UiLxH3}5J+UZ7jkWr0Up@UpzSU#`Y0 zJabcF*r>T;9&4<Blu?_#MW>2YLq(X4Rh!Z#+qqiL;_C)!HdH#!I^O1Zg|}Hn2?aj& znI7VBLkV9>y*=Xj*YSV%9={^;sfd9e>}Fl#$&ho^i~=vf@#TX@SrSpgqU>uu=XzX^ z=WE^VD;DCB@$az#=+D<HvDM0bHlEeKZEnxoejjuaWtb|ZpIeCe*hgzP2~YqU?u>Mz zli_ZbKs!e)?@Z%yph!Ds3J#n(QT7(Mx8~>>gord;AkZ2sNj0ZVX83j7hogvz&r{aY z{O;i)Nz+BcLjLQ|M;a3y^^K4$AKonfPzZ1m%Z{8`E=?LSQ1{JyC=k=BN)f{LO(dby zD+tPNDPG4@-yn(==w<9Q>DWo7mT0|%qPYREUA4C$IH_0Z5nbK=&5PQ0a#vd;8n<6( z{UlX#k<2UhhTvAK9?WOzV(6nd>AcYZQNwYtmkph*sn|B!m8O3K|BERMljyOh$9}B- z5KsETu}V1}y;ePC=>`;LQor<Sp;0}T(V8FBgpK=^eHME^Vr#d)er&zxAfz1(T=69i z``~>4`7d=!NcQ#1FKh}OsHKP8zq?(oH~Xep!C-G@9+EFt`gK#+7351)=?Z{lGP=!@ za97`d5KF?wqFVAp@5`-9Dymw$T`JfId+NWR+ZGLoWg0-R`P|m~6#%F`KQ;i4n1qBg zzJTD%aW|6A*64{~S!UX_jMX)*@pw00y>T-iz+J)JzVUqacO3FpQQDC~;UUvHZvIt$ z{%?$|bT{C>*PQJwqj3OI`s`^3jC*TEY$+4VxXsq1?bU?b=Cf-bXq)Qh@9WB_H8i?) zMCL<CBW^??BH$h%$O@$@3x80zf^=Su^F*dFcyFqnr-rV6b^62U*&j}OfY9os7{#FZ zvH^TMo^JyWEVL$ER-~@4Q1(l(3<f?%gwr`&4V^Pyn-1CN$ITM>_16fX^z7Q1vG*!- z0o(MJNl&kMcduHsh^WsC*{n#z9aUYydth0iH(ZHIrjXkKeP}zASjf$O+r=O6fUMs) zMU_@+^s{03I2^u5x}&dc<}E9l_=gOtl_bZaw$J>7zw+a!KT@@9$1l(E4*2n9Vd`9q z!;^#2$SQ@+a=IK$&1(V`f=K__Mx6LCU8-GM)ES!J^Ab{z`&}PvgLi}24>Bf{>ohGf zYil$Cm_qUJk4-4<+Iqe=djQmW6?kowLZUIvlC+J8s?8Hv-SScjQUB0o(rpFrVt8<L zc6#ztg?qa)gPAlyg*p$IAMZ$dGd#K0$-$p~(p@-<(GSPxcz)sd^7!E7_)iD?Gy`5| z7!5D@gJC-cOwMNgSF2X4XsCg9G{jT#uMRKIE_Q%K3>FL9G9oCo!MCa%7^3Xuc7>Nq z_GWkEds<5BP1UW^GzX(!6i8|oc+;ASqId{`M#{V4X_G*o%h<@*$1e}gUn3i|P*1a{ z)!kJ8`OW?9{ou(H*1i!~`8^=zQ!-$4lxnTf0SlieH$lHs;JbGcR;E{<`{;hWfeW{A zA3!zJ88rZ9cl{&RTkzf)r2%L(Fx97{Y#NCHXJEn@aVvL%E*qWpVY4Ya=X!rR2t^=? zn+nVk4(K~H*ST80*SV?d`Iv5aW^f8}rZig$C!y)T9=u*}D$t8Zce?QXcCp@GttTt= zQjKgAT*2`}#s=kNnY$FT8*)n9$Zk)SuV(84PiZeAXbj9(9lqUM|IT>(dv~+DvOtyR za#~J{P5GWgK)a{{ztsuuFvGv&DW{?`lNx1*I}tLw>O!P@bW*iyDVG>LC`^R_lKutd zuCwbW-d4fr7FV04lK}7x^(}E9pf-0sz9~hki1BpF&9=t#;<g-5QF97AMpYr=H<L;I zv#ZdDN`MO}u3J4Kw1wF<9BCARA_MsS!H;-|2-^7BmtTJQ+2G^H;5T1=Myhycn}GnS z_}g~58T*pM9~P_SGNe-fWfw4|Oa!c#gCtCFN2n&y1go+Y3YpT7dCD<OWX7~&^RX4T z0U&aYLCP>ja`_aB+Q4H_R+Ssp5Yv*>iWQ#+RS;Ujtd8)pmS7(<JdBw-70j+X3eR{l z_jy6HNPWqa7X}HS>B2j3>>r(9Y^jO&lP=h*WaE_f7@)_#)E)%18(rt1PlQ@a?O3mr zxnt?9B$pP**jYIu*_=|28YWGXVvVz#7W;P#q)^~=Uh|4#+nsn|TF%Q&-JMb<k|K?@ zPmRWH%gBYhDpi$@UM+<LZJ}E&|6r@3H%&<%b0)?I---|fr(C!Sq?sni^r!*8rlIEK zPA_bhk_4>RVoPRN8@*zRBn=>BA||Phwz$Ofn9OL`OYOZUcI<0CpCPLv_PeXu=5Y-9 z9G<n$scrm`l+ob%Q?zNbpkUOUO@(R&rzP6oy|dW4flqb1)Mo4Rn=Ms&U_38Z;x*WM zfLHxF&c!!Hxmr=jFB4PN$8>R^G~jpZ8@@YevQ{=vkdu+{<_O~o@K+`^_~`=t<`(V$ zriRwYw4vOF@+fdkM#JL8#c+sKTY9m2&hREYiyK{}kIh||o5`*6sVh4aI?n@#{5};R zI37ufvRtKc&+V4&0|CTV#oh94!Us}2MpwytKCPuM>=uk+!md^E!tAF>2n<@PQog#L z{O;K^<Rw<?(xf@8q0mv4b24<%M?uwf<ilW-pXl<BPaZ<Z6aY>;81L7iz_1~Fp<-Sx zZaBSS!V;b25no6k^BGlu5u*+(fB>I%g3FMsi=JX31DBwc;&x@(IR>uQU?j~}W9H+@ zTdOUuniuZ_8FWShbE9+`_6RiO@6HSkZ_A&p4{%v2OqTZ_j1soe?gRjlnEf=V15z5< zEg0UUSZhZJ3|gvMNUw`a_INLrjpkslT)ZvkNJZG*k5_2CT&{s<wO>a#GbhBPQ`9@5 zx8w|}D;B*utC0wA)wD5$=B*QmV_Qz^#|K?>3KAFb%$MVl?YdkQv#I-FHM_ap5CwA` zVZBfccQwX0AEZ|nJhQvkKQG5Ca{7vEdIH4Dn61mdZE-LI{xwk1Pqn?OR-ebwkz}n3 z1Svdq1u4jd4+TMhVVk78l3{6k<V^Yp=b=6c<6)#D>Vus;8<<i=?F6I{gM8$|t;)$- zF%itstc{e6FvP)ze(>WaR#qaNMM;2+ES3ks?wG8DBoMc={=g>sI=6OHr8cSAN+{tz zwt~Y83qm(iCk}e53#B&OhROOs13SQUByTiH-Oo1szg7h{CVmmVulj{^Z&FU1TQr7_ zKA`9WJ>z@oNo8<jFmb({<8a++R2@Z$Q+8)9z2kRm3}rw#pr7I;1_YzrvmxKT(D202 z_V552q*lFQ9h1LX%{FC$Dg=~*t!+%M<=3Ih#NzG~^paRFffdNO&r4>(j^5wT>h!=V zbnB;R_W&->L#^*SJXNOHK&vdb8}$Z_{zpL_;k5?QA3+G7eg(oqGCmr&QV_k#$S03t zZYD-_S)mXSnw|NC_lo&q<V!CQ@I`ay^AX)e7%FFZ20d1BG@Q^S>|Ax;7@9H`$|Qcp zeXg88<hXijfWQ5^tD%aOgd<m3DZ``F3#IT;U)i9cDpXwNqN?Ytf>k)Rx>FwVqVNeB z(19(@Dqg<2eDUvI$r%;ZQE?qt*~Mmc*4+Tsg$dOOsor!36%xExoo;trci9rMbc?0g z3Tp$CT;0y5O21_t5AigyEyU+FRH?Gd-_TPL<<&;&JWi?8v^u(yY9CKm6rFf;IUDY0 z+OcI0iX=OB!7n?F$f()WVg(mSbvjUb_EdS%EQ;(1g`pjz=cZiXhUBJvYH0BkW#U|` zgkp63f(@dst~Mq2nvhx@*}F=Cszt7pGVD<E%qR=x(0Gq~#_yIZq{A51Y(43aNdH@u zP}z*9^LwcuLPq)WW5R<I0`IawN&xsU8EuDZ@qLA2p_<JMQkayF(HVv+@et6FCZ5Ad zXiB@Nj|z2f!mZE=3WFZQ!ssiD`yN+lxbxe8^%RITTXk9(W)I;v;1+&V2>hs+6^$u# z{DAfNZ7G!sb<;Brs?pyesit$pPkh0^UW^ADDsrv?nBhKH_+s?x3t&UCE-G3gvaX%0 zN+dw{RNA1W9!{>;$ClSfCQojC5yssPg!!|v#~``_!U@^rmQJzhHGxm)G}=!hCS+N! z9pen6Px=9-4`i_kFHobfdOIuM`ABntZ;f&-5#z0sLQwv~1_@M2u%<iO12QPTcel$3 z=abFT`xWfkYJ<Z+)>Dh+<|!;Iw@RVj2Szb@SGnkQ!~u8j7`XdveYsEex&mF1@KNug zkCvFO&YD7WbQy!!F3N|UQ}0A8Zp7M48_%EGVVecTrUTYY*<=1fM4zMr4fiy;c`N~R zxyn#_7j?|k@D|T7S#IqZwsrtUAZzE-i^**{d7}^l^6yYBq9zFMDm<eAyP3w?q4zEv zW_Xdr5zsm)mWh+vSOOgvWjW?z-tdOCZEJFpnsMSehtPg_t-yi`MY_1b1nPsja~Qrn zM|TTV?NbrE3*>1yL7|-)3tCXCHuNZcKowM3Cq@;6!5vl6&PYI(!|dIcZ;%lmIU1%M zJ(?=Ez0}--o=p;$OdXf+@3)H^eJq9zSjWERl;H!biUT=bGf{X$v6*+7sLw3%dbz49 z6z4?}CI)+}5^mhugi0beU>`15?rC8L!pZf{!kqW3Pr*FVOtA^W7)GmBPG;@TnS74| zwBWzGC|z$7eG%}3Vs$s2t@iiurwbJD2~J<poH52P)l`q0=JkuqYIlU>wB0u_nQreH z{(NA0NC;LjMGt`8_JY|7PZNT+nP6rEE_wiQ9xZs#1~celgDIL_4PvPI61N^azNCa9 zZO3igBn<`Op6I1(n$vm!Zu(}dW-VvXy!%e?-@%jtChWm?KN@rrZGuLIwh)-9JD3!F zsf4Sh3fo5Y2^J)i8@E~&+>4n)&}(fPoLOumXm5cP@wtI%u*b~~@lBH<CX6CI65ZtI zdK$@Vg6iI4&7q68RuT<?wFN46RQ=}SAb@caMHxwwF}cfTQPR_d_h9_Pz_elmf@bEB z0oR2pv~-_i%5r>{LCouW)B{v4+p4@<qG-fG1GK8yOn8C&{O}y0D2wOErw1258D6}; zR*ADpp|c>q4_%u23|uqL`UF-Wdq-}$o3E9ga=aq_1mBwia+s<*)a0-K6EdO?Z~jaB z=L0n7K<qGCZgE5GD??N-Rb{#{k<>64&3J17tAd8q*_Z7?XsD}TPHPdImr#Ew8(z8+ zBp_h0ho|x=3H$6T&0VfE<v+emMazVOF4H3uQT5SWoK(S$e+q(i)B9dr5p0{;Vv9%y zBa~T49L&*<<UkKT)&p*$?m)u&cuHZuM001M6O7KP$sbeiu9c2xR-FV(XunRx9uT(f zs9fXR!NcWbd3QHnPz6G!Gr)5+<DfogchK+NG&|>t2b^#uJTWz0^ERYf@~7{<A&AhU za5iKhPoRGm-Uf7zX5EpB@ZzmzaFvIEYlIV(eD3B6!fX+lum_;iUXRgmzIN$d!I1|R z-o62$rew_*-C^sF%7r@Sfr)Y&S&DJK)1!8^v)7{lX~tv&VBIlcTC7x1(a_!`p)XDU zl&UYnw%%d7VfyYHqFzLv?J`k;^EMK@;5nL!QlC?R{xD$=EWrasK1TO<3VaNB&3LP+ zg&hJl4X!}=j-ijf_^LeGOut57KMgRrupR=mhvNn37FZk_9b3b4z5(cs7vg@x1Ar?K zzAG=>A^^~egRzCui@Vu+jdvl$Rr9LYJC`J(P$oQiSTfo#)_t>U9QNW01#cH@tJo%c zH)eEbKY`f<xDO)?*AF8JRv~m!iws-{QzA#zgV-8i1+sS(gz|lf`z{rKpdP3t_?_nn zZ`$m&K4*8(%{{vc@HJg%Ajoq>g;q~&+T5xOm<H$j^ao9Mbgjmyo~z)>5#<|pfjJ_K zXZ#c<|LY?iys~Jw%J|Xpxjf>)5!=qtCWh9?^xZ>|+nPCh)LuXF9M8cR(h!h0`1#;d zoK>qi^bxdV451<X71J4GwO|+%Y#h=62&C*N_3+*@vg&4Yd7=|avSUNpc1FV##*6`_ zqd+BL?2g*I>E_Opv#J}Bk$2%anh{Z-(||6oZ$UW~qtS^fEDzrQNT-9>>v^YKwc4+^ zQ)Yl_PO5fYHZMiqs8m!LBUEO=VE}%cI(Yos77ZwM&fM5&c^lBqmDUqHRfq?KCNd-! z3dtODa1fpb7+Se0IpS(yCfn6|_Lh#-_|XXf@n~5S17ipo&eYnxNeh?_{_MH-e0KHz zZqDb&sDo9P?s1c9w)ucc25OGKZ(oq4!l3nXj)Eri#aT=?h#Ufxkvv{~BS9|(XSRqe zh3V{SBt$W2c?#-a=`J0~pEGkb9+Ii@@srurA77pfX`<S2`|j10Sjy~op!YDHttp?1 z2O1=%i2nzB`aAFqRhk7b<WEMssW#<&Eg*B $-H`*eN<tcHN4+5lJ+oIS7kn2YP3 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 WiAB9WbB8)e})2-&8?9W;Mj`?|V?Nxy1 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⪼8#wz|OE%8ZD+YiI%#aW8Y@u%)YT%<q?>Ds- zxt<2C{Q!<QLXT{y$wT!gduGtF6|HBm-*y$h?Trmrb(~pQFzixlciKj>9$b6KxP)-c zO2Ey>+qMScKAbtK6kd$Vutm(ace@m84;<6RkJ4;78+e(WKzYkuA4?vnAyRC6kUi}{ zK8B|p><u$KZd4%d*LazZ-j??__hx^KA$H@%Q8aUXdb0r5$0CF1&ZnjJwTD8->ULEO z!D;2Fe6T*xD^00BNP1#{SF!KvGZ82ZBopw)4R{?d+O!eqa~lTuUR>?mh0$8xuiAB2 zK#bp}zYbf~*j?nya;JFSSN{9Lg!`WtCffV4m`dLccV|Mvi{`Ww+9ex)FHBCq6ejOX z=ns>_Ulk^Rm;Ce}fdc}{v~LGHH3eA$RMzJ&oncReM6xfBQW3J$Au02x<B;(cjsLG6 zi@&wp-=W(7<HzE6(+3Za#r)fW4P2G{4^8a1>4P`^0qVdW@g_cjdAMY9gi5okq3tAS zH?O0w!ujz=V_UttQyY@*vuzEc48A)DRa!%z_qHbvJi5RU<fu<Uy0fa&bGnX-q(WHu z0db8$+oAO};8e5TPaLluh!!Y%mpm_pjBMsjx!FJ>)9@vf>ZhLKaXPss$0!273|7q` zEM6x$b-BGDRODBP&s*C2mjeBtISoHh$!!k9VFGr&;J7Dgpj_H{rL1l56P6LvX-kNw zV<@mEJ>L}`r@@5G0u##4wT(+y0*;2*frE;D`AA|pbkiA5tMg8H6ZO70sKAV%yUSYl zm&4|sXD{f$5|=&2vRnTJY7PGoWIJvsX5ap5PW-dHQtsNKhX4NO*p1WIVbOp7$BRo` z--`>Fe_zDVkg=Uyu0Z?QGrU@3{AD&y(AkF$*8r2--;aQ=^o#fLV{yF;5LXy~m>j_u z<(JR&mc4o1k7N~GAT@my^gz^BfynSkfJdF;WNSdfS^P4`fsBf+^1gU_|4R#Nr-X_9 zU~Gb(1aRek`Tu|XGlzQQgZ&LDR5%QJ-sQhSntbx9*sK^JV}HM9NH9qLX{uD}KTMSr z;njTnFu-&JJq6Ouz7NK-Uq4<5&akgdBJ<<p;nT;*_oc&I?fKJ*0Qv0&-^9^ysDV3t zD@gvOfMkVp<7HS2y72D%+qN*Lebdsf=5o=(YgxQ@=*fT#RrQs{!b7!R3%O+>^=uR^ z$U)xr=%%5(Fd>asMq<+isXPPrZqvh0r~TI3L56jGDY4t+b6cpnuP76Mv7g|=$L^*C z9h;##HXbd}2zJ*!n16#k{ge+=H|HFX1jxo!556!j4{$|~IJcAeleOITTl=`ZL1BIf zJtt-;h|s?6u2)*bI!Dyx<#-Yq_k4W8ljNws`XVbe>x_*0uIkNuws25m-AGaHZZZC> z8NEn*9=NUB0Os2&5Sk;1#5qJ8GrWi$B*zW(R(lB1eUXYYZ)4yo(JK&#IM-{f#ZTRn zIHuZdPNk8kGtQ*ga|mB6e<(JZUeG67<jR)pUs)|JkAQL@WaKp^whg7>gnCnIo;QeE z2u@eVy?Yxmw&zFTpy4Rq<5;y$v>8vtSqS!;mFml?9<PwW={+~uHJr^ZNoV44zixdn zNBc$W;SXfl@+HR)=%^ejJ1}0HSkpIlOFVAiPaHejm$(gWp6Mn&9~(MC8@yv1%>*>4 zpKDbOIzP7r?7`e#uo6L2_=Q+{0qVC$bF~{?W6rt;Jj~POxld|I-^ZFKY{0<%BBbFU zmoBbFw2hg<i`h6=FPV>yi6+XVj1n>j`Cf`+?VOFw5@=8RNfQ++RdU-Md~K@OM;1W6 zggf5ZH$j$1*A;)EgYBk2n@&uh`ng{;7LIrD2L=a1Xj|bBM*9Wj_8ZCV7wgrR2m6O} z>N{+~j@k@6BiBPrY6R~^CXgXm^u-)k5#IQxewauSCcxxE%bi}>cJ({GxQq->&*9IL zakw+#eZT_tIk-f`G&tk?n^MTG-H-9s-bWyG1CJk7%%tv8i95NJ4$wB0&dor<n%ci* z{QZ&3_k&QpkdVULfUuGwKQ_}rc!aJK6H@U2DqMVeI4^Di#3jeoMh|E&6_(J3APlha z+{c9431>6~7E(tjlpZ!Yvd|THYFZzybyfh0Q3TV+)AJBJR&*~C>e;Ec={eMFGLAdh zTQBy!fk7gLJpfVz!jMC`6G_NZUHMJ-L{Qcx3*F4U(-1-AWi1)eZtGnQwOSAKwYu(` zUcGYb<?P{B+cWgj7d30zriXsO){1TnnO-g@1+>OIgwYJ5OWY{0a*Ep~2*+oPrr3yr zS~(t<nO0NEd=9baXZwTMMRw|4&4Pxh-q50T3y;}BS8vu@ZScf?A%|8Ip6{78vyrmp z6+)Jsyt#|wJ_T!7IK1$CpfOj!E%P%m?Gi!kny~<>azov+Eu6<ZBRx9~lTnX)kF+n- z+doK(v6b*_dfn?zN_kg!$3@$_tdjc$2YB{fDV0>FLIC$M*qyO*CC3HF;lZ8F;|Syv zp1Ap0jFceicr+mlIPW&Q*R$ckaZMXpSi?g)-Q}p0n>L@sQhSc&W0mcpKghkVT$eJY zeDNZLnAy%D#Lr?ii%`%Q#gEtXJws=3Gl~ZdDhzd;=2ObtPo;d|a>HV<hlJI8|LJv5 z)!zfI^64sYCtl;@TT}C@l(pn#Kyo$(owXp{V4m}L9SfnI?vHQv!(ZTLp_}-7?9X?p z=r8~DPyI#7g-V0vzx5X#h-cc`1o|Aj8bC4dA2Dd|0i+fDp~@)I-M1|o4E?aE-_WNY zDh4PR#I$vmH<eZA*mvpvFx=v$ehx8oVLrh4#V<b7tOHn>ANG$2?B@Zd<8zbXpzDL7 z4diiv#iM?`Rje>F(V-&m;-xMCdOrh>{<k0U?mZ^A!=gyy7ADQ$55F~3650jaNuxl0 zlgjl6G5_l!Li4}<^l#^fKT&PJz8QA@oVENEV`RQFO}uyi<0G$^00{o_z6PYZ_qErL z-`D%=0$Tk4&iD2Hx{&{^@9X__A^%(7*Vi}u{(XJHQvH=@20B3BEHf~O8tupaig|F@ zO;mYzC3xg<bE7o76MPyZ5JUlL)FQz(R7gGc6-E11pH%O5mQi`TPh4<N0SqeL;Ku6Z z1_Smp0d(~er#fV)fDMMY-d2D^3m$qMpy{zcgS`BN84DzqV}jli&|UQ(pxE1<di{Fs zpIYH=$03zF`F;bVx{C#^v2Ax1*#jGZ7W9S?MP2me$@T9lQF76?O<5SPZOsxg;qr2) z!1G}b;Y#>&N#o$enGn~0l^6rKGL6p2QlM?3VH9lSd{D&j4(3e=#C(yQ#55pWgBck} zcQ_yG8%V6!0_D1+`{jAv6COW#5a3P8?X5dF4&g-36Qk^5jMa9JTvKmz<JRMaC4i#d z3Ad8k5eg(?q~@4BGa8cCqgQG?4<WIj^iZPQEqA)ddV(T3d7V*R$~3J!oW_cbkQt&m zl+bMaUPwpq6Q85~joM)h9t;E39=jfXgASRZU^n&S)A0^9=xbEQ3Q}um#aorbQ^dCH zyzgE?fb7A=VXYc^Yx7$>%ze!%G7vnd=Du%kH6UZXR~P0-mKWVF41q~4s|IB*my$pa ztxy0QKCFO;x>Lo7M)EMdGY>;Cxkj5G2K30R0v{}?2j%Z3X6|?i8c<R@9G_|)-Ez=h zFN(9&ScEFepuQS&w@^2Ri>}x$MC2#dT!%Hor!vna@-`k10s-y!`A#bOdiKx9Yv5Lg zjj$y_@Vmvz+N?6{X9E9MQ7x1$@`h!6kfRCgALE;$1OL;pTBUch7*}A{={i{)DbazU zXhDtXq5Vy~{+%?%xTLS$&b#r*TaMJHNntBzLyf5E0cA}{CkzC{^Qh4zhog0m$DNH- zDL~E?7(41Lgd=;d^m^jDcyyPZ)yrE-51ny6DB~$z5*TVG1P3JBo48_XcRQbHi%fWh zy&R4_5tI|M*QI+Y23Wqc1$C?5%X+nlv}rbnREm1^B&dy^hj;Y!xJ8NusKxd!VVpbE z23FL1FDJ)o!|qM*tos@gKh@QyNmkp5gARP=Mg+R<7M|(D<mf)kU)3df9w_j0OwlH} zZ_9BCt?ff$&H=CjMjrJc8ADe$7wb47kng&QMav43tqrHR;{;%q6wGywb=jupg)uh} zDHW31Nlsrfsn^s!bTM3X1mL{)hvqT^FhQowtkOgj&?)CLwoRT%vy+=EKXHTy^*ROg zrKktIAe!!Z-<Rp@c6(@;0>2#;|BOSo#>IvftHj&uSy`lgz4eS1B92r>v+1wvTt7vS z1<3NF#xLB3ze~(+lFmZt_E%P*@=kB!QDbn;<@d?)dErod<W-|7gU%Io{|2KSM70Vq z{8$a-S-UTlxvUF&S*mddy5I>0={E;#bVm44s+PaEZ0-(%1W3CxPExTuN6{su87*x= z+#^yFf_f*PATB%wDWld!Bp=wx8Za|a_Zd(njxg(I$~`X}l2gyq6>$M7a`~vSo4`Nf zc5_s!a@+-1aex3H52>?W!n+%B3@lz}ipzC(@Q4cvX(fN(Suw8J9fD6U(|^8?RKHb5 z=N~ZqIJVvYt%>HB%INElh1sZL{vI^<-iJUo2(#Dkmh|MQ9PYcz`MMW1IATPg(Bk&L zw>q0&Tb%&>7S7Ov`r3jBys)W2UACrp@}?;L#JDs7jck5)T)@M+HBTW()d=&Mw080C z8-8`w{KC0}Odk-@o!|)xA{SEO6^P);zBq5*r4CGkV32QC_V#o3s=S~wf!QnAZ@@o` zg%$hTZU47-jr`qhf9nH%3rc&_Isbgu?~yBbwf}173XV7)<LowIK`v_+j0>Bi@H`Dy zHZG=SJ*HagkWcrPI9+i}+C-+1sXWb<v_D@AB0Znt=X!rynG3d*)7b4L$b0F*RriF` zHWQVFTXH)(=?+$$mJ+L7Pn+p%)BE)a9)hFKB4>lE0-kmM)ZPR{`SC;O@f-Ubd;j)x zzOX}<g}RVzz(=SU2x^_sv2Y^Iy&vt8pG@yPZiZOV0^IhoLWnl}?;DBm>)+YS>|hq# zfE_EQYhvJ!%>{`bWT9mvMNiMr08{IcSOcBb=2f*GzCJ>zaw_csLv8l9OM)1N9h4M< z-YO8L63RJY{Id@s-l+yUJGg4h$*+KYetqP2GAi@5-lzxLU0G~TpSE_W9O?UX1{te> z-#p^)<FdZ5;tyKw&p6xvXIHT}yqR(2w{R_6o~(!qHu0pJa>i1_vptAl-1<e{30+V4 zc7I&S(Ee24Q;YwVm5h8+Xul}V{>7S*OHhP*UstjMVOz@bbtNP3rTkvrFyvkT@2+H! zWBm04=)b+|cM8V8?3MCbxTkz$2ST|-2sywhIJnMUFIHks2dOr04FXowA;rMjd@R~z z3(CopbVE_Tu_;Snnv9K-8Mq;kMxX<jYMr`TKXLjw!jhafQl~YVOS8WVgMYX8XT*hG zfB8DQ0?EN1ZEr2xqaiPQ9QX0XS0Ne)d_+JUCZ{gk%DNv>W+Jwbcdg!eZ3YJC{l?Wq z3i7GrYmaO}mGI;@%98457k};)91K-VcxbYVnXS{UkRbnScs)=*6Y1iF!#=n@^JY3z z@?Kqra#9Be@{l~MQ&1$YAu%9OOFv?|BOQt1Q&%hD26)EFT#kp<^IvW=5Zg_A?V8;s z+623zFqhJWT%@gXn;s)6HyA{1?G7TcNLg2^eg^3}&pp-_W;E3#d4*!PH%o6sgUs&k z+soRPz(Kv9A+Se1JBn5J**y^UrhcTo3UaKa_~f{Vp*NHw9G*P5@Rk+O49nxV?T3Rl z7Srg=2X`xL&OuaELd{F`893)eNfP|&_Z$^cN}L3l+u~PfatC)9Q#(Dl{xAdOCp3^O zJK$AQfFMV0r7ZxE?BHp(L%~nrC;jr;X}&aikKuJRw*w*E;VchlIFNE(OAst0*d#~b zH@aI8oUw6s7Dm__mcxPMcH1?}_2|CU)S}8;PfrUxe;l=Bc&RH%cQRxO-5Dou+7X7# z3Z<zC*Lc3D*AV4<8PU_zRD)tU$EY2W1vxW?^g7KT_r{q1tHSTESR~+;0}slF0v{gh zKOF&nYJYOslw5YFB~$1Vl>F5T#?jCHWR6!*kTSpyd4bN2kvPPhefS3hcr47X9ho=$ z?z1hbEns*jI3YQy)o^TUkiCj&;dMg-s9xO^iy%?yu0SY#*inEF^iJ0(7|6!nOGieX z+%<@x9&M($UUWW~XuWnf#mpV)t;H3Fd9=p-A;5uhH=msHI8CKYV@R&yYEMI4@Zk*k z!LAECNqL7*QR6^7xJR$~F$oC_4{Ayr>E6v72yC#`Fn|opG&Nqp*wVu|7wv{nk2P$H zW*~a_F3k)L&LQk64ju&V%|6+dZtKJ92f~t>X3R!RB&(FKsTzg7iw}7bX>+cUQL4X! zQ({%;8QI|VSSOOV%MV7k=D2r~E~tc^K^8*ok59~TFb|lLM0obEDxuuVrx`s~9^#3K z>=K;z-Tt^U<(v9C^9#b<WTJn*j*s~j0TvcC^2<S`jt3aMIyDJu#~G`y)B#Mrw+UPv z(0BBy8KPy44e8ZmDUFWg%zd+|=r%+k`>L=VPS));e4S|Q1}RU)X7qxC%+frd`n8DN zB!1b+GF#*MEIfwemFasabQ5I@)=I8>fL#4HGmC)i(NL#JgGHsmh8OGO?OIKtcBDMi zI9Jn|N6*lFOQ4Rq9CAyCleoF;5}Qm@%)ReHnb$%*3yzxOs(DC;*<lJA`UA=Zg@S^H z?OGqSCnVf)a(yUGMi#G*o9kAs0ZjYQOn8R*S3DDM4_GzjzQa@_%Q7%CP&`6v>2rDs zuc!fsKVUger-XGFR2sR(nJZ$r7pU-eZPD}paaS<mb>HTye_iVTQ@fM1-^IZBTfP?P zDja3M0H$qQn+MQh{~8xy$ilZ4=SPRLF2M^ed|B4E4PLgA1F=?_fprBYiQgxU1@yMR zl=(>r@^jg#^-72g*8eyL#P-VyYSDK^e|lHpTMNctmIq>yipjooB@Hq3C!gp6MM*xt z70>{Q{AhcAAEv_Iue`gNV5LpIQKo*n_*Wm}<Kgr-p8^3e&%gc{|MV$9v-YQt!6pW4 zNbE8IW^#963TV%9U;g<e$PA`1&^U&)8|YWa({sL_QAg!wWZcHE!;!oyV<&(%fPLq> z%nc=DAg+{$t9=JGdpF(BR?ppH@z5D}aHZv_94_-7d|UK+8mdo>ApIeZ&4qVw=4Fcp z^ATJ0XSLH$GD}wmQV1{<@1Q|i<~zNYzzy?6o+|@Wt51&L_i5OlU;O2@Kg%o&Q-$JF zVy*&%Ou;4J?)rdR)3SuzpDi?!tF+3L-JtQg{k)v}b*~@HR4X_LqtyG<cG1UqOBn~W z-mI$`AD&**1H*5&knuS$Lo+4l`H~s`AZf_pl<g{#`EAunf6SQprxhnUZz;p_?GUXB zHiJzNC1_qT{MRY^yOU)IzpS`MJsMz8M}*IzfhN2r-U(FS2UE9qWg&&_yPpGquio2T zmW!t9V4#q!569rc83AO8>YMrivLE;uxNHhxtY4zXD=>8YaP6<|;!ih${C9T&U&r+~ z)hPRA_dX)b`w3Na+{c8|-~kMCb1uGv<;n%+t4Bzf1q<huM@-5shi@$F1sg)UaytqI z-CG((-65h5Mj2i(5-~yI_iXrKD$pLLdJjFUOA`8+l0Y8n+z%ssO2G|6+Aj<*1C8`? z|0w%<Q_(Q*NB0@e-jjzi?UdUE>?tYR&E8t4VlR<2A)}9tuooT>-R6#)3^Mc}QF`KT z_W?-ip5+Og5#QEh*|(^h(Om0A$5s-r;aP!*Zv@26$KzTu<B{SV{tA-zK|A4QZ0UA@ z?IC#q#G1fTG^DFGW_`9%K$Ebz@XNRJ<0@~i0o}P7<U%GFvxmm71wFbkZD^t%v<;5= zRENj?tQr`8OqUQ+y2s(PhsbH5O)*fL-y_YBrk!XQg-&dsvW`k2X%Aa_D3P|%tGIz= zU8oWtvfdr5?eWenFzQXO9dSC6i7~8HcwfZDbYEc5uTSII7=3n)iXlgJ>O=?Ld{V<b zfg@FxB!Dgy`B74-`OwaOXu<sv<`ssco#pso8QyF~BEM<nUdqs8C-FP+)cY(AEBkhj z_oyHemznpT7vw<B<+z6NwHg*kv_6^Z0j)^=h&zg(n4Qg(0lUFAkm0se%VkIoSlaKL z3NjOlMbAc`7XjV}==VL8&B#iRVpy+~l;rnqgLxROW`Pb|e2U#2F5)CZf=7Qk0i<$u z{Dk7pp;Ks%fr63tnB9i^Zt@y{(+AM?)RAjf3av2+*wXF4X2#hSRH}c$hx(Jp<!ini z^4TMCImO-HfR<D2*yz62FEyu~qHUZ9^V?zlyB9MC!_vdLEU^L&;?-i2<#p0%S5>KV z1@PUCWNgV!vMtGi$=&+OUnEnUlQ?w9Qn*eVpHp_!<Kd78nIK2<jy2oFKhZ^ayMv4j zNvZvATge+WYqZ5UYeRm!xY#X)ROh4ydlqqz*WOs8Ds&E81EV!i5ZwB7@GcRs?(Al` z0@Rypf&<F3$cBk;n|+N#khag@$!_OJGk#?+PQmUNPHJQjhQv|%9Dq<#k&yiS++go; zxQ8jNS&^#Q`NYmqJ8@J(A~c93+hd;d?O4})N5OZ=g=jeGY~>6I(bKh@ykZa%o68G8 zyBaYJ-~kq=g_mj*0^%=+R(iI~)8VR$MA)mw`-^XEL|Gv3`>U1sx~kz%EQ#u7$}u3) z&R(IwY#>?{&E%~pNmCJ~?ETA^Z@zym!$SunnXqm`<TOD?Dl{N3S}y!WvHDl9Qsacm zRCSFz9v6hby)ki243Vi5=&-eF6iVU|8kpQsI}Nx#w>gjb;%4#@cfM2@Q6JK9QWqDH zYOP~GUu)u2oeh!F?Ge2dd(b2FQ68Tn`BuC-g6<OabSFtp<#DD=>f<9idGgLcOrs^E z{b|)isqL4?;9dqZaT{xgk6ur@l^%%GnVE&<usL&(&D-Jb9f&)^R&QJY74DmBWIUy| za;2S#V8$8F9m9aKmJ9Z!OAJon!HMy`vh0eDeYnOOb7J%Jc5g(s1Hf8%j+a5MDn<6U zvR&`32zZ^I=dbw24<rT9c7BPW{nxGUf84O~x8sQZ#*#AFOJ<c*uhLk&)$had$4y(2 zlplL#?^fBn>-`<@2t7<UoX1m0KHm(8pL1JHpjZH+8mDK)`>dPZxvkQd+<Cxt<46K} zkQAS5c!L&nCm+TLsHcAlas8x6Iz${L%@4dr{?|c1<j0HKFRB3S{GHbN?xD>POACqi z>Q_zTPuGn9KYz@>uRDG!JM<>^-BLgDXBUfg3#@|&1WwL70QYFehX};sW#G~#Vk!{4 z<MM?rP%Z{K?}3_EELz*~^>}g&qlO^#(_ElY?6OEw_z6;2v8iM(h@K~Kv{t+*mnG_z zgx9!2p|6&2f|X~p{IP!<7=WtPMoL-s+@pF~&>27#&3IIGT_5)*bKKpwg12J_0CRY4 z$MhbP4pu{oczR#yZ8+kPnV@Xj@fp3MP6x0(jh>fhuL_<CAgJTs%{q~1$+Z`}{q_pj zvWs)*kPt#i8Ey$_%vvvfk>utr%MNu6<RaOW+vFhWoV|xQ$~|*kHub?DvzN0!s>gdd z>>w(#h`|5UO-FTzPy|5RMS6ek#BOi$+6|NN85b-uhC~K5Fet!ZWRNsl13V2tv_Krx z*>%sJ3#IY4jWex}HEge5jLMp@!w_!WA4L<i+z?888@9xjZ9}{qlttL3DiOtFQO)<x zcs(4!TI0*BRIngxmlE(q%T<!7gLK=&SV+%<Oh6vOZV<WMfuCPzV*u6Mg9MeQwqt#^ z5;%P|<}H?W-FWcozB8e4+i`-P`G*~b&l{(IK5o8jZL84+NgaY7s*@V&!lB@11+Y~+ zVou^32wow5SRZNV;8rqUoo80+FhfS|iFr7gbtT9$wln8q5k+!z1@T}4K^VEh%+@6) zRtUH4^t#6HfC1?Q{d;rW*G%N2BCkCk?ljYyznxDxS)PygHT`4R0WJHV&vZY}*xN!1 zGmwBzVEq9NrughOz7Cy2O8(Pm2Lb8&FGGUwb;nIMU%NZ+?Y(yNz`-^+nk3Fth*_nt z@l&n4(5hCqp@8?w(cj3(@!F<oaODFY){hIZu$G+>R<TRsRLoEL315Bj8C}kgr6z2~ zmtUmg0;IDhE<&muW{E2q&bVx~6NAY}qVf=k;1AvD3V$O62~r~+*zfak!R$ubpu5VI zi$i)OopGDy3cpJkbI`Z}8or!4fH1VU-t5MSroI6(X)%$tnMXn+Y^AtlPh12k!Dm6d zjBGY70nsQoMJ;Z-Hr=ZDhGO_hi}TuCwh~aau#oLffJo~q7k(V_1Pa0kiWtaL9PJYp zCd5A7c$N9^N^2a&Vj;1J*j~@)n+6QY1Hek3bvP3)f52l|osx%p^o$dC+pJZNz%=_v z1!V}<1RlGbl3RjP=KaLzyAtR%r;Wo849RC%f4>h6SvZ&ixxTo49v&p~T-~`<4%Y6X zx!#Og2u)HE@w9H|a8Th7TUSB6zIm*e&m4|!L>SK5I-G%PW9M@jTr=r(4i-C>y{VAY zj-#opZBeV@Huiayk+`B9m%b$6hUEZbM#liWtz^TvI9(1%7#f09IF(pS0~3xby@4q^ zb1hU->v5VH1!(Lqx^@yO(H^u1LO8^-lSqpVz+a{^p*GkDLEz8|SE~YKltqid3cB%z zyy`059^@MYWpR5?aZ$^dlksL@fa`?#1@(AD@PpXPmZvRe4sWg2g3P^h%F|&l|9$-I zZ*|9e{C)(Xz<>Vl79ii|@c&eaaPh}c_?rvD;KTmHfng)!NvFvVAn5uzFbB40sItcw z_X%Bq{Lznro%7W_4@4#7uc{D_#r{}@ct2Jl?;->uV1BDYD4<q-boIawJ^w`&@=kdw zd|ug_SN2;)g2eb|vgJQiBrxv#0-mTK1Lw0!`MCDuM}Egfe*4T{PG0}xkBop)5_?x( ze^Ge-S05Sq@iYJVBmavopuFFwR$L)F!dN(?FUZEq9<6IiI=ibyjUl{>aZAD(jKu@W zx?~xhDTcaK6~X{hsDW5rNAF~o<Sp08yaVSAH{?j+73Ar%e|b{<9N!$jjBkKUmPs&+ z|7m>FVS;p5*$KgXh@CtIngDs#Ks?mlXZC9>8Sj7y%mMc}3*q5-K^5U03=jz_&uO|j z<-6tyLGaV7S`o+C4aBP`d4Ohvp7q91jQ9+n&Y@X%Nw!F7YGo!^x<Ml-R#A4^jZ3zR zoc-sr`m;~z&#RiCcmFT0>h`Uwxqge8hA?6raw(TYrCjDDWcy!MHUHzE_>X_#|6f|w z#?FK;<JWV>zg^Y1$(z5PGd`~U_>up=x~h#G^5bXzi&c%kjb%Uf_F4A<6U;B!Z_@L` zNB)-MMHyjFq<9OW8P1Fk_gUD6YgL!-=v^Q*0rFu^)`&($i89lYsnr1%w_$6y7d3{A z3!JOu&~R3Ldkxx^dftJdRzoEr0w{cWRK7^Ic2le%;Kg?RL?04yd(`5RFPjd!7trec zEBfh&lm{4UG|OCQfwcku^NL|S@S~Q;35M8Ju@TaVoJvnMC=tf0ZBvS?f0yjE(B5Th z21YeZqD79QqTSIzVRT4k6M^|Eh-vPmfYk@KSC*`G(CRR1E(tc2O--eJB1ZQyCbIho z(4(wDxVvCP52}wz^+_g-zPZKMrM?`ll}r>Hl6uY@DuE-b+QhxwJIQ{xD@}TGAO`Z` z{)6z&WCFqY+I0B40P26;dHB-j_-nzP*u7g1yKnK1J_C*uc~ErX5{bq#%r@rCsF~QF z4aUu%4GACFZzqs`7)<>MJNd9ZZk1WBnEG>|))}%-vOyiViU5@X)>uveF^eK=*nuN? zTh;s&<AH|QgZ9%G5gx*G4TuvG(Z8}ExovR>LAPH##$T8Gpa1;74IJL!6M$&?ux9v= z*1`%N$oEAEsqjhDYaj=v{$<cOxrQ4<{r3rp;#oK$eBJ~X1g7fMfrt2D!t?~ucj|-d zfrl6vdM{{-z$D|-%?aTZy;qB&6DY;k5V>!2#Ggb*4R|Q8?2kFw|BcNN-yS6|f{yFe z9_~CqO%Y$R9yN?$L@Zd~9M^=`M(?+$!rd27yN!B08tbqUn_<o(%rhw5ku#e=0U$RY zC^tEWaZl{fQfXnNil9(kkJ(-AQ0=l_MeqqJxM55#1D!mhAt2^9CHJK)U+G4WJJ*wh z0c%m;O{CUVJ8<-*smhc%T5P2~5}Ehi9Tx5Fa(07bhK1;DLtSsIFgaeGoYp$H=bN5g zwd445U{1g>7deY`HJJ>o*_@06TWY(UIfQkHBd1f=qs!5P*^1jTkY=pKN0`mHRU}xs z5khA4N*>gQ_2B1zAJTiDJH(J_@xs_wdV(j?Q*Z|ys1{KIc;Psut#s;!Cr2BQhIbq1 zc+*-bxvB@xJS%*sG4XT%1m>L=R!U~t5Q+SNPW|3?{Q>G2?3GHkBwyNuSdl<ZEr0FU zzE{~j1iV&|8nU%pZ96_r^!dO;e)7Hd<zpn8ugth9{gv=fxVZWpXnkz*BGJly*R7BU zK(Gj)<tY#hU51p`RsqxYSl%-WeML8bV!9u4UkbZg!Xc)aQ6S}}!_Fhx9_L)@jE6=) zwlwDE){sSUa=Ic}ZoWXYY);s`?#m{dgAuha)R>3NUc!$SV*>S5Wv`RvPy71Xp5}8B z=#=a}tUf9ngPPeXFw-Y}t`;N)Bt{`Ur{fu*;VakN>nFg%aSh5f^#OUdFDZsCBGEx% zJu^4G&lTGM`GBN<mG1n&z<>w+XEYGjqY6RErmhpv02x^(F`(b01HXOz^Hlf`Qw{`n zj6Xf2J|#N5t`)ik%qv?Wa^2ORT+O(Go?w-h#`|K?I&<i-GT3dTV|&*Sd@K9@{pdHH z+k_Ikfz)A3-oWp$3|Z29;1lG7aLLOP@8b9-K>((-${s}a1fyGk#xF2cgxi^Cg)Qh; zE3W5BL7vyOr+iYky220v19@TYqpibe7V9VKr9r<!_h<6yY?l=90#P6<P3MbQzLWN+ zoU+%QM5HrP#@@NhJ9kfcS3%9Gv$-?;<lHGfr<Zrkq(#zl*VEntLirUasyll;J&C8S z)W+y2>z;H6EM;HWqxT9#Aa*6$!?2AGxJ0+ljXWx9R?e#e!Qs2eYnSG#bf(k1n7ASG z;il^9MPf$+2kjXcHa$Z-KUjjmcuz)ndfoRMntu)uk!^N5k(E=kMNgMkz1SDR>_#y2 z`Rg*&Et)*59_OPwe=W}Yx_DX>OLAUG_g9Up$;d{SJ%us@BN8ri-Qje8<(*=F#M;Ad zw%mr1Dd`rP*=4WnBnyb!I|p2VXAQVeERaFna>@EIjS9#g_1zd522p(wqD$X5_+~jn zKnS{<+OtA<L!BlgR+}$B@;LA?j}fVyi7e;JEs+IVL67LCG2a3lh|kG%L^}ylHl@^E z;r9js+qXwNz!)(Oj*#qvL-;kSS$T<{s?3%u??i}4D-Wa_QB`XIa(u5y&(q<)t<SWs zp7>jV)ctCj%E_sZeeEX%x_LaBLlm8_mwfrVa|Ofw2hKFfe?-uz{vU@k{^JU;=YR=C zaN!>%i0X0wO_}hI9f9;+AY8t=747&LFR2v?I~)W!xSqEhl{emRRJ7eMT><gu*#v}7 zfq2UdxUFkr*vwZ@;(ZXdM^NhkRQ49EhEu%64*`M$)U`th1%v1>TgRx1<sCrvGKFr| zd1m-3-BB>{jrd?)NKE?S%?lq3+@Nj*s5amYSkLiuAR_{)>kGRH<hROu|0az!TaE48 zNC@zzpRa)u?X%8#Q_<dKj`N0;eDP|(Cnuo&v%J8b5WhBoBMX7`pH&3hVDLVrGyn^a z4RE}?-vE?I$F~v*-emGU1=<TS2#Foda9=O&Q**)doXH~g!n(HKoRlx`{(f^sG)2Ej zR7W_t@CNUXCqtyp(f<dU3Bn#vRIojQ@#=Xo>)ut)ZiIDa+dkRG&)IWH=kge|OMsnI zhS5A2nSp0tm&a70B!<GGcv+JMFU@0(Bf8M0G?vmM=JXD0-ZuF~+?;6K%XaYf<?~7% z1~%7#pxSBv4XSyJvaXcLK_cvLr9b4l{Y#G)Bask3yAk4~pzDoohtxfrH!XG})vsq* zV5{s7Fa`&lNex-f@mp#CaKV}e^mk0SXu;iyE27>R(j&=x7c!19XAj!at4BXF$H^QI zm}qL_leypV$jVxFODgatJmucz;wm54{rwupLu+ZYo?M6IWdP=JRAHBd@R8j?UgII7 zH>B}kw==X7^Ij;_<%$0N%<<PKXJ_}v80UXlt>Q1KG_H_q`$wKtl1ehsYsmGSzo_8_ zhJ-(-vGB}W1{8m*hd;f=wJI7;{SrSdz?v|Bt;WBEC`%Ac5}D;Mw6rf3`}d$_Bqi*^ zuWUG(?qG2VBtS>r3l9F~ztPg(Ad(-iy_{coZZP)vpwoXO3c`x>gs<^%pV`nw+Qw6c z3qP>#!5EDF6fXVs4B-Oz{-fCb&Dh8MIhAI-%l1O)W<x@-sJ#I2ysJ$o?Rprm)pB^u zF<KZAE;y^!Nerkk!}8Y*$xeRmUn5t*r}NIi`-#B8JVt}km>$nJv#?q8HtGp@SsTA8 z%J}}UrKhBbOnKTMcdDqE{mJL|^CLBMeG32*-fHoet?!kb1Yqa+o(noq<n1RI^@r0o zNNe+v6I)7#bMXG|G<S4!(PE`KBRFJLY=?btIoL2b+(#nB6gi%GR}Y*7h4FOSSoh0C z5{HZ5VFU4`caAPAZ~&(aDjU?3;66i@5ZZk#Oh_7@*t$Do(zc{lp4QMB+-6akq1>eG zUM@JO2z-JN_vA8jEhJGX3$Gs``?NT38?j)I64;58qB>UcvqCf)5~3VnVQ<9n1fN@1 zLJ?FwyW3;pPKAQOkUR2vCq%(mFkP&W@F38yrHgze_mXSgb<<fg%!IKGzeBcoa}?KD zK(lv0Iv0sYY~V7ys$Z^Y<mC1p_)U3Jrx12}S8fnoKFS`%NvTGt!GMLV2DdG)oT+TO z7Rj>qGS|Rh5eU3?(#+{*K*$(#7zqY0ZMdmY4=9@CK9!*2Wr0AiIo}^ET%1=3r5TfD zWA15gl>59Hk#peSDdczex1B{rwK2dDs5{W9!AqAhfCtd+t|!AiOMny8*29Ti#Cs8M z(phXN;;MrlbFGGE1f+CvK%UW1LPjk<+E2N?5XYMa0{Le#bQBP%^sLDSpWFRRockSB z{|=Rbb&Wt~+}{f2neB4Vc9IM&-d8_C=1z4A-3u+=V6XbMA@Dtw1|p31$C%UgDZTW{ z9qP#JITd+VLl)1aefC_pccl7!Hyg3Tc65IzYCnZ|bk($G>#(nPL4m+HT6Hac`=CJ; zWkN1(1z)XvdkClMbpxr5ynj6hV~!{y6_isV``f@g>9p8e`$!!o;BOm*3r1>4!B`OB zD1#X6n0m=hIX{n&btSJTwRSPY#LkqM6&UD+vUP<7L4UDr?l>uR-?qIxQb3p&6EUIl zUHv#6`vZ<};2p>H9u9H?PdzCkIJdSpv_`&4v%`uM3}#Vmc0|!BuPO`9UW~9J<;a>( z#hz?RNz)1<dQg?<lN)0Bd96#NdB3UqCk~CSv<&a6Hj0%#-NO>{)UFh^dglZ9PG2ud zI@Av#wsz)u?=PWza{?Dy5_=PqL1Bcb$u8eglK#lH;5=~aq%+N{7vi8*#oe|p&zx@C z_tmj^$p$vOutEso{t~?k(=3+Q7?dKi*>!^arR9ta*C+WvV@RzFsWQeQxzN!lV1$6) zpnAGKBZD~&`_n}=(o2SyN)2Mt1AlO(hvzP{$H!rN+&$}fPP-LpXSZTSoXjrp7%(f` zpvBY6bM=e*%<J{u3Y7Ya6ZBc3&lr5MI|EPsT*@d&{L4tNsPM%9#oT*rIm%_-+I?L` z^)=4G2qb9Yoe&-gdI%?Bg%@1?SxQ%#S+A-3>Ko_(Tal@Vj6@M^_S$RB`OJ_HTd=*p zkkgJAR3f0|Cy&!7OcUrtO~nz-Nh=9*<iZ>Wq;Kz(qfL!)nA_<#-14`3GMh2iUBE0R z{nHOOnZj;MaoAbFj!7X1@~^7x-}h(Xf3`n!+(()VX=dLjV_)}Yn9XA6tyZN1)Ph!0 z8xQ__HS@ig`FU^t%CY!g+M7RH^UikvclPE_B@UItf3-J@pS}5GNBy`_cYllkb^s|P zo8uk=kedX%m|bOe>8L--b!1YIO?BS1Y!3I}W$-^Q)$#@_1Q2G5vFPkQprl%$Qe;cZ zC(|%%4uqUy3&*h7@ui>Bm2?{J(ke^HpHyY`2=~56W7s4fStTXOdh1w|<BHu^t>qUc zbHabsJbZDD{(E**>&?C388bu)T7sA}KVP5ZWB(RP3QqpN9j1QRP6g%w$E8yU^D5Hf zO1Nq3`*CZY8_toE-k_~FK%m8LK98+u1HclA{U>4PQ!pc5duodF5<?%H+S{^M2q$K_ z${ZYsy6%mhb)P!PhQd^+1q}#ttDZ<y!D)8~){X6=Kmi{j2e}2}(BZE$%cZlyGG{nr zIqpAj6i5H%4EnbvZ2mcL;y*glpr4-TE3})Q)qD(7K%)NIh5iEnb-#6?zn{)5-+J$q zjd^_QLc3D!jR8)N_p84KxR>9r^aQT$52WV9)syd6Rr#sZ1$qoCy8_Kw-rMs483PI1 zAGJEPsK1o3@Dbp?zm>4?TJZC0%O73U=c0a;u>b8<eJ%=g^>8&{o&VGHf&5GQzz@Vr z{{#~sG<Q!(<QGTwAg!|-5PQM(uFoA$(m<ye!xR%x&~BZdO(7nx(>%v+R-#@ylLEmV z2}7I`Hb#p3L`#I1^5=XTH$x&1&zugSKX7@iy|MGni691+vMDmpfQA`E{IYb9w6cvc zK4gGJ3(0X1jWTrzG*wUfs~xSOC=S-u)V7&^6?kq`?!DU1wZ7xx*ZJT|Ry7oWzrw)h z<H9bwb?5U@Jl7@|4}r*o0H(z@msNebxPyYkn6dMta#T7X&m7M^0z(`PLJfCW8h2JP zak*qv!JC4;U|qwm0PH1txI;iVTgjmvSeY;optf>E4t+9io4ysW5p>fu%@e~B0^bgT z#sKh9>PGq4*_VV5GUFM665WZM0z`BgGuQ+Tg8C)3K{q4L5*geRw7y_^2`*8@^!8>f z5?=0%YoOAGy;Gl~EY~IA(xC1zAQWMlwp+7#Dv-RjYx!Y*4T#70xPiT6XI_tDo*YpL zQeV6b<DvOZ>}3K%rU<Q)c6{ce;BTE!i5SWVN+o`jj?EwlVwmRa0ef9<5H7tvSpu|T znU^2RaCvkRRnj1>)c~8uZ3kvqfxtLJOm}6#>4cRi^3g4`gjh%gP0mcapdtzV2S|z? zKrZFC@Iy*^6MjyR2&0F<8wsczk8cn@gO-&vD>>O)yShkJR-4}9@E9Dg9J`}z73z7l zycekeZ785q98&A{R^6P88r+v(Q;`cD)D~YHR6kX%|9<=6vP?29J}w6+vFV#Xyw!Ka zV_l>!&+lnWJ4lXzK25|xlm5@Y__x#ZKXEV|L?|g-1U!xfvbNx<fn+D?%rE3oYk_~< zwTAH$qbtDFCBN@(@u+%`b300jmqZe{B7}2LK%V;uQBB06a<_47?JAcq5O}{M&TrHi zK3Y8FE{)vM<3O&9r;WbRBeRmB|3XKI^45nj<i&M$xM56=%3?YPmPeH{0u?;+g8bIG zP3hfpGTfAk%o_B3Dt@IPwuZ|g1CXV;*AhH(+kmJYJIwY9qA@masIf@~?3BMl5Q43% zqDLC78yhHW7-vVt0{Dh+7z_%vgX>=QIKqMll6hkHXF131P^yRc39Pq`vc>xu_Q~rW ze)lJ?-@}%YA;1?mYdp<!CdGGh+>Q72#R@lKOjPr<^y}X9T=4{~W0l~G6_oPAw1qDh z#u|qeE#p4I&eAnc>GmcEmJ`wYmz%=Mdpo<?H30p9kcaCn6m?uveOMa9m48{ag-MGS zoO}k*YYYMmwJZn8dz*MFPF_iw6DDa{h33fVp0UShjM}vkK4IOE3lpU+Z%%i@06Q>1 zyY593gXjzXA;7Bgc{{BOA?b#eY`C#08=`OK)qtQYr#eCsm6#EVxC^>KgD9yr^<s!v zQ=zQzw)dP6PJwYLKJF1n(>jiFUrc)?0-fZNRPSuY$`e92Ht`5lhuS~jJ@1c2wadHb z@JfI&L80%bPzx|)U<S7Y?G70Iba(Bt-eOMJdcoPNyoJ>4);10FJs1nz%KST*<&Om{ z%tic%lg3k@!iRoN`|tL&f7#mqZJ8MmykU>0f5^-fJ~4|~+8}uASNP;N_T-WW)=#im z4`8z~@Wm9E?QR}yx&PXlRX3*kzW2+eXxLvTt)KnA48X`9emE#Ujbj7+Gmb5Ue<HBo z`q}bG=}WAJs6L__JlF~*|JH1FCGX2O1(x0gi)%0UKHseN*YC4lz+wyESukLGV?f~k z>38YG*A(XRlkW(;m~XEY9Q)vZLIT^mYHz^?t?t9c1?%hY&2-TDHxNbnrI`${?)2-G zeiZfqqXBCy<U&It<Ui#xFe`^+J3amE>Vtr!k#!**3a%6yW8y0X4k|opzpLuPFW*$W zRKdYt;hVY8#m2*%^1X@1Tc9f1{gtuq7lHd_?xS_CL(%c`7gxak8!{mtbA*`1XnlMg zw{6D?<f+Q%K}gyA>j4D?tz7c=(oZUpWTm$T3?(1IXOg|>Zk0r1eBNPo9}w4|(BVN> z__-qJ2!F-*X5P72p1cwgRn+uxx<2&73j&!>D-3|HQ8SM+4gd*isULk43IcwN&z?oj zW+NL%J1~J#JnE_nY0DS%6+=WZ?mLW@OshtNIUQQ^eRz|xJ8y(ke}}wpa}F@@gXyv+ z3C>ENoxL)sDmDT+8a$nbp%1UwPK@>m9=qN420k5XoPl%(Zk%4@#Ut62sYzXGoXf`` zghm9YaLeRf(JR_cWiy)RH+vWYbdJ>b6HHdt-dODy3`2JQ()dYj0zJx0fp^?(OP%bS zx7lAA1pz}o|MrFy7;7EzeiUdcL$e_@GdCHYV1Yk9u@-gJUZxKwix#_+0^tYKSz*hC zLqI4{hvoVF<}|o?1Pc<B_bb)T?n~@1q?Sa8^EA%1Pq6{5$?^KcoTbP1+Qgk@a@(n{ zl5jZ0&k{f`J%#vfN>OmcY07=}b5X7w5$MDh_3^ag3r|575XA!f{4Icb`z|o;SlKJv z@2!}$t#n7ZAq&jXIlCFnp*-uZQL8+}5;UajF;qCL&@98*Ew|K1629snmxvKrWN{lt zNj@&zyEMTjsR^d;8#}qc#?=P3-%7F*)spiTP}-yJtROL7F?rUTCMksq(jh=g#YkUG z%iz_A<3;kLK2YBoD!q$ci|t(?pa-0W>yM*1+;rjat6s^8Z!|ju$4gdHom(@{u~5?L zEN(1FQhw>o!QmNJ;J4P?A9UvaR1EJvj^uNQ@|vfi@@SZ-daFCH+s+z>5rFpaeZ|R2 zgp(x~9m2NhdGAbZCW}2F(1BLKC6$6A;)G&gSY1tpgcwr5L$ojk%Fc$iZtq=je2r{) z8DdZk9BJB8)}jKcEPa&HqF+d#CmA)E=<_u?<Dj-@E-Bc=9EVOF+JM8!2>~?JpjpOQ z=Eq&a?+JnQBrh)7$9mUZ;@F8#$vFV4x_L0cp;+1Dln2XU1#ZS@nLP@7p2v55Nb8Vu z>ae%lQ{_Tdzv(+TT%fZF2V>iO9^08OjyklZg_p}-46xW<<J)D;D;}?l3)S{gD-|{x z`kR5KQ}6AWD8CfI(Qit%;O;xpUbRjueZ7ssGH)#f3mn3{8?K?9=5e}|jn0No`f2v+ zs-hl#@-Uz-rXjMmnA!QBQ>meY^Y;_5es{u+)()&q29Tf}GUi<j%tzawaD_}D60Y1X z9W3$ZZJRum#<v_fi_hUGK*-csxCXjRIY`dWAWFd#48qMydaOuca`#Fb!(k20)D3xh zJ&VR=ux85MyoV98K(s)hEaHXh$<5LaCyJe!H)J4tlwWjI4Jrp)f_CWXBuYIzO{*qu zi5xqTZ(J|l7xsBJ#PpUl<I}{)lk?`AN+e{{5VAfa9^=)Xvj$bXzB!rQnXSX5J?wgN z-<c4EGL9!-_w#FB&E52_Fs9KXAjU>YXjoi(bRSwm8>=3aZJig<@|PyOkK}!-fk5|v zzDQ;N^B8C@{D@xDA0a{(n4rPiBskuat00?uJltO!{kvXpgYf!a<?PnZ<%P$$<ADI1 zZD8Fl8*KZtBG|xFgT3=mZIBf>LT;dYE(O5t#*6w@4-dFq@{2|_xuRd{jZX$^{c+yG z$N4w;*U#b0Fx~nRt%}_NwQH^D2CRzDM*Xd%fM~Bx`2hVP$diY_D<D;Ys`AT=KVB>T z^{xEXJAo_v&)&*ky_4NfInsanR=zj+{<z2I3Yv24C3rCG<{I2FxLIx~bQR`IZ|}L0 zm(A_*tg|+BR|02&zAqANd00<sYxp?FHz&6iS1KAXl)DmTVd{#_I$g7SvU)&aoPeEB z03@fXpCPcgv+VVt+PBGi%c-J9%ovZ9_BH0~50pk9q0z_J^ckKQUvhq7PzAKWGAa7) znWYrgV_-4bQ{b=yb>zP`3BlL&D}Mrdd>@@Eu;m!ucL3-AD1^*FRPTdQU-t3iNKcpz z`5|ZA(PDY7RFOan$OH_kCs>SBxqp=rBI4u4`V73$oz*%aa-3nfKiSoqB!@G5*Jatb z6?qhmWkv2GLo!sad!vsogC>VzFvU-AhExt-p#IvZ@@;K?QMRYa-y8@2w%@mWEGNh3 z_m;Q?tq(9i7i!KYIy+~*@9nXZ`@0Ve{lMamKd;pfEYA9?JN!Sn!FN9&4*qDZ%G*~% z0&Li>SpHb6Ufckb27*Jsp94N?cK4Me_gS<84#JYpiDmoen*Hgu;@7wINAGC&-#mVP zU$bC2vD+^(&;aNDPu|iWLFNFt>oE+WaKB~1+vnhT8n=6QcT>ATkM3)^m71kj+hgVE z!x}bV=Gaoam<ImNIUAc@sMjtl$Lb7`?-(QY%$f%+{e+gI(BZ=ET_&f@fZQmi-9WsE zbT8~p2$9RKiXW?q3F&`vwY@<la~!aRC84KaP>e@XAgpw%GpAI;L0u6A-$<8GAceGp zUXNnx-9qaH*G5Nbxf8DtyFC#N3vcF;_SbbOl><1wph1zTwK66iUl*v)yXdilG;vDx z4b?A`EquHt+SK)-zMKeo-`{X`I=ym%dR5gm&8c^TGuYjWM!g|AY24)qs|f(Xk{N#^ z9@QHFvqR!VQ7OVgZ3z&J1`DeY;qb_cxvP)B&IMJ8c^jTWo8$zp!w!RaQdD<OI1S%h z-2gSFv~mhfc@?%DBw{1^Ly+y?Mvr+LsfQVLa)yz(*2C?#9OMOs*yU&UJo(8*nN+DR zD6@2}a+moKt*m+n^xZF<GYlxarICSvSUi4dKt!SKQW!zvo6O{T(;aagK?0gUUYln6 z514v#h?$$@00PTY-I<7b@*b;BPx8TJ(pv#5{u&5yEMjOB+D7(-nq8Eoxim&yp5jtG zQ9c4g(_5<#&WM`R9KG;(bU~oKYl=Wk>aa%G7CDv=Pd*dN9I)1WSg|eVabA)`a<zCU zeA(PO(zxQG&ojPWK&b}?>dFQ^&mGBU%#pR7Y;V?{a<B&t$zwx;kFKwbze-jA4ZNtM z@8551H^b<oL5az^G-Mz;-TQno_kWQ8_$B`F*Ez=J2TV?Qf^3*M@6IEG%<SfmzOBmD ztEUav>R<*$=nEY68g*Y>vBXZ@DED8FaD#mLinzXOmcsS@LXr0Z@#b4D;xObLcFeiC zRFy(P^se9zw--+Uw*zu=ZiM1cZf}HnP+mC5n$`OzN>;gv6%;!(HhM^juBrm$h1UDx zDVZ-^+dXjmM%wX_nCr`w>RYNy7Je?0k+|5T?&=EdNkEabQ3^%%n8)pYIQQ8?3yjwp zXlJYGQO6W8$Z{RE;{u4WdR($2Z<C%5IrmxPYU~MQZNj46LDMc}S9y6ALwtR`OXVHB zQ}2W~=TAdZln;XSeyVuJtd<cmJE9CTGBqKnq;B`nP@I)=;L8~0_OIJg={TZgUcbo~ zBnQKN){*MckQCyb)&|cy=X`$Zb%%N}eQ8oKreEz|rI1;rWav!;3jIj#^%7swYhfGd z)4J*gKQq*Ty|RAGw}+x<(YT#>6GDFuyi@Mi;jvv)(*gVK?l@WqiSCb61R+26yOvk^ z7>eXf$dLyvTa3P*D!N7FNptm14e8JXxqjL5cL`Y1Q_fptfAGNtuU%_*2eGI;)z7EA z9%SVrIx_hx831yH;~2YsYoZE>Ao<0!mb<o&6Jfb`c%<0P<G7y*i2MOgh%)rV)d=Hq z2M-hxy(S446{?u@N3;tw0T&=7@H&hd4yQg#fpixP+~RM8gjO^L#1D4`AQXl(`i-CX z;{I2&b9ZXKlnQ@ZDEw`SFnrpD<d0I`6PB}2l&oHskt9Nv@_3$3Lp|&fR{z8CVDP(1 z#TSS-oV~GcEkYeq;F}O~KcUTK1ULHyky?*Cv<QE16Mm}%#Jl7dJBZEzSbz0Su3wdD z-&%vZAlld+nin5C=g(!pH=gVQL3E&Y%Q5I(;$N!(KyCf<VgU-%Ur!+(gt7x`?pwz% zUnc7c*>*J~YY61mvqUWpaP?ohe!G9Q$oK=CSWp09!_-s6LRSC+9Jne$iwcGn3k0Oo zR}U@d^u9;=een#!*x|Q%>kn+!FWo)eyr9TRv!a>sP|aZh<PLcwO9uv*%}LmhN1%B= zwjDkPQs+_GXqIPrtM&THTUmbhPP`jF`Zt`V;h1(ghnS{oL%rOOXgQeOJHb_pZ;b^d zp}@P`4kw6YyF<U0^>Fjb*x^F<;ijsVeF4Jz-YwbbS<e^knn@dX$RW#F^p}_7nXjWo zzxF3_0_imv>8CD{1AjfS(rI@|^GrR#mJ+8BgmX{)G1J|Se@xMK#{xZ+S_nl^GsxtF zq)J35_Lepsvas1eh)M@7OdGoJzIYcTfv~{5kSQ$&94(MtU4>y}-VkA=ezs!mEGRC| zIgToyJQGi<gZ+LwmBhwxvgA$kbf}^P;-e&H>1w|BpVyu5$oEIpcs&(Shd`WIdd$I< zG6>)bh!`0KRs75B)Vo3_<$FZpwmAgOspA0FMua^j*#KA4o&lZ)RJL<pWiqss&ObH; zzyb^sGS;gX4itqRRq2RA>lmJmCFFcx@7Peh{el7+UUlqJ<*rx4V9w_(MZzR~mf^0L zZpsXySb*Kv7fAkt%YAMewzv`SGPql;0I~Ec2uggX%}H_cVqqcnXSIRC&{W0TJ7myo z*Xh{?(Xiuh02{4CJ*@WD{FEZ53`SBhxg01<&US*#z=b_2bh_OTfRZU}74*+)Lm>wK zfH(FgUNm_)GXSl9F3!%sF{K&LoCvgs8#rO+fup--y^<jQ4<Z<DFWl|d?%vM^Lkn_) zh73sjZ#r_79ZCfI_I3gFe*(X}KckKR)*fV{sD`YaER(U9Ubv6q_=vF@-O;G^_>&{y zpLX}U+@Hn~d|mhb_6E@tTc*q7rB`reIJq(mQX#&h5|8(KbLk@>D{yR{<qAK}v<#^p z@7MIWE7Ykr(Jh!Pp_F;QNuO_SaV)5DNda+AS+Zl=69FXlc)PsE9;3WQ#)6bN;5k#1 zN9%ag?3x&1{}6}Khc=Xy-DlxsJ~3G!_TdQ;Z|`xudvV+4cCZT)fDo@Lf-*_>f(SH9 zO)pKrAQL6XIDVbU*Ra;Z#VaW*=JboOKa4PaG41H_dPGe%mQXPlWh^eX`r1XwUAh$V z12H>hs@~??m<~XMBa*9d!`@6dWwOJi^wD}@_iH|T@0V|A11x4bF|$W5Jxw7TlRB7= z<a_sKw<Zy*-~=*(jTo{d)FYO49GLRIj#&I+*n0s%+sgioEIRG8JmtdE?eGFd5nI|! zFOL#=i_ujICKHT3Fh*a2{4uVA_!_Ev`b7Pkhz#<&p$G7s#I*BbEabrB`E;bVCU2KO zIo%r{_qsEdli-_506+&6aeW6+e3i&I2Y7mYaFd~~R-av##G$l8bl<zVJQI<&s?&@F z7B@>v;oD%GaE|SU%tUdM_cySYY&MIY>1_w#=X@W6$E6NiRX8%?9fg@^7*h3h1}LpO zAvm<eMmAoLK#fLXgH+dh>$<2ULJR4Q`+H@4IEsJC5B-h_51=@hg$G32EDT_%r=m#c zj<=O5g-8|{^cHT(lZLeLZ!yAojcot2yC*YHgERkd&(1&oNvCH%f}uYQ4F5h@{M$m| z_30%L>yKW75qGX^&^$#&MoDF82wbG>kC-w%JN&%ketHQXk<>3+t|R#X^Y@{E(;-p- z;91b~`}{e$lAq˜ORu0c8`R8xGgUx^Iq5HNJxL1PexWkRWQU*mOQ%e@19$8kK! zMS++ZFr`3h{bvYA&&d~b<`=Eew{Y=Ky8wd3VGMY2y$wRJzZg`oF9M|P>x&nxUGBe6 zLBWUnYl-uy?$R5IhN=McMF9Z53Z&fd7fGC8Ug(67(-qv*BKo9;H5U}*Q7})0E@cC6 z7Zu(r&pf}EI1>6`y|UshhlR;Jcu*=ZtNc{!d~ms|{;h)ew+aX_(~(EIsu#bhhVrsg z&yB^`F11ZcDRHZi9TIz8V1w@;>FElOH1brcR(%U8QC^0<Ef(R^baR35ArJDnIiu7h z=V`H9^fv7xd^ox1y<S9C+Sn2a!F(h@4)xkl3ONytfOeZn5W&R=$4t7-Q0i(w#i@LT zXFE?L-SD3|R#!aahX)WN@R;zWKSdPX?kA(X6)!O+b7-Yg02L?n*WJkau1v-^z9Gsh zB;gSqMh8q+K{ALKkY71qwfc6a714I2*oSWdO%U}N?pJ7**Yl!1_6CR1@0$pL=*{qY z2J)FX8sXXkI|yZ<$z|Tj>TyJ(V;F-}g{K4e(FpSn@|>vha)80j$);X2Ce>4Ve_!=< zX3rYnZ$RHy-ub9B5M?Q|3n5SlYi`$`vQa=X`@Hgk7HS^{%;ecSppe}~i`N4;W3^_D zh=hY~3RFt1HZ%b90}t+#f!0K<!JM=yeGlh11DXJa(E)!z_a-pV9<2G^3ZA@^3SHd` zIQm+&I?7z`3RxCm;9tQzdL}Le1xUweHJTIT{XCp8=!7G7aM?DfNl2c*<dUynZ+opp z6b1Mpk0?CQ-JOz+^K^e%8#p(u2h&$BaVI>%Cm2QUuQ>EB+Jl~AZ<}T<a9I*j01D5z z77`iP$EVgCZF#kJocZqO{$goWPj`Ttwa3V^R1M}8;0)qrK)j+C^nH*(SQ+?!(1gzM zV#i*2(odiU_&Of^Dh2%$rtvTQD+ZFfj$!^%0jsv}+$-hZj!*wG+vn-`ngCQy3JYS= zKP?K(7nq-G@(Ba=I$buufbLC`WTTsBb8}(58%A35^$C&kmbVk4S9`Zg%<vc$pDp#w zJ5`F+g5%V;M9*az?pJCcVvoBQO@T4qh8!|7#0A}#UI_ykY&?2#hkzFSZfDt}%+@(I zK~F3gtIYSbt``llSA7U61MnjQHi@W+;J5jjecgPUNW4xL2tZwxN0~^{tTS}L+3on| zch<|fD<*Hlys?KAEY3STG<R`4E9^{lJF}!$hBG3sOFOk(QNF?9Ne4wRxapGVr*NO( z*xoZCylIT>9YA!UJ)k$p^FFiT!Q8e?MCCa$PR#YeEXR_L_98u)CQ!dprja{KU6pb^ zfdBcJ#E!^duL8S^7#nNkZiX<^g1v?>@<P+YZR;A>WR<H|GdxPnjiyRhgpjm()o;gP zs8hczqBO&=$>X|j3G(_r>nL(2Wm=ceU1x5-t~}b)Fiq>#6yTga7;N#lL3&PKv`>&$ z+CUQ9v<-%}N_HFp7oVPBhAAm*lgW&`KRt}mfzdpFgb>55K0)@~NU~DHmapRSo?GGd zibCfASCu2j1=(`>q&O!!GM^ABb~APN5sOh@R|^j%OIN+Nx;q9ovNJ`gHOAVz5-Z{^ zk2jf2Q0%(SYbKbM3a;-30lP90Ym$vhR^eI`^jt*@8Ir{v3_)BW*tKgzv;hRiuFMX| zmA)T(Nc>@zaU?MC#~eaeQc$}-|Jy~uKZB?K`=WsJKSe?EqkCY52PY|RSzzG(9gZ)^ zHPwK1_S-;a`?VnW)C0T!t%BfF5A6P?Ao$9z`s;$=Ge>yqP!H_Da{0X=_`C?5`~O)% z@TmuO{~HCtCpPO-4}7uyLG|#hAYlI*PQ&L4(o1<Ys>fcVRb%9V*rA^^tp_OzR_z!e zRUYOVsgQZ#oL+zl=#<+dTm2xT^fQAJg&p|sPJl$<1&_eG-nhI6j|<0@^;#fvAxJRv zpn0XRzwZRj>pD3f=NHRfRmP9I^fCU4L-m_M^%n%yYQv+}KJVF!cio{8%+~Aup;f)` zKD2+pERdw%Jsk`lgFzMMb*v1!x*~>1+oj8x=dO=c+cM}pb`F5yJPSALvVfr2ISv5& zmAM*S@CDR`gQae#W1voTt}Ge~Y+~weFRe(e5IiUe!o5YHu>>(wn6l;|zI1R?G@dRK zzF^uplyT5GkY5S0y)NOthQI3IK_Xw<KY@|>k0kvkwkm$M%|FCvUq`RL&C&t>8dd+` z6!9O-5kDRX^ho`=MDTk_|7RcnuGE*r&#Fd#l=_Nv;9uyxhnU$vmJoWsSp+@??$5^k zO^mPWhWGdSIq+e>;7)wR(E1C(qy8!HKWrKctw1R#z(gLjLKm<e8~isA&Bs>$34Hrv zCr>`;sSUjAuvonxuj%4%_<i8a=pJ<5tZz6Rp07Tbn7<S+f|fvvZt57^*cCGF;4lJ} zJM;uWzo>r1kKmYxuH$Aw9$o$)aAtU|swd+(7Z5<EU<B-C_{8%&Z%pX%!GmAqxLIp2 zxOlg&k9VS}FG8?iudAQVqr-BfGMMB@-(R`moDt6^rSna1fE{32dK?Y3cO%RlOVb7G zZ?BoOK`~Tw%NbG-?>uXsr}3k{TW9fn$%(Q9oAyJ_=uYI(A<ZPvEsfUz1M1W98u<#> z6;ZH*E%XQ>Z~EnpsAZ8L7$J;g?2rUcph%seW_`C&#AY^(d|nuOVGAOc#NMC}%3Zy# zZo)cldobQSJR9H<aS3lLBT8O2M#|9<KxB(tf_``@l%gY#+mXuWj>R)b+&r<J6uA1H zJisXH$e2Z^kx{)T9}t;oT~}rIs(3o8^)nsnSLt1w!-U^!s<voL&=2pD<~M>+sB(q` zQk$8HyPt#xs-RSl?n??r`P!(9&8-CS&v@JEcPCy|ZVeGD5MTNc5i&67J+HdGKY}(n zyM^@_5LKjdERJ6gx<ik((sjuVaw4A%c=98&dG<vFd9t_NIjj?5wI!OmJ#lq!WK?P< z5*7{9W2K{QQdthNEZhiL@yKpOc`nb{w8)UKjkuZuiShpIu7Cy`#k01%zp|4>d5T)^ zHTpc$&HC*4#22Zzew0D-kt#GBZcAE8&Xg{*c)XPClP{x+2umyRP7g3n?{h?&K~oF4 z9@Pa?Np@`aSNUpOOS<;iCI^EBabSxHQqTQ|;h3_7I)w;I>b<Hg(|6}9A<w!Z15n~? zYwsK6-mW&#eO+vVF&mh9>P$QWWte}w%JarJp98LJe@P<|xDV0^BBUT61t6AE{pE8G zBjh2m?DB9}@-UZJ@OVRm7Zl3Wa)#E<m)t1Jli?p-75srFGIKny^dULKQ&?B){VFcd zhOgnY{dLN~kp=KA(K$G<n=USp#4^DD>WS<EQ%aFZ-5dsklEB0Zs6!-*foztNk-X2x z;qy9t1kEnR+;jH9NCdOHFD(A`6ELjh<8NO8-yjFo3H-x51Bx*C!oXs3z$!8ZTs^}J z%<o#nj}#F``d}0Obx`>+Tzy6A$S^-;ls<XW_4DeEVBDGP$9n3_g5cgbh}gR3C|qHd zm*wV@Kko>uxC=``XqtcxEm$Ej$eICPd*Q+eE234(U}%U-76q(FRuyjOcMgWOJ8_8A z$~th+*1sOh3(`t={=Pdaube+6bH&7|9NpDN7SR{;!K9L6#eBEVyn)Q4(!$h`osb8V z&_e=r`}Y9NY-;|T{vGpqcwz?jtab`Pntn#$#-7nfs_g(!myZg6>E|~dHb&dmr$=^a z`J-y(<Wnn9c5mH45-oD!4X=P*`vwg$R4353Hg_?wBn}RDxSUTnDkY1eOh}EnQxw?W z)hqMV-%|m{zN0p_kr`tQ^zSCtzWP|?4GOn!YOa{<Y<o{i&cNHGIlPkn#_-%o7DbDg zQfP<3z<Lo6Y?sx_DViNEjR$<>hFNd%^sa$*t)}D1WbEM8YDphM@-DJxcGU#I+1HMi zR3<^t5<~{dp<F47sc<gIN1J@#Wgp22Aog79RfRFDv4~g94K3hzmt8(|so_{`Xk2dc z4pgHheLec#Ik&TizZgQdWHc}64Xm3CQ4J3D&JuJTOBW!60o<Sd4S`US*Rdr#5IDvc z2Aour7tOD1cToV}(BJ4MoEjb>D3VtTAeG4VaLx9_iS^+`7`R89^<g}ULYf&io2M}4 zjU=|-S8JQ{A=d-`qDl8o*oA9s&Ok<*9oys6C5f3Zd!4tVBES8=Ds$$~nDVF4+kX`u z{w+_B<G&buf23V`_qwC5(aW6yo*Ev{PIR<RWR1qy*#5>T)fapFr;%azfy`Ja@e|Gh zY_)jxMPOv%kJr71Br}|vKw^l79PyS4CivE#bA?;@<?9r|=RXJ;c)-w~)LZsD@&-D* zK)8YQsv<xyUmJ?sZ?FAwH9ud>5BK8#^lE-wj0{<QkhLdkZK!Mo3K4sOs1dM`I0aHu z7y<GiH3+UFE64?unSyVDz=42_#=2#+`m(v{eYkL!aT}@;qo{qnbK5gIBaa6V=mxCy z?{ULBNHRXh3++BnI5_e_Y@RprzM=1ek?k$>zyQ{+*QaE8^(klwy(A?dq?w?boofnK z`xC3|JF2Yao69^t*TPKKZZD0hMxQcGzRMKQ$G)O#e+McUUw&pkpq5|K1cTpy{d@!u zVi>hAK6yy|S%wx{O*lT=*LcIj;D^tgTj`UYyR#rM5Z&g@Vrxnr;*o{9MY=^9?cBTo z9~h<(7%&=1O%+Ajus-ktQNkx6>{MXeW?f$fuO(&$B9N@}F34;9%J8I{4QO;})gItc zlIj|NzfissDt}ufe^<AQ{>R?C9ly8eJ!^k?3-oil+BUSHjymGr==*6A3-6DuzSg%z z0=CPqB&Pplk%$H3eP1N}_eJv4G4+SM_5wKmuS#0xTY57jIsg1x!SX*344^;2!-yW* zvA_rWTp0+3-N^qU0^lR5nt~52awUdup>#h&>i}PUNxp~$po{+fxc^h*eD_%#j~O18 zmhi`;_cP{alI%__Dg>at?(6jspKbOC!k62FK}xZWpWC#A?KtclEr^xA_n`qe=_jSQ z#<eknHRws6KzF0e*ErGxtUESG{XCqF=yq=Hi9Nsg^K9Phm3geC$E@o`ReNO@Dh3vH zi+kqHcSA2j;4YDQVEy`tG9ILnv*%`inL8+4BCwzzudZ;}`?j-}degbb+MLvpAFbU| z$*H)z<(3&dup-Hlo}|Wm-SC51Lv*W2$nZEYwaXyBA69cFLYm@W1icUUI$AW`n+#AV z?!AS)K`-+L<u9`f%(p)CzRO&}V%cglWn;@x-LMmO;_iAPXI1AtobY0t`rb933m2=^ z^1>4?9E~xIMZo?^tr_F&?S$^iv)aGUE*TpAOUiqNkBSi(@E&<G$c|8+B^T4$^q@*( zPr1n9$vvIsP<!P|Jah{@;?P54?HN?4NekaGH&bJ)XAR3Y-siR?U{`JRY<Us|NQXYP z7eggitkSq<PrU$q!r)1Fb%rW<nW6WtYLiQzS`c1d(md@D+BT-~iV`iUz>X7gnIPgZ zfIG9SKf0Ak*OXw9FQ0Y^QH0$T<_;*X5ZgmDEa-h~%*)UB)?0_Oz_i2c__CM9+Xzn? zEhVcP!2M4JL~dd){vBPV<I_nY-Az95HYdEG7{57_3&DXPsj2}8zSW4nbpZEYJ_Z{) za}qEm)yxn)9ZK>|j4jWiTa6%>(qj6@=>1FQ{8zTG7c^`^-L8U#Jq^?j^4$O@MXBF# zXkGlV67P=%)_>SI-$7l@X!p)>qI9H8aas1xjZ*h7HSznVaN)f6D(T|Yd%a?%P+z%_ z+JH|>e8JASRnDioeAiTFAce;@0j7yCB63w83_homL+(>`H8kPkY3_bpUJC|M5!CH= zbG`Z~B+`Z(D~Id{<9(*f^9?KRkAygh81>YPepgfpj{DG>>ferxUI$9<n3DmP(C!Ez zS<YZDt8+N=I0>pXloAKwG3y#M+d1v_yu4j)xIgOCyW>a`NJvx^U!!|=@2 l`f3 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%0AXw|G(X!4ufX>~9b1_{ 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­Kq>vJR z^=)Q~?VFjhlrvLo!_2fxInDZJrmZ(;W<imqnORFYTO`!8Mf)~eWPSKmnX@xYiC-6E znQnBHW`+6LS?iVAIo6I}rJNgQi{{3ywR1)G-<+#qZjxo<mnm_36xzUFi<OXXV!R|w zOpFr~{Izd{1u@H4oZvV7>RWLFH6Z4`P3qgEAe+D-<+n-o=0tG{?ZdCtS0r6e6m8s2 zln6C{Rc49feFDEOhV~(*_Dz(O55M+Jkd>^DCQ5T`QEATVn<z1cs8UYMvi6Btt9^nv zo0yn0s3*tKM-%u}%E=O;o-C;!CME?ne)VmN6gh!k7h?@mlP;#VPfZ$Lrb+V?_*Kg3 z36?qSzmdC5Oxqa4aAMo>tCZj@j5*BD%qnJ7H!-Vkvqno3>UaJs-|QUA#IK97wX<^u z^&IIFjkVT->oDeOn44h@b2FB2j+8YqXQLP)@?j_oXBf=L$6wYkS>(vUuX-9G+BaF8 zQX3F5UvbKPBL)$3`Pib#;;ibMEY1O+_!Z73!MqSF6<v(|Fj=xuj8NYU^OImg{AQyV z69VhQuOORKeRDQ<OwEm>6#T08sX4X*zoLn$Inok-1@-hec@}<E%Jev~gkPnc9_K8B zU*U6loTHe(tPdd|n;ti+n=Y~q{M9$jW7D8~7t=R`Y#LOHlwbz>h9QI)eifVK7@MA) z5C#!4-=xvm^dz}Ae=Q|ji<s3nJ;RjKv-WLzmSy5sDQ8HZ)A)5U^usjfHj8mKM9h7g zvTs&9_!__2j0bi|Ow70%W>f=yRm!ZOp0$~4dX_Z7U;8%6Qf7_jr{{{S&+(<{Inp(M zl@fHyn2m6RN@>)J7<&c3OgS@NL~Ca-ds>V$?990F@|khcHGbW<S$(s)YG#~J<5x5| zQzTyat5QJGiurG>!Evw|&^Kd7XEUHv#7aeBex_7XtRzg#U^wI3goATJwNDt8&rHm* z2ACYHKJgyJtiDN=iC_CxWGRz2BY;6Lh92g(S>%Vf<WeF;i|{L4BLuGbYblGs*(?T^ z#mMJpL0^nP!Wu_L2C5%27Q0D-eV-vZip3e@55>|186X3-vsjuW8(^UFz&gi~Ujg&; z0hJ>ts&+mAO$cnB!2?N+f$9g-C8J~@*e55(IYlZ^d5AMT10P2RF)pm&fx;65VFC{% zYz3AcauwqxYcC#1vIuOB!oxK1p}^8(Mr3@##xou$J|Hj}#{-2K1`eLdN##di`6tB~ zCnkOQlLpVE<5d%rVzCS?{S+sI$%!fB)qGI<rff7IP63yJt8a?a8sa8V;9-vVV_@Zh zYcP($#qB!=n~$@9CT5Hp`JnPKjO_c2;eV!RoPA=3gob3sr|>YP`kd^8I0vr+<p-4# zUkrSl^&xJv!Q{BgW5Dm2AjMi4C_Xh_0{qjUQsZx+Q<RUm<Jr^d?`Z}~4|a<Fz|89S z1qxIg6sGTx#(^*JN5`!pfdSvs2t>bp0DK6ny?78~L?C=Hj{Z<!<xNo31c&wI&v95z z&(677WDc?y;s~t#xe4~)Gy;QnPV_N7H)*Sj>A5LRR}8GZa}p!aTQ=VCFiZHr99?-D zpNL!k@`3F`V6zJ5b;3L6q>E|H?}BI6#t-94KU;L^XF2KOwQJAZtks7Gsl9V^T&he% zFt9lj4{Fbx%}pR9(vJeB$Ag#_0>_8PIpyND=ir(=5qG>155Onm!Vft-;AJ5C-~-@O zVC5Gn@-Z%a0WHLz0{bqJf^qkKf(tef`Lu%vl&rXiM{E_;Z;~h;h(81-i}C^VsKCkx zfiga2^o$2Fa0H?^%s&>NakB&@YNekkiJtJC_*P)$X|aj8&C8srgb%QL`wl+N^ay-h z?U}Xy=A0({&YC2K(Mth~f#I)MBz<BuyY}IM{e{5bDN49U+~^I^Yl<y8DGYInVG2|~ zW&+|5fx&}(`i{W9PjG$!w{WvE9*92#{<}@76CPeLMt+~P`G61XUx=5YH$K>R*MG$s z(&J2V#@5b!aB-6mKo`Ux0_zVvs5}IM59?x<$H3x6F6=O=J9zLwco7&qmWo`OAnxb^ z=uv(w;VnN_x%^&o{ZT5ZeFzM{z@vS))eI7nA24w6VEw1KNmMg7-y(4RjR(Qw<{z}4 z{E30fk7cLgwno4Q(K`c!&*%dyNy8@|RNkz~b2C_4s=QfW|16jFd~Nu{a*_S(=U+Y$ zUkp?}rc2iE*O7c+`w&=vPmGIR7+87`9={iz{DTLT@8oBEAiq*z>1{kt`0+R~Nq#?r z!1`}uO5@3|&_EWHClpxzDJ}pQH+W|yh|Vz3cRa9uEUHu<**D5(p!VZ|f*pccr3c$% zdlWD~9!PHtRQ?<mI>3hle#f|)rTnE(B^0p|;yRU~wLwp)grSvE1QR4#DHI*@iG;+^ zBm+J9H^MdElsI`SRBP}g?T$jxBZjvKilM8kR79JQ3!$wB_(Y+^LbU>Khz7nfodBQa zfH;Jhs$Ck))%M1CA6N&djBh+O>4|LzQ!)OdCk$YQCK2dK<@i3(8<(qOI4l{NfeV4$ ztoDf_*O_EbHgn+#GL_yq*$Qu_g?WTd?^nV)RuCd|<xD}d!CX^reSjzYr#B@VbLasL zI)rnWg<$;iTdS8X<>_T1OrpJ$lat~gvvU;C@T(Z49g;tOiFJe=EcjJStP$hMjT}xq zb6~Xk24$yW!ZMb495k2;^-a1pNHC(}xmo3d*rIQ<)SS%W*J9LM0u&eHIvfIv%ST2( zH*0bM6dIr^{Mx9TqfiM^#`4Wkg9SlGBVrC?mob}fF>SC#_*H$<7tA?*0YbI`zwR6B zb1PF!FT@Le?VBJ2Fc#zb52Ruv8Q3DBGT>J{NZHN6$4PF88?EDk0|bGMa)?qKoD3{I zreMa4HY4J}%5yUo;zXJPrH25(I09iG50v;6xbK|d5H|?|yn`H@OvUO)FN--q1XFtS zEaAlrXzjz)W^tn!d{FreEIl-rN^d$Rj&4hD5+UQPpMgtH^fB%@Scx2$abF)LM8>T> zcyJ6w6w42edHDK`aXGCad5Bm50;>;m8_PrB<AM*Y#>WL8rZgWHd{~0|xZuM|)W?kt znJ%6M3mydiyYS&wocJy#&cJ=wRt4f79?noq=HcOrig6DQSImric!~y(>4f>g;ISEw zap4Prug~D~{fo7;$}@ce(rZFP;QBwSA;4N$=^Z^nqOtlMy&-P(nS_Y)DB&{j@Jj=M zxa&{M_4eJvr_CCC_xPJM{2Bj1LE64y;Mzk86B-MX0J0hk#_hYUs2CT%uu!x7V1&wV z{E**;9|Zop>UR<b<_k*13hX=7#fqCmhYwaC0{`98`|$v6CDTK7X5X~}WZdB!TN3*2 z#|IXZjAM;s>9JT*+~Z#w7JPU70+Of7cRD<Lu!$3sndKJ)E|z9Z^U4SH57bNUyY-io zDDmAUc_&dauJPkE(}>&n#6r^Y&)Fo5C9#WBLMu|xa&f9j5%>52-$oq6$;J~NNKX@f zJm7)f=iCaMl0V9$T&DKmf&7pHn&^QKfKLJI;{)<j39a$M2j(voP2z*9NBR9u0#q5q z2X+$;-_sMeBA;{;EH;=pei;Z~d_a2WC2V~00p%mG_CU2k`e2~;^8xKwK=}B;^bC9) z^uoB>hX-ju7`X4!I3TX}@H^<4fiGWbXvBqoez5XwMZ&n1Z+b_>*}n>0`NSXN);>J2 zeGL3}&==#PM?Qca75MK4k7;B10sX1Kf4BDA{J{?fpUoeP8+<k%5a)PM;POiYgV!ED z(ht9T_&B~8_xRy_!no**4+f9TCyWao%(zxQrc$QI1nT2zU(xnc`9bjd{-3h`XW-J4 zUn7~*fZ@UNI}Huuf(L<5FL<D%^>Ks8(G$|U`W$^=s#f`?aYaSah%s>axkBS>55H;L zz+wD%E6;X;n9!By=nX?r`JF}xs~O<~e8TdVtiKWXxY~o2r;n?ACl5>`zsg78zFU7{ ziQwZ_zVA=T3&`gCQ}P1izJBsU#vT437%=YUV?MaJgGci*UfX=j2i521SH^`eFaU!` z8V|ho8cOUVs(iOwGbIfOz8k;fgXqt#=oz>2jQ=w(coDerIsf3b+YiBm!Q(Wbh+BDn zyqks*uU-4WkSxD1&&I#kKq8^F-}3`-5~g=M0({VS1O^Wnf_-=R!T_|m!v_Y4;)Xvg zeYIjnp!AF*y#kiU2c%cv;;9ugK5)D;P<!UEkAeIceO^GolNMz3`XG|QfGkQz8ONTZ ze}nCR=EDAli2+bJXbH>E(%?xm6+?jv#*O^Qh0rY``NVQCrrq?<C&ELqSp$ksk}wsr zNqA#(9A#)<yY!~~;x<z7<jR>d)f2x-atC8@Q(XyqS<n_nrklJlSr^^xjZk%Q=LG$S zF9?%2=rO+WA_P`ggc<e=esK(aqve|NV$F;h$Uw8?79xDIT-cLvB~Lk7!Q&ZHg-L5O zSQEQ6P^PG^8QY9Ttq?8rX4cGK@Me};VTOK^pRrX&X~r2V;2ZFwG;<ysGn(1?#aN4; z3_`2|UF{|<AdO!x;0fc2X(Itgwa@w`RtZnS216?cPZ$Ld1+e&cZ!lr&O(H1ILiDgV zwv<F_C+k9q>o7KpEkR3T(<{<w15lyE7`N(_#%<Z*o5mbNFZAPybci<|W3UadTr;NX z#<v-h>=`<kq3BdDC>)bF)(U6}{TnCWIh88QF^LzU!zxzXh7E591!k>r0VeImPCTil z46S6W7zHy(-oFvA#DwD1!F;k_hQ)%3ci`40Ut?F;#tz<C@65qm$CZo?9kz>#1osB* zu{Umf;hV{+*bzz6Xnax9^zeXcEtjJxOafZHVlX*8^NFp%U~;M^K9O2L*2d!W#J1y& z8<l)gnpwB;2qvhV3WbJwzG1Fe7-|@`;7Q{Gp(}?^EC>2PXO6}vwiKZg==nqlp=)tV z0zN4hwCYwe_nU|@j48LQ<&$!GK}O${3y3$2u?qkptaPSKIMowsXJ}kYPbde?oUsW_ zPbi05zL)}odMs;~s6%6|j!q*-c8Jc4fwwjsULPr(#SwkjFJ8t~tc~>=PVK$0sW&g< z#1wrgcxNUwK|JexlE5=p9WJ|eZ|NEp*~;^#n+8q})*3h{0}D+UFP<pu)~mSDqj0?j z<4c-Do<Dbb;o{N)i<0$ZXS)K2UofHEsL_mbO&*lx0E|aA3U)66DuM@gnKvF}oLP3Z zmXYfRv$}i;7cvVs*Q>j1LOFR#{3jg2Glq9PVfBYH%I>Ore;hd}{87qW?BZ&RooZB; z^Cq!ag|%!Or?Gfykm!Yf3LM(2tl^nQTf+4go*caKDbAwe?yPoULcZg4)Ndf99w-d2 z!790pqcG?goce?vt2vN_*S6j5>JFT1*1J3a+8$xa1zF3QlL~Yy=^%kYzUkcY43I%Z z6^?GBL~~xl#P#MDoN?ZQw~reYyzewwX5tRJu+glx8$)OgP86WvCJwAJS5?P%aJ(L_ z13HCTr?642&@m{y%lYPdcN-UL>rHsFD!?hkH3Tp0z6_s;H=3<$p7ay%Kd*JSnuXUY zJ2=Jq!Zx0_`S^09+TA?4*?JLh5ww?e7`=@HM2?6O(!tlUXOgx%w;irKj8;Osj_T&y zT$P%?j?0S+udZI6UtV5VytsO4@yx;^PdN0xHM?r($1cjcw6L7Xmb~eg<<i-+Oyloi z_tm9e_se|c;)VI;)2}U@S)E^6y?EvP`2^gaFa3&G;)U<X=5G7QX;bP(_@n~mTlLrM z99a5l`l@-~L@Ocn?cie4ILSbg{^$y7fhXhsnT^CMo`)5BzS*sSaOWz2m^$K;0wf{0 z#7aN*@ZcDOx4YMI2+JNF2Ds9=fuY?7bH`Dh2Cj-BBbiTA?iw8A9ON(7nWkHPD_70q zeCiZ|>%8n~p{^>oL)p%ytUST%cwpvKL^z}=e~REJ?ZV(S9n!p>J!7Zyde@USp+!8m zmrbPuoL1P%;58k5x<2}1uUAE;<6m?}J$Sc3-8kiHUS``WhVC%noEB7I%{_I>HFNNK z@1cB_8)wEbiR;!!{KCI*&M7=Ogu9HE-o8dX`-b{;*iPzW-mcf)t^&K(OYHCjKRJC4 zM#{g$0g68}Vof?uACtU}*29CfFxpx9AkK%<bz%DG)p6+{_RM=toi#L6kjs*5>bYx* z3=h7Ani3z?JW^s!9Ui>ar`H^G1|^SSCWl(#k<rL1I)2Fp@lVND25Ta>xB7K8Q|ee- z>|i=M%fqk!FHJl#+}AU;KQ#HO2OpJq2`?@%sf8BzkTd()^$a^c!6+PWtwCr(PvA99 z2s_;3<j=taz&Xq@f_HwbSFRQY=~2PEm+eE~dCV)}v6W2-K*O$>6LJq;7_2oQ8EsTA zs%(&wUDtjBW2{pcY;JDC1q-QLPE&iG)00QzGyF9)s&+s#;7P+mR}Y`NxV(B{{yX7Q zG8Sxr;p%m3n|Nc--JXNIdNCpK!RV$<c8&&sI~!VSY*cSv+C&?HZUa6;OeD_GUvFt7 zy;XPtc*y0l9NB{zYFDLbcXU;97N$TV;Yq`S&P*LP%pG-4wVp+yf`G4dDYz6k?zAl6 zz&mdDVbA1Ua2ks8HQ7=0w(bQ58mv}J7IEb#N|fi}oaHMf%s$Nd$q=M#-|>i&cfs|L zhlo#9nT*ZHNS_)Ra+BUuv8R@=9bG!WY}U);f4#z{yOR}7;R2M`nz)PN!I~*>*%0^& zh<~k0PWTm5{!^CBLBzku$C95MM}`*ft7pnamruEJj;Qck$CZCmr0MuF<jAb|NYf7` zVyQHD^Buc8-U)4B#CdCJCvJM*N+z;c7AU(TQO{M56_aK&$wH3Zzf^!MjazAK)nhXG zaJk!{9(s7_^mB4G6r{W0|AHJNo)aEo;=#4g)w;aX=T9@KBJ<JKJDaU<cN^CXd$?C* z3!Y)V1zdOx_ReLgO7bSmq-UUmtV73AePg=@<tjZ8B(N*rZOaY39JmgMv5y4?X5F3P zvfL(kFH-|!!!Mm$DU=)KR=HE&yn4HI;+^OBR+9M0*noUcffq)F;X;*xB+o!^?=$VA zNVECANa=u?w-?MeZuyCu$nJmHQdn-7q#YJ1T5}y&;5Jd^z<z`O`1TvnD#N8jcXP9L zvk!cn{!$K4U1It{bvYAN3sg~b*F+x>yiFs!<~YRJ=>=WT$a}+L_ohvh)~ao6V5<kd zDNOgQtHq#wr)u2pU1`ASHOLQco8jBShAXd$!L2@5E}mXKcj+Q;5%d}>=R3rDodY&3 zcak-yZyNP*&?^NZW_sepv6lpkVd>fH&x?87fC6Fnzs)<q;ZsLi(cZ<@(Z?uuxNvR8 zLSrL1%TM~8OeQl>)#up;dNRo(!$IMaJE_?x&cm@sEk?P<_xHO{7bjF0atyYrTh*K3 zQ$x3L4-#&pFgm4sun};A>?`PB-Z>Lp@t20nF%j=O&Xs*K>BmSJ4WBr*Aq-Y{#sNPW zECvTT?8jp<_k>AW2P}0etxnPfXuKPCIbASlU(xzl>*cZp9K}5a@@{q9kah_V?kgnP z1^vR$nL!eY4TN|g&(;#tGM~rz#8T8Ec`5~ehk1s*Sq6!(eRLfT0>{&BHc#q|_&Gbr zX*H71c`fpEaeTgy9EV+`2Iu+Mty^v;etPnmeh*Vs$=-vstvLOj#osEXYE3(osd_Aa z9hqvcY_-{}<ED~C>M^2wI6e{BP*PlmHy=14CHI6fFd{Sa&BGIaO0S$R^kig~T=nov z5cM-H$_@sr$qfdl^8MR07>=UwK3LJsy&N~&dW?s0@+5WIVO9uFj-X<7k>lfZY{oqg zY-H4INc2iDa7>8Hyp6B++rv1J*3#OCob8CG^u|fLj~@HDbS7*+G_5_XQX~*tc=CKK zMOoPk4r}d&o!!nYank-PFTebEI~<y!`q8Va_Bd+fw_s-EcZiM9vCEe@bF5=e<5gT1 z?fS@XpjrLd_B_-*idJXbAXjYfJZ6dkp$j9)vK(s~%PF#X1G|aoW<^Chaa@K^2B^Os z4C|$>F0Yry4XdyQqff!?uKi`+{nu+G#0#nQHn9QHhT&$tvIQfqCU1T$&>wtreZAX) z({EaZ$TK6={ItM2yk>7NAnj0L9)+m@6a>423hptjcWR>>Fm7uQZmdx)VY9UX&-WXJ z%KADURb8_nxbhb2y~tE0$?`#~qg^-2TI;X{n>*>M`p43ryOoVs;8r+RBynA>EfV<H z-B{92Fa3Ul?;k;Zb+m?~V6I)o-i=7Vno4cG_7zv_7G(~p+;_6&%p+hlS%$Lgic_MB zN_Xq9ob@H=$YtY&7vXiE^z2gJwjSeR3x7eQ)6YUQx)At6QcQBwFK*tbb!yjfDd0CY z?7~1@?i*DYE${;OKU@ZO*n|9wr~jY5_y4ZzD(;4V_g``13M40%<u6GHN=PD0a-w2O zdL=m_)eU-N>B_!X(p7b(IL67l3>a|1fB{1dnAR<B>$Yxdz<>b*Ydvc{zqWq^zxrOS z_g{EFpPAWT&OYZ{NwxzIZImoa_nv+Bo;`c^%<P%jGjld=J3<Pz;=~z^qI-iga)Je~ z>6b;N<q?Dc09dAB)WGUt;p0HU8%?(Y#XXwSkXSQS%hWQMls~(O@F?;VgUXn24!9|r zUcg*>y218Hh@f#WScr=geuPdnDnYiX*gzmm!3U}Np}>YSc2fnaM)RYLx;lUMNlyfu zETR%yAJ(5Sw*Ew>SMD<KJfa04f{|*mzT8-$Wz{2;A5C3x-#O{ya4hnsgqz5DKzuFo zMrxf3+@uzYVf9WE9^@)MGyhHlqFri(_UMR+%9buy5VegKAqZI$884h^EF&2{bgWjr zB^3*0&)}cHN_hBmhpE%6@Ut@>H3bait_%y=0hl8jk(Dv@R6`JyR_&fUgRsP9=sl_@ z#zkPTkUcAD_hH_ZTof+_9u-%6*+7|q3pt+58EJf$9K=v0nXVtHk_<s|dQR6jOo^Ku zmlj;05<bdY@mm*ZUkWaf*h9rt3Za7()Qrn-tZI1#tHZcAtXr9C2I?<r<!;2exBA3R zfqL_6r~}dacDL|X*Q2al1O}@|y~9wgUagd_UOk_>{_Os&|M}9nxDLZIq*oLAln6Jd zvMr%bF33wRdx#18EDh2*>T(_Occ2gVZSkAk4~zv}ZJt}r;2Ob}kb5T1N?jc0ecV}r z5{hEMc|xf{uSRv;dP20(;ssE<Nn9=jRlUJMRl6l{Js%gIA&9ti%X_kLR0`AJNA>Sg zvV#D1gbKpbhNy2I_J*6je}rZhc<4pCYZIndS}EvBz*Ys=&Y<%9+QgF~Njp{Oqr+5H z@SUoUrZ1FRQ$()hT?aceTszfNyn*`Rzoj?OrbffHn{s|LMRFuUrs-4&UA4E$h}sr6 zvDA`CBLYoHK{<RCB|L&UgF@iT^*)+OvK}ytH*rE0nIRs?yyBGFB{rH-fdX&Z*l3Qf zf-{k4ssW0fgoZMqfWw|sY?ZHd5OE^tp;2!r$?WQHhVOC5x_5J9=>?X{#qWOk<K)b- z7kY6SRK*KSlD+r_k7$()uPPdeaV}%fQbLOi1qq`UOtMmqkH8W+8k7H!-89M7qF`4l zG4(v(J20@xaFSDwv9TmX0JHZ^7<rrLTK&v9hQfyl6A!Nee>p)OCdG+44st4d9jNR7 z7S*Mw%n<b46l*J|s5Rge0cFGJ%PDYrx&kW0x`7sS!6RB?pYP+^9WKjdeN`IQd$l*_ zVV6@Cr>CG1vJcWqv4%@8F6FJhQ(P#%!5?81ylx6M0oxP3dtsz>b@dhfH)sh}F!%M; z`(K86>jdm&DEZw7_qBa9j0=zYF~NfyAkc#QhQD>lo_e4e_q5nPze<9HKEr*oA~`Be z;0gUc39Tg|dhNW(y@;Jj-Ugi((}0*OlkXC4WgU}WB@OemXtS#tI2uoBw|tl!!gMXF zddzVenMm%N^8PuET(d5di1m#}kunVH(z#N5n@5r9PcS}fL!!9eJ$SJ8PHpLb-~9i6 z{X3L0dx923EG#&62!DChp>yUKod+-7sB{<X?#3kJ&)fuWQi3piFow-OSut{ts0OFg zMJS#0?;K<45{ng-TYIn6C(rHP!_&TzU<_v~*}7~i%x%L7GQI8;A1<r-o7<@7bYNHR zCvXIQlmBF|m0m0gEw?+nlwgj>nG{yn49HNFxoHOOSbB^I@1@#c^rDguCP)mrD}1&x z(5-33ge5E4ml-^2{)sjgueqz7yh-%~(sG6M-}3K*CF=|OX(~%QA;T7vKnNu$Djw+D zVE_c;&)M;E7kiFqCM=L!ee@V}w<o}ArgH&TPk7VkVk~X%XU;VQ>Auleuy4x`UEEC5 z5{Bo4-*&X=UAQJUy@kZZ+Qg1Fy}h^NP4D517SQd`Kg~^F#9Zm7w`SP%`j;d5XzynA zWn5vu;I}aG;ua>plBgX-FZws)O>YD4Y}0GwU2J-N0j4m&<*keTVo7~+8y{SyFh)c> zPj>T1a&&VQihaG@RajqMZmhLnG-k2@ceRy;;=#Tcmg_VQS(mV$lpi?79(SGu<Bj0Q z2&3<dCM6po*Z3vSjkZgr$qq%A1KAJmWP^Kvv!Yb>R(^vMfX$Hwy&Z($Dwbw~q$yD9 zBVK8BFX#v<n8{;cD(WdLBKv%*2dGTn=L3J9M)COshc13;79L~7>DSf~!N0e*D*tZm z#kt+T@(L;n?#ue|PeBrKQr*zW=K)lHa&YhlY<~V_yVLXsr-h4)2ITEJ=}-HJD8fm$ z{2*8}_NfJ`sg<($`kIE~x|XCxHd25T{KpiCC<Wau7GtWuvAMpgd2Uc08}}C&OK&TN z#4*TmQ(s@9CD{dH<iuLhy?Cy%i2b1!B~>Jb5Dzg@NAQEBS&FwEhSQnuYL0&2Bk9ee zT;vy@pA3xNnc`5lBWwsLFO7T}MqLV&ZT*~uE8Y9cl2C{YL$z7$2McI=jyTJ-cP`m% zq>DyYX@At2jlW!(ZxJMy8ika}{c=dGOSOe25+s5C34m~T7pNrP!07EnQM%_G(YbbI zG#%7`ogftf1d74g&(CR(!ZI4^x3ZH&r@|2kJ4sLz2IFJ?pzJ)RNx#{jMSe3r$#2R$ zNc}JCjU^Pc251~*yW!c!p`;rWs7fy`$hbW%Zuk!||F2ZS7@#$QkSv{~7>Kx|STrTt zv;R<lN3j8c<4IP&0Xq?@g}v&}XbdDP4KG>jym|FB1q<z^6ygY>=(8^L)l=CsWn2>I z&H5xq1y>r3|I~|;vZ55Nwrj9xO1ZN=pNR;UYsa5W<V^#GDhc#_=9y>Sj$mekfHHm( zDzbe@XPtZRZCXT$e!nb8HS?Lb%K+Quh;E@ckAyk{Xlw*rMjJOEp3fXjk;ENdvKsSv z(Wpj6LT3`q-R(d$*S>VL)bcbp*IKUE*ThUy<}$Z#W_xwmUR#2y&SVCC`%(^;p5#b3 zg=<Ac&^DUWqV{O;p8T2g>}DCC_}p~gcjYfW%<or{-*0lgiKxTYZW8?2D^X6q<4iB- zbG7Xv6JN2b)ZhIg%0){`xXCkX);e3q-h&Q++$33RVZE`2+;q?hm}Y5FZV@3!C0o;Z zxjc2;^gU~!HyRj2SAD%w8YQbQoM~ozmzvGJFJ`a2EdJ}K`3m0Ye;LDxYOUXhJ|f@4 zygjkGv9`I<x9<QoMG%}o>T=@kG%Mu59=%E!z(S-cGD*VeWi#G$LFheJNMh@sKnjka zxInJJdW;*ynPLW6AB307VW=CEdG_LN-V^P(XW`tUbjWU)!H-_E#l||as5KGb0oE<e zEa4!7RHH^NSEh!uZU`8*5;B7@q%avB5lZXoJAO#~-B@p~GSUdQCy{y(svq)Z6^Cu% zZgLj4#smq@_G42sb3Z*y{K$ldoUZ#D<kW(0h!yAtHENwpFO&1Q!VG+HaMC1lD9r;? zh9Qa0m|s1g%`Yw@z|dlFPj7O9uKS$!>NUyI6mzo1QPeh9OMRO7Qjn_Xbl-^<>gM$c zRD})A2){N<8FlWc)Pr`Z0PLy1TZdl2wK>LJN2z5yYczQhpGt`?c8Au59{OKKXvm_4 z3q=AfdM64cl3x6+4!aw_QeTIwX_n7$UaJ_vB@V^S-e{B{gE{wJ^ssp9w1w?32h#M= z<X8a-l7E#4_WH^i(yAi9^n7a$Tw#u1%wf;a&(+J0qLDbC8sD4)=b--(I~_qsJ^Ttl z>n2XyBUlRAUF+*}tuvb&aKWz5IV$Pv-CTv9e3r7GT_kT37pfBTp^8L8z#qpjlm^1H zfD0OHS2qR+V@hO?)HBX462+_Uc$o2r(V4-Z{X|Ub!mEwdGxhZbX0Tv`AekpYF`2KH zgAk-fr}p$2oI{73D=Q3S!+{{UZ1lTb>;+_&0M5g9Sz2x)cdmmP-#>pa-3h_dnU`@< zEHN2}yC|;L#uw&SSDO+A$S7GxXq~~8)Xf$-DesHxb?_6TGp|pK$YpSeSjt@m-#zXe zLGWrhZuY(s0(AM8WR`S1A;%_W-%jV8-~FmmfvRl{j<PhL3=!RDi?tx+=$a@I&r! z&n5#4$wjOcsZS@=<EEix=V|QyJ;OeUGIKGbpx3kga40ZqZy_=Bo;{N^9LODx4AwVL zV;xudk#rZ^5CpxnUawPz@jP%E+YvC6b;DTEg4v;Yiis4siu01Wc@J6=JxH>=v~f;y z=VE>c@oX+MVEJ1_Ufl)Z^J-(@4s2z86cc-=?Tx+Q5Ez8n1NK1b@R@rgaeb6bjE!4w zEND7t&7?*cC|LMdLL_wrzAovcTYFUcFu(BH`Tf}nf?t;Sn;a53rJ2#Bb!LB*GaBXz zNpr#k)ccu@dH^C9X6WTT=%GOg%(({Wqzyp_ZWx8DD3V((=gu@&a&3v}B^Y!tWPOp4 zEjEEN8SyhvE7%LW#@*HB<~dG{qE}>PYjDq=89YKx;&&j~{X%1VAv#%-X3GKy5W1@N zsC5QZFM+t4dTvp4#ArI09i38G_y%sptToq(-@-HxVEordv+0RrGj9$}jb>xhxX?54 z#@NW{NVa!q8lPbxd~*yt`Q%K77E?pxGjC-R$FiaEx3W);jgRclMn8pE#Odj5VrtLW z2?QjL;=8f&;o~Pq#>QXEj^e%Xi5aBzJ~1|fPG=@E4rpDCjpDsy*@@Aq;n&gg(9toZ z>V0efo?~M(<LvX;#8ftvO%6@Xj18YWJ~Wk0o}8MTm>$LOBj|Q~Z2Z_1Mj1UZIzDp% zqvE@4^bLH-re7aIu3!wcXXqrLpCWwO@WkX>Q)92aK9jvZaU7|Sr?aD@fNbdK@lhQL zlNvrgG<ITtHZpW#=ruw&l}(_RsXc6_&}DDF4%UXm$rx`4|4Y&fPGfjtd}azC_hXh* zGyc^#$EHX3XG2qC(?rOzsfiQ&_Yj?U1HGdYyf;3oy%5!cAipALLWG^fq#Z2T$mq~< z^o8Xa&n@49508SV_xjv(3rChdsH0$2Ku|cx>A~#eMgytD!5HSVQ*e}=A%EG#ca4qn z;8Nghi!FC{n<0zUBNEjm=CYxX0|#&|v*s#7ikW~HEh&0e>e$!hD~!aK@FwhXaAen| zJEEO{s07=6eZJNFKbNzYR^;P>Gx)gr>gg4PSG)A({)`quUp$pXkhZ{^5%Eu8iZD>+ zahlJ1;~hX2be>q(iY0SFBS5HDV-c?cg_t<*3s~l1o{SYrOda};Gm$4p88zfUk)w*T zF2^612H-j<{t=c24l3mZ-tj|`PfM>!Z!3*=A@5+$6Aepx(?78W?rnR;ziCDrc{P0| z`a~<Mq9!~5cyM)kc-+d%VAfk#-O@odMu>w_DcFFDA<)P8=bCxVNYWZ>lf>J~CX9-K z&~9$7;|7iOlpY?~owHg=M?wGQqo4)xlj~I1?8$bCRh~zZU7bu9C_}`^j=(iah@t_E zD7y@y??~L>7!xSL;9!6a4njCi%}sxDY?3!Bl0!}rS;f(7uE%Z1-)<pF`tB0vz~!@b z<^kD*;lOd2?>1^suB-M#bR3a{RLTz*SUiEel0IWx^^U-VE=$!*3@dnEN9qGdvACWD z`d7A4enc*z+xPc;Xl6b2LCe<kXcf!UcN&Y71gP&JmM03z#_DEsvjxF;4o7aVO4YJu z_may8F~RC5<n(p0RWQS8r3VqZ%~nxpZd>a^DtP$nBB;XQh<)hvX;?BKvtEK($~i<? z^TUbP-1u;7pb!cRqZB&`vNwAbRzi_gJY}jyF_Eo3%~i?1U?+dwYOv#q;I-}i31nGJ z9yH+w$1Blgh{%>PU1z}-8CR<|unZ4TMgd|ceqvN{e+scx5VEIWR9wL_!928a-pS>h zl=7!|135m&=Vy`1Ci4P^MsC(RtAhG4Bwl_h4=T_deZ&Ae5WUD&bFt$T?<r?_4~zMp z*izo3GyA<b@1EI|mFQ-i^1!h)%78A_mWZJJZV+<J$M{LO87;>#KxL|dN4m`2ab#(E zLE8f!FZ;zcC=*IWiSk9oH)jy!5?{6jYP5!zxvO?%L#egI?Xc9>E9^aNO|WWJg$D<7 z_M`mpZfNdqu?Ctf7A1UeFs};D%>~PpZVqp2VXx61kcp_#y^Lzg2^+3KUb;@O>!{bZ zT)`<AjXDFP1d0%y!65-#s<6jAZp3HM^y+UpG+{LofK0|c6#-VUkzTc?F_k6!jd(Mj z^k=iRDT!|3wc<A$Fm2+7?&<p5GJNX#gw@Tl&h0Rk&*hlUa3_q6A)2(6^uJt6yQEMz z+0q7_L*MyE9fulZBMd~&@A+dAC$TYyEx<O2C19EpiE<MoB<$IZCHU=Q!17(o&T+3r z+N2i==_cej3MQ?`e#m^UrP0xR(`M)ZP3D=OO#x-R@f*<#KZ>tRqa-5EtkbnG3bs_j zVci%*vX+XcSSMrC0F?gqp(?gI_kpWoRf_my`M&cmhR5p482mB0A^v1M^Va1w;^*d} z;ylq#XW)cggfsogbXwGtH(@H6gCB1i_THTkM{TmPR&VLQV{i?uFCk^hBP@t^g9}aX z%3qJ%gI&C|PDB_!9jrW5M8Q&4p=?sCT1Sp21nezJ48$DDM8dwN#%-uwC??rhK2HrD zdIO4E(tFErPjY2Cuh-Ocgd`P@7|q}d{Y^DtKwHhm>zf<!=VveBK!6~Eyjg7rCk53p z%MJ@hkRjDZmxF>yRtPDi=YRzPdVMc47FdK`?kP>rcna4_+0*Hnp_!A@b5o;3BX6-8 zj?RncyEH`mDcbeXR1jWY?9v!EjuT_!L)PA6Tw%5>e+B*nbX!)nZ+d1#XJOHPx%uIt zBH*yf#DRf~+mEiKNi0x<dBQ*zE&@W&0J$D!#!if)|2g<IhGDdy5HJo{ce$2gwSgaE z?&$G}VYowH1Hc9ohCO;7j<2P8<YGcj88P_K`NJ&R8K8l#>I}ro%>@ZV;o)jO9I3SX zLC<3v2OcF>ko|_`DVcful(miZDP47e<&&eMlXHN5QWiO2AO^*aO^4nBs;@FnnkrNt z$PysVB7Bb8=n8SSQeQ!^Oa%;L#nSb8)-S=ybW*LejkU}cG8w&Fzq+(9Y~L>%miFt; z#Y8rbw%V0HF2guJY)`P5armBZf<vzJ)+a9`Y9RTBp+6;OZ&5*$rm}w+Vvu~##48g* zFQnt-A=_g?lW!Y~%XK6A<VpSA#>N7oDU+{pAQ5ChfNX5?)<(fvV2pDt)b35XP_i0n zNIrT7?UdrKh2V$+xcCyxD(TM#Ouhw@6hKXb60@tMB|ORNVqckGR_smq;%U__<r4Zf z%{Sn}shAzi9!cL#sSzv~?QP*&0Bj2_%>vUx_|3~|eL)n>sq<@atmC|Z(_eUynry%t zj={_RI%7p(XURhWv8l!)5u;wLyOWtGUqh@3TdLUp(K7ul8>#{&6IqyFfOmTo<il&& z`G;H-c&mC^jnk3{N}on&TE2!86is*=h(%~&9CBd^uu6?E;1uiqT3&cjv+f{iB(qMD zFOqz%Bd{SJj-P+F|Inc$8G1d<3efy<<}s~n;(+6;1YOob8=@^PaK4=NPJFW0>@)ZZ zmjdwBYxPx_=$93O=;>j3dZN)HI50EHiowU%K;pjDR@Cs&;pe3(RO#kfuvp_7u%Jow zjE0BQb1!^MUa&wE@vSXU(aE)W!F5WXmEr@j91?~RwS)A*VnC6#5Ij!n@W<s<5YOq& zwW#f(BZ>r}nDx!IjodTE#{aVkyweZ2xVf^1sUUMygs>xulrfkFPXlE<#;$LQPL^wR zM8=1eexW`fG2&7eniP=-=UHjz)E~q~tW!sb$9qm%90jKW-)OE6W_yw76FZC25(typ z)X)z#=s{h66j<gJ*qiH1SLqmIr6`^irn)Q4jIKGvDwr(PP#Buez<UT<hs{B+*5o_W z75pUZ9tecdJ3KH=H&&qj(?Pp@eqU~EUCbQCAIde*C7Z6FrlD9j4N|k|_K6!lt4o;c z>2R)ruH&1|RKA7-fUD;L_cBwl&M#vAxp#C~l^tM*HDK0bWe|GQR&ot(Wo^RT+I{QD z&ktTAW><%Zc=DjoL(e{oYi4vI+lu*JdFWYP;bBQDXAH|-iUKiEU2ftiu$cA1{^?9J zi%-V`9C}t)c352nSOsiWeJcmMF4;7mU^g-9lT^S6N8FuS$5|rRSQl(YC$ud6*+$DX z(`7pf?c#Jes*pbCH`ucdfw*Ph95Go8CxT4r+uK;(o14LNx~kjuqt;2#zIFovoAjfL ze-gn_I0nI~KA+9MgQK&=tzoec&~>(++xE}t(hpCbl%Qb^!UBF4P$DP47oXF$r&t0e zK8tH?lC`k3sc!57JyD0@D$-8_+#^1E1En2gU~IqmqvR+?toCAV*FC4i0)~MQG+90A z5Lq?ZG+G$a+;h)Y(cE)N36m_c#QS*lcYv+*?H4NFc5A+vAxxIarM+r0Jd%bMm9Alm z;LQ5d;{?PEq?-F1Ys%nu3H_i$#yEWoSVp`ogYj^Vq1OUj2GFh}lFejbS?oIo`XhwD zb5yFq{Ndc<nD!4S0^Y(kWJvsDJ}@0#RBu6C-Y*QEf>ndBE%B)A_rdwR*R|S&c*D^x z!E$gB=_LbG%Voaq?{MbyJz{wmRbjUNe76=Lk~f)UZ!*x9>~KzO-Z&$Ydy3hZZaI6q z+!YW9-dKdJQP~F@Vk~ClnlsYOK@Dpm9=zAjqL{xa!~^7~-`7j>!8R9BuMt!0NEZr~ z4ou8<xS!`fL|hqma-8lwf>y*1WH=L%S`nXXHflo>W3!=fyIra(E(y#vlZy)6Uf~h= z4FEIa7Hj|-V#+HG2*8EDx(HqeAL|(lrS~&%W&_b@sN|vnJwiCJ(}s19yPno9x8i_8 zhk9*wa{vL%oA2(|n;Otcamz-oX!Q5jB~H1YRx1XXLCgNEuoT3ZF1O&YgbQ~e>GIVU z;)MsZGaDOgt-*nTQ=6w-2M`~BV70z6@Z6yn4jxpB)A74DKKR_>XMJOmgzOXXHLACO zSb;;KuV%VHU+-Uxj*raEyiQXT?k5}@MWS=wUaZyZ-onTj>@$e8d~0rc6d|HR__N?^ z$Sn@@p<<Z$#zt^1c$g&i2|OxwyjWMbhdH|X4sQRWMOf+3PiQtKkykkvV?;0L$4=;Q zd*~rP>d$(?86$t*>pJ@Yj=hfKXmUnWI3rm!3>`#b?EJoxoq=>|WRZ*m7h6ZakU!WJ zg8e9vz{_yiiicHalyzq>$H9i97b&>v8N`$+kR)k+83!oYk`vQe-vBNa4YUv`xylq- z?_$Wa2-RL#Sv&x}EZRs1)VT^1?+mSEkhI9zXV(wv2TmWzsM|{94-`XxC&_d>)HXmA zh}zc>HI4!7oFpJhP(AgiGj%tQ+$1d&QM6it+t5R6GJkxIa10?O2&n!xRwW92@jT)W zadLn+8j3N##iJOz2w*w~w9uG*8bK{ERRV*sT-(eftN9t0KU(*rDFV*%w9!H-z^o1l zwk9f+jFB)x9*0D+K`bS$pD0s@`J6{Y&0qpOm>PKz71mEUx)>ZRy{*!_a-M0AXb;Qw z_FNb|@z&fMLsReX^)A$>ffm=B-ZkXTX9h`aD#i}bYyAzv?5{O@Oy;ie36lAbW5Xg~ z-T011X-ScDM@(j<xru4Fs<~e6njU)v6XMSd8b{auKES(yoC{cq9~FOp(ANY1^pzuv zNKng8Lc6a%G0n*gM^1B*gWB{T^|qGVN7$7Nwp0N7W_cM9l&cqqTx>6XmxvYH)=2rF zd$v-mF%-KIRkReOhl>pnebN@9O8c}6_|ocvwguG(U9Wa@eo^a^(*Eu}r6>Wc1~Zri zag&87Oy&Zgo5Mwo>FK#S6PgN|IcNNm&CQ*I?_?AA{vUZ*=0SLrfnjJABUoW*DjFuA z%{V;U3rjVm@EjJEHzr%nWhQ2S<rOobS7;)(mSV@nf@<7R&;d$gKx|;zLHZ6x`i7#f z3W?~Om*Nr}T3@he*Ec3rT#Uf9;MA)EvA}H&whYc{fTuE(Oqb_oI%O#S>Zn$tFKi%| zh*mrpHgNQU%?JNLhQTn0oF%L7*aI^L;`^m~wHZ~=p}hiq1t?zb=azs1AZ3ZDH9!WV z*a5C5z^=h@l`i2^7NZQ_kNw96H*BC%gePbe_Lh5@6EV*g#iBVR<^G%~+TQdszXTg$ zj1rz%aEVYal8H=sT8;?B8kE-wyN)kv2tG&N3gnIm*Gl+iDnN<Z5JBp18}fP;juam6 zKnV3a-spt=Lx6*t0I-N$H$j1{`X9r2?%-wkz^W-a5|lYc0<B1duh{v?-(Yp6-ym&n zOdce~74^)*!{iUj)L~$8@0DvR%k#X7<4#TRmh7q<(KTtZgL1aH%6pOyAFdzU1v3CC z7wr+w?P8<mV-jY?>uMj1B2e<LJIkjMkM0xde5%K$edbTl9zPkCV7Xxu#rR@^AaO=o z!>|OxwRMC?6ly;V4`!-x`^^spipBL#={xUw@q8HgiX(kJwN>5N#hDY7AYBGg;dvKM zzDR{*oI<5u#LArH(qrYhc~n@*$%yFi1M=C1BLOA+pW!17j7WaLx$F~DC=zqX^&x~9 z)7&YZJ~kJs!Wl`A`^GgKwn*7_B%g=%X0`vb^>u`;IKNiP6y3&<$y*<;tAy;5V5nq# ztllEGLGVhnHpOSM1a(|p`4P|9eo5()1O9fqtaRHZ>q>!mFiv1g45#ax%D|vE*rrQn zZ?S}tI8>~GN@D`i=LJzUP3uaIG-N~Qn>ca`-=@`Ftj!`OD40MU;BI5%=_1NG)oz_h z00)k%ASe{8!^utFP@_C(Cpv*TISG2g=4*I%;h@my28sqFF_I<^mV6<jG*jn85gNpo zM6MbL*0>XJOP=!QxpTk>#CW8;sH`Km4T0623+z-<JAx({#&lwVZE+kiz9AY`7w6Y` z>)8+=O~Jw0Mb1B-fVa~l=l*}ONUaiXk0~2-uY+Rem%GZuf&hAa!Bc+107*Q4UI>#h zjTTrNCH$^#G4vWMq6|o|(%r;dr9xAr#!`>E4sFmX+VXKhH1xr|w2sUHD|M^!6u6(g z;&-d>gn<i-!zN1u*Nx<<y_%1U@^RmuPe)_n=p$)-nv!zf-iNw6625mLnKO(IL^P@< z7f!`Gg6yGPEuTm#XgP9_2V!Y%^KAXRJ7b|scQ9shH|jhKD{E3T(;!2O0KAF<K|H?C z9%Epcutfij!d@%|A_z(a5J~F*5U~@bp-;~3N(s@IMGJWJkTl}6=`jtgODr_MhO|QL z3-E~%u|DKtO2oJjj0I_QKEacvq1n7vW|B|Vlc<HWf`=#W6B-VA5ms*XF-?dH9Ed?i zBhbh!VJyy^ms6(LmHjw-pxHBerF*Fv7EM1Om2ZWWE<Y(pFNQs5bpj_@V$zJU*faq> z1#L8p;xR?1$4)R6_ZuKU1R2v7nNw+4hd$1vHF5hQ9FjVlFt}SViEkm??P#=c0+Beb zQSlg+T;;+7lKTX;l}l-o8|Hh;Vni;jBX5|*neZ^NFu!^FjHpO7tiswZA>7_8g=Ll@ zy_Uu$LghTqNoJ2Q^C_y<!MG2~?LFsmG_oOo0Mj(QRnAwn2^Ycv$OJ?-ysO?e<~kUV zpcH088Ti<t!v~)m2x=0N>WIm^pCj}~PG0Tao17hqT>#<35EWyc<>~fiFMae#cI2gx z_Gd?49$2iuGa$V3qo{*}FAu(GvCh_M@;cbuT4V7OJx{%;Df@cxDSP>&M_z=_4*^*6 z@o?z%ML8RPqUROYoJVDCF9!<1wpdRF1e)H&0vP`3(&lQxvqx_M^vubbX&+G!a~nKJ zSXy-*GQC9fgPyv%{GR{#v(FyRz0iZ(+R@n91xs{e_sz{68#_MAOi{h--fw_`!rq|} zn4E8jJaLh!gd`-gC9}pkwFg;#ky*DOMTCpWtvfwvNcF-f-&$1W3e^i|dl6`{Kq|xU zcldi~>a}6}{YEHqmC7oD<U!T6WKy#56GAAFlwrd#yYQFnPjY*DgiSobvRh#4;q(JN zC1(MNZpzPKT|v`&o~LI+?p7`~VN_$(04SujA$Q?Th;W?1A_GtchiwmR!dFpK%R&%R zrW0*gupsT&UNk!;cNfG=n4GdISzZ6N8Ac;;JZ9YGT!$X(eK#oT4H>)CA_Or*d%AVi zT~`B3DG5NfYY+i_gco_Zn6x*-37A*`P{Tw%0-Jnp5jJ2HHGm;xA9e~91Z2^x#3*|X zqld*K9QGE1!%~9Pqh#58_Ri)SQ?N|SoQt^&tr1LW3ukHcf&_4iok9@XT3`=P57q9V z=FWdd;dPr|N3~M$BwRO-j&x)~VueNkVx7Alzr^UJVGwCYe;NlgGenT0eEkxKidX-r zr#BA;<3D8G%=*786A`xRuFqt!{8gBUjM)BQM>FFF*n&cM%CW*$ah@^etmeVfAB2>j zMVrx<*}b4$6!yoP5b!Ymn>==d!=mI&H9orCEe`p+KhQm*`Nj3+{T=@;%rA1`Kj+u5 zdAjL3t7`0S5Zx(n3rpX!Jvph0B01jw^=AImT0_ZyzP^!<AFHt1i`B0>(PpJT@GmzJ zcWX!*YfUSQrj~bdT(aDGr>*EqD$=?O8cMOE$sv_yq9YiaunlBN2Yq}~@Z3z}1`eWN zidLNnl7erP&-fFRuDngFuXj=cPU7vzeT&a~4GV*V!X);()MMD?+_|P#PpDfH@8C?v zm@6~K=utTI!Sz6L)rhqatRU<8$%$mw#V!mzp(Et4yr8ttF7e}fEfMtE08L<gmfWF! z#E4T%WM6j+PRQSoUpkz1CwNGRb<+qW+8$+*`y2q!))^vLWshJC;Zv?{gv$5L%Iy1z zo~fnX=~2<VQVQGwo@z*0#7YE*4jwEz;5o5KV>3)dckWQ2!0x9*ISfbkvWAo!XpD9e z(Wu)jzTlMtAL!et7G{9_Rd~ffgqT1wPRQvnJbjX%c9nJN0^v6C1h2io@q!XjsZRGl zSKL*pf^O^Ocsx&orQYQ{({k_PckXrQ+2ta_JIjqYiqg*+_PL^j0;+_BDr1XAPWN)- zJz3jHy2ScO3lgR16)G0{Vd5p>NP#ceUgJHZ4?^5HGns9zoeC0zs#J)C4VGVvKd1l^ zEa#<2*u@^_(0XkqJ8%%F|A*!r1d`jHCw&>)w1RJ8<@js|oYFCAz|viG_!3bOX9msK z5cvi4;zU^!LE%r2>Aim1`L{U3q18pXJ?90)BMKT07wlFxE=^Yw<wWZhFKDIAnQu`t z95HT=h^VqAY}Vt}!>?wayDY6~6Ic;Q275)$T7!eUtgq*;!9m=c#|cJ3piGv|^2p*K zYBLv&%gh|g`BO7S5LX4m2fN{qtyB7@lOd56M8GP6C8w(dYG&smO=S*c=rXAlrNHAm z{3-Sll!in(VsqC~vIB}ebrt_QXwGO73dK#r6x?TIX%Q()jruwqOPC|_qM%qF`DQ9M zqoa<-Ia7{?ZuqikZd#WzYl45TpTk{GJN=Y1Y?z|}P$4ETuLi{X(Qi^4JEzpBv1?G$ zN$L6)P%$k9W02HwVtVXT<zAt})HR(S4|%+r4qXP(Zgw_|d%^Yyegk*CWo=<~gXxhq zyK>9jIWVO7;<G}$_N9Mj0z1#;K?|{j^h=-u*VZ8IA~o;&E((qlTFB;c=bA|$HGGS5 z*p1>t;LhT*zzzc79Hcl8FX5snt_m1r<<y|q)l#7Pcg5jwu{kXZfik@E8!kxddXY*Q zQ&0sdSdIx;OK_hDd4Z5qMNd%lGs%T;_k}lW@KX5t@_Dv3loW_19=KvbD_0{%HP>O6 zAraibi10y92d_Ax7Z{JbBHhCACM+ma+FsB%Kx@MIlqW~qFlB;4B}wPj*Q;ob&|3^R z0+dF$BtI&SsFBxdkPXGh)WA#$RXE5Scp+IyHF){G)Yq%C#>v5zB5}cqrgfC#vjQrU zKuSeMU6R3sv>D`0Od%DdsUFimHOegC)avy6z{pEb^<=55avc+~yn}_DawS?p0Su}0 z+1QmxNbZi}P*#O{ZxEbSti>N<k_;t2Ot#TdY&#O%M!e?fwSpr3M0n1&^prM-ys<Ou z(-`f2Rp29f2Fq2!8uR<J3}aPc#QtEJbm2r$!duB?#F*x#SUL4VK~ZEDkZ4pwrBF_F z$C~Tbvcg13rWN^$aR7h;6~`SQ1c}9^A{O)nt8=A1P178qF!!PT*}-BRWh2129Btr{ z_K>6OU`=f;qijdZKJ~J#l_(9(6=*{Zmidv0PGZ%g$eAU<;Bjwyei>H+!PsR7h#3<V zZ<d_`V4`(D9$*h>=8&MI(v4~mp&S%0k#Zaf72&!5zYS%LrMaaZpU8UDG`9=7GCGb{ zUddSVTtzBX_l6u1@yyH1&c3O%8@-><zd@SH>K)OvPI4QvrtF6Gl3`&k?#pN@&#@4( zf_yweV)k54wKz*7{tuO?Ce=?P=i33CYm1yMIv_CFUJK`gQ;4&{xe953F_`Z`lI!7G z5F4c&&?a8fj8OpkCFPX3S}YtB3E=q?F65LS4@!j02h1`bIajlss1#vH&{(1BZ^K`q z`HR?$=&VPw5h@XbDxWg5MIo^vvJlJQ@vAN`V)|Y#Ib+$2l1mw5rZ4&|hLtbj_EqUi z%sg1~l3Bx2?bqABX>9Spz_kBVZK>W|N;W0E7ut%Wm$kzAr(kK3vw-V6-M6Gon!hlY zol3Os3?*6?_RSvxU}hqWgo5e?5Vf5hTOv9rgVwb*FrwBj`oy(xze^)L-9!HFJ|m*0 zJBy6_3X(kj)-rFaB~G$q!qNw1lwd30LH<)%N)SL9a(X}j+b<;=sd7@BIQn%8Q9+Wp z2}SFPo<4~6jG%aeiyHOnvq2VC7BebY6iz+A6b>1=mF4EA4Y$0Ld<XeY#OYH#o{w>F z=eLY(cl!$6S7AK|juBcRqkVp8w~@NJcU7<5mZ|#*L@3n3^xw$1In3O%`Ab&V54g@# zr6vlPCQQqf{v0cimKU@=)(YzkTg3v*V|kuR1zi;qE@*8D#=x`PS`>H8gh1^H$}$$S zH&YGdm2H$BD$4GBhSi1YqsX8d5+8whN-Nc6Y^*=IQ`%_YH;=DHa}(|Us0MuhA&zRY ztV%36Ap7jJyE(5#$lB)6X8Q!@Fr3|TR?#j;H-XR*Uj6{*`up#Cj*Bq+_++@_!yFL) zC~~;SgCg)fBicr?C41!qJJx+rd_J0TVZ}<By&$_QvoEyR8KNJZ<I6P-i9A&H4c844 ztVaC4N*3Y>7TkH#3yfkeTY`D=u)yre4zbQc@8e0`J^pf03gghIWlSz$*Raw(W-pd~ z{VzLj?lw{o_r2uI49Uq<*|>JENpD?T?5^=OLo1bCy$-noi5BJ<i!Lx3`tVCG7B@aC z13Ruq&(cbR7no>&WD>Oca{V0^VI^eZGIc3|nTp{&l5?*3G+nNfS92m-mv3k%6Mp2S z^&>kECzAMWEHADdXs(|gI6g8tFn_8waAsp=dBCkt>i|ENy;om7aIS%*{mf)6@AK0D zu{fu`JbP(da+;~XiwI0<9keqtBRLxLb{w+nSpXSMGDd7UdMq3t4YTYa=yE~Hb%>Wj z^wRk-qSIQlejLfRgL@%oSDWXM&4DV3-J2?^t<;in%|5S|vBU^6zeXt)s&?)Uya3a_ zn*yF}CP)k{Q5>LdsV6$>x9T<<j2<lqyIi<){!rw>u{0lnK}fRaRpctL%X_-c>BJ<P zPGmBM_e=dDKJ{h#hT8}cDm=xN8^^jh0|K~R2@umeiX<lLer9>PgaD1q(r~gFm%Dng zDuCHm#NIdWaxS_-(S}UKmI}B)Qd7>^1h%xgxpImHLX^DpRj_efhruE+e<FETe&ymz z0<fIox}N5-My^9ciNh|IN{sf%FUS(oaOWWV2g#v;9WXev>Vsg?Zru7o2qgo&YRi{; zlXn=m;NW!KBrc(@5fnS51Mm^9snWrdqXP0TBY~3pvpl-@BMEodvt@L`8DPPC-%jm1 z-MsW7;F!Y6?_XSVT|+i*OWjcj6giM_{w{(hIMA`+NFV(U>Y<jq?zg9N5C7xyAeZEb z+2#$@lnDQ{*p4Qie{%G;{c0ErKR~9#5gwD@IJ7(_yGi)O<4X&0iD|(0q`Ab-R!w+7 z#U2_i)jq(~&344hv3e0B-7k)5M?$w;Rg1!fgdbl}t_*V)nVbtHl`>(j`d4(rKy}rW zgW1H>2;rci8SmW9k)n)++T1INz8rm?bpm*1)mFbEQoXa9Gm;G1Z60Ty;}k1p;ttR| zZ8xG)6~vH~!>|@&d&;Z9ir(E42RSp6v|(zGK@}7m+DR1~+tKRfrWaR)+u0mnV`1v( zfXrYJoO{!G%|J`iC#vx<f8-$66WROdmz8CPA<R!Hec$btoH@08zX-1&43C8t+W=kH zmn<na`2y75p{)h0ad@(e7{rJB8=ht)!9i|p=gM}qBD_(-$ICK3WE?7soxs#Ax%eL2 zhoXRJbPmJ<uW#$n`&~ABF2wZMYo8oDemv{@xDtQl6*ublFc4xM1N%!ZX8HmO;7E;) z-m(zd^0lJK>XTaD0W~PucMv5IFtDGt<|Rz`r$gomrdgtoEzP%-J>z@T9ZDZSPBVmF zT%J}6$uv$Q-{~qb#7%+3IOm<M!PPUO5kgJ^dx`QnPrQ41Z&2yN#Vc!;aY<UoCE<SY zk8nc3IT*ncb-8cIXRUc8mSTMY&*}-ek))5=J@j0O)1D0r_XYW7MWj0)g}Zj@Rf;4I zHRU2+U-Ebr+(-TzcDFMOvn8-R^iEUiX1RQgob{kT1cO9brHuv5$@MkcJy&c$Ql#MU zv|&~tNg7LHVhy6tAQfT`aW<4o?}|>DG)5B7BjLKl67J8IQE>;OK~qPdIVwdqki4C; zhGb9sgDjA#=Rh!C1hQ67+m`1L_LDA?i*<ixF#CALf(5x7{@NK9*{bV>4+-Tj*k=eT zGb#I8*f0@91qUtNMY67ZDX%ff_QhtkDJJd1T==G;rI;7lFIB#8XL72LtwW2bq%kiG z>GT1Om!ts?VSoiz41Q8y-!3ug{336V!{^y&cF!JCN|Eu1oo6=*-zxl=poi(v(NE5y zv_^!y+LBa|atBx!yr{4QPFCKh;W=_>#r{wmMVBUW{+6SY-t)&q=V;_k{Gf5F?t-1- zR9bI~Q*C8@F*pgMY2~6a3W)XkkwjgZ51FEvGTX$yqt$X534P{xuH-1v-4152h}4w5 zbD?4f<>|9xA9?sJYntCt;I(SEs#a2UJ$3YooCN?r&WV=pB-`>)LOsQ_0VA7_$pjxI zOJ1=j;?1$4kRxt8#5jGbsIFywEA#Ij-~o@%is6hlJ6S1lFKmaZ8CB5=iff)T8X!A` zJAaSG6P*Fi&LH&|8yr#S6PU|bxJI(gd<xZZ3!7*<J!BXPk_9N)Qikzt##i<diEi)X z=z-925{fBk&@t$<a2wLS?M@#;Jocr3W+qnD6=exfm#8u1K!=E?65&9`SgSb3;%1l& z;V$3yfNaLdLHD}XxzbH!B<%+9=Qe={hfLRv)0ZPj6BAYiJr!`DqbJ<~9J+*v{;2Db z*r2F_=#Q<3v0^NTyEyU(SkZV>Y_qD=?4saQB?YSEw%iK8yPA?3c!G&KkB7cqg5ZfU zn47r~!iBOTaw@FQ228YtgNyLV(4V`)1;4H>lpd{SX5PwJG3rtFDvo_5*|0}r3#IGW zIq2m85{kQ32s&=pjq`mpH(`a4+D)kGg3=TSkIUKp+Po}nF(+JD$rNhT-!mK(K#j_C zWvEoO0k8N<#R?KI0xaQ-Y7A<$Fcr(qL)Tn2adiR7Ja?^ZfJrwwfF0mq^BJIiE4QP| zeH)IWNxd`zr@V>#cLy9RZ&ZwNq*v%3%jkwRPM0<YssCjUZMhVi+y&WI3WiBfX{5Il z9>bnio9khVU7>HvJdK2u=C8^fwgb~D0ZqZnqYF@02p+GQ7Ak*LZF$v4ccf`C?<r32 zBS=-Uz;wq2C_Vd)oP<pMnIs#aoye*f!b*)4QZ_qvxuX*r7<enog^eQN1q@rrCo1Ez zR;JGYN+X8n7o>G`PR)T<Qc1xA7T7|JF7AYp@lki#FI92LT-eYV#9i;OVj#O{u1f>Y zmtM?ZmDnaq!^jDfuUIIrA-M5(ykOF`!dJ~!3rppWkz5XW`GTKffR$p%gS<n=;VBN; zYl~Iis;F-JVq2gP$vK_?o8Jf+b36R*3@o)d3siRV>Al*tL~)Ub7z>ZwyfYvdUJfkn z(pJQNmF8BcWKE+;u5RUQ(RaoA5CW_Ze(98VyFQb8lMMQ0m+*9#nf5(n3$-yAfOv^* zM+`!%g{JW5mrRD=ZqZ6%oZ*qfE~zTtz;T;(64lPh&0I{8KyDmW*(lJXF1*c_c6&W| zl1;zokx`pj2b)=Mkrp)M&8jhzA`GG(tiPuXJN@LfOdnptiMaDKW{i_Ejkor4B@HR= ztx~Hr4m(`c6|uiXX6lqJ2c;<w7}Q@WP*SD$7GbT>nvBuN;)0ZoAWtG=R%>w3DZV<7 zxw#XgGp|pKFrjv#`fN;46_hktU#I#;YbWw{p%&Yz`o=lde<E_-p-+4gsDFd|#OjvN zN7BYk%G_)z-8kJB1ys2}7$ziP_lwu(uXai=7Q%^SH+-vgrn$N7!dH<ju5tRblq$oD z`%ur*o2catyE>G>`f7`{PGj1zX{3Z_#AVo>fy$mw@aaI0F~MrgkeEP~gQ%R&1efd* zXPr{%pL2}v(z71enreY$a9*Q`yz_4P!m-YM^HPc1rQe<XWDVFdrF$bwwaZ86e2yRX zL=`^O;EY<;6$w=b2WQ@z9G!b@bbNGb=y=q9_esWw!!XhK+pd$%n=$_=Gaef`K3bS= zLBD^soEO5*E7>aCHpH&jMbd<6`o>A7V)ZRE`jW0(c09zoxnPDAQDOO0mME_XCsE%# zc4?>;s7^BnyAWOlON?2WWnm_XR&ceEI%=9h`?b{a<O^|~;6(b(NnwJbRno;#vl_b3 z6h&t&+xzUzZVZ2tXCN(N^iodfQ=pKa>@5}n-D}VyC4<zsMkw6oDTf+NfZ`L?-kn{K za}tK?%Sy7=yJx9%aMe*I7A*S|BGz49dg0$sBaC}HDLEkp?pjXUayj}RQ(hKN^ic1m zuA0MQuoAhc2g&XX5!<94LJoeZ#A8zkCL<douun#Ww>W%gI@{|mWzMa!cmeA`*jgDt zb1byB7JUy*HxzOWokOfrP{97-=El5#NLHXlD_8(K-9@t5;_4K2#IK}477Qk2zs8!~ zNKk+CNC;rDHGe91Y^}A1)Gr%L)MiB2aC9jZC4w4>kA3_09>}~Y$L}_rLZ$qK)SJMB z_oIMs&{BfCW$*rMFYs8LV8jgxY7hYYl%MJ>G0M^jJ%BaN-=r@U*yxnmA5i`T`*1y@ z0S6QoHm_B*ai>jeb*S|q5xeK%c6CndgK;6Lzptc%4)Z21c!s<=<AUxyOvK*m$+r$G z<wd#}3G%H{%1Jr_KEznKFIT>!x4v+unH|bPO&MT+cD8p3VF{#XXG`PX>nway{s_f* zx;$bDDcL#EB8CNYY&<_3o%6P9MVry1td;RPf7JAAk)&oSE+Z^Vp1cccoLfJfem0ja zdk+cJubZf1`ZQfHhlljtfGPIU)uh|KOHe>{{AGUh-4P2+YP$aUKhk9{Eaot{;f4h+ zMMY9zC#dr>O>_}X#A~w8)+N<p*kLewjD&JgqP+x5N!VgUV(u{2kPMFt$hDFA6MKrt z_=WzL*X!p{7CKH#@EB`kU7IA4gjB#jO(j<1OTNm1ydMe7)!Cf)$w+b#eSnD8VT-Vd zH=Ps#ODu}j0Pt>CesnT1DP^alG+NjV@n@cOA00Z+1|2c#C^2f}vQuuED;UL5)-^<# z)ipWx`6MfHg9d~pr40(|-3(0<hBh33CE^Dr*5-n+eqRt7Y8Dl?)>?g`u>>Z6YIA7` za)ak!zU`wb*$4w_u793!5jwR5bxiIx?hDC_tagX%-_g0}QEF#l*O3v$!6}wC8AXod z*f()KZ|lQ%WtgoEqgs3+sV8bj!bprBd_uZ>^5>nGf`~R*o<!4)W$^d`LFdS940)jm zh%v8FSjFW5Pw1EY)w&7pOOG9%|J;Xs=RvBnhxfzBu$e6_jvmaBN+Yz{4cwRwkWc}= zU<!|MHwbD>MOJ6qq9IsJ(G$Rt8I)~qJ_v6|K}0A^#VpfF7k&rwy~jhUA+*5sPfA58 zb*WNZqQJXzRj3tUzxW?eik!N3#a^Je&U~s7X0R8{4I2{_Lxa+CbAj#_=}I=G?Eur! zij<xUUC(!)+GM$8Puf<KXTs6#K?-d$K*=(w_;Rwq_+qq%QO5Mj4rhDKDC+J=aH-+= zfoY43<E89{14p2QCu8Cyy2`61?ouEbWpkZACA~uJR?=!eqEa94EBe3|9b$U(R14Yq z>5t+wpJEU<<8Tflx3noyrGxLC@vsO61Bb(B`gp8p;R20q`oa=N@>Gjy07AXRmV=9z zv>E@5qa8<A6-!EGGa;QaXcVPeX&|Co=!U2OB4GN2ldREPH#)>TxcW6bo_k|-YI<y9 zd~R%nNIQ50<vbG3#HKEXkBTyZd~wt+>+Ta5xL-7|Dqtcq))_V;YM4b~Q?0B~yd=nV zv{la!0}|>&4WYwsyns{5h5hD-D4j{<$b96Pbbm3-EDuiAOd`&%>p@SaX*jkkB;dud zk4Mb#Ph=U!^I^_WG)>7R(Ug2D7cERX>7LgQ#8Xj3TR=%bg3zZUzlzZ-!lw&teJVLb za|8KnRrwpK+~~c9YpK1?rhu&qb7g_?n=~pO)QY^k1h>K>E_g=4nR{hHc{xMM<yv)$ z2pc$QRf*4<(`DwwlGN(!g`Kdmy436~SZT_8CdU_Ve%TPU=BYXGT9&X1k83tUUu|ss z*hGoBym}xw?`WvnfSs__$Ifwznqw9%6kG!J7gx!KEm{A0sM{j5y%}@~d=`v)!x9P= zmNfPss+I;;oT;mr7g9_wFqe+peBsd$`32aq_3E{4tNAFh8=TPX;Z!;B->V2xYBTM? zepO{8c7}CTX#;s%m>Bf;^;m*c8r{>AtLH+;T;e@{8-PI8aTO%5k$4g*Q%#Hobl1Bp zO?@u0y5GBQaur5+8!b(nFl}A|(Y;ZmA`q*+kkhyPVpUPs8;o=nTLBMQO3qFJScU+n z7h64R1tK#a$#&7Qdilyaq5i>=uo^XMDH)77oCcX#ADj!8o)e(HFAcV=ilBEfvRG2R zm$nZ)T>A((BfC0yz~%hVrzx9qZ=s_kzQ$Mn_Dx<w%DY5Y2?SAvDMbH)aXSo&X*FBH z%_m-xnzynVFvG(q{0{FLY}DzK#f}gclHss|h>Slu_;ljkSPa6DB*g`^K<*HptqTjU z+$GsK$w{FbGjNw8wFi-dRI#ES^gEhL!3$Oq=8B_?2(Rv>;<vj6Z#p2{E|+f8osDeZ zG$~?r^CDif7n-Ev0!5)mq}0V-ws`wFe1)FeH-X-QpTb6^n?iCcSCuCsg>F-tC>+Dx z;c0i(hyr+Ah9^{i$dH-Wqhc+a`x3;AUCHxu0)wtIp^?7|6gy1hLn`XQmdB3f=K2E6 z8?q{pV-e}d)d1ybP9-mpwCxkXBSO-(>rQSmmY75Fo;1DS;Vz{mdm+q~i_04`4t}TH z+Pn&SjUHIFoBRk7Au6)Cl-9(}CJ<&(i;Y(%z-JxU8T1o~Q(Rse97F`g%*pAwaKk*j zzzOBkvADrgw#b(GDdbLL&>5vdq84L3h=X94#*kCx>0O8f99=P%qZBWF-2lkwhBy{G z`^i;Q$8xRL{Zazzyk<3nMu)4!49@W@%`x~>ME0S>FUY;+ii5*!uZKGzkUfPRXnmHb z-6=XF2+9`M%~nc&l@#UL=5-G!NT~l%0<FhHAUxpw*g8r-t<+Z#kqfP|iL^MNo&NPY z?74MbQF6R7Q-`lOC2~el-z_>DX^K;@$!jQ@5{{}hvYqk%@7X$Bp73%Y0T+xWkQ1;% zBe}$>`O`F|K+9uTFcl9(DZre}N=_j-7oCqcQJ|hCv5dY{*<A4Dx6~Bv!NmI@l;!3s zh3{&8q26lEub=lo+DiH6sjlD!u@Hl!H^pRuyG_B4jj53@g0<0*B6p^FyyFLG1`I~X z8}}SbtI(prVNh30+2siOEjZY00&)bRDuR{HYdhP`(4M=gRlT1V2xv8Hxx2cOU{!B= zp%zbTOA=SYBOx>K)mPRAaHCJ@Z?HEzfJ_93pUs|@UpRi9dnUfF;OCA~R+8fT33TQd zP6Zlu9jCQ+T1A_3wkvr{!WJ~xD=rBGGf@i7V%x}W?US3@3k9ltygG62W;vHxejdAE zTwaY7H9K4bij+xJ!0Ye2yaevBsXS4tu=xN(-Oo=~om0D}Ni#cF+Qn4W4W)t!Kn_QL zutIa`S=lF}pc3SZ$f=H=N3L_Y$V@MI7D$OMrXQLo`w*AFLSII5Fn&l;!-7U*YQTE) zoL{>#(H0I-X~^5K)+v+RDYl}FoCUL9bwSEb_~*_@q`@Gt_{mswwTXzZ?kY;4#<Nsk zi1FE&Z=GeCz--`HHZYS7Ov1wbk;Uxr%O5?&&>Ub4rXjkt#M#SG9bCCyj1L)vQ&8rf z<qV%7welP&{<U-=!|Jh#`w7@ii8q?e$yK?@0?&|4DRwgSeWbOI@kk;1DC7KeVyM{^ zxR)C-zY_emVm0_EG%l?^LHsy3{!TTg=2_6{tEyg8*^z8aiGGS1D1jyL2X(E)LWyJh zyK_WP(MZXu^tge2JJ~qf52Y_Ez#{nqmC17SgRVZZNUST&_(RES_Ao=@m=<JB;*bzv z6v9c$ww{e7hEvJ2SX;twZV^uCOtXjIPSN2R0w<`8(L7t$vk>wVq(~8FcJ-C~Ky*fx zuneb@2svB91ZF}SsEVKXvojL((=}F?NOr@2AbD$+*MoA^=b_Ey%Oh62;#4hB>SMLM zqJ6BzmjD|;bQ2FyC~^?1$RemAiUAQ9Fb35vo+eHYp?6ncdtQMqt+$9i%3DH|9r`Sh z9zB~PFKU~sjlV?s+g`E{jvuWQq7K)Gn-HgoR>QC9xWv~vWfEiKE9{Z_X`HZed3K>b z=M?n5-hsV+uMGD2)zc-<ve{4X{m4_Fe*5WX3Qy3y@Eza6_t{g&k3E&Wm$A!Q?bEaD zVc#py?9J5J<ob5MtH;>)On%&b=oGC1PPT9Fz`H<-bAmv^uI!^zzEAMFKl`Ylhj?&* z6IIyvKy14EWLKKkab@;UdC?%Ff}R!BLkYCOIpntrJF~vrO3cbj-MdZNZZ`reC<TX# z2B2bfG0-9Kuf4T*4<6iG&@Kq9Zz??)9rWo7I0?K$9w|20h|<a@shWZEKtQv0Y8~ZF z<W&LyvZ<|>gJ78K-OGcB!E+$P$8M7@hkLe{qz0IK_kQ{*2K3_hN9^~f_4i&08QcqC z@Kl<9gzY{pjrpu}x_&r?GPi56S^8@Dc^WjxUV0Ao9IDkgnstR~6=s7+JWI*GK9D{0 z3_r{6%}<(4VV2Lz;)=NrjtmoeLD!g^;&YwjKNVr~eL#lYAFU`q@)iCXcw=y4JR2C5 ze@C)`VW@TJA)yaJpXe>@i6iWbMhJ%7oL|_C#t@LlV1Y!;HsddPnoFpC1FnS|n>0+W z!UdP^NP+JF0K|Ww5qkrJzN|#!-Xk0_-Gr^^@C0ZT!}=)73^gjZwF>bdc5b2N#H&7F z+9H_gt;uWLl<2XpM}r!*ZC^Xo86uQdRvx8Fx?v{(#$K#6Wc=kOu3VcbW6a-@aRSHj z$8jQAy1L-Gwy-^ue9#PceZMB?ST?+O(}>vwR+>|F5{4MJsC`)2J~v7Zu81&om3F#T zkGw!;OIU0$ppua~aQd!hdqaPFA8p;lEVhxIXYw7VHz&9CQl%mFXwLZeymK~(tged~ zy<Fh_;TV%A;ph;Pu49<P6I@D!TZwhi6d%i;0nv?W^4vUd<>O2^zkYgi1uNs$p@RMq zh>hM{Zlb<d9NoLuD-|pfe{Zj5N_UMJ*X)n%J?`6-H+k_@&UmEbTCG<CtZE};Q=`K( z6H{-^O^;3vO%37CivITY?k#ZLUb&`%&iF?J&;eXt*&75$;CdW9Q4QQQDzyUNF9bru z^r=Naz==}e`YCKyN+n?>DkN9tHx|x7M9$V~1AY6T`t5z`<&VBstF_*yu=Il!$kQ=w zH%{5~{M!UIR%D$>er8{f7s<KNLT`Tg3PNrcqQq$iq9agSpyB`}0nhSkg;z6F?GQDD z%7g=7M5Ln-U7*5w!L+YQs^X}g1#@f5@A)WEoI5edfg#!cHk%wWa$0?@)>Erp80?#! zoA3YZQ2$@N{me7&&x8FRhbFzRR(oIc7{_I(N^=eCEmf#{a-is`B?u9}`lj=W{$lS# z7e$EyY^q3AR0Sv3Am14~46Ld$NFWFwJ7;NrKQQ1GKtgFFjw=))fe6A4%ykGrurs+F zHYj>bfPrfj&oUx$LKC(ZKRG&8MJM4u#n}bI6D=%c=d(d7NCPSpE|Si}6F-W)6XarL zcT6}Ow*p$@uQ*i8o^&_RF#(};I|m~th!4)7xlP<@Ls^{FcR<VFSyPBU#hw6L<yGH> zm9<{NQh2NQ681L^g6t?@z@ZLVLEnHYaHqggO6TFi`$eEQmPhLQdtQ14&W}BN22c+9 zX^rd^FE|JU!~n;b>TT2KSC*Q{WV43I4tU5QZKQqQ!oKX-{HX@++D_uK!s<c;r1R2} zeDi8c-#LJNfs)J8{us4I9Jx{DWEozzwev_7fErE=B3f=NATIzTRX~WKIXFxABXw0B z=*-?};Q9^UJ3cl%IzBy0Pz6efLF0vgL`5Oa7%71v9W7G<W}xnU3?x~?kYR>8bPIEU z?+*cyP~}$VP8~k{{BzGO99gQ_9BbGpYslEMx=}MZ|02;N@DHIDkp#Mk5fc}f!HfL8 z69m2>;ZB{lB0$0IM35PH8QyV-dv$(u;|yBt6nU9@;m@1Uz<6)^1g>>1oLOmXY-BIB z^pDRp&%AmXSB#e($_Mr=;PQMcn>@2N>cKuHQ14N0;&?5r#`T3wNy(+pl^WMJPhnkx z^<YkJ(TdBo$`zP)gnh@$Q|b6_6Y9Q>jvE}lCE*kW%#p2N8RVD0DX5yvdtzv`XQl%s zuyeI6!Ut}z<;}(V&^juNgDr@`C=nQx)IHc45!>hmKyydO#)qcfDw<_gvLh%X%wOIw z$ZtaLm?%2$>KOpz={?7U*u7vTy(V9>{&%we{^(FC2*E!w$iT`*^K75G68vyD1<FCO zrtDZWNC;vB6s9xIaCG8$DbO5dSF?0*IoT^q6u6vw%-?y@A>U;6W$b*V(zq%A-loTV zZ~0H0!K)0OL5{5I1?n<DzB|XNK`CKop$XL-l9)5Cf&@WyqOjwXAKvioV#?%IDS01M zpv#uaf-BD`WqKo8Kwv_kQimt9A$M82HNVz~_>t}ypp<x#<yQiygDBi`mj}~BlVeoy z7M2@S|M06Hcj=Hyh@UY3#Z#!1<jk)X%6mKlbP3KbAR(YFreu@ZviT;5W?rw@da|bJ z-lI<Shg<AQs7HsUC~n9*%Aqd@9!v1lj-e;73aI2J3Fr)edFoFvMJ{I$;v@z&Z(E%M zd<!EUKtIBpn0$kC+aBiab`16<cg$=APh>~t1iG@!l<<1k-z=?!y~8lFzdOIOwkDwC zv>5OeFyz29wKb87{V$6YA-RL<Rb7Vy$T7T1McfzUSy2=4C->r=I)fo-vdJZQe*z&e z5kE;p7`K<Q8salWBBsC{t9EIwJ@<D3d%g=rVgFyQyE=?{5_4$t?G?B0@A*){+?9g) zT79*?4vj19Pbj+7GXFS=<7h(vsn*!SP3y+H&_+REy}}G23l5x`-=Iu50GqP@Zmzh? zjnT%KQr{YMcRj!%!H0E*Ge?+zV%SQQIvB{O?KPJN$90pMaZLuh#{jv<{q2Y~*}75_ zfy%4PW@8}I6o+#^?vGQ+-zliLEv%q=+l3Cl4V<#^4AKfXkAXs95zL)U5Y5QLj>Dd5 z#xD3tm1a&C$|&3EpEFPt!gQpAOcK8#215=rh@HeC4M#KcP{K~HVg06si&fC&wLzck z&@C^JW?TYHT%u>)iGvYLOK>|n3$W`{9l#124k#Pz^CJ`vSQbfiH^0m@s&GuW)xhbz zX%qGHwIL(;>`|9Pf?-DxgF-~^qnn7v-34ot2aH@cT}=usC{hhx<m&5X%*EU(9BBb~ zQ5ERX<gSzRNCpLgtR{z*`ugcQ75TMg9AlxQK?e#(QV5}{&LNjP&LUNl=oEpK2nBu* za<+U(5hQd)tpTJ|Ht+?go6~enEr=oMG;ghKWM?)u)|ij$)aL2d0V)Zr^^Jk&KYsYx zgNk~-Xg^*b0Y0FObCj}S*g6PuX%}R->#H=X$32u~AmT~vHWEai5kIt+q6*dx7<TJK z9-%Hm!xllS;3xj%zX_j8VRx&vQ$p~XvS`UPD>;K#FG&jYRzVU04$l#Vp*yBc$cez+ zDPF|O=(~)%2w(uR(NE39LA2~U9yK>vS!wnG16<_>aE*8rN_afx>sWlW1HyD8dUvvi z)NXt^Iedo3!gbgXf0U7{r)t`$`owt)EU+~_7bUI^+Es-M<F^|eG}#^D{%{jGwvL5R zxde0~nLmzX30IM1176rRd<uWL_l*-earB{%w*wuo<|9>uIq}5&`dJtd$7oevqE(Xm zgd7#@hLSf$rt04=&46OJmJvJ@VNgg3guS)0+RPaQ)Y7sEHSfbUeZ)0QV_!e8HC5AY zVK~2<g(tKg)#)p4!5V8}?VbugT=Jdy0&?4!$!&JyNC*xE^C$Rq5Gq-M=^mbgHQoG@ zY)8Bfk7xVW-i}G%VLV4BDV3xrJOf5qeK&W2i;3v5H_8-Y_pJZrMr(R=fw!UH3F=l~ zq|&e1JNhotebL=BZ+9^q-n23#xv1VDH+Ya@j5#FTpt-32AmMs&l?OZ+I*U)S$uo>I zy-R*gU8V!{i^J<(TOCEfea49U!3_B}5yZ|ft!M#HC~}kRJRdST!N8HkX<+Xw@O>S} z6*I}&7C&RJ?6mU143@C)uuv-@4x6W5@>Bqz(VCDu10xMd247O=#jt?@Gmj3LvA#E0 zTg9D?+)r)wBP~IRV6khn6c^gKFrnzG5$Gf+En&$RO1!!;I2ik;6!56IDTa;~ppDs| zPKTk&lae<S>Pg)_1!tGjgmPhguCEVe=Wb=^6J(^~5{5xRVk1@&*AL(HyyFd$E&*8q zHW@GV#CR)nOyu*@Z^vELip30AxH%rBR0rd+d$LB0Q4{7M$MeI+iY-1aPsiS!YiS{7 zkigE`Cx)|lw-}N8J+YtZB5;<{#1`x$W#-##CvGNd5_Q5eQ1nsZl6_aQgFVBMEEjIy z3jeJ`d69&q<nh)a;}kvu{;p-T<<5q^Q_5&{+hTuHAhNF+ohw+3F%9J}Pl_YRERz*z zw8YpuzwE~r^T-8nBrzVNx99UzBFPEmPH+LC<$yO@Ec>?ek(AhWJxm!!lUcP8o*^l> zbqyl;(^IP?%`eWrc%7n@8Oyr+2?t{1Qlvd|w!7&zhs%7|b~G;b7Gkw(m2ssfSI@3C z&mm`@Qe!45KK6cOQ7<7C5f%wJUG@+CEjtS6$tm%sisu()=cl%*rX=+ruWxRw<MQZB zIAuZOE04oT#&A+1A&Bh5gBmkEJZ8{VZjJw7`b8m8NUCQ{Bk~Q`;Z`%;i$|_^_%L2V zl$w55-z>y$!TE<K7R9By=(OcH`6Hg?b|C)CwDNM9UO<@!@adJyP^2Ih=QD`?S2XNK zV8cFanoc5;O67;L^>S$nG3SOyr%;x<b{HQcR4PT_yJ0>&Gwk-vV0^pELh!+G@XFCV zFRyIzAy<DATwSip!GgYPj_%oIt!jl{bWy&}-nJ9b&QRo6!2#;)VAS|9uxI`h9LDp= zDWqI`$UX|-v1pesV*6`!NYGpII54@e9e=Qsf^$dVt%BbGF-;c3lz*%|#eXN+=U^y< z6(?NH_D>NYydg#weJcvkFxS4zGWMSN&@tJ#u%NHe5Em2FGfYKE&-mzBUE?pG;7q11 zcO>);FkReDLq;f^`#c2c0m8(TtI?-#>NJV#C<6oHL3MV022i)IJod{wOnh%K5dKXI z0YMf!0WN|`FsD){T8axGF~k8kHWr%;`mib_%#y_=0x9?|&0wX8tLWLsU+HAUS)R); zC#}+E#9?j8(#lDTFb~16QUNjT|8kmxj33CmFySee*c^BH>3ha?xAVvqz9M%dL#9{R zc<Y;MumihD7k2@!P&)y7#<cV?j6nUPsGlf%PhXasBTQP8;H}5+4l!QHiQ9h_W^1$Z zPtZ7@1q*Q!ps)J;${fzKum_tb7GW>*jB*wu6|EWnOCSHQ+-zaYiss2YWl$dxDBMK8 z5!5^qb<iW&bQuZ6k<{e@D0r0Zf)O9^3R?q#O?_dGh}nt<iZJdx_JwsixhmWRmKT|x zk7cY}g-v~-U{F=tv{I)rtd!n#Y60tks&+@-oVhN=#+=K{iI5PG<bLE~E$hFyArw&M zN-3P>{YP(94P#^!@#`pLzJU5S!4434r`!!OP)KUlSarKV=^<RBu9A67pUR4%)(v`; z3c1<&MxEtaG$B%`yd`N1tnbPtW^H$^R`^N?VZGofR94z<!A0B%=^_eo3lTAwEsHYG zurm{0%7LuOPNaoWp!CuIGA4?2A_aiR*8HgXEiN2SE-e(PMb`-CPwU-+@p*Vjqy>8^ zryqGWPdWJ^^OX&xxyqX|%<@&4FvTo6!76Tn$UCJV<(nfL$~?lgx;N)5!RA#(f6=9C zvF!@oiBnHVO|GB8{w&8pb?iyq3*2S~2#k4LG|mH#s<*xHC9cwYl9hx~IDsM6BjVBK zXi;+sniPIS(4~)UVi7CgWZX|+JMJ6)_Eb?R+Fk47`=u&^b{NRsy&gC2e|c4$fF-SD z4h1>HPD*3V_`px0gs}bY4bb;Uo{mELoO2j-)_^2WZGrrv*mFq2<@!c%3o;yOsppXz z6S=HFiLEBn%2S}hD1vO6i{MC3sQAHUXQ{}9+YvE)o|99k_Vpk!d(SxrxnZAhtE9VY z8-5bR$T>;CAsjXBgD~W{mtea4PU|5{M34<oQ(IE@*dv_-)<`aBCnaQ8Y{Z^Wdld7} zQM2|yEa-qGeLV{Nqz=Pfm!)MZ{sa;!e&XoHI7&F5Ru=8k3wb5a*`MTn7DO_~wspp2 z&CD@8{QAl9PtHw`{Y6}@mv6Zrj_(*H6Qx%1M%Vrn202^YUVNONrhCC*zHF&EV9AQ` zRX;1YsBGJH9r;$YmOGhDDH)aI(Pr1~XXne#H;OnZenX&ZOE|bWLP&R*8(L^3+8*Et z+n@Q|%lsYBx0+S5WhGDKL;l2FVQGsTQk!j$fq;+j7kDD#;gw@cl>9tOS0E3iPfvbI z&-*wCAVcj&NFN+ibA+hCjO0F6jzg3p5%IP01iktbB5F+}CVMh|sT3>zc&N}hd5~;^ zP2Bqi_pWRc4(d<!oJ*-?djbuJF7SVS6dkl*l>?BNa=4-u77VQ}AXXD5qX+V!R)7bI z9);v$t<x0_^Kcl0GKgl%Sw8gI?aXU8Np<2;Y=36<_Xa*+NHf^uB;f!P<Do_+%51vS z-qcg1l0@pqc{JOgngqk}&T5=95~d+|8yn|Oz!|2r;_Y_e10~;5tD1sbw34{?P7-+# z8{l5CRK41pD|um^LjcLfcV8#HR}i_u3x?2>1DzYnZE_usO>*;ynj~YfY4TMN%Vo|c z(=yx+W6x<c$J|_Nxn5tZOdAr8FSVodizlF;HWz6;@}}gzUY|#Jy@3<sXHiHCQGs)F z!^elFr|0I3&ncHFj(%?bY<&~Mi++2-Yq>igmW=aJ26k!h3q#xTm=Q6?UBn}IZj8ji zYGj8cfL-d{WQ|j9-$Ti(T0bblrEecttiLnBC%kUB;EYvVa{f385wh1x<?N^{(0S-L zI;;fA5$PgE(<x+O6yB~NAOaOy^Y2Hm)g7q36dKz;6!gaB1_z}Ka8wk#8dSVpS}D40 zP&YwOr^Ia@rxlM_jXd{A%%O{j!pnUd`pUgv>roKZyCTD5SQF+|EYA<*ruO(l@k}zb zy7;D;z?8K*6Qg6IvbltKY5T1L$#$YQmxdMT;R)Lw>sc~Vr%;v%$|If^&gF7ik5sJC zp{ZZ%JPU<yAM2oAgF-haq11CKKiB*8;E1gdDNiVx83yDQ!x5g>nyBRkYc-Gh-B0?y zUKtcwzYAu@PK=^P@Z2Oa%Z;%zsMK*d$RCvM8Z0pn)Sz*r=tn()Jc5xV55xe}?Hv+G zy4%FnO=LGZ1xn8vNUE!rj}6o|nde=}9QC7HsZnyS(Sj<;%e)dp?P^`SmjNQW6h%7s zx*P?JD!O|*Qf|OG*^AOGsK<F7`G`M(^YD}H79q8;e4)+uXbgrHROzm8LIEGpbr6e> z+yvQk2cDICQF<eI4LOZqAQGE5=-oS2a6VdTA`4c721Iw8m=NQK<c#7^88UET$X0Wq zVJW80u~-;PQRs~~?K7zhPG1aK<}fVt1r^gA34+wyxq465c@JVVx=bjNdLl|SL0}e} z$w7)=IupRFHI!4NWrM4+Bf~}n+1nX{^-GTQ?^}X%XS#Cc0&X)@^cK`$<C$Sgo~9O+ ztUqJQ=VUhs-PvmdTM_hjm0iX0n$R-oFOU&&!rl!!;Rj+hAYKZlJ+}6zO=%HGlh625 za?X_HjJXio1sK9#MWWYdkE9nRN=}vc(T%BGJ9$Z`_ZUFHOg@3@=-Uh~8M9aeQGB1m zAl%3whAizQWNFe4twJbIXYz5(U--oJAEeV`4vf|U+_8{8>eLWK`w%7uyCBeE4FQ02 zOd;@O4x?h~kV~O?pxpU0zN8QgtKfZyo<H)!vq}XK`A?b49->RxG$4+r1*R`Nyks)m zbQPwSsw2dXhNmXZd)4%kF5;TBlnVoI$3<*cAj{4YuDTB%0@sRt0?Lw5&2^OQl6-^S zy{&=)?p52OYWbOc+rBT)ErF>dYG}zMShbhz7Z7WTL$g1Kt4rW2xOg=KM_$>C%VKgK zP6?IxiKHy1OShpts4T#Oz%vYNV9k(TL*#>E1uPj~pYMgp1iwcbl*Mdx;+Rdm3NP7E zL=+SgZjQ;SEV&dQ<rw6fkEUIhV0vS7eHDbE`7M2Vv<+6OU`Q(WS$+jTzqth{hcRWV z-9}c7(qHL{;s|b_E~1o=Tj%m&5^3PMcwx9<t$E3<;A~k%S}GqymYr$pKIHVf;q=^Z zySf$Z?Mb!tHtvhNk8@0IomORKl47XT+?lXAD&(onvxTCJrCD8`JM_XqWOV@}tZef9 zbI(7=Ceq5Xo<5H8G&i3e*-uIOlA+3u_uhoc2d}GnH#+qA$IH!yvt1r@s~$bi5F8ws z{Hb$#Myu$)Ob>MY?da4LOF6irD1MY=BkTSx+6v_&AWKzxkEgQh<n`2+=ud<>voIj8 zHl~WsU8-`XCr6yAj=@w;!OlY(;w!R06N(t5Xjr5(Uut+7PRQ*@TF8jW10XU-(#vJ* z=@_x{K4yg4Xg0G`jnl>ksUqM9L-LCA{5sP`nSO+}(2S6_Vntu06+ac+;`XB4p&BJy zAsQMrel`HnN;;HEGaZ;CR};DI18d4(A%Zt10@x!+1pX_0E~OIR08|s%Bc<bwm9-Hl zFtmxBZ!xXZ9CxtfGfmD?A+isxdpGTJ8J4EiTun}-B?cRxWe}b@ac_xV%W4OCM^;J` z0-}FPLi27eKH|^&37DiGP&L{feDOt=d})+*N|J%PftDsU&2Av|QK;mVy~N>M{+)39 z1b5VHt))2-&BEMA4j%s0fseFcqwP_|(&s^YFniR^$WG!PZjh(?dL&1emi*KqkX`ox zc?Rvh=a6lw3Ly5yK5FDY$QO*%)ri6r0qwi!`Z7CUCELa-f@AGIFuzNG!s#`Avb~8W zeIqy}QW@3PJCy7;0JpikDAiq1i=K*<T5H5wDQ5tp9?2hg5gVEgQrI#BlBb#qyq8Z$ zR-=ZZ_6sPhbOu(J;}gT5oE!ZVN?_@q<43z9b2~&<kD7}DiiE|iP-rolF-EBaSov)6 zWjBwL;}ytYXWrgX)l0>@<x?_IQG|t?_{^@hf^7hra-Z@*o{{kVl8qzok?z~&kBTm$ zI%hg6qNoDVeDl%h%N8TjP>ia&EJpNBD{9R?imO+ofs#<Ce537|Mri+`M|O9v;QwwO z+3}OdDF#0fUo3UNdM^&mto*epHB3acEYawAm_c$LRXY2sk1(n>bGw#wE|M8tAb|pm zbJF1gj9idmi<@$#ZCx*sm^3RtDcLcIL*NIaOgA&Q9@d!&lovuw?`7=@Sbkt(0ppP5 zK+8xDqz86Za^M5Fs$p1r2lX;&o8dPmPQAWrR;k(GQBC~MwmkH+!iCETa<#&@kM9UA z8oLC#3n`2-(^4*_Oe8Wa?%dJKQ^%v(hZ5insz>&|mWD>l!O9upQsqz{7J}PIE89dl zPpT?4IM~(SnFy#5Q5WIg&bldNgrT;nkur>S+n4q2aLja2zxF{+1g&0mm`LDptC_dW zDj+I=DSXav=3K-)5mD$e(VeQ*`riJm{}8o&ab%EE<nV6(ssvQ7M(hhKxtl_?RCJa- zqYi5rpZf&5q<49h5ZK_9>9qOgrF1|N+Y5b&K`xy?pVpRevvYL;w#)pC<LgXp#~-hd z1zeZF*G1#vX^@2;MA0r)Q2h`kimAL^GGI=_3ZOxgvGEMqIpwRYvw*kom-D0%>5t82 z5|fKJy(T=wjj1?DUV3aGQZsYc!S%!p4{C9@KQ<s{Bu>V6`kyx;EA7Q8rnlMfDsWR` zj|p8{6t6^i>a#BL+v<@C+jqMIq7IZ-#5i|*p$mNJf-V>hJnTzjvBK8jgNI(|M^+hR zuihwBjM}qjl9ez~%MJPuOkpe+ge#(_*XO|kQIHkE1mZlzwHidDpg?OA+5`%Dp^h0| zXr9_YAPOyY^H4a}&hLSJjKJYO&eFy?@l3$Z<^m>gjK>9JsVSlHvfQVwtdBa#-f4Sd zFVak7ki|Og!<#DO9!X{oXgW}P=rLQ+B41kbhA>e3;p627>RRat>{^P1wf3M>SoZb{ zoclG><2-&dKRPOf(OcQV`9D+wL+pgOFj-cN5jBegFf<{mVR;W`+5p@#*E%#YovO4U z=)eueHx$tjiQtLmifCG{Eit_W2NH&?FA_3@bhMf>;%BJN;TuA})LdR}o|9WmO;ncW zd|QKi_RQcBqJrQ;3pLQ7%u=HRn7RN0gs!SRY9U+9G75~smMP_{<cbu&^3%cWcqIr6 zk6=_3Em)WF(rF&R_^*#<(-X&L-W-}5&Bms)$*GAq#zsa*vb{so_>9zyZ;s8pPGcon zObw0Cyp>HH%ZA3^%04+ZKC(X>{S<<#rl+%ssXb#SCXbJe;=8f&;o~Pq#>QXEj^e%X zi5V1YJ25tcPG=@E4rpDCjpDsy*@@Aq;n&gg(9yBuV>55<-*aqiW}JN<o0!UmGSmQ_ z85=%%d}u10JUKNvF+GamN6_u~*!Zz2j52y+bbRIjM#Xp8=o|QuO}{>L{5Xf&GjtNr zPZ7Rscw+Lcsj=5ypUGaII6g9pFOQA_vZ13$rYA#TQi#?aJF!0-89Fia8ljuYCeX{& z9yU|xvNvBJ<yRbU2>%byFrEz47@ioPnZn2YnB~-rfA!6=>Cye!&=lg%fRJNT6DRiX zAv*B}dPgUCZyW_r*$YuE2=Xg}CPdgtOxnScjf@T*M_*W;@!awq_@7n4PyAu7P~T*8 z`8+t#a&7X=+Q*JiUqlI{J=Bz>co0f5GVE_|Y$SX66WPZO9yxf>i4&F0bZkoVr<|?Z zSz~)~D;7q~RVj!U3N^T9*!|(L6>~?|U~6<L^QlBY_$Lf$)cdT_6(*@_E`HzA$5VFu z=O`Q<aNU-+nU<U~pITWS)x^#(B6R8fiW!{&H(05MxmZ2rxh9fmAYvU^>F4GS^bQCr zS+&7s7E$C54&uTh>Ol@MpTC|0RvHWI;8`fAAocT9%6bgxaD6@Vt-00Bl~a<fL~d?I zcv^FP7aH&DHWQ7!LwMfY63TyUgem#KlNPQrjC{@U!>L2Ql9L7l16gWa)+qwA2M+*E z7tDsyXu<9Z4jUApF{;5h`UtlYAPIoF_4RoOIG$SYzaZK0@;|C(XH>MaeB+0F`Yv(L zYxAepk-#7uo?qW=HM5r%<o9X)_Q<pO<b1xg<{0#$qw}AIY3C)#X;d-7pZTWZ!<Miq zm+U8(pN(87A3TLU1F4Rp4u0<(dhW=PXP-a({J|ptn@VwH=&*!4>e!ucjc=|<i(<`7 zp^W$7^O)aw58zm<To8wi?6*YNV(1ooSodP0wf7((<`XCk>^8PG3i@*oAG;f>t1Zyw zp?wGo)ksk{$*8$>cWCtE2oUHKXc0)b${SqnG$5y1nJIRh|CUb)3Xahj@#zdbMDOsa zZ5d(nW8*V&<5wz~J<F?%cy-X2lnlo=_ycaQfA|h&doT%QXK3lIUjM`5T}nmfOL>W@ zH`o3gX9gdwf>KdhIKqDukyGg@=D80~F&~~{K0L*Ic#8S(6a%w^mPfDoQ_R@v#&Yeo z_4&0ksL~RjW`xhuzB31jk7VV2Ow+X-6wTx`Q*!u0lwNxHfeii2P57Q7-5-j_2JABP zYcCwM6M#D(A*(gqP#E~NsiDc&arQ=l#mv;)@Wjb+RP%DOTU(VkQZt<$PAa-PG4!dU zZ_SKOZ`Y%52L%L{<ZU~Jp<!w#ooc)N*<tCl;v5CTnk*2Gijw9r0PA(Fv<c!;=8<`B ze&H<q4=vmhrW-=95g|xW^(H7*`1_+hOz6YEqZ7!QCyK$rop$ZI#c%f5^*rVKq)iSP z;kwPpn&f7*iVXV8oKtgYiI>xM0R0ZS**VDQY&($Aq#Wc^b)E&sWd;DectU;6mODZ{ zf!|SwJDvg@Mcd3kTuGXQBiI>A2?LNtjk}$r<8|MD*(FtAM8}V|>f7|PV~p*DP%XXT zW5c{{KRbtddo-_agP|SnuI;+nF~}gNZAf!RTVWS_Ye)U<5Pr#!)fIlrp@l(VrT07x ze_#`xmO8A=46q$Hc4y+MZVcQH?KWnx&8a##+t-}xF#XnvV-w?V&3QcoPKD{2(W$wq zPa#63&sh;_lfzS^b7tVpUdj#~#JRuxAxyt795`~A76CIs<X^_~LkABW`S?Ec&|CWy ztJw#hUjhbn1D7Xy5(ZIvTBwbsS1aK8THAzng}``(mCNmiF;{=DzKHT5Ps4EHIk4#x z8NM4;wSpJSp`f9(u6XZUOI*d;L>^q+5|qgLc|_hqU(oze`+3I~5z;GYK{pZJMcNqg z5}lkm*8f5>CTSJShGQP%#b^924l3G1JY-CUv(ef|ACeebGrNy&V8LmKn!5e4YO^f# zMgtx#-2x?J;Q_~*vTK6y5F_eo39(tK8oBIAGB5F+(YTw8R~SvDkaM@8jAh(q5eRH* zSb+Mo*Px~-ptzGS`@Asc;>&`p$HP_?a&#qjxDYfVCwSS#I#4p~c+E?Ps+xo>@Z+xV zt`=07w=AeqRpy8an@1Qr7Ln`d?84)Xg(jwi4PHNsUoWk_ic&=9aG&G=g6&>*jj^3W zHuu=T>-d7%coD?cH#~Lx*n54mfAQw{pZEX8n}7cHdo$0xcl_zT<8Qq32L5;h|Ih53 zdHTKM&%8JL>0tyVtv8q7-ZzUq4pM#l>Gx*+cVaq2k27?>uh&m+BEKmNZ1nm&&;EQy zP;t4|-+f^~qbszHdju;7kZ@w)(BY4LTza!hM2Lj~y_9e=$mHI>R|aeAwbl3Vdp7I; ze{1hvIDGKn@ca6E<o&nboBjQlZukHG%fEaZGx+_bi~Ya<;@`ggG+RHsd-37j8xQZ^ zfB55T4}X03;ZLqS{K@TyKfUzur#Bz|^ufb>*B{=y_wZ*|AO7sl!=GP%`14y2e{u2Q zFK#^i#r=o(uRXkf_u((EJpASDhrhb?@K-k<{_4TQUtfRt>w6C$Tz&Z9&cokae)yYP z4}W{{;css|{O$dRzq|JEcX!(tue2}TZh!7l`*SzjpL@{${Pp(d@3p^hwf%)V?Ms*2 zmu|Jcc(MJ(8|^RNZ-41p`%8D*U%t}*^6mEJOYO@y+m|1-|LS`CukN+Ka<%=HJMFJt zZh!Sw`^v@kl^g9V_uF5)*8bYv_Sdhpzka*@jZ5us+-!g2LHp|U_SJjsZ(ePG^G^F) zm)qaE)&BOy_P1}ezkR=b?OOZV-S&5`w7+w^{oPCL@7`>G_d)xwuebmDUi<ph_VqjM z?_F+x?^gT!7u(;z(f<DZ_7ASLe{i>b<4XI+?e-5ZwSRcC{lf?Czq#K2n|tlQz1sfU zJMEj7+c$5u|L$V@?{2jJ?tc64ueJaFZu>`9+CRG8zICa6>t_4bgZ4jMZ~w!+_CH>2 z|KpwZKV5GB)2;UHi|yMt+PCkw|M^<`pYOK+<x2ZsZnyvSQu|+Tw*U1(`_A?DoqO$n zyW0M@JMDkJ-2V4l?f<yg{*N2&|G3}2d#!!<Zu`eq+CRSC{>i2GPj0q<@}T|G>+PT3 zYu~%tzIUhnv&-$D-D>~*V*BSe+CRVF{>8QSFYdPQUuoaJ-TvjJ_AhU?fBB&OtLyDw z-E05)YWvrB+7B+bAKYsH=3@IdH`>3s-~R2j_HXaDe|M$*yW5?MmpT`3b}l~XeC~SZ zbN4!*zuNiyoz537cfN3|bLnE|(v8lg`<*Xd>wNKU=Sx>QU%K7-@}<s~Z+5=?pmX_p z=kmSIUtR6|)t$~)E_c3itMk>1ov+^LeD!|k%C*jwyPdCH>3r>W=j)d`U%%P;`h(6l zu6Mq1uXFWk=jxr#H!pX-d8_lSi=A)X=zQyb=iAph-@e<qcBOOecIP{nI^Vh3`ObsR zcdvK8d$04?S37@wr*r*s=lZSA_bzt6ccb&Y`<?G!>wN!i=Lc6hKe*kwajA3TX6MF( z&JVA5et56*H&;7<bEosSmpgxZt8?>W=jM&h&HJ6dyVm);yPdzk()s(_ogZE5{OD%q zM-Mu;u6J(T>-@vj&OhAg{Nv@$Ki=y6)5Xp|-RS(&{m$)co!fUi|9qwM&$m1Oa;ft# zH#`6Gp!2WSJO6sGbLVR3&YjM`UGDtbt<Jw+?EL$U&cEO9{KvJ<f86cdz0$dRyYu5q zogd%q{P;oVC)Ybax!3vW)y_}vbnad5+`HBJ*~QM!ZghTjzw`5JouA+B{NhUI7q>h2 zFLmzU?A(9Q`Q`P_FYk4Jb+z-WJDp!&?)>^z=fTC!gBzU(_dCD2*7?od&Tp@DetWy~ zyGxzl-R%7C!Pdp=TNm$beeUYk=k9EM{_@u6Z*6_y;?@^#Y<=PW)}?D(m+o$T@yga0 zZ*P6+($<%5Zhh&&)|anuefi$j<*Qql?`-|m<*mQEwe^*YTVJ`c^_BZuU%j^V)w^3) zu54Yoz4f(ATVK1m^|c3EU%$Tf^?O_2xVrU?J6l&TZ(Y5$_05Z0-@LK)&HG#5y0-PL zyIbGBvi0rTTh}gaUAwt;?ZMV}u5W$k-qv@oZhiO8)?Z)V`s-U;*Dr2ezp-`w{?_-d zZGG?V*7vV$egF2>4=!!};O5p39&FvXzIEf?)(@|4{qWA#-&}tCmD%5a@n-+;zx4Oy zV_;qVTYvK-Fk;8tz=<7mBd4ydT^L??pZ_lL-@jOvf7jl}8~Au)l^;*k$t4ed{OG9u z9{HI3K6*qyAAQa~+w-ILe0cb<v>P6I&VD~Hzenu75qocB_?Uh_BENH78RH%rIrO}A zz&}Rc@7J$BcKCe?6#`xkKAie08mxMx%7)>g>Cw4k2#<k8n3d;rlg;-2@1HR${Qvw8 z|L(25J3LZ*_l4&W8`S$>pSN$0)!zO1L43of{QFS!H(R>zpAUZ@joKfL+8?#{qlaqm z9vwnoNA(@~Jc{o|_eM#?W_$nh0b%34z25))CH}Ra-v9c7eD#y)tN*+oefY00#UCz4 zAO7=K(TD%~T=d~Ti3j_^lmw)Y*WMi>_#E8;gZnU+yQv4(sqoHl*hk-EVh*f%F&*ry zY()1lPyRUzp$rzhru3yA%n-pKt({HQ!R`BCn6wy(pw&NPjf2ZJa*?vXrzAbR<$G^= zL$B`?i4r6Wsyp6?j@YD_1k9UA5j4wNx_uvoX;i!55!-)2e^RQZa97mXNBx1@VJC?w zW`N<gnY_gN9F6Zu-_38kQP@s=;;s&ld$BT~u(Xy*<WUs@MoVAKIo^eAND<MT!}~%} zz@K@wX>JZfIkU4pq!BuL=*Y~y$}x<lIWeNEj6gG~Ga?3UCTYr(u(Q=~*GO#dp;1b{ z99x_iAn?S$kv1i$79Swy+%Q2ti3pq@!?o7h8}rMXb<OG9TiC1n2D72{(-Qfb{n-&* zLgsY$`J;9dcXV);%}-stBm0vt9X|GF2u97f$0PMX<kr;_rR+z$l)$9=a-C8)JQI&1 zK&*QAm*XQ44f{SQ0Te<$DN612n93tOx;?2ZCL$Q2TAW}`&$ZT;8ykJS1AV;*x>$Hn zlYL+ltadMtBzq5d{s=yW0H_*bPG6gwM!4zB-1x-Y=!r>$rQ(ur^!3OnVov9VhbCuE zPB8;~1@4%}ED1NMLXhu4?x$OAW)co^u8|`XCB97|ty|@eVM;?Ip$q<XcFUjsep!Ts zZbNC20@aAqOjl3Ive>6`h5qPX3NBVO3W?8TkOVaZ$-j;R^y)h-7@{JCeLx0^d1+u^ z?6vWUsnIn3YD6jQia62kV0rTanSA1Y1hq_KCm<$h@YqT-+O=kxIRLwY*Br?8z$tkB z#lN6r8eh%962=XT1~|M9YLMGGx>BBdY^2FIg!I?zNH2kKzTSatXkSRb7vxX6m#a#^ zaS433Pw|jb?d?^j*@F3!mTH(UX}aFs1e_7v2~+%L_nPNEofQ{QMiL?>j0wTmyN3@w z`>|(VIP(0n9}7zu(SjgnWgZ5YImEE<5IxEgVx;uoVw%*|kZ@g4Rz8cVS9`k1v}(3# zZ%Z7SM=HrQ<(ySomoNaBfSswDvB)oFId8n9dj2*F++J+?X&sDl>$=h{CORYbm|!Sf zBO56ZrHqqSDGOUTE#V0y(eh!JFpN;q-;duV%7P%aia>}|^ic(Wpz;dP^TH^edeyLx zI_J1=p>3=-AWz{kvQH=F`Hv0HkZqXd`?%9x5>bu!CF$mOpi8#7b4CQ?uAVE(+_M78 zg%lu--t-!ea|4ui6E0ir93(9=N2T?Hf{8&OT%?`Dr0&rV5+=rw>=LFA9#Kbj4U`5t z<PcRFGEq)iE2pHk7zAWOO>rMie{g!k&R4N}zu-<9&e09F?p;)YX4aERjbNKS)PpR= z^;E3d?f}%Gf|zcYz#_@mD^5Yw1)d5r74r1Jz^0@%(oS})@j7lN%6k9>QQPhbp(r1! zXdx(<XnFDJ;)bZNrK*GkoJ(mZ&!FN%xkelrRm*nsYO?F~rDCs~z+qZSWF3+r|9|%0 ztv9YDNfUgpUvZ?SnxRZlx4cvpOC^b-q)b-nRwT2sYe@|eB!g76f(&*9DT$>_?4Y0a zVIQV}D$HVb2Xh4)80<r1u?s8~v-`4tAp0-WFWK+2i{H*U5kX4ouGtiksfakoFXrZE z=H}++W^BdlVvQ=KW7PE`J{&K)Nk0RyUXk#~qGiKrfGC9uYID8wh*B1f_xqD}=}+G> zoE939UMEih9oTBKz<T_1Jk}s?G;&O?5y;Qv154w)Y-wD{?t>RHIk<)K>EX_c(eSYU zdvWOCeM%4UjWcQ-$@6}tA5&|xKwSCh?`ktKPXXFSJqG%qq3RIf;c(Kw-9Kb3SWp4) zbh<T5FWp|P9%4&hJE7JH;k|LzGE4DtXby{<u*V>Db1b!z9IZoRBE?pJS>+p1MAAcZ z@of?kjHFezQ!*Jw`VHy}RuJ_}h9JOkjM5>_N)MQ8jt_Q+xH$`_IXn^JPL1Po1lp!$ z4cA^?@>qV27epWAZQ^nF)etC`RDW!geM3>C!;M|a)!xjdA<VtCe$d~4A(x0x1_-Q= zTg>8kIEK>$8ymmq@5O|`tb#wq9QMD#_w?~SSPIPWjSD0MbDmBhn+-3Z3Wvv!o__ma zHD^HKeBgtd<K772Coplk;t_r2Dxv@ZB;`6xT&=3U0c(}@Gfapeo-&|vvIQ5y(#NAM z-<zsb2-pxkw0w3$bkjuC)`x*PJA0ERdUAwDX%@c;DNEQ$X3cn;VZu=P46Y53amS-l zze~Vw6g_2q61D6#YtSXqCtcfg6RxER#hn&On=D?GoS_1iXBgv^j`Mxjk1jb_^A+FB zV=Q%!zYrKYw~KxBP2Xv{iyG7@b2;nWF}a@jsNaDH40iP5sIK3|xc|$-UTyYmEn%da zpHYeH<f1K?--$Lp#e3PIii)TEhlP833RiN15#A^a!d4%^<-G|}jyvV!D^-aL92)?a zGmV^0QS3C1T>IheN%OV0;p>QJbcRI-XlJ4~tQKjciP}*0nrga}gY4BE*O{iA4dee= z2hMJRh_v6C#}5@_%J5Mlj$VhH&f#}r_zV~QCpqB9d9-HUuPgqCr^XLWj6&{HrbAic z!;kgDvmP~)X@e!k{|UzWp(hsfK4qk2_n8Lz9%T&sj69jFD#o6PY(2k-nf1Ow7`%3# zFC6~MHbiy`b2gc(CpvMw-cPn}V5QVPOn{bAr*7W(cwhVDeeI9;wLjk1{&-)z;l4IP zCH?G1x)p6aO}$ZGybe*P!p8OS@78|vXk}~l!9zq<`+95b(b8{eilRlot<35J_`xhM z#dTH-cIJz=yxf)Q%g<p1f%QU+MsB$b@vbz65dv2sh+fmSF?*j!Fj}l+l}?mmLCoS} zUPr?j*-Fy_MGv8(45T<RhZXmk!dqL|kmeN6Jh3X0%M5uz9@`KJmQ(^Z7YYEg63@hk zFU<(T^}rh^i9fawFp?(i2#zZCxCAntaHO#ecJJvjjkMYrEh$WRPC)XjGBVP+6&ql* z1d_BjkZ+UDRa%-+)ASo3YI_pk3+6rf)pjf<-lxIDm>B)A1AlY;YsLzLk51xU)EH7s z1B#W#N-<=<6pJBTmaM(95Us1JfwA2_8lbe|5%eD)6%)0k6sEsTB82~9W9b+chwT%@ zN)F!;J$q^Os|V{_j}hka>HW*k1*z%XuT{CWxDKz+ZxL~D8KGtOdj<JTO4<|y%tvxn z)Aq+n3IQ5FzkZ#I9vF<bNt19V$j+C9JINxZjgVeubR3T4B#yRnge8>Jz*WoNtUg-9 zv>)z2M9A6@xr&eZpqxoN;J2vU+8!8k(hTbkO9Oc$4y^QrEKtMoF-2>9a)5}55FYd0 zBlyH3VmHQlZMbvXJ6=E?Br~3GA{9yl3mPoRAtB)E0mD7!@)pmb&=`}2&9fM;2)6b1 zi)|cLefjy7d4#*;mo2?CY+=iJ00nUI;p0dTQle{R9WQYG4{NlJ-vTQxRy_F&7>(S( zA(DLsVsmPgBuvFoPl5_b(ga*;(}^%<8UCq6EJbJNoJH6r)Slrs!}f-Nop-7W2grUo z+zlFntQt7U+uAxFuF2#=LtCsapzhf2M@W&{g2GOsmpKK9`Is+v51GIMv6cJ#he#cT zxb-x%I}BInd3=h@4ocrS0V5oz&;buiQOC&5J!se^|B_{kKaGHhR1)BMDMN=Dk(%^U zrvvp@cW#jROqOm!l~aJNVdmzpVY16yToXF{%Pl5E%P6mnovbHAiu93=iJ(z5mo|}) zk+_dPM&kY$iTh(D?jL(3Zp!kpY#1lzx<$x??#}UebFDXG#-g~5L=Kr(eWblYpp)0# zQ?7Nmvxhr1aJbUNn2!*91P7=HECSyvdRz89mI{(nAHu0<fb2->J#<lOcP?K<LI5t@ zOf4Fky22z-W26><!xaLfAmw1Sjc9Dv10zJ_ooEz>lko{UI7Ne9M3mhb^t$2z#q0?l zBEllCU=VOK!xj)36PWgtEz+fl07@qoQ36R3kPLAbIu_CoT&<Sy))x3A9f6HL1D6dt z#KBKX5Tfa=;NwPwV3e=ntEG`znCnFF3jZ}nn?#o|1Zk2+po36KrU*E7_1<(DrA9J1 zATQM^Ms3r<+*4gl4`SM&LFR-YP-C4|I0z%ovJ?P#r)ct!h?atwMoq+l!tjp5OfvEy z?q_mp1x;g+5*q_9BrD`#I6T4~lOZy3OOx=!>+Zhl!$<9)`;rrWIy_+}2camq{gE(` zhl1@PHjX5DWpff7{Qx;Llt$nnDAOhx?*&~@YR7%#jlBvT0lS6xc9oR4!bxM{+(;3u z6Gm_}s{N?qI-QU4H^W{VA^>zTIYV|KHC%eE;aF=2d-vXGebnvamX?{MzCnA;9a6o$ z%RJO3Yl_m}lM@fRjG$sNVxEy!Bw|06Xp#(=2ccuUmtChZXCF6x{TkWV5Gx!hJ*rzT z`F$H-^HAZ}e)1O^am=0gwQg!i%?ttNT^oeQn)&1t-L@c@4fc8615^3cA%QXKA+vfF zKQT(;moAzjDwIvUHuc)3zm+|?K6XXwUR*|$obeN|<>I1B3x2<7ZDeuA13RR<PTL2B zQ%-_azfAU{vwXY<&M|^t5*do<tw_k@OUkKJsR;S58@V9#c4=q8N~;3gmz>k;1ssq` z@D>R+YfH#UcBrU|;9$NFrQ@$Iuwj8B<Iv)O)m#8Nk!6y!r`ayBdeh1g#JhR;qKfAp z5*v+!?@YEdz+!~Oa#TIOTCKxz`(<_Opm!G!M&0d`@zvcPBR0*-XS^vKL{Q*CB))m} zV0Ha>F!-fhxT>LXcfough5Po+n_qtM#m;AYn;x-vnSrbdt*%9+KO2uWSsY2Gddau2 zw*KPmYeAUB&6=<b3qlCBr<4bZtE~wE1Z9ie9#;DUKnZ=KCjT|s9_id@KUp@Q$64D| zpWFofsQaqhA4p~wtS2q9w50Z#mK0zeDqd|UvKYpNqPqJEvBLt^<3P<K3SK^ju?t*1 zXFS*&sp%uJtWHh3S-bqyJFd+KZU(?cCI>CDc0^mx+}O1@xa2ER-PE?p1deLU+!Ddi zQCD>N4hMZ?3&+*Tt*wXOJdp%STU+$ncjG52w}9dK)wuf21@ZXw2#OvSr%gTi(<Kfi znobh@c5Hc86V84*hrQR;=4x+m0Q^Ga$ugROe|h0HAbczml-L1*%<1sUMhPZ?NCvM? z=2~3Zx!(g)C~dVPG|nZasU^0?$!5y<Xy)Qm{zWHy{jEJCRd+xWt*lAMfd|K(8nzb~ zb*6BOpt_@%(i@GU?CPu_1sM9{HA$@k6!MJELF<o~cuxhgsrKS4WT78*5frBOMi>MM zU5Xc&C!|V&uK9G&*Mn!&yeKFzb!}LVw%*N0!~OnFNRH9j93Nq>j`uqAX8NVfym)DR zk$Y7g0e>zoUPAL1s}46&!$WL9eJ6!thr>gh6ELaF75Uz^;adH%s=<da90yP@Uj@6g z%@X!)a$!xTjOKo!OrxX3*za`FN+~K4Y2GeKWi=d}0cRfsX*y`;4Wud)^m%9>2|6bu zAscsw6TgD(2;gTO2`<i7=zM@1-~>W&p&HOm4=Ye27pP6|%6nw1iKT_7`3{tbaJ6bR zhp%%iQD<F>h@`;6ZEWU;uaP?lF%??Toq;=lXTG`$cYhVgE0!O1w(%lDM-UMpn%-+% zS3~|mgu8$&qSg-qkPsO9nO|I#?ovX-k^RK}V;@0U$3t!hG)_wVM&w*5YL_JVL4|jq zt3O|Pbyg9aPNxKZ@|lFZ{NU?R<b+95#`YbpTvw8Slh9dFk?~!BeD9<`zyjOOc4uwB z^kit$KOBA>OYZOYMqAht!geRBZ)bk2X-2LYe=iUSQQomC%-_8F1wXzS(?ljqkqXU= zAr<S1yy9j~UI%Vh`znp2Vr_+S&3o<bimX*}64o8H*qCmRN!a$qX{PnZ1=n~ZrOb9g zqv9@=nbXJx+GRG=R1925Coc+UqZEqYlzfA%vpe<rKGD7J`i9&LF7{F3xvXx>zM%@L zy_kWlShINs2F*~d6TXE8lC6Lqm?o+^dIh)f=1W|DL_OBIe+Rw2WJF>UUAZow!5sH0 z38Euv?HrfXEqhJMhwvl9?K6N+efZG`b-48*cKAW<4J6jO)z57NPlm@28Q{990o+vo zx;HqghDSTyofo~U5Od=2iJZ?n$fi81x&xdgjTd-J4%=IZzU|>){F6=5Zk<j8@z;Cs zt;;WpD(x`E8o@HBn{=Lf5Y%u8;oJ6SdhRs}cquIbt3yN?sNiA7NaeRi{B;!<<?$=G zFwY*<{Mt_xCNms78e(l2szCO$4R?6Lc?VwMG)lPx8<tnF|KXkp{A#&I#5CpM70d}d z$P<0ms-?0_HX?GyM2iUAGv`7d69rakPgWPsSg|Ie)KMffOy&<ioX@#RCV({=I7&fF z$L5JZB6w(UHtFw{V41MVoLK@`2%Wd<@%L&gz%0NW^xq)$xUBtd*pYPSAuL6Og=zwH zq8v|xt(4BXvvom><Hh4%jWIeHRik`nZ&_zXQHqALE40F!{1zX}J$7}Ltzyy(agf)r z47yo`7;Xy(xjQciDK@<5sNCZ58QqBaGOir#qyYoV{m~9%^~2}`>o;~jL8>Gj#8zqx zR*HtQ%VUHZd8;$b-tp(lS3&QBM8qUT?tla>-{T+{W(^n+@<vV&QUtDU8FEr;WJe0; zOmx|-Z-Dkp()meNyD^ZoAs1^kEG9;=a66MKHS$o{vob(lYT@G`!q(2l8hB64ZZwsN zgSI|CEjwWg!Xu1<%rkPzua3!;)Aqe}18f`OUPh9F_8EzRJ@BtFB!#}B*Phx`O55VY zlS8pFCJ>4JU^N&YIteX!Yy329WY~)kYJbS4BVTfR0yJT&&$Pf^#$H~F%%VPX47qi~ zqMxFvMvP=sADJe8%Q+z%iy~Ny`YIKUDR)}rmKs~g^0d9w<XTv*1+d6ZLLjh{4kTp= z6W}Cr3kDF}Gf;X6v{yHR!ALM3clX696Z@#%!O`*Q)vH$%LTMzBIcNmbmQ6?=4Ucj- zirFWm8Jtb@o`4dqm12W@c?hdg)!n9<E$#+!0501?x8`%_w;3WFGJ-oE<h|lI0WY9y z9H9_vM9wS_86bqCv710wk&*;4nJ_Fd(}<OIY>BNm#Q}5y7$D<utn84*NQ=}g@Jm5V zjkG+@G$H7!fhuFwCB|yogmaJ+j4yMtM&TdBLxQ(PoOwACMzA-p>1JHvJcQHn9yRPm znMnB7W8I3dWdMO4n!65oG(P0PhiKUy2jFsWvfo@e#0uWu^#Iyog^bGacpAr%6e8Ds zKLd+TSePTPU(v%U__ueDUy$)9Yz_*}uMIq++q=ecZAt;i!j9bNmXVUd73_A8Uo6Vh z2-Onfk%g*-+ZAb9;KQ0DcO#%1ZLXf+Fy|m@8!0ZQ4Wb2^ACI~}#6~!*9N}<!sdX!e z>4i_4cxu3T0)B$W{k=Yuz0tjpQkU!Km?6@PgvNBLklk0ceG2IlEFR^ia%$$Qu$z1g zwf<!M`)aL!1b++tadq53$~T{>x133rXXVB=5Nn{vfQxuot%Br}O4SyQ6w29nxI>>2 zWRugKUmUPu04po@_ZTvfk|HWa2j97LOA$lz58hM{)ZuZAjC|R1ob_+a4~Dd-&QnXA zr<DQ+di)>H!bs+y!vsqIQ1)i7n+61z17~$An^-Hg!HXyiSIS@-7*{QgJ8}e=z2Q(H zxs&x7M&_izIEdmIS&4>w5%qAwxQ9%B<D=dV2@13XI?5W~?%FW#-0O}u?{$Aat&cdg zi>NCdh@xuMQ-h>;<mO8izt~}|17%^t9B3i&EA(X38TRKK3|vlSlFqT^_~@oNtDP?x zverryeh^P|%MOYTU6)_=k%<zsX-*+;@4_$pCG8Kv{vURM-`kOaODGaSV?jS!(1lhd z16;pO6Y*!#z|G|p2;&oE!1PmB2HpGw)<XJX$VNC&l>nQt$yj}r`{t-UIKApZ+WHWV z#qf}aM?6g-r=;*`xGx7S;v7Wh(u;R4iW89cDj_W4Ma>?E_-6#Y5E!GM&;i6cEpdR_ zKuM9BBB+1J>uF#JFKAlYxLW)A={HE+^yKL}jGs99t-3qnLk;^Q9o4l*t2Kr;3PmqS z0h6C<#`o@4AegWTd4p2yP{v)Sgn(i3{6k)p>e<@r!i^gXyhhjnW`bB^N>pEYhJ8^_ zV~P?scq-DFTR_(_({a$wn5a4dfpD5Au>du0fMckW{TBj`Tzwpl*imc*gTkTM@Bj|s zFjo3#-Pv&J`q;4G1=^0Q!Q^%A%+z~M(lsgRa`z#9HUp`pB=#N`Jz*dr^03HJVmk~F z+mQt5qP*8b=7(f~Oj6f|b+K((#N^2`fMq-^(&LG%^v3gSJ=1l%1~NQxW`UXaEZ|B6 zYY;_I%hDZXP!4TNaexN`#iIIRI6B_J9vj4-jk2xYWZlG?@Rmdxyv9X}sS|&vt-t3G z{NPkdFnA}KWQ~i#sdrVMnzkloZkiemSPmqcx8By^yWz6E)dHD~>P%RQTtt~V<Cuam zHmpHjq*b%A)il_y8kb30`RdnHZ(jcxy6a=;u8*O+K8Ei47`m$^q|tSr0v+Kt8V$hH zT&;8yLP@Kkt3q6^hbxcPAFOWucInZ|{iXE>TlbzmeWbCwCKh?H^dv^O^4MLCZNVDY z^c)R{;BSefwYS@U6*~wk2p@O$U|L3eXGG3IR=xP+CIa2+uOgJ!^~FW0XEpeN>^2e| zL5@GXb$76smoy|a@^9g;&TzDKFy3!~rJ+;@AeeEs4nt%4NnoHQMna)KP*dpD^z{tU zNC8??oHHONYbb=#rt7O@bJLK``g0=M*pBQl$6MTDHlVC1@y<{uy>;FZaO|okf*sz! zGtjZ6cK{ix6x<}YPxiN{pf#X6FW^C0CXi=yg-P_u8n{G^yUaVit^RHc5J?F-EoyO% zNu9=0XE-&`V$o(&Lm~N5-BkXGXx8mP?T|*tZxFj3U<Kv|SU<71xdqDuf+FE-Zut&| za+(aPr@g^GZ9=yW@oW6LxCES)g+Q#n!YxL6bsgQs?)UX@^zte!61>JpTg6@9A>+rj z>^`DQuDfcflTW!fNF_UjJZ<7QNHXcp2jk($1-xuz;%S<lWZgy3C#zUpLwqT#<40{$ z$u9Pmoj23IGfUCk7{U!({|;UF%ac~gixXWz#PMelb{lbfo#%_>RGc;dsXzw}%I3(W zUV~5DYCxF6qpe;?pSRVL1BrSidE8b9^IETghi&C$*6KCnaa$cVX~as~@N;;nb0@|U z$Cbv)3f2i2FgCXsz+-FW5TuCE568W&WsvGPqP_Wj0SI)MF0%2MVZpn^Csl+vqjE;@ z%j#|>r})qzFDb%X@)<ojq$k2*(K|~eVWGSd`=0;CYD`X$%PQ__Gru#yDctUCeHdVj zKO&Ocykah2jL1(Qo0CIw9?la3c4F=kwbZ}>KnS;H%b-UT2ok4)NaMt5fw%tMxKj8) z4G1mL*s+!9uv_)7_THsgxmO9xL`QyY1rwZii=$^=yp*@|xKVbui<@Yt2ScQon^izK zg0R%dvZQNRAsj@ZBtLs;Ey}Qffry%j2gPe1S;<Yjbx@dwT?;-D?u}60zzO`AMr&9l zGqMDnNrrDkT7v~&=+|Mp0<Vo~AIFr3IHG6Os8J}`sb^tA1U?rK0dl)5+yj^-V;j}q zDI&J0Q@@#_;!`qcuROs%=E>5dtp}^CPgm=FY(USicq|*y?F$}B+Pk-Oe+!w}em1SW z$K3&Joje`YJZ^Ax=Jgbudc!qB1GF&S&dv~SDm%xppJ{}`k~^Dve){m?8e)1*8PGZp zW+Z_ajvsdAh(tOYA2GfMh=TLJ-P`XU9?}CE60=*0KZ^s*lx#=CHhC_{y|=Xd>-AOq zvxNlZ$X`AMq<aWX#7jCat3m$&H@<ssUUX03LNsB}s}B$%aBb!3li7M$?crpcF*axK z;a7lrZ5?BnX$UCI)4;O~fl1vb)83O|)kJlzYmd{cEdjO4>I7z-*`nKU&*i(w;7uLV zN2s>o$s=r&SO_%-14k4LO>7%N+*?)|&s%gZ<72~C%>2Ek!<g>n9H`iuKheG?f~lF8 zQQ>gs04{~G4TA^<3A|*Y90ze`7~|H>;fbyLlSvTDdS1h#BUF&<4VHR@%|U)|G?B?^ z(^J|gA_XLk7$lE0lOa9uaztUjQLflJT&r;_sS<&}+GlejSv^3F2VB7$r)D7oAxzAV z%(d$r8^4FWT_`jsFRP`)V@SnY{lmTCU4$V<{N9t@{_yJPq<Nbr8c~G}+WPP%Bd}40 zX3R0T=&i{HgXe_xV_^x=fh9xfA-}&N*AC=Ga$Q9#D33JOIfiGTkylx(tsD4gFdiQ% za@HzXkgY~N)GLG};A7BXbVx^P-0~C*K(7XHh{4Cl>=f$n0!)wc8!aNdA27~m<pmn^ zoyMwMT*j~$Y?rTe@XlKH(t45}qe^Tq(Jd=_?@c<an>DG~$>cu4c{VMS7S>7-_f{tZ zU5fzu=E<+0JpJ~Gizrk;FUO>eE!ra7w--+4rF`;O#zADLM>0ot8L5hIFwDi~a1`8w z^~J5~vzu_r7u9&t9s6@^B;v_rU=r)rUZ&Hp_q8xL-|6gqXP2)KcyID;qdxWuEY!TX zK*#Ih&R*5g<Pp$&SynD$==LXZ@8v`iotyo`t#rSArP>G-0iW22A*3c1YeI=sHq<Ei z`67CN*HM&+czapWdw;yLkEFnIC!~4A)^Rcj1(=MnvAMqW?bj>o57wS7EkD4Dy1upi z^zq{dPuAu8{in;>Zv?4&vbDbSm5*~GxyA_9(VSk;s(}_GOhi;>O{a8Wb=35;@m%RX z7hI)TNC+QUB!k+tBiV3;@An4XeX`(nAW!DF0MP|Sn(5fNmDLnZ&f}bP!?u*sxDkUZ z6!y!~+nn@dD<R7VO7w~_$jyNkdvD}6kTg;fl2Ri=eVffl3zek=8WC2;sbu`5XTIm3 z$Sc6B0K}2-U87S!U+{(&iC#phU`MW~2_!`mK_;=DjS|&4MAo6NzD|{0QA^sStGP+! z0`TyhX~d(HqI`<o*Ez|$*CIc<%hm`2x#WTP8nR6+KU!K_D`L-u^0~cNR@ch1R7gF{ zq%nudrmToZ$3iJf2i{al(_Ns<=Q=@6Wjsb6O8u<8lz;@G^#ohQC+mdm%l5+0mR6V0 z^@CNE`)mSuOOGC*#Fw8nw6wB@d`Zt9EUhoyd-Q;XFan`_$Se(jMlqAiClv*=Dljgg zG^~VS9uT!CDPG(=A@BY8=v@RQ&B?!gpw@_$`xO(g;LoL{YRumpYEa-^+&9>HA-1`2 zUqF5(>%m7fGDV7^u{lGEECX0-lgyjN&IE#*+wbP|PS-bm2lEl_lc^U{MWaGjYjJx= zUVj@_-Jmt`F@#ajoOs?8O1W%ep;Ea_RXCM>A6Xz_fn1XOwmUdc<NikhvMZ6^uO;@6 ziNW~~VB&_Yf)QHB!$EJ8!BrRwbb3(MvgR_Z$wSm^2?HA=$CeetWzfyX2oC`USvf>_ z{_ymjS}gBKo};mcIGX4lgXK4$o*V<P@cVtXwRU_ufF<V4xD!<2b}isqaj|snW+2Xx zeTw_pcWzKo<y57=-UYzCy)})kst?aGTx;#!!TJr87{GM3x%^^?)E55p93XksP5*L^ zHr6G4aThVVNJqhVH532qQnm@(o~&KGpVO-x78MG5yW6kpjU~7dZ>HjWOqN6(+3Ce7 zo|XZEQF+7WVRyR^1L-r|9bo#4QFUuip4_znb?yms?I)_Z6y3Y}qR_M$RQ+H!y?tnR z1wD{apWLFfZo3M5W5$cQF|u%BKd~843Ot5HEP+r+D`TN(3>)Xa+EQ5eKdF|+FL|5e zZ;V3x6w&Y^dVwkeQ9Y1wK7x3b!tILj>z-c$31#I-dt8-*ty+=OX<RA8B@zUG#jP^j z$74nnB*Q>3Db9%uoEBMdxwY4Pjj}s_*~vu!%_G3tm8#&GYHlb(@k*eTYR-pT?vl7M zu;Ks(s6?n79HrXIQ#9-gJQ2k|uLzTg_9(GLWSgKh(@-bTuE#zvDC`TjVX&i&)CsGf zgqxCPMn%|=?yEz~lFUOVj!Wm7P~{zIKk3-oBq}xd4(N<C0ZMZK(Wlk`a5V&&=`a#6 zD{2!>0M#Q0DK30=1b<MR`f~rUjtvek$H?vwH0?78E0MR97=Ln{@E3*#l)vitK*|6( z2qpMcfXJI#OVnsKz`ygs5wTKlLr(8;%@C#*23vvMI)M{obE<9{<o9qn6Zf@7bp;8D z-|Y0{R#a^Yg@+byduACUM2$OMV3Cs*++7&pXE0#)AEkB9ypqENDy>lvv0&k=0*E<| zA~~lR%lnQsw6y-42)?GkWzAv+!0UmE2&1<ulF+kF_q-EW@Gl}%Nl(v4$R@;dwiAh+ z16e}J?U(JcK22~3@<X^l>N#sD-znvkT6@AOkR1dR5QvbcXmwC$7V{>5?W4NeD%P3f z3adFg@rj^_-^Ec1)*X;APEaf~1lB%i^C*n4;k-(Vpy4n2yKn=wUh;J?;zIaZDN6*T zT*wV9@Ec#jA}>gLalVWeUypEI4<R7HPfdIs2}i}9O1enO!W{Mxj%J%{>-SflB$b%D z+x-(+%TX?ZY$<s;S~g}$mxPR;Bn^0I3&&~~(mCgESEUvg5z~iMvg8RJ>XOnzmX_%Q zNGj|#0kl8<TIQqP1`F3EHlOluPN#9z=Qm}4ZP8yPh)?jD2y3o_>!bdGsQG{+B3Qf9 ze{Dz^=t(V{H$pk;AHe@W#^b#+d`|JG-hL3DH5F#A<_zpGl}nc+@?n_iQr3D+e!9@B z!@{?@(5pYm-xCs@Y4zlRtZM3d4zZwdLH{MVQ;$lp&@(UT7A~@Px2T+P#R+=o<&F7m zEsmS3xHXcfo&?DM6b+&2rjA*ZM>FgX>&%ukD^AWycQ|2`!_qoJ^1-q(Ck0(^s7|gB z?hO2dz8VPXJwh$AxS@+W*fY)(N2uh%BeBK>y)(bGjT_mFX+3k#ZH&`4V=h9JsYp}P zrY4TK@whOTa6w+AGBgntE=n<v8I@$M6d*ZWc-=y<L=lnpDFPyW5QiBD#Hn+2zrIh% z_WmV4!``5~yNi7VBd*a6H$`Xc$B_<h5mz>0<=b$y(qP||WpQv((JEJ!Irsn^K#zvy zy|yep39srRAKf8E1bhKwnO0D}EIt)uI*LRWx@$!mLc-eaHmvt?D7Lft&GZ%C{3~k% zv@KGJlc2fIS;caqd_eZPl?+TzNBD|z#h<WsvBozUv2%-C=`D^uU5J5#q&~>r!At<D zdV_IKXwj)4-Pz>^pK^F}J7NzK2P3a7dWu#<9MsqmMUaZfSh7EUjGGjQ(!eZ2b<$xK z$DsAJ;X{!1!++$xMAByiUWN-4V!aIDD$$w0!bo#<WUzd6ny~lcx${yyCSH{YkPcqu zla?tSQ9ht9IPFyqs?@iBHs)T6pF<ewD;;A|C5|qBb0k?y+DDCdRQ1*PT|Ngib3u_U zHWMLjR$!)7>3tU!I>xxnh0bq`H&co^FHsJ~RI_kfU>+QHENtjOZ?xa*Y_#<Yk0Vp? zK>@IYD+xPXPSBw?Zl}<35*Jho8uzG>IZ=QUZOf1pj}sUKy1*PGOSa6UOF@Wq=scy1 zQhoL&jVK>yTniGP#_oQ(cl1G$^V3+wa|hiw-}ZNrpA_7N?*aGSqt3?Gmby-C0e7!i zXdXDX$-#vjUci|qPBLsqPW5{9Z$eATt2`_#`4!P6cXxp@f(PW`?#&T`dw1p~@??O0 z0b!R0dy9(#BwYP^h=H8*Z5Y2q&kpf0FT#20*4w$`?*8|;FOA=NZ{Od#W)Gj^9t~o} zvPt|4sSgli%aI<Op^aU_wHeBbWHoe-#wAX<Er9q@5?^;Vb{4B*r<I#G!_gFMJ-pps z5&`*BRzOLP6AU$Kw_Zcw?aQ?P8B>7)k{1iN8Bcy*=@N#s`aLhlFxjZ7X<25n78Y)6 zbFv}nD9BRku_C2&8FVKDNfq2?wK9sS`CC%uwxn{BuX&qH^mOZ*m1&yFoV6j2d}KE9 zH8Gv;@l(^fPinBGsQ)UgA$l7x)oCYNLQ>7Neg0kar6M8i;|lCA8Y&!dj}yBD*EtnT zrTv5#aYV)8CPdFsT>}O;Br18r6LWjG3ac^-q%fb{!ZN)!d(=mn)M0YCM+vo%x>iE8 zBcX<<EGg8b{><19;;<t{H<3b|I<{3#;iE0?F)v0@q`c@s73;m}?I0Two>vP92N8(^ zyXCcGh#wB*=*7|EwQFPkR3B<2&C~5HIHi62jEu9obtdDbO;dBE=VRDwKTrC7&6mjo zWEZ)wmca@Mb8){BDcFV;l8-YH-yS!=mAEiNOyOePc#Q0gu)XylW~<KY-aL}I@8W(E zr7lD%0{!vKMe>oWh@g~ez=d_Sz=|na0L{|wE^K)FF9!HuV)5Y+3`B&(Vx?p>82AYI zc_=G1<OY+kVf!z~%ANTa1E_VREtP4Zl)c^_z_N@I^N7H9%t#0kLjYlwqwX?hl?*xb zi^2$h*152`hf|!)98j}7ThTDh;X2D*pIg&(=SHCS*ZTkUE7c9SjFl@DaR{isVrbZL ze;+{|Ew?;l<W{&kh*Kpw_&PDOCo9<B+$3UPnYhsK*W3<iSEfB19{@{G#F79AOYHCn zj<b4;bPtmOEg#qKNi-1nx^PLzG>PtRlAw|-^fc}&kxTeq>{=xNBcs4G$0I_)b+H#Q zImiC+$3-SJMD6f;z`R{MKyO@P{O1mT#66koxFWFc>mgV3CZkTQnkdj%yTAg$I=3-J z*Bg%N;(vcpZEHI%bI-exV~Od26ghfRG*BgB;2#^(D^sb!62g;Jx!=?_D=sX|^&|cB ziT};1m|nPjfJ8%&dV9#Mf`geLg~@RPI01BUi3K_~^*EcLl%c#aekPScXsTL`<$_n* z?v)ChFxPLubxy5pF&TC10O#tmpH=<OML8hKR<Cj$@bdgjQ4Ef0T@$=cqi*3Z^Tv`z z%L~+p4fcCBJd!gK#vGy)P_p2yUU>|^M_${7LXa-O-XcG3)y!uBeAJBogjzS>+}NH% zu=jBz0E>vMA5=-lJ6$A69V5j!)5YAW5ibPK)fUNvuuHY#82%Eb>zku$3F_$UtJOXH zx{nYE`ny)1RAPyEb~bK47i|<)PLmycB(mgQ@}N-+6K!lOuL>SpxS<RTN^4^?LAg?5 z!xZyveVX|+q421POzH$K@hvHj+dB~!!5xQuV0SpKMfbR8?ex#s3O8b-e)K68XQJRz z$|3dn%SReXORtbX3i6Iu(-?`2i<`$zeVnz6n}`0hsRkittrSX{Jay7UGESQ`t}VYz zQq!91x51$%s#J;_eg~00pq>OH1Q_7}5xJ-%kyDXc9m+3+t0bY2=4vGCt$|CeY7qU@ zST|j43d2&VpheftsC1WffNPw%@{YB2aQc8g3B6sI08ik8kcjYX8|{7iXHc}v7SRAo z19OJju^TdX(?IH!5h_!EPgZ;E;t&o2D)K&`A8aG+1d~f_`O|bz&>*lz`H>G3r8|Do zk%O?=j$tl&gSE$7oisY50)iuVxwiI@2^D&1!x{pm$PyQU4yB&?f?)F6Xx0&dA~c%2 zVnbR4(Q`m)+%#(zptH$#w0=L~UCJRC)YLW2Av8IVZms+kKXYF9H_FIUIhVytD%_bc zhK2}0-eWTy`JfvFbG=%#d~IFfb);{8cKu?7tL}4+DxM6peF@ySxcO!W^^uYRSBUXr zH~rDmA2;RAp8ojk`39EMzhqfF@sxXx3VzndH4C0aXCO20)M+eXA>sFiBA<TRq-x@R z-@(zU2wApYZ&~EG>+tPo5|rt|D$CQksYeQe_oVkT2+lf`4H!*U#>^Vw6Je~=Kz3Ll z^y+YfIBCB??CoOdS%Dge06@D@H5?-#I=#5K_u3AjU3Oj|x)e1<F+o<H-qro9)yC4! zLGOO=`N8lWawZLWaWn5d@RQS07evwy1d*Y&RgYo|u6iRAThJjs{Z!6Aq?tOBS*wod z{7L>RY+`l>$bt9>SMitj#9oj$E;JUQ!1eQ4bcE3OxcjR2%r23pCl`d5f0&VP=`B>V zZNPSBA;@H6V97h~!<fd9KeA*)bx<FtnuY)yxknAM<z4iG^J@Y*LI`ys66SBc7>N0^ zu&OLBs)D~h>h=+VU|+VY*q2~C=xU0smZ~#>I%=?kPQ-r79vTFEKs3;S>=CWFj&mQs z0r#uOpg=Pc3~?}TA-d3Z?*(Rzj>A042D-cZP|yO7XEy^tV9B9&RCW}N+P%9`hxNZz zDZ_$J<p!#UOna;86oa`B)n|0Tm=a`Vwg@7jo@YEP=_~k3oT{zCFf<bS1z}q*WQ-F_ z-AX!zLF`K1{_Z2RLXk=$hLhu(;$+n-B{RzYq0Lb9?nt`2WjX30?W!{fjfqI-vEdqs z{k~i+R5za2-Gm)H?t`_dCJ4P$HV7R+a*Fa5Y*?_VsgGCSJeahG2kzfbwm{@c`Kazr zFuaRfyWaO4u_-al7ZoMAE}NR;(8WUyKUVZ$R=wfjBxi4|ZfN44(SZ`SzQPNy_3S7$ zL|@Tp!pUG|(s?-7a!??|vbm}I^3D4zi1@YsboF;zYY%vx8edEG8NSH0zi(}!?A8`V z%C)OkuYvsq{o`v$EPYL<R}AD=Q9L<F;8cLYbk-o4Vap$#Xb3c+fo^pKnX5CvviK7S z`E=2MG>Nyhg$ULUws67;W7ZdqtKi)6!O;T&cXNC?7H2swnp?YlShEH6$&j*pFv-y= z82C+(ORlt+@ES|-&#+<zB7g8*<YFl~21H^7PERl{>X{c{1wt>D^4Y>`LMsfk%01Ue z*;yJCj|cgdcb+dWI1)pW)w~4p>p7Hlc;%E6?9G!yEIjblZ$v>pL>C2xh7k*~OSOur zOElEVb-QRZlXvVH&VdB>6w`WERGy1O3yGb8W*0kFYVL_Oa*Ial(g&5XLg^UJ69kZ( zt|<^#;#ZwH07e9b3Exz!f6n8dU;p`+$t1obHfLXnBYf;Ku^rgydU4GnqT~!tka-`G z-b<Q{7*Zw>T1$`;+nLM(4YaCNlSS*ddZh)*3@oj@x0!hHgvCM^s(4JBT>gM5H9Qy9 z;dLL!dbklKR;uJe7f=2SAZiyN61Z%YtCAInH@h%&-nhX|#Hp&RVhdT~Ww4Um0e~+C z>^TS9a5ls)#m0xbcsPFA?%{Hs?32(sp~E#W=`M5?i%G~*>$&AxfI}Lt$ON>2z@Z@N zot}5P5vINfSfFU3ih^z~3=2ZkH@fOw(0voYN$AJU7vl+6XaL5c(AvU6NtfgdsU(I^ z@l_~`$SR;4VKMtXpu<OUIIoo=>?|M2nZKId`kj=s;Ti3sgUdW{3`nl|>7UhyUb%bD zZYdHf{)JW&S~HK9LOR3|#c$pw5u)SQcQqw{nskP?L(Na9@vYJ%faBcc&H$n#Q&pep zOP@Oflv8S`SCJTJE{-fCi?H<V7B@aynr$uL)RTeIS_iBVj>zGcfDIcY`S1v~?F=>8 zsnAm>orOdquHpn5htt>~F$)}aiwOA2{DY7mqV<WaP)No&k7im@Cd%tFLmvO$n|}YB znx8S7Ux)B?E`SW<whz*_=aJ?Nh9ZW>cXA>wb#)Bf^1&ql@v-y`oJr)~l)i=acA#;6 zaVLsHvsPO~A4}BLh*|HrUPxq?S>1^6`U(5o&JiZqbQtW&SDr3I$38+H_|j$~hDPiT zW>7GQQWq{Nx3JJ;ZKK<oWjqr9+yOn09|7Ps;WSc@dbVq82#kK%6XfXo%rhd9$$^O^ zCTnA(EgaO&n1+VTvuP$A+5%x(kZ!hVa{>AVr*IB$hOnkOa#)fn=)qG2royiM;#)%X z{adl&e1EYV6Q`rW3?K2$0x~YKBLk)ha>7Vu+JtK3i3C{VMjrMJM);^!u08cziZ5s^ zk$oMBuEy?0Mp%d{UbXBa)O#!q*-@?BdwlJ|z2*BW%T$hF)SApzIT>;jgr=p+TdfFG z2!7o@6w(QeyGMOw#5vp@z8-Jw9PwsT-7=%>v{{zL?!08DS{bwl<6O}RE6xvl2SKuO zs`%&ZwR1FKuFQ%(^IXK7tYJb#Fk{+Y^+uS#V8RlSR+}tUY1M9K(h({Iyxwe1?4wbR z+PhY1m`@z(L1l=v-{k#zT?|?%RI)=2$;3R%MNAUIN(FR!(uSlX9%z`UOh;BW&YJp$ zd|gf_5jkm+X@;d>)IsI&M0SneoC>787OzeAGKHn=M05nIypVMe#}!f)yG&f;#o8>( zvtM@N%FNjwC)rc2CbL5E1iibr#~3JBD_Kxe{Cf2k(ty;c`@>E$%as)44M=DWsVHlK z>|~^6J!$6Xbm^sRN!DF0J(<=fuP##et+v3qR-`<}mCE}Jcfm=YsvX9Oog4R%iiewh zEW&wH8}t6o?qiBlkyJfU$JSakKG!PqqwU0$HV2ioshdnwjqT@)CkmCMZp4@Gn<8x@ z3kV2rO^`vfsLn_rK;VQi;Wt?L;1CLLBtr&wj@;@9W)v;R!+`4n%q|`1G6Wa_{e=lZ zQ$`Y6PXrhW97^lH>X58K;(K6yBUR^kUP@KZp#Tkd{z4Kzm#`ytF4SG>yxa2c@jUF{ z#fAk(iELlSehlB^HZ6rBV{_Ew(lW7#jt6nqk50Fahjf#`CM2st@ez@p;8(f;Fg@7g zL<+1)Wt3MKTZ$%)H5H9>?Q$ropoH|J3m6x3ea#f|X!)H(o`s7bh`=T063-|TUW9N; zo?UEddl%%0eDQnL5)a;nC%bU3zSX_j?H}upJlB}VLRu#~E~Bc)g!O1f==a3-^}h3- z(^SK92WcJ-f$){3FTJ=+%<l{b*>7<sm$wuq=D<~tMo8@u?1|fm_>iMH=@<;g42R<K z1A>;YC(`fpQY|pu)oZCqFiJd%ju$=T3eh$s3->q(7Rp1UBZD(1gqivm@t5DCf^RyG z?W}h=U1xWvblc)DYmy=wKHKIHN&_%^c)Zt{U&mq_W+LXSAD_VU8!6zp7VixQgCXPz z(!?k>;8-<(X}mdq6?ocYasY_1&ip2SNpeUIB=b9qtj%GYwci@U!bInPNIYso7ktd& zF&5ttSSbK1ZvLf&oMGHDT<One<p3#Yut$en4;@iixtMo#vCUAPO+}nay?|&0Vgsej zQ~a5Htm#&(a@4GP@eUY6k9%v%kBLX6S|zAFB(QHba7uPOglxvt)k4C!jMV`oELVd{ z&P=0$*0`+=D&PNjB+!!YumxFGer*GZnHCU9Kf~-sU~*&UX;7Mscn2s~Rmz+VN*7HT zlnp2l`o$R_@-F0rCe!&gNQr!wN{;!sC?c%w8ltXkZQs24<riP<e73jQ9+Xq>Bq9!| zm=Qjy_!}lexj`)Z4oP$dDWDsFrtgreEPg;tH+O^^9`Sw-u2S!h5a`Sfjp5;Q03{RD z2FoG><u#P#bt{S)*d2y&exUw&Sbe>|{tSC>u@zpSEwg)g3c81+<xPEW&KKIV1{=K3 zRIpHlVZ{L0I{Xk#R(}>tuPlkx^3z98SJxoS7{bNwQNg#En(6)sCo=qU3h^|2&2QUS ztoeBWdkfr6_;u$Lt1~`fqr&AYe6h>w^S&1QN)N%#FeL1%d?ntgc;Q~BsqKfg=*FQF zrqd-eI0j-dZ*5#ZgTxewf<lm{d$D_>@vb!Pj_vi4UZI*_{RVlj3(ht9Wg}#s1A4sy zqq0pF?F7z}D&%ymm)s>+ZRa`*mklpexlI^^wfo|w@vZIsUvdI|vA6$A!S-!t@4I#F zHUd%V8(dDtPq@%y`O)4Wf$s?rP~LZ;TFmJ{@WqDMwmjkH9&(G5@_}aA=$nn~J>lM) zZbbj~3G4&7OD7&R;gn6ypG|Y}^qX~1o@;h;rUi?iO&Bt=)h8^u2%KzlMNexyM@v*0 zMQl3P8}kq>4ZAqbqvM%Qw7lF9RYtz$-w8sV!HCq}Y+fa*SFB99F1Sa<i~bmwxRlL= z2sd~ydIrD(l|j=Zl|ca1i3}KSBdP@B#deS|HV#by1Cum_ipocrB2XONaJL_Vs)w5+ zr1Jneeog>>0!O64V~9$7$uJsy!Kcu}Y-m3-J!rG<LJzYMYCx*dgRBH+q6if;2^L8R z{A(lzf$D=0Lkr{+$iX0Qq=cHPW@5y3GY&9YyM|CYy6;zT!eREPQD}xWOQq)cWQVE; zJXxb;)UnAb_F%0p6p^q~JbvYD2&br1<Pxv0Oemzp3g0o3Ih5b@*h>U$gs|M)H7tJ0 z+bz?{^-o@93t${gyW~=g;C;Rvaw4M`@|UDg-%DdXo*-@r5QOOa1ZUbZ5ysfG07Q}D zn~Vm^b^A-$QAXv#msaQyn8`%7dRwwYK+rrFl1pPKC)aLsahAv{s^@qPv>Z}XmY)0l zmfEiG{Y7TgEXSrxB1(z#?~g3W<UhH=QDcLgBQ$(4NNzqF?)P`X&vP{ORQ7=XzYp!d z9)juH4w$w-Y)2s`$K!i&9e@J<3Lc_a9Q@t>7`oMI)cdh8;|TV=d(+A{v&%0=@X7g= z946ix;3%QDTbhaY`rK+;#-9kL?^#c_5t~4K0FJANPgfr=tusH<y{BsrxSHXFc^jcC zjE~I(qx;)f_;*E()2->%?mxKq%~$L}B*ujHpAaUd`kL1}C|=Yyza=aLeCx^6$4h^e zfWLJ(gnQ(anqd@K^)Qy{ZOD*fWfg@}d)D#AYC6is-sZNuBaan!)AOyl5diOa^H~M1 zFF11&QUpZFS47A{fduSYm2kbl?XrN%@}gPT7R7?2W|870mgiCT^+OnB(4(iJb1=nM za+$G#idwvvB3HlG`v>K*1upR*x+hYukMH%4U&D5?DqZkA!MrKLfHBW)MN3eW1q(0` zl!v}o4b9dH!hF&ID;tnWD#{~yj@&&$+gEF?Lvq0Gqvs<<J%kh)3DN*nvZV_H#zX); z%<VzdDm;ezC4M=Nwdvxm1}w=RLT5OJB$x|}x5ZHNCiD09GSSKHk`G7&Iv<>oA9vsM z4^9rC)AXRLBjyTJQ{16EMED82C)sLl7p9goC0$ciNN#!X@z4$M3D>^C5Z;M%6X@hd zb*;MjMQL6VZCU9coLk`7Vp$IWi_S}3+Fa5xFTpt-dffxMy=u+WyC~6l)gEEJhRQk_ zoI~Hp^^SqUHDZs~*54#sJ}co<4+t2;Y27Fx?Un<)jxZ6esHqJ~q04wUcP2<coPh7v z4&yi@N(kiz8<gUO*OKpp<wx|0uRBQMP!KDsI3h&;5Hqu(b$1AEVt^z+fm?dAwjw@i zV>4@V82IyEQ!XofI#>)H(rcg#>tT01)SDoRBL;GU<@s<&u1s3@{qf;Ef-?<<IMOqh zQnrFW>u&;nBU-GiDD#vwA_4H3POz0xhBiV_Wzc=mjc#g6|C(On6O+%2;ecL8f%W+f zgO$qwa^hOrg4baYL+nKO9MSs&cSYd>GJIW~4o_&&<eZFnNk)wQePlv{Ek5a}Y|TW6 z?S+6O>d%5M>Q+fbfdxmOhdTpgUN<KvoSXL#U?NAT5Uz5A{>xr<$wiFcJ&bo0!ndUg z=N{oshi<oWkz^t-Y}-Hr&uAf2bm`)Uei11PK}(qKDVPs9fHd5ncgjuPt6^Vh;%(UC z2?Ln3cbJ4)h@4sh%(p&c_f3#x@q{B`)f&RZasaHsbTN};EalT0)qF*&;c<34D*@!G zbd%4t&htCZvAHLzCR@%KL~;{mTINj75`D5{dj8oa$?OTObA@aGQ83r$$+%l*X6m$@ zgPpbI$(-zb%o#RFNN2`s&YErlu@XyOG%<!0$Kd50gD)S-0bR?iMmwGMF*6rVW<ly} zk^dBeSvYQ-u$uxjjoGx+)M;$vE~}p4ej3Z@U|P^AOp?sbBo=vZ7;IvPfXK<burwYI zclyvIXfkF(bInHAmDOZ7m1HG3lW?U1Ry*6m<D4~wX7tTdh0T}VjX@rDEbY}cJaLDI zgHxyUPy-qb%mlbJDyvs2L(v0+TDXhv4jgK5o8D%Q*F?On&h{zXFuO-bzW#Aqbwrmg zmjfs$!fcb`qbuX0pRr>n=IBe{@?MLEq))8SM38(p&*XZ|jMCDT)OIFe$u!s^uS&bv zv)YRWtGXP^+3P?H(5UTE3s>EBQWBS*hJ1j!kOWw<f;`q;RDg9FXl@HuWx9m0fm$1# zTWo_V4lda5$W%mL%limQVmj!CR>PKpOgybo>^i12=XS3dVeB1c?U_*^#WeRjvVESp z#bmRst6;;Z9n5FC3758I&o~jMwq?&iuG0prD^JCzcv`EQ+z;T2s1XIW$jB$6KioL* zi9diqQA^KalI_h3CwqrG)P>>Z)!D>Wtn)=UsR-4tRX4u43||_n8m%v!etXCbx`ZNB zSiEkwZ)m{j1E}@ziQ)DPZ8c#t-PUO*Z&jR#Y9Bl?%o@UnQAIWC-W<VHwA(?%KH2vm zwn+fmxZ^T5_Td?9H({)C%iKy9s~$7(&us`Pkt9RLJWZSx=s}=HWgjt+jFEh%w0Rh^ ze44qb1gbiSm^LTHr<42a{OO%cYEyxx{Sh}_5E#(aL2l;SVK;lFT&|ncI)pb+5?d#& zHmWYUI0fL+14MN?7k8@pU(QF)Nv*5XCguTyHfNyBFwnFEOw=r+t@ktIkkh^<VHES_ z;xwXlhOxM^bcUI$_cP;I(!QpQMK#?(b*gZ+(4A>xwXg&#IKgp=QJmAI<x>C>d+D0* zq)R(eiw=k8^@7zLEl#3&Mbi_mR#C#5V|;GK2+J#GZZ+8E#bnjFBVvN>v<x{}Y;@Rq z?@mBK@EVsK(gGNx+>w^+Mw`X3BkKnwkec~9%?)M}6J2eM5arfDit`!_Ek^`rgQ2C7 z78sIwUp4o1*v4qI>LN@V3@R{RYdjI;g}|zc$p4JCc5=j!AZl-Mk3ong-GOLrq@Ob# z-9CI<9q9#=R6PlyL4;0drON{9u~oIv<HnN(PD9slY{V+gS!Fahfe`MuaPEbH5BnT( z+?^9ZU@|fQnl*ldw&R6ypOT|TwJViUA;DA{<MjJmY4oi&4GkeI^;rJJEY7Tmoy|UO z|MF0Y?ZF|_T9%l$@;rUESRr|U5(sq;FsX%*^lB0~5?4psv*L74`#r=BC{pLdHrcL0 z+TDG{%mb;-HflLmhUP;=0nC<=gksjzQ}>uwH>UzMG=Jc!mw5-JAR;7^Dj+s5B7W_= zLAy=J5LlBd$&5~z#wn(4(ktj9(Gm@7t~4hnYQ#IWP61qEw*Z8eBMwNz$1Ue8wF$Dl zf9nh_=_H$FG@qmDuT(U*&lNA3VvG$eYQ!^<v7Ep}k{hyav`F)0?RK?BY9JmtKU)cq zOBHMwpg_5r9M4=*nuG}PARFK*Ig+B?!pGe#768#xKYQt@e_d$3Wf0*#Wo`H|N#du& z4rnS{C*2rjk#2E|N~h(vb8<T=u{_rvpfJjSBp8|C_!h)Yc^Oq+WVD@-UbgfaWXZEq zHAMh=bbt+C$|*bs#-_KAV;aPf#MrS{w5FtQ?44qhiBM!5(NV49<SMEK*^mlk)L1sb zG~~Ce{^7QgccTpwxe(bAv2)xDu1F9hIJR*6(%(S_H*OH+fSeI9t@#G00*VNn=G}*j z0uJ-`yCcNyg&#ibS9)1q&XS4?h7k~nSwi?~Q>kSNLBY=Wr<;p7ggDCpW&H)9KL)Gp zhgD8#F&!q3a1DwUUx*T*iCxO*Wz`d0Lz03*a4P_2OCFjY4<Ylh`seT@v?QW6ArVH? z%4X#@*dbu8(IKOR*NQhFP?4qombzRj#D%lTq|Iy1WaV91SoB%=6EvT<6IW`LNk<1O zj@|<D^mn$G2;@wVK*67<5-M5UAIjnn+jJ^R?LyUL+39LSv$9MY@<Vk2;cb{sl4P77 ziY}ci4zP(x6VWL2B3uxrS1+9E&mfM==>?sWesH%5w_{;M>oJGZB^zc2SUcf5lyL*< zvW(+vLGM#>v{USoVhKUeqIBCj8Ownp+tI9jh)ANB%HpDW(5<ZhZtFMStUOrP&;^De zfk%SY{Z^do`iR|CyL{Y^1kQ!1H_0R@X_qLE=t8Kb!9zJ9bA*9c(!J`PU<`EKzjqG- zq^(Y>El0^^&4(HHrngV}gI$J+3c=~LPD1jqyP;Y^@!WyPeu8}9GnFb3N+q8_UgE3- z{~>HMeDJC7(e2<hG-&Q>)K_XeWGD$iwO7+nPY6xx>KQvkGj=i2iJ)3$G>bUtXmb1l zt_>M?vZ_SF_FB!#jf7Gc+hW6JHs#NN#BvV*Tcm>!o7O~jY2}B^P6*O1M@GXkTTxO$ zY%okBCIPc8bD*A)xYIrAcfrcQV)qp;S8(GO#7K%-3U=snVMm|`wlE7SaVJNdX0BoE zUUR>!v8B<x!V0;0rp6M<8d6Bl4%WNFlBjo$H?PXUW#%g`89JXeZhq?eJC9f0@6Z#g za_Y!B`F_>drKF6&2EiO>M`tbeAkMQv?fu$Gol4wLI}#Mf(auzJ!%=^q-jt!4;xLib zlU@VBCEv14nA>I$%PM8lBD@;B5}{4e)kxQzrbgJ1AAwR1(@i0So7cO2Ef7TtWgGrC zM<FaOyKKnJDTZ2UKOroy!%uLD8CKH5Vq8fcw2go*q@#G$JKUEn$+@!SzmRhYlVL7{ z^u)3uD&5I)s|=5IkLefFrqlI}-KKvs*$KD?M%WahIhZ561L?sIMkWo3Z6^ptE-^nA ztalO)wi-KWo-DSn9LjI$U-Q!fO}b)502`*ZQFeGou_kFnW4x<n&L^Z`RA%Ejyx7nU zTLcAx!8JuK?1l7W4Yc@+idk|dq1uK9RRTG5H96z@5K%Ku4h}nIo=%6KpGCcp55=uN zX<7eX)FCZ?bJSL0;!K<g+@jlwpys{CUx}SUHB?dYk=Lcft+Nbg7M_z^yv%qtFj6GP z*tCIHOgZY8ayC}BD%r-J9hQ6iS`BA((f?o>R*#K@utJ=GcnGeID7^0G9!^UdHDT-l zRADLflriG(A!m>ixdQ_=V}g<o<wm7=`_5s}HBoA+P)e!hFoyT(>#jK$83jsUy$P+^ zou0*@BRS>jV(3IqZRw7wHSvOv+y=tP<)&f&STC-`*<iCXz!EOooDZN-o%2yZ72cf( zG`Yib4w&>hQvpnJAt*=CuBO&KM?ZEOs^}=aLlk>by3VP)^qidFI1JQEK&^t(jb0Ff zqdSuL8-ZaY83eBR(+pftqTi6Hi4;GBy2osfkPE0RD=B`vQ%xKYX$!%=^d=pb7bN#X z%z|DQCqYTYcq+|xKJ6iq25d{#_Vhg$n53Zz%Xzq1RYL8)5imh!EiVKk5fV^Bk?FK6 zE{X8SRTc;BneAYcfi|fy0aXkjJfSXxcq1wsJPCkLcM}*F$c$2-sCB7gvlZv?d&IHn z4Z252huua!C6QQLjxZ<%I3VSrQR)@s<CC*8d6}Ywy@sruv-V5!xDXKc*w2b;8!?VI z22IPa(WYrboN~Dx3cyq}o01aw6w+6&OvNx^T#LonA$M627qiU!(unp3RE2TC_M$0P zgL#JV%e1&d*PjD|V0}{WvVU>}C4OxQi4#Ew*kg=NXT?q<**=yg;I1d1lFR6XSO4tf zqUg}9U}x-6nE43F<-?r2z>tkk<dooPiLoK2S+%*gzPj~n>HgNE2M^Z^P(Yez1S9kw zIVTqbc7A)tW_`Ql!|<`;u!{F9VQu?_rsWj;JdB(f9hz1`6}NEVpR)F4Du-WCz6~T^ zvKhN{?Gg}nsoJ;%FfTo?F4<TYKO0}V6k;}*CY7$<bU8?x@dnB&;f8irdQzv=C6l^~ zUyf@KSaW^}IcwBGnASj0yNV&q4Aiwtf#(+&nt=>`oF7tE)N(AJ8^r3;f$(t?P7~#? zz(^xTv!)seHt1Q2fxT@zf<xW?9?zsNzP;4h=q~(zb8}(q`KOmVcNRA{7dspO;u3yb zzH{mOeiAlojy^}*h*XDqp)>l}U}w{--Qy7DN!MbSC#bt|_qe!-EzgwuR^H+U(-amb z;#`Z65*1f8&|qj?w^dL+(j%0F!({~vHq|V0j_m_+JHW<)UZ-@coitXA0xWjfFap<p zyvyrJ_&KSV?ZSvjgV`(GoD5<N1#?L<&c$lP5wKU{ChO0kW5GC}@8ef7vS0!>v2ow0 zhRr*VTTUGvB`&JgMlWGvbi$I(vBL#DjBU>hKO(W=p;)Dd&nMfGaz<~SNTLneckI?n z09xP~2Lqr5@jd7sbrLd#t%=6SlAwxJ_;r7GqVAm%SlwtCa`kCnv|WuZ<{^5qiuT@U zC|@(Razv>vs-uy80&$FW0{J~r#s-*R4^yeeMK5gh?~hZPW1Kx<OleT7F`Ks6kS8rD z5+GtTQL(gMacpzXoy+YJ7B}q!yPc#*coXFv##U`Q-i@+8#xFl#sMg2b(Mz7uAiOTE z@Rm{u1{9_Ufg36gGbQk<2bVc(q*RH)yXLKh7^xvNZys_c@a`52#2!O@hIrus7JA;| zVp>h&WtU;0KgOKeK1V#?yY3nQV#s35Gm>+~Fy*}i;D20gu7Jr&HcR^meY8(^p|>Kk z-I6+oNVZx+`M>ntNhfe~c`zKGAOl&f)Z)ey8l{F1erOM7>#E<;a!^IH-$edx99fDj zRRC77xiFh}ax-pd{<53$KZ>3+iXI-@pDF3WLyxq)sW!y$`}`5f3S;Cs8uA2no0>V> zf4);o!^6EkEm=6Md>`$-LmLuC-9vuMkC2_h;(%B3wEF6VK|RE-Db5#v<9YjDAP9J` zwtoB?A&3sEd${ae-FnII+xS|BC)2=W){hTD4On3X$se1TN&JZ>#4m(vCC<xvRRQkn z#I-sI!D@i}Se=40+)O=7LO;>7A%hAkU0m#qce+PC$QX(Ec@O)kF;25ybduzM(20FW znH6r%4hAUN9Jiw6!Aqr!?0YVSD5^xwi-jiV6O<hl%)oKuP<5c(!|(MHys&r`<Pb4h zkYF5!2Gi{T<AdSe+6$zw*f~MZiC!92LqGO1zuPEC385SVMOU@fLl4Jf0^BWzkCzyq z@?}xLs_$#qOG6Gl={O*;aG|I%UHueh0zg&gv^TzXIJ|u8nm|@<+yXmrK@@2H`||)X z@adC^%Y&%Q>w^eoSK4vUK9m>3{!Y)yNZi$H)Brmbh`)2WVTe0YT~04zHO#pRxGahV zLE~Q-2<XW7IP+IHH8#S8M6^cg1L9bK;#pjqY1lxg-EFYAhNe-NH$ZKD<XDny8);;B z?=;e<KbbJ2vrl9Tr{nUG=Wc-=HNi&8G7iYus5P77_cV!STxn;v8A!Sf6S$vBqJ*)< zX8SpBXZepA@nKaPhWkN5cN$KJIMPuF@Fu<k19}(b(ui>sv7kV3&sQ*?syfO^&%|^l zin7Tq_v8&7O0WyHu;f~Zvuu!fAVU*GwG5RJ&QMww7+Vi#7<|W?u%e2icUp@jVqW`F zT+cyWDD8scVa;96R0`2tTG5NRd5>UwNf%bmT0lRpIWlB}d<dc*TO^Q@n04n6=RMMn z?^lI%bgb4qWQ8=Gq0)CxL0>5s;x?Nv(J=q5rb5M;3Np}&m(J6*t%pmGS04SY#DVQ~ z=EDNEd^{R_`rqBU=8G7QBoC|b`T<?W<J*MB<5-*9ykD#JaT|5UZIm#WCfn(ag1Zo% zf_QE$TXu<$N#Au<#u1*6Il01y{rtwA*t)9aq5HZbzUFt@6$Y4=5Hr!^3n6e4l9U2q zK&|g5d(We?c8FFxcf!|dPAlUn#4Ytp<DWzbeRV!K)Z+X}NQE2voGD09DDBcD0cbVN zN!C3a9`b^B5;>`ck`k1}>#PWdmI{g|2nEI7KbpSIWcoU@k>Wl!d87Ujj9;7aYv7A> zm<3`ho4-PQ(fIS-+M>l5sj=T%d+X48-WP0tbuf6Rrb4Lt2{|^;Jh7_Tn&~N-P?Nvw zlwE4EK;ByyV;%?<8|hsk41`D+ZvQp5UND#*%2gF+NLSsB@n<tD`>%T4!-a>V?&1IY z_d~S4)<1xe0;?{98SEV2{p-CkA6(rV-A)X$5pgPXf~7=%)&=uj+?T0htuV5U=O$?K z8yQg9oxr(83~9v*%W7)DZ86uvGK~1I@VTEqeshf7kp?PGsR*Wph1;>%n}dNB%Lt?> z_19n$E0*(1QSN~G*4SsA6M{*jrot+owsCO+F*<Z2smEI=;d;Q0CBJ~=nLXh+*|Yu2 zCvZp6iHFao1f07fOSb8&`bri8m-wGlxSG7h{l%iB=>mB$$p>i3>KvaQA+jzmu618q z9j|&<+|b5VTf)*9xlkkfTJNB`BvkU0_zp@L+r4&${f?n*PCsW$0&9miAT~eV?Tz3T zg@n$A3~>|kL}l{|xjYlXdJbJWKmYN~SDwQwq3aE=u;HyWI0i(&zBZgDNnpP@3?yQ6 zULlzclAcE3VqfV7A}Y`c;{g?Bikkv-+;k+h7jB1%in|S;5FdHA@yN6lWm+B<#?D<^ z3)E)XzCdXYo9{se?p6+P&yFii5{c#lmpv^qB^H3CK`BA(L-Bb;NeZJrt+D$A>v19P zuoY7cOGf)v#|%RAZBGQic1PM*dGLj19?B`lR8O;pe8sU3_rU$QnL6WU>dacf2T?U* zqq)m)ID5Izu;O-0dd%d`qC$Wr<v_huBW69U52<5*_zyq)!$1BHKm0@W!+-e4zy0AK ze)z9H{2xF3-#`3cKm0#G{BJ+}pa1wjSGP_Mj{2kV%hUYCCe*)=TPRpo`v@04!U4}N ze!{a@e*OHj?YvTUkSrFN@~jyCstk#1!QtSJs?6%vkU5+~^nXvCXaE&$jAJNGzUk#_ zc}-&ZmBSf|<2+bmZZ$UkT?verZfd$#7_mu^PBjkg)3P-$us%Fm?eD*U2_Cu{42hEp zKJM?%QtVN0Z+dfRYqoyxAxz2e;4Ecl0aII@71Ei?0h27JEzg1{z&U$iLBN#aFM3@> zf?n?*4|*!<IiZ?N76*dAKms?(Gy4nES$?^V1Pq>Zwxo}}A<i)0Q(Mf3{<XlCfR!J% zmEE%nd_Q9OOXHRzNSktuldxElr;BA-O-2{X)LVlnSf`2$RnQ&MS69CJdR-+#qNczC z#Gu(CI3)Lj1Q5N#Pysmag_EIVf42hX*IuA|Ka0{STurxjNnWL%LR0L8xwJrW#ue4d zT=sY7*I~}Hiki+stawz<v8j~1H`x`CL~~Tv#iUazkjYO)AJyU+bRsdJrEr`FwX@l* zo+Y>~5t%}|aJx2`nkpw05k)`tPb08lqzzC0f(<zTKH)xlw}+jz{`%7&|L~_j{;RY6 z_n*&Fc$SvW-Qd6WLENZT*6ux#5y?L{D-lESLHzcoKm2XAbb=%<qxh`)(;xrNoBGoq z|NR-q_g~Ifekw}N-Qa(UgZR7Z=Rg1X%^M3}{A}UI^@X2S9QOS_{84(y^mNeMJxxZh zFA-U!S1k>&8ut+ztIBc0=6;IS7Ovk!bJwND5|lE;G(r@y_1D8{8OdOvt?`e2QAALC zyWih=**nDZ48>^f%j*lD-$Z*~{M?$O6nF&M^=tsE&>y5dHutNm)vElrJ{-L4<A|nc z?q}B*et!MtPe1#7;l{$33LQLf(BvWifsfs{{O1XB2I@<=?!D*&NMsTO*adX|=8O~i z_h&3Wl>pA&;J<YO;OSFja({X^l`ZzLdG`wW|8>wlquMzRD*@~>R5209)c3c2(K#W2 z<#>W8cDST0oy1L}ZSJGAYSKNqcW2vCc-N{mD4}!KKM&t)4W#4NW}C&RE4e>PAqti% z#3(uMy$jMCE!=W$sn^C%=Wg)788Q0r{`7}`S^w{5{gFKRuPx6TnwYKRc^mxWe{_LF zlKZ$4v=K0#|5>aAzcoX_dtV1!+@5I_@Jb(G4UiqcRQ>sG-vS9vTtQ**Oz}1CdTniq ztKkF&b=~eb0@_Q&^|eG&t&y@ob`7)Kce>SP!sg<^n=Y?Qgp;6rv(YB|n>pZS%SzE) zdTQZwHuqU7tnzKfJFSmDo1Y4CC~*A@WkaR5FXw9P^Z67Ff4+N*pUt*(*_wC#Or@t5 zK4){EXQ=(N-5C9}ji4Hzf7$r-+z-#$+!v18mJJba0Ww|l2%Ama5zmQ`)9?Iu*-Y7L znL@muUiBB(xkv4(q*L<^%qn@dIB8(+SdFsY8f>(<54?ArwsqqSZNX&gO;v2`0Ka!= zIajc5o}no*=vrfJYD6o1+Sq5aHU=Ql#t37rvCn61Y&)9U37lG->+OAUw)O(vti1wn zU!JWsn%M<&)>=8EKb^HXfDzh4gM_kd>t|EjvivwkX$F!|hqSdV2u&yUXY*;BS1M$3 zMmA&Kh(Z2p1qilWZsMJHGRltq0bcJeP-DHj>+Rhsr_I)xkeGEB>9yY7=k48LbV{gs zk71Olk-#3d8b@3z(99K$A~K+u%+cl~djO<mzXhWB#9@q2bcjVUeVDbSk4R6kE?UzE z!AO&niP~xs8xCHh(R)fWO>fg_n8nf~7>NggDqL%Z9WRB6CA>r`4fzJ_q~d@!DUDx~ z3JdT_arxa^0gYu94(xYp1w~s{M<-=+KUysrh*p|37Oj$^O6%}RD|l!yt%2c8EN*k5 zT_s3kC4DIOTxMtn9oJe3&!iEV|5m^OiD0nSNb=NSDNvoVw6@=D_p^&Il@p@KOF90D z2Wt|&LkiT6)u<G_y^ClNFX^<loE(0`+vR&Xmcw(&2p?Oa#(|p)u*vU201r;R)mE7U z-w0laOq&np*d4G8x0nq!*Axc}w`=f8em!gp*}|DW+MKCmBV9+P53v-vvmKgc1D||q z=3SF+Tjsq5#M)`u%)9**ys1u38@88E0S$X|f0&5Frgz{Wj<4yJutDQXRBC^z95(HJ zTfbV{WlRk$RBL@#6E?NlD1io|2xuxGfX5;eO&RK}pr_?HHpiXxHsX|-nyL>JJ_eC7 zix(x`Ivo_nxcrrV3sFF(EIo<5XCLH@99TfvDMyn6ws5<70L>DZ@ma)m;XO@8@ZQK~ zB0MbtPo^Q1@i_<&&OQO7*+w-x_5&<4pgxpsA(1t@k^~6pd=Ez!bK-qxW<ckeYfL!} z*~`hZkrhoQC42r3bF(wk$j>xK8ECUjRaRxvj7h#nKcIXM+@e<Mhav;REU6J(AGXX+ zT7<Kb{yzI`oMBY6%|te=atOJcszcr^qf*zZiZ>G8iA&%EM3*lns1u(h{wU!Tr>f2V z;g-aR!Zl>AbEVn{ZeomEnuIYGud(F!y{GG6<D!5Dt0=F-MwhHsPycy)6CAW;+|`3O zM;c;;9u+W#b=+%B!SP=PjsGMtm#6x25fLOP8|>L>Y36wX>L)JjIK%N-DrY9ApbS(c zo(2babwW%WBqcOcLe6g$8rXvJ=5-xUDz?anv-x+F?wW!5Rj9OVCv2sxfy5cpiqj{o z0XGjzhtFAYQ}YykAGoPQqqF2goQ#_qNVDSR;}zBqdxcfkGdLF4<7|b?j=d_BvRjV` zbAdfNeA!+|#3wP8Dy4hEr`r9-SuZB|9f8p0j8_}AJg+KQ$X2;#j(e9~SO6sCQ`^#% zNSn4h)jBpyxfFzgwVN0hH7Z1WAon#u>htuio^KJDF$T-6OXJ%cm&VU;UBef6P4mW> zG{H|DMDoPO*=BI4BLtTPyVdq!h|s=RpLn&fhLZH~=R1qSX#I@oHW-i#+qgus;LX-! zJeOu|<*<)%e|}~J-y>`xY0J34BNCGihXaHd?cz!xkgB%;OQf29Fn0aGp|8al_S`UX zvo-ukLiFmQ#bb>*M65-JY4TZ#bBbqvCzi!PC3&VR;2U9%e4YyDZ-0(P;I?pdVh;0Q zMGqbpFkw^7KKQ3WRyTOrEzpi(1;M2%y4&Le@ukG^9u(sc#AQgEkx@zLSq)|WTEgOn z;?<|fWTV)=Q+<vGZ!(hxaFM{1AjvTeutKekG^K<@mzVm_(O7}GnBmESAPa^!=K9Ys zH|KbAFvo%j!wHHPc`QPwNC%vaGPd719MX{vqf`;|j++M<F&z;E@~92caW>O9Ik;rX z=P52OjYU|bk|J%>#YN)~O`{5dt1MEn*S9)4fW+@*9jP*R5a%<MwGaoC0(zfV<2%=6 zi*+}HG&r^%f}}N&u0YygXQ1sT(&1!pug@^&^H;Azl@{^yHt3C#faL_S{~mejIBTFJ zh_N)2U`j{;VQ|2kq4w>ZhzziraB*eT-ZznhqeJo*X^OPK@K-8kAJ%bRW_B%wO`EAr z$ospws_Ps?kX_gLc&GG3-zi-=1a%>F1^!)njd%eobfjYppL0a~NZLx8F*R=KFa`mV zXrt5t8v2!^8P&OJI^4HIaKfniRdwricd*+ZUVYu$h8Ec0KP>NgcDKRiI4v@LG4|7_ z%|*x<w4jEHa7omIc*3zAg_Ii-!8AJ`;K)b%>BzqUSx7F(hHDZ;oebq27dQFhy!dg0 z@?ke9xSDg&J>1>2&vURvykXsD(g}C1l{#SshP8o#QDOb%DhF~Qx4ej(9o)i`>xB}^ zs>@io1QJVL7Sm<cJrAl?cSDG-rkL8dbk)3K>BG_>FcId7EyQ3jl|+FN<-Tk-?0+mf zj>Xu@g1`7H8*_~d%{4~Bf^HVtfCSPVML?x(6q=8B)2K4G6Y&Y4+FdefRKC3wb?@$= zj}PQ|F(_)foU%41xML+?80?R?pl5Wn@?|7Kl<2j{jV`Sv3WBc0`fq8#VUvo3M7$_y ziFb*?rx%1u#YJJW;cOUu5`Iv_Pe`;2eXX-Vt)5DYz<U9q|9l8<gEl0Jf6=f2(b$*{ zP3mYra$5ei@Bz3)1Eja<iK`y$Y;+P*n`tWq68;6ac}JGvU$}|s_Bw9$CX&aCZges_ zM7*<-9!$N;vcPEXh!(;M*jGpgHFZjk!Mn!o2-`F`X|-xACc*@lW0@9*2WX(y>`2l0 zJBFBvgNGG1=*CThClOq5vm_8D1Fk8lGuXPr{!(rv8=#D4!<d7-j_lLO4TwNeV-HTR ztHTB1$uzXg!rfg;VD2+^E5uFM=~W(t{EMsZ9o#H9z<IV<bne&}$-+npjpbYJ;t6&m zSHRhIf4?`{@;;e4dVYL*us1wB#kIl1@o><?2<Oo?KOXmRS$3CEeL9x~6J8JWjQ3kx zj~}dm{q+9UR)P#aPSuryYD6YLo2ii0VZ|l|P~-yD#z=;Nk~Aa4XT&Z@&zh_q;{6j~ zF(;(S7<5sRCVD6ryo}5KVq;Tf7LQxLMGO<TiyZFvo=c%pz5@?2okT%S1|<WIZ7z*Q z-P2Igc~UirAb~zAksnrxoJ9qEhj2ivCy1MW&<nksLrH!39`jwqw!R&8kB*ouy09>Y z73&<3YE#h1MJk$2TpymlHLah3WxG}cq^=z_cmmaKB`4(PRk}k2qj!yfw1hn{;vF4h z(Ov2zK*#W8w~I(f-K*XHvHr++$Dw0n#H_x;%7a_wh%k5yDZsifyRZAdM<At^8s`qS z6t>X)S6ES*=m9~2*B(4uT3uRyy1KRg^chwpvu}H_rG`RVIIdoQ`WR(z=(62b_VLPn z6uLRNP-yJ4rgHb5uHJvJy7ly%^|h7z58A-9QY%laPyrW|<`97=?*u2aA)b!DNh}Ex zS_^s^>jw8n(>8qnV{ZYNTe52nz>}!0HeV%G9gj(XE4<Ycjv92!!@<b`GMLa>k2s`V z<Yn~Lzkso~x5s0nS3RvFS=!QW6NsOj9Bjk3gT2{~G+#7q3#INI`=yhB<3uwSKi$*r z#x=-g=UMQ2wgd+}4CP3qxdE9S4If73vbJfJBeUkJvXN}=QHL$fwxH;nF%Se*%P?dU z;Hb|qG_{}FRD_W$9FPsQBFStuY~dqTZa2iKwi&W?w|c5*^AmbTLN(Ak^zEGTO3f$T zm=|;D5%bH<n5jKFsc7C}QR*CV3T4Bh$1?_7xl_+xq6z)Y#PvF59&MYgCEM1pzn4;- zdF)r{G46R+YHBxjwPNvMpgrB(AczYB@8&e40U^uW!5|Ik<vzEzQZ3u0UD1erQpC=6 zOFVrjG-SxL?JuWc%wg&*)G%S&U@4MdqS`){IJJ(EK=!8eMlzfQWzeE0q3oXuKg7FQ z3Ysug+c?`$o61I#jzoB-eYTRvEL-f_j0x=?Q{BV$O-yWUiu80p&d_&iRn(ok9PjIF zb6;NJw9;ZsDo6+>bKJ!~+@`ghcVY3SDG!0^ojuGNA!Xlc4e+dq2n7J7sf-I7>~Qd^ zClFY@h+&%sDLRRWWfy%iV!lXK8C%dZ69tFiIO*25!6{g<mrY=?WWrSHw*dCfK5x37 z>nvdLr|p6&$O_hrH*WZ8o=+_(HDPy4s)@bv15L8vTn@5mnkS?sE36=nw}|-HFb_-A z>mDu%LVMTA(|j8HgW)#PGfd*BGn34+fYXf0QrhK&Gy#(g@T91WMA^a+N^&qO9bkz% zI5|)yhH76Ms@#ksJxpV89iC_|>cy*28=(m4yr$Y(4%NWd(yI8>sYPm@iTx*x78z2s zx1gch*n->ASqD7s*fE8`Ii6vNSb}};K(!?vVQ35DJ%sykOyQ0b40%|pMTR)Y))e(P zqEyb*IuU1aQA&wxDy?+i%tk9qhy^UJ#yl4j&oCxR5RymG`Toue{E#~pW5f#B>GhC1 zfx>wV&*}bNADXAYi+?dYIAVKE^97!QZidKXGdS)ej*6rThi@3#8~9>G)ZxC8*oq}^ z0dzP7x055h(W~}ThBHjDE98^Oy7|7LsC70|ssqa@PO#I!vDa5uFyd6BO-Tb$zt}9| zh(_~0I6*F3!adR^)2D^(NNfJ^aBv!v8)%Mz6GkkCWDs@4ag6JA`>_1;8Liz@!ChRG zR2eu}gLHz4efwm8i!Sq?Ubh(|c|P@0O;F%{P8wDgA*4w6Gf?}P<lNV48gPy`TR@HF zqm95qxXWo0&SShngivTiBD==7Oy_uk$B`mf!t;&m&uc2Fw@8uV-<y3Ib)krmdFcpB z8?wrcAcPL?GzGColST~#w!-Ju4hp-plZD#|{wht)Nh2-tX!aTM=1d?rK^BEA--@Wk zmy)%NX|=r$p-YZ*&Lm9F3cPk!C{-j90+EUfRp&k3ddmPfM)i}#w>Z<~M8r37Y(kg` z5fTSwFHr)uxma}Om*ird#4(0whrv@PC)sBB7{cf#--`)jDtL<k#(|`C)<RcH%;D1& z@XU`<R6b-Z!GYnZx1e?rU8>|wsZE|?Zn2&nlGJs2XI(A=MzB0I8Q$CHqdb~O@|39U zrW(H(o(y)m++t3A8KOccLjN`6#Ue==yk+-;$ZrB6NcrUSGns~*o{X*B;8cQNER{Qh zUKiOHRg?ghofBBwdqCpy5C<<Ife(o}b~BN4v;I@d(G1iw`(&$p?AWd+B)}nk7JTjS zkV~z&?2l0NOq6^k*uIXY@lK3}!dUf_@ABx<p+Qi&QD==02W4{a=uA*1=6zbaJ}{Iq zGH^#PDa3e#=-u*SH^!o{sn5zMrvPU{?5Y@WA*jR#1X-r4RVl8DfP}v9A^&{3kpGpx z{cXeZPt$h3E5hb}*Ag`MyL#a9@6vY4e#+mo!;{D7`>rMOH=dV4zcYBgD}sIl{>G5s z-_@gim+fRh?SLQbgX*!qzpID&&e|#QQU0C*Kg~`wDw=DytvLzKf@2W)(ZIVQ*F91} zDw>L^njva-P0mBUrDrXqK>kJDEK^pY_cEvr^ccGK_06r1XLM!5Y(!K^-m6Gd;zT26 z5&o5Z2}o?8V!F7pqctp>Gv0^g602p7inf|;fm`7I;YlJhy<L9B6)b&9bebz0`jy)v zle!3F4>}*KL|KwH{e9INjC-zGV*TkqC!$>w@S!c^jGOzB*!1=1vWtb?VSLm*#2)rG zPJAapb?q9$%@2<x^Bs2Q*mGiMDT4W;@_Y&wQ6Z4E%mK?rSUAaa>}nZet@#|w@mFJ) z(hbG9XslZYl9JBlwr&J*{oGlDIq2f9r%?s6_d%7>v)6EJD!QSk_409kH5#5Aky)(r z_DO%RD@3;nCaPB{v?a_E%%J0M^@bN{NZU)mo9mBNBS0U)cQCMSL@dfZL_#QT{US7R z`AQ1HMboteSrsok?1=^ui$_Kb(D|-RU@a*tz`N%A23`JY=a<AF|LPrh`(@KCEesK) z9ers5R#QP14zQ3)_7FR;g}HOwiCPd5z=r&<T}DJ&^|H>oHI@yCX$9NpRMZB{XQ+@$ za_@$pX9erRB&40Sv4~`vMZ&KDv`_!pM;qFLueToR<*qTRxGgSbPt6ww+#cvWnBfxw z#}<!*sj-+GL5L7l&J%8Vs9{H_gNv(bGl9fTr&64@T|*N|6&LLqD7A&eBH#ZwFdWA_ zjjICzw9iEgPEEfFVs=){io6dCO{62P(qLq#p_UR#5nd=+1Dw|zmqCB&tD8#=hb62Z zfemuF@?JsS)=*w5fxZc_Y$cCKjo(V>0^K7Z@L(_HVRb(XC`vYr;aLPN*@iaY%{rx_ z;_&1sm7W<mx-><mQ>YWS9^b&l<<y+eAeMLtj7;Na-pr+20{`xNwcK4S9Br%epDhS- zbVsW_c%eijoc)q3Euzq&luEtau%M{3m!%Pe>)7?`mso0PGJ$0W<qUm=Us=umsAiie zDHC$gNJfd`6z5dqAu%Q({P<&K!g0Z3H;t(Z%W`AwY}~Zp%DJ(zG}a+ZQiaw!0YDFJ z*a%|UY7NMSc@Xr?ah^&Da4Ha_4Cs4cL1ppvAOuZ>FRJF9)IC!iGD-z7H-1J9H~zey z|NQ)Uvd@TnixO7xIHgwgo?$JZxsd~RGynP7%&-Q>*AEZ!&vO`Wlq0%P2f84(cbMv; zv!CX$e3}3JB7-DI=DCCJ=;g@~x!0*IGS{92L9nw&x*WSNNp*|g!1WUCK?{^L>@8o# zIt$mOEnL#<b$N3yrEF!)M$gw^TTQr~t6I{oSzncpR0=IrH=q~J1?J$&Wjqtd6(tVE z2W4L+7w|+H*2W=ELp%b#MYgyoXO?zpaB*?eI~cy|-S6!TA@_M9$zn<I26hmP&1a|J zPvBV(#6_n>g>V$Crcjl{D5wCYX~+|dw18;%DzGT~kaT3X89}3e0IwRrt3+W9E>xe_ zM5J_^Rww<ic0@9Z@Xtoq0-d9C0s?UsJ%-!s;qe}h6=HT)T<x0A&YiWp&>{Q_)>*n8 zo!+;{bCAX@nuB0sp#XlN`iub{G;&2g(nwM=W@&2exH}>`5diNPn^Odg5MB#t)zRqB zE3n4oEpmo*dn)w3d9aP+_+xm8Z}kq591ll4-ryBmzMF&O2|R(zH+8V&#sLBs#3l+N zbYhb+_zwlOfU{NobVdaN0J|euAyF(xEJ@sqf(@=V)>EV@YCkoOXof4uxHvbap*SN- zP^7_OJZ7`^QBhE>L;0`6fI14kbD*}|pc8tIBloANX@nD%Iko>pWw@@-<@YV*2uNIM zWXx~F$XziaPnSASi$Z0GY6;7|=#R}aQg**3N>o|M0g9Rpg|Vw9HyBAM{Q9i*POmH0 zdNMK^zCME*{T^)o6Q>4xw)>F)uo%{cj#MtDgBra@(;Ihr`UbNgMuKvZ(9p8Qa1HaM zT75|fO}I|j(bmI6IfWAsAl7Eo?wA%IbaAl=>?up9AAOE5Bi4@H%%SW6S6ZMfUFX&P zLJj)*q+Bs&Z7IhNy<GPTbN#ZsNT>t}&=`zb4GX}a?_0G;Fk;buGAuUNE|kvNPn_7Y zi@;@5;a4|O-xM-Z74c5(v>%LE1p~PiE4wn4KrmIN(U@mcWz|}RmGT(}3THm}mmwM` zmlx-{iTpt7&KN>umCus9tS3l>2+*e`7fAm=3E&Q@A5W0xExeInSzQhTeN0vy<9aF- zDIK()l<;kNL{i--NfoCeK#ur9DkwN{p;P4Ea4;CYrrU)v3A9RH(SoO*+|lBp%Vk3- z2ZF!ASDPbVTz2+D9Jd=FZ*2xYB#e3i82IzDn8Obd7I0aps|1uis1s`SX+RgGftC(S ziykptW<L{E@z_zaVPqeX4&yf<i3&f+sCqp-oIl3DqnGgS93J&Xa9b1_69>_S?Ni)u zRC1t`Xb<O<FuUL^oFT%9S0ly1YKc-rjlDDHx)8-!lZM1;E%c)jRS`|xrwn>f-dT%c zP!yNrk?Q*L6jS3}Hglus4spGWD5nRzPjXVVoixKFl>pb4=yrW2+j*76%$Ncz2}UJj zbiF2@*@z(5n1Q7I;};Q6#dH5zSL&6>T>k=cbY;XgNwh1$dx9LWfkt)5?1nu+9L6%H zX*GyBZ7Q}C+22Dkb6R5UXBNOZ>92h<*j2?7Re~t&xF!>tIRncHA4|%+a@ufk@nons zsCMt2u6OqV&V^05J@0Q}_qX$+Gk@)0-0Ey@zW($(`S+I__<rU2r@y#!`IF1HuYP)K zbMspInkD7ko!fKQ;M=QI8%NDalmV6fmVmLKR8|ZUOXVn40AXZ~<h&d2O8j4ypOrYY zc;og_dOa2_Y`!=?KH8E)(yhNa>5Wdca*Ag84xBwb;`SQWHE#d#|1bP<Ae&47@&V1? znrCD_c8C3&1Y*3MtSeqI$}oQ-0tX|)e`H>vMs$1Y+HGt;3sa8Q@p3?<^PlXsq?W?% zMH1Tc+Wa(*Tli&Vx2@Bcvje%e|4X|<`HSuF^<03rv~<S7xO|<z)zV%AI`Yxxzf!(# zq*$={z0;)uV&0`T<Jd?|lCl-0Sy~-*5liM>=LM{mNf9bbl%*niuwt##qH9CZzLFi{ zvb#iLFHm0M-h;i35;DX};Ix0zqJOnIBuwz52HA;c0Vor;^2o#J*mQhoU#<StB1}-= zY-iVGnz{!~oCA*0;ZhG6T_mtLG`U(NBof;&<)t`zAphY41?NvjolS{fqz>mOg^xyx zMd+--d81HUF|&Hje(KE%w<XaeXmct<2kyoAH`P!Wr)%!yQ2biN4WDzFPo=t@|GIaI zSG3t;%J}0}*ywSRHBhg<Dg_y9B%8=R-0*n<O>;H)u7CrqW(10Zf#$a=mQc7S<K{7( z&KS72+6HyK1X+oPw%DC`d(Xo0d8we|v7wwGH>@}HCDYjyhcdEj2|TNF#;I}x0kRI% zD0UeYX_^R9V>viREvB1aHpV}aeiofffvDYSd48Eng6lu3H~O!-HWa4b7jL*_xgy@) z!P^W|3ZE_D9B*iJ;kJHVI@~33>Y9q4l)c*8M|4BSUczeLOJq5JLd;yCsMHlw@XAfw zm5LFHTi3{DslZ0-UCi|mN!->_*6U&ur=!vRA-fu}Gt8)d1H-cSoH*I|TyMP7<t;Td z#|VtWUFhU!9@5_Y#ek@dr)7w5yAw69wbw`8K3(kZb$4Elv6p`_4+VO&_a<#lD682# zO`4lVn89C@gbD~1YB;XVW8O&F^MU?VHFNR>0m8;+<r~H?fwVdL9NbJ#QG~QD(o}t@ zO9|F&nDve#18a|T(&RUhN+5E6Z{l1|lB_c}PB27m6V5XJCk<gd1;W^T9b1Ydw>x?h z{#hqHz9BGXxH9<Lz-DQYoIzYgI|lfYwd;6drB-7VU-D0RObPU5?{us8rawMba~|*s zmQL4$%hh+^VP8=%ZQvKh1F)^EsxV+|X)mGLhEJ>9fpFP!bc)47{T$I><67a(^0OKB zd^4@nSy5b*nR%D-SNvwmVW2Eo{(`yy7g_`%3qwqCLl#Wq*cID^$Qr;)P_~>g@T`fz zh(qzL1g#71YfD-%7jRueY03ee4zAynBW3_jlm%j#e<Uzl-qL}DNp7W$IF`nGlYBO{ zXJr`~S#W<o|Ik|aYs%yklFn(rhl^DK&BfXmsp9*|T4d15S811!8&8-B7)1q!w*itl z*HuxDs+QT{H~UZz={dA@JoJmCI*EmP>dRHLdvl=KKop(JH1cRuAdWGXreugBarNa3 z^^q=V@Y7E-h;u|k?ZdS^xswNisChw!K}RgILqB#%fP%EY{w_VMTUhkJYUtUxx?wa5 zU9wdp-*8a8OxR^0DOEk>5tU0UO>QICj<6Mw%asg_j?2US-KEj~$pIpngkXbKu4PM? zDcZ>f#8WBAnz^WVF{P!1o>Km!j7YdVGARe60(&M^nzIzWBSdcz_bU0;W=U5Y5cq)C z09jI0;tL(#N*!+hH4d<o$D0Qdoi(gzEDxi?7RY~14m5ehU&v3g>kM~TgTWA&Sq0#5 zn^iY+%hDC%g$t+>LFcei0Aq-ITJ$eQXb?db$|fV~O7aZesIT3Vmm#OjMR+6S^Ovxj zz|@AsxG|x80I~7LMzba~cewosgdzJiwki5xtd*VRv2*^(n#~$mK2as16@9NDW?KCe zeZE~sKZACjfp&fk)zwp)`lzi!@ad%FQp<;$Akak;RVAE*LQi$%-hnyjgn1IS{IFEW zhr<?)+sd`{knmlqummx^jK=7GgI-~msVlBNt;??FgGa;!Rcr&yCf%mto*d$qYwRak z02~)No$@JU`wq76IHy4f&)36h7qL?h$FRX7*p7;*4o63M_=bmH{HD&L-X=dYHIB=j zs;B0K0&kR^lhGKV4?FgPl28G)^Dx6NQ1hH_7^$>t7)F$MX+hCOk_WDGC6Ah9jleIl zAON^cQVIZ@fu|5>Pp-VB2bQfk*eF_fK7lTz?+->4B8;5O<xo1oM>4iH)NqJm;Ay7) zIz{DA;;;Day-gp8H#t;%c}UykUPe73e2p5^xC}rh_eP9P1FdbSJG!7paIi#JyxxcP zG{={kfbtj&Erm=UYq4}TRSM^{O?47Dn(E#H^{TGrx+la5@0m5tY~vIN15uPZ=ZIKs zSe}U{;9fDQtFIsvlA@v}WlbCn#}aulLoe&{&m_V4Xwavhnu^e5h=74At+gc%Wwx3% z2!u#mY`S&BE&HZ`rk!EFjm<l!mrO%X6A&lZ4tAR+tP?nr*9D6$BlvAA$if6Tl^iK8 zhUe#FOg7&z2f6UYBpBuaNV)7pq{nZresek%E`3+3-5mLtW?+x?k!j$GamY3B2`cq6 z+v>>9is2TCv+_E_9G2o$5a$HNS&4u099lEFljRU{)QhO)V{(SXXRKY=<=fn%*QWOc zLVE}Q5of?Q5{o=61gZHogo70iUcZrnQ)D!)iIFHsYVlY6=EP!?a|ad;%w0-0wNo7D z*)#5*&@2~sd_Z!_N*-q}AeyfmMc{9lcBI51ORGSlq(bW@4gxhu^+u8?+a#iD?dDn} zE$<ChV(B9%tTVD}iuQzCzhVqtT~N|^)CfF_@lRpShD9vS8`bIty9rpIYZmb7$~yW< z<Z#1mNsSVfekdsJQQBzZ6v!!&w2)(u;vWzuX-4aGYp_nj+yIu`6mOJxbbQj}j5DEd zH9C0a*ppwSogl%V`kgU(VWV15EN~5og{+#S2?PRfMr`Iyv+O&YHgN}0geZiAlU?A3 zx9g#w*-&z~I$@Dykb;D*-ToeK57=XD+TG>OMqoa7;aA*#N4U7$Cv?Vs;*7^{F0-t! zmbqVcF946YIEEs+iwN;kI3}1E0apwW5SKPVO)an+iONS0#>wyTG|v5`dp+v>CDwz& za1cpE;SgadUrX*I_KMO{n7rJgPYN~ReT|rcjkB#LJ8M60<l8uX{N;ZUKz19$m~f4r z)YoLXpH!1Q&oS5YvU(a}vf59Nb>b%b(#2KG2bF$GS9*CO>B+nu6EF(0Pn+O(883@l zQw>JkvI>8L9mSo>NSP9y_e5Y~q0Y~IWf2iz*_~b=CV`}zYpVR`V!33|rjFyh77%cX zU8PYyT_Kz{W!{M{&3$^)dNXn=X5CDl3^vkChu(bq+vYdTPc2ieMHo~f!a}?ZqW(4n z9O1@Fm(4oRd9(R1TS+GSWy?&{FUKSa-H)Bjo%rAdm0mg_bh6F~#XPjA3v|)7v?URH z3Q$ck<Pc><L0sr)o7D`H;yF~oqHLp#PGIGon3e+WaEq%i#!?f24f7Efbvp;JnQ76F zydJQeC@196XtW4h!<unjRz6fUEmJU7NO>tD$V0gtL;kDo>N1P4O2ka0Dx*X1&oHYf zkcUv%^_Ljmk|Aesnj@GaC(ySvk#uYmKclY?tilM*9iklyw(34X?94kBV{!P^t{n`Z z-*orrE2ei~cn|?=lm#u&JTld8_qaPvVelvir5>mg(#WWo*7W$uP+k~~P>4rEEhF&Q zhC;iyAkzVVno<KfQTbQ+HeyeF+~29f8GD*A1k~QB&+6r}L2pcjBy5Gu5FUk>T{~kr zO^X?BAuI1HYtH|2{<6IOEi8b2C|lXf%3dO62-A|J*Zn)lT%S-8DDvQl8I>o3WQ8Wd zGYOnY(Ac|1u{nQfoC7Oz?5mSLRO^ZG#&VNDUYG>)G!#n1ggT2q0*Ev0ZV#D2zEjS& zPTkkdGyA7M{L4vz{pk;X>o^+?$Bd+H6!E7&{8#L#=l}GF|4~2wSN-@``thIj<A2hR z|6M=+pdbHB3G@9SQqd5{XN3HZ*4g9%{PFL!+bQGtqeAybh5V2IS}OhVKkCQ7)sMf| zkAI^d|4u*ty?*=`{rFGm;7n+4goHg*p32z)5+kqbxmEm)m&OftqNV)9V=hhXxuA>f zKB-iTL~4|l-*}VAae<EBEbI!l!&61REoCjsZbJeSh#hhLUE^(!LWYXoE9qBCbDoqg zwMO3=vPKk4aixn(v|jU6Cvz-sl6keZQd@IPWt&<*(}}sjuLs@mMxT^A_WPfFOo#c; zpAPf?WAAO(;yRLa(f_)NWd?6R7D#eW_w-;{HkOdhv;=BE_VfWYT|faff-0s8B+;_> z?d<1V$G)-izVVS?YptpRWOvVVM9)}NwQ^-fMn*)&S4N6I4%sK2OWbuktp3uKO3;5g z8Ju5S^+#{6dex&h@k@SR;r%<3-5Qf3l+-^6v0D{+7%*^CJzaga^6L5a-pcc}@7E#5 z=2$VrPSLo&tu41#zTew;xxKcrzJ+!>b4SON8vF8Jz{C?gbH<AKi_-Ppi<Ou1n)FXu zvb(jtx%YDA>E7nr_djf-s{<s}bce#+;TcLq{eVYO`XhhxeD&FOG2E<y;oxzUAifmV z@+Svegqu`}n?sJzv8LiG8)g_1F#R}*07Qk!;m}*jf~u3=(`E{P0%7d}brC&uY5{%= z(uj-8KELT+A=%G5K)gKr*;H{|hI)F<wFCtV;pV5_s>1<tQRJ4M%k%RA3Si{tV+|-| zNMcvtos$$A&%~bF1)1#9gN^!}M@LzTT9cgg8SdCZXy~;m_ti!X4RLT^3XBDMtBKcZ zq2Z_D0Q$L5gWW-1sZ-x`j>7ri3G+@Dss^DOjnUTSCsWTOwOAin<x_hK#M-Ca{w#<Q zw(^Fbvun}2eKX65N%tLHsWL?1@OeBQP8b|>I+hS$_k9Ps_&7y<e6QLM=g!SU2v_{5 z6|wU=Hy!Grr>6vq9owKb3?az`Ld31Nbkg^t4KhCqW@_2WQP{<kG||XuDiMB?`j**} zhK3#Xng(Eg0pYJ~Zm#@g@7db(ZCs`LYHM}xPpf~))+xcM8(1D838qvXAL${uW_%Qs zwqqofVkB@*u0hpDqw?<l8PJZ^!e}11aU2@Q+JSEopLC4=-alT)xW$#*`9((`|Ke%a zd;ZjYi+ilT8{nMTqc{A#kB`mT4(_TxhPpq(WoNMSk#OC3>GHFU%@-@%s>Af@bUc-P ze6IQ&cXsJ}pI4usp`Xri_jBqv+G?+l>}_PpdF!+VN(1c=Mry>gbX3iM-aYM{kGhA; ze;9qfz<%wmwvL<MxZ1n+VD~tkv%&Bx9Xa$f-S9;puJQQ2!y2*By~4FW*gB|{wT;}u z;&*HlI2~F1Xy`0{4ND?hZ+TyCc=|*ymu!0(W<RQNtWmvu+cEc6fHHLQ>KwkeZUekB z4?SO&l$K5f_uCF~T86{URd9>J&veR5AjUey;<-MXS=y)GIf=c13IYFS1El$Uc+&x< z$H2PG4<B&3ATEp<p>$pUaAbRH^{w_OaLNV6Nso$N9S8qi!PSJo1=Hn>C8`4)hKBbG z<xi|XOU@~Fi&W>;BX@%KBh)4HONWzErAi6Vcd132Cp-*U%o10gKR{gj8`GpiGXq`w zsO12qK5C59c<-^K!%LQ=!c%GnwoH6oyJO9^A)LhB@46$acF}wmohp6oy#Tp3Oz|A! z?aVDwQ0!8Np8J{qx$he&*DC7Ikv0N4Od$fnUv^<Q6rCrIO#=BPLiC<{QMN4MoI;D9 zdvOWd@}%<?8O9eC+|~H@WkO5>R6<hY@0kizqB;#!m}eqEl53uAiIQ2_QiaLXs3~G3 zf22Z$=q<YlsEx1cPqkNq<ii^7UO)mmdDQf1Tnni8S|M2)QGtsDNhT4CU_ildNdA7I zTUETA$6jpV1$#<rwvRRN4||B#cCOlireIgF1AdFEZknZo;3eG2-2$iB!OCbRdD|&4 z*Fxs!Tm?wb*f~Y2`yp;tB+$5tGIeq$45R~2fgI~cRyM2NZsa1*xr>x*-$YVz&*6F~ z44`k@&)Caa|3xCpabzT<3kTFsOTX4DMoJ@UCekJ>`O4v2-aTC``gq#x=sUGLY`DOF z!Ntc|VN`z?=fqX_0=KB)y0r02oeuAr7QK<xdF>uvuXeO@tu6Od3mCag2;KNzdO!tU zU5&7`kv>WuP_s97RwLzxK1gHfc+-;-jtUl#88JlwtidGN@eBdL(TO;a0)$pROy$^k znmUr#rx79lKngQdOd(7PY$YPXDbwqjqA+d^*NG@f6w}%s^S$pewvpl=WMFGHBI6K_ z@t`Pr7(zn4qAE7&d>B28>^AMo>fh1(?aTehM-iu;S!EU&VGRiCO*-S+gk;m~R8n>1 zWN?c6r|5FBiYt?5w~aKEN{=YQyEhu(KPdB8T@5Z7j7P=i;gC^NoPClb`3%x0139j; z{jJ0VHszPB4yCX?bI=lfCB@4<x!zH3jGJ|{p~RKQELDFJqoI@uwFY2#{f$xgCXlj{ z_ECh?I`Va)05Qv^Wo-hnB}f~yI>=z@GXqp|A>epE>`KXLtmpv@4wRaC)2%-DDvNhZ z3UyenL!(V-Xjz$m@G4{sk}SI~Mgx<$RU2XuLBI&=J}3eqW=K$leYU*(<Lc&j8(VAJ zf7$!<tF_f_tN1HvTP}{k<UfkDqjv%Quq42Vn-bYeB-*?d$@9a4T*!TtUYVcy@cH~s zXYud5yNi3TzgU?6W_fpad4A`wpX1BIH=qB~!(rVpIaazxkv$&kj5DJQm7O(;1m^+( zKVkK~!<~oq8=l#*ElFGq^)x4<nXMutrSBN5S&=Tdh;6e_Xtnr_2L-gB`kFSGpYY47 zP$?FAgpy3S_T4?=)2$;CvnLV9GER+(mB4G{@R9Nh=}rBscb%(1Wt{#&XVe|nn-bmX za`sY+H&r|w@Jv%fBENgl=70eI99&u|qu3e$rhw!xdyU{sdh_Y(cdx#`%?yG!&ZiN6 zXqn5Q<}2NJO!s^OX@z?;;!Md;|C@NGHk^l1=L8jC;gcO)az_=1DfdtY2X(oM-O{{; zfq$bk@cnSIN!UmSCI1^wd0Uk@EF<;);r`B-f0`-ywXwNd$4T49GloqsqyBu;>q6o! zObyv&Ds`jPw_F{a4mxGU5fewdI6TomoJZawZiTs^yTLBJy-T0j1DioUaH+G5(GbRm z3wP#%9xtx(u)1>JQ{rPR7s+L5czyA4_^5srT!rcW$K;uzsrtO`u}WHL4-4j~Ci_Fy z&KZ5(8c^#e;T3dl{{0(u?pe0F4Uhz|hWsz{p;I)7&d=v5UCPYp;V;H+L3uvd3yBSY zdgR|d5aQk?V;@FD={O-!_$fi?*A3onNVU4%CrGLpoObnFaHN04VB6FIKseUm{Tc0s zsyDm#%QMu?>mG)muK}BPY5#t8NA{SzauKurri6+N=?+qX&xeDzu*^oNMRba)<8Va{ zs^KNgG<f4#x&jRdW0wc6U@FAisb`)29^67N2N$UG-GgoM=tzF~))Enykf(@1jlKg9 zL+2D<JclX=g@YlcVma~_U`#g0P1NI1+c5{qcS6;209qQ1u_0hvogGqAF#rP(CRiOV zH=ZQ)1~lCJR-(hI)C2T07U7itx6(u&qVZ8OGf6EtD%-d^`{fTW#rl-5hEL|1b+N~D zAJ<!gM}srXlLSsD{OOikb>4z3#H1bctF7&)8?Uxmh5?^eH#ZFjnF$?s4XkKsn0VBN zIrnFWN%#n+Iy&{}(KkNLWQP8XVYFGy2~k=YE_kJ2snqs?1{l;pruG~11?p&Kh(*3D zl<Ad@tl{#q{8}@PV%%i6bX#vjW3soM<U4)lTkUs+#NptiQsrd8wAw*mq6O;t6k0h2 zA1+nfL!8pR?DuI<&qzb4-^1>IU-qz;M(_8}l~ZO~oZ(_V*-APYg4~*=QMt!hh>gBR z?LrQ7t#YXp=^j=fC8<urPtl~}o2v6;D^hg8;WLj+aD1OfLf`)7@m?_QQn#4EO&&^s zHk{R<WHSWVNKvVdptK2ibbV3ZO5%+;X?b=yZbexiTILup9-8B-atX+vGvHdS8%BOc zxha&Lsyve{@-!WDQj5xGP?o0J+k3IP{lmu7y}f%*4n}WCHsaQ;=;5V)26MW9XR~8D z6V<z=B`;buk3wytvqmt$7*oIvr#e8?fn*sCuPIK${pPiCrdg;sG}j=ro;je^Khj6( zT$}DLPgt<6np?7d)&%EFRm1`kZa{LGg|6VTu%$mAoeVBfZxB2i7WCZ-(n4_a1uE$R zo-XUg(O&N2N){EcxD5lhvzXDekF5vnYjRk;v@?e587pJP+{#D;?kFH4A}a|SL}AAo zF$pLB=u)umz6s6LV2Uh>BOHvL5jUq+@NExK7u*(MtHb(D%ClOgc1v8x;jx|P6f{0Z z+#ExX0o{S6sSjRnfYaSYQB=G`HRLDmM6!7RCIgQ<hdoS5B(Q_GTYSvzC$!ZKCwb%M zn050QYhf_KRvB$w9#CUBx;%xR4`0R;qcj|4uSVh7Db#x8nEGWIJnQ2P4||6a`U2Sb z3vuo$e&6?SR1$@eQ?!$6#xD8beEf>rq|&kSIi;iJ^!ZsU8c;$&QYPf~M%m$OvfBy7 zV<QnYkK_fp3qn7ET^b2fJ8p*04O3ev6>tiEsp)Z7wq~V<CvgVwIwS^)<%9f;ud&i7 zdeA**5;c+|u+sV!3G@^VBBJm~?;x_il~C_8B7wNO7g-<l7ysTJ4&+w|sl$38=f+BA zka;SLe0<Yd$xBr3EQ`ol>mRI71|S86Bj2S81I1c}#-pyNSQeyiOS$Dvz4<F>rtSKr z^G6hMBAS%+RWRYdLdN`7mu{lKcrT@}DOoCRj4xF+EU*?Nc_IuWLr=#rELcyMp^cE) z9lU@`G?!!QtvX3(sAfAM6ZjiqE(ZhIrCLytg3yKW;KUn|My&?HMy`cF6!OTGeUp@_ z%JNUI5Zl58;|fs#D2AYy{mY}H?$F9z2bwZzlh6}B22H!9nK4@jI+9G>@!Lm}!eD@f zm0Mnh!5FWeOa(T#FA{m&Edm!5;UL-Q{9%cMTz`#3{YxtMYcZHi&2jHF{v{FV*Mfv> zDYBycxWNdXyWL&>gKXKMF;{J?`S5M84}GzBaX2_I0R5D8kq!n6U>y;C>@nlPn6ss} zlU|>)@qg`X{AZp7u&c5vd=EnF8lJN)(XMx2^?Tg)^;>YCnFB#o30%{{=$rb_z{t#X zF!!1McynLb{W~3&&gFr4?cT@bsUO-o?js8m4B7Z_!y%Cvh1pNUkq6`6B(QQ^qGL@@ z_(-{ku7YpE$NCs$Oy9J_6qE>8Dgtf<R_?)Q76~N;ErV`$FD{30E>h*xA}jPHpw_h& zVz}f1_e!hnykpT93P)VY140PiINwr(_H)=p01sy+uo`$B&c-c0nqB>V>37yBv^5C^ zSDO8lZOmmn319)rn3Squme>dE$H(0vycP-vl;C+k9)2I$>-2t8MgkoE^Fk_%yZZz) z^Y<k5jH@YG-JL!&xv+?SpfI67EInANUV#~uHvF>p1-d2uCq*lSC%rF78ZC@%T^MdA zh6+uS5oFI(eq#aJM0mP-x;i&rJaLfQ3d0$W+$A`eu99r($_o`Ku_$1Q8~FR32F9+Q z&M91aY;(h=;;a8bX#lveiPLxFNB}!$>1y1i^Ggx$U)q*Ol$DBwVOJ_DWHQeCUw|)A zA=Jy%8<kQSRMO%^eVBZ$s7`Xi#i9lqw{enpzUm~6s6cqrgeAQ_w)^77(b}G$63ira z$MZ4FF7#qufMtdVQ<C3d*#+9+ovk+~7VW#n>i<mCVj%ucAQXUlLo#78d+enxf<-Fb zk0Fy%&MP}iCF-T?a{cW%&(Uyj2CEBl1Lf4^idi?er0eU;kzbFcbsEOfw0s0~gSwG) zQWhWkb{oT6ErxRQRGUk(0A_KDt5*Ec+RrjWKs8Az-MEAEQFD(_!xZoE{<0n1Iz1P^ zeTi@E4WjoUpZ<Z(AL6W7UmJhP@A$?Be~>E+e)k6+xk8(hp)~ooFXj8mkWKiI-Td(n z|7xucJ6GD%zkT^f`3XO;rL=gRgaj}@yPGndfmCDcA9hg)2)8sS4$8fOQe99|J%%e) z+aM-THlrkFQ$MF2@gzAV7y{)%wX}ft#?<@fMvRN#_ATaM5VBaKHfhf!jn*s82*;P{ zi#D?+m<c!kjIexy4-?#J1O0E@Y|>wyDv>cXz)^TEd4<A?hO93!ZCs*(|KY+n`>m<} zyzlr;Kk0wRlCR~J2<K~VNvZwGV(KF<=fekI{wpHP$v-8Ed}h%VzVz^@`o8xahzto= z%z(j6rGxCBM&@lFeY#;^v=2M&c#{V@tp3z6Ok@9b<Q!HBV(cAVxWt(GHqoKmY=E)4 zqN+kaA*2OIk{zR=9^Yo@I@KXTB8lbec2iQwKhQp?)jPbAS)e9DtuJFdL4oU#*#fn2 zR;{Ctf#lgFrxu%YgpFR~<Xlv=f6^vUIbxfdK8{Rcg}HjPw6yftPXa*guNe^e$SRp! z6SBPM2tn-E&-dvI)NFZjAU&!K+2}?Jq_<qoZh7bPGxwPiy1Tox^VhT2chBx4yIe}u zC^e256)T6G5<#64I8=wIF8{`oZpI8YcYk;H!S8<e`j21j{PnBXcky5Sepmk4#UHPH zA2)t0-qR&agoAG*IvvH{Ctu&M?dwyXG)LbWPv!IY`!)P~KX!&sFV8?%yH8G$=i~o; zl&;XXc6uXt0$4r$6ugdJu48j>%1pFph+rcVua8VS`?NHaCuQXh$+j~OqIMbFguS=0 zQ$3WUwCis8*+W53@#BFYtN0PM5e`qgL;JOGmrqx%;K`}Y7A34?T(e-Xdnqcz!XTz3 zFtnLC8u7q3d45Tsr$tZ{HfnI@3JjxU^Gq6qQEa@}1C^RQD=k3ZmY3%KM@1CCO2S1b zY!O2VO;MEys?N>6i!&(uMKgy2FcP(KUrYFPdHLz97ccivi|z-Mq+{u%>gTF_`eft9 zi<P~t)t4)qE882JWk^WSq+n>}(ZT6phyn;H?u(5rk(hj&f38dop@E#u+d3>hX20{^ zm#soF*RU?kk_w#0Y?sBy@(jPt&l0J0U|pPSc8`7#w2$U(=R_9Q1x}Thld@nGAscrH z!HE5OYv?D0?99N2urYHq|C19i5^0k{8JI%-=!v&A+|9AM1(^Ji|0~_efEwGIsy`xT zY=6-;Kpam7P}+~}F-ei*s!i^4M$9U-rHwVy(s%3O9Y;@2eNb6oMC~c%v=9j2j5eBl zi$bBnWD7jLx7X{x9lSxdASXB>Z0MA4bhe-`=|G?KimCL9ukPHLI_ci>3wBrEBA(`l z0W9@Pe!IpV-q_bFvvNO5Pg^LO**X0vU2UssebKev#8$n_?Bk0LoKq6R>=Gk#?hyHt zI01^R%PXc*t(@~}Ih;!$^bzOC4*@_CL9*S!pnBeYJK%-P)uZFy#kWVN_<A{9>US@A z2H^gkR3$O22_&O>wm&m`Wjk7bS_w#cn0(}?$vYPp9UQ*og+R!u$B~8oF3c3>haz5M zxqiKnt>1l*D>G@pU@naE9ccV(saivtSU9O3IzJnrpr*H!)JnQssaa41QzgUPw>~a< z1)2Z=8CYWgI*`2Xks*KSTbcI!jKu^&fR=Xdq}WcFGit~e=~SH1ML-yWL_R~qg^A0= zIY9((p)&2t^G5taMW)$T@qj`FlMl-tu&I^ylj$K(j`&5J>K$B-5UI$Xx;zKMZ#nUV z_Q%cJ=8;T$BuvvhYt)N;v9`Xlz1leO8e!>dJJ+BpTjd)rcFv^ZrX44e%p9nv`F!E~ zd9mck`PtaCi4P7?vII$wIF&*Uzw94$E{{);PAy54Tunr9B@eFZoS%0)!*Jh{Pi>nO zADY<nunPlTvMEU>p~L&y8|nwjetegqvV_?zLo+nLCG|uZJPwPBkpzPRW1Vz_Wg#tk z$optOL>B>Ydx%`OK4azNL0o7qQfIS!Oi?v_?gHy24qo~EGAE$2GD_{PY^_Qy#V0DP z(%s1n4tn#|4Q8V9o}VO%Q?E6Z`G$rGht*mtTZN`MVb)p)YJ^Aqmpe~z8>rNluI3LG zDg-zFbrJ3%*sT{;d1ma+otLCpTqB@)x;z^NIem;>1rh{B35G}{Md*#rr(>kpfo3S> zA)!Vj(S7b+Owb^Uo?qQTOBy7QTt^r0D3K|%f$YISPolHP^pacVWh=u00$g%Y&67%J zw(N}=<lJKr((oPRIq;c35}L*a04s)`ACZgP8@$j4NuH0T)P|10*98-!JLnV|3aXL- z&U;4q__r(562Ii=<Q|Xwqw9U_SE!LIW;L#m#%IjqJ{S@UetHKz^Z>WaH9{wC2s&_c zh6EKw5yH;{F!|stp9xTOgtQlw4C)>dvcmyTCL{9JdA>u)Ln&rb^P${7J6gVTXB&?? z`#5DTbJ2yysVdw(E9jO55Fm6_?a}CjSyJE(MHn~(=*3TAI+z`UeOUM&PaUEjHus%! znoAh}ht+Cp<JtC4E1Rp;+E(>)bK}Rgr>jq^nUyVkhqLjgH5}%_**LV=Tv^}#OSSQ= zT3P=~^{2J<r}wJW|9rW*y0ukpY~ERW@$&iFDt=pAfAaj*)3x>QtMBmM`o?zkeC@^B zHagwjs5qc?wFb6CXD?PapZtKHSH4?&j=~=I?mS!DUT2>uxWjzymCfz7C$FBbY*sH{ zZNA*tTE*~B(e3)$`m;@pvif3meH$9cI)1BGf5ew+>xY%+&pFhcl~;g%lkj0vfB6?F z<X-)-@f?TzwyN(|0olrT&sTLQOzO$=m9-c5s;4V2R=y{6n-!|NuWsI9Glj1D=?9!{ zTHWM$EBL=BEH}?-JlR;^-o#hjH?y(19bWxuZEN*jwX(UkMT9)t+<0;C4$+A>&^tQ8 zd+V#(3sEfy3M+ypL>Q_vhYnE>A2MzIdo0g-wtP!>9({9ua()MgRG}myrGkVBu4H-@ zvg{@5E-YyIQ@APS4bD(Qc1nASmr|mPJB9iTEF^>t6FMPY3JG4F3{C@4s>d6&cMlbc zP-C%Mz3sv8!1tc7Jy~7fS|z9gr5rV&))U#5*-|`uq*CZ|2&S+z1kiz577Dk%<F`E= z5#0i<PgSkhr2q3l2Q`^)Wa;>(PGytl=GF%&_K4yJtNtK(99NLBCKbj_d8|+$ft8>% z4-Otz6ac35fr!w<bl_I_6Rq{AI_><ucY5Uu<o-+C^n@^QwRO=&%5CQoK1`ezK9e7p zurr1qOFyROKt7XEuQD`L0;Og|W)Fhbu=IEa*wwI3bfe<@1@0uC4UMZc2B>u(ca+F7 znii97---DzJNfYP;9}k?tA-xSV4S(o!gG2s!xwh~P-RLWo<4&U=gC4@H^N<xZaxu@ z=!0w*ABWNXLX}%X!6T*?{E<6aN+{@G{cJo8Wl%Sst+3^<(R6a=(3<EW&~WX7R3c+G zqQaE;E2GcHmV$?y%Y`!RC~~+!hD(3NPvq8O!_%*xC7$D0tB~6VCAv6NdI>@aUI=`C zswy!}Rf$Z9+(gJ)2QFf7;zV+3?0wWoI*4f(teXRzZe^)z)N-gE4f$;ex-!0%qErlX za5h{kx(DcXQi{t&$glxV79D7NH(1<!`_{<ay0f3dQ#&qZPir%=cFp3mCN7l664;)c zbPwLZ+rU(9gO3OHMi;@Z3V;}x`-1`MPw=nhkVj2Y)&}(%t0bFzy#~*WNGZTi9QYAA z@Z|`RTlHEphU=dKA^*CJr%Yia2W1t>j3B|6TbqjyAA%Canc5we`p@)isv1w2m9dZV z>h*P=0Fcsh2=p5KFFNOSB2P}YBJirbkA^IsqN<E2xb~nDU5Gb6^CBg&|DfBwr7hT_ z@EGYOKkhzkX7@B+9A+NYlRy|+VdL^TfE289W3*i`yuy7ue9_5L283p!4s&|a&cA8H z+il#F6&?eEg2yzFA{P7`={T;p&}czK)v>LWL28)#Xi8yC;EH(uph6mJWME}#VWdX~ zqr%Dd0He{#;$y+7&&OBQU-=lTYqGr=<Oa1Y0{%%ayO#00#@NeE^s!*u?zR;r3EI>a zd~W??83|NpzDi0n*tm@R;8>@YD1kilqhT)MU$LkgBG}@P5YeLVXl6#z^ZeY=U{EbC z?stY?&)_5eoslv-c|2{(qFP=@D;WR^kXF%J86Llt$+!uu`8i;0#ECXnzhC{&J=_vV z-wr(Ar~<pYJ9_=aH(C{T^z-~Tk3M78+`>%!xI6dr?1H()Er&Ag?bZ69Uv0oyR_m7i zu<Q0$>o0z@JOh|!<kh=UsdjgFDg3Z-7jW$g)Hvdc-jgP~_6yqV&iR;$(r9+Rs&7m^ z=i0*IA*&x3p8jNddt@VIQCQpN`P-A{Yh#tjbSuloDfcOK4uAOaa{9tfdd->1G~|J9 zBafgTQf)5yt@n3i76|;F(o);2<Sn$zD3<gIa+80mZ%svSV~^@528S;DQg96Z9)K(k zGGcAss`6+_vlE7h`Z~p+UYBJ_1K>GckQ*VJdLc<?rMaBHNV4?fS(k8BOtFyc?2K!{ z&sSW>K&;_6CeOsS?@s7zL}eO%1*aACEKTWapnHPX#b{QIjEE9f@>1g&2?f4df=;20 zQRv^AYw~LZLDmBQ2`%c6xFPrYm&r}Id?~sp_)QYjBnMaOA<r`@cJ#&l6*@Nr1ZMIx zrhl)((Gvrvc0|y7if8|26-sol8UJjJ;4h<dgcz;^AKTTiFMZ%Y`Ajqst3Dsdgs*4F z;VP@XhP+}@kcPlisO7Q*nL=MI+yn#3>IuqFwVH=I^z)beOycXEAB<pTqf9pZOc%pF z&wbvR1C&fS-bJF4{G(rIW_XB)Pj)5FfxIK_@pt$cCyEvyX2qL`oHkTUocHZ!U7MYq z!BTK}ILW}xS9@A$%gqAobUSzrkL78b#*99q6-n+5(o3ZxpW9zlzS{(3;$VE$C?)%d zn^!Z)(62rpRrm*$0h8r-zEsHotUjnyKn9h|sV|Uk50aB3jlL+2&P#I91YRD;!;vwA zg&<pzuKTCVwCSQZYqwWmQ6q`R;(|sS6xX2XMeQX~TVZohmk}R@DKFS-wO%6qWTJSE z*I&Z`;>?y8zPmzn{HSwzdVxqeRHDDlB5QaP<vnrnDHPAS*MBoB9WgvaybpOeMH&jd zn?Jxumx!OGOt5Y_E(t+lFQ#gB-!tc|cX5hnKO*?9l%<_8f=mcR6=ket!0c23l00k* zo+{#TA|<%w9C>H$ND|CA8Y?{D>JsQXr$-3N5BhT#oCf@o7!c*fIBH&g(4z6C%G}kO zV_k8NcnBMnrZiWfo=qp3mQNFAhp&=H;*%NT-d|K4y+m$<KmtIKj&P2sJ$x+4sR3Xk zxE)cfl(`MCSNIFprNWU1=Df|}*VD5BEP>7`E)`(%+y!)8j>HT~G-p45+lnU9-!w~z zSGl}Hbe=8EAQBu^gLh^p`J%dW`Z}T6Z&@+y<l^Fd`TqTP@7^sP_b-=#@cW+0asRZp ze{dhM%gfH`{gaEcQ&jLj?B2(+N<zot))j33_e*?2_{;7F&`*z1&;49F9rSUus0%}8 zbpOGFfB(b3|NeLX{_po$(*=Y*y8nLva1TE8^M_wbcmIOBm-ilix%c2pbnIqVAg5q- z37fmY<rjFW607nuINwB%KC~al9G&nx8D;fUb;a2T8Ruyi>6DU?fx{E=vo<PCjalnJ z|3zMX$pO?!cM>g|8zdDRrJYEvLd{`EGAGCAq<3^NFMTI_kXbK5iI?X(WwK_I^^;5_ zxJaZeitlS>n-E@&Mv?ggb)4G7)d3WNNSC8#FpY`I)gh2ItVQK!<!8GP9Qv-L;>TGV zQgr=AXBLNB3Kb`8R!P{nksfZ=OOA4#o%ROJq3|7+u%v@;vp?$=)<6n%vWAKw{Vy24 zTm*Sbdm^=9qfs~^pb%;)dWDr20x%x}2~j`EMyE4xj%JqiRhv{YXJ>tzM+!KK!j8Jl zoi8qq>E6^FJv0*6Eo!zkU`6#u(h@Fi+@oJSAaxD{)z>5e|M{SQtdw%i378csG{IB! zL>VR}g+1lRaY)-bL0;APVM{tnU><|=u%@mmrbMNvta02+Iuyh|L8vOd@Ew~7|2#-n zdJ&}CbQT%y)g%DJ6J$g;xdcH_wG(O~odk87?H6!sYpv{nP?Mq}3S99s3oyulRv*4p zO^7b(v@Ns;#XQoG>Mt!m?x1Sz`GwrDQ7_I*oIox^H&8Tbno&p9scK$gGJRz6F}uhd zF?_}TjQLRyGDV#P9RP4*lW_h-Pl6wI(P~SjQYGnn3;7-z(uiCn{RA>;>~Rd3dZ;Y{ zE0s=(kFSxY;3c?lx-#+#-mg-(R<D;KS#R@W!U#1$2{2!eJc$UWP@ye(JxV}2oP<8j zoRc;YXH=cx=tGMKUqPR()I;?Zy+yr}%}JqtJ7Y?A2!#~XHrs2yhAUK0B1EXK#0!}Z zF7~{plCG$qF4S{v5mciz=nO;D&f-bE60?c9ybYyvX7Te8>TjRR(SdqSjtXJ*xH$wU z=BzY}8DK{tjLz6fxU)TRPK1d}GN^5IZa1<Or+6E~u0&uya}f{P+Z2o(={(&9{B;bx z4mO-;^=~XaH$zehYN25Mq7|@gwK-*c-mJV*axIr+A0=Vl<ghlf9@|b07J(=bpzO$A zCNU<C@}d^4EW7ihg@qeseS#rpB;DmoP9i26ME#cupd#w^I3u@9=pF-lm?{17$?1FU zYwX-j+$EX`Uwg~jztgd771*7uL-{uGV#*sT>#N3`?5jw0*FF<iBP#ice~rsi5CWaM zfP$nWKqehFE_-92!eiGJxY20!Rh>@KULYtYmG)qzh$#n!0LHCI-YH~lP)WuU#{pOC z04cB7mlW|~xCBMmU_m14Vu1GoE(pj!YPOyJ0ERINeHx5NL_lffo|SCG+6e#GWe8+% z0C4u8MpU$l0GL5k2%q%DoPo<3?64n+)~nnQf4uzE!|+I$kTUo?s-9DD>ZiO@ojW|* za17Wi;l!}lF<(Y_Sl*6t6nFr#hPqBbgVNYk$k5tOt(sCYduhqD<pxa2T+?Dv`pG9f z5tFU44WR3?uLJ@Ymt(9zM5#*i1jMA}&hCyCwzunLo>=O(iaCnld@jVg1qB^>91LUb z%py653?SC>9=_~}^9oiw<aoTFL`(@wR4^+;c)`0%NUU6gc0g+=#_>c+$e0TQ=ks7! zcKwLMUhcMWvteUS+<BW5YJyEjvX026rtH$M86?s|Rjlp0qyi(zy)rhXdnPgxiWo@) zNiwbv55=2l?7Tr@Zl+?mC@vAUBbiJho(LKL8YQ_tni}-6pxz9sK>QKLYoNUm<?A@^ z6}E-IZPbc$v>)SAC;rlkXO(ybE?e<9JuLUCY-rU?a(d2*b&PuKqb5+c=u#_(l9)S6 z%w{zNuebG@_Iqt3r!XUZ=M`{Z2nXFm2;xH^3lhUb1I0V3aq$?$B`iAGu9%G@#C3{m z<l^e^Fi|}1$6|xt5FIu%=0o3!s0`@P;dH3PVztFg)Z*WGEt84*Qkp)iD&+Lbs2DNJ zzm%<GmVdo_EaxR#-lROa#`2H1E7dKL@R&%eK&1ROtBgTqs(HKa8@$^CQMj5s9h`0O z;F>O8r~@48w$oCd5t7nmsT$9+aF|Hn{AT2=vmEUt)1~HEdO!JwI`ta)MSE$+Q!t@z zVPgjk=%M!UnZYu_hW-t(7BNOpcYA%mu}%<;`mD_4-~!WoCbfkKe>3=e;tEP?_0?pY z>fnY^U0PT}?()N_SZsVezK1FsD9PzNV@A8^;<U>kALD5Noo0(1r$qSA!*+++8?#Vj zSvG4-a3QW6iGc{Qq+Gu09?#%}wjWvEHNhKyZ9-cqCOAScum!e!^wv##f_=^LTe&`8 zZQ)xh$OJ>bgpl(O3*8(2NN2#NUIlsB?6|!lz1sbf^pIbNy$N4rq+mAX{AF-&$R5_g zMQP<Mvvnu}S$q~z7C#l3X|vaq2ZH$FX7gGNEtzIq@5Z$*rI)-;`BT0uRIb1!+wGVz zUlEIi^m@iC2HpIrhx>XX#b1NegpTU9n3EtM1M>9gp%AmGip7>72vi#zGJ_l?WGKG~ zpMA(!m+Qb+BnrheL00mKAt?B<$b|X9O6dzizo)gDo0gs3HYXkONnCDz;~!+s8ZX6Q zY5~p*2lpO}9rQ=Isg3y`$eKX0kl_^;pAMBH<{Zo{F3xzSgh@TFrfIR-xsR|xN%pSC zVhEO}pgsszhJZW@<BJOBZe{rW?;-I4IV5;n+fxoQ;pC$828j{MSQ<>xli8y#LQE8} z4N(*VhqW%&1?hp`M2D>4_g?iSi+%;?oc)L#zewCZJuYCrL^)?HDC0Idm$qmDgxFIf z4|5nSP=7EuuhEY37XfgA-o%<hMA<2f3_!A89XQv7GZl$p2kw&EJf}pXbYYgP|Hcek z&I;98H#B;H&5K)b9k+E_ZKmtI9T5^bZ(@+}uz~Rj8ULmk$YZ5~i3oj!#u`Ltk3PDQ zID;<|!7)%UI8X6rj_i>~?8zw7M4aN{C$9xmMac5Go@-w)u{(;;kCA*b&k~`6?PO>X ze3|4c-ynJoGfm2BL?0VQa13;cVENe8EjUGSWA{PoJM{vEXjfG*{ZerUJmS6&Nfd*K zSX3hZdai=x+eZZ;N&c#_VCX27TX|1|30)vM)H$S3rLzi|$XPmqOaOVuOh;h&Oun;< zA^?LUSiZ)!Bf|J6Ya*+qY^iTyFF^=I5)FJvYPPj8<wcmi)~Ho1`5I2cyKzzDCx2fk zRVQ%^{=jzM${);4V#Z_O_m9gmstk~;GSL{<#ZrPEAOIW;2}#AR;a0mMoa*fLV3W3v zJ%&}jDd#y#@-E}zaDeOaUL(;pF)6$DwVymow$8!gFP|8lSP(}4Re0Lt(<TcjBqU!w z$b_732ur?5@mu_4i=LC7K2Em8O}o;~PwMrKdT_{xbA4KwE9C1Qv(gX>(#X|K)Dq2? zUvs6};OZh%IqpeHh2gNbcQM$Kl(@RdAo!5|RVnwZb3PyP8a)%N!79iu`ugzK`9&Ou zdHu!L3-e1~Ec^mjgz`Q9l>-4au|WJf_Vmbr9%@ldOt0PC)~rB%jQdRT6^g6Cz7k$F zLnY>)wHPWse8Z4}l(FN5mkDD8>=#Zvv9FRo?2Q=8r~;No*6h;>hTrT2L)#IWTNP_~ zJ~-|j)DJ~$CMS5En^E5jcAtC9z}u4Xf89iN&;FJiY<CNI&Ub#u_Rp`@Hc>qe*Y7B` zW~XL1Ua|rks;_=secAAMZOf{(e_j2nJ@$lhTA;;GsG(W@WZFv6@DOZ{tZwF8>61ie zeoLbl6<;-xmmJ>wC$4UPv<+$LC{1$1k$tbdq2!F-W$rJO|IQM2|1s;04{$KF+Q<2Z zv(D%Z&rtYLKSeF772<Hl@^Zi>tGMY;jz1I94$kDsB^biF;Pl%CyoZh5{miuHpE*<9 z3)Q*!S){t%;O<HzXUN(4ch#onp&gZT5PVQ0Gv@=Slz+gexDZFEMuwMrhfaHe_%&-W zEQa)h3>KuV(8JL)k8kUKML!L+a8xTZBv}fOUN9%U`2hrPkYWce5eiqIU-K~pZW+<D z%05foPRZfx0x3$XL_>5}Xv@ddzsVh90v|4DEBlLX*EX~zDT$6!mgYoqB6AZ{1WIT{ zfKK+9xF^~!WDX+1UWD5oO2<&~`ETuEj!vMm;8o7w`hipHshT6WK|w!+4UNqbw%$x` zw++ORxY#0n*><U`J65|1>50<ngSN%6VT+diI0~v({fuTG6$vU`0XX2?+}`#2(Kdn{ zFYuQ|($J-$>xS1$F`@Z>lD|dw;n=zLM$wVqJiWYkv5x19--3fn$VFHBdPoTV$uroT zJyfAoH|5ycR+VE!$SmN&Wg$xGqS!fV=>ps0MxB6%70nwPhXn6BMMC&(DkLB~S`VnX z<PgbN)4bEYX$pC3GqZn!=*+bR6_}_+I~d}s=8Hl$1APq%h=rQpz=zn-DdI}6nQF_z z7b%6&7b+4_bZ2MfLivwEET6#q+>=h9@*QAcqs%afG$bA+kdv30u99q*B$FknKSG&- zzbMQyaE%a3*_uo97TDRXizuKbJ!2*#hI2Zf?cz!h**c?0D@WuT?a1JEtu7kfUAei+ zK}yz(3ex5568<@ypY$gg0t6(b8hniCFtO|XLxS7KNvvIN`8C4Mgl;=!8znav&w@C9 zYP&&6cDY2p4$xuqfk*Rw{pdsn_hjfoZ#8qcgfO&p)PAa*H%;X{;qhOqMiQfK*Q(eQ zl+xYu1V}iyE&zMvj|Xq<t}@|Tsm<I!0Bv-k@3PvA6vdOm`(n0jpRg)CbXIL+Pr>Ce z!+|Hrjo`zPaGYv}lBboC{<bU{c~85?Jr{Y6pCB<%9v;HuEja5g)$r_CblL?rjHV({ z{+b9;nM*cs`Ic4KyRmiJLH%^z(P-E-EVG=m7D|>MLSemosK<;T^%?8?<WJnB4TnA{ z@$A5{a%Maa$~z#@N$qD1f6&wAVn2Du1#-({m{VQOqlX&vS!~a&=-@C*t0&#yWOQv4 zvpJSqPuv0g)HU{boNyAXLHgRSUhr2o64~2|z1;dik=8@m=X^Lt9$(|1wGz7xwY9Te zMcCGq$?0<%Wat9y^ay#mg%~VN>y?07U+d&yBps|}jgXRtQ1eD%wzWCF91d{L5YLO6 zgEn{R1l`!r68U-Mz!QOJvT+h)X?iTirIGdcpj#l9E}yKrCgX2$oo7Y8ggCMzFCp?1 zFrBoO`!V{*X={t_pb9-WW!}EA1ZPTDl7t%GLW&QJ09^DU2kzv=z6`#=e2VlnSn@e^ zB|F%z{aGA#PiybSP8<4wvYVhMgDt*?8~joYIU?bg#Ox;9dKj$44G-@=C;^UYW4R+G z4gi!WuDbmJZox^VzxBT?9)SgV0is74VO7kt20?lZPszAO%+r%vZzS?sh2aGKDG{5B zxLb@1t0Em(kMt)4v<Ql%1-U)>dTWTF=q9vWFrJa5QKa0e;s?DV`(-ruRF!5Nx4{}J zqXyn<bEizdYzeTLORYp3Nx3B_-Y46V6dh@L3g;HRkK)quDWawgBq`0uX^P<IYP$D< zBr<w=<QR`(um#sP1;M}J-FLOyk!Zk?`mOYIFxFFS!2g-JE@{z`3~rKH-I|ZmGl?nM zN_6Fmo~~@#gOI>S;TOxhX_IkNu(tNlz}Tjrd_*uOGIaw(0BsWvI%N82JZ5ZtL8j;o zn<QJ~k%am&W~y7hun9TwXZ|TS>gUk#vy|}iR%67MgGv!m3rF8fc<D0UNOU!*Dg-Qu zey0$oNa<!^zc~Bx(5yJ{QbtHtM5g)i1)O0q<<oKEtpUc#R98;8KF>zt;#rXzX^=dW zz7o|fy7`*nvq`EbY1iGZv(M@3U5`{sJm}{3G39Q<YF<m~W{8r|SADJO>)o<rtd0&k z=Td%0(l5lfO66CRK~UKA^b|Wi12l-iGMkmj<vf|&IfC;AS=YhjQu7BvN|P)~t@dlP z*HQ=3j1wnr%>rpr?9$q{AO5<tyZdhO^%t`-^F@*ybt1^S&gbB1H7$skUaNyryd~a_ zdGmUdt7jyH8Nnq&1z11bdSD0|8@L?Ng}D+!KHMkg>HlQsX&&wguG5v$>jZflE7nUi z2)PpCp=j}xAo_uej3p0bOcl_$&w-AcoLxKO+%#PwGzc2`9K|Q>V{tb5uglAutD3&C zaIf)olW;7Rk9X&eyaWAxdHKhc=dV`x>YYfo+U;|CpgWpRF1SE@Z+X8RYfPxCMtM0D zbM#>K6V?_fp0P%Tcz%8Q4bOFAozs>kwoJu~z8_oGeE`M}UD)r5Z_6@rB*d1wVdAYW zAewBcgi7QW1<|hiI~X58PaU%L!RQMv1(=IW31hh<HE|TRDeYTH?ATuOLaRM`^*z|u zy#GLw$F<g@3@KV_K!)W9Gq^vSq;KZ{Q$IF;j)~6+8_C(Pi|$#e;ZTX5?cqT{v9E<< zzHFb4tH<W}vXTg&@vrgZ93MnNZhciZZgvtr#YJ*DWqAr`30orR-u59kRnW{xc;Y(d z)Hm4YO|*3tLvsPLwwOqSWeh=Emt*x3&_$e~5pbBNtbL6%bjEq3xEO}HOiZAk2elRy z7P{V17*O(NbzZEunqX;bh)NA{IuS{2YoVnG{GKPLLhk|BE&oH-B%4H16gRle>p~?M z(vn#b)~4j7$flu*oY3@dW&4D}6QCj|B#gkOk$?1){x_A%Vh4|^e5)^0Qydz`ODAWg zq=02?5}BkVVPY#g-{&L3!{;Bxv|Y!RKEF^e9vIE}d?tx^eI?ch)6<qz56mZd3T^q2 z6~E>FKKj%fMy-3*iQ;^rl@)8;Q7+>Y;971Ckcr$HXWkGOFu3ImtEZCW4<%i&VHUyR zPy;eSaQjpf#H3-8Jdr43p_C`THX>BivrYk$twTMYNoXjcygnvG$*Lb=A0sUTBBLCR z+$tM#ggV7^i9r<NRCGIyBzmBTfH7g<7KuL=G#kx<Yhh4q2SqP6(X;7?Wcr2Lhr|hC zP2^AEBWejsnQ_;qZ1c=hs+s<*u6IeQ$fb^V<~>;tp(8V3vzN*?CMMe)Kt=Mi$VhSh zv=nVE^7ztNjryQu{0|C+2^kO4)P3J2Nkr+=25%x3ZyA^gt1KsqkVA)+uwV<%q>BQx zCw^X*1rYybARQi1FMo^N;C_YB+#I3WqLrLH2^CT?TT#;;OvaP4O1k*fDJ;|<54EKW zI;bygK?lD&wrvwGao(n`eeWiaDymcKYfUUS`8L}XSNGc@G|j}+PAZ5=_Ak%&k-A+% zURV1KWRSPXhGw%aVPz4-ZJ@@i+qhZECgPJM_q_b!<=)!*_TGz?{{*Xe!a>PJlNchK zrSB3sb9{{HZdw7FvD3B{aww9$s<uk*%N5dk1ivB<n73!BKAv_}V07~wb^StfjWM;` z(FNMas_E8Ov+|nmjZN_y*|me{cQL3kv}LV>D?&t`sx#9VOWKm=t13>Ty78KKHWte; zUA6Vd{Tbft7`IE>Bnp3{li*GQ&N8QmE=KS|H9v;#?C|*f+638()H5vYPJR2gM`QxH z3RVYS=2;p~(S~$f($AxxOVz+7q+`aNBZ=Lpj96z!Q-N~(N);a+OHD&u>XR5#W9cPK zb3P?ohg@F$5cr^GBHCoVcwC~hqh1SAy<!0>2qv67arI-|dnLM}CY4V+(Vt*e+VrVU z9JU&i+9-jt-Nwo+;Xvb!6aD7^*p^Htx8((aY9aSPr@Opa3x_}E=YFQConR(?nMCaT zUrv)EvPKZz7$%8-oRSh$n)plU`*lwPhvwh4NJB2i@cvs##2ciPp@XHK9R8x*nSV0Y z9z)*Tc=T};v|?$ttUzQwj`We2uaxk~qD43pc8MV8(~hXfrqa_)7iN|>nB~G$-NSWy zfN*rQKR~q~T(FtofsZ^xj05toMsWexNq@~0b1iBaFG!NHN<xXaAh?F%M1Ul(N`>|@ z^VP2OzlpzavoP8>B#7tMRLz1)^?Yq=8-o24j>feastx<gn7dF4a|*h+4mvScDzUBY zjgOTIvUtr}uyF}p@l)Y6&}iw+Y+#*JvjtqP**0wS3MINu28XOthf8O0S`GQxQk~@B zq<ip&e83a4_;HAU(ZT8EA)n$G1yU~S^9Am{@1i;!YeTVtC(h6FNKagz1&KSs1-no} z<3_+Vrn9Y_S_<k7Dpe)JX|}=Um~B%KTP)oSv#nNCqTWola<$94ebPt|DivGVv~-4K z;3lpR-+69>{w?45ue$&~IQCsiJ}>)n>q(ik6F-kntl4N!GnO*wVRZ+}i@RYH6{S*k z+$4mK+&5**0bi8kz~OZEar#dv$R0J%B=FR;<c2Swk`L0t6}Df5E?i;u*SwITfA`&| zwonfAN3z@%OSiP!2P!|sYS+)DP8n==eVnKs<z8u^r0PLkY>&0qH<PLe$<nGzQoYBh z9c2tvqY1ObuDNH%TzjLSKx1-7qTj)_rTl9t(c#b-71U@7tfIe3FOgZOH08xby{A;q zt{DqaVQQOZVuOhfd%{NRqdL`cs`XWCw*)3hTI_DEE9t`FpJOE*nqnpWXL{wQTuFb0 zlG_T>*VW$}tmK5H^s%N{N^hHj*s_#iiyvL}2j`<+>vo=Cr;S@6L~$Rm^fIp}mxTUc zY-qjEQUuR-{e*1p=n|VoU*+jFCC?zCp(NC#n0F+}HFG;A_g>HGq=o8}Y-s7a>?2ru z4daawpzK?PC~c}_KtAA~Ova__#JeW>M(8eHuz`#0`M=b0P^%;k-}&4QtBbNI5DWiZ z;NInP98;`YcszUMAT{>$TKh>HWCV<VQF`cifa^l0uwb`bHDZo%oC?T%oCAd5$5jhs zI7O#pWY%sr#?On3ux@jFfqvAyC95}%kr7b@c<1vG?HT^>H5b6Ao8U0?jo)Mo#J>)4 zfy0Qu_=zOqaSjI}t=Nq2JwP%A@h>iBbg%mx5IKuXa^8cL&b@)?laa=I`wdd|_(&WH z9g9>YN(3w3J}%Z%7$UX}h4M>=<l4K0sFpCw($Z4VRYV~hv*XV~urNQ-I<|B44aR{h z#HQ3he}X##k>Zwv<{)?vBhB)w^%q;4Ivr27%AwY{`hbRGy43!ZQ+}PCa`D~VwP@cv z6sTBZWrHK!(M$dE^7N4AJ+A<h0u8X^VT^b=3n`g@*yXi*BP7(&f@jL~6O?Kjpdys0 zJ5Xt|r01Uomn?<#AJwCGozuhKVCh|VAEm^4$Ng`Q&#;P1Z~-7z2PIRqP60$ZTFHR3 z<mbfm6hd6(@Fcx9os~z3k%_DEg*bDZ3dXMxN1tfvI<!Qm%?<0Yv?=kos=iqsr4J_* zWYObt!=XjzQzW>8-f_zv9yXMDxqfxdI7SXbot{$@Q0_vE>3c`R!I?lj?7Ty1V5^vq zLNGinEwv-s9c8MUO8LjJ<{UQC;%X6<uL;Km2$L##V<7SqT7IQPY3!tqMXtyobu0pJ z!@-D`o!U}yHR9B5DtLq2G@D#iCmqyg+3(^qQ0N&w+(^_tT&mVktkWuNiO=!?67L8J z%vTOg^>kpz&ih?f^XLqFxSPYaAX15!V;goyEVqvF)DZXcDh|rK6O0_H;~kxLP{x_{ ze<0sb;sk=UCjzq?F~*=8ro-S}*pUcZGK=)8-+)3*QrYY)?>ij~-Uv9>ak&&M*_RX+ zQwxKIJ2hcltPtrI|Cvo{u5a*i5_Rk%aC@3y9R*I`^v;3p0T};iaC$m;CpV|`QKbUs zca9t-)%@b(LPZ%Ld<bERhS}gnYZKLQ!M$`!-w<ETG<QR^(=1j}P)9J4KMO|EH5ki8 zpGb5X5_KX<|25~C{Iu=3pC2vAMZLEpTw@PX(Bvw&92*B-<fa5&e{hb`Ae7=hzX)GL z0v+MNl$WJ#<dSrP{`oiOoU`8hu0z@C^KE4v9%GvN+K3uAeTOnpx_2I2qDUojY-LxI zXicXN6;k5bl$z$V^aQ=)fFF?;3%#2AvfRB*WHirlV%4Y`>_6J3;Cnwdlp1ljK%zlM zDNRyV<DrC~d;$WLCmWJ`h#NLl>Ksjolfp5F5wX60Ld>lmsgLAoPYm7~K7%%Z)pnEB zL@f8nPC)`$)TP`FQko9WY%$t2#gCX`trEo|gtdu^p@F@$n4~2P*Jwz0SDBH!t0;u> zw{4QY(Oi*-=PQ{-zTG8bewYTTEaQdVO>^j&mqB_`eGM<y*!X>v4A^!cbJo#qogwSt zF|@8Ak$zLgQH=#2sTwt<Y-1XT?n^1t*aJpC+wgdEma)!na3(=#HDOhpU9!ntlUdSt zZ^SA$oFf>eVUE{l6YZp#N!k{48jZLCxH^TcafgFCqZaI0w}ToPVuotPwr@&=PRp1@ z-M1QL%ffRD(}ClVy^CONHE-rX`&z88Y4MTxeiw86<e2%N?3l@uWrJI${aO^|U$9E% zOMKSZ@4?7^i9(wFgC4w!kB;P*Z%0>WM}z)V^d*YNGL661{Vh)i5&*aBs+DFbgGs?U zd^O))I$o+47q3uwW?>2DH@QmnN8e5MyKp=7@LIHfoxw9&N3|N%`PNzy>l^E<2o2aZ zEXl6BV)~PNEbJC2@hl`@0R-`7ICwZ~kLy8khsx;d-*XFI?EOCEO|=5y1uFoEUHFm! zLWRX}aE4;#=#&3Y0Tw5V-%;uS5I-`oVCw7B!DaMEwE_@sNeNfVGy~w5P6yYDYQAA{ z4tv9|@1r;e)=56@cZQQ^A1(#>y82^HkQK9+DR+BV0M~BdX97wziiOX*e>*ZDZhMLh z#M$^|GBoR}->+=1eD_?a;tvW>sGvb5p!mtdY{k#<7LV|<k!jJec9lnh`34_U<Bd5X z)+b&mhX~h1n%jxzneM>~Fx?vL5!%2YKkc1?Y9+YvGm$0gHS6N1?Sgi!Dm6BQMo8Qe z*K17VTe^bCD_^cQaQYWrV-1Z5@6tPoYbpB|qhgqAxEDB#3j!koXI(kYCB8zr5-2jh zyWzs9lgykocdLc#M0$GT4)Mm@BF@gi{77rI9y5ju#dXsvD5<#v-Nx4il0X;jV_&gT zzmAhMZ8w0H(ML)711RC5Vr~1S={a297%5~}vwL=aadq>Gq;o6Tc@2^;<s2NR(s6bj zLq0GrDU_?Q1O9LsDPx;oBdb3BO%puw-)plDFO>B)@-gEnL4Tp_i6}{~t_aP_c0^<Z z6ZmEfB%Z+t@2TiuYyL%O_$|CIXMLp}+UWeWcQHTrVSab_=Y_>@SPgCW6i4;WP@l|_ z9=PyxX{t`WD{)`!St;r8B81BvXcw0@rk8|dZ<BDEC*n8ku{r;Ur*Z|Ga3t($)uzDX z4HsR_CnV%^97{$VJ|Z%HB1p2pLPBy?Pg$*9Zqo7VsG?Abi&VRis%RW`nn$>u>f>Ei zrH09`cTrWqYr<P`(w3HF$hrA#R$Kt<E2LiN$uSyKi;u^qC{05sYiDqej3}(>2UlGx zh#vu8*EFanfQWmR>0+TmvMH^mhmDa@VK(bb$J4_voRR(hn@uQcIQfil3~x}mhBtmX z1~P2Lr|QCv_wpzuC?h4ROoOY%>Bx2TunU_JY@0v1aO`%9Xz5nS;gXggv^`kcx^j4} z+4L}u^ZF=!lR#U?_S$yN+`!@>lR!$syhecKN*N&bPpGyjp+$Ecs$wL>4a0?dt6okP zrPuW?0?TMtMs7pBrSJJU^!bIPK4~qr@A}BFGwX=*ss+$SQ)94^V!{ow>tUld$7YN) z4U}Gzri<YqR6#&+*-Z0lXRkV)Ty);BjH`<_1d)XbZiykc7;l6j-Jv?CZG4ep$Oo!p zC_K3>hG-=bOEF_WFw`2*$%x3ADTUd$jO!w2W%8|h#hyg%#4Z>tp0p#Syd@{kPaSut zCY@v4MQSj_N9{l)TSIQ;61n3;$tK~NZL5YY$!w`ItD6c&HX-o@mG~6@P(F>koR-;~ zrMen5klf!k_Fg`5E?th8$04y?<r6P!Dxi?urqMBsluEET>8RGWz)qbwiA|@q9r!4! zwZHPce74cK8Sj3HZ2AI_QUpN@pKNP&j{sEF2DLHUgHo*wW#0Wwly;G;F(>UwrTd{x zzM59kO6Fs!8>-GzQ@BcU&NUr_ek!2Dt$P3H+x)neiClQX^Q<EtScTfHzF>`$8C_`Q z2#v3xqFfuoiRrOOwF(rJ1%BM14Y@jUnm8`zp^_FBN0mKM>XW8XJ5|R+Xr4Tv9gw^d zR=Id1{+_;&OYj7w{6YSTNr-fS%+Lzp)YO{%l^;8&m)%6K%SVx?8<I1|{l4MV_|U2K zQ+(+<@g?DyyRDb?d5}axc#_dQDZ!R$<dR+PHnGNIAh=Mq9$c1%fi?%o{;8gvbWpCa zdNky>B~<^%xAv6sE$OL#uOQAmBbbDwCfWQX3Q2(L;i4kCsgTi%XK|ZKGIV7t4Pi@c zs3G?N;hJG7E4D3~gd}(-T%rl`QYD}BqC1iU^5>UBxC`n+M&04aTN_*sk#l7g{lyQT zqHU}Ig3h8S3HJslCnT~kHJ{Ud%ZYqz+kgW!Rj#oO{wcEC>F-^K^FSv5R4MnCouvXb zT(cS?ydv<0wZJFwPJq7U2xJ$OTCpwX_E)3MaW~wQifvjCX;8DqJ(scL`JFkdA_0H= zV-)Bg43-fCgyUIC_RDYfeQ}W=ycIv+zDR!rBo`$nK|&->n3lJ~dxiX>Hc1+w>Ch&t zX5%aOsvBG-YT9S)1*l8<RDP%agBD2TTwYE=n4;YM^p}*>&lZSm`k)dD5Fk+2?Hrs0 z?`r}xt3JtBE}Lc*HyIe#28sZKACS&4Xy)}tIWCBhgX#g&*UkeJf{Mcv3H(Dy5Q6v8 z9Ao-hs^Ie%*LlTUk2s80fHk1SqmOHjlj#w6vn2Qext@v*t6d0d!O&=g$VpAW{~N`9 zi82~?Vvb?Yo1cACJ9^BXXWx?Q-b6(4$A~O`V>f9QHP&!$(U<FOIVj&S6sJZKf97Ak z>)l@8?{R<YnOvhrSiM_%F53W({d?<imfG|y4HkLXcHAM@g??E4o)jU;4sH0O(u(+1 z7r$7w`M7LvXy%d=jWlSU#HVk^q2FiQwgOybl1$Qj6OCw-X_uaz`hwP%pHJh$%eQc3 zJ|V9+Q<2x~+qRj-Aq<op75cbALGvVw-cb)J6=9#1lpxP~K>9K61MlFrVyWB2ppxyH zZR(uL(6LJ7-rmIkiX264jqXIwPAZ-%jbu}l^VIUy<$SrQA||xO?WFwdF^oq@rD98X zh+9Lexv%APe^nf&=8`+ji42vqNR3p?rcs<?mynq?iZM3jpKeojE?Q@}B*E#=AUfXy zDutNGo+S*K-c&Y=o_S_JNsrJ@^}ms%{MXiNSlD1ZB$&$tSURVz(BzP`LXkp{q%i=G zQYs<D_IV`S@89g4&+iCopz<ZSnR~7Lh-C_8#goUngj4fkOe>Jn=(0?nQ&8i~F>*g# zU>{O*&=oHkFLv!nL%QfPU}P0stnG|)*==H#C~eWSY{0cv8Phg@wh)Sk7=Sv}8D5O` zXwG7v?_M#3gDD&hDwMlC4-cOY`p0S(pfJznKKikDzhsFGQJ)H;jZWTr#*mFVX;ATQ zHIDjl{HSB663!#&<ePyH%B)gDjV83BaCUaIB`TI@gcYXM^$H*k^{%i$YpAfBqDW<Y z%;O0QQxGF5!Al~-&1;uiEk1^R8vKbNO{Yc|F)q<;Eq>I(O^pO-Kc=8V;Zn>#OA4dK zIVAqpfE4AGwuL<fy?dgDP<L%({TS<77RYR*j^utAfrS1zyAwX&&l|`iVOysT<_ZKP zOivlchRuaD$5506MUc(hlG8`YbZv@4k(wD_oRCG+e$P0^&~@e~{+VZ*&UP9!Dw9)s z(rn;C-;3fAX@z{Vw+3FhQ$Mgv7L;qUW=a_yVKR7{VF|QtD2zg$XpgZt6~cw+W0Q72 ze3Q(-)oRqTC|E~GkXK+Y&YkO_^rIMLIh!9D5m1Vw&%X&w72CvgUBi!^$4}*Q5h$tr zCukch49dfTHBq2io-!CC&pKs2;SW_^?h%s{lg6)p99fSQ5&^b_#+m@?I)+~F@7t@P zhg|&lo)&y|*F8_!AUnKICA%AljJ$)|D%J?i+lNV%TM5~|<M^C{@oTH^FMBOgGF-O) zp8`kIxUaFvo^>wZ{ru|A9Sa_XpY(8=go&W^N?tyz388KfYko*nXoPBQ1E`?YyTK4g zI)|O}a~PfODfX%?n}bu{Bl~QKQx_wg6MA%HpO%L5q&+(H6MJNEXhQ}Kpsj`4NFF9? zYfujuX(!AMJ7ZaqV=(3cYKa^&(*j{5THqR59$j3Wc9Glc)2ccb)!$~{^$ssi{#MOD z!0SB0he`$Bp!q;a(D8so;CiKh$XU&Q<GZ*)agXS(w0lU{PvrZnl5a_(f3ia-h+qEc z@^E<78J!H?R*$-G5g+_}_oAIbr>DCRs66a~+*k#tVlf)ug2tpUS#vvo8D6)2IB`7v zl%z)(o4)Je2$;X(6hAhb&Gw~cczUC!4t>KJYMEk3;y}VY6X&)?7R$~p->V9YN|VU% z2&&?h`qV8!1nP%PT)B-U&R`7Tv=iRaxG#$rsYi~AgM%1$V{`FM%oL%CRfE0`*Y~`5 zOGh{TQe)EB252l=4Eit$Qz>@G*Jw}}dL!137nON({gP>>d`$t{wgRSvO-%XLg|5ld zPcn4M2(~U)iwa;Q61H0)TS<kxr97l8$+AE`mM9fc3yfdi$3@sEe1NKZJY<z1Xep<I zkkZjC!;oTuIok`7Zsbj<ktDb}A19;jcMjfMYqame3)dTM0GrmN)j=jhoMl?)rv_IL ztSWixlX}$$E+C$6IM5|upK>U{UpOkP%jN<Rdes0$il&@Zd1qODS}W%`?1nsds&YCK z^g6G5a{-OfM+)-NguaR#`?VRl&__?N0%F<OCqZ)qL38bNnJ47ykiHURmaVUr75MnV zN&9WudSfZp(Rhue%r_A+qfUyDgA(Oe@gRzt;(@VF@#_g{D3(9L@`4rf1D<?8L;{`E zSkyL&;<(nw)x9`G`FC(lO@9&=s<BMwDG}GzY@CLkJr|uT`B5b-wXVQ;4ZXxUC%q&; z)_Q4X)HG=(*jfoN;ZU{PVaX8w%<_F)PK~)7QGwDFs3#;<Kd+dLm}2M~EqZRwtZeYv z<Xhe>LSml4n?$;b1SiPwXOp%=S+5VeYIJd_n{~=bYqNYJafa|lX>T?+6X)viNl0`| z=&nAY?<VcIH=a-cH_m{rr=~eJO{hF?1LTu6!-jG>lt}H{K~GBw)^JW1=YVLaTzor3 zZD<8g=K%$|40+}Yq-DajrGg+{hG0fXVECY0TX2F9o+<<cXS7YMbO^{Cq!9w3;i zfV9BH`O?pA1q420VFC0~`nClImjgDl9X9lflh{wqu{i}(1+XFwhMztf27_u>)3-_l ze$168X@9gSH0Wvt>|DhdcF~EPH0_w>+8RqVw#6Lg{-b;G-4F@nqs9N|9`?4o!?U@H zbh3*OP`Cefer|hp^Tpcw%JaR|7q6bLY;SDNNjfC*_PoWPHrBT`p0DoxxVpKuwy}=q zNZp!;lW-ySQg8FP`trfUhYud;&8l{P+TPacCc4>~TYI{?f{Uuxw%0K7)3wdjCm8uJ znr%yJ#9t)HfE*!kLk`6c(tO6vzm6+t$w11??)!)PumAYfS0DUsboL8>+}*`bXe3|Q zLVuiz;w3_5s=9R{+=2oCqLoV@VgLB#LA{{|)!p{ntm*ZimpE$o<DhzUfp1Ii@onkt zpmc{K@c=nUsw}U=d@dB`F}iYT-v^aglulj$8*Kp4yWnh(_O^N1nQ~;>U?B>Ot|$#| zy|IFYx9Yw@3|$~b8buV4{XPg-{B-|5!x1bagi|Qt#0vP|ZiRTqGs>u4W`K95=$zf= z{3B?tzWF9(c<T?U$TlpcPRonL+(P$gcAo-8!SNa~VIZf0_*;yexv+nW0kM-tr#Yv` z1EuEECp|VOdszEJDT8+cKbug*Ehdcdb=h3YqXjmlpM84pK8f4wirZ`ZKteRV)vrIr zEgiVO0rf^lyIbAi+ulKUce4xn2r?*mSbP)s4+J?E8M*zx|7U<~rLEo>?w5JQ0~zS$ z+y6Qm@rR|Op<Wf!?l0Lwdt6BC_t%W7eB8Qw_uIFf;dqf&-q31^4;mrz(>(s86b%zL zQ0ZP8Vwt;OteD1?ORQ`reL<_?hS6d$W$n_pAa8kAs%aRHs!>#%j)U`i-3$M{CI<wM z3^5VE^S$np)<@IeJ-20XVvHulrfrO3Pc#5V+{@CG@fr{>FGnXVEMo3BzfprQx#OtW zOLLAF=bP{lD3Zr08Sxtjnwq52u4V6ji5va`c;VU>L7D@o8!xWmu<d3nRMt4WGgS_c z0Ep@$$oOY{KosgfxWL}t$Fb50k+<^!5(dTsWN2z3NUHKejc$(WlGYM=a^)b>uVR%n zsY}mK!90*N=DJ9U`obo@aSI9VaS|CtnX1l~v0FOK<j9#><U_{bk%yhVi5zq0iY-VE zKkh#0zL%tHS<mj_mJmz<3&B-Va&rO6`Fiv$eJy!d+A)MPg96BQx4|hyX$j&3807+6 zGEerwKSy*rbVM>+M2y5wQ{-9At<@;YV<4Slq@p247HVc_$BBCV1j;6E1shd<i-c0F zD4zl;Vk(1k=%grAdL6bgHfa_CP?n$Qr4_YY`(J}>9rJ3>Dj)3lO@`@@3)N!v@O6tk zaUmh}Fm`&7-K$~0m?Y{V$F<12*Z{<rY$=g;()mpQeyl(lJ1MMLGN}^Q6okdc5o8DF zldAYnqbi2vw5hI(+mbV7yZb>)MBqTv2hI40@GkNMAtr8~9Z<Ozdfg1dMm;puJ|`v? zmSMYKu_+Pfeu`8#%Aage1+rI)Fa<PD98IVnFiN)=c^#ZCEwjxh>6p7k*frC)q4D65 z_Sh3iS@RvXWhS)^m*msN9jUfytd0&k=h!o59wDU{85lE<XEbYpE};{gp@Onw8I?DS zy<_LO=p9snRQ0S_2$@I>UZm9rm05sQJb~PvrS>gOUY;WKIX`!Qe&?^d_<Q~HUl-<g z9zA}&aG&J}W*_p$*)N&lZV`RXmwzV8v^JO>QiEUj6lOVNOe54bL9`%wsTDmiyW};v zL1!jlM0`B)ineUqY(~a*4JNns1vFUk`n^CC_g6X6#Y!u7jEpY;C%e1#BVDto@Jpnk zFMP_Tt=LKsKh)a7NpH#pwT9?y&ld<D;s+0AFnYsE@I_r#Txlyn<E<`SeEyO^w^%@z zs9sTx3i}hLs!-KdEe(jXAbFDb3|3Q_SJQwrm_2q^g{5NlsaDG1G2j{cW2nCdX(|dV zsRXNy#2BxHo)JP|htzT{yh~gxIR=k{?^?P-^&R}a^Sa!%O%wz{hepv)6&KGXhC7w! zy2IgsRXtiQ+PQZps3}iI8+H$~0@Jm=di|rp*shL;xJPn)A3Q#dvKeE$;l&7pcjNo{ z?@N~Z8T7|?v=71ZhEqGZ>f~@miEKEhEcTT)o3=1fN_0qb$Rz2Yk&^ul8a%QiVA0yv zL7um|5v~<pZ+B-F0><DQM^iP{n;w$PlUs}&cwA0q2LM{weflwP<4i3;Oc!soLy>lY z%#n9p<c^R|7UWEmto^N_ZuYhp@EFQ0W|*2nO~4sF-eUQhqa+1T+@k!1YnX+dLo3*4 z3hQ`x1of<caWp^o3Qhxrt&oH-7+$Vsa3pC7oNRqZf!DBa2u&$lH=*X%%cWaPJ$O~% zCZ}<I$&Z)JhGQiUZog7_*CCrK3;~q-$&~^`E+0Ll>Szf;xDV3Ibpe~lTvFU2B7Jsn zbOfe@V0#ePWOks3kPvB4UP9(Tx4+#v-s~RJAym!nbQb^qdj6Yb)%u|C-Tk6M`4jvt zE!<6Cgu*-O*52IttGtpmR8PfoP|ovi|M=o0hfDQMs0Rlpd$|2>e&$~u&Ch?x;Q9q| z{OUe_%*Om>;hTlW|I&L8<tMJ(taQX9NV_jLSHIuec=l{-b$jp0%FFFno2$u&5ce8; z19g<tH70H``LXn7F%bp8>li!k=<p?R1==1zFh7Vt=CVFOLWAVJNDUe2i&*0TyyUrv z1En07T})HY2_Y~XikBQ-Dv{MC?l;!cS$%$m7d4|HrwAyACRZgVz&uM^+#qAQgFv`O zTtGUpv54FgAvTsIPzu8bIq-#l%_kO@K3M=xDiW%6_C=wIM&e~-%#Oq=XU;mucJ&({ z;E%`^k|7D-XWob^zF4FtWX=K=VIjLCwAz{Ny#@v3BeqxeDBk~_zt6C6%3g#m@})!i znSzR(5Qyo{aTA1??4$b#5EXyv{wK=G;$ymq3$(`K6G4ucAD5HXUFrZX;|nN2SmbB8 zl6}jnj1iogi<>}9LoC7pH=%<FuwbSMAx$%9Af%@05!f*c7x$qAf6bi)?8g<H1`DA= zNXatSW)TzeqUJ!uarW9#^Nn(fHm6vgkF*rvBmMSRzda6FN;-qYZSBt3Cd*3@qm#ee zY(KdgV*0VPjr&u+$I6~B4VAfSpllE2-~sYBgd{~7mzRPu=f}TToyjdo1FSr`-AvZd z6Dc;Z%=}jpTAC&v0%*mAC|#OVJnQdujbR!vfJ4_hdLm;YU2%lZ%AHVrFJHg@V&QA} zV7|h?^I!cuEAAKT3anOaciihXHlMC;wt+-}5QSU>06jtyKs>aWLaB_Y?VYl5Hg1_7 z>^bQjp{|}biQ|i4ksrDHs*fTl^!|Gx+=!~Vqhs4TsW!A!K-4KMK87arEGBDbHiHg< zJ)#&R%A>jc>y4CTQD1i?rYUn))Ck5+3u(+mRqm$yKn+d(bG)Yt{yFO9VSYKv1?{rn zf*r}GW_ENt7A(JX3h-(~4BEX%;srd-7~zJYWkibc1x$Oy8EZ&%q@>jTN~BJImu>|8 z+_bY4*x1nYZhxVUxyUqpvvsR68IUuaywR|)xWJG_(IIPca>b5l<$*>C%#S3Kfx4b} zBEce|=)b&lI6-RG^*)!F+M$25q0@8s`uTq~sCwf(sD4`+yD!(oaFMD}5#=H%?Zkg! z%Q_BKzsVdOto4={=dv3~RV34O=NCMNt$t~ME+69Jmk`u6ThZt>VcBs}PRtDizeG+Z z-!_DIlIYIGd}kp6j(RlOg2th%B|&ujtZ1T&UW0a_T7px(KNCk6F5vt1{$_g#V>Z%z z1f_Y^5}`0Z_rGzUUVmZse^Wpyz`lzm!#J+I=TI;Z1`bj39dv~^BlV}FA2B!@Uf<1p z>YOoWZX1y({;IJjuPTMrFxIfX{E1y^mb%x4vp4Tmiw|p?u+K`~;*@~zxCD{LW=}Ci zIbzX$uQwU;4Z~LgYZP_*0tFpE)hMq%oiB8^m7s*Y65${z5DP{>k3dPa_sbE4d}^&g zONj@9ZQ>l`CmE}OYs)d3X4?~My=l$@k)VaP9ob<@3DAIz2y6Ug;wIEmv=x#OZHct8 zM>j+CAtzy%t;!0CTc}Nb&f>!8fs|gs5}xhv9pZSz!Ns2c>O8@XC*=I_B-yL&XN!MK z95Xh7eG5u0KE4<{L6*wP0btlNbI?15d}O&AR&6n|xF@9V1MubVu4qqE!JZEw21I<y zU$}1mf*5N^t?OJ~;M%?Fqn#|+5=B4BDjjbLeGqLWu^gxO`|Amll)h<s>G#6I3VU}D zh{`)R8W#$GqJ{_8Yd9sw>{9^p8|08DcE>*w3{z=+C0rH$O;Dg?*AB$}2KXOyo^kro zKgq2r<Q58{T{|%!d6Q>Iec82tr^v#`eY1T8squ#779gP?iI@7{;JCR#H!A*i^`E4p zLjHa~{J;P2@t`;CRxhDobuOz%r&q(?`}g1KKT8b5rwRRA*auI$Hajuh4z!3lB%EB* zV~@(DDQ4~>f)0IU?$!FA);E4yw=LV%h*@k1gVpyvQPgAg$MAS~*%u!<l!K(4e<DcT z^(Xp}+M+FPJ_ynu6`YVcWZ;P)$Aw>o7&jFw&SBO*M&&X{dN^YB*P5jNR?fy5WcE); zF`o+R6+@Ag|8k6thuT|FRrJr3;VutF0R8iN!AYQ{<hB>l$t){9c|P#a9F;ag+3Q~v zs7;h)Tj5eYHq0WUMs7eMAbQOV9V{|HVmU-T7LkUZy1cSU;zkF`mQt^iUOm=>;Xd9o z>SdH&mjwFtZ2Cl9hY6)auM}rHoW<*S3zwIP7HULIV@4i3MMYGn-HL-MET_HVtCP$J zvv>wunBZPYfkGq+@r%#ru!q~+J6DKZOJ?@W;^Im7^n4~x#f$@kbv7LTMbXT+a|{h7 zgXI81o!6<hwg4YJ)oTZh>1(KQJvu>x0+eub<aL@h7sIR49{>Un+KtP#_;>;pRKjXF zQ1KyPLhPp6;E5<<gGfHk&m0`VuZKE=Up^IMoaQR5f6T^dM98i8{1nEceZRrp={-HY zJUh4Euy@_QzaPMxx9{b7=kHe^p_kt1;`Y64^^TF9%CfB1SCIZUNBi?Z=de3;4NAY= zvRl#vR?tZUA4SW$8I1MLwl0s4HA4`4|Fu=d)whZIXK0k)Zrj%?(=k6vPrA$>r7IS| zK#hQl?u~nUf6$d!hEvG;0D&+ZW(sFwZ-TebY3SuPBo{i_&98aB6=c*lM(4<0|F{$0 zyu^)aXWanu4Pb;n03kV4BQSF#e7`|ol#%G@X?OqfIP{}G-n_Su*3oSN(f7ByaF1VG zP8eoh4hP5sAKey`KU+@ojr&nM73JOE-c*))54cJ3c3sHZfJAEY-vF};i1zXhcE)X3 zKj{m~v0cM*JD5HaIO?*x0Vw85Fb9Qx`$*l~W@-kO{&Sm-baz9lC{&{1)o%Xv1``!m z^zPQx+0me{#R0C-iEP?GNa3mBZu(`4KD?lVY^_gW8ZzGk!nF8)9b9>r6KX`P^sB@~ z_RFQ2+=<FpD7<|HSAPdq>**<CI`jj<jy+JDJX8%{yYTmT-*N?|2)5uk!!~T)sf_+o zyWNizZo}lZbBFjqNAMX6SfZ-B42v{^{$U5V5<GdnhHl^XhJ!xOh4|a`Yi!{FfXT_6 zp=4I`b7xn0z%-PHOAjjej;Qx8$h~fNX+4VL01<Z>&U_UGGN3A&LWlcKU_z$NXu`^G z{Mo}H&pP`owe)fTXWBszh<kJ-zkEAVYFYx)Qg>VeUV5gnv7$zBr8(j;#T`rA3eVnk z`WM_1BublD$Dx5)?lvtoi^D^@QHq~3Pg!VaAgFR*yaAWY!AVd@1d!+>2tBy71d~WE ziwTb<r5}|{2mPY=6VWeZ2j-H+7XrH!FF>uK!fNSdv3=(GDBc;RUQ$BXgh|;Oq|)kP z?R8pJE|3}@j<yHR;KJSMTGmgO@=Al@<-tYpcXFZdO7O+rv-lNmPN_R;TaJfWA96}U zVH6%vA4}}Ud#p8a!~zboix~#E8K~A0i`lt6b#s+)pF&h8F<*KScV)@Dhx2n=Yu~S} zZ=<9G5*cz~zP#KUZRtfNXxNa)Ag;TS7`2Xm1269=1u~hnzS*=ky9yK>V)(#{fBNaw z*5<?T>C0LU<#-=*a}q1Pa)FlT+eAMO^o2$(>l+&Y1xa&V9tEv*6Jv0b49eQ`*|)Iq zuu7`LNwif909hNtko_<Y3?}ksiwH06azP8?8T=6ZgCrq8U6d0*>5z_xi%Qc8q$i`| zv^4@M{lP_Lx8igUm#P<?H>g2=i3f6D4!yX4J3r`Ooc>L3C719Bb}u>ViGA`=j!;Y6 z8ELn7cP5;Cjw4`|xD6dv`&ZS~;Br`<pPVCV)7zcHIc$5l=Q$d<YUvQM9&EvHyP@_6 z>9_9qR5s2rF%IQed7FG8nOLW?T3T9~)xJvRXj%K_#w3E~Cn;!2PzWoe&VI|`DU=6J z9W@E$pAd>6ybqWu)P)ec0v?cJ{SN8^oysVdMwJ5E34JS2VGg~3b?C+F|LlexOmFS7 zeX}~k+3(R(_1zV3`UNRq#owJ^%m45#Qf%H-WT1Tin_u{)NOLUYJ9@rtXr_S|cAaMS z<PN^k{2c4S^xxv7Y~fY^c2}Rw&plsTU){p>ydkU2MZ6>>{?P3mpP+hGBHxMl`1+HL z=dWI@w|DRp?_0{=k7P^sWt2%1jeCrtmT+p+$i#WDTT@Bi*4;qEOvSwY(1dPZnRV3M z=`12x@N7oH_&V@2wy*7z;ou!v8O2-{7`XD25#>BMRUg~Wg+oEk00@${e3=-xaFaq4 zhDCN$h^WbWiSeP<RfcqS(U>kdUEjs>N1XqnJj`BXiV$RG2Vu>2!5E-KbN%gUwOt$@ zDNtG?&Rvu<yFi+J!@C6_9P_i}KI1sNl-vDmHvYh@{si->mDY%F5f;f@qB_gT@-JrQ z&lZjIVI^)D2*|pej0FxcRY&RI1%8r+3Y(@;670OA-Z8eewT&^c*@n;_L<{tV!}Pw+ z0YvtgPJXGxJOIB0EC|2Ejhu6pwRGTeaoV&%x}(pU>B0{97bnbbC8dE~3Ixrjv*~Ic zHs+Sf0(L~$NM?O_tA@P;^kYb<(XI^ZPr(CP@j0}Q?81ip6SfI2Ai)*2pL4`$JIp4u z`r2cg{)qqPQ*USX_FiHSzqABn5!wd4RD%Lr<9;q)QGtCGAC9|+_o_GD?s?VIqyYyI zFAnh9@Lg{NiFMf@isJ@vl}i-Jly53YL>_L!j4aKRf<`x*Qv9@_dwMBEP$Ta6jepa> z9|g&0nIvhN?yN+~qg<LsLP#b@3*}|qNu}^9(KF4!8L$QC5k)!D;<xxoxI@)icOH~j zktTttQ9%9ozb~6`tdx7uBu7UakWJZH!s4-MZ04y3KCZUW=l>8@w%M*c6v-^^?Vw#) z3XoS2PJTC)sY$Wq?w6=(az**e&JZ36sEg{Pp5MXk_2xpLzisiyx!0acQZ9(8LdfJE zqPEN_ixG(x4;zpdW&dcIUZvV;SWoi!<BHUGD##q#ZzGiIv3SSwG6s0o8;&kK@BkZA z)Hj@0g57liv*EHgI-#*Zha`NSa;6DiI~J)hwVq^xKUGf`AMc}3WHN^sM97q|un&f9 zFhPFppaj4dB?WhkvrhPaw}PDttq2m9w*XZf6Y$<gnXlfV=JTDv)!Bvdbc#^zP)(FH z@d#$ioBrTkKh7bdPdq|2)xtuU7l08=+uIWk7O6WeQP6!S6mil{5$y0YE#A=}j~%)> z=_)d$u7a;aFcUmD1(G!P!yX-9auV4ln7gOaj4JlozI!TqGLLJ6W*By{h~V}K`s5lR z%jb%UP9C1h)+!~q);BbN&FFYEZ)X^x&>UldW5=QdIe(1iaZ)^BQ4mPKpN8G6t9eH< z);N2xyu9&p8+Tu<Jcp6eGC+J8=Q_ZhPf?|9*wb^5JfzNbTgVQ@MwHfB-cV?EyHPO7 z0t}Pm1>BXghWJHayxQ6(pYg#Fr9{;|?K0@VSO$L-6E&<Y3B}!8aW$|$5CsBu95HZy zVKIKlIujDX#*^A9&V^;Z1pTDY7Sg8cKvi?Dffz#%^=#My(k`&Obxt87kkSFClGG7V z-FGGV6{3q*mVD+it~U~Cg}UK*hYxe$i49Ib4Ep5Ck?4_ZdP8sspAB%FndBn*#1C59 z6`+YyiDxJLa|Q}d(#6L<I<U$??zzP+U5}QRS2s5|HWRs~9qE5Ln+Lk-$;)bBo8sS$ z0Drx{QTY@88!0&b6^jY+n~X$nRcVMczdn^Ml&m-hO1_R@8%J8@5ZMv@G$>lGMuEE8 zzK$ZzMb8NDN#4ofcc%lCJcorufl?%U0K1EiwWTym?w@z2X2B=M9_g_a*#dtp1dwtb z)DN+W@q<>HE`U%?Cs99gs0x@>blV|yv73iy2}Dl^bmCUr6IkO0!bhr632Sychp55= zuo84btZ8iN{|7u2^ki~h!9e+%G*h;{Z>hX&!@rz?+GKEw@;Fv}m&+R7O<Y4su4XB+ zLUS;XX%;dmBg&Lp<2Y@blJ^i{OKlVvX4K%ldw&D;BwG>wHJv@_Lp78MTVPlh6KDFq z!kpMI(;u*_-$0<9H3XX&s_qWAa4ACgRLxSclOJ1R3*k9sSNPHb_V-8t=YFm2=%2^= zfzjZg2ff&`?vu^mJ@vX5#~TEGaFFalvxx<rB{XcTfbIdR0CbJ0bj8AR&M;`<(CipS zO@@d|9ZAfWv*;;BPs2i>Z_9O>7riZhPt~=S1reDm!Fs|Qzola)l!PVGpiVi`uuE$N zmBLsZ4Dvk5j%Zt$qKiq(6Q?zHec}{a7AQ7oTA>1{W>Fv_M;9qeH>i!+V=yEF9tVs- zL^_~IRDlrRD3twTM{{~9hKXIakybf;O=7GZ9^y8Wm|M+tolU=Erxo7x;2y-NC1<O8 zjhil(j+fm0X5h}uj0snuSU+7xudPE_k{~MM?@8)+1{>qe4JUEAXz^v~ba{FEFE3a3 zRyMzX^<s5>d+*1U=dV^X{|LlFd}sUWoM(=pvIkSCy)o7Jx_0TJUzB{1gC_xT?fD0^ z>b)B#I#|9?@7JIyB9#daG<;vu8sCOBG<wrJuTFZ0hlp!hO9ZS@5FGA>&Ik+|e-uW( z!UGI>cvWGlto6rmb{7RuGn0m$r~B;U<KE~883fS5y6|bqE~+yZGey<71`~rFLIs1T z=CW}8^GPIIe&e4HAb8V@W^5wKkdf~7r4*fM>lHx-Y+@-gMZ`8Cvt?K|uMd<%oPSIC z2K=l{^<(E0S-@_+AN6Rl1vN%y+3YooL&rhdDO(Nqz4etB6Un+nK_k@aB4m*i_wz+j z#fmqeA#XAr_&SNE4Tk$@W%cgbc97)Yf7No}6cBOKt!)`DI>SUVhoxe<891a2K<j|? zLwPyIw_*$h>5oG-WG<yRTwt~C`|iOd{g7=F3D@nlO#?|S!P_``(z%pqzOd+rz^M6@ zid4Rq89{xMB#2wjs9CFm%2uXSXmND@7k8SqC?y5#+&1lnmT7!nOoKrNn5Q^mdWw^X z^zK)kBRW%=2rJo7_|ewH7VXAM(;KbW+2GZ_qytT$H4lKaOr>0rTTG>OO&nl5%shTE z9NsBcff_kwq&wT-%l4zbZ780OjVTl-pf<|p8tV#L30ne>!0AA>$PZAk46HDkU!q_< zlZG;Dkm?vHgicE+EZE|JC_hL0WjgGHSW5w0E);C2aili^x>lNU031;^R11gOQ_|FU zm^Ql?mqSY=!$mE}mA`4e++;a#hrmq!7f9p=8}fBku?hQzP)E%LH13TbLs+aqF|zfF zCDK11Rga_+#OI?&_vHiqP{r`+FR^=FX4i$HzQA8{y1*`}^N6p+=GJu1vYe`I$Zksj zuCbYB?qY(Fv~&oXv~63OCn}7M<eO>Ba}2Ts>XNMT>G&}K>)!nMW<1qk7F$PRg9tb! zrz5Jt{(m7~vv$YYnx2TzZNyxcT^0Svmq0ZDMD^&-L<mCk>DuJ=h7tpgcaa#DU^O#B znL{!D+7S$3{e*fr-dTyFXj*s+QGe}AP5n~}BPJcZ#Q0PkwqVj1-SAgVU(jcx#v7GK z+%iOhx;=tjdvt-S>yA>Oa{%TairL|vR_Kiq%lo^@av1GAQCj?&k&m$iNt{^YuyiG| zjX~*`NnHqzN;T`_&Zr7?f?&#z&tmJ|DCicog|eyFx@<@nv6<#!G+jl?gly0>BsIpB z3X}6E61>JP&_lyj1la~HOP92b9ast`q~P0=KfGB^|auSAW)L@|^f1x}p)+X?N6 zQv~KO4nRp%;-J$f8=rLEf{~GS%=-gXWner4aH38gPRj0G&@JE-K&kU4kc}Q}tx&l+ ztXdGgQc%!-j$PEaR_2>quwvSmldp{^t(pgkB;ay1gQLdho3<%;u#NEKUKi;Mfd!Ea zFMLd&4-IW+RpY6U>-{8?{o$!B+6VzYk+18ufay=n*gi(=GWa)ixWfS=pj<DJ8)F$5 zC?C6-v@oxdoytXAg5tYMv57~bYnws~`3cSCvxt$fMxr9`5gRGX0WfU6hrOdCED9o7 zvJ^PUpsi5uis{Yp2B~M=mbp5Wx)0SU!j>lcz>_lHtVp>v2l=wwdXe&L&t3UUmm1cz z@Ehd3T#$<W^Pt0%+SmXf))PuY!2y_ZXYi-@;3AYMBCS6j@?aS65G5z(a0rA>tr8t? zdo%;>To%X_|2N}${=%f|XPk4Xx+*OcSc$w#1X`PrY0|=`;W@fZPppY>q<o}1#0V;m zOhVRNnuI?1O4?jD275J%sR$+8JKHCt#0EE&4w6>{9Hivwo4Opzi@Bt2GJ=-rSXL$< zy2U}7oN^zw`Hm%S@oQ!)tS6@E|IJrkf0txB6ADQi(V!Z-5jpNMM3LPtXA`v$9t|Yk z_HZwn5<aU^jFhP%dCeUUr$@psPM{^0*AQ}dsc9JDS{<Jb_Hk<@(J6T-$Uy7C&DA-5 z*SQ+0cx@Hxx)$Y~@WrVa+w!DycwuFMKj<=(cEiBTXh|L9aW7PSM(4QAuw*V_Kzo+D ztjl&}fo5-Xq<ywYKvN&I!h!mGL*&z}oSv>b&agX#al;N@Fln4l+H{Jo{o0_Yf)F{H z9mJW%PeufmQYIIV1{bx`T;Z_JlFxRKC(6TSas8kS*_>;n{S5h4+^G^W4e#+h9n44I z(oTGJ_V;lCIl{hUT&S6w#AHVGt!WcsU0U>sI5c*ea4WowezuR}6@$z1W*D=@!WfxA z5+bjWI4CzXm%J?{q=GTxf+3^ee8{bV=h}I&VQ%NI%dhV)QxVlW49-wSc}^~H`0q=c zVCMrb^gYLBaaDL3&k}CsVh71N-q=8neM?uk=MlYr_^TW%6A<tsFM~iHOfrFluE}wt zD63>s7O#0n{BkYMDBJ}HRU8L2_4KAIlOxXwqEb%TBnm@Vt)L$%mLtAM;KKY#@<@Vb zF4sz$BNr!Mn_H8tVAl^3`m6lL@^qNmYzYki!mM#S7D{{X_Mi3+CFST0o^Z^rH~MC` z&xSMkMEFx{CMzF~@0dEDI?G1gF#`no%O3fc_8RC8aPt`p$7gfSA&wG-jiXi=XuigV zsGpC*I-O&lgKOzHb_#BQxD|Hj?+N)Q)P@cMeeljUY9R%I`l`it3)SQ5q2*$-?{d+n znnEDu8IW?aeeQy2dD}3=oePttV)2VL`h2uR3<vn|IS7cAL>49ya2L!bwBx%Y@OzLF zO;6*}MGU(>sEEc@7XcK+)_EcZif8<7G)c(Y{zkdZjzq3DnTGH%VkbrE5yaLY3-1Y2 zxGX?@O1ssG>?_h>9|sIw)XT**WO{1<v=3=FfUnZMgM5%|EKMMMYg2!63+vRUD|5a1 zhLY_gwJk&mqUK<dtzL40$7xOmAt(~pJJ^?!=5M8*P(p@`DcZ`af|O%WJn%2qr(s`8 z^JZs-zL6?0{3X(E{3JVo;;G$UcTx`wW;%HjTL7$6BaCD>G5ncz@J-l}H6vg9&DsQ) zm89j{298VLLtNcjgLTPny1_R-k3fDT4WUgraEK^$C#wcelzCh(aDBKIrWkl%wT;p# zagqYkGYzC+n7H_Gj$q6_g7gMVB@zO@519M!y48R2G>-oi#G9#kEdbLbw9R7-7G{4D z0DW9c^HKG%q<rE-4Sk6x&D%wwyw7TgTQHRfk^j7mL;vNw#3!bQ`clZeMn@{rL<chS zOfr6G(V&_Wsxuh|>RY@LXRf`5tAB`;dlj$#0YI+Eb8P-aMDv^P-kCyY%VSy8Eh*lS zg4qwTlI{QK&}2ii&IaHTo@~R^uzQBkL75g+M@Oo8a4O1qo}80D<>9TqmeVqMQMds) z8~&Miaao96&Dy8-XpRKF_DiC&@H_vAoKIS3qP7<}%1JV+Y(|IUbWU4oSC7(_P6<Db z0QOU|sF1mBxpgC{dFIUKUK83hmSKl;h_qo?Kq=6k$N@Xd<FAS~S~9&0$LDxEa)rIp zy!SZ$p7wCX&V+r4hqSULBkn!LPdS}BL?W)0RT`ZHp<Rt>Hij$I!L;NCE__ot#Tfz` z$Hu+tf2lgqMZ*sPamo|Q6(Lf_SJgRfU1!B2o@oC~y|6bQv7wV7g&aijmnSYfpGl4( z_8Mu1-}vX_tWy<6&)#PZ_Mj)EAw=y1y_lv~OgHw&?(5*Vx?_VX47?zc(%xnv=f!q= z!L~};ChJmiUo)djPv0oAj|wbOXeQD(LQ7HsPEcV*Xn3J@a&}lys#<<RiO$Lfd#Z}a z3um48xH=pI6+K0**Sn;Ote=|*2N%s*N4xlBM<JG%<@PviWn!$6x3pP_vy7UpbutM$ zb&`GN;Ox+<(<CH=z7x!ak;pY+?k#NN4V2)~`|EU5YML!kCzs#^_vUEFq|B(>86M#B zWOS1fNqHofJ@C)yuqoET#|>PgxWtN4N7_5@Ffl>KQq)3Ms!(?h4l4W)Rge-CA=)Z) z!{(cvOKs&2W{h@+<toBQkfItlKzcjBs82yuohexq5bW;+GI&SlC{?vxKKw5=BRwo% zK{Zpe6cL%G@kX`+CRWD#5rWbq&1&i&yPjf)jV_TVDtoJ2IYU5L$r*&YTcZtQk(%Ns zCy)#&^X}Vd>WO&wx5hEbb?`DrSCI{-igJj^NT@7$IGd$wA<dPdbdF6q)jq3gK5@I7 zXH`S$+y&H-z--TlgSR~#2na_uR9xMy2()bYC=!E^5Ph~(Y^0un^dR;Je^N0lPkokt zM6Wf5^h8NzLJ$dR|9rRsErP9w#HaL@a7E>yvs{rJIw>U|o4EpSvrvVrY)G!~CCQbk zg4c7oAC{$5GweDecFVuGH)WlB_z_IK&gGkMu0dvFkxw7l1NuqavfX2%z(hU9(*bf$ z5{06WTzoTfVEvop&cTXUi*Gpxa+{pm#l@u^cX)<4iT+GI)T21I*q$Jkp;kA{%}U-g z)jiOTn(WmVu=ty(BS3E$C(dlPak4pL;?xDohNUkD`i<x$%=shX>mNvb5y#CWsLvCT zy6G8ENn{>gl2MOE1a*7YaOKEyl{%7&0{^pMt&GIG*V)78&9V<wuW_UydLD{hJY;~% z5H%5~P_?s-yw!Rl3N!^4!QH-~SSnz0%P(J9_zD*U<LAfFq^re6elF>e^lUnhynVTk z4xEwbU*bDC`6sW?8!Sr5YmK>c(7bV6z4*!3(PphL=;QJTtyap~_8O3RImq_<N>Jn) zP8l|oPN;RUy!_+p=64%gYukU>`}3={)$L^RW^tq9lN79sP$eZIljal&vV$e1I`T8) z<zmzT3_99eJ<ohYs&78?J4Tk5QP!n{Y{&49ftwF0#@g0Ze{eqPiHqA>*#?DEkqk*` z-=TEUIHU+Q=n?r?>|qXG;A`}uYi|@VM2P%=$CZP1RY!PM<E1uKII`bN28V;f=1M)J z2xOh1l8K<{g@!$Wlboixuzsbzg+^(XkD0L2)M~}cwH;T$IF1AC4@SL<tNLM7LF>UO zi{XN)(KbtHO{1o4$-mi)-US34MF6U?_b-m-=c;Pw^U>#{*Ok=AkltVbnNyoZdePeE z%5sy00;M!CIW^Mo946ZW&7xY75gC!P<?CQ+nO!Yl6c}p_k(<;i4E-o7I1JG(cBMPb zlYsQhx1Bz2lQ=^X$nN_G4`!M-c3&jmMgk;Aoj8TQu*V~4`<;U~^K<uiI*Wf_S^R(Y zc6Z<Z+tDKadvx@AXBU6^`-8=Q&mP_VA{m$?FWvoScXtVO6z9KLe(?UApO<&=%Ihz_ z*xj97;K$D5(aPd8{BR$v5hxooDP;g>%s&&7yRvFtY<Ttzb!1?SN{SvAYkpp6LvMlH zleXxS_ZRZ|#a);H^VUPW0@@mIv9Yl7jvD82N@5AKo1E|o7i?kYmvWJF%~{BS1g2V1 zqqhjr>oHH^O9JWbzWm|k9tzj*y;%9r9GqFXeH}xjx+Y-^N*1_Ogzx{y-rH}*b!7R1 z|LZA^)p#=H5}*&;?WSZ|7$KQ%3Dkh?_7ZMx0tsXZGU?1jG9`K5Vb-iQuQ2OAN59ED z$^3r%BO*?mb25_;xvK6J-DN@MIT1T{?AWotw-W#yfI<N14vFCZ*5c025Zl)0o`gkV zN?c~NEJ<tlj8~L~H{fNoE$M~+{e>FB<XsG^NSH6a)O_Zq5jiT%)_`puu*35OLv$aW zV)eC)iZ*1GXm3Y=gLgDOF5#O)@JD8TA>UWerq2JT;>$83^-X(sBv<)sUjbjy;cAFM zCse_MCbneqM$w^sxXXX}CghS3=OG)&%5jCX+i+8T96oI1qnL^8^%1oL1ad!S`j`J6 zZoUaOb8D?%e2yA|KrQ~2NU=Q>0HE~bch9rliSlC{(f(qG1ge+P3%mp^l1G=H<GL>I zWdlN0J`*o5M*wLg>yScDvI_kTvkAimpX_#UPUQLk&E<3bVHaW31~}l{fB?E)gf&YL zE3nD5u=}}%uyk)t!DrwsLg^Z#!ELPL;(?e2_Z4&(Bmw*{fm|hsD&fdvWa>4Gk{fhh zkNxZWr80gzHM5aJnS{!Kw~|0aju-@(P*~J=ry__=lN(7tH!n50faUPD!Z{860`W?? z|Cee`ZQvx+U?(cTvb$b;9T&D%*@0ya2I?{5p(^}&PNwCZsAqYbP}Dh)%x({J{&DXR zUTJxcRU%z-kTQ{!vRg0)Th&b+QyE9#4|sy~sdYJPIS8IW{g;tE@%q;~p8$v+`ehGr z^YDmOh5W<JD*_ue%^qSY^xHodfBMs0ukK6;0g1>#EXb>`=X$@Q{3S)*)~{?ToD&@1 z;m;hCxw6;z(Ui9wW!anl@wB&r-uz8sTp=X~E}tC*)vnU)McIg{FXrSM83&jJSO$ax zR|c0#dB=i6Y>=-E;-R7p9+&VL1p2l~^n4Uc!9T*mE`55r)G~YFCl&T^NnNl!>hE;b zV+UBWGaQ>&3^<3x9~3i%A~69WSWzqQYe6ij!6bHXMQ+HS92LBG5q6~Be`GYpVo1O= zLK(G2aj=J58gx}hg>DjR{Y(9#z(_)Mq>R%!rgCGDs5`UP{q6Kez2=I)VJ{F9`m~Ew zPnH2|=V7<8HoAOMDw_mLb6pMU{$Tz}GppVbPfR4AORXByL&5Dbu>)BL<bw1430RQr zmsBg+6uyP>s-{HM0W(6^cx2VI=SE1nItf}jC{TM1Q0GF=7xXpyVfDp}-C!}QHi6j( zc@^{bm#SBRA9HL?m|)Unm>Z*bPWXfDi_V+42!14!-o%_{w#X#RNwYq<ft6y`Uks<K zmzetD4NU!X_4^;6&o(DAl36vdX3`4LWY&!u{9W-J{MUJ}I~MZ)uL<OT6O>jx3G+$8 z&|32jPqY^{u3;ms`L}Q1Qqhnk0P1ZMA7<Hm*vh)!J}kZSu*9u!EOTz91@rkP-xL1h zbJocxDaV}YST<2i6=4s{hct5CiR-=+jvkb7^x$ueqbUcvimC@!Lse<j6R{eo>Hg*4 zseR*bKzYr~xr)%_tdjdgb`yW&ah+!fE5xia2g}ciV-`2pjQ6Qr?k<A5Epvv(Y1#Fv zEz~mLBB{i+%<ZnO|Ma?YJ4?<&`Stkr-0s%uCUAO**L1=}>_i=56*!a1o2QT>bC=>8 z;=)n1LTa*m`E*F0;F3tJhcyjN<2#5Tw~DQBTE=Q5cU6-3Lf_W-j?T$QdTVH3<AdTr zOWZNW<D_@ko!`IMhX`#&narb|gXCUL$W>S9^4BO9OLvqN4H~HwX0cudLPUqqgfA;8 zM`MgFO1w5|*4aWZx7u7G!a*O;iCAtY{VHe!z>tXU%cW-L`I|gIRvy`8O4O0Hn=TU_ zB1OjEWMVaX*SBoU=kpkZE$g9)^J&XX0oQLCrD@oXScMvx;%5skUi5$1>mJyMz!Od0 z@hEVG0;av@GvkiV{h5(^bFh6756&5t8jsdJ%{O9v7S0mdRmaMTDDowBoM;ngOrI=4 z{*Zy~Jfx*2{to+za*6zj<e+~mzPBx)c4-NmU~4?SSbmGHnB3EP{~+H*8-ek~OLgV# z2yX*_?e4c*{JfYy%9{iDeBtc8uC(A)=ZEfB(>}@6DHU&8oA~+19=-<cNp^-kl*_RZ zAUNsc=%7!UgcDWQB@W8)dYN*4h5WZJRYN|n=wsy_DgVW@a5=&c*mVz)p53ektT>q_ z<5`<kK=EXyBv>^@D9yPggRS!R2r-W^;)s@ue^uPaFE(;Lc1nOv+C0CusSVqH&VfAF z5qxFaDEHW;J+!$ZubAF61l^#~(<Wo5>CVFRx;`jQQIgra;~}9Ksbg$dLk`hH2^v^C z3OEm$r%qK3cPr{e^#;Sr=KH|h=+ENn-ZwtT7v$k265p{S2P$h|JxS&8$^Bo%mX6!^ zCM=x~mI>5fZT_b2Ae6@_{}l;1y94MKHNvX#jLu9|p~x0&H`?8BONgtL+n*y?@wadu zMOalX6p1URM2|KKcOU{{CiGZ|(}2X-01RY9Y*?JEoWKPeOD`QTI2P8|<e_e#1s1g~ z**>bjh!0nerkfHMz1n*857cy73eZaPsO2aC))!#o&bwT$ozlVpP)*Wz62b~ClY(C) z3Jq+wTc&@Y16xE)^!f-LMtuacjm8B@k`>yYAvt`2%qmnW7rdyTdx9Jq#SXsQM~3I% zwD(s<t4LiD$Z+i9Uexiy6%{L|Fv4WLVnZe)k1VkU^Eo|DXI3j4FJCUNKTT%hc92TF z*N|<-*74x{<N%UQ{e6x+;n?>z?B8T^<xI8a7k-frXqQKdw56rZ)$JcQ*LPPop04gb zUE5mz{>AFkh#VO^ZboP^8v@@jK~5!g8@0+dOSVmwTZ;Y%TWf~ED_k3Oy{61_5WC~l zHGSe{X(KA^S+Wa4x}sLB+NapMe9ek#UeYDn%Fq`OS%)GM{l?uX)C^=fcnP+yfT``( z&6jKI%iF1iHSkr5nW=28%I0Z1;CMcr$=2aZ2}++$l;!8%u7qI^nRXi8GD0s+%BqIs z)>H+p`e(oejr7+UWg#3V;dU}j?uqe5xt!ZS3fh(U)}+q92^TgvG%07pm@(^vISmmu z6!<GNO0BLV-CvrPFN?_8rq{}@MFAeBB$T~aDf49ur_7l@`Z|2*{R?Az!Aft!%~g0U zHdmkGlHbPtXvdtFgI0L&wh++}2Gs5ZZCGrnm&44~nm@*W1p@sJK6!Ql*<IgQU&Yr? z(S_~=Wr6v)Ts^#mOXVjQv<PFYG{8zP`UC}r%FF6l745>V0Y#YaF1)8!=-C(3u!7Vw zKXC~Isf(#HJB&gX-d3SuT(g1;a^8M;%m1ely%|Sq{e3uy;DjP>^likO^0;}_#uB3J zAm9KF1fHERXByOZw|F2QihymC+E?NheJI~bjn!sINA8^aX(EWejl_6r>hf~p4HJk1 z5>(JI_UiNHZQf^i;@Myb<5C-I#HLf7Ml8H}Fz*!0>sxEKGK@qHUQd&?KF3LzN6$Kz zJnf9$$iDX6VTob~C=iH7xbR$}?dGgZ!441Yi--Uii6r55|5(l1O$ANN!bmvJUYNut z>=pRg<?ebPZZP8y!V7-D;j;(X$dsp<Ijh-6_>&!j+&JY=K0QC>%hpUNykoYg<}1TF zr5W&GiH_B(^|LGEiR+OrX}a23*lBpB2~k8!d`Qp+nnai<eAxPVKnSZAH+=VMIG{pN ze&OGZl>F01g4*<~7|$(*c{xeg#HHiGrC<gC&FRQZyS=wmr-L;Bx7)Ih1WHb;U1|2A zXH3($sP}X|5g|w&;pqr8udQQd8Lkb7#MeaLMkzwGBM}T8+R5&#jv(Lqifm(%DG7dq z?%Kx#)Roo}DE_LYp)9{z6K-dxjmH^BO^Wm$^oGb%IJw9Nbvt^p<fgtcmGm`zN7Mc9 z7T<wmFf`{BwXzyACkd|P2UN=m-bK_wA|cv|4LFv%gJRPX9a?9Bp;$)@g^fmN4}y?X z`BYP<<w=hNtsKy2(3io(V;vA)G?KiB`fBVD0a5?t1c(F41WyLUPGI&JjkdWBT3;B{ zm_90I9e!phLzA&y;c*%5R?5|s5s!B1L%Agq2uQ_3*BKE*@<zqA<H5-R_UQgS<N+kk z{=8aFYGY5ver3CuevLC|y~ZNK#9RpADk%f`Scs^@Q}lLabtdIyJxgWfButmRz(b{8 z6h!|a#U6%t{V3iA94Ne=Ln0u@6;Sk+afG1i)hOvK0MIQ9HlZaXo0W%hUPlo8hdRt> z_O8sr@IvVeN5u(E3+iU&%cae#%vAh|;flW35rsZ2|3wH`Q_nPXxgK@vL2H6%!f49C zlBp2`{Fb}T8sP{T9d~=MaM@l#V~lvH0#2ahb)+VR+`+KTi^W4mW_TKfea>XiEFmXM zLA$dNNz=-vV47imN(A6X6Sp6kyaGCOF08z|wj{*jWA1&_g1IH}ulQTt`Di}Pb(_gk z2h?T<nDf<cpdM1&y=<#E28NPH>b5AuxwDem^C(|352^MgMx}!=>$WH2CjM3$gXFAr zix8s<hFmT^R!X759Oj7#2Q*)oU4KgGP;I`bJ<Pu+7v|2J(O?MwN=ksR;%{wiZlh%% ztY*tE3KX1^zn{HWe!jc1yp`Hg{KC~WXo0|VtR}f1erpXOa1qyp;#vvDg$=R)m{?Qa zs0R|V>HaQc`<-VJ5?S-zf;HViWuq-z#?jV+t<b>D>gCrP!8}^lk@0j8M?OHM+Bwmj z%F;xw4~Ug4<(CN^XEW#92ov;be{>#<@!l;Ce7(dI%^t>kK6uEuz+``UbnLNGn^@8v zBhn%_i3I9YL`7A<*Y6Ue))P_l`kl#@@v~)$13r|~e;<~T&WBKgbWhUhk?mQQ&1>?} ze7E&qH145nDTyylk_~W;hj(Qx7mr8hy|G9}U})OoVSeudTEYHthq1Wue25Ru#AWt} zh}m|u`ao%rXRSbqW=aGZ8askXQIlVcUT_~=+|>tnRSdo3V08NfG+87A9StB*gxMv4 z=3sz|_Rwu)aV96~$nXyKyZELPwHUyp3pD(QgpW%7z8>7^2tz3LV2(q5Tzg1H4x2=} z)#D+tQ!pR*ky%S&7L;_lhqPU$Gw=GRxR)hSP)!ZNFPKxhvyZR^@jctNIs%<LA0K|R zCF9%dkRo8cshhsVXK_3OyvgCP<fd|BrF@8C)AWqF!Qmm5?^3BQi`dspOR3_COv{D$ z_wQ0ZzW4j$IcJTK;t$+M%q-EtD&}>c1R_|FP$b1QqJXD4T(ad9Pn}LvV(Gl(-safm z>ma=`tTMb$<r!{0q<WfG&d!+cFVR>Y*u{*AKmvT7KSB!Fa%`IAl<_girN*Q%L<!1K zaugztoxOP2bqM{hq8g>h1(NbI{khA?hgch6199Ii&dx{2-ibmJ5OD@nV`sX<Y3B`3 z$vgR~vOuK^OK0;!UtA+LPZv~$)ybx2DUq|r-_j{8!H5$;Y)9@cPlFT}E6pha2A+v? z^V~V*zwHcr<XI@&>Sxe*0#NJN@l9vB^0|Io;qjYpNntNJ+$v&qK!4eCHx+(!JvFtq zbp=pB-lF1LgHnp^MkFVQ9T(LQ{LZ?23;P5ER7#d+)HIyfy-brL>?Q;oIX4JG)Jq(b z1u`(}KzhN4_63=}Ar|b(Q+dNNwb6JcsXgRpQVx?*K*Vx|Iq*0nlPPWDxF#ioKs&J8 zFNsy3GsWHJ%gxTyIIAYl*1Q`~6A9QUD88MNQRS}IBH=R5`!E{UZo)~@l`Y4R&J<S@ zVW_^#>!2*w#C@PRBQDOegy^-Zj6U+&ZH_5T2!Frz=sOfexOHpsi(8Pow`p=?(iv%y z`1Dh=b#Z!#Iu7`3{|!0~;NZyf?fpB&v(8=*<oF6@LHheWgvmZSluw?F^c@CcJhtbb zK`tRpOSQB8!P$jo&6BgylGSI&sy<eZTZtB^0)}V$M&9<o@%Y}0wUyQNtyO|5P>QYn z9Y_?80~|ca0U}w9k9o8xew@>@z)Bi~c=1-)^kNr*M_c1ge|PV}gRj5(YX9Nkj;(QL z1qN?473h!gn}n0>ERSvQKNC^1@~!UhEg&w&og)dRKpSIlG)*z{Bg?EbO!`l+;{fgW z>(bKp^5*l^?cJ3Z%UfG_e!Zn>m&+r}&!FU6N^g0^on3NHEcSeV+_vvhp2Hht54bEs zeYXSDof-Ddh)_@&ZHgwgQ7L3!d*uMGTpUY}NYZ1iPC?Q~2$ntsJHux_NKStfsGqyQ z2}){+a?E&I<ZnKu8k&UJc-^BgXM9|aWCY7CBAiO9Z74FyQ23MQ@A5IasuCHia#|hg z&_;&JQwsI(w?3VwSx%GDH_j3@kV_pz9!<EZK+1AT^;dDO{`rOmOB^NF8*)SZv^(E- zM#m9q{qRNx&Ieti|B_MqR~S9Sml3PvJ?nYv$ZHK6hQAJsvdcU2-y0f6V-~KkGTU1H zCjrK;hD}JEV9`>}4tE)JY?cD0RLCpLt9oikqC|xAzA&=(i}eXQ$3xyLejeaTgI~N` z{43ovkKW1OPxPO^Ec8!!vo79(B?X}YdVv^WbZsjkC*op;*T??$Yb7|AE&6-T%tY(T zoLe7o&!|t>GU%}kEBuwck<<kSzitUa1RV42L4i>ebRokcUpHB9>fsF2sI>&X1V@S@ z+Dtkwp}`9Fl+M_2Q|Voh+Ik?sbWT-ydZc&cUB%J7{`CkbF}!Dc`53;G%KXJLgcN9? zP$Z%eBwY;l2B8_WvGgE;=vw90fPexEqqr)c{rk!~MSmd!6)4?>opt(4FM3q~Ye1q2 zAou=5y*Ooq4yeY|{gd!mAcTEQg8(sr(hFEfmTK!k<cR=A@lV{S@aYAy#=PgeKTWu- zqKGPShSU+<0Iyrf<3E-X7Ih49X-P;oNpVp~mzGi_luWXb8iUI_0ThZ?U4227q_KG( z$|QS)YrHkWe`<nsvH&UFQYmxMzFqQ(x6pIyHpVc)LhZ>qT?HS|k)ZF~zSFuh|2ToA z$EY&G!VV}CV1Ze?=G(Qc-Q~^A<zMjra#B}Q28Dq72C_Ap$SfQ!6o`g>wfpnN=F=_d zB{e*Hn?qto6vDDU85TUT4dQ_vxBHu`3b$p>+h()~Nj?}97JCvFXexnZg`ngRnCd_X zwq}9=Ml?n<ISdi!g$lne*{M`lLp)KBtB*abRNwGKj{NkwZkKQ;aggl7&>_X(v@pRh zFQ09!|ANTgm#<!|Zm(^u?@FdJW2ttYt-V0_=PqLD)}A5)bocv>jTfuS>(l7pV)iZz zKh8?8ulD&UBv<3E!Bx<;1uUH$L<|re*j<kfd)WA4@%@SxI*2)v7;`u{INygth7Bi+ zsWN}jOJbNkISZzl^UVY^5n2-EHyl~jDt$xw4u9~Tr~v*hR1^DE?lCaFwvP*<`fcHY zwDtJgYDEYPgdZ=lgxe)lYg`G8&4|ip5W@{(Pe$iwXRy&=#ck=eD1nUN3y;6We7B2X z7g2}k_I*bRlN)r2#$n6g?8-S#21lWkV*PV^<HWk24mL{VuR%$Kjb1SC+I!_#6rH0E zb_cfebGk3&;oI@4+q~T*LAD0nfYWR#_aA&66){^yRG;{PW-J4lbsI{VARk}VOre-u zvE+DgBqDc#cF>(_9wIr??fH3m`L-oNq&MP1K3N%7nOfXZCE0+$H!$?qx;&{IWLooO zfsRFlwsH{(9FuO3NL-XD(Wq~z2Wm-6-?zi}`hgOe-~b#Y=&YBzraX*@80SwJPsv3u z_fdi%#KuS{p&?MduFt?tdlFy(?r1z_i7u8G;Yv=(Ybmo8YKY0Te1Q4etzYI(=MRb> zmU>GgEui^m@iC9RMiC2CC^7c92=BIUe?YIv{y}da@2gy7*B0tii`VOp4WS`%)@ATc zD)h*(VG=Bc=ZDj9=Iph&FH*rTWVpj3{1%y3VU(9z=yoK-<WV);2hI`kPrs^7oYJvD zW(kNHLm}12crzQaj*1h^V>!t2^XVlp3<9=sNpO?MQ<D5BmB1@!ko09kGjuWLQ?(%_ z*_dGAKKh{Vt4U%cvn3_rCE089k0~G<d3l`tPn{FQYQjPp1Lid@2`>}Batl#Af;(6e zFe-xr@Re{!$Z&X+HnJoOai*7GS4t;cRx=%AP_-J%AG|NP5@D(%iHQ$lAKq4~H4rFo z@3Rg9r1wXN<$in{9^gK-JzVy^q1t#w{fUpE&&_QWn7H5mlQIGL(a(>L;ONus@Ybvr zWKuE)h8)FYXHa~%9(C2akrMNj<<JqL`2Osveg0m`@a7-SoapC>;313@qzr0l`<GX% zyBn`WMqFQhxvC{VCezV2%I?+YunDA5yucCm32|TtY9-dq<uyaGEpSKSte|l(V{9af zJ%^;x-|s>%e$n~s1;!J0l$ABGk0qAEQ7noOIj{{?%M}FT<dg>rQHc<KLwnnOBqGWW zki(bAjj<M;<C_0A`j%wQh^5zMG)2Dlhv0^l7b!B9fhbK)6qISN#EX<1sC5$A+}O*! zZ9Grkt|S0EKEnk<-l&WkrUYI}lVLMHS?f6TvCDVP%K1>t7#RM%yHv9j&TG(SSAq{% zmSp_XNJs|qB`+L~Qy#he7i?3-6R3gV$PN0L-6=(ue&xaGDU7*XN~tNqvc5P$Vln~9 z?mwu_Dp+K=;)c#CN1%tO%%nkHdi;_>>KRUX@8;*rW)o!kfU=#fms_?C>aIEB!Ckn6 zgz=XZ5I)61=mvfR^OqG071b_KDD#r*%T|ZA&FKUcS-SE1iEIZ4KAcksS_uzCB?Sc8 znN{_G!ezF3Wx}fvhiQxqLYB*xG(dET0W%pYWT2NCI^_G3Z1L;XBdzl+ImMqPwUeW) z+|4Cer8JqFy}`t+TTe`?_oXSWveUsa&%ca1k{V?Z8TOs!0O;p#P>y!QTJ=S4W3g=~ zrH~k$w^C-kS*XCA8PnFpL{_T++Y{*)5+i8Lsf<ovMVR+zJNvXf?jH1xP=ccLb%lM- zq9NP(bvm-xs*%{@hGdk(f@s%0>JCeHbi`~zVuC4fj0`bLONYb3>9&|6L*c=|N7}8P z*gqlTY7Niw^5XHXTBh=;UGUO_gc&kz0-qp~B1j2!<X-hyWvTRW;m(Y*TTTIPps-Xy z%dnI(azSLX;Ssd=9p0v}l@VPHjs&~B$(wHE+FWR!C;pHgqjng^${7J4HGJ^txM}<% zqAYo=QRO3wj7kV~-6q-EE56EUTNOcT*q+qxhTx=HUxJ=cB{5@JIW`m%5eX3iq*!j7 z?Z*y_9QUbN#v*rW0$}Ju9AJkrFT3y(Fa!inz3~WrS1v}oAn08r4V-~73?W}b^jRDo z?(!-sO@z-Eur%JcZV!^)9jhBJaOlLv1WN|=x)CCLBq%F>O`G)U?((ZwtD%m@r*Mba zf`^PuuM+N%Fs>`OsWGuhihrNM5}FdbqyHeU;tER?4yi!_k)>a6oN&coVHlOXcl4iR zAPWp|r~Y~md2;Z(J|A}9;GailPf*SJ-C+2}L*>d2{Zy%La^^>$Ir)mR3>R$RDPNV+ zeE#_aM{_xp%-qfvCdNW>8r+(MlzG@#Z}fx2gn_xNoD3uf#F@`Cq#g{0NEZ0c(^m`} zTt#Zn%C0ZF6yUrjgVdleDD(K+Eny)5Og`0_aa$M+`fL)G&_-}W2!cx(s!e3v*ltE5 z&_Ir?*PaZR<g?)qeatSC47pm8393X7Hff02A{R4sv-Vbr*P(F@8ZnxNm^3YMmDo_f zOa4IEU;GB^;C0vljtJ&@$2pD?V~_gi^INZsQ{A;V9}>3WAIVO{yU{)W*$Qgjt4BEA z3mnB-if<tb!YYE|*N?l_ICnB*q@&t(PI#w&je+unj;3ZNg~!>wqn^Z^L%7wTeqNTk z5|$fyn>q9*3aL;WvIFiibCA#zYHu#5RSy#gleb(qH=G8@Ft%NTi7sC<XEabmEvCYB z>dA!CoT$)7&<bc8iIgr_aN%a1Jh~UuE1mw>`Ob6P50K)G8V%i(!wikJ0Qv~vzIZWG zUJ63WIZ`mOQ{CaT<hTh|apmv&09w`r{(cE&H(_*$ro*Ey+%=;c!E+QCcs;m2cu7<@ z3^E<<`Nn5TDKI7nEsme<eY%}u21|}mHdeaZHPf!+UV7V&6A4eb*5uU@QxH;uOII=R zTp&)${d8tX($H%!!*Qw=c6pc8iYXvPx`{o=F}e0;Jy$6N67`MIII9dAgo`-EC6C@^ zFrk*$3=fDwK<o*9a~|Zc1xo%9%os$D7YF5Ugd(uOS6Yi_n=MxZqO|kr<#=gnAnjcD zv33?<QxXW^9^;QovLkt41dkbjtl<UnzRW3-{^fX%zMLNQni&kA-GggQm5nlG&d^R- z?<Y;93kfcyhbyc$45|n3`d1Pd%#XCZg#AC~UzZ_(Fv6U^s%XirZBvjXFsOne>fhyP zz~4?MsbTo1z2CZOv}_WDaEFmXP*}p1P8!JaV9S(i*4%<NLODr?_^2VwaDRdxR0qjc zo?84M1yW5+UEi+u=K4?>M0+vrjLM3H$<<}>@3Ibs4?Nq@UccjFdiq{f)e7QuqW!_I z5+@I4U5RH2k1N`?*r6d`jRUEAx0hmb@WQ6)yK$oGDrEpw@58+E=bcQ`58t}(Zx6WA zuiv}s4~S*tlJXyhNIy;SfB=`DdlD<jutH#kaSvgSHU19W*|ee<HXWg0Q0V{K^~NE| z?g<s9!c;_pQ$mRbK3P#ex)pULD1d*Tc2K9v!Eh%zsQxKzMpv*z>Ji@YK?Xzp;0hxp zCRUfguQy7t9b9i16*;dk#uOuMQXG?6#jHWAk)R>>2aF<A^K>r3x_BBcmDsoPWUg5= zr57y~I0dEN@S9w%@1OMg$K7FXd@$HIcI$~nA#p3ZxII<5QW4Xx9>}7?jnSNTG-jd- zK1jG)U6o<p&r)gudX^B4lgrYQMz1Zy%_Qj};YkT2tSuiq?7YJ;s?Nz^y4_iU;q8If zyv6gr6_TV?J1DjYiRF{V&GLOT9)eqo_loxTHx%gj?Gzg3Uq;MM$Bv&K+`)J)d{aB4 zh?<iov`WcXh}3&H5HmI629JC-qn%bL5P>M>Uwtcr#@TL>Ov2-~S3K_RM~@!0RyUrt zZZRTWgPuRP%V&Xm@Of4%Sun@)kdmTD0cW&y3sO+_DwFqj)Aw)P`eksA>hs7u@=jN* z+?-sZdOSMFrReVW4w0Q6NMP~=Qu4*1%x1B@;Ur1P0Q_E{RwYs<b<@zWE6r^P;WYE} z`hDy$ZNZOI;PLmq1sMdm*2XPj4P7P>Ca!s(h=PSMRFEv4Zy4qgHH*wT;7~Y5_Y{4e zBsbK)E@1yei;6o_;lR)i0QUG+lm2ljws6G^qD)XW!#C{^2u#bbppxi%ED|J3l#!nI z;Oo(Ch2bCwZONU;2x#=!)?+M%DtinX5t++O5dJNL=Yb;l#c?zn9>w=OwXHym`Gd~E z+Q}n)L63FAsQP8798D43B)@XlQRXPZ{(mGpws>(2QIq4|BO<DTzi!bPJbAXU$-ej= zLsm&tf#iXb)*(tuVl~I*QWx^AIh1i)+2wV=WEjw!XfhGYQQnS9M*{|wWF*W_<Nl4Z zs*6`Toq?jKt<BDctmT=|aXB(sVg95P{BN%mh|r^v4bFwGAnPWh{GEv1D~L2jk2Dp+ zuLF~gP>r>ixu%HO5O?g~KYL{#*1Wgeub?=3!Y3GniZvF3F8Ou2n16+u4YhUluUfgm zZW1u#P*P#G$_<1<mM6=iNNJ8!Poh@dnj6pl9&RpyxSGtHI%o51CQ2Avp0~RNK7Ufr zkjdE3E~Q9OOkOcNAxwH9xetY>@cWBrt)$$6o7H%|;g(4P0+Uga>uxUj7|%c1LCEq6 z+RGld({E6d54C-hN8{ZX)jZb}RyTf_peKYB9W<}?<IzARkajfB`4)s=o<@BR1x-*P zD^OJ1f{#zo>!gqWus%deajf3u+j3{&)~z79Z)vkii9>;poG~@G=Bq!5iNAF#60~HR zOQEjf=wz_RVkr?8DJ4d8E=t9ZS@bN)uBHAnK?72_KLFMP<h^yf#bS57zsSXS`4qsn zaIpA3-QnK_xDAwb2?s8L?_>byzm_*6Ojg6JhfemhfFc`Z$97?KEHlXpuwJI_KmI2l zk(!gNoXPwsOfE^qvSIuNwEh>=MdkYu0im9nZ)3v@;F9n~fR$huS*Z~XlZCIK4h<_b z2zqb-pNk8`({TT`fWh3>>Qsv)>c#P3F>aU787SiE1>{!fl+#FJUXZcufPp%>&=e-8 zXszQWw52H0dKIb%CxBx>Rn(k9x=8jYZtu*s->1h8Srn1jxaK>z2?|df)OldaZ+LWt zB?p4RKrU|oxMDz2IJFLm)bzN`QEx*v;ff^T#4BOko|7isx3SK*_-2UOG*IuoONN-b zS&~C-+)}V0D@&q1gl4eCpcSr6pR85hEf{lLQcr96=oK|j_-YWdB4qPk{!3a-k6M|T z1|Hmz1nY8ib*dylcXxeK*I!i$R6iYK)snCBg0&iW#&BlI#i7BfDw}X^0#{ZA`AJk$ z>Z&9-4LE6lr++80Kub$UNLL<hkzh(Xb;SQO7IOTy*hTBW&D~vz3tw1RM0qMHi#STp zlmv?lS;aeo2>DE7&b2(hX7y>&HI7|HN?_RnmSj~0J-%|w#+ir)LBFC*PqJo|*2{~z zTZ#i1zOi8YO_VH&w^Ug%#S&kLi05B2zhGd(;IYz1EZATPPfw+eG-`jy7*do0g`kdm z`^SE|0&-}R@{%0-blkHd7IM&$MqbYWECY-|X(S2Z_sT;Mb*%b`;=ZCDHzvCVbiIT1 zxO>t^QUOAT`{Tp5Cv(Y&QiVdRWp@wmHZMS~a|321c(}8mu!ppR*<lWcnp<RNr#7>z zya+4-rHF@JSntsv=XLA-dzL+76Hqh<KnnHmztd`qPk&n7+(Pjket^{RkWp?YIM8m% zlp%EWlNKCm-@$8oM!+*-UItl#-NJfO5;jm~0ZN4)s}1>MjH@gd>eDkmB~T#|8Uvpb z-rthKB%!!vdBQMLiIcg{y~NP;6a}5lj~OEr>WXa%<1`j@l{A&e9%>j-7`(!RcE*GA zeaOM_i8xR^@pHI?r2DTLDPQSdpcJBkv@w6k!xjd?E~_&l{cqX?+6P2`bp*)<tcK_X zUe+-(jY5(2#IRe!keJmY$f#P%VJDR24KZ|Gi8JVl(U|Vzw0=vV+zN9BJayq8%6`b$ zYr7#yMV_ZUI?568zlLbi4t{Aj-ashJf&_@ULtZA?(z)q!ibW(J?XspGv>QAr=kI$@ znW8;59yVkrvf_q4*Bg=ks!<GNCbkkS9UX>UWwAt75^KIJA`uyqZ6qbLPo}%en(l;b zzktMR^-IMsVvGkYAIT$9nF<~<=|G-aTb>X9`+pt{Kyt+^9IDQF@#q9qrGNYFiTtxb z-;mbG#Eqr}QVVTm&hY9L71+YuRva@qNt;$oo`SV|aug8Qh?tYTr=AOd#UFRMX2yLv zVfN&KPM?HWDdi-SZeucQeCOgi1HxI`nw8%PODCpLP`*%*LO@Cb7-=VWX4&Ep2u_`a z|M^n|<C*G#8`=EvDSe?3`A#Skeg&&Az&F|C?=v7KWMA)u-@*yK!g9kPFsDN|?ge!_ zd~vNoq51XpuQL=aaNXfe<w3f_c!f13-hvqGalLV_vu_DFs*GO&6qQ-4UIM#xC`DM= zWSaKV$cOx%xoq%`@d&?B7NN9vi{tV5Y_znvI6gTzTNn(F7GFGlwb<DkEgp|gPZptN zkD0YITHv2@p_r{5`QC`}*!pp0Wp!%{!k2lHOW!_QUVHK5Cdxw<_w_<4eY>_U<wWtV zsZYsuBQ<GMRFq!rXamt@dvmrTr|C*UU14Lhjyit11Z%h{EuLIK<*9O|%`}HQduh`x zU8hY`C5~rXv-R3a(*?6{xRC54QwAhkAo~jZBD6@zz5<4<h(z{<wIT2b^ZZ*JcWi^V zX>!dE*b6Z|bzjqrpPowMC%jvqB8p+O9AyRpX)OC_bkQH2jUY%w!9ENw!Q{2y!1koQ zn02(2q)G~iP*r(HRY0n!yP*vpiKrT!rWMXnlU3AYD;uqo6Ca{8(7$48{qEY+;_<h| zH|%RgwE)?t-pK<CZHu<D**&y|w<|2P1sfOtVHh!lws7B$+Tp^rSz%wvG!|C}!W^(K z&OgQ^YgQnQ$-I&J2yoOT<~*!oCjtbm6zCma7)(%f>`)RpZc^niKC__*1-RyhsG7)y zpe>UlD?Oi3@2JTt>J$oN7tLFe95%@jvkoJ&ukUqt0gK`f==Es@jDM&-N={;g`-)qY zAnocqmJCv}ap|!`<^oFIr@UN}AB3Zm^xQ3AT>Z~TbwI=#!VO6c&^bCN6P}d)LDVNB z>TvyNXB#g8j}|!mK{+$2Gc+p7LQwIut10R2K|KXkO2!v;oFG_C(u(h)hmC-4sp>hs zsgW)+V~`#Xwnz_=VW#>#*@UcDdTYzrU=H$$7O%7EoPxm!Fc5FUb>T{tlkepSF!ki7 zHbfd{M|&F1t)&h4me^W$N5{QG>1ir=PL;#(^~7^41sB>{LLm|=AL5U0eAC$F=Ob~; zn~G9wzUN%{0#n;lIPn3Ul0`z?<(x6XEC@{VaX4R`J;9B=lbproQIqolgBvZV@Q#E{ zOTQKONic<$C$||BVpk+7c*!YSJL;qTxAbtZst$z|J!8Ko{)E%9O$R9c|FqMik2{I` zqzcd5)5R-)v%WiQ{q<hG9(CX9pC*;X4r96|WBK9iamS-wp*^)~MEy}rO%u3@l0PHS zaii03n)g<<qb(#OrO(Ul9KT9K0c-snwzolGA(IIAUo9Dw<*m~5jmV1th2PS`6ZPmy zVTv^)8c6TCw;$HG*x<uS$7ru`+iw7&QTht|j<XV;u27W=7fM_K+GzkL+aCORV%p<4 zIoap1Csa5S^vUy6;7`D6Si#D1cmK_ZmNpzx3->Y|h!>bv(qZgBtFl{b0}E!Mlf5?_ z^ciT8Z_5TEEQUQa@{#q!bcn*q`)>pz(m_Gn!x*xq^%`#q@(I5~5nzug9aV5MFh~Oe zA~_4H3zj3(z{RvrZ-ps2eT1?hO-9R5Hlzuq6@HTN$Q2hEER@ay=4>sF9AkGuy$ckX zFyZ9XR5<bKZ(U@($5QRq-bOT5pTiNhO}aCyDt_bcLGvE7F*4#I_B#w!LS%~MG4OY# zQ_9dj0$ddx%0m0tB{Lf=K+doyp(e6#^Jv`dNR*38BoM8zhdzRbIovTo?#hff#J15S zj{)NTWL0z%n|S8$cM31AWYH^lRqBQKfcc_*vuW(TM}lIY&jpqSxZbgo2UJ*qP1^@M zibC|Ga%j`}tWPEidBA1BV;Q}yGS}r<2)VvtL>fZ^?DlCRF*w#lqze|MP~fG>FDb*m z*TKQ!V@1reu!=qb*mWs%If!QzfkC<pP<4D&YI%<YU|c~IoKP0CLZbpOhzu-+ZJ~Ig zL0-drr!w-i+1cP2mMKzWHy3FsS%^Io%?dmd)mnI}AaA{Q@EHD|1Bh#0eBxwpS(|pS z7vCOG3p{slyu9s#xpYR#rX;RN`skkaRB7-?znG!qt7_a!ANsO&gp$py!LTRfhPYiZ zS#=Jv3|V-OX(F*V%^tdjqwg;Mmta?(2^gqBt$!yw1&o%ZI`PbO5bPuk!i>-1zOe3V zXecT#I5+pfbRVQox|~WdCiXzb@kWeRl4;C9Lwt@FN8CtV52BdPdAx7{8CWO9+pFxJ zN3DEvmX@S4y%pkz5?A+#Q<gFRa7k2ob%gRJH+AzIswmf*T^WwJZTYIqFtI6JoH1;= zFkj#c6*1w91`+$&^Vb9O@zV_!2!3lEKs=6^Am;)8Hm-dnvz_nF>)E%D{o9o3Dwt|Q zoyK2-6Cv`rpQ%XeZgbBF*C8SlMhnIF7rYyQAuJkz(?7^>-#@`WZ;E;ypnd0eKcE5D zI!>$<5f*RH*6St=cPNwBWf?QF?=@Pq?A5HLZUqJ0+ywdw<)RW@6*CZf>Cs`|Bbd|^ z0*lFsVdh0UQ(@Mo!n&1`!>QpR0VLGZuG#9jirP#i=`&ks{f6dh6EzvV=bCF|EBoY= zK6I#OU<G&UViyTZu#nh`so6Y-gwOA|IJax@gRT9O-Y!nwuD!V{6?v**`vguF|7553 z4No#F0gyw$LHNUgT2DK}cfGz^U8Jh*##Ynwe5V|DgOIpZh&Bda>hqx8u7wP3@5qfI zkkfpQ;FBXTAzt^qf+=!_C_S?Bm!18MEd<Ar#et7AzAqDIknp^^`TfS$+V(FrYRiA{ z=W0Szgx7y+bzlFI|6T&0sve~;^Y=(S{!RH4g`j@-Yg+y8fEu`q69^%FqIToUfJOjj zM5Xpq8CdywsKN;C+he<@i-y1<f7HVzBW;MGA9hr7m9VPf)#}O%yU?YipXh#_{*elG zM#F_*Af<(DizAxjZ$z_qRO^jg(1g@hg*=>fmFy;*^f)}&W_o>zRn&PS>3IP83hCCT zy|J`i=T$}hNH06y#VSGPw{Q;v3vUe<tnEqyJz>H%G#4D4pB%_FCx|pb1U^9?<#+H* z_73_jl&0^zfevw=NwFz>XE4&?Sltcm8{@;+jjruIW^4!P71t+sEHMp4kWv&McSg%5 za%DZDqBU9WYV{peAI({g?;S|IIxx5}FLxQs?9P$W<0knSQC^Er3Gg}y)w;^`w3VKt z-#nzKw8jvgoJ1dWoh#-_LmA*MKq!cHw+eX(fkcO_(JoX2G^7Y1RjllMI4W^FY-%IX z-ATOirbKH|D>@ff2ih<$Ejbu>ZijXTNJ8O`O9lm|MUTeMM{LkIJ|Fg>OMwr&8Ce88 zg!qCl>`FA~E?+9cIm1acyAGGxhs-|g?U#mtm(IE##P!3|Q%V?5j4Q}tVR}?(-9he> zrn;G(4YG4IyI91J36q-8qT-Ec|3<7xwIZ5>w4cSX;c#=D8!oo0#GI^e%dMQG+SDQ< zN)~vB+`uCGHfRTH++eUESKYOpG3+zY&P>U7?E*8HwqQ#KiiA1>-PkCO8h`AGI@`*n zTG1rhKe&=u9GwTQMaW^YIm6Uuk!cEO${(kYAC_ZZ){FCCMdSx<Uj(yhzz^h|_xdKt zLl}!}4y9;o{?$|gt<JUm483HTy2q3f3?Eq*iI1a4jtWmU4xib*wy~+z%Z)EllGqhD z%&vwxvT|HGm>xGyTms+WkH=8!U;5vwnD5`}!s$yffJ~Q`Wf;e<Wn4ahJc#$__RDMb z?;~RmpU_4J?e3xmcs_&N&k=&GyV>G1obt)?*zvFUn=x+LS;C0DiC`KJlV|i(eK9$> zFIk~i4_0!U>iLrXnL!T^a)O#kNelV;;$9~Qn9?&&oS0Y4akczvO-vssxj~VEPk3gV zEB^VQc4+fT#n7{HA;4HPz>HXf+xK}(B+i9&B`#@TxdZmP5tCC~O|*&ShY=UfN2#)0 zb4KGSA~!^?Vf60hXF+#2?skPJst&QqUUs9U@@rB^N~8G@YNJ3!oXJV|Z&ROM!&opI z_|x`8vOpQ^X^7F9&<;=zwOSHbTsk{v4Ra?lTUg1|*<H#j=a}<sHq4SFhlW`)eASOx zs|hwtQn!@ZCJ~aWaDgpe->e2T9HI;qWGz1`iJcOctX>>dgQZ@p^703<EX7Tf0?rn6 zS1ivug9te3(e=6WlbLcj`>yepj6jvjhu0iJ#$7qgJ~NP#Ev<p<l6S$7<6p@^t(C{C zM+>{$0CO^yuDXdHOI~nNZHlmlE8)4za@l&36Fz41Sg~~zTIZn^j%|}<?@!zx2n@+u zbLl08dj4^lL6uu1%v{O5ah13m{7S;F@EpQf1GJfHDk<jTQkjH-6`UmuVuI@dGeA&k zY&dwU?qpt8=m-ZHAzZ5E2{da2qOWS!QXlPIZ{%)1j=c|=iKZ&3!eoRraJj`i)r)hY z&G%~iqg>fnBY^7O)tt@zf{X_&KaWxK%-n}DTh@gD(HT{x1X)umsV^Q|(D8_U+=E%@ zf;!s~9wn794xN$*I3es8cpJQOc+Q-<ifWqPlJUweQ+Qld!x<HQQW&;6l=5vgp$USE z#)nJcd!GMonoUe~ELdsY+7|eow6x?E70H9;1jnzuDx{s{!e)`$&>Y<3RZHRMs@k_1 zt=}-5z#*<qcW{LXQnc8I;kzjsm4-By*6Jo*vAozg_18smi-&|zTGOuCy+G!CuQL;0 zRi2+t9D*W!2Q>N+O3TDH28kXK^s=N}beVhRho(W`xLL63$$ko{tLdYG&@FyeMG#>T z$nmu93M6^|13gn&^%DG(58b6tP&;JddJoS)@HpwgMylNPg9syu<Px3>l&JDgIBYx$ z@)J&-90*;29l8y8m(8Xnr$VJ-ua^3Sa*z%@#n~j`toa=A(AAwf?*=L;2}iIz87rFJ z=)qe%^uFZM$^sm<r)gZoB&@kGN#PnrGN-Mr@dzrM*#V3js}X^J#E~>W!hy8EB`g-l z(JA6@bTV%qx=S5UQ66~tiMzpwy1~kqiW@wL5OIq=h&OV1@_ngCELukxv8P>>5WCJ` zuTht$4I&x7Kc)0T2gV6p4eh0zh<QX{5fMFK)L1dfqu%IXX|FR3!Tlll_d52w7(g#r zh%`Tu#<6^X$(WFaS<4%hOTxVc@_ZhTZCqQXhSI@*m75X;=^fg@W5X7fd|S?-Chg@R z#AAANa0F=3amiWYmc;fe0yL#lM%v&XpTPz-SI-wn)rNDZQyg@<r&YsJ-Oki=4Pf+D zb0?X4)EY>VOh!YWIQA}uzs)4)+!iLMp>kW<Uf6X-t~`-GpcTn}Pu7Rxc2^YplJU&4 z+}v^oW=u(!=geV_yJ*j{0kk~fne_H#xRyv@`Oh{+gaj+eh${VgPCUceX{`5JI$tl` zv-R6QAr@LFI{!}0s^$>%A--C;KM{o>2x~l{7DQcGj!-*5wrbFT{&p!Ma3Ym?K>I*! zIT$%&SFNE?A@I>VIAmofCN3kk%aF(3>%+i&db;Nyr(jozA)N9gMI$<%lutHMY`Pzf zCoj$0aF&+L)qwQm37)>>&r6{{J%h;@vo28Kowx^LqX;RVO)=I+N(l(MjOOiNg#N5x z&a@9q4G2;bM{mHqOiW_OBUi??3_{T|VI)mdG#iqCAow}R8J!1+D`-vWz&JYu`8p_Z zb{JaA%Zad;EA3MTF=~k4P<PTo`q1<dLor0eW3algqNh5tN5z3wIHVKkdbqI5%)4)8 zhhJ`bxw6Dr5HA9<WVE~8!rDU3l=xg?^_JQ@s)i<?qJ?ew-830*PU4Y|2Pep2kR;<) z8FMVg6h4U<D^*XmLSGsSiwtI22*l@XT6o#(%CN%GUi&fnrQ`q5M4gC8inSW;luC@1 zR)LvQi14SP1SejJQR=dW&z{D_Z@4z69dA!apLRx6i_{~6B1fLVSGJm4a(gzG5vtRx z-$W_12;a?SHi5p&sc11V<;@0YWd5Fc2)%izjZkgj`AJ4iEW~lfv~|)d)`Pl1$4oJ^ z6|%~d{N7-pD9gk8WaME&|C~pwMakFkTjd$@jFEn*8NhfCu_6RWkboHX0))p=<4`GE zY9NG^A^GaE{cGY80?9<ggF=@T_$eIIW}X4YP+4FakV>#BRzZ+~qt``Cm_#Yr2wT-} z5W>MCU9M7uIoiTL2O0?vG5}LKxKkF00_7U6XS+l~x4#rVL;*;mR)r+dx`6CaVf`-j zi&!dJR9dVmHwlIowa<`D!R$t*9bd}pISle^C6u7{Da?gbtlnu72=)1>_<Y0)b~-9K zSokBFgT+M}mZtEQ>PAM=PAL=Gua%2XC>y8%R%KDA)iW+tBoKtsVFVEaaavl37M_qp zb_0wzpQ{f9x`~uiUR2LRU}KbKgh6r<0P?Mp4XBoxlV=0M2uO7&bU{FUsFqoebe%Vz z@rYB~9C=`*tVMp0&!$*!z_Rm$&WS`7FlPq=$LJhsZl$1(HKB4QuJEIbIE5+bv<+}R z7pJgDPK<^&?=MX*llD1n6d6vg-8p4H43CrjU{m{pf>&*K2rY%Tj?jEaLkndKn&PK; zFe$`Q&Wo|z<w5Gn&hGdreJe?JVnme+1bRkwF2I{#QL}iSBsG-U+pvcWKZjeQ8a=m> z3MABJI;0ZZ*qRoKr@aHQh=EOG4Rk}{1o4w$(C6_Pk&;MuWUb`RmcUs0#<S)8_`6_? zhnHg*N{9mfPP}2X;z=hZA2RNuNA!TYlcB=*VIaE5L}YVWic}E~U3#RT;X08BD^!n2 zlL+<`F1-WT3K827P*O*`2w@I}@<D%IN?wQ!5;q(IBe+Dpp(LmaHZC_piu?8U((TGg zok_^z))1UVA<If5c~VBm9bCstflG3PdL{`*eYA@{Xeh4QTKvz~|GBfX^y{Dg)W$#l z`<*Z579;YrFq%lkO@}VIzE&)pO4cJ(93{sI`}?W*=4Fd-GSRsvEyK)VQXUYQi~TWv zlfErU!NBBK@i|?gIvcjx!jhB0wqjiK6^3+W>Qgh#ufO_g|KZ_I^H$2PX^SEC`CI|r znq$*gUyt0`&vL1mCi$)ysXB!;9dL#U)&~a)Qc}?_1Uf)**{XZ#gr0h909YlyP}Xc; zd5nrHNet_yI_4oXqf{B`y$UI~aZI?Y&)X{*KuqxWj+;cyY#ldk1!6)1-))G8fc<0} zSA#t)R|Fnz=`<*7?NOZO_wxpNUhulcpX@OmHnQeJaW}8nC6j&lCQKK5WZF!4J}gI< zQP&ppsWxwowz_a@U#mxEAY;y4N5WG&H&WsE#*O8^nYKFK<1#ip8-G+QODSy}pxPdI z=Ub8Y#J~baY_;j_-2&{JB{a2OhBp~amgxJmfNm#QlggUnLv~Wz_HS^v<^qYGEhlNH z+V*RM?s2Ij?RgSH_-mnPv?nns$4frfZOcKdlkg45T)wZaMmYkFF{z-8P(>s$hlD?V zou`;7E2tNIZ?Y|?t>osrasHZw8&&W^jY)TyBE1Rnr5vf8rU2(h$XDX*++R<<o7_~> zaOGQ*iN(P|h09J0*Cl)I!i*%!)DuO5FM^e3f#nU)tjJt#U(FT03>lZ6ji_jjXpfpy z0}AvWfwF}5G|y1{-!GJ^1%+G=+O;m**Xpgx(<^e?%06|~WZZ4&&UHYu8LISBd(sG) z%Zm8SWw}aq^HA1cr)-?Lgk<?*u>S^c@4tD50yJnMag|pCcfRb)TTG<dd4?8jZ{*jj zy}#8x?VLe+?b;Y3Tz*lY*fd(ZaO}e4Txb(F{=htllIZ)qJ2*TX!jk+wY&yf@(UJYV zu*bij9HIQo$pT*1?gpr1g#d5jjoy-N{^g~ozkoQ+&R_g8U`7LZLn-IpTLwYR5jZ{S zi9pQv5}SuxC(QnpTNOA&yRLBOU4&*0PKvobK0ymkFrUK#$FD?mejfyAvX{?LuK-m} zynaL(v7r!e#!{oDp-hDB76cou-==bn!Qq?1crY>Ch;h<FutyiChlBpbB7x>soryXe zsy&f2l{uoA^^yQtzL?+m%@8gtec&{APT<2jxL|yXct|HqnWF`6Pwxd)&6PxkH7L`V zZu!lW<<{p9rSHa5QhG1!pIzUAI4idN0=Tea&Gcu$!8*&D6v6MT9xA(5hTBf8Q|YB7 zbdd~>thRk=IN1)QRlRC-ID@4uM{o;GmPo5*mv`15$SY_j$7HiBvaqKWtJza#1jG>P z)%XhXnR0-JI!?vbF4t{bM@~~EjD#`bz0LI`&yWC0;*?VHCkxta7Bp~{qwcWzihMO1 z@(SEpwhDv(e1pBsA8#^^Hr_-2BF29K!#~91h8dd8K&sHVfiF{Uu0CF6AiD)$ZEem! z6iy09vn98nAvE|NF`8e3|MuVi^DQ{w({n_gz=!|nKz}LUequ0Uio3U0c=ztz!rAfJ zJWMmvW#MczT*Uw8AL7o!m8bbRX3^B0fnyT2Oi)#!ykTxL(lQ8=hf}PrKik0RX|c1A zH&{-;U)|i?*yIC}jP6f(Ujo$@^;iZ|6x`WbaYpv=WrzI%Ui+3VEv>#>-F&{fzVb`) z?c+%Wg4Q=SUoOA6%VOLz(9+WKi`C8TOTV?UxwgHwvi#!GFWS;C3FObqo9k=q&o4dO z`Uapxzl({}Y5Anp6e+ra)7}cDmeN<Bu73aHG(hDU3l|DItj4h!ws+J$ImC{WhSG_{ zMmBt(Zdt=4VRIV3PqsmyAf8efBEIXtcf8hr8&DU&&XFVs29W?R7}_bxYLKJ_;xi`W zb-R#>BdN!8wFe8m{Os%MuKb$YaqP;}V++WvGFZG<?SZ<PYNr2_-@%pVD<f8bo69~4 zW0gPGf%H00#FIK3n96EU4@|rXZ5*5Gzko@%=T3Ohz{d*Zl2HKxn_!P)uu<}^3K~Ud zD+Rh#5b#<DuExAXX}RfoOgx7)bpy&mfYcn!g8^K&j7^s+bmBggZ&RT%%J8<q+-eoJ zQjSd_3Pq%TW}{R(zG<r!sx6E_u+Dy$jU_unE$AGKra>+yD)bE4iDbJDovOT%0U?=w zlL&%7Yb?TIx7vo3GYi^YE-Z>LXfFqv78m&Ha5xz1+o@R37b1@2bp<&&vr#rKKMjNt zPXHSfqD85#_;qi@LS7MJ^YdDni;s`!%7(OzchNoEcSS<~(Q3VCH8c?P-sxYw>v&u& zX6F9zO?<@%QQ{a%cK7hGx8Ljb_b*^uha?VJf|D2to9{vz4MO#T^o)!$seRl1?Tq~( z-@4F_@df>gJHgmbet9DT0nKKb_(9WdR!R-Vc%nz2-=7;je*O7_xzVr1=MU#bj~3+< z`q(EC48Ha=s*ee_&IVW&Dp!SL3!}Ll*gI&UITh;2o?KDjCMW!5)00-1lp(n~*ceCf z2(@<+ma^AH?mA8<GtIH7dU6ERY841$Nx?AC#F9{yO=z}zP|=ud2wR&`Y6E+eqoOEc zb$aDwhzf-flf<S+-N_{lS$1tM@KW<!q76~;49!@&?*_v+@XaAQi^bYId%Y8s7A&3* z2j^$@PJ<;S-8GF;Y~;CY;Ftt5zArJG&m_K$YwEzVkq|)ZeYNza<II+tZ#y@=6x=M_ zK0bxBW|6m!Lq^_8JmlkI4*1MD5l@qtOe7Kt4-_9h6bzdkAq&1UZ0kGr*<kN4sOD>* zp=HaCmiKb=5TAula(8z;*pfWl>hdb^zrOwcJ>mQP_uIdc=VOSt8a^HCN%Ff8xCVdN z&QqMH?cQluHun&nrt`(kG8?=);y7)G;gB@{Y~|s@hyRjU;v*!)Pl}7n&f9veZ%cT) zl(rL<$PkOT_g|A3)rf@b9-6kg)@w%3b9gP82lU-x6Z*>Ffm-7YV`NCm9fJrW&q@R9 z4L_f37PHwbwD0U@_Xr+n+SPAq0-S2Y<u6_Db*)v~#Qp%Uz=>sPxa>YbIL}3C9`$NT z;IsYy_++<(h~oWSon}-$wmUUXRT>|q7gO#CMC=+?ji^j8RXE8Il|fb!i`<nK=<RTY zE;C+Ql3`14jb7WhRS6c&!MksJ1C-iC$lqQEmSm_nx+EQ97l$O2t@Eb5Wj-X>!?|~u z+m%5pR!=#gDgiV=szJv&bmfWTp^U%Tl{#_M(wA|_(z;;<wyk(ALozN!h^*y~V4c&p zGcV{@GIUS!B6!TB-xRGB`Bidr?jzCt5%joz-Hg8Fc9cg$u~0~jCn$!}Zrz2bwu9PF z+~0N!p(Aw8>^d|g^vb49o!cLX;<mz-$YM`KbO4E$1&r*hDyGvD(LneR6wh&NK(q2o zNL7%nbEXifKO!tj0~4uGdcgN+$T4!TG4pF}4zk|5YM67qLVPR=*}S(rCB^fnJWixC zA0fF}6?vcTklF5#m9=J@_f!*erj-8qmYIZq9IH&MHxbpf=jh^azE`jX3F1z3qwvel zZ;-l*t#P;4KStjkmREmtDjzO@$%hZiR${mN>e$ON^k(-AiALRFe&4Bjr-YoItJKJR zBrwtgyJ&DOj^V|8(;F|s#ksfmRrjmz{k?zgboTc;Uw_m2>ftvJzwSKz@?h`F&Vz5h z*?+iyfB*hh-+Z;Vc!mps`5Gt#KkP1!hWk<v9&B)7Jo={>-`tyj@y%D|gKXC_L~NwK zt!}L>zgm5|`*eAGnbLUcbCkJ%jHJm2UxEAF-WlH3Kkq%2Kl}dYvZqk~trz&u^DqA8 z%NZ8<YIEZi%-L(J?0|fUW#Up<GL$@A1`fcL4M8i8f?Qmf!N!<NH+Cf|<p98vp>WDA zmXhRZY#|1NLak@qZvgEQMm|U(8@<Qct><goKm7Rp?()j^+Q#~p7bU4&5PA|}Ix!tQ zrd0UJW2-T%PN(`wMbAyo!ogsFw2&N#ZhsM>3*C8SOwXeq*69<P9!BGEP>}NlD-0^J zFH$=`JQ=*3_b`ZgOgFDX&D**9CnST=HZ$KrHU;fd^QI4!i6*<=<jIiN5HyGonsA8j z4A>_spI-C_tyA)kPz}Z&YPuZtYNKV;JU*#ubdIyo9wTkGaFLz_rG@uYa`b#lig%r% zl(+sz*^_w#c&1IUXaCr3u}N|C6Gig!8zbf4#kl+rvo!+pOdBIl{;}I4Q(k6M+?(d| zGxs8ZOdA8s_753a6!-b2k2|c(TLTCmFlNv+=!st7Wf1ti3mYX+V>n<Q6(fdO|C4(= zkw>Xod?suo7k@GJ`T)hi!M4CxS^V<=o%_VlUovKo;7&ieSW@OlE`y)a?KJ<`TbD#z z^U@MqC0Nd|pwd^6x=A>c-ab*t*UM$*Nn`=vem=TOmdJm>6Y)=ZZbz9O(lWlH7y!Gq zKPa60yYGtoAOZED8g^@+CR4}5_a;7^um6*ZFr$hPlDe*<D#Qp<G+G)%%nu)2ArwV3 zoDe1dR(`wk2=eyRP{sLr<9M!>DL>2J-)(f(-R~jA^sjJ^PzM?zJX$LHT8f-&LEDV= z?MXvJSd#|t(AokyNc|q3_a=an<b(Y0p|dF{6YzeX4Mt#D@90lM04AH1GIEANjp*sY zatauj4zGRfCs~R{{TYk~Y8IMh{449OJwhpA{QX4#`O8B8M8i;1lj2GkSnwA^Y<xdl z>r%l@wVCZ-UajsfZ$AI=<?8zO?oZ1venf;v(elEpyTW%psHXCwmXwXJ4WtspY%i@Z zzm%!$9R^P~&cl=>g4KtE(jRhL>3Hx4E<@#yeq+s9BbGJv>HRJLDxhf_e7EsS#zC4S z+W5>*()R{%8BB?IxiaX(<IcM51@`S!szuvn31bo5TLN`1<SVTut&-{pQ;QaX9*UKX zm#=nz-q?J)<$cb4z*4e&ZpLF-xGlN3!)-3~jnCLo7Y5rDeU!t=<K=#PA8xswn4i3h zbAcS?_IHoI{m&0OJEJ@8*E_A-zkYY8z3?ae=etLr?cnFm&d&Yzci+y*6Oy+aC!JGt zB-gU(Tza_>;B7$|Y+>^6>wAbQDTArIR8hTF;2=Zr08}qM!=bMyK1uK=!%A9~qtKKc zFO#gB$I3nm0WV<ui0d5b`0!7S&fsaZjV-j{Pci|R0}j<&Rb!cPsr6TgZuu!KMur8; z=%Q7%Rz|>%j4(tp><TyDhnu?JhCU0#(Iw2j*_wI7<ACf%?uqY1vSXf|W9Xr0J~^3O zqd$>S7sf2DTz8RA8wKb~4VzmRWK%*#5M8AMtMJ8mucY<;8?;Sq60)(q>5LR_kiIJE zx*7cY7NM1bVy;IuRG0`h({Ix74ho&Ed6-2Qi&A<Ygk2+tlFAHgN?^P?0!b?eUGkd+ zAu`&ORX^7v1)v@KQ#g7!#>DjNIsHl&fMcb933H>5Hk#MJrS?z)_ipjvPVpyLhiK<< z>kh}{j}25p$%fnz&-_5Q)2S1r@^vC9x~dI&c%eg!&e4h-if6EVRO9Xi0Nsgr<C5b8 z9OWu<_1O)^%P5i_-{p_(WPINlei;eX7jv1NgGITWe}%<~Sv@Y!@WCMa{qEUVCcN(A z<W{c&Sy`Q3c>x4aux10y@NU3NLOd+HhLjR;&RtwVxD0n$E~>QUpqlyl7K?Q4puI1i z%)SM6p^B5+)rdI%nT+Cy?BKS`j;Aswb%P-%LL0Y<yimZsk(8e+omF?;$zV9EEWp=l ziEl(pLY1fE@~ZAGD3)l%0k0&6_5uBL>b5gpM`g*<K@EfJDVlt+d}IN&>1YY{`I9y( zmXuBOH>JihbP@t~d8#ZittvUsN=)226(1o{cprwhlmf#(RZdlv=aj|m2n~ci3+7S2 z6|WmvHS{WNKMp&!)Yr4W_1MCh=Md!=2r0N+^~|4y58Z#|C{<57Pum`#vMe<}eDQek zlQ2eL0t&wmozD_iEN|ybTGtat<=^F3xS+JupCLk~uQ+&X=LnEGjQRm<1*U_&jyb%$ z$cI2ERO#zGzk)lJ(|R~tZ7$a(z$h;^;yV6D1UR9koD1=gWuLKfxe87$K@p4(v#A>B zF(QRKg#@!6+P0z-)r{BH^zELAI@i7U5PuqxkF)!(+d@>N95QfN3RTEK2`5+IuetTB zCz$$Zd6)RI??_NEZD~~sseRgMva+H8p%Q@pH_<gWJrooR8dJi7&Jbl5tXI<Y+*le4 z=GUqI5=iRr!tOvEy%jANV+MiK4}k*qMUhHUYC<S9Bz5XYDlOEFBjy3%sSct(b@LRU znqkCbKs@V@3<DqAG0oK|6lvw|ott~HV29+1-Ux2r-q3y@iQJg<_*f{dU*M+wN01^= zK!=Fwr8NGqa4rZCwfKl%m<nh@mMw#Qqdztv>J=FXWh;TeNSWfbRP9t=e6O!#*|vrX zS@JEV-U=yg10KgNVN;!1(M$W5?|fxjOkAlb&m}x+610AV6ajbwtK)dFHUVRHOz@}) zCd>gbBP#gX1XL*LdulMxR@gP<{XrcEO0?dbZorgwzNNjB<9_+glh;y^b6<K=9YX~= zc|%G=D3Gp~aqSeZL&$f9auRwkTl!)OMQKS!juar3WH^N?xq8W$p4Kg!aVg8`wOm?^ zljNnAQx?G*K};5uPSf~&&60+Lu^4!ZV2XfEVbm3=Jec3)n)ZZ!`ChjU%`t2Dr`j;r z&Y9aQk~!221I4{GuA-g1@ppt}qR3#;&K&^7TqVF7cjySI?&yFE%QYhd*pbNu;sawA zv`n0w4iG8RN8*y0#C!3QjWUdLrxdIbF_?ij;0?s1Sc%qyGC`}R1B`tqh8}%5V+19_ zEOt&{20hJmPO5AXJt8V4Z{@<ZEu(zL$5rxmxAc_ed42y^`ovK3yds?e%hGH`&rre$ z^(xEwdMcG6U{6==Q|Y0ASgYqReKw%8{A@1J#-(ucrA~AmT)vytc>vQEU)w*2_^huI zDlv3T2JG2j*!X4&X6-E|N2+W+h4)tb98i>ZJ6g%SO4`+)Di93)Ww`_WVzW!RhBh-} zAINZqOIe_VexzvYl`LAUT&|zz)(MPV^NraoD%kirZDyioWUTWx1BPxF?cPFnp=r^y zPV9H#_ts8LQrjlK;&M!6Yp7*kbN%7Qp`2EBAgI+?$_KD!wFMO3I81&jV-90h8K>QX z(NMZPs(Brl=xKX1*2oU=1(bdI=cjw%Uyw6Z3evqI4KYpb6v}!-jgazLC~Y1S)*{p; zc9(@y#jKi2o)t=Yu!>WvC*-CBgOz3i4fK@{axBR}3$$3%QXf%HKGURPipjc{kHj~8 zwAKf6hw(%HL>9uo!ed49SbU^uUTk+|)-Y5$V;su%VFxKKWb(k8@%2xk1%E_nfn37n zdZ*@tmpV-p6H<RWBnu=ejwAwE9P&Jac6jszf(PH6k31=R>wa<fD2vpee2=sC+VgMx z8NJBrA4*hnt;ugI10R*4WpzQBw%asOuKcbs?Z;h(dYycTb4vD{n;wH&@2act%!vw= zfhGEZ<f5I6K0v8Imzwk*$`K>!ET1t?Pa1=1gK_Z71jO&eWf(t5=F#^e*GbuC${90s zo}QnKdr+dCUL31(bq^5ZdPVd~70n8c!FFVM-ZCxhNeb=ESRS>#Py$gV(tQoKBQw{j z#o8;s=4{vQ#k!4*c&#u*d20fO(N;Aa#ad+cA-`3K^s)%q5Kmw`5!GF5q|#G^7F%rP z<Y`isejHbwf-_;QIW;l=LDsByz8y|3IM7#R<<MX{r&<nJ7sV(6ee>F6qXP!Iu~8c^ z6bZ+k6Ux!wCzFm&<MMf;{#=T9ob@Do`uf+2ha)H<kwc&+CiY*>NydfJEuDX?%SzsB z*kuPQJ~<txpLjgu3$ubGXEb@uA^QE+qwi23=@t@j7y-7;h%$*Q#lIjPi5}r?XBj>C zOfppbzH9H_nYl1G$A{h|hDCPof_i>-fp+!BW0-Fb5a6<pU@6-5Kr1L84RQ}fh2QoN z+(9s2pv=$u)+&b*D5WCAJIInqsDmiAhe)*0J_ake!8({07-#j(uM*D~ZKF3<;(kLy zej979d+GEUBla}u3biSZBd9t<(R17I2sU9464dY3SkHhd?=Guk+JXcavyQW2Fd;$+ z+<}|JT$7ClMkUMRnG5A;-s_pAux>XHbcAFSt;10{BTDX+@gpP3-%>`CfQQpgEv11; z>GZ<k87RQ+aQbAUA6WDUf2N20#iP!cS)dKxsPY8;!Ax^RrWk*#))nD)GAs4=PX9K{ zZ#t7lcYjhrE~|q4Loo#ugzb;WVzutg`zOrasy&{+7gifW!b0^h!ot@%kS=`YB5I0F zz9jF#6v{;sP%?h-vH8oNZ+*H9_Z~c$+AJi}3T{DDn~^;W%R3x|5JlNX8O=dmQg<cD zMTScfhSj79_k>e{YrDd`l)dNfrZja^wI^eB4GEhv6eE|CF_nwvBSSX)iFeGbKC-C; zrY1G27!m?KQO1lQd=lkQU}<aInTcy(MQ~F-G*!xag<9NjryrabuTJ2Fg82F9>;OW~ zC{I2wWk!hAJ11)8wMNxW>7w@OXNldxg0*q_(4TF;tA1>aOrEITq=zG8v@Uo-GEh}h zQ)3%Wjl#-flR`~V%d}!2!v=$Asl6lK9@Ob-ZEZhYTh}N{`4z;!bBO9#{dNm#$<pGY zyv-2a;h*4+a$4u`DH2lsYvQs`2XDJSo@u2EW{T0uf4@Ozb*)~cP|K8y^#yP5{C0ou z_2&o6l%QlN2amv|0Nn`CPtni)Cc*yxj{$p=`klg!RJ-$2m@ux3@D)OCgMCz#zvv#` zFz8SJDA2bDD}wD5^Vg#C=MnOciu3KktHDU}7*fzJ9b`CocdbSI`SXJxxDJei%m5^a z8X0}G6^&5pFs$b?pbK;P=i7<3>qZ$0ZVQ&&zdC5&d^FIGk<6@ORimw6?-^&v%7?#u z@YTsjg9)((@2&>Zv0M`0-P^w;Y%6FWFjO}b&0coLGTBVbVD5Y3wNtVArj#=AF5KrN zFEGRv*7o4vKHiFo&LNb+(n681Donu_TOWWJ7PQO(uCS_`UlcOqMy=p0^kpEzLzb6> za*WXXqTBcN*}jEx%p!_R-^>jWRj#n`d;fa1?IdwR>+3=8y^#fM2^OxffCradz-AJe z?8gcJGLtdv60Co}-MxUFdN4ddnk?$p`2N(>A9S)64dEzp);foQCBDw}M%&|y(4$2q zMaqw~6-pGU1~rtPVrEZG^~B*|f0vSTHEJuH1rk`Bk(GCfCrFjGw@|WX|9DW`FCH%* zbl)y=Zb;p)U$<yyr~EA+qkgBz;w|L3)_?VG;#W+KJ?ovpzZjPq4V7H<XBn`$bI7>c zYuw&xDpVW<!4%_*m#}VPnLA>gLaD#*e!Iobi}|B8g0ANK9-1;E|9zg=NFRN&bEuZ= zRI6c8EouQ@_tWD8sX}L$;Eo+cGj-6b&*G?<tq;)eJ@_(}I#NJlB@TgD3vu|O$}gcZ zZXXG+oX<h|`~XtUrb#&};Uu_r>{0MhK`4Y~eKLN{V*FZt3wC!EBLb{uY^6rmkG531 zba$3Dl8y$g1fR<l>QCq$(P+(B)<P1vpa5p??40Gg^sf31L1;qROmARpE!Sapbq|I= z?Uo6*9hhV(7zVYk5&JOO9~3XTZwJE;#(spdUQZ5@oD8GILccq%D;XiF2isbqVB8hN zhr$t-m>?hK#uL=`M;^j~1<&WEyVUMsdqFio7GsTb19r{+(dd~nwZtdP4J7cNf>@T8 z(kbIqY7W66RN*c;q{b>x>TK1P(w+-*q{f7NZRr~@s3S_+-lytO=R#AS<WGTNhBqcn zgKI7T#*s0Vh$in<K*_8h^N)ReAM+EZ`NU~hX2QzjpLWp2kX1YJ&lBdZj28M(PR~v* zk~)Ho3}Q=4&(6*rq|_}O6#AZ$WPXm)1A9X}qCD*lbBgldJjUfu{NPcr%-4#;`~&zn zG)Y5=2;b9=bp80B4)$dZwz<yYg^L~~V95QW5xQeAOhGkZyJz7}uy)ia^>)&G1BL5N z@9YeZmmY)qV)rn<klVU;EC$dV4dmqkW(!06)xClZKJu~EfbUsGtnq{39qHoHM;Fb* zLnIOTdw!;$p}7Sbe7r)2Q6J4#P?YyjK6zqIG-J2Yk~2ip4eiKHJ=2K;U>ka<$+og+ zpil7w@1tGr2r%Jwr_gs!MzZcRv=qf7Aa_;BVK!hvB#1m+3VOBbo>r&YT;2Y0bA5MZ z<LT<|)3vST?_aDw#mT#W|Dm3?1UQs#fK~zRky;%!W`ih6_8gugxiEm7P3sOIdku*v zND)O!6cwCU`a7BMsa6*+^`At6J86OQZoo!6*m6vn&65T09Ox*v8^RWv^YKh(sRJ=7 zonG%v)kdt>o+qM0r%4bJlzn!j$u<Eb0aWxE({Q)YI=aZk?GE4dM!~jLukPoIy&8&~ zIe%iFmtmfl)}D;K{(kkZsVnNEvGe|Tv?F{GNBoSrk=>#G9V)2D>jWKsSinyc6ePsb z%*d(!R$<(;>S`L7k?LVVITHYbR^~~juKAeA<xEX3m+Uiz(>~0&QYxE$XPbIu1umDv z%3O?sl$~*fh4NEs$KeAB{K?mbX?&lqrNWn<ccC|@H-f~oCRe?4=-eJ`3m0$yM6)nW zk}5$|a<%NfEU#G?+6<`50@4;6I(-v(Ycy4?c}UkZ0Ojc^;3a5o2F|cP4Z01nlFtmD zK0XD$@-~0s<^Oy0auGegC?YQweTf1+T+fs=c<S+MA4Miu#F+vJrR`u=%h~db5!^Mx z^eS`Vr;5^{I;o`2XY9CazsVKIlp&YT{dDu$&bA{2mL~#=^7}bY2a}~UB4^dtG_J{P z<lo7Hm9gaOqqU2miF6kM7N+)ISsNICnVC)<l$JUfG!AH>Ofl8*rJ2CKaa*9=Zk(Hi zHg`6=u-;1JlvmQsaD3q&4p}?=MbyJm2g=-V{xN`BM)5!d$1&_(l$X@*sZVHRrCm!l zn*ZhY%=DV7+c3AAUdBAhng>$53)*05F%r;Ei!uZC;d{HM4TsEl${k6bh^g@cdiu>0 zBF!A|PdCKOH^d9JYwLH1&0d#RqakzY`9Cy{4;T9toFl0`i^9!QW%AQADT@THLcA3! zi~C=4!iDu-dnENbT@ReHE9DX()hZlYsEN6cjH?p9?cQ@M(7#G<;tw#kbYL-h^cViQ zFkU#;51t$i28a_s?etFE929KAn*&tEEntO0J&fYfkbf=g%U^jgt?D6yYA2L5TS;KA zfi<Wny|=XX%%Oh-NXIU|Nh(K1WBz8tEoFR5M<?G-=c&JM27M<&xggR%^ctV*k{a^+ zkiPR6Frd6iC#(0M>r%<o6%1kT!m{Lg;S|EV1haX8;LqBs_iRa=I$zKUaaW26pr6BQ zC6HFC$ds^x3a99y4FeepbuW7tqQSnzWFVJM<fGVSWnT~4Lh+KFwU4?>#qIajU*q@N z3|MG&e`9r8xFMyrlZzECdnox(mS@AX?|7F%;(<SUq1R$5MQ#ecpsHT5Gc^*x+Hb$# zzWfsGRb7H8M2crzwzIBo3dsc)fqcC>_v^<bJ-f0q>I)Zn+zC?pJ*{))lIiRu&X;eN zdbM3nixy}jP8dSa6yEYs#T?CTKj<2PieMxy4jud})1J-kB6C7rQ(+K?cO5A;gI6LR z3t&o1U<EdNAdCvB$@N0=Yv*a?4ruqXy1BWrNrb#^m6;#T^Zfk>-ymoxdt-Zb^X1z5 z^7d->R-j*hGeo!WNV}3#1A5A}(zzg%3k!pnyS{p#8;Dpps!Y1JDNq|wEJ;Q&Sx_+F zMln)wOTH$G1zC3_apkV%@dU)25$A2Mg)4v`#C)P^G#HOS3U+>YBKMP?I=j|qx&8Wf z>wWs(?=3_b-QKxf{&45^ZRvlYMklWCZehjb?wCTDi2R%@-apCA*((t>@o87Nj4g61 zee6>L>rAOoJ6q$66QJx0Qm$XIh(<zcTkpV2AYP|KPk46+uC42~`*|iM1mMlHIH&OU zCB$Ci13N!-PtGuq{&V&Bp(h`)I^p*nh?$p`<P8Wb!|?B@&_WUCx-f0i7Ik%K<n<Nw zCc5SjTV2*EK}NzA#u2u7V^MLo=b4503Sj97)hN45Z@dk(jXGhc-GlGX;cg%5XIFsA z>1Jo;cz|*n{^zwu8ldHr)$6#4@vbq3-Tt6P(?b<c=v0Mvx+JgSSdOw*(V^SLtC|QW zES{eu_awKx{u|o0_lxfb2z7k)hQIIO*Lo$?M$^I2oEp*nBP(hlpSjMd>g7Hp>~ZmO z`9F4FtgWx^zF1v<zWoEP{QD2?={4r!O6p<?pAE!^kv;fd8C&3e8s0#pcjP~%Z<s~$ zqT4?jA7|t33AJ?(oZjTE3CgjY#bAD!X8z5kL(>XHgrVpozbHhU*uE~qgy(3EtT`R+ zou_M?t1H_Zo4@RCt-e~`T*j}WHMDkiT9C=UgiQA!gkOp@_EUGb$3zp<hetm_i3LCr zSrj~lfj|*1kA=$w_P_`qYLNbn!j0_0wtouYf7m%2Ay9`Yrm$g*1_&z0zoa@`OWJko zUGHFg%zimm_x&zwPU8v5ePLy8{O@qUfLuBUVE;f$5U3cn!p-qUwCErR=@&%U(11)p z{h2dR1l6)tOG_EOMeq&1krsg39e~-k3Fc9c6IKUUNGIVHc+<+v**poJY7O_QQY((R z_xf9~mU91-a1Px7mKrd<mzeDo=(UZ`CGc*Kari2(NnSChmRbM7YMt5ZBh)=Y*-W)4 zFgHgc{oy#5?UG?9`Y`2*ws(m{piyWw%DUX7QAqd6ry~kp;bTqqm&PWCz2ERL3h%~( z%LfPCd+ddgBSUbYPayJNMpheore_66_+D?cE31w0NlzR3Oxxj&(yx}#bIH+S+7q#F z<bjaQ!7C^PU~S(M+o?Wck9b2-`x6O0FtF*vVPG6PVg~;RD)2ALM_}>%r6ViGZ@R|x zh}n=J^cRw~rqrt%K|&t0x854}#_&V<2H3J2_|heo{yL^`Jfe02HTUu7qeqL6v9HQY z0}EMN(q*D53p(HTkG@BJtr3i#=tbn<NN-cH@&5R*-KvZyJ&d>`opHOxE?6oPE-eXP zX!~EoE;HYs>P-mA(H$JnK?5x0dU4h}C6m~Vqkg2`qyL4FKmU(|d=``hv3bcy^nxRe zj;2%oHaKhP%=@e4G|Ey=J7?`+6@m#^$Igumro6|4f`C-bbn+MC)$}`=frA)7&iPIA zBR9w}xc+cPa<;3tSi&eO=yJ|l%b1(_GToSgEhk+05K+P%7RYyyMAq;>a-3%fOK`84 z4-6;bSb1xO!^R8Pj4u+>3KF`^tvm5bHMSWR)<Bx&oA<6=w0hmP9vvQii$WtERAv41 zUikHK0ZC1HvEQlsZ<Dk!`*kup7w7h6fo^U58(2pR(C(dp{S#J5>PY0ohZF@;KY3*< zW`|CkJC}w{jI#zFoH64r!5elDZWy?CogpJ&E)Cw#%bV+K>(33qfWHeEB?j+q7)Hq5 z-Ae<wzOlV(&?P{9hTaMd(n~m7YzupcG&~hcZ|r1o&`YmkZT;DXt>R;l=013)2qn&f z>N#tE+FL8jKW?vWtQ%w%@&uM|?DS}*M$;RPk<p7hrMp@SRtkzVU7jlcilvM;e?-9i zpf9)QY!v-;6N+P-l}SeU8+n5mzjV>+-7@Va3&c~PuSM^#gZ{X4QV8fyKlP#P@o9zh zM%Ec1ut=XjaP<^$s0qI5UMx!SwFDo?E3>P|{wY>@hXVCzH`8Zo1Qq_l;gWy-MbTO= zL{(_Tk6yPhw)oFlGC}Lt_?>9tG_3~1rn$nH7t5c}V_8)XRYyMv>ccC=!omXTN{uG> z+=^{e82!-pcPiJV(Hi6quNO}^q!Lc~qbO1c4xw0UIlNq$5HFIV*5hq~@A4AzcVtR~ zL`!4K08!lF1N<Re6CZ%_3<B)AIehe`+>=BIsr@RBy}J8Un8N1Kux)QKt^gVH2)Wm& zf(N<Bwghz9m*>FE3i4-(#xCfogimn9*hQqt1=DW*#1e%`k`aho&NXZ_61O2uXQbFa zJff^lU)jJ?7ZFaY;s<}@k8?2DsvVpMM{;>b!*1?ap^fTeaa<EpbB5$oVJA48<Nq4s zP-pZeD4%XPO>8tKIO4#V@dg1ZCp^<~9(o62Pu4Fhhs}rM%dk$mNxMDgUqGR;@e{*X z_*VENHcuxJWa+QT!|wbvm1Fd#I!Tj&F}uVF6#dXUI6yHzH<82ze0P)hNETMcf=!=F zz(RNq$KMUAaJuORsX>$)>>@eUTI`y)lLWL<<725Mrt5Dxs-D0xRI?0|2=seMK2E@P zK=Ly{=F5Ylp|Vcw#e2Q~gnNL02!E4COEUcK;Ysfdu?Yf0S|UdFJfhIvd+jhtyE6YH z@}9_4rl7av3@ahFvRpSuUW4(tBW8<@$F<7cX@_>-dpQz~7y1kE9OEhbQ02<RsSKIE z^ILk5lr<zT<FLq-*QXL6bot;dFAiM<qIAyy-~EPFz|xpP3n{l_Z^H=OJ-a!ep7r`Y z*iUB$14$F|d?Xx0F^-<tnIBBVsvQ7*`x<0X-B4J3VUKMf4c`JK3U{hh2g#^{=TaPC zY_DGH%0W}*)(<ew4<X$08SGoP|F+#?%+>Cz&5h@q%P*@zMKIt8_o6W6)zh=_1%N{g zFVhyG&9wf%|L6a5t=AX;O))3Z0b+CvjY?cx@^G<p{@|;BxnJfM`4mo0$rSnc6|i!M z{_p$^Ky=U<zJb_O1JJ_&P?fhN&^6G4R9bhS0m#x4%qeh8BLd9Sf_ml5M_#k1<t>p! z{5Qxg39*pxO5y{b$8$3H`vCeyuX}P(NG-ueUV_u<u+7CuGFoalCY3Yr#Mtj?@3*dZ zGp=7L1dbrb_%B6}2=WsxDu{A9@fEYZ_ZpK9K|;N^lC2R}Emw$1OB0+}abG$5XSPHa zH`JSws}QvhkuBirt_|2p75g~h9P0AFgYP%6`0}jamylR(E?F-wVJ-;&_>&2vx+-#< z=_NxYs4IKlV+qbu{j<0vzjt+I4aZ`3c{I2d-HdJpn9R$np687pw_p9Zy}Q1#`EvP1 z9m$A-<wPAUVWWzg<z{rsC&BnWO04g3ol$9a$fR?KTeC8;$C-7$9PTF=Z$0MaVGaKY zFq?6!`kq3j|Gko9RAvkFfW%aa1#vJy00?o@xv-soWc-Ik0*ki1Dn64FP`?k&uU>mA z{6Gq(_XmiL1o|sNmeZ6!jX+&InUIn(j`{<fI+3j>jJ|IJR48fFs%LhD$+-cD*&48< zop#<J=!KDPFer@1uw)KdbffbYE^gjOx%tiShtOE9_@e%LfG8q477|TW5%7%J00R<( zQpYMKCPs!(H+%@-(FNw2geBW8TySFD%5GB&Rf$~Nf><0UKmpXZ(cq-3Q_2O!c1bZ& zP~V``Bng!g4{qC~Un%1hBJ|J^jY<-LmX?4QLCI6ZQ1rEUc58HTdN}A`%*zY&M+|LC zMI8;i5J`=8F11Ok^%y}0^bttJg8Y)cXGqpyBW@-dvq>l#1CC(a)~(UeOT^=GXu&m{ z>jS`VA{%8`PA_8@haf@aH*vIz<uSyNUlHPyOu(=!ICMat(89V0B}<o51M%$_SVfmg z@3P9$5)ZIN$zXAH_4hQS3*2;sY`XCf%>~B85O2SOwidgq8!s4SFKwC>i2MW}c2Ncd zgp6E?R8bL(^-$di{%V<qU9EF`8I?KHNZ17z4^g;FDZYS^f#}H#DIxSOSQG_wD5r!F zHf0068tiQIb^Iv$BKbzdVr+{e5)LA_3U1Lt+}SL^`r?@dytTJkwdu4A83G%IAg@mU zjl|Uz?E9v~X9crNjK;*-!X6a!j^kZnY=#p>ZCR(Ew43VBZ`e%P2&DZ4`K@86B0B1j zfPIr5;M_CND2p|L2Fw?MmC3#eoiMy~m*{WL+0?$AOy0<lk?gYWhcQ2^$Px}{degc6 z&m@{e9-xMth+z%s>saZ}Xj|O{dJtasrVn2W7Q$f2uvmmHAl%VtJ}4^&dydMoe4<yk zLXwJ54GUAYt|!ywz!3NZS?3Ro-jkp{;!Nyc8Ph`qENri14b25vSzIs=mc`43uRP4_ zia}o*edp&uCg6z_$u|*rNqf<#C$egV)HL8R#+JPPeDo{bu<5>V0{-L+Bw3%p+FbiA z0YW7;AVhjY0w2yTCG<_^ND)>cbIu4lWMHmTLqeb-d5<nM@E(gI3Iy07+QZo)DSQng zJ~8D1j2Vh#;r1F9u_3po-n>v<JsvQKrO7h*X5^qUj)k_vciun>uEg8{2fQYc_);^7 zd<GuB0E9*k>xD%G+ZXd0;o|Rf%g~eqR$K|z4=W<&-~yO`9EX_zfY_3|ziD^Fc!BP` zLj`wkd_XIPwe>`}p-zP>SFQBfOch$-yQPpTevn_XvQdP7q%O^5-gp&M_m(8IW0#e^ zg09SuQK20rDCS6ikBaK|^Xz8yK2R@*<&QQflKERnZ+m_fDJuRp2Vcf$%*F7;iETQ9 zDzt53x&n*tPj6(=rD*F^6*MXX-j4$k3JV@Q?~jgq=(?luBK|3rJ^5V2LL%sKj|AnS zhxd3?{||XJN6vJX7G~weo-YFi(z%{U^5lDH0m@0i&gI{fTiI9TMMtPhlPEX#(aNvr z1Pe9HZwHoQ*Les<IC9rK_8g1S<-PQJAiP2cqF&@kO;;0df=8c^LKJj}`<BtmON>~F zzquUF$5EGq6MV|@{K#3J;ZDkPD1!=ng}gB(#+^hFyTTxPXL^|x{p&hF*?5(KERD?h zTF^Ei!cusE&zE{VR7j?Ch>GnQW>AAlCGcm;BI{5GgzXwBM<`31W{#y5O)@C&7NT;8 z<$IEu*H;{*iDDCSx3XbF3QjJQDzn#7$r01>^}Jrm;OHu7k3KKC^)PtF%4MQ}&gs_Y zR1Az4xEa9g2CqQoHm8IT_0nuGJyjiR0%?PH&e#=AQON|(ofUjaAi-f<f$x$=@gUdS zoT;`J*Df^C>0q)m1+-|jzV1R!ApN_vlc<#-h8e8;bs(1qydh9wRf)NRLI`MO(XG^| z%it-!HK%X*UB(;jN(TpKv<OP>?(l0fJ+yhI<Fz5cvYbO6NME5K#CH#JfT|dYue#`u zx2_FSNf^yoSUploZ(MtR;3Qn1?TxaE7g#mKNiS0{9Zzw%<gIJN3F?Uh=RnjWs{G2e zA?S_%{k#Vw<!qCOr*B|hJvQ!qf3NHx$FP3cy-|4nX6C*K<IPB)cs{;!128=8?wuda zjCXrFo%d|$wVi{_5X4b(uVhQ3%HTeAy#<lu06Q{bh#LJQxpGmrJqi_hsNO&Pt?s$1 z|Hs$!sUG7j^%zCeM8y~rjFqvO{Cljm6|N-t;tK5!#VJ-R%qAD3aw}$gd*+!0=DSO= z-fvi+=Bry@JGOb^H0Xcw*zUB;EaY~D)sD`<`pJXxiMssEMv&>JvmzW!__$>LyRyCp z$(Mr#nQYRsEc*=yZ-k7yVy`pwMcVj<^(t3XWjXj0VW=e5H6jAx>~J^3k@OLukb!4G z1<E>WI@`y9qLL}sj0-wAQAOh5bf8}08{3a^Cfo!7EV1ijz);B<n*hc*4LfMy5#r3Y zC}+!2Dd%@p#$O)2AtUnOs|t4Q2AV1CttR3+xS?X;Go3H+PfZBDp9ZA*Yw37Hd<Gnh zEYuJG?g9KN*Mk2_c>?vof|Jp-!f<-=^fbX0n$a|ci`XDFsI8C5uLlP=jl_pH?{lfL z2(B{e$`AtNjj;tDI5Sn~v^CIA3&pRlBYL{pqdShz`g71=h^dUZ#kdKrX9GD<Dhru2 ze)9PKu)JT6ey_}7;pMfn6#oIaqkA@`Bd^a^AE;iLP(#Pz(%}K|cQ3Up4?h3%txpo= zEE1)PkWr)zrK1t=G0(=K|NZ|C5dN{%!yQ(j_zAqf`{O5nIUMnWg~Ort1yqCS_oZ@G zp&gA*k=sQzq5yU!_lG5-8e`XcpaOe_ZBF&nqJtM`o>0`)I<S+i;>|>P#$tBlnfLl6 zG!~dFWnh|B)ncOnD49~HDSe#4&hKn?A4Ffej5)5V%^eJWMrr1l4P=J7B>F?#H~BJB z*bBI-+@KfNA+95{ALja9d5!dRnNv2tuB-aw0GiDK6pq-XYYzs~&;$>V9Gfr9SrJWJ zIJ4xTQL*cto@ogegaGYb6f6jD>Z2T9X{}yznatioFixT)1}OZ@rv>+ZTHXA9V{2{u zm)(E=acy-Qhv@#-N?8{Di9?9o@%WeqlH<9D4<<gRZ>-|MufLr3;4i!JX%sk~`1sS+ z?|*!bQ6GF&2WKhTor|d%%bwX>{+YuxKk(|s^4dBcG4K<HC~SbTu5kbcadCSGV%hWy z-&kIz=2auCO4Zg_xeb*rELBA#hEeMZO)wz_c8U>x6&D*n%O(&hj;zmq+#^vGKYJNH zb<|0CB3V^700_t5m4D|3QaFB86wAe4Z+wb`3j*YywzV#RtXy$Q7z3q<KM=Mo)KP-B zobjb3CB)sLT8g|gVvT65x5krEe6UZ$XqLcW5ZB9U<tVsmt{-0p6AhIJX5L|smm&!m z+b%j|SrnoW|5p3|zr^;H{Zm|0pu*aX+VYlhZ@pM0Nwj(x>nWz>f|AKnH&j9o&wUz8 z*)OI{7fzOmAsBli>B3N~_HU`SSs}+w%P;VHm~nO-tN)_IplHwkS5Rg0*{7<8nI9op z_{5nNj4tMWd!4y;<?uXQZrzyu!uCNxxGoI2H(^#RNY?@4;O(^_D0vi;xdVkCXec1K z=iy1`$hk}-VMkA*tM?K~7~F};6oI<yr?>(+#mQ|`^IVckdjuP4!%w7Mz9<k&I|=U3 z;7V~!<;zg%C<t|HZgih^P{SJ}*iUNhrPSJM$lU8N_GMdkg;=SudDCV1IAJk5KSLBE zvPW>^LsAcNo=E7Fm15cx<bfi-DLm~;a(w9hw2f|0kdn6ckKso6YqxlGJRYAdEiR7n zIduMmZmRRgnJ2_ZxgOv#QQ^o`&e-f>H<v!oa?0N8SpxzQiH?5nFr**5V0#%|JqzT* zZ5sBu;?WglTXpiV@LcJ3<3aYA;)nYk{i*;Q(m%X!XD1iYnvDD2Ja|YDIz5L5WkYuI z2=|QbVC;s;p^21fD_Nofb`6YS`y$KE?~9MQRi!wSY$8L1=GNZC5>?Qkh=u(@P;y<6 z(oGX$oU<XML)D+C=!hPE?bQZ}t^ubLy2H<Y=#wCjhG`_B=LQx7EJpF{BhNK45afo4 zQB>85x=xK&oD<NElIm5J=PSbbNpAYMa#L&{)Kn1f;|fn(W0Yb(Re4SO2dD*9MJHaF zo#F^pN&0YG@kt2jA}0MPT@39H-n3=ODjl|cI6&e3cI)hz;t&$+F*Zw|zC$@4upAj~ zc~tz5^qv19H7zNHcKR1K_1)rPa4w&t5$8Y>^*hBO`cNawv_Zg2hjcI&&pP8{NM(yA z9irPLq3Pg1n${SAa;MJhCS7&tq_a+O=ZplY%6Jn+&mvAB$_~zl$hoimK{5(=gx@V2 ziXfBd8^U^Hy-r@E%|CO{(6xbxm^kBKa`6_a{V-gA(P{|&EjObp1B}yCP*Lx49S|{q zHZ_2{itD!9k>zkg7A%;kj@kea^dW@ilPN6+p)1I3=H3pnq}%c12OiUBGlBL=fF8z> zjqB3}OiL2~sAxLITw5RHiUc)e%^sbza=j<>cd&1Wf71Q50qgArY1eYwe+xH{yXG<H zVXw?4iwKNNVx*|5p&8lY0@9LLUwb&e+$1)VwLhKo+6LF1f+e|hO)aUX$C_N>v0X;r zhi7xaK2}6%!lzb7*h<-#o<3%4)8K2T11cGvpJl{1lua-np1lbVp#G-ElcdYV5@XuN z(@FFohd!a`;1fOWj8+CGgW(ob)By_UnZ1RhMkU3|p_H~c>?~3i!j$+u5UveXQ7eME z$Wbwd7y4Lp*{Lxh1t($tPW?@07~kKC^obqTK`ZK9SzAgGt8gQ1VT?i|w3?mwrJx8D zO>y9aP?FjFxD%bU?g*OTpXH7`**P>hOEpUc7dW@~lg-;XJUlsP-;?yorXATd`!J<? zuOy&ji|GP%LGKHwr1#g_7$Tt{`;N@xpf_Ut*8#_psvt^S_yE328rOAjFA43uYMYyn z|3^99{Wlk=8|^Ki;3DrLKn+}P<>Cn4o9-4bM;D_91!{GmrpEaRdrqH?y5|Q29}4QT zG=&-!Z+mdEz*Tfmob}GS@ao`>hEmPi)Pp{BZcrZD91$qg<?9UxeR9B@*fzW96W2vt z^%Ba@pi4P|y>|XX47WcZoZ$q2y&4Yo!T6V!XzL-u1Sbv-Z7w578AqrualXg?+>2EC zInLs5GS2+54rFimi%*O`g+tD|Jti>}u!eMp?|LJ5)EV!tQgnq0$n@_O2+$ogg=f+@ ztMG;N2lGM@3xna24omtZja!ivbP3x8r+?jA-`HK*c(JkB`c*iuDnNnnN-f0jNF~v^ zMuq1*kuw3Zr>LliEWcAw1kk&PZ9jUa9=6d4*BQ1}sj5?qQGCS-=|J9s1uR|U!2lLI z5-bwj-+<zWLyUaFN-f=PSbE(ahRww4asMy=%h&&MFAPkqeD;KSbr6eoaWnu&b}kDf zp`(ym-+D{&+3^5`ggTGLX70q&kuSG?+1g%Z)kqf7M(5t=KR<jxSy6ud`pXtN##+LC zmb*R`odi|tSxT+Sy4GX>6iexx^-wEC+OzGx9pArqZ`a5^TUUMqIRMdoP~J|Ne|ou0 zUg33wB!tGwnyp4!TVCH<TS1Ql6$9`~xh&_(puc*0&WEZ+IcEa?;QVw?#{??Cgdm<& zcThpR618tNP~vgt<jtb<9zC0jXz;MNc<|-nm-io{Z_D8~2c3IgezpHqXYb1|?{yEp zy#G!2@ZN)iy}bwD>>b`;Wa)_C7XC8&rx*9X`sYBrzG&F5k9Of1L2;zk;(vlFk;2*S ze?VKt;pqn<0sQyDgL@wk0Xx3<F#PT9_ycMT^*-zi$NqqLf%D()EPQe2Lwn(ic|>2d zg@4@nu06lE-@WtQow-Gju%Im5QlFIkkE`SdWn{WD1Lq<ZU6VT+7pAKqD&Ruy6Ys{# zi#7Lf6l-JZDv;>5|9|%01v<{_I1_B@5zDe<>&%#mJ$5EPp{Bb@5g;C<M1e0r04PG? z112EKGMa`O=myYYqZ{rAAEuObR&h33MjK}yo|!#aPjoc9iT60Ovm4JwnVBTA>DW%j znQ@XCud_)`w7cGfKK7o`ocP3^L}Tn%Rrme>f1?4AvNI+m5Z(WOZ{50e>sHmRTet2w zLOfV1<0CG?(d%_q`BEQJnvS8=u&A%lB7_o*KmcM@g4}zha2-yq%|pSZgC@!1ul~JG z*sT?9c9gLbjuhI|cB{Uz#e13$fp8#my@X?2$^k#^7`J-uZ>r-=1POB21+m%HzSmi^ z+;>}dw|KnLW|<Z4^howWS$F8fUKAlotT8R=_GHE8raFrI4{j~{7s@wj*}wksoQUsu zR^HfEdE!En47A=O<ct&M5gz616T4kw(ljI6!7hUBDm1WxU@?;Hcw~&68%^*otUH;X zu!6BBkLnj|uy%D60Iv}cH&c@n9;G^^kgL?5CX*A3`PK45WwEkg!v@sKfe^xvS$%QV zPL;#h6#%LLbsi!D%W!^~-gjq(NAN{ETStI3jI#*rZWpU&R}RugwdHM@*{U}jRnq1> zvi^3e(*u9Rj1M6+8Z~C_9%HO~l*LJ!6Cp*}t4-%kVp5`+&`ADuWYZYfp+y_?yiHo? zP)ykUyyVx*!Q|Pc&n!~nIVDFuVaT?WT}&y9iZ)}DN^1++aakBjCW>0~7B$Xlk12DI z(8HsHTi7tUAy14b-S6dXWCvJF0k4krAvqip3~A>ITf^Q`qYI~F=xua*WZ}d-VZ?p$ z9(Aa&wH{e!V40t|UF{%li+jm5l95g+yaj~8y(|HR`s@1XNT7=F+CrP)C$~*$+E_oh zCY3~TIM&_>l33+ZDY%>oJZn1I%<(l@7aRHZ;Jx5I49bM0gixz4tFhh6*45HTKXrXX z>X{N$iJqQm-sv*_-el>dR@dYPQ2nhmkp!47l{`JYufJdWiDSgS;T@L60&yWW)A&!c z@eX5%ZdQlK$bSgKVKFjed#SvD3m7qw?kHn<Gx^BLs4`t{&|#=NlMx;qPV%jLMh+-4 zFyM8@(ucg0v>s|8hn2qfqZeMtdI`XBo~qosh&6aLIz2WyNn4^5kBp5^j%oJLJb*O~ z+@r>O9gZWE7C9FKHb9bN?iO<O7j)IR@+BOkZ}N`mT$_BV@S+@z3Ru0!*L<#tC&M@c z1_u=8GduTAPtQC#HIYM4`Q*{*X(t1!QiZN7rwQjT{GzyO4iQoHQaPVHNPYo92S9R6 zH=V~Y#(tVLl6M8doV;<HGav(5C_2Li%)?;ngocXg4#CwM%QA`8s?M5Qf;sUs4ARHp z*;Y$rHZ?(jW(5v(8dNx5up(~B4I>1Y7^_vsO{TO3P5aDPhr=6FSw&LmrZ5tqYFw~J z$4QM+J}2;H#8g|uQ64)AF0!zlfUiO}Iyww5oBP`9i*eI%Cw9kXXZJ(EGFV%_>yCgs zmv8h4K-geHVou$p5deHM0@POG2%v)-9D!SovhR|k?B)i+JW_;Qu+BAQ4)6nez;6b7 zJP1d@?;_%1BDV5y+H27sF)^;J-Pqf}y0$uuzv>uPw2It_*c;2s8)b69<k?NvszUW3 z00Wy|y%(bV3T{V_zc)uHs1Qmm<Nhh=Eo3>NOLt2_1>Wl7k|;`{(EK1M#0OGP=!1ln z^Nx_(xHl{@4W#S(I?YQxWA%kTFQEZ~K1FsLx7VU}5y*3AC8?rhV05Pkm$)t%jG!GX z8NeG9+(ME$`NyudItI6hIx+X_3aQM3#n9}#=FF0Ny37#48V|!^<-DmrV{Lp4C@EG4 zqEFI#<%BYzIJuTmmI7}3j%)4c(G+Z~6`*Wu!%MWBuwMXxyaWM$+VrM@4eRrzA=d3- zM>$PdZ)kyU27U`U_-yaot_nqB)?D}4!P>Ogg~Oz5p^#WxZq#!}1Tjn@4q@Xrailzl zPhd`^kRtGw-3ZE@HLfTK!jxcnMHFxTumamM0=_S-BN0sNTW)lnp!rZVsT1>diG3q6 z5%Q;|V+?VTpuCCbkXi5FU}V+{zfVBO9_zn3SdDke*cjp?c>`_+A{^1R)mVNtlT>t= z3J1g12FHP5{j5%_Z(R+<S`fJhJw+J-9JR``-X4+{dV2X4LJ`S}Z3@}c=?hG9xGmi# z$VrN6LoxvclPJJR>Y#H6s7IW}K}3UST)C1(LB+0v?ju&q2`xA^^^79-kH*FZ!-_P} zjoarcVMhFgp0bH=?A(dJW>!wX3s<mMvy_lb>RgDJg+s&VSU*R!apH^O<Q2PxV*Mhp z6!`io%LRP<gbsBKw)L90x(S!%VfTcxX9q87;1*~x71;X2!yZGbctk4g{OI6HqK@pS z7#pVdh<r3CI$IYGglHZ;IdA)@Uv)$Y`9+fP*$gmd;$(16_bBYFvO3o)E;aQoREMs1 z-&Z@P)N@5d9Yt%}hqX(NL!EZS0WbAq*5MPBO^G(_bo4B|WfaF*_tL0nH>eKdHS0m` z*6cQ(_ts(U?}Y?O6a+kn6jn%h*Bv_QiVXR)34hIuiX=X$)AVW=#8d^2Iyhh3(NvX= zd^Dp&t0iP*YK|<e;A&0^@};BI#%1wnaUPz3<Y~ezt5@3#=db-*bZAK)_SN;n%YN;> zcZ>fgX{R_bs3&w^U;}}&t3i0pD#yF=V35KlO{6YDGtbq2wz?R`Jk}xABFEzX4(;#N z(oOwUhZO=(LQ;QlpHf!0t%|G38=TMfjv;_>2&>h(Mc-o}gy&CUE`UAZ!rHhqoHcl8 zqv-w8L=>#{gBUZe27ESB)Dddo6-~P5C{9|&DX9deE)X4tUe;f%Qc<P!C}CX5cc8gf zI}Kt&bgWt~Hk!Q4P^q`goh-mu0;g3&dQ&MFMp@c1ADu$rE28z_coe>ZFkT?oebFQi z0q}7i2<MuLv~N|6Gf@)mVEU-0D7uhqu5-INm&uC<NV9U1lZNaPzIapXG&LnS0$6YE zcx&d+e2_)6CAHOOZ1ZsAVI4KR&DCmU0q2Rta8NDdZc%k57sSJ0co7u#gH9q<LxmCo zNWXAsVvx3i7O;`m;OHf}*AwGQ1?cu1I$EK&163n3QkaC#M&&Am<`wgRCMI8eMU!7) z#tqpXauE+_M}W{vO9B@_)C+(CC_Q70z8A2o_0?&fxsU`TpdPQaD%G(zBx<cSEm1d$ zMznJ%Cm;pC7z>|<Va>}DooKXt!DVIVN>ybjq%bolf_(<^gm&1pS<+Du)pg6(0OazP z)_UM+Cg?fn5SP(*)_!W%OBchOH!!3XvG`77K{RMjZ~K|uQ?jVMf%KYir8wqtxlt?1 zPH<WhV6d9TK@*CT9*1%g@<WXGLj3wbTvCW2@m*}q6SF9Q;SBN^>jC&{7s{2Yo=Kp^ zcm<QIcv&uH6J9Zp_UcY+amZH{JW(m(dRK(qW2qKgnCH_-ZWeTK>ohaCaC%lv8f}Nn z9bB66XbnAQG^rK;YE`Bd-68EsD0L;*VpG$=PcXu%AL)V+K`>ZfY2L7MrJHFUS9K1T z>3QfBN=I8xz1YEumGrP&Pp*topeG`7_y}xq3HS0M!lMbr2nA)+^^y9*_|S=GweY}c zWt3Pcx0dTAb$h$2xX>tGtVZosB%Q}uP~0eAsZzx0GERajIb(uIwBDto&y>&+dH6wK zlP#B?Ff<5$I+WU8TJDQZbG}7vtKr0wtpOq+sMUt2Xf=x%0xbyj8Yu`B>1OcQ0;sX> zKfQQ@EP<Ii+Z4wd^%Y;9gDd(eJS0(YWs_hKA0<7H!?t4{<3w%u5(68tq~^P#1;(>! zY^qQWv5wb7GXYUyDT1D`GPin?3M6(Wf^5_FoZQQ*EN`koKYouyHYt2qtZ9MlOcC2G zW1mDr+<l7Cu$qcmg6XjWou>J`y&BcT1QG6}BKQesmAR9$r*LUtes*VRv<FHjsm)N8 z3p{R@*_(_UY#Z~G;`2ov+m+_}A46-Nfk03#0g^PLGR`QnrqP6T=7|Muk0~V_#tg+Y zj~32!vj?#^W<;`5mL=%$@aArnCg+T~%)Y14La%e0eyrrFd5in4kdO_9gs_I*tpl<H zH=#c7#1<0Ys}rPO#td{$NAZdsqII_@0w^<t2ihBDqT)Oh1syto|A3D~Y2hOJLunHN z;JOdSi;YUV`Jw31Yrl+Bspl)vp%Q{V&i9>foDW?F7EcecNt0AeqBHcJnC7|i9XQs? zqdISCND*2e0)0fBX&s^!n2x{;YN*%A3wq3{2?8c{w4EH<zuiUaiYAEH<v@NmoE1@~ z-2+RvoO|7Q(`1Bj!N7+7aNq5WLZeY|p+RdIM%?)_F1?UM0OUHxO|h-$6i3?<V|x?u zv1^}bT>HezWgIwfw42RqpNI}UjnJ!=%OjY`cu>|JKkc)dX;fB_cR-pI!WoyHd<~s- zxWQDGGm43IhDCLAg1ucKWN+6Uh1t({p$a6#x9|hK`9zyM;ojy=jgesk#B_`{m}6!~ z7g<$|jgjlw+05_i0U>ep3TY`gp-P2L=~K)mtaX?#rnSE4Q5@#qS?Ys=oSQp2F?0O% z_}m<f6H`JfOy6eE7LH5S4LSFed1;y<L)Lte!4>nuk+rw3$=FJI6-9A1Q*Pch8N?`l zTXcDRo9>#{z6rsBlGgX?qGs%k_vMy-){T8OZX(+^qjE-9$@|I~Yc{d*Gge<gh<yq7 zqVwNPK-lWm(<J%H3jFV=O3k$iEF37~bQl0KvR>O79C0*k0*0tPm2SY;on~w8WU+C+ zMCWhqiH4XK-oQ;pY(7K#DYqtWWR%S`-HhcfqnGWYxG~(pbr)<<3HtM86(?yrs`C-- ziR$xwf;cOG_3o94C86EA(5+{8lt`P@d6PRaZjVKje(%L7#+J!i(HVplT&PHmna0WS zE||tW;1)k4<OmZ-!*w8F-1jMgMtX6*AiD(G^JzBMKnijC1xs$-F@d6QaYDCD%^QNG zrkgiM^WL{8tJCUrH_GCy7rb-#<0pD57xf{qMT23V&ncX~!eR!F?A)OmE>byyV<ml2 z&r^k3q1F>GuGtzhpK9UE7Nv7(l;J?f?o@7Xq0rntTPQRNh1xm#Ou1Nk00{*1n)Tpt zi_##S`J%76-O*$dZeoP+<C+#c4N$@1Gxd(q$XzZsb97*=Ru}vQd4a;)F-ags8;#=S zb?QUX6|spnEW`_ZC)6)KqjsU#z@awIdl&YTtJ5iJok<Cudn)zV*@igVV;T{q!ZPw% zN0fEPE_4hJlOWgIOSD##)nO4aHfbWVAzo(}F^P>+<)tED<VhPMS7dok#qg75ps=BG z&-C^p)7N^Ct+UN*1FQP!Wu!vGVaU#H5PWZla?gPO&^Y<EG{ylm3`frP&0?Tzv)KGm zeWF1`Yv64?PaOCjcW-Q#q(MoZBclro<<(Y%WHW6Xt|5f-rk_QAca~nQ!{eA~3?Vk( zG&0DqO<=m8a!92|`_3_(D$Q=@9Pp`WrV4xI@f%2+KJzy|b9HyYA*%8lFmJ6XC3Dw) z=c`JUnbp-C=1J3Bu3ywf9_`B)7LfG_H$|6>$;Ok~6rmZF;K7fve`IQC;U#n2-3v)? zgZD+W1_;Fjiwaj=$*gh=1>F?&kW;hlK(IUYiO#Femwi16qeg%wzP9=gPVPWn>1Mpn zC%2M-oRu8}$9}V)2>q1tIL-1D9*M-!h>vU%>K@vOG_<G?ie7m#5!A*X4qsb|NCoX~ zS1`f`YaU;jKbymhn&~vU(h?c031cfSwdmW_xC)4%--MJ;GW$(F$-kR5O*Mn6m0@1} zr5i_iso4Fj7t%LpbC~{(R_<JcAXsIj2R!Z%Ix8{VoTKeYwZR4?3s5UmWVOlXNR#^8 zPYIQGMGqhv$=8mmN8CiH9z78LOQT_-2gEQWHs$2(p87Q#aiumzNx7|!R&i}j88Zvn zOm*g6lz>%;-R*3f^1LUptlI9Ag6IouNg)>3pa<Fj=<z4Zv#u+UIH*IggTZs9+*m3* zZU(Cb^0Bqn_rnOP@no{(XT9;9zFe!XB1$&D3+YL{H_k|V&zW6Fw06${n;Ly@<XL1d zm#eEJv&=Zdv``6t%O#pe3HEHD2zvsV<c)ro8gL3&@#N_H5CMm`oT`j(s(449R0m?* zf(Y#XpbrovPD?Z=lBBqUm(!M0@kWYVXRhU)&se5fUtd?^*O&(-T1q!pu?{AJ8-Ywq zAbu)BnXDHpFH~jL{isEOwhl6`DD?44Xw;!owpD2%n}^YrU^)lt484REWc%q=<xFeJ z+aYjR2FEnP;kYK?;wE%}hS@b7B((?}2S&{>SuiizcrbJdg)uRvgT6zQ;o(P5oPK2V z#N4UTlM~ZZqhk}C4w_eJ40|?LDN(v;pF17?lYS<eO0iP8-MdNUgwRP74C9qUM5=0M zVhm7XbKbNzIcrdqf>PLnfuy;sc~^spjX+$ti*gETbC{Vasn0rqrHM%VT5B;6jW+w# z&gN6+^7rp-?xH2K5>o^ct-5g{xnaELQ#B>!N!J58CTJL)%lMcfhI|VNgLceV&*oH< zO$?J;(vmNog;dL$ffS^$=N@4bNuOeND)4q1NzdoY>V@esI;3WMvgPSvU}mm@5>m(b zPh4TAk4~7;Pnyxr9Py-BYNQ<XJNNjhA3b&Y31qLP6_qO#+#w7mP!|=?A|8r;gyC?| zY=|-9&Stc;Net)+C8zy_7Z$!1rUcsZjnhyHSX<N9QmExrXh$@Ij8@7$bn9OG?jk$1 zfUYC0-o~Rl94_9(wvd`sTi9wlrn9kxsjN4FjVzQ3@@EtEoeekbeAyZlYhi5-jx3hV zZrcpPz;5zR8#Q4WYpc6#@l7Hv+dWUxmiAvft&*}S5Fy!Y9@jNA)pZRi#pDhG<;T-b zG?tGTP}-d!EgK42C>nkT{bgfb4lO`i<6z8@XjZ)*hU7hWh%OP~=Ol#1c!%CamVVWM zc#+f4b97kp86k^Gny<ayDpvVa1*uzOJGbaD?uRI~mc@FOsiY%ceSFC903obY&yo#@ zBRB>wgOhK)Y~CP6yLAUT3daTFEM<rZ^M;s4Q<J7a1nnUT%{;QRc?cIE;6nt$(to)< zUcn@s{Sw;lVt-3S1LF2$mtPox)(=GcK(s-mkjB!3k~xyaq_EjzpBESD%$GvWL#f+6 zJXpGM+#H$$5v;KN4(d58wt$bj=1_wS)z+4j45KLKt-9BEQj5&m^!^x4XN6qv5r1n1 zli2vAO%ZnwAvVpWlfew;yGYa|Pb~0;O!4HF?WEe|1eg6K8+S-^CY_`)S!SvqrX?70 zp}y6|C3s8%#9C1sS;7m&YTWxmHL|9)SzhqTS1j|+IU9vk(3*|*Q`VUf9YvWEvkS%Q z0^d6|V?-cK5J9jB&zFqHIaeYzl>^L^>>_IP{9)Fzd#1DnX;yu`JCV+X#ELW2wkW4v zrOu&*sbh-9cHeq?cMfEmvb#&4coSY8?i|EdzZn@IJY$k}FRKHwuL<B1WvgO3E~s@Y zzR-$Gz`tJ7*%|b1WV7FShYy^6Tx(S1^}es{CnKn~TCHC!mv%V@21RM)-WZV&<3(+s zZh31pnAXB=o#!s8H`P2(M?I%qwkK7MD+_rm(<`j)eeK-PR$ojqdg7*l@K6Mg8c7n{ ztI=RwTgRD2R*bQ14m#lA6i36l4cSV{8Ky9`h8-p_V!=&MKvKu`l`tUkfH@danJp8| zX(-w5H#Us*z0v-RHUJ<$XLC$tWt&EaDM^tbJ6u^-VNzrC(@oDT{q3i9MuKdMbWRH# zH|ychxmC-+Ay~RMQR^&dCHJ6YV%IHqD41RGM(Vg5#Maq`CQ_38X0yMp0+?W^S?x#L zrnJv^BpL`=oClG{(e139p%hT@A*U)7Z-^Vq%JH|B*amc{#1fdF%Bo@XcvonkIrIkc zt&gImze|F3XuclH1$}=b`y{=Sf492CP>!d~?ci&_d+(8rYy&I7V766g<xI<Xgqo|B zg?SaXb7R9|r=(*RbTutwpc1$?RtD>3wykBnWy`{!BC#ql-@WC|SXtW}-uqp*ABMH{ zRtt;!lznFj<lOM)Gf$MnaDy278=#;B!XMLK%i&>c&lKt6X=y1@(RLtQ(6Xah;_Rgj z7JbZ;rgD<Dvf_F3yU1y_fFhkIHXO6h!9S4_gz|dScc`_z{&v1)VkQOGAQjCYc#p+p z`B0H|p#Wm&T3)AR(z>kPO_vkPs41%#KpgN*?7{)wQA8o$)XBILhoI3<4D*25gwXQu zR^_p?jo@w`dpk^jUAOm%vDD?rVtF9!3;96iT5wO&Za1-8;)^S0*~P=bepQ;*!gVl& zaMg5srN$moZ#S9siBfSCM`M|s02$$l*=AHuP=$q`(oRX1Rg5=`@1bXB@0Bd0`Yi1d z5}UbN&bSoZhvOCxV4FJgnF?J@IV%AYy<apQIod$QGLEM?NE&Wr($oYhU3I<Z3WIr; zL(5Z<w@4*-!z{o;4aiegGe|I$v0>;T3zlt)XjbvmxoB1|Bb(<s<EX%;NoNXoVc)DP zu|vu^?{+a$8Fi9Au<>rhSCL(nQGMt9X6elBPX`;_kXVfvR$TS2-lQ>9x|62ReA$U6 zqWN4iwUStf(ybKFmvI3YJpXhXMv-D3^~k{ugU6NHLbXll-S}D>H6)av%(;BhwBiX0 z<}W>l7OzR{azJ_%kgl<e_;OP>T+&nZP(-->BRFmx2#X4Wmef<mMUToXH+qglSjylC zS^<+241f0c-#|^{*`XugeUV7Yc}h%$BmPnG0@898=~^X?NksPx8wz;T6WNt2W<7(m zudh#iX9p=RuS$&kF%7A>AB{y4!E~&J0OB)@lqJL&FPHXa-FUuy8L4{>;DCb9nsN$H zcl2p5(w`A2jGcsTY*rdQV9lJ-IQhX}oDULb`g`m+1h!C|h0`TSqM&Ey3-v`OyaEK2 z01c?)GoPI)W|SqVl=+%SHuKgUO`4rD?zr6x9-7oaH*rO3zDPKk8U4UYB{I;DVl8Eg z=+bIZ2A!nx&n7%0*4SaW$HhLWp9E$j9u)x}A9%8n920Te+6!BVDJ0}#{2SP~R7U^A z%H|@Yw9_IDyYZnCe4nZ4NdjZJ)LviehK%2-XYQT|i9Qjaz2VUT;@SkJAau3tq1pj! z`ND+?(~mBtg21UBfsZ)Rnu5Ug!zn!F196J}Z1=K>qpI>+Q-kCEuwdU$8cY~$E39JS z0D6CpaDwzyv6X3i{IT93?$qsr!?5caxIQQN-(nmXjH#5Cf4f|f1)2Xiz?KP$9&<WW za{!wqlUb=?yb?~TJ3P0UB@gd=I;rSY+cc&iC#Q==f<t87fj;zBOmgU*7E?!~9m%f% z!_5*IBhoQ;$rvL{Oftl0ATu4#=v*XqwF0Az)s`As6GMe)37riqC8J_8(~c=qUGqw6 z=x3JJiXgcgj+14h5g6JT$MZ$a3fEd?g|3Q+V%mV_&2tmU%qMYm6MVw^T;xnE%a=;4 zFc_KXsidt?S_^gm++MvV0TCtciA@ttMls3E{bMVYOEBfgJ4E4A>SYS4Avj}!P^w}o zeThJY$y3Kf`k2yJJj+nWnxb4HB^U@|!(`_02~NT`wusc-z`&(?12qa(c8Z0g+u+HV z-h@>i3J|Lc7>T^|CA;|vR)U7Edmsfvjxpj?!Jf?mFj@7fy%9LJFB*d7B6?!K*-zRW zR`OS}78LM<NQE5#TX?!zug&r0xExZ?90G~`*!1aBbB~{zm>wIQni!v(J~29dd}12+ zzJzZcKQ%dadVE3~!7=VtxB4-~52+dZj8F)>h)NXbG_EN;8Te|HDAjd|En(?1vssoC zB}~)X-Ji1~t7~_1)zE-y6wyQzcPA{AkrGyQBWYw+v%FJAUXXIbgzu>q9j%;T48#!h zg%V@SqA00xVuKC{NWFFWC@JsxI*?V@g8o=Ow4b!RV-u-K8jCma<tv}0#AvFU71DUg z32+0QwZ7^s*31%j#_U@kvw=sxa!z3=yW<U}QYaE#?2sv?%7Y}I!%@OwyQjAYL5xs} zoZ$f<;p6M&XJjmSB9l!z$w!AK2T+!&74Vg`#C&46cCpsOo-PGTJ`kFrPI)m7gJEN? z*M+<gsIWK86@<0I5gB<O+<1Eg1$2?9DpZe=!OCtm)<H;OB3djoJ=&#{Es+cgt;4{G zVR<9NJ$IX+WW<(cXDNTgY2N3fusg8%pk-^StAEh%Su}7i4%{cJgpf&h{0VHQ7QuAF zGQctM02zm)oKd$h^z^j6F0I`<4e~~u1`!J&HO-e^22m<?os)JedA|1EZNMNor|f0a z8<QHe&a!z^l62il9Q#Hvl;iZ-#1R-}=4|13(M?HS%j*C8DZQV*IqR{+9DYyZ>0$$x zX}!|yYgSh3wUK7IhU19v**A4=-FQkrbDx{!_OtWfz2n<H4W)wP9~nV9u<(Y!z!=k) z$f*o?qEj3Y9rA$P6zRk0T`@{mIfldy0=?;>NorN!k|-{aVCl!#5vsg@?ka)#RL6tH zFA-FYmRRrxNqyj-;Y5e2+o6P1!nFw<Q4xEjJ4B@HO+jPa#0htYiY<Sm(NXekT{Kj= z8{NDkoYzIcDZ5!Tl)E9`)P~YXpOyriSOn9Bp%L#u;ntQK@<l67rkz4c99_VweXc}z z1<z4YjkdR4CWfc{>xhFV<c3P+vm_s)Oik_H(ryARR?LQuBsdW7g5&cH?ieS_SZ>DZ zBnNtr2sG<Dl}ebCCK)CSd$HM!cnq#ah1H){02h@i6Fk;`5xetnP8MqtGN8qXkuPba zFk;=%Bw4_C!pWXuOAZo>$?G_RA~3d!o)SCG0$;DHHjS7SA6rGvLfZKGicS>N?xZc? zrzMp7Yy4`Pp_(IVwt$fXWrGoEw^jz<Un>K}v#08<V@TatGD`+?-u|YTzhd<|Tq+`s zT{iy07g`9HTf|cDU^i)Qsal^e>Vz3OYl#~SC)3`%A)gKhLj})ihwONzR4OCCI9Ya% zDrDoD-IHRiA{jT8h=Wv@UnN#OBpPv#mNd9umwrN63$mYf10bo*GS$t%gm-U;a0bAO zBE<C@T8kT^L2c8)W1Y*|5^X(wUbMNN$hddD3W7unWsSRy**J|@F|X~c{U!xPpNDsi zz#KZI$Dhu*4I@qs37L5)uE>A@4|2Zp@oIBpTJI5qR5SE+Dy*?JLAQE1#B{eW1s&?7 z@$T{QH4D~7+hrhCUd_<ib3WSy!)o_vH`Y7NbvLwc8faS2*ye5O`4E#mU3N6@@+gg{ zqEy0|?oj*gvc<2_)6qi|pyQWNGe{Q*iDPYc)nu#-Hgf~A`$$MD8|$Sy%t|uX%a<z6 z78&Zy=X(E+*d&c%0<7uum|{R5TbJlsP#JSHiB|)9DWJMJ%vpB}FPy3279V!qt2E7p z(#~YZu0hpYgld={CVWy+oc6G>pZbOpQ;Ei!W~t*tx4S^nFfP1AfH@N$p@nEU$os}y z$-0Z-@QUaOI!;4_*%`4)P@s*ar-eBcq92QnZi9EFs0VJ#VZ&6FM9>bs?dj}RQpN^- zKdKdZ9DlFcp#12f#}K9ycu5E{{m`PW+Y^HB{;P`!%SP%-S|b4mIgzspQ(;lTNd8R? zfuz@(LnOCqSKvg1I4#JS$`MM!-ABRBIj23tZ%t{EZ3hY!;7or!j;07U^z}&R>>G7= zJ;9U~<loq=^td%)e?3W6S^bFnYlYDRj?IdJl=hYyrMqtv>u!>PDVQQ<_9F(UQCzS} zSfW2^pVS`;;<`emrjrx_ART~)pp^T+LQ4=Q<MdqzSK@>2Q(!&LNoB$WT1(u>x)2RY zmcw{j`G|!Rsc@bKCm#%8K&Y%gfU_y|q2cgbv-A#-GTdyqA`P*4NesjE=`%BP(=%r# zPdyr-YPl(1kp-g;?$L8-x{OOn<KwC6;uf>L(X%}yjE?ZpLbVC#el1G}`$=1CK9!~3 zt^L^Vheh)D{7x4y7IsJPJ9)wcbJiPM*^-X$Q^`X8eJfSHK&Km2FST&pansqf_LuC& z*u<KIX=q({<Mo9$rGD$=!XxXhFn;=^E*qMsrTPkF8Xf0yOXYI|ef<<y_xQ}Q-UDue z+$<`<_*`8D(qqe&YKbEcRk9SK9Rws7!QIVBEiq9oGln^M>{X$hYo1d8q^%qP)^VZD z4scBw53CiD7QO_ZsXNrxPtL;2O6jMjolQ7L7-6v?*0CNK?bnVMcYADQV#mJM*?ZHe z=c+_^{T64m?zL16b%Hhwd2DSbEGDrY3)HY^a&NT;0CQ-uPbwzCv!IM916F-E%LB)0 zf?Ms){>RN{bfqXeaHA^Wjfqy2sMdP~@#>>3gtgDNTex!zDXu|NRmoWtI0|3CO{h)U ze=GHu*-Pg^uuC2+B?my!{xnoP3BU;pI`OI$NGFR2O*VO$|2vS{Ddod;UNF&o*d)C~ zG||z9Q}t4r^U9ce(C8S29E%T+D{Gl8`4C+uXB!l&$VSY}vU12B<WYUC1zT&9?IFQF zlROYa)<7;M$ybI#V=3UAVWU}Qg-)VXu9<9OSxgA9>7YLD*eUzQ#&3Q2E)a-%rRfnT z{W8L!J1`}^_PCLusY>aixKUON@1by+kz2G{Pa*4Ts&S)qjgZw{W+`Of!}sAE_bE!k zibk-Y*E$1KW<c|i%QMBLQ;=JE&me%WrBz<Z_q&Z*mhE11j9TZo>6r7(bC-ALm49Ou zOru_J!8%N{p_-Rh7VEXk9)pqW*;FR@tZFRONm{EwZ0d`1lQk1DS{JR`bni(bE(HnP zR8BeQNuGsxSa?2TT7I#gY##x|8mx+0J1Hz(#G^GB+a$?QMzh0Ru6}T_Mjy;NUAtE- z>a07=`<O|l@nA{h8xN)uQOSI9rmLlck<xAtcvQ!<S64i`s<{{%#{Uc=nwh0V2GJ2H z7!jjj#>%0LD9J<|i4e|l;us2sQ@o)x{q8iFwvacR#K7s4IRz=DlRX%BGe2+!I>eGd z+ObGb-3FCW+Ar&%Nld{Q%6=OfPB@Llv@}p0oYl=LmIVnQ{a9KgSJS+ReBQ`V!QD*i zKY_9|u=si7reJj-fGUyLeQv^n=t8jywhrSF2>P*;#Q$cWr>GxiZ?Qwf=Npl(Ud=p? z@UoN6Oh+#|%D&eNXRULk!#AW?vMk(mzV2@N(|P521N-8bLV@?iwR4hVlR{sM3`xgv zvd!6%vgXu{9jh^s{hLgD*ts(bw(W$Pt<V9=pOAFlp_-pJX80V{yuqlgjg6brj_odl zowlCbE*rsWZxnN1vwD<QDyTD!B50Joh9%_!j26fj*C^vqdOebh&#^IHDu<z!!5M#` z>1uRx0n(B<$_fbj43ot?t*p>J+2zs{vJ%x=;pOyJfB5CF;3nh<nB+q-UqkibG#kit zi%;*7`o&tgp-GLU10zMyalTbIqzx@c;tN;Bc<Tv?&qW_2P0V$O=1*YPZOX3CkSyX3 z1#xf`UE*iSXVq%BiDg}p2Zt&-DVoI#WvEB9029Pxo1Ll7M^Eg-j8=}%H^3h(;r<;| zyT--S?dp^Os)eQuO&VSas4gTgN7C!#9KODd-Uk!hL?82anT~`Q>04hyaBS@G5y?)l zWYUdk=eb!@bf6e!4pNJ;OUx&l^MWbo!%lE^8Af0#I%Xjl&6zANHGP<pccGKH4Shw) z4saE*3s65L=GXMI4t0eMSEP6g1hQx@@n69wi4E=M9EHJmsy<u5NuIg#B@$R^<+PAE zM?llsI~vWVyrODIeByM{N<h<FvXs@An6%S{5=Kr)*pVZcRvwMXg4K;Bz)a!>jhfR5 z5i|rV#qv#+L4i@m5=fqDt^d6seZ>Co2<LKpe36Y=p6l)9v`$htMF6eVDSV6a1K|^n zi12jfveW8-Jc$O%QVxL6xSMLU_7#OMcln`yj9F5J5gQE)?G~d+SQeV?c_5L3!Jeoe zCI_|Pj5%}8x-HP1Ah<@_xlBlsa6H2uqWh(jJMFfV?0;Uj=~UQ|6oOK6)0m=23UAlC zmbuf%T&@V3;}h|2yZ+Td3Hu|dy@0%8Xr3O@{Gl$kIaB^%yV59^)>R)qg95a^xx>Y^ z(){b7i!=#f#H4B>c97|U-Vns5h?b|miqUns5m&(^z3|mbQVG&czH&(_<*SyY5(LKO z*>Ms1xEedAR>IkNLliOrWuIGlWwmwL<PU;aNbu8cOtBGY`q8>5!4IZ}Y7+`hKwIFO zS9BVZl?n93ezTuE9_*M!Bq2P)NCmKEVrYbLho_JTk#qs23}PsyT77-J)ESnmJzPQA zxmF+|-Cg3&6_X_4hH5*)u2a2WiWuv;Bg2_e@v+#jot-;XUPAnfq&7{n9-v8cJt_;D z*QRB?1RLzxyAK^*U0%KW?!CJy#ApVQDiN}TB2RFWmi|bqh6An3<!D;Ai|}mWd~u0f z0bD-6uq!%NoUg!FFoi>>wS@{@F1W}~M${IQd({4zO3=E97;!{AuU>9cmX=#M%~^`z z;=t*AN>D7zTWs0viB_v+WZR7{R1i}{Xq=cFn>aN+L8vm8t>t1Xx(K_tgqVGagg|EF zN^2RV(Sv5a-M~HU3s}z+#(VEJK9gu}>iE<&@>b2w4-P)KfB(YJVnOwh(mJfxYj8^7 zQ>|IAmJ3>;{Pn!cmTl+n<-8CoT8>hy-Q;k&$B@*`4rY41+zoMEk18L7IIs0LyBOWL zqqo>9>LV91Uk$(0>)d!oW03+kq+h3bF>+&E@(Dc>@Z<bO)LFbYq!>1!NL~MOS1oFj z%dA4&Z017B8%R)?YbtKBQ}pExVHew!5E!<TYC2Bj8`HxZw=>|6oZc1Sr(Nv`#0K-m zba2$V=eM{wAcldP6rapInFF}o!zeH7@VARmcQ+ojC<xa<Ov^lqHw)qk;*DzNcYrJU zhDXX=Q{EUn?4?knqk}|M{ct&8cKzk_k4#fYHdR|#RMoYkm$chsag{-3%drIB04>}@ zawIf17ve&|W^=Fw^<GTwoD2y@1Eb`;a9lbTEiJLuY1~GnB&?jWi8$!^mP9lRJRcKF zB>PE0SLAL=xAZq#oyBgPX<|bwxVk(`OBR*X#~vZHfRnvB0T@Bcza7D4eM5U4ZjtP- zi75nX#&Vdd6q65Xe}@WF*aD@9?P`Aq<?}@f(f|dxA@xN~?bt5QVzszLbIs0un~fIP zvt|A}nKr#GpCEIsbc`Wt-<k9))%B_^m2pD5!`2UXBG}(lOAIwL_`IFANzBmXp=xqi zyqS%ZpqRUrA|<&cIlX708MhS52w%yb20`oQF7q7Uer(~z97haSJmU=0BytYwC_fN+ z4=IN;TrO!&eqr`?$nV%c30`j<uwLUOVF^s4c6ZTihXKjz^6(U~B4KKFTJ@v%W<5{c zXHT=YR%fDcz91Q;z%3cRHmhy#ML2RBU+ad$#2B&T%j;;e&pqs=>qT=t?VIyeV@#6C zW}5Mwkf~%e#bf?msp65=DLhItho@Ue=I$qm$S9t?<96o|`)VQG&GhhUButK^_v$?E zI#VOCUU_=hXY3=?)@;gj$W|y>{HQ*;6IchXJ)`Yn?zyP|kGhUmBQ`b@J*NKrcAV3w z#>ippHDH#t7Mi0KS-`S6!yrXEbTY&|#8vSSZ5e`Oq*awvl;yo3tl(I5wVC5EAv>=q z`5EoSUNPOFlJp}Zq8rU=FC-ZbY|;4iiZ>p&Rtc&wlK;u*CM~~lO+AgFKU83A>6QCd zp|>uVx`wOzYz_cu$<0!AUAfJM0<otRV%l2v6=^uLy;9zcb<VuA5yyyxLn7@WYx8VQ zj)5?Vlo=><L7zBr;3eB`rq)L8v!yXhL}F8?LLP6zTZvT&Y&(Mu6umh$LsE<nTEw~; zoQn`?r=*MUjnA1@4$0JTo3rmQ2VAn5*}y%X&8cHl%=iX?JxFEenQ`U9Mw6$vPCj?* z%cU?ixT-Ht)}BUkAS{Uw-hFo)UgizCgvTV{aSJ(sHG~tz4_#KDH=m36M7>xlH^^b# zDpnBErU1(04S*dl$EZ`#I;t>TZd`zueym!j8wT~`EkXyTtJrWL+~vbmvDq|fBX1ON zh5Cv5La|kE;NTFovSr|k*pIXkl2~qR5u8cz23I{y=}Jix*u2<c182&MWyD%8Aj3-6 z?4HCAGss$6a)2rK{h9I-HeqnshEmzkwh8`91{1woq!ZRX+PL<Kr8)u>qABodu^k<% zVk79%r4jklM_WKh#fJSFm5r{1v=<Cgu{8~zn~ph=b@b8qhQz6A`7cvK@xx?Egr{B$ z>q20V;6<%I)hJgn%i^z8Wpx@&)eDk<xw+kRax6uj03qmnB&^}y(#{#(<3302mK%u4 z2&$sVgyK#)7i(2g<U?PrKDR0za*F#s@hhlzxzJfbrbK^q2+PoRZDFp~UO|4CC1~8x zu)y}*(o(sB%(rM4vyfboIkiQ&S9KVu<o5Rs(H{)>Vr8k#mxbwMy1Ht)MCrNa=EiXO z&h*?|Cl^mDjrB+e)R)m?8${H*0w9#ul?)F!1p`uN-S07|F+ykkCsIMJh5}YvZPXXa z%_c(aeepvUj(QS~k;YqbJ-e1n;oc)yF%VlXl}lz?Am%LWf85Z{R;}tfSzHCbxUN?B zEu=-bWXU!~n@l2Kg<sLG!W8ih+O+hlz~=#@y#)_h$YK;DqAWCkwB%5WSN$#z7!J>f z!D(tDSiD5k&;)SDF{~xxDb^H1+Oc|pD0~E9a9c61#;sQ`l+V)TCvJ)h#%rt!VTS2q zd4v$6S*0`Mp{KL`a5gJy;5xdn<J<+6YmRzO#PO^6&=bvd-RzEhwh<>EMzAW@k|3Pr zz9Y^zVM#}jY$CoiZRRH8BN|A~Y-pwuogPC{DK<9b=|Ztasrly1c!gZ3oSlymfL)Kl z42VbV+XWzfqaPyaj%<T+u}!z<x%TNrePCsHSoP;dbY}*U3Lg3x4@@rU%1RqqQ_&IJ zx2&+B7z+|{+^b3nU5Zb=G0_ADO@BP8d+`qIYxXdh`l3mRvD`@lb|?KSqc}XwzE5`5 zoC4?S(9(dcehV&ighp5C%!GHlpM<9dFtjA1W(Y5KS<W?=D~l9aEi22Q3a?f58VGf8 z$GUr&CqYVL!cDZ~caYk(8AsLROKVM-%gP_(vMCnaASUtyI--eRiBXd9Zn@ZWgpaQk zQYV}4>m>PuL+hbW(xS{Ub^F*2T2W>X@s0cAicAU(rSUKqy-gBlVzTi82GuwB>Pr_8 zeP&5*mfhOYa!dL2<~mj>$d+Idrlh&znG$_q?w$~6VkM&ME;&amN<-|=rZ&Qmz>P|X z2HfasHR!xqO?qMsUbcrAyA?<c&VnvfkalQ&OPchOo{~YURwZgFPpXhVC-T0pm~rTU zMlumSpKP`r>OH$U@gb=RVtA{d)>BSAwhDE%*IQh2D)|GTdBi0h(;B!ql@j|yb^ShZ z+s?2PJGfstTPp!}9wzOu$02)@8dk%}a%;I>8l!BgIj|711Z1qwBEi72a8rayBJ(;; zjEcnMRuq(TK?^=HxIHaQH_@PEF{So+>aX9}4wu$R4YK6CWpWUA`9B-7puSg34rdNw zo^@|_jJsP)iIzhGA3KdDan?F>$7z!1j{_}aYZ@3=H#U^3BcIdyl%j9@Na_NV<IvOg znjHGmyH0seBtYb=sf$kz5~OWa*5Ey?Ez~k7aKGhUDQOhUuEZ`lYQdCLstDi3Ih53= zRFPr_C6PS7AsZ~UDeHccx6-4TXJ>R=nuR1*)bc%k!^39iEW#jkKp5ICa2`STxa71o z#T3%3y?o5_s+8!Mle5xQguLae@6K26cs>!J&JpKl$bE!++**7GPzATUHQ-KaX<s8> zlFC;wl@LkJG2<{7$r~9uAs@T;iN>{0VHGk{T)`3aD*Tm)o-Q})E9H@ve$rPfw_Hc0 zT7|`O%9}vqRM)NRtu(zdUhdFUS**f&P=k-`LOJ2m3B=_WSF|h8=!`5<%+O|+JTPrU z`Z3P(vqq6ECvye5coboisUOH9+jevU9$i|V;`+Qw6}Q>(0tYME8cZ8~H+7_LvaZxx z8VLWzG{NbA{bLcL#{m+BndL_PBJB}B!z(U$!^#&b^>&kMPw6k^OABR=@rjI=fDQ%N z#|z8Y{6K(|0<W$F3H)bCu2@AR6JqNTfxJ_Dz)daE0q7DgIYz=Si!)9@Y7FHjj?n!k z2?vIU-In!mK|Byp{Lw%hVXNe4fQ>gqVmXT(cA~pS)CQp*-i{RE4N*Jl`4E4-*(h!a z7aQIBtz#tJ93wGv02_`<oS8>P7HmyUflJGc#Uc*9#35TLWu_Yh&#j@`<k0Eetj#Er zGi|sqR?23K?9jyCASH?9J#Hop>8<hW@&uQmw4Hj6C9znnRI#H?`EHPDnk)wdiA9Sr z2B2n36$<iY<3kVmqs93~rCg0pL%i0j?S=E#el0q*BoF)Q`r+k~r4<0y=il^h=1I6s zprbha%b;Z#;MVxVytwfv_za;F#~-&zT1%2`8=P|lJJ3e=I%eb)PCSBhO6_Q>3Ihy> z4iBxCFk_p^gHJvo4oy$DA=8Y^TXTK$b6ro|&B*E#^`**!;U6<m3&HbSa{5M`v^8{I zf1XN|rY!idU&zttT}|1|FoD{{lsHg>q-BP*P0n@KeYec7?}GW2I$HVyjm@v)Z;fX+ z<N4lpxw+ZMOEddY2g%%!>X>*%WHqcKcrp5*YC5#(x=mxC&A2fJr#oUKfqoFWbfk6V z%~9LBQI-#G;Cd+XVCj=QvZgjg5blGdDtMcVa0n-O3EQLIIH?>zD8eBo5@!HQq#|*I zs*>v+@LWh)O%kMku=F8gxY#^Tf5^!Kk4q!)+VI{zImVe1@YPWDs`3~WFTnIAkB*{y z=q*~QT!L-I`{I<~O)A5^#9xZF=0zluU~|0HZqzz@FI=yRxH}@#BjeCfIKs`M+emiR z@NSguQMjpKcVq(PpU(+580LyN%3~R67b7I7pd=P8T!A4-M20kdZju!1N>6kb=`pfB zi2I53Ku|!EjES%ddC`<B3EPt3kxGf8V0DC(4gRpN+>jbub+p~8BM<`SExZiOYZM+J zO&QlVwdU~JnKF$aytN@iU;@$)7FPTx(k?4|icR0$C;<$SdwbECG`fzf%A-QeM>buC z6WN`CVo`*6J+X}JCT=lGEK+Xq#6aTBJ@O7T(VQM3T8Sfkn2Qmtn9@<EYe&{bGbb@Q zDk35Bl&8>>8KI+2jg*Tlc)|I4L-@gU2MWL#Y4xCAT*j6-&16UhH5fRhSa!*oMjh&G zN8(hPE^R_mxJcqE5=+Gtj2|UtAT*V{r4TfQaT<mqY&znIsfBYSkl*Vtsx+E{8uRJK zQ0t1d6lPjx3JxJ16-&uWXd$?%sXvyHTtctc0ajOLM}kPKRFqin&5+VF7!SV=!lNj1 z4#C8=C1eM}Dt)<5vG-AaC&EDqA`!}i8UodFrYjmvI11L>YV2y=6neQuh-&V4OFKne zOmi!F)wA`4avIsS-QWt#aZ#(b4N9H4fG`!(&&<D9go`1FwKylFRTyGSmAIX;<=m%E z7oDkR%Q_F8qBzmrY}OZSG4&wSF{Ce4|4ldZ*kvU%s$AMdwu-3&ed!{GuTI<erkV&< zJ;%v7CByfG!rr~n*m8N{JhL5`vP@PL5Rkn{#nOhbRD*ul!jR*)NaDP(oX_q3!0ZS1 zoO>XDba)Sc*tI*m7u&{)-FDIbvGk0Prz+*-#CinXnkZ>&92<5U5=J-U>VASrKh`>t z?_d;NT&ZG=TEWDD?n%Vou~-;pRIcLKmF2w-pl3~U&ha@0;t`mKP1v^5oM}{Wd?NMW zsf~3DdqS~w=Q+y!LejWXvj!d2dt5q8;b;hos;uPg$Xy7!9LLxvtjnC1u5MI4LFkP6 z1qw4y!aIwNbIPR*JVS^+RHgSg{LkF~%2FT+EY)SYOEn43O+|uA(~m|*q5;v0l><^h z{`JX2&*D$0@xlV)!V$Eoy0{B#rGYeLH!??Zq=KOGE>udG*lJw@1F*O<kJBmGq3(+y zR@;d8Uaq&RB{KVvI?j#gE|6moJG^<y&ew=~C?G^*+2u@=;>2DmT)JFrKyYN4$N;Ct zD}mQo*rdrgO=qSbXHAfd!O~nB^{AHW05H;R&#Fhk?9@%jfdgtt#f&PHXQdCxCmM9+ zq}I6WX^nXzfuPvtRc2%kAXj94&wG&U5GvTHjCGN65Mn&ytee85LS(1$G$L<=MME*p zD0RnK&|t^FlQ?`)U#M`niMDz7@F6}r&sS?zFKcZ}wiO8k2uLx(hGV2okYFm3TPgRW zj$%_IfP^XX$tR>wL}DHncoONfQRFD@vCw*9e(=y%wF(Pu?BtLTiC1@~*0X}-tq`v6 zLb$X)EZLtQT`o8G*6PM@0$bhNXx*?=j!q5I<rp|!s9RpwHAmNHjPhC?M_9|3WPBYD zhKg^}>m==o(c+0Tgn72E(~Q^fkf7QP<wDWVLig96h)^W$!2(2>H;CYZweEK#8pW(d zcgRn{RwJ*BdO+|VrN<PU?xUo1FLfphjW63h<O$Iv3Q>V)a_<K&@2$iRk8ax46>lNz zzm+9+m34|PPN`NtR8H`HIq$Ua6anOL!WreuA~~o#uLi4TK<o9UqN_T7Y!)hZVdu8k zVL_%FG7B;bA@9f~h)^1BQ!1d4B}aVaBwbMJCe<8UDF7IXSvD4syi47g!P6%3T#}Z> z0^Bwqm%mvlG6{nnTz)uWKi4jm!%Nmk(mCLyQ1!t%1`O*~)rAmsYT3ssg6{WP_u={q zNLAIx&jb@b+vVbKA>2|F8%n65#WfTK*6$lj#?j4|&=!FDJN?PKOB(&HYA_8a+&|K? zSNKbNd9uY8F1uZAh5Jg9M}}4mtTBR0^7a@UK=VlFO{GX!1ci#Oub<8|QQ4pjOikHJ z2%f767(BHiGI&9YW?rbLpu+Z86{#YE4mpz9*U?(3x_`}{&<1z8M5jGN^6nW#S3a|d zWDG48rmRIXgVbM?U@)6kv^XY(K|5#>>`Tg!fy2zpn~77_TmVU^n@iruQaVqU2jNWr zh4@4oRmeipK&41W^`{|gZD))UB_@Sz9Zd}AvG=OY*md0Fy0I?s(w&h}=!{*`pst7U zxV~D03to}ppruwU;(StAtb?z+JHp(7RS+`IL;6WtK=4WVBJ({0+Z#nVHyg%9o@}+L zJrSydv&F-a*+fZ0)J&}uRC(_q9Z%);5Oh0WtEg)B_?YuLk{S#0leB5WU16hHmSyyv zdIq1}VlV`XolTdB>CG4EA91}qQYpPYqwKu&j_XtWB1+TP%#c5ACsQBrT8ICol@w&x z86qE3T0}tjq#^8%iy1R^Ml>T|3r3SQY$1SENwj&og07AzR-1J`q_N%@AFq^<i%acn zN;ktD6<+wuwDQ`~Iw>^stnb9fIG-Dhqy@WNQ+XxGHi-2jWp`e2nSulslTRDsFPC;^ z&f6Rp0&!1d*so3tKT+288pf~I8+N4guy)Od+9v3VA9dlb_;UR&C^eZ%k8XH2St>%7 z9A`e$7%P6$L=8F48)99Dq=~Mup}~HXc9z*GhpSaEPH{$4lf+CoC7~*i_vTDg$B6_@ zniQH5>lf|$DU(n2F|4U4mAkUk0@KvSg^K!f9yg*v8rviaF{6RS(`LHgy)5cT8w`FD zZH{W{M&g2QhQ#7UB^J8ua#z0g_`aK}Ow6ITop=w^R6tf}FL9;%0xv2;XM`*`ZK|Hi zck`SmoBYNyAZau+8bG7jg7a&^#>&79fOIn;6L#D5@Ji!8WVME+MywBA_qkF-V@M~5 z^MQq#24bBWO=8zj9!v4DBK9qTpXC$+N<ZCWzbAT+11xNZV0nF!CXwDj^<JY;;GstV z)Lg6X4=)A+Q@mN$4j=+aKQS@{WOTdWchI^JG-|>oAy=AtXFw^}PHaB0I3XFLr=T5c z47B7<N)<85@-bZqfB}zEI|+dTet!}*b0@{H*&b*iIpb0Q7RM?!G0=Mg%cis(;h|^| zb?TlknNs$u!kvzNC>cvTc6^kW3~-$ISweOu<ZR*~RbzAOwnyB)Z%Fu<VK!9t*q?YO z#kh5>Af@}^yQ1>4XQ!DVoD^@2F_bv^Boj4SR;sw9>%<>LQkmjhFj`YD1Gi)eoYi3S z&KTIXIxeT(VkC)N=LgA&E;?tXuc_X3_w+<$=R-%f!-PJov0KNKGiY=g44PFd#Y>fy z_6m4zWgd<U%opu@3Wwtqapg)GD{#!Ys9me#@HmCVtY0%}Vwp*&mLX|zEp$%HEJ)%_ z(W*p+g>@ty1oO$_rBUTp%OB-q-@2zsHiDglx|Dd86$E6)j0GatNtxD}d=5yYkQ>31 zI)fZ;-mOrQ05LB+FIWtAn3nqUhNh+A+&7XF$m2#7?l@*(cX!OfQF3P`QiymS)0lc? zbG3*ymfk5c(^D@@LUt!j<P_Jzzb3#g%Iknd7<xE{AlZ{?Ax>YQw(J=p(mQi=VAJ|} z%2z=@vG8cuEKXMEU}0x#NlT3g8A)}YLJBF{)fOPxZNF`fO>F&5kq|fR+$<7ml61vc zrwrBBk)*c2t|&$9P>aJ7t(m5y8s+>1E`7iy9pQ*5p4D4n65XWM0=W4SR!iPnNeB?6 zb;OEAT(9O1P+{>fhTaR0gPCVs1XqOb0&UiN#5n2Q-nkxlcbavauHa7_nkTM313bn0 zQ4DH|5r3L5o!Rr&fvheLWMR`yMA1ySu~MlOtHJh@T2*E*R!Xg9p|{?G(yx}wbd_uJ zyJoAU;`<ziG5Q3|%x&V>H=w7<J!pcCTm>cY1l5ntQb8IVQ$Ue&?E((#oIdgR$y3wr z=^I|{^V(1BX+|Y9ruC!*D%hST{>uw+XB*xw_y{B$2ec<m?&{%TRXSKb$~#J2JdT_Y zwI*U$kPz5%wFRjVaDhcfhob}PDzKO`i<4MJX$v$y&chrhvH*6ed}8v{L`ND+m2QZv zN+yvciOR`<H%n&KGthZ|8l6YL5tOhg(M$<FGC0C8jrlOD&qJkc)R>;_u>3<4DTQE) zDeP1u>%p=PLj9WOE31g_qlk6DZsOXL>RkC!*>M)ZM#e?TwAe2hEkJ1O;N<QURD}u% z3Tz_3rKt`@6EL)5Q+My#N5<!4LK%#sb)AKbR_N6r&OIW(UOrbSNb29h_~e<1v6<6n zo}8PWm>NAZijQ>r+NsA+(Curvy`}Pny)^Yg9jIb)!Vw9l9{2r<M}dxQhyACJk_ys} zxwB#P)b!-o=~J%EA({|%RZJ=kv#E*2eQ-t~UnrCw*mX(%;H*GYDCE6og~F~~NBQJ{ z5={yVN@myT*Z?>K$DV0>F`B)&Cpvyk5})*3ytEwUpSW~<SC63tVN5@$0`rwhFFU2< z<vc-!5oW=uk(nJhXD774jkKIpbMCN?%vJc$?mM>&10BHGN0+??&jth7)_b`_kislH z+ZyQapKh<N)*CpVMXNURYTBQm;Q(tI)DRj=dq>Qs81E;LNWXp&2EFX~8^u<tmwC@0 zP9<(Fx<E}w`EuV<pQ-dv^gy&!Y4y$*o6BMjYNDv-TI7zx3V}8exJ9gZi>CTOzd-FR z*LVVR059Fbaj}BsI0d0s7Ah3Wt7f>uL1P5$r)S1bKRy#1Y$1w2M;@mPHbf*>PZ64y z&SqVVjQ2*ZVMYizsA6P)q`Z75DK<Vik9@$Ho8dLvH1grE&u)r~oLV81T8S!M4Mbnp z#1c3$jeREAd6qGW=-8X^j2^Fi6PXH~!GD0pn{UkE;Me9Zt>e`iF-7#nr$MKsK!O@5 zu2$wQ3fs>yhI0x-><f_)Yo-=}+^gfVp?q$2d3AX2UL;zow_7+Jk-Hd(ZO3MugppK% zXX`_lPj-+n2WeiAmkJ;#brX4~YBEU{kf3P=t|$r|=#D0-te&73vNRE=VG5#shqq~J zj7h`sn^0KhBirB7oCG)K_9FRVvrmNiL8Oafg!Oks%|d|NW;Q0x&77eoqUD3&5+TRM zgBumsp-83aF6^E);yRGRvB|?HzT*8qs5;w6Seh>i)f+^BgVA!t;G>J02;U6~81b4W z0FZs2w<-`C-2|7fKs-h;97v~BS~<Mab|b>Ap-teGV&*T_E~}%mG6giNOM3_wS2h<^ z@a#DWUmJz`;7f_=NPnGnPcUt067k}Pk)UsCaG`Wqq%$6%Af0wXBnh2(VpNsIh)bJ@ zF@n{h8~yCbecE7RB!anxOBomIW=2s`wqrPVJf*I_$!V&%<`l7&S#L>wT)eQuH=}yh z&jW=*<7lB!>wDm+%)6BDbP$tab(nUFvedTKFjh~f*R#Rg7(`Cd;L*T2rJ~|$A>axU z2T^ZvvrMt>7<uxG#>ffhvxc$inFxW{7-<}ziIy5=EIdT;=n<1Hrm;x~Oq$1jl3asA zUZP}_hzSx_EAYZC%#pT9U96;y9zr7JX8U@hxr((C&Q1={(a_o4YGswu`$Jt}BnM;9 z9BU)HKzAdpqdXT@=inHF)<nR7r!?^b))KE0-7CMTOPKov*z^uZ*n~jfRv&LXAbgw1 zBn~#!|IX&L2$|zU(sJb~M+3VFuZ5_5V|TOOZY&_2K((H>^h>3tn%0yUzFb_Pj?KYt zp;KlEhhPk`EO2}ug+=n0Q-g$k$9IEXJ*J7SE2MJ3Qjahyp<N#%JVu1eb(q&I9pwG3 zGhyAG37f$}hOSH8c%c87u=mz(-K6w2aAoj?lk$;sac<yNM5V$U2+qf88#rK&3QQnU zQqqg)MI6T)@a=w(jGR#iC_!m^$KN)SsZNmye^ft(+JQq?3kqS}aC5*-sifdp*&AwV z31~ql=&C}9BOi23m5pKIw-CKz@N*+A#PuMt8!c>t)lBR~@>Z9EQqGGZgSiOnpR_}w zO`#5WPU8AkIw+;jj7udu#Ys4*Q$7V;6^m<m7-~#da2s>0^;KQMg0R|O?b1Mh%N<t? z3)0x5nscMGBczCsY78eiA?;z@nBYAb9;O_%GfXIj1VFpp>;SI!$UN3<ItdioqVWr_ z%5x*3vQ9`0$VV3#S$rI>cYOk3KUJ3~KZoBH;O&5S(Uz=CVb%gC2ZEh%jJ@P&^zh+K z1_CD>MRiemlMgB9dVBePEGg=YO47(G>qianN^zCkl?}vGz$nlU%Z(*;RrSE{B11=% zM!W2xstJBemuy6rK>Q*Yv4QOW*nwiTGIf0FaX1SK$LK1?i}l8Nr-<`$b3&hH3Q2tW zd+=`DD_N|nt$g)x5?2f^ka@P)uA1}57DpwF9mmEMY#|^~Rs~Lw1tmQ6N-DU%pjDq{ zcLN)Q=rcSIfkak}iLGFWR*i*90vHp=9U6}BTq`#$I2sGX2Fcm<ZDU1=;o<4W$Hpe6 zrzI~4SCrYbHB?l}?s4bdAd6K;ve23q!iTjL&vp^TmaaDfJ=_KcPgNa^aZGZHZvas^ z$X8dzp)_l#cx-g?#N%fsXqkb#aRqy#f!u{_icOw6J9=Vr+$(kw&O;UY)R%LXC5lgU zbF)G}z7(&}#LBGJTEt$dYD)^kM}Q5W7DpN5c8;BL6Q^*4CfltI_bxWv3!ArrM_0*} z&tBe5NH4Y|aHTt9PWa<`CMx^rBQT_HlPoeeQlFr_h}xWmx78`LCo0uzIb_hUL;rE6 zM7`-ilaHcBg^d=g#U-Q=VQ}O%$~rKVh2iv;?TX!0&MPPvKLO?hI5RKt+u%jdkltt> z38z)he5TDFd4PcTN)YYfVlR`SlU?mJ;dLjB1X321PnmdAF=;x1o!vHuN6wqr@e3V; zW*<6IW{S$`0{YPp=)D`#1M4+x5F*rYn4j8zrgh##Hf-IJ5sj_`q*O+LHRVSOK}3-O zqTKhUXb1ym4CX23@$&jGOwka=LU9!tNy`Y6D#7Uir;DU*s{-c9;(2!q0VPgjGl7;h z_&Cv^ONn)1>xWfc)ID_^t$ZwaK?zWno6g-w$qSlByXLKBOafaqIG7c)=VB~ER|ieg zhWuGgA6njE>T$Ts^zn%kC+5yhoO$H*^yJKw+5<;p*lJu3Hn0@C$!Lm^Z-qsCp+i7u zy`(ZIDJ*Am4#%Y3S1oFn8{#QEX_?HJ%po9|R@5l{C__oUFd8oQvFpL9oLhifg)s$3 zR9<|T3%oW}kKCd-_|vIrQ?$|o!(a(&IuKOTDp&eWaR}|^7<u?9o^83(M0l#5skk^C z++bh>tXVh8JaK?O8?hCN?cFQFh>9rKLJfwW0-@p7ismmzjtIh~dusczJb608;mwN( zYAw@&3Y_Dl`*8PSqXD%lDhSJhM}Z0sxar%gBovvd6))6rS36}xBPD^I3p*q676u00 zw1Q8h5*F*#Y8~5%*u+Cwl`C4cLF}bMBsjZAoY})Q9aWTC?HYuZ6SV>wVoJoFz^bWe zq#z~oxqxc!q|t?a_M@jvseE>B;?&vM7zEcnsX^!p(-UVfKi995xaUm3Zg6)GvtgV- zX@3?_%W*2C^`DqL4l)igi>RIya&!a2A|#(~t)w@yl1^Pd<5*+40gH!BpbaH<VKWoC z`Z2Ru#MA9$n*bw%m6z^_8j)|C2P5@w06wBDHjR!Lla50|yA@myg0a!{H8!Iwje48T zQywp_e5e>5TBbjJxTJ9vm%mk7;nhRr7-_k7tMxxbBNuS3quU9Ssz61IWb3TaWSZ*z zI&q1*J~{J7nO6d`NxoKWyWxyKg&xr+7@e;aU~qp(^FD9H5MUD_r~>;UR?ezZQ&<~i zk7_Fw>kwp()(H)v-=GFb0pT1*3u_WGnV~QAM!2@!=&Xj-%b^9WExx98#?b16e$YX6 zY^e~t*lSX4=+kKgLZnPCO-4rWz>zDyPh3GtwijXJjZ2r*nRasu!4NyN7D-jm{+u{u z#OjbS4)v%#rxe3JpA(kn5C968k*FNpUtfaKzg%xCVoHZJ9aSG2WjV>GVs_M+9CdZ9 z72<_Pnc|DI9VD2t^Hf+2@ij8sL~n$e$@qfPFdXqMMz_0ZK!`y0^h-#Tpoux`ZBrWZ zd;uQExrx&!_C!5}S`REWg^Gin?Uc3yRT=4kymp*|hHItM(M9+NVZV^kgt)MYGiNmS zc4AIiu&l73&N<Q(Vet;O=PNcW$6%fk=ToE<mW}nOfQi8ALKF)co>u6444=xMSU1%h z!Yv!((H+Y2?I2LXv2hqS%>6NgNzQxRIz$X+Fomy}a2m?CAr}Ud2@2An0PJtRiw^XU zdQ#Vo$m=V&(!xMaIfIwZ#4dGqrE#R@C7RRSv2|BqzxNoOMLnDd5amcLK(VzqR6_fT zW<9~mrDG=@^wbqe;^?Mzr|(VcmP{^V%&gZhH5Ws@;CBox4})zz!6Ygd?sP0+rT&c_ zFsS)Z_S|%RI&D_vv9V85o!08;AdN!hkM$+DB9tRJv_&223`B|^^@rDD?GAD1ucVv` z4FqcQc7tn?nyWC>#n}){k_d*@{5)b;WZa;WW#KS9EWl=#i|~%f<grK~AW3$UX;;Q; zh)*xb1y@Rw#^%|yHtrxU=tdFntqB`Y+@tR(=Pi2*=%X@`34nys6I}+8ukV*9XG9rE zO9Y^XLq<mIN9UdpUxqezxDkR2D@0Y-P_)I!bWjhI^(R!yBqQs21!Ku-TqhA(<*J7= zwuG-c`tFE3)`lBfO(wBO062CKH`i!g4z1p9{Km$QyS}^D6b;?A#%r`b3{y0Ok*d14 z=JHiT7H0URsjOtI;y2|M4JGdS1`a8FhB1ePLFVjLYIi7DRky`i2#h~Ay^6CTNaAf1 zR+s9A;urB5Pcz#qD)@o^E9I4X<FZ6frX}1VOhT8k;gHS_WkG{|yW@Jt!MI~*b1oD+ zJ!pzp>zuwNVPN>HYYfh6f4qZ%3ndMML_c2=omC{7BD5a-*__izgbYYtvEgB}7ch6~ z^qG^RShLug4uPm9trVRl43S1I9FQi#pd`7sINUBo9=T(5=pJhwlc!scD%QL9oxAc2 z5o0h8`C|(|`)*w@4j=hoDoy(;2BlG6lxurDN)^t?V|W=(&p(aK09qMJ4?|KzeZZ8T zQZkq%djOV~4EjAqAkn6lyOL(Y_+XeeqZ}Dhq3dxt;J0(jLQaZS^6>@dpgq053t<>s zr*P>TJT__Q^V>1Xh2h4IY0RNNbq75N0yIVd(zi(jaKLm+fUpXOYlQ^Zm~;~<6SHBo zMSxuvj<EKPf|SEs-gcE|+Qc*s7yz9C`O>g$JV0S<X7`+Ej~{YLkqx9a{&4yPS0k}u z6B@gPMe<I7JESG>h1frRk#>wY%wa{XSr|(-r;N5(<b}3bZUvXz+~5*r>uWFcCLHW+ zu5LKML>bK{xI}xpyA9lkbcHi@M782xwj!iSbf`h!`j9;t-$JjrB)m`^7C*f5i+7Il zP^bz=hAXC<89D7mbSNy+t#Zei&EBczt+)<-G<0)u9pXrJ#ViD*yM$CjVlocOIX-2A zo28!zM!odF#0E}PH4v0!q%9EgYU*aY3ouc83*K_Fs~{6Z5>NmDtqgUGHH6l3G#6|& zM5I-*!vnLKN;nQ_EImKiu0XE|{-7Bkkr`#^!~r(A1jqwRL5s4kHuZRUqE-d0TxN5s z3hZ%O?(nV#rBTSc@lj+mh}ot}v&G=VKF|qW)OPD|5u|!&uS~s`hi4WirAJjN$-HSd zcK%6eJ+o|E;RtYxC<SIFU~>wT%<sZEGNoMYy1=SRRZZ0D`jI)H^5fX5MPOc~)+=i+ zab+l%L{z>2e>Z3f$}>zF5Tr7|7$f|n1vgEkv-2M>SK$I656*c+9h+nZjWPxtn`JcM z^VRyod2*RxV`B1@l1dnB7iqS-rr8kLP`pjjQVh(mBhnHUW3g7*H!1;a&PvP&l0<Wt z<;+^zSs}&8KdBU(U3T9SWN{Xo23O-W&}*>-V@UYe`ppt}yStd7TR{<B1x0M;j9NFB z(XiVMo5Ki&UB(t$w^q*H;H*Kl-U!ZhA&Ltd*+_78`V1oOaY}U_o0I2}Hs?sxkF%<c za*00=;4@C;;yf(98N|2Ch#st8<gY{cI**kef7ypGE5#+O-irKvKfW(qE=t7*@#W$& z%zl3L5WcC4FZlbz%C)3J0|d86&P+afd}hu;aS5@=T!Ap0Z%`VsUKdgI$j4Vb4AGX_ z9`>qa*a`L6>x+8kbSbe5qh}F}Kl;dtiMi8LGn1!JDN5raYVHP3)#4y85thizAzu7# zkdA!gJ67mTgu)8ZY+<6bQ+OX0p2uFSjGiq=BjA+VPvsE*37{cF8W5-CLsSxjuu#Ss zB|^`_Jm8l+pbw(!q07=ja0x*tbl!#Jmw7?y<P%?L)5cyl+sRhODvz{>(+;>dhb5_g zVcStJeAg=RdOR*x#HGa@rIfgZ71k_|)iHtcPMeOzRpq>96YARcSUuA%N)8CSc-FL_ z)w6sKm(Px(kx<kakKuR*+wsYFrP`hE)ReOJOou9Bwyklly|P%L!0eu#&7Qt!;u4-v z#$I)mE#0l&XMM})skze@e1osXMcq`2J%&9J{5X{HH6VRcq*a76eZ_#SM~+Z!i@_A~ z8X2UQ&8}4o39mTQq>b3QV$4kKcu=~QkKXqILDWGOGKDBlEA6aGZW2Nu{frjwkH)?l z&ge7a+CC5;;Or^q0t>k}<QW4)E?5nVTcFm4jDxof+!c6RJPEwzctK`;z7P5!6+|vM z8xwv9`Z;n*pWfAkjG1C;9CPaAo6mFVrI`~wg-ZkTvpbtBh}^N<eUO;mHXvP29&N=C zI1(oki`nUlVX7>@-|~oCC_Lsv4=0Vnh6Xu+xGxdnCdM^@tAy9A(nnp6tp#$^M%Qh^ z8{cqO&(RoKCn2Rty`e8dwKD@#S~*hFxIv8&hqE(~aPD>FU9NpUG&m&;<m$+67DA90 zgi5nL4}|H!HDfyv$YFvuBr^)dsz}HsC1Vt4G0i{#)wD|@QR84g51dQ>Jm@?R^GVrB zPAw5y53(Gjh^KYX+LZPqT?d~7h{C#!KXq18YE<%BXRMKSavvw1975_AqaI*o!60iL zFJBs?24?D`$OxG)ESE1~@n{H~HhIOzA&O7z<XNF{T=#c@QWBhQTJ{X}jUq76&qR5c zi6R&z!b?JAi=%lEp{FVK3y-lY;9c`YTs3i9Mn=G1(!*ExBy@>P95uI;iU>tWGFOlv zPffWrd68|HDHk2Vvf{z$J<;I){g!yyC9lAN*!y|=KB&rmJ!JW6wN{%*!-ou%%k6n2 zp<CGt56cQ%4Yg9SQQFI-YwqRbli0s6!)FAoK#o6nfQs|jy_8F;xtz{(Y1AK!EHaPz zwb(c2d>RvYX5!4r__-X--Xd{#Y3r+mwMem44yIQYvN*eh-+4#GS*fC68I_+qaB%S8 z&XW93iaxBKGK$HK^C$uW{{<5Kcb<$)d<u*KqJ}bJcuA#q6tTHIjT2!wBnhJC9ekp_ z$UPhr$f`q5QmA-m75sTX0K@Ex4jn?Os%N5tdcNd5A8?*G)N|pm6hipuZiE2B&#IA- zixp1JV`g5}1?TYv@N@x}QMi<{uPu=&0qNo*O@IqgFKSdg+HQudCQT^7?v5yx>s|nt zw#l=0KOFOLa3fJa<_Y<+8=R7o9HrBjR~GBY)whauGu$eDci)fF`Gs9w`hckPF?fs! z6mm--?L>X`GCMuki;hFu$eH6!&OH%w$k0WN7b@k8sI4b@QxM^qj-(TNRn{0x^cq%0 z^Ed}lTf&!8d9MQ6x7=E(-hKC6b8+s<6}XsAo*X?jK6h&L<V5uBvsmd|VJ^R)z0UgH zQY?7ulq6T3n<d0?FpxY=H~@&Kc}xy+`>QNBa&}NQ3MP+DAI|0qwH!l*cNr-*(DK4c z>2Oc>3R<6<d*bw&@oAVo&-UD{nubIohc^<07Ln-;{K<5}7B=cGG%Bl<t#BEK3G^{W z0XWyXyjnh-&C{Q#7s6N`%N{z|Xm(aV;*zkHq8@IdCxV}Zny7L6WVR?2vw1F{>tSY5 zBy;aX)YIJSy*ZrA_wC-5+glje+anE@t0_$qH+5=J&|lSU3be(F&?W)q4s=83W$d91 zkR4I)C0#q-GbL>XxT_khj0;$Y&wob9vr=kC3-pJJsr+s$t8@HjZvHZkODsmcwP^To zlvs<aDX791Wg7B)j~bMos0Rt-m|;MSp5ESCy%&;4_5$iPdeo!@%Jg9&%b3u|X>crp zo~Gff1G6eh6SrI>4$NL*^kzrSJ$n$_8)h&sf+^tWLLQ8$w>Qe|oX<r)*^8<+jrRT6 z+*+yQ{+$oDamxoLJhCxGG!7+~m8m2bAkMuw+&?@3j-`k6Ljwb-{Jw`+3pvh1rlN8e zx$@3J&Z%pk-|sya7V@Eja{^YiwRaYJQlPreG3Hc-e(sOx((%ixle}+KS;9FIKW+Rh zany&HWQmRIal`;WfD!Jkc(hf`A(2E`SXj#dU5&8;`I?LR35F|sMSlTQ8c<}9e-D;C z{wx(xOmjE;nCYL47GSj-JY0f+^qe-;DB~(bI~QxxAsprQrqOh=SV6SGZH}=2h!zY@ z#2_G&=Gc43PRZOPc(LJ!^XD8*MhG3^dEFbZ#*ZQ6dwg0F5J9&fqLLoy=}DhsEu=8m z{eG`-rza$JNoTQ%kY@*(oZ+I)oBcm^>vN8#5Yk@ZDsS5_YT2O#Muuh^<)I-7qkBcO zja<nz!?L-ZAEf^v@-63r1em^Rc2H?t{%l66dp5rxHIYV1kJzyOYC1*86{2kPRAgsn z_gyd;Q5E`W9?o8A?%i7`;QvCwT4nOqzR%M8Z2J4B=>1da?|bNdPyBuNB=t}a$=fV@ zukR<85T1`w&?~s{fu}(?vKEX$EYR%1wDnPPL=ag3XC|gjJb5^u%^PEZjR|a4MZHfD z1e+PIha|XZ0iSzzevmi|GrR}OHiQ1$Tou;O3Uo{rX#*6W!WwU?vRtr?Bdn$d&988- zLbdMh8B>Wr3RYtkddM84;~o$gIAvGr>)D+=rH{O4Fe)!BTU|t~qaV6c$l&45`A}Cs zi|c)q(u{hKMad>y6u0W`KKcHSW^T`9GI!v2Z7q{|8Gq?#g#YdQ&vm?h>yP}4w`M-| z=HJ=z^0pJdvxALdoF~BIZ3TCG)l~XuI%NmBFn)TPvt9Syd+*&@1^U1G+@9Y#_zRDG zT>lRK$^Y^3VSFF_lTUxVm;Zk5;}7%S-~ISe{C#)v;g27{--Ev}_VK&;`4?3AFRQ=5 z&wtNU7M2O7?!nYVCUaujotaObte@7;Ud`OL?Je8hoXOmcCqF1p5ByF1y$`<;eIJp} zw`DSS(pUWGznQ1-1w=dga~aTY<j1)n)uYP%*ZiS}nUD5lGE?+n1fYL_J_J8_xw;L{ zc4RW|4qmxm58(ZX`yk3>zT$olKKIeC2A;hI-DJF|uQb@sPn5|#)z>H$Tg6P~-%vR` zV4A!Yf1RHZG~Fk~G9M+T>Blc<lX(Yzou83R=9Ruiv$23@+*drv+=bu2g<t1qgy12@ zq>h4L+=drKAcEI}U*~5elX=AXdh6p2q`=eJm;dw~Bbn=$Fg{QJ#oG3}qLIvV<u7Hf zzV^bzm!{6HZO`Dr)rl`X_v&BKw>$9dg_HkoZTtJU-0PVaCjQ;j+WzDCwzmBQ{(bVv zwfzMu#Lu7N=i~hR>KE3wPvO&ZCtqJ<5Ht8P^vd<)X!+W~do%qbnf7gee(h_Yye*Si z{_u9-^b+{=#p=*V=JR)C_u=*0{$+f5i9Rl8>7P9P6VaRPKTnW9`}UXm@$Dn8JbTyE zcU}Kgu;`Q5p1yDSt{wpU5lp(FKYae&>!lZoU9Ya*@%*{3{>Fy^aQf^MYuo!#|KPRO zI}d)Yeb>-m9DBa~)vw>Td>s(hw(rBMum7KT_~J7tjRJQ+{Ug^41pMm<`O!ySY43S{ zKfPRj4P}?Vihr*E0wl$gPk!W;)(?Gt;`Q&Wt*yNb>6-c4ALF0r_a6e58rr*-U!_W4 zp-NS*^!Ymp)@>;H@VT$H@0tdB2k`dcAO2}PZoPAv{#<_!#3Ar^Pd|Oz^xAfM_97AG z>b?I8WuM=+wx7PO?I#+o?I$8#zYl0U_t|@1I)E<^|L`9C+kR+jZTl-Ie|6#;SMR#| z=I2koI`!V`{~h)1$!k~3*RM{z%B6??P?diZ$}cl6)P?pBtZn}}d{aGqkpN%+D<F35 z<&*EvWELMrcYyI7L$7@O<co*!@r4i5gC9RY(zyM#xBbfTcl`K&dJATL>s|PJ8=n39 z=U)B^^!u$BzBu$-5C7D+@$u_#eeP20trz|keJ6$Uw!i=BtDk;)+e?K0+V<6GB=hvz z+V(2`KKbNJKLIMd^i%j}ZTlDT<m$aGe186}we3H}-&XnCi@!);GA~`ix9ewb%Ve&9 z5-2}+`0aq0Y2UN_&wq&Oe-eeByuQS5?xVKaZ>EO+89g3)<=XWtc=NS?{GZp>uC6_P z^&3C_jXa3<((wT_ckej;yM2WI{ozCO@BRby@8Ny;ck!pUKgECUo#8(}+|PgR+{1r% z=J`)=7Jq*3XYPC-{#>2NymW&9-tp2D{=P7A*GmQZ{*hN-Ut9b9o&ONHZNq;r(#w}l z;M?c#9KpYDz9aL>=kFZnx0psWy`KNbS5W1}JNV-t;p5u&ccVKmeH0I#-gf;cdi3Pe z=z4^Q%kSPnRLJ7vbBC!wrhOO6yo<^#6YRC^dAtKV?7^Sky2ezvI&s%kjP62n<<<7? z=PuoMdpmn|<n4!}JOA!GTiXxspg(Ut+(UofbT~8ekG8e%y#6JSZRnMApSdHmeEjXy zA~g>BuI>CM`0(`Gm-9UsrTN=3U}75BtNVW%&)2^E<nt3>eeT<9?R(bR7~ap~*^^&i z!leH@#JkUxUsuJ~zKn8f`-v}52bErZVdB-P7bd<sg?d-_R|VG8^~X`|`H4STYkzg^ z%fdkISJ%Ew0)?t7{=QDS@#@4MU4IAAxrWBxNsUR@0q*)KQ1n}0dDko7`pT2X&*Aae zmtWs8lKFM|=ZUM|KKQxj+pfL|GxoN%FFp79I}U!Q@gL_tz@_d$7k{1pNiDUu^9#WA zi}(>bpS(*=ux&KC(AMao+dr+Q)qfcJy<ep{wfOMycf9TIedg+C&RwI5>c@=J@k6(N z;cdS%`u6FwZ~K)G{=m@hJ@LZ$UGMnFUtD<C)o1Uydi<V)|EcljtM9w(_CGlISB<+L zdG3|`!7n$i54|$?fmsin;Pdo%mX8Dd<uYbY=|vDJGxgjz?t)xpwi}rE_Rw#F=C74r zqF2wCuY;cSX_<t<_1&P_bDzBfgn1nN(@W2$<joYnxeIR&ULDDP`udN23u<Va8jPza zUn@O-FM)XyNL~GZK?Igz+lGGcFvQL)+;x&+s{GI^@fu%T+xar+y0-IEOkKf$Z9f6M zI-b4n`D*sQ7x4SQtF|kzqbumaTKn5qCtg>epP%@)>D@KA6+!I1nnT{c*1k_TcKN@# z59FdbdHv7O*mIwK2lETMeLGQQTW07l&R+imesd4HfA3lPx&9e`@b(W}!~EcJeC`|f zF@>Kie;Z2s_004Wzj5kMNB-r%#AI1J`1#hoAGy|g^S8eA5>5E8KXvwniEm@N9zs{I zwqGA=e|v5FJ@`EI+S>N})Ze%BU-Sj#-a+LizBx4U+R$qUztw)zub&3wufOFZf8Ku6 z)z5wU)%)J^+VlIV1K;}c^ZTiR56sQ}7G`Y=)z)@i;(wpve?QFs{sjN~QU3Su@xT9& z|NRpFohk{<Ul`Bc^FS$k52*co{_1t^8j*YAwY4_U8tkz4!o)X)jX>yc8U`?gKKa_v z?_B?1zO}aYwLhl9uvB)=poOb5*}GnN<esaKeR1du*FTEaS08&FpMDabUat0xWWLr! zX;An3@8{+FGnwDU?;qj!r*>sB4gAjI_c(s{;r9pe`<MAl=1=kad-(knem{xdkKy;@ zct<~fiMp?5VczcqEd2hh_hd39{Qgt?{u4Z>pL{Np`7D0FjNj|{{SJQrHelrO`yhV* zCwxDSzwgIy3%@^!-@lD#Z^ds0zaPWze~sTNem{WUGx$A*-y`&kvi<n`zvK61g%h>; zvHM2o5C1&zH%2o5Efh@Bk6shrhL=_Res~9d-v&VhwkGvDk2Hp~r6DPK1;X(pK;1qA z%-42^g?DCpeEN5P`j_wf)X!{t>=$?Z#TUPR;{BNZnasj)fs!3G3)qJ)6|jBN#>KI% zX5m7m*{02oR=ZTGM}z$X{RJGIq+_Pd!g8gAG+YSv#}QQC5wcJER!j4YUHOMFmce?B zUXX=Kf4`*u()TxkX79o;{pj~!bl%hRVHoQ4qu+nUdH=6}a3u35_{F2OKgJ@1G(YvN z)H8yA<3IH7)gJr&8{n%<l*wf2ulo5WcxpTXuQ<>C2F8CG&ys%rOXcsszwJ@)g2hbc zS8ksUo*cXlWu{xD<JjS^mNS_joj7x9;>6HkU#SW<|G~`BquHYmjz4}hi{o>RInE*1 z92p<M;i-|4vq!Uv<?9VR8yJztPmYd`;uSVvD!6V5oAx+!I+6kc(+7nI@b4q0ifr?z z)d(6L907=t_h)|g2ae)4vX)>lWMHk={J_X)Ci58TR%&5Y+;H0wbE^6oq7QZ$DOpzc z2s80KDy`R+p^_!+rl|D8w;w(FV7EiVXufxJ0t18v$kc;0toR`Rj=Ud4&&=I+^yq+w zw^58V{E_zo(v@vTkM`dXNWc81qex*^-2^Xk-v+_Pz~|)j*|DjI`*|8{-!@lVX)aOb z4Y<kvab}KoG*_^tQ*10XGkdnpEy$Z^wn>r2%-s7HR$Ip^RcuLSzIcbc{dv@*lVnIe zo4MmQ{z$PknLF+0xpL+Zpm7df#6KZ5F7Hv5Gyf0jA_A49J%VkJvaJDc9k41r-EOw# z7E6^2nasaNnN>P@x<dEjWitO(zAwtRr-56IHu7;*4R4iZUKN;g2#V$%ZOnbN-Du5~ z%JbwhZ_F*%>*q6>vCL7z6TNMfM@F6;eIJI4sB=b9=TC2+YuAA1`OL=v5n=<|GeoEh zx6Sd>ci%pzo;<Y;uss}_M6rePYHMzp<xgXu;9twUg{X1?ciPNdEVi2U8oa1XnO37- zUBo46nar=<Hc4B))JD04<2Hb>RL<<UW4c-{uV(&*`xZ`kL|>Fmp-k@`GrCLAjC4gu zCi4lFmhA@RD9{g&-0^r#FryZLCpH1pux7U30a=>*`gd=eL|O<T<P>F1uC+2Vx8p2b z<MI^Jb5hV0j$n-8ECu?IStKbuQ&~9A4>Flwa&VbpMwl#RGXJylRAGq6r&)quMz*?@ z8C<bD+601S`jly6JjO0v;>%A&zBh)F^xt~VXua^izVkQ6Nk`KU>2cD-S=cAHe!hPw z0KX1?Zqr*IA0`v=0L)-|N<Z?R98Fl<r#xRycn(*Q1>(S==O4xQpC7>*;Py=BtI|N` z3uBoK`Q-HX{O$Wt>TG5@GlzdCGH38<GIKg}3g0L3?=gI)pI^J<KYWK4&hkr7=yN6m zbC-VzygX44@aHGd&NjenWg3}Erj}U(v<g-LWk9ZF7Bh8}A<xq`Y;^3y@5B6ep0_=I zJM&&V*X74ir<qw`IIDnHL0yP7{G7p?Vy1+*5g<13d<CDHC{yA#qs&G8ZDG}4&$RJ3 z;`WP~^Za%R-w89qCBj?zcNsA0TN&_H_<a$zBD7Nj)JQ>EWq8!?Jl-q-qJ|)?OM8Ul zgPFHDeL2f;n}DnPFp$}Uy8Yh2RPR9M9@HaR2`)9XQ^lARffbY#`cwfvC48<imVy!S z&kv&B2|Qoo8e?c_HFKG%w}e_y#F@wNtid#ju=!I*$tA#`9uf_D@jD2N2JkP|0^r(h z-~$>(DkXU6v7v9B@aY2{ml)sS%)Nj!1vquI+y>2BPH(6k+n<R0t$T!Z5Yy1F8&Wcj zj^pUVHgI<lEo-bT2SOI}?3=+`>VFe7E&?+<K5xF`pWShYlJBj|BNFe@O10KJ+|zE< zhMUMBy;5xUu2dEp^=5ss)e8#(hrCz%E)4WU&{CB}WI{!rq$YIV;hurM{+=WEV!!zi z0(qNAONR@3yMs0)^-!~k1j|ShbD7~_M;jSBBo}bGG=*qssIR4R)4X(FOY#dKaso#k zt5KEyJ={}7f@v}p8a+|FA{mVi_iz%Mo+F3$8rXhi1K%kTYyHq(57$F`O{awhI<57B z?#m(lq(uo2iPp9qP5nvAgN^QUjM(8G<TV}|?1?Ci!r`8idKCK3j={bfJ2TTmHzo+} zAMWe#8yx5#9PB&LgMb;fTk4I`#sVF_U7+hs4)<I-@F3ptZDBuJzRZ^bV$c>B4$KeD zKU^Fr4;&~D%@bKdY!se{_9pkhKIgvL`bVZlr$)zd-2c({y-$6(_5HsrdXT~&*#^IJ z|9$;C`uFx9=s(tfqJO6U1O27`TK|>)=llOb|BL;<*#A%af4TqV{$K0=O#c`9ztsQL z{<Z$Q2JRo|9T*vSY~b|3%)o_#D+50<@ch8X27Y1Smj*sH@P&cj8TkEyKOFeK2L5c| zn*)D2aQk4-;O@bp!G{M&2Tu;p4L&`%I{2%DzcKjv!GAOO`-6Wl_$PyZHu(Pyesl1z z2H!IDH;3Liv~#F`=+w~6(EEp;8d@Bx4mF29H1y*`KQ;6-LmwOZABO(Np<f#M=R=<! z`t6~AJM`~|{$%L-(4P;j4c)Qt?fc%j???9S+;?!_Bm1uI``LZ}{k|9XeRALbw(oQM z{&3%)?)%QZx9{Jv{{#CM_W#8G=lB2O{^Jjxd~oi;XCM682mir?nTLMhp?e?N{m{jS zo_Xlg4}JBa|M<{<e(25v_a1oXfx`zT4on?5d!TS&{=o8q+JV-A4;}dMfuB3@e;>H* zVF>Ps<TL!I{nz`y(f{s&XrMK4Y2e+1(cs8nVeqNJ<-ryyDricCN#O7I+Rve*tIMl* z-@SJ??$g>pOuJmZ)qPaEls|?byiLZnbG;LjV-u&QCkWL=ioE9>CX`18S=J?_9dWrA zalQp_5QZg*)(|mPLKHq-CO~pnqSCv%-{Keo$@vyzmCWH$B*Et(Sg6hxR4ekSEK%?$ zg3u9ULroB7I^_ez{c;hC>}>rv|IxKy`pp;1=c7Xx>WxZsr7|?KSg!UhTxhrY7Cv;u ztu(s4f-a2CBbqTf1UE!=q`16N>Z{bL)ZV)#qm{wK-tqvYji24o88{LeH6Vt#<t3bw zLe6ubK{07WcgoX)I8LZ2eg6Rt1F0^payCY~pqL?PfEY4#7P0(%f?Pb{!{&$qs`oY* zR`d~rCLJykc=yjKfOEVa)=8ed9JrL_q_Tih4swSNP7a(Qq|G621B_O^V{(c3dWX8@ z*w%czQY{IvY!Vcl5OWjZNqnU`QJ#X;Ng8s5$DS%L(G_P?LM|MK=M&~QmZW=rGmv%i z4k%nx5(YXQ?}V5>(h4^W4l$NXsZ>qu7M;q$H9t${W`x|2<&PfPfk@TDuKQ;{P$<+2 zg~qwvKZYY$l;9x|hI4?+zCXeD5@_hS=K<IK<$esn0P^TF_=iB+;x47_u^{Bnq%-%z z2;{t-QEY|$)wUG4Qsq4~11GIRnq;Y#KJLQP0srvBPCcJR^mgmq16k8;hGJVJKnNwx z=XS`!UUO`h%I%@#Ed#NWN>s-*tdIFh`S6r47p*jzJ#mX4VM<)%x1X4GHlZd@j-aYY z1S*Ul?ug1_kVGwAChK5y3DO_guQbP9@c=SZ{G&!Mmp=+J{r~K}?RS>dl|TNTzv7bS z+XRJ#2cL!_7?YqGAYmmzYYEMSBtRs|&E!r*L}v+90codd$69MUtxBF0Ypq%l1=gC@ zY1emAi_14NYu+Sa9(cv?PxyWIIiJ1Hxvu-V^MG`woiEJTB>OrK`<%1)=j^l3KIc^D zj3Ni8I;pH!;oh*qaHlzyqRKW@K88BhYYC{T@~MR?ToGL~AmzxvbZB<?EBwY#-O7LZ zZq=q#eJlQ{n0m7pG2M>?T9PaPN&l)0mnijCC#q%cB;Y8yW8^6@&kDElSg|M5M4TP% z>^s<b2q$0UdMg{U(7XzF>S239bWRR(A1D;7f{F@zK!KWA^@J-Azy1~sD*%Tg>?nAK z-Brn&bmD9aq)>n2(iqAnk>N^n=2+(8`Ba6Xi)o<>4R*!!7HfAG3w?NOu2j)-We<uF z=g25nC>^qiDNqV^2<w9JtE5)~*tWNq0IQP%^z%Q({hTR^&)9UxHGXnh#UZO;_RcB@ zru=f-icKr31iyE-x9{3@`wF4qHvu%8qxD)rT0mjq$UIA^617v5$}T)%uAR6&0LSXT z>rRln1LWBju97Co|KROnXKL+Siwh8-q`M*keOiw6N_RzLmEUNz6>VfQ+uLtnad_>@ zr>kl<typn~gKPg0m{U`;qFUxM{9JKI#hMkHgoQ=d;XBMvd^^8ev+MR7$i2xiB)Ri4 zvs-anZxAQ+r0YmDLbBaav*LDtQ-K#HbpLIxd$Ds?>=5fXS3hMyP(sC1HGtLi^4Nn{ z06FbiXGc)Q;$ORZ^_{CAowDyya;SCLGHikL<9-7;a>VS!epU~TPvJlSHbd}u)E?YP zCdQ|1IqwBD$Z1hIEDJw~yvns(PE*Mtq)wRa2M#SmN}BR}h7QW@h1g2M6~)CuSFc!M zI6dM6Bm60KSrinLDlv7Jx5C{eIhNyGKPu_Q5z%EhgCO7ZlfC?dw!n&W4@t_o?yf!r zSAYlUD>?Sw*W2GKrYdhjbcb<^%TOrx>{dEHSIW7D-aUu#Q?7%=iCpp06!*zvSyD6( z+k%J*oF{E@ALl@K4dz2wDSbG(aiAA`yS4`ITpD2=eS`YhMef<AgZtzZV%!q+^d1=g zs1hgiq`7#1v*2o!&=4s_l7~k)u@C7Fe&N#CWo`I`1O6}?!dYXS+`vg=*WGRa920(2 z`KgFIcl&VMmK}z{K=*=V%|Yt~TQTr>IxIO*7?d6?X=XL*f2bj8ZQk7WNNr0)(%718 zZ)twGvA&@`Szg<Uzn8B}9%*cQsCh?Qf)p*aO>K`R&6|_jrbm-4jZO6{lZJ2OpipaT z(%iDFaohH-jSZkRHq~w2A)c$`0px3HZcDZ{Zfk5qp>55HRLG(l8<1~vvaO+|?je+1 z`#|GXyr8>s+2+Q!CMk1sb4ya2Y_Dx;YpmO`wYDYMzN2M(b87>tuSc;>jZK?dP)ozM zhNiY^)CyYC@G$<stE{zKw@OvZYIlHp+}4Mp>YBGd>aNF29%|l-2fkX92O7YcTs7yb zLZj-o);4Zinbg;At9?+oYe||>O3N}y=DABAd8k21QeQ3pzfSI`lV;R4H?_6k&y{Fp zOPghVq_MSOWm4PH*eV^exutpA%4O1>$br&P2=X;G_)?^+T?g5SAc=I?4m4VMN$MN$ z2z}Fo7@nro@KrCn<xp6A_g!~&t=rSiivZ-N?E}~)9~f%SIush7K*RvfQ@6Js=##~a z^SDD-i^B&*U9g7l1MEOAv6kL<!#8KE+aRt4{)&>CGZ#%_+Vizzsk_h51!|$DK8aJs ze~zA-xgUG-I07cv=PvydZ%zD9AV<*JxyIGkkjWI+@A66}CAuzIL`LBbeyvQ#xZ0FU z!t9**n(w$3z*M$LIg#$kr%K)a;Nf92oF!IaU}*jNxcmy~iP(k_#KqgtQUAjrOm({N zaA%5^CU$MkWC)|=ZOv$`TIe$x%Jx#$7t|(BH4#NjFPN|7a3AIonX&!sqT`v(cR#Hb z-*X(a{BB3^O-t15lJ~h-67T4Xd&u|5;v45gAj@fJAsgoXW+tiG^f%rz8IL8jE<1eL z+Yixi0w9v?5pT6PY!NGLo+}EaU6Mtl%ZpJ|j^2GJLdI@ym%*27fpDcJv%-_My|(Qk zOoPoGn;W+_$Za8JIZD<tf+qb7MKE(f%3D<Ln$EjRq=22-m)91OuR7LT()$Rt9qMpz zooK{TmB9fn@WG`IvK%SyT_JW~)i?dKDA`4(r%Hz+Wzf>6BlR8{%)a4{%b{Fv$g)p5 zg12h;9*XV`5~%Tl6BSqPVR$^eQ5=GoE7PPnr=e1`B<G!TuI_B(!o6K3y<Wxch?;Dr ztJ1QSs;ReL`q;g85w-$^ZE??Wd+WlP8<>1C^zHRnBl-9^`Ev<ReUui}G~B<tXYlJ3 zW<hrC^>{3x3k)4<D&Var+&FBXmd;`$LhM{y>kzR}=-=$(GL`r>ij%Huk*LF)S0X|T z_ubqg(QjC)_E>-3G+t2<f;k-q+|)7!ylz^7TRWdTbQ4CpwfD)JJkqVO-8*p^Nnnl} zh+eJSS(1ZpA@8<p@CdQEEnxTWk(;abpzpDPhu^xXCvXm6YIK{6jd({?cK2i&#%s}t z@5O_do$jtT_!8h+m$M<VSBE>Oo|Gjy)gy5`hoPKWEZu#z{dg<gE#f80rrQb`LXfG| zDyjWb<??){>@Yfm50O6Z(JwZu;9fhEcEAgO`@i7galRZpOXGMKYXEkG?5Sd+^O@GK z_fK5O`x~y|@{60|DsQjG&U7XI#BFXJ9rcYZ9UU@vrS@1Cd#ygQCHKpf);;bNP13GI zQ@a<J&dY}025+3MOrlj%yywa`&RYg-As6E-W3P)T=kgIV8N0-d58^SthK`5pTAiuX zie6abCqtTZsbuxdZI*0p`D9X>FSy>4-^t|MP^geFaa6{81Z@>3{VZ<#otZoE@ih8S zQ@L+F9&_@tVE`d+xg{d-2rJmUOhw3P?g#Izf@gcbeD)g#nRf9~e9<>qW|m1+l%;f; zZ`}MY?HlM`E?2nzBA;E=wA@^Rr4lKS*8%A4x_Lf}$z3j=*n_#>e6w~8$T0(vM$8bB zF0T{0+f?y*R}sZw{5+SH)y2mL;DN5};Lo~;Tiu_yE3~U9zg6RxeXHC$-~ZiTKvUr8 za36O+Ip}_3TgCm{x3^NI%&UZ%*6~U>yISU|#74<8yMBF%CgJ)$7ffKEOnbb@l&lNu z&^0oWo$hr@uifR>9}=gKx2|C4Sz8p$T-w7~16bbC^f`2GRl-&aJ<)#M>GnQEvVp15 zWZ-UGEXS<tvOHdm$*81~H4r<TfT1V}#}$qpU;%`mkPs!WU*Fuc^-+Ol_zs&};7awK zEkLg}zbq@u3_<y}x|!f>w$hbxQ`#rX+NHIuwi`}8NEep3h%<0=rFOd9BnK$Wj^2(U zt_m%Azb#Cdt2Vl9Rh76K7@Irpfvq0Sq1dOu{0zYY%$dX>X2(U)CTp}R85Ny>t+)+| z+-jXu93C#fMWfhjL76ycm#p)}x%IlXMK&#V<NBV1u7!>P5mt8yX}(%_R&K=1C$J#Z z^HC3(*ySH4>ezSq6b>{!<>%&|yW|gCi(lbdR!qdL=emVWMZ6Q%yl&?Sz21r4h(SC& zBl{{*D!x({YKtY6EEp$6Y*y8mvD;ILvdbfW%y)A6p=2wvkY|A@ey0^TBD1wFFhzo* zv#WCItShzXUJc+=>(Y<149qfD<%`Vq1jM~jMsG9HEsB=-X|W0yAd0+TD-4f~tWX)y zo^s;_)J^)aRuiMMSP-ky0i3)>hG8DUwv#x<oRus0`2qRRjN$^ifkN>zE_UvEl0#6t z9$aR1NH;JcQSy(LCnVn`#@VdiKHQXygqQ^O7UoaA5zfwoxLSB^f(^mJ;sS~9lP%J_ zR;^jRYRz5qCUuGsr4@~EneSeO{A=%lZV*v}xTcgt6(gze15oP*BEe?sUWp@d&iAY; z$N;zmOV$J%A05#9oqnLeoMmlEn&3O&r!vYR!{eK?uxj{Li)P4g<rD*-a`mDf9|Bjt zQtfa^jGvrEb{4A?T*!$m`zg!`y2IqGE<B0=Ph5~Eu0(OEd%LTu8#i8JuNUhu7sXnG z8$0(7U;}$^Utu?(7dxtM0m7k`^_l!L;gCN}&iyK?rd^g%6$rr50m(_krIySCMR5nC zL*0JxO4|bOhOgf>X`WJK!t-mk@`-j<`c&?9c+0TB6cD7`da71CEveE_SL~O&ep)I0 z)X6Sd;r@tb0xcoabN9zXoc$(Jz8NSdJ&K=^1;mv3lI#YcLMzM)Gf`U-In&&~u;ia8 zh`+5w3uPL^L|{cN$;@(aoiCZN*S*D%6{PeO{I}Zweid64`ppg3VLxc1Dq@_%-4Is0 zd>bM?3jBO?20~<BjC(?a+dy;sAmyQ=)#12P|Lt{%kWevj_<>mz5Yj!b>8PvEs>-d{ z59m*N4-|*-fI5X&@F1W@NLv#nuIXJU`OeC2c?U&|x*AtLvV1MI_ChD>>%y20+*D1L zR-)IJpv=}U3rUkEl;w7gPV49Y4rwZ@-d|gyP;wo87K;(8RPsg1Rh(mIB?POd--(tJ zvj1hG6}NRE>59^p5wIx5&5^Op)Zr(r@@Tab!)A#V4S;VS%zP{wYUtyx!BVsgGWo<c zlDb`!w@Z4MLM4VyE)=>F@KPO05buk~UnhDO5sj|e5_H=EQ_j7GftYDIk~An?1&2D9 zVK-xr{cAC8T-PiltCFakY2&{ArR5WYm2cks1!WX<ZeNO+TKcaesal8^)*3O?tB0O& zj#rgfN9!xV3#;?K%KZOBVypeMkmNF5IpNjMH%ETGMJRqk86&Llupg4eij;{aDV!s4 z^_Ftp1)l`Igf&}Wxv38!ZRxo*ch2__?g>17w8cB>*5a2E*-5Vx@?3SUIf$T@pLu=> z<Us`gV0M`nk}ugy(TbWD@<(JnV$_BFb)4{0RU!Y&=P$wvqSRUEk_rC13}rkLF45vV zb&^!a2;;XTp9I4L++5@WF8oHah=I8b>cbv078bbIK*H<cINj^+8#GUyM%sx#PT~Zy z&4Xh769?W`A=H1sR_%&^;8t<9d&a8giB8#eop*f_ZSbzz$o<8t%E95?kq=MNDlKu| z!Hd_wu)PJ}m&TRI5@}ynr1UE~frVL_3oZWVkF%Ipc(gf=$1*+urYU34@oNM&(%eWU zV(z`FmuxGs0eIuW-x0ao`bvEG5^EsXgQFAX#CQIuP6T=m<+yPXg5clr6*n#1B5>4p zM~~!W(Q85H3fZgI@!Pz3CyU=2tVbY`G@xpCq0omzhVGQM60^N7!EV_knbS-33~=A^ zDV!#qcXv@VD*x1%_b{-WZ{C;u(;^D;@`NH6F|eBpgSg?$sU#ySprEV{(I9RwM3$Vm zSuGy&><G0<Wba?skRq-jHJbQ)o`ICFOB_Q9oXBkL-PjoB6?6k*$OsdRUtxF8p`_Xl zBs%@%n0htE^_x&Q97pnNGn_OMm$9r&N@8d;Ba7omH=?ci6Qkz|&2RKigJs8y<oSn9 z6Wze*rNUll<lL|($|#mAa4Dnd+^r}~<{;<Q&+3}nG_kJZ4t1E2(-T~Y>otjsmf6^s zls5-?s0l|mJG;A)8LJav%e<o5(J3`)*brybzzr9yAAvo8%s!4Dadu6`foMFe`$`js zId6EN_aBFQs!Ee^rYo7#B<ctI>u%o4M9axsB-_6Oc!#sUFf3=|{1p?~v1o(QQkn|D z+tq_(H^9|{h4kSZx$Q$Pcf_Xxe7ElE$<jgrrn0vqJDjpRE(R5L=*2>^{rP;pbz>CB zKiG@CUd+o_7x;R5aX>O#)q*o?HWV>WPPB8d9XmKw)n3<EDB`*)yjbji$qESPMn+X> zsxaJ(n6(xdI`NxiTk3G^Z?#h&IMjqD5gy^LZ*p${_enR10{E*)+|UH&%5-xk*QP{+ zaN4C5!E`08U*C$ee;p4z>RxWe|FrFBsojbry_#Tw95-_$-HWAFk>w4Y5P<P&D<^aD zw5n+9|H2`cc&T#nM^v6gj7Zy~+Z%4`hya9Kl!m<R=$3mDaFMHRKrw+V`Ho+(VI_YF zZY6T%QmT-ZfJ|JH53D+f%m1*o0(i_V^KVy!{oR8--EA&DWnN`n#IV-Z)!}q;Lw!eE z<F=)ZZ;M2E7isg093gxr+tqo~LcR%?j-V|kuIW?)S?Q}~zCPrOXgP`M9gtXMf8jGs z+9k=R&l^8mZ-S~ZNl8^W$c_i33kL^!@TB`*1kfK4>2=<H@n0ZpcBr#t<=Z@vJc9W3 z!a-#9(MGJ&ABOCF92a&86ys6=cVo40fQx0q6^^h0a4)3lkP8)cR|=GC<KM2X)cMxm z995BX`48TRrpUxNkAY|+XR@)7v^fElL~ay2-H?V2d|uz+0TL@QFV9+dRz?5D?U`+i z@w+)gysf#uaWk%MSUMVR=8*##%wDW(B;L{cBX5fR-<h`lWtrhjbOK&<C(`Y*AmCf! z&bH4EcpfIx8c*DkFz*1{yyiNpL5mk{u>0gb5blPo_Sn}{kP|)<xCyB*9_sItQyPnD zasDh69rY+T1w~12X#Q!#MJoaZ?(~r@o0DNXA~BzP>;ZfK8@LZxb~n`IXH`4^L=0k{ zkY%X19P05hk9*4i;lzOb8}BT?;7_0JNO@kgf66S}^711KJ)%pqHGAX?2y782@n~!6 z%o^{WbW2{_D{vmGlE#+{YW)lP^*KJ~b8gC>MU^}5u+5>@^2Cc6yZ!)=VH9((wzM@h z_BQfe|A<sC^kIb$24tU6&tQp9rPKw3${|V;=Gr@$^}x8Z+r7mOd~#LgUm_S+=R7n! zE&2@?e9B=#Fyiy`oQ`lJ|GZPwIn5;uRisOPy0qAoXy-0aRpo<Qn;+<S0N2knAi`o( z(jNZC;&b(i<SCNm&<M_q*xyafvS7_+yIl-iTvvtqq74tv7lPJG8l@3eod>FX`w+7+ zAUBw@ft9;(gg>XWT*t3e6HdINd&(SI#`SDCQim7rt18<t4K4pac+nn%;ZujJGMubb zV>8taVx~D^UoZT|0YXvbHlpRz%A~rwI@J?V(Tgz5TlB`*0do-8p_R-5Pi!RY>D@bw zNj3+-oI&Fci6+r0Ntu{+J!FS1aZ?m#u05SyB@0iTCGCJ_nRA&kHnxX(KXti%YhiD1 z7dDeT#EJqtyFjkMAZPoaMA*KE8v<)oxd{)~Wl33bxvu>9#!kGQCI?()_5KLX)p%2O zm;0D=>4r9~WZDva@%It7<L#;e2=R~$HkBb;k>IAoypL+Z6ibvL$YG|DRh1IV;*1h$ zjv|(9#JUYo91tGpw)V?;9p``XHMt2K%SnVw^8}m)3!pE8BuZn}ByuyvO=(Ppwo|4Z z-z`NqlQa(0tKP)@wR5$dgOD-8KZi!l34}<VdP)mQFIBTxDS6}CtK_7Nj$w&k47-Fh zDWSBXHv1z}7mh09`V=iqkN8QI@-OtJ{H2Pi6@+Owq_f)5O~Pk;tsBg|3T(!Rq^#V0 zVa2Z6D96Vk9j<UKR)0Ebe8fJw48`Aok~bN}Z7Vyn(18e}B+Jt)Rz#H01=)6KclpV% zcPKl)rELQxx8xg@Agcj`^4}yqp*!-W#($6Q+3|AXY)?1oh??VW8?j`Zp(f#r8V@4N z76D0b8D|YMna?CAT@ef>BUs1<g{C~IKMd&ISqwO=uosgY=#z`0T*OAU8by64y~Jbw zNDSQZ4hW|4?plVX1eiZ4K4fXbUhLUO4UAoZ|5Bjd$qbw_EHHlsLQT-L0VJ|Uw38bZ zL(F4-I|w~%GnO^JL^!=dXlAa&^v|;35!qjwHn-lTRTlwH(u13QrCsf?B3%{et$=+c za}iX)5J^s^G!i7Uh!>RC_!bjZL@>*%V1WA|GlC>YwJ^Gp0d}STzTQJ(^vT~z6)C$E zD*wRmPM67bG4?-shte*sEcAsW59;PJml?E>C)ak2=Ie5DTUF`j-1X}zd}gE^94tU% zO^#&~r8<9NRzMIYJx3*AP`9tAYrjmGa?L6X=HWg##SV&pY7gv^?sBRqfi&}K3@oV@ zUs{Rn69(RQUTRi!(^5xP0N9X>UpWkgevj@=E^VpUSwKB*wQ5_t;Hv=I`3NOv4^m#s zIxJwFrkcJaqtIJ>S=dniRTJ<OVq_GiI*1bNo2Pem*m|<mP~t%uKO3(PIOLje*f&J9 zpvNxmppigAkYu^{L)1f-8%(2=kVt?c6T~E;6E2d*nTX}Tep5^JE{IZK2`uVDPHxl1 z)ncA?IA41D_N-qYM;k=?9;79QN4pOqm&fpRK_0b7+#<U28&%)Mg~{#h)zx=Y)jU<P z;v4bx)S>V3!lpY$j*jIeEDl@xJD*T;`}T*ncQiJ&b!@BscIfP^CiyeoPKA6>fcQJJ zx>Q8$9^U+@!mV-=pCCyb@-<`YL;k2L>3CtL3o%7W<;F@zY6>a(R}r-!TW%YWs%Hpm zj63u?n<%6EbvJeg_lH*LXI6RN*Qm3!P$_)g`ZkoUE{sOmCgL9Y8>zB<6Bn*?N%g@Q z(+PxM#2`kpSFW|`nuB_U-zxU>b?$ZEi57YHtq23mR&Z(-ARb{$<Ms}ySagYoXec2j z^6X|MnZ+ai607p^<!^4@y0!U{j@C!F;ZEW$Q7sXp3cS$3)S9n+xpZ)O9&F8*=RJ)u z$hC`bRnnSrJT%OEja#t9z=ReZhNgTQL!aqT=+C&w@~JRz4O=$@*;`uMvQ0EN*a%04 ztiDa0HsC_g0A-8r1BZh-Vf!(w214ivtuJCM^h6|G*ncarHsdv1N*Ff7@)XApe!@n` z>n+NxD>ZKnqM9Y7r5Jf8FmXr}5WGK!ZDJ6xnwJ|XWI=9RO(vmM&jS4ENz^opdaQFv zTuM<T$7xd|=M6!vGUnAPT!3AF{$jCx*9wRBLek`U^5rg2xw~g#(On|<N-VB&U+w~x zV?6|ET)f=mZ6xLlh8DX(?TG$_K`1J&md~R5L2Stdh1Zo2fw0oc@sne8rs8#T4LdPS z)2S9T@XDd|!(GKjALl$zo6@eWfJnMf)53it{rAXo)1-S9MLILoQ{yA#;J%eLTz}zl zap?>VBHYCJb`Y3=UAXL0&QB{yupSosiakRI*5iH;Y>yX<`_@(m3U870m_#>t$+9Ef zM6oB&q_NoA@e2@_|F9vO03n|Jaf6cQDAW!?8F>RPSuj<%4<Zh>pEI!(SDm!$bz_fq zv^L;fhFaV_7EJ<DuYWqn?K@Uge&f4U(qNeAD>fB3`Cj;j?ZRa7M5?X6PaZ7F<En&d zc^u`|g9i&;V%!c%^jk9Dl9wj2Zxdcg{QI8HfmL|Le&Baw1vu<ldvS|kvf(jM_kh?1 zS~c#xDGVS)VgRRE5MEW3*9POOIdk{d6MNxc#{ljHa}I!qJNt%vj2GO{d28?%zJYqa z!K)qU#>%dkGz{W3pYCJ>0s!Ri>K^y^{k^O3m}PZmS9Rx5JYMy>$J11@<!*yk&S`dQ z&^iY?79O;qXAjDjy@Ns+qq6h8TV@PQx-co^ozR>IOvNY#jJix6lBH_-o<gDecD%#m ze%akQxO_#@)3vXVEcYdMw+}1_UOL5=+?Z$FjyM8CkP+!!Xo&y)Nzs1!hdpcm(wS7z zF;u_<XY%+b>k>%!>EHuNs&-bgBsq-Cg7~ZaKoym{oLgiFo;RQGu>K;I$+S@8Yplue zz8)tXItSSTNh=;;*A&-x(O$Oei*+k7;T?j9+BMzH!x9_K9TJ4;Bj~f>KMDhJ2O~-v z77?~v5luai?CJ3jin`c$^wc2Ubn5gQG>34Ws~^+3<Kh85>?OX-?LC8iNgLE;{d&h8 z79zMjT9fM2vx~YGIl(f`y~-qPYEEf>i#%Klb*}5f(OtaX?*Ht%A18F4*o}SK?&^V_ zp^csuo-uSqgvX=&6Jc_(UCH}k$%Z|hyL)?p=ZE_D;CPOLd2)X```SgaftvMw8|e^U zyBwKREgIhd!wK@W@Qb)8MfD?VQRzNaWbtU=0AmBZk!t6SAPOx`s?|v=BBYP63ax8s zD+1>sML4V~_Kw6=r@tczp&Rnq-6}?2NTLPmjd5ZvRepnap+NNc5Bna2#i0id<-Jo_ zfh#^c4~PV#;>fWsS@BM1-SA+aoDNRAELCYMBLm4Db$8;3g1{JVN-K%kaavr_>q<lE z$p(KwUUGdax#NzC-jY=X8jaL0T4!fPZzd>7^f_u9;wdUhx)a38YQ9m5!m<^(X8Puc z#aFfIK6(1EdRO+9&tSy69C3%5fs5jSSJA(+{H2EzEaIs=I8U{i@S(~>hr;^px6^tS znL!VTdvzBK;8apcS#?`U8S796mTbmfC<0${JHq#NrF%f|j@bIuMoEiuE6OX*^^_DT zJ-aCq6)i2@sX}!<mL0=+%T5oP^i0VxNWrC5NjivDWewgtbPvEfPLoQ!o0uL&$u1p_ zJ2}z&dA(ekUfN;(ZrZs(Lqu!B1D`cArM0)q4`DT0-3UYSFWsi}U#=sqV!r^B28ujD z9sK(){JSdiH=ce>eaDlyslV^Y{EZhpQ{OAX-+3+Oln<d;-rjy#+V-^A4bi`_*<GpP zFFlZ1rb&iSR=_blVTs2*<@rk7*Wu7Lt#0`4pXEe~%4)olS+?>`i)~1za^zc}a`(7q zYCBh26Se#B4OWeOXjN5?2s_m^M)NvTSP&3a&`<Y^W3b#XJssE;FbZYl)l+8BPzG4f z0<ToNIM!FK3e_%w^_4e)b(8_tpUU)lG@N*?*K{PWOPspuOq`cMx*_x%1RN!nHqxci zVgPR030=O+zuagA{|VK^1*DI7X_7S72vwZAy#tGXY22pVQn*eRp5i8BpM;d=li}65 zm~-6A!k7+N6J82;C~uhPd+(O-W-%+t=sBsds1yfxoj?4J;qO0yZ4=xE1fu(^b5M?| zi#syq=~>jGBr@kiCGJp<x(0l`LMpZOQ+FpI*Z_B};#wf#(DM|#Dup@uhqaG}50`T~ zB#l0h*p<hqGK9{+CqGmuq~nLPA;R(F7BVBj*mi7X<3k+IW&D=y?Zw-x?z``)+wOa6 z=Z1~D?%VWK=N_!upK>P;pYnmcPq}-{S8Q@=tMAx^P=w;`72oI;(?Qt94=(;o%)Z5h zD22%O`ocha<q*!xxMs^q4;SYS=MOFkl989%Ty(qqk{`{P^YER^%J5bhaCe?eS(Z1y z(@0l=M-C8cAnO9ji8q79VLnt<xg(y-pT=t3ML-1K6`(DPtxIdaYc0pVGjWlKuHCN5 z>|)_JVmM$_MS-Cg!nh`uH_%~_+;?Au<{}3E9(zt2mQk!XH~g6o*;d6>A(|s}U*N`7 z;^Zb%mNOB(TxGt@Tg!&rTA*^+63jew>W2?PsqJES-NND<#$xr{EEQf$a8&nvsAFDo zjHm-9>n0P~`Ot2Y!JVq?z;It5Lb!;6nF8|wQ8IYj$;(Yv3Q^Kt+#T3~s3^oUyHhF9 z9`9GeC71$LvXZ*1`cC<Qjb_w6j91<P!kr$z<d!pe;T=nGM_$gxFPAghS}c6n$luX{ zcez_z{Uc;<=7^VJj0*_x<bMn5#{}Jl)}Ene4a6!{11UIiUOm`@fJX8Av0&iNaM?36 zzGpeB<%c-~JKGqo<<cECt6o4M>Th>e#aH?@dmZ7J(%}w2wY%{woV*F&`=oq{nwQh* z+wjnNbA6d!SKH6;<i}m^(Jt!A`@?9ui1w(~$9v^HJ+WOVAaFQKU^g6d^L8eLhMlQ0 z%?`_S?b5_lCz`--bpn}*yJ;SVy`<)J+Pnf<(px5Xk?o`kyL6|h1+PN<O!l)1pB_uC z%qvg{f9Mde7mML<A@h!d%pXafq$oSdJYBz#tXRucTC~t?Pux6t(HiDsdm)KQBUWX` zFhD%MOb1v4FNkGrunVINCj+$-d6Jmb{-nS632ddP4KGHeSY5+<jKfBYa<gE(x|D#B zLorTW-oJ6^vmjrOeLB)vur43fYx*WVyAd57L4KIFWImcFOgCMKMUBTuEG5W4UrJu^ zZK@FL3oOLRhP-InbRmo2<hBJ%xvgv|!In-{i}R5=%=^S@NEsHU^{NCDpiz$(di?~H z7S-F@dj~q)F{&!lxs?g-Y8E4BgZ$6N``oYYf1#Y9ps}TX|D`Q}xH!fwp}b{7CMvi3 zQA(M$Pg+1_1*91i+;4?pEWD$i>xao+V;!6^c>l=16ctU7*p`kjMUg$*;_z-<eFW1N zn~n$fVWT%W#CNIOVPaka>~L3hwQ-@L04Q+TZELHCr^&ql2;=QwVYm+$0rw=>7Cz+P z0fc7=N7P|m#=OdV3f%)KcY<)!-?<ltAs)0g-%*>*5+3}K<dAzZD<qXujr)7CMTR|2 zTwuI^CH`8m(iMk?eM#+KiTMQA&B3zU+iTRlxcRAfMRk(2?JMB$LveV|9+`9`uW$K4 z((7sy>kx;u1`E()@pY`d{q_NAqq|;L4mEal74YPoJU{0$BE1yS*ieV%4tyopzFnW} z8*&kN2lgE*_I4Gk2XJ#l_1?ncHC@BQH9OGmVhutwItLF`?;GmJ(W^3h|Gpd7ulLJ0 zL?Pq`003_nwH_=N1Mu}j0I>Og=c*fy06@ki1OP~1BR;HW$z80G1F>x0n6vRIw{}u% zB~m&9I|NTs&}uQ`Wg*k_CV3viT6|&iN6Y~@n{Hdk8A+ex&ef~_PIk@jaGuAio%{Ru z?&{s-KmK?7AqR&0cT02)n&2iT`NjFzr0XloO;75cFvr~5DAquh#h7r59Voj8;To_Y zUHY%-P1VVi9NSc?g$DyHm>R+gx1iO9n6sIW&@016FJ{jA!bQD6COH)*Tg^jwstZRz ztE|a61qGXJf4Kuwp4;ShJTtL+b#$(cHM$@39>v<<yO^Ta@;URkSowY4qWc$9GPu4W zzWW!+H*jgq>KkHz@1ohiu@>xIS__uikRY|;xA`5yD$?Q=$A&7*)?2RO4n*j+!hTpp zz^C0l5H{)5G5q(xn;87vME@Z?WIQ-rEdFjn!mDwJ;1C=gLg>*DJU5NHn|TI0#Q@RS zF}?&OzS_s?v>Ok&Bd2Q}JK3}ucO@1E4|!CZ&uJ`Hr(B?kFaqp!$yCg&*)==YS(#L_ zxX6%njUj-Mtr_m9MplE<t2jE{HrOdvop6xx5gh96fo1DrH1*tKrlJ*k{lTrhjHL=J zf@YJY$hx<EMLODL&oKP?Ej?Wz<eU>&5?zY{$5R*Z`Qvvi7~I9i*sAhZg~a!W$Oa={ zEK0v??e_hOayje`?Qc6Z)7|X$^jRXi?W#Sx*di4>U#4MY%F8OGH%z7HB(78MoQvJ$ z-uY&#ozGCvGP7iTzVvY5h<xT>bkbNK;mO~qi1*EnnNTfmn{iLO$K{oQh;)<V48h3C zotjj?Z61=gL|x@a&by&CtzV^<oW#<&;Swk1l5Up3Difz@N^aXg7;ImUTzV|%=bbIQ zw@ndA825&(B<*l_0u}vrDUvU9ElP=LOCMJ@qA1MljsvGI;6S-?rEc^0!-k&DUT6@H zj$97o|1R09ciij8RU5^y_xww(B@9b@%P=jU0^{K~O&)@tZo&9cVchA)?e3*)i3uw? z5NzlxBI1rR!cT(pc1&D^t3~z$?QBYwi{Con9zOQV=tY2T`SS&x!`SN`Odk2{XrcQ_ zyt3Xi_+;{6=VRTS$%ei1<KX@NNA-a|LEIEfZ^NAmy?DlKJ8tdXoH`ty50J>L))SKV z<adW+cKO0fBb<EY|MQ^Z71E=PGu>O<;fkV!fZj$F8Ypa&FdTl#?o5<wTv|5`NEU=O zOSx)eZxM&fV9SXEBSmh(X0DiZrFWkwA7uj!0Xt5Zg%6QjgUmWlFP6Zp<|x<XvQ?26 zHExS?vhe`it#Xx%<DuMK1Xf_UVtbA5CirT-@(At^;5D0KQ9O&BtuvE0^GL*Wf+O27 zkOuTnuQ*J7LD{Ti)#v3$PUVAzA%EYJ?R8{N!5~+5w$3))NsWu*mb+vfZ&()k6Tpb} z*xT`s!>Gn3!2X83>5H&WJ-2WRyKfM?<;r|f6I~XG*V`Qe!hV9>vx&30ojjSYNxqgD z938GRE6-Mw3qorNxAPXKw(#)ozTPe$?2*_@In7NC&~N&%xK4!5!GCB;YPU%eUjLJu zMBZvalC`OIZn~7zyB|oqZl1L9!v{!8FIaBPsSEUx_O5w~Z9+rrRiOKlyP0&b_i<V9 z*!np`mf`oL$OLA*ZM<&IAGA<x27BOcc*++2G69tSt8kJhblDAZf5?q^NmV>DD{Y)) z5Zp#jr`z0+!gqIe?e}=IgrMIvrg@<;Kuax8BCkPcCt@6hRXxkct74l6;d8<Gcw0J) zfr|U|Ng!QjG^7(Mu+!wqKzO@2D|&pHo03&);KGP*r;;h!-<KA5l#izq*0Qq`Yj+*2 z4_=0Yj8*Z9G^yxZnSL3eVmI%Eb=+l(7QPkWJ^Q!2gMwZC2dXMM-AVxybRQ<4eVDxA z|07Wda=A?vw(cr+=cV(+kd70iR4D(R_9E+kwQDX*J0+-tY~lZvbj|>br@w;!@u2oU z)Gs2#A`5EQ$pIq_d2dmy>QY<IjXC~@vbM_WN{|8l9**bu!hLD(_>wE#8IgHHECr+l zIj3w799mU213c;NFn|6UMm94S{SOUssyop;3JA5{b%_m{$8lIj<|H_(Kmu)5q zOK)bz2KXy$Cp|%7I7wJ~JDZ%Xwz%eH0U#*8?CGlEfmMXehgpSBPl(y+Hha>4u@hw8 z>=MDsD#r_yKxVvb=SY~P<PWHmdz^1EfnDyYidK}BGWUl%_ro(2EGPNso)O@Qm)*l~ zeyl>oi*SLPcJ~(W+}}RjTY*gB=Izw!R_|l;{~Mc*)cb{P$CM$qB!_8gf5#Pb*uYt4 z7XPF{G|X8EP;Byk4t4TIy>G=;cz-l3J541wnlMT)ogJ2wcp0Oy6<%Pyxs%jBZJv;X zDqOKRF7C`fh>EzvqvCR9qJ6ki3T0{tS5#46gV=Qc?m+66?^J!aR@zHlX@8B)u56f+ zZFiNq?a&;qi`njydl3D0*VkInt5b8S8(Za?P^LUx%<HN(-beULY;0w_KD)KWy$QFo zmIAEoo^xvDs6Ldi&bzg-6(HKYt+EjIa8+(&%aWE~8|Zu!c6emg4Ld-t2&V*DKd*>p z?Bl)JdstFwiSZGc1lf(ZG~b~Gr7gUL&PzpS?qP{T!Ed#gio*5pLI?2EZ(bchnrO4C zr+RNS%%c9Dnj&r+#OXG9Wo6+Yfxo)_s+^`P2LCN?R5`U4A5sp8(4o|alcSIK1Rqi` zhr}?$g&Y3NQ|`s1nTu)S+GLp@?({(^Zl3~{mq?Is6q{^jNM=mVXbUKlt;C|v>;Ykq zP&a|H`##(2S{j1nO7Kfx&mKA3&sU4H>FfQa^5QcWlM|1>@qYQ+1&Wf&KD_AOU(<V_ zINV>;jnL9T>9CFZq1}IJ_n&GiIX&`6vID_Cg#o;bTqCOp=!|=r=nxKRN=OMJRgx;~ zI`G+LEIEpWl4qIehW2|=ey<3l>G!d?4TfS+wDfwW`uo}8J~Kbw+Q`}?N3X+;d~)9d zc1>^vtGvwPFI|8bti+>ExbG9^J$msznVgc?+E~}n)Y>4M=OV8@yh>i-?#6M4!QS1& za(IMiByeD)SQs9}p@}YB(k@nK%`zFG;sHDixTJtE1!)97F4eqt7tm?g*k)=benNV* zR5PQcMJ{du&@a-3<0hSO2g<F2u-n}2n%sHt(zG!8Z^*w4@n*&zNRMXP^S6xW<?%6N zAv$o^0fnpBqk4JNlq>SSK4c~$PuzuvPXy44Te=5|qA@D?l4AXO-4b6Cm^mK*y0+xg zt&x3t>*-s^`WA7lPeCTcZPz2@V_#nIY9E4@c<en)lei{eXy4abvE!;)Jk5v8bh-+U z<C>(-fuW>rOV1&PL3!UE_NTDZ0aDrJzLc;sX>(~)@vG$;r<jx}D7((LcSmfqKK3ax zc-7u?(azPM8%iHL*^uHC=b(Fm?9S|v-Db@wzyS2eCpBAWb7244*+4h+KlYwUB6Xo@ za^=X-zMETxJ}~5}=zJno#Uf&F%l2jHDID)aFNDTmXq2Rt!!H^?3gcQBE%ZHfM`LS+ z1zX$(X4OVqys?cXSH<Oe530TlgRmjDC5}T*{*|rB-u{~o_)SlN;^ZC}2-ZrKe}>kf z2sYC<n(surS0}<-@Vqp5UaDnj4-K^EK2Y$jC7Y_zkpT1jHavki+io8Z8o;eyS5Yy3 z6^9QTkX@U>9>3s~72rNQX|1P)9>$f_urMCz8SL7JTW2;r?*6{NI6REWM^6fAY^#Ao zX@!R8<<pc#x89ElC@Be&566kz^D8?B@Wy}(=0vT0^)j9W7E{J%xfQ#m=OFHgl4zXZ z6U6aJEMu^uS%(|!<(`5exdL0Z#n4?60OxN4#0R$sk`v#B14EdYpLEwx$vn|1_coxH zy9;`|Q4uCM&c+Yo8BT1HVPWOx7%ZUtAqZ>WV8K7Y=vCCnIHfP%i44_jfL2>6%bmu& zj4kdFJ!RY?m%jB!FJQP?3#%^qIiI82FK3bpkr+a|d-zSGoAMq-lYVu9uGuIj7t`V2 zjr*oXDAny~X=%XYhqbL8+iTk%k`T4zDYyXSwa4h2yhm2zDUEhJvkk1mE+<x*Hl;g1 zL(l_x=Uv8#US;t=$P!N$xH(&xu9INVmt1P+d&R#K7tJwrS(oXXiadHW+xaO`1wx!x zQcXzUTvG^#y$u`Td7dd3h>bH6?tQ**vMYBqHGbQ5aBE2~lG|LN$}2x`;+Iq<3#%4) z@4jpc>m$jcJQ0R@H-L@?)TtDiq|0Gvx*y5?ocE$4_{j_KlD39zBOzmoc>PcM3VRVF zil-WI?}MmwaY_0t{L1*)eQF3W@G2~e@!*Igv2-lvOC7Rf=5O`I#=8@KAe05%*CY}W z*Pq?wj=#x$?PVn)JLFPFnap4<EWJa%SZJ#%cEfWdxE5NZ;$GS#mUgKOQfOo!I})6z za@-Rfb$8ep_dSchqp!BKm8QoC>lYp}b0KuG4~Ofw_73dV6K+`nE}7t#B)NEZxo#ic zga8m>GvDe$C+5R#MU(-F)bfp}aWN5o$za`<%I!{7cwovyudHCHof=gYL?MW2>8-HJ zBc#Zh8ZjoF&$6SLTd3jU*K&_O<=g`cm2cb=Ii4|L44aAJAFgp%Ny?RwSb4}4?^};~ z1=m^b?>&%oaX|b?3n%!eEasl}D1l2ww|R^>%8`i^r}bRxl8J5r8B?9^iaG2HLz7B} zszRF{iB_tFFyhiDB2yuYP7IhAWU9}~k7U5$cxg!bdvJV9e8=LL79$FFnvdd_J3TRb zIIl9_zqQBHaraQM5RWG&IJu`tE+4`@MSdW0ozcLder#e`L#1l@XS`xxImh@6$d&gs z-E=8VTJ!ZRNA2$UI8_u4+$kl^QBXnQO|?~P2x)IftAbUQE1!7N+c{{r$;l)<@ht(~ zo>GUs0RLyC@}AYQN@F*r$rge%W=V*O_u+C*)y6oNSuSKWTH(r<<NNI|#Ok11vXmSF zhFr<cv-q8RI{S;*s=<0?bK7?3fX2g`7+hKENHibJcPGeBecW3%{Fu1gr4t-*bSoL$ zpv8YE9ELF_Q0&pUuW)2z<>j~OY=PNbz&c5)8tB1yU?j8)wc?d~UZRT9oc5RL*R1lV ztmparU-<OW8_BG(ucM<~r{i<W{joInhckC>Px2m@E!`lKV`GP8Y1KJ^H@^A{!&q5i zdwEEfyy~nLhh*tzjAU02w&NuVHFe}fwjle5aUhF8<&;pI)Q~mzBx;Xayjk(;&{)(x zXecMO=a%t8=O1c94t0d&_KLYcU<yauiCLGn_bcC|`xp}GRZ~iIjW6A618zx!HsEem z4Sdc<u~Fk)hypk+CP}SC^&-4f)^74%oF1ntv2E4IQ0@%{a<H(k!Oj834rb4TL{11> zS&stNjy;`nx0NOkz~b*&Tya)yI{4d{TC(Pl&Iq$ud%1>HRqAD4asQ<J2U1d)Y{PHF zxF7(^f50(CuQ+VbJmKY*Bb$9UIfyskhr7h_ukmJzFnWG!(C(Oj4E<uqd;EQlaG^!+ zP?j;r%Z-gD53a#m!E`qmOy}RB?lGIei>HB<j<*CUtNRH~SDhyQTX5Wge|&n_yw=L* zf>Xc(tt>Mcr0&xysWdxPs4{zeF#m9G(Q;<K^gPkkhx=5!(f9ELV>$IZ+%N#v0iV0n zv5|wxqBo10YrOARW*T|Z+gXj`QjaH=n2srnOx=_jBPu#OYp8{ZhP(Y<c)rs8D^1iy zp@(HvrRmJIiP<qM+*M=(ii_`7`Zpc}DLp`6#HX9Q^zTF2`O7--5EzM`NB8EqzX~B# zES0z!FQ*;w=C}|=MD-1IVkz!kS&xg!RxO2DOE93QKfZ~<SOyb#h&0Va?wJ%<pa*>w z#Cizo&d^3zNq}I<ApgP?8h&$&3+?AD>ukQ(LUBh6D!+j@Aiw)m%?dsR*)AX;D^NV? zh9zkz54TH5nwqC7R(xae@7<`N{I$>2@yaX`bsV?ljiY&^<Y_5auYbDKgbkxvdPrAi z*32q8Gm_~FIbbEjit&lu$9hT__l5ZE=H)LF=_}{y7D^fW)<yP2Cfqx`0JhxlUiqGp zel|IEr*6JTdYOy!hkntH3;N){#dys$H_yeKMNL*<Lu@mTY&a>Ekh*GP<oeZqEX%XF z08^O1BqvVF>FA0%><g12Q=b+TUN!=xrtB?_PD1L`u?~0C&iL&yD`C|}#SlR%l$RMs zp$6p3$wo;o&B+fTv-Y$y@4wu#LYHcVE;VlBLA*`mTx8!`hBu@-;cdpt+r{MJu41Dj zcW3O^GL{`}w^%tPGQpceDLFT5Og6b7Kz^XJ8Ql`ttWfvY;njLi)5>Ix{`$1LiX1U_ z@=y2n^_bjVZ5!IqQ>??HS+*nd?tv6u(^U$llquHtS2sj>UrC|!#TDe(mEnOf_C^+f zsBrum^k_g{0>qP2J;H_G-$P$UK)m>+be82#Uc89u!hrQ~Ko=}vqD@_!bAl$zvc9K< z7o3#kSQ2rb(yLG+?uiC^w_2|XqhIxE;VC;q<w`won9C`_RbC36kHi?08*p=)C#He; zOS&<aryAm3DZkB`kP?E_A^R`s6y6#wnY2^AArFLW%!){CnC_(Fl=V>}Wjj;+ls<5x z2<oT!g|dh73Oq1M!vzUt?3G}<`{KQL$^CQQhORFh95{%FAJSd2!ddq|ttHL&P|6z9 zA%oo^u_qx@Hkb4seD#CFa!3JzMr?1qrgr-Qq_2dx-kkNofv){<(GFr$Z4fK(%)gwQ z)<YjjS`I`wNd+ly$HqD2EZu$_eg_TbpQ=jQBk$Ws0x!i%M?^ss{-{MX>%#5VZE(FA z`ct+1aJJm1YpM<PmaoWl4ao{9=LO?bH|(r%6TcjOYLOEkFw}Ynu(&pYELCtvgd7Hm zEC6jq{F*{(NnRsD@8xnC%VIDAr2_r8n07dIcFQ(*ZDUoY6=>FynaL=Ia1*2>{I)c0 zl-{JIdd2hw#j_#{?8C_-&Wrieli^=k6)gvcZUS^-5W#&~55<=eW>9H+Rsf|XG2{iD z!HYYXIja115ZRN2FjTjvH68`E1BE4qs8oAGslo$rKvTNA5go{;<k?|NUL6uGlx|{) z4?=2K7!optNH>($mu6d-TJ1yHFeC>G@JVD!fqZ(nRqG%R1((Vj#?ZMlvXuqqN~E~m ziAK1CBh4lXOwGhOQoE1==LaieznLVL0-uWT0a<-wCf}4NyH5E%=lgpO*+tNj$2!)) zQt;GUb0u(;R^^-=JJFRx`=WPLLI(;Dx3!Bxr0T!nIv`gvMdXc@uL`z{)Fz@NUE|)i z0ZqD4HpEHK%2BlQQxa9WTpXY6%RM|jT-Vy@*9Gm%T`Vw8t9Eq`$W}PEz_IwigII^$ zR?KD}MudG0%(BQYQ`OMEr;$zglkg(HRqy$#ULH+`q5CRQy<O+8g%xCQJ&ILuhs**n z6rAp)JQ0f>HI%mVL0u?>lWMs&W1(D{)Lr|F-QOlWz=iXk+v)tQ$}fRZ;+t4vv!>1Z ztd#q|GYBoizNAyz>=<Xt4))+MR2Tez(SdCzIC%o5Jt_(O_gl;Jr7q7MHu_t`+i<Pt z=G0!fKN-Hirw6xyi-04X3-g+8BDll0y9;0Q{9BpzJ57r8J(uxOHgMXL!*QA7bSo#m zeYUx2>!Tf;8@D#JLgn%<mURj08(SLc+L~J$T{68~R#)_R|E<T1UOdTQI>I)8&hk20 z)SgW^)m9<p%Y5%Lx<7cSXv92%?|i6!mS4YiH!s9|m#FHdN!VP`Gh|?(j1R!E1G6IZ zfiUW);>^SIe=Cl7XDP}71V{ueog9aPAY6WryAAPj-^@WP9p;wrR^7t)=47n=aFbrd z2xS>2WXyu6E>JnvwKuR;pvWE8L$?6<1_8MI<t~gNA_A9tr2%hg;$ZvI9&4EI`h&cq z$A5ui$(`b(!1Gk}^3Kx>3jn*_dhZ|Ab4~)xT48O7^JKgizasrILX>847%nJ>e~W^0 zZy~wucemhIV+{G@EqGWkeuLV*homu_E(cd48aoyh$YxlP3l}H`Zd~Zs3kORz$Zk%{ zaFv}qg5NHcoqjpj3)!^*f!L+zxcc>?UyABg4r0zrC+6Diq1p_8i>Np)E=#WZh9<;1 z@dzSP9*02T5_BsTKk~9p@ec8@vT<%Ng$cS3?c7$QJ2HurRBnNTSWV|5!#Q;9uAm5b zDrGt3Hd$8USEPzV{e4wY{aSp|I*gD%_o_ISTe8;LhY-;|&y?FU^JT(6v%5!n-^DKK zkxW*Bi4>I|N)F1c2SWuFbr-&h0Mzc@J$rBl4BvM5?CX5Ix1hdJYux>ufy{Ak#*S&b zE!um-Wlro$xh?}7WkpoNx%auJlskuTHB%>oUQKae5hJh~K3<7?<zA#`8yX#i%u8lk zaGa#M?#~Li*b^xarAq~u0Qt+N7xdAoH)9vbr?6TLzvZ;a>65j`8X?T&Xk3<uY+GaP zEZ<UL??zfH`LxBs*bu7z3r!VD`Y+9y>8p?kz0;Uh6W=+`nJ-%5gPUXBv;NY;16#h_ zXfBywnY~J?Ua1Z&O|n}=t8H5eVw08Wiq6M7d)?cP+X_%CyuKuJV`XoD@rmKu`W;b7 zjT;`hE#l#Zme$7RrjEvXxy9h#)p!&-D+GC^%8t@NR9@)i?7&yne7CCl@Vb>xZ(6al z67R?4mX=iRy1k-Cf`QN~{BM7WrwSkBXn3^a(Z6%eu9b2NMs`D^0y|};30Gy438Px7 z_+ybP+j0>yj(jStq_Sq`?VEP4@9e|V!s~Y>?fAEg+=IzzYATgd)2N+0D-X+Ubx&8K z6+0`d<o6Z+_nq?lF8})m`F&&Mu3b*ux_jLHG!mYjab-(Q*%pP=J6G>YBy_~}j5Id- zv<C4+hfUC>9Q{`+^!i19h9OV?73i8j(#TS+$vmorRdKl+^;B6rUQ&f<+}K25rl!pZ zYB~69PQoxkPcN%095^)CyLaDEQq{F0SqsTug)N(+Ohnn^49k{n?-}gJJ}EY)1Rmtf zGW?BuaqARZZ!7U+Dc(g#cp|R$8{CW2KWG9DyU8)MA~F<qOX#0FsNrsVTZWWw3N9A* z3}N?DPH5nCT(MZdjh1qCTX&%g4`Cx<P>ynVmrPP6@U*;@IhMmEh)TM#-Mx%+yMA&< z^d!s|ZNbFnj)TZ5Ut&~+2iZZE&rXndp8|?@JyBeSLg7ta>G)hJ@80+B!4*Szm0OzS zw(N`WVuyR?5J})14svN7jKhKM8t<p*TZVh>WZTBIwI@;TTpD2=eS^C$*hO&G7GMPx z`W*;sTIp%*mJak5_w{rOXWa#yz;ZP{2Je*QahP3@^SRPAIAy!xQpNF?^~;vEp;4W? z3y;hBMIC5N@VH;kb+;P;$AlkMek$&hQ;%|J(RG+Noj|hYzzZWgt{8aSKAOl~A5veo znboNOp$0scv$^e&+Lnf-u{GJ=()@5^eM5b+ytWm8FJGBF(%AM;^NzLzDOzfq+8#}s zHz&1Ck0x6ho9b644d340($LzPG`B2k+_rsdV*_Z7O?6v$)HgOgm^^@dP0ek%3UFIv z8wzb}PNYH>C0;BPwymK>o@HpOeV}n`W80%Emu+rrYmzcIH@76U$@bcow#K?0TWedA z?K@hwH@7yR`g#=G)Y!DS1+_G6!*vnWs1>xN;bHudv_4e3b*oghtab;uZxQ~Iy5{YV zwlqHYP+Rg)^VWJyD9Hm2;H>t6tqr~^G^%cEZR56;Nqz0M+6RTZmZTY_v@DZkp1b6c zhZ=+=_0{74>)J3cNi*u2o7!6NC$73`ZfUcuk2JP6tW0WK8e649Hn%iyTe(cS6FE>i z3PHXmIQ66y>1x+OHX=wO9kv6FR$h|&hT5$t3&Yct8ougf8#W!-cVOAP7bm*A#U#YN zO{{D2ql)}uSzz~>v>xi;gM(V2b?wJ-OxObMJd~hM7I4a4SS#gkhK4!0{~x+NQf3+K zE%Bt8?k`p5ye*79*WSH*dj>mj;}-nM4s0rIW{*s#HlI$8qZQF{xbOua81jf=4!tcg zp1cEAah=`jR_yKy2trR?p&y%^SYBxYxBAA|kUK#R>CdP_GtbgB@LpC|gZ|D+(q#_} z4HmkGr4@@S7}s&i0bN(H{?3BSbJgGb1S&|XtE=%?z+S}8$(3;qNfBp`J9Tu?rv>ui zPppN8_TbJc7$Pu#5t6Z&t+ht;4bP_Dt^$Jck_QKS_T$Hf1NY;dNx5K$7Zk~?&#hAx z2JO;#z|CG|7lqg}c3~ipQ_MH6Y1%T`X|==0!BV;3#H(j;urOF9dyG!8WcRT`$7d5J zO<;LXA{&A3^V9g1U!Pu|EJxv$?qNfDwE^9@DQSPah#fNNr3&N7eG^8MgbBF4p#$*I z(ox?4q^_$44Ab)af6hG`0V6@KeS4wr5J0dGNBV~P+M6_P5OJ4!4{V^h6_-2t2usmD zBo|KXcngKf5M}Z4qHy;;-ixC*y8DY!>%)Q_TeD)SDZ(}m!EGTPik<=g#EP@B+*JlU z1|a3we7U=NU81G?DzWS9R77N_4W^V7mbAjo+cz|HV0}%^!Gi~@hkfqq!r<N->}kRn zDAo)OuDPp5v<rX&yH9*2ZmR*d2&^uxZ-5=*>MA*gwUFxhbF^qI9AU5kMGbv_XcKUS zqE{3~S;8`ce*@G0wvKvP8ijQ0*L$kp-YQMLB|rU^`f?fSa?7tPmwZcp`Ym}Gnl_g( z15!@OO`A*E7Fur75(b(!=T~0JD#}Ds2b{X6&KHX+v<Pk?Dp^^`kd3try{k+ya7_(t z>n!d^U+-Mr{zTpC<q7TrU%N8FANBDc4gQaH?#pKX$DIrY$g*79TG!Z!5>dw5)$LE* zeHZ@wJN&n%{fT?l;b#MW-iiO#;`hz?uMWRU8qn^l$A1stcS(oe??L{x_q0E;x)y)q z=RHV!_r3UeH|QwmZv4C(<*WsL9n!2rp0$z>b*+>CkpE7UwNBFD`#s>}9^_w(pKI~+ zPRWPg??l?WkZvvbxl8Iq`a6Xu<hc{&-6{NouXR!u>RpF#cY)t^$bYB&l=etE<hw`G zN!j4-9`Jk@XzTF%I{6*>?!?bKr3|FIQ+UFEcS(Ct_MMVXc#yRCxmM`l?M^9E==gpY z{$4BfgQvSt|7!V(GS(u^Jt+4s{I?eT+$nvJ|L#G))%dv@`BsCM)u?ARzOP0Zt5N=H z)U_Jru15aVQXbl|8fC0TzBS0V2Km+?-x}mwgM4d{Zw>OTLB2J}w+8jELH%oxe+}}l zLH;$!zh?7tm1)11Oxd+bzPD)b(QUIkf(C#`2*LxfL5BQ(rGu8bte46gki7%?a+73% z3&dxELc<_%chZT*hTrSLuUqQMh9O6;hO}40Rmw=`;!fC%#RCYBm78l^T@_CFSClO` z`29+YRc-+!@T|BFfUhMA|E#R38HO9D0!|xzxGnW%=XWt;t5>x@ad_?K%}?*rgjtsi zT`5^Myv+ud_}#OjlMBMG&_Ku03V(>3L9<U2v+~C`WLMLAse_wp;Q~!688K^95i_*E zZ~y|5?GU#oVLcDKOkmt~Pg1c3zxrbHA}CWi>zR|umy&f$U1_bJft=9DRHa+;YAu_U zw=MBC2oXR26OnG`4o_93>Ez)0_40ZjY+49gYNqF-eku`%t*5m_`AJEt$i!F6CyI^y zs{e$CdspLMveDl@9Q?`I5z{QJAT#dzHK&d!O3<xw8l1UbX<|CqVZT<bSfA7m?seX? z<Qr?{vI-|V?oJbUbvp5XxT67AhiVpY>`AKlG;PF%v=A5kxp(7Aysm6ZWy%w7-6~lj zQ5Xh`uP54Usn7O~eK7Dum|=bAP-j)8dv<H6cXw}J@6e(89{ICSbbhXRSkBg1u0pY> zeBGfwxiF>|myndLO9qP!cZuF*3n=vOb`H-vIn=cflkV!o{@o1&FvMjoj<}Y!xc4vF z_CQB7q-kq&ZGA^;oA{$(=O*98d6fY?tK5zXI>2&OWxoU$AY-*mP#tji4fYi}yT#A2 zDe2$cp;mGS+zPG&tbNzJ0m%+QZsN*&clQpJX+nj(GVR;m&0!(rZox`0Ee3Vj+C(_A zgH)0z>gc?F)`9XajuMfO+>s>9pApOO$av34RYiP)E4c5C!^{X}Taw#v6=6i9{g8+o z#TlN&<Clz0YBop2Y{|_ue(tuR@PB$!-!)m9xvld+NI;`nKkjy78a}Jh?Y>8rHYHvu z(Fo&6N^!VPcBd+2$%mhU2qpj(z4E0fn=l*1y1o~7_@+c&60gw0cKXlXl+Q5JqoD2z znEJ?WCwe64J(LUu8`{ye&j}(=0%5YordUO9)a?~MS)c3%(gs4O_;&B)$9;p?2ilaZ zz3Xo9wK}SU2Pn{p4T&(59e#&$xKE%rv@V-OdJ?;@et{vIB*oAK`6mBdG17Z^nI(bo z>F-ZP$}q<AUH`>Hpfvp%$)A#3y^o<|BAd{QkaVIuFSRI+^dOd4T)p`3v8eyGF8L{C zLK+?`Wj=>F6)d@sRfoDXqkZyXhLI?n#)$w%H|9uwzvGUI-cqVWx#ykPN@aI4EH%fn zEYgr8%u-baLP|37>N-ra$FePH-QZ}$z4A0*S#vLzGonOr^g&;g@^@>OI}xQyq?nY# z#4YIRc1q}SVM$cGCRGk758UO-k)*k0s50e=1*E*qz31CkDC{3T;I^7X)%^aS6MgJQ z*#usy2H?<*k-T-O3M!oJN;Yjusim|?{z(@Fofe=A8eQ$$>+g%eHM7dN>k0b<S}k>& zU)~oR{x>CE!h2p7rLq%ZS3|ubBvMtG{bsMZBJ0xPaz&QOydZu^i$YtZ7D1cRTD0Z! z;fSQkQCA@^PGwz66YTOWP6=Sy`&}S)4|NXg9mX;Gd~mJU3I%O1$U#}Hbmv;g#j0dA z6sfciDjv4<G8C4!mI3s_zW%FdL)v)4un&?I-%`j3Ky^T|GFg{ZcF8BBs45L#MeRLM zMfQ%^(M~XgqG{mExOeUHvH~Tn`DUk^aZhQJrFL1xpgB@eo1pY+IAiitdeB3Xb*0~P z1jF_J>L+UJuu!@Ki-N82C9hp0eev)L`So7;wXL)$8!c%Edb4Wv6Ai0zX+H|sxG`C? zc11O*_Xg_S0N&N`I+c7QIbBPJS<X&^#UWjk#;i7H@KhUr)sZqWc{x)qV=8xL-9xHC zStCl_lQhHJpMgh2v=Ey_;=E6X&Q=-O0H@*eqU}5>K>j(1!EWv0lvesziSbxYWMQg5 zS8_$YSJ8#q^&$xQhVHgEmfYX-8GHYohFD1}g**AT-#>8PRnEGhB@B4AOP(rW4V6uw z?Gax~s@IfMAy%3wO?gW#$b)4H45e_WjD=R-I{Tlng|rd!Go_g+0d!*Nu+|$k@aaAP z|8Ha<!L$2!@a)#EGs7k;#8N}Xb}6+@LPc&xD8mtif2YG{XQtqiGgZcj>b{q^GB{a? zVVr86a3=rU=-VntQkN4!0WV?ALH@jJE=>_xs=0OhhD))xq1?yvI?prdI&nMp`Ec9; z?iz_nk_lP1;wy62Jemn@TO|yqP**?dPY8e{D%U@fO!#zjSnqr+O3DgZ3PO+MaxL6N zT~(PtOIKmhSe@tilN|cbtw)8C-cn`LH1abGZSgnxJ%YvTCk494R;^mN9awnE<oTGp z8o~`I=VqamXK|kDy^#^@7Ae%PskubS^6Q(Er3Oceev#n`rh3Y{FRK?&%DVLW0pW%c zV<(Ykh}|eFueWJUJHy;ZZ7kj8P!8p1MORJ^NK5SGjMJC4vwSJ#ZF|X+53%wkUB}n3 zgJmqymf-;j2C1s7yIm$HA?ARILmY&aIH6jz3&!%=wRf&aHf#{X3o@sl*2<?fYwvZR z?v^h;%Q~Tp(I*ym$vCN$sU>^o^2nA$;m*rh1s-aWyY9Vrg}0KVFEanCwSc><fLfU( zS%8%Ae_RPD2t1;lC9F7jL$doMLB_h#+B~~5eve_1z4oq>LNwu~$bb(V-Q#q$d@JB{ zGQ0mC%XYVBE7jwSM5Nep?a8%Z=CNMX>|BiHQewwR<1>g7mFM~{G$Bfu&uJMhqY}&7 zR#Dk$Q{7k3&*e;W-2!kYR<m}w@G4=A8u8~6L6<r@aCo|-qq?%DrN=)tU93T1OgHu} zYAUN;s_M#W#7~CMKa~}-IN0-#!#Hq`eJK>5+fPgw?HNgoRW^cq&0V)5xNk*p--_VA z6~SFLg1hE+3FG_U9-{4DJzXdgQw|gzfHfev?jHCJTlfAb7<Tp58pr^3fP5Uu9Ktf9 z^T55U9mLDQ8du_Nx^<`1MZ8~+n}Kxyy~pj;9(MD$X0gqAgpQ|@%6To>>V?hb!ff!; zS}MSS@kYsEjbccDP6aNdi(2t5%->Hh%(<~0CbK-QE!o%PxLi48m&X!r2{pnu+_j{* zPBjSiUq%Esc@e}4nxeQVj(bZB9Ocnp`MD^mWIWx9P`tO}eH_bQN=R?0O}_n4Ih(9p z+k*TqrePH4Y$&r2=<Y5i3n5yB1vwW3>q!a(WEb6u0GxeFu-h$%@BG_F?wq_lFmtb8 zPUyvOK1|NXQ2Q9FL~jU+KlwmvSj2aF8@5a^^}Xf3N`%LnyUTrb(Z}oZ>h)pKd6hB_ zI<H0qIhU(WqMGqd>azE{I03k8?UE{VPv!5PK~U7jq_XzXGnMj=S>^AJDB%bRN0o4t zgkwrLM#A@$aDs$qmGC?X$33C$(ijORJfXp=J*fn(_IV{}wWpMzwS3<b8m){UC_&5k zXC-JEKU9L2@uDX*UDCF^<O$7I=#P}3h5m~Yw9uE8pk@4630ljmp0L9T{izbP(ASip zh5k$lTE@>k;n7Q)<(Hn&X@$P71WoaV6131am7tuSR)W?tq68heF;D2SksJ4f9;<dj z30m!2O3-TGR)W@Y#uIw2jCYivW&BDBTE@Fd&@$fhgaI45-*`g73VmM*TIdH#&_X{{ zg7(L6m7ukJ><PnG=s6{5p`R#03;k3HTE=-#IAkMtQ3*`(dsD*idG+``m9X=Y5=;r7 zV+tx^=OrbW5{@$km9X=Y5}xzb)+ryqr&e|ufm&I2iEa5kwX(|y)XKU`$5{)tvdak6 z%DPM6X9{X%ml3Fy^+uppb{m08*kH}4680E@O4wk{rxNxUflAn5jJ@KU-(!TIctV49 z5Y@ED2vpMsV~lFrV+5+{gVsS*)4fLcS6|D6#@H`BVXqOW$PXH0ROG!zpdvr0O89#! z@?IlQksq>ZsmS|`K)r2Lefd50w$}*M+eYhT>TRzPsJD&Ay6LS-A@#P=y3q7irSR9j z`Hj{%YUSS>r_{>Fj6kj2Vy*qim$BanRMV{{$yC!mBT!AZS{ABlpAo30TWxGF_*(ju z@ELWkNelgqIyYbh>Rgi+`Wba@zzEd2CM%RWH(&%RP_y>>XH=kq5vV}TIt-stfeJ== z!L#0c>6BN(&p6K&j6elyG1jR-gGQhNwHWJEpg|*0fm)1pD$t-2s6ee&C>5w^1S(Lg z4)$kMprR3|K&@6S6{u(gDp0FcO9d(#feO@SS*SomMxX+<Sr#hLkP)arJ5*mjqXG>Z zfeN(428s$aYy>LM4jU*c(6AAxKszpR0{)B&G;9Pa&<-0)&V<88;7qtfmGCppgu_Ol z&OKtCOr1Mu1nS(QMxf3eGQwFeV~<|qEcO|d@H;lPRKh2XKqdT+>i%a`!Y7SDCH#){ zI+gHACHy-FyZO><UbO$6gIzEJdu)dh*ki*=_yaYnRtx<DHLBAH)Tl-yP@{T{K#giP z0w=A45jbh>FamXM*a+0Q9hXk1g#3Y8Hyn|ucan-m#~-M9l1fR`JxRrx_Yc%QNu?y} zpQNI}{|9QIq*4-9t`;O3Ab+6Jbw(tPMD3;HmWpH18Ih=ZzkALSQTKi~YLrngN)H;F zv^w`1fy%eV2volPMxgRFtBn7F%2zM~l@BSbVyYj~7>Nq_?;lyol&Amul2Is7j~Rjb z^q`Ff^=YpWs4Y#_$JCYqBT!pvFFkLWs4txni5i3M)PbkUpgWa9o%!8Qj6#d^cW0II z$7g((*IxReSED~3@q|tzn92DfQ*iq0yrcw9e+`y}(_fDfIQ=zP7EXUXM&R_<Xjy1- z_8NgEXQO4I$=PcJn=!R5He)KmW=v(B`dzRxsNXGCE%kfQ2-NQu%R>DgGy?T|hh?FD z4;z8ny~DClw}*{D&2GIk%3h~l7mYxzZZiUPddLV=--lE@|48NCX9Ox7RF}0-;h?xA zP~jSMg8U;DuEz+ba0U{8G?fb^Q@UfSVShBG3nVICvsF)>D;R+)hZI&0=RKq`5@)_g zjlh}jkP`kxxmT_G6UAQj;!hOvOF#1c@F&VRV2|4MC+hnD{g^4JZQt^Leoh_uw{gwz zIhEk^7mY$K__vRkhf47I%a(##@cAo7p&ESts!=HRpZ~%r6!XtVj6ym8e8MOc^v^#I zP5PWeiLyDDf6kFaNlM{Be*T`7#Bu!mL!)pQKmW)m97oi~?)#hr`R8Xt{eRZBfhXT1 zf2NL0DpIty7qz56Q_GQtW&fG&|MN+sP)Gm#l2NFnps?i26p70(t595~P=KOoC>EE0 zq~%=Z7+!wP(vZW;KeaUE@bXWrWO8`<O*Qx~Q@@dhYpBbd87`ky$`>57%O7evUl5%@ zA%|bErI+8=+P@&SeDPyT!>RuAIZH!p8+CE+|AOH0#WAa$rr;MJD2#nUTkwkymGY(b z*pD^Wmz+K>|JEqliWiKct@yQ32(p)7P@cckcKzBY1W}9*d+bZL6uqGog5;M!v0OyS zFHOe3)ZVcE`BHo1x0Z{&arqUa5KAwAWE5IB7(p6KU(&)suPTMh3#8$AeaZC&(kO+X zeEDCELR7wd!6?+!FUO5SP5pAhDAd%;?-+%e`o#~7LQRDnDu>imjJr~(sYs(75^<46 zDFj@k;Y#yMA}-P>g@Ac^%yQ8>`r^1zXdYdD+bGn6FHR}tKiJRzG4`JX=l@_ogYqvP zCH{l`{GTU`!hS}YmzjqB{GZQjn*SmK{MXAyq4fUO5u;EJ|LY~COrGYHIC*+}^7N;^ z@X6Ecqsi01j)?4n$<yx#;s~eu$<r@KM8d)3=^sZ#O7rCDS0W+>dh+zoA|hpa^7QKw zkzzf0`i+Q4$(}s@c0{CbPo91^5XXqclVisxM=!9MV+1=Pj=iEpt$p<M$x-c)F|B>{ zjfkifjlLU*;}o6A@!w32YxZ%X&*b>oK%CHC8vk)b)Lt5YB_e7sjsGknYTL)(4#amj z2~WOreDa+ivqkS{+d({|ZGT7GE-AI`?`Yf4ygqqGnSV#ye&&rp{1s=Q$zQ!R`L1Sv zms8;6yU$JjN-KI-Yk&86MAX`m(z3s&%)j^C<a^5e`xNWR-&~x0pTa-+KIg5;_n(W1 znq7#NU0D($9m13ED@%?TO88I{fB4+w2g?74n)t)x5mEU^$`7^qAL-bA^y=hC^n6Ty zq+KdRTJn=0X_q=;lvu}9=)d6bo#(VYdH(3+g^!fTS$XpO_ah=Fp2_nsMnujlljnaN z5tXa+uSG<Kg7eQzUieTeQh7fA-sJh;D3RDVDZ~$ys6u|>H<K4Q5l@~cCQe>>KM*f) zqLu8H@&d7G^1@4jr3>0o7k(BIiJ_AhUXO^JW+pF;M#M9IJve#c?TAQFp1kmaHFN42 z;_1{gBU8`(%C~6h42|BYGtW+)VTVkep_ombIUW%yIa6m&Mnnq9)R|Kek;c>1nIA+% z4&2n47bD^)p82UW=OW^HC4L%+?@&jk&RmFy?BuC47b7BNY3iM$fq0hLYcGwk;b)n* zGf+5}JfLftsk1C<cc5^Y@xY}wwH&S^b_WW(^npw7X&UPC?m%G=W203~ys5KXOJEBx z(AeqqfdlGlcc5?#>H`PVobEv3kkkhbxZ>yz6xx0Dx^kR4OS`W-P&kV9m)_B~QKq{C zg}8}bAvIQ~&T@r~jiErJeJJU;Fqk?^O_p><<NVtYYT&fe6DY)`hD*OzzBr-u1PTEG zOJy}br_NIOuv!i@BGl&4!<+^81j;YHj6SGF*woqAJ!Nm8P=_B1xo8LN3l!Qx4~3DU z9kee{sJ9QPfi-oOK(H@R#(nJ%g^?oC?F*E*G>t0%*|$Aq-zB3EO&UY5(I)K;6xyVX zVPQCRmR4zROru@8C5$9(uKj^RyL3xvEx~wypwKAW5+s$_ygyI~%v(b)u6_Cfg*c5g zVT=frNEK-3e6MT`r4y$50_9UpV|qZ;>I*V?!Kc|4T6@t``i=52acP@L#K**?{y-rv zZL^kqOkC;@6yj1-$VFTl2o&N{Q^-YJ8VD5PQj@jxW1`YPpb(Rqtfe0llLi8XnACjf zSZFIzsSwkMOOlRDm8p-3Op?xM#3pRE8Gd|Bbi#gHpb?)Wo#MyGL?}sTG-A~DKp{dM z2o&Pe_RxbwrvrgPY-$M<V$)!t5Sv;;FB6*v1BKXxG$w~16Pu7K(1=YfVKj(MgMmV9 zY7HC^n~H%#Y-$Z05SxmDLTtjOV8};w!oFaj5udQF7idH%?Cb>^F$#4C8c_<h1{!gy zEl`M4LxDn^Y75*Fr-lNBIMo(<hA1@@D8#6?Ai2b-p+F%<?YMNBbIZrXsNp~%M(r?^ z{FoRu94N%79ie1m)Nr5>qp*1y<d7JJ{mVcjMqvvx=m=2?yO@DSoO)RIKBqn=PCXtd z#Hoiv&k?5{H_AEU)FY;8=ZI4W1BE#Ch;ez2ICU^kh*OUkhv$e>2LpvT^@xr3IpWm8 zKp{>&5;!DI9SjuW)VD(};?xs?LY(?`sGTVFM4%9(9u2vOP=^AA`1Bp!b)7m#bb2yS zh)v%K91@wH3>4zhcT7Uh5tp6}6ynmpKp`#-1)hmZ2X!}k>Kt+DP@oWnKD!v2LFlLr z3=ujy1BK90d+8+A;T)l(Gf)T}wU>^Dp(k{7#xz2Qq~mgG>Kvg%(ix4=A?d7ELWiU? z8lgkdF;r~o9Kl1<8IACPc81|0fS{#;MhL0BWZQUC=LjN*=n8Ekj7U1;nLr}xj7BJt zbjCBmMA8|Ja3bl9X99|(Ga4a9+Ch)%)H#BRw8LnGm4+~i1eKmZA*3_}E(j<+fkHTG z2pkYjdIE)T(t!Tf>Gm7}r6;0&LP(Kx+CQHVR3x3z2rH6K`{xq^i=;Cep+(YZ|9nDl zk#t5Qyr3^^oIfGJpf>`I5YrfHAjI?r3L&P^dhruNOmCo=DfA}w<r6c6jACYxwZ@Df zqnHU4`t=htfg+ljKv5r>2^7%?HO+A!5^M@Fjc_CBtPcq|lFn#^oaVR>2|9(CMso;( zAtoQ65Q-2R5@<AuB%R3uO(IEWG@3+`&iaZ*k)$&ku}#t$&qOy#XEfrQq<d3Gj0h*` zj7E&x5hz5s;Xon2?Fd{D-G&2&*oH8e&~{=QB4GlJ*e2<$?Zh@oXEb7)q_egY+a#UQ zh;5S2+D>efbVeh#Njhsgu}#t$jo9{R;DpF_C{T!NkA_@CwL^hIOnWqNN<=#pD8#cz z1DC|JLq_?O_=1g4ZbM9cN_YW@`w&x~5?v&fvH2<CMbZT#@x`T7VEdE+<5C)t2qP)~ zM2GCur-T?u8HmIfY&jc`1R0QwN1}|R3hWSQBwZj9Yg|fWhj8Ok8j*-2DFZtM9Z4C8 z#2suO8;^t?kc>y7j-(3g5OyS8AQE?6N@It><5C)th=T2QtC@fTlGRK+kyN1)0*a&y zL?VhyX_XLCTuLJnE3iRsH4`d8vYLq$k}6a}sE~AlNUU%vtrEh8OKC(RhNKKbK+uqs zfk@my=z;M_*Z|3RBx*>izz$(U(gh-M!=*HK2ple@5s4g<GO$DFkd%Q)>_Aw7@kr<Z z$#^7kNUFdN!9&soBJsneG<FCfE~OEPB9bz&Lm-iqfk-StP=)bGFagPUq;({z0y{L2 zBwZlVMsg{Q9hyllr4eZ<Ny@+uO(jWb#Pf<}7mdgBie(p#$McG1NM-Ek*2?Ed7l?{w zl2X|@uUIB2ji?Cqi%_#7)GtEKicm-uDp7<&x<FKfl9X17B9x>wB5?;{BRVeUi8~<a zxSS{MNUBf?aYxbxB5}v1v`UCOE~OD^@kq)r1T=XhWgsdXjRb}ic|ZzvE651Zs-cnc zIf$V|A`e1itkpywkgU~29!V7{A@WGNKqT_GlvXp5$E7qPkw;Pnc8ENZG7uGcCIXL& zJQIOOMINLI>?raeT_7s*NJ?Wzkw;P*QIQ8J13QX5NEwKVJnw~S6nQK%Y6`o3?o=J7 z9W|fMEACjd)D*V=e5#K^D#aX&pqe@#5XZ_2cw;S4w7D3{Qnay%sj2fs8wi_~MXUkI z$|BNWa4Z#Z1|&^|-AB*8SR>EUpw;b3XN?$9@dGI@JrmNVtf4?w43X4F0$EW6c1}!A z*+e0A$|?$EMIEtDj6KC2u}+Mr$b*zI&x$?HItr;3eI#|nv*M4Wj>st+DHM{jk^))n zB$>I5J++i%<~E|*N=O;=tkx3J#$>gZBz44`T1=8UA``p3{Sc}odU*>Xkk!JHncUb@ zP?MS5h-zgaWz3wS9n!{RwX`I4#GJyQq>jj3!FhWkRH^tVd>jqr2q6P8!pJ~Op=2PZ za59inNEyf}tPJE7S_X0oF9SJ3%s`AVGZ0g#8OSNz4CEAY2675J1387Bft<q6Kn@71 zZlntVK^c2CbwLpnI2*DmhQ1d_ilG4CKvc+l&u|;jA4IEo$Q3kSG>_H=1<e<2Z{&iS zXfGNZUQh$gLVBkzsCo8cU_<RNMhZ_|q;2(Y<HpxT#YW5lmhqw@<41v{sECOn5EcAB z3gs#AffUjy>{*2C)I|k73pt*;sF3%HwezCF-75zB7ZvJW3B?oUrY?lZ=OQsqXgXtD zB*1|d_*HcK*oNSuV%x_y1Q!+ABxqUZq>GAcLbN&*r#=o<C`KV&ASyz=8tPSidNtIm z==5r+RguZ!u%|8(ex@#72+4>&LNne7JfH<W6m^~rd?@BT8~9Mfk)Ua7zv4|4Nj-H@ z(dLNRP!|<xj+hN~QBmgEz=$FYN()5Amyy7oqRU9&PO)Vq@TRz8k?2zw6;oahY!FWn zD{qY=mW1&6sf)ysf1r(Vk<cLKNsvK8!=FzE5}`qCmOvylAf0+pE)p7q6w)a){35WX z&|vZQQx_E)CPFHO28+0#x~R}F5sIfh^=}{eMqPP^*3^|}$kvr-2o_hKp~vjX_c&^w zPcYN>*zsHRZ}vKl5Rvj61^CKyFI+mSG)nN5=UxglcKem*{>5m=sn%DHhrGwB)>n>4 z>8RFMj)(G25U#GAIA-OYAmm&*aU#%&CRa|J3N(uFl@o6U8k>IQ#E8*OY6qS8G|;r( zlcC;|gv2W+pAG4hmy>~)lT^j~LMp1=m6NXr8fEs%$sYt7dv8OaP-Zs<3a7m*Cr<|& z=e;W@qgGLBubli%NXJ#dm6PuW8U^&q$=?PVCG^V4kBs)b3f9SUfu=oo@{>T*o_qdi zpwZ^O@_gvc=Q)>LdH%VOPJ8qD<AFwXzw-PWfu?=;{CJ?L<UKzTXzaZ!&%bT7QyiTu zC⩔B2r#Cc|N4mF?;^SKqFFKc|J(!DeBIZ=R-fAqW)ZYKJ@b`YsUwnJZr~?M*BW- z@#-^-ExGc2)^PP1y2h`(P4o52+dtQQSC3Ewt{ypc_2{c!MXw&Anq58egNVqf^6HTv zMnukxSC70H5oy|AJ@TW7$eHo#k(VPPr@^a7UWteVjjKmqjfmv^>XFwXB4@d)M}8g= zIZ{`T{30T9Sgsy<JtA^ux_abvMC3$t^~h*M)ZRTZ9ucWhSC70K5vfy-_*3mq&JI_P z{3c3CO>;y`$@$^xkq@JkoFN?1Qc~Hj9yuGO<b>demXi2?^~fhtO3na|s40)yz&#gI z9@S1h8g=qfisjX#Z$~MqOIMG+6A`tSjz+z7lym6Sqwhs2wL^}+9}%@fjz%4Fl;Csq z=togXZTr!WBcitbXw>$jG>oqvJs(mYBT!vEdNCp%^=A9kV@Dz)Vd?6z??ptS{MBPo z*Bv7;T|IUpN~wBuEYhQ6G&-*eQHSFgEzGOOUW&5o7zxo*s&XBRl<OD`&#OYTl(aIh z9{WjDrfQrJEv0JQu}I^N(bl{wL`!J{7pcrK720FbxF6GjJNE0Sc9rB~kuV(7(L5HZ z%rPCfV`1Q~pXR{L;ShqmLhAZy&Mz~s(Y(2Sn&UY42`!WBr@6+Nd*5<#2AaX{Gt1#X ze|478^Vd&v#WVfG5lzE!zjongO5qF@Q78t}BUbYBUaqbkHwu?J(?8}3*z2c>%+n*r zAuXbr<G<Cq2-LH$(k8opn%2<l1-dw{pQgOc{p6zNqOi^V>p7(m#^>Iom3I9!W$)Ti zo_x4|nu0eoP80F^Y5HnrKHyyl*H2RpXOD3zxqg~LIQzqY)w+oJb1$4%3T5)zvu`Pd z0(otWvF6uL(`x+coYhYGoc;mh`>&s-aL%0JGXDB$V%O{m<B*G>xt}n?_4;Yf7uU`j zhn&}^KYT&?;q)<c@olAWPM>?_2TGycI5)z0y6dMozs#KC41E1G?Z~;~Kha#AZsvZ; zLnGHubI~&$WR<he%+GjU<@#yP?K2-*kI{CRJ;lR6*H06ouO0hmt&4WUR~P8{xPF?5 zJ^dU{r(8cx+h_We^#%ca=1116oa1KRrZ4~cY2x|p3F|RVd9$yLY3)RbIjk(GU$iUd zeq#I(?dM)KZ6b`!ee|y8B8FW1nQ0{f<k~xyhUjtaBa?8hi)P>8RTS58WX`!{W=Bjf zI492j_Lo{00cY-qHi8$ax!>2`7$N>#`&i2vA^yz0&9h9`M~FYuZ|W$I5PzmWwQ`6* zv+rr`BgCJ%BRtV`eT4Wkd-4r(I70lHeN&MQaN*iDr-!Dlj}U*Zy{4l)Lj0M2Q{`|( z@#j4&nfNm^uA@An_=Dq8egsE|KQo^yN{lG}e4t}7Lj0LMYqb-9uD!}5n%75&KhvjP z(vpckb4M)=@n`zD%Ek!sXZpB~>4@UbxTR72`K|S#;?EBiTSgRrUR5L+A^yz$ijINn zBgCJXQ`S=APr$<w;?LaMRu}Q-tF!dMT^}L-OuwsoF+%*AdB)mK{F(h{oeM^YKeI3M z9LV(%;?MN=6%znEUY_6lMEj8V^VJ2DOybY<1)VQOh(BMQRU8{3{>;2@y{h>0vd#`8 z#Gly@Oj?LP(?6uU;Q9#hXZm$Tk`dz1?9UVdMu<OiFRFfx5P#<0Qe+!Z{P~sY@(A%~ z?t=9O@n_~YI#-Sme`ZeESSbFS(z$zt_%rj*rg6ld*_SO1@#m{^JWFzYg!nW4to0%B zXZpCcg7`D@hP71j=Y1P@;?LYk(-h**+}kDz#Gh-&P3nk0)2CEcM~OevFY3%VO8l8d zCwM&_Rs8wnj8cd{Gq0$fFsk;?MeVUs;?FFm8<s=-x%Ok7JxA64nXoi!|D03F998`J zL}#K=#h>SOULGa>%)F*^!KmWTJBk~l#GkqIDs`j8pXra)(i<iI%si(v(J1j}=7j3< zDDh|JCB?B(;?K;d4Ewr1O8l99R>yRd_%r*GQHVdYV~V|_ia#G2Kg6H8BRa~Xia(!@ zYOfN1=6<9yHmdf|GsX|`=h_dfF13G7SU(egrk}T5#GmPx)Ycj${>&azO&KNr%)M#y zL;MLkI7<AP{>0j@_;b<ZkoYt61I3?FwSRtP?IQln{@P@W_%mx(+$izqt54L98YTWr zzosZUO8f~ZI;!~dTSbXc;?K-8Iv0#8{`|9A4x_}M*%v2tEQmj|7fd#YKXXS+GKoLe zPS_|Df3CfzmiZ|0=i1M$pNT)$eyMZrDDmg33p&S*D*k{mY8>(B+H+Qy+CM*4G#(}X z%p7}Na}j^OI%hl+f2NOFyNEy2?^<2NpXp!ge1Y@!Zcdr`vD)*a#Gf$hjS+ul;hgn6 zj}d=nUsZ`3BmT_&=u=HY{JD0-D8!#@7jz~XBmT_%RQqsD@#iPX^BD1G`gxViG2+k6 z&s7e`h(9yGP&|af`gVP&_^h`K%$!qc(JKaKU$ByiKeI1uZ;TOtW?$EJ!I;@Uia%q- zpKCS`juC&RpH&ncQ~Wt$?IQkMdsRnyOzod%tS+^GJ}`cWKQkXG8sl;VZw-EG6yndc zN!=LnXXaV8MaPIgGrv@986*A#n`DgmbM2=pV|vxX^a<6bF~y%3bp9Gs`{zBKVaL?| z`H9+@W5l1CpPNJxe`ekoSNS3S%)D>qsQvST@k9KXeMRSsF~y(riX>yipSd@UL*mce zo2pG?#Gh+sXO0nnuDxa@EB<_6b!SZR=bR$a81ZNNg`aCH6n~DJv?%_(q$n|_`16XD zqxkbv#rZMCpZ9FM6o1a?ierrUGxM*OM(v-E6o1BuKXb>epNT)SZ(ADT&+Hksn#PDf zv%gWhWsLYUdrIfrF|~ix$$WiG?Voq7rNp1FaE5|NLj0NgzT)bb+CL|>H^$ZeIic3_ zxY|GGMp+JA7GB>^sf>*ie`fW*iR<IUpXpzzMKrGX^MP8h<HVntpDG%U6MyDDRkRr= z{>;6u_Vc*fKd&mXjT3+7VD|Wyj??~`{=_(>{WJZn_Qp8zXZjVR5L>2SS5zNYBze_1 zRFpVwtxzikTLi3~C^7q*S{LI)iCMi_=K45MVs^yJAxg}Ss1A-RO27<b$%+y`*R}9C zt(4i{s0}bql$gDsR?4{ABtKD!8YcqGy{&jSPVK(-j8UlF*N#~^s;6(N^)*gCz4oTg zJLA;TYjC`fXX@#--&!A1Pp=)bwo^~9{q!TvMLqrMf@1hM^>q4}+Wh0x)9GhT5~!!s z<|7)Xo=%@q`)8bbI{gFn7V51u(?3=u8K<63n=fUYdOH28wTpT>{kq8y^>o^BbzJR) z_pElc6W+6SQBP;EU%(zyJK<TYOYMZ`6vHQ|r!&XZ`kJ7g&b+MBGNF2Eh&@3)o%yM@ zeS&&A^M>l_gzD*sIu;YEr)O0!Ca9+~pDJQcP)}!{)pku#PiIf)3_C$RoqfS_QBP;z zFn*|~v!_*_C)7@W<Hh&SgxU$_%bid=0qzl|p)SwDi9rhOgjqNiNTGJmVktxl?Sxq@ zg-D^DFpCZ+g$OYFmRdU#iU99g8bttGxlAYm-~tbpqX>Y*{G=!X=>0O+Cx`%Z&)Db? z0p^aYwKG8km^-Pn@B|ScqR>v5dr@br3B?3Bv{^gtggGp`NKuqHV;s^>m^)*2(N36q zUy*i#NHX`q2`z_6GIv4eoeA0r0c|E|CtQ0?XW<F86MmsK02ak=-nsTmogF5KKQl*k z-84b``TtIzGC?E&&7IJxaYDi6tWIeY3NFuCK?W|WgcAgpuk@;(>k|qt&)V=PxIAZ~ zKqFxKluoD<3NEK~(w$InF#wuSaC!M<?L-9^TRcoCxCHf9aIpz&g5Wa!#`{_h!DV_x z&C>}r0!9>o-cloALKPLV?z(>ZjP}M`1efVgbW(YX;4=M*8qja45pZ5j*tZBS(-%~H z-%@Znrla$gg3Gh2gl`dCX1=E)^%lWp#sKjxg3HXazhq0_BDe&Ie2d`n|MT_k&sAMl zzVGk-SI~7IQr~lL+7iyIPxtBTByQWC#Lh|Vq?3DY-6FP=xczKDk~p_+mENEiAi&sw z!GOd|2!tdgAt8yXU=rhCz@2J9CaGxct*r;Yu>XWR_MV^b7;EiQb*kbD^SkGoYd*&K zjIkbbY0WP+M}f=QF3rX$a9P`}OP5jLvNq%+1ukpv$yG*y%bF(&qe>n8F~cZuS^Myi zdI((BJe-dLm$h?puu<T$<~Qs{fy<g-ZjAz$HQOSYTz3?>tl3sm6yOrb9#wkLrZ7AT zTms^wN-vHm=#DDA*db3D1upA-N()AT%etpTqrhc-NVkbcfy??nU0{p?m-T&e?@{2g z{(+D^3S8DdP$E7GTq4;T1upA{d^Ui~x<A4k1upA{m7>`l(z=DOAC~8i0+;n+rJkd} zWqs5~0bAA`{iC`Fneb8QB4pb81Ao>%JXnM2><bEeqwputKMH>~2Hg(f&&DpFdHAz& z*zE`YY}j)YECK#(ob;K8KY{*H__Hx8_>RJ#NEt`r&xT*jjKZG{4;Z8HCvM`8!k>+^ zP5}55LFFv`**LG&ISYRxsGNmA8w*NU&%&S0cBMpT;m>A|h;$bIZ1yS?orOP}2b98| zg+CFB&cdHf_tUfRXY(Vi=~?)*>EX(zg>WSwJPUs!fSrXun`2tjv+yS#c%Owo)#Jx} zIslMK;?`LRR2|->kYP8z>m4Ycm;2Zw#=5fFCfJ?@L91;tn6n_LdZJgUiamL&A67jv zrEK9W5UQT?ORTd{Xw!C+B}+RCg*KN&@-cXF_rM)p4UB=0yOVd6aE{@NchB6F(T?Ga zCUwyI7~XjI%$<d(heOsyuZd6I-5saEDNU07jNz3g$rQ$L%ezA%;g@&!goI<>-5U~~ zd3Rq(xaQsWLc%xi?hgr9y!$~&_@d33_X}sddoU!t@$R9JaL2nJhJ^RsJ>rr+ns@hT zNO;@bV<F*OcZWm5yY7yJgfrbe84})f_f$x@)7{e{;ZL<?V|mZvP<KZ|!lP^oWv%*r zr>&4kbq=4hnQ#fGvaTXkhwO!$WYj|)2dqRcX8$4x+P@AJbS%)c6M4N0<EjpIP1t|L zN&6QTX8)SZ>w^rUIyAVwIy3<9tppsBK1iZo9ooaf+P~)PKkw%rRu}z3nl>x3#ORCC z_hU2Fq5YTaKO%<x%iG^??T0>sC02(<rtLqqf4G|jpnACbefy7_74|Ru*#7lFK_?lI zZvRhaZvP@J$o-~%9quMU$o&?5AXUiyMnpD+q#^ek@t}IRM`JzQGiSeh-+MHdhkND= zI^oNXtk<{Syzf1lXO1cSMo7yY=i}N=aI@d)=d$DU+xSs_TfL-Z8$XIKu3myu)$yZ* zzExd0nuL2+k9Lu=n}&a`E|L+OMELW&DkkBwtF{fMPHmHL*@|9YHwl-mw9Ed+kK(cw z-Gj7RxUAozF$rt0bnf!zG4%2t@=mLT%T|wm5bfi$es{;J5eX~ZT&b8uB&^u7tNTR4 zN;mPuY7q&mNB4c`)rf`VJ+Q>85ezHc^5XHMM8irC_Xw<(qT$i^2<)a24l6zK+i`m^ zRp(2kCwfLaT)j+2X$L}~N)OMHO**6l$*@fllg@1a$oo$yt!$5KxMpPs5!jBzE6aQ1 zKpe8NBUT(gtn`u++JU%VrB~iFeiW~(^v1;EY~_6<9d;lox?k{`M2_ya<xC<;_xo}t zk)>C3U2GC*dS!qMY?H_hDg)6~$n0-#SS@mc${;z6Nn{3o-_In_T^T&+vkJ8<gIq9M zE%JiOU^pdtL1j?kWc(<3L0%#+$V=n})uVQ!RQ5_@u--1djUOd3sO%!+vtE$3S9Zlh ziqJ>Tanr=Akt|epao5cxz+cfTIwrxvik|M61Oh8LuY`V;-GLsUR~h0;+zy0wl_72o zRLAX(Xfpjh4x?jWtg@HH+iHQa%D&y2ieq4`@*a1StQHijyys&)2E{7-Nq(&s6w6DZ zm~NO@Em3U0PtGw>Y`?F!W!b6s?~^~;fuh)lT=1I&#rzhrNl>h!OMa6Cu>;)TG)WNC ztpbw-F+FrKNe~-Wz!^UV#3~<=O<OG(R{4l*+9WZ|n2LcN6T^-;ua3d6ikYoy31LSS zO2>~0VaMHAkAbl2vAvEpyW5l|Y&aSd!-gFd$6#2+Ui;N4g|HF#KYOg3+8PPd0bvz; zZ%YS)u<EgcVRXtRjvX5HdV-ieKGdOtm_1#Q1jH(*9s9=wu~S?q*~AKBXHNQoK&*Ty z772)z50S^(fr8kW`^+&xOrN2*T7p<k0%Fx;_7q-y6~)FK@yA55@#w24ruX8keNk*Y z3>}J9kB!BV!q~Wz?U*ojAr=mdRTjffp;+ZYtP&I}AK@y_dLfGGwM>(sSVd1nOcKQG zqxTxOAT}9htz_=lY?z`bHXYNW9PZd`ESxYl9SbLnO*<Qo3uDv1mi7i(GSAs#>e+E& zY}N;U9E_EZdS-WA7@PGVVozLBTbJC1j|*dw{~Z^`=D3Gi9X}4n%E#i2V61w)#|M5K zj+Ku^_r<Y!4>k4%Z|cRo+r@ElY~ERYTpZJD)Yc0)Rvq2B$LB&IyR6HaaeJ~;Z@+qc zz`1f<=~!L^Wg9!(SdI&2ddg%c70PlFC@T+d_ili)>TsV&uH&$*dUCtN<~T5`=oL6S zfmpT}W&q2|!ybW-i)DJR$qp3DuDF377t5}AQg~b}yW&abaagw25d#Nh<q^+@k3+KZ zh$pbeA(=lov`#>>>hVLKAs+{2Yn?Gaplq$%xpEwot#uFhEP}E%-G{gKL0P^QC|m1} zzJfBpId2Dovb7!$5yv6fTI9#aA=z3__zfgm)AM#~3zGSLeUl)W@8vKFkge$@dXoUz zn)WZ41jyEU5BsnI*;-%ND<E6zk68s|YlEJ=99KGad@SY=lC2Gd+e5N7?JclgK(e*L zAORp-+Zp~0$kui_?vBH;>hbaDEFfFcQ`YMEFd$po<!SUVAY0q%Sg|)2>z-OZ?NA&B zWNUh(&)NcHYeVkh!+>mUk5A$-AX^*q_;2o+nzu)EKz$gH`6Fv<9+0iQ7q#G6b-2y5 z;bB0w_P+b1-KDR$zjnxdei)Fg9q_AwVL(<MJK((lWd2axdI87E5weHjSoy5a{;(3V z9tYsC60#n@9vX&XYae<r8-`+Q2i=*6q1Z;pIqw$~Tiq311!BH;#kvZ^{Hc;jFl_BZ z4^qQ0Z0)dLa}UF?wZk66hhdoALw2hh24dxNF^52G?IU;jVL|LjSQrpnv%FR74aEFq z1M4dgs}2vvz@gZhMI9X}h-qVw9Vv*}Rw~s}KBgPqR!b1GO(Uu$h@A}E5yb3OG}RKs zM%^cem5&YURWWN{6g%tbq-E^M&@XsaWiQMm+Z>A(fnwERL$A&$jGc=ifwA&L%!M#^ z&RIGvjGgz3!(m}e&ke1w!q|Dg@VE55-m&ViJqcAW#Ia)+{d!>-j#Y=x#+nOcxvnWC z8=mx>!(I(aW1sYla#$prijzXJwTYMwf$XARbZK|un*J(Lb=<cn>U9;90GU4^HAx_w zcHE5!WYf-z5rJ&Rtyp^$tHXM2%^HJbYZotS&PGHs`x_Tb<A_K$=QtfvMt0G2tr3At z4{EJ>fy_QQthNAIby(Xetr{d-oAp#e+ZERq<CKuBI=twfKcbXuSkGmwHCVQG#glw( zT3pwoA*%(;*7eBPBv`iI<_@5Ji{+VEI9Rsc?g$@&W$W!88b@H+db>vryE3d>&w6lC zn-}e7-U*)|V79I|F|1>P*+{SZx$j`?aqx}+v+BrB&-k>7aeasT{s=T%*JE!x0W@3h z^%P)4G#mNAGpiA3wr(G9&~iev^*)ah+RIoS`Ot6YjexW2h~1dfq3~>d(EU(<xo&-@ zyQ_9ImghZ+j=;0^oiS<ftUMnc0M7CfI9neIa|CDWLotou%pdUE{6MqyJ>gBzY<+K- z0W>Qwg#AFX^?e>{N1$1C<bq$5jDWNCeV&Po2xlXDdDglC&V09*Nut^D9_OW{+R4y9 zh}9I$MwT4g+UHmuS&B&mXVnw!UA|86tZd(l(bB=QRee;VI<DQ0{$hejBxcnUoel|$ zU5U~sIvx4i@>o65<>`UF(nGzjI2NX@f9U@2`yM~^(VqZm>p2Oe`709EH<0EJi%kM) z>v3;Mn;%!T#lvcWwABtLg0??aPw4$^s|M26?Y0?{<~ty@)6{B#G=DF{B#5@!>8`F# zkku0(_+|eIvNL}v(2j&?)e{E~`Z+;b^~52!T;B_+cX91dG3}ItLw^Nw)gJz70AiY6 zAhZL;G<zXZwaCxb?M+5WAgy}hgqx7|L{?AOOD?KMf>zLg+WJ`!1lkz6y2BHp6ELlM z;(UxiP#gC+pv{r%<DLO(cjW4h=mt!yo|tsboghV9pYjyYcS!af^#KTJQ%>6xq-g6? zv7V%8>ldSWkXAjRE!Z}<Fl~K0j)ZBe1Ac*hLQI==rfI9>`lXm3F>Nl)0H&=Dc<4U? z)2b&UT4=vy^`w2TNb3aERtLjhMYWUtp^0ktc~2cFs-5(w#pBvHxxVBf<OEb(w+~tA zNTB8~5!nO@YA5%G!IPp@PwtCZ18N)Xu~0CrdUAiP6j0lUhZovHSsfm9zGxHWs$Nd1 zj%yd?hJC(-?w%w|+vw_a38by=_TZ+Clp9^neS4Fs4!+8$2TyIKte(`XYj#SIW?IyP zY1QGKejTI@m8N-s)0WEI{VDCK+^`R1X#^x{8%s`G?W$ZIawpTa%8kAuKM<&G^u;)V z+D4yWR%>TvrO)}Ut(6;byFz;_H*&Q=+D4xzTiRW@(eHdb3DK%2^+!)_&PdZXw9(fj zkhU=p9Rq0_gKj`4LE6Snzpy(A(l!R77FpWH&gd9G+t}rB(LPImf7v?073aoaEE_!A zh^J=SYPqq?Z^_tIU)@$VcE#F~qE$~ucA@Q-)st~U_#`~5p44ApwSJJKt?rBE1!x<4 z{icjIU2g1+g#&0C`#dIU+hz4sZUg{r<2_G?wDYoha>3I(?Y&%mFV=)CZS_6RUQR-^ z>Ph=br%V>4RZn#~rBA}N)%Rjh<Y^lRJU==K(fs=oHX9Ia<3Ow(K-<t)Rjd|3+c@Y~ zV<*YdHncm@YQeLO4?P<=DV}MknAL)3{>Gz8;B4bV$J9yD>~IVSnr$5MNT=<XtMB^_ zTkXf(_{b+w8!|WS)ePoPJ2F?__iM3JV%ah0=P6jWam>wMn=-4XV#2g7b7MGqL3*}f zcVl!)Sho6sqf9$9H-<d`XlrKK-XhY0Tya)U+3i+o<Y(1W7P6&*veko*S#8i<J>*eM zJ2W@!onIX&l<5u6>bUl3`U{;ValyGU;Q{Ov=~?yEq%WNIX>LsV!krS!regm0<J0<f zj<pZVHsZd3J<Ch!@u>w*&$L^!demN*(EtQ9?c}r81hW~>#k6B{WA=g{2+XQSbL%9U zUG{4@?b`HLSFL?$Rz3Z`JE1min&t#OMS8ZW%|do4JlpJamp%p0HoH8&oKkvr`omat zaJJdymtNYyxw*ryZcah7&HgY)(zDI}4}9p*Y_m5ei1ci8S2zVQ+uR+CPIgv3Jsws| zdbYX0-`f|=PR5bIY;(WgEwB$9r4>G%TXnI_wySD^VcF&(&oi{2vohn^$SGL1`C+&# zEUTW0`wXX)ot@d?3DqfRwt6Ne8=9@2@e5e(>)iY(d`H>YncaSEpsk&&_DZ-00M4ps z_IU6(1<y9^l`B;vIm=1f-??e8)=*0uJgaB+d)KtZb92}qF=~(J>X?TxZSvf-TM%lD z%gs%Ti;_srHjR>!;Mt~iT9SA+?zGoV&*~X_HCNTR-t-rytK-`2xjE71wcy$2lxG#% z?zuV@?Q^-gI_3U#dRH=_&FSbqIIE88(@%CvQnS@5cN1+Dt&Vp2)q;KNCz<2ujyS0< zI7cJ-I}On`=bh50A=>J+FYsxIwt3n8N&8AS<9Vw#mTuZ#9nze^vrT<h$OZt<HW#9K zlCw?iy|r56+2{wgsr{S({8xYfk8k|qjlcS<H(z}Foi|_GvhB?`x4pZi`LDKYX|hk| z)`r@;^^y8X?K8=RV!DChzoyve#S|C4m`uov$$Y$+Ovj7KY`mDVc`qhw@nQ;nUQAZv z#T4+on5@H#$uhi{tip@QAiS7@n-`NEcrlrP7t`vuZf#9dmsY;Dm6=Sd?!^?tyqHpP zFQ%3DrqU|6wtOYEoL1N?r`7dh3RGT9w-CIT0+bh1s@?hseNJJ?izy^|<rI#*m_m^k zQxx)I%BQ`l6n(syB9B*2QOAoZ;&?Gd8!x6v<HZzYyqE%v7gKQYVhSu?OfkiaDV}&S z<;5*&(o+<nkm3i06gViPh(RI63U4oEy<SW)!iy=}^<oMQZd@rUcrir;6+bI_?Po== zwU27&o%pk&*M3&?TKgJyz4D{UY(Fb{?Pqu`M*SIHt0G>jV$o|qD|+o`MX&t~uhp@5 zt%^lA{jBJwpB3HoGu%|i;-)I%rYaWQ^fTNP{(Xj<;?tiM-SjiuR88TgIu<wGy0vaV zpW&ukA5BHvR7KoWm2p%3ikqs4o2oKys`KKeD&nRp;-)I%rYhp5D&nRp;-)I%rYhp5 zD&nRp;-)I%rWF6ZXp{e5w8?)jMv{Lo+T_0%Bgq|XgGIShw2eDOgx@J5{EiTwjQ>v2 zHtrN{<Bn{D%Gd@Yx+B|2WW9rJs8_NLj+Jdtlx<LyZBUeLP?T*@#5Q!IBEs(!5q_tL z@H<6>-@!K2RM9r>6m8>95#e`=wsEIu8+U|oCPxVWTHQ776m8>9LU;?~O9XF8guRmh z-a<Qx-z~}EY-d`HWG%_x?!fOar&9p%6i{t9S-s|0({CW0&LoDnd_Db^5Uvsgr)L11 zp22T=CSKQDv0ZM7v8e=}Q_t=eP5&;Y&l=oKw%(HZcCSdqdqpbVD_Z`&qUGN!TK>JF z<=?~dG3I+k%fFW_Uq2?p-<rmKFWEi7T!#5+W|u*J>isgrPcyrmfKQvtDNCcx<up#U znT84cmeVL9<8pD3%f&%17tz05bnoTjAeW2oy<BwfW!zi+Euw!J_h!|Wi|)N#bnj){ zTa}Z!Z%yWKzqk<hi+#Lb?Bo4nAMY3Yc)!@k`$YuZFGA*i5i<9Skh!k_lq~;#5i<9S z0qA})#N01p<bIJG_lw-PU*yJpaU-4gPgp|o;y<N{Q%>}!1PbL-e@dkAUlS_4m{{SJ z6D<7KL<=t_TzKWg3oj;Mcrg*fj|CYl_Mc#eia-Oa`V&c?eicO0=>J?y`u+@5IQGv_ zg=7C*46uKOGWxX`VE;^j)vv_>`{!cP_h*tmowu0u{iV2`e<`l#Uy3=xUy3=xUy5<y zFU9r!3+u~y|HAsx=f4!!_b;Mxnz|MCerZ)!*!LCXqGPQbEqc}pd%L23(V13`7CnCD zXwl_Y*v=Kl7u{{;XwlzR*u@p~@i+#*!e*`by_n^#uuUs|F9z=wc4Niw#bsMzA6EQc zT(}jslgQ{-*h&&**u(0q@P4KL&dZhFK5te=xro6PyQN-_pc=n@vAI}oSTA0sjP{Bw zT;V0k_`PBMczZH_FVb>__a@`_hV|q1$QW-Ckt@R_Vm_W?CblwMWatX7L&o`7PoLjn zroJ-Vu%5gE8OImFy287U(O+EA+s7AETwfW+7gJzgvHe5!)ku+jWw_{zE4<|xCoj@= zh4&ld<nY!f2jF_SNZb{BY*IhHcNXS)eW2^*B6U}W!LI*a<n9XZ4l#CKfMKk>!Qx}% z^%Wlrudc-J#SCSIXI`{@YOp>M+UCx%AA35DgSvcQi@JQmgWvc(1;5!t;oAK08{6#p zZM<;CiDD_GPhU$3^~yx@$*-rpZ^hme&9!Q8gw{&5dNHklN~tEL=|auf6h8RP_Da`U zX?Y}N^egtk@M1ZwG_~haU}|}Uk<F#Z6y?-*l>2Fo`u6%<y>+tdm3hwQ<-*x6bGFu$ z;jh?7fa^zlnX`GBv#GoQvSg(TAj`{mg_nz2$I1d$&rQLV#pHu6t;`00?zTl%%pbOG zA&Xw&&(6m0X^o<sRw>HKOT5gVnvF6Eht9WD%s5t-Qp!Q^>`kBAY`HBj6?2RgdwsS3 zJEPCq(&*DlW%ed(?bp;+)|OwFtRvZzJT4n7qC6WchT_a#Zprr~`!IPVZGV^&LrNc| ziw%_;T4q;GYiq(_#_Nf#ta!$&i5hb@0+%#K9t`;JJQeVf@U1t_ex^vx%$`RT#=+;w zyfr>f7G>;*^~%mbO)nRznVm`Y5XVDB^?tONo@IOr$?NkWq$n4oLN-bYuJhX~Km`jJ zWqf|VqCaG#L<Rqy@p+l?dAVVH5HtEmRPg!@<K^Q<zB*&6|5)g`ytQZNis3gqM;ffQ z&z&o--ML~SoY|l7D6H+dhPggh%!M=CQBbVkFxTf(dVnR_TZ6UQl*Uu)!8pcKOZqLf zL+L`nC+(9$g>y~~HI$R@`20>KKTFXgvlnsdM{7px1GL5R`witHJ+r9;4Zj~uWm(hI zp@#B@4fXM5KR=Z4GL-OgF=5Z9(iO2rlhSjQQnIH~O7&Dqv#nA}^HfS#$|_+a-h&2z zu}7H2`ET&=+2ZA5He0-2%w~%hjM;3F-`Q-kXkWkC;x%J7TO@jBuVfbbGs|V8R%ABC z%V;mfOZO*xX`^^NH;?>yIM1D*Y&P9MYUO@kHk)oCMSIvMkGiti2K$_Cu+Q1O4d+kx z8vVs$y+2s2m$6tcW3gVwV!hm8v9k>pJB!77{f6i>+Yr}g8{*n*gT>m;=i>Y(3y$#> zFEKOQoL#J6ykyC2S9bCD;w4Kqo2)t7=aR+8lb960H!yRyc<UgWZD8hX12gSUBNhA8 zz|7eOX3jP+bGCt*_Km+{dkyh-R`ECGgW0U&6WPG5;*-h^@oBap9?dG=rrbBP4d?aq z%l~JKS1H+SF+P<#i##sz$MiJ6C3{P-)?T7ZsWVx-N<~{Qbrx;C)LFFk5`R=L+D^8v z){>>Gl<ZukqLr6Ai&kE;Ki-g^^-^b^o~6z_JxlgM>0(_hju|U;7A>ySnJi8{N%p2v zF+!I*i}WpZVr|}b@dCNjS+us&RM8qsQ;okDt+6znRx?G~QiJc78hp28pDZYhe75Mj zr3T+E%@%#P)Zn|N*@l^H@ZHjE!%W&ARw$mo=)0u`-z_!xZmGd{OAWqTvRCtp?KjL; zgYT9ae7Dr#yQSHp@0Q$m)9t~Md>1yA<hx!j#@3SkLA7H4ioRTOUsn70vbR_C<&u1v z-^*>xFIS>v`(qdN^Kqq7ZW9|5d&+IHR+VL~>C(O2CTpc^pZ=<~m&jE66P8hWaG+?p z5A1U{`LRB*KMz(ci-T#b4-UXV#`3`abVsp%aV{SmD9+`B1I4*~VBhyF9$%cx2M3FB z@WH`i9DH!7XiE<c6>aGOA5u%6_kbIpl-M+{QZb@Fus@Aa=$XB9S1cF3^1*O1qCRN2 z3HX4W(W2^uhMRy78g2qU7%qC{gW;lAK4`cJ_@Ln?-~;wR$N7p8^#Qw|<M)P{)LlTW zG+Pywfj!`FFGg8biluOGjM?RH1*Pkd2fV+{Zw=R)4;rp5AMlA?@2RdWq4k5&2AkBi zqk7KAZR2=itA6J*w*LFsWb^cHJdG=r9*$v;=^@p_OGTr3c&TVK4=)vs=HaEH(LB6V zG@6H(iYR|*pF+<Y-NQ?uoS{FokJQwE_cBJ~WsJtlLQPtvhnI?h@!_T7B0juSG@6ID zkviX>>hA5uJf^yvKO!!(sO}yt62ye!a+y$MhzUiAm{6ohbvN&g##wkpRBLE88XG;G z8ci92{Z5n2j0yP|UEO`QxDqC?6n?<P;@VYrUu-<&VsZ7XMlljsch46?s|jL%TA=Fg z#h$_no3Oo6C|-(LjoyYuTI_2S`WxFAXsj{VSYv0Su&YtnT@;3Fr)kYtlIK*1+6xmr z)RERhzuKo>Yn2lq?8~gh>su4rQ|mab2_20>{&t4_o+6vt?@qs}eZKdpU$>_j(yz9i zJm2#j$%OT5e{wP}CLdE%11ZAk*MSt^R2)q6s>*{67BV#0U?D^H@tK0h4Gk9Kf_<14 zANQFVY%r>!!3Lum8Z5Hj+9-xi6N=YQCKNBAOekg!)gk-ajQL3$N~^Dd4;2G>b!cy~ z`rgj^(W<_`Xe{>Efb!O1f95%Vs)Ko8SBLD+)#NLGn5IKheza(Je1}oz9Z5V>W&3+4 z`4h3dTb0=#qRRYL8x{F;EGqKxe--WT&*fX5PP3twr@M;3b{C2>@8^sA&!*LcZ2Qlq zwe(_INiU{#^kP~?75Un>V{|{?+Rh0LhOyr^9@GYstI=Q>`^SnoWp)2pLrB<vC5<2j z)$0B$X#^AxO(xT!kF^g3*H6f!68lmwP833NB0nIxkQb8!c~K#c)73sE+|WKjFWSd_ zLco1OV3tB4?^X0T+)d&eLPI1y+?{OCW8C5HWHKSxpEIfV)Z6F*k|6-e5RxVNY8~!L zZkiK_FT%;;o`(2xxThh$9PS~$#912R%i*2|Mjh^HVANsz(r&?w4)?Gw-j80!5<)^o zbiFrujSENG8luP%`@7tQvmCLHDK`iWjUH+H?;35G!Xs@BQ+UKaCDG7m!;BrVZ)P>r zV8%4KBW(>4`A8cPIcgA*Lm(oDu)FarLyf|oMqzKGu&+^guTj|FC?q`PmLc6h$_a-W z4=LU#svc=O+*qR_ejI80sIkV;MxmIDTcgG7+k}P`?noObi79M|$4A;4;_;EThIo8L zm-pUA7q|!kT!hd7)g$($kfME%&BPRTH9+-9R|8a!^f!3ak^TmcI%0o}sd$$DhV=dj zpImd~9N~j&IROij?;mM+8K`<hZv#aQEGPsl$OS%`5~JnM#OH)YpW|C8xf+d5$ahk5 zHIfrr%>5tjp?Zu>R83de$o3f9sG6>_)Ag|%2_j8b*-H1=jRcXVtL$Wa>_+NL(^a;! zK6WFWyXh+X!M=GT8Cug-Ht|00r`?fuj6LqB<%1uO`)S#f__&{iy@pSD8|<@x%G=-* zUr%`(Y=wKu+u)NYPy1Ndwfc-V%AVL~yixZ2KjV$Ex%L@vgKeVE_*vNK_MA7$CpVt+ zM%ljkoHxq0*yp?rz8LUhKZMQp+q_YBa&Ge)Y#ZO^jk2L~oA;F6rQ7^0Z1mseD|aHT z%k#c+Y)*X9Ps@Jk7yYzs$b8XHJDS>f(a*wu>X*C?z9sOIx52K+m%NShsg0Ms4YpCg z=3`+C^6TCxTUKB9M%g_2x;M&)R9^Qsrqfwo_p`7o^&M}N{g3Z>qwE}h#~WoI<vZR6 zyOQ7aL)aMluGiq}bdTLgQMl=2oN${9?u3a5O&{Zg+ipm3Crs#W`WPqNc0+<YVM-60 zKIY>C&#Pk}<CWjkSU$!ppLYST{N|06KQ(=fS3d6oUir-%DYQ3zj8{JI0$%wo7x2m# zT)-<I_u=D&FS>veKJLTE314&pCw$yHh7-Q%0(;6I_X%Q0`HL>#rjL8aaMKrEz)hd< z3BpZ(?gDQ5gm;Y3DE!<7zEtyscMM1VxeGY*6LP|japa%7fFnQYr^S(f;R25Qlx+QD z{Pram@Y|<+lJVP@T)=Oi@~*qz$_nw@r+f<CZ)Jt}?NdHD_E-P2_Y|-ER~PWgZ~JKR z%9mYW7yftLl5x{lT)<7g<A>m;uegAle#h4qH+{tgHjF>5Mz7&>uepHFJ*`Hs;d8IK zfX_XxMz7&>uepHFJ)>E_h6BCs0uJ<ymf;!>^tuZ;&@(qu!rgR@52w8D0&(v9-gO-4 zO&4&W?|avApf_E>fxhou$AR8-0SEelH;Mzj<pK`$11<J79Ox|<aG)RfX>p*pT)=^T z;HSlb-f{s4de#rYf!=lj2YS{I!GYd(0S9_c{&EcmddCGE=s8~~9OxYvaG>XWp>Uvg zT)=^zQvkk(1HIz{4)mNaB@XnC3q-=_<b>CVgzvaOB>a(2GCub!7x1|syMWKV>jFOa zV@0uRe2?HKzP32wZ(P6$e<I(%h7<nA1)T6FKI=H)Z(P6$pSh8)u9|+wV!!SJi~XDn z%-B0FFk_FY(cj}y+g!k-o^k<?ddUSm>KPaCsMlQ}Xg%iwLF*kC@VToW%0PaP(_LL~ z1+TL@gzewsc2-9UerI(Ey1&Qqtd0~s&+4Sx1x>%l^{kE*eD7+PpB-PjI^qh>_Q^?C zSb$GXxxxxu?QsQvyBbH~a8Gy#`9#XkT_Dr^whK7i%P!z>&&aNSkHfw00uJ~4QSS*J z_xrQ1;Bvp4^>*>OPxrWj3H_@Jn9vix26)iVUBH8$_SwZhUULEexZ3T<;2>8|xPph+ zRBEwt5t~XW_{h}{T)|1MUUJ1#%yj#t>65mU>TbIsp*;zY-AK1jnm+LqQv%`caX*A` z_o54gyT`o^!rhB55bmDxLkM>-xj>5flpjKh`H~Byn9ukj9w9XrkC5uRM@R|y^Y^_C z{P|56JVNRa{P|7q2mbt=AA&!>;{xvdoF9TWzvBYV{DT`O>vt)dKEapYasgL<)&)HI zZ5MFlCuN+U;I+SS0jGUToc#o6+vWn!_P7G#Cpg=SF5qle_selU!P~CRxPrS~ea{u# z?dr5ExZ5*+YP{`r7jU*u&igTV+b83$5aWLA0x|Ag7l?7cJuM%&iFMu_as~6e`JOA7 z<IVS7!5(iOa0P?B`H?Fa;7#}2n;6{9GhPRayVd6kCTA^k<K!kYYVAm2MsH5|QOxMg zX;+xho3pMkr8nnXVNP%LyTY7W9nN)&aoy^61y8$qMMvFYq*e#|+``vx^}52?Z|!jf zPccR3!c}g+CmP-cNTyKdHblC;SMA(}K(~9m4m`Pi(Cg5{+aGw#^zinuvaH+m(CTpE zavLwZeaRK*e0y5$e9n5ALJvQO5x1vw_RksV=li`59)5e?>kww`Tm;_F$#FmL)Y(7B zg+IS2mV8bE_W86cWMH@V>!?3!#%5dr;<tCZqETFMMWfiQKK~Ka-M-)o<FeIZ#{LM( zY&N7Y(m#ISM}ew8x`qD{R#~5!!#`>^W?W%5ZolsevvGUY6^Ldl$UT!kl497bN+HFt zIyx6gz15LIR)715E1>cAk}I(BkEdP1Pycwv75wz}Ial!0&j($>Pt6Y1L;Td%T?&3` zb<{)r)apoqeO8CdyFUUyt0M*a-9F_<k)V9O-4!yF+h<)NMftqn6};fyDLzxsbdPy9 zB|S80y2m^(?{I~AwmRu9c+)-RdAZN)FwghjlX4#d+;4XU>%G6n73^?j<h1rQHm&Fr za4RDhaw4;|GBTADnS_;7+gDDeCyz}lr=VO-)TbL)PJxk?bK6(Wr91acE9Zy~HPQZ7 zTJ5odi8{PiGd&bCQHP)3vobF6JkVPi?^!vo!^ffS%J}x2s5Y&pA3m-&CwjDzv1w&O zU7EbI!iJQl75(k9m8qVb2rBEMMl_|vYc;vSzcQsRP4(ptSC^)HR_sq;q_Iz{=JfWQ zn5#Lhu}`b>vj<k#Fxj*+3m;Z$BDvd&Z5pV5W5oWEs|ge8HPbUOI~*)zZ6~s}^pvM5 zvxi&t!?UsOjA!yq*%*O78{3`}8GAO?n-dvPHrAgL>3lXem=g&i+1OA{gq+#fd`={Z z&&C#VB3XMjwiKfML2NpIB_~4l>|94qBosb&BfTillwI<S-W3k~hBB*69~l2>D75p9 z8|ks3wL@0_(@;p9zHwtBt$TKf`TS`pSl89<3Uk>d=J)EUkVvM!73XKZUkC;B`Bt2t z>3<;<Li)Gj{H(?cp^$KWOBrl-iO}~#D1^Rm-AGRjZS*YQ3!#9VkM}5CXP0o~kN1W| zs&BPOjIv8aNUP-%A@cEPoqYerP)J1{zmcA(TAy%}7egV8esWsDH@k$}d~zlvoaUcm zZt<9(g+d^GLJ=slw>|4N`14SXCFRLDiXiZdPzVA~#u^a>eh~^m;7LW7%-;O0pX(Q) z5Nw}}H9D<2JUq-UaVhfT4LSX#QPpwfY*L<zIU7sLOQ8^uukMNkA|hWM4~dZc?NA8G zFNZ>~`F4zzko<Begye6Bg%XWk4uz2Xoj8iL@0CzU`?5=Z-IeJNbZ3`lW7P=V--*`e z(+s>43S|0DSl@!`xJLl0@5X4CQk_>r;r7CJ-5%zk(W{|Aqwo4i<_Pbvh60VAj-#N_ zYoS1+r{gGS^jav;=xHCRZM3gj+H0Y}qNjcAbFk>OP+*Z=(8`79fRSC%x&)1^7Aaab z2ac?kOYrF0fJ0*rAYB^_2_ji7ZyqFBEtg=@_d)?lZ-fGoz85nGklqLd9(_L)c=To{ z@aX$7yYT4EP~cHEchK!`4j^T7heCr$-;Y&*NN<J$k$w<8fJkqJ0+D_YJ%C7Wg#wYT z9gM?3(zQb&!K7<PLjp?Ij)er3vbp1-!KG|&I5f!gY$%ZF?NA`ov(Zz?^mZta>DibS z!1Q(~aOv5wR=D(bC~)by8zV&SIk@yrC~)aH=i(e(dM6aP^jx$Im);2lE?x5*F4-K{ z6W9DMNHzzRu8oFcfTe4G9g@w#r620qN;U_Vei;f}`eDo(T>51waOp?xU-NM3SE0bA zAGznu!=+z^0+)W|ot}qFzX}B|{m55(9xnYV6u9&w@8LXL`c)`!>0ja~xb*8#;L^Xu z*}>AULxD;^j-!CmyP?3OpXjMhHV=}16ADE7N%RmP{U#K6^b@zvd3f}jP~g!oLV-tb zN1x%*uk^Gln}<j5h60bSU5R0UpU0v@AY)r7Amgzc={3csY#wB63k76c?TD2J8CQ>o z1Tw4^_iwU!kYTl40vT4zPY5xrmP-J`YVkHzHV-kZmP;Tbn?D-M0yMJuW1)eKk8}Np z8y|N@{{e^9^3FmItK|~tuv*?(*kQF?0v=Y&I}1ImmP_EH)_-mmW%>ipwf?&XLLQG* zgCH-40ze**KERI`LjfO;M-RZqi=lvztA0N=n};7)M`Nx4h}F`>T!tW4%OwzEwKOr8 zVTjdo35ZxNP0VE|VzpcXBiZ~VU)RfkB%7ZL4U{|;?Sqn+LIEXD`RwU$XulK+D0wCn zQ1W^xpyZio8I-&p3Mjd{&nNFPEV+6yBw%8-eDa`))p7}(SS_DCcw)6&0w`9?Cl8`n zEtfz_c6lJ?4ya_82SWoZzdIV8CC~ZYv5+8*)$-1g=U6S5NOP=~clJoiKdqKaBsx~h zI}5g~mP>HUY7G;^FCX`|T!LKBMJ2%XPAG8ex#$7ddM6a9^}D$KxeT>_cOhm0YFRBG zGSsqKE<r7;<wFKqR?8)rWwm_BFw1JW1hcG`4;f}zEtg={kE0JD>)lWw){o;Tfc0)D z@ao6WOVXWpLxEL4jy}SwcSC_y_Vgybao&_IKo66+eVQ#m5Btq~xzLf8*nSKRe$?ve zLSO-a)atn=f-JQ08Ff3Y2(r)~8U(TDVct6sVv_d`hGYvnq9-II*+Oq<aHLkxdjd&n z^<0A`Rxf%2O{`vM@Wh^TdGFwfN!~knk}d3xo&c0=VJI|+Qmf}Z0V%b5uE7+0BIsuY z7AE;wVMVs!51FzBV392xh_gbAT0K95E{m+5Yw*IJ;Q3i0fk}Q=NRTZAd=@}Kwh;7L zfCaUBeg<eztLGX#uzE4;5W(t&1{3U=sP_&gnB={K3E9Hw7(Y<R7S4pGT*m5oPn648 zJ=frZwHG}B4Ax#~kini~dhZ~EN!~likSzqC7GOiRFcH0j4z+sT6ZlZ8=bAE_g$vOW z7-987gA(?P*Lw#hO!D5riEP0i31$mqHQB;k^p3oyR?mAvW>c%@8o7<ti=L3&SiR85 zZtVH4dbcP(UGd&6icgEdr$zB;G5EA7K3P5WWKn#wdal7Idw%X`6?Z<0vx+;5!5!P; zn{JOU26q<49joVO5O=JeYjDS&T>Dw!iAh?CMe$@Yc(N#-ECx>&#S^RNXAn=Uo@?+V zTiorlzDSaiEe?f7mU8n%bVZO^44^CuD5m)-fJe4?Aetk!u!r(KSb$=Z4^}`~44^Cu zD2oA<MFGX?`B?=NtLK`4vKT;F6i^leD2oEhndqH>awd8wpezPZ76p{W0Lr3(V)eWy z0*cjhO+Z-;py-d4XNv)pMFAzKuqdGTy8xMes<Lj1#%JX__O;3+g~Kj_1amO2h5MV) zxrD3R(zxVa-Ns)xY0B*DmC5=ohNs<mrpY%KIzp3gE_8+_-(2VlO}@F%9h&D3J)wE- zust+#hguZ(zTm{QDDIlPc%d&edGSJjX!7EPfzaf|3xlC~_OLTF&mMM#M)pvPZQd8$ zy%yVClfN$<4^95QFdUlvePJXt`TN3&(B$t6Cqt9JFPsWZS0xtRye}VUeb0m@2rP_- z=9$LX&;*8svCurzI2W2=v2Z>#E={t9@z4NBX0Gi0gCLo?vTKfz-26F0a`Wd1$<3c5 zBsYJKklg$^LUQv5LNaq^?+Xm6IkRgHk=*<_L~`@z5XsG-LnJqU4w2maDJxmb&0j!7 zH#e39kqN&YuD^tuEnbKo3oH{Mk(Aub^-ZjaRAWi$$I?t3sq|yW@3H7_$6JceJ15!F z9N>!hwgi%H4n<oa>9>K;E27WhMXz=R`rMoi3HaQMIlBUTtQKz_WcK;ogtse!o-1I+ za&M9Gic*F5Ljou_-;Yy@9ZNypD`JOf3JO=mj-@Nn5!hkrqt@;U=rBo>b_H_S`+VLt zz;QD&tSk8bt-fepq5eQLkLO!T=*{E!CVBJn`zuSK$)8R0G0C5=EX7Hc5Ol{$l@N5t zN%3ZTOVCe>Gv8|WSbYV*HA$Jo72Nh#cbpNgz11I*;{J)~gyQ~*=mainsgQR9kG**; z&WLl`>z!W9eRCn~0B^b#A?XU<bSomr6}-u6xi!k0u7o#TkvDx5=OminjC@3Y0{v!C z=nAe=>e+oGeX*yh)Wd3)diI0{#Y;W=LW3@)?Q!gOEV;Bj>TSo8OWUKp?O1YYN2j-^ zKNw!xu_H91bZJL_Xn0U*$8cz@d}+st&{*fvjs@3x;X<i5&TF47sJnNmw>#?L-lg8? zOD}!-hp2_2mU@qchFO++2Sa21|2`Dv?!SZrmrK1Pp#kPnZ;Yy!>%~&<WYoh-O1)E| zaUEFdoe2$_DD}>U24YLS^RD%g&y{*Fho+h9>j+IV*B7(dN1j&d>xp`hvDCLcG_7pk z@z8LcQs3#&n7dNnnb2f;eP=`S`HR)Ik72R0i(aoEl9c*}LerY{g@yK$7nJ&9p8N6k zQeVt-Kk>QLcQM-YaZHECILht)Wxf#DRBp$V%k6_X5q~MS@5+gAzT7^P6Ty19eQ!=A z`75`-mlL6Vx&8f|2;9r<2XZ3bUv58?6G_<0?T2$BG%vS*loOfqa{IBI$o!VuM{*)$ zF1Me|iGaA=emW<@-E#YQPQ*9r;=y$Px!jI(l-nnBHNk3K^qRO#xqUiU6SUSvuL)br z?U!;j@tV5mHAzj%?U!>kA#7drn%o8{xA#O%{q^c{M{bfkG|3%jb2YKAa>u!xh*Ok1 za<kN-S?ZX`)g<(kJEn4?CZr=bAsw2Kj@evIC{pg2%ZVC$M{evL8hgiLuI5s5%5uk* z5IZ4GxwAbdc2KjkD<{I2a%XPpI>B|hb4RWwgeiCC{K!7!TSr1&)N<I@d=dBL4(GzE z+-aiMlyi0FoXbAo%i$(^O_Hf{=Lfkq$(`z=*ObR~<~+_m-AkJ$dQEbwa!1Z(I<;_} zxpnW9(RN<Qom~spnKOn?S#oF2WjeK*ow<eUWZ|kq9S7{c`Q&r<FZyr)I#kdZf@voT zI>fYZ#7)?LygO(A!hr2xlLZ~J+c(d)SBD08!`Dh&nJ0aa_j#=ZRI5XK=IlT3=N|4+ zqVo=;m9SFu^c|=sEBSc$U#br6AJ=&IGdZSN`#Ig)ADONWjd=SbwQ2t!ed6S|M^n>V z(vtu7G(~&)pl$=dO<!+n+D4I{Y_Y^N{hmHw)6`0FDjmO-;zcz_1pjUNbWPJu#{F9o zzb*D+V`?vbqOGZgA~X0p#q{N@rj}BB*P}?xSxr(WSf;H}>tnk4)IX=AKBk{9{VV14 zeXXYN{1)TAM*jSY3p|?pbm6sh$TbdmD;0mwHOjYYyL9VA`8}80->PlXO$t{|FNDGu zBfdkwe$RVx-=SZ>=d7=&%(r8nR(*ChJgwi^*!r5vyqo;3pU?y5;ak6<%sjk6`BN<C z7wP9uIs7{5?57+~>z{J;o785tujAIAve?%#&QH^4ikd#f7(Sg%*6}M2#}?jA#XqDk zM>TD+%cA=1{o#O&3F7_%Hf^!DU{VcsKX0*}u1QGWma;au*#1NMwv-7t@E@@M>!e(N zIF?TG3Jn}jMHcxFJX8HOzmB9|Kjr?`XISeNyV9zk|0YJU#V$jWfK6<<QM)f+mu~G& zjoc(M-ePCvO^A7G55JSM+}f+Mx4;FbT^r)Hx7c8Ei>bTC&W2lrx?3#sO>lCHb-txO zvCg-Mg11=Nn;+0;xiN|UExh(7vv>!y{*M!PXknQnZ1W2-V;O6(4Kh-&hx^-I!6a;h z40Tp6VRI{UgDaPqvXyy>mj_qoC0=InSLV;I%oF@pE@J?7@mLzo$^u@qvVc{rEYg*g zrAhmHOe?y{yt2qZSC*#ode#Y;GR4m9;#gXy$I>~ni@Z5}l_kk8@>2FURDm`5mddQj z<0`WzzavG@E;8sRRDnf$Qe~$6DV3S<e^!|>ep_WG`#UN#*6*r}bw8~#V}3?uNc_oh z32^v(DnrcgQ=W#g&#KJ5n&(vJw!@E9=Dmk)D&t+($*Zzyyz4qSRW_|#RTnYCY#Ph_ zsoDUzFQ^P~UsM_3UdMp4X^4BByAql0;i+%?xlYQF@psUgey%3i!}GGrIQ*+B<M7uo zzHAzgC+KC<c>MK!Is%8!E|UFa(>Q!~@qN|7<=;^G{nX93RR*u`s0>}Ri@JF>4PLL4 z17*|T^_MyX2g~g1$90rt(|DIymQ5c4R#U3MHl>^Rb2bftg{o{C0^i!MLtyYrDg)s+ zRffVok`w8i-p!Nr0Wf6Kq<uHNQ)E5DUp9Rv9TJ@)4T?_TEVsFu%4V3H>wD<d472mR z%FNC6_arbkS1(9lZrqY)n46!e0#kEc&mm@*n(L4(n_+IQYei<5oa;oyY=+sn&V_9@ z!}MGq)mfOHY?`>8%`iWo$~0z}pX=OM$Yz+IY^GbSoJ~{ssrMBiUgtVFn}LYeef$vd zx)y4NZ1cJnY6eDLm-Wm5$?MZPEtI@Y^vq_U<fkIQ44C|slpvddlfOHwHUQ<PT*PHF zkn&UVjBJM0&o0X8XMp9Wa^e|i`6;<yHgh>m2$@zk13o_$y=LI&r=r&k{QT5S3V<p# z$mVg;ZJ%<zkj-O;wOs+pCzoh;i`}Y5p_x#wK;kWSr#IEHhZuFLS)vl!ptRZ!FY4_K ztz8<xv-aaytbfam+B=RMiv!d&KNcS_Esn)dYDtqHi>>4msqBi6)LUZ)t+jN{5}$=_ z+M=??sWLIge<$X6Ss9(`E1^@Fh~xE%H(n;*c$s+PW#WyO2@a(;%%s!?$hX|UD@uII zwCPLg11|n07jW?}g`(>?9fFsX+9vIP67iHI=5+j{)HZGZQ)PT4i8&oJ|Leb2MPCz8 zQEF$7{_!8F(#|CPqmF53mj2pnFbUqZ=v})kNR7daM^pwGgp*P`qkL4qgM%-t%xJ%& zG6Vgp%CO*TDno*=s|*PKlge<Qv;(&;wKGNkpc>e5v&zia->8iLzDBtN@6`x9uxYNL zOC8vBtLkIZTUExUH3J>kv}T|Ko7N0;uwI&h4wg$Z(7|eH20E~5%|Hh!RLnpJIh1CA zKmFOH8R&pAnt={dsBIbnUh<;K#SE&{K?e0}{k|_zOIcm1gZ$|iszCPivdY*SmxZMc zvL|x5lJ2Vek^ts6biA;vGReW)DidM9{}uv&1fgl$-;zI+_$vsecpcXDn>vPd{p|%; zSjp%AmRz#b#acf9x9{jER`YiPOc%@d+YA4sDl8xwZK;a|d{V!&d|oC{c$wwX>~;|# zK0c)eSkI?aW<9;kdU9z}>S8^$99=Bm(>k8zd)kLhcKbb5V153p%B;`#Rc3v>O!)FL znb{AxI4X6Knmzlt_mSM}S+7DW_7k0hHTN<J(l_)wVb2#6X3NO=wsh0ust?$F)nK}x zAJF-n0J^)r@R05<2}r36)ZN{qQ^2~rdnEw7msAFB|Mb|uNC9rT^-$`9Zpyw(UEuAe zHwxcw9;J<L09V?fo^@l`Tr8KmF>5a4O5GT>=BgV+sh{20_`m857+~!#qOjJD5!N)J ztQ$kDX)TZFV63qwZj}aMTJsuKTB|3vc4MivdaePR+Wkw{0M4U%4Wq8LCpLFu*k8_T z7<a9n7~PG5*UsS@MqWGCwIhj?U(IVo*jjrUF8&~g?ZzFRash96DikhNp8BEMz(2f9 z8uLSMgEZ!c(Z;FNJ5#(8UiFj=u=`A^<7F;Y{>6{rO66ao4Lnh<+}+@b{F#U*w>~^m zp4Lsu@sdV{XTIbDS1B)rg0sH#OC5u^dKqv1rMH2%{xaIYT}|;yIP6QmR<k&)m&s0k z?ML9jzm7KWV8ON<2UcL>k5x3e@8Q0$a!USYMAIW?E^?0@%y4PPS^FOqcQDOK%;`*T zX~%i{pDHuQNeq1mOH}eRgeA6e+z^JSo(y4zN`8j0LOI?LR`?Yij}eLzLzv*#^gH$^ zVhmw^PKzPzuf=<a{k3=(nVc5yBNNl&o#g7L#e2yVwRks~o)+&XHrV1F#Rglvr<h=? zxHg0dHn;qZ28R(gx4MEAHg9zWD{Ow$6^yX?%dTLB&0lc^J8b@{D;Q$)*IdC6o4@V~ zrr6x_h)YD1=9cI+2HD)=-QGh)X>Rd;?;&e$Zt;%qA;D^H@t*G?$7*izuJ0jzZf^0u z?;$)jw|M9G5TTk|y!U$uQq8U2`#r>|mM<~mdk9pmE|80Db%A8;Q5Oah@V@NAU=qIK z0{PfiUD%ase9Z;o;n!VIFnq)ng~I5o;$U=^DA*FcRSb;o5&>JHzr??m=rGZ*C3>vb z7hNXuwM3tZd#%xDqF(bhnadtxUh_{~A>uVZ?+Wp*`2|;iO!JGbfSKl>xdLdKf9?vX zY5s*Pz^3^nSHMm4zq$f&nqPJW<TStH3eahO)fKSQ{F*Cpr}=eP08jH9u0WpVe{%)& zG{5Nz>}h_>72wnSwky!5`5jllPxCKbfj`Z^as>c2|JoH1=v`Mtpx?LxfgY2`z#pa2 zd!Ucf=smDU!CMdMl}6j6`ud$OrP20?zFvMp?ZX^h+}NY~`tMKacWA?7meO8O^KE|L z3ulyE@W;@alsxd)(3+lBeem*(%CJS3GJ65bf7S0$MVBgjLCO#GJ4AU_Wq|UW%JAfe zDua_BsSHj2MP*>}W0hfvE^GFJ5?!nBg(N>!eK?|YVlNa?I<XgqD3#v}LAWVi+6zB) zak>|J=wfp(?08A%gB(iz_reWb>hFabN_Y0c45c%BA;xQJ4_@f9YA>{SL%+j{e^VJ! zys0vrcuQp{p<4rcVZ=N79YQEE+zTImrQe~0GQ7R8;a&X>8MqH!+6xyH^-r_jo`pps zb_RF+yT8+onlrfLKe&K5{(~zM_>bm$0{@YHO+$~8J@~2L7cR{+gKOi1D3>9_<`Pd6 zO15LT?scpBz+1^S45OUpDBCWKG9!iPy?W`26ufJ7?tm2hYjwU`3LdsPKOhAkTb<V> z>H=Q2IzO*E_*tdP&xNN|?9bSxk=pa-dJikz%7OJLy3)g)_|gLYR_WQVqwu(j{UtTp z!RIR5y+3$eW&5=1;CGcBZBp>ON*~WMOAGj3rGHL!@V?5xds6Vf%D_P>cwlAVk`#Qf zGT1H!FRTpm#H6%<A65p>s1BZ3+391)7b`n`1@Xqpt{plGf2`~pmV!rC4!ti0i>iF+ z_Jdbe>~ASEhxlb>#LtdrRz~_%2j8rW_-x>vl@Z;`TEIUmC#G~19$GoKTM9l}Iqz$M zmsZAo4)N2<g<U!dPpw=yE`<nQx!^|;!7CHzRfh;(nV6751h35cy5oZt`+M@t1`)h6 z>qim6E3-UnD%n=yWWD-)QfUD{t<1R>fQ-tVdjZI(T)wDt!HmjfZ<!cg(F+-+1)_Mx zOq3oH$196It6W1=7DbW;VtHlJ*8&<<u5_v$c(k^|EsBV~W`F#Za}m?mdizmqM{s@Y zYx~Bfz@N2!8kcPcPIdNgR~`7XwqKTMTY;%FqB`(rZNGewzXRN~_P)HEKLl)w)@u>| ztl3{hPkmm5KWiUqT>LHIrnL`6NZTfy&OYWXL;tmNvav<@vv$t=1Ao@eYgQNG&)T@p z5Bymh->3e-pS5vWooyjbXLk#?4a6vZ6#QAc;Ij&U*4yQ|wsp9E)cTH5oeTb~`wA|? zpY<I))GjT;pY<KG%tiRK-s|fHf7W{y9TwrwdasWH{;c<n>Fn@leP@>x__MyVR|@=D zxAcPbf<NmP&{5#e`o0gOz@PPf;@BemS>NYt3V+u3xh24#_5Hp&@MnGh9<>aA)(^<$ z7vazPfkoAUKkEm@7TaZ<X8xehA^cfC<aOZB`bR!v@Mrxaw=wv${*hZ0{8=9nNfzPH z`bn|Qb{nU&+eeF;G5E7?nF<R0SwHJzhd=9Q-Japk`h=ey{;W^=x!}+Gg3k~9S=a9P z(jxp>UsAkSgg@){5T5?PpAGwSq$u!b!~X0i3jEn<^VNYr8*S>Ly^&TQ`-c5#?R1oF zdQOTxenWvj8`~8bm*CIFc6rJY{Mp#<EyJIU?F(v${AXi_dbmXXv#~>Kx&(hVcE~c9 z;Lk>{EWxHF^{{tREyJIUUd{6o{Mk65+;0i~Y#flkFTtOUV~U<j@Mq(g_YnSU9P_cm zpN$i;mL>SJaZ<Li1b;S8Y37&U&&Fv#7yQ|{Fso6(pN)wgDez}wLV3ax{MnfBk;0#i z$-_Dd{%lMu7A(P^jcNJv68zb)_gYwG__JYuP#y*TZ0NgIB}<#r%v*!hfj=ACfLmIE zKO0NR7?<GBX2+0@f<K$~{DgMk&*pX?JN(()?rQ;mHn)2_@MrTqpF{Ywx!>m*{%n3A zLN39dP5YzYoE`pb9+WRH!Jo}T;^7kf**xrLhd-N#kEk8^vw2uVvT3Q$*ydqnr?xFQ zDIdADz@N>J&Z!;vv*{dLf<K!_<?lAVsh#8AL-?~f?5hKRHizAt;LqmC{W=%?**vM( zWZRQd%O}TF2mWl1`nllG=GhNa2mWlH^>e|W%`s&cOYmoNOxcd!7}^|@FYAq=%`tJq zHa(~QoYR$pC0$9GQp>jGIVp3px-0N!(=$ff1D)#3`%&;`bN(`;uno|u&Sm9wSK!a) zWs&3x{Mo!LOSl4mHZRM5uE3wo%ObXIkWMWx?9{p7&!*?1SK!a)g7PTa8_iMPL-@0) z@3oY!z@JThOQm!L{%jibl7(M^Kbz+GDDY=<iF1`3-f1egVNYenk8&H<<JV*5Hms*I zNRCo&!+I)%-RVr_4(PL`wvDHL@^T0GF^M%Tcfgi%hwXnN@Rd6;nA$e4&K(@wg$HH! zazkpa3lGZd<pvZyD6>Bsj)DheT^&;JpsWWwFY^bGn=<>$;T(krWnI`qxr;f-x-{Z0 z<{<0Rh`X4BtOwqfyYQf_XF@IGL0J!$U)B@ttOq8S^+-GGArC3rO@O*RWIfn<Sr4_d zF3n^&5j?Y(G}0)#@t~}WjI`X12W4HF)owf}vsVx}3J=QcO%4=1DC^P!=>d6W?{ZKF z56ZgWc3BU}vo5T$+>HliUHC$|8xP9toetW;gR-vOQt+Ux3%@IO<3U*$akkuz2W9r; zn0D}>tQ#hm^*}!BCZ?D5I6mtpVwSt{piK8z%H4QS)=ger?#6?%Zm!wOdJ3O)!^v_t z5j?ZU$MlB?o^{JIyNTeL?%tI3^gZjAWp?93nLR_M9b720r^qNo@T?oUmb;1InLSCS z4qldZ%MQDV;90lqP!HX+ZrPztU9!4v*`ZAxirXO(JhKKl7ZE(`+9!nwp4p2w)FFar z+ubsW;MsP!Od@!uOrUI2m(H$z`DL3rl)Y-12%c@{8o8{;@7Z=?NDtt%E~r?xsiPgT zsj?ozXWNNuWt+NGr_1X&f5-&NHg(kT*>L{29g06)Zif&z>vD^7{<!@(f5_9y-OeAk z7V)RctwsFN4#je}_|xUqLIlqYr>qVUJTow&h(Cs%r1WqFkr@h5#Gh^vz-~e^tFpQt z@n^fv)g%6x%g~Pa(@l<1?h${?WvD|0&+Kp%@ux>L){6sKk1VQ3{OJ)%dc>a|k)%ib z>5=vJh(A4A<sR{;N3^lS>m&91$>knM;&*+^)*yAn)gDMvIYj1Gwwtun5ovoM$?7Go zX%8e>y(ISbK$7)+KC1_5NB5=6J&<JelFuO|S-qs_*#k)``r|)k8*;rrl@CRd9!TPM zs>^mmxL&8(0`uRn8auEB(>h$k8cgeS4SO)H+chl0v>w;63DdT_hE<r>>l$`pTEA;p zhG_$?k=>cL(>1Kav|X-YAExbg4GS@C$Te)lv^}n2C8o7mTymLEWpYPeCSIA`nU_iX zOzzIh*qg~cc^RWKd3#>Q@=Wf{%b1_Z{dpN1G<hH|V~8g2%*$A#$-DA0CTa5Syo_C% zJd~F)PLucKWh~TW>&bbaLCn-->-U-Zk0-L8v;I3q>%Uu@aWHYO*<95R;M%p>oYggA zpVbTNBKkF(!+Jg9pB=l;H6mbhrTd&~#6W8=te+@o^`i5{!RFPu!+tE0u-OuD*NBD9 zc7xV6qG7Y$+;ok2*lf2zT|0-z+O1sI&ZF67wrfPiW_$4A8dtW>cJtUZB4hK~(NWik zjn==IKcZvv`pA;kBR)1)b`QEnglt~#opX&C*}O3su0)h<UOy3YMVxG|^u>6Il+CM` zhrK;wWpia{!8M{~bLHGg*NB(R>xbf4B4+dILaYZdvw34G2u0Mib#vS36)o3KxNX>{ zeG)-e7kut}MN7NcroQxwmUg?%HE3CRPZ@MCtgPtIJCu7N<(i%(l<gLE{fz79{V4eJ zy=NbX;k}@zwM7EZX>FANZd$iW05q+SN&qpfUzPw|TE8Lzth9br0zhf~ngmeN`gI9F zWa}dmz{ghaDd5=ZJp~zCy{9l@tM`<+w$*zIDB^On7fi&ZWG|42%fwy~5f_EM03t5S zdci|nmh}P$<FkeY8Vqq#lpy;BR<9Cdzntn-g6x-5y-JY%a;jGevR_X1f`ho6vU{#| z^GK0P9Z-&3k6RMKL5f-uJyWj5EQtUiMJ$OBA;l|+AR$F7i7+9>Dv3ZLMJkC<A;l?) zU?D{*iEtssD2ad}MJS1oA;l+&pdp<o>zS=j*BSi^BvS0Ecl)A#f)#a9mvQ#xs`{Kq z3fTu1B8BV&3Ko-Sst+VY3fTt`EFP(jfZ!LAeE`8?k?H^hf0dxzN7`g@NOee>;x<qp zDU&}WEccNx`Qx>6AL)`mf-CotEct`Pav!OZ-{LLzktO*f_i`VA@`sk?J^*D=M?Hj4 z7IUP4D2q5!V3frhDL~4ijT9(lu|^7*vPdHZPFb9h0;twc>B6NCQmyafMs?ZVm8h?> zKi)6*!K%%6Sxz6Ys&x6dpjBm1X?P#FTAR`>hdy|<c~lobeelYnih2mIDt5(?E}Qz` z)!I2-jP}8+)l0er>4R5s3DO6z;u53}UR7pwo1_n3Rd(riLLa=U3~*Dk+y}2J=XLSd z2d^vwtB3H);;$5VWzkm(yt3FU1z1_+l>(_MBf9AC15;ZSi~2y+R>h(|@U&I2$kw{P zd|MTZ`oPkoibZ`O=~2a^K5+D?Vo@I`dQ`Ef4-7r}sJaS*9#t&r13!;?PeIS4-cxAv zsP`1cJnB6q8Tqn$+7EDA!h8E6PHRpAIa_lQ%y~2?0i7@BB&hS1oCJ2hnv>wp*K!iz z`Fc)*JS~spG}zOU??3cu$qxYjJo$5Gw;%kx_@*o1=fxkY3iSETv)_^eeaaoWjnfZ( z${o6S*bjZ|8&^6C`jk85rTx&S+#%oYhd$*F-Pq}eKK6|?wF7<Z18GvAPq|}43iPpi z=2D<fxno)i^eK0UNBz*pzKEte(5KuXFYSju<&H(wfj;&jG%3)>zJewN`jk6$i>4p? z*!Ry=2l~WK{(k6F?i79cp-;I}nNUCUDR=5dQ$O@6cZ%u#(5Kv~Th0B@$3CB?vqK;I zOqvwvQ|^3E3iPqho=Jf|<xbtS>4!e$PTe5thd$*_-8}4vKIKl`80?2W<xa(ze(+Q7 zbQ^;|<xaOT095XD8-qaQPPZ`-RPIzn>4!n(PPaNBRPJ=EgF@v_-A?QWL*-7lLpW6K zbUOq@<xWMWen?dAbjt)q<<3dXAuL+GJW|=CMI3-f=3?m+cjeB7FpL4vRR8s?El{~b z^ELpY>Oa{7Bl~LI!SK@oXjT8!8q|0PK$iKhnO3>eJ}6lK3SEke1JJAftF<Ys9sptW z@7SHOqZrWu95YX^e_U`pbv_<_4M4S81sj)r6VX2U!?~cFF`?cKdEx+stLxTtS<V2I zt2I*Vyw-F8($yQczIEni59ZZ>I%kLE&JO(QtsStn&J79->L;5AS@?kSu=X9tR6)aW zFxG#n&8?5r32A3JQS64JG96_@t9@iKcdV1sj+H^$Yo+ygT>G4)^}N1<X7;(c3YOM~ zcFY>IX~~&^qqW|GeTlFzZ;siTZ4_H}-o{V$mfa*Azt*M=r}lNp`g(cioyJzd&TbtO zz6Ko26E)r8Jm7G)wJ;MBBnKSPrdvDpFE3(U&T9KQrhUY;))}poplu({H2b#?Sk{hp zGZVn=3z{{9X>bt1+{RTuR&5ID=(_hlAh2s$bAxii*S?Dxv1#BWi(CIRX0F>#ds|1J zZ3li|Fn_?Azq7ckPX1l>6;Xs5aQ>Tqus-u?bUq3X2dd!FZNTG#{ZzAC18J_$9wTa> z<gBsCK0#WrLk}6LLVlS%cBG$t$R0sVw=?>(dK{@ivTn3B6j&Xtk%twlFkJ7d576U_ z{bX%++H#aTPURZ+aPwZhW$%m!9mDT<&3S7x;9c?nl;EsH!e04K{+pm(V})YzfXAZ` ztetYqvqz<RQ#G@6V0w5;KbhmyKmLj%c&M^p>kH)B%YetMn&Z?>!rZ~<#N(I!TASzG zPXw}>$GIsEDv;IPu<jkX$+vgf8L}Oco1#HQv0786Yhni#zdDb|e+3YG`GThEKlyCi zD;TcVXr_c`uqUS*krc!S6};>ewfQuEw-xseC~|e$$C4AN{3k^&`^m%5pu$#Nw6inY z(LKelPW#ZZbwg%pUq7YW=yeD2b18(`QMLKWF?>)Vtka@l{ikSCA&j47kb{a}o%TIi z%QyTi3SKqh)x9RVt>9JrNtxB4!dA^H>h9^m&aONej{Ri4N)F{6P~@snLdYFdw5o|U z3$*mUK6~ChMXQE5HAtL#WZj)%koeS+lZZ&IIf)pwH75~!9?eOFoiFDkBF<NG5|QSs zIf)4KwVXs)`Fc(wmbB!%PaJ8<_n#Qjk{<xUqa{BA0!K@J2n3Cm{1}KCE%`wZGFtMZ zAY8QMhe4=l$&Z8R(3&3yVWBlY4uU~zejM<>H9ro(-<lr>(Er8vwn6hjaQ}h};Qg`Z zR0F90blaO!p!n;$;vEFvZ#=IW5c`E!C4lM|UTu{Ep<j4)s}$J$l%E+QSLUYHcI;Ly zK)m+Bxyb$pL9p$FiF;9lkaz8aookc2936zYcH6JAuxoYUVBFi=33=amj8p9dwy(JW zWp6IH0$*Qs0jj?20yzElH`FQ|{jLiD^a&SW=JVTL(J`R%<(vd4-}ooh0gSJ?01<C4 zxB>-lF6idPPT=>d3n1@h7hv6!ztMSs+{>ZBw(o`l*q#Ulo;@2147<7DqXb~Dx&W|V zZ~;=i>;jznnG9_wlzPnt7<F^O6%h5R3jpeQ7r@iYE&!)j-F$b#rsqQeO(6iLmqP(d zue#0e1WM0`0+K?2M=ys0jb1J7c<(K(3N)%~^0A%Z$i00hEP6Q<Nc7!M;LsDHK%qCc zy`ZzfAXD;vfI_I=3qbUS_Z14g<^mA9x!?*EdesFe^oE$T69~QL0uZ{n;0hFa)deW@ zvI{`yyDq?>H-4m%!l2h&fIl}ETme3>x&U}yb^+*oSHdn(^YTrl0=r<%cS8X-+rISb zm*~tcX!DJKlK^d=7kGC;o9DGsyP(ZCZJpewcR`$QzV0o9oEOBPT@dGqcXcXw^NVc~ z;LVfYlK^jCdQAej`S!OZK$~xWSAuBswghPNiac)@w0XrF1vam|E<)`BHn03zjlh~$ ze<}ggy!w*3u}i3V-4$5#y(e`Lta&3h|Ip@p-}3>0o9}&JM}eES-jo1se(*~P(B?<p zJ81JmTOuDez<DgMft;3jh_wsmwB{tJvo$Ayokw#L-1%}&0z6;INucMeISKZBEhmAV zujeG?L677#<w5!WD-X&K0RFV(M*x9Z@<V_@E%`A(pqBg~z)wql6cDH-KMWw$k{<^c zYR!)W61C>X0gPJn<A6u4`Efv`*8DhtQfq!3aH%yv4$#z^9|v@5&5r{>wdThGqPFJ8 z0j0L)#{sB*uFT`XLCp7aZWcW_i1~g#knH)vVdnS2VXg=te8h-8K1r327|yl52<K?^ z!H1`$(CmY;St+>1buM}yoWmy`oZF)+nAxX;Nq9I0SAX_131IbSFG+x^Kf~`Ij=|KQ zMHQg>v#0}A-vUz)$DnEmFz7!n{>O~Y1cgjGAqftd#GoFI0iyp{iUT2$)jFpGas9i; zCE)n_e%`||++JVDdpL&E-{leJ!!ca`E>9jF+76rgCFWfoX+9jo-S6_0`r#PPe)qIa zi>u$|uJOY$R^UHT;T%A}yW3l}jpy~#EOSTy;W>~V0!UvbNq=~b*$jcX41t*pfq7i! zN&Ulf%wh=eJOpSS0x<ugO``$kAz-&5V74J(wafEr1FH>zwG4r^41u*==K0t|d%T{e z&;`~qYOt0eu$If*-g<bBwG4r^41u)_0b+l_^P`97z;y_)Is`x+0+jv&7Cbx$qC<cm zApqwPAoCa8X?=JOEQbJ-LjcGjK;thuwJxAI1gI4P)CvItf6=2hz;6h!Hw3^N0@VFt zyV?M`F4$)o>Wdu$3=08<eIe|fhhZUrurGl0!}Aa<1PJ!UPWo}4oG=7Z!Y{a!`S5%% z9dm({@C%-9K0HrK7y>Eb7ehJ=DPahtgkO*dKeTrW)9_t@A5jB-gaALjAOJl)4?jYH zA0fbx5a7obQ|c-F2myYC06#(yKSa9o;)e_3hYR9|3-IF$@#8%F2myY4AzGe?A0fbx z5a34$@Z<h_%L)(YAxK_=A@|!gCom)g7!m>u2|)}Im(PnKE{Gv6h#@Y(ko&~_hv#8P z2r%USo)`}l$w}if3x!qtK18xL7i1PL$ShpIEbhyH$1#f#FpK-5#5iUV0%mbvjx>&0 zgn(JZU!!?Aj$z#IXEDYxj1Vx4`@F*Sa2&%30mHc8t2Qu<5M&tKZhJT`vv5I1;ew39 z1qBvAivo)a7=`_5oqhMn03VKH7)24|sEPM^t>WQ022vC;lA5^e6N{k~MU16>xGy8- zQWOb1b<vlT;8PR{Ky}g2P7o@J1fsg=Q${c<iUg#hNKmSY%RZk3rlLr2DvAWC`w9%> z1gH=QP$3YYT)04hsx^FX3`@E|kgAJvmJ0-`dKYAs7YJ5`eqA77)kQ8f9$p}5-8&tp zA#9oCCn0c|bY7hyblp3>>}Mr-nWR~}K=?Ar&qx5fHyURogqh@LB#4>hXC#c>8;vs( z$V~Dx63R^SGZM`1osBaR&hDL!wjh^D-WKdK$=iZn_r{{D@ax`Kv<1QLor^QVuzTmC z78JX8K5D@+lYAy1*}d~|AS}B#6$e5yll(wvW|B`KJi9j)Z9%kq({Uh7yEh%RpxV8e zI3rv$$<GMcO!70rwtF+t7IeEe8wbL-d$Ums!ri+R5{$by7oC7|_vWG&jJr1<wIJNR z`KTqnwMQ+{tv&iBwzbEAM7H*5OI&LY%MsPu!*ay5j%Z#)>xj0*vyNy>H0y}A#IjCD zyL}-nUB7h3fW)!RIHM@m83Pi-I+vCEUw~lCozX8CW|Dgc6f?=a1CA|sc_$`BvM%q$ zggDmaotO~Cy8Mh2Vpx}-aY6*^@-t4rujTGIBm6Q+hB*PhOp;+vz^~=*I3xTrNn@OV zUnXgc6Yy)fC(a1JO!70rFO&R?@N2mz&IrFu@-xCOll+YEYk7N|5q>RikG9~KN!}Lx zGRfP5U(0>b7W^{Fdk?=%^4`NQiyq?r1pG3|&j`Ov@-vEG7nUy&J0`@hiICvea&JiR zYs>P$@{o=MU|W_4LxW&jmUo5*!nQ2$3Jr#BS>7EQ5Zkgm6z7FvHimuobj>gU$Livw zdIQO7V$2FGtBXo#CX}z`Q;G@YY&FrROGG;z=N8dU-}5tzXc2uUAex0*KPyDb1>^~c zmJ7%e5Y0lZj~1et<Y$Cv_age*=d|j`G0D#e(M)oafM_Q97$KSkWIrQBGs({g(Q+|* z0-~AZXM||Euss3Ma$#E^DP0ak>pP_;dA~%ofbWEe7Vw=E(E`4cB3dwXQbY@ePKs#3 z&`A+37&<AU1qvrcv_Rpch!!ZEbfS4sm<*!HX(vUr9-sTkAe!cW(uwAFJ?TXAxt|Q8 zX|*SVXqweY5iMMMQbg;EPKaoIZUB=aS|DdqMC*%AIMLkXCY@-$w3AM>TtYn=Oxx$| zn+&S$bNWpN*TT~$A=`4ze|3>FDYivIZ65$jei8}wq;j)Js3(=1g-cH=H#;58D>sYm zc~ZGqWY3ez%_4iARBjgjJE`1kG@4g#7J2cca<j;ICzYE;#yhFpEHd6nkt{OaNs%lv z-bs-x(%VUqEYjOaku1{NNs%nl+ewiu(%VUqEYjOak!(7aS0sy!cTyyajCWEbi;Q<t zB#Vr9QY4FvcTyyajCWEbi}ZF<B#ZRcUa3iz6Y1?Fxmhl~og_EQrMHtJS){j<B3Y!j zQzBWUw^Jfnq_<NdStPDgB3UG^Q%*8ZET%-V$Umn<vdBMeM;M8#=buv|S+H|TB#X>) zN+gTSa!MqN%yLR33!F}gWL<9eQzBWUky9dBq>)o1S)`FuB3Y!7QzBU;h*Kh2B#2WY zStN*4B3UGeQzBVUbX6paY;Z~(i)?U86x;53&6G1NR>%qF_?v=Xxzuk;xmj>{3Vs>- z1imTwRi~k%%@hPHAaY6!3(`%AVL`enXPAeesbH9&RSXMYO$EcemKYXbux**iwWeYO zV%WtvqZoEEYQZqO?9uho6b#E<FHOO)<(%2Uuw4E>1;b48uEH>zF`q;jmY-}Gw%nFW zdZ(b6iIMeA!7&pf?VS?IW<6$3iDa`LGp9tdxu_+Q%|$JdY(8p<Wb;u=B%6v_BH2{b z63H$`El76nV$_0Ub}L0`$3;kHlG2Wgkj!q&cr8d~lGlP{c6Y^VK{AuP79_JfB3=uU zndG$~nceH~T9C{nuLa5OU353R2+2&+71%{cW|FSJE<!S!30cNPNM^N^NMD3xcGt%x zNM^TqT!LhFr^Y2nX7^yc_mIpa?>!{58!lc8l9}YSAeluZuLa3W@>-D0?nZenNM@4P zf@C&quLa3+HgOS><!wTlSk5MtiRElUnOM#yl!@hRLYY|3CPcBEO^9MSn-IlvHX(}T zY(f;v*@P&Tvk6fwXA`1W&L*5<v9zLC&L)(J<!nNkSk5MtiRJpGOf1(gWn#I0DHF@} zOPN>z_o6bfpsW7qeeO=+MP*`<4qg<$A|1RaenmQXQT)pFUi`}SUi`}SUi^yNkr&0U z$k#54U#FJ!yy&9%71Fdk%@TI^+iCflrR+`t{aJXs=+24qHxuJ<d7P#9A<E}0!H+iO zbv03JnU>$xMA2nho@c#`n)1DZDDSflxtHp1$Jcu4emX4=v}KAe$p>vY<3#d86XS6C zp+)VeDNihj^2M5{$0gJ9MiXO}<c|eW9%&Z|aU%I-L6le8g+jC$ewkY%_ssmlg>MFK zrsbXHE3q8%&w?lqH8IZaKAIQhrFN+j^C>^Ii<LNBo>~y)tL6YPA@bIONX}97*Jx87 zTNB0cY5A;O-b77#tzF=RD8DU;^4yxJKrk)ewHy0!xV*O}`q|~bHPH{pgO~04Cl1Gl ziy~RbvR&}Rgph~SL_d6nOvG-1hcV2Mi_}GRX@+d1E~-m2<Ri5^=x)g~WF$qAoW#WF z{0v!1Q6w*^<)YsC88VZiNN!TA7iT9ssfjU6@{_vgBO*gFF<g6w9Hl14;bbW$#;t%E z@|2nwHOWEhZ3<R1P_cIVJNgL~YhoM@6>GQVLxhTT(PthinwaY+R4j^6u`c@IP_dTX zyVcE*mDEMA2^DJ@esl>c7DZ9f?h-|tqGBze_{@unHPKHbD%Qe;*Ax|NqSq7^Eh0os zQL!d^O;OS2C~As|w(3z+RIJtX!$n1l(jkh9M%rl8shAf<#TwRpL{PEj9U(%+nt6u^ z746zKcQ{luF?TprtS^V32r62Oxi+C<9RgkxD%K6mMW|R{$P84p&gbkiPenf*D%LJC zV?<D~W{Tn3P_gbuemGRD&yubmW}srdO&3MQ+I+ewDi%%z6>H~?E<wc_L0p^_6>AVs zmu5vpyVn#VRII&y5TdA98@swR3l(dRgF}RhwP)8MLdDvX@Mu$1togflNzrh6xy#>t zvOkfO?of5)MMc9?W@2$8X;$&@)N-c{K^IrETKhUf@98DFS;a&<UG5R~tk!?Ru7h^? zZHC#1i+0!F?-<O=26kBOxZN<T*l2CLtIaAl*2OLN==>HtdA-Rk%MFbvY>q8=ZLxXk zsvn_y6|-2%y@~q+wI6sac8Qete^;4ox2(U3^6(N+FSm854n+Sum4W$xRvC`}waOs; zA616l<+lA&KzF(AeJODJOJDku6qY*#mb%oYclIu^&ZRb9tbcfkCH{ZZ2y5$Q7PVQw zvzmXSGRye?s?7TRe=4(Z<>&*eR&LYlS(jLsa+_Xny2M(P+lJH*E?aJsbzj0?%Wb+~ zvA>g7H|=tpUZ|SGQ_F2)_8e|n)*rBWIERmx+Xgw;91dD;+bIR_EVu2Fg2Vk^DwBcy z-zt-QY`Gy1pCj|gDWn}ag`6X&kZ@={=Eya?Oq${426LVJ@62@$bCuc5H5lg{#wp{S zYcS3^j8n!thiQhD*;k<J>mZw%Bb$)T%#ldQX6DEtWHa^&K-N)qJ4fyiHZw=!@IPt3 z$r=7vl}Q)=H<ig0wC`Y!B;o(i@8k!6uQI8@e^HsN;2%^b_W!s4CV{yBKdVg0|6f!l z+W(&_<E>l#dV5Y}ZVL&2wYLUz82)MR3`oHv?TrB`_+;&VswCXfULlZzW7h7kO2RYk zodPKesdm3r60T`48AwqyZ3_wC+_Jn!mGDhFouql3^WHJ)%;TFzU*Tz90W>G!omNZc zF|Xj6lXO9`BWme#A}8U+)|Oy2k0a+LT}arY(f^;lH|>t=xXwnu^H&@zhyYp~x-mnR zEjN0Q5OWGiSyD&^7X%t4ED%62NTe;@WgC(s#m=i>9*7}{9ZzxWSFmOGKv8Qs#6Yj> z#_T1(-<q=Iy!z7q33pf3vv-|7=QO$@QI79>&1DN+b!ymEdp}R@s#B+mMdfLPD~cx( zt|*>DxT1jPcfZFa0nj!Ah<^9`oC1)x5x}&K0HkdM2B3F;z-0jBHUcPr_lKMUFt-uF zxs3qOZ3J-s?!R*x0J@C;(rpBwZX<wonfPP?bsGVs+Xz72MgZ&LGiCsG8v(T22*BM& z@KoT(+!me&NCZy-B!b<4iD1{CJ)#V|{Sv`0KW`q&z}<gWBH-$avz39HZzJI1zsuVj zGGG!L0U~*qKTXJhMr;H-c9H_LVpCw;fA?qHAD|f<0hX~5;20YLih1`fE&~K(Bfu{< z0_<WVKrZj{S8^Fpi;V!YNJN%-g|lRtSMa4^A<L{H5zHwP!Hgmi?24z*mMpvB62V*| z5zHhK0UmjmKe3`K&-6fNBfudx0t{j!m_PV)k1X?tL@<9y1oMYPfIoiApJ`;lA2tH~ zVI#mFHUj+dTlRUg;13%C{;(0?4;umg_$_~8l?8v;2=IrE0DssB@Q3*8S@4IA0DssB z@P~~6f5;Ro3;wVX;13%C{;(0?5826+1%KEG@P~~6f7l4{hfIdD;13%C{;(0?4;umg z_$|A@S@4IA0Ds6dDhvLw5$uSttDOaZ{8l2sA2tH~VI#mFdXmMXc@`W}9Le5_nvU`K zngy5WloH7<i%QAkbrzhWQ%WTJEtHb+3T9F15XF~pvnR_}a6iP)!3ykS-UcbKi+3BG zz%JfxPy+j)x4{UPtGPfh0z1aHK?v*^-v%GB)5<q)v(w7=ZS!1|Z`)=kmM(qMd~$;8 z0~MU)Fqk03VGu!>!{C8h4ub~jI1Co3=P*d1fy3Z{Mh=4lnm7ywXyz~opoPQ0|DzlR z{CVDd8|Y^z{WieQPWf$MpPlyGfd1oL9+1yI_-z0`!q0*GRt^L9Q4Rz3F%ARtaSj9X z2@V7DPjDEBf0Dxhd>e;>_rKyW;Qj>;1MR0c46vW(FtC1x!+`o(4g=}uI1HfwHHU%o z^Be}uFK`$rzsO;L{3#9t-(Tb~p#3z5f$C>C3_w52VPN@hI1Cu`B>OfnER(L=@D6y^ zeH+ff-*N%)4S06U7h(Tjc>Xp#gANYEF}T8EFhD1V!2n$x1_LBH3<l`tFc{z}hd}_> zI1B>l;V=l`OB{wj@H~g%4)k&u-oSMZg8=$C3<BuqFbH6P!ytga<1h$dki#H=Ar6B8 zhB*uZ7~wDo-~|qY0AA!U2;c^XK>#;73<CHvhd}_mQot8lzr@c$0K9VWHVEMV=I0=Q z``>+)V?Y7-zxxf20SVaUySG6Dc8%z55P@AI;;XFfGT_@FgZD<WTr%iDP9iS64MLF9 zgbQzj66j=1&IM9<@9Y1@F`xxH8Ixl`4DWrNCwOmz8r~a~azGAr^eyKCJ<xfJ90P)& z!v{GA6hUVQatug9&NwdcRn~MsB&PvU$XVotw?P%}@mb`Bw?P(kzA)zkUC^<N90S6T zv&ai?gEHj!$imwo4LOUvz*kwzS>y%2%397MFT4%vkn>&(Z-YDJK+nS4U=KPxm*oL} z$XVnCzRFt8A}{b&)^cid;SN|tP7y8eRn~GAd4aF8rc)PD*Bx+)9J5=v12%b&&mu4I zRn~GAd4aF8mcx7te3iAFOIzTptm$w}t_!>(=bsk%Dr-55yuepk%UR?FzRH@8ALVku zFLF|I;SLx^&LS_|0mr<@=S~**Dr-55yuepk%UR?FzRFt8A}`zl*T`Aqg*#vyIg7k- z2Ye$ZW)}D=YdJ8qa0i?t$Hf-zfOX#Ev&aj4m9-rGT;Qv$<t*~T9dM7F=2^G{_K`D2 z3w)I|9rMaP2L8$O1(pTA%35yzDezU+dA?}2a0mP&7tI##z!j0(feLrPKXTD*;STsm zE}AXe0sqJiLWMivAGv6@a0mP&cM28wDr>oDwr~ghBNxpU_$q6;XtuytS<6MUg*)IM zxoEa<2mB)!%@+77Yq@B)z*kwzjYfq#a8u+)qrx5Vk6bic;H#|VqS*ppWi7WJ74Cq4 z<f7Ta9q^CbgH*T!{-JwyScBjnxoEb)S6S1|Je&rO3*G<2G2kD%{D)(}KXmgC$AEw2 zW~2gNN-g&q75Gx>JYO_h;7h6Ve9>%yFQt}?W(#~Nb)GMpExZHIB+nPk7Wl&HJYO_h z;0veaqS*ppI8FE9L1w;iS}vL`yaOL3&lk-W_`>NtUo>0b%cSL^*#ciCO?T&U$?!Gu ze9>&-9WX$iFPbg90|v<RMYDx>zyNu^XtwYU&@C6u7T$qZk>`tM3-4fJk$?3qt{pi2 z<-c+S+=O59`1%gKgkS!MQvjsS|MLpR0HnYCE=K^PzvLnL9YFNH4CL<skoPCQ&Y1wn z``=*Gc?S-`eZE<=@D2cZpKlf|yaR{eK3xr}Poyrq1Bc-L^gnY90C|7rn<nNDi~sah zGlj&Ih$7%3V@^a77~P_h1x_+%MU(<wa$HhiXiG>0Mm9{0C=1LHGb4(Cr;Mo)MZi_Y z+=wFJD`Rp*5g61kJE919%a|Tf1l(oJk0=7RiU|@$U_iqRi6StbVTwc%7|t+9q6qlR zm?TjIoMz0DC<2y@X%a=ikTFl92-q<uN)!Pz#!QJK;5lQeL=hOqFjt}o*g57h6ah2G zWQHPO<(;Ai3}KkgPzsD-Nl5_*x?3WE3(ROJ3vhuc4MhMKnA1=MaDhn;MF19<)ldXr zfoTmz02Y|nPy_}pOl&9uFu}}*B7hQ1Z72dD!Q6%-fDue?C;||{?1mzM5KM0<0sz7M zh9WRvVS+;u@Ru>ep$NFknBq_bMk~y5C<22OCOH%VU)f>~uCm1(Mk<Rr3{)0#7^f`e zFics@Wel<{<}gTE%wdeOn8OfdF^3V#Vh#?nU~UZjA($Hje+cHrz#oFSG4O|AZVdb( zm>UCs2<FDXAA-3t@P}Y-4E!OO8v}m`=ElGug1Is9hhT0D{2`bd1AhqS#=swfxiRpE zU~UZjA($Hje+cHrz#oFSG4O|AZVdb(m>UCK2*k!f7Xq;{(1k#340It78v|Vk#Ku4u z0<kgBg+Oc!bRiHM16>Hj#y}SWu`$qvKx_<jArKn_T?oX+Ko<hBG0=rTYz%ZE5E}zs z2*k!f7Xq;{(1k#340It78v|Vk#Ku4u0<kgBg+Oc!bRiHM16>Hj#y}SWu`$qvKx_<j zArKn_T?oX+Ko=HbpbHBz(1nE<=)yt_bYUR|y08!fU08^LE-b`A7Zzfm3kxyOg@qXC z!a@vmArKn}T?oX+K^FqCanOZ8Y#ekU5E}<w2*k!g7Xq<y(1k#39CRTN8wXto#Ku7v zGOUe*E(CMqpbNnqT`i?o-vx8ypbNp=IOsw!Hx9ZG%#DLC1asq{3&Gqt=t3|z4!RJ` zje{-(bK`I~1asry55e3x_(L!^4*n3#je|b~bK~F-!Q43bLohcE{t(QKgDwPO<Dd(H z*f_{Q05lG$3p~aFb%Dn?fGoy84j_y1j|0eJ{Nn(!82>nME4Drk+={J_1Gi%9<G`)h z`Z#bawmuHrT3ZKht*ryM*4BYrYwN(RwRPau+B$G+Z5=SRrVUhDO9m>fB?FaW$rC`O zSn>o=DV96|REi}}0F`3N69AzY?gT(6hC2Zeis4QGgkrc80HGM}1VAW;I{^@i;Z6XA zVz?6kp&0H2Kq!Vg0T7DeP5^{rxDx=O3>Fgrp;+<+Kq!_x0T9YyF#!<DU@-v@imguo zgfdu60E9AFOaO#}h6#XB&@cfI%3v`85XxXNfk9mGG67TyUM7G_!OH{&aly+325}iI zCV*Q3&;$l?0nh{naRJZ-kSze30I~%@6Bxt=Koc0m1wa$Pz5r+f*cSjz0Q&-<31D9U zG=V`}05kzIkilXCWFUx|02#<&F#$3Vh)sYD1Y#2)0}C;bfrS{zz(NdUU?B!Fun+?o z$Y3!6GO(D#AZ{@ScCeVkAZ{@Sy0Dl7U0BS4E(CLvpbNp=B<MmgM{5~+XcWv%f-VGe zlNiJWbCci?!Q3S1LLfE?x)6v>f-VGNlb{QM*d)k605l0Q5CBbr3<N-vAOiu=B*;Jj zGzl^g08N4n1VED@0|C$^urGL-1oj0llfb^<WfIsIyi5Z7f|p5PU+^*s><eBd0d;}L zB%m(vm;}@X9+QB&z+)0n7kEqp>H?2RKwaQ538)J^CINMU$0VRG@R$VD1s;=ty1-)+ zP#1Vi0_p;fNkCoTF$t&(JSG8kfyX4EF7TKH)CC@sfV#kA5>OX-Oakf_9)P-q2cT}@ z0jOJe0O}SVfVzbTpl;y-WLtOu*%lr^wuJ|fE%2BEkY&J`0+0nSQvkByWePwRyi5Ve zf|n_b`vQ+Cpi+!~3WK;9{}cvsG5#swR*ZiNxE14{0&d0lr+`~A{wcszjDHF+72}@* zOvU)8FlLMKPXV`L{8PZK82=P-E5<(s+=}r}0k>lOQ^2hl{}ga5#y^EITa14SKo;Yl z0+7Y{rvPLz{wV-ijDHG17UQ1+kj40?0Aw-#DF9iFe+obr<DUYM#rUTHWHJ6J09lNG z3P2X)p8}A@_@@A5G5#q4S&V-QKo);&3P2V#OaaJ(hA9A9&@crcTQmU3;*U)M$QB*| zvV{kLY~cYQTX+D-79Iey3@1|<vn^hLY#C0bfNU8~rhshm$EJX63o(q@0<md8T_83M zs0+lV0d;}cG@vdJn+DVcV$&G2#UGmn_62j(7{mp0(-_1BbJG~a1#{D&3&Gqp=t3|z z4Z0A_O@l53bJL&;!Q3?HLNGTCx)97wW0)7rO@luKbJO4t!Q3?XLohcD{t(PfgFggw z)8G%m+%)(@FgFeU5X?=3KLm5r;19vvH26a>Hx2#}%uRzo1as5i55XM0Bhnt5U~U@x zA()#6e+cHL!5@OTY4C?&ZW{a{n41QF2<E22AA-4Q@P}Y-8vG%cn+AUf=BB|Pg1Kq% zhhT0R{2`c|27d_VrokVAxoPl+U~U@xA()#6e+cHL!5<cL;17#A@Q1}5_`_lj{9!Q% z{;-$>e^|_cKP=|J9~N`q4~seQhs7ND!(tBnA()#1e+cGgz#oFS8SsZ-ZU+1zn41BA z2<B$MAA-3V@P}Y-2K*tIn*o0a=4QYjg1H&+hhUCgc52fW%*}v51amXs55e3F_(L!^ z1O5=q&451yb2H!%!Q2e^Lohc3{t(Q~fIkFtGvE)w+zj|bFgFAK5X{YhKLm3#;19vv z4ERGZHv|3<%*}v51amXs55e3F_(L!^1O5=q&451yb2H!%!Q2e^Lohc3{t(Q~fIkFt zGvE)w+zj|bFgFAK5X{YhKLm3#;19vv4ERGZHv|3<%*}v51amXs55e3F_(L!^1O5=q z&451yb2H!%!Q2e^Lohc3{;-$>e^|_cKP=|J9~N`q4~seQhs7ND!(tBnVKE2(u$TjX zSj>SxEat!;7IWYa!Q3qPLohcB{t(Q~f<FXvv)~WG+${J*FgFYS5X{YjKLm5L;19vv zEcin(Hw*p{%*}#71aq_C55e3l_(L!^3;qzy&4ND!bF<(N!Q3qPLohcB{t(Q~f<FXv zv)~WG+${J*FgFYS5X{YjKLm5L;19vvEcin(Hw*p{%*}#71aq_C55e3l_(L!^3;qzy z&4ND!bF<(N!Q3qPLohcB{t(Q~f<FXvv)~WG+${J*FgFYS5X{YjKLm5L;19vvEcin( zHw*p{%*}#71aq_C55e3l_(L!^3;qzy&4ND!bF<(N!Q3qPLohcB{t(Q~f<FXvv)~Vl zIq-+Y9Qeax4*X#;2mY{_1Akb|fj=zfz#kTK;17#A@Q1}5_`_lj{9!Q%{t(Q~fj<Ou zbKnob+#L8rFgFMO5X{YiKLm4g;19vv9QZ>pHwXR@%*}y61aouX55e3V_(L!^2mTPu z&4E7zb93Mi!Q349Lohc7{t(Q~fj<OubKnob+#L8rFgFMO5X{YiKLm4g;19vv9QZ>p zHwXR@%*}y61aouX55e3V_(L!^2mTPu&4E7zb93Mi!Q349Lohc7{t(Q~fj<OubKnob z+#L8rFgFMO5X{YiKLm4g;19vv9QZ>pHwXR@%*}y61aouX55e3V_(L!^2mTPu&4E7z zb93Mi!Q349Lohc7{t(Q~fj<OubKnob+#L8rFgFMOu$TjXSj>SxEat!;7IWYai#hOz z#T@v<Vh;RaF$eyzm;--U%z-~F=D;5obKnob+&uV0FgFkW5X{YkKLm60;19vvJorN} zHxK?0%*}&81atG?55e3#_(L!^5B?C$&4WJ#bMxR2!Q4FfLohcF{t(Q~gFggw^WYD` z+&uV0FgFkW5X{YkKLm60;19vvJorN}HxK?0%*}&81atG?55e3#_(L!^5B?C$&4WJ# zbMxR2!5m*fE12UeXa#fg;19vvJorN}HxK?0%*}&81atG?55e3#_(L!^5B|9OChwk{ z2Z3z-LSn!VxiN_WLFC3I1`Ls#kQh)zZc<{v5xFUe0ZHVhB?c^!n~@mML~d4Mz!SMS zi2+gM<|PJ9k;7*oe^{IcRpb^V4Y(q=C@~<5+>*qAEpp2e1G>mzhccB6zR3NHqyb^L zWCmm8zAb4$8M*IB3^*hAZxRF2$bDC0z#6&lNepNs_kE7J1>WFW*Z;713&e5%wZE4{ zppKj<{ua0+w<2jk9=V@N4A>+0Gl>Cx<ld4P@JH_F5(5IsiAmi8gXB_@1{9J@OAI(9 zmysBdNDkjVQNzF@IeZC5F`$v$+mZ`BlDi`@Ad=iW5(6gL{Hnx&N;bbHG2oKTuS*Qb zWOGzvz$TloNDSy?^HqrfpKN|ZVn8UHRy$yn&DSIiC}s0?i2<kFf6WR6uf(McxFxQR z2Culf6~y8a2+ZPYJgCLhLEsk43b#NmmKAP+T`Viy0=rmNxCQ^jvcfGmD3%p&F#`!J z++qe2R=C9sB&=|Y8Aw>+7Bi5r!YyVXVTD`FK*9>Qn1O^9ZZQK1E8JoR5>~jy3?!^@ ziy6qu%nT%~aElp8Sm72kkg&onW*}jOTg*Vh3b&YnEGsYr{Xh%|4CH17rXb4-OhJ|v zn1U=TFa-%KEHDKLD=dJ5EGsN90|_fEFarrIEHDEJD=aVr2`elx0|_fEFarrIEHDEJ zD=aVr2`elx0|_fEfPt*hFMxq8Fc!c-mK7GjK$aC2z(AH27QjH36&9F*gcTN;frJ$n zn1O^97MOvA6&AoiE>>6o1zA>D00miASO5iCR#;#PvH~#$2_-Iof?OTM3?#n70yB{K z3Jc6Y;wvnGfh;R5fPpM4EP#P5D=aVr2`elx0|~+wn1O^97MOvA6&9F*gcTN;frJ$n zn1O^97MOvA6&9F*gcTN;frJ$nn1O^97MOvo%*;T-3Jc6Y!U_w_K*9<O%s|2l3(P>m z3Jc6Y!U_w_K*9<OU?3MOEHDKLD=aVt2`elx1qmxGFa=pwU<$IVz)q0(3Jc6YmKB(R zEGsYrSyo^M5>{Ab1`<|SWCjveSY!qgR#;>P5>{Ab1`<|S1Or*4UjzeLR#*fBSyosC z16fvB1Or)CSOf!ER#;>P5)dvj0|_fEG6M-KEHVQLD=dP6T&%FjPLL>L5fo%uVG$H$ zSz(bW$O^<1B&@K=PLMcLi_Ad63X9A@!U~JbK*9=(U?9s1i(nwj3X5PM%L<FkK*9=( z%s_&$MP?vjg+*o{VTDCzAYp|?W*}jOMP?vjg+*o{VTDCzAYp|?W*}jOMP?vjg+*o{ zD>E~Yu)-oUkg&ocGmx;tA~TS%!Xh(}u)-oUkg&ocGmx;tA{fZU3X4oZ!U~H_LBa}) zOhLj5i%dbn3X4oZ))3hV5>{Ab1`<|SWCjveSY!qgR#;>PvaG-iWLbe3$g%=6kYxpC zAj=BOK$aE2K$aDjz(AH2mcT%k6_&t2mKB!3K$aDjz(AH2mY9JAgiFjo!U{{wK*9=3 z%s|2lOJE=uD=e`SB+6I<1zA>D0tH!CSYisY0x<;%D=e`SB&@K+3?!_u#0(^?u*3`` ztgr+IvaGNK2C}TM1O~FKu*3``tgyrkBnVq#1`<|SVg?dcSYieeR#;*N5>{AZ1`<|S zVg?dcSYieeR#;*N5>{AZ1`<|SVg|A@GXn`LEHMKKD=aYs2`ely0|_fEF#`!JEHMKK zD=aYs2`emtfn2Px#1tf~u*4K3tgyrsB&@K+6eO&$#1v!=k)0r6g(YSnVTC1TAYp|i zW*}jOC1xODg(YSnVTC1TAYp|iW*}jOC1xODg(YSnVTC0ykc$<-KrU7Q1G!iM4CG=3 zFp!HCz(6imU<MKpE;9oOD=aeu2`el!0|_fEgMnPEu*^=7C}SBEWLaSu6l7UpnJLH$ z#1tf~u*^=7u);DsL4v1cc7g;?%V3ufPi2=uE@6oPx711msHILKz%2C=0b*&82=Gdy zM1WSBBm%6`ED<1;7Ks3-SV=)CR#GsEl@x?xB?X^YNkJ!8Qm~1Y6l7v01(#S!K_ymF zFo~5EL}Dcck61}TBUVzdh?Nv1VkHHKSV=)4R#Fg%l@$D8B?Wz0Nx>dgQjmw06x?AY z1$9_S!5mgn5Qmi%ykR8;ZCFXc8dg$}hLseYVI>7+SV_ScR#Fg#l@xqoB?VnrNx>FY zQjmp}6kNfQE~P*feDLHSmQtXKcbWf}QlJVx)R@wMD&GAG?0qQ(Uf`oVDGhjmkN%|? z@B$xfOflevcYh(}fEW0%PD%q_;A2%O2E4$Bq*4q#6F%~kV&IwZ0j3lK?%-pDDF)=h z2iQ^!*n^Lfr5Ml$ANor%;1513mSR94d<-(hfI;}UVTu8Ty!%6GDL90Wo2E1%k#~PA zX}}_U1T&=pjqr)W6ayZ4Hzm11B=7P-x0C{t{MMEXD*0bF4Y=fgvDdMb0-5~QY8m9= zvJJ3@%QnCkzvaPaDFrfc=^fyAX&LBuX&LZ$X&Lx;X&D6I(lQvprDafnOUvK@mzF^S zE-ixvTv`U|T{;EqT{;EsT{;EuT{;EOT^a<it-jJe#HD@MN&AqJ_TeJ!LqXbyg0v3> zX`jufeKw!=SvcRlU|X8@*(%?z;A*MQ4*B*3YjtU#)unw_m-bm*+GllXj6s%d(mp#( z`|L37v%0j;>e4=|OZ%)Y?Xx<*RKZ$Z+GllXpVg&(R+si!UD{`LX`j`lF}_&dNc-&& zBaG#ZG)5H55^_}n&mflMt^^rD<f?=pF-K*5BM4uVV0k0s8&fjAF(u=}g<O&#V@k${ zl#CB48Q%z!@nI+9!%oJBos4e;$@tKe@u4Z>8$mKYd}VwiNX9pUWPBq?#y5gwe5lO$ zMv#ne1j+a?C>I%6ox*XnUO@(qqV)<g@D#0Akn!O(<HKpjhtrI2bl~d>?C6m3;Z!ax z_^H^T52t)(fgK$(zR`g%EwH0Q22P^&0Wv=1W_-xa_>i0NAvXh0(fR-xAC@ydEN8q} zUVa6hUg!kczD!3r>W>XV$0P>hPT0l(r?oZ)bHX|s1Dw{|7~r(Q#sH^{HU_?5lZ^pR zn{5nyzZM$<eAPsbiqHU9O{<Lp!fK*63J|M_*(hMFCT^nuvYLdA0?KNhuu*_n&673? zIIC&1Q2<)aU)d-it>z0h3Q(&#WuxG&)tt6b7$$4Z*eLjGHD_%U9JZQsHVX5<n!mPD zfO5@w8-?+-=7Nm^m}@TDD2%Z+PuVB{yylBG3J9-x+C~B5HP6^6V7%s88wHTp{Edym zXiPVBU6A{g{;>QCz#kP8z!-gAA^`npOkyxZKm9ing8?}r5x_ZbJ6wJR!?CRgD7U2o z<Z&qj7*9w9ApV3z0O3zc1OVP95x_TZJ6wJR@aAoY%dY_4rz8soYTkCZ{0gRmXCws% zZr*md{0gRm=QzcyAc((~2=IgS>Z_oK3z7ota8V*a4o^u0xZ#Tu0cv<!BESsKNCb%C zS&0BIh~{1eEj(#U#eja=#$Z6dAi8=L1NsFkJ_hu2=WI5N=ueBzUxf{xwlOfj)3#{X z-)ZS8IuBEGYfO~*8oKwruVvr++Bdmvuc43Wd}ui$`VY&rvq$HaGomR91%B|l%?sjt z|37A=I1u0aZ+uIlKzww*vmE|Q#ew^NM~;s^f|H`aeeZu~UZTK#|Mk6ZOBA^8{qOuh zqQHH>%X~+oz<nRkw-Q`DxbOF`@C0-DHE`bt^dTvy0{6ZD`aen(xbJ;B2bxoX``-VC zO$F}zfWC(0RN%h%U*iSD<=4P{zkiGOPA$I%?)yC*IKdggegCy$+X(J^|J$~BaNqm? zl$MO(z7K9sN))*7gMXNkC~)5g|7fGYeZQmi7#0F{_q){V5(UHi-(UL&iGt<5{|jEy zUw#eT_q)`8NGg!u`){!0v-}zypAWvp^YrD{K#2eKmTe;_@q^bVq%4r)@4w57xy!GC z7JvT(UQJkj4aE399hS-s0yTa>GX{<VIetL9aySa~_yKL*;V2N~@9Fpojsiu#|N4qV zfh6Cb{<%bfCjU1<9~oa~6n=H`gM}Zt#+26?h+mzg9(O-rEYgF_x7-gvel$3}|Kp+@ zAVGTY`>&_nIY5T=fI8Iu0HmmL+?sJe06D5UzPadr0FqQiO%>$;PrOg(jdPosC*I(N zoaLWD)geyv6DXP&D3^Z%HP=cCD7j7|pkiL2T>c3Z%nOvuKY@B1B@2|>BoR<8FHkQ3 z1d3G)lt({v<gv#Gt_>VHa`MwhoKHI!uk{Q$-95cYhyD(93=TW}-Oli}q;uis_3r+@ zn-tgie8<(~2}-Qe*K{6r5*=51l6}s({^4X_XHRm_d8}K<e16E}InmjF{c}j4=pWR@ zb&vG+I-UIkHwSyJUK@5g`nsInp3Y?75LMjQ-9LD}W4Nck@0c^to9v*t7kZK}>U^i# zqVY2q;;L#b<?ywRVduq;A*ZWnXn3&a%E)lC%XzV9_!_0A77X=|40a}|qAo4*$s<Sl zI<6;&s1eel%jf!gZ&F#kmrq|&Mf6?$jOq;Cx^vV4JsrKybv$u;u9HC5lYPTlJQCG8 z_vE=_PETil-wVzalC<lX^VG$}@n(nGLWOm5KechjWY?og_~TS&d*`)5$M^5Jb3Qpd zGT1ldbT~r;$<Chco=&IpTE}2V=P>nc_hA2Zr)PM`d8&_U?J{k12KsyYhHbedO>%I! zoz&6aMGew*9CxB7+Eo}Q@a24=W3Z>=N^f#VWev)ytET32!kVF@Qb<=)J#D|<b3J)2 z+0jKp>q25W+A)2sy6$w_>9~Uw-95?PE-69F<u4(w+LPoG$V!Tec;=aBoHLP&ZC{K# zZKuzjil2_3xk$mYXPmYR&iQ!c)Tw8k)~B9$A|8`^AZg#o^(5(vG}beGlbQ=jpS*bb zl!Iqn>0q)uIY{Cqo#B4lky0Q8_ZA4jtrjWsfu&1<%CM9wI~5A}-*M+$a!`T9(b3)g zy;{rtead9C2}}O2<Z!anV+p#2D%v){(SnnyNXDzl;dX^Yu2cU#?mUqkCe@K4_7N<G zlEcH4XGn1bLqrO=Hat8)B@B!VyNXbKt80Gp;>B}Rka}u+#V3R=qkm+$sF35%h2-!_ zC5SErj}It?<t@U4ErlN+BuFo@i)7cJphmfnN<BX~*l|;JL<bSu(8$0*|Dd8GZqktS zOaEY(t3&Y97Nxk>4{cqr70?!@`=<RG@n^5WnU*U`LR=xDcDhIUIu(%;18O@OvSo;9 z3X15&D<j=x-ctHd=itZ{udqtgfnFleA%{rwxH3a(=arko1kB{$jZlN>iDuxT5u(kW zVWMPPtL+Ce)Lt4jivJk{14Yo|tHal<G{b`f{oMDQ?YNWZp|OJ=^yqey0=jz!hiKU9 z>>L?1NToPSIzEKZBY(L8#rAgiO69Ut5Atufxa~s&y*+O8cTp*)S3J@I^Ks`L?(gk? zQB<m$d)ztQ@qAJ$a`baW0L9tJ^bX9XpBHBnJ<*87<BY|Js8QPyC$N>O+}?4_=#l*g z)B83DQIt=UrpL+WD5FW~H)Ud~-~0LrGK0qq750z=(Wgw|g`!?jz5!c|`ODP>8Ouki zV$e63a}^5FfyQGy+hso*I<{TzPNN~p<1jpsDh}>CzpA)Wx26KyXVmU#(80C&^h8## z0IqyeKdMV8%H3x#_H>ai=>Er4OLD14LJl^UHt6=w{*gY5UF8F*uu>+C?pFw6DyL4W zJS<B$mf=P^jnMAey(q5cmRV!)1GM*}733!f0^ao^X;grat^n!0c&%p`u5k^yRvK0= z;y!9zPt^fel2?2B`c$)(-=3uZQ(v$$q#t{OYWp~q1ywTmU@GyqK{ew{KRG*rjyt@v z=R5j3q(7~j{E&)&$m#D(nmz+ZIW-S`IoWso`HtsD9y;bcM1!{Zt$Xo$|6tO((BxxY zZU3|sZGI@ry*kp{G3X?33=AfRh7=*|k@osX?{JS9f{o`PN+1dzO167oMgF6TcAkh| zJbCWyg^MSnXU~42E$(!640mW@$gy*-_V!;PACDb;TcUP>2a{de!EaadDP=>-AJY!K zGGvwCpkK04gOWGIg+j|1i{zH*!Ft#_CCa<E&C<CYn&t(TO4YUZ52*1U^A&awm9cgu zyE~|R98RDMzG4bw_sC+Fh7W33M^CT2@6}kS4P8w?x*YXb+T|PKRYuC7M}FG?Beyd$ zq)<bZd(>!)8y@T|@|aC=s&@|<O|N@t&gf%!kleox<%Xhq<Cd98CB^DoRJE%8^Bp6@ z*Qn3W(5#Z!+<9U!`8@r3Y~b_5o!4IMAAH_Di~l_P%#`!wk?tNf8R(>3Lk`cOk9_5b zl6+v~3Qg;k_esvv>DKmW<U+hXarRWq`K)u9rq1ncXD+s%jyywCZk>Fv=LM1%=`ZMM zTv47&I+;p(srr|1RUdPzS7|?}^U&oR(b(l1%?*UBYPHu>$0RP_XbCB#(Npz1?E0-z za(tux-Rer;>Pp{=^zrcJ8?6y4tJUPu;W)*`A9_x$1et%As?|5MPW6!bkNW7AA5^Pd zrxZmCY7(V(c}hTiCTat;h9?2F^-}_BgR2D8r)M0XCTWpcF5ieK@m1{*>^V;#52-bb zPN#}zD5uCtBCTAij$DYgwNa7PdLg5l@~P4Xpc>BB+tGJ*gcgD*OLbpzWO%Tnw>mf_ z+e(~QBPfR{nk6zuf|41NdVvHy%QDtf4IOi;hWoiF3aIrE4w5W=w5~)nO8<-js$V_b zPR-?>p>{n*qauzTbv;xGss>fV(NGnk{t-_kJ36m9ltB?s6+y_GPbI4wy!0I99!mCh zKl-Rz)A5TuOx|f}p=kw9mBasDHb~&$pk522T5Kv;3Qx=2eR0%z=_RK|b%*n*&wkd^ zPY*xrba(X92%sKO!^oAZDe6hm{;}$#{*H3j;BK{NnZfAEo!HgNmz|`l+UiHOwWxL} z`D${Qbz3Z-yExlnu1*dv!dea$Al<HdvAUI*sj;4333)rqt8_Al&+4VV#`<=%exyvw zswb#5F2QU<j~<I9a7pUvDOiMBY$ORZGLpp-cnel5O~+|5tnFf3`~q5N%U5<%t&;ej zcw4UfDX1{FqP@krpLq)m>Z<Ce$=&aNap-uswxJe`qSC2<FN?}lNQ+~L#Bbt(RVmHs zrP^X+VyZiNvh9g8XV24nW<tA1qpm(xbwdf{g<WkQG|M5hL}wOVYN}6OqOmA+{PK-N z;<-moQgN5s+oPu<7cR87Q(f1FulI^0B)N#Di)(e&SW(A&TdeIAb*XhtYplnd%VZ7h z(X*$|MJ{sVt33_&0#YbjHDCR6$%ozu>{^%UpQsM%VUz<;;ebJaJyD`6YrUQk;F$C9 zi4!NPD5+YHrhk@Ys`{TN^^;4Kv=G!ILi>vyz0Z>t$psyvb%Pq6`<Puit9iKUg`?!T zB^~<J|NMbm?y67Kt`uj8R@2H0!b*Vy#R~@(?bWX;-?T~BU>l_#Sfsq{W;z~Cs4E`# zQ0}8<L@>pa)d?2P?GnFYAWw(8t-{O|gf5RcwZ|}IR(ah6*kM@_4D-3(GMGV!rys@@ zP(3=>(Kke^nmmw@4%DbfPkMX$Xf>bwV2L5>p_c#%d)q@Z&8t_FgYC(|!T!OTYEq$J zgrn-U*_9DW*LA`<XWm^Y%hAv<odCwBl;jiB>k*=d%klQ7F2v8bKOH%LrtQoVmG%IX zQ1r3^oj^{=^^O5*qpnTOIZC@m)<+m}$T9eoa+QXN%sK{@QgxJepZc$SiQXA--1Q_) z7rNS$H^^-yM3P@t-QGUje}Q_b?`nYS;P1Ua@sFyxEmfmmKGM`uz48jHHPS2m-iInW zahV*0;hO_`+&fY2TqW4{1@>dnfB}P4?X_re(U?N3Zao}D<;qbn8c(V@ME{)6nOVyh z<L58Xi>3CqnC_k`PU*!cYV-iqQ>E>HQI=N?{J`gseT-hMd$7G)UHuuyIeF4)Gghru zgmlAdI=fFOSKgR?dy%morMIK_=jszZaMhR@>romLt*-Pq2sec+^DB~D6@tDdIV9R$ zD0d+N!T9P$z9m0(lclZ={)MJ*N#v>73o<K!l1p2ab`<EHcIP$n4o;3355wC6m0CCc z^JXN)kjo=<(BP@EsDCcL5A?2Go)5R8T(R!X>(r#!-P=#ZcUdot)`-nJC!PAEw180W z@~G7sOHEY|^>yeo4*h-1siGqE&qqG1k{7Fv%!U>ndI|RZgK$&YmFH4qEKbkWKAMuz zOblqdL<K+M)IBHaRvqDb_?$y^xx$pV)-%T|ei|;5!`&mQLrZyo5C28Y<Bx_uU2`dP zyydw^j=ppQzdMe1M~;(6c=Tw^<DYu?=w}{RuAxkKYs?$Os_XDIRF4sXGqrfStg4d) z=ozAwubQgsmujCoN&|Wg4W&ovh58L*R*rqtp~qoQvk$2r)vwBmsm{+8_2_eo{V4Xa zqFCzZFv(M_VpWFv2b9|B@--S|I%&a-8)~#l4Jt;F%4?0>go+f8f~mD3S8HFU9#pQp zBvtLuymTO<xiA;^xRj5l9*_zPd_*@_<1$%HkYz@5Y8;K#q;RqYJ;r!l7HO?s0{G(& z?}6?4^YE^Gv5zslSKO-)czD-NlXrlxuBQE8W_S;B=7NX!Vw;5hdV9n~SK#hc+#mID zcdqpJlUq(Z%RVVD^3U$epPKu^OV%T_q2zSOkXi<~q}KjJ52+2{G!vyj%pHiEK%IV) zFoAj+Rb&)VW3%Giat@Iir_?{VLN>qJ`9g0%$jPN&YD#5CyDIW=)cY!0B_~%_ve4UE z+LWoBDsrYMlXrlvQmvy*RYNp_K1YeDQOzX!<1~FDCxF|23C|x^syu~G{<qP7^2 zi>zO4o8hO2h8dOJB_rCT{44du3a=k1*F*+*+U`_SrAl>=!YY|@LcT<4m5=x(>mz<i z`E5QQQDq5oLcSE}gisj=I3ZP?XS=)AJIc>$r{)ot^Pw^-Z%X+!X8L!DWK(WtaU+#D z>K|+C1a$?t>~Y$*Nt58=?waa{|Ki49KJyvn?W4w{qzj6zKEV+usz2kJu$VH<f2n%f zTsM+*YW+2PJt22Kw?wMnZElwfBP3jr8)Pgpu%JWvLZ%$p5u_=<?x*%D8B4rQuV1Mz zHRqRJ)A%z1|EUqMvbM|o_Lp8moQl(H7MhrlI=wW;Tum$1y~*=x&%gkoRC^ynh05BC z4cL|1TcAo@<$5mMMDza`?RTiD)(@j(WTrarLU=LOv~dMb{M@y8mi%=UdJnIEnLlX0 zUesYvojVslU$Vng`?%B0*1w?cQmKl&Os5U%ES0p1OOmA$(^WcJb(Oc1RHovN(#6o~ z8TGd*&C-WX9Mo*}KuKw8WrH!>1xgu=%A@{qA1Jm+U_*4No>1wFd&8BhRG+9!Rjzb? zLvlR~>K|2rzmIgWYBhm;fnl}css;<&2G5{t$|ypDisHtbEu*EHUEE}ywp3%QxFnAO z=;-L74M1n}7=U$c+$~@~g*xP8`e>?DuivHPjGt8GdlhwPIZsO$qU2Pj{jt0)Q&Pnq zmrhP=UJ6m#>najkJyja!MWK#?OWN;x&NquvDb+vyST%xRinPT#GRY`mpQq1){5ejn zWIzT8TFS_@3@Ey)C%9^rrmMfiViH$LS~z}O*QvH*=w_)1)k!7XHkI>bwc}Cy)GA>B z&`hF$%?ezv`l|;7<1X`?U;|>+M}*}bwYH@ypx+17ql;3#thB591ldY=3l&{iVn68= z$Jo$E_7MM=3uXMmP~M@}l=BFSiI3e!uUW#CHH_zbEot@O>ZB@Kk-py1+w<jQSKRJy z63*l}D<D~!fL2L`C4RH(B%m<bn_=D`s|7r`bpe%<ZTU0P5{E-C;yl<X(L9A4e-SQe zm4Tv%ir=BTx<j?7#CtNY7$~aro3Y_*gZ(c$ee~Ji<u7*hjwIvyt*gweB7;}yqb-_+ z|3#SS#;WxC2<>8{cZD6aakaO{et$z#`M(@`NZu6M9Ke0q*$D4<tEp1IsJoO;T5`Qr zPpeeI677Z-xX?i38lv5rdjFZ#%PCW}auv+yAx0XXl9dDDRFCxaRMW?Xu74(;x9b%@ zQ^`DH6&r=B++z?b&!4POaOWPSeZ<8^!B4zKq2iBLY!F4Cgw=RW0o`&52*)^7*38(F z+sS%KiS%ZjW4slxd1zzMj=3wX*X)eq>1AefphcLsoPK+dMvM%1H}g(VrF0kQ{YWm` z$j)oY&gWh9P1|(<C?Ya$Z$%K}#NPH6Gd`8?P2jRz4+oj%ssHjnw@4-EGZ4T^2={&h zC5BfH^qwh}UX%MaQc@<GOo|A!G!-}|a7Va0kbbHf14Xl&TPca&-uis<rdkc9EJU_m zDRoOkMz8uPtE*aH6ID0*jf6YbIv*<L;EJ?t527l+`Pwn9to8a-L<n>Vg?-d&c%WE% z)<YlKmU}-}v<#<8@M=H|0L8-&S?wy;rRbo^wbvTmSp#+Et<r3kqqzbtnb3Dcw5myq zGrhEiQ$u@&JsrR-8m#35O15m~E7H|I>qJ>YcDF}cG(~uOkvUTd;C-e<H8g29!28)y zrO>@tw41}V*HgXE*ZahS%2v76KR`i=U|VD!ng13ef}hYAD;>`V48J9rU1gMq$GyDI z#j5rcH3yqhXtR3-jqq&><zm&}!?gpS>6GsEkam*EKKeSZ59pze9Ne}GXOA~GH?$n5 zo^Po{;!3;S3h(C%*MLzeS<qXMBrWa~*=Qv$q&tIGA4Nk)QPI|}T*4m;|3$?Sdwo>w z+ipCd!~-!e{_BH9dRcS(xQ6C35;rJH1A{g}_0cv*1#@XL=RBB~1m!^>mxn$Iu)1+s zNx-;5>Mv5Bi-cf;hZsDmTWOWUtdOvAm+<tYQhIL0Dz#;gyGfaNb@W_wLkOD$r3Uql zgQ0aZ)#e8!FjcfT$fdh_3GFr$a`knkuT7QCA}Fu^_~u&2O<Kh5RJ+UjXiIXhde7C* zFDXN=(e+QSv&uIi*at;JsX=zLr)j(8FRf81(>(KPOr@xB%|R)$c*AUa`|0?_C(p*( z+fP(K>cp=P(D5%_$=;sp^d<Bl4JrPO**<8(6awJxvKLh|5{7K!TnX^dY!ffvp)Pwk zgrWVPU}@#r5NvA7NEl9^B74&tB@y8@C{CyLC5X1oH*4-<%9P?x`j`{)R-z0-B~d%d zxk6gZl_?fe3T!?oyDFlJX+tQIrjWdMgP$F96n_{p@f(gRhX2_Sfn!*<qRvnc13%(Z z4=NN%<f#qUH`O=SHP$zkmd(oLf=m_hCN-P(py|zxrl-{8xC9%BE|rvzI|8-R7A1p3 zQPxNOTCzPYV;0$=<Z@Gl5mt##AK-xCY5$3eINTRFWFh8w85&E8)cUSc_vvrZ+i5JK zV{@o$!mb{r;DHO4W`n3M$hSSwlppjZh)%B`cs~b$NQeC<#J1|tJ4KBw5B6)2u!5(j zS3w@`ST8&kvP)Q@H>om4lHC1a(M3A606L_PDD*eTL&>Xpv6~k%uacLjzKo&M@A{lC zCkOi<@K_bR_+D)n-D`<Yjf{46wMeLt`wh4YwW@2BAs+0835>{WiP8LTd`i=N(Hj*; zFcou<2kBKx)u7r@U462~vo#Cv3mY36>KfF3wS#OxDOQz38^fwkd_`w@*;AZO;x5BE z{#i$-v;&VyW9d)lkV0t}nLGE1>X(n692ufYgn3kYu#cYP>*O^gmLdy4^f=MP<#Xrb zPqbe+cdG4Tdn|sc?KB;_aPHz$=i|;xMbFNhZI7Qmck$Wa?&qCn#oyAyPK+k0QsXM4 za#6IKFU`)tqOV7ct?>sWMa}jrPw$`9U*)?-LvC)B+Ro_iHWx_-Hwztz)*02nqDyaH zqw3@pjoQ-Tvcw=BMjbN#tG$PO?4O=2$@ZyJXP=IrcNGYkD-#H>2_C3GdVA7G5lC$@ z)u+SRQ^(Y&AY}$By;AC1yhHz0_tBX<E|gj17-vgmCe5fhv0g;#q$MPs#kX{X0`1IJ zL8-X73K<?Hc_s+OMX66NiR7sHdU?OPx1YYDG!)sXKd3iHQ*xBo<V#f{JW!U;)k{?E zH+mFe+5I8aPwLPUC7b$dM50rU==}j+wyNWC^hu;l{^hOGwa=L5zk}+FCyaf@4qS#+ z!ZO^@I*8;grz%@`Aj<?YZ)KNT0SnErgB;rPxMN*iwIka^2UCuc&=f?&jBoOQCpgO> zc=>_0ESqGu*~)?sE?A|I!d<f;6>kl;<Y<l-c{UtaecJY0p<ELy^ixoS@u+Nzk&d>` zXf4=kR10+5OIM<jFpan<L`4U-9cje|Frg@E&@M|p1ZS&*5^H2mMP-<I4*fXH>d+;B z3Hs0)nnU393hcS`9=Svx)A5J;zDHqtbV(>i^;3!A%TA9<k7D-lqyq}#wpUV&`hZY` zgRVqA8UxDo>qpcU6&$QBeRvn%0=mjB#c66j$UdubV#r-8C9r#Ouw<KQ<@CbH6(vNC znro5->Nowdx)B~dgmtPzFCR#IUGC8zi^H*gKwVqH7SIpM9s^f9?E0m(E1;hZm2~5t zgu6;qr9y(ktVCEwbFpxdb$?QtR%ees5LIKL#%<jd_ZsVr58G18D+vs@K?gIzC)QV` zuzD!c7Hqnipm<_n(Oa4lt;qx!Y;kdHwg(j^Jy|5)#~w(eG#5r(@_zjCP1~q+X+RNd z49S*Y0^-S1%ctc%++jMm_Q4<rgF>mX%hhwr)zK3UGl!szl};HHFR6dpSyE#}iHz*= zS_@R;kgCYqTL47?={A=uOWCd@xauS6>HH@;`-M<ZO($+ud-uiB&RsgSp4K2l(W*Vw zzBMG8OnnX>i*K`Uu{S~|cF|Gx=7@Bit9pQry42TesG`k3cOrcVpg!$K2|8r*{B6x} z^2YGVmpTUMXiz$plTIr=c|)CYaru!O*L#n8i&N)9wD;2@KyN>t5u{`dd88^z(cVit zfJ{a77FqInvZ#|w^=z9yel&^A&cC2!=3)lfrDu}kl)RwySNgkdR+O4fjZa?ffE<A> zV{f2cpWW1}`^waRw!7QgQM{Q`Com(i-lD4xr}W5)om+Y{hC4aer*=_!vII?vjVOBE zz?+)<G`elU)I$mm5}I~`ie)O4X(Ki`Rn}4hZ`!Ke&|<q&Mc|VUW%!pgHvHdwfb4WJ zNaHR|BtkmZYDHOC+KV16Fny@}sO1{e*_|^4>;u-%^rTzA%3zh!YZimn;ss~*8LkGg z>4dUvBnsDu<?6LKaV$y*<9>dyH!Iz)4FP8j70K^42mQH;_84uS&?1)3TIzrx7Z3YB zUo?jmekB|Zg<hru3+YEg;$`|<TUXnHzY+a6-fR-oh3eueqApZ#A|mxsog)%O5wWI7 zol22tK|~^w&?yq}u*pI{bm5739Y-{p6ba6fXbkBx5^<zR#2d97>KHC9X>B5rh#5&Z zs!m5er?;?G(<>46F`Zi8t|Hwf1BU(@{lIzbF(-VK7EHtur$qv-XuM0nkXGJE^yp>| zjt_Q~#VQZ9Vl%duET>X&40QNz5L#QL56WrL4r^4yBc%@PlY|vwLr)CU(jRqnnFcB| z57Ds%>b07_%I7cX#qy0>rPF{_E`rx(DctQ>=<TgsmJ}8U6<t7x&U&CX8K%n5ea>k- zdIIqz3dcW8lGG(iR73F4r@!eU4yq__3#5v|wLvv03Fv?UU0vmZc$d}G0s&f)D6X`* zM5W={18P0AP@YjNh`dO`gZMA7AITBtNeLTMG3hef@fx!l2we=v10B9dD+^kEK83;r z*H(hmOEUC>Y$OQBC5_u2i+en*M>N+?HE(yKCoY>71{Y)?p^m{&<}}i$Zg-=#@lO+Z zvWHK7L#}<jIt-e&EDX_MVl;TV7KaTE$pp<QVE#|~AxDj3AiBNlI2nF|(5_gwS<x;% z7@`x*^n+$RsFeqGMGqQPJSDH^Sho}7c8Nka2#JS~DDJDcSR$@i#3@}dam^trj+%<O ze5uu4zPJf&+^QohWM}eR+6OwiuuQEM#?59Cnh)_i2-3BVREvULdaY4^;6`5$(#>`% znTp1g>+*$*=iARkV(sVKo_LZD4}P4pdf`LcWOSig_OD0_l(o<|F@1a(I~Pq$$=;$R zd@7!xnk3kI_TrPY^sHXZ`Ci+Vc+q8M_qrdBKI+(Q4E1FAEP;L1#Z5HzatIBk*IgW= z1S!Ens+sl;5ciE2p>EERHALS;wZ;wIpf5X2R+^I18{;@WLoM<SOEtfNnr~&}%_aOc zkDnBMCFho<n2)3Zq<8H=Sz~hZnZgE{ytN30+C!?X4r((NW);^#JE;4PC-pW?^Q?q= zl+wFs&(wLku&jr!G9m8c*Hp*tTMTZ9Dazdl&lJvAoOURSo5;{Lg&FXwrn`nN`8vg# zWN{gKFSp=8nWz7A3Dje?VU}E|TJ@@jwhbAJmo|BN;;7jz=!tc=oi?3lVB03BW)zF2 zu~Jet6ma5`ld)K~l6(D0=iS5Sj47PrU32D8FP}<JI<+p_S4~#`s`T}x-XeUN>4l`P zDwhqJvgGw+#r@(d6Wa5|2kEc!?)SG5_4psSE3!&3?@!CRVz@8MH&lI;G3HN-e7Rvo zV~^TG#}w<PumiqZcNw6IHmdY3V^O+xiD*nwJr-FR;-z0gd2_Pkt-wrIB&ZwLRIxPn z@>x9k@TOuV%h1jYC;3hU2t%`RrJCX*l>L{r4qSrvf1Y)4!~VZ-9RYjO9<X&3UqU2j zCm-rXUVumX3BN0m*Ok84A9!ivhl2|e>Su{jUEZ2e0rc*r9JWgIUhst^_B?7&hv`F= z!j|2M#b_U251q`dcH_I^uY0GIsv=IT4yaa}O9HPVA)*t*!KPb2)<~Uh>2v$d9Mr5U zUDqi*4yNiuD<|#AH495B?IVu_oi(i%%hc(MwmGT@yAeo*ie|p0t5sVXX^xA!0_VT( zXWl7rz%w&hEPmh-)U`y0iLgo@cr3TxbLkP#I~^{rOHbY_6(UFz0bNow4=%3G(==-u zN(n_;#nGC@hibZpN*<!v2u;a6^pt>yJ-m-0QEKH>9Jk_uRIQn~#!zgS<;7*|hk0|= zx^sbBIafuJ6D{g<`)DZdRhLWBzpn_cl=Z53xxzyQ$W+_gV{PZv2XQCQCx`k+2I)HI zlXQ}dx*PH&?KoGdPE?;5xHjNFTL|4dXl7N8PHUCt*F(TtrV=`!miTA3K`kop_Z3m8 z@6B(ZxT>qr@x`x^yz^L;jkJMfiO)w}O&;2CzxU`C7xn3Sn_Js1(tAX8{vo@IdP{I? z+nLDuXFX3!31mKs4HSqQ*IZ#yW}!E*C<`xIprYxuNyP9fdCMP7C$E=w>(qrl9i8;G ziyB{y?|9e=L6OSIDU~G_U32wU{`S&e4n6nCOPBsKTt$DYUXGayI`lM`Mpi3<Yn(nt zKuJ7xCVElb1Je%AylhkTow$DjZT$qBsBh%`Z*8L1CTUT>0sQDnEI~y+`!Vw@brLk4 zR%_Q%dHN;B>NX>ZWJue5?9|e9z!VX{+vQo#as|JGam&rMe(a^iDwg&{bxqOyMJ>^B zEgx%ktLX{UWP7j#&-wdBzq8ObKyNL4<1<T0Zy?xCI4XFq&16Z3DHKz(S0HITNXzo2 z8iiFcp9(&9g=o{~-l{B+kcz`GfEZ->by(5Mf87{Y3seDq-&OaP-fdtzR)72%Ael`O zES-H`k%TsRNhyQ(+yZQJk0Yz=z-|zqNA-j1`=FM4HK@|MsGpiu!M2M^+GYJ$5ygDe zBm<pSlwvU+x_mk0T<*TycX{yg@Z}dSk9;K*iqLL}k*|asX_E&1RWH=>H;liv_)9x8 z^z(ZBZNOjJT%qHe@V6O%X`hCUr%fR0Z!O~0<`5mGZ5!&Z+B7mkdqPaTp-{6fH{2YG zzx<Fj{a}^aKBGR?ruTOv{ll~XWgobV#N|a=Na$ShB?C_1XF_(DLuO(}1u9i6qgWMe zRbEA~gJZ1F)i7HSk{DYNj0zoiE(dZ0m7RwY<BsS34uBv9+W|!1Pnb{#lMWLlztG>) z<rzVS2XDIO0ou;>qGQ}1VfuMXmBnZE>F$&6arFSb0nn#ax=!mPht=DG!7qCFRL?4x z=q^{weVCX_{d8bXYgAt&K^KWTO(*K~)%E(Q=_0j$N}XxfBL}p80wSp{eEG=BN22`$ zH}#r0U5j(nsSSl2j+155mGZ+*qT@;ro$h;%47;zhCpmcJ$hqX;bz0P*U4rV)$ZN^L z<dvJwRl2N_?rW!O!3L8_b%&n90PSN`m)CUk-E;=X4W<nJSB5)!`e>-2PwzUZ(j$~| z_!<>6)Zab)V#gqze@ge&lg0FR_UQZHyZSrzajAMMrK9F>Lr%>weQ5sB1>|^$*7T{8 zu4G5=k)A#(E$Q$hx+k9QdZb(FsV!u%ooef<dNbVFJEFXNd92S(F*T^{x+jK?P@!}K z<}oejF^A6l@9C!F0<R}^v-AhFL)VTuU9|Obu;<FiFr}mgY}z54>{Gd@9Vh9PE16^O z5o)PgWzuc6(&;oxbm|*Aw*_4^q+(vY)_=XYCDcXTBZGZCL)VgBN-{cHdZ=I5sP48@ zd6eYcbQxX$i>hffCGVoOExNw`(IZDL(xZ+mw6|8b#VES3pDs~1-K`a%g)myhqoHfG zOIaOBYdVZxHd6Oelr)E0r`82Y@jV^A&Ora5uFu=d6IB0`ap%I>#6`L$H14!raL%1S z`^C0cJmx$Uxj<q1DD&wyI?d*(iw>nYA31aJS?6rRiJW=X`9j;7*fA&m41MN(;evDa z{E@cP^sRTC;@ZwcPdyc*OGlkn%6I1MMTfrrZo5c@UOell3Q-i@9IXmF9X}s^l1h%W zw$ZoZ&mKFHXuEhum6<qu-ibKpBIhr*MV~qqIq#f%>ioI07vfZXjEbdeO%vy-miTG9 zdH4j?N^ws7ixhA!JQ+E4N>z0v@)SvbUdiV~&z^f$zeIGNJbNlew{1GDagr?3N>@kd zs;E(PqjKBnV@@n`I`V{)?z}_q<KyR#sANVu=jkWucpthvf$EFU|MX-{H6wcV%*FE* zJVvcNe^IhN-F6{<%!!<DyP!HGasKS-V@FhXQVuGe3ZZ;w;-(bU)w+X3Ba}pS7~SM5 z1v;^K<P?=f>N!)Sz7t0tdz_X~jvP7p=_7P^;zfmBz5YUf^`~NN<TtN(_bc4fz8u=m zO!sB#^om}*jN&}jtvTlNLnhCO&i?D4LwXtwjA5&j7ZhO_<5eU9q>)k5XZJK@XlxId zn`>X_q2reoAWpSK<7Y0!m8e=uI(K5&d9h>21=}u71C&~`kXkmPin_GKCyyLaci>(y za$P>x-+Plv>AifKtX^$KQKvNy&{(X-;LF72?XK%p>B2$%oi(#IhF4x<vWr!8uh%dY z*D=r>(u-4{AwJe6eu}3kywIg??&YO69?9%l7N=Hk(!8l$(}dxE+3QXtmAd3y!sNv$ z|B@u;W%~hX>Z6Z-<YJG0MvpP7lLDKB8`$iX%)xE)CF4ewmbY}4G9u~TO}egV4i?Fm zj77rQi@B*u^(jU0b<W=Irbl#GxVqAr`u`zvjr)iXX?d?pjlO2fNeOjSP<>FnwnC|= zLKPKVYZ}}oLD%WIdW8;QrApa&%NpFFN-Nh0bXNt92ufM55!5XAeU>FLbf~gTq2(IJ zXjgB)gSFyL;ciIq-sh6CS5{0pab*#c%^+B2UoyKcQ`T+{$XiZ2`6@@23*5xYPtEc5 z>PwxnviP%<6@gqzVTqyO-ceso*)%n!InbN166T|!jgN5;uAMc<sjO;B3vxi7GBOn( z+Z`-Xahe))8aQ-w7{&=K$5lW%-FeQ~4i?sv$c0GmB>T!huNAls;w}l!3JRrmn0Ziz ztuWu41p)!J=@eG`Wx)`ft(-XISPmuIN%Y|El*hIsA9f$<q--)E4U$mh@Xcz}6{~b{ zySeSJj8T#_v?U-|AoI*hQ~7{bGH1CiqKveUqNF(VEcnBo0}taUX=|pogGxLEWT-Hl zI8{=7dm@$gyIqBswK!XPfIcedRlMgsKr}v^>Z6HPDtB4Y)YRK^=urtF15#371jLr_ z%z#Y6MO7qz2|RoE0TOAMGd~D$=730hAkU#pK}k<vw9|iRgwtf`F4t95S?Q^SgWy*B zXoruCw{k@uQhMrx64pXZ)4k;S)SZu4sJfD*xi($(t`B-9Ytj24Ts4<Bpo&X(m0E!| z)Oju?+f(|mmj}_F3QIp^d(^2Vr5jZGOp^!Fq6&*YY?BT`%mJsNd}PR!E%T5KI8gov zKf)gBOpk+?SP0Mu0sa%kdu4?mLKS?PMld}1sr{s1pS4lal_^eNj%wToY6SYlt^|j0 zivx3&lZ84~f7&115B$_M-0|e15|-ve19+(9yk&*bW32fEyo6w`6u}-O*HvE5ii;{I zcJU|Y!Gag3arG;?C+eg0k|tIzW0{$TJ*Fa9F8f?;{@`U?Zw7Qu`9){Ca;vA~3cZ30 z7KE3FBpJz5dbRnO^YDoiC)7<}2Xx(Gi<A;gpO$VCO<aQ;VLm$cntfSQ49-^0>`D&u za(aM1mDEL!Wd$jjvz#nLor5D+g8M{2av6L8K)qAk;!Q@hnJIV|mpV_BOOtu{!EYKk zxvNvkHjTa^)F&sGXdXXyHBqJ-?ql%Ec0Q4=?`(Thl3&`=wy8>??-)x9OAmef6luwm zKLxcrDkz~^Hc_vt=o5#a&!YL0;7Y%WE=h6_+Si5Da4Q7@>XYolbO=5}3+@p9Mh)$h z*`05vB5RMgCzfmqmncPviI!zbd=eEbDSt2Z;3VY|KZ2xW71x8sR8M^7CB13)HlaT& z_>{h6PwT3z@V4y3Scl%49Nd&oVApcVwwSs;Ze#Q&<lx490{fFoHpbLdVPiCt(GhX9 z@r7Q(x2tpCl3g|Qw%QoFZH-xHwJ*5o`(}FWNlE!DP5p(5O>driAJd24v;ppA!=Jt) z^yem}i!hJrbkhTh(BF!dF2X!Mra!BG`On)Sg118izUgOgj)!pD$L@D*-c;t}rI(B` zy`*=*ieU;Z6*-#v(!b&ifg2qjHP-`jO7k)0VK+ZGkJCwQv^Nu!N$(GeWGUWaQO;BG z?N|uzB44r^=?K$JvIoB;!u>_q2B3^G^AfGakFrU^BdcowQ3HT`(}bify?H{C_%~5J zu6-icPKvT4zpqI(-cF%`2}05@pHyxufIJjMVvtoBIVv=O3N|SO?v0S%Fe;=ihJ%A0 zH=QcI??N6j{wnr}0_zIsn&Ryp<=TqguAr?!DZM6NSzF22)LXvd%^H>3MUkXIrcvB} zQa#=%($0`_ox!YE;U*5zB`ew(JMB^>&srWHTG4JP0vZTYHnn)Y;*uM@e7iA%NzIqc zYPeK8UedZO#n}D=D;AkIZ3IioPpyC)<3-fL0&*_9o1~nT6z}FJA)RMy2u8V*BSCSQ z^kvn-Ysst&-un?Ogg2G#Dt<yklp&{5>f?l5k;@+WQ8`(QcXI?wTAU`x*`QtcBfQV& zKyV#sjh=eU4i*1ArzDCz`#XXg<4I(DooOP#HR8^+drm-+DvxXD3A5x&2m4805dww@ zsnIf|sjHkm-P=bF>;SVb<$%UopqfMns?J@lUDYoqtZX?6mQ)`5l~lZY<xvO1*&G3V zYBsHqOrOwZ78z66k|ct)X}gq&w<Oz8c3Kg0VVTRTn42lXL2u&Ji#U<ZzQmR&ewl3s zO!v!0NfOwiGG=e2a<$7=ZMDU97v1A}2o9i1D%~n0jp6>42!HELl7m#n8*pq>xY)y} zt<t?TA}UuR5g$!<v&ZJ+$gW;Aee}&XrWr30EO`1FP@aX4EBS%66tsnh)?Wk4E=N^n z$4xL#VK<JbKy;!|P7`sxg~otM7R}9;cgb>it?3tgE--PWe1~b#hM>a%sQktqk=sI8 zq8Pyso;~yiA8VtwZX3sye+>FidwWXgnMQkhSQ&R}yDYUGNII*O-pf;|mc%yvz|K&z z(EPe+=gZ+tqWtb5X_A#hqF5{Nnu_EgP-BmjB>(80qIVko@j9h~ElAR+|JH8N+m-%^ z{c@1^VfGwV)GwMpAEf_b>aMUOsCEL4ss4~?Ik5fzeeRduFZGGH{viJRlc7%~NQFJ| zG1-&1PX&)D{L~IAIE`E19m6XCy#B8IBh8k^ODeT4Acfi%>icKPtXsJDSOp8~N?_$J z$<_yYX6~X6;~-bEpG&xfl&rTgON3umMKPtik+PdjUbY*##L7k1ep<!5y+qQ3h6^Kv z-4<f~;saablB7b@ueg=P`?rFPr#OwZAMR4)FJh+{ucVaJji)rfhO8f~cAiyY`8|CD zBg4V6yY_>LhJaJOk?c^f$y|l$8=W9r>D?~8<Se_!f`#-Yvwd9jzAa$Qr|8`uo#4=O zgU&K|SnWKMfb1J%)s%5j{nA(+6^T>)`j6ign!2S@qrcK!bl_$+QJI+9fe0$oFtv}( zHie6<7%B&DXfqg4AJ=17n~3gbE>m+EVbxwYAi-5?#ln`|@h0+dKS)F=feF!4Jt<os zYfZG39PFce<2aLAV#g|7&{nqty8m#FT4j6Qq)pOD#j|{?z-QGxu#$vZU^!XCtt5|8 zk=PICZxj^w=k0NSob7S`Efaoa8Ve|?%};t?+yfBt&l}>1QU1IkPHlK~ot_4|I*`c9 z*#4n5#Hn|9|9{^Pcaly5qeHBsbS6c6+tt4QLG|H)IzdV~h(nK_R7W%Gb9VX%ubw=o z56(LI)S0$e<YMGxEJ;VnCA*^Zt>L-Bema>-9nyYc_{Q*&BN#WUPu4vC*rzVhWsRXw zEgk)*|LW@<L!ml-?_(&`fUvock&YUqBLG#ph`xN0{_2|>L!nkWQc%UWqMTNfuC~=& z*BGje(piL*pf*~o?{B0ZbV#6%XhcK|DPo)=X3DO`C6J-oxT&Nz-heFeR#QeiioZsx z+PIOrHl9F2a|LCHjwmz{b>_y&P+gNLvaZQUQ`cnLUDsTXgz79q60@$^G_1b4&OE4> zh-Qw^w_1i88t}IzY#ubU8mSsuO?w)sE7WD1p$6&;^B0vhpidg2rm}{Fk*<-&ZVVY| z8gZ3os4;BhZ48?pXrya7RgsPLt)`AfbD?Lbu?Y`i=<dcCa>R^ujnvy(sz&s3BlmKn zxqCCz7;oYfM!Ajg2uGMQnnI?9O<|+TCS33tYN|J4Hbqc-6WN85vxzjQYi&yCTSG%l z)MP}MrZy#z)m--(Y7V1_W^;=uMVJK5VHDL|Yl>>FHNDqd3v+3PkvFSzEUEHlI>%Di z)m&@jZzk25hz4U=%`s@ZIc{3i95*U!j^jZ~$V9XNFfDbaTU+X(<d%9<SxddCqosi# zG#DkfG{W9n8jaj7O{T7vX8dhMk!&|DQPZ%ND2gPZwAd{qm1<Z^!q|T#gt{V-G6Lx$ zEM27Dh##qkZX*yk!Uhz9+!2ynl^r2N(v?LZW(3fQkhtbSGs=YA5tcgw^Nx^to0L)0 zHxV=>!VQU_ArVr(NeKYAQj3%nt!PMVow2x9ZcuBz>6=!F-P)ipjt#YPFSnwXTOnm@ z)L3FGWKj3msv4ppQ&5yHywxH^0j+2~3^0nWijr|7h0#Z}0R|UE<x#FYiprx<Z4_M; z1vNyYM%rjJiXvGm?wKfhCdQNyLyyGjVE!?5O^mxFhAxSrOJXcd4AR7+20<}q-dN1E zJw{}q`XXLudOcnTaK>Tnaq0`5fXydfZ!9m~iX1d9=)Q@!8di+ALd-at9!HboWD6!G znw$tDA_1T$>I@?!>I`rab*9J!8KTaaXfl;2a9MFEK`gGsOEg1e36OT8Ifg7PD60j? zPe81M5i1-bYEXrTY3xvC(O&~L`k}MZUz3%7=x(IHl10lC4mFsT&<`y!{WUff4w+#! z96}T5hn6@@++=E_;m1@@P0-bo<oa(5{w6dzgzFkmX`Lbba8np^Hib=*O)Pj5X;Br? z)W9hkG;M^NnmD2f5zt<^sa1D9{WZv?AEx>ybW>9lozO&#sSA&p-f1$!3!MdQ^iDra zPIWl2O4wX)GBk5bo6*wdi0Q1BT0=PDmRi#%EkxtGPg)F*hg+y+s;Cy$L<?a-MMT0# z86jIT5qMyL8IG`KBF4`NN1%`hVMJ$WME^$`O+QDdYjow2CXUby6plnpgCp>G!Vz>) zq}4RE6^ISDhD?iFp@-HwW1Znv7!b%U+-k@<+}en~YlU7~Vc_9b!z1C=2sGCkF^Xy> zKTV6-ie7Aua2dvP3%8n4o&IvlxasfKxKU6moTqSWLSs1`tu>?+j@Fq5L|O1Cpb%|B zS<xm_Ml=T9MTuHee@2N}v|Leg>U0E%EgU5|Oa!tT-zOYRaG41sUyQ|wH5$Cds8*FT z)`BL+44Z~yMD4n=7-vmz3NxI96VOqDa_E!^<EDlaL_&x#>P?Uxn+W5Th7;6HCW87& zRj=+NHxXv^rDM2FZS+H@pc8?$p!8R_gwE5}K%~Fgbm*@cNa%+)nOa2;sz~~Ql#Rwz zC;~;ALAaLuCM85|sD*R1X!EQMK?C%IBaE1}A)^8MtJO<?jSbNcR0apIHk8o1s*RG# zYjL37+9*t<Hfl_yHU_a`5GMxLy*6e#yf$8|<s?5`+i4v)nSN-s)BW;>%;^VG7%bO? zz|izVtDXLu?xi2PW%SpyjDG0us|yh~DtYOLjv#kPml>&tP0<fsE1_N&5ot8?N0hg$ za?%fNxAfQ8E&V_a)51t2Rc=xmLZ%4A?es%8HPT4EXHu9>A_oc)P2|d|N}51Z^uuIn z0_8=TYPD`6O~!kVG&O4rqQ8c2>4)x&NE5fH$(VYi*?4^P*VLi-SJlPNF#W&-awfHS z&Bi;6G(%^RX2{!YbQfu%96Du-(N&}cqkcsBw5sqH@Dlwn-PY2onIh8C%2|yYKoO?H zTcW1LEo5uD1j9;^2wZdeVN@4^T|^>=?CGyzX8K_o5-|fwBvNmRR*tGF5=0$Q#H_=u z#?C21+d2I;qXhjhy{i~oH#B01B%(Z6oz)CxkqFH<O#;J}kqFIROoU-AiZDX8nu$cD zwE;O=&G1ZBm<B8QRYik!6Rlz0-b5>;B!5KLoruF~=!fpIL_DnfHW7!h&<{MIah-}x z#K{fSe~tbUiIAol`fI94n2A#&K_0G3moN@)B4Ii%k$@%B4^wc$_?`)h(5<B(W;hLn z4UWiL0<DvCgh7pd!7bw1NSN*`FarqvVD~0s>{LB7J*9r>YUxKEh5-7-Wf{Mpo`Iy) zFWu$gP>g6*DMS4-V{#|~pFJE(G?;NG95Q}$nA|m#9u66AmZAvUx&-pWbnjCXSu&!? zmR0E#1)qn08L{Yx8N9+F<HUw3l>xi@Wro0TnEe;}W%`ePVC)Eo;S_|!80*92F`?!# z3qu|ON5Q!WhuHz6U)uhuOtJ?fa;@>-DT+(4<)NFROdrt?Z3apf)9>M0(l-jAnZ9l_ zFQAZ|+<$eLcu<s?d8js^lj|^EQ55{Aa2=?XqTuU>>qP_gP;0oJTpv?)y_vm)DGL2w z4__@@FFL6=$fZQAiFzK<!}Vr@N6)bIq<$Iu3pW5|Vfv-PqJF^s=ogf!7H*6%4O~_O zji!i#gBxxnugF9-!b&L$B{WjI@Qk~rksLDJrHydN!j0@X(k}?pXqMB+7{Y8I7$Yc( z++kB@6D@G)qMF3An%J_M#R!^N(ar28hnrbYfo3=of~F(V90fmJd_*)IVOvq_2Id)- zHNxamLr)Q`rl=^iHA2IckvY=BsahC*5gOrjSy3z-ktrK)S3fval>0Qwwi0dOj)=ks z4@V<hPt>qJl_08)nn6iLfqm!~q={je35R1`b&NYnO{|UZF_s}FdX3dX2QluE7+f(b zidF)3!(uI*$V@xK;W!2k^-GUN;l>F31@#M2t=u7vYObJ)YHTGt(!$U$W6X_-W*Avx zf_g-!O0>WxDawGlk;V^Xq!C1?YK_8i3ezvc0j*KGQbrd~zfAG5a3dyD^b4N2;wYUe z76!@F4|cJ`n8L=wJhP);#tvdMTjGqcej;sXk$#zG$0E#~F^utH`oYEXge->jCwgXP z`}9L50ui)27Ks?Qk{+5B>oAR{Xd?YGok~AoWpTLblnSeg^vn2S>IYg)zl@~x1B6V! z41VIxJoTYpD87Xnrn@WNV%9^$i8`K<&@ZhZC6-nT{lLIZzl^g<!a!#FMXvXAM{6z* zoYMdK^dm=4j?nF^xK{uR{N}xK4c&)Q-9a~2ea@+lR3B5JD<;%xLY*cQHK8sOqWjZS z%A^U!O{m+15+-!jgq|>=YbNxh3H6vzn+bi%g#OBeo;RT{m{6|?oid^8CUn|_`b_AI z3H6)MSrZyCp>rnmcP8}LCNyY5=S^tHgf5uSunAo>p%D{$%7k7pp)Z=yizf863EeQE zXH4j(2|a5<UpAq?F`-|+WrDc{6aLSCHsSyLD#HJQ@YfLjSA@Tg@V5~jMff`izk=|; zA^a-B-$nQv2!9XZzeo7{2)~B#4-kGG;U6OW4+#G|!rw&rM+kol;r~GR9})gB!v6!| zpCJ4O!v7QDe?s_8gvStGL3kYDpCUYg@XrvQL>T@1pHm3`9M7i_P9Z#ta2nw`gfj@w zBb-I}7Q(j?X8pa5@FJeyL3jz_cT9LSWx{vAX2N%&@4KT2L%(-lMHu?L`}YV#e|KL; z82Y;VO@yJJyZ?wV^l|qMgwg+Z#}Gz;-<?1h{d;!`Vf5$S8HCY)cjpjB|J}WXF#7B6 zBEsmOyUPfpKkmZ5@BTCT1NMCPUlE4=-u({3u-CiaMHu#Z_xlLL9`F7TVc6f@A0Z5T zyZd8=VP7DhyD+D_D|ig^x%)GOe*y7-jxfyQZW>{j!`&>xQ2*VxO?dUI$o~$)UpL`Z zz<c!-gaPN(Zy*f#uD*sa;JONRuR`6cQ1>d-y$W@&LfxxS_bSxA3U#kS-K$XdD%8CS zb+1C*t5EkU)V&IIuR`6cQ1>d-y$W@&LfxxS_bSxA3U#kS-K$XdD%8CSb+1C*t5EkU z)V&IIuR`6cQ1>d-y$W@&LfxxS_v-&d|3lxa(Dy3zy$XG=Lf@;<_bT+g3Vp9a->cB~ zD)ha|`Uc!Fo~%Lr_n_W2pnVN!Ujy3Lfc7=0dkyMd`<7Av8rXJi9AU8I8q~KAao3=( zHK=QC-lX4vcxy`tLmg{S&l-oJo;9dv4eD8gde$&ntbNaP=Nh_y4c)&6HedS*o`ap& zeu^;Ic<n8O!M<x?$2G9&+HE{Xcdq}!gxAqu>*%j_z(vC7zjgHAI@nUefX_PMvyT3i z@c%IVvyRbg{htuVXtj?1Uq}D1PvSX7qxEToG5V~}B0K~6p^tTpHtP#`j?rZua9RU= z*8!(>z-b-&T8F;Yp|5r5YaRMphrZSUr**(-9dKF)oYn!Sb--yI`do)T*8!(>z-b+$ z@%o!+58xzWz-b+DT8Dnuq2G0krt2BxhrZXL?{(Jq9rJwSYo>oTzKSsLvjO~Uz#cYW z4;vUQH!xamK>r&UEjOV54d{OZ^tl20+yH%Up#L{OpBtdh4bbNX=yL=3+W>uTfIc@s zpBupA2JpB6`rH70Zb07~pwA8HdjtC3fPOci-wo(@1Nz;7em9`s4d{0R`rUwjH=y4Q z=ywD9-GF{Kpx+J9<p$_-1Nz+nU2cH>Hb8$H(AWJpp|E=(y!&rrz`KV5?;Zxcd(hB5 zXy_g^bPpQ32MyhWhVDT__n@JB(9k_-=pGPy|4mTNJ*e#doBv^K<{mJ6|4lUN9+bGo zA_2r}ED}Jx1{e4ql)A<uG0B1y?m?+*Fp_%!^@mIU4hi7nuYo1*0mUCKK@Inqc40>M zpym&kz(e=o#ecX2Mc!i~2C>|O;@4n!_u#gFxCG7KgC*R56Q*<zj{Ap8+)uEDHQ3@k z*uwocxd?!N4X*AzfPHNl%><b5zX|L76^vmG*7+;g!iUT7Zhi$gul>N3@GBU{hfCm> zU-5Vd5q`zi0=)m~9}GXNae7$K8tnB~;P-o6A#7m{<H@gpzYmu<0|v+smtZWv2E*jQ z*uO@v{F<KwA-_fezlH<xYmCUh2IFmF1pYM;v<blc8lAQYyyT#k9E>ps#O8pH9OhFw z7-tSz%fUEvkS~W3DhH+I#!VOJAa4$~n8OI2gX!g<)Eq{z97gOM3@eBB<zRR@%%^f- zxEvUt`zr?rDhI~Pp+9mM@p9-7o)72HA2}FV4h~ihjF<!C<Y080u(2FQ#7&GCxqmV3 z-Gt5MzKt+UPQq}&bFkS>*7v_5Jv@vYY<LqUnu7<l2@B1EaW`S1Ihgb&EHnq;Zo)!y z;D$|DXb$|g3BJpL-!|cq<Ulr?;5*jmCg_g)e-k5;$O|%){sEb7a(N)LP3UhEWVQ)? zZ2}>iV1-SLP@B-lCb(>q`yW)c37Xjim2GnWV#M0y{seJta{qy+Ho3oG|C^x7P1yS; z7-170C)?L1+du0c_P+@Sev|PEylr~yeG~S)35M8Y{K8||LVa5x`z_SB1-xyczAfNw z3-xUQZ(G3I7Vx%(`nQ0$E#Penc-sQrwt%-S$hQT3Z2@mv;HNF%Z43I_g8W;++ZOP) z1$}M-Z(G3I7Vx$O{cZtoTfo~k@U{hgZv$^z=<jXdZ43I}2Hv)Szir@c3-+)Lylnw* z+rZlv>|+~v+XCLUfwwK#%Qo<~1-xwoZ(FdRZQyMSc-scvwqQ@&z}pr^!ENAe3-+}Q ze`5>o#WwJ_1&?$a_}hXrv5gUC>+6O;wkOO8wS^hrHk^$uj9}Zq>lQ|+ZQyka{J#yn zZed2VjTyxj#)EC(cMIdeHf9)G7!S6A=Pk@2x8a;@fp4~f?=5&5+ZX`1z(3o-`xf|O z8+hMl{R8jYtZ(3boAnF4Z?isu_iff6@V?FZ0^YY-KfwDo>jQY(#`wDpd~IX=-3Fev ze}?`Cezq|lZv!veDLe;0wt??$;9>hVp2PmPF<$S$-glt?9oW|n`g;fVw1fWLf&J{D zKX+g+JK&EU*vAg|Vh8rH1Af?n{&&C!JJ9zI@V^87?f~yQ(B}^Dy#xL20M9$n-wyP* z1O4qle>>3M4)nJJ{p~=1JJ8<_^tS{3?LdD!(BBU9w*&p{Kz}>X-wyP*1O4qle>>3M z4)nJJ{p~=1JJ8<_^tS{3?LdD!(BBU9w*&p{K!3a7r(NK67ksn}eC~pOc7exT@Xapp zw+nvR1>SbSC%eGcF8E^?c-n>jcVREP(El#<zYG2ELjSwa|1R{u3;pjx|GUutF7&?( z{qI8myU_nG^uG)J??V5((El#<zYG2ELjSwa|1R{u3;pjx|GUutF7&?({qI8myU_nG z^uG)J??V5((El#<zYG2ELjSwa|1R{u3;pjx|GUutF7&?({qI8myU_nG^uG)J??V53 z!0#UPv4`<#4}86c@n{eHyod2;4}83b@n#SFy9fO50sniz{~qwa2mS8>|9jB?9`wHl z{qI5ld(i(L^uGuF??L~2(ElFvzX$#ALH~Qu{~q+e2mS9s|9jB?9`wHl{qI5ld(i(L z^uGuF??L~2(ElFvzX$#ALH~Qu{~q+e2mS9s|NC4&W^DWaYR1Ps=zpK(`KjUG{qNv8 z>|vkf!wTX)X2yH4kA0RG{@ecdkstQ5&+@|`-2Wk-!+!R;Jy_w`$9!xL_O#FK!+dTZ z^RYeH*FLuw{^dUW#eLY@KJ0%V{Id^#aUb@#4?OIHkM`j&?!zAUfscLg(?0ygec0zd z@UjoS+K0cm4}0AQe)hp%`|ua{VZZyp(?0lYAO7M#?0Fyf+6TYw!(ZHoeeVNr`|uZj z1AlQJ_Wm2-Zy)~hZ@|a<u>aoxkNfbKe*=Er2OfR{eD1?v{tftgANa_R!a>WgpvL?t zAeUc3o%vBXY55h@njZxW^DC$~KMF@Jzk-_cqkv|91$E~~;jHCXq;|kHzXE?fKMIE} zzXHVOM*-pd3VinbD4e$Z3Q(LM1+4Qc@Z0mFaNP1MKz4o<P|vTxch8T)dCRW=?fFr_ zKfeP1JwN)-#^CcSV1WE6Aemo*51$_eDDx{|h5RUBnO}h)pC1J<^DAJA{3xKAUx6>5 z9|bt`D`1cODBzi2fj^%g1wivFV3hnQAevu+PoEzJNb@UTnfxeVnqPrmpC1KK^DAJU z{3xKBUx9C*9|c(RD`2DiDBzl3fq$PL1z__l7@_i`fNXvRoRuF1X!9#zt^6opn_mHM z<wpVB{0f*WKMLsPSHNBQQGhqU0`|&}0>1eb@K=5m0M4&~!SbVkaDD|GmLCO(^DAJn z{3u|WUja|$M*-CQ3YaQC3aI8+z*YG-xUM(2?Qd{hZ*be+;JV)6w!Z<&$iKmDe*>hE ze}mip2FvpXw|#{tk_^EWFaytw^DCeRo{HvIzzsat%&&kPc(R#a0Xx_T&;w5g^D7w7 zdA^cgfrIzq92hYF7TWybBKO@}kpBLgZ2donoA==|csHMd`1ur=KA(cP`4qT4pMrS# z6xckUf;jn<lmiDNp8{j&Q*bfzDV8t=CnKK%E9X;iGx90$a6ZMXmtr1FF~_C2%Tvr~ zDdxBo^H+))EyZk=V*W}oH>H@ZQp`jt=B5<$PKuc*#VnIz-bpd1q?lz=%pfV|loazt ziWwxu?2ux<NHG_rm>p7#{1kIRigBJ|<fj<bDYo?#V>rc@onpkM*p5?-&lDpz#Ry3; zK2wZ`6r(Z4)}MkGkxw!9QjEql+fSP9C(ZVgX8TFA{iNA`(riCzwx2ZHPnzu~&GwUK z`$@C?q}hJbY(HtXpETP~n(Zge_LFA&NwfW=*?!V&KWVm~G}}*_?I+FllV<x#v;Cym ze$s3|X||s<+fSP9C(ZVgX8TFA{iNA`(riCzwx2ZHPnzu~&GwUK`$@C?q}hJbY(HtX zpETP~n(Zge_LFA&NwfW=*?!V&KWVm~G}}*_?I+FllV<x#v;Cyme$s3|X||sX+fRn= zC&TuWVf)Fj{bbmFGHgE?wx0~!PloL$!}gP5`^m8VWY~T(Y(E*cpA6eihV3WA_LE`z z$*}!o*nTo%8?5CF>pdeetoID-J;Qp>u--GQ_YCVj!+OuK-ZQNC4C_6^de5-lGpzRv z>pjDI&#>MztoID-J;Qp>u--GQ_YCVj!+OuK-ZQNC4C_6^de5-lGpzRv>pjbQ&$8aL ztoJPIJ<EE}vfi_-_blr@%X-hU-m|RtEbBeXde5@nv#j?l>pjbQ&$8aLtoJPIJ<EE} zvfi`I8(HR!Eb~T|c_YiVk!9Y<GH+y=H?qtdS>}x_+fSD5C(HJeW&6pp{bbpGvTQ$D zwx2B9PnPW`%l4CH`^mEXWZ8bQY(H7HpDf!?mhC6Y_LF7%$+G=q*?zKYKUub)EZa|( z?I+9jlV$tKvi)S)ezI&oS+<|s@Wb-AS?{;mqHbf3n7<8AEPtCV;WpdYZOjw%x8aNB zZ?kROW~;l6xnlk{ys`XkwwBv$hqp0b%-`nu+ilkSZMLY}JYV{M*?ZUSxUTa|@H>A+ z+0BHMhomUkvSm7U1c9K0m^TBEWwq(S6oCR+5pG5Sq8Qt=W+*e$nVumGVGVo0MU*-u z+}-K1(72^D@!+!7Ac-R{ha!P^zSsF!U*MlG&%58}+2_;^C{VPP(zZHn)_$?iKKtzV zy5D_y)-``ymn5u9#@01oTG#w-U9zz*saw~4X<c)nb@6mv(z33($GYZ1>*Dgd<Y!%T zk9Ez3*2VXANz}UL9_yM5txFQtC1dNFd#r2ju`ZsjOIp?y>#u9>u`VvJOMcdwv#6|V z?y)YuuS=rV71OS3?y(*vK{B?k`M`!`V?(mBA=%iFY-~t2HY6Jxl8p_?#)f2LL$a|U z+1QY5Y>3Mn;_`-gx*?u!h=UvA;D+qRhUT{$;^~HXx*?u!h^HIk>4tc^A)aoCryJtw zhIqOmo^FVz8{+APc)B5;ZiuHF;_0UNwIQBvieDSz=~f(P@pLPWvv|4{$5}kxisLMv zZb>gT#M7-fhMMDTNyav0Nwy?o8=B*7#qp7C*^1+%Io?+ME?Ju`eb=VsXZ_!3KR{(u z614soDNQo8{=cR)NzwYhO=*&&_5UrUNs`w8_mq~}nUt1Vnv@o8&3{U1lEd}CN@>yF z{O6P=>0JN6Qd+b*KTBzn+4T=on({{Liz!W#y#8NOS}MyaEtTe!mdbNVOC>s`r81q; zQmIa9sa&VDRI*cAlx@k<W|VEo(k3PO(M<XnQxTD{MP5JpcPUA%*^(RB5@WVxAht9- zTT=Bc4bGNSeM_IWB{kksha!KI+nmiOKc)vxZu85M+l(5L+x)WRHnU{OZE9_Dn{h;P zn@uOTnI}kYQ)`pkj4YDd)Y{}Wvt-F_YHf0xu|{&6TASQvmMpnVtxaz8Q<K}&+T=Dr zHMvc#O>R?bliSqV<TkZ7xlOH2ZgV)2+tk|RHmzE6o9sz$)2b!688sxgY1NWHrzR$U z&OCK8ONJ%yGeSvb$*|;o=CYDm>QVAO<t3S=7A5afUXoerQ1U+QN-|3gO5UekNoJ`( z$@}zg$t<-ed7u6*nf*UK&zZbW|CY=$qD<bWe@kZXvCb@G=VX>KW-`nCd@{?tYck7d zI+<nEnasv-XWliLWqh5?G7e2<nWs-?DXhsXBkp9D!kWx7SD(yMkCR#Yfn=6ioXpY> zB(v1vWR`v)nWcy)v-AVWEcG{;rN2#PslCZ8{cSSKylXPcSS*=kgqzGV7E6|-1xp&A zC27Hu#%D=du%z)>k`^p!e3qmIOB$agX~B}lXGvPHr14pj7A$FemZSws8lNR;!IH*j zNm{U^@mZ1<ENOg}qy<YFpCxI*lE!CATCk+?S&|kkX?&LH-;yQHb&_Rzw`7TH4aqWn zTe8I2PqIvFmn?CuAz79-Epa}SEYqtcOI&M6mg&=yCC-qNWqPz^iE9nXGIN>95{+iE z%voKsM5CE3a{)V9VvLY1bDozhF-Az1xu~5iF?LRtIrB@F7<nbjvYAVqX(h{?3noj9 z#gb*&ge6(gW!Z!!S<z+Lge6(gW!Z!!S<z+Lge6(gW!Z!!S<z+Lge6(gW!Z!!S<z+L zge6(gW!Z!!S<z+Lge6(gW!Z!!S<z+Lge6(gW!Z!!S<z+Lge6(gW$F8J91UvjKg!fC zQ*r-MHfvd0x*WfOYaz*U>@in9lI7SxY2dQ_*|M~2nfdob>GlMP_;8vtQF=W=;++&p zArkGRNaj|gr7My!B+^+&^0XoiT#@vwNZ(c@D=X42EY5{fsEO9?5-i1$BF(|V8!6Hg zEVGd!t-zuhDbfKfp^+kq$ATFtl5Z@Jks@ivVi+mn7M8w9k)&dwixkNvmbFNc6k-vJ z6v-TxtVofBVS$Pi$rF~NNRjkl@re}X4H7Ihks>Z*VTlyx4H7IPks_~*MI%z=gI8o9 zwR)6b(TH{AU$I0)iX?MYmTpz@vnso`D*0KJ{H#iTRwX~HlAl${&#L5SRr0ec`B|0x ztV(`XB|oc@pH<1vs%-J9<Y!g#vnu&nmHezqepV$vtCF8p$<M0fXI1jED*0KJ{H#iT zRwX~HlAl${&#L5SRr0ec&0Uq|u5yJkS(P1G6_;1V<u!Vp$}P3LMqX5I$*QhtMs-W? zS|fKVw`5h<=yfW$B)x0oSLK$h>KeUH<(A}mjU24pl0{mh*Qwl+gs+jOm0Pk=YxFvm zTax)Ta=CI#-@Zn#Q@JHASR>ynw=^1S^g5MW(u*}pLgkiX(=~dX$}MTi8fBw$i>sK) z8of^CRvcAIOXU_<F_SfVoysj~(;DTca!Xcpjb5j6OZv4&iK^UE)VoHnQ@JILTceCs zZYk<rqt~h2k}FuF)KzXN>RqGPsoauQu2Bvvw-oiR(d$%hNl(`(nU!0Lde<~<dQY0W zMp>=Ar>JgCGs^d*%WIV0%6p3H))<La-jjB((H>UbQ&hJ`dsul-G29w$UFAJSTGcs9 zZ*`9Ssm@VWt8;vNb&ir*o#VTzbCkpC94$$8j#5{hqa~@%QO4rhZgq|lRh^?Hsm@V; zs&lj?)j3K_b&i&#I!D>4&e4)o=O_u)Ia-qH9Qj_Iqa~@%k;~ONT9WD<d0L&LC8^Gl zgVi}&lIk4!Rh^?Hsm_r*)j8^Wb&kBK&QZIoa~%2V9Cf)m$C0njQFE(v^hDJ;>S=Y3 zo~SxUt*p+GJJmVrVD+B3b5Gp4C+^%6ckYQh_r#rh;?6yB=bpH8Pu#gD?%boDuig`P z?uk41#GQNM&OLGGp15;Q+_@+2+!J^1i97eioqOWWJ#purxN}e3xhL-2*ErwTIN#Se z-`6<b*ErwTIN#Se-`6<b*ErwTIN#Se-`6<b|1a)gtM_Tys`qL6tM_T6s`vj|b!d^Q z_y0x|+MnwEzZHenrh5PX5rwv;dY}HidY_i0dY}HidY^WqIxoJ@i|_N|`@Hx*FTT%< z@AKmOy!bvZzR!#A^Wyuw_&zVb&x`N#;`_Y#J}<t{i|_N|`@Hx*FTT%<@AKmOy!bvZ zzR!#A^Wyuw_&zVKoR?P4ODpH4mGjcdd1>Xmq-9>xGB0VFm$b}FTIMA!^OBZ%Nz1&X zWnR)UFKL;Vw9HFd<|QrjocC7e=~JrnoaI*M=|QUV;_|$>To#wh;&NGBE{n@$ak(rm zm&N6>xLl_1u9p9;&jPAt@vAI;mBp{J_*JHdt$q+&7Qf2kS6Tcji(h5&t1Nz%#jmpX zRTjU>;#XPxDvMub@vAI;mBp{J_*E9a%Hmg9{3?rIWoczuT3MD>mZg<tX=PbjS(a9o zrIlrAWm#HT7Qf2k*9YRx2jb2LjJ~QL(8E?gV60XBfH{%s2b}#?KVaNa{V?)^(N6V4 z=6Wi3G(I0LyWObVVN_ZDkhz}99gWzBv{98ij4G=iGS^eNqcQxD<5RiAsIvMY`%}52 zQT>o3R=LBdvic!&J(W8e=MOoCl{<_os~=M4D|e(RA97SHcNkSxKcp5^?nrk&<TzLE zFsiJ6$Xrk5j<o4Rj(p_~qsr={qV79Ol<-CBPUQ}x%Icz`?mM#Bi{w}3j>dUWQTH85 z%Odrwa!1@*RMdS(^0P>dtK4B!SzT1reMb_tNK0F}BMY#osQZp&Y>~FNaz{2{QBn6D zN!=o?apex9%Icz`?mLphMcU`e9Y&SaMMd4yvLuVN0F`M*mDNQ>-P4lZMap4ino(tS zQBn7_Y{DX~dS#kXWpz<e_q6QKBJD<HT3WEEsC!y|XOWhqGA+GWRMb5!PqaweQkj+= zTU69NE#I_AYg3t41iPrHds^OVk@lxD&0Jx1QBn7_?BOCUQe~RC!s?=;?rB-bMcSy! zG;@X3MMd4y@^Oo_T9xVlLz2lfQe|3Jbdh$fGR<6Jb&;8+%Czk2A}w2Gnz_R2B6CfZ zX<6Du`liY>bA{DK&S5Llvb~G+R+VYy3ag8p)mElujTh;^D$~prRu^S|re%K?Wq+n+ ze->qbre%K?Wq+n+e->qbre%K?Wq+n+e->qbre%K?Wq+n+e->qbre%K?Wq+n+e->qb zre%K?Wq+n+e->qbre%K?Wq+n+e->qbre%K?Wq+n=fA+NUzK1OeA<wp_mG`}Mj>eu= z-uKoy8hcuK-&^Ns>}lnFZ=IvDw?S*Ohb;<hnbu|xTNFs4wb|27i9Kup2pOThb&kd! zHUN;q(b&TV08%&_d)NR#3P)oP8vsb*XzXp!+U#kk#NGz2&7O8j>}}B6>|x6Udq``u zhb<GN(Aw-_%LFO3Hhb7IK?<$S9=1%7LTj^!Efb{B+U#M=1SzyOd+W5udmFSid)m3N zhiwe}E?VQg4O*K$?cDgyPkurr#4lP+{GuA-7wsl~Q4#TrmJ`3Iiugs_iC<Jk{G#>5 zFRCMc(SG6=6%xN_LGg<!iC?s#_(i3}FIrLjqFUk??I?axG4YF*6u+pN_(fZaUsO)~ zqBX@YswaNYp5hl36u)Ru@rx>oU$m+CMJ2^AT2=g_n&KDjDt=K>@r#xfzo@GCMcayB zR95_=b;U2LD}K?w;ujSbzi46ciz<s>w6VYW$qa)A&}d~rW7q&1?JQ^v96+O`1&yHt zXtcGUF?axt))q8|51`TBf<~1FjTRR)Dm7@dxu8+4L8H|LjfxE#Ee&W?ZO~|IK%;Vl zMr#8a)f+V08_=lWpwZ%hMimE*HU~5+IcT&xzxjz4aewoZ_o?TgQL#Xyrh`V+0*$&3 z8eKVP)OOJ5%t52RgGP4_8Z{m?I&{#e^PthCgGQ|fjZPgjMq!}Qt%F9*2aS#$G)7{e z(Y1rdSPV2echDG(fkyWZ8sjn0=-@$PL<SmNJZOx`K#TT8E8L((`=T{&(4u|ODmQ4+ zzG$5rv}j+n(hXX)FIwvcE!r2Yc7qn}i`KhAi}pn;-k?SMqBU>OqJ7b-H)zqmXx$sM zXkWDQ4O+A>TKfhq+83>UgBI<J*1tiE_66G;g6#(_+81na5G~plY;h1R+81ncAPs9J z!72RaCt7v;%}=zD0$Q~9SV2*}Xz#VWf_l;3V_ik{qP^Fm3+hFCkJT2{i}qeiF{l^q zJ=S1UFWP%8(4bzl_gI-xy=d>XY=e5y-ebK+^`gDkVh-v>dyiEd)r<CCOFXC-?LF3Z zR4?*F3qPnA`GFN5)r<VlauDjJ{Gj^>E!ul65`h-&JywU*UbOdGIzqi@@3Cg2dePo% zK?(Juy~j$D>P366WhT^%_8#j?su%6O7N1Zr+Iy@zsa~}AT9QJ&Xz#HWrFzlcYoQAD zqP@oomFh)%ujMP$i}rps+N+gl?^mO}!t$u(KH965Xzy2}y~3iY>P36C!l)bi5$zS0 zQdKY7s};tYs2A-O7Fbm;+N%}Do2VD<6_#C9FWRdWM&PIy?G+YdRWI7BmFSOFqrF;* z{s?Pz8bA4?nTOK-nFkvCnTLu6W*%tlXC6xTXC7$mXC5jRn0cVFpLr<VpLw9MpLwWQ zVCI3we&(Tcf98S4e&(TKftd#y`<aK*{h0?E`<aJ|1!f*->}MWI_h%kx>}MV-7MOXU zv7dP;-Jf}&v7dRUSYYOX#(w6Zbbsc7#(w6ZVu6_l8vB`t(*2nS8vB`t4EldF^FU)i z^H91!^B^622L7n0SYYO%bbsc7Vu6{54E|A1vB1nj>Hf?E#R4-AIRQXD#R4-ArTa4v z6bsBeRID=dK(WBgL+Sp^1H}R}4;8D-JWwn!^H91!^FXn{%tOU0GY=FC%siCt&pc2p zF!NBc%FF}B0(Wt4%4PDdPMH1Xt`1e<mweA%oTgGe`JTHvYK408J$G@&O7-M>?&<&* z>dE)q#mOtxlkd5!V_B#t-*Xq|u~bjK=dKQGp`LutU7XTVJ^7xyI>Lo|@;!HPc1!i- zd+zFB7wXCP+{KA5)syeJtK(j%C*N}y=e$%;zUQtEfuWv!&t07UQa$;eyE+<%dh$JY zaVAXl<a_Swz!>Vu_uR!vG1ZgrxvOJjs3+fZ7w5-RPrm1_4ws>xe9v8+DpNiAp1V47 zhI;ZncX8HC_2hf*>L42G$@kpF2{hG{@42hvX{aaPQ(ll<l@~PEEiWhrE-y&_$_tXK z@`B{Ayda-aUXc8i7bI8Z1<7A|K|ZCtAo(jVNUq8YlE3nTd`fvi@>gDvT$L9jf8_=F zl=6b)ue>0+DlbU>$_w%-<ps%Kc|mejUXc8i7vxjQ3zEO`g5;{aAo(jV$fuMSB!A@v z$yIql@>gC^3|wB2{FN6ZSLFrCUwJ_>aCt%US6+}@l@}y`<pssS<ps%Kc|mejUXc8i z7Zd}R7bJh>1<6%;LGo8#Pz+pNko=VwBv<7H$zORvbL{eh<gdISxhgM6{>lrQW0w~s zf90Rbua*}if90Rbua+00{QXpZwY(tzTmGs1YI%YFcbk^8x7U6C-p|<lxpN}0?Q`8C zu;Fv(MPRGv(kk@T=h8a#)V+Orh;CYh|Bo*EpZ{7{W9<EmUhLOD)@>hqKcf@-^^gCV z4r}jc^kE>;m+bwFF6`HL(g*3mP>Y`A@9FD*xqi{R^oS1k(cG{8&9A7Qk0`8<ewxyL zLE4}EigI50Ip6pCujrL4Kj-WEens7?{G9Ic&0kTADnF;Qd@H5URd)Q6o~@$1AKp(v zu58fX8|hcHER_w8OCYlEl?`^wi2p>}QrV;$JerB5EwbX#ze`DaiH(I`vPFJm2dJ{8 zm&~OP^W&{vN~AeNXEH6)9tNViy+wog=r7|pZ_)NW`f1u8O`koQ67_L^6-k>6^KjlT z9=6yd>nqtaISlh~<}a<sFt3t5lfy6%=l;@q4D%}4GdT?NaP}{)$1tz5KAqAi7nSwQ znH)++C3_}^vQb&joXKGrRmq;oVHj0e&z#9&7*)xh$zd2($)3rfF{otE<j|c|HZuLA zJE?5MGbNQxx|7OArhjxNm5t1qA-a>wMy7vsCzXxNnIXE9%0}kQ5Zy^-BXeem<~4KP zW{WJ!9<NcYOo!=TDw{t~nL%Ij=+7f*i`K5PmCD5y&D*2DNUN!}t+cf*wU*&F9gb;V z`YcVK>0e4zO^9+JKDQ5|O^1ghc{gOQdg-c{I=wXDrL$fd^ir3X3SK(rr6Di9=A~<1 zdfiLcz0~ccqL==}OMmL6Z+hu%FP-<&u$L})X~atxy)^2jOI{lD(q%7=d+A$V`o5QX zyfopZUN4or)aRv1FTLTVDKCB7OYeB;O)uT>(s#V{u9x2O(oHY@YcKtom$vC3fn*bA z$=mdg+keS21!nsJ%k+-hoXKuec(yr<-KJ;U<_vb5)_D6r@OetdHfOHeG-%uZiGQat z+x{z-X~?$!Gs`q$+nlLxQ#-bQ#=p~eZF7dYO~bXl$iLHQZF6S2O*gsCS?M<Cq}%j; z+jJe<oQ-bNYizHwJ-VvxHJ0hWx9QNg=}@*g``o61+~zEEo5pdQGt6xo#%<0nw`ml& z84YaHAZ~M3xlLoZ%{XA2hH#rc7f3ZBz6Wwm;P2m&pFpnhGWiGO8ZVPyK(6sJ`2*w{ zFOwfYuJJO*AILRc=6D0S#>*UEAlG=A;|b&%FLV5WT;pYq7m#bb%<%$pjh8t-K(6sJ z#{<YUUgq}$xyH-?p5IS-22zcW2jv$?HD0E?0;$H!lusblc$xADq#7?%{(w~DWy%|n zYP?MO`a6bK#b0SaX<C6@;~k_~{W}WG-_hy+-QV!<f6E3b5WuSO7f=9zRpVtboIy6Q zYeM_LstJGpdxlJZPXz{cjsKkr3+x&%Q$c}U<7F}&*fm}z!+~AnWilMtHC`sefnDQe zG91`7UM9nVUE^gk9N0BpCc}YU<7F}&*fm}z!+~AnWilMtHC`sefnDQeG91`7UM9nV zUE^gk9N0BpCc}YU<7F}&*fm}z!+~AnWilMtHC`sefnDQe^84?}Z(!9pKge%j)p(iw z2Gmq2Z*TE=@*h|>-X8f6EE_MA|G=^dW#A%&=Yf;pWhy+tYrIT_2Y8K_sqi0h8VT^4 z@I1h5{O>f#A94B!90hNm`~tX**XQ&B;3uIBFcg2D2KOWK6F3Y0Jo)(#G`IlA@%l8d zAJHNG1LXxM3;uV?3osMB%<vqT3SOrC08Gcrl$VdlAK)MO`)SaDf8b^E17JF#3~(KP zp7Qe#dOzg{;5z<y$`9ZYy!;>ey!ylF5@-qjcghdIcf3sb0a${U85IJI$IDD604%}F zl&4=(9|6we{iOo}IFFa<Z~&GN%D>e3QojD-Z`s~D>(hY%j3?9wI8S(A1np6o@&Rxj z|2rK-EK@!J&f|Zle8e&x^e>n$`32<zU_D-+@&K?NFH;@>*5hS5Sb+6-nfwP>kC*9C ze{qjxI#7W1_}^(S0M6rO@*ChhUM9Z*&f{hB8{j-%CcgpB<7L_lfb)2n_5$EMUM9Z* z&f{hB8{j-%CVziH`w&5TRHnW71?3Z9QO;l5Pk<|Vnf3x;J<dP!7hpYJW&i=O9xsdE zn=JErfc1pG1H32n4`4lBru+h|$IG-I0PFEG{Tsk~yiEB3SdW(}uK?@uGW`d@db~{k z0k9q~(|-W0$IG;50PFEGzaL;dUZy<)SdW*f{{ZXpGVKk(db~{g1h5`2Qy%_N`d{Yv zQyu{3<Ksbj0GN-LDGvbi@iOHBU_M@^JOIqc%ajLz`FNS~05Bgf(|-WW$IH}rfcbct z{7jbB0XhVr`*;O91fYj`nG8;FJT(vi<`cdc;67evL;$!mFO$Q7Yw<E81i-O)nH&cg zkeA7EfB|`#90wSXm&tK}0eP7m2N+N&1B@l~2jDDT<`@4HzZhUF{þ`16KFo;ke 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 o?=&jrW`RpsW@LoLk!LCyV7H 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%0D^s}rB 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 b%>NO{cHMw_9cZA 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 <pf=&I{(oFGfG8g? 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∨@L!-95LyK<7>X00N0yDEqqH2 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%0DPp#J( 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ρn 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�>nerY5bVy2uXwH{csXz`jy3c1< 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 ~Z;_Am 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�NIX)Q(!Rv#m0^OVuU*9Wki`%-g%NF2o&7 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�Y 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⁢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%0AP~?8F0@Hac6#;xPg(QnzCO7y2hqBf`Tm7C{ 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:#};DjK5xsMN-=Jmn|{gen!>MccS22FY8L!N6zsgVtT3 zkRj>Dkeev2XF+r&x2>4%!*k$kwNQf4r)Fqs&y#A;OZ>qDJ-fN~l7})RXE!|0PhlgU z2ro-YZET2aSN(8RSq~k~3s-$>-NrF_5p&T+-T<NXZCnvO_wKEbsw}3sPiR$PzUa2K z<(bKX2=~>&kZ95^75;~LX$I2r=rf6Wb=Z*=yh<Pi5Ltl;vi;1_%b1LpG5I=!A4-WQ z{Jvm|N#O0fT0%pktZ~Ji#f%Ypl1x^(2%L(>8y^AJM6YZd&=OIlaenJHb0pUZ>;?p6 zE#3~iH=Eu$kj&D+W7D4}z`8<3YoD?t83MdTzH&;`0thFHWrby}Fjv43St);o?k{D! z26E%dUlO?+>#caPTZ@Vjx8}|l822-5CA;2C5%m24<(G1&+tVu<B#@$)AWYB~46InN zQ`*FpPs=&3KRL_DrXGU@|L=cH(>{2BC>8K6q2$gfa5Uym-_M30kVO?~ra=vIs(!${ z&yIrMTx+rv7_WfV!IM?`NUi&&gKn%FbclhTP0CTwrS=2|h|(;901Pp>@3c9AljQ0r zHw+|A4l=G~wq!k7KfIw+FGNT14?c&clmw}&1>Cujbwo}Q^OT{F1=T3S&h>Fo&O9<S z{I}#zFGV0nw?`mAa@g)Bfh6fV+9D%tbxs;Vk~K-m3I)R?`HSTv2B5-3N>l4H{q@=2 z9@-Vv&e%1nNV+wp`kzrxQ}zUzQjd<57p?u4JP4Vdox>jUBp4-Qis|4Ip^DG578o)Z zIAaN^bOw79gXSH&iVb_+cglV9E`G?t(_f7@$5gxzXxVRZX*f1Gk=z$F$&;(n`Pi6r zcKHq+DbcI6bI~@R|K6C9??Y(Svpus7g8Tf?S}PzF9(Jb9UJ9DEu0U9R0VgJwp>3Df zaAUD8BH}aXtt&JV5YvF21~ZLGECy`hNr*x`saq(%=}|VTnF0B>Yy*HK$l<%Ck~<kQ zuU>C;&x9Rp_66Vymt-jqHXFifaf+-nfHJ3Parwiz0Q)Nos`RkbQ)I(_{DN7r%V~j$ zD+!CkvfY`pN*1k?foOrX#LK8M1Xa#m2J>|nAo|D)@;8`t{Jr#yEz(5vctjd3Z|q_} zg2e9QFa-v@vL&gcp+YD$#LZc?Lz^6~9oBjylMrGhv_q@+%#Ls(L?<0$^a;9P=zBs4 z!AJJiF<xq5-L+*36#sb8!`>GL!-gy1*?Q@t)Wi5--02TJv<lLIo{i1O0bIo_RvGg} zhZY(7yqeOoA4K&>#9dl8e+kc?1OY8lh#uye^E?=_`Iq|qVp)-o$P9rnPpmRZnph`@ z1fM)bgZ^GO<&4SiIFwvZ#ATAR-hm+dh^1ty!-+sjSzGE%#+-a*=^3$KaiXN&1G^>N zbVM*`^GZb(a<gkwG#67FnoDi=MzbBH?TL<mym-y%Bx0orLjN)EEt1IE0gxM7k^9!> zIMzKNWm0e*T8rF9lqqW|ELSXQMtKsw^~;g~BZ7Kft>g4Xm+!ki;GyeS>d>6gR95I? z6j(jnv_McE=>ww*E5I1p8aXD@_^^b~`8W)p?N36BPfW|HxspgP&N@@|!EIltHB|C= zGln)o)XwU`Q<Y3t)>_p|yBo}K^-Mt#vSU=_rArw-s<Nj*JH}SDfvH$0B$n##$~9{^ zOIlaMVO0B3N{r2E8V4mwi(wEzwCz~IDoApsB09IX)hw`abq`u{%$je3c)?xglnQb1 z_!|2LUtC;&$7sHHDspr(ZH@*1zJ#ehlOKsgC&L!xrj`%2y3cZfILEV?(0#CN^Sz7< ztx-rwBPt<|6lQR(*X@WpPau29Ndb4ura#4mZ$J=uJKD-4l#cz`koOagRh=Cm(T6 z^y)o|h$d8;;vlU>0>?8yq4!U=>k45df&r)E5K;-TBHbjo3$48&M1l2^r>@fE+dAV( zNLP>)A246S7m!sQ>`D4WCk-hbbS20%K{Trqn0Y##53OlKr7?XI+NmvL-vxZhax;rM z7l;8PRKBEX?y!giKnD*E@5e;?zpOsM265zfL@Lr%>Iv&)ZtdNySA&P(mH(~MbU{gL z@9AOhOc{|f4~UX{`s?$j;QJ=+866>S1wJdR8kC9R+L-(qci%CwqS!g_p~GYOoG6i^ z``8(-qH6AHB>i?NQU*VxS|6s&hX9`9Is&sKW*=;>+635_SjJ?#Aq*I$J1(pfUMH1t zoD4M}`eXXfgR!r_(q(2G;U8UuFKSJ{7k3dZt7%{55!J&P(op^tiJ3>ZF9#mKQ{Jgj zOF}mT%n5R(Ty(e$dLPj!M3WN(1!bCBx0mQ_n0}Wq;6VF}wYQAoag#(AX!J&kVxS;R zfi-T*7`Ubgd`5YP=1kO+H<?|C?!!+#rfW!@jlWtxhz2Bi9-2-YxvmRvxX|W5iidJv zF_N+?>y#Cix}sbk4RA3?H#=dOOMypNggMKjQCG=KFgzco%N}+UI#;*+Svjdee9&0q zDQ&ctHM<{{(!k%O_?FGvSko!!LO}5&Z|tdleKGxx>K_tK`1x+Nxw&~qWECz~@D?9F zQZVd;0|DlKX5^<=VetwquozCiX8ALE#T5lNeu$STAQ0Y%{G=aBp4Ju!$Kj4wg-2dX zZ&P}-mENLMBrxZpkV~~%i+%Vt(7?>oP5gI3tad7NTb!9~F8D&Ku<B!3lMAXoPRfZy zG!m1HO-+Gj1|E*cgKu9v4Ww`^niF5AP3hAiq6zH~xif6Lrp}tA#z%-RKy-rs6jrmw zVc01KhM43?@?gPFr`?S~gs{%#K2cBGq<O{^LC(T(iLQfj;^5y3A^`-J-lL$8rZ6wi z<P9Ag#!k2a*Rp%R$r<YBE9hIkdd1cIW=$W*DAJ>_I93QX>-n4%%KWZSahC?W%0j1v zBRyt>WA(zk)lmaK3C>ws?zk8=LV^S^R%wKER&c#iah}(a)$d#3^j1Mt3K1@cwME5t z&O@9_uBh?i1bv=jyE5U(@HfUmOWoWxmkdU~s8BA|5FEh`CSG2#jK0!}nez4^=O@oc zC@({n6H~MyYaIkz@HN*Bhb1z%d6|5smxa+(9dLgDjB4%AaE!CyADm0no05mt0(>}p zV9$3XIn!4AI1NeJVZMw-K_WZSeYFwc-g^NzVq(a=?Sj-Yh_JEo9<-U(kI+d3Wed|! z7rpOs=imh{DX)ITeA=f^*B(<7`5mkpTpoxnWPCCN=UU$Tmw&l`f6Y{zW!~7^<6LWx z*G3=Kemy*yTz<FATleqlJfbhH@|rH|!76jy`EL2u>+rv$)>fY)@o-~Txpxx;Z9vFS zEu`t!)fk?s#=fNv6};zU(t`c}(YtoPj?yyaDrMYVo+<(fLMRR<=eJLWVM6jAg_D}z z1e*BrN9<O}a$}7kX?DvRR84ET*FoMptCo<_IYD3HyQcP%bYUL{&SX(Z>IzP$S1f3X z<P9q(&~RB$r0h60Yk@ZE{Ih69HkF3LrKfc2V;Nwe=m-cc#QevWlGzj}s~Y$4@o?xk za%O{Oe0?<+PYqxV9ILKw)_{6>rK$pde!7&FPO?}NT(u!!l)$gBff_BSBDhu0?>r%T zGzcIanrUpX*Wq*`)qHR*;!*)-@TEpb2$M)svR<r?C?h-0_dDWjM!&;w;rbQ3WrSO{ z5wW%rMOJAiN$!nwKa*GstRKepUB;HF2B<#->R*RVjr~RDYvctoIl5&s0RrccNv>}2 z!FQ3M7$l%BQQFOII<J$x+ulBW{qFVQ!Hb>4KQZbp&h3`p@!bBi{lmlkz1Am>_IF>s z+?zL6c%nWUJqS(EUheN4?jId<!b~->Ac>ixa*IXoeA#hFD6HQ9>WxP<ln0E#JB_h9 zE2&IOV*AokJbD*tXa$iyBU24*K(WN#guI)ZcV~dJA*KvpBTGbC_QPuzYB_&)sIz?A zG+vJ}tO`>)!=!O=y&CAMU%$|@ZZ2W&8fnX29|=_iPaDBrnmsl=-?@p@?#c#0ZLaJi zJ38_^nFM{^bNH(gyT!w<oVv5Ot(~Ub-T_UOdNVJ+%dW4BR;eb)u*d6v&ZK`cHZ>_i z7M>^*=;dK_<xq?%KkRLuZ=zXp=SL)FPCu>Xt!#}jnHRk76?bWpznx9@P(_ehYa_{R zEujZcE_IV$aADjs$-U*l*wqc(Sige&^(6~|#jYfWo^}B*K-2_coD_WfI-N(70VK;I z??AE}0`kpHB#X#6$>GZ<(Z(amcR~1Vb|&aJMHy*oO(ulov1;dNcmL%cnvb-U&}L5T z=Ha>yR15?y0&8zSf$LtOmx$E%idYCqX4&d^3)lDX`dnNz>nn?O!Jz3#`hFTg-o{H; z?d0)CgdXH}i+*V7VHH_4spTdH*FQxsa>aAmf~N%W^^{KeNqc{*fa&&d(JHTg(GZ;E z1R_7gr)0lhy2`EZ2YN4l2!7Wz^DW2k)phXN%2GK0I=v(JXoId$ZoLYgeZf>keknZr zoDli}&so{?vgo##nplrHCVA$V&zv)s`KhsWE;6sw7A3$uWUp()9Hz}RLP<4!$+Rs- zX2cJcOcq|MXR_N58R>-(b6RU_tbiba>2tQCMsc*@wjfWK3IJvNZ)xPMScnUxfKlb8 zz)kG5Az^+|F04n2xH#Mmmj;t1vkwc~%=0yblhBnEvxg!GTEY+jF>O?p{3s$db+~QS zfa9h$xQSniAm`Gg&LI#+o9K0`;J2gk`4*zJXl${CoMY<Rl4ZAr{&{2RgghE<A-WJg zpc)qx$)g_bh_z%N?u|wM&_}(4JAE(YY9@OZOxvtuPak5N0VsZuOmO2m3SV?C4}0Ai zE)uEUz6YzX!WT3kE=RClL1E&g!{^Z%?ldyd&_6rtV@`S)Izt~0#qxGbEDtLd`U$Dg zgG-E?u4&qtd_V^o7z*ztV~MweifaX3z2Q>nz`N^;hlLAuDQ*&{vL#I;6DNc9F6f+| zqKIkYH}-ab4Or)FKHV9NW>9ItS1<dQJxuJ4N=9P<1+Y85nhD_G3zBA!=QRL?$J9;G zpQ6hsF$xm!p^6}0laV^gN^Q8!TJ&j&g(|fZ!w&&wS(<mc0$O>~tpB)~VKg^LN0&97 zU$gk7hfr8{94Ya4d32x#>nmxBL@efJZne|xqM^nJ<zvlpQNNIlTyrj^QEzUCqYk5K zS-AOB1a<_WJ=KkNE)K*4+P=YVz0Xe;iT3?0GZUYt=YeELd$3SPm*G$UEv&yNXG)H} zy5;KhnXsX^TA+b5YV_}k^OmAg?Ib+qne&u@XD}0qxI@SxR4Nn=mlOl|K9_gwfIyH| zLtqJ-pv;2=mMSMf$SciMs900S9UwS*JtEnW4_ecunpVPqxvP==Zw7=@lGO9Nx3|O3 zX{V5sD=68JbuOGb(UUD(Ko_3QEV&OzP(e>7B$Udf+)gl{G;D^x5)xX;30b$I-peIH zpkJ|rnhTluz&^143V)t;Vk<F0{zV@hg?Iv%99$7BD@YcWt%$&~Nf#VUioVzYQ0}Bz zVy^l&^5Vy2x*)l?xA_ZOz$g_vog_!!zsh;)3X~If(S`~mszOrZR-#MDf5>7f?dP8) zvJ=l;%UM=7yr)^k;p^P+l~rJ=)|<05&*mxNCD(}(3at+PUh>t5L(|J5+WgohLp$*s zDi<(IJuq`vrl>?k?&wRXnE}X9qT(KQ@_M>AxEMzvVTO?mo9Z;1yF9#2D`j~<e4{Eg zVdqD<_O^C{=bI3lcJ+yzDxQDM^}|a<Cichf;Zxm{rj#!+y?6|A50_~|2q2A%nho9V zIQ~o+gwqEt1JMmGFt~*HRtg*?>>M~NSIZjOGoK$<C3+wibM3lOOd0D&i!@e}!2j5* z|G|~b2|*ULiePuu>ypc!X;LXpS9ZJ162zK{iZc6zsu~G*LBVs0gm2VHDnStr5ZOYE z(Uth63Q<vkg40FMG&N1LsA_rrwHV)`pf4SN4E$Olr}%~tU2r!|9`R<h!x>&V2)rz} zP1QmP87F#-eEwOD!z6|*kZROdfdwyxUv)?h8%xoy6-;gn{kIcUHY?ILq#nZa&{u8K zB`o!i!0s;;*bSK}Wmfh#7}wp4y?`Q1@`Ih51oQQ!`1Yn0{}yyU<zZ3d%!(fKJpMAr z*7Dy{$}eIMeFSmX%T27rU;y24DNv7O+>9lw-65*fIw~HA?-)M9Ws~U1?$5)RL@s_0 z?k^^!P=uZE67>X00Wj0d+K~fYJeJP{y)!qC%lL9=HWD!Bb>BIV*6E2rfl2IlXniJk zJY>FgZVw1Z%(%Z=q3U`k@x6KZs#cw%=e4*6=uKsPs(4Zv+b5!>ECTLayEX_S>=Mmp z>BYsD@RChab^9eA+x84t0fGtJDAE8Gg~1?OSz0T-H#nM%f<E8cfk*t*2W$<f_qhf) zn3V>L6A0Bj{d2U8qT1h|25nztxuh|{J?A}Z<LtFt`*7DIEO>y2Wm_#4d<7v{DU4co zHHzg|)lFa91>b^4-HVtO+MPaLyFwlz{*AwPAJc$JL;CO^9)qkKogB=V)#NV#%dFvU zHyH}UpG`guPn%Ob)q*AF2A*}K)&&@ot`BlOFOHL(Bn6(>L|qz3Qq;oE`hahsD!N;R z>VWwmg?88j13L$8>GZ>JbcHZ1uh_BS04n|JeSAaDorryO=^vwIB2z5X9e2f9?-y1S z3!!RgJJ4K{d`&_&YP6%HwY@7KuCW#O8aEkJvKfp1mD~i&-0w7Yd&i=9U@nStK*&DI z@^z9=p;>xJ6>^IAn0F*OOXS1aF|W1)HP|Ygo&E@Ctz+9O{;XrI<O)5~1NBSja9BW- ztgb;?v0`kqdd<G|k{2&~ol;!IJ61@~wSl)1>V0BSOTlmitgjtsbgQw$UWi3Rv!6Q} z>)>Rav3tL%k`qY`yLZtWo+FzT#~<{*qu1<8go4#p<YXi#V@O0BIfOAEQc;upD2`5X zwKE)0^*Qvqr+Ajr#VENnmV~2fSTUjz>ZQPu6ea62=Lb1MkB->bM8j2cU=S9AK1`-S zG!0CZ!DB8T@g6Rglaf8^b!t;|VxQph1KgQx&lRaYqh+2hc;evGMInXydjmKAz_Pb| z3OHBzg=UC&L=EnAIS2Q6hd~w2)^P?Ls9T{4dICGkJF$Z((i0Z<BXOeqHJ8_9D)rt` z0^77RoiWTOkSfVAgwlrOFxM-*J!Wd3U*0{b$iDo=K*>5QAg07pQr@sb8fnFYGkPxD z$B_3!JqZ~_SQlo{)l=efWwA#T4+kQXpU93a?=}{XCTH^zSmWqJ<MgW>L_Y>xlHR$H zQb!E*pxVGy;%raPdbW4q!#tr=^sPG+n(lR(T2~V+c&afx79m_zt0V<c!+T6d5=o%r z`jv1DQ*mur1sce6-<+I{YvT1VjxcC23`Z_<Jk?aLS>ZZ`c>H~yCgd!4E`gpf@Ela# zgfZGk{ls4K`XfgP@VJ)1coEJO*QF<;IXm7))k0%_*_m{`q?}lCBA2E}$qD8J>q}rY zcRH{pcV?gp0B4#)6^|iUD6P#PN2_Pp)b!SntBi?3ykHAvkb??fSQ=2zB}w@)+MJ<6 zHoZAOoI{f};Ymqk64Nzk;j`}Huz^6C&nhwlDM^_X&XryybQk|pj#w_KUjL(;8*|`X zTtPEGJA(sSPziR3bK-|macMFs%mw>Hh+nxjsJEjv&;=F7xnJ8Nk~2XWES$B8dr#48 zN@*N^ZW5cq)l{V4Bk7HDLP#`#E?bI)nnnlSOu37_Zj!Hn-WV3hzY<)NTAK1n6vG}` zyxf&+FaZFk8LhzOxcEXKLZDBXjA80_jpgX>6;_4mWs^lo@PlvLp=U}Mhp8K~b|#JK ztv4|FXm!YQy0bbD_OpjGBoa07BAg+mrSASm#2Sbu=Sjwn11|+cIU6Z3(b`xgyvBvu z!(3|5C%4vi&9#DDQS}bV&SSr5LBv}^=PR!y(F)7Pv7VKUb=0Y=5cMu?NLFp>G;v_| z@c_n29~>>{k!<EFJQkZ0ZTz5hT`zie!a@RtvfzF&m{UU;6h|E-29#DY29vkusGVU+ zsn_DK;tJ`XRW<8HpHX*0qoak$0tzKq&J7g_S17WY^NyTb<~%9YiV&ryA$GnWDm;sy zk!oKpP?`jxuD9pKu5jJ3Ug)lxo68nf$bd=|9(-Man%>AQb9Ul!Z4K-m>Dk%QCS9Sj zB;fpdWTZ#5oq|FE%N~-!*|mn;-4s@}Y$RZ5!vtUwuMLtskx+N?qc{XoW5~LjAwN!+ z%I%i&81g9PbP3sIBYHSrbdczrp$KCF5?YD$VP_z-M$du4%Q%rkXo&#wd#y#v<BAlE z-YD7^#g*>bo3M|V98S_`bXZ01M$mCX#=)BMv^8-mp<>O&wyqhv%=)?`o0c@$eR#w< zwmXg_Lp?q(2VtFferE{Y;5|P&p{r0qbFVF=LP3ggEWow{#lfeg-Y!h$9QX8iA(Mlm zo7UZIno72vyjBm|8?P-g*^PVeAmSmjnHmWuk8Nq#S*qgPqphvuK*vj3v7qr-1AOxb zsWX*fod9)Mh^v~UssS>B*t<>G1@oj#>+y^AP}?OkR8pwyCMH{w<0-)qmI2is6r1pS zY@hg|nvi<q8FDGRu8O_(+)WlRgZv+A(%NwiJV_9EHe*Ma7IMTcs&i-;Cjg?f<3udJ zi;|n^taD-h9{EePN;oLa;Y$=hM}Ig2RcdmLstwu~FV&_Ktv+`lL6YYq3f;Ktseu`u z{or!)k%X*8++aD0e;}H!kScuBwx<iFh=#5yZ=%u52E*q!;~s&lgdAWSoGb^8KgUvr zp<4o-PoFl73giP`9Vbv`_mhRw4gVsPHC|rj7y9_fM8g<LES1cjU&BZ95(cfhjHpC1 z5z9`!0c6&u<Yz~{cLNIo$;DjeN^V8$_D<>0aM}e`5)l{|QkFfafTTD^82QQ;A6P?J z4vitAt~-)}=#L865M$0TNk?QIlZr(#F68EVx@JI;V0pZ*3`{t|BSECMwd$PEP$Qgn zE^r~Co6ppOL5wiD!Agj?2{NaJ^~x287(%>ReloH}@KDff#HnBgAKXpst__Hs6m(aO zf-sb65zs0I9V%Ej0&Q;NYD3ndn;ZAmJt#hd+e2opk~6zGRY1ImG<PklOZzG&Qxn~` zeNmJ2h1XA&dD6G5qU+qwKeTOkokt{KyH;_XQ*Wot5@g#b!1-d2xx4_RD=Y?oV;Sao zTf>!&wu5O1AYlxDBkuD00(cZZv-jMmc(Q^vPOZk?E89G}bFQnp#K*>p@6yz`@X>X! zR(q(K6;rrm>riex26}j%EBt5SGPFqEVXfEGa8;vNLc`6|<NqMd`y2_8ZCN)_(R#Zu zX5ov@GV_XhYCiOiyMv(sIToEQDzuSVCk^?ME4}S4$BZ>`4mu|RYHP~J;2lzV<dI8> z+bx@lGhlM~rm$LYWL93wC1o1-LnBH33RmGCQ<!Uz&LRR_U0$NkvV8JoX4Ift4*n}> ze3Z5NLoY#JVv?-MSJs$){c70L#e|1q^N+Mn<>(U9@eEfc!v%{qJbpw^sP(*;KhYLN zf1x<KfG=qZ__4LZxkpta&0aK%d^Br6UmGr_eU30FJQg@TWd&O#UtPym`iiY1Q$lNC z3K$a1c=$AKa*_R~tpa2{KSHrUEeO>l>`QOR;vK+CA<RP4pvz0jyY7Kvzwow%8+-&V zO~Xx51v$AGonlNB2H}okOo15_f#Yhj-l7C~$LMVV>3VHJj&opmsSvJsKJ^@_Lf|r& zDvh|wWQ}%QNErN#7D0hjWexv1Lqrd*a~Pf9uVLA}HEDmT^pt=962AsYL(-LW7qT~5 zwS^%5+GFTlEgJzHj2Bx$m({_c3-yNZouht>){K;yi2{}Gjqw+{HQ3#rCYSu25Xok> z7nQvFkD_j60|HW5i=AOl)G=V2ItqL6s8S`pFk!G@6T~ZHr#j*aoF_fjNxRS=GtRUG z(I%=(oxXq$nX-k#NRozTs#7;2FP*xk?)>diR|*+`W|E9-a!z%?h@F2?uTVn#aP!;W z*d})ncnljXFUKP;WI(n2yJ~cSYvRo}?l)FjgHkC{{8S<FMf$2>H}oW~KrO{~u_o12 zhgM&ew*pdCnyRF7cyP8nRpPG5cpa8;=D}=e<)XrQxI~;l<b1#=f>E%vQWxZ2F)Kpk zpdgL@ZyJg`I}$F(N%tSjb^=wSML=(iU<ZsEwS5gH_*wM!cEsGfjHbmcQDYDZ3MPz= z2i#M!3o}PzvyLZWC3<#XlHy9yA$&G|^YkiG{VVp}(*)d&uflcR+VZ582mGCBCoXfZ zj`Oy~H>bm!DrL%*Oi%kc&1qsm94K03?uc25=1gF%F8l|2>4D^ULDEq$XXzZ21xh%^ z`a!k2c4h%F%~~|$#P$uRCj*HC^9X5E8s=5e<!_#@^ptk0N1f_DQrXZvl2TSnyHDjX z1$PRyd$f~NDJ=i6vS`iPRmro#Y4m8TgG+<VDWNB>aW;%@Z+0}6-NJNPlAOZTn7>Ot zqxjGi<>W}QGF;1qCZ#i#bjc3dam+tH1~ZE(8g7G7w?MyX*kVZEQK?{eRD%Clt`4{q zMaEL5hBzcsYhz9-*RsfJGeR=r`dO76*WEJN(xQAA5oan$1Q%NSwR)ACc5{N9$vDA@ z8(;0?*ZE1bjq>*A%UJ)-XO8v2h7;ig^2EY+bQD+y6Byi~mod84N_U)<Q;1N^B6MQE zB4t&jlaDMKWWF7u@}osXDJ+*{!n<!PE!atIyJ!901^foaI4oMI4htn`My*aj&Gv+c z1T+l|c4+|7JIEzTUm9NBKvPNdkP8n+BeU#AQ4_xIMv=HNc&7SN{K&OBPsIH|odrk# zv$;aN4%nBHM}W12QCNc_l~#KQ(oK4u@#*`3h5S`XMVM5!8Bj1t7;t%cnywO7eAx&s zaorh6WsFLdvSCi4B;EotZT41Nf`YZqK34xgzlDtlXT9XU#P;ZN0g~i%cTUG6<d=QM zhAcj3!4(CIj&}Dt6Un&&{8ufyh_lSGq*#C>NeKxDPQMAU(9lT054E80ui|K}8b=yC z=Fk~NB;zRc5ztPuCJl4<%E#H@V!{^rt}(T)SOxk<W59?f`E@<if{jl4(?GG;^8u28 zFdoX%;0G$;Kcg*ffWjNRf7lD9f7%EwTVj51zHNW{>n$%B*}f7x1#Tgv8B-mzHRA-q z%F<_A25=@)@+Sgf>UG!wM8l-*i+L6?E>wOtp$wP~{mx+KWmu2%8c>QSCm#+KZkYDb zgm7dMBAbex|DxI@<J#b9aI*O5?Pq>x*nJ^e=FC*KB@mUNS-Z!DZv!{5G|oE1Z6(1! z(Bs=+xt?Lm^BE$&mc;ZKs1m{LW$4isb$c8+<1S8EVn+v-!fm5(ZC-kX%D0U*QNOG2 zA6NhTk#N|@|2t2n2o-S3mbfQ#xe5<3+`Snc<PtS(dm<Qo9j%ffv}9v+ke8QQY)!?0 z47tJ9#1MpT^utDhgH$D)zSFs2RVBP}OmT~R_j;U4GdyJAcDj(9>Sq+vgv?g1@`C<2 zeLE0mach%^#PxSs@tf>5HAf`Q%-`)Ge#j*nLI3$&LD6%-y>eP0GQ#2iJKXW!aDuds z|EW99(6DFN@b5sC41=rwmnhun_TI@D!V(v`W-sFqh{t>Li#z`z1J&CeE81^BNqZ9f zv&;hWj$4RbY5=H>HdJdgOO5K5Y2XP{5SW4vufvIQu49JXXqE3Po==@Yu__Q1l|4nB zgu(<4xKk<FKCiKp;0|3>Zl&N@C_on5o0J>TxT-|CDT)X*ZCSE3(7BCeqhEwfz&<mJ zR~;>)1giNg7!$~n4=_P_(YtK;r~dX*m4aB}pVO>G5DYHObcYj>hwBczyL1dz>!Ll@ zNgi22nLsK*91;pCv1F9_C=!4+biVd{@gp=}6!u{`n-Jii_XJEZK`UBpQr1!nVba9m z^H$eoKVzHd?vpSuy`gm3{ymjZvo5(IW!$YJOs5mOAl6zl$!2&;rf+zy$)f8Uuf&M+ z^NdIlQR$>sD4>o%-K2IpjuOhI<5%6s#SrS>V#Ra>8tZUJY5cPL`0pg~Yx$sH;`yq3 zW9zYrhzB4?T<Y<gZgQXIlGV}S<)j3rdXhScgI_qBIaY2HEP1ene-uU|17h01)jtZO zksN>sK{qMgNR>;i211rgsJ?Rti#iuX7R`+?WURGN(-Sk_5rl*f8sW~wWLGVW<vkQ- zUJ{LD6{+*LUl|<a&j@y@tYAH{9h|baia@PYEVe5(@>p|f0o#R9enhX?U`Oqs1sAHL zBaJpnf!q)FfxZct3Y|mJO$-WC33^p@=c7v}$}Uy!6fK2c@E-aYW!Z#^y8wMa(6#TQ z_w2U7O)p1GP1nQ=&DC$<zf5(2Gs7WXD`L@tHRxOL5z~lW7HG`&Rc*<f#zV6ThSkz5 z(WfJ^0FESTA&&m?wLq`YF&8ygs^ogHJUf*4FFG*yM%B?Do}-xchr?HIURO{5Bw06b zKnK{a=R!LlqoBN?_a>|NNEJYkr%_hqim#bzET9<PV``x{@PN$IqIpq<V*-IjYb1{< z3}>M)KLj<UktsEOglrD%U#-8ksG0XvX6~uj5lA>vWxPI`>9v3m-QL(!9uyh6|4B}s zj|DShLm$CDiPv7vK0Jj;CSt6=KC~hM*Q}#Ym1Myp#1KDdi3AdG$sonSL+c$}19cog z0lvhuY_Nej<H#uk$?0r%g2wz2blDN5s^Hf%l-+e@J}x>u65$K(-t-nBNlY}WhTsOr zhTC)3x<yD*OO)1XHweiuQUYNus1F3!2sr;mR=@S-mt{JK9lJT~P5s(}-f$~T5D637 zZ9?{$ecCpqwZZ5^CzQxNK@)zd11sU%4)uEMmTAqunm3ooI5d=#EbJq8S+L9>SoCR2 z6t%0E=j^Obs~;xt!&GnLWeCg)@GLaYjTeXU@@S;J!({?WvaDQO#w7_tj<Ub3!WtAu z1}rzrs7Suw-nJju!@Sm2MjP?q!1%Os<PasZq&onO25+am3q4fM;l5)=v&8b~gyhvM z>I~^h=@^cP4>y^j+kak8=a{l2K&dVA$7?w<OAv}Jt><ND^~E38GC`0ihASteq|vrF zoZlq(JQGGvMm81P9g_IhBqG&#z$O?0)ch@9*h-3y?j|{mptiv1l`(3+EAlW_<&mB4 zIXTAf!tzW+su)DcGF++YO)r6x86QnFg|LFe<7AGeIGuAC7N&vAWRF_#MuIt@5-He2 z9=^ksp*k@4^gf+rfxJ&AhC*c4))-k)PiR)`JlK4=`Ji@7Hcmd$c&$oSJyx<OYPk9- z#zsT0L{6c~23~9>*MaEH$CcXkCfJ%9E*VS0t#E8smISN7fnYpPhS@-tp%$i<n;N-Y zDvFTEi}=G&HoN3eg?UUOCAN4_Y?Ecp---?=CSl<cJA(SX2*e_Gci;C|^PsUqq}p}( z|Ex1)4zxv-Et84fQNd||b#;D+`fJvXX6GX{^LN9+2u5s}EqhJ?sdI|(s3B2y>(Elg zL?;OA#A5t@-#l(!CT_s}5^$GY%Q}PXzZS;UjhN&X2vMtf9<kT{J?1h7<`WEMRra zLhb$qF{`>*KrJXgS-GvEj7h-Rj>*zl|7!EAJGhH{D^y)wgE3=LhQncbn>Cvepizsi z>6n`pn412ScmZmivN$SxZ~3s2D5V2|pIhcJuwxlrR4&^3Rr}u8hLmo|EteM8WN&M? z+f-L;N#+H#5SsDMV}bO4Qoriwte~sMf6OGZ^rm>H$u&q!D)ch4Qjtmxbsg~=p^O;E z@tGUKHFtaN3ZHB8LL=D)Qey5w6o7FF+H6o145g#^aP$6+k0P)_JF|c(m8~=tnz9w? z-@U$EU1slN%QTS_r<JdKej#cTZJ^CQAetjW%b2R^C)c1TWTTy3bj}Ny5}M*~sqORj zeINOA@-2vpschAs&@2JAfVd6uh5q<$wXy&I|9<Dq(J^`zWi|k_iJS}3(<nU<c<&^} z(+VDns)3Fxz6S7Bs#Kk^^s$F<WqStc?T}qCCyI-#Mfzw3%|`%&FhpM}c2E^I%E>4Y zuW*ksIO}N2tDhXI8pFG~y2>uqLz?I1Md#Dj-mBfCEjb&%d5d9w^V){_m3+sq{F{5P zUjO0E{^6fOKA@yv|Lp2jmf&qVvXUv$nQMS=gYpUWl6zxHAnZjxypiOO-(fPu44t|3 zYb(<|d8{=PzSt+tLq7LFW4LFScVnHiL+$49E0XQ!khPe0j;vLt=oSqhOz!k1IUi&1 zOCoUF>|>E%={4`}erfy=Z)9&i60U8Z^Hcgh_DgwfoW-tk&l!&{&pcIfp?Xdvf8VQX z66ET(3CQCRyZ$=pOdIuUA%gR)^=9{@5B*C<DH`H59G%tm=LyDaW3_X|x4al8ZW<}K zBD^_iyX-z{7{h9JQx<?7b=kZMt_NfeUm!%}u#4tvHwOxL55?!?$L3NIRTAo~-J==& zbb(`DN6-<9R}|vSbeTjcfQb!T*5p0Kgf2>e;|LLiUuqK^?!`Jnb4Scm;4b@%-kDs* ziCqzA*ICb+oN;-`6q05wtX%Qkx(1%z-O-9>KA;_E>z)iyO?W#%upB$E$II5B54y1~ zbI%c1^D$_Sz5v?l=f6LI%L8}Nwj$>Ot^1zAE5c%HkRtab_x1osVUPgGFGPwy@y2=z z<|1?!8;{4VM>$_%C99*<Hl=`3QD6~*I|dRX6K}Zd6CC5X2X7if!FKmb_4Jc>b<xgl z>9O(`#CIRo(cF<mZls%7S%!m+^+7orS@OSm43^3{npj9`n@0YnycP!KC#ZIzKqk0> z>C{Yogki<2?_3uWI@>lo>X}0=_|oVz6n~-HWNl!ZYOg)L?{XE+v&-CpV3b{M2-sAU zVdoM$_EbG2x_HZkyus3a)NJ`pnz<dRZYwIU`3U?;?KQ_Uu2V^hLT(}&aCvR+l+6@b ziw7Xys+ujL!uAy)2#FdpMzxOyb?!JuqKfcIeT%&}@js-5%a<~OWE`6}bfR7|Zx{VQ zo%EAabjD<^42PGZmwWmPJ#ooTVasp4S4@<If8IEW(6XE=SB<a+T(!=27NeofS|(pY z>;)l;ucD{r2M89k!#x&+<^p7qvH##rSuuypC|dV7W*@w}WZ%c}5b=MM4G<pf-IE<F zKdrx*kBVSR(A~i+A`o|m(;7hB5|^L+guo|AY)kVOE<1h6>FB7k7>HzbmWY&G&8sb- z(al+s_A^#M4M{-2AYO_%%TTW1{ZXzasXusQ3WkoX)H|0v0i0$CTUG43z*NNW{>R?w z3@xQ7kZ($g-I0utp)p%=GX%u&6jXnhFBF6D4uHiF6qkGv$0nzK8udM4$Bt%58w#%d z?&uG!tt|7}Lk}9MmdB>b&eU!|L)a9Klr7yL78W^oyX@uV;Z-T2efe(yG>Ezcu+cm< zID?E@87vgL2!PDqt{3s`DRW7TUtZIWhR2jODn0W|apNV}q|@DCWxrs&tVxiy{360q zMnjDhAyga-C%yCjP&}`erllC6yD?y8!O1E=w^VR-;gZI^E7b3l7nP~KE^5KH==sy4 zW-udkPSzDU0j+k$w5(!N#wii7=(5p}lOt{j1R!KIECBYY%d{(lx2zC8ZM4QCwJPlf zRIe_302Wl`)H%}1=W1jnZ<Ya6x<VitHNx<k54HJ-QIfD|Xj||_;M$i-?`(D<>KH}f zp#NX`EMwT+-pTA7WO#mq<;nd0VQGP?Ir<Tp1MB>KvKh*VC{~6kC3x)&2;!z<udN<T z9b9a{c?50NkAn95B!cPbgB}e%3<Y1-`%{RD^<^PYjr31krJ)VD(KE}j5h~iLO_Ehd zV>=p|N=r~@q0A@dBlx%qYTMcJ39za%!awhtPVwFlY_l7vR^D7E)4?*j$?cXTrPfXi zyJM>ofxh*_kU)Q3jdm_>6ue*o6g8_K=&B`R?8NCicPk+PHH?G;R1dE!cGqEu^J_3k zB&&f!n+^xF(SgBfuuM0EqI?`*@9#c`NsqR^)#LAR7w3KCdO34>UJBxeETurmFgxku zmb*?I491pr{CFV;18o%9-9-GXta#L?*^AVKfTrbgZ8(HeYY90(%Q1N|44Zn*!KHOG zW#*&)e_7%O1vU~a&idyls+ZmF4CMG?w(J~AM<86Hqz$JTIF#OwwjN0!yTs*a(Qi`W zCMvqOV*2+`9F#`wns*kvL-X##Gdj`LE+2G0+Oj8vRhiDlY@$sYzkcyFo{uEc(l^86 zp=2%Valtv4aW)DB7)Z!RwT)3%fxL+y|8s`0EcXG4^26>uWbt3Ro}*X@7}spOI3o_l zLk3j2SiwUmvC++twE@#&Ht2Nt<l76d6zgI91F<w1DCu<BWm$_LO!6Tnt@Q(vxkcJg ztjXR?$DQE>sX$?<0@e!9KOpqO-Z}XDPr3q$3h2N9)tGi5??^JH4tGu_qYK(+V!@Gy z19tBEZV^=S8B?S^?r?fBLMd%_tsO;4c%Si>dk^l5b5)7PXi^5SJ?)@*&quW29dPOg z_kGF;CnpD+7%;O?+$VtyL1Z?zK$3u1LL&QhztwC5wm<WU<Y-5b352xsVT<jK+?v>} zcsa4r1C4V)aqj`BWfR54enqIf$2&FjIm49XOrLfxB~cWQ=$fgdlE?TO%g|mve#uVE z(T8+~OGwEBfK@ailB_ZF<R(t$?QPk5utzzkZ~^-)Kp`s}c!aGpWkfy6JlkzNr0tb- zIm4b3GHTDT8FJ!!7>lflG>~B4*p6IB8rH>gt%pa>lZ6uPauVG34L#A*v<-1sqnC03 z(MXk-1eH@}dXNyoETslc2ua#PF(%1h#JbbD>~tb56ZSfGy3=$4Ok<9L5U&(m?mdMD zV`s?Rkdf&!6<3f5y~T*w&XQe8yg|wc=){R&W(z=0aey}-+(q}x@c)`4fK+^06PmeU z^t64}*Y_TL`{HSoF(}?~Zdl~BvcM5KYO@)O)~|paf!}%oxW+ujGu%4LQ8O9}=K*xY z^OybT1SSLFGyqZ4De|I`nT%wdkB;mU-cyN2>(v_03zTTN$Z<`Z>FccU{cj^eF*ZI3 zFd&We0%{l!ihuT3mV1UhP13y9z+Vw44&e}F4<t)McT|a!@@V1m6q1$*K2QU9Nf<Lk zBLgCkd8Dcl{)5(m+!J2(%dAaY!;Nm`QCntV{z>m*bhU{=G(Desm)v?}cYekS(gJUP zVx*J+JugAxI@+6{fG04~ddnJCL{^l}MHMv7UlWb%8>IO;{*S2Az>y=0NOnQ-QgOm& zImm#TopOjxNDaov26-nGRpCXgK!^~$J-{MYCiF#1IGv&6y9i7v__2cyE|UcjL17f* z7uZs_Z$i3*$uVv)(#&w(j9kVPZUX=%E8Q5Z4n(r;!MaNKTlB&Fo$~%*@eDk^I0~^r zREBAKg^q`A-yq{%abu)4Tghw(DA63BbxwQD`mICpU<%~}n#B&x=1wW|Mr%QPKcTp= zat$Et;)ogPQ^GUDIq>TzKr3?GK~tNq7?km0vy_d37vKpbIHVd%Nvep5JaNBvn&zyh z;rBDx>CvioumJrGicx)vf=rsiC(it3SGCBmCmY1L0oXUW)J^xQ#apZUG=b@Y;yVzw z+(tG*>LoQ#))e78YoxjQ&b4}QqnFQ@CAaO-ivgU9^UROclgukNXY=H(5-Ex!<rpaR z-IUmh@O$t8s2yI-tnJ`LL;&M(e{q+yg409y{<BY5#1@gIy-II_Em=UB$`8e3Ds<q5 znQjA}^~X@wu1oRiiY;O7HfX-#_^r1&i=rtv9`AUPr|`VM+^WBTGqO&tK91%GY)dt1 z>qF{k*tXDh+fc}4uB9ac81+83y#hU>_KL>=>BUacTC;>kxXGm1=ZZ`9JQ5R&b1(&5 z;UN_ZseTpFiBJP<fC<{|v(P#e|JJd);x1WnWqp)%k6IqdcBti<_Wfyj;Wl=sWvb=& z=DUB&<@*oNlAj$xtJcjhnUA~zQ9Mnc8#bjnr`kE%-G8}v@bU-H(1Y*N6QRHF?I#c1 z!xQqz^=i7$0o|GCWm?nipQWbz^!;r3A*P$Kpt}w}k86eMbN*wCSl8EX4=lNviJ^Cy zl~t{TOb?}fWdMa}@VdP767Sp|Si0;L;nJ7NfIUM6E0l6rI&@3InAfi0(<^!zoq!<Q zsZXff0DU08QbL7XFq|Q=vX!ULVhj3;w#uQo>F+2ouA=CzE*KechBW`qu@15ktcrxi z2YZ`YVxr*$5Ut%HyHvQ+;bSaP2L`kvj3$NnS<s%zH?<;!EMbtZcTYm;bC^RPai+~G zzW&ErQHLf-pe;s3tUxU_fBlc8<bTVlu~jGI<s?`O)MeGv-4m2=7(CxsxG{4LpKU<> zTr}kNcsOm>g+gHU+glO*cx)GFTq%mX7&*hP=~yZtsdRZN2DC3t&78Yhj#pNJR@wMv zZw|;qcX@<JFBN#E|G-?-g#{9^bqX0N!`@YUY)3g>`rX_W-|)78Bc5~`;&Ob=eeXCA z(5|qf!aC##L)Q)iq$lF9m=G7a!FCfSN&clFME+sc3J0jYtR%4xu{K6KCmeV<=D}^$ zKQ0+jQKbbZVvj0M)v0wMpvN6msg<5V55?jY;$qXT{@t#`$N<&DO)Ak#`Pr{qPR6#a z)Z=;R8a_z(9jrcEk3eIgfw|i$lRU%fQEi3)5;-`cx@f%yV%@<HjbCKIL>li>in1F$ z_7x{phQz(TpQiZYbM3H<mYv*mixIbx*>+4w5)JwdPJ+Pmce%ObN6DsIf1Q-lGQA{Z zgvpAZ5+fUmn3cEG$qEiL1PIt?0>q&=8!%uX;?M5W44BOhZEFd4%8kiO5PK+Ws~tXJ zcyd@ZoGh-on5TPNm!>E)<f-`U=k1+ely--5NiWy}=EHwIWV%q&ErntYoU~)uZ_%js zkcEs;rDSH{^!Sy*B1r~tTDfAg1aGrBt3OKSld}(TuxpFWdpWP8r-M^OUKc0J(!NAu zwI;07Z!(wH=`5bc5LT{i&M3~IZDn@eU0Y8?*sYt0FzuyX*dx=xz}6EkASW?wOE`Td z6~uYur#I;o;wWZsM)R2=6$*I+?BM8v%opM4FLM_KcVoTZEt2yQ1R(_h?rFIgb-GaN z1>!EE;-^z4Dv-cC)$3PB$Mt!`VpeA*!t!*+0wP^C&SgIm#c_KT!_6i&Gl+3xB_Y-8 zjDP*Bk6-P6*B@RYjzq8U_xR%B!|%8<{Y#W-`<7uANbupg{<OuH_rH6zC0FT&HD>Bt z&@6V6(gc;l3Fjl*&0zG6s=2Yl{^#<e_-c8N1)XnX15uqRN`W1a0BP$9!R&q^l<fSH zXJjdM2JcB>d*_}LQLY2l?U*Eb@H1!gNrX$~9fG~64`CLExR+nPdH&oHUd9@rYd;pB zTk!=c7Es}oPR!@jZZysx0yZ)lyq>0O2>m?TDAttfp_vLE=&j^^;wCmjM~iH*q@9eK z;6x6Qn!1YgJ8>6fxT8x(0BqF}M5F!;?wAEoDd=HOgA+@&m;!XsX{4{N4q~Fj32+NN z7Ya+Yt`mwz2il|PNlqe+1-9-%5RlHcLNhn0plHI0J&IbAi!6Jkd@eJegn|%U*&MDY z$08F&h=)%h3xoggR0RMtLDdZQ)bRuc;X`C+*A9^#-Z-=Jp=8GL`Y`M>gRJa~h$F_e zF!p|fb<{%lK?2dQzhJu7MH~U7@&ew{*q}?u;CIb|*qnSqL~L-~rO4H$*=FR1rSF%} zEORD3cR83LdO0d(GoP(CP=NOSH~!jhz*Uj<0{j1t^uR^mTS=Odaz}Ghs`Jy|(98}* z`cijd3wqN$Xtj3<3?`g=90cIVXFZS;0#Au)FG&CrdZaEVcAqQ~yF7wB1euE3+Bd8o z`*YGiKlgkUBpcCf!sobH{3?TK>rZ4WAjNwy`TwrFcc6P&b+&!wv*aZ_uIeea%sas) z&BYidQggb<DFjJW`9^-HA{|^f%)QP4dbc^B#Ia-9X53nmFym{2RMEFgQ<fYf=AjFw z-KZB=%In|1b`3=6k*;kpQOTJKTL8X_NQKsQLS2R27aj}eF`~Wllw4fM0wi%Y@nULR zET+@>MQmEE4G=+yrp70Gj%N|Y4WR6>beSo5aNH}Wf5wwwE?bXWhhdy>4COc2eMfGI z0Q|SWjilOM9f5QALeS1lSVR(swzbN#N@|JuScL~5PAU6f-}RZF#@oWtJYWoyX*^+G z=G}TMGdYVA1Zp#Ky-{rFW3swXZ)iivbwH68ahvKx{;g<4Don!;eh%GZ=}xwD#jQcP zs$z23LoOE1rc!YdED1|g=@5u3X%HLYGK@G`SKQibuAML00JrwGsl)0N+w&6ZYX=3& zVz{U)C98xhk!^7G`X&6U=4p{Hsv00HN79_+V1cEW<h)@s(Pg$De7h}2D$zTISw)@2 z@^%TWZ9o}Q82lwpc3ELbhXXB&s+)|sFvly=9G#TgYi{dnIfgD$n6$hMdvN(>fcCXI zmg`A$(`&4$CCST<NxBT3w4s5QmlX22z>|f6ehIr_Htgf5RA`)!D@#DN<4W(zfYe1g zl-m(rP663=otE`|>o$_Nt3T+PZCV9(o(J`r99l8Mep^i=@YddViVMLQqLS)ZOFiyX z>kzA*F+$gD<Bkds-W$f$&{HOUf^*I2uvfap9JM}!%`<~~$@5v~ythfO7Mk3{bu*Ms zjlXL71+}1j!t$%Z>Lkw^IdIlU3;dB_Og<s#{_*E(qqlj!S*;5>A9U|M{>vBe8-DR~ z+91%gD?)k&{GFOx)RbXqitn$_r{8^F-QWCelI5$ygX)*ugd78MnV~k{)r37<C^ind zxcN?R6$i9QYrGJF0-uAH$K(d8To|)@VRt$_{JMINB<wC~ItC2L`*xyz{{d<rd0DQc z)_E)oO0!;#p+*lr2Jl9xm*Vir7ph=unkOp*7?D##4@hCc;w(7y%SR{^17SmoY<}UM zurs%mb?U@SnUqQu4EsttOyhjG#h>j{lU#+4fXx0xP?YI?Dw)j}C`**Xq<>*MkXR2m zc-ZCL{`6B&V4s-LAl~yNQQNtA((;lEdDMR_qdwZ|KbF-v_`-+}y1|jbM9W}#aFcL{ zF-{M4a!`P{!ykU_FPDkpJI(jM!o^Q_Sv3@TY;s}+J7%4vZ9cPoHTBSq3B3D924^<r zw8~htt&SVCcuA-^l&q<pEKWxN8oF52gv7#=IE7u|EXfh&yA{NQOyHZDtvf9E-Mi`N zNJc6Py5?%NU^CPY{NN>#$O1<o2|@&1F47h(IjN7Dv(|QMh9-egGh#M^%)Ke#BaO-3 zl(aK0Hnx%Be2ieygW>5-v0)Vl)xloaoh6Sj=D&1tY3{z3MZZ4SbF+QfmEo0@R@U6+ zSYQqs<&A5Mgj<jM-sMOdw|J%o7#ZVgx&<w~Y$2rsAI!hRNgWhZlt2oG;xdKfeU@R! z`>U+|x6QS`$DuRTgWO6;jC@mwYk;OT{UN=f{ccMR)-r4LIZ9M-2irLeC0uyCgo8SF z11f%ROSm2;cJ(;p0=C&;@Ja3V)rAx?ckdCjISCFpKFD-~#DT7hWFXuF#$s-k%f}97 zd<NPe(`y=sowmxAXcwV=8iZIELlbYk#{wZ6%iM9`SL`Cdf%6<dJBvQlj!gvh0u^xF z5#@brC>t#P-&&FT)OYILJ0R(uAj#wMf)Y_Qa*xU`ZVM}fc<6FadMQx`4A*WcBbIN8 zIbD2datbUpl}}%hy;BoqE$p2D%+)82*acFUDfSV9lW&HpRJkz^fWRlpjs9i2rXEph zgW<(8tH_i)J{_VVI$j91$@IZy`7*fDgc0yX>bI`o1Xzu9+IOW@D(5?X*gHoB=S?p3 z8gqo`z_O1#bDQ#a0C@ow$-_;8SRuYR2NHHUkBoEyB=T?*5@lF!_h2&A6pmTw3cH!X zhij3p!W?Xij8iK;I_=7nppN>q2{n^tfItV;7NOco7rg|L$^=F0!-a%XA#`Fc8v0qT zfntOfoP^kltw!AW&Bvj83Ez`NtR<@`bGjvI9B#Z4S6iS%C9YaHE|QS7ei8zQ5YEWE zMSnnd{nI8rtw7nW06?ZJ2LT^!f{>H6%tHHkID$1ihF=5@5YRhf9Z4w7onBO=Xdj7K zGb{vTEWqu68Tm5ZJj$nHPSjN|XM+>?lEAO=DbW-EwKJS`#-FMO6O?s7_+S6xHKU$C zCj)Th)r&sM9`t1ca)}ecH{tz&2UZ5bp9_x19tedBqItODIiZRt44sQ!9ZOR|7BQYN z2onN6>)eG+NB&q@U0e2yXAAgTQs`-a2<SRZIrKws*c;<&&6EC+8;!|3&Sn>?2FU@& z>+&k}2Mx3M7eao#$q04Jh!1*%JEIMGrut$3<^JKpF6rUp{pLw}HXCXw){;(^)qo?T zEA6g=_Uz3|g{x4-RX||1(IxvvlpWSJ817l;C)gc0T%w2CR%~zEf`jF<0=shT&OtY0 z!}nUXLtWR?KOOJC+c`Yk`IBJ%VH4|bhG>F=s2-Cno4)7e*7@em!QQ*WXS-iNc=+&^ z7CV~--%NqB2!Jf`tCbfBkMw9PJrJRu{@?#oVHwpeu4B;|Nl_^)`ntKI7kl3<%l}q8 zBZICFT);7A6@b2J0`vyG9qx5e&Nakwpoji;z*~g7UEHzs>V*LL+X8?29H&pLzD*p? zu)+n3Fdl8<>+?a9A)BDIsZV^c2}rKI09Ka}CVgE{gw-yilsM}W4%AX7=o&diO7%3( z8zxf4U9=B^E<x**v@!xsl-Mxo#yZD_-XX7lUp<_wcTnv&m|7I`cI4C)b6Y|ifVqD+ zw<P5r_of7Y(nez;L(=>exY_6I-_YCQ`|1n+`9*WXmmjL%^^p(=YYwC;E>V2K22)UC z3;J#P^YwMy6D(!(R9sz|>XzGfu@0r$%`0B34LXBHOo_)X2bkzNjKWF>iy7L-c$C!) zk~iRPU8`(@pa@xYJP<XaO=(+@v*%dKqR^)JsjtLUM?#3@;?ne(Uz$-;-7}?l*??Qd z3z0$cePn_Q`OEay0HHN+j*d00F=p8V#^DWgDI9mvk%=+7kaX3hRWks$XOsy)VE0eP zqYvoq0WAo_IopuHFV=!_C91_BBb?EsO}+!g3Env%IqXSTy4c`&bVICJ{GqeJ-)MWl zh}C$Ept3mnWJHD#v2@+CNoepDc4ryh)fHmvPe^i5y~4X0c@X>^nVd>rxO`TY7~Zh$ zEf%^s0+{Nx!d~|$hrKgi-*r~xWzTqpkz}6+<4JD6rA$VG96A9urdwzLsFf*5fw#JV z5>a?-1>c+w$337zk*C`wOUE*l!uh0h1P#xor$TbV6K7uR{>S$`JtsLZx;~^CT9X}6 zryO}}$QcQ^_Yo1!Y9piaNX5<-<{mtt10sfn<Gvp`FMrEa;HMpIi81u7wZ!hL7cX{R z?!7yBd9;6c42E6mFX0cpdA+xDypM;VzSA};j<mP`d|w_asK9XCmjZ|EJC?TBlD&*@ zr{Vf=q8F(yLNJoKEA33?x|C(Ugjpv{OuWW_c``wRxY|=cbMJ9uMz|kA=0VPA0Pz61 ziVG7;1kOzX6e`0hZsL&U8<l*+mGi5goh&^!6b|=3juSZz<(a2VK=th)*C>CPyfI6o z=F?K9RXtvpY2H~CpOsvZY`Zf?k$u_(0dE62ZExG^H}1rHGp#qQiypzrJJEcSq>m(H z;1ziH=xp03A{9KEU4+hWk1qP?Qi&GB->)Gn8jhp2$Go8U{-Z7Yx4MUH9yIg=GnTzc zL35Hdx)wMdZC&&ijr?Hgk?k-nJ@UhR<f<KJJ3)n!w-VGCrj46r`<Nuy1jHg?Y9|Sj z39h`tULskKpg~>q9zOyv>U8nXn14P-YS^PK{L8;Jg2jHSAPxO?3y*~<@El(apQk6I z?k5|m`}m47bZTipIPOzU(tUjG1EMSN1ES$I9W?_=)`8jSaHHx)AU?zFFRbsacupw< zI#3K4P=eNefv6;_9)4~I2bMkrPd8v;&lDNxA~F43TE1$7RPi?oK~Pzdx2uf_dMDFw zFA-3wlR#ZZ1sw%f;$XFM*(?+2p|L_q7@k8*iW<?LvI=NIqv{ckE4;XmwRZFP@Xfw) zf=65ai)>d3u|HNDR4pP(-#R9KMDF+yY8CT$G!$?-Mg|uvAS7g<<OKB#xA&r({1{nv zP#3|@D%sjyWqnvL%2hgssuBce$elZFg+hP59RRkB!ngG37~z|=4mMHQD9rR^*;!$e z5aZcVE-F|{icz~BNye)f#}2hP*7V#@>Z-Dow;MH;QsYF>Hc$l|n|B7TBPus9??MqV zE1peC1;DhsEC>!Aec1NabD@Mz98|bFrG=Sos2~oh6=9IP2c?LUY;!8(Z$2LRT>Sg} z<EK=VWDuOq_t{T7<MSEwm>4ERX|^CUe<-2OFlNpa!`DhV@nZ@F7^5FM#*7~?5N^e@ z8b^){`IuIxtDrdc=_OUdiNZ_CLV&Pq!KUJIY1lw8hn*`_Yr_P?);qCgITn0I+r@Wz z)0alGs1B_C=b8#v>O=CyOuw)O!BC@+QO@>6Vu3(Rg_R0|*S)uaD?l=i{)BvycWPSs zk77k=I1MD4s76tP+}_rOKr^}v_B$cHz`K2s-&T+HypjeI$ZE~kgBG{beq&9S@NQ0* zT^P|K!=P+t-blc;cH5!wT5&Os#e*|mYHm$>!NX5R$a(Q`T_<hG8OzKRGzUSGZ#bon zPXY=}2{HY9=>wyh)e1!E$|v`HO(;~mIjlgT+e(oQ5|vKe3wG1GDKzLakf0+c5I*lM zfKF{Yu6saE+Oo6O;$sn+l5@zpN`STvrnL$k16mbwN5<bF@yza}5UwRfbnv=NW|x<8 zi)Es{OQ&_54ryh=`aRrp!&JFob@=ra+Qyu3ns%PQX~lF@fP93&=I|=LZGce%uBnkZ zhvS)CcjV$pQH}lclhmbx6l3?9QE^JU#&T1v9}6(l`*_;3b}_N#ZgQDHX5<H*0X*6h zy(n03q7K+yew4hbNrEhDx<O2<S;j{tFUwGyW(l@y1({NV8;^P^MZQgJ$|Tn+SiO#L z)i500z^Q%#8^9YDidPaj<46kxNiy|BbsjP|uzg&c1UgfYeK*0p_=}?CJ?l%Qh;srp zp7*8Tle1BMre_TnjR;hW6}!B1evUL4$}bKmKUjYvgsl5N^}D!U#m5lS-G-2x0{F^w z1Z6%pn$I9(!fbDFIZcxtlZA&dz8HP@!kopRdYu6df(_dICy!OPKY5IEaY0w~`Fpxa zdFZqb0+lh7_x;ODyuoJtvXCouqNz4szIydKxH6Si5oW`J%n1}I)|~>T4rUuK<eR&v z-iXA1Dr#3&_Zf+z8Hj-7T-uM6P5^|deu*+o-~XkQUlr#{IAM?iwF}dWdH|X?26wn+ zt=8R0OL>t5iS7&vJGF`v$X5&Vvf&HLEsp5@X*;66!*Khg40WDE;?ZR;NrO=U9wZxG za7FkVP+5il`hmWXPjCd`$b3#uh0iCdIfthQ<R5+u_<6q+BY?>G@AF%r;hOk1|KYH> zfyZR7!(vWj+Bs}3q(U!Z^q~(OG$HML9lv3xb#e0=cg!2tg%<>j1#cazpD#Y;v*{XY zBiAPmh3GBs$FFN|Y5{!wIh!?p&9|(=cA*Tb*VDq|vN`Ncw{STK6p5|ga4Siw5$r=U zF<Q`bO_KuZSBoA(;qF$7d|}7CI#L8YThDHe#io4z0XOkbp}~znj3t;N?=om9iCbO} zf?YmZCVfqlQk?^swJyCdKm2iNPS*LU)4$NZ5lqB41u~UlWi1@j?%5(V<MOt)QAI0! z$23>quFkfyzEk@We8R)?X+Cb^O4OGT#cOyoN6=;BSQ$aYuUDF4VbnLF-7dQE(XZZv zr(`Zx_WZ$r>wSuFW#E=cd@<->g*fF(XA=$}_;WI#HFLG`gCwFm#n!j`P=;w)Quw-g z7+V-kTnt0GQmdkE2zhYDPEzo~3G(CnemcFJY;SELqZ)2n9>W@28ZaZgzP4pg?s3cP zQaNJ>mbc2CUd$v}60VRb?)sC|4F*rb5f=*!=5wF!Ej&OE+ci!)k>mFm_|DXCbl~}e z<vF-)B7YIDODLR2UPckNEl5nh`bBFLl6gJLI{8XK!45b<NG=yFW&515&~-f5OxnuR z{o>HqDp+tZ)ZKz0m)HD?Yifo}aQFbEPLSn%FvEH6CCMy%5OsAl#qJ}W1L;FJ13v6v z)WtP>9LpLqaUOgMZ^KsR4RpBv3LA(w@mnwvA^rFf-mTb>Jj((jeqw<J{*tB?{dhsK zgRzK^YV;By$i$@h4FS2;Vk9B?8<k~n4arysz5ykI2!4XZ(X%0yAzGb*v5HPE_W{9v zk1oQD)RK|s<u)D+r(Zq1(Ln|NzIqrBseP1Fk;SUyT(rZhy#y8=j;|ixJAot0%Bw>) zsU$h7kI6k5D^ZF9J&#Hh@JgXXp`}8w{FVwTZhb4i{raX``R&))R`TO5ZRNLL-_}+F z=)d!=d_FqA(MDd3v<r{0L4FW?NHq}sT_v)WC#sjPUNWQYW@-9!W(VtUpM2-}^V^&o zmnJe*r+xmnJBKgzTB%!GKfUnn035u0_Ubk<z)Fzz*`FQU?%t0*o|4HarMttU+g$f$ zOK*Rj`}M0=w@P>Yc{_fq`>l7ow(mHST>rR#c&nIaKd*KGUhf<p8NW#^3*DC8S1$os zp){@(>k#wpWV{vQ<1yt%(yM|xB(W)~w;fSLPde=CWF?Lk>{10)^4Dtlc&$cWVz?Oh zQ{Ub5(fQAEEBMrjANr<ba7jYXSeo5Ryh)i;40mO*ge?Bp3Pj-cSRU8FwG|Xz{zR`& zwGL3<g|$~{nv&X`TKJh`1*t~7<s5aTwykN`sMaASh^}39tt~8VTB&E?!l7Ou(3cda zB?}KTAlRM4s_88o5`>59rXLv*N2fTNC;9~%Ug4|!_Y1&&AwTP{s@A0gpyL5j@8la# zIIn6sxRJ<C9;2C;&)I*R#IFPB$ZC<KUhx24pPbZ1LfVqkA)?%Du@`hOfY8uIS8TKJ zKpv2)=lj-HVVL>F7a{Y8!&2$T>n#Be1Kqo}MUbk2LUa(82ay0e>0O+O8zje0npkYk z)U0A8i5;gY4zO>t9&0!&wcCU<(N`}T!m-`8W4lp4q(uWF=Wn$h(d2YULaAVqpP)?u zmw(P<X9tqKA0;mXraI0bTR}VJqV@<;dTAUaxr*@(jzO=%8;l3nfZF$@$jb8>rTUsb zIc@r&;9b%IT`V_Pa%@az*+U~VWPr;-6Q@2YAp|Dl?=NNd1HMhHTS%$E|G*Kz`p5{x z?;(FpD)bt!u7pWl^pQmmNH9#8)`)=D1lxCucJetV*wA^}x2>^Ticw6h2v`Qm4y5Cn ztt1v8S(_PhgA_?Ngpaf|mf^<K0n+?e!xhndnA|Vt-8JNeWsr!$6^ZTW3&N{`M^t^h z?<04W4$;uyygO!5J#S(#fscIb=_g<HjR-tLx{o-Qz?ECyh{AP<HWD{+K&GdEZcOfc zb~1k<GH1gC?{#*H4dj>HDK=~gxb2aRU4s>6JB9We!h?KNO|>;vq^AU4bW7$uH9Tsn z?MVuNz3;=Ua)1h(*m8pONjOlomopLxQy6USxqJyn$~H`PDvvY2rj^v_m*q#;!-LdY z(_FI73F}B8wkQUyZ+S(7>w1*UH#a$cM%9K84QTG8g<yR$XqK9I8TvDOvNMD%IY4j~ zvK8QF^$gd2)8as+$N#U#VL83^wsRgqQF#T?gku!7R_$B9jlx#kR0a{oLuO9NC_#PX zh?wTyNxd41K!tgWZNMvR(9D-36PoJ`E!DZW#(}SIu#Q;igmd8@5mZJF>=xvu!PYAe zL_9)e(CX$ci&w?LFPlc3A~ykXA6`TtDXu_FN1;F_VIAM!BzwrzJco(;$XD5K$#OQU zx70UiODGW4Z`oR~KDJ*4B%EJSd(uPJBX|wM@E_lIkQa<VMF5@&fs+|Zr_YfO7I%TP zE^pVzzhdD7=^hVA(>vz1qfA4tmIkHt(H=aU22pEBK137n&t{0oi-ai3y~s{3P)|E( z@h>Qk5USmJ*|`G24JGjy3rHrx9n`u)!#D#iQk>ttTZf*i4h1H9N3#rypba`7BmJhs za*wHt5;cN~?QN)5udxzdx3gKj0=3r1j}Y+a@XgsJkSY@aX}kpwc$201Awvukhm^Mh z5i%uNgD+f)9q_X*nW1tp^sjL8GROfnvahv4d%&YrTLoEPhaEYqh^jNy69^(f|0mN_ zp$)EK0XRTw)o<ia?&VswfhX=g;F)5yiv+<FH5r|L=z07vK<!U3`8L@%MGSUJ5799L zX80d<_6rzxt&i3L*PL72-h-@I!fR9TPc*mdjhVk{X8_R>-4wvhN<Dr+b}h-`J?;{z zk9>-vJ2@=IQMgOsuA}h>_D~zM>`wbqr>hFr_HkJtFUTrfe-wH$I96sz?YPh$)yarF zNu-wi7}?fo>j!1Z#1ayKf(qxu4*H;2sKL@v%^~I56bd7X6kebSj14^zdgz-0+Xna$ zn#tlkK0Ko5Jv3fLa1PYMhW2*_d0gcc>>%QtLP5?8kBXcbo)_7TZWnq4SWz;49pxB6 z?mi;&?6<jcodUDm{OrgZPq&|N_JHL?cDoWyLVAY)gEA0z^f-`9DK{LDMi_}D6Xj{p zl^EfHX@~7>CdF?>@Eji76$7?<nKRdkuv4CAO~T?(nln5RW{P7D?DdDJCx{%dK6K>e z{>u|nNiw$pIVq0!07p#|;lbu)K4QV%oV$-e7|8??VEnhJOkaO9p!+p8!xqtIs;vY& z#uwNNnkCAEk$xndPQ+2FC*wtbXx~2i9qq?|;+gqZ+?6$kb~5?%>-U#OxZ7;-=K~be zuypp%&+WDeu?mmjuGm3H2kny<z2_qxO=l;QeZ4nn$8+BhamGPJ+lixBdk1e`yxTqe z)9d3`?{@Zg_VAyhhu?hr!|scB|Bt<Q?{4Eb(ue=gr<kMgtZBcZZoWnvXBQ$N2{CU0 zNZYdG!vm5ai8V=Z0n!q^`F;2Id8)d4dS<$31|%RUyUB5E0_aP1b=|tEy865B8`f-N zl;U%^q+9er1&MX*f^brs9=rQ5tjE)KlXQIhuWF`Pf8D`9&z|h=Y`%H=`I9eOucp$m z?V_q3gSCA#52$xsVXwRQ^6tx&-gjQB_6`<YyO|YKN%wZk{xROUEwLuLw_SLud$96n zD3h0@{6zo8rGv5h-MztHzuVb5s1B0%|2jT-L;u&{{BGYEE46}#L0W7<!w6g5!JzZ1 zD{vfab$(<l?CUSS`TFZWJ^AXJrwMj%7;~@l>cEYwLBH7Ev>0P|fAAUupg7JQ2k3W! zAg<`nBOqAaVbm67bz(5={_wgpczw{>e1$TbuXeVd^){Y<9+~h(XVCrXi-Yew{a$B# z?_j6jd*uc$FD}vYV0-6ax3jUKc>`r=N}cxmn}g0v20T%%u>f|wVR7&TId}H=ULP2_ zCY2K#wIIqDJ3k%_x}8lM?~8=6)^_B>mV-hlZ1&b$Hb%4EPS5k;R|zRXAhtSQ%chuu z&9-;8*Oiw@1U2Igy4?+1d<vQ0{n&_aG-<tJv{jyKfgM-6R*1U^%u3sXtsX<_DLh5m zi`Yq_KWslI=+=A=i1IGAKsm-Ah#5ENfZv`y`DOs?=gY4S@NusRX|?_L`n&z^%N}L% zCo5mCp#EZkiJj?KH^k2FV6(T?+e3x1y>7p=zSsL+#KE&Ko_&*GwYuT9x?8c~o__W9 z*Iz$N?Q`9L9=<_$d(d;xeg65EUw-jLiW};N^YDekJ$>@^=U;#E^qUkL4%R!Ho&MJT z=3XP41x@wOrtKZP-s$fZxF>=2yrB_Z4d*EPQqBa8Q~1gow~$?V<5m)E(0jG*k(T0H zY1Br}NyFA+%ne)83AI1~TcMo)Q_8AQQ?CtfwPh<@IlA=}U*yPyW#T${x-NG5>g%UZ zzWFA#<nn}DJFqjgf?(NhC`uAPThQa#SKoZ``IldOnLt^2u8{u{+ONE{uuGC<H+wJo zo&K8xq>&AJlCbqaUOxNNgOY5thFhJ#?(~D^&&mt%4SU;#hGl!qq3FAfmrC#rsw8Mv zt3TKdnP+?5AHAwbNC>uUL6V}~TiFx?Sp2|YyD>|w(?D~99V}*W0-25k*m|S;vI7ZB zYpJx8McNE?YLmh#sL$c_baMG@e4Nsv<?~%T6Ry&$1vUdE((iGAy}g}hUw-N3Xi|{p zdaBT`ohDk}>30tb{hD-FwFecM^-57dwbxzYgH-KzH}==N8^sYg^B?~BbFG(c^^<QN zJ^kd<U;bbL9|TE`$2S)TN7LJ@>&XF1QjHF#sQwC%<n@HuXQ>yvba91vqI)m(zdwC$ zfAfao!lz~2;sC+qGe7xk$uo{;2XGdTj}N3OaA8_;E-z)7D1dl8xmaED(q@Pp4yT2! ze3x(K?faQs-xy}8x&m$;K`jNlZryl^7bVKx_pGST<EMQ8*p|@t$OEu!=5d%t@z9&2 z_de_F=Fl(n{bTw)v2d`)rHNtPMHZGS=m3x0%Uoz&EmUYECO%++{(SbuP6-t^yf}D= z<O}@s><KIIG9C5u^!hAcCT?jRF^k4&J>1q_Di8<nCR4v&mmQtYz5rmJ)#!dKvVai+ zb1*(y{o~JnAB^zmH8W*)?a{VhJWf(z3O<n{#HiuJtYMI)BNh{!jxI}z*3~>&N9>tN z7kKLk3F#T4jcagIts&m{9|((U9*9&j%Wv@`8PU=-tcoD7Qh$cTjp;F?p@<Kct1-NN z`<4;-Qdt5s#2%?3wx)*I+7Lyg@UIyFIX${q8_(AK<T7#)_Lk53tnt^6p5fEuly%2J z5B#79uz38S#Eds{99}v%2&5x1MBnl1BFh3cBFYwM5?^PA{F*V6bdL4)8N7uh4RBlI zvk->@Ug6@*eGuU$(NqRtSkoAcKaa*&XHfMhtC8V_5P}Qn9DxcP#pZb(h6BE_!P2u< zmw}%nJ%j}#--Ep5TemF=&p%F3HxKy+0Miv*9Eh=<SH<8@ciB0I1urV{b?4F|UyLj+ z|Di^VD8!N=a5oxoSYIv;xJeQ;V3$g+&XK+#q|llGA{#r`hA(5Q-D3S#SH$gI_W2$= z9CG>k*%1FcdxBiN-O2eaa~cE%_vCg{$yaVnyqzYzoY?T3`2RODeHj@C{}jCcz9?g9 zqF~XwU~!_MLJ<FC5+Yk=W(_aG@kwjZ6va%&`OSkeO4i1s>yv*;4M=7ap$EjsKdtC^ zZzS_Caq^{7ipdm7mNo0zOpn5sW%Hx(qnet9uV^V3&(O}&96-sBuGjFpS?t*`KY&0~ zP=vlltTsa$!P=KkpFPIe=)UF#CP-KnX`?Y}>n}#W1Dw?YwxTFcqVN?i8LK-A*F~;z zi<oyD4BUcI*8Us{khmu}JbOeH4mq;$c4rt2b)ZAV&*4Qi&>F;F-x0v8;dtsH4B@G~ zKe~Y9*st%n5Kg)1m1t2v44zm^@c@f<2ZTa4p}H;iJ#}K49v*)Hu{onmeD^KHEfFjr zT=@H5s)u0tOC23IkZf`7c;`=?OLo~o1@b~f4z`%1dvZ2e&o39g!@T^oHiM51(wqp8 zHw7yKr0mquOH+g}r}ZL!j?TyMQ?W&r5q|z<ad;y9K$pPJ*=C+nN-*ZmmK-!-Q}4|N z6<wDgupy{NQ{3Z5=yXAHI~b9RPP$R=&ijg_IAx@EIz<clPAroa+_pw(A>VR=F{gzb zv=}WE(Kpv2=+|SOc34zljd64CyH_8IKXJw*PKI9&G{zy=ss6~i8dbL{DnG-g8u<m| zRnaWp+*|h?^Sr_}9Y`(!X3`K%VHK>o%d(-mGCu5V0t^|UggO5L14ISd5_pjNf$2h< zsoo+<dh9V$Ezd0hc--im;+9@jeB5yfe!Ta-5Q%3kXd^&Y436op#*MxXE|gyJID~7w zK725z)s6lo&NX`0{{}25gfEwQ4|tz&(QF7va_uJJPseNdlu>r->&sd9Ma0eJ$Ab!i z<xa?moM~Y~j87O+Ti%IwP39=803)P}AxdOdM11SxE`x*%5%4_RA1I_Aw}34d*mm~y zB3&hTIZC-JFNBcILw^C{e$IyhJZG!!Z}B$%h_tq+e?rXS#~I>t3k_c!PTnQhH;vz# z2vct3EdFc<P;<0v9kv|x)exb85@q;TG&uRZ7^3J7wb%=uO2z$fgUiIe=u0u#5Flio z-JVcWK~BzP{9qJre&PJT6m(Jer;q#_VyoO437HgX7@|UiJL=sJAsnWHm7*!_XIc)j zIK0Q0$sT?gC8Bj`*Ek8mo(+(yXLS0sq+Xt*H}?_(zFizGsU_`w0&7UrT=UM51e0rP zt~w%NwX^?mIaqfjswT4s{s6#7JUKbIIp^n4M)zsAjj#<v#LE@7Yp4^J`z4F?ori@Z zn=!x8U0^Z?B-Q}|_wqLfHQ$IP5nN5x;8`G-!Mc&cDJojZ(s==_qH}=e68wN)maM`e zRBe++>9-=K(`Zueh`Z0{R!|;OC9#q~T+W%YOUscJ9;TAC@MM`o5yfQ(Bzk)>xk1UK zTq@kf=z=NsVzcvI_u1hBXmU0ho+q%Hw!w4(OP0-q%;UCV+~y$M4cTpl?!u9MXBlja zS|#xX%UUA7S>PHt9{p7b+kJOEMLAxU#4=MimlDo`TY{L?IRIaRt_|`kBITR=dg7?A zJP4kEZBmb}FsH1GvR_CQJ<9MVABuf#j89N4EPFjVKS!0Y>^oR*$bpoqcZ5)F1c9}v z!gB!>`7vjh$dAqkt8D;kq>1y!7MoNhZRqt%yXoE)!?ro#TJ+EC-yG)R_hoR4zg8fP z;{4?h#gkaH5tHKuG!zZvjjq$_@Cs#JS(o!nkZ|{NMGyx_5Mo-u7PmlLSAiS4iuL=_ zYyhjL*ow#nP^=*EiF0fzK=|hKXHf*(8HI%|1)p$C@X)e4dUX28YRxg?j@^c@a3;=% z#VEF5IcqGDmcai9#PR{bDl&mbuVgd?doC!BCxPg**dky_u@1xHKbTGMj+yyY7mrqb zOFNF(e_N5AjtG&E;vE&w?;!i*&+&?Ct3Ttm=Ce<-Z~u~gay`8nee%mgRCbs5hM#Aj zaGsjm90AE3=-P}C+-mZphFb)PzU*7$kwS{;$(!mXLl%#Gd9%GO?gL7a9a*aMI1tbZ zgl+hngRBQClKGAvs$d?k@m|xhoXsS}CC*@944sSW=&kH~O6;q*+_Dm0%jherTmvye z>+qI_AwU^tay640xIuII{$g|y{eF0UItd=-lWvROKV5hHMwcxxCx5QXsQ_D!`)I3h z9|ibtO9cw6clD#nLk{OslyZpLunZI_DX1b@Rkbmh;>i<H8;jikHRz)f4S0LRK~dg5 z!$bLdL&#G1?Eui3tXeTV)o)M~<=->X0zYAn>)|OYTJp&u6J?9WbA9N=W-Z-XvNeWS zonMRCMY7V3e&q$?v>a?9G&vU-5D_gfxAYo_?J3K-ySb@=ugzpE7peJXhU+F@epRC8 z_b<_wC9)1;t5xL_EV6hyu#GEzD?%;TP{z>Os34;CtEK`D^dZ9Nzy(8?%hwb6^9z_C z*$Sj047$r3yeJrD!#O42vT5g^PZ~xT;C+h7_pu>PYzFGaG}K*0W~(E+$;AYA?<_3q zT^|z!ywxcpL1->G@P6D~Smqb#OR~}MDB1I6y%Q=NZ7AQ|_wbzq<JEY&azON+srpYO zrk`{uQzb0&>Y>gFXIBD);Zd(>GuH%@mW5$SmIkaI!4>C5HGUM8&c!?43A`74%S*%i zogK+@;eUa?Wlu59&gGijsJfXueClR;&GR8n3Y37TF)+TC*8q4>kh|*O*PA02<;R1T zpJjvb)oZj{d$#t4klZ~aiKYL|%?9RuTD)=OQwY=Kj>)6+y)ixo=FWkj)5{^zMf7x! zz4X0D*6j>K&W$9cnI%S=2vr(Q`Sk6um7%J`H43C4ZDX;BL%y<(`*C6rsmBW5ol&_y zk*ZUS$UAa#VN!AX;8BlQsQ$jZi@jePDRHk|{knENSwkq`w~<hL0?~O$LMC4V^8%;? z2h_pUuLrC$=YjI*&B2HgW(1o`%2jOU-!BrIvv%0b`RjdPbC$wp4n`E4uY#04BTfj= zc+Q>}$P?rkpI$B?TaUw364RDMbZ$xUY;B9?<m~A&;8M;EGdV#ac5YuPy^{JCL1k|0 zQgX;YLCzVslgf;wQ%WN#C7l(nwdV9$^jhRnAnr@>E<Mf*+sIkH683aN#BhZ#{j!L? zsYx+YC=SvmgJ3-{JBru$7HNob7YZ3=MaTj#pJeKA$Gl*u+MgEn$!Xl@HW>N4EnftF zbruYmP*C_~nMq_q!5#*$k8D<trZBz15EMuT%duMmf^?P-iy#j}I|Suvc7~4{TFSAw zP;x2>(*$+t<V&{4^DM=ZjP%&d!H5!E6`vr7R_c0zdFA93+|m4yiRHqq^JSKMm0=b= zUbhU6g7-ZCImczwX{I=3(R(zn_E=bCNRSDCB!Xns<Bo?o*BuoXlk&7vCgs!tv#)3( z!B>HV7$Ze|Aqv~OZR{S-ec4}TDe-v_Hj&|rxc4BGJfi?nS}(yc6(AczI_fPdSWJW{ zDjK?4=MXVXGlp*9|32koql$G+F6VL<isv;{2QA@RUC7x=nxa1xzNM~e0iQ<9g)is9 zdwzx@qKR=lG8q<MA;upckA8c6qu=7Q(3DbOnJx>I7MO<hu?!tqYP}pB-kgLP4^d(X zfPVVb8s1#z_36>+ND7F=fOTM@mB8K}8inlXS3G=it%afo`Gv8Y%fqqc!Z^%1aPS7~ z_1n?tGJ7JD0<?TJI>NO{nEdjfXA9ik;IZ843zVNd-kx0cE|1Q^7JO4TH^b*&)Xn7> z{?`jdb9{p8a?N!Cm(SVgo!o`v1I4rP@o0@Xu%mPF;NC?M9gZ)bVax;@Dp`gr4!*f_ zjK|HHTP{NUQEFSCT!7f|g6-Rh;}O2q%lCGXPRHkY@m8~dcNcH9j$OO-r!sg^;wuVR zCD$Lvj1KOM5>~dyI!h>dnrlusX__|V^ss2^z<AHFTeT>PU<lR`9)SoEv<R|sz?5*5 zqey3!blfN{frIfhJ)e6Q#YTAxQaT@BU!RZGMwiFqp+-3GKuYp_G>493is^oo?;%Eh zo47g|ccvLXsbR#X!Rk4BC@@)AfNqWH`1A}<wnMHl%^UKBU!IRnR5ssX<tSEAzvd<m zy7Tfeb9v!Wekr5EPTow1#dFpFg=iQoSk@Dw`aK^X>J8&?uZ+Fxbr-r$htpez{W;o! zj2%^8nh~o2jKM0)0)S&j09d9_MS9=S#Z{an92YcEM9E;dGl3{5Mk6+PE-#WI^@s5l zuA*nKhECM1xr<`O?7xqulQ<@fQ-#Rxvp`N^E3`o)>~A!0gzm*rNag;^rh?)|;MyVX z8z0DfF&Q6%7+;;cVijaC3LNGx<27}#mDpw|gP*7|IM*e~JZD6bqh)C&%`G_(%k<R9 zs^#?yd3U04G{_w^_sy46#2-A1ALsPgJOc$gi&&4M#77U-`Yap$_stkKFf}1G06>P^ zKXr`{<Rq~ADX1T9FRrFYH=4oTI>v1vJODJl)`Rzv>dLF>=r;~?F`ltV!{IF|X3TEn zD1-VxD&{x@3{}llcNb&;#PIy>@OB0(9fMD&qoZp+cOZKfN?DNNXq25@Uti6hKYk1h zBK%I4YWD(yVjMXx3>V=xgJZ_z9W39TB!c#F(*75I6E94(LvrZ_i92BW{~8&~Lmrg^ z)pKCG-1lGPeL1>*jC-Uv!}G_Z%g2`Y9(zEgj5{q1ejnsZ9ql@@FL@I4(hd=o#$sWt z1BL6!cCoG0eJ+Pt;5KS$mJ}uQTnbz0+P|J;b;e_r*OL-kgh^$H_g$*Igz>cVa>2VL z^w4&nOo=XRi(Fc5lTxkQA~%Ftu;%v7ZS)et@*mXCYJSrduv7HRUw9g4Nu)Z5EJ#r5 z9Kyh^Y6PNyX7q~P&M1E$yKd#fKWR&AE+VmOHrLa&OT_kOYts=kPMZkB(&urlNV*+p zH%|<<)W&;T<+#zJHeJm@7~6<EtyQ*eE}K#Z$)AcdVOOh(OJW67BD?F($5IJ+E(uVu zrRUn=22AkcHY!^+Z+SRQ1Q{F$f$reNR^{uw=yB5>Be`9aew(&o{%~rZrg1gD@!2_x z0(ntX5?Sy^K6v0r_<G2DPJ^9|-u~8sdwf}+g)cvLyt}jchHoJq>~&rpY~eNO&Z}-* zz!gupXLz2?`7DY*l!!-9kRKKGoLkMEq_S_=Jx4v~d4(LsMy@oJnsn{r9bGm#<*;~i za<i}GR$UHXjC8Q;LjKhptD<;t6MP(7IvoMkP4d5CJ7o-025xl`*H#e=p`%?HK(wQC zwHG3!%f=L=Tyz3`^+gg9c@tZwgWt)EalF#uJWDQ0fgmu`)@;0k($G~G0!L-cS9v_| zl)^>MC&@?;TvT{{v-Ct_h8o@o@61>*Xr!-CB9#2+|9~6m4}YNB>aU~g7gJvA{`>CP z)!-W8*}w0?&xEJY-OaM1|F`OXl4&2EUJOsiN5A^rR$yM~w}1E_@ddgZHi=(m>pPn} z{R5Q3SpN=c;mN<JTkLmh8?3+SY}Yn;)$exeTi`kP+7aG#H#c{FsBN+Z9kspJsco~f z+gb1Jy{T=}+1!0yKg!GfpMFXV@d{A%*1tRG{<ycjzm;gTzO%KvGwAJg4>r0lJNuh^ zjqUcg(XzK)gCrYqd#7=*&PE#7HcV%4XSZ>n7yDbgTb<^1>zmz9zi~7n$KFqAQZv}r zcXr>@Q*E(j4fTc%TL8HGrk2#h(dtP)Y}rJ&VcRD94cpeSRM@V8wXEqzr~h3I6Z>Yp zmoK~h?)G}~K5p~|yAVFD8V+_gzi)2%y2V!a(t^m=u-SX{dauP=H}|)C+ifTo&GrY4 z^tH9KvA@~bYhLCSL`H9SGcCq!Av^ocqGjj%ZZmJP(PpQ4!rjdl>+E;iZTq0Jx8HAr zkHLDaelcte_FwGvJL}CT*?ZmZ4qoqUHjBw0cbajx(fhu)(Y&dzJN*qIyhb|d{<sb_ z_jZ~ISw!l_&c>_e>80t5{eJVHgPoUq?Eu|`#_IH24XRDsfvRoWf$%+%->&IyZ@XPX z?$lQA$HYEu?Z60m)de$m4_@{=TPf6s?e@3Zwp`!YUI$BTr`ck#_hz$uu)WjY>TD)J z)F!>X&Sr1Dw#m+m&EDUVGF6A^Y^TJ+%iiW*w|~%NySQe%JH71`Yq};cc2Y=p4fguI z&i1R#6v|zz*WLaWjIYGXtx;!tySM$SsnHfhdqX2JRko5AvYYQ!XMZpN^z{?|ZNIYt zk(k^zH`x0Ai^e9Mz5Y(hKy||aOY5&;c-O<U+1XzIX(y%L+)yvzL+UmRH0W)o$g#Ke zYVXZ%w~>~t-HYC4_xt30*6LNi^JcK#NzzND-BxEWNjKJb7vr^V)n>rG{(e`ab7C88 zV&AUKpfcc~yW1f(B{hi+U25HCf}P#H-d5T+f`Z-I+~?Gddm1#|?fux@9PD=cpp@4M zbi|sk<6zj^>OvYNI`Kq?j#R3R@Put^Pg^$Ni=TRRXC!O(vXhc-;f$~PJNvs|v{=Sp zce^RU6ppvKGZ<`Q<!zh)ls<&#DC{R$DxA6<T4ceWw^;DzPh06@dkz~H`s~S*CoM+& z>x<s2r!Ct(OSFShqv^a(mAswOIe8=6HjN{}d~VaK)8FgWF!yc;(;n2RU2Rcsu4|i@ zn>#xj5cMeu?^>b3-p-4i{zj4!ZOTD6WeY%Pe-9T9Eu6jAKXeDJ+9gn07^~Z99IM52 z6gA1!*?cXg8sO~KW_i-CVR_P~W==+bpy`{8Ms0+%Ck|0Na7b+rlKv<gv2D9ScdIu~ z+wPCM9YByepxN}Tn_)>U+sg7=woRMHIe;yY2{Zjwvs%(to86ZwhR_DJ^r=nybblmB zY6GT-nhc<p<~Fqb`!zBx7*1RaY3UcV<ajV%_g|$<fbE^$fVN`qB~C#JAhk_{)vb-3 zyQPPNSMU37t1i8*-Tlo$N|Nian;p7A(k8#Qf_xqfk_MW#>4O)Nw*2~QoMgJ2&1Q{j zSK~HxEoe3;uxgXlxk>#fH8BC#rolDpTD{mz9#IXRdLO47r@^`EVM<%~HeIcE+Ktl# zYa|Um*QS$Hs5Vo500Aa%zqj7F^{&}gx3k@OA$EDU+wUh`TS4;y4y5qCH8<YvcD|cq zY&IW2>UCf*2#t%(Nf4cbr@yna$0aCCkUQxW$T{KwI82=fw86&C{)?m~t4(0|bW*ZX zThO+9m9z-7&E`(hiJ%SOjqInU(Zd-6Tg}JgplScriv&7@Ms=Ld;Nd`Kg$mooUvT=j z0CDGaeTYtn-0ZY~?#DN&C|t0FH|sCfQ@dPfmU2CWje37;#@U<Q7rSjH-2c9Lto5xo zwV_!>)}Ym1z8<8E^I(Oqe`taCes}$=Cr=UlNFTR6ZJ_PfPyW=d?K<@O&i3Zct5)k# zC|Yi>f>GD_`(A%<AE94*7$8ty?`$-R%}5v6u!Fr$k`E$1x@qTpr1e&>Myf^H@4*k2 zAT#(ozVCH^Xk4YW>+kHPozB*1@H!powKn~oq*k*g={TOXaIvAZ>&hCw5NmcD9*zb) zyy|Qv3EBo5>>|3^Fb-mPDMqtlC|2wIj@Ay!6@IH^MBJKfbm0<P|E_VTVcG4&{HJl; zum)rZv}rbg0^Lo<New)hXDNATO_~C3){e}w0XJSUhGz{2_@k3L9r{K)o1K0$da=r6 z_|Asvcbbtp=)T%Yt4JGZ@I$ZPL_auPY$CkWu!%o(k`Z&8Y^S#=4wr_JXeh1kbT$!s z_#qwcut94)i7*jhmthDRMQ}bfg@(%Q8@ayR0j}cp?k)v;Vu|GrW}~)j-tQt{k3(Ui zdG6P1T4~-gd90>;t-p`hUej2<AwnSAJIQ1p-wck)pSu0jX@0k}_Zmm(y}`l$psN;N zVzrT$JIH%TAt!IX^Wv{y=@&a#7-%CM<>SGBy|deh0BiSRe=lW`S`)Ytwo`J#+US8I zv1m5>D?*p8fRcucJ*EVrAFT;48R<n$jEiBAeGq@Euvwuo4EdB{S7?Xyos@A}Xa_n= zkwBqcI+Lu}459UY%KuPkDYjfn?H5{7|8zE5HT|Ktv6u2Y6~=tst#hLx^=U_ZRP}j% zOp#){n%IFgd4V)e#!8apYz;+D?<DhdcKSVtW{C<m(sbAs34=Ax$5P8W7h~A;#m?T| z&enXbTSCER=_JPx2$_D4rV4aIUW5Y^gxbbp0OGF326R}8=v<q`bjaJ1pyp;Tb+EG* z>2y_VvG*gT=_j8cF*(EkBsrOXe3tE@sDev0*4juc?2qDV(vH{awOLahvt=+#dNPO5 zTxRL)$0%l$pNw&(e|RwpUStz!u7=lVtS*2O<zr+(qk_{UJD&`XGgLd#>pZ9h!A3I! z^0Ca|5~S@$Zgz0sfmvPglj&nYpUNE$LKmQ-bBs)HKCkJgHN;E~{|jXXw1gn5P@tB; zl*J3KCNsH0Yt<=cC`WNL%Cxybmvv6A@$L%yN%b7wxy{D-Y6v{%L!hw11u7;SXRi1G z^3HA8^YM%|4vNSuRNSd1mfME#VhFLA-Va;kiv2;7a4WH|iYxLP>T>g~RY*$?W%78Y z;uDaJjw{P>mkHbud7k~wWj2~lb3%;ov8`^^fKP9%t7vgK86$7sl`m4v+#RzrSOa?H z7Kt9oh@b0QRETlKOr-mxZ0FK{<IwQ@xpX-A%$F<kv_3EHb-hc%eZKzH6@fU8{>#e= zFT|m8hq1Jf#WikMROq2CS-UYCknixhF&)0mj6~!^K&tZDk*ky*f!Mg_osMiay1qtz zlNn!5%#JYzi=A9^69dRIcc<nAGU{4*G|N`rxj*=y*OTe^cMf@ueLumNtQ~eWeuvU~ zMu#k;B}CCQ?rkvc_oFEuxvm+N_hNufC9bBChnJ`4BR4vcqo1*&w|Kx=<nddSaKX|O z%XgR4WP}ys#~|fk?niJPu~^yjmSSY6drt9rfxC*8VeTnPLW=V8gv9X>`-%VG;{Spb z{Fe)i(>is?;W?@jLF0(npQt*iK--egIaULaE9I?BhsWcaS(d%v?E1kbEz;-;%IjVX zu|ES8LOdQ$kMXYWZ)14|)=QWC1{|oFg(6WYGEmfIkr~-R0zQR0b1Ya=ihiQ|ZJNi< zs#`wxMplRa8q_r!e*h3!q!Ww?Dit(KiA<L8!b`c(+D=j*P0lF-MtF}GOG2?Cw$~>5 zlUwC3+1f2t>=g)b_EZM2?eL3lO9KK+0~Hh?SkY+>`BktSM><hwa?LGTIvcP?JJe(T ze=Bdt$FS0}7m6kMRNvujB=rMb2mNF{JU$|1R3snW9S5e{j>;(aB&i(PtBOX@k}MGa zRk)*^KNzEUmuk5Tq&Gd9Kr~a_0l5_rTW-9K)3EhL0YHK4WPzjJSHqjx3^giwH`HmK zhZ%G-i1X%>8cxXh2o^0UUNn;dY@6?9aDqccdRcZDuS90E;pW|FTR-a63UVR(D?{CH zw`~T&a9M~%_qji!nJzWbMyJ$8K(e=MSQ-=Db3VM9p-C=Op!p_8M>kh0I8aMeEd49I zvld%YYwDO>HBg2apN?055SBH8b~ZtYVjMP5p~6sVn=PFjzrI$sZQIM)JwHPBjq%oY z+iuRRdDGmjj)IQdnu;RBR_A-(mtY*yS4%<x(m||*DABB+kA_oLt~<~0W}ci9@o6@j z96|458$cfoP`9NCP82)qMMUcn+b&x}%OofY$P(OCALaA*5d3l>rFDS=Dd(sp?Y7JB zTHE#OU=3{Hv>(K~PECPke*+AhmMT;e!C!I5R5jTs%Q$ekv7M-LpQ4yuM@?wDCSdx* z{Fe^+iz|cFKZB5WK8C!oxt>fat8R~Vov#7!hOrgrUMLa0J8PUx&YeYuHM(`^z@8dH z^ArXuQ`6yV&4P8aPI2JJ3S}F~(4WwB>(6g4D9Gh>W<ty6J}w&Ym67aB#*wCzw=IY9 zOKDG7=54C_0`4i&Y^9E}baNoj99nB7Tld}dba-@K)Q6z4BGUY7+Y;1tF4acVtCq9P zLw_UYaKoGdCw@k!;hK6lmBuN4gph!BIL2F^-eYrwnW#voVhnu3BmI?>#YWpHo*IZk z;YfyKzPZPk9;*==GPsQ85+1yJQjTrYe990uhj@c<Mt%p>&BnjeuW)m5csU%O^K^AG zp3d+{0h}9VoT>~vp1i$;41<kDtn;_<aR%Blfsa<qSwp`^)f@!qL28g{p^;UgL_df@ zk|M{VrB&(X7w{qX+C$|eMT=ume}s2$;Y*v2P!StN`>@kmI^KNfr&{I24$XnXSjs%- z%E}e{g;(ysZ#a-4)MKXY)~fTqg^^^i!;N+V{fT#wkB&yOg^OQ>CvGEcjAwXH5VQI- z21JaU&o72oWR+odikC$$vrDj#`YS4GBI}*dvdWHbVT|cfk4^~=Fbw+fL5!I;#CZm_ zmyd6-Tf^*XcFQMt;YvKpMyP8p^_Hna=MN4M00X`aQysh2i@Y9Q@U%+u@n2s<fZBK! zawsv%d)my(5?5CY+@z@n!G+S=c<4BEL2+%D^rPa;4k=e6`plNYW*5VEI3HiYAq8I+ zrJ^b$J(=F>i5^H}O?ooU4ACdz@Cb*{X_cB=vJswT=Tj<-^~qMw=3pq09l~ry)wDbY zt3VoOwf=|%ucvkz#=nADG<w1v@R5r%ge}1xquFTsn`x)f@hLhwOM*vVm<Z?hvw)6A z4u&M3l<1q9$9F2bU6+a65Y9MeH%6e72}-t;SWCN3ZGJKx0e#8Cv8seShl+p{&R#>F zQU%l)ig&S>iY@{Z$5S6MUvOlICdMC3H9`Xsfu=Z>Fr4<AR|$$^vQ=DIAgIL7oMSVO zXw&e8+~ER<JpvjBFh;gm<YkF4D&qWpma1QGA+i&d$lXhXJD~ZLsY!g`f4?4!4?y_+ zHaWkMV7?3WIR00CTnfPKBk1g$vihnRMDW`&+(CH7V0eS4(qUsjvql2sEyXdRO^OOV zE;qS}eRe_x_mMp-v9a)|Vr-=NtGZC`w}XCx=B15po^dhEqA4DUzzM?q9|GYJ8wp{v zhMWjIHv!)(#B|Z7$$p?o!M*)WZ6!gf?YjB49o-|c6WMe*q41HhVr(s275Dk4hTZHX zy5q<)0~Ch<6DkEyp3EK^oy^WAH|Gd8;gzM~6tCm~bZ8+N!w*5S;$s~W`2#3L+JZxL zA`NCY<7=HmTQZ&vi_nIdS9pvr4krjG)QgWMYAd0=5Jk5L<sPJn#vB})i=8~&5&BdZ zm+jpQFkxf~Z;9@6)a7}F7j3BPV1J!rPtJXqm~Wo=M^h+m{u?h0@XZvg9Oe?TR&Eml zwXJ|qwoL9?42O=Bmn)i`yb!?Rda*0G_}$rN%8+NsiJE}NFYZjlZqT_9;`)@$s|pPF z6m=nJag^jQ$-su!G?0ri^QDwXcrwI^n<~X@RF`owlz_MBGY0&oAi;NQI6vI^9B^_z zPDi04M8)=Wm=zVsf-&fUYQo-Go}6=M{N3IYe>JYoDE`#pxMciUlq;%bJIr#yq11)E z`9NS<tGXC{KyJ!tCbKEp)n&^Qfb+#_JR;1laBZCU_p~m3@~z`@rvChO0-@lYL*h9Y zBYOog56pwNPx03wo}NPT)fk86Bf4@aZVT??a);U35U$7g47Q-Q8L|RiQs}6q=Jr<8 zHY}HeE*ImPYC?yq+v!M7rg>2RVt9=OijTxtEObE1nEaO|bjTO^-Z;GLX4Vhjw$Kky zbg#D=L9l)xn-grCewOX22SD~V=pO8~?yhzBI~L<E63?=Q6Xy^LNF|uSh6s>>Pr=%v z4Ebt!aWPzT9@5-bXe$<U&X{X0(`LVoM{lu8oYTxJ1cwlE!07&vQ_0y7)-OV6ta=SQ z#5WV?k)DR|2AeRBj0mSByx=scuVLO8g5lSK7IGA+^O4nNcuW;9s$~OtRvBgu_z>^B zah_AI1K|_lPg<#Lj~MksnDglKP?#7=Um$7CNt@||ct~VN<Kgjt-5_p2M}i0>tc9uM z7(&Mt<{Ci)Jj%WwVi25JZ?Bj_c@Axf)V`5M51u^whKJc_k3Kj2*@D{gxJ=i;<IX-- z$jEWdzX_I;?`$_?2_g}~)o~mJESrM!^{uYR-%+CMJJ&xq;MH_^g+$WXmJ~YAI=ejx zrK?+gRCXxJMBcf*GsZ{Pe!Ln_j|==8Wd1eZQXZTiidj<N3L4?16;PY#V&3x4buOs_ z{Cs90o|HiC_+NzB%9j~VgZ0I28e0>w?Qc5-DJFXUH8*D2pFB5(kFIT!JD_`Ev6Kds z8HmjoQ@MCJJo@!i4djB#yaRS*z<fL%j_(GDg3LoFMOIe5Zd*Als(Yr6yWm+qu<CYm zL#WIt&#_Q4j4iAgzei`&32c$^5s$PYz^|CrJVkUu9&<HWA74PrBQBUkp@VF9!`Bd} z-X-cx;U}WUXNChM&q`qR2k#z;qIq!p0KZtoU(7#&cDa0BUP3c+rH5rKFNSa>33e`` zE!eE?I)zvMb_kUbjaZ8|q35wBP;0)LI5P3bv3lK)Veg#Dbq~Znhdfv#r`OKZ&g7`< z{+!h5hLNda<f%shNh)wn4|r*)%+yYBu-%404Z>AINWr;y#D+_OEvqJ(K-*{#6evN@ zePfs{@--vVFbYTS?u}~3x$6Rx#2#(0JbEqw(3(wn+nSK*wn?w6HK-@qE}gJ}F5Sk; za;}gLuo%S1NNJr!<gEKC%k<ZT2m^6mOc1CzHcTzj!pSoOHEKcYKToIicE8}wAn_7r zUWS$YxabYafC(1{-7*l%G|B{4z3fvOL!QU*_P!X?LFy^%BgU72AE!Z&E!7l|xunL0 zkXce81Vq+j%mqhvXsOB`EuL;<o(4QPszIX8WQGI$#pwEMQVsph$#Kk>0l~(!V}Oj1 zf?N+b|Kj5JZ6vsxy8%&1<-xrVBq%zs#zJVu4O)XJwQ>zr2q2o6MAn$QPVc29Uf!E! z4=%=+&iqAQ(S!FuW^NI2{2AnhV=dS&VxL75rS2;9?dVv8+LSZF<I~14gIBhE`Fhl* zZGli`0m{werK3}3x&tyxo*5N4;30u~Q7M^ixLoIq<J4;f1y5XJ6~>uU2I?Sb9jgAr zkUfIQ->(1^P~(^h;qyL#TlMB5iw+>03*g@PqJy~Yso%h&JQN3j=UJ73fdk-u`Ko01 z#LMj#(Tq^ta1FHF7kzG&G`;aOU}*C;j|J`^dNsaW0b}u2i9#C3PKgokog{GTJWBaM zX#^EDZGa-nRDkM*TPd$$6Y-c-qwq_>pTQGHVPTJX2siCzd55^|L)$@#k9_0O;~E0e zbBaGb|EIA{a_kv+G0@%vB?^pjES3ln(2l0e<45r8Y?Ozm?`oa+@!W9rcq(pb5fVp~ z9FRF??^W8BR?!ZV0AET~R9R(S3d={D1ATG;)9Ou#%z>db+N$V#A2jEoj-zY+44Lcj zUj+x#>`Ve|E)_tXbQMVFM4k**W6o7ms+%Bsn90@Dw=B=}vV#{GDj+Ui6v`^%cr5UY zY`ViA9by&G?t(pW{MDeapdJjI!k5m={$6=juppo}<Biqb-0fN3C*rx}zL>LNA{?uJ zb9X3P;oRk;)>H!0R*lF|nhFA|g0l(BV=bN--At<jdb9sL45;xI|3Zyv3^=bTO@qf< z_>A&ZfGXHONrSsWA&bX!zPdOKmz1~OYG4S93hVOD7g5ZZ^y9hVBDCx%6%Fw8eBA|W ziBoE82z}(fFqJ~DS1~W)y&#i!K7buvO)HH4C}6(<iOk#`iVC1}O4MMaG&-vmdfqK0 z&I&NgAVFJsD}>FEt9x(Rse`1^Luxajm>*x_Q!gGPGEWK_$luf}<Chs~y01O^@+)|H zXESkzk8$@7wK+q#s=M+CT`;<Pg1E6OviWi0ADKBdx;o_wEP1aCb{J%5cC3nO#U-HE zR*^!ni-2EEDB{L&<*WW<=()lVb26ul(Vp&Ffv|WC5y}SSC`xWF$3PZ*(7E)uFNS2u z8v2T}W(^?iqpmVYeBGfiD5!SSghW<xJQrq8+K{1iq%?(81$PP@6XPxxoD6d04!+9P zEuOOSH8$h9n1{}TM+LxnG0eJObJJEK;o7??mVg^V*Nm1@_9c=8ex>lIm46TXxM5_J zH1(B)J5^&1IBJ4vp9*LT#a{q@3j~6c#z(*MTG{0_Y6Zk&$n8nXjnfpgu5zxq3F`q_ zD564GTVSe~syxNTTolsHj(Jl=%<IJ7w#S_tk|WmeWi#2e25q6(44{uA(;uIL%T>&g z_P2L%69LyCah^JXFZo{H6dOqgs>}2$5@LNEyd~WJK9HCN%jNabLgR=J^|cgLvRFUd z1OB{i{Ff*Q)t-tuLk;;B5l*4m5+qaMvA7%@PpH&3bNLCVwl-UGf&yV~Ms`UZ@OA@B ztHiEuw8yWFkXB4p6sG|RMVFkuMU-jY<8n#Yts{=bqPyBTH0iItnBek|FxH(N{TPM? zbd)>OSWLRA<Itc;A<8YmCnM{E5F=^xg$Cw~@^73(-%3&K@s!tZC%Cm_4jS=mJKsE( z$NN#2sL*&%{Fm>FgzKIY>qrBc;vU!pb;RRBttI&a1RLmmqaW~t^`NgmAo>eyPi%oN zf)~6vB1Hh`!Q%xao-m=OM!1`;7ZXs*(@Sx|s*Aa24^TMZe1g|C9$0DeJfT`H@!|1- zyPqT6;K_Ydzk5@;2RBNE)Ri@|3#kNX3e47H_g|J%JU(2QRd0y;-Q9KP^Wh<iyW<89 zcI95&Ap<qw(^-EjI_Vx|jGsPTo>tLlDqg5Xx>e9VpG8=fF!=&j6~F}AcpXzOR=6vj zO43o}b>#A9sx=8atOqF(C_K!8yPGs54@cK;k^YnAbgwQ7nw^J;yZ@@r3XCqr2kkt2 za)Ya)!{1PKQmUiakwor-K9Y+8LfpJEI%5P2w^U(D`CBa_?q&FgAYfcl<#d5>WTs<C z3!74}I~knr*2!@CD}9)<C{rVfB$t4X(+8Tk5-?OU!J<TsxVvG$kEWAH+1420AYQAo zN%QGY7e}txx{IRFPD0QqOM=_HTA0yI{6p^J@o06s!%F@Mcx}dYxi^p<$_395@Blp_ z;9QfHv9oRXjdye_l-p7R3Bfh+n3Gw8%U!vKMn02HA%YDAyEtFCx$Ez{D_#pQmpaJO z%ku>ID9=NuU-0?{{@zs*1fAi^ng;SgG^oOdGd+lrC1hq9K*0XfA1>vzt=$C_gr7m6 zj{R#7(#?oLOfV@r#46HmoQJ%6amZI?+!u74dLU-m%}n@ld@X@|yPV-|xY(TfU7rO) zl?Jg0F{mId40>CoAIJ#pKMM-PB%d?gL;&i33O$@h>TBIo67s6L%&@wW(-Cg$3pwDw z`KIH8t>#+_uGuImH3zI&rAZ}{b^x*C-U*O<>d)?cDGH-qj!$lrJW)X8mNe##tRhN{ zf;{@~hrSS|xSiA=x%#J+5Kig`S|qoKj?Qsozzfk6TsMUsl~<kBWjnAv^eu%6E~F*V zrsmHnRzmmMiv2-Jl9=7Zf*d?R{3sBL#ZB=Z4=?y4)llNh%*GOFLY|mSc(H<<rS;o| zD=F;xqw7ut0Z`V~i7(b|ux+UQH{l4l@5U;|P#-`s1L{{eqeS0XTwScJ%R;J>jY??< zWzD=h|7Z^~Qt%QAl`M;@O78n5-?+eKRH9e2Sb10u9{VZQ@|&A@WJZMfU_~@gQIip^ zt1@^|-K`qncboj%1UjI&!^$dd{R)oAdNBE-xw^dKTI;$&;DNx;hN!>Hn47qq?#jdC zHqy^fM)tM8oibTinpN4F#)TV`%W)aFj<*}86FwIQsMMsoMD+V%He*~`vLV&>JiEKS z1oJ?iFG^A9Ca*|K6=?;g4J_^iTaZTCYZPw*Uveq=*;HB{N=gL8CSMDrWhz3P4K2Ud zN?RMfN(sf$JGzrc*_Thi>{3EexmzAL8co-r7><4wYs3!>1@fmS;Bcnf=M`k0Rz_&* zsVt>M7oR<Of-CsAJ+44dn23-GCw=;jpVgM&rAgr!oo}+9LRg6hCLZkvM7=O>&|r1# zDW-<FzRCVS{FT?2ER|IBw2~MyC#J0BkRUg+=g2Q^I|C@$AT^d>cu6gBr1!>oA<@Ht zlhcZ_)=G{Js4grds<-k-zb;TH1|-V|>B?LCzo4S%maOgt7T1G1r$=1t)zVkhP+T<Y z$jg$fimO~NZzz)C$=Sr0C|<>18Fg(7E@^KLmXcpZW^ff#No#rWRKjBgUO)I#X=Wrk zlR%M{(N5B`TUrSfwXP-*G-5PLlL`VqD0h)1{HB-@0CtiBsrave9A&J$zNL4MR+iS% zc*g(@M4<=mLJhnh!pG7)2wrBXu(p1#)E#Bv>%x0!zN5izyK3IOppFk|G5Dyypqm*i zS50l>v4Fgn8VaqDn=SJA=gAc@KRo{>6L#eY_|1CyReV6&uuX|P9Frpf6yjD@^M>b^ zyv7GBk?gAvCWL6R#dfSZgbJa&A+;&H3Ubx&AZ`O35{hc5g1*-D*D?mRH-);)t;~n& zB;YqE@K7=V(Jdza7PgOd#f?Z;)?Am*yu|4cr)3_c^;lh`E<;;e0endcJ4djz1*>^C zNJyv0%sM=|bx(kqqXgUPN4C{_&^{#j7MANv-()p(nwtustO?#Zy22aN4D6KGm7j&h zZHr7yC+pprP5gXTdQ}`nvC*22!4qsg-d*5RI_7xh3ze#j#c(|uPqq4ydrf3v2V#J$ zYZpF^1ZE4Sa8gx!_}ZL@jg={7?eAru>k8{M?HAQ{lwsz6x7eW*NKQJ%oirt(R_$t$ zsz9z$))g^OCcw5lZ__1N-Z7~7xmpW1&))ZQKox+COGF9l!A-8uvC@=vS8(*;X}Bw+ zr`oNzzWy-l?e5{<8159Q`cu4>R67{oWa3U(BWU;S{mo67o#Ml{7h?ShShZ7rLvDDC zNR&aA=`#RKW28X;<g-sC5|yt9UvhMkn2szpQr+B$qS0CEb)b#vH=?DUbHgR6LAly2 z9|0ED%C-aA5CIUeHsVnseV)}~*MKb>RyG{@-TiG%{klG&{s?iU7rtQYxG$p;q62I0 z)+*pTH#p4{k<<x4vn_O<zCt+qZUh-ZALy%8M-w^%hs~%wDug5cg;PF%?GAav^HX?N zug@;T@iRfJ^m2TmkN!EIeo$c8$8u%d%c~n)YC>2Q6_EL-@&SS>aQL`k=xJeFpbzDV zCH%yv%qrX6l8hz#*v^p2R)857=>#d0*2<_dD2zVk$e<OyXRLIFZo8u?tz2h?;cgmV z)Pm6`k{@zGcbknL2K9>juU_cP{2@LIZoiB+q%<J;Oe~i3TZ~bSFklu5CV=aLbR_gj z{jU?Y&#p)3a8CY>nZ>fJ6S#of%OgCAz%WF<)X3GXB2jEkPQO@HR2}H@a<5ft$}H>X zC_+?#SW=Hw+Dc>$|6+}HlENVaK|V~c&O}FxC0;QeNzW>W0S?MEV9=tzLWj{V@QOEz zmykI5^9g>{_|pXlRp!LHVZsG+Iz3AdxeJK#WJgFfrepU8F$`wtxl9vvG-7>@N?3AA z6AZIea48;BD-+(QzA$!r(xD451u><_&S(_nzi*IFm1~^zpnDUfEL|B^WOsGnShDXN zsT8C^oNFOnG`s~=ep4o3F&TVZOeX7Cb0FI#LI}+Q6{sA2h{FE5_g2vyyk%J-G`I_o zve~9J@4n<opct9HtEa0G7R9+d7i*A*W`u@8B=OA*v)AKuJk1Cz`)2xEg;jN>7oaU1 z@VfGXM{1?6QF582LcdOKfQho>=5>l(m3$R)mVYYHJoVRb$)DSJ%1<N0stGRgC!2DM zu@MZmHBULaxqt*mL=*XXYL6fXOrB-P$(~E%2Frt7Gpq-=r(lHi18Y%!+8*=y#O673 z?$=P7QXp}~@RG-ul9~~v4f~%T&|omoWS?L$nBIZepaN9&!-|*r_(9{X_#>pQsCBUi zG#6$-w$sg2O7OYG8xCr12`eg25w8R#jP@^c!pw>21%<$unC~k^9(ScI){Q3rWl#Le zp7<=Sgi#vlU-krEC^k0vmpwt(GPG%EIsMC?sJACf=cU=~e}_3STev;ZcQ3!d@YXv@ z{w!vP^%DdjSgaS0vT90a>y!Fuddq=qoTMw+`8)L~TRsJATkE32&M74uy>g8^L+*Fq z%vpZ2nDTG;^HahBUswd53kQ5K+6YF}STp2u<w%LTxng>#*xcsVH6y`;KQBUS>=g6g zUGZVD>1CG3aLRaj4>$wm8XVu!?b(1Y20@pCF&Q{^7qaN{G*~|%&IHm{Si?)PIPx)i zpSvOMN?45H49|TgKpIoUYzMJ`E9oLU|GCsHgU8go2IOP$#Xic~lSy1)(K>n#al~qY z5t`oi_p-x8CFHDXRs;`rF2ny@1LgVi_1B&4?e6BmM)zfBe{(NN?|JHk1qqL{&v7Kb zxxSuUuAPs6#naX&C%BqeMnbG3gj?yk<mx!Qn{zIALM|!Zd775%D)I?7hkHreIpE}A zXj5lfctMw!YqabIySiiww4M%83-Dlkd4d$@(Fv~{aIivw47d*T@l)vu=g035iXdA) z7H!_=_+r}zxdaG>IjLUMsjGlxh0GE7EAZqrqApyDU$oOY+Rd%Em^jj+-#ax+euUG- zUMPxBaH|d9)HGD{Sb(IP)%oR0<|1D0(;7_K=W83fB1cGJ=|;q_czqX-_)Xr9=&ebh z|AR6dHp4kmWYfTFx(oQ@9sUmo<%%F9%3uA_5U-y~e~p~6f|HaGDQUnxakPu{L}~<( z0yjUr(vXFkLucFNg-}a1%^}hv)D*NqB|_9en*j7fI<~l&)fEHweh6>P)3yiytFY)O zdOlPRGu-834R$4)`;er}e|SDQY{sfIWmY@lhcjGpls~-J(10+lUZH3aXt@#fPe9=w zH>)d!wL{R@e%0j;smSrcAczqe1xdKf-+>oguR9^kafM5;91$85&#aEG?onRFODc|+ z-cuGqyFq$7R&u49M)o5CL}^cP`N^+8-_VjA{m|k`a7{2Fr><J=*x+IUcT1jZ2NX%U z7~4amag+T`?U@&cT}34T+*p>#`}8*&TVm+YM51AjsIiT!rn8T`znx4`6j~mI=XEIQ znO~FAYm(qZ3u0w<nGUA57z2LTPTodBur$l$Zk48K`F5I-;&QiO%jq2nXHq|Zt|7GT z2^4Wpm0|mYazj~rX^)8d=#q2EPNqqDao4Zx?C@UC5zHJ2)>)fz)<^J~3He5kr5qsG z^RvqNpgqDlb`sYg((;p43uN(>FhdIu8Z_xj)vM)fqwvE5Tm*tFHz|3xFy$xtQjugS zg{EbelxH2c2X1gusjk+*DNEq{`M5NbOVI8ns4a3WwXQ578;2*TGUgt@bhetgCT9G4 zT3gOKc9J#=nWyjienJtaKASlFkzn-e0p$<C~dU0#TFb`A_E8#vcgn{smmUg~vz z3ydIr!cbs6-L&+vI4vwN%V({Q#==D?IE431d9_$>5I<$mo=v7W^30H@b6)smb~c<| z*+d@KAC!NC{aalLHi)OT9OJ5_fh_#N<wcJb<$I^VE7{(t4W~4|XU{ht^ge*Ye+3`y zY0tvIX$|D|-?<WmFK_4|p>2#fKWm@aeFauSG5KUL88NtFoNJ*t42!1CF@__$9<}s5 z6v#>EAU>2ln5AjY)+K%lnv8PK<s&s1c}ZCqHgdN`vFWH%sPr0kf4UgN&dCWbsRwGh zcrpE*D5N_-*NHpDTDzj2AXnarDB(jugeFF8E4R{wHLJoVABD`YMM7Qx<F`>+(C3xo z&>W&9u&O!7K^8{I@oWq1UR>eD14OgLTaEH1qZ8b%VPcb<%=8Yh%TrZh&f0IF2C}fv zFwAd0k=gHF7*nQ88(^yBv{aO44?$xHzoJmm>2z`fFRY|Tm3P|d7>5JtlIN$`xAb-j zHbt7sVr?A5)(1V%32cr(1<N1`2YZw>oSG1VV0J4cu{WBX%HZ8r#3a1JD6f~e)!@6J zp5>&l={U$8GU4-_w`>@jzzaD~sF1Hvwi6%0>LV=-BE8CkwzbAZPv|xzjZF1KFGTA& zPil!c+A1A&M1RckJx6C$yw{8K!H8Qag2p0I<%1Uk8Fs=zv99UxR%TQauuKCTKMKgE z@PwyOHlzq1e!gUqKB$%%l2#Wbxbj#Yvo&40wFqfhSgn@Ad_b$0yzGaV_Y^gOpPQsG zQ#Sl>e{{UAk+FxU!;PwM{?iN83-cd#kP(SzXzX*{i0ik*e2^^|I*1`zzw8Z?+b3`R z#}}+7=RQ?X_W@1gS!6r>y~Ma+qhUd@rUA}Rq~y);=A737FX&>T@yoQ(bD*)Z)RtB+ z?1f-78?2s8T&w2Pf)C+k!GhLv^!!b+v$|q1f17>%Wj(f`^d(vZ;SaCfNNTFk)ygYR zZ*faTqnvTQ*&gXOOWLwC$AYyKi7nI8E{O)TKBV3T-VLmVaM8f%S{Jh@qY41Xfcbc8 zqa|tCQRgnR+Fh1*)XK`D4>f&IQ4(D#qzR4Edg@l37hdPUDUg@5@XLLl`t@6Y5o?|& zQ~TB#t9o`R!0>KOies8cv%{r1Zgi7Epl^#EOqG0Kc2H`}QBilkDf0v}24I6K0lVe+ zRkar~3W1DuS6)y+^fJar%Ln-iS0hYa&k%Y`jfV!<^-NZQv2WqKBQ;};5bwGJZkXg# z9Lf*0@#nC>vUX;c!5kWB_IJqw%kFDt8KcTd6t8-2RiUHbAYyfhyF3+~egyI~+$V3E z$?5az`mCOcbcMoXa_y<Iyg8XR7%8d0lwhQeuiUiaDYgv9^K2il|49&V-M4(m>sjH) zSN+bL;By_#fOhs!ei@6zD~YhQpm1ct53`-ud!6v}k8geoKfYN%T%Q)dSPwon%=xDG zx1e$MX7_NnI9TP2{qMsL>sxQW3qCi@HY?%h^<XpTOhfSX4*>!zoBc7+vfmkJ7RWBO zBVwFMXS8#zIB;csa}zU1tVvODlx*{cglyj>VfiR<E$btq9k^}qe2k3O`yAVZ)pd}1 z5g~1Y(}RA79De#3<p@y_QIy|ogqlPC{;)B~$6!JUyhytzzS<!c;`+Wc+eTTdLd&VO zpx~Zo-#pBoekB!0K7UpL=OZ9n0hf4fsoi*|eKJGxE=wIpD%;K}6?C{Jso+}ev50wq zX#+)Gu5`ruQPHdbh=im7{(9QA!?SW@#S{g*vL3RglU1l`PSo36|C^i-A`Wd~Z9Nd0 zmi1mxE(u`G2$yBNl*R$QE1Z>W{|JPLLgun274CXER|{3D?^o6{CmHJ?N#*DK1^Vto zE<55=e*~x$z)+8!?|-zxVZn*RO39at_2S5o^SN<qKx*UEsp<X^yLdu8we#^HzBokU zudgUabK6%GvO}D_u#tzjeGqz#1Km6NDv<t$f$qyhGF)0NiD|A=l7-|Ea2IZ`%={7X zkU$D)L>x8n5OUh5e0czCIvZ(Wwre{<SC%%XWCGT7a2>l5y#`7yrThpEyyqwo)w59_ zW}8Us4L<Ik4~w7a$s$SlHkB296q{AR61UBL(Xe%r>x2`kme#NOlIGp5e59l@0chDu zKIKPfa^}DRk$y!{OiG2sVKJrDgptMU;sq^H6)~?`=tUBe{xm@qWr7$gyVXbWP$$c( zCF&a=Muf0z5D(X5geztg6ghMdJb&(TQN?0FI<RXGOIRwbV(8-uQi3igDEcL3xB2SQ z`qn_*<}5cybMW5OVJWvs(y&0CWB|iI7D)pBKTt8zVn2lhVmMFT=O`VPq8<hH&xGQI z2Bk3Ie8x-&K^yBOZ2u9PD>)w887m@e;p{~~iq}#oqc44qp+9raDRTXIZnz|KiQM(A zaoL!&2PY%{lLIVpc=x33!))Lm)^Oh#&=v=Y{ufmrkKh?W{(z0saqpklXBcpDYaPjD z`jv?{8~<Z)o_YL?1sk|?Vms+@*@iKz`S5;;bML#)tWR#a1%~r<@nFC2klC*%&RABz zU&TjY4COcmTjooL1P$`$+iaGY=oM0&bDwmO<Q9RL@JIwMGlfpMkNs>Q@U1G?Z4ept zEzXHY8KWMJ<BQXhcaxn0ImTZfW-nmN;3-4>fM>)t?XdK5i$!1byItHqun$J(F+u0r z1wB~_T*6&CkpCDok)K_%Bu*L9ux^r4`(Pvp(H)kcMdmI?snG35z?s*8iw-W?rZ$9g zbID?rh^pi~U0K(hbR<JI93%7D0(lvMB@1XP@AEK|M5r0`UhnegERaBT8w-lU4*H(! zP|nD*#_1#PUs?J`u%&_(>O#{-ZML;wo<^R9H9WOX(A6|98A>yrl9Ix7qU@~B-Nq!< zmLIV(ny-BhV^r>#(H7NvbN4yn*-$o8as#wX+KOw3H?v&fG;sOx<mQks!d7ai+29UN zqmP&r&ZPE;WPl$raxW>qni;-|124<zN|KW=!)=3oU>nnx=<tHL3$nwJ5>n4kyn#je zNPk<szX2yi`Vh*gxOg~r_||S+YOusAasyRJJ4Zr`L|&QqQ4v7xWv{$vnWPD^g0Nk3 z>yNHGy`X{pl6*N&mxa72xoH6sV0(A}uhQXT*<5UsWRGxxFhmJ@d}HyTH5h=eP+MUq ze+9=LKpSO0QdPXkhVRB0Oo|nehb8Tf7hBIKxJ+?T-YhWMk8lx9Q4Wh9^4Zx4*?BXa z4|B+L;S@SL#0rWr3^7~lt_qk<FWZxsk|&|+)bLx$+f2B$1_uQSHXtf1FzM@V^5A6! zV66Auf$#6idh!|x?iJzm2-lnKI43d`@umqXgpHAp$dc@cv{l!GCqL^479RUikp3tu z-GZ}8OPApUP;L!@(Zka+FT?3{^fILFo8nzKvQD1m?XJv($*IP0rZoq$L+lp44yQZg zSL<oOl>u|3+}>>zL-Gd|)Lg&1Q8h;#%=}K4!{ep=5#{UPrK<_3aQr)|!aa87uGYz@ zhA~@f(C=z=#4?4EPPovn#BH8u*9Nzs#yIIn8F>hYvk7Kmxw`2DkKlme^kGY|&AG2( zkM|4^LZdK&_gO4&?S|)17+C{{T@CRZ11FL?c&v&K+wW|04kiTSLUzeDP`uJQ(PuJl zF8cgluJ6j#EyuLbTDC~i3$8=a9pzLRj7cJ?Q0K*3w>AoOjHb(>qIy{SPZzO~m*1NM zqz`F`hs#`D@hgdvA-3Xpa)Ea>nM}iw9WGuL?#iJ^7GDA`li{F1d_LeH(F1IIt1(?= zLlO1daaS?t{^3_#;BtlL(qhj^9yjN@z1gC$=T`+0$#E~F^TlzcMi8x1LK!I^R1W2f zt}T8uz(wt=;8H#K3l@Tp=m=LL*An#~B8lW}tvk-4(ko)%eMr{ufW=GT4Bn2X?x}G# zGqd3#9$yk|4UZho-X@QtvU$$#4_#FfyFHG``uIq0$dVgoZ%3mmn{GHg0uZ>KetM>_ zM4IdinH5}!Yxl>GvNw|(ybXlV9lpRVI}}yEfZ#kbO#v~^32a(+QW^b}GWzqco>b_% z?Y<Lz$$b~T&K%#_<bia(W*JpJKy8bj$#7mRR-pQjgydJsBu{3k#I1K;mZb`m4Q+XY zURY4e29Zx;2HW$kjM~KmuY1@}d36l3344fUtcRs#ZCH&IhBe-Ax;{fel}o&*s-`E) zK_i;2kL;@aM-dCX9{t1U(D2RY`u6(!U0%=E+x{RRRCYZZPXUnS%5aI73=hkRO>T0t z*oyxhT|kN`-XoX$FL0K)xVg}>phCkl9CQ4PFHkW6CJYZgRx3bmf}^<Z<n3j415X&9 z)xw%V*SOdX>z#uaiumwXKe>aOW<I|U=Q2iWYeaY)Hqbe(2>+^bPXc{%g!OCuPvr+~ z=T58IPCt|ze*EPDim16mi2$uYCI?Tl3|@5RwsOaUBZ>NO7V~T))WJo=K00}Ia`XG| z*$bFSqZ7F%e$7f!sN#PEwo)Q2+;J1_L2dxWjo!g;bAJ0MdyT5VD2pP`t6z|@<-xP; z`mH~rM%-621|<8CCK^gtPu;<o1*_bHY&5wc!3iPWWpfpiWLeI_nq_AY0T+B%?RtVT zSMs9NcxI#@nRR%?0PPUIH;NOS%E>Zdp11tKdr7R&A*_V-6wVLXkaL^&)@hsHV7ZIo z?u1Ltytqn!d3|%CCkNvIYu{{MReDfoLJB!YSoa-QMPJ7b+#B+Smm53&s<bB$_}+ls zr~&;0udP!~yW>32C3vBId@`nRO<X8%-_hPnwUGi$1MT{BD(BQK$5*^ckHZtU4&NL4 ze0QXikcfOPP#@N^NFEqPpjZDr9E9@qOSgj6iib2><ykKB3oO+RZKbS?kv85fEyyov z&oAG;s*pmXwNUACKjM)kG$hOa@PC<j=As3mr#T2Byc}C533Fj-MYU`NlJww&DZjJ( zl-*bc`6w6pGQsdD1+a#-)BfKd{_yy-&;GzipBilSqjQ*(k4|BbjE{chb1RC}&mR9l zelhOf;6pM0BcekFrjGb5<F}CMIQ^QPsQcnXj7gd%7{b|ymq;?ip(nk!s)6BEBMd0S zHa$kwZk7sx$4N?!A=m+k4F9&f)=i!OfL$AOlLZ{&wNc<IH#(g`X0k;Z>A&D4BcjTy zEJ_sOMijA=pYl2Renwp37&2VI4*N|2qIyTS0&0gxLln`&Qck6s8X_L>n|t+x^Q*q! zNjJYZ(igXN)1#(cTbaE>-DYM?1G-@E;B}}1W(Y3s;L3~z+T9SrKF%`)lKPRFbq^Ru zNW0Ym?g+sQ@djIjoqe$aEshtIu69J|tWKB@ZrYkYp6ixCkJBS0^{{l{jPF8>_}7Sk z&5rrkaUEqMu=x8JHlw`!3Ohud7rbaEPF)GgGp;4((!IrqPL?J|7h}%f3pvnl*8Kw_ zJfI@=$B1x=SXEe86Cl;$6jm!3{R$5VFA8sNyfoq*B~C>8>I=I8BOA6#EISdQ>ssd= zlW0Aav7ILt;_F?ios62d^LtgAT^KEAH{&rDesye=m;k&672`OrrrQ!}!|liF%7nZ& zA+JsO7mF0H$inbnKp3TxzI%F(hXEKp=k5S1P8a$<sKqD*`5Q!wDkmRG_p55KAVTep zGcX5}GhvK|iXusJnL-_@U(64xYR^CZyo-0Ee-XH^kS78U=gG~b2D3xJ;=bMxSre_7 zr|v0~iUy%5s*F(Xfg3k=4R(~pc!Wv90m!&<rH#dw3hrnm027b0mpA7K<zN)tWv09C z=_BvUZH+PqLp{<U#&I|XL~3Z<df@P!Nq|LX&+u2h&=S~bcSR{?sKKRz^$)2kjMtnT zl#rIlVL@<<2X!3DhvyKXC^>pLLFgY4165E<w%P4ag?{xolFj1is_N+d6;2fTS`ubb zNi~iSb4rtCORiAhUG|rbptF(7ejOeLoV1u5N1UT2o@Up#@HZ_VN1UdHgy@kaGb)M% zCOW`iJYQ$4gS|JK-Gfg<pS;If%<!MGtgR55uI`SMCY@WN@ht<E?|}<-o(4oB$B6hW zF`(hZfqF-zXzymMs2kR6LCA#3uM|mkIJ>##Iq<%EP=-aJ7kEc&aN=l06`!dfoZ<@K zJHU`>1&=L)Ab8B^&;^lnd?!0w3910DW>lF1!qG(gnU#<s47xZhxoK+fq>{=b$b}6Z zE==3lF!Q6Mm6D?X*R(^RgC7(nDxu(gppCE;BGN!nI&|I&IS$xD&}j~Wk$%kta}0{t ztHN?oln(D@={H(A`E)h3LxE$I!@NnidmG*LoqlJpx3hg95e*7-wFgWb<)h!lA}GSw zjJl)AF-QuhVK13D0t^&!h#^XGUx~!w@Iu;zj*l92fl$!EnM{Val!51grtN8Fl)!B> z5p}#bJg-3&LK{b(b9rTyLxlq{FlZvdEEh-pA})~)N0IN%>xW_l#`xndHYuTrVOPVu z%Bl%Bm>E;$^J~=Mm1rDuZKaw<oLJV>uY4+JNYh6|d3a!x&!#uMQEh{$cqt#nh@glU zDSCpnEf$lxVOzspL^8tBuaY~0ps|Q*?*PqRKKJ6MwwFj;VE7$GjJcc*J*92Nn;9BJ zMj*J-c8U8TE2+B@l5fKK?I|p`6nA;P5?!HO6`bWEA;{A>m_7`K$UW2Q|AKJNSAWkP z5^&SJSaG<`gtS}1v3Rz)nh3a6H()%IDBKhgfd53hQZFJa+u~faJcE6}y%DjMfUQ<` z<$)H>meQmN69#H=%)NQgri`K7i$OeKX%=zn>fO`8$4mR^WIRQpOU|e%k@hspy}fhv zd-tp~pH|FlG2ye)gvpLe6sR7r5UNk%p1tM2-aX@A&!UuKIs8RM<sHs0g~Uvm9P9A5 zAw%16?^gs${WUwgzP_40fBYDyhDVp9>&HkiLVbnDqszykzgFgGHdid#Wd8*P7<84{ z7cUtV$oj-e6NmC*6Am4I4_vBWiRo}jNX!MQ+UX^tQW`~&#GT_nI~mT^I7}+Ig>WMS zvmWgKi!52PhY$vGu^q7qWSbDOIYSufceqh;)5TvnGa@XHfI<{V{J)V5Vz<#40XcWb zevb9`EVK+F4!1WV86X~9WG5~oj{gg}g)Yes!1I8k7eJZ#phcOmHj0n{L-cM}my1y} zE6vDzks?JBbDPOGgi>F1($yrk@-|;ato0H%PNu6fj|cX~N?_{(zj)8gALNf09%zHa z;dDv&qMkNGFXBHS!$>rGE6omc>UeZF4fwN+NcsTqau1Tz;0N26Wnwy5ldGg2Wd)CL z^G-Tw!$4gi!-H+91jsOyq@v*7GX_C;O!LbxhVTwZzY|2zTmY?tfjRW7+b(lZMqGIX z_W-9pu+`D-6<Dmd+k)lqgqu*37Ck)mTS9!@uH}b137UlaW9}@F+CoBr#4NNyTHqMj z3nYR|#^6{$uCk$vm--GmU=WiwV2)trp~3fnvs7@fK#Dm;#GQEd{8#S}ff6-b@e{Ye zq=wh##Uj_(xx5`nly8I^%&zWbhLnAr)bI}l#PQnE5O-Z398WGk!6^ur5*|QCFp<21 zkvU}qXg~l@lQW&!Nc>=A)DyFQT-|1MhI4`aVb+6zG(K`4c90B#6ae?h7FbE&E+y2{ zroOMU&oO{N2&W(6Zn1eT4mj`b&68*9080lgl?w#j4jhkf_j&a<pxE7N&hWg$+Mk|0 zd5<_%C~&Pt;=A=&Rjuyr5joCK+neil0l_>VR8L6@vPt}<5yE*5zSK4NJ6qzyukhPa zM0l{STD!#gnAJ!(^^L=e_Frh|)MML>f+mwfVem%9pb!Dk8$%#xqzTaoLdXW=LSnp6 z{CaDn2x>iHi>uipdfHLVZpaQ=-AkcxjiEMSTtTDIaByk2_hP;2j549ScNa&ar`RF# z3Vh@ixWnm%XUe6;Z$ZDbCGtrdG+y3NG?LgM`FBR9yb%!l-;PFow<jBZkq_myE?iH( z9ED%*;Iv%+4yT4qG~3gZ<-E1cx?DrNh$ec$Y@ZsoRAr`%DLYjv(z79|Op2XcB5x3H zwDAFAc*lG!S5r`U`49w>Tlo@XgV10>Itq^m`+G0fzIh<$$ATQ+zZ^@%n3j~G&0bm| z7a!i@^4z0rAaseF&PZ^U*W^LZq6Q`sAeY_uFkxw2>g;xQJ-WzW?!_pY;)f%N*sV67 zoj`mf%Yfptrg-)R6_6y^i;n=$#;2EXCt{A-&DGUpdJVFXB~&(lK1+{Fuoa|9-z^&n zz8ba9Y2Uu7fUy(>7(%=1p%MDSO{2m^q5Mvztnhf2{XPHcf9`lM>5A{hDw@g{lf;2h zy_rNJ4!s|+9+0v(y<x?)GR~yXx>^^YT~E~yg{+)~gdh9}pa=TZKy*xIL(v<UfxO4= z692#qI+&}Zb~qyG>b{^FLs|Z}qZ`G52cel{6ojAkSTa2SMM%d!IRJC6qO-@{;B_m? z)EWR!B9;zw;PAh2U&w%u2lfvRJbcbf%DzPvsPprvpy~(7=?bi6w)p}ug$*o1V9boY zBlGJ3XA~=!G+p@GxqlBHx`um+Rp1|#Lii1Lm!;~!5Nv)kMQH(Dt8<_7F%Vm*P1EvZ zp}T}!bAczlNqTpGICGIrr?SG$LS0x29V-Fi$cG|QLy%)ovpke7)+GqcAT}4cPH`zm zLZsZfnSv?ww8$*v9D#y|YE03|6s-)FCsDJ?0&d6<DEFMFA`&Ioq=bW?9QCClB_rg3 zWng<m7cbcgcjxkBCwfi0A@5)IVs*u1TWJ#Rb`PIJ&RoQLgm4X#v+`0Lj{8MWFz53= zd~OsZlf=l#?Fdh&lypk|1`>Gyzl=^JFV-}n_XO2Icy+)*-zq^+W|zt1d0MZ`LGBTb zpoE+?M7r=nY{!#s9rt<)xX6PtPYi>>@m^;YJnGEkJUmo$^eX~>K5q!JB}g80qRA7! zNIoVI8s<DfyRFhlIwvVCy|ChZHYCr`*Cd_5+-u_bvWj|#qifUxx<n>9)zH(*j7@tS zsdUhWg#_-}^RMl*EUFCFpzy0tW3ChS4-JXJTRsJGb@b@;QTBlEm_K-!J^14j{O{z1 ze@;&iSD!q5^6=T0Uw+EZM;EuhuEI0(F#kWlhkSlib=1tGh@nz+k;y}#nQj4bN%aqT zAy}WF0+mtkLhT?Kgw-@C@6DVLsoX*VmV9<1FhwRr`UYwDwmWf6Zp&-6+cB;VIK`=k z3S)SBDDXqhZ>Ca;76_3<edR@l^k(HO=EkE!-wo;v;%t)O5nu)a+TRL0f~2%K9R_xT z#%u`uIxHHLaeHJgL&4B2Yp54es2!w~<c_k$K~)B^yi7$BnML4oc@*8bAi~N3huTMm z^Xth&DY-(!HLuoKl{8Ma6-bRE7rt;7bbjTd9qkF6jsT&o<zw{3QL+)@$BsY$2RZfe z<7~iN*ECsnak|ZZd-M!f;-3ED4`jr@j;>!!hp?>vzI%2xz(L{S?;RRAgELgL{P$Fo z9?QU84$uF-iQDuyD6P6_ZwGYVA~Mk2&n6pO-yF`m=Xf9O^1AaI^f1fqG<V-ab17}h zn*RUp>ppNBxWwFe(qo#VacY+<{A{5*6od1{aHJt?M~Jszdixkf=)hc3_mOPewx|Th z_oFI#`_o$yG~2Tr*x;mSE6FMgIK#!JHF>H*?42nx2*he;wW668DTRWx^2Y?6Ai-)y z+0)<Tg3mlliL5~DKH`kqA0d@uhCw%^eDY*^+XGd|!-M0CE8WwemHmhZb4H_IxzG7G z>ohF+)x%7vuOo|bCtR0HEj*sR_~{uASl>MT)3bjUMOpaq)lc~Cizk2jD)QU*&UP2S zK8gIa`?}M|PfsI1?a42(xqj;HqR;1%KI=PMyZ!E9(A_|TubzJKMSM<nPy8}SK(n>+ zW#X5e-R|~au*qLziyyr1JjHLZb>OFGUw(xjV@tu0Up^(mzlf~U&3WKQ__Dr{js);z z<ARDRtGlmvvwu6i{`YUQFCTsW=n0;R=&o-n-Rjr8!~5jZKOasX|HaIsb@Oe2smWMI z;qKIK&6;!*nd6a=7X2iFJ~9nrHVv{7M)CsNpRYU&yF;9#sU>klL)CG~swl!j1841U zv?lz>1GuuGt5(J$;vDl6UxrMC!i?3qq^cSKyM}Pi02jctHU0T<4uY$dAtAey^WkY& zz9$PneJQ_D-{bg3m~j^1?N*g9e?I(6nw$Up`0y`va~p=>5rP39oVJ7MJMx>Dv}(18 zYodUw+>V)!P~wfRodHZN9*JM9M+%jFjheO>h6OWdFzt0-1)+c&cPMx<Jl>Kg#n&-X zE^gsQ;n1At?Kn><&HmGM+rLEJXE=aH$KUhdR_J(5b1bAfSXBs%!>*cK;ngDV@rs+8 zq0>m018>M5e~v5D)t^84=FyW+vTy&AeWIxT<d=syN=Oa9=h-KpeELh4S4Wy_I8aS& zEFqO|vzH)GbugQte*S#$U2pebV`p#hkJzvK+r1wTb~}5o2ksOz*RuXWw^;-pr7P#b z2-a6?L#)z-19l)#K7k`_B7c76aRn`piiHqtoKwck{dMKLI|m1F(uo^2e$-#xzx?$Q zB{_@o32$JETo6~jCT&7Pl8no=qf2Vm$|3{s(xXHNFk+3c%I6DskT!)#Fz12LC_~;9 zpsAQ5)1`nc@Ru`%f14m90A&R1Be?|!PH$V`^dT&TGv6ihH>1v$f<+fEXMv@6iOr4i zboCx&@b#lFgbeb9e+woG3APnskte}<Cj9(pN=(l)K?*H8IyysTm!=kGydeq$!WH!M zlk(ppsD`7}Pz--At2b8CU@=7hj>MJeJB1XxiHf<u5;_PzQs%MIa)iv=s1Q_HAD(YR zBPP^{DqI#tC4CCId~IBuT_DOG>6)H3cs?xIz65eZl6~)jUa2%CU~{a8^6(=hVQ_}7 zq=u05#RQ^nF?6HuQ{#BrX0V`Up_N4uD^%%!1S8BynI8!u0)qnyD=&x~J+|kTpMhdF ziR_WK2!U*a3F1GkA?C)z2fZaVhmV38SQOq89fd?fqKO@my%cP9Fgd(I;w8t-`(MGO zLzP00M3EqUn+ipy<T!<B-b;#26K!+{$%6<aWq&jQB}2rUDykK*3fBtM1>Hor<AJcu zyM##ZFm}l_Qru0sg8cz)b9#e!PGCRaH3xV!pk?$u?wL<=0$j|{0QiOq#xLpM5{Mt6 zv@udSgb}H-SUDQb96I*6;_3u8is_Q^<<a>K<E3+G6AcUEAjLz?^XIa2FR^nQw(~qj zITJ}DwiZU?^D)xdptwL15@BUHi%vEi)o{#oi!=O7j=ufCRmo}vR~{*X49O5Ns<Y5m z3u~*ofCY&RPjI2gxQ9kGDx=U46oT1xGh)`);<=rHN9Xr4G&dHY6;s|bx9?u%?Y-#` z$yqZgLcU_{LjFcxv!7o1WHbgjz#ZbEv>-3=0%!_p06ee?oq(4qxup#FWNL(`_WKN( zNaruX`Mt}NiSwp-AyBZRisFa0WIeGbnEfTJNm~UE1u*2?p&>G-=AtnFh%x~5&j7o@ z%4Hz$DQ5#LN#BcbwO5X%)G59tbA&S5Mkp-BL6KtOp4;GmRvtF^a~6&g)?GL<WmFc) zp=ekxnmsQ>Q}7}y4lE+|Omf?0KMG}Yz8L|u(!h8INCuZtBW9;K-mDSnG_X3?U0;4J z?mW7OG%J(vJb(V`Cx`LR#D)3%IlbFX&jw@4OOx7zUTlLur}&_)7eO)dmNV)0#8Q9w zq$o;LRNPg6{JDjGusJCyW~*(SS8;EXjRPbt+Dc>A>JmwVNvSE~aPmYFl3)|?=@^k6 zpad(z2vLY%UUoJI{-=a*q((V@p?*Plr$$B38E1xnLTIJce&(yu9nJk=q4VNy>eFum zWiif7Og0TU(p_A9_4^o)Jx#M0`0q2sbhR4@!zg|(j{T=))}mU?BLZ>Hdj1}Z>dU-6 z+-|@D;s&R`8v=n`{p#@dXA<f3NQS-1wk9Ky&W1c2>!y7WM8;6up!~BN#~Oyip}8Lo zRawz3Co!0}3avdQL-DGCMH>9x+(3*%CnGe$v^HN%$e~CjZn}$F!okZK<jQ=Je9l(9 zVav+Z=R)M&BGqla?L}4lAHrvgvV;o~HNnibH?5d8CkfD0>R_9%EzSbVp{;#nM@W=P z_>phUQ#EU@4zu*}JQuzy67Hky1rBpefiNuS3r;XgM(+?V*Vlv!j1~#>SzkSUj&%|` zXKR&vNcWux-7^vR9{N7tsaDFq-s70>s8TC5|6&PseR9bX5H8`v<dE1_ZsQXBp&P2< zA=`&mlnloSXS|-|14l?&%takNaYT}2tvnW5uos!AfZ({;j>t^##v^2_eu<=nM|>$s zlA9(Z0=|qy;b+RhMX7~si>ox}2hH8lly4~7`U_H4wNu6HjdNz*Vk990ATV<D7Ek4l z)|^ktrZuSxg<y+Df(Lv2em*{2;{gMSF1eLZP+5u(+SBZC2#ccHp>BcZ<;^LzW`((g z0FNQ7O1xxvQF1y(*1a4+<9beD8|Ld33PNvlu4UU3zVRZDz(Is?5uym8THR{WqQpiO zUG0uTPL$+|mf!n4Oq@=TD8(!yf`G%64G~Tf#aVFXVNhK;LELT3AY^w3u3K19_j?p$ z%3N>?+z*}3KmA?KK=R!q*c=Ag@d(j&Iq1W%ralT%DRaV5>mz|Qfh8YLU$!fPlp7uf zkD5ZB|BA*5;L{m%q6;wy(+ZF#XQY_cb)tI|+yChf7rVf#nmKz|`GsUSI0+9-#xy{1 z`XI<I&tZ6Jz~muYv`idES{)6AkoP8Cuk+@%oKkKDm02!uKc4{wnUxwfkRo>)dOmF@ z=zgCn4<hz*E!Rt|xk)n~1Saavwtqf7cRaivf>6sw+x;{gw3<N!07>D`pZ`m#8A=o% z|9h00$T=iovD&lcq}y8YHYjQv;r!=fFtk`CL4o=lFOnxI+LWga6k0F!iYl%l>czF_ ztn3lGLN~<J0>9%axuB}zYRVvfsk~X#nQhcY8;!96wr$oLY!#fDgG&@@fasH=%hMd3 z|6e*of}fG|Jh784>P){rxx#T)π{8gh)pO~S*|<>;+;U`D57P}(>~!7Vk()onz9 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 fH)d8s9?Zc)6W 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 VUx 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≧_h(q-j=%i?kh{=*8C&*8}y?&6tWM&M|)l5B5 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�nU0S!?wf)m4U~W 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�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%0A<BWpCLGg-R%($LWXL%`vFx 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∋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�_1-jB}dq)Q_UOXkM@#6k>l%uxW(eZiR9s3?K zKKs@Byqh16HrGfwqsqLFL|j9U)Y_w!Aj3_~T_MH;D7?5!IJ~|v4hsF|?QiDWW~w~I z<K*E!SniL%y6|lCQZW=v8*}1OqY1m#1GsVgm1?lDg>F0DybaCH@yY9O-matFhs9@S zTvD5wx(^q`8mklfUfZRo3{8p|ixOd#!yXo%A0;|~8iup;(ic=2hQaavcDvc~Lz+>y z)uZJ%OKx>#bI3Ht(3r$}xt*V`{&RWsr}F3HEoH?*GH%^EB@uagMn6wh$0eYMx#1sM zUJozbTg%@^!oB3TOWe_~;=AbXCr!Qzg*or$uPPn+(*WMDBIVYFLgi^ib+y#ZAUMvk zvLKvu^Y(s|v-u>CKD7afl(!Y`B^~2}1K{su00C~dlxMKqGw2CA@(~w)crWQU1UZDl zCJjDfNkmx_NX{&|!`AI(wS`oz%MGPOE_JC_kQX0Ktj-aLT-y|{gud*HE`UQhXXv)D zYr*chdY3f<Slzr57))0RZ*;ZrOVnhIEl^_QUIL#FnaFlF5)@j#j7FYhAa>`k9ua0d z4)ll6gtn|t%?q1L3tV*pTzCF@k9Lc2x|TZVQ19|1pzyt?P@&6e_mcg2IvW!Bp|qlT zZa@Q2F)V3pLMCW}f1dVuf;3w9r6kX+y2#{eWF%s23#87b6{F!_ygqo-Vwbr{ko4nf zYyB&=*S(dzilvvm4TvyH;?wMuNcPsO7Z_stR6F7<(#e&zGF`#uU?|I?_^w?MulkL< zRqE?lK`}$IWEa<~Rj?w|I)#Xj^Li987haO)(2HbG_6JYO`Qi~{Z^O#s21l2VZp_kF z!`67OZ&gV4aBwvP2WQav)pF#sPAQvDOlXS8vzw7{^;LRV{|cq(%2x?x)bvcWR9^KW z(Ci7JI|@{Fa*U0Qy4YjUe6=P`#J)nk!s>jp>@6a4^Y}mhl_F1SoI8?RO|g&Fo(`?x zy{)T@MriW%oNhZ~wLd>;XWes)(rPtSQUSPt7GmZ8d%E;=10Tes`vgc3-|SYBu~Bw= zY^9QmG5ce}g!{e=n7%2!_5I($W2t{9+zqWJ8cBrkp?(lLf6b{8Mj!HOhDAQr*(q-W zX=dCzPc!@Lm{{?CdJ|`r$+NAc(<1<2kP-is85OUrF^8#QQAT@-JevfRRHW|a?V2cc zELYHPr)kC{AySPBiR!Gbk>bSD3Bg{_EOCKW#v$N-=EnRhYl^$opYm$=m-Xh`HLq4Q z-Npe)cyzTGDsb%RQVmyj^$3a%$?xs@sH3Ib;brAtwJK$j<(G!~V$%GmShTu7G;i#d zDCN*bsHX$bttH8L645DvC=7AYF)qxTidH!wC7y_%9?Fw>@&>s9FK-GdBmT{}hMe0l z+V>xP|H1F?kk$I&16kqa><C))c>i*b?b{!ILqfHtrI3jG<3B$p7jOMS-H8{Z>VEgZ z2b7363trwmJ>7h}Ts%F0#hbxO``!O;zg%M@{<~iPs)KI_kT38VUjCnZ^W9Rv04yy} z(hZVSdw>cH(|(i`65U}uMi_gB-V<@06-B(8P3-c)J65)JVaVP2+1ZB9KU&X>ky6@1 zY2&t4rLxl^ipQ<3*>KZ*vJMcbs|P2xuCSkkMrb;YiR9hO7~JC}NFINUxqLqv(G%z; za9J(y^yx7gq9ldpKDy2^Y^WzbOJkS=-i5%I2Jc%G_%p}E?8Jf{X<=^vZ29KZa;wWa z+<HPgma@e%c_tG&^z#F|xQGIOA^#~Z*MzYy+18{5cX2C2?C$dU!Dc(HSCwJw;oEfc z>J79~KBl6-gSRCMICv+l4GcHuQsoP3E@-HaD=qhCP6`<uRz0WGm9JJO`|2G<N1$T7 zT1@C8abJwGuB26iJ<dvc&jt(-yze%LVXQ+1Y12^;FQQsQHslUHbW)Y_omnO&Myu80 z%a>$t$?%;Y?~i(T=8aH|6P)$}UT^KvSRYlIJGsfSpQ^#YjgH@_0!skQbkNKE%&IJ! zBdPvRs_alQFqMg|FwV9{oZT2b_7!W$Lx|Ask>W&%xDOk+;XxJ3@K}%K#_44TD_}-O zJAXx6=SvTkpbU+L<+K&gdTGnkm(V~P8CVP~t)A?-FUm9mW@N0#+s%HnCuw4$hBoq| z;~UT;Nborx)hlNlLTBi#q$22k*a#*IiJGG9q(M%v(W%cfI{c%4IREJy(WC3BA*ISl zX*)SEicJRmpT|f(u-8O#s>!1bUKb!pN)`eDAMxChxiA#~kz<iCFs&1NJqPN2&mpHw z))cYfGrDlVPMe5*-7*Jhf*yh}**)62K(DCfJ1P`67EJH>K>q|SjDJv_>!rzJuDyKn zPtM=Gd0T)QP==Cbca3mH<{W+uyUt`VkE;tv=1qJN$TX-fW0*H=4*Z=R%&RyjH4@Z5 z<Ay-RjiD=da#O@`2}+xlv3JCKttG?$g~g02NDT5pzBx0wQ9G@e#lq@YAEk|ScRTg@ z`t)s553C&?=jDw2%|T5?6jnV$^$tgL611m&NkMxOQ{RbHRAydUydlW88VXOy`nrSo z_uK;yacFGj$)LCr;}PG=nQq>qs!drB$E&;AJwUMFs;H2F4G|!X`0?AnEZ=^+*;0jC zTFon103O;v9mXNozqzW>72eReP%tRgC0YhtjK40#aURsrpcH*HU!}R43D+=(#wScE zMQVv~5SCj0MwH;9^DfYaMhz<nF#-eereSxy19AupntLvXmEF5bEx7|WG_dFl`tB8Z z1^NE$RmfQccL<Nw?(Qq{ps8Ti7~@@=r-tfW_O-17mBHcEA?lv?`c#oC0c+yxNts%O zlU+vlQO^QE2hbpY*2uZhFa@L%+*MGY>Ux{1a#tG8`|6CWI!WmZ<h!I`jC;oUmM_=_ zQ?_5&B0I;QuD*^NaNcIx-%$8x5klcc8Pv<vq>aj}9_cp8K-4oHZJK-x<J5M$6fa1@ zAJi>!o(2Z1_Bp=gQ;MaXE*@?6e@2b&_5JVgA*$xs!7{z?4>R<F^9NVQFRJ~=#Fj$2 zW0WZidK8~Kc!$9|kG0aLG&u3c9a|(<?o#LSE~i6PUFfmw<$w19N7tzM+x%?x0m5>} zd{jc`Jegyl3Pc_t4!XcLHkjM$TWm*jwtf(a?F0=?fT0NyqGmdrU{Nr2P_SAkwx<n< zy{~KCfkaF2{L2`?b~!&S^TJxCjK>C>0T^`rMv<J$LUEYbY77Gy_2=}YBoM_kQA6F( zRHkzY0Q>9(c7`6}iLl0F45zp{%?#{@<?z1Q+daG|d+BkvI{~)z35#R;iUkT-!t%u( zgMO=T=;{ESYDd>8VjyZxVvd=!3oD0P@HT4hw_CS{+QKjCnnpZ61gj^3XIZP{D>N|( z-Vv9}tDws5crI=Ik+y)*lp%m~XNWZ8-d&~wefGz1=-ec$(wBcX&Ot-Ptl-7HNQ>YB zwC4Nymz>tr0Ha~~%diMZmT-YxR3>@{vuhTWMB`jaR2C9Bc(vN>G>mj(r>TSK6kw-A z!#P#EfMurDw;F`Qd_mDLR{HmPJdi-7Ofx<X(6FXGt;*bib)PxXYob^-loYe`_Aa>S z#gmQ}NOQ~rb5&mU7l8&Ri4e$Y90m$#vWY>UFvSF@sc3#AX$3)|Ty4^7Z+(`vvOZyL zOF*FuvJTB}L*018Y|rz>KIlAynA2s2C=H{PH&c{NX*|L*ozup=_}Dq-zeU49Nu)Sz z<p=RD)3Zv`#jP}!mb25^r%lI5q%mOhyy@)VJ0S;%{@W0cvSIG5Pnr&bo;FaF^;y%Y zFfUq{A5F86pV1|J(R8;Qk6!k7&^U{NG|j()hAbh{%D5(mZN%}A7V3hS2B93GefXk5 zLH!EuQ+XL?oFp0>x=Xy?qpf?;z-<JQyTp!!8D)yJ0@9RrEl$G*!Az=WGa8WA5Tn2S zEsay$n~qq;mCP+>6q~b_h2vB90o$i{Vx@>eTiz~YZIYp=FA~SsF-Y3O@c_oL?}B!F zzAo6|18Ponm2jp-wR7jAPD<;~HQxtWmrW^{N07u{opGCcWT?0WzpEaZ6$l>^_d*)^ zJj0KhFy_q8_3MwKWvX$o>|q_h1nO~?l_*YAd+L?<LaUxU(f)C|p_KZf9jYV~rtM}E z52Fc@${#XEiu7{e$T^Kkjg%6mb9j=;5QD=@0AbmGQuf>i6uo^^-M^rW$)W7tiXL_) z>$E2VepSbpBg4F>!%CV!vxJBxd*5YHSyisj$UM3{F?G}mwH#i*|K@D}HcPK)j6m#U zN3z0Qm%?`%VKV{NYU9~TVCmkML33bF#={l~A_pT^M5Q-Xu`NPdww(wLzTk1p*?-<@ zLP3=q3OucsDPEaVMXYAl>={B=(uL2m2C9`LtB&&a=Iw<PCM{RUaD|Vq*yrwid7nR9 zQ3C>s)l5(3rwFLxP5!6a9ZxWL4cwX)R(z=*z=tK~>QX~UkBKsFPG>N{VI}}QS_EAc ztSP>VDILq?68zedSQu`=`5|7hLH5l0?qo@<@@0^!mWQigS7|&K!*fD8X)M2^ZgN9= z9@{~L%^6XYD#kl$a_EFw7aL?Mo!VhFBm_d@pXV_ZE=}F<rAv|JV-<lSKD~2=SUf0) zNYzkDC~`YM-j#M}TzUxg3KBzoxLPgeKIs&1-hPE+WGXq`&9=KoNbQ%qN6T-s__Md$ zZ7<n*X>r|z+=jO^u^37AjwrKAr=1mG4x5gH>q{j;t=PooeieP0oX1Mt7gd}~oe4M9 zzKZp!$k>*+_PYYU*po!Mt_9)yCS}-K@7D$-ldf(D#!oY<OrRGD6^`86n2~s{<knbc z5WWQkSYkH@Z}cSa)-AfnmA?6xEh$(?!6^q+PG?%OE=DA(bWEjyBxj+Ems3vKE2#J^ zny5Q&>;4YX!^n+}Ix<9<`B!;#EW32kl8$gY3t^m2(>R;Cz{9IqoR<BQD6+|vwr42H z^USQtXzsLg&8u6tKOc!IH4Li?KVBpoZxXIB-=^vi%e2T8iW~tur=dl(pDe_}8Ss}x zAjiiB#baWoAO&D4pHOaoz;iZ=06N1grqx~6fiy=z^%_^eLnT=76k2*km6*iRE?gQr z3DgJ3?8h;}DP%H<h{J1DP3a$>UW3%ZW;P#oh{*S~ej<7mQjW#5&PN=kxnaV}3~`3` zW<^P<ow8R04D=r;lNB+Y87@VWM{etnvFC?{9}$rb#~i@ZIr%X;SG!a*p4TYwLlSt) ztvyImm5i?TkHAWELWQM=yU(}xsD9s^s;&LUYI(ZIX5OldK|Tv(@6!+nyE?sGf8Q@g z8L<JnO+x?MxdX;*f%jJVp_gRZ@x+_TRhjT~kI(GVh4w|ijsS%bsx|8vTy;DFoP!l~ z<sH}}?1cymUvN&pYv@b{x{5>vRrYVmDx^AE@A$s}@V&~7n?>nk>h57sL^y^S259Eq zVVEJFu{ReP7sN5xrKi%eV{oTbHSpBTXciLY2X|3R?;%C+YI<h895$tO%}<9BtAGiq zhLQV}!&~J=|4X0e{>C+kl?N$jNz0K4UX`Nrj=dfXk^m-#&=WN$wQYd#0(T2j96}D^ zhQJF-7s$UJ)BS0ZRukU5ZAYW%;Sgdug?O@s%m<*IqlrZO2yJI*JTnaR3SDGl=dLvC zIi(fXU$e2*KkhE(XB4?HkJv%=39E+zK#_;b^k;v4N5`3zngRdmGO)x`zYGLE_qZ$? zB{+2%Oukr$1hKsNyASASVYxj)arMr3aXK|kNEu<K>_o^Zu83K%!`1T&Zhc38XKF(l zf{yN}IPHdIl;EU9p)y1MU4MhWL^<Z_gn{y_?#Xv2Ll@b%`%hPEnfV<eU$^P~^<rAX zSo6kk^%6X(EV!b*X65?&SUV<0aRy^>wAy5a&8=*F2t95(7#iqx;phop19jLAE^{sR zX2pvPnrB5Cg1T-kKRhufvx4-Ghs!g{aA^*NCm>an$oTPmX)3M-J9oXc;!Xbuzf{4Q zAwJc+OK$0Fbzp6J=LXmB-fwBELL=2I=KR$wYHdR2p@Uadyf(IVf?z{lh#}$lOR8Yi zy>32RqPo^%H}Rsny}L0ywa!Hipyt(T+6ktjCW1OtyA>UZt!rpIpAF}-rYVW5-*ey+ z0#(oH_p?-vaqb^=w33E73}8|njKp$eGkSB9>zWK|PMX~lb#rd&CVh;Q(oP$0!by9@ zV7VKi$;aH(4U|D{q2B(_<E&Y;;C+4~PQ5%y9TRP-g^98b9sHIdD_V3iRuu`}4HuMz zbYP+6=PPb#sK1(q31hT!jA3B)R~)_iZ=12IIih#<NV}ZP>FcfZ0T{ddBrjNZ{**fX zM^`&q+H1P1ZaoKgIWXURmV;Gg)r~(`5Z;M65M9zHq@lDR-`$cvDyuaOu&(t8;Lk;% z8LCQK4_~*+F|uTox?i3V+zodR5@(D#;_+z}?)kiciE|6N>Bryr6|2#;eGk`El$XE8 zu*HWv5X2-SHMKc-G-Y4WH%P2$bmlc(G1O=8-zs15`X=3YdPT=U6#Vtm!9>~8>#43U z&ql&qh^_Oyv<0u0$I`oFB>j5Y4kFC8rB`GN{xRh3^5j%@@G&4&0EhbwCds(zEHzMb zrDg0J4j$iWo|*vGV8$~a(<L>;0ZN2=;(-2p;zP1tdiZ-lUsdZ4LhZ&|yEnjoWPkgt zhNAVETMAp@DoB1<ybpB{=u!5v+9faT(^B4eUw+QOq}b=^&sn(AcrQ9z^weKXL!|*4 z>aV6@OBZx#pEey6)zI3>g2A@W<mlCZ+l*DQIC@u)q)TjpHGPaNZ~r7OIYCNRoP_2K z*nF%RkI@Fk23-j|MCm#-2WkYpD-H|&Q9(DSt0K;wK(*ln5Ygrp0=yC)tH?l=b^K>< zq^q3=LO{CHxckj~bvmaMSS0ek6D0_s>7VmrF|?vHATC-tEm$fdkwpNmhkO|gS@xCI zNj}M~TPJi3_@t<iqF3@+tIjVUDC7y?zf2&zy~0GmGmj{FuzPx*A^5dGSM?Nb-I^~J z48^oEXWSWvFk}2Hk!UZ(1$=chZ2B0^8k7X>%$4Y<=cfEn63kj<QC`_(K7+oZ?YAGm zbw~=DO)twsvpcSY!;hg$ij`{m62vP`@f@0vrB4ck9f15_(^h{}H9a2P1{wvTD_kVL zmS9g&?V$RjS>dWU-w;t)A?{b-EWxuAG@f-rdU{XPm2JuKs4I{N_)Uf1uTB&c)e%xz zoyWvdSMgm@yJmSk|J&XJD%&skPhUf~>_@9KLdeg5jyxoj(ebUW@DmcQs8-q*yJzxs zQ<DYh_s(js@a0iTsF9i^ooGP<^J5p>|BSAT(4JF{KfTqxSgk6~Qh}26#KDsnAJZY> zavq$F^V{iFu5jM=T0Q|4j4~7wiR%>yK%VX?0{6NzkAcVPE(JjUN(qeGH)o1aR*>W{ zNsscFc8U89zF|T!8s7evx>&P6@-d9BkflpV9wV_IvaysUM~`I496v}kyubz_4D%V1 zUZMKV2@P|*Vk0&npMmGY8gHmXGaj(-$3bw?mvP^+$!cOR>D#I(!H<X-d{;a08SbmF zZN}FI-K`ibXa3+|U1&ypkmA1&HFYqp{i|W~d8jWXG_-3igAc<2YWQ>+yJYu#WVit_ zUKgfX?Rx8;zBDEbi(NAv8_AEK%f>7h`OHiYuJs8YcvFlBoJ`BkrML3iFg<plYz)?% zJ_)KqV**o&5hR;VYrxdkw#u7+*hIOfG#=ryJRc{Mozpt6F|b|tPeha<&dG}~(?x6Z zvuWzaM`QQEG{>14y;pUeJ`5x*E%#N^ty=A6oL>jG-qo<Sc~Vk9XdG->vLVTvEX+{d zOTf-Hh4NzgNbmXemoMq##Qc>Js^L$+sL1|uFMobJ|9W|TCV!KkwO(HTk}C8glevkL zTofNhgYQAp(EAM`Lgw}QwAnr_wzxlE2cNIOP6Tdzl8MlFr_1HpMCipE;*V|{zXkCh ztfZY=7>r;>5f-C;BoU8R?Ipf7u$+JbWL!OxTem1j3}rc~<}b#MoguFO;IHjXMr;B~ z)7aN7=VJNl{Pk*mvY7zBKjZpM4rT!%zf8q}JQ5k`d>b8+r;E@Df=B5P_%i&230;6* zhl0P*>{XSi;yH^_3Y>W_RlpFPFn1Q|Vq>CaF&J1ceD)*qqUyHJV@fYoX%-;vQMtZE zuft1;^xS3;@=wn6qib~hgRL=trPj<50X%-ea+FPUTyu(`AY(>$iu9v0yL!<(xwRn2 zG*g>F^<23m(Xw>)$ruN%X-ZJh_u!my2#5cwT=;h-nB#*nkrnQa<<mKNnEFF>Jd6&u z-@dKF_d~;TtoRY<hKNbd;bfX;8Vx0{5gUh|O{SWA8Pp8F&yMH&<F95%Q})iYYt4rR zEv^PC&oL3HzQ|N#N?}=pc|{%CxtJm-b!Bf~i7W4f*hR`aPcG+34v)kqY3#f)#0zUA z^Gs|<nNhshO~!DAd4^X8Hj~8iX#e3+>V)HihbaI?#_<WuhYyqb507$HH~wfLpQ^Xt z4a@pPXguV2Wu?>myH!&Qz=1bwTxM^R2=R^=4kD1|Zd-)6koyd(BMqup=kxPYl;A{z zO_D>`Wr$-Azj907c#1R`)%b{XA<jv0C6?Syx;;nDC_r-E+*+e$c~bT!BB9utbdMPa z==%?PN%sol&p+iaDMY3Ae1KCugG=U_(=j-0Z`S)4`46*e@<YNye6Qa|7#_K769TLr z;rj=`FL<Y0zTjo2Pq{MUv+?eKw<^Y27r<uYWz(&1I}utEZgTfT6V`!QxJ9CIYFE+d zg;e2@t`Jk}PP_)M5K2*iu{j~V@`%+BIXVWho@$%`F1o-K+iT4^>*B^|+|$0ui1kcC zo3e&STq9E1Ajbj>yB&S>rP*{RwK-N=a=5(Tjk+>nwrr_5%nd1B*(;XSz3g#x9npyM z9fgl{!-8q25YqHdLDEJ%koluubBaffJql#(ii`X){rJQ?GTc(p3ak1NqFQ{nS$6bA zNIU!d6ryRHSwaghaA}^3pt(?HmyNEf{3UNylqajN_t}Gt#7Je29jW#4D_RiE&d2}w zcp{c7-A*W~LvBnM&mM7=Of9UK>UKlVuq?;Kc-t0vg~3xpxRd_UdPtuvcgNcmUz`!A zdq|^=X`d2YAkAnoyE@$U+~E=gGTvOg5JaKL^=8Isa+t$A%?FLKo?L!KtANCSX!?>P zFs*=sv_(Ea=D>*+z07BoiDBY0UWp)MRF-B}w8a|}Ac>n@f&uLS@6|`=5QTbI-lfy$ zR5}J%BA1I?LPTHrE>@_kH*j~wKjh>8bPE%A%3Gk;2kZ~s@dc|nv2MwcqH;kpit$-n z^UdJ(%02tW*mDoLlocZN@gBJ}aIg5fTF2w`Si<-8Peh9Yk7S>K7@8@9T?ziAx~ZR| za=Ns!R!$>Dh{R)Q+>3_j2MVSXeJYWy%R`zH{2DdLu#{J*qzK%T<$Qr0Z?J|a5c*?q zAto&K-?pp$)dD@9ukU>|U%zHN@1D@P94YzL>oq<i!DtVx^O$v6?J^NA4=K-l4AN-L zpnn3_E1&)dThV@bzJ2@Y=Jo10W-qJCv)z7AcFE-_CbQw5^>P=3Mxxf1`2(LpiyTxK zXo5Y$?u?4L<Te*7=u<W--V)xMAAhxc!T;-DP<uK~dy(<u(yBNrhfvX>+ybd|HXk#! zm;d-zs>J_+vN`j_(++FO_0#GS3bf|vO;<TaD~DrBsxAr3LTcM7$dztoqdGo9X*y*9 zMTchd4b?8L7{rRO9~y*uQBKZ-cP6nUc>52O?3!x62a^B|I*;`dL(m|nFUc!igDT_r z#D7!vP5ypudA|Ja?3A)x1x$I04~@OquMo0?te59GC8~bBdkIrpJ>8L?yWUe_AqRqX z?j<GHz0l$KoMiU+&yQdJ_5PEm4?lnO^5G{3<nJmmA`e~!Puq0-_W_xXeffdQ6XGD( zj(z2r$50~&w+3|QFi6j~^HnNyRYU3(4TEprY+knIdR;s}C2`gZ@e~zKZWqH73lqaQ zW1|)KdyqsRuw*f?%<Vykcm%ehF|1>l*|?XDfaap)4Ux(2o}H5Qg_@v79Z2-D4msw8 z@F?{shNAb28Y~3JlX6UXK>#IM)#-17dJPI;dQl9gc>N6!>pvgfH@mKf_vB=zxLfpL z;PioC3E;%tG@2Fj-JElxI-id26DSNA#~2K-OOx<W>lqtFYZl36aK&Ro8YVJ)PWy@h zajd;u1+bn<^#!IZPE%6HCJjY1=nRqO-%C3y&?Q0XG4CyCr$D=3)wsP61CySVruf*W zMk|~30fA%2k`N}|UlfAefK+8t!+FmiJr>@{iGsyD#^d^eN2h6KsYIZBWo3YurllMX z!vn))tS^7PWWc>4Wc!sX(!CSqv^p3_Hy|o^#I#`7gANeMwWG?LYg2ai1@ZBVj{9K? zVz_D{X}e+HXBUD$utxh>K2N3p-Y6ft4y?N7^93(y#<1aZ#|HmtPJk)O=}mNXN5eB% zsZAn6u0l|~D3;P(C<!f~-t^GJGJTdUmOf!iL_lEzkeiFz!_fs7N|Ti)p+zXz8clC7 zO&YAe`ocG(3O%wE6?#okt)+1qqNgM~k?aA+M!b69wP;<q!C~YXy(3pW>cB$aIv9`K zbWpz-jrCW9ioVL+?>pqDO-Hf@5D|hde>DvTJYn=2c-??v=|Lys5u3?YLWG9ZqXwd| zK;b7=;5--4XZ*a=S>;bV>a$L#BAeQ$JZidxLW_>!i>AAESkcS=4jN~9m!|nw(2&)D zv@*V_Sr5?+(jxvcv^bb(;e1U4BUByS;rMuYw%_?2hz3ieThPh;Y??ZSgU0Sbr+ML= ztckQ^^Qr+cMOgvfly(j95#^?McKrYW8J~pVxafyEb+co!mgBI0?IEz^^G@6!;-4+= zGaE%~w4_YTdabDsnB?!>&}wq9;>)*$Dk(}+6r0_cgKtq>JIg=>4J?+VI;)!Q--}@B zDG>ZJDI{-c7}{O>ve}L<UL#=3h(oyO!;2mnZt9^T&zPpp&Ffl7d~dFR@cqj7SnK<T z)25)rc$~aAMuSnmEZV{yzytp<3HqdKCWN2G&D)gt^2pt5DJ^CFEOnx(T4q&2#=ss8 zGG|TQZ(32^gP{xld7>L6!ouO*Qa%9H850&!W6MJ&qas>_XqZGx4D6?#NW}SuOI#D8 zB^Nn+QbLIFnhRGVDKhu)%V*zYO6fs={I;ClcV4F>`S`6~O^DyKG38rp1!Ki4+hhOU z&nU4Qsw7FrA;O60YAPV%6mXeYoA2|rD<yn6FSyt(E2fq?AK1~pZofJnIq42GqAuHr z?Gm1#)C&_WRNIj*y>@i2^i?sv#-%}y=es4|kT~k$gk1VIv}3uf+S9cTN!6~d(xI(C zzL?$q!|Z?mn*I&xkToHp$hCs>t6$AdR^Q>f+q19s`?KAxU;T=1_3nO2{=zTU%RPSJ z?>no-AO8Jc|Ih#YKgFT~lzx_}+`RFuS1bXTPZ=aVX6t+RbVam6z8yY@wZ}oiv-y_H zM>MNz$D8ez?nx)orZuO=!q|As)=FC4Bf$Bhy@Tutf|>A2Sm3=c&Y>~>6{awqTCiyO ziY_C6-M;erOn>QL*$n6s%DbHEmA6W>!TAeI&y+2dR9e=<k-e9YC?q6~PUm|^*KgfI zcDe0blAM`F{6?2uy^U>A(xkWfeAk+4?v{OsnsbzrhWo%ZIu65nhG(9+-ms<MXR|+0 z;EV2h&v)D|<~T2&N;mdXtXLbsO=SiUBCn)rr_(?KU3C1q2$vTvqG;06G&A(W9>n!| z5?zMZN$6kMPFE$>0yn$tkD^3@Ixt_E2oeCbSfs|Iba$Sss3}T;T+vM?idPSp0MvGJ z2jf9H^-E)!M237nuZl0weFnb&pn6JY$rfAiv6USmPjs@+Ec~P#j+w?Z*T)=<=)D!! z)4t6&9z3U|rAfo(xe9|MMbnb`hq)V3=bqA>q1ro_8}3BQoo1)LuuN%)@l=7Bm9051 zxB_n1be#Fl%yG#u``MPl(l063;;5+oBSpBNV1s)2jAkz^PApXVD45FS0Ka59(#4*` zU}cdQ2!Il=Z;K%)j8EPMrJfe-IM(*uG)(R+Zoz(OK5Sp4rsIL2eQ%5$t(iQ`ln~4i zFncPPQxMbF|0*22;g})t;Cka`vfLNAN^+)TAvC#Qrca~7lb$#$?CUf|Ef!X#5gV4% z;djM<q`0GKs?)cuPwCrUk$-^d0{MNu+=Ka4p>gfHaB(QLcU<BGu2ionQ$z0~YENT1 z3UKxsx*O$j<hZ{M!81aFR0lzB-bGN?3aEY<Q5K(nE%1B3?X@?X#p-0WTs)&JEg}<@ zGfXL4N2Rl25g^U9@!d$NNydBV!27l{Bxu=X1x%d|eqH-|i7()$#IK|4Y^aD?Zi+K? z^A|h$KX{^Lc{t`{6h)8uVO3ZyWZG2IlW*xz);gcp{l#PQi^a`v{uRU8In@C8XktOB zo9Cx{<vf0R^Y-axPM>O~2@(*Vml>%7#Dw<1lJ!8P8+>mUGDaoNaH5#T3w=@k1TK#1 zRiNp>=H_h@?A`JKEqHgWc{Qj`dNq^N(;Xb6Khf2x?d#o9wFopbd;xe@O^0EL%1*S{ z&A*|cV_Fap88?8E-56=$MapwhZfQxR?X_)g*D5G!EiJ7l!Afz4%AP1h$@BGb;aWW& z&nv1i!x}@}P?3F{Ov_lK>VAkZC|^ge<&aqkP3rF+n`Cs9l&Sk+%~-*39XI*1vsC5b zjPeD9DP%cxr2NbMYHh#4ji>mhgqPn*sdQzTwQjoA{*h3m!6I;E0Q_JiGKW^H)vOM$ z`OVwA{hR%+OM=8#=I%|NF#g+;A;#9X3)hmFN%n!gHB1PTV~s*Yh`#jpLK(*xoBWo- zNUQvv*ka=IOOG<1UK8aFj)5iuGukRoDwP=o&(n4y<(Cv#<<E#pkLC?nS+-?ivnw5> zXxzMgLKhSAjt>nUt`UdiI}5ub^_uST!Q*Co>(*cIK6!ZelZW?SKKSC%y=RnS{4^;) zHbjZeQn*F8C3%AQZ%e0`=)PUZ0vYj_5g{%N6||MxBN13e<R3y}K4gxw>hBZw8kaA* zY@Dzo3-h2@Os3<N5v8v}lqdAB+<L+tuyTSCn-(uNR^sSTUyNJ!;$--G2amJ=SEm;X z;^&^$`bII(Cnj7%)4;}&RnfbmkPL^)jL@dL#5u%kBYm=xDIVcAOb}r5QugOtE~Ksw zmZcVTv{-sQ$Jkj2o$vrgLfd?CB8Rw9OO{xY&_y{YE+%^wrDZW3{t0HPb<Irsr+-|~ zG~X*}HsDH&z_C+4mhqEcux6V<q!}t$n|oXw=cjwr-ND4J9P79Y?&VSbm^J{ZjQ^G6 z92eKUJkEEw+xc6jGLCX_nwdTzfEnPCU57e;b6NK3m+Za##0HA^iVl%5*8x-T@=%<g zNn+@~AaP{$6uBrdKIMgX#EqaTLOn4X)7WhwdsJ`NWb4LYJWh2t)x6Ctsv1UPb7;fu zqjOkua)>T{-vY_fwCykZK_VTS<;)&Z9K75$c8*}}34-PnPb<J<Y_`o*tQ}Cl+#{Kg z?V4BTQ?2`=XmcKd4dC{jj0p%^Ksgd@s`Nk+HP{x}&!4kIkkleLv;<dDM+o{PnVS;l z-{o8s_MwGyt?y$8PFh4}))G6Vyg-mHbelg!kAZe^OG8dU?Bll-2>f=lrFxoIiJ_;} zG<-C7h%gC)>|QGT2-<guUC3iCnaDg}y`%N6_|<+G(Y2-55cI=JL_rk{Ipb^#oD=+C zpe8Da!d~{XbRj$oWTnWZPV@Ph)W7`vBsZ(JB-HFJvT-{4)ym^kbrtnVhh0OwL5RtX zL`0`<&8pjpJ?3+X<FS4TbI5s&Q3>)iy?MI_3db#?0mBv}(|-EC%0UxJ52@<oJVW|k z1<G{{p)P9R0;R|TgBHOW8e1+GjA>-&OyCYe*Y!#&ZIpLI10D4WZ4yu@Cg-2K9vYQd zrP{l@`Kj!T?rkZSO37cOkM?h)nhN>dlae9Osj5&NorqDYOXYgO6-KfrICT1^0i)*n zFlF$S+Es`4{nnJIlD@USW1==k)nw`;%^Rt*nnfr-vjcVRs(C6PMCG3deqiY$kvefS zx8pXAEdpq4e@o+7A44m-LwlCuiV~HR?LCfY7V%h`5<KWI{ezZldt&%hRACzf^^|KD zG^QJ^(ccUsPXj)c0sh%)u8r4$vzxUG?;&i>GRSPLS6Hs-!{+o^l;vXDW;-#59#6&G zV7GGb75xjAAiR1@`tfq_iXqr*=64tKGkR$rvF?%@MfqC#VE}k5jSqrRZCOM|F9S;s zf-eIB$A0DmsTZ44IWfHqCZ$%p2V(s#Uy1(_huV5Y0L+I|d&!NRt{q=QofV;a?2PC> zeB2?ZA=;G5j+IyNVzP6TXv7A~!8wUDZL#ww2i|qI_&S71vKoP}GhyqYKMkqI#~T?0 z2~1@owj_)~=2SMc0d?9i6=_WcBBMdM^3DNSV$ze&pW-C9MuVcWXi@x?t#5`jGM&IL zQo6C08T5;)WvZc#3{L3|+x@4jHJyMFSKOiej%u)Lr}VN*Mbo_^qjbA02?1qf2KU#C zi{oE9|5(^h+Nxh$6dT!H2@9y2jO~5d1yNW-%QDde4<u824#O`A3B<Ld5gjWcKUOY7 zbx7jAD8;gO;4JRtB!JC!I4gs69c{DC{q#evAXM7B+D7024VUI~gwc}Nk61z<fK$7# z{z&7(Ze|d7u?YE5MiA0-i33+8bsXl~e139~CD*>gV`$L-aN*Ft!((W={^4V2Upt14 z)Fcb~q=bcPU-|F)3bvXZSM#j6kblQ6M|d|!iz-1RW_?l;dX8#uE1UArg|Pj88Z!y+ z*jEO9a7rP7$#X02e|@2<rFm&8f&YQqU4fB+f+<&2hP9u}_5$H*yWPl#AR}rfjYX`v z+%BoEMoAs}{(~#rth$=uX^Z5ZNrrbx4)wdJ!?vgy$Yo%ZmGVID;SR%3s*ZS`tg04| zu|6+F&RLVK_vR{Lx68wRZM<%uLOLCK%21_Sxn(;(LTTC^zzT$ihv3Bl-vTV(4hx{P zaS#TM|Ix}L((lAqsHRILFPGn~c6+K_>dHg2YQd$->N$32VX5lfOYTxNr^`3!Q9X@I zRZB(c6Z%HMY5GtMB|)|9Wlu!fx1H$203Uffm#(9X7pJp^7e^$@Y#FH-@U~cIF%UHz zVne!g6!$&*FI{(;`Ae(E5_1ohbS?4>G3b=$)r^hiU@K0Gt5<6jK$Yv!^fwWu28DrC ztr|{ox*H(Yi;p>OsBd<j5AVr-eca6kpBj9jF4p9ncDfEBtCjO=@>CfT&7dwdqVC)u zav+1D1~NEj;Wd{=Q1`zm^XL29F*!X{Omvz^J*0$(#flD3PTxLUf3x{|xxh6bd~RsU zI1tEb<5X9?Rf^wp)nZQ<#y3|v^lByP=}u8%%(Lm2S7fj&FGbU}Pxe7zG5$4ey~(Ne z9`+!9z?Kdcb+yHWvyHSd`=5&lqvB}RxVa*5`h2FT_nS53Rn!$0^OG4ZX`rg?Z{hgN zxxM#&_U!ejd9V&7q+RSlp$tTJ2VRRhLJY0h5Tj@9jG2bwYoU?+)j&Gwf9L|e23|Ly z_}Vo(@gL3Ws&oz-R*#x4Vo}P<u?xg=2`Y$mI%}LpJL<Der{eBtpYo{b68bmj7`|w_ zTh9i)?C+p)7A$F+e+3QMbCFiYi7~8^1rTlW-vJy+q61#)m>4L@=Kv7re%K~a<zDU( zy=YKyZUwrz2c71HXR@?w$L7@-h`vGyfc6`Y4O4580C?R*K*lK?6emM;lw-}tJ%1+# zl9opzR;@;ve&G8cotDb+VK|7%$ILu7mXWEsDc~VJSp_JR!2q0m@{nQnvYC6Z{M<7X zOHS*#rq+dVqIk)8)HB74`Y}&KE82?xT)?d2&`cA%O7)QvG5ya4%;ZZz*>a<Jq;f8c zD(?$e4>a0<U;V&U$iVk9uEz0jgE6PI7=={sELNUDU+XrSfeq8DyYnNhYlEEw(f`RP z^a^>Uvq&I>f8WoRr}Wu8T@rarKHtIEy2}?CjA~LmNjeQjxxF*t$6*P%ta=CBRazxo zz21_sGuI=HmVJW;?}5m+eH_XF346e6TRS$0S<UYYOeF&|v6VxA5?$91vNh4-L)NGW z7&%AnVWkBnx)bZq)--~lH(M&?AE>oQeX%$@>SDQ98KGj`VUgjz#L}Bp8(P3iYUf;> zADuA9z&}^ai+W=yJ_?YsSUhUmi*2(l1IAuVOamFG9Vse>hPGZX@uaC0MtGL`Xj7_^ zF%Z(GwjbM1)K$ym)3R#$2_{dxTd3dC!Id9V+VhU@pmJxxkcrA&OZ_xrEJ%EPISsAx zkITA@*EZ`cB10(k%|1+ggCZ~U)w&cRe2{j;QvYg4_vO}`e9p{BnE%NjaGpukp)OeA z3;?r78dW*N`<6*^4@*G5VA@Cj%DpaD`|R&KDr`32(wE{Mp}ZI`hmW|`ifov=Bll~` zjHF_8kxg!_9P?9D_pD~8uwh>Ju%c24ge09aT%OD?1D20Rv|`5kV@Pw=I0Fj)r3H)# z5~L_l+%2&)7L2zbqymJsZ8cDVU9*|84c`0mb8OI_p1%TI5C!`h6nNk1qi6~g=2|be z%sr&Ju~;{6zq6gbkBLV`FH1)fR{9X!@p5y*CHZg%7#l<OA&<0OXgn|x@Z{7|b;^S2 zFS--DrkajobNbv}u&t@AG!=&roT12rAPwH0@RrIEg#qxxOi^0`3q+4P{7@uGoH0O< zCN^QUp%Ct3b)mA*&{2k_5)6IBBy=gBm|U^q;>k8ZUk&?p*o-yBy^;Dzm{mJ6RvCgv zJ;pywO_ZyryC-jTzC+a2i&xVwL>VgE$ZIVpX(CDNM<Tl_;;Ea4p%N2Uc-xVAhi<id z#TJ>Qrf$Z-Ce=djmc~$;nXENvg*v>V=Q>x7We#KyE^j(Sy6UkxJU%!u@l}cc^XQr| z@vhNXR%A;rF>3MZA6_FPu_2-L#Hb{$q`g^D)sibL@!;fx&jNbIr6)3GcDv;~A(0)- z)<}&Ng3RL1=ZnetPf#czmc4XSjTx|HbM*MnZr-if4lyF}lcbnjbwLj3<#LNf1SmW$ zNGz1tTdbbTCy7^Fy8Y;RzR{|Mxi!;PFzo7<uik5Qoc+85cq#ri_FMt`cqfy~h0ovY z*x5YG`PQ{nWaUua-n^Yd40StDCarBy99acl|1xSP@0xy;8ou>R;#nx(`Ms;idW8w# z?KiNiG76HTns4wvDM9oX_rIghye*dajvklf&{w{T)w<Oi@=;%WtTiZuw-2b`{T{w- z@D3(E)qV`#KHcL^YNzYKV^R;VDA$(0V(IS%Kjo{x|KDey-ly;$m9@#!wt2UGl63NK zD_V=`&v#35&TUky!k#9Qkf^)g<nZm8c#$fx$x9U?b(xP`F$BOm$tWI6MDqL-Q8d6K zX=A|RfL}o{R>sivKNtHL`<S6ogIzKnUhG4erwjCeA|KCarB%Fc-8x@Wv4R}=z)(`a z)yQ?O=~~o4exTBwpBOzdy6MP-7_pn9G+piT>@N%HG6hYXX@~^f?%5botCFYh27j&| z0^(-B!*0Rft3B=;6>s&_{=R^qz4&5H!LH5eH)^5F&0THkL2y6(k2ihy*XM60L9@1S zQiqON#DLkpDz340JWK9}*q1uMU~OFQSUMh!(!vttj={^XVZ-v@&YP}cGK<Zl4Q;P^ zNuDj=oSjmhIB5OZ{OsB0<IVYcA-kk$gaaqO3qu7%IFK!UG^e!m$7yP;4f+fg>xR6W za)j^N2l^1zdPjQ!%8dV^M*WsPKmK5euNr;MwQ!C=W^y~|f3a7&Dgyr?QZJ=WR0zDl z>hoIWr5{ne{>HTj0Lr|`nF;iF@D@$HK1l7ce^Od@2aJ_Mw|Pe;Oc<!EAA|%V7q#PT z<{tMyKHco7=A!f-QZExQWJMv^+?bh>DZ^Pt>8l#)m2{1r5EMa@$OHt99M-XH9<Go2 zYZhvwx~c;yNkRPP?MY*o6Ol}uDVj}ibb3u5si+KUHPVnqV`XR~BL_W5&t$ziZTz9c zse8g55V#sxcApJ#<0%|OO=wVzHmX4doj}dRL>^#?W=PT3U9{h;_APl;$~E1q%-ZC| zV`Qu^K7LD&<kEhnPR$WZ^#*GAf>)V!M-{+?^40@Nug2-zu*?%D{q%#b*y2!Er(~6P zX{@geQ963tgk_u1#F|d|W361miA|r)87kb(Pvd@=Zmh<sY~`s~GU%$>3h41mGoS>G z`(2wgkH<f2S>r%N7R!@4eMs@I^V9rIym}UWs^vIpOtpd8Z_ZQnEkd^0MmEIjCz>9N zNiqV@QqA&%`|pW0$TI4-ZOE1j*HU<!^VdMv*|p4hITn^Vitd|%JMuLW{EaJnl_sFq z^`p|!u57;FmRGDaN-II58!a-F%3FF?l<W8ym?}I66-q35@+|V)(IEdVD_|OBf}m0U zyJ@82gl77yZCI0w+t&}9ZkCqlVShJ`Gm+6S|J^i7ghv}E4QA$jHb<}i+h(k4snEN6 zBwb>Uj(2y{Z|LYs$KY1G&y%tpiEdR)GJ+xmM50jiN987%QyP)iPWq-{9MH&}kP}p; zD;7x(l{iU;1vQ^HBh4#ywOrE8g(<LPINJv&<&P-Mw0lyHzW7JUWaJubmkXe++)w@S z+=d0{ySVK*=5$-&$^Y^UGi2a$|IOL{ZTm?E+sBMfxPUO~NZh(LUo3b&rd4Nb;T;Rv zKk>iPoMdr%RP|15`c$5L)+6KwDzywI3OyZ^nE^)l@NwaY9yfZBIzC?}pnDF*VawUP zf=z8$SS<Hc%N|6YHddbY&=eYb!k`<&Q%P7gr&yoH^RRjU@sY0w?lo!*lW6ma@oRVr z>W;h<Uy7K^L$;zfL?VLzxi~Nr0XqdBV@$aZ-Mc=rxW+yY5`WAt#N*SP?#XsAyFwG^ z)-fbku#bB2bc2FOTq!9yDCV=p&z5gqEw{RJ@Ou?~PQfVRN&Vezmy;0wDmNRu?dlD) zZ)lyV>J16&71g1V?^i(jgCXSci7D>{YTi3t(HV1%yWNe|?>hUhiku=)7dc^`wvnrK zpN+p)sMH6<H&PjCaX~v?sy|bP5%o_*8^9VRL(salU9tN4lzH@PyQ3$f(B}svX6bIM zyDE=pU&0#BFksIvjCr(#T?th&%uqEADD4qrlXOx4Ms_k|&k+Z!6xfk<{^(37CnzRY zj`n^2%&2+){L33NULQF{SLcKue)Q3oL&*OV91(NY?L-S~)qW=A*zvYadL;M9f`~cB zwwO8yacD{LmAR1Bh{1!0)Uq61huL_52+{TAAIBnfSaNV;*k~%|o0C^kl5~m}F~KjW z?V>li3gCq_+*MYIgZ4WLG5T0(ZIip*S`*!Enk;s0GHHPXwf56a$KE$mi}_}`|7x>< zs_Z0VX8*Z@U~a<m{V`@D@jb3{c7M~JN~)i~;-~aMK-+wf>4>c_IVb6^%h#8Q-Z4Lx zka;Zjt&S+t;yh2<avHK`<#`3}a^F)9BJ5rEZ8mzoCEQ9r6aL)?Jg?a&=WpJ;Edy9K zEe{QK#lqGBW@CbzP_NqFx))I4<!buu*(HXzR`=<LvVHh*dOyD#t^4Vovq7@mY}TEd zrHE(SY}kdTYWcS=vyVfAkmT3W|K=!hCI-cN8zjPrvxKrUElP;k&avZpV}0Ro>pB}R z8#v*mE~t5#kwk<1w@lqM$|#{x{<~>p(L_W0yJ_5z8$H^GckZ;o`U9*rbnaETr$0i# zHQNOVHR|%kzC%Mjo_WK0v2IQqvId4MTs+`UJLGgpTTs~n9K61uvZ3?S)q+yP?tgd2 zXR%(btBR&-=Tcg9SN<xBywsDL&{^`@AHF%GB$vmV6~5Psiq}ybrwk~4*ij9-SZC1# zdq!&FfSAgkmUOdwb^OBaeE!Peo?~Rq1+X!Icid9K-J;rU;ov$G(AvVtdFX(k44y=g zmhPQkOb1fWTx?0V&}ZVzYC>Vw)~8;Kx^P&&MzH^CyZM%vOY6m^k)>>`UAGt|Te2@k z!|+iL54uN@S*?ReD+FCwPF$8dIPM*wVoG~}h~*c|T2!mI1EBAc3|y?TR64`0r&+sP z2vwD(DJx=IJF4P9Q7Krpk4T3@C#zKwnW~<dKC^3%7M>BRlveAi93VL`!!>W0QmBR& z%~>~Bj4UlJ8T4T^)$-O&Ejv-+@^!qR7IE<^>ghDzh?y38n4e8kkutQh@@9M`J8^Di z_@RXs5rlh1FPiR-V(8``G|fX=qFeYvy2qxUwv3-|SFaHlf81~j`yCO-wN06U-w7KN z4ZXwDE+_AZhXx+O+1e_yQ4+)Pk-Ljv)PNm9BU_rLA0k(mN2d#Z1T9$1r>nixjiG`o z5rvF}zX+wmAx6+ruHp3>C}&ul*jnJ5a%@9G9_rRcY-(W)jYV?wq}=I;+mrK@QI_7a zf<&$1L0yFGlgAjrRZit6LjyZs5aR<!8o^sJ7LmUoQWng}h&BF~8n*>DGWsL_Os+-u z5=+qn8yWqXI!qHKwlTP|)tOf7VaoyqE56zx-3DbWMld!m-01O8hTE9+7-y1j@Af4J zZz5$v=Wt{;Us!i};y8ih5YH!c6?l;1g1_t7^RR24%O$t#=4;(_i1^KFv7{T~y}h#T z)3vQT<FCFBo?GSrj_*lxG27fDKrg@Q?nY}ELe)AuU|a6|XMjS{I&iszrKv$4wU2Bu z*9;NI7T-{*nacDeNoX;EOW8inD-B<{#*Xb^gB`|gF|4rg;@%(jy)ziqRYJ*y^)Y>3 z=KspK-e264YLj3_lCUUl)6UO_NIsqaCvGg93c$P~`M*B|Czd(H448`IVT#ep+FfXY zM2WMRFrBSjc@JJHKYkDvDx<O2`0-n~FoB>@7#c@X<z(%>^Otf#piO@F0R;z_+mre6 zG7y=}E}cWoL!|F_m;S(|&Lg9hHMRS;rI(nyw9|Y`7hqmIJ*I*t{+$9mI6qChc0vB> zbn|L{dJo@Vp0AA#?RLPS!|se0;_iC)E!{LaO!lpsc>2}m{B%JVlm9$FBi(ZUyW=J2 ze0vSSXNNkGOjN5H+P57}pyTa(;ObQH6bbJ13o{x%x|Y(&BjPy#nO`ZEm5OKgaE6qM z9z{lTe0cyq4$7x?Zf5eZ8a7*&(sF2iyYsWN&33=LyWXtdzS*1$9l1_wSb!-3pF}th zQ^|D1rxH*1Z}!6YRPsr1rNfFFGnN#p&<cUU>M;qlb2Zt^(wI0WNAU$M5L*r;fh8Sg zHgX|vov2&^mt7GS8O(bl*j9=S<Z+lcc|9*oIQzN2cf7nX$cfR$lKCL{Nyq)T>vu(1 z^wjnhvwd2{jPwt=ito?i_}LDNaX-o59VYXz-<)p9ntRhrdGnjqe^Mng)e;ApUwZ&W zc@=@@CSqJ~`p(K07ZOfT<cyF*qvd0>*pJ_C5@xc6U!t!5^OSblflyhD78qNbDUigz zb^x$pFxb?aL%W3t2#xwKyy5R`CGu<RB=X-wmON8vvJZp{UMsp$y3hBbGKA&sxjIl^ zHif>ke<6XYxRW4?RhDoJ{+iMclNGpm$~SN45mGW8$X<3YfLqg@wgt=qF(E4EsPyVJ zmKJWq_Kd!0QDmqcAEP%^Ow9GX0yRd*Ubk^d_IgINEVR)Do<vJF5F!oPSxe5fJbX`N zWD&a%CF7nGi5Yhuq9@a5B26#oayN3(hcl!mhy#8IzuXJE3iHtLb{CNR|Dl<XUdUeP zdvpC7qT4|^ZBcd!{HNa%453a`xFXau7&S1JC=M({?n@uqAYs1HM1J7iK(idt_!plI zEY17gOf*xlgI*kUDE6yCec}#efUgQ77oW}#ygz9cB^rO)Y~J7Yrmd>1LjSmU*7iWC zeg9y7Oht&_Uh?pULW=v<aSL5kUhR*K`N2JC9lyBO9Ok+AZb%m&)4lk;q+7Q$ij^rs zdQqZK+n+83b+=mC?d~C69J8MiOMSB1(veO((aeB0d^?duePEYl(`|G9bTI~P;dEHD zZ3w1ppANAjDe@-`-h5EqK90FFDYO2tm*uCF#vLAiPzCq1ZMp`BtSNuoFmxR9admoa zPK#dLUChtun8-ZhEt&^T=_W7e|NlzK&3x6)9!V(e5^nmy1Hq};i%;H?L$o^1*TeSb zTQ2!&uJKve+(j=<2Jq0rM__VtN<JV(x!5P10FuU*ALv*{wW2kKVMlV5Jj^;xl;zBj z51ZRM&|@}xO<&%IVjm>jeMncm5;rcOIt2=g6m<30VnIV6Dfo`uDjdkG{t|3Jh$K@5 zINFsTO*0)3?ev#4j1yGg!0{0l&Jqlr-^of54&LLcMvsB6(yh;@a>}z@9DT-@I+gn~ zdirGeEF;ZEo7cBJ6Qw3k8Z3@Nfr1!R#snO1%(Qu)0lK!QM|uZO3CWd>Qk1E15YHp& zj)(MhqS@^~%>MVU>0jsL8hS7R{%E3H)kSKh7ccTvAHvhU{1sg;?j>vRm{(pbrDml{ z@tKM>)f=eTRweQrYM55%)$ckwu4#t#X|&b0*jN$DT3wZ_u%@TDYtn1T)vfWcjzGR8 zAh0@GNm2A(gba;IC0P?FXk>AVH3F%bOO_;2v{+<nXo6ilINkH+ox`-eyYb0TlB8Tj zng-BfZn_R*{Ftw&TxfvQa|k|`<ABm8jcX@MU?7YP2K&r&nP6coxd>0`Is%`z0aA{c z2MP7gM5mQ!X26XMED8SmscEp)+_d-5Fc+w25-ga9GBh5`>KW~~Xn(qx_Mu4cBUH20 zFDN=-Lns{fF~e}Ssf5b#DEK_fmU5+-ZJIlS?>at^ou93wGBg$ul@q;TfOxdXLl`8Z z={__N#r2+2KJWdL6WTDRdl1GZP8Ne2P9F2JyST__DEl+2aQFEMi|^GWu8|<)dtR$$ zw{VH~5uOzD{33NV*`&T{FSp9K!g9YL_wLnZx7xq`botFPZB0+|VL6{dzvOhp9j%yj zFK>_OTN?DtM%S2t;}f$k%y{dLQzPoSchU3>+&@aQJ3U`4dC|;u)98rZAGq(g=gZse z8TV>U*d9~bKRFiWz+FU<PVV{sP}-?H|B}4$7KzmMSNz{0Ux^V4L3DhhU@+clwK!yP zfxlFvK%$ko>wvmAXXzUyFo+|YCD~*U)97bPWZS6xjUuEDV6G%Pgg7a&D?mJhP-H5l zR4@Z=FEAIG0w~X0t~^h!3WWVry|tR2%m<jwo~xkiNLPP<(yazdi_Sl7>h*yJ5i;_5 z)$fc`kC_yT2O?CjJNq|J(#MoO1K)DXoDqr%>c=h(Bz(PoPcUoRfx@h$jw(e)VP<O1 z!%2{e=ZtBPQ6lb>bqxfH5<hOwn(Z$TI}Sfhuj_#}JgV_Cn1vXT#d3GNUA<Z!d3Aj2 z7V!LheTo{x$~l15<X9Bl^t>MC%jbm)FvT|O0`R8cFZZyr791UkCTJ=dVi^1b>hv*T zp14&v4$I!BkOAO)Z8CHYn75}OAWfQeW^-LGt7{zAQWCK86q>cW8vL_EmeJGMDc7mE z93zmXLd?8RpHo?}8^!{JA1nv87^V0Y?zH-yEfa)U!YPnz`vR)g<ccGx&l>OzN8cjg zotorR*DcehH-O@z^g_V|st3zt!0aNbJ=P{xGkyEj>U23fauBlJYABl5tVcnE#sm@; zXua`3vP_QLSf`J-N&@_HlOQq}bYu@2lR$x_!89Ov`O1ZC52|?Hd-KifK$Ul#RgA`q z8`@KmAJ;9HIdwN1)+Zln`m;msHx}>PA(!Piz#V@xwM?ZtuxX51<B|5Uz_Nl7<stH3 z?;yxHUJ_yHu2NRJ;DV9YooUEn{8i@})AQb3Z$Z<MDssFN=4^9x&W-I+w_D&Ar(61K z&xTsXk?vWvpIvT^fLxi&t*i8Y9d0uYt?#(IE$nh+#ro#$x7hg9UJ5*c>8`55quQzf z&Ll@$K(Jir?OBWMRlC@IywlMU@R3F+L6J{uRFz<QvZayJ8UEZ&<2cerM-m*;jIL7( z7>e}p;m`Gu_BwvBs_JWD{OoUalCao!!gudhYZ+d(MP>w2^n$)wJRReQ+(#q=`CWu8 z0PDP#@&g-`f8srakc6eB?7=eajKl6Nc$avCUt`L92N}}CP$mH*+N}amGl=|HJBMn| zU{6xKTmOudPCA6=TU7J26;8VKHoj0-WoNehZclY0c46Wp+w(fXAbHM#%LLXor;tM9 zpxtA4ni!=Mh64*cd!nD#^l?-3t&XTywFt?*)1yJk%i+*kjIKY{qqd&*;Fn;Aog+Ew zo^HkV277=ScFk#7uXXo$E$%?mHiuk52J8~It&gXgnP2jps^)0$ZB)Z`sCH}2;Vn0K zjwLg`+t2=b_sPS%pFF(x^1&C6?mc_>`J<;K>d&v^VCW^$>E(R;dUyTC%snW-DXUK! zqzj7y2iR(9QRO<GSBHDDFFP4VAQN&HL~@VsOQr&JD)qP7!7e#4t$36^=HxwQ6kA)4 zm;?znaYLf&lTutxSe&`<Y8mOUbklrQ#w$^!6B1AH|GAyM@jY1W9?HI|lw0uqg#I(E zrf95kw-&?SCPT$vsVhr|r@OS!`CL!fLXI78a5=oTU-}H%a96p`TMya)+}Q>2s6Jhm z@rjQeQ@Xz{P^PKR&#FX<jx&6L%ToO{qGc(8FE5pws~1Jd(sLm-%FhQGA30yl8X0|- zwYxrH>tKMMP`GwYMwcF8J#rCP`nFF{lKU>*38tfZ(tcE7mH*yl$YCioGmgxczWMlu z0?R!TWwz<P@AF2lN6i2@m3<rw<JBk;Q_==8&y$=(usfp+kNruVCqN~n*RSuT>sd&4 zRqiX0ihos}cxzO~u-9oa)9?-qUX=z;*m_arAKpe(VG>dev_7|PIZ%T7(e;ey>=(P) zw{%#t-t6fl@_fCRt=6>n${Fjk&B=_1rFOq0gNJHYw5gH-@v~ImxvG0Cl_#JyEVb(2 zZ`FG5(Aik`fm%J%|Keu$O3>48cDcYPfi;oGbSO1HO$+jH4LK#IqhhS$#@l!|@}yCw zwW$A63ceHS<_idm<)YpZc-J6TgqLlTE>3LYE$2l#s5fSgPAL3dJi5+vFM$p1DyWSG zcA-oTL9vpxyq!$P>=jxgC{$KRoFQ+B;^C@}`P(D+<rBUmqaNT^zK7AlpO-G@Z0B!8 zYk&?vjB6azE2me*tQa`XF&Gm$iy_6Hbqov_7>e4-XTM#r?8(S?Aec$neT)H*O%`=; zn~iM@%4+1iw4cr2Qff)DIh~!;A(eCa!-~xpO^&XMrUScTzlQ+lY`>u(^4IIlx9gd_ zr8iP4ZTL%xv@jQ{wmVEqg8IcFHFbxfg}xszRJkkhj+Y4}AJ%#|Z+C!Y#dIMrEgz6q zenM2=lnr+Orrnd}>lL|HZz=wiO7dE3-vx-Pk5VQX@RJtZmiv3dP`QR0U1vZdG+&}j ze|w8hMjO>6<v-P{Y1bd~cE_4QJ3D<&-wj&rSM=qe|6I}}&bD?^erVIDb`rV`i~FIS z$J-WHrQ1}Y#f$gkoW8}9bBZY)Isa+Wi)r)3Wtc5hhO-%pZ@${SoO|bA?n~z#8Yfey zExYx}ihq%Lm}oBv@wP|DKVwh(rfda70PDJ2TubpD9C8sbYwNx_pnli3c>hXVNP7)$ zfN^33S3{f@jWAty;{g|P!&i6a15z4|f1s$xNGuQ47d=dps_2hWbV&pOa{csddAvGV zEw?d@y=@Zn5OD-D{2Mun0iJbQcVM&D>p<dnaX;u(7ND$)V-V}QSq$yT>iDbWmf`)0 z0^~%JKQB*d&M{E>##q=ohE36mboVrdMuC;|KJH&ka0%7s{TMOX>FRj3XJ78&`U`PS z(iZg5^4m+nd$8F`xfu4b`=7bWF@@oE$Pt9xszvRLW13dsr9!c++&t;3Shd}8=CFzC z#T&EMaM*xg)^|5%1G)|0#Ohki8?)&;i=u#&_0x^nfx2jR?LfUFBP10fz0(g9KP-mJ zX%oo;FUp0E7&>xKG3m}5K9(S#hmTk3ztNbDoKuP3TBf6ZJ&C53??^9UQzVh&=t(Mb zfOJgS!gj3`Mab4Nq!G6)FP%_`aybsE^_PejEJAZ{FS9#3^o+jgIKcLRFz~v;VLIaj z^7PitKnDr|Mmw-eIAj*11kM>|Ls4gNF}8cqK<)_-diLJ6K-iLU7h_WmQjJWZZS$~! z+mj{q?!9Y(r~zaIix4&q$0QKl$Jz`7ZN;^L**0lF*2WGn>SxkPf-cs_7BlFN=<Yjb z^3R)7+QZP1o#)wnG!~!obwI57t4#joFd$M@3o?Wo3Q21>LFxIIgcQxQeP4q-r7igH zd5-VeJ?r1=edgbhejgrT^PBH!)YUq}LCglpZO30Hmm#JHUyLMd&$l=(Iekk9W2@Ke z<wECF<LsBD>3@pqvWqWhdr9H?AvhUPbxPt1&#vXI=b-PC&OF;)COfmVTKna9dtMg& zk!{psNsiWb`E*Z0%I+?%u}L(G&Uf;_^h`)!PB3xM$fYpLD<(_Bi}d>Wm*q$=<TBqR zW*gsTwN8hDAJZ;griXoRD)vlAl_l;_VhME0nLmEe(!I<fotv&7thT#7-ycRg;}Qp* z)P_T^WiCS;<I&ZYectdrA}&rX1jYFYMGj~?yQNZpV02)2GC$qn@VCPO>|4=9m|oOg z7F58=y1=W$UD-DqDn(Erx}%Ze0e*IlJkRxOhQ@sPPPh}E#txr#U~iqEB)>zSsg~p< zQ-o8FOqa+la-*fXI@Aub*Cd)=@_s2o;szV3-$$Y#M?0;bR9+1@K&8!eSB7&7b1>0d z;aoZkke$MAU}FeO@$b{zocB>s?s*p4fc=Q_vvC#5o1Pm`8j$Go;c}i8y`V>;trCvv zA<)ZKchSSFvgpsEqv&r>H_COOxBJyMOI7pC{q#ImK=h)kb?DuIa^aqVLcvf2M#sJG z>kWaPQWMnV(c@Z0&?9mwvI3xAfzZ=a;d3I_U_c>m*m^|eh~_GS{YmNju<*UjDZW3p z*-~DB{7Ge0=6j0J+R(0Pm4#|XX%FRbe&~Bi967&32RzBYr7a(d;iz4HX7-bute2FN zbNce@<y(r$0-fsZo8|U(-7nRkaIN1^ebMb(&O|(0&cA+nzMG?;O$W$|xf4EqK)FGs z3B3I#goNy&+(I<8bw)XWZ07DgksOBFniesPhTt)v<GiR!Yv5dC^r+td$Iu#;6yrvx zGI4)Cu7R7o-4dJKLy?eAS8rBSDFjH>>7F(Q)tX|v5TvXO(J4A*$Va;-^Xo>-sZdmj z^D~hm%h`}9*v#Faq#yDOd(-Sh94ziI^Y*t;2Gq%R(@X}9?c|!q&BV~7dDwJomKoie zhfTNMw9&iwPJs0GY!Z1yxfIZ(-aaHPRz6&THXq41EO{4$&HVBKJ%l!Y)ox#Mf2>*6 zZ?oGEbj)a_Q3!gH_XRp-G~<NIIk7)|;!es=q<N96nQ&=PCfcR_g0`rTD^0`$T`XUn zzouu!i%r{!8q3rzc1pAUA_wC9RD}7Rh%|8`Uyy9Ub?(z#Yg?viD+9^;8!m5{?dEN& z>)@z-)BrZulbUxlTc(5Bk+y&KgB34QlTr|fch{`75F}vjmGwSjogQiFA3TkF6PMDC zW4WNnsHi~)sC_#HCXqM>=Uz;Kbh<gFK5rksUT+A;0Ku?<hkWgnw(GlR8v#O;&zTZT zs`K@m`JN7Y7N1fpX<}<8wS>E8oe>U)u(lTG#1SuPw)CbNH_$+Y+OKu7DResrUJuh* zvP@o$6txzaGF>SBSiS~JXXDL8DVc=JXp{_ypb@!;^gY2Peg2W^yi^cQXbA`-DjY#v zL2prt1Ao<*F<BlfRX2ENtJaG$fDs=og32U*QF_PhUC{t|f`5#T*A+B}WT}8^en%-R zqW2!qLm7@7-&!*iU)UP8^02X6blnqGk#so(DMG7=qsTmahezot!Lyi&hU49xEO=9r zB~P@H+N@9#aDwR@^v59@_@?oYmF&8y*mwPb?i#fakI|84H&)c9Kjx=_0_luxwZwB? zlrO<Ooz;Q5C`u(~tmPHwHHtLLINUD+eH4PPwTmN?d)cSXJ*&%NvRIWej=j|_A=b40 zX|>Qe+%KYT;Q&}J+WR{#)>}i@E`kPCCS|!8glpfeuf>b+6lpa-2c}gQUekR)qXMGP zx@A8~3awVT7?Ra4dt1?4w2%PWwY0s#ll;#QiKmf={6GFji)_+j<P-m4c7zaHyE9@v zM&UMAYM)Vx9qn;B@P(xkrAZvR|A^{neM^O#9@5v$_ngggbe*C?2ps(~8_Vmd4V@p% z7ZeLPdfpD_?B%UnPoLer_m`K?p4`26|K(@*pWXfB?z6iu|8oC7W`DRH;97MiD~8Yt znayJ|6MHJScF=ftpT2zh?8(DNe`-cf)L_7O=`e#b2VWn3^krZ?cv<uOjSqkd=gG1K zZ+RQr<AW)l1tPHRYJ)Rgkr(iF`^vMB|0Nzlvrp)F=okdy!PUA(!9%@vRzW=ajiH~m zP1&q5b7qe~?5;P;-YOE0R%WhaiJZGhy&^ksgAY&g-d8+CY8tF0*L?Z)><-^8Q|Inh z+J_By3AHWVh>$%TVyCJnY4{P3^9H3w2l1+-6s{MZxM2CLybhH9YolM3%_%9YY3KKj zeZD$elslX4VRppNatJFqd|PQFxYlsYwn}`<Iu*0{d?JV!gyQ)o+2GB#2UE_A4Q?i8 zB7G9F`5e?W9URQhav<lbRePT12$XXmA<<V4({e0JFfGpq(dq=I{1EWX{1aIYsE?!= ztK~wE>QU2W5HA22Y#`u7^;qUgD#$F%Amu6bU&u9f8zarrlfi8sEJk%elZLtLR*i=n zTWZGqo#0QT_ICw5CU)@4k)slliF64U`zluFQ@5+Q7;=*s=_*cFC=^4-=D2u(U43*A zLOZ}EV${rZQ3LhK2Ag3|G}s{fZG(*-ZPpxz!P(1T!@-x&R%g}waz;Z3(-JcECoQEp zd1dPzMLTFK9h|y|I<{G?zXx3@5`-ur4jYqfXLT%N{k?#fAUV@|Pz&rc8b=&e=MIqr zD(C)kw5>OYGcxH606(!jaeP&gQNiZ088lw*D$>mA^?1JiI0ef%pTK*IyjQ}_W%TCs z09HxhGE-96?zgzd<N5xpwufs*Bw2AJJhg=%W6;{K&ImyDkgE8n{Y3ljP1;A$8ygg4 ze>EYFFB1?$toF1$u0l>y_erySJo4O0U)p(qhCBw(N81!Kfq10jat*_JU|xfo7Bw~% zFeMXut9Pt_0iz-shUeOOQ-%;WahUH`)dt|=-}kd6<*U@Riuy2$Wk={SWcn27bdZIO z;PH~~tvf9<`|tnVAi)6fJ`wNcZ$i?YQVWN?>F2Rf>R@JloSX&?aKih9)Aj2iPAAkN z%S@SeS;LOp04e-)^3(RNd5^o){Nu$2O{PxXs@iaFBA3c5JT2-~<27}_z#N6+I?=C& zR~Q$?qA_M64o1aP807vJ9Y3^_Ar7^==7h2yqw69JZk*X<pd=rw0@^%g2BtqDU-Tb4 zY-#|#O@BJx!|&A@{ckoj=}(wa`coH?eq?H<js7J!oAgCWoG0GHISXw(dG~!np&q(U zQl5WCF74~(_OMDlV)Dr)08ySS&rS&_at(*iVpF0g2Xfo4vE??H+Sw$mfA_(q97qc> z-OGKMO3u7|_1oY6uYdcu<NtZ`;t@XmN&mZ9^Z$7NF>f$l<UjKM8+kCfd`*7$f|;rV z04g*$jDQp`d?a7!&71jp@q)_OoSmo7#AGx|@cJ#T@RrC(`SA>Hz@x^8?sR*w#IfSm z&&ITUvf1qIFujHk*Z-H&peP+1mtFDaz0LY$^;&MP`A#4aB}<*3()k@#;hOXLf2l|l zv_%IBu`Fsd84&)bI|^R@ZM&innFsqYomLVWZzw*u+(r;+M?&9Cd+~IC{t9rAni|~H zR=>!6IW}%Oe8IOw&IQ%750Dd+#p;Ag{(v2;7bk-$Ui7w1zUoM6VK0~8Q38CN9ClFF znBaK6Uj07=Ljx?onV+8HgF)^UpIKDTXt)3JbTg+?FoYZxgT!Zc>wc>@XQzd~%dC*d zyWP&;RsiYoVwINPwk68csD8a8X{x%@Cwi$s<O*M$b+~U)t*Cmo`)d9hq)OCn1F)rt zlLJZ$nf841?SA(XXABki0E_cA88HfTJ1CSaN3?@xkQWrCrW%8!K3@Ly{*$LvUGU|@ zPk#3SM>_C{B{{sfNkpX{H<5+QzH2!(oSjfg_Ur*o%j>ld5WKWeP^09NVh{GE$mFy7 zB<UZ&#mv!AnT4G57exi1&xUCL5!i`_hym@$$ZH$%DQXxh$XR-0Slfvg)Em7KgWI+0 zr8mQ&tH5Bpti+=JV(ViRj^SB=Jn(yB;z;+pl4)M2xy0ud=ug7hAAb@66fYC&aS>3* zNu%FA-)~rvY?DD6MJ^@|iPj>0$}O5#x{(t1Jw9D!G(g^qOo!6b_C);o830^}wwd=Y z+*!&?Y_^n$6VHIvZmIt$tWp*A%$x!?wVq}S5IK1rihi{`{<^p)gwf|GX?e>X1VgBN ztRfol-rakDzMpj<ZLF_<^PAt^#3rDqy6Xj<=!<q~V$GQi=Je<J?kksyMA{{SA=kC) z1Dp9NooOxJ(o9fNjW56CK#$c@64T3~Sk4th>=M0vI1fpnPB>Mzy6uMrsN2mmYPVV8 z#=#bb<*IfeueIBd)GN*=wJFkpE#li6#jj3w=Z3K{2p3v=GW}wIV-pBet^Z{t(d9BR z`CEggPG6U^D!0z@Q(gV?et5NY%%TQOCC*B{6_}nC%HvEly8XhdC}cECU7pukBHtDy zGc`&2J1292JAwFG@L2Q!^nE(J%D9V@fnNSe)1mbeIF#4%9qdRoKk#7n!)82ILR=~Y z?e$mF&@m6%x(7{j$5m+V9t<~Ec56E7s|Lg{M>56}OuV6JVO{hsKiYA<vF3sNqo#{z zboB5~nhu$1khEGjC|Om5F`5~<$c@dT268Pj=u<yyI!%=)0GrxY29faGpz(_H|Fivi zgKDJDzbsc0OibY}c6oyee!JY!jjVEAfD&TvCJ*%iyr`^BI1MfT*w9BI)7v{qJ)PM| z29J7UCJ~w0wGBsR4vKa$%I^emXcpe-J)^B9k+*C!Q<{ods&q>axHVn|ct#VR>v?kS zbCy^1ufwi5Dfo~!$S3rUGW!jUn$r}FL~hi0x>JMha|f7{RppW&ZT0h{s=;;k8s_Cw zjWBVL-^hC4gECYt<t_a`eT13LGU^#)8fon)j}MWdPsstKi-VM2PYLBm*JTq+*^I>R zT$UILWA=)^k4}G}9<kgMc|-AsUtTwfTmY=d;@4nY+U%8W__BMw;>HZSe{&I+h=<60 z)B)8vGy=zbODTc420!-y`9^47mgUaOP-iCu&+<}}_=j8$!eIvHr7F^NJ7ji-TlfpG zedc9)L|fATvMc3{JJh&{UdQHR=~N%MMvWx>fXlomQ51p1TF(|6T5nVg=ji2s*|lvi zms~@#F)i}ZcKQF#S0oR9`K>Gm>Dr-nD7x~JdNsv6$MoxbJzL_Q*lcsmc4RS=ufQUZ zL%GM48*Vw_7L|oZRe1UEbUC4~zwE4v3u^g~5;HyO(&nFEcSFS4#W`Y*X+(PxiGDo! zU+u^f*>2Cz$YB4Mm3}^BR)v0`JD?60FQXWR)eauTCv?z6wsgH0=6H@0)bs1)Jn)DO zuN=$<ILPAdPjLb<>R*;`^S~4Wi-%UEA)@$KwA10995e}L#wv5MVSB<?EN{)O&wj~u zbIHX!Le*`WIwL)-SKgPq2PDTmH+XgjcyHoN&Ti7o$YeafPUVaC4=77bwn?iUb|u%p z#O00u_3PQc$p8HIU+J%Z{}H{t)&9lx-HcNEmt+UXQvCaDF@L+8(RWWM7XmY&qfshF zB(C3T%<22puV&lxweNz|DKG}@A1UD?`5dHfxX_s$v~1$Qh5s-sU$*1GI)$etnw%m= z6vWn<r3MtyIHmNKov_AoVH!wu6~J^4D*TjoAU-Bf428?M<yaTH4BT&$duQ0&5)bP@ zUq-C<p=nUR2O?9ps8Ctz<vMg4^#+)SsyOr+(o7S5p@JCiaGEdW@b_>^8_=@WPr$?b zK6vsI=hhZ!CVw#&m?&6<?m*@A0G>NvK$5s8y}b-;l%@M&T;4K`vdmx61ay<bMrnMp z{X+l57g>>|i(%hTMQ^%V=4%2ZyR<M*ucz-Df<vhG*6EUZVd>#aus3U}RLF0nupEUW z;EE(yZ&ROwd52B{lb$1>`3Q~&jPQK6dBWci?6v)Zf)SjJWhd9`#QPq0j6{XX?_7lC z`j<BUvbx^G`DmuAzq284dw}fmC)~;857@_!@X<9v?H9du-P2u{QfwlP=N@-ZwZ}AO zvhH!G>q)8|PzdFgHox`PWk%Xs0@drE0Y;bPdu>x*U?EJ1;eC_u2NJkObaNEqaQBRA zbWs%&dR-UZP%B;3X*rOjv~L*ad>UCRP_~&xs#4w<l}$|NQe?Q7T;C-$pi_)8#E);X z3f-R<&>S!p;O3#qt?Ck;-h~3;?d-&p6fHA6!v=fX)y=@Y&{@Q0Zxp3S(!(Vv2u4gE zMCc>HRkO<@Z)Io%YumKKgBYDtxl0yD_5RX$MoMiM-AM2&tbla{xN3H3<eg?6#@eZ% z3J;*`KvnNAji*!N!+1I^Sm6OY9jNO47@i-Fid^Ifg!s}16PNi(ucfPYkn!}dayGaw zg*ztmc%s*}K)?G7Z5j9!b$h<1%3u^`F>X{vDHAQ`;jQBOMB>b$YgK{q6Oo`RyKQjd zv061;`s{Ub@vY;)C}eMtj}6%cXgm8h4Txy<vPV{74&*$vYA!e#bne{{UY*9YC%$vX z*>TJi);1M%>GbQCbt!8y=zIoK?F{7Stj3lXq&n+mB_TCs;fY{{m%C~x50CeDe6(YD zf(mZbp{&{+!RS-i{6IPDcsZ8K$PXx<iuJ}q6)*`!oxW3SAZ9qyAVIzIyGLQN*X#<W zb3dmV(_4S`PV?&^R4D{rx(FWc#Boh8S~SDiy<w!3NYuH%>UiUM6HnA3?2MJ-QF@7{ zH!3rRqpiK_nb)n{yy<}fQkf@azxASkclg&%qkTfAg)l;-61sABoR<03`JUp~bSx?p zqQ6ldFTbVxMBD|5E_EB)Fi^2Nx;K=rehDi4zlf7AlLYW^bk<IH6XY|%1pXY~ohHDP zZZQBtP}|Qog!GnjD5L-&MQjQGc1&Hkj#lD@i{JHV&r4WxT{?Yxok5Aba8s8JeM0>c zkKKZ8*F8qTx5GRgr|y!RM{}FzRQLgOamq42z$)^ZxJS{5ei?l8sQobIJ!V~syJ0+` z6@va%W>}m-oJbj0N%qR-NsT$rvh*(7Wz&Q7Y~+hv+>995!|s`BXd-G%J4YvpvFNM; z_4#$*r1q~0<toqVpNBVCyee0`Uj0Ia!U4oT#g<E)ged~;_cv0e9P_B5bh+8}8t3Lp z2a#VPXvuB8R3^2=J&l#GI?|0z{tQWSOo4@lOHDVX(8P4SYs=I58B(^|3`iVKmJCTh z%iQZJ7o>xul)>Dd{TtOFD+erOq-Vc4neCROI2TA2;ahv89%a-Uv)_=s(SdKe_W_FI zUpWB?j+F~+mncXFhDbPF{9^aZ*)JA+Rzue^DQ!?~C#5PNh9n~k=Hg2lDl&=Vr|cE| zh9<|`qwBz$SKzum^-&deu>%0VrW7Mj-*m}Q;qa80@Rc*_ip6Cf9Mg+}PWH8p?wIFM z7{$DH@d|n#>C?QoGq1m>w{6FCjmWekB1j<8y7$yyBIBKtO?qE#hDz?FEJ`_h#g$9` z!eq*D&i*#CAmnT{Xd#;_(<EJNN!O~(y;iiznH2k6FJ0VUyed~L61I2-5x^-gkN&Ql z@A@=SNSW#L{JKjrwRV8z-@WZth~W#jl!>L&Yv3Bi!lF6UmT<)V{#&<}>tiHuOa<JC zP1*v1IE=dmB&z7WENWT)B)$2jS9;!A^OX8iWzevWx4hL`d2U!QeNNJ`2MookS?b`- zfR5R4jDL;qc-K~};|Wn86&Ys2x+AYP;~~*8>fx;b8ccSG88<m2wj2c9n>>T5fF&y^ zz)tyzWg!uh!Wz$;v1oVo?N`e+ZPlpO4`r8QPe(ZIW|Vb;ew>MQqsSysqb_K**-|}( zx(i;A=ut_sH?EIC^*Vw79DR+^Q-l-eN&8_|XU6$GRU@J6Z&i^9)SE{FeX8uB`|Dg; zWcJ525cH1R@j%3YGP0<q8FI0{!lp9qTq*aR%Dm=x6jI&NaI@XpH?Jr&WuA_^Zp_$L zl~y}C9p(*ihB7QfdC!cx8F|B0K9S+$KTfh9kQbD<|J)bK^iH5n!3o?GpW`VT0uMO_ zX<&uz9oc42;9{mw%yOJp_v;3Vbh+8ZbNDMbOOkX6^5*RmlnddB`mm8v(`o6S^7_=L zl(iCR=*NC>%sjP*@B=;Xu$)wJqN)Z|xL9O0hR*GzqM7QMic({9!U}k5LO<3|n|Yu? z0xh{v7DkJI4Q~W<)<H7oj6W*2F<R+CjZqR#PLYU+0gz@JVA0)4J-GBXCiSl2=&=En zZR*KO*kQ#6sD4*ZD{+WLm))9JRXxA9s`kg2_J;wGo3|<7p1yu4dnpUPnJ5%^p6r43 ztw=vwg<O|OCAE*s<41R0t<-Y9QYzlIg;P6skx*#4)R(F+z6H1DBvEiT|E5#Du`|qL z!CT(eeu%F$jm1hDGfjtCKNs_n%mJ4tb3#*)-SzHczTHP4VxJ~}o8hra;tYg_p&Izl zB@cq}dO%{0q7y~&FpNl^t}&cwmvlJR5tNkNF))XymyCUx8Mz(W;Zt$l(;VC(bi5v} zTb_jL7cY-%5-!slYzT-6jbJb+IIxcI-1g@#?yI63x;Gmf9f%cm(6d)xGloY4`Atv@ z(HLuE;1-*wB)inT>?ZT}k@+SG5P9vVuB`BVj%Nv(@v_>>M>!7g{Ou<_a_4;SHpdvT zF{g3^$>D0k=JGndUHaX6dYa~b-=>O^g(6VM3#4s6DNC6E;bc~oen|uif8>jf^fy*8 zZ<njmp}cyfZOxg``_h8%4NtnKiatZ3D1TS=TXHpUDGmzQTv)y64M_~H%z<C{H_3FN zA<xyW<LIeindyYITZ~ZJ2SK_?lsQRP%_v4_5p8Z1VX(_mBIMnlG)aK5oaeoF>Lg#$ z%VRge;YX386MUkQwS_QEd%5HaxFpdb-pu{f=yCJr{>|A<c-(a1W-+^Y6Qz%-h|x_7 zV%+=m;cRn;VvxIhCHrW(SW$$WZtpCXA6>PG>F&T<Ds|gP<G*v^5G+>RNt;Kl(F2_K zVfODRN#9nsE#)iYk^|_De{sA@-bGplZ!W^{=r^Pw<5P@|2{}P@>gEa`H$<^}${jdf z^6HlRw{QWHBb2_IWKSi4O#as@QoI>3D|qcY`Clpa0jo#Fz;(mI=zJO+Sa1ym%O_;k z-<wBMjzPs&;p#IkWh_0fyq6q$_kIf@T2Js^oo&UlV=qPhN|5kSCK_TMZ(S)+$u37D z)P9}v68n_J?-fhN(9LhPvsV&Z!MY}{PMhamCX5Cgz?XxpNU&p4lNW5ai2#UyjAO7< z{KQ;Sp?ylvVHY4InW0;X9YV>=e=H?DJOdo%j`z5>F7GRdDMk@8{(eTmFAkm-YF?9# z00lE>HQeTz#^PuF&0>rVO01OZZ067a<>;`F+wzdXo-Q8CFGbwui|7QfhnEfK?6^_5 zdKHbsuM2?8hYBJuO+HP(psTyu&$4PqWe7T}4ld4PAkP*4R}x^PG*1p85f>vS^@P=O z2^g19l(3wkoQ^1FR)aQ4GWfHhvSD-DK69qLlKrHCJD}iI>KJy!+Tlo1!*<+Yn_CU& z7&{!vwP=U1dzT8flZD21xVLm6u4#bym1cPK<imrpMDJ{RvX*0dyWR~3eL;1GA{CMv z$F&2`BJC`3MNh8^EVi+p@$Ick<ijM@FkW4b598arVWQ|uHCm{5#|I6&xv_iJnKj^u zWzL4q+dsm*w#w?o*BlXBP|4imZ42K#$6Z@mJiT>JKlr0bI0<S_YoQ|<eQh846lm7> z^i|2B9sbdY?$^uZ86WHJ@IfNR52#UA<q4{9^MUW_0u>9IjSThPZK%b3&&~1|Z2sHd zaIXAzb3Vh?3$NbrPHnrqiMj{rYXWq(N=L>*yHxMsTVyVgNX;nw>U8<b{}v4hba#~A zgj3qxSDSCwv(0+8JAbu<d7&&Z8llbVjTcqFI{W;ZtVYQ?(uGhr5%lsD<ONw64{Xr? zQii#ZuVu%%JTGA~K!2>N0ovhTpQ-THlLb%kZ!*>4nLF<HL<cNCg8$X}kN=RHEMp6F ze%DS;=jmIAl@3yNva{t_0)$xnky=M+CvD@q)IE416$v@VE}i{CDcbrMPatwxy3;xB z2KhavO>E^7lZz0%*i@a*)SYAGo#g|22ccdLKS$S;spA0Goy%IfeknD<9*c}G>*alN zxbt`2i81Z_3bV&<&4ZL6N#92i{_eSkcTZ1!8$ga0nZ}uTZj{5YGBEW6NJmI|W|cJk z4E<1g?p!_kU2jUs8qwEjkjC`T9TnX}A~b)xx;OF1^zG@-_#?z$;0tsgzui+!tB>Gg zvs09GjEHBO7|Lf?rJTO`8Y{lkM5fy9$;CQT%4p(+e&^J(lSOEER+IO4ZqHB>3>zGA zV#ate3h#<T(QNW+A1<?(N`gvW-Ilo0?N*AKs^t#`m$7k~SWu?4KAqru4FfWquFx*c z`DgNFj156U{NrpJQbe5rQb(O9`l$NGFZL6<c(*jaG|I8F;gNDHsGeNQrp*KuPGVdK zN(gab0f}^s?3}MuT%uu)u0nVsz-i}yQBjIO+LVQ#1#A8`QV1+q5%JP`{P<$lNA5ie zotPPCcyDL(<ep9uyAap}bL9rQ62Ws2M<njp`fAb^3cj{W4&+Z;;({3^7W%O)nj_x0 z#2qw&N%pM|5o^uLA;58h;01sWF?u30azO-wXSmLWRExQ*KOF>jN8_bcGYdR<b;%vQ zeLH=SfoC3$6#AhSVuCS2zAgNmi`JQ_I-hQ0nmyJa%!&Gp7i02H@JWuAtgIcso2--f zU?n{l&YF5RDP7oua$!t%4Jn!6^Y!xKPTEme?ejG;7^BxIYu6z}P}wdt?GB;5=`C5* z77sYqwUtwl%t!`nv@Wi9^}L1xN(J;0>8bjr+<gq^y<`AMt~le;5;BHYsWe?N{j1DU z)&ci&(skK(5Df;_vmD%SNP@gwj4)+<|J8Q$EteDOeM8h*7LY_|fnQxJqc)k1scScs z2C#TR-?iB4S`=alKbH%|g&7W_%i;U53f&*sa9PTQE1Fn#GS-u<RSd0IDvQ(v6IDSw z+&nec!m@|x4#tY{8L%8JqzUH3jdCUKp@Z0sY7pIAL(t!7YtBq^4Xo^{7}Z^%S=D5x zba<$|_b*ru+aFo794;fG<=Xb~o+?`rxFTH9OVy65S97?d=8{9i%boaUp>hw0g~~OJ zztmYS0Z3Ye%iy_^5Ql|0BuWm~NR(WIpS&nJZ2K(vgTxCRE+eAk+V=6DDoPQ!B1+NA z5m9noE-gw?a>Er%R5Zku*r*8bkbFh$BQcBG{p6)BLb}hqKZwvpD2>Qo)TKX*sUkQ4 zwMgPXn-PJGdLAN|{@6<nS&9fsG{XiJZp?g#)8P1eu)9+rWKvK6fA-$CyR9Qf7yX`J z!OYbe%hPsudS=d9_qsdok!3m2wBN>(lj*jyv}kF|W}7B;NXm)Ell$B6^8odNdfVKT z<RpD=m=%lMy9$Lu0Vos-g|hS0Ml~;HlCmGSh6BVtqvm~vyO7u=#aw?SZX~*N5)V-? z1{NG^o|<5ojVe}mN(VqF>$`bv=xa>dVq|#s1piAJLg=v~4du=M@75^XT}jTFAh| zfO+?>u|3Lt+ih$<gE1;+3WE1Z`852jabbLEIV?P_aZh-euta!jhdVs14rO@T4L>az z>J-!rZ~Upq5A%s$5A#upNykGiDHGI-^*LP80cN}1>-Dk)gEu0$x*i%~$yZWwF~)V4 zEg9h8VP1<4m!92P)WAk_jV{$`fY7R?bp`-5@!`a*$<ni8uuN$r9F7MKxT^dbk%sEn zVsCKc)v2S2CN#c9h_AlOk|7W;eg^v9zRUb=tQr?Z{Ke0jj+W^MV|Y-Uj|eD&j^E;F zR)r%BX<&_)wQ~abXh*2zk!lrz9NHwsN$1L$v<BDYRd0xWa<BvWsI1mtsJvj4v%qno zEGW~>P7y;&GA*yidI6{-`L%ek0QRbhbkkQIc`<$q{3EkCx1ev_$vjxsT-VJk{2OxY zQXZ-*ZIFdpL)sa=oIi%?JISuzQg%&#G@34slgm}7GrUn|?s;vhuavTLe)+mK`In^< zE1-N`Bb+G}_^qmIOC`v(ueq)Y7G}(N&%qv&A$B=m$h`wr$_;jFCV}tD8Gvh*biPVw zf-?NChIEkbO#fUtJ^z<TvGhewH}-A_^DB`WIBi6&1`J#~0J1e+M*5Z9Z|z2dNVam8 zeIhDdroV~c_~cvOxxTn}PmZ#w(Q#+=4}bjA`P*|O8bHMVqLaL9C#&NXl6EnF*za%u z;b?X=bB@zj_`a%NSjma|A8>i+hw%a#)|ho}yJ4>D<zFcJ4|fC{Em)ar^6Gry?+S~> zt80>K{c6b)plX$Hdlfr^(-*7BiAlzC+XYdMKKk?0IkJBB5qtNC(U01}ntHl!b2XT@ zYq4>w^{Qk_R@)YaVqepXRXDYRCAdU^UY809Fxyt>zSmAX>s`gVrm-y~B|@@hyDruV zFw@p8V*ME=z*|nbRRxqm%5LrK!a*FH@5;I4Y?W=j6L&^ZujQj??*KO31O1D39AbK2 zJxA?R3MFWV<*XgArsq^QsK-;>jc|I2R(Q@88B?;At!tq77#ocy@8wVeHV-gueSmE| zUp$;F^1O<iS>nvD$eqmJpW{}B#m>cQ&I{DLg`)<wvgXYj*Iw0TEqJ387<#ztzJA?J z&#B5mX8%a>$4TER+&B{uU4EqR5j5t^*2N(#U7tGnCQelR#ZM$vcY?$t%)jN4G<bjG z>G=q!?EL%QPGIfj@ip_GwrN{k>dG|6F=(rI@53MXemtH0m!^ix(ad0`{nC?(GAFu` zR8&oe4!XsM$w{{hFV&Jq7_pXcJg7x8_>pDgtev~WLB7|xK<s;GPA|H%DM*VXFTmx) z1l)D^K2A(X%gDS;1ggeANwv{H3aA&MH4J1A2INIH?J+1>PD~Y&hJZ5IvNcaDCC>xu z$5;53rmh0GL4GA<I4+MR<^A%QSFEUY#Fnr?K7Tu2-22_{knX+WH`th_xFFGS3VSOz zJt(JwemJ$`jbP4L7K>nL^F_u=#DSe~S&Xt4ZcF@J)gWfYtsoVWGT0B#TIumaQNe{^ zBYPXg$zZqevqeqTt`13wC^SL@*9VU<J?FP>|6!R_==p@7`cp66=?tUmWKvOlI;{mT z3(#}wv;2!Rn8mL)tp9q%OMxm8i)7EZKvtKSk*K1`cr9v?^1&Svk|mpppt)0PX~&z= z!A`Whz_(>L__W>(E+UPcXp-2JA(id<+6s}=_T#Vk%}0(@d#>Z6g-dHKwZZfkb~F4w zOLNmGG01F%wT4%&MRZd}&q1k56D;D|T~tcrbPM^Rax<fsesDu#v*m2%SB{42k*alG zGoV!o<(6K-X}yg&3Cw|{a+;-E)@>2YQl?atKBDcQ;)LSKJFBvvoncD;8z$#WII@`| zim9cZX)QQ|06eEDg(Cv!pFB`KA0i9-pKGv1_&5sAkm6Ussa%>Chmv*TulUUij)3bI z6lGJ`Zd*`Y?qIA;NilPMa(hQ@{j<Y-uVE478h7iZwQ}<W4hJ9Wo}&<>*_{g5jd`G& z3zg32KIJSgGIuPOAuOGS1ySIT*~Y|wEQ^Fw=-X8{TQYke&$kwS2rtQ@7@L;l&mXmS z90q(m)k8U1*4+Bxw0nK=#$G;PvxcbWD^#&YhH!k@@#bR5ZA_Ilkb;*Nu;Bjq#qt(B zikh16<zjj(-yql=#NlK$?XCfbhe;oCg|NCh5Xscn?a8^+t3z3IbfCTT!3-M6aC%*+ ztI7HD+1cS+_=+#DjvL2sI_<78V3^BH^51x(`|3D}&-3cl-^+1vIaU4$s_yE5!0%V9 ze1Li6{kW*>_BTo~GB$UiYG2(Fa(n{`gB}s5*Rq?Q-MhEDv-|bl@i%)f4)&itm1WI2 z6wJ&P^viIwsznxogIJ1M3G1PATM6lGJk;a;hkUOyplV1#z?*VLX`-Av^nWTo5iRE? ze9elWFHmrKGM>%!MiceoMXUP2yn^o|n>dKAcNsjMpS;U!`~J#1>6<UTkCdw9^HYnL z@wSBbQmgx+JGnq+H?q%?Tl&u181dXQCA5Gi<z7(v+Ei4)?D^{AwE)e~IPlK}%C!3c zft0;-B_MYf9`m6yyOc@J^DC>+9|D&c1V6Q$!$HMaMSshz66cn>!Nw{uGPLP40PMd( zg~g*MAus=Gi|;ou7mL=Fye%Wqps59W8kD3+Ky~?c{Cge+Lz+{zW~5Ih#<v)7S!35z zUB;bV=(_3Y)A<UiE!_1yE}LrsH%fI2Us8|_N3+yV`thkkDVHPzEG-92mn&L6tXS3> zQi)KywMHSDjrGQs752y`d`ezj#{T-GA*b-kilY&Z5md0@O~Fc5<4fY{z3HB4pTNG! zQ}s;F&L(g4h?#wv8_wi}u>GDC%uCWhtFMRSsIv?qeh!eQlSRniC@QgF?V%8B6jNWR zML1G8;)6@6ERB_%?iS00wjPiflR#UJp?Pj?&oEGq-TiPsnjjzr-pw=omEp%_uo08n z!D$F{IV@{(dM6xJ3tBSWr0lHYBHj(Qod87-OZN5$I}3EQ4PEQWUT|2!v4>v+1NHkE zH4`y(CV|2*C9Lp!A<<e^{I4a|wJEG6#8o<qveeF=OecP8gq?0KBt*sWBKvB!7WJxy z4Y49QbH2k`Y6WdKJ{M*amP#Hq2Qw+v!Ye6M#ph=n-pm$ijVyMa-!;{&AEx2EU(Y$8 zX3i0&jD5!!RR4ZEOMd@$bnAECLi;UCnYFA{nP)OrdoWkmm(tl+0iV{mhK6dY(@Unn z(gHUun11ApP1+hgUZmQZBX4N%{P>_5kC<6b_(!@Dh`W`-2a$Y!FvEslGY7!nxsN>I zn93tz@EWum$?DMczK6FFl@j^!cf5r`mJGke0;!iVJt|jc%+MC7yv@YYm=x8)TOs5Y zFKzVuI-%yPTYO9>%nS}0dy6bd>fA3yX`{93#Xjh|lir=sZtmOB`+UX8N_0i6LQ9be zqMG(HME3n8B4pN6Ezt=}u{H7&$~_Nzvsh>02ff0!9U2I}aG?VI3rv0fYfJn1_hx7! z<=lkg%UGwLCu(@-Df{DR5)<~>XD%pAc1I^ZD(p+dgndSqS)PwiI-kt;XvbwTJbDo? zg80K{pJ62$<EUV|vEm=nr_O55o?grlnDp)spTY7QPe-ynHZq`hryau87N32T#fY_W z5P@bFucLoTkCkX51y1i|J?(OSpWpE@>~oj_7bmN55or=vcRO1bd)3K|g&s86q}G-W zP2S=Oy8|1xvF@hP3wVxxeg%`Fq+Ov<`h^44OucN*Zk`p;Km-$+=-+fO>ab#k0?Ln{ z-83t?)X9<CJliR2G}#5>7qj6vm?i~PUF7-&luM(pUC)^hR-WGHU9g^Hpwvn^16Y<z z5y_Kd`s*Jxon@U7$4OdIa$@=<j+x_J0mgC$#X6@#m!<d#*QSp$q!Szg1W-qd7y zzzfx+fk4!cIxt}K6l{X{CuckH#jD0DSdt1LrAJzDSCf~`7t15}wL4|_c3KJ>ZgLpo z<nky#;`fKogyndo@vXRU?@kaPwpiU|)b5B!ACap<Hw`p}d5O_y<jsa^ZHR|=8r21Z zx+Z4G*i<mikikhwHgOJ~T&S>VP;a<)Ca~Uo-!`D!E?BQ7?u}|n*g8U;Z2sH~EUXz| zQC=n+KtmuWJWx+Ek)E=>DWJ6=;32S;$cZ@IZ{VE-{SJq%?Aro*>ZJ`n#G8Uyg!nVe zVmR<z>RYHM;lzW%ZxYn&cW=T@1@+0Go;ae{1*JGASt76d{a*9v0w-!22Nr6Od&(N# z%<uso9LV0ag&3!$MPN6mP?O5u>Zv&XdcfVyY!HWDvgx3ea`1~j;O<r%7q6%G1c^28 zq+2;Jd#ldQgm-xJ<(gCPdPv5BR89`T^ff+>FRhsnp4Rktc$sM4@YJf#@UW`;!rMe; zg{N-YIMp)YZJ{k1Yp~Q1p-G!QQ6<A=k~4iR#ie**i<rVSYlD?)&x@8gRxHfF#Y-JK zzP1L0ZMtF$NYj<)1$3;XjZsL1?SrCtjSbjV?Ril-VH4I$9u&nb|FE?ET@<eJm0(so zFJ4qn7?0JG2SxEJN3vS=MNz$ASyn9`YBgN}S*zDAZ~WxvG-X}AxQ+ZcHOiVvw1U+8 zsI|dO>7uD78m+ZhdLbk{6>FDdR<dj_^R+Lqe_YAzA${<6f2#*=!D~{qx(>+nHBfrO zXuwuzUrNR((9K45F4MtG6XvWN*gY{%24Z4$$0xw$aYfe*#H=<MS*ED4eoC{{h+0Rr zr1Ve}OPx57hDmGLx~1f-mp-tM)pTvg{p<Qg9Vw@^74Sezm8QEke|o;KC=pJI55%;h z^fyA$EgjYp^PyR}4MeS+VLl0FFKbiMKoqO<+(zP}16>-=>jY=d9y1?^ZDkhSgrbAi zq9s?tr&|Wv55%}<0w0LE<Ii>E+|Bb~4MebMCS1$4i47U(+0nm^&nI*MN+j+XcX1Bk zIXpP;P9|p)99sPzTPwi~ckaM^(q49}q*5h;V)7p5wrzvzjybFTaJ?-8x5MOpu&oT; z(PN69!}mG*H}QRn7gV>F5?rx4y+Rmf!x8!?Z<7@MeF^SYDRtzMeWcOuv!{o9|9N<P z_~PXrY``yG|GvM_;n#mTe(>_}_~|oS=Zm$K0NaK7+6Mo-e3&=T1NqU;;{%8E7kwB= zxrlaBZGF80bFH7FUTdTW_XqojPj(LetR(;a?;X`e0%VsEVbSmxWgCRp#Aoscq>X+v zfskK1_<8KCUD1;xa1wDmz33XNQh5hFw2*>SMdO2VU9%zg?+H$~uexmun!AHQSyawP zRXnihb;JX@ue1qn7PsCYXB09Z%j<22wPM88reAhQ$an!Y!CX~x9q~ilXep|$f^pJ> z>!;#s1;uS=J1VVdYxVZ>TCG7KhPU@<JY8O+bHc<Mwswu)smu&-?<xEro6u6S22}VW zaPq8sLr#{>?UH>>P@of%#>ws&M%~i#HYKjIO~KHP+x}nY`_UHv(MgKuKBqQnBnzG5 ziBjp(+EuW&@ww~O=pX-aw9PuV!x_Rl5}Yg6Vc@y`6XMVij6erDzx+uF(G-^y2bGXd zMTxc$1uQ5Bn-GFos#wR1&UFntEE!^?jadKYPPHt!Mqdl#VIL={DLDkPXNb^|8qtip zxs7LWDY!*2EP6(1%xhsiy2oQO4a1=9xa~b&Tyj53-6YN&_gg~Ax;%4w_7|-!v|Ww5 z3l1v^;_lCnR&Wch?5XuLgr~I@sWZ!r|5cJ{0F0pcQ4xjm6W_N|2KInG8Nry=Vrw}o zV}hegN=t0?>b(R?OAC2Sk+_&?^4LNWu+LGkx|&*ArU4Qrgo0C3W_59X;DK|PFe(HE zaz00hl0hjP58x@O)aBi%O$_p)2tKdF{H_|mxrKZzvz08QB)La2+HF{fGDh3x+!Lw7 zk5DFo*_a@;I0n5ow0iErc0~1#ujK!_xX&6huEpI=S00rAi#5<{GP|hU9Tg{OUskPw zoZS0?q8N3rH*<dTAPmnB?er!XMxn4{!dT9U9Kf4M*74Jbatlu#*Sxf_f5~tW9PTpC z!sUI(`M2E@zAfp^r#{p-5E(J2lRRXX1^FS?F3pVT|LxKJdd5YqM4kk5hp42roCLLD zr>Jc!Qw=Wran!*o?;(xr=4Obr8VefMchJ*j6NOY0vVOf(tI;NAFQ>%4JQrOQSxnT{ zW=%D<m!}W;#+wn_eQoz5O=wX71B#U%P$2&%0@*IrCrB3WtwN?%O0Nf*E%b}4$AN$A zqH9a!n!6;*tF6Da#M%NfBHr%da;?Z)ka55tLk}osJk*sddKz-uw{dbn=E6b?^r2Iq z&MXpZHH0mkQ*#r%8%o21Uq76$;r~JSyRDReZv&~nsXx7zx!@VNmQyQjF8wudl8%*} z&xn4jjSONvN~tC=4ZDifo7;Q%9T?3FyBpPO#<V+!^}jFYvx9CiVK&0?Yu>BLMc9jO zb+MSy75(jGI^BIcp1pBz4tWV>EEpD@I^Db<pJyvJeGVpmJ2_j$Wn1q3juFIk&W{ck z+za?p?{g6l9~mLw4<$ d2IF@CYtX`TZky=-@$BFZ#Ys?J+`B^0a#oV|Y2r``d7> z>!yk_edd-$)XZ`@COs$ycDH!#fe-cOKkSw#i^(~&Ce~p{@9S;jMCeJQ<v;b|EcJGl z2df3Hm94iLJQlehdTaTX=>m{T0ioRwE?o6wU*X_zXZO$8RoL0xJASfvxbtx5aOe2X zdw;<YB6Gy}<ehZM9Yt%_+&MTtIDE1H^s62iz7GzTCBH7rr6sJ_NT`&C*~Xpqn=9!U z5G6zF6AUn7NH$>1kcDNkw18|(zOMZC==mtRjC2jBylWQJ@)$&Y>reC)h_G~tUQtod zVp;i8f9<gj#r%V!c-9|Q$R24G)t7d3oZdWajZ5ymKS%B%?EXpl?VxoSDCJUBwBi)B zqrfbvBpjW}(rC*oN0Qw5a)|2X0xp*ck#-Lx89d!(NQy!Ql$4MMp@dmO{|H?kFc)ut zcFd+8NK_^K2W<3?yW~JyNg=3>lAw_m;G6*?##jNaZ<ZHyr1DKw2|E&55Kp2}Egw~= zp!x!^x0B`F`-xU;0^Kdxcqsf9t8dO}Va`G)-6#wSd65CJ>|G(6!1K~0U9)PrMLU7) zYxT8|$(l3}^mYq+R>{J*0-D9H{|$ygO@HRHgrk}B)6RPvS*x+X;@Bl___6G(TaIsT zeFq8AC*??+mqM!iw<n!>o^?88v}&@81mh(g{=Z(~2x(~teJ6$Tu_x-@j)KrhnPNa< zZ%vA%Fy|maR6g0*R7&Mrh`y4;K$8dlMW9Pwz`sDjoKU7{_9~=sy6y&naNUg_8tZdJ z>nK=Gr=4c}_sO99U2wB5P=VPPK+VFhgQA`eE~z>;oLEAUD?_QRCQ4wH4GtRL)qM>^ z#`>DZb?0Z;2eI~@o9|;cf)!UArTEfPJv^;ZF&B6r(jVwXODQ(5MCba!6|AAbDz)cj zWs9cNvJZ;lHT+qt_FOABm8Kc~ly5Uz8#67f6=flrwPZx3&PT0T7!*0RZUTwNl~wmZ zblM})M65@yOZp^*hvHO@^UWah^3wzcUw7i5YvTFa^XKCQ(rO<)h23$4C{bhzkQZM+ zKR|xSqeColu@(Dx{$_HLy@6}th)#|4bpGCKd9mn_4sZ4pX8ri}WI9=0>MkasV@ZgW zdc#k^0x9Ra@GKtaa8*@?^7(^!)N9TclQ+yYp_o!hY+m;%7Caxi9teg=bu3Q0#cB-S ziVr)>IM!-c5<yO|xDMZuD9+KA?MVJCB8WEz8LVl2!wsDp2}`9Fe-(PpHqWB=ce8NB z%T|d`i;4kVmJdI)m<nTVDnc2OV#-${>HI09@KML2(1m#~n}DAg-VxA&&03&Ks;mVb zsj*oTvECZ;?0ObZ_=Y`tsZ>z^6X=_r1^izPJ#_TwVs^qync5|AmgnvKw7<;L?)&35 z1n4+Kg&GJ>?FDTp8jc*5D!+Jn$`SOZ%Y40aLTAc+lcEP5Z+ywC9Egh$8AZPypW{&N zo_EruIFK2UYJ%yhW~=aJhpEz4Rgth^d9MBt+=b~be^6NE>mh+dl6@!x@P7P5?vPGX zQDCeu#B2Q2U)ST~ft*NVNw!>#p1s)rYX9lZ<KvwdUmfop!h?yBX+|pF^0Ea$6@R5$ z5KA{dmSb{f<k?A`i9d>$J5|=Il=CI|qMI*Hy9IgVB_>LO30>LtK%uP6dzQuZ6h3_2 zXAL<zIGMv8j~tWu!*#u0nw3f6)_CzowrX>T;^;!tI8>w(&&kZ}>apJK(I0WSU$$ND zeFY&ZjTKcd@f(ugE|>5LUJy12ox~FniPvyB;~iebz&2KlTefUkB8N0s0zY#ch^Npf z0P6{Nk-`9itDPWPAv8onhtL9Qwy(WO5hgJsv52()&;hVf_)5gb27R&tMf2|c)m(Q3 zpl69A5_T)?Zso-AIHUwYHlOPv8wZt5Bm=8KGf4}v^x)B1$4cySclt~=yEugltE-0= z+A86IyZ0qfG2`XWg(e=v-TRZ}E<kdNY#V7|FL8NN5lJuvCjuyyLJ+gq9?S{fV5L0s z!%}u5OM%9@`bWRZs$S9GyN8f?sC?!i-k~fjM7Zm$6yhf-*}(daUg>6#7|YBf*OQ$B zs_I$bk==h11-1ve$Z`99&dXb^wi_=P{?~?n_kI<e)p(I>-M}-`cRmIn5w?`QcCPVV zo#I}@?}GZOZ&%pldyORUWIWWVq8EI5lsY$?HKvht`Y8E?d{B1AcLZJ!Oh4S~B!V)9 z_*eNX;-;;R{6Id}lNj!)a$c>aqyaPI7?u}hk%4b0^EIOBUnfIld#IWfWKWvI@3atv zcE^sBN`^8@|8S@U8AN7#=zv7aQ}RAID^vy~zPhO)c^}N&pKw58H@2DC!u60!dja~} zC!C`zLu89weSo5YzWE@<x|oQ9p)Z3JU)|Io#Rh)DL5khLJQ8|%_r8Q}U`*_@#xU6; zS05&<vNj(dF3oUHVfVcZ34h(xU;yS%I10pkoBfD{&-GP6sHLW?Q%dym2=s)_CUYge z#*|7<Y3kbHkMJqoVbSV=dL7%i2DI9LsHT$zRYXIEN}gq7#aY2c5OaDb%4!A|rn;ZD z?S{Sp6PtC3sLV0;3A>0O4N0Mi+%L7`R@pMZv5++pm|p%Vw346u^a77)FQs-6Q5B<S z+*r2Yxm$^N%Re`Q1oOO6o+XQIvIsww0KjO`#BU_$=Se^EHXRuQgT$sH6ax5WjCizD z9DRj3D95^DK`uDNR(w8RPH0u+%fCpd+OWjv_%J#-l42_uB=Yy9$nSo~>*W>40BH37 z0?vTf-H4fB0(Y=DKi+UiR<wK(yUt%(_ahT=UE%3s8AmD=L@@@YFdbP7ksxHtNhD@$ zI<;0%ELl;HPfvx`<EdrQv<SUEo_Xz?I38Zc2CTXx`}Uo&z$gGSQ1;Em6g#@8BtkK9 ziiebOpR{{CR6t6gLZk&tYFsWEAa^|>J-nAFyJ*IIh36?h7K=SXW--#vHCryfQ$$z= zy%R6aXhyZ5y@TqUk5+HH5w7%>5s@E((MNC-W1+U>)At1jZjFN`4`^i5XNiTW^h)jV zy0@!NQ0aOyvAik?CXYy*?+66b4krgka9M9FmG9nvjZK*||KnnYq~GuOEA*;ZWU~2Y ztaVUVUaD$>E**$145wRG@rtxlC_%KuA#&3MVjKKy;$1RCA5Ice>5AmoswkpQLX)T% z<2T47A`+*F$*bvpUe!%)<n*Kw+B=X+I@#&>oZw&Rs3{`qPcN~)jnhP}YtPQkPy_^a zMoOt_Mt4Upl>|qyp|}E4L3t}+$W9`fh2m=C^qb#AO%W*+RedBxXwz!_0;62?QpBJj ziW;~-Qi$^#OlYcmiXt@>Ng_whwC{Bnt?5w^!j|2|5y<eaE5%4KR`E7bf=&%}@E;-~ zrlX5<Fwk`Lc8<)qBVoJK?reN9U4bo;_G5`tbgRi!CI%WJqc_+Go^kq+X)4SL=o;MH zIG8m0;txEa^v4mlL*l##FJFQY;#5)UH^0e8s?KwNTgzMQdR^nB<RSdZrO#|2OncFy zE?Ah&3`o~-D}WdUsLK&Abeyk7Z;|?4$$iVXln6ORHQH*_i2+UkjblcCGYbd;z?gpD zv7OO;HoXkvJD0NoxNIWWmer9CV@Xg#sE7j1#b*vo>3?R0p$4hru5ZX(>{!4_49kbg zd-66nONkPaXbN+>>J6t`qXT|su6KZyhK%hFs9O+JjddB?@hB0Xe302pI?#NQ^-Ii_ zUAM8h<M%VSUm>XVm5skHfu&+b76Fm{9M8Yp80BtmN=h3y9<g(GtfZ0~mB}XREW@i* zWwF&B6?QXcl+utNx20T$0UbS%z@KO5M|y%33yyYK;jM7q$?tobP4fL2=5n5j>J}tF zhv7xHoKJDBkb~;ujku}(0Etw(v1}q$-g?dmTi*S}U0cxU3d_5WVLTjbBz_ve^kRbB zUKX-d`;{g`)BB_vF-tu?Q<ah*c$)N)f-Id!xY*#Jp4KpTw;?y8e|l<AJN3L)IZ(E> zzAMMRk?4Okqf>QKh4H}hDX<!t0|Qn`J}2XX34z;icSfPShAz=L6<Zeae++tE6e!ko zxOQ^doxygLz=@M?em3&#%MIqh726UGrG<5gDTlb-Q$z;69S%cEmq3Vz^DJ>`ZbAFP z5r49VpJtpUb5x>Y^Fm>$y)C<c*tANNX4EuWY@Xzj8I}Z<Nr+Eu-_10=CH?5HB1KFc zol0fAEXm8@h$k0xV9(yj2<MiO*NS@AOb=h)y^l~Z>XpD6+8^In+EN@kJ~dcIst{k> zeT#IA3PMVobA(l0KI&E{Z%6<A-+t_J&Wbe-#66$XQ+^8Q(8^%UWZ38?JAUrB(BVY$ zm1E?WMYJ&2+RS2^q|G0e5`yGrr0A*Aq=g@)Ymh>ky>VK6O8&cPC5pJQ!2ARCXk^nc z>su%Tw5v<y0V_e9q)t&`t*CXczNxqZs+N}_rK+jjXhy3mw&T^%L=v2YhT&0!XvYeo z_Cpz|WHf(8Z8lVow;tE%+|N@4MWZ@<p5X%l5d}kSHO5&ddw*Y4MVkxo%~*(Ha&wzy z>4E`wr*j5%tNrwF@?pXl?gy8D?G|%6gy4*{U_{~~PDc72J)HZP@$ibAmKPW9gPXGc z+<PRyTFfupdHB?XwNdLyJM!X4deajED(@do-is=)qCksP!R#adS5Fbdw!gtC^j1LY zj=YCe+%Dq9Z+!`GB=5|SY`4{-2j>ev^VW8SPND4Xd<<_055_mas(lU>(Jr$Kzslpu zyB;XJaH#au=lXBWm<aP7T%1ezcN^5+50h0713X$AXS^Rw#U3z^kyf_nb&RKIBl@&A zR@qPgYlxzgE6Lw(s4@Y!3m<m4-jfM)TkPP?=V}T1EUPaLR_|9w510<6PBnSI3$NR< z@4buS>?!ha-t%(r<Za*UNApEbWxVZhHE2(X{j<K8yb87Z`tZr)Hho^mk=Y&~I+A?_ z;MMHKQL+K_061J+?v4SXjpWN2JnKCWzI}_+YSs6TCNqRq*B~D*;3(w5q}t1GFaaTG z{s{BZ3@Zlrv!~?FYpnFgCtlq+U&DiLwd!!^=NSVsF{9yta`?J)IzGos^GI0HwJ`ud zgta%j@RP=xdgzj?mY)bHP(7GmEKWL}z#}1cma8Mg9wQ&`n@c&#bvTdhufaKmBoMpP zBllNdrVzr_443;eX6nx<Cv=LfhlKMlT;gr0u@5kV{J=Vr)PT}hJ9>CI8^52N2$%9f zfVUx>;5l~2%#FZ$b|DMNH8}CG<`Mr<M^Z}7@bU$=v2v=2W#m?CnCOl1<j7_VJX^Hh zQ^{gVUy2|;p3l!41x3!k#pc_~nfQX^$&*$Es%LLQFZ&AV^w(R&&2P9qt`Cr(1^dcS zDQbqIuW%W3hYO`snzJsI2aQ_Qu(3u1?!$Q?9{Q_0lZ~Q#KXfM-l#0FPh^a+6{eFD8 zd;vt?zXpz{d|1I#%EE+M(m7HyRxK+?VYn?}s4f^i{^w540`-A5rDdU_g3(3=<#oGo zP-%aJ&JWu<=)T;(_hrH-1WNXh=70wPl{y>Xg<2bwUWc{JfC{gHDrP!ZWS2BWpU)9_ z(&BL%qwF#5Hx6Kf$9%DY+`B&m<IKPJwHiS8XQI1RRQt>HycMZxzIQfL`@QRbv%r$4 z-6p~nYiP7TgAp-VH6eY#e#9vh1xKt==<$SdgkVOTsWWRoD{;0+1IiPcPi#dGsqQQ? zbAZ*3%0dt3r{3tc4VDFiLaJzwtaJ;*5a8XzbIKP3IqoTDnb_q<vtHPBVcaN`HCXAR z+Q4yv)zgQUGcnm&BB=aEyM9&EiyR6aj^AiXKT+U1#MBohSePI@X`hH9+#ad<>W12t zb(7SZQu}bXoI)l#+$lZ#Fn`ybx_W(}wS|<NaI75R|8HP<LkAV_;LqV}{MnyjTAe@? zPa6ApS`6l_IO9+C=L4jDK=MmjNBVvWI2f-NueA(#qGBF8aG>>(l01bH%}toXpfNS5 z^IcUoBfZ|hMeR<@2IFw)ql=sHeU;_Wfh0oQe}B$kW$N_7b;OumQ-zjQ>{b)Bn4YKI zsTWSafN56nbHD)DVGdrmX&Yf34aP$^F^=@l)oO)Ni|seNea*5oij@c3Y!#YV&qQTW ze?D-12Lkj#IH^GULFcJMv<(TNb{ax9t*_&Az1jm>i$&^MAijt2xnlxP#^=e8M$HSX ze~#RIgB1o8)A;mTXs|9mTeFHAcqrebS4hW_bHb5&)#r=L_)UxpIuBW(w+eEq?7cr< zT}q8sX&)|Afn-*`wYM(dCWKY=HRIQOW#I=GlWDPzmA)5s%r@i@eD;yg?M)}KBbDOf z3vLjFYizy(uVB}<Qu(WHMmrDTDbE+UEw7yXqytiFa&mNtYcr;pZTYaaq;D2R`>n<^ zuwr~*a^0|ay@7th@hvohtU8E!rO79gAG*`VyQdxebgg&T&2GGU_L{Dv-j~#G^NW?N zNg4%dUeFKLc&&!v+Lw>u8H7kyI<DvW8vqWGsk8N}PDhr;-q>rb1&f>?d?(39a?htT zl*0R$2uRH)A$j+52BU}Hv>#DdIt}OgC$<OeUoGZZGY<g4Z0fz7Azk$;&h+a-f|nL+ z#WS~1bBSTk5KYUAi5zC-TQFI*;`)pv$Bevf)vdSp-V0iW$NO&KQ*UQ)&gb=9+Y7Sy z(h)1Gvz$)6gl2EBv_$Z5hV$$3vio2EdaNlvvv(3kojse({Pj#Um_rNxx`n*-@;I2F zwyY0vOJLLzxGa&Zakg@MlK}#%BT8<(SS^pghdgGD;_Yfaoqu19Ee_4QMeYfwl@YA) z<8Ss}9PB@Pdc6Noq3D}~XD@Ig=F2C0FZOrSKs=f#5)9-P5k6f^8g4c|WwfsgwHy80 z2b^6>SYH+s^+>!$aQ8=}fl*d#8|X2N>n-&JENP^|+9q9}aEBH#ERu@5u24AndM&u2 zPWpOlC+XrO7*3^&e-JXk8g9AM>sXxoL<y~G18JcKakCBCgBsM2)Xb;@gq}=HkwJjV z)o~s8va*UE)Bu(?Zp~i@d>-Bpq^UK}y>Qh*htPi5F23ZzMsz_|aYfWyLMK|Di$O%< z@VZc7mM>(GL+j1KK>#^fhufL!IInDxfn-^`V^(kKbp1x#pk57GS=BLsYi_`rY!DJb zrI<BOP*a}G>R1G|(pPohP{{P<%*%Rf5*Ql{&_R8Bjp&;?u=DwJic~eyDy?U3^|`r9 zy_k}JZ6NN$o7s_#EWhRCJp2P&QS;>0cdx#ycc~jMrk97^;yrC<Y=EgJf=)P?SA)nk z=89PJBxqw<6naQ8nzi)E?8FRh%lD?<mx~!rk1dwtsV;tYxnIAOnV7cXpw6@hh0e&y z$z&z={q@1EAdD+juvAmaoux}7d2K{bk;UO;^$@a7!27c&2=t%02$O5lKt$JB1J}kA z+coe6bWbLT+MB)6U5IM~?S3$$q|khhbTx+`KYRB4_+a<h^S$H!!@U<fhp?Cr5KQ|o zwZdQRJw=hn`+wa#-g$)5u?lMB*P@ekaK4wb)N|~L;~Edx`^eMx<^2&~Z8KfP?P5|J zW83m_*`0Fov)LhFVXCpM;-$duj0og@0i-U(j0}s6Ivm;wgx@>7vBE!jhtB#W2@SN8 zvjvj*u|(2>#fk%5nf2ERwNJk8Wt~Y{>Kzm<H4<Z)eYF&SFB@)4_Xr0xGT^1sDjP`@ zR94?3$2{b1rQ<5qZ@#t1j>;7kPv`o*20x$TJdWSBFLw-jPZQnoYc`yt^?>KdGc|OX zg8VcCmn3&$ZobyC!JNu$6%i;{7)Vk4MRrlh2lW}OShyIGpe*@)XH=T-%+8c=dI4^* zv;jMOM}6b(_VhOAVvX@EFzSY`fULjL9;o@M*z5ON8dLT&*sTcjw?FTU)|#I<?zzs? zBtNXT1<5MwOPLYxv*^sI_Z6$r!&-UnXqvO={KZwn46|10s(lqMQ0UP;%`%DV2&MW| zg~u&5GyK!0wcrc1Cw*VS&fVczWeWE1l9{w|ys=bKJeE>E)wz|%hdZ;<<F6rvp4SB^ z*BTUCY}&hNOp8PH7oiL-Ti_CwHZ8qI=xYnrz)}}#-QX@UolBJ=3#LyBh^1y^rSfS} zF{(^KCn(UOV9o6yZB+DZQ5mh&wWw>f{;~i=A~=ofNMhXwhJJ~LWgE$Z0`6M%N)T%c z6<~)bTS6XEt^gjmu21<2dA--KuV4Y*F0%>6{w@j+)7FB_1`BR8o_PaR1z&?-Em+{+ zGb0da&+E0Il8K`REGbZc>ziQ+t?zvSES-v2J$+JCXwFis+k9DoY0qVZ(|%h3vQr+b z+TUg2%3LUwD$k3`$z;h|$pcfo&Kt5)Lp8t3A}gQi;TI$&(PN(Vnz{sHqCj2o2&DXk zWdvmkNoJt<JFg?sRBuz-c!d>^+nVzEYx!KV_GMYI2`V1CjNf`Y=1J0!CV8!NRe*L! zMy~5+tGu<1>TDF3Yn&5&uFv|q3}<cJg#x-L_m>4qO=dv&FrS>t%I>4C@6eFzO1_wv zRpv1&>ej7Zs=S1WE53l?=yRuz%itOQdgOiAxUA;x@-_=;5v*pIZNO>a+lsNiBERs4 zfZmnq`C`tqsRX$6y_cqI#(A>zcTL_wmLSC{ZM8)`mt)MkA(23^%%vHbSWqz;y7)V1 zU(JfZH^rfPo_mvw0%fbr2Y^Jgty*$p3PT@{rGC4dEUS4qvp6SDu7o41ax+4d3zm`0 z!g9nyT_w~hst4TQuoq8(sG`dRQ<||uu=k@}8!yIe2;g14zwzF^6BrZ-wwa$l#$G(K zBbc-eii$835WqgQR#lwj?6q)OHJ4IJUZinAx`iCbWT~^RAALB@>M4{4(XDK?$kH#J znsq;{gcAZ`agP4cWU*YC5N08;3bDi@D6t{HTa(dma1Tf-$%M;~<2~PiISo&E2*rKB z%Gs6G26c}-=SO#&N9GN-VPqX&I0SesUYNs-t1{aV%^6Up{#gR`pHBaH7GFBm233wj z??fo9s0E=Kmv5q#a4UA1EhP}si3wJPDld>k-qJ!<)>BI*B%389RYCyM$S!8u>4ERC zDup-N8d0IZ8u6!MG9v>z1;<wOz)b!M#-0znwvJk|>Q+_C^5n<JsPdOdH?1ji;iTO; zlK-Jqm*P;y((tIes(bfsck=ErB9y|2pbAYn#|u^co@wfJrA1#q5tp%O_Imj}oG|gH z+9H|byd)hk^AdmOf-WpjQcouyRv6NqcDWmvcqU5{n>5y&fXq-O`8$OVGG)$MjaiB~ zdqsr5R*&JQ6ACl>3V!36hZ(6o)5Y)1AC#eb_r5P#oxJoi;R^3zq_&hq`Op&Musssg zX5_^Gj?WCg{kP?+gs)v*GlKOW%l3&7M0N~Ck>EN=4CS{Z046+~pp1obLJ*Yjs~^&G zzm6G{ocJc~-5%X<Um+DGCaEKmW1rLrT<u;ok!*D_PxMu-X91FBMVV6b^QB0fW5}dd zk2hkrF}rda?orhag#?H`vj!A|z%wMi+6H~us-4s*%b^WApEy<_qEtL7gZp>d#rDly z0OJe=ql#pX9e?lmC?xQ2!*Uj5ChLAU;;a>(jJhe}Ge3sKmVd#&i6Uu?o~oXKqvXwK zGZ=;DXpKZsupEY3k$enlWv(;;xz*<hm(n=>mD&nw`$|+V(?@wL0)tya(z0AOyqTeq zz%@2V18_p29CBu-B%tlP2JDQosU~eq*Z&7BWGEDNA!7u(Zi0x%1zGI7<7@zgMsYdS zFl)(soaM_a0W<z9)bVvzIBYd%Rm_D~*9C>?Mm=ZcB4uXFe}-&AGLC>VfkCq`IF&X{ z-h3+jgm#8ygdQ6MyAWRK)2^X`QJ)ej0u>8dR<njs-d`C<Q%#338dR*SCxf>Q8W@{c zM<(0KEoKDG&pI|Nt%3-<R4sUt5y;MrxnhoOYo&r`m55r*dOCpuyqn(Hb{!X>i_$yu zr%rM=Q=m0*qbXlnJe#e#%lZf2sB(+jxGcEhTAR+MbVbD`CMU;~wesa7mu{;5HW1+G ztLgmpc-jCGiy?|cQkbp-=gaxO>&naG0VKjAt=f%<ffPE<Wl5bu)ukFv#qBVQykvif zH)raA)9V4Yo*566QE8EdgL1RNZIEIhk*>9K%vdwzW1TErx{SIrQ1q-Q^47W0+~|)O zQrs0wt}mGj)upn)#j>J>^)akBq4kRph{epYFbwUPYTgU?-X$5fm+e$NziyKz0+e-G zUu(c&P;04{4IR||9n+q5Mq-pdbUG5TL_Q`2#g9`=o6Veh9~N|lxQ3W0+5c}iN8#rR zm``Pl`nrH%uA%s2-|z(YF2T7hNlQrh9J0(150hd!4|!Y#vmBzce8hv4z7xnapuk|9 z2UG;*sbCYyPY#nYXW7<R5Q|Sg9&9C*nes_|AHRt}$RaOrcjQhLyG$#Kd9Qmaxx#*- z`T256q-}WrgzQ=!0C=w+a{}AJWEi5(5{0MIF4O({mGsdt^41*D=ZncHc`R|OI-eNE z^;xY%1WHX{09J_=HL0>H?D1@E92^Ote|{q!hcH`<*-dA8ZH-odDBh3dID*-(X|)p# z;|iGQ1yTj75`!3MZf3h5dCvqrI|1>U35qrEN6n2Y7Um}#Kv%)tj@?tw$T;Q*9HVua z<SD?nxS@QqI%b^E@)jljbB~DwTuy$l(#DIU$4@Vqjm#(s0GH#ez9QilSIlcyT1zOt zjRNS)#))1?bN4<x=H23<66`=aa7g@fC6_`9OnCP`2WlBzJQ>@uSs1+x?8b1{{lL7A z8$g@@If#A?@YjwlesaNxT`VIKW#6<#(V8NVd2a+Q@691%zJh;NtzedMwhlzth<3GR zCOx4!R83tCQ7MK_)g&tbsCu0$KoY47wb8tF&!qLz5x>&Z5|j>xt>^}xMXd0{P#3=} z#mrF0`wfL>N`V3+Melm9Dgr(jzE7b9lQ}0WD<y|^&g8t2PhX(3B8vEHIo))ctng|J zyX+wW1|rW<Tq7c%``A2@+wi!Op2~$^gbH-^C=4Ig=aMT_O6Z)+CPF1)diUhC<H;RF z0-QcX7VE`CZYx5`$r3q6-5dESi7#-xMSe(rKKb?>yNdWSmTP9iHL`Nw7qG+|ho|N^ zXGzI8W#0v)U7YPwF8t9U0i(k#M1&}ZffFhqQ0HVs&ZnPql2#`l`I_^SsF7sQ1qsf^ zL8nPYHs_k{8RJyqjE+^|BdPlpt%a=!SU<c+BI|V8YPjTG^d{AuAnxV~A7~hQw;@yh ztXvd%rr@Sbk~{~2V*2K0gefC@Aa%6#NpJ6MkpYk?EKofIKo0plls8b!f(~r&tG6;q z)wo)e@ikV`i7JyVnEjc@L&d{)GotNf5`X<mp+VN`tv8xp_EecEIEeCi1QAYOR<?ip zi*_c1Y!#MA%Ffsru)-8xdY9FUtJyui9qIfXgelTJ6;qKU4!w%QjC#gN?d=f~kZ638 zj}OX;duQ~IO@i8Y83Fk!As8Qc#4Uk*bYIObOw|>Ckp;5#4u_E+Rfl|;$%HPRecLsu zsWCV~s#;C09zIVsBA?jC=@{CX&1aYI=NHRI&NbRzmv7hzsbH-d?*P=J<P@D&Z>r=+ zfL3c~!;Dg#6m<}8ojW(BwtDN%C_KSRjHftwrX7!M%qr<*KiBMd?pkklJ7GiVuPC2# zSc%-VkwUbOh(bNuQ?@JQJ(X<}<%U-3L%z<FpG#LQzr3jXM*P4G?|)M(1eVgKf>KSH zC{x-$*7gQMRp;9;1J^Pr<*ef6FT+K`l!KAt$(<L1w(+kD^#=1WiEBmKgwb5I;j!BW z&q|AmG6JS?6kbQ!7Yv*5&*M~RpXPJmpe2y_sMQUcbK$RxAV$WEp^l^oi~l1QL0i1o z-dU|+sD?TF>w<`zGO7aIy0vC)q^cH6SnBeyL7<LFEGWbJe*4xOH>NSwycANYqhtRT z@;uNlXb$z?N~a|Nm;JcK1(PAt`nRoVgreO@dd#eE^wKdLel2j_%MkrR(9&18kTd!r zsL8+6wOoz$-CbyHQ3!8tW@QI($w+4NmM+vB{eOx*%oLf5?R^zb2W<#3gvF(C_x{;* z{00jpaQGMb9OKOm{-wXR4Dj(KQepE?m0+$NW*0OoTI}OYsKLd-ZZ3|ErQJ2IeMoJ- zzV)cp5q2t<#x{1uQz7>?E$yH`;Ei%@>NWuN1i{B@NF!myHW<M&elJFbg(43Q;Tx~{ zpb4RYJB@z7K9se(Xa~RY;F?1MXxJjgLa9puQY3^8;?I@12whx&PDDZ2o+qx#R~|wD z`rYVHe-Z+^m4%2^(7wKnxOMDRn%S#IAtz@bvGgNaRoq9NAiw+g^ck{OGPKq2LHE_6 zEoL-nCfXz`Keh;!t*LSMzOI=}JQ8=zJ$*y^774Imp_1CbfmK3EU>{*@9#rs3hdccx z%vhVtK1>#?i}93;JK3PuX~usqxwF_YFM5xG@Me0AF;&);UU96f#KVX6M9yJs;=$se zTusVTLdoD35>njS;#NN*f(6?J4vPIFpV9#xUdc3_4PuIk88TK~v+3qnHu<6l!;^cg zq>H|Mwi0R;PZmS1LOQ5+xzj3{t)EbAv%NwiZlAzomO#Hbe_2VM9&cI6hq4+bA2mE? ztf4&9^qQHD3Fk&R?VCK+g04?;Da#TCek>Xr`p;PXiVad~6Fri6wK%W!^-^#q2%(JE z)^ZOhCTwGnh|?!|p9PFXs@iI6wOSL3Af#LNSO|!=aY1NiF##OYu(gOqqdq50MiA;^ zBndhaE6+@l87vpYg!Z_sl3eNc?w#S9$wRlHXtg7Ys86~^STQjW<P;)fE5<8X!hiZ$ zgJtUc$Tx1{vf3%Qwo13UDdsu@$s>0d-{^I`rNpSOFZF%|9<_`$)N?9CNc4E01Cpir zxiKVf!jnpbT0XpWooQ2aW3TGf=n@crAwJvS4P6E{%wD97m)Q!$;by$7gp{Yd;)L8| zSC@0a|3A&bCt{{%!}iN`MpujvXta|wqhqj6qv1N#V(oEL%l*&!)O$_0bnejTu#VEm zjSja>bBfLz6gF>!rm;Nj14tY!ZBW4j!B-Ij{H5~ut7a^g{FP@eP0ZqmF!cBdW>rS4 z`R$E|U3ZTC!ivnudL<mZPY$h_S7_UZt6|DMj8Ua^pn@;u*Hk*7MOa&m*-?n!>4@~T zTM=@pI<?VUY`Y!>i`Bj@m{KGO0RxOz^)U15#H^!si=)QPOZQiIE5D1)^zf+4a1lnU zhAemjepHNaubJXV#_lIELIraXTZQ*ivR4?<oQWcRC?fpiLt(2L`WHc?Qupfox0dBv zhkzsJ*5mvHFC$UpF2fdl%}?I#yiCgS3z@~QevDAK6GtKHY#ywG5U?3^lMwhePEib# zGL)N`liNlQ^@syi7@fHFfcytY7WA%9R&W{nO^OP@eOgKRbUZ73m9n0drbL_HoFMAR zR+dt~N{XR4z0Y<&x{{>OY>;$L#sJ7ok1T(kUbP+P39g*?vWpQoX{f}fGldafVJ%G0 zx(o%lYKZg6#e!LK!~$TG!s;ofU2Ec^C+|kX)hxn{G7CNIah4^<S(*(kBN&Nhy;GPB zi{P$k{JNc*EsK+QF?#Fd!_PMP(HSG9J)fuZ3ZG;cM)!*bzZK}j0yookxgz$vaLR0C zdb*p+a^5c%%UvI%$O2??rcF#~SX~A;&GB}QyHri9IgY%I2pZXL>g<a5*{GCS-<{oH zN^zG8=*rC^xsm>3#=qnYmu$zIOJL#DDAO$*NhaWmnx2`LdivQ}wuOUpzFh6kPIQ!` z#hN;v;L~}&!1W>niUAy4m_xv!SdDI}jMHi=uRqT;W>g*Ce8{MoN}lRQDoI0HQJndx z#FC;;u{SPk^5D{E?3Zg-aQHwM0^B3@Z?K=bJVz3xvr9Tg5nBpV>vY0|l0crzG@@!2 z2<1YP^#ZhPt@#wY(O4E{-L$iQ=v!-HXBbmbMj2X|xwD{%wJ|dirrepzu4uY6#jKki z`#i#b|F(Cj_pjY2bH4f$t_-5RW0JvSmZnZ$!o)MgMfEQQgz1B20&T<tiUGElXu?U3 z)~9UL669ndegKS!ettHK;>NH*FMhMc(-RIL%EW(A^Q2h$sv2QN|Dvb)x-waxW$$~| zXmKPY4y{;^U5TL-eIE?qPwMlp(J6zFl6@-4e_P>>&plN+_n8?vD@rN(bloUr@DmOs z8>3v{rmJpcxq8WbN~dJ_>RJEXMN3IhuExB-tHymEfZ)BDI*(9vVk1_FJkOh<C7S$b zv%>AUZ0ZJNj#mwa6(n~kNGg+al?1@xBy~a4-z<-$?F?!U;|btG2H2Hc8!>{dFZN1= zb)&OTY$eq|zFlu(;oPo2Lef4ul9M71^&(^+fqgBP?TRvzK3iV0gPV~~aBMly_;Tac zLyrUvvuFzJM_pM%qX>C3BmRrywu(yHoI_IXaNYGM4whf(2{#4=)2<bI1_xkxyPb~^ zB*jWtMro%d&NYvFh+bZQI{AbGDbg22vB0#qt#$M4kOtUv_27Tf<sy1<(xtm^swszD zmeTI44O;+wNs*~tD9B=qUcOw8-wY_Odx+dwS`Yd~wsTBHy1rJrCO74y%=T*C2FVri zl-_-Gapl+2uS$^Xp^8-!{8Y2maAZS`wdnei5-DUyV<^f(vsf4w@CT$7d9KOW4ldun zo|7|Dd)Eo~3Ao1J()gmdPBE(dFa_G>JDEp4m!3iLW%nmGhpw!lmTsNgqy6&zVW`1# zcd{Sf@{Y><XQ3e^7sa3xq^XSfEG-menY;H-yR$L#o%AhOrGaEIQtS#Qz<kU2Ytg!y zedlyCB5JRgbD{Phjyd@FX`pf%LfC!TEyQvk;#dG)GBwE*=T%M}=V~Uv`E2u3NW_Tr z9hwG?<u{*_S*xUkjC;3OUD6<@EuzDcFF#XhBq$fHPv;D$@#?7ncFNiRj&85M_)g;X zoS)7;RUch5|4-VK9|C}q>4zBP>O%S|#$N@6q|4t`7a?T_L#t`+ehf;x&oXy0nO{DY zbpl7gj|k;L{0jaQg8o{e&v=!KkmXlHw79zUt6ixnJZ!jKL_bLk$kwTPq?fztx}`j9 z(3FUNFr12OS|{aI(Lb^Cy~-z1A%3~wNY>v{&wA^SaVW)l>snh$37*$ib(mi4y%xdo z*&qL4Ye`^U#Q_`O`VgPsy|;}VsH?~iXA}+N-<81zLwlCYW}4hHWWo1&RX6jQ7!Pm6 z**}bKV&KTVm+OTrm@xritkc+Zy@&1g&q|)dLP0&~PWcA6JM8}I_39(+`wHV1V?t2e zXEd)h^`>Z5H*iu2XNy+z2e{L_8_#leyEQp;*BOCcoJ0}~#pQ(;)EJjE7}Lo_3ac^4 zs{KZTY5;=wY=*y9sosDX#jIVxr|?~x0VTTaz%L@H-BPLtAu1_g*}{|0RPE#Z<c@=S zS{I(&6+Q>(a-J>|m!Vi?)6v?-X2{xCifp}JjAtirrRA`=Z;bQ78c%gj%f-d&?PZkR zlmQwGX|=Et&a|t8UAJU%EH0wOxWJ@>jN~`tDVe!yQzyLBLjeI4LY)eZ5c?zLw4P|m zHla(-%Y;uF%GfVy$-aZAt!XOd)LL5x06E?K%y>jlcSD>i48a*OB$2Co!BkTSLL*WX zsQC;Em3E4>e(SKVHdg{BH##HOAW);hp1FqwjM96{OrZ^uv9uSga0Rnr!(}Jpyyd#0 z>Y4v8H^4KT2PjPs+j-R;-ky_2Ue(&gjZF*|Z1=9hm)etx>r<F5A>0+P-58s4;o!}Z zb?oQMA(DsM%l}NrE;X%n?kC_(%|06A4jQj!QwUpF46OF>djAZHQ>~Hx<)Kdh)h$87 z_Op<-m_p1Q7`*>xa^^zZ<$G1(TGfx+TBIPzy==JRrG&wG6ALQzK(#8Dovy*V_xY~J zj#9i_u|7*m*p0v%6J_B=v5?X4fFr(J(p=vx63hlqNwEtzJ_Ti<*H1ZtCKVQMPcUuu zK`@DxYOI&QfPP#=O}T+FCLJVYa|?z;pjJ#`ZzC=ZuA{a<>U$!TGroy|+HIIWm1;7g z-UzCiLBcDEDU{Ab_U@QAouwUXBUSYFW?Z?ZtwU>~w;Hns5jY{~n0<#aU(?)L&Xvv? zAY?rAvt}$b`B`9H-)P!0AX3}u?tMuW_U&Z#mRCM|>#Rk_s$Eq+1n>5Cd7!n$-hUd4 zOX!-|2RTzDFV}O0wRmXmrL!cP<EOB^5`EKad$D?ICvIrbBu#k>EO~f)bQK#c_N!rs z-4N!zW6+{^VUY<k-n^n@hVQhy`oz>1%pD=p|DqkTZOv*ayec*GNRVvL4Aq5x9gS#N zu&-fCjgg>gEb6q7nnfiCrxvH^th7*Spb7~%kz%V5vzQ##Zw0i}=f|Guu}QY5!`Ndn zC~rW=)okOE;?3nqV$}Ji5Qze&78EP|+ry0PS<94(1Sjl3{cGG`aC2kxt8LMzV9Egb zRJzD-{8+{yC#-?_t8Ia#gmp@ivv1y;BV&}94;ZDy;7nfj&TDE+XRf4rXA0Y*5dKeV zUlh%G8>4vfOSLm1qP=6%V5W5P6G^48db5F&8ouA0t&z4WQ?8u>dtyk9wNKn+8cI2< z0y~l@Oy_!5CSTfaICWpkvL#Z3ueOfV!65qq!PjCDgJ*HR!Vlv_!7saJ%&q;DZkug# zeggE^5vxHA|3;l5rh?sAc^bm5By9iXvdBsms0a3`*+-UQC{k?6SrXRXCl-!JLX9VM zN%$3it-EYk&mOtEGjkKt_)#ekN%MsR&j|vKzcz5WzUwZd-_O5iDI_OpGGAWR!q}1- z52-|vk8`pNXNeg&`~Yr-#pSc}qo?!L{wWU9Ob{R#tYRT4i|s5H<ICf19O*FQO1&yt zE)Ia@T7UkNO35T)jfH!XuqsOxLl2OZi$-60+ZyO9Om1GVoebGj86@oL&Kfv=q`)Z= zTA?*tKB2P^oQTSZq)L11_54(w|BV7dJ&Yi8zpOvjQnu;jVm_T-tUAGj&Z8Z<Xm1~9 zqL>8Nb;$%U_>+g~L3QiR3X4Q<eA+FJd)hU{Lylp&=C)I0F&+uQ>f<AT#Rvqwz9<_# zoj2SX2*&C@gpmkTFCmnuhr-Fq^rs?h#-K!xpY_xYXb-1s3b?U5asa6z_qPtbnRb`? zG5(&@_G}wxuBok**M(PHnj`N4L3aAb^ZB{;S8p_eW^+Jzp|#XF(@6(Tq0k#sH8%f1 z&f9M9`oty(-C_XWZMkZaJz=_&P&}W)*k%8T4N(z<Ruh&h0Lps9b)>;3sY3IuiB>U< zbpIRKdNH6uNSZqigzy?6Q19w=?`ck@_WqY6=32jZ@2kD1doOk#@Bel0c<0gK-izaX z{Iheo|Lo~-G6i%=h#8dGbn;)FI>$rjHlho-?_#$4&2P%i{W$vm?F9M4abAW+Mt^kO zc>L_y^W%fvXV3Ry2M)3}Q=-JdZIATNq+C+eYAQRBb(m5ytCs6)lVmoIngTn$I$f<* z4h9>NJ{s>vwySC(s)K5sAmGdE>jQ%oaqJcOL^(vvdbw}Yu4q=KM6ZeXhd$S&HS0uL z!78n*^Z@I;^Mwm3P?Jg^+E_}K$f$t0X>acAtR8m=tavs%kuXXRPJ*(XMP!QPQ-r9_ zS{+7S&gL#8q}m#KJHC9~ifW4km@;QVqoqcQ*X%Q~)ireV*+PufV7U)7+jUXStS>w_ zCJ=aD0XLyer<ebM31V_K=}xzA!BU^U{#$plx&_l$GL7vl-q;1fZL9(ERe)K$HfR%Q z7YX6zvbq5|fboP{sV<LreD2qbLu})rjorPE;{qqh*jTl&MY(W(nqRD*YqM*%aew!_ z5gg5<72;r)qcdC~Gm6x?GkSfo8lBE(w^pMQMkRN0&=bc!<Z6p$vdfjuL1g03>ms2{ zT<x#%senZjAE|i-%^Y#`BbbNBXVOWlB5~5>@U8cu)j;o7f2IGz;m?GVMR~w!flJhv zToHMF2a%pE4=!+0ge9Jxfy={DjY8o#`Cmu6!SVm-k7n=DM$zrKFwW?g_U;-!ta9YM z)6FS1Oh_T%I=%vK4XKt`bgu6!Oi>l<*64-_XNmPAruuHdm4F<iOqtKJiXl@J{K9$m zEiJqH34n&xvWE#KdH}-6kU0E79;xJTYOH=X%QRI@{F)kWc8n-^HVi7&h8ubpeh~|A zp{^NN>JI-&>ENtrRmlBAX6)K4ELtlewP29GyuE6&v<If_P=gbHU5!V@aDD5$Bs*=f zz#NGw)@zzK_%qehzO`Rh<8`|HQdZ+NjT4#T32pip<5|KfshW+2S?FqNDO>&Cyvivi z=mOUbbWMh>tYhK9{v>O4zy5!4nS@8FvBbGB6GkF)YEK}239pV0%Bt^hUr+;n#EW&O zG$zMgyjMRddX+<ey3r|1*A<ok>JqTn7a?k5Y*9HCI|dn3&N`U8Yak0n!<oXNpmlkX zqFytLH+4qrUeC{JIGluxw(hm`daAq9Ux@aBt2E9~X|rZ=6pOe?EcLsjBNxe*gC8$3 zTP01_$ZmR`B9zb}g=4)onLOoP?uZ|T%5o{%86;!%<yDZY`1&fcR9&Kw0<UW*7lM@z zLZac+-9o}oVfD#+f~%8ci4fVXI_`)<#?qnCF&VAJR9G)qk|p5#@#XTcTfE2qE%qVa zprc~HTaQB(lPU+g46i8-%$ll7+bZ)_R(&ZKdZa1^b7!0)P}%Zp5TF+Lkg+d$?SKn7 zBE=sb9jv5!&T6U38%zZ)?ks`K0Y%Pn_c?09<M-GK!=BQ|#G&JjN5L^cSbij;EMk*! z66>d3=aXToA<!s;nZo;}MMNmglUc7u)C}#vXE)c+<OovVr%^pWgHPw-ymaV94Gh_? z9MTWUm!dB+ld3z28n^z6z=Ka5S|vIkB3Bx8HTM1KA|P5?Mf6CZrK(R-G+Fm-u$H)j zLxxK6CZY&*rZt?*eq>#voltOmK2eb-{KU#tNSI?pd$+0^%g?Vc%=A<kk-OKkmwOOS zrWX=B33TW&7KIA<C!H$%(`@=F$&VZ>Mv8ej&eI{mD3-})DBsYAgiNh*iS9_v<C-M; zwk*bEpTs`5q}r?t4GIQ=6e9Qc=>Zk(7dnN*Nxz1w2xIAFbkm_K1RZ56(NPI^)^vZ$ zkP*uDXMkj_1!KZ#_YJ&Bfq{}P8Qob`yBlhWYpB~utpve@=9{S5Y%EaqDy#88wE><k zDRPxnxhnZJekdlr*w_t~u#GIyAI`(t9D}79HR2*&Q%BfUxM7euxn?W%Y=#kimG-GN zIg}?DFz{}D9>`v8e$(Z7W!+e9JhGr~c7R=z@mZXA$;LN7eG74IBR70v=JOKg>flkH zluGPpV%QFzWfSha{`mvZ+<r%%SVbJ$>BFRw**?$f<zXA?dPr*9?e<FbG$^A|-;QRA zbic!;?fUse3`Z&$8%`uwGB<D7%uG9Q4NpR$%{-H4*^{7m3x%;(7eC5kL3+G31s*wb z!~dF8x18NTB;{@!^JZM5+=#NLUVwAyo0!Zd{nzPvszJtTUd+sEwdwJ#$e_AyMs#GE z!!J~6RW-<$L)D-M1WNL&*jxBM!$|^$8@?W&yxT|#n)_WUS|v0=l@!smtF1~cL*wYv z;ptBc!56Bn(X&xV*vY6_M*~047K~Uy%`zkUlt8xcO3)dPrm#~fk0yX8n+#K0r5@>p z3Wp0hDfW2&W^&?l*#4!Gij=7`Xnm2b*iPK2P0t{60@K6Cyi>FE*X2CR^8Vn30I%|F zoEF)3|6IYc#1cde+GBWJ7pKP?i0#r@){6|0j$K&8&#|D4<0f^z)6tC*>?}!swd*KS zBds9HCMDo(GQ&<7S{$_PmmzAF8+@bs2hN^aF}vglg|RYh=FugZ{51Kv{^IWa@$8hR zKWzWv9$~f$U<0XaNt0f8a3sQaDwx=_jf}NK4WtUjLcC!GlY#D4Fw*THJQWV?iB3!j z=s9wj8ypm^`s#_#Pv;^J(@=#yh>7$m(TD5qdtj}oj7ZOZ6=s27U5&9-ey*g>RGQbv zI;O*|4cg8&ERDa9orFXL!VhBsR2@*B2yv>bRgJERzt;%J*grJ}rq}|PshnS0=BFo) z90+PK2kS-$4+Ovi{HbN3*IW%f38PEF?tuGH1|ftvqvW%Th2*E5n)w>=FjEOI>6v9L z<N>oxXuz7Rc?<R(hAC@e?QFv~>Z(MvZ6NWlTM1z_WUjpFt%P(8(mBfvf=OuEnk}7Q zz_^HOON~c39p$f1pgmQw6VipuW|MD;ME1lPh^A{42uWaUC*jmI?KL1%nq76Czxon8 z9KL5q+Vgid(9xmS(8(K2*ctAASU1@CiP%u3#$W3cYn+j)b#8LXHCPcxvTk!XJ=qY7 zm}TZ=HX@w!!U8Z>N~Ixoc!Mcerqcj=4Trj^+)ct#3*T?T0n}awXOxJYPq~2r()<B| zW*KQWR2uCD{Sn?IW<609>G-5QiK7);Ff3iL=P%ErEQGAaOPXWUW#_7UQZ;Xcz;_&Z zy#ULI1eqpGQt9xB)zNzsZVG0}5Yq~XB*xP?ksFliIZ*zo2oU>`D5F4^Okg%8Oar{o zs|LD4u*!}niP1Xn{TPaAAO5w;cseBBHX@ko5M#;=L^nZR1}xn<c6T||_`4C|?6#02 zlEbyal|sBX$Iwi79=EDcr^3<R?yFSBz|{6gQWbiQEv=HeaaEPv2!i>of*zih5MX0P zt^H{DwpJC=VUlFOe_yK#AX{Y_!81CEhJxMLI{1FFI(b{}ZAE_}C8pm>P~(F&KqZl) z>(~hO!_oqls6@ot7K9>!0eK)dZRr^-fsit&8B%~QcPnCUrTS}d&_liRb$874+f@!O zcSu=qh2WSB8PAV+o%GT_&sYCgWlxZjVuFJPmiJJ-*hx%%0}1rp1CSwQ7xp<~sG9Oz zR`(1^NOs*`0P2?XjTVt(Ay82-wmHE!`haR$RCKN{pz%Mww_b8KlP>S+=2em)agU*i zJ`svz;S{!!BSP|@t*m$1Zx`gk{CtEeP2ZDTA8x&id@o5Ah>S1TYLR%U`sGOU%VgRI zFPBCnZd^nIVMNeOOTsn*^|sUo0G{DlF?^RD7X!t=$fY7cNqN4<9~Q|fxTShHW$6Gs z6N?18eaBHXNEZ^*8fueqyh6TYVIPmu>SLGrv4@$O^D?_fif2l#)K!5FnGlpB9!h3C z%9*63b2{@2Y8edkGcjvJin$7PZ7%nQEFHvTiC&7_Fj6DMH2<dgLYOGabY`u=fMaXG zc-snWa=^7ljkjI-N8uuw*oz9Jfmzmsx?Z9Ru~WEti~XCPQMFgFLjR)ORE>??AY8vb zzn<}mwvwr&qtSX&`rG5aRy`$56)RQ7wB*%|`@id4NXI^pkq?VV9ZR(dvC=8B-!&al zgj)8iZFD3$ux^?_Oj^8@ummO#lP#!1Z%lsnM(3ny^QynSb&7tI<W@c1N=>9nXT+YV zNJ(WC!dossCJRuG5<gWbs634KMwRkhZLlFjLB~Rb+FGAobNAfanWEVX=}A5{P)PG< zanehCaY-X}%%uriuD1iF0I)v0^?8$(t7L4Ao1znxxhkY^J@9Z1L^vg~{WHBCLpu$X zgi9f(zn~G`jxUz0$p<-pU5*q)+vZ)PVRG9pL7y_G1xuvuDv>j51nm2{X|P7s3e(pY zW@$G>3L`~)OvgyloG-f-(hAFBG8daFFQ*I3xQrY=p4DDd9$r(POB#Hh8-N+f#a9w1 z!*EGObtr5(C&a@@km7X>w~se!Fcs7ym7DWaI*VA7-e~Y1zslj_a(4{RN=_ClXVG#? z)^f)F<gyr;>*|>Q@^)g8F#Jt-VHy^vZ7)+U>#WU;iHFWmLvD~ZRs@hL+!ew$)5~Zh z)(REF+2~$X9jB@$t}^TPxM!l=9v7XVgX2){bwnsZr}6FpL(&wXrryp$lv8giIm69R zMD{ZiO%RBjapOc~2SyTO#!6`~SVc$_fU0$k4D%iHW1vZM(W;nZg(H$M`0)m9*+SZ3 zmX$W$fE-9#5U<T^onnogtjX_0V`W{@Rhm%=gvL*aRix6gmuhLv%+j^uY~(jFWm6L6 zR%`=8YNci%j5362{usl@An-zL&lx06rN_yfam4hrh1oq9p2(UiK_{#k+<*Aq^8Y1@ z57E7>$Fg2ERz@RSQ<0$OmJQ?c?IK+PlPE*O;$J2JWq%rWx0#wuT3V^ec;<r@0_<@+ zS_LP$IKktNvZPt1nD)<8v<GEDa*JSYk1m$D=p-GEVf`Qw+$i&!`G@9<d-oRI`}qgJ zB3RHj1DUdkussU-D?uWyYuzeJfnW00FJ_bZZ2Pyr{p~=Q!U_b^3oDeWk~{5U6HrEq zTDNPxe$N31M;L)c6S*Xjl3TuLBqK`d_`|C+J$~0+F1Pi!e67(4r*p&+Qb7e-szt1s zI(Z~*QTC?OVs#niv=}n)t4E(m_5Imt_rvJR`}BGGN6_>wrAsyad0LdARW@}q6^Icl zp<0&fS&|jEnjj(DGY8+M+LllFiG4PzPv*z?JN7m{>%$`qsPsbjZC)AmF7Up?7@KFM zfGK`e_IPDz$&nze%082aQ1-lh0wzHyr)0Dq&1cigf;qPM6q_4TWPd4LYd6agcbnaw zyA3hiUUrLypJGfR%)qhN<7rP^F+l=ML_xmKS=)@VZaYALFi*5oxqHz5Z$DrAQstQX zH~brTGAfx3xyVCPVUCi(?s~pxd#!wJ{=Jd@2m&+)QaKU|^Kov3SOoapbVHyN_9^`V z3`&9fF)zS9z9Zr1V=2W`RFz_^c65NX+z~5i!fBR|r4i-Kol4WT0bTVs<lShAWsg_f zgBZv#($DKEv3gtO)A9)v6V~KCifNFl5nqO`y+Lt-CjFA(sA#sIQZ<PN5e5<}ZzfOc zWvL{oXMkUIVripYeV(q<xqMnaA&bvWrWep<bW2X=7t878NDcB+wcSSN68%xk%7d7{ z#mvHZg{hZMUpHZyMNTu0kk+bJtS^sN)IP0Vcy4BIJ`bjGtcSRf@oX2nWaG(fXLczs zXj%S*b5+FzQpZ5q%eEcJepY62On;j%6}Zn|St)o@mMqFQ<<s&B&B*siPS7nD^F@_g zG5JlFckiEeE8J1^up6K1dg95&bTtv%q&3cwhdeo>DWf~6VJQ+;C%W3fCd9`A7vEPA zf&t}N{yNGw^<_|~1byB&^l~QJf429-Nq4@&LRjn<wek5COU@JDw`F0q)fS{>sn$KH zo($zsmQSv&Y<!IG=7Uc(Z-|05dTmY}BGhJwl6DY`MR$T5d~r8Uze?W%Z$#}y=UUBa z5T!wQNA0t0-P&UNw1wP$US7OjEygF&zZb894FcED9U@B!`ewmnt=!-$Y@ygsUcN0! z%%^GBoclGws8p~eBsI_-O|eW*04z%gDxT_qZf%ms0rTq14l*6`<?|MGgwCQ8T$??K zwn!CzQXDIdsmHz*j6@L4y$ZhMCu<{Om^jwUe%huRtW^$D`DDvqt|mU+)<8t!QMcZ` zk4n9JIqVqgd~WW*mY#*`Sjp3U+!`$c5Fr&W`2nt%o1Wsf?ytw^=UvqKt@UczO~T8& zs+7+#DjBr|W`<1dF;xegqTOA2T)+}AE}#wF_A`<;NUuJ(EA4p8{lL3^)^b%j)uWsp zCTiXppvNpjjqOe8b!_3$eDR2}6fl$_pz*meDn&MGWYs+%FRqo!)r~|3_{vt3R%F5x zc29nlttK2Ft5vwW+^uGh$~{jy4$2m*sFnkt?0fo6PFWO}ApPqq>7=;TTrKLGGF3o! zqa7V~+a2BF4fY`HyM(U{ozrcs8eK)^REdLI{9ablP^E}(&){DHE=uGRZ9K*iiA-KW zp_Jt~#Y7N>VsVpw$PTc`o9kh$*}I>~D*Om>vhCBW>;w~5+s5MCk_LRb`QWftvJ*@Z zw8NW-bJn%y&M=|YF&w%>T!)a2v*A>;4hmtDt!b&G(w76wh^vf8LdjmrX4++qU69f? z{S|xX^n6d>tXjvoFFBy83Qb{0`WyW*!1j(fg~*T|tT^^<YNr^n>~Jbata}KYHc+DO z11(0Jmvmp>2~4jw6&y5=boO?mlVYC|-*!&b8F{ELkcu&*VjDo2C#c1cek<G?nIPrF z3}niOJjCMK@GAJ)Q*{Qfcb<-8%p+qPOnzA-4CxH2WLXVwNT%yGQ+Ww}{XFjK<ecKk z3Jm2{)yj~%t(w&VDb2hHBiO``4D-4ho1934m%LNY7OKqO6e)WiczS7i6lYwzDesTI zXle1pc$O^MuGt8IMtVT9(FV|#ZrX^iKBq{k9YjLItVowdVr9iQv6%)Q8J*H*OaxAO z!Qz3pFch-AM+>cbS;5yrR`JYYn4oUN2*u1VFH|IwHCIgsdSXUj&Jbr@M8E|sLBQGx zY1=-E<Zht^kIMTvZK+PgGEBF?@ukLIIuQbp)3r#t@ebWS=vF(^>HPcd^d<bP;F?a( zJnHr)7KuwvpP&k%RunlmJavd7WVh1f-lsAv5mXTP*8@zKi6sZHx?-`bN3wjH)9N{6 z;aLGqJR(+hO01wCYUupqXd>fz9jbW#Brf4Q=MamSe^J$RhBpDEhlwr38`ka_=(Va{ ztP1dnbq($;7URo@llPB0EUv}4KmqI*Oy2j}6*8PB)A@`cS9(>vgf7B$HzH4kXEowg zD<fmn>FGC<<pkkzqF8qox_?xQ^dq3({nI~<{*9g5<JSHbaq3RL!S8?iU3C)z4t-xl zVuJEcAYjn-XZsa}N<3EIRYXgA;ma~?b9moFt)kN>NP4qGXwa&goi2rvuKzo)m#B5J zs`lw)^(hfNzj%$^_tDwK?1VcVqiHw((23CVAN2(>fbmb5zi`rI_9o$nCfIg^Y?OTV zxy+PpPNT3<!zil_Sqc#{KYm)m8Te9RXc7H4oz3hUe)nL&u+_eAJM_Q;P>KQ71|tw+ zy}chBHLlCIhKKxDFl^-QMzi@W<K_a*^#ZYp6N;M@0>nGQ;G%k;ot<GqrNC_m5z+ZW zh7*%?8TT95t(MsQfRmV;dR&k#Dek?L<j@cE$?2MX#ggZqF93J3y43Co%S)IMfm_~0 z$0yvRj^%1IGzZy#lzrL^SZ4;-7GCl_Q!ewfZez@@l4!Ov1mzU|<N{V4ggzzzy-`_` zW37|DGbY*^zzEiQIDy^N0J{S#i~si!Lc?zR%?4u%LVWE&dxntdt~JI{M#TI;gvRW{ zcse;ncz&dVaDD^N#55Ei9_NOV8fL~0grGp(8Qp?h3g?Qv-7*hG7c^$^L?Tct2=s0n zU8`#;Psd+|+*BHt-V`~F$$Po%er^jK!TV}~<4bMqGs#4$hG1^k^{=M$*W>9Y@BIcm zrn>#s8$pcRrQb&2J<)@Ky}nB|9GSDWMZW1;M=gX*HotL=*M^3QQ%vrSH}&FJ5e7d| z29ia^H5Xdw%r9o0Wmm}g>cqa&Ia|>djcOE9!};`S7G%N?X2Tc6T(ir&k*hW!?esZp z?8%#%=Qn4=a8p@roF|hXI*F6oh9yI(G7l;WSA;@$Y69M=*rYs|^Pe-pfX>crHs_3t zvpHHw2T0DQLa~~*dsHqxGn12Fptez)klMyshoII^r)_fX3PaTlB)BPk<Coox!aExy z@NWIe+7+a=v4K(v4ftsbf2|o^v%I50Gt`SCD%5I`H5#Vq%P>uo%1o-aofu2dL+pSW z?{P(9#D&%Qp{Q;|P?Z0q#7r#3HG~Yf4<leyGoD<?YPT7+2I<WpNQJH}9yCV8#f=G| z0PSbgpwVcBOe}wP$1$e5<;tC&;@6sel*qYU%(ImI23%Lys4g&vN`e%oA8dLNEaFe1 zS~ige(}Q91AZplkg>(J#e0<WKO6;27T&+=7)P__W&sI{}dHMk2=n<Sym;Zr8hm*5O zrxzkES8BOL@av8%_a#csk+!fTL&&XLEu@L~fGO<OE_n)l8zF8V=EvwQJcOe$;>yog zmm?DDR)v8GywuQq%6Kw?w*jqeuPTj|4HddgExM@P)Pqb+WTo#U!i`|qX%og_l$?9- zcszZd-KoX#6-me)(h<uZ<IJcQdU}QS`2fZpiBGaGm2TzltZ<P2HKL@yTFfubxu2wa zLHq;nG~Viq#w?hPR=y4tUiejYS!)S|6sl~p>JlyBW^wEx?UHp~bZ1i>>EK#H&-XH8 zNzO_XNPY(BfovpMD{?e{@iR>BD27LZr0};&pzMy+bY@S#L_VoUuq*HB=GKLtAAe2} z-kV*#-$fGAoa)yV;3U@OW(72#Ve?IG<usA~4x`w+QZbvQuv}BMLKdK|%k&9h`jNxm zn_ryd{WCaLtb~@0*`vVsXH#s!e|`Am@lB7qRT7}*tIgecue;UvT{nCF_WW@CX32&2 z{9=U@FeCS3^!)4RBN&9-v>o9B#}W2+mi)fb;_6X0F25c+#EI<b{QR1v*g__h#bR;_ zR1RbC6Yn|A*)tzr`+g9zGMT{@eNBvQyVQ&My!Qz_&7yvD9x28u+acRf6W!22gl*&A zt)PQEf=DI;Xayg4;d89$rjU)sK_N>CH+AWBg?&|RA7KHm{m4|WzWZ-ZldgaU2%Ik_ zAF#6%_sB8BKC3b0cHnu;gC6;sPo=f3_9qDwk;Xp;8d=tH>AOTzAz2VpdBF{<QO5c+ z=UeJ)q<YbpcH`yY{3I_+4ua_+>1$h>Pq-{Z3qY&K+4+%+A;=>-wiexTKK;<0Lhqo} zI29n7PDkVV2~Xa@p9{Le=rKi|lT+S2LSedFeS^5-WhN#B`j3+!5skw5k?LwBV4Il3 zn?gBUj3>;9mOzn*)`Y4;354(qM2S{(bg0&FBO&h&5ynwOa4H)wp`b~qlyq8)8j$aE zI?L27hMd&)DAh*UHv;18a5#|K0M|PeYtO<*5uQu`27B(?$ehxf3djjrt`f;fr2**+ zmwTa6NPQd`YzWC55q;sV_rQ)rY(!8ug^e~$TaS2njRY=H5ztpP9k6?`SU>=CehW%K zE!@YGcMM#RMH3=)IGZ8}1NJ#NvZfpkl2C_xqYQqg9aO&6AY25CAG_EeCa07s=t=>A z1*~th@MpU|I|J=x(Lv4ZAfa5gitsDH0LY7x;gv|pE$7zFphW4fVe8i}7Tc(agaPYd zg>k7OoSc*SjZRSIkxRm-={MMJv3d*}kX`M;R^0}LiovX>)vX9h&m&;%ofzSun5prT z^w5*7-nU+<Y4X-jD>SmMIGjh?W2j{Li3N#$Y=>YAHZrm=#yY~-9OGG5>+b#IV+4fE z-(hi+2<BXtHlhjG+T%Hn*L0@`^NYnvw@ns(f%FTV<o+AOR~V->$G(uaLiPgV>k2s5 zp&*Eh5i^^g3NSnQZfeX$D0D3TFcBWpZg>sg46zaqLMo3)#$Bb0Nud-}`Gc(FQ6#4M zDs;^mSrq%=t$m|~IxN9=PRHk(IP*0Y<Nxblk56&(A4|_$FZbU5$IE|t@%Hufhuy#a z=Zi1?`k()P@Yiquy8P?6Prn#{`~O`0=c9k0{`LJ2)4%-7i}Tn2{6A0r<J%W+PriOJ zJ(>QHlzZ{*|NQ;y|M>FD5ET(=<mVHNccuw5=768ZYi*3P@(pi^!#!)0|LPW8FVj|X z1`;_*%bX=fRCv5xUA$I%tAKhgX4wAhZMT@fuX|F$M2T;@#S$n*c-RjguPzoe)(VKi zm2oil7@f-6FS<7f8eLra3c{@ZA?*feFT7(M)1=dRssaTTZb0KYEj{U0Z|A3<ycrjE zesJ-c<Mqj#d(r*xi^&3UXA%+YsCk+3S{RWVB4yg>8p2AORV^V5AWDZLTrFakEQU8A z)r>`lzvB3ty%z`j&z>IdKOEiva`b<HfsfO3TSoYiL_X6#LL$*>kj)5M9=A$k!%~(H z_FpH5$e4;X;c`6HteLwD=yo0a4&fO~7?88o+4imfvAp*`PN64^mR0S}N3|I}S-Tcy z=&&;&K?CpL6yD{sTO8F^pm$t^JbiGa%bHr5A?mFH)k+R8YAtsJ1gQaDk5Ar3Tb<2Z zIS6$_Tr;nS$JNc22$yW171<UKp*3*_jmX*)C~K(e7-YkK{+}}@62yAtQL#Rr^YLQ* z9+U5UiP>v=E#u!CWkpUL=c+@-9U5r~Vuj&1ALu(CTiAQ9@y+E?7lsrvt3s308<KB= zCG?Diw-R&POH~yuU5`yF#8x(xNLXCUilw*pb~78P5IKGW<>_&=*vQ6t6%#*C>ZvAw zu**`4BYE@`+I~4c>yqL>E8<w}A$TvrM-FA_Fp7DU_u|Iz73dq2T3GHl@S4T$F|5NP z4l(*WwNDeI@YNk+e#<*UKaPwrU-n*!!jg6GCf~#*1Ap-o*?urT5{DQDQ{hO$jV;A* z$%NFqf`(xYHFoe8dVzUxXXMcF>&bMoy4)VBY07fW=j2aH%TGJ?9L^8UyOYV;WnB;L z2~tR+WYNJ&1)+@Dj3kpO?P98vxLD;AooHiAaSerAf!R$~Axp3@osWEGSLn(H^0?uV zG>fs420fh!`Yt(m5{D1T<lc4N`RD`-8DzCw#cbVM;SsPugbg@eTt1$^nVfhZ=3kJ< z$*3&uZBX;5(c}r0jEng6(lTw*ktTAlP+9?d<a4a)GqWf`w!|b3NbGqS5avz9W}+J> zB98ru>@ouxuu#MFI;dzJTC8YrhoI{eAQ{*t&Ym{xV1r&*W%5m%N)$__R1OUZp*KK= za6-C)7#2jv^?*gR+`5MscdbW^K(EiZ_08fQo{tQZ(G3%T?~JFpc@%riiNedn?fk%2 z<e;1Bo`oM_<1!FW<5b^7EVIrTri}XE>8Yivz(|<N*rC&%V?@KXcZ&NpG?}mpL`2d? zjQzrf-1iC{jQCcESjk@)$U1SQQ^epIi!@itUV8%4QA99i9LM~?Qs8e9*1$PY|3%gq zY#NY$cj6Xum{EjX^hE1FZq;xDjlH-DI)&24T)`s)&@qaP61r|7DB?Lt{3d#a_bHUo z4$~GyX{i~IQqOHbSCG$fCD>{w^>9oDLZmtCM#<(cZ!}r-xOZmfQ+v4j+7eYo-BC?Z zE7zTaG%UJbh26j8L~3&A*DFetL>kmvt&3Q)D$cCB$SRc~RNKAs;)O77&LdH_`qgd| zpzvuFZjBib)t#`dwl0OAEhcZ6KuGktgcuAeZYGiSm3IA9m~8k*hW5-XomQ@IC{kp2 zIo%sCrk97^;yuvj`D}J~oByaJ57|~mLWgtB2>vlywCjXuS83|r-NlNdx`-nj>?Uzp z$}+dja&(40C<{q;`Swq-Y0hx?BFPO+FyTwyuyl+ZKseQ)=x9tQqre{{(apl&?FGf< zbY4aeMOn753X74dBN&_(yV%d1Cs~D`t@pBpz;1S@&t~M8Fgpk*MT<b(5}8IN2n|BZ z3~#>RC!mEK`P_WB*s(J$yjZs%H|R*l)eyf2m*R03mG9cA;7O3ZxUO$AF}v5a6j+d8 z`H7ODzwLZfj)IEu>%Sr1S^W1h@@`&QbY~snG;owdUbSeb_P??ds<_Z;I9iH8iX31I zA`x#p9Qd~EB%kUgZ`_fHQ+o|BP+9u5jaZ?yqv_m9$ovFdt&;X$GQ7UZD<jE5j)u_q z`8b5UbP~a$n{&dg5o0N;>M=fa`+fT}Y{j18WQ`jm7rhpOQyQW{)Mbd=rPh6NPx)lV zeGl`ystzDT|LGqlmZ}dG-w><G>{!UTjr$B4;&WT|u&S*!TB^Vn+FR~}=;JFk?5B(l z3b;PjELBIme40Lqzv8!`ovd17&>wryr}ZnE>*_@FQHDacK2o*G6T1|@RXZnB8<PL5 z>h4Q<En#Ve6SLlUY%Z)4Tl0re$pJN)Z%klC$l4!>&k}Tv0W*z^D>#20V($G6zBOxw zl!omI23@Xg;iRrXFn30}U{VwAwoA#A1o5X9ZI*lLd@(<P<BMb^&@`Nu3F!EyZQ&#q zs`D=1!J#$9^9qLvpaL~<UELxkHtMHSTQW0>!?0O#VVxtgu7m|LRcnVQ9I{7~g$udk z>-vQ_Rghi+YwChGB?!?pzRAiCTM#Nc3}%qh`a;me%@bMMoqm%kYdsdu+s2t**L2XB zY{|%gXtMTpjx|4{Im=4?WO!)dHa0SETo0e8-S>JEowc$o;bh7#v_=KleLX8Vfq6Zj zdCsuoX0fdjtTLf)7EML0qUPc+uS9eb&c)Wpi8|f`C1p{AzcWZR`@lc|{PfZlC$HFy zGwe@Ln!WY4=u{&^tK4aFEdS08nQ5<VpejM%H1f)Xg9cF2pCJEdz(twfvIo0ZljmWC zr|bkl>Zd*Y+qB2389Afe2lFP;73CI+sQ-KS4qiUrd-2udXAgEBAAhs+Vt?ns<Gq8v zsX95Vv1vLi_LeC_E)Yf*^A(LxIF*c6^O1Q`rZ0-DmvVXRyL8!(&5q=TsV;@}6-?fI z>|kD}PC6$uS^@kQ{ekXyt&X8pjM~qJ3|ZG=IWD!C(Phyy&9w!z8Vs}-#89Wdik?Zv z6+%=y0uZF2q;Z9i93_6tdWCq<ic*U4-*iy5!f5pUTSQ8Z>@rDe8hdKTraH}s(1U5T zz6gsiLY38j9gV2sEJUF~3d7O^%TP)77Q+?VWh)T^y?wC<rLHJ@;ATNj+4%tyXP@zK zp?{3?Nld52(@LY)yhzclQyDJXx+I&#sgtU35Q+vP)pb%(B)s2<{E$tHb<lwiW$Y~R z{q#U9+aw7hWGSnvwy?DQ@cL<vJnAMSr*&UU-n?BM;G9N^GK4<W-i2#PI_2j%v)H!o zCn+<i=Pl*5hYqTxVU&d4kn7uSs*JvQg@mzFt7~8Owf{2drZ`bliVo}noKcEbfT==N z%EUL-nwG&a2-feBC@6HsK;6gHaEneGOnkOsTxDkEsG3?b1J<wz>}5Gi#~sqr63~*@ zt0{Vv6=lRr%9T>&*La9~E$0f3x?R=8nJFH-w1WYvSpsK6$IPUa%PnKS*3oVwMzMHh z10&0HKbk3#68y7jDHmk*AgJ6rbfzjCaXOxoU0U*%1@ARVW`rR>xZ4H@rg^6T6H@KI z9naq2pokm{tDB-CQ-L89yZoEAY2z@2St}W`gieG%FUnOW{T@^f5a8TEM^y~n4w+7= zpptTQ{MBQ$k*kk%c%GG~(Ul3~P;P9UWjN!f)AYYkyDZsJX1|4XQug+PUKqd$Esu8R z<7u}%Y3@x#QI|G&70eVXjt7^I5aZKbe#4wma`@<h1V=qPKf+ynx<`b?pP$CTpPDRe zH>T`iNQ-P`+#=iD!V#slydu2W7;SdzQ%!eO?Y|ivH&oiCUQMpdN*I8<m%hAL^0IB} zA95$hPO_#vUZpy6&=~l2tTvGH9j1(-ESFY{oM!MArI}C2zu-xQoKkMVrmXUC@}au? zOiMkP<DO+nX6^)!qZq>A)Q-autkwMK#rxOYg4;8b<pEdGEcNUxX2?QTEbiL8(Kp*) z+(yw_{GdpevD0KVQCb+0m3$B+5Kj+sQ?&IQjbMxp<KBn)?7`(<yTyEucUhw<w|B_8 z9R#<rk{C2Mv>d2ga&iFoVlS3E@Ftw&-U+D6=ox2s`Pn*i2mWEmxoyLGIYSy0$QQ%8 z8Ir#bIz$%-){f-B*Gx!+YQ2{|-=N})r36b<L{?{eU!9ymFPnO$+k-FEs8S94hG@u= z@}MKFIFL*E_GmGGzq5G51Y@*w+_(z9@|YtX@c}P;gi6pJ2C8thD&32GAtT5^B<vS; zFAd3CnHg9ENO^Q;#!ZRG=~A!iU=wmlb&gL&KstSphcX3BQ#Q)$Md?Zci$iT|tXG;% zm3gXQ2}8Irj>BZBVj7Y_$X1kn?}sTVA-cr~xI3NWg}P8hVdQ%>53$?QbJqjMky<8h z19($IhxL{}!_BjL)G#S0#wR{K9;i(gb=<I&co-A!$1S9u8!9;I4dfW<XUYS~lGeNe zP)iUMemjv@L_^7F7QbMU1iodUS_3HuRa!7+dPP?lf1GEXQo?J>P7ptFTFOX4#D9E_ z?Rmy2nQ=KlcaVi95QVEb?`ZHYQlpPr4YP4?)I<R3RxD1XUTHEk80iRd5|0yK@){{R zVIlJn!p`hcdgXT#Yv(y*xBX0v!Aoai;r+@WvcqKBas&r+na(k~R^=#6P9|z*Vm17+ z2nb?>{K!Esb}AwtFSwJun@bl&rV9<E5-E9N(7DstK*|(t+=$;gE+|zhYw`1AZT%uI zs>Cqk9toh~JoXh8OG$vnh~_p(kKnskZJ9E9AaN00O{%D?OX)Ffq;>-pQ`BL?k}>X3 zgeQOf5R2Hw<XrP*=G9^TX#8f?6DVWUmIZ?(Cy5s6gCUT3Z}ySo>lC}c-Sm>`5J7Bi zFk^okBDi0<lSZSp8WoWBj`yND&s7c2)NC?(Tv3K&zZN#<qYlyuR%gnp*Su~}gQ+LW zyZ392z#8mrq?Eae-oiXlPBd4sQp@Fl@Sl)Y^0k3g8fBisq&$VWdm)+KVvP#VSpEj; zI*%Dv^BSFYwF87ZIE$4^m2E4{iQQ*pCghZ9>1vCg=5PNci*SvzE0fR-bn2EL0}3*C z$*7&VPkk|aH=BPy3${sXcPvF!#-$YK-r-UA3LMEupMl-N*-=Of5m@i(eDPir&)mDW z=;jNgC3*zj3GcTn0t8l~S&T$_$fU<_so14>JBJfE*U7c_x#|*7k|b5x)wzhvF1zOO z$JyYGt@4bywKVbglwPA`B3%UwlNYy`W~0Tyi6SLm!g@eAfoKFX18Fou2~(KI^P}-z zv@!v3q6>o(k&T0B6mfh#SnXsZm=S=DCkV$DdbwSYUPY3NSE|yBl-#V9a;#2wHKmXP zFXbwt>eVvFWxb)DB9L^xGFn`E$4H%WSY;OC3`6_p)vdoR=d)wP#lvkuH6%YZG1jf` z{H|S1xkrH!Il~&KVra+$pBjT&PJT$k+6o+Zt79beoiA<?6NG1P0wljv;U-{i=Rl6% zFW-C$<Sg8j;Wi)Zz{8Oj%n<A456ljBj114m;#`3Baf@8yHXfrBgGv{sSmR#vYmK;I z0KE_~;F!z&AlRyN@6{LIU6&0uY3RD7-$2Y%PoK}vDP;O%`F3))ibB>qB43VvUll@u z1lm#eX5$E2GA;%CYH2q`5&C-ctFx|?VGNM&4fyvJ<-6tI#e;7tg!p_rl&!&;EO!`b z^?ZKL`n`%uxmX%LCJie+3hSmmbrkWzofQ&|v<CylN0IuDVFEI^!HV%ONSnL&fq)>6 zgGKl9cQU5#Z4*o+Pz#tXVL@hO++0~~&aoHEw~=L$j%g#N{pU8*dd}1392ifi#<_xP z?;WIqo=Kv2dbujh0piL)J7XauOyu!MNix|r8$*JmIku$_nHpEKDzX>Lo#+-=ht3s5 z^=27cSeaM@Q~4eVl+o~$GS?aQc4p+OQeAImb*L13f5rB#x2x6pF(mpN0Rr9eTgjw~ zcDQr5T+SDl!evZ2L>k<?hb%4F*TW7JBg(}<kpg@vzwCx5CM>R9_0*}9fEP!fZCEK) zUz-!UA`iuszkGXf20u*o+NYq<C=;7Z8#yob>QJYM%Q@xleTSToP26y?Y~)8Xd*n5) z&8kBvIOgnhyrhBN_1jCoq}f?!d~zqpR=NP4!{5Ro`(Sr^%_ZJOc{pW8YEG^&nzrGW zqkpX_b<wzs?tF?Po%C9H4C25_YX!Ici#JkW{IBMYAxe}4yzLsH+0;VFyUE*7LlLOA z44YQ}GhSj#sYFWKIp<ebJAvNlOrK~_jYwCOCe2a$b9X5vpk-pu3Y8ODW!a>c_4-+d z)6U-T>JloKcaYy&_%9doCFuB{)acE}uy2SmQ{e#pc#dhMTYTs^dw4rV2QX)HKcKP| zoZ1{i0aevt?hN{*LpK|*PLL<t4;+5_uLx9i!#eg~-i0sW-9>nLp>O{#2mK)pz8f3) z!O%X@@DG{xx*t}H@yV)gIJlRxJF%(p5b9EBSUDG)PyjPlrldp%!+C*?`<bp3B;-2O z2&xa;-lj|*@kcObc1r;^9Us!TJH>(o<v=|T%3=wAw&t>PIG#Qa>CF2|V-st4eu3jK zZHOUH1LHzW&)j7{=22@_CSDCFGFiAu0-hg%IT?L<f3$_nD<o+jOv07f!j)x|gU`s) z9~;J+{)3!}w80TnC<%f-xQ$1-P;@!sJ)`g(BH7Dnb@SUp;a||Fa%GV%!SAWc%-^!# z7>t;{A@mJatk_I7j<QhVJPkPMm<hFm;RSlX+L~ln(O5|Q9{8yO3^7-Z+5X&JZf{L0 z5@W&1P<i%TH?B$Bk(bqH4w}>rG~Zl5jfsfM-VtT$6)C?yL5JX#*8*+Gs}*Z7FPWH8 z{e6&@ynHHlzxhpnmFCWXr;Go)mE*<H4VG(vBNe<*`}h5o+5=L5Q-2zjNW@=M21DgU zYpm9&49m{Z6UFKn8PA)~gX;9#4-(}Z$Aaa*8~xF{uT#C)BL#*3I`bV!bRiI7FXA7M z7Q(h_iCdqHFJEIP1)jj#TS@EMK&d2hF9Vg>pJ6Sxr<1j8uT<Je+em+jLMXkiVH1s} zc^ss&pr|w1&cTZ0)vc3h2fGk)btmJKx3ZOV!7DJ|MF)3H>C}6*o4~4dZu71nBhN9= zTdbDH-_zIAZwg__LJ!q)$pa;|&AwtS!O?hzDhJD{Alwf>8>`qI6HP<Mj1BLOF{(L6 zX=+Gn6G1Ok3LI}AdxL4#LZ%ZO*OW<W{BWe8H~=f9uxy=w?^iz?BzYq@VF*@pPUbl0 zu3jgKvc|FN-NX_FA-)zjLufJa4s&k`dm8oO;0>iXr%B2mxbtyJ19t+|bxud7v^$fy z-nenXb$2XmZSoQ?x7X6YL~DgRkhGQ1atsqNDEh|03PB4mHxD=e1)qA+UXg!IG=z+2 zZgv?XA}3FsL4;mGG8jL$#HoYM=X{h#b|}M+Q*aCocW<TVqf&W_GAna(8Hs|{DyKwn z`~lYw#l6~ksS_~rRdNf8QjfBg3wf?M1arlRn*7DjaPYxIO@I{QIXSL|ujXjV{1YQ8 zxO1HjkaRALd$oF%x0=(i%dJRCk&_~sRfSbruMD<PC{Hq0&=_Su>=5pVbERuC)I|e* zF*|KOy_tx|92vLZK`5z@cdV8mJqJcR8h(u<&#?$jwkJZ<_;TA3F$x^$TFNROayaov z7^XsQHf=~ATL=bIO}JQ#A0X(D6KE8qLo0$Qxrg;qB~w00-y8g5e|zz>;bfrWu<+4* z6sr`ikWkPwF>1Y-v9A`pUxP=vC{ZT8r6WLVhR$_P7B+NL-{MU*txAPuN_prV8o>hG zQU<ueai=lMmB3Mz%uwQ|2_3DlYW^s66)QZWoS%;0b*GARLoY`WGfN?^1b@ER)GH_e zob+bynZ2_!?1GC^H7Af{WHDuOTa1z_4X2>o<twtDC_%!cr{2fP`Agi<i(_`Oj9*+d z9M7T+tgY*I=ixP(oZ?u-UNE3_R)*yqjQ5Hr5^%vZkS~qcL*aE<3VCltsi;$l3gqaK zDz1h;FJ>n7pz>rIqwqdfJ)T=QCVTemBJ8jJf9$<&cU#AiF8Y0b1#}h@Njb8U%(?fA zRz@CLq7$yjlCDU5?i|UB3nD=YV-ny1q--50_qX5Ysp{&ke%sifDA`Vg4<xX6zf{+I zS66p8F^laAR;ER)2%&FlljG1tS-pZ5(SL7pI74zPXv5&#UuI|6QO+cCJ%HN1;x^p` zZ_}2De8D-DJK=q^xP?^G2O6k$8wj6OyN;Rdp$R-|N_|~jdZd0mz-3O~GANCcqop@S zdK~obo#piIonPP<Ca_<toE3Vw1dGx!0;$dG2x`RcDzQm2dAY;GHRsh&L^O@X*ZT`O za}sg~7If-Po+gbJPHA=`+Td2m@S_>_-}9*B(5lmf?0}^I=5l_vzJH(R)gNN(4j<(T zHC;^HWqO?ssWv{a`Mvslh($8BhqOxix|E6z`UEv~+t(5WnX~N2n|e=D7}G}U!0*6Q z6EA<#pP7{IWo??1r)eyBjokArc3@|Ogzzj+HtZkX<sD$S4g>Q%s0e8Z+?8OiXLp%z zShnb#%&{9G1_Ez1F7XaPr6Sp_<W|ID>Wj|+S(u!Rx{yWWH28U9bqY=qb2M_A&McDz zt<xs4{RJ#={4quL_r07js>~UEbKBb)?0q|5UE*@CCpcDt_adfVZgU+#j`~8N4o$aE zB055(Sai3y>ZrkGJS^*$;}*muWHv87amcCqs41gG>MK5KR@?H-9Zy3gl^2VEZ+lU4 zdHot<>Q10*Y*}vZq;2i<&d>j>{R`W(ECWa<G##$4F5iR`ngqoKZT|i<z~oPjYQp4T z9FXh-cV9`453lJy?4iFfp!pRaR5zt=5$|i6Znlst1ZTe0s;az7gUCPwYw6h<Vw-8o z!P>R=N+TGu{jv_!EH}3ujDm*h=LrtLHpQc0jfX2Yede>aA>|xm6Qo4z7Me4$M%uTu zlOc$U5kXuv04ST7@FXYzE{0`?Ox*C{AJdbQIdkQ4V^In&QAH}0X}rP;u1t#yx~_%L zy4Tf<_wX|ssSh>D?e>x8vB?}^W7R|$Es^0GOC&Pp=-vRM(xj<ud(lGUcsD0&va|vX zG2O=BDcjCXNTczzwBM%mbnPRUE#)LAyG(qjsUqn?t#=y4jz+#5z(MO2q`ZN~Bo4B0 z-31t#8K^p?lQe1_W%V<xo)|Au?BjRdW39k=$D^jecxJWMZkSJ9vm04dwJOKyYPI<y zzaV0ZOSDwZX-nCUaHFggZg*!^m?_iXvYEt1y=5YuhSCjS*FrP(sBQ6rO~G)!qXF*< z-+8f`#J)w2v{8_*Zq&47LnVkn*MSkVT8C2*Z`%40w-Q`2QW{Ocb#FAR%@Rb#jV%_b zjaRfJ`)F8C(GUPrV*(FJ+6^ca+UiJB4>9E2BW7Ehmd(@>&3d_7<P&~&u&3KaYRDW- z{FVWob{{gTyhWiOsbeACu#hg<96s|yyA_t!*e|Y!K51qfE9A0xrg0-cT`P1eC8J!x z<-+}TA<ne1Jjc<=H2GsY(<JK+Q|3ZhP(ez7OQjw^vETuAe(}e+&!vq~YgaHE+GRYL zQ|x$V-VnQ30}^crPz@uCH3r>2Ym)zcv)FJV;~pMKn-8r`B-@cvz)p?9CrZTk$79yV z^{}}mLveWHaauK=W97Q|?PFeT+C!Qe&11i<la$*HXWS??AS3@ePDUi>nHr}Qihnhs z7#=D4E#^(LonV=xu-W^L8MBe>oXl6SQ!;$&A6f0Px@5!Ab7pIi|B0V4D=pg}+)?1$ zDCtr`I*cGT6$Nx?e}eBb`TQl=lGIx~9HV-2Fk}Y6Ab<uTR4taRZXQ>knQbs}<X{c< zQYV6c{`u#z(0T)tjF(=nKbZ2WxJZ~xw?nw`Z|GYPD9oKiGy;At=Impy{{~*8BvUd4 zP8@6}a&pN^mLg|ZfFG2rGjoi>P&z}e!5Aa}u#xA{yhi|{=Di%4{FfN!(q$TS<ot{s zDEyRL^B!j_=CtUth)4M~6NY}3xiu+Rxoa6XKUaPYeNKq}#`zNUMf0d^yr>iqGM?FP zp+nSaQaf!531~@6TX*^lE`&WT!+FC3zd3`0CF-f9%<i*fn)k?)iA(r41|O&Tx{L>) z^sO8bKH<dY1I+U@fpEsC7$DK+X=Z#Ac>)YqC6BJr0q-Mtbxfxf*Aa}Hwz}CU4(Vv* z(j?vqT{k!M(|wVc1ddF&bDO4)r-8MuGRhUyP4G^8pnit!lco~+J}fVMSW2}BWe!Fz zwc<{;$W!PDajDd77o5fRN_#GBvpEEkT<2!Xf%!PUtt7>zg`{`k;k*0y_YaPqee>nx z{fCpkO?vO2KRw)gc)0gS_v<46MK0ZIF*yfMR=j094&PDY(cAg*a)$fWBy+<WXpY^< zk@z|RV+AT*sU8>vWq5~fE<r5MPbH_&0=Pu5PPD-mSmP9$pMVt)*>?V33a5ilwhFC# z9~DgYt4ehNZwNQZ4U;7;gPEn^5Y;%mthlM$uKd+`KJwN;2~n?IV?T63V8Xhy@J5N! zS{F$79zlw`R_ouHzsPYpM<QR5$eAZ`rK=!wr4lZ&1d5LZLJr<Q@AcOCwau|;X0z{w zXAv{QD|?OK|JfIkVg{~GI3g`eD#qlnVex4tLnSKzEcsy>z?P|@f}5E3npt64+n*A{ z(n<Zq?DLT2XtE|NUj7Axn<>`OdYvn%pCJkBA3iZG<KW5~8tEXyH<2MmXSR-JIU?r_ zgnd66yEh>9h(qoN(&v+lV9O_Z2|D)!$sMdktUqeC#zOfGnJAgN-K>o=yK6)!?XDO# z7c8WnwK}C}<+fdF&Rx=FQPokT@+YLOcsxa=rf-mYyp9f^JcT~7TJyVtTA9b~-+=`k z59EYwwR;UpZt@gD?7UJY5LVg7prLoQ4&<TC(GHcXoVSgl)w}_3%e3YegfhJfylvYJ znFT4CkV&jIA!Ro|RN|-TcZobH$tq-ImByo_5l7q-5sro8&?8?ZeY7PWcn&_U-IUX) zEAHr^fa<v#xnAkHktGU#Pfov6lxZ-Dme*ITA9k`e$Yb-%qY9@sI55_A%=h<L9V1WD zXA?1qdnE4M<~x|%J>1fMbpQTe_n$mE+WUX^4@;C|+a-=HJDtyXq3Dh_h(u;z?a}@o zHmKb`nd1c7`;*%<v{)Q|USjpd)_%lJf&*ORe{Av>IQHQsun)kvLm>lUPDj{=SmvC3 zeQuVT-nf8<zfi+N74h-_``o6hmwSuj=>=~1x@mDJFi{?mm?EYsFIXPJW@Dxm^IHjw z;C3wQuz`)*ZY!pV4D>1fK}z5=pj=^wr|%xk&)X5hh|23J*$rIfT;`Mc`AupfG<UN+ zWln=3<kvr63A&Z0D|1piPRWf%gAI%S7+X&%VdEmoo8++ea<F~<och0&73O`u>$pH0 zq_fod1Vwee*hw5kf8JF55#*Rb_85;=(=$;utd=4nsioSki*|?wB-dD+|HdLCDbQb? z%IE1qt%XZn2=^2aFw+@@r^hNeG@m`dd8dO4OS(a!=OcHO#DPlF1_=IpQ1LVDuia!2 zrTZvmkn#APMlr%Qyum~o$%8NgX8V9I*Jv4`Y2Z`ZE;ul2+`q%P^VauWe5ZMEm^2^f z|9Ryw>#I4g!6<U9>osU7_1>F`iE1SU9bCgSEEd)>6g$!a)U3%76f9>hS<?me%C<Ms zFX_{=YLj|7<uaL(?Vnx)QJv~i2?iaN6?d!%zc^kUP}g5BmpJ4U*K?nU4U?IaJF*11 zm($g|rx!0DFJI5$xuaaED|gOjr<Y?nOTBK^Ffj3dd(E)3n!kRtWv5aFy(MsEx~z)_ zff!w295O{Br7?OKmU!y`^1&$W!tEfCaz$&RlJgcF37*W}&a@k*S!KnTMFAl6=Ein< z5l8#=Z1s9}!n0<c6Kyh9x=RHnbT50GEoCcP!(d4pBij!xfA&C*D3ObfJRLpS3Ir8W zp>7_}OQ8tx2#i<L<L}uZDPp&%<y^&RMB?>KbP6<N3=yRXoY6iJV#}aij~)eMnw1N= zF+z2fF|Q?y1<`UK#j;)2NTnBt+sgGEfGr!#3jl3l@#i#Lq&C4wuGY|3t|FSDKHzrr zdckSzArY=U&p|hGY{USu-XHK@;|cN`I$R>K{nOPb4ga({^TFwfv6C#04b)w8yEOji zqG*CN<obCw8QZCF0(vXNAX95yU<!?+{ZpO%11b1Sv*li+dI<j@3jS$WjG&Be;D=B8 z9cN|17Ub$1NGsK9USL4K_tYBN{1`e@dHh>mH><vJA=m?l1i2yK2(Yfbwq?2@{r+${ zJ)5nMt4ngAcI(rok}}miuP0fV6wn~8K6^l776_#FPTR566+2rlzyAu$hS+7Sm*jl2 zIGN#~z1ayhs5)dgUa<v_$4tO_zuRlgG9tWa{u+izY*@lt`@k>uVeT2EDR{clVNC)Z z@|Xj^(&RD2^EbFsbQsfSc>7co<`g(NHYq>e@$lLqp(ZTMljQ1OuP@K(1t<{GA%3Nf zuSXB5&pymB2iWP*{*3c1fuey*ua7tfA>=RjvF-Wt=#E`GPAS6<=CKy}2D*CxIhajQ zIAqWL_I!Bak`Hw#wBy?@=PbrePV%x;#R8*)ah{@|+}t%f$_u!jhGH!tm{LVhpdxY9 z<XA}}y8t3#gX_sq<RI<X>)?ViMoz+Jh3#3nbX1TrmM_UxbTM}!P~Q!z<w!2-ZHF{d zKi9_^qcrML__XU7AbT`_J3PPodWq0k+WRI*uQe8LpM7$5{t9=~;G`YyIKw^&7Q>b^ z>W_!v_C0?g^dIh`=wjJElgCp<7BcFob`lypk`-D?gG$C_?Aq-g$6)7c9QpR;yZ=2~ zE%%r+gsR*bM~9jU-?FfrWH4}6L~^djh{k~b7^`jr3PX*>;`r?9WL7V!Z6^Rq6r<;L zJRuilFXS{aP?d>#E%t-l=j^9bhe82dS8@1yacQrX3a5N>xA-39|40@IY@@;@<P&Lj z8M*G?Km5;Udq?|E9zOo&(H@hqX!rvy^Or|YpFG@4x6&fdYOduZ*J?HU?<<@af;_ID zsoT~z(`-R!qhS~jb6ik8aDUt;*?5K{zZ)razYfXpd{_vS<Gos<e7)=O@9hiXjVb!} z<%7~V$?X6=A5PboFZH03U#qI~gxQ9m(VmTQvZ%-D53mD~tICmJiNfseTrL&0x*0#O ztIyIdU)5^t0}OI>WL0k$ZOW>Zy$tORomkKEw+cX7rx5fU8CiGpD844|hpp0BHG%-F zMF39k#Jg+s?c_JODd0B{Jrt=xhGSZ8%@!Iwny+!s#5>&?->#?c=p*HblkLzrU7J3i zj6aDChs{s!Ipx2U5ek+&D9<V#5I!+ZU(PRon6GEJXT0giQb3z8q%yVyEM`aj_up_G z`Rn=OYQ3S%v$L!9drpuj06?)w2mW6p=yN?+$1`U^jD0uBspd^v$^U>YO-!?i)O$!q z__b<TN1M^}8KD0c?NHvHfgrTU;s4KXjzy^db3Qve`3lE0{7MD#ACgtx8BxeD@?&xe z65-b-u95diNzkgix8(?n%P<;0JCBUgj56r06s}{ULa8761d9T%*RTbfl(rmpBJrPQ zj=T6{G=0DL{j;M9wKcJ%!nFt{HLpQ5)>Fc@7SA1{wGx{f;FcR!T5vVXcrVA|64`#| z!hO#@NXI<C=uN-ZXProjf4I#wefDed1j%d8ahD}FsUo>ru67_>3%t~sx_UWg!I}E2 zfGU}&Y!URv7MojLe(V6!Xtv%i?shFrST2+Kb)3OzOdN#Lsl8Gzg=A9p3s@L0NWY2e zb=kJ^bE0PXAbZO&eXTLo+C@`tbHPR@-Q|KWCCp+~S`CktR<@aYJkn&r0ymcz(&=xk zoT9qvylVvn^1)fW8-bvMGRVS`{A7X}IpiPC_Q+6Mj1+DcZ@tR-Cig=k6YC}n(ILzl zR=*ZxL~Mw=b;%DchpWwi;}d3TJ{t#LYn%bp)~hkFe@OkA1~s7b_7}+E#&xsH)7sLH z6+ERI|Gt;}B_Cju>}7Iig-!md$lFIXkj}>z$K0n8?9uOOG4ytb&K&+vnr?|zE}F`r z9bLvFRk}%G-$sed<N3N?j{N=aC(FgzJCGZyi-(3zrr2#2G~GQOkHr&rW+$@8=7%@4 z)hs)AX3GsG!NJn$=5}YlJi#rAB@;Fd&;~-ee>GR*OajC0I=DA|i8JL+c@GovL)t}6 z9Pzd_EA}Y^C{oULOaHWbFG9eTmS*ppq%bZ|G{Pusv_uds;HEZPb;NS&4T%rqJt(T@ ziWNPq34u8^`$mcqjA~h!?eRlcu5mdft5z2_0)b)f*2(Q;S`fKr=xR!rV&B*kbbs=8 zIX`J=J_5uK61K-|7}3J|SFalj98lerne%N{uYKttkf3y;l71e}O9Vv*!hhCkcWQ10 zc6wdj@Qs%2FKICAo&UEyKH+98jC34*HK&5R{<PF^iX+ZS?OAEtS%IHIo5XtK2v{l` zUwvpYtbI>R%i{q4HlfE|XjzU!*1g=o+ALkudypM-sS)DDO9v@S=7b9e6vmMN*4=4~ z8>|7VivE;#MQAOHK+cl4V1k*HXRGB~oDGF2Hz+Ua5ck?sfwF3I4=j6VfD$y@DjKWQ zGI*nExsBrlc^aldmds&0FOyL5(>0tW$YKQ~{I6EF$MDi<eeDHw`LpQ?IKmMYYo5`0 z0ZV<I3lp1$UV!^{x|&bnamgXE{bD547FQ>hNJ?rqnI{q~Av~1;Yoy1CLNF;cf@o*R zM_DnQxrmtq)Gxn+-}CPO!Hx4gE$zfJ9%{3!-~o4^C=Nu38lu7>@uS?6AWVR7Jd#5j z$km&w1vlc<UYmQ_NG-PQr^CAAGA)JO?4o=dm=bY`W*ZU5s<+x~v28XIVcR*LtuCi< z?cpUj%qM`#)Sf;iGFu~9B;Re7n0gyEun-)xn)Dcf%Q-GGgfqT8od|~`y9tGQ;6j!* zr#I253nTCFcg<HW)KCc8#xrql4mC)vWmLnV<ZAK#V)?^DQNvaA)9KlI))-YiB4NW? zlWgQcQ5E2rnzr%Uq$kVOIn>PmnIW-$HCwJ=@!)93*VnjJsg|U!NSBH*DcV)rTJ9pq z_3nImr3N`Mf95lQWqJw`Q{;=~#nsvL5(h*DMJha^R~2XTVU@b1G}R*qi1nmYimC$< zCNKxslBS!}R9j0Y23X_J0+!VbGBC!ozdSnt@4Vc_Rrl}KvlY%V#Qt_0l^$>4m)s~L zrA7H|E_U4a!}AXYCP7*L8aGj%^w#e<Tz*u=v7iqzX^Q6a+2z%0fnng3D4hDa<^X%s zQ?{kihqltH1;To-2f0xuuGiVl@zrXDaXifNOorw7)o04z_53EaDb41j8S#Pd$~a20 zy7xDaOBkyTP;`Kk91Ode*QH~p>)heWZ{MQ(p0IChXa0Lu_GYow;JN@w&A$jMH00UD z0%*OQ{dj5Hp$?Z9k8uhQE<kRW1?8JWhoFya64M)^o4!>cO6N^chm>s#yG0S!{sLN) z#|ICz0W75~Gp3M~q3CG4?|kOl=%&^Tiltl<$4``U92hH6$_oXn0-q4p6ZVGxkJf&D z6Qmr``LAANN2VusMN&p!L#!Ut4%VxE8$8rGk=k<nq@J}in3P*7It5c)a{<SKI}((& zFp)hhX**t`tR-l%A%WROP+XH;>2MA(ap;Zn9)7=kwwhssSPVed@0aV#;R34}T=(Gy zP@q&vJw_o=^bfH8&F|#L8Y$>3u3VS=gJ=6lRSK^|nz&LGMUB+Husy2^JFV%<mqgBO zK}ll|Q%=aD9%fp^4|^gp^S7ey__#;Ik_4icQ<M0n8wQmn%#CiWPRpXvaCZ%g4|Ipp z1KnkwcoOQ&$KI7iE(C+pw#f$ngu&jl&pqHw6HB*5U3sb?>L)kNDb!?l-K0&m=F4F` z^C_<1OyycMBw~B6R<50u1WtDjy7q1rq=B*8lgUp{Q$n@RStAqc2`$g{6oQ{J8m9qG z$dq+YW&KF>?g}KEr2D1wY;|VJG@1cbc{p2fFHwp89mF;H9Ijh9iiM(?F(yH6=rfqW zllN0-h32UskuheLCRZ1g5^A?FsE_8SIBI03Gg1z`#D>DKy1IPxuB~h5r*a<Ah8Fb9 zqFxIGA#6^pXX8;zAtZJ>I3L`Zp9W?eNy7Ol2<R}-wM&ItB0`u`FY|`oE9pR?s>#`E zcJ8)(ffciM{kyW^oXX9Xb5a|!+LFW}@)OWwTSpzTbU4`VX?lNtTJ)N0uALd;W82Y( zHDsKL#m16oyjPdN+DM>M;D(4(G&@KhAUTatT!V<JK6N;`IWfAdsR=8JutY%<ktVCj zATwo;v%q)E4JfsvZ~#u^nw~}Zb{vpvBd2?P`!cZYI!L%^_0U-Kmq96Df{^YpxTy?> z4#hrj25xigJ<wRV8yA(90*Q@ap5hhV$U6ny*akmgr~=2PvBpB<2FvDmMiQH4`57ED z3-lYz4wLfe=!`tqCenH4a^&yTn;PwWq+vtBG>l-HJ@9>6wW4-%3cKNCh4X8(4rcHu z+HO_ufOUN;ht+ia8YCH3`dVigegx=*8Hb>AWOu5BsPg_aow1j)!L-gfb98|cy}?wN zjK*xb?bA9PAKlpy_Rt-dSSE^Jbk}A7GE1D<KkV$pL;Yzm#yG5~0Cp8if&ZMS)bW?0 z3Al)}RA-N|`@V&e3OP}VYKKXZ%6Yj|_OgXehwN<*k0V7L(abf4XjHP<XAiKO`f4_e zbt$r)7b8_}5c3X%t#F@V&yfY7l}%=Jae_&r@KXvz*0d*DqwOt7<Fm4hUC5hM#Mjfy z<2SX6IGN2Z9%_`HObkbbQOAtybD!gSUY69_j!Wn>^_j%MU63P1Q`mx=X^6*GN|nc` z15!fjqE)L3j!^=}d?y*B6qxgT(5Ra8K~eXd<cmJ1D4jqgA*@b0N=!^wgLefznw?Iu zZVK}A=EG(RG0gn#*$>lq;uQ}SL|0sX32V;$l@FkDv-cKP=Yw7_*0N_PGm()a)thU@ z^Y!G1<<;2<{;s~CU@2)a`2p7zEUzvnRQPlTU#+m$;!WlVQ9#k!E0ogOuV$0;tK&D5 z_1W@=*{W4mTAOk;d5!hx`Qo)ZweSA@o%PkL%hmMwa;Ec*AKuK-8v190%vGGcxq3Yl z@Yk)@U(JrEIK-ccB&*rQ3~R_IldA<&OD=gL(IVt5NVZ8;e}`DXAu@6WRFp<he8j1| zDVdfSAO%7~b8O-6<iX?*tvL=W?BLeR*^fAT*jfdB%Or7@<0tMna?mj+(|YRl!MasH zFOUF#xfI%fuS4%LKv|yF1?0Qm;n-LI&cM{y-w88@_c<%FPkwT%r_TV*70%X~o$S|R zui$Jqn@}M#K`hKC|Mp<AgP%ia5D7sU<jX@KAxv2Q9lGDj07mIcoCh>(L(?B9-w69K zlt<a^(KZ&GGyBOnZ>V&J0vitz!I2H&fL##}l2~?9xw%4qXrc9G^W+BBE<c8y$-nmT z!#Ztdu+|bxTkK}A%J%=}L0KS|(j$qKe7S#Ox6p3FGy%IApmt7YFi*3SD4&$RV5C;F z_44fPOvF+cAfT`?R)!_}za#QLI}u9fEqnD)cD$igA*4EI@Q;sh|Lz)jw!OaKev~?} z84)s=?f=anb!%ALnrjrq;?ziR-~iV2>;&h~{AGG^F<b2Y$P8!5eaocSc=>-=fOd{y zu*d>r44~&k6ViA}uO6tksre2vtl0*oUi7GnBf=XYGd~u7zZn`v6UA|tywr#AMZ{Mz zA1<L3TqeD&nagGthczDU(L+!|YDdp9`I*DDH`Aldjr}o?q6*wN7?<PO<bO=XEuEY) z$@G6zPEv)Z=3uLb+^BKBd@E}&Jg<wv6}tyZXT;=PFq@%xgSy!m4Kz4|*CEFB;qq$1 zL(Km$OaWF+hPI7u+2c(asg44)j?4cwApi5<APay9S^Cn@W~hc$0ed9()IHJT`QsSb zWD}gY)l-v81n)Nk$ods0vFc_<lCCShp>$UdaU}1F%nuHi@5@K*br`F|Z#RU)0#jEb z0HYUCvHrB1Ao`DJCUGre3ck!#6DoF{{*etP6s#5u1WyAym$)1JG44a@=HwX!SG?N8 zSgiEr`#Q+!-2ut&<GN7CCdnp0rfo&c2Rab(;HZ;k4^2Try7M&~`}^5)7f0$ruu(>H zG}sDH-rS2n44Af2db8OJ1JU1bD$QP%s}d3iP(DCYF^OQ-FPA5}<WFf&c5;lEXG14s z1CVIbp+9uR5!I4IVD4l^#e}N_efHoLUJvyFF;m&xnRBMx?jvs>O>-Dh&ALHO81iRF z$Ry=@Z1@jFbpYt4!abhlDrqQ_=HV9U$0j|5G<ri3>fyL@tSeI<vWI-h7WAyyA*$G- z8e53pdDe}C!=4X0%zi-*ZDqk|7rs;~x(I0&yc`0wh-79R_;*zgd5m+Qi=e<U@bwGu zXs2XbYLR<*j;&;f+KHkC271AYoAIAgE8-zVr)!fdQ^2XtJDccxFzo@ipBBv*#wf>8 z2ft#7@{%JBQR+OXf2x>x1#gdeo$=}QI%s^VUeg0%g|5-rXmC<PZamJ=<luJD*`ZUi zB^3PhYm8-y{dTNM-evwP@h!zn*mf{dDcpdf7SY=jp`;Eg))@N!d8X=thqg&_W^b&$ zqw?I|*1h;nb=OG0Gihj&aCq@qFh~Q99ul$f<HH#?*AL+X1WxM<B6|{<?9hAIqz`G2 zwpn@2$34mxrPajRq$lEa<Q@J}Cp4c6BK-#nSC}UVgV5K)terB}_4u#n>DPTDd*%!| zJ}{V^o%PlN$Tsk((xsJY{I$VKz9JZ|Wqvc|V;Y5P1fiFn@k|Ymn^%VBRGK6B>E{*# z&e~fzu`HhYF?E#-`OfAE^`HbMkoqgu(K~gnABd7UZSGY9+3AQep5c~~=t0LkVw^Mv zYLZPc1lovrah$Gu;5K_pzdg?I-w{z`Hyx`GDQL(7zF{pH;0nG$FaVb;EbTsfbMa_- z%opq3^}}$;!55LuUBAMKEQmvHRMI$1rp4LsvhWkE5Noh9uTqPnX&7sX-Hb|hjm!gE zzD>BTRx)hKy5EfFl*O0j$$7-IM_K4Hb*e+Px<(DA)5Ez|R9)P4Kl6UaGH2ce+|ve| z4*I4$b8JBGX>6iA>Djz5ard%EJ&h}blWwBM-CeDw@AlF2oqX60=vlkQvb34?9x(RR z)#8|0c=05(@~jvfJfWAy-NxA&l6Q!Gm|o=Zn0kRv^*=y8x}$iyTfBsfhqdH>e{@-I z-@SXcNt$ZmVTX=gWba`|FdIMAZnCG%wAt?I2He!-?T9Lp{uUKMzI3*$QLTXcubE?% z#b?#sjzdz@(2Xupy0`bVlR>xUH%67%k?KO~>R}|KXpAQLf#i1hrlLrMEK)y0sXj)z zH;ZK8XUN60<{E-E=oct<hJAt$<&|&g2N<Yhd;ljRq<j*Xj=9JrtiWNel&blC);M5O z!#smUR%f+njb`IkIpLLCYHPzOkF$w;mc)UyHo2LurH?($L>t$Pn_M+Jb^#)t-`YgI z=x(9?X7L6msh-VFQ~_M~7TWLE%N5pKz_OwQ?oAG!K0iEq^3B(K&-Wh|=*s50qI(PF z!zR2|zZd*fNz6sYhV{Y<>i(OWeSRYl@re)rFQ=-eX+-n&&vkh4%#`;Z5AGpEBJJ z{@CVjX)p|1krUhm5<rw|9ICz627in1lE1ajz7%_I@a4&_{Y3IoK4UkP1m^xy(o+T( zDu}Z4!Gi%j6C*DLusRRf4ZE3$x*hsSVdH@c^R>tjFkR+{L*NfAd4%lfYOV1jWBoEw z^7<05v~x2IVh9Pu_?sjs>?BT9AD|`uG))IQJL7h4%4?~x3PhDrfRYcZ_ZxUZ!jU=- zFrub?da))|OOV9gZpTZp?GMIKxf3uXTr9~?X8Wyzq03977DolgMdLMvbmiA`imLgX zJ@F0eCG$GKMS7?a{rxTvZA~m5m=F!X%?rP1^8yc*5){N4J$zw%R?_Ht^eH81tR}y< z<S^m%`L>4e!xBVL9f^_v+~9K?AxNC~olC901$$9aOZv<uY9N~CTZA$Z1Ncmi)UQm7 zG+YQ=*0O&`-j4K;;pXz_oFBG3N+5X}*8F&cSmvXzRJVr{D6ZZcX7R3N?sEo}tl~R& zN9p!sJsN9EUoG_Tku<!6aSJZZY8n1UaHbvYMU<!mkQ|C;^@4U){hZ5sTAwVJlko|d zbtDxNUsFDZC-{X2@R4YkAl!n4Mm0HE%C}%In)Jv;EmH^XRjmzv(TYYd#R<p94mtpC zj4e%4aO)>c;{!^W&S=fnD5d-)8wh#JYHh)qdBxJy<%&W&EofKOAE#*s{7cSCaJuaD ztiI;TkGN%m3XiPfs{(faegL2pa4u&i9}phFwU0hnV1+8k^riC_6#in5#0P{gc_v#P zQXy_124FmjuTERwmnTv)rjD(C`N;&^pF$B}wi&jD9KU>bIB@s`0`_Zhv?ixv8a;tw z{BW>jOK39ZPr~^3KzJp>#cKW*+ffr-kYZWvvHAWkHwB#_Q$XUO_B5STjq^>ykkYf} z5wQ%<g(%&<3EQC&&{!U6z~&_Y_frhRA?Amr9IWfmCx}*GPT{<Zm9ubKK^mEsXG5$Y zyrTY3SYp-29N%Mu!`T_zLwPl`Ys5`s7*bH7Hxm5O)%yMKeiuQU{BH8^a@Hr8pAfBy zEjCK9GtPSNd_fTJ$%yYwUM-hrcf(504szI^o}S|Gw>*a-qJ;81`Q7hhn~icDLd9Zr z;7ca1kqR>A1oOR#frt_nB=;s?5Z1|W5!YOZTEl7Z!YcnUU4OH<m>z$RUCmgd$5js` zXyat=v@{tJFPlV_3Z;S+Efxy)h#Fo8R&YcTl;Mwfq_NbMfZ6IuJLBr0jfxmGa<Y42 zrEJ_dS0gc>b;$qhG^F+%XH9NcQWhYv@VX+KL>5p$vUY^~!Jes150s{A_poxEwC<1l zB1AOe$g%jF7rS$JAfJB&j}%8)czBX+@K1N<>!-3Sae4-_V7IV`ZoW3)b}t{#rt8b6 zxO_1lHP9weV#UVzWeayX-X7NwOyRPsAwPeOnWIC^u&DvSqA~;HY4YY`(O)@YWB$_+ z={uBFT1{(*-y@<s%x!J93B|V?d5(pKz$sBb7OXZ%?WYjT(W!a^usTMJCv)Z;m%9IZ zdcnn@Le+>ej^fr=Gy}?|akj$_mi|OZvt?=$@3#sauo6NGPi<FQa$&hAI*(^&;%$NQ z2+8_y=BJmp(}37iV%=hN;Us`G;Fb_1>;2``{0!H25F!Kai%EtM4kna}Yo6y9m+v4K z_cxa0KF_Q**)`;V%SR<hs?8ymB+VNQJg{y!d1C5u4W1ZvLak;$oHwKo#H#KrgL+f9 z@V6B<IwqCS@l%!m>_H9loeU5?^GIPx-PeO>w#k6WZ>R}Thk<l0QVYP?j?cbp>n1$+ z*YLJy*AnoZ1~!|<#I6w(GV1qoc1L*BgMK{9gC7vu%bW<^2rq|D%1+n`vIGaq!R&*- zgVKI$E+Y2Je9z?dOz4>FXBP9XGwdAuzIUrZ(oY-|KlPKmZ3<@8RzVD9V4`SR6cdK1 z;LC;3PT-s%TVjykig~KSY!U$2ViFkHtB`Gi37aVw1l{>_{Q7J)JD#txiSYjYGpq|A zT;S*F{21YS8JD>iK%}(E)uv)JaK@}u<h*9IpWwpC^1@r<v1mqLZ17$3O3hXbmX<>V zHsdHBF3(@#TvJ?TcmF=F`^DvUxO$d(7MLb!M%|O;Vvkx?$f^UU7SbZMo{*7c;~{8a zs9#KYb>12oBibCt&n8{p|AB*@3UWzzS(A0Q4Q|bBo~)tgD9ank8wj)e5<_xY)1A*h z|2#LSPWh!~8t%eJvlbmQ0WvgLg7k@kOpVbf6M2y_>|4=J<S0z76itq|K@O8-B=x9U z0JT)I5-o=*(L)$BjuQ~JiJJzY?ElcaXu|&7BlH5NiKLD!n8GeBE);vxVhTq$&T@bp zDySdaiuHCzp|A*xbjUvlap5oN%3l%#_$fsKnlvL3SgA|WG=M&yabU|58m!Q^Hb^#~ zT1mKe;&Zr~BC!nvyMO<DdT~b}YPd)om4fTz4>)a2Du*apbC`yc0z?@S;cL#nWGSY6 zyKnk0>?1En?a6D9>3|$Buuwt-e-V;fGHwq_RHuWzWcaO{&eRa-Jx;skrjfrm^4B_v zlq3pbCbN0oniYc`;+_6s+Fm&~WYL)-U$SqJ5*OB3GH&%PrSc}cBP8_E5(gxG64M~V zobWJ21+o25Vmc@rq0<o(nA?4sDnt&?^m`S{BXf6Rc#UZ`Sx=DDnqu>1nrvk5jBdis z9<@fEnip?|f}25q2&pYxClTV{uwrmck2T76ufP)=4ZC}FxzqzydZpYvqgf<5wa7ZY zbBJw+xNhX}^7Z`KChuQQ-@W1)FNK2Puyc*dC(gupA2xYtr0}|EDsQILo<wL=%gR=n z67-IL<R5dEA{Hxu{~upLMsFpinB1{PX*sABSi)*TeQ8|#-ZVD&5E@6D;kVZMQhsi{ z#%Aasd{Hlgq&$hzo3evgaSEYz3Rmhhd{34`2wUIr);%~I^Vx7Kt#7!742wut;dasL z7F$9T-*>LDHAo%vC&m|`8-VmKTudrU^KnkzVflD|EZC#M+57Qww&0{WyZ`->mLjxF z7p_Y~MM&@(szs}}6dqx{g*CrWgpRDWcyM)b0iT(-h;z8?B(YlMuTo*~0~I?y+$(F! z93mZQ2LvYhaXgG78c5{H7Bo=0HNNps0*8)93SyY_xXux99Xb#;C_)xVtZ8i}y4#ab zyyiL?lO!mbK1L>WzJWxS*@+T>PqYUyl+*Z%k))o}w^W}ft?4G(HsaQYkc4Y%oJ<%c z+C~C(^hVUWra<sqF8O644+0S=V7NBA7p$Z*WZH<xCSzt;p$&3-bOaf6vOp82IF3Ma zfvTQdt87J-63lOL?sc5#x8zYr)wsn>z`P#saGzy=ROx;`)jr7V5SEk<tJ4jU2>stz zb8O{FMg@#kONOARCVp3Oll1Mj8;3O}g<1C??3I8EIxv=N;XJZkEJae8vsF*cS>8T< zb;lA(F0DNOH^%ut|K}#fk~gKS)e`Udnt@`dV2qqu*DZPlb=P|jx0|nmQ*KH~5X&46 zBBbY;Cy027cR0iyim1#Hu|^BFBz9zIvT<!lND(iduVJBdM*Z~ETZPoMg}QrG-$L4u zF;{5nfidL7O25*#&~p+TebtIyY0h|(|2yS{)!3jn!%_V>K_gv{n<Rh%iwgvwTUz|y zBqgL<D<8@4a~&g7y}GzQI$%%Cp+j_QHCwK*Ua3`MiH?h=IN@j<lZjeNu7U%ir^J)4 zxrTG5?F;E>>!KrfUDr(8bB>t~G7-LM{U}v^J(YNp<@m|0<&ayJ(1!yJD;9JvSt|JJ zcgl32@8y=2xZ2t&EA<()JeA%jrz?hnIZY-yKCaW1@y3n1UB)uWw$Z;Y&1&l3={$<` zb&YD>?T|@*FLT<3Jt?U4tz$l8#%RnIl{|Hr3Z{%s;k@XAPDt@=Sz8JBt*(w?F$Ya9 z6e?~@ka9`=-kXfIyAO3Yl^JZTPv;Nr;Yi0HjxepA{eZ8?3koIpHSE~e0e!F#O`-=K ze9V~+B(a)`4-rs8tFUO~x5R{~G!~GEC^7FivS}I6%XV%+g6G%Z3MjN+i<P`NhrqY$ z+=3=^eq7(cLl$_ZEip}I`1QL9BDmGQf9m3-#nLzNOPf?HeS_`{I``T}wUy5~#YUu7 zKCb0dbls%MRFvjg)oCTcqX?pl{V>>toaeF<XPU3%DJGg_ou*j*?3S=)+Pp{(+BUQL zW}U{HHSL1({_B}eCYV3j5rz?*9Vr>1$?Mc<P&YRp_4oX$CZvQ1W}-Ej|MgoB9ViFA zIoUntD2c`^QFKlFv8kC~km<;9b(0n(#xy=nx+vq84^YM|{iG|{J<N=-k@3ZM8)sX) z>-GFK;>0+~WKKK0zJrAvgetiSk&DWb;#Vvl3!Afm&-G%pm)1%d9$}67`beSjTXdWH zEQ|q{V4_XEO|95~mHak`7Qf#k73c%Y9K<6D!8gYuSrYYWUJFdATB$E7OsP=M<?zz5 zzp8mVra;DG8}Gy1O1T?=Lb;>!+3GbCX5=BXvW8H(-Ls;*93yJm3*B6i7*6PP_|`^~ z9!iCpI2U|Anx8lCw+tj7girDM7W>^>eHzmQPElaIWXRf5-1m8haS0l)6U^oh+>YJ2 zL)Gsp9~PrySP3>qYw-%3Lz&*a2i6VOtMRqwkohL>O;|()ZEOgkRW5b(P!D*MOnW(g z58}(MsV(UxM`5|2Q;cvBT#;I;ku4YE!hMpLU(Hu*>^porJELcSLj@POVX{dLL9F3J z1-|eJJ|=-KR!e5&KRjEmuU0dXO3456;PU(uF+BWLYP<|3wxvps!gV;MPc5VgN%R;? z{cBv(d${B;YT&vNWTCj>=%G~wkxOkP%&#eU^0idZLGS{iB!(tv3dqs?1EV1RdrodM zz^iwN%6+3(IeX2F$(>Mv%mH^_5*25n=c$!0VYhIZ_3Tcd1WJ61?JBZ$WB2gz`Tm#R z9PS-G+5LLY^(uR0DPaQlj2k@2xT@=pc~ZHEW?mv~YGdyhQUMp9WRyrcX9uSlsK&4W zaC%qb9Yq!E_)_9rv?QM63}51^d`(Te6S1g!J5W0H#RB|f@Sudi7H&{a{H6*Y_r|fq zT#0HkXlTCBQqSkF-&`KdPp~svy#mG&iPESxxCv;eu-6Lx=54uTuvr!w*IYU?ej}`@ zXsc<p%tPZ7lO1uXK8hsjR49}&+S+EjNCKuCTQVHBA(K8_o=y-RK5lW9HHMvqN?xfC z@-~658IJWg?tI>vo<Z_X-u-2|HZHPm!lDU|Ht}z8j`<MAoxB_T_Fs_F?ykMH!z$YU z5)lNnPPk<V{s}VB_*R1I6})^i0Ov-W5uS0dxP_-}a0sQgHPGt&7^=em<m>qtZSHjJ z{T@8(T4`}=di~GDuW8iKc-Q6H)X0tTZfdd%*9~%T>TPHMTkx^MMk5kb6<jjRl1<V! zXetQVTc=pv&p|+Qk;;GN?ir1G=AD^MM^|S5@zwii_!*3Bfg+0REj46aFN8Jci}Lp2 z0z&JUShMdug?TQgh3iykzz0dKi4swdQ0H{y>#kwUMro0SR1f1861q{Rp3LPFhsjYJ z)0)|87Y6~nJ6~SKZ0tCTF>gP4o38b$&EQr_AD=zQXCm@2I-(5g0N&{GHCh!^0Ks{q zbev0Q(~`J%aFp7iwlp?QBVRI`L)W0+EU(URQ|jekraUfd??>jgAu-+e;xO!aP*Mu_ z7r{AE26mue=%l*r-_a?8pvPlj_T%jMioNaO0x=LQn^(M^UcTWG_s=C0Crwa$<^FR% zJ3HwY3y>k}5K~4y)3$7BzIco6^(UBKBsaSPE40I@=GrF2XlPv?l16-3JffcRDT@YP z*5lMXYVYB!sth@N&_jrSS0I6}3}D7Y+;5KvK5h=4^VP;_ScQ-h@`hm2lMvxwvug>P z53;rBgbduxbz1JQYKz=$NGu$oBGf+MiCH+3UvXxD*aniX)wsdu(HD2N)pT~nqFxZ} z-J9Ho?r<I6c2BU&g!YN?7(A9Er<~ZBhjz_z?m40Bjxu9DovRXGIZ_G8HG$aAM6C-( zlPNy{IF$F7B0CyD=2$&%r1#uB)8q@2&O!ovz}5_TOZdX~s+z9~S&u_|S6xJI)#jtd z%=y#tn>+l8;vBNrlUZwD{D??X2q|_>VW$Qq;c>tO?L;saIQ)m26~A)56@PlY+lrsY z@jTR!sBH{7TwX||v)byID>F_CAF8=3@Utec5mqC2SqOmJtAZ1#A#;?-kevmzi(^8J zzbGxr(CHIIY7>_HbKV>l(M8qkXqk9NtbeVrparW~Wa5k#NGb6_A!?QJ;DxDn!_+!B zlX$?-y;|_V8Mkf4MyH&mwzS+cbFwTW;0WNqwX)WN{LZx+EFs**^V!K9dwl~dNU<B? zV`681oDMCObH5rU7Drdr#5pkj8O__hu>hYN#wqM3<Myr~`6tChd#x*`q=h|980-dt zuz4~(Xll`3i$m~cch_@*BK>*z9b<6-iMja8%}=t3_5Qi=z~$`h9jw(7M}!7u=moGv z52~>)SdZNp$K^cRB|^@VY~U5bZ{O#S^MP0ok;m8ScfHT_$3q_5^_sae1?tfenkkAQ zz9%D+4@_v1cY|GW(=*tLSiQN_yb(#-vZ#~?@Y-i*r}yvwdGE>I^WDe$|9kIf_p8Ib z=STbavwOJz^huLPJzV6=2oYJ%j_3+ULbWG8#A-=9g5)=?{eAMon>h}u;Nb{VfPV_W zK7RW2+0ntnr_c5hm<Nu*J?b)E>ukw2uF1+qZWWp*+9aS$TSi3a0!^3_{}RmmKb2`; z$vk;`v)+;5z~zoDaF9(I(SQiI%>9kK1j={y>VG|rfOqSrvT{G3#;R<if}MJ888s5! zvX^>Lb(QKFSlU?x&ir8zLMFhS+Elj=b%@&x(zM0{7+)jYhHb*FmEx?`Vu@G;Kd5{h zI)%6lW|8$?TL$yiG6%R#d36V&I^jN@FZ38wStEhp`;|QKo`ClP%$M_{3CH}}s}xZw zb?VM3^cxRxZC!1UdLh`-CcczSh?QE!%bpZ^-m|$lkranJFC0%KNP>gHyAN?ZTIHFE z_6VnVbvk9oLGG&An?;vpjgS+{u&T%dGf9M`RoMzZcB+&9(!WAg8(K$&Tlscemv0kk zt!%<N6Z~peMj6su+DeNYZCG+Rs<3>Li$o*_=W8Z%q^koYsTZS-h=mSPU)HL`qQEzq zNEGx2GNqP3d=*aokXa=E)Y&Roxtq#a8J&faP_8<^P%lXmXPB+SXiQgA+~&=MIQd#K zLGBGmY+WbNoZr(8WPREXjZ0>x+PO1{mLdt-x03b4ts@}SE)k4Meju?WBigw1maKX4 zu;@Jn)veyT2O!2AwoHJ@y0K9R=3PRPLp4v4OvARNiR_^OE3!8j$xZ5nM7z~!_~S2A z?E1keCuT$Ac!3-;7~?0|I~lge6ica;RDSOsUS*7~EX%*mX7O+VZ9w`k*RVD1XOrs0 zjG6Zj`hlq_1wV#%)c6Jj=sTfv>B?~&?sXp62`K8RSfb@6M1(%tG;JN7{Cfadlmyeg z(qh+(@BT)oQ`dTJlj+qf92}8CDBX;(+AC9GGo3?Z#F-9%AZHJBpT4t=pdH<*g$n)H zPFf@IxirYg`^%rf?KbHPN&$fhKH)Y|Nwy=fjvr~%MLoLOOa&!VF-wjI<g|`NWj$k; z3{bvEnwP(Jrs32JNyW?h0dUq)q~O{P$*|*t8_<S8a%_0uijg*Q6HIoiNb29as)V1P zWWtUEVp93wuAa<(lta|30;PG=7Q;U9ITWfKK>Zpgn$uJM5l8JdVn9}@?Ht+L9P##4 z4`WSsBC-S}$$GVP@5FLeo&OtHw2Dw;;_4$f`8K6pCOHJ>l_(SSz(higL)WkUi9b** zm#SbJ?Py-+mrR<(g0I|wg7S@mIPQsw7$-d6yj=oVc{Dqn;{M2QdB}Vf>?ay>{H9-; z&Lwi>Gex7U>Rv|wYK)B4?K#^wc(+QHuL=TD1Jqe;IM`cs){)-k#j{(Ic~=#VdJ>wi zW;mi{gfKmB4cbA<l%th{a%)ced+RLB3JYapJ@rI_byd_5HTf<n2%6~%F%L_gy`I+U z9Nm<(P1JCrWb9WD<*LXl&^B%=kpWjiLv^kE!IP{j4u}dciF!lwdZ4mPevCj&sQiE$ zq#9gg@18nPl7BSKqS%0jfpRi33ycxX49L_XWA(0O7ofLO^Psj*qOpegzvjmZG&O?T z89+8omc6B1_WkVL5!PVV*hsQ7Z|Ugupk-uhJfb6wNJ3S$G3X<aO$;NFC6e0bFaH_U zJuNP-@zaxgKeXlih4Fodf!i3ZDJKqOM&g>5d0XjM`eufy!p&M+(~=)G%p*K2Q$LyL zZ~=tjaYj4jfxM4_k9u;F1$Sd$#0Hp86D={ToP=acFmd<IpI6JP3wq)%^zzw*DK_Wm z8_20lH1L1n=Aw?!+4FEdoYiv0f|*BT=d%a&_oDAqT98(ITBXryqPlPYME$(3T~rQ9 zyp>wXLsOhf3DpYpg!T=d0ykUD)5Dg$Vb08{C3ECRpfLZnwF~2k4-u=h9b18CDps}$ za)hmgi5p;LXRcyb>Oa}flBXIql*u(pNp>%*Q19o}P=lM;7}ms>R(aOhz(J@PW@0za zJ?!0o3PD28)}<3mtB^#%o|M&rqfY(2Zlj(sOrx?^)W5Yp{<=8j@NX6;PY$U>fYd9U z&C=tKC==j_dV{H0HV+V@M{*wJ$?T*Y74+&92_)s?Esm0ZhzY^t`S(1vEPQ)kxog#@ zF3cj0=uXq<0P04I6{134A_Ag;HqFUuFJ-2#G@MvkG7&?}+HAPutnQK$j<J(HkX@p? zb~3B&&nx8@b3oXpxT7@vvYM4k+_WEdi8s9Ma?ui+0YUUmetAFl+$kYbKXdWJfre@j znjP$BH4Qi@;AyldkVhi(*AfR9E|RvoG}|H}LKG|^^{y;^rr(C-u2(>)nk~`W?#>%_ zTKGs~53YJ+D)`w04IQta%zm)dTF+es$3CgOfUNW&bYKBF$DUT1{|i>-h<vW^Gh@u8 z;Fv=6?9Iia<#BarxNkTClF=wVPVl7yy<z5B-nvO`f%xf%G@Jy)N~btli0~#3kaMm( zT)~J?3h$LnZ;kIDtKl*ts{p6b-)ECQ7H5sbmYQsnHP2N}2Gg9VF_iv3TvN0^hH0`Y zAC_mbu0$8!49jHgHaJFYd7w<rgF9!-<@aALSKllUV+XxUh097JTNOE5EQH$x!)flF zrebrnJKnl`#MeHG@N`*)939V&Z$ZP(a){c=7)hckr^AEQ^*(sxL=Bw8%5exEPZkQv zLN^C-M$w4Whz}mq<Bl0mTo$KuEO9I8npA=?KEY~LT-54fR_3%+5jraljC6qAb!TVG zA7&@tV5J5*LNlMX6c<G4{%=@LDLJ!4ybKjNa|`2^lo>RSI#K7K!qVWy)%wl;!Z`9F zxK`I{JnzCQk2<(8PdPk0%hmifF1cdD1N#shfKTGww2|qCqV>%`PoMAqdH>1o<D=c@ ze?E!_ecYXVfs2CCXs!Z^$%KQUF`W>Zu_ESXDl&>z1wn_)XHX0gUwIKhKm07@RsBIF zSeI9m2itQb1&X4B(*4c*$`PG=173)uZ5!<fB-)btE=iH2j&!HkxOd2$l$3VV&=ukw z+9<KHe$h6P?!(Pzopnx8IIP612G=oxI>uwqpMLzt$!YjCWP=AU40YTeO>Z$P7hbvA zr7_^4KHq1s4W<#1L_*wEy+Q4va&Jo?;yn8`4&9j@BIVPBrk)W*s+X*sv~qTNk*C`* z-{wA_coqR#LPVDu8(~b?SeQverhmC7jJsx90~0}P3{EwIN`K8jE%9~Ij37{cK!B#o zdNtY}g5LG1*R0TeUtV2`Wz_)|s+U0I1m=@MGZ;>~V_)L3*&kMOZ0LU-NnleHwR_Ot z*&A+Qj1P<opg_D#Lk$R{4H$9Bz8(pto)yiF;l%-Uq1-e+wvd#V4XoE(o6<Fs>nFiS z;Ak20d>9m0ar9eesWAG)qd6+@E5uD2NU<ayjeAfZDxE^MXrM?Ik{;-1;h;_3;@gGI zC<SRSyp;C_IMD~OF*{}5<+?n|5f+&BXhQcYZfI;RJ=fu+lxs$mSQsT_V2gNSSU^P& zD)Nf03#Ixrd<Zt_T|@9d8vE)}$F^HER!}{Hetm;+)~4{JSg$X1JY76Q>}-kydKT}b z2Q{?qa99ljQtOKQkrEd)$jHHS-8rakWiHWDscEi0cdG8p^WaoQQva^mMKcYM5ZR|8 zaFWp9UarofVF9~XY~8Q}fPImfZ@H66QHS-zsiWNx5~~ic8P@|~owS*P-&{|%BB~ou z))Ie64Y#A2*yvV}rkM@zbMjmx@bT*NELx3<3RsmM!Y0)$%1}3kU=Xqh4qc=VTD=Iu zj$ff{m4>2ew++XNb@(x{o*_W(y$%c8iGRVDZj(j1zeQWpziv;vf1DVvwdp{Yh5k$8 zviW-|>mjYA`y}Y<kla++il(7GDr{5a7rIDysO%iS>PRogAVieCG}_OG%_27JVYX+f znscr06=O2(4H}3I{?~UMXxj~TIa^hcxV%g%X)$%Dqa<NsJwAKjc>GS~5;q#DAx%wY zM%&p;no+kkEE<p|;LxU2Yem;C-jj5`XM3^)GO1m<evA9mvX@g@&UWbv<Sw~yJvxVJ z4(4LfdA+tDe0^8mdEpcl_w$oe4#xWAl-K7m-;7fZEt59Cs1YRtW>TI>9QAWdsYzlA ziFQnjU)1*ITI1&@w_I08|H<6)277%N=e*a^mM(fX#3rtq&BKFPwfT^n4;L1V9)r~E zNEQv+H3ce6w8H_(S*n%!DbjnIo6!janx^mUG=2995=u8x!E8{dcI>yAITcNBq)GBN zikb)9HQ92qcU*2l`p$cceG68o)q;2pEKDL(N~yeT7m<WXTfT;%*m9o5%S}yyJ*<uB zT5L+SH_{QBEj9{SwS>4#fsb(0;uvgC(SFO}l!WuD=r>p^wi(HArnkCgK&)8?2U!oj zacswdAZ}uxIJy;TIlu(|Y?g}qXvTKo6@$U%V@Y!UiS)T4!KeAJja?F!hdF?akPB`F z7lS04AI~qP{$Rp~buXb=3a0Ba@<Es`shYE`K@G-foO>`nF!xioI%05@|2OeUty0St znp=u|p?aR?-vYxHOx&RQ8whF`vaD^;%^xV5*%kk8Fczu;x}TatT0r{oULwl4OifYO zRcpl?R?zh?W^n%mJJaW<^BH0hjn|K6>*Lit935M}hYi8WnuvrB?tUR!n<C|a9f)8` z^(I5s+>t-Ye~D_Yl1XIN>lgf6TDr74zWnZc<s39XB(G+Rs6+9(1X*y|E|wQX)<D7N zjUMMRt^b2uu@u70X{Fr43N5^}V@!Du6@(#H^E6~6h{v;girwL1frMS(i3tnx+6^H! zo??2Kq-hARn_4Lfxsk_6|0zz~qU#b@MXx>PSKRX&oM{T`*Yh87RgA2L=323t<Jd}t z+Bv>jVGnIu@q<OE7kW9)YM9+5%T}8X9juo_o8niEj67_Y%tJ^KpL8LHGXOV1(&(;E z08Fewl_BC@A#G5WYUO}HLD|H6<qo!WP>ap_LvY)Squ1RJ=+)rEYkzvB#}1^W`5p)a zLr?Rwso`*gIlr(rKZ$RuWoI9sEYs-8PPk;Y(1&8R9?b?4+=LCo{D6z4VYu%(#+LZ% z@J0`?&VlI-F(%X@eS)bOA9pmBwarB<|23Yc+aft+V2EFF@?;t6V8ogBks{R?7{vHi z@@pW~DXv#@EWwmC6)o-L&E|k&DXqD%GDXdzD^oo_Q`H)n5$Zb-74jJ67%yYChGx$Q z`}d>6r8L4r6Gy;VOv4EO3kAgB85lzf(Q4)jz*n!4$2vKG#8zPVaehM@xSgV9DLKhu z4f`1l!<v0V`P)PI;!Xkw4r{gK$Y_%WXImR##GNo4)#vlu_RE14OXUs*f4%B@mYw-7 zFo^Oh%NYml4jx8tDC2*fWwjB__ibeJO%|cX)sg^t1A9oGf$a;bFk8<yTH68JX%Hlw zZa~rq+yH{Zw6Z<FDcgxWW9J;b`0gHd%6Hfw<Le!|F9;LSA%iNbilq^bX~olW#1EM` zlQGfcwK+r3j(522ou1B)c~9eK54zDf>Mb+G0<1<d=~z0I));-%X{=3uOmo>{u62hV zy1nhWoIo1-t({JyjvrAj&HZq3*|4V?SzY^zsxW$wphx}iV0H#%Em!yN<EUSJWA587 zH<79O1D^v^JZ-)Sk6=wiQ7*<DEXI>?PSCXGLZ?a%By$w}G_ckioIsNB+u}2}nDZK+ z@RJapT8MKO$+MTMTn;T0a{w8oKXn&eh>X%JTx3DIKRxBuwAksGIx;pDTiC(!eEkeD zlub;=q2#)XvY&@%sZlc)-=N8)%_z=6R9Y+bzR_XrP}3mE{4GH=RNL}ubvz@+5D}>` z7=#xuhEBz~X;f4b@av-?M?w0PzO9B1EAA@qxS#>5x|kk*xoDLoQ)p)&V8?OikYMkh zk+Pf9Y#(CAQts)krZM-DR!g%t7ma9nFFkuJ=h=zF`%`p#MLE#e2qeyl<s^g<Hm#BO zY3kWZslHPP#?4Q-3pa#vh_2|*!bN%uGlxtrVAR@<n!Qy6woo?gpN1n=2Md?5Q3D7L zM%AXQ8cfi77t7V<3{j}kSc4-kEd92dbQok{XJp5~hOw1FK=L#@H+p(F@Llv<!yqNO zBsS8oq`0aPdIl)x<0Xo_EOsDi{TxMEg>YP-YqVVjYmga?bJT|&QK1DVVU;0{ZbdY{ zj9t5YUrr(f#!XuQ;W)};?54PiP$gdCFMjeT1&5V7NYQii3^Ib!#v12xK*b;z4Kl@u z`eX-%=q4FqRL7156oQXR{Ah#{Q<!5Ak0aGrKaUx&!z@J4bxn31gBd?lZdvXuPQ-;x zfAU*b=hAj?6d%&8hoI3&lU|lK$*b&QS+FH{95;@oFFk>>>UcX|Qmt#w+lySa%HtCT z4wh$cb*+bigb@HkRHGIO!=Z~wdh!a*F@jr;Wxyp6{>h=-kWjwW_{BR4qtM$ZGL+<D ztfU=An~ROyt=cYm)Fm%<osW`}GIv#5Ey)z+z&N{5&1I7%EaVvF>kSph8j_L^J`7K9 z1h&J`io{R+d^%CDY?QWEq}?<>d$({SS2sP+@w`2%`gWf4$KmslfOojvqxheL=cCt0 zo#t2U%^q|Pg0~q?Zae<qau1TB=r{df^2buYhK4!2Zl155J6dl3ocbH>wjRUvl4M$0 z`w5FJ2h8TR>3O(uIScP8%6@0(KZYR4oo1Zp{-lhbAsC^zdh!K%j7KtrCOg5bP(hcU z5X^3z`_bw=oOJ4sK4qViowrk*E2v*JdqNLgxi>L<<dNN0P%Dk<p)NheJ=XW^#@6OQ z?@eAUmuJX-=Cz)w5gppNRVcw#3Ylf3xuauiH;>)M8gvQS>1Fp)nJ`qLnHcJXcUb26 z_}FLR_Gf|6>fKrg{q%w^r>BFD<`Bl0v7oF@Hc^*+H1QQdVc&`@fFL)Oj+onzi&DA{ zUb!4$Esc;hxHYWTIN1|7+Va?0%huxTS-D11U@eyC6gcIFR<(R&*>{6#d0t||hxu#s z#gU|g3YB%(Eyfn<zkmPWn`e8^|NQvrmpC=&+ui5;yI(%uJFumOQf0~LJ!o=Fc6%+< zfti-QL?Cakxp4FPZ24+>#{0*WB_@~4iF+|Y(K%IC=PL4~1O=#!tw0uy_+Bl3SWPdK ztFV+JtJ<mpN|Ihe3lq;_Er!&=li@m;dYs?{j3o{(N)lGih>a>)@1A83XR8IS{B5K9 zlrVX?;fb8)B##|H9yTSb?66GPAcs*mnd4V*%z|n&B7&XF=o*;iMmSXC<T_NeNnax; zVj!)7OXAP|@(kX};^i*z{BAv4y-dh{s4CfxPYAnkB!n-3mSQEtz<F7hZ{8hT%#N8? zEP0Qzb3|E&j9~AeG}cn=9hrfb8ydwC{x)P_U^#(wv^CglBeq;Xekd?C^OSc^aRKe@ z7Y6TF0#h5_fM0Pgz$g(>+;x5iWB6q;mODEwiWCAWlp`kIMGhR%a0_*<h7|x3h~nV} zAgsja*a3dps;NC#%><yUm~+Pr#B4Mq#w>v$6Ar(;o%#vuvl41ZPpb;4txXHM#A8#9 z1tl6}`~Yj^9OwG0<qF)}s3K|7yCV6yd_?mLS!wr%7Xj;;SjNZfxPi5(mPW$=WGQO> z*F1y|Ndjdj(^0A!L4w3(zkCv0X9&5e%YUguK&@bo9$bT_ZD}&Fs1qc(=p_S&*&(~K z4i{5;t<f@q<b&8A<neO$<E7cb!?rcKAxm--5PsFR9|4CP8!*RzerCLyo#O<qP*v}b z%Ka9{sg3G#Is6*gSTHzf`Cf=~v6ru=%+`8$|Gu(MW!E}dD^d4)I?^!tLG<G`FmI<9 ze=%T_bR%{7Rxod?M1CQt-WqJ?+*)8pQpCOub1pUF>d}KaVFPk?gwuny$kPk%%Bxjl zVJMOo6*^RBsxX*gGu0rRZYGuv;VtH4MK5Xbr0rx#w$2Q3hJ#BUJ}d_+y;+_i>8H8z zwFdg+r0w|VRk_+K&|z)n$|>0ux15A=`?=sQj|X@(KmTfWdHklF5$>FX7nltle-GW` z7hc5^vh!&{Mye(>o`Vpn_$=gub0)=-p1OIJAKuInO_5N-Xg~!PbPh)mryf5&J;iZN zaccvf%YkKiH>_guoVuDz4>QOGLz3Lt?8w#7NOxAR#4LN~hZw7S*F(l^L!dQ8-9z*V zYN|>FXR`4`fBxbpqTSjI<X}7{N8E5{U^&4m_`^x6Z?pkU&P{sV8Ct2y!nOl9H3*lF z>i55&{PFY247<Q5tL5@?LSc(>cMe%-+>GnBXi`aFv!+HfbHH=3f`Z~GLMC7eOlM&W z3>6qOTjA9s9z&_n$r?KG!-r3!R{Ui|1`{r8ZJp!peQEUL9J_>UKZTl!%_IWn{A=JG zu<>lMMp$i~vChs?6p7e;P_kBj@;cdyRv<2CdbFbZ=2tVEX1m55Khv;<(8v`KkLKrp zoxO_{dF>!C85pj4iW88h$8VrTv-ZUtp#`x+_NFNYco|efY~iy9c$m|T@&z=SL7)79 z+oYyv==$WHtar>#nA<oZyc1NOOfRu{Z8mu|!_n&t+Qa3kJkSO7&oksl*(JQ(FygS$ z0-5ED^$HsyB&jLJn-?vth33iyd*mmVd_EC=MqNeWhIA6oWg6U$DPe5Oe?n2maRU|9 z=J)ooIM!B89NeTBh7RBtENRemAW@N*NK^t+n2@OGw6&e|M+gGIP0DWSvL+du9j&wj zZr)3A$8nglrmcwIxewp8raf$hmIZ9LLm=vj^Trv)u|*QuuLN}nGhTt)VBUw69KX@D zsnCZxvL<Q%B>x2$0|(0=F8>1uif_FNvyiKQ#lLK};91}Mxdoczkq%``9=2TJ#wyxH zS+NEzuMS=Pzk<m#xN3*VNx?;OT1>}}Sf4b06<>K16Bmn>*{L#)uOVvI(gx<;@r#9} zIQVyYlWy%0$!jI0gfGdU4v2%+$z*h0=`T2Djv5uO%69Q6F-u-2J#V=(pydDcIZkpu zzgVtklS@V=GV3XVXt21c$sP`W6aZT$)B(>40cM_Stb$$26p@3v)7(p%3zl`9!1t55 zjorIyItjWK5WzaBcm!$$WaI*onX$5Xf~BbB<<9{$PI@hqEAt1s%s6bHE^rxGlv zzhc*T;#)8Hg~+{CR>ADxzpoJ7w3Zd@*y3H;_n5VsYAh;ER;4S5g{jM3ciai7+>END zFCfPAy1xPwUFQZ8%1a_HXA3}B=98G2O75{EhB(K1U`~445);9Qhuj3deAc-(j`c-M zQa2ly(Th3>i=%cDv$iPHtxt_$O@4AA*Jt{dbJY3bYL?50m2iQl5<8>De0`|f5Epn) zl2Ag|lmi>phB0TF*y=QR`e&A*2w5gFSQPEh@)ag_-`8ZW5v^(}w%V1UTFQwLum3jn zmiH~h4SJrd)1r#w@d2U-CFZPK{l%h55nk81USlZ>6V-KNn{sFptJ>Xj2&`*w?7j`5 z?a`TGksv+{G%`x=V{cHPd9+;ImqLTa&Z2K4Uxowao;G9DG&||4YQAjY&4!W%Ts>m9 zh_AAbJSsrX#(Gfm+*)+75}dYfh0bw<;t59JDqVo^LnACN(+PxRom-xmo#{M#<tNS9 zGGgv8kgb3lGXBr(#0D1pc$YLH@Zb-ZS0Zd!MPBMEL**1}kNP*4LwnPH+JTXn)&o(* z-xVOz6m2xKRk~L=%q>$$7|WylTN6{xxrYi0Z4Qvf3mkRmV27ijO>+tYA>u5+_0W+> zLJTi290#b5oK94$l$((EAG#Y-P)3sx*iSu^_0zA68ur-xZVF^)R5df?Pr7QNr6P=G zT{?U$4eI=xxB0@F3EE9)v5%_3TKLWf^C7fXhc7><=E@n65|Tg3f2ml4%9QMedqGwG zp6*5O6qNBnk~kHmM?;mW#!Yi%Y5M%0GmHhf(CYbO_3t({zo@INGiGh23L0obcqZX= zr0A3)zO#JwU&yF=-ab369I{$68K?~{6DEw9&O8>`3bmC&v2aO!m!Cbb_*NN@EvQt~ zD)ExLwq?|+uAB#`irPXoI?p+z=<}c%rMd{K@jS~3)#@XxObKlCP)hPpiny-<>GqfJ zLi668SfIxo_^#s5n%Rop>?HB>ID!k{Mp~jWewQ<G-G~&FJ|9R+E_R8=ru|D8Jg%(e zl2;1eln#6-v+TjY10FhE<Q&!NBeGSeg(h<)2^Tn5QBcu{X{ArmWQh<fZbWA`Q5h-s z7s(mwxs*_Ek|$A+P-NIsF2;%^liS{;wuPmi1y0AM<&NivT+3K6ZOWzmSash%7`xrR zNoz3#;UHV8pl<J>z?W&YQTc-gMt=&(?f}-fnRJHhga>Ry!R455ri<5-$nMhBk#KN{ zDOGPC5hYK)*rc2w<#QxIZsNx9SS`W&g5~lCv7Ae-;Qb^!QrMH!4-h0R&&td7JKGZU z<n0Nw>FmL1QLtPWIT|;zS_G_Y8bA#;T|;P4-U@L#YrRAy1VL{@LA>4LRFSWTX%57R z*bP74SCIAh#^#;4LTgFZAb);QDjhl(%pwf3!eXH;aD#^tN!^mL*$@!IRI>n|3hA1Q z>^=Ih);8|^MbI-zQ2=gxNEc!>y!i;ajs+IafCslZm=K3ghOl3%w&`H^1F8q0Y&}1} zI-6p({Nx?{tNHQ7NQ8xx_5Af>^6K5>=m?3I+*Szz3@Z*7OJu?4i<3k(+3HrLaw5H` z1)Zeaxh>7zhRF3MMr_H8Qt1deFAO}j?c_*|DrQIl4AZUK&5j77J4Sf(3`r_vVXVZ~ z{W%k9|8hiNRK!^v28nk2K$yh0MBW-!sX;0#-e8_!m3Ybz<>gE9`Xz=3>n9QQT-$cV za+p3kiI4^pA+~Vsjaw6|Irzb@gnbC=j3N;mL>JomG=U=5LKfqs$vJ?;(Q}yvY&B=f zaBTHSsAw0FsFAalfZ!)TB(V|RgMnu9*-xXL=z?_`IB3nRlc)+Tkc)7_I~w^k`5}iy zv?^};lONGk9`|wj(sDc^nUimt%lEV3Wu*7X-Ap=Rv*+=va1b)wr4dIAW)r~l{?|HP z>6(;Jo?bbB$=J7?2qx{-cQhW)*Oy1O4aU0<vXp*Q%4W!z3ySy}D$vw~S(Z}gk9Ys9 zrP78JMx+eIX0bbOT%aplles-9+Z?U+QfiVoX~<4J&#&^rcCCFpEb&ZpBT_Hmvc$&x zntm2b;sZ9z&kg|*ix;(OZ8D|*t)_~3v$2n`;U&#ycEc9`I5@iISdT2wOh`Auu9JXp zVI5XIc89L3ix7d<Bl^zVQN#xr^(84#JGRsSIj7ra4{XN+y~-Ayg&-*OJbD*{Gn)j5 zH0^=GcOMzU&#)R2DA2uRSU@n5Bum8ajFv~(h8;d>#7)uAj-af4Td`|&g9Ni(ezuY1 zy!An0*2YVj$Qx)nhpgCOPvPWi&{FE%2sIP+N=iD|hG{uo4QEY`pyW1GEZg2l$Cl`A zJksdIcJ@d*rA(VOE#&3nCs*gMaB=9)ydmaYFNJ);ZC2EGl%=RQL|$t>+u$KJM68^t z0@a(};#fQNyTL7XT$1Ugph@*gsXu3%XC<BpnDR&`+6b_6y|}GD8X=N8z}Y%iZ`?6; zjras{XlD~5Dq8oJjERa`#K^{rk{G>dTeX@r<EJ-5^r$sUxl?-Hl*n0YH!N+g*+D@| z{MvUb_kM(5i7kP<@3$Y_!reC8iz4Mt2g|9}*={}x9-$%pw6D6`&Vg}CUqc&+=4sY- z+cj($SrSp*o2xM*1W2g)VMMKN>*v~gZU}#xHt#3>(}EOIiN`X(c{D%Qd+Gy~4Q-@; z1NCuBE0A^ky>5R*Q#oH4hNx4mpKohYCf=3`noL8$o11~lEb~^OI0H~$sIya8b}K*+ z3um;PL{rj)-^wLqHOA^d-*!i6wvR&wU$&sDaeUR=npq%HEO~Qxoi<{E-XL)&(_W@v z!_(m$D<nHRBL-7t?H;cR#$xF-%Dhf`-rCDmZs-Xd$BqhsJo|hr8yEw4S>Me{vAFO& zx_D7`>y8(8tSt2s{AF!@6B{quC|G%o)l1OdG1|S!AMQ;)!#Ty+IPRV|`B|&Qu85`L zkr4N3u0MQt1;xry65&oG6piOt&AD}GoC$Z>@KlX9y&V{Hf#fvu;>FPTT}SyyN-U&; z6)uYI@^%I>5|x-Dm6*l>IGc%%+fXL|4(67Fxhi^3ey4{za|re+c>>5%J&JqajTa&h z$p~9q@wV6<T<`)8>73!j3H4Y87*0%7N}Dcv+6H5ZDjD9=;}-igu~!gr0EcDC9wrkI zU3@O8eTD-}ycxHtN6tX1wg>TSewPnjersC*ki$Fb3}<p%Hud?CyL8f=B3L1{eFk(` zv|MP;qvzaF$eHkX(8h$Sg(vf?GI!J?5)5!TKhBD^7_*H&tEQ7yPOD{T7=;;oD?y`= z$Kz77axs&x1&`#w454f_&#u}UnQ@Ugb$Y!?X^hBVm@Y!bL7!jXSkz~dRS_6nJF9Pw zI)j4x6Lsz17)g9!`ct&8LK+n4#cKYRnH_dH4^unF>}3|snl*c`t*Py?M<}QI1VteE zDPpcv;G$DNt08}7$o|S`8<v;POWqWoPbO+Gf?mQ25VzSh-xIq=v*n{9GcTjc4Kq33 z4eZ<KH@aEl;J$njnZg2YH(IukB%=ORj!<Z>Q;4G9G_=%SLH)k3v1xO6(_SWg72ZY( zG*Gggr$M4ryZOB~{d)eR9u{8msZivSP80=$Y`4p>35hR;C|2aGSay9_OGr7@CoXMJ z>gIc3wagP}4Qcak;n%Z&$5JelFD)k-;zpT$Y_NEZsOV4<aT=1)oj~ipLj@qwodx+x z^w-}o$OW$eH>~W>b9D!@7KK$q`Lb6F90+#j^Upt*;~}vxIENwcAG5#Y=b_^g7V#LL z_NOLL?7ju+dC@+9aJ{A;gH6e*D0Et;(&yQ&1hjLAXfiee70h3S3Kr7xy=O+X$|WZn zBpP+jx{)5Rj>LWv>gqwTfCs*|V<J|6TFVidxB{hh61Zk?y!Z}A4l7uVlfr|&oBVr# zc$+pu-QgQ#wmYo6j!z#johW!D44=z+p$sa>l@v@~x~KZ3H^SDD&30UKxN=};U7U3; zk{dhWFS3N-rr?RFWQ#V$7{#%N`-w?Xm0q4S_d+-UEX~L4<GYfJR1@;G=Qwk4%hHth z_S$t~E|!s2ojcF=bw5)x?|y8Pfv@Rri-<<_kw)(cE2chrj(vT)ykb$Y`dxDX9nQ}x z(q0tGJV#nMN*3j)f@?M%kiI)FZtvWld@kYA$h2gDx|KbULS1e0g9@)@x&P;Eoz13X z5)j+tnv)5I@auOizTeb-;7B&$RlYM1VP?P;6BN?pcG)+XNct`9!5Hkn2-p>&`RnZ6 zox9)BR=knjJwrOOt<(NNwB}Yvf!DnBYge2${7<^G5rr75lyA+~pLFNt>}S-SdR0Pw ztOyn6uS;>_gpcdrT)4qWygcW6@a|%<WTXu9i&~$x(jpqy4Sqoz$DMDdQ>2*lNAHfo zc1}gsP2udtTbgN|k|neonEi5gG{%o%&kv`s%N0%MH)8B!_+W9l`_b+QKGvV5=cGPi zc<J53N6X`~>{ySG`I>SY^|Ln@XojQHi3_fYlFch$PcN`>U7&oP74>}m6$;C8bHEHI zxDUC}1sXhEg9y(-9;WPS&VTWgZX!zFmrWz^C|oOttLYrOLi1MS;l@^C=#EDvGu+2U z>|wLtfLeKXhyxI+1Ab!I)f{m;g=jfBD&}QNQjw>T=0t(u?&dV+oCA%*1yl;YyiP79 zt9YmYuy9vW*Ha<cqve~5z~-_1qQ<~Hpfzj<wsfe~b428RbmIG*=LFq=k)jeTzRn~t zbA2n1Tg**iz)S}I=^d<hV4Be?L~2yxs8KX+Ifs|U`DvS2zR5?#Cxk-)(3y|L<qhXO zsJ7{1=NKnPOfgcPd2YgiJSpo#-El!eJsyECHZZ(za2uecT_>m}?%**45t5zs<6z{N zh`es+*iOE?cxSkfCCGtY<Pj4<<skwJxb*Sy^7Z`KPqkcZhJf)?(><~k1)FLBb3+3{ z8G?$;6#VWbq8G2OE-{fSXGv^69w|jqIwAvu*5*bcr}ME`G#%skRzyg38s}|y`;y`_ z7j41`snp&2Cp4&Oh8h>6P{2(<`Ix?qaK<=9N>Mjx6(JjU#AP)O>m{i2%en5hbd%!% zOQd-LPa<miMz#+3QlmqeW1ATdS5u3&bv{N6^OmAMKvX5BYovfI=shB(gyMz2^qRaw zh~JO)&1Kt>boXO0f)s;E$Q4#^lRGgNvZ1^K7f|8&w~pT@t(W?;FsyW^1@vVvm<s)B zK}Iz^F~AbGY7eXoauW|2_8LyC1QrvO=?NhzhEjyB%jcK6q#mxZ{_W1OoSSh1z6i$_ zz-QXvF2A22OPh?|e1I&OajFZU%P05s*Wtb<(rxs>uy;eQL{Y6<sx}d1eT5U9QC5O> z`XC7-OC^C!-*O#G7E{&whq9Z74Cig80io|CuaZXPpOg)Y&J6L9I1FE*9Zqh$C~07Z z7J<Y}dAoh5&vJx$8Ltl>R=YZ2Ed3yyStc;!^kz<+gi~kzl6_3H`y<U_fzdzISd8YZ z#LgeS`xqEm!+Kr|D-BLmvRCVhvMu5(y=-W7C}V>TPyXQnm&EQ(Li<PRVQwGIAd%e! zZp+DHbGnr{Guv+SZDtj<&^@ew`N=2SBU$*&`3_00xK(h4Y#a$lkooPXRY6B$9M`IA z#|>5%lmXJ{0b7MIIrbBFXg#)MTcg}eJ-l(rBq%77q(X9}OPNLiEpF5AQdLpAqB<P| zjC>&2AUmVB8C%|OBhs9A9gyp5<(ezeOY~sr=VgMCQ!vn8SH|Oy9QSyfFyW|cI#=A3 z0ApUWSlknKNKJL!_t>z;3sQ~VsGFPFI%1*G9Z)Mo(ZZmsv8&GhGtTCq1iU(%eQUW& zbeN5U7(2qGYb~jUDP>JUYHyeGlY+L`y;Uom<bXfS?=jX5uZ`C0HnIS!%>kP(YU&L^ zMV<%plV%hU>ERPpZhOtOtRK-hxOI&Kr%lzUqbLs_xMjyQP-LYL1;qqhNi{nGu|$S( z%9$!J<FbMoow`w;8Le!zxG91LN)j`PaD^So!5I7%i>G76D(fZZ<%j@fc^#%NpBHyq z*L=}oiHd3=GZUNSL4l~G0b`~kL2fXr%(jyS4*Az14}|ms$b=zagIutf$%f2XZAUug z1!_yFIV3Jh!ZP}mj7Iv#yaDL4aLtlPqjvzpl+zdSQtadp;9yN7%ub;VqpfC;GH-Ie zhT2P=#>6~Y?BMU_P&t3N&<CUC-4uv(E;1uKx*;#3Rdf$jLmnPRXDMKsTT)Kzg}_2t zY#o$r_EA;R3@k?v9BrXfkWdTk&t*~xcqz7}s}p#PS%Y{>CERW^+Ca4WVrO31cWFiQ zN9ZtJJ7veKG^Nl@B<|F$GFoZ~ffw8cIN3X*Mk#0-&)5j<$XAv??q)BzT}oiWdQI?= z**R>2AKj*J{G(9*gVTWI+VvZ>jViQ5(VbHPC8e)Tp$($>qJ?{tz>rjxHKEig40`5- zRo=$*q<8gt$Z}KWHhxs0u`$=o)%Tl-yV1&zg}3pU`lDE5GQYSyy>ol#H;8KeX8qmm zNWj!de55oDJ>zMH-HoG7)-HXsAVcOE!R>TmWt%{YDGs0nJZd|2bo&G5Zpb?PH@LGo z#;af2BMV$_oFvHcmEwvIC2MdNQ%15crYp=Tr9%muL(}*;^^U$5Gs08^=|d#qnN*bD z-f^&F4?;c58Yr!l_!nA6Gx-IA_L5_OA;GAQwbh1yBCk5B41>ZMpoEchtvzdxEU{QJ z*BZRPWO{|3rX^p?!S2Y@5PZ0!af`d~_E;?kk7$`MjzkLXq-x+%h3}A6gibaIEBm4a zfx&NFotNNe8TNE5IGn55=^3uRK-v&C!o8iJFjEC9<GL7~ps1Xpv3+S1i9X~e70*`B zpl8){jwNl6=`sPQWe38b_TF=+jl67O;41AlGT9Ig0TdEWPFKtG$qX8Mf=kKe$FsjY zn}8)|XQ!Dl$Vsrn?4US;H}myp5BTISvopyRS}a%Ra<|sA>E)Zi3^t~Q*0)SWMeKAj zJ$tvFov;Gbu=P~Ol1I~UdNRGx+_IL_TZ)7)&F$FfcZ*>~8>Aw*9E^M(XBw?4gxj^c zR-KUA$T^0k`RNlgCk@NCf#StwkC#8p!afAdhvW`<0l0eC1AH4W#t$+d0yV~ZCinEX zP>eqO?1B6zbKHr%QSeldQ0&;`x-4ze8Zi=4Kr~jqd8j8Df0A%K@g~WS0k5bv?WPXb ztHQ5;YYR*WUVQgA{`=b+=6Jf2-KW}`N*VU_V_ehowDKD*>2Bm+Fp3AKsQCfye2qfl z0sD?<R}<<QxZG&|B^(sD@gyNYOu+_JU>)(qhBqKAPpG`#NVrQz?iQ5wcE$P;XZ<B( zh-RkF3xR}W4cV>wf$NLu@$5ttW4{F^swAX^6v%_i>FV<Fd||B%r%9LYO*t0I`p)_6 z^3C$(>*dM(bUu^VrT2nZgr881ptY1BizG$p$RJCp>30hP)+JVNIp!>>;E)RuOf3C! z_iR4J^6yWXv0;n$=_?$T$Q6gxaf7A7PT+s`K(SS+ySC1)^eAR~hUmd4X90-SfjQIu zNd{Rm_n^7P+u*bZ+X7NJ(4t)*5W5=(L_q4n)B};YmneG`Ce9?+b;ZP@Qb3qfLrVPJ z8>liTOSIWi)R<nd&})JOy#Y=n45}$ca$w+>-8Ec_$?@58!TpeEq(%)PR4g(iMz&X0 zL)CU+Vnw|5Bg|xvW<0tDOB;zlVeRxs<ld$i&3^ew-N6?;)3l-b*>5NRAC<DI1Ht>z z{rlhUAMAg*|9JoKKaakC`e^^F{k`W$U+*6Lb%JwK3lK5^YLBaCE`ldKFlxA>A_s^1 z9*h8L$iC;84|?aet!0aU^0g>)g232=4qoak@TlS$=YepH_9^QnW{|OMz+sKQAU{k! z&>61~u07)=401Y$1TqiaEU(T^u$}8K+(oe1`|)^oA$vR;kk|dH1(ta_haj#(So0EO zg_%XNrHxiIk4<t~_ZL!`Y>3=a`~{+GA24)gGrH6VhHVuDvR0p20OtVW%FZBMp*IS! zteJ4CAdR3!zBA9VwLS|s0LLaH;PEhDo;_S%Jf6LsodK>|9yFqqKhN<@+DhL8s`2ss z`^t?Xo!_T*OANn$+sPIXb?Pczy&|TC%i*PQ_O?!sTDsldlfSf?pX?D^`FoB!4tmq% zB6Mgxk{Ab1gsJd9S$(pBr+h)fM60ycicJq8$ij-1qRP?YanKxp#;QbKK2`cqqY-yc zM^|M~g?Sr=VRoVl@s9pW$TZ!Uo-hgOiw)Ba>Gh}RY8H2-B{i8^6}IYM<|fip-n51@ zm=?>$yYuB0ll=?V)>d${O+$&y%?6=_EPCP=F}G|Pz5!15BvWIYG1C2;_5J(5S<}{( zqd=!DEW5hY4i#9@w~k>6du?H3x9CHejq^GqtY&}UB#}0n`ZbtA7RKY&|8hib3k+23 z@%KGY^31Eeqp(0+4^La1Jec%STYIfG1}<&+VS|p6&60Ff42Y1G6&i-mI$^m6#S@zq zbiHPXZUeXbNK68GT%ZRV7cZ|?3t&afBI@VJ3<xNqK$%wY{ewM;D{?iymK@(mf1<Kf z<=r&b?(CAglPiXu>NbB{4uVRok+4O{!Yz#K&?Oa`PR!6C;jU7ewlvnF^orO{zEe{I zhvj&hx>6nnRZ+<J7EqP6?yb#?YqG>TS&zs~g7kOC{ySb@?JZ8kVXL@J6!%y#lZ`HF z2)6cqoE=}$OGamwH!*Y1TGXXBR5=LwbQqGaBMnDc(K6-g0+EMP-QljwhPJvsU$iR8 z*sY>tP?isYA6`&aU4+99`RUK6lA6_$A+$Z%*B;h`b(>lXQEVrkSVF=Vh*LyScmu~X zn*wK@C|Wc_)iH;G#s7*1^e)*e9uM%(^&x|TTuNpMPNe{=USC>S9p7*tKP*+_sD2`# zwfT5p{fMpixPJ(5Nsicpefp!Q;qCU?8UurRtJkytm~*XZfSd){@?M8U@_BA+Oe$k% zEl&H8IQLxoi@>%AsEg->@vDU#P113gyp!V^YxqRLee@M5(=9GZXi}X!R7wGTzl9va zz=UndjW9n!ZHLYS?*>z!&Hr?6vSFto^(v=n51k`z!3ABS_r8p|3ARw)a&8RRVlw)k zOD)Bmf|MEMGbB<`cZeJ<Xp_83jiyC|h_YbALe)Bqxe8LE;qt0)A`7-7R&<&T-0*^q zgolVM9gqCXQ9`sNg{9>s*nz-OOBER!Z$Ul&3_)<AAbU=s?*lo^&z7K@T+w$LIUIia z7KLw<w&5@PI9M>l-CLZ5HMh^`353&F;3vhkxCfK}yPCUMTl{|=7*zgAVO4+<7W!&> ze7Rh`!+n#h8C<!>)-h2Y5A*1sTLZ_Y2H9ex!P!FgoEr7e=X0b3Ab`3>Qy4J|62S1E zj7Vkk3iIRUWXGJ(0=mK2WKADc%sH#)rN-!j>qiv(t^b2XD|5q<Vtj)W;EW3jeo9pO zsBy{<ISv=0^o~Gq9wfB%)8Xv=g7?4EoyR#zA&ns(%gV<O%7?F(%d_fXDES5d-<#M! zwdK0`zy2#ZB>7{l5ME$Q4UUb$G!il9(4s)y1~1sYzaaq@>l;Wq#nxVcNoWIc^Ar^? z5t7-W6Fp?%Ap;Bt)d;ub-pti2%yrW4G^k%ab86kwb-4m!Y(xeit^TBKLz(Sh-s`CV zy;{)4&UV>5zqrH!lS#qsT*#qU&zN~L!v;H|zs!yZW%hAE*U22TK6|&nc)R?5c0%T( zgBNReYCb$$u5mp5A+qGy{-)wO)nG{sq=;xKxN_TfyTHi|bKhe?dGctsK3>gbv8`@r zzJ3%7;;rtPb7;}?saHtEYrp*p=jL=?J;P929q#I#qR;eLecdRyT(p{>9&?d!P4j=U zyLx>k2cxlIz8fA_9Xy{+Po6H${HaL(;4x0N#e&J?q!G_T;q&vWOYzb@S0JegJWO&X z8S3*8Qzf5X$(gA2z)#}#BfJX^9T-2`l@vWx98ab$Ur|Ef*Yn6A0|ie|XS3}zQU-A| zE<a|PmMi0twC(9^j!R_Gv}jh>Ww$@B%{7bQO@1I<IpC{>B>a*=(0lQ=kmx{|QZ)OP zo<7h^;T4@XmF_fa!i^ra7QX#Dc(SAP(&AxtVW@#S78tmC(g|x){9?Hdha^WO!<rnt zE`^*=FQDgnA4yWfn!7I*BvpHgdzA0nVcS1NEz1u0(eYnUWA@LP!-cn4Fo@gSQ)vae z8|>O1VFW2h8lTt<zw9{27q)#Sc@qS1y)G|<P;tSH<}!=r*k8Pvt>)OOcsxTWf^3WY z^H4>N8>Z>XNI2Fg>H>63u{967t)K8#BrHOi=#ED{S{Lv~Mo&|(JO!9ZVz-ZuFpYup zaCLlnyJUFcGtD(sKM7uS*MNL&)nPs9JrE(}1fjbdpHKO23e~wW5u0FMXAbv4<$yq4 zPZn6SmIprNTG#YknUYF7Ef3O_7&zrKaH<%Q#FH7%kRMee6zF%Bt6)rm#1A(zg+r!1 zgi=wxPzYr%lUh-^t3Gjtah~P@H9aO3D1v9DUYEgSdsvB}9uR)MBQeb|o)?A@{8rg( zZ(y*&1UECdbrFKP6-DVrh#G5c*41^`z3C}8#z@XexUA`x^Je;$&?qXo9qO|=N41bt z8cGD0&Jn~=BMp`mE6CJr1e`vf+<y5|&g55J=Cvx{IA%-WiH1q~JLdjMP_Z--ofVa? zDWQN}O9r!HLk1Io%|RGbfkr+<T*g+6!CcZ(W*T#?Vpu`qvl&?_JKIgES{*#2wxRdl znUj@0CIglaRG^i{sDnbvn5Z(cjO<mHUwB)hg3?6Psb}R=Xk&e<#l{4)>;CiwGjXB` zu_^{r7Y5{@au7m~^IX|W-h-M8I3$ZTka>;}DZEHgj84v~IhGj)7IZvmgJ=z_fv})w zND@hG*3qKLT)*V4Z6>*&m=97vFZe!;;9COx&&b9MJk$wLhNA6xqUb|3GW+q*r>}3G zQ+)dvTk<ik%QQuU+wf0OHQ~9*N=51S<0{TL2f0ZLw796$7B+cp0<Fz-$(Rd+h(7II zWmwIo_M+xH3kW**D>2K+)J?LiR$Vngj9#ST%pbHfnZlW+Iet~uh}5TAiFshX)n`pF z?-UjRN~Q#|!7G9SRmZ8R+>mdh8@m8shue$B8qnwD%zv4~#T*->P{Yhg*pT-TgjF{N zPIw~za8bu#RqRPf*9$qe+D%c%QD79s1(dIm+B1DkN3M*72{c7yvjW1uFP#KL6!&p0 zUkH0Ps@mH|MT>|wYRRicl@KXy)Zm*&g>DG7(L}p!)o3r)TD90LST-jj)+{N0@;LF@ zX*ZBXI4eKnvj@#uC4hz8<Pl`|3-PN81L<|yDsM;V#*4qg2K(n(4C%|W<?;8W4l6`{ zCl4xDz(6Y=gs}4%dG=*D3bdP$H&jDoPM)y35-WkzJ&Projw2i&_Z|6UxntqNS~p50 z{T?fc@}qLZlcvVPbFUlZr^&ng5HXf-6i<9<a-0;fbqV}PQ!>_2KEXFfUi>O131;^3 zCeQ-ku&JQAf)bM7l?K&Tik2}dgs05>*IPdk9|E$dWQnw5#VwGTZw^;e#5}?N_wO^f zEVUZB(k!Y?`fc5SPAZ4|=sdT^`Yr+)qGJe~_hiy+r0G_LQ_}?qM!rxRX%=#n`j^x7 zOc26T=Z~>7f4+DvzYBq+agna`Qq18D`kg8cr;-$q*{WX)E-_dIZ0@HBs*cRvOxu7f z$sb$fClHA7V?i)3P}GCtiGreqymnoaBXU(NGrGfYEqAS<{z~;~Ojr4FU_e>BE;tYh zQT);AYkG<eHTB%ydu1&IbTvDHnt+3RVJV?0h->J9^cD~TJWjnPKR54qIPo|1UiFe% zOQ1-*CC=FV!4+2FN$jVmcl=_w?gY7iKVa-|`Q`G8N#<2=cY7BTZv$S1NQK;|Q<$Nc z98Q*}a`=U=IK^ZGO<6d^jSQSz*i8)a&e}ssb_jJk7ma}@znZVsm)|UqSp`ABn*9@I zIZ4x@UCnera`tp}_U_9$&PrS$;sfSm$%6S(WI;fZEq44?%D7SoFTAQ^dzvcoWO-56 zpzO9M{E6l)BQ1MSseFdEaoRNPNKUCHux*$`^>He=q1<1lXV`~&eu2p4su|82GYVrR zg45#e2K)T|U;gw3tmVJ_i>l$-MABA{FOR6D*8lcLC@RKt<rt0$PBMb}T)f=X1BGy- z^1omoPJEoUv)Ov@`K#G#7ug4EY~WktoSYe|4An?2^vi`qMMo6XWx^2!Eyu<eJ(Y|M z7%(jK!+&^sDwI5sO-OSDV`b;?S`TdbdR7ngUw#rMhiFdzeR?sUSO#*Dv*Q*D@7#4_ zq3n54l=gWB_a&9cRUsb-3j6$%c1sXp8BiLsOaQ+q9=4lLioD%8FOU+d8)EO+m((4c zw2;}9o>4zAKdRkpqXISaGr^Hrr7l2BE(+_$C12D@)EfXngb@eCB)GQ#L-F!3F!3Gx zlG;KReZ}D$z^N;=0J;%Le{+G^0i4s9)VjHh2Bm-lEl+0gSc1IBm$OSm1JYQf71MgS z#V?#?@ba4lP0HaiysG=E8ggx>W**L0$5-$`@e-;B83h}l35_gQ4wU^9qyWn~Ksa;Z zE86zFk%vocy=9*9`epcvOtI<Zv|H-=>^05>S-qo?i<RwRUJKD0?2-cD?_Q>_!S^c^ zDN*#2X-YM&<W;ylvilaZ4xA-e(KHZS|K-4Cul80eU?5^XFZuim$IiX9A#&V&V!yTQ zX-Gi|X*F2<!C5u56vd0H#r(go0v(H2a!6`fOV+K6mSzO@Xf?Z7BAIjXx_Ar4cqCfC zc#iCwlX<{;>=_Ta)>ssUF9?R19cf3HC!D~j7iF-rJ^WrzPSsi>;FG<hM|;nn?>*c- z+<TNi-+TW2>GS;2lc$IK5BKtC&vu_56ps!LpYK0B%!_?<fYV|cP0I6DyYk{ccAr1l zfAZ(Nsrb-aQ?jXf5Xnl4&Y!?oVun5uGaK^v!;9P%)g`h}LR}s21hWltv$SIp({5-{ z7HhYr?A~tTLR4bAUM;xoHV{GyvToqE+oR}+v_WEZ;c&KUx43GQY`6J%c|1Mae~mLH zXKNU0x@*f$qlmQCMPsW<yff&xKM9NvqSvEIstDMeoni4oUiu6|@sdcip}LSXSdZCB ztAWx{@@`dqgoS6Xkmng#skIlQVkDj6WW056q6{Kyys(e=CN<$DPF4`P)nALmn36Zh z*{a<n=47WyIPY-MdkiT|YdX0BA)Jc)-%4v&xRM{%s2*0;RAyM#OOI=}76=xupH?lm z5XGvk=T+q<npnH}LaVFG>D3R0go7t_qHS9am}`wWcXk$Q5L`Q{5~4L~gJU@Ba*4}N z<w#Guw%kaR>w#kG5IUyv4LcJiA!Rbm+B3-RWj0!oXBHc$RGQOckLa`pKgb?oi-e5_ zw@a0v(xa{A(pv_oLEK^^L;6Vv2Igq$2^mIEDPfi+d<1==s?uv3zG=526vkcz(Ss+A z_L>Fq%%8mF%pnBr2~hUT)MErUf19^0)uUFK*V`)KE}e)UM>Gx<#D00WJ~&kqrmw`! z&KXY3TpunK4d8sA*tB!CIG<h~znRG%zhE(nGK{1Iw@A0rRnZJOzlo$AJ3m491U^#q z-^s<r1x>Y%rqn>)+DI&wSPXJ?ux+b;Io$3L1^tr0q=`H56S>hbqKeB>huFokVC*lQ zwtLr|r4xZ>jBdHYMaiU8Welwt|BEIy`39z==b3GSt|du~Q_$SH81P#sCif=#D`Pi% z=sAbax@^Ul87pB?g)EML)U`<ww3I`w5>TyBLBGwJQGjVMAfGodN)^*M`NgoiA(kkD zRHa2)W&V#rOVOV^@)4BJ*h!Dt{%-Qc7my-7JdN*7xLUDF-+@5rD@^{R{9x-CD?8qn ztE*YT5Zsl5aYyc^{@6EW8jaK9JyiUz7O#A2zr#@kEnN{X@*;!wyM|m^TkW3OPn#5V zXA=&MUpEF&jnLTBeG%L}UCm!J4#*c4VKUJC|B~+FF-Z%mi{s9*aBs*)6@mp{o00d> zGk}E3+{Ub&K^#=o><9$)06S!A!vQ_Ynfl4DhKlp3P)Io`ZBK?#(tztNphujND?A-I zqC95WM~Lto>L?r*$tG14siTI_(Kb^VjBFyRZ|N2`C!LW#3Vm$w?>LzoW_5C>i7l+5 z48h3;)aXjK{208y*irV5sXxP+^z4D3n@|p;_@agnTu|&*RFLw&&cw+T0CGBMZ5)MU zIDtrbBjO-guPFXl>@XdRw=irBeB0kp|8RbRJx*BM`vIrrq-f!t+gMduW3l9O?EjSv zsN10oqR%+3@^X6TMGcwdM+k)X?;jlQKK$#^;q%>xdq-dI9qvBbJ={I|>)wC1ugxkd zW8W(L5atsgOCK!Mnk*Joe1E$KM+^=<`E%8?4V(?{t`EYw6FoI$6xz%@Q3?_kE#^8x z1h%4mJgqUsjVCjP1@BLOvz{!Lm$2>#^?uG{9F<KHOxd|@Jh?XbJma|L_G7FvE+*%Q zwM?d$lQ)-_7wh}K|GhEGa`pQ6aJW{Vy}p{C%zl3|hb2M60m77@t>2x$TAr<M5AoV6 zUf%MF+cx+yk=q)J4S%av4n8UaCa#OhX#}5r;tS;A-hdX0!3NV@_CI$pg5BpKLD3D^ zWTsow6uqlP9m3cUl(q$TaYVWOK#HR|98f#rW8%L#O5v**HD|aw-Vz7Z_T1V})8NAl zeTii?UCELj!&DNhK<f1*KP#3W!p;b1E3~7_YxL4%!=Ie44k?XuKRI2WoG#;q;(s)Q z$-(*LbbWHV)ajME!v}HkKRI1RD&5P0sn|ck)UWGwNl>pa{hci1LbHtsSF~Lnwj-0e zhq|Vv9*6j8yqh?Ciac;%$lNk<i5U9hW<3|a3Wb+Q@k~pP9_}_o!`@L^6xBtcun1Bw zmBxcqe29N^kSckAv1RlZN1C^p2SDY@gDkkOAvkMDE@K#S4<ku@FX}mGZM2cf+HJ)0 zjc}N?a%@AwInr^B%x&-62xPV(l0(>Ods~>J#lB9k5Z9DmAfvS@Zn5F5U4c=pHdOwG zS@mGE%^{GM^|Agg`E7`PnmgMjN1J`p+L-4{&P{Ya7rE-4CG|uR{Kgh*ea(^a?YJW6 z>wX+TOe5BXjgYhismXa=Bzi0=TXzD90!f&ZpCKjXS_ite6mGV-DzRb?>Iv6+vL#&8 z>J6P82+cY80kdWjo!vS>z9MX`h55QI?zS3lCY@+vL_$roP@EED16jS;jIOhVO8joE z)-^y%MxfcP!WLOkV<b?YjFK=+Di3-xm`Vg@iZyCRs^xJ!WRID{RwQ}^7-dlTt1h&S zvH|YKn=vEEX+i=^LuF!~!|`LEfY4f>Y?5_M%ilEC*~<>1y?BX?yl0Z~@KOleQR^jr z$E?mgpZ*YIpx{z+1pevl#09xzee<(Fa`S!tPPetQ+E9p8ayI-~MdCHs!ki9I`8lRJ zcgC4GQDMoXV8&I3E>A^{S5Df1AvPtl=24`53cPaRH#i&l2N83z4tXayHUV+*l}GG* zAWsmOnd!(e+qf>*VH=MS<r!VM`?Q7^Ru9Lm;YE6l_6WBk)(2RHYm@oYqTBRLv{1gJ z{Ju-P|37>0-rv@7qzV7;PXW)%SyCCvmn1WpWfD1*M8(|bHYDY2M)Yza5|l8e01g0J zW|Zt_f1jtSFV(k$1CX-i8S$4`IOp`Gx^7)vU0og6qhi|k-a@-Mj_KSs^Ni6o1^l<& zJ^lMY&SxO+^SeY}Q-eDTccy1robyAcw6FDKOJNs;HewD!Jw4M12wjf_9>NyjZv7Z( zQwKPjBd4&gWXql^Kkk?+>0PR%jzEoz;o`M502KNRCD()Xbc%pmh8M`?&^HNdz<IPj z5)(g|;C~t+yEozk<!f$;aQ*C3eY)?Jix$Zh^=OXNDtB>!2^bmx2pH@}ZLAi7udPRZ zx-rzCSuzxV)*2qeGR}v*>uexwqcYH4MMLEZrmFf6z{lx{m+-}&qruC{ii7vyQVtS# zrMo)eSkKD2Op6*ZrT|!v0<UG(*w$+C;Dz8|@_I#JaKZ%ut%gyz-c)ud&r@(=4ljeO z+KaRWde~w-Ss*-XI=O>2@8ar?oF>u(7<c8+#9b8=e-_)FN(w>M9WmYRkOUX{b4C`+ zv$Pgfrg)!R{#+@DbhkzHyW<NRRv-C4oFC{p9D9JkHLU3IiFVDc=m`ZdS0W@?SEVg{ zD-1o(ucSxw0ydqqTY1{&hRD3Y8ls)yvBmvZxLUNiVpbHg62&3QtpMB>SOx31*=#ap zb{$4o$s>Ly&lI8CNbR77i9?rLrx*wiu4j`48Da~4*yE;HbMeYTc6>{6X;+hX!}U2w z&p5L@_``q~fDCb>H0XG0VE#FhS0W=LOR*fgW7c#@^adOS!yA_sV+y6=6e5y$S@hBH zCGJ0WP~t1<12LIDsDgiS0`^$7I#9G_MKSvzdJ(3`qf%XV8iM8QJk1dj(+aNO)E<@1 z=QtMci#RLM3BeJeI-3#jQovVfzs2c486NA1`Fo-%ikw)TwxK(Pk%_pgk{*HfhNLoY z(G9e-VNNfS6eEATLe|L~A-RmIR>sKr-~@@PaHd)gI&Zf`Yx5x@b<Z_6bTf70x%%#i zbGwB<Bi<9*rCwW(WVh>z8>g#xJ&xUO0I?k7lTp3zc+R_BAKMf&?SHVfdmL-r>S%H) zMx@cVik8r<tJT%;vcXEbu&y!U(5%*Jw5q4y+oM0gyl?_zohp$nYI)mO)U!@<HlI(v zn@rzMm=q@=+}}UBZUPRmh%}qbCp;)GYc~A){1eGnkRF;>tHc^nJYK!$V$o%<!fmH0 z>t`m>2E<FE)@@1U|J9CK*Lp<my-Mqi!^pLw^kCQCTYDx4v)3hnl6++``T=)7*3PHu zB}<c6f|N|zIQlz{UV|>|TOnou<3}eR-s^G(Oz}bV!P8FGGz>mp6W<(tGoCFj^(fPC zKk>Ze;?D0d+tXn0%>@!MKAQsg=<oxsH%BM0r<;G<JROhlUo2f0_{V4O*_qGBuO`Kd zd)V?kGjE^sep)<h>Ktx*;Q`?k_^-Fg+{^Lg<oxoKJ<Ue{d5LvBen~P6{5!%*1pmyL zjP2F=^rbvqjYsFFcq{+%7$!?dHg)_6rCyE}Z%3mE(8OfYp$PIF$n|QPmuFK13+bAw z0%q{jmA9fUP;+h%D#3H96!IY8U>2`^`<tOwy*(~4>dhH2BN^+Bj6-&tdQ)l`*Xv>- z<nKePR}Pt+{3^xI=o=?U?m8S#%4*nz!NK_@_|O%g1InMBuMQeoA`CDcM0Pm7N4kg* za82kGgt$<M-NbhWKRy?p8+Sv~35QU%8CIb&=~M~{&aaX1=3@jvbYmE`qSzEPP_d+W zEQ&g4Su7!#GtV*<!a5VRi1kfPb;>uP!8@e{U`kb{8MXFc#l#g|!Wo@327s)dWLYC( zQYa#Jn?O`qZCTfQfh2+;BUmkbM3O3HnrMFz1+j121=;J3kLUMQQl;G>&n<{EF1e9e zEe(@QkCEym=cf<9s{QRJHrdc~B+$b1==2+8qGeXGxO<Bk7};3n1LufK+rCi+Z>U}9 zLYQR&7w_UwLg$vtD#}TFk~GJm)%Dbkg^Mb{J}aCQ9w=<&N88@EFb3~J!2Q5i-X3hI zyTQNUsC{Tood<7TujKee58oIf^pznyge4LxXGEbEzcP$a2obj_d^<NHIw2^7YA-bi zc{=AP=0L7|WQoRWWaWE_L-BA(X#vRuPSJ{HWy^w+qGDh+<g2u>3xP57gq<Nkj+j}y zs6_i#k(<}4Oev`@_o=Jm%#b$`6l2jXqCs&(?|4z~x?K+mH1A`L02^s%a%J#Kk+Z!w z?WM#<YWQcZ%$8de2_=H@L$-iHg8$wYGtC=9917foZn(kTsSaa3eZ)Sghax43j6SxJ zhl;iRZzYInp^kB}eX4`-lFBC5rihwQx>kv)U38_o>u_1Q%6T2q)W;{TGhBNh9RE)F z9s_bF5u@FiSKnRyMlZ1tUQAHur^U-g)9)Qau){>SdSi&9t_-{4xQU3UEw_R|;tFHt z2j*5YwF6LcHawpP7q-PfWzy*~mlG1#spDARsKe$2dI++~w8kHutwrh5#w=^MZE$5A z??NgU21NXdc6W}iF|vy~a+7#LbrwwP(2@#z9W!;t?P=>S)e89t=9e#VlJ{hBpQ%2C zBK!}<$36FDO5Lgvx@(sII3Y6+{Tn0<K-4cTN5|1&mDkt>Wmvu_zh=k^U+b8;F@Kdc z&=G8i2xS<NobX_hHw=S7@M4a|CGgXWN2BjY&U*4*hOjQM^PJ98u}WhuiUl|W#HWfx z*R{6?NsY<n8dmqbdN==IG(y%9$N|-JU7&;VPVNY+3ql-VKjx3+D-Z{~gQlZd7o@Uj zr|cM8%(rQr*5N??jq%#1cFp-$2gP4@E$>0Q5nI|VLtQY%l5Ec*7~<+^e>z=2afPEq z(L_!>uaB@o4VmP?a_QE4&tL!qH$Vkj*<xgdTiv=alZJGew5zEu_r|Ymfgrguk!<G# zTHQ-4W1ln)V_CBuyVJjB6SY8@j;4~}nR@U@dH}GaEnWLH8aegpe{qs#-8Qfbp!pvI z|8+N(^JW7y%%p*R8?YtpTW26{?FSC8kFZB8wWy)8F<liIwsZjyF=(h#qF_=t4)0)2 znzNkPRj$Tvwel&SaTiLmsp`qoS_Q{Ubl}D#Se*r{+)=Ahu!XFeA`4`75~^kAin@!| zi0Nv$6>DZm+KF6rqNl5iQ<H$VRMUhnmSW*$jXdFFLWA(u;yb*o;x>Fu1Sq^s1R}hx z;iO@ss7jVaE%&FLXi`BttFGW^mMvbY_?T)IQ><a1i^4SwvQq7RQ8~ddYb7s=;uiHR zZJ&$6Rg$n)^+QoTp&6?sFN)#`F<Cr$Q53IHSzxQ2y3)$c)tFIBow5Tbrv%UNO742} zqP3mw+_e+_O?3V+w*h*>(cssc0BOhMqVEY!DGN6N$fNp!#6Dzd%UL&I_w59eP5hbG z1?MECd!ni$%iSPV?V}Qw2WG<S2}-FbZUmC&HG8WkNF7?J8@6J0UMlt0eCr8aMcFl> zO6LD%z$Arx0#i|?Hv`P`ini?uQ%!+;MST<N&HKncxzH^Ya7sP4C)wV?jYSu3J0=YT zk`G5av)S<K!T8O?5qwQ<Tc@mlglqbcl>F(%(LK2HN4Uf*+;-HX@Y9a|L&J}zuf{li z-LGL+xT|5gt_+@|`C`e?`jmNyONbbR)JD)AIvOG<dwO=<E`(fTxE-v!As=?M1Zq0R z#!Fz*GRqs(4Q62{=gpv7*73*r+u_xGAAUGqWH&lB++@q{;ksSAGd!j3w`T~UhwUxx zx!(>&u2f95dW4uU#1)J|wq}uMj075?!8s$dF2ZJ`4{0;4l|>ImdMDQkt^XO>dm%Xw zrYCKfVxPeF_lVEP@DRV_wyXK{{QJ=<S&9Rd4dw~<0WJRbnU-2*6aVOC#3HFUA2p|Q zI0NP2_4M)_w>B)k9$sM87a|$bRu4f4NU;b{_61EIX`tJ5b`^g~pO0{B5Buy_<;iri z%Of@ia&ls&dJnNh(zo8%!}-&*GceuK9#GPYz|yiFco}!AG&N@9o70Ysuh2B7W72$h z&Jqu&v%sJg+=^ZrP8PU5PISwn3n*WvEPU^Bd|vP)yAMUfkEPI4#YK1?o==A@^cV2# zK?S_hdvg1XwUc{%;|G{8hH~|8rO7VnyzCJT2N$E0@!1vP@OK&YGY5Gpt^IK{L9XSK zBloXNE}by?3Wqpvc8-0F220e6>BYevK-e}_edHGy3VmyB`{Iv>7nKeik@km^S1o|M z>Bz6R1X2`RW5hZK_Q(9=@egob*457w?CrGZ4^ft*wAgEalyMh{8?vp25Mk5!6nA$k z2-A<8A#g)NR|nMkm$Q==R&}Oc6*XF`0eAf9qWLS}cXDu}UA~Unij_uL0O=v+GW2X3 z<R@I=2@#8phfSd&^(rq*ITpIP87}*bi|@6|{5_(+-2|0=nUP24^>6dn<1;t&hFZ0I zA;*(rfiCMBN7v^v%VqEJaxp!h;#TAQ!{tkS)0ZdI>Vx}FpFcS~e)4qx@y??(Jdqeu z-89BMe(z-cl<%+5;BppKy1ojVGqHd!Lh=@(Vd4#!dPB32KHitBxA)LlH4*wmv%dJY z-n_?tqZ)XDZpa+?PI+l{1=A5W_-Y;X5YJY3bFtGqA#IF~8`5=bVJBa#@n=(<uy~22 zRB}4QqyC%W`K8$^(wi4M0eJE4i*NPjI3K9t`KKFM_pU_c!9N)z6hR|*QRni3xBKmb zwMOp_WqxzUW2HfGo*G}qd|8W2Q0cFXZgiOMH1%RF1lcXerf+%q4vA44;=cAe1XueN zVvZd4#k;U4u?%yeU^gFyVtq#GBMAElL2G{`YDMS3_ZUz;W41iX!LvsBwy3xaHEd>C znWE8dG_uL=5=Dc35YA@%lq(wVLm|axUv);pghU`}FTCNzj|>&v^A1y9bfX3Z`V3MN z7Rvbmt`zc+6gd@+9U-@nKz0B$Dqf*Vs*k84FvIWQ)axj$K=O7ua2O1gi%Znu$?yD& zUEjIu*2ckx(8w=yQeUeEkLlnKh|LZ$RGE8yuB#-1JV(-0zmTm2SW4_-hzh2vQ5{pe zWGKM^8fBCh_xj`qt_juJGmVs)fmb-saF?nKO7_E)nO#-kJ5}67i)kYMX7alc;ERl_ zxdI5XAsm4?qR;Np_`A{Ie=tP@-rTu6o<AHT_km1-{7k1T?t97-J-EFy##}7}dh5lv z%)Jp~Mfp2`TM&-)t^#aakvTL1I-PrzI~_)ffuvC!OXZr$B12APWJ6?~4Jpa5XxZH& zd&_qr-y)V-o`2X1hKbC>@~47CS36qINTJRCrO&dujJ?_fvVd<gDr{4zCE<`HmrM3r z(n!GpKnt)pxhxIp)l+wpPEp{DlVp0~Qwd_sa#bIz04g*4bwE9k7AQ+D9J>yxVIV)? zKJZ=0;(0UYB;SNkp+vF8Jhur+#{zF=U5?$APkSV9Uzb8jPl6sY6*!@!83$I)@8w6# ze=QtsM}yB=VQcbts<Y+IV1(%Kid^xd?JRmDx`m_cBHhGyXWoN8V0<qa2>%4_>m$~~ zbwXZ=W=KoBQjsMyQpGsN00$_0s>%_m&RRj*CwEA2fh=S$Tt20a#{-)R4u<V*xC9(7 z_<^Tvxib<EO>7A;Zg}t*ilWAFor}WXfouBb3?r4^g&Bl&;GeMjf}=AtMDS<~c-?CL zHTQ|NBq<Qc0fzY+{bXn&3@O4BsD!nZM?~bv<&5i~Z1JMmazLz}<DOY|Qq;2){{oDF ztSr$1m_=9JhkCQX2_jraBxOw$dx8tQght%rAZ%!~Ks9r{l~a;Y;E|PiRq2$Vn6`ok zG#`XdzN55J=KNH+hSS{vQz3BdPtPRpl4%C14zI`;wSfqSJ0-vy#x5&Hjqgx-{r4g) z(I>dQJ@#&3<zXaV3o~l&E3Kj<VKq6FaD)1ajhl%t3{?*3KvrPkeQG75h9tHjx|8^A zD>|yXiU6}V(OjohXt#?>Y=VD5Am0a;*g?se>6`SaFY_z|yNh40H%A%DlR8!}#ZB)J zl%QwxF=^yXkPZMjtGK5dN+Yin+6JI9|5<>m=DbY)g1R0cVUsuX(+yQ?&E}yZlFgVk zumjDDwlE)j=tt;Qhj-`h`REKu6=kfry<+_8^@52ZqXn_zV0VEtEVSke2{I{eSWi*D z;^6!kcK;KJZan--B%(odyhL2+;4y6;J;Yk`>fca&d^R4PZf#N(;)>Oq8KF)l?`Mo4 zVPlv=RNXZ_au957VoWzeG}t*m<#--FxnzXO))zN4oCj05K#J?NZ-fc^5$J&*&}Y{h zQbm%5J-U^LQ)z~gz$EWSo%MibMQLBE%FM8CT#Z%meeed$4y4QD@}P%`cg3I1s+b8A zg+gv;u!mU0&=o}+#wBZJcUn+P(4E;UvHR}+e(<HN(e3vM-8W`k!_@-|`Rz~ob==10 zR_^2BTyW<uTYxrsu_?VHd+6qT{8z-p$*;u>X-oO*%}ef^x(8fF{_6M*Pr7c>^(7fT z*(t0eg-s?F3sx8<(3up{{%uhi0gLq+f^>9aW2hR}$W14^(NA68R+^6e83LD>WOKHk z)>4k~^P3DPOwgndSGL_vbkr>ueAm*3QAl&FES--^!*pY+!m=7dorI+W+n7pR8C&v= zel_?4i2E`tM}&6U|AO+Y78EOzdZTsH;l^CT#E32_!g_|ja$U|W6{K8UI7xuprlBv4 zs1)MXQ(>4Usv09v1{)sN>c^E(GCE(ItJsa<>{T~y@-a$YY)NNcS+R-E^-UTL89YDv zWJ-GQZ-e^J0TMUK^;`U}H1CIK5h`{md=K;?x#+o8Pi#%vaZKA)j%6)muK5u6<&RVE zoS*-3HbV5;?C|w);-uwpx@E`#9%;KZ*bo1f`cqkGb%0ifqwwcN=$bUhk<*1(JBEOy zQ~|I@{-q0NeFr2UKzD|1kyEN4mybc-2&dh<+F_8?0eC9c(~dc5q&bdDjCyamHGH_f zdqF|~p^r!2PXWGC-@%r{m%fAcQpXbwfgJzKnDfiQ9cXUR;m{DNA1u(s>kcu=LZ`+B zB<sM6_-)zdm$%<ymSV7r*H=ziJ4zCCp*Hp0o8i^V4nG{phh?`r88Qd&*lhToxc*=1 zdmUxw8;D(zHnX!KvMLw5X7@cfJ{3-#Gklw2Ti<JLF;}TM>A&VJf#V56aQUKzQ{NQ- zl`)1I2`-y+hOO^^$6hf)c3yXLs!gSV??N;dmAh>N43$~McVhpIxOG<sh6cLv$2Llt zvMuvB(ei2RB9O0;lhCUdls-sj50s_xq_uy*68>*Fv=PwNaM5nL{e_ruOQtADw+4+% zZu}VdZ-kOWudvA_175d2`|Pt=a=wHcyjIm2z&gL3qs=VlqTwPM-zfpYVrPK9yLonG zb!^q&TBWj@xNSgq9OfEg)aHEYHK^}6XGA43p7Z!hr>$s*Y=8;JVML()AsDl{!L1D3 z%d60L5VVdkVV$rTKu8&v1$XWWvuMjJ6W@W-kL(SAOJLJC>66zd60n1%^9?UKeq~$~ zX1!o7<W+nWrU_Ycv|JCR#c_t*;i4?DK-l^M`&o=bDwL+T;Jb8YD%pMfTDx?MhaCy) z{?BYcN{?79sUv%9Q_Pw^u50q-k4NC&V^i8Xp$vI$io(&&6n#$DTUfR<PRTQ>wOdOl zYep_*q@T)4^=cH8S|gNWrByW9E1xHH8={wf-WcM%=X{O>iq6^$8rmP*)5g^H>Yg-K zCD$)kSyU{ul{yEK9fHjF{E0*Vmx`)?%YWT;Lb~0=#1atyBTp@1xn}i2Wl>f`xG-A7 zgDff)rzhZ7IjPlM4TZsNg4^8v`WlEbec!o@Y-qPDE7@dT38S^aB0ATgIp>x9r@@!T zJz5K3%XYY(!DulUhW}vna~uAh8yo&?1mcGsnI@KIxWMpdhNNZukvPFp9kL<%+*#vY zDnGLxMc86p;~`yLT4_a9x%K@EE4%I|t26*1lwruJ$lkezv^IzT{`v66hrfoj)`y=9 zYpc}H4@cJ!)|x3=o6T6x?~~?;GZ7)Rs;f<eem%lYIAggjIUKV{<s{v$RC5jcYxPq4 zx$o%_?;JjyU5ZCF9;OJv3x0~O&Yg*F<mfH(WE564y%+3BFDd$nP~t(fjN6g%yD{Qu zB=%~BenR9KGbA`@oPWK>X%^2P1e5xWuYli_hig>$$fSWuoro*{72H`<06z)xQtQY2 zW^~CE7m$XPY19`QK<w$@p>dp%Gr4bEy?U!VejLucj`dnXR~eKTGn3FVafjxNp|;jA zoSJ!0qj9ajpFxE<A#5VL)fnTG67n%#DLWM*)2dRbJm-7o?(5;44Kt082b-+|<+8_G z5BoWDHR2H{F3sDWU{}4flgOK#qxcv1&$Lz30)_CP%yQ%R)xv4j91+@ZoC4jUR(h*E za5!V2DWKyC+&Dy_gxraL+yqd?jqinJ+8alyp!zyqros?#>eU=n?FPzkiF@EmoR*#9 z^6m5CU#|x0+v6QqAiYgRhNJ9r{R;jV;If3l%h3Q>U}B-~^@0r#JpbJ&TcB?Xi;EH( z@}=9MQlYouIfLq5;q5MPATER4XGYuJ#?eV+@ZoitJB$_#hEvun=vuP1TL<CdvdIDr z)-FT8{VCeN<OL6NmjsQWiRHj$6iQbFVw0P>!|kNU(wiXP_eYb5=li3@<xDco;Cz@r zQ|wu?L_A<s39dsRY9WJSl>mvfYQ2w=;mS7~I7#VJ<Pi%E66{DJ;Ir&V1`-<)ior{b zUG^oX#7dMAfXZ7Otp3^Ymm)+M%i;!y3x(kj?%F(6s3!<3h-fKPGPF}&HkFs={o+L} za+<_`f)p;m_h8Wy-9o^9msQYKLXIzyz_N;+0!vD9_t7OhM8s*UN5&Z+j29!5Q4B1E zgOeuVnfc}yW|A9_VAaa`LVFYVOQ}Md`XE30MwIezBNel@p6~)vY6iy%Rb2lJbVRB# z{0yl^0fP8W&*9KK8)C0nm&i|N+;A9OL2okqg4LAXgv6lTJf7>v4vX?}NOfxVa0~N` zX-4%}5zg4ma(QtnJIHCH)2E`zNl<}8xSpcvjWBRbrtDnxXpp3p6~g#+tJ0ktx(0>2 z(C}2FiZ<2MBC)B?v+T?sgG{P8?yPAKbT-o_>`-Nd<yqded-A+742q_24dO0q+uVdr zE60Vgf04t6=#r+{<`I@2?vFBu#%M{v67osIWK3OMm80VbE5@x-j|^~7F>N1CXRa5A z*AzqngBA#nz%sTh7?3#&vUmSSJkyV6>|lk$Si#!eei(R^9dBlK^}wE3u5AaiL@MEY z<Nv(08yHm|O1@G|B5m-NTf^+6?7DpO(MG--EOU@QN4fBxPK?e%u9o;{AA6=Y|CY>F zzRB$4DsuhgpG_F->1SjeSBG}<oaO8xs&)MdeU1wRKU&5gEn|~|9hxq;4vpZdSY@{P zkG*<Mb%mcRe{{=O(>3{Hnqpe3WocJsva{5-j73YSKjws{O;QzhP0h%_b)vAN{b3|; zMf=4j45@opViGxsq}@zGs=c52OG)N>+n5Heg<fqj*>Foz@I@nPncW@-*3(|s#r$Jg zqL^;F7_zjC303U*XJD<{QHynKhK{kcmj|Guly58#dfV*E`HJ@CmU{=dH)g+Eh>R6) zyN*cuz-;+tKz_97VIY|q3i4X|y4LY}*AZXZ^&RCtTKCpCaKF>}nJ>#X#srmFLA<iL zA{SEp*Rb(Bcqp;-JIbxfYai|XaIw%wPdIj(m^-=LLilL!C%G9rJmK-iv=D7<&GmTi zS#Gqezfq=fTcOMu@%WNzaPsQlWLiHRyLgQ=<&tosbx~BlQJ8Ap5L?#Rc(oa!bzu<< zaYm-#A@0BWU4?9Ep}~JL0%Pv$9iR8Ebgx1a4Y>7*guJAtXAB_h1E)mLNQVJfA5^m( z+6C52(uphTGbM7vjF8d1g_Fdb<_qCtbMBJaLX+tX`GMq2zYv=T%XqGu_vq+Jz*rY6 z#aKFyAm28Z^<e<5Bkaztf_ZeT<SX^8`#pEvg2bS(95}d~$wE@M_yrl^Jx-{}=()+~ zPn{0sZWouUT^AY`vnfyWIO#wows}A9-fJ6yn*vfntcVT<7_8M?YyvHWwp-2JBxv1j zHQ*v(4Z%qzHF!11e^EM?tEZ>+>{Q{R#gEEq(Na#jf%@}PPDYcguXi$CR#$kD5oy(@ z%1IAx=j_FDA9d4zcim)C>4j`z3@2a;i{!|8&OSj6N?KgI2ijq(xFCnv^yn2*A4v#J zMfY~7)Ce{fq2pJLTS7$UeqzHe6-7P1pX1VqVkPFT#3ycu|6#n4yD=W&?zQs+7^k?f z%Etq$*E+@Z%ClP!vi1T4K_lqfQM?XC2c36$GGA`KJtkKs!I@|oh91&~^x{|Sna@UV zX9%Ynyg_KrSR+dZW8SKZsH(+ufXJOYC$ER&2~tDNVe6ld(lUu3on);-^JR^=8`2G} z*;>}17<-|V<G>_l0zYc4kzHJixLixq0vSYYz1ToSUTmVxajSfR%<3;M7m|@YohsN^ zYT!uoXS{d?ZL3)+xA<+jKC@+o6bJ6^6Lo~98d@92=ujc~hKT&u2t{yWyM3;%h^1vE z7MFzxQ|5Sp66w7%0*-=zWYl(SNQo%c+34ukf9mMEY;?7uufFso&}FYHYIHNQPU$W? zQzDRK!7h$T$@2(=N_mrbFcVSRj?scQq3#LoO(9gr$uSCKjOqu!-+w(i`Oe7_aZtHV zqa_lKLXyEX#grhq!q&n`(yc_P>0)t7^SxH8mA*=jl89O}{;*pq5OMI8W`MOPP$9hQ z2~}ePf4*cAi^(+iq;T-UMqJRcJ6*5(oKB%Ly(EF{u%K8S6-&e~sKdIrVwtc<{zdc( zH=9G*d_MYyA+{U`rmk?4sUf`!cWlukwywk@|F_B-Xgv11in6$u_YpuPLQ0NeDgKp| z)%UnB^z#8ER|kos7?bG&M=_8M3Pu+)0_)tG%$vR<|IGnNoH+>%$&!0)jc7Fp#G;*_ zY9x)Gk&=)Vt|L74VLB@G!K&C8r<ZWL7_7j*i-{3e?!d&5B!fQ<KEP|i*lx4<N|;%j z_@40Zlg1@Cm*mYzOEL928|H>fl>M$sFF%B~@RZ%TI_v1yw6TrFn+xa`u_xnXnoXW> zUyq@AjIh{+kR)7tFn%L>ti)*^w4^PDpkk!aUR*6H#`VYeBrP0pNs+BwbH~>;4HcCh zOITnkz0?|@B!??<rHzOpfA=EG*gsPO(?>vs1G~aXotKG)`kafxgJiv^G*z&dr>@xc zv3^=LV+fj0=uNG4cON&r$;u{~P|K{$((5o{wBw~qTJiW%qk|9<-z*79j@GP*qJ8E= zXG$TS{u?*($Yf3^Ty^{d6QKr@C;2LZ*!RXr-!}hEiBo@5Lr*G|lpq<^>G(}J?x1U3 zhlF5HNiqEAmPK~BjjDx;4K(acrfQ4$p7D+!r9khi8?)!WyUEKX|B}{uB|}Him{F_+ zCp!&Ht3TSNf}#w#P}AV+;ryv2DpoFWaM0Nw7A>pKhF#Jxz@qz3#FA90JbT1Sb)V_^ zPb21G!^uIWs}|<Kn>kyaZ*OZM9UNZk_*};ro*!wu8=;}?sw+4zfp0+wsNCeoGFku< zz+*bP7V-&5DPQ%sWx1NvmGc&`sJg_8(~@{mkDzrKl@cTSk%;{kTE3uq*278MqMTl8 zgrIzLb}yLQ123<m62xZd)aU)X^(~5*TaT>aw;yMaTb@nxrvr5}*lsWOGNO$m4=A+A ztIXYEZ3(6&YSosOSv#n|38HQ7S0ThV!x=9NZpZJgNe_WVRmXn`id3wN6@<53UaiJQ zvTwH%8>J%at?UJ1j+)Hy*(fs-#li@QLhet8=c74tr-PY{BWWV8gnYW8ZZL)ZOL?1! zCVvgnT-duxseFFFqU>$#gane<sftz(4NwS8cg;-W@Ba`sj86+qedSQ|(FEBhz! zB=;FO-?OM?=XEQy8RtfqQb__7P<SzQjlh`gxQAu+Vc)n6w=lCzPUWO}aig8eq2R`< z{SxZ;ACx7FHyS#QQu6E^xJoSkx2FfUEl&ASd$Cen-xMQ>E~-hXYjPbKYAD(s+kQGJ zINp3Z6Sm*w!p^-ypiz9cN3Y#6wxlAuaN1d$$SavL*S}$K7ni)uc;EoXZ?H}HE|~~Z znOSS|8b)lzF}#f94@WZ?!dKP#NDQL7O5oMyqCVV&+E52v)0~cZ8l0#l-zwJmI+ao3 zF#U+1U50<rCYjAqdS`Mf*$iTzz>04*Ti{%W-%=Rt@?jksa0ZwU&qm&KR_9h93&Gg- ztI7#cMa+>f-Kpkb603N?CZ8|zMDsLVG|xO+ONL<5Gz2oxc3v(^oX<Ac@&VAoDN7f3 zGRB)uXu-a`_<=9E>adZWV(BF-$^<S6>~v+82UjIk=@!bOKn;s76Wk|`Y4jk3KU!$a zMfO#Cojy2@iSW1BCGZaJFPeYk9TA6X^3Le3M6Y;lTsuxG%3t?GW+Al&#QXd4=?Ip4 zOdsMjI@?GV`S}#LAuHK<v`*YLBGI+>;YoDo4_ob5=8vogg_25Zc6qXx&Pr(zJ%b}- zucxOeU`0!W$F`LAF722@G<lONoKDhUYq;3fOwM&P=iRCUfQuvMc&nDU_PHaB{$rAX z%F!EPAS(Hf>9;6r@lWhVwU_;&g-+|y*Yq=fTD6pFmQO9k@=g36C+(#Zu?Ij^>`far z5hT}7uN7IJttD;wVmAIBA)e7^qu%uAy!OoASjnWJVw=EX#w}(3@%BJUaw<cxnqJ#_ zd+?P$$IC3s6*f!cK4QCb^6cwp@a#^Gb|%B~E96W(I^g*zw_HXKw06xp36bnym7Vww zH1DLW)82*EnlfCt;k6M3=&=qPEb>$&3LA03nh9QXo^bbdOBSzU7DX_USdI6IPt2i* zGr1624sCdE`Ck}TY5J{g4{f|bA~xem2wQh8fL?t0Eq9F15%Lq8rZ8YfI0Y&3JDH8Q zt@}@(KRG;p@^t_4&Lg^zvWq$i5#C~=_B<i@*uy>qgO=p91sQ-rSLUKj?<zB3rI=0u zbW2sSZyf8fIhoy&eo%I`ns*bqt95|4JZ?7bLx)BkN<oX|msw)O?v_{5BwWSl7{Xrw zYlcY7^ACgL-LOJQ$CU+QL)(@5!q0ZyBRTYQw$r{sd>MPB30k+Pd||e_a_A~5&6Nlo zl4?ihbme7y;H7Cwr(CT>%wg3K6^XjbDx)W;9s|DHF6V<ETI`2VMwnB{@TDU=w%>Rt zbp0s~Hrx)|MTbuv=^MTm-xdE|l@cYuj`3Xxh`*LK9d24Ho#1@zV^h0);k66WghIyc zovU)dNG{Wa>kOgtJvYlEa1pRVFYBjbI%{*BpTbD>WJc4;YXR7G1eX6QbBvjn=tGdX zFPmz-78KcLdC>-<0n^USv=MIxHQfGjy7@4s8!`u#b8<bYdRe_eu_Sbbd(d933Dxxo z;;q5&^cqM%fssk>U5?MOR^Q&<+27y!%dt+rkM<t#9p+jEag${D!SsTz+Tr;?FCLo@ zCez6s|1wxWR4CZkhatdT=B^tsX`-4F2vquA9^fdKYzgxwV**kAi{D~0!$7J7<hOtN zryOtrMS*31XoPmIhr^m48)G96tj51`6i6mNT4)GMG&kJMPV51*$^!og>N|?%XS1UM zVz*v17C3ZrjM+Xh-vZ`kj!3L6Ys@HMeYwjaCtPHgu%Q6*csy}F2)Yt;)PKl4Bar`B z;us-(BKMDnKXed>Towf@6{vumLe!+qHrm*z5rtKSO{!N|{$>OY0Y!2eAyqEyGnKu# zLU)4P*Yamm-6(y(n1jPr6%O$3Ko75~s;Z*zI0j**P;<Ev|8h1Oeph0ZO{JLS8~(jN zrFt77GY0ajUWW&j;MsO7;Veu+zT{szEM1tn*`+o%tn%ENF~yP~T2@}H%xT{*WOo*i zM#K5yDbj&A7n%gb&l91Mw1Ws|{8bD}KNa?^y1g_-^g|@h=AsL>gT^V*NrF9Um;zhs zFQE&bL2ll##d1Q5b6|ZV`F?yaP2qx*DbB)9qAc0K=A>#iAN?{WVni2zz?~w4k6gla zo%Tt|NIo&3YLpj2)%`Hy-A0{|B1e_YKL#~>sG8-I?b+($(({~*I|VdynPpBXnCy@0 zn%#0(d0^b_=_ylroSALca=}FOddD33)kcRp8e$o>Ry`=e5N#Fr?~VS9BhQGXd#qKy zI>gzyrgVz}|HxM4qfFf<{Pz>Hm6C8}uJV-c%~aP^+8S2<Uq*GqS2sK#&cvn>5lJ<+ z--w0AJun6Bf{8*Z&Kcfg72DFwj=tpKGMofG#;!1ODx^hfH(wOgNtrh2e<g!}O%u)b zoSY*UyP&42gJ+40d|v>%DUUYiGl~HI#gqpz;4V)~C)@CHQg;(rqoUqqMTz6Hb;N?f ztzWll!xvRWTR+*#AP!_8o;b<qu_>~t=-tehjjR} CeJQMp?RvQ$*MeCqB@ETpA< ziJ2x{(Mu3cBQYF2dtr3{s-V2otTju4aS?0%Mn0Y#%Mc~FO-wI?@7seHn@s6_IXf9` z-X4VC5Q6jRd~|wi6R9_Jb+n8c`>vUOP}NzV#2;gNel?mcMS}IvTm$E)(@X3RE$!{$ z`E;n+$*<AZljn~fE$xZ+*>!O^efb|q2Dr4V)`6TZ+f9UN0h#OEDwj;>9EGenB~s@- zn7@=S>*!YNG4IHE#+;IJ`;g8VhksT!y4kBYH84d8u@Y;;ZQ?Z<C2A+HnUcUktHP}{ zzP^sfZFHQkZsk*h-u6TVe~gT+NV#+@u}kY{dN*dBz0&Q5IKkM-qOl*Woa;D;npJsJ z1fr%hG9+uDSezI*`Jj<MjwYko_(Y<@;>WFx*jv_)5GHKKVw+Sad~6=8=b-Hq$nte` z4xZe{*tZB$n;$a(BM*@sb8r=D%_W58;MHU%B5X}az2L0WEva8_>KW>li0s(sGnkB6 zEG#wsR5(9+1l#mmM;gVGMV8!_xN4Qvnuo-OrEvSN?9Z=t+d(K!>A^z8Y*TI(du%{- zmbJdsC-8?17jaE)O}!S?xB+kKAt(n48OQ?<hYZEM+TMnvL#m_`RhzfK9}Cp4VUz88 zd^LOn{roY}J8Z_*+KcZPo3HXgjV){=-85%3#LRkt+Sl}!yji2Bk+fYp!0uzt=5brR z$FJL!TOR5O%*)<#Nn9r$?9)obrk(X^R-b=AI_2!o9aa}en_J_aF3CzOiX1{P{N=`+ zqRag3x+{s(dWZ-+FXMnYm0<SX53Sf0m&&v0A>D}912sdjli)87jjuQand5@qf(F2< zFK;5GW_I)beeavrg%!DDtG3q@Q$%-F6v?!+hs4IEa7mdp0n6K`*6arvv9ScOx}wh! zW)`-o{wd&if?S=F7s7Hvb;D#CYr@Q$<L+T#-p0il9_`@Rz)VTdBKF!w!;{zWf>Xkc z{jaffgWunkWkb$ALP<bFWBy`z@?HL&^dJM4acNP|SSGe3{+F(pFdZdB-#JL>n{})g zCZ$81Wt=M}it>w%asBSqw3D=gAcy^1GI9`AQu0F|3~(f*>5I*c&B13*->?^E_|##_ zZf+b~#GqprXGcTnK#08x@e{QgHoRZTYc<U9J}o<bhP3GTJ!kY2{&gTZG12~zT1jWN zUkv^rc+sRoznhD>uZEcN3P<CLelGuBz-=%-i9yVrfSMst2U#sBvy&emKl+WbI2^uB z#?(C%-PS?G5i>-rQbq2;^?~m)rgu6*5IIVp=S`5^LMeO`q%UV6O2DV$bvpiTbagCQ z^l+VQU_F*MB*_JBnZ{UvmU>ql*{KHEp_H&Zy)ix$JT@xqoh5~NMzyQ>F236eBJ!SM zMGUQW?H7--<r6rxDD1oT#dG9%hedVh2=I~Zs8a-Zd{wdCIVLYe4Qsc$qUfrpdlp8N z<FwesNIu9VI7t!sqhUlxwlYE<@`iNF9aUYrjLFpm_VP(;r)y@fVpFMNrsOCdcz|@& z_LPmaAiNvvSmP6VOZWDp{gfkLMBQ{Lia~ZVN-K!dhX=^9uX?`xc2{H~7L9X)R4fsa zzDay=iYqOkp$gTF<Ter=-fT2pgvZZODF6z+mMR<v78I^%km{Y6C2f_8xh87?Z8|3v zYZz?}%LAma)3b#9{Zp@PJgr-91_!F_)J3S(UUTR%d>T!k*luGPppA93yLZ;1wH)d1 z+-({2J(};Q16E7U9Qltz=XNO_Eb7YrBA3o(O2+X&gz=;84ZDBxA=%!B$iZ-mcLYSW zAFiLHDIxBG)A30|`NG@02v!?aaBTU7W2pG%*5J<I%PbMAXksbi4a20#_q?1?aM|;> zdYT0M>oyYN)RBsbECKDD_E?T=(+QLdi(ewV*yQZ7$+gN0w}M0-3xkN*L&(i~kXX}y z<7!)dj&qx)Ros45OZ*-oj_XygS(u7cf9F7&vTltvzkG@H3eLTW%1jM&=eG$YC+fIo z{pGE12VZ>!p_dhLAUXYGd51!AZF?l^E`ZM|>TouM2LO}U_BM`PC*AWidx7l$&uv^I zZSjM5#d2vb`NTICuBBUpOV~}G3b0*d=|&f~)O#0JCj`m=srABk*Yi60cKC0U2FKhU zwF|VLA~qs2lF>HB-vn*_MNr-v@gjIo^q2b~pMCb3_C|6Ps3&Q4Pr;$tA-9fI+j%f{ zvSUQt+A`C#t>S<G9Yk!HSk|!e#qGb|LoWZ)9|Bv{FF?Z?&yMb+jM`S~Z~X{8BkI+4 zmB#bjR&3hIo!}P=wL=P7#4LjOSm|Q}x8Gcx<A5}Y4X;D0rFTwFMi<xw5pMLp;ls3s zU3&Pzi^+u4?epgo#(U7C>}#O|P0CerGC}B&^QX>V%wp@ydp6$Nga6S1Y)w0Hj8!$@ zM<`;$ZS{qh;{)=tQ;xDLtn%C$(-2S@5Qx@DoooO?8bL|yPn)k$+czrkrwzN~;gZli z0Dcb#2eG)vZAJfiiDf2TV2+vqrtpXR*8RU7h$R=$nl72ZSLVM#QqWtwWL?VYZ$pc2 z5?D?4u(?l6i>03}k7YKbj8O;4gHB)Jk>=7*<t?dfDRR}(5KzWvd%ZHA?~?N41<rZ# z_E1ivm?3FURM<;6P_ZLu^1f)+Bu^n{in)T%V^b1S`G=Cs<W;lBsXGf28krzEn~;|| z5<Hs`52c5lUrPqszyytXfldSpq9wCPq4Ptm><YUn$B!SANOz=Q;JTJJ%f=N)i6x2) zH!sOjL64AFR8&Fhz77&AMiGvD_KtnWUqQ0jw}Pu5t=HWZ62m39-OW@_0oL;*Ur%`= z^~JY$)eQWFbHnG!L@tthVym~OmM#~W4#HMJ<$Ge?$E^l<Se6$Ku3ovxS4Nt9+rjf{ z+r;5|wPx4l(f0R_Rn7RsQA&BJ1g;!LK$^xBajQ$yRYL8N8@|n1PKB8@th^GAaJNBT zg<M^i(nx%kk)}<wG&|8Xc6Fla(<CRbDyDRhI%qE3O0sZB%1K0(a+6JZB3LUE2+T%r zrr%>#BIdH0+Bp~o84;;g8X^ife7B}<K`l4_<>=jbEu2oRZHZ5eMh1vXB`{rw0|Kc8 z11oU>tJcZJFA)`d;@^rK!76Jsk5i#r9*GHGRN0Q5R7+Rz&$8vHB2&st+ah+Uu_HM{ z9la|tJd$anB*%{UKC*GnK?IY3X?e~ANyD)L;UTtJTRN~M)e=eVl^KQYpoPZd&aWkE z`8H>o1d0xQ!n*uhx6c$=+L0^}L{41Cl|WGKb-jKsC&Ij8h;ulgtj2Q+u43txxU1<O zOhHTyRrraQ!(6uSga&NI5ZhAW-uHkH&&gVL7B`7@F@@Hv$2yTu_2fyZq<LmQ?weSm zr%|(&^2+LPkBzEYc;ViP%;2t)Ex6JkS*o;C8BcNM?IEY$W6@a574d3cKm3U160%+Y z_pz8TSaOz6u{BCm?MI_YQsC8uu!qsqS00TXi$YM-TPYm63zE-zURo>jcARJ{cGETZ zfQmw=Msm-}Gh%yYirDbFD4zw{;gZR3jpjd^P7dGcwENL?@@#1TEt!;G$*3vzKAKJz zYy9n0)rVj@^;+Nlm$IAQaWc6bGJWYua9RRtSN>f#Z@ZmLXXA-%g~n-V&X^v5RTFZK zGE~13+mkw)<nk}J5iU^}Y`m0|tWR-Msk9;a{i;4A?*gK3%AFHgBYI_!nQUW#Y_Hlf zX%^K9II9<(N%3gjib9ZgQp0T1?wr3JUd{JMZ$@ukj%K4%elKSASQCAPhw6$oDkKR8 zZURWuW$^LUTHu9>fX@G30-PX(Wyy5bXuyg|yyTH385j9!9CcCHT=x-BlN93dLTOe? z=E(KyjRp<j-tu7Lr*uG&Z6rjD^$eer{u?9mm@3Me0aeSaJ03P>$6$tLhZ8~!9A;vi zhVqugdkineKByy)0(WPRg_Dd!QQd?!XEE{VV@GBnlx$^i`qZFJW&}XuGz40_osE$* z+i%q(9d)_jw#o%1344*Y+Pz=*+~9~ZZzOn681`f|Jv)|t%KSSKam19B#l=`2!By9R z$B2vbU;T*ThK5@rdX^C6u2d1g9MoRQC~a0_kl0YvCNjNC+fWGn7hAPSfvBXaVC<ss z(GD_by_)3Gnhh%U&Jd^^gchVZIE2^Vt{uU(H12>%2HV|J1-7LqVu6Sz6Zc5~8=yVC zIPw=Hu8X&7n06ECk>n9n-BWck77N7XXNoJ?tVv!Kp!;1|w3)<zKb+1;7x=sU))XJ1 z)fQsNL=6&^2R@3OfPX8OeG%uvkZb?~<Dw68fLJVya>GLxhsy6&Jf;<;lltCs)>hES z5z9_>C>UB?KNdmPs*XLbh#`NhntInGtJI|Ydf*WIGtkOH)@JOAP}R*SK22JctSrL_ zgeMGM{5|XrQc0pD@PaWXOxms%iS#ID4pF6USrkA(g(;d*GMWkjm_~rL@JbF1JF-D< z_PYxjSs%6vmu*a8(eN~^u#HpZaY)3fJA!8+arjAJy$j9D$VTMD+7=~|$IIN*`k&6e z9-U(yu)U4LPX5!u>*;K9GM=4W!W@vv%^^QR76nBppE8G{h~UXxWfLJ6U)DGO{EDWn zTgB|#o8xjqJq{|0%JEHj`Sh&rn7?yZs^`A<8pjHZd1sC#86Ojd<anx4zL~y5#~<cw z+KUmTBwIvl{3U=2IgL$J<Y{sK4^xEUV7Uk~J!#bPwR^2lz@GwFqHDumubTxL;U#R6 z^EB^>ACZCiB~G}$9nMbY*dTjzfyL&_F{6qGZ*f2O0NXX+kEfUO!OPL>A%D#h7G@Lg z!+>ME5xacaICJOT(>t~_dZmUW$jS;xBGM0VE7|VZ84@N5{>u*KE-+In-y{_-NE=$7 zC#JsX<tLpL4c`)PN_~$eU0^?(!mNCGezo`J0s$i)OA;eBr??2Wm~pCf)!66#(>`)R zRmNfvzsNa7up(the|i)zRhN>fHq6Jip*NFJJSmE?+4g~K3BVhjK9zg!S*bQPiV>X2 zr|T=_>sVPw7{BUScHa?XK7yJxEC|!Dv3fA*WSN$KEjipLhiAe=XL!O>D1MsdY}BXu z)&($xe!Y2>LcqUZ9-6dce)^;l!JygcRJ=Vvqn+iwCdI#QI$;67_{MJ<L>ac(V`Nr7 z@$V-WkOMh-!BZ|jwSWZqy>nNRUD@?pZ5|~0T0-T5ok_)eR}xe0WK>$tDAQhsFlN?E zQd?xJZ6?#;M-i?@RDBd-I;?_{$=NcnP*fX;_jM7RU`HSQA%egUeuFyy#_7oihe0=q zy5qZNh;czY%$>Vf4^KqT6>Ee<?e%TLs!B5`5%ApnE@oCckR&LNqY^20`qj8&iGiR# z9F&Y;uRx#oS0L|2rIMcTv%{*x5D8^`QDMZ5GsuCYKjvs<e!HQe20jh`o?bR<<Yge! zQXP+GE^Ud3&^xu#ID@Tc61;CyAn{<)IG7u`h+GrEU<qAS>c@t|Dz#Rwksk2+I}YJy zO)-6{sW8$ti*QYJcm(ma)BY}$RJeyAy;mTMr<CgKy6N2#K}XO(+z*Q@**y{&;Iyt9 z(QV0)cayIC5*n^^aAq|1eNZ=E1|v|<$C001G9hn38gdhmw#jkB5OOr+5{{K8@A|ng zedLx)PJn9SEa@?>pbI!k&(7tTQh6};cY^F20^Vwqk}!rcQ4p7N<KyP(@Sd!wYabfk zZ9a^hBzQ4Q7&wxrXKNhUJ^0LXC7#zzvPej0zuq*kKMH-bAyyeQqs7mcI}^o~n>t<` zt-4ERkYI`iwo;|%wOP<}ma8UEFDnXB<m(R?#vR_3`(XU0D;^@5Ier>c>iRvQyIIH= z3u(@%H-U3$*vtnv#Tiw1#0NSGCr{L3<+Pd_J0bb86`Y!7+iC8Fdlcteowgn)lr{G( z*NFE>Z1-&G8RtT?sj-JeCoXOXqX`Gst?75)1q8Xm98%7=G7a`!lhST8T8gup0OuID znZrq@Kf5|vWtG-{6)4?|CvYKRw+=|;c<m;pi@qeU8H~`PYxx=zvNVDAU1p2vXbHt% ztFn6nKr|uSTwgiA;`bhi4wa}Y+)uFk!(uey)p0Mr)#<!-#@FoeG+N-Hj&03@nJq}t z+0t+Jw3@MtwaPej!fRCSF^bOmbHpv&XS|!cz5(kIKB>>NJ~)+2vAfmwX@EArcO@-{ zU4cRdU-|-xJBsWagIUzz=<dj!M|OnGyAknlU6GevF$pZtq2F?ep2D{-yU)$r-4KPL zBXU&-8JjGm!nNqKjaFEdL?V(AfzTiAknTvzB`l^hXD6fdV6+~sT#w!6vft1N=1nqP zpYDDN*6Rb;`(?ltAn3)0k{fK$N!S;V(Z3xmX8@L?r^QM6+$s6NADm8pGyY+8+Jl)} zO3jO+gv;BGn2C%R;8?M1Ob-S;uYPI!y!h74q$<48!_){vPz6><dZI%G)Z;fJ<TKvF zQD3j$xqToHq6v|`4R`ZMb0bmznB9^BPY}KF{U~nsy2M7bC}wBFlM$y3)bYt79R8)j z+729N5!`YoXTc)1jD8L^>-olMdzBenqHYzf9~<^~_VKKqJ*pjc=xU2g<U*@Z(iw^h zNglfG_7)|(j@(@v4rLt4JM|IPTx|z*3I^X`xn_v`Iv&kn0B14Yna#hBsZJ|c&sUoe zqMnCTg6k|ZrNx%84g1_d`6LcR>lMG02vZ@sxlm{h#(;X#>u&SHd7{aU>Ed;aD6`G} z(ug9P6?XN$T10`wkT%<&NRrP7)E(W5ELbENQTZbGW$_s#lwsIw_|%gMv9txON&iLm zEnX=1#b^09UHphyvALPm6aR&LqQ(8<+glknh>_IB&F@1~7@tpIXiGcDzvu=mT1ELY z8uo!dT0ZZ@^|mH49QrCg%5*Gq3CitA=<Ios`q2kD>IU7)Nub0_&MaHCE0%~k?+frU zow(Og5xiKr8#rn(k}B1T>tc^1%*C=~gdY=mhwg@^m67Kw{%FYif_}A6qq<=fvlCpB zPy$9PMV#=5A~p1X{)@pOlo-x<A+5{cbc`TF%;YB{L{%={jz*Kg#p{c~Z$A5BFr1tY z{uTdDCj)4`f#mi>EM_8Er03ulJ|J@z+W6~eHkAgX=9>$IaH_Qft7ke`Oi_?2P>`tg zdodGgjlLZX&PPb+Iv6homy^Zx^5iw#6*F+}?DQNH%V2sYfSnH~uP%qLMgwMkh5qoz zpaeGeADK5Y*{dOk#iQ!^(RHoSu{9Oi+{yci!S-{H0e|z0&FTmWLZ_<q=P)f`_Nz<@ zAI0jfPH8pde1QB}XV2EA<P8tN3Q8T24^2*@J#C!p^q3~moIE>T33+DZGQ(y3rO%iO z`rP!*d!XUuTEME|HPHC!u7Y(Br=ypbua4z2tWLc`P5SYxL|p-hk-dX0YrPMgC1{2P zqn~rD5~Oq9Ocm8KvxOG-E|ws1y{0kWi1PH?>+bX~jYEIrBpQhL)!Vc!j7pBs+njcv zV?}y}Hk70cH-E(I**&tvQM-vn-mBv`!^O#KxuSQgwbuCZmYl^(j^9`^c(bOaKR!I% zM-w@mM(5&DHm`-@bQPn-C8f=NP&~BWuA)bfqFFAzn6({ivRQUR!UW4NRuP+rWo$Jg zy?)lVpUFAWwYEE+hjtr>M{bTXfp26JT-Zp1sk0#@Yv!*8o1AqvVbO0&*wE%Jt`}F4 zDMLvaxkU$%Y_QSBa#67dnj`goOe{Opuyf-U$Wfk;XDQB;MS4whMJ%_MlLpn}xwsU9 zLKdZMG3J?fNwGaR8+o6@&f?Jsw~Rc+I)`o6&UvJqYz<MTofThCrjuQ+XQIo)jNPse z`-HLe!HOMqWwZ&>I<S(IyCJkhE_#nxF>0=ur-dz&k@>mFuaS8Q(_*l;h_*6bS!U-= zh?6Yk%mjq&dtQBaa`~pCcJeu&3sWBbX>5?lvx3-Nm@kTSPD#4oNcG!__iv>AS-ly- zxtUeNbZ47lT)q^HFLRu#J|f5pnl+eMD`cG3Wb#^2+H980yWr}<k&d%m>5TVIyK9}W z%m~97+&JD-g{G1lB*WUBee_n8m}U=xAzHEHSFgoNS+x((>#z~^Shy}Pc}aj5==7q1 z(37Mzw}mFt*&EzW@K>KPn}#U2q2@SV`)8ai#@Ra$C7LWs_t~L|*1hmdIHDfjf51C6 zICuTTV+g*v?ZMdu4rXpgklDjZG>AI|UB!Tehz4hrv{*tA8;gjL$~&UT3Xol!d>Xql zhLkUnOV^7~+Or$m)?+lGD|{lb@+E>}MCNkxb~e1Y7@a<H#k_^hDzQeQWi0%?GWB$J zB1RT_vq!mW5bl#%S&$%x5oR!k_v-^$?`Ij9(lM0}q084p0V<=o!G1m^{ZQF%<K?Zu zb*i3&5-=NSB{D0_LJPs=yD!SiNYpWaocF&Ud@1HcrPzcH4AVH*B`jNWXt=njTZ4^8 zLogR#YzjzpYRsXPre~Xp{~~Imn%h5Te<H|PH6hAzd;1KT|M(XE_46$v?e^f#m*oOH z5Uc;{+fO8w;lV=_{4DMUJZCh=d)Zf=1~_*{A>fm_bFAR6en1)KlLp80f9HP1?*~oi z#TOOlMZ{ecJvJvQLYr(Xnx)e-IL{h$bTJCA*jRoY1O~8z9APqDyyiY4*!WYAQL<aQ z#K@VA4e^gjmOyGJ<}_;J)~#$$KYjThm|XdN>ppIWT5u7Dtw_d_Kmfv8AN%fcA?5du zGxD&%?wyYUm}DI!K)AM3N=eH>)9{IZ-tY(n>NuiNP|D~Ogc<}PF!<_6zYGVd1PF%> z9r}%43N)yZZDTT=&EURc#ILi{^^MfJrwiHxF_MZ=0cO`-ixZb^$P=*wc7UQ4xxteB z^JMT9mXWT4qJrCNc(KUrF93P1gyTAvcZvJc;neXAj(`aIscLEt3Pp?l*CWRsui2{2 zIPXg(dtg$m`?r!HhjLe09@LmCsM3DIQL+L%R;RwGlgQ$W%h`mf9x)g4vPN<GtBNbJ z)#P%qVls*JLls5<qs>*3bsh=zbv*TMRKr9V`XR9~o_LI4iBa(-)HqLLQDzdZ4#e!T zDc&b4IJ<N@q`KmWT4*Vz367v3WXYMSfW)Wx3-<4PF*_ekaD%9~e?xC%uku<uy6Fo! zvKFdeEA=*ix!U^??Oz=*4d6E~kKMyZ8(56HUfX^f|1C_`LcDIk60@eK`Ypvil#oWh zk-CC@h+<5A;3tFNunIQzdsU|1IIFF=3pG)-P%Bz5w{R3$!L+HFQbfT|GxZN~1Mz%5 zom~M1q%dzJmS;Z?7*bcp>S?!xO2533DQ}|-SjKl=EeAGbJA%)@4J`I!n6NYQS6#11 z@cP*i<&;NIx<xm_Ss_L`w)hl(VaAM62d!Dt3$xEI%c-#cq*<1PQQmL^waUJSfQhBH zmB+g-43_N>1)r!Tb@%oya32D30_ry(PN$oR&GO@6zvhJNqKMaH;)e@E@c~9lVv3e% z(<1YjDA7PPQN40bMS(C*5;3Foxl_fa^j%rDdx2t^p}iZ_F&BGJI~ocd_G>g#2T|nX zuXPwOOv5E(w5;Z`WLp7Tiv@9i@q958U+`iUe__q)U!J`7zh?2L3!roL5FL%Z3n_Ma zayCXg{BRzB(##GWsm<*=&<Ee0KDlo6!FQ@preFUebd49LcRU#YE>GT0k=K`C;R6<{ zJbr$BGMr0npLzA&a57B&;qKJeGT9RaANY;S(sc4~%GHgVPivS?xuOu@jWN&!o|7&A zuBRAi1KSh;W4}EL6|a6qb=q3H%0MS3v_xKkurz*i3p$f)0vsipPyGAwhaizW2XYK^ z)geUi<FAs4+IEw8F^L^KDXAfKHl2-zC$DjBnPF*6SNEM0OIv120bZ^x&L23_^=-{I zk9RU~q|rfUO#~i#Oq$niY;HBen&#zErB+nEE`Bxb+$#FsUSWj-H=`(Ua7Ku4sS;;T zMj?}xXF2&L(t=O?6Phg46}hC@K#devDP6SH)nJGX3m{NUUc5B=AQ^ooD(Q&KXuAC8 zQq0f7dOdKVJ!?$D!4<$>@=%@vn!1~P2iKnF*=;&bz6t7p#7l_~3&&p)lAvsAyv{%K z^QM7nltD(<Q*cM_cZw6Cx&LIXnm&;U#CMeKT4!Rr@`H^|V6{jAX(Zw0rD~=_!FV8y zf}wI)MZE}0Qh=69O~4>amMCdTP1+4ZAN(CSgu266_8oSNvu%WD%A%wP-*`bvAWE4h z5;6XQp}jG5d$t<te*>#LS^dZ)BQeMIMR_GDH@TrzxLB80QtSso+7H1qX5+L5RhV|I zETz*UDVtlJn4<lGZgSA39EzBm11|v*A84fO3OWmP0%cAFy5l!xx4bxP=Be3lg->VL zo@{%`eQ1>l+#y@-J4UwT7Ka;7YTiXBK?iH!$OI7?QoI#{bBY)98;DZko2}r<FcJX< z7RQ8OGqCasZi?Q#5@;G~^kQLCdL<tAoRe@SLn|`DBK`$mmemsjFL1CgDj4m_z!~^I zItQEnMN}*c*T%C32hY5=fOhsx+8L;qW{w;z6B4agERmX7;5Npm$gDEPNwF5MbILG$ zP8}~TrxhziH)mUF6B(jZuqt;h^d~W9E1fIYop<kH#Xum%;7WQ=_y{4pVbDJN08Z@q zmzCx{u8k$<eO>&-*#Kk^a3eW9F!|yWB^sM*G8Cb47)5I0TKeBeZ$c+O1S`LNtuz5S zK~H$-(8NJOJ-Qb5GNvOek-7QAKN(^`+}dMI$r7LXjB?+I?HXk3HB3Jb*U=y0%^HjN zioe2=i;LbU4Me1iUG<%aSUnt1aL<}>thW`ul)RQf$XuvAcRXUvu}%;05;*<t&&Ws! zU;r3*asKBecA<1iWiJvWXx$K5z=!Xm74H#-m+eSNmrj&@8&R73OY!v?&Ok_QwknIQ z27C{OFqAiRfoZuC=}pyc+I#pT=|feeeJqfXK9*~Qx(5F1*5sj`wdqd~WszW}y}mj% z1=0_;7aKf^`gFxHG}$2N(1pybT`Sfuz7503J8I=Ph>eA+Q5O-YsIcNMk-cs}y`q#- zvBlVipr5qU^-pvfjPR~@j;xr?%n(&it<~DTpEXQ#GCtzNwn)!_P&>ZN%_-LVG`bHw zo7mZqm9xWTVPFB2W`(>%63AhiYrgk>#!L{CO*lDBsa&O&mB%TKGvb{S%{sy#YgaT( zAQD>kOubGg2^UzB{LD2>z|UG^3Um|9$ETlY`ZN*{h@I;22%?ej81U-XBh8gr&}7La zB8HP!<1vPLFFTl+3QeHb>QYnb%pxIpMQ&P${QZ-^fAYJpkW=iFPfkZzrX%r~9FaO% zNamLL@4o~X^nT1QkQ8+A?CWO-$i{fIgFB9|kRI%}pL}vTFJ7PChl_9bhm+C80(%p` zO^Vz@#uy}gADx}!01Cby(QS^s&5QB*Xm%7T9X+4$Ov)jm!sQc7EosQK8JoG!YmYH3 zeAGN@{Ti8CQ1p=K84_{gR<(yXE_0eTLfCNGG42OELB{q6!^N<KcK;GN(T?^<ueg(c z#Z5uJ@z2`c;cFZK;i&bI;pfDVrX<&duh|z_eq`@L%uM!vE;qZK{q_^=xeU(-;*uG7 zI_{6=m*+HJ<s9zplXt>!HhVd4|42Yqj?A*HZ_JWGQRHiF?Bb-$>~J=m%(0D%M7Hg= z@{($w<ZT|%+4yjHvOt7ky)AJ^x)Sv^9!=rV*?R?%AI))vhQ=q>8#}KRt+)DeIz6v9 zG8<jsR_^B$NzF4l)t*mfylyuwPd0nZuncg|<;h~pG7n~GgLSOSav?op=^T?<D}P(7 zZL#YdyAG4J(p5ZSdavQ^_JH^SBptZWqo&G_<R`aCwL_*wYM+%9S>b%7zEb|asBBq> zmF#m-xH?SMs(vV{cOgOm?m(0_re=H2IwJBsJ67^WssXU2<TSf#1W%#q<oxO(H1yoR zkU+e8n$w^~v<YGVcPa#+32im!HA%Y?-$|lHz4zpc+;B}N`r+wmU5sLWeWc0;^q6-> zr_Wwr2+83<N&9EOp=QU8WHE~%+||wS;~CJS^+AvJIMSjV$lbvg;si=Nl}nWO8A$>a zkTidv$1)#{-;5V_M^`M}0+bH{KNC!XTqFQ32@yFJx?ReM*A13NNsac;CeEBNHO7E} z6<E^PNgHS2QM9}H<nx_P)1AmH-aF-CMHo9lh~!z+MB{+d%6;7q@OgT-q>Ed&&&BA? zg&Xp87I-7MkyQdpEazmrCqqo>Z>f%1(gho-y=j%5RHcFkLwg!%&=E`JoI%?o$|6-H z|3rHR$mNL_!OA2^`f1C+xggGrot6JSIAM0V!Pbsyj@0-=I7AME^jJZf<Z_oI-ldij z;E<V5M*A3HBuFSL3GGR60LGEaH&~}Lh|NU5;uC$g{=csN;rId)33upQBo~Rs-PR_| zU`9%P=E=3`%HSr0;VI0ztrsO^3Dvf@4-R+k|LOQ}f9L-0@#EdYod-LIJI8<8{mbC@ zcPkTfRvB?zxH@43%LsX}fVkTHnpLs=?Hn8*9PaNu`D4+uA2=J{3E33C%_vF2&}C4@ zZUq`gY<W}oMhWa})UC~E%MV607PklgI3G-=3*00F^ZPS|sk$LWfEdLG+gG;8Wh-$d z*4RV>ve{(t29h=yE(Wg`i;Ma8=bw9yn9g2(j)l(b&a2Du>FD#*F(d(dakwAi&iv}l z%jx+XneEyPH4Dp~k1Rzl!(U*j%0lmN#j5Sc<Fd$FLCru8MeBFynUBPOwRLL^eG-<u zn3`+zgxEXI)-2~O^3j5eX4H<eJ>T*#8gKfHdCn_#o$F-6se5A+Eeks`pLc?ynq5vN zyd|cvc?O(*p|!wIVMUJ69nQ&p^m;lKEXaZigiH=mhhvK1Zeo8;9t?3JB^nk4%vk^o zSPqXhqHMG#Z?iU&w#*Wr$GqHnU$GzsFe))AoMbsCb8Rxu1{i4@e{GC7Q;4%OH?l#2 z=UCaFasi;DwC0sA&d#rrH8`!sN;9&&&59;%;Syh(AM?YhHrHy$mdP6k%Ne%hd=iaz zYDJUgPSh{evP@-N8phLY#zt<bFo49lm+y1_@fLc8heXD(OdCBLBIjF1@QrheFhNF! z=oixTw}Y>~Dz2ZyMvrr|<On@KuOYCjsp>*rSGt5s4fJZEU{d4OrV>$DdZuH<a}Dea zFOeqIJ{7QlS<m}=%^Afdrw_G)6C`)H5=)iJ70!5Bwt2p47LM|nDx78DKBB`YFlGX{ zR82oshfygvS2!zQDnm?5WwOz;p>+5gxpwfJ*76V;`XySW5Dzrm#mPO|uT{6*#F6xM zztpEzw@idbo-XGtWIY;Qx!cSf<AL)lnirZObKr0yrOT#PdguH+dU`l}ro>c!V%1EG z=&Kqo@Fg`LSTu2#iI_Py(R~0}qE-q$7+s7e2qQch^NzK8L(k_pZZjK>7kvt2vl`yy z(J5E!^%mhYTIy%21M+M%{O<7xE2FFDTz22PTFAw4D4gj4yh*W~iHuWS%1GFaz}+&V zLD=Px3++lGmn-g+fpQ|$eUfRN%q7{mr<T@C*|kF1!px}Sv>fM3%v|aCQB_~od(Tu! zy--aCTD+Q=%XR*P3HIMcG;}UeKDT>SdN1ZVwg7)83g~VjLTa7=V(^Db(N5WN6+f4M z3)yPB$X6Aw+qxTB03P0VLRlBi<r@Z{`jth;{zq;CbV_yBW$to@M69RVXye3*a_tpK zwCXC7UKdO;>CVLc4Ys1UGDk>klwYO%SoS+lp^e}*M>R3B^LiYUtix?-Iex|NYNc7D z?nva9h#x-jFG3~&2x$BzFu~sjmn3)JkvRID^0`(E|5fN>IXO|%bwZUjt(Dv9bq;I& zCsTDs@`5zQ1utpSJv-!W#7?~c{g3LO<Zn*xL=yhtBNpp&3x<1Ja~f&8pIzDo%VuWt zhjHUa8_g_LqMC0bx(#lX9|8_rsAm0ZV2&R5LF|=Y-3}DSf)0V#$LC%cVGFAz&eAvW zDgIhX*Yq-rS2cx!po*#}tl&zSkA_3T0RMT})Hf2w_4?x35NY>k5|njxfED;~cJ%1U z<(rob^^!=htjOXGJg;Koz-Sp>j6cD3lYfwK1N{2@6OA&$rW_m|P~*DhYeW}4zT|b_ zlUK6sTD51?S*X^PwW}DL)Q+^l%I7cR(K&*)sJ!~uL$c-bx5KOX;b`^-fl&ml-b5JQ z?hoU|vnf`IjSI<fG~5+%AwD@U;tua@LEPO^qS3_On~TfYsI!f6EYfIXcXApAr8H}f z$ds%!re<tt%OD7|NI-@owzqmM7U)rfgI`CSl}m<-)wvl~R<br80AOKvHJkx``SN^x z64$0S^s2O&6UGf5Z4GVm%;)1~Dohnj=ZKK-$_zfdv*Qdeld-@NiA$bkMA2Y!Cban5 z>8X?-%Fr^YtLM_g%M$)~QK&Kqman`ns>U(0Mtmv?nvt`lc`S-rga{ml5sJb&qEar< z;ySVCK~z}5ifU@y?woKzhWpfGW-wpx$s=BR3X1KWvM7j^Hs?!s!CoOvzs4&SyZV8# z3n$&v%f+MV^kO#%xb!t2ou6fRq2cb=c9ouTBh-#tp&;i*Gb|dm%FL0y#JUZSdAl2P zKS3o-DgL~myR0vi-74&{ra9PjfLZbA9%6RBJ7)fYPfh!IDTWs@-r_iiiCxr<`#4^f z*}#2OggO9%Nb<`!5j!lSpt7Lp-c9SZevLUxqWL&F;aeD*sirWCnjGt)tdZXE&Pr{z zz)43at2+Sivh_>8oG)u&_d(ZBIkY&el9BbBwFg|8z<)uS@~JqRtDvSrQRbi8R*y|4 zc@_ekD-4oqh1)`-6S<gkcMyXNTj+Pf<$-_i{;m9|A^^X_90GBl84y&3!9=`~(cQb^ zj<LJa#q`n|w3%-pGB!f*L(v=&Q|mIgCYkM{5qwD;muvY-48q(7pJ$X*!BENckv>&K z-!lzvPgQi&5com6WV}wNq@xjqqd?NlwYIM51AD0xmdoOe$j-wlr|Hp*6LnKdm=S!S z0+TACWwWg+q?%}%k=_`mXLE9=SF*qKq!WElG3wKN6pgftWildn6V!0pt5bNxxM>OY zq7rHf;@!b7YhCc-9$y{DYMo89<%V(xvYWOT#m(DAkw_MmDO<IA4s$c1NB3zhL`^Gj zISkDc-Y8#fQrWiIURW1!OgSSHu5!s5x(TL&v>sl=N(*{O&0xmDBWgOLGosSl5}}53 z1T<}$!?2`ZZp*~7eT^AoY$~)(IQHT~aXBESa9>EQiQ53>aC&j)9I1TH!90nRjQa|+ z(Hu^*Ibs|~xPyed<<m2HIDy1?Qwq__{El@kzf$IAI8$|Yj;KhfL%-V`I}_iH27716 zgXwH=IJ>&fkp0hG6TYRr#bEw=`gT6Re+IJD9gG$ypAF8Z)9+jh!!t}7(#~W$Kui^$ zeC@Zd$2bK*$ObPF>WANN5lJ}uVRV9N<}~jM(+``uJ@^L#9s&Ia8NqNoS!K|2IKp*$ z2dkaiB4Oh*oK_m0&#~<?o}8Rto-$68sDdH7@KA@I5nT?*(XVN&1~fwZFdTHk#uLy7 zJY0dTA(FrkfL)>G$sJ3VvTvcz{)o3BDTOE?Kn|B{qoEL1kmV_Nn`8tE3F~nVrMInj zjeD!^#H*|vOr5@54lEpa-VKuf9^BDP$l#pN?i4bu|0Dh<=0;ABw?4s?G9R9eo+A17 z5T`@G9-ZTt^FKTP4mrU3`mlcT)ec@GsOE$xh>_6el>Gyb$Qv2F)RpseDmOl?m362} zkq`_EF+K_L-zf_~U5iDW4gp7vl!NAkV@sP7B`m8QZLLUUk8FB>9&O_E0$BLX6kJE1 zI=|v0n?pu3s)wP>vUiA+0Tj9*1v!jmWq;=`Pd^-JUQD_Bkb85dBY5+{@K_<afdtq& z-JsjY)6?<Ul@~6KRnxo<-cB#iPvz9cOD-4(!^zb^&1$rTbmKTUKD%_1?qM8H&=C|1 z&OImn#5u-Z_gc(BbXRO|cajhXYe<fUKK_G`@fslhYTy|m<)0-TWIUq7@CT(;<W}Oj zEwas0CX!K!!hr6@ou$HTM}7b}!Ss51dLPklxh>-mOEZD}9L17by^%=^amHOVVpj8I zh6m&)pI5C0S!J<80dxc*2Nrf6^WUuqn39^@%D>RBK&{Cq34SHEpw4t`Br+bKI&esc z11^|HAv}OdcYvFQO%<RlutQxtJ|QW&+Hok?eKzCWBQ5hGZD^^L@F!Ia{W#nJo6n-j z6@WILcWJOAkfx;Q#$p`kmNp(xcO!U|YX%>T-$<g{9PXb9qa|bDsweW=>G+KyTf}rA zUcp#iS0MWVW`@O86)`!hCxx%2F;;{&>G)?#zGMt3`N-lcVnpR7Y4g8@hDb(SQx#P_ zmb(3hQsLABBqSihrCce^@<u!ay$PxD;6kRO%R<$u_0w~LBqP{x3o2m-WAGmz8j747 z48PX~@|{k*-AyRW?o#bYa@HU7d9dx)2DFC`6L~%oLg==av<;TAkg6Wb;l)%MU=Uws zK;64wM0$Gb9@X3fp$KR;yRU~7>T#=~Pc0=~wK_}(aU-iEw+O-_1!gvmV}Cuw9Yd3l z`lzy0`ernHIh~IeSC8m%$npc#atXnKagJqiR<fE&=>BwaI;Po<{1~u3bP4eF^!zle zw{kX>lOMm+&7|96d}<}Ga<t;zI{Ra-pk2j|Vx3A53T2{JwBGt6bg#T&!PZ@{9)L4` zxC_X%>ueov#ZUTL)>=&{YXgRCg~2tXvm0!RV|NL~nUUkzBP++JSdbQp%cRoXw&vY0 zvcZVIPyMeAQLtP0D(d=QOIoKNdeF9$c2Gt4J1O7XYe^MUHzpK$O|5kps4Tse?%x`7 z$gtk&;6T3=oSbgWuKzT;l0H?evo<#%Kk!9%Z@qSp+y!#PWTe<#j=&XmpmgXrbV8-i z2AjX%9DHVLM*j-ZIN%J`$!z>`w3RB%?QQ6_lkt3sA3Vg1Be)qs_4x1BKhAIA9Jte_ zTXN?F^9%@dTsP~a6vweDG_5A?!;Xh5asir{QF$-^4H-Oc9^y94(cT0Oo-xiBjL2eq zl{(~Lt1+|M{qyM@QHpNfRHn1SNR3^_Qx!IhxUEzc^4f9RAouKhBdXXY$eS<@|5h8N zgTH8`KuEK#q@+%TmB~z}AUiy=&-FtjOUglPaN^O@(*f0~0PW;eDxQR>F#ou#6k-_7 zFv2^F;rOx!RbxVvE;#iVX0g*#M4ik}@lpB86t$qRtbHyE*Fcn7wGUdosZ<Yi^9>&4 zB^b^0ZK}f!0-DpG<*QCIW1fp;`|cDN0^1Q=nQ<WR{q#F?ejBAG7|T$T)^TFfbLOv# zoJZG9E*xTxr6Y;WiqGlNp}oMc%Ua=4m_FQTXe?-rO;D(Eo|4i*T5jMx@Kpv}ihHlk z#ZPHRK*3$FDI_Wx<D`O5P^(b+b#pkbZ1tQDY~YT1<p4X^Xl(IzF(#<+w9|$%BbKN{ zBDRcv%22>^*()82sgm`|D%mT~cn+O%#v>4~zM0|j=~<+3{Y<BQT|aT}fnPPZo=?^` z!RD9q+|(80OC-~sJOoD6;Ox=7nps3%?@q9JKAH&!ZpnWm6$|V(1}P3#?KvZdM6z<2 zbklvB6N@+G?qKWq>do|$y9C+(gy_;0S3M-6fRh2jt`5n7H`k5R<B_x$_xVtj8lA)z zIw*_<9Ws_(oetc;5O%vk93!kf73m)x$yJ`?N+E@-8|`}645bqpHxWEBb1I%luAEFT z%r3f0jtSd(NZt<d%bD46i=K{+T1w?UaIFrAD{O`mM@fYIw<zc>pcI78CQSD(j079x zE7V_kY&bV_0B^qxN;I&fudl%<%R)_XsQZ@7!7^3izzmgW$EEzR4mR6O$PR=VU<AS> z_AiFfZf{-eN{b10i#`mh8rbcs5(nma&Wze%LE6y5^=S<hiIbW{+Sg}I=QN-=EorV4 zm+is=>FnbqmA56`6<C6*$Zev|?iMLS`tEMh_6<38uJ$JX;VvSeW`naNoOE@5japGU z*p41tVUuorvM*s<e6#z*Vl?4B+&-;8ydB@;40{%})NC;I%E37@Jx7kwo~?@e<r(5^ zV6WgBg>W-ZYRe-h(h>d-zZT(4zeR<5^w3>B5MMQm?%}etvECZMUWo?}d9#iNc=Txe z*>DEUh!L$)cD{4Mn<tpHOinC2I>sh&4TCrC>lE5YGQ|0j+gC)2Cjav)R(v={{-&&l z_Ckqpgq6d1emqRQVvmM@1s`IV*gTPSl*_L#9z)s5n^#u;wHl3;mk6*sw<Dq#OnAS3 z66b&@3Kh3}=@f*cUi~D>j$0|Xa)Uo`4HqnhqTkUE7dUA<UOXQEzzpcmC*Mt`Zzq2o zK@7(yPeyO+(DZB%5t4sApS~QPe>0qod9g;*pJox{Tt$M6bhI7&G=8-c@pv0KL7hU8 zO%v5EjfGvT#yKiJ>F|kCr|tuySuQ*j#g?Hp&V->2nf`*nZEc<*D>{6%htpTDfVj<D zFE*Doy7_H493?rf4@TLhhobaxsq3`I4v$7vsoRDMEgoB2p$TRT_+H%LeH#M5w6;)R ze2aY!kgELN4I6XAvgYM%h85KL)y{m53^N+bntF5n;rkRlMg4Qcm5*@Wf(r|!%CEO0 zS+1n9cjavIw|oZp8<$_V2Z8;fqLnXy#~85Ice4^>-;l(7c=BCPGD;U;z|^jG1P6+1 zs#CsuT@0X72&b1n;qR_dI)LeRBG;yI!z<?f@t6AOiW9CNuQ?d;qn9lCPlCOI7ttD% z9=eZJE=!Bl*(NPBp13WUdzjY_<lY0?d?Veg1C)U>VRmK08RwlS@s8G&qSVwvyYXzk zkg$UgHGwjcyEu%ci%U~*W63r@rZsBZ<4P!qa<T!o7E<IdB)BpX?W@x3E+~=>JcyM( zq$5_ki1L6P@n*_11HMJBoy#VZtr6kNcgmeq{&7Y?D{d-?@1ok}%I;Gd7%rw;Cb3$0 zK+>DLp9AG2mvp|yTG!R&7DDs^nE~i&@~~r>&Oh!%Zxmo}pg9oZW@)uvhcVi(f&MnV zZ%?L8Z}3ZgMCW($lfM*j<BICi+R04|f9*cpI>6WOMs~@H1kRlU7|r@M;*90OLS9n) zU^M%FjLR-IokYjA$pN<4m<pQdh&Gpyy&M5oLn4-bEwTg-N1w8xeH>~U&7`S6!c_vq z=oylA+q=&zyl}^J1uk;5%p<v}XE`V$$Usm|IiR?o;_x#}E%*&1&du1OoaAf8P{Dh^ zQ!zL2p*dOLTgRLrH6NDq0K4k2Pm<4Vb+4@#76M-9njNoTE_l6-r;4t|TNUGFHgCOP zX_W>q>y3CZk{DCB%uU{j2cY_a?!)Q_nc<sDW|>Hk1sI9IxV)ZYYhwNu>GZQDa8%sg zdy2MPkO;phZvr8T@^o~X8+A)7l-j9TrL<+5MSFumoQr9<6luZCiU?|UAIb)ktX)*y zK7MQuVUeIVG%NLFtE)pelZLaaN7Gm1leA@O4mo$%c>QN&c@&0GW`i#w>>G-I>Wo*3 zicZD(Q25MF=YuAH-5wO!OV95?P2sfL!SiRk`+t1&^xn>+<8OBM_jc|*+C89wx2Z1= z5O1}4e6YL!&F;SZ{NwJS{QK<bf&O^7hZ^$g{?n&_+S_#%4i5I7K9S%1yZ`ol*A?D< z@{M0-R)Uc;|E-#5jdBkp)=Vx+)qPBH`PQq9=MVIbR<pQ}N;F}$iuK!E=yg_iXvohN zcgAOTXx<Gzl`Ti7-)jE<&PCC9zBdsMZ`N^Tczqnf^?}j{?o_#S^A)B&|Dw&jbdyxT z@D<5N+L|u8nq5OQ{OsV$WBaRK8o9T;Z;3(?QqjQaB@QR{NpnAyr3Rq=T0%E<SWbqM zoynDN1PA-)*w1y_bXvnQhcnJ~xeuwljYHTxrJ2QCXD%-g=7Amv_5GOGpBwDt@$l;9 zXjxA=tw9WLUTqQaYWSom$m?K0<>atMTEYUrf2qoR0gocs5AKMRC+}B&X7WX?PHj*- zpFOfp^>gg<jhx^tI?P+Cvj#@#F%u!nI`jo%m!er=tA<W}k=RDFyFGZb>2XCoun2}? z6vwD><anea(PU&m>#KjmR6#2@KphoAC%pJ)vQS}!qDma6>Vevf+n{cxEuQX|p^ziL z;;$z5q!<^AU}4PAqCvXKKM`M}sYNS)X{|qvMi<{q$ET)V*_+iFr%XwK+aBS|;OS`4 z$#krq?cm_g6vyclCsYoRuwVgI{$MJ{%jY|D7oaTYWspG~BUrF-D~x=Y33itzceOaW zdsmgZ{E%5HB&Hqk1^1r@Z@4$%5=M2-jX($+<qRc^>+;Z~gh2a)KNw7MZwQ);)K*U_ zn~=kq%>3YwZDr`h-m;$4ADz16;hu8Q6v#Qe=p?JTe2$`AiJ>Nw%RJ0>C-fD1Ezt&m z)x9)kEu6X8zF#B8SD8t*AlFT8;(_-4MNuw%&v#o$2049odIZJeEd9x(sjOObDBt?H zygR+!4YJoDk{QbHlNPga&IIFmP-4QOPvCc_p5BtzvNDF0K~0lsBPmOv;L72M<ocWZ zih0%b85ud?zWIT?EFOHFO_xcJM>ng%Pl*3|uliV$VGz>zMof^?@kuIQ<%suiD9#I) zZh&Md72-I{%9X8-9rZ%=ZUiA3Kqy>Hv&+S67-*Q%vbt^6=j%QkB9YCCbw%Dve~S^B z>pCNB0C2?dz8sotY(*!I=ae6kz33obuFSHHWN5dJEZ;F!y><Meh)uUF|2_7wJ3`Vu z;N^(`Q4g%Wbpj0{f_7^=J=$_h<-<$7ZwpH`FpDgbseE2yx2ukluX<qAG=?=X*MFfc z#p}x8$vqY~1)gav2QN@xr(#P-y6CQd?q%u75ieO#B7<sq8)k%_nknyR^Sg~MFP+i} z#ogYDSBqW_!mgS@Qg~+>6`OmWH-XV|td1f{vC42<v99<A6w!SkWj-2P&I{pzW(ohh zC}al0a^|rpYRAX2_PHorA9D>AMb$bUHY%^RYBS<b<XjZ<5^4+Ayi?u*{+y}f&^YJD zZC6how_ytCY|fXqEn2PUIzJ3jnCsSzsc9aEvc^*B1fn2w8Q0<9*!zjj4COWhhZ)6a z4WgRx+$wK2qSc$cKtWTi@mIa|a26ro{7qXm@F-WLZEsMMaH>)P9nX2~Z=pS7O~<#U z3@iFZ?6K`7U^E5mq1a99ikHDvMW&ZVo$D5ok;)WX_11e*!oU;p8L1qQ7%5?D_&F%n zbd)e<`ccAE(8g}|P;t0Ha(<ND9++-C#E9CX{pl3x&*Np7TF@^q2bXhX^otkPcn>+| z2fV+-1;^kKLV)A#&1YE459rU|Nv`^o%WbUnn|*#KI?XCe8iD5KKh@y5(RZ0%Qmq(W zxfNYAj85Tc(R)tUYzMM@-6qo80K1@3N3{BLZl^@ZT+-e`=8bBBQ1v0M-e_|1+MZmG zR|y&o#Pl(^dYxmPsIuk7v?y{tc^y#UjD*7*gLc;v>h-eqw$ee{r@MD$tx*RPE-CE9 z>7BGU+Athk<wdsrd&njFZUZwTBlQiEah+cuykt^k05TTpfmHXWmy^Y#@td(rlavc0 z2wQLMqH<$y7_ct5j4G(F|3>~Y`((A|`t!k>rWM{6p4@QXRkY9$U4^Y0=qgu}^{l*Q z#$3qV?URR7mAaK`)}%ITpdw)magj^RRhnuQ5{8f<RLdY)jdXPO$q63r<upRJdhMzt z^=PIPA&CQuH%7ZQmS27)gDO}ptSbw?3STS}g_kvsi65<c4{vLf4j)rZ8(t?=#yZvw z!qOtXt>QQ|l_(j%<X)mYn8q0?)M`qhv0Ba~nU+}gO0@~iNpHC2x1+OCL5`xDB@1iV z=b~_pT&z@kUskr{lv?&hQM^WH)~dZPDyMwFYU!JzLc$>|pS&oFTh3u=`&<;RGL#IZ zJue!<CLG6V$%~@5CA`Q6mJ}(PtT8UzslC_A%_X{-uR2u@me9}B*-VzvBDhlVomK~) z(uHAFOl|@kHQt&~a4Cnl>-lKmFU!*TyEwM*#5K(B?zsv#xqyGNXi3}UCOy*t$5UmM zROA9PWV#mr?Y_O_-U-!HM5y)|5c^_dDDkHcu?EuX-{q03B=h(fTbILEc=PSxcgT75 zV&i36NgqQceT<bN&$0KvyI@KA-5|6g@aEVJ!^6yO)=W)OrwrFnu{XhTJ7)RS6Pi+e z-vl6!ru4{Msa<v|oYU8P*Pa@hfLXgKw-J{qjb!cK6K9oW<a>ebxxLcctt@+j*q-#7 zkcy_=v&)%m*;M*wlhS<&T$@<Cfx2&P?xjE_rF){QGI=*aO1aHGRTs-8)*cv(Uf@&n zvU8Ry?S=OT-}9Q4(HGFF?XpDaS{ypN`FG_4WSJ!I+SPndx>qbC#cS@N$HvA!uTE(% z_@&3-E{Kz3s{DIdQgsku;XJE&38Y`hR44m%8D7`j(Fer`aQYz{1Tn*U4LC@VMfs<Z zLQ=&YvS;8%S7dnWq89cMqn|p{2D50&J>DS*`U6l}4Y{X=VAbo;<=d!(XjmWqUax!N zvukPtIhWZzTmr3UZ*C6=43=&9FMgX&u<Gy)Hr9n4pj!gCfpW0Ugk*#K7)NA2hL%|( zJSf}=gXU(Xo`L<#Xl^1_>=0-_GI~WY^iJ`Fex01e^iKqxXJv{};}{dfXfa|JF)=AY zclfMBBmu(j8z$|f3RT!q7!?_keB@My5?LZRS_KN=>Q$|;8HRA7Mqq))MqE2bQmUJX z>7sSM3@4Ecj>Bk%lT*3G!6kcYP}gi+akCSRGQVs#lJKRn20{&CRiEidn^1NnSehFs zTa*a%pc)HDJ+i%hIYBBDzdQ=Pg4rakkgP+r{jOz2<kWEPEAp$O8rr_^$-@B?S*8>7 zt(#@g4)uZPdj7~5C8Z+;ry{3;Vqw4#L=LmFu>}e&Y0Qj*EgJpQ*>d1p-~3HXL|HET z|23aZ4v-gw*=86@rF(nF&vfoNe)-E^{>wlA^U1Hyj-HHgG2PMg#rS-Fbg;k>USUI^ zoY~S%#O~}Z`ytEEpU3Ct_g@buuU!8U(h$K3guy9njVolw;cdvBFH@ABi^68&;19By zDBFq>O*_y9IyNTHT>_YV^o{sB-9Zytg}7EfLE;n|SLsTke2(m@h*fT*)>qzGDLUi2 zs@@aP^0$DtI;c3za&P2Tob^^*;)Hs20{m>ac)dnd$vy>lz}of47mZ$<sAB9km#+1C z!Vmt^Z3f$R?c%X1s)2e_oj60LD%?eXHs+a5D&d?#Bn&<e@rkUp7$WUA5*x9qo4Vxy z$>7<};o<K7ljFSyyH5`H9`5b#Ly2#`7~c8o&Yge%;?Dp4cI&I{_;hsi*|)!lkKf+< zYO?@GWkXt@U7jG*Q*i~NMhiADr-v$nvZVBBc{jqr1|pzkG>*Ca_mpvANEs$g`7m22 zT2oNvjD3hO#^W~RS?oiAOLQv?SmNFvCNkR(-ny(AA#;dl_D~^wNqD*Pd3+IHO23{H z<7*GDXRPu|<eTtK)_@U>c>m(thE40xfFd3vN^Y`|n|C=re&@f%N2(cqjOxbJ%n+9# zvS`VmQM!uy!?c)VRI_P5Ow@%fE*Rcec%5KA8C1(5pQr$`LS$5q&{LoQJR!hFd@2fh zwpL_Yfn}G*s*7!eXruvi)Y8)5-u@mFFjM^R1%=_QuUM}z`Xr98J6~<MIKidQ9>nIh zag72F;W~zh@4cZ#_;nqVtY*Tr3o9vjo4H~Uqd-LVoeD1Mr*>B|S2i0Z;l+;Y(PCuZ z&gRH=?IsP8BER+u2#noFWbs!zY~QHzP94w_v3?#po)4#hU_$$M%hwI595GESbzQ#Z z>A^Ic>W{`I2JYWQ3gfw4IC?e0UB;Ie8V9zyis2vBGH>tp;|ZKcEfXHBcEQV}ywlve zn1J|)N?z=f7ZmaEB64?l<psBM?WSZoBoaK_E6~QVLB0-(=+L2@f$9OQE^Nf&WN1`L z(BlO8$3YC2NC{TRp4Jp<>41buyCecVP<@No28+1WDzVnpm}M(zaj75D){vl7u@JiY zfCu!+bRzaOmo8zUwMKvD($QekcXdr_j4u>bJ+x++I_tXVEzW08FGGtJSCrA1XscJu zu7Y1xlkZPHoT{*l>a)~4X=$pCPPHH>Z*?UlNN=DB`O3u`V|l4e2X7~fo5fPdkXI;< zDq>bqAf4zT1MNja#+$oQ2``_^V%cCVtuc`W>ql2N!*jSrPp^117#C-+WeS<u{YPfo zRj7lhAtEqLE!7#%u1LFAZ1qSs()zJm+HGZPl;vdhAPJGNp2^&ky=|3&C9Q9CO&cW& zOTgSplk&A?D|DOC(2uH9@-PuRagGn24ZMHkUBe{z`p?cTmL;5WYOMM@7w8Ta+F`wC zCW6BX4RD+TFQ^u5lPm_`kB5W*%k<Ln_1@)}_hW8vN91kY`oFm|;}H_M3~-@4VlW0S zQQBa{=wPE1=CpsEBXoQ4da<~eZ-4%|JKpfwboT0Vsc|QE<nzYXB?b7{3y}B5NNl}< zlRr2TRb5G$&jcU@S*37_ye?U?*(I&o3l;v5&J%9<|6U*^xKGa!{kz{vp?q8KKa3X| z%u<Kw#ilcyH+co1Q-{Hp-lP?6zo=EcNzt{hRg^dFlq{c}YuT^5?e|-QuY7m*HSmY@ z%}k4qy%J`#VvjV;ZFl}1J|~v1Et7m;!SO}%nJb-5FR1p5f9F0^aPrT(3fhcZWDCT% zXu<0jTfo0_NvKQmXEO%rm~cU3zY)n5A?SX(V6Dbf;dnbvwJaMM0Xcg&^o>wIJ_^<2 zqb1wsw_>jv(t*6}AT`)syJ^j&J0W%KBcbA^c@JvFCr>g!@fEsNU!)Gf>%PjTNT|w3 zPbB?>NwlRXGGe)eOUT9Fhh)dc(6z_hI1Y4+4fLg6tdY{tz7LeNF9SX8%YrucqZd5E zz5P(qDf#NCW#3h4mKPA=vqZH88uYV8I;q$Yql(k8Zfmz!y9c_Jx4r#lxHx&em6(m2 z|L_0sMpt!ER(2e4<?F`(+q@MFbkBD;u}zu9%P=WQy0sXS&q&6UeyJd1rDxS^MB?|# zeHN8h^;XCVN1D-dI=hO$;2n5~qqA3vbCybnB=vkgFr3ZQthNu&r$dPc=u>zP(TT4{ za$`uJ;+>Glg%R8r9zByQdW*|V1YXzUJ~wY0Lt+txKAmu$Y!rFSbWn|NNPRNBoSn2< z?;Jy;$>$7jh~I)sTkN6Z??zY0Bc}RuJKW*(cycTy6t&@X*nj4(wC>OCJ$a~w^zq5g z6Z;6G@_6sb;qk%Vzwf5EmUyCb%)F?ku^}D#)N`Q!H&x|+CvjF>&f?3f%vy_%=P>7@ z6<Yg}r+P_`hn2D!4+rW|JV8^qhaP9qabrS$FgGM9*1;m80DCAeoT*_U(s|3ngrgyq z{?l=1X0P2UY@?2+IDEQXj~@STIIL9bJGWPzY1(d$dqwT9N)kF6Ttl@!*+lKV*TJlw zTiJ*PBvX01nY3@%A{8oLAc?Hcr|a^HaB7#tdV=A1if1%V7ohiVVOde4mC-zKw1nOy zV>S#ZIl5nLWqCs{q|xC3)ZXMTu!Ay|askmNV>$KB6MWBMtWYlir0MFs32}xaHoKKV zZpd@uR5UdS38HPgCZIIkg&rQpttwE?TqDrpR!tghZQ?j|;Y^iI5~|DC2LB@7*kZ2K z>R<$?Ln)R`V!>z*irXfZi2Xa1lx@DK;sU0*?!;G+962nax=BWSh*+P1h=K7cEqn5L zWX7H(&`pwyv5Xz!#-c`Z-=~zWju3G8Zdk|=|8inZI`u}FX~6RYA=6PR9U5w&!k=Bj z)zSl>e~u|{2K;&l$=kPYKZBFxv&m@j`J3V7a(MpvX!1FP0@o6ZPCxUbpR-V+O{)0P zwHhZ(B$<}9(YcS%YYs4DZfI=1;JWTWCNm)k?mXa|V4IZ|8BSXnltxAt(X1*RUX!^= z03YxCuc!OVz|761?QLem5Wr#0Z~b#}ZEGpZOK|jf@5!}6_~LpX?C(C>-8tC3CLXQ{ zgyR*2M`3yLE^ry~>DXl%9lrSG7r(h4BL4mGpw&5fFqojqq+WA4xP)83aO_(9_T~C~ z`e66o^FMx=pgrFC-&kjU{b=_|3%(_E`|^4;d)i4dky5jc`Ek|D(}UxOJCFAs{iTJP z4z4mPaP!Z&jcWQ9m(KxJ;6u+`w#dB$$W8n6gW>G$c+yqkV0w;Z?VWu*8c!~N=xW1V zTe!JCqaW-%+q)*RhOmfVkGjCr62C<F&gr?{s?);i$*XZ!Lnr6UKHrfkRBrBR^})+T zPP=+JyLfZwYzZXiNGU$Q7<D&<+57b6E8o=(iN@M<@9xt_*Q4}598LbA&GP?nG~@TR z!Q)~dx~&DG^#_Q-^RLb&-D8sY<(I$y&9DFUSO4<s-(=w1ndE=|@|VB*)o*_J#jpP5 zU;p{nzxmBS|LYgO!C<hmvwUPLm{y~~yplB}L*6U(IPAqgzrGsa+VjDkF9%oCOQZsS z^?EUQi<^-~I3B_eL%9cMFrE(<)4|zzG2s6u_{~jwgz|2G4yPnCe7h~VUw!}UbJ>sk z^}*MB|5lsruY=$_732->48H6@_nnA7DcOnYyzn*fO@C60$4KcO?DXr7Vg2j+0`TzB z)1AZP2YXGs!!ciQBW8B-HRtu+|9!aogsTUDu-}Ctf?-{iKkgL&Y=8IRUQ<huf<G;M z_x7HA(D(y<JNupX(NBxN$2%W3{vPe!`=IIjVCQh>g9h;6F9-LZK6&^-!}#dw{hdb# zhdYP6A2gW6<K7>Sd4t$7*MuLg);{<ea&vs}{NWPa-I#st!fQVD26b&&c6xq(jn&Y@ z2e_*3u**bve{=Bh@%^WdpMjM7$6xO}Iy`>*@F8G1K5h~98jv`D<UkH8FY`){Cuh_3 zJ(7RMbolho2j11C4!|{s^y}+6E(%cS2wW4CYx>@DQ0_h7d$g__uFLELp-;zHF!)tK z-S3Pd>k$~rarge=)BV3dYM$-v@8D+(pB<*P74FZwWc%o7UD1YayfF~ByFmPH3qnw0 zd@`MUzl;`AXgzA|VLJHcc<=GE&Sn04wC*s*^YP0c-r(qHH^XVE^+t(#<bOZLU7OuI z9oJBfOLj3_{|}zxaPfm>V7%w$2oR2o7bf%hQjEJ|>!JMVGb{`b0?v=0Jb!!-x0$ZD zYp_IJT_7vVGWKDa^+xjS{{GTkm-kFFvX_sMY3(w<*gQCV0KX6-PVwXEbGaxMzjpWc z8LB6zthzRw_f0gA-H`3=oI)&4i@ZdSH@rgF)fOtOvn7ZSpw;?8g=#;3gENFibZ+Z< z_+<xaE?b{*%bDQ}KGP61HljHv5?V%AAS;OPEbf<yy0GQ$+#QF24%rrGkjE9X4Dl#) zB)zYr{dI(~EFpNZSI*7&3GTXNMA}v*IBk3T9LN9N9eyVv@lm>o>Nm+fgdDYc+`6&K z+xYGqjD=I6axy~4*%#Z0wqdt8z8S8VY!CoxfT!PGUigmL4T2xSsiuFNZ*S`vZUaTY z8A}_6N`<p*I0S&y!irjS5)O&O2%(_4{xmzUX4KKunG%UlEAU=dXO_;_V4xJfsB4z8 zlZ(I$v4V|=706$VI`KhgnKb&oe3VfuR!xFd%GSKHyqU{Hc4o8TmBvwMWTU%3QXf=0 zkwiov(_r4(yQ7`itLl5^a%z4+EkJSH{(eu=%{@i(m@-q*5t}}`Kb$X)?jd<jM=Mh1 z!4yG-K47;@=BEw8G+Wlr)0h8&NZ4hip8x;sy$f?x$C57kSDF)=k-P`IANQWPafunc zF^_Fx+rR<rb0&Zw8mR?+Ep=<UTi6<J|M&ZSnN^ipuhpxCz%b*E0ClfbkF0!ER#sLP zgMo$$Q5D^vA!NHhwEMXKlb6!;OMEBy9}ky#IQwY;4zTJO(sx~K0p*8qb$1gK>Z$IF z7xyvkUHmUZ5iyI-QM24rq|%+PUfg|nj@{2Tw}c}17KhU_B=6K^+2bkit!Z#ZDE;mB z2DPCkg6?CVJwX#vIX=Xx7x3Ne@SL&G_ZCNd5J1R_fHiNQ{4~8lQq5Ct>LQrXi9%IY zu6{)Xtq8>3`KhNzRrqgq7j(EvdZ=kvIz_^5DgWsB80<T$^rO}M4TSV0G7=}oq1Hh& zunRV6B1^>vq_@GEfmI(Y<{M3SCNwbpQsL<-bIKtM9C+PfM5whx>22c`MWF3<1{V^$ z;9L$1bQtOZ)2MeEc#LFjK&a@$@V&v3kwALcYuyb9!|bNQfZt8epwEApuje)e1nh=l z&??#xqW+h$>7fc*FNX`$$_xDa0Xufp*#tbtjo2@qP2aqDHbcTUpa<Xc`Zh<t05DKv zXeB1K3*fpURFll>fLpV|x5SHUPK0OGSeuofO8Pl>uU;3X*bVaSNgc@q@puVh^{dcK z{Z90Sbv|5rOu1n9jwpKf{PgtVh5Ro@tELhgQSsi-8{U+3q*Kxk6(aMDsKN=6G#*hj zDT&#NQiHK<W<U4wUKFQLbDhc)99`^>9_d3_CE%3PX8sQ6ON0I!F^Ef*-OkIY*;MrD z>;yJVvi54(sjJ8h+ajZViF*uYo*jLCfuUmlTO1ZMrD1?tK$$Le)J1zx8j%-xuRJP2 z`l-^a$!+zOdb`&SlhBBctO!{A9ZnGTS?L*88JN=2;1gkrQQ(aH`b7{J9Q%x4iC_{C zqR}#1hLd<AwB{+?2rmFbO6{C?OKGq}aQ0263LeB~fpJy7MPwQr0BUt@t@h1yUChLT zy&xF;-s#!qLg3ok_#?>n8lH%w!Qxz>bej4a&Wv}<6Xb_X8-oq-xHOqf-C4DSZ(=np zx;i~TYaPMXS;D+xiTle{;*ds9qOai(N(T?qz(PueF?F_p8zz#}MRKx@X*>A6`-2sC zR%&~YN#bDH*f+BitYI1u+|_etPf{8KnWSiIJej=#->xnil_Uv82S!dMmXSTq5Mx>$ zLR7;Q)__Y&%@1FMzjtUU45Fy0pzGGoz>2a^2)IXQOW9<WwWU8c>5FwK)hY}lbN~&$ zSy@V8dTG}PY?mU_8jTKfCg1v)vPJ{x6jkHh!x=P92bWM;YI<UcvZb6HXoa$Y3c&wD z{$8V4ad%!R6Fhx8J?ovu9b^-mXxTmtf1Nuzoegr)AnQIu)~!yX1CK5Ld4mc9@M=n> z-_#X+FUhexb!qPi(w(;>&YY<FVrUNdVYYg`#9Hd&Td+cO=lIG$Ea&d<^m=n7Jt-tE ze_WO{d-}RO-8>a%8uBK9UA1oVTI#FrxoCTRJYTJYnOs+HcX%4*w5V`8Tg7zX#hbHb zknH05`eYt$#Ny4n>B%|IC}$Wr<W;1_v)RvQC&?v~8iCXH)gcvTQJTxLx^&zIDGN7q zmm}@W;v7SrAJ)Y&!$7W!=O=i0T0A>F`k%#<>_~bV2O4AskJV=VifOybI-3=&k^13g zd9wVeVu|(nYcyAs4p%`F&4--pnLbHQx+C~qix!U`;9R`F^7*@SP92Lka=G|Kmc6G? zSL?}(X!pcRp<hUm&iQyzxiEXA%>60XCKnnPULHbUAHsndO6YckKY7lx@MauGJG|Y} zDjCtST)Vx2wPL&Bd30FmT9le5nhxzAw%aZ3j>5*zpuNM5kP<^9&6;+nkhpO+QLpFV zvg)^<d|Is*h|RENh-?ci5l@ky#pDSaU!;xku%@aOQtbxMszqR2cC{eXNwd?EtX$hL zaXl;iADN}y#G)+LZtck&=b%>79vs5Nni^y6MxoA{rQ2;sV|*A;(HvNx#8U0H1VS`O zcTF2Mw4=V9CbE+|v0eEry>EA)675u6gp^m<q?pleITZY1GU-5YKlrJ7-i3h+$D^um zw=MH@%F2<8t=<n++#MH1AQ#dO<d<$;_m6XMM)d(Y#|5s{)`2{K*%=DRU)SmMCKvwc zEZk{rz6eWj>@*%J@6k?h`A`BMY4(b*Ak4abkz6!wKASF<i;L6c`8x7~%|dO`_8D&u zrw)uVu^nkr%hf0CMsf;D)|NJSDLujM^?Lqhp?g!hvhASq5>21b>^S-!USU`WBf1c3 zNk6}ozSV!!XcQs3K1l>I1k0OWy9AF-(LIk9^z`t@HZuDZnI6N!#;Sh>!-TE0>whKe z)W-jrEaId<yK=vC3)Wa;);e8oxT)GwMExe94Pa@{H?nGdum}fr!x|hrJMYyVyi|WX zS-zg0#0|c{P;okj{KBsM`q3k#8F={W-v7awsi$(X3nu2P$4?&J!OvHB?>&C@4I*X! zZv`c<`}ceIkWJ#zgS)SAiOQ1)Uw{AX-m8bVzq^O>`#;WRXIxF${U|E9obaB%tdu$| z7drW6@wG;Mm%XT!2Z@=~>O4r0v(4KJA?BsqI7VKv*+3gmCpWMSwz&v*-UyFZ!&yK# zNg}m21;0vZuB)1Bn$eHWvGdtbHb4v$9bT?c*(eB%s#_qW1rgP6a~>{xEWyOuhxa?j zBpS|piW^5aZ_(zTY9JwN(^JiqIy`miU4-V}i)j_(O*gp;9G<%*WUnz#1$7Xc^b-^> zWbaHyMXekVP0qD9q|$e*-`CrN?br-1*5#5}e39n0X&e*{U9sjTCTlHU^of0>SZ2^p z!xcNhoC^)KlLPw{W%XLOwVn-`w8Gl;dSjj1N-}mGM@U2bL%p2jz`HN6PqwcsQ%<sh zHRN?9S{=3IE9EH~{*}L6TMWxQtrdQ>ZfPfXr4=7?cKM&M2RduB$zE^OCN>0|f+!)Y zu~wheS`2($uDe?GdaEu_wzI-&wE|TG&1WkoiwBM<ZPk(q301jRk{bMi!KM`u2AsZM zpU_+Y`Kwh9lxn($AWA||-iU)$<C;<)W}fs)lvK$AIzOgld`;be7M>%JJk*D|&`_g! znXcXp#Tr)oWN*MiPh(J=G!1Z+30ICqK+jin%%5B|OzIq5)6{)Uo7ZTmvrs}oEG<$( zCng0*RBI#Q3}JTwtUuzlYT8`G#&j)enQcboaE01ROyxV-7{x*f$`WNY4PoZ^qY<1^ z_{9xz=mXh%XO*6Z&s7}IpKM{^wHh9-sqNl4wz$1i)i5v*yOrCRRE1FmR9cm-k1X2k zBI@JNO!!$9&Gaw(%pO$5ds>(^d++K-L{Uo>=Rk9~uaq;(Ru8LodrFzLd+(}7ps{jo zjmqV-RwdEXTGsqqZcL`EW#CD5S8X+Qctf*S6`gudMo(2JXDKT5g3H2s&q3Z(^KIL( z>ajZo5Uq{Lp=w}ge&`$BRWrjg#?XXPHPxF^Xt?&AJr1EZgVgRD5@hIo1&b9PoQ_<h z{c=^~otcZ{3|4jNhH=Ae%xZh(v#LkuS`j%ZJuR;N_B7|tw-g>0S9QefN3j^;X6ZHB zoFVfz>mr7YaIhy?WlVBe9cQb|Hmh$(WWto{Ej+8I6|}JA_?@23)2hA5;*4F``?z64 zZcb6VQC3vH=(-Ac$PdUsxTy!_G>q1}L}zzr>%-MtZusc;E4b2AIlj|pymrjoim1<2 zq4Zjm2bOZc(>Pn$Oo@<Xi{Dy@(9-ej9)z7v;g9kiWW0vAXfd7_vIZEsAnGCSNickO zzDAJs1&jEKM9sAlG@c^79Ua{DeP~)dbe7J#$q>SgrShEx-0?Qga5>@$ay{CLI)-hf zXWmF+BOPIvlp}7eY62ZtAPx7Q);vnfU38h(aaGYjt-p}lS_k1`dSOz>A!nR$&DVFU zrJHa(t@S}UtIY*3XJztXtQcmiPFKmj_)ABmy$yfk7EVg@GLoFOSjp0%rP(y%|Di}> zdZYu7P5UBHX)N|0!1o5ck3*T)5>m~?77fIl-yV(IbmM&eU?Cj6I{=j+TnYdvt$HNL z9A7*f<fK8g?1BvdQ;+IBfT<cQfKhfuhI-6i;d|T5N7Wwe79rGEBfN-%D2pa{0gym4 zG>--#f-)O-b8GA?@rPZD6<>*#OpTg@ew-8mJFF`^5Q?4=)BGaV*bxPf&9KwHI)08p z^gCm5m+o<K(e1@W+~ATkX5-{G;yFz}a)WqKZ`1*4TD@;<_K$zW`LAvKDsf6hU6vI9 zuSP>Bcw6&8(#n~v_@|CX(&L>}`*m>;MksolCaLX#bz3S!+&5NU2gs%w`mtqFz2<5Z z>aUSf;no@`O@E<R$DpZRW7(2Tc1=#WgHs5IBETh4Oo+@ySC1je<-D0+1(8%@XkH%U z0s%DZuBuocl+AoG!KJP8@Tr7FmNv8`=)unLG4=|#r09uK^yOhTsO&-lf`ukIViNHr ze&MxZ;c_58NBHJXtNDiK0>e+<FzbHK<gl-Mzy?B5<faPWaJ|`&{K}U&heI1$e_+4T zew_LrbGoBqu{W#bIj(=!I?JDsB_sae5taCzo;7|)s%q&8ryfpWv4p!ZIbwVgEuQal z%*@jwgO3*+hQafv8@&5D<6y(@h>Y;lkP#kmyx}X55xx-_{F;yve+V+-4?#x!A;^e7 z1R3#%AS3=DGU9h4BYqb|;QBmrSY!@rnUcqdA6e00Uh;vo%B;$l5HsHd?oZo4z`_~n zQLYWv+D8U36mC^+fk9AcFCmLM&Q9@{|ENm$Pr~gYg$O=(0_Bri$C|N+$zSq5tbO~I zFJecT>QMzZ*B(h<jhqOIp{43g>ps232pcZI^t$W%OC>(9*&$%OoZQoBu57+|gxp<E z*C#SjfbS8~J=sHu2%kmML?!H|+%H&IS*7wHF^5ntW90oot1Ha<`-A`)#a<oG&k&#b zYX0sOBHrKN##X4C^zL;13TxWc#hEBS{}^XbTaT&b$`%+FS3bkxk@@jO_H@01K0RBm zHm^3zS5X_LF4Nnx4n*RWPSd=suJsn-`OGs?zCwnp@=*zCW9&z7UmY$_&(1fqvb&@C zo7p<+rGX<t3-jmQ?3Ebn9sn7LMwu1^u^|>Oh#lX=+3O#Vj{lN9`SEc5=f4af_RJS( z)GP_g^8ZhZDfC5S$oit)PKj_WTQkQQ&)Xmf2B*Gr80C7x9@9uI<*BNc!*=_fcwDPj z1=E}<y_)z4uUZ(9wwsmoO{2~Vmdf(<6*9J*A1z<KzQDB<9=P>vdXoJvWNv--<2-V~ z;aixjko63eu0Ylf>lK5RqBV``CqMtsKmEV2U?Ly>cy_)zTduPX<z-*s-D?kzJVp#G zF7^cO7n!)pyOPi3VF0b0Q?FwYzz&J}N3J)AokQ(?@WsA25PqNbqyIY2X6C|6lj*0k zDEtu9{x+8+?tY9Oj%QqWL@NMis^(lG#OePT*lW7F_;&ebepr|R>WIf-PVN}wQNag$ zSv#eP9E?%l_RX8>F#dO@D>QS~IGHWpLu|xTHCM3VwI>$2@5t)OI$+MUI?)3Sxpr|C z>*slUFRP@MZgfqDP&p<V<pbmTZhG+=%R7UR<!y9ZYCl~1s#Yzx>bDG0+<$kFNM{Ny zbrBoX#<sBw=B6J4XAH9oc&X1OCDY|xa^u#iBB?~Jkiyeh9Blj3)tkd=)6*f6VVO|M z>1g=YOG|2!^m~3c)N{JQ@HP+aejAc#+`I|A>sfP#O&<`EcB<LEJ;3ZXk*b1g{t9D} z-|!LekqUx736CC@IWn+)H^_4D!Q=!X9gL66L=5s{9BSWOUzbxCHC7r)I`m4IE$Dg~ z@MZ7^6$}ZoP5pWU-XpU)ux$*!fE<_HZF`cnk2@W&iNbg9XQr}3aG0t!OlDp#9IXw! zT+v~zwq0>b(4)I(ThzHJ-!z353a1)cP)}V}F(9Mngh<Fa{hK$Tta*6jTWlg~5FBSE zayy)lx?f!MUTSnvcR@T<?P_;Wb?TAHc7!H>4Is$a{}qyYJ>0Wh95t%L9`5Q1s7NB+ zWt3(LO_*rq50X$^l2@-ivck7I`8NdKzm*95l9woB*TOp)KZyoc@LYn{4rkb?j$oEm z2}g7&4b4(j7j8xg*@iFMwBZMbd5}m~&amg+yFWKsJWhjA7DABP2cox3<-Zd>ni1V; zdn`wN7_x_T@Fco>u^CX<s6CUnA5&o-tjK9Jlc6YZa_r{Kr{6!m_vCNiKKlAL64u{- z^5FK@-`;x~wtNEHCXO830>&(ICxn?EumcUiXA<fLXnV~0eR>90{py?PNl0!<j~u-@ zH*Rf~Y9~Mm$W_SQyIxG@Wuk7iTFP}4J5|T@k9|YP4Vb6cqL2fv5(emv1k?PgPZZcW z4%GU5vH%*M`JfbGf)W{V|2f8Clt2me3K8%~{b$kCVps`kB?GJcEP8z2><u$siB7B- zVs`Zs1TucWjfA@xYWc>7Zr|P$=nA+#Y;Cv<lANZiDr?4#Tb?_m<6sVCEM7_92=3_c zH+Rw`5Lt-|A2^Ql+_)uw?}O)}IRO5UpWaBbiB((S781Xe6chaOg`X)O;`fWEo72q; z3RdLnvg+={jwFyH9ED{vs26%61Wmn=6LMf5Bn6D@0t%2_1v8kBMK+%s=W+^rXf%lL z5838?CFdy=GFpWNEKUN4aJ3~y)M9FKNgq8@G1{J_ly*^Ns(g-Eq>H^vr5E|Ue{)31 z?tg3Moi5ou9|_pt0hY8h&Hp}=REka-1r`xEXNr31G_BK=KL=2jta>y^sn*p3Rb;Is zwzq;*-~vWC7J`D7qP0G#$Qzz7=eM9QCdU>>LQFb74p1)GI4sQ<9qS$#Ed_o~icpa< zid}@(MC%essB6EC@9@ahoPP7!`t5aEKXNSvcBDPW7(gIpCHqX@<nNfnb8;B`6S z`JMO#!;P#`0Qx?hjbV3M-A1S@9UQSZG>k+E77~;<7nn``6m#3-5Te|&(Ce#l^38V4 zd#B=V+`^X9QEb|#R-R^m2&r?z7z?RQ3)hyIux=cji(~|KXDL*%WN&BIh&EWQmKA>T zInLE+j5the8hzDA^d5Fq4LM+Mjulgj4%dx|<GEJ*sZc%fPw*gV`j5&t73}=1&~tWA z*8>3@?S~3Y$e`E&03chnXS#g;Z1nDJoyv-K2qDATB(H1P!lucQIYWiV+@KWenP1pM zh1k9620JXT5ltXQcM_1>>2WklNbsg$kY>0UMANx{JO6RURosDV__@qU**yd|Z|3P< zUQWLHDxAiNE4``}hQO`F=zqLiBS5UGQ8Kk4<V$!!|M&;lJF=llIGt|`fnk66W5_d; z^Ero{4Mtc0y}UIJEE<n`gWBX5Ar%|ur+{m?LB_0gK#R-;CfvqGAs30955L2p(Z55; z=wfJd5>{JC^Jpn_2(>M)n*P|9*OEMF%W=&GRuM`1QV$>mV6izq*te^+*n)aAAZD%R zMA4{%xp50CM;s8t#@i2Bl2&Xsa>%`DlBps#Yk^?@#*G_}3(6rkqu2gR3_Klmy7^Cx zo|0^=aprD?HhXPXVyRW0NP50^DpwqVlE658J5Wt8OLowSE506_uRPtZ(@t`fBg67D z#>MU0NocsPH@PJ^uYk>hv?4w1K}c15@IPKG{)b{?vyK>5GryV&{H&ug>*KFA>59z{ z6o_JWD5;bS)01#PMwNI#2A-aBvqK}laX|=^7L??ZgaMq<aoAH!80KV}#BixT+|*7o z3Dq|MIvK}h!z>l`9Sf?$<5PZYZDik?bJacQ6Wpyc-@KaeBnGED?*o$8lBD@n2|(za z))Dqy>qOsvn#_T?R&|5*j6_{HcW3RqRI8%1$C6MX@fbNR5$wPRsy1I5{vFP904w-f zmtA%6A$0?j>}*mCy5qHQFP@$<Dr~pK^~vmbgN5~c9V$P2I}LlKHtql-?zVcn;VOKy z{Mznu=##C&N)y^gt9$=}`_OvW(W$anx3z!{?L?hh)VN~U|ArVfDBqocRuIOaS_XJ! zm=4fh2GdQThf#gCus4|_X{H;u*qc{CUNhiChidw`_+#N4x41K*8zpM2%NR$uA*Jg^ ztZA8Yy~xDExeZIL>r`Ug!19u%wr@{Svw=N!%eg9B1M-0%veR2qNro_3OUa)1oNLU1 z+&?#Ng}GK}r@%xwF?*%n$=}&Tv_+}r>f_;Z)8vgD%%}#Ehc4h3wPiOe=}u|OBMp!` z_Q>Lb#=t3e?^JUjb2XlyY>ZkGa(9REwXtu`JPf6f+>U88R)U`}^8;U8bbQ5)&0<j` zq@AxH!j6;nQIyJtzrBuTF@CTQdSB9PTH&PEc@J`U-Kr|$r!5a|X0w~f;(#J&C%!a9 z@)tj$X@%?qHBO9ltO5lhL7i{}5zZnCW4U?&VZ7H|Rk=|*AN;R{NXoDyZ*<aXu+NB1 z*ic?k6s_e@xjHQ+b1m?sYs2a%MeEh0xGPi`)eL|zl{29jP!2@n_$ZM<y2$Q+qAU4L zAYdWim<!Ko45@^rKwP5+Vt|S+#Q2H6;evLVE5c#dLFh*@9-H&cPxJMxfz8lKaKR0# zUZD5u)Q;+2Rbw0=PE-aj)8ybDe(MS--qzjFCwa$-bZpD<3lZ!&dWR7+R{GJITv?2J z!EWOyXKPjAI8LIgQ9}Z(rzfaUl3V6PM~g1&aZcLGdMxA`b9!+=g*c{YahoP1ED@No zm9TxXeFFd_nR<gH!Ec-~WE_)!MF5zD)r?6dUE+)sgg`FO7<lp;Nx*@$Y6>EsyhAqW z2A}+zi-<Hwu$~mt9a&LaXm}y_Ng^&`wLHY2I5v`5W@VwbL=xDLv(cu>nVp0cu{^U8 zw32{YYak0V(ZneFyGWD`?^a_JVy!p^AUD~_bd6*guQ_ohDdAvY3(2a<Et<S;AfkSq z%#iK6fmF4WioTU65FLW$$JZCnq-)hvL7@saTmp)k{mP+#RNm(>+|b!K1`8Kt5Ib4< zw;;?)wfKCSa5CXe!3n0&NHEucgV2-J%5R%MqdE%>JzDLk{~lFq&=0QuK0JbdSAH5s zW$NnFReoxzi%$R8%1^ugh|2FHaehPf$xyfJzP#9Fl;1Izgdbh|1!M02EI*t!8<<RY zov=kc6-4suqlU@XoUOLhxdi!2-S1a1lb@Hc_v;xGqyH%D94fOH$=&kc2&wbthui$V zy)?rzu+)ZHnd<osmLcu>_wp^J#!E8fOQJylv64&8TosHD(#e$Cxim}b11|i!>mC*> zMBL4|44RF(_Yj7_mO^9)18km!yGYA~MwaKV#Md~BiKWbH;x7TI7?E4|r~6^I^w$u^ zgAwbmJ*<=C$xk3sYvjuV0Z?uHLnce~;w%doM&GxfL))ux(~jg5WH}PcwZ-LvZa;am zl4#+FJ;SjbZn8XRwHHn==o)U{ZIh9_(kqrbjWq|G*PNSyh3GhaD$YngaJwr-D#YgM zsk^kXZsOo|T@&!ahtcE_+!pN0>ikrY+I_tTRpwBwqW|Zt)&(<bKX_k?*`fztR+XrO zOd*E>Lh*0j#2v8#JiZuo_9Bu1D{{sQ!}%Lp_+o+^Ne}+nv*>^ehXYpeMqi#s(;dCC z<k%E%AH<`#A+dgsS=fA1i2*=x30mvWEJr=7^OGPH&8}n=4kIgY)0{y~&#Pbut*rlh zd{AV$j>{$1mrgJP(srpWfO=Gh%fbX;6<ZQ^2xXTCRuB|AWG^iR!GZ1oe$<iUKzGYu zFK#5cw>NeoziZRZ7<*UdDQm!bBpFL=0U9PtOr)${&x8#j)fXkB)>El^i&o6@J}0 z9R8^{YV$4};%c^_u40rj2G^ACJZu3n63_$Np5(;WRQDlU6r3fldB(g<uOHKU@;$xB zk5A6mC7?;TCAg!|*kb;0f_->?`kJW)P5ez}1Vx;Xy_nyl344!`y`Z$XVw>I?DRx`( zV(t#uXkf&|kgfy`-ywD07Cda*H?Vd@uLOI9==wDF4P>xs1p%HvoL2izIpw#FSljTU z<+3h0mu0c^35{KO3Y#AvX6)~#AoM3k^+fQnt<~7^*^TJd&gVyXgMC=DY-4<D$K&Ah zV1U}?eJT1s(&HI!*Ca9jCoA`XY##&zp9k?9F2YMuAMJR~|2))wApZx#!KcXp`K15! zY>Lg|xAU|2Q-7(M&w&Th1bBD;?)`?120n)Y3(1qMbJe5%G}$~6`MYHm(6XC?Lj#{5 zk*|8xpE!}XuUWSlaBSi8BlFdd`x7Vh6|BmoiO-MJA7bR6I<e2UoMPD~)Zd+-e1?R+ z;!%I%M1H*d>HUl_H1PQm`Km|#i4*zh+xhY4Tet$>kJPD|&yU~<^bdf6&w=<)Bx<+V zAm7ap7Zgf6pDFo27!E#729RYZ(mX6?Rb)+0_||^X=xv*Cb=T?r#L5`zIx=0)H}mNU z?t+qZ@7Nm9z;@moreT?SUfgeU*)CwY#id)oTM)3#j`?ul$)?v+ghWiS5r_RB+@(=1 zm&17`0)c&4rZq6)aNE|-@pJH!7!j#DcqpG~EK0(#hP(*v$@gqiFo2<$dyFQKmWoj` zpajBi78~1DKak2dZoQkHAjBM}Daw!%0bqOVPd37V(_#WULTYg0&_mDfIZ9ZNpTixl z;L3oABN^n35Zt4iR|Mj~wE^clN6*KOQwfx9%JNqfMK>&_v1#KQcYNDGHOi;Cv3vK^ z7E0Ajhy#kbfx@N*j%dzti=l*_@Zb)^gzB)a=7^bXh*etbo+{|UWzX!4#%Wa{Wu#gR z<2sg`|CS5n+Ily~tv`|mHKsU<p<N5K2D-COHyDjAr(5J0SJCeQdU>b^;{>+pKar=j zX}wpYf!PEGV2<bLLc|NQQ7kqHQ*!L)JIGl$z6srucU>S&NHm0#Nen7%G*~yb7h}Yt zl<Po>d5YL>G)J=GPV>M%Y=MC@#!dsr+&GXc8^lN=P@e<;IlLHY1Q-e!<HX^pwPqMu zu0sC%k~TRS6VH2Y|4y>)u;mudE8=txA#Qz5nWr@N_jq3CiMV<WfJrq-e7tYaKI9WJ zu>vA>(3U_??lNH8z`70APg0GB1)U(n+vU+<2BP1BgDi=X0yr$fBiKaLv&P7d;T4hV zj9Dm{#Zu$SIpmY#))X6OoEMA(GTPS{oMw3C3oo-!#A1Ksi1&5{7L*1uhHNllAT%3e zKW*l%X9dMn0#Rlz6^aAb;!ybDm2$O{Q3q2JR1XsnB6Ddyrjg3^%0=Vh?5AoiQD8^n z=}2}Th{rOy<k_t+Pv0)jPmXZ5;+yFiE>E-@UK|Sy*m`l9w?1FZ2Ez9c<@ZyxCQ9L? zr3$9vBm>5J{xZim0zrRZda9%OA>Ou54(uJ%Y<nd4(o9d%jP+n~H2WD<MlD&Ur@CgD z%k3rtPzffH2w-AAcX0jS{0I_7VUP;U_jf#HK9ZC&lBe&(J4_ieh<tQxRJ41e;T8a? z{NR|kEMnNm7NqUXYdBdg=OTI1J8#XGTY9NUBQ0iUr}G{gtId(56D$|B=wZ0vxpwG# z4j2JfRcC$pSxI=9=MKOU*IXtgD;@G0^<dgfVhIjEHIPo)B*i4{<%h_Q^KSMyilMhw zO8B4@hgdIhJ}=IgPi{dr28ss_D<(tK4x+oF&}`IDQUiRxP7ulwyN9q{WsRn#k$E@- zX`|Ty_Uj9b1rCJAu>EI8U-Q>&g}X#&F;l@E$vn1(VvPinETrA?ya~^mk1}mfDh=>e zTw<l=LjWz5q~C&K;IwT`w`89u1W;4f(z7QSi8ZlpCw=b0_T0AxC?Ysn!;#1>R&9e? zDs>LgL^*4mo+B;?Y5Uz?y=nEq+Kqk^JKsG&J-tY%I@q7%78oQEE!{(|m*_+iPK;Ly z2$Shl8d>XlpOcg`lml@?UQJR$or`1tpj0bm>7C{If~l^y=R&Pjw@xvOC}YI!8kXSU zkJ{+1$)9?7eh$3N7YUinP95;rg7G=Z_By#S`ExO~6C?Zt=u#(X{_Fw8N(}}u*l3&< ziBZ%K!I4vEq`ty(7NcYxC0ssa;R$7fLNW*jKRH$FC;59BEj#nmgP2he&AyeyW+~sx zpJZS*R-F8ut+J}L^_S<!78Bh@YUg8Eht=>KLrMVNxHZFRg$m4npU+N?EMMtRDW;3> z5pnN=?K~tR(sF|R)!fUW3s6?W9bFaFDNMbt>IQDyLXzsOYiZWwhY7OD0RWWKB@grA zW>4jbHn^<S6>q+bAJ?>_uJN2<NkDFpE4Gw#S$xXBIqrh48$WpQue;%M-o2W!`<Azk zUJCC#{;fn%1d~z25VrzCCLMrdfTD3`L9%l}VBYson?sn2t^UA$kn!!d`2~9j@v@@8 z?cs2w^Qp>{>1K(ux50BDHy5yL=$Hhm-V^K22<n3$kn>8Q{KDTE9{F{UUO8|jq5h7n zQ>pRbpBSK(Q*&<2L$*zX5!a5<UVh>+WyVFE|CAC`^vvKHk!qGi^F(3nf`9YTYBn<D zqt`2Zzdpy^6dO6V5A9yS11eaL9k!~;Uq4X{#{oS!#ijML$4kJ_TBr-i^99H+%VMf! zJ(k%mEVEf`o#mfgeSR}x0N_LEz+d=b(`e(gxXehw8mO<t)ya2neTYj}^yGNf+CTSE zc75{Cu#Ot&8At?2oC=>xe=;i!-+M;(bpUOzF*Ic=549(_npqO8M71{>9%O?idWSk~ z<4A0KAxaw@c78c<>ul)pLK}^l-v;mQz4lootzc@tbHaC^+!vVo`eZ-etD^v8rIVgu zAAUW5vp9u~h{vr2$VA+)c=h<3$5;?7Uff<xPcD#F0ZHkj{H7QPHKF^-{lrC)^g}*O z6K}O`-olX8qNSsf5bfbc0<UWzu+xiIr?b@?>~d#n!{KEeCA(HB(x)%l+*{m3B8a2t z2WV-n?&Ji+8W(!#RX=9UV#%MbtvT2~dwaG9hUK;sEeVn!2Sd%!+8T@mHkCFX+gGO4 zwW%)@U$9zV&3?x9?^xsrfM^mpa<F#yi9?~#=iTXMN?2UY=c&ccqE6*PLkUinbPwx< zcow}(B$qbmdU?LD^;mZQB}$n0_xj}7?DXse9#_7ElOy_YBsVnOGP}GNGQ$znYUepS zZh+?aTVQJx@qF7Ylj*}SNA?P5EXhJ$A<n#}6e2Q$S`DxUBtK|CH1Q`XPwAigOHUb( zB4FaqD050=P62~fPe$2>2-MTd@JRmUUur=>&IsYV=6ZRtTwI(k&vE0g-V^nnYv$P3 z6EXC-$tD*Mx0HzJw*Z<fTep{9E>14Q)Vufd?C^Yp95VM7M{K)x0s7Xx!b9Pf6Rthm zb_#D+7oC08IQ%q}@s=F((sGW4jw089F_d}McrGf!5%DUlHO~|@$-?iFaPCz>B)(}A z#MSYr=i|#5eo=;Xy5DZfiQ6oWN0@$lou2TsZ+=t>)Uu^-TduG8CM~ZnZwj)hHs;2d zgRFhU;O}M`3iyG&JU{$KRvy8LpDV_TS4))TZCsUjLm0GB8qCW%U+a}W&t|Jr<n-Mz zR-tRF#6j_|Z7Qf1feF@V9#47aQnWwA6;k2BHsE7-G6<Mg+DtwYY$7=iB~hX&XjRKJ z_wZx0<=>93fr@VJg_pJc?|wL{FBQMnGjM$4{|XY?+Hkak(YH4++V(E2uN=RR1N}9& z{(kIhw(*S-2VqlY2d2}Mg57<W*nRx_nId|a6y5by9CiFVz!s8XcbJUBKwPmd+*#P; zjIFvMX)C<|@_96h!~xV<Y7tBQF_Lp?CkNN#FLc*rB8ke#x?X8nfuT*DNTACjF%G}5 zvSgARHTtIaBB8NxUOZc#eLH(M!xcWQMaKj=S+PUbvvP-*AUAH*Tv$^D>-psQfDVtN zPw=YYEVIcoE4j0eq+xb&O&e_KxIA&4c>|@19OqH)u4-^;AUB5w<|dn;J9anc;^(0+ ziV~n!-V%eho3T>VqZVYXuqVkIZ)GRGvuq*v?m3``r<mdSvnI8)t}t;`tOD&vqg2K# zp4{LDfq~xQ&gKF?OgyfeEfdSOiA4MhsuBWbh76(rIL8O7ODxg0%P6DD;NPtiK;3@Y z;c1{qnyk<?*vTk#jKqLacy}aJ5OW*?*lrYX{cqW#-O8*WCTV(SdHS06H@EuE7w|hA zeEH><jwa&{RB$MPPlMDK%KnSVKm<zMPwi<PBFi=%he}n-rvO8B&qWMNfa;O&!<r}2 zD%ESxqFarAA$V$Jw*Upf0o=W&XLg8FVC6v>VS)Hb)X*ikA;>ASd=MQujSaS0F}^L4 zBAd%Qtt=dCq=omG2nIqh9xG|nJ81cBc#-n&g_+^mNT6@(6~4*i4rqpKgLejVaRA(5 zu808&*nS{`9^~B*HM<3^vEd(n!^nrenvC+uor$h4wGpBig*J<qaH_VoQ8dV(B099{ zy(4~HXdOK+|1IJhvfUNPLCZyMvxXuQb@Z$NzVr+O;@(GjqbS3!aBfqM4fd*0HizZ9 ztu6D7OV!MImt&SDmmVm)zi~@qt*?A!bGH$k^mn~m?Upau#U<DaKMp%Q4E^NZIAb6u zo8@FWxueUW$xn!voV>ocu|ljkhBB~IP6BoOMmc5jUxr!R{S>ET`q{#p2yiOFll4Uq zJ3XbmNVQdYn3ZzyST@^n{}_l)1M8qW2hlH^?=M$@a#X93+7KOpYarI;J-;=l*s7X) z>v1jKLZPmyd?`An;TJiXAI>*$@qRUV3idpiS(9l?Iu>$Wn1RF-1lIM9TZf1WK&pW0 z95;4eNMrHn`OR(*VE6z=F52*hxVB6CJfrga;n7K4#ykU<<n*Q(bCnM~OoAgj=qqO} zfZ`YmBCqex)`zRPoc5~U<EXXXGgJ96h#1#Yg&Ez<Cr5D!5jG(&6Ty*3Nu&+(z_PNK zxWi}>SVIS2FrGe(d64sGwwi~&GEQ0V%Uky#Cm{;^5o&4wq%PhJMUY;aJC^7H3esX^ zw2SOf;iHVZx!XfwJl+bMFi0Z#$4S2A{|E;ML0pft-!5!qfH)cZm859zb7EK-a_jI9 zH35^Y=hvPO8>dB6L1>-omL=e_CB1U}3}r%jdG_=4aHIETAyW>65sICAX?V<u_6^nd zwt(BDg;6+Hb)2^HSwbeVljTpd)!`IudWRzn=atv)f+w}(MuXXG5T3<-oo)78I3pxt z1O}vyxF?EL9HVy+^0FL1_0aj$wLqWp{E!-L*L$X_g`==d7Y~@q8DQAMg9GUy(m^pG z4aFZzB_WZ3ScrUkgsv$Uj~;Z)HiG5|8<YgBnsmcf;A^^W_NFm}NXpn@8<P~+lU3dp z&M2LVDn>ytWg15!mzw1}IOu^Rb0&qLo)I%L%RM@zguxG3m3y4P6aWQaQf2AQNb?Am z8e~v&HrZppoiU)mZcEf>$yTvT)kcFUl89`!VWaq1*N^m5g5mH`#ZUQ=3bc#sh3YgM zI~s{RUS4#`j>5f1BRjggJja2$VJh{8bpK>Ig(YoFKEMqRDU`A+d1t!bKs;B73c2J6 zwesaU9>bNr@k-rYx(&(MzMH<8A7YKLt`e%{tg}rTydXTd(oA<M+!Z-s)U7wqmiiW& zrCOkg#t{o+;L^Q4I7Lu%q0%h&`39Owl#O5|z4Ex_6v7WRecXP?+8N$<Sib)MW{2IA zE^PRCi4c;*w-ZEHXYI<;K6_M32W!XAUI^cx%fh4Ofl4KpF~`LUr%zU!?KL_O3gUt{ zmbU@&%(Z5|2tLapcnOV~HleV$IU_Yxz)0L}O|iK@{&6y0Ocdejjo~>b9I>1@+|1XL zTR+X_tD}F-<}KDQKfpag#)j@IWR2V&DBG}o15St;H3fai=L`hm*mJS$salJqYcyu5 zKe!~^n>%$_HpAayxWwkhV0SMT4&jSn8+8!|`q^+=(&Itcf-xgjIuGdEmb2r@-)%bI z_rUM{UiN}a3ixC$zduQq!G)lQ8@ZZLHO|wwQ(P5_f><jinSp6lV<dRrwVKpeZ*&0> z4mq|0M*7eOwOqnzd#GU~4O-X37m9C0;el5~Ev3uLdkm1~1yrk1UH1{nbBXP6fF+J1 z!DoJyQRi(Y`>$&}Ha3uCSbR<_c_s2acbfUIHMnh<o$65`xf9mSJs^7QN_djZGs9p( zfE+OqiGC8(tC|Hm!@+>r^8I2x>sow7cWX0ppgpmG9xvBef*<x1F0sJf*<p#mIH2T} z;yB{E1N##W8(TqG&4wXZ;fzTI0JQ3^ne|vj%^;chLjyv@G~2+ZKV6AN22G7D<WzE5 znEkDx?##ajiU@0fky}%-O{mtGOrQ8E{g)Ug2>b}Ma~<UwU1=$Z?A42PxtsJFCcWej z)SiZ_u-d=;3sEO!bCmF9{NxOuo~HE+x?P;(;NARiWY0HlZ0WV#V?w-6O&NnS08xhF zK&VGlx4TVMq&^FlajXvnk{#soTUl@nDqbP7tMcs}Q_}P#t~SQ!{^U|m=CYs&51vy~ zm{CQ?H=i&m=X$+dU1U9pP`6LlSEf@5GE(=F*t>)L^=vVFw>*JoC#i3RIxJfiC<R-V zeY-#zD9Isr`>C<BThBTFTt;5o+Esu?5Y_4eSB>(@9;a^=9U+PN!JkJ?N11SlwPW{P z@!r~z9XK{`DyDyzJTIk|Nx6Dk9xtqW<AJ)C9&Xkhh|zRpcVQ8^=;vf}y8tvr;@+>p zD)YvZl#Zc<a_<e;c*TIXr?Z8e(q%IWhbjUt?cF)lgE|?;{xjAsEhb^8x^;I<Bzb&G zlv6A3j*3vD9+Ba16bH1zzw-#5U5q{h$B4lC5`Yx5u&9N$4a?fVFrHl}9}&~m>v&v$ zH{Be*ZTL@?3*`Kb`;l0N9$Ay*3$9EPpXQ1|UKLZDcv@O9l6$A@Uv?)WIg5^_E9A&b zknmStKo~qiBRl0V90sRLEc<6DGm)<00bu3<tnz<iLQ?#{`f-9#{e?ILkj`qt(b0~2 zy_zl#-&QjjT6>LBTKn~Ea(WKe%vv@rT4klR={qE&StIBJu0*%)xp{MMeg1m0!bX=K z>Yx1dc8=E2KO3auXY%&^%}l^ww_1NaJDg(YZn8Xv<etrN9QbG=i@(VR=EP*NT%Gcg z3E4iY>hBRNaB}KSw4oHL=U#kMDlYN@DG*HE)I!(N73M)2;Mvc!qtq(s+p>CD)-2!D zwiv$gS4(NJ9zWRJ%=>x1cH42W1vTm8o*mX^FP|q&$h!!p?q-NPA=b@VQG4xq686q9 zN6wBUKWsks3eI-3h6<4h^Pb`75E?{6PzGB(5LyV+z|<Fqz`rQH#hsN;g1)XO0bFUa zMB)i$s2+h?D;rq^lj8%_cL4Ly=vbd4ycP>rD;?PjLNn{l{TY<aw#L|C9Qx!hZBnod zKYax7Z3fm3JKwD9KOY1dMg)3P$v%h0z<fL`?H!XU`L=o3z7F{#MDQYc10IVB#-oeh z_e25Dj)dZQ+g=BhU2kbs2&$eQI5AU_lTKgo{geu*8#CwOzZ!CL3uH#jaq<juq;a4= zMq-$~JL8QlHwO5;hxnHtb?DF;rhIg1Uy`B^DRayy>b7{-&*@`3=;-xP?GNx<U$qpv z^-i9k72M;-KF|S)+inW;!`1`B5^yBWfH9feJ$v)JTLI+ohQR=WKX21OIqX~|k<;_$ zp8sipgbKvK89hRpHyC>1+S=R=d68D^1RLUKfTpz1!v2Vv#5ZnDkHpG;wxrKabM`3F zAbZ(R2^r#Y(+;rA_pg^n7Xus+_!mXj+)C<{Yy*wO=_w*dVZd&i;B9j67(krpDRJu| zid!pERQEbjX{ZiSUcjlkfKBu@Uwgpqr$zIHEao`s;8)}@FKJRRD2LX$<4Z}{!{04a zU6?RAS*^a%(0Uz|J*yRZwFlBnSLU|Ln>FOd<K!$yQU{$KI+;*WOW3br5lcN1phkyz zXZbJVSPGahEWWh(RX9KdmLk2~K$r6Loyn~xmg`LqivRuIy~nS9c=X`ztJ}|>J$dl; z_s{OVdU*T0dxH}&Ed-pUfWEkK3zOQ|Hlc+S4(Oe+b;`Xj@+3bw_VgL#chgpkqZJ)c z+F8Za9TKsJoKBhTFRqui9BjVaM7UGmU2()E2Pg2@LkV+w0ApuPUp3~jN0nv_8x(}J z#m<A5YG7AETrs_sT*mNz6_-KT5`aW(=|XfgM<V-F61#*Gcc%yWXdB=Ua8U+AKoniZ zJe?!1Y+A}M?&JLO#s4~oiv;(59U+7N;+0tY``Gu8tq|M{pva6HA^1&51;|$jq9BUC zC|=%4OV55!OaZVDKYWuawWlT<PE^BQsU`8qN;YstmcN!`mhI7zc7J-Z#w@aB`)CiK zZ{A)c7oLYgJOBFPnG^|oY1<$o75}?xIETxTwp^`9+~ihHb&(!I*^3eM$Xj2@{>8wl zQqk3p$*g)JsCPMtd_TbHvN})!Cn@k)6NO+Dk{u$q*i75#421npon-N)rDI@R@CsF; zME%v$!=1OY!yjdTw~^#e1S<sze#L$8&T0YRh72T9oYKSJJrhi@p+#=oI-Op;W|VZN zX^KNY`~pqpNZ?C;4AJ^q{}0u!1?Ykx*Dd_&NEYi0hyi8W&PuTCwSeC-!+^pRorv(s z5c5k+$9rTOz!0eR5O<l~3!Vx9=jh0L33PItIN&;sM8fF&sEXm_9k@D8j5sN9?N}QE zAo;%%tJ{)+8C$=1meUg)U8@#Kq3a+FalXh5h*&k-*bN5X3<gKj`YWQF#=x4kkz<D? z6Dj4sogE{8Ub1tX_BhatO*d|xph!7|?(w0BauWTh2eWxea2@;bOKH_FY{k)lEIFuB ztk$J9%MMy4a4MC~R*e#wuBlCoUK}Amq4=N{DK&_IQ)mw+_lX#zMhO=YG}K<`ku>v> zmRO7}-_1m?CYlx$$)Vp{&ELH3kUpCNw~$_%DSGlF9NJLnj72u(4n~a-QkKS10Fe(j zbY-PYwOPTY#xM)Dk~}Eb^(MHHan6}*jW6P&ZvmUx`XH}F@2@l%YI%QqYONTEKo#8R zt}eJ_A0`nj<35*AV@Z`_HfbfSc5cUZXOh+LQoTvdVpLnZ<AlDgH}bnok7eW8ssML! zoX*x~)5F<OKs(#ci9;l7M!vWY02?2r+=}N55z@4u&!(hN1nUnO0gc{4m7?wEHr2Rx z(;UJ9_??MTjT;LKqrEv<zMh`MvDUqXX{v0sKw>f?F@eOf3IYL^_3%=hH!RTNLzO7J z+`6#}?jP-npm#THScc`QFuCk!VLm1-IdzE@0Y#~Y6kePl)nzRF<67Ldri+?Hn-WMM zT~9QdJF<zO+2zSQC}%w$qs^D71`4%4O$CDku4dyeST1t-zy|xpOI!G~JViMh<iB); zfRq54p}!UWXy0%I0qO#|g4o!Ov_2#b5q-WwPOKd6P+nXfxM{7r;mhff($;$j42IKb zj9|E9OvBk$Z4eI2+lNx8ztcO+L~L@1ed5?Vq$e*tm085oc?5C-(`-9wR_yhYRC4`h zI1n2teMn>#s>e~E>$e9BX-o2L7{|&p3+uyMy+`w79q>#_U$sul@_#m4G3v8aRbYnY z8Qop4asMKOqdF4Txew^qoH&%RBWQwbDNUvj2au@<oO@x6Fm(|5O+8=uqUW1UH6@Cm zS@_KY%d(RoiSo=KfB!pU66QeV<3XJ*W0ig6T%p9pk^{ET7cxcBUoev#E4m>Y8{yzm ztDN$}a<Szt5MWykkwvk5+3uf<0%>$p1#4bAy7<NoDOX!*#_7Q)HuhErVh2Dq(1oiS z0M6i=Y~Z{GFtkqG`?bW7{jEK#pI143EXK&d1)fI?qZmg%hP@VYZEkDPZGffTkDWS{ z(p7YiQuE`%@eM+>oq;+ajlg=Y)^el|GEGV0t;2s`rZCt9SyZ-uI{$$;yz`20%=qqx zZx-w1eUoN%f`*wG>r+IcHs)Lit<cNz74XwFSg08cYW|9JN~T}8SEGxy&>T1CkQcJ? za(8|zcCjp8blgYt)9#9;f`v=0_4Ig#NS4*+&U|%v4)wfv;}HU<a+r^ju4L4B*1aOH zEEZ7;h^QVC0*cnNGZ<S&{@n~0?H+M1cO$;Mm8WSJ3C|iwbx)TF8ZM0ol2AO`&VY!A z940V=5ZJ2Y95_ucZJY||W<X_{Ovhy}UH+Jdk{Yta8SrUr9+=(uhaJX`a8TX(fIBzV z9K-9etkEq#;or~#GS5J&c)*Isr_SW82hCEs&r}i~&*BRlr72+*wiBVjHJI2fkl%`x zC*5Nu?7gtx96-j4;{|}zXs{sxM2_ox^zX|qa23YOON~hsD}=xe+Qu=0KLX1Xpc5;? zBEHit%%MeP%RL>TX_;_2T0H)(vjUO%&(M(#^Zm(XF!fby?B%<pZAz_hiBq-G9h504 zWxHepTg(p21V|`c5YGk^$#{*$ytxOXjCl@qQ!awt+;XdsEj@CkGdx6<u9Jdkprnqb zt2c-O$f=k^8M-OqRI@Zty0uF|K+<*zZsK(@9twxR#8P*XD<DN39PBTELWUVQi~mwX z(*uM?5I0sEXP>n+McC&!fu%8BBAkCum)yojv!h3nZ@}~${A6^jkuAQyc!=qO_XB>5 zV?2s6Q2q#pN#wuUi{a=%S%{zQk$2lc!%Cx`gav|Lr^#0l!QkI&Vza@c2gQxI0D6EW zS)<+a`_$iz_H0c32((otDrnDU^ITn#Rzu8A>${u}ScjiVhsLR7z`%~Y9N}v)m1!33 z#yX0X@*(8q-`5@)LIx$Zhm7Aw>IWr$2&8gG@|&*BwTr3%olq==%ZLnok%&2&_;d%; zZ=`zIEY;~OnR_`=HrPuDtgK5U40;9$W#DqopC8u#8!fX#EZURT4<M^KL1PECj9R$_ zxc6&dEy`?T7v<9a!!LA0&ZY~ShisCn-`(fQB5aD`60f5Ov(==R;2{`J=WNVc6rvvY z)s25ZF2p7xuUk-FpTtB}ZqROt$wIBQjS|ka^TF3lNe7LXQ-Xb-z$?&h{3l9h<7Pw9 zdsp{HQ)xwl3J(hsZ55|KlhtmUA7;_~zE~w?j808GA%4Kf4N(9E;pLPZ7k(zqh5H-~ zQ}BrNh{q(>XSQC=P!X35K_r}Sc*tf7x|@UdtLfipl{#`jSF$$E`r77Y{b9QLcK+jR z)Rwv_-C<|zS(yE7CNZw9-~B!ZB_;m>XUwF28jJs)eMJQpO`u)ouDBjDekn9lt{M4@ zpV*aE8<OwecukZE*$8JyRAN1^!<a=+ug_A)eKPBwDD2LJ&_z#kB!ye#^IrEHGcg1S zBdX7tXQe568NrN_av7mafE6-nmWr3fRN6$*3MSC~(kGrwD-D=bSRG!zN>BgD;<1*k z!tkNVS&W4vkp8%Eiw)2Ox`W?(QBZ$_*bV>k>*JvfGaPlr)|qa>zQJ}GshD^lgTp~R z?2_S04n5vP@axt?GpMzIn_N8_Ptqn-$#X`+h^cGAwqG^wU%);)iE7uDC<Or^As^a_ z7{p%=L?iE<84WF{fQ})kj9=pr!w7A588l*oh}D>WD%5Lle8zQ`89tZV`phvSjNECN z&O2;jGl*X<X?umu?A0q4ZiZ&ZBMdme@c5g@Pmvz}#cfF;He)ox8|1OX2JOR;XlsTG zY*(}83JwDD-S=pj2v6lkc?Ga3z-YUnh*Q$%Ihbj_KpH{zz}_TNl~&Fv$<q8(Dv-Js zhgf|h4Xu!)HvhGER_$_w1&26bv?O=P2jhE=kYAPdP8pK;C?VZy6oW%Bf#yd;5It5% z0DLzR7o@FG5j0fMZP4mj*F(fkLF+*pk1n9T=ZB`M?){9LZq~@X^<?%2x8AI9rXP}i zSBnuys-Z@4;7}snLxTe)%ZW+(NhgeJd)w=C9*NCAJwH1`+zrlKH}qFiGsfPytJ}}F zpEG8xL-FMnTS{Iy23TN^qQU7VLQMf{0W2i;q>L)QErLS(45T5-$3aBF^%dLg*GR~p z<iBFOY7-$5;bIMDJC(c7mvpiCyU${<iZGXPQ_IC}y@VcQ(|L{*fTD4NJZP!2)%+bc zJk9?G<VWvLYyXIbk0x2aE+>;UPASGA$sXh{X(v+9J!1`@mXm>Gv5U;AmPF@+#ceaU z6o~<66I+yfSsRLg2=Ts_og){@29QBWDYrq(MTbTga#o@~3K}<AnLhHeFt`#CsaY60 z>QV+Hb;IovZYVc7#9JWADEC_dagV$NqX0LcW$=g#NyjFu*OLFP0^aB{*bQxc4*pn# zb2y_`{UlJ8#-3!Mqn%nxk|L<wdwn8?ghVM0sU+P6fTkOrL`UpZJ>yuMjjTbZaGUUi z_XP6UYWj`|-(jVm^5zP1&fsa~>ytxJNTQ9A_d_ekaTQ>QwqS#v)xVEdY=~wp-<Ij; zOQFb=ROnrS9@J|I5?URc%Lb1m1oUu*qTVE$hL?UFd}ou|AOG+NorC@``Ky?P36F9H z_=}qp%`TBS<U)-<%HK2Gb~Zn>S<z*$p!~!c(2)m#Q=E9*=Xz{jR|7C?7hK`u?2>dV z9oQs^jK-&Po<l?O;Q3+_S2<74kw@Ug1LozBtQiU(XwsY)$oG0MP0Z~&K3$ceI37wm z@42XSTfn-9LKL}Jr5X7n0J-9WC*mW$fe@SYa*5$DX)~g4V3)J*`$8^!DWro<@{@2E zJUX%pef9L-)29y}J#4N&wO*R7Nyr@TSimGcKH*=_t&u%koOL8th2cWN*i_v?Xk1VB z=TPN^BNU2IE9p);l0UraFow#k4L4g1#r%t487~EcUN6<@nPTwgK!&I^9vvTp>-E-) zIaqm&0*QWtuf9?r58H{N^F1O45H7$akBY&&YU44-*B-`3l5|JF(*=e`QinpMa7&&a zsVT$BpDUq5^F<Spmt8Y`m)~gGL%lpWMuu{t6l!p>SZ*fBn@&dN+yk|vDc5IIK@%K6 zUr&+pe2RSZ>lr2!R9#4d^UYf%LZ7Zq=D4p-TSJ=m^_NL45eew)-j{E_WCC2=$N7AJ zy8rU|{%ihsxc_nj(unvl!TNOa4r#xRkoj5DrLd#v<k6GK>j|K^1C5AO5)sb4lO~$F zQXlz($w-`v)_F|qV~6gXIt6(+K<PWErEM$6D0I5IGj4QD7>w?y81PfuZuFcpX#NXm z{{~q-l`7XK^9?afRMT?E2ozw-wb&>vkek>4_=nDbZH>_|$g4T$?1OB$QoP$90HIu~ z(`}PWUomDVDF;Yy;itz1BXkn0=Y-}H8HlQ}QA-=v;b$};-R-`NlU$QIH}ORdH6gy% z40u9LF4;(Kr{hW^ZFAZ0=-2#k+tB~MfoDoS+k^1bNcZ)$*k3EE`ok=E53*@_DO3w$ z*Qcww$w*hh0&HhA^VgOEtMildv_5kH?ii!M`lEsBNhBL-gB6;tS);C!Hy{WfF~LRH zwP<b%<t=t6;942Wbo{?p^9|=MnTyL)J!8SU3ciU${1Edu$&g^&k#)Ag<^59cYgxp; zN-`UX$53Q@E3rgjqD2>`+GU*dB10$umGj!HESq1cchp+xt-uo{ylS%rP+X*O?c+{- z>m2;SR@B%0vV7}0pq6wa5t%I@xLhh)p)EN0OcsHqtQr@5@+&`~w_A&BC3)D6Y_a^v z!CsCjC{Hg2jjtrlBEO>n+`^2~Z)0iUToR)U;?dBR)2_i6nlPc$SGC)*-ib%HZEjV` z9=aOT$wwLYIxQ6AAF{Q4G&?E}>ivUVPtpc%XehWY%N@N#++V+$-Jh@4n>&)VD)^Lb zKlS=V7VHLDbTUiBza+zd@9<=~K3~b)TwX6{+vIV0vbi08l=dO40)N~*l&bbNbHhS( zR4D3Ib&X}7<9z(~?C$cgdCNu7yJ`)ya8s1c1kNN6nyyx!B+w-vm1`^q*Z74Rcn`VC z&rU#yXVW(&?)bjKpCIE|tOVc1ci1zqlf*H4AT^5;C6?JPkp|bAYsaI`x8JJG7W(`C z`3PCoI>IQCdd_t#<6&sX!50jbp~pY<KE)y1PFXJJ%T~U|r2*JhXuY~SJDwtZr~UE= z5xhe{P<UAKfk3mamOnjS&JpJVNXrELd-KyX2toh-R1!{LZR^8e&`=|-c8{fLxX}u( zS-VB00^p2ipV?T-jTIqSF_^6G12@oS<=#lGm1c>uE$4wc4)HRB@mEgd?jwI6M@WaO z7gaB$xmYTjvJTBk){A|r#KkuykgO-<67JBt1J0vV+%#Q+)kQ<3`(tDptIN`ljhPRd zQFAbLi}>t_A7z3tCQ6qb4?PeRk)LkfEN3;XtpDd?z-RT70tMT=ph5jaq>kDXj39Zo zmRl;Gf?2ULWMd+I7>&$r2|<PfB(7sB+d|G`%k{7ZgV|*elGkAfr_jywHNvZAa(wC0 zF*B^kNiLFpo5O<ujvh9|Gw?;t;cTce$~2YpJwINVK^7FlPVOU$8H}as6SuWQfq?=J zGS|SfFbW73Rpp>Wm!O2Zxm@*ni1qOHn%X88@n(@y*7K%alx3-AOh1=RWVTYeW95z+ zP(HW|h%{a?tctX7&N`YO%8ceUT$((iY2fQ&$L&dsymPasm=IRZTLLzc+aX_)GongE zh||+k+`gh5aj2#V_P0Gu?p<V}d#7ici+pN^nE-f1rRs!=UykZ{`TV8+YZKQoo)JxP zIdF4^w_`&KS{o+(<ge4S`Q#7nH~>b+rL#{5T#}e;fvUGKm;)dfAA_;r@nX6!YXCN! z&N-+V9HPqR3QQS<fX@Fuo1IB~AZuv%3}zXy*RkzMR|XgtgT_{#1jm>#kxfI99j~G) z^=m%XwB>8<mxxwfr1(zXk7n=^AHqyNnjn08lH>b}P^?Xxqa`x*JmZ9*ra$SizP-MK zQ|(AbB({1TU@UnQccxlKrE<O1A~R%z*M$`wg}Icx(O7+ylf6f<5zx5awYEOQVSbTc zWjQ3-j)%|JT|MmE2QLgX(dvDCZR$`J2<hWK?%!TAXj<p;7#+b?$L!~gC<h|wXa>t= zh0Hvw`JsddtKQ%%Hyy>LTu7vzYAbpvFt!EZb&J-UBMGrAaGCi>I71f9GwW))SS~J3 zm****+7|1nulYjO+TY?@^Aq|jW;~;i-X5N>R``8#p;w0BYU%`(bz_B2m^uF_`LSAs z(O)o{sg~F1k|9U|#nWS?z=Iosx195JdT|D1E;cgA+*V48Fv%o}PERGYPD6|`=g&XP zQQC6Oq<ud*P&X*Q*dvN98@pnb^oc2`=$N9l5TsPd$YER-8?bj{&+o>X0(-!mn{Y(n zVi{|_dn7i9$gmT3*PYU>jfMj4b_@OL4T7|{=apSGKdvyL9a39IA*9Nt=GDVu2m`qr z(uK-&Rb&v=K#^GDdWb03Kn6CFKcQiQdv?O+P-o5)qKG>yHVfT>^rXF8L&WqLeY0+^ zZLjSqs5xM?+QeU;;+D9!E0+&aLMz5aS-pU0HQ!r8<O(>>zY_YNQVQ~-MMn||#R>=b z89-=9>JRp{>%Yx5={7zQbR6rc8UcE7lb#a{!%_sQH4rg<9!X%5#7vRk2LYq}p4ki4 zRu2?850>2f8H!E3O8gJj4gM!*e1(HJ$lX@zi6!oKndAJJ=yj+FcgG4U+Pt>@X^z9N z@_MtB%S!;6uUjp}dCBc$pOgIlO;vNUzS955l<~Zx%XMGQ@Ucd~n)#RG3;s3a#-|a< zI*EbuGCEU8!O9dYIV!QbLalSbM~8baOmhXerny@~F&f3;i^R8^5*EYC1~Z*>0wZvn z!y+PcY=hE83$+BVORJi+fq&#ILxU1cmayg{)ESQsD()h{If#=Cg#Vc&y`LZnae{Sa zmpqh=uNN6bp+t`zq05QSw&R_l2d)XM7gZ3iLm(BQSVQW1rR<qh@-X%+K;auK<9W}= z7GqJ1rk-0pve!tmEv+^0cQ(SaC4TbOT7uJMROfvaO&7?(1G+&mw1)8CO?VCE_AMg) zeWi}GohBeX$YqZ&xQr8$@KrIN3Fj{GoR<)Mi<LsS?FD*HLfZrPd#>#Z;l~#P*W;>v zieI(%Hi_f)$}Jvsf<Ze-*C%RbsMNK3jj|ILqTNNI^qOlVc4+KT{|XG#1}1jwCvG=g zTf4a>V$-G9;c5sObPm-628b`!)r91%=Q#{7TiADvweXDPUZ8F!K4S>^4DPh?WGtFD zoRB{J7-sc%(x$~ON<L;snz|9;Sb_-Zu$2<xEwpBXd(#D$J8+Fe0<$?$;<v+#Of!`B zX+BJ$MQU)!28uc@7S7u-RM|Jj)NXsEi7c(uv*kI!p*+m08xQp|DOru!g2n6=wvu6{ z(3$Xf;x?*4o1j^O<QM?Bj)tWijRk{N)otOKTA`l3W)_K*t~7JQI)R-MX4<ZuQYCV} zgCiRABY2l0dkAZkfg)iX92oo;I#cj}H!$*=4DPhJEW&z-{37#6x0q~yiMiF@sLT<c zP$_UL4juax02;U1x5%lfC1q7D;A3&%&({@M3bi@qVR&v{ot%dQ5`BL^ai_aqD9pR7 z@u%Z^2oT+I7xjHJJHdwF&6^PTW<z6Oc0O?=OPN%$)Z(?7O^?DL+um_(O`gpT=f`s# zgUUA!8ve8}5WT+AJB4IZ2M!o#QB>e)mX+wHC<ZvVyHYomL;4I$dfc`4?efk1u#jru z-~~52oMd`vUF0T<(c=y=DCe!nQ)(Unp4bG57Zait0%RO1ad-4kFWzKQNnIruFS2LH z*#!EU#K%QrW0su3><|$&e4s7XCQbm>V<qmiJzV<zNP{pR-%xKNmSOLNn|1{q3xO*2 z&Of3{+KibHvu38iAiJKOuirk%9NXMZKMofQ;)E?$^&lXe+tvfJ>c)o@(8h)fQ*q06 ze95AWaGL8}2P!kLl$O2Q=UM00&r2(vqjs0Ajrsa+wYj0Yq%i<GLYY5(2n2-tVv}3H zAZdEu*#HT6z-EiykvBcLmpIV2Bf2JVYJSwd2$mj=oe?)C+xC#_)Zc4wL}+L5joJnY z*ic-F06q@;XBqpK`?6=tvw~Hxg#E--`wER8DBC*4@jI_=+k^YB!fVxrOX0Umi@AG0 zBlpxg__L9SkLD{C1X-~$!&|tiPIawKL<aCaM}D%XeW)X=m7dIDMIk>2$I7Or%Q=^- zwjE<?^A^jnCo`^duw=I4aH&mj+?b<(H4~KV!@5Q!=WKP1>$=@DY>Cb{@psqmX2(I= z8sVD;pna1mJ1qM+cw$X9e~Jsbb07&e7mD0pQTG6?h*t+EuqIA}70>ZuFfU&4P9c9` zcdibCshLjL6*rgqiM-Tgs2b@-uwj)S{wRSHqKgWXEA*;rO3dQ*f&S2|l)?|DI)O4q ziXPh|3}$o{oE-<Et!1vyUz0A+DX;t8KwsU5*$XAh#eS?r+83}1{nxmqrL-M`E3P|} zVZsRQn;KcaE9M5wlh!~HiFMi=BHsa#+s8LX(?sSdl+AI7KN!$AqopFY6(w_vV8r5A zFB{wNfjuRpnWUmQkpE4=1?_7OdgcIC?>Ea6q^pF!sAH4N6r(Mo1*3ug??`h(JrUO@ z2m5S{d$qZ{Ni?B@#2FF1SrtN~_qQ|9J#Za;Q~ph~{izD`I?wl|3UWJy$_k^25Ihcy zJIb1iWrNDD-e=u4>Tm5d3b#&dBMk8yw;U~X=5!b{z0)z%xtEs;0eNIaGs`n1qgZ1^ zQ2m&H_)nXXiN+rCg~p7adO=T#HHa}u&^ICb3G@z|8njwv%t%RvxbljBWo~ph=&Ys| zaipMWzN5)>Rdd0FkeffOIX785R!KFWK;_&8mNF+;FCTEiBYtCxj)iFw9O5ttVv^Hq zss6>}*5uEnN)-Q>PzFFD$kes2^VS;S)L7-`O<kY->H6fxpW|deDX_`@vb^?8@UA@> zVj#Uy^LKd7L^P^mSw1B~qy~0e2a?BP*FDF7DlxFw%Q$Y>2S=TTwe{YaoYP9PrYyS( z??NgXm-mm(H3YCICsh1b-LSqcR_`rF6XO`p9FEeHiwBE$%O7WQm2ZByX0RRhj&>Bz z5Fq$0>_8;2*P)5F^Ud^&I!X@c5klg^)6EN!J$)LaTYp@i_+V-TZi7B~BzHQs*TNt? zB!oMH{Un`4NG~MtiDmFaQ8w8#PvhO$`fxQrW9nMPBoGOnjKR6~OtQ!!qQ;&ex{g0X zinaOrF-`yk1rZBPhfYYL>TTq1TCwjnwn5}O=O@*UVO;d?1U9f&aU6kGOOSrCNw0-H zoRcVW5ekt1!|O5plGoV68KE#2VML-#hO2W1z2c23_Kty|Yb%|{(n7Cxu3t8UEmvN` zqfx8yf)%kZ9=|<PexwT=+zz^scTHzS&n2w}8bj_4)tSs!k)xgVnlr5zHA>0TR_4iU zdXnUejEao$t~u0Jt<42SGy^A+;1A8BIFTwc@QcbOH8(!_sG;jM>n_$hSfa4}ffu~! zzuzolLTe0|jk{UsSB#@2gQm`boNP4Vl;RKEOQ=Q_Fwla`kP`_d0DH9DxTOQ+3$q&n zn-L;~)D%Km8ARg&J64xKO4%%2>uQ9M$np3WzIRkip<VFP6bpU?oq})FCTOOqLHImq z3nUveB@&HhJAdM|2P!G-$OEjA+Mg0zl`|eGI7UN#g2K_AI%P~=FXF+qoTssS6?YcZ zWDINa^6W*Eb0G=2Mi6~qS|MlzO3brniq@8P*)cck$mq|coB)g2##CEobMhBw2GK*_ z)n+QJw0v1b5o+oglaHyBN_FR*YyG#=#T(1yPA!N-8}jgL1iwlXK|@<FPEE2Aegt+= z<W`L97?E+TVYrE2jV&5nt&y?OJq0A?nRh>BxuLk}Z!ois9L0Q+$dS_Dx^|19<+baY z#Fwk`Yxu6!ys7Ni@%hW#tSs5RoL9)gYc($81i_hnl1^;$7ZtOpxIzrD#Z^wYV!9YB znA12)1ltq*%0wM=5}ZY?RZ>e0n)F)Y&pii6ZwB)fV`KD{+H>xtq}1r_-I8FtnL@0Q zldXY+=eFDDdQUD78GS@H@t;9UqC;ax6E2xEGV?zSDH>f3;eOxY@rk61K*$wVp<xy` zf*A0T-)b6a=__Tk+<cL>OvJ!t*)41GL$IAk>X9ai=$;87U%+qExb4Ca&N81FJ7+i^ z!`2l$2gG?bmTc=L2WDONII)h;VaNZid;?K@oMRw9dS%-Ccb`DdC-CVm{5wngC@nfO zbl2XI3Hqz=<FNOVW*OK7_b<7+j%~sIwl&bY+`FT2=Js@vZ9N(=ZfW0LM!UHzEyU6+ z$)46+9VnJcYbR4KmX#u_5D}=VEDkVVBq!_0KTeZFnsyU>Pm(juubsDf4XOq5r@TJy zu82P>H$*csI_gN-af{!$qz~yfDsL@X%8V(U*Q>zfS}q^IJ&P>WlS$Lpw!VpuPo6)Y zt#A!IAnIraGgQ_Z487GFvTn>2XJp(~bG+&*GYTMX+{)5)T~^ddY?}LJch{Y)FF+2P zUip4znOcimi!lgI1ixscUVL1^xJ8#?A?%hU7`7-2XXHd%&x%Ps7ikKou7@4zev%R^ z*FbD+Z!=w?pHzl;#&Fl?uQ8Fi<p8_MX{r>tj?FEj16$;W=BVoJA7>X~{~TU|x+`k3 zC|iNasz_LEvIZ4kR+W+Ht?tByM#i@IcW-`NAzg=wY~Zsu*r!2eH@YGdgb4}vPS)T? zsLjT^2giQjIO}kRYM1Sj&9*yKU}_@B7~jTCeQw6r8~cu1OeS>i{J@D|8hFMh0O;Rt zH5#>+SZ_<TK#O3|iLB|bLzB3vH4gY!Y$ROC;^M`xY4uDP0(%u-U}vR`g%-ehOoP!` zx>MelNkDiA@FGYm282f^FC!z+ZHF?Yl0h`V{scExq!GBDUOwMbLdr7+a7*UG@UYXt ze-+Z}johCY-J>XfYLw620{JgxEi(Jlcrsvs=W?zRSE*x7T&R`OfwkrpDX+#dEVv(F z0$>jnxqS4_&mtow6bVl=N1NEsrp?`zdgC#wS(6@W1k4Z=_}k1hAsT|e(p6*!66VOw zoi~~&j|zk(6g#R?UQ)=@xcRIh&x0xZ^4b7NQ*9v8kihjVf@Rt4&6`QZF?LVXPY!qi zY2I#2&E(Y2e_3rh%>tsL)6>oSP6-tQFD<PwT^M`OF<H+zEnVvsW)9dE<XhoKAti>m zGucNN(&K1d#IaQc#|<{IKvh4<lC2GiQaNSQuQd*tw4FO0zAtvGX1AewApvv=pX6EK z*eDP<C1&?3jiAp(fwYHtC2FM6bioExW5dd%(FUk+RVt;?`p$|)+sMTn$Hznzu3R~^ z0L~|__KMHhwv`~LKz|7N8iv*sw91NGpmTbx)>9$m6>=L~cj>$oWpiDvqbh}6#>^u6 zG;bmWxEe~|7sw`e)SxztC2**Bbj-u$T43ky&Ji)W3BTRLakbr&>IBb43c^()p3bo5 zhCvJ0i)c-(!r;vc;m@*+DF^{0q+Ro29n~!Ln|PrqQ?5FK0#dS$3N+{1N5`{PE7F2l z`Ksef+8OOPZoS4O_Bf^&!?OfgJsN00UIB@cKMgHxV8@GCPhfb32u;LP3L{A1z-&|i zWlGL?5TXD{Ov+t~YE%+DOOJ(sc}E>wm4a&QUa*DncQUtST8^jWOT)Zu*bCI|mKx{8 zXjNIzzi>67a8p}zN;_ZR9!NbJ<otCBBwyXUdriJJ{4`$|Sjy>={N@#|nr$WU(C3w5 zEQiPse8OdBv8NI6HVmF`Bw<gO#520=EFeRb?5p7H1Q%hdlm=ovGf@E=;BrfPtPHz! zs|V+VvpHmEt&kLJPZ1a}(K#;qFo9^=i`uY|Cp>AQHTCMW=e;yl@^rGtYAQW8I=wv4 zg^8cHp+>{xDf8dn=CNUy6ZU{{gOilnM9N&PItkeTmSJHfJ@hSvdI~Ra>m?@#yWglu z?x&<d+K6c~P8xKLp5gLTX$9toD~v<ca2rjf@n1$n3v|9$CV_w{Rb(CU<;)+XGzc`G zT(O|G_0?_@VhJ51ARpl94FZ^JN1G&V*Q~|pg(d)<9r~bL^6wqKMwx1#R<v$8-E!p{ zS&f>b8H>mHi7z$mP7}*fv+o=C%L+RGY1?)6NDCz;7e(<|bn3t|%!}x5Mhki=NX)k? z$V7M#4VO3~yfSC;C2KDdI+0Es$-gB}1@>atDvw4TzII~D+WaK*Pg~h?84PBzMnD<c zv6-2__$fw{=Yi>sHphS7=nyrU>gjiyC?)Lww$Nu8dUmDEd(N+f?ecbMlzTPO)--oU zrsDs^tUw*Wd(AA#c;wO-_vDqi`*}PpJ0cm)TuU32ni!XHKUmBvd*V47m1;%;Qi4G$ zi6vy^DUI>l^^ie5Gz%pyYeMW`w~`@Ixw%CkxmR&nyfDR5=_TjPy0V2CVGyugzil0r z0B*kCRy~=C82FU|Utr!~_%9`HB#%t4dZ0qA7FpxDW#8C!*f#f<nnmXM;d-l)&?d)k zR~v}uA>QbxbEH3eQHLU@try!Lef~1!GCM?$l;%O=fm6V@<7xe<LiApQAk#dhBSVEl zE4Z%ePQb79y!95I1Bf>fk5NvsKWE<1tht8lqurZMyp<T>RyFfWa(ZxT+U+cc*(<uN zH&8|ARcPaO?eg4Z72wgMfV#aJXKs8sr?e+Nd5Y6b=@OdopgZ-2_dsi+D_tG-ICp`B z=Y^uR3QdI;=Aa15z&ZT^;vw*n7vouaiJ<daS#@HNWSHC16c>~nlt8*FHCvl`iIN?t z$@@rAdFW{@KhP@2@p|EjtB|XLSYXhoN678LJft9$k&R}22M)zmVB8>Ii;+ENIG1hc zmWv#fMk&vI=}+*;l)y%0$K~5(jX>JP=J;TL@1NF8-H}5dj&Ir2DCk4<UpNkBl8@8A z7D#}j(y@dK9&mCk&7`hK2y4m7C11D(aM~FU0Hgs>K`a;W6+Ow~uhuhN&o-fBo#4l+ zYa-KHo#K<V_%RfQanYW0!7E>%Z*cjUTqf$q#<CbpyDyo)1sToFW^sZO;E-RXZiG2j z{#3H7f(wA*$gucU5~6P4`9RY*CVzIm>)0y)3gWZY={gyXi;DH%3ynpeaRzN+kNq_l zcM%Z&eIH=x0!kM&!C#aMQ|!g&)bymaw-H}{Sb%b1@?RmO5^S=&A#PBMZuG)S?k-SM ztzfjesV_O$sX?4MQoVw223AyYp*BYNmlm)e<G!8P0vN2HKN^z+l0EAbfiI<;Q40JC zSrl=nQ!B?eNxYjq#u_#N{?fZ%k^Gt9Q=;=e3vAW1LWp`CswJ{51zukOU*(_$iWFdb z308@HYsBHO09~F_1WacmjpG*9;-~E=EJ)Gdr{@`cB#?%NUQQN4urBhe<ks&PS{lfU z?A;5bkZuwnmJ2fxRnfiG3iohxVlBjt19EW1Fg0+`V70F9Ol^hEgYgPo9A!(ONX5vi zqd~I99!h|RHWhiMXr>@YVH`F|{$325hD4|eShlLBtLfRW;`%o{m<Ed;Ii&HFD+->< zRyTF5x|@*lrs-(<qUCkoV7zVrzep$*krnBB{DtvJB)@o#Jkw(HQDPWHffm2S4*P8x z$Pl*@9!QkY;S3jor~QQ3F+y;;;p5Orfe~0;)4Xp*!USRxk(}8ctiNAqS_(=pP-_Ug z?7)na1_qJ=Cmw9IOQ^4<5@XTK@kUfn{*o&zzBBgXFMgySmm4BNIFJ>B)h^MA27mdp zRC!-8H5z)jsWf+kARlx+5t05DFX;$w__HR2o7yTr<P5!W>w;%y7>L5OJF;NLp#c%v zlG3tM7S#6-VZw-ENY*=tTY>#vzGCSY2-kr`+gqNN)^DZ_ueMXufZ>u0C%K04F%Bjj z2bt1ea@=(<rD12@rSvp&F12G8?|h(WM@~mPqn&M!1g}edjWTC_9NKy}cbR6^jH5n7 z><yjAg>#Cn>OtK=`@{myzH0BBRBod*{Sf3rX^xv9{Y=wwLyw)4L}(jx7h&^8ROF>{ z>LMT9f%{p7mTxtM5;m{I8_#z#9q1t+EwG^B?oO@d8ObFO%?ef*7wOLbamY6i^E0zn z@M&mW$mZ?U8|V|>kH)t#K`XX(%;z9@lAozC*Dt(VN1jG@RW&Ce5xjTo&jKW8I1cw2 z?Avt7u4*5Z!rB2TLXlE~-phDFt&1w?AV#E4{u+odqKy#k8vOqy3(gmPi%1%;lqR`M z-blm0B>(!JrdankWQZVwqx_;$^y7%Q5u5KxL%%1;S)b3MZ?D2qH9_dSVHhTp4~17) zZ_apw*w+y(Y^CguGfk8czW3}+7?5O@c^ySmkW@+_>6C#Q!BtJ03%Tt(pUYyhF80Qc z%&FBtdjY_#5zUXH-9%89=@E5HjDa;-PeC0v(JHm9e1z>UtQ3DrlbBHGwts{Sj{fII z+Xl;eb+fu!wFCPpo|(e5M@cOCbT{XV5wg7*=26tx2+Ib88MAi1x)Da{QDZ_jm#R3B zu;patO5B6$rKt|@F&89Se}L_<xV;9rV)g~oJ1IaIGsVZ)DvQ80;y(g5;1a{$)l){= zj5cHHnJjIITw+7IoRD-YZJ3+hOGdkU)V@!_h}c3f5loxeq?GaVuA67xKTN|RCH5&r zR8(-ee^fZy4LX+YyQyq5DUOTwN+O+{m)*Xb)r82FKvA@)Z``iWWp}hp>9Aj!;%de5 z`~DV@gSk4}4I+_iT>ZYk6|U$bg91f6>{%9K=cX$~zy6<dET45Hk}pjYd<cMYVDevT zMI_zw32x$NDmE$P`ss~Z@K?^?ERyfXkm~lIFukS064&K#M^8hPXq>Fat`jONH3+RO zxy&-ilgtDsSQDf%wowg>j~h~}s_WNjRW6ODPMOT-6D9>4tuA|P%y7B4+L`6cJ=$ok zV(M(M)<{#@SFN&LW2{wpz%sjxtEdT3!ys#c0*2k$Ix7#Mbf<Xk3%ro&-$_Qtg(Py2 z#OKDXkaRU$XwaD_>(tVS2^_oLtTxM&<xjKKLAVm|3)gXKGx*Hav%{D|cc#MxGqkCG zxbaIz88f-`AM(xa>ek=LGj(<{`<bj1!YMcSnmbU6%MP7nu$pdl#MF9ba@iBnQb+Sc zVwyDyFN$E=>UD6*iasgU^yrADTinCy0F}I!7MtQ7)rQ>wgn{}?<`j_Eszt`6^eM-{ zc`wk90(JX+lky~&b8dW+bmplIsTG|{B^Wkj2h>&N(AWts2bck+h{ia)ppkt`lwykn zb0FWqrZMRv3i9Q_o(SL}a^oMR2x*!@CY#oj1BuuXV4Bt81dW%)mw=^;angAZ&y%Uw zG&*1f7+XEkg9;{wc7pzsci0OW@?|;lk*8czeOsH1=tFuX8k_M;Mi_R-k7MJ9%Y|I- z34k5g6jbj!XC-UKzJ-QRGu&pwiqDphzj=&VbHN`sZ^8+>Jb9N?Oq^fsh@Rb+0^C)j zg}$LW4OG>xV|G#X8`@=<DFc-c;v*D3ru2F^*)d-n&sHnFg<(jm+4cw*o=?x=*<_R0 zgvMR1u8DS>N5GKVNi)tiJR({C`uv3VE3s*>BGZttO_o9_U@v4{Ta)DWvI+W{rr4`c zRcozO+p7WAvVPLi3Z#=S8$cYU7EyQtt%{jP93|gPH-~RETwlH-GdJz0j*mk`nD50L zJn~v48qcKwM|dc|h8=@<pvl`OKTR)i`O@j^^z{t<L0heCUeb_&T4C>nhMJxNcYU?u z0~_^RjWk=?mR3|WqzS_E(T_vF;|Ri%6!*i#D0LM!!4aW?%wmnfY9;X42A$%M;}`?h zjhubQX03pyKwRpuW8I|CKKOf}p8*ECkNg5tuuvn5!1alYZx7eCu8;#2BfvC)8-N*e z!N_N*N%+F!GsGn5%+x;E6&oS`InLq`HWZdpCYGzI^B{oHZ^4tR)y|r3P9t!+YILJ& zfG6D}m___#IjsD}WlBA!MkQqeKNxR=i8uvRb|*Y@z{`jrFueCQP*T#(Wsm@}hz)#= zbTS4rVUDaO&1!+|tiuj>;+_ZrCM4D?4B!N7pUye<e*;blBN!w((2~Qsol8=c5j+wp z%2qj@iWQwUo+~w*SU+%#^1f3e)M5PjLK?a|Kb55%X67XPED>jkgTzLo`93zZ9Su&x zh7mD>as6I}UGp~i9?5h>Xzp<SBuF}C{2}IqN()6^`Ef|&dQ>(jnT@fMpI)R|PDQ@+ z(X1Wr->7~hNZxumUm$Dh!IxitDUH8sUSOVJ4t>)IFhjUV9u!2qFqUoUAY*o-^(&Y? z;KA#ws4;ZP%uyQG!YKex=7+6nC6OfDn|K&Wv>PTxlX{GIH(C4`hP0xNv7R+7MEUxV z)#=7jVEq~IB4lJtjJ<?Vl?>p_*IgP46dcgvrUPz^7gdbOK`Sx~zVOx(97<4On#s$t z&feiUmIsT?$%XddBSaXb8tkp1Qbv}+#>%J!iQIB^lNMA`%Fk+JS>M49yZSJ=Fw$AF z-biISEwxY8c1Do=EiJ=2FPoX3SP`o{;I<6S4@3+k5O}h=k#0cFP!AC(HDHBK=qot- zegR+Me38*Si_B}dLKPcuH-c%Nj@+8&!a8nu!!+hXSuWml43<4Exq>&0o^Re>NPn)9 ze_Gc$o+2$<RmVTII#JCC*XiSqSpGcU7==FzsSGJUjQFBTGNNa)>9vF4!_<KM{9Py^ z=Sil17fLFDk1Lcg94CK8?AhcG?ZgSB$rd4PWQ5pt>I^zVjXtb8(hVvzOd(HYHJ-R+ zNcaZL0A%01-Bs4x%>gmAg35LY{*$%6zI(Blp3V<LEaN=J^$RY%3ySCrv5{HaW4V}# zij;ktdbP#Cu1Iz!MHdZ@`3%qf(gxP3#xvarRrtHzg5_3X?Dw@>lsAoR_1uK6>~){2 zzuPTgH>qv6h!OBUn&gub+{&cs^F=1UzneC3IrF>Rx@Cx)5yZm%4c8mnO`FD|Ey#6Y z4*X^&PG1-YO`XDd6ZbB>n@C+R;9)Gy<9A({b2$zl6wZpJ3%)RK;CKf11UDC$wq<*@ z<JVj8Ac$@inG@CbJD@idYO^-=pdaT)fvCN&BxadG*V{bLi?z32xwhWzumEdl+#}n^ z3C@V6aIUj7=~zD3{vk7i$B>B-i}Mo~{IrJc%ubb>l<u~1r|C+}Cb%7Sv}^0U>9xtG zgh2NlLGVmx2rK|GtJl6+oa3YNE+kzt0G{9y!nPZ|#`M||NeDl{rXD>0kwvQp4svI% zgC@+ELAg~Ffj38+u9{SsUUr-6;CGh><BCCmQ#KkfVVt1x>##3Wnv4iF4i&K?5~>AG zw!b1lFf4}fxA|#*!;eKk6KWv#6_A`ZO|=EcibJBv2O1r&g92q8A!MxOI=*pB-aI-! zmg^cq(`D^Y;bGc2&*8P_>L!)|-LefdZRNJr?~NdDp#rNOja4Y&Ni+_4uk~>v0F-jV zU;OSG=D8niGfM`Fd!T99!>8;qc#TH_MG*5-um}5cUUeVa0&-Iwj;DI;Aw}0^+g;E9 zbGAIbf`+-Zb9G>9Yg>UcaU-)Qk*h-4iRpY_)5#sAW?1+{kal1J>7J8w9&(acL|Gnj z<g<;+lH2d>3bugAz1D7tFZed~X*}mRWn9mls+6;=|7N-BmQ$OS>|3UeJFF|#KoG>X zu3n$b4(G=gCPvg*&OW^!!qYZlB#A<EmeOSnxx{5&vES*&K5M)sf-PBsYz=h=t1|{d z%P2MCnP=N|Dy(7;+2?%mO1yvvRf|vx`^>6@tcLrt^T01OMfaJgfN!e!G_rIgLheQ5 z8zYo`YYscAEGJFy^i{#C8tDltFizn<cTD<m3di9ne?V1W=+*4_1ULS|Cl1HpyZI4w zPKMo_81pMC!=W<>L!ruL7+D|DE+&u($DTsIG!^hZ^1K|)S41+t;V`oz9)Dx{fh$D2 ziaV#koJ>t}45~SZZ{NJY%Q)e;^$Ufc3@XM8t;H5zV=FG3gRnjBGkaint4?_2eW0ky z0Kw@l5-wp0k*|rgYr-P20S9SHyhcXIN|9@2+~nF`1~RrU%P~5N!zAtRnoZ4fCzaE^ zdk~&jsK$YGr(x(ZBtUC1@|38-t<U-7$Nu>d#u&h^BSZ_m+DIG<VqbK{YBVVcA1j!q zh)?*}*f+3MTW1Hc#Z0U^+Xuc_+ylqme&cCcw~#_-ls=p%Nq}#r>uUN9h@<Wx|DmLt zZ`<=7iVQ6hbG+Cu`z91iO>~1)tQXM4yCD3PxlSr=^=&oV?7Q2_-T)V@D`!LnrQ!3v zFc4ZmZk5hTfh~$R#@f<{tMfj~YIYJR+aa1W4`jb5K(~;!47IC+#KEZV$)4}!c?j@X zYdt6hEJL~c{HPn|1-SsH0d3nhA17X=6|F)li}7unI?X+wvQXctm|AS7BoEzPVJJ&; zf*%u5AI-YJyMqchmk6U_hw)7GvrbeJ^ksSYuv#foiqxTUJu}b4-I)dh_<O*eD(LZr zI~N@}#$<!}ylWzCBeNN6guykqOP#kgxXSS_znkF>fur>!7hK?0aBT%oI{M`ZkvwK2 zeFqR7u2L3mQO>?!m{pRkwX`fQ*H1dck#QT=&CPY607Ef_8pa>vjexQt{(P`NTpheJ z|2aE~Bn`2r$1{Wn&yF6+2`oGRa2C=sanUhw)F$S})aybZ3w8F|IJTVIj33G9oLRo# z%um)gZ!&r3GpIH`I@rsg`=V<)Z0ln$4#&>l+3W%zW5kKQF1iN3V-tcAV-}Iq_|EEI z9@L{5f{=L#<ql)A31;28SRr?_g5GQum{j#+aMF%J77iZDYEn-e?&V$j6N2rK>SC#u z)ACx?9C98%6ayoo8EI2IdzHepjhg;_<G2uYVC*UJJ^EjY!YTT$mMYbQLFsDxI&B6B z*3|Mra*4)M(yQ5joX=OY?{GHh&Rc989AZm?#14meJ6mj2gU&)T9xh%Odj>T@keU@$ zixjV2bsOMOg3i5WzhUX*25E4)-4}1@y0T8+Tk4@=IIRT5EJ7VIkffNSA}D!LVQ;?j z62qk&r6%gLHEy{%K@#DHCtI4U#|#a@ep(cl7wi#bnsje^uV7p@ZZ0%gBgkP#%5@Bk z<R-equdC4{d$#l_>fsP+#Dy>doo>bl2Gt&<4=#~L7&j>4lO!6kRZ+EVX`y`aDlW*7 z6j8I%uS*3&N{0NGsRZ*_Ht)?CgJ-8uua+|cc+bW0`HJC>$Gi#eAdT#$u&Xh8(B8_w zO}-hX6nTK3F{3sT1u%sg`n^Os+mw@?A%5Q=mMKgt$yn}0?%)_qCw;R#fzuQAgK-tx z<j3G}oZvfPy3FRQ7L;u9gVD1Ih0{1qiV-4y#!*ho8U-i+SB){2F`0}t@+bMPzT7_d zs3px*{@jfn%@9@9rcP^=wD7aIjliJt?_m-%KKhez0px5;XFylw;hieCD>}LIu{;4T ztMnBu_?4_N7em}|m<%Y>bvTGUOC0yiSq<^vHsAK1k2kd%F<zn}nv-?f3aV`YG5Q0^ zOUtK{{J`HnzfUf<fBa)QjJlruG)LCy#d0Hx8_`&k&1(7%`jThrCd7hj()E{<^^fy2 z#4^n$40{P#h?gk(b~Zgq3r-mxtF;!lvQe~tr4)!u^Mxz~W#^!YmY#UG={Ja}mNsz7 zjA2O7#JA!3Iiq8Q#kCZu@(Rl<tW%|+XB{{3>>V%97c_HRugx2(6C)oG8ZG|C1b3Hc z^R+Q3a0FAa<{vJ!$&1CROI7KDJ-F?hp^=uvAY*m-E$2D@l0hqQL_u0da){g*llKl= ztP_<rfs9pQa0!g{I30mqJHnFz^BrebXACxJNE-@qD{s>i$iSn;$wgQm_77^r^`jgS zPZF=&*q#W)$qUP|B_&6RM_K{f!rYJ@SI72F<yd(z!sgztmZyY7xh~8)4zr|?V5V-k zyJN~aVewdZNKosx#Lm%`zQN{&lWp=Nu;>z`(YD{O?n1yV%Sg@I=cL^vwk&mQd~JNg zC-%#}MTWEGj=rmAGBb2q?#+ADv>k!%c-K0jV@y&`FtxIA9N_!r649Emxq}w9Gvz+8 z=YX0b%uYl4+-&~>&`bIRIB>RP%Liwjn_eP6T-7X4>%WekXQvd6YocMjno*u&>|9H; zvtDFW36IIg!Pmyo{KZey*lqQ$aa1}>6J7Nf@;;iW`iFHnfxvR<GxTvNjZET?N}_n& z8lH>>{{5%Dv{CMGtJ-^DhG1&`zPgDCwmNeH!XFJ?cjEbgJbtfz(xNjb$h@f}fluAq zrZUsHzZ1W6=>UkBWr=;U7n?UQ{kU$8%fqx$6;`{TS)~w%!OgD{ATXgC5^NbiQkY4Y z`~qo;#BxYe$MVmXhQpjJ9I8ghbUg7T93KQRLhrIC<ih%obA%ZBB!AW7l0Jz*0{-a) z6>St}We?77sAr1dy~)rmsiFY5wz~Rnh~Sri{`yd6nJ{GInV9OQ%_ytcDb~&e;y!Hb zt=#f#iCloF(2?I{d2HtvA^j{$om=+FZPNruq6|5l*r_)dQmOZxnsy<L;wmhxm9so} z2sI<vo)u#avq93CilELo$G9Qp#PXT1{2e+$pL}=DONbV4p3-#~l3%qm9q4^MUtc_v z{3sHv?$iN^Ss!e&R)0xe6=$<&6z1AYR?Z}-lL!*oJpYngH8>{J-s0#b$_LAjl(?mm z^;~`WqS=Oysb~|#J(cEpl}Lt2e=5YEGZHxnJ?V#}5O<;nUz0HdN{$PW*ddqei`z)x zbAc?cFIXWpgKEq-6r=eR*;yob8ATE45}VL;HwOjO4xtTnWjG*J#FK2uh}d(F6+c(b zT@n|5@d<L5tQkUzpDo<wi)NTLgnk;_rO5su+||XwF5Fdyk#$(T7O7koz|KKRRW^DP zkCSKQRzoNRJpk?P*t|hm9X~x^$sCB?xyG_v`5<U&Ts~;}kk&(*$g=5)ZnLMjyJfnP zX^i^AznAFnSIt-VQ1r$3Jf8gBd~v>ZzPYjy@y%%`B~S!x%-T~XpMddzH;EX3zP|=a z_9y>#D_)(s&)!vQ%VSG3XfJS{f<NSaP?`HAj6UEu7xHdmWG;{nX&x@c6#tz%i*-dE z5!QhC4?~{w^>T#``&z;pmnq6*j|)7m>-Cb8z1I|28~`YUX76OSc(Zv68C`Ey_>OBt zo_h|1l-)?LUKg)S6({)%&C#>kjDd)gpq9%UFh*o^u_QVb5qJqe2%P@NYhnZIukgYn z^ZMcjF0VnT)8v#g`{l{(7>BYK56@3$tNG#e@DwMx-@3=is`9?2+(NMKOby<Hgarph zSH;z|617%6F4cwzEwy}AQc1Ay<d?{ja-H&QqAcIkl@E}ZRs0AgG}41y0?RS88)_HB z3E%URpiX7GE>9L0AQ}Ty3b%lePQ-p95b^~kW83)=^j_<D$9L0<*PUAlTKUo0D?i2( zp=Sw-GByY+i5f3CW3#C-Q^M}(ks77y)}8N1*q8ljg}lN2EsSb-Rls>bsW4lZg`G*v zaq%;JM^{O`mV?Ci)9N4z>|l4*c)CmMf&OyRHHH6qW8;$Y@dX1{YO~7t<rxH1gOTD& z<=>IdEdmpGEcbpnY#3w~HZx#racQbI71Vi8MJItJeJq_$VYEA}`KeEqTFR#x4@FB+ zM;5VDhKI5xQgusfqF3%jh^;9@X|z!^9*ia0BeEJTFbE2z>RP>cE*pkGB+)Z~5HW}| zn%A1Io`={w0}e5G(dFil=s@hjNH|eLwm2q#sWlMa8^iDyKlKx%HDWs*2o6Lse9Cu9 z<GSC@xZ5pLrx$OuU7@yNq1@=TVc53@|E#yL`3yV~c(p{cIeP(PKBJsW{}adNH_$CJ z-JRcrq|KqJhHX~sggcRwy@aW1h@qz?NTgphk(3oHEUA#B-2kUMg!sj8nLLtHyM4To z^+F_YP)~+5(x=NbMPJ=1BHA%*%=_=`<mzzR_A5gzM>+<*1hnKw)@6!!!_7Ln6ZtBB zqWxmU22lvktCdh8E~?_FiB#PeO@Dz)jTq2WW9eSveZrue2k%$2m7Zb{c4I?4mfa`d zWm;7%N0S4syUnbdH&3TOV}*VxaBZ)Q=aUon!#8y^qu=vC)#1^(wlmdZ-y#DAJj$Oc zvNXH|B}0z%@SuCAWOxt5;C@K(AQ{E&F%R6V&!&f9%q}a~3*Df|833`S%4=9Qy}^cG zn%IOxh0qT>(f7(bn0>8>f=Q!}wE{yyt6^Bf`41z?I$^8f^_CN?RjI)vtkz{90%IoD zxM1w?M;llprZv>d6S9YgN(#X-qLogUn_0f^>m9|CvTHIhabTWq&!&MwgZmV)%9~BE zgSSbABdVL=Y-rLs^wx71HtV>cq4s+dz4j3EgDG9RBEV*?MS<155TQyXulf#feKJ=X zv~dJ3R8WVcOG^w3S8Szml|kxbi)aO$rK>9jB`fvU60895F%GfO>cVL@%3XpZ7b`8i zO{z)<Id;c3jj?h;(Y$0y)&~jKjhdzD=DEyx&!!Er#1wX6!AIvvZq;bF8&T;y2vI-1 zHd_7b3{9zVKzs&rpwNC;Y0v=A#BZM`-_rt(W*C+{pWyu-p7VOFO9mDBFdmMK?;fjI zZBNtNxvB*s-#D`o`%#WV9t$3&`*!wjb^-%ngQehNqd;lzrG^o!>VMBSZx6l-m%ZT> z#p)@o?ExLLw@jrjf98964!s%IxngOUoX_$XhE`BxHgDB4i1eaKHSMHXS6hZF_dB}x z)~&pb=?<d#xK{%zLRZ7#mX;l3z`9Dy$UChCH+*k?Ky5{`OLvF34swHaZ01-C=C9s0 zS^MHJ%F#nd*(Pp30*oz==z+cs#$1|2c0cND(}YjBZN9#7tIeJ&`JJ^>#zxIDvf6C& zMe6s1nr%FH7ykuaTdq}PzuU`0Ss+1r8KbLS%E%((U)ORN@A~k<20m#4tSwn#VKez_ z;HzC4&KE_i`8&vO<0j{J#~NWZ2piSAz#|>~qTO*ehFhlHD3n(_dSb}hX~a&XbKb=U zaL2pNxgaj@hLBxF@zAz744!D41NhVoT>jEVgSw}N9-wF^{)f#ZKd)ew=h~sg-|7i( z4I#m!(g0`0&bU#UYK${&fUP+~wh%|z^0((>&42Z2osE+?2?H@aT1!!Bb{R)2X@&Qd zHVoD84TUKz37YyMayiSb48<kowz5Ai(@JahxlB7v&7T^&a{V!A4+#1?E}Q6&YvC_N zc(jm`UN%QMq>Z9MmTbhDa>kZP3fq<<cm7PF$eyBdb}5)0p|rY?&Gtyjmb`!(oP25` z#9z{5yUk1*)8-1(V#GZ<9fW(;)D=-r41p0gRUph6-ZK!KRcB+64U@l}Pgh6%z2CCc z{_Id<QL*EO>HOsbw@-{2@oz)w-=5NrU>S8y-5Z}6nTf5CXJ&&98YQ@9DXYS);>^%i z+O5`2eBX~%(j45rTCXj+VrMpAW%wzj?$V-`F5RGJOOoTrVi=-=2$K0Oq~o(n8FWrI zqgDyzsw;NL#(HA}r@hDp`+#<hoxMA)savOGyMM$+1qB;abB=~~ueqPS+89(jLG&XJ zB}hO_yCLh$c;2|O$sH{%W(7GS9c4?WZDG`Us=GY5HKp)!)Y>G5)zoogw{cro5u(sW z<3=4h=iX|yl!JGCkngXm+469S(6NHg+r<2!TrozwDGzNkdixftpM#Z&*2yT`!PXUn zY^bfKf!PErbRP~CmFrR=aO@}moED?!=>j5?39~1AFm_GD<U*Sr#U5R|VC?p46(ZFt z-mnbcIZfM_V2Lp0sUSE68x7~mxl{pEwMc=*M2NTvp*fJO0nW`eSV#!DI2sFrDL8iC zkAK+>s&N`1Mi*+>YjY$BCWy+Q_nuVFPPxcHlrcG^^v(2kk2)>YUE{Z;8f~CJ_8qWv zdCk2;Ct#4@loW>is2+!bS8mi=&CQ9F%`|24Wd<AFtiWNKli86biWu6n$hQ$q0E|DX zma1KZ7N>9;Y%7LrkvVA{j4>$4y|M;@#}NsrrmM~R)lb}#agE?K$E#Q2TtQ49lQ1KP zn-2Cb&tEaE4a0T7K<o3@0447p4|pbH1QgdNH~w5s&aneZHag%e-yVgCeoC`Lc#5X} zfA-#WyR9Qh7yMsO0oTwCsH}_a?&|Jg*-}vyW%IOdLsG7;Aw66Wu}Ps#0&D=3#Fl+t z;jA^kXRTTD7V|vw0yB>=-xraW$jjaUDav+r8(tQHy)z>tBO@XsBO@bMS*(fQz8JtN zc_L@HN@b+E#l1+BTRh0n<=FcD%_iN{D)f5frj$1bV>NT!2Uv2Js1qS+R4gyEj!v8X z*rZtnL&qztX*4~Lr1F>;m9nBT&vpLbra_S3oD_HNPayy%3NO;8)Nn#-El^ivV4)+d zK#=+e3QG^2It_Mg9w9!rIX#AB&0X(ki??jXdL64Cc){am-LKMiE8VLYLbOk~i<OB1 zhQSh{_P$1tq8#_Ju7gf>Q>;L$tyCSgYUzkzbs@&2nu`A~z1<cN`53!tRPeeOrxdDC zsx!XAGS^w^IA*#bXnuUVz}?i^X+<$|-ue16CV1J~$q<Tk^sQ~p6%D3#_%%c6%~e)X z9e5?v*Dd<%J_+iwGDJynQSqw!p*&nVnG!KmtZp&X37<5@`L~1|rx4EQ{H!voo3+Nu zgvr+{tG2~Gv1Mdj*0*wctOK?4W$7QGnmE`zo$>(Y%Xz~H;#ZeQu!!&80a8zE;)KXm z-DMz?Uo0pzd4y{sb*_andgGorxeCp+Ot~MLA~2i&NY3iK7`cTU;9R%{xoU2AYY#*K zaY&;421p{V7xUs;J~6a$6(S6O<dYe!p@<~N(|n*+(YRX1Eiz@qjK6}+xOGU@X6#T> zn5?oZNP?D2?-!SDtsNO&xN{$Q#VprHXSA$8I(C<wgBtCwW}$lbha9f-1l1)(yaKSc zg2<R=KTs-m-sC1v2_?j;S|nEnvx>e7s8Q9DyHi@jz0*PK6myOh)`Ct#TVsr+gDhqN zv*l1#bh>?;4RP8m;VGNEG1FF@GxDaYvLHy=`ap;ju}8`D3d4k8u)PZKC3ZF7)MxAK zC(Wdp$(=_s(=CI28>taW@TpX$zsylGwg3ma?_|n~A0!X~CY#6*tn1&O6^%#{t8afx zY8loql_2CI$nWR4a!&^;cPly*L9gB0hU=aA<R2qb$MER2*aD1)o?a|oOixcQkfuN_ z1u=N#b(>+3DQRk;B{O@RjwAG9VJj1KDP$76;vZ8^>W)Y^jUzLK`t#!2t1h}#W%hA| z{v&JxP%*AFNo8ZzratN$+0=BAj!O49qr|b0X@`a72x2)_W~l+a-}2u0=iD~WD!2=1 zQ`K&lM)hUVh?;|LRa+s>5_P7nR=PRXRq*XIPMvL+)q;p#ZJzoiS$2ia{3_XX8Q!b0 z>aTUC6_yMhv;WMVy?h#trly=9a=vS9w00gJs;D`mdLqp4jOnc!7SYtz=@i7bX9F_r zXspM&wp*!5<>6HC(_w2Hu9h*)|I!>>&M)kNk<R}TTwJ=E#P1VMd!%C={L>ZUUB@{s z{8C}<0LwAS3OKncEpa&AT<u(4l}<(HFa^1S>2l9-1?tV&0c`}V8gNykU?uag(uZmb zFd%Ml&RxEQSAI<G#w(E|sros$q{^-q6LPfuqUq?hSy|m(r{dOLE<g-n4U6$nJiiqA zlM|@BmKiA``3tVz+mas=m+GD`UX$baSQ!4jvOUavaSjcmSLRhQ+8)JW4S&W90;$Pj z8^Kp6dJpY>e<*25c^s|(%6&EI4MUyBr_<p=qTE-l@ens$HABrnyJ{VEYF??CjoEB? zxl#=`0IOGE7!T;QGn|~rRXR(FC44F75u~IViswPFkiQB0bhubFaxXXL`ym+A4Mc01 zSBT|h>>iFw$&z>hV8!LAam^yHr2@azHcEuC_|hil-AuV<ucfXy=5o&3CvM+svNFPr z?8xH&Q`bv;8->o7?L<+Sb0q|ojelnJoFuG-pqHAT8ATPml`wQN`VkT2rC*-=L|S?5 z=Mo`sg}(FL5!93l_eaKUMVu0S^AS<9LhDq!sI1P>Omy4LBd5y*VxYO2CGIHI0#U}} zH{6>&zc|%2*R3iv47Lh0CUmcUyzrPuj$2h>`f`F-t_Z1N+@51njw&08n5&zQ<iGZM zuUPMXJry%++TMz;Bwpoi36k!G9x6pKL40qPS%k$;q@(_Bbqq?L-6eRp_V@Z&la475 z5Kj<$>E&Q+L+LnJVr3GQjjg@9GLVwaG7l*>#t;+0Rqa$z%XQ_NbTIO9HI4x}ZueR^ ziPo>*LmPY(zP^|>N8>pz5kQhZY!&S44FpF?7<y#63OhMvtnyQlgN`a9IycFJ7MGOv z?Z*MU8qm5MD{)_YJLL5s$6D;+l|YuvNRYyi8K$zF@!LE&{6+S(M`zRG59`Gx)+j@G zLy8LWyW{^5nAqL^Ml!9;p3k-zV&oee&v!4*8#&eV{8$pM$l}BGJO{LNhF8v)+7B<r zyhI+v+jKUnJZ8i0m5(~uIy*;3*ox92<${IGidADgrIU8PAZti;Krs2F!gl<}sRG*t z$)EoG_!xUta$$_nj<z$uXmD(~!Ck|u4F;FHX?Y#(uJW=3?S0n!0+m0>YJ&y{9ciuY zwrh$OyXx>RyXFL`KFFaHo^wm((~~c%8vlfUOZ{3hO60W~E40dg1|IB2$46i_S;3dH zb={+pQly2GTE?p2IFyTHgh3*++yo+#1>4xhqmq_1$h3@IT}h4S9^MA>cMa!@=M$z) zb+*17O-|_s-o0|2UruF}{F4t9jc_>yH!y7Mf}^GrQC^YVt|k|46n`?FFP4%xDYSx0 zW4|CC8%GTJpUy4?X#(Mk_4UwA*)=g;ZQ+)yNjlpoHAV^}{!(dQW_eVM6@#`eY4X9; z&?akQ2^r@5nYA8qF<7K)#Z@e(tj3KQOc~tLjBeGJYf05^b15mRE39%1Q-IyZQU<VY zE3FNK;sU#-;8UF(%GG9!wO8SF0VXx3Lb)0k5z&Ydb(?TZDxPV9O>6M@2~#v>#Hj^P zTA&K3P1M(hkLZ?0XZ`H95KQGMe3qe`w_rBt+*FRHsKZyCfFg>^0FicRSfSnTeJOW{ zIpFvyw(IZ}{i#|6w-@Q#&IP%k7<+^Ma>jo;ey0~F)&`MP_(^$UrD{<TD2Unu-e?_% zjS!x?=SucRA|5HLhxGx>ilkV|%C^`@xPcbp6|Ij*TQn9&J2hx3vx109f*ks=f+>(x zS!zABvVUB4V-Rw^A7;1fPU0mWv~)L_mPP2x{v~Br>(EV1+bj2hS0T-@bR1PwUD=zK z(yR6B3Imn4Bhpnfx5{1``E-uX$SbJ|jCBhWB<Z)B3pKZ4(N^BUXn|B9Mr<M`<g?7> zx$X7_o!7Hs2z6GvF*C#){wY4O6I7Y)mPlT^+Zf49x7s6l!ETczFP$5LUh9jr=Y^r) z{DH0f)x)Zzk<bbb39ENc#*LJMtkg<Hfry*@IPqMZo|ZMW!0=sXf#78+a1k=gz9dv= zn@F<_A&?+~iw%j2%=V}x3wtp>kRJXkWTzWXy5N`&F#(CKUGE$#L}}qK`%$#eecrby zXyI^P4!HLf3{BjTvJ5W_a>Wa7n`=je@G%B?)Ac^p!K|H3y&DgZG|zgyK1=SNF$)D9 za9t(4Mjm=%<&n>Z3aW7xf@VF!ec6>&qNi`2D10k}TwuU4UCwJCG^Qz;+tIJ1E@+!E zC1*y6UCdbM5ZbcaIxFbJSm%p4s~O5)sUg=$*t=X`KgK;Qd^&qGJROkY@QpzHD+VHm zD#gI@=uKk4wqdGLn!9L_<@hCP{!<XQK7|*mas$nl(?AOnAzsM0nzBgz6$#dA1ju|| zF#=ZXi1miJ;a$xiGFFDu(3_QPk*vmz86p|ntN25bs@*0?Qnc0nNJ@1ZA4$<p%Ofdi z%#P&wRcwx=;xB1%B#1<7W5#%{F1;YiQ%Z@6@D$gZ>HfbcpAPY+z^zF|)WPid;@cO8 z+t2n6pKd>^%PK2$+FvZdkA<q=BWfL>3ss=d+_Yx8IDB{YE{f3+y14PL9e8wI?CVi- zT~t#hL#+dJcNZ~dgzGxQY7C=uHFMEdyFMbhov0A;^k*~>eVg@O#EHQV3ICeee2Kkh z42&fuqh*+hs5c7*(ceTA9wq8374`qDBI=p)7qIKKX{d<%e;Wq9*JeTKZa?c15?aiV zM9x}Qk@&E#W&BNOYU5wKn-aZ!t)_lkrZlro+D4b6`WUy3am)oowov-{mMMw$<{Bk= z@UU%_R7~0F%oBeV3zP)@jd)5c5TmR_OxA{eZ<_??af2bx9UPtw&yndeJ?P<%b}UfP zALPhvMt@9$MX21b8+@msA1-tWfmp$lFG%t*ff)kVC|{MqBKcF2MI#gPH_^##*iu6a z<M9V<3vua}63sm{rIgZ2<@45KGj^|$*dWJ%BQ3BLUV0xm$_2)J-TOR_;+hN<$BeZN zwI&*<z*Ck47;C(JJw9!MYh0^WHxAcu-P}0<3jmp>eMC#x63sUarKnUv)!3w%T31F? zYRPWgXP-q_k!?MrNf9mJsD1J3)E-W9zUJDA)>k;klTn#7#3$}(DxF--J2+FlyIRIq zvPRsw?_L%TYlm0vJ&cH_Eu1ke-*-24JT}+0OOf$Z)U&up(`D%B0n_wY<yDT(Dj9y& z$2MEeV0O?(c)ND?4wP~4gmWsxOfA~Nh0bwRIg)ov-16>yE95KlLR`93+7y?zf6npO z(+AhcThfMb^+;wRUQ`P$T+LTe%=k-1&0|d!X^vc)d>WaAe^-iQ6*<w02Fyo9mbfz} zCecJ!!c!r97>e%BlB<nihw?s%zJI5?^BV{-^ShHTQRhh5%YeW2_9uJ16tfTRty$-R z(@e3uiBFQ>*keTxk+XMp`TYFAwex%?&Xk7W$8xCjsF@!3La`^)lQHs(FDvGtZA?Zh zfkU|#d3AG9J0YY;ckZ7y$BQJ`q=W7@jwxv5-k*o(<K7?Yi5QQD6Scrz%#ed|hRAdO z1!){laoGXRQZU(>zKqXW^jkLVc;K6-NZ9?fIeXP0U2_GPo#ruzEW?;LcxyWOf&Phj zVXLD-TBuQc(t@e17~SkxMYDj@GLDAVQ$@83E%HW0^I!xPQ<`@nuKbE)x#=SA2L4N= zM%<H$&sr$73jQ#b<b;F)X2;SS$j9zx_FiB&%Ms>#gabq))5OOuxXNf&D=_Bjg;<W| zQA|JIL~WIhprQ~P_X#gs8iFW4YVeMkI5&wr6+0fXnl-7{YE*!ND;8w}BsT9z5+B^^ zAv-0GsniI?-8Vjur6o;fwyIk~H`UrD;YcRW9$71<$Ku7VVG%W0N^kzUcdrKpv5;$4 z!V-xuBC4@Vt28ERx<HaAeO}2^Ip|ZNR4(qsq0TUTliDW<ZB*}NNSBP#iIM53S@ZoA z2^noX)oHES$z2G8%e;%(ZzSuUO;RB5GD+^&OtUZ@Ks~(~<1CXLtC4yGI8o{VbBH7r z7g*y-9@>x+PzSrJm$iR2bRcTW(5d0G%AiK<1T#nD`8K*Oa-PEt4A9X9k8b3Qpzl+T z@(3OePv<TmBuoe@BA78<p}C~k-T&S_uTT1;=GDasHqTnF79KV8quKbJQ@<psFu65y zHlsBabL`E9xh8Tw2_jxf`#dL;ri19sF;7eu$AkW-^WNao`K>;b7op%!2}4A|80UBH zE55JdbV>5@19K?$L=TM9i_rqpo8kf7cg^h8bUt2OK55=Gr|awJDh`*X%|yn?NmE@> z3xP;9v&zzfY+V;I%ZQ}qdxlmKpb%~`e$zy7A5O0vL4kO~)Pho|To_y<*K2=Q^ZR6a z2;`TA`5~fjE|7h}rGAEHWAc%4$4#=rFF3`>dDydKK&m%<g-oL)`Tz9kh}@Y_d@KhK zqb?TSBm2Pxr1@uz1o@W%Ux%U&lc&N~B3H^6FejuJ0juFDiy2NLR#6)3+~nI=<TTw$ z9pc?y|LcD5u68yDdwm}82t>*8PZ%zwOn^ZcpPiphN6nzmpmCC1h-oIjP^&8BVGN<K zF>FYaHR0d!+{#U8FCS6mvCv1Qq_gI(!1w^$1!*-U7U>kf`RT=WUHMPTlzzC$baDsI z+r{M_ogticNSiR7D)NPT^KN*A>`P+hkM#<xXU*F~C}@lhj{9m#ceV1=!d&k?AdLiU zlu<@sO;6u6BbhN-lB(EG=JINbP4Ufu@q6;cz%@g^23tutFv@67nV&0dxp>!Hxw1I= zu$Z1s-*Rz!#Q9wN!4TQL+T{Jb8kx@xLb-n!$BD(*f;XaY{G-icxB|p3Qr3(L;bS4E zp&{E#=-9RhviR4mE}WBgR#!pw!YNfHStM7!R<Io6oe|Oc^j(!REGcW5ehNRxs75<W zEmtmGXBS5cTp?8;s*#KOR$UClr2s<|ESNY4R3oISP|53$F3!#_4Wx*w<H-2Hbj=XX zlb(W?+icDwLZ=Bj!R9z^9H<2GsS!61M@Ce{z#r`$H3!?H2A2ErSmY#jTj^t%j3=?F z9pur*?1V{>B4wz^A>-Vuqvz=y^aolmiif)m-A~im`Z{)a@a-`IYXz7n4K$&?6L!Ef zgy+!eeqar1;!~Y0fJ<u;_7`V-PA<;SPrYkGDp=$v(-{KEc^F7xJF1rXi36Nxz6N?S zYo;@-oFeH%DY(T73M73rNC-<;5%E#|xw?wRhAQ0A<z#p^KH6y(7c<G?w)GC_+?Y3I zr#ZnH=-H)^^pO@*bhW>gD)YzFnbQC@0a3-Hri*KL3BVkCsw&k&tJSB=$2NhS9_P~; zu5EQ0J*-$4lF!EY0T)$PseBW~j=%T`3Yp?ZMX@TL&>yTq*0u<XP?mfQeyEK)9&=O; zgD6(cW#UCzach|deT{4PI-VpGP0Yrk$P;>`TKvXAb-P^_OIYib@NGAD5ONs{z@7UP zL~K2_7ktA^*u`;DX>g-}Xnk=Vllq33B5nF+M>2ic-GgUX8A`esIofDTkqMz^v12_( z@`9YDU1t)6su)jS{Tp<jj-8pWABY}Tp5e=Kn!w_os{VPXzkHfR;*``6#y)(*NRKfy zC}plg--U=_wF5Ax#wQaTMxJ8kmK_EXK28q{7?7`cf5Wrp?M6}dJ0x?GIbdUNZ)f}A z%e}3`XB$tq^5Lm8(xwWnSh+cY2-PQz=abV*SI9bW$<IowJ=oO9g(=Hz&buWA$y}z; zQv~0rSD3?w*(efCp!&<hM4{S>5qk18tseEf>5uDxX!JPEy2WIeb@JgQHbil6HstZw z2D29fhvGCP@Pzj;qt4soiEhK`e|pNxJ0Nckm^!Ziu0lgPr3f@*He$n%2;+k9%@&>| z2<1>c09eZ(Ht#T*xmX#&S0^J{0OWLAab7UEwy6J><-=enK=xx)jW$(T`Fpt1mjaKj zj+IzQr^JD4H<3vo`=+yNM91y_7Rcc8kpRo}Cu3OO8UBrm);{HTuPX>F<yc>`UN_Wp zd{aa{h3XkvDL6CFlwH(g5<cj{UFy2I8heDj%ssMXdCq>;oK4>}&k)S&v*L%jrc_zh zNcQ~_9*G)OEE}7l3|l3lQ`x>xLR6Dv!t=zmb;`j=DHngmZ_2m1k!|_5eL0ikCa}D< zmcKMeb1HK)QOBg`<vOmG?%XHKLFw*ICCh+HkbPg*&(4<En?9UgOh#P5=rKOtkJQO( zj>rbz&KdY)Vr=kSHh7{e$}K6-Mx|cjlB%@R_xZ?iSX~-6YizeP(_v(g1(x#2-v*x$ z%Qz1F#m}#kUx-<X>l!%PDY>7Uw{yL?Hbly`Ijlm5k4H_oYs0-`+AdMz!k{hYT?fY- z;UO`E2h(;tR#LxlZ1nQ}Od77jv3|IO4Wh~yL)yP13klz-md=aj<~aw}SqdIPUPWU# zzsNOWV4|+cj)h8v@N1j!N>bPH{xwW|C9c#KSOvku_Y5vd*lbj1&#<Fmyr5?Bq+YL< zi7U*H(c?LUyED@ru|==2GPgs5QD^0x*|-P^wXe_135dLn-x%6kp1*d6CIe)nS1?HS ze!l;Cwn7cFYgUqw+H_t!5Ln*lh=xODd$kCqGP){Spz3sv08|7sbU9FDPke!{bEen3 zMNIKFJ&YYWQ_3!0Y-6?BME*){Qr|yE3tdtZS-A_^qLHq~G6T%IHvy`Xq+J620dxhC zYZT$E_(|RA!fwI>$VkxYkGK|Hy;jW{F?3Gp$^jIV16o0I%4(0E6wK0gnN9Xuw!FRy z?kyDaJqY-S@yf|18~j!R<^}i5J}OM*J#?$2&6OEEL$0$;cCB>ZuZ}ioA%l^kor(&n z8@9G<412>i7No6bwFaa!I@{S{Jox1t2&-Xd%#KLR=<NL)+^Q8WP)iGOQL+ysSy8tq zFDE}trf(<CpY*JGoAXFyM>9vL&aIF{6zYzPZprz;(3NsUYt6Mw#()y%@VF;Gi+z!= zrk4s!C(1v=+T@C!H<C5qvq*`4&E1MNrs&wQP!{AkckEWc5<v-0IX)Pm+-oE2@WZii zeA9-Ga3jm8uUvkr%FkF)Av)Jafa|;(5;X508sxWTGxfXVBIBX)uT!sa>%dK`sm}H_ zqPp=<3=Aty-!`Z4b=$iowkOBUY=*r>Bc|GIOcM_KO0UZn1IAtZ3_lrA5kwe=7q8DB zO^;|MALYBKSSNb@prx!|L72o(p&m$!bIId54ZFILrUs=`?0RMPp$x_ctFUOarwA+4 z`B4}$;z!N$;YrRYsof1~k^6y|<=f#&JKL&E`KBmaZ9BbWqcxJk-RWoQM5=k7t6Oi8 zrUGo#91nfufWz^TKC%PKqJpI_z9NFI_%(4ufHICGlAaE;s?Z5uTGU8&$QCY94Dy=# z$cHb;>$*}}^UXrqOww^ZByZ$}G|7k=M@C@8ZpU(hZJWdFszw~!t8U`N_DYb;rep$j z-Bd8eiMQkNDMH<-km-_Ecaq7r5g*1_S`8zi(&pS!3#L^eNMPD2=H&#DTx_xwzO;@L zzlg-0`w`!HTb7XV1R)^`Ue2FceBUQQ`5bnyvqCM2zI23e0Wi{6cZW)31YsJ(L~)?l zf1Nii>WD;b2b+_^k9Cr0D7N6Srgn;LC~jJ6**R4xeZ?lap076U5|cObfrb%E9#~Bj zMeq>>X2&n0t#e}hjoHzRStNL1tB`;01E?k{yc`cM;9|7e%A|ZY{J~S=zaAA|PW*JM z^h6|;J0NVv(G%89osnFLekxA}C`bmq{Ya1aK^7eBS%n3<PYNhYvD{9GD_wc4Zc9+I zZLCfAiNO$g`Gz^)0`4}#(zySqIYLaIk60HB6E(7uXi)oAR-1qpgSdPE^|fQAb<Cn} z5zLZM>1qk;>m`xWqDvx6*y-tM471F_ysGi7=<(IUs};UqO(Fa%1i1w_M$mv{S3AYj zvVPtSR=QMXd)LD(OsqoLS|IQ;t?j~H5rj9H!;(MyZaPL-rbZ`~BobCIl1w*b98XKL zfLT}z(KyJDA;h&qI;ToIYG=uo19{7@A7mw^hEQr)w9~+vwXJ+c*)sUZ#OY$TV~;yy z;+4lLh4W~5#h#}RT?4H(^SPEt^25G<va~i0b_H$1-F3X8c(?kE*-m{4#5epz1*gCD z-(<w8=$3U-Mw{%xn0LjOBH?4NBdXxG8jt%~E*dQs9bpSUSF)8>k+8KsxZ_KM-`QG9 z!0P!R7W*)^R3+2OVoRBGN&S^rbO{XET#<0$Uk|%3MH$AtXIfkKzb5MjeIHqxf_K%E z939gUX<hCTm4`f*Pf0T|MRm=AV9*<!`n2;atOEVHhp5{!tJoKa9snPrtCI(O0Ddj# zi$+*77;$nG4Y&aLXvq4~*7#cP8wj<Gcfdch>&un>1LrPCxi*ng<@qs6Jp{hVm@rD} zU)xLI;fedf|EL4c)tp1H&Eog?=VX_;uHI5QjRjUx$wD>{F~@qo?&D^0^txD`C2wPn zE-CB)wWK^ecLO3tDQk`)kJ(N$dM>`BIyd@tS^}bVspd;Xc9q4D*jrGkz6bI3U@gNT zMA*yV$5~(ayaxVyi#8P-!HZ|KxdzsZ2YMtavWbwaFrz#Nln4nA{AD&?@BoaEx@tKu z0kG2yM>zmxn)56vDyX{2(EQ;9TMm8&n&}%~AdWCBAgL1cjV}^mbm<vi`f7S6)G~U; zKf9KmIZApFbs}{PKc2{`p7Bk(!=WJDhv^v)FCH=n$U5*3)HAUqGwNAODlw&kakP-A zov(1<7eQJo+Igan``xO<v`p^i!mTB%kRKf>1~p&<!g8Y*8}?5Av^1Abe739ECcZ{; zp#@s2XE@PJkdCReh)5xYy0%aAiB>QRM<J|Adgh=Y8=)hWlfg=2zUM~+&N1+U|Gq&! z1l}lSQKLlwo=+2s{R{*74Cy`I!0u9AAei6GaB2dfs8oL&RL2;0P%E0;C+7C|*phBI z1dRP8961e%+H0EGmsw3C>z+>|+lRj9RW<N?)f3A8@~>xOqi*B%w+ynoEYH8%J$3@& zy!^>pz|Y8NIC-5bQC15yqPgK~M^R&uC~omvz}Qh()J8rCi95Yx&|)_A--b;zilp29 z*@rC-Lm0T9e)rXb^VjFU``t*gbs}p%C%~h{;es>R*I%IEgigrw;ZeiOM6lwY9BfR6 zr<XVe{iomk4x64m1ZuzykKYHfX|lUGTm0#Fvbmz!Yk$|n-(#d8#-<5U?}{U{N7q5a z<RV+|#)}tI<}y~XvAZ&FhBFjA(=^8+ZLdqqv<5RxK`1xp6`x+vvobl6Bf-^~du@J% zBcob7=ib9ZnR0k!Z$K1!vANq7AAHgn$`bIcOdGjHen6W78Gb~G^u-85ibNz;JabfG zcLZw6Bo#=e6s3rJan>Nftkrg~Y+68;yADZ@vz}(H*$&(Y!#O^rGCANsfBK!US5H|h zPOg~0dAUIgXN8>f1!s-tkDA8a?vS(91GNzA3^ktUB57xQ@_Mn0%%HM=gyjzH=sKIm zn1&LK9Gdo(<5^(ES1aPAwoQap#A#UGCy|(Jg9N$VbDhV795vfflq2*?DL!t08xd;} z9YupeVMmDca6;3GmelLQyO6;GoOFxL=U^f=yReBJtl|=1D<+9tQfBRyA4jtW>Thp) zE*UvRNO}E7T@o3R#J2;DM)I*g^y29EFd-0qr(o(Wk`Y#JjfvD&Yb>P2#+1;^x*AFR z6D*ipJy!d~AuUXsNE5|!6&7;7D){Yd4AA~Ij%<z4q3_DoLfxR8-m6q&SZu$zbHKh= z7$raxN(N2jyf>=7V&YdSrrVlkMAni1`$QH%WNWTsSKus9KBp-{W?5~(!A2@upOLkb z5SY@oa|&AxBP6n#xRpv>P`Zd$!+_M#mietNX`T#uyHP<TQXK}X*50!~tn0QKA^5)D z<op{wVh4|1R{QwqPih;wsX9JC@H=weBiC9GMkSaN+8|b5UN(d^{ONbFDVy0b4cBdc zgZ(L{;A3RgoX##QMuB>oSMUSnd0^*m=Jn3%l|ZN{L}P^<(hUgaOqm#1eJA_h!w&?D zwS1q0WSFM&a-m8~vhpQ}P+_vY3q+hx7N?i0TbfbqOx|irk)r-7Q;v>aP7wDyMuMz% zID)+Zd!O^sk0lTOs1sa;k>t%!LI7Wl8<@<Mcl1Lxn!Z3}!yk*b*$|f3P6`}=dd6{` zxCf<0E!^o$RvAp%uD9jtB&P3%aXV}1_0t?^j4AQ6d1x5Vw9COzi>o*PN~l+GFlz39 zAFgt$@@873&TMI!R_=1e9)ytzV#@=P)5+!8^kQDp9o4jZ&MKWe9?#|rF@P{|x)?+m zxrQY4rHe~bbYsbOeoSkOCmzYjJ+6eJI6Q{t!H(q&N{2;=o#d{E72LuB66pr95_Uj& z+hZLU(G=J)I>X%%bX2(zbIj8v$Yh!Jr{8_3`cKwbllcWsoIIOOo`L&^ug0h2#pRCV z1*|AnuH_SCQXvV8`nXuk*En14?L~!=r~40Z&ylbm`C6@R(K*pJqcgyY4Po_O0h)Fz z+mf;?t0iOQoCtx9Yi+eGlf?S~zOeocvn;7WlG2slc(cJQ3%ru+(eH5c4g$7hhs0UE zD~?Gg^@(t$k78VjR+QTB6$a2q4elD*Jb6A;ti+AxOr?jj=@0Ow=^tmTq;?N32Wv1@ zPL3|OCrpWn6AlNQH-?xy;gqw$#3T2DS4sdRrNn(tOU0S(Aby2{k-JT_Xc%=N)Ztk( zJIUNG)JmSbvvwnkdLSU14wsizOf9}IhVSqcN4Xxqe73o_{ruVC-d|sA9qzu^+T4Ep z*X?KD9B%#V-qy2Sd9(2i*trk4CRVVMy9<lgUEhz0?InDK5>vvQzkMB1w*uBCpKk4a z`~1;$8-xXmJGidU-0t4S-uC9<hqbC}cQsR1YTMJLXH`@fCpAZezgl!o7&B^;@Wac8 z8OG3%vxB(2ELCB|87a0iv6QuB;54+ymHZMAKIdS-O!hM#Ua}pzX3xpR`nvcK8Q`m~ z(rSfLNS4&wZDw!A$kc@fhbIHBrq|b3<K#9>Y7kdpnXACN0w=bC4F=wzj|7l%>)nef zQro^dz1%)Khxzc>nar{`G4I<W*<mN#sGRyZro>1z=lc4Ko#!vMcJ{Wnb`Lk7Z0znH z?rc4NvZYESQ5tQ1=!C8`|0tjz{T2CrqbAtd+IzX<^xlW#?SZFb{Bha{oZb#z&&XoE zqp8<(m!9r@hSzp0cZuL{yv3?1sP`N$^%5m~*&SR6T5y=%xj)zV*Pwv(L|ORh{91%u zxExc><(1<H84m~BCx{KlRGduveuwTr4ymV;{bO8?eZYV85PAA?_x1GR6ej)RTVyM0 z5d6hk2{12KjR5Q>pB^H&@VxpqCLON6)?10PR}wdyJsZytMFEtL)t8w)cemZ7TS7{t zkx)as-MLPQ)TtXN=y;$W2in@Jv~R4Br49jS^`|q?tyWul`<4ECHh$NP?$-m4*5r;_ z?V9wg6P^;wEhkdwE#Q%>9Gs<)A6}9sb$n&ZcyjWi;EJ5EZA&l<uMR0Vy^F1|S;K1! zUQW)25|(Mlv(jr_#@SJTze6bQMk969C8X|^WUW@}q9^=n1?@5*CDGDKu6W&rWNoy_ zs}kPf_%bXTwcFum!7|}ZiE;In_eXUNNQ;RWrG_?Q{H44=NpLoo;><$&tte3Rf@O<` zMYXbvtXDqmte96R3U^V4mAl?6Fr7E7QgJI$%h8<-f|c%;@cW8uTTAD%b>|f!K;)08 zOOlEMUk^1pWJJdFZs0l_BSaWB@q8fi=izz=o8rC!0TI|R0ql$6pu6|(Yme*eiEWWb zH(A<w0IOW$(BPJ2-h?4keXq17Lta!h4u?^f2bOsZCnz-(Ar!Xpos8mUi;9sHL5Z*` z8t4-xvb*(rjMa!X<Sz@TqjkIYcL*q9{AwhHxFKVQM9Ste$v<oqh3G+y9bhrqT$p<m zAd-j)1&eU+Hh_7okRyFE0=UjdFi||bX&)5>y4{fJLig=fvaz#>13$7eoOP~d@v*E+ z^Is?A{@OTCZO%H;o|9j-^RaxPgoByriMHQAA1+?^zpoOHHP$ku!4Rcct5o_h0`B(_ z%QYXKH2v>;4{&jc?Ekx=-R~n_#a(JueeF7tatYDr=PI=K<;RdaLnJZ&I;bS=;2&tv z;prxFyvV&Z?IXC4C8sN>{rS9(dI|Tl&z6*2wNX*`4u@`#q~9lwAYITY9V^g?eQHr& zWbXaG!l5D)5fgU^)omUX?uldnb^<<y6B6W306)RAWq?!Rvd!_kuvZvP+=&#J)^klI zIz0zc6Eky>a9-U1ZpW<k<f^aAzt_<;zJ9&w@~I-yqIl*V{1SXDfu59d)R3H2|0X$P zRr9~V^EPElbZf-@D3ibk=rHL+yBvxP=KbjEGy7e4AMlO;l*8rUm;q~-`PNy(LV@bg zRq~)iIF~{q#Kr5`^sTs5cUyb`A1295#X)CFu;BjMztv`8-);U~iGTs%tsZVf5`ED{ zB~$!soS^%B83PcHrJbr+E3D@~?JUy%<`vZ84|QfPD|KqBoaKL2<_B$*7V2^IbKJW| z>$;;<A!k@2a0Ju$t764+IB!J*_s;#J;Uw7O_4IOVD6#G(m0!5qSuFmZv+jDo|8)L) z+%-0tOc%XZNVzGt`{;I$TZ7HJqtlB~LtThVps}Zh1C@8>B5y?nYsaT*Bm$8-f4SwT z#95RjQgRS)U%oQgriFb$1_(vKKgF+Zn$i_qds-Et>Rje9`MQnm(sweM$<Lfg#2G<? z&}`9#U0j9SxgU~mu*kp<8R$fVNuK3|GJ2_8C#o-PKQvlj7sQ!)1qjkp9c5vJyn`GB zet7M>H=U#)jDC`)pJl$+(kw5WQ&y740-?1kPA$3wk>!fl5s?eKu()gCH5C&D*48be z>x5gz7k9PEUm5nUIV5E#ktkO+pw&VdHtDDS-j|U<`P_d}-saQvN&1U70*(Vqk>t_` zvCQ}Et9<?yg_Bn9OtTr-d6a-%iT9IcDkHWM<F_DCmjjY*6<KHlx~gcfovVt6*15Kb zNc9^M6T(_mR9N;};=+m_CNhMuOl(*t6%9V&r+k_|Nq^;BQ#goMVU4S>#5J`g6Gwfh zrd(y{uRP?}AL_0lP6sLeir-Z6adsEa@S$!Mx;evMDHKPzzI>7auD;4=5}{w0`(?i$ z91TDI*z5GvBz~vrn#+?Xoi-u?$m_(YzLrbi_rAhJQSG9^_<dro68b6_xM7f4QEr5i z`F;>g&TX|SdooS+&W8&I+4nw$Q8|Z^i9kC>r!J<w=@9~Jd!LT*3SRq*g+4&!s6M0Z zxvIBQoZI8$OBh{jtc5@f<me{J(gKn!?Tg-nUVkw@Yx;;$k}q@G$t|FRcdCy#>J<vL zHqn8;dhOc5tMd)?6ifRS4wk<~?xXGC*B$iLpu4NgY$ou?eCY-b&f7;pMDx1gKS&Fq zL0aqvoa&>>=1j_pHz&Yk>U?XB7ESA5CHu+hA9kky@(nsR=075*Srr*tAC;Z<*jK9y zAm7H3@MYP=in<97j_#6%OT`_s1Tc$pg##BN??L!vEo{qG6&o>LS#h-vPSCV<(y@_` zubbG>-xO4@rUQQw1;tVKpHf5$2Y9R82Y${?01sSLml_^1gsEkw(WzJk1X?-Sp{C|+ z6%sbqt^)YB>?5CEoA2KuZxFpfE`SD(A9!V`12GND1U~-=^Kb{FM8)Dab(hXrVMzOC zq9IZEi40(MRLiDNhaaugsQG0G_@}~hOZg)Hir<_QtsWJv{Y!R{H6Shvgz(ljxLQpH z=W@gEB*Z`w{OQ9E7CCfW5aXfSHadLu<(L2X$3GtZ{qe!G2KL^;%f<L~ey}S>po=*y zc9_IQ%|ZglXXmF#=dMp7bvQ=wVrT1{!`-dD!{<AXwsva4f=`-vh&<OBC^-(W_xxYB zo*n+>+wHxr-4`31Td*>|P%2c4Z9RL0_s&05dB6Q=>)GD+<L#{-6#M&DFq_YxKHWfx ze`qa%80Tk)FE(}n?%S>1?Ohc9V{75fC(n1cveN(9TKYL461{(NCEPI$CFGNhhg(nB z+P+4$m(;o6>+czI!Gg9Wg+M5R11;GbOBxg~!3ik@M;jD5nx35vdxP7zGDszD1gHFQ zR;xlJsa8DC>N#?06C|DYkS4?b-NuubTZhjdKL!(mdM-2}DIzCaLWvrWJ=uO{U^p(b zabpZdwa4Tuag`@nssRCRv*`HR`c9RYQ@1Mo=?MHm;*@^M!br2DZws7invDOWae<Fe zE0gn!MO%tIF(TFRJ!=%jmTZ>6Xm=fPzfT&Rg~E~09jR?yrcqI@>14?DjZ-S?>+)!W zS-1s1s5^_r?M!i)iD*qaNLWd<7guC>=0=Y*Rb2D<=9$t@zUL+hhNAapj-i#9KL911 zTJb|kko@Swudz~?fT{{_zyEY&=U+VkX*rhUP-vp=eOK^vu2~5de~5DC_158FtMn{e zY#_fm)@-M4+eFf{j5K6JZQ^UTr*ZW@Oi8a^Uea>XvwkL*z_i}Ed-r-E2hO74&j`VD z@L7O9^kOjcB0{3V92^mJg5ere!O^!?d^B*<BJBoGAtD(T>EMJugaBe=>B;a_bIOs_ zL6H<3GVMu)_W>b?hPI%pSnqmu<EJPU34U_nV1|zxc-$5teiq^C&?s@XeX>&_wBG)~ z!Mo4@XZ-W!=ih(!S^suxJ+Jx)2M4nUpB)@bY|TG>Hh8dpaPWu0gHP_=5?~KLyY=8l zJh=z;-U>6FG{hLd380O=y)7J_i7(p$#M$I_M>F}<!L7yq!NH)TN-=G?I(cu%jc=OS zCDaaB5u3F*fYE#V8o3B12^%&wakm*53w-$+-0320IVSknVTtq5VE=zRIG7(CfR2Oj zZzW@5<UH!7FzQrHqHEB-zw^wHi@SdgE!W4G^?P@Df?b_~cYFO?gFjFS>2m?bhwhvu zaV~_a|KAD28Eu39kC0;zaDEGK`u}}nK6U_pm4>G`N^9qIAD%W1mCV-Yq}iLEobXVE zJ+R9yWjURLqc_~9pS8UHfWtfDUg<KCgC_DpMOk5}#goH-zd-hZ>_s?x!yW}FP%Vd8 zYn~z#OU=;Mg+(P}fND>7s^mviQ0Zz!)d1#5uLnhm^>!MkxRF0+I_XW15!4idAau3s zY9<O;&&(!xW1y_J*{+0Ib+Y&mJmq`{uy(R=2l#2k0@leSl?>cABVoIgF(W!`%DMY2 z1QQ`wv}hnD3p-P%hCpje#w;)QZ&@og2+N`0&$S2p8H=RDn?@u@w1hTo(boo8*r~vt z#Ng98mj(VUzNHjP`jIsiW}B$0R_NK)0_h@XOaO{n@6{!DRbGeYTL*!qDnXuJDlq>~ z7RQ4=w`L{+5?e7{#BlH;8KQTk%5E%Qi!vp`qHR(!$Rg~%sPV+=xQB`2c8`5Zhc#dp z`;tl)f3>$YU(YFZ)z;#;dRcd(tO)6AYcslHa&BX9>RDkr6Ym{%)3kpNR#IU0bOk3C zoiyy(D<nE+)R*%s+60ffxhHR5=xlD^h8-pIkhG>&45#?sC!D($MXdFnS`n)z#G!46 zW^j&)D-Q#sgK5;0*f!#EM5Hy#FRr7l=s`3?m<dB<xl)>QixZiB5H$OCI{Se}8~5DY zINbqJxKl~V8@aR{*Z@6dB;Kg^eAh#{1M3S*z(6pvrTThZEFLt!{+4*45TKWKGOuA~ z-oZZX(;19x$Oyl2lM;XVGpS`(w1Pv8JXit7DSfaX&4Gb$1CHP9Y5x`)OrK5q^bc1W z$Z+5=?W)tyt<Rlv(ovxWNauZ5PRg#tDdg`~){tmEZ?j>r=zXQg`A4|TBM9K_-aZZ5 z*Puvg4z90{=k{q4go)gz4yYt4Cs^MIvqJiJyi`n&frBL-!NMsIF#78PFzNh>g^tZc z!*fZnn3G2d&aF7vy{@}5a#<r8Cq&UDZ~8`JpQALyl76IPNa@eHX83P&e|CO}SDOVf zboR8pUq+CPZsx##+|SAkcN=Guz4Df9`Iv*7Jq-&0n<s4BOeH!4Rg8Ulx!6%xfaB{u zT;6?QBuEF^PMfS>o~ce}NuOUxRgO$;mBZtN6sE8Ohis?c_N@X-moOz>UhOFkDVCYv z^a^LaZNL2a*e-lO^qjVBkMooL9YrxXP?Ly@gmA3fg{T5kna;gs<H>k29-h*(Oygsv zNFrsjo$86-GD<M>=-OUtC^yhge7<796rN!C+2OirM%r^7`K)Gi!IUxI%YqfDy}hh@ zb6XlImVgv3(e;TfFJ;XtP@+S8oSW%$C_;mu2WqNiqODh1mk<GdbaGKgbXco7#&A(( z8clWvOlepR!vP1FtV6hHgMG-&YpT%ob)-eZUSCFm$c@^v{#$oa^Ie=ie0e3WIj@@1 ztG4>_RpY3(kWq%#EemR9tp~JLVWCX!>K!EjAN^T!VKSoa0BWs=s(Rwn_2FtT+>N1? zzSZHBW7B=OsRGzFX@;Y0Ds85<i5gXwfsdf$Hw3DU|NTPJQ?9NhYF%4JPgF(L4c-Sy zbyqJWj?~T(CC%#s8Hq$bZq;10s9TiH&w$n%Y^zKb)y<LbzAaHCZ9P!%UQ6P9*TDp5 zys-4ai?9GnbrL|OBrXYAn*pLyy$M_rXv@%1BDVSoujWxBvy?slq>SuR3U<g}bq4L^ zDRxB8z;~*cRoH!{W}+H42exx&@H?qk_lu~MMOA|E-V9n<%Dgm5BwTnri!)ZPRhR7x zX+mr|k%Is4GgLC9%3cGb%sT9^+)iFmP+q|#m2lS#scXYByKIpot1|~wh+T_ylF~?b zG%?zzgnT4(OT!Mp)?_iGI`hW^wJteB)^fsHG6uGi=_O^45Z)&aEk0HC=g+Dea8)7m zH9p#e#RmBKrA<-dP*(?h!%t)!{jL9AXEyZp%ZypY6fJy^YHeRTZVCJu%MSViGHL0U zk39@?t^Er+*RTxKg%82$BCR-mYgoolutpF(WdGOlr!UTCf*W_lhU+~f3|k-BTj`<L z&nka^6{_VhZ2<9=@T$o<GrJIoAyK_&t=4QHTd@khN+(NJ?QHP+e3&-$6HdG%J78~+ z_|hQSxu%mrXt>MZ*B)I?_1H-K=A4RG46#**LwlYp9FHn#ks5c72l24R0C?=9)!Lmc zPFil%3+i2!>TqVNaZ<N^w_jyD3psA_3QF*yz{>&*y*m$K?c2u1SaHMArDtLo1=#Ig z8d;EsFM8-IOfLFa#VPkYwx{LuK#VxKO^XVa>MS(frJ72+<~)TyedY2#d1c`6uhrMU z3S?BOAi1(<QjC@o-;ld6p<;MiX|cs8nG-^FWlEf=>zouMjYh?ojHT!T6`Be*tW<fd zEvY)N%;4058NyBiBGB(yHo)S;6k<xv_gWuF`pphSH7Ca^2np2pEAf8jf(D+6fUSsR zLjF}Sbey=1X3r7LGgE}TFs+DD$57s25@xfFQ*ML2;7zHa1mgRUS9&z>g(oda5CI%1 zS-fV!EeDULM^CU3trX7P<97Q%>1$$OB)~L6Xpy~GfZ`B;X@e9XXfA{!uCLq1e56g7 zZlqwzSua8dWDtEv-?wmn-uwqnV_DwpJ%l(Pe8bT3@zKFvgL5OiV-XLZ4sq3<jniu_ zDOaLY%CbVXTc#^LxC#!Nces@cQ$i9qr?1^j8<jWn*W+W{w41!C#rDBch{s<-R9<o@ zCOkdGKKoe)Gi>T5ErFSk8+15Z%nupwkk?tv7E@m81tUN-WXDy&ydhAi*24R^59$tv zVsUv#8CdS_s!Kz-?Mivm>So#iLQ!}58ICYWOhJoLfxcFzXaeaxPa(HQutRkOI_vsD zXs@2)FSn@G>97E^ZJdsW=!9@CWiKa2`yS`3%k$xUPKI?b>YYik>7*u>w)4fy>yb3{ zW%CqRwG$^3*A~L$GM!Uqcs_PDy^&RAKbSfgWQoYmidU(Eqt56&!h|p+Za4TAeJaN| zb;BO{XRE;q)cinz!ay3~9hoJiTc)qAf_J=ZC=u*BcGd)j1);$Fp($rWUCZ<FZ8nrZ zF&(y0Qiz@R0B?DfokY;B6}*hM8ub&fjpWpd0lAX%T*ECBWnc*ui~OO&Lq2n6sjvb{ z@Ne<b(rPXID2iot3l{)J@h}aBeuy?8a_N%-dW~o$C5vj7kh}xPihK>7AkYa);b{TC z<br}R;7-n%2RHNJtns4R;tb-?fvM@9+e);@y;O@aV%7C~6%6zvGsS%kMYnZPP}K{a z!Ul9+f<;!eZ6i0;JBM5xfF^S8w2ks;OT?z@q}w3URR^2chn{yc`#^a7mfvN%*`9BD z_F1v}8N1bK0E!0gT6usoAzTjm@pQK5=gyT|2@)9)<kpDO7%QQGvue}RH_fhCHD*$Y z!>m)Z@Lc3(dXVwr(AaW1u<-UD9N<Ex%!%*UxHJ@#f>B(RL?ZE2iCFS17!Bj>PzH%I z>XfgH=N8djxXY7xvpkCDj3!|AKlkiL@MbU7aA*ptek#F5r3dsd8)MtCD-zu(Z>DZE zxMuqvvG+t##QsoBb)}Yc!}Obl98LZ1E&}xr4m3i)y<0eQtH;_cJr%ft9+4rfTp!qL zF<n}tS(hOcAe7@6TXaBVpqD7eXk)ee(lS%TvAgJr;Y1a8q1c4_H^cDzvNTFK-VA)~ zwRBg;;iIv9$-MVV*1eu=tjw~8ZTD}CZw)~SKN2-=HYF2MQ2Mz<wrMRKj(t6zBi*i_ zUGj<sgV_3YM5mo7h3q&Psy6Lp2zySDSyw_4s~9iV@`*RIJ}4en1j5tBFR@xRgP}!Y zgLY*cb)6{i@TS>c;6Ko-D!qmZ6JFTSu#Fl0ma>Uq%Ff1QjxE|UV5?(qQD~*lDt&$I z?mYAuSin^z9MG7fVI>y8%3sV6OA0*8M&H4946sNST2^i64CfTEh5igoTIk>hG={Fy zsAjxHB~`YLBK0oQ^<*(%pR?c0g>WvXHF51`hKF!7UdzD=T_7-|wN4CEsKqFfdNn)9 z4<HVO@QAh_c&iHHOdoi@TMCdj3E;BM>Rn2DJ+E(Nk&bB~FIE<4N_r2&n4^RzxA;tP z2_~s58^hybaTwkNt-5r`rWbLgwJ{lmWe$mx4N*=ybs%to@6cRECEuHr3ZeQ(?4_ug zL?!~RE&P~w*5TgDCjnmQj@2dMVa5URxnHK-><CM!v1QCcCsf9nj3|BpnV>U_qfAj^ zKT)Q|ik3|4w8XDNB<sv}=f098V*9a&pb%1-2`Xg2D#tnd$=eB`A0Nbbl07tlT1}0( zE3<M}we&N%w%>~~F=l}qpMpGH6P@F;)O8}R+-~2AF8$*64w9zQ{~P+5YMw-AT3`M7 za5g;i!3x-an@!J~*<$Q7f22ud@*D<-hd8ppwf&;;*X%_At16*bW4|9%kz~2GZ|EH= z9tH(fys->Zyv)SEe4i+;;&m~+MTx*;AxQd$HWFW-W9>Ib1k5v>LOIxacb+BipvF4j zKe}P&182hH&FR^z@npEjqi6j6!g7=Ryk(~>^)bq?_e9}#kMP?fT$uWZ?_2h}t`8K! z4IOZUkQQg`rpSNuc7}{MDwS3k%3Zw8DUvoZ&&TkTT}7S@eE)WOI%;rPWy|Is45yB2 zEp&K5@TyO|%=u0D*>t+lp{A;__?FvA%gBlRihev?V}2uQwVIyjos~O!52C?0*G-_5 z3YlZZ?hy&frbn3IX}Oul9$oiFH*Ep~;Ays5vjj5-M#c(f3f;Kishm_6yyKkUCWAn4 z6pO@H-s5<hVg_3&>3<i6Z4cJMkD}P}-Ygr60;K74=)V@y6;vB{IzwO?lXVU~mJz$2 zd1WFNXc^UALx!qGN&IX$`jNW=n!bvqX1*v^tK_*?V5?ap8Gn>CsE$py3@;m}XWbIM zB3YL3Zx^M&D?3g+rLm}9-z)Bryp&ZuXIrS?=H8#7WWyYiDI<gvHJFZ%7W6R<%EQ6w zwCaNWTI`~r8(vPBR*I@jQ4u9UE#f$&`rcztC8I{PMD_$4xQD(NtVD@cyK~<^F`l7# z+(RKn4aSUZ4dyA`1!9N+?lZz~S|c<(G0o%DZlo|#mnD_+tGYG=K&`FN%AFL}KAPgr z*onQai%*q@`Hi2HatTb5(O^hb5KW-<b(|!c;+hBI9Vt@BZvTt#Z<zs!7}TicWm!&3 z-Vnh&%%p#XCz|wFnP!%u60l3i7TCT<x+<Qn)N?WjNq4R*PkrHX3<`f+JjrIVh7W2@ zTxyQ9!b2oMp${kH?x6cRrCPY+V@Py9DdAw67en7|8?upiJ<7IuGtYo{@*CaZi4g1m zrW+<FJj>Fh8#<X>Y>Gr=S~>i`pnhmotDZSmqufpC2HYy*MQkPAkXu~gBv);AKZ36W z8j63GP3nwL$i+X3=!fu#(FL7zZ_qFa@v9R^m{57sVVLfh3CyfH1Br2ED(Mln0gxNY z83=U!8)WTl%2|t_m1nN1{DH*z1Rrqn>xQI5kl75UI3#g`Z)HRH+RR3QVJ|n(OU&0W zlX?A|_~?9EBJapTZj#wav*T^rYzex7c*rf#InH<w$&odyS2m@5lgRqdym$U5Dy7Do zH<5jTjT(U}5V;=ajXn`_YreFi35iVd4L+<j=tm?ZmA@hH+P5!u7sJUxEwL_^LyIAf zL1g~6o#yxy=0B{+gZTBuZ2AVr*k_eT{#AN*4Zz_;oh)`V#%lI>cmxmKWs4iGY{)}R zS7pI{6mazA{9mQ5U9!^w7P?voM;UdLpvdM5)B0!HF$H6^Vs$%W&|{pZw$>69+YW{b zxBYEoD<`a>A=V2&w3zCGyr&xYDXYtJ<+qs)snGI$zVxKoyS%R7X>IRKP$dCz(ZBE& zW6K;%)IooA3D^4g$fLz=!#SeweE+U>K527!^cqgo^oR&J2<J_BJ~ZX=r<fgPmr`XH z%so6o%49^CHD@^5Gmk`&0tdEOlmfl1Aax;0$!$3F?}s(I=li*9Ca$C{r#l@Yr!*@^ zKC*@W>2x>>+l-RY1M!2*8MTJ~j)$*Kn}2C8a~8ELU$>H0lr&34G4&Q|jq(-ep*6Uy z&x{#iVMTV9Mx`hN3cicjeTVI#(ICOMMcc<fkQ4#0sfma1*Q4QLn8rL?3Y(p!-r5L7 zQ+<+Acs_*f;ECEsVemNtacX-r9gi}h@&rnx$}kk!Bq4wY7pceVFdX|L-vG*&cMp0i z&XS*_!qPV)PWDt^VDBgej*9N)4&lO-u%7=7XDVKHaPU$${pxi|<+9S%M%2y(eqaqw zp7{A7s-&2LB(C`x2g{8Fab=l^b6sCoq@jWqc`NK4y;tf$3_R~wu%iK0;HM~9id%(~ z5<QayxGo=|OM_gUq$uRQwN06ELSltqdQaETrr0QDFFtgSRAdCxP$4%hG9%^P9Fz`( zmmD{9D5vGqzGdq$cN;C^XE$7ACevI#jH&)0<0j2@GtNhvsZ!Q*_}sZKvmP@lK~~Ku z2CIS7Lkr*iOd3C#R`1-GNu)&Bs~R29Yc3W%n~7iO7`ILI5=K&0VX0vS{-(xFdth5J zvi^~1{-^8RzUS$Mz>VJa1ea`&M;o(~3)*|(IJ!nDEXiHGgN%h!cWT%NG%!<+BrX06 zH}bPZ**14&uwj4jXgtH>jAkd#Xffu2$aom7#WM7K`CZ9(4;R+A!}IedPp2H#=?!y} z972g7B8n+LK<#oFWyhIuydCy<_Hh1sh-<xwZ~)zMRQlo-=CQ2k#RS>of5;v}hJ$TR zz*sHdvcgB(J6oH3&v*Wc8w+v8-v+*>raOskdHu?UyVJ7EO_q@#u;r@PPu-zPi=GYd z#Y9Nq|023}|8@`hh$*O;8%i=NsTKpvkkWiQA5e*zEjg!4U?AhtnWM-NSbbt3bEDP+ z&+YrQBd*wJ27?%X#sy$<2T(-DG)UF1ONm%#EMAJE2KNipCO*Q=TO=5Vd%CLN3nf3l z@sqW7_0<c3tk{+-7U@weX9(=4TUTG)^!_YqB<H<c_XMSqnjD$!cLS>+cjhFt4`#y- zHNu$elk?SCFI00%lsS;;#tqN6B)f!nQjENa-R^z<Pyh5!hNVJ<Wq{=PTPS^fI7PQJ zgw_^k2&a?8aORBBy-(+N@q%XvRW41BbShe3_cz=nmmFx4zlRN-`H-)49`Kw*zM@B5 zuSSLxMx8vk^18LMIF(j6jxhmtqCjC&e6_4UUn6^|0>kw~u0@GJbNOB&XKEnr7AMBu z^yuhfHpA^CxODEc>4D+tM&aTacj3rAO1$wzl#ah0r!YV<G!dnkofHuSI&X;Zs+{2~ zm8zNv>+2Ht2UgXAN0JVAdC~8`dVtg~y-|aR(wX`pjuwZE3*g4h7q|X&FkwdAgNf4| zpU(e;?6|&mA2+w?fl6v^V&?|fA_Qk7XZhWWqa#ESQUU7&gUuSn()2+_DXEszU(u=c z`p;?s1n3#q%A_wI`u@E>{r1R+>5?uAN_n$!*xM|-L7>g%^x||R*9!^pdtCB`A?|Ui z0_~V!U3+iv)cK)xk`_ncd$j|6x)uM|O)Xg@WiX_Ysn%N(96K!jYe8k4jlUhvnL?6g zSw1`Kf!(07SSntM1$|Q0C37*`1QbC-&E4*OnJ`SIzp7w!U0Fc=GKcDog96-LNB}X- zn#B{>dowgn3|5+Je1qY9;q{!&ynT5xYQMyL^Yo&@jtjO<4xT+?jz;X`Fjv2`j4O+b zvc{HV_wT4NJv*N={Cacv@M1E;8pMB5OB;ThW^e3GdH-ws?CfGeA8}gff1NU`7VYo~ zZuUxYc18=ncs+E;`9(=ciKrRNDmSmYnr?3^mUoLJ(aLEVDoj~iJ)PqAi+tIXzs082 z#i?88c&tJhj7J!O;$`RB4PjbBYR%=CBG|feTd`QM#nSScD-1WlU%X-m=5d>hgXGc2 zQ!4NS_jhwRIciRsS-*O_PF{KjQD3!it?L;){KV}Qj*UEq-3!$Uv%Q$l4!&J1&JUjI zJ&+Ki`8n2xjS!l?4kc8jstVjD=JHX7+L9`dCi4UAMjek&+@B@ox8A^U@MJnYKj1%C zD!ghhViUUyI1J8qF|J3_=91=wb`NLMw@?jBin;+K_i*4=MQwL_^h2{Cr6#)Fe7%ZZ zmRkqXwX=70zT3<YX1t^~N+)XF5%rt?%uw68Km_MmlgUQ~gWb!s<LTrQorL61Fxu=c zl8!V7DhQ<62~S`=^h)qbK(=`y{DJ(NVR$7l&o35)qkl3$d#}L*QPBr;Lre-iHLC;- zZ)yqkMh!gK4Q4uOolvrw9}QuRzHUxop`K(fkB?3<E#(gphU4aq0OeS0u&f|`RdSN5 zeBMmnWDj3MPaM9wfV|_5UR)%dy~ce>^nK+|)tbzn!gV=s4lib>+4IVHsG8ZBUrvq= zhHr=Cya8u#Wq@GWofagpo-r(o;Q;$@yU(8;Za@2O<H`1;!<T!H|M_tHn`h5=wiKF{ zfo?r~xczKn=dbzGmpe}mUp(L0%b$O@wX?fTz>jio+Ph}9aejU}Mm}i-j<oDja0YVo zZ|X7dn-s^fK<O36s<LO3s;UIl0og>Ve#+qr%6gdzub3C>;O6D@S%ZeL!NPC<`#O*z z+_#sw!;;JMmIG4?pk7^;n3Kg{^v29!nAhpl1?YS>-8(x6fO^&TbTWRFMw7W}(#~GA zk>SW0K^qrLibYcjI`H2x11zOW8$?_s3ayG+S1g=*uWVkjBC6u(bnLMqh&qJs!NvCK z0wsp$*Tn%>oWm@ANyX95T6NBVP8~gI-ZZhQdZqLE*roBjFB>=IU4h^W8iCsr)RQ?0 ztEuSV%q1u6Cl}N-LcD=6vNv=b$#LbfXS&hjDcf61M8tL0pXIZBiCv+<gITc%teeqV ztEJr3S}YxKS1h?4Jxow`ca`knRG|8(-H+Q9)s|)=S2cFKR9W0?&8+)yUN9l3cO)Pd zjP9yZm&5|#1=SG&QY3hI)J@<}EG1}?<T4SvP$4C)sSso&A{uzVWvj$6BiK;3D8dSm za>kGIiI#H)Ym`rwjZMXZ{H#|zEUG1A!z#&xqIk=gv0}@s0z?>9Rti6gVsWThF8(SC zb~Aurwt})ZluTKL0MaKV2C3$jCeuenm6W?!BYjd-2wcaq;YU#{a3YI^A6iUZcX`ys z>|!!-^O6h)C&4(8K_k$*59T;nk-u;EGBX`#0mOVqcDu<!IeZTP<OC&E7cybZc(Qvm z8=o)e3`8+eSMOD6Q2<V{`~=!`*6(J^#Kg&uwICKyu4GtH4f<bv`A>I0$A4d}e@<^3 z!5POIrVhJJN^cy&Y>Y-+`S|%m*dToaLh1wA%5vo`LIE=R^c8%K|M<s0{{0_u7+Y(- zz=lKxx;*}x8Q9fQM|8i%=Qh0}hu#7<-3YkgcpdKU@~c*KIB5C-hA&^tO60A3=yo<q zANq#X?y*De$2g3s89UUVHq*iN;euIgJDm3LcplByN8>pcZN1&o=FJq>q;F0~FijZ> zJ{rzOcO_Q#98Qq=-JRyR!DMjMyo4Dc&!10DF9UDLu>2dmb<QjPa&i36YK4Oh+_G-a zZ(DBkZ}lFuu0_C$pGPrbLjiqkD**cx32bE0_360JIYI}FYj)IiTSvEhfBXU-;<YN$ zw|ifF`Om#S^uGA~%YSfx%n(aw^*U7Fj&q-;?bKnn0J?KucWCze@Z(}}B)5R|-6g#6 zrw+kEeeNL03tZ$@pPcpbFx|duDFQgj9Ac{^FHo>xJ}q24M$yQ1S|<J`oY&`!^ZyQK zhJD{Q6E`P!78h_slJ{IGX3^>gO=__W4^d!taoUJkYYPO$`n}C+D&yw(<Ia7`r_j?% zruZu~n#f6^s?8QbB1GA$BA_sGh-~0hi*K7(R3c#Rs6$!7f1LEXfj^zZjicvqU-T}g z7qcE<^j@iZtv6h(_r5wl`TFQ`IJr+}#QME^QKf!5`s&_&s#QfrdiFhT<{}2k_MmT` ze+v})FGShyZ^D0YXY+gRR{i_McyYI%ajgfE@51@#ZWqe`#NSpjp+SU3J&qP{JHeE# z$ym-htF0VNoAUJrP&^-kp*|GD<KZbCRXKY6y&8%?Wn<tBQbP_zj>Jp5jqA-vC_u!# z)IEV)RrAz^5FGz%o53!paO_JOyYPDJU2}A?Xhx(%R&&>{EKH5mB(uAF?6Je$shfe= z0^r?fg5XC*$&?eHQ^R%AoartOG2VPVoSXn}*HWB|&9Lssehy}0Et^imE2HKxLI+k; z9ZFzyHd|Kvz=T%y(NYmfSY>0zT0kVZ|2Wc@4cc|QFU-GnS$4T{9j(OlQW|>(xz)Sh z`@9u-N2U6#r$7}@Htlg!ey*y%z3D>h*SqnNnb69s{a)VR35yM$(HF`Buv{Es5ZA}% z#UPq{(Q-A6AFk<(A!@pFj2+DgKI}$dm6DH++uKI)r62z|_6d%NH|7mBDoqB3tPrPI z+`zL)j9-L^jA>}1b!b)7DOnG|+T;0_Y|0d=WusGMUX9ohOO5AoAX|@GvSdxm#{Sh| zRT+3WpkiJPQ4yTL5d(DJ?O66O=shQj$m5P+AcO}YqY464M~Ds?-F1_Cpjp=Y80#XL zApl7oGQGRK{=IYTnco>tj;D8N<k~6RvZJFdmzf5*V+Ch<E19fw&&B#xIZL^xGXf>@ z<Dh$?YB(LN;Y36lh(=W@P{HrLEZ{EaQ18de0_B2C<q*5Xs2Ke<JrwTtn3K>svR#ZR zT1|58I7J4=1!BV)z2i}V<m@0e_#II;2zeRK`cafHvmQ^oYbVSUYnIe^>T5K8JE7~I zp&LfbJ(`#xeVc~w0>Sgm(~7#H=$mjY*ZtyfAxRu2J-7fKIlLtP!yslaO<)~<K4fTE zKMqg)wgwN+zciPg*q$B~*}Hg!kRvlLG*2{IB!uwA>bE7rk9*L~Y<(RY_oKn#A>!K( z4@LfEpzjdAhilES%DAzpTR6XvLG!rP1}JR#Rz@bMr3wI&CA_b20N)o9)UWBy7vFB| z^yYBA4i|{Z?TzQqnzPx(Ih3gAO@nn6Xi&<Z&RxJIW?bD5Mu@0HGm2dk<u-%(A>0x9 zL1r)#N*des{TbZa?;}I%Yl+3|e=mvA`&=3B?mj7&NP(b#8wCH$Y>LoV_O8cBQy=cS zln9o8Iixo;0BhLm2is%t@x>}vzS!?`s@~gpcKBlF`QhHv7ZflIN3ha@l8q{H4S~={ z*ute}5#?~YWCwfVDWtz_J(SIJfWmz=aR-gv5{@u1+Li((eg^9Dh9kmkbZtDxg_l2w z>&&T3{{*^t0>7XoO+eF^$!$pisVku9;pjU^@GkeXu?P4&Ip{BX=q?6;4u{bc<Juqs zWWH$5=j+yPAy9rw{eT;0UhqT#ISQswkA4pXTEmY5!-mMa_ErNIGy~cSE|)v!@Ctel z_NSxu;Bi?pzL@Bil*rk--o-C(^`0V?H)zvC%s4`}{doftZP-Kd;yEt6#D*O#=u@~< zRwEqRnv>we1wBq6zKq6eoJl9x(<vg<Cp~N%&n|lmX8I8Nz3Kh;dknRuC-4r$X8qH- zGjB69Y&Cl1{fip4dMo-b#ovDgRVNMX`hvAd+3AeVYEpWL%PU^{SW8;EtC6~&lcCN$ zkdIx87nsNDGp{dt&~#%cWu8&&A>>68I}krsP)R+8C9)z)R%*7MeOGPq>o54>_-B)9 z9e*(Y7LFD`D@5_W5%m7`#q-^*-qn!#`x{j@eM_!H$p}{KSHtZe{xfKapG8RoCx=_> za$gf-M>kw_#p7hooe?rnF@?+F>G*8C_!^J+^o~q1pN`<%NFx*n+!@q}IoOcdI~OH5 z=v$CTM^h9G%Q@PiW)+OvNs#;r&mghP!sVn#m0yuMD_MiJuC)CQus0s#o^Y_wonIzf zdHa|Gw`0S#L&!`ea{OurUnEzg{V(o*ard2B*wDs_M{QvJay@jbhf89@)6jTsTZ9c= z@o~S$<iuU2b+?m!n+I)RQ);hpU#Z~mz(4pYL_%z1$!m9h1!K2qChxxP@c_d5y6zbb zxE4zmTX6w<+m(F$d}nj(aARj@<FA=oD@o;_u&MpN>qOsVTDAB*^n^@nY2Va_?4RM( zbz>Lx7QiFW1mnOzJg4EWh<c1@?8nm?_I?NP6%Il_1&0|@>~pKE3Hd4rm>)4zT`_F{ z8(*4OJRdU_kLG$?pnh&*#yLH2&J%<=NR$fX9m=rpM>u>k=tD;B8=gNI^k436@)pLg z0KjzN&iylNf*)TF`k!I%7YE;G%odgTBZ<s4ynwQbMbKO`xxe|kIr@QSDM*MpcGev9 zagDKHX<dUe1mfee>AQFH1#Kh@LvJ)VfZ~V#>kmuGSme%qp2SmiViGe}qjwPRNNYfW zx)^^ssfh--mp+{h_WQI6VdaZQ{*Ty>U7V_S9vjp{S`6~S9~F{KUOhfE^3N#tgImZ( z*as5o*bf~__AP_=k;HeQA}argqxQmmyO${gNIS2ZpCdx%cp5amm3s3YeN6=3Wo5e6 zlfY|i?h8d^nI2~d?!?Zq6|3GBuW;`mceb~6?;--~o?`Jpj>P4W<e(#FJf}p32Ao1- z7&VCF1f7Ye9lL`#w{8h852qtsz}u~Ytfabz!c}V&976@8i^QMqrNdRrWx=f#C3=BG zrj|qoDSYG5LXAZF8_0OBUCPyDv1H`>OJxR@^g$nv9>1caZK}Yn+5Abxrp#s4NKZ$5 z-cd*~t+!RmWtg_HnF!s1Tq$2;X$!B-AiTk7zO_cL42_?9W3^UIx`GxB>(_V$l{ok_ zr(A6JIAG|Ro<H^TuNe(PBdpaV)ECE3oH~G=<ezvCs;L?TW!B)N#C)OAVrXp8|7L3s z$~fT(h%Y9VJNH3i#6aX}9zc-vKo)Zw>La&-WUvF|oRBS%8wlqcU7|Aqn31H^FT&yZ zM2nj=5VQj-2Y+(mpsreBybSGFBa)uK))rIj$M25+gS>>)6$sBuvHn&Zz)x^=X3&Rj zrVHTClV)<Vcx~BCKp9$LI}Q7bI`vEN&Y{;`OKW+DXkfEX?|ymQd-{+g8<D+-@G1E~ zHAw^P!V=iJs~BKpbiq~WQ01UP77!+*lSK3sY=lkyi^&h3V;sACVI$i_hQ8hVJ8h_i zb%c<L$!Bt#GEUlHZV>n>>#(GrJBre8+H9+0k&#jI(l&5-rLEY_yq|0^)1E(+B_4XS z+1k>vt8S9mhMyo<5nB-HCZZnBD*JARHSH^of5C&7m@b8Wwj5OY0h71tR{Fr1Nrkak zS;;YXKSStN(sPNh-RALP$&%%;!zEG4K-4oh=KTz^<##@!D)(|KlajR-8wt^&T3W{> z=n^yJdykg*d83IlsU+?moPe;6B@z_blb-G3<^sm(&gm(Vc(o%rVRJE)^IbCCBrc;8 zWHMd_I&$)ZX<Sn`Z~^A`2MY-B`tQ5?hB60>Xy|^jLg|CWonHT+@5+DuPT+xXE!>jw zpkHrCBgsD@F|m}53vg#7)tBEiwf-V$z{2KW1gVy+#@WEYbdc4;4$V~TN?PJv>(SH{ zbN_1VDNN+BF3R=ftzgV6iGn!~Q(h1F93f<kyesQ$7vKkNi6i#6Tu{gwc8oO0XugTU zuZBlIs7c=zYfuRQqoOh*szKJi>0YG;uPh7Khr<BVQH&<j3FhyRUP;lTsiR@sCF&k< zwzgDzLsb`7P)Vp`&AxB}9K+Fw3;WsNi@S(%4;UDc;B>@KZVmHUYI2B48l3W12u%A3 zxcG298fyhr#A<UaVW$mtNjedN#6bUz$z>>7C1g29oYy6AFe771u9bWJQ=GY1s?(xP zeAr}_m%S>n0gE?zeq>8Ch0xNLog4`Pat}RA=dw~Bk5a*oV_KF-f>{muIjk=Du&ktD zg)3xE=EcjkIK->j<Z-ld^k8rEg`4(d870g9^|v^0i+!8{U#gctPnwYro%a@frFZ7H z^Duh6fm2+T(a-snF#j0^4T~Z@7Sq9YnI;YAM1DKwQa_5a!ZDZHafxE!%2N}o50Xeo zrMQm_*0kqQZ?e2yc-Ze;OmMPtqK0J?f8h@kj`+~;zG`%dF5ZyC_G6~0a)tH$tT-xp zhQ660DxTSw21#r>ma~XpbW+b%FB;Cz<?Z+H+)?vbc8X9cxD(BO4zFR66MJ^gJ1oTV zm~c#iXo;P|^>yi5tF4antK=q%L%}QTOmf<Qk+8`IkBpw{<$X!TVQ1lGt5K~;^0iMT z9|tqyE%pJz#$s+y#{)%Tqnfd>q7hYvpQS>ofnS4{e$J~Ruyy9Sw0EQx%`O`I!Ot3! z3LG^Xb9mb5tpuNB%f3{AVigp%w=METHF`p7M4VOyUt+Xp5w*<17WmPw056#Yc>6H3 zC$6vK3Sz7i8mZ6lytGGgiWV3ZhVlv}9Mj?g$DM>5&o@b0$f!MHH@1nw+_na%@B}d^ z1|2EX^^R$~CRfXVIzooX|Mi5yX+${~bnE-%(1O=$Ee4<uy4vx9Sy&(9eDY~#cPWpC z4b}d=yCaG4!q%~0cWVQ7G3F}SL<-%DEQD?OqeJdg5wMXdAwvfyFAg1L9EZgsGS|IE zQcgAQu~#D5&wQ$lH1UUAD>-yIL3GFXy<#W41MXoPd_fto1tlWZ1Ha2snHW(W#Asp< zrn>b9n`HUboYGlbLI6BGu*kBJT^+fVHd^3j$HW}xY8w|WGe7pYc+!I&o?FaZ>mR`c zM240@GIE)u>$1*qN#}u&m4=CZcl_d!FnE2}AOrgh!T;PR_wQ>+LavV-PPY<PyC?Gt zkJCw($;bj^*p%lyD%a;Z8A#<h4=grV@|+aENuJBj2wsKXWLTXFNOLoUead{E#Aze& zt#-Fsv)1=q-=t|BM871Dx*AOi)*AD|edB~SCobEF98!xcQMjQTtRK0&O;*qNL4($| z!z++|;esmug&Pk4vx_LcjLQ#o-ODMG?5N>bPMUda8;J|fd8!_F7`QaV#}}ueFiu`! z(`+<Hh@mTo)MPi1tJT>7xQ$_WGC}NO__D?J=;+ndX+=5rz}IUj-WEioKr6ZA+Vc!T zwQ-fh41}6%7Q02Y<gD!wBn`=jCmA$gp38_`qcge>Q%_VF)<K9eQ%_mSDW2qx5P>t? z@0OHx3aKsg*iolRqaxz>moR4`FW<9`r&|!){>U+oGgYjarap7uaGZVWc2jD>WvTaV z<|((7??$;Li&A$b8baMAqOzc&KUu7=Tg;ppptBfO!3(G-L{*0Y1?6Bm;2@CPOIW)k zP3H*gdNY5?VBVY_udkER*s{RGM~Kv9@*7Cypbyb{JI7v^$}QH2x~GA6z2PftQ-y#N z2#xXxr5TZ84iq;s1=7AQ7?6@j*;#VJ2%fS<#udjA{t>p<66@<o$M|yVaA)g(d5QZ; z9-)NTCx{V8uc?%Idr1T#yKH^zvF9xnhY58Z*=(weudhFUvBxxxPqx0>dV*F?m*OFL zHhQ=OgGo1fQ=t_iVPzlk_4ou~Z1R;%iLsg0km`Gz9LEq59foF^*knofwc8RQH$nnD zP<nXU^MEv{<s2q|wY^dE>f!`VXw+<_p=ZyZZ2=9AI5O3sa5CC=cpPOi1<i*GtWx}v zQ13Xvc$Z{%k-c{$Sh%ZUGr)R9WKXJySNRBGf3lLFX-)#U6`+qjG?kH7Au#zLq^q)2 z)y?Q}XI?1p2+Edhw8{otSt8~{0EltmSy^dYn5%2JCCKOaq|~e2VVP)hf95NHG5?Z! zh=1ak<(3A`=Bs({StHuM{ACdof!*ZbhRJ_EaBK3YkXTENx%f<Bwho1E#y5kjj{}%2 z8wU6o7=ZqS@#myyITTvJF`Zd4g_YD}h+Dm?7bKNPTQ}7+)pnC2-l-roMoOvXwA$j8 z6qCWnua<PuqvItIMFPj|gRp4ucRKh=zPF@@*0N7pt0n!^ddZ{Kib4jhpcH94%y%`W zjtpHn$BXNY)Z7ibYz4{PB;c32ubPuFf|#6+2!Shd$+sahR=Jj1bY@B3f$n)-*2ZSW z^2&Hk2ogMCMzWl?jW^FbbYWk18}e7oX@McsJC>DC6RPRfvM*rul_O7Eo!!MqEl^tr zrkhK*s@D;CJ2RN}!3kczanTJTRnD<l782{q^+r(NMQG0W2qA%ORjjmPtBjM}#av=t zhbJ-#acrY;!$WFk!yj-gQx01%7_WZ%c6d3*1U#Fo#_B}z&V7lQs>F*1;*{M&wh*^e zvN79n5g$g-_IdvBa&LGtD4?ycZ~g1u)-y>?y|?iV;<~Y<4GrWoO?=aic@#sp)DH<W zZgTn9Aa-|zNS@2>3GF}FKTHts?;__?&95M-)edMbVxjvO=^fiHXYelUgNKZ$R4t$@ ztzb_dBXGrK!4J=PZ#5E=WF^mr@A4;lUJ6tG;dwLs;qZc68F`uU5sY|5tYpt;L_2%t zg5lDoTF?cm<yw|zDvIg)$ET>Cdr4K*W0zM<``uNw;iiNZs8<dHRBt-)ZM`;4u6jkd z{+r_=f});qetn5-jCBZ|sjS^X0yttFL7u6@kSoIXzpq^3=_!~1+L+CT$cj%Tkdv|# z8-J(RL!5NM-HlB<LY-hVE8tV`Cz82*FbulQ5m){EIDw=(+=q(|5STWQ6|=jHiSs3g z?x$N`Tlsap`YL_YT1liV1g-;c3du2vkD;?8mhDQ*=%hT=;Ro<t^w~s1JX>K&s1VRK z=%zhP=w2Q9Y1@}EQgfT<l-%UY?40^l$tSr8GA=g>o)f0y@Zg>ETO_Zf$EIG5&&=zB zf2!{izG!iT1X9pM2tRbtWr|d*$xwp@&CjA}AP@_NA4RcJIf#+cqB0CB3EfCi)+-(s z?Ik6I+(kWkT2!nJ1*_Jc7nO^FV$I@VN3~=O)5^)K0>m*W6GBf}F?pcH)g-VAP%Qg7 zoE)9DYmj7DygG}ALeAU}w$GJMr;uY#=J+Bou5IJM$F8z}%BYoIIwc=2{an(yAFI9b zN|M0*R*7%j8_#ZiovAAHV%O^%=}C*q5mLNYf|y3MTbX3GwzL)J`fImU2zP61K`lyK z;a6u*GL2A&T`C7@A($F%WGd@fMn^U(_<Eun79;Z_4~CL<?A+bfRH9GFrnV(3QjS~f zbhnJ_6RbolDOw^zozzXRGWx7eW)R?;X42pYL}Lw_m1)qf0$bbLl3PKH<+E~QEn0Jh zmJ&sIjrNlIc9?U9Li{zZ8{BD-<7>jxZ(Oly0!hrz@|#PHr?TRB$#sS-X>bk-x#v(= zW2MK4j6%Xn2FO$Il^!;;{fq%jBp!jt^Y5D3D{SB~nmF<<)z(^bIy{FFPRLN0vUnMs z`K8T3ZZx?C7kP;XZ>Q9L6AnLugN64MPSE8IvY>5r*GGJX14D8cPp`6+`!@~5tikq3 zFH<Kp;3oq)-SNns@fo-SiKar{NYK85x~kri#&SZ2XBZy~d~EH+Bi36=V@*Khk2OWQ zD~2|JQu&wd2~BGZ5*>Ct{oICC*T}ck>FNpBYc89JOL}G&;Opyhs&Ihy^gx|%yim-n zpdCBGpH}M;&x1#XiX`wes~4L@*xW)ctnhW8D~ztlm*XW0j(SluZMk+fo**+cBZ!n6 z#C5<66EH7fSN&e^A3ryk;qWTYCcx9Q>k7co@MS+m+1Lr5bH!2@fNhYXjHz$4l4RJ` z(!da34%roZ`n`|%95|01&i8v?;PQb!!u!^H;S?7+ClXNFE0A8+a8ZF6Xg3vuqQDBM zxUqD8m_fgX4JOxJN8uX@qo~9VEV(k)ulU>^<LtnHQRj^MbCwi(JjT8r&ImiNQ&C#9 zatoww1Xv)6hW;5zN$b@rV6~R-#CO|9gtlO!05%cR$V++2zViJkCZdzpu9<?BN{?|R z1h#+D1|QwLSMbGfhIM{(3J;=w@q?JQ?B5>jqK_kN1!n^WON$}u2b<>?n-~-vTqW63 z7*~#6!GU|+Z@iV<g(}0b!X>S-7N&};TyKh=@aVwLeP=1o2*K{x94kt;ia@r9;&`u% z`+E%tvS+EmJR7qU<Pw~?YbURShk>$uq}sb<!05*FH9DjYs3jpmvJyDt0cUL?Op5vf ziFpq(ht3xWSfkH9yq42w*)uMg&nn*S@#IjTWyKMV)bg0iv$8P3mrr$e&Yo8-iL6Xz zSXJJ<0L+lh<n&G6WN^zT<hYn4_og<0`M>j)QH04Ll0$A_MJi()sY%Y<{KCOk$r&HD zN$e6-J+?}6m>TfPbp@_>u1;;3ld!=uXf1xnZWQRx=`IlsFLdsg4ZuR!1m+BI2l7^4 zoJ*=bn5KT8i>I}4Crx{>mDgI>{lsP%mqDUM{9_;cwDF|(WBz7)SM#^IxU0G5<9Eq? zBrQKSLUGcghY1}wwPK5ux%De?Kw$nDr3DOr3-tP^fnKWTJ}m6Y4{3Eg->n)-wsCrj zSTcVYNUn4ESB)$q3(Ge|Tb%UHFJ?UIQja1_j}Ep*ubCh+ZulbtFUX20R1<Q=@G+5? zZ^t9-CcDLCx*9B^DsME3No0{~Xv|nN*|GN$=>^rU6Lm!Yiw8aNZp-Og$3F?_d=#GJ zOG`Oro)<3vc%-(kVwua-<3g85pkxk0+8(OTTX_JL8I`}ms4L$anpHSv6lq)ZGt#hd z`u!S1wRE)L4KU+_Umqb{%Tmn;Z~2fe)l)_IWVqF%*rr*sZv<Co?f`WzkoqM>m~*cY z&;_$jH}*^S0d$pk7OYFbZd=t}i=E~05G99jB;0Z^D4`<@>*;VlHzHVpr@jGEn*}Pr z$|M;$%edM_u?w@#MgLrSjIi`Aua~kFaL<{pk)xm3rst<)%!+Vv4&F6`V5+b<m96zO z+eBa}fE)V_TpbZS!P{u!NeQ`ow{;LvgtYO&*4bXd&z!H~;Ag#;b&5k1I>atl%r)*x zy>|~|;Gk4*c3sRa5DfA`7rO>sU|e#}cjrB=)}Lo}0lmh~8JiSo(+6b>&e7-90$3dG zszoyhX};M6KWS{n1_Q4|L8Kfi$_GoOn3_UL`mJ>ZCBa&%{=B<S5ex2Ezj@Wn@)ssD zRj^X~xh&U4ftCh+|Koa;(91w)KHZOE$qnN<rEt!>iRG6Zzs}@Vs3LE3LWF6m8m;i- z4NP9r4`u@tW!L5eE$~XW&>%|P$qZz#lPk`d_@5<}8`2)gdevRvsd?Z6Wt3R{cnPuO z$1*e7OTk&*Mj8_2cZHLevEweh#SMcR0ntFHu&ijzGUz(leKm8VpwuuJW6tB)%8Y^y z0{$}mWRL|AB3)8G;!%4TewTJSUJ>AvO3fTR)_5+VfgxAqxxJ}ldhD4q{P-A58=mF1 z4tsnt!QnI{ylCn7ehMKULIYv7ZZClscg5OA14CiA>sT-nrL7+ti!GgeD6(6lMGi(w z#;UbC?Re@2p&*oU2&<$WO@HmzM}zEaEVP`b%$-pfba=NMd#(gbH?x%GQx#{0C=tDk z?IZ10V+5gUt!RzN-N4&G)gZ}mb&*j<ZNDbOx(LZGP*^sWJj}67n{v;nP^Zessz<9# z4gH(+!>Qa34nd7lNy}nfb|p$3Yc+CJ#UQOr#s(U)7&J~zZ3-8K61jd8_x>OQQ_1G0 zo^jX?CYh;=y~*re8S<fvp!qWuqU@Ytd7k0Ug0dO!3b&?6XF-0-wW2=H#hXvpUR5x7 z)rNs9yebBF%yP9I1uOvAdmOAmmV54^@O(37IyqH4Jsn}HO)LRILY-I55icn3`F&Y$ zRiXP#^a^;)UO)GnwY`6vzQQAa(OPeQhS{(Mv=mLx_jvSuSc#6sS8_1{DVVC#pE3fv zNE<juJ(fN%8y8bP2)y8~wv|@cgVQj4xC>+kxvlw!B=b%&)rXgfti{`iGc|q%&D*lB zBgJ4I>3)VP{mK-{Qc;a+KSXhoC3er7qw(?hNNTsKO>y4|>5}4i?jx`1Gc0qdd6-}~ z9CR(i*@%Sya6AwslMSeUo6d;-Y1U1hVKq<+>8~bpbns02fHn8jZ}G?j)hG$#8SAi( zvQ>84rvpt$T+RC#@La0(S4;?&b+}NszCo3iR5t1z^2SBRhVv!nLst9>T<cBr3b`Xc z)(n9Uo7O*g9w+&3aQ0qdx~|U8F0#|Ds|p7A341Pbvqe-@Uh}Cn=TyTPLUFOwPv1GE z<P=rD{Kk-*C5CfSqz}mzeqGjPJQ{-}=NeyCECRrS)O6{%6wl1GaQN{orGy93nt@8J z_Ip_;;_B|X<lN`&H(|X=ClH8^(8-jTxgjI`BM}IUIdg-7Rc_jg-~~Zma~Gcm!$g<T zt`dnHT@D_Tia2G;V(BE{8+7ed`y>w&P0FJkTv-ZvfoSKPk(SczO_dyn2`p(c%i|cs zX&>}LB(g_Kvt{^OeoI*XJ`rrRtY>&jTj9O1vzbTb?Iz|a9OAY4Tfh!!$0EvPm9}?2 zDPyh799Myzj&>SuuRgrMUAUF;EoY~wKvy2imzbqTxDZTt9Q<JZW&}`N^;43WY5P61 z3A-~Ex!o$@CLru2$VQZW;gDQmi0Q;gD8xCY@Fl2Gwx(-pMHVRqPHlGE@=0t(W2B?U z4>G2oL(*JsA|p?OzVD@qY;SrbSL5-L%aGmFD?gl~u<<y(km;1CV3Uo&G`DH{Fz&<5 z$5MpBt~!boRh^zT(-*DAP;FGRx+>irv!2!EP!*|Lvt+f3BIp+TCy5uaz^-CerDa<A zs7|Y@p_M{h(R0F)Th6Q+W83L3IZ8*f)AUL)g@3=|BiXNWm}eegCbey_8^YM+2AbTR zET|OHcg9kwag}nYGSi21jKhM4R#0HM6P4tToMnAW)xL>FLmmiO_hr*b!)0<CABpyo z5&~iy!9oixK5@0kt<HR_#E+lrEF5L+>VspQx4UQ^_uV>|8m?4CP&s)_$#C~#f-7gJ zrfbi5tf=-p_N)(;rDwI;h;rSI6$7hlVj=G;%R!Yl<p01OK8S$FcD48sL*nYKi7IEi z)1x$ryktF(@o69)bA<%Hvt@12Lnb&fHqWuJnJIfY6Ak7{Wd#)bY287x6<*}AcW$MS zM}>6vNfg2oYMC!VM94XVXjA%GO`aF0mqMm>^&Uyrg2@?iM`X<cm;Nn=T-ZeMc<P>7 zJ7Adv`J6m=$IfNZ@8J}hdU|7+d5D1(wAa^n_ck{F<#2CjgI5gi9`5e#Y(M+v@afjx z#-okBjl+N0`YYy3k7N<Fgf~8;{1OA*6*Ti&w7A^xRF(*?7QDTZ=I40eSrn0u$6zmi zZjYKrNQ@Q4SQwAHtxzowV53B`k|Xs64R+tF{bVFll2}4~PiQWCl@3~0%{nm!hO=X2 zO{uJ)wCIWiPfZ3F`Ry}w$RK|uBZ{kBrN8q~#8Fquyq65@TJSbf1I`y;>2rB>8;9B6 zH6tWvQ9t`n_uUw^U4?}qfT1UK=ee`g&JflG5Uek$X5aWc9aF#29-OLa=Y6?~E!>hL zUUgT8=ArbJg^DS=agN|MgW}bUIb9(r#j>UP$DD<i=?-#aZIZI+cFr;N={brxH7=33 zk=eL&UR?!~rQM2%JL%yLws(6-I7ngY*XA-S1DwTH6?Uq&D8PCs#3#=glp-wbbl-1@ zA+E<?Z8x1z<LLr)JpWb>z0Y#R0K|D7O_U(dy?vD~Sns>?_vCLeYuZhh>eXTNq~K&O zg2?S=jA$K~>cphP!Qk20H#uJs5aVi7Lg73qux_Yzkdt%XDM9|db_J{$0<wzjErh(L z#}sWaR{0WogA6AflnKa%W#(|p=p!%`23eN;(XSxS%p56lYYSp;usFT%SahbxspNXa zbO;gZ1uJ*O|GmpoLw@Ur#jT$zib^1AIKqi&$*@6a!n(}UHu?n+CE-Fd=}}M&L~=AV z8Mo|JTdOI=vgv?0=ZnxaoPTh=<ViDxASQSSS3J8od)3UIAG-#i3t)fbgKchu0(`3E zXeWy9#1a!hJBPblJGjOjmiz4FP5=A-&%c+Dd4$*#VD){j+S8UQ5M#q}cpaM+GH~a< zbKZnaS5FSwSdffeNrCO%H~Frs8bkW87w{Ij_UiKn(jac0PMLC2PZSmhxxM%-d9C(A zTF49j-@<Wcb*k((^o~(?YfmcYHdi`F8}zh-3F|6R_2f;Miq%&LMteOzcBebDYHx<8 zxa>WvChPR<nXgwrP3wdst5a2RX+B8L2|KtHshPE;gAB^5I#otRq5NyDd}f67P1Gwp z*#hNgLgjTmw{^qFr?fh(RQc7hNmZM|$#d)2gQtNqMqS<xJ&xOAxGFE7b_+d&<bH`_ z%@uyj`BkrsW{J*L)JakoJmTrhQvQ2UC?_Nf=g*2tDa}|VeWDdq&)V@N;4_yT1-7?N z7j9Vm!cW&}e2a(_#{_Z-VQxJ-edlfqRAA0bluVoq{%#&){@4T{a|g0-$k!huS5j7Q zI+q1^R?(S@St2iMEv6=*`;~VCwxMgfz%Y50A>o&ZaxT*U0PN{o&u7NyJh#E@q=9+2 z(5#>4$=K%bbcaua>T@P4El@9#I!Va5z1Ptr({ZZ4N#l>cleEQ~H~J!HN24GpH}bW{ z<OG4s?IL}hGXH-X>xc&0Cu@2lm&u<JX6xZeHbLQRDs~MHr^v$GcSjzBsTB9U3CYtl zAr;m)vgN?7+*;D06;Dfv0>r{W^C6`sr@RA_TpY&H&DGt?*54YAB`1mk)?r2R)`G;r z7&O^(QQEEkh^1K~Su|Z#OmUZNDj8tZGaQ#fbmQRfT(AoTmbbgqf=B~-SS`u`+qIr& z!GmNkyw7|i3po$zBi=&cjdX1)VjCsamr!XOx}Xy?j82Mi#Qf;>o~l0=nJZ(Ej)@yB zE@!d{gip#5cM937inNhZ`4>Fk+j9)CeAaXw%qB%g1V4RNjU6wry?KJApQw~@3b%cF za0x1f<v6vF(F8&^AqamY4Bxsd<_9q8S#6}f9iuoxgr(s_HL2BI>&)^HeB`@RNRU#> z*$pB(>CmuWJpP;skjItNooKbRmciP(6oeRVq=PQZ*Ra|dw{|Ex;MIsx6r~7MDEP55 zojsq7X2Yiko8w0f@0gm-%vW8NTxr>*ZgZxPI)S9m9}eBh>N-I77{0s9dvJ%q>l(<2 zm+r%FY162?dOD>m^=o%=i3<zdnpJ*Wqf>i`BBaMRTQVkGm%VG=)h;rqUvE&)as(+m zgy_u{^FwC%$l&AcY2$A93(5%rGNZS%p<BDd7m3_Rk8s7;=HBz2zrt1YVq<3mU(;2s z?mxgYiv&!KP$;BDvSf41UAMqf*zSI>XU`8`>^%QwXKQyCilsl9-oachyjZzbj;q{| z5!n0XyeD}LL2z$9BdbENt030(Z^7nOO-(x@$^oa_9KwV4=5bB46G|M6ux_`mb#04d zT3Ohv1`yi{k9EE>g{T#Yki2!nt$9|7s?pDthD<ca#2S)VGM9iu@185iN36?FS})vc zt)>{L*7SoF*v?W7CTR7hXjS8Kmya#pI<c)C1?|Xzz>3C?%oI@~ksuskN0byUR@MOm z6YToxNc(E4m-B#HJhr^;yX7S+NxLS0joTb>8pd&@Uo3mGg6nb|%k{78OX3C9uird% z@WRF?YkS)?vlxJu9<b(;d=0)eQCEK%k8n-3^|hyOkWH0@_1X;)r?RY&Y8b~my)Pr3 z;k<qKt#nYKeobctG|*tpp-I<sEFSkSiM0fr;Y&Vk<9?>eiQJ^^fuT?eh~q1~leN!F zu0H2d%ER~yVvv@}TO%m$&y+__A{Ves28Qybc*gF<3OF5gHk@1_$s85$IkPUoBY8T) znJJu(IzPo8+DH?8t;yg@ek4SkU7Ssx4&OOaE6bp1p0z?6gE8+u!bO26mvT+gSFdNy z@qO&jPy9xp7Ja=~oX^+q-8;ebaPbNeOK11ymuJV*$z}LEp3mVjz4s4){NtCO+g7et z^@~u|k2Z;-lEQ8WCV-uvuo!-4V-jf?S;TRW#+3JX&P$)<1GolmRUSn1dF)yM=Vso) z?++%wNBbTW1J+;X5M{UnRN2%H!6jeuPR{$E&cDJ1+xUX;F4T|cvub1m0p$9DgaM2m z^(k~69-$QjBi0Yti;ggqs7Vb)$~BS<0-j%G0AlOPnsH1uDTLU9R#_(Y&Ok5?1jatN z=#s>KOk&s#|L>p!THg@EzsGb4HEP>+odkTw+4(n$ewRWfos@H-9j~;?6Q-8#s?xsA zgzg1z%d?EXTb6XK<BLF5sDhj?8K#WKq!UIZ<7ihUWyRQlsY;&zK?Ev1%v&PkQolk0 zTWgcKQyd0};`@L8kN@%i{@?$jUqpPdGCy^#$~Te6_=}%4(UW3cd2=;sEL9*(Y@bpX zPyT4QMuD!-hyU;Y{NMktUV9fjTI8?_%^lK}hNVwn&A(9nHzQv^S5F?#I8F|vR^UkC zE=#DsQy@?qBo9C)LlmuT{`)fiFBPW6OB9^6kTQ=i@Bg-sr!P^CtAA5%vyZpTN#4<R z9b#ldXuKclYSs3zGC-|&5D?=MzGsAzLMevnFHwed#UBL8X5ospy;p?FO54<T`HDkz zvRVD;RTU5pXb6OXNSKRX_=whfA7^cys?Ev>b^OAk1WbuDgj@s9BKA2>4><T{@OUh5 zy;desg+*PZw#!JJPB$otW#oXlCJhpiV6f{WD%MW7D71ioj^pZbdjj0^M`HtCP{xzY zWmN+M)7o7t@UU6DZJNnW19uK4v@deKRINRHSFio|_67sxSt3<gzKiVl4-T+Z5QkWp zxftd<_gk_3{O$*#Yp)imN?5h?ZKV7B?iXe-TKm#QyR<KnRlIB!bV&p)zoDYe-Vm_* z1w-l)#)S{s3To?JF5|^zdHnqdHxRmOAA@HA_pxv7Jbb>pz4zC{XU}(@Zai5Jl1ozX z;{<~D%7gih^sTQyW|cixQ#+=0^xs#=E%HP9co`Ck&enCXa8=Xxh{*NO`0HU6mt`Gz zwDs`iH`hczG`UhAkl~J3WiD&0+)S&`B=W6MpgQ6$n?#PkQ|J+ld!29#*i&^ZF8P$Z z+^1N=tFC5KP6`!9J_UJYE!n?{>4#fp*}TJkeB$K7diHX~rHDp?$1eCuDs9?KP~Dhr zjNS}!yiRe&W)+ioebM4Wxp`!L>$st@IbVsgk1-^39#zmC$d67=-=32Gm)q|sg6>2) z`WS0<efu(-(=&KnMhD`zR$hkB;lN*o_N<vs(pOii{^IrdHEOR?#mCLLzv>>Y<CYaQ z+ZLV(SGb$SUs8SGzl0mX)5iU4pM=o=ZYj<UOk5HTR~Jrq{r~K}>2_O3mL~eU{1mWE zH6SMk$(2(xHJGL-C$ls)N!gWGP_ZE3kU|OsSU8|$meaZV4Qj3Xv)5g#``(}Z1pPeq z0^N^rzi;oDBMt_NvNJ0a=@fx;V%V``$BrF)if^aGnRpDj%r9}<Qkeg!t*YTA;-GQz zZ+IzPlwLj;1^UC`R7`1?2e>F~Hhfnxw5PGRV*15G$BP=XWSZY{Z70f=Z~*RNLw2^c zg~b{W+LYK)$FP!x%&sT%_X;fpHb0wf{li*uqS1#nbLGoibU=r4@tu6X0vx)&ufc+8 z8Ui#(5*KofBc}PJzD=QX<``Ae4H@`{+rY}Mv_1x~SQ)QVKU;0}%o-Py-b^B}Vq+KM z;lD7+Q*?)mHn+4#?_h|lI<lMG=}Ax{!$Q*b2_31DXOMf2B^7q^ylj!Rkx6Ock9UdA zIoK8T%t?>a>iw|!vib<4)ZkHZ1JAK^?(hn<BjFn?0efSi1Z*5h=k>*F)YONl2V?T{ zoul9GKYjG<_^X}6y{9`*_KGj}{_$w<>EZsfr@#3`)U(jOp1(PVEqlBHbR)gV#thlY zTaw^K)6ZEhDf=k3-_Zjp_z4YJ5_e^;^Vw0S8^gAo&D#8K@Xp3~V4`{XN)K2`C?k|X z^KRHtAt_Wi(;h9ifR>w6my+OSP;J55PZg!aBBWBAbHG^4OJ?@Rd*AFmX3-I{?u|+X zAMQQcdGYw@*p{?gIreFlnap3^7q_>g^7-&m1Lu77#5hQNeM3KRqgS8b+MMfE6RFso zFXlG~v@JEeJeHXTv)N-C*+az|tJ$MUIMi6^pJtbzfCMDO4MvT!$Zro%)r_aJj@su* zGJ4TUn3AY%7DSE2ju+E@1+Dy``r8#oC5H%EAFykTVAPZST?;`Gv-9}H-f?i{&0{XL z*5m}2?Z9bma?bP!HB1o9cll;`itGfM`VwrVkNviEtxvWHg~`F++dJIY+oGVvah^0b zM5+Ma(`Qfj0R6*BYdo2?c(6tS19f_7z3xrdabMKv64qyW@|N%Z5zk8uo|=Oq3QQLe zGvDidLNI`-mH-IA_}{-7_TOmKJ?^K{RZ$JrTLXou&r}(-naK@Xn(C(viM>8#gL^q3 zYWEh-3G^AvH{XSgyf?tb)PM-)ciWHx#qG2-8SP541L#oZAt0auJ!3K%k&YUPO~Jxp z4<r#7H(pQ(e_8fmT81YqjiSL6cG~v#?Tyz^1=85VLBB2!TK#u+9-{<LEKI4|)A79r z<yF$9ZH9DU{0{2gJ4sVwZb>NsAr9#q)!F&%GK6ChIT(r)9JVHKQ~(%bfx?aoeh+3? zEzpH@P@D#hw)ziqmlpg}Ede*;FrcW8-lyI=1BbrV;t%HG#R8x+?SPafjw9qd8ym(E zcmqFVjg*MWmsyggV+bCx>(>>XSDeqv>r3?Q##QPR*B8#~&9IQiy^Aq;fjQ_>bzLNg z_v9GY*Btoa^)+_V8;&;Ug9(z~&;`HIXUeuEx;T()<-w@O8^{4UftWg+$<C~6$FL7+ zjVp!>oixC!)Ks)k1!pLA8ntd&luhI=9D8;~Lo7+ghLpX{O>^e@hJUTvQDy=ll0M3$ zPs}5EEyxo*S2Eine+=9cMOJ6B02h^^r_|s%5Jx}8vW!E;YokYETeqsr^<WLw_R$dg z3?XvPNF1(z9vTEGp@~{Os@I@bXW>*Q&1YUO&0ir1>efXXb_$!iWB9KZ5m_s3SKHKo z3&{T4^?25~6?1E3xwaLXW%k=<p~#fT(TMagbQb_N3V>lf*$`K}15YS(Z%hpgorM>Y zu%`n={LyOPT!XAt?u%<Kq6~9EA+o`6nB-*NDkD1(@lY-|nGZ@M^9vdVds6>XWlDcM z>5b~j#FARkz$)lvvk9G2iv>zkSdg6p7-V&q+rlz8YcaK$m&+&l7Q8intz5o=jWm>Q z+2mYK^x7Q5XkiZYBxBEKG<0x}f||wO+}SD$b^(%XC=43Omq^=h_W`XYfk>r#f%p;h zB?h&>j>{gE?BN2SA#xhSX@0n%C3`cZEgT_Mt3;2oiusk2sUh{R?cT`Z3WHCoYy<ck zuyy<j88&{J`N6jc?EwY5>$<Wt{Ju@v3gg$|MW5lfCl@2P_apCGIyFYj3a;t!t9(A| z;)y~$-DNZpFGxGVNb=jR4rc=u$U5rZFXlvkmvdaF{rky9>+AyB-E-U&DW|!O4a?^o zi!!>8R&O*JpVq@ch0{Ta+2GP_&pXJ=%(!#N-be<j1CftAcdRa=N%<DEn&7Q8WIbO! z!SU+I1g+k3t0~1<GxD2!*Ep<vJdjToVLCYWd0mn_WI=l{h|hcd-k1jhgc8WPP)^%s zW_VVk#=#!9GrWHs+_P1WfBq8mL0(DG%6C5rk|5rMr_G-PF&;&lfKk_<Zo2sb6@{Q( zqJH(P;T9c)<jtywlm1(zK|Sl8O6<MM`NT8z(azK3XI~vYd%SnFcl_|#?mz4u9PdBb z`FgJ{*(KW|i3OsCOjogC2r+GDq0HS1g-<Aa<{~RPEnC-%L8txi|LuRkKfKifC+W7K zm%6A)p1pC)cH|~Rhl1D$jAgT>^~AN@4_gRlVV5XHzJ(QnPH6Lz)gZaVp_!YED>W?L zJvqJCzwC|gpT6l&H;0ogV~DbU?{3}C2qc`c@_5lXeHEa;!C-r@Cla#LqDpQ%Wq(UG z=Ag7;IR?tj$@Fv!OMkj?dI6TZH4s7o%&Yej)<~(-C^(BEp-jYv(U%5Hm~_OOysa=J z<+LFcWr7EdtoN$oiV$(w0lne5O{Pppu^)~vUwu%-Ysx;eJ;I*^rWR<fJE|<!+GYG* z6_B>Xf(6Smm=YXr6`m$`5diF0O*m4(eppT44f~aP5Bh|;0nSip^JWbVR#-EgVA#xD zK0{<!HLaTL*@~FBvs_OjUCv=1F5YU7nt8^%!Pgv(wr<?4Z-_qZ1ev%8o2{L9IEnJG zZEg;5CFM3Vd-q2$LImxcNf34iqr`vCg8{)V&>Zx=M$2VFqK^T!R7%y!VUdi<NHb~~ z@2s)Bq}qh>JR%oj7r`ceepvYjAUi-PjM;-=o@$dVQt;q#Yx54?!Y6KRo<LcYi<{`_ z>k8S-a5IoSVDf+-s?LPStw0zSYFyWARw{A6W9Zv@ICP4@A?cU(EpYAw$$$lpLd)E^ zvQ3NlzKZza$k7f|l<u5om66}Tw!)na_rX--8p_9Yq@AYu?Hw32Rrit-WfSDK^mwf= zMK;46!}W{LY}K<H{vu*OwJtB6eDatTUo;e0M%bC=r?S6hq&qw-`XLI7vZMu8u?bk# zTVP_X_wX1omJ^5md>H8h;?O@fdOf1^%cb=qTqY298KmXbk<x*NYZ5Aa&jH-gl!ieZ zLLZSy&O3jagB6mlWsaSQ#dK^*PQ&>oDNM<Vr~w$nVR6Qz3PmZ(t+czsvnA42zsaT~ zq3AA2emZvr<_B4jM(55ooYg-bt_pCg-wg1`WhmJ!O@<}C3nR<$yM`^W8bH9_8_0RU zs)*eb3g!YS<^=wxNN;*HIXwjtwQs#_(-I{VWo<p2Mt(ltz=g*|pr^8$^k1U=gp}l* zjifFV*Kj(nI_;+uVbV2(2P^`ylB;i6CfZ-6kN3Ul7})N#kC43rq5M$B=xwOIl2tFb zvgnJ=+eHAD<2koi(1>tYp3_`qkh1Vr!Q^s-_-JaK{V*LIOq)%rnq+G$k{8VHlPPsY zNuyweCuF<xE^aCEz6EL^$N0DeMS6hV4YC8gJ0fepF$aU9tbYyV47$E3xl_m}_V2Y{ z$%s-eN=mu@iDavu8vQrU#R7Pj)7E)WW&V7+)_#(ignC(gLTJ|Sjo^SgxTI&te~h_w z>Ew3BgHbjU$oP8162C9Hp8HgRjhhp6$Uzg)k;xeq^C%47OPYpxM2T(+uc6+Ep|Gb} zXspt<!qYy^nY^D5v}>m>09Z10<j>Q+O&G}`Jk^1tFNLY#d#S-hw2~#m@>&-sow6O1 zOOAtEl-ee44=Hngap#NH=dC-pzxa6y^0G~qS2WM^R$LT$#2FpzcIvpGV)FtgP`Yw( zu;huIo5*#9l{1@6TCayxCPLi?hfDZ7B5^PL4BxxE0XJJ{f+mTn_ya=o2p1bL)9Sna z=wcv&K(+A7e4YiggJAlLbF$w0>T*`q)@%ATe<*2lTB2iH!tDxrahZaZPSc!;B9<5I zGh)~=CWK{7J7QkI`GC@nQ`kPAPCh`0S!Ms{Fg^PC%Wh2?SPjS?;YOlqwugYbllGwl zuHgIX4^y%`!tIF9#Qz9iWbFlu%y;Ox&5p{Bfge%i=@YS;$eAbrL+HxrbF%YD-hox} z_~V^P9$Zw(8jmPnm?TAAtlEd=b*6{As;V_VwmKhp^&p{EDL_MzJ63R=O-O#W49Hlf zEH4qA07_+sHNu%0h%NrwFCb0Hr5b{YQhA&qK-d(el>0ma*U^g>3-;5f<j!>3LtKAD zqh9g~Wsmt%N+P34%W={_ch+|iUpT0x{95>m&V4~|i4bIC1m=8|019ToQx;btKfby- z${+OJcN_<QF~)(2tode5H7unZe7nhO1A%A_yMk{7kv5Z+;g0q0iJJf|K>HGsCj<*s z;V3|on4-d+yRi<TH=sytk-wJtx_U(Z<9EZ!1v3emj-Hz*p%TXe2)}addL3p>)>=)+ z8CxNnk0r3cx{K=V_C$^L`ZBX)HTHZ3O0dHuLD=sZT|_S&c|=c}siZhonf0iF#gkub zXjx?2zDNZ2yNvVs99r-@l0~`Q2D4RrWe*Cr9QUK!!y1A`ZLj{l^F8LP&s*R0rb98q zfQ`V+f!$KrbA5Dij>EEuq1cL%zi<LW{0&>i#DLsz?V}~ibT>rvK)nh|(@R=z-cvKr zcV;KJkwpZ;=1b;XZwAe2Moq$41}sh)=*p0^4$rGT?w{@JKrmfl_O4X^AJ)3@$xMom zvqix(1q$j2rt`8Rmqt@=9ltfWL;k1`qw$iUYPfKpcA-i_)lN6kdf*L#7H*vuYdo9N zJ*{GezCuo(*T&{Lg91N{Qq!F?pc@&bfNXZv;ycfwWq*vyXyD61#mLgHE>5v;Kw~3* z55|+7G~vm4?tJFdU}p0qC6jbUMF`V#UPw)nl=tamEVuuWteuWNPYy&lDakH6#RV6w zmO8|q>!!u8XEyF`IVDHRMr7zsZ!=A|Dc(wsyf6K?GF7Or7>?T)8Km6qetO5Vb%Omd zZ>TjmxbiKvtj|x53_8xlxbOtW8cH1z4pRbh#Z-ynBlOKtGp4F=l7l6Y({FYXU_bo0 z)tuK+%T&Y_b7qtiP>cZf5hEe~<@yh|kEMDpvB5LFdw9|1z-8hDO=lMcmrD{?w73bA zam#7m)xRJ8(%|*hr!hSixn2?5SjI|h<{F4%p+F>-DOWWJIfy%T3vrm^E-_>^C6aI< zsK2Bnq4BGxb;d-EMUlEun<bD-6-&th0J*%cM;n)wW3YuM`!SbUy)T!HMoXi{or~Xl zK?Gzke6U<LEy`806wi-=luVu)TN><zK@K{z13bc&J^P_hq0B@lDBv5i2Ju@JB{H93 z7Q3{h6xjWVc6ZNaJVOzTucTG`xTa2H$BidVCFJ5AO(X*^n3Sqfrc4MjqdT_357u$6 zL<tV~MSFa__+x$_tYPgz|GiQ_@YV4%Xj}6$X`d`^8(W~$DpyoEdyNE?5R<+*gTisl zdGcstcH>cPiDf|5aB;fS{(c8yGg2!+si6x^CFVB7;kI2^=4=xgFYGXuKD;GrHNpRL zq;7mt!OQgWMGc2p(L#%qtQt|ZI|TVf62!(xwUB6CJA8|rCa<h?8o&u`w|We6OoMND zsa_PIfQOmK7M_*k&;sy1=uR&yEb5VS4-DNFF*A``R;a-j&9*9Q`AOOcobdus$Xbf@ zF=sg^IKs|DUfrMxwg*ac3sbrmb3={y8=P-++eS8~+?UZ(rQpj;dGfQg`&hcL1TF>R z<sYwCx-mwDYXB79D4mR+w{H~HvoRql#TT`*X+euIiC#QpwgXueX)!Q}#ub#7jhb`{ z<g^r8+=bTVv>F(tuyb(aEY+}h(GK<OWJhfX1B!}p+X|?Od|{12;Ja`*pb!<)>c)NS z0&swpNq~_l20#!$m$RomIn&9tJADb<YT_$yCoU+!m<eFZ!>)t`ON?khNQ?T=AgMu( z6f1C}m-cEK6Oir^il%wp0k1F*F$w?~cC|4W6Q>AkqM8Yh$FL`Dz=&i`TUY7=W<}5d z?D-?KMuh|XHVovex0lxND>0elNYUr02h<Rg$A|72p6R+iJ}QNZ&{p0GTDaNe(`<N! zMVfN75c1&q8b37YG{sw?VL~t;0K<3`ROiAe^-A(r$&BQ5bJ;M?l@XdPsfLH={y5?) zn3?G8rav^-UdlIwFs{V7QhpMHMW)9PgL&XFmEiTk6YoU9)*J&?0H{&yhQXMO*lh7j zw8LPNAdJ&WdW%`qU9i71B;UJlSfXbAP_G7+O2xapKbbO@>F9Fv?v|~QvI^Zsyq86h z1v>*>9GBHctmov+80s#OE6ll-;UJ21WOOSdP9XO>?`x5F-7h$iCWNsXJiOxwB09&6 ztZ4|>ItkpOxMgk!FmMa=?)LBr5m*eLw_f-X19CN}isuo37F$RVqU^6V-X>kfOVfs% zstq89gSQP9@a%cn(#;pgxR_wS<*o?|X~ExE(p{a&W*YCK>k@f4)q8`Lq{T^=`y>Kw zMpe;&WDOZTLFAL^u&R$HI|F9W2(>eIXiXC_kM+>{!sv^}*+}~qZHh@TihGFye;`$q z2>*=TgrxoDCMWI9ac;}3(*lKNxga0f6vv)hWi{n)h^sIsM}V9PtW5|y!Wwj^gp|Vp z%VW;#6t^Q|(aO@q0)biM%r03ECHRLFus~i03)eow?0=M18?>*~MVhb=FB=JCkx=Wf zWS6OLvM_1awopIZ<9{I+OCtfe{zOy?`)<P9a)K+I!7_mg#MF31)3b{e)nI&@&W?ue ziUP|Z_;(Sa(Tmd*S^vXpap(6P`)?mdvA7(Ho%DOHsMfLBw6!h|m|h%o804jft#rE; zJ`k<=_f9v?3)VF^={;yWk)#<H-@iG>4ThQy5c^*HJ^nF1u3pv?LiBYT-C(ck<Ytgd z9Zd*5w*rONEbazGfV>*j?cAq~#U!wvFz05Vw@>sb=C(N;i(gM_TqENnQd4{ys~0u| z$C<#p)tyM?h)7W*`<MZ>!P;I@>IbZimZrxDkjBQ&v}>sm7zPr)Mb6a6C{ifkwsSqM zzz>E=%IVS>phLhkE&=LGF`FX2-2SXOOF58GhI{+6eFAhN^FdQQIGM##))uw{@PjF1 zun{yfBY6B$s{>Pug~|2`>fK7^bi#*VVwad(%`YrDGFU{FbWnscMRaapmQsuG%|iSv zGibv4X)~~x)U6YS#^c()w+&D)(@jnz@z^{kmB|eVF2$3)k1&vy;Lx47#OA#g@8a}q zg>U&uOW>k9-5u=m!T|&aF}g*cz@FAJB;I;tu>ps3W@g?D0{XS(a@%eJ!C`lX$klTr zYWd8CbfLsu-pnq{WU~@nykz6`8TLt3#0q7MyWKu1u8Ba$tk6`+F9YmysM-%;MgHH} zn;u-QnVY5>zZ*^`V;*_s6cH%jFu*0pBbkYy5k&+>Q=2NNM%cT)(LL$Cty(qWCpm;} z8`0l21Yqeh93N7_i&tE|<ggIG%;9XJ4UKv5r~X0<cK0^~8PAJfFhb0@H&}h4UQBUK zWUFm+iUhX=JKp2In0tb;13mzkMfTZQbq@_8+bNZtn`eUnsPc7hOLS|pn%LYcTcu9n zz;$doz3iRYEcYCkAEvJR@{Zvh#Ts>Mtgf15*@T(7G`xb%+&I?ah0?(m{JoQ6+|m~H zvg}jbnz&swZezIAy7k~el2_0*BwGpRD!{URDT7UVvhKm6YmDF7&B%?uSZ2h$)302a z65C||y2k-9CtZB@84ib?n}b^_U6lKV@R`2Q4%dYN2jYYsq@P>+#B>dw-Go#>)A4d( z3ndE4-2@Y_4cE10`{>*a{AT@p0*Que_GCgcCwBwz*#6s=&K?-Gy1xr%%%#uaqR_zu zH&VWYgjR*DnX3V1JJY+a8(WTOx43>k7S;~D!9{(1H{Q8aa<I#sTcpOQ+`d`!e>e*O zkutVMgkBRO=fH`Xtt(Bo9zdzE-6(Y*W83}mL|$a)`Z_yhWrli4Xr#S{EGn6ec|Udq z;c|+sOE_-XOQ?3uEg@=Wur`tO(7vADUunID*5UF!8KHQ=3%~+ha0bvyWit>@KH#Z> zLeGG?x?vp3x*@B}jYbe4_oyhR9X459DK6yT5&6l4ngdY|NsPQ&{95m6x73^igA17y zvIi@1E#Y{Q5YJ+8<nG!e{NM<e0uU82OiCUf5(l>M*`>=3hzNFx|8r@^%BdTXSIjKU zOk-;aHlZClH;)IS>cAy&yk-TDUowbX;T=Z0Z*!|v?NCVv;kN_TaN|hJJbI!5Ld~Kl zhEhmavSYLXK&NCm??8tR<{g3&OrP^|aR5s7%d?Zo_)?#BqPlu1gSqHWl~Xyip_Rq; zK#jt~KotxXB-0a>9e7G0^7v|05{eDv3W133+6)!lTF&PLiaHM(mkl>t+<H?nQwC)# z&z0rUeB``(6riun9TLye%NRW%eh>i^+{7H7WJ+Dj3mq#gKss4Lqs8sAp%+757XJJ$ z%4G%s?~ocX0H?MUP$jSILfeS(q++6Bs$sC>^e{7FHQnB3#(}1ia9&G9&4vN3h&C*c z2IxbCx*gH12rlPvT^Tma^&W;H=v`=b83heG*bSx_b*Jq`SDqDWMr7-2U%P@akD_&} z&0Gh$y^VBYIAyx$d!zzb&MjR=D{sAZ`<Fled4K{JBI@d!c3rp$W+q#N89SHlF31*K z*l*UVSc@0{!R7bU?-V(%i8{SLbbDJyR9+S!UW;r?3c=tUhIbq9JpHRdvF=p3!s<fU z((Pc!g-!Dmic&^86<#~_Z%IzzG{ugN9~^sy><3>}5_&}!!Ib`GyGQ~4+0XoFSb!g4 z6BEfHKxf8ps_7;E59K_AloOd!YhWL`%HnF9Txc&m7OgKE{8L5)ahX64JluPw34<tb zTB6;)yCs5YmL2wkKoS*rG%a)2|HtTygpoN>eo#k6e+VyZ+P3@41mo#pK!`o09p9Q$ zF9+%bySH1R9kVGBus3OZmt-YDv)onX1Y=ed{g1>uhY!^=M_z}<2O-&%wnZMh&0`X% zX^iwd_N;Os-WxKp@H8te#HM6)3#mLjLDiZmzhf~HvDbp~W7T!Hc+G{-SWB>l25Nt3 z84f2%^{MD4mi(GSP6nPuk&eblr<>{FzbGk^mVRWokeoVnbXCgg-q?8eu8UA=XkCz& zhMKIid<0H33&=O{Rt`A5%uV^!UOtCgeS$b`tA};UJDvF&0$kB~b2;h4HG_pypztd? z94JOy2pcc8Wu|CKnh@6ELL{8BRtzRL%Q~AmOdy)XCR4iX$7-33X4aYI$RvjLk#|<- z;@nToZH`W}&2}UQj-G3R=enPnPyz#dS>LkOA3lWBHodhlF+AArx(A_vE+pa0a;vlj zOWW__RZ$Q>+rdS0%>LeO!y5@YMi|U?_hXAwHQR(azjxW1U5u;2ry+ObqFj!aR>@%G z*Nh8Vk;#ry31RJ3)9^`n6;k#RCnIh`lG{kwb5l~Gw4*$wkR5N@$Hsl&FH5Q<ojor` zV;F*RNtMiAa)Mo&ksxdCeuCcg^j-TEOdp2ND}FK!C%P|0CzPo@TQ*A8W`oopB;t3I z;h?BB6wa>YG%f`y`do-pTzNsTFtdgZGsxk3sCQlGZ^D^wER@Z-aRC=s8R(yLT!n<a zwIw2=UcfNx!C)<h#>j&fTiBU1Y7S?-Ms@VQcZu|=43}^_K;t+z?#uP3CJVg5xyO~G z{Tu;c%qDAg7_Q|H1u>~x-*=FF@3fP(w!Q5Vg&!a7e65Zmu7kqXV!B=czE1TIpZxI2 z-3OSYPd*t`2xEq#SCYi{XUDv|yuNn_G)=Wzea?#y6Ak)rKH<gZtuK4$Lk<*DLp7BP z5*1nIZgO+Sx7!<p+gXLxz~!Vj)+kHWis)k9STU^ol5=iYqQ0c^G1i5pdiBy2mR!Tq z6y0VSXgNvgDGK#z2bfdNpSTv3eOSqoURVkScUZY`EOaG5aLSQ7$q|B@P^xLyeo+bg zH=is~=+O|-V{kK?Hk96@u;1{GqWe-^>Y=!6&c@QD>UtX*R`^AB>jvMSK)yPyrjL3Q z4ld)mB5PnM-5`5nTmt%CTnN)WoL#&o;5GIerqNFZ7nJ%2h#B<IRoo7)sfM7Algn?B ziLM$uotKt6Hmmda^%r0K@)y78|NTkV=-s=pc%8$udOX87F%on|*RTINSxK95>(s<v zR?}0Y{NQ}LH?k8Z&y3DCd8!VNqMkfQkniyY<9pLG!#*xwg~x01ynfTWBYNQUxv=Gv z-;nowg7ivXnmuL%*I>YjV}p#VMIHf%d!2W6XUb^?wYNUO^%S^PTT(c*3`qrIi{W9? z6{RV2|D&Tlq>-$qMOoO0<kj>*%IK1BY)1~JZbd9;FfLqfnZ)MEsN7y17Ad#VxCF{A zP6aYqJ?V-e^3u`gtFqkekgB$75Ut))d)WdjH^*@&>yWLbd(APu8L_)uAi;0O^kV|B z=Px_i>z0zHia<B9LBV(u*CE0O6GlTp@N*qUUEXqEz${Y)H@w0bDMK92N!c^)JHm+e zA3eGy$oyVW3UnFEBpBo95>Y%#<uq}`Pn52R-?T!EfT(8tDr+Lb4J$?uvf_;hV%5f% zSu;7}SU-Q7RU~u~DlN#-L#?J_S-4Q<oxbha{0xV!!OK_XCR!5&0alMFw;d+(jMqVO zcea@?4a+wN<idG7TLLQN5&6cFQgE@bWrE{~ZF-PoGWE|P*Q~c5Sh+454KapyvNbW; zV36BX1{%~uUUE~~wuEebGZ+h>o#=Df0^R0k6bO`(vXSayw~C!~9oXki;e+YT9L7%o zINTLSkfP})O4D5!1|}*61F>^gqkaj>g8*pvDiixl?I(5b-NzDCq?A)9<x7EtstySG zJ0lBi+*jWO_4p2l7-&5UtK>k|xbGleM>x0o8`#6fIMzs0U&5w2t>?{Z$8zqM4MqHA z?zi&$M-aA2Ldkk+98A=v=K{j}<ZJ|1sa+<sFD3eLw}bAf8a(XHdZhw26F?~RLTV_J zl9@E5GMCS!f^tPMtkb1KdVpBg7D5bG>r!?gRom-YFGlFL&20CPV7`)Tj2IIu0}4|l zG)-1h>H)8=Pz<h|vLZoqQL!EF5GWu1G%^k}OBF(mr*K#xY4WBcn~^!tR~ETdh`D4Y zuzGQvK0`<<j&I6=u*)W^20A7CN}_nIj3A^)>SfTW?$8nllfoBqP?iVmj&a8P18)LO z9|DdyqAN=WU>ZNP+aIx~+$7r(Lp7W$AL?9Xf}ug_S4OC<Tro6j?gr|3o!qgUhInh} zqh|-Zd&l4GJl=n}gS$fyk6wIr{AmC2-l5(cngwCGRe(wL=p5FMaPOks2ymG8#-((a zdP|F#pWwddD1g^uua!qoG_HzJ<Jd)jI49L_+<&L%L=avIgr&h`P6Ul}35#lPOHxX0 zCST7P4}vCwsYsPFhc6(h<78`ub?{apn~T>v5dLcJ-4ZRx9*Jj+Pn0&XpwiB0v{L!U zlRkV2FZTmcc&UD(Q>BkAn}-ew>8J**sogEr(SGRlzf_IgaQj#Ww1*W`2*_62M{M#k z<!Q<~VgkukEAD-#31prkB4=?=aASpM7q*E(jDuZTavu-RhO=dWE!)15#gJ?t!Fu;> zHhAc`J=Pj8LZ7!5K<7bC{0g>I{BleIB6DFA_D86M-S_NaOP;$^CA`;+F3n~}tYKyE zzd2HA&t+6G+efrh=ul<pCCgqHYao3BaI-h?RWJtK?)296w2?(}P%>5lB%b+f8xUMl z=96Q<v0+RxZloP$Izlgnx7hAdPLmJ_gA-#|(5V$HqZKMySA@f-9W6u8362T^TnS5M z8c*6P9Zo(CX_Eq8ytO4Q^gmRpavN$63lBKKI<d5fRDYW6jJs^Og|fWa>4MX3<Ee-} zd#g*(kx<8TJw5JOTaAcIfh$%E2d0-Kfj6M`VQmO|fFGhPWI~|E%#<QV`#R}yjeyw? zluU(8*!FGAqwG^Q&zn#v&Z*E@6d`Q!wbkcP6BNrmoo=)-Vc5p`_bOvpgQW3WAQwx@ zX?o3A${h(#T_rdN$=qBwYCjsT;+c$p6^@jkPHr;x#0M-D3fTqYb|htu33n!y@KBO* zvy|Pj;4;VE1U6Ysuu3H2R6L7oD;%dw?LUJf&s2MOqB*c3OC(*SN9YpQOys1bg~Azo zE`##b{e&6^1Pam%G)YSCF~%`ZMNHxOFxql77bV;#0<{4O<!ZH<W0K3ESUONVO1B;M zXzqY;sx3TQotKztQVgxC+EnEo-Hsr!TOQ0oEcQS$rKgEz(<l$q=2p=^T8*MRDm!gu zq^_Hz5Dkvf8Icr~rj6Q4J4)pRsd7@*zR1pAbdhJl+Q~4Rlut1gR27~a_5rq>YtjPY zS9pa>QUktqifx%UE==jBnar@j5%k8bCX}ShjqMEH_26W7UClwt9@a>N@0U8k2o`xf z0i7^I?4s|gd|02Wp9?znJVpcnBX%c_*;wus*T*if`I>RNaAkw)A_jkr0jWtTINdOl zg0u2=z;CGYsm^cl*74X625NHp9wmLRI6=~O4A>9x&&9L-Ba%*Q0}32+o|G=jdPCq- zGdVTPKsHU;1Xwo1PR$$yeB(c1ZfvfoIn&{46g9Ilpn$|UgZ%im0sWb^&=*z4>68^n zD<?o<906!dom_NL6JYGEQcomFI3bcRiC;kxI<3D1wU-ba_q*O&4(069jL%U3_#%-o zPg-3qs}no1AI}%;6aHP3#PH+U(FEBEuZTHm2YCX|sr-S9Mu8Z(DjXrktJgw<_r^q6 zq(PT_U}Iy0M~V6Z3N^$BAiD}dH{T|2TQ@hqKptg8qz9fh+uP=z(!yu~Sv-T#TP#<V z3XWjdVSuU~l%OVV9@r@$J;zD1V*K>^Z;9y2mcu-8*4{2ot#$+Q=7)46#b^L&$nW_i zSrm9=%od`Pk~)EXm9_EAi9DHgAhiL^+oKjr1o^J(abrDvdyzIw(X6F1-`n~6FpEGH zp#l#EQL_a$<wUx3QlC|efepuPCE}QHg{Tpi!b_A#rXBY%Wf${CPI~k>iq8cgpU~Ru zbs{keMV?9yNRsvyzG%G^78wg)NG(!_<O|aP8cQZ=C0R7AM1t1JdY*9gW3oziCO<xD zC_4K{a#Ly3FF0Qwr0vz+=sez$WGn?-#H#K_JyY7aHP*yR*r>5&eG3kw0`s)5#Q{P@ z%k}e1kF-I%-#p}|?yflYhW^2DqUGWlP(T^MELWkeVHK)Rj1)rkC!lF60YyfN3Z!H$ z^rOY8mvZdjdv&}av6_#xMdFW!<tLQI{CM~a&g6mpB+$#TzX&Sdif^I$oKl`BqcSg% zXUVh|jUt#Fenmd(jr$4XozpxxK&p<PGy7NQU?(>cHX1ip1%8e}afv=cQ%!7QEX_k) zVjiD}khEGSFUF0A%f<l}7-(!g5lc+Ov;kqrnDMj7SMWSq1^AtIwv3&nPz|pAWjl)D zFS?R)rIjd=?&<-}#Fm*~_rWm2F)0gx->_MV^J<#1dd2G^Atu@`j8ZG?7<UAkActg? z+Q*JfZL1|M5mu<65Bq3jr(vfmF4(>H5{p_{s4XK(hdSk->?&!Vtk26SadpR?({@;C zd0x!Y>{%s;2uYrmvXK2Wn>jqgwPk(7<kN9`ap^T&9l;&Jj<GLTi)+ZBq}-zY#WXf& zG)eEtEWac;V)wxd4}`B|WzeLa7S&?;av34X$6aCmSREq#TlKA57eSGgmVwz)%mUE1 zuY>fp-GnMVMQTSviSjiiMVT>qv$A|FwMY@B`qd@m1PF28;F4TcQZGXiHxo-Tfmp_s z;K_!+xF+@_gkP7OG{1nxwETSPidky3KZ4vwVJOIaZX8!#Ooq*Ssv*ay@9Ut-2*O6< zjJkE)Qe;_qRU}sODLHvwv;2xl7pN0xNf3TH30MlL12ct^HI%zA1d~PAPPm5VFhUlJ z2~?_Ccp+*FA0%j=Nb^dhY8jvnHwt8Q`^wk%9R`dvs%~lhV}$9chC|GGVR+l_s6y!H z$BQ<z85hl84d}Y2c(toG^Xz;!oQ$skikj!T`bPv@#=Is$YH-fbKu^fC-lT%3Dt!GW z3Of_@2UBCvq_+VLYGgz>J3~H;hFCOh@#U)`yMi7FQE`aR*}0faMiZt?gLVB6a5U#0 zP%EujNt3$QS?lS}lRd1QcArFn%*gbD-4M@hlS?h%-Yp1Ff6nbL1~G|43FEB{`<&le zLqyX2O5_RiOZc^l&>O^RY;T8<Mdt$8FPSd_+G=Mt0}c^&gA8X9a9fDaw+G{DMh~J6 z6RK}-6X)=sL(1)kRo$Nsg*H2FAq?C`1E+bN2c&|4Yb5eknzHcw8<LDW=B{w0z)-sG zv@IYo>P^PbnYa7+N36(N0=b}f9>3T-KG^#&FZK`i9-;(E!enA6g-{nSW058#eK&JM zf~SS;blN>bT5@|ed+IIjNolalp!@+YT>^+u^xK9sQ}{WcDfTB?YIH#zUU5iIpFQ0J z7zmer-;%;en}MwcCtCCadj&3zK$>;g?~pOToFw7cg{<z3OXy1$cI$0nf)9$2s2OTw zM7Pv=00lTUh8U?LSqo&DF_~#N!^PgdTXx{kbYSF&4H&asNx1ZniU(jpF>=Z`=ND7* z23$>)rmo1yItaxndLlGt%eC?Nvh=@K27o=3`?&Gi#}*B;6)D-$t`0QwX<I|s^Js|a z;WT0$tCj{w_#j|6HPnm15Y?Mwid)?T=eKi_9fFQzh3=A+T%2~@DMlNpAmG`KwyFOX zI860j)xVfkoz>?7B%Msdnq6`{6{xtB&V?<Zt2>bI!A3*&AhK3kIVut+@G#y+;?Q00 zH(Fa^w?Z6yW2WBYZE6dt$Rk#BDVwEGgx4&wpgYnJT`hHsgHwrNc0`y&fkaQ7zMSTq zuv&x&trtCNtf*)ZJZZJyK~{+(hxolr-s>o{CA1oad+N@!O=8(b3AQm6nJ3e(3ND&) z0hZbdY=>_1AQR}~CX#8;_^}1UqM9ziGJfhppTBLRScFl#KeTUyGlw&eUm*zvbM10p zW&?3qtKjB%sM+04E=F!)<EWk<R*ZBX+)?L|NkC1CE1|*&kHQFdZGn)Tg`S8a8Q}U8 z)OU?ZO_Mk&lqOZU&od>-<$-KLcOE$vn067>$y!nGI$g$sKf;|>ce$&^mwZYsibK3V zW?-{7BV(f!jTk`MoIn#yhC!f7#rDC8YAA=h`HIDF$teY?nEtk|h!eiu6Nuj*awO}D zCgYJ!0gc=_1gUU(d0Ne8Rrle3SC<WBbQVlf@0f%u)<LseMvo}*JMt|Y{c!Wi@SW&^ z!gMH3iWT|$7@9!SyL-`R7*2ZD!9^;F?Ma@#t&xl)c?Kth)8l`+fOL_(D3mo`AxS~p zKXa_60DS@C$C2gm*})Ma`wsS>ejQJ(%|B_Q!yNh>&QdvI;v>s+_zuySTroKUDFDpN zA(6LTYNz2)lXs{Kw+x1n9g+i<iomK+>+Fd0gry&APqDwPIA@tOrMO&rkiF4ZVr)(3 z%5T1i0I6C4cUw|UK@gRUQ&GYxyhX~XG-)@h>9tnb#a2w;#dmGPFW~3UT>FNX1w>qn zco5S<v9*8)u~5v1_#|NDJVPi#0r)%@3y&U%t6YPz*LM(h61_-w6~#Dvjf#O?FU$bU zZDKgSn6Jw6<9Ufo-jFHOY`r=8$z~IhbitWj%5bo%Z@%?P)xH_{epWncg?(t7ieO|Z z@vA(TBO!p*Xv)%zUb^CYx6j)q)FPbOfT(OS-qqqOV|6iZu@%A`t6nQneWz2Z-UagN zt4kBwkPs7z&Nr{kG+Q26T1^MOHET)$@tKF=*3KII7+Duuh;R@Ns+Uo#uQJ(E8=>OW zt%|0)93byWm9Yq!>?0I)Har<t5IVeE`v4JG4Q1e%A%1GFz?xpZ3Nl()F!;Aj^nBwf zjlcL=0&L`X409iAJ)@Lv0&~uBll89~!aJ{;Fh*szV9e7j0f-TiEju@ZP3w<sc;YNf zy-@0z#_VWJod^+_edIthbB-{}e}J%2jHe5WVF+F{!AT-*Am9sxiyw*>QOQD?upypV z02X>m?~Y(=Tp|K~++?eeK!nBlX{y4@JMX02K&$A#WvIxsX2^f($G+XVK~C)-)S%ON zl5Mj^Pj&l}f5TQhCh|UO?G!23DEf79#NsI{0HJ_owjWbl`HAJP)-U)*H{!>#iM+g7 z6Ax`eS8Wm&Jci|&%#S`9=o3*TvdHoA!~KKfW1ve4zxs_{C>FqN2EE?$l4i#U;<&q_ z?)T0y+Ry%pd!v_TU8ZlK;WJzUgNrrS@YhCnM~&gU1`)dWD(y!&l4~WwsK=!LW-%A< zO!lc0k-BY3DurCf)4D5&df9CcB^kn=Y()An!a6wY!Y$C8=*<zaAWy}I;txC1mCsW@ z#WCr9Z}c`frkHh+JS`t-pjqNokW3BbavG`zSGE+nj2?F(=xvcWTO$SZIW*s}%>2s* z^3K#aXP=xvr(KP0hUi}F>*4IT7q448eX2?&Ng}UyvsYxksYd6U!9AJPcngUwQL^5e zRwu~50nN@9ufIKk9(e<57h0d{4RHAlt+io_e+E&3SNLr7#v8i-ne~`uRs=wAOcszw z_6Xb}mP|UVOyeSi=!zzj{kPNGHJsl3rmYr`YdWGpvpefaMlQXjTFm*X!27^c1oBsd zztS8pJWIG^atwleOItb}4PgKqNx5_{Q~`pEmTVia(k}z*kTCS^Kdm9P&IRHfRPEcM zQ<Sx2lw#hbG(-lwWwmeC_vBtjR$SMd%Hz{pxM`Kmrkp(a4XA47Nkw}NV|=0oQW>6E zv8(q)P>nBO6}-iP_Y?CnWX%)K9hV;z4LL%<3@j&*n4W67VfjF9@3H;muRoI;ZOIoP zC~f@W*LQyYtN;A-pa0q!ci2HNh=9R$xHDmHZr<LZykG{Jj-Mk4k%^6$+Y<KdZQPiN zieBu{RxpW}@uueTQ$9OLJB><_h%ECN@Jc){PWjz-?gE0Mm?z(eJ`u4l!f+|TI~4@~ ztmd)=Fek|GT*<_iDg-zb0%@9MGsnd+__U2^(nR3+5vKOr-js$_JDcWyl|SnVG%(Jc zGdm7X>J8Im8?zJDQ1N5UjS(W}=^b%v&>g4+uElnch#srz?Hd*Ryfm@Pe^f|pEcaqI z9M#Aj&f8ahOk04Jq~|9ccZPx0)cqH)!8=yc;OBQt{!Iv6NeJ|^Ow-ks*QDdm*S+)8 z;3P_d1cY-GFaJyfZU0)8?>~y#UG%O6QPN8|nKrOV38+e1BpZDuHht_fWn+j}4;ED8 z29!KH#Mj!T?j%k3%WcZbVj?Qqro5KiJV|$H)-9{OwW}-Wyo(iqk-!yzz1q(e6~M(_ zQsuOtN%oe_rnb>Er>x@9n#}>ucvj$+BVM0VQ$lY-8>+sG6nClKYkB<|4teNRkAw0R zXA7t7OPf`7TA~^CDDvM5daRg*B}2l|V+nqiD!+)|+?7^Nr|_(RhETqKf2L=>ZF3Y| zhs6Lx7IQ4`JD<I=Z+<|mL#V_nTCUxGjgzu)W9cNWxYSO8{Tl*F>P|KWg9oXzW#075 zb7$veplwuTW29@;$qNC0^=jR;@YUmIyZ;c#{9LKE$POKN-A~5rt&K0#T0{-?_(n>8 zSM_#cKTT6Au?IL2CTajPyD@aP0U&Qs;#Bh!kXQr3?2S!+`lsd~|AZcdIM3h11rZ_w zZf{FuW+Qy-ts8&pbjP=T)?NEkcynXZc(NYR)zW1xbe|e47X<HB>%vw6!6US_G@=r7 z4LirOm{YX><tv%r%+5yjdDS2GMu-HPrXD$wQW={G++p^f9v$yKd-8neC={{z^dFx* z#x^9`V$GE|zr*FJvsl^sH@)mn>Q%EQS#KWoh9g7~xXY)r<1QGuWcHD{(_*1MP+K{o zfnb*#23K{e=M6k{xNr;oZiiBf@e@Q#aNzmwY}9%O`w^@L_io(TynRE}jMx+I-FR{I zXyey69^4NNM#j4xo;prPdUr<XE{1TZ;svW5?Y$c}2RB;0aPHm>xZ*$uIlj@7V)_QX zj_d93>fyZ`G-hmXZM}d0e)Ij`Z%(GCTVLG1eP;_4eh7wn*4tp@7ZbtVXrcV}c*1ZC zxyDZ4Gi0AO4{fPNQ`6piV-<nJ-IQ_})SH`7b8h{Ci(~_rhnTOw*qZ)g^B0?UwqUiH zK}I^mI}By3p7yu+4Q7;ja)D&^_0}J%@moN$Ax&(4R}XI7r_M6RwS9QxrYzVvyd0L! zA;_Rn&q$dqQb4AgmPkaz3#sF}bo73^<CbTM1`}`Hc;P2At2oSE+%Vj6<N)ois>}&C zfeQ8J*-+&0LN%>g1@;aOo*fXe<$^}~k8aoYoAF%ieyAdMAp+W8SGYqA;V*J>!5G?Z zFbmYEOOD{%rSz4H;WX_K!f$sDp2FFZ2+y^D9xORo&0{+mL3%b(rk1wh3Iw98l@G?z zzALLySWLu>autR48>~1Zgv<jz)iRRY1A+dL*g0FhRt=_z=n66h#1_?+5zOO14LKk5 zavi@|OhyN1ruDKque}RWRheT07PjV{v!{eqVmAm+*)riYeE4Q<Se7JoF)k3mvN05g zDjSiTZO>LFoHNI6?cX&UK#QXQtFLb$#h)0#^v9Mm%?JV(rPW9ImW9hy3!(D#n9~Nw z8Ip#bc14R7A(NTi6E~0=E+R1I;XYZIrt~ISnC7wnEH$wPUOh%JgC2!@niz`*D+5+4 z3U*ArbrJa}+_nA~NPk!(vK8Bf@-by$^(V$npdyc`+-X(F^r?Xd!AJI4mvgap>`u8U z!jjh?C_C@Isrqm0*`@IT)&&ozn!gFqKdk_rvG--=)qwxUI-oiB;J6@dknOt=Kn-Es zw`-3qBrZCqO)robz0-7ZasHL$g+X{%r1n>fvh}QZ1ks7k)}oOUc_P=QX4nb1Fsd)$ z`Z}|=pIafHU1^9c?1!nKdTnjGXXH&2(GKud>#nrWqV-o#3h@58IOEae1{@u5P#MlH z@7<6>@z!#)ZWT5cb1O9*Hl#`{Y$iL7FY&~>WpG>akN2IIYV6wV!PmorY;_c=;vKEr z5WKIcHA(TGBWezrv9RA9^QubBTNJ4yI?hYZ>BM(XwCGc_m5{VxyFu*shYQLY!t$XC zEcsf<l`JV8#Vb(9_hG{$E<7C<A^C8!o=d?c`c>-7R_96+$HIQ{@~YQN9U?o%yiH<> z{ORS#p3D>&9JM_#GO70LljwrWxbn;0aw|WrrlFWM6(`nq`4_eDvn>ZFvk%=Pt)!mL zQmoX9+(0-l!2#_rSBy^v@-@W+lc%Ef`cg7m#D@@<WlhaXdd9GM3-{<;hqQ$|yeb&U zMtZZ>8{EG{3WxWi$v&d{z8IWZlasIuB+wYJtolIq#%j0Hv=fuQq~#vi8$1nE4Ts&+ zK+M^Rq?~k%;N~YoNsqH+=Ba%cQ{MU#?))toXhB89Yv74eempNv3G2f&ZN1kuB$Ant z&I&-tu4m<{P?JljggJ6-kvdPR#M#(<>{QAv+05E<P$W(IJ(q1HTS6{*TKUDkp**Ul zSb_H-2%Uv68=xhSz6DsB%a=H_$1>+CQG}LBNK^JS|070mtMk_HYU}0o<DQ7Y3g09r zUKf}kd=Tp*^a37C`ZYD+quy&#dso#KHQ`%GLc)ANTXNGLVih#*V2jpWM04W~(%I!E zPuib3hkocXHhLTV3tWo}-8iyRlmY_KjjYH=e+vlEOb(XP{fe<9%k_}PmV;Bl5-b?3 zuO*z@cs1xY(B#2$y<D*pzi#x^#@(Pc@0EH4l)0TdVnMeBGv;YEMe;J^0YY-`v~ii- z7r*!=j#1W0T+{L8jPnuLsbnNB_rxR3oYxKz#K8g<E6O#(9tUVcb=*Gd{b4d~^Az`b zH0i&srqpTUn^>icqXhjsw8`tT&ae-RtTr9IW=fVupt0pC8d?t?v~IsjqijQhS&-3l z?zY-+))NuCbfQYPwhWE}IhER3Ohd(^Wj5btD(6gJTjsWi_ZY2ycU}7fb`2bkxp_EW znsB7+=GF6qy`!Vw2b*Vp$d$H&5_Vfm7xNt1`T94_A9pVlX|a^iL|>>XKiMox8fBLX zDk&?$pe~G$8C%pB1EW0Nd-m8x_C*^mjn{vuX0LIr^0<~Qm!WwuTJ_HQ*i^S(Ukpcs z4P}h5XG68D(K#E;=_dAQ7Sp}=pyD+FV2MB5AJbh#;`y>|_sBH;w~f~drPM$D)Eloe z!i8>7xhcCzSH_(z+TWt9F^fE`si_85?2iD}-rLlG*O2%+fvPUsYoVWJApGqX?)IIp z&P$6KO^9tE-4qOuGch0(paR}%5S}|F=)#jtuZ=Zn*3l76jo{!f+rxqEm7x`y&MMhM zY~t1FWO|vsNW~o65;AJq&e}E^BVqRYW{x@8AG60P9s-+ZVp1=UmE&}$VS>O<o5t4t zbntmGV||?`P&mP9J+IEeXx(cQck)gs{>%eVC7v8QMC66JN@uXxzQ%#xB(hgLDY6dt zzS%q2Kl;7SzVYVB0TG{9rZH@UCKeiVklM51d1GY=Z%4y(h_F%5A#wQy;mNEdCm}~F zoV`nL{(Ok71YJCG&JE^}$#h9)Eu?<sQ5H$+;?P)@3qqGu83|}bt~j2DcP0PjBRNKd zDQnC!%Quyh{v%RzNr6J^V(Zy#=i_NFCbdNqZrP~JvDGdo3hkechZunJk^cvuN#|g- z#NsW;`?|k<n8YvZ<@3)KfX`dI;<g7?(6Tb5Nl76_S5wLs{!$W*xafJaEr_S#5!Rpi zEvDwA%GvO{YJkHe1Lwb?f6epWa9X!m3s3IdS1t27AG(@mt2e$hEIJ3o2HmrDv<fyw z)1HlTQI|wHE+o)3y6qVE9Eh0h&pxwK{Y%NK7NEonN}dhJqbK{NDjpeZOa_5ufl|V9 zCzFmTlQL&csJ^1i8ylGgtpUBTtlu7_ra=dD?cslL#3w|^baSuUmY+H^c!1x2NWKw! z=(O#$+OJs89guvN1se^y_9-$}jx9|AReqM$zBHc(1L`neksU$3u;vhw78rzHS=L%$ zv*tTzBQ0xO2Nt??fu~B&7v@k9i$(iS-R}5LDl`01GPdKv)IJdH(4RU;)YI+$vD<yw z?Y??-%f4K@(+<L#45FP6LwGdRyU^tv+=(E7QX@PGXD_XXn$GOU@FZIh0eyW+^g>66 zmuDxF@nsjDYUh(NW(42HFxXVxM^-s)E_`smlk>mRFCaZBLR-@)4WmkkA}^rW`N+p` z=7ToG9kV@N2RoZx>SU&h<?y-#wjh_sqI5%QQf-PXC2UmJecCiu?Z?$wx5csEYBxo_ ztUt`zvLMYh9C@kbqnvoWR3nrE(<AsT#IZ>e1|0qj8jF$^u0fJ_qy=2^l7(jyOY5HI z$>V`dlX9{!tP(^^o)|f7&L{sygA)0a4VUbbpQcMdlSo=usCtLy<(CE_<?NB6defEk z*Xg_r(TCVN8$@dH8}LBCneZDw^V)U|XXzd7<_~ndwB5}+arx8j3Ym&lJqRY_oM#;7 z0nnXIiUNTVL|)2SQZ76SNpa)8E?J$+oEYSUIah9&16|QEZa$DcQ(s$PEt6>2uop#0 z1zsFkOcMq(b=z2+&2QhJZ*1;LY+x|UAF7pUnDt{gh=Hke>@5Mfgf+oPgod3zh^z~+ zQr!+_xp3m3wIV2Cg}sz9{l!=qjD7qFAqUhHQ2rDJJnwpHsbO24TBxGKp2l2?-tT*} zbpXQ}Zc2qO_>39*SRV#~<T@Q@<{J&)A~powY~vRn{PREmGylNw{%(i}GCpqooy__p z+tcRRrGDqjzxz9+(XNq@6SttaG<rMl5rKAA?a{vKs`=LW?J*Mkk6UNhL$+OJKoeaf z;dBGI&5kDLH04*{Ary|Ge)X0B!c>4}%xH;?ec3x7;_ucc9!W{x--{p;i1rGWqE=ev zRXl^1%JTB~j0wyP<|vG9rV_rPGW2PDd+3s2OBsph+LNIF<|AAK@S(OacLp&|hH;E9 zJT>FV@Pu0Dmv+QOlk`U>>CQ)&>p)=5qRj_0)XX2z`DQ-Yeqf>yOPn=zx{UcC6~}h1 zH71QSRs0Smh7=3Xu>Pi+zQ&zQp@20P7nH`LZP}(J%XY?eV-2$PLb?gh?A#h<+g7kb zSYf4U5DR^&MH0u*`NN}Mhxyh^{~Wm!U%?KsL{Gt%L#X|Z%wO^J&|lg0#$eL{X4*%b zMo0_<-9|9fPC(Cy_Jd|%1A#C=_%#sHT&nnXxsXpwcJC1$QAPOi>%gjn6HLdrU5fPo ztYm^6QM@k`uU47xH9hcuD5tjdxo#WpVTlSIidWr1;5Mn=lnT#Jq0G>O-dXQF(Selw zC2(0w;c^%lQL6E~r224tEG?&x?d4m^^AQYiXUQ|S{m}u#Z;HrM3E_)ZE~R=Ir~-ZR z<xo3wM8jOX6@Kup83;e(kDSkGSy_`?l2pV`+iRkfa;tSCU6FUDZSM{rV$OKiWsH<^ z+x>>pWw@KwR5h+}#1XT8c5?Klde}1xs}!~es?aTiQsH{Z$@Il^RPKAZx<_z|H8-cE zqEDzT%O|wtTY`jJ4XB6GxZw@*#apIeqiN%L=r&CdE(mLwjP;gk_fjMWQREJJrDuYa z2Blz5vQ#MLPjymcvsQyd69QPh>0Q=H(}>wf)4QyZ6fFWlksbr^9l}`J{m9yOZv=-? z*?`nkngO-T@ygj9uKh$K3+H=XJ{XI26KNnDs}d6WtJ8Q?h)XI}1o8qD!->HhBetF| zn@r>t7>q>lOw|SpjP99eTk7y5nC1PvdchNh5(I>EO09GS;1BsMl<7IjPqVnkP&)!i zyI8=BcG;+<XWTog7Zi5dPhsGq0st4hdPqsEf@8DZ5{gb6b;Z*u8P*T0lOFDdeoQ^V zi@F*hyGmk~WMzIFDn!ssgvI~!-~aFbw*@B8up%Dz!REJ9fVG+V4O!X#hGCRc+niTZ z$jN8WVYDXWk;XEeO^}D<b+1Okca1^Y?2dmwxj<?TT&w^^3M|}jhNo|!x|v>JB1aq^ z07GojDQ-swfOk($@AWTx<NF&MH|x7w_gfRWuDLtz@a;gcBDxF-eu8pB+W<T_2e+ux zP+U?YG=MQ2M_sf#kq$<eo5+uDgj2)mx3`}?KiYrx^!PFSiXP{0AMQQcdGYv2U#BOF zWiS_IQn3|0Me|Ag%SiG?-#TGejJ6V4?yhdlNKipSeEA9nY#vONcUX?b4#LNA?13R3 zf4*FNV$Q4Vk123tRhILTro@dU%kt5gaOs1!tZk&okFU|1ABNCi5AnEKP(2x0K4k%Z z7c`}w{Omazeu0Bz>VeYwr{KNRy>pCuA=}J)mcw`wlg49rLrG2?+X~q&@xf`)lM5Ud zjFnc+8Z7Pht$@yyXo_5InNbOsEsw@`0%ZvuTQy0K--8J-Kg;&>sXaV38EV2F#gkR8 z``Nr0LyrqKIPmYG%P<K#H{r!o>sk#Sx+-lLH046ED`Ti>ohpTLS_+qzc~<0AAjGoa zDfE@$&v_{@rjz&La*-I)e0#cWiiJkLmIymA4X#Ncp;M>tiPsC~QoyoQ?rW4N+rMq1 zW;RFy>*P4(-P2bjbgK7!-<~D{m0l|-6Z@x@kR;<ahBI@8=ZzdQX{q-A`S1Vpf5Hn> z(tUE{5Y&d?<ZXDeU~Bxy`tzd^Q{`M+C@awrPcD?y%liuo2TFua`zDsGH}i1%Zc;m# zNu+p&t`fnFjq>AY3*J`oWnTJT|K$MLH<<)=8y&WY{IAS}+cX){`iPN87^P9pn9Don zz{6U8b!c@iG=7`clk^r$KPDE!9_LlGHyvpJ{HFEq|MmZqd()Z+%ck-<mZz<11a;5% z?f}Dw;U~nVhk(N^Pix*y{)D&>JnmGOcE`F#^sik^M?ic?F)!OU$*)Ky?VC6uTaszt zBzA9-%X)rDs)4N#LVkmyKvqhqhwxh*JX)MjSU}&8(MyNEDyC&Wh%$EOk6e`k^JoHi zhce|a1qnKyGA4dlNO*RrtDHSa4BRCeSVK;VB=wNQv4;Nr|M|E7{lESVX_4L_Pv1RW z5BV&1CUSQfk|5>6!u!H)6<|1V;#?CP%I#{(J742osyW@wAbH^GN!;kui?i3b&o!ep z5Tb=Q*@5Hs^(eh@e@0y_@`#gC$xC$w<jSN5+85d;m;pw8M<nOfox@5Oex~4ZLGN+* z;u6*k89H+;!Q`?rJtCPc$7QxC@H2DlddX<g#`%<u>sE?aV6AY*X)vUQXGo7I7x}eo z@(DL%EznW;l|w`)Z4_=zEg{h~w<H>^!OErxxhf)UJIkRm7;=%!ApF7NWTZnfKZ#pE zN!4dU!g*e2IV0R*)c7MHe*is#YIY=iJbuLc(MofjHyXgX<lIDKfN0_dVQ^(rP4i}3 z0xL=oz-nF#w8=98H>w_h<%v%KEKqPhs(C9@)&@63KNVqbC3bG<(SX=o*-0NwW=`l7 z%Fveb$Y##v8CQKkuNRS@l+88<AqeUyN@%&p<EDW-bOiADU&HN?7h_&~wm<&na2I;3 zql$Vpq%FSJ!pLCF>$H#d4xSu8KX~@_!Ojy%b3E6!-_=xd1zU-L)7V-nI9Q;zWq0zU z@NC7yXv%sSCoTRXd96Pi52n2*&LA_H24B@)Suon>mG-{tSE^Xt9fDCi^P7FFO{G>L zRUO*9Jj-Qt@9-h%>buqYQr3ldafwG+tI?z+vZn?vEHX>U2KdOji#6QYRk|Hk*OST2 zWS7I5UQ`)3s<e<A1#JjWT(;b*4b6$mYP<97eTxQP8ds}0hQ;>1@^~N&6(jl^%yK34 zVF4FG@=MGJT;-lvz5GTS(Dj*OQQ4W``<jy1Si2tLg4BK9QtxCMY654|%S0f6MUZ3g z^*8Ph#MB*DqW~<Nt3Q-28cPy!-$r@od)nUK-9P?%|LC_bzB=C7rPBT|<!EflZV@WT zmL_F&BOBY*1Ie;*9_{Ts*+rQ0VhGFgdqo)CM)?CwF3>%;I%WO_fjET>L7%kH_!itZ zj=5+qGbDD4YO7*_Z=I`D+MAiBqLstW;L;*Vy2*b?K9%M>D0dMs39lk#3F$t4$cU-# z!;1T_xofeo@8mW1<k}`v!)`CSt-xK1+6nt3-d*g|?miQhKr#^2H<Wn_pbq<!^XdS8 z$|L0Gjmzy$Mk6?zz;ubx(2*Le7WyXl*glMFJ*>{FF`Ntgm-}M|Xv1Ndaa`1mr5$h> zU7oUe1fodocH6kg1DF6~82F^z{rsCU3%J*b+Cx<1?D1rB&PzVQ%nvILoevb0#)^l` z8YPixV;!s@o(}5ERXpmS13RocX{HZ_Q6VE`4R{vUpG$Wq!|HwuC&N`LH^<~z517a? zuYjiJ7WT*I7c&ql{@t0LUQm>2#Mx4<EXKuB%{&u<?+T!(NM~Xc6JU;DyM9m1YrD=Z zPE`_6H;tO}BH=9-bFrdi11!F|7}sxxCkCTQcM>I>df~xljwL!s8iRUOK+GT0Zz+EY zE`jq&^8BoVef{znN0j69s`vKzf;X!tWt`Wb2*BoItZye%<YY4>22DARI0JGZxyqnH zj#UU=zA8(ZeFm2ztYhb5HW^KN;L6X{FNS;wDB%un1zo80;id3&=gA&qlQ!>QM}9ah zk_x)R@vPimMctEC)|g!^tQ^MZGva<ed~qL%4^rp^Cv&!_wFdcgJ_sVFErCQqWN(T^ zy}cbmX3qLXBArgupV9k?0_kG8p<K7!dN&zrVvz53=xEgl!m#X%^jBA-lkIIz(k&?D zD;&{W4#Q5nBdZYG;H}o-#W{0x(Sic`1y}uys*&*l8P=O^TN%_h<et@e$>`6BId$Y# zOX^CZ$JR4s=P~a6NZ#xp9`76+?ED@|NTDxH$g7#=)$s(5DANn1>jjLLHJnr6h6T;6 z>sxtI2Ulzc_AEfq?prXl#P;?#JC9%N9Utudmlyj7dk;;A^m8#ruR`Qgsi*8TWh4r- z=Imgt8%%q&5DsxoqF<4C@~E3m-P#Z@9^>OfmmMx!c(zVUK(%{jwQhhFQv2NQE$r4T z>uwvqL<6{=Vosqau?=bVnRBf9Vt>l8Hb%p<;S4>|F~H1vBf6gmk3%FGstA$UDJ^#J z-Jp7XaXPQ*r_Y}5VW2ys(d0czglZoppMR9P(uaIQ^2k#pCY_S6!ON^bJtX{jeOan0 z)g8J(k*l^aJ3F`Ywh)m;2*8CQ^K48`mV)4wF6G}22Y|ezz7f$WIOjRlcU2!*q`)m8 zi@1#&7qarVRr3eWCt}ATf3kc(U{53}@s5((a!|G6jpZPLz7sYW?v0OyY;XehmF&`w zXfdp5X_;a)xpH3BmQeJEbt8UKt{fE!eF4|hldja`O57ua2kdzA-Vk=F;kH>YVI5)T z#lk}GVNp-S<+1wr(Lh1D&B%3R9d)F%`s}2+9()8WIR`c6>}-Xt&YBR>Ejp2W8W^|( zT9LDKL_GGYue6dS0z#y<!Y9rbBdr!qzt)Q$HC7br&<aW@DPR;FVRG>^o{f|9mp$}z zl)W<Zq@CJHOS@IMu!ChH_}3}YD$yf1uv8Us)r*V^+O8q4#FSG8PTug|1yN=z$85M7 zX0*L6If4nia3tez1S69W3jPM9LDQ4jFFEJ<sVc7davh3A^J{lKUF~esPZ$)XCq1}( zuxVW)_!c42mIx@^X_~U3?ptg?4{)e{(<c`rrwl0Qpp51xxXs;LAl61WwF9G+p$?P7 ze5g(2a8)azJRzD9)i2rtVYPfVUm8naH6XfcNr{k5urw!c!=@-A$8`ybaV<f1+5Vd& z#jZ6_njUgw+i57F`*}&hQot!DFh_x?kMvyI!M<8>9k=Gkw%-19pWfJV=#kq3D;c@- z#|w?x9DQLPtv>Q&Q^`10ei8SMBn0fQE}3(*lc~wJx5YFQARBoZ6IGg=MU3pMbdgMA zSX)I!GrNEzQ3@nAt;44ZH9|zQK#PR>B>hma1Q#!?iLl48!p40Jn;Iw|nS1ApUv1vT z|L!0_7ed#XFl5X>1od&pDHA%oS`VUiARL*-@bDIHWUM+Ksia#cP2z`&QTP&#AHN%z ziaih}wgW1p-<<dB?ZL37hNX3geP;sq7g$Ik8Xw{U;z4gZ*yM3h?jEi;5A4O644IJU z&k&j5j+lZ|Cezp-Lsc>yyqKN*dS85Xfn1{}>9l`$h;V@Yr#N`+KRm`AkH0?N|N7~( zgFRSXAGEqnZ<)oz&m4Pl@K<AkA435gnF%#2VZo=-H3C&dD1(`np&<8#5`|Gj$8Cs+ zyx#i7oiCc&!}EA$JjVh04EC8RC0ad8w{N{{zrHxZg``pLT<IT!FuVf}M4CNYQ>-D= z_GkhELrz~P3Wg^`)E1v%|2s^bDUBJ&ql>XBhhq9dPXKl}#y=}lm!Fj%0tCv^*|?7r zSjf7?yrYl=8lHkHO@YI?2{!KxIp_|S>xP6GxDbxn^rAxiMzmtI!Nf}IRw*Din8I>3 z8=jxe^;UyQSP;056e>k+v*P%foP&b3Z*gwaPZ5+s^rBneCh#*69_%`oaRn!<H(1EV z#T@kP2H0`BRp-7Xd`D?PL9$IItix=!ehPo~GfxGUbRlsW>K%<ei<F&lyQR4cq=ETc z9qF;W2sBS9SAqG)72vXA$q)FhArp3B(J|S!R8JH<5B>byu8Yc${myWII&6JTjc^8w z43$GjZ-b;c47)N)F{9|D!Xs#TdmBlKP^N;bd>>q0hK%ES;8-Ycc4`P+=!DmH=;52d zpNI;(8a#h<E{L<)!te@mW#K9B;24cAmFsG_b5Ms)CH2un-wMZg$zEJk#ACeImq8`m zMoFViHF(&Y^?W6joL^8SEf4i~qO3N01oSbm_N}44zk@x)i5q7Y>?M!`f-W)a@Mk=Q zq7{}d?;wq2PInvkq3sTt&JVtfQWMmanvIQnbg(*t#w6ZhN3@H2zfH`@jfg|h)D|j8 zH`Lr&a~oEk=N_S$6x!qpZ5ZrNrVAU&42*@=hU1O<9Q}Y($@{kxcTU5ABq5ecA)E?3 zL|`i%5`JdT;hFM}gomvto2=<>N2C!JxBDgjjIy1WqCB^@O|K9oJpUs<;zzd)PYZnJ zk3al{4KP@_)*&#JJA^buQ>CCOu_ln|@-7AHB%NT0VOXDlfffNru<A>N!u4NzU*ZJC zav@JB6)16sQn`pvlnR6_p!6QQ&p-l-oGl!@qEs;A8ifL|RhR@!GB+-BWQi*Bb1A2Q zA0aL_AkKi8wn+bx)0fr)6=@wOj>i;dOU0CDpGIuQDLJC28}|*7KLThPAb~}fF1N+& zRHF9Eut|Tq-vGN&?+TOfFD(!<T008<Wvz^e^?)YESAje(fMF1IJBI59U16wkQG{zZ zfSxRisK@YKb7woj#@gIZw3TX%i%aTQ7y)-yxAQjQthCe?xBbG#K?d7*V;A8fT-<cH z5*wQ=uG__J^9-3S_r^}5HNUv=y-=`dYBc5(hTv@sru-~%3`^yP#ru$BsZl1&@@kL! zFHucFnuC2;qSx|QbAc^w2MT)O&9x4~$R#R28t5s1%mp{vOcYMmSr#y-G!4!;P>p}@ z&X9Hzg;f={{q#U%%O|_HKvp<S;K%~6jo>8V)P2gRd72=vGv^?Fh1@^);4tH%LECLO zFyzRI$u9o&AqOi%`Vin_)QMD{pa_L9yqJA!x$H5DhAdi3g-=kRK&^UkfWjd^`mjRC zd9}&t5sH-9u9hslL4}AqwPf@NMLzU+v=%aI!dT*#2FTJYREb!o7L6XE2no-iPrl+& zJfr@wl}xL=h|XV;_QxJHDv2Qj<>tpMCC6NGqXs9etXQZq+8TEov@JGYi&IDTfCc)M zNW{zaE>wm{3yFe71jVTCqBxa!WPaWH6&ja-6sCfVdZ3w95W0RcEq8XPQ%tFFWpv9C zv>caY(~8-nQL~9mCdR#31P-7Mg)!Ce83VAjC8nHL2V-3AvH{q$Vj$vq#8{}5j~d;- z!t!AuGH^@|UFeJk1*h)nyKkt>?!nVkMbZWbIvJExI4aWb7pZe?C`$1G%_PQmE?fpo zK*RYc*X@n_$hTAPkB{C|PvER!bGxn3!bshlYcod0URr-{a=G`@2`mJ>Oc}<nE7Uhv zlYBeB8LHOKl=4%&;;bIvFviqk|Gu!U%_NuO)xAmZ6>x?K4_Kw@sN>YLrD2*<4Nin1 zWITI?zx|3c`qvy}R>_~{6_XK3wd7e=DIM!t^dKwVF!r_5bFG|j2xhS_v9gjmhw!x@ z(1-X$N-GKLw%kNb5;?LJq%;5ssm^w?RVaP9W&6F7B*ezJi>ApbcLcRDPNRA-G2>aX zo1|8V;B+*=RkRMJhj8^bjioUE<zb+Qy}I8!uLf7^XdcOYoLH2nxM8O1K1Fsv`A2=O z3tswK?!|04s=L2~qEZXmz>}4ODw_T5jav&Z`8k6*rxBp$7WU}^qhSMb&X^l(u~aka zX?F!so{9ad?C|f*Q_g=Y&IkYS;_Uo6_XV0!p`sOZ{KPKq1HiN)o0R}n@O9Un%!;hk zo6mEnUv)d1-&(^?Grtmdg!v_urSM#g!Tq%E>ZA#{E00EEj8n>(=b3I@L}AnM*^X#P z{F`^Udg3>FYk!b;__Ds+V4LsZE&@ky*jJ$=gG&m$V&MAz{>=~}mprI4Kc+nathWY} z)_5{A9#HoD>e7c69J}>!{$YOV{SodUp&n<dzKH!EQqdLN$Y~}5bu~J18<%xbaX`S- z^3fRvI1s}FLjj)dJ$u@|WsRO@v(5doB^Co`mVdp9Yjz=YglD=AMVnhRk%?U&Te@9E zI;~mOsI}ht`A971m^*M26|qncSH0NhsbW?Rk5Roj=>=EwD<z{+gz+0cA%Nm`w#$fK z=RR5Icb2i1igTX%X`78xajh=$O16LPKJQ#kAgE@7l=T)U4@g!2aooXEUCL_9z%PN^ z@QJk@d9nh@nK$XK3S0}^tLatp@m;IcnL3zgr}fXkzGhcxFYA%BC1?}Xzw;TR`!AT@ zb0@NfJP$66z0v#LWsMuNW(+!OZ?@gR5$Z8!;q`sN3qnn!1NtW8YPVqMXlXb_R<Y_` z52<zJSQ6|d^V$^l{RI9uQG12X;qx@Okihh1O3$jZ^M}LOsj<-L@v(S{_GWSS9FFnD zz`n0p{g7;W;JrKxZPnO~>2PyGcO^&+k02;48dO?mKeX~km1S=tYe^U28gyWQYyeXD z9bO|lo%{}GZaun?E||7r7QUcCo<PeDh5=gKm;Az}VJGsvv+V`_8l{ADq5Qy8G<1h9 z&A-f>+%%`hJV_tlaP^jC>@zu!Tv|QrbEtc4s;#JXZs%7Db(yk$%pJ%yDqxLB_Mf?j ztP#>S&>2s3M!wDh&`j=nt8a(fG`-{IR}urs{L!Q+u<5*3>IVXHwOTiQM8jYe&99VW z+FgSF1}?BTq8mK7zSN0uubI?v?i^_5L^A`XF_ViBerQaI2)hNP)iR;LDocNe4(O3b z*$ezZX1Douz~W9J&chY6H=SwCv)*^8cYC>dI|Hy^czH^nklGnfvt*Z#Ahg%W`|ZZ` zflCth!d5|Hh5cLN_`8SI88VlcKaDyZS6pKZe=DBE({A*uv9c=19`1KlS}=(d3P8Dn zCT;+mr$3iFfqZd4hkEVgF1)`;xy#n%KGBd$r4d*IDF|g&E!)o_4v1&HuCXSq0HEp@ zcaW8Ty2`k;+M&1=8{}Kf<c{&N>OQ%k3n*+k%x9w*wq=Z{*R{Gp^H;h0QbmRJ$0eOZ z(c&~WbBjKL*C*nC7dQU!LQk6&M8MGnwrS3GolKb>a;Zx*)2PAfB6+P|+bHivlaD5# zx*V?p!(+*~Q5^H0z220P3shiO(_dFe83ei<=sJpV#NkUKBr~8Sd69b!egy8_P*)dp z;pJgNX6Lx*z7g&8%6d?BsXbQ+QY7|#Ot!3Ro9@R>S!1z=NrKP(!$}|MiY{IYB|xL~ z4pB47Nat(ry@<KX+iP`j1y*5Kj&RX2bfnDa#LHk+4gcZFc%w)+t?Dm9$Q70QroCcA z&XY=q>-6-pK_8!pi%;>Dzp<kDI=_lfTU1wvq>2O(n)@%(SKQ*0XM-Vfd7Y&xb428l zKn2WRS_NmdW9cPn3eWrR(=0!Dm|q2mhcg)Vlloj3I3=V{$3p^Ac#5-M`m{dAc=Crp zeb#J^ivcwNDKD>LWAc1zu6#bO-(1WFllS9eJHbi8`h0Y3!=zmqvjl7vn_D-n8l?L# zyh4}^_U-h=Wi2zs<D?&cUos3mM8=lgqh|-dKR(=hzH_jHuUcDQ?;Y<Q9K?^nG>*U7 zJ2>QpMEeh8!;;zVloiG271LdKRS^Wc_U(e9hrS!3?bKcqWOE}K=bSZ2nGja0!4pk? zqMidP$mSxo&KM6b=REi)619KZU&gBBYK!8ihQi+{eacbfB@x{W!cDgZ*^7bEaUY{8 zZp;GWBzYN9;8GDNIfJK`<jAvK)%oKMYD2DPPCf8R$d%fJ^U*jpyX99sq(s7jA$cvi z7y?fan{LBC67|WRM4(awU<3SJ^QnS?&7)l6D3X?n)DW(?IBBiX@G!n$`a6wE+@;}x zT{Fg!=Z9wPm+@bszTkVESbRg4=z(&4cEsra%d?Zo_)?$QJ6hC=VqWQ$a4ehkrOpZf zj{BUJQ=0)af)maE61t12C#mZmhs`7+$vLb+rQw?>jnXvY2gYHp)jAjf%XMQQ5z`6} zY%r}Dh_#5PV%*d;G3pfX>7W%kshM}WZrL3_Mz>PHWDd)9U^Q>`R*2yrZiO00(S?UO zDKc%AW{feU5FPXowEX5A6NFS-@rc*7ju=s%<H!%?351=nTjIr)0=f3zrf-ctPg@Gw z_j)Zg4*6^vDdaM=2;lAQVXY5#pb&hA)M#lPflK58op{mJD%C=7D>{=l@7IHcJ5DBb zV`D=>z0uO}^8pwFV$PY8OS^1gvr)f<8b>`EEYVzx!D{cS%@&;ZToCDdWHFSNZ+ggS z(!&LR*u3AKPln?eGpxn9E@}*y7{-m_FuHCW-C!U%<<A|68AO*Zi18>2BT&2;aUGes zFji)6JG+1>w?_7&YKl7y5etGIC660!I>by~8l($*J*An|wlJJAbzKYT=ul?b>R;5e z$(cuVy?G<WnB#Ol#qf$`5^|{$i4YG>v#!WeEI4f6u=GH;Zc+n=e%8AbgutBr9%03L z`y;uN+&VzQ!Zs#R$4e88A28g>VNW;vRJsb*-eI{XC;_)Sd^<dc&(=3w(a-}XXqDyo zP8@@A2V=0GkQn({fV3OSA}yj(vy237xGD;l!$><0GccM%w4(YB3VG5ovdYaxmp0NS z0fw`q6!@OT6qscSWSuWePiF3$;3yDi8gnGEpi$IpZ_BNAo!EZX{_LMN9(22dpS^th z<m*=t);=4WO9~{6Zz1;QC7>}1j+VmdGw}h8){UF>jZH>L2ZIPV7oF)A)-DvXB0OXQ z!2<a*B`eSG**5V4#pp3DVJ4*F*k%`uU=ojeV-WlxY&;3`5pwvvTa}#qHF7Ohv!4nX z9xa-<Ge1D!7{J@$afIr$4X?z+-TC=1|2|l_u&bGqN9)e**4wY>R3f=u9LY8x1RG_u zVE?r0>tqU=U?%a#+nX{Cup?>I9nw=Ok%c8i8bd8eKB=<?pLtC3mv880o2T~nD_NuF z>{w!J%eDC_r=zbTI_|a;P+x+A#UjMZfHXrTn3P#|HN17&MfqfLhcTxuto7`Y+=Vq< zyqZZ*Wp`i8X#3M%jhi>IDqto8?*yBbm}@-3s5KMqKt!OBt=JS-CjSRlHujlhWk=F0 z=V&3YZSWZM4lqO{2z!Kx&n!oq=!zl(B@a6kL<YTSZER?1^#yC~KHfJsB1il^3T-kM zBQrS+<PxWy1kGYB&=G~SD&*Bz0nSZjmgU)LlOi(g#8dQILsvX>s$#>)_5K0!0A0Xw zU_4956L5{DB517XmG400rL^%7d@&wVZ$hK%UB>V+os%&;-cl3a{Xa_LJos$c41E`4 zvGLbmRg9vwY8D}vrZT+qsieFLfsqMw4e+eq6vN~}(G&eLnCQL6sTfw(e-%3d0-x+? z&_sZ5j)H*DY3T&7l7c0!v~Z2M1-)bXR6k1D;kdn>@FD@(-6Eh8s0f)S&g<Rl^Zi9N zTQ+b_DIwWe2+$O9NU#wcPbe!(xLUlY-~`-+X}@%2;xj!_<L<JCq-p&LEU2Va=nlZ~ zBp(`<#LM=kIVW$9;l4q?;`Db^U=vL-&2Uu8J#<A`Dr?X`O!ANT(DEig8AM)wSER4J zD3|yg4gk@-prFOmhF;@2<GgZ8+zKf7U)(TRH@~x%pq3lSdzKagv1Wb-$ER?u*lxX` z4$p0V>axtmix6*FRvB%T<Y;y*r~e!#PpT~Be-#x1<>5DQ`jA(r94d#}L*`+S#ZywG zHgnHn>E-s5F<rvx-ArR_<Nh^oRHe?t=}1PFYG;M=8~24`=^txkrOv~Vk#^#(rCg)H zW|!Y$1V6m&2+|-<&v#Ew@AWTx<NF&M$Y3W)wQ)nMk+Y!fK$0KsK-G8PaNDh7KGZUh zo)kGOem>UTBm|xUktpfsxT-HiUHhvEgwX~>QH>G28mfyT^16F0LVE-~7|*B%?Krzr zV^qWX*_sXU4>p9*kCOAkgmsaat2q2PSX{8AVq7l0w&H3()gp_aSZ%c>RX@_Q8x~0B zY6~xc_a|O~!f1F^=asc!e@zPyI^dHY(xyMI-c=(gJiWcrPoprpY}0pQa0@rl*?SBc z&~9HtTgDq^9)?zP-w#<$5gr;beKF59)btG@PQ63sUPeumvQ45~KHPfYfEp`v&iLLb z!3do(<1KTn`*49oAP&x2KS1RwhVkH;O9?`;r+ze@oawoPM~*=Hhp($K3>$wjyr(S^ zh1Fhc9ybb3Hvg!fg;<(ody(F*fo7VRcr1Qov{n@97jB^Lc>7#U{YDViLoPN$A`_B$ z!t|CG%s-Z3fviRJk_JvYoTSLnuW^Pv^@2>&=@xy<!33A?TE97_lr0zAEw2u#P?nLA z^c<SDS*3u6niH;>Jf?_GGx9Nm-nh@fBTgds&Jcd?36QP0;GUxE?H`E~9K_=L5TQCO z9%dIE?bg!#`!Og4=c5sXVbVTei0ivO)d{t^rsAbsp7M6Xac@o=bLgQBM>nYnB_}V; zz7?<>;)APt2#KE&OW}OJluYL)Ci@kX>^3Z@I5GMbBUWu?jo6p(&LRIU*(m5dLtnr_ z38&vtEYx<xGW!{~xMc<+jzNeJDvm>5a#8Eng1FhaNHJ~2RF*@!3|O*jG=UYxk3~Dk zYWOytTnXJ0ioxJ0Y+`!PI)W>{kG5XUjN9*<w!J1~d9<zh3(Rz<B#%fF%F5=Y)77+L zDS`MVFt2XAxmj<40Ym$@DQ!U4V|0EE3|Gp=oLMR+R2uJ*Qo{FNCb>mC&4K)w;$O5s zVqbg@bzrOp&N__|&N=#MJg_)%l4~)Y3lEf^cOoxz6n6H|ZnxkqpSsKEMz}S*6&i<n z@BR%+;I8c-h(GwM{rNEn;U~R0VnJsE^=IxhLnK>)?1eb_XW46=R`}~UL|}V+?;nr$ zp3*P&P_m2CYg#Upkh??a{-NYoTB)wlwWKg|@qag)_S)e3Lk+$_%xdew1Bk2AiFqgy z8Ks7a4Z9GOkMbfXAH`8z2du=;@)F~&+V@S%Zec*ahSb=9iwHglj_XiQoip?hI$m>J zIH7V^<VrezokD|klb2ks5qImf1=60JLY%B~g;oE(zSU$~^-ID&;ok^{&nXwD0)1GT z6JYk8Y<dxI3_bU|>X`Zk*zJyqjfTC)wpr@ku_ka+`HyI9S_XKvEFdTv(M!D0EJXZk z$&7OvPZ<&9E>45!D|bj2iZl_h?InU_A=X)|JbUG*gul>3!x7!W#J`1F(e9=+onbtl z@#PTR47xXThVykDs9%8%$kuGL@+JpG`VI{1aknjQ4nhN@(G1!@hvhwI^GxB*7eqWq z@h=jYk=}}Z+-l(>AJGscYuE3O8~2er4_gVnh>f4p(auvBld+5a=jdQ(|LIY_3k$I( z4L^T#eu$QghoZDQ?ZIsp94+M^Aq?Qn%fXQ2M;6+$P&5gYcKxjxyRgRMno$6Di5GKW zaogK~Hy&wv?zRmIbj3yqO4{s;r~mNu*|!e+oVmnpsniq<)nCH*kcAcQ?d=-7K#fbN z;OJDYkxoWD8b5Czwxipt^bX9ezmcO4NFUKL0F*bKId<kR-J7#=7xECgh<9-dk#iBZ zJ)cmB=s|4b{a)~~aZ^B7UPh#(-raU0h1eHK^z9jvDvOzCGOmyu3tfocwBgOr@A`2T z?L4-(#RL2xINkORG)<lR6?`X*V?1nrun^+D6S)LY?msM%QEFJR&@Y862LlZl43ib- zG%}9>Nv&EhJGa+UExFD=2(ZjGFB}%vvk|@!<92}1HROPqp1y-fefyQHLFXS)c)w62 z;Z;_L{ps*r7-rr=&i+E+7E+DFxm^x$-i8C7+{n$9VbR>6r{XC_)e^Y!BzBx~=O8}< zcn!{3!tq9SwNdQZNNb#yxzzkJ8;;FT99#+IxHH^(>+k2nxe%vw$z`o>2*0L;k8^5M zbatbnc@9PwLh5E8?AR@O@wwz`N1Baltm~bo=#$}hU}T^V@I^4_Gf~VpjYid-=IlWs zv9lE3;d<2GdOaL(8Rh~J<3q+bcP4&}vs_Hm{+Iuz;y|d4<(hInIU=epvG@}6R;0;f zgOCWeAQ4c+SlwE7d<-wK<71he&CM<R*M}f(m1?yO)3<6h_LTCqvYt=XMH#T3r+GZB zsZ9f`6bl90!)(|Ou1Pe<eNjjnt75P-H+a04Eg_B%m{bN#?Nnb(EBAblJ}?xcK-KH5 z+rRqNuM!e<RuEUkH09DA{Ds*(e()1Qa>YqdYzS%y$fw#F2<jv-9PyZ3-*#>LRz*B; z6WrnD0>E8>R!;}{q<Jkaj})NH$b@Q*VYX462#W_JJm-W$iG(KRCH`dtVTw1eqQ@Ii z$Wnb)Fs$RX-E!hM=E(6CrBWXzUBB65N=eXln9JThG9CFDBOF9`@%6`&3G(gyF;7)f zpvr|ih?VDUfD#$Q@bm(yP0-o4jU`A$(}m40Fz#Is>rN3hHv!C5kmI&j<1c5C1YJHt z9yF8v9xq?1J*L*7+(eQLgrmq7s;?OoOBb3uxP7^eGs^U`4VMV{#;ZEhJu=YtMvaI@ zSNLMeo@D_B9JA<5tFsoYN-Lu+oX%_?_Un16p4&$ggDx0A#v9^=$fKI9*c6xRD^pt= z?96-bAwUcFow^I#LaL~@TN2|yr#{S}2DgS3FRH2R9Je}tJ`RDKbV3xzd}gETC+sRn z!}K@8o=k1ndMW5@|3s7n24w@aRUn$NRZn1#hf`>cvoGWg<kLW$Z|G#&d2kD4xH_#v zl1F&9HK7PIp>%)No4#d)7;KD_b29JV=+BRi3u)O3<eRd;CmPXLL;PSsg$eMx5(~WA zcDEFdb8z{cob_T(dCh#`upt>=0jX;e@hqnKL(Nv_f}j&e92_-1GYvCzl@_*E=fPd( z(i!%vBmBJovbXWCI~)Jkaku;3uTD1b@5#w4^X&G<e-0ma@p<)m`Q0l7o)tPm4omc9 zUR-N;IG|TdBK!KX)$OifOp-2>_en6WXx^xfF|2T~pWovCfflgH-%JLpSMPQ^-R`Z= z(&aCwNjFn-OiM~gYk?bQPHbUg;vy8I)r8^NK;~{2?ocRU{}%HNtlq6hknQi7F}pbM zA<yxZ`&hgqCnDQ5$+cD@ykW@GEf5zwa1-io2p9D9XpL}z7yJ$x?Drmyf&(PsxPkM5 zncw1+q@v*BfkNRcbj?iwx0X#1p-WXYS1y7RPH?e2I;TZl*Ds{am_aS<!HyZ3u?M`b zoVyH&pRGd>hN|>}xqjK9$Wx{tFOLaEwrR=>2aW}2)*U0Y{VP+Q>z-Eb6=7|E?)x=f zYMO>~SSxjNaynQT09C9BWH!Xk33M!VOKl0}bg0tlt(EZ=!eBH%u*De5ld1<*u@FLp zWGxc}mmop~1XB-Z7jgiruh9GI@a~*oCa4}HB0>$}dPzc-Odq4k<gJQ0Z&+zGe5<)- zwpZ_c^%@&1SFt2~qdOC)C90C6mH1&)7c_5|L%n@tW#SE*>CSHAtny`%gd@N~zu`(+ zxzFrmcg+&Yg4D1jK?UL;7zK1eHw+IydV@rMW`#0Il(n!U9&0oko<rLzg0?%VbjKT< z-<Wl9GmK8=)XG4lGzasdG+BTIjGe544E{=B#Ny!6ymw7OS#OyXmz^6NBq>3KH#?Yg z{$<q6pK9`XuIe^dM9U&QLq=0e$<OV5-Yzt5A@iO@G+vC=8w~Oq(y3sk>&@1_XWSRU zwv8%s%Nb!eti@=$jw2Dc5>>xsW5_S`4#s0-o<T-PoSu-6p+29C2V`G#Ck=N1*~g4l z+a9zy>)C-Sp3Q4oI?hd(lUL3}m`+PcYs#yWo{i{EsrpoCyyvK8U4jVaKl~#@188Sp z+OLBPtdnXcu}q(DIp7L!L+!2Tt+2r<bLzlPK4~lD;X2T?gbRquM!PZrE?j5ryHFZa zjJf}G0{batfdS-`J~CY0g`GrSg&;3S(yQ0_y`|Jxc!OYvvseA2Y_Fg54luAdYeps{ zMq_SN3+o~V^7&m}9)_4>(VO4hl3zCH81iUu@CSy>%6cMJvAF3My&=Nmo8c*i9X3Pr z4{$wQ9bYTgu$wHTG&NW#bW8`QgE7hOgb1pc9TSd>FbNpvRJ|ij$%L%MrZAJFi#%N- z(fg$eQ%q<j=Vs6ou09@8Gh^gT4*c~6ayo-&SuUgaA+He?^IcWt)c0ObM#ghPthOr~ z6w4OC+&a5>p|o0`tMrc@u#a>=ycupxpFQkQ@S)-<L`F)tU9<XI@h~!0kZWUw8E4#f zF>on0ToXrbRinBpGpUR>8IkSrocK?_YXD~zGRu<9TQ;3CPVnOymPhYgws;(vsRD~0 z(tx!yo%SwMSk#7PZb$nnY^T%E0^|t?2xSY}HdOnGUr}~LFI@T2xIN@bNrv<k67DcA zNsi4!q(xRwF=XqTJVrF4YfdP!&Np=9OQm>SgP+Ha%_?NurtR|U$Irgnd3^Y?eSB;L zldPC^&iDA^PU7jH0T@ntkH@qWmIbxVh=pb(iBqXQ+YsuO9%S2Hdp)-_YmiWe<BO{G zMLZV1<Hys5{w_T!Vp5$71eUnvxWy&0jcF-Omv7m(N*utA%6ZD}KWyE<*ZTEsd{VSU z>5y{fN|%ay3mYg8CR=;si?gj4;Qjo<Ttg<Oxy8%sjeUifiE40d&3V7wkJKawzl+V{ zS_U6OtEeb6?&sC7F2~$bE{mJ9<tj61$ArQ1_gL>SNvEDv;yePwa%n+MuU#ab-1yXk z#$O?uE!u6J$a1Jq=?N6Nw>Yhf`f~+<C(5&H+6>(ZU`e!ECmJzyhsd=rvVF^7crcuH z)(nDu*&h$f=pXVP?nI%Qvl-O^Xz?sxH@=ZkoUt*NI|JA-+}$eJcf!mB%S?*(_p-EZ zey5n_G-x6Sf4c}K#FU0WP=qIQCt8uj(Y&K?h?wy8!ErrS^eCZQs1qt@ch`e?wv?>Y z;)q{5oV>zh$PEE8A;cWR!CeT*y=Hb1;<7}*4wM+)>p`DK9b(BOps-d|ye713l6P&{ zV{_yTMS9ziI6zR~YUJmk3q#lfr^0FhW1xIsO<33Yai)u7d8WM^`IopuQSA*C>5zFI zit<r~5b-5>yk<*=IR+`XlRQ*7I3<f>A+(vwZeb0#DLEz2`~e{*38}NHF;0i);H$hk z3kC#HBskkyI?l-$iR#5BGe+j?$@n@3c1^_Xj)ZflX=R#e|NDRYAOHJ*{adRAEs$8J zRLP0p7LPNKJRJ0_jwMB1ZI=zmWV5Bsp~Y|skgYA8-M>V7@C=8mJmd|aJx8UTHgbxd zR}w^y4UoB(8o5YRlIOwbCco`%u_gVOv+M!-3FjAzWg3BT*OpxJYU2*NUD|9J{*U!t zGwg`J4=QBiMHrF`?11tJ$5`H-hHv5kE4<F8L^m!>J*zg0mwYnCk>hzYs}6WB_Kc`f zoH<3~=Ht!KDK)4V2d(g4l_zkZhI(%w17T`fcr{&!Urd-GS(e%S(geop$m*BvxrJ44 z&>&oVIv=c*LYLzJSLa1@2g3cUkuNO=S<20%)(J8u!PIj!ImP|dOhD4StmC4k*2q9U z?Qq7CRVFU}vW*$XW!dA?y}>D66bfS8a>Ll4b=$a<d^Uxb2=+N_iehJ=ybC3&TB^7l zWCIixy7GSGoGnsv3HarDr+@+BTGa1nO3#}1O&q>p)i2zO!<PA3efwZ7zj*nJpT+I$ z$9IH~Q;W_?e6Oitx1i6!YXoTH!$Ey$op};3*D2BBHdfOCdD-SLT<|1hQINK9wI#qp zY%Yu$6E!Ee>Y<Z3YGekS<sd3e^J3(A=5n=e;Vlt@508eJH7*4^8tKk9u3i-|IP`AY z>CR{4N*!cUPE4XD*8eq=x(xdwKJ1U5PR8cJv)2qYCS2uBV2OIA?O<`WWj2Pzt(3Uf zVgmcXEn+cPA8WG+3>!s_8+;Ky4sTwJ(-L1kRiazKnHRTxH8yfp9&Dh#b}nq&{Tl=R zi5ak+i0kIPo(r$>N?IHt;Qb>va8mIzSF|gX4~gCfp~4v^Z#vlD9Pg*uRqyGBB<R0~ zcFN#!CUzdG^}o~hg^U&~f{TGr2e<?iA`MQea2d!)=~~LlMlD(WZ2jC^x}CT5)g||- zj#DAqlJ-FBcX=6cy^CB9uVHaQOIhIVvMGR}F3upsGmjPg$OdMfF{U%%*o+1iy>udZ zQ)oBZ7`8Mw@nO(hc>~y)(GiUvx$vcCb1wONjTB`R_C!iIO3KVtfh+TRG)-*DF9`k$ zkfuw6Gwcz$aUXsrlJCvLIM)GLyZUlM@|Cn9v5GyS^GTZgCZ8L*h}4j>?Tzhay}4=M zQ-v!@n~4(GkA2jb9D#*2KLu#OwPXoat#}%H@2HuHb@iHFPsh=))uy3WpBn=Q0EcMb zQF33;shs{vIBdv!L-7t6JBE@7W%65p>Or@qH|`G^!Z*6WaZemL#OWNJC=kh%{g5hj zO~WrO#KHXAsT|hNpgtu6F`Gdm*&rC)w8GhFzGg_<Gq|y=KxV_-XdJIj{Brs<d{5nB z@F-Hi5We&oe#_PZ9dQz9{Q;5Hx`x2k)qeST>q}XmE8fjL9lirp8G#giY(k=0_o=}n z{A6fXZ<~nUm2Sbd84+YK-#e46=q;Ra8dP0n=D3iP7FnND>^qMkXOAn`khG6@rCkr> z^Gq*K8L;RYE0{$B1+Ya{vR{xXM6MUIh~lB}S}Pf%f9#^pk9Z#^^?#VHbn!2bW!RPl zUx+6k)6fi0WZsb8x;Zdzn9Scz<^ye%I)d5hF!^xcbayO@XoQ?I3AuL&mlWgr^D&x~ zpB#)UWCAPU1fTF5(oyX1RlwcCF&a>grcn0o)Q7@DvvjF`nmHfWNjg7#^1~;0AHdz_ zlTQW}Fa$qvNfq6n9nT>D)c5XS)J!BQmvcHb_Aaz=IE4M?lTR4y^xH|Viznwm+qC<5 z^wtE){igi#2pM;tP6mj|vvtAaD+$MiUfg`sm&Yby)A8#szWC)Ye$oH?lkQWbGp)KW zX2Vh4RczH-))ehNe{=qD(ic6uz6Wm>?Ru%0%8@pxPk$va*mj#PK#ZHE(Af2Qj>1dC zIK7@Ac<EBSAGN@Vagc*64BVlTXJC=j^NAUyD_O&NYBv4NCy--$NTST}g_eopKd4Tt z?@Sc&WcrD6zL2T&jzb-*;q&UTer^~y74DF(bv38;IKUXM<u*t?aXD@8{NnW}%xV(^ zI(8H$QTU_(^;X_jYb|g0R>I%c7@f6oUk5?4FB}fnk13G1#KQSgg<F?k3Oxj*;Q*VR zNw40*ZMeWad1<z36(>jKhI9bZhyWuaQ7!kwO70s*vbv7xMFA6z0RNlsbsqQ=A9pmf zs|}tg5Y&Sc8B57C4m!Y?!Cc;n<LPdJ6nOevY3URRoT@=go<?$diTFl!H?@BQZtK|} zd9G3wGV)8Lq=6Ih*ndK#@uv)>zSViK&A<HI`n=oyBmVnSo~`LxK;<nl==+a<MCfK) zy9!U59|$?apFc9>om&byyDCF|RXiE0!q#g@pUWA<3p(T$tTYF!^UfH78`FA!eDtPz zG8_!#no%iZ?xYPDV91UPU~*Ks3uXubfX5R4y<cQXj(MgqMT^88os(smEh!TL)Z?*e zETO33`hw?|e~vYVVari$7jYwl&h3D_MUaR}H^j7?0f(+^F@c4BN@x4H1Xygo?azV^ zVA7Ad#oUI4C8oC(co({$T|YkL7&VC~`W$ZBAM{G!NvcOB0!+sd9zYtE!k({@M+tVc zd;?lo${M}mx*j_$W8<g6SyLXu_L<V*pE^DZ!>ga&db$1zciq>YUp)oEGH~UhyFkmG z$ZrDqzO-?Fs*+8|4(#O}aM5`;*60R1kAJi0|DV0LZD{LA(uO}zeuXki7P2<6J$Yv{ zBp8Fk#0Cbi9mnKh1qe_K5+e!Q#LoTOpX;jX_tSlJByi&Kgx!gC&grhMuCA)CuCA_b zg0qeaF_g1}xbPN7+r8bB4tP_r!fW?BL&*h-=m<L_&o3Uz%l*z=Y(Fh5kT6`tSBz$d zVhB%i1KK0@cd{GPO}ei#@hnA`v5mspo((+<8X?oFT0lQqyUVGk%7m{<EwC>1MWUdv z7%?US&`|r(&5pNkwrI(79QZebEIZDi*rYkC#0Fg2ny#7$8B`X+<^i}vBPj#;HA~5k z4!vm=q9wh#!_`@?2lK9%1=3no<2C-sEJvvJzs=HB8Oap$YL&UlW=H+!onA?w&REz| zNg`n6Kl!fKHS=F!N`?dKG*fAB<_Kp|sX{UEv&q2;uc;$!WEvWyriD{f_1gK`(l4v3 zSzdb~sMM%ymdwi;zxd(j6aRb%KdDF<zsEHM2Tu}?Q-x%#Wh64bM6L?X3a*9d#mF~X z0af6?yuIVOk;V}ikx?~?bW5kK5h3$>4Fk?#VRF$~Vt@x#lC4(ZzJLlr6<m%bYz=ir z+O@?%n{6=+(8GN;E5EU|E`??Sw)13BHUXP0b72cq%-(}V$a7(!Up&WFi^<uDuG|Qd zw=5V!OBRt8O`h6W-WBq)GI}XCsuy(58MBE5w%)wKtqUgAEUgyTN2;Jy`vqjqM5lRj z`Co>g)B?7X#WlEUtT)4KN(^>acziK-Q@C$yj6#HaAyZ}<DRboD#}J+$`Pn(V*B-SK z--T`?;Ev4Xea_EuF+@hf|NTHLe0ZMQ=iLu*jP^TmaNyUi57fz_*mZ|y>HJ#6BwQBI zyCH`wRhj3P0yBsWUxmMFTQ{l>q>J#eaHO)pB3cw+O4O#MR~@ig%wDz!%uHTaKO%Vn znS*#(avgJ8#;#keB~sau$P*@<E-N4^I~aKwWgLdcMFD4l+t<$52hG*0F|G~Qh4W7P z`9ox~7+gLY;_9Tkm!nRBq-7K=m&v~RBOD{h<IsEs3f0p_x~oHM&M_2f#b$CRD-N-( zF+?2K#*y7I+~f|eYqIs7<80y9MH~$n@Pq))(&Lysaz@i{-O^j1#66Cal>68vXS9sT z2Ur;;Rv9M)@SnBMRHRJ9;_i>DnL%iM7nC+^j>DxnVawHsrHuF51R7|VtKr(PVv{Qr z%L_M`0+p3i$POl|OgwM~uJNtbxILvs-8YSCihP(dgXihzzQ#myuPs5`i>TLr!z{jv z`KC33vwM&f73?u5l8KBvnA~S_5@(yKNRr2DV!{?2zF8)tEs*`7VnwZJY=xMLtQWtj zRIv1AQTw}6D55z_MlUMG)16?}NZ(Z|RWvPYRbE!ArK8AN>AOm$+!#x9MQt0B*i70^ zow8<yGb(LPE_#GJc`e_tm?FBVnM!0OxJOhXOzfL2^J||5JO$#lY5)=df5xJFHq#c% zk{Vw&8}-rcJ?f*|bo{yX&EFSW&t~@HO8V$3>7%dYd-7XgR~tsJs(g~G`c{FMbxfkZ zU?@v(nQk__TCr;;@8Ij>wi~S@YXMZmC0%uGaH(0XB%~F>dh(ja%-TYmtoG;Q)(yM- z&>~sAVCbdY4lO~`h**}=k7?%L+BpFoCRfB9Cj^#hAm8cYpoXL^^&@MCCPNLZ)^pQ$ zL&UN~F5wm&;e)lst1H(+13>+Y-V6wbq+wSgc*?ys#FbBbSiV$aDI!40T#+vStS~?+ z`1O<sv=dpS2=&BoZf_(iZbQcE88gBvSr}BuH7ae0+i+N8+)Cp)#Q;4qtDlB=#1n5( zSw&Etz5m)NXoF~^K`iKsqAE$#a%feKC4N-8VQ(|WL%z%1;k{05*GUWIo*Oliw>9!@ zKswDbW?7EgQg=x!;j*woV$)E;Jju6&*(PGuakEY|j4`KH1~c8!kIa#68oJFWm$#hq z{UPNt_L4LNbZZrT&HxL=ueLv2!ZzzpL<Ya|)&67zKs06jCTvyzEKh9u3-UDz+i=&k zwjZOR=J|Jb<^I}wYxB|F2W!i%A6A~q%MTu|tu3$pvb28p`1!w1o_Ftm{qpwRrGKuh zE-h^=FCBli#P7?;Kj8Pu((uOf@B81M48Qo|pY3~{$7icw{JQ_a^M4($w2%I=^Zn!D z4}<o`KhD4S?AHgUgSDSdR=Rh8`Js3E`O3@lwHGfoH;#^f`DN|vU%&qK?Do^I*7{E# z9<4t-y7R%q^;=&befh=hPhTAU<JHd6;g63WZ;p2U_1UXW4}Uni^Xpezhbv#-xc%As z;AsEWjg5<?$IGL8_m_Y9p>y!{aO?1(^TB5;uRi<w>$^w)eD&4s-Y={D&hl5Eb)J6u z^~w6tSAQFv9GyP-dgI~pKRYWwoxJ$;@M7@O<In$fV|09e<8SAON4GCuelR>-JGiy} zw6p)y-8;*-mw)+U>F8hkJ6}KPKV0hna&-Tzt<OiRH$L0`^z32x-uLT2zWU;1{o!Y4 z|5!P{+_?8k=g!gx|N804*LQYqzq&J6ebV{c=TDwI82$79t;d^pR&KO=w?AF}s{N|> z>C*9+H@-gZpR9a-vcC1h(Z-XX9{e<Xb>oNbi+djoyD$E+-M##2W%G-ZFCM-+|Fr%1 z>GQ9T&R$*qqu0BAWAtM4{?oHhU;cEu`Skqu_CMDicAob8n}a)thbvnzN3YI4_-yC0 z|IaU8d^I}0@#V>2^Ww9$&!3-t`Quj?kAD4Ob@brLFP|^py>ajHKQ9k{`E`4L>C-2J zU%p&9_;LS-(^p@e^e<08==c8lWcl&>^X;c!e!hIs{q^amPycoQAA>um%TK@m^8Ur> z*4om&8^=3eE?@lX_|fgn!Ek%!_Q9RYyKA3*@#C+zzrOv!k3a42+&TID(Z$K?ozAb1 zUwnH1>GtyW_ZJtRzWDyv{>EpggTdOy*~a0)=IQp!8+R|ZFF$><alZZa#@fZ<XKOEi z`ry&({;&U7AAWJL@zZ|q<*#3!zP$VEkE_qmKHdCr^YrD9XQ%fcZLWU3{n^9I8>^q4 zJl$Ad`RvzMYoDzhoOM>ec=Xw)AN=FdkGEg#-@EbP$Ms(4*X0M#Upzl}{L91TrI#y9 zOaJ`)-&G7&*6&q>VESmm-R;Y>qkiwwL=9S3w239$)u`Us6&-)u9$lWAu)$1Zpn)!t zh&YhY8{t<Ep?`?SyBM8cjLbhWlkjN0cQxB7LcGjjK%D_;;*H&D{$Wes6hiCtqiZL& z`E88dP-&rMRe^_Um99ShCY>(8P<qg6Ox1oER+r#|Resp^&9EJw9{`OD9+s#c7md*i z?F5lAT3A3yF^^|{LX=BmRwbo19GWhe&NwZ(#C*~39wzgmZ6)lC3D!nLgkFbYgUM_s z-JmQiY&_c8e6+K-zOnUi=|QyWOKF+8(nePsh$zu!Cdcr!7vPu-(8RcHwO{_OG}~Hw zQcEz{H^Q|tTc=!HvIvD+>Ma=!{ZJ!wtSKAuCQp*M+G88JbVZvuH*yVm2=$HK>+D|~ zH?znp&6v958bB6r1P(Mb`!bEV`nI8~>_Rr00)%&T9+*hYOFaaILxDLtZ?5E}p3m4~ zb-cVTDEhdmf{s@8Bt?~isd@=jbqvudSb1Hql%+_ZlY<8HI+sEk;3iBMH=pQR>%~y# znc<YN&5XJuEDNX6mjZfzQ2{tjYq>Bt=?$@^hB&6Hv}QpxYLC7^?9}S{I7B3At{<GK zY%pJ$-dPa7a%~4M4v^q{c%=>+5RE$6VQ|1zT2lax+A{8ztF&f8G-?ly$t&@t)Nj<% z0rC}Jku5EVM(vGw-pVrN39@10%z)c&!*Q&M7*v7HI50B;ppHp#Qc^Z1U{!OwOXGg- zOd=E(g4V7zHQ-0W4c<c>oN5n7bJFBl`xW#cvJp3z!Was|X<s#Jbm{N~Vxv0REYftH zquq%*YTLDdV10Ma8#TR(H2K35QQBioW20(pW45Xt!)fO8WC_Q}{@uIS8}76vp;^3$ zldoKhjoM~W#vhg9F8o!!?(lV9ob{5pA&gA=ri(JNa>~REwZ0p6I<1q@=zO?v%U;R+ z33Bk?I%Mkk{yDTaE?PxgB~!5tZ}IFvdvG~_+CT0d1TjZD`u>5uel7E2x>y72<qZId zl2cmS*c3!Q;w;Y7m2L7%?$g7ir*~J##JP{_8~8GB>H!Un3t=96Bn3~RV9ahM4-8?h z!YLu22-hOx$R64uB1nRH!RnB2fTjU~ie_YIr2C|LkHk}+vxZ<2+q`+9`S=~e&-59z zVr+HIM_fnEBibx6=j!A{DUaBCe=5AzH_B-7TNSJIjpj%_Y+oYaeHwZR1C>!TpR3r( zhvo?KP`;64Nd#xup@8wsWoL++V=U9)nrAmqh9wpj);E-wXx<rvGaYmVlk1%Q681~q z#a${KP*)aJZLYkZ=hO;9QaFo{`4S<dpvQMp>t;mDNi66o+%a}7ETAM#*HOF<?wRAe zi6ILE)xqwmpiK<eGDf6i93@75!-kw|geJjrqG&WiUE+gNx+weS12?E$0-*UAe#5dX zYbU(0j&WI~%|g4y44Q0}Ab?MFTI-WfKAAyY)&X9K5y#O?dS|~sW&k)tp~Km9&VGeG zXu`Km!<0AsQLE|=6S~+FgbN&Nq~@#(kCwqr0oe2MI%45`$*e-BOcAkTrc4_(xPwM# z`jREi@A7Lv;Q{jNh+Vsb3vt<R*p?>cjscPnv^#D8dbtGp2^k!4TtIK&c`ya76|f6= zx3srULU{^lpM|KfPI)gIMj|}7=VRPWcO|f0f2U1gG9(BpPTOUWTBsC^9vc%}we<XA z4qFzo>v%2aappIVH=j(yLuG}uyf14ZDzlJV$*5XBj$255A6#8>EZ=3uZohhG8GB=J zEqpEWNXm8Lpn4|pgKo$7_h;-Zy5v`ja>}Xv<`L(UMSe2Q2Dgr3?9{l#+5(69I%|@h zb9C95*+r18rk9EPS>>#vKT_v%4NP{nE>_o*O%+i0sE|?mo>jPvW|^w|_%de1)G9GE z$&A3pnHvG{E&f4Us`D2Xss`%sJh7xB%=raj{Lv_1ZLYBs0*_U_jZsIckkOW%QR1_2 zZ*f)%TSdp@lyYKdiC~81teAR!VG;ge1uZ#_<1ev{iwt>i^NXE-U9?Z-Y%8bJ%1quA zZiZ*gLd|32F|j(yBci3WgqaUhrh?2oggw=CYJAtVMTTN?8MVNGU@QvnK-e>iC9;s; z0il1WV>Gp_+bQTjVg6M8Zn%2P6zbM=z0NT+>lDoL98b-M>#K-gQoGZr0uitoxlf+W z>{n0STJfc6EAz0H&d9LC`v94+kVk8$uk!1`f6L~Q<(i0Yu*iZ8XodMjS#&kD%G^yW zQDp)PV3%M?|7&!YpCclr<vQ$AGssX${*|PcM!(Hq1&3Qg$??h&bY(8KX4m`3L8EVE zewUY`Q{8)UmZIp>&Tux!(`biB0V5xSU)GyaigKtgbUk_2ebqVSauaTGtf)u0c`dh& zOf~b~9<F)b<6F1G;sH#+szI~vAhqMzX*}|~YbLndxaQsH==y(n(mlfA+Az2Yu~qwU zcgtnFnm#nM&8@@|7~crVz*6#Lsnz<<jDgMjZ;CY`CM3mSU>7n9oRqWx6JEM?OK&f* zUVV(k!E@YKJ~%q<zx)IsZ?$iIc^el}e*Nhew?6;k^Dn>p8&60s;UM$HVe3Jsb@vpT zHi{mmd=Wrxv|wk?U3NRChcv~!jL=rle*1TR&X?UXaJhip6Vl^Ix!kr8!0^TvH`iqS z&mH7cN?kD(kceg$s8kNVq%epsHq*}bDSEQi9LNwq^3OFSB@JgN<QzO!k&?QGI`D+x z7yfyI=yR)ONGa6<O2mb=+LVb26De@1ZjxOi*_Yl!2*e)kvg9LjgR08Az!?-LM<(TG zEJN;I!)4q$h-(mCdo9^jIvlp#n~ZSrrb1rdWn{%{<ah<@c5~DpIO8r`R9dH#TDXB@ z11?;Z!ak1s4$es7b67NgB|gR!3%#G5?0Tbxg{XP#F7-x7bF-^$oC=UE(7L*7`3C>` z(eSUWxsQe)%T<N$Jr0v9{gJAZ;RheXB%HnIJ;&{4xB<M4F`0#O&~MLXO#mLQn0Y(e z^8j0#1FHK2TtRJOPaR7DQJ|f0&)IW%7i!vj_L5A)B^g$b#r&|9mUP@hJ$2EOM5?$x zC8gyjO|&gGIdS)oYhmRTb_9JW36Pe24wvRI?-??5V%Tqg`T6Je3@-{?3=n<I_nJH! z1CiN%rb<=PAU~=FTUl<E)hFwJCu9uj<5Uz;!aoj;2|&if7;-Ng`*1wA8E1=CHM@?a zsS*g#547EN>Nm%VkoUbo2VQl?HHW;nt&$i`@P$<;GHkWaJF60gyDeJC1><0DK+>$D zeP>L70ExNTkC<2RBmQ^B)K;x^J&HXO7#L=T{l~CxLI)ZYbV8<*Y~#{-o(Uo37pI3f z|F{KJ%@=iL`JLsMIyIU)_Hh>+(=sHlG5vIUFOrvF#UsF}zEzE$yvHqa$2gxjIygx_ z*z~Xw9vIWJm^+rSR_P<xYK}cLO5xG^59=FG*6n@Y5dGOlMj6BAV%UU9{1ckkj9w2< zfw_q+-g%ud7r-OjmVf};FEs$pnU-QYxx+<jhHCOf8}6VJWNNH~z_x?fjl+$Qj-Lm} z6HRXZRzN2fCe0I}3b}|mIDnWMUjab-4XM%y%UeHIp>PzLUpod>&{;vpV`HeA8!!Ti zZh?nncgb_#!U7G8OxqqwHe!U99a&gF@@Ht*xQ+#Wv!!KLH@22n_LjD`mYxRvb!lOX zqVk5-o#0^VPR&V!i64AV167tbR;6Zu-FT>+V45&Ptk3BXL+~tXV02Xy=Vq5T9&T=I zuWW^hP~~L&I;0onAe;&gwuuKo3nhF8U(MQa|Ku0+JxGleLbGaNj&iBl2H1|ZWP&l0 z&a^&h&EA^De;o{~P+2k*zi`o}_}+v^4eMPj-YjA&5KZg`5a%(H?ezzk=NRx|>6Q^G z7iAc?Qk*wtURc0tdw|3Vg1GTfBzN{_ER&`1JWL9`&&#|BsB0K0CYMq-X$f=FEj!A} zV{es!ce}kmntE7iS4ejYFRzJw1)BoQgM{qc2>3HfUj2DuT_iF|#i?pGofnvZjmn{* zH?ozyuG8VAj3A>6Gze1v9D>p2%(Vusy}f&DTYGyVUY~q&3;(aYa?3LDEm!RmOjwp{ z1R#~nCj1XbFh$;V1)t6Gi?V5~*4RtoPgiY<&Y>;sbTT{VI?V>XnJ_nd>)HSJVt4oO zlb>(VGz&U_YhEEgqsu)zuVcrNdr*j^eXV+eUB(|gFyCX79~rA!qxLbfS+z_JM3sc` zmdD-E$;H07Wd4D`(62tfr47uVE5+t*wOjkA{ry{i`{ec~pWhk|4sID%A+`VO!KZhk z#*K()$DBh@+o2qNt^|-w^Br}vNl<DG3|xpB;W6kOb+AZ2z*VR>TS&$F<+UzWAz+)5 zv45A>D#+c!yAL~~lm6i{m|YD+Yt*{je%rj@IsSI9a}Es)G%weB%uWWAj7KO(ZQP5I zqzK&V95MYLOK3~}MGVuw=Oqi6-H-uexP(&-=kS(n!{2p)f8#3oaN%uH8T^(heeV+H zb@#xcf;(;{3>o{f8rhqvvf=Kc%zP{~!`GPo#Aj)-b}KN6bXQpJUAMO<24-q>8=4xl zw>lMs!*fXEI%m8IsW*tWDx6y;-ZrOj4d=TdHdmXekQl=&iA3uTmB!l_=jW1qZqCx& z@&nIAlJ)$+bM`OqtXLB9IAmN;5~R=|Vw$99v*?fB$wnCp@2<*YisBqD8Z3$;WuXDK zH(S2A?F*~kY>C9+NEQW$eIoeG6efINd&8R2kEOveMxvll%|Mg|WMKjN4x%ELU=fmH zL7#||^Pm~`-VcI&ecT>&5qVEU<k>S`=n)C#%l6=yy`)~1Zc8n`DfI8z?Vs(wl~=X0 zAcCh_K?Ui;!FZUCdpIi!XQ6yeXPS4GFe9Z3<2=10p^sm>VTg?YOi(%|L>-sQY#Z=- z3#n-9xoPq5t-qx-vq&@_v^$wW<2)~>itAE$xP!Yc=D<0{_$x_mj&{i*UQaG8;I8O( zm~XgF5+4GBuo2H~{+AhcDQ>mVb?k}RNw5?qm1ytwJ|a3J2MVUg<jnx*oA565xJjnb zoI@pDz3ww5sfL@&&+;-!K7+8*+T4tm_KY=i(d%l2>Fiy4-JZ*TAIg94%YS#|zngc% zy;Hy6qt%i7SOBFAMK%B_Y_qLzT6b>$?K4S$%!<ObAk3U%QE_l^koVz`c<%9y$DL2w zrPeK+hXHI~(({C95nRFE!8H+Vw$hIG(3XZbujCA~g`~Ynse)yP|HEpVtzCr+u^}sK z%haER4H6%QYz;?ss3Un4JX_9;!1=*GZ#Y{u*F@=@uCA-sG6h+Qx&L6}?$U$pXR~{I zFrKMhm(serC}Aw}R3deEfYjiy*hDa_K-q+~%dkJ4qbHG+?EabU5j?D`lq6T#?Vn{q zXEspia#UZ3E*Gq4(B|8)#H2x?qnR2^(f*Z8N$|87inCT>2Q4f@of|%TMutnKW|Pcb z|AnjVaI6$Nu^@%H*$xgsOpYyV`n2WtOI)}yYRzLC4HGifPyB|X*!z8iRUkqIu?YLv zB)SwZ>N&xl&mrF<$l>%-w%S4r?fj&ImXZWU)M`M1^4i_<pT=K=4Oq#clxM*2bkD~^ zoqd2kxLymXoI9=dD0`d_T6!>le1YuAw*tz{8_F0L$CNt{F~>)1EoE^l1@yq~@;|El zGat7)IQD=IG&+@Yh0HQ;sfR2%XZ?$z81Rp~xSqo<H*8xa9hV5*+2QBOo2(ed4U*ZT z`73mdQO<lH3$hl_fa9LluaY4TXOJORj*mjg^|+~@R6BCBRc#Y%^a}ivjJpnrgu5p% z-zM^?3Xv76Z^uYQbv))|X}>)>LslcM>h|C$<-dGwFTK(Z_o%9{JPDNHYb7s8$63@& zqOLklilB<z?|3MBE;RtAoms_CP1vM?YKAH$%tFM=1*}8~;yQ9v=1~@GKc04f6~R$Y zIpL}kH!vu{Xc|O;xz*gx#YE_9@M^rWdr)Mc8UGfj1(bloTN*+4?_VIkD;@<Sh6@Wz zJ3CuzcOUJn>^)dpU)ft*zqj&ZfP+}g0sMk{Zw5&Xxv>NZoij3tJ=5XBM?={$Md!7L z33l5&=Pt+Vqx(pIYay<#llbY%O)PwL*t8X_C0%FiWI+;o%gpG0*NK>H+8=h-(CAvU z@b{Y_L~nOGkCk5)Z<_1h69ZmMoYgj6Q<nu(!#PdznhR5}b(@h`X5zzJocrF~+Spv# z+F4uK-dldKw7tEzwX*tPWqD_9V|{Ps$DNh+ZT{L>x)1J{HCEgw`-0OaKGsmQfbWTO zb(y&?YVqO9&i5Plrf5#R3px!oY-{PkgN-LE_x83Q-QC-Hx;afJ;WO#K>>O@i>~kSG zQS0}ft|JTM@}Bk>l-+r>1zG}+v7|j5<3r35);71jv$S)iR>94q8vkWo+pCY(m3OA- ztTpbosvgK(ljPf_osBIe==SEy^4jXtwe|aBX-ngi;c*;KO>a%3ww7mCe%#zz*;Y~D z@Zn+O!Q+*!v2Ar;VV7aZcmlSDgD!IUZ=o$~sbUjIgmZ9lFq(6+&CN(7#|6W{ediSC z9_nUy4c!u(*B#qZ3v*Zh5ryJsY@=Q2Y08(k^QCKDW>j^R&UvA=s?Ioh{SBOPJ?Dd* zL(Cm4)xofRsvfRorV&$NL=3i_3a(R|XP0_vzV6s-#1m^4^R?dVoxIOlxuP=ddRX|+ zTsD2}i%qpCV4)}{r0brL+0;ynmyNiC!*!Se>YW!|EC#@0vI&|nh}avhOlhmMcKwNE zC*v^f9qTV~pH-)I+V4N->Jn}ubG`IOLoOd3$>$tqWG0J&aNk2si>Q~W2Mb6P#O{|X z8(2+Q1Ev;f8BJaW?^ev!#Vwi(+i+&EF)`gRQF^T^pb1<j!05j;&2nRxu4zMK0RP*q zhK(IoBe|BWt-MH@Er7T0|ACsLJ8a~Kw~17SwaQa~18imi_pHM$7GRzKXW8IZ<>sh; zXFvxgr6VudGU#Gs&J61O$(->zK*jv6dnTP0Qu;SyOIi9u0hM^teiw$c4^6p|<;jXK zu_NG=>)Ufjy8e5cqQu~~Cylw=R(Ri7yT%J?bn#$U_N&z{vR*@P4yqT)KNribn(4bi z(ff$vX`fmx)Sv=&vG|>qdc&6pkVyhTJcM2U)7r5y!ew`;-FhiqC#gnv7;jN+tKb93 z6eQzXN0SX&h5OG2M|k8}E_I8lDfsN?yi1|Z99Q;E;e8t{C{m;_MPb2dBGwR?WQ@xy zAlP8I{Li8$yJ5vuL5z43IuaVaRm#yxno`L{lh$>;paHAUs0yoZy-qZyT3uTNQTIKg zWelC&G_8sFI)gQ_Mvyx)zo^58s5pG+$jzLvG0|@}mV$U``4EGU9g>TcGWwu8B-_Fw zjMW<AqDi^u9bx6UF-|)PTg3H`J;?V_AiY+2kOr<}D*Y-rPp9=rTURB{VJ|Fbv?h4} zI*C?CCdUNuhKg<BjwARf5Y#HiN*NZda`F7418Mxlv<-gue%Yl_zF*R1&t}Q+o1v-c zqJ#b}bWv7+cI_SwpT3;BcLMm2?BP&D`-ZU_ziFny9B-B({t+A+_sjER{SKQLQ$g_G zH867#5x?aFUx~!s{r;j1ePS&?B@FozSE=H^y5;ySUqr^6evMvH`A@6PT=PMr@-uGX zk6<B(nrzBWO&JTu^WZdE!$O&R$LItnJU#CgJyPk4oD`lYeC_Op@e@Z5lXr|*oW6}G z=88m`R@_|k?-*qQzt$BgQ(B%*BXsX7wG69U^!|9Ei!iw|Yw5X^)<<=Vu#Z}@WaU8< zYmD3U2&yxD9Hw2>n)mqxvS7eRH9KMAiprfLj`dO<#&!yuCLYrSV!F7=|NQ`=x}yPN z7tE$j)-~@oyj;Eb5Q&3vWFr$n1-m(6)bNz?qnt8r^l0S8l5<POs}p@#G98MYvv8#_ zZPVovwtA0ygz7rQ2U{t0?6_s9OxusUgAwup@^`_%vx1%EUE9uT2Z!w6$SYkKM;~Gi zvN5OU21lu@qZ}^E8A?Zh`O0v@qGKI|#Gb=1mh%@mRi8R{X0-0cd9|Lpb0+ASOOSOb zy@+wGaq(c2PX|b<;c|3z1F55ePT8~~7TJO)CxSyyNAyB_Na~oCW7q;qhtGw=8@#t8 zp&23OwjblxWwX--jPYEJHle{$;aD4OFahCfDGhPl4Cy<U5--+18IlzPewTtF66Hpm z1)0~15-1ZxuaY<qygO9b8yfQK*tZ_8<>EX{>LrAEjNK5JH7>6`%KM(Bo#Mk+{GSPV zDGpxK=>maE0+I`)anpm%2|i^U1>2ccn+khkGAwz<*Lui6*gZtl2RVQ(y%h}`^SM=> z9jEo`_QQx6QZL}YDgPU7z)uuz53VTKEK)DeDJI~(6;x^_Bp!q7WaM~^{=*oUN3*Oa z8)u;J^$&J;+Q+*%<%oY`YeC<c`=&W)K0@rRFt)arXKhUTf*(0CoFeeP#vJhcld@sB zv7+tr8Wy%;XI<7U2#6M>i0H4%6v?`8Q-Ty@ks<wAJJp0p7UhWJ`$r0;_9M$|{}B?Z z83>T_1XpQooZEZBHtg<hWZWlZ<%TUp9NMyRe39GJ9yfK})vL%h;#rG)ah3IegZjpy znV0bXpnHto%i2N(DwT6_C+91p?#amP-KQ!-t@jKbNE#fp83V2}(!*NrguBO}pfti- z)D7WtMS*x|Eb5<p!K|Gf!mOW`L)sd{G((|UnqVg12<SJ)nhsIZUKCZ)mK#h_NPgH~ zD?S+D*p^P|Q-nN))$6FjDeryKL~$&Lcc)i_T*fJmwcgI4-5phI0^BNmHoA)LAVdMO zD-G<$>}ajtDrbevjmfW-+jpug|Kb1XB4eSAr%)c93X;3>9+ALF(+aiD7)kpaD~g+G zU$BCY@y?W}!RI=3Re}H&R`N=FO}%VZ7&RENdd+7K>WT_59fOKC!!BGp7Q%n83reWU zhGjJr51DAWgi&gn%96L(+8XW+!*x2m`y*w?iCZ2!GDR#VQ@zw2dx2hgpA>J=XS>Ut zhw{Cww>~(KAXAMJ8g(TJJ#*zS!EvN~uWGXq5AoXO6|SJ6f|%+@w!FLEc{!D;RzuA- zZqAs-IMmr?f|oAe1cz947F3<m6iO%PRiLRtsV-Y>SzV+jazg+Un`9*C8xo|J2vA+i z<cu*ESkS?ulx{=@9aLaEpx2@MCU-m*8UB6J3b{=jUFR+F4urk(ck7om8z$o5iI<Cd zliE?&#R|utRqbTz1t;gT&HL{Uy3e7xsvzu+lKECxnT9?onRA8fY`@l!N~X($?4t1a zDTXFBH2+vJgP)YK0NwVKda^UnDkYhrx=Fbw16;rn7xX4&)v^vd9+cD0_!kMl3nY=W zeZUPYi1ThAO2Y<iymKcvuTT}xULZF}LhYU4R__=%XL#sc1UmCq<{Mu>8g)<81W~dP zj7tHIj`p5+F14cDL)DLXzt@r6`=!q*P@5tzDUa<4rUgRa{P>Ahl&Ys`G{y44GWS)M zIMN2CC)V(GZ4>D1bgHczbvtx<pvWs#<QH2rKfQ+(xg-fnarfuC&jwD+1CmkwMv^%h z0$;K}Z|sAxGZH%SFHK5hU|&8OB7y99_$o}alM3+kygm!m0@IDGn=LDxOh3s@Z85DS zrAPt3`YK#elC99tDK3}z#*#plQvs%>ffg!&lhN{8Bu`D@Fkh%TTxykNM&4~I`&*#w zmBh`4*8wm?X%Nf+3C1wY-srDWQY5w61_Q-I4bk|?pd{_*M#H0QC?6BG#yS-OQqYa1 z$>ciY#gK@OFXhgB7`DKGq^}H#-Rpqq-Mbu3+{c9DGH!;1lcuw`n{-!Pq7BHRyc`(w zo;(EMpGpM{(SpK}(g`33<YejKu>w0sW$jUwBP*4YQ3x@MR6&4RGAyi;yz;GN*D+GM ze(92NrY!4<1WO3{<)*mTDltG%31MAA(u!iDtCMiPGerf`rU~K5O+ShJVPRxSLn6f2 zAsRw3DB+QEMG={1I<8hfc>D}sO@?E{jKwA0WR4e7buXkdD93ky>{5&DT;ef5cTMcg z5}xz*OWdcEiw$If_%P_0Nl*HNbOx%^>Cb*P*|j=0!?v$&7+iSjbv%uQgCRE8qS49U zXlXm$i7{0vY}1_Ce}9{(_HT>IR?Y^i3K+sX?fR^97)YD!+L)6VZW0M8hkPB<0mhk_ zjN>j_2egKKOC*)2-99ufWbgElfK}X1*y$gsuGvd-u^H+<dxj*~`oG{NKhr~SSgIGP zD%FW&8}qyprbXrP#vBb$-$p8tf!&Uur&3zNfN?9{kfMdM$nO@AJt-t<PD1h)jt0g< zU^?AoDwb)%EjFQJRfgEzfUW^`9(UWWc!I1?t?P*HDFxYPs$HX<FVhh=`CK%3a(=Np zq`BQaVDfOU=!q5oz=h53!M3eQFV_L^MaO7UUh$B-Tw{9h_c}*yT(FIPma@?_g`MHE zXO3{DE6l?3GwAQ$`*CA4GrYIA6)yFW0SWvtlGN~KOO&Z>Ji#$kXZ=y<5FJ1U?hmuy zn2CLddmk?5la29DCA&K`d9n#2l}0(Pse^#FB#b%403u3179i(_+@a$on7vOXfMA^K zn~15!4tVAb#El&59&>2<uDfDn-a!6+7d_^Z49HTxzTa$se|eVIZ=tB#H~hEE1h`K) zl=Qfg*My<07dcQaC8*MqFf$3T`PwU%>JyG9i?cAGpczTnF-08E(-;Fkn&FIPE{t`P ze{MuA0<l_t7TOFyH^(FHswg=pBe~Y|!yH2?%~oZs&W*Tv8hMC<Q$!@HMqK-w=v_Mn zms+o%n1cyqt+(vWuVe;MWVrC~!lI|VeU<8z5Dr-iU91r2nv^8!p1(b3K_Yd|I_Tq~ zqywIP$rYOeAEemPv<R^a6*RyWObZ(`A4`B)cMj>x>Ky8|V~$&?@7%<y4wZaC+-Daf z2{h`&%72cT9`8fOh>Jyp4y*<!>JF}EME-5fp^%L53~oh$fcFt6X4bn&0WZ0(uU3_- zzt9*G7jzz`OgeMK^C~2ie3qe*U6oYZ>2#%~Z9WNDpSC5blLF^ZfgWQm4{ck`=Li#d zmBS>cp(va4N9gKR?G%^b%@IYgNSg7Aft@tOv4@}n`Y6|V*_@U{BIkC8KybO&0nak8 z`?9(n<fYmJVo#+k9elqE5+AC5@VgU8vuyeuv;fXmhfrSLvIa{dPRS~nhiy5TQ`h3N z9G1b7C>TWwgyy;qmsx&8aa!s*gN%bj<`QAjmgW~n{cX8RAmw%~)j8adG^H7y6!YA| zLg-hZS!}1=F4V#TE+9GFLEh}3mW6!{qGP8`&+i$8t;+C)z(ORtMFh-a0g+Uh4!Q3h z#+Bt>B+Rz!;r@}brdlrKLQ6Z@EXpw=dr_58+bxnao|Ftgn2HdhtXPtXm?3=4PVcfO z&2cTsqBpD99xe^)4`4=c_A#0i(731V&sNMaZLRHF+z<=;6@l<WXbBKI`=?sCf-2L( z+a;Qr<hnyNCTlm_s1VeYnuLC#!CxdF5v)$*&$t?mX@#*dN&z+!*7G)nJKo!%8b4rh z)t?h(W{KkM*8CeysCxZuLx}LxnVskCB%$kmTtVY(rdh6nCn0}qQ?a()1kbhzI=Z&t z$+Y*w<phb;%FjsrQl;v<FCs<pkbAmFyGTg6CU>c4R=s_dmIJ45O43qetkpVmNV`0x zGGd#mjkG0M=UlfUsg7(t-AcTZTJ_f~?cn54qk=TN&_og`XWrlI3=am~bFL!b1dDCg zDm!};_+M@@+i20}L>RY$)mdds2wht4;Zw3O!kfxk$aF>#4foG<2SYZrb-O_Bw028F zzYn1W1!H%0yqMH>YT#ZFDi`oHyIqAl=&OL@-7ypNVl8NBoZ7{-V43PL^Rj>+Q!7b{ zWMjdv8bggZ&fha5aYW00_09<y(^#nK19%zJEwg^e!NgcArzzvbp(NRfHm|Hb2aD=S zpvgWTO__3A&$3-kWXLeNXh49AZ*peCp4vGK#Kv5C)j7DJgs$`sxpS+YRR1ogXl8~s z8fU9Bge#q0=>%{Du%n%pNf#JG7u?H7HqX}Qhg>D<#S{U$a+gkDwl9Y}oxvH-wlM;~ z>VIOJ{1Xti?O@f+Ce0}rCiJiDZfR}(Z+_fuiFo|&+wtxCX(dN@3kSqLm(V{FE*T4@ zJuiXfU6@eNy5uswonK_tL_RE7{;Mcj@F8t%xS`D076B3-IG=V8WUC=@MTUU+yPjq& zk*8brZS{>Hu1ep?L(Rq!n@WVIj*iutivY^KsbZHl79cvmc-9#lcb?!j@(f>N0F8l@ z3|ibq13}-4<FKr(CyF7*c2_2C(niRlzaMF9kf<f?M7_`RL}9FCeq<mn%$4Fa8t%o) zGBhJ&MDfFr#jb9m)?A}IDeqtO?5(JFDIe~mC(Fs=P<R^ZKo%_{<tQy)wanBggH>$E zRd0}m`?9dbjOW353c`LkgDhv*$w)ghFM{g9#y<U8cvbt(Ax9|D^3<=~4M+#s5HdzC zeu_~wHBBP2)QE(tdMMX@=bf)}g0%N=RrZ8k>`EP((?T)P+*f1$yJrKkhBzgI)p<aS zw>N;~DeJYEFRrBE3~i9{g}k;_15gV{T(sC<{yA001{RB2!^syGy_z$d0u|<J22=Zz z9D7NdDvP-nMV1MbkA?nL{MZNRv^8}DI+SOVG2Iqx55~(NILneF!VDX>PGXLyLnN@T z{3sACZ<$Z6tn3v+Wda^>dnNS2mXv>aocJXkE551g4t%3bib|95?j;+v>u5i)f>%*X zvjLL5==u+7c@3WbZttPUS#?;v>&VNU#qL9Ba#Jr51AXHaRE`&#%<m!)-XCb2Qt2d3 z>3&dtsdWW5ZOe5gXhFPTk&83e8?T1~tyY*kL@}M)h+tWMW9o7*!1TEmNO3!D#;W>R z4(%XdgWN|?bvOgr(5OOGOw8-?lOZ^vdX?<Cx`+4W%`lFr%!@SE%;_jA8H9-O3<&6_ zg{;HC6J3=*rp>jSVT9lStME$j^E7OI`>n$#3poz(Q<BgO@p~<u!$}8I`I)dXW0<GT zvtUfpO7n~D-r-z=QY^@1t$2+2risv)cD<xmwMVK8bTI5B;N+M6O>|)}>4Xi`EJmB4 zoP{d#{s-*GHyBP*^bce2m`|*#6;F7;a=w)3A|bQg@)Cm&<CgEPxItV|YwWSOQSGS& z*=0*sQ{<4b6&xLvDGSzh8h7D!Mpg&-&#_u|tc|HD?08{TFwCzMtgg0d784G77QOm4 zN;oIvkL@|nc2T>kC8_rpq|1aXN~HyY*XL$rv$gZnXRXS$<j=xOmd%v62$=4E59tTI zx-%e9ab8v|d)D<@*}BRdrf%-sU%bYwo`Nv5t4XX(FIIk|!J?<qW9^ja=+^I+)HKN= zXQH~7diJ1uoFqV&BrZLj$>rt?7f$wz@YSSC^^MBHQKFy^hnn};<(e7#yO3mcG(HKn z2Wzv=0n>O4?FnnEED2c|BUBj79wjoFubd_x3#+QfC5wp<U|_2;=!Ca|cz`*#if66& zFYz3Ps5n{)RiHmNqD&=1!`Dhl*jurfRfkw*KXamN>m5uz2fA>;|JW0F)1=woRhi19 z1u@AXA`N4+DVT2+g%WS>jnCc?ZXptpYtO?>pt3I)3$RrzJ$x=Gl(;MT>d6LL9@0Ki zcIK-if<({CY`I(NPjEs|!K92IDjC-++)RWXK+VM1R<`zRM*2dFg=64^P4mE0iR&a| zohN-~x#X4hBdAhnomC5;JP2rNWJg<A2+1Ib$x^16sXnD5loE+2b3cE0-gsS5Ouq9) zg_KZVfG6(+c&Ujj-SVv!=p;=#Mk}>bsH{ZJw+DL3E--B+-2ln=B+f#giuHS_7LDrj z3-w(j>gNBf_mC$$Hrs<?M^g3ra^scaTF=5Dhej$<*!3!@Y#Jb#*Hv~|6n2E79a>W~ z#GFv=+D<f1GndM0DC!OHZn=PYkK@f8KCxw2(0$eZQcYFgs_+C#E;M9VC4BaUv+67? zI<Z=_<o2BxrO<$Id5Jb^zSQHQy4Z+pKB$cnN0hWwNQG-vO(tKZB^2@cH&sj~J7vab zGhf1-WkUa8ITqg^a35Cs(Gj-UAGc30Wc!ATNT+n<Az0)EaBA)r%Bv8l2OZB;XRwic zmBa3tR;kksf+Ms1+gkxpt02|XP>@N7Ng%hV#80k8e#%KHj!ll?%E#@7N%|ccMPa(v zJrgN*6nd?60&em0$)Q~YHN`ZZ=Z!yQW`#-a5GE+Q-xwk}O8BS9P-6bmMJCG{e@e_Y zFBDRt`FEIYnom%;Nb16P5GI|X>}(|<u4le7Hk&}ydCp<?zR9MTE6wJ{V2rMFcC6>= zKV{x71njm84G=NaN*f5xY)hL|S8r{6Lx@-vGm(&ONT%bwJ!v;{q)62mg}v84({$Pq zuwpAdj3v`(;tvm(vo88YsuhGkLYCqjy-@5Migl>ajNvGRYu3w{mPxnZA&Q`kNpPO& z!*vQ}iRu0nNBE);a)P^qu{`PWHUdj3(WF-t%)mA1($HBSJ61W;9wT0qY3pW6g(OQf zSF0c&Az-trb5$mijuaoTv?UUemRTm~;p@U0EW}6KzfR5`KYst2JRZ6_IK}MpKdF=T z)(1!<(LOadM_<ECL=drBwCvu&grq1?H$(BtJ)}-5673mI3aq6Udh%C+=`DCNy!~Cz z?Bm=O6n!=*Y|bCjuM(5TZC)pXvuWb;pUK7{f5Pvw21QLJ{X^%{(&eo<7&x5DKB*E6 zIg`Vp>{i2-mLu!AalHGCjWsjuJ@VJdhk5G%$(7d1b3tX2Rz+B2dW$}oR-KBpn$((# zlNk<Stpc}(MMAsUH`LIqPGu&rg(oo_LVQ$uu9KfPP2_!b-2UY0M?7Gt9;qubGOOne z0+@w5sNo_EFKezucHaDy!Kz9bfUF}4wF(T+*8be~VCuQNZ4*Z?Buw$Al)%&VhkI?m zEen{FmgWK$xC9%Dn6xk3gI3%G#`Or?zl-1255jBJb(kk7-G>x+Lo@p>7^Ul+5cBN( zpDE^r)pNKS(d;N&xI*b{zcc6@Ui(C;OJZ5g<|j(GD6N=?Bdi%Gt-};AdQeqsj#mI3 z%<VT@!~(&O_^<u#Ar;gBD^{09M%oF9AAKKab()VJG>iBrMR|Jjl!Mny_=vl<R+K#g zBUPGt4tzh00M}(`CIg$&rU=|&8mu{9r)n&=1ahqZhv<n}j>fD@9X55K_w@!2Sto_4 zbdr}N_otg8ofA2BV<c$`-VEFn5&i!V{=7P8{_h95Xf}rIrM}$OcQQMDz{x;U9X#sc z+KYn|`paC{HKX1fD-z6AqGnk?zqqr(imqK9=(;&Yka1z5u3}*dsWia(pz=~%Elms6 z@)Jjw+RY+|uIPM6mx>-W(^vt~Ytqqdey=q6@0A=-vF6U>G`x-6hP*Os!S8($dCzV8 z<(6j>B~G;J#f#FcJRSnk?Rt9JWP_e|(wJMgL;s1C*2SE|!iyGLEQlmqQLD^uXa<Ix z<#^FQfvEZ(6s1(pn}z`D#WW;Eu&LkZE^-oW%uYSKsWdN&tJMnZoU<w&F=a@{X$DW1 zVk=WjjyZ;ZpA<q?7f?yy`s)4=7ju*gJneQ)4{L5Jm+w5hk^?d3{NLKyIojUr%OSRK zX}N^W*Gn9Qkw_i6j8{{8Y8&>90a9>W@c5fBcFlog)5onOEun~<-HPCY#kM^4=Rg$V z+U3M~Qa+zSAicM?aPzMK)X{k3h+cqr$w6~-ZvmkDuC&c-)M0#5u&Pw)D;Ct!LtF*a z!tAXD!~(V`-9?Qf29|RQKscbXe6cK^@85y)zfPD`wV{^O2_rj_mD`5X^nUr_YRx1= zW3aOKBj+g@=e$i@ipYiJ3;}84KG(z&7!hHnJkbZFhs#x=lZ9g!e-ClemnP>*B~M4v zAJ<TbdSNn6apA<8zEdU*CfNi})=6Gfsw8~RD#@!#m58%hA$n0M9(I<c!)IR@ELc6q z8Vpit$`5)Ulx91@qc&5VNS8e?$ZTz%g{fXEYoQsXzI8-3gkCsWD$R^Nmm0J&zo^Y~ z&UbnF$8>8enFpj%;mg{d<+-d#yigrB%^i|qm?HeOK+GHVpvqxI=uhJbq+tVDp~|<> z9p3Ns5VL~&cE=35O!9MPfta-Laci-4d(3b<y=Ak5<BVbQu6EqBVxRAnvdHl6B@R`N z>6PhE#LD}uH>NjJ7`H}jQ?};>`99gWa@HA>J(5}SV)EwZs8|Y`@hZsAY3f(cZA%OO z)NB*;6DXOCT5QX?nfNf?<{Tg9?)t1c8GbHm|8pA`BTg@6tI)Wi;U+Z|wUVWU7~qrs zVZq4KtXpzRwL;<2ykPh#AQmV9O9)%jnUMPIYS=Bc*`kiQL}>=3HMa8D+tPw*j6|&g zW%!O0EPgth#?UW$7T`CP{=PS+u76Q5f}{nV%h8k$E$LvCifNJs%+Ep*!NL~{#wLI! zjd_$@v;LKbUa(exWXVp+D^dhT$q0%Pm0uKT8I0FDBtTHLt?jg+shB9tkSR=2f%H%q zI%W4{Xn}y1YdUpDgf1eG=eSxXbC}5JG@OVPn_xVPWS(k1!FU?#{PB|rIW={kTlVoR z>KVzu8_!O@tYxgJchbuH6}wMPaIsO=!(u0gcrL0sM{rhhWV|TC^)<ebyV&}8eu|6f zq}2!g{`p&(lC)1TW83*C^jIogLs8|l<jgbIu~b|wtd8w@W=_$WAP0*}Gea@Em^O1} zq6R|$uXZW+_&Tlb;T2SN*lDWJ@L7ovs9X<?Mg5a6m{qhP%!&2wMw*8s7{b>Dof|f& zxD_>DZWv<rNJtMEUU7reQ0=9Zx=yWE6`c3Uc+OeN>OET;;C>?OAI}xbD=E$^*7L^S z<IQAT#uqmAR@9PN3K5~0`K&%M>oLWc5}B$dqLm>`9$HmC(wQn$FadJTOG89%wj#pB zx}%_Of_|vMCSE<?Ep}~c9m2}VhOLZNR;?9fFzBwCogI!s&63gyx)$o3l(Ntt6_r*u zc%|m5V_57F$tzuH9x;?*`u9n#h@|9{#;(6@I{TUXjpJ1YCzbAjnxZszfA78OV9k;0 z3E#gr^rh$ZgWobutIOV;c8?v)SFf^W2u95x5>hZQYfA&kE`bv?C*2Yk0w8@iJ7TuR zJ<<&o6&4e2O{oGM=obR!S5K+nW7vNd3ZFfssnuN3mf_$u+BKK;=9q2sfQO0=CZiN{ zL)C8Ln2%}I)3d0}Hd2Ey$CH1I)-1{W`=mOvYEg#3Oq{s_*Jq2FM&5ZV%-|V|gtg|X z3L&);n%Q5bkyyk0X?dATQBs=bEU$2w{urHsYbA6$lPvvjswj}l2EO(VLi;kouSOr3 z4U6rQ{>3SBjE}x=pPzSnE3XbZayzz`auGD*klZ_KpC|9JRd@<I#kn6zIoh}ei%j5) zu{pR#;w1D&4DMj|lIP_<fOlRI(i>hRjI{)Q#uBWP+EDDfmctfX8a;E%EUPfd@V8l8 zTW(ijk=EY}*WnnCaD0)m&V{rvJb>WZF2Q~s7}L%q`h|;EX1|?nebO3sPLCEA5|nZC z6YF{Fq)C&Hdbl*Xrad!QbF*(|jYEnfI+s!pmmKx5<*I;edgja>pU4|TE<0pFm{pa2 zcqqObq#6H&Zc+UL{k3?jHRAQhtzPG4tHiOno0&b;EF8NT5VRd*_Z!Sq(q2bk`0<2e zutvEXb`E%db(5j^?>~p)tqsK?B4WBn-Oix(=8X<&bbF!IJ_YHtT+rVh@q};4UY@O* zv*i`8b}6d!O>pz*a#NK(V<3Bn?SZ|*#VB}DMq&@<P94RQfiDY}YBd#Usqp=5UXcc+ zqXQ;2<uj**OQr2<#AYX;46^s7@|$DRR~2g(^B<II)MxgqsWn0W$MrWkgq~@1ZHU|j zRgw|#?&Hp2zd!7bE+63T^;50vX5FC(G6GY=Q=W!7T`YrTQezaPHeqOIr-pNGf&OfE zc+ww?;P`A`ZeR9B?N_s{zc03SM}vz_l2CcjA3-g54g)h`Q)Oh2e7|QYCpU$%|J+f* z&Gch#C@{UA!_}7OC+C<;MeWahH2fHvT_DI73jwl)xsT@;4?DwyL3h717n74lK<A)4 zL>W8lsG>n0k9yQ0fEgB<%fFtsTUBW2<jt1psJYZ?&iD8+(^d0g(dwsrOg}wg9}~u% zOP;6gRRHF9?M|RGBQ3~5%b$Ook{fgIEO%B%hHN_V&;(5cd8NXh1h1zZsA?nE+>7j# zH<x`oZ6C70epj|DO^<V>57Txv2d_L}cD9zZr4#dCKJmg_{`IsSszNgZ*F*(!B9Uo8 zG@lDVZsA(ostl@j#I!TZRVQbWY8lZP(-6wCU~axZ7i&IWfp7(=6A-XU0j1J45+`RK z&*ffDO9-U8kVF?{F_=pGTG^@Q;hHOdnzj#lh_*+L&22H=VTdzDjx%P)TjX=&i%i|W z+T}o{pRjRUYFJ34dJ-BMZO+b~bHAp=+5xZ#R>dV{t*Halii=UVcpSeUOJvN#Ambcl zWS9LaZksevS=Jf!Zt`p03S!q7_;MMcMcn?&yw~C-P1hM#-Rf6v7)A}6;Z3&Fq=*oi z{~0ro*nVw&$8M@q(s(yJsHnaMn~#S56SL2}1}ZER$862bnsvwC0g@GT_6)MKf#XWN zZ2|a_vomSSaFNnsei5q^>uq2k)zlAKaoEl;4m%@vbzTWSvpUkQ1z@~$#ro<z=2pO_ z=H9GFJii-urSQpBrUgE|#KflomqSX2TLkmLHd;PJIzFHui|LV^dUfrT;vZ#69^#{v z4C4UEkIey&2A9k2(ZPvpdBVWT3PQ%OZvzf;n7|OKw3^!va2|=!n;<(FxM?jN7#EsZ zg<Vh#6%bSrm6u9jkqMQfDty+fzV#Ke4v*NY5e}dcmmKA4sdU^Kt)^6I7)V*@wTkdH z;kHv5^M=TkNSjySpo02m#`t^UOimTTQMCU}cMY?;QDYe8m|r&ZJosKZ+%E^NjH5BS z^;b_~tzPtGw<HVRYRTA7=~Q!YxUo>eNkf<zz?ua<Zom00n@m686ima!0=A1=$%)b_ zCWRb`f(>O`EnJjoJCUCWvWMAYHDaSDRPQ)KXC?wpE%|fqd5FpB%{+##!S^yPLDTy+ zt*HpB?*)v3@>QatHpaw)`)IO5Ts<XkhR9CL`Ejfql+V=)k2;g}7irFR4lcM?y3#we zM=Wehfp9<jIX?FuvrS@(hqJzu0Z$k=;ir7-J|ygSt?3GGwi=AAN7ieok}+bmr`RCo zx3?h7QYP&w3#acYl@cnjPV%Z!WoYeD6-ib}URA0@48RJ}i%M~XFt~gkEFC^q3R?~5 ziO4F|x4vS|;&K(@Wfu<o#q0fq3t>-eCF;JR-I5=fqScb<L1`p;C*ty2g$5R>HelU~ z*%2zX7RqqbGmn`eEy53kzA5-B59Fb1w<kGuZ&_u2aqN-%D<!J%?I?~kM4gjZxijA- zFxk`hCj-MY_P0@aTZyRs@n$$zeyMMYD=mlc(WyoWiNH3P6l#Uoa*$VbA=`v=zY%`s zI82=dRSo9!NK;v~c!;iK8>nb8xn8GDc0obERQ7|9EzEwVpE~=2UC>++6D&{sAZS(p zY}zoPIpp{3wNlkoq;f*QdDY*BFG*dIv0-IxN`DF<<Rn`4aG>U^9G$k03o8LX7IHX3 zgFn+?&pgx-D5mU`BH~lXS1jVg&Qbf~6#3sMl9hUO{f1-pUjLv_k)xN#QmgTMzN$-H zR6(^n#2B9;+5<scIc%HM<T89`(C!vGTnA#S(?0C?PA~6XLLU`-UI*b`2j^6f%zdqQ zMHGbLCnv(v>1qFE=WtUw_u&NtgZsTa9BIPKW_~Quo#D_IszTDWR3n~-#Z}>%MCXQU z7v)TQXbO@B+m%wqJx{>7*|K*>D1YPG)=&n-3-TbgFJv(J`(}%S2eaAnS@n(MpPMc5 zPejM1eDRc5{Fj6W{0Cb_2=8C#$874PCsbCn^S#odB$<_v5KvYDUOxq&NmqX5zdF>x zN25phJyIz_5v4Rs=&uS4KNP+Y2c}Zcj}Qy`r<#Ip;NlwYb*8Ev5i9UoGku$>n2fR3 zOI~KGS;)cxabxl-Qzg$GS~vf#0wj@P)=ggdD%llaKRDtx@hXtEh1ht(O!Hcm4LHY` zV}?CF&lc_dRWh!?vvY3=STF?_q1{v6A@KYZT7np{eIBOgRDtQ{iV{d){(prg<Dfcj zo)o;RSl12=^i5HgN{|L47Rq@ZcL$Slu5kHFdRwB3R}*#Ef_5@}j3I^1iKn{nzcrcE z-onDejeBdWYb#rOn~&~3SX=&BR-CsPD_^Sdcx`*_?%IR3ou_-Q^24R=A3m1jGqnl! zWSljMbsW0nnU9M&xP~{kHg;B)cUJDX1qKyyy5wTJ;u*cRR@WXc?W~Mxlk2AL!8J9x zy|c7~;i=~YYSs;yZr9Z2*2>bojr9jlKh~oYCtW1w>cS3E`!LYed7jsz#K+DoWAHNi z&o^P~)%QA?ahf)gRI6_zKgl$0DqlNnF<g<D*`Sd%8QZIg9SNnQm)@w-sZ};3XMf}e z6R>2!y%j8-Pu|rwk)3XftvN+mr+?#pSV1OSAHP?7u-*%?-0uysu#+6<nY~mY!xUL9 z1#G)#TpjjFqH$xFh3A2)YeN{hCZ(7lXJNmcfEd^RSU9X7<A94fmAz2v=*aNMrCu>t znWP7e#sWYYp<D^jQ3r7|ojNd{$~FD)g{nQ$MQPY4n7kH$1JiD^`BENntTYwLxcx-Q zgo{;yLe4X`wcAW{&AK-R^wbNy1CF9I;<fX^8q75)MQo=l#S9iK6b(oSDPH@#CR56b z-I33~4NNCqFbFBVioL#!mLhv8S0-ahWp8OFI7r--u)%9(2J|*wv^at*ja99O@@0zW z7_FASfXk|~VM9!!fxPzV#nI)R-CPg~d+zi+<lohgWX$k(Jg?VrZ=!zs1KzDQ#;Y#z zWi1u>wce`M5wFx__i>C5r8KY$u`;0pK&g_hGeTWxVKvGF5`w0N37@s8qIwC7PON1% z0-uI3ip9E?L&7F4dkB72H8O=27Y*^huLU>G5PGPAvxui24&j|%8k`j(xT*#3_75*( zooUUJeSFao2~{smn<^A&vcoPN<LP8zfkCBffr6D{T~Cz_jMHu}v+1GcNG%>>pO`k| z4knxx3R)cBUxiO<wPr{eXMFgc-Q?y~YlavXVry8DBI!v>RyRvk4@m5SgkV8IHozjD zG{u>T_=+qx=~%6tdX$UPag|&}wn&CRZ3Ht|4X0*Lt}$xk0mvmVEswocb^t|Vvm>PE zHP2ANHnQ2ObrGlA2Yq_$Cl_&!Z9&WhX3X?f5Qo|v*(nukBAKt`2fuEXl2#F*#TM+{ z<E&W_1}R5A4p0iXoHb)vDRQ|qEJG~6YWX;5tO$>k6>yFsC6@7oxk@$;%_EtOmd>us ziPo-UD9Bnn8bPfdL*{Ud7u*vwo@A|;T#!nIlx=7|X_G!5<{RJo8$~qFSUuEL@lB!n zk*rJ!!4QVEbWUi74L0-8a*R`=lfr31N+W8MoNf5Ez|;gwuJs)YSXvNIIKHS&n{}kN z3s9?sGA<*d8-t=iNXMrUu&LE3&eVa{gAptc^-UGjW_Wj>P|Vg_f+cj^<EvD+-b&Jm zXggZIpiiqnW4c@Aip4n^y$VCu>DMY2tr=~x5o>BuvR{a1Blb+O0%I*nSA{34cnNh% zIx}qjUFNvh8!9^2_Eek*W!0?8FITw0#iGV)9Gw;vw@b#bsGw%ludOEU@*FD;j;k<i zRRc$@<}fk-u^6E`?JGz&;&CZS77zN>h{MBf7^`q>KWaN*T}@+@Z-D2YvH(q-D(h<C zq8*kegYKyF4hsVp$}U);V#A!9sJy5*RXJ3f#ui$o@A7R)lntNCVpgzrrVzJ48nZ1? zc(WgrI7M@5EREiIX(eUSiPi_R*!~II%e3p5t2EKpl5uLw%o=3T^jMq=iyy|WUu4;U zoGilhWiWotQ7&U?HwKhnvy?%Vr}l^*)msJ%Gk?W?h0A2fO+noawND}D22y10I&)dg zGJ}6@N!k)k$_c~81-<jXx@Q}9sFYYWhDNup1g$?Bb$LS{A@~;T*y($F8o*w_&9d%Y zx3?#IOG#1e`H%Vx;zb~T=>C_z4UVTIJQ&_@k4`#+&Y&=*Bs(FoHnH}<>??TORb|<O zlyF!LM=b;yZLVw~-f3n1(ZiK31mdjU-&=jOzPz)xvAzxM_iPrX!(M;?7aZo;!z409 zzNT5}*WSza>GRp2-7KLQKMt_MXIkJnGK4NX6H{rS^`hTBtV}^Yl;^U3zkTpLfhnD} zlqXyqm#pSYk%d#Y!=2M-DOLhOWiwOvOs{s#RZJX}QZTq2vj~hm$zmd;`v$&09F#O` zN@3|Y_KAY9SnA&8qhb3v-$fC?B#<J5o(wy8`E$J$GDSjO13{EP9vAJTMz`E-Dc!d+ zCzz`JRAbkP0Xvn&R8HwylBt%d0y{SZ*6#@%BQiEhpfTTyFU2xyEO#}F2BEAM#Y%wg z&6Y(#WyUs8uyhXMjZBPXIpWub-Ujl;@>O{&8Z&~tCAP|6ZO5T8OlgRt7ze@-Qm4i` zpo0Y!RQT(Wv7$T<4K3Fc2crkZAfPZKCD05Fj_G8mNR2V*G*c+!Ftnqq`em{)GfHU; zo_YN=4lk>Wn$pdww=vk{G+k3%jN)rZB#V)$H3qN7nsXeoId$8Vh&d%Z2Jf6c9*3gk zIisE%((^o4>LFg~a%FF?+k4S}USo?O7Y>aP!SuD_i)Bxw8>uTb!BJIX%IYzEJttLh zfJuDoCZt(PDTrgS>L?1sY*FKMF$SD7CBtg0oVBa+ePL>}4;39oIP><8_7IGaCWUXF z=$+kBJo!sfuSstuLPMbYd5+njF&mg8A|K)o1iQN&Phdf*6ftE+9p+5aq<)z7J~r4Y zGgk`TpktT{vkwd&GdcPuT|e0vsR+)MLyT22vS<v`Xh(s|>m4lD>&iKNBN}3kZ^XO% z*yLWEn<ekeBGWWK`Os-)ppbG*MlC~eQxk*-{1;P>PZQFWY`5#pOPvG@)HL&`>vCpH zw0<lD%Aazs(&e5Yru@4awla$pkhS``IPw!Vtv%z+Ek_Gd{?rvaKNs*(;>pZkAfUDo z7$7kjlTjA|Eo0I8@Bdb9GQY^fS)nL-R!a)u>X7~eu3)##%@J}u1_|PYmV=9f(QMi| zj-inYq%GU&FP)#CUPhuY<N>Co-a%(L>JMbV2&j)Vj6~jYcG5Yoho)eXm@WOdx!V(Y zt42z>xRQ=$wQAaZ)AgyxR-`<RXe&@;LT-(_qaE4Gtken}($?bT+B5Ir2vn4U)`{Tb zf{vXKchQoo$TuOvR_5b%sxG!nHnv_FiyE1}!p}F&Wk2=a5vyejw5jqrm-hL2pWMs8 z2`R9|Ya#a7ElJd7`-Gi{v!R|@`&$9IsX6g_*iMGd+u$<u6)?5>+1SrcC;HkptiM)M zOi0;SF07(bOO^aoK=#}ir@D-CxZ3(U=Zj7eiMH=`<`1XuqxR`AydI0pk=PZ+Y_2q- z@2^0N4=YNK!<F`ULW0VOD{33(yUYFdDJ}^qkukJ)4YlBUyhhejL|~_;y;5_TN`HQ_ zgI<U8VKiD4Iwe%Kpw0?W@wA;_JTskT%Z1*uVoG|xi)X@wRSN7#ePne;O_R-lMZ6tC zgPP27bJ_{tfvm+MN__jEjqDq{E4_pE`LJ`S=Er7xFiOcgA@Eq*Ii)aonA3{21=0po zM9fMdGdugm!*8t)L^<21xY;$`Y3WKvk85h%FKN3y<$11d%yNyZ!4+_tiPF{x8tGVI zWeMW8a!Q3VnO~lCPdhl{Oi2o5NM<a%jh2E-hzgMp$mqJ_MKlB)Nt+kWut)>3EO)4x z5O|47#8<i7?!CB$eaS}Pu<Sb1M(C34qU2ZmGws1K{oGPR*m4OkY>F!C2~y7(3oL6+ zwx=UeLx-d8V2Jyuj^&09HbpScZvQ;L_@aG!VZtYEOWaJ8eYAxI>~$UPU?D5VCM*lW zH=xfER5&L}8Qg0SJD^L!uz_v^nK6?O-X|es(Zj?3rEygF>LJaJ^jr?uIc=jol<)uv z4NPe$l5=hh0<LY9|METqSUIC^FC-sH=yf8WCSbuUxfMLl&UGXAT#4EURD)vIn6qVq zD6aC9IAY1qw5zK?erO~CsvQat<`-oEL!}_|3Ks|I@YQh|km(>B0a-WDr%<H*(-$4S zy?ZGuol;K>9sw<dSq=iY!llcxmkb_KD;M-Fu%WDQg>Zb8Njey}%RYuM^SBk{%B%21 zjJ)tk%|P`07xVIRVPS3Cr15CI$!y2#cb71uHBK%+WKfStZS2kymyQ1f{?}9rxF1u- zBIC~#j`A2ADljEZN^r{X^~w1)_z$Cw3d4$=7ljApaJOF2g>2`zjD=@)!}Z4XR2+~T zXe6|O2{`NwWQ5euFg|WCDD1AS$U!Q^U$|(e%1(WEn9aUX-J6hwEqz>bOwO)d(2HDB zH>-8`vr*>CN*XBa5m(Alj4Lm_cp|tD_sK3S1a3ULIG~f{CPG0Z!;V})X$%Z`fq)Q6 z9~*v<7x)06?XzL{Mc?3)Dp)G9@Uwr5B10zF48O_?d}xnGgZqR2#d-AAzx^4ksf#$i z>+WBSIzyvv&3u*Y)pMqUsVaL=ZZrZONp^@7OP!IGf_bnNa!Uh_d0soCHUvnOlnk+L z<C?`u%uGqJTXS+pzSB8t;-sp)TKu5#SXLw@7Ava#yWM^uBk7g2LD&SO`S<pg1jU$r zR<R^&_)<wgSHn9J6y{dOx9ao{o3SJ*Uz?KyQP5J^4EV}(Y5bHjAgwTsKU0ni<Iu4j z`}2|mOyPDBm&whZk}F}mJmn8!V=GU1=%jk4%)>sDfVGfyX@q3aRPcE)f}$3vq9+Rd zKjN|l8BQfbYeq@y&RwVS<31#J3SbdqWz1Y6kX|9+YDQ`0-P<r5{P+|zavg)BTvBJY zE1pXV21VLM+7szJWe+l$S*<4BXPx9#rOGfN5UM1vDpev<v5n|OrFcj~v5JCQ7b=Al z`DFRzRi%pZh9@ZNr0;ws2vF7V(&Dn3h-_|OE%a{a2>WKVRNf|msk4>LLJdQ2@`GJ$ zC1G@FBzY(5=Cvvv@QgNKStmQ_#nx8Bn^qcjD8nU1`0v!k4S_;_+jloaP3ZuM--E$C zyuWu0t0`yd;&RN*V^xOMm;`Rm+DL;jt%<Gbc&ur>TUH?z8DTk|uZ7i;ceQLS1ogUM zOpla)zPL2k%o-@km8upGGQ=P>4U9B$HJav8sji+H5FJ_^%Q-434Tg(23tEW{ReaU9 zlHs=0r($rl0sowMbl~{QsuO89>}9$b?+)*GdYwU=;U*u0OUny1<2u(4Bz*I6Yq3?E zBNlz6=tvU?l7Lew&nR)~N6P`Di$Tv*nQMiA-wZ<4rJ$s2$Sx#(7}9vJj?#+GV!LtY z7FS&BmKRmy6KJu%PE_gA$?a2x!o$^)$NWvXHhn9~n`w1fo%<f;8?Pp;3c;vtp5Ou3 z2-=LnB?2A#fP`=}=ns7=;s{C*i*tGvj7QP~lJ96m`80ZfK>5v6BKR2gkA=c#B^wK8 zO{lPF$&e~)`NwTl1#aM8E5Xp1RV%6lT#pn~NPSa~Al~>fs3ko8P$0*cW7?ilMf^9? z^k>PS2^OV3g_Khw7u%Uyp@l;FAEC&sXD2@Px8Cocb7*uEo?6{$tY+?@t7tAe&O|`R zIb>goteXider{X{rV#~NF`ZJY8YFDYp6+%)3R)wq6H32FI8YT17)!bbMX#tNREWcN zCRP<2M%0Lu%<cTqNWOeG^77?6F~%w}iqsXqewnSZ>H8$JVpz1kYoB+?<~W?$8633_ zI;}vqBB_MC^_o5Lw0+fE4o|!Y;s3ODPC6~#R)k~tgY!O)7Wa=@WY-q{f7EXsbzik! ze>d!O+=U0-;Zm>PyFBY(z>NM4GB&{BmtJfCvUM?R9d}>A;B2*R3C%i+)0OQOr;|@U zVAsO~$qtq*ZX(SjZ}yDS*+@QD>)iu?{P|$efiIa(Cs%(?>*>}E?d)Oa^e7ROnc>Ag z+X_!>Qh5F5aSvZbMz^&j=S!~ixaVss^HsW1u-}Hy>@Svbk;wClufzAhd9|UUNgT|4 z&ftnTbgN3Lc<0PQ=G8_H{ft{DuLYuEtzDh$js`Y_<O&Jk8mCn7Gn(O8N)Y&{nk8iw z(O?k=@xfNVid9ZH>EhHLe<!6g`90Mp)`~hD_F~>!!i#k?nH<kEl?qdqv?}JTZ=TFE zBOy*~)_p|ORO{Ps11}28WldRM*ScL=-v$sXQx>@7+0W62XE?DNK2{P)pWW=9tOIC{ zvKuo0NaquAjcsA+`}I#gmV4f>DM!}8)h$TTk)d;@P!2vIZddC1u;kl!b4gJ$&4EA# zBitEgo|b@%tH@{4o0!?GpdQ2?HD#cXVQGnu?Q0(PS)&~=cDxc?k_Tu_MOINv>l8-P z|H{_ERQoe}aa{%9cyU}%PYJE5i;`D<<}+qxN<!92-&HDwWMYNz*%!_#yRc|QvqefR zr99MCLU2)B$-7z=mL*1hUPfywHeOn#xn`XDTG<O4Kh~jn$`&!$NZ0vgRxY&|(p!h7 z*xF>PeHyiU6$SG?X>m<7E4vO8M9>(e?^53eTT5|diYwv#zPe{zTCZ#+`+AW+k4@HK zX_E;aF)Z02exzzJq)2$%L76Kfv`P1*M)FSUhLb{wW4QUpPA|r~yNYC3A+T<Wtpr1q znwwSNLE#GQwD;PJ<kI#$p|HHSVe8xrpe&wXtt!-_pQebs45KpX8~KOk!dMbXNjC~( zJCfT&`QPc6$v7gW=V7v|5tTd9>rze*(3NDTSw?dY%$_IA$OR1%Ur<_&InA0hJ!c(+ zEX(TKL?>TK0_^i+AG*^L1avu)1jkDQueBL2KGe-ctnBJT+u@4Ce3aJtH9(^{5m3m4 z@e*W`c8!b%&1<toxI!J3e@7?ZjTl^n=QaCd)H7Gzrm}0+*ophtq-s!yC}|V9i)^K< z7}7*&*S3>qA8=Qf+g?iIl<%BV(yjF@uj1GY(nNO-y*DzgTlNBL-Hmf?GgWRO*G3(X zjUYkRX66r(u-;({ykN@O{*q_yZ^a|v>JTmqhR=n<8|S{D?HM6vjaA$5#D?l)o8E(t zu!uOdGGyCR+>3Iw6pX2elN<imPASCFR3%IvIJ{8;d*j?qJhccbTuaA1Ojy#BS(X&B zJxf8whp+g*_s+b`ZHilsQkwE?1l`K3?r5_QBO%sT_xewGKJx+go-lptMJI1fYvq*{ zPCp>uC&emNHqPX5$fp*URa_n0yP}sb2aCahhAPb+e-t0Al!3Gh#Pm=K`iZ5fNqkq? zT{9Q@+AQLqyiUrh8^W4c)hwe@GbP|rRY48M#;A)NN#h}|8pJD(;DW|@M`B8k>r@-d zr~To@0P+0qcR)=}Z3Hf(;1bmaK1kt%ni~PkBEO<TuE&4qZiuXyE>+h>$g!9!)mrxs znwV3qB00!8AnS}7v3m73&=7_3@z@1b5dxt;2%o)1FsdWLR#Z%`1JpKIB@#lPSeb03 z4kt$op>4^$2;0;i6=hlg`XLjQk-V#IDxuGq)+RGNLYLNiX>HUbLia|;ICby<8Hfh$ zQ%Uwv(FqpJRaQe`18X?3RI(7535f_44TLHnoRPGZVr7v`YvI~PI=UB&t+NvxxPt7v z?-XSB;HCbGA{;72Glf?>UE5Pw=WCWE4d?Hq8%0r{O!zpGdm-}gldYedudS%WX8v*? z=?9n^ZwM!u{OlawYmeIFO7#)rMURHdJ|cG5-t*4o9_+0lFa91U*in0LMY5w7N@9Hw zcbgMk$mX2)%PtFs)Nn_+s1p(tXut<lt`(I~DF}6w%GR^ta46`6s70CJLlnGjFcyIW zC$>Y}zmgSD6CVI!KR-qAPHV@IqCa5lk$d=tBY(5CBPn34AG!6NuO=T1p<IG>nke%c z_Wq3ryyz&@A5a^(T1Hn16~EDHH}#aEY1cNKkJ^CJn$ucI19Z0tP-*G4wg)2NDBJMj zbOZ{9hY5Vxk$O<$fnmr|^d=2D(zG7o*onR6C~5ScB*ry>lnf~#jv^Lk<8#CufwMP} zWw^pL(lGg+U&HJ+1T9%pQgtwgkQFVCuqCBVHm8O8_RJM$P*q4owxCl0fAOzcMbg;C z#1xFF*g|YQ9K#?6RA}V|x?m07jRUYUBIZuoBMqlxuZAt8FYUlQ9wLtzqv>$l24dsd zr<X`1flRyoQR}cf5G{-NJ5X$h06G5sk7dvugj%)sJB+DQOaKQA*Y6!8VsChHjB6Tj z*hO0Hj%FEVhlzaDZJ(NEx(EhiGe<Z>g)_x{Ua;Xl*~ap`-5qXN8P^@cuI|n_o#(mQ z63K+Q+G-)S(sj;s&N#!;IulVpjGLQ<+g_XDv_~ou8w;o;L4JAJHNCVvcipjXy4$qG zWScaE;(6BZ(Kg#>3hfs{E9^4KMu_1x!v%J=8ti)noc<kWy>A_o`Km&6?E{%P9r|$k z5(La<(9Hla6Mh*&6ecghkNPJ-l&zV`%2j6(_b`Sd1sgFw<(KrX#N|P=MZ<H+_Ca7K zWGex#Ap5&-I)$-dlQLd%ANE_Z-rO!j#ZyDiqFl+Y1D!H%f*h`lFWG+W!CA&~BlCOC zsI=bc9m>~g<50@&v&<Fpn2*4mXVZ9yrJHW~M<BY%wJV*hEE5GWxPT3c1)*~E(}_JI zW+Yr^a>CM6DfnocAPD<gDZ)ZmTxX`b1iE|Kj=2b#<BgJdxh^VBD!U=07&SkhSE|#< z5=Non+SQY;s6AH9ST$5gF|CVGr&tUpq!>5nszIDeR+U=s%%q#HNaGU<YcSqMvNL02 zR^_3K)r%&vNy7B&W1gr&9FJBt2sVJK+C$>qDLe%OCY(?OH|+Evm2xtDxh)~=F;O&K zQzfxX)@~WmV`I&v&bM}*jOm8vePT&t_(dtKbW3GRHj``!U>e_NrXEpcHJd03#O<$L zt6|95K0-BbAF76BVdeFdvqFA0^VX1N?@i=n<aQb+HxHt~=2C%tE<dy#GP;ohU!P_C zQ#dK4XmOoDG#cvTpy49VYkx=y0jiICiQp=BRm?4}*K8l^A+a`Y-L;$+v0~m^$XP}1 zvrKhq^_0#sK|kq^P9F8-Iv`|+KIoh?74};(7Nt2Qsnef!jZ@t&3Jn3O>cCl)td9=b z7sn?OP@?0|yryk+If0P!TPOzFi`4f|?BE-6aNsSIH`NvjQeq1V<sk^+b46x+JCqs! zR4Hho_zto{^{uaX{Z`>dWdl(-x>mF-hF&uj1=n{?1lO_2Yt?vAG_lmC)G7kDcu(4Z z#ogCa>J}R!%7VL^Yk9)NIYR0s_kEg!#TRom4@_b-V`<<PDup?h)|9f3wezf=O4cl? zs*zbKUo)75(preu%GWvV_8Lsg#Fl<(vqp>~gKr}F^{6#NNCnN~DvB<#P`pMk^R(d4 zB0)!jX`Bu4t4F!W?~eMy^p4g=fsIirf)&~eNcoi)qp&k$#PR`pB;f4uln@NNJe36? z!4BM?vios6_S83=)UwnWVov5jnse&#U%N#QefgLDi`GkovD2}Ac!}fP@PVJ6Uh-&e z`|yxwsrS2whd3H8p%U;ucW{`TK63SgOZ%&~5RXYOpL7nMw+0uda!#CZcsRX#*lEjQ zbh_5VHV2*a{$PYt=W<ywwvMD7>x4&1B>xrX_weGJC)>pXPv2Iz*J|TtFuLr~L!L=* z0T1-K%{ARZ%cN;Sg?s%2W>A6)f6#x$bpJ;<(?BnNcfgI3qwX<cybk4P`|uoR`3Xz# z?nD0{W4E(|Y(OJ6NYB5mA<g1sJ?^d`I{fs1=O^bwT!H?HqneP1R2i<k8g+Uci~qw> z_Q8uTQU;9L#|x&Z|NFoHV~gg?kgr>Rna6+s@)x1ULJPN`xl=h0FC8=~0zgvbFMs*V ze5(l#1g}l<mpSkmW;1Xj>N?<CR9-fA4yb{v!B>9VSy|u4HQ;+YOZOqlvrUjNQw=m) z>pL^gir3Wb;OU&^?`p0(9|XHi!;&I!0%5wdBwmKTGw9DFn*w$jJ$`3kecS*l-0_{* zy+d;;C=()>yI@*}o&Aerqf*Q)Vfv>@@TL;<P03rHJ>imDYd-D{yV&;kc7B+yfmQ?V zPJGc}Ds;U|=AhF*GIgT!2nih1ooMivc6PSb?mpUC*;`+FxWduzg3%A<as$`O!}hr! zZ!=@*E$~)FR_yvitS7iPY4W6{hV_02Qs%lbCj)Pf+hgDMTX~Uaa-+f%$efCz0pg4N zT!G}9oq??M#MqV$4csOEmXAqevZ33<duR@71(LYMa=J(4=`OdjMW`V;T)L}kl0m?W z<&r_nF(<~tLQH>q)11yw><RxW-Q!E`B7coRm41e9dUc-YrApVR>v*M(L01Y@?#$CW zAdQgi?vB8Y`rnad%Gm%0=A<eKeU7Z8WTCM$@Lz?by3;A#aN~w2n5RpHY<aFY?Ld|| zvUB{8_I*mO_zxiU{Cq=FU#Fg284UV^@7uk@)6T$#LSa8XRh<uz=GBBgZAK20v>*rC zDYx85qd4U<Nu0#xZ7&vZ>hoJW?m?67>OUa{wFPBDa9$UKf~j$@bB>LKPVeAyt;b*i zm>oPMIcmcSO0Zy<$1eZF`>4{7+b8{t)5G=t=zEx29q;4O*4%_As&)^i5R_x~6QnPB zZ!+OWF=n(&LDr<Cy@fM<J=|0KAbAf1^?2`0+yt;=laE6rWbciR(zl}lucIY(U`R(O zp^4K@ulf>}X!`PEABD3o0sMl;Y6w~FrKPQ{rKfwVYY%o-w)P%vuk8J>@-+OuxwUeC zZ)0_Jdu3;Dd1-U!(bh`%880^;K3rMfiC^B^Sk8ZV^8MP*%J$~cGN6QZz*hI*MC}T{ zCK&pS5dE~P{}h(H!F?pA9OskDTz+n>7k*2Zu)^`iBuLzIrz(!QTAXOCT;(fs-moQ9 z<D@M+k;nruJVBn$VGzh`zCKP$LavQK=ODNsoC>`<J)X|g7DROo>1*xwpp>whF`L?v z74~>-du?Z9Yj1mH>+#z1N@|Gf0DLlVBTfZobd)j7>}3VYqMP4ulAmDD?|~UtexzMD z_ubsL3(wl~zy8es+@Ak>eiwf~-&pwg+v?l@x$$uwU;u~NxGso>EfCP2fHiI4VL_h% zM?Tr6_kR8#2R~UDgf7<#f8r80;l-OR85npS$YV&85^xJ<@Zbq2HLU6sSBYxTo2_8{ z5sdA}+6Hcp8AA}%Ty`nk^ICZbY+@`yMH8hA!hX^;1q5+^mmihSVHa2`e6AFBtj?0| zp;9d9B?|_Rm7?Q&kGO&cOs*DJD7hdE!Z1|%GqDvG;EcMXN20Ckar_eM8L@QBOY*$z zY>nC0mdczHU05hvDMf?gV#d~MH+qzFV>X5Zxvkfq6R1wK3kyhkhbvVDa&WubZ!I`9 z4o+IQ>B&syo5HU~4XZM6(>`{9Q>#{%rL8FOTpfhD8O@NVfaiEom!RYaR7apX4yKnA z5!H~v4&JbTF*xWfV^~VWo#_OI8+eZWGVy~j-@<55S#bm@!(|W$^NaHD+>CDuJq&>c zv=>(dH;g0;h9db!jGNcD7hpKtytAM$Z~l#szab!b#I%V+tG_w;_7&tq*B2t55}>*x zg+rue;T2*tzlhWwb}X(wv;px10}C1Pq=+RAx~{`Z{M}j*v@B#&_bgU25W_xt&@x2M zYBr-8S<+#>xb*xY+>vI&nlqFQRa(%O87w2ah$xasd~k`WW!g*S3ixCSH%25|J3xj` ziZ<oh;OvyEjK{XR0+G{Yr+sYJ^O>1kGgiJ(pH9jZb#$^-QfcNuJ8l;amq2|{j?Ur6 zLSCwRkWx2xSY?}~x@NDmH>R=5vsrqz&24M)bEmI!C2nIAUN_%#`Vi%$d?^_=RcNqH zPbd1&Rt5P)cmm3jQM(N5F(@EKVkPEW(U&V{BhQJVXo1f{B}9k@t*}RI$z=1d;4GQ^ z(;;D{W=#jZCl*!ke&h($%aZ>Ua9EZZWvsdgFy|2j5segG+;G{EV?B&er`{qQ;ZN^t zs!+@Y77;K0ao)fJuyYs<9N>k^!?~EyH!+XLxnSp@Samc$re7W7PGmSe&{|F=S~hDZ zTMl4rF~T0sl!34jT*LH9Ns(`&A_&hTx}mreC^F*a)@TV|c*=(aB$=h9zhi#T0ma?P zv4y}k^7MKpbwv_P-4X`~3^P<?m^(W%L1#QOS!z<+%`!tjRxPkeC&|<r(}|Uo8k$i3 zZ#c(dv!^$YQ$?f8`JjcxH=M8*Z?;r{G^ns>I+bk0I;TZN!w5ch`Yzfdf-jib9w3lW z!0^B5B9*dC@SJDdWjFd6&KQVR;j8v20qI#w^_~hZRba|Wss@cS#Hh)N9wZu^dB)!x z&CnA{2%Cc5jG52ywf+3J<g=I#^yapBO38UCMD~K$fuADn4Dn2%c<)87w5vgnmm{)G zeOs!*TF+)|73`Bj_nN0QS;=konSfcSK>gr9^GT%BRwkihDiOH-t1b@g7yIuFwn{KC zM_ug32<5SXYpho9<Q~ph^mg*d2EuFs+kf4P!t{*GiMj=Zt!MvLYk4TAuAX_4v~IwT zmPtaL5+sZ)AN1uz+){uo-MNnw9<fmEzph`TV?}gqsqo)CABQEpIt$<Ox9}E4SUA+S zP1MnyJ9XT`+QR-j{Uz*+LqrS%uyT3)e`|G4;r4qStq%z+{EOidy&8Z;NM2=x9L3ql zKR4<j(w-9s>FCdT*v><k1~W^lyaEg<ksmqQCy{<tF07(bt)6F=xZKPLGUb)torGg? z5%M|;2$TGseh23)hPD-HoOK(<I%UuI@EWsMuQQv-C15RI40wm%B;az8R7;Ak7~@Cr z>X+-eoxL&YSH^zWy1_|6z^4=CDvq5}Snpn{LRs#gouNaP7*ZdWeoB*ECph%d5l`Y0 zhr$asf^|t1VZ8Wrv;Xg-;r|<UVK<wdgSpu^czCAUqNxKDrlxF{n)g-zBUTSpjv|IL z47CRf2Kx$7$BGUo3E=_q=&^*0bue>e9QXy`(*1#`BjXONQ5G`?z{IRXg7&!b$)oNF ze83CGO0;Du{z2~B!;y3X%TaXAJ#HKw!Nk;g&-WAUJ_AbgtyE+bod2(?-2k@k0H-Vx zh)oR<EZAGO5Ojn4EnaqUD)zL)7^0TSpD_|!{fiL;5qKb-quxI#>dpWr_6S?;(_z1L zaDhX>N4!U)W2(1AQE1?Sye54Z#xoYKQK%{~R5g?aPC57=E}~GSf=wbTM1S4w{k3LD zExIbJR$VJ}4pMA?+S2L2R_`eSw&~l|aUX+8tWCpK@?Y|AwJ+DNcRW+&LnDZ96{AEe zwcfnJG#cvek}TyXoN6OQ!ysw7)Q*rVj9RdCzs9~8E``R8Sya{rcYeOvs$tWRHS1Zj zF~uS&v#ydpjb_LXc4RFFr&CWl2`h!InJ=oSta|g<#YDCnA(ZKaSXJ3l6@~Q$T<t<X z>d#nv3xcuDV;3|snMa?V{SD;B#4ZHSaZ7m#;w?s<>BUvP=9eRupq|$1i1gNAu06|$ z5eGCgBV)3P(Aez|Rc`7ovqw!byC1G`T~&vR77{AEX5m{M6&htwf8$p$RYV){iE90X zMbwymR*<LEcE$=!?G49AG(kinwSQ4h*kEAJdbE|rnk<>$+A=xMm*aWTF1(G|rF}5$ z0jUyC$#@R6+!?Im8mx6Z0jFio>s?KIeEct1qWuG`zLBMw+dtHgp|i>p*f^fBLR1R^ zjD$dCuG)W2<vN9_6%4^lC9lIgF2<c$-4aN)0uq!B%PO4E^Jw7dj)i&)=@!(Pp{b{@ zw1CmQJtIv!!d~Kx4!l6Nhzglm`PdDAeHpA3?W~f|M4}v+jLr<^F-ZzA+&EI6HjSj^ zV41=q$6FH~OMZOGOuel+EKcHCk=jA~WAvOud`7{*U&sl@;`=(DX-g=nPRCb2^2EZx z1Zsi@j9mZSbB1Tb5_l10e5~-IXi+Xt*)OW>)QEPIuJ1UlTEen(?hS0nCFAuitnmdb zl03H38@6UVB2_!a_s2TUrMQA9vTxqQZI~Fzu}%j4mqQa@63=+`j9!_)ExYQJA<V3u z-XvKIY{|kHJV(T2x*@S8DsHZ7X9cu#Ck4e<5O_8ffd`DbVXQ8Ou=^{wdC*K)UA~lc zmpv(Gpwr70y-Jxz=DVoGGZimEWMN_F>E?=wxKnc~{<`tQ%KBctBf60RpuJMTiLmiZ z=UFOT?Q6x5Kz@o#sWgM*%{}l9oH8e!AyzF6Ka4d669*tJ6sKM=Ib^!Jb`Q~oYpZK3 zTY>cek)_lKBv?$XZxAZ<zxZ+EMoMjQ9LUh{sKJBwe&-am%x0~0h3`M+#dK<UModA6 z6RUtJM1ZB}LdBzGqRS|x{ENHsc<I3-JD@FY#Bq2)kSJ^`8g?n=8cfPPV5FJ`WcqSc zJyZ#bCUitMAQn*)rgM}IP52LORBO;j8lGlU>`FDID}j2VSh_Z)q31Ee;onRj9HQR5 zWu=en4hKlq6&dc>*!g~C3xj7Jaer;iel(o@D>`7POx-e@jE}TuJ1D4=Z=L6^1?GbD zPWOrtFFfZq>I{i;v>;5Yc*iqRAU&+eKkV~5qUYRyKGH?W5NqQ(OMux&@G=;I`e^tO zw%U*2t89G)PhjvK-Ae`!FDfH|cXTVo(i5Pmq+^_xFe{lb>6q6b?4mHC<Lly(ZbHFr zE^R^VzhBv2+s;utt5<R^2uD&3aNZTwL|HaNeEGo!;-{y<JUoX$Lh(<hiLCmBeN=Ry zh8>Re(2mR;4A)*tREmCCS-+Pk4Wbc`Am215SXTEJe7||1Y!1HFmk7IHJP5V^fx7rx zSZhV5VT@<90rOK!mdAo=O{YntQZmZRiB^6Nt0j7NFg6k)$c#*$WYf?=(94owOusw< zr@+r+T4wbOw~Wz)q5cDp+-%_}B(6??c|mq07r`{O=7>{+R9(E(_D-O`V*G5-m3K*f zEDEe5h~w~k2-|~bc<urg`F8Dm;)}XCnCm={#IQ#_z7ZcZGQo=e;3iLvxKLod$n`No z1#qNCtGjtph?TtK5l@uFj^!CgAUXcgIqSdZJnEr^L&o6Vy#y)-_L_~gY;YPhT%a?0 zR#zR_rOM2?Yhha=qE)QZvz=iCzg@$mH47;T(qc4d(s$aZvRc|SxOAcuo*zn_U*#O6 z<lk94+Dir8a92DlW|^K5So4dF9_Sunv6d0a2CxJ<g(8B(b|*xMHl4&fC_;Slx|mAj zLoJa#<a)Q;YY#3r&Ud%Za2g9H5yJ2$DZepT`PT*V;5MyxAHlY?ye2F^X)}`{h4XWh zRag^!hdd08`++80rAfyZDtgeyS#e4VM^|EcHq6WI?s4}tjE=O^hN%LpXcoH<)w8t$ zR1^r-0=n^)0fY5XJ(v$8FwPL6SvtV3ZQx_T3Q{_Nmvg31r=24Pd1(icR_G-3Hh63V z3_3N9plIG}kTKD^a}Gmnm;(okuekj63FHqZK|x2MrGp8>Y#?e|;))y%XtNnvH{!~J z5}aeq^_NW3Aa_vCxex0&<1{xrLT>8Wbm<eRjf@Fz=SZpquME5z^H_F|9FEiBcZ9w8 z7(oMPh#P}b&qoz6#VMSjOc{+n)yaiX$T%2!{F?-sW+yH;%Z9Aw=!+$ruvhRxSq$so zY$5^~Vb-Zm91#2VVE4iL#o4|pvKawYDY$~vJ$m!0j4M@zmYiSYxd{5!bc#jrGxrCX z1#0i{%9f<*Si4sdHA9zY!XTS&nnu7j(41d<(LTNCeEhK}2V)~x@LY;&(4woQp91^T z^M*1v1+dbk?P}k%G|F{dvAj~x3%$76s*prRq?RVxt{W2j$$!f1<Kl(DsZ=>pjG@x! zU2<PzlhQG?^+d(C;S!TxuXcNfO9OX)1|C`%_d`)DiJ96kFUT+iYfpzJr#B}xz(gHX zSV>r970Zxi*c~Dp)Kw}PmBQ47siK{+1mZ_djlMob>p>rv0$2g?Dv)}Z3~q^v^L-{O z48b5aZB`vzKne>G`_Q}e4>+HF7(emWm08RiyHwTL$ZlkxK9<=}afFK6YQMz5A&qg2 znnO>I&9E9{$I`yD82<z=3d}D?=L?#r9U%}e`SFu~|E`Edcr;!Z^-25m`CH(B1NMF9 z|A_5%`ccMz36fT(9x}$CJdD#yJ#)&pqS|FAKh^E>(&RKrzvbovJ8jUTVAYcK;m6wF z%_;Xf2Yt2lUDCK=OW_m~LgbDuXKkvPmjk91Ikb3@4btU!=m|(qZfd<&45r`~h?=50 zk6x&jEZT}BX5(|??#%cBYT-7FaFnpw5S+*b8oJELZ^TyPV~nCSc1qL(b7I8INLc3J zNVV7f?g&Vpgn}Y6)R_#vz%rc?Y+wi}mqbVTRyclQ-DwFKp2Jlhqu20)+?tAY9Pm%D z>#P}C=4LTT>tTNEEWyC6f(*JxAbvXGllKQo-{x!+4w5_Ah&eKVq)@KcER!8(BcE0_ zGJZU)+Yn3~8|krB3ZT_CuXDRBNT0Xc^AdONEOZ^VIOoU4<_>cBZDWw1&C)68i8RYy z&u6n{AAln=i-VhbxRMXB3+c^u?`8K2K?deq_$c+r75=k*`q@~`bxOeZF!bvcq~3Rz zjO(95c~2WV5Eqgp6BL3AAzv#w!C6?ZGo2F6EwzIT(YzRl2&4<5aNV@V8<x2wiw8TE zIcpYSAuou~jUY`|_>~-QKR#pbMYBMg)!pf2Z5E<ZwP4d$cUR6XaKT&m1!6Sf_ElE$ z<nxud6)fm`KnX=_T8t=cx_!OEnVTm?-K#r|r}A=BYqI=_<<#674d3VCPXBRxU<x<z zq#I(YDv0y?f!}7ir-F=>4)EKzARl%{C;h`QYbZ~uWT91AD5)j555kQ4lHyOj=ktr* z;c9m<97#S;w#LLTP|V3GkgAQCTja?4Yy1LdqQ#9_{b6?_5I%~XpLYB&%h2u+@bAO2 zwLH0oGg^mT_{L9>67B`UY7PyTUK?|Ehs8GDKA$#S>8s~R#i+tvJ?9~qYQg(%Gr+_4 zF;aNa#z3-Xm}c#>d!3^;Zn3;Z1}L`iRvAD#6KI}8?N`OiW4wzV$pQnI`tLpu$dV*C zJMGvss`XZ9=<irY4pVN_n>AIi+RHB)O7^GZs><7*(RxMArO+?Wony|t4*5J3B)s7E zicQLwnjaId7jah8*-N2`Sg<IgPSB`~UU(zWtkE2{C~7xeTn9t%Tv|R#cf^|MFxUYz z;v21ECI+_EBoY8&<&IK08`7?$@^;}lIYSnML)mL-X_~P@5VDy<O-ByMoCpIHLpCC~ zS@sHC1?a3q&dw=!2olETwP^UnV5NxY36U}IgN$P_WkRM0Lda#uU;zX>%^>X0FuhAz zr=PN-;9NLL9`UaUj8Z?)u%_HL?V0luBvjl*$F(rvT$(2!=V<$f1;V&Kt2gny-z2Xr z{Na0&h&ndYq3W>LKw2=?b$D&_AjUL=Yvw*je8F5Z-Dq}fWkjEU>y4~GLQ7@QrR1{f z^_dY+hQkmyE%?(tDYsuCLwXK;z$f7j7GI|=Pr8Rw6GX#_z3@3CQ974bY;dCKEi|qX zOmLZM71!Zxq>bHj9-n;Os$M%h!E(X3o)(foN5`d_&Mc@{=}TV2PMU?hKvfFF+abD> zS*yxD(f!1k>Fgh`Z6KmZumpeCaPKAZ@Wy%sK632X)14&;x0>sba3Y}fQ%(nLmd6ly z+yV{Zg3!xuppwl<U&(8bRxTLhSI`z|3o&|>yv(Tb^;Pr+VodbZNNae~*>CrJ5{AG5 zSHX-?5?tq1R|jDG-L>8+yqMqbJbXY2NJd@d((L-f=lNeBB5o$}P*nQKUV6b7%!<vY z!0Joy8osN97_!NU6;?{9K>fsB5a_Bi(>fe>3D@z`?7Lo}%sb!|K`Nfp?f;*>x9yJO zIMPHvTfd@p4)zlC5|ZuN-7^=KDM5U(aYiD!1SGF7p~W<T2G}E@8}4pU<WTzW_jw}n zCGxGRx&ex^M>w|FRh1bT85t2785tSLP_fnR?(!yZ8{)R^6j|rm4;<!D+2%a~O^*>S z0AKO1`@AqK|HLSBh9$|>QZbTS7RtpwFHOJNir!5s^{8;M7x!?e^z9{b5Q+~q!U-0$ z3lF!8{<O~UiK{W;$RWA?Cl57Q{5U~~yF>f9lHyH=Ih-AfO|fH-Dt7P;ub0mz3pq>h zUQFRe3)F)ZoyONUnboNCI}EcU8Qo*1qtQ}yod-gd9`gc2;un>&DwRKt0))UkySus% z_83>Cg_nh8TAOC>qyvu~Kn+}qlLBV$zfMNqPbOE`r$quMo-lferOXfG#VL;(A+^@@ z<@92@!Yy>}&sofNEMB<AVK>7r@_AleN&*&)4LT}F1$|q$pykw_ch3yFQ7Rr|*E!K* zC<oZ(#Zx(^UYp<DA|xrrt-)$8LRfgc89d8Fx|JsCr*=teq0v(D<$=~7FK85b?5t05 zG~Ax4A-u?I@mFOq%_^3)3bwr!W5I2{(^(`p-uz{9fyi-Hw?R$nBIOJ@#Ta*oqd!Ts zjDB6>)<LJHLp`TnlhTtn)eCLv*W4_RVS9d`wTHdv3tn!Jy{2VKW{5Y|sPX@B|M{Z_ zxCP{IxCR7ABKPn!U8_6;tmjCJc5_cJsi*|3I;X@L=LyUq%@;fHzQBoFuL~Q3E|ln) zjThCZ_}&QEfjGCd{q@1Y2l}sFbw5{kPQ7D1gT@OW&Mx#)CK55ApuRaS0^tt;15P+t zE}97O0{3NoxGh1T{=R|W4jRwK7jF@<L4Y<WKA(!LdpwSy`eJpopsvGdGZ`Wml7^!b z?NM2ylBIsTTBI@}sFb3(J+?x<hMS(`)BZrS6ud}&bV{hBQ>@wXS;wsll<jI2m@QC% zizHy(_*4|Ek%d*N??Vy-q+W<bLR|EGffHKD#34*qtxLCZ?)bBU2)}2zmxbPJf?uX` zkcE0Ps@O8FpK_%pn|nQ<>Ve~T3MY<R&hVMq)_YZO{NCCg^+_LSudy+K`Oy&yVT*D- zrDLQHV)7IG1)thHbhPuV7N==t0i*nD1Xax!pZ>>W^%5!YXUk8)153nyUG6Mb$j8@o zJ~)IT$CR5Sk%!`}JRBpzV>}~1JO8T4eEMEc5*8vWt8LXoV&k$9E83?UkzJ#NUtS1c zB)OtDh)^{fw6;<co7{4P1$!db953Hqa@NK{X92U~?Z(R$6Ovxa37408PqAh4z{#RI zuE0c?PUIw$GZ(fivpB3PHekBQ+R@f?HeP^smlht*jQ*bg?(F3FOVj@`$C`}6x2vaT zj+cEljw%Mm_L20riub({Q!7pV78fD=KN*EDrfS%1Z{_V3&NE-HZszi9<W^sHix$#j zkjC}E8%*wErO4>M0+C89wKHG&Iz~31r_J?qro}HCJ`bKKbunwy47T<5u?@oYOCIIv zj%ln*Id}y5Z%O*{%}aC^7Hqp(4_0<Q?7}Oy+ygM$jV*8rDmRm4PB_pjyMp!6dskHt zGL_!BChS(RlJ8d5JL?||v(6!`gDdwU4G3a{O`xW%T;K5oD{%=_ITC=!aVt}e0lnX) z%Vu5IQ`+S|Q5<r0=msttHz~tAAzzUodJTfCk|U!R^*_+?C5um^uCvvnTdLZ@-s5pU z+|hlTesDoRVJ?4JPH@iq(S0^3^3<>MH#!Yiag*!lAkWo6CwVQ<m0W7(j&a{<K5<*{ zKqsZmu*bH9!lwC9tPW=z&cKKus{7=&R*bKeqr*LpBwig4JHo(^;$@*m)$iY?Z{kz@ z^<Km?oR(4HdKQ$e95~4&E{t~ezUDM?HdyYrp|>PIr{fRg23#6Zc~URG^KvnLjooB- zBFUw=vCBE`NOw9jWRet*gAP^D`<K%<lT)k!vwW;uxG`ZdeR;j|7fadJ01S&qhp0!Y zbMa_h8A4xQ%XkbTiVZ)(#AnELX?Y{l`BfBGhtf$|g@>nD5N%+F+TFGIcsrWMUu;f0 z#1O2eC-LyzwshDb&IPYCHr^#Rl(#DcS&6*E@!oL1PQ*l#*-3})T65fpuXeX8x~{)* zjM!f-FDHQEW{<~#Y~*4!k$nxCO+u`~ssFWX;JPYg$r(0t9snUJh67xKf(W%QN-b?T zxB39_Sr}k}YWY8oi60NOts{?F*p*H>vFK##jLL&L7Kh9uaGL=$LSuKx6zL}XotnAU zqnTHG2ZPIp>(V-jYLXS)j^hz0)p%34l*@hfSoxfKU%mHFwk{t{Ri`z(Kjby%wv#Cj zcumY*;z$P0Z#jor9n*2MwQUMJItFY*4GIrS0wDdRj6@8aAX^wz4EEV`9gADG2dLl= zbZ!><Cw{%BnS`=ORO=3RRc>Kw|Mi~c$dsJXl9SZG-kKZ?23eX0t(zPpsK~PMNI`UU z*)GOZ3`Y(Nb~3G>`nX?h8o|<7w7dog_{)Ib$0}H`9A8aoTq2+OWN|h=!L-6@dr`4| zZ&L?_#O&HyCZDNF&ukT-(Y42*oNaZdqjPYc1Y78)Nc20k{`k>tnh!0zpc>HR7ukBn zSvrmH!La?|u}h|dHSCR}mAK->RK^@U5irl5a)EqH{)&bxDv8=#(-|eYkK#A<(5z#n zmUGL%<D_21#R{%_$ewyWquWH(i_b8I4U0vif+cF+LwE*2axo*MA8Z#nDgi92c#|bi zJKKTWx^3mHtQW&8evODcEp{-BT@jfD*BGDb%Ppb7FsFzBF-QkpUkvU0(6~*rJq<?e zl3jPy7<9TdsdY!;f0fs2+SRq?)s0XgsgBH%-ESzXYqeuozIKal!TmH)qSx=1<kV5% zpHWhwg2r!;%QJNP9#`)2oNe7>Y4;8e7jGYoS0}FyapvjP<QvJ40#H92XBMhl|0KBT zX*%_txr^cp=VLf)1YY)@sC;>SgCj6C@Wx<{vv1w?wC*04OvA<0D@V6@QzfU&;;YQ$ za=B}9WW>x^>eLF|sZL((m@@<hBnEWLjsWt7+e;`~;ytovLBdv|ILBYXVkvs)&BL#z z-<KJzvgYK>T^yFQv33(AF?KSQISX~kKH9BJLginG5>7;`JO(Eb!*CLxe1AwtIedZ= z)M63IsKRd4%CdZAPoA$MIr+rDfa8{d&U=;EsTOqk==MZeE~;z=nm3d-8=F)c?}Tau z1Z1o7yVh*1Bt>vUS%|(arp!&_7DE}&5%Uz!^r_%y&9X!+V)tW}Vw%!Vx$e2e)0=@m z<38tFqEcX-QY1_pCI80$7ckzNY1-u}4o0cs?BcfV<n>?-j&m6ZH}(!Y_k*x}zUk#} z`O-2<AiL7%HXCNL)P3MR!Y6{=6KM10mv5C@AMi4-ug7l!B<r-%De&HiHC)2N`#C}t zm}W}6F=~M2ZY0d6YmXZPn1fF#1Tc$-<kWZ4Ae75V>H_!q^u+%YB9&8`<9c|Un1w>& zNLOju@QSBkfK#|)&JHF=-Km6*CRn@UvyP@}20H{G%P-1@F0+r$q#eDHaLV6_yP&)5 z=sw8OT?DM2&jRflpt6y4ub(QIBG}=c1T&`*!Xm-=&(2P}4H3Yo=%S)GQCz@-F^Rfq zwY!V3xYHsak)-@M3Hz(y`N9B2yee$Fq(&+=Y2o2iOX`tPbwpD3Zw1hKlJyWQzb5Q@ z2FuY8P**o<ly;L#yUC<SE!lEVjIK<TaLtG7EC$tO2v_Ni3H()H&YJ?WfdsrCrgo!h zhcmJr8NAJD(z%?uUGWaKhLo8E4s0Uok<Ga~pDW>;e9)NnB)q}f9q)3FVo!gqM6J;# zRQZjX4OUM%Pdb{3^8d_R8kFo8-({CWXHs1!(ZG<Bio*7!`8oDbj$-1?TIj{vTP)5w z$MmA_!By+P-qOxWhl}Gtf~>Nfr6;&kb6Ko{o^Zz_?rKP(M$%H}2b8R(&i9dTNyOnW zFx6q2T^JGbpuX2Es3%-2Xmlt2IMp-7F-&uSE61LuqSE4DR9x|w6UXRYd2g$~5Ozsn zUz_8<LQ=B_xbkYv#63>u>6zOyP49G>z)d+mue5(~{Po`9gTEa6{mAK3d~|88u#mky zN8u4}r!#!&E}9e5{RK?TI45wB<x1K|xQS{13{#ims~JdcZm5I%PPHE^@NbJS_m}SO z#ixry-fNCCoHQ|G-QdBZbz4A&-yI$|c*5jRe1@<4i1@@pvei$=29HyuqWdVKfD87- z=QNeOos|+f1*Ahdvcw-naZ2Bkg=(bH;S_^Fn(5ijeXs*ATpJ*ITiSN!tBN8Qe~HP- z&J{#49$-Vs@#1pXHSBwf%Y4jP<?g5$@SL^+nT|OnEFNoA6@2kci2?U12usaDet>pL z-j|$7YVr?+tmH=Emq-~t@z2pR8^^uHWo4i+8BX5B{zrT&{TJA=1o9`aa$gPw7y4cu z-_0N<I;FnCjYNsR+KeO8<h|>XeWX7BN;ydvqKU(02&=3pC8>d$+Z9qmRnCx7ePteu zmy`Z7@IUtzdN}VZ@feq0UR=EGEjC{aC^CTo-&c%gjHDOpE9f^adZ_-_S8!ewn?&3f z(DZZM;&2*#N$t!_eEpspIhKF1v@DUL1Vt#BE)(_(U$xd}qd(MCMqyuQo4KqL;>Qt@ zCENnO3kse)PKA~f#*?|KAOV}Xy|(|*XxocLK(>bXAD~t^-H7IHZ2%3#bqj>Ti1xIX zDo43VGma|fGMzXz-erXR0_L6H^E0nRf1(qd0TJgerTM$k%%BM}w@ss7E2!{+tWmq~ z@MQ9X25C%iN5r!QuLNDay|vwQtaT8tWkJ7Jb5iUI7jx3o=cW)6pyX0bQH==}8&PGR zPI}>`Z;2Th8x;;@DVS8#L;ue9YsRl(c&fth?N(GA#FVZ)5X_Wa<j(l(m&m7kdJp6U zB5iNeCxE173E=n7p0r*vpFqBTe*&9X&Z6YZnVsMCb6<67pQ<mJ)BNI%)3jK(?%qda zbO2cg9svFIM#uE*P|f3|cOCnYu9n~!WFbxduFm}R@>tx7X&ACMg2_tME|QKH1|JS5 z^@N{GN*r?;s85YE`a(DP<an5!ggbX5FqfQKT=r)Hn`KC&V_W0lT8}TLXxvLoc9%BZ z1@~`Uz{RpYCPllNiv}4S89szk+p&deZV#m0SmMGFni{&p)Y*wd=#a_B08eF%Mw!T& z1MgED<*2e8|D2k2*p#rMLT2goiR~DRGPfOTP1YBtCD_<M3)M5Ttk=V!RPM0_U)Nff z@tL{t3CYA_TM7x(JxiHIt*IJBOTvKAdQ^N*j4+f5x)>miOZ@eL=4I6?H7!>4bNW+} zF}ob&A;1=xW0rd-yxVb}Cp(O)5284}7^#;$yIN#e$`7ZlG#Z7fMbS@{n2&3r`Q^Ju ze#$qIY>-DII3t39KJizpC`=!VuOpblzC{nJSHOj-m@JNix?{%EZ^w)2_;h-Lq^+la zn@%oHm)`1?m2_q$dQN3$qliV$6prUdt1_P8Su?I!PfXn9&?S3IOMZCNWuedt6lZ6h z+c(Z5w@=uL$dgaY(40VQPVYk5AP5eIDNz*$uXrUPZiPK$YIU$%C*7Sw6~By5t)!Dm z!_NIP*b1DR;i<WY3<FsT0^+9@Eul00Waj&CGntH(a52*ax1CC{Tp=l>sv}gkA<i$6 z)A`hcNHSHj|CL!1Z>ttQ!8<g(PV{nFweoRmRH0jUcfZ|xzQ6Zy|H1L&Z=O7mt5o}( zuLHW}B%z18SWd-LY_(~7D3N`+JdwZAOj}U52jcgOq4exXv>w$G(@hoqoug#u>go{| zVJr1#I=il2EO1{}NlVABa=nxc-PaIu+|3n4Toxb`IA7+tuF7>h>TS}9e?u+8kG-8# z?YU?7oU%h(7}yOzwWe#U?eLlls-wr)u6g^vuaQ6$7p9(W-=R)BMrZ}>PMoDovXMlQ zcAOUQP(p3$n|pQjaDIY(`iN<9hk_4~C6iHjOZb0YPm={&xL!*`MKF*)O12CS31DJS zh+-=7t*#RT-~fyNK-S+XxXq$Pe3xy)43|%JAzJR>1b#(lK>A2osdRKWK0kuP4o*k> z>Ms$LU9;%J$<<<lfPDBII{-d<vqDnSWml1XWXG08b!REvUh0AqO7!FY_4Lhj)&)yI zIQ?;mbfUdwpI&#;Rp503aSq|GGS4S}zn(5814!yh4x{Yz$?AI1NsWWa#Th$@0}oyJ z9ZoQkV2I8#+@S9yCtKOOn2vF|?A5%RTSL*V7Qb0eI@^N*)~Jp_gS<d$R!D<`YgE-t z^}n7#19BRu35cl)9~RWqk>|K?#~0U=;nlSE@bYE|8Z9M@Md$-W;N#T<8LfPR`>?FM zh9+gs8RGxV43pdZ;x(^nCfR+WcdLo`{^-w>*<>+2ISQEIrMtmCrBt&t5(o|~S<!Y) zsA6XqeU#!D8z?d0S!wp^ORDg{;tDY2(3jO!qhQDD2lGo@fITi3<6`LZ(t+d2o9S{@ zzj^=}0~N2ZY|v_#lf}8iIQ!Chj*|lx%6rQ<YXBYu+yP!k3iIAERuu7Kv;^Q1X{uN7 zIbZ=2oC}eMp9>3B{id(6p+gdq)k86{o%}rQJqfF<RG6B>GK{c-!1e=#ai+3ui`Jpm zrJ%aV+q!N@3_F#3D6ID*<_2;Tch+CHQnNQ$a(J0_(pv33j-%9idT&(k)u_>fhIb}M zO4jNbqDoW}z=s>x5Ms?LrbYESiCMq?MFFTiY8Up-q!YRN%(+Z|gjsp_-biPM?ucU5 zj1w)o+>ZP%N&KNb$yhj|1-n@^7S`VWXV>x`+7?;H(*+mT2lD>Qx0tlDk6|_T;?5V4 z0j47S;_B6Swi6zf<BQAq#N_hs>v!VwUyaX+WWK)G!h0u^IX)cA&@8VkaJ|*rf@Nlv zc?dqQ09?*(j?d+N-jwnN*oK3sevO>5cJ4bG2uOjVCqm)Uj&zN@LXiBE^{0YdLYZHj z9(+H&Iz&?eH2`2^)twAN08<VQIMdc#FJ-@a%Bhp&mH3T2)lERQvW3x#W&bo%m1;X{ z3$$~%23C2IK;+R?F6F+J!2wwGxbCwcGSyU%{J=lLRW2M3Q0f_ek`=WBRE}9(I<j8+ zL<+m$Q3FrIMt@i1tNQSzKm*Z4z7#nFJz^NE89Wl<te&H{n&#Ne)8aRXLVXv(t+jSs z)qtUvQ9PQ;OjoJ!UB%_aAYEq4zh8wGlm~Ryl|#}gF4a!qWv7Y?U~(N~I<meZ@@<RM z)+Esus7vCOFG5Xo`${cv!;8=mk@Z4udXEbnJP(M(cRd=<Un+Nz>jS~fxb5)NV|DQK z%gsiRM=POi{wYWChsAW|S60-|SXxFEz#-rt6-~Zkh@;A3#{}k8P;(O7%GwGwG7gd% z{I3QtzsIJ?=zk+W__r-^Zq`|YAuXPpG9+P4>Kv(`ZpM-%54|1#lsrjc{<(NEYpcaX znhD$Bb^AP-V1gj$Tus{V5I3t+2QcZ4=J4R(95jQ6((iZv4ha&de{^*N%YEh_q876g zhWZ!c`ouoV62-o7s}%QYGlBhD92y%*YUm0lZ+}2ObT;-cC_qF_c`s-!F%ZiclM%+H zU&8o$n4Vokwd~+~QVR2n2a2s@YofKE?=cA!=hCazh_3levo)*PL))_bdJ&(1t?s&d zn<F^>#^+dF80aDJD1G@7M;1>*XBb7^zwS$*3V>wshh1&1NP=H)8w>dimD9=Dn2~9o zh#R!)Kol)w^1e3;Q~-Uj)S8ardh|E!?$2Zehl83nX}>2l|1IZLzD>H|Wz9Au?|dut zSt{RSU%SObq)T896)|#Grpnkj{}Ke?rgf9LMFDS}kpjOZTq#-TK`0961zWy5g8MLK z6X^u~B4RPWQ|FqtpZwS9(f|>Jc7EpF-7^Fygbz6%N(0*QMn8G2!pig582LOK<sx0F z91M|v0PREjK#Ww05cNd`W;yIzS0U&CP2?wTNROJ7n@V)Hgh%?JS~6}*fdSB%_d6uD zB_{~JW5<<zQeX2BE%7UmDp_^98`cxL3V=f7QeiKZGBKjk&9QMJEXvUaR6PiONw>+< zqMGe0`8B%wcX!99r`#h_7fWTdS+^W<ftcXcS`V;fZ>PL|>+C?*T$gj!c;B*tu|Sdm zst-q_=K&~AK!x9AH9x(Csr;Fj3?(p{jOD@SOqLurwxHdg;e<@G+2!@*1DJHUpytWs z2hr1T(#f`ev;32}OeaNSQX6r861J0lwX_M`U&Gh~!8co{!aXJZjMZGz=>-8nx1jn} znTp2s95ZZ2tUyQxzdjX*TGQo$Oc9nAjQmctZ^}Ti<MG#x?CQ9mKFF|+#ow=G9TYn} zEEA2Qh!%74Vmf<;ZP(ROig@bnq{Y;s=HG2*Nk0nl9P2N7y>H@$ohseS1G##Uf^ON8 zvxPeM)p)$?nK+_>;&R<9i`or5qo^XAvrxjGnP5eZiob5eTS)}QAofaX{CpfX4M8|5 z2W9WE!y|h}=JjTLlyvihvQmP{FPodb(NLB_eB{dhd>jNrK4l&M!t)HDH)9spmk-J& z4u@YhgM>B5_<RtPnDXzJQG#vqY%w{TGP{Od%fOAsx6c++I9OJ1`Ss2nW@f=f(|5Ro zEf2`wc;|}lA$j_Pd=hOW&;MdJ&BD}~?*<)WF$e2T7DcjGjTf~=5jG@Un3gPIY*Fsz z;#+Ey&<y|BR5IbahQz|ZwdQEa589o?OvWj)g47JJOPqXskIbp8c@LER!kY)toJik@ z3od=-)P8vRo!>I9tt+^lD-I9fdFYqXn0dvxt@}Yz)Z<kk-5uCDnQK!k?Mi}p{xR!< z`Fty#dEimWebQ@mX2x5Ugm#S%6$Q#p*&?^pF$1#Rx$OAJP<E!&WZ`6nQC;i`V#zDu zoyGuzseWkjPbYX`mwx!7ayDwfjZS|PTF@PdC;9l-jJ+_O&#NTfGSb&2kBz2x&}`0Y zTPH8lQw2?(>28LTIOXU-q_iRG>Xt~9I=2_8<i8tzMz2uzEwoqUAtN~c)%7F4L{q(d ziYpBt!g;;m<*n49RGH!n+_^8gX|1Z-&O4bc6ar03Y5+8y&jA|Uj~T_V1Tk+maDeBv z?V2X-C>^P(FI><0rYJaHLvT$DTKgL$T>Tz2#4(PZ>*Ua)sPbKvu8wUYzr~@y(JD<` zNiYQl*-XCh`!$$?3B&jbdb;9dZ5~B~nP;bP^v!0r_A@pHT6{|(Un^`+TJ@e`NP%}C z!)Os;gM7!)i6_n|i0Mt1_mNYm8u%xgsV@pJ^n^H66(m6o)krLB^hE$pd(8VYJk^bd znr%a%BK4+AF`(dL%tR+jLHu=ddC(Ir!$m^N-;Pvpls?w&C>Mne!i3;bSpGO^CM1ie zQj}lIsn!v~E;k~T!mxl{ZHYqqb`bq<Y)l!$_|A%*yuE?w<vj`(kuF<2JJgLL?-D0# z{VIVJyzm!>y0Nbi*opJCj4xH0D1cOpMDB^dZX|6yfIVEy_Af6dr&H`$T)f3T^8EYB zDHGE$P^S@i-V8Ahoy@}&O75S=Mt7##>duL4)=f+<T9X{O(^>omveEAQFJZ!}?O1i5 zaF6^`Qk>`L7DH&=D0l-Zf5oOV-ulJTH#@XWagSt;zr27(o>!sP68+)RWb5=e=x~Wm z>)p--xpi_eUtTXJhdi4KL!n=UU4<RmJ{6HoKHq?O($0P;BQmE>m(EWy-X=BeF20;D zU*Zhl%{;%jdj^Zb`e{Oh0j*)t<$be^oS!Rm%l_y7gl}VtXrE2`JX96W!n@#K2-7K- zyI9!8InwGf6}z}}DWAs|hz;lYV`E*}7tXYDuQp@M=f3;vv*QZffF6E`MF^X|-L(gY z3QQQt0ggr+-jf?guuqA4XVL)9lcc&le!afh`#jXmSkE$;-&<PAv2x)d_p_5#q~p2H zWVZusv)qut%Ye*(Q63_vG;e*3^DJq|#hX8v#ah*aP%NlIt==-97NF3-*E6P8`Q(#N zbj;S!lu<49%<}$h{-7z{7ha#C<?Ker%Z>!@L^q-Y!_n+*-;gjIca26{mo9BZc;&(; zgC~==zOR>g%?+`Ai2*ZO(PHJOrJ1`JI2qUJA~?P=CpUildWNJ(bunmcidwfbNOrDk zdI`i8x6lk7)wrAdTc?6*>Y<{G>+2)0zC$vj0_Fh5@P3GHexQ^`<q&^4W(<V2GfC4J zcW5T@8tbq{Qt?A^#x#wy@$;8w4)gg&{E_ta_E;nV`^)4Kf8zBJQ;(#Pf$=ejOKgRo zkvn)kpOdSxf8(RGe&xkx{9t=k=L170DNyw+BF`6sCTIxf#dq$@x72#1+)GiJx9Zgh zsZuLwr!9f&9pttjxZjHC&^ZnmY{G6lnd#_O)lb1#5C+Xpv>tnfYCj{B$>cN@d=0ZX z?y~Q1$Yh~!-K>@tt1_G-H96fY7%#1iFmLIWD_LPE|6NiBf)#_Y6e2_qZ0xD$?^ZJe z<APB;8rw^Sr3Gxy+#gP6<zJW-ahZ_sn%uV%A4!u!FhU#KX+g+_heO=W<KFW2WhJDT zd-0w63ViyWEX|%1^HBVDgdvzs+%;A9j(SypF`7)dTw@S&?hE9HwsU4V6D|44uE6{8 ze39-=MFs<@wT;myqdPl1f3V;tQt0#U?vro6`by5GNeJ^zVejCs72dU-wz2>C`0)8R zk8Zaaal01nJl^~2;E}iRm7A00px5nvE5a}asf0!QG5&Ivq&Lg;gEb+=<D1j`M>7VF zKG`ej3a_YfTpaR8hMGBpyZlsP0aqQ(XJHf5E|lv2H)if#@bWzF0dq$$zL?@Rm0e}e zY(W`F2ln+u;Yb9@$k%6~KUI}I_8B9qrh&}AVigGg`q}uoOY;>JEGFy(PG!-Mj&$6B z19bYV0+!GG7H0`F`1buh-*f<E8ZMA0EPeuHsLeA-EIUEL_3hwyj{Fpdh0d`_a$5cN z=<m#miYQi`9zPN}DLrhFe|yHo<V*Nx8lQrs{v5py-9PxCg(GVJOhZOts_?r8Y5dX$ ztjpif*fU9Up02-flGe|(^pN<L6o9f)GrT4GI;rd{>LnUPvIAJet}Kz_HNKSff<#HB zaWA3NX6uAnmta`=taA*@XA4;fOm3mEhr?%{3c%j!hb<U?X^J)w#uSlpe582%<spRK zG5yrww<MkN`s|ie&$z8Q$0U`UveGc4Q=8mbzT~5T^Qp^|#q??g_dF))c+pH*HJ#f% zSum?7?Qf?LaV0FyfPAj^!s4<()10CGrqteF#<m;8riI1OoQ#-21V+8jdo9bn%;OD* z)AGx=G}yN9d=X3EF=#s)xLuN1hE>HlR+4ox%>MGpe6?{eX0|Syr5V@N5meZTh_*XZ z03P0-eI{~8-q<w<M0V&=ZAdSC**5;Z#Ck)4i#OKBTXN(ML0Ss7F%EEsQ~DV~N7kcq zQ-`nvLylB&%8RFYl+#d`-aB=t$kC)LAQsl?JL%IB8U1%AXJ?4T*g0EFtjE+8ba7~e z(|P>GiQvEhEnnJ%8}$e$+%dmYBEuaN$sEq}esGFCM`Ew1vx~PIGA1k>Cg++1LgXO6 z*@>^*CS6iW36NDyU+y5(asI>3l`ipjF0YxhV4jAoD9l#LPJ4+KP>=o%Mp8PL+O2j! zb>tJZF=pN)vy&#>F{qWfG$<8}9b!fmL>#>Am2+aJ#XS4^xBt|H{>ymD%rr<9k0VU{ z1#jO8(#mfxF*w8Ez~MY(faiulY1>sqhNMy8pL!(pcD*Hyyi?qgdwq!kX}Pc)hGc33 zcAH*1+_X5|!QDFA64!x$f`$CM#7@jTkXf4R!kc)Ab&Rg08Ys##71eCQ|FB-eDU2`V zIQC9+RjTf<sIm%c-Nn__v$e}b;j1yuQs)WklO<T^JiJH6jdSI%;ja7IsqM|B1%o8n zFZ^WD()L0cSN6tJN2GHD)IYwU-TX47M{juBCFbPx>IurH9P!+{;F!Jrasq$4CVV;# zRl;qT;SKKfy%|cf0rA@rqq9f&-|E#w8{su!$TNmz&e`~6GFr_?u*LN9BZkeronMcB z7~^y*KAgUV%ujj9;_XMH-;OTk<5TPhT)!OQ4rzpYzZ@f*)d<i~XMwNh)00o&B_GYN zuIBs#2us3#JG#JhK@2X@uwVjxeKtM6UWg4N;66bMY~*kbx5qiB7u>GCYL{oyJ^}Ub zP9i=bW^(hEB<5i^|9yn*uGdrca(uq)8u<5r|97_IzAX8A^qU?0_cy<hi%54zdskQC zGK;U@253@*W)iFX<~P6D8MRv`P;H36z8GIk@$aX#Yr-P<ce2WNt{IsLN00u`;iD%9 z`%j-7AMX7bt79BA7wNC`)t$n|sE2JLRkqk=XzYLD0GrTDa*fG8;~#Ixa~zXr?#{1U zy%Q|@7_eSTugG~O+gWnASj@=OEP^G`?OgQr>+M~U?$3R2dz0*``?6Wg99VCc@nO2{ z5=Hz(f6*?sqK(pd!JNy>(`*H2W*hLamFTbca(t}+&?S+Adp<e4fY$+9?MM>v#^+|a zSOi;mau;D*l>OqZVy9Drh4Tu}kLQc9y;&(;yIE_kYq*ewbRbwcXk5Q6OY`*+-3qLZ z*M~@Lf@`TK`GwRPW3l!fSmHWW48o2(Zl&iUGkfc=q;hkzn-4}`h}%qN2AO(rEJAPA zQ6~8EVt(>H>;SHw(`n)BXNP|~e)#mk@xkHq{U<UrQ1Sov(>M!AEzUj2bufxd<z9cP zK%KR2oUUpp%Pf*sG}A~~%Y_h0_lT`)RwtmYCJ!XKAT*jF{dre)S|D7IG^z%ptKK+k zicQ9?{jfKZqaU;p7!7<|2emTEg@n1;|3E+Ctk1L~CLuGzLBpi%sTlyl!l?Huj-rol zsH1ch0z7=VI=oUp)Zs0H>WO-!(#z_lRX>Wivgj;$3mTCQC%ZmtkS*+G-)}(E4dCGb zO+-Trqz?ud4m27cEtr##w{l>|6Jw<XHCXR*#Az5s-GtQw2{UdDU@~8TPAzB>#xk6a z0*>3SJrK3XKuXH__6GL|ez@tgb*6n7Nd@in9A_s%(xR1aI9XH$9xN>F!;e&2En#&x zsg`Ib5W``zUWj^_4Z~4FROD32`9n6XUi)J_m9APa#X*o3Ja=3nirp~4gJjCVPRjOx zr`aKa!X13OGG&H>0}d|2yTQHzXeikOIz*ebC>vtUDu5CmO0D`{MoPmVN^VMECo8^Q z&~aC|%BKnB&%-W2F)dBamOSuln+BaQl0EUw!R))O=*=NKmK#vBeyFgK20z}xM)_B8 z>P$}Wh(@W<;~BQ(fPg7kw<S6W^4#sJZQc`TXWg0E9E7-GC#RVsc2jt-8rvY7!W*B^ zd6+r#6JT!VFJ7E$FKo3JqN+368nZIPje<ElK8G=%q&Ii+;Z_A2CJ!(33Yp}?%H{;# z%T;T~K86LW@u_zGy^*uwM_b-rZ-p5L<kZ$S=;@1l8fk3a!+b<gtM@jkZR~D}=IYs- zzBZ!7zq^NpmS0VKla^;5@^{>lpwbfZyi+34y8l$-fxU@18ec5ucr!VLmvugRIT_*B z1$BS&4vw%CVak3b;-kx})msKE;L;hnLU~)qk4CjbpK;(3o5Z$lwoCbj6lTG`N4a9{ z7J%4-)Z|D&5h|KQwFyuiw+L3BRpbp|KbkD)e;0-9A}bz9D2j!3j~jV_%wDyt=n^89 z4@)P5YwWZi{@6XsC`BtJKd@r?Hdb`oX+lwbTi+N;*&;BAITzI6ytSD_;wKHmL|l_$ zCmqNlZZ9m7%$yBMDnvf9EezlmE&e`uM#KMWt8v2&fwMg4q_u|gkL~sbT%^@+z)N-Q z>=nxm)z-#3DX;}K*Y574%um(BefF$~<2KJI;LT`^)y6X@k8C3GH>^0y6c}U-Q9&WP zDk>in&qL+ApCe$EiV80EZt4`MfSB4Hiv|$0V6Q-s>A#JEe2%N>7J%**a;sLk%&nAE zy{VRaeVDz^zr_c3aanEP@7L4CBwZ`E%N6UsO3|?FY7;gTNmgbRSjmE`^1WC%Rf&|Z zfvSbF70!_fCNyG&(?vEm7gTQ+G^><m8NUu`7I3SK2F7Oj(1c(Y2+cyxB|xJ_hmqf? z(K6$+sJE7(P#W#(TfufcENtl1`*JFbfj(hLtH!-4_e`uj**plv%{yN+G4_L%uc}|5 zg{Fe-ji%7Fh1IfCWIKa~O*AT^IauEA6uuP~Od@l1@Xrf_3gqX(R44q{Sb)r1D_e8y z&V7#S1%z%pR=pe3O_#HB#44$g<2HO<kSqhjx`GD-c^_om_y_bKCZivw7Z(VSkZq#T z1iM*p(M_DsL==W}c!VpMCL^pz5N(0YcsKt{Vcj7r_0DSa3OitKm2x$|x@P9a(|`b) zSbjgflH=b%#4aF08MBD!wHRB{;D)C9*{*j&Y$lIFlIiu<4EddhnC4|I@~&Q3{p59p zv5e6x2Qy7aqt(EY{M)MHPG+osAU|p!kgKA$)VJMc12If3{&M`0_6$uL%p;~*;b561 zCVpYCD+lh}H+Gk+;NQd+3T_Ef9GS(#3uacZ(;V3BLxdji4<!be>;+1ZG|%0E;1aiJ z;HlLrD)3v~phA?NtPl_?<KOTQyJN@jD^ZD+J|t#h1Q|BAaC)IqD>EKry=RO070&U$ zrRh<vnHrU`qA`G~^$J@vR!wc9YHeeM#(Hk6sg5V;D2d*wNeuCy`PYX0@!ci^APq$u zH*d>*$(!@9H*T@pX3nwbD4k>0Rdi!)OItn1Fe{N`m4Ds@6T22L%|G`cM!XKdi)45y zw_#?MK@d(R>B0EtmP<w8>`s?yJ8YHNw!=$*6DQ}VniSimNkrZ6meu8=y0;Z87kgx# zP*Ta|9AyY7>!P$oRkp)g#w~Xuj6<k&zwuSaBh*DZx|d}v2WZv+A%3sokSvqT`0V+_ z4t9LZ%T3sj;3@v-oUThvdk4uk+o=D7{OzXE8dv0tH3L4``LfWH57K}RWVTxCYdTv3 zhKV*s$(zy@G0EDC9F={j4&roaR*a5|;=4u_zkm$o<wc{gTTB{?@{P=up+4XA)5$D6 zLrwp#(YRfQhC1P8qf&ES8X(k5RKayDS{=Ani7L3Nwc0dvBe(b^u3CWlzO^%@i`S*Z zg87{!UAkfgi9m2JBoSM6g@ulqZ;gQF6C_qTpNOU4tKk&1tEpGQ%T!Q6Z7gH$(KeZL zqB)5p(sKAEUrP9HQ!*nlj17M|z6uCFcuBh_+h>#Pv(VAdJlHQ9>%9ticCm{t-KrQg zzLTzp>;)B8mUWfA&|C%PO2Ce=&%8^r-bvac*4HmFUJ6&1$DvakEQ;3ejoKp!{t*=! z?Bf`0X>Ph;Rh_KM5vpNDkTDAbdXD2dB@1ld*}8-5SF`~Nuz6DU3eIut*j)M)M%xXJ z(!&7xDe}M;cJzcuZU(h}zPNY|Q*$Wl4mN{eyp2+O0T4MoNZOA}+M?Pz6veTF)pV9$ zEtz(jtT<Z&WduwKyWxgKPLn>kc6S#%?nV`e3U{!8=-ZV24W(o(Es3(BaXkKF3qAUd ziRS_(cJ6aOO<KrNGw@>{!a&6Jz>u*Bive*$B*USf{xL>GaouE4907)ni*IJbq3KxP zVCaVoR|kYlqNdHrzYjQ~UJ^RG(K`_Bjzz6x#6t9AwuGacr79^akk||!>8wn1#HuYa z15YAdDYOqbCTr-u6z5H(ErpQZ>(kJNX{EIlqfTeg*~zd!_e*a()?!q|@_x0Dk4~<T z0k}3-1VHOhDpVr2;bHAgC#%ZH>~{Sa#f9B=8FOO2YAVT?UXF`hotQZ<7Uo`P2$IHW z9bUA|ByxjI^DY*C7aW<KIr*0wIA}E3Xl@b~lY%zm_FbWKc>dW<HpgMaixWgZ1ol%6 z*P9x3#tcwW<#rt3DhJ6R#PQ|_UMOG&JAO2}lZ#DI913t)(3a}dxSWVUlQ5fKW?YUU zKZ7wXXJ`uCgU235A9$DIsa3KM?TQ0j{RN%8gFiMG$?LxrEtY$Iv3mKfs2;ZtTo2ug zqF`+UAigV#*FFFCZBeD_@;5Jw3e!BU#C0KkUsNld{QgZ*RHk>#CgSb$wgI2(C7pfA z0q}+0t9tnk)5yZ;C{~A?PNE6&*{7m@n1zTycqoclKeHDNAK_9IuK16`tD<o0;DT$V z`nd(fY!+Fe$RlZr>MMwSa0thm$?JBd=mV})jUNjDQA4v{d@2f3Rg<r{WVMz~`o5@^ zdPjpwOI{b1a#yRWLHo8+B@eyva+${DR4R5kRx8EpPSr|5=THrJ@HrOq^Cs!1Z*^YG zb4<ePsN1Bv=`2YH!byyG!J6^l><p<j<YsWT(h4lBx65mKW#`|t3)hwRB@SuXcFTt7 zI9wGx=juEkcb0HIpd$0SP(Tbr>3laLQp4hrlNYcbyECx@*q)wkfll}I9r@gO)DRH_ zz_br#su#%NsT1wYJZO&16NL9LYgd4(*oVjU8>x(tQ2Dd!0aazZhC>;B58M8*zH5Ue z3n69JU=1KElE#OX%OP<ihl1WPDlL_ex7@eyq%W3)RjSRV17vJnrFml8+U6}cHEE`j za&Htu6}m4P0WP5=HUs-<7L6eBr+1Rgmi3*F^zb%bpqxSE7Ks;;Sc`rpWTTgYrtBaZ zTD!2HifQQqbWG5>MM_#k)}rO15AyH3RSDc^%C>2l&N*R~5-e2}q+S_`22<}4$D(bl zjAk)*eE$F^g$InU#pM=<*PyZ1=)%T}8G3pNnUo$x%c+GA>%LD}=j8`bG(+kZiJBs_ z7F}H+Rxd?exk0q_OTT_9#*zc*7f`rG%6SCVqM10RuuAA9nlCtrYGz&B$9$&f0J=pi zZjo>Sh4m??%lBc#b4&dpHiKZ~%J*|#T6!oIJvz5dNC$T<T1xVYK08&$zQflsn6Mo% z1`@jy!q5Rg%*^C;itzM{xBIi#^Y1684_qt+oWxl$#sHgFxS#{EwFX3Jo%(`?F?m{N zxU$IV4IGD})==7K6-$C|zV?uD$lzPrSC+NU<Ng!Y6V2P;X)d|!TOMJx>!81jJIoym zg#yvn)Ulw5h!h;SIY9ynJybC9rldl6%+|*hDg<w1iwdE@AS#5GLug_o+2&*jI9M_? zEp8t@+beax;2=>8Zq<JIGDQanRm9>J87H7Hh+;*^a4+eK8iQ!)Jj`ZI(ND};odHy> zAb5-9Es<J>&dCa3D5;Z5>rgwbIGEshwc#{RYkGBi8+yQzJ#AnR<>}D(+YY@Hw}l5$ zI@!JGr*Kw$0A*8*Zjq4_RMw*;Mq$Y9!gRBE;)g2hQ8iXugSNKPIuwreZj*BZog?@` z)D9sXy-XWQ4x(+`0_!KKEjxgc29aB2)QE(oTg4zea65QBWkFlWKkJTO#UOG>a_@-i zFTeBGxA@M>51>qn%5Ab&icAlMvXdetQu3-oqs(+p_BC6EV^V04@t9z7o8(DQ>7tI^ zd=>Vo>_HmOt1T{a#N+6VZJo620B+eg>E=pe3|Q6L7Hy}k;f&k?a-&(N1EDy%1D5F{ zOtw!AY3ig+R(ue7k~$kwD1l*#lxr4y3TZ(1<8FIj&tu6!o%Y2y?60rh-BovhYCu0- zm_T1AvuJ{73l{rw`%7)Sm^ubAywvULTl;iVZ)aOo`vkvTZ@_^6rIAT+qv3C1(nYZ9 z39kXFv0AT>RE<gl=(JZ&o3IHJRdMK|kljaw@qm~{Ay3#_)OXpWs*WAsv9PJAWxHCN zF7<RG*fnO=e5dLgoB7G)q@g*GO_QLrn4PXPhi5^mieyU5ML{E&j3y8a2sCerA6;eb z1Z;vV^9_seFQtx_R-)+lJVJMCDi;P0GBWnz=Oucb62xYtBMNv>SF&VD9@Dk^qW<eZ zqBO%zD{8~is2)u-UB<(yy}B+I?h{#C(hqN^dJkB1F;csmzIwNem@~Bl`Wj02ch(dg z)Z0+Llik|g4fVVG+d2U}p!4;r{gi0c8$cGRnx)#^kUn)REU~P$EBgx?sO7F*_;JeQ zSsF%#^OG+2%2~ssFKh)V$%R(Po8^;bRmwdZmS!v5#-uT58c&trlp5wP{4PHxk|d=O zP@yYXdM>29aNp6jJn03vr5417yg9t}6q#&sRUL9kO-3LSFU=Yu&&=p#j=i|q>XXrf zSCf<P<<cz$O$B=LYI<>s<Wk5mHJkhVQrMqkZQSYQ{-|l)xfwSA)k8C0le#i-LWtrM zkIE_zn%imW&&C4JT$Q^72belIv^bqQS)5Ov&L+=<Jm306KMD>z82ZBuFAiT#zpKrG z3zx5}VH>mWLk`sXUMsj-r(Fqu?op{>+1?ds@>u)AfGVRE)FI_OWm;L6CF2|lMY#~~ zOpV|2L6qZ2ekAnvcXI>~W2)csk@aNp=LL0qLB{#T>xs3__Gj1xlv7m!*3SLa9A?7B z^kllyOb`)ob5je<HMBh)<02xTN)+4C@&?uJntYy-MIBmkS}(^7JT|^e)YQEZ_)(G} znM2+k>gVTBQwFEuO3HU*nIv2Q{d2{XKU;}wMULi-GeG)<)NH<?03yEOM0v~@G(;T~ z10UfGpQQ|`-9bL09A>GCe484>2PX)2>~)+hG!>U7n%qp-YqIY3sn6*}6W-_u$e~Xs zu(w!@-~QX=?eeeoOdun{-3dr9!SVDWi3Bl>Ix}aG&`&wFKLac?Q}~a$Ug2ydT}jeZ zu(I-l5~}cu4%PROKVC>)bY?Rcrn)@B_K<6xmL|W)bB&*XChMbX1n;(VKw8OTG*mUB zRg7j-k8xaXC?xOIGIInPpa1xzb*)ZymJIcl+c7G|ocqG{2a;ygWGmH#qwz&%tM#eG z*o=t$I~9EJovdV4NkAmzq)g2jt0fGIwE@aSXn>COhEUbQ3S`=jN8%tyt#oZeR4ygW zby+i}{#+JVKBxOjIjZ~-lx?Iy96&P&gZShI7FcLLV;ZNK!)MXVVib#l4eyI{|5s8d zd~dEK7ovGgPiySvu;8v-L?FNxO!%!pBIBPX&!_NZ^RLWQ1GA7{n0zX|^<-E!rVJNa zFVdeVpyXKo3D>UJSCfqCKpJI@d?wOL#$ARoKFQISxPDpmi%UuzwThV!J%Ffx{Tn|x zRM@-}6U%cV5Qm5bf6AWQEMrD2=6q2`k&Z>U5fv;uAB|65jkMV4hxs*@l5=45!(zJ9 z+nui#lh@PvH7=FLqI4oRY?Fq#8Cvm&avI?->g8y8H947{;ldjBA}&19#6w)pf|cnB zn05r+2Et=Odxc@fsWT}p3J&>_@g3{dF_ah(LgeXaag7qJvU)XMMVJj`JBmqu+2fu2 z)8)Z6*3W!+dS;ZL;b|mdcsrp5ljZDkgA>(_3`S7*?(;CCp*}KkN;ekRMplD?Z_I|x z*H;hbxdEXZW7oSJAisVJ(Fj;L#TWvm6)qyRMc=C#Ar|9j5gUg=dev&KU&I*^>V!2@ z?8llGLd^mvzYa@U;`qvtu_m@RF%X;r5fL!m&eV*-SWSyYwmnM45D$x8aKuT*E;#Ap ziG3wpM+;pCT=ryc3FGDSw?y&EMccsclivWfNRv`G`U63qQ9PLGrET#W*pS*#ffoO5 ziY|N0KPFLeLm9~&XMz^vbxVF*oCgTqK@trF6Fz;R7jeaKp<E6JMjmm9Bao(%;`^T# zuTiQld{A<oo=+=wzMl-AiY;)E+{E@_P3o4KztLbPaYq>I<axA}L=WAQ$d}O;_R^Es z5iG2#Opw6JOl+ZO0=<_7lG1T}qO1ta3UaxkaXi(sA#Tn{Nymrq5-p^U11lCWM|lUx zl0&q+7ar9wHIfyic#nF;oR5g7G`MB9nE$|Am8(1yD%JQWRPE)RP_jmZn-6%va>!u+ zVn)-aFpxP;&)<0$yFNuXE7WK(E8F^}VpAGZBJ3TScd-S>iE1m>FdJ?)n*Id4Q99sy zl`~rQY|*=Ice}$N_%+ilw*+yjgYjiR*=dI%PN1j}y#lbHR06u?yheZLea|`L7RN2P zg%UalN2HCvPfvUtA!{3(rQqKB&Ugp2-yiQAXR6OzbICiP#Zr3cERrzdKc8bhUsIDT zw<kezMA>m~$0=K<+$su`hHucEQC*5eyM0no$VO|0;^tkfSrypIN$Re63lY$c?j$>$ z9py63+vnvMRgf71^~t+4>_KSPfmN4wMo?1o^mQNHpu58lJ3v`1MS}%9&|XKeugjLV z!8ECQ?;xbr_#ORyPqRQ9F>#PY|HaMbgpQ7N&J!KzRb~xFe6|=iw?nyn64Ey}ce{Y) z(AJw>Iv~dx$C*G~eX5!Fi4oM%&^q!X3NSsb?@edipg3P5$o3GiUfhNM(5k(L>YBE6 z)}vIrXCFVLO3zT~(&K4SmsdI;x}c}Sj|~)d+LBB0x`z3k*6-!As;0gf52T7a#ixfC zXuXK_11H>i;c>OO-YI|-1Ia^sbz5pVgWai$v$D-VnzUT5C<mzB6u|O^mVD0TQNePw zc6Z?|>I@UCFw^@CyGc85w+P>F1Wrz-A=5+KH8Q~O&LbwAFt+7z%V<l_HRSqK-0Q6q zi0<S>>(T)~6WS9K>2jxTO<&cW==yqJPUVPgB*nPBE2m{@KJ>K8Ed{4opdAK4^!Jw9 z*PlWf9ggN_5~6U5p~$B0LpUqVOGnMaL6d1ysJIEvwgmQY6<LqOg{qw|r>p6F_N|M} z^${1LJMR=-47<M|%Ekl#WpaUy`Kk_JR-63NqD1Xtw@jigVz`C7PGRq4HBG~g<)9cR zRjam}^_k!50C5k#PoZ|+*Esl|(*@%gcEJz`$Cf{R^wUS5eGUXZ`sj3mFcri&NE+Oe z)iFyg|HNy$=!02ajZY?{XMcHyV3gU>Gr{<eAAN+hc_TbL8zVwwaistJQQx|vUrtuo zXpGc2I+$NCP9|T?PsXeH;%INVI�)s;5v6R@X0Ivf)=(2Y`0T=VkI~EuiGWqrLO< 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ð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ǏO@B)X}Pagqe1) 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∨<AuI2W6sWtgIsv_>QG>`85C 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 de{?>+ps?Fknc+Jk=h5*M;scJ*BA0~4 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⁡i| z)+;(1bvT{Sd8$Js*U|n2?StAhJ8tEDO&tuoKO|rfkI5LUMps;3)qsw<nW(hbF9l(k zPz3L*I!`I{^AZ;dm|3_)K~<yig4_T8hN0!JrhF<TLDJ#p`8w8hzO!78&!KfZUGWw) zjUp8Bi29~}bH!Sx>fpWZiRTHQQ4EHR&^bBf#sSx-ls%o9q~K0nLibd2aS07%N;?1N zlzE%>Xvv37H%W4(XE1&F;t?eX-#J^;o%e^+pQ^Wy`5f^0n4o4K&Q_d;sIC%wrQ#XC zSAD+<)%W))9ppZo&L`&&=izYQ{@vs0^l&ymx_@{y-CG<T9TytVKc#<_XZ!784@diE z#}b_PEOdN{-4j}?&sOyjb@e5wtTo>t(@^tHzLnG6H?yB4B<sA3^>3Ybx>Ow>98Vhv zbUY@P_JFR5ri^q4G`=%+xigg%x4oV3@}sZPARa=uN65Kuw<^HV9_M?E7B9oHnhr9N zmYl7#3f}CHrgP+@uW0R1UtXzapu&*`uKptHEE^rcr*?1c8FGY*cn4i(v!>HJtY`*6 z2x`3nB)sj1^Ib@Y^5N)mDZ&vd1p1X@XSE!g28i-SDo&~^{!^t`xau{2H~LDK_lx-s znXL7BxQjl1S)VtPSO<kkBv*yIej^Bw4!7|uI<-MDYw667ZeTwG)5BG8`>kV|%2tPF zMx{r4sIDMoJv3%j#sxysIWj~4=Fn1A8cJpCg_zBa5A%Y@(6<i8tJ&o5)74}-V`EH# z+$gy;+yMu`Kly}0i?2@M1@Fv`=8NT&YwyyHzIWz_ACHfJ9G|Zq;K=SR6XwsK<51it z?Nb;&z}Z`#1v!SVKtH?{BQ66^hv|A06)(0(!;*>{@h+vR*SKBwMM%~_Yb~l<!R%(x z*kc({0;=Lh<x_CO+?Rzm?q+xE<5*Jwn)Ra<)e6W58CfM9wl@n*?kfr`cMy0l$1ea3 z@9d6Z>imnW@6fcqzYI~;a=1ZLL|7lK@PBC_&>iZ38pP;Pjjb8oFQRWSEY(F^ZU7m! z^TT5*bx=wJIw=I?RxKZ86AUS2>m_AmdNt!3ZGS}jbsw#6VsIrK+0x^%F)J@aJh<P& z-gLlod31I{L0l5oFGn}V;jbH@D~J52bWZbzB}4e#S0ov{t}@!8e;Oz+Y>@MxFzM3l zbU-v=JS0KS*S2NAok>J@*;5?8TN<Hm6$4#>8B(jUjT9Dc>xU`#38J>DLN|K>cTt>( z&P+w9j_h2fivUiy?0cp-JB1PwC&yX{j_dYWU)raC<i89Uwr-#DA(HJag1B`s@ceBH z2qufR7Bk#3N4^s|oy*<>DTJwD+r_vV;x^}$_ZCm5CyUpdXzrMC$~MB=L!Nyyt!R=w z@ZDW`U9$<egqlX^mE!7Wl?Rmau~?pKDv{}fT_wZt<Y|fHM!i~mfdnfbYM}mU{+S~^ z)b{Vwmt#6i6b}gcdWIT;8sL}3S)HWfZncT2#9nhmEXY+Nkfaq<23pO!u9`|q?07N# zUWQr`V3RPA@fv-9U6aLwWT&NrlGi(nm)<>nKc%;={DmoX$y#LfBvW!-@~JWtU15K% z@++M}Y&&)crC{y4{PLBrwuaV|imCzjD`^r=5s-BUz1X=O{5q|JBx;QxrbJCyD~CKb zR><&3>cvY0!jPGh7>KHV^*HQ;hRqE8N><tNpgA9H5M=aK%o^lH6L;aiVhqEpRG0|n zEcT;;U7y6MWXaug^-Z|m3k4UU=q_98CBaY53iY%lr43>y8y9|Qzy-?WT?`mOmtPZ; zI6|Z%2wjN%z}O5I!weV8oB>2!=w|QoueeSA$Z&bT#RK~mB)7fAXd`oCvmflR+F)!| z7(m4^gFt6grG8MFe~}Tgl~}iFwI5G=h<lNNvv~IpymUM^!;tmWU0F*E#5Va#!SPE% znGHi!p@iIm@=@<k+(Xeo^*8c%;JC<E1@xP<u;CaR1iV~Fa*P>k$veU-a{PJQE{oK) z{$_lB!0ESC^0IT?C8Ya9RISoU2?j032$TfOlyFU1pF2|5G7YAJkXeRtYToapTvWdb z5$g=IVpMLW3P*3UKwg{?`VPxsa_(T69=|M=pp6to2og^%x{SM24cT}0!Bl37x&zgc zDJiX}Er4>Y9+e?YXi=1bLU`L9Jq9W56i`Ez%P^NmSi!Ns+<`&Cj8S|D2n#sf8D$X# zxk_&Vy;?@=bP~9+_z%Tr1K65fg0j2Z6DZ$ST;E{D;OBz6J`a(pYcf7X{Wl)WCGfEJ zuZdF<kjkn9*@4D9Htn|IvDpA&RG%R<bqA2^B5SETCnzJ#l?XgSwUn+!`6olR_PW-E z&dJa{Fimz48p7Kz2OFM8?+0j>icMOhCQv#?UQqfRnL7=R9u{w>F>OB&Jj<)sFK*|g zu@}ZBYe0p|agaDMdtyN6B(5ES;X4|c+;PnxhbU~g2Q9q%nzk^=!=s`U8XsJ3_tRAa z{sD;1EQpm(62Zyaq0wxT=|x0Sdl`=1Z}PQ%D&=Qr{tQXjoM&VammuoKoE^xzx-7tp zp*rt}?uB02rzBgX+QTHS_%?`?Yx58j8PhpSCgX+e5vovgVvf`}AcnA04QAB_+X-+? z;-MXxka8FIWh^bw1%3w5B=y6Hw8$dxXhm+Z1REFMr}d?NkvJbu^1p)8+`ck_BlN@J zcH&FJ9I0E?)AYVe_Yse`j@I@Ik?t(ihkc<f`9w$I+ytzi4<kgxEH3fOL&Z14F*O-? zdCG<crzo<G7(OB&?H~raGu1=aw8JvUbZGO=t|`R9JGNQZ^*OI@K_ztBH!N4x!b_qO z27D1zbzRv1-`@Lfw|N|SgLC$q{dM;Okc0`LiAdQ_GUH)vIW$GtoKPZ{r0ir#9R>nG z31brA3xKi}*|)K0Z)GoIKkwNq*u9AT{i>?}KHb1Wij*_&J2<uoJWqFZb#--hbyamW z*USw0VAo0xD>wBE=lo9=j7QEH6$dG#$DVx=GF)mk)@@Iw(x@He1&uI~TmzqYKw83V zpt(qMlj`Sm8gb|CdKI`ke(E?$9Dc4R3CCnHQf^4^=2Y<VS$ADBFJ>!{A{-sQIjeEm z3vdE|cw>5g1m71)5b#g`i$eq7-he}KzZTu`(ca#B*fI4>ad@6fD45>ObH7ZMR2VoF zNR735`NX(cAb^OsSRk|z6JDeQeqAUrl5?FH0MeL;JhKJB1SXgJX0*6-ZgEp#I*igN zj{B7`sLnsi$x3nWHP27ls@!<tG=;_scDeCT#;x&mpsQdwmFY?K(}$mZf#}T-Kg8k3 zbDRb4NT$X9{B(}Nn0@{+3bLKqWv@T%Bmv=~X^;AU{P05_6ii+vHuFNfczmw1@S1#3 zc)T#mTolFAi{bR8RrOJ<7HubIG#P*HwrL&qka2pV40UE#qd7N!OdR9F1EqwTteM<E z(g)x`3+~^7-|Y-x^yeKpChK7mbGONG^67eKJ6$b{c+V9lXFp#)?Rk~bnO(4Ei%`XJ znv7O9_jFT~=je#XFBe<p>11{#xAavUqlRF?_%EBE(gpD`aCR@YQxyG4viL%bVVJ#J zPc27DuiaibH4?jBnGnG!zxMD#-934~S$G9X?F;7qeS_Yo>?&zr4~G581wu7($ar`7 zdU*b&9H!z8TO27RSF{mx?MDJI!P@yxXCaYuG!2rslGXWs=h%myl2Z|PiWE^eOfm0h zn09CW3NwPi1<0`W>)Co|XWn^%j5FWO<V_zJJ}{GzOp)1y#Vn9h<`M!~F=0kbSM&zc z=>=!cY@LCvrUHe)V^1drvG{>}ik4xg@Ln|6|FGzVZ%&K0VOg}!fc@fl(`#&7-rpM1 zBK5`Hifoub_s+-^1;Kmt9*(X0_Wg0y@Z^?{sd~Wwbv*TFJD%#tz`|DiRg|Ww<abAE zPLhp{(^Ci`2=l8xZmAGmN0tCGu8%hrNo<a1hBI&_5}iwhMEu$<{wU#WgaqXl;YJ0g zi;0OLI>+mj<3<JQPAts7jhBKy-^!Q9Ya;~<*jFv0LXbI?aS9P>*u17Ab~xtouQ@Yl z3CC-}-fjQC)L;@JBTV2@JD_4>cDcH7vt5SbgEhc!9ULX!A<(!<n0GN{MH%jH|B7rf zo6j8JzeIT>ekN(`PLD^Jc)479cgqsG(8Pbq>Yq(k7e?cDq_$)Y_%E^jk1d__9yG?H z;F!i1GylFPEiv6$m(lP-sq*?Ja_QP>k2-&16=zl;bwpwQtc=sm1zB@9GR}`?i=H7{ z_}VG$Sb<u;s!ME%X-{o@&rWeFt5a<txb;7U;GW)h=PIS6_d8`0zk_s&cHgFxh~`L* z>Ax=(@^0*YKXdLQ3FhGh^l~9Qxrr!{FuL;O_JD6bpRX-wY+}1ip8vzoem@59FyW(3 zB=)4_9ocz=t>q3jhWhw_7}>xba$$S<^Xn;@uK^i_PVhert<79Lc>ZY8-|yjc$n<1$ zHb3DQo;3YO=?1G@i&g2DO3TJa0kSu2%8X```QnXT7Dqtxyk7q4WbD~`dC@J{T3y82 z^3pyw>Y7zX{dS0Bs!ZF1*0sAG<h`@A*>Fzd_iQ$@yhqFXtKQz07!}fgM!3mJ(7PN_ zty0DGo5{#-+_|_sA2R>KEQ{@Ab#voT)E7pU6U|-~MlyO^pltNELCN@CopP>JjYZvi zAa1_Ch#>CeVzRkX08t!_=zWbjStO=Df9GDYSgDOIhfPng*|X>l8oxY#zED+8!rEl# z!!TI*se4p&GDn#KcK05bjV_Ck0Yn`ufkt=7tpY@-n_b-Zj$qBHl7+x>^r4pH--;tK zmWXBYm`-i*qXQ15gFw!!l~_G9iZ&soo0_FKr^P8@F6X%0hIY`b3mU&c8bqgV(&~%+ zqRwGO`bn-7X=*qKMBo`z+CgCsC4VkDg=oN<5s*m-0L~htu<9b-b21Ijp5lBoj4yBs zy4dS7(<UMLRhHnqXg&T3$Up$a4QQ%ac+t4mAf)3FMxW@V?{?y&AngadbTPV(#!~ps z%UnJDbjvJuy(3=N?M1lxyv#Rt96hB<IwEyfY~#cY>Ar{|yl**eFLlDx*9^BinL$^8 zY>FERR$pVfSO%_g-{zC2R~Ija(?UcrdsqhBoUM(U$ZD-^zQEaptNHN#whC(wR>}9( zNAoqjujU?~PkQPoOF8Cl#*Z4q`|6qOAF!EyKkbcXv2wmUeA&aQ(rPh?my3dEEYF3} zOxLX&x3ElXjb_f@VeX0d(9$7dW_r`RZV%e0>zX!5R)0rLu>n&$@s2=8Gv;%A2QFGZ z#<J(R(-v&Yf2VB(85Yl_^6C?paI<YWonoOJL%7X0qGjf;n!viryByv}OOvsj)q6ip zk&WNHho*K%H0_+fkCrCi52yX!j4?P)`M4{tcy@{Nj_;{0+3{<iD0c5qEKnrVO{<Ls z+mJMQ=emwJaj=(r)1MKO(M)%}H(tM^ZCXti(RK6=2lIR~nep5S<KL=#@B5u#1;;T; zZxL^9dLuh@S%NqBC{Y!6vsIZI^V*rdwmc`sk41Yt*Ftv0tO?)8yE7J<_FrCf+N4HZ z)nAIr@Q2IE7&hM#4i6N^#TB?tt4-p!+#q7oJsyoAqi;c@OK)4_<iSL~_Ng4*Li><q zGvW%*g{uhf>OfADA?nO7SN3^4Z|oI!o~c)t=5iv%PPTuzoSr<s8uw}4Pkla{I6U%( zz9|W@NZ$oJu2i1mB8u=RoMVBhkm37`*&i_v+8K}N4BjBrbkxVw>EwGo;(`+^!!bQ% zDDHd}62k8SM`!Ce&>}};COG->5;sK;ryX3wFdDnC|FhA{E1Z)7jLz8z(}_+Cw)-~- z8zz2Vw`SQ_mO5hVWSni+_TP~CaQb=#4ClR<8`j?6{`NOEYj0+J-1%S)|9<d6pG(+A zXY&#+zOVO@!(e>!<c)_WMF2>ueDJ{sYn|4JunldO-*$(+>9})&r1cw}SM&MhY~#TL z2Wm2X`CveM(c}`E$XX!d1MBUY5P5BmenxKrmXQAhZxQ}J_%MvkBORMMkt&CNMl)9h z*=sH*Qw05X-IKr=os~1Aet1UdLnE6?)!c0YvEc{m@pN+GV3J!~HgLbgO01yG^V|JS z95zH0zVKs6o)A~;A3wawT*EYzC@9`$YF7?iUQJ<d^Vge-OyL!d=e!XBkIkkh&+$N> z$+*orH1pv%j&d2{I)kf=OQP6S0QYP_42B-X{ORsd*ca#Zazt)$bZ>t;p%c~Q)%Fkc zcVNQ)F*(j=g|>L;?R+@!rF>Y8e*yyCWE@XYG~5h7l-wXsC-bj+P|e4_6%~)CR_ye} zC!hSwAO6t)-Ps8;jrVc&+N;s|z#s<5lu^|x+pn>B?@lI{C;W%IToIp38bTWvquKD} z(NJ@iv@CAbvQ|9Po%PS5<S8uwa60^cG#+FRXLB6Jx;VwW<uM3I^*IKT{q)u57nc;! z#o;tGjHhKDab3n7d5wE<5<1vI?d|}!J8__lS{{(RG7y7^EY}K0AFfl22j!5_O$8S! zDw2-ypJ{_W_A0)`MzYEHdS2yVAHOgrDI<ERQv<PnI?;2bg%BuA%eDJ9Sy27tjMtr% zWp3=MPDl>l1jw5QIBGwkzA8Cl=QhzZe=2J-L@^9d^pf=F%P<bnOM}bz3B{u#IC~-_ zMHwonZU`1{2Ed|E(XQ-_BIbCjv;%Y#sn&sjo9-=QPO*~tByuc}jz;Dlo?eXwg}ky< z3dpQr+8oXYdsoO~Gn-sZp{0D@v8m+xNs6d{u2~j0#ORpkheBnc5wg`pTX*$w4-<CK zk;}m`i8?%pq*@kFBG2Xn#9gl^_jh<A8s69?w8lFrd$)LlYpQt5>7!`Efw3?~T$$7d zzV^`A5f^&MZQlCt@y8t|4r>h8{mv)Ri>QyzwH@)ZwTj%^^WGGv$n@wDr%p4#&zGHy zyQ{+=Msu8I^|H3R!Y5l$^zELc0$R-xqCP~$BTLVztR-Y|k|bv)_CePQAe}Q|ggeXe zla`H$QYfpFOhuN~Zl<5&g0#G4#4d0mVFF>^=d0E7>M7FEjLeYM_0hqrcaG@b?P7H5 z)l+op<z)CAJNPu}r4clKb5fPT4!l7zP3vWI!6`Fa)86b=q=$7Kk=Ge2!v2*Knk^sG zCe|O7P?lnDSgSI_v5mv+^TxGKETQt<mF3?8K_p$D>tr_Ytg^gk1)#S~<)0$FY>8?# z3h_aG(JdimyO~aRS*CPDf)0kIDUu5&jH=w#X0cI~{+#QK1NUNxb!OPXQaQ%s+Cq~^ zCd{TN#TQ4!x^6Jn9zvhK;5C!J?@^)av3|Y>@#n>Ecp7s**#H$b2#-gD>6??S%d0Jr zWecZc(U<He(<4Z+v{ZFFPz0&59D8R51G}EbJc^sD?r8%R)%^>Y7*aLJUFz5;`WUUC z&=za}86xVubs&qJs9;?Zt6XHHvq8#+g(b}Y`SeZ1=MjH6q(vka$P5mU)5=@yoSR#$ z|5K;moA+OJx>=7LX*(-esY8bfO@3TLwA!Cr;lOB<8)uX;Hq9mfUGKoRbf0lz=1Kcm zW$eQ@7iW_(W(zzNVh@)y%(%?)WM_PNHP?S@`(6p7EvD?jb(B4XCcGNLdOv-cZE<PC z^uhRE8H4$o`{KOp>{QKP$tD@5qf?eg1Q0T@oa%--DdBSl@hP_2vpEwSoqoCVbo1b^ z=?t}j(p<2G2@20m@4~{(j-TTqkilR?i%ahuLERTfCBzSGQ2b+)6N>2^CS2b)^y}Nn z^t<8IhC@;`L4qTn>}Y%_H+P18V_!#*yDubFaQjCHX0CsT|9~m?F*Y3cHHx``&;5>! zoFB8!%7`OLt+lw1qq}KmJc5iVP&J;MEVy+sKtW%{s}i`kFdg!4ptiJ({rz};)?G!y znzg>(D_O5_KL=(F#yZjp2*TZlQB*>vfZDNPX&FH|Cb9qv4MgbZmF3;l3uKa;zF9jT zU0_piuev6e+5s0pH(GNMhHQkNdQolbRNDG{wX+VxyfC}NLf@2EZm#V;%EaS@TikA+ zZ1SAT*$O6FLpT<QB*<s9m%1g%DYR>_p3lVDy1mu4HB7?bgvf43tx_(>vw=#a!-a)u zWg;d~X0SR=<>1D~-u}_f-qX|F?Qgbs@8hyfTy0M&vPKz#y<y50`2E9R_~Pm%-)PDs zBy0<W@?+y$<UnZa9GILw-V8>W_M=Y6AGx%<N)mkKgo$z$_(}olJIuZYFUKtg<XD~K zH&PMWjlnc>fxE(SA(<1RCg%O{nAP~pXQ^6S(`#QNnxq&KR2Vr2n8wl3_{vOh?rB<1 zcrzgl#1V;E!nO^-Di<cb`8@AXQ(8qx#Ud-9Uup@=8m*_@QW2ah$QGZ7{Yw>0P_0GN z&9k6#9~ZRC-u%@pW;%P4u$s@ng)3=MJeE~q7APdn0e;KJp^9N+ma}qTlR!69<V=C+ zu6CH4tiXd-`G)G<qaj=ugW<UUW@pSbSG+5UdnL||el&Uc^4uL0i_M-3t<9z(tRS>u zIKZxLd+?Gb%YxxK*CiU6*%#$;rgMB_BWXqHsx+;rD>$ha_pnQ8g%i3Fs?G)`O3zzW zfiO!8&7o6CP1pR5oKEGDp^8`720k6m=kWCGh;9q%KK0J$sy6Jaz($TGnj=3uIfODN z#{-vCJM6z2Ui26;0G?@AR;y&{DAi5g_&n3M9&5jIpst?u$CTE>&QR4w1tbOv{hAG% zO)JHGV?)Hy-dWfErhB~WsesT^diJ@6gMpyS{Gyc4w>sCBjp%~m@j7=TOtU?OzCq^v z|HcI-**54a@jd5`IV_{{HmiZhDoL|ZjMeoeTMGgEnfSM18c$Rloms&NevZ(NMShc9 zSYYFEs8Jgd$48xH)|K|MhB%?+dBz$mF0`YtJca$p@v1AP32Kj@t6YvtOs~#|Gxs`@ z?kmDhLs8a>s+9vRO0NBAEG+?u^g=hKT?ZSRD-nbshtOd-W3+@$j=)Q>S1PUIMVq`$ zP2(4C{G(EtDS}1Y=ox;!JYE&FsazuThnGF`s}J!3vAC3eH+++KH$n=s+GBLgvPiyJ zz^jfM--H#GzxZ*K%ZJ_Qd`*Hn#8gyh3vsKVeG^4Gh&m6IUr%+u`XO~=q*dc}SNH1{ zMgmi%3G#d@IsM0;r=Ie{JX**&p_$r5GEH1t?J^&r;nf%}Bf)W0CYl$4RHFX|IPsxY zFRXJ`SYgDYB)5&A<2p%snvPC}uoh_`%dzwbYncdHzWqtk02?$JSGe7zJ-Jk7G!qWi zC&wQ>w}&QFT~WTs`%-8c#q!p5c!`Jq=J2(mx3_Ygi2mRr2`%WYptI1%HizYBIMv0( zMbDIqA{tTE0cQh^%#DSm3j*L2UaVOou0&@PUgztY$xB`kBeMvL4NNt|DePMsS`}r< zmi~F<Lonj3;~y3bXjFuiG^&kR--{CuW(`jo4sfp1#L*Wgi<Lfu!?+0hS_!`J@2RW$ zA5N_)VezUrJJhAZTk>q_&|Uu`mE0UHzMZv)5j3{~378mzSil+oT0k7}ORbMy1q!Qw z5ltC@xB0Ya;unEwg&*S|&Y?4RjyjXG&g2EP02^$V`AC+LH5G=R9YO1n2kf;kXuUkL z2Z?<(?xCgNR#*|Be6S5(v3o9!x5vUOwWMxLdtF>&^rI$o+{;T$7U6<*U|`H7>RGiv z6%DQ0F9L4gv6!irr`0foXMo>(>6r`hypI1xst7%5494K!qlp8AH~@7}y1Bac(C`QR z6$iLFEZ4){%haXE9Gh5SGQ`#6IhxBV%xhoN(?}SI+dD@oACT4{lo#11(P0zviveZ| zRO|-LGVEH>YuN-_)`x7AxzgjlO&QIE0x9;5<vcjQeS?i9FQY)Ti)gIwi)m8^v{09% zrHnkAPjV5%`HV65t(Q|7v&+aTxSGCb9PL-<u7~AWDOqv?_fTY|LSeB0XZfGZn{-MA zLFOAa_>Q;Vlc`2^p~Y)@X82fAMU5SaMaHRG{`3Z8v=3pi8J&%WQ_F#!YGq$eC-B^z z=$~SVt;spl_DrTT#542s#q^Dp;|9*Z&EBQ0lypDhcCy?1`x`rVaMU=Iu|J)>9u3;) zksg+xU0VoRM(90XcpKBZz(c548(5>>%Q2#*PafG9-*!q5pb7pyIT-a{>DTPF1lYqi zclCnK&{++N79(Cf&%+?gbNF#8r4MML5C=F;tITI7o9Ey6-proOhJ!7dyte2@<_llF zOfCh(adRV{;;!#e7l&8pBeaMh_`$bRoc;>WmNZcdM%9MAs8H#FyE(7=xuwgZI+87f zGjU{4ye}OqvcE6~#Bgr#BS=M$@2yxV)edXZw`j6N)<@W+KkqmjWp9kzFTBN)FPR0> zy`|Z#@!AQvNM5?~Lbs>_W;E_Az+~wjCt_e@WB*`pfBWEQXZ!GUYj^YT@bqB&@$UAP z_!zhUa<u*Qklx0l&95Z7m3ZCnWFVewAAP;|=;rkw{q^bQlbx+og#!eRo*kgczwU3J zw#2|eI6T@sx)nf=pFLF)+yI&Fzw94uA1c|{2mILE{bu{1ZD%+hn@4*GN`b@u?X8{1 zf8BZdRonWTySsbeZa+FbeD<Y)xW>T5Q+{LP;MwkWHu6<Dw6Rees-}dimu)St>LA*P zqIzxiFJDYIHas^7PqrA5G8p6UcLS2Lcw1Ou724SNX6JB+>~*+(@XgLvKEk!deq&>6 zZ<m6BjG0J-R_l9A#GBN1w7W^&jARWEtrUud9cT%m+KHC+TX&?U$+YW4z4r1B)ax!n zzM)FhX6SS8wDZb6SHFDYssY93W~{|E!z!Xjx@-d^rZYtNIAat6)0)Odu&ep4Dt_z6 zLJGXN!pT1zR`w;ZSAlAw*3mEZWgLX&eJ2hyJtT989X&k)O(ZuHJCl{%XJ^fM;{qyT zw}XG9tt9c{CRQ{g?^^-f&k<iz46hGc*P33|^&uorC;qfFtz&}vFMmDzCC+mrc33W3 z6MQm+!v2=%1uEDcaJI-fme$}_R7&HE5be?#6>`e49zUt=J`}H&XPvOw$I!-VXteWY z$YUBO3GWWdzJX-}%J9V^_-w;%a-|M0a+W}ads;d07>mXq>~%G$sazzbw5v!OIPif2 z6-OH@Ikv-Hg@XY!WZ6__gX)0uFJ?+1;>ne0B9%S~zx3Pf`81m6jFT-xac|(|al?S) zcL&~!QHfoM?flNP>*+40v&`&-m+&E__lx;S=MmzCiDTTBD3dKpkD&5KW?$Nhmy@?; z1i@y{<@n7UMd8JXY&XMizqtzgNpaD@X*}#KE9>^C6+%PaI;bM)mw~(4v40%6Zp2j8 zDUn!Q(!F!?s%VTUwd7Zn6j-1z!sWphk{<)x{_y?D5Vz(GW;LQ*7hKriUmIerf*ZUl zDo;i~jF5VR|K7AW5r}u_!M-N@uXUu_0oFU5^z@&t^AV=`O*?Xcl(wU3Fn56k!-K)> zj=;91S!TAetB_-(3-<~&`Z-2$^F8*?`s^L0$q~(hwy-NsUO&xJmqIwpl(=?dx0;;o zU)FjV>eMW*&@<|Xq~hhoV=3yXO8(qg7}QmLPyLiDv^nj$EbBs>tIpRIr`ak-HN)Bt z{i=jD%Si{?CBp#vg(B$F9&0)LVE#Z%sT#3ecwed<t@K*U#3fC)7p}`OSw6AaBeNV< z1s`mGmP*zoXtWW|i&|ffdm99nL#f~}gK%yomzQ8cA>Rs41rOa~hIu1t8)|&+#HE{V z#d)IIhHK9G$V4#XI1bN4RpuY#AN`J3rH0Hu=k8X&d1eT1ZA)g#|9D0&A32~Se7d~k za{$-<+Ff;1tsu+Hs(Bxmtj(^2%Zs(<R#M{ngLqx@ajg-P)Tx59eE0&d7Ev!kT|zSl zGTOX`?WWs<r*lsikN36-^#@90U1?{G@X--dU!7kKhWk9U;y0buZD_8Olp}bYLNlCB z;q%qb#x-RN8J!r_a;f@~MFGVMicCKobr$Fq%|u^PpvFj0FDY$=-GP~3o{WF#ncCp{ z9WE=!y|AGzlORJMYR|TyD|<-kK&IKGj1nV#>uj=IkA8$)(yy`Gdp-2ZpzS3qnynHc z9YMzh{i`WW4?N(DgFKJ0zmQPwCR<R+T?B}6bFHdZqD`X1Vdxg@tl}A8ghv&S=C&Nj zthosQoMFC%lYhEt$18_Zh%Uwf-WXypMkz$^FG8+7Trgh^c9|5iT-6R-m+QV9B4!tn zjb9?YHBxX4N#GlR>7S1rVQvUv22MLiID<1K-4d7`1UMiTVehOAFPCfKFk-}SMmZPh z>BI+)F2*BREwz|)s?`$Ufj!b;%!F1fa}`Z&^2(DroX$@sY2gfhM2YY=?zw-uxTn5Y zrDp*n&(Kk}fD)rduQLXW-jo<?!Rv%!Doa&`q+GiyuXIXrJu)RGA-e1$nxZl)UgS$w zE52y7mQY-(#pBl~zIYs^n=PbajDFl);N=D;;Z*}C&l9ZVe>94f*n~Ao&l{C9CX$Yp z1Y6Xz5_hp)>3O5Qyime>B`8S&1*eK@tmRxsrj=vRCGX$RovJIc7=t_)+TgqzA_D8J ziY@Yg-x-};K%wSvYzNHh_$_W(wnciqQ_}KQk<1TCD3A-PG#^b;xg&SF6DX1as%P<e z*aIa~&uglSXP7URR1TBFzxVUNKPmCKf0^;Of1dLp*UIY4ga^H<eOt~Xc#y!$lBt?* z_sA*a*rww3iH@AOmCroMaag*}nRvDsgTR(BMB-(BZg%vf37I1PAK=hP6EPJKeHwb~ zzzSw1f00r~1D~YYX*&yP!-EZG2qFv~qF@|?8wd~FhlV$iipL>W;xjD=TeH;a<l2G% z-wn2G*xt33eHTX%ovKinxsg0M7U0kkI_C!?7USfpF98^{j>n+kcV0LippdWWM<GS$ z_Pn0v^j#e0&duA&=Ad_pb0X>&Yf)ZLncMNcMdcs)v!@I_Ms8rFy0Gxzw$=Or)8*Ki z9Y*zHyMw?RVwO~YI-HD8w(W2##CJW-gO&`*(3clxjnwB@a*heyJxM3jJLl##twPy< z!he+bm6r^vbOV_gCyJ>C)c*Q?@BF({7!$5=Ir{51;oE}|4sBlKCB1QsB=N0}#<gq) zCJWNiGo)K9q-N8(tG)K1&yh;}B75e;L=v#5E@{x=Rm)GM@)e?krt{h9_ajGj-^A?d z1q!4Y7dTQjWn$N-JxbR>=r>3Rx3#(T_4etXxBm*|arN~lpRSE?GGU6FAjFboIdfcM za;<{U<Zrg09wFBH;48)yA3l5hc;_#y{|hTG>oF}ofh%xw$gPsjW_0FRCeC|MTWOa_ zc;>J2a*L4t!XaYstqMP<O~O>gHi@3{<;DhdJLCnHnksO)us5?iI_*$3yi3dWtcvfw z4(Y$KF&Or7&H`~<P(aucRJ&Cs>B)fmM2}t)6jD2eusUBV#L<blvGYAH4j6Vw02o9N z+_Ryn<)k^ZihG(N+@By#T<;|knZ^<SE>4PFjp;6Ozat6`PkdoE_*Lc_i>@P%OeTR6 z_Uk0YpN9x?)7fLRshsXynJ&nT0q8D6ghcW|nB*~Y7Q3fSbv2g+BIR@f$?yA}wU0Hn zQFCOJSv-eJvJrNa7DHMGY~H+4%@D_W{DiSxxITpOJ{Uqh>~oZPY^I09R=hf=_Zqp^ z<$kEi`23CBi6bP(72J#<?3^Is;K?dWGU`iSNst$gxy8(&I60rb`^CSc7-maCuaAUe zVWzn9?D(;*!aNz0hzh0*%u?>MUht&w7h5};*eNAc5IzR4q;1)lLL%#cmc}N9v<?Av z{5;A6CQVCXhC&Eqp)PY43Mtk*s|`3_z7VP*C#053SQ-aCT`988!alH|qrlN*A1Zf5 z5+JmCya+AU*4z_?E-nY1_fo(mJrx+_b&OLg63GZA^DuaddQ%1pM4uc(W)0Rs95Cw- z5g4pmPibh~w0k$&A$eLD(t8<e1k`RqyKWI&gLdo(d%gA$|6Cz}8*whWh-`hmx%0Ht zbs;%2=Y!-S)`t({PY8}~jtZi2=TJ{x;3jT}h?Ke92x%xa5~hZQGX~G^%-&BNaOr{9 zgkc-uLkreHLR6$tm*q!CQXFH)EOWmj8dBFe<yJQ~utK_JG_S=4bYt}%0}2QaNj`BC zDi_vNCO8aJdE%Z5bCFFi?D`k?f`1oI5}D4XD~h!7;t4SbtH*wqG<$wLj6AK+A#H&8 zg7;>uX<cv=duAkBXL-=VvQlETu_%4vqcFC*pncr2<tQF@<cN_`TK!^`uYLZmm=`4p z%`d2fQjei}8ox!yevOQ=s4PVyH8m^s&#Oh@=ZG)tr|U(KA!=x&cBXH>e8cYz?aaY& ze{F=xk@0Rt>nWtQhtO^>;1mD5c*E0IJ-wgazYFs+(VARy{JW5ESiojUCLE8WIZv)O zb!d^4Brx}hI+{*Bj4PnsY|6KuOzHGWe_dm$TrwJA0qY~xocaJ3lo3zr^7pL)S;1(Y z<r7%9N9yNC!<gKaUX%(p<pB=E&N0P$mt^oFHIPJnyzr&-mg5k0i4qWZDA8;g+WGV2 z+DpyVyvwxEY`a<e1<WO{E_&1N%CBecNO}pQnWkHRe$4G8vaFxtnzZu~lHMcJq-HZO zpqp31m5Q#;E_Ob{B~>*1?DU6=^HYvkvqLd_E&P`Yv2`?y4kmqG6gGT*tZ99ofNNe3 zrw)xoGN+O?$jd~eE|H~pT@j+UAw1o(c;=<;b!B9}iD*iMRGFrFuwYe`6-lsiS2J*x z5ncLJlq6k;bai97l9FP*I$lj@^s3t;f~NLH9v#<Hrcvf{1FGr!xJIGLpm&7MI?Djc z>T7+qU|&7x&3m@7E_>B@k)!jeu`q2Kx{H-+K{r$Cq{cGj*FzQVu(R`Jzfq!9FL3&W z5HC{0{TfrEw01iXg!BqT5$b_ppquWjiH#(ZJ(`$KDA<Jhg&S#p`Kyj|QVlvU-atWS zQrj`&xS+nPwhVD3CKv6pKKpWaZ|l$A-9${B9V;hE6Di+i8E(>Dv28_n^fyvcZ!iMa z8UQKWn!F@K$VQkq<SpT)k+z0b|0KI6=_CwG-*Dd&pH7t){6;4p&M5JstL^p$Vf<xB z1m&I?8Y3R8VitfJVp>;r9Sz(<&s~}imt3)-q(*p9TaHliyip>ONdfAh*0*RohwVaj z7AV?i3Y(p%HaAAxq}uC`sox3l!X_xb9WEPQ4>ZQVN=jC)kP~>t6s6%IM=T6sibS*o zdUP7pPMdbU1>Ki76j;rFYYu`zY!XkgR)OWjgEz5P_8}^QRcohcpbn(li%dMMz#9R{ zXFiF>{)H?C1CZqYRGmF6!dP!mt(oxCl>0_OG()Zls6hOWrjbq`WU^bRDor|y+@gPe zp(E-`rvf8KmAm5m1c!6{FLk3V^2%*Vq^ENh&RDy(<1lsv`kB4FNsrwuLfb!FUSIiT znWNIO|Db>K;SaFg&TuI;6Rg{VCCymv?Q>ahd8QNjfv#ES&}IF(W<7fITUNP7u6P8{ z^1hqNGKaABT>mUV<Jo+4&II?o`*+!RXjv>PBPbdY_D<H`f7NqIY+qf%i;gIg6aAx2 zyL@Y3Qg6W}r!HXiB!94^xYe8>BbdT)bf`9PDA&O5PO!N`E&au0IxmRfE8G?fV+eoG zl2=R6NP%*o4YIY9RgW{rrLVT^nlAgRQz9)wc~<o;Gn*MMmxK+N-O;~kb@Y+_{00{Z z$ORTMT9%VI8i!DX5@6Kd?8jW@s2f!XU%`=u<a6P@8!9yKiY{uSmOCTumeAZG`R2rb z+ni2&Z+4OAE6hHJyj1y$q1&VW$&tkw@!>bU>4@g`LJND6wKl*ih~VbcX^#=ugW=FW z3e>Nsx=k63&d!))vH0?WIhYd%xmL1+z=b!(I}A#h-E0}oz(cMM$K(#XNG*E}4R<(x zojtUhtMaGS%Ms9Wvn-eJ=2N<%>C4OB%r4JQ)!J}6YTTy|y#@D*<uzcq#SJbCLkALS z&PR=~iK{UJ{J#r1v3r*zq{Hs~NsbsvVr+@i3W=}Z(*Y8ukW*zZk14?F*#GX)mD+}e zlpeMjkGJ7zWI`DbN5=^yDyMn<XdB)LY?wl$d35t5Ft80F^l1rz>TQ`b-R`d-I&Z$i z>s!RwJ)p)Q2e)^4d0lWEp<h09lKsrX)UI_tfa8L|z~&gBNxND+*N{~St;E2iTI=xm za;qg|!bYW`Oc%813TlyNy<+2y%BQD~b`DNYxodf_zK;JQpW@17I(o_Ekq62i>|Cyb zH%xB^I%<uZhFoTKS1+N0G#xECo!gtzMvk_qq#(*g@5k-hXarJl>}AXAtI+zk3K!2? zogge=pQytoQ<2cfT8c1b>9Fev->lckEV&^u3{*B_2rMTyM});}KopyJQfthMPHPEz z@i$yz>bP@cCM*6Eoa?bzb?pxrEj}v}j@6X<7~aN5F#OZSap)jD@4b;V8zDb2gb<8w zg&b~Jh4e5Qo+ql{#>S)V$D7Y~kK9d#b}p@aHUqUO)}n(tS@3$ZKq-oSd8wWFfS47h z8KB*HgiHY94Ey<c#9^>dz%vu>3}VQParpqMNPq4Zx1F&Z>K(`;*NwEK?r}p53F|)y zj%wW)t&b6|Mo)6}M8ff^%~Ca-tGG%gE)3}v2^m+Z6hUPuS5i>*tnR(on8g4(%sj@+ zBGO3>9LtF8%cob-m%>`rVUwK?3F|({QtYpjIpu>SsO4<c@d3%$N0M}F?ICWj>0O=A zz3o7PAtBH&g)Z2d_&0V4om6v5>r4vy5+Mb#m5pwK$(n`L=@D=Bd_uc<o(ry7mRkm| zk|4|@{u#;qtRhajU?YrpT<p+h-Mi-|&UhCbA{!fM(nt-%bmWNe9tg2adGD@jl8oUL zLBKEj{O7e@fxG%K<2KYcDpk_%;$86sj}|SyVwGf?TiN6p3N03{T4`|^04edGRxQ0j z1uuZLl>bSD(!*?qLHe*dW#I%F3@mMX!UiR|tDsA7fJXi}5y9n}NfCfZ)*`KvJj#oN z<*HCPyhOFuB24I^vfdpcQwirMmMD(;OoekawL(Z&k;NoptMn$<;F?p^p;W9LRK!Sw zQxsJ&uRVk)*-SXOn=NWlFW9<nM7Xe}a8zdjHd>&IM6FmB>}1d~!LM~(o{oUEiEH>w zXtP7qj~7P)6=^4W!?SqFDtwF!UtK+2J6B__SEmjR`$s#j(2dYeL<eVt_vBEFy<QqF zpz_;GJ=0|SJ8x5|wc3teG6YIGsxYr7BR$d<l>UId>>LwAgoe1wwleCPY$JTXSPMG| zCDDRiY0jofpfHYs`<8+-&eCq}z+B=sF0$F>?msbMBB(GnlRA2{QuanUR^bZI*rBrS z>Wj>@n=}yL6YNni6Co5EL>Guf7+=ktAx(#;?VI&Li%o*VVVVYOJ1ce4UU*t>&zE_G zBMzdL#SP`=?2V1f$>kLfG)9aP&uJ((W}0>LR^HmPodK^eNQVHwJzY3ST~F}cb6nO! z#mMbitkzU}vMUzx_sR<~X(wD3x0xo)3f$+OJH3M|6fLh^0~j@7<5)Es^SFvCH33Mm z|4l%J4uxSzP1CJg2>=SvgB6+ZuvTpKV5`CT$UvEF?EI{n!#?d(>BpS5P`Jg{HtWUI z8yjdgew_28m;K$<Go10}jWBYfHLmzRUWE?nucuDLe%bCWjX5Ly_L#<894tylXJLE1 zsDnoLq^*+4URvVO5w+lB?~KJjE^NL@v!fCqkAsTe+&b7lANHnu=fS!-^JlQq9YTF= z@f)`PG#flx85Zp4?rvkH3r|oM8wwP(r7fpD$t?3_<Jo3m2d9J4G~!ENv=N(8Ux^Wa zNN10YoVtACmh3&On%Dw%S3Pd0h-X}Th>Nqsv<S^dVqyOM<Pk0(+I%@d6ZB8u0Kr=4 zli$M!@h=~_e?AEnf{JX2F)_ZMc{G&dS_V?Ii*+<DCDI%R10?`7?hqGdwUSCT=rv|Y zEm%p}?r6;0wOPx3f*Qjosj5T-rRmKh?JMqt3?#@=XZ?3*W9v5C_>+2ynAd*(DiZA4 z+p_E+vzBcra!e$0u)OsYbXxO5uYnT0+UP;-ooU-tV)I(k0N5Nt%`<e{CNP$9wYZT* zc51CAMnEMK{5i5&Q6sEflzv}NbAq9GP86BQ{C37yGTMqE@h#UNcgMP!bM10=V_>vm z2?xpsNq<_^;HOth``ycOo2J_&N)NqdIqwBGFM_!=7Z_%RCQf%Ex`hRi!FpCap7&HV zQz%e*O65{352V&{(*n0iFMakZNUmr+WlJA^=K??uQf&q21T<OLtn`7jLEEuzmULkN zdkGbt@!`z-I8iks6n=&Ns(x%$@gt`^q7}IwD!Wo9@ssWUfrku^OOKOM2|zvGf?o#A zZ<z#!v7uuNC1$j5lIE3Y`VKO>5V(-su4chl8ylMLHJ~F9JO$)egq%$U_Sc^(qIb2& z0X{_}L*c$k(wxj{&X2&U#5)ylVR#yDL4guT{u5A4X&PaPOU?(*As(=EH^~RYqbgjM z>`YnozVq4V?xa}^vZ5~_J8!6)k}#SQfrO%!INN&DgPb$Jk?NX_tawTYqxrEiYUseZ z_>^wifwa$o_~8`y!d=M{F^O<ZH%Nk-jfT>vDgOmiFWZ%wZc(_W(mFReWzvNB>I~A5 zSpAOki7xi2<a~()Z6<qyWKG48a~B4ISX~VwA7IJkU0W<f8!J^13s!X4rZFD_PSx2! zw`g+ABx8MqNpn_<N^H{hUgyUjJ3Jxof`XElwHdLbA&@b|1;qei$zF%pFGLaWPz9z+ zv?#1S<T4P~j-*HNOr#t}A&_XDSqw!L2MX6zv;oL5)pa9MBuqGd7EVo+k5@<PBAsCu zn^P;qaBghiP(3ao)$=lOB~XNV5S&5o5}jYp;DLozrV~K(0v!$<&cn`DnOHcW7H<+M z-d7wx=z?EzhCf{P#vo;mF(BnjZA4>&3p#^`%l(f1$U7V(fc8}{(8hNnPjc7QPkR!? z9pUiv4%!FF<%C4c4`?#cJFF)KO5jmxo@N9hnoZ`h)p<BYHk9lwz%JB82(Y4!$Q;Sk z5NY2g&%5g&1eA3!h>-BjFO2D|LDvYtW{Vbg=N)qSUf>ERd~HZ1=pZC-xqu6Rt3Xg} zGBw<gI@BO*=vlpa|CMJogSPss?s0GJ@6Ug`aqo-c2PgPE|JCLQK3RVb5cvdR1fWL2 zh9S0vm4E^xedNeYTvYj2yIosNCEpDeQQ19-$J+KT>4vIVOg%zYI9)pZMyKF^5=M-h z^Xpl_KtYqP1=ozIOpOcKX2+|iJSZvdE=a!2G@(Ng=5yejl^N`^7b59(e+?HH<Di{K zT_P%IA(rC=-Bm3P>3GbOC-Dn+W`OS^a%yLuBgP}*V>;S2+8R=cfcD+*bOYv|u05QL zpANs@f^`K^5Qx-*EYpxjPwTEWWJS~hgtCr`89~JKgV$>h%@!0p`&Ogn<)=WjfHZ0; zX1F9#$cKp*hR^z0<2z3?2Ar`MdQf9ACs}*iM~(Z5E8p*E6y{WKb)v>^i6S=a@JKc{ z$wls(M~_0~qQ{`?)&kYzL5o<+lSI+xP-E8^2pZP1KnBY}VpPfb*bTvO;P{h)GbY@V ztrzlFX}*vg1m&|yCfj%zZ5>3c53XuJm9@Cx@`y%fJtMwmF;OTRU5C|Bw#*qHvVvb+ zX#f9F&g=XLp{e(7M~r1uEUh<<=KKZVZ)239!*9zW%kI6Oy6fxf1#)JcDXMiuI`F%q zwf68`Tha*t(1C-5l#ZwKfox*nN|xEt4SGf^9pl<$6}b<6!Z^Yvsn2>UuUpOBCU;fm zY+<T;1mYu|UXbLJ5wbay*B<HtOileV6LD1z@O3pL7A+Ei9BzKXbaf@8Nucvqpu4W- zXekt(Aiprd>B_e1mjl4RErgP-RWQZQUQMpf2Vyvf($eW6CE6=^F#Kfh-dm3yjd44H z8RMsZJZ7>MWt~aI2J1DUL;~1RbJ0b+1agxuzv{gnc6##;Tz1I&I2q%Iv2wA;O+4MK zNt6Sf@<C8Cqm-L`xd8Fgnq61~4MDMn8iP{{;7aGXU6saGFBWZ0%PVndva|3o&M3Kj z5hVuph+*Afh6^4Om!SDCqNsm@=SLF9p`7asb7K)cEP;~8)6x)roY73G+N#8r4)}*e z6v;qr8pS02QkiN5mJX{MgtUdgw4t;s>8R{v<t?8Q_Bxy{<e<>$@CWR{af(L{9d-1; z(UalDWb}6&*rbjp@kepG(}jj7U!!u%O?Xdoxd<7zRr2Qwd@&`2U$_NtZ<w>ag00gY z2+R$yM^Jh-v<>Xzyac&_JwAQYu2<pYgU7IPC51a7;meVY8xP$$lNLF4?GmVGYnWps zW!^@6YY!u+?*3>=(Y**0XfrNo#O+j##!~gVC`90{gF-cjdDcD!e$L;prMZ0Sn7m4y zlua6PEu~~y7#1=IE?U0Bbavh1m{&&vWUwv;Xpwv>Vi`9~;D(kC9+}8toxD)Qa{i(d z|4^q2hjDq1_>9i3scHu+4K#XNMlWy)F~jZVj`i}S^4CSH0eHnhTrvmty;oP9&cb6i zXgmh9sKxdv?5~SN0y${+ZRCJQ-VcY@@^2~&0>}y~x4Z~e-Ib4aP8j3`OWV{R`Oss( z)heo=AxFg}EZ6PIY85T(TsQ|;I7o5AtC#gO#T2Kv;{{pXdz}2$f(>lb6y$!j2ghR> zf<@odNt$Z(YngMjI~yA`&+nbV6eWg5r?{7=E3N6;h$Y~cIZ`mI`L$eDZ<=QMf}7I? zD8<|(FFv(M5OXUpu14n?8)b4*`>5K=m-;f^odzA$TB9xBX`oY(KUYCr3wp}JUuWQ) z`<IB59sSU?S#VEa-9ywB!qfbbCjqPR`?#a-dmLGYBf=iyFaTv*Jmec22hVo5Pmeag zidF$7_O0JvSY>FL17wwxT@0wZQNZyjt<a5p5iy&|Vg8tN70Tj+>x8Nf3t>mc2wtBH z4h?01*uu<kb7jwRU5hNbe#Od}x-y^}-sqRF$gw^eh?2T}-707u3toZ>!poesnFO%e z6i7}jBm9bHpf3A{21_NRmRYPtDu}U4<yE7Vk~fO=OV71(SxD&-80ATkPx>{d!MU(L z8lb^^;l_Y|b_3U-oL4kUSVmLa9FZbuT+q|%Ks}>N8@CEBFg&81b|QsJ?=ZXuw*VD# z&ac~xj~>F!TN!3O`L&QqmYn}`Dya6=jr@Dn7uw6pSS$v<@r${#QDxg4q(NEC<uf!F zk?&DJEj&eD*(?Y2Ijh63h@F*9N>izgAc*N<Ok?UtO3&<KEAo|Bbcq(Esrr8;lnpI= z=TB)jAm-skh*x|Sh9NX-Sd^iL5euOTM2a*VNe>ltB5p%K*khndvS{0Zo{h*FzKVdg zK{yKAVl%nkWVkz%3lR$_w(Z#M={qNyUrBNvIW2~dP99&4CDz1CvAruf7UH$+R700K zdW-pWYS42q>MyM)IkwJveIz?`d(0f2eanOu1cdjEEbR)EY-c0O7#v#j(%Ox?)<lE1 zp<L3ng)J|syRh9>gk9KrD+mb=x3#X6c(N44hwYT^XVT3e_Y9s*w$3Lro~Hs!d(L&N z(%NV%%-srP;69U^oj*|n_n4;A)Llh|Etl&E<$<ZacnVL+<7ZE|j&}B*a^C}y#mo%w z7LC{4u3{lt<_SmuKG{C{dhbyV?qWE9H3``gN@ObmJ3QJv+S$TgTqT&mvpKn!Lv}qw zIwK(g{m)%bL5-)-L%%}Jw@Opc&BVE<CMCT8;gp|<z`mi<EHB|1aeLOZ&GsAvIZk6X zL}#TNo}X=O#G`8KOIafaYMB_gTg1XhE<>v*AMO^p2Df<}?^5*0?6*7;ZZSA|HJyB) z2$jNeXmxb_u2Ul>ZK+;Z4y}o1At&R4K=RAs(ylCA7M9kICW+3ucsX1`k~S^Z$l0dd z#e{9s`eFzP4tLIzdv*&O`B2X(zkyHEFLS|E8u+DUm5h6GI}C)911?sAmQZi+2G?8A z5SGrI>uCo|!G(!vI>4Q227@=_-o>b27geQ&Jjnf6$uLm0DOUp2kkJKriziVE)i2WT zQyZ|+tdlUB=<iVzFtlpJaeGJwZtyE?MQ<{c7LVxdA=cn7kKbKNTTPvDqJPqbK6zzk z{ItZ9oeR=kb&`#DYhfDO%ed!hS<%V%>&drk0>2e$7aOIxi~6D^5+-2NP<VtsF=fe= zM_)tmZ@#j<Pa$)YB{UN@kv%GOuVOT_y-6r1*87$ub#6VsovLS?@n-$BY`P25X=C$c zV`FcB`(X2E@8I<4ulw7lhx^-GJCFa$%bmCXa<u*Q(6+yE+<wDmmUYi<_wG_GEScH) z{Pa8Zn(69#Gjb`oTbYB2=^);<#>=`}qpK*TOF9?>hK;bs#Go!xJ48;Z5}?MK5W}05 zY!Hi~y59V}_J<tD+gn59QS{4aWqDUsqdKm)hg9H(Whlj}#(O}l!CfA|yA&;nT9N7# z$*XtOI6{K1!c7rryRjMMV2C7D<HY{qR<oup)>Om=b#A7Tw1;~ulCYtTEN}lmqaxC> zSHbG~?mEcwCf{BCut?It?~dnOWWY_-mPdbmy7?rSzYn&Lo*lqYPaP&zT;2tEDuC{$ z4ZkGR!JF9QI`NO7dx<nc93E2o@%9w{JQ(6S*Vj>OVh~Be0M@dK;|`M?`8FXpfVG5r zw+1jFi8ERFm9b=zF9`N*p>J8MxE7b|h9OvpT1NQTcHF9K3vIZqAVfM%(|+B8Oban+ zQGa3ktqHymi`GyQT<%ie5#C+C4*c=Mz(&hUXS}p*5-$gMxAXT_6}#)n$9${WQl2>i zUvJ}jP2hK<ytPE)KcfbBovz)c8rQPjvM#sKJhc6n{e$g8H3Lz(!jHY(Z?+FIE$e4g zQU3U$L{Kdb8!sN6aJJu)F^N%-CwrGn`J>4|(}kPiWfE<UY=`GpJ{aBGFY-fPT047v zog42;*V-XJ6tbXXpe>tJ_SDiCr8`8+goNlE=>xBe3fGAE;LqAgj(Afxr%!&?VMbzP zA4%c$heE}4I%lz73?tl<qZUg}Xt<*furry}5&9r%Ru5OK45QAmmYvRE&JUN@{}{Kb z1Pa87KV*Xyzmx;?r5p|#g`!$Zs;I9Fr&C-QinimxLxd{sT=25G(fnH+7wPw=%-2!I zE=x@P{CKrlxq)@DpK*Ga&ToFh?1ecNdC(*dK7lPV?Ab%oCTH`myKDoI+zI6yM;Hmg zgHDPbdl=FAMHUZxAO2d{{3ebM_Ir#cPe3omLOWxLAf?w?b&r_?AKwJg#4w!eQ4;c4 z55MIUcD<38aSnu7{FExOA}#&RT*FOdTq6`*Ha~GG+-SD>0z0=W-i|RxS|&lS))XnO zB4<g##dwu*bNHF~x`P%{_Hpgy^msg$3{@Zp?hQhk>V*`!4)IM4U~_=9ML0i%dpo<U zq<ZJqv(9J+kI+c+QS_ME3Mcj^(>F-4ikl&Nnq-cM_y>w)2hWJ*I{91>4e}?Ya_Bp< zu6=Lg&&KnKeJisnZ=*SHDC%Od+AI-z5^!IL+|s#T#cEY<S}URxOVxl!nAkZn<CA-r z`8;YMz(am)+XN3%7tO?F((!tN@n0cdkc)ccu-9Y;GfnWl<+s|<UxBj1BV?VT_Euht zVlpY=G8zQ%94<>QrAuHXwN!oS6t!acNvB0>N7v@vt-B6P?fiPu^CxppcF(`#|EhcO zji`x8CvO+`-atpKR?!Q|VP_lufP3Oh$<mgW)H#eVJa;<qre4@MMQ7x45=5D)Nl!sG zit$ACVSnPTdUx-kEM6d~<;l)Vh_2y4&@(kNzp}ifb<5VdrC;3bfKvo3in+rNDQ2tJ zg5%wzN&iICw-XcIGVaLG2<<C3Z!q%ODUOvwjV7wKbOar0rD8Dj&2Sg@?(hfq?}AcR zSVo>ZN&UUN0()618!Y`N;T~d~TfdyLMj7p>4#;Eo0I9LeUAB@U6jcac-JsYYHea{` z*MfC*ae>3{a#K@uFV8hVEb0eI;wRn79*pR-(cdlMj~y0ITapTaNjJ|&JzR9CleOGE zsnK#)720C;%HyPQE#ucNzc)YzA4XbbFPfX*;uaTsB+SAL0+d97-h6!R{V*|u8i$|= zh=@}dHpJAi^QgR2HnFxXJ32pK-(jm91B5<CZ4O)TpLfg5b^90P)j!@p=ITv-8DAO6 zYM@l3>Q~&G#)V?ND^erkBG*<X3VYouF4x_0i?76tAj~V_&a_d(f(j;=uYKNuYG5ZO zd3c*@LAQBd?-Wz{YKjz54`lKD3Py^H-gNzv>A8b$g^;>j9-%V?`=~6f;)D~0%1&@N zAhHE%$~;#Lxgr|vN7ywhrV_Apz1Tv4wI!hdh%^YryXmY>NGQ|3H};y2^*vXBN_};7 zU}E>E-^S>f+GB8Ss;4Ru6?}3Bc6Pv<k~Ur2CG)PV;=B>hmC;34-erq6Zj{pmBdL9> z$<J5g;jG_t%}Jj006$iIq?NGT#IL*nM4u$S(~(8$Xuh@)1i0q5mEJ9^t|mfEnYaEM zCs4t8<XeusWJ#SA0-@N3DYn7!aoE-U#487zT<H3w)Cq)0mOfXg-tnZkM>Rz=?<jI1 zkt3w4KkD7%dQa^;%AVmfeu+lT6goT!?pt9$)0X(e2%^_m{V^#Vh{A$7T9i<5_Af-u zZx3K%bUOv&^#yAsZB-Eqk-|iRpMaK(RX%@pgcfL=a%%y$*kQ`I81cF+(e@f_-cr$W zEaQoh5+Wyh9`?|(6%U>COIzR*;{nQ*mH@jPmQ3ssQZzP7m!c-yy~j^rwz6$J*jM5O zUlMah4|4s3dV*67kzhWk97U_ImPV?Or06m3;l3Kr3%5qFkNkk?D)v^seej?YHH^X+ zI2G18n@%n|FM7CmVT9bP-;d7EJ1?kpPHE>$Mu;#1CHae=8m>r;H|xC|mM*!_icmfj zohMcjOHoXj<JABn42r88r&?_i%4#kkRkQ8mV&kjNGebWSsOFsJ%laUs#H#{Xf?9@8 z3N+_VPg}WyL)gw9<s3@XmE$=MngGM4>$fV78#5IGaw-|fXbKT1KV%XIymAad3$`a8 z%i9bUv$cLt870sre8VbwIhoF%sg-(2$CkURps1Z>#dp+pq}zpjCs5Mj>B!1p<fP9B z&GsT;$mBs@iv%EDc@vLpINk7Q=~8i4Y0I7tyxm+ANe*5_Fn_gtZeh!)Cj4|_Y2}QI z+1lbM&1x-#iEFgkCMu`g5!x&)K74r{QsrZ)c!VM3@7j=X6mwTk>iSaZ3yc~NBCN7l zZ%}PnWpO|GmY*<v^mq8znmmK&&hg(;G+Db&TL-(`X8CD}g1NJ-B|#P=R&G9)LwDgm zi%>7HaI#1T1j9E{=Y9G*b|M)GW=QQu4W9?c+ode@X1ILiF_7v0)U7*>^$5rLsM=)9 z5;c5%BNTh<>Bhr<;TQ4IeeTTN2((K7oeqLqJ=1YmF??Zxg|+kQd>(X}47s(3u4`_( zR3K_|18zy^2W_+<2kne3QYbc}un*Cw$FS~o9(Fz|2@zAbZRyvHe=&SnRx+eLSrpG~ z<qsU_@G0~H`^e34{}qBzcE(4qhEGO=0YphrEiPfGb)%{!G;e|za)@o7p9{2^kzpZL zZr=aW3U`LI!_t3_9^yiWjx%Zu<Vv>A_pe6%SG@ILFzd`Gs+p5%aX*$;ovnAC!T!tp z+r)>8lIy(4O$XDs2ETLG6UO*<IvKw_#9ceXaUayI726gw%OERVCD%`#K5xkCbY&g} z&mI)9oTJ=W>CMqjfs7yr=5YHwfAfyMibJ?yhw5FZE7~Wq*Qtz)v6LXnfjXyM(k{!R z<fTfDshzx-(qZYZyNcn`JW!M!hWvF#|Hswp;9tNmX`_$JG{7_rYsOvX1LK906I33- zAwXt08UK1lhA^xH3Uk}%f$cmq$%2dQNMtdDa^P->^K+!u<u6K@4Fg7t7+f0NU!IHs zTD>H^F&2giq-+Xq5^wQg?MJZIO-B+)7wD8p)QnE6|BRVIshZahaut^u1uu=0J0@qs zMqPQOv3}@CSA;_{+yUckRmd=IF|T_f$2zMgD;y*t^M#1B_0G{NMA7)kj(c5gT(Q^2 z1t_D*)DN&$))DrjYxCyz()(F}fcNI)&Z?qk%Q!6cJ}tRG*1Mm4Q<b=F9hBqe#ThI~ z9O0_tI?|L2uBv9hoTU)5V9xj;zp$58T99B<mR~Bkh5(U(K#~-bF*r8?SFw!IrN|m! z;URcI0yqbq3up!-n4CNF(FNw5P60RNFdJk-fK%2UN@Z`2Y6?WhoTBLDM9aDi>)d1F zA}M*K&t*=xl|Sm~t@B$o_@kUYdr5JPtEK5}Z#sH8LXe1DpS|TGZk4H90nsF~TET^5 zkZ5pz<6fqx6Zm0zav!8;<7~zRQI)+AH2_!T(&zwjo4tj(8o_kKQ!NFF59KEhnud96 z@%vZ3kL8kHg^dji9LC$H&khj?|7aT#@>`on+wd8u-sFSr-R;f8ZRb_aU)P+?ATE-e zGY}fe&F}}VPO}9!nSVK%%rQNCmy9Ct6)Pe@2f>amr?c2)L}V=XaOzJtn>^5zNnQ+O z%YSy8DwJvGXUXl@@oZk0>p8*H-H2;gRU}D*ITiZkL0I-mlEsUE5k1q%9Hv=Vt}?ww zk&;=iUl&gEr1`anX@+k_rzv(+5A%f1D4PyhCWXMo(5ICPR2-T3g^m(E<#JrO{J>;W zT9#BypVaU+aal}V+$1Li=A+?R55juihv6?1o{ptVAIUl&p99$H;SM@=)gg>l;3`2E z4i_Qh6?vuXc!>S=dOw<6mI|Yc2uB^%R>@g!+n5ssruW5HFb=c9Skx(McCwJE;uz?7 zygC@ZxO({nN+v9bf$eRCd`@>F+Qntg0D^VVrLXpwtn%9ON)xHxsAvo{_gTP$TOxg> zv_mVYH@>qb4>B=%ogDC6n_FLRpZ<CKuf8czES&>i_h!%)y105a=G<H?>D=^v7jreX zJ>$`Q1c&S2nX%fZ(=M-s8EZ9Gl%{?U1y#)J;|XV^<nDf}^P4gVADS1s+2RI<g0&kD zS?hBc`iq7J_@QQ4TCp+h{HZgsT!jg2!Z(JHjs-U18|7?%<Hs?Mv?`4jmOd?tsu9OE ztv(?sEGP<5CmLQ({D|%mu%DprLH{_<4N1lIJ+{<@&bW?%ALFFIS|C<>t)P>_O1W&! z^GidO<uIxxU2p}~3a}&y;3OJp7p&VlXHuyv&QGe1xe-8s0o2TCD4LBuq8oveldL3I zMqU0nB$f*S*Hxvg2tSaRP^^Q;vZavVdiFSQSSalVL@DAX=&hZ0<{>_8!{Q^h@tK-} zjx>c1IvJn8u@R58o|Fl6^^x#;MLU-$v7)1Vq~Z4!-Q^O_3k+if@YZ(*HNDz)N9mr^ zV(QJ(woOA@!_MrLQxCa7(Qpe+zK3!Or%1RKJ5McF8U{ZVW1^exqqQnj*O#Pwj0Abu z$)*^h+eWJ8#@052pR6veMM+bK*_P1KWvWop_B&0REf}ffv=IhCwlDuan~ZTHSeCus zi*pzG`|1)4J44DD!KFKy1D}ZqCm7GSu(NuJH`4ci?)<5DIr^}JzcTso?ZJl{DPs)| z2akI5UVM5zZ@9usqF|;>;23EDh)Rrj00IM+Yf-AwpH{9ZNU!Mx{>&5WGg9GxM{s%g zunf2FC`;Et6F3+Q_Ev$=Ss~^IrSm6!)23nOShwM0BPkvkZ^eu(?S<=^90kIY1Z-vQ z5NFPuKy{J*x_UW~Ea1K?4WdFxD=e8j(Bjp#xxfcmkFhR40*>7rf4AtE+Ul7`o66-l zpgcAXsVnm-$h5;{uzi^>9<o~@uorO8#A=F+^)jk&b!<UAYl@o&1QeaQBmEo&D8W&E zuM#IzT_&g6u-!sF1HHClrff^J1j}oW{jZLZM9n2e3*zXxpqdZqe?%e<o|`g(v5Nvp z<9nc##H(&}<5%t(FO-TqAD2m9Se!(YyCboHn41-%S|WGuEEo*?^eNby$69UKhh?p= zymDKAy8dtvXpa)~{l0Q(2QH`Fe#}S1qRlw(#_1{dO?>M65&*RAQK%91D}I>tE`Cw# z<Bb&3EyoCMWpzf+(!n>s^GvlcH~}TF+8OLr4CJeuubgs<TNbn3j?D%<g$;9SZ+CZl zOVYolcbs@qq-j5knwD=ry7MESRlyQqCS?)#g>6_qS#@(LQpDQ}18Fhql|to7Oewjj zmXn^IMAchE5<<BU)*Gtm0e#cC5M$iXt{k`cgPC^P()6n%db{u+9gXyKP0x5mQ~wIK z?h7~~ol+MREI7y}SUgCr;j}Y?15@2+=(-t=5m_M~6{>ACWE1q?F73`65AttVcH|E8 z4z4ENKv@?5+u#1iKlWzE$DI$>@b3p7$bz!b*}S|wdGf~hTwVcy6#d|X57s)3h6qF9 z^4spPHywBAyxr)$n$It18xJ11DwFBU2ZQ13;rZke=KnP@nKLup?19G`(nk>WYUz9k z{~N^2T7LosafF!g&JmS5>QSA^S%=@*?w?8pzv-P{@$G{sCsycMbCTMcovf|CwM>0% zDlrbNXeHJ4F_r_mZg`-~?7<H3gH9L%M}qi|4B>{wQFsJ4Zmw&o<j8P<h{SoM8S&`y z9|e9N_w+)x<Dzf=fnIS-QnD}?ywnj2o^l_iXG(M<lD!5gU{-?EjraXtPWaJrmq6H5 zIes4HZ408)Po!Y20ohyCr7am+tuyj8N6WJeSNfP$Wz;N(dNvlZ8gHw8sF@4hU{eZZ z#FFHH=0+edrd_{rtGg2>A{zrUl3uaSt~^Q9RViqy25u^qW}0-lxcBiqjW`rCb+ps* zj4hOiwr9RhWsjB-HP%^YKJLObM!iEC$krGd)espBjm0k`9P(q2<?}{}6;FGCHyshh z1{jKWe%nz7HxBOlSNHs@!28kLKzfofj96}C<lDd#IWCN(O`ql5k=ED!lV^|FaaQ|z z=Zi1E{filnAo+=quJV<Zbo^ER<rp{{iG)+l)<gixr2OWmCx6%kU(QyLenZ+%hH&|~ zDWkGfz~~(2*FrhsWHijM4dZEoyHH!p+)x97!eOdM)pf7=CH@_|0~N9@3VJi3)^Hlk zV{D(7Ir)>atiWJ^hMQg@Y%`e;?|AmaQV2Dl>Lxo~7eEP1HefpTVpaPK=vwJo>6QvP zxIY>102_|CXD4GNZM$Xy#X+IV3ACq8T*j_m<NfL6KfqTsOc}ez5HU?*JaRBOc^1`A z5zb^^yr8gmh<0QO0`|m*=`9AIuR6xm9t`>1{|Kz@cz+@4I&T+s&dmc7z0KYM10H1n zaih)JZ~ese^bFhqMA8F^QS7f1gp1HD#svFzIL$cJXa)T2my?C0x!0j{+6~P*H}1Aq zV`umwiZ&T|^ik1sO*Pgg)@VBH_>`ZdJ~w<+v4C!vt2~R%%YYjVg&|i^`mZksAjD~7 z!)zG-1)sW>?pvA1dk0(Fr<(@{n}5w*Tn_dM)p{&)7vCrw1H6aG<9*!itRjV;D<<Dx zT_TqeR;zS~9Z3E)TI!U;sqM6pA~9Wc-+aPNIfycq!usT(`2gXnhweub&dcIL;IIP) zFY#q>W`-H}5P#D~!>{nomZfBSU7T2smHqsOJ;^ahAcr?f-e?N}IJTJijR0~Y71D-W z^nS<|1su=RC*X@EDL?|YPG+dQh{dwplyuV-B0f0b@<+I!+XBs$Uvi1JP@4Pe&kG|U zvQK+NPPmy24>XErU3jWED;wpQm+U;K8OiD#MbA@gOl7ctq%E;0oVa26>HMN{HgZL? zZUB_G7p1LlY#i=Aqwv|<d-{0itI$9=Q<tr1q2KjZv5<=xHHPi3N-n>2K?!g&k+(9x zxCFvoaNIpn-RHC8k8q!M=i`s?!InYaNRA1-`dCC9;zguD<Mk)@I`m8#LE6C7!BoDu zyx;lPj{rSK#M2$<U`|=lPe1zozx`WY^cr-2vcJaw%l+NWBgp+H)IbAr#k0N9K!2VE z8-<$Et=4E9JbQYy^JF_zzm61)I1hqP+q`vQcXmEuZZ#1^&^Bw1*T6;<&+1JD7u`^P zcEHNUPZld<T~{L7%vX_Xlgg+J_W8J8NM|0(e6pxafoo9Zcl9dIp8omi-nUOt==WME z7U`yGCtY+SnRa!7UY)De^4oJ@LO(<1-E?XXI-z@6?!xwQC<%vldoPCPk&Q7Ex3lj@ zaxTe)obhs`G;`SdNOB-<NzV^9u&@YcA5$S#r^vT}Q2k7GZ35E4ufs9TPDjwSRRUAs zk7ZETow~Pv`RbB}bGLxzT6aS>tX_@38&AG>nt62yzHxgl82~pE-+HP!J3w)nTL$$| zjxf}R79RR3v>&&Uh&*X1Zk-3ZtVHr0RtZpDj`suOd!0(fU)y>l0OIQCjAXsmWol9F zsFtII;*2fO`YJX;4wZE*_6n8@{YS`vYVY;oMrU=^%U?1{u7%95E_sSz_7o=atw|3@ zI{L#+TyyhsEadZPb(W4y=i%pADu4gcN6L`pA#$zlyBO##Y^<g|bx80~p~Zz}Q_+zi zV}@%rc_7~MEpvX{ZCg(#W2BmbcOKrEEuL<)gEH5n=BHF@+EDW;&e6RdJ{!Y^L0hpN z%DLsX218tbgp-;>q+a}QSICw&@ME}n1_zr9GrYkNF70RAw#mbc;6k=?i?!#I8({>M zZxQ9&VkBd-H+?etVK}%E9=}_Rhnr8k@K!PZ&~!8y!ma{a*$`tg`xY6tzoD~lFzVl^ z`IZcL#M=;<?i6T%3GcG0t#fSPAvF*(F`n;X*Z)2m-5tK{_2J7!tJ5oHD!*<IKkF=I zayOK)gI?e;&H#Tcj^w(HK@hiZ&G8Ba$G7Ajh^!kl_^%&*(vDM~jp07p>dofYZR8px zWG=SB=Je&&1#NcMZKw_TH1j2CCgH1(C(|8<Bp_P<@zuD`J5=tlS@CJV*LEFme*J1+ z^7tQK4*R3C(eT>ypbc$Dv+aw^`5V>Y(AUvG@&SUzSXPHS<0mf;uU^dNqd6{dKn(7* z2WQl^5xE98;dBkeIHS#Q!^U}Ux`l816X<_PE^#Zkh~l(l`i!8U;i8UFKPJoc<t<^* zf*M5N{9K3Q*4k~y4l=dQ5bfi{{tm(+c#q8ao5wsLbKMEf-Y!|+9m5NJ*X+%vbjz0L z{@cSjjCU0KEnC|jUtQd3clNKQn5xu4;M032y|iVIu%w{D*>F6=3AWdsRk##fyQ3|p z1J3VoCQ|eqAc5lGPQ^YNJHkpPTE1>$Zm#CHB<EvpkX6^hxhyKx*QTOO?v~AMPN%&$ z&&HR%{&&znsJ5z{`}6S4owTd#_ukkJ{XmS1#bA33F@G}!=o%Uq1Ixxk*VeWB_Zha? zOST1<)5+ip5p3Tggb>}q(kX%ri}!2n;PhV5Yq#4*SciR)U2yr1;%v#PIGaxou@oSY z0wdv7ZxB|x?vfyVTh^FaN*;}7{~=1=>)}&)U7_;f-#ckAI+SFa?%9*x%TfPb25`xQ zlmH+v%#^NN_&FuPwKpPe3vmjwB~4HlFR)-7O>{EO_Qtyt#E5LckB>bpT)a0Ta?363 zmWes6A=p{=Z#qd@^wsGWbXto(#n}Jr8@@hWCInnNUVTAAvuSU1!wpf($)TnwS)O*r z$zJ_t@@9#kbA3c+OPCS+bLrr_Oplh_;%qIObF3RLuo1b-0W?vXQ1kH+R>iw))aj$r z>J1nFmOSH{+8j^DZ!RWRvv+B;CBr;L^!zmFQahAvlkc72yAfeq_I4jf5`3cIP1#k| znnSn>GWsF46Y}kRb^7e-lg%S!e|U7dd3gHt+3qe+LkxyzNU=Sjiw2&Wwb`_fJP6E! z@UQEitpC7M4-jYcxPL#HQng}iDqQapz=_1%2*CQ+_1~}m;N320(j7MV-Rs|<uk)nA z>)(C7{d-?xDr;>c{@_}+c+y}?4CF)ZdBk4x)pT-oSrrlyUg+og_cW?MFem)%!Kdq= zJb)eW<=S{{JXurI`*7_7x*UxZZBYMonf(en_#+7FBY5t7q)`>y1vFYJwnwwAt0@k4 z%%4qh#CRwQF=NgS;YGNBiEjRC?{YZ)65AbI{j-2`z8s!0@gG76I-jn8bRV2F9K%yN zXTqq?*0Y1%z5Sz8{6Wkk^GITeol(v2;8Dk4!iX~`otZQY213%R&RK7C&Il9OCda4D z@D3!%hd4en@N|v_>m~5LdVyRr7d*Ve|H-2dUYt)}$PaSg?|%0HCs-cz(d`E?tLVv| z_5QDRKmOgnt?hpNhfi+;7=2#<s0R0wPXYILA9=X7@oKS}zZ$)Kb&mh%s<b?s458hd zLi)IOKD*h<u*8iP)a+mian28K{lEDhaY^eln%_)#N*Ad!(R^_h8SZMF*^<;Zi;IIX z5HacJ2#$kP?49f30-V};H5^=>53d^q0vieR(Y-V5VR#zIrRs}=B^duED)VRhFX)2l zRXZU6ACni=(B={poJ2(p<x&@4vMlJLfwYflCag-7MWYg2<13Aa>JXz7*+L=+ktIXF z%3fbYTs+NbDg1%iF1>qOnTZt?w3T=qjH^mSTu44(_V4I~AS0C*q7(P?T^W?;4c!@l z!&jCN@ax_s<f>m^G*Yv04gnfde}1z48b%>(kuFd8kGGPxuEn)X{T4K?E~y6bHtb#C z^l5LvWkP?pZPO}$I~~odmBok1w~EM_`B6G&{c~&rvxf-s)~S{~pAM0JHa{NWQ;d@4 z9xm#mL#N<?)4oM_XTT8scZP*GJ3gVppdw2Ysg&j1c?qn6yeU*?QOvv)BFPAr>z`wg z%asvG(yJWOV5HIHYJMnjD+S@hwmGO^r!A<O^g2@3o!H+L6O}zHms+Nb%NLbFP9Zs( zKy8hW8GtH!&=8Jf3DIhX)y)TcS99O=^3w2=Wu@W75rbw|5^C@y;(uT#&JB2ck)01j zo{XXQg)A%DqKDzR7E$N!7Q=g0NaD2f=om>9;uq;`ER&0)IZY^*hx5eY(8`Pweon@_ zpE4PfMNSajD$E0ko-j&foiG-r%ul#ES`!GA?*q3+FVjX?EPbM+X^M9!r#SuNiC!MK z6&)#0)vVH@kwR4&np#~wCN%tEgiIeygX1WRnRR)EI4~P<f<c*d?6L)0wqsq_m5w2O z-*=8r1efd);JS7M{#$KD7UPS{LzxyJsL8B28=S<0<GCwS&4(sNaY@ctTadb|kD>o# zyD72j+(__*tDK?dF-y>80Ftb`h%=774yN*e;DF98#Z$`MEuO>aw2G%CnWUr<9(A-+ z_SC+(GTI$Rii5uR(I{im5`g6JNOd(YiC-6!Xp;^1jKLJ^{yqM<^EplkYfKy{4{Yyu zK1rVeA(sX+LfcSUd#KE4AUI>AutR&QlZs@B1z`lt*i}oQJw|5pH9rQ!w+9pMDrXUL zQu}oncX!yly2o8)*Cvr;_AK7kAogjZJwKv2j9FdU)JX|^R<jUWRSq0Ym10qcrLsOn z<$`*!ux55#%Al9d6R#M8>!7I?3j`w$VaD)R18I=BfHa;iMY>tDi8RZ!KpMpsA#GzA zh8AZ5wAUHxs@yFkY@<lp4VQgWspeK~&s_<ln4He!r^-i}&s>c_$I6Kr-DHG*hk=S_ z5V9UeylF24Zq)VoF@}w^TEQyFSUJ>H%&&M$Q&&uRKL?_#WH+O^%G^}S`n`B6MO2}Z zRv}4?B_rx~gJ7fa+QaX$DZs2}$D*Pch3qFq)Y`+|V4yQUDg^E_9XA#&uIITBiDZ_F zPkRu?mQ&BI#B#@JI3#682B#tu70O<}YwP-){UXwF50R+UlAnLj0ivBA17<tFUjO(E z203g#2Dp~x2=@hD^u$C9qwP6vT0s#p(2@ga)mS$`Y>-gQmKU9$BAW$5_)P!oOEyh1 zr33-J8jn}ck{xq(G)`obU)VT!F+Z9eT#Yr5Fqb9uIYetEvI1y0J8moR&@M;3tw?e; z;9CxGg|9K`xJitcg1~F-IJu6P^^UyCqsrEKg`cb6FR=TBziq5RFSydCxLX!sc)wHG zDKQJPW88eoVszIYauwxtNmfyt@5xr?tzU?Rot4!q1IZFXDMC12#fA`3J2)fEQw6Ko zjv;aRYEFCB$?3*tf%g1miUZ`FQ8HH~qC#EEy=D!@x{KprDXm?R-6N<KrY%<)CD4$X zNJ61_1HhM##_uQ`G?8jFB@#r*HKO(W?C9JyaYnGI(tPrcCac3q|GVM*<fwmnh@4uD zbQi+Jr{4|VoI)o=L_lVc@vrk2r8F7d>JyuS_f;0}^Rj529r0RAV~9sh=Z-VGI)eoh zei3bQp|@5DUj7a#YvW<Vc3~1NNrdfTxE*1)Zaq+vZK*lT5HKu#9wBGja8NM$qH1ZM zvPB>^9e676oDqAR?nWb!6-$BE;+)rS(G+znZUlto5=6ClS;oR*XC(HCix{^)7hfMI zb#<wh?(49Ve6n_Vo-&rhrBEIiv{psdk6c4HZlM5qb-=LZ^=;$H92;iD4a({rT6B5# zh+dGQDq|bS;BsM)YLZ?vUzKoOB39Nq(V`0o_A~7Ur>u3#IBA*DFegxg6NlBRFB(wf z;P_vmfYkA;w0#@nmoHy|=+-l;Mh>%x-l-N~(!uXK;!4g|6vnF39Y?CLP)3~IY?>_M zs;oU!4KB>GD;~3O`zjlQAre*vEaJ75loT1-sBupefX0;zOUb6QzMz+_P|&?VoM-4} zVdhKcT*<{M7kj>Gr@RX4t5+-iM4uHpN$oO_Cf9RXu>w(6?zx?nmU13J)Vc%~tVUbN z$Y_@Pr;iv*cJc^&37<l$RSk(jb*pfphFpDhqKUB%U_zc;C^}9H@Tof8mjh80D}}Ie zr*SA&BV4@`@g%`zTPPFqj3K9%q#V;!>M5j0LwL?04*PFT4sbsd&V}Jr>kzkWx#aB* zXPeA!`}Xzl9LKB_R)GTQ8o8OL4J}=aW<!k28MM)%xuvR&xZ?J=wQo&Ts<7+0W<|f$ zS7~tg=Hd*IS)e`=Dvhzy;@fyOL5{PXG0flkZ`P_;wiT+Ej5-T(`(yF>B|Ti^kF5NZ z(OL~Bpu(D68B_W?C2i2+q%!C@?A*iV^3@O?q3O%)CGNtZcQAWeNU1YKlGZokNW7Z$ zcq2g418m=C!&AhzWY4{Rnv}+BA?`@rs%c6t>;sml2a!3a`+EmRnM2Z6Y&VrEdhMu| z#tkpz;F`=loUBB4g5A-@DEQdCib?gj3Py8TO~1T41G69E0wG<CoIy@|@o4+;=Cj?S zQ|1@hdv=5+;9ovMn2r|BHSq;r%}dou%o0+rj%h?srl|Uq%{6tL1q{~(3NiZ4eR-Kw z-iemtb)VFN2~NdwpiD(&u0iKQS$n65vv;;eH5y~>#=}On6mis%^f&2KxV<DPNH&Ox zCKQjMS}tuFW5$DyZAvs9?+Wt&$wdQOrVw~O(~90l);-5o@H1i0hxa?l57n)XpBvzN z26-}Oz?@Eq(d=t1T(|(ygEws&{6Xow;{wh;a}!9{u*FG=dswR8z~HnCgQSPxJgUw8 zhl@bMZpdPhf)DWmQ~gk`y1n1|!l(tsE+Y=!IYknq!bFLX!AR`Jjz;g`hRU8mj%aL_ zJ{O4{VLYM)2LQMI<UXuGJgTfY!SbDeMFXi+Hi_N!9hO|W8fz2TN}54N<X1-|&A;1> z9E#X?Ho3qdPy{Y)^G0J-)~lYP5?Fe14>;bqw8S!7&PL~$%Q$8I>QV(?UI0v4eRn<~ zx!%NA1vMHtM_4Y7GH96`_|^DAvO)}YQA&$609+1x-#w9~<r!C%#(PYtNN(pXq;Ey4 zqligbp@5~awQFfI@*u!awJBU<kb}m0HIO)auW}U%i7j_H5KePyU9`9WW^<q-l`U`7 zn@OB5mCsfRIn}b9oR?1ehw6QGwcU<F%6L-+{j**h>aKqL$-gp&bp7Lvk9db}**$6^ zl8XrXl%@yFw$dzv`C#T0xL(uCug&}EFuvdUjl|XQZ#tOGCo;TzyoBm3qSJxj8dHD| zW47n-606Jen7#R+#L|48uo)l3tR)po?8FxcQ}-%7Zc_ZsN<JgpJ~}htMw?lRB*{bC z`3>$6Ovz|-0_N?;?pD|$EiEaUIlKu+cUKP~e|U8k=r%l;AbYrNL=xf(?xEUwph!Z+ z6jKkAKhZIgR{?_^<K_`{@9VvbL4*+<eo7tq?Qhd^!G0k%95<~!ghhRF{(30BtaPP= zmsUh1c)Y+88AntYVkHrGfK+COtOqEUu}4-Q8Y3h&N>~RAl2U7Nm9nt%bu%7YK7st6 z133mW0bTUB$tXBu2ps`Xgv~pYI47{0+hbuc24s>r?x6|?l?WBKN6<Z@>-)2f!AJx7 z56_3MCs=0?vILGh#HqGHZ#r0)6VW(mJDjZ_P-J4uJbZ>ZD9?EsLlq?=j*s|b?3C=Y z`Prv_Jp*U);7ND&-w*emp6)#TW^;Gv(do0J$Df|=eD!qiU>n||FFGf+w-~-?F=9&| z|KXTXpeYun!J3GDq#89d?>Yj(go)HFP=)^R@h4y_I<Xp9<GGr18~Sjhkw~XO6IxQN zIkS?a&6S(T0a;6neRksdme?03^1<nX05CRGDuYgJDeuI6o_p=Mt(_E|cC410@c4|M zRD$qHWElfRtf^ovTQ%D=i@J|9OtO4pLgykVY8|vmZqH(KdqzCMa&XojW}ejog;GJt z+KrW<dVQ?4RX{W|O-Ga{AWI<Epej}gkVgdy3?FcPa<yvqBGACacKCs2u-B^XMIcV( zrmmS@!3AKkg_pR+j>-7DSFYR+L*>=xV1PwqmgrOI8>;G}&d7*b`B=B|kg=G4hBHY2 z@`peC?hlAr(^~sj-V4y>vD}rbb`z&F8GOA{+1WxOdf^gQZuCT*2VuQAsOxP}cIl-P zrs)b#4I_QhR;{Yc%?w&agV4oS2>1llhNj=eHPTonE-tQ+bp}czw1p%N#Iy{Iw=5M- zyWZHq2{>pXL+IwnZl`d0BeksV(ty0#l*AQG@^ruR3w;SY1=LZj1GomLxp}pj+K6+B zNKfv{x+}!XwUcG*D~7FbH*-mXc&mSyFF%E^j75cH0l1I;2*f&{l}@wZ#czL`oBG>} zj2BS0zY9&u1WOk!+Z*h7CmrxnEBeNUyL>#JEkZ>L_0)8FvJF~YTcaY3@iu=aQXhv2 z1YTKNi-a)-ywPqZpk=`@OMy?+Y#MT8Eby;#8Wr#q<_02wx&|dOPi|VPk=kG3mr?UY z##y!6?6_Jt)+T3JtY@uG-eO`N$=Xd<LPu5%;=*lS*XD~l7C6%LZ*lf^h`dp9{-e7R zTYOe|E_cX46~fQ$I#6(=j&TDDiM@uin%hzQN!Bd0hi2Vyh`Vs#AQ)xsamOE^DMP2# zRk<k(WkY7$g#Qk<j_eMXTavwDX}jq<KwwJ0Fy-;AYEYBoCT|m&A#BSDB&%3%1>swM zyie1jrF8#>U@f{asrpLo(zIo5xt><x%e0lR;WCO)KNW7Qn$8G5$x%sHP(#T*q?d9r zYOZ92Ube`oW(?tO=C1(rCg?UcyoPc9d=V{EJ7S5X4QMw(HMYzcmeHdsf>D`S3AgBd zCO66ho*4ihUzb-)1|{oG`YH@;X5S%R{8TY1b+ZP$%}B_4S)9cSmq@{}SgjjPK?sNx zw?I+6;$%EFwLVwp34hUq1lKt+Lb>37R#{~z@?EGGO1B|U5CXNXh-9j~tm2cFk3>R^ zV%Nh}X`2|Jj1l?f5#!NooR?G*f^Ef-38^p@NNrH_&NGgz`y{t%=_oc<jP&+4-Nj*- z#SxEf^o4rix;EEd7)zy3Y_1K$5!XBx8mQ7M268NT$xVtmf<G6LX#Q$=G;Tz#qPej| zwqlc2`W3-uge*dAL(zQ16H{&pcRH=SYpaHHw2|U4XLS}DV#tcH>|y77Wl;o<Io;o; z*yEej2%V89LEt82DOt2j)Ol9$?X@IQx$51}s??o~WF>UkQ0|uGn4NhtITHtTH81dr z%}9<(a=uP%{iTshnrJy>S)IEXs|52fNNPGnEEVhmnKRLLcD&G))~P%quClJlB<eH4 zIySj-73=Zp967E_7G6hXi>6qSYGL7H%kDDzf?mnmKS93{r6l(A70NazyC`J&zHPZK zme+70uc?yN8UuF|Zte%dt+4qn@cF&Yk3V8}n0bs!C26Ztgf4>fe-!}UHWwriu^mi| zW&viKx$O5@s(z_M?zbME+l57MOUxnzRw&D)VP?W8yp=GtYR8xOy1~H(Q=;SA)NZ0q ziGoSd6)&@3pRsagwwDu<MMpAWl$y(33k{|zFd||7Lwgu7r6VhRd=%54@(z(tIIAVu z6QJF6e}jvg;z%AEX!7Y&wn`Nk2Us+z2{BkPxCnQq&C76Vgi4hGbM%f^Y1qTUg6O#{ zB(z&|={FfGqeGpI1#5S7{vVP3nh4TiUnOT^$<!J79;S$nlt>zLzkuSa7Ax+L?)IlW zMsRdq;07FUE7K~P_@SbTFgyh64<yx|!b6lIB4`UHY0?DyGaurMYzHz4z_CqC8i$QI z{rL%+P0IYT%T6BEs7)xu<rgV3N!{EhbsY=|pP$8QJWDiZ0H5-6n?jTDYJ!vR%2;HJ zpKSD-F+lEo*DurK-eOJJz+o@`e=_F(zbp<j!-OT$yt`_0L%D};z@0HOt$^d+ARUs4 z6=g0|V!X#X>M~s;;)>kaO!XG7ttqfI0oK{t-9gSqp6Nx_698@%hjhmLg_UI}qfOD> zN6PYZn<H5p#pVcR7%myT)xzj?x|FYA;=!=<>j8p{e?6n4#tB_~wI!@AK^dY_pl60@ zm6o?b$Jp^-8=LgJU~?@+$8CL$Iui!KZ3#l~8A>zO+BrLK=YW(?xR9NPQ02Sfu14Bh zT;V;Kb$mUXl(@|-e&*jh*%OJbr#;-Eqer9O%P}$(oVYLBM22@|Wv4=PPuG8iTNJZ5 zqHSi+<Oad)S>b?+yYtz5{`}dK_-wQbQpX_=+^>RMv%K%Tfp6t_3HDZU?*=@wS^g_` zavJWoa4f`|2+X{>ygIryy12S%<dM`(%njf{a7OU{9nQf0;dEb_#{<>eY%(Zs(K9*G z5&ro}&l@z(h~t7VA68AB$Ai-?9Qv$B9O7PMho%HtSf)mW#g!Iy)oQ9CI6pWX9|=eI zJ&ty=rG|}ry{O&FAs8b9lrTq+uuC=ZS8J7ZYVVpr7U3q478Ou%D)D00(_s~Mv2*}t zy;_{a)tz@>oPZpZS?OP1ZGnm4pEgSl4J8O=E*)-n^HxUkt&S%bU67J?oJgXm--%9d zRkn@Tkq|GQ$Kd_eAZ$0jwKUoLK5zh0vOcMxc6`jp1=qK@SsJ(-Qya*$=_XFT1GV9f zL2FlM@ti#NI3TToZsL``{wHZiT#I-`;WW0?l><WDz;w%C0A8AjnJJ%uI6emxgRUrE z+pwK%Hr}$`YIe4gxG7ho!s;CpN9=QYY{Re>-K0twPMjQtXzHo9WGSC$kblhkQ|36P z+g<%^G(MX=+;@@mre84l&CQPK#%D+mjzV#ILDRsBFr8w)`l}8C+XlE16W28jI$QhC zL@UQXzaCJZa||h)=#P1WZXa`R6=aq#qVqM&$oo!QKTh7z9xn^uL~3<T@eS%^_$X%b zNJxG&*yJw<QQ-#IeD@BZXP3S2dGUY^lwq!D7iUe|9z^#Q|McPT|NZ~|@5{GGd;jzQ g@_)U!|9}2(Z~yoI<NrDNpZ@8e{^_ePpM3fM1N72W*#H0l diff --git a/vendor/phpstan/phpstan/phpstan.phar.asc b/vendor/phpstan/phpstan/phpstan.phar.asc deleted file mode 100644 index feb3a7d..0000000 --- a/vendor/phpstan/phpstan/phpstan.phar.asc +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN PGP SIGNATURE----- - -iQIzBAABCgAdFiEEynwsejDI6OEnSoR2UcZzBf/C5cAFAmjbrdcACgkQUcZzBf/C -5cBmcw/+J21bMCgV9QQ/7eEWS7pqEILpHBXHSPVTP2KR6jAcHmttxHTmnDJG0XUm -5ZZUAnHovcC3BdhnOyFRWgj49ScNje9KuDfAlDK8dv4TgZ9oChgrNubPOlGKb4Ku -qCvnGwckADVjTMGvhj8yF95vdFWficBKaNE+DnQcIoP2LQloFPqA5ScE0yJ1XOCR -RpkRO6Yfv9pNmFBW2tPd5PqBhMpktS4tnbPTS7UOdnWCHR9h5muoa7MYrzN16Lw/ -5G+UZcpnok9/huWXhn01w75rAeAP5Bh4R9U/u1+JFQsEkNaPDL3unmb8MtPLExyU -BPXSaXkPf6xq3c+mgMBv4knvjV2VNAmbebt3SXG8HUpDc6AcaqjS7G7paIzchP0g -Y15nkdmikUHpLpYH8rOKsFRRroj4RIVOdEVqKsrUnBXh/XHu4PGpiQCKGD+Fmkhm -Q7XCxCMBSsCyPI/TSr4MUHPY5xnpMUszxhU8OPj7yQIQWr4GTEFEQo/dx6QGTRI5 -UVRxUogAqYDq89HvKGM4DAa3od/OcxXC7fi+xPjm2zliSkDfqHX3V9HOjAJ7Pe9O -1eDdg5NsGVq5auzHTQYn9tOfnvmRuV7DsSNs32Z4rhTtW2PqKyVtBPH/QaSCfUMH -yqsb1tVLR7iLsIqJAHw7FZLV69x3xfmoC1OAkBs6xz2wUuz4pUc= -=QzVL ------END PGP SIGNATURE----- diff --git a/vendor/phpunit/php-code-coverage/ChangeLog-10.1.md b/vendor/phpunit/php-code-coverage/ChangeLog-10.1.md deleted file mode 100644 index 27cb92f..0000000 --- a/vendor/phpunit/php-code-coverage/ChangeLog-10.1.md +++ /dev/null @@ -1,132 +0,0 @@ -# ChangeLog - -All notable changes are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. - -## [10.1.16] - 2024-08-22 - -### Changed - -* Updated dependencies (so that users that install using Composer's `--prefer-lowest` CLI option also get recent versions) - -## [10.1.15] - 2024-06-29 - -### Fixed - -* [#967](https://github.com/sebastianbergmann/php-code-coverage/issues/967): Identification of executable lines for `match` expressions does not work correctly - -## [10.1.14] - 2024-03-12 - -### Fixed - -* [#1033](https://github.com/sebastianbergmann/php-code-coverage/issues/1033): `@codeCoverageIgnore` annotation does not work on `enum` - -## [10.1.13] - 2024-03-09 - -### Changed - -* [#1032](https://github.com/sebastianbergmann/php-code-coverage/pull/1032): Pad lines in code coverage report only when colors are shown - -## [10.1.12] - 2024-03-02 - -### Changed - -* Do not use implicitly nullable parameters - -## [10.1.11] - 2023-12-21 - -### Changed - -* This component is now compatible with `nikic/php-parser` 5.0 - -## [10.1.10] - 2023-12-11 - -### Fixed - -* [#1023](https://github.com/sebastianbergmann/php-code-coverage/issues/1023): Branch Coverage and Path Coverage are not correctly reported for traits - -## [10.1.9] - 2023-11-23 - -### Fixed - -* [#1020](https://github.com/sebastianbergmann/php-code-coverage/issues/1020): Single line method is ignored - -## [10.1.8] - 2023-11-15 - -### Fixed - -* [#1018](https://github.com/sebastianbergmann/php-code-coverage/issues/1018): Interface methods are not ignored when their signature is split over multiple lines - -## [10.1.7] - 2023-10-04 - -### Fixed - -* [#1014](https://github.com/sebastianbergmann/php-code-coverage/issues/1014): Incorrect statement count in coverage report for constructor property promotion - -## [10.1.6] - 2023-09-19 - -### Fixed - -* [#1012](https://github.com/sebastianbergmann/php-code-coverage/issues/1012): Cobertura report pulls functions from report scope, not the individual element - -## [10.1.5] - 2023-09-12 - -### Changed - -* [#1011](https://github.com/sebastianbergmann/php-code-coverage/pull/1011): Avoid serialization of cache data in PHP report - -## [10.1.4] - 2023-08-31 - -### Fixed - -* Exceptions of type `SebastianBergmann\Template\Exception` are now properly handled - -## [10.1.3] - 2023-07-26 - -### Changed - -* The result of `CodeCoverage::getReport()` is now cached - -### Fixed - -* Static analysis cache keys do not include configuration settings that affect source code parsing -* The Clover, Cobertura, Crap4j, and PHP report writers no longer create a `php:` directory when they should write to `php://stdout`, for instance - -## [10.1.2] - 2023-05-22 - -### Fixed - -* [#998](https://github.com/sebastianbergmann/php-code-coverage/pull/998): Group Use Declarations are not handled properly - -## [10.1.1] - 2023-04-17 - -### Fixed - -* [#994](https://github.com/sebastianbergmann/php-code-coverage/issues/994): Argument `$linesToBeIgnored` of `CodeCoverage::stop()` has no effect for files that are not executed at all - -## [10.1.0] - 2023-04-13 - -### Added - -* [#982](https://github.com/sebastianbergmann/php-code-coverage/issues/982): Add option to ignore lines from code coverage - -### Deprecated - -* The `SebastianBergmann\CodeCoverage\Filter::includeDirectory()`, `SebastianBergmann\CodeCoverage\Filter::excludeDirectory()`, and `SebastianBergmann\CodeCoverage\Filter::excludeFile()` methods are now deprecated - -[10.1.16]: https://github.com/sebastianbergmann/php-code-coverage/compare/10.1.15...10.1.16 -[10.1.15]: https://github.com/sebastianbergmann/php-code-coverage/compare/10.1.14...10.1.15 -[10.1.14]: https://github.com/sebastianbergmann/php-code-coverage/compare/10.1.13...10.1.14 -[10.1.13]: https://github.com/sebastianbergmann/php-code-coverage/compare/10.1.12...10.1.13 -[10.1.12]: https://github.com/sebastianbergmann/php-code-coverage/compare/10.1.11...10.1.12 -[10.1.11]: https://github.com/sebastianbergmann/php-code-coverage/compare/10.1.10...10.1.11 -[10.1.10]: https://github.com/sebastianbergmann/php-code-coverage/compare/10.1.9...10.1.10 -[10.1.9]: https://github.com/sebastianbergmann/php-code-coverage/compare/10.1.8...10.1.9 -[10.1.8]: https://github.com/sebastianbergmann/php-code-coverage/compare/10.1.7...10.1.8 -[10.1.7]: https://github.com/sebastianbergmann/php-code-coverage/compare/10.1.6...10.1.7 -[10.1.6]: https://github.com/sebastianbergmann/php-code-coverage/compare/10.1.5...10.1.6 -[10.1.5]: https://github.com/sebastianbergmann/php-code-coverage/compare/10.1.4...10.1.5 -[10.1.4]: https://github.com/sebastianbergmann/php-code-coverage/compare/10.1.3...10.1.4 -[10.1.3]: https://github.com/sebastianbergmann/php-code-coverage/compare/10.1.2...10.1.3 -[10.1.2]: https://github.com/sebastianbergmann/php-code-coverage/compare/10.1.1...10.1.2 -[10.1.1]: https://github.com/sebastianbergmann/php-code-coverage/compare/10.1.0...10.1.1 -[10.1.0]: https://github.com/sebastianbergmann/php-code-coverage/compare/10.0.2...10.1.0 diff --git a/vendor/phpunit/php-code-coverage/LICENSE b/vendor/phpunit/php-code-coverage/LICENSE deleted file mode 100644 index 89f0530..0000000 --- a/vendor/phpunit/php-code-coverage/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2009-2024, Sebastian Bergmann -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/phpunit/php-code-coverage/README.md b/vendor/phpunit/php-code-coverage/README.md deleted file mode 100644 index 26807a8..0000000 --- a/vendor/phpunit/php-code-coverage/README.md +++ /dev/null @@ -1,55 +0,0 @@ -# phpunit/php-code-coverage - -[![Latest Stable Version](https://poser.pugx.org/phpunit/php-code-coverage/v/stable.png)](https://packagist.org/packages/phpunit/php-code-coverage) -[![CI Status](https://github.com/sebastianbergmann/php-code-coverage/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/php-code-coverage/actions) -[![Type Coverage](https://shepherd.dev/github/sebastianbergmann/php-code-coverage/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/php-code-coverage) -[![codecov](https://codecov.io/gh/sebastianbergmann/php-code-coverage/branch/main/graph/badge.svg)](https://codecov.io/gh/sebastianbergmann/php-code-coverage) - -Provides collection, processing, and rendering functionality for PHP code coverage information. - -## Installation - -You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - -``` -composer require phpunit/php-code-coverage -``` - -If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - -``` -composer require --dev phpunit/php-code-coverage -``` - -## Usage - -```php -<?php declare(strict_types=1); -use SebastianBergmann\CodeCoverage\Filter; -use SebastianBergmann\CodeCoverage\Driver\Selector; -use SebastianBergmann\CodeCoverage\CodeCoverage; -use SebastianBergmann\CodeCoverage\Report\Html\Facade as HtmlReport; - -$filter = new Filter; - -$filter->includeFiles( - [ - '/path/to/file.php', - '/path/to/another_file.php', - ] -); - -$coverage = new CodeCoverage( - (new Selector)->forLineCoverage($filter), - $filter -); - -$coverage->start('<name of test>'); - -// ... - -$coverage->stop(); - - -(new HtmlReport)->process($coverage, '/tmp/code-coverage-report'); -``` diff --git a/vendor/phpunit/php-code-coverage/SECURITY.md b/vendor/phpunit/php-code-coverage/SECURITY.md deleted file mode 100644 index d88ff00..0000000 --- a/vendor/phpunit/php-code-coverage/SECURITY.md +++ /dev/null @@ -1,30 +0,0 @@ -# Security Policy - -If you believe you have found a security vulnerability in the library that is developed in this repository, please report it to us through coordinated disclosure. - -**Please do not report security vulnerabilities through public GitHub issues, discussions, or pull requests.** - -Instead, please email `sebastian@phpunit.de`. - -Please include as much of the information listed below as you can to help us better understand and resolve the issue: - -* The type of issue -* Full paths of source file(s) related to the manifestation of the issue -* The location of the affected source code (tag/branch/commit or direct URL) -* Any special configuration required to reproduce the issue -* Step-by-step instructions to reproduce the issue -* Proof-of-concept or exploit code (if possible) -* Impact of the issue, including how an attacker might exploit the issue - -This information will help us triage your report more quickly. - -## Web Context - -The library that is developed in this repository was either extracted from [PHPUnit](https://github.com/sebastianbergmann/phpunit) or developed specifically as a dependency for PHPUnit. - -The library is developed with a focus on development environments and the command-line. No specific testing or hardening with regard to using the library in an HTTP or web context or with untrusted input data is performed. The library might also contain functionality that intentionally exposes internal application data for debugging purposes. - -If the library is used in a web application, the application developer is responsible for filtering inputs or escaping outputs as necessary and for verifying that the used functionality is safe for use within the intended context. - -Vulnerabilities specific to the use outside a development context will be fixed as applicable, provided that the fix does not have an averse effect on the primary use case for development purposes. - diff --git a/vendor/phpunit/php-code-coverage/composer.json b/vendor/phpunit/php-code-coverage/composer.json deleted file mode 100644 index 855b369..0000000 --- a/vendor/phpunit/php-code-coverage/composer.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "name": "phpunit/php-code-coverage", - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "type": "library", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy" - }, - "config": { - "platform": { - "php": "8.1.0" - }, - "optimize-autoloader": true, - "sort-packages": true - }, - "prefer-stable": true, - "require": { - "php": ">=8.1", - "ext-dom": "*", - "ext-libxml": "*", - "ext-xmlwriter": "*", - "nikic/php-parser": "^4.19.1 || ^5.1.0", - "phpunit/php-file-iterator": "^4.1.0", - "phpunit/php-text-template": "^3.0.1", - "sebastian/code-unit-reverse-lookup": "^3.0.0", - "sebastian/complexity": "^3.2.0", - "sebastian/environment": "^6.1.0", - "sebastian/lines-of-code": "^2.0.2", - "sebastian/version": "^4.0.1", - "theseer/tokenizer": "^1.2.3" - }, - "require-dev": { - "phpunit/phpunit": "^10.1" - }, - "suggest": { - "ext-pcov": "PHP extension that provides line coverage", - "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "autoload-dev": { - "files": [ - "tests/TestCase.php", - "tests/_files/BankAccountTest.php" - ] - }, - "extra": { - "branch-alias": { - "dev-main": "10.1.x-dev" - } - } -} diff --git a/vendor/phpunit/php-code-coverage/src/CodeCoverage.php b/vendor/phpunit/php-code-coverage/src/CodeCoverage.php deleted file mode 100644 index 805fd82..0000000 --- a/vendor/phpunit/php-code-coverage/src/CodeCoverage.php +++ /dev/null @@ -1,631 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage; - -use function array_diff; -use function array_diff_key; -use function array_flip; -use function array_keys; -use function array_merge; -use function array_merge_recursive; -use function array_unique; -use function count; -use function explode; -use function is_array; -use function is_file; -use function sort; -use ReflectionClass; -use SebastianBergmann\CodeCoverage\Data\ProcessedCodeCoverageData; -use SebastianBergmann\CodeCoverage\Data\RawCodeCoverageData; -use SebastianBergmann\CodeCoverage\Driver\Driver; -use SebastianBergmann\CodeCoverage\Node\Builder; -use SebastianBergmann\CodeCoverage\Node\Directory; -use SebastianBergmann\CodeCoverage\StaticAnalysis\CachingFileAnalyser; -use SebastianBergmann\CodeCoverage\StaticAnalysis\FileAnalyser; -use SebastianBergmann\CodeCoverage\StaticAnalysis\ParsingFileAnalyser; -use SebastianBergmann\CodeCoverage\Test\TestSize\TestSize; -use SebastianBergmann\CodeCoverage\Test\TestStatus\TestStatus; -use SebastianBergmann\CodeUnitReverseLookup\Wizard; - -/** - * Provides collection functionality for PHP code coverage information. - * - * @psalm-type TestType = array{ - * size: string, - * status: string, - * } - */ -final class CodeCoverage -{ - private const UNCOVERED_FILES = 'UNCOVERED_FILES'; - private readonly Driver $driver; - private readonly Filter $filter; - private readonly Wizard $wizard; - private bool $checkForUnintentionallyCoveredCode = false; - private bool $includeUncoveredFiles = true; - private bool $ignoreDeprecatedCode = false; - private ?string $currentId = null; - private ?TestSize $currentSize = null; - private ProcessedCodeCoverageData $data; - private bool $useAnnotationsForIgnoringCode = true; - - /** - * @psalm-var array<string,list<int>> - */ - private array $linesToBeIgnored = []; - - /** - * @psalm-var array<string, TestType> - */ - private array $tests = []; - - /** - * @psalm-var list<class-string> - */ - private array $parentClassesExcludedFromUnintentionallyCoveredCodeCheck = []; - private ?FileAnalyser $analyser = null; - private ?string $cacheDirectory = null; - private ?Directory $cachedReport = null; - - public function __construct(Driver $driver, Filter $filter) - { - $this->driver = $driver; - $this->filter = $filter; - $this->data = new ProcessedCodeCoverageData; - $this->wizard = new Wizard; - } - - /** - * Returns the code coverage information as a graph of node objects. - */ - public function getReport(): Directory - { - if ($this->cachedReport === null) { - $this->cachedReport = (new Builder($this->analyser()))->build($this); - } - - return $this->cachedReport; - } - - /** - * Clears collected code coverage data. - */ - public function clear(): void - { - $this->currentId = null; - $this->currentSize = null; - $this->data = new ProcessedCodeCoverageData; - $this->tests = []; - $this->cachedReport = null; - } - - /** - * @internal - */ - public function clearCache(): void - { - $this->cachedReport = null; - } - - /** - * Returns the filter object used. - */ - public function filter(): Filter - { - return $this->filter; - } - - /** - * Returns the collected code coverage data. - */ - public function getData(bool $raw = false): ProcessedCodeCoverageData - { - if (!$raw) { - if ($this->includeUncoveredFiles) { - $this->addUncoveredFilesFromFilter(); - } - } - - return $this->data; - } - - /** - * Sets the coverage data. - */ - public function setData(ProcessedCodeCoverageData $data): void - { - $this->data = $data; - } - - /** - * @psalm-return array<string, TestType> - */ - public function getTests(): array - { - return $this->tests; - } - - /** - * @psalm-param array<string, TestType> $tests - */ - public function setTests(array $tests): void - { - $this->tests = $tests; - } - - public function start(string $id, ?TestSize $size = null, bool $clear = false): void - { - if ($clear) { - $this->clear(); - } - - $this->currentId = $id; - $this->currentSize = $size; - - $this->driver->start(); - - $this->cachedReport = null; - } - - /** - * @psalm-param array<string,list<int>> $linesToBeIgnored - */ - public function stop(bool $append = true, ?TestStatus $status = null, array|false $linesToBeCovered = [], array $linesToBeUsed = [], array $linesToBeIgnored = []): RawCodeCoverageData - { - $data = $this->driver->stop(); - - $this->linesToBeIgnored = array_merge_recursive( - $this->linesToBeIgnored, - $linesToBeIgnored, - ); - - $this->append($data, null, $append, $status, $linesToBeCovered, $linesToBeUsed, $linesToBeIgnored); - - $this->currentId = null; - $this->currentSize = null; - $this->cachedReport = null; - - return $data; - } - - /** - * @psalm-param array<string,list<int>> $linesToBeIgnored - * - * @throws ReflectionException - * @throws TestIdMissingException - * @throws UnintentionallyCoveredCodeException - */ - public function append(RawCodeCoverageData $rawData, ?string $id = null, bool $append = true, ?TestStatus $status = null, array|false $linesToBeCovered = [], array $linesToBeUsed = [], array $linesToBeIgnored = []): void - { - if ($id === null) { - $id = $this->currentId; - } - - if ($id === null) { - throw new TestIdMissingException; - } - - $this->cachedReport = null; - - if ($status === null) { - $status = TestStatus::unknown(); - } - - $size = $this->currentSize; - - if ($size === null) { - $size = TestSize::unknown(); - } - - $this->applyFilter($rawData); - - $this->applyExecutableLinesFilter($rawData); - - if ($this->useAnnotationsForIgnoringCode) { - $this->applyIgnoredLinesFilter($rawData, $linesToBeIgnored); - } - - $this->data->initializeUnseenData($rawData); - - if (!$append) { - return; - } - - if ($id === self::UNCOVERED_FILES) { - return; - } - - $this->applyCoversAndUsesFilter( - $rawData, - $linesToBeCovered, - $linesToBeUsed, - $size, - ); - - if (empty($rawData->lineCoverage())) { - return; - } - - $this->tests[$id] = [ - 'size' => $size->asString(), - 'status' => $status->asString(), - ]; - - $this->data->markCodeAsExecutedByTestCase($id, $rawData); - } - - /** - * Merges the data from another instance. - */ - public function merge(self $that): void - { - $this->filter->includeFiles( - $that->filter()->files(), - ); - - $this->data->merge($that->data); - - $this->tests = array_merge($this->tests, $that->getTests()); - - $this->cachedReport = null; - } - - public function enableCheckForUnintentionallyCoveredCode(): void - { - $this->checkForUnintentionallyCoveredCode = true; - } - - public function disableCheckForUnintentionallyCoveredCode(): void - { - $this->checkForUnintentionallyCoveredCode = false; - } - - public function includeUncoveredFiles(): void - { - $this->includeUncoveredFiles = true; - } - - public function excludeUncoveredFiles(): void - { - $this->includeUncoveredFiles = false; - } - - public function enableAnnotationsForIgnoringCode(): void - { - $this->useAnnotationsForIgnoringCode = true; - } - - public function disableAnnotationsForIgnoringCode(): void - { - $this->useAnnotationsForIgnoringCode = false; - } - - public function ignoreDeprecatedCode(): void - { - $this->ignoreDeprecatedCode = true; - } - - public function doNotIgnoreDeprecatedCode(): void - { - $this->ignoreDeprecatedCode = false; - } - - /** - * @psalm-assert-if-true !null $this->cacheDirectory - */ - public function cachesStaticAnalysis(): bool - { - return $this->cacheDirectory !== null; - } - - public function cacheStaticAnalysis(string $directory): void - { - $this->cacheDirectory = $directory; - } - - public function doNotCacheStaticAnalysis(): void - { - $this->cacheDirectory = null; - } - - /** - * @throws StaticAnalysisCacheNotConfiguredException - */ - public function cacheDirectory(): string - { - if (!$this->cachesStaticAnalysis()) { - throw new StaticAnalysisCacheNotConfiguredException( - 'The static analysis cache is not configured', - ); - } - - return $this->cacheDirectory; - } - - /** - * @psalm-param class-string $className - */ - public function excludeSubclassesOfThisClassFromUnintentionallyCoveredCodeCheck(string $className): void - { - $this->parentClassesExcludedFromUnintentionallyCoveredCodeCheck[] = $className; - } - - public function enableBranchAndPathCoverage(): void - { - $this->driver->enableBranchAndPathCoverage(); - } - - public function disableBranchAndPathCoverage(): void - { - $this->driver->disableBranchAndPathCoverage(); - } - - public function collectsBranchAndPathCoverage(): bool - { - return $this->driver->collectsBranchAndPathCoverage(); - } - - public function detectsDeadCode(): bool - { - return $this->driver->detectsDeadCode(); - } - - /** - * @throws ReflectionException - * @throws UnintentionallyCoveredCodeException - */ - private function applyCoversAndUsesFilter(RawCodeCoverageData $rawData, array|false $linesToBeCovered, array $linesToBeUsed, TestSize $size): void - { - if ($linesToBeCovered === false) { - $rawData->clear(); - - return; - } - - if (empty($linesToBeCovered)) { - return; - } - - if ($this->checkForUnintentionallyCoveredCode && !$size->isMedium() && !$size->isLarge()) { - $this->performUnintentionallyCoveredCodeCheck($rawData, $linesToBeCovered, $linesToBeUsed); - } - - $rawLineData = $rawData->lineCoverage(); - $filesWithNoCoverage = array_diff_key($rawLineData, $linesToBeCovered); - - foreach (array_keys($filesWithNoCoverage) as $fileWithNoCoverage) { - $rawData->removeCoverageDataForFile($fileWithNoCoverage); - } - - if (is_array($linesToBeCovered)) { - foreach ($linesToBeCovered as $fileToBeCovered => $includedLines) { - $rawData->keepLineCoverageDataOnlyForLines($fileToBeCovered, $includedLines); - $rawData->keepFunctionCoverageDataOnlyForLines($fileToBeCovered, $includedLines); - } - } - } - - private function applyFilter(RawCodeCoverageData $data): void - { - if ($this->filter->isEmpty()) { - return; - } - - foreach (array_keys($data->lineCoverage()) as $filename) { - if ($this->filter->isExcluded($filename)) { - $data->removeCoverageDataForFile($filename); - } - } - } - - private function applyExecutableLinesFilter(RawCodeCoverageData $data): void - { - foreach (array_keys($data->lineCoverage()) as $filename) { - if (!$this->filter->isFile($filename)) { - continue; - } - - $linesToBranchMap = $this->analyser()->executableLinesIn($filename); - - $data->keepLineCoverageDataOnlyForLines( - $filename, - array_keys($linesToBranchMap), - ); - - $data->markExecutableLineByBranch( - $filename, - $linesToBranchMap, - ); - } - } - - /** - * @psalm-param array<string,list<int>> $linesToBeIgnored - */ - private function applyIgnoredLinesFilter(RawCodeCoverageData $data, array $linesToBeIgnored): void - { - foreach (array_keys($data->lineCoverage()) as $filename) { - if (!$this->filter->isFile($filename)) { - continue; - } - - if (isset($linesToBeIgnored[$filename])) { - $data->removeCoverageDataForLines( - $filename, - $linesToBeIgnored[$filename], - ); - } - - $data->removeCoverageDataForLines( - $filename, - $this->analyser()->ignoredLinesFor($filename), - ); - } - } - - /** - * @throws UnintentionallyCoveredCodeException - */ - private function addUncoveredFilesFromFilter(): void - { - $uncoveredFiles = array_diff( - $this->filter->files(), - $this->data->coveredFiles(), - ); - - foreach ($uncoveredFiles as $uncoveredFile) { - if (is_file($uncoveredFile)) { - $this->append( - RawCodeCoverageData::fromUncoveredFile( - $uncoveredFile, - $this->analyser(), - ), - self::UNCOVERED_FILES, - linesToBeIgnored: $this->linesToBeIgnored, - ); - } - } - } - - /** - * @throws ReflectionException - * @throws UnintentionallyCoveredCodeException - */ - private function performUnintentionallyCoveredCodeCheck(RawCodeCoverageData $data, array $linesToBeCovered, array $linesToBeUsed): void - { - $allowedLines = $this->getAllowedLines( - $linesToBeCovered, - $linesToBeUsed, - ); - - $unintentionallyCoveredUnits = []; - - foreach ($data->lineCoverage() as $file => $_data) { - foreach ($_data as $line => $flag) { - if ($flag === 1 && !isset($allowedLines[$file][$line])) { - $unintentionallyCoveredUnits[] = $this->wizard->lookup($file, $line); - } - } - } - - $unintentionallyCoveredUnits = $this->processUnintentionallyCoveredUnits($unintentionallyCoveredUnits); - - if (!empty($unintentionallyCoveredUnits)) { - throw new UnintentionallyCoveredCodeException( - $unintentionallyCoveredUnits, - ); - } - } - - private function getAllowedLines(array $linesToBeCovered, array $linesToBeUsed): array - { - $allowedLines = []; - - foreach (array_keys($linesToBeCovered) as $file) { - if (!isset($allowedLines[$file])) { - $allowedLines[$file] = []; - } - - $allowedLines[$file] = array_merge( - $allowedLines[$file], - $linesToBeCovered[$file], - ); - } - - foreach (array_keys($linesToBeUsed) as $file) { - if (!isset($allowedLines[$file])) { - $allowedLines[$file] = []; - } - - $allowedLines[$file] = array_merge( - $allowedLines[$file], - $linesToBeUsed[$file], - ); - } - - foreach (array_keys($allowedLines) as $file) { - $allowedLines[$file] = array_flip( - array_unique($allowedLines[$file]), - ); - } - - return $allowedLines; - } - - /** - * @param list<string> $unintentionallyCoveredUnits - * - * @throws ReflectionException - * - * @return list<string> - */ - private function processUnintentionallyCoveredUnits(array $unintentionallyCoveredUnits): array - { - $unintentionallyCoveredUnits = array_unique($unintentionallyCoveredUnits); - $processed = []; - - foreach ($unintentionallyCoveredUnits as $unintentionallyCoveredUnit) { - $tmp = explode('::', $unintentionallyCoveredUnit); - - if (count($tmp) !== 2) { - $processed[] = $unintentionallyCoveredUnit; - - continue; - } - - try { - $class = new ReflectionClass($tmp[0]); - - foreach ($this->parentClassesExcludedFromUnintentionallyCoveredCodeCheck as $parentClass) { - if ($class->isSubclassOf($parentClass)) { - continue 2; - } - } - } catch (\ReflectionException $e) { - throw new ReflectionException( - $e->getMessage(), - $e->getCode(), - $e, - ); - } - - $processed[] = $tmp[0]; - } - - $processed = array_unique($processed); - - sort($processed); - - return $processed; - } - - private function analyser(): FileAnalyser - { - if ($this->analyser !== null) { - return $this->analyser; - } - - $this->analyser = new ParsingFileAnalyser( - $this->useAnnotationsForIgnoringCode, - $this->ignoreDeprecatedCode, - ); - - if ($this->cachesStaticAnalysis()) { - $this->analyser = new CachingFileAnalyser( - $this->cacheDirectory, - $this->analyser, - $this->useAnnotationsForIgnoringCode, - $this->ignoreDeprecatedCode, - ); - } - - return $this->analyser; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Data/ProcessedCodeCoverageData.php b/vendor/phpunit/php-code-coverage/src/Data/ProcessedCodeCoverageData.php deleted file mode 100644 index 28834c2..0000000 --- a/vendor/phpunit/php-code-coverage/src/Data/ProcessedCodeCoverageData.php +++ /dev/null @@ -1,278 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Data; - -use function array_key_exists; -use function array_keys; -use function array_merge; -use function array_unique; -use function count; -use function is_array; -use function ksort; -use SebastianBergmann\CodeCoverage\Driver\Driver; - -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage - * - * @psalm-import-type XdebugFunctionCoverageType from \SebastianBergmann\CodeCoverage\Driver\XdebugDriver - * - * @psalm-type TestIdType = string - */ -final class ProcessedCodeCoverageData -{ - /** - * Line coverage data. - * An array of filenames, each having an array of linenumbers, each executable line having an array of testcase ids. - * - * @psalm-var array<string, array<int, null|list<TestIdType>>> - */ - private array $lineCoverage = []; - - /** - * Function coverage data. - * Maintains base format of raw data (@see https://xdebug.org/docs/code_coverage), but each 'hit' entry is an array - * of testcase ids. - * - * @psalm-var array<string, array<string, array{ - * branches: array<int, array{ - * op_start: int, - * op_end: int, - * line_start: int, - * line_end: int, - * hit: list<TestIdType>, - * out: array<int, int>, - * out_hit: array<int, int>, - * }>, - * paths: array<int, array{ - * path: array<int, int>, - * hit: list<TestIdType>, - * }>, - * hit: list<TestIdType> - * }>> - */ - private array $functionCoverage = []; - - public function initializeUnseenData(RawCodeCoverageData $rawData): void - { - foreach ($rawData->lineCoverage() as $file => $lines) { - if (!isset($this->lineCoverage[$file])) { - $this->lineCoverage[$file] = []; - - foreach ($lines as $k => $v) { - $this->lineCoverage[$file][$k] = $v === Driver::LINE_NOT_EXECUTABLE ? null : []; - } - } - } - - foreach ($rawData->functionCoverage() as $file => $functions) { - foreach ($functions as $functionName => $functionData) { - if (isset($this->functionCoverage[$file][$functionName])) { - $this->initPreviouslySeenFunction($file, $functionName, $functionData); - } else { - $this->initPreviouslyUnseenFunction($file, $functionName, $functionData); - } - } - } - } - - public function markCodeAsExecutedByTestCase(string $testCaseId, RawCodeCoverageData $executedCode): void - { - foreach ($executedCode->lineCoverage() as $file => $lines) { - foreach ($lines as $k => $v) { - if ($v === Driver::LINE_EXECUTED) { - $this->lineCoverage[$file][$k][] = $testCaseId; - } - } - } - - foreach ($executedCode->functionCoverage() as $file => $functions) { - foreach ($functions as $functionName => $functionData) { - foreach ($functionData['branches'] as $branchId => $branchData) { - if ($branchData['hit'] === Driver::BRANCH_HIT) { - $this->functionCoverage[$file][$functionName]['branches'][$branchId]['hit'][] = $testCaseId; - } - } - - foreach ($functionData['paths'] as $pathId => $pathData) { - if ($pathData['hit'] === Driver::BRANCH_HIT) { - $this->functionCoverage[$file][$functionName]['paths'][$pathId]['hit'][] = $testCaseId; - } - } - } - } - } - - public function setLineCoverage(array $lineCoverage): void - { - $this->lineCoverage = $lineCoverage; - } - - public function lineCoverage(): array - { - ksort($this->lineCoverage); - - return $this->lineCoverage; - } - - public function setFunctionCoverage(array $functionCoverage): void - { - $this->functionCoverage = $functionCoverage; - } - - public function functionCoverage(): array - { - ksort($this->functionCoverage); - - return $this->functionCoverage; - } - - public function coveredFiles(): array - { - ksort($this->lineCoverage); - - return array_keys($this->lineCoverage); - } - - public function renameFile(string $oldFile, string $newFile): void - { - $this->lineCoverage[$newFile] = $this->lineCoverage[$oldFile]; - - if (isset($this->functionCoverage[$oldFile])) { - $this->functionCoverage[$newFile] = $this->functionCoverage[$oldFile]; - } - - unset($this->lineCoverage[$oldFile], $this->functionCoverage[$oldFile]); - } - - public function merge(self $newData): void - { - foreach ($newData->lineCoverage as $file => $lines) { - if (!isset($this->lineCoverage[$file])) { - $this->lineCoverage[$file] = $lines; - - continue; - } - - // we should compare the lines if any of two contains data - $compareLineNumbers = array_unique( - array_merge( - array_keys($this->lineCoverage[$file]), - array_keys($newData->lineCoverage[$file]), - ), - ); - - foreach ($compareLineNumbers as $line) { - $thatPriority = $this->priorityForLine($newData->lineCoverage[$file], $line); - $thisPriority = $this->priorityForLine($this->lineCoverage[$file], $line); - - if ($thatPriority > $thisPriority) { - $this->lineCoverage[$file][$line] = $newData->lineCoverage[$file][$line]; - } elseif ($thatPriority === $thisPriority && is_array($this->lineCoverage[$file][$line])) { - $this->lineCoverage[$file][$line] = array_unique( - array_merge($this->lineCoverage[$file][$line], $newData->lineCoverage[$file][$line]), - ); - } - } - } - - foreach ($newData->functionCoverage as $file => $functions) { - if (!isset($this->functionCoverage[$file])) { - $this->functionCoverage[$file] = $functions; - - continue; - } - - foreach ($functions as $functionName => $functionData) { - if (isset($this->functionCoverage[$file][$functionName])) { - $this->initPreviouslySeenFunction($file, $functionName, $functionData); - } else { - $this->initPreviouslyUnseenFunction($file, $functionName, $functionData); - } - - foreach ($functionData['branches'] as $branchId => $branchData) { - $this->functionCoverage[$file][$functionName]['branches'][$branchId]['hit'] = array_unique(array_merge($this->functionCoverage[$file][$functionName]['branches'][$branchId]['hit'], $branchData['hit'])); - } - - foreach ($functionData['paths'] as $pathId => $pathData) { - $this->functionCoverage[$file][$functionName]['paths'][$pathId]['hit'] = array_unique(array_merge($this->functionCoverage[$file][$functionName]['paths'][$pathId]['hit'], $pathData['hit'])); - } - } - } - } - - /** - * Determine the priority for a line. - * - * 1 = the line is not set - * 2 = the line has not been tested - * 3 = the line is dead code - * 4 = the line has been tested - * - * During a merge, a higher number is better. - */ - private function priorityForLine(array $data, int $line): int - { - if (!array_key_exists($line, $data)) { - return 1; - } - - if (is_array($data[$line]) && count($data[$line]) === 0) { - return 2; - } - - if ($data[$line] === null) { - return 3; - } - - return 4; - } - - /** - * For a function we have never seen before, copy all data over and simply init the 'hit' array. - * - * @psalm-param XdebugFunctionCoverageType $functionData - */ - private function initPreviouslyUnseenFunction(string $file, string $functionName, array $functionData): void - { - $this->functionCoverage[$file][$functionName] = $functionData; - - foreach (array_keys($functionData['branches']) as $branchId) { - $this->functionCoverage[$file][$functionName]['branches'][$branchId]['hit'] = []; - } - - foreach (array_keys($functionData['paths']) as $pathId) { - $this->functionCoverage[$file][$functionName]['paths'][$pathId]['hit'] = []; - } - } - - /** - * For a function we have seen before, only copy over and init the 'hit' array for any unseen branches and paths. - * Techniques such as mocking and where the contents of a file are different vary during tests (e.g. compiling - * containers) mean that the functions inside a file cannot be relied upon to be static. - * - * @psalm-param XdebugFunctionCoverageType $functionData - */ - private function initPreviouslySeenFunction(string $file, string $functionName, array $functionData): void - { - foreach ($functionData['branches'] as $branchId => $branchData) { - if (!isset($this->functionCoverage[$file][$functionName]['branches'][$branchId])) { - $this->functionCoverage[$file][$functionName]['branches'][$branchId] = $branchData; - $this->functionCoverage[$file][$functionName]['branches'][$branchId]['hit'] = []; - } - } - - foreach ($functionData['paths'] as $pathId => $pathData) { - if (!isset($this->functionCoverage[$file][$functionName]['paths'][$pathId])) { - $this->functionCoverage[$file][$functionName]['paths'][$pathId] = $pathData; - $this->functionCoverage[$file][$functionName]['paths'][$pathId]['hit'] = []; - } - } - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Data/RawCodeCoverageData.php b/vendor/phpunit/php-code-coverage/src/Data/RawCodeCoverageData.php deleted file mode 100644 index 49cefbb..0000000 --- a/vendor/phpunit/php-code-coverage/src/Data/RawCodeCoverageData.php +++ /dev/null @@ -1,281 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Data; - -use function array_diff; -use function array_diff_key; -use function array_flip; -use function array_intersect; -use function array_intersect_key; -use function count; -use function explode; -use function file_get_contents; -use function in_array; -use function is_file; -use function preg_replace; -use function range; -use function str_ends_with; -use function str_starts_with; -use function trim; -use SebastianBergmann\CodeCoverage\Driver\Driver; -use SebastianBergmann\CodeCoverage\StaticAnalysis\FileAnalyser; - -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage - * - * @psalm-import-type XdebugFunctionsCoverageType from \SebastianBergmann\CodeCoverage\Driver\XdebugDriver - * @psalm-import-type XdebugCodeCoverageWithoutPathCoverageType from \SebastianBergmann\CodeCoverage\Driver\XdebugDriver - * @psalm-import-type XdebugCodeCoverageWithPathCoverageType from \SebastianBergmann\CodeCoverage\Driver\XdebugDriver - */ -final class RawCodeCoverageData -{ - /** - * @var array<string, array<int>> - */ - private static array $emptyLineCache = []; - - /** - * @psalm-var XdebugCodeCoverageWithoutPathCoverageType - */ - private array $lineCoverage; - - /** - * @psalm-var array<string, XdebugFunctionsCoverageType> - */ - private array $functionCoverage; - - /** - * @psalm-param XdebugCodeCoverageWithoutPathCoverageType $rawCoverage - */ - public static function fromXdebugWithoutPathCoverage(array $rawCoverage): self - { - return new self($rawCoverage, []); - } - - /** - * @psalm-param XdebugCodeCoverageWithPathCoverageType $rawCoverage - */ - public static function fromXdebugWithPathCoverage(array $rawCoverage): self - { - $lineCoverage = []; - $functionCoverage = []; - - foreach ($rawCoverage as $file => $fileCoverageData) { - // Xdebug annotates the function name of traits, strip that off - foreach ($fileCoverageData['functions'] as $existingKey => $data) { - if (str_ends_with($existingKey, '}') && !str_starts_with($existingKey, '{')) { // don't want to catch {main} - $newKey = preg_replace('/\{.*}$/', '', $existingKey); - $fileCoverageData['functions'][$newKey] = $data; - unset($fileCoverageData['functions'][$existingKey]); - } - } - - $lineCoverage[$file] = $fileCoverageData['lines']; - $functionCoverage[$file] = $fileCoverageData['functions']; - } - - return new self($lineCoverage, $functionCoverage); - } - - public static function fromUncoveredFile(string $filename, FileAnalyser $analyser): self - { - $lineCoverage = []; - - foreach ($analyser->executableLinesIn($filename) as $line => $branch) { - $lineCoverage[$line] = Driver::LINE_NOT_EXECUTED; - } - - return new self([$filename => $lineCoverage], []); - } - - /** - * @psalm-param XdebugCodeCoverageWithoutPathCoverageType $lineCoverage - * @psalm-param array<string, XdebugFunctionsCoverageType> $functionCoverage - */ - private function __construct(array $lineCoverage, array $functionCoverage) - { - $this->lineCoverage = $lineCoverage; - $this->functionCoverage = $functionCoverage; - - $this->skipEmptyLines(); - } - - public function clear(): void - { - $this->lineCoverage = $this->functionCoverage = []; - } - - /** - * @psalm-return XdebugCodeCoverageWithoutPathCoverageType - */ - public function lineCoverage(): array - { - return $this->lineCoverage; - } - - /** - * @psalm-return array<string, XdebugFunctionsCoverageType> - */ - public function functionCoverage(): array - { - return $this->functionCoverage; - } - - public function removeCoverageDataForFile(string $filename): void - { - unset($this->lineCoverage[$filename], $this->functionCoverage[$filename]); - } - - /** - * @param int[] $lines - */ - public function keepLineCoverageDataOnlyForLines(string $filename, array $lines): void - { - if (!isset($this->lineCoverage[$filename])) { - return; - } - - $this->lineCoverage[$filename] = array_intersect_key( - $this->lineCoverage[$filename], - array_flip($lines), - ); - } - - /** - * @param int[] $linesToBranchMap - */ - public function markExecutableLineByBranch(string $filename, array $linesToBranchMap): void - { - if (!isset($this->lineCoverage[$filename])) { - return; - } - - $linesByBranch = []; - - foreach ($linesToBranchMap as $line => $branch) { - $linesByBranch[$branch][] = $line; - } - - foreach ($this->lineCoverage[$filename] as $line => $lineStatus) { - if (!isset($linesToBranchMap[$line])) { - continue; - } - - $branch = $linesToBranchMap[$line]; - - if (!isset($linesByBranch[$branch])) { - continue; - } - - foreach ($linesByBranch[$branch] as $lineInBranch) { - $this->lineCoverage[$filename][$lineInBranch] = $lineStatus; - } - - if (Driver::LINE_EXECUTED === $lineStatus) { - unset($linesByBranch[$branch]); - } - } - } - - /** - * @param int[] $lines - */ - public function keepFunctionCoverageDataOnlyForLines(string $filename, array $lines): void - { - if (!isset($this->functionCoverage[$filename])) { - return; - } - - foreach ($this->functionCoverage[$filename] as $functionName => $functionData) { - foreach ($functionData['branches'] as $branchId => $branch) { - if (count(array_diff(range($branch['line_start'], $branch['line_end']), $lines)) > 0) { - unset($this->functionCoverage[$filename][$functionName]['branches'][$branchId]); - - foreach ($functionData['paths'] as $pathId => $path) { - if (in_array($branchId, $path['path'], true)) { - unset($this->functionCoverage[$filename][$functionName]['paths'][$pathId]); - } - } - } - } - } - } - - /** - * @param int[] $lines - */ - public function removeCoverageDataForLines(string $filename, array $lines): void - { - if (empty($lines)) { - return; - } - - if (!isset($this->lineCoverage[$filename])) { - return; - } - - $this->lineCoverage[$filename] = array_diff_key( - $this->lineCoverage[$filename], - array_flip($lines), - ); - - if (isset($this->functionCoverage[$filename])) { - foreach ($this->functionCoverage[$filename] as $functionName => $functionData) { - foreach ($functionData['branches'] as $branchId => $branch) { - if (count(array_intersect($lines, range($branch['line_start'], $branch['line_end']))) > 0) { - unset($this->functionCoverage[$filename][$functionName]['branches'][$branchId]); - - foreach ($functionData['paths'] as $pathId => $path) { - if (in_array($branchId, $path['path'], true)) { - unset($this->functionCoverage[$filename][$functionName]['paths'][$pathId]); - } - } - } - } - } - } - } - - /** - * At the end of a file, the PHP interpreter always sees an implicit return. Where this occurs in a file that has - * e.g. a class definition, that line cannot be invoked from a test and results in confusing coverage. This engine - * implementation detail therefore needs to be masked which is done here by simply ensuring that all empty lines - * are skipped over for coverage purposes. - * - * @see https://github.com/sebastianbergmann/php-code-coverage/issues/799 - */ - private function skipEmptyLines(): void - { - foreach ($this->lineCoverage as $filename => $coverage) { - foreach ($this->getEmptyLinesForFile($filename) as $emptyLine) { - unset($this->lineCoverage[$filename][$emptyLine]); - } - } - } - - private function getEmptyLinesForFile(string $filename): array - { - if (!isset(self::$emptyLineCache[$filename])) { - self::$emptyLineCache[$filename] = []; - - if (is_file($filename)) { - $sourceLines = explode("\n", file_get_contents($filename)); - - foreach ($sourceLines as $line => $source) { - if (trim($source) === '') { - self::$emptyLineCache[$filename][] = ($line + 1); - } - } - } - } - - return self::$emptyLineCache[$filename]; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Driver/Driver.php b/vendor/phpunit/php-code-coverage/src/Driver/Driver.php deleted file mode 100644 index cfbed9c..0000000 --- a/vendor/phpunit/php-code-coverage/src/Driver/Driver.php +++ /dev/null @@ -1,128 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Driver; - -use function sprintf; -use SebastianBergmann\CodeCoverage\BranchAndPathCoverageNotSupportedException; -use SebastianBergmann\CodeCoverage\Data\RawCodeCoverageData; -use SebastianBergmann\CodeCoverage\DeadCodeDetectionNotSupportedException; - -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage - */ -abstract class Driver -{ - /** - * @var int - * - * @see http://xdebug.org/docs/code_coverage - */ - public const LINE_NOT_EXECUTABLE = -2; - - /** - * @var int - * - * @see http://xdebug.org/docs/code_coverage - */ - public const LINE_NOT_EXECUTED = -1; - - /** - * @var int - * - * @see http://xdebug.org/docs/code_coverage - */ - public const LINE_EXECUTED = 1; - - /** - * @var int - * - * @see http://xdebug.org/docs/code_coverage - */ - public const BRANCH_NOT_HIT = 0; - - /** - * @var int - * - * @see http://xdebug.org/docs/code_coverage - */ - public const BRANCH_HIT = 1; - private bool $collectBranchAndPathCoverage = false; - private bool $detectDeadCode = false; - - public function canCollectBranchAndPathCoverage(): bool - { - return false; - } - - public function collectsBranchAndPathCoverage(): bool - { - return $this->collectBranchAndPathCoverage; - } - - /** - * @throws BranchAndPathCoverageNotSupportedException - */ - public function enableBranchAndPathCoverage(): void - { - if (!$this->canCollectBranchAndPathCoverage()) { - throw new BranchAndPathCoverageNotSupportedException( - sprintf( - '%s does not support branch and path coverage', - $this->nameAndVersion(), - ), - ); - } - - $this->collectBranchAndPathCoverage = true; - } - - public function disableBranchAndPathCoverage(): void - { - $this->collectBranchAndPathCoverage = false; - } - - public function canDetectDeadCode(): bool - { - return false; - } - - public function detectsDeadCode(): bool - { - return $this->detectDeadCode; - } - - /** - * @throws DeadCodeDetectionNotSupportedException - */ - public function enableDeadCodeDetection(): void - { - if (!$this->canDetectDeadCode()) { - throw new DeadCodeDetectionNotSupportedException( - sprintf( - '%s does not support dead code detection', - $this->nameAndVersion(), - ), - ); - } - - $this->detectDeadCode = true; - } - - public function disableDeadCodeDetection(): void - { - $this->detectDeadCode = false; - } - - abstract public function nameAndVersion(): string; - - abstract public function start(): void; - - abstract public function stop(): RawCodeCoverageData; -} diff --git a/vendor/phpunit/php-code-coverage/src/Driver/PcovDriver.php b/vendor/phpunit/php-code-coverage/src/Driver/PcovDriver.php deleted file mode 100644 index cdb01e6..0000000 --- a/vendor/phpunit/php-code-coverage/src/Driver/PcovDriver.php +++ /dev/null @@ -1,80 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Driver; - -use const pcov\inclusive; -use function array_intersect; -use function extension_loaded; -use function pcov\clear; -use function pcov\collect; -use function pcov\start; -use function pcov\stop; -use function pcov\waiting; -use function phpversion; -use SebastianBergmann\CodeCoverage\Data\RawCodeCoverageData; -use SebastianBergmann\CodeCoverage\Filter; - -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage - */ -final class PcovDriver extends Driver -{ - private readonly Filter $filter; - - /** - * @throws PcovNotAvailableException - */ - public function __construct(Filter $filter) - { - $this->ensurePcovIsAvailable(); - - $this->filter = $filter; - } - - public function start(): void - { - start(); - } - - public function stop(): RawCodeCoverageData - { - stop(); - - $filesToCollectCoverageFor = waiting(); - $collected = []; - - if ($filesToCollectCoverageFor) { - if (!$this->filter->isEmpty()) { - $filesToCollectCoverageFor = array_intersect($filesToCollectCoverageFor, $this->filter->files()); - } - - $collected = collect(inclusive, $filesToCollectCoverageFor); - - clear(); - } - - return RawCodeCoverageData::fromXdebugWithoutPathCoverage($collected); - } - - public function nameAndVersion(): string - { - return 'PCOV ' . phpversion('pcov'); - } - - /** - * @throws PcovNotAvailableException - */ - private function ensurePcovIsAvailable(): void - { - if (!extension_loaded('pcov')) { - throw new PcovNotAvailableException; - } - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Driver/Selector.php b/vendor/phpunit/php-code-coverage/src/Driver/Selector.php deleted file mode 100644 index f1ff32b..0000000 --- a/vendor/phpunit/php-code-coverage/src/Driver/Selector.php +++ /dev/null @@ -1,62 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Driver; - -use SebastianBergmann\CodeCoverage\Filter; -use SebastianBergmann\CodeCoverage\NoCodeCoverageDriverAvailableException; -use SebastianBergmann\CodeCoverage\NoCodeCoverageDriverWithPathCoverageSupportAvailableException; -use SebastianBergmann\Environment\Runtime; - -final class Selector -{ - /** - * @throws NoCodeCoverageDriverAvailableException - * @throws PcovNotAvailableException - * @throws XdebugNotAvailableException - * @throws XdebugNotEnabledException - */ - public function forLineCoverage(Filter $filter): Driver - { - $runtime = new Runtime; - - if ($runtime->hasPCOV()) { - return new PcovDriver($filter); - } - - if ($runtime->hasXdebug()) { - $driver = new XdebugDriver($filter); - - $driver->enableDeadCodeDetection(); - - return $driver; - } - - throw new NoCodeCoverageDriverAvailableException; - } - - /** - * @throws NoCodeCoverageDriverWithPathCoverageSupportAvailableException - * @throws XdebugNotAvailableException - * @throws XdebugNotEnabledException - */ - public function forLineAndPathCoverage(Filter $filter): Driver - { - if ((new Runtime)->hasXdebug()) { - $driver = new XdebugDriver($filter); - - $driver->enableDeadCodeDetection(); - $driver->enableBranchAndPathCoverage(); - - return $driver; - } - - throw new NoCodeCoverageDriverWithPathCoverageSupportAvailableException; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Driver/XdebugDriver.php b/vendor/phpunit/php-code-coverage/src/Driver/XdebugDriver.php deleted file mode 100644 index 37f4572..0000000 --- a/vendor/phpunit/php-code-coverage/src/Driver/XdebugDriver.php +++ /dev/null @@ -1,162 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Driver; - -use const XDEBUG_CC_BRANCH_CHECK; -use const XDEBUG_CC_DEAD_CODE; -use const XDEBUG_CC_UNUSED; -use const XDEBUG_FILTER_CODE_COVERAGE; -use const XDEBUG_PATH_INCLUDE; -use function explode; -use function extension_loaded; -use function getenv; -use function in_array; -use function ini_get; -use function phpversion; -use function version_compare; -use function xdebug_get_code_coverage; -use function xdebug_info; -use function xdebug_set_filter; -use function xdebug_start_code_coverage; -use function xdebug_stop_code_coverage; -use SebastianBergmann\CodeCoverage\Data\RawCodeCoverageData; -use SebastianBergmann\CodeCoverage\Filter; - -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage - * - * @see https://xdebug.org/docs/code_coverage#xdebug_get_code_coverage - * - * @psalm-type XdebugLinesCoverageType = array<int, int> - * @psalm-type XdebugBranchCoverageType = array{ - * op_start: int, - * op_end: int, - * line_start: int, - * line_end: int, - * hit: int, - * out: array<int, int>, - * out_hit: array<int, int>, - * } - * @psalm-type XdebugPathCoverageType = array{ - * path: array<int, int>, - * hit: int, - * } - * @psalm-type XdebugFunctionCoverageType = array{ - * branches: array<int, XdebugBranchCoverageType>, - * paths: array<int, XdebugPathCoverageType>, - * } - * @psalm-type XdebugFunctionsCoverageType = array<string, XdebugFunctionCoverageType> - * @psalm-type XdebugPathAndBranchesCoverageType = array{ - * lines: XdebugLinesCoverageType, - * functions: XdebugFunctionsCoverageType, - * } - * @psalm-type XdebugCodeCoverageWithoutPathCoverageType = array<string, XdebugLinesCoverageType> - * @psalm-type XdebugCodeCoverageWithPathCoverageType = array<string, XdebugPathAndBranchesCoverageType> - */ -final class XdebugDriver extends Driver -{ - /** - * @throws XdebugNotAvailableException - * @throws XdebugNotEnabledException - */ - public function __construct(Filter $filter) - { - $this->ensureXdebugIsAvailable(); - $this->ensureXdebugCodeCoverageFeatureIsEnabled(); - - if (!$filter->isEmpty()) { - xdebug_set_filter( - XDEBUG_FILTER_CODE_COVERAGE, - XDEBUG_PATH_INCLUDE, - $filter->files(), - ); - } - } - - public function canCollectBranchAndPathCoverage(): bool - { - return true; - } - - public function canDetectDeadCode(): bool - { - return true; - } - - public function start(): void - { - $flags = XDEBUG_CC_UNUSED; - - if ($this->detectsDeadCode() || $this->collectsBranchAndPathCoverage()) { - $flags |= XDEBUG_CC_DEAD_CODE; - } - - if ($this->collectsBranchAndPathCoverage()) { - $flags |= XDEBUG_CC_BRANCH_CHECK; - } - - xdebug_start_code_coverage($flags); - } - - public function stop(): RawCodeCoverageData - { - $data = xdebug_get_code_coverage(); - - xdebug_stop_code_coverage(); - - if ($this->collectsBranchAndPathCoverage()) { - /* @var XdebugCodeCoverageWithPathCoverageType $data */ - return RawCodeCoverageData::fromXdebugWithPathCoverage($data); - } - - /* @var XdebugCodeCoverageWithoutPathCoverageType $data */ - return RawCodeCoverageData::fromXdebugWithoutPathCoverage($data); - } - - public function nameAndVersion(): string - { - return 'Xdebug ' . phpversion('xdebug'); - } - - /** - * @throws XdebugNotAvailableException - */ - private function ensureXdebugIsAvailable(): void - { - if (!extension_loaded('xdebug')) { - throw new XdebugNotAvailableException; - } - } - - /** - * @throws XdebugNotEnabledException - */ - private function ensureXdebugCodeCoverageFeatureIsEnabled(): void - { - if (version_compare(phpversion('xdebug'), '3.1', '>=')) { - if (!in_array('coverage', xdebug_info('mode'), true)) { - throw new XdebugNotEnabledException; - } - - return; - } - - $mode = getenv('XDEBUG_MODE'); - - if ($mode === false || $mode === '') { - $mode = ini_get('xdebug.mode'); - } - - if ($mode === false || - !in_array('coverage', explode(',', $mode), true)) { - throw new XdebugNotEnabledException; - } - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Exception/BranchAndPathCoverageNotSupportedException.php b/vendor/phpunit/php-code-coverage/src/Exception/BranchAndPathCoverageNotSupportedException.php deleted file mode 100644 index ab20891..0000000 --- a/vendor/phpunit/php-code-coverage/src/Exception/BranchAndPathCoverageNotSupportedException.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage; - -use RuntimeException; - -final class BranchAndPathCoverageNotSupportedException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/php-code-coverage/src/Exception/DeadCodeDetectionNotSupportedException.php b/vendor/phpunit/php-code-coverage/src/Exception/DeadCodeDetectionNotSupportedException.php deleted file mode 100644 index d360064..0000000 --- a/vendor/phpunit/php-code-coverage/src/Exception/DeadCodeDetectionNotSupportedException.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage; - -use RuntimeException; - -final class DeadCodeDetectionNotSupportedException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/php-code-coverage/src/Exception/DirectoryCouldNotBeCreatedException.php b/vendor/phpunit/php-code-coverage/src/Exception/DirectoryCouldNotBeCreatedException.php deleted file mode 100644 index fdd9bfd..0000000 --- a/vendor/phpunit/php-code-coverage/src/Exception/DirectoryCouldNotBeCreatedException.php +++ /dev/null @@ -1,17 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Util; - -use RuntimeException; -use SebastianBergmann\CodeCoverage\Exception; - -final class DirectoryCouldNotBeCreatedException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/php-code-coverage/src/Exception/Exception.php b/vendor/phpunit/php-code-coverage/src/Exception/Exception.php deleted file mode 100644 index 28dc48b..0000000 --- a/vendor/phpunit/php-code-coverage/src/Exception/Exception.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage; - -use Throwable; - -interface Exception extends Throwable -{ -} diff --git a/vendor/phpunit/php-code-coverage/src/Exception/FileCouldNotBeWrittenException.php b/vendor/phpunit/php-code-coverage/src/Exception/FileCouldNotBeWrittenException.php deleted file mode 100644 index db9cdac..0000000 --- a/vendor/phpunit/php-code-coverage/src/Exception/FileCouldNotBeWrittenException.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage; - -use RuntimeException; - -final class FileCouldNotBeWrittenException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/php-code-coverage/src/Exception/InvalidArgumentException.php b/vendor/phpunit/php-code-coverage/src/Exception/InvalidArgumentException.php deleted file mode 100644 index 17e4b70..0000000 --- a/vendor/phpunit/php-code-coverage/src/Exception/InvalidArgumentException.php +++ /dev/null @@ -1,14 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage; - -final class InvalidArgumentException extends \InvalidArgumentException implements Exception -{ -} diff --git a/vendor/phpunit/php-code-coverage/src/Exception/NoCodeCoverageDriverAvailableException.php b/vendor/phpunit/php-code-coverage/src/Exception/NoCodeCoverageDriverAvailableException.php deleted file mode 100644 index b1494e2..0000000 --- a/vendor/phpunit/php-code-coverage/src/Exception/NoCodeCoverageDriverAvailableException.php +++ /dev/null @@ -1,20 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage; - -use RuntimeException; - -final class NoCodeCoverageDriverAvailableException extends RuntimeException implements Exception -{ - public function __construct() - { - parent::__construct('No code coverage driver available'); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Exception/NoCodeCoverageDriverWithPathCoverageSupportAvailableException.php b/vendor/phpunit/php-code-coverage/src/Exception/NoCodeCoverageDriverWithPathCoverageSupportAvailableException.php deleted file mode 100644 index 0065b74..0000000 --- a/vendor/phpunit/php-code-coverage/src/Exception/NoCodeCoverageDriverWithPathCoverageSupportAvailableException.php +++ /dev/null @@ -1,20 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage; - -use RuntimeException; - -final class NoCodeCoverageDriverWithPathCoverageSupportAvailableException extends RuntimeException implements Exception -{ - public function __construct() - { - parent::__construct('No code coverage driver with path coverage support available'); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Exception/ParserException.php b/vendor/phpunit/php-code-coverage/src/Exception/ParserException.php deleted file mode 100644 index a907e34..0000000 --- a/vendor/phpunit/php-code-coverage/src/Exception/ParserException.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage; - -use RuntimeException; - -final class ParserException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/php-code-coverage/src/Exception/PathExistsButIsNotDirectoryException.php b/vendor/phpunit/php-code-coverage/src/Exception/PathExistsButIsNotDirectoryException.php deleted file mode 100644 index 54bd73f..0000000 --- a/vendor/phpunit/php-code-coverage/src/Exception/PathExistsButIsNotDirectoryException.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Driver; - -use function sprintf; -use RuntimeException; -use SebastianBergmann\CodeCoverage\Exception; - -final class PathExistsButIsNotDirectoryException extends RuntimeException implements Exception -{ - public function __construct(string $path) - { - parent::__construct(sprintf('"%s" exists but is not a directory', $path)); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Exception/PcovNotAvailableException.php b/vendor/phpunit/php-code-coverage/src/Exception/PcovNotAvailableException.php deleted file mode 100644 index 2f0a66e..0000000 --- a/vendor/phpunit/php-code-coverage/src/Exception/PcovNotAvailableException.php +++ /dev/null @@ -1,21 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Driver; - -use RuntimeException; -use SebastianBergmann\CodeCoverage\Exception; - -final class PcovNotAvailableException extends RuntimeException implements Exception -{ - public function __construct() - { - parent::__construct('The PCOV extension is not available'); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Exception/ReflectionException.php b/vendor/phpunit/php-code-coverage/src/Exception/ReflectionException.php deleted file mode 100644 index 78db430..0000000 --- a/vendor/phpunit/php-code-coverage/src/Exception/ReflectionException.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage; - -use RuntimeException; - -final class ReflectionException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/php-code-coverage/src/Exception/ReportAlreadyFinalizedException.php b/vendor/phpunit/php-code-coverage/src/Exception/ReportAlreadyFinalizedException.php deleted file mode 100644 index 0481f16..0000000 --- a/vendor/phpunit/php-code-coverage/src/Exception/ReportAlreadyFinalizedException.php +++ /dev/null @@ -1,20 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage; - -use RuntimeException; - -final class ReportAlreadyFinalizedException extends RuntimeException implements Exception -{ - public function __construct() - { - parent::__construct('The code coverage report has already been finalized'); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Exception/StaticAnalysisCacheNotConfiguredException.php b/vendor/phpunit/php-code-coverage/src/Exception/StaticAnalysisCacheNotConfiguredException.php deleted file mode 100644 index fd58fd6..0000000 --- a/vendor/phpunit/php-code-coverage/src/Exception/StaticAnalysisCacheNotConfiguredException.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage; - -use RuntimeException; - -final class StaticAnalysisCacheNotConfiguredException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/php-code-coverage/src/Exception/TestIdMissingException.php b/vendor/phpunit/php-code-coverage/src/Exception/TestIdMissingException.php deleted file mode 100644 index 4cc3e0c..0000000 --- a/vendor/phpunit/php-code-coverage/src/Exception/TestIdMissingException.php +++ /dev/null @@ -1,20 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage; - -use RuntimeException; - -final class TestIdMissingException extends RuntimeException implements Exception -{ - public function __construct() - { - parent::__construct('Test ID is missing'); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Exception/UnintentionallyCoveredCodeException.php b/vendor/phpunit/php-code-coverage/src/Exception/UnintentionallyCoveredCodeException.php deleted file mode 100644 index bb7d88c..0000000 --- a/vendor/phpunit/php-code-coverage/src/Exception/UnintentionallyCoveredCodeException.php +++ /dev/null @@ -1,49 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage; - -use RuntimeException; - -final class UnintentionallyCoveredCodeException extends RuntimeException implements Exception -{ - /** - * @var list<string> - */ - private readonly array $unintentionallyCoveredUnits; - - /** - * @param list<string> $unintentionallyCoveredUnits - */ - public function __construct(array $unintentionallyCoveredUnits) - { - $this->unintentionallyCoveredUnits = $unintentionallyCoveredUnits; - - parent::__construct($this->toString()); - } - - /** - * @return list<string> - */ - public function getUnintentionallyCoveredUnits(): array - { - return $this->unintentionallyCoveredUnits; - } - - private function toString(): string - { - $message = ''; - - foreach ($this->unintentionallyCoveredUnits as $unit) { - $message .= '- ' . $unit . "\n"; - } - - return $message; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Exception/WriteOperationFailedException.php b/vendor/phpunit/php-code-coverage/src/Exception/WriteOperationFailedException.php deleted file mode 100644 index be549e1..0000000 --- a/vendor/phpunit/php-code-coverage/src/Exception/WriteOperationFailedException.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Driver; - -use function sprintf; -use RuntimeException; -use SebastianBergmann\CodeCoverage\Exception; - -final class WriteOperationFailedException extends RuntimeException implements Exception -{ - public function __construct(string $path) - { - parent::__construct(sprintf('Cannot write to "%s"', $path)); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Exception/XdebugNotAvailableException.php b/vendor/phpunit/php-code-coverage/src/Exception/XdebugNotAvailableException.php deleted file mode 100644 index 1622c5a..0000000 --- a/vendor/phpunit/php-code-coverage/src/Exception/XdebugNotAvailableException.php +++ /dev/null @@ -1,21 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Driver; - -use RuntimeException; -use SebastianBergmann\CodeCoverage\Exception; - -final class XdebugNotAvailableException extends RuntimeException implements Exception -{ - public function __construct() - { - parent::__construct('The Xdebug extension is not available'); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Exception/XdebugNotEnabledException.php b/vendor/phpunit/php-code-coverage/src/Exception/XdebugNotEnabledException.php deleted file mode 100644 index a8df464..0000000 --- a/vendor/phpunit/php-code-coverage/src/Exception/XdebugNotEnabledException.php +++ /dev/null @@ -1,21 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Driver; - -use RuntimeException; -use SebastianBergmann\CodeCoverage\Exception; - -final class XdebugNotEnabledException extends RuntimeException implements Exception -{ - public function __construct() - { - parent::__construct('XDEBUG_MODE=coverage (environment variable) or xdebug.mode=coverage (PHP configuration setting) has to be set'); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Exception/XmlException.php b/vendor/phpunit/php-code-coverage/src/Exception/XmlException.php deleted file mode 100644 index 31e4623..0000000 --- a/vendor/phpunit/php-code-coverage/src/Exception/XmlException.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage; - -use RuntimeException; - -final class XmlException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/php-code-coverage/src/Filter.php b/vendor/phpunit/php-code-coverage/src/Filter.php deleted file mode 100644 index f51eb3e..0000000 --- a/vendor/phpunit/php-code-coverage/src/Filter.php +++ /dev/null @@ -1,128 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage; - -use function array_keys; -use function is_file; -use function realpath; -use function str_contains; -use function str_starts_with; -use SebastianBergmann\FileIterator\Facade as FileIteratorFacade; - -final class Filter -{ - /** - * @psalm-var array<string,true> - */ - private array $files = []; - - /** - * @psalm-var array<string,bool> - */ - private array $isFileCache = []; - - /** - * @deprecated - */ - public function includeDirectory(string $directory, string $suffix = '.php', string $prefix = ''): void - { - foreach ((new FileIteratorFacade)->getFilesAsArray($directory, $suffix, $prefix) as $file) { - $this->includeFile($file); - } - } - - /** - * @psalm-param list<string> $files - */ - public function includeFiles(array $filenames): void - { - foreach ($filenames as $filename) { - $this->includeFile($filename); - } - } - - public function includeFile(string $filename): void - { - $filename = realpath($filename); - - if (!$filename) { - return; - } - - $this->files[$filename] = true; - } - - /** - * @deprecated - */ - public function excludeDirectory(string $directory, string $suffix = '.php', string $prefix = ''): void - { - foreach ((new FileIteratorFacade)->getFilesAsArray($directory, $suffix, $prefix) as $file) { - $this->excludeFile($file); - } - } - - /** - * @deprecated - */ - public function excludeFile(string $filename): void - { - $filename = realpath($filename); - - if (!$filename || !isset($this->files[$filename])) { - return; - } - - unset($this->files[$filename]); - } - - public function isFile(string $filename): bool - { - if (isset($this->isFileCache[$filename])) { - return $this->isFileCache[$filename]; - } - - if ($filename === '-' || - str_starts_with($filename, 'vfs://') || - str_contains($filename, 'xdebug://debug-eval') || - str_contains($filename, 'eval()\'d code') || - str_contains($filename, 'runtime-created function') || - str_contains($filename, 'runkit created function') || - str_contains($filename, 'assert code') || - str_contains($filename, 'regexp code') || - str_contains($filename, 'Standard input code')) { - $isFile = false; - } else { - $isFile = is_file($filename); - } - - $this->isFileCache[$filename] = $isFile; - - return $isFile; - } - - public function isExcluded(string $filename): bool - { - return !isset($this->files[$filename]) || !$this->isFile($filename); - } - - /** - * @psalm-return list<string> - */ - public function files(): array - { - return array_keys($this->files); - } - - public function isEmpty(): bool - { - return empty($this->files); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Node/AbstractNode.php b/vendor/phpunit/php-code-coverage/src/Node/AbstractNode.php deleted file mode 100644 index 3f21a50..0000000 --- a/vendor/phpunit/php-code-coverage/src/Node/AbstractNode.php +++ /dev/null @@ -1,250 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Node; - -use const DIRECTORY_SEPARATOR; -use function array_merge; -use function str_ends_with; -use function str_replace; -use function substr; -use Countable; -use SebastianBergmann\CodeCoverage\Util\Percentage; - -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage - * - * @psalm-import-type LinesOfCodeType from \SebastianBergmann\CodeCoverage\StaticAnalysis\FileAnalyser - * @psalm-import-type ProcessedFunctionType from \SebastianBergmann\CodeCoverage\Node\File - * @psalm-import-type ProcessedClassType from \SebastianBergmann\CodeCoverage\Node\File - * @psalm-import-type ProcessedTraitType from \SebastianBergmann\CodeCoverage\Node\File - */ -abstract class AbstractNode implements Countable -{ - private readonly string $name; - private string $pathAsString; - private array $pathAsArray; - private readonly ?AbstractNode $parent; - private string $id; - - public function __construct(string $name, ?self $parent = null) - { - if (str_ends_with($name, DIRECTORY_SEPARATOR)) { - $name = substr($name, 0, -1); - } - - $this->name = $name; - $this->parent = $parent; - - $this->processId(); - $this->processPath(); - } - - public function name(): string - { - return $this->name; - } - - public function id(): string - { - return $this->id; - } - - public function pathAsString(): string - { - return $this->pathAsString; - } - - public function pathAsArray(): array - { - return $this->pathAsArray; - } - - public function parent(): ?self - { - return $this->parent; - } - - public function percentageOfTestedClasses(): Percentage - { - return Percentage::fromFractionAndTotal( - $this->numberOfTestedClasses(), - $this->numberOfClasses(), - ); - } - - public function percentageOfTestedTraits(): Percentage - { - return Percentage::fromFractionAndTotal( - $this->numberOfTestedTraits(), - $this->numberOfTraits(), - ); - } - - public function percentageOfTestedClassesAndTraits(): Percentage - { - return Percentage::fromFractionAndTotal( - $this->numberOfTestedClassesAndTraits(), - $this->numberOfClassesAndTraits(), - ); - } - - public function percentageOfTestedFunctions(): Percentage - { - return Percentage::fromFractionAndTotal( - $this->numberOfTestedFunctions(), - $this->numberOfFunctions(), - ); - } - - public function percentageOfTestedMethods(): Percentage - { - return Percentage::fromFractionAndTotal( - $this->numberOfTestedMethods(), - $this->numberOfMethods(), - ); - } - - public function percentageOfTestedFunctionsAndMethods(): Percentage - { - return Percentage::fromFractionAndTotal( - $this->numberOfTestedFunctionsAndMethods(), - $this->numberOfFunctionsAndMethods(), - ); - } - - public function percentageOfExecutedLines(): Percentage - { - return Percentage::fromFractionAndTotal( - $this->numberOfExecutedLines(), - $this->numberOfExecutableLines(), - ); - } - - public function percentageOfExecutedBranches(): Percentage - { - return Percentage::fromFractionAndTotal( - $this->numberOfExecutedBranches(), - $this->numberOfExecutableBranches(), - ); - } - - public function percentageOfExecutedPaths(): Percentage - { - return Percentage::fromFractionAndTotal( - $this->numberOfExecutedPaths(), - $this->numberOfExecutablePaths(), - ); - } - - public function numberOfClassesAndTraits(): int - { - return $this->numberOfClasses() + $this->numberOfTraits(); - } - - public function numberOfTestedClassesAndTraits(): int - { - return $this->numberOfTestedClasses() + $this->numberOfTestedTraits(); - } - - public function classesAndTraits(): array - { - return array_merge($this->classes(), $this->traits()); - } - - public function numberOfFunctionsAndMethods(): int - { - return $this->numberOfFunctions() + $this->numberOfMethods(); - } - - public function numberOfTestedFunctionsAndMethods(): int - { - return $this->numberOfTestedFunctions() + $this->numberOfTestedMethods(); - } - - /** - * @psalm-return array<string, ProcessedClassType> - */ - abstract public function classes(): array; - - /** - * @psalm-return array<string, ProcessedTraitType> - */ - abstract public function traits(): array; - - /** - * @psalm-return array<string, ProcessedFunctionType> - */ - abstract public function functions(): array; - - /** - * @psalm-return LinesOfCodeType - */ - abstract public function linesOfCode(): array; - - abstract public function numberOfExecutableLines(): int; - - abstract public function numberOfExecutedLines(): int; - - abstract public function numberOfExecutableBranches(): int; - - abstract public function numberOfExecutedBranches(): int; - - abstract public function numberOfExecutablePaths(): int; - - abstract public function numberOfExecutedPaths(): int; - - abstract public function numberOfClasses(): int; - - abstract public function numberOfTestedClasses(): int; - - abstract public function numberOfTraits(): int; - - abstract public function numberOfTestedTraits(): int; - - abstract public function numberOfMethods(): int; - - abstract public function numberOfTestedMethods(): int; - - abstract public function numberOfFunctions(): int; - - abstract public function numberOfTestedFunctions(): int; - - private function processId(): void - { - if ($this->parent === null) { - $this->id = 'index'; - - return; - } - - $parentId = $this->parent->id(); - - if ($parentId === 'index') { - $this->id = str_replace(':', '_', $this->name); - } else { - $this->id = $parentId . '/' . $this->name; - } - } - - private function processPath(): void - { - if ($this->parent === null) { - $this->pathAsArray = [$this]; - $this->pathAsString = $this->name; - - return; - } - - $this->pathAsArray = $this->parent->pathAsArray(); - $this->pathAsString = $this->parent->pathAsString() . DIRECTORY_SEPARATOR . $this->name; - - $this->pathAsArray[] = $this; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Node/Builder.php b/vendor/phpunit/php-code-coverage/src/Node/Builder.php deleted file mode 100644 index 5ed6f86..0000000 --- a/vendor/phpunit/php-code-coverage/src/Node/Builder.php +++ /dev/null @@ -1,269 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Node; - -use const DIRECTORY_SEPARATOR; -use function array_shift; -use function basename; -use function count; -use function dirname; -use function explode; -use function implode; -use function is_file; -use function str_ends_with; -use function str_replace; -use function str_starts_with; -use function substr; -use SebastianBergmann\CodeCoverage\CodeCoverage; -use SebastianBergmann\CodeCoverage\Data\ProcessedCodeCoverageData; -use SebastianBergmann\CodeCoverage\StaticAnalysis\FileAnalyser; - -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage - * - * @psalm-import-type TestType from \SebastianBergmann\CodeCoverage\CodeCoverage - */ -final class Builder -{ - private readonly FileAnalyser $analyser; - - public function __construct(FileAnalyser $analyser) - { - $this->analyser = $analyser; - } - - public function build(CodeCoverage $coverage): Directory - { - $data = clone $coverage->getData(); // clone because path munging is destructive to the original data - $commonPath = $this->reducePaths($data); - $root = new Directory( - $commonPath, - null, - ); - - $this->addItems( - $root, - $this->buildDirectoryStructure($data), - $coverage->getTests(), - ); - - return $root; - } - - /** - * @psalm-param array<string, TestType> $tests - */ - private function addItems(Directory $root, array $items, array $tests): void - { - foreach ($items as $key => $value) { - $key = (string) $key; - - if (str_ends_with($key, '/f')) { - $key = substr($key, 0, -2); - $filename = $root->pathAsString() . DIRECTORY_SEPARATOR . $key; - - if (is_file($filename)) { - $root->addFile( - new File( - $key, - $root, - $value['lineCoverage'], - $value['functionCoverage'], - $tests, - $this->analyser->classesIn($filename), - $this->analyser->traitsIn($filename), - $this->analyser->functionsIn($filename), - $this->analyser->linesOfCodeFor($filename), - ), - ); - } - } else { - $child = $root->addDirectory($key); - - $this->addItems($child, $value, $tests); - } - } - } - - /** - * Builds an array representation of the directory structure. - * - * For instance, - * - * <code> - * Array - * ( - * [Money.php] => Array - * ( - * ... - * ) - * - * [MoneyBag.php] => Array - * ( - * ... - * ) - * ) - * </code> - * - * is transformed into - * - * <code> - * Array - * ( - * [.] => Array - * ( - * [Money.php] => Array - * ( - * ... - * ) - * - * [MoneyBag.php] => Array - * ( - * ... - * ) - * ) - * ) - * </code> - * - * @psalm-return array<string, array<string, array{lineCoverage: array<int, int>, functionCoverage: array<string, array<int, int>>}>> - */ - private function buildDirectoryStructure(ProcessedCodeCoverageData $data): array - { - $result = []; - - foreach ($data->coveredFiles() as $originalPath) { - $path = explode(DIRECTORY_SEPARATOR, $originalPath); - $pointer = &$result; - $max = count($path); - - for ($i = 0; $i < $max; $i++) { - $type = ''; - - if ($i === ($max - 1)) { - $type = '/f'; - } - - $pointer = &$pointer[$path[$i] . $type]; - } - - $pointer = [ - 'lineCoverage' => $data->lineCoverage()[$originalPath] ?? [], - 'functionCoverage' => $data->functionCoverage()[$originalPath] ?? [], - ]; - } - - return $result; - } - - /** - * Reduces the paths by cutting the longest common start path. - * - * For instance, - * - * <code> - * Array - * ( - * [/home/sb/Money/Money.php] => Array - * ( - * ... - * ) - * - * [/home/sb/Money/MoneyBag.php] => Array - * ( - * ... - * ) - * ) - * </code> - * - * is reduced to - * - * <code> - * Array - * ( - * [Money.php] => Array - * ( - * ... - * ) - * - * [MoneyBag.php] => Array - * ( - * ... - * ) - * ) - * </code> - */ - private function reducePaths(ProcessedCodeCoverageData $coverage): string - { - if (empty($coverage->coveredFiles())) { - return '.'; - } - - $commonPath = ''; - $paths = $coverage->coveredFiles(); - - if (count($paths) === 1) { - $commonPath = dirname($paths[0]) . DIRECTORY_SEPARATOR; - $coverage->renameFile($paths[0], basename($paths[0])); - - return $commonPath; - } - - $max = count($paths); - - for ($i = 0; $i < $max; $i++) { - // strip phar:// prefixes - if (str_starts_with($paths[$i], 'phar://')) { - $paths[$i] = substr($paths[$i], 7); - $paths[$i] = str_replace('/', DIRECTORY_SEPARATOR, $paths[$i]); - } - $paths[$i] = explode(DIRECTORY_SEPARATOR, $paths[$i]); - - if (empty($paths[$i][0])) { - $paths[$i][0] = DIRECTORY_SEPARATOR; - } - } - - $done = false; - $max = count($paths); - - while (!$done) { - for ($i = 0; $i < $max - 1; $i++) { - if (!isset($paths[$i][0]) || - !isset($paths[$i + 1][0]) || - $paths[$i][0] !== $paths[$i + 1][0]) { - $done = true; - - break; - } - } - - if (!$done) { - $commonPath .= $paths[0][0]; - - if ($paths[0][0] !== DIRECTORY_SEPARATOR) { - $commonPath .= DIRECTORY_SEPARATOR; - } - - for ($i = 0; $i < $max; $i++) { - array_shift($paths[$i]); - } - } - } - - $original = $coverage->coveredFiles(); - $max = count($original); - - for ($i = 0; $i < $max; $i++) { - $coverage->renameFile($original[$i], implode(DIRECTORY_SEPARATOR, $paths[$i])); - } - - return substr($commonPath, 0, -1); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Node/CrapIndex.php b/vendor/phpunit/php-code-coverage/src/Node/CrapIndex.php deleted file mode 100644 index 7173276..0000000 --- a/vendor/phpunit/php-code-coverage/src/Node/CrapIndex.php +++ /dev/null @@ -1,43 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Node; - -use function sprintf; - -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage - */ -final class CrapIndex -{ - private readonly int $cyclomaticComplexity; - private readonly float $codeCoverage; - - public function __construct(int $cyclomaticComplexity, float $codeCoverage) - { - $this->cyclomaticComplexity = $cyclomaticComplexity; - $this->codeCoverage = $codeCoverage; - } - - public function asString(): string - { - if ($this->codeCoverage === 0.0) { - return (string) ($this->cyclomaticComplexity ** 2 + $this->cyclomaticComplexity); - } - - if ($this->codeCoverage >= 95) { - return (string) $this->cyclomaticComplexity; - } - - return sprintf( - '%01.2F', - $this->cyclomaticComplexity ** 2 * (1 - $this->codeCoverage / 100) ** 3 + $this->cyclomaticComplexity, - ); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Node/Directory.php b/vendor/phpunit/php-code-coverage/src/Node/Directory.php deleted file mode 100644 index 176318b..0000000 --- a/vendor/phpunit/php-code-coverage/src/Node/Directory.php +++ /dev/null @@ -1,370 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Node; - -use function array_merge; -use function count; -use IteratorAggregate; -use RecursiveIteratorIterator; - -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage - * - * @psalm-import-type LinesOfCodeType from \SebastianBergmann\CodeCoverage\StaticAnalysis\FileAnalyser - */ -final class Directory extends AbstractNode implements IteratorAggregate -{ - /** - * @var list<AbstractNode> - */ - private array $children = []; - - /** - * @var list<Directory> - */ - private array $directories = []; - - /** - * @var list<File> - */ - private array $files = []; - private ?array $classes = null; - private ?array $traits = null; - private ?array $functions = null; - - /** - * @psalm-var null|LinesOfCodeType - */ - private ?array $linesOfCode = null; - private int $numFiles = -1; - private int $numExecutableLines = -1; - private int $numExecutedLines = -1; - private int $numExecutableBranches = -1; - private int $numExecutedBranches = -1; - private int $numExecutablePaths = -1; - private int $numExecutedPaths = -1; - private int $numClasses = -1; - private int $numTestedClasses = -1; - private int $numTraits = -1; - private int $numTestedTraits = -1; - private int $numMethods = -1; - private int $numTestedMethods = -1; - private int $numFunctions = -1; - private int $numTestedFunctions = -1; - - public function count(): int - { - if ($this->numFiles === -1) { - $this->numFiles = 0; - - foreach ($this->children as $child) { - $this->numFiles += count($child); - } - } - - return $this->numFiles; - } - - public function getIterator(): RecursiveIteratorIterator - { - return new RecursiveIteratorIterator( - new Iterator($this), - RecursiveIteratorIterator::SELF_FIRST, - ); - } - - public function addDirectory(string $name): self - { - $directory = new self($name, $this); - - $this->children[] = $directory; - $this->directories[] = &$this->children[count($this->children) - 1]; - - return $directory; - } - - public function addFile(File $file): void - { - $this->children[] = $file; - $this->files[] = &$this->children[count($this->children) - 1]; - - $this->numExecutableLines = -1; - $this->numExecutedLines = -1; - } - - public function directories(): array - { - return $this->directories; - } - - public function files(): array - { - return $this->files; - } - - public function children(): array - { - return $this->children; - } - - public function classes(): array - { - if ($this->classes === null) { - $this->classes = []; - - foreach ($this->children as $child) { - $this->classes = array_merge( - $this->classes, - $child->classes(), - ); - } - } - - return $this->classes; - } - - public function traits(): array - { - if ($this->traits === null) { - $this->traits = []; - - foreach ($this->children as $child) { - $this->traits = array_merge( - $this->traits, - $child->traits(), - ); - } - } - - return $this->traits; - } - - public function functions(): array - { - if ($this->functions === null) { - $this->functions = []; - - foreach ($this->children as $child) { - $this->functions = array_merge( - $this->functions, - $child->functions(), - ); - } - } - - return $this->functions; - } - - /** - * @psalm-return LinesOfCodeType - */ - public function linesOfCode(): array - { - if ($this->linesOfCode === null) { - $this->linesOfCode = [ - 'linesOfCode' => 0, - 'commentLinesOfCode' => 0, - 'nonCommentLinesOfCode' => 0, - ]; - - foreach ($this->children as $child) { - $childLinesOfCode = $child->linesOfCode(); - - $this->linesOfCode['linesOfCode'] += $childLinesOfCode['linesOfCode']; - $this->linesOfCode['commentLinesOfCode'] += $childLinesOfCode['commentLinesOfCode']; - $this->linesOfCode['nonCommentLinesOfCode'] += $childLinesOfCode['nonCommentLinesOfCode']; - } - } - - return $this->linesOfCode; - } - - public function numberOfExecutableLines(): int - { - if ($this->numExecutableLines === -1) { - $this->numExecutableLines = 0; - - foreach ($this->children as $child) { - $this->numExecutableLines += $child->numberOfExecutableLines(); - } - } - - return $this->numExecutableLines; - } - - public function numberOfExecutedLines(): int - { - if ($this->numExecutedLines === -1) { - $this->numExecutedLines = 0; - - foreach ($this->children as $child) { - $this->numExecutedLines += $child->numberOfExecutedLines(); - } - } - - return $this->numExecutedLines; - } - - public function numberOfExecutableBranches(): int - { - if ($this->numExecutableBranches === -1) { - $this->numExecutableBranches = 0; - - foreach ($this->children as $child) { - $this->numExecutableBranches += $child->numberOfExecutableBranches(); - } - } - - return $this->numExecutableBranches; - } - - public function numberOfExecutedBranches(): int - { - if ($this->numExecutedBranches === -1) { - $this->numExecutedBranches = 0; - - foreach ($this->children as $child) { - $this->numExecutedBranches += $child->numberOfExecutedBranches(); - } - } - - return $this->numExecutedBranches; - } - - public function numberOfExecutablePaths(): int - { - if ($this->numExecutablePaths === -1) { - $this->numExecutablePaths = 0; - - foreach ($this->children as $child) { - $this->numExecutablePaths += $child->numberOfExecutablePaths(); - } - } - - return $this->numExecutablePaths; - } - - public function numberOfExecutedPaths(): int - { - if ($this->numExecutedPaths === -1) { - $this->numExecutedPaths = 0; - - foreach ($this->children as $child) { - $this->numExecutedPaths += $child->numberOfExecutedPaths(); - } - } - - return $this->numExecutedPaths; - } - - public function numberOfClasses(): int - { - if ($this->numClasses === -1) { - $this->numClasses = 0; - - foreach ($this->children as $child) { - $this->numClasses += $child->numberOfClasses(); - } - } - - return $this->numClasses; - } - - public function numberOfTestedClasses(): int - { - if ($this->numTestedClasses === -1) { - $this->numTestedClasses = 0; - - foreach ($this->children as $child) { - $this->numTestedClasses += $child->numberOfTestedClasses(); - } - } - - return $this->numTestedClasses; - } - - public function numberOfTraits(): int - { - if ($this->numTraits === -1) { - $this->numTraits = 0; - - foreach ($this->children as $child) { - $this->numTraits += $child->numberOfTraits(); - } - } - - return $this->numTraits; - } - - public function numberOfTestedTraits(): int - { - if ($this->numTestedTraits === -1) { - $this->numTestedTraits = 0; - - foreach ($this->children as $child) { - $this->numTestedTraits += $child->numberOfTestedTraits(); - } - } - - return $this->numTestedTraits; - } - - public function numberOfMethods(): int - { - if ($this->numMethods === -1) { - $this->numMethods = 0; - - foreach ($this->children as $child) { - $this->numMethods += $child->numberOfMethods(); - } - } - - return $this->numMethods; - } - - public function numberOfTestedMethods(): int - { - if ($this->numTestedMethods === -1) { - $this->numTestedMethods = 0; - - foreach ($this->children as $child) { - $this->numTestedMethods += $child->numberOfTestedMethods(); - } - } - - return $this->numTestedMethods; - } - - public function numberOfFunctions(): int - { - if ($this->numFunctions === -1) { - $this->numFunctions = 0; - - foreach ($this->children as $child) { - $this->numFunctions += $child->numberOfFunctions(); - } - } - - return $this->numFunctions; - } - - public function numberOfTestedFunctions(): int - { - if ($this->numTestedFunctions === -1) { - $this->numTestedFunctions = 0; - - foreach ($this->children as $child) { - $this->numTestedFunctions += $child->numberOfTestedFunctions(); - } - } - - return $this->numTestedFunctions; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Node/File.php b/vendor/phpunit/php-code-coverage/src/Node/File.php deleted file mode 100644 index 7029e8a..0000000 --- a/vendor/phpunit/php-code-coverage/src/Node/File.php +++ /dev/null @@ -1,688 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Node; - -use function array_filter; -use function count; -use function range; - -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage - * - * @psalm-import-type CodeUnitFunctionType from \SebastianBergmann\CodeCoverage\StaticAnalysis\CodeUnitFindingVisitor - * @psalm-import-type CodeUnitMethodType from \SebastianBergmann\CodeCoverage\StaticAnalysis\CodeUnitFindingVisitor - * @psalm-import-type CodeUnitClassType from \SebastianBergmann\CodeCoverage\StaticAnalysis\CodeUnitFindingVisitor - * @psalm-import-type CodeUnitTraitType from \SebastianBergmann\CodeCoverage\StaticAnalysis\CodeUnitFindingVisitor - * @psalm-import-type LinesOfCodeType from \SebastianBergmann\CodeCoverage\StaticAnalysis\FileAnalyser - * @psalm-import-type LinesType from \SebastianBergmann\CodeCoverage\StaticAnalysis\FileAnalyser - * - * @psalm-type ProcessedFunctionType = array{ - * functionName: string, - * namespace: string, - * signature: string, - * startLine: int, - * endLine: int, - * executableLines: int, - * executedLines: int, - * executableBranches: int, - * executedBranches: int, - * executablePaths: int, - * executedPaths: int, - * ccn: int, - * coverage: int|float, - * crap: int|string, - * link: string - * } - * @psalm-type ProcessedMethodType = array{ - * methodName: string, - * visibility: string, - * signature: string, - * startLine: int, - * endLine: int, - * executableLines: int, - * executedLines: int, - * executableBranches: int, - * executedBranches: int, - * executablePaths: int, - * executedPaths: int, - * ccn: int, - * coverage: float|int, - * crap: int|string, - * link: string - * } - * @psalm-type ProcessedClassType = array{ - * className: string, - * namespace: string, - * methods: array<string, ProcessedMethodType>, - * startLine: int, - * executableLines: int, - * executedLines: int, - * executableBranches: int, - * executedBranches: int, - * executablePaths: int, - * executedPaths: int, - * ccn: int, - * coverage: int|float, - * crap: int|string, - * link: string - * } - * @psalm-type ProcessedTraitType = array{ - * traitName: string, - * namespace: string, - * methods: array<string, ProcessedMethodType>, - * startLine: int, - * executableLines: int, - * executedLines: int, - * executableBranches: int, - * executedBranches: int, - * executablePaths: int, - * executedPaths: int, - * ccn: int, - * coverage: float|int, - * crap: int|string, - * link: string - * } - */ -final class File extends AbstractNode -{ - /** - * @psalm-var array<int, ?list<non-empty-string>> - */ - private array $lineCoverageData; - private array $functionCoverageData; - private readonly array $testData; - private int $numExecutableLines = 0; - private int $numExecutedLines = 0; - private int $numExecutableBranches = 0; - private int $numExecutedBranches = 0; - private int $numExecutablePaths = 0; - private int $numExecutedPaths = 0; - - /** - * @psalm-var array<string, ProcessedClassType> - */ - private array $classes = []; - - /** - * @psalm-var array<string, ProcessedTraitType> - */ - private array $traits = []; - - /** - * @psalm-var array<string, ProcessedFunctionType> - */ - private array $functions = []; - - /** - * @psalm-var LinesOfCodeType - */ - private readonly array $linesOfCode; - private ?int $numClasses = null; - private int $numTestedClasses = 0; - private ?int $numTraits = null; - private int $numTestedTraits = 0; - private ?int $numMethods = null; - private ?int $numTestedMethods = null; - private ?int $numTestedFunctions = null; - - /** - * @var array<int, array|array{0: CodeUnitClassType, 1: string}|array{0: CodeUnitFunctionType}|array{0: CodeUnitTraitType, 1: string}> - */ - private array $codeUnitsByLine = []; - - /** - * @psalm-param array<int, ?list<non-empty-string>> $lineCoverageData - * @psalm-param LinesOfCodeType $linesOfCode - * @psalm-param array<string, CodeUnitClassType> $classes - * @psalm-param array<string, CodeUnitTraitType> $traits - * @psalm-param array<string, CodeUnitFunctionType> $functions - */ - public function __construct(string $name, AbstractNode $parent, array $lineCoverageData, array $functionCoverageData, array $testData, array $classes, array $traits, array $functions, array $linesOfCode) - { - parent::__construct($name, $parent); - - $this->lineCoverageData = $lineCoverageData; - $this->functionCoverageData = $functionCoverageData; - $this->testData = $testData; - $this->linesOfCode = $linesOfCode; - - $this->calculateStatistics($classes, $traits, $functions); - } - - public function count(): int - { - return 1; - } - - /** - * @psalm-return array<int, ?list<non-empty-string>> - */ - public function lineCoverageData(): array - { - return $this->lineCoverageData; - } - - public function functionCoverageData(): array - { - return $this->functionCoverageData; - } - - public function testData(): array - { - return $this->testData; - } - - public function classes(): array - { - return $this->classes; - } - - public function traits(): array - { - return $this->traits; - } - - public function functions(): array - { - return $this->functions; - } - - public function linesOfCode(): array - { - return $this->linesOfCode; - } - - public function numberOfExecutableLines(): int - { - return $this->numExecutableLines; - } - - public function numberOfExecutedLines(): int - { - return $this->numExecutedLines; - } - - public function numberOfExecutableBranches(): int - { - return $this->numExecutableBranches; - } - - public function numberOfExecutedBranches(): int - { - return $this->numExecutedBranches; - } - - public function numberOfExecutablePaths(): int - { - return $this->numExecutablePaths; - } - - public function numberOfExecutedPaths(): int - { - return $this->numExecutedPaths; - } - - public function numberOfClasses(): int - { - if ($this->numClasses === null) { - $this->numClasses = 0; - - foreach ($this->classes as $class) { - foreach ($class['methods'] as $method) { - if ($method['executableLines'] > 0) { - $this->numClasses++; - - continue 2; - } - } - } - } - - return $this->numClasses; - } - - public function numberOfTestedClasses(): int - { - return $this->numTestedClasses; - } - - public function numberOfTraits(): int - { - if ($this->numTraits === null) { - $this->numTraits = 0; - - foreach ($this->traits as $trait) { - foreach ($trait['methods'] as $method) { - if ($method['executableLines'] > 0) { - $this->numTraits++; - - continue 2; - } - } - } - } - - return $this->numTraits; - } - - public function numberOfTestedTraits(): int - { - return $this->numTestedTraits; - } - - public function numberOfMethods(): int - { - if ($this->numMethods === null) { - $this->numMethods = 0; - - foreach ($this->classes as $class) { - foreach ($class['methods'] as $method) { - if ($method['executableLines'] > 0) { - $this->numMethods++; - } - } - } - - foreach ($this->traits as $trait) { - foreach ($trait['methods'] as $method) { - if ($method['executableLines'] > 0) { - $this->numMethods++; - } - } - } - } - - return $this->numMethods; - } - - public function numberOfTestedMethods(): int - { - if ($this->numTestedMethods === null) { - $this->numTestedMethods = 0; - - foreach ($this->classes as $class) { - foreach ($class['methods'] as $method) { - if ($method['executableLines'] > 0 && - $method['coverage'] === 100) { - $this->numTestedMethods++; - } - } - } - - foreach ($this->traits as $trait) { - foreach ($trait['methods'] as $method) { - if ($method['executableLines'] > 0 && - $method['coverage'] === 100) { - $this->numTestedMethods++; - } - } - } - } - - return $this->numTestedMethods; - } - - public function numberOfFunctions(): int - { - return count($this->functions); - } - - public function numberOfTestedFunctions(): int - { - if ($this->numTestedFunctions === null) { - $this->numTestedFunctions = 0; - - foreach ($this->functions as $function) { - if ($function['executableLines'] > 0 && - $function['coverage'] === 100) { - $this->numTestedFunctions++; - } - } - } - - return $this->numTestedFunctions; - } - - /** - * @psalm-param array<string, CodeUnitClassType> $classes - * @psalm-param array<string, CodeUnitTraitType> $traits - * @psalm-param array<string, CodeUnitFunctionType> $functions - */ - private function calculateStatistics(array $classes, array $traits, array $functions): void - { - foreach (range(1, $this->linesOfCode['linesOfCode']) as $lineNumber) { - $this->codeUnitsByLine[$lineNumber] = []; - } - - $this->processClasses($classes); - $this->processTraits($traits); - $this->processFunctions($functions); - - foreach (range(1, $this->linesOfCode['linesOfCode']) as $lineNumber) { - if (isset($this->lineCoverageData[$lineNumber])) { - foreach ($this->codeUnitsByLine[$lineNumber] as &$codeUnit) { - $codeUnit['executableLines']++; - } - - unset($codeUnit); - - $this->numExecutableLines++; - - if (count($this->lineCoverageData[$lineNumber]) > 0) { - foreach ($this->codeUnitsByLine[$lineNumber] as &$codeUnit) { - $codeUnit['executedLines']++; - } - - unset($codeUnit); - - $this->numExecutedLines++; - } - } - } - - foreach ($this->traits as &$trait) { - foreach ($trait['methods'] as &$method) { - $methodLineCoverage = $method['executableLines'] ? ($method['executedLines'] / $method['executableLines']) * 100 : 100; - $methodBranchCoverage = $method['executableBranches'] ? ($method['executedBranches'] / $method['executableBranches']) * 100 : 0; - $methodPathCoverage = $method['executablePaths'] ? ($method['executedPaths'] / $method['executablePaths']) * 100 : 0; - - $method['coverage'] = $methodBranchCoverage ?: $methodLineCoverage; - $method['crap'] = (new CrapIndex($method['ccn'], $methodPathCoverage ?: $methodLineCoverage))->asString(); - - $trait['ccn'] += $method['ccn']; - } - - unset($method); - - $traitLineCoverage = $trait['executableLines'] ? ($trait['executedLines'] / $trait['executableLines']) * 100 : 100; - $traitBranchCoverage = $trait['executableBranches'] ? ($trait['executedBranches'] / $trait['executableBranches']) * 100 : 0; - $traitPathCoverage = $trait['executablePaths'] ? ($trait['executedPaths'] / $trait['executablePaths']) * 100 : 0; - - $trait['coverage'] = $traitBranchCoverage ?: $traitLineCoverage; - $trait['crap'] = (new CrapIndex($trait['ccn'], $traitPathCoverage ?: $traitLineCoverage))->asString(); - - if ($trait['executableLines'] > 0 && $trait['coverage'] === 100) { - $this->numTestedClasses++; - } - } - - unset($trait); - - foreach ($this->classes as &$class) { - foreach ($class['methods'] as &$method) { - $methodLineCoverage = $method['executableLines'] ? ($method['executedLines'] / $method['executableLines']) * 100 : 100; - $methodBranchCoverage = $method['executableBranches'] ? ($method['executedBranches'] / $method['executableBranches']) * 100 : 0; - $methodPathCoverage = $method['executablePaths'] ? ($method['executedPaths'] / $method['executablePaths']) * 100 : 0; - - $method['coverage'] = $methodBranchCoverage ?: $methodLineCoverage; - $method['crap'] = (new CrapIndex($method['ccn'], $methodPathCoverage ?: $methodLineCoverage))->asString(); - - $class['ccn'] += $method['ccn']; - } - - unset($method); - - $classLineCoverage = $class['executableLines'] ? ($class['executedLines'] / $class['executableLines']) * 100 : 100; - $classBranchCoverage = $class['executableBranches'] ? ($class['executedBranches'] / $class['executableBranches']) * 100 : 0; - $classPathCoverage = $class['executablePaths'] ? ($class['executedPaths'] / $class['executablePaths']) * 100 : 0; - - $class['coverage'] = $classBranchCoverage ?: $classLineCoverage; - $class['crap'] = (new CrapIndex($class['ccn'], $classPathCoverage ?: $classLineCoverage))->asString(); - - if ($class['executableLines'] > 0 && $class['coverage'] === 100) { - $this->numTestedClasses++; - } - } - - unset($class); - - foreach ($this->functions as &$function) { - $functionLineCoverage = $function['executableLines'] ? ($function['executedLines'] / $function['executableLines']) * 100 : 100; - $functionBranchCoverage = $function['executableBranches'] ? ($function['executedBranches'] / $function['executableBranches']) * 100 : 0; - $functionPathCoverage = $function['executablePaths'] ? ($function['executedPaths'] / $function['executablePaths']) * 100 : 0; - - $function['coverage'] = $functionBranchCoverage ?: $functionLineCoverage; - $function['crap'] = (new CrapIndex($function['ccn'], $functionPathCoverage ?: $functionLineCoverage))->asString(); - - if ($function['coverage'] === 100) { - $this->numTestedFunctions++; - } - } - } - - /** - * @psalm-param array<string, CodeUnitClassType> $classes - */ - private function processClasses(array $classes): void - { - $link = $this->id() . '.html#'; - - foreach ($classes as $className => $class) { - $this->classes[$className] = [ - 'className' => $className, - 'namespace' => $class['namespace'], - 'methods' => [], - 'startLine' => $class['startLine'], - 'executableLines' => 0, - 'executedLines' => 0, - 'executableBranches' => 0, - 'executedBranches' => 0, - 'executablePaths' => 0, - 'executedPaths' => 0, - 'ccn' => 0, - 'coverage' => 0, - 'crap' => 0, - 'link' => $link . $class['startLine'], - ]; - - foreach ($class['methods'] as $methodName => $method) { - $methodData = $this->newMethod($className, $methodName, $method, $link); - $this->classes[$className]['methods'][$methodName] = $methodData; - - $this->classes[$className]['executableBranches'] += $methodData['executableBranches']; - $this->classes[$className]['executedBranches'] += $methodData['executedBranches']; - $this->classes[$className]['executablePaths'] += $methodData['executablePaths']; - $this->classes[$className]['executedPaths'] += $methodData['executedPaths']; - - $this->numExecutableBranches += $methodData['executableBranches']; - $this->numExecutedBranches += $methodData['executedBranches']; - $this->numExecutablePaths += $methodData['executablePaths']; - $this->numExecutedPaths += $methodData['executedPaths']; - - foreach (range($method['startLine'], $method['endLine']) as $lineNumber) { - $this->codeUnitsByLine[$lineNumber] = [ - &$this->classes[$className], - &$this->classes[$className]['methods'][$methodName], - ]; - } - } - } - } - - /** - * @psalm-param array<string, CodeUnitTraitType> $traits - */ - private function processTraits(array $traits): void - { - $link = $this->id() . '.html#'; - - foreach ($traits as $traitName => $trait) { - $this->traits[$traitName] = [ - 'traitName' => $traitName, - 'namespace' => $trait['namespace'], - 'methods' => [], - 'startLine' => $trait['startLine'], - 'executableLines' => 0, - 'executedLines' => 0, - 'executableBranches' => 0, - 'executedBranches' => 0, - 'executablePaths' => 0, - 'executedPaths' => 0, - 'ccn' => 0, - 'coverage' => 0, - 'crap' => 0, - 'link' => $link . $trait['startLine'], - ]; - - foreach ($trait['methods'] as $methodName => $method) { - $methodData = $this->newMethod($traitName, $methodName, $method, $link); - $this->traits[$traitName]['methods'][$methodName] = $methodData; - - $this->traits[$traitName]['executableBranches'] += $methodData['executableBranches']; - $this->traits[$traitName]['executedBranches'] += $methodData['executedBranches']; - $this->traits[$traitName]['executablePaths'] += $methodData['executablePaths']; - $this->traits[$traitName]['executedPaths'] += $methodData['executedPaths']; - - $this->numExecutableBranches += $methodData['executableBranches']; - $this->numExecutedBranches += $methodData['executedBranches']; - $this->numExecutablePaths += $methodData['executablePaths']; - $this->numExecutedPaths += $methodData['executedPaths']; - - foreach (range($method['startLine'], $method['endLine']) as $lineNumber) { - $this->codeUnitsByLine[$lineNumber] = [ - &$this->traits[$traitName], - &$this->traits[$traitName]['methods'][$methodName], - ]; - } - } - } - } - - /** - * @psalm-param array<string, CodeUnitFunctionType> $functions - */ - private function processFunctions(array $functions): void - { - $link = $this->id() . '.html#'; - - foreach ($functions as $functionName => $function) { - $this->functions[$functionName] = [ - 'functionName' => $functionName, - 'namespace' => $function['namespace'], - 'signature' => $function['signature'], - 'startLine' => $function['startLine'], - 'endLine' => $function['endLine'], - 'executableLines' => 0, - 'executedLines' => 0, - 'executableBranches' => 0, - 'executedBranches' => 0, - 'executablePaths' => 0, - 'executedPaths' => 0, - 'ccn' => $function['ccn'], - 'coverage' => 0, - 'crap' => 0, - 'link' => $link . $function['startLine'], - ]; - - foreach (range($function['startLine'], $function['endLine']) as $lineNumber) { - $this->codeUnitsByLine[$lineNumber] = [&$this->functions[$functionName]]; - } - - if (isset($this->functionCoverageData[$functionName]['branches'])) { - $this->functions[$functionName]['executableBranches'] = count( - $this->functionCoverageData[$functionName]['branches'], - ); - - $this->functions[$functionName]['executedBranches'] = count( - array_filter( - $this->functionCoverageData[$functionName]['branches'], - static function (array $branch) - { - return (bool) $branch['hit']; - }, - ), - ); - } - - if (isset($this->functionCoverageData[$functionName]['paths'])) { - $this->functions[$functionName]['executablePaths'] = count( - $this->functionCoverageData[$functionName]['paths'], - ); - - $this->functions[$functionName]['executedPaths'] = count( - array_filter( - $this->functionCoverageData[$functionName]['paths'], - static function (array $path) - { - return (bool) $path['hit']; - }, - ), - ); - } - - $this->numExecutableBranches += $this->functions[$functionName]['executableBranches']; - $this->numExecutedBranches += $this->functions[$functionName]['executedBranches']; - $this->numExecutablePaths += $this->functions[$functionName]['executablePaths']; - $this->numExecutedPaths += $this->functions[$functionName]['executedPaths']; - } - } - - /** - * @psalm-param CodeUnitMethodType $method - * - * @psalm-return ProcessedMethodType - */ - private function newMethod(string $className, string $methodName, array $method, string $link): array - { - $methodData = [ - 'methodName' => $methodName, - 'visibility' => $method['visibility'], - 'signature' => $method['signature'], - 'startLine' => $method['startLine'], - 'endLine' => $method['endLine'], - 'executableLines' => 0, - 'executedLines' => 0, - 'executableBranches' => 0, - 'executedBranches' => 0, - 'executablePaths' => 0, - 'executedPaths' => 0, - 'ccn' => $method['ccn'], - 'coverage' => 0, - 'crap' => 0, - 'link' => $link . $method['startLine'], - ]; - - $key = $className . '->' . $methodName; - - if (isset($this->functionCoverageData[$key]['branches'])) { - $methodData['executableBranches'] = count( - $this->functionCoverageData[$key]['branches'], - ); - - $methodData['executedBranches'] = count( - array_filter( - $this->functionCoverageData[$key]['branches'], - static function (array $branch) - { - return (bool) $branch['hit']; - }, - ), - ); - } - - if (isset($this->functionCoverageData[$key]['paths'])) { - $methodData['executablePaths'] = count( - $this->functionCoverageData[$key]['paths'], - ); - - $methodData['executedPaths'] = count( - array_filter( - $this->functionCoverageData[$key]['paths'], - static function (array $path) - { - return (bool) $path['hit']; - }, - ), - ); - } - - return $methodData; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Node/Iterator.php b/vendor/phpunit/php-code-coverage/src/Node/Iterator.php deleted file mode 100644 index b110d46..0000000 --- a/vendor/phpunit/php-code-coverage/src/Node/Iterator.php +++ /dev/null @@ -1,87 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Node; - -use function count; -use RecursiveIterator; - -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage - */ -final class Iterator implements RecursiveIterator -{ - private int $position; - - /** - * @var list<AbstractNode> - */ - private readonly array $nodes; - - public function __construct(Directory $node) - { - $this->nodes = $node->children(); - } - - /** - * Rewinds the Iterator to the first element. - */ - public function rewind(): void - { - $this->position = 0; - } - - /** - * Checks if there is a current element after calls to rewind() or next(). - */ - public function valid(): bool - { - return $this->position < count($this->nodes); - } - - /** - * Returns the key of the current element. - */ - public function key(): int - { - return $this->position; - } - - /** - * Returns the current element. - */ - public function current(): ?AbstractNode - { - return $this->valid() ? $this->nodes[$this->position] : null; - } - - /** - * Moves forward to next element. - */ - public function next(): void - { - $this->position++; - } - - /** - * Returns the sub iterator for the current element. - */ - public function getChildren(): self - { - return new self($this->nodes[$this->position]); - } - - /** - * Checks whether the current element has children. - */ - public function hasChildren(): bool - { - return $this->nodes[$this->position] instanceof Directory; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Clover.php b/vendor/phpunit/php-code-coverage/src/Report/Clover.php deleted file mode 100644 index 8a24236..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Clover.php +++ /dev/null @@ -1,258 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report; - -use function count; -use function dirname; -use function file_put_contents; -use function is_string; -use function ksort; -use function max; -use function range; -use function str_contains; -use function time; -use DOMDocument; -use SebastianBergmann\CodeCoverage\CodeCoverage; -use SebastianBergmann\CodeCoverage\Driver\WriteOperationFailedException; -use SebastianBergmann\CodeCoverage\Node\File; -use SebastianBergmann\CodeCoverage\Util\Filesystem; - -final class Clover -{ - /** - * @throws WriteOperationFailedException - */ - public function process(CodeCoverage $coverage, ?string $target = null, ?string $name = null): string - { - $time = (string) time(); - - $xmlDocument = new DOMDocument('1.0', 'UTF-8'); - $xmlDocument->formatOutput = true; - - $xmlCoverage = $xmlDocument->createElement('coverage'); - $xmlCoverage->setAttribute('generated', $time); - $xmlDocument->appendChild($xmlCoverage); - - $xmlProject = $xmlDocument->createElement('project'); - $xmlProject->setAttribute('timestamp', $time); - - if (is_string($name)) { - $xmlProject->setAttribute('name', $name); - } - - $xmlCoverage->appendChild($xmlProject); - - $packages = []; - $report = $coverage->getReport(); - - foreach ($report as $item) { - if (!$item instanceof File) { - continue; - } - - /* @var File $item */ - - $xmlFile = $xmlDocument->createElement('file'); - $xmlFile->setAttribute('name', $item->pathAsString()); - - $classes = $item->classesAndTraits(); - $coverageData = $item->lineCoverageData(); - $lines = []; - $namespace = 'global'; - - foreach ($classes as $className => $class) { - $classStatements = 0; - $coveredClassStatements = 0; - $coveredMethods = 0; - $classMethods = 0; - - foreach ($class['methods'] as $methodName => $method) { - if ($method['executableLines'] == 0) { - continue; - } - - $classMethods++; - $classStatements += $method['executableLines']; - $coveredClassStatements += $method['executedLines']; - - if ($method['coverage'] == 100) { - $coveredMethods++; - } - - $methodCount = 0; - - foreach (range($method['startLine'], $method['endLine']) as $line) { - if (isset($coverageData[$line])) { - $methodCount = max($methodCount, count($coverageData[$line])); - } - } - - $lines[$method['startLine']] = [ - 'ccn' => $method['ccn'], - 'count' => $methodCount, - 'crap' => $method['crap'], - 'type' => 'method', - 'visibility' => $method['visibility'], - 'name' => $methodName, - ]; - } - - if (!empty($class['package']['namespace'])) { - $namespace = $class['package']['namespace']; - } - - $xmlClass = $xmlDocument->createElement('class'); - $xmlClass->setAttribute('name', $className); - $xmlClass->setAttribute('namespace', $namespace); - - if (!empty($class['package']['fullPackage'])) { - $xmlClass->setAttribute( - 'fullPackage', - $class['package']['fullPackage'], - ); - } - - if (!empty($class['package']['category'])) { - $xmlClass->setAttribute( - 'category', - $class['package']['category'], - ); - } - - if (!empty($class['package']['package'])) { - $xmlClass->setAttribute( - 'package', - $class['package']['package'], - ); - } - - if (!empty($class['package']['subpackage'])) { - $xmlClass->setAttribute( - 'subpackage', - $class['package']['subpackage'], - ); - } - - $xmlFile->appendChild($xmlClass); - - $xmlMetrics = $xmlDocument->createElement('metrics'); - $xmlMetrics->setAttribute('complexity', (string) $class['ccn']); - $xmlMetrics->setAttribute('methods', (string) $classMethods); - $xmlMetrics->setAttribute('coveredmethods', (string) $coveredMethods); - $xmlMetrics->setAttribute('conditionals', (string) $class['executableBranches']); - $xmlMetrics->setAttribute('coveredconditionals', (string) $class['executedBranches']); - $xmlMetrics->setAttribute('statements', (string) $classStatements); - $xmlMetrics->setAttribute('coveredstatements', (string) $coveredClassStatements); - $xmlMetrics->setAttribute('elements', (string) ($classMethods + $classStatements + $class['executableBranches'])); - $xmlMetrics->setAttribute('coveredelements', (string) ($coveredMethods + $coveredClassStatements + $class['executedBranches'])); - $xmlClass->appendChild($xmlMetrics); - } - - foreach ($coverageData as $line => $data) { - if ($data === null || isset($lines[$line])) { - continue; - } - - $lines[$line] = [ - 'count' => count($data), 'type' => 'stmt', - ]; - } - - ksort($lines); - - foreach ($lines as $line => $data) { - $xmlLine = $xmlDocument->createElement('line'); - $xmlLine->setAttribute('num', (string) $line); - $xmlLine->setAttribute('type', $data['type']); - - if (isset($data['name'])) { - $xmlLine->setAttribute('name', $data['name']); - } - - if (isset($data['visibility'])) { - $xmlLine->setAttribute('visibility', $data['visibility']); - } - - if (isset($data['ccn'])) { - $xmlLine->setAttribute('complexity', (string) $data['ccn']); - } - - if (isset($data['crap'])) { - $xmlLine->setAttribute('crap', (string) $data['crap']); - } - - $xmlLine->setAttribute('count', (string) $data['count']); - $xmlFile->appendChild($xmlLine); - } - - $linesOfCode = $item->linesOfCode(); - - $xmlMetrics = $xmlDocument->createElement('metrics'); - $xmlMetrics->setAttribute('loc', (string) $linesOfCode['linesOfCode']); - $xmlMetrics->setAttribute('ncloc', (string) $linesOfCode['nonCommentLinesOfCode']); - $xmlMetrics->setAttribute('classes', (string) $item->numberOfClassesAndTraits()); - $xmlMetrics->setAttribute('methods', (string) $item->numberOfMethods()); - $xmlMetrics->setAttribute('coveredmethods', (string) $item->numberOfTestedMethods()); - $xmlMetrics->setAttribute('conditionals', (string) $item->numberOfExecutableBranches()); - $xmlMetrics->setAttribute('coveredconditionals', (string) $item->numberOfExecutedBranches()); - $xmlMetrics->setAttribute('statements', (string) $item->numberOfExecutableLines()); - $xmlMetrics->setAttribute('coveredstatements', (string) $item->numberOfExecutedLines()); - $xmlMetrics->setAttribute('elements', (string) ($item->numberOfMethods() + $item->numberOfExecutableLines() + $item->numberOfExecutableBranches())); - $xmlMetrics->setAttribute('coveredelements', (string) ($item->numberOfTestedMethods() + $item->numberOfExecutedLines() + $item->numberOfExecutedBranches())); - $xmlFile->appendChild($xmlMetrics); - - if ($namespace === 'global') { - $xmlProject->appendChild($xmlFile); - } else { - if (!isset($packages[$namespace])) { - $packages[$namespace] = $xmlDocument->createElement( - 'package', - ); - - $packages[$namespace]->setAttribute('name', $namespace); - $xmlProject->appendChild($packages[$namespace]); - } - - $packages[$namespace]->appendChild($xmlFile); - } - } - - $linesOfCode = $report->linesOfCode(); - - $xmlMetrics = $xmlDocument->createElement('metrics'); - $xmlMetrics->setAttribute('files', (string) count($report)); - $xmlMetrics->setAttribute('loc', (string) $linesOfCode['linesOfCode']); - $xmlMetrics->setAttribute('ncloc', (string) $linesOfCode['nonCommentLinesOfCode']); - $xmlMetrics->setAttribute('classes', (string) $report->numberOfClassesAndTraits()); - $xmlMetrics->setAttribute('methods', (string) $report->numberOfMethods()); - $xmlMetrics->setAttribute('coveredmethods', (string) $report->numberOfTestedMethods()); - $xmlMetrics->setAttribute('conditionals', (string) $report->numberOfExecutableBranches()); - $xmlMetrics->setAttribute('coveredconditionals', (string) $report->numberOfExecutedBranches()); - $xmlMetrics->setAttribute('statements', (string) $report->numberOfExecutableLines()); - $xmlMetrics->setAttribute('coveredstatements', (string) $report->numberOfExecutedLines()); - $xmlMetrics->setAttribute('elements', (string) ($report->numberOfMethods() + $report->numberOfExecutableLines() + $report->numberOfExecutableBranches())); - $xmlMetrics->setAttribute('coveredelements', (string) ($report->numberOfTestedMethods() + $report->numberOfExecutedLines() + $report->numberOfExecutedBranches())); - $xmlProject->appendChild($xmlMetrics); - - $buffer = $xmlDocument->saveXML(); - - if ($target !== null) { - if (!str_contains($target, '://')) { - Filesystem::createDirectory(dirname($target)); - } - - if (@file_put_contents($target, $buffer) === false) { - throw new WriteOperationFailedException($target); - } - } - - return $buffer; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Cobertura.php b/vendor/phpunit/php-code-coverage/src/Report/Cobertura.php deleted file mode 100644 index 7ff5582..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Cobertura.php +++ /dev/null @@ -1,309 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report; - -use function basename; -use function count; -use function dirname; -use function file_put_contents; -use function preg_match; -use function range; -use function str_contains; -use function str_replace; -use function time; -use DOMImplementation; -use SebastianBergmann\CodeCoverage\CodeCoverage; -use SebastianBergmann\CodeCoverage\Driver\WriteOperationFailedException; -use SebastianBergmann\CodeCoverage\Node\File; -use SebastianBergmann\CodeCoverage\Util\Filesystem; - -final class Cobertura -{ - /** - * @throws WriteOperationFailedException - */ - public function process(CodeCoverage $coverage, ?string $target = null): string - { - $time = (string) time(); - - $report = $coverage->getReport(); - - $implementation = new DOMImplementation; - - $documentType = $implementation->createDocumentType( - 'coverage', - '', - 'http://cobertura.sourceforge.net/xml/coverage-04.dtd', - ); - - $document = $implementation->createDocument('', '', $documentType); - $document->xmlVersion = '1.0'; - $document->encoding = 'UTF-8'; - $document->formatOutput = true; - - $coverageElement = $document->createElement('coverage'); - - $linesValid = $report->numberOfExecutableLines(); - $linesCovered = $report->numberOfExecutedLines(); - $lineRate = $linesValid === 0 ? 0 : ($linesCovered / $linesValid); - $coverageElement->setAttribute('line-rate', (string) $lineRate); - - $branchesValid = $report->numberOfExecutableBranches(); - $branchesCovered = $report->numberOfExecutedBranches(); - $branchRate = $branchesValid === 0 ? 0 : ($branchesCovered / $branchesValid); - $coverageElement->setAttribute('branch-rate', (string) $branchRate); - - $coverageElement->setAttribute('lines-covered', (string) $report->numberOfExecutedLines()); - $coverageElement->setAttribute('lines-valid', (string) $report->numberOfExecutableLines()); - $coverageElement->setAttribute('branches-covered', (string) $report->numberOfExecutedBranches()); - $coverageElement->setAttribute('branches-valid', (string) $report->numberOfExecutableBranches()); - $coverageElement->setAttribute('complexity', ''); - $coverageElement->setAttribute('version', '0.4'); - $coverageElement->setAttribute('timestamp', $time); - - $document->appendChild($coverageElement); - - $sourcesElement = $document->createElement('sources'); - $coverageElement->appendChild($sourcesElement); - - $sourceElement = $document->createElement('source', $report->pathAsString()); - $sourcesElement->appendChild($sourceElement); - - $packagesElement = $document->createElement('packages'); - $coverageElement->appendChild($packagesElement); - - $complexity = 0; - - foreach ($report as $item) { - if (!$item instanceof File) { - continue; - } - - $packageElement = $document->createElement('package'); - $packageComplexity = 0; - - $packageElement->setAttribute('name', str_replace($report->pathAsString() . DIRECTORY_SEPARATOR, '', $item->pathAsString())); - - $linesValid = $item->numberOfExecutableLines(); - $linesCovered = $item->numberOfExecutedLines(); - $lineRate = $linesValid === 0 ? 0 : ($linesCovered / $linesValid); - - $packageElement->setAttribute('line-rate', (string) $lineRate); - - $branchesValid = $item->numberOfExecutableBranches(); - $branchesCovered = $item->numberOfExecutedBranches(); - $branchRate = $branchesValid === 0 ? 0 : ($branchesCovered / $branchesValid); - - $packageElement->setAttribute('branch-rate', (string) $branchRate); - - $packageElement->setAttribute('complexity', ''); - $packagesElement->appendChild($packageElement); - - $classesElement = $document->createElement('classes'); - - $packageElement->appendChild($classesElement); - - $classes = $item->classesAndTraits(); - $coverageData = $item->lineCoverageData(); - - foreach ($classes as $className => $class) { - $complexity += $class['ccn']; - $packageComplexity += $class['ccn']; - - if (!empty($class['package']['namespace'])) { - $className = $class['package']['namespace'] . '\\' . $className; - } - - $linesValid = $class['executableLines']; - $linesCovered = $class['executedLines']; - $lineRate = $linesValid === 0 ? 0 : ($linesCovered / $linesValid); - - $branchesValid = $class['executableBranches']; - $branchesCovered = $class['executedBranches']; - $branchRate = $branchesValid === 0 ? 0 : ($branchesCovered / $branchesValid); - - $classElement = $document->createElement('class'); - - $classElement->setAttribute('name', $className); - $classElement->setAttribute('filename', str_replace($report->pathAsString() . DIRECTORY_SEPARATOR, '', $item->pathAsString())); - $classElement->setAttribute('line-rate', (string) $lineRate); - $classElement->setAttribute('branch-rate', (string) $branchRate); - $classElement->setAttribute('complexity', (string) $class['ccn']); - - $classesElement->appendChild($classElement); - - $methodsElement = $document->createElement('methods'); - - $classElement->appendChild($methodsElement); - - $classLinesElement = $document->createElement('lines'); - - $classElement->appendChild($classLinesElement); - - foreach ($class['methods'] as $methodName => $method) { - if ($method['executableLines'] === 0) { - continue; - } - - preg_match("/\((.*?)\)/", $method['signature'], $signature); - - $linesValid = $method['executableLines']; - $linesCovered = $method['executedLines']; - $lineRate = $linesValid === 0 ? 0 : ($linesCovered / $linesValid); - - $branchesValid = $method['executableBranches']; - $branchesCovered = $method['executedBranches']; - $branchRate = $branchesValid === 0 ? 0 : ($branchesCovered / $branchesValid); - - $methodElement = $document->createElement('method'); - - $methodElement->setAttribute('name', $methodName); - $methodElement->setAttribute('signature', $signature[1]); - $methodElement->setAttribute('line-rate', (string) $lineRate); - $methodElement->setAttribute('branch-rate', (string) $branchRate); - $methodElement->setAttribute('complexity', (string) $method['ccn']); - - $methodLinesElement = $document->createElement('lines'); - - $methodElement->appendChild($methodLinesElement); - - foreach (range($method['startLine'], $method['endLine']) as $line) { - if (!isset($coverageData[$line])) { - continue; - } - $methodLineElement = $document->createElement('line'); - - $methodLineElement->setAttribute('number', (string) $line); - $methodLineElement->setAttribute('hits', (string) count($coverageData[$line])); - - $methodLinesElement->appendChild($methodLineElement); - - $classLineElement = $methodLineElement->cloneNode(); - - $classLinesElement->appendChild($classLineElement); - } - - $methodsElement->appendChild($methodElement); - } - } - - if ($item->numberOfFunctions() === 0) { - $packageElement->setAttribute('complexity', (string) $packageComplexity); - - continue; - } - - $functionsComplexity = 0; - $functionsLinesValid = 0; - $functionsLinesCovered = 0; - $functionsBranchesValid = 0; - $functionsBranchesCovered = 0; - - $classElement = $document->createElement('class'); - $classElement->setAttribute('name', basename($item->pathAsString())); - $classElement->setAttribute('filename', str_replace($report->pathAsString() . DIRECTORY_SEPARATOR, '', $item->pathAsString())); - - $methodsElement = $document->createElement('methods'); - - $classElement->appendChild($methodsElement); - - $classLinesElement = $document->createElement('lines'); - - $classElement->appendChild($classLinesElement); - - $functions = $item->functions(); - - foreach ($functions as $functionName => $function) { - if ($function['executableLines'] === 0) { - continue; - } - - $complexity += $function['ccn']; - $packageComplexity += $function['ccn']; - $functionsComplexity += $function['ccn']; - - $linesValid = $function['executableLines']; - $linesCovered = $function['executedLines']; - $lineRate = $linesValid === 0 ? 0 : ($linesCovered / $linesValid); - - $functionsLinesValid += $linesValid; - $functionsLinesCovered += $linesCovered; - - $branchesValid = $function['executableBranches']; - $branchesCovered = $function['executedBranches']; - $branchRate = $branchesValid === 0 ? 0 : ($branchesCovered / $branchesValid); - - $functionsBranchesValid += $branchesValid; - $functionsBranchesCovered += $branchesValid; - - $methodElement = $document->createElement('method'); - - $methodElement->setAttribute('name', $functionName); - $methodElement->setAttribute('signature', $function['signature']); - $methodElement->setAttribute('line-rate', (string) $lineRate); - $methodElement->setAttribute('branch-rate', (string) $branchRate); - $methodElement->setAttribute('complexity', (string) $function['ccn']); - - $methodLinesElement = $document->createElement('lines'); - - $methodElement->appendChild($methodLinesElement); - - foreach (range($function['startLine'], $function['endLine']) as $line) { - if (!isset($coverageData[$line])) { - continue; - } - $methodLineElement = $document->createElement('line'); - - $methodLineElement->setAttribute('number', (string) $line); - $methodLineElement->setAttribute('hits', (string) count($coverageData[$line])); - - $methodLinesElement->appendChild($methodLineElement); - - $classLineElement = $methodLineElement->cloneNode(); - - $classLinesElement->appendChild($classLineElement); - } - - $methodsElement->appendChild($methodElement); - } - - $packageElement->setAttribute('complexity', (string) $packageComplexity); - - if ($functionsLinesValid === 0) { - continue; - } - - $lineRate = $functionsLinesCovered / $functionsLinesValid; - $branchRate = $functionsBranchesValid === 0 ? 0 : ($functionsBranchesCovered / $functionsBranchesValid); - - $classElement->setAttribute('line-rate', (string) $lineRate); - $classElement->setAttribute('branch-rate', (string) $branchRate); - $classElement->setAttribute('complexity', (string) $functionsComplexity); - - $classesElement->appendChild($classElement); - } - - $coverageElement->setAttribute('complexity', (string) $complexity); - - $buffer = $document->saveXML(); - - if ($target !== null) { - if (!str_contains($target, '://')) { - Filesystem::createDirectory(dirname($target)); - } - - if (@file_put_contents($target, $buffer) === false) { - throw new WriteOperationFailedException($target); - } - } - - return $buffer; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Crap4j.php b/vendor/phpunit/php-code-coverage/src/Report/Crap4j.php deleted file mode 100644 index cb1bde6..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Crap4j.php +++ /dev/null @@ -1,153 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report; - -use function date; -use function dirname; -use function file_put_contents; -use function htmlspecialchars; -use function is_string; -use function round; -use function str_contains; -use DOMDocument; -use SebastianBergmann\CodeCoverage\CodeCoverage; -use SebastianBergmann\CodeCoverage\Driver\WriteOperationFailedException; -use SebastianBergmann\CodeCoverage\Node\File; -use SebastianBergmann\CodeCoverage\Util\Filesystem; - -final class Crap4j -{ - private readonly int $threshold; - - public function __construct(int $threshold = 30) - { - $this->threshold = $threshold; - } - - /** - * @throws WriteOperationFailedException - */ - public function process(CodeCoverage $coverage, ?string $target = null, ?string $name = null): string - { - $document = new DOMDocument('1.0', 'UTF-8'); - $document->formatOutput = true; - - $root = $document->createElement('crap_result'); - $document->appendChild($root); - - $project = $document->createElement('project', is_string($name) ? $name : ''); - $root->appendChild($project); - $root->appendChild($document->createElement('timestamp', date('Y-m-d H:i:s'))); - - $stats = $document->createElement('stats'); - $methodsNode = $document->createElement('methods'); - - $report = $coverage->getReport(); - unset($coverage); - - $fullMethodCount = 0; - $fullCrapMethodCount = 0; - $fullCrapLoad = 0; - $fullCrap = 0; - - foreach ($report as $item) { - $namespace = 'global'; - - if (!$item instanceof File) { - continue; - } - - $file = $document->createElement('file'); - $file->setAttribute('name', $item->pathAsString()); - - $classes = $item->classesAndTraits(); - - foreach ($classes as $className => $class) { - foreach ($class['methods'] as $methodName => $method) { - $crapLoad = $this->crapLoad((float) $method['crap'], $method['ccn'], $method['coverage']); - - $fullCrap += $method['crap']; - $fullCrapLoad += $crapLoad; - $fullMethodCount++; - - if ($method['crap'] >= $this->threshold) { - $fullCrapMethodCount++; - } - - $methodNode = $document->createElement('method'); - - if (!empty($class['namespace'])) { - $namespace = $class['namespace']; - } - - $methodNode->appendChild($document->createElement('package', $namespace)); - $methodNode->appendChild($document->createElement('className', $className)); - $methodNode->appendChild($document->createElement('methodName', $methodName)); - $methodNode->appendChild($document->createElement('methodSignature', htmlspecialchars($method['signature']))); - $methodNode->appendChild($document->createElement('fullMethod', htmlspecialchars($method['signature']))); - $methodNode->appendChild($document->createElement('crap', (string) $this->roundValue((float) $method['crap']))); - $methodNode->appendChild($document->createElement('complexity', (string) $method['ccn'])); - $methodNode->appendChild($document->createElement('coverage', (string) $this->roundValue($method['coverage']))); - $methodNode->appendChild($document->createElement('crapLoad', (string) round($crapLoad))); - - $methodsNode->appendChild($methodNode); - } - } - } - - $stats->appendChild($document->createElement('name', 'Method Crap Stats')); - $stats->appendChild($document->createElement('methodCount', (string) $fullMethodCount)); - $stats->appendChild($document->createElement('crapMethodCount', (string) $fullCrapMethodCount)); - $stats->appendChild($document->createElement('crapLoad', (string) round($fullCrapLoad))); - $stats->appendChild($document->createElement('totalCrap', (string) $fullCrap)); - - $crapMethodPercent = 0; - - if ($fullMethodCount > 0) { - $crapMethodPercent = $this->roundValue((100 * $fullCrapMethodCount) / $fullMethodCount); - } - - $stats->appendChild($document->createElement('crapMethodPercent', (string) $crapMethodPercent)); - - $root->appendChild($stats); - $root->appendChild($methodsNode); - - $buffer = $document->saveXML(); - - if ($target !== null) { - if (!str_contains($target, '://')) { - Filesystem::createDirectory(dirname($target)); - } - - if (@file_put_contents($target, $buffer) === false) { - throw new WriteOperationFailedException($target); - } - } - - return $buffer; - } - - private function crapLoad(float $crapValue, int $cyclomaticComplexity, float $coveragePercent): float - { - $crapLoad = 0; - - if ($crapValue >= $this->threshold) { - $crapLoad += $cyclomaticComplexity * (1.0 - $coveragePercent / 100); - $crapLoad += $cyclomaticComplexity / $this->threshold; - } - - return $crapLoad; - } - - private function roundValue(float $value): float - { - return round($value, 2); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Colors.php b/vendor/phpunit/php-code-coverage/src/Report/Html/Colors.php deleted file mode 100644 index 25ca903..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Colors.php +++ /dev/null @@ -1,66 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Html; - -/** - * @psalm-immutable - */ -final class Colors -{ - private readonly string $successLow; - private readonly string $successMedium; - private readonly string $successHigh; - private readonly string $warning; - private readonly string $danger; - - public static function default(): self - { - return new self('#dff0d8', '#c3e3b5', '#99cb84', '#fcf8e3', '#f2dede'); - } - - public static function from(string $successLow, string $successMedium, string $successHigh, string $warning, string $danger): self - { - return new self($successLow, $successMedium, $successHigh, $warning, $danger); - } - - private function __construct(string $successLow, string $successMedium, string $successHigh, string $warning, string $danger) - { - $this->successLow = $successLow; - $this->successMedium = $successMedium; - $this->successHigh = $successHigh; - $this->warning = $warning; - $this->danger = $danger; - } - - public function successLow(): string - { - return $this->successLow; - } - - public function successMedium(): string - { - return $this->successMedium; - } - - public function successHigh(): string - { - return $this->successHigh; - } - - public function warning(): string - { - return $this->warning; - } - - public function danger(): string - { - return $this->danger; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/CustomCssFile.php b/vendor/phpunit/php-code-coverage/src/Report/Html/CustomCssFile.php deleted file mode 100644 index 70a7230..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/CustomCssFile.php +++ /dev/null @@ -1,50 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Html; - -use function is_file; -use SebastianBergmann\CodeCoverage\InvalidArgumentException; - -/** - * @psalm-immutable - */ -final class CustomCssFile -{ - private readonly string $path; - - public static function default(): self - { - return new self(__DIR__ . '/Renderer/Template/css/custom.css'); - } - - /** - * @throws InvalidArgumentException - */ - public static function from(string $path): self - { - if (!is_file($path)) { - throw new InvalidArgumentException( - '$path does not exist', - ); - } - - return new self($path); - } - - private function __construct(string $path) - { - $this->path = $path; - } - - public function path(): string - { - return $this->path; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Facade.php b/vendor/phpunit/php-code-coverage/src/Report/Html/Facade.php deleted file mode 100644 index b376eb5..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Facade.php +++ /dev/null @@ -1,153 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Html; - -use const DIRECTORY_SEPARATOR; -use function copy; -use function date; -use function dirname; -use function str_ends_with; -use SebastianBergmann\CodeCoverage\CodeCoverage; -use SebastianBergmann\CodeCoverage\FileCouldNotBeWrittenException; -use SebastianBergmann\CodeCoverage\Node\Directory as DirectoryNode; -use SebastianBergmann\CodeCoverage\Report\Thresholds; -use SebastianBergmann\CodeCoverage\Util\Filesystem; -use SebastianBergmann\Template\Exception; -use SebastianBergmann\Template\Template; - -final class Facade -{ - private readonly string $templatePath; - private readonly string $generator; - private readonly Colors $colors; - private readonly Thresholds $thresholds; - private readonly CustomCssFile $customCssFile; - - public function __construct(string $generator = '', ?Colors $colors = null, ?Thresholds $thresholds = null, ?CustomCssFile $customCssFile = null) - { - $this->generator = $generator; - $this->colors = $colors ?? Colors::default(); - $this->thresholds = $thresholds ?? Thresholds::default(); - $this->customCssFile = $customCssFile ?? CustomCssFile::default(); - $this->templatePath = __DIR__ . '/Renderer/Template/'; - } - - public function process(CodeCoverage $coverage, string $target): void - { - $target = $this->directory($target); - $report = $coverage->getReport(); - $date = date('D M j G:i:s T Y'); - - $dashboard = new Dashboard( - $this->templatePath, - $this->generator, - $date, - $this->thresholds, - $coverage->collectsBranchAndPathCoverage(), - ); - - $directory = new Directory( - $this->templatePath, - $this->generator, - $date, - $this->thresholds, - $coverage->collectsBranchAndPathCoverage(), - ); - - $file = new File( - $this->templatePath, - $this->generator, - $date, - $this->thresholds, - $coverage->collectsBranchAndPathCoverage(), - ); - - $directory->render($report, $target . 'index.html'); - $dashboard->render($report, $target . 'dashboard.html'); - - foreach ($report as $node) { - $id = $node->id(); - - if ($node instanceof DirectoryNode) { - Filesystem::createDirectory($target . $id); - - $directory->render($node, $target . $id . '/index.html'); - $dashboard->render($node, $target . $id . '/dashboard.html'); - } else { - $dir = dirname($target . $id); - - Filesystem::createDirectory($dir); - - $file->render($node, $target . $id); - } - } - - $this->copyFiles($target); - $this->renderCss($target); - } - - private function copyFiles(string $target): void - { - $dir = $this->directory($target . '_css'); - - copy($this->templatePath . 'css/bootstrap.min.css', $dir . 'bootstrap.min.css'); - copy($this->templatePath . 'css/nv.d3.min.css', $dir . 'nv.d3.min.css'); - copy($this->customCssFile->path(), $dir . 'custom.css'); - copy($this->templatePath . 'css/octicons.css', $dir . 'octicons.css'); - - $dir = $this->directory($target . '_icons'); - copy($this->templatePath . 'icons/file-code.svg', $dir . 'file-code.svg'); - copy($this->templatePath . 'icons/file-directory.svg', $dir . 'file-directory.svg'); - - $dir = $this->directory($target . '_js'); - copy($this->templatePath . 'js/bootstrap.min.js', $dir . 'bootstrap.min.js'); - copy($this->templatePath . 'js/popper.min.js', $dir . 'popper.min.js'); - copy($this->templatePath . 'js/d3.min.js', $dir . 'd3.min.js'); - copy($this->templatePath . 'js/jquery.min.js', $dir . 'jquery.min.js'); - copy($this->templatePath . 'js/nv.d3.min.js', $dir . 'nv.d3.min.js'); - copy($this->templatePath . 'js/file.js', $dir . 'file.js'); - } - - private function renderCss(string $target): void - { - $template = new Template($this->templatePath . 'css/style.css', '{{', '}}'); - - $template->setVar( - [ - 'success-low' => $this->colors->successLow(), - 'success-medium' => $this->colors->successMedium(), - 'success-high' => $this->colors->successHigh(), - 'warning' => $this->colors->warning(), - 'danger' => $this->colors->danger(), - ], - ); - - try { - $template->renderTo($this->directory($target . '_css') . 'style.css'); - } catch (Exception $e) { - throw new FileCouldNotBeWrittenException( - $e->getMessage(), - $e->getCode(), - $e, - ); - } - } - - private function directory(string $directory): string - { - if (!str_ends_with($directory, DIRECTORY_SEPARATOR)) { - $directory .= DIRECTORY_SEPARATOR; - } - - Filesystem::createDirectory($directory); - - return $directory; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer.php b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer.php deleted file mode 100644 index 6ce7b8f..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer.php +++ /dev/null @@ -1,286 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Html; - -use function array_pop; -use function count; -use function sprintf; -use function str_repeat; -use function substr_count; -use SebastianBergmann\CodeCoverage\Node\AbstractNode; -use SebastianBergmann\CodeCoverage\Node\Directory as DirectoryNode; -use SebastianBergmann\CodeCoverage\Node\File as FileNode; -use SebastianBergmann\CodeCoverage\Report\Thresholds; -use SebastianBergmann\CodeCoverage\Version; -use SebastianBergmann\Environment\Runtime; -use SebastianBergmann\Template\Template; - -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage - */ -abstract class Renderer -{ - protected string $templatePath; - protected string $generator; - protected string $date; - protected Thresholds $thresholds; - protected bool $hasBranchCoverage; - protected string $version; - - public function __construct(string $templatePath, string $generator, string $date, Thresholds $thresholds, bool $hasBranchCoverage) - { - $this->templatePath = $templatePath; - $this->generator = $generator; - $this->date = $date; - $this->thresholds = $thresholds; - $this->version = Version::id(); - $this->hasBranchCoverage = $hasBranchCoverage; - } - - protected function renderItemTemplate(Template $template, array $data): string - { - $numSeparator = ' / '; - - if (isset($data['numClasses']) && $data['numClasses'] > 0) { - $classesLevel = $this->colorLevel($data['testedClassesPercent']); - - $classesNumber = $data['numTestedClasses'] . $numSeparator . - $data['numClasses']; - - $classesBar = $this->coverageBar( - $data['testedClassesPercent'], - ); - } else { - $classesLevel = ''; - $classesNumber = '0' . $numSeparator . '0'; - $classesBar = ''; - $data['testedClassesPercentAsString'] = 'n/a'; - } - - if ($data['numMethods'] > 0) { - $methodsLevel = $this->colorLevel($data['testedMethodsPercent']); - - $methodsNumber = $data['numTestedMethods'] . $numSeparator . - $data['numMethods']; - - $methodsBar = $this->coverageBar( - $data['testedMethodsPercent'], - ); - } else { - $methodsLevel = ''; - $methodsNumber = '0' . $numSeparator . '0'; - $methodsBar = ''; - $data['testedMethodsPercentAsString'] = 'n/a'; - } - - if ($data['numExecutableLines'] > 0) { - $linesLevel = $this->colorLevel($data['linesExecutedPercent']); - - $linesNumber = $data['numExecutedLines'] . $numSeparator . - $data['numExecutableLines']; - - $linesBar = $this->coverageBar( - $data['linesExecutedPercent'], - ); - } else { - $linesLevel = ''; - $linesNumber = '0' . $numSeparator . '0'; - $linesBar = ''; - $data['linesExecutedPercentAsString'] = 'n/a'; - } - - if ($data['numExecutablePaths'] > 0) { - $pathsLevel = $this->colorLevel($data['pathsExecutedPercent']); - - $pathsNumber = $data['numExecutedPaths'] . $numSeparator . - $data['numExecutablePaths']; - - $pathsBar = $this->coverageBar( - $data['pathsExecutedPercent'], - ); - } else { - $pathsLevel = ''; - $pathsNumber = '0' . $numSeparator . '0'; - $pathsBar = ''; - $data['pathsExecutedPercentAsString'] = 'n/a'; - } - - if ($data['numExecutableBranches'] > 0) { - $branchesLevel = $this->colorLevel($data['branchesExecutedPercent']); - - $branchesNumber = $data['numExecutedBranches'] . $numSeparator . - $data['numExecutableBranches']; - - $branchesBar = $this->coverageBar( - $data['branchesExecutedPercent'], - ); - } else { - $branchesLevel = ''; - $branchesNumber = '0' . $numSeparator . '0'; - $branchesBar = ''; - $data['branchesExecutedPercentAsString'] = 'n/a'; - } - - $template->setVar( - [ - 'icon' => $data['icon'] ?? '', - 'crap' => $data['crap'] ?? '', - 'name' => $data['name'], - 'lines_bar' => $linesBar, - 'lines_executed_percent' => $data['linesExecutedPercentAsString'], - 'lines_level' => $linesLevel, - 'lines_number' => $linesNumber, - 'paths_bar' => $pathsBar, - 'paths_executed_percent' => $data['pathsExecutedPercentAsString'], - 'paths_level' => $pathsLevel, - 'paths_number' => $pathsNumber, - 'branches_bar' => $branchesBar, - 'branches_executed_percent' => $data['branchesExecutedPercentAsString'], - 'branches_level' => $branchesLevel, - 'branches_number' => $branchesNumber, - 'methods_bar' => $methodsBar, - 'methods_tested_percent' => $data['testedMethodsPercentAsString'], - 'methods_level' => $methodsLevel, - 'methods_number' => $methodsNumber, - 'classes_bar' => $classesBar, - 'classes_tested_percent' => $data['testedClassesPercentAsString'] ?? '', - 'classes_level' => $classesLevel, - 'classes_number' => $classesNumber, - ], - ); - - return $template->render(); - } - - protected function setCommonTemplateVariables(Template $template, AbstractNode $node): void - { - $template->setVar( - [ - 'id' => $node->id(), - 'full_path' => $node->pathAsString(), - 'path_to_root' => $this->pathToRoot($node), - 'breadcrumbs' => $this->breadcrumbs($node), - 'date' => $this->date, - 'version' => $this->version, - 'runtime' => $this->runtimeString(), - 'generator' => $this->generator, - 'low_upper_bound' => $this->thresholds->lowUpperBound(), - 'high_lower_bound' => $this->thresholds->highLowerBound(), - ], - ); - } - - protected function breadcrumbs(AbstractNode $node): string - { - $breadcrumbs = ''; - $path = $node->pathAsArray(); - $pathToRoot = []; - $max = count($path); - - if ($node instanceof FileNode) { - $max--; - } - - for ($i = 0; $i < $max; $i++) { - $pathToRoot[] = str_repeat('../', $i); - } - - foreach ($path as $step) { - if ($step !== $node) { - $breadcrumbs .= $this->inactiveBreadcrumb( - $step, - array_pop($pathToRoot), - ); - } else { - $breadcrumbs .= $this->activeBreadcrumb($step); - } - } - - return $breadcrumbs; - } - - protected function activeBreadcrumb(AbstractNode $node): string - { - $buffer = sprintf( - ' <li class="breadcrumb-item active">%s</li>' . "\n", - $node->name(), - ); - - if ($node instanceof DirectoryNode) { - $buffer .= ' <li class="breadcrumb-item">(<a href="dashboard.html">Dashboard</a>)</li>' . "\n"; - } - - return $buffer; - } - - protected function inactiveBreadcrumb(AbstractNode $node, string $pathToRoot): string - { - return sprintf( - ' <li class="breadcrumb-item"><a href="%sindex.html">%s</a></li>' . "\n", - $pathToRoot, - $node->name(), - ); - } - - protected function pathToRoot(AbstractNode $node): string - { - $id = $node->id(); - $depth = substr_count($id, '/'); - - if ($id !== 'index' && - $node instanceof DirectoryNode) { - $depth++; - } - - return str_repeat('../', $depth); - } - - protected function coverageBar(float $percent): string - { - $level = $this->colorLevel($percent); - - $templateName = $this->templatePath . ($this->hasBranchCoverage ? 'coverage_bar_branch.html' : 'coverage_bar.html'); - $template = new Template( - $templateName, - '{{', - '}}', - ); - - $template->setVar(['level' => $level, 'percent' => sprintf('%.2F', $percent)]); - - return $template->render(); - } - - protected function colorLevel(float $percent): string - { - if ($percent <= $this->thresholds->lowUpperBound()) { - return 'danger'; - } - - if ($percent > $this->thresholds->lowUpperBound() && - $percent < $this->thresholds->highLowerBound()) { - return 'warning'; - } - - return 'success'; - } - - private function runtimeString(): string - { - $runtime = new Runtime; - - return sprintf( - '<a href="%s" target="_top">%s %s</a>', - $runtime->getVendorUrl(), - $runtime->getName(), - $runtime->getVersion(), - ); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Dashboard.php b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Dashboard.php deleted file mode 100644 index cf21cf9..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Dashboard.php +++ /dev/null @@ -1,298 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Html; - -use function array_values; -use function arsort; -use function asort; -use function count; -use function explode; -use function floor; -use function json_encode; -use function sprintf; -use function str_replace; -use SebastianBergmann\CodeCoverage\FileCouldNotBeWrittenException; -use SebastianBergmann\CodeCoverage\Node\AbstractNode; -use SebastianBergmann\CodeCoverage\Node\Directory as DirectoryNode; -use SebastianBergmann\Template\Exception; -use SebastianBergmann\Template\Template; - -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage - */ -final class Dashboard extends Renderer -{ - public function render(DirectoryNode $node, string $file): void - { - $classes = $node->classesAndTraits(); - $templateName = $this->templatePath . ($this->hasBranchCoverage ? 'dashboard_branch.html' : 'dashboard.html'); - $template = new Template( - $templateName, - '{{', - '}}', - ); - - $this->setCommonTemplateVariables($template, $node); - - $baseLink = $node->id() . '/'; - $complexity = $this->complexity($classes, $baseLink); - $coverageDistribution = $this->coverageDistribution($classes); - $insufficientCoverage = $this->insufficientCoverage($classes, $baseLink); - $projectRisks = $this->projectRisks($classes, $baseLink); - - $template->setVar( - [ - 'insufficient_coverage_classes' => $insufficientCoverage['class'], - 'insufficient_coverage_methods' => $insufficientCoverage['method'], - 'project_risks_classes' => $projectRisks['class'], - 'project_risks_methods' => $projectRisks['method'], - 'complexity_class' => $complexity['class'], - 'complexity_method' => $complexity['method'], - 'class_coverage_distribution' => $coverageDistribution['class'], - 'method_coverage_distribution' => $coverageDistribution['method'], - ], - ); - - try { - $template->renderTo($file); - } catch (Exception $e) { - throw new FileCouldNotBeWrittenException( - $e->getMessage(), - $e->getCode(), - $e, - ); - } - } - - protected function activeBreadcrumb(AbstractNode $node): string - { - return sprintf( - ' <li class="breadcrumb-item"><a href="index.html">%s</a></li>' . "\n" . - ' <li class="breadcrumb-item active">(Dashboard)</li>' . "\n", - $node->name(), - ); - } - - /** - * Returns the data for the Class/Method Complexity charts. - */ - private function complexity(array $classes, string $baseLink): array - { - $result = ['class' => [], 'method' => []]; - - foreach ($classes as $className => $class) { - foreach ($class['methods'] as $methodName => $method) { - if ($className !== '*') { - $methodName = $className . '::' . $methodName; - } - - $result['method'][] = [ - $method['coverage'], - $method['ccn'], - sprintf( - '<a href="%s">%s</a>', - str_replace($baseLink, '', $method['link']), - $methodName, - ), - ]; - } - - $result['class'][] = [ - $class['coverage'], - $class['ccn'], - sprintf( - '<a href="%s">%s</a>', - str_replace($baseLink, '', $class['link']), - $className, - ), - ]; - } - - return [ - 'class' => json_encode($result['class']), - 'method' => json_encode($result['method']), - ]; - } - - /** - * Returns the data for the Class / Method Coverage Distribution chart. - */ - private function coverageDistribution(array $classes): array - { - $result = [ - 'class' => [ - '0%' => 0, - '0-10%' => 0, - '10-20%' => 0, - '20-30%' => 0, - '30-40%' => 0, - '40-50%' => 0, - '50-60%' => 0, - '60-70%' => 0, - '70-80%' => 0, - '80-90%' => 0, - '90-100%' => 0, - '100%' => 0, - ], - 'method' => [ - '0%' => 0, - '0-10%' => 0, - '10-20%' => 0, - '20-30%' => 0, - '30-40%' => 0, - '40-50%' => 0, - '50-60%' => 0, - '60-70%' => 0, - '70-80%' => 0, - '80-90%' => 0, - '90-100%' => 0, - '100%' => 0, - ], - ]; - - foreach ($classes as $class) { - foreach ($class['methods'] as $methodName => $method) { - if ($method['coverage'] === 0) { - $result['method']['0%']++; - } elseif ($method['coverage'] === 100) { - $result['method']['100%']++; - } else { - $key = floor($method['coverage'] / 10) * 10; - $key = $key . '-' . ($key + 10) . '%'; - $result['method'][$key]++; - } - } - - if ($class['coverage'] === 0) { - $result['class']['0%']++; - } elseif ($class['coverage'] === 100) { - $result['class']['100%']++; - } else { - $key = floor($class['coverage'] / 10) * 10; - $key = $key . '-' . ($key + 10) . '%'; - $result['class'][$key]++; - } - } - - return [ - 'class' => json_encode(array_values($result['class'])), - 'method' => json_encode(array_values($result['method'])), - ]; - } - - /** - * Returns the classes / methods with insufficient coverage. - */ - private function insufficientCoverage(array $classes, string $baseLink): array - { - $leastTestedClasses = []; - $leastTestedMethods = []; - $result = ['class' => '', 'method' => '']; - - foreach ($classes as $className => $class) { - foreach ($class['methods'] as $methodName => $method) { - if ($method['coverage'] < $this->thresholds->highLowerBound()) { - $key = $methodName; - - if ($className !== '*') { - $key = $className . '::' . $methodName; - } - - $leastTestedMethods[$key] = $method['coverage']; - } - } - - if ($class['coverage'] < $this->thresholds->highLowerBound()) { - $leastTestedClasses[$className] = $class['coverage']; - } - } - - asort($leastTestedClasses); - asort($leastTestedMethods); - - foreach ($leastTestedClasses as $className => $coverage) { - $result['class'] .= sprintf( - ' <tr><td><a href="%s">%s</a></td><td class="text-right">%d%%</td></tr>' . "\n", - str_replace($baseLink, '', $classes[$className]['link']), - $className, - $coverage, - ); - } - - foreach ($leastTestedMethods as $methodName => $coverage) { - [$class, $method] = explode('::', $methodName); - - $result['method'] .= sprintf( - ' <tr><td><a href="%s"><abbr title="%s">%s</abbr></a></td><td class="text-right">%d%%</td></tr>' . "\n", - str_replace($baseLink, '', $classes[$class]['methods'][$method]['link']), - $methodName, - $method, - $coverage, - ); - } - - return $result; - } - - /** - * Returns the project risks according to the CRAP index. - */ - private function projectRisks(array $classes, string $baseLink): array - { - $classRisks = []; - $methodRisks = []; - $result = ['class' => '', 'method' => '']; - - foreach ($classes as $className => $class) { - foreach ($class['methods'] as $methodName => $method) { - if ($method['coverage'] < $this->thresholds->highLowerBound() && $method['ccn'] > 1) { - $key = $methodName; - - if ($className !== '*') { - $key = $className . '::' . $methodName; - } - - $methodRisks[$key] = $method['crap']; - } - } - - if ($class['coverage'] < $this->thresholds->highLowerBound() && - $class['ccn'] > count($class['methods'])) { - $classRisks[$className] = $class['crap']; - } - } - - arsort($classRisks); - arsort($methodRisks); - - foreach ($classRisks as $className => $crap) { - $result['class'] .= sprintf( - ' <tr><td><a href="%s">%s</a></td><td class="text-right">%d</td></tr>' . "\n", - str_replace($baseLink, '', $classes[$className]['link']), - $className, - $crap, - ); - } - - foreach ($methodRisks as $methodName => $crap) { - [$class, $method] = explode('::', $methodName); - - $result['method'] .= sprintf( - ' <tr><td><a href="%s"><abbr title="%s">%s</abbr></a></td><td class="text-right">%d</td></tr>' . "\n", - str_replace($baseLink, '', $classes[$class]['methods'][$method]['link']), - $methodName, - $method, - $crap, - ); - } - - return $result; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Directory.php b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Directory.php deleted file mode 100644 index 1d7334b..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Directory.php +++ /dev/null @@ -1,123 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Html; - -use function count; -use function sprintf; -use function str_repeat; -use SebastianBergmann\CodeCoverage\FileCouldNotBeWrittenException; -use SebastianBergmann\CodeCoverage\Node\AbstractNode as Node; -use SebastianBergmann\CodeCoverage\Node\Directory as DirectoryNode; -use SebastianBergmann\Template\Exception; -use SebastianBergmann\Template\Template; - -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage - */ -final class Directory extends Renderer -{ - public function render(DirectoryNode $node, string $file): void - { - $templateName = $this->templatePath . ($this->hasBranchCoverage ? 'directory_branch.html' : 'directory.html'); - $template = new Template($templateName, '{{', '}}'); - - $this->setCommonTemplateVariables($template, $node); - - $items = $this->renderItem($node, true); - - foreach ($node->directories() as $item) { - $items .= $this->renderItem($item); - } - - foreach ($node->files() as $item) { - $items .= $this->renderItem($item); - } - - $template->setVar( - [ - 'id' => $node->id(), - 'items' => $items, - ], - ); - - try { - $template->renderTo($file); - } catch (Exception $e) { - throw new FileCouldNotBeWrittenException( - $e->getMessage(), - $e->getCode(), - $e, - ); - } - } - - private function renderItem(Node $node, bool $total = false): string - { - $data = [ - 'numClasses' => $node->numberOfClassesAndTraits(), - 'numTestedClasses' => $node->numberOfTestedClassesAndTraits(), - 'numMethods' => $node->numberOfFunctionsAndMethods(), - 'numTestedMethods' => $node->numberOfTestedFunctionsAndMethods(), - 'linesExecutedPercent' => $node->percentageOfExecutedLines()->asFloat(), - 'linesExecutedPercentAsString' => $node->percentageOfExecutedLines()->asString(), - 'numExecutedLines' => $node->numberOfExecutedLines(), - 'numExecutableLines' => $node->numberOfExecutableLines(), - 'branchesExecutedPercent' => $node->percentageOfExecutedBranches()->asFloat(), - 'branchesExecutedPercentAsString' => $node->percentageOfExecutedBranches()->asString(), - 'numExecutedBranches' => $node->numberOfExecutedBranches(), - 'numExecutableBranches' => $node->numberOfExecutableBranches(), - 'pathsExecutedPercent' => $node->percentageOfExecutedPaths()->asFloat(), - 'pathsExecutedPercentAsString' => $node->percentageOfExecutedPaths()->asString(), - 'numExecutedPaths' => $node->numberOfExecutedPaths(), - 'numExecutablePaths' => $node->numberOfExecutablePaths(), - 'testedMethodsPercent' => $node->percentageOfTestedFunctionsAndMethods()->asFloat(), - 'testedMethodsPercentAsString' => $node->percentageOfTestedFunctionsAndMethods()->asString(), - 'testedClassesPercent' => $node->percentageOfTestedClassesAndTraits()->asFloat(), - 'testedClassesPercentAsString' => $node->percentageOfTestedClassesAndTraits()->asString(), - ]; - - if ($total) { - $data['name'] = 'Total'; - } else { - $up = str_repeat('../', count($node->pathAsArray()) - 2); - $data['icon'] = sprintf('<img src="%s_icons/file-code.svg" class="octicon" />', $up); - - if ($node instanceof DirectoryNode) { - $data['name'] = sprintf( - '<a href="%s/index.html">%s</a>', - $node->name(), - $node->name(), - ); - $data['icon'] = sprintf('<img src="%s_icons/file-directory.svg" class="octicon" />', $up); - } elseif ($this->hasBranchCoverage) { - $data['name'] = sprintf( - '%s <a class="small" href="%s.html">[line]</a> <a class="small" href="%s_branch.html">[branch]</a> <a class="small" href="%s_path.html">[path]</a>', - $node->name(), - $node->name(), - $node->name(), - $node->name(), - ); - } else { - $data['name'] = sprintf( - '<a href="%s.html">%s</a>', - $node->name(), - $node->name(), - ); - } - } - - $templateName = $this->templatePath . ($this->hasBranchCoverage ? 'directory_item_branch.html' : 'directory_item.html'); - - return $this->renderItemTemplate( - new Template($templateName, '{{', '}}'), - $data, - ); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php deleted file mode 100644 index 005c1db..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php +++ /dev/null @@ -1,1130 +0,0 @@ -<?php declare(strict_types=1); -/* - * This file is part of phpunit/php-code-coverage. - * - * (c) Sebastian Bergmann <sebastian@phpunit.de> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Html; - -use const ENT_COMPAT; -use const ENT_HTML401; -use const ENT_SUBSTITUTE; -use const T_ABSTRACT; -use const T_ARRAY; -use const T_AS; -use const T_BREAK; -use const T_CALLABLE; -use const T_CASE; -use const T_CATCH; -use const T_CLASS; -use const T_CLONE; -use const T_COMMENT; -use const T_CONST; -use const T_CONTINUE; -use const T_DECLARE; -use const T_DEFAULT; -use const T_DO; -use const T_DOC_COMMENT; -use const T_ECHO; -use const T_ELSE; -use const T_ELSEIF; -use const T_EMPTY; -use const T_ENDDECLARE; -use const T_ENDFOR; -use const T_ENDFOREACH; -use const T_ENDIF; -use const T_ENDSWITCH; -use const T_ENDWHILE; -use const T_EVAL; -use const T_EXIT; -use const T_EXTENDS; -use const T_FINAL; -use const T_FINALLY; -use const T_FOR; -use const T_FOREACH; -use const T_FUNCTION; -use const T_GLOBAL; -use const T_GOTO; -use const T_HALT_COMPILER; -use const T_IF; -use const T_IMPLEMENTS; -use const T_INCLUDE; -use const T_INCLUDE_ONCE; -use const T_INLINE_HTML; -use const T_INSTANCEOF; -use const T_INSTEADOF; -use const T_INTERFACE; -use const T_ISSET; -use const T_LIST; -use const T_NAMESPACE; -use const T_NEW; -use const T_PRINT; -use const T_PRIVATE; -use const T_PROTECTED; -use const T_PUBLIC; -use const T_REQUIRE; -use const T_REQUIRE_ONCE; -use const T_RETURN; -use const T_STATIC; -use const T_SWITCH; -use const T_THROW; -use const T_TRAIT; -use const T_TRY; -use const T_UNSET; -use const T_USE; -use const T_VAR; -use const T_WHILE; -use const T_YIELD; -use const T_YIELD_FROM; -use function array_key_exists; -use function array_keys; -use function array_merge; -use function array_pop; -use function array_unique; -use function count; -use function explode; -use function file_get_contents; -use function htmlspecialchars; -use function is_string; -use function ksort; -use function range; -use function sort; -use function sprintf; -use function str_ends_with; -use function str_replace; -use function token_get_all; -use function trim; -use SebastianBergmann\CodeCoverage\FileCouldNotBeWrittenException; -use SebastianBergmann\CodeCoverage\Node\File as FileNode; -use SebastianBergmann\CodeCoverage\Util\Percentage; -use SebastianBergmann\Template\Exception; -use SebastianBergmann\Template\Template; - -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage - */ -final class File extends Renderer -{ - /** - * @psalm-var array<int,true> - */ - private const KEYWORD_TOKENS = [ - T_ABSTRACT => true, - T_ARRAY => true, - T_AS => true, - T_BREAK => true, - T_CALLABLE => true, - T_CASE => true, - T_CATCH => true, - T_CLASS => true, - T_CLONE => true, - T_CONST => true, - T_CONTINUE => true, - T_DECLARE => true, - T_DEFAULT => true, - T_DO => true, - T_ECHO => true, - T_ELSE => true, - T_ELSEIF => true, - T_EMPTY => true, - T_ENDDECLARE => true, - T_ENDFOR => true, - T_ENDFOREACH => true, - T_ENDIF => true, - T_ENDSWITCH => true, - T_ENDWHILE => true, - T_ENUM => true, - T_EVAL => true, - T_EXIT => true, - T_EXTENDS => true, - T_FINAL => true, - T_FINALLY => true, - T_FN => true, - T_FOR => true, - T_FOREACH => true, - T_FUNCTION => true, - T_GLOBAL => true, - T_GOTO => true, - T_HALT_COMPILER => true, - T_IF => true, - T_IMPLEMENTS => true, - T_INCLUDE => true, - T_INCLUDE_ONCE => true, - T_INSTANCEOF => true, - T_INSTEADOF => true, - T_INTERFACE => true, - T_ISSET => true, - T_LIST => true, - T_MATCH => true, - T_NAMESPACE => true, - T_NEW => true, - T_PRINT => true, - T_PRIVATE => true, - T_PROTECTED => true, - T_PUBLIC => true, - T_READONLY => true, - T_REQUIRE => true, - T_REQUIRE_ONCE => true, - T_RETURN => true, - T_STATIC => true, - T_SWITCH => true, - T_THROW => true, - T_TRAIT => true, - T_TRY => true, - T_UNSET => true, - T_USE => true, - T_VAR => true, - T_WHILE => true, - T_YIELD => true, - T_YIELD_FROM => true, - ]; - private static array $formattedSourceCache = []; - private int $htmlSpecialCharsFlags = ENT_COMPAT | ENT_HTML401 | ENT_SUBSTITUTE; - - public function render(FileNode $node, string $file): void - { - $templateName = $this->templatePath . ($this->hasBranchCoverage ? 'file_branch.html' : 'file.html'); - $template = new Template($templateName, '{{', '}}'); - $this->setCommonTemplateVariables($template, $node); - - $template->setVar( - [ - 'items' => $this->renderItems($node), - 'lines' => $this->renderSourceWithLineCoverage($node), - 'legend' => '<p><span class="legend covered-by-small-tests">Covered by small (and larger) tests</span><span class="legend covered-by-medium-tests">Covered by medium (and large) tests</span><span class="legend covered-by-large-tests">Covered by large tests (and tests of unknown size)</span><span class="legend not-covered">Not covered</span><span class="legend not-coverable">Not coverable</span></p>', - 'structure' => '', - ], - ); - - try { - $template->renderTo($file . '.html'); - } catch (Exception $e) { - throw new FileCouldNotBeWrittenException( - $e->getMessage(), - $e->getCode(), - $e, - ); - } - - if ($this->hasBranchCoverage) { - $template->setVar( - [ - 'items' => $this->renderItems($node), - 'lines' => $this->renderSourceWithBranchCoverage($node), - 'legend' => '<p><span class="success"><strong>Fully covered</strong></span><span class="warning"><strong>Partially covered</strong></span><span class="danger"><strong>Not covered</strong></span></p>', - 'structure' => $this->renderBranchStructure($node), - ], - ); - - try { - $template->renderTo($file . '_branch.html'); - } catch (Exception $e) { - throw new FileCouldNotBeWrittenException( - $e->getMessage(), - $e->getCode(), - $e, - ); - } - - $template->setVar( - [ - 'items' => $this->renderItems($node), - 'lines' => $this->renderSourceWithPathCoverage($node), - 'legend' => '<p><span class="success"><strong>Fully covered</strong></span><span class="warning"><strong>Partially covered</strong></span><span class="danger"><strong>Not covered</strong></span></p>', - 'structure' => $this->renderPathStructure($node), - ], - ); - - try { - $template->renderTo($file . '_path.html'); - } catch (Exception $e) { - throw new FileCouldNotBeWrittenException( - $e->getMessage(), - $e->getCode(), - $e, - ); - } - } - } - - private function renderItems(FileNode $node): string - { - $templateName = $this->templatePath . ($this->hasBranchCoverage ? 'file_item_branch.html' : 'file_item.html'); - $template = new Template($templateName, '{{', '}}'); - - $methodTemplateName = $this->templatePath . ($this->hasBranchCoverage ? 'method_item_branch.html' : 'method_item.html'); - $methodItemTemplate = new Template( - $methodTemplateName, - '{{', - '}}', - ); - - $items = $this->renderItemTemplate( - $template, - [ - 'name' => 'Total', - 'numClasses' => $node->numberOfClassesAndTraits(), - 'numTestedClasses' => $node->numberOfTestedClassesAndTraits(), - 'numMethods' => $node->numberOfFunctionsAndMethods(), - 'numTestedMethods' => $node->numberOfTestedFunctionsAndMethods(), - 'linesExecutedPercent' => $node->percentageOfExecutedLines()->asFloat(), - 'linesExecutedPercentAsString' => $node->percentageOfExecutedLines()->asString(), - 'numExecutedLines' => $node->numberOfExecutedLines(), - 'numExecutableLines' => $node->numberOfExecutableLines(), - 'branchesExecutedPercent' => $node->percentageOfExecutedBranches()->asFloat(), - 'branchesExecutedPercentAsString' => $node->percentageOfExecutedBranches()->asString(), - 'numExecutedBranches' => $node->numberOfExecutedBranches(), - 'numExecutableBranches' => $node->numberOfExecutableBranches(), - 'pathsExecutedPercent' => $node->percentageOfExecutedPaths()->asFloat(), - 'pathsExecutedPercentAsString' => $node->percentageOfExecutedPaths()->asString(), - 'numExecutedPaths' => $node->numberOfExecutedPaths(), - 'numExecutablePaths' => $node->numberOfExecutablePaths(), - 'testedMethodsPercent' => $node->percentageOfTestedFunctionsAndMethods()->asFloat(), - 'testedMethodsPercentAsString' => $node->percentageOfTestedFunctionsAndMethods()->asString(), - 'testedClassesPercent' => $node->percentageOfTestedClassesAndTraits()->asFloat(), - 'testedClassesPercentAsString' => $node->percentageOfTestedClassesAndTraits()->asString(), - 'crap' => '<abbr title="Change Risk Anti-Patterns (CRAP) Index">CRAP</abbr>', - ], - ); - - $items .= $this->renderFunctionItems( - $node->functions(), - $methodItemTemplate, - ); - - $items .= $this->renderTraitOrClassItems( - $node->traits(), - $template, - $methodItemTemplate, - ); - - $items .= $this->renderTraitOrClassItems( - $node->classes(), - $template, - $methodItemTemplate, - ); - - return $items; - } - - private function renderTraitOrClassItems(array $items, Template $template, Template $methodItemTemplate): string - { - $buffer = ''; - - if (empty($items)) { - return $buffer; - } - - foreach ($items as $name => $item) { - $numMethods = 0; - $numTestedMethods = 0; - - foreach ($item['methods'] as $method) { - if ($method['executableLines'] > 0) { - $numMethods++; - - if ($method['executedLines'] === $method['executableLines']) { - $numTestedMethods++; - } - } - } - - if ($item['executableLines'] > 0) { - $numClasses = 1; - $numTestedClasses = $numTestedMethods === $numMethods ? 1 : 0; - $linesExecutedPercentAsString = Percentage::fromFractionAndTotal( - $item['executedLines'], - $item['executableLines'], - )->asString(); - $branchesExecutedPercentAsString = Percentage::fromFractionAndTotal( - $item['executedBranches'], - $item['executableBranches'], - )->asString(); - $pathsExecutedPercentAsString = Percentage::fromFractionAndTotal( - $item['executedPaths'], - $item['executablePaths'], - )->asString(); - } else { - $numClasses = 0; - $numTestedClasses = 0; - $linesExecutedPercentAsString = 'n/a'; - $branchesExecutedPercentAsString = 'n/a'; - $pathsExecutedPercentAsString = 'n/a'; - } - - $testedMethodsPercentage = Percentage::fromFractionAndTotal( - $numTestedMethods, - $numMethods, - ); - - $testedClassesPercentage = Percentage::fromFractionAndTotal( - $numTestedMethods === $numMethods ? 1 : 0, - 1, - ); - - $buffer .= $this->renderItemTemplate( - $template, - [ - 'name' => $this->abbreviateClassName($name), - 'numClasses' => $numClasses, - 'numTestedClasses' => $numTestedClasses, - 'numMethods' => $numMethods, - 'numTestedMethods' => $numTestedMethods, - 'linesExecutedPercent' => Percentage::fromFractionAndTotal( - $item['executedLines'], - $item['executableLines'], - )->asFloat(), - 'linesExecutedPercentAsString' => $linesExecutedPercentAsString, - 'numExecutedLines' => $item['executedLines'], - 'numExecutableLines' => $item['executableLines'], - 'branchesExecutedPercent' => Percentage::fromFractionAndTotal( - $item['executedBranches'], - $item['executableBranches'], - )->asFloat(), - 'branchesExecutedPercentAsString' => $branchesExecutedPercentAsString, - 'numExecutedBranches' => $item['executedBranches'], - 'numExecutableBranches' => $item['executableBranches'], - 'pathsExecutedPercent' => Percentage::fromFractionAndTotal( - $item['executedPaths'], - $item['executablePaths'], - )->asFloat(), - 'pathsExecutedPercentAsString' => $pathsExecutedPercentAsString, - 'numExecutedPaths' => $item['executedPaths'], - 'numExecutablePaths' => $item['executablePaths'], - 'testedMethodsPercent' => $testedMethodsPercentage->asFloat(), - 'testedMethodsPercentAsString' => $testedMethodsPercentage->asString(), - 'testedClassesPercent' => $testedClassesPercentage->asFloat(), - 'testedClassesPercentAsString' => $testedClassesPercentage->asString(), - 'crap' => $item['crap'], - ], - ); - - foreach ($item['methods'] as $method) { - $buffer .= $this->renderFunctionOrMethodItem( - $methodItemTemplate, - $method, - ' ', - ); - } - } - - return $buffer; - } - - private function renderFunctionItems(array $functions, Template $template): string - { - if (empty($functions)) { - return ''; - } - - $buffer = ''; - - foreach ($functions as $function) { - $buffer .= $this->renderFunctionOrMethodItem( - $template, - $function, - ); - } - - return $buffer; - } - - private function renderFunctionOrMethodItem(Template $template, array $item, string $indent = ''): string - { - $numMethods = 0; - $numTestedMethods = 0; - - if ($item['executableLines'] > 0) { - $numMethods = 1; - - if ($item['executedLines'] === $item['executableLines']) { - $numTestedMethods = 1; - } - } - - $executedLinesPercentage = Percentage::fromFractionAndTotal( - $item['executedLines'], - $item['executableLines'], - ); - - $executedBranchesPercentage = Percentage::fromFractionAndTotal( - $item['executedBranches'], - $item['executableBranches'], - ); - - $executedPathsPercentage = Percentage::fromFractionAndTotal( - $item['executedPaths'], - $item['executablePaths'], - ); - - $testedMethodsPercentage = Percentage::fromFractionAndTotal( - $numTestedMethods, - 1, - ); - - return $this->renderItemTemplate( - $template, - [ - 'name' => sprintf( - '%s<a href="#%d"><abbr title="%s">%s</abbr></a>', - $indent, - $item['startLine'], - htmlspecialchars($item['signature'], $this->htmlSpecialCharsFlags), - $item['functionName'] ?? $item['methodName'], - ), - 'numMethods' => $numMethods, - 'numTestedMethods' => $numTestedMethods, - 'linesExecutedPercent' => $executedLinesPercentage->asFloat(), - 'linesExecutedPercentAsString' => $executedLinesPercentage->asString(), - 'numExecutedLines' => $item['executedLines'], - 'numExecutableLines' => $item['executableLines'], - 'branchesExecutedPercent' => $executedBranchesPercentage->asFloat(), - 'branchesExecutedPercentAsString' => $executedBranchesPercentage->asString(), - 'numExecutedBranches' => $item['executedBranches'], - 'numExecutableBranches' => $item['executableBranches'], - 'pathsExecutedPercent' => $executedPathsPercentage->asFloat(), - 'pathsExecutedPercentAsString' => $executedPathsPercentage->asString(), - 'numExecutedPaths' => $item['executedPaths'], - 'numExecutablePaths' => $item['executablePaths'], - 'testedMethodsPercent' => $testedMethodsPercentage->asFloat(), - 'testedMethodsPercentAsString' => $testedMethodsPercentage->asString(), - 'crap' => $item['crap'], - ], - ); - } - - private function renderSourceWithLineCoverage(FileNode $node): string - { - $linesTemplate = new Template($this->templatePath . 'lines.html.dist', '{{', '}}'); - $singleLineTemplate = new Template($this->templatePath . 'line.html.dist', '{{', '}}'); - - $coverageData = $node->lineCoverageData(); - $testData = $node->testData(); - $codeLines = $this->loadFile($node->pathAsString()); - $lines = ''; - $i = 1; - - foreach ($codeLines as $line) { - $trClass = ''; - $popoverContent = ''; - $popoverTitle = ''; - - if (array_key_exists($i, $coverageData)) { - $numTests = ($coverageData[$i] ? count($coverageData[$i]) : 0); - - if ($coverageData[$i] === null) { - $trClass = 'warning'; - } elseif ($numTests === 0) { - $trClass = 'danger'; - } else { - if ($numTests > 1) { - $popoverTitle = $numTests . ' tests cover line ' . $i; - } else { - $popoverTitle = '1 test covers line ' . $i; - } - - $lineCss = 'covered-by-large-tests'; - $popoverContent = '<ul>'; - - foreach ($coverageData[$i] as $test) { - if ($lineCss === 'covered-by-large-tests' && $testData[$test]['size'] === 'medium') { - $lineCss = 'covered-by-medium-tests'; - } elseif ($testData[$test]['size'] === 'small') { - $lineCss = 'covered-by-small-tests'; - } - - $popoverContent .= $this->createPopoverContentForTest($test, $testData[$test]); - } - - $popoverContent .= '</ul>'; - $trClass = $lineCss . ' popin'; - } - } - - $popover = ''; - - if (!empty($popoverTitle)) { - $popover = sprintf( - ' data-title="%s" data-content="%s" data-placement="top" data-html="true"', - $popoverTitle, - htmlspecialchars($popoverContent, $this->htmlSpecialCharsFlags), - ); - } - - $lines .= $this->renderLine($singleLineTemplate, $i, $line, $trClass, $popover); - - $i++; - } - - $linesTemplate->setVar(['lines' => $lines]); - - return $linesTemplate->render(); - } - - private function renderSourceWithBranchCoverage(FileNode $node): string - { - $linesTemplate = new Template($this->templatePath . 'lines.html.dist', '{{', '}}'); - $singleLineTemplate = new Template($this->templatePath . 'line.html.dist', '{{', '}}'); - - $functionCoverageData = $node->functionCoverageData(); - $testData = $node->testData(); - $codeLines = $this->loadFile($node->pathAsString()); - - $lineData = []; - - /** @var int $line */ - foreach (array_keys($codeLines) as $line) { - $lineData[$line + 1] = [ - 'includedInBranches' => 0, - 'includedInHitBranches' => 0, - 'tests' => [], - ]; - } - - foreach ($functionCoverageData as $method) { - foreach ($method['branches'] as $branch) { - foreach (range($branch['line_start'], $branch['line_end']) as $line) { - if (!isset($lineData[$line])) { // blank line at end of file is sometimes included here - continue; - } - - $lineData[$line]['includedInBranches']++; - - if ($branch['hit']) { - $lineData[$line]['includedInHitBranches']++; - $lineData[$line]['tests'] = array_unique(array_merge($lineData[$line]['tests'], $branch['hit'])); - } - } - } - } - - $lines = ''; - $i = 1; - - /** @var string $line */ - foreach ($codeLines as $line) { - $trClass = ''; - $popover = ''; - - if ($lineData[$i]['includedInBranches'] > 0) { - $lineCss = 'success'; - - if ($lineData[$i]['includedInHitBranches'] === 0) { - $lineCss = 'danger'; - } elseif ($lineData[$i]['includedInHitBranches'] !== $lineData[$i]['includedInBranches']) { - $lineCss = 'warning'; - } - - $popoverContent = '<ul>'; - - if (count($lineData[$i]['tests']) === 1) { - $popoverTitle = '1 test covers line ' . $i; - } else { - $popoverTitle = count($lineData[$i]['tests']) . ' tests cover line ' . $i; - } - $popoverTitle .= '. These are covering ' . $lineData[$i]['includedInHitBranches'] . ' out of the ' . $lineData[$i]['includedInBranches'] . ' code branches.'; - - foreach ($lineData[$i]['tests'] as $test) { - $popoverContent .= $this->createPopoverContentForTest($test, $testData[$test]); - } - - $popoverContent .= '</ul>'; - $trClass = $lineCss . ' popin'; - - $popover = sprintf( - ' data-title="%s" data-content="%s" data-placement="top" data-html="true"', - $popoverTitle, - htmlspecialchars($popoverContent, $this->htmlSpecialCharsFlags), - ); - } - - $lines .= $this->renderLine($singleLineTemplate, $i, $line, $trClass, $popover); - - $i++; - } - - $linesTemplate->setVar(['lines' => $lines]); - - return $linesTemplate->render(); - } - - private function renderSourceWithPathCoverage(FileNode $node): string - { - $linesTemplate = new Template($this->templatePath . 'lines.html.dist', '{{', '}}'); - $singleLineTemplate = new Template($this->templatePath . 'line.html.dist', '{{', '}}'); - - $functionCoverageData = $node->functionCoverageData(); - $testData = $node->testData(); - $codeLines = $this->loadFile($node->pathAsString()); - - $lineData = []; - - /** @var int $line */ - foreach (array_keys($codeLines) as $line) { - $lineData[$line + 1] = [ - 'includedInPaths' => [], - 'includedInHitPaths' => [], - 'tests' => [], - ]; - } - - foreach ($functionCoverageData as $method) { - foreach ($method['paths'] as $pathId => $path) { - foreach ($path['path'] as $branchTaken) { - foreach (range($method['branches'][$branchTaken]['line_start'], $method['branches'][$branchTaken]['line_end']) as $line) { - if (!isset($lineData[$line])) { - continue; - } - $lineData[$line]['includedInPaths'][] = $pathId; - - if ($path['hit']) { - $lineData[$line]['includedInHitPaths'][] = $pathId; - $lineData[$line]['tests'] = array_unique(array_merge($lineData[$line]['tests'], $path['hit'])); - } - } - } - } - } - - $lines = ''; - $i = 1; - - /** @var string $line */ - foreach ($codeLines as $line) { - $trClass = ''; - $popover = ''; - $includedInPathsCount = count(array_unique($lineData[$i]['includedInPaths'])); - $includedInHitPathsCount = count(array_unique($lineData[$i]['includedInHitPaths'])); - - if ($includedInPathsCount > 0) { - $lineCss = 'success'; - - if ($includedInHitPathsCount === 0) { - $lineCss = 'danger'; - } elseif ($includedInHitPathsCount !== $includedInPathsCount) { - $lineCss = 'warning'; - } - - $popoverContent = '<ul>'; - - if (count($lineData[$i]['tests']) === 1) { - $popoverTitle = '1 test covers line ' . $i; - } else { - $popoverTitle = count($lineData[$i]['tests']) . ' tests cover line ' . $i; - } - $popoverTitle .= '. These are covering ' . $includedInHitPathsCount . ' out of the ' . $includedInPathsCount . ' code paths.'; - - foreach ($lineData[$i]['tests'] as $test) { - $popoverContent .= $this->createPopoverContentForTest($test, $testData[$test]); - } - - $popoverContent .= '</ul>'; - $trClass = $lineCss . ' popin'; - - $popover = sprintf( - ' data-title="%s" data-content="%s" data-placement="top" data-html="true"', - $popoverTitle, - htmlspecialchars($popoverContent, $this->htmlSpecialCharsFlags), - ); - } - - $lines .= $this->renderLine($singleLineTemplate, $i, $line, $trClass, $popover); - - $i++; - } - - $linesTemplate->setVar(['lines' => $lines]); - - return $linesTemplate->render(); - } - - private function renderBranchStructure(FileNode $node): string - { - $branchesTemplate = new Template($this->templatePath . 'branches.html.dist', '{{', '}}'); - - $coverageData = $node->functionCoverageData(); - $testData = $node->testData(); - $codeLines = $this->loadFile($node->pathAsString()); - $branches = ''; - - ksort($coverageData); - - foreach ($coverageData as $methodName => $methodData) { - if (!$methodData['branches']) { - continue; - } - - $branchStructure = ''; - - foreach ($methodData['branches'] as $branch) { - $branchStructure .= $this->renderBranchLines($branch, $codeLines, $testData); - } - - if ($branchStructure !== '') { // don't show empty branches - $branches .= '<h5 class="structure-heading"><a name="' . htmlspecialchars($methodName, $this->htmlSpecialCharsFlags) . '">' . $this->abbreviateMethodName($methodName) . '</a></h5>' . "\n"; - $branches .= $branchStructure; - } - } - - $branchesTemplate->setVar(['branches' => $branches]); - - return $branchesTemplate->render(); - } - - private function renderBranchLines(array $branch, array $codeLines, array $testData): string - { - $linesTemplate = new Template($this->templatePath . 'lines.html.dist', '{{', '}}'); - $singleLineTemplate = new Template($this->templatePath . 'line.html.dist', '{{', '}}'); - - $lines = ''; - - $branchLines = range($branch['line_start'], $branch['line_end']); - sort($branchLines); // sometimes end_line < start_line - - /** @var int $line */ - foreach ($branchLines as $line) { - if (!isset($codeLines[$line])) { // blank line at end of file is sometimes included here - continue; - } - - $popoverContent = ''; - $popoverTitle = ''; - - $numTests = count($branch['hit']); - - if ($numTests === 0) { - $trClass = 'danger'; - } else { - $lineCss = 'covered-by-large-tests'; - $popoverContent = '<ul>'; - - if ($numTests > 1) { - $popoverTitle = $numTests . ' tests cover this branch'; - } else { - $popoverTitle = '1 test covers this branch'; - } - - foreach ($branch['hit'] as $test) { - if ($lineCss === 'covered-by-large-tests' && $testData[$test]['size'] === 'medium') { - $lineCss = 'covered-by-medium-tests'; - } elseif ($testData[$test]['size'] === 'small') { - $lineCss = 'covered-by-small-tests'; - } - - $popoverContent .= $this->createPopoverContentForTest($test, $testData[$test]); - } - $trClass = $lineCss . ' popin'; - } - - $popover = ''; - - if (!empty($popoverTitle)) { - $popover = sprintf( - ' data-title="%s" data-content="%s" data-placement="top" data-html="true"', - $popoverTitle, - htmlspecialchars($popoverContent, $this->htmlSpecialCharsFlags), - ); - } - - $lines .= $this->renderLine($singleLineTemplate, $line, $codeLines[$line - 1], $trClass, $popover); - } - - if ($lines === '') { - return ''; - } - - $linesTemplate->setVar(['lines' => $lines]); - - return $linesTemplate->render(); - } - - private function renderPathStructure(FileNode $node): string - { - $pathsTemplate = new Template($this->templatePath . 'paths.html.dist', '{{', '}}'); - - $coverageData = $node->functionCoverageData(); - $testData = $node->testData(); - $codeLines = $this->loadFile($node->pathAsString()); - $paths = ''; - - ksort($coverageData); - - foreach ($coverageData as $methodName => $methodData) { - if (!$methodData['paths']) { - continue; - } - - $pathStructure = ''; - - if (count($methodData['paths']) > 100) { - $pathStructure .= '<p>' . count($methodData['paths']) . ' is too many paths to sensibly render, consider refactoring your code to bring this number down.</p>'; - - continue; - } - - foreach ($methodData['paths'] as $path) { - $pathStructure .= $this->renderPathLines($path, $methodData['branches'], $codeLines, $testData); - } - - if ($pathStructure !== '') { - $paths .= '<h5 class="structure-heading"><a name="' . htmlspecialchars($methodName, $this->htmlSpecialCharsFlags) . '">' . $this->abbreviateMethodName($methodName) . '</a></h5>' . "\n"; - $paths .= $pathStructure; - } - } - - $pathsTemplate->setVar(['paths' => $paths]); - - return $pathsTemplate->render(); - } - - private function renderPathLines(array $path, array $branches, array $codeLines, array $testData): string - { - $linesTemplate = new Template($this->templatePath . 'lines.html.dist', '{{', '}}'); - $singleLineTemplate = new Template($this->templatePath . 'line.html.dist', '{{', '}}'); - - $lines = ''; - $first = true; - - foreach ($path['path'] as $branchId) { - if ($first) { - $first = false; - } else { - $lines .= ' <tr><td colspan="2"> </td></tr>' . "\n"; - } - - $branchLines = range($branches[$branchId]['line_start'], $branches[$branchId]['line_end']); - sort($branchLines); // sometimes end_line < start_line - - /** @var int $line */ - foreach ($branchLines as $line) { - if (!isset($codeLines[$line])) { // blank line at end of file is sometimes included here - continue; - } - - $popoverContent = ''; - $popoverTitle = ''; - - $numTests = count($path['hit']); - - if ($numTests === 0) { - $trClass = 'danger'; - } else { - $lineCss = 'covered-by-large-tests'; - $popoverContent = '<ul>'; - - if ($numTests > 1) { - $popoverTitle = $numTests . ' tests cover this path'; - } else { - $popoverTitle = '1 test covers this path'; - } - - foreach ($path['hit'] as $test) { - if ($lineCss === 'covered-by-large-tests' && $testData[$test]['size'] === 'medium') { - $lineCss = 'covered-by-medium-tests'; - } elseif ($testData[$test]['size'] === 'small') { - $lineCss = 'covered-by-small-tests'; - } - - $popoverContent .= $this->createPopoverContentForTest($test, $testData[$test]); - } - - $trClass = $lineCss . ' popin'; - } - - $popover = ''; - - if (!empty($popoverTitle)) { - $popover = sprintf( - ' data-title="%s" data-content="%s" data-placement="top" data-html="true"', - $popoverTitle, - htmlspecialchars($popoverContent, $this->htmlSpecialCharsFlags), - ); - } - - $lines .= $this->renderLine($singleLineTemplate, $line, $codeLines[$line - 1], $trClass, $popover); - } - } - - if ($lines === '') { - return ''; - } - - $linesTemplate->setVar(['lines' => $lines]); - - return $linesTemplate->render(); - } - - private function renderLine(Template $template, int $lineNumber, string $lineContent, string $class, string $popover): string - { - $template->setVar( - [ - 'lineNumber' => $lineNumber, - 'lineContent' => $lineContent, - 'class' => $class, - 'popover' => $popover, - ], - ); - - return $template->render(); - } - - private function loadFile(string $file): array - { - if (isset(self::$formattedSourceCache[$file])) { - return self::$formattedSourceCache[$file]; - } - - $buffer = file_get_contents($file); - $tokens = token_get_all($buffer); - $result = ['']; - $i = 0; - $stringFlag = false; - $fileEndsWithNewLine = str_ends_with($buffer, "\n"); - - unset($buffer); - - foreach ($tokens as $j => $token) { - if (is_string($token)) { - if ($token === '"' && $tokens[$j - 1] !== '\\') { - $result[$i] .= sprintf( - '<span class="string">%s</span>', - htmlspecialchars($token, $this->htmlSpecialCharsFlags), - ); - - $stringFlag = !$stringFlag; - } else { - $result[$i] .= sprintf( - '<span class="keyword">%s</span>', - htmlspecialchars($token, $this->htmlSpecialCharsFlags), - ); - } - - continue; - } - - [$token, $value] = $token; - - $value = str_replace( - ["\t", ' '], - ['    ', ' '], - htmlspecialchars($value, $this->htmlSpecialCharsFlags), - ); - - if ($value === "\n") { - $result[++$i] = ''; - } else { - $lines = explode("\n", $value); - - foreach ($lines as $jj => $line) { - $line = trim($line); - - if ($line !== '') { - if ($stringFlag) { - $colour = 'string'; - } else { - $colour = 'default'; - - if ($this->isInlineHtml($token)) { - $colour = 'html'; - } elseif ($this->isComment($token)) { - $colour = 'comment'; - } elseif ($this->isKeyword($token)) { - $colour = 'keyword'; - } - } - - $result[$i] .= sprintf( - '<span class="%s">%s</span>', - $colour, - $line, - ); - } - - if (isset($lines[$jj + 1])) { - $result[++$i] = ''; - } - } - } - } - - if ($fileEndsWithNewLine) { - unset($result[count($result) - 1]); - } - - self::$formattedSourceCache[$file] = $result; - - return $result; - } - - private function abbreviateClassName(string $className): string - { - $tmp = explode('\\', $className); - - if (count($tmp) > 1) { - $className = sprintf( - '<abbr title="%s">%s</abbr>', - $className, - array_pop($tmp), - ); - } - - return $className; - } - - private function abbreviateMethodName(string $methodName): string - { - $parts = explode('->', $methodName); - - if (count($parts) === 2) { - return $this->abbreviateClassName($parts[0]) . '->' . $parts[1]; - } - - return $methodName; - } - - private function createPopoverContentForTest(string $test, array $testData): string - { - $testCSS = ''; - - switch ($testData['status']) { - case 'success': - $testCSS = match ($testData['size']) { - 'small' => ' class="covered-by-small-tests"', - 'medium' => ' class="covered-by-medium-tests"', - // no break - default => ' class="covered-by-large-tests"', - }; - - break; - - case 'failure': - $testCSS = ' class="danger"'; - - break; - } - - return sprintf( - '<li%s>%s</li>', - $testCSS, - htmlspecialchars($test, $this->htmlSpecialCharsFlags), - ); - } - - private function isComment(int $token): bool - { - return $token === T_COMMENT || $token === T_DOC_COMMENT; - } - - private function isInlineHtml(int $token): bool - { - return $token === T_INLINE_HTML; - } - - private function isKeyword(int $token): bool - { - return isset(self::KEYWORD_TOKENS[$token]); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/branches.html.dist b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/branches.html.dist deleted file mode 100644 index 5477026..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/branches.html.dist +++ /dev/null @@ -1,9 +0,0 @@ -<hr/> -<h4>Branches</h4> -<p> - Below are the source code lines that represent each code branch as identified by Xdebug. Please note a branch is not - necessarily coterminous with a line, a line may contain multiple branches and therefore show up more than once. - Please also be aware that some branches may be implicit rather than explicit, e.g. an <code>if</code> statement - <i>always</i> has an <code>else</code> as part of its logical flow even if you didn't write one. -</p> -{{branches}} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/coverage_bar.html.dist b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/coverage_bar.html.dist deleted file mode 100644 index 7fcf6f4..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/coverage_bar.html.dist +++ /dev/null @@ -1,5 +0,0 @@ - <div class="progress"> - <div class="progress-bar bg-{{level}}" role="progressbar" aria-valuenow="{{percent}}" aria-valuemin="0" aria-valuemax="100" style="width: {{percent}}%"> - <span class="sr-only">{{percent}}% covered ({{level}})</span> - </div> - </div> diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/coverage_bar_branch.html.dist b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/coverage_bar_branch.html.dist deleted file mode 100644 index 7fcf6f4..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/coverage_bar_branch.html.dist +++ /dev/null @@ -1,5 +0,0 @@ - <div class="progress"> - <div class="progress-bar bg-{{level}}" role="progressbar" aria-valuenow="{{percent}}" aria-valuemin="0" aria-valuemax="100" style="width: {{percent}}%"> - <span class="sr-only">{{percent}}% covered ({{level}})</span> - </div> - </div> diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/bootstrap.min.css b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/bootstrap.min.css deleted file mode 100644 index 83a71b1..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/bootstrap.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v4.6.2 (https://getbootstrap.com/) - * Copyright 2011-2022 The Bootstrap Authors - * Copyright 2011-2022 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([class]){color:inherit;text-decoration:none}a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:.875em;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-sm-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-sm-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-md-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-md-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-md-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-md-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-md-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-md-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-lg-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-lg-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-xl-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-xl-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{-webkit-appearance:none;-moz-appearance:none;appearance:none}select.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;font-size:1rem;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#28a745}.valid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.form-row>.col>.valid-tooltip,.form-row>[class*=col-]>.valid-tooltip{left:5px}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem)!important;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.was-validated select.form-control:valid,select.form-control.is-valid{padding-right:3rem!important;background-position:right 1.5rem center}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc(.75em + 2.3125rem)!important;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#28a745}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.form-row>.col>.invalid-tooltip,.form-row>[class*=col-]>.invalid-tooltip{left:5px}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem)!important;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.was-validated select.form-control:invalid,select.form-control.is-invalid{padding-right:3rem!important;background-position:right 1.5rem center}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc(.75em + 2.3125rem)!important;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#0069d9;border-color:#0062cc;box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{color:#fff;background-color:#5a6268;border-color:#545b62;box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#218838;border-color:#1e7e34;box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#138496;border-color:#117a8b;box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{color:#212529;background-color:#e0a800;border-color:#d39e00;box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c82333;border-color:#bd2130;box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{color:#212529;background-color:#e2e6ea;border-color:#dae0e5;box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{color:#fff;background-color:#23272b;border-color:#1d2124;box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.width{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion:reduce){.collapsing.width{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;min-width:0;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label,.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label::after,.input-group:not(.has-validation)>.custom-select:not(:last-child),.input-group:not(.has-validation)>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label,.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label::after,.input-group.has-validation>.custom-select:nth-last-child(n+3),.input-group.has-validation>.form-control:nth-last-child(n+3){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.btn,.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.input-group-text,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.btn,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;z-index:1;display:block;min-height:1.5rem;padding-left:1.5rem;-webkit-print-color-adjust:exact;color-adjust:exact;print-color-adjust:exact}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.25rem;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label,.custom-control-input[disabled]~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before,.custom-control-input[disabled]~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:1px solid #adb5bd}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:50%/50% 50% no-repeat}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;overflow:hidden;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label,.custom-file-input[disabled]~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;overflow:hidden;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:1.4rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;-ms-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{-ms-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;background-color:transparent;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{isolation:isolate;border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{background:0 0;border:0;border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item,.nav-fill>.nav-link{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:50%/100% 100% no-repeat}.navbar-nav-scroll{max-height:75vh;overflow-y:auto}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem;border-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom,.card-img-top{-ms-flex-negative:0;flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{-ms-flex:1 0 0%;flex:1 0 0%;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion{overflow-anchor:none}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:3;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;z-index:2;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;line-height:0;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:1s linear infinite progress-bar-stripes;animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0}a.close.disabled{pointer-events:none}.toast{-ms-flex-preferred-size:350px;flex-basis:350px;max-width:350px;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal.modal-static .modal-dialog{-webkit-transform:scale(1.02);transform:scale(1.02)}.modal-dialog-scrollable{display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);height:-webkit-min-content;height:-moz-min-content;height:min-content;content:""}.modal-dialog-centered.modal-dialog-scrollable{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem);height:-webkit-min-content;height:-moz-min-content;height:min-content}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow::before,.bs-popover-top>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow::after,.bs-popover-top>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow::before,.bs-popover-right>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow::after,.bs-popover-right>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow::before,.bs-popover-bottom>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow::after,.bs-popover-bottom>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow::before,.bs-popover-left>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow::after,.bs-popover-left>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:50%/100% 100% no-repeat}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em solid currentcolor;border-right-color:transparent;border-radius:50%;-webkit-animation:.75s linear infinite spinner-border;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1;-webkit-transform:none;transform:none}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1;-webkit-transform:none;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentcolor;border-radius:50%;opacity:0;-webkit-animation:.75s linear infinite spinner-grow;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;-ms-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;word-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}} -/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/custom.css b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/custom.css deleted file mode 100644 index e69de29..0000000 diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/nv.d3.min.css b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/nv.d3.min.css deleted file mode 100644 index 7a6f7fe..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/nv.d3.min.css +++ /dev/null @@ -1 +0,0 @@ -.nvd3 .nv-axis{pointer-events:none;opacity:1}.nvd3 .nv-axis path{fill:none;stroke:#000;stroke-opacity:.75;shape-rendering:crispEdges}.nvd3 .nv-axis path.domain{stroke-opacity:.75}.nvd3 .nv-axis.nv-x path.domain{stroke-opacity:0}.nvd3 .nv-axis line{fill:none;stroke:#e5e5e5;shape-rendering:crispEdges}.nvd3 .nv-axis .zero line,.nvd3 .nv-axis line.zero{stroke-opacity:.75}.nvd3 .nv-axis .nv-axisMaxMin text{font-weight:700}.nvd3 .x .nv-axis .nv-axisMaxMin text,.nvd3 .x2 .nv-axis .nv-axisMaxMin text,.nvd3 .x3 .nv-axis .nv-axisMaxMin text{text-anchor:middle}.nvd3 .nv-axis.nv-disabled{opacity:0}.nvd3 .nv-bars rect{fill-opacity:.75;transition:fill-opacity 250ms linear;-moz-transition:fill-opacity 250ms linear;-webkit-transition:fill-opacity 250ms linear}.nvd3 .nv-bars rect.hover{fill-opacity:1}.nvd3 .nv-bars .hover rect{fill:#add8e6}.nvd3 .nv-bars text{fill:rgba(0,0,0,0)}.nvd3 .nv-bars .hover text{fill:rgba(0,0,0,1)}.nvd3 .nv-multibar .nv-groups rect,.nvd3 .nv-multibarHorizontal .nv-groups rect,.nvd3 .nv-discretebar .nv-groups rect{stroke-opacity:0;transition:fill-opacity 250ms linear;-moz-transition:fill-opacity 250ms linear;-webkit-transition:fill-opacity 250ms linear}.nvd3 .nv-multibar .nv-groups rect:hover,.nvd3 .nv-multibarHorizontal .nv-groups rect:hover,.nvd3 .nv-candlestickBar .nv-ticks rect:hover,.nvd3 .nv-discretebar .nv-groups rect:hover{fill-opacity:1}.nvd3 .nv-discretebar .nv-groups text,.nvd3 .nv-multibarHorizontal .nv-groups text{font-weight:700;fill:rgba(0,0,0,1);stroke:rgba(0,0,0,0)}.nvd3 .nv-boxplot circle{fill-opacity:.5}.nvd3 .nv-boxplot circle:hover{fill-opacity:1}.nvd3 .nv-boxplot rect:hover{fill-opacity:1}.nvd3 line.nv-boxplot-median{stroke:#000}.nv-boxplot-tick:hover{stroke-width:2.5px}.nvd3.nv-bullet{font:10px sans-serif}.nvd3.nv-bullet .nv-measure{fill-opacity:.8}.nvd3.nv-bullet .nv-measure:hover{fill-opacity:1}.nvd3.nv-bullet .nv-marker{stroke:#000;stroke-width:2px}.nvd3.nv-bullet .nv-markerTriangle{stroke:#000;fill:#fff;stroke-width:1.5px}.nvd3.nv-bullet .nv-tick line{stroke:#666;stroke-width:.5px}.nvd3.nv-bullet .nv-range.nv-s0{fill:#eee}.nvd3.nv-bullet .nv-range.nv-s1{fill:#ddd}.nvd3.nv-bullet .nv-range.nv-s2{fill:#ccc}.nvd3.nv-bullet .nv-title{font-size:14px;font-weight:700}.nvd3.nv-bullet .nv-subtitle{fill:#999}.nvd3.nv-bullet .nv-range{fill:#bababa;fill-opacity:.4}.nvd3.nv-bullet .nv-range:hover{fill-opacity:.7}.nvd3.nv-candlestickBar .nv-ticks .nv-tick{stroke-width:1px}.nvd3.nv-candlestickBar .nv-ticks .nv-tick.hover{stroke-width:2px}.nvd3.nv-candlestickBar .nv-ticks .nv-tick.positive rect{stroke:#2ca02c;fill:#2ca02c}.nvd3.nv-candlestickBar .nv-ticks .nv-tick.negative rect{stroke:#d62728;fill:#d62728}.with-transitions .nv-candlestickBar .nv-ticks .nv-tick{transition:stroke-width 250ms linear,stroke-opacity 250ms linear;-moz-transition:stroke-width 250ms linear,stroke-opacity 250ms linear;-webkit-transition:stroke-width 250ms linear,stroke-opacity 250ms linear}.nvd3.nv-candlestickBar .nv-ticks line{stroke:#333}.nvd3 .nv-legend .nv-disabled rect{}.nvd3 .nv-check-box .nv-box{fill-opacity:0;stroke-width:2}.nvd3 .nv-check-box .nv-check{fill-opacity:0;stroke-width:4}.nvd3 .nv-series.nv-disabled .nv-check-box .nv-check{fill-opacity:0;stroke-opacity:0}.nvd3 .nv-controlsWrap .nv-legend .nv-check-box .nv-check{opacity:0}.nvd3.nv-linePlusBar .nv-bar rect{fill-opacity:.75}.nvd3.nv-linePlusBar .nv-bar rect:hover{fill-opacity:1}.nvd3 .nv-groups path.nv-line{fill:none}.nvd3 .nv-groups path.nv-area{stroke:none}.nvd3.nv-line .nvd3.nv-scatter .nv-groups .nv-point{fill-opacity:0;stroke-opacity:0}.nvd3.nv-scatter.nv-single-point .nv-groups .nv-point{fill-opacity:.5!important;stroke-opacity:.5!important}.with-transitions .nvd3 .nv-groups .nv-point{transition:stroke-width 250ms linear,stroke-opacity 250ms linear;-moz-transition:stroke-width 250ms linear,stroke-opacity 250ms linear;-webkit-transition:stroke-width 250ms linear,stroke-opacity 250ms linear}.nvd3.nv-scatter .nv-groups .nv-point.hover,.nvd3 .nv-groups .nv-point.hover{stroke-width:7px;fill-opacity:.95!important;stroke-opacity:.95!important}.nvd3 .nv-point-paths path{stroke:#aaa;stroke-opacity:0;fill:#eee;fill-opacity:0}.nvd3 .nv-indexLine{cursor:ew-resize}svg.nvd3-svg{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-ms-user-select:none;-moz-user-select:none;user-select:none;display:block;width:100%;height:100%}.nvtooltip.with-3d-shadow,.with-3d-shadow .nvtooltip{-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nvd3 text{font:400 12px Arial}.nvd3 .title{font:700 14px Arial}.nvd3 .nv-background{fill:#fff;fill-opacity:0}.nvd3.nv-noData{font-size:18px;font-weight:700}.nv-brush .extent{fill-opacity:.125;shape-rendering:crispEdges}.nv-brush .resize path{fill:#eee;stroke:#666}.nvd3 .nv-legend .nv-series{cursor:pointer}.nvd3 .nv-legend .nv-disabled circle{fill-opacity:0}.nvd3 .nv-brush .extent{fill-opacity:0!important}.nvd3 .nv-brushBackground rect{stroke:#000;stroke-width:.4;fill:#fff;fill-opacity:.7}.nvd3.nv-ohlcBar .nv-ticks .nv-tick{stroke-width:1px}.nvd3.nv-ohlcBar .nv-ticks .nv-tick.hover{stroke-width:2px}.nvd3.nv-ohlcBar .nv-ticks .nv-tick.positive{stroke:#2ca02c}.nvd3.nv-ohlcBar .nv-ticks .nv-tick.negative{stroke:#d62728}.nvd3 .background path{fill:none;stroke:#EEE;stroke-opacity:.4;shape-rendering:crispEdges}.nvd3 .foreground path{fill:none;stroke-opacity:.7}.nvd3 .nv-parallelCoordinates-brush .extent{fill:#fff;fill-opacity:.6;stroke:gray;shape-rendering:crispEdges}.nvd3 .nv-parallelCoordinates .hover{fill-opacity:1;stroke-width:3px}.nvd3 .missingValuesline line{fill:none;stroke:#000;stroke-width:1;stroke-opacity:1;stroke-dasharray:5,5}.nvd3.nv-pie path{stroke-opacity:0;transition:fill-opacity 250ms linear,stroke-width 250ms linear,stroke-opacity 250ms linear;-moz-transition:fill-opacity 250ms linear,stroke-width 250ms linear,stroke-opacity 250ms linear;-webkit-transition:fill-opacity 250ms linear,stroke-width 250ms linear,stroke-opacity 250ms linear}.nvd3.nv-pie .nv-pie-title{font-size:24px;fill:rgba(19,196,249,.59)}.nvd3.nv-pie .nv-slice text{stroke:#000;stroke-width:0}.nvd3.nv-pie path{stroke:#fff;stroke-width:1px;stroke-opacity:1}.nvd3.nv-pie .hover path{fill-opacity:.7}.nvd3.nv-pie .nv-label{pointer-events:none}.nvd3.nv-pie .nv-label rect{fill-opacity:0;stroke-opacity:0}.nvd3 .nv-groups .nv-point.hover{stroke-width:20px;stroke-opacity:.5}.nvd3 .nv-scatter .nv-point.hover{fill-opacity:1}.nv-noninteractive{pointer-events:none}.nv-distx,.nv-disty{pointer-events:none}.nvd3.nv-sparkline path{fill:none}.nvd3.nv-sparklineplus g.nv-hoverValue{pointer-events:none}.nvd3.nv-sparklineplus .nv-hoverValue line{stroke:#333;stroke-width:1.5px}.nvd3.nv-sparklineplus,.nvd3.nv-sparklineplus g{pointer-events:all}.nvd3 .nv-hoverArea{fill-opacity:0;stroke-opacity:0}.nvd3.nv-sparklineplus .nv-xValue,.nvd3.nv-sparklineplus .nv-yValue{stroke-width:0;font-size:.9em;font-weight:400}.nvd3.nv-sparklineplus .nv-yValue{stroke:#f66}.nvd3.nv-sparklineplus .nv-maxValue{stroke:#2ca02c;fill:#2ca02c}.nvd3.nv-sparklineplus .nv-minValue{stroke:#d62728;fill:#d62728}.nvd3.nv-sparklineplus .nv-currentValue{font-weight:700;font-size:1.1em}.nvd3.nv-stackedarea path.nv-area{fill-opacity:.7;stroke-opacity:0;transition:fill-opacity 250ms linear,stroke-opacity 250ms linear;-moz-transition:fill-opacity 250ms linear,stroke-opacity 250ms linear;-webkit-transition:fill-opacity 250ms linear,stroke-opacity 250ms linear}.nvd3.nv-stackedarea path.nv-area.hover{fill-opacity:.9}.nvd3.nv-stackedarea .nv-groups .nv-point{stroke-opacity:0;fill-opacity:0}.nvtooltip{position:absolute;background-color:rgba(255,255,255,1);color:rgba(0,0,0,1);padding:1px;border:1px solid rgba(0,0,0,.2);z-index:10000;display:block;font-family:Arial;font-size:13px;text-align:left;pointer-events:none;white-space:nowrap;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.nvtooltip{background:rgba(255,255,255,.8);border:1px solid rgba(0,0,0,.5);border-radius:4px}.nvtooltip.with-transitions,.with-transitions .nvtooltip{transition:opacity 50ms linear;-moz-transition:opacity 50ms linear;-webkit-transition:opacity 50ms linear;transition-delay:200ms;-moz-transition-delay:200ms;-webkit-transition-delay:200ms}.nvtooltip.x-nvtooltip,.nvtooltip.y-nvtooltip{padding:8px}.nvtooltip h3{margin:0;padding:4px 14px;line-height:18px;font-weight:400;background-color:rgba(247,247,247,.75);color:rgba(0,0,0,1);text-align:center;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.nvtooltip p{margin:0;padding:5px 14px;text-align:center}.nvtooltip span{display:inline-block;margin:2px 0}.nvtooltip table{margin:6px;border-spacing:0}.nvtooltip table td{padding:2px 9px 2px 0;vertical-align:middle}.nvtooltip table td.key{font-weight:400}.nvtooltip table td.value{text-align:right;font-weight:700}.nvtooltip table tr.highlight td{padding:1px 9px 1px 0;border-bottom-style:solid;border-bottom-width:1px;border-top-style:solid;border-top-width:1px}.nvtooltip table td.legend-color-guide div{width:8px;height:8px;vertical-align:middle}.nvtooltip table td.legend-color-guide div{width:12px;height:12px;border:1px solid #999}.nvtooltip .footer{padding:3px;text-align:center}.nvtooltip-pending-removal{pointer-events:none;display:none}.nvd3 .nv-interactiveGuideLine{pointer-events:none}.nvd3 line.nv-guideline{stroke:#ccc} \ No newline at end of file diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/octicons.css b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/octicons.css deleted file mode 100644 index 31d9786..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/octicons.css +++ /dev/null @@ -1,5 +0,0 @@ -.octicon { - display: inline-block; - vertical-align: text-top; - fill: currentColor; -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/style.css b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/style.css deleted file mode 100644 index 04ebcd8..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/style.css +++ /dev/null @@ -1,158 +0,0 @@ -body { - font-family: sans-serif; - font-size: 1em; - font-kerning: normal; - font-variant-ligatures: common-ligatures; - text-rendering: optimizeLegibility; - padding-top: 10px; -} - -.popover { - max-width: none; -} - -.octicon { - margin-right:.25em; - vertical-align: baseline; - width: 0.75em; -} - -.table-bordered>thead>tr>td { - border-bottom-width: 1px; -} - -.table tbody>tr>td, .table thead>tr>td { - padding-top: 3px; - padding-bottom: 3px; -} - -.table-condensed tbody>tr>td { - padding-top: 0; - padding-bottom: 0; -} - -.table .progress { - margin-bottom: inherit; -} - -.table-borderless th, .table-borderless td { - border: 0 !important; -} - -.table tbody tr.covered-by-large-tests, li.covered-by-large-tests, tr.success, td.success, li.success, span.success { - background-color: {{success-low}}; -} - -.table tbody tr.covered-by-medium-tests, li.covered-by-medium-tests { - background-color: {{success-medium}}; -} - -.table tbody tr.covered-by-small-tests, li.covered-by-small-tests { - background-color: {{success-high}}; -} - -.table tbody tr.warning, .table tbody td.warning, li.warning, span.warning { - background-color: {{warning}}; -} - -.table tbody tr.danger, .table tbody td.danger, li.danger, span.danger { - background-color: {{danger}}; -} - -.table tbody td.info { - background-color: #d9edf7; -} - -td.big { - vertical-align: middle; - width: 117px; -} - -td.small { -} - -td.codeLine { - font-family: "Source Code Pro", "SFMono-Regular", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - white-space: pre-wrap; -} - -td span.comment { - color: #888a85; -} - -td span.default { - color: #2e3436; -} - -td span.html { - color: #888a85; -} - -td span.keyword { - color: #2e3436; - font-weight: bold; -} - -pre span.string { - color: #2e3436; -} - -span.success, span.warning, span.danger { - margin-right: 2px; - padding-left: 10px; - padding-right: 10px; - text-align: center; -} - -#toplink { - position: fixed; - left: 5px; - bottom: 5px; - outline: 0; -} - -svg text { - font-family: "Lucida Grande", "Lucida Sans Unicode", Verdana, Arial, Helvetica, sans-serif; - font-size: 11px; - color: #666; - fill: #666; -} - -.scrollbox { - height:245px; - overflow-x:scroll; - overflow-y:scroll; -} - -table + .structure-heading { - border-top: 1px solid lightgrey; - padding-top: 0.5em; -} - -.legend { - font-weight: bold; - margin-right: 2px; - padding-left: 10px; - padding-right: 10px; - text-align: center; -} - -.covered-by-small-tests { - background-color: {{success-high}}; -} - -.covered-by-medium-tests { - background-color: {{success-medium}}; -} - -.covered-by-large-tests { - background-color: {{success-low}}; -} - -.not-covered { - background-color: {{danger}}; -} - -.not-coverable { - background-color: {{warning}}; -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/dashboard.html.dist b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/dashboard.html.dist deleted file mode 100644 index 60e66d5..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/dashboard.html.dist +++ /dev/null @@ -1,281 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> - <head> - <meta charset="UTF-8"> - <title>Dashboard for {{full_path}} - - - - - - - -
-
-
-
- -
-
-
-
-
-
-
-

Classes

-
-
-
-
-

Coverage Distribution

-
- -
-
-
-

Complexity

-
- -
-
-
-
-
-

Insufficient Coverage

-
- - - - - - - - -{{insufficient_coverage_classes}} - -
ClassCoverage
-
-
-
-

Project Risks

-
- - - - - - - - -{{project_risks_classes}} - -
ClassCRAP
-
-
-
-
-
-

Methods

-
-
-
-
-

Coverage Distribution

-
- -
-
-
-

Complexity

-
- -
-
-
-
-
-

Insufficient Coverage

-
- - - - - - - - -{{insufficient_coverage_methods}} - -
MethodCoverage
-
-
-
-

Project Risks

-
- - - - - - - - -{{project_risks_methods}} - -
MethodCRAP
-
-
-
- -
- - - - - - diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/dashboard_branch.html.dist b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/dashboard_branch.html.dist deleted file mode 100644 index 60e66d5..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/dashboard_branch.html.dist +++ /dev/null @@ -1,281 +0,0 @@ - - - - - Dashboard for {{full_path}} - - - - - - - -
-
-
-
- -
-
-
-
-
-
-
-

Classes

-
-
-
-
-

Coverage Distribution

-
- -
-
-
-

Complexity

-
- -
-
-
-
-
-

Insufficient Coverage

-
- - - - - - - - -{{insufficient_coverage_classes}} - -
ClassCoverage
-
-
-
-

Project Risks

-
- - - - - - - - -{{project_risks_classes}} - -
ClassCRAP
-
-
-
-
-
-

Methods

-
-
-
-
-

Coverage Distribution

-
- -
-
-
-

Complexity

-
- -
-
-
-
-
-

Insufficient Coverage

-
- - - - - - - - -{{insufficient_coverage_methods}} - -
MethodCoverage
-
-
-
-

Project Risks

-
- - - - - - - - -{{project_risks_methods}} - -
MethodCRAP
-
-
-
- -
- - - - - - diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory.html.dist b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory.html.dist deleted file mode 100644 index f769d2c..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory.html.dist +++ /dev/null @@ -1,60 +0,0 @@ - - - - - Code Coverage for {{full_path}} - - - - - - - -
-
-
-
- -
-
-
-
-
-
- - - - - - - - - - - - - - -{{items}} - -
 
Code Coverage
 
Lines
Functions and Methods
Classes and Traits
-
-
-
-

Legend

-

- Low: 0% to {{low_upper_bound}}% - Medium: {{low_upper_bound}}% to {{high_lower_bound}}% - High: {{high_lower_bound}}% to 100% -

-

- Generated by php-code-coverage {{version}} using {{runtime}}{{generator}} at {{date}}. -

-
-
- - diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory_branch.html.dist b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory_branch.html.dist deleted file mode 100644 index a40c2e1..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory_branch.html.dist +++ /dev/null @@ -1,62 +0,0 @@ - - - - - Code Coverage for {{full_path}} - - - - - - - -
-
-
-
- -
-
-
-
-
-
- - - - - - - - - - - - - - - - -{{items}} - -
 
Code Coverage
 
Lines
Branches
Paths
Functions and Methods
Classes and Traits
-
-
-
-

Legend

-

- Low: 0% to {{low_upper_bound}}% - Medium: {{low_upper_bound}}% to {{high_lower_bound}}% - High: {{high_lower_bound}}% to 100% -

-

- Generated by php-code-coverage {{version}} using {{runtime}}{{generator}} at {{date}}. -

-
-
- - diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory_item.html.dist b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory_item.html.dist deleted file mode 100644 index f6941a4..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory_item.html.dist +++ /dev/null @@ -1,13 +0,0 @@ -
{{icon}}{{name}}{{lines_bar}}
{{lines_executed_percent}}
{{lines_number}}
{{methods_bar}}
{{methods_tested_percent}}
{{methods_number}}
{{classes_bar}}
{{classes_tested_percent}}
{{classes_number}}
{{icon}}{{name}}{{lines_bar}}
{{lines_executed_percent}}
{{lines_number}}
{{branches_bar}}
{{branches_executed_percent}}
{{branches_number}}
{{paths_bar}}
{{paths_executed_percent}}
{{paths_number}}
{{methods_bar}}
{{methods_tested_percent}}
{{methods_number}}
{{classes_bar}}
{{classes_tested_percent}}
{{classes_number}}
- - - - - - - - - - - - - -{{items}} - -
 
Code Coverage
 
Lines
Functions and Methods
Classes and Traits
- -{{lines}} -{{structure}} - - - - - - - - diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file_branch.html.dist b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file_branch.html.dist deleted file mode 100644 index f48ebf1..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file_branch.html.dist +++ /dev/null @@ -1,67 +0,0 @@ - - - - - Code Coverage for {{full_path}} - - - - - - - -
-
-
-
- -
-
-
-
-
-
- - - - - - - - - - - - - - - - -{{items}} - -
 
Code Coverage
 
Lines
Branches
Paths
Functions and Methods
Classes and Traits
-
-{{lines}} -{{structure}} - -
- - - - - - diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file_item.html.dist b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file_item.html.dist deleted file mode 100644 index b1c0fca..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file_item.html.dist +++ /dev/null @@ -1,14 +0,0 @@ - - {{name}} - {{lines_bar}} -
{{lines_executed_percent}}
-
{{lines_number}}
- {{methods_bar}} -
{{methods_tested_percent}}
-
{{methods_number}}
- {{crap}} - {{classes_bar}} -
{{classes_tested_percent}}
-
{{classes_number}}
- - diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file_item_branch.html.dist b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file_item_branch.html.dist deleted file mode 100644 index 5050251..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file_item_branch.html.dist +++ /dev/null @@ -1,20 +0,0 @@ - - {{name}} - {{lines_bar}} -
{{lines_executed_percent}}
-
{{lines_number}}
- {{branches_bar}} -
{{branches_executed_percent}}
-
{{branches_number}}
- {{paths_bar}} -
{{paths_executed_percent}}
-
{{paths_number}}
- {{methods_bar}} -
{{methods_tested_percent}}
-
{{methods_number}}
- {{crap}} - {{classes_bar}} -
{{classes_tested_percent}}
-
{{classes_number}}
- - diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/icons/file-code.svg b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/icons/file-code.svg deleted file mode 100644 index 5b4b199..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/icons/file-code.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/icons/file-directory.svg b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/icons/file-directory.svg deleted file mode 100644 index 4bf1f1c..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/icons/file-directory.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/bootstrap.min.js b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/bootstrap.min.js deleted file mode 100644 index 97206dc..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/bootstrap.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v4.6.2 (https://getbootstrap.com/) - * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap={},t.jQuery,t.Popper)}(this,(function(t,e,n){"use strict";function i(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}var o=i(e),a=i(n);function s(t,e){for(var n=0;n=4)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}};d.jQueryDetection(),o.default.fn.emulateTransitionEnd=function(t){var e=this,n=!1;return o.default(this).one(d.TRANSITION_END,(function(){n=!0})),setTimeout((function(){n||d.triggerTransitionEnd(e)}),t),this},o.default.event.special[d.TRANSITION_END]={bindType:f,delegateType:f,handle:function(t){if(o.default(t.target).is(this))return t.handleObj.handler.apply(this,arguments)}};var c="bs.alert",h=o.default.fn.alert,g=function(){function t(t){this._element=t}var e=t.prototype;return e.close=function(t){var e=this._element;t&&(e=this._getRootElement(t)),this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},e.dispose=function(){o.default.removeData(this._element,c),this._element=null},e._getRootElement=function(t){var e=d.getSelectorFromElement(t),n=!1;return e&&(n=document.querySelector(e)),n||(n=o.default(t).closest(".alert")[0]),n},e._triggerCloseEvent=function(t){var e=o.default.Event("close.bs.alert");return o.default(t).trigger(e),e},e._removeElement=function(t){var e=this;if(o.default(t).removeClass("show"),o.default(t).hasClass("fade")){var n=d.getTransitionDurationFromElement(t);o.default(t).one(d.TRANSITION_END,(function(n){return e._destroyElement(t,n)})).emulateTransitionEnd(n)}else this._destroyElement(t)},e._destroyElement=function(t){o.default(t).detach().trigger("closed.bs.alert").remove()},t._jQueryInterface=function(e){return this.each((function(){var n=o.default(this),i=n.data(c);i||(i=new t(this),n.data(c,i)),"close"===e&&i[e](this)}))},t._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},l(t,null,[{key:"VERSION",get:function(){return"4.6.2"}}]),t}();o.default(document).on("click.bs.alert.data-api",'[data-dismiss="alert"]',g._handleDismiss(new g)),o.default.fn.alert=g._jQueryInterface,o.default.fn.alert.Constructor=g,o.default.fn.alert.noConflict=function(){return o.default.fn.alert=h,g._jQueryInterface};var m="bs.button",p=o.default.fn.button,_="active",v='[data-toggle^="button"]',y='input:not([type="hidden"])',b=".btn",E=function(){function t(t){this._element=t,this.shouldAvoidTriggerChange=!1}var e=t.prototype;return e.toggle=function(){var t=!0,e=!0,n=o.default(this._element).closest('[data-toggle="buttons"]')[0];if(n){var i=this._element.querySelector(y);if(i){if("radio"===i.type)if(i.checked&&this._element.classList.contains(_))t=!1;else{var a=n.querySelector(".active");a&&o.default(a).removeClass(_)}t&&("checkbox"!==i.type&&"radio"!==i.type||(i.checked=!this._element.classList.contains(_)),this.shouldAvoidTriggerChange||o.default(i).trigger("change")),i.focus(),e=!1}}this._element.hasAttribute("disabled")||this._element.classList.contains("disabled")||(e&&this._element.setAttribute("aria-pressed",!this._element.classList.contains(_)),t&&o.default(this._element).toggleClass(_))},e.dispose=function(){o.default.removeData(this._element,m),this._element=null},t._jQueryInterface=function(e,n){return this.each((function(){var i=o.default(this),a=i.data(m);a||(a=new t(this),i.data(m,a)),a.shouldAvoidTriggerChange=n,"toggle"===e&&a[e]()}))},l(t,null,[{key:"VERSION",get:function(){return"4.6.2"}}]),t}();o.default(document).on("click.bs.button.data-api",v,(function(t){var e=t.target,n=e;if(o.default(e).hasClass("btn")||(e=o.default(e).closest(b)[0]),!e||e.hasAttribute("disabled")||e.classList.contains("disabled"))t.preventDefault();else{var i=e.querySelector(y);if(i&&(i.hasAttribute("disabled")||i.classList.contains("disabled")))return void t.preventDefault();"INPUT"!==n.tagName&&"LABEL"===e.tagName||E._jQueryInterface.call(o.default(e),"toggle","INPUT"===n.tagName)}})).on("focus.bs.button.data-api blur.bs.button.data-api",v,(function(t){var e=o.default(t.target).closest(b)[0];o.default(e).toggleClass("focus",/^focus(in)?$/.test(t.type))})),o.default(window).on("load.bs.button.data-api",(function(){for(var t=[].slice.call(document.querySelectorAll('[data-toggle="buttons"] .btn')),e=0,n=t.length;e0,this._pointerEvent=Boolean(window.PointerEvent||window.MSPointerEvent),this._addEventListeners()}var e=t.prototype;return e.next=function(){this._isSliding||this._slide(N)},e.nextWhenVisible=function(){var t=o.default(this._element);!document.hidden&&t.is(":visible")&&"hidden"!==t.css("visibility")&&this.next()},e.prev=function(){this._isSliding||this._slide(D)},e.pause=function(t){t||(this._isPaused=!0),this._element.querySelector(".carousel-item-next, .carousel-item-prev")&&(d.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},e.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},e.to=function(t){var e=this;this._activeElement=this._element.querySelector(I);var n=this._getItemIndex(this._activeElement);if(!(t>this._items.length-1||t<0))if(this._isSliding)o.default(this._element).one(A,(function(){return e.to(t)}));else{if(n===t)return this.pause(),void this.cycle();var i=t>n?N:D;this._slide(i,this._items[t])}},e.dispose=function(){o.default(this._element).off(".bs.carousel"),o.default.removeData(this._element,w),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},e._getConfig=function(t){return t=r({},k,t),d.typeCheckConfig(T,t,O),t},e._handleSwipe=function(){var t=Math.abs(this.touchDeltaX);if(!(t<=40)){var e=t/this.touchDeltaX;this.touchDeltaX=0,e>0&&this.prev(),e<0&&this.next()}},e._addEventListeners=function(){var t=this;this._config.keyboard&&o.default(this._element).on("keydown.bs.carousel",(function(e){return t._keydown(e)})),"hover"===this._config.pause&&o.default(this._element).on("mouseenter.bs.carousel",(function(e){return t.pause(e)})).on("mouseleave.bs.carousel",(function(e){return t.cycle(e)})),this._config.touch&&this._addTouchEventListeners()},e._addTouchEventListeners=function(){var t=this;if(this._touchSupported){var e=function(e){t._pointerEvent&&j[e.originalEvent.pointerType.toUpperCase()]?t.touchStartX=e.originalEvent.clientX:t._pointerEvent||(t.touchStartX=e.originalEvent.touches[0].clientX)},n=function(e){t._pointerEvent&&j[e.originalEvent.pointerType.toUpperCase()]&&(t.touchDeltaX=e.originalEvent.clientX-t.touchStartX),t._handleSwipe(),"hover"===t._config.pause&&(t.pause(),t.touchTimeout&&clearTimeout(t.touchTimeout),t.touchTimeout=setTimeout((function(e){return t.cycle(e)}),500+t._config.interval))};o.default(this._element.querySelectorAll(".carousel-item img")).on("dragstart.bs.carousel",(function(t){return t.preventDefault()})),this._pointerEvent?(o.default(this._element).on("pointerdown.bs.carousel",(function(t){return e(t)})),o.default(this._element).on("pointerup.bs.carousel",(function(t){return n(t)})),this._element.classList.add("pointer-event")):(o.default(this._element).on("touchstart.bs.carousel",(function(t){return e(t)})),o.default(this._element).on("touchmove.bs.carousel",(function(e){return function(e){t.touchDeltaX=e.originalEvent.touches&&e.originalEvent.touches.length>1?0:e.originalEvent.touches[0].clientX-t.touchStartX}(e)})),o.default(this._element).on("touchend.bs.carousel",(function(t){return n(t)})))}},e._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next()}},e._getItemIndex=function(t){return this._items=t&&t.parentNode?[].slice.call(t.parentNode.querySelectorAll(".carousel-item")):[],this._items.indexOf(t)},e._getItemByDirection=function(t,e){var n=t===N,i=t===D,o=this._getItemIndex(e),a=this._items.length-1;if((i&&0===o||n&&o===a)&&!this._config.wrap)return e;var s=(o+(t===D?-1:1))%this._items.length;return-1===s?this._items[this._items.length-1]:this._items[s]},e._triggerSlideEvent=function(t,e){var n=this._getItemIndex(t),i=this._getItemIndex(this._element.querySelector(I)),a=o.default.Event("slide.bs.carousel",{relatedTarget:t,direction:e,from:i,to:n});return o.default(this._element).trigger(a),a},e._setActiveIndicatorElement=function(t){if(this._indicatorsElement){var e=[].slice.call(this._indicatorsElement.querySelectorAll(".active"));o.default(e).removeClass(S);var n=this._indicatorsElement.children[this._getItemIndex(t)];n&&o.default(n).addClass(S)}},e._updateInterval=function(){var t=this._activeElement||this._element.querySelector(I);if(t){var e=parseInt(t.getAttribute("data-interval"),10);e?(this._config.defaultInterval=this._config.defaultInterval||this._config.interval,this._config.interval=e):this._config.interval=this._config.defaultInterval||this._config.interval}},e._slide=function(t,e){var n,i,a,s=this,l=this._element.querySelector(I),r=this._getItemIndex(l),u=e||l&&this._getItemByDirection(t,l),f=this._getItemIndex(u),c=Boolean(this._interval);if(t===N?(n="carousel-item-left",i="carousel-item-next",a="left"):(n="carousel-item-right",i="carousel-item-prev",a="right"),u&&o.default(u).hasClass(S))this._isSliding=!1;else if(!this._triggerSlideEvent(u,a).isDefaultPrevented()&&l&&u){this._isSliding=!0,c&&this.pause(),this._setActiveIndicatorElement(u),this._activeElement=u;var h=o.default.Event(A,{relatedTarget:u,direction:a,from:r,to:f});if(o.default(this._element).hasClass("slide")){o.default(u).addClass(i),d.reflow(u),o.default(l).addClass(n),o.default(u).addClass(n);var g=d.getTransitionDurationFromElement(l);o.default(l).one(d.TRANSITION_END,(function(){o.default(u).removeClass(n+" "+i).addClass(S),o.default(l).removeClass("active "+i+" "+n),s._isSliding=!1,setTimeout((function(){return o.default(s._element).trigger(h)}),0)})).emulateTransitionEnd(g)}else o.default(l).removeClass(S),o.default(u).addClass(S),this._isSliding=!1,o.default(this._element).trigger(h);c&&this.cycle()}},t._jQueryInterface=function(e){return this.each((function(){var n=o.default(this).data(w),i=r({},k,o.default(this).data());"object"==typeof e&&(i=r({},i,e));var a="string"==typeof e?e:i.slide;if(n||(n=new t(this,i),o.default(this).data(w,n)),"number"==typeof e)n.to(e);else if("string"==typeof a){if("undefined"==typeof n[a])throw new TypeError('No method named "'+a+'"');n[a]()}else i.interval&&i.ride&&(n.pause(),n.cycle())}))},t._dataApiClickHandler=function(e){var n=d.getSelectorFromElement(this);if(n){var i=o.default(n)[0];if(i&&o.default(i).hasClass("carousel")){var a=r({},o.default(i).data(),o.default(this).data()),s=this.getAttribute("data-slide-to");s&&(a.interval=!1),t._jQueryInterface.call(o.default(i),a),s&&o.default(i).data(w).to(s),e.preventDefault()}}},l(t,null,[{key:"VERSION",get:function(){return"4.6.2"}},{key:"Default",get:function(){return k}}]),t}();o.default(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",P._dataApiClickHandler),o.default(window).on("load.bs.carousel.data-api",(function(){for(var t=[].slice.call(document.querySelectorAll('[data-ride="carousel"]')),e=0,n=t.length;e0&&(this._selector=s,this._triggerArray.push(a))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var e=t.prototype;return e.toggle=function(){o.default(this._element).hasClass(q)?this.hide():this.show()},e.show=function(){var e,n,i=this;if(!(this._isTransitioning||o.default(this._element).hasClass(q)||(this._parent&&0===(e=[].slice.call(this._parent.querySelectorAll(".show, .collapsing")).filter((function(t){return"string"==typeof i._config.parent?t.getAttribute("data-parent")===i._config.parent:t.classList.contains(F)}))).length&&(e=null),e&&(n=o.default(e).not(this._selector).data(R))&&n._isTransitioning))){var a=o.default.Event("show.bs.collapse");if(o.default(this._element).trigger(a),!a.isDefaultPrevented()){e&&(t._jQueryInterface.call(o.default(e).not(this._selector),"hide"),n||o.default(e).data(R,null));var s=this._getDimension();o.default(this._element).removeClass(F).addClass(Q),this._element.style[s]=0,this._triggerArray.length&&o.default(this._triggerArray).removeClass(B).attr("aria-expanded",!0),this.setTransitioning(!0);var l="scroll"+(s[0].toUpperCase()+s.slice(1)),r=d.getTransitionDurationFromElement(this._element);o.default(this._element).one(d.TRANSITION_END,(function(){o.default(i._element).removeClass(Q).addClass("collapse show"),i._element.style[s]="",i.setTransitioning(!1),o.default(i._element).trigger("shown.bs.collapse")})).emulateTransitionEnd(r),this._element.style[s]=this._element[l]+"px"}}},e.hide=function(){var t=this;if(!this._isTransitioning&&o.default(this._element).hasClass(q)){var e=o.default.Event("hide.bs.collapse");if(o.default(this._element).trigger(e),!e.isDefaultPrevented()){var n=this._getDimension();this._element.style[n]=this._element.getBoundingClientRect()[n]+"px",d.reflow(this._element),o.default(this._element).addClass(Q).removeClass("collapse show");var i=this._triggerArray.length;if(i>0)for(var a=0;a0},e._getOffset=function(){var t=this,e={};return"function"==typeof this._config.offset?e.fn=function(e){return e.offsets=r({},e.offsets,t._config.offset(e.offsets,t._element)),e}:e.offset=this._config.offset,e},e._getPopperConfig=function(){var t={placement:this._getPlacement(),modifiers:{offset:this._getOffset(),flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}};return"static"===this._config.display&&(t.modifiers.applyStyle={enabled:!1}),r({},t,this._config.popperConfig)},t._jQueryInterface=function(e){return this.each((function(){var n=o.default(this).data(K);if(n||(n=new t(this,"object"==typeof e?e:null),o.default(this).data(K,n)),"string"==typeof e){if("undefined"==typeof n[e])throw new TypeError('No method named "'+e+'"');n[e]()}}))},t._clearMenus=function(e){if(!e||3!==e.which&&("keyup"!==e.type||9===e.which))for(var n=[].slice.call(document.querySelectorAll(it)),i=0,a=n.length;i0&&s--,40===e.which&&sdocument.documentElement.clientHeight;n||(this._element.style.overflowY="hidden"),this._element.classList.add(ht);var i=d.getTransitionDurationFromElement(this._dialog);o.default(this._element).off(d.TRANSITION_END),o.default(this._element).one(d.TRANSITION_END,(function(){t._element.classList.remove(ht),n||o.default(t._element).one(d.TRANSITION_END,(function(){t._element.style.overflowY=""})).emulateTransitionEnd(t._element,i)})).emulateTransitionEnd(i),this._element.focus()}},e._showElement=function(t){var e=this,n=o.default(this._element).hasClass(dt),i=this._dialog?this._dialog.querySelector(".modal-body"):null;this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),o.default(this._dialog).hasClass("modal-dialog-scrollable")&&i?i.scrollTop=0:this._element.scrollTop=0,n&&d.reflow(this._element),o.default(this._element).addClass(ct),this._config.focus&&this._enforceFocus();var a=o.default.Event("shown.bs.modal",{relatedTarget:t}),s=function(){e._config.focus&&e._element.focus(),e._isTransitioning=!1,o.default(e._element).trigger(a)};if(n){var l=d.getTransitionDurationFromElement(this._dialog);o.default(this._dialog).one(d.TRANSITION_END,s).emulateTransitionEnd(l)}else s()},e._enforceFocus=function(){var t=this;o.default(document).off(pt).on(pt,(function(e){document!==e.target&&t._element!==e.target&&0===o.default(t._element).has(e.target).length&&t._element.focus()}))},e._setEscapeEvent=function(){var t=this;this._isShown?o.default(this._element).on(yt,(function(e){t._config.keyboard&&27===e.which?(e.preventDefault(),t.hide()):t._config.keyboard||27!==e.which||t._triggerBackdropTransition()})):this._isShown||o.default(this._element).off(yt)},e._setResizeEvent=function(){var t=this;this._isShown?o.default(window).on(_t,(function(e){return t.handleUpdate(e)})):o.default(window).off(_t)},e._hideModal=function(){var t=this;this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._showBackdrop((function(){o.default(document.body).removeClass(ft),t._resetAdjustments(),t._resetScrollbar(),o.default(t._element).trigger(gt)}))},e._removeBackdrop=function(){this._backdrop&&(o.default(this._backdrop).remove(),this._backdrop=null)},e._showBackdrop=function(t){var e=this,n=o.default(this._element).hasClass(dt)?dt:"";if(this._isShown&&this._config.backdrop){if(this._backdrop=document.createElement("div"),this._backdrop.className="modal-backdrop",n&&this._backdrop.classList.add(n),o.default(this._backdrop).appendTo(document.body),o.default(this._element).on(vt,(function(t){e._ignoreBackdropClick?e._ignoreBackdropClick=!1:t.target===t.currentTarget&&("static"===e._config.backdrop?e._triggerBackdropTransition():e.hide())})),n&&d.reflow(this._backdrop),o.default(this._backdrop).addClass(ct),!t)return;if(!n)return void t();var i=d.getTransitionDurationFromElement(this._backdrop);o.default(this._backdrop).one(d.TRANSITION_END,t).emulateTransitionEnd(i)}else if(!this._isShown&&this._backdrop){o.default(this._backdrop).removeClass(ct);var a=function(){e._removeBackdrop(),t&&t()};if(o.default(this._element).hasClass(dt)){var s=d.getTransitionDurationFromElement(this._backdrop);o.default(this._backdrop).one(d.TRANSITION_END,a).emulateTransitionEnd(s)}else a()}else t&&t()},e._adjustDialog=function(){var t=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},e._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},e._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=Math.round(t.left+t.right)
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",customClass:"",sanitize:!0,sanitizeFn:null,whiteList:{"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},popperConfig:null},Ut={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(number|string|function)",container:"(string|element|boolean)",fallbackPlacement:"(string|array)",boundary:"(string|element)",customClass:"(string|function)",sanitize:"boolean",sanitizeFn:"(null|function)",whiteList:"object",popperConfig:"(null|object)"},Mt={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"},Wt=function(){function t(t,e){if("undefined"==typeof a.default)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var e=t.prototype;return e.enable=function(){this._isEnabled=!0},e.disable=function(){this._isEnabled=!1},e.toggleEnabled=function(){this._isEnabled=!this._isEnabled},e.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=o.default(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),o.default(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(o.default(this.getTipElement()).hasClass(Rt))return void this._leave(null,this);this._enter(null,this)}},e.dispose=function(){clearTimeout(this._timeout),o.default.removeData(this.element,this.constructor.DATA_KEY),o.default(this.element).off(this.constructor.EVENT_KEY),o.default(this.element).closest(".modal").off("hide.bs.modal",this._hideModalHandler),this.tip&&o.default(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},e.show=function(){var t=this;if("none"===o.default(this.element).css("display"))throw new Error("Please use show on visible elements");var e=o.default.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){o.default(this.element).trigger(e);var n=d.findShadowRoot(this.element),i=o.default.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(e.isDefaultPrevented()||!i)return;var s=this.getTipElement(),l=d.getUID(this.constructor.NAME);s.setAttribute("id",l),this.element.setAttribute("aria-describedby",l),this.setContent(),this.config.animation&&o.default(s).addClass(Lt);var r="function"==typeof this.config.placement?this.config.placement.call(this,s,this.element):this.config.placement,u=this._getAttachment(r);this.addAttachmentClass(u);var f=this._getContainer();o.default(s).data(this.constructor.DATA_KEY,this),o.default.contains(this.element.ownerDocument.documentElement,this.tip)||o.default(s).appendTo(f),o.default(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new a.default(this.element,s,this._getPopperConfig(u)),o.default(s).addClass(Rt),o.default(s).addClass(this.config.customClass),"ontouchstart"in document.documentElement&&o.default(document.body).children().on("mouseover",null,o.default.noop);var c=function(){t.config.animation&&t._fixTransition();var e=t._hoverState;t._hoverState=null,o.default(t.element).trigger(t.constructor.Event.SHOWN),e===qt&&t._leave(null,t)};if(o.default(this.tip).hasClass(Lt)){var h=d.getTransitionDurationFromElement(this.tip);o.default(this.tip).one(d.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},e.hide=function(t){var e=this,n=this.getTipElement(),i=o.default.Event(this.constructor.Event.HIDE),a=function(){e._hoverState!==xt&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),o.default(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(o.default(this.element).trigger(i),!i.isDefaultPrevented()){if(o.default(n).removeClass(Rt),"ontouchstart"in document.documentElement&&o.default(document.body).children().off("mouseover",null,o.default.noop),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1,o.default(this.tip).hasClass(Lt)){var s=d.getTransitionDurationFromElement(n);o.default(n).one(d.TRANSITION_END,a).emulateTransitionEnd(s)}else a();this._hoverState=""}},e.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},e.isWithContent=function(){return Boolean(this.getTitle())},e.addAttachmentClass=function(t){o.default(this.getTipElement()).addClass("bs-tooltip-"+t)},e.getTipElement=function(){return this.tip=this.tip||o.default(this.config.template)[0],this.tip},e.setContent=function(){var t=this.getTipElement();this.setElementContent(o.default(t.querySelectorAll(".tooltip-inner")),this.getTitle()),o.default(t).removeClass("fade show")},e.setElementContent=function(t,e){"object"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=At(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?o.default(e).parent().is(t)||t.empty().append(e):t.text(o.default(e).text())},e.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},e._getPopperConfig=function(t){var e=this;return r({},{placement:t,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:".arrow"},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}},this.config.popperConfig)},e._getOffset=function(){var t=this,e={};return"function"==typeof this.config.offset?e.fn=function(e){return e.offsets=r({},e.offsets,t.config.offset(e.offsets,t.element)),e}:e.offset=this.config.offset,e},e._getContainer=function(){return!1===this.config.container?document.body:d.isElement(this.config.container)?o.default(this.config.container):o.default(document).find(this.config.container)},e._getAttachment=function(t){return Bt[t.toUpperCase()]},e._setListeners=function(){var t=this;this.config.trigger.split(" ").forEach((function(e){if("click"===e)o.default(t.element).on(t.constructor.Event.CLICK,t.config.selector,(function(e){return t.toggle(e)}));else if("manual"!==e){var n=e===Ft?t.constructor.Event.MOUSEENTER:t.constructor.Event.FOCUSIN,i=e===Ft?t.constructor.Event.MOUSELEAVE:t.constructor.Event.FOCUSOUT;o.default(t.element).on(n,t.config.selector,(function(e){return t._enter(e)})).on(i,t.config.selector,(function(e){return t._leave(e)}))}})),this._hideModalHandler=function(){t.element&&t.hide()},o.default(this.element).closest(".modal").on("hide.bs.modal",this._hideModalHandler),this.config.selector?this.config=r({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},e._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},e._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||o.default(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),o.default(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?Qt:Ft]=!0),o.default(e.getTipElement()).hasClass(Rt)||e._hoverState===xt?e._hoverState=xt:(clearTimeout(e._timeout),e._hoverState=xt,e.config.delay&&e.config.delay.show?e._timeout=setTimeout((function(){e._hoverState===xt&&e.show()}),e.config.delay.show):e.show())},e._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||o.default(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),o.default(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?Qt:Ft]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=qt,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout((function(){e._hoverState===qt&&e.hide()}),e.config.delay.hide):e.hide())},e._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},e._getConfig=function(t){var e=o.default(this.element).data();return Object.keys(e).forEach((function(t){-1!==Pt.indexOf(t)&&delete e[t]})),"number"==typeof(t=r({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),d.typeCheckConfig(It,t,this.constructor.DefaultType),t.sanitize&&(t.template=At(t.template,t.whiteList,t.sanitizeFn)),t},e._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},e._cleanTipClass=function(){var t=o.default(this.getTipElement()),e=t.attr("class").match(jt);null!==e&&e.length&&t.removeClass(e.join(""))},e._handlePopperPlacementChange=function(t){this.tip=t.instance.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},e._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(o.default(t).removeClass(Lt),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},t._jQueryInterface=function(e){return this.each((function(){var n=o.default(this),i=n.data(kt),a="object"==typeof e&&e;if((i||!/dispose|hide/.test(e))&&(i||(i=new t(this,a),n.data(kt,i)),"string"==typeof e)){if("undefined"==typeof i[e])throw new TypeError('No method named "'+e+'"');i[e]()}}))},l(t,null,[{key:"VERSION",get:function(){return"4.6.2"}},{key:"Default",get:function(){return Ht}},{key:"NAME",get:function(){return It}},{key:"DATA_KEY",get:function(){return kt}},{key:"Event",get:function(){return Mt}},{key:"EVENT_KEY",get:function(){return".bs.tooltip"}},{key:"DefaultType",get:function(){return Ut}}]),t}();o.default.fn.tooltip=Wt._jQueryInterface,o.default.fn.tooltip.Constructor=Wt,o.default.fn.tooltip.noConflict=function(){return o.default.fn.tooltip=Ot,Wt._jQueryInterface};var Vt="bs.popover",zt=o.default.fn.popover,Kt=new RegExp("(^|\\s)bs-popover\\S+","g"),Xt=r({},Wt.Default,{placement:"right",trigger:"click",content:"",template:''}),Yt=r({},Wt.DefaultType,{content:"(string|element|function)"}),$t={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"},Jt=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),e.prototype.constructor=e,u(e,n);var a=i.prototype;return a.isWithContent=function(){return this.getTitle()||this._getContent()},a.addAttachmentClass=function(t){o.default(this.getTipElement()).addClass("bs-popover-"+t)},a.getTipElement=function(){return this.tip=this.tip||o.default(this.config.template)[0],this.tip},a.setContent=function(){var t=o.default(this.getTipElement());this.setElementContent(t.find(".popover-header"),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(".popover-body"),e),t.removeClass("fade show")},a._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},a._cleanTipClass=function(){var t=o.default(this.getTipElement()),e=t.attr("class").match(Kt);null!==e&&e.length>0&&t.removeClass(e.join(""))},i._jQueryInterface=function(t){return this.each((function(){var e=o.default(this).data(Vt),n="object"==typeof t?t:null;if((e||!/dispose|hide/.test(t))&&(e||(e=new i(this,n),o.default(this).data(Vt,e)),"string"==typeof t)){if("undefined"==typeof e[t])throw new TypeError('No method named "'+t+'"');e[t]()}}))},l(i,null,[{key:"VERSION",get:function(){return"4.6.2"}},{key:"Default",get:function(){return Xt}},{key:"NAME",get:function(){return"popover"}},{key:"DATA_KEY",get:function(){return Vt}},{key:"Event",get:function(){return $t}},{key:"EVENT_KEY",get:function(){return".bs.popover"}},{key:"DefaultType",get:function(){return Yt}}]),i}(Wt);o.default.fn.popover=Jt._jQueryInterface,o.default.fn.popover.Constructor=Jt,o.default.fn.popover.noConflict=function(){return o.default.fn.popover=zt,Jt._jQueryInterface};var Gt="scrollspy",Zt="bs.scrollspy",te=o.default.fn[Gt],ee="active",ne="position",ie=".nav, .list-group",oe={offset:10,method:"auto",target:""},ae={offset:"number",method:"string",target:"(string|element)"},se=function(){function t(t,e){var n=this;this._element=t,this._scrollElement="BODY"===t.tagName?window:t,this._config=this._getConfig(e),this._selector=this._config.target+" .nav-link,"+this._config.target+" .list-group-item,"+this._config.target+" .dropdown-item",this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,o.default(this._scrollElement).on("scroll.bs.scrollspy",(function(t){return n._process(t)})),this.refresh(),this._process()}var e=t.prototype;return e.refresh=function(){var t=this,e=this._scrollElement===this._scrollElement.window?"offset":ne,n="auto"===this._config.method?e:this._config.method,i=n===ne?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),[].slice.call(document.querySelectorAll(this._selector)).map((function(t){var e,a=d.getSelectorFromElement(t);if(a&&(e=document.querySelector(a)),e){var s=e.getBoundingClientRect();if(s.width||s.height)return[o.default(e)[n]().top+i,a]}return null})).filter(Boolean).sort((function(t,e){return t[0]-e[0]})).forEach((function(e){t._offsets.push(e[0]),t._targets.push(e[1])}))},e.dispose=function(){o.default.removeData(this._element,Zt),o.default(this._scrollElement).off(".bs.scrollspy"),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},e._getConfig=function(t){if("string"!=typeof(t=r({},oe,"object"==typeof t&&t?t:{})).target&&d.isElement(t.target)){var e=o.default(t.target).attr("id");e||(e=d.getUID(Gt),o.default(t.target).attr("id",e)),t.target="#"+e}return d.typeCheckConfig(Gt,t,ae),t},e._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},e._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},e._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},e._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;)this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||t li > .active",ge=function(){function t(t){this._element=t}var e=t.prototype;return e.show=function(){var t=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&o.default(this._element).hasClass(ue)||o.default(this._element).hasClass("disabled")||this._element.hasAttribute("disabled"))){var e,n,i=o.default(this._element).closest(".nav, .list-group")[0],a=d.getSelectorFromElement(this._element);if(i){var s="UL"===i.nodeName||"OL"===i.nodeName?he:ce;n=(n=o.default.makeArray(o.default(i).find(s)))[n.length-1]}var l=o.default.Event("hide.bs.tab",{relatedTarget:this._element}),r=o.default.Event("show.bs.tab",{relatedTarget:n});if(n&&o.default(n).trigger(l),o.default(this._element).trigger(r),!r.isDefaultPrevented()&&!l.isDefaultPrevented()){a&&(e=document.querySelector(a)),this._activate(this._element,i);var u=function(){var e=o.default.Event("hidden.bs.tab",{relatedTarget:t._element}),i=o.default.Event("shown.bs.tab",{relatedTarget:n});o.default(n).trigger(e),o.default(t._element).trigger(i)};e?this._activate(e,e.parentNode,u):u()}}},e.dispose=function(){o.default.removeData(this._element,le),this._element=null},e._activate=function(t,e,n){var i=this,a=(!e||"UL"!==e.nodeName&&"OL"!==e.nodeName?o.default(e).children(ce):o.default(e).find(he))[0],s=n&&a&&o.default(a).hasClass(fe),l=function(){return i._transitionComplete(t,a,n)};if(a&&s){var r=d.getTransitionDurationFromElement(a);o.default(a).removeClass(de).one(d.TRANSITION_END,l).emulateTransitionEnd(r)}else l()},e._transitionComplete=function(t,e,n){if(e){o.default(e).removeClass(ue);var i=o.default(e.parentNode).find("> .dropdown-menu .active")[0];i&&o.default(i).removeClass(ue),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}o.default(t).addClass(ue),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),d.reflow(t),t.classList.contains(fe)&&t.classList.add(de);var a=t.parentNode;if(a&&"LI"===a.nodeName&&(a=a.parentNode),a&&o.default(a).hasClass("dropdown-menu")){var s=o.default(t).closest(".dropdown")[0];if(s){var l=[].slice.call(s.querySelectorAll(".dropdown-toggle"));o.default(l).addClass(ue)}t.setAttribute("aria-expanded",!0)}n&&n()},t._jQueryInterface=function(e){return this.each((function(){var n=o.default(this),i=n.data(le);if(i||(i=new t(this),n.data(le,i)),"string"==typeof e){if("undefined"==typeof i[e])throw new TypeError('No method named "'+e+'"');i[e]()}}))},l(t,null,[{key:"VERSION",get:function(){return"4.6.2"}}]),t}();o.default(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',(function(t){t.preventDefault(),ge._jQueryInterface.call(o.default(this),"show")})),o.default.fn.tab=ge._jQueryInterface,o.default.fn.tab.Constructor=ge,o.default.fn.tab.noConflict=function(){return o.default.fn.tab=re,ge._jQueryInterface};var me="bs.toast",pe=o.default.fn.toast,_e="hide",ve="show",ye="showing",be="click.dismiss.bs.toast",Ee={animation:!0,autohide:!0,delay:500},Te={animation:"boolean",autohide:"boolean",delay:"number"},we=function(){function t(t,e){this._element=t,this._config=this._getConfig(e),this._timeout=null,this._setListeners()}var e=t.prototype;return e.show=function(){var t=this,e=o.default.Event("show.bs.toast");if(o.default(this._element).trigger(e),!e.isDefaultPrevented()){this._clearTimeout(),this._config.animation&&this._element.classList.add("fade");var n=function(){t._element.classList.remove(ye),t._element.classList.add(ve),o.default(t._element).trigger("shown.bs.toast"),t._config.autohide&&(t._timeout=setTimeout((function(){t.hide()}),t._config.delay))};if(this._element.classList.remove(_e),d.reflow(this._element),this._element.classList.add(ye),this._config.animation){var i=d.getTransitionDurationFromElement(this._element);o.default(this._element).one(d.TRANSITION_END,n).emulateTransitionEnd(i)}else n()}},e.hide=function(){if(this._element.classList.contains(ve)){var t=o.default.Event("hide.bs.toast");o.default(this._element).trigger(t),t.isDefaultPrevented()||this._close()}},e.dispose=function(){this._clearTimeout(),this._element.classList.contains(ve)&&this._element.classList.remove(ve),o.default(this._element).off(be),o.default.removeData(this._element,me),this._element=null,this._config=null},e._getConfig=function(t){return t=r({},Ee,o.default(this._element).data(),"object"==typeof t&&t?t:{}),d.typeCheckConfig("toast",t,this.constructor.DefaultType),t},e._setListeners=function(){var t=this;o.default(this._element).on(be,'[data-dismiss="toast"]',(function(){return t.hide()}))},e._close=function(){var t=this,e=function(){t._element.classList.add(_e),o.default(t._element).trigger("hidden.bs.toast")};if(this._element.classList.remove(ve),this._config.animation){var n=d.getTransitionDurationFromElement(this._element);o.default(this._element).one(d.TRANSITION_END,e).emulateTransitionEnd(n)}else e()},e._clearTimeout=function(){clearTimeout(this._timeout),this._timeout=null},t._jQueryInterface=function(e){return this.each((function(){var n=o.default(this),i=n.data(me);if(i||(i=new t(this,"object"==typeof e&&e),n.data(me,i)),"string"==typeof e){if("undefined"==typeof i[e])throw new TypeError('No method named "'+e+'"');i[e](this)}}))},l(t,null,[{key:"VERSION",get:function(){return"4.6.2"}},{key:"DefaultType",get:function(){return Te}},{key:"Default",get:function(){return Ee}}]),t}();o.default.fn.toast=we._jQueryInterface,o.default.fn.toast.Constructor=we,o.default.fn.toast.noConflict=function(){return o.default.fn.toast=pe,we._jQueryInterface},t.Alert=g,t.Button=E,t.Carousel=P,t.Collapse=V,t.Dropdown=lt,t.Modal=Ct,t.Popover=Jt,t.Scrollspy=se,t.Tab=ge,t.Toast=we,t.Tooltip=Wt,t.Util=d,Object.defineProperty(t,"__esModule",{value:!0})})); -//# sourceMappingURL=bootstrap.min.js.map \ No newline at end of file diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/d3.min.js b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/d3.min.js deleted file mode 100644 index 1664873..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/d3.min.js +++ /dev/null @@ -1,5 +0,0 @@ -!function(){function n(n){return n&&(n.ownerDocument||n.document||n).documentElement}function t(n){return n&&(n.ownerDocument&&n.ownerDocument.defaultView||n.document&&n||n.defaultView)}function e(n,t){return t>n?-1:n>t?1:n>=t?0:NaN}function r(n){return null===n?NaN:+n}function i(n){return!isNaN(n)}function u(n){return{left:function(t,e,r,i){for(arguments.length<3&&(r=0),arguments.length<4&&(i=t.length);i>r;){var u=r+i>>>1;n(t[u],e)<0?r=u+1:i=u}return r},right:function(t,e,r,i){for(arguments.length<3&&(r=0),arguments.length<4&&(i=t.length);i>r;){var u=r+i>>>1;n(t[u],e)>0?i=u:r=u+1}return r}}}function o(n){return n.length}function a(n){for(var t=1;n*t%1;)t*=10;return t}function l(n,t){for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}function c(){this._=Object.create(null)}function f(n){return(n+="")===bo||n[0]===_o?_o+n:n}function s(n){return(n+="")[0]===_o?n.slice(1):n}function h(n){return f(n)in this._}function p(n){return(n=f(n))in this._&&delete this._[n]}function g(){var n=[];for(var t in this._)n.push(s(t));return n}function v(){var n=0;for(var t in this._)++n;return n}function d(){for(var n in this._)return!1;return!0}function y(){this._=Object.create(null)}function m(n){return n}function M(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function x(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.slice(1);for(var e=0,r=wo.length;r>e;++e){var i=wo[e]+t;if(i in n)return i}}function b(){}function _(){}function w(n){function t(){for(var t,r=e,i=-1,u=r.length;++ie;e++)for(var i,u=n[e],o=0,a=u.length;a>o;o++)(i=u[o])&&t(i,o,e);return n}function Z(n){return ko(n,qo),n}function V(n){var t,e;return function(r,i,u){var o,a=n[u].update,l=a.length;for(u!=e&&(e=u,t=0),i>=t&&(t=i+1);!(o=a[t])&&++t0&&(n=n.slice(0,a));var c=To.get(n);return c&&(n=c,l=B),a?t?i:r:t?b:u}function $(n,t){return function(e){var r=ao.event;ao.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{ao.event=r}}}function B(n,t){var e=$(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function W(e){var r=".dragsuppress-"+ ++Do,i="click"+r,u=ao.select(t(e)).on("touchmove"+r,S).on("dragstart"+r,S).on("selectstart"+r,S);if(null==Ro&&(Ro="onselectstart"in e?!1:x(e.style,"userSelect")),Ro){var o=n(e).style,a=o[Ro];o[Ro]="none"}return function(n){if(u.on(r,null),Ro&&(o[Ro]=a),n){var t=function(){u.on(i,null)};u.on(i,function(){S(),t()},!0),setTimeout(t,0)}}}function J(n,e){e.changedTouches&&(e=e.changedTouches[0]);var r=n.ownerSVGElement||n;if(r.createSVGPoint){var i=r.createSVGPoint();if(0>Po){var u=t(n);if(u.scrollX||u.scrollY){r=ao.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var o=r[0][0].getScreenCTM();Po=!(o.f||o.e),r.remove()}}return Po?(i.x=e.pageX,i.y=e.pageY):(i.x=e.clientX,i.y=e.clientY),i=i.matrixTransform(n.getScreenCTM().inverse()),[i.x,i.y]}var a=n.getBoundingClientRect();return[e.clientX-a.left-n.clientLeft,e.clientY-a.top-n.clientTop]}function G(){return ao.event.changedTouches[0].identifier}function K(n){return n>0?1:0>n?-1:0}function Q(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(t[1]-n[1])*(e[0]-n[0])}function nn(n){return n>1?0:-1>n?Fo:Math.acos(n)}function tn(n){return n>1?Io:-1>n?-Io:Math.asin(n)}function en(n){return((n=Math.exp(n))-1/n)/2}function rn(n){return((n=Math.exp(n))+1/n)/2}function un(n){return((n=Math.exp(2*n))-1)/(n+1)}function on(n){return(n=Math.sin(n/2))*n}function an(){}function ln(n,t,e){return this instanceof ln?(this.h=+n,this.s=+t,void(this.l=+e)):arguments.length<2?n instanceof ln?new ln(n.h,n.s,n.l):_n(""+n,wn,ln):new ln(n,t,e)}function cn(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?u+(o-u)*n/60:180>n?o:240>n?u+(o-u)*(240-n)/60:u}function i(n){return Math.round(255*r(n))}var u,o;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,o=.5>=e?e*(1+t):e+t-e*t,u=2*e-o,new mn(i(n+120),i(n),i(n-120))}function fn(n,t,e){return this instanceof fn?(this.h=+n,this.c=+t,void(this.l=+e)):arguments.length<2?n instanceof fn?new fn(n.h,n.c,n.l):n instanceof hn?gn(n.l,n.a,n.b):gn((n=Sn((n=ao.rgb(n)).r,n.g,n.b)).l,n.a,n.b):new fn(n,t,e)}function sn(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),new hn(e,Math.cos(n*=Yo)*t,Math.sin(n)*t)}function hn(n,t,e){return this instanceof hn?(this.l=+n,this.a=+t,void(this.b=+e)):arguments.length<2?n instanceof hn?new hn(n.l,n.a,n.b):n instanceof fn?sn(n.h,n.c,n.l):Sn((n=mn(n)).r,n.g,n.b):new hn(n,t,e)}function pn(n,t,e){var r=(n+16)/116,i=r+t/500,u=r-e/200;return i=vn(i)*na,r=vn(r)*ta,u=vn(u)*ea,new mn(yn(3.2404542*i-1.5371385*r-.4985314*u),yn(-.969266*i+1.8760108*r+.041556*u),yn(.0556434*i-.2040259*r+1.0572252*u))}function gn(n,t,e){return n>0?new fn(Math.atan2(e,t)*Zo,Math.sqrt(t*t+e*e),n):new fn(NaN,NaN,n)}function vn(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function dn(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function yn(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function mn(n,t,e){return this instanceof mn?(this.r=~~n,this.g=~~t,void(this.b=~~e)):arguments.length<2?n instanceof mn?new mn(n.r,n.g,n.b):_n(""+n,mn,cn):new mn(n,t,e)}function Mn(n){return new mn(n>>16,n>>8&255,255&n)}function xn(n){return Mn(n)+""}function bn(n){return 16>n?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function _n(n,t,e){var r,i,u,o=0,a=0,l=0;if(r=/([a-z]+)\((.*)\)/.exec(n=n.toLowerCase()))switch(i=r[2].split(","),r[1]){case"hsl":return e(parseFloat(i[0]),parseFloat(i[1])/100,parseFloat(i[2])/100);case"rgb":return t(Nn(i[0]),Nn(i[1]),Nn(i[2]))}return(u=ua.get(n))?t(u.r,u.g,u.b):(null==n||"#"!==n.charAt(0)||isNaN(u=parseInt(n.slice(1),16))||(4===n.length?(o=(3840&u)>>4,o=o>>4|o,a=240&u,a=a>>4|a,l=15&u,l=l<<4|l):7===n.length&&(o=(16711680&u)>>16,a=(65280&u)>>8,l=255&u)),t(o,a,l))}function wn(n,t,e){var r,i,u=Math.min(n/=255,t/=255,e/=255),o=Math.max(n,t,e),a=o-u,l=(o+u)/2;return a?(i=.5>l?a/(o+u):a/(2-o-u),r=n==o?(t-e)/a+(e>t?6:0):t==o?(e-n)/a+2:(n-t)/a+4,r*=60):(r=NaN,i=l>0&&1>l?0:r),new ln(r,i,l)}function Sn(n,t,e){n=kn(n),t=kn(t),e=kn(e);var r=dn((.4124564*n+.3575761*t+.1804375*e)/na),i=dn((.2126729*n+.7151522*t+.072175*e)/ta),u=dn((.0193339*n+.119192*t+.9503041*e)/ea);return hn(116*i-16,500*(r-i),200*(i-u))}function kn(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function Nn(n){var t=parseFloat(n);return"%"===n.charAt(n.length-1)?Math.round(2.55*t):t}function En(n){return"function"==typeof n?n:function(){return n}}function An(n){return function(t,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),Cn(t,e,n,r)}}function Cn(n,t,e,r){function i(){var n,t=l.status;if(!t&&Ln(l)||t>=200&&300>t||304===t){try{n=e.call(u,l)}catch(r){return void o.error.call(u,r)}o.load.call(u,n)}else o.error.call(u,l)}var u={},o=ao.dispatch("beforesend","progress","load","error"),a={},l=new XMLHttpRequest,c=null;return!this.XDomainRequest||"withCredentials"in l||!/^(http(s)?:)?\/\//.test(n)||(l=new XDomainRequest),"onload"in l?l.onload=l.onerror=i:l.onreadystatechange=function(){l.readyState>3&&i()},l.onprogress=function(n){var t=ao.event;ao.event=n;try{o.progress.call(u,l)}finally{ao.event=t}},u.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?a[n]:(null==t?delete a[n]:a[n]=t+"",u)},u.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",u):t},u.responseType=function(n){return arguments.length?(c=n,u):c},u.response=function(n){return e=n,u},["get","post"].forEach(function(n){u[n]=function(){return u.send.apply(u,[n].concat(co(arguments)))}}),u.send=function(e,r,i){if(2===arguments.length&&"function"==typeof r&&(i=r,r=null),l.open(e,n,!0),null==t||"accept"in a||(a.accept=t+",*/*"),l.setRequestHeader)for(var f in a)l.setRequestHeader(f,a[f]);return null!=t&&l.overrideMimeType&&l.overrideMimeType(t),null!=c&&(l.responseType=c),null!=i&&u.on("error",i).on("load",function(n){i(null,n)}),o.beforesend.call(u,l),l.send(null==r?null:r),u},u.abort=function(){return l.abort(),u},ao.rebind(u,o,"on"),null==r?u:u.get(zn(r))}function zn(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function Ln(n){var t=n.responseType;return t&&"text"!==t?n.response:n.responseText}function qn(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var i=e+t,u={c:n,t:i,n:null};return aa?aa.n=u:oa=u,aa=u,la||(ca=clearTimeout(ca),la=1,fa(Tn)),u}function Tn(){var n=Rn(),t=Dn()-n;t>24?(isFinite(t)&&(clearTimeout(ca),ca=setTimeout(Tn,t)),la=0):(la=1,fa(Tn))}function Rn(){for(var n=Date.now(),t=oa;t;)n>=t.t&&t.c(n-t.t)&&(t.c=null),t=t.n;return n}function Dn(){for(var n,t=oa,e=1/0;t;)t.c?(t.t8?function(n){return n/e}:function(n){return n*e},symbol:n}}function jn(n){var t=n.decimal,e=n.thousands,r=n.grouping,i=n.currency,u=r&&e?function(n,t){for(var i=n.length,u=[],o=0,a=r[0],l=0;i>0&&a>0&&(l+a+1>t&&(a=Math.max(1,t-l)),u.push(n.substring(i-=a,i+a)),!((l+=a+1)>t));)a=r[o=(o+1)%r.length];return u.reverse().join(e)}:m;return function(n){var e=ha.exec(n),r=e[1]||" ",o=e[2]||">",a=e[3]||"-",l=e[4]||"",c=e[5],f=+e[6],s=e[7],h=e[8],p=e[9],g=1,v="",d="",y=!1,m=!0;switch(h&&(h=+h.substring(1)),(c||"0"===r&&"="===o)&&(c=r="0",o="="),p){case"n":s=!0,p="g";break;case"%":g=100,d="%",p="f";break;case"p":g=100,d="%",p="r";break;case"b":case"o":case"x":case"X":"#"===l&&(v="0"+p.toLowerCase());case"c":m=!1;case"d":y=!0,h=0;break;case"s":g=-1,p="r"}"$"===l&&(v=i[0],d=i[1]),"r"!=p||h||(p="g"),null!=h&&("g"==p?h=Math.max(1,Math.min(21,h)):"e"!=p&&"f"!=p||(h=Math.max(0,Math.min(20,h)))),p=pa.get(p)||Fn;var M=c&&s;return function(n){var e=d;if(y&&n%1)return"";var i=0>n||0===n&&0>1/n?(n=-n,"-"):"-"===a?"":a;if(0>g){var l=ao.formatPrefix(n,h);n=l.scale(n),e=l.symbol+d}else n*=g;n=p(n,h);var x,b,_=n.lastIndexOf(".");if(0>_){var w=m?n.lastIndexOf("e"):-1;0>w?(x=n,b=""):(x=n.substring(0,w),b=n.substring(w))}else x=n.substring(0,_),b=t+n.substring(_+1);!c&&s&&(x=u(x,1/0));var S=v.length+x.length+b.length+(M?0:i.length),k=f>S?new Array(S=f-S+1).join(r):"";return M&&(x=u(k+x,k.length?f-b.length:1/0)),i+=v,n=x+b,("<"===o?i+n+k:">"===o?k+i+n:"^"===o?k.substring(0,S>>=1)+i+n+k.substring(S):i+(M?n:k+n))+e}}}function Fn(n){return n+""}function Hn(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function On(n,t,e){function r(t){var e=n(t),r=u(e,1);return r-t>t-e?e:r}function i(e){return t(e=n(new va(e-1)),1),e}function u(n,e){return t(n=new va(+n),e),n}function o(n,r,u){var o=i(n),a=[];if(u>1)for(;r>o;)e(o)%u||a.push(new Date(+o)),t(o,1);else for(;r>o;)a.push(new Date(+o)),t(o,1);return a}function a(n,t,e){try{va=Hn;var r=new Hn;return r._=n,o(r,t,e)}finally{va=Date}}n.floor=n,n.round=r,n.ceil=i,n.offset=u,n.range=o;var l=n.utc=In(n);return l.floor=l,l.round=In(r),l.ceil=In(i),l.offset=In(u),l.range=a,n}function In(n){return function(t,e){try{va=Hn;var r=new Hn;return r._=t,n(r,e)._}finally{va=Date}}}function Yn(n){function t(n){function t(t){for(var e,i,u,o=[],a=-1,l=0;++aa;){if(r>=c)return-1;if(i=t.charCodeAt(a++),37===i){if(o=t.charAt(a++),u=C[o in ya?t.charAt(a++):o],!u||(r=u(n,e,r))<0)return-1}else if(i!=e.charCodeAt(r++))return-1}return r}function r(n,t,e){_.lastIndex=0;var r=_.exec(t.slice(e));return r?(n.w=w.get(r[0].toLowerCase()),e+r[0].length):-1}function i(n,t,e){x.lastIndex=0;var r=x.exec(t.slice(e));return r?(n.w=b.get(r[0].toLowerCase()),e+r[0].length):-1}function u(n,t,e){N.lastIndex=0;var r=N.exec(t.slice(e));return r?(n.m=E.get(r[0].toLowerCase()),e+r[0].length):-1}function o(n,t,e){S.lastIndex=0;var r=S.exec(t.slice(e));return r?(n.m=k.get(r[0].toLowerCase()),e+r[0].length):-1}function a(n,t,r){return e(n,A.c.toString(),t,r)}function l(n,t,r){return e(n,A.x.toString(),t,r)}function c(n,t,r){return e(n,A.X.toString(),t,r)}function f(n,t,e){var r=M.get(t.slice(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}var s=n.dateTime,h=n.date,p=n.time,g=n.periods,v=n.days,d=n.shortDays,y=n.months,m=n.shortMonths;t.utc=function(n){function e(n){try{va=Hn;var t=new va;return t._=n,r(t)}finally{va=Date}}var r=t(n);return e.parse=function(n){try{va=Hn;var t=r.parse(n);return t&&t._}finally{va=Date}},e.toString=r.toString,e},t.multi=t.utc.multi=ct;var M=ao.map(),x=Vn(v),b=Xn(v),_=Vn(d),w=Xn(d),S=Vn(y),k=Xn(y),N=Vn(m),E=Xn(m);g.forEach(function(n,t){M.set(n.toLowerCase(),t)});var A={a:function(n){return d[n.getDay()]},A:function(n){return v[n.getDay()]},b:function(n){return m[n.getMonth()]},B:function(n){return y[n.getMonth()]},c:t(s),d:function(n,t){return Zn(n.getDate(),t,2)},e:function(n,t){return Zn(n.getDate(),t,2)},H:function(n,t){return Zn(n.getHours(),t,2)},I:function(n,t){return Zn(n.getHours()%12||12,t,2)},j:function(n,t){return Zn(1+ga.dayOfYear(n),t,3)},L:function(n,t){return Zn(n.getMilliseconds(),t,3)},m:function(n,t){return Zn(n.getMonth()+1,t,2)},M:function(n,t){return Zn(n.getMinutes(),t,2)},p:function(n){return g[+(n.getHours()>=12)]},S:function(n,t){return Zn(n.getSeconds(),t,2)},U:function(n,t){return Zn(ga.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return Zn(ga.mondayOfYear(n),t,2)},x:t(h),X:t(p),y:function(n,t){return Zn(n.getFullYear()%100,t,2)},Y:function(n,t){return Zn(n.getFullYear()%1e4,t,4)},Z:at,"%":function(){return"%"}},C={a:r,A:i,b:u,B:o,c:a,d:tt,e:tt,H:rt,I:rt,j:et,L:ot,m:nt,M:it,p:f,S:ut,U:Bn,w:$n,W:Wn,x:l,X:c,y:Gn,Y:Jn,Z:Kn,"%":lt};return t}function Zn(n,t,e){var r=0>n?"-":"",i=(r?-n:n)+"",u=i.length;return r+(e>u?new Array(e-u+1).join(t)+i:i)}function Vn(n){return new RegExp("^(?:"+n.map(ao.requote).join("|")+")","i")}function Xn(n){for(var t=new c,e=-1,r=n.length;++e68?1900:2e3)}function nt(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function tt(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function et(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function rt(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function it(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function ut(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function ot(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function at(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=xo(t)/60|0,i=xo(t)%60;return e+Zn(r,"0",2)+Zn(i,"0",2)}function lt(n,t,e){Ma.lastIndex=0;var r=Ma.exec(t.slice(e,e+1));return r?e+r[0].length:-1}function ct(n){for(var t=n.length,e=-1;++e=0?1:-1,a=o*e,l=Math.cos(t),c=Math.sin(t),f=u*c,s=i*l+f*Math.cos(a),h=f*o*Math.sin(a);ka.add(Math.atan2(h,s)),r=n,i=l,u=c}var t,e,r,i,u;Na.point=function(o,a){Na.point=n,r=(t=o)*Yo,i=Math.cos(a=(e=a)*Yo/2+Fo/4),u=Math.sin(a)},Na.lineEnd=function(){n(t,e)}}function dt(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function yt(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function mt(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function Mt(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function xt(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function bt(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function _t(n){return[Math.atan2(n[1],n[0]),tn(n[2])]}function wt(n,t){return xo(n[0]-t[0])a;++a)i.point((e=n[a])[0],e[1]);return void i.lineEnd()}var l=new Tt(e,n,null,!0),c=new Tt(e,null,l,!1);l.o=c,u.push(l),o.push(c),l=new Tt(r,n,null,!1),c=new Tt(r,null,l,!0),l.o=c,u.push(l),o.push(c)}}),o.sort(t),qt(u),qt(o),u.length){for(var a=0,l=e,c=o.length;c>a;++a)o[a].e=l=!l;for(var f,s,h=u[0];;){for(var p=h,g=!0;p.v;)if((p=p.n)===h)return;f=p.z,i.lineStart();do{if(p.v=p.o.v=!0,p.e){if(g)for(var a=0,c=f.length;c>a;++a)i.point((s=f[a])[0],s[1]);else r(p.x,p.n.x,1,i);p=p.n}else{if(g){f=p.p.z;for(var a=f.length-1;a>=0;--a)i.point((s=f[a])[0],s[1])}else r(p.x,p.p.x,-1,i);p=p.p}p=p.o,f=p.z,g=!g}while(!p.v);i.lineEnd()}}}function qt(n){if(t=n.length){for(var t,e,r=0,i=n[0];++r0){for(b||(u.polygonStart(),b=!0),u.lineStart();++o1&&2&t&&e.push(e.pop().concat(e.shift())),p.push(e.filter(Dt))}var p,g,v,d=t(u),y=i.invert(r[0],r[1]),m={point:o,lineStart:l,lineEnd:c,polygonStart:function(){m.point=f,m.lineStart=s,m.lineEnd=h,p=[],g=[]},polygonEnd:function(){m.point=o,m.lineStart=l,m.lineEnd=c,p=ao.merge(p);var n=Ot(y,g);p.length?(b||(u.polygonStart(),b=!0),Lt(p,Ut,n,e,u)):n&&(b||(u.polygonStart(),b=!0),u.lineStart(),e(null,null,1,u),u.lineEnd()),b&&(u.polygonEnd(),b=!1),p=g=null},sphere:function(){u.polygonStart(),u.lineStart(),e(null,null,1,u),u.lineEnd(),u.polygonEnd()}},M=Pt(),x=t(M),b=!1;return m}}function Dt(n){return n.length>1}function Pt(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:b,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function Ut(n,t){return((n=n.x)[0]<0?n[1]-Io-Uo:Io-n[1])-((t=t.x)[0]<0?t[1]-Io-Uo:Io-t[1])}function jt(n){var t,e=NaN,r=NaN,i=NaN;return{lineStart:function(){n.lineStart(),t=1},point:function(u,o){var a=u>0?Fo:-Fo,l=xo(u-e);xo(l-Fo)0?Io:-Io),n.point(i,r),n.lineEnd(),n.lineStart(),n.point(a,r),n.point(u,r),t=0):i!==a&&l>=Fo&&(xo(e-i)Uo?Math.atan((Math.sin(t)*(u=Math.cos(r))*Math.sin(e)-Math.sin(r)*(i=Math.cos(t))*Math.sin(n))/(i*u*o)):(t+r)/2}function Ht(n,t,e,r){var i;if(null==n)i=e*Io,r.point(-Fo,i),r.point(0,i),r.point(Fo,i),r.point(Fo,0),r.point(Fo,-i),r.point(0,-i),r.point(-Fo,-i),r.point(-Fo,0),r.point(-Fo,i);else if(xo(n[0]-t[0])>Uo){var u=n[0]a;++a){var c=t[a],f=c.length;if(f)for(var s=c[0],h=s[0],p=s[1]/2+Fo/4,g=Math.sin(p),v=Math.cos(p),d=1;;){d===f&&(d=0),n=c[d];var y=n[0],m=n[1]/2+Fo/4,M=Math.sin(m),x=Math.cos(m),b=y-h,_=b>=0?1:-1,w=_*b,S=w>Fo,k=g*M;if(ka.add(Math.atan2(k*_*Math.sin(w),v*x+k*Math.cos(w))),u+=S?b+_*Ho:b,S^h>=e^y>=e){var N=mt(dt(s),dt(n));bt(N);var E=mt(i,N);bt(E);var A=(S^b>=0?-1:1)*tn(E[2]);(r>A||r===A&&(N[0]||N[1]))&&(o+=S^b>=0?1:-1)}if(!d++)break;h=y,g=M,v=x,s=n}}return(-Uo>u||Uo>u&&-Uo>ka)^1&o}function It(n){function t(n,t){return Math.cos(n)*Math.cos(t)>u}function e(n){var e,u,l,c,f;return{lineStart:function(){c=l=!1,f=1},point:function(s,h){var p,g=[s,h],v=t(s,h),d=o?v?0:i(s,h):v?i(s+(0>s?Fo:-Fo),h):0;if(!e&&(c=l=v)&&n.lineStart(),v!==l&&(p=r(e,g),(wt(e,p)||wt(g,p))&&(g[0]+=Uo,g[1]+=Uo,v=t(g[0],g[1]))),v!==l)f=0,v?(n.lineStart(),p=r(g,e),n.point(p[0],p[1])):(p=r(e,g),n.point(p[0],p[1]),n.lineEnd()),e=p;else if(a&&e&&o^v){var y;d&u||!(y=r(g,e,!0))||(f=0,o?(n.lineStart(),n.point(y[0][0],y[0][1]),n.point(y[1][0],y[1][1]),n.lineEnd()):(n.point(y[1][0],y[1][1]),n.lineEnd(),n.lineStart(),n.point(y[0][0],y[0][1])))}!v||e&&wt(e,g)||n.point(g[0],g[1]),e=g,l=v,u=d},lineEnd:function(){l&&n.lineEnd(),e=null},clean:function(){return f|(c&&l)<<1}}}function r(n,t,e){var r=dt(n),i=dt(t),o=[1,0,0],a=mt(r,i),l=yt(a,a),c=a[0],f=l-c*c;if(!f)return!e&&n;var s=u*l/f,h=-u*c/f,p=mt(o,a),g=xt(o,s),v=xt(a,h);Mt(g,v);var d=p,y=yt(g,d),m=yt(d,d),M=y*y-m*(yt(g,g)-1);if(!(0>M)){var x=Math.sqrt(M),b=xt(d,(-y-x)/m);if(Mt(b,g),b=_t(b),!e)return b;var _,w=n[0],S=t[0],k=n[1],N=t[1];w>S&&(_=w,w=S,S=_);var E=S-w,A=xo(E-Fo)E;if(!A&&k>N&&(_=k,k=N,N=_),C?A?k+N>0^b[1]<(xo(b[0]-w)Fo^(w<=b[0]&&b[0]<=S)){var z=xt(d,(-y+x)/m);return Mt(z,g),[b,_t(z)]}}}function i(t,e){var r=o?n:Fo-n,i=0;return-r>t?i|=1:t>r&&(i|=2),-r>e?i|=4:e>r&&(i|=8),i}var u=Math.cos(n),o=u>0,a=xo(u)>Uo,l=ve(n,6*Yo);return Rt(t,e,l,o?[0,-n]:[-Fo,n-Fo])}function Yt(n,t,e,r){return function(i){var u,o=i.a,a=i.b,l=o.x,c=o.y,f=a.x,s=a.y,h=0,p=1,g=f-l,v=s-c;if(u=n-l,g||!(u>0)){if(u/=g,0>g){if(h>u)return;p>u&&(p=u)}else if(g>0){if(u>p)return;u>h&&(h=u)}if(u=e-l,g||!(0>u)){if(u/=g,0>g){if(u>p)return;u>h&&(h=u)}else if(g>0){if(h>u)return;p>u&&(p=u)}if(u=t-c,v||!(u>0)){if(u/=v,0>v){if(h>u)return;p>u&&(p=u)}else if(v>0){if(u>p)return;u>h&&(h=u)}if(u=r-c,v||!(0>u)){if(u/=v,0>v){if(u>p)return;u>h&&(h=u)}else if(v>0){if(h>u)return;p>u&&(p=u)}return h>0&&(i.a={x:l+h*g,y:c+h*v}),1>p&&(i.b={x:l+p*g,y:c+p*v}),i}}}}}}function Zt(n,t,e,r){function i(r,i){return xo(r[0]-n)0?0:3:xo(r[0]-e)0?2:1:xo(r[1]-t)0?1:0:i>0?3:2}function u(n,t){return o(n.x,t.x)}function o(n,t){var e=i(n,1),r=i(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(a){function l(n){for(var t=0,e=d.length,r=n[1],i=0;e>i;++i)for(var u,o=1,a=d[i],l=a.length,c=a[0];l>o;++o)u=a[o],c[1]<=r?u[1]>r&&Q(c,u,n)>0&&++t:u[1]<=r&&Q(c,u,n)<0&&--t,c=u;return 0!==t}function c(u,a,l,c){var f=0,s=0;if(null==u||(f=i(u,l))!==(s=i(a,l))||o(u,a)<0^l>0){do c.point(0===f||3===f?n:e,f>1?r:t);while((f=(f+l+4)%4)!==s)}else c.point(a[0],a[1])}function f(i,u){return i>=n&&e>=i&&u>=t&&r>=u}function s(n,t){f(n,t)&&a.point(n,t)}function h(){C.point=g,d&&d.push(y=[]),S=!0,w=!1,b=_=NaN}function p(){v&&(g(m,M),x&&w&&E.rejoin(),v.push(E.buffer())),C.point=s,w&&a.lineEnd()}function g(n,t){n=Math.max(-Ha,Math.min(Ha,n)),t=Math.max(-Ha,Math.min(Ha,t));var e=f(n,t);if(d&&y.push([n,t]),S)m=n,M=t,x=e,S=!1,e&&(a.lineStart(),a.point(n,t));else if(e&&w)a.point(n,t);else{var r={a:{x:b,y:_},b:{x:n,y:t}};A(r)?(w||(a.lineStart(),a.point(r.a.x,r.a.y)),a.point(r.b.x,r.b.y),e||a.lineEnd(),k=!1):e&&(a.lineStart(),a.point(n,t),k=!1)}b=n,_=t,w=e}var v,d,y,m,M,x,b,_,w,S,k,N=a,E=Pt(),A=Yt(n,t,e,r),C={point:s,lineStart:h,lineEnd:p,polygonStart:function(){a=E,v=[],d=[],k=!0},polygonEnd:function(){a=N,v=ao.merge(v);var t=l([n,r]),e=k&&t,i=v.length;(e||i)&&(a.polygonStart(),e&&(a.lineStart(),c(null,null,1,a),a.lineEnd()),i&&Lt(v,u,t,c,a),a.polygonEnd()),v=d=y=null}};return C}}function Vt(n){var t=0,e=Fo/3,r=ae(n),i=r(t,e);return i.parallels=function(n){return arguments.length?r(t=n[0]*Fo/180,e=n[1]*Fo/180):[t/Fo*180,e/Fo*180]},i}function Xt(n,t){function e(n,t){var e=Math.sqrt(u-2*i*Math.sin(t))/i;return[e*Math.sin(n*=i),o-e*Math.cos(n)]}var r=Math.sin(n),i=(r+Math.sin(t))/2,u=1+r*(2*i-r),o=Math.sqrt(u)/i;return e.invert=function(n,t){var e=o-t;return[Math.atan2(n,e)/i,tn((u-(n*n+e*e)*i*i)/(2*i))]},e}function $t(){function n(n,t){Ia+=i*n-r*t,r=n,i=t}var t,e,r,i;$a.point=function(u,o){$a.point=n,t=r=u,e=i=o},$a.lineEnd=function(){n(t,e)}}function Bt(n,t){Ya>n&&(Ya=n),n>Va&&(Va=n),Za>t&&(Za=t),t>Xa&&(Xa=t)}function Wt(){function n(n,t){o.push("M",n,",",t,u)}function t(n,t){o.push("M",n,",",t),a.point=e}function e(n,t){o.push("L",n,",",t)}function r(){a.point=n}function i(){o.push("Z")}var u=Jt(4.5),o=[],a={point:n,lineStart:function(){a.point=t},lineEnd:r,polygonStart:function(){a.lineEnd=i},polygonEnd:function(){a.lineEnd=r,a.point=n},pointRadius:function(n){return u=Jt(n),a},result:function(){if(o.length){var n=o.join("");return o=[],n}}};return a}function Jt(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function Gt(n,t){Ca+=n,za+=t,++La}function Kt(){function n(n,r){var i=n-t,u=r-e,o=Math.sqrt(i*i+u*u);qa+=o*(t+n)/2,Ta+=o*(e+r)/2,Ra+=o,Gt(t=n,e=r)}var t,e;Wa.point=function(r,i){Wa.point=n,Gt(t=r,e=i)}}function Qt(){Wa.point=Gt}function ne(){function n(n,t){var e=n-r,u=t-i,o=Math.sqrt(e*e+u*u);qa+=o*(r+n)/2,Ta+=o*(i+t)/2,Ra+=o,o=i*n-r*t,Da+=o*(r+n),Pa+=o*(i+t),Ua+=3*o,Gt(r=n,i=t)}var t,e,r,i;Wa.point=function(u,o){Wa.point=n,Gt(t=r=u,e=i=o)},Wa.lineEnd=function(){n(t,e)}}function te(n){function t(t,e){n.moveTo(t+o,e),n.arc(t,e,o,0,Ho)}function e(t,e){n.moveTo(t,e),a.point=r}function r(t,e){n.lineTo(t,e)}function i(){a.point=t}function u(){n.closePath()}var o=4.5,a={point:t,lineStart:function(){a.point=e},lineEnd:i,polygonStart:function(){a.lineEnd=u},polygonEnd:function(){a.lineEnd=i,a.point=t},pointRadius:function(n){return o=n,a},result:b};return a}function ee(n){function t(n){return(a?r:e)(n)}function e(t){return ue(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){M=NaN,S.point=u,t.lineStart()}function u(e,r){var u=dt([e,r]),o=n(e,r);i(M,x,m,b,_,w,M=o[0],x=o[1],m=e,b=u[0],_=u[1],w=u[2],a,t),t.point(M,x)}function o(){S.point=e,t.lineEnd()}function l(){ -r(),S.point=c,S.lineEnd=f}function c(n,t){u(s=n,h=t),p=M,g=x,v=b,d=_,y=w,S.point=u}function f(){i(M,x,m,b,_,w,p,g,s,v,d,y,a,t),S.lineEnd=o,o()}var s,h,p,g,v,d,y,m,M,x,b,_,w,S={point:e,lineStart:r,lineEnd:o,polygonStart:function(){t.polygonStart(),S.lineStart=l},polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function i(t,e,r,a,l,c,f,s,h,p,g,v,d,y){var m=f-t,M=s-e,x=m*m+M*M;if(x>4*u&&d--){var b=a+p,_=l+g,w=c+v,S=Math.sqrt(b*b+_*_+w*w),k=Math.asin(w/=S),N=xo(xo(w)-1)u||xo((m*z+M*L)/x-.5)>.3||o>a*p+l*g+c*v)&&(i(t,e,r,a,l,c,A,C,N,b/=S,_/=S,w,d,y),y.point(A,C),i(A,C,N,b,_,w,f,s,h,p,g,v,d,y))}}var u=.5,o=Math.cos(30*Yo),a=16;return t.precision=function(n){return arguments.length?(a=(u=n*n)>0&&16,t):Math.sqrt(u)},t}function re(n){var t=ee(function(t,e){return n([t*Zo,e*Zo])});return function(n){return le(t(n))}}function ie(n){this.stream=n}function ue(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function oe(n){return ae(function(){return n})()}function ae(n){function t(n){return n=a(n[0]*Yo,n[1]*Yo),[n[0]*h+l,c-n[1]*h]}function e(n){return n=a.invert((n[0]-l)/h,(c-n[1])/h),n&&[n[0]*Zo,n[1]*Zo]}function r(){a=Ct(o=se(y,M,x),u);var n=u(v,d);return l=p-n[0]*h,c=g+n[1]*h,i()}function i(){return f&&(f.valid=!1,f=null),t}var u,o,a,l,c,f,s=ee(function(n,t){return n=u(n,t),[n[0]*h+l,c-n[1]*h]}),h=150,p=480,g=250,v=0,d=0,y=0,M=0,x=0,b=Fa,_=m,w=null,S=null;return t.stream=function(n){return f&&(f.valid=!1),f=le(b(o,s(_(n)))),f.valid=!0,f},t.clipAngle=function(n){return arguments.length?(b=null==n?(w=n,Fa):It((w=+n)*Yo),i()):w},t.clipExtent=function(n){return arguments.length?(S=n,_=n?Zt(n[0][0],n[0][1],n[1][0],n[1][1]):m,i()):S},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(p=+n[0],g=+n[1],r()):[p,g]},t.center=function(n){return arguments.length?(v=n[0]%360*Yo,d=n[1]%360*Yo,r()):[v*Zo,d*Zo]},t.rotate=function(n){return arguments.length?(y=n[0]%360*Yo,M=n[1]%360*Yo,x=n.length>2?n[2]%360*Yo:0,r()):[y*Zo,M*Zo,x*Zo]},ao.rebind(t,s,"precision"),function(){return u=n.apply(this,arguments),t.invert=u.invert&&e,r()}}function le(n){return ue(n,function(t,e){n.point(t*Yo,e*Yo)})}function ce(n,t){return[n,t]}function fe(n,t){return[n>Fo?n-Ho:-Fo>n?n+Ho:n,t]}function se(n,t,e){return n?t||e?Ct(pe(n),ge(t,e)):pe(n):t||e?ge(t,e):fe}function he(n){return function(t,e){return t+=n,[t>Fo?t-Ho:-Fo>t?t+Ho:t,e]}}function pe(n){var t=he(n);return t.invert=he(-n),t}function ge(n,t){function e(n,t){var e=Math.cos(t),a=Math.cos(n)*e,l=Math.sin(n)*e,c=Math.sin(t),f=c*r+a*i;return[Math.atan2(l*u-f*o,a*r-c*i),tn(f*u+l*o)]}var r=Math.cos(n),i=Math.sin(n),u=Math.cos(t),o=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),a=Math.cos(n)*e,l=Math.sin(n)*e,c=Math.sin(t),f=c*u-l*o;return[Math.atan2(l*u+c*o,a*r+f*i),tn(f*r-a*i)]},e}function ve(n,t){var e=Math.cos(n),r=Math.sin(n);return function(i,u,o,a){var l=o*t;null!=i?(i=de(e,i),u=de(e,u),(o>0?u>i:i>u)&&(i+=o*Ho)):(i=n+o*Ho,u=n-.5*l);for(var c,f=i;o>0?f>u:u>f;f-=l)a.point((c=_t([e,-r*Math.cos(f),-r*Math.sin(f)]))[0],c[1])}}function de(n,t){var e=dt(t);e[0]-=n,bt(e);var r=nn(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Uo)%(2*Math.PI)}function ye(n,t,e){var r=ao.range(n,t-Uo,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function me(n,t,e){var r=ao.range(n,t-Uo,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function Me(n){return n.source}function xe(n){return n.target}function be(n,t,e,r){var i=Math.cos(t),u=Math.sin(t),o=Math.cos(r),a=Math.sin(r),l=i*Math.cos(n),c=i*Math.sin(n),f=o*Math.cos(e),s=o*Math.sin(e),h=2*Math.asin(Math.sqrt(on(r-t)+i*o*on(e-n))),p=1/Math.sin(h),g=h?function(n){var t=Math.sin(n*=h)*p,e=Math.sin(h-n)*p,r=e*l+t*f,i=e*c+t*s,o=e*u+t*a;return[Math.atan2(i,r)*Zo,Math.atan2(o,Math.sqrt(r*r+i*i))*Zo]}:function(){return[n*Zo,t*Zo]};return g.distance=h,g}function _e(){function n(n,i){var u=Math.sin(i*=Yo),o=Math.cos(i),a=xo((n*=Yo)-t),l=Math.cos(a);Ja+=Math.atan2(Math.sqrt((a=o*Math.sin(a))*a+(a=r*u-e*o*l)*a),e*u+r*o*l),t=n,e=u,r=o}var t,e,r;Ga.point=function(i,u){t=i*Yo,e=Math.sin(u*=Yo),r=Math.cos(u),Ga.point=n},Ga.lineEnd=function(){Ga.point=Ga.lineEnd=b}}function we(n,t){function e(t,e){var r=Math.cos(t),i=Math.cos(e),u=n(r*i);return[u*i*Math.sin(t),u*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),i=t(r),u=Math.sin(i),o=Math.cos(i);return[Math.atan2(n*u,r*o),Math.asin(r&&e*u/r)]},e}function Se(n,t){function e(n,t){o>0?-Io+Uo>t&&(t=-Io+Uo):t>Io-Uo&&(t=Io-Uo);var e=o/Math.pow(i(t),u);return[e*Math.sin(u*n),o-e*Math.cos(u*n)]}var r=Math.cos(n),i=function(n){return Math.tan(Fo/4+n/2)},u=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(i(t)/i(n)),o=r*Math.pow(i(n),u)/u;return u?(e.invert=function(n,t){var e=o-t,r=K(u)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/u,2*Math.atan(Math.pow(o/r,1/u))-Io]},e):Ne}function ke(n,t){function e(n,t){var e=u-t;return[e*Math.sin(i*n),u-e*Math.cos(i*n)]}var r=Math.cos(n),i=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),u=r/i+n;return xo(i)i;i++){for(;r>1&&Q(n[e[r-2]],n[e[r-1]],n[i])<=0;)--r;e[r++]=i}return e.slice(0,r)}function qe(n,t){return n[0]-t[0]||n[1]-t[1]}function Te(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function Re(n,t,e,r){var i=n[0],u=e[0],o=t[0]-i,a=r[0]-u,l=n[1],c=e[1],f=t[1]-l,s=r[1]-c,h=(a*(l-c)-s*(i-u))/(s*o-a*f);return[i+h*o,l+h*f]}function De(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function Pe(){rr(this),this.edge=this.site=this.circle=null}function Ue(n){var t=cl.pop()||new Pe;return t.site=n,t}function je(n){Be(n),ol.remove(n),cl.push(n),rr(n)}function Fe(n){var t=n.circle,e=t.x,r=t.cy,i={x:e,y:r},u=n.P,o=n.N,a=[n];je(n);for(var l=u;l.circle&&xo(e-l.circle.x)f;++f)c=a[f],l=a[f-1],nr(c.edge,l.site,c.site,i);l=a[0],c=a[s-1],c.edge=Ke(l.site,c.site,null,i),$e(l),$e(c)}function He(n){for(var t,e,r,i,u=n.x,o=n.y,a=ol._;a;)if(r=Oe(a,o)-u,r>Uo)a=a.L;else{if(i=u-Ie(a,o),!(i>Uo)){r>-Uo?(t=a.P,e=a):i>-Uo?(t=a,e=a.N):t=e=a;break}if(!a.R){t=a;break}a=a.R}var l=Ue(n);if(ol.insert(t,l),t||e){if(t===e)return Be(t),e=Ue(t.site),ol.insert(l,e),l.edge=e.edge=Ke(t.site,l.site),$e(t),void $e(e);if(!e)return void(l.edge=Ke(t.site,l.site));Be(t),Be(e);var c=t.site,f=c.x,s=c.y,h=n.x-f,p=n.y-s,g=e.site,v=g.x-f,d=g.y-s,y=2*(h*d-p*v),m=h*h+p*p,M=v*v+d*d,x={x:(d*m-p*M)/y+f,y:(h*M-v*m)/y+s};nr(e.edge,c,g,x),l.edge=Ke(c,n,null,x),e.edge=Ke(n,g,null,x),$e(t),$e(e)}}function Oe(n,t){var e=n.site,r=e.x,i=e.y,u=i-t;if(!u)return r;var o=n.P;if(!o)return-(1/0);e=o.site;var a=e.x,l=e.y,c=l-t;if(!c)return a;var f=a-r,s=1/u-1/c,h=f/c;return s?(-h+Math.sqrt(h*h-2*s*(f*f/(-2*c)-l+c/2+i-u/2)))/s+r:(r+a)/2}function Ie(n,t){var e=n.N;if(e)return Oe(e,t);var r=n.site;return r.y===t?r.x:1/0}function Ye(n){this.site=n,this.edges=[]}function Ze(n){for(var t,e,r,i,u,o,a,l,c,f,s=n[0][0],h=n[1][0],p=n[0][1],g=n[1][1],v=ul,d=v.length;d--;)if(u=v[d],u&&u.prepare())for(a=u.edges,l=a.length,o=0;l>o;)f=a[o].end(),r=f.x,i=f.y,c=a[++o%l].start(),t=c.x,e=c.y,(xo(r-t)>Uo||xo(i-e)>Uo)&&(a.splice(o,0,new tr(Qe(u.site,f,xo(r-s)Uo?{x:s,y:xo(t-s)Uo?{x:xo(e-g)Uo?{x:h,y:xo(t-h)Uo?{x:xo(e-p)=-jo)){var p=l*l+c*c,g=f*f+s*s,v=(s*p-c*g)/h,d=(l*g-f*p)/h,s=d+a,y=fl.pop()||new Xe;y.arc=n,y.site=i,y.x=v+o,y.y=s+Math.sqrt(v*v+d*d),y.cy=s,n.circle=y;for(var m=null,M=ll._;M;)if(y.yd||d>=a)return;if(h>g){if(u){if(u.y>=c)return}else u={x:d,y:l};e={x:d,y:c}}else{if(u){if(u.yr||r>1)if(h>g){if(u){if(u.y>=c)return}else u={x:(l-i)/r,y:l};e={x:(c-i)/r,y:c}}else{if(u){if(u.yp){if(u){if(u.x>=a)return}else u={x:o,y:r*o+i};e={x:a,y:r*a+i}}else{if(u){if(u.xu||s>o||r>h||i>p)){if(g=n.point){var g,v=t-n.x,d=e-n.y,y=v*v+d*d;if(l>y){var m=Math.sqrt(l=y);r=t-m,i=e-m,u=t+m,o=e+m,a=g}}for(var M=n.nodes,x=.5*(f+h),b=.5*(s+p),_=t>=x,w=e>=b,S=w<<1|_,k=S+4;k>S;++S)if(n=M[3&S])switch(3&S){case 0:c(n,f,s,x,b);break;case 1:c(n,x,s,h,b);break;case 2:c(n,f,b,x,p);break;case 3:c(n,x,b,h,p)}}}(n,r,i,u,o),a}function vr(n,t){n=ao.rgb(n),t=ao.rgb(t);var e=n.r,r=n.g,i=n.b,u=t.r-e,o=t.g-r,a=t.b-i;return function(n){return"#"+bn(Math.round(e+u*n))+bn(Math.round(r+o*n))+bn(Math.round(i+a*n))}}function dr(n,t){var e,r={},i={};for(e in n)e in t?r[e]=Mr(n[e],t[e]):i[e]=n[e];for(e in t)e in n||(i[e]=t[e]);return function(n){for(e in r)i[e]=r[e](n);return i}}function yr(n,t){return n=+n,t=+t,function(e){return n*(1-e)+t*e}}function mr(n,t){var e,r,i,u=hl.lastIndex=pl.lastIndex=0,o=-1,a=[],l=[];for(n+="",t+="";(e=hl.exec(n))&&(r=pl.exec(t));)(i=r.index)>u&&(i=t.slice(u,i),a[o]?a[o]+=i:a[++o]=i),(e=e[0])===(r=r[0])?a[o]?a[o]+=r:a[++o]=r:(a[++o]=null,l.push({i:o,x:yr(e,r)})),u=pl.lastIndex;return ur;++r)a[(e=l[r]).i]=e.x(n);return a.join("")})}function Mr(n,t){for(var e,r=ao.interpolators.length;--r>=0&&!(e=ao.interpolators[r](n,t)););return e}function xr(n,t){var e,r=[],i=[],u=n.length,o=t.length,a=Math.min(n.length,t.length);for(e=0;a>e;++e)r.push(Mr(n[e],t[e]));for(;u>e;++e)i[e]=n[e];for(;o>e;++e)i[e]=t[e];return function(n){for(e=0;a>e;++e)i[e]=r[e](n);return i}}function br(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function _r(n){return function(t){return 1-n(1-t)}}function wr(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function Sr(n){return n*n}function kr(n){return n*n*n}function Nr(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function Er(n){return function(t){return Math.pow(t,n)}}function Ar(n){return 1-Math.cos(n*Io)}function Cr(n){return Math.pow(2,10*(n-1))}function zr(n){return 1-Math.sqrt(1-n*n)}function Lr(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/Ho*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*Ho/t)}}function qr(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function Tr(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Rr(n,t){n=ao.hcl(n),t=ao.hcl(t);var e=n.h,r=n.c,i=n.l,u=t.h-e,o=t.c-r,a=t.l-i;return isNaN(o)&&(o=0,r=isNaN(r)?t.c:r),isNaN(u)?(u=0,e=isNaN(e)?t.h:e):u>180?u-=360:-180>u&&(u+=360),function(n){return sn(e+u*n,r+o*n,i+a*n)+""}}function Dr(n,t){n=ao.hsl(n),t=ao.hsl(t);var e=n.h,r=n.s,i=n.l,u=t.h-e,o=t.s-r,a=t.l-i;return isNaN(o)&&(o=0,r=isNaN(r)?t.s:r),isNaN(u)?(u=0,e=isNaN(e)?t.h:e):u>180?u-=360:-180>u&&(u+=360),function(n){return cn(e+u*n,r+o*n,i+a*n)+""}}function Pr(n,t){n=ao.lab(n),t=ao.lab(t);var e=n.l,r=n.a,i=n.b,u=t.l-e,o=t.a-r,a=t.b-i;return function(n){return pn(e+u*n,r+o*n,i+a*n)+""}}function Ur(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function jr(n){var t=[n.a,n.b],e=[n.c,n.d],r=Hr(t),i=Fr(t,e),u=Hr(Or(e,t,-i))||0;t[0]*e[1]180?t+=360:t-n>180&&(n+=360),r.push({i:e.push(Ir(e)+"rotate(",null,")")-2,x:yr(n,t)})):t&&e.push(Ir(e)+"rotate("+t+")")}function Vr(n,t,e,r){n!==t?r.push({i:e.push(Ir(e)+"skewX(",null,")")-2,x:yr(n,t)}):t&&e.push(Ir(e)+"skewX("+t+")")}function Xr(n,t,e,r){if(n[0]!==t[0]||n[1]!==t[1]){var i=e.push(Ir(e)+"scale(",null,",",null,")");r.push({i:i-4,x:yr(n[0],t[0])},{i:i-2,x:yr(n[1],t[1])})}else 1===t[0]&&1===t[1]||e.push(Ir(e)+"scale("+t+")")}function $r(n,t){var e=[],r=[];return n=ao.transform(n),t=ao.transform(t),Yr(n.translate,t.translate,e,r),Zr(n.rotate,t.rotate,e,r),Vr(n.skew,t.skew,e,r),Xr(n.scale,t.scale,e,r),n=t=null,function(n){for(var t,i=-1,u=r.length;++i=0;)e.push(i[r])}function oi(n,t){for(var e=[n],r=[];null!=(n=e.pop());)if(r.push(n),(u=n.children)&&(i=u.length))for(var i,u,o=-1;++oe;++e)(t=n[e][1])>i&&(r=e,i=t);return r}function yi(n){return n.reduce(mi,0)}function mi(n,t){return n+t[1]}function Mi(n,t){return xi(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function xi(n,t){for(var e=-1,r=+n[0],i=(n[1]-r)/t,u=[];++e<=t;)u[e]=i*e+r;return u}function bi(n){return[ao.min(n),ao.max(n)]}function _i(n,t){return n.value-t.value}function wi(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function Si(n,t){n._pack_next=t,t._pack_prev=n}function ki(n,t){var e=t.x-n.x,r=t.y-n.y,i=n.r+t.r;return.999*i*i>e*e+r*r}function Ni(n){function t(n){f=Math.min(n.x-n.r,f),s=Math.max(n.x+n.r,s),h=Math.min(n.y-n.r,h),p=Math.max(n.y+n.r,p)}if((e=n.children)&&(c=e.length)){var e,r,i,u,o,a,l,c,f=1/0,s=-(1/0),h=1/0,p=-(1/0);if(e.forEach(Ei),r=e[0],r.x=-r.r,r.y=0,t(r),c>1&&(i=e[1],i.x=i.r,i.y=0,t(i),c>2))for(u=e[2],zi(r,i,u),t(u),wi(r,u),r._pack_prev=u,wi(u,i),i=r._pack_next,o=3;c>o;o++){zi(r,i,u=e[o]);var g=0,v=1,d=1;for(a=i._pack_next;a!==i;a=a._pack_next,v++)if(ki(a,u)){g=1;break}if(1==g)for(l=r._pack_prev;l!==a._pack_prev&&!ki(l,u);l=l._pack_prev,d++);g?(d>v||v==d&&i.ro;o++)u=e[o],u.x-=y,u.y-=m,M=Math.max(M,u.r+Math.sqrt(u.x*u.x+u.y*u.y));n.r=M,e.forEach(Ai)}}function Ei(n){n._pack_next=n._pack_prev=n}function Ai(n){delete n._pack_next,delete n._pack_prev}function Ci(n,t,e,r){var i=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,i)for(var u=-1,o=i.length;++u=0;)t=i[u],t.z+=e,t.m+=e,e+=t.s+(r+=t.c)}function Pi(n,t,e){return n.a.parent===t.parent?n.a:e}function Ui(n){return 1+ao.max(n,function(n){return n.y})}function ji(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Fi(n){var t=n.children;return t&&t.length?Fi(t[0]):n}function Hi(n){var t,e=n.children;return e&&(t=e.length)?Hi(e[t-1]):n}function Oi(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function Ii(n,t){var e=n.x+t[3],r=n.y+t[0],i=n.dx-t[1]-t[3],u=n.dy-t[0]-t[2];return 0>i&&(e+=i/2,i=0),0>u&&(r+=u/2,u=0),{x:e,y:r,dx:i,dy:u}}function Yi(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function Zi(n){return n.rangeExtent?n.rangeExtent():Yi(n.range())}function Vi(n,t,e,r){var i=e(n[0],n[1]),u=r(t[0],t[1]);return function(n){return u(i(n))}}function Xi(n,t){var e,r=0,i=n.length-1,u=n[r],o=n[i];return u>o&&(e=r,r=i,i=e,e=u,u=o,o=e),n[r]=t.floor(u),n[i]=t.ceil(o),n}function $i(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:Sl}function Bi(n,t,e,r){var i=[],u=[],o=0,a=Math.min(n.length,t.length)-1;for(n[a]2?Bi:Vi,l=r?Wr:Br;return o=i(n,t,l,e),a=i(t,n,l,Mr),u}function u(n){return o(n)}var o,a;return u.invert=function(n){return a(n)},u.domain=function(t){return arguments.length?(n=t.map(Number),i()):n},u.range=function(n){return arguments.length?(t=n,i()):t},u.rangeRound=function(n){return u.range(n).interpolate(Ur)},u.clamp=function(n){return arguments.length?(r=n,i()):r},u.interpolate=function(n){return arguments.length?(e=n,i()):e},u.ticks=function(t){return Qi(n,t)},u.tickFormat=function(t,e){return nu(n,t,e)},u.nice=function(t){return Gi(n,t),i()},u.copy=function(){return Wi(n,t,e,r)},i()}function Ji(n,t){return ao.rebind(n,t,"range","rangeRound","interpolate","clamp")}function Gi(n,t){return Xi(n,$i(Ki(n,t)[2])),Xi(n,$i(Ki(n,t)[2])),n}function Ki(n,t){null==t&&(t=10);var e=Yi(n),r=e[1]-e[0],i=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),u=t/r*i;return.15>=u?i*=10:.35>=u?i*=5:.75>=u&&(i*=2),e[0]=Math.ceil(e[0]/i)*i,e[1]=Math.floor(e[1]/i)*i+.5*i,e[2]=i,e}function Qi(n,t){return ao.range.apply(ao,Ki(n,t))}function nu(n,t,e){var r=Ki(n,t);if(e){var i=ha.exec(e);if(i.shift(),"s"===i[8]){var u=ao.formatPrefix(Math.max(xo(r[0]),xo(r[1])));return i[7]||(i[7]="."+tu(u.scale(r[2]))),i[8]="f",e=ao.format(i.join("")),function(n){return e(u.scale(n))+u.symbol}}i[7]||(i[7]="."+eu(i[8],r)),e=i.join("")}else e=",."+tu(r[2])+"f";return ao.format(e)}function tu(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function eu(n,t){var e=tu(t[2]);return n in kl?Math.abs(e-tu(Math.max(xo(t[0]),xo(t[1]))))+ +("e"!==n):e-2*("%"===n)}function ru(n,t,e,r){function i(n){return(e?Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function u(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function o(t){return n(i(t))}return o.invert=function(t){return u(n.invert(t))},o.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(i)),o):r},o.base=function(e){return arguments.length?(t=+e,n.domain(r.map(i)),o):t},o.nice=function(){var t=Xi(r.map(i),e?Math:El);return n.domain(t),r=t.map(u),o},o.ticks=function(){var n=Yi(r),o=[],a=n[0],l=n[1],c=Math.floor(i(a)),f=Math.ceil(i(l)),s=t%1?2:t;if(isFinite(f-c)){if(e){for(;f>c;c++)for(var h=1;s>h;h++)o.push(u(c)*h);o.push(u(c))}else for(o.push(u(c));c++0;h--)o.push(u(c)*h);for(c=0;o[c]l;f--);o=o.slice(c,f)}return o},o.tickFormat=function(n,e){if(!arguments.length)return Nl;arguments.length<2?e=Nl:"function"!=typeof e&&(e=ao.format(e));var r=Math.max(1,t*n/o.ticks().length);return function(n){var o=n/u(Math.round(i(n)));return t-.5>o*t&&(o*=t),r>=o?e(n):""}},o.copy=function(){return ru(n.copy(),t,e,r)},Ji(o,n)}function iu(n,t,e){function r(t){return n(i(t))}var i=uu(t),u=uu(1/t);return r.invert=function(t){return u(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(i)),r):e},r.ticks=function(n){return Qi(e,n)},r.tickFormat=function(n,t){return nu(e,n,t)},r.nice=function(n){return r.domain(Gi(e,n))},r.exponent=function(o){return arguments.length?(i=uu(t=o),u=uu(1/t),n.domain(e.map(i)),r):t},r.copy=function(){return iu(n.copy(),t,e)},Ji(r,n)}function uu(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function ou(n,t){function e(e){return u[((i.get(e)||("range"===t.t?i.set(e,n.push(e)):NaN))-1)%u.length]}function r(t,e){return ao.range(n.length).map(function(n){return t+e*n})}var i,u,o;return e.domain=function(r){if(!arguments.length)return n;n=[],i=new c;for(var u,o=-1,a=r.length;++oe?[NaN,NaN]:[e>0?a[e-1]:n[0],et?NaN:t/u+n,[t,t+1/u]},r.copy=function(){return lu(n,t,e)},i()}function cu(n,t){function e(e){return e>=e?t[ao.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return cu(n,t)},e}function fu(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return Qi(n,t)},t.tickFormat=function(t,e){return nu(n,t,e)},t.copy=function(){return fu(n)},t}function su(){return 0}function hu(n){return n.innerRadius}function pu(n){return n.outerRadius}function gu(n){return n.startAngle}function vu(n){return n.endAngle}function du(n){return n&&n.padAngle}function yu(n,t,e,r){return(n-e)*t-(t-r)*n>0?0:1}function mu(n,t,e,r,i){var u=n[0]-t[0],o=n[1]-t[1],a=(i?r:-r)/Math.sqrt(u*u+o*o),l=a*o,c=-a*u,f=n[0]+l,s=n[1]+c,h=t[0]+l,p=t[1]+c,g=(f+h)/2,v=(s+p)/2,d=h-f,y=p-s,m=d*d+y*y,M=e-r,x=f*p-h*s,b=(0>y?-1:1)*Math.sqrt(Math.max(0,M*M*m-x*x)),_=(x*y-d*b)/m,w=(-x*d-y*b)/m,S=(x*y+d*b)/m,k=(-x*d+y*b)/m,N=_-g,E=w-v,A=S-g,C=k-v;return N*N+E*E>A*A+C*C&&(_=S,w=k),[[_-l,w-c],[_*e/M,w*e/M]]}function Mu(n){function t(t){function o(){c.push("M",u(n(f),a))}for(var l,c=[],f=[],s=-1,h=t.length,p=En(e),g=En(r);++s1?n.join("L"):n+"Z"}function bu(n){return n.join("L")+"Z"}function _u(n){for(var t=0,e=n.length,r=n[0],i=[r[0],",",r[1]];++t1&&i.push("H",r[0]),i.join("")}function wu(n){for(var t=0,e=n.length,r=n[0],i=[r[0],",",r[1]];++t1){a=t[1],u=n[l],l++,r+="C"+(i[0]+o[0])+","+(i[1]+o[1])+","+(u[0]-a[0])+","+(u[1]-a[1])+","+u[0]+","+u[1];for(var c=2;c9&&(i=3*t/Math.sqrt(i),o[a]=i*e,o[a+1]=i*r));for(a=-1;++a<=l;)i=(n[Math.min(l,a+1)][0]-n[Math.max(0,a-1)][0])/(6*(1+o[a]*o[a])),u.push([i||0,o[a]*i||0]);return u}function Fu(n){return n.length<3?xu(n):n[0]+Au(n,ju(n))}function Hu(n){for(var t,e,r,i=-1,u=n.length;++i=t?o(n-t):void(f.c=o)}function o(e){var i=g.active,u=g[i];u&&(u.timer.c=null,u.timer.t=NaN,--g.count,delete g[i],u.event&&u.event.interrupt.call(n,n.__data__,u.index));for(var o in g)if(r>+o){var c=g[o];c.timer.c=null,c.timer.t=NaN,--g.count,delete g[o]}f.c=a,qn(function(){return f.c&&a(e||1)&&(f.c=null,f.t=NaN),1},0,l),g.active=r,v.event&&v.event.start.call(n,n.__data__,t),p=[],v.tween.forEach(function(e,r){(r=r.call(n,n.__data__,t))&&p.push(r)}),h=v.ease,s=v.duration}function a(i){for(var u=i/s,o=h(u),a=p.length;a>0;)p[--a].call(n,o);return u>=1?(v.event&&v.event.end.call(n,n.__data__,t),--g.count?delete g[r]:delete n[e],1):void 0}var l,f,s,h,p,g=n[e]||(n[e]={active:0,count:0}),v=g[r];v||(l=i.time,f=qn(u,0,l),v=g[r]={tween:new c,time:l,timer:f,delay:i.delay,duration:i.duration,ease:i.ease,index:t},i=null,++g.count)}function no(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate("+(isFinite(r)?r:e(n))+",0)"})}function to(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate(0,"+(isFinite(r)?r:e(n))+")"})}function eo(n){return n.toISOString()}function ro(n,t,e){function r(t){return n(t)}function i(n,e){var r=n[1]-n[0],i=r/e,u=ao.bisect(Kl,i);return u==Kl.length?[t.year,Ki(n.map(function(n){return n/31536e6}),e)[2]]:u?t[i/Kl[u-1]1?{floor:function(t){for(;e(t=n.floor(t));)t=io(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=io(+t+1);return t}}:n))},r.ticks=function(n,t){var e=Yi(r.domain()),u=null==n?i(e,10):"number"==typeof n?i(e,n):!n.range&&[{range:n},t];return u&&(n=u[0],t=u[1]),n.range(e[0],io(+e[1]+1),1>t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return ro(n.copy(),t,e)},Ji(r,n)}function io(n){return new Date(n)}function uo(n){return JSON.parse(n.responseText)}function oo(n){var t=fo.createRange();return t.selectNode(fo.body),t.createContextualFragment(n.responseText)}var ao={version:"3.5.17"},lo=[].slice,co=function(n){return lo.call(n)},fo=this.document;if(fo)try{co(fo.documentElement.childNodes)[0].nodeType}catch(so){co=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}if(Date.now||(Date.now=function(){return+new Date}),fo)try{fo.createElement("DIV").style.setProperty("opacity",0,"")}catch(ho){var po=this.Element.prototype,go=po.setAttribute,vo=po.setAttributeNS,yo=this.CSSStyleDeclaration.prototype,mo=yo.setProperty;po.setAttribute=function(n,t){go.call(this,n,t+"")},po.setAttributeNS=function(n,t,e){vo.call(this,n,t,e+"")},yo.setProperty=function(n,t,e){mo.call(this,n,t+"",e)}}ao.ascending=e,ao.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:NaN},ao.min=function(n,t){var e,r,i=-1,u=n.length;if(1===arguments.length){for(;++i=r){e=r;break}for(;++ir&&(e=r)}else{for(;++i=r){e=r;break}for(;++ir&&(e=r)}return e},ao.max=function(n,t){var e,r,i=-1,u=n.length;if(1===arguments.length){for(;++i=r){e=r;break}for(;++ie&&(e=r)}else{for(;++i=r){e=r;break}for(;++ie&&(e=r)}return e},ao.extent=function(n,t){var e,r,i,u=-1,o=n.length;if(1===arguments.length){for(;++u=r){e=i=r;break}for(;++ur&&(e=r),r>i&&(i=r))}else{for(;++u=r){e=i=r;break}for(;++ur&&(e=r),r>i&&(i=r))}return[e,i]},ao.sum=function(n,t){var e,r=0,u=n.length,o=-1;if(1===arguments.length)for(;++o1?l/(f-1):void 0},ao.deviation=function(){var n=ao.variance.apply(this,arguments);return n?Math.sqrt(n):n};var Mo=u(e);ao.bisectLeft=Mo.left,ao.bisect=ao.bisectRight=Mo.right,ao.bisector=function(n){return u(1===n.length?function(t,r){return e(n(t),r)}:n)},ao.shuffle=function(n,t,e){(u=arguments.length)<3&&(e=n.length,2>u&&(t=0));for(var r,i,u=e-t;u;)i=Math.random()*u--|0,r=n[u+t],n[u+t]=n[i+t],n[i+t]=r;return n},ao.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},ao.pairs=function(n){for(var t,e=0,r=n.length-1,i=n[0],u=new Array(0>r?0:r);r>e;)u[e]=[t=i,i=n[++e]];return u},ao.transpose=function(n){if(!(i=n.length))return[];for(var t=-1,e=ao.min(n,o),r=new Array(e);++t=0;)for(r=n[i],t=r.length;--t>=0;)e[--o]=r[t];return e};var xo=Math.abs;ao.range=function(n,t,e){if(arguments.length<3&&(e=1,arguments.length<2&&(t=n,n=0)),(t-n)/e===1/0)throw new Error("infinite range");var r,i=[],u=a(xo(e)),o=-1;if(n*=u,t*=u,e*=u,0>e)for(;(r=n+e*++o)>t;)i.push(r/u);else for(;(r=n+e*++o)=u.length)return r?r.call(i,o):e?o.sort(e):o;for(var l,f,s,h,p=-1,g=o.length,v=u[a++],d=new c;++p=u.length)return n;var r=[],i=o[e++];return n.forEach(function(n,i){r.push({key:n,values:t(i,e)})}),i?r.sort(function(n,t){return i(n.key,t.key)}):r}var e,r,i={},u=[],o=[];return i.map=function(t,e){return n(e,t,0)},i.entries=function(e){return t(n(ao.map,e,0),0)},i.key=function(n){return u.push(n),i},i.sortKeys=function(n){return o[u.length-1]=n,i},i.sortValues=function(n){return e=n,i},i.rollup=function(n){return r=n,i},i},ao.set=function(n){var t=new y;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},l(y,{has:h,add:function(n){return this._[f(n+="")]=!0,n},remove:p,values:g,size:v,empty:d,forEach:function(n){for(var t in this._)n.call(this,s(t))}}),ao.behavior={},ao.rebind=function(n,t){for(var e,r=1,i=arguments.length;++r=0&&(r=n.slice(e+1),n=n.slice(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},ao.event=null,ao.requote=function(n){return n.replace(So,"\\$&")};var So=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,ko={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},No=function(n,t){return t.querySelector(n)},Eo=function(n,t){return t.querySelectorAll(n)},Ao=function(n,t){var e=n.matches||n[x(n,"matchesSelector")];return(Ao=function(n,t){return e.call(n,t)})(n,t)};"function"==typeof Sizzle&&(No=function(n,t){return Sizzle(n,t)[0]||null},Eo=Sizzle,Ao=Sizzle.matchesSelector),ao.selection=function(){return ao.select(fo.documentElement)};var Co=ao.selection.prototype=[];Co.select=function(n){var t,e,r,i,u=[];n=A(n);for(var o=-1,a=this.length;++o=0&&"xmlns"!==(e=n.slice(0,t))&&(n=n.slice(t+1)),Lo.hasOwnProperty(e)?{space:Lo[e],local:n}:n}},Co.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=ao.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(z(t,n[t]));return this}return this.each(z(n,t))},Co.classed=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node(),r=(n=T(n)).length,i=-1;if(t=e.classList){for(;++ii){if("string"!=typeof n){2>i&&(e="");for(r in n)this.each(P(r,n[r],e));return this}if(2>i){var u=this.node();return t(u).getComputedStyle(u,null).getPropertyValue(n)}r=""}return this.each(P(n,e,r))},Co.property=function(n,t){if(arguments.length<2){if("string"==typeof n)return this.node()[n];for(t in n)this.each(U(t,n[t]));return this}return this.each(U(n,t))},Co.text=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?"":t}:null==n?function(){this.textContent=""}:function(){this.textContent=n}):this.node().textContent},Co.html=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?"":t}:null==n?function(){this.innerHTML=""}:function(){this.innerHTML=n}):this.node().innerHTML},Co.append=function(n){return n=j(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},Co.insert=function(n,t){return n=j(n),t=A(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})},Co.remove=function(){return this.each(F)},Co.data=function(n,t){function e(n,e){var r,i,u,o=n.length,s=e.length,h=Math.min(o,s),p=new Array(s),g=new Array(s),v=new Array(o);if(t){var d,y=new c,m=new Array(o);for(r=-1;++rr;++r)g[r]=H(e[r]);for(;o>r;++r)v[r]=n[r]}g.update=p,g.parentNode=p.parentNode=v.parentNode=n.parentNode,a.push(g),l.push(p),f.push(v)}var r,i,u=-1,o=this.length;if(!arguments.length){for(n=new Array(o=(r=this[0]).length);++uu;u++){i.push(t=[]),t.parentNode=(e=this[u]).parentNode;for(var a=0,l=e.length;l>a;a++)(r=e[a])&&n.call(r,r.__data__,a,u)&&t.push(r)}return E(i)},Co.order=function(){for(var n=-1,t=this.length;++n=0;)(e=r[i])&&(u&&u!==e.nextSibling&&u.parentNode.insertBefore(e,u),u=e);return this},Co.sort=function(n){n=I.apply(this,arguments);for(var t=-1,e=this.length;++tn;n++)for(var e=this[n],r=0,i=e.length;i>r;r++){var u=e[r];if(u)return u}return null},Co.size=function(){var n=0;return Y(this,function(){++n}),n};var qo=[];ao.selection.enter=Z,ao.selection.enter.prototype=qo,qo.append=Co.append,qo.empty=Co.empty,qo.node=Co.node,qo.call=Co.call,qo.size=Co.size,qo.select=function(n){for(var t,e,r,i,u,o=[],a=-1,l=this.length;++ar){if("string"!=typeof n){2>r&&(t=!1);for(e in n)this.each(X(e,n[e],t));return this}if(2>r)return(r=this.node()["__on"+n])&&r._;e=!1}return this.each(X(n,t,e))};var To=ao.map({mouseenter:"mouseover",mouseleave:"mouseout"});fo&&To.forEach(function(n){"on"+n in fo&&To.remove(n)});var Ro,Do=0;ao.mouse=function(n){return J(n,k())};var Po=this.navigator&&/WebKit/.test(this.navigator.userAgent)?-1:0;ao.touch=function(n,t,e){if(arguments.length<3&&(e=t,t=k().changedTouches),t)for(var r,i=0,u=t.length;u>i;++i)if((r=t[i]).identifier===e)return J(n,r)},ao.behavior.drag=function(){function n(){this.on("mousedown.drag",u).on("touchstart.drag",o)}function e(n,t,e,u,o){return function(){function a(){var n,e,r=t(h,v);r&&(n=r[0]-M[0],e=r[1]-M[1],g|=n|e,M=r,p({type:"drag",x:r[0]+c[0],y:r[1]+c[1],dx:n,dy:e}))}function l(){t(h,v)&&(y.on(u+d,null).on(o+d,null),m(g),p({type:"dragend"}))}var c,f=this,s=ao.event.target.correspondingElement||ao.event.target,h=f.parentNode,p=r.of(f,arguments),g=0,v=n(),d=".drag"+(null==v?"":"-"+v),y=ao.select(e(s)).on(u+d,a).on(o+d,l),m=W(s),M=t(h,v);i?(c=i.apply(f,arguments),c=[c.x-M[0],c.y-M[1]]):c=[0,0],p({type:"dragstart"})}}var r=N(n,"drag","dragstart","dragend"),i=null,u=e(b,ao.mouse,t,"mousemove","mouseup"),o=e(G,ao.touch,m,"touchmove","touchend");return n.origin=function(t){return arguments.length?(i=t,n):i},ao.rebind(n,r,"on")},ao.touches=function(n,t){return arguments.length<2&&(t=k().touches),t?co(t).map(function(t){var e=J(n,t);return e.identifier=t.identifier,e}):[]};var Uo=1e-6,jo=Uo*Uo,Fo=Math.PI,Ho=2*Fo,Oo=Ho-Uo,Io=Fo/2,Yo=Fo/180,Zo=180/Fo,Vo=Math.SQRT2,Xo=2,$o=4;ao.interpolateZoom=function(n,t){var e,r,i=n[0],u=n[1],o=n[2],a=t[0],l=t[1],c=t[2],f=a-i,s=l-u,h=f*f+s*s;if(jo>h)r=Math.log(c/o)/Vo,e=function(n){return[i+n*f,u+n*s,o*Math.exp(Vo*n*r)]};else{var p=Math.sqrt(h),g=(c*c-o*o+$o*h)/(2*o*Xo*p),v=(c*c-o*o-$o*h)/(2*c*Xo*p),d=Math.log(Math.sqrt(g*g+1)-g),y=Math.log(Math.sqrt(v*v+1)-v);r=(y-d)/Vo,e=function(n){var t=n*r,e=rn(d),a=o/(Xo*p)*(e*un(Vo*t+d)-en(d));return[i+a*f,u+a*s,o*e/rn(Vo*t+d)]}}return e.duration=1e3*r,e},ao.behavior.zoom=function(){function n(n){n.on(L,s).on(Wo+".zoom",p).on("dblclick.zoom",g).on(R,h)}function e(n){return[(n[0]-k.x)/k.k,(n[1]-k.y)/k.k]}function r(n){return[n[0]*k.k+k.x,n[1]*k.k+k.y]}function i(n){k.k=Math.max(A[0],Math.min(A[1],n))}function u(n,t){t=r(t),k.x+=n[0]-t[0],k.y+=n[1]-t[1]}function o(t,e,r,o){t.__chart__={x:k.x,y:k.y,k:k.k},i(Math.pow(2,o)),u(d=e,r),t=ao.select(t),C>0&&(t=t.transition().duration(C)),t.call(n.event)}function a(){b&&b.domain(x.range().map(function(n){return(n-k.x)/k.k}).map(x.invert)),w&&w.domain(_.range().map(function(n){return(n-k.y)/k.k}).map(_.invert))}function l(n){z++||n({type:"zoomstart"})}function c(n){a(),n({type:"zoom",scale:k.k,translate:[k.x,k.y]})}function f(n){--z||(n({type:"zoomend"}),d=null)}function s(){function n(){a=1,u(ao.mouse(i),h),c(o)}function r(){s.on(q,null).on(T,null),p(a),f(o)}var i=this,o=D.of(i,arguments),a=0,s=ao.select(t(i)).on(q,n).on(T,r),h=e(ao.mouse(i)),p=W(i);Il.call(i),l(o)}function h(){function n(){var n=ao.touches(g);return p=k.k,n.forEach(function(n){n.identifier in d&&(d[n.identifier]=e(n))}),n}function t(){var t=ao.event.target;ao.select(t).on(x,r).on(b,a),_.push(t);for(var e=ao.event.changedTouches,i=0,u=e.length;u>i;++i)d[e[i].identifier]=null;var l=n(),c=Date.now();if(1===l.length){if(500>c-M){var f=l[0];o(g,f,d[f.identifier],Math.floor(Math.log(k.k)/Math.LN2)+1),S()}M=c}else if(l.length>1){var f=l[0],s=l[1],h=f[0]-s[0],p=f[1]-s[1];y=h*h+p*p}}function r(){var n,t,e,r,o=ao.touches(g);Il.call(g);for(var a=0,l=o.length;l>a;++a,r=null)if(e=o[a],r=d[e.identifier]){if(t)break;n=e,t=r}if(r){var f=(f=e[0]-n[0])*f+(f=e[1]-n[1])*f,s=y&&Math.sqrt(f/y);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+r[0])/2,(t[1]+r[1])/2],i(s*p)}M=null,u(n,t),c(v)}function a(){if(ao.event.touches.length){for(var t=ao.event.changedTouches,e=0,r=t.length;r>e;++e)delete d[t[e].identifier];for(var i in d)return void n()}ao.selectAll(_).on(m,null),w.on(L,s).on(R,h),N(),f(v)}var p,g=this,v=D.of(g,arguments),d={},y=0,m=".zoom-"+ao.event.changedTouches[0].identifier,x="touchmove"+m,b="touchend"+m,_=[],w=ao.select(g),N=W(g);t(),l(v),w.on(L,null).on(R,t)}function p(){var n=D.of(this,arguments);m?clearTimeout(m):(Il.call(this),v=e(d=y||ao.mouse(this)),l(n)),m=setTimeout(function(){m=null,f(n)},50),S(),i(Math.pow(2,.002*Bo())*k.k),u(d,v),c(n)}function g(){var n=ao.mouse(this),t=Math.log(k.k)/Math.LN2;o(this,n,e(n),ao.event.shiftKey?Math.ceil(t)-1:Math.floor(t)+1)}var v,d,y,m,M,x,b,_,w,k={x:0,y:0,k:1},E=[960,500],A=Jo,C=250,z=0,L="mousedown.zoom",q="mousemove.zoom",T="mouseup.zoom",R="touchstart.zoom",D=N(n,"zoomstart","zoom","zoomend");return Wo||(Wo="onwheel"in fo?(Bo=function(){return-ao.event.deltaY*(ao.event.deltaMode?120:1)},"wheel"):"onmousewheel"in fo?(Bo=function(){return ao.event.wheelDelta},"mousewheel"):(Bo=function(){return-ao.event.detail},"MozMousePixelScroll")),n.event=function(n){n.each(function(){var n=D.of(this,arguments),t=k;Hl?ao.select(this).transition().each("start.zoom",function(){k=this.__chart__||{x:0,y:0,k:1},l(n)}).tween("zoom:zoom",function(){var e=E[0],r=E[1],i=d?d[0]:e/2,u=d?d[1]:r/2,o=ao.interpolateZoom([(i-k.x)/k.k,(u-k.y)/k.k,e/k.k],[(i-t.x)/t.k,(u-t.y)/t.k,e/t.k]);return function(t){var r=o(t),a=e/r[2];this.__chart__=k={x:i-r[0]*a,y:u-r[1]*a,k:a},c(n)}}).each("interrupt.zoom",function(){f(n)}).each("end.zoom",function(){f(n)}):(this.__chart__=k,l(n),c(n),f(n))})},n.translate=function(t){return arguments.length?(k={x:+t[0],y:+t[1],k:k.k},a(),n):[k.x,k.y]},n.scale=function(t){return arguments.length?(k={x:k.x,y:k.y,k:null},i(+t),a(),n):k.k},n.scaleExtent=function(t){return arguments.length?(A=null==t?Jo:[+t[0],+t[1]],n):A},n.center=function(t){return arguments.length?(y=t&&[+t[0],+t[1]],n):y},n.size=function(t){return arguments.length?(E=t&&[+t[0],+t[1]],n):E},n.duration=function(t){return arguments.length?(C=+t,n):C},n.x=function(t){return arguments.length?(b=t,x=t.copy(),k={x:0,y:0,k:1},n):b},n.y=function(t){return arguments.length?(w=t,_=t.copy(),k={x:0,y:0,k:1},n):w},ao.rebind(n,D,"on")};var Bo,Wo,Jo=[0,1/0];ao.color=an,an.prototype.toString=function(){return this.rgb()+""},ao.hsl=ln;var Go=ln.prototype=new an;Go.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),new ln(this.h,this.s,this.l/n)},Go.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new ln(this.h,this.s,n*this.l)},Go.rgb=function(){return cn(this.h,this.s,this.l)},ao.hcl=fn;var Ko=fn.prototype=new an;Ko.brighter=function(n){return new fn(this.h,this.c,Math.min(100,this.l+Qo*(arguments.length?n:1)))},Ko.darker=function(n){return new fn(this.h,this.c,Math.max(0,this.l-Qo*(arguments.length?n:1)))},Ko.rgb=function(){return sn(this.h,this.c,this.l).rgb()},ao.lab=hn;var Qo=18,na=.95047,ta=1,ea=1.08883,ra=hn.prototype=new an;ra.brighter=function(n){return new hn(Math.min(100,this.l+Qo*(arguments.length?n:1)),this.a,this.b)},ra.darker=function(n){return new hn(Math.max(0,this.l-Qo*(arguments.length?n:1)),this.a,this.b)},ra.rgb=function(){return pn(this.l,this.a,this.b)},ao.rgb=mn;var ia=mn.prototype=new an;ia.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,i=30;return t||e||r?(t&&i>t&&(t=i),e&&i>e&&(e=i),r&&i>r&&(r=i),new mn(Math.min(255,t/n),Math.min(255,e/n),Math.min(255,r/n))):new mn(i,i,i)},ia.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new mn(n*this.r,n*this.g,n*this.b)},ia.hsl=function(){return wn(this.r,this.g,this.b)},ia.toString=function(){return"#"+bn(this.r)+bn(this.g)+bn(this.b)};var ua=ao.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});ua.forEach(function(n,t){ua.set(n,Mn(t))}),ao.functor=En,ao.xhr=An(m),ao.dsv=function(n,t){function e(n,e,u){arguments.length<3&&(u=e,e=null);var o=Cn(n,t,null==e?r:i(e),u);return o.row=function(n){return arguments.length?o.response(null==(e=n)?r:i(n)):e},o}function r(n){return e.parse(n.responseText)}function i(n){return function(t){return e.parse(t.responseText,n)}}function u(t){return t.map(o).join(n)}function o(n){return a.test(n)?'"'+n.replace(/\"/g,'""')+'"':n}var a=new RegExp('["'+n+"\n]"),l=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var i=new Function("d","return {"+n.map(function(n,t){return JSON.stringify(n)+": d["+t+"]"}).join(",")+"}");r=t?function(n,e){return t(i(n),e)}:i})},e.parseRows=function(n,t){function e(){if(f>=c)return o;if(i)return i=!1,u;var t=f;if(34===n.charCodeAt(t)){for(var e=t;e++f;){var r=n.charCodeAt(f++),a=1;if(10===r)i=!0;else if(13===r)i=!0,10===n.charCodeAt(f)&&(++f,++a);else if(r!==l)continue;return n.slice(t,f-a)}return n.slice(t)}for(var r,i,u={},o={},a=[],c=n.length,f=0,s=0;(r=e())!==o;){for(var h=[];r!==u&&r!==o;)h.push(r),r=e();t&&null==(h=t(h,s++))||a.push(h)}return a},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new y,i=[];return t.forEach(function(n){for(var t in n)r.has(t)||i.push(r.add(t))}),[i.map(o).join(n)].concat(t.map(function(t){return i.map(function(n){return o(t[n])}).join(n)})).join("\n")},e.formatRows=function(n){return n.map(u).join("\n")},e},ao.csv=ao.dsv(",","text/csv"),ao.tsv=ao.dsv(" ","text/tab-separated-values");var oa,aa,la,ca,fa=this[x(this,"requestAnimationFrame")]||function(n){setTimeout(n,17)};ao.timer=function(){qn.apply(this,arguments)},ao.timer.flush=function(){Rn(),Dn()},ao.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)};var sa=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"].map(Un);ao.formatPrefix=function(n,t){var e=0;return(n=+n)&&(0>n&&(n*=-1),t&&(n=ao.round(n,Pn(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((e-1)/3)))),sa[8+e/3]};var ha=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,pa=ao.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=ao.round(n,Pn(n,t))).toFixed(Math.max(0,Math.min(20,Pn(n*(1+1e-15),t))))}}),ga=ao.time={},va=Date;Hn.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){da.setUTCDate.apply(this._,arguments)},setDay:function(){da.setUTCDay.apply(this._,arguments)},setFullYear:function(){da.setUTCFullYear.apply(this._,arguments)},setHours:function(){da.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){da.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){da.setUTCMinutes.apply(this._,arguments)},setMonth:function(){da.setUTCMonth.apply(this._,arguments)},setSeconds:function(){da.setUTCSeconds.apply(this._,arguments)},setTime:function(){da.setTime.apply(this._,arguments)}};var da=Date.prototype;ga.year=On(function(n){return n=ga.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),ga.years=ga.year.range,ga.years.utc=ga.year.utc.range,ga.day=On(function(n){var t=new va(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),ga.days=ga.day.range,ga.days.utc=ga.day.utc.range,ga.dayOfYear=function(n){var t=ga.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},["sunday","monday","tuesday","wednesday","thursday","friday","saturday"].forEach(function(n,t){t=7-t;var e=ga[n]=On(function(n){return(n=ga.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=ga.year(n).getDay();return Math.floor((ga.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});ga[n+"s"]=e.range,ga[n+"s"].utc=e.utc.range,ga[n+"OfYear"]=function(n){var e=ga.year(n).getDay();return Math.floor((ga.dayOfYear(n)+(e+t)%7)/7)}}),ga.week=ga.sunday,ga.weeks=ga.sunday.range,ga.weeks.utc=ga.sunday.utc.range,ga.weekOfYear=ga.sundayOfYear;var ya={"-":"",_:" ",0:"0"},ma=/^\s*\d+/,Ma=/^%/;ao.locale=function(n){return{numberFormat:jn(n),timeFormat:Yn(n)}};var xa=ao.locale({decimal:".",thousands:",",grouping:[3],currency:["$",""],dateTime:"%a %b %e %X %Y",date:"%m/%d/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"], -shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});ao.format=xa.numberFormat,ao.geo={},ft.prototype={s:0,t:0,add:function(n){st(n,this.t,ba),st(ba.s,this.s,this),this.s?this.t+=ba.t:this.s=ba.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var ba=new ft;ao.geo.stream=function(n,t){n&&_a.hasOwnProperty(n.type)?_a[n.type](n,t):ht(n,t)};var _a={Feature:function(n,t){ht(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,i=e.length;++rn?4*Fo+n:n,Na.lineStart=Na.lineEnd=Na.point=b}};ao.geo.bounds=function(){function n(n,t){M.push(x=[f=n,h=n]),s>t&&(s=t),t>p&&(p=t)}function t(t,e){var r=dt([t*Yo,e*Yo]);if(y){var i=mt(y,r),u=[i[1],-i[0],0],o=mt(u,i);bt(o),o=_t(o);var l=t-g,c=l>0?1:-1,v=o[0]*Zo*c,d=xo(l)>180;if(d^(v>c*g&&c*t>v)){var m=o[1]*Zo;m>p&&(p=m)}else if(v=(v+360)%360-180,d^(v>c*g&&c*t>v)){var m=-o[1]*Zo;s>m&&(s=m)}else s>e&&(s=e),e>p&&(p=e);d?g>t?a(f,t)>a(f,h)&&(h=t):a(t,h)>a(f,h)&&(f=t):h>=f?(f>t&&(f=t),t>h&&(h=t)):t>g?a(f,t)>a(f,h)&&(h=t):a(t,h)>a(f,h)&&(f=t)}else n(t,e);y=r,g=t}function e(){b.point=t}function r(){x[0]=f,x[1]=h,b.point=n,y=null}function i(n,e){if(y){var r=n-g;m+=xo(r)>180?r+(r>0?360:-360):r}else v=n,d=e;Na.point(n,e),t(n,e)}function u(){Na.lineStart()}function o(){i(v,d),Na.lineEnd(),xo(m)>Uo&&(f=-(h=180)),x[0]=f,x[1]=h,y=null}function a(n,t){return(t-=n)<0?t+360:t}function l(n,t){return n[0]-t[0]}function c(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:nka?(f=-(h=180),s=-(p=90)):m>Uo?p=90:-Uo>m&&(s=-90),x[0]=f,x[1]=h}};return function(n){p=h=-(f=s=1/0),M=[],ao.geo.stream(n,b);var t=M.length;if(t){M.sort(l);for(var e,r=1,i=M[0],u=[i];t>r;++r)e=M[r],c(e[0],i)||c(e[1],i)?(a(i[0],e[1])>a(i[0],i[1])&&(i[1]=e[1]),a(e[0],i[1])>a(i[0],i[1])&&(i[0]=e[0])):u.push(i=e);for(var o,e,g=-(1/0),t=u.length-1,r=0,i=u[t];t>=r;i=e,++r)e=u[r],(o=a(i[1],e[0]))>g&&(g=o,f=e[0],h=i[1])}return M=x=null,f===1/0||s===1/0?[[NaN,NaN],[NaN,NaN]]:[[f,s],[h,p]]}}(),ao.geo.centroid=function(n){Ea=Aa=Ca=za=La=qa=Ta=Ra=Da=Pa=Ua=0,ao.geo.stream(n,ja);var t=Da,e=Pa,r=Ua,i=t*t+e*e+r*r;return jo>i&&(t=qa,e=Ta,r=Ra,Uo>Aa&&(t=Ca,e=za,r=La),i=t*t+e*e+r*r,jo>i)?[NaN,NaN]:[Math.atan2(e,t)*Zo,tn(r/Math.sqrt(i))*Zo]};var Ea,Aa,Ca,za,La,qa,Ta,Ra,Da,Pa,Ua,ja={sphere:b,point:St,lineStart:Nt,lineEnd:Et,polygonStart:function(){ja.lineStart=At},polygonEnd:function(){ja.lineStart=Nt}},Fa=Rt(zt,jt,Ht,[-Fo,-Fo/2]),Ha=1e9;ao.geo.clipExtent=function(){var n,t,e,r,i,u,o={stream:function(n){return i&&(i.valid=!1),i=u(n),i.valid=!0,i},extent:function(a){return arguments.length?(u=Zt(n=+a[0][0],t=+a[0][1],e=+a[1][0],r=+a[1][1]),i&&(i.valid=!1,i=null),o):[[n,t],[e,r]]}};return o.extent([[0,0],[960,500]])},(ao.geo.conicEqualArea=function(){return Vt(Xt)}).raw=Xt,ao.geo.albers=function(){return ao.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},ao.geo.albersUsa=function(){function n(n){var u=n[0],o=n[1];return t=null,e(u,o),t||(r(u,o),t)||i(u,o),t}var t,e,r,i,u=ao.geo.albers(),o=ao.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),a=ao.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),l={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=u.scale(),e=u.translate(),r=(n[0]-e[0])/t,i=(n[1]-e[1])/t;return(i>=.12&&.234>i&&r>=-.425&&-.214>r?o:i>=.166&&.234>i&&r>=-.214&&-.115>r?a:u).invert(n)},n.stream=function(n){var t=u.stream(n),e=o.stream(n),r=a.stream(n);return{point:function(n,i){t.point(n,i),e.point(n,i),r.point(n,i)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(u.precision(t),o.precision(t),a.precision(t),n):u.precision()},n.scale=function(t){return arguments.length?(u.scale(t),o.scale(.35*t),a.scale(t),n.translate(u.translate())):u.scale()},n.translate=function(t){if(!arguments.length)return u.translate();var c=u.scale(),f=+t[0],s=+t[1];return e=u.translate(t).clipExtent([[f-.455*c,s-.238*c],[f+.455*c,s+.238*c]]).stream(l).point,r=o.translate([f-.307*c,s+.201*c]).clipExtent([[f-.425*c+Uo,s+.12*c+Uo],[f-.214*c-Uo,s+.234*c-Uo]]).stream(l).point,i=a.translate([f-.205*c,s+.212*c]).clipExtent([[f-.214*c+Uo,s+.166*c+Uo],[f-.115*c-Uo,s+.234*c-Uo]]).stream(l).point,n},n.scale(1070)};var Oa,Ia,Ya,Za,Va,Xa,$a={point:b,lineStart:b,lineEnd:b,polygonStart:function(){Ia=0,$a.lineStart=$t},polygonEnd:function(){$a.lineStart=$a.lineEnd=$a.point=b,Oa+=xo(Ia/2)}},Ba={point:Bt,lineStart:b,lineEnd:b,polygonStart:b,polygonEnd:b},Wa={point:Gt,lineStart:Kt,lineEnd:Qt,polygonStart:function(){Wa.lineStart=ne},polygonEnd:function(){Wa.point=Gt,Wa.lineStart=Kt,Wa.lineEnd=Qt}};ao.geo.path=function(){function n(n){return n&&("function"==typeof a&&u.pointRadius(+a.apply(this,arguments)),o&&o.valid||(o=i(u)),ao.geo.stream(n,o)),u.result()}function t(){return o=null,n}var e,r,i,u,o,a=4.5;return n.area=function(n){return Oa=0,ao.geo.stream(n,i($a)),Oa},n.centroid=function(n){return Ca=za=La=qa=Ta=Ra=Da=Pa=Ua=0,ao.geo.stream(n,i(Wa)),Ua?[Da/Ua,Pa/Ua]:Ra?[qa/Ra,Ta/Ra]:La?[Ca/La,za/La]:[NaN,NaN]},n.bounds=function(n){return Va=Xa=-(Ya=Za=1/0),ao.geo.stream(n,i(Ba)),[[Ya,Za],[Va,Xa]]},n.projection=function(n){return arguments.length?(i=(e=n)?n.stream||re(n):m,t()):e},n.context=function(n){return arguments.length?(u=null==(r=n)?new Wt:new te(n),"function"!=typeof a&&u.pointRadius(a),t()):r},n.pointRadius=function(t){return arguments.length?(a="function"==typeof t?t:(u.pointRadius(+t),+t),n):a},n.projection(ao.geo.albersUsa()).context(null)},ao.geo.transform=function(n){return{stream:function(t){var e=new ie(t);for(var r in n)e[r]=n[r];return e}}},ie.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},ao.geo.projection=oe,ao.geo.projectionMutator=ae,(ao.geo.equirectangular=function(){return oe(ce)}).raw=ce.invert=ce,ao.geo.rotation=function(n){function t(t){return t=n(t[0]*Yo,t[1]*Yo),t[0]*=Zo,t[1]*=Zo,t}return n=se(n[0]%360*Yo,n[1]*Yo,n.length>2?n[2]*Yo:0),t.invert=function(t){return t=n.invert(t[0]*Yo,t[1]*Yo),t[0]*=Zo,t[1]*=Zo,t},t},fe.invert=ce,ao.geo.circle=function(){function n(){var n="function"==typeof r?r.apply(this,arguments):r,t=se(-n[0]*Yo,-n[1]*Yo,0).invert,i=[];return e(null,null,1,{point:function(n,e){i.push(n=t(n,e)),n[0]*=Zo,n[1]*=Zo}}),{type:"Polygon",coordinates:[i]}}var t,e,r=[0,0],i=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=ve((t=+r)*Yo,i*Yo),n):t},n.precision=function(r){return arguments.length?(e=ve(t*Yo,(i=+r)*Yo),n):i},n.angle(90)},ao.geo.distance=function(n,t){var e,r=(t[0]-n[0])*Yo,i=n[1]*Yo,u=t[1]*Yo,o=Math.sin(r),a=Math.cos(r),l=Math.sin(i),c=Math.cos(i),f=Math.sin(u),s=Math.cos(u);return Math.atan2(Math.sqrt((e=s*o)*e+(e=c*f-l*s*a)*e),l*f+c*s*a)},ao.geo.graticule=function(){function n(){return{type:"MultiLineString",coordinates:t()}}function t(){return ao.range(Math.ceil(u/d)*d,i,d).map(h).concat(ao.range(Math.ceil(c/y)*y,l,y).map(p)).concat(ao.range(Math.ceil(r/g)*g,e,g).filter(function(n){return xo(n%d)>Uo}).map(f)).concat(ao.range(Math.ceil(a/v)*v,o,v).filter(function(n){return xo(n%y)>Uo}).map(s))}var e,r,i,u,o,a,l,c,f,s,h,p,g=10,v=g,d=90,y=360,m=2.5;return n.lines=function(){return t().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(u).concat(p(l).slice(1),h(i).reverse().slice(1),p(c).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(u=+t[0][0],i=+t[1][0],c=+t[0][1],l=+t[1][1],u>i&&(t=u,u=i,i=t),c>l&&(t=c,c=l,l=t),n.precision(m)):[[u,c],[i,l]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],a=+t[0][1],o=+t[1][1],r>e&&(t=r,r=e,e=t),a>o&&(t=a,a=o,o=t),n.precision(m)):[[r,a],[e,o]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(d=+t[0],y=+t[1],n):[d,y]},n.minorStep=function(t){return arguments.length?(g=+t[0],v=+t[1],n):[g,v]},n.precision=function(t){return arguments.length?(m=+t,f=ye(a,o,90),s=me(r,e,m),h=ye(c,l,90),p=me(u,i,m),n):m},n.majorExtent([[-180,-90+Uo],[180,90-Uo]]).minorExtent([[-180,-80-Uo],[180,80+Uo]])},ao.geo.greatArc=function(){function n(){return{type:"LineString",coordinates:[t||r.apply(this,arguments),e||i.apply(this,arguments)]}}var t,e,r=Me,i=xe;return n.distance=function(){return ao.geo.distance(t||r.apply(this,arguments),e||i.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t="function"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(i=t,e="function"==typeof t?null:t,n):i},n.precision=function(){return arguments.length?n:0},n},ao.geo.interpolate=function(n,t){return be(n[0]*Yo,n[1]*Yo,t[0]*Yo,t[1]*Yo)},ao.geo.length=function(n){return Ja=0,ao.geo.stream(n,Ga),Ja};var Ja,Ga={sphere:b,point:b,lineStart:_e,lineEnd:b,polygonStart:b,polygonEnd:b},Ka=we(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(ao.geo.azimuthalEqualArea=function(){return oe(Ka)}).raw=Ka;var Qa=we(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},m);(ao.geo.azimuthalEquidistant=function(){return oe(Qa)}).raw=Qa,(ao.geo.conicConformal=function(){return Vt(Se)}).raw=Se,(ao.geo.conicEquidistant=function(){return Vt(ke)}).raw=ke;var nl=we(function(n){return 1/n},Math.atan);(ao.geo.gnomonic=function(){return oe(nl)}).raw=nl,Ne.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Io]},(ao.geo.mercator=function(){return Ee(Ne)}).raw=Ne;var tl=we(function(){return 1},Math.asin);(ao.geo.orthographic=function(){return oe(tl)}).raw=tl;var el=we(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(ao.geo.stereographic=function(){return oe(el)}).raw=el,Ae.invert=function(n,t){return[-t,2*Math.atan(Math.exp(n))-Io]},(ao.geo.transverseMercator=function(){var n=Ee(Ae),t=n.center,e=n.rotate;return n.center=function(n){return n?t([-n[1],n[0]]):(n=t(),[n[1],-n[0]])},n.rotate=function(n){return n?e([n[0],n[1],n.length>2?n[2]+90:90]):(n=e(),[n[0],n[1],n[2]-90])},e([0,0,90])}).raw=Ae,ao.geom={},ao.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,i=En(e),u=En(r),o=n.length,a=[],l=[];for(t=0;o>t;t++)a.push([+i.call(this,n[t],t),+u.call(this,n[t],t),t]);for(a.sort(qe),t=0;o>t;t++)l.push([a[t][0],-a[t][1]]);var c=Le(a),f=Le(l),s=f[0]===c[0],h=f[f.length-1]===c[c.length-1],p=[];for(t=c.length-1;t>=0;--t)p.push(n[a[c[t]][2]]);for(t=+s;t=r&&c.x<=u&&c.y>=i&&c.y<=o?[[r,o],[u,o],[u,i],[r,i]]:[];f.point=n[a]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(u(n,t)/Uo)*Uo,y:Math.round(o(n,t)/Uo)*Uo,i:t}})}var r=Ce,i=ze,u=r,o=i,a=sl;return n?t(n):(t.links=function(n){return ar(e(n)).edges.filter(function(n){return n.l&&n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return ar(e(n)).cells.forEach(function(e,r){for(var i,u,o=e.site,a=e.edges.sort(Ve),l=-1,c=a.length,f=a[c-1].edge,s=f.l===o?f.r:f.l;++l=c,h=r>=f,p=h<<1|s;n.leaf=!1,n=n.nodes[p]||(n.nodes[p]=hr()),s?i=c:a=c,h?o=f:l=f,u(n,t,e,r,i,o,a,l)}var f,s,h,p,g,v,d,y,m,M=En(a),x=En(l);if(null!=t)v=t,d=e,y=r,m=i;else if(y=m=-(v=d=1/0),s=[],h=[],g=n.length,o)for(p=0;g>p;++p)f=n[p],f.xy&&(y=f.x),f.y>m&&(m=f.y),s.push(f.x),h.push(f.y);else for(p=0;g>p;++p){var b=+M(f=n[p],p),_=+x(f,p);v>b&&(v=b),d>_&&(d=_),b>y&&(y=b),_>m&&(m=_),s.push(b),h.push(_)}var w=y-v,S=m-d;w>S?m=d+w:y=v+S;var k=hr();if(k.add=function(n){u(k,n,+M(n,++p),+x(n,p),v,d,y,m)},k.visit=function(n){pr(n,k,v,d,y,m)},k.find=function(n){return gr(k,n[0],n[1],v,d,y,m)},p=-1,null==t){for(;++p=0?n.slice(0,t):n,r=t>=0?n.slice(t+1):"in";return e=vl.get(e)||gl,r=dl.get(r)||m,br(r(e.apply(null,lo.call(arguments,1))))},ao.interpolateHcl=Rr,ao.interpolateHsl=Dr,ao.interpolateLab=Pr,ao.interpolateRound=Ur,ao.transform=function(n){var t=fo.createElementNS(ao.ns.prefix.svg,"g");return(ao.transform=function(n){if(null!=n){t.setAttribute("transform",n);var e=t.transform.baseVal.consolidate()}return new jr(e?e.matrix:yl)})(n)},jr.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var yl={a:1,b:0,c:0,d:1,e:0,f:0};ao.interpolateTransform=$r,ao.layout={},ao.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++ea*a/y){if(v>l){var c=t.charge/l;n.px-=u*c,n.py-=o*c}return!0}if(t.point&&l&&v>l){var c=t.pointCharge/l;n.px-=u*c,n.py-=o*c}}return!t.charge}}function t(n){n.px=ao.event.x,n.py=ao.event.y,l.resume()}var e,r,i,u,o,a,l={},c=ao.dispatch("start","tick","end"),f=[1,1],s=.9,h=ml,p=Ml,g=-30,v=xl,d=.1,y=.64,M=[],x=[];return l.tick=function(){if((i*=.99)<.005)return e=null,c.end({type:"end",alpha:i=0}),!0;var t,r,l,h,p,v,y,m,b,_=M.length,w=x.length;for(r=0;w>r;++r)l=x[r],h=l.source,p=l.target,m=p.x-h.x,b=p.y-h.y,(v=m*m+b*b)&&(v=i*o[r]*((v=Math.sqrt(v))-u[r])/v,m*=v,b*=v,p.x-=m*(y=h.weight+p.weight?h.weight/(h.weight+p.weight):.5),p.y-=b*y,h.x+=m*(y=1-y),h.y+=b*y);if((y=i*d)&&(m=f[0]/2,b=f[1]/2,r=-1,y))for(;++r<_;)l=M[r],l.x+=(m-l.x)*y,l.y+=(b-l.y)*y;if(g)for(ri(t=ao.geom.quadtree(M),i,a),r=-1;++r<_;)(l=M[r]).fixed||t.visit(n(l));for(r=-1;++r<_;)l=M[r],l.fixed?(l.x=l.px,l.y=l.py):(l.x-=(l.px-(l.px=l.x))*s,l.y-=(l.py-(l.py=l.y))*s);c.tick({type:"tick",alpha:i})},l.nodes=function(n){return arguments.length?(M=n,l):M},l.links=function(n){return arguments.length?(x=n,l):x},l.size=function(n){return arguments.length?(f=n,l):f},l.linkDistance=function(n){return arguments.length?(h="function"==typeof n?n:+n,l):h},l.distance=l.linkDistance,l.linkStrength=function(n){return arguments.length?(p="function"==typeof n?n:+n,l):p},l.friction=function(n){return arguments.length?(s=+n,l):s},l.charge=function(n){return arguments.length?(g="function"==typeof n?n:+n,l):g},l.chargeDistance=function(n){return arguments.length?(v=n*n,l):Math.sqrt(v)},l.gravity=function(n){return arguments.length?(d=+n,l):d},l.theta=function(n){return arguments.length?(y=n*n,l):Math.sqrt(y)},l.alpha=function(n){return arguments.length?(n=+n,i?n>0?i=n:(e.c=null,e.t=NaN,e=null,c.end({type:"end",alpha:i=0})):n>0&&(c.start({type:"start",alpha:i=n}),e=qn(l.tick)),l):i},l.start=function(){function n(n,r){if(!e){for(e=new Array(i),l=0;i>l;++l)e[l]=[];for(l=0;c>l;++l){var u=x[l];e[u.source.index].push(u.target),e[u.target.index].push(u.source)}}for(var o,a=e[t],l=-1,f=a.length;++lt;++t)(r=M[t]).index=t,r.weight=0;for(t=0;c>t;++t)r=x[t],"number"==typeof r.source&&(r.source=M[r.source]),"number"==typeof r.target&&(r.target=M[r.target]),++r.source.weight,++r.target.weight;for(t=0;i>t;++t)r=M[t],isNaN(r.x)&&(r.x=n("x",s)),isNaN(r.y)&&(r.y=n("y",v)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(u=[],"function"==typeof h)for(t=0;c>t;++t)u[t]=+h.call(this,x[t],t);else for(t=0;c>t;++t)u[t]=h;if(o=[],"function"==typeof p)for(t=0;c>t;++t)o[t]=+p.call(this,x[t],t);else for(t=0;c>t;++t)o[t]=p;if(a=[],"function"==typeof g)for(t=0;i>t;++t)a[t]=+g.call(this,M[t],t);else for(t=0;i>t;++t)a[t]=g;return l.resume()},l.resume=function(){return l.alpha(.1)},l.stop=function(){return l.alpha(0)},l.drag=function(){return r||(r=ao.behavior.drag().origin(m).on("dragstart.force",Qr).on("drag.force",t).on("dragend.force",ni)),arguments.length?void this.on("mouseover.force",ti).on("mouseout.force",ei).call(r):r},ao.rebind(l,c,"on")};var ml=20,Ml=1,xl=1/0;ao.layout.hierarchy=function(){function n(i){var u,o=[i],a=[];for(i.depth=0;null!=(u=o.pop());)if(a.push(u),(c=e.call(n,u,u.depth))&&(l=c.length)){for(var l,c,f;--l>=0;)o.push(f=c[l]),f.parent=u,f.depth=u.depth+1;r&&(u.value=0),u.children=c}else r&&(u.value=+r.call(n,u,u.depth)||0),delete u.children;return oi(i,function(n){var e,i;t&&(e=n.children)&&e.sort(t),r&&(i=n.parent)&&(i.value+=n.value)}),a}var t=ci,e=ai,r=li;return n.sort=function(e){return arguments.length?(t=e,n):t},n.children=function(t){return arguments.length?(e=t,n):e},n.value=function(t){return arguments.length?(r=t,n):r},n.revalue=function(t){return r&&(ui(t,function(n){n.children&&(n.value=0)}),oi(t,function(t){var e;t.children||(t.value=+r.call(n,t,t.depth)||0),(e=t.parent)&&(e.value+=t.value)})),t},n},ao.layout.partition=function(){function n(t,e,r,i){var u=t.children;if(t.x=e,t.y=t.depth*i,t.dx=r,t.dy=i,u&&(o=u.length)){var o,a,l,c=-1;for(r=t.value?r/t.value:0;++cs?-1:1),g=ao.sum(c),v=g?(s-l*p)/g:0,d=ao.range(l),y=[];return null!=e&&d.sort(e===bl?function(n,t){return c[t]-c[n]}:function(n,t){return e(o[n],o[t])}),d.forEach(function(n){y[n]={data:o[n],value:a=c[n],startAngle:f,endAngle:f+=a*v+p,padAngle:h}}),y}var t=Number,e=bl,r=0,i=Ho,u=0;return n.value=function(e){return arguments.length?(t=e,n):t},n.sort=function(t){return arguments.length?(e=t,n):e},n.startAngle=function(t){return arguments.length?(r=t,n):r},n.endAngle=function(t){return arguments.length?(i=t,n):i},n.padAngle=function(t){return arguments.length?(u=t,n):u},n};var bl={};ao.layout.stack=function(){function n(a,l){if(!(h=a.length))return a;var c=a.map(function(e,r){return t.call(n,e,r)}),f=c.map(function(t){return t.map(function(t,e){return[u.call(n,t,e),o.call(n,t,e)]})}),s=e.call(n,f,l);c=ao.permute(c,s),f=ao.permute(f,s);var h,p,g,v,d=r.call(n,f,l),y=c[0].length;for(g=0;y>g;++g)for(i.call(n,c[0][g],v=d[g],f[0][g][1]),p=1;h>p;++p)i.call(n,c[p][g],v+=f[p-1][g][1],f[p][g][1]);return a}var t=m,e=gi,r=vi,i=pi,u=si,o=hi;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e="function"==typeof t?t:_l.get(t)||gi,n):e},n.offset=function(t){return arguments.length?(r="function"==typeof t?t:wl.get(t)||vi,n):r},n.x=function(t){return arguments.length?(u=t,n):u},n.y=function(t){return arguments.length?(o=t,n):o},n.out=function(t){return arguments.length?(i=t,n):i},n};var _l=ao.map({"inside-out":function(n){var t,e,r=n.length,i=n.map(di),u=n.map(yi),o=ao.range(r).sort(function(n,t){return i[n]-i[t]}),a=0,l=0,c=[],f=[];for(t=0;r>t;++t)e=o[t],l>a?(a+=u[e],c.push(e)):(l+=u[e],f.push(e));return f.reverse().concat(c)},reverse:function(n){return ao.range(n.length).reverse()},"default":gi}),wl=ao.map({silhouette:function(n){var t,e,r,i=n.length,u=n[0].length,o=[],a=0,l=[];for(e=0;u>e;++e){for(t=0,r=0;i>t;t++)r+=n[t][e][1];r>a&&(a=r),o.push(r)}for(e=0;u>e;++e)l[e]=(a-o[e])/2;return l},wiggle:function(n){var t,e,r,i,u,o,a,l,c,f=n.length,s=n[0],h=s.length,p=[];for(p[0]=l=c=0,e=1;h>e;++e){for(t=0,i=0;f>t;++t)i+=n[t][e][1];for(t=0,u=0,a=s[e][0]-s[e-1][0];f>t;++t){for(r=0,o=(n[t][e][1]-n[t][e-1][1])/(2*a);t>r;++r)o+=(n[r][e][1]-n[r][e-1][1])/a;u+=o*n[t][e][1]}p[e]=l-=i?u/i*a:0,c>l&&(c=l)}for(e=0;h>e;++e)p[e]-=c;return p},expand:function(n){var t,e,r,i=n.length,u=n[0].length,o=1/i,a=[];for(e=0;u>e;++e){for(t=0,r=0;i>t;t++)r+=n[t][e][1];if(r)for(t=0;i>t;t++)n[t][e][1]/=r;else for(t=0;i>t;t++)n[t][e][1]=o}for(e=0;u>e;++e)a[e]=0;return a},zero:vi});ao.layout.histogram=function(){function n(n,u){for(var o,a,l=[],c=n.map(e,this),f=r.call(this,c,u),s=i.call(this,f,c,u),u=-1,h=c.length,p=s.length-1,g=t?1:1/h;++u0)for(u=-1;++u=f[0]&&a<=f[1]&&(o=l[ao.bisect(s,a,1,p)-1],o.y+=g,o.push(n[u]));return l}var t=!0,e=Number,r=bi,i=Mi;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=En(t),n):r},n.bins=function(t){return arguments.length?(i="number"==typeof t?function(n){return xi(n,t)}:En(t),n):i},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},ao.layout.pack=function(){function n(n,u){var o=e.call(this,n,u),a=o[0],l=i[0],c=i[1],f=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(a.x=a.y=0,oi(a,function(n){n.r=+f(n.value)}),oi(a,Ni),r){var s=r*(t?1:Math.max(2*a.r/l,2*a.r/c))/2;oi(a,function(n){n.r+=s}),oi(a,Ni),oi(a,function(n){n.r-=s})}return Ci(a,l/2,c/2,t?1:1/Math.max(2*a.r/l,2*a.r/c)),o}var t,e=ao.layout.hierarchy().sort(_i),r=0,i=[1,1];return n.size=function(t){return arguments.length?(i=t,n):i},n.radius=function(e){return arguments.length?(t=null==e||"function"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},ii(n,e)},ao.layout.tree=function(){function n(n,i){var f=o.call(this,n,i),s=f[0],h=t(s);if(oi(h,e),h.parent.m=-h.z,ui(h,r),c)ui(s,u);else{var p=s,g=s,v=s;ui(s,function(n){n.xg.x&&(g=n),n.depth>v.depth&&(v=n)});var d=a(p,g)/2-p.x,y=l[0]/(g.x+a(g,p)/2+d),m=l[1]/(v.depth||1);ui(s,function(n){n.x=(n.x+d)*y,n.y=n.depth*m})}return f}function t(n){for(var t,e={A:null,children:[n]},r=[e];null!=(t=r.pop());)for(var i,u=t.children,o=0,a=u.length;a>o;++o)r.push((u[o]=i={_:u[o],parent:t,children:(i=u[o].children)&&i.slice()||[],A:null,a:null,z:0,m:0,c:0,s:0,t:null,i:o}).a=i);return e.children[0]}function e(n){var t=n.children,e=n.parent.children,r=n.i?e[n.i-1]:null;if(t.length){Di(n);var u=(t[0].z+t[t.length-1].z)/2;r?(n.z=r.z+a(n._,r._),n.m=n.z-u):n.z=u}else r&&(n.z=r.z+a(n._,r._));n.parent.A=i(n,r,n.parent.A||e[0])}function r(n){n._.x=n.z+n.parent.m,n.m+=n.parent.m}function i(n,t,e){if(t){for(var r,i=n,u=n,o=t,l=i.parent.children[0],c=i.m,f=u.m,s=o.m,h=l.m;o=Ti(o),i=qi(i),o&&i;)l=qi(l),u=Ti(u),u.a=n,r=o.z+s-i.z-c+a(o._,i._),r>0&&(Ri(Pi(o,n,e),n,r),c+=r,f+=r),s+=o.m,c+=i.m,h+=l.m,f+=u.m;o&&!Ti(u)&&(u.t=o,u.m+=s-f),i&&!qi(l)&&(l.t=i,l.m+=c-h,e=n)}return e}function u(n){n.x*=l[0],n.y=n.depth*l[1]}var o=ao.layout.hierarchy().sort(null).value(null),a=Li,l=[1,1],c=null;return n.separation=function(t){return arguments.length?(a=t,n):a},n.size=function(t){return arguments.length?(c=null==(l=t)?u:null,n):c?null:l},n.nodeSize=function(t){return arguments.length?(c=null==(l=t)?null:u,n):c?l:null},ii(n,o)},ao.layout.cluster=function(){function n(n,u){var o,a=t.call(this,n,u),l=a[0],c=0;oi(l,function(n){var t=n.children;t&&t.length?(n.x=ji(t),n.y=Ui(t)):(n.x=o?c+=e(n,o):0,n.y=0,o=n)});var f=Fi(l),s=Hi(l),h=f.x-e(f,s)/2,p=s.x+e(s,f)/2;return oi(l,i?function(n){n.x=(n.x-l.x)*r[0],n.y=(l.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(p-h)*r[0],n.y=(1-(l.y?n.y/l.y:1))*r[1]}),a}var t=ao.layout.hierarchy().sort(null).value(null),e=Li,r=[1,1],i=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(i=null==(r=t),n):i?null:r},n.nodeSize=function(t){return arguments.length?(i=null!=(r=t),n):i?r:null},ii(n,t)},ao.layout.treemap=function(){function n(n,t){for(var e,r,i=-1,u=n.length;++it?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var u=e.children;if(u&&u.length){var o,a,l,c=s(e),f=[],h=u.slice(),g=1/0,v="slice"===p?c.dx:"dice"===p?c.dy:"slice-dice"===p?1&e.depth?c.dy:c.dx:Math.min(c.dx,c.dy);for(n(h,c.dx*c.dy/e.value),f.area=0;(l=h.length)>0;)f.push(o=h[l-1]),f.area+=o.area,"squarify"!==p||(a=r(f,v))<=g?(h.pop(),g=a):(f.area-=f.pop().area,i(f,v,c,!1),v=Math.min(c.dx,c.dy),f.length=f.area=0,g=1/0);f.length&&(i(f,v,c,!0),f.length=f.area=0),u.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var u,o=s(t),a=r.slice(),l=[];for(n(a,o.dx*o.dy/t.value),l.area=0;u=a.pop();)l.push(u),l.area+=u.area,null!=u.z&&(i(l,u.z?o.dx:o.dy,o,!a.length),l.length=l.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,i=0,u=1/0,o=-1,a=n.length;++oe&&(u=e),e>i&&(i=e));return r*=r,t*=t,r?Math.max(t*i*g/r,r/(t*u*g)):1/0}function i(n,t,e,r){var i,u=-1,o=n.length,a=e.x,c=e.y,f=t?l(n.area/t):0; -if(t==e.dx){for((r||f>e.dy)&&(f=e.dy);++ue.dx)&&(f=e.dx);++ue&&(t=1),1>e&&(n=0),function(){var e,r,i;do e=2*Math.random()-1,r=2*Math.random()-1,i=e*e+r*r;while(!i||i>1);return n+t*e*Math.sqrt(-2*Math.log(i)/i)}},logNormal:function(){var n=ao.random.normal.apply(ao,arguments);return function(){return Math.exp(n())}},bates:function(n){var t=ao.random.irwinHall(n);return function(){return t()/n}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t}}},ao.scale={};var Sl={floor:m,ceil:m};ao.scale.linear=function(){return Wi([0,1],[0,1],Mr,!1)};var kl={s:1,g:1,p:1,r:1,e:1};ao.scale.log=function(){return ru(ao.scale.linear().domain([0,1]),10,!0,[1,10])};var Nl=ao.format(".0e"),El={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};ao.scale.pow=function(){return iu(ao.scale.linear(),1,[0,1])},ao.scale.sqrt=function(){return ao.scale.pow().exponent(.5)},ao.scale.ordinal=function(){return ou([],{t:"range",a:[[]]})},ao.scale.category10=function(){return ao.scale.ordinal().range(Al)},ao.scale.category20=function(){return ao.scale.ordinal().range(Cl)},ao.scale.category20b=function(){return ao.scale.ordinal().range(zl)},ao.scale.category20c=function(){return ao.scale.ordinal().range(Ll)};var Al=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(xn),Cl=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(xn),zl=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(xn),Ll=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(xn);ao.scale.quantile=function(){return au([],[])},ao.scale.quantize=function(){return lu(0,1,[0,1])},ao.scale.threshold=function(){return cu([.5],[0,1])},ao.scale.identity=function(){return fu([0,1])},ao.svg={},ao.svg.arc=function(){function n(){var n=Math.max(0,+e.apply(this,arguments)),c=Math.max(0,+r.apply(this,arguments)),f=o.apply(this,arguments)-Io,s=a.apply(this,arguments)-Io,h=Math.abs(s-f),p=f>s?0:1;if(n>c&&(g=c,c=n,n=g),h>=Oo)return t(c,p)+(n?t(n,1-p):"")+"Z";var g,v,d,y,m,M,x,b,_,w,S,k,N=0,E=0,A=[];if((y=(+l.apply(this,arguments)||0)/2)&&(d=u===ql?Math.sqrt(n*n+c*c):+u.apply(this,arguments),p||(E*=-1),c&&(E=tn(d/c*Math.sin(y))),n&&(N=tn(d/n*Math.sin(y)))),c){m=c*Math.cos(f+E),M=c*Math.sin(f+E),x=c*Math.cos(s-E),b=c*Math.sin(s-E);var C=Math.abs(s-f-2*E)<=Fo?0:1;if(E&&yu(m,M,x,b)===p^C){var z=(f+s)/2;m=c*Math.cos(z),M=c*Math.sin(z),x=b=null}}else m=M=0;if(n){_=n*Math.cos(s-N),w=n*Math.sin(s-N),S=n*Math.cos(f+N),k=n*Math.sin(f+N);var L=Math.abs(f-s+2*N)<=Fo?0:1;if(N&&yu(_,w,S,k)===1-p^L){var q=(f+s)/2;_=n*Math.cos(q),w=n*Math.sin(q),S=k=null}}else _=w=0;if(h>Uo&&(g=Math.min(Math.abs(c-n)/2,+i.apply(this,arguments)))>.001){v=c>n^p?0:1;var T=g,R=g;if(Fo>h){var D=null==S?[_,w]:null==x?[m,M]:Re([m,M],[S,k],[x,b],[_,w]),P=m-D[0],U=M-D[1],j=x-D[0],F=b-D[1],H=1/Math.sin(Math.acos((P*j+U*F)/(Math.sqrt(P*P+U*U)*Math.sqrt(j*j+F*F)))/2),O=Math.sqrt(D[0]*D[0]+D[1]*D[1]);R=Math.min(g,(n-O)/(H-1)),T=Math.min(g,(c-O)/(H+1))}if(null!=x){var I=mu(null==S?[_,w]:[S,k],[m,M],c,T,p),Y=mu([x,b],[_,w],c,T,p);g===T?A.push("M",I[0],"A",T,",",T," 0 0,",v," ",I[1],"A",c,",",c," 0 ",1-p^yu(I[1][0],I[1][1],Y[1][0],Y[1][1]),",",p," ",Y[1],"A",T,",",T," 0 0,",v," ",Y[0]):A.push("M",I[0],"A",T,",",T," 0 1,",v," ",Y[0])}else A.push("M",m,",",M);if(null!=S){var Z=mu([m,M],[S,k],n,-R,p),V=mu([_,w],null==x?[m,M]:[x,b],n,-R,p);g===R?A.push("L",V[0],"A",R,",",R," 0 0,",v," ",V[1],"A",n,",",n," 0 ",p^yu(V[1][0],V[1][1],Z[1][0],Z[1][1]),",",1-p," ",Z[1],"A",R,",",R," 0 0,",v," ",Z[0]):A.push("L",V[0],"A",R,",",R," 0 0,",v," ",Z[0])}else A.push("L",_,",",w)}else A.push("M",m,",",M),null!=x&&A.push("A",c,",",c," 0 ",C,",",p," ",x,",",b),A.push("L",_,",",w),null!=S&&A.push("A",n,",",n," 0 ",L,",",1-p," ",S,",",k);return A.push("Z"),A.join("")}function t(n,t){return"M0,"+n+"A"+n+","+n+" 0 1,"+t+" 0,"+-n+"A"+n+","+n+" 0 1,"+t+" 0,"+n}var e=hu,r=pu,i=su,u=ql,o=gu,a=vu,l=du;return n.innerRadius=function(t){return arguments.length?(e=En(t),n):e},n.outerRadius=function(t){return arguments.length?(r=En(t),n):r},n.cornerRadius=function(t){return arguments.length?(i=En(t),n):i},n.padRadius=function(t){return arguments.length?(u=t==ql?ql:En(t),n):u},n.startAngle=function(t){return arguments.length?(o=En(t),n):o},n.endAngle=function(t){return arguments.length?(a=En(t),n):a},n.padAngle=function(t){return arguments.length?(l=En(t),n):l},n.centroid=function(){var n=(+e.apply(this,arguments)+ +r.apply(this,arguments))/2,t=(+o.apply(this,arguments)+ +a.apply(this,arguments))/2-Io;return[Math.cos(t)*n,Math.sin(t)*n]},n};var ql="auto";ao.svg.line=function(){return Mu(m)};var Tl=ao.map({linear:xu,"linear-closed":bu,step:_u,"step-before":wu,"step-after":Su,basis:zu,"basis-open":Lu,"basis-closed":qu,bundle:Tu,cardinal:Eu,"cardinal-open":ku,"cardinal-closed":Nu,monotone:Fu});Tl.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var Rl=[0,2/3,1/3,0],Dl=[0,1/3,2/3,0],Pl=[0,1/6,2/3,1/6];ao.svg.line.radial=function(){var n=Mu(Hu);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},wu.reverse=Su,Su.reverse=wu,ao.svg.area=function(){return Ou(m)},ao.svg.area.radial=function(){var n=Ou(Hu);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},ao.svg.chord=function(){function n(n,a){var l=t(this,u,n,a),c=t(this,o,n,a);return"M"+l.p0+r(l.r,l.p1,l.a1-l.a0)+(e(l,c)?i(l.r,l.p1,l.r,l.p0):i(l.r,l.p1,c.r,c.p0)+r(c.r,c.p1,c.a1-c.a0)+i(c.r,c.p1,l.r,l.p0))+"Z"}function t(n,t,e,r){var i=t.call(n,e,r),u=a.call(n,i,r),o=l.call(n,i,r)-Io,f=c.call(n,i,r)-Io;return{r:u,a0:o,a1:f,p0:[u*Math.cos(o),u*Math.sin(o)],p1:[u*Math.cos(f),u*Math.sin(f)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return"A"+n+","+n+" 0 "+ +(e>Fo)+",1 "+t}function i(n,t,e,r){return"Q 0,0 "+r}var u=Me,o=xe,a=Iu,l=gu,c=vu;return n.radius=function(t){return arguments.length?(a=En(t),n):a},n.source=function(t){return arguments.length?(u=En(t),n):u},n.target=function(t){return arguments.length?(o=En(t),n):o},n.startAngle=function(t){return arguments.length?(l=En(t),n):l},n.endAngle=function(t){return arguments.length?(c=En(t),n):c},n},ao.svg.diagonal=function(){function n(n,i){var u=t.call(this,n,i),o=e.call(this,n,i),a=(u.y+o.y)/2,l=[u,{x:u.x,y:a},{x:o.x,y:a},o];return l=l.map(r),"M"+l[0]+"C"+l[1]+" "+l[2]+" "+l[3]}var t=Me,e=xe,r=Yu;return n.source=function(e){return arguments.length?(t=En(e),n):t},n.target=function(t){return arguments.length?(e=En(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},ao.svg.diagonal.radial=function(){var n=ao.svg.diagonal(),t=Yu,e=n.projection;return n.projection=function(n){return arguments.length?e(Zu(t=n)):t},n},ao.svg.symbol=function(){function n(n,r){return(Ul.get(t.call(this,n,r))||$u)(e.call(this,n,r))}var t=Xu,e=Vu;return n.type=function(e){return arguments.length?(t=En(e),n):t},n.size=function(t){return arguments.length?(e=En(t),n):e},n};var Ul=ao.map({circle:$u,cross:function(n){var t=Math.sqrt(n/5)/2;return"M"+-3*t+","+-t+"H"+-t+"V"+-3*t+"H"+t+"V"+-t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+-t+"V"+t+"H"+-3*t+"Z"},diamond:function(n){var t=Math.sqrt(n/(2*Fl)),e=t*Fl;return"M0,"+-t+"L"+e+",0 0,"+t+" "+-e+",0Z"},square:function(n){var t=Math.sqrt(n)/2;return"M"+-t+","+-t+"L"+t+","+-t+" "+t+","+t+" "+-t+","+t+"Z"},"triangle-down":function(n){var t=Math.sqrt(n/jl),e=t*jl/2;return"M0,"+e+"L"+t+","+-e+" "+-t+","+-e+"Z"},"triangle-up":function(n){var t=Math.sqrt(n/jl),e=t*jl/2;return"M0,"+-e+"L"+t+","+e+" "+-t+","+e+"Z"}});ao.svg.symbolTypes=Ul.keys();var jl=Math.sqrt(3),Fl=Math.tan(30*Yo);Co.transition=function(n){for(var t,e,r=Hl||++Zl,i=Ku(n),u=[],o=Ol||{time:Date.now(),ease:Nr,delay:0,duration:250},a=-1,l=this.length;++au;u++){i.push(t=[]);for(var e=this[u],a=0,l=e.length;l>a;a++)(r=e[a])&&n.call(r,r.__data__,a,u)&&t.push(r)}return Wu(i,this.namespace,this.id)},Yl.tween=function(n,t){var e=this.id,r=this.namespace;return arguments.length<2?this.node()[r][e].tween.get(n):Y(this,null==t?function(t){t[r][e].tween.remove(n)}:function(i){i[r][e].tween.set(n,t)})},Yl.attr=function(n,t){function e(){this.removeAttribute(a)}function r(){this.removeAttributeNS(a.space,a.local)}function i(n){return null==n?e:(n+="",function(){var t,e=this.getAttribute(a);return e!==n&&(t=o(e,n),function(n){this.setAttribute(a,t(n))})})}function u(n){return null==n?r:(n+="",function(){var t,e=this.getAttributeNS(a.space,a.local);return e!==n&&(t=o(e,n),function(n){this.setAttributeNS(a.space,a.local,t(n))})})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var o="transform"==n?$r:Mr,a=ao.ns.qualify(n);return Ju(this,"attr."+n,t,a.local?u:i)},Yl.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(i));return r&&function(n){this.setAttribute(i,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(i.space,i.local));return r&&function(n){this.setAttributeNS(i.space,i.local,r(n))}}var i=ao.ns.qualify(n);return this.tween("attr."+n,i.local?r:e)},Yl.style=function(n,e,r){function i(){this.style.removeProperty(n)}function u(e){return null==e?i:(e+="",function(){var i,u=t(this).getComputedStyle(this,null).getPropertyValue(n);return u!==e&&(i=Mr(u,e),function(t){this.style.setProperty(n,i(t),r)})})}var o=arguments.length;if(3>o){if("string"!=typeof n){2>o&&(e="");for(r in n)this.style(r,n[r],e);return this}r=""}return Ju(this,"style."+n,e,u)},Yl.styleTween=function(n,e,r){function i(i,u){var o=e.call(this,i,u,t(this).getComputedStyle(this,null).getPropertyValue(n));return o&&function(t){this.style.setProperty(n,o(t),r)}}return arguments.length<3&&(r=""),this.tween("style."+n,i)},Yl.text=function(n){return Ju(this,"text",n,Gu)},Yl.remove=function(){var n=this.namespace;return this.each("end.transition",function(){var t;this[n].count<2&&(t=this.parentNode)&&t.removeChild(this)})},Yl.ease=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].ease:("function"!=typeof n&&(n=ao.ease.apply(ao,arguments)),Y(this,function(r){r[e][t].ease=n}))},Yl.delay=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].delay:Y(this,"function"==typeof n?function(r,i,u){r[e][t].delay=+n.call(r,r.__data__,i,u)}:(n=+n,function(r){r[e][t].delay=n}))},Yl.duration=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].duration:Y(this,"function"==typeof n?function(r,i,u){r[e][t].duration=Math.max(1,n.call(r,r.__data__,i,u))}:(n=Math.max(1,n),function(r){r[e][t].duration=n}))},Yl.each=function(n,t){var e=this.id,r=this.namespace;if(arguments.length<2){var i=Ol,u=Hl;try{Hl=e,Y(this,function(t,i,u){Ol=t[r][e],n.call(t,t.__data__,i,u)})}finally{Ol=i,Hl=u}}else Y(this,function(i){var u=i[r][e];(u.event||(u.event=ao.dispatch("start","end","interrupt"))).on(n,t)});return this},Yl.transition=function(){for(var n,t,e,r,i=this.id,u=++Zl,o=this.namespace,a=[],l=0,c=this.length;c>l;l++){a.push(n=[]);for(var t=this[l],f=0,s=t.length;s>f;f++)(e=t[f])&&(r=e[o][i],Qu(e,f,o,u,{time:r.time,ease:r.ease,delay:r.delay+r.duration,duration:r.duration})),n.push(e)}return Wu(a,o,u)},ao.svg.axis=function(){function n(n){n.each(function(){var n,c=ao.select(this),f=this.__chart__||e,s=this.__chart__=e.copy(),h=null==l?s.ticks?s.ticks.apply(s,a):s.domain():l,p=null==t?s.tickFormat?s.tickFormat.apply(s,a):m:t,g=c.selectAll(".tick").data(h,s),v=g.enter().insert("g",".domain").attr("class","tick").style("opacity",Uo),d=ao.transition(g.exit()).style("opacity",Uo).remove(),y=ao.transition(g.order()).style("opacity",1),M=Math.max(i,0)+o,x=Zi(s),b=c.selectAll(".domain").data([0]),_=(b.enter().append("path").attr("class","domain"),ao.transition(b));v.append("line"),v.append("text");var w,S,k,N,E=v.select("line"),A=y.select("line"),C=g.select("text").text(p),z=v.select("text"),L=y.select("text"),q="top"===r||"left"===r?-1:1;if("bottom"===r||"top"===r?(n=no,w="x",k="y",S="x2",N="y2",C.attr("dy",0>q?"0em":".71em").style("text-anchor","middle"),_.attr("d","M"+x[0]+","+q*u+"V0H"+x[1]+"V"+q*u)):(n=to,w="y",k="x",S="y2",N="x2",C.attr("dy",".32em").style("text-anchor",0>q?"end":"start"),_.attr("d","M"+q*u+","+x[0]+"H0V"+x[1]+"H"+q*u)),E.attr(N,q*i),z.attr(k,q*M),A.attr(S,0).attr(N,q*i),L.attr(w,0).attr(k,q*M),s.rangeBand){var T=s,R=T.rangeBand()/2;f=s=function(n){return T(n)+R}}else f.rangeBand?f=s:d.call(n,s,f);v.call(n,f,s),y.call(n,s,s)})}var t,e=ao.scale.linear(),r=Vl,i=6,u=6,o=3,a=[10],l=null;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in Xl?t+"":Vl,n):r},n.ticks=function(){return arguments.length?(a=co(arguments),n):a},n.tickValues=function(t){return arguments.length?(l=t,n):l},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t){var e=arguments.length;return e?(i=+t,u=+arguments[e-1],n):i},n.innerTickSize=function(t){return arguments.length?(i=+t,n):i},n.outerTickSize=function(t){return arguments.length?(u=+t,n):u},n.tickPadding=function(t){return arguments.length?(o=+t,n):o},n.tickSubdivide=function(){return arguments.length&&n},n};var Vl="bottom",Xl={top:1,right:1,bottom:1,left:1};ao.svg.brush=function(){function n(t){t.each(function(){var t=ao.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",u).on("touchstart.brush",u),o=t.selectAll(".background").data([0]);o.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),t.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var a=t.selectAll(".resize").data(v,m);a.exit().remove(),a.enter().append("g").attr("class",function(n){return"resize "+n}).style("cursor",function(n){return $l[n]}).append("rect").attr("x",function(n){return/[ew]$/.test(n)?-3:null}).attr("y",function(n){return/^[ns]/.test(n)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),a.style("display",n.empty()?"none":null);var l,s=ao.transition(t),h=ao.transition(o);c&&(l=Zi(c),h.attr("x",l[0]).attr("width",l[1]-l[0]),r(s)),f&&(l=Zi(f),h.attr("y",l[0]).attr("height",l[1]-l[0]),i(s)),e(s)})}function e(n){n.selectAll(".resize").attr("transform",function(n){return"translate("+s[+/e$/.test(n)]+","+h[+/^s/.test(n)]+")"})}function r(n){n.select(".extent").attr("x",s[0]),n.selectAll(".extent,.n>rect,.s>rect").attr("width",s[1]-s[0])}function i(n){n.select(".extent").attr("y",h[0]),n.selectAll(".extent,.e>rect,.w>rect").attr("height",h[1]-h[0])}function u(){function u(){32==ao.event.keyCode&&(C||(M=null,L[0]-=s[1],L[1]-=h[1],C=2),S())}function v(){32==ao.event.keyCode&&2==C&&(L[0]+=s[1],L[1]+=h[1],C=0,S())}function d(){var n=ao.mouse(b),t=!1;x&&(n[0]+=x[0],n[1]+=x[1]),C||(ao.event.altKey?(M||(M=[(s[0]+s[1])/2,(h[0]+h[1])/2]),L[0]=s[+(n[0]f?(i=r,r=f):i=f),v[0]!=r||v[1]!=i?(e?a=null:o=null,v[0]=r,v[1]=i,!0):void 0}function m(){d(),k.style("pointer-events","all").selectAll(".resize").style("display",n.empty()?"none":null),ao.select("body").style("cursor",null),q.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),z(),w({type:"brushend"})}var M,x,b=this,_=ao.select(ao.event.target),w=l.of(b,arguments),k=ao.select(b),N=_.datum(),E=!/^(n|s)$/.test(N)&&c,A=!/^(e|w)$/.test(N)&&f,C=_.classed("extent"),z=W(b),L=ao.mouse(b),q=ao.select(t(b)).on("keydown.brush",u).on("keyup.brush",v);if(ao.event.changedTouches?q.on("touchmove.brush",d).on("touchend.brush",m):q.on("mousemove.brush",d).on("mouseup.brush",m),k.interrupt().selectAll("*").interrupt(),C)L[0]=s[0]-L[0],L[1]=h[0]-L[1];else if(N){var T=+/w$/.test(N),R=+/^n/.test(N);x=[s[1-T]-L[0],h[1-R]-L[1]],L[0]=s[T],L[1]=h[R]}else ao.event.altKey&&(M=L.slice());k.style("pointer-events","none").selectAll(".resize").style("display",null),ao.select("body").style("cursor",_.style("cursor")),w({type:"brushstart"}),d()}var o,a,l=N(n,"brushstart","brush","brushend"),c=null,f=null,s=[0,0],h=[0,0],p=!0,g=!0,v=Bl[0];return n.event=function(n){n.each(function(){var n=l.of(this,arguments),t={x:s,y:h,i:o,j:a},e=this.__chart__||t;this.__chart__=t,Hl?ao.select(this).transition().each("start.brush",function(){o=e.i,a=e.j,s=e.x,h=e.y,n({type:"brushstart"})}).tween("brush:brush",function(){var e=xr(s,t.x),r=xr(h,t.y);return o=a=null,function(i){s=t.x=e(i),h=t.y=r(i),n({type:"brush",mode:"resize"})}}).each("end.brush",function(){o=t.i,a=t.j,n({type:"brush",mode:"resize"}),n({type:"brushend"})}):(n({type:"brushstart"}),n({type:"brush",mode:"resize"}),n({type:"brushend"}))})},n.x=function(t){return arguments.length?(c=t,v=Bl[!c<<1|!f],n):c},n.y=function(t){return arguments.length?(f=t,v=Bl[!c<<1|!f],n):f},n.clamp=function(t){return arguments.length?(c&&f?(p=!!t[0],g=!!t[1]):c?p=!!t:f&&(g=!!t),n):c&&f?[p,g]:c?p:f?g:null},n.extent=function(t){var e,r,i,u,l;return arguments.length?(c&&(e=t[0],r=t[1],f&&(e=e[0],r=r[0]),o=[e,r],c.invert&&(e=c(e),r=c(r)),e>r&&(l=e,e=r,r=l),e==s[0]&&r==s[1]||(s=[e,r])),f&&(i=t[0],u=t[1],c&&(i=i[1],u=u[1]),a=[i,u],f.invert&&(i=f(i),u=f(u)),i>u&&(l=i,i=u,u=l),i==h[0]&&u==h[1]||(h=[i,u])),n):(c&&(o?(e=o[0],r=o[1]):(e=s[0],r=s[1],c.invert&&(e=c.invert(e),r=c.invert(r)),e>r&&(l=e,e=r,r=l))),f&&(a?(i=a[0],u=a[1]):(i=h[0],u=h[1],f.invert&&(i=f.invert(i),u=f.invert(u)),i>u&&(l=i,i=u,u=l))),c&&f?[[e,i],[r,u]]:c?[e,r]:f&&[i,u])},n.clear=function(){return n.empty()||(s=[0,0],h=[0,0],o=a=null),n},n.empty=function(){return!!c&&s[0]==s[1]||!!f&&h[0]==h[1]},ao.rebind(n,l,"on")};var $l={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},Bl=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Wl=ga.format=xa.timeFormat,Jl=Wl.utc,Gl=Jl("%Y-%m-%dT%H:%M:%S.%LZ");Wl.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?eo:Gl,eo.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},eo.toString=Gl.toString,ga.second=On(function(n){return new va(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),ga.seconds=ga.second.range,ga.seconds.utc=ga.second.utc.range,ga.minute=On(function(n){return new va(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),ga.minutes=ga.minute.range,ga.minutes.utc=ga.minute.utc.range,ga.hour=On(function(n){var t=n.getTimezoneOffset()/60;return new va(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),ga.hours=ga.hour.range,ga.hours.utc=ga.hour.utc.range,ga.month=On(function(n){return n=ga.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),ga.months=ga.month.range,ga.months.utc=ga.month.utc.range;var Kl=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Ql=[[ga.second,1],[ga.second,5],[ga.second,15],[ga.second,30],[ga.minute,1],[ga.minute,5],[ga.minute,15],[ga.minute,30],[ga.hour,1],[ga.hour,3],[ga.hour,6],[ga.hour,12],[ga.day,1],[ga.day,2],[ga.week,1],[ga.month,1],[ga.month,3],[ga.year,1]],nc=Wl.multi([[".%L",function(n){return n.getMilliseconds()}],[":%S",function(n){return n.getSeconds()}],["%I:%M",function(n){return n.getMinutes()}],["%I %p",function(n){return n.getHours()}],["%a %d",function(n){return n.getDay()&&1!=n.getDate()}],["%b %d",function(n){return 1!=n.getDate()}],["%B",function(n){return n.getMonth()}],["%Y",zt]]),tc={range:function(n,t,e){return ao.range(Math.ceil(n/e)*e,+t,e).map(io)},floor:m,ceil:m};Ql.year=ga.year,ga.scale=function(){return ro(ao.scale.linear(),Ql,nc)};var ec=Ql.map(function(n){return[n[0].utc,n[1]]}),rc=Jl.multi([[".%L",function(n){return n.getUTCMilliseconds()}],[":%S",function(n){return n.getUTCSeconds()}],["%I:%M",function(n){return n.getUTCMinutes()}],["%I %p",function(n){return n.getUTCHours()}],["%a %d",function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],["%b %d",function(n){return 1!=n.getUTCDate()}],["%B",function(n){return n.getUTCMonth()}],["%Y",zt]]);ec.year=ga.year.utc,ga.scale.utc=function(){return ro(ao.scale.linear(),ec,rc)},ao.text=An(function(n){return n.responseText}),ao.json=function(n,t){return Cn(n,"application/json",uo,t)},ao.html=function(n,t){return Cn(n,"text/html",oo,t)},ao.xml=An(function(n){return n.responseXML}),"function"==typeof define&&define.amd?(this.d3=ao,define(ao)):"object"==typeof module&&module.exports?module.exports=ao:this.d3=ao}(); \ No newline at end of file diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/file.js b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/file.js deleted file mode 100644 index 29cacd4..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/file.js +++ /dev/null @@ -1,62 +0,0 @@ - $(function() { - var $window = $(window) - , $top_link = $('#toplink') - , $body = $('body, html') - , offset = $('#code').offset().top - , hidePopover = function ($target) { - $target.data('popover-hover', false); - - setTimeout(function () { - if (!$target.data('popover-hover')) { - $target.popover('hide'); - } - }, 300); - }; - - $top_link.hide().click(function(event) { - event.preventDefault(); - $body.animate({scrollTop:0}, 800); - }); - - $window.scroll(function() { - if($window.scrollTop() > offset) { - $top_link.fadeIn(); - } else { - $top_link.fadeOut(); - } - }).scroll(); - - $('.popin') - .popover({trigger: 'manual'}) - .on({ - 'mouseenter.popover': function () { - var $target = $(this); - var $container = $target.children().first(); - - $target.data('popover-hover', true); - - // popover already displayed - if ($target.next('.popover').length) { - return; - } - - // show the popover - $container.popover('show'); - - // register mouse events on the popover - $target.next('.popover:not(.popover-initialized)') - .on({ - 'mouseenter': function () { - $target.data('popover-hover', true); - }, - 'mouseleave': function () { - hidePopover($container); - } - }) - .addClass('popover-initialized'); - }, - 'mouseleave.popover': function () { - hidePopover($(this).children().first()); - } - }); - }); diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/jquery.min.js b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/jquery.min.js deleted file mode 100644 index 2c69bc9..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/jquery.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! jQuery v3.6.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,y=n.hasOwnProperty,a=y.toString,l=a.call(Object),v={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&v(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!y||!y.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ve(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ye(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ve(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],y=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||y.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||y.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||y.push(".#.+[+~]"),e.querySelectorAll("\\\f"),y.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),y=y.length&&new RegExp(y.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),v=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&v(p,e)?-1:t==C||t.ownerDocument==p&&v(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!y||!y.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),v.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",v.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",v.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),v.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(v.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return B(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=_e(v.pixelPosition,function(e,t){if(t)return t=Be(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return B(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0f&&(e=a.render.queue[f]);f++)d=e.generate(),typeof e.callback==typeof Function&&e.callback(d);a.render.queue.splice(0,f),a.render.queue.length?setTimeout(c):(a.dispatch.render_end(),a.render.active=!1)};setTimeout(c)},a.render.active=!1,a.render.queue=[],a.addGraph=function(b){typeof arguments[0]==typeof Function&&(b={generate:arguments[0],callback:arguments[1]}),a.render.queue.push(b),a.render.active||a.render()},"undefined"!=typeof module&&"undefined"!=typeof exports&&(module.exports=a),"undefined"!=typeof window&&(window.nv=a),a.dom.write=function(a){return void 0!==window.fastdom?fastdom.write(a):a()},a.dom.read=function(a){return void 0!==window.fastdom?fastdom.read(a):a()},a.interactiveGuideline=function(){"use strict";function b(l){l.each(function(l){function m(){var a=d3.mouse(this),d=a[0],e=a[1],i=!0,j=!1;if(k&&(d=d3.event.offsetX,e=d3.event.offsetY,"svg"!==d3.event.target.tagName&&(i=!1),d3.event.target.className.baseVal.match("nv-legend")&&(j=!0)),i&&(d-=f.left,e-=f.top),0>d||0>e||d>o||e>p||d3.event.relatedTarget&&void 0===d3.event.relatedTarget.ownerSVGElement||j){if(k&&d3.event.relatedTarget&&void 0===d3.event.relatedTarget.ownerSVGElement&&(void 0===d3.event.relatedTarget.className||d3.event.relatedTarget.className.match(c.nvPointerEventsClass)))return;return h.elementMouseout({mouseX:d,mouseY:e}),b.renderGuideLine(null),void c.hidden(!0)}c.hidden(!1);var l=g.invert(d);h.elementMousemove({mouseX:d,mouseY:e,pointXValue:l}),"dblclick"===d3.event.type&&h.elementDblclick({mouseX:d,mouseY:e,pointXValue:l}),"click"===d3.event.type&&h.elementClick({mouseX:d,mouseY:e,pointXValue:l})}var n=d3.select(this),o=d||960,p=e||400,q=n.selectAll("g.nv-wrap.nv-interactiveLineLayer").data([l]),r=q.enter().append("g").attr("class"," nv-wrap nv-interactiveLineLayer");r.append("g").attr("class","nv-interactiveGuideLine"),j&&(j.on("touchmove",m).on("mousemove",m,!0).on("mouseout",m,!0).on("dblclick",m).on("click",m),b.guideLine=null,b.renderGuideLine=function(c){i&&(b.guideLine&&b.guideLine.attr("x1")===c||a.dom.write(function(){var b=q.select(".nv-interactiveGuideLine").selectAll("line").data(null!=c?[a.utils.NaNtoZero(c)]:[],String);b.enter().append("line").attr("class","nv-guideline").attr("x1",function(a){return a}).attr("x2",function(a){return a}).attr("y1",p).attr("y2",0),b.exit().remove()}))})})}var c=a.models.tooltip();c.duration(0).hideDelay(0)._isInteractiveLayer(!0).hidden(!1);var d=null,e=null,f={left:0,top:0},g=d3.scale.linear(),h=d3.dispatch("elementMousemove","elementMouseout","elementClick","elementDblclick"),i=!0,j=null,k="ActiveXObject"in window;return b.dispatch=h,b.tooltip=c,b.margin=function(a){return arguments.length?(f.top="undefined"!=typeof a.top?a.top:f.top,f.left="undefined"!=typeof a.left?a.left:f.left,b):f},b.width=function(a){return arguments.length?(d=a,b):d},b.height=function(a){return arguments.length?(e=a,b):e},b.xScale=function(a){return arguments.length?(g=a,b):g},b.showGuideLine=function(a){return arguments.length?(i=a,b):i},b.svgContainer=function(a){return arguments.length?(j=a,b):j},b},a.interactiveBisect=function(a,b,c){"use strict";if(!(a instanceof Array))return null;var d;d="function"!=typeof c?function(a){return a.x}:c;var e=function(a,b){return d(a)-b},f=d3.bisector(e).left,g=d3.max([0,f(a,b)-1]),h=d(a[g]);if("undefined"==typeof h&&(h=g),h===b)return g;var i=d3.min([g+1,a.length-1]),j=d(a[i]);return"undefined"==typeof j&&(j=i),Math.abs(j-b)>=Math.abs(h-b)?g:i},a.nearestValueIndex=function(a,b,c){"use strict";var d=1/0,e=null;return a.forEach(function(a,f){var g=Math.abs(b-a);null!=a&&d>=g&&c>g&&(d=g,e=f)}),e},function(){"use strict";a.models.tooltip=function(){function b(){if(k){var a=d3.select(k);"svg"!==a.node().tagName&&(a=a.select("svg"));var b=a.node()?a.attr("viewBox"):null;if(b){b=b.split(" ");var c=parseInt(a.style("width"),10)/b[2];p.left=p.left*c,p.top=p.top*c}}}function c(){if(!n){var a;a=k?k:document.body,n=d3.select(a).append("div").attr("class","nvtooltip "+(j?j:"xy-tooltip")).attr("id",v),n.style("top",0).style("left",0),n.style("opacity",0),n.selectAll("div, table, td, tr").classed(w,!0),n.classed(w,!0),o=n.node()}}function d(){if(r&&B(e)){b();var f=p.left,g=null!==i?i:p.top;return a.dom.write(function(){c();var b=A(e);b&&(o.innerHTML=b),k&&u?a.dom.read(function(){var a=k.getElementsByTagName("svg")[0],b={left:0,top:0};if(a){var c=a.getBoundingClientRect(),d=k.getBoundingClientRect(),e=c.top;if(0>e){var i=k.getBoundingClientRect();e=Math.abs(e)>i.height?0:e}b.top=Math.abs(e-d.top),b.left=Math.abs(c.left-d.left)}f+=k.offsetLeft+b.left-2*k.scrollLeft,g+=k.offsetTop+b.top-2*k.scrollTop,h&&h>0&&(g=Math.floor(g/h)*h),C([f,g])}):C([f,g])}),d}}var e=null,f="w",g=25,h=0,i=null,j=null,k=null,l=!0,m=400,n=null,o=null,p={left:null,top:null},q={left:0,top:0},r=!0,s=100,t=!0,u=!1,v="nvtooltip-"+Math.floor(1e5*Math.random()),w="nv-pointer-events-none",x=function(a){return a},y=function(a){return a},z=function(a){return a},A=function(a){if(null===a)return"";var b=d3.select(document.createElement("table"));if(t){var c=b.selectAll("thead").data([a]).enter().append("thead");c.append("tr").append("td").attr("colspan",3).append("strong").classed("x-value",!0).html(y(a.value))}var d=b.selectAll("tbody").data([a]).enter().append("tbody"),e=d.selectAll("tr").data(function(a){return a.series}).enter().append("tr").classed("highlight",function(a){return a.highlight});e.append("td").classed("legend-color-guide",!0).append("div").style("background-color",function(a){return a.color}),e.append("td").classed("key",!0).html(function(a,b){return z(a.key,b)}),e.append("td").classed("value",!0).html(function(a,b){return x(a.value,b)}),e.selectAll("td").each(function(a){if(a.highlight){var b=d3.scale.linear().domain([0,1]).range(["#fff",a.color]),c=.6;d3.select(this).style("border-bottom-color",b(c)).style("border-top-color",b(c))}});var f=b.node().outerHTML;return void 0!==a.footer&&(f+=""),f},B=function(a){if(a&&a.series){if(a.series instanceof Array)return!!a.series.length;if(a.series instanceof Object)return a.series=[a.series],!0}return!1},C=function(b){o&&a.dom.read(function(){var c,d,e=parseInt(o.offsetHeight,10),h=parseInt(o.offsetWidth,10),i=a.utils.windowSize().width,j=a.utils.windowSize().height,k=window.pageYOffset,p=window.pageXOffset;j=window.innerWidth>=document.body.scrollWidth?j:j-16,i=window.innerHeight>=document.body.scrollHeight?i:i-16;var r,t,u=function(a){var b=d;do isNaN(a.offsetTop)||(b+=a.offsetTop),a=a.offsetParent;while(a);return b},v=function(a){var b=c;do isNaN(a.offsetLeft)||(b+=a.offsetLeft),a=a.offsetParent;while(a);return b};switch(f){case"e":c=b[0]-h-g,d=b[1]-e/2,r=v(o),t=u(o),p>r&&(c=b[0]+g>p?b[0]+g:p-r+c),k>t&&(d=k-t+d),t+e>k+j&&(d=k+j-t+d-e);break;case"w":c=b[0]+g,d=b[1]-e/2,r=v(o),t=u(o),r+h>i&&(c=b[0]-h-g),k>t&&(d=k+5),t+e>k+j&&(d=k+j-t+d-e);break;case"n":c=b[0]-h/2-5,d=b[1]+g,r=v(o),t=u(o),p>r&&(c=p+5),r+h>i&&(c=c-h/2+5),t+e>k+j&&(d=k+j-t+d-e);break;case"s":c=b[0]-h/2,d=b[1]-e-g,r=v(o),t=u(o),p>r&&(c=p+5),r+h>i&&(c=c-h/2+5),k>t&&(d=k);break;case"none":c=b[0],d=b[1]-g,r=v(o),t=u(o)}c-=q.left,d-=q.top;var w=o.getBoundingClientRect(),k=window.pageYOffset||document.documentElement.scrollTop,p=window.pageXOffset||document.documentElement.scrollLeft,x="translate("+(w.left+p)+"px, "+(w.top+k)+"px)",y="translate("+c+"px, "+d+"px)",z=d3.interpolateString(x,y),A=n.style("opacity")<.1;l?n.transition().delay(m).duration(0).style("opacity",0):n.interrupt().transition().duration(A?0:s).styleTween("transform",function(){return z},"important").style("-webkit-transform",y).style("opacity",1)})};return d.nvPointerEventsClass=w,d.options=a.utils.optionsFunc.bind(d),d._options=Object.create({},{duration:{get:function(){return s},set:function(a){s=a}},gravity:{get:function(){return f},set:function(a){f=a}},distance:{get:function(){return g},set:function(a){g=a}},snapDistance:{get:function(){return h},set:function(a){h=a}},classes:{get:function(){return j},set:function(a){j=a}},chartContainer:{get:function(){return k},set:function(a){k=a}},fixedTop:{get:function(){return i},set:function(a){i=a}},enabled:{get:function(){return r},set:function(a){r=a}},hideDelay:{get:function(){return m},set:function(a){m=a}},contentGenerator:{get:function(){return A},set:function(a){A=a}},valueFormatter:{get:function(){return x},set:function(a){x=a}},headerFormatter:{get:function(){return y},set:function(a){y=a}},keyFormatter:{get:function(){return z},set:function(a){z=a}},headerEnabled:{get:function(){return t},set:function(a){t=a}},_isInteractiveLayer:{get:function(){return u},set:function(a){u=!!a}},position:{get:function(){return p},set:function(a){p.left=void 0!==a.left?a.left:p.left,p.top=void 0!==a.top?a.top:p.top}},offset:{get:function(){return q},set:function(a){q.left=void 0!==a.left?a.left:q.left,q.top=void 0!==a.top?a.top:q.top}},hidden:{get:function(){return l},set:function(a){l!=a&&(l=!!a,d())}},data:{get:function(){return e},set:function(a){a.point&&(a.value=a.point.x,a.series=a.series||{},a.series.value=a.point.y,a.series.color=a.point.color||a.series.color),e=a}},tooltipElem:{get:function(){return o},set:function(){}},id:{get:function(){return v},set:function(){}}}),a.utils.initOptions(d),d}}(),a.utils.windowSize=function(){var a={width:640,height:480};return window.innerWidth&&window.innerHeight?(a.width=window.innerWidth,a.height=window.innerHeight,a):"CSS1Compat"==document.compatMode&&document.documentElement&&document.documentElement.offsetWidth?(a.width=document.documentElement.offsetWidth,a.height=document.documentElement.offsetHeight,a):document.body&&document.body.offsetWidth?(a.width=document.body.offsetWidth,a.height=document.body.offsetHeight,a):a},a.utils.windowResize=function(b){return window.addEventListener?window.addEventListener("resize",b):a.log("ERROR: Failed to bind to window.resize with: ",b),{callback:b,clear:function(){window.removeEventListener("resize",b)}}},a.utils.getColor=function(b){if(void 0===b)return a.utils.defaultColor();if(Array.isArray(b)){var c=d3.scale.ordinal().range(b);return function(a,b){var d=void 0===b?a:b;return a.color||c(d)}}return b},a.utils.defaultColor=function(){return a.utils.getColor(d3.scale.category20().range())},a.utils.customTheme=function(a,b,c){b=b||function(a){return a.key},c=c||d3.scale.category20().range();var d=c.length;return function(e){var f=b(e);return"function"==typeof a[f]?a[f]():void 0!==a[f]?a[f]:(d||(d=c.length),d-=1,c[d])}},a.utils.pjax=function(b,c){var d=function(d){d3.html(d,function(d){var e=d3.select(c).node();e.parentNode.replaceChild(d3.select(d).select(c).node(),e),a.utils.pjax(b,c)})};d3.selectAll(b).on("click",function(){history.pushState(this.href,this.textContent,this.href),d(this.href),d3.event.preventDefault()}),d3.select(window).on("popstate",function(){d3.event.state&&d(d3.event.state)})},a.utils.calcApproxTextWidth=function(a){if("function"==typeof a.style&&"function"==typeof a.text){var b=parseInt(a.style("font-size").replace("px",""),10),c=a.text().length;return c*b*.5}return 0},a.utils.NaNtoZero=function(a){return"number"!=typeof a||isNaN(a)||null===a||1/0===a||a===-1/0?0:a},d3.selection.prototype.watchTransition=function(a){var b=[this].concat([].slice.call(arguments,1));return a.transition.apply(a,b)},a.utils.renderWatch=function(b,c){if(!(this instanceof a.utils.renderWatch))return new a.utils.renderWatch(b,c);var d=void 0!==c?c:250,e=[],f=this;this.models=function(a){return a=[].slice.call(arguments,0),a.forEach(function(a){a.__rendered=!1,function(a){a.dispatch.on("renderEnd",function(){a.__rendered=!0,f.renderEnd("model")})}(a),e.indexOf(a)<0&&e.push(a)}),this},this.reset=function(a){void 0!==a&&(d=a),e=[]},this.transition=function(a,b,c){if(b=arguments.length>1?[].slice.call(arguments,1):[],c=b.length>1?b.pop():void 0!==d?d:250,a.__rendered=!1,e.indexOf(a)<0&&e.push(a),0===c)return a.__rendered=!0,a.delay=function(){return this},a.duration=function(){return this},a;a.__rendered=0===a.length?!0:a.every(function(a){return!a.length})?!0:!1;var g=0;return a.transition().duration(c).each(function(){++g}).each("end",function(){0===--g&&(a.__rendered=!0,f.renderEnd.apply(this,b))})},this.renderEnd=function(){e.every(function(a){return a.__rendered})&&(e.forEach(function(a){a.__rendered=!1}),b.renderEnd.apply(this,arguments))}},a.utils.deepExtend=function(b){var c=arguments.length>1?[].slice.call(arguments,1):[];c.forEach(function(c){for(var d in c){var e=b[d]instanceof Array,f="object"==typeof b[d],g="object"==typeof c[d];f&&!e&&g?a.utils.deepExtend(b[d],c[d]):b[d]=c[d]}})},a.utils.state=function(){if(!(this instanceof a.utils.state))return new a.utils.state;var b={},c=function(){},d=function(){return{}},e=null,f=null;this.dispatch=d3.dispatch("change","set"),this.dispatch.on("set",function(a){c(a,!0)}),this.getter=function(a){return d=a,this},this.setter=function(a,b){return b||(b=function(){}),c=function(c,d){a(c),d&&b()},this},this.init=function(b){e=e||{},a.utils.deepExtend(e,b)};var g=function(){var a=d();if(JSON.stringify(a)===JSON.stringify(b))return!1;for(var c in a)void 0===b[c]&&(b[c]={}),b[c]=a[c],f=!0;return!0};this.update=function(){e&&(c(e,!1),e=null),g.call(this)&&this.dispatch.change(b)}},a.utils.optionsFunc=function(a){return a&&d3.map(a).forEach(function(a,b){"function"==typeof this[a]&&this[a](b)}.bind(this)),this},a.utils.calcTicksX=function(b,c){var d=1,e=0;for(e;ed?f:d}return a.log("Requested number of ticks: ",b),a.log("Calculated max values to be: ",d),b=b>d?b=d-1:b,b=1>b?1:b,b=Math.floor(b),a.log("Calculating tick count as: ",b),b},a.utils.calcTicksY=function(b,c){return a.utils.calcTicksX(b,c)},a.utils.initOption=function(a,b){a._calls&&a._calls[b]?a[b]=a._calls[b]:(a[b]=function(c){return arguments.length?(a._overrides[b]=!0,a._options[b]=c,a):a._options[b]},a["_"+b]=function(c){return arguments.length?(a._overrides[b]||(a._options[b]=c),a):a._options[b]})},a.utils.initOptions=function(b){b._overrides=b._overrides||{};var c=Object.getOwnPropertyNames(b._options||{}),d=Object.getOwnPropertyNames(b._calls||{});c=c.concat(d);for(var e in c)a.utils.initOption(b,c[e])},a.utils.inheritOptionsD3=function(a,b,c){a._d3options=c.concat(a._d3options||[]),c.unshift(b),c.unshift(a),d3.rebind.apply(this,c)},a.utils.arrayUnique=function(a){return a.sort().filter(function(b,c){return!c||b!=a[c-1]})},a.utils.symbolMap=d3.map(),a.utils.symbol=function(){function b(b,e){var f=c.call(this,b,e),g=d.call(this,b,e);return-1!==d3.svg.symbolTypes.indexOf(f)?d3.svg.symbol().type(f).size(g)():a.utils.symbolMap.get(f)(g)}var c,d=64;return b.type=function(a){return arguments.length?(c=d3.functor(a),b):c},b.size=function(a){return arguments.length?(d=d3.functor(a),b):d},b},a.utils.inheritOptions=function(b,c){var d=Object.getOwnPropertyNames(c._options||{}),e=Object.getOwnPropertyNames(c._calls||{}),f=c._inherited||[],g=c._d3options||[],h=d.concat(e).concat(f).concat(g);h.unshift(c),h.unshift(b),d3.rebind.apply(this,h),b._inherited=a.utils.arrayUnique(d.concat(e).concat(f).concat(d).concat(b._inherited||[])),b._d3options=a.utils.arrayUnique(g.concat(b._d3options||[]))},a.utils.initSVG=function(a){a.classed({"nvd3-svg":!0})},a.utils.sanitizeHeight=function(a,b){return a||parseInt(b.style("height"),10)||400},a.utils.sanitizeWidth=function(a,b){return a||parseInt(b.style("width"),10)||960},a.utils.availableHeight=function(b,c,d){return a.utils.sanitizeHeight(b,c)-d.top-d.bottom},a.utils.availableWidth=function(b,c,d){return a.utils.sanitizeWidth(b,c)-d.left-d.right},a.utils.noData=function(b,c){var d=b.options(),e=d.margin(),f=d.noData(),g=null==f?["No Data Available."]:[f],h=a.utils.availableHeight(d.height(),c,e),i=a.utils.availableWidth(d.width(),c,e),j=e.left+i/2,k=e.top+h/2;c.selectAll("g").remove();var l=c.selectAll(".nv-noData").data(g);l.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),l.attr("x",j).attr("y",k).text(function(a){return a})},a.models.axis=function(){"use strict";function b(g){return s.reset(),g.each(function(b){var g=d3.select(this);a.utils.initSVG(g);var p=g.selectAll("g.nv-wrap.nv-axis").data([b]),q=p.enter().append("g").attr("class","nvd3 nv-wrap nv-axis"),t=(q.append("g"),p.select("g"));null!==n?c.ticks(n):("top"==c.orient()||"bottom"==c.orient())&&c.ticks(Math.abs(d.range()[1]-d.range()[0])/100),t.watchTransition(s,"axis").call(c),r=r||c.scale();var u=c.tickFormat();null==u&&(u=r.tickFormat());var v=t.selectAll("text.nv-axislabel").data([h||null]);v.exit().remove();var w,x,y;switch(c.orient()){case"top":v.enter().append("text").attr("class","nv-axislabel"),y=d.range().length<2?0:2===d.range().length?d.range()[1]:d.range()[d.range().length-1]+(d.range()[1]-d.range()[0]),v.attr("text-anchor","middle").attr("y",0).attr("x",y/2),i&&(x=p.selectAll("g.nv-axisMaxMin").data(d.domain()),x.enter().append("g").attr("class",function(a,b){return["nv-axisMaxMin","nv-axisMaxMin-x",0==b?"nv-axisMin-x":"nv-axisMax-x"].join(" ")}).append("text"),x.exit().remove(),x.attr("transform",function(b){return"translate("+a.utils.NaNtoZero(d(b))+",0)"}).select("text").attr("dy","-0.5em").attr("y",-c.tickPadding()).attr("text-anchor","middle").text(function(a){var b=u(a);return(""+b).match("NaN")?"":b}),x.watchTransition(s,"min-max top").attr("transform",function(b,c){return"translate("+a.utils.NaNtoZero(d.range()[c])+",0)"}));break;case"bottom":w=o+36;var z=30,A=0,B=t.selectAll("g").select("text"),C="";if(j%360){B.each(function(){var a=this.getBoundingClientRect(),b=a.width;A=a.height,b>z&&(z=b)}),C="rotate("+j+" 0,"+(A/2+c.tickPadding())+")";var D=Math.abs(Math.sin(j*Math.PI/180));w=(D?D*z:z)+30,B.attr("transform",C).style("text-anchor",j%360>0?"start":"end")}v.enter().append("text").attr("class","nv-axislabel"),y=d.range().length<2?0:2===d.range().length?d.range()[1]:d.range()[d.range().length-1]+(d.range()[1]-d.range()[0]),v.attr("text-anchor","middle").attr("y",w).attr("x",y/2),i&&(x=p.selectAll("g.nv-axisMaxMin").data([d.domain()[0],d.domain()[d.domain().length-1]]),x.enter().append("g").attr("class",function(a,b){return["nv-axisMaxMin","nv-axisMaxMin-x",0==b?"nv-axisMin-x":"nv-axisMax-x"].join(" ")}).append("text"),x.exit().remove(),x.attr("transform",function(b){return"translate("+a.utils.NaNtoZero(d(b)+(m?d.rangeBand()/2:0))+",0)"}).select("text").attr("dy",".71em").attr("y",c.tickPadding()).attr("transform",C).style("text-anchor",j?j%360>0?"start":"end":"middle").text(function(a){var b=u(a);return(""+b).match("NaN")?"":b}),x.watchTransition(s,"min-max bottom").attr("transform",function(b){return"translate("+a.utils.NaNtoZero(d(b)+(m?d.rangeBand()/2:0))+",0)"})),l&&B.attr("transform",function(a,b){return"translate(0,"+(b%2==0?"0":"12")+")"});break;case"right":v.enter().append("text").attr("class","nv-axislabel"),v.style("text-anchor",k?"middle":"begin").attr("transform",k?"rotate(90)":"").attr("y",k?-Math.max(e.right,f)+12:-10).attr("x",k?d3.max(d.range())/2:c.tickPadding()),i&&(x=p.selectAll("g.nv-axisMaxMin").data(d.domain()),x.enter().append("g").attr("class",function(a,b){return["nv-axisMaxMin","nv-axisMaxMin-y",0==b?"nv-axisMin-y":"nv-axisMax-y"].join(" ")}).append("text").style("opacity",0),x.exit().remove(),x.attr("transform",function(b){return"translate(0,"+a.utils.NaNtoZero(d(b))+")"}).select("text").attr("dy",".32em").attr("y",0).attr("x",c.tickPadding()).style("text-anchor","start").text(function(a){var b=u(a);return(""+b).match("NaN")?"":b}),x.watchTransition(s,"min-max right").attr("transform",function(b,c){return"translate(0,"+a.utils.NaNtoZero(d.range()[c])+")"}).select("text").style("opacity",1));break;case"left":v.enter().append("text").attr("class","nv-axislabel"),v.style("text-anchor",k?"middle":"end").attr("transform",k?"rotate(-90)":"").attr("y",k?-Math.max(e.left,f)+25-(o||0):-10).attr("x",k?-d3.max(d.range())/2:-c.tickPadding()),i&&(x=p.selectAll("g.nv-axisMaxMin").data(d.domain()),x.enter().append("g").attr("class",function(a,b){return["nv-axisMaxMin","nv-axisMaxMin-y",0==b?"nv-axisMin-y":"nv-axisMax-y"].join(" ")}).append("text").style("opacity",0),x.exit().remove(),x.attr("transform",function(b){return"translate(0,"+a.utils.NaNtoZero(r(b))+")"}).select("text").attr("dy",".32em").attr("y",0).attr("x",-c.tickPadding()).attr("text-anchor","end").text(function(a){var b=u(a);return(""+b).match("NaN")?"":b}),x.watchTransition(s,"min-max right").attr("transform",function(b,c){return"translate(0,"+a.utils.NaNtoZero(d.range()[c])+")"}).select("text").style("opacity",1))}if(v.text(function(a){return a}),!i||"left"!==c.orient()&&"right"!==c.orient()||(t.selectAll("g").each(function(a){d3.select(this).select("text").attr("opacity",1),(d(a)d.range()[0]-10)&&((a>1e-10||-1e-10>a)&&d3.select(this).attr("opacity",0),d3.select(this).select("text").attr("opacity",0))}),d.domain()[0]==d.domain()[1]&&0==d.domain()[0]&&p.selectAll("g.nv-axisMaxMin").style("opacity",function(a,b){return b?0:1})),i&&("top"===c.orient()||"bottom"===c.orient())){var E=[];p.selectAll("g.nv-axisMaxMin").each(function(a,b){try{E.push(b?d(a)-this.getBoundingClientRect().width-4:d(a)+this.getBoundingClientRect().width+4)}catch(c){E.push(b?d(a)-4:d(a)+4)}}),t.selectAll("g").each(function(a){(d(a)E[1])&&(a>1e-10||-1e-10>a?d3.select(this).remove():d3.select(this).select("text").remove())})}t.selectAll(".tick").filter(function(a){return!parseFloat(Math.round(1e5*a)/1e6)&&void 0!==a}).classed("zero",!0),r=d.copy()}),s.renderEnd("axis immediate"),b}var c=d3.svg.axis(),d=d3.scale.linear(),e={top:0,right:0,bottom:0,left:0},f=75,g=60,h=null,i=!0,j=0,k=!0,l=!1,m=!1,n=null,o=0,p=250,q=d3.dispatch("renderEnd");c.scale(d).orient("bottom").tickFormat(function(a){return a});var r,s=a.utils.renderWatch(q,p);return b.axis=c,b.dispatch=q,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{axisLabelDistance:{get:function(){return o},set:function(a){o=a}},staggerLabels:{get:function(){return l},set:function(a){l=a}},rotateLabels:{get:function(){return j},set:function(a){j=a}},rotateYLabel:{get:function(){return k},set:function(a){k=a}},showMaxMin:{get:function(){return i},set:function(a){i=a}},axisLabel:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return g},set:function(a){g=a}},ticks:{get:function(){return n},set:function(a){n=a}},width:{get:function(){return f},set:function(a){f=a}},margin:{get:function(){return e},set:function(a){e.top=void 0!==a.top?a.top:e.top,e.right=void 0!==a.right?a.right:e.right,e.bottom=void 0!==a.bottom?a.bottom:e.bottom,e.left=void 0!==a.left?a.left:e.left}},duration:{get:function(){return p},set:function(a){p=a,s.reset(p)}},scale:{get:function(){return d},set:function(e){d=e,c.scale(d),m="function"==typeof d.rangeBands,a.utils.inheritOptionsD3(b,d,["domain","range","rangeBand","rangeBands"])}}}),a.utils.initOptions(b),a.utils.inheritOptionsD3(b,c,["orient","tickValues","tickSubdivide","tickSize","tickPadding","tickFormat"]),a.utils.inheritOptionsD3(b,d,["domain","range","rangeBand","rangeBands"]),b},a.models.boxPlot=function(){"use strict";function b(l){return v.reset(),l.each(function(b){var l=j-i.left-i.right,p=k-i.top-i.bottom;r=d3.select(this),a.utils.initSVG(r),m.domain(c||b.map(function(a,b){return o(a,b)})).rangeBands(e||[0,l],.1);var w=[];if(!d){var x=d3.min(b.map(function(a){var b=[];return b.push(a.values.Q1),a.values.hasOwnProperty("whisker_low")&&null!==a.values.whisker_low&&b.push(a.values.whisker_low),a.values.hasOwnProperty("outliers")&&null!==a.values.outliers&&(b=b.concat(a.values.outliers)),d3.min(b)})),y=d3.max(b.map(function(a){var b=[];return b.push(a.values.Q3),a.values.hasOwnProperty("whisker_high")&&null!==a.values.whisker_high&&b.push(a.values.whisker_high),a.values.hasOwnProperty("outliers")&&null!==a.values.outliers&&(b=b.concat(a.values.outliers)),d3.max(b)}));w=[x,y]}n.domain(d||w),n.range(f||[p,0]),g=g||m,h=h||n.copy().range([n(0),n(0)]);{var z=r.selectAll("g.nv-wrap").data([b]);z.enter().append("g").attr("class","nvd3 nv-wrap")}z.attr("transform","translate("+i.left+","+i.top+")");var A=z.selectAll(".nv-boxplot").data(function(a){return a}),B=A.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6);A.attr("class","nv-boxplot").attr("transform",function(a,b){return"translate("+(m(o(a,b))+.05*m.rangeBand())+", 0)"}).classed("hover",function(a){return a.hover}),A.watchTransition(v,"nv-boxplot: boxplots").style("stroke-opacity",1).style("fill-opacity",.75).delay(function(a,c){return c*t/b.length}).attr("transform",function(a,b){return"translate("+(m(o(a,b))+.05*m.rangeBand())+", 0)"}),A.exit().remove(),B.each(function(a,b){var c=d3.select(this);["low","high"].forEach(function(d){a.values.hasOwnProperty("whisker_"+d)&&null!==a.values["whisker_"+d]&&(c.append("line").style("stroke",a.color?a.color:q(a,b)).attr("class","nv-boxplot-whisker nv-boxplot-"+d),c.append("line").style("stroke",a.color?a.color:q(a,b)).attr("class","nv-boxplot-tick nv-boxplot-"+d))})});var C=A.selectAll(".nv-boxplot-outlier").data(function(a){return a.values.hasOwnProperty("outliers")&&null!==a.values.outliers?a.values.outliers:[]});C.enter().append("circle").style("fill",function(a,b,c){return q(a,c)}).style("stroke",function(a,b,c){return q(a,c)}).on("mouseover",function(a,b,c){d3.select(this).classed("hover",!0),s.elementMouseover({series:{key:a,color:q(a,c)},e:d3.event})}).on("mouseout",function(a,b,c){d3.select(this).classed("hover",!1),s.elementMouseout({series:{key:a,color:q(a,c)},e:d3.event})}).on("mousemove",function(){s.elementMousemove({e:d3.event})}),C.attr("class","nv-boxplot-outlier"),C.watchTransition(v,"nv-boxplot: nv-boxplot-outlier").attr("cx",.45*m.rangeBand()).attr("cy",function(a){return n(a)}).attr("r","3"),C.exit().remove();var D=function(){return null===u?.9*m.rangeBand():Math.min(75,.9*m.rangeBand())},E=function(){return.45*m.rangeBand()-D()/2},F=function(){return.45*m.rangeBand()+D()/2};["low","high"].forEach(function(a){var b="low"===a?"Q1":"Q3";A.select("line.nv-boxplot-whisker.nv-boxplot-"+a).watchTransition(v,"nv-boxplot: boxplots").attr("x1",.45*m.rangeBand()).attr("y1",function(b){return n(b.values["whisker_"+a])}).attr("x2",.45*m.rangeBand()).attr("y2",function(a){return n(a.values[b])}),A.select("line.nv-boxplot-tick.nv-boxplot-"+a).watchTransition(v,"nv-boxplot: boxplots").attr("x1",E).attr("y1",function(b){return n(b.values["whisker_"+a])}).attr("x2",F).attr("y2",function(b){return n(b.values["whisker_"+a])})}),["low","high"].forEach(function(a){B.selectAll(".nv-boxplot-"+a).on("mouseover",function(b,c,d){d3.select(this).classed("hover",!0),s.elementMouseover({series:{key:b.values["whisker_"+a],color:q(b,d)},e:d3.event})}).on("mouseout",function(b,c,d){d3.select(this).classed("hover",!1),s.elementMouseout({series:{key:b.values["whisker_"+a],color:q(b,d)},e:d3.event})}).on("mousemove",function(){s.elementMousemove({e:d3.event})})}),B.append("rect").attr("class","nv-boxplot-box").on("mouseover",function(a,b){d3.select(this).classed("hover",!0),s.elementMouseover({key:a.label,value:a.label,series:[{key:"Q3",value:a.values.Q3,color:a.color||q(a,b)},{key:"Q2",value:a.values.Q2,color:a.color||q(a,b)},{key:"Q1",value:a.values.Q1,color:a.color||q(a,b)}],data:a,index:b,e:d3.event})}).on("mouseout",function(a,b){d3.select(this).classed("hover",!1),s.elementMouseout({key:a.label,value:a.label,series:[{key:"Q3",value:a.values.Q3,color:a.color||q(a,b)},{key:"Q2",value:a.values.Q2,color:a.color||q(a,b)},{key:"Q1",value:a.values.Q1,color:a.color||q(a,b)}],data:a,index:b,e:d3.event})}).on("mousemove",function(){s.elementMousemove({e:d3.event})}),A.select("rect.nv-boxplot-box").watchTransition(v,"nv-boxplot: boxes").attr("y",function(a){return n(a.values.Q3)}).attr("width",D).attr("x",E).attr("height",function(a){return Math.abs(n(a.values.Q3)-n(a.values.Q1))||1}).style("fill",function(a,b){return a.color||q(a,b)}).style("stroke",function(a,b){return a.color||q(a,b)}),B.append("line").attr("class","nv-boxplot-median"),A.select("line.nv-boxplot-median").watchTransition(v,"nv-boxplot: boxplots line").attr("x1",E).attr("y1",function(a){return n(a.values.Q2)}).attr("x2",F).attr("y2",function(a){return n(a.values.Q2)}),g=m.copy(),h=n.copy()}),v.renderEnd("nv-boxplot immediate"),b}var c,d,e,f,g,h,i={top:0,right:0,bottom:0,left:0},j=960,k=500,l=Math.floor(1e4*Math.random()),m=d3.scale.ordinal(),n=d3.scale.linear(),o=function(a){return a.x},p=function(a){return a.y},q=a.utils.defaultColor(),r=null,s=d3.dispatch("elementMouseover","elementMouseout","elementMousemove","renderEnd"),t=250,u=null,v=a.utils.renderWatch(s,t);return b.dispatch=s,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return j},set:function(a){j=a}},height:{get:function(){return k},set:function(a){k=a}},maxBoxWidth:{get:function(){return u},set:function(a){u=a}},x:{get:function(){return o},set:function(a){o=a}},y:{get:function(){return p},set:function(a){p=a}},xScale:{get:function(){return m},set:function(a){m=a}},yScale:{get:function(){return n},set:function(a){n=a}},xDomain:{get:function(){return c},set:function(a){c=a}},yDomain:{get:function(){return d},set:function(a){d=a}},xRange:{get:function(){return e},set:function(a){e=a}},yRange:{get:function(){return f},set:function(a){f=a}},id:{get:function(){return l},set:function(a){l=a}},margin:{get:function(){return i},set:function(a){i.top=void 0!==a.top?a.top:i.top,i.right=void 0!==a.right?a.right:i.right,i.bottom=void 0!==a.bottom?a.bottom:i.bottom,i.left=void 0!==a.left?a.left:i.left}},color:{get:function(){return q},set:function(b){q=a.utils.getColor(b)}},duration:{get:function(){return t},set:function(a){t=a,v.reset(t)}}}),a.utils.initOptions(b),b},a.models.boxPlotChart=function(){"use strict";function b(k){return t.reset(),t.models(e),l&&t.models(f),m&&t.models(g),k.each(function(k){var p=d3.select(this);a.utils.initSVG(p);var t=(i||parseInt(p.style("width"))||960)-h.left-h.right,u=(j||parseInt(p.style("height"))||400)-h.top-h.bottom;if(b.update=function(){r.beforeUpdate(),p.transition().duration(s).call(b)},b.container=this,!(k&&k.length&&k.filter(function(a){return a.values.hasOwnProperty("Q1")&&a.values.hasOwnProperty("Q2")&&a.values.hasOwnProperty("Q3")}).length)){var v=p.selectAll(".nv-noData").data([q]);return v.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),v.attr("x",h.left+t/2).attr("y",h.top+u/2).text(function(a){return a}),b}p.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale().clamp(!0);var w=p.selectAll("g.nv-wrap.nv-boxPlotWithAxes").data([k]),x=w.enter().append("g").attr("class","nvd3 nv-wrap nv-boxPlotWithAxes").append("g"),y=x.append("defs"),z=w.select("g"); -x.append("g").attr("class","nv-x nv-axis"),x.append("g").attr("class","nv-y nv-axis").append("g").attr("class","nv-zeroLine").append("line"),x.append("g").attr("class","nv-barsWrap"),z.attr("transform","translate("+h.left+","+h.top+")"),n&&z.select(".nv-y.nv-axis").attr("transform","translate("+t+",0)"),e.width(t).height(u);var A=z.select(".nv-barsWrap").datum(k.filter(function(a){return!a.disabled}));if(A.transition().call(e),y.append("clipPath").attr("id","nv-x-label-clip-"+e.id()).append("rect"),z.select("#nv-x-label-clip-"+e.id()+" rect").attr("width",c.rangeBand()*(o?2:1)).attr("height",16).attr("x",-c.rangeBand()/(o?1:2)),l){f.scale(c).ticks(a.utils.calcTicksX(t/100,k)).tickSize(-u,0),z.select(".nv-x.nv-axis").attr("transform","translate(0,"+d.range()[0]+")"),z.select(".nv-x.nv-axis").call(f);var B=z.select(".nv-x.nv-axis").selectAll("g");o&&B.selectAll("text").attr("transform",function(a,b,c){return"translate(0,"+(c%2==0?"5":"17")+")"})}m&&(g.scale(d).ticks(Math.floor(u/36)).tickSize(-t,0),z.select(".nv-y.nv-axis").call(g)),z.select(".nv-zeroLine line").attr("x1",0).attr("x2",t).attr("y1",d(0)).attr("y2",d(0))}),t.renderEnd("nv-boxplot chart immediate"),b}var c,d,e=a.models.boxPlot(),f=a.models.axis(),g=a.models.axis(),h={top:15,right:10,bottom:50,left:60},i=null,j=null,k=a.utils.getColor(),l=!0,m=!0,n=!1,o=!1,p=a.models.tooltip(),q="No Data Available.",r=d3.dispatch("tooltipShow","tooltipHide","beforeUpdate","renderEnd"),s=250;f.orient("bottom").showMaxMin(!1).tickFormat(function(a){return a}),g.orient(n?"right":"left").tickFormat(d3.format(",.1f")),p.duration(0);var t=a.utils.renderWatch(r,s);return e.dispatch.on("elementMouseover.tooltip",function(a){p.data(a).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(a){p.data(a).hidden(!0)}),e.dispatch.on("elementMousemove.tooltip",function(){p.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=r,b.boxplot=e,b.xAxis=f,b.yAxis=g,b.tooltip=p,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return i},set:function(a){i=a}},height:{get:function(){return j},set:function(a){j=a}},staggerLabels:{get:function(){return o},set:function(a){o=a}},showXAxis:{get:function(){return l},set:function(a){l=a}},showYAxis:{get:function(){return m},set:function(a){m=a}},tooltips:{get:function(){return tooltips},set:function(a){tooltips=a}},tooltipContent:{get:function(){return p},set:function(a){p=a}},noData:{get:function(){return q},set:function(a){q=a}},margin:{get:function(){return h},set:function(a){h.top=void 0!==a.top?a.top:h.top,h.right=void 0!==a.right?a.right:h.right,h.bottom=void 0!==a.bottom?a.bottom:h.bottom,h.left=void 0!==a.left?a.left:h.left}},duration:{get:function(){return s},set:function(a){s=a,t.reset(s),e.duration(s),f.duration(s),g.duration(s)}},color:{get:function(){return k},set:function(b){k=a.utils.getColor(b),e.color(k)}},rightAlignYAxis:{get:function(){return n},set:function(a){n=a,g.orient(a?"right":"left")}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.bullet=function(){"use strict";function b(d){return d.each(function(b,d){var p=m-c.left-c.right,s=n-c.top-c.bottom;o=d3.select(this),a.utils.initSVG(o);{var t=f.call(this,b,d).slice().sort(d3.descending),u=g.call(this,b,d).slice().sort(d3.descending),v=h.call(this,b,d).slice().sort(d3.descending),w=i.call(this,b,d).slice(),x=j.call(this,b,d).slice(),y=k.call(this,b,d).slice(),z=d3.scale.linear().domain(d3.extent(d3.merge([l,t]))).range(e?[p,0]:[0,p]);this.__chart__||d3.scale.linear().domain([0,1/0]).range(z.range())}this.__chart__=z;var A=d3.min(t),B=d3.max(t),C=t[1],D=o.selectAll("g.nv-wrap.nv-bullet").data([b]),E=D.enter().append("g").attr("class","nvd3 nv-wrap nv-bullet"),F=E.append("g"),G=D.select("g");F.append("rect").attr("class","nv-range nv-rangeMax"),F.append("rect").attr("class","nv-range nv-rangeAvg"),F.append("rect").attr("class","nv-range nv-rangeMin"),F.append("rect").attr("class","nv-measure"),D.attr("transform","translate("+c.left+","+c.top+")");var H=function(a){return Math.abs(z(a)-z(0))},I=function(a){return z(0>a?a:0)};G.select("rect.nv-rangeMax").attr("height",s).attr("width",H(B>0?B:A)).attr("x",I(B>0?B:A)).datum(B>0?B:A),G.select("rect.nv-rangeAvg").attr("height",s).attr("width",H(C)).attr("x",I(C)).datum(C),G.select("rect.nv-rangeMin").attr("height",s).attr("width",H(B)).attr("x",I(B)).attr("width",H(B>0?A:B)).attr("x",I(B>0?A:B)).datum(B>0?A:B),G.select("rect.nv-measure").style("fill",q).attr("height",s/3).attr("y",s/3).attr("width",0>v?z(0)-z(v[0]):z(v[0])-z(0)).attr("x",I(v)).on("mouseover",function(){r.elementMouseover({value:v[0],label:y[0]||"Current",color:d3.select(this).style("fill")})}).on("mousemove",function(){r.elementMousemove({value:v[0],label:y[0]||"Current",color:d3.select(this).style("fill")})}).on("mouseout",function(){r.elementMouseout({value:v[0],label:y[0]||"Current",color:d3.select(this).style("fill")})});var J=s/6,K=u.map(function(a,b){return{value:a,label:x[b]}});F.selectAll("path.nv-markerTriangle").data(K).enter().append("path").attr("class","nv-markerTriangle").attr("transform",function(a){return"translate("+z(a.value)+","+s/2+")"}).attr("d","M0,"+J+"L"+J+","+-J+" "+-J+","+-J+"Z").on("mouseover",function(a){r.elementMouseover({value:a.value,label:a.label||"Previous",color:d3.select(this).style("fill"),pos:[z(a.value),s/2]})}).on("mousemove",function(a){r.elementMousemove({value:a.value,label:a.label||"Previous",color:d3.select(this).style("fill")})}).on("mouseout",function(a){r.elementMouseout({value:a.value,label:a.label||"Previous",color:d3.select(this).style("fill")})}),D.selectAll(".nv-range").on("mouseover",function(a,b){var c=w[b]||(b?1==b?"Mean":"Minimum":"Maximum");r.elementMouseover({value:a,label:c,color:d3.select(this).style("fill")})}).on("mousemove",function(){r.elementMousemove({value:v[0],label:y[0]||"Previous",color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){var c=w[b]||(b?1==b?"Mean":"Minimum":"Maximum");r.elementMouseout({value:a,label:c,color:d3.select(this).style("fill")})})}),b}var c={top:0,right:0,bottom:0,left:0},d="left",e=!1,f=function(a){return a.ranges},g=function(a){return a.markers?a.markers:[0]},h=function(a){return a.measures},i=function(a){return a.rangeLabels?a.rangeLabels:[]},j=function(a){return a.markerLabels?a.markerLabels:[]},k=function(a){return a.measureLabels?a.measureLabels:[]},l=[0],m=380,n=30,o=null,p=null,q=a.utils.getColor(["#1f77b4"]),r=d3.dispatch("elementMouseover","elementMouseout","elementMousemove");return b.dispatch=r,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{ranges:{get:function(){return f},set:function(a){f=a}},markers:{get:function(){return g},set:function(a){g=a}},measures:{get:function(){return h},set:function(a){h=a}},forceX:{get:function(){return l},set:function(a){l=a}},width:{get:function(){return m},set:function(a){m=a}},height:{get:function(){return n},set:function(a){n=a}},tickFormat:{get:function(){return p},set:function(a){p=a}},margin:{get:function(){return c},set:function(a){c.top=void 0!==a.top?a.top:c.top,c.right=void 0!==a.right?a.right:c.right,c.bottom=void 0!==a.bottom?a.bottom:c.bottom,c.left=void 0!==a.left?a.left:c.left}},orient:{get:function(){return d},set:function(a){d=a,e="right"==d||"bottom"==d}},color:{get:function(){return q},set:function(b){q=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.bulletChart=function(){"use strict";function b(d){return d.each(function(e,o){var p=d3.select(this);a.utils.initSVG(p);var q=a.utils.availableWidth(k,p,g),r=l-g.top-g.bottom;if(b.update=function(){b(d)},b.container=this,!e||!h.call(this,e,o))return a.utils.noData(b,p),b;p.selectAll(".nv-noData").remove();var s=h.call(this,e,o).slice().sort(d3.descending),t=i.call(this,e,o).slice().sort(d3.descending),u=j.call(this,e,o).slice().sort(d3.descending),v=p.selectAll("g.nv-wrap.nv-bulletChart").data([e]),w=v.enter().append("g").attr("class","nvd3 nv-wrap nv-bulletChart"),x=w.append("g"),y=v.select("g");x.append("g").attr("class","nv-bulletWrap"),x.append("g").attr("class","nv-titles"),v.attr("transform","translate("+g.left+","+g.top+")");var z=d3.scale.linear().domain([0,Math.max(s[0],t[0],u[0])]).range(f?[q,0]:[0,q]),A=this.__chart__||d3.scale.linear().domain([0,1/0]).range(z.range());this.__chart__=z;var B=x.select(".nv-titles").append("g").attr("text-anchor","end").attr("transform","translate(-6,"+(l-g.top-g.bottom)/2+")");B.append("text").attr("class","nv-title").text(function(a){return a.title}),B.append("text").attr("class","nv-subtitle").attr("dy","1em").text(function(a){return a.subtitle}),c.width(q).height(r);var C=y.select(".nv-bulletWrap");d3.transition(C).call(c);var D=m||z.tickFormat(q/100),E=y.selectAll("g.nv-tick").data(z.ticks(n?n:q/50),function(a){return this.textContent||D(a)}),F=E.enter().append("g").attr("class","nv-tick").attr("transform",function(a){return"translate("+A(a)+",0)"}).style("opacity",1e-6);F.append("line").attr("y1",r).attr("y2",7*r/6),F.append("text").attr("text-anchor","middle").attr("dy","1em").attr("y",7*r/6).text(D);var G=d3.transition(E).attr("transform",function(a){return"translate("+z(a)+",0)"}).style("opacity",1);G.select("line").attr("y1",r).attr("y2",7*r/6),G.select("text").attr("y",7*r/6),d3.transition(E.exit()).attr("transform",function(a){return"translate("+z(a)+",0)"}).style("opacity",1e-6).remove()}),d3.timer.flush(),b}var c=a.models.bullet(),d=a.models.tooltip(),e="left",f=!1,g={top:5,right:40,bottom:20,left:120},h=function(a){return a.ranges},i=function(a){return a.markers?a.markers:[0]},j=function(a){return a.measures},k=null,l=55,m=null,n=null,o=null,p=d3.dispatch("tooltipShow","tooltipHide");return d.duration(0).headerEnabled(!1),c.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:a.label,value:a.value,color:a.color},d.data(a).hidden(!1)}),c.dispatch.on("elementMouseout.tooltip",function(){d.hidden(!0)}),c.dispatch.on("elementMousemove.tooltip",function(){d.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.bullet=c,b.dispatch=p,b.tooltip=d,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{ranges:{get:function(){return h},set:function(a){h=a}},markers:{get:function(){return i},set:function(a){i=a}},measures:{get:function(){return j},set:function(a){j=a}},width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},tickFormat:{get:function(){return m},set:function(a){m=a}},ticks:{get:function(){return n},set:function(a){n=a}},noData:{get:function(){return o},set:function(a){o=a}},tooltips:{get:function(){return d.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),d.enabled(!!b)}},tooltipContent:{get:function(){return d.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),d.contentGenerator(b)}},margin:{get:function(){return g},set:function(a){g.top=void 0!==a.top?a.top:g.top,g.right=void 0!==a.right?a.right:g.right,g.bottom=void 0!==a.bottom?a.bottom:g.bottom,g.left=void 0!==a.left?a.left:g.left}},orient:{get:function(){return e},set:function(a){e=a,f="right"==e||"bottom"==e}}}),a.utils.inheritOptions(b,c),a.utils.initOptions(b),b},a.models.candlestickBar=function(){"use strict";function b(x){return x.each(function(b){c=d3.select(this);var x=a.utils.availableWidth(i,c,h),y=a.utils.availableHeight(j,c,h);a.utils.initSVG(c);var A=x/b[0].values.length*.45;l.domain(d||d3.extent(b[0].values.map(n).concat(t))),l.range(v?f||[.5*x/b[0].values.length,x*(b[0].values.length-.5)/b[0].values.length]:f||[5+A/2,x-A/2-5]),m.domain(e||[d3.min(b[0].values.map(s).concat(u)),d3.max(b[0].values.map(r).concat(u))]).range(g||[y,0]),l.domain()[0]===l.domain()[1]&&l.domain(l.domain()[0]?[l.domain()[0]-.01*l.domain()[0],l.domain()[1]+.01*l.domain()[1]]:[-1,1]),m.domain()[0]===m.domain()[1]&&m.domain(m.domain()[0]?[m.domain()[0]+.01*m.domain()[0],m.domain()[1]-.01*m.domain()[1]]:[-1,1]);var B=d3.select(this).selectAll("g.nv-wrap.nv-candlestickBar").data([b[0].values]),C=B.enter().append("g").attr("class","nvd3 nv-wrap nv-candlestickBar"),D=C.append("defs"),E=C.append("g"),F=B.select("g");E.append("g").attr("class","nv-ticks"),B.attr("transform","translate("+h.left+","+h.top+")"),c.on("click",function(a,b){z.chartClick({data:a,index:b,pos:d3.event,id:k})}),D.append("clipPath").attr("id","nv-chart-clip-path-"+k).append("rect"),B.select("#nv-chart-clip-path-"+k+" rect").attr("width",x).attr("height",y),F.attr("clip-path",w?"url(#nv-chart-clip-path-"+k+")":"");var G=B.select(".nv-ticks").selectAll(".nv-tick").data(function(a){return a});G.exit().remove();{var H=G.enter().append("g").attr("class",function(a,b,c){return(p(a,b)>q(a,b)?"nv-tick negative":"nv-tick positive")+" nv-tick-"+c+"-"+b});H.append("line").attr("class","nv-candlestick-lines").attr("transform",function(a,b){return"translate("+l(n(a,b))+",0)"}).attr("x1",0).attr("y1",function(a,b){return m(r(a,b))}).attr("x2",0).attr("y2",function(a,b){return m(s(a,b))}),H.append("rect").attr("class","nv-candlestick-rects nv-bars").attr("transform",function(a,b){return"translate("+(l(n(a,b))-A/2)+","+(m(o(a,b))-(p(a,b)>q(a,b)?m(q(a,b))-m(p(a,b)):0))+")"}).attr("x",0).attr("y",0).attr("width",A).attr("height",function(a,b){var c=p(a,b),d=q(a,b);return c>d?m(d)-m(c):m(c)-m(d)})}c.selectAll(".nv-candlestick-lines").transition().attr("transform",function(a,b){return"translate("+l(n(a,b))+",0)"}).attr("x1",0).attr("y1",function(a,b){return m(r(a,b))}).attr("x2",0).attr("y2",function(a,b){return m(s(a,b))}),c.selectAll(".nv-candlestick-rects").transition().attr("transform",function(a,b){return"translate("+(l(n(a,b))-A/2)+","+(m(o(a,b))-(p(a,b)>q(a,b)?m(q(a,b))-m(p(a,b)):0))+")"}).attr("x",0).attr("y",0).attr("width",A).attr("height",function(a,b){var c=p(a,b),d=q(a,b);return c>d?m(d)-m(c):m(c)-m(d)})}),b}var c,d,e,f,g,h={top:0,right:0,bottom:0,left:0},i=null,j=null,k=Math.floor(1e4*Math.random()),l=d3.scale.linear(),m=d3.scale.linear(),n=function(a){return a.x},o=function(a){return a.y},p=function(a){return a.open},q=function(a){return a.close},r=function(a){return a.high},s=function(a){return a.low},t=[],u=[],v=!1,w=!0,x=a.utils.defaultColor(),y=!1,z=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd","chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove");return b.highlightPoint=function(a,d){b.clearHighlights(),c.select(".nv-candlestickBar .nv-tick-0-"+a).classed("hover",d)},b.clearHighlights=function(){c.select(".nv-candlestickBar .nv-tick.hover").classed("hover",!1)},b.dispatch=z,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return i},set:function(a){i=a}},height:{get:function(){return j},set:function(a){j=a}},xScale:{get:function(){return l},set:function(a){l=a}},yScale:{get:function(){return m},set:function(a){m=a}},xDomain:{get:function(){return d},set:function(a){d=a}},yDomain:{get:function(){return e},set:function(a){e=a}},xRange:{get:function(){return f},set:function(a){f=a}},yRange:{get:function(){return g},set:function(a){g=a}},forceX:{get:function(){return t},set:function(a){t=a}},forceY:{get:function(){return u},set:function(a){u=a}},padData:{get:function(){return v},set:function(a){v=a}},clipEdge:{get:function(){return w},set:function(a){w=a}},id:{get:function(){return k},set:function(a){k=a}},interactive:{get:function(){return y},set:function(a){y=a}},x:{get:function(){return n},set:function(a){n=a}},y:{get:function(){return o},set:function(a){o=a}},open:{get:function(){return p()},set:function(a){p=a}},close:{get:function(){return q()},set:function(a){q=a}},high:{get:function(){return r},set:function(a){r=a}},low:{get:function(){return s},set:function(a){s=a}},margin:{get:function(){return h},set:function(a){h.top=void 0!=a.top?a.top:h.top,h.right=void 0!=a.right?a.right:h.right,h.bottom=void 0!=a.bottom?a.bottom:h.bottom,h.left=void 0!=a.left?a.left:h.left}},color:{get:function(){return x},set:function(b){x=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.cumulativeLineChart=function(){"use strict";function b(l){return H.reset(),H.models(f),r&&H.models(g),s&&H.models(h),l.each(function(l){function A(){d3.select(b.container).style("cursor","ew-resize")}function E(){G.x=d3.event.x,G.i=Math.round(F.invert(G.x)),K()}function H(){d3.select(b.container).style("cursor","auto"),y.index=G.i,C.stateChange(y)}function K(){bb.data([G]);var a=b.duration();b.duration(0),b.update(),b.duration(a)}var L=d3.select(this);a.utils.initSVG(L),L.classed("nv-chart-"+x,!0);var M=this,N=a.utils.availableWidth(o,L,m),O=a.utils.availableHeight(p,L,m);if(b.update=function(){0===D?L.call(b):L.transition().duration(D).call(b)},b.container=this,y.setter(J(l),b.update).getter(I(l)).update(),y.disabled=l.map(function(a){return!!a.disabled}),!z){var P;z={};for(P in y)z[P]=y[P]instanceof Array?y[P].slice(0):y[P]}var Q=d3.behavior.drag().on("dragstart",A).on("drag",E).on("dragend",H);if(!(l&&l.length&&l.filter(function(a){return a.values.length}).length))return a.utils.noData(b,L),b;if(L.selectAll(".nv-noData").remove(),d=f.xScale(),e=f.yScale(),w)f.yDomain(null);else{var R=l.filter(function(a){return!a.disabled}).map(function(a){var b=d3.extent(a.values,f.y());return b[0]<-.95&&(b[0]=-.95),[(b[0]-b[1])/(1+b[1]),(b[1]-b[0])/(1+b[0])]}),S=[d3.min(R,function(a){return a[0]}),d3.max(R,function(a){return a[1]})];f.yDomain(S)}F.domain([0,l[0].values.length-1]).range([0,N]).clamp(!0);var l=c(G.i,l),T=v?"none":"all",U=L.selectAll("g.nv-wrap.nv-cumulativeLine").data([l]),V=U.enter().append("g").attr("class","nvd3 nv-wrap nv-cumulativeLine").append("g"),W=U.select("g");if(V.append("g").attr("class","nv-interactive"),V.append("g").attr("class","nv-x nv-axis").style("pointer-events","none"),V.append("g").attr("class","nv-y nv-axis"),V.append("g").attr("class","nv-background"),V.append("g").attr("class","nv-linesWrap").style("pointer-events",T),V.append("g").attr("class","nv-avgLinesWrap").style("pointer-events","none"),V.append("g").attr("class","nv-legendWrap"),V.append("g").attr("class","nv-controlsWrap"),q&&(i.width(N),W.select(".nv-legendWrap").datum(l).call(i),m.top!=i.height()&&(m.top=i.height(),O=a.utils.availableHeight(p,L,m)),W.select(".nv-legendWrap").attr("transform","translate(0,"+-m.top+")")),u){var X=[{key:"Re-scale y-axis",disabled:!w}];j.width(140).color(["#444","#444","#444"]).rightAlign(!1).margin({top:5,right:0,bottom:5,left:20}),W.select(".nv-controlsWrap").datum(X).attr("transform","translate(0,"+-m.top+")").call(j)}U.attr("transform","translate("+m.left+","+m.top+")"),t&&W.select(".nv-y.nv-axis").attr("transform","translate("+N+",0)");var Y=l.filter(function(a){return a.tempDisabled});U.select(".tempDisabled").remove(),Y.length&&U.append("text").attr("class","tempDisabled").attr("x",N/2).attr("y","-.71em").style("text-anchor","end").text(Y.map(function(a){return a.key}).join(", ")+" values cannot be calculated for this time period."),v&&(k.width(N).height(O).margin({left:m.left,top:m.top}).svgContainer(L).xScale(d),U.select(".nv-interactive").call(k)),V.select(".nv-background").append("rect"),W.select(".nv-background rect").attr("width",N).attr("height",O),f.y(function(a){return a.display.y}).width(N).height(O).color(l.map(function(a,b){return a.color||n(a,b)}).filter(function(a,b){return!l[b].disabled&&!l[b].tempDisabled}));var Z=W.select(".nv-linesWrap").datum(l.filter(function(a){return!a.disabled&&!a.tempDisabled}));Z.call(f),l.forEach(function(a,b){a.seriesIndex=b});var $=l.filter(function(a){return!a.disabled&&!!B(a)}),_=W.select(".nv-avgLinesWrap").selectAll("line").data($,function(a){return a.key}),ab=function(a){var b=e(B(a));return 0>b?0:b>O?O:b};_.enter().append("line").style("stroke-width",2).style("stroke-dasharray","10,10").style("stroke",function(a){return f.color()(a,a.seriesIndex)}).attr("x1",0).attr("x2",N).attr("y1",ab).attr("y2",ab),_.style("stroke-opacity",function(a){var b=e(B(a));return 0>b||b>O?0:1}).attr("x1",0).attr("x2",N).attr("y1",ab).attr("y2",ab),_.exit().remove();var bb=Z.selectAll(".nv-indexLine").data([G]);bb.enter().append("rect").attr("class","nv-indexLine").attr("width",3).attr("x",-2).attr("fill","red").attr("fill-opacity",.5).style("pointer-events","all").call(Q),bb.attr("transform",function(a){return"translate("+F(a.i)+",0)"}).attr("height",O),r&&(g.scale(d)._ticks(a.utils.calcTicksX(N/70,l)).tickSize(-O,0),W.select(".nv-x.nv-axis").attr("transform","translate(0,"+e.range()[0]+")"),W.select(".nv-x.nv-axis").call(g)),s&&(h.scale(e)._ticks(a.utils.calcTicksY(O/36,l)).tickSize(-N,0),W.select(".nv-y.nv-axis").call(h)),W.select(".nv-background rect").on("click",function(){G.x=d3.mouse(this)[0],G.i=Math.round(F.invert(G.x)),y.index=G.i,C.stateChange(y),K()}),f.dispatch.on("elementClick",function(a){G.i=a.pointIndex,G.x=F(G.i),y.index=G.i,C.stateChange(y),K()}),j.dispatch.on("legendClick",function(a){a.disabled=!a.disabled,w=!a.disabled,y.rescaleY=w,C.stateChange(y),b.update()}),i.dispatch.on("stateChange",function(a){for(var c in a)y[c]=a[c];C.stateChange(y),b.update()}),k.dispatch.on("elementMousemove",function(c){f.clearHighlights();var d,e,i,j=[];if(l.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(g,h){e=a.interactiveBisect(g.values,c.pointXValue,b.x()),f.highlightPoint(h,e,!0);var k=g.values[e];"undefined"!=typeof k&&("undefined"==typeof d&&(d=k),"undefined"==typeof i&&(i=b.xScale()(b.x()(k,e))),j.push({key:g.key,value:b.y()(k,e),color:n(g,g.seriesIndex)}))}),j.length>2){var o=b.yScale().invert(c.mouseY),p=Math.abs(b.yScale().domain()[0]-b.yScale().domain()[1]),q=.03*p,r=a.nearestValueIndex(j.map(function(a){return a.value}),o,q);null!==r&&(j[r].highlight=!0)}var s=g.tickFormat()(b.x()(d,e),e);k.tooltip.position({left:i+m.left,top:c.mouseY+m.top}).chartContainer(M.parentNode).valueFormatter(function(a){return h.tickFormat()(a)}).data({value:s,series:j})(),k.renderGuideLine(i)}),k.dispatch.on("elementMouseout",function(){f.clearHighlights()}),C.on("changeState",function(a){"undefined"!=typeof a.disabled&&(l.forEach(function(b,c){b.disabled=a.disabled[c]}),y.disabled=a.disabled),"undefined"!=typeof a.index&&(G.i=a.index,G.x=F(G.i),y.index=a.index,bb.data([G])),"undefined"!=typeof a.rescaleY&&(w=a.rescaleY),b.update()})}),H.renderEnd("cumulativeLineChart immediate"),b}function c(a,b){return K||(K=f.y()),b.map(function(b){if(!b.values)return b;var c=b.values[a];if(null==c)return b;var d=K(c,a);return-.95>d&&!E?(b.tempDisabled=!0,b):(b.tempDisabled=!1,b.values=b.values.map(function(a,b){return a.display={y:(K(a,b)-d)/(1+d)},a}),b)})}var d,e,f=a.models.line(),g=a.models.axis(),h=a.models.axis(),i=a.models.legend(),j=a.models.legend(),k=a.interactiveGuideline(),l=a.models.tooltip(),m={top:30,right:30,bottom:50,left:60},n=a.utils.defaultColor(),o=null,p=null,q=!0,r=!0,s=!0,t=!1,u=!0,v=!1,w=!0,x=f.id(),y=a.utils.state(),z=null,A=null,B=function(a){return a.average},C=d3.dispatch("stateChange","changeState","renderEnd"),D=250,E=!1;y.index=0,y.rescaleY=w,g.orient("bottom").tickPadding(7),h.orient(t?"right":"left"),l.valueFormatter(function(a,b){return h.tickFormat()(a,b)}).headerFormatter(function(a,b){return g.tickFormat()(a,b)}),j.updateState(!1);var F=d3.scale.linear(),G={i:0,x:0},H=a.utils.renderWatch(C,D),I=function(a){return function(){return{active:a.map(function(a){return!a.disabled}),index:G.i,rescaleY:w}}},J=function(a){return function(b){void 0!==b.index&&(G.i=b.index),void 0!==b.rescaleY&&(w=b.rescaleY),void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};f.dispatch.on("elementMouseover.tooltip",function(a){var c={x:b.x()(a.point),y:b.y()(a.point),color:a.point.color};a.point=c,l.data(a).position(a.pos).hidden(!1)}),f.dispatch.on("elementMouseout.tooltip",function(){l.hidden(!0)});var K=null;return b.dispatch=C,b.lines=f,b.legend=i,b.controls=j,b.xAxis=g,b.yAxis=h,b.interactiveLayer=k,b.state=y,b.tooltip=l,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return o},set:function(a){o=a}},height:{get:function(){return p},set:function(a){p=a}},rescaleY:{get:function(){return w},set:function(a){w=a}},showControls:{get:function(){return u},set:function(a){u=a}},showLegend:{get:function(){return q},set:function(a){q=a}},average:{get:function(){return B},set:function(a){B=a}},defaultState:{get:function(){return z},set:function(a){z=a}},noData:{get:function(){return A},set:function(a){A=a}},showXAxis:{get:function(){return r},set:function(a){r=a}},showYAxis:{get:function(){return s},set:function(a){s=a}},noErrorCheck:{get:function(){return E},set:function(a){E=a}},tooltips:{get:function(){return l.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),l.enabled(!!b)}},tooltipContent:{get:function(){return l.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),l.contentGenerator(b)}},margin:{get:function(){return m},set:function(a){m.top=void 0!==a.top?a.top:m.top,m.right=void 0!==a.right?a.right:m.right,m.bottom=void 0!==a.bottom?a.bottom:m.bottom,m.left=void 0!==a.left?a.left:m.left}},color:{get:function(){return n},set:function(b){n=a.utils.getColor(b),i.color(n)}},useInteractiveGuideline:{get:function(){return v},set:function(a){v=a,a===!0&&(b.interactive(!1),b.useVoronoi(!1))}},rightAlignYAxis:{get:function(){return t},set:function(a){t=a,h.orient(a?"right":"left")}},duration:{get:function(){return D},set:function(a){D=a,f.duration(D),g.duration(D),h.duration(D),H.reset(D)}}}),a.utils.inheritOptions(b,f),a.utils.initOptions(b),b},a.models.discreteBar=function(){"use strict";function b(m){return y.reset(),m.each(function(b){var m=k-j.left-j.right,x=l-j.top-j.bottom;c=d3.select(this),a.utils.initSVG(c),b.forEach(function(a,b){a.values.forEach(function(a){a.series=b})});var z=d&&e?[]:b.map(function(a){return a.values.map(function(a,b){return{x:p(a,b),y:q(a,b),y0:a.y0}})});n.domain(d||d3.merge(z).map(function(a){return a.x})).rangeBands(f||[0,m],.1),o.domain(e||d3.extent(d3.merge(z).map(function(a){return a.y}).concat(r))),o.range(t?g||[x-(o.domain()[0]<0?12:0),o.domain()[1]>0?12:0]:g||[x,0]),h=h||n,i=i||o.copy().range([o(0),o(0)]);{var A=c.selectAll("g.nv-wrap.nv-discretebar").data([b]),B=A.enter().append("g").attr("class","nvd3 nv-wrap nv-discretebar"),C=B.append("g");A.select("g")}C.append("g").attr("class","nv-groups"),A.attr("transform","translate("+j.left+","+j.top+")");var D=A.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a){return a.key});D.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6),D.exit().watchTransition(y,"discreteBar: exit groups").style("stroke-opacity",1e-6).style("fill-opacity",1e-6).remove(),D.attr("class",function(a,b){return"nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}),D.watchTransition(y,"discreteBar: groups").style("stroke-opacity",1).style("fill-opacity",.75);var E=D.selectAll("g.nv-bar").data(function(a){return a.values});E.exit().remove();var F=E.enter().append("g").attr("transform",function(a,b){return"translate("+(n(p(a,b))+.05*n.rangeBand())+", "+o(0)+")"}).on("mouseover",function(a,b){d3.select(this).classed("hover",!0),v.elementMouseover({data:a,index:b,color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){d3.select(this).classed("hover",!1),v.elementMouseout({data:a,index:b,color:d3.select(this).style("fill")})}).on("mousemove",function(a,b){v.elementMousemove({data:a,index:b,color:d3.select(this).style("fill")})}).on("click",function(a,b){v.elementClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()}).on("dblclick",function(a,b){v.elementDblClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()});F.append("rect").attr("height",0).attr("width",.9*n.rangeBand()/b.length),t?(F.append("text").attr("text-anchor","middle"),E.select("text").text(function(a,b){return u(q(a,b))}).watchTransition(y,"discreteBar: bars text").attr("x",.9*n.rangeBand()/2).attr("y",function(a,b){return q(a,b)<0?o(q(a,b))-o(0)+12:-4})):E.selectAll("text").remove(),E.attr("class",function(a,b){return q(a,b)<0?"nv-bar negative":"nv-bar positive"}).style("fill",function(a,b){return a.color||s(a,b)}).style("stroke",function(a,b){return a.color||s(a,b)}).select("rect").attr("class",w).watchTransition(y,"discreteBar: bars rect").attr("width",.9*n.rangeBand()/b.length),E.watchTransition(y,"discreteBar: bars").attr("transform",function(a,b){var c=n(p(a,b))+.05*n.rangeBand(),d=q(a,b)<0?o(0):o(0)-o(q(a,b))<1?o(0)-1:o(q(a,b));return"translate("+c+", "+d+")"}).select("rect").attr("height",function(a,b){return Math.max(Math.abs(o(q(a,b))-o(e&&e[0]||0))||1)}),h=n.copy(),i=o.copy()}),y.renderEnd("discreteBar immediate"),b}var c,d,e,f,g,h,i,j={top:0,right:0,bottom:0,left:0},k=960,l=500,m=Math.floor(1e4*Math.random()),n=d3.scale.ordinal(),o=d3.scale.linear(),p=function(a){return a.x},q=function(a){return a.y},r=[0],s=a.utils.defaultColor(),t=!1,u=d3.format(",.2f"),v=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),w="discreteBar",x=250,y=a.utils.renderWatch(v,x);return b.dispatch=v,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},forceY:{get:function(){return r},set:function(a){r=a}},showValues:{get:function(){return t},set:function(a){t=a}},x:{get:function(){return p},set:function(a){p=a}},y:{get:function(){return q},set:function(a){q=a}},xScale:{get:function(){return n},set:function(a){n=a}},yScale:{get:function(){return o},set:function(a){o=a}},xDomain:{get:function(){return d},set:function(a){d=a}},yDomain:{get:function(){return e},set:function(a){e=a}},xRange:{get:function(){return f},set:function(a){f=a}},yRange:{get:function(){return g},set:function(a){g=a}},valueFormat:{get:function(){return u},set:function(a){u=a}},id:{get:function(){return m},set:function(a){m=a}},rectClass:{get:function(){return w},set:function(a){w=a}},margin:{get:function(){return j},set:function(a){j.top=void 0!==a.top?a.top:j.top,j.right=void 0!==a.right?a.right:j.right,j.bottom=void 0!==a.bottom?a.bottom:j.bottom,j.left=void 0!==a.left?a.left:j.left}},color:{get:function(){return s},set:function(b){s=a.utils.getColor(b)}},duration:{get:function(){return x},set:function(a){x=a,y.reset(x)}}}),a.utils.initOptions(b),b},a.models.discreteBarChart=function(){"use strict";function b(h){return t.reset(),t.models(e),m&&t.models(f),n&&t.models(g),h.each(function(h){var l=d3.select(this);a.utils.initSVG(l);var q=a.utils.availableWidth(j,l,i),t=a.utils.availableHeight(k,l,i);if(b.update=function(){r.beforeUpdate(),l.transition().duration(s).call(b)},b.container=this,!(h&&h.length&&h.filter(function(a){return a.values.length}).length))return a.utils.noData(b,l),b;l.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale().clamp(!0);var u=l.selectAll("g.nv-wrap.nv-discreteBarWithAxes").data([h]),v=u.enter().append("g").attr("class","nvd3 nv-wrap nv-discreteBarWithAxes").append("g"),w=v.append("defs"),x=u.select("g");v.append("g").attr("class","nv-x nv-axis"),v.append("g").attr("class","nv-y nv-axis").append("g").attr("class","nv-zeroLine").append("line"),v.append("g").attr("class","nv-barsWrap"),x.attr("transform","translate("+i.left+","+i.top+")"),o&&x.select(".nv-y.nv-axis").attr("transform","translate("+q+",0)"),e.width(q).height(t);var y=x.select(".nv-barsWrap").datum(h.filter(function(a){return!a.disabled}));if(y.transition().call(e),w.append("clipPath").attr("id","nv-x-label-clip-"+e.id()).append("rect"),x.select("#nv-x-label-clip-"+e.id()+" rect").attr("width",c.rangeBand()*(p?2:1)).attr("height",16).attr("x",-c.rangeBand()/(p?1:2)),m){f.scale(c)._ticks(a.utils.calcTicksX(q/100,h)).tickSize(-t,0),x.select(".nv-x.nv-axis").attr("transform","translate(0,"+(d.range()[0]+(e.showValues()&&d.domain()[0]<0?16:0))+")"),x.select(".nv-x.nv-axis").call(f); -var z=x.select(".nv-x.nv-axis").selectAll("g");p&&z.selectAll("text").attr("transform",function(a,b,c){return"translate(0,"+(c%2==0?"5":"17")+")"})}n&&(g.scale(d)._ticks(a.utils.calcTicksY(t/36,h)).tickSize(-q,0),x.select(".nv-y.nv-axis").call(g)),x.select(".nv-zeroLine line").attr("x1",0).attr("x2",q).attr("y1",d(0)).attr("y2",d(0))}),t.renderEnd("discreteBar chart immediate"),b}var c,d,e=a.models.discreteBar(),f=a.models.axis(),g=a.models.axis(),h=a.models.tooltip(),i={top:15,right:10,bottom:50,left:60},j=null,k=null,l=a.utils.getColor(),m=!0,n=!0,o=!1,p=!1,q=null,r=d3.dispatch("beforeUpdate","renderEnd"),s=250;f.orient("bottom").showMaxMin(!1).tickFormat(function(a){return a}),g.orient(o?"right":"left").tickFormat(d3.format(",.1f")),h.duration(0).headerEnabled(!1).valueFormatter(function(a,b){return g.tickFormat()(a,b)}).keyFormatter(function(a,b){return f.tickFormat()(a,b)});var t=a.utils.renderWatch(r,s);return e.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:b.x()(a.data),value:b.y()(a.data),color:a.color},h.data(a).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(){h.hidden(!0)}),e.dispatch.on("elementMousemove.tooltip",function(){h.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=r,b.discretebar=e,b.xAxis=f,b.yAxis=g,b.tooltip=h,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return j},set:function(a){j=a}},height:{get:function(){return k},set:function(a){k=a}},staggerLabels:{get:function(){return p},set:function(a){p=a}},showXAxis:{get:function(){return m},set:function(a){m=a}},showYAxis:{get:function(){return n},set:function(a){n=a}},noData:{get:function(){return q},set:function(a){q=a}},tooltips:{get:function(){return h.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),h.enabled(!!b)}},tooltipContent:{get:function(){return h.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),h.contentGenerator(b)}},margin:{get:function(){return i},set:function(a){i.top=void 0!==a.top?a.top:i.top,i.right=void 0!==a.right?a.right:i.right,i.bottom=void 0!==a.bottom?a.bottom:i.bottom,i.left=void 0!==a.left?a.left:i.left}},duration:{get:function(){return s},set:function(a){s=a,t.reset(s),e.duration(s),f.duration(s),g.duration(s)}},color:{get:function(){return l},set:function(b){l=a.utils.getColor(b),e.color(l)}},rightAlignYAxis:{get:function(){return o},set:function(a){o=a,g.orient(a?"right":"left")}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.distribution=function(){"use strict";function b(k){return m.reset(),k.each(function(b){var k=(e-("x"===g?d.left+d.right:d.top+d.bottom),"x"==g?"y":"x"),l=d3.select(this);a.utils.initSVG(l),c=c||j;var n=l.selectAll("g.nv-distribution").data([b]),o=n.enter().append("g").attr("class","nvd3 nv-distribution"),p=(o.append("g"),n.select("g"));n.attr("transform","translate("+d.left+","+d.top+")");var q=p.selectAll("g.nv-dist").data(function(a){return a},function(a){return a.key});q.enter().append("g"),q.attr("class",function(a,b){return"nv-dist nv-series-"+b}).style("stroke",function(a,b){return i(a,b)});var r=q.selectAll("line.nv-dist"+g).data(function(a){return a.values});r.enter().append("line").attr(g+"1",function(a,b){return c(h(a,b))}).attr(g+"2",function(a,b){return c(h(a,b))}),m.transition(q.exit().selectAll("line.nv-dist"+g),"dist exit").attr(g+"1",function(a,b){return j(h(a,b))}).attr(g+"2",function(a,b){return j(h(a,b))}).style("stroke-opacity",0).remove(),r.attr("class",function(a,b){return"nv-dist"+g+" nv-dist"+g+"-"+b}).attr(k+"1",0).attr(k+"2",f),m.transition(r,"dist").attr(g+"1",function(a,b){return j(h(a,b))}).attr(g+"2",function(a,b){return j(h(a,b))}),c=j.copy()}),m.renderEnd("distribution immediate"),b}var c,d={top:0,right:0,bottom:0,left:0},e=400,f=8,g="x",h=function(a){return a[g]},i=a.utils.defaultColor(),j=d3.scale.linear(),k=250,l=d3.dispatch("renderEnd"),m=a.utils.renderWatch(l,k);return b.options=a.utils.optionsFunc.bind(b),b.dispatch=l,b.margin=function(a){return arguments.length?(d.top="undefined"!=typeof a.top?a.top:d.top,d.right="undefined"!=typeof a.right?a.right:d.right,d.bottom="undefined"!=typeof a.bottom?a.bottom:d.bottom,d.left="undefined"!=typeof a.left?a.left:d.left,b):d},b.width=function(a){return arguments.length?(e=a,b):e},b.axis=function(a){return arguments.length?(g=a,b):g},b.size=function(a){return arguments.length?(f=a,b):f},b.getData=function(a){return arguments.length?(h=d3.functor(a),b):h},b.scale=function(a){return arguments.length?(j=a,b):j},b.color=function(c){return arguments.length?(i=a.utils.getColor(c),b):i},b.duration=function(a){return arguments.length?(k=a,m.reset(k),b):k},b},a.models.furiousLegend=function(){"use strict";function b(p){function q(a,b){return"furious"!=o?"#000":m?a.disengaged?g(a,b):"#fff":m?void 0:a.disabled?g(a,b):"#fff"}function r(a,b){return m&&"furious"==o?a.disengaged?"#fff":g(a,b):a.disabled?"#fff":g(a,b)}return p.each(function(b){var p=d-c.left-c.right,s=d3.select(this);a.utils.initSVG(s);var t=s.selectAll("g.nv-legend").data([b]),u=(t.enter().append("g").attr("class","nvd3 nv-legend").append("g"),t.select("g"));t.attr("transform","translate("+c.left+","+c.top+")");var v,w=u.selectAll(".nv-series").data(function(a){return"furious"!=o?a:a.filter(function(a){return m?!0:!a.disengaged})}),x=w.enter().append("g").attr("class","nv-series");if("classic"==o)x.append("circle").style("stroke-width",2).attr("class","nv-legend-symbol").attr("r",5),v=w.select("circle");else if("furious"==o){x.append("rect").style("stroke-width",2).attr("class","nv-legend-symbol").attr("rx",3).attr("ry",3),v=w.select("rect"),x.append("g").attr("class","nv-check-box").property("innerHTML",'').attr("transform","translate(-10,-8)scale(0.5)");var y=w.select(".nv-check-box");y.each(function(a,b){d3.select(this).selectAll("path").attr("stroke",q(a,b))})}x.append("text").attr("text-anchor","start").attr("class","nv-legend-text").attr("dy",".32em").attr("dx","8");var z=w.select("text.nv-legend-text");w.on("mouseover",function(a,b){n.legendMouseover(a,b)}).on("mouseout",function(a,b){n.legendMouseout(a,b)}).on("click",function(a,b){n.legendClick(a,b);var c=w.data();if(k){if("classic"==o)l?(c.forEach(function(a){a.disabled=!0}),a.disabled=!1):(a.disabled=!a.disabled,c.every(function(a){return a.disabled})&&c.forEach(function(a){a.disabled=!1}));else if("furious"==o)if(m)a.disengaged=!a.disengaged,a.userDisabled=void 0==a.userDisabled?!!a.disabled:a.userDisabled,a.disabled=a.disengaged||a.userDisabled;else if(!m){a.disabled=!a.disabled,a.userDisabled=a.disabled;var d=c.filter(function(a){return!a.disengaged});d.every(function(a){return a.userDisabled})&&c.forEach(function(a){a.disabled=a.userDisabled=!1})}n.stateChange({disabled:c.map(function(a){return!!a.disabled}),disengaged:c.map(function(a){return!!a.disengaged})})}}).on("dblclick",function(a,b){if(("furious"!=o||!m)&&(n.legendDblclick(a,b),k)){var c=w.data();c.forEach(function(a){a.disabled=!0,"furious"==o&&(a.userDisabled=a.disabled)}),a.disabled=!1,"furious"==o&&(a.userDisabled=a.disabled),n.stateChange({disabled:c.map(function(a){return!!a.disabled})})}}),w.classed("nv-disabled",function(a){return a.userDisabled}),w.exit().remove(),z.attr("fill",q).text(f);var A;switch(o){case"furious":A=23;break;case"classic":A=20}if(h){var B=[];w.each(function(){var b,c=d3.select(this).select("text");try{if(b=c.node().getComputedTextLength(),0>=b)throw Error()}catch(d){b=a.utils.calcApproxTextWidth(c)}B.push(b+i)});for(var C=0,D=0,E=[];p>D&&Cp&&C>1;){E=[],C--;for(var F=0;F(E[F%C]||0)&&(E[F%C]=B[F]);D=E.reduce(function(a,b){return a+b})}for(var G=[],H=0,I=0;C>H;H++)G[H]=I,I+=E[H];w.attr("transform",function(a,b){return"translate("+G[b%C]+","+(5+Math.floor(b/C)*A)+")"}),j?u.attr("transform","translate("+(d-c.right-D)+","+c.top+")"):u.attr("transform","translate(0,"+c.top+")"),e=c.top+c.bottom+Math.ceil(B.length/C)*A}else{var J,K=5,L=5,M=0;w.attr("transform",function(){var a=d3.select(this).select("text").node().getComputedTextLength()+i;return J=L,dM&&(M=L),"translate("+J+","+K+")"}),u.attr("transform","translate("+(d-c.right-M)+","+c.top+")"),e=c.top+c.bottom+K+15}"furious"==o&&v.attr("width",function(a,b){return z[0][b].getComputedTextLength()+27}).attr("height",18).attr("y",-9).attr("x",-15),v.style("fill",r).style("stroke",function(a,b){return a.color||g(a,b)})}),b}var c={top:5,right:0,bottom:5,left:0},d=400,e=20,f=function(a){return a.key},g=a.utils.getColor(),h=!0,i=28,j=!0,k=!0,l=!1,m=!1,n=d3.dispatch("legendClick","legendDblclick","legendMouseover","legendMouseout","stateChange"),o="classic";return b.dispatch=n,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return d},set:function(a){d=a}},height:{get:function(){return e},set:function(a){e=a}},key:{get:function(){return f},set:function(a){f=a}},align:{get:function(){return h},set:function(a){h=a}},rightAlign:{get:function(){return j},set:function(a){j=a}},padding:{get:function(){return i},set:function(a){i=a}},updateState:{get:function(){return k},set:function(a){k=a}},radioButtonMode:{get:function(){return l},set:function(a){l=a}},expanded:{get:function(){return m},set:function(a){m=a}},vers:{get:function(){return o},set:function(a){o=a}},margin:{get:function(){return c},set:function(a){c.top=void 0!==a.top?a.top:c.top,c.right=void 0!==a.right?a.right:c.right,c.bottom=void 0!==a.bottom?a.bottom:c.bottom,c.left=void 0!==a.left?a.left:c.left}},color:{get:function(){return g},set:function(b){g=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.historicalBar=function(){"use strict";function b(x){return x.each(function(b){w.reset(),k=d3.select(this);var x=a.utils.availableWidth(h,k,g),y=a.utils.availableHeight(i,k,g);a.utils.initSVG(k),l.domain(c||d3.extent(b[0].values.map(n).concat(p))),l.range(r?e||[.5*x/b[0].values.length,x*(b[0].values.length-.5)/b[0].values.length]:e||[0,x]),m.domain(d||d3.extent(b[0].values.map(o).concat(q))).range(f||[y,0]),l.domain()[0]===l.domain()[1]&&l.domain(l.domain()[0]?[l.domain()[0]-.01*l.domain()[0],l.domain()[1]+.01*l.domain()[1]]:[-1,1]),m.domain()[0]===m.domain()[1]&&m.domain(m.domain()[0]?[m.domain()[0]+.01*m.domain()[0],m.domain()[1]-.01*m.domain()[1]]:[-1,1]);var z=k.selectAll("g.nv-wrap.nv-historicalBar-"+j).data([b[0].values]),A=z.enter().append("g").attr("class","nvd3 nv-wrap nv-historicalBar-"+j),B=A.append("defs"),C=A.append("g"),D=z.select("g");C.append("g").attr("class","nv-bars"),z.attr("transform","translate("+g.left+","+g.top+")"),k.on("click",function(a,b){u.chartClick({data:a,index:b,pos:d3.event,id:j})}),B.append("clipPath").attr("id","nv-chart-clip-path-"+j).append("rect"),z.select("#nv-chart-clip-path-"+j+" rect").attr("width",x).attr("height",y),D.attr("clip-path",s?"url(#nv-chart-clip-path-"+j+")":"");var E=z.select(".nv-bars").selectAll(".nv-bar").data(function(a){return a},function(a,b){return n(a,b)});E.exit().remove(),E.enter().append("rect").attr("x",0).attr("y",function(b,c){return a.utils.NaNtoZero(m(Math.max(0,o(b,c))))}).attr("height",function(b,c){return a.utils.NaNtoZero(Math.abs(m(o(b,c))-m(0)))}).attr("transform",function(a,c){return"translate("+(l(n(a,c))-x/b[0].values.length*.45)+",0)"}).on("mouseover",function(a,b){v&&(d3.select(this).classed("hover",!0),u.elementMouseover({data:a,index:b,color:d3.select(this).style("fill")}))}).on("mouseout",function(a,b){v&&(d3.select(this).classed("hover",!1),u.elementMouseout({data:a,index:b,color:d3.select(this).style("fill")}))}).on("mousemove",function(a,b){v&&u.elementMousemove({data:a,index:b,color:d3.select(this).style("fill")})}).on("click",function(a,b){v&&(u.elementClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation())}).on("dblclick",function(a,b){v&&(u.elementDblClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation())}),E.attr("fill",function(a,b){return t(a,b)}).attr("class",function(a,b,c){return(o(a,b)<0?"nv-bar negative":"nv-bar positive")+" nv-bar-"+c+"-"+b}).watchTransition(w,"bars").attr("transform",function(a,c){return"translate("+(l(n(a,c))-x/b[0].values.length*.45)+",0)"}).attr("width",x/b[0].values.length*.9),E.watchTransition(w,"bars").attr("y",function(b,c){var d=o(b,c)<0?m(0):m(0)-m(o(b,c))<1?m(0)-1:m(o(b,c));return a.utils.NaNtoZero(d)}).attr("height",function(b,c){return a.utils.NaNtoZero(Math.max(Math.abs(m(o(b,c))-m(0)),1))})}),w.renderEnd("historicalBar immediate"),b}var c,d,e,f,g={top:0,right:0,bottom:0,left:0},h=null,i=null,j=Math.floor(1e4*Math.random()),k=null,l=d3.scale.linear(),m=d3.scale.linear(),n=function(a){return a.x},o=function(a){return a.y},p=[],q=[0],r=!1,s=!0,t=a.utils.defaultColor(),u=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),v=!0,w=a.utils.renderWatch(u,0);return b.highlightPoint=function(a,b){k.select(".nv-bars .nv-bar-0-"+a).classed("hover",b)},b.clearHighlights=function(){k.select(".nv-bars .nv-bar.hover").classed("hover",!1)},b.dispatch=u,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return i},set:function(a){i=a}},forceX:{get:function(){return p},set:function(a){p=a}},forceY:{get:function(){return q},set:function(a){q=a}},padData:{get:function(){return r},set:function(a){r=a}},x:{get:function(){return n},set:function(a){n=a}},y:{get:function(){return o},set:function(a){o=a}},xScale:{get:function(){return l},set:function(a){l=a}},yScale:{get:function(){return m},set:function(a){m=a}},xDomain:{get:function(){return c},set:function(a){c=a}},yDomain:{get:function(){return d},set:function(a){d=a}},xRange:{get:function(){return e},set:function(a){e=a}},yRange:{get:function(){return f},set:function(a){f=a}},clipEdge:{get:function(){return s},set:function(a){s=a}},id:{get:function(){return j},set:function(a){j=a}},interactive:{get:function(){return v},set:function(a){v=a}},margin:{get:function(){return g},set:function(a){g.top=void 0!==a.top?a.top:g.top,g.right=void 0!==a.right?a.right:g.right,g.bottom=void 0!==a.bottom?a.bottom:g.bottom,g.left=void 0!==a.left?a.left:g.left}},color:{get:function(){return t},set:function(b){t=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.historicalBarChart=function(b){"use strict";function c(b){return b.each(function(k){z.reset(),z.models(f),q&&z.models(g),r&&z.models(h);var w=d3.select(this),A=this;a.utils.initSVG(w);var B=a.utils.availableWidth(n,w,l),C=a.utils.availableHeight(o,w,l);if(c.update=function(){w.transition().duration(y).call(c)},c.container=this,u.disabled=k.map(function(a){return!!a.disabled}),!v){var D;v={};for(D in u)v[D]=u[D]instanceof Array?u[D].slice(0):u[D]}if(!(k&&k.length&&k.filter(function(a){return a.values.length}).length))return a.utils.noData(c,w),c;w.selectAll(".nv-noData").remove(),d=f.xScale(),e=f.yScale();var E=w.selectAll("g.nv-wrap.nv-historicalBarChart").data([k]),F=E.enter().append("g").attr("class","nvd3 nv-wrap nv-historicalBarChart").append("g"),G=E.select("g");F.append("g").attr("class","nv-x nv-axis"),F.append("g").attr("class","nv-y nv-axis"),F.append("g").attr("class","nv-barsWrap"),F.append("g").attr("class","nv-legendWrap"),F.append("g").attr("class","nv-interactive"),p&&(i.width(B),G.select(".nv-legendWrap").datum(k).call(i),l.top!=i.height()&&(l.top=i.height(),C=a.utils.availableHeight(o,w,l)),E.select(".nv-legendWrap").attr("transform","translate(0,"+-l.top+")")),E.attr("transform","translate("+l.left+","+l.top+")"),s&&G.select(".nv-y.nv-axis").attr("transform","translate("+B+",0)"),t&&(j.width(B).height(C).margin({left:l.left,top:l.top}).svgContainer(w).xScale(d),E.select(".nv-interactive").call(j)),f.width(B).height(C).color(k.map(function(a,b){return a.color||m(a,b)}).filter(function(a,b){return!k[b].disabled}));var H=G.select(".nv-barsWrap").datum(k.filter(function(a){return!a.disabled}));H.transition().call(f),q&&(g.scale(d)._ticks(a.utils.calcTicksX(B/100,k)).tickSize(-C,0),G.select(".nv-x.nv-axis").attr("transform","translate(0,"+e.range()[0]+")"),G.select(".nv-x.nv-axis").transition().call(g)),r&&(h.scale(e)._ticks(a.utils.calcTicksY(C/36,k)).tickSize(-B,0),G.select(".nv-y.nv-axis").transition().call(h)),j.dispatch.on("elementMousemove",function(b){f.clearHighlights();var d,e,i,n=[];k.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(g){e=a.interactiveBisect(g.values,b.pointXValue,c.x()),f.highlightPoint(e,!0);var h=g.values[e];void 0!==h&&(void 0===d&&(d=h),void 0===i&&(i=c.xScale()(c.x()(h,e))),n.push({key:g.key,value:c.y()(h,e),color:m(g,g.seriesIndex),data:g.values[e]}))});var o=g.tickFormat()(c.x()(d,e));j.tooltip.position({left:i+l.left,top:b.mouseY+l.top}).chartContainer(A.parentNode).valueFormatter(function(a){return h.tickFormat()(a)}).data({value:o,index:e,series:n})(),j.renderGuideLine(i)}),j.dispatch.on("elementMouseout",function(){x.tooltipHide(),f.clearHighlights()}),i.dispatch.on("legendClick",function(a){a.disabled=!a.disabled,k.filter(function(a){return!a.disabled}).length||k.map(function(a){return a.disabled=!1,E.selectAll(".nv-series").classed("disabled",!1),a}),u.disabled=k.map(function(a){return!!a.disabled}),x.stateChange(u),b.transition().call(c)}),i.dispatch.on("legendDblclick",function(a){k.forEach(function(a){a.disabled=!0}),a.disabled=!1,u.disabled=k.map(function(a){return!!a.disabled}),x.stateChange(u),c.update()}),x.on("changeState",function(a){"undefined"!=typeof a.disabled&&(k.forEach(function(b,c){b.disabled=a.disabled[c]}),u.disabled=a.disabled),c.update()})}),z.renderEnd("historicalBarChart immediate"),c}var d,e,f=b||a.models.historicalBar(),g=a.models.axis(),h=a.models.axis(),i=a.models.legend(),j=a.interactiveGuideline(),k=a.models.tooltip(),l={top:30,right:90,bottom:50,left:90},m=a.utils.defaultColor(),n=null,o=null,p=!1,q=!0,r=!0,s=!1,t=!1,u={},v=null,w=null,x=d3.dispatch("tooltipHide","stateChange","changeState","renderEnd"),y=250;g.orient("bottom").tickPadding(7),h.orient(s?"right":"left"),k.duration(0).headerEnabled(!1).valueFormatter(function(a,b){return h.tickFormat()(a,b)}).headerFormatter(function(a,b){return g.tickFormat()(a,b)});var z=a.utils.renderWatch(x,0);return f.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:c.x()(a.data),value:c.y()(a.data),color:a.color},k.data(a).hidden(!1)}),f.dispatch.on("elementMouseout.tooltip",function(){k.hidden(!0)}),f.dispatch.on("elementMousemove.tooltip",function(){k.position({top:d3.event.pageY,left:d3.event.pageX})()}),c.dispatch=x,c.bars=f,c.legend=i,c.xAxis=g,c.yAxis=h,c.interactiveLayer=j,c.tooltip=k,c.options=a.utils.optionsFunc.bind(c),c._options=Object.create({},{width:{get:function(){return n},set:function(a){n=a}},height:{get:function(){return o},set:function(a){o=a}},showLegend:{get:function(){return p},set:function(a){p=a}},showXAxis:{get:function(){return q},set:function(a){q=a}},showYAxis:{get:function(){return r},set:function(a){r=a}},defaultState:{get:function(){return v},set:function(a){v=a}},noData:{get:function(){return w},set:function(a){w=a}},tooltips:{get:function(){return k.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),k.enabled(!!b)}},tooltipContent:{get:function(){return k.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),k.contentGenerator(b)}},margin:{get:function(){return l},set:function(a){l.top=void 0!==a.top?a.top:l.top,l.right=void 0!==a.right?a.right:l.right,l.bottom=void 0!==a.bottom?a.bottom:l.bottom,l.left=void 0!==a.left?a.left:l.left}},color:{get:function(){return m},set:function(b){m=a.utils.getColor(b),i.color(m),f.color(m)}},duration:{get:function(){return y},set:function(a){y=a,z.reset(y),h.duration(y),g.duration(y)}},rightAlignYAxis:{get:function(){return s},set:function(a){s=a,h.orient(a?"right":"left")}},useInteractiveGuideline:{get:function(){return t},set:function(a){t=a,a===!0&&c.interactive(!1)}}}),a.utils.inheritOptions(c,f),a.utils.initOptions(c),c},a.models.ohlcBarChart=function(){var b=a.models.historicalBarChart(a.models.ohlcBar());return b.useInteractiveGuideline(!0),b.interactiveLayer.tooltip.contentGenerator(function(a){var c=a.series[0].data,d=c.open'+a.value+"
open:"+b.yAxis.tickFormat()(c.open)+"
close:"+b.yAxis.tickFormat()(c.close)+"
high"+b.yAxis.tickFormat()(c.high)+"
low:"+b.yAxis.tickFormat()(c.low)+"
"}),b},a.models.candlestickBarChart=function(){var b=a.models.historicalBarChart(a.models.candlestickBar());return b.useInteractiveGuideline(!0),b.interactiveLayer.tooltip.contentGenerator(function(a){var c=a.series[0].data,d=c.open'+a.value+"
open:"+b.yAxis.tickFormat()(c.open)+"
close:"+b.yAxis.tickFormat()(c.close)+"
high"+b.yAxis.tickFormat()(c.high)+"
low:"+b.yAxis.tickFormat()(c.low)+"
"}),b},a.models.legend=function(){"use strict";function b(p){function q(a,b){return"furious"!=o?"#000":m?a.disengaged?"#000":"#fff":m?void 0:(a.color||(a.color=g(a,b)),a.disabled?a.color:"#fff")}function r(a,b){return m&&"furious"==o&&a.disengaged?"#eee":a.color||g(a,b)}function s(a){return m&&"furious"==o?1:a.disabled?0:1}return p.each(function(b){var g=d-c.left-c.right,p=d3.select(this);a.utils.initSVG(p);var t=p.selectAll("g.nv-legend").data([b]),u=t.enter().append("g").attr("class","nvd3 nv-legend").append("g"),v=t.select("g");t.attr("transform","translate("+c.left+","+c.top+")");var w,x,y=v.selectAll(".nv-series").data(function(a){return"furious"!=o?a:a.filter(function(a){return m?!0:!a.disengaged})}),z=y.enter().append("g").attr("class","nv-series");switch(o){case"furious":x=23;break;case"classic":x=20}if("classic"==o)z.append("circle").style("stroke-width",2).attr("class","nv-legend-symbol").attr("r",5),w=y.select("circle");else if("furious"==o){z.append("rect").style("stroke-width",2).attr("class","nv-legend-symbol").attr("rx",3).attr("ry",3),w=y.select(".nv-legend-symbol"),z.append("g").attr("class","nv-check-box").property("innerHTML",'').attr("transform","translate(-10,-8)scale(0.5)");var A=y.select(".nv-check-box");A.each(function(a,b){d3.select(this).selectAll("path").attr("stroke",q(a,b))})}z.append("text").attr("text-anchor","start").attr("class","nv-legend-text").attr("dy",".32em").attr("dx","8");var B=y.select("text.nv-legend-text");y.on("mouseover",function(a,b){n.legendMouseover(a,b)}).on("mouseout",function(a,b){n.legendMouseout(a,b)}).on("click",function(a,b){n.legendClick(a,b);var c=y.data();if(k){if("classic"==o)l?(c.forEach(function(a){a.disabled=!0}),a.disabled=!1):(a.disabled=!a.disabled,c.every(function(a){return a.disabled})&&c.forEach(function(a){a.disabled=!1}));else if("furious"==o)if(m)a.disengaged=!a.disengaged,a.userDisabled=void 0==a.userDisabled?!!a.disabled:a.userDisabled,a.disabled=a.disengaged||a.userDisabled;else if(!m){a.disabled=!a.disabled,a.userDisabled=a.disabled;var d=c.filter(function(a){return!a.disengaged});d.every(function(a){return a.userDisabled})&&c.forEach(function(a){a.disabled=a.userDisabled=!1})}n.stateChange({disabled:c.map(function(a){return!!a.disabled}),disengaged:c.map(function(a){return!!a.disengaged})})}}).on("dblclick",function(a,b){if(("furious"!=o||!m)&&(n.legendDblclick(a,b),k)){var c=y.data();c.forEach(function(a){a.disabled=!0,"furious"==o&&(a.userDisabled=a.disabled)}),a.disabled=!1,"furious"==o&&(a.userDisabled=a.disabled),n.stateChange({disabled:c.map(function(a){return!!a.disabled})})}}),y.classed("nv-disabled",function(a){return a.userDisabled}),y.exit().remove(),B.attr("fill",q).text(f);var C=0;if(h){var D=[];y.each(function(){var b,c=d3.select(this).select("text");try{if(b=c.node().getComputedTextLength(),0>=b)throw Error()}catch(d){b=a.utils.calcApproxTextWidth(c)}D.push(b+i)});var E=0,F=[];for(C=0;g>C&&Eg&&E>1;){F=[],E--;for(var G=0;G(F[G%E]||0)&&(F[G%E]=D[G]);C=F.reduce(function(a,b){return a+b})}for(var H=[],I=0,J=0;E>I;I++)H[I]=J,J+=F[I];y.attr("transform",function(a,b){return"translate("+H[b%E]+","+(5+Math.floor(b/E)*x)+")"}),j?v.attr("transform","translate("+(d-c.right-C)+","+c.top+")"):v.attr("transform","translate(0,"+c.top+")"),e=c.top+c.bottom+Math.ceil(D.length/E)*x}else{var K,L=5,M=5,N=0;y.attr("transform",function(){var a=d3.select(this).select("text").node().getComputedTextLength()+i;return K=M,dN&&(N=M),K+N>C&&(C=K+N),"translate("+K+","+L+")"}),v.attr("transform","translate("+(d-c.right-N)+","+c.top+")"),e=c.top+c.bottom+L+15}if("furious"==o){w.attr("width",function(a,b){return B[0][b].getComputedTextLength()+27}).attr("height",18).attr("y",-9).attr("x",-15),u.insert("rect",":first-child").attr("class","nv-legend-bg").attr("fill","#eee").attr("opacity",0);var O=v.select(".nv-legend-bg");O.transition().duration(300).attr("x",-x).attr("width",C+x-12).attr("height",e+10).attr("y",-c.top-10).attr("opacity",m?1:0)}w.style("fill",r).style("fill-opacity",s).style("stroke",r)}),b}var c={top:5,right:0,bottom:5,left:0},d=400,e=20,f=function(a){return a.key},g=a.utils.getColor(),h=!0,i=32,j=!0,k=!0,l=!1,m=!1,n=d3.dispatch("legendClick","legendDblclick","legendMouseover","legendMouseout","stateChange"),o="classic";return b.dispatch=n,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return d},set:function(a){d=a}},height:{get:function(){return e},set:function(a){e=a}},key:{get:function(){return f},set:function(a){f=a}},align:{get:function(){return h},set:function(a){h=a}},rightAlign:{get:function(){return j},set:function(a){j=a}},padding:{get:function(){return i},set:function(a){i=a}},updateState:{get:function(){return k},set:function(a){k=a}},radioButtonMode:{get:function(){return l},set:function(a){l=a}},expanded:{get:function(){return m},set:function(a){m=a}},vers:{get:function(){return o},set:function(a){o=a}},margin:{get:function(){return c},set:function(a){c.top=void 0!==a.top?a.top:c.top,c.right=void 0!==a.right?a.right:c.right,c.bottom=void 0!==a.bottom?a.bottom:c.bottom,c.left=void 0!==a.left?a.left:c.left}},color:{get:function(){return g},set:function(b){g=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.line=function(){"use strict";function b(r){return v.reset(),v.models(e),r.each(function(b){i=d3.select(this);var r=a.utils.availableWidth(g,i,f),s=a.utils.availableHeight(h,i,f);a.utils.initSVG(i),c=e.xScale(),d=e.yScale(),t=t||c,u=u||d;var w=i.selectAll("g.nv-wrap.nv-line").data([b]),x=w.enter().append("g").attr("class","nvd3 nv-wrap nv-line"),y=x.append("defs"),z=x.append("g"),A=w.select("g");z.append("g").attr("class","nv-groups"),z.append("g").attr("class","nv-scatterWrap"),w.attr("transform","translate("+f.left+","+f.top+")"),e.width(r).height(s);var B=w.select(".nv-scatterWrap");B.call(e),y.append("clipPath").attr("id","nv-edge-clip-"+e.id()).append("rect"),w.select("#nv-edge-clip-"+e.id()+" rect").attr("width",r).attr("height",s>0?s:0),A.attr("clip-path",p?"url(#nv-edge-clip-"+e.id()+")":""),B.attr("clip-path",p?"url(#nv-edge-clip-"+e.id()+")":"");var C=w.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a){return a.key});C.enter().append("g").style("stroke-opacity",1e-6).style("stroke-width",function(a){return a.strokeWidth||j}).style("fill-opacity",1e-6),C.exit().remove(),C.attr("class",function(a,b){return(a.classed||"")+" nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}).style("fill",function(a,b){return k(a,b)}).style("stroke",function(a,b){return k(a,b)}),C.watchTransition(v,"line: groups").style("stroke-opacity",1).style("fill-opacity",function(a){return a.fillOpacity||.5});var D=C.selectAll("path.nv-area").data(function(a){return o(a)?[a]:[]});D.enter().append("path").attr("class","nv-area").attr("d",function(b){return d3.svg.area().interpolate(q).defined(n).x(function(b,c){return a.utils.NaNtoZero(t(l(b,c)))}).y0(function(b,c){return a.utils.NaNtoZero(u(m(b,c)))}).y1(function(){return u(d.domain()[0]<=0?d.domain()[1]>=0?0:d.domain()[1]:d.domain()[0])}).apply(this,[b.values])}),C.exit().selectAll("path.nv-area").remove(),D.watchTransition(v,"line: areaPaths").attr("d",function(b){return d3.svg.area().interpolate(q).defined(n).x(function(b,d){return a.utils.NaNtoZero(c(l(b,d)))}).y0(function(b,c){return a.utils.NaNtoZero(d(m(b,c)))}).y1(function(){return d(d.domain()[0]<=0?d.domain()[1]>=0?0:d.domain()[1]:d.domain()[0])}).apply(this,[b.values])});var E=C.selectAll("path.nv-line").data(function(a){return[a.values]});E.enter().append("path").attr("class","nv-line").attr("d",d3.svg.line().interpolate(q).defined(n).x(function(b,c){return a.utils.NaNtoZero(t(l(b,c)))}).y(function(b,c){return a.utils.NaNtoZero(u(m(b,c)))})),E.watchTransition(v,"line: linePaths").attr("d",d3.svg.line().interpolate(q).defined(n).x(function(b,d){return a.utils.NaNtoZero(c(l(b,d)))}).y(function(b,c){return a.utils.NaNtoZero(d(m(b,c)))})),t=c.copy(),u=d.copy()}),v.renderEnd("line immediate"),b}var c,d,e=a.models.scatter(),f={top:0,right:0,bottom:0,left:0},g=960,h=500,i=null,j=1.5,k=a.utils.defaultColor(),l=function(a){return a.x},m=function(a){return a.y},n=function(a,b){return!isNaN(m(a,b))&&null!==m(a,b)},o=function(a){return a.area},p=!1,q="linear",r=250,s=d3.dispatch("elementClick","elementMouseover","elementMouseout","renderEnd");e.pointSize(16).pointDomain([16,256]);var t,u,v=a.utils.renderWatch(s,r);return b.dispatch=s,b.scatter=e,e.dispatch.on("elementClick",function(){s.elementClick.apply(this,arguments)}),e.dispatch.on("elementMouseover",function(){s.elementMouseover.apply(this,arguments)}),e.dispatch.on("elementMouseout",function(){s.elementMouseout.apply(this,arguments)}),b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return g},set:function(a){g=a}},height:{get:function(){return h},set:function(a){h=a}},defined:{get:function(){return n},set:function(a){n=a}},interpolate:{get:function(){return q},set:function(a){q=a}},clipEdge:{get:function(){return p},set:function(a){p=a}},margin:{get:function(){return f},set:function(a){f.top=void 0!==a.top?a.top:f.top,f.right=void 0!==a.right?a.right:f.right,f.bottom=void 0!==a.bottom?a.bottom:f.bottom,f.left=void 0!==a.left?a.left:f.left}},duration:{get:function(){return r},set:function(a){r=a,v.reset(r),e.duration(r)}},isArea:{get:function(){return o},set:function(a){o=d3.functor(a)}},x:{get:function(){return l},set:function(a){l=a,e.x(a)}},y:{get:function(){return m},set:function(a){m=a,e.y(a)}},color:{get:function(){return k},set:function(b){k=a.utils.getColor(b),e.color(k)}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.lineChart=function(){"use strict";function b(j){return y.reset(),y.models(e),p&&y.models(f),q&&y.models(g),j.each(function(j){var v=d3.select(this),y=this;a.utils.initSVG(v);var B=a.utils.availableWidth(m,v,k),C=a.utils.availableHeight(n,v,k);if(b.update=function(){0===x?v.call(b):v.transition().duration(x).call(b)},b.container=this,t.setter(A(j),b.update).getter(z(j)).update(),t.disabled=j.map(function(a){return!!a.disabled}),!u){var D;u={};for(D in t)u[D]=t[D]instanceof Array?t[D].slice(0):t[D] -}if(!(j&&j.length&&j.filter(function(a){return a.values.length}).length))return a.utils.noData(b,v),b;v.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale();var E=v.selectAll("g.nv-wrap.nv-lineChart").data([j]),F=E.enter().append("g").attr("class","nvd3 nv-wrap nv-lineChart").append("g"),G=E.select("g");F.append("rect").style("opacity",0),F.append("g").attr("class","nv-x nv-axis"),F.append("g").attr("class","nv-y nv-axis"),F.append("g").attr("class","nv-linesWrap"),F.append("g").attr("class","nv-legendWrap"),F.append("g").attr("class","nv-interactive"),G.select("rect").attr("width",B).attr("height",C>0?C:0),o&&(h.width(B),G.select(".nv-legendWrap").datum(j).call(h),k.top!=h.height()&&(k.top=h.height(),C=a.utils.availableHeight(n,v,k)),E.select(".nv-legendWrap").attr("transform","translate(0,"+-k.top+")")),E.attr("transform","translate("+k.left+","+k.top+")"),r&&G.select(".nv-y.nv-axis").attr("transform","translate("+B+",0)"),s&&(i.width(B).height(C).margin({left:k.left,top:k.top}).svgContainer(v).xScale(c),E.select(".nv-interactive").call(i)),e.width(B).height(C).color(j.map(function(a,b){return a.color||l(a,b)}).filter(function(a,b){return!j[b].disabled}));var H=G.select(".nv-linesWrap").datum(j.filter(function(a){return!a.disabled}));H.call(e),p&&(f.scale(c)._ticks(a.utils.calcTicksX(B/100,j)).tickSize(-C,0),G.select(".nv-x.nv-axis").attr("transform","translate(0,"+d.range()[0]+")"),G.select(".nv-x.nv-axis").call(f)),q&&(g.scale(d)._ticks(a.utils.calcTicksY(C/36,j)).tickSize(-B,0),G.select(".nv-y.nv-axis").call(g)),h.dispatch.on("stateChange",function(a){for(var c in a)t[c]=a[c];w.stateChange(t),b.update()}),i.dispatch.on("elementMousemove",function(c){e.clearHighlights();var d,h,m,n=[];if(j.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(f,g){h=a.interactiveBisect(f.values,c.pointXValue,b.x());var i=f.values[h],j=b.y()(i,h);null!=j&&e.highlightPoint(g,h,!0),void 0!==i&&(void 0===d&&(d=i),void 0===m&&(m=b.xScale()(b.x()(i,h))),n.push({key:f.key,value:j,color:l(f,f.seriesIndex)}))}),n.length>2){var o=b.yScale().invert(c.mouseY),p=Math.abs(b.yScale().domain()[0]-b.yScale().domain()[1]),q=.03*p,r=a.nearestValueIndex(n.map(function(a){return a.value}),o,q);null!==r&&(n[r].highlight=!0)}var s=f.tickFormat()(b.x()(d,h));i.tooltip.position({left:c.mouseX+k.left,top:c.mouseY+k.top}).chartContainer(y.parentNode).valueFormatter(function(a){return null==a?"N/A":g.tickFormat()(a)}).data({value:s,index:h,series:n})(),i.renderGuideLine(m)}),i.dispatch.on("elementClick",function(c){var d,f=[];j.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(e){var g=a.interactiveBisect(e.values,c.pointXValue,b.x()),h=e.values[g];if("undefined"!=typeof h){"undefined"==typeof d&&(d=b.xScale()(b.x()(h,g)));var i=b.yScale()(b.y()(h,g));f.push({point:h,pointIndex:g,pos:[d,i],seriesIndex:e.seriesIndex,series:e})}}),e.dispatch.elementClick(f)}),i.dispatch.on("elementMouseout",function(){e.clearHighlights()}),w.on("changeState",function(a){"undefined"!=typeof a.disabled&&j.length===a.disabled.length&&(j.forEach(function(b,c){b.disabled=a.disabled[c]}),t.disabled=a.disabled),b.update()})}),y.renderEnd("lineChart immediate"),b}var c,d,e=a.models.line(),f=a.models.axis(),g=a.models.axis(),h=a.models.legend(),i=a.interactiveGuideline(),j=a.models.tooltip(),k={top:30,right:20,bottom:50,left:60},l=a.utils.defaultColor(),m=null,n=null,o=!0,p=!0,q=!0,r=!1,s=!1,t=a.utils.state(),u=null,v=null,w=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd"),x=250;f.orient("bottom").tickPadding(7),g.orient(r?"right":"left"),j.valueFormatter(function(a,b){return g.tickFormat()(a,b)}).headerFormatter(function(a,b){return f.tickFormat()(a,b)});var y=a.utils.renderWatch(w,x),z=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},A=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return e.dispatch.on("elementMouseover.tooltip",function(a){j.data(a).position(a.pos).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(){j.hidden(!0)}),b.dispatch=w,b.lines=e,b.legend=h,b.xAxis=f,b.yAxis=g,b.interactiveLayer=i,b.tooltip=j,b.dispatch=w,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return m},set:function(a){m=a}},height:{get:function(){return n},set:function(a){n=a}},showLegend:{get:function(){return o},set:function(a){o=a}},showXAxis:{get:function(){return p},set:function(a){p=a}},showYAxis:{get:function(){return q},set:function(a){q=a}},defaultState:{get:function(){return u},set:function(a){u=a}},noData:{get:function(){return v},set:function(a){v=a}},tooltips:{get:function(){return j.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),j.enabled(!!b)}},tooltipContent:{get:function(){return j.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),j.contentGenerator(b)}},margin:{get:function(){return k},set:function(a){k.top=void 0!==a.top?a.top:k.top,k.right=void 0!==a.right?a.right:k.right,k.bottom=void 0!==a.bottom?a.bottom:k.bottom,k.left=void 0!==a.left?a.left:k.left}},duration:{get:function(){return x},set:function(a){x=a,y.reset(x),e.duration(x),f.duration(x),g.duration(x)}},color:{get:function(){return l},set:function(b){l=a.utils.getColor(b),h.color(l),e.color(l)}},rightAlignYAxis:{get:function(){return r},set:function(a){r=a,g.orient(r?"right":"left")}},useInteractiveGuideline:{get:function(){return s},set:function(a){s=a,s&&(e.interactive(!1),e.useVoronoi(!1))}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.linePlusBarChart=function(){"use strict";function b(v){return v.each(function(v){function J(a){var b=+("e"==a),c=b?1:-1,d=X/3;return"M"+.5*c+","+d+"A6,6 0 0 "+b+" "+6.5*c+","+(d+6)+"V"+(2*d-6)+"A6,6 0 0 "+b+" "+.5*c+","+2*d+"ZM"+2.5*c+","+(d+8)+"V"+(2*d-8)+"M"+4.5*c+","+(d+8)+"V"+(2*d-8)}function S(){u.empty()||u.extent(I),kb.data([u.empty()?e.domain():I]).each(function(a){var b=e(a[0])-e.range()[0],c=e.range()[1]-e(a[1]);d3.select(this).select(".left").attr("width",0>b?0:b),d3.select(this).select(".right").attr("x",e(a[1])).attr("width",0>c?0:c)})}function T(){I=u.empty()?null:u.extent(),c=u.empty()?e.domain():u.extent(),K.brush({extent:c,brush:u}),S(),l.width(V).height(W).color(v.map(function(a,b){return a.color||C(a,b)}).filter(function(a,b){return!v[b].disabled&&v[b].bar})),j.width(V).height(W).color(v.map(function(a,b){return a.color||C(a,b)}).filter(function(a,b){return!v[b].disabled&&!v[b].bar}));var b=db.select(".nv-focus .nv-barsWrap").datum(Z.length?Z.map(function(a){return{key:a.key,values:a.values.filter(function(a,b){return l.x()(a,b)>=c[0]&&l.x()(a,b)<=c[1]})}}):[{values:[]}]),h=db.select(".nv-focus .nv-linesWrap").datum($[0].disabled?[{values:[]}]:$.map(function(a){return{area:a.area,fillOpacity:a.fillOpacity,key:a.key,values:a.values.filter(function(a,b){return j.x()(a,b)>=c[0]&&j.x()(a,b)<=c[1]})}}));d=Z.length?l.xScale():j.xScale(),n.scale(d)._ticks(a.utils.calcTicksX(V/100,v)).tickSize(-W,0),n.domain([Math.ceil(c[0]),Math.floor(c[1])]),db.select(".nv-x.nv-axis").transition().duration(L).call(n),b.transition().duration(L).call(l),h.transition().duration(L).call(j),db.select(".nv-focus .nv-x.nv-axis").attr("transform","translate(0,"+f.range()[0]+")"),p.scale(f)._ticks(a.utils.calcTicksY(W/36,v)).tickSize(-V,0),q.scale(g)._ticks(a.utils.calcTicksY(W/36,v)).tickSize(Z.length?0:-V,0),db.select(".nv-focus .nv-y1.nv-axis").style("opacity",Z.length?1:0),db.select(".nv-focus .nv-y2.nv-axis").style("opacity",$.length&&!$[0].disabled?1:0).attr("transform","translate("+d.range()[1]+",0)"),db.select(".nv-focus .nv-y1.nv-axis").transition().duration(L).call(p),db.select(".nv-focus .nv-y2.nv-axis").transition().duration(L).call(q)}var U=d3.select(this);a.utils.initSVG(U);var V=a.utils.availableWidth(y,U,w),W=a.utils.availableHeight(z,U,w)-(E?H:0),X=H-x.top-x.bottom;if(b.update=function(){U.transition().duration(L).call(b)},b.container=this,M.setter(R(v),b.update).getter(Q(v)).update(),M.disabled=v.map(function(a){return!!a.disabled}),!N){var Y;N={};for(Y in M)N[Y]=M[Y]instanceof Array?M[Y].slice(0):M[Y]}if(!(v&&v.length&&v.filter(function(a){return a.values.length}).length))return a.utils.noData(b,U),b;U.selectAll(".nv-noData").remove();var Z=v.filter(function(a){return!a.disabled&&a.bar}),$=v.filter(function(a){return!a.bar});d=l.xScale(),e=o.scale(),f=l.yScale(),g=j.yScale(),h=m.yScale(),i=k.yScale();var _=v.filter(function(a){return!a.disabled&&a.bar}).map(function(a){return a.values.map(function(a,b){return{x:A(a,b),y:B(a,b)}})}),ab=v.filter(function(a){return!a.disabled&&!a.bar}).map(function(a){return a.values.map(function(a,b){return{x:A(a,b),y:B(a,b)}})});d.range([0,V]),e.domain(d3.extent(d3.merge(_.concat(ab)),function(a){return a.x})).range([0,V]);var bb=U.selectAll("g.nv-wrap.nv-linePlusBar").data([v]),cb=bb.enter().append("g").attr("class","nvd3 nv-wrap nv-linePlusBar").append("g"),db=bb.select("g");cb.append("g").attr("class","nv-legendWrap");var eb=cb.append("g").attr("class","nv-focus");eb.append("g").attr("class","nv-x nv-axis"),eb.append("g").attr("class","nv-y1 nv-axis"),eb.append("g").attr("class","nv-y2 nv-axis"),eb.append("g").attr("class","nv-barsWrap"),eb.append("g").attr("class","nv-linesWrap");var fb=cb.append("g").attr("class","nv-context");if(fb.append("g").attr("class","nv-x nv-axis"),fb.append("g").attr("class","nv-y1 nv-axis"),fb.append("g").attr("class","nv-y2 nv-axis"),fb.append("g").attr("class","nv-barsWrap"),fb.append("g").attr("class","nv-linesWrap"),fb.append("g").attr("class","nv-brushBackground"),fb.append("g").attr("class","nv-x nv-brush"),D){var gb=t.align()?V/2:V,hb=t.align()?gb:0;t.width(gb),db.select(".nv-legendWrap").datum(v.map(function(a){return a.originalKey=void 0===a.originalKey?a.key:a.originalKey,a.key=a.originalKey+(a.bar?O:P),a})).call(t),w.top!=t.height()&&(w.top=t.height(),W=a.utils.availableHeight(z,U,w)-H),db.select(".nv-legendWrap").attr("transform","translate("+hb+","+-w.top+")")}bb.attr("transform","translate("+w.left+","+w.top+")"),db.select(".nv-context").style("display",E?"initial":"none"),m.width(V).height(X).color(v.map(function(a,b){return a.color||C(a,b)}).filter(function(a,b){return!v[b].disabled&&v[b].bar})),k.width(V).height(X).color(v.map(function(a,b){return a.color||C(a,b)}).filter(function(a,b){return!v[b].disabled&&!v[b].bar}));var ib=db.select(".nv-context .nv-barsWrap").datum(Z.length?Z:[{values:[]}]),jb=db.select(".nv-context .nv-linesWrap").datum($[0].disabled?[{values:[]}]:$);db.select(".nv-context").attr("transform","translate(0,"+(W+w.bottom+x.top)+")"),ib.transition().call(m),jb.transition().call(k),G&&(o._ticks(a.utils.calcTicksX(V/100,v)).tickSize(-X,0),db.select(".nv-context .nv-x.nv-axis").attr("transform","translate(0,"+h.range()[0]+")"),db.select(".nv-context .nv-x.nv-axis").transition().call(o)),F&&(r.scale(h)._ticks(X/36).tickSize(-V,0),s.scale(i)._ticks(X/36).tickSize(Z.length?0:-V,0),db.select(".nv-context .nv-y3.nv-axis").style("opacity",Z.length?1:0).attr("transform","translate(0,"+e.range()[0]+")"),db.select(".nv-context .nv-y2.nv-axis").style("opacity",$.length?1:0).attr("transform","translate("+e.range()[1]+",0)"),db.select(".nv-context .nv-y1.nv-axis").transition().call(r),db.select(".nv-context .nv-y2.nv-axis").transition().call(s)),u.x(e).on("brush",T),I&&u.extent(I);var kb=db.select(".nv-brushBackground").selectAll("g").data([I||u.extent()]),lb=kb.enter().append("g");lb.append("rect").attr("class","left").attr("x",0).attr("y",0).attr("height",X),lb.append("rect").attr("class","right").attr("x",0).attr("y",0).attr("height",X);var mb=db.select(".nv-x.nv-brush").call(u);mb.selectAll("rect").attr("height",X),mb.selectAll(".resize").append("path").attr("d",J),t.dispatch.on("stateChange",function(a){for(var c in a)M[c]=a[c];K.stateChange(M),b.update()}),K.on("changeState",function(a){"undefined"!=typeof a.disabled&&(v.forEach(function(b,c){b.disabled=a.disabled[c]}),M.disabled=a.disabled),b.update()}),T()}),b}var c,d,e,f,g,h,i,j=a.models.line(),k=a.models.line(),l=a.models.historicalBar(),m=a.models.historicalBar(),n=a.models.axis(),o=a.models.axis(),p=a.models.axis(),q=a.models.axis(),r=a.models.axis(),s=a.models.axis(),t=a.models.legend(),u=d3.svg.brush(),v=a.models.tooltip(),w={top:30,right:30,bottom:30,left:60},x={top:0,right:30,bottom:20,left:60},y=null,z=null,A=function(a){return a.x},B=function(a){return a.y},C=a.utils.defaultColor(),D=!0,E=!0,F=!1,G=!0,H=50,I=null,J=null,K=d3.dispatch("brush","stateChange","changeState"),L=0,M=a.utils.state(),N=null,O=" (left axis)",P=" (right axis)";j.clipEdge(!0),k.interactive(!1),n.orient("bottom").tickPadding(5),p.orient("left"),q.orient("right"),o.orient("bottom").tickPadding(5),r.orient("left"),s.orient("right"),v.headerEnabled(!0).headerFormatter(function(a,b){return n.tickFormat()(a,b)});var Q=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},R=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return j.dispatch.on("elementMouseover.tooltip",function(a){v.duration(100).valueFormatter(function(a,b){return q.tickFormat()(a,b)}).data(a).position(a.pos).hidden(!1)}),j.dispatch.on("elementMouseout.tooltip",function(){v.hidden(!0)}),l.dispatch.on("elementMouseover.tooltip",function(a){a.value=b.x()(a.data),a.series={value:b.y()(a.data),color:a.color},v.duration(0).valueFormatter(function(a,b){return p.tickFormat()(a,b)}).data(a).hidden(!1)}),l.dispatch.on("elementMouseout.tooltip",function(){v.hidden(!0)}),l.dispatch.on("elementMousemove.tooltip",function(){v.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=K,b.legend=t,b.lines=j,b.lines2=k,b.bars=l,b.bars2=m,b.xAxis=n,b.x2Axis=o,b.y1Axis=p,b.y2Axis=q,b.y3Axis=r,b.y4Axis=s,b.tooltip=v,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return y},set:function(a){y=a}},height:{get:function(){return z},set:function(a){z=a}},showLegend:{get:function(){return D},set:function(a){D=a}},brushExtent:{get:function(){return I},set:function(a){I=a}},noData:{get:function(){return J},set:function(a){J=a}},focusEnable:{get:function(){return E},set:function(a){E=a}},focusHeight:{get:function(){return H},set:function(a){H=a}},focusShowAxisX:{get:function(){return G},set:function(a){G=a}},focusShowAxisY:{get:function(){return F},set:function(a){F=a}},legendLeftAxisHint:{get:function(){return O},set:function(a){O=a}},legendRightAxisHint:{get:function(){return P},set:function(a){P=a}},tooltips:{get:function(){return v.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),v.enabled(!!b)}},tooltipContent:{get:function(){return v.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),v.contentGenerator(b)}},margin:{get:function(){return w},set:function(a){w.top=void 0!==a.top?a.top:w.top,w.right=void 0!==a.right?a.right:w.right,w.bottom=void 0!==a.bottom?a.bottom:w.bottom,w.left=void 0!==a.left?a.left:w.left}},duration:{get:function(){return L},set:function(a){L=a}},color:{get:function(){return C},set:function(b){C=a.utils.getColor(b),t.color(C)}},x:{get:function(){return A},set:function(a){A=a,j.x(a),k.x(a),l.x(a),m.x(a)}},y:{get:function(){return B},set:function(a){B=a,j.y(a),k.y(a),l.y(a),m.y(a)}}}),a.utils.inheritOptions(b,j),a.utils.initOptions(b),b},a.models.lineWithFocusChart=function(){"use strict";function b(o){return o.each(function(o){function z(a){var b=+("e"==a),c=b?1:-1,d=M/3;return"M"+.5*c+","+d+"A6,6 0 0 "+b+" "+6.5*c+","+(d+6)+"V"+(2*d-6)+"A6,6 0 0 "+b+" "+.5*c+","+2*d+"ZM"+2.5*c+","+(d+8)+"V"+(2*d-8)+"M"+4.5*c+","+(d+8)+"V"+(2*d-8)}function G(){n.empty()||n.extent(y),U.data([n.empty()?e.domain():y]).each(function(a){var b=e(a[0])-c.range()[0],d=K-e(a[1]);d3.select(this).select(".left").attr("width",0>b?0:b),d3.select(this).select(".right").attr("x",e(a[1])).attr("width",0>d?0:d)})}function H(){y=n.empty()?null:n.extent();var a=n.empty()?e.domain():n.extent();if(!(Math.abs(a[0]-a[1])<=1)){A.brush({extent:a,brush:n}),G();var b=Q.select(".nv-focus .nv-linesWrap").datum(o.filter(function(a){return!a.disabled}).map(function(b){return{key:b.key,area:b.area,values:b.values.filter(function(b,c){return g.x()(b,c)>=a[0]&&g.x()(b,c)<=a[1]})}}));b.transition().duration(B).call(g),Q.select(".nv-focus .nv-x.nv-axis").transition().duration(B).call(i),Q.select(".nv-focus .nv-y.nv-axis").transition().duration(B).call(j)}}var I=d3.select(this),J=this;a.utils.initSVG(I);var K=a.utils.availableWidth(t,I,q),L=a.utils.availableHeight(u,I,q)-v,M=v-r.top-r.bottom;if(b.update=function(){I.transition().duration(B).call(b)},b.container=this,C.setter(F(o),b.update).getter(E(o)).update(),C.disabled=o.map(function(a){return!!a.disabled}),!D){var N;D={};for(N in C)D[N]=C[N]instanceof Array?C[N].slice(0):C[N]}if(!(o&&o.length&&o.filter(function(a){return a.values.length}).length))return a.utils.noData(b,I),b;I.selectAll(".nv-noData").remove(),c=g.xScale(),d=g.yScale(),e=h.xScale(),f=h.yScale();var O=I.selectAll("g.nv-wrap.nv-lineWithFocusChart").data([o]),P=O.enter().append("g").attr("class","nvd3 nv-wrap nv-lineWithFocusChart").append("g"),Q=O.select("g");P.append("g").attr("class","nv-legendWrap");var R=P.append("g").attr("class","nv-focus");R.append("g").attr("class","nv-x nv-axis"),R.append("g").attr("class","nv-y nv-axis"),R.append("g").attr("class","nv-linesWrap"),R.append("g").attr("class","nv-interactive");var S=P.append("g").attr("class","nv-context");S.append("g").attr("class","nv-x nv-axis"),S.append("g").attr("class","nv-y nv-axis"),S.append("g").attr("class","nv-linesWrap"),S.append("g").attr("class","nv-brushBackground"),S.append("g").attr("class","nv-x nv-brush"),x&&(m.width(K),Q.select(".nv-legendWrap").datum(o).call(m),q.top!=m.height()&&(q.top=m.height(),L=a.utils.availableHeight(u,I,q)-v),Q.select(".nv-legendWrap").attr("transform","translate(0,"+-q.top+")")),O.attr("transform","translate("+q.left+","+q.top+")"),w&&(p.width(K).height(L).margin({left:q.left,top:q.top}).svgContainer(I).xScale(c),O.select(".nv-interactive").call(p)),g.width(K).height(L).color(o.map(function(a,b){return a.color||s(a,b)}).filter(function(a,b){return!o[b].disabled})),h.defined(g.defined()).width(K).height(M).color(o.map(function(a,b){return a.color||s(a,b)}).filter(function(a,b){return!o[b].disabled})),Q.select(".nv-context").attr("transform","translate(0,"+(L+q.bottom+r.top)+")");var T=Q.select(".nv-context .nv-linesWrap").datum(o.filter(function(a){return!a.disabled}));d3.transition(T).call(h),i.scale(c)._ticks(a.utils.calcTicksX(K/100,o)).tickSize(-L,0),j.scale(d)._ticks(a.utils.calcTicksY(L/36,o)).tickSize(-K,0),Q.select(".nv-focus .nv-x.nv-axis").attr("transform","translate(0,"+L+")"),n.x(e).on("brush",function(){H()}),y&&n.extent(y);var U=Q.select(".nv-brushBackground").selectAll("g").data([y||n.extent()]),V=U.enter().append("g");V.append("rect").attr("class","left").attr("x",0).attr("y",0).attr("height",M),V.append("rect").attr("class","right").attr("x",0).attr("y",0).attr("height",M);var W=Q.select(".nv-x.nv-brush").call(n);W.selectAll("rect").attr("height",M),W.selectAll(".resize").append("path").attr("d",z),H(),k.scale(e)._ticks(a.utils.calcTicksX(K/100,o)).tickSize(-M,0),Q.select(".nv-context .nv-x.nv-axis").attr("transform","translate(0,"+f.range()[0]+")"),d3.transition(Q.select(".nv-context .nv-x.nv-axis")).call(k),l.scale(f)._ticks(a.utils.calcTicksY(M/36,o)).tickSize(-K,0),d3.transition(Q.select(".nv-context .nv-y.nv-axis")).call(l),Q.select(".nv-context .nv-x.nv-axis").attr("transform","translate(0,"+f.range()[0]+")"),m.dispatch.on("stateChange",function(a){for(var c in a)C[c]=a[c];A.stateChange(C),b.update()}),p.dispatch.on("elementMousemove",function(c){g.clearHighlights();var d,f,h,k=[];if(o.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(i,j){var l=n.empty()?e.domain():n.extent(),m=i.values.filter(function(a,b){return g.x()(a,b)>=l[0]&&g.x()(a,b)<=l[1]});f=a.interactiveBisect(m,c.pointXValue,g.x());var o=m[f],p=b.y()(o,f);null!=p&&g.highlightPoint(j,f,!0),void 0!==o&&(void 0===d&&(d=o),void 0===h&&(h=b.xScale()(b.x()(o,f))),k.push({key:i.key,value:b.y()(o,f),color:s(i,i.seriesIndex)}))}),k.length>2){var l=b.yScale().invert(c.mouseY),m=Math.abs(b.yScale().domain()[0]-b.yScale().domain()[1]),r=.03*m,t=a.nearestValueIndex(k.map(function(a){return a.value}),l,r);null!==t&&(k[t].highlight=!0)}var u=i.tickFormat()(b.x()(d,f));p.tooltip.position({left:c.mouseX+q.left,top:c.mouseY+q.top}).chartContainer(J.parentNode).valueFormatter(function(a){return null==a?"N/A":j.tickFormat()(a)}).data({value:u,index:f,series:k})(),p.renderGuideLine(h)}),p.dispatch.on("elementMouseout",function(){g.clearHighlights()}),A.on("changeState",function(a){"undefined"!=typeof a.disabled&&o.forEach(function(b,c){b.disabled=a.disabled[c]}),b.update()})}),b}var c,d,e,f,g=a.models.line(),h=a.models.line(),i=a.models.axis(),j=a.models.axis(),k=a.models.axis(),l=a.models.axis(),m=a.models.legend(),n=d3.svg.brush(),o=a.models.tooltip(),p=a.interactiveGuideline(),q={top:30,right:30,bottom:30,left:60},r={top:0,right:30,bottom:20,left:60},s=a.utils.defaultColor(),t=null,u=null,v=50,w=!1,x=!0,y=null,z=null,A=d3.dispatch("brush","stateChange","changeState"),B=250,C=a.utils.state(),D=null;g.clipEdge(!0).duration(0),h.interactive(!1),i.orient("bottom").tickPadding(5),j.orient("left"),k.orient("bottom").tickPadding(5),l.orient("left"),o.valueFormatter(function(a,b){return j.tickFormat()(a,b)}).headerFormatter(function(a,b){return i.tickFormat()(a,b)});var E=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},F=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return g.dispatch.on("elementMouseover.tooltip",function(a){o.data(a).position(a.pos).hidden(!1)}),g.dispatch.on("elementMouseout.tooltip",function(){o.hidden(!0)}),b.dispatch=A,b.legend=m,b.lines=g,b.lines2=h,b.xAxis=i,b.yAxis=j,b.x2Axis=k,b.y2Axis=l,b.interactiveLayer=p,b.tooltip=o,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return t},set:function(a){t=a}},height:{get:function(){return u},set:function(a){u=a}},focusHeight:{get:function(){return v},set:function(a){v=a}},showLegend:{get:function(){return x},set:function(a){x=a}},brushExtent:{get:function(){return y},set:function(a){y=a}},defaultState:{get:function(){return D},set:function(a){D=a}},noData:{get:function(){return z},set:function(a){z=a}},tooltips:{get:function(){return o.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),o.enabled(!!b)}},tooltipContent:{get:function(){return o.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),o.contentGenerator(b)}},margin:{get:function(){return q},set:function(a){q.top=void 0!==a.top?a.top:q.top,q.right=void 0!==a.right?a.right:q.right,q.bottom=void 0!==a.bottom?a.bottom:q.bottom,q.left=void 0!==a.left?a.left:q.left}},color:{get:function(){return s},set:function(b){s=a.utils.getColor(b),m.color(s)}},interpolate:{get:function(){return g.interpolate()},set:function(a){g.interpolate(a),h.interpolate(a)}},xTickFormat:{get:function(){return i.tickFormat()},set:function(a){i.tickFormat(a),k.tickFormat(a)}},yTickFormat:{get:function(){return j.tickFormat()},set:function(a){j.tickFormat(a),l.tickFormat(a)}},duration:{get:function(){return B},set:function(a){B=a,j.duration(B),l.duration(B),i.duration(B),k.duration(B)}},x:{get:function(){return g.x()},set:function(a){g.x(a),h.x(a)}},y:{get:function(){return g.y()},set:function(a){g.y(a),h.y(a)}},useInteractiveGuideline:{get:function(){return w},set:function(a){w=a,w&&(g.interactive(!1),g.useVoronoi(!1))}}}),a.utils.inheritOptions(b,g),a.utils.initOptions(b),b},a.models.multiBar=function(){"use strict";function b(E){return C.reset(),E.each(function(b){var E=k-j.left-j.right,F=l-j.top-j.bottom;p=d3.select(this),a.utils.initSVG(p);var G=0;if(x&&b.length&&(x=[{values:b[0].values.map(function(a){return{x:a.x,y:0,series:a.series,size:.01}})}]),u){var H=d3.layout.stack().offset(v).values(function(a){return a.values}).y(r)(!b.length&&x?x:b);H.forEach(function(a,c){a.nonStackable?(b[c].nonStackableSeries=G++,H[c]=b[c]):c>0&&H[c-1].nonStackable&&H[c].values.map(function(a,b){a.y0-=H[c-1].values[b].y,a.y1=a.y0+a.y})}),b=H}b.forEach(function(a,b){a.values.forEach(function(c){c.series=b,c.key=a.key})}),u&&b[0].values.map(function(a,c){var d=0,e=0;b.map(function(a,f){if(!b[f].nonStackable){var g=a.values[c];g.size=Math.abs(g.y),g.y<0?(g.y1=e,e-=g.size):(g.y1=g.size+d,d+=g.size)}})});var I=d&&e?[]:b.map(function(a,b){return a.values.map(function(a,c){return{x:q(a,c),y:r(a,c),y0:a.y0,y1:a.y1,idx:b}})});m.domain(d||d3.merge(I).map(function(a){return a.x})).rangeBands(f||[0,E],A),n.domain(e||d3.extent(d3.merge(I).map(function(a){var c=a.y;return u&&!b[a.idx].nonStackable&&(c=a.y>0?a.y1:a.y1+a.y),c}).concat(s))).range(g||[F,0]),m.domain()[0]===m.domain()[1]&&m.domain(m.domain()[0]?[m.domain()[0]-.01*m.domain()[0],m.domain()[1]+.01*m.domain()[1]]:[-1,1]),n.domain()[0]===n.domain()[1]&&n.domain(n.domain()[0]?[n.domain()[0]+.01*n.domain()[0],n.domain()[1]-.01*n.domain()[1]]:[-1,1]),h=h||m,i=i||n;var J=p.selectAll("g.nv-wrap.nv-multibar").data([b]),K=J.enter().append("g").attr("class","nvd3 nv-wrap nv-multibar"),L=K.append("defs"),M=K.append("g"),N=J.select("g");M.append("g").attr("class","nv-groups"),J.attr("transform","translate("+j.left+","+j.top+")"),L.append("clipPath").attr("id","nv-edge-clip-"+o).append("rect"),J.select("#nv-edge-clip-"+o+" rect").attr("width",E).attr("height",F),N.attr("clip-path",t?"url(#nv-edge-clip-"+o+")":"");var O=J.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a,b){return b});O.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6);var P=C.transition(O.exit().selectAll("rect.nv-bar"),"multibarExit",Math.min(100,z)).attr("y",function(a){var c=i(0)||0;return u&&b[a.series]&&!b[a.series].nonStackable&&(c=i(a.y0)),c}).attr("height",0).remove();P.delay&&P.delay(function(a,b){var c=b*(z/(D+1))-b;return c}),O.attr("class",function(a,b){return"nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}).style("fill",function(a,b){return w(a,b)}).style("stroke",function(a,b){return w(a,b)}),O.style("stroke-opacity",1).style("fill-opacity",.75);var Q=O.selectAll("rect.nv-bar").data(function(a){return x&&!b.length?x.values:a.values});Q.exit().remove();Q.enter().append("rect").attr("class",function(a,b){return r(a,b)<0?"nv-bar negative":"nv-bar positive"}).attr("x",function(a,c,d){return u&&!b[d].nonStackable?0:d*m.rangeBand()/b.length}).attr("y",function(a,c,d){return i(u&&!b[d].nonStackable?a.y0:0)||0}).attr("height",0).attr("width",function(a,c,d){return m.rangeBand()/(u&&!b[d].nonStackable?1:b.length)}).attr("transform",function(a,b){return"translate("+m(q(a,b))+",0)"});Q.style("fill",function(a,b,c){return w(a,c,b)}).style("stroke",function(a,b,c){return w(a,c,b)}).on("mouseover",function(a,b){d3.select(this).classed("hover",!0),B.elementMouseover({data:a,index:b,color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){d3.select(this).classed("hover",!1),B.elementMouseout({data:a,index:b,color:d3.select(this).style("fill")})}).on("mousemove",function(a,b){B.elementMousemove({data:a,index:b,color:d3.select(this).style("fill")})}).on("click",function(a,b){B.elementClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()}).on("dblclick",function(a,b){B.elementDblClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()}),Q.attr("class",function(a,b){return r(a,b)<0?"nv-bar negative":"nv-bar positive"}).attr("transform",function(a,b){return"translate("+m(q(a,b))+",0)"}),y&&(c||(c=b.map(function(){return!0})),Q.style("fill",function(a,b,d){return d3.rgb(y(a,b)).darker(c.map(function(a,b){return b}).filter(function(a,b){return!c[b]})[d]).toString()}).style("stroke",function(a,b,d){return d3.rgb(y(a,b)).darker(c.map(function(a,b){return b}).filter(function(a,b){return!c[b]})[d]).toString()}));var R=Q.watchTransition(C,"multibar",Math.min(250,z)).delay(function(a,c){return c*z/b[0].values.length});u?R.attr("y",function(a,c,d){var e=0;return e=b[d].nonStackable?r(a,c)<0?n(0):n(0)-n(r(a,c))<-1?n(0)-1:n(r(a,c))||0:n(a.y1)}).attr("height",function(a,c,d){return b[d].nonStackable?Math.max(Math.abs(n(r(a,c))-n(0)),1)||0:Math.max(Math.abs(n(a.y+a.y0)-n(a.y0)),1)}).attr("x",function(a,c,d){var e=0;return b[d].nonStackable&&(e=a.series*m.rangeBand()/b.length,b.length!==G&&(e=b[d].nonStackableSeries*m.rangeBand()/(2*G))),e}).attr("width",function(a,c,d){if(b[d].nonStackable){var e=m.rangeBand()/G;return b.length!==G&&(e=m.rangeBand()/(2*G)),e}return m.rangeBand()}):R.attr("x",function(a){return a.series*m.rangeBand()/b.length}).attr("width",m.rangeBand()/b.length).attr("y",function(a,b){return r(a,b)<0?n(0):n(0)-n(r(a,b))<1?n(0)-1:n(r(a,b))||0}).attr("height",function(a,b){return Math.max(Math.abs(n(r(a,b))-n(0)),1)||0}),h=m.copy(),i=n.copy(),b[0]&&b[0].values&&(D=b[0].values.length)}),C.renderEnd("multibar immediate"),b}var c,d,e,f,g,h,i,j={top:0,right:0,bottom:0,left:0},k=960,l=500,m=d3.scale.ordinal(),n=d3.scale.linear(),o=Math.floor(1e4*Math.random()),p=null,q=function(a){return a.x},r=function(a){return a.y},s=[0],t=!0,u=!1,v="zero",w=a.utils.defaultColor(),x=!1,y=null,z=500,A=.1,B=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),C=a.utils.renderWatch(B,z),D=0;return b.dispatch=B,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},x:{get:function(){return q},set:function(a){q=a}},y:{get:function(){return r},set:function(a){r=a}},xScale:{get:function(){return m},set:function(a){m=a}},yScale:{get:function(){return n},set:function(a){n=a}},xDomain:{get:function(){return d},set:function(a){d=a}},yDomain:{get:function(){return e},set:function(a){e=a}},xRange:{get:function(){return f},set:function(a){f=a}},yRange:{get:function(){return g},set:function(a){g=a}},forceY:{get:function(){return s},set:function(a){s=a}},stacked:{get:function(){return u},set:function(a){u=a}},stackOffset:{get:function(){return v},set:function(a){v=a}},clipEdge:{get:function(){return t},set:function(a){t=a}},disabled:{get:function(){return c},set:function(a){c=a}},id:{get:function(){return o},set:function(a){o=a}},hideable:{get:function(){return x},set:function(a){x=a}},groupSpacing:{get:function(){return A},set:function(a){A=a}},margin:{get:function(){return j},set:function(a){j.top=void 0!==a.top?a.top:j.top,j.right=void 0!==a.right?a.right:j.right,j.bottom=void 0!==a.bottom?a.bottom:j.bottom,j.left=void 0!==a.left?a.left:j.left}},duration:{get:function(){return z},set:function(a){z=a,C.reset(z)}},color:{get:function(){return w},set:function(b){w=a.utils.getColor(b)}},barColor:{get:function(){return y},set:function(b){y=b?a.utils.getColor(b):null}}}),a.utils.initOptions(b),b},a.models.multiBarChart=function(){"use strict";function b(j){return D.reset(),D.models(e),r&&D.models(f),s&&D.models(g),j.each(function(j){var z=d3.select(this);a.utils.initSVG(z);var D=a.utils.availableWidth(l,z,k),H=a.utils.availableHeight(m,z,k);if(b.update=function(){0===C?z.call(b):z.transition().duration(C).call(b)},b.container=this,x.setter(G(j),b.update).getter(F(j)).update(),x.disabled=j.map(function(a){return!!a.disabled}),!y){var I;y={};for(I in x)y[I]=x[I]instanceof Array?x[I].slice(0):x[I]}if(!(j&&j.length&&j.filter(function(a){return a.values.length}).length))return a.utils.noData(b,z),b;z.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale(); -var J=z.selectAll("g.nv-wrap.nv-multiBarWithLegend").data([j]),K=J.enter().append("g").attr("class","nvd3 nv-wrap nv-multiBarWithLegend").append("g"),L=J.select("g");if(K.append("g").attr("class","nv-x nv-axis"),K.append("g").attr("class","nv-y nv-axis"),K.append("g").attr("class","nv-barsWrap"),K.append("g").attr("class","nv-legendWrap"),K.append("g").attr("class","nv-controlsWrap"),q&&(h.width(D-B()),L.select(".nv-legendWrap").datum(j).call(h),k.top!=h.height()&&(k.top=h.height(),H=a.utils.availableHeight(m,z,k)),L.select(".nv-legendWrap").attr("transform","translate("+B()+","+-k.top+")")),o){var M=[{key:p.grouped||"Grouped",disabled:e.stacked()},{key:p.stacked||"Stacked",disabled:!e.stacked()}];i.width(B()).color(["#444","#444","#444"]),L.select(".nv-controlsWrap").datum(M).attr("transform","translate(0,"+-k.top+")").call(i)}J.attr("transform","translate("+k.left+","+k.top+")"),t&&L.select(".nv-y.nv-axis").attr("transform","translate("+D+",0)"),e.disabled(j.map(function(a){return a.disabled})).width(D).height(H).color(j.map(function(a,b){return a.color||n(a,b)}).filter(function(a,b){return!j[b].disabled}));var N=L.select(".nv-barsWrap").datum(j.filter(function(a){return!a.disabled}));if(N.call(e),r){f.scale(c)._ticks(a.utils.calcTicksX(D/100,j)).tickSize(-H,0),L.select(".nv-x.nv-axis").attr("transform","translate(0,"+d.range()[0]+")"),L.select(".nv-x.nv-axis").call(f);var O=L.select(".nv-x.nv-axis > g").selectAll("g");if(O.selectAll("line, text").style("opacity",1),v){var P=function(a,b){return"translate("+a+","+b+")"},Q=5,R=17;O.selectAll("text").attr("transform",function(a,b,c){return P(0,c%2==0?Q:R)});var S=d3.selectAll(".nv-x.nv-axis .nv-wrap g g text")[0].length;L.selectAll(".nv-x.nv-axis .nv-axisMaxMin text").attr("transform",function(a,b){return P(0,0===b||S%2!==0?R:Q)})}u&&O.filter(function(a,b){return b%Math.ceil(j[0].values.length/(D/100))!==0}).selectAll("text, line").style("opacity",0),w&&O.selectAll(".tick text").attr("transform","rotate("+w+" 0,0)").style("text-anchor",w>0?"start":"end"),L.select(".nv-x.nv-axis").selectAll("g.nv-axisMaxMin text").style("opacity",1)}s&&(g.scale(d)._ticks(a.utils.calcTicksY(H/36,j)).tickSize(-D,0),L.select(".nv-y.nv-axis").call(g)),h.dispatch.on("stateChange",function(a){for(var c in a)x[c]=a[c];A.stateChange(x),b.update()}),i.dispatch.on("legendClick",function(a){if(a.disabled){switch(M=M.map(function(a){return a.disabled=!0,a}),a.disabled=!1,a.key){case"Grouped":case p.grouped:e.stacked(!1);break;case"Stacked":case p.stacked:e.stacked(!0)}x.stacked=e.stacked(),A.stateChange(x),b.update()}}),A.on("changeState",function(a){"undefined"!=typeof a.disabled&&(j.forEach(function(b,c){b.disabled=a.disabled[c]}),x.disabled=a.disabled),"undefined"!=typeof a.stacked&&(e.stacked(a.stacked),x.stacked=a.stacked,E=a.stacked),b.update()})}),D.renderEnd("multibarchart immediate"),b}var c,d,e=a.models.multiBar(),f=a.models.axis(),g=a.models.axis(),h=a.models.legend(),i=a.models.legend(),j=a.models.tooltip(),k={top:30,right:20,bottom:50,left:60},l=null,m=null,n=a.utils.defaultColor(),o=!0,p={},q=!0,r=!0,s=!0,t=!1,u=!0,v=!1,w=0,x=a.utils.state(),y=null,z=null,A=d3.dispatch("stateChange","changeState","renderEnd"),B=function(){return o?180:0},C=250;x.stacked=!1,e.stacked(!1),f.orient("bottom").tickPadding(7).showMaxMin(!1).tickFormat(function(a){return a}),g.orient(t?"right":"left").tickFormat(d3.format(",.1f")),j.duration(0).valueFormatter(function(a,b){return g.tickFormat()(a,b)}).headerFormatter(function(a,b){return f.tickFormat()(a,b)}),i.updateState(!1);var D=a.utils.renderWatch(A),E=!1,F=function(a){return function(){return{active:a.map(function(a){return!a.disabled}),stacked:E}}},G=function(a){return function(b){void 0!==b.stacked&&(E=b.stacked),void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return e.dispatch.on("elementMouseover.tooltip",function(a){a.value=b.x()(a.data),a.series={key:a.data.key,value:b.y()(a.data),color:a.color},j.data(a).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(){j.hidden(!0)}),e.dispatch.on("elementMousemove.tooltip",function(){j.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=A,b.multibar=e,b.legend=h,b.controls=i,b.xAxis=f,b.yAxis=g,b.state=x,b.tooltip=j,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return l},set:function(a){l=a}},height:{get:function(){return m},set:function(a){m=a}},showLegend:{get:function(){return q},set:function(a){q=a}},showControls:{get:function(){return o},set:function(a){o=a}},controlLabels:{get:function(){return p},set:function(a){p=a}},showXAxis:{get:function(){return r},set:function(a){r=a}},showYAxis:{get:function(){return s},set:function(a){s=a}},defaultState:{get:function(){return y},set:function(a){y=a}},noData:{get:function(){return z},set:function(a){z=a}},reduceXTicks:{get:function(){return u},set:function(a){u=a}},rotateLabels:{get:function(){return w},set:function(a){w=a}},staggerLabels:{get:function(){return v},set:function(a){v=a}},tooltips:{get:function(){return j.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),j.enabled(!!b)}},tooltipContent:{get:function(){return j.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),j.contentGenerator(b)}},margin:{get:function(){return k},set:function(a){k.top=void 0!==a.top?a.top:k.top,k.right=void 0!==a.right?a.right:k.right,k.bottom=void 0!==a.bottom?a.bottom:k.bottom,k.left=void 0!==a.left?a.left:k.left}},duration:{get:function(){return C},set:function(a){C=a,e.duration(C),f.duration(C),g.duration(C),D.reset(C)}},color:{get:function(){return n},set:function(b){n=a.utils.getColor(b),h.color(n)}},rightAlignYAxis:{get:function(){return t},set:function(a){t=a,g.orient(t?"right":"left")}},barColor:{get:function(){return e.barColor},set:function(a){e.barColor(a),h.color(function(a,b){return d3.rgb("#ccc").darker(1.5*b).toString()})}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.multiBarHorizontal=function(){"use strict";function b(m){return E.reset(),m.each(function(b){var m=k-j.left-j.right,C=l-j.top-j.bottom;n=d3.select(this),a.utils.initSVG(n),w&&(b=d3.layout.stack().offset("zero").values(function(a){return a.values}).y(r)(b)),b.forEach(function(a,b){a.values.forEach(function(c){c.series=b,c.key=a.key})}),w&&b[0].values.map(function(a,c){var d=0,e=0;b.map(function(a){var b=a.values[c];b.size=Math.abs(b.y),b.y<0?(b.y1=e-b.size,e-=b.size):(b.y1=d,d+=b.size)})});var F=d&&e?[]:b.map(function(a){return a.values.map(function(a,b){return{x:q(a,b),y:r(a,b),y0:a.y0,y1:a.y1}})});o.domain(d||d3.merge(F).map(function(a){return a.x})).rangeBands(f||[0,C],A),p.domain(e||d3.extent(d3.merge(F).map(function(a){return w?a.y>0?a.y1+a.y:a.y1:a.y}).concat(t))),p.range(x&&!w?g||[p.domain()[0]<0?z:0,m-(p.domain()[1]>0?z:0)]:g||[0,m]),h=h||o,i=i||d3.scale.linear().domain(p.domain()).range([p(0),p(0)]);{var G=d3.select(this).selectAll("g.nv-wrap.nv-multibarHorizontal").data([b]),H=G.enter().append("g").attr("class","nvd3 nv-wrap nv-multibarHorizontal"),I=(H.append("defs"),H.append("g"));G.select("g")}I.append("g").attr("class","nv-groups"),G.attr("transform","translate("+j.left+","+j.top+")");var J=G.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a,b){return b});J.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6),J.exit().watchTransition(E,"multibarhorizontal: exit groups").style("stroke-opacity",1e-6).style("fill-opacity",1e-6).remove(),J.attr("class",function(a,b){return"nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}).style("fill",function(a,b){return u(a,b)}).style("stroke",function(a,b){return u(a,b)}),J.watchTransition(E,"multibarhorizontal: groups").style("stroke-opacity",1).style("fill-opacity",.75);var K=J.selectAll("g.nv-bar").data(function(a){return a.values});K.exit().remove();var L=K.enter().append("g").attr("transform",function(a,c,d){return"translate("+i(w?a.y0:0)+","+(w?0:d*o.rangeBand()/b.length+o(q(a,c)))+")"});L.append("rect").attr("width",0).attr("height",o.rangeBand()/(w?1:b.length)),K.on("mouseover",function(a,b){d3.select(this).classed("hover",!0),D.elementMouseover({data:a,index:b,color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){d3.select(this).classed("hover",!1),D.elementMouseout({data:a,index:b,color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){D.elementMouseout({data:a,index:b,color:d3.select(this).style("fill")})}).on("mousemove",function(a,b){D.elementMousemove({data:a,index:b,color:d3.select(this).style("fill")})}).on("click",function(a,b){D.elementClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()}).on("dblclick",function(a,b){D.elementDblClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()}),s(b[0],0)&&(L.append("polyline"),K.select("polyline").attr("fill","none").attr("points",function(a,c){var d=s(a,c),e=.8*o.rangeBand()/(2*(w?1:b.length));d=d.length?d:[-Math.abs(d),Math.abs(d)],d=d.map(function(a){return p(a)-p(0)});var f=[[d[0],-e],[d[0],e],[d[0],0],[d[1],0],[d[1],-e],[d[1],e]];return f.map(function(a){return a.join(",")}).join(" ")}).attr("transform",function(a,c){var d=o.rangeBand()/(2*(w?1:b.length));return"translate("+(r(a,c)<0?0:p(r(a,c))-p(0))+", "+d+")"})),L.append("text"),x&&!w?(K.select("text").attr("text-anchor",function(a,b){return r(a,b)<0?"end":"start"}).attr("y",o.rangeBand()/(2*b.length)).attr("dy",".32em").text(function(a,b){var c=B(r(a,b)),d=s(a,b);return void 0===d?c:d.length?c+"+"+B(Math.abs(d[1]))+"-"+B(Math.abs(d[0])):c+"±"+B(Math.abs(d))}),K.watchTransition(E,"multibarhorizontal: bars").select("text").attr("x",function(a,b){return r(a,b)<0?-4:p(r(a,b))-p(0)+4})):K.selectAll("text").text(""),y&&!w?(L.append("text").classed("nv-bar-label",!0),K.select("text.nv-bar-label").attr("text-anchor",function(a,b){return r(a,b)<0?"start":"end"}).attr("y",o.rangeBand()/(2*b.length)).attr("dy",".32em").text(function(a,b){return q(a,b)}),K.watchTransition(E,"multibarhorizontal: bars").select("text.nv-bar-label").attr("x",function(a,b){return r(a,b)<0?p(0)-p(r(a,b))+4:-4})):K.selectAll("text.nv-bar-label").text(""),K.attr("class",function(a,b){return r(a,b)<0?"nv-bar negative":"nv-bar positive"}),v&&(c||(c=b.map(function(){return!0})),K.style("fill",function(a,b,d){return d3.rgb(v(a,b)).darker(c.map(function(a,b){return b}).filter(function(a,b){return!c[b]})[d]).toString()}).style("stroke",function(a,b,d){return d3.rgb(v(a,b)).darker(c.map(function(a,b){return b}).filter(function(a,b){return!c[b]})[d]).toString()})),w?K.watchTransition(E,"multibarhorizontal: bars").attr("transform",function(a,b){return"translate("+p(a.y1)+","+o(q(a,b))+")"}).select("rect").attr("width",function(a,b){return Math.abs(p(r(a,b)+a.y0)-p(a.y0))}).attr("height",o.rangeBand()):K.watchTransition(E,"multibarhorizontal: bars").attr("transform",function(a,c){return"translate("+p(r(a,c)<0?r(a,c):0)+","+(a.series*o.rangeBand()/b.length+o(q(a,c)))+")"}).select("rect").attr("height",o.rangeBand()/b.length).attr("width",function(a,b){return Math.max(Math.abs(p(r(a,b))-p(0)),1)}),h=o.copy(),i=p.copy()}),E.renderEnd("multibarHorizontal immediate"),b}var c,d,e,f,g,h,i,j={top:0,right:0,bottom:0,left:0},k=960,l=500,m=Math.floor(1e4*Math.random()),n=null,o=d3.scale.ordinal(),p=d3.scale.linear(),q=function(a){return a.x},r=function(a){return a.y},s=function(a){return a.yErr},t=[0],u=a.utils.defaultColor(),v=null,w=!1,x=!1,y=!1,z=60,A=.1,B=d3.format(",.2f"),C=250,D=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),E=a.utils.renderWatch(D,C);return b.dispatch=D,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},x:{get:function(){return q},set:function(a){q=a}},y:{get:function(){return r},set:function(a){r=a}},yErr:{get:function(){return s},set:function(a){s=a}},xScale:{get:function(){return o},set:function(a){o=a}},yScale:{get:function(){return p},set:function(a){p=a}},xDomain:{get:function(){return d},set:function(a){d=a}},yDomain:{get:function(){return e},set:function(a){e=a}},xRange:{get:function(){return f},set:function(a){f=a}},yRange:{get:function(){return g},set:function(a){g=a}},forceY:{get:function(){return t},set:function(a){t=a}},stacked:{get:function(){return w},set:function(a){w=a}},showValues:{get:function(){return x},set:function(a){x=a}},disabled:{get:function(){return c},set:function(a){c=a}},id:{get:function(){return m},set:function(a){m=a}},valueFormat:{get:function(){return B},set:function(a){B=a}},valuePadding:{get:function(){return z},set:function(a){z=a}},groupSpacing:{get:function(){return A},set:function(a){A=a}},margin:{get:function(){return j},set:function(a){j.top=void 0!==a.top?a.top:j.top,j.right=void 0!==a.right?a.right:j.right,j.bottom=void 0!==a.bottom?a.bottom:j.bottom,j.left=void 0!==a.left?a.left:j.left}},duration:{get:function(){return C},set:function(a){C=a,E.reset(C)}},color:{get:function(){return u},set:function(b){u=a.utils.getColor(b)}},barColor:{get:function(){return v},set:function(b){v=b?a.utils.getColor(b):null}}}),a.utils.initOptions(b),b},a.models.multiBarHorizontalChart=function(){"use strict";function b(j){return C.reset(),C.models(e),r&&C.models(f),s&&C.models(g),j.each(function(j){var w=d3.select(this);a.utils.initSVG(w);var C=a.utils.availableWidth(l,w,k),D=a.utils.availableHeight(m,w,k);if(b.update=function(){w.transition().duration(z).call(b)},b.container=this,t=e.stacked(),u.setter(B(j),b.update).getter(A(j)).update(),u.disabled=j.map(function(a){return!!a.disabled}),!v){var E;v={};for(E in u)v[E]=u[E]instanceof Array?u[E].slice(0):u[E]}if(!(j&&j.length&&j.filter(function(a){return a.values.length}).length))return a.utils.noData(b,w),b;w.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale();var F=w.selectAll("g.nv-wrap.nv-multiBarHorizontalChart").data([j]),G=F.enter().append("g").attr("class","nvd3 nv-wrap nv-multiBarHorizontalChart").append("g"),H=F.select("g");if(G.append("g").attr("class","nv-x nv-axis"),G.append("g").attr("class","nv-y nv-axis").append("g").attr("class","nv-zeroLine").append("line"),G.append("g").attr("class","nv-barsWrap"),G.append("g").attr("class","nv-legendWrap"),G.append("g").attr("class","nv-controlsWrap"),q&&(h.width(C-y()),H.select(".nv-legendWrap").datum(j).call(h),k.top!=h.height()&&(k.top=h.height(),D=a.utils.availableHeight(m,w,k)),H.select(".nv-legendWrap").attr("transform","translate("+y()+","+-k.top+")")),o){var I=[{key:p.grouped||"Grouped",disabled:e.stacked()},{key:p.stacked||"Stacked",disabled:!e.stacked()}];i.width(y()).color(["#444","#444","#444"]),H.select(".nv-controlsWrap").datum(I).attr("transform","translate(0,"+-k.top+")").call(i)}F.attr("transform","translate("+k.left+","+k.top+")"),e.disabled(j.map(function(a){return a.disabled})).width(C).height(D).color(j.map(function(a,b){return a.color||n(a,b)}).filter(function(a,b){return!j[b].disabled}));var J=H.select(".nv-barsWrap").datum(j.filter(function(a){return!a.disabled}));if(J.transition().call(e),r){f.scale(c)._ticks(a.utils.calcTicksY(D/24,j)).tickSize(-C,0),H.select(".nv-x.nv-axis").call(f);var K=H.select(".nv-x.nv-axis").selectAll("g");K.selectAll("line, text")}s&&(g.scale(d)._ticks(a.utils.calcTicksX(C/100,j)).tickSize(-D,0),H.select(".nv-y.nv-axis").attr("transform","translate(0,"+D+")"),H.select(".nv-y.nv-axis").call(g)),H.select(".nv-zeroLine line").attr("x1",d(0)).attr("x2",d(0)).attr("y1",0).attr("y2",-D),h.dispatch.on("stateChange",function(a){for(var c in a)u[c]=a[c];x.stateChange(u),b.update()}),i.dispatch.on("legendClick",function(a){if(a.disabled){switch(I=I.map(function(a){return a.disabled=!0,a}),a.disabled=!1,a.key){case"Grouped":e.stacked(!1);break;case"Stacked":e.stacked(!0)}u.stacked=e.stacked(),x.stateChange(u),t=e.stacked(),b.update()}}),x.on("changeState",function(a){"undefined"!=typeof a.disabled&&(j.forEach(function(b,c){b.disabled=a.disabled[c]}),u.disabled=a.disabled),"undefined"!=typeof a.stacked&&(e.stacked(a.stacked),u.stacked=a.stacked,t=a.stacked),b.update()})}),C.renderEnd("multibar horizontal chart immediate"),b}var c,d,e=a.models.multiBarHorizontal(),f=a.models.axis(),g=a.models.axis(),h=a.models.legend().height(30),i=a.models.legend().height(30),j=a.models.tooltip(),k={top:30,right:20,bottom:50,left:60},l=null,m=null,n=a.utils.defaultColor(),o=!0,p={},q=!0,r=!0,s=!0,t=!1,u=a.utils.state(),v=null,w=null,x=d3.dispatch("stateChange","changeState","renderEnd"),y=function(){return o?180:0},z=250;u.stacked=!1,e.stacked(t),f.orient("left").tickPadding(5).showMaxMin(!1).tickFormat(function(a){return a}),g.orient("bottom").tickFormat(d3.format(",.1f")),j.duration(0).valueFormatter(function(a,b){return g.tickFormat()(a,b)}).headerFormatter(function(a,b){return f.tickFormat()(a,b)}),i.updateState(!1);var A=function(a){return function(){return{active:a.map(function(a){return!a.disabled}),stacked:t}}},B=function(a){return function(b){void 0!==b.stacked&&(t=b.stacked),void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}},C=a.utils.renderWatch(x,z);return e.dispatch.on("elementMouseover.tooltip",function(a){a.value=b.x()(a.data),a.series={key:a.data.key,value:b.y()(a.data),color:a.color},j.data(a).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(){j.hidden(!0)}),e.dispatch.on("elementMousemove.tooltip",function(){j.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=x,b.multibar=e,b.legend=h,b.controls=i,b.xAxis=f,b.yAxis=g,b.state=u,b.tooltip=j,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return l},set:function(a){l=a}},height:{get:function(){return m},set:function(a){m=a}},showLegend:{get:function(){return q},set:function(a){q=a}},showControls:{get:function(){return o},set:function(a){o=a}},controlLabels:{get:function(){return p},set:function(a){p=a}},showXAxis:{get:function(){return r},set:function(a){r=a}},showYAxis:{get:function(){return s},set:function(a){s=a}},defaultState:{get:function(){return v},set:function(a){v=a}},noData:{get:function(){return w},set:function(a){w=a}},tooltips:{get:function(){return j.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),j.enabled(!!b)}},tooltipContent:{get:function(){return j.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),j.contentGenerator(b)}},margin:{get:function(){return k},set:function(a){k.top=void 0!==a.top?a.top:k.top,k.right=void 0!==a.right?a.right:k.right,k.bottom=void 0!==a.bottom?a.bottom:k.bottom,k.left=void 0!==a.left?a.left:k.left}},duration:{get:function(){return z},set:function(a){z=a,C.reset(z),e.duration(z),f.duration(z),g.duration(z)}},color:{get:function(){return n},set:function(b){n=a.utils.getColor(b),h.color(n)}},barColor:{get:function(){return e.barColor},set:function(a){e.barColor(a),h.color(function(a,b){return d3.rgb("#ccc").darker(1.5*b).toString()})}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.multiChart=function(){"use strict";function b(j){return j.each(function(j){function k(a){var b=2===j[a.seriesIndex].yAxis?z:y;a.value=a.point.x,a.series={value:a.point.y,color:a.point.color},B.duration(100).valueFormatter(function(a,c){return b.tickFormat()(a,c)}).data(a).position(a.pos).hidden(!1)}function l(a){var b=2===j[a.seriesIndex].yAxis?z:y;a.point.x=v.x()(a.point),a.point.y=v.y()(a.point),B.duration(100).valueFormatter(function(a,c){return b.tickFormat()(a,c)}).data(a).position(a.pos).hidden(!1)}function n(a){var b=2===j[a.data.series].yAxis?z:y;a.value=t.x()(a.data),a.series={value:t.y()(a.data),color:a.color},B.duration(0).valueFormatter(function(a,c){return b.tickFormat()(a,c)}).data(a).hidden(!1)}var C=d3.select(this);a.utils.initSVG(C),b.update=function(){C.transition().call(b)},b.container=this;var D=a.utils.availableWidth(g,C,e),E=a.utils.availableHeight(h,C,e),F=j.filter(function(a){return"line"==a.type&&1==a.yAxis}),G=j.filter(function(a){return"line"==a.type&&2==a.yAxis}),H=j.filter(function(a){return"bar"==a.type&&1==a.yAxis}),I=j.filter(function(a){return"bar"==a.type&&2==a.yAxis}),J=j.filter(function(a){return"area"==a.type&&1==a.yAxis}),K=j.filter(function(a){return"area"==a.type&&2==a.yAxis});if(!(j&&j.length&&j.filter(function(a){return a.values.length}).length))return a.utils.noData(b,C),b;C.selectAll(".nv-noData").remove();var L=j.filter(function(a){return!a.disabled&&1==a.yAxis}).map(function(a){return a.values.map(function(a){return{x:a.x,y:a.y}})}),M=j.filter(function(a){return!a.disabled&&2==a.yAxis}).map(function(a){return a.values.map(function(a){return{x:a.x,y:a.y}})});o.domain(d3.extent(d3.merge(L.concat(M)),function(a){return a.x})).range([0,D]);var N=C.selectAll("g.wrap.multiChart").data([j]),O=N.enter().append("g").attr("class","wrap nvd3 multiChart").append("g");O.append("g").attr("class","nv-x nv-axis"),O.append("g").attr("class","nv-y1 nv-axis"),O.append("g").attr("class","nv-y2 nv-axis"),O.append("g").attr("class","lines1Wrap"),O.append("g").attr("class","lines2Wrap"),O.append("g").attr("class","bars1Wrap"),O.append("g").attr("class","bars2Wrap"),O.append("g").attr("class","stack1Wrap"),O.append("g").attr("class","stack2Wrap"),O.append("g").attr("class","legendWrap");var P=N.select("g"),Q=j.map(function(a,b){return j[b].color||f(a,b)});if(i){var R=A.align()?D/2:D,S=A.align()?R:0;A.width(R),A.color(Q),P.select(".legendWrap").datum(j.map(function(a){return a.originalKey=void 0===a.originalKey?a.key:a.originalKey,a.key=a.originalKey+(1==a.yAxis?"":" (right axis)"),a})).call(A),e.top!=A.height()&&(e.top=A.height(),E=a.utils.availableHeight(h,C,e)),P.select(".legendWrap").attr("transform","translate("+S+","+-e.top+")")}r.width(D).height(E).interpolate(m).color(Q.filter(function(a,b){return!j[b].disabled&&1==j[b].yAxis&&"line"==j[b].type})),s.width(D).height(E).interpolate(m).color(Q.filter(function(a,b){return!j[b].disabled&&2==j[b].yAxis&&"line"==j[b].type})),t.width(D).height(E).color(Q.filter(function(a,b){return!j[b].disabled&&1==j[b].yAxis&&"bar"==j[b].type})),u.width(D).height(E).color(Q.filter(function(a,b){return!j[b].disabled&&2==j[b].yAxis&&"bar"==j[b].type})),v.width(D).height(E).color(Q.filter(function(a,b){return!j[b].disabled&&1==j[b].yAxis&&"area"==j[b].type})),w.width(D).height(E).color(Q.filter(function(a,b){return!j[b].disabled&&2==j[b].yAxis&&"area"==j[b].type})),P.attr("transform","translate("+e.left+","+e.top+")");var T=P.select(".lines1Wrap").datum(F.filter(function(a){return!a.disabled})),U=P.select(".bars1Wrap").datum(H.filter(function(a){return!a.disabled})),V=P.select(".stack1Wrap").datum(J.filter(function(a){return!a.disabled})),W=P.select(".lines2Wrap").datum(G.filter(function(a){return!a.disabled})),X=P.select(".bars2Wrap").datum(I.filter(function(a){return!a.disabled})),Y=P.select(".stack2Wrap").datum(K.filter(function(a){return!a.disabled})),Z=J.length?J.map(function(a){return a.values}).reduce(function(a,b){return a.map(function(a,c){return{x:a.x,y:a.y+b[c].y}})}).concat([{x:0,y:0}]):[],$=K.length?K.map(function(a){return a.values}).reduce(function(a,b){return a.map(function(a,c){return{x:a.x,y:a.y+b[c].y}})}).concat([{x:0,y:0}]):[];p.domain(c||d3.extent(d3.merge(L).concat(Z),function(a){return a.y})).range([0,E]),q.domain(d||d3.extent(d3.merge(M).concat($),function(a){return a.y})).range([0,E]),r.yDomain(p.domain()),t.yDomain(p.domain()),v.yDomain(p.domain()),s.yDomain(q.domain()),u.yDomain(q.domain()),w.yDomain(q.domain()),J.length&&d3.transition(V).call(v),K.length&&d3.transition(Y).call(w),H.length&&d3.transition(U).call(t),I.length&&d3.transition(X).call(u),F.length&&d3.transition(T).call(r),G.length&&d3.transition(W).call(s),x._ticks(a.utils.calcTicksX(D/100,j)).tickSize(-E,0),P.select(".nv-x.nv-axis").attr("transform","translate(0,"+E+")"),d3.transition(P.select(".nv-x.nv-axis")).call(x),y._ticks(a.utils.calcTicksY(E/36,j)).tickSize(-D,0),d3.transition(P.select(".nv-y1.nv-axis")).call(y),z._ticks(a.utils.calcTicksY(E/36,j)).tickSize(-D,0),d3.transition(P.select(".nv-y2.nv-axis")).call(z),P.select(".nv-y1.nv-axis").classed("nv-disabled",L.length?!1:!0).attr("transform","translate("+o.range()[0]+",0)"),P.select(".nv-y2.nv-axis").classed("nv-disabled",M.length?!1:!0).attr("transform","translate("+o.range()[1]+",0)"),A.dispatch.on("stateChange",function(){b.update()}),r.dispatch.on("elementMouseover.tooltip",k),s.dispatch.on("elementMouseover.tooltip",k),r.dispatch.on("elementMouseout.tooltip",function(){B.hidden(!0)}),s.dispatch.on("elementMouseout.tooltip",function(){B.hidden(!0)}),v.dispatch.on("elementMouseover.tooltip",l),w.dispatch.on("elementMouseover.tooltip",l),v.dispatch.on("elementMouseout.tooltip",function(){B.hidden(!0)}),w.dispatch.on("elementMouseout.tooltip",function(){B.hidden(!0)}),t.dispatch.on("elementMouseover.tooltip",n),u.dispatch.on("elementMouseover.tooltip",n),t.dispatch.on("elementMouseout.tooltip",function(){B.hidden(!0)}),u.dispatch.on("elementMouseout.tooltip",function(){B.hidden(!0)}),t.dispatch.on("elementMousemove.tooltip",function(){B.position({top:d3.event.pageY,left:d3.event.pageX})()}),u.dispatch.on("elementMousemove.tooltip",function(){B.position({top:d3.event.pageY,left:d3.event.pageX})()})}),b}var c,d,e={top:30,right:20,bottom:50,left:60},f=a.utils.defaultColor(),g=null,h=null,i=!0,j=null,k=function(a){return a.x},l=function(a){return a.y},m="monotone",n=!0,o=d3.scale.linear(),p=d3.scale.linear(),q=d3.scale.linear(),r=a.models.line().yScale(p),s=a.models.line().yScale(q),t=a.models.multiBar().stacked(!1).yScale(p),u=a.models.multiBar().stacked(!1).yScale(q),v=a.models.stackedArea().yScale(p),w=a.models.stackedArea().yScale(q),x=a.models.axis().scale(o).orient("bottom").tickPadding(5),y=a.models.axis().scale(p).orient("left"),z=a.models.axis().scale(q).orient("right"),A=a.models.legend().height(30),B=a.models.tooltip(),C=d3.dispatch();return b.dispatch=C,b.lines1=r,b.lines2=s,b.bars1=t,b.bars2=u,b.stack1=v,b.stack2=w,b.xAxis=x,b.yAxis1=y,b.yAxis2=z,b.tooltip=B,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return g},set:function(a){g=a}},height:{get:function(){return h},set:function(a){h=a}},showLegend:{get:function(){return i},set:function(a){i=a}},yDomain1:{get:function(){return c},set:function(a){c=a}},yDomain2:{get:function(){return d},set:function(a){d=a}},noData:{get:function(){return j},set:function(a){j=a}},interpolate:{get:function(){return m},set:function(a){m=a}},tooltips:{get:function(){return B.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),B.enabled(!!b)}},tooltipContent:{get:function(){return B.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),B.contentGenerator(b)}},margin:{get:function(){return e},set:function(a){e.top=void 0!==a.top?a.top:e.top,e.right=void 0!==a.right?a.right:e.right,e.bottom=void 0!==a.bottom?a.bottom:e.bottom,e.left=void 0!==a.left?a.left:e.left}},color:{get:function(){return f},set:function(b){f=a.utils.getColor(b)}},x:{get:function(){return k},set:function(a){k=a,r.x(a),s.x(a),t.x(a),u.x(a),v.x(a),w.x(a)}},y:{get:function(){return l},set:function(a){l=a,r.y(a),s.y(a),v.y(a),w.y(a),t.y(a),u.y(a)}},useVoronoi:{get:function(){return n},set:function(a){n=a,r.useVoronoi(a),s.useVoronoi(a),v.useVoronoi(a),w.useVoronoi(a)}}}),a.utils.initOptions(b),b},a.models.ohlcBar=function(){"use strict";function b(y){return y.each(function(b){k=d3.select(this);var y=a.utils.availableWidth(h,k,g),A=a.utils.availableHeight(i,k,g);a.utils.initSVG(k);var B=y/b[0].values.length*.9;l.domain(c||d3.extent(b[0].values.map(n).concat(t))),l.range(v?e||[.5*y/b[0].values.length,y*(b[0].values.length-.5)/b[0].values.length]:e||[5+B/2,y-B/2-5]),m.domain(d||[d3.min(b[0].values.map(s).concat(u)),d3.max(b[0].values.map(r).concat(u))]).range(f||[A,0]),l.domain()[0]===l.domain()[1]&&l.domain(l.domain()[0]?[l.domain()[0]-.01*l.domain()[0],l.domain()[1]+.01*l.domain()[1]]:[-1,1]),m.domain()[0]===m.domain()[1]&&m.domain(m.domain()[0]?[m.domain()[0]+.01*m.domain()[0],m.domain()[1]-.01*m.domain()[1]]:[-1,1]);var C=d3.select(this).selectAll("g.nv-wrap.nv-ohlcBar").data([b[0].values]),D=C.enter().append("g").attr("class","nvd3 nv-wrap nv-ohlcBar"),E=D.append("defs"),F=D.append("g"),G=C.select("g");F.append("g").attr("class","nv-ticks"),C.attr("transform","translate("+g.left+","+g.top+")"),k.on("click",function(a,b){z.chartClick({data:a,index:b,pos:d3.event,id:j})}),E.append("clipPath").attr("id","nv-chart-clip-path-"+j).append("rect"),C.select("#nv-chart-clip-path-"+j+" rect").attr("width",y).attr("height",A),G.attr("clip-path",w?"url(#nv-chart-clip-path-"+j+")":"");var H=C.select(".nv-ticks").selectAll(".nv-tick").data(function(a){return a});H.exit().remove(),H.enter().append("path").attr("class",function(a,b,c){return(p(a,b)>q(a,b)?"nv-tick negative":"nv-tick positive")+" nv-tick-"+c+"-"+b}).attr("d",function(a,b){return"m0,0l0,"+(m(p(a,b))-m(r(a,b)))+"l"+-B/2+",0l"+B/2+",0l0,"+(m(s(a,b))-m(p(a,b)))+"l0,"+(m(q(a,b))-m(s(a,b)))+"l"+B/2+",0l"+-B/2+",0z"}).attr("transform",function(a,b){return"translate("+l(n(a,b))+","+m(r(a,b))+")"}).attr("fill",function(){return x[0]}).attr("stroke",function(){return x[0]}).attr("x",0).attr("y",function(a,b){return m(Math.max(0,o(a,b)))}).attr("height",function(a,b){return Math.abs(m(o(a,b))-m(0))}),H.attr("class",function(a,b,c){return(p(a,b)>q(a,b)?"nv-tick negative":"nv-tick positive")+" nv-tick-"+c+"-"+b}),d3.transition(H).attr("transform",function(a,b){return"translate("+l(n(a,b))+","+m(r(a,b))+")"}).attr("d",function(a,c){var d=y/b[0].values.length*.9;return"m0,0l0,"+(m(p(a,c))-m(r(a,c)))+"l"+-d/2+",0l"+d/2+",0l0,"+(m(s(a,c))-m(p(a,c)))+"l0,"+(m(q(a,c))-m(s(a,c)))+"l"+d/2+",0l"+-d/2+",0z"})}),b}var c,d,e,f,g={top:0,right:0,bottom:0,left:0},h=null,i=null,j=Math.floor(1e4*Math.random()),k=null,l=d3.scale.linear(),m=d3.scale.linear(),n=function(a){return a.x},o=function(a){return a.y},p=function(a){return a.open},q=function(a){return a.close},r=function(a){return a.high},s=function(a){return a.low},t=[],u=[],v=!1,w=!0,x=a.utils.defaultColor(),y=!1,z=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd","chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove");return b.highlightPoint=function(a,c){b.clearHighlights(),k.select(".nv-ohlcBar .nv-tick-0-"+a).classed("hover",c)},b.clearHighlights=function(){k.select(".nv-ohlcBar .nv-tick.hover").classed("hover",!1)},b.dispatch=z,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return i},set:function(a){i=a}},xScale:{get:function(){return l},set:function(a){l=a}},yScale:{get:function(){return m},set:function(a){m=a}},xDomain:{get:function(){return c},set:function(a){c=a}},yDomain:{get:function(){return d},set:function(a){d=a}},xRange:{get:function(){return e},set:function(a){e=a}},yRange:{get:function(){return f},set:function(a){f=a}},forceX:{get:function(){return t},set:function(a){t=a}},forceY:{get:function(){return u},set:function(a){u=a}},padData:{get:function(){return v},set:function(a){v=a}},clipEdge:{get:function(){return w},set:function(a){w=a}},id:{get:function(){return j},set:function(a){j=a}},interactive:{get:function(){return y},set:function(a){y=a}},x:{get:function(){return n},set:function(a){n=a}},y:{get:function(){return o},set:function(a){o=a}},open:{get:function(){return p()},set:function(a){p=a}},close:{get:function(){return q()},set:function(a){q=a}},high:{get:function(){return r},set:function(a){r=a}},low:{get:function(){return s},set:function(a){s=a}},margin:{get:function(){return g},set:function(a){g.top=void 0!=a.top?a.top:g.top,g.right=void 0!=a.right?a.right:g.right,g.bottom=void 0!=a.bottom?a.bottom:g.bottom,g.left=void 0!=a.left?a.left:g.left -}},color:{get:function(){return x},set:function(b){x=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.parallelCoordinates=function(){"use strict";function b(p){return p.each(function(b){function p(a){return F(h.map(function(b){if(isNaN(a[b])||isNaN(parseFloat(a[b]))){var c=g[b].domain(),d=g[b].range(),e=c[0]-(c[1]-c[0])/9;if(J.indexOf(b)<0){var h=d3.scale.linear().domain([e,c[1]]).range([x-12,d[1]]);g[b].brush.y(h),J.push(b)}return[f(b),g[b](e)]}return J.length>0?(D.style("display","inline"),E.style("display","inline")):(D.style("display","none"),E.style("display","none")),[f(b),g[b](a[b])]}))}function q(){var a=h.filter(function(a){return!g[a].brush.empty()}),b=a.map(function(a){return g[a].brush.extent()});k=[],a.forEach(function(a,c){k[c]={dimension:a,extent:b[c]}}),l=[],M.style("display",function(c){var d=a.every(function(a,d){return isNaN(c[a])&&b[d][0]==g[a].brush.y().domain()[0]?!0:b[d][0]<=c[a]&&c[a]<=b[d][1]});return d&&l.push(c),d?null:"none"}),o.brush({filters:k,active:l})}function r(a){m[a]=this.parentNode.__origin__=f(a),L.attr("visibility","hidden")}function s(a){m[a]=Math.min(w,Math.max(0,this.parentNode.__origin__+=d3.event.x)),M.attr("d",p),h.sort(function(a,b){return u(a)-u(b)}),f.domain(h),N.attr("transform",function(a){return"translate("+u(a)+")"})}function t(a){delete this.parentNode.__origin__,delete m[a],d3.select(this.parentNode).attr("transform","translate("+f(a)+")"),M.attr("d",p),L.attr("d",p).attr("visibility",null)}function u(a){var b=m[a];return null==b?f(a):b}var v=d3.select(this),w=a.utils.availableWidth(d,v,c),x=a.utils.availableHeight(e,v,c);a.utils.initSVG(v),l=b,f.rangePoints([0,w],1).domain(h);var y={};h.forEach(function(a){var c=d3.extent(b,function(b){return+b[a]});return y[a]=!1,void 0===c[0]&&(y[a]=!0,c[0]=0,c[1]=0),c[0]===c[1]&&(c[0]=c[0]-1,c[1]=c[1]+1),g[a]=d3.scale.linear().domain(c).range([.9*(x-12),0]),g[a].brush=d3.svg.brush().y(g[a]).on("brush",q),"name"!=a});var z=v.selectAll("g.nv-wrap.nv-parallelCoordinates").data([b]),A=z.enter().append("g").attr("class","nvd3 nv-wrap nv-parallelCoordinates"),B=A.append("g"),C=z.select("g");B.append("g").attr("class","nv-parallelCoordinates background"),B.append("g").attr("class","nv-parallelCoordinates foreground"),B.append("g").attr("class","nv-parallelCoordinates missingValuesline"),z.attr("transform","translate("+c.left+","+c.top+")");var D,E,F=d3.svg.line().interpolate("cardinal").tension(n),G=d3.svg.axis().orient("left"),H=d3.behavior.drag().on("dragstart",r).on("drag",s).on("dragend",t),I=f.range()[1]-f.range()[0],J=[],K=[0+I/2,x-12,w-I/2,x-12];D=z.select(".missingValuesline").selectAll("line").data([K]),D.enter().append("line"),D.exit().remove(),D.attr("x1",function(a){return a[0]}).attr("y1",function(a){return a[1]}).attr("x2",function(a){return a[2]}).attr("y2",function(a){return a[3]}),E=z.select(".missingValuesline").selectAll("text").data(["undefined values"]),E.append("text").data(["undefined values"]),E.enter().append("text"),E.exit().remove(),E.attr("y",x).attr("x",w-92-I/2).text(function(a){return a});var L=z.select(".background").selectAll("path").data(b);L.enter().append("path"),L.exit().remove(),L.attr("d",p);var M=z.select(".foreground").selectAll("path").data(b);M.enter().append("path"),M.exit().remove(),M.attr("d",p).attr("stroke",j),M.on("mouseover",function(a,b){d3.select(this).classed("hover",!0),o.elementMouseover({label:a.name,data:a.data,index:b,pos:[d3.mouse(this.parentNode)[0],d3.mouse(this.parentNode)[1]]})}),M.on("mouseout",function(a,b){d3.select(this).classed("hover",!1),o.elementMouseout({label:a.name,data:a.data,index:b})});var N=C.selectAll(".dimension").data(h),O=N.enter().append("g").attr("class","nv-parallelCoordinates dimension");O.append("g").attr("class","nv-parallelCoordinates nv-axis"),O.append("g").attr("class","nv-parallelCoordinates-brush"),O.append("text").attr("class","nv-parallelCoordinates nv-label"),N.attr("transform",function(a){return"translate("+f(a)+",0)"}),N.exit().remove(),N.select(".nv-label").style("cursor","move").attr("dy","-1em").attr("text-anchor","middle").text(String).on("mouseover",function(a){o.elementMouseover({dim:a,pos:[d3.mouse(this.parentNode.parentNode)[0],d3.mouse(this.parentNode.parentNode)[1]]})}).on("mouseout",function(a){o.elementMouseout({dim:a})}).call(H),N.select(".nv-axis").each(function(a,b){d3.select(this).call(G.scale(g[a]).tickFormat(d3.format(i[b])))}),N.select(".nv-parallelCoordinates-brush").each(function(a){d3.select(this).call(g[a].brush)}).selectAll("rect").attr("x",-8).attr("width",16)}),b}var c={top:30,right:0,bottom:10,left:0},d=null,e=null,f=d3.scale.ordinal(),g={},h=[],i=[],j=a.utils.defaultColor(),k=[],l=[],m=[],n=1,o=d3.dispatch("brush","elementMouseover","elementMouseout");return b.dispatch=o,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return d},set:function(a){d=a}},height:{get:function(){return e},set:function(a){e=a}},dimensionNames:{get:function(){return h},set:function(a){h=a}},dimensionFormats:{get:function(){return i},set:function(a){i=a}},lineTension:{get:function(){return n},set:function(a){n=a}},dimensions:{get:function(){return h},set:function(b){a.deprecated("dimensions","use dimensionNames instead"),h=b}},margin:{get:function(){return c},set:function(a){c.top=void 0!==a.top?a.top:c.top,c.right=void 0!==a.right?a.right:c.right,c.bottom=void 0!==a.bottom?a.bottom:c.bottom,c.left=void 0!==a.left?a.left:c.left}},color:{get:function(){return j},set:function(b){j=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.pie=function(){"use strict";function b(E){return D.reset(),E.each(function(b){function E(a,b){a.endAngle=isNaN(a.endAngle)?0:a.endAngle,a.startAngle=isNaN(a.startAngle)?0:a.startAngle,p||(a.innerRadius=0);var c=d3.interpolate(this._current,a);return this._current=c(0),function(a){return B[b](c(a))}}var F=d-c.left-c.right,G=e-c.top-c.bottom,H=Math.min(F,G)/2,I=[],J=[];if(i=d3.select(this),0===z.length)for(var K=H-H/5,L=y*H,M=0;Mc)return"";if("function"==typeof n)d=n(a,b,{key:f(a.data),value:g(a.data),percent:k(c)});else switch(n){case"key":d=f(a.data);break;case"value":d=k(g(a.data));break;case"percent":d=d3.format("%")(c)}return d})}}),D.renderEnd("pie immediate"),b}var c={top:0,right:0,bottom:0,left:0},d=500,e=500,f=function(a){return a.x},g=function(a){return a.y},h=Math.floor(1e4*Math.random()),i=null,j=a.utils.defaultColor(),k=d3.format(",.2f"),l=!0,m=!1,n="key",o=.02,p=!1,q=!1,r=!0,s=0,t=!1,u=!1,v=!1,w=!1,x=0,y=.5,z=[],A=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),B=[],C=[],D=a.utils.renderWatch(A);return b.dispatch=A,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{arcsRadius:{get:function(){return z},set:function(a){z=a}},width:{get:function(){return d},set:function(a){d=a}},height:{get:function(){return e},set:function(a){e=a}},showLabels:{get:function(){return l},set:function(a){l=a}},title:{get:function(){return q},set:function(a){q=a}},titleOffset:{get:function(){return s},set:function(a){s=a}},labelThreshold:{get:function(){return o},set:function(a){o=a}},valueFormat:{get:function(){return k},set:function(a){k=a}},x:{get:function(){return f},set:function(a){f=a}},id:{get:function(){return h},set:function(a){h=a}},endAngle:{get:function(){return w},set:function(a){w=a}},startAngle:{get:function(){return u},set:function(a){u=a}},padAngle:{get:function(){return v},set:function(a){v=a}},cornerRadius:{get:function(){return x},set:function(a){x=a}},donutRatio:{get:function(){return y},set:function(a){y=a}},labelsOutside:{get:function(){return m},set:function(a){m=a}},labelSunbeamLayout:{get:function(){return t},set:function(a){t=a}},donut:{get:function(){return p},set:function(a){p=a}},growOnHover:{get:function(){return r},set:function(a){r=a}},pieLabelsOutside:{get:function(){return m},set:function(b){m=b,a.deprecated("pieLabelsOutside","use labelsOutside instead")}},donutLabelsOutside:{get:function(){return m},set:function(b){m=b,a.deprecated("donutLabelsOutside","use labelsOutside instead")}},labelFormat:{get:function(){return k},set:function(b){k=b,a.deprecated("labelFormat","use valueFormat instead")}},margin:{get:function(){return c},set:function(a){c.top="undefined"!=typeof a.top?a.top:c.top,c.right="undefined"!=typeof a.right?a.right:c.right,c.bottom="undefined"!=typeof a.bottom?a.bottom:c.bottom,c.left="undefined"!=typeof a.left?a.left:c.left}},y:{get:function(){return g},set:function(a){g=d3.functor(a)}},color:{get:function(){return j},set:function(b){j=a.utils.getColor(b)}},labelType:{get:function(){return n},set:function(a){n=a||"key"}}}),a.utils.initOptions(b),b},a.models.pieChart=function(){"use strict";function b(e){return q.reset(),q.models(c),e.each(function(e){var k=d3.select(this);a.utils.initSVG(k);var n=a.utils.availableWidth(g,k,f),o=a.utils.availableHeight(h,k,f);if(b.update=function(){k.transition().call(b)},b.container=this,l.setter(s(e),b.update).getter(r(e)).update(),l.disabled=e.map(function(a){return!!a.disabled}),!m){var q;m={};for(q in l)m[q]=l[q]instanceof Array?l[q].slice(0):l[q]}if(!e||!e.length)return a.utils.noData(b,k),b;k.selectAll(".nv-noData").remove();var t=k.selectAll("g.nv-wrap.nv-pieChart").data([e]),u=t.enter().append("g").attr("class","nvd3 nv-wrap nv-pieChart").append("g"),v=t.select("g");if(u.append("g").attr("class","nv-pieWrap"),u.append("g").attr("class","nv-legendWrap"),i)if("top"===j)d.width(n).key(c.x()),t.select(".nv-legendWrap").datum(e).call(d),f.top!=d.height()&&(f.top=d.height(),o=a.utils.availableHeight(h,k,f)),t.select(".nv-legendWrap").attr("transform","translate(0,"+-f.top+")");else if("right"===j){var w=a.models.legend().width();w>n/2&&(w=n/2),d.height(o).key(c.x()),d.width(w),n-=d.width(),t.select(".nv-legendWrap").datum(e).call(d).attr("transform","translate("+n+",0)")}t.attr("transform","translate("+f.left+","+f.top+")"),c.width(n).height(o);var x=v.select(".nv-pieWrap").datum([e]);d3.transition(x).call(c),d.dispatch.on("stateChange",function(a){for(var c in a)l[c]=a[c];p.stateChange(l),b.update()}),p.on("changeState",function(a){"undefined"!=typeof a.disabled&&(e.forEach(function(b,c){b.disabled=a.disabled[c]}),l.disabled=a.disabled),b.update()})}),q.renderEnd("pieChart immediate"),b}var c=a.models.pie(),d=a.models.legend(),e=a.models.tooltip(),f={top:30,right:20,bottom:20,left:20},g=null,h=null,i=!0,j="top",k=a.utils.defaultColor(),l=a.utils.state(),m=null,n=null,o=250,p=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd");e.headerEnabled(!1).duration(0).valueFormatter(function(a,b){return c.valueFormat()(a,b)});var q=a.utils.renderWatch(p),r=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},s=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return c.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:b.x()(a.data),value:b.y()(a.data),color:a.color},e.data(a).hidden(!1)}),c.dispatch.on("elementMouseout.tooltip",function(){e.hidden(!0)}),c.dispatch.on("elementMousemove.tooltip",function(){e.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.legend=d,b.dispatch=p,b.pie=c,b.tooltip=e,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{noData:{get:function(){return n},set:function(a){n=a}},showLegend:{get:function(){return i},set:function(a){i=a}},legendPosition:{get:function(){return j},set:function(a){j=a}},defaultState:{get:function(){return m},set:function(a){m=a}},tooltips:{get:function(){return e.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),e.enabled(!!b)}},tooltipContent:{get:function(){return e.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),e.contentGenerator(b)}},color:{get:function(){return k},set:function(a){k=a,d.color(k),c.color(k)}},duration:{get:function(){return o},set:function(a){o=a,q.reset(o)}},margin:{get:function(){return f},set:function(a){f.top=void 0!==a.top?a.top:f.top,f.right=void 0!==a.right?a.right:f.right,f.bottom=void 0!==a.bottom?a.bottom:f.bottom,f.left=void 0!==a.left?a.left:f.left}}}),a.utils.inheritOptions(b,c),a.utils.initOptions(b),b},a.models.scatter=function(){"use strict";function b(N){return P.reset(),N.each(function(b){function N(){if(O=!1,!w)return!1;if(M===!0){var a=d3.merge(b.map(function(a,b){return a.values.map(function(a,c){var d=p(a,c),e=q(a,c);return[m(d)+1e-4*Math.random(),n(e)+1e-4*Math.random(),b,c,a]}).filter(function(a,b){return x(a[4],b)})}));if(0==a.length)return!1;a.length<3&&(a.push([m.range()[0]-20,n.range()[0]-20,null,null]),a.push([m.range()[1]+20,n.range()[1]+20,null,null]),a.push([m.range()[0]-20,n.range()[0]+20,null,null]),a.push([m.range()[1]+20,n.range()[1]-20,null,null]));var c=d3.geom.polygon([[-10,-10],[-10,i+10],[h+10,i+10],[h+10,-10]]),d=d3.geom.voronoi(a).map(function(b,d){return{data:c.clip(b),series:a[d][2],point:a[d][3]}});U.select(".nv-point-paths").selectAll("path").remove();var e=U.select(".nv-point-paths").selectAll("path").data(d),f=e.enter().append("svg:path").attr("d",function(a){return a&&a.data&&0!==a.data.length?"M"+a.data.join(",")+"Z":"M 0 0"}).attr("id",function(a,b){return"nv-path-"+b}).attr("clip-path",function(a,b){return"url(#nv-clip-"+b+")"});C&&f.style("fill",d3.rgb(230,230,230)).style("fill-opacity",.4).style("stroke-opacity",1).style("stroke",d3.rgb(200,200,200)),B&&(U.select(".nv-point-clips").selectAll("clipPath").remove(),U.select(".nv-point-clips").selectAll("clipPath").data(a).enter().append("svg:clipPath").attr("id",function(a,b){return"nv-clip-"+b}).append("svg:circle").attr("cx",function(a){return a[0]}).attr("cy",function(a){return a[1]}).attr("r",D));var k=function(a,c){if(O)return 0;var d=b[a.series];if(void 0!==d){var e=d.values[a.point];e.color=j(d,a.series),e.x=p(e),e.y=q(e);var f=l.node().getBoundingClientRect(),h=window.pageYOffset||document.documentElement.scrollTop,i=window.pageXOffset||document.documentElement.scrollLeft,k={left:m(p(e,a.point))+f.left+i+g.left+10,top:n(q(e,a.point))+f.top+h+g.top+10};c({point:e,series:d,pos:k,seriesIndex:a.series,pointIndex:a.point})}};e.on("click",function(a){k(a,L.elementClick)}).on("dblclick",function(a){k(a,L.elementDblClick)}).on("mouseover",function(a){k(a,L.elementMouseover)}).on("mouseout",function(a){k(a,L.elementMouseout)})}else U.select(".nv-groups").selectAll(".nv-group").selectAll(".nv-point").on("click",function(a,c){if(O||!b[a.series])return 0;var d=b[a.series],e=d.values[c];L.elementClick({point:e,series:d,pos:[m(p(e,c))+g.left,n(q(e,c))+g.top],seriesIndex:a.series,pointIndex:c})}).on("dblclick",function(a,c){if(O||!b[a.series])return 0;var d=b[a.series],e=d.values[c];L.elementDblClick({point:e,series:d,pos:[m(p(e,c))+g.left,n(q(e,c))+g.top],seriesIndex:a.series,pointIndex:c})}).on("mouseover",function(a,c){if(O||!b[a.series])return 0;var d=b[a.series],e=d.values[c];L.elementMouseover({point:e,series:d,pos:[m(p(e,c))+g.left,n(q(e,c))+g.top],seriesIndex:a.series,pointIndex:c,color:j(a,c)})}).on("mouseout",function(a,c){if(O||!b[a.series])return 0;var d=b[a.series],e=d.values[c];L.elementMouseout({point:e,series:d,seriesIndex:a.series,pointIndex:c,color:j(a,c)})})}l=d3.select(this);var R=a.utils.availableWidth(h,l,g),S=a.utils.availableHeight(i,l,g);a.utils.initSVG(l),b.forEach(function(a,b){a.values.forEach(function(a){a.series=b})});var T=E&&F&&I?[]:d3.merge(b.map(function(a){return a.values.map(function(a,b){return{x:p(a,b),y:q(a,b),size:r(a,b)}})}));m.domain(E||d3.extent(T.map(function(a){return a.x}).concat(t))),m.range(y&&b[0]?G||[(R*z+R)/(2*b[0].values.length),R-R*(1+z)/(2*b[0].values.length)]:G||[0,R]),n.domain(F||d3.extent(T.map(function(a){return a.y}).concat(u))).range(H||[S,0]),o.domain(I||d3.extent(T.map(function(a){return a.size}).concat(v))).range(J||Q),K=m.domain()[0]===m.domain()[1]||n.domain()[0]===n.domain()[1],m.domain()[0]===m.domain()[1]&&m.domain(m.domain()[0]?[m.domain()[0]-.01*m.domain()[0],m.domain()[1]+.01*m.domain()[1]]:[-1,1]),n.domain()[0]===n.domain()[1]&&n.domain(n.domain()[0]?[n.domain()[0]-.01*n.domain()[0],n.domain()[1]+.01*n.domain()[1]]:[-1,1]),isNaN(m.domain()[0])&&m.domain([-1,1]),isNaN(n.domain()[0])&&n.domain([-1,1]),c=c||m,d=d||n,e=e||o;var U=l.selectAll("g.nv-wrap.nv-scatter").data([b]),V=U.enter().append("g").attr("class","nvd3 nv-wrap nv-scatter nv-chart-"+k),W=V.append("defs"),X=V.append("g"),Y=U.select("g");U.classed("nv-single-point",K),X.append("g").attr("class","nv-groups"),X.append("g").attr("class","nv-point-paths"),V.append("g").attr("class","nv-point-clips"),U.attr("transform","translate("+g.left+","+g.top+")"),W.append("clipPath").attr("id","nv-edge-clip-"+k).append("rect"),U.select("#nv-edge-clip-"+k+" rect").attr("width",R).attr("height",S>0?S:0),Y.attr("clip-path",A?"url(#nv-edge-clip-"+k+")":""),O=!0;var Z=U.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a){return a.key});Z.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6),Z.exit().remove(),Z.attr("class",function(a,b){return"nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}),Z.watchTransition(P,"scatter: groups").style("fill",function(a,b){return j(a,b)}).style("stroke",function(a,b){return j(a,b)}).style("stroke-opacity",1).style("fill-opacity",.5);var $=Z.selectAll("path.nv-point").data(function(a){return a.values.map(function(a,b){return[a,b]}).filter(function(a,b){return x(a[0],b)})});$.enter().append("path").style("fill",function(a){return a.color}).style("stroke",function(a){return a.color}).attr("transform",function(a){return"translate("+c(p(a[0],a[1]))+","+d(q(a[0],a[1]))+")"}).attr("d",a.utils.symbol().type(function(a){return s(a[0])}).size(function(a){return o(r(a[0],a[1]))})),$.exit().remove(),Z.exit().selectAll("path.nv-point").watchTransition(P,"scatter exit").attr("transform",function(a){return"translate("+m(p(a[0],a[1]))+","+n(q(a[0],a[1]))+")"}).remove(),$.each(function(a){d3.select(this).classed("nv-point",!0).classed("nv-point-"+a[1],!0).classed("nv-noninteractive",!w).classed("hover",!1)}),$.watchTransition(P,"scatter points").attr("transform",function(a){return"translate("+m(p(a[0],a[1]))+","+n(q(a[0],a[1]))+")"}).attr("d",a.utils.symbol().type(function(a){return s(a[0])}).size(function(a){return o(r(a[0],a[1]))})),clearTimeout(f),f=setTimeout(N,300),c=m.copy(),d=n.copy(),e=o.copy()}),P.renderEnd("scatter immediate"),b}var c,d,e,f,g={top:0,right:0,bottom:0,left:0},h=null,i=null,j=a.utils.defaultColor(),k=Math.floor(1e5*Math.random()),l=null,m=d3.scale.linear(),n=d3.scale.linear(),o=d3.scale.linear(),p=function(a){return a.x},q=function(a){return a.y},r=function(a){return a.size||1},s=function(a){return a.shape||"circle"},t=[],u=[],v=[],w=!0,x=function(a){return!a.notActive},y=!1,z=.1,A=!1,B=!0,C=!1,D=function(){return 25},E=null,F=null,G=null,H=null,I=null,J=null,K=!1,L=d3.dispatch("elementClick","elementDblClick","elementMouseover","elementMouseout","renderEnd"),M=!0,N=250,O=!1,P=a.utils.renderWatch(L,N),Q=[16,256];return b.dispatch=L,b.options=a.utils.optionsFunc.bind(b),b._calls=new function(){this.clearHighlights=function(){return a.dom.write(function(){l.selectAll(".nv-point.hover").classed("hover",!1)}),null},this.highlightPoint=function(b,c,d){a.dom.write(function(){l.select(" .nv-series-"+b+" .nv-point-"+c).classed("hover",d)})}},L.on("elementMouseover.point",function(a){w&&b._calls.highlightPoint(a.seriesIndex,a.pointIndex,!0)}),L.on("elementMouseout.point",function(a){w&&b._calls.highlightPoint(a.seriesIndex,a.pointIndex,!1)}),b._options=Object.create({},{width:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return i},set:function(a){i=a}},xScale:{get:function(){return m},set:function(a){m=a}},yScale:{get:function(){return n},set:function(a){n=a}},pointScale:{get:function(){return o},set:function(a){o=a}},xDomain:{get:function(){return E},set:function(a){E=a}},yDomain:{get:function(){return F},set:function(a){F=a}},pointDomain:{get:function(){return I},set:function(a){I=a}},xRange:{get:function(){return G},set:function(a){G=a}},yRange:{get:function(){return H},set:function(a){H=a}},pointRange:{get:function(){return J},set:function(a){J=a}},forceX:{get:function(){return t},set:function(a){t=a}},forceY:{get:function(){return u},set:function(a){u=a}},forcePoint:{get:function(){return v},set:function(a){v=a}},interactive:{get:function(){return w},set:function(a){w=a}},pointActive:{get:function(){return x},set:function(a){x=a}},padDataOuter:{get:function(){return z},set:function(a){z=a}},padData:{get:function(){return y},set:function(a){y=a}},clipEdge:{get:function(){return A},set:function(a){A=a}},clipVoronoi:{get:function(){return B},set:function(a){B=a}},clipRadius:{get:function(){return D},set:function(a){D=a}},showVoronoi:{get:function(){return C},set:function(a){C=a}},id:{get:function(){return k},set:function(a){k=a}},x:{get:function(){return p},set:function(a){p=d3.functor(a)}},y:{get:function(){return q},set:function(a){q=d3.functor(a)}},pointSize:{get:function(){return r},set:function(a){r=d3.functor(a)}},pointShape:{get:function(){return s},set:function(a){s=d3.functor(a)}},margin:{get:function(){return g},set:function(a){g.top=void 0!==a.top?a.top:g.top,g.right=void 0!==a.right?a.right:g.right,g.bottom=void 0!==a.bottom?a.bottom:g.bottom,g.left=void 0!==a.left?a.left:g.left}},duration:{get:function(){return N},set:function(a){N=a,P.reset(N)}},color:{get:function(){return j},set:function(b){j=a.utils.getColor(b)}},useVoronoi:{get:function(){return M},set:function(a){M=a,M===!1&&(B=!1)}}}),a.utils.initOptions(b),b},a.models.scatterChart=function(){"use strict";function b(z){return D.reset(),D.models(c),t&&D.models(d),u&&D.models(e),q&&D.models(g),r&&D.models(h),z.each(function(z){m=d3.select(this),a.utils.initSVG(m);var G=a.utils.availableWidth(k,m,j),H=a.utils.availableHeight(l,m,j);if(b.update=function(){0===A?m.call(b):m.transition().duration(A).call(b)},b.container=this,w.setter(F(z),b.update).getter(E(z)).update(),w.disabled=z.map(function(a){return!!a.disabled}),!x){var I;x={};for(I in w)x[I]=w[I]instanceof Array?w[I].slice(0):w[I]}if(!(z&&z.length&&z.filter(function(a){return a.values.length}).length))return a.utils.noData(b,m),D.renderEnd("scatter immediate"),b;m.selectAll(".nv-noData").remove(),o=c.xScale(),p=c.yScale();var J=m.selectAll("g.nv-wrap.nv-scatterChart").data([z]),K=J.enter().append("g").attr("class","nvd3 nv-wrap nv-scatterChart nv-chart-"+c.id()),L=K.append("g"),M=J.select("g");if(L.append("rect").attr("class","nvd3 nv-background").style("pointer-events","none"),L.append("g").attr("class","nv-x nv-axis"),L.append("g").attr("class","nv-y nv-axis"),L.append("g").attr("class","nv-scatterWrap"),L.append("g").attr("class","nv-regressionLinesWrap"),L.append("g").attr("class","nv-distWrap"),L.append("g").attr("class","nv-legendWrap"),v&&M.select(".nv-y.nv-axis").attr("transform","translate("+G+",0)"),s){var N=G;f.width(N),J.select(".nv-legendWrap").datum(z).call(f),j.top!=f.height()&&(j.top=f.height(),H=a.utils.availableHeight(l,m,j)),J.select(".nv-legendWrap").attr("transform","translate(0,"+-j.top+")")}J.attr("transform","translate("+j.left+","+j.top+")"),c.width(G).height(H).color(z.map(function(a,b){return a.color=a.color||n(a,b),a.color}).filter(function(a,b){return!z[b].disabled})),J.select(".nv-scatterWrap").datum(z.filter(function(a){return!a.disabled})).call(c),J.select(".nv-regressionLinesWrap").attr("clip-path","url(#nv-edge-clip-"+c.id()+")");var O=J.select(".nv-regressionLinesWrap").selectAll(".nv-regLines").data(function(a){return a});O.enter().append("g").attr("class","nv-regLines");var P=O.selectAll(".nv-regLine").data(function(a){return[a]});P.enter().append("line").attr("class","nv-regLine").style("stroke-opacity",0),P.filter(function(a){return a.intercept&&a.slope}).watchTransition(D,"scatterPlusLineChart: regline").attr("x1",o.range()[0]).attr("x2",o.range()[1]).attr("y1",function(a){return p(o.domain()[0]*a.slope+a.intercept)}).attr("y2",function(a){return p(o.domain()[1]*a.slope+a.intercept)}).style("stroke",function(a,b,c){return n(a,c)}).style("stroke-opacity",function(a){return a.disabled||"undefined"==typeof a.slope||"undefined"==typeof a.intercept?0:1}),t&&(d.scale(o)._ticks(a.utils.calcTicksX(G/100,z)).tickSize(-H,0),M.select(".nv-x.nv-axis").attr("transform","translate(0,"+p.range()[0]+")").call(d)),u&&(e.scale(p)._ticks(a.utils.calcTicksY(H/36,z)).tickSize(-G,0),M.select(".nv-y.nv-axis").call(e)),q&&(g.getData(c.x()).scale(o).width(G).color(z.map(function(a,b){return a.color||n(a,b)}).filter(function(a,b){return!z[b].disabled})),L.select(".nv-distWrap").append("g").attr("class","nv-distributionX"),M.select(".nv-distributionX").attr("transform","translate(0,"+p.range()[0]+")").datum(z.filter(function(a){return!a.disabled})).call(g)),r&&(h.getData(c.y()).scale(p).width(H).color(z.map(function(a,b){return a.color||n(a,b)}).filter(function(a,b){return!z[b].disabled})),L.select(".nv-distWrap").append("g").attr("class","nv-distributionY"),M.select(".nv-distributionY").attr("transform","translate("+(v?G:-h.size())+",0)").datum(z.filter(function(a){return!a.disabled})).call(h)),f.dispatch.on("stateChange",function(a){for(var c in a)w[c]=a[c];y.stateChange(w),b.update()}),y.on("changeState",function(a){"undefined"!=typeof a.disabled&&(z.forEach(function(b,c){b.disabled=a.disabled[c]}),w.disabled=a.disabled),b.update()}),c.dispatch.on("elementMouseout.tooltip",function(a){i.hidden(!0),m.select(".nv-chart-"+c.id()+" .nv-series-"+a.seriesIndex+" .nv-distx-"+a.pointIndex).attr("y1",0),m.select(".nv-chart-"+c.id()+" .nv-series-"+a.seriesIndex+" .nv-disty-"+a.pointIndex).attr("x2",h.size())}),c.dispatch.on("elementMouseover.tooltip",function(a){m.select(".nv-series-"+a.seriesIndex+" .nv-distx-"+a.pointIndex).attr("y1",a.pos.top-H-j.top),m.select(".nv-series-"+a.seriesIndex+" .nv-disty-"+a.pointIndex).attr("x2",a.pos.left+g.size()-j.left),i.position(a.pos).data(a).hidden(!1)}),B=o.copy(),C=p.copy()}),D.renderEnd("scatter with line immediate"),b}var c=a.models.scatter(),d=a.models.axis(),e=a.models.axis(),f=a.models.legend(),g=a.models.distribution(),h=a.models.distribution(),i=a.models.tooltip(),j={top:30,right:20,bottom:50,left:75},k=null,l=null,m=null,n=a.utils.defaultColor(),o=c.xScale(),p=c.yScale(),q=!1,r=!1,s=!0,t=!0,u=!0,v=!1,w=a.utils.state(),x=null,y=d3.dispatch("stateChange","changeState","renderEnd"),z=null,A=250;c.xScale(o).yScale(p),d.orient("bottom").tickPadding(10),e.orient(v?"right":"left").tickPadding(10),g.axis("x"),h.axis("y"),i.headerFormatter(function(a,b){return d.tickFormat()(a,b)}).valueFormatter(function(a,b){return e.tickFormat()(a,b)});var B,C,D=a.utils.renderWatch(y,A),E=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},F=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return b.dispatch=y,b.scatter=c,b.legend=f,b.xAxis=d,b.yAxis=e,b.distX=g,b.distY=h,b.tooltip=i,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},container:{get:function(){return m},set:function(a){m=a}},showDistX:{get:function(){return q},set:function(a){q=a}},showDistY:{get:function(){return r},set:function(a){r=a}},showLegend:{get:function(){return s},set:function(a){s=a}},showXAxis:{get:function(){return t},set:function(a){t=a}},showYAxis:{get:function(){return u},set:function(a){u=a}},defaultState:{get:function(){return x},set:function(a){x=a}},noData:{get:function(){return z},set:function(a){z=a}},duration:{get:function(){return A},set:function(a){A=a}},tooltips:{get:function(){return i.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),i.enabled(!!b) -}},tooltipContent:{get:function(){return i.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),i.contentGenerator(b)}},tooltipXContent:{get:function(){return i.contentGenerator()},set:function(){a.deprecated("tooltipContent","This option is removed, put values into main tooltip.")}},tooltipYContent:{get:function(){return i.contentGenerator()},set:function(){a.deprecated("tooltipContent","This option is removed, put values into main tooltip.")}},margin:{get:function(){return j},set:function(a){j.top=void 0!==a.top?a.top:j.top,j.right=void 0!==a.right?a.right:j.right,j.bottom=void 0!==a.bottom?a.bottom:j.bottom,j.left=void 0!==a.left?a.left:j.left}},rightAlignYAxis:{get:function(){return v},set:function(a){v=a,e.orient(a?"right":"left")}},color:{get:function(){return n},set:function(b){n=a.utils.getColor(b),f.color(n),g.color(n),h.color(n)}}}),a.utils.inheritOptions(b,c),a.utils.initOptions(b),b},a.models.sparkline=function(){"use strict";function b(k){return k.each(function(b){var k=h-g.left-g.right,q=i-g.top-g.bottom;j=d3.select(this),a.utils.initSVG(j),l.domain(c||d3.extent(b,n)).range(e||[0,k]),m.domain(d||d3.extent(b,o)).range(f||[q,0]);{var r=j.selectAll("g.nv-wrap.nv-sparkline").data([b]),s=r.enter().append("g").attr("class","nvd3 nv-wrap nv-sparkline");s.append("g"),r.select("g")}r.attr("transform","translate("+g.left+","+g.top+")");var t=r.selectAll("path").data(function(a){return[a]});t.enter().append("path"),t.exit().remove(),t.style("stroke",function(a,b){return a.color||p(a,b)}).attr("d",d3.svg.line().x(function(a,b){return l(n(a,b))}).y(function(a,b){return m(o(a,b))}));var u=r.selectAll("circle.nv-point").data(function(a){function b(b){if(-1!=b){var c=a[b];return c.pointIndex=b,c}return null}var c=a.map(function(a,b){return o(a,b)}),d=b(c.lastIndexOf(m.domain()[1])),e=b(c.indexOf(m.domain()[0])),f=b(c.length-1);return[e,d,f].filter(function(a){return null!=a})});u.enter().append("circle"),u.exit().remove(),u.attr("cx",function(a){return l(n(a,a.pointIndex))}).attr("cy",function(a){return m(o(a,a.pointIndex))}).attr("r",2).attr("class",function(a){return n(a,a.pointIndex)==l.domain()[1]?"nv-point nv-currentValue":o(a,a.pointIndex)==m.domain()[0]?"nv-point nv-minValue":"nv-point nv-maxValue"})}),b}var c,d,e,f,g={top:2,right:0,bottom:2,left:0},h=400,i=32,j=null,k=!0,l=d3.scale.linear(),m=d3.scale.linear(),n=function(a){return a.x},o=function(a){return a.y},p=a.utils.getColor(["#000"]);return b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return i},set:function(a){i=a}},xDomain:{get:function(){return c},set:function(a){c=a}},yDomain:{get:function(){return d},set:function(a){d=a}},xRange:{get:function(){return e},set:function(a){e=a}},yRange:{get:function(){return f},set:function(a){f=a}},xScale:{get:function(){return l},set:function(a){l=a}},yScale:{get:function(){return m},set:function(a){m=a}},animate:{get:function(){return k},set:function(a){k=a}},x:{get:function(){return n},set:function(a){n=d3.functor(a)}},y:{get:function(){return o},set:function(a){o=d3.functor(a)}},margin:{get:function(){return g},set:function(a){g.top=void 0!==a.top?a.top:g.top,g.right=void 0!==a.right?a.right:g.right,g.bottom=void 0!==a.bottom?a.bottom:g.bottom,g.left=void 0!==a.left?a.left:g.left}},color:{get:function(){return p},set:function(b){p=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.sparklinePlus=function(){"use strict";function b(p){return p.each(function(p){function q(){if(!j){var a=z.selectAll(".nv-hoverValue").data(i),b=a.enter().append("g").attr("class","nv-hoverValue").style("stroke-opacity",0).style("fill-opacity",0);a.exit().transition().duration(250).style("stroke-opacity",0).style("fill-opacity",0).remove(),a.attr("transform",function(a){return"translate("+c(e.x()(p[a],a))+",0)"}).transition().duration(250).style("stroke-opacity",1).style("fill-opacity",1),i.length&&(b.append("line").attr("x1",0).attr("y1",-f.top).attr("x2",0).attr("y2",u),b.append("text").attr("class","nv-xValue").attr("x",-6).attr("y",-f.top).attr("text-anchor","end").attr("dy",".9em"),z.select(".nv-hoverValue .nv-xValue").text(k(e.x()(p[i[0]],i[0]))),b.append("text").attr("class","nv-yValue").attr("x",6).attr("y",-f.top).attr("text-anchor","start").attr("dy",".9em"),z.select(".nv-hoverValue .nv-yValue").text(l(e.y()(p[i[0]],i[0]))))}}function r(){function a(a,b){for(var c=Math.abs(e.x()(a[0],0)-b),d=0,f=0;fc;++c){for(b=0,d=0;bb;b++)a[b][c][1]/=d;else for(b=0;e>b;b++)a[b][c][1]=0}for(c=0;f>c;++c)g[c]=0;return g}}),u.renderEnd("stackedArea immediate"),b}var c,d,e={top:0,right:0,bottom:0,left:0},f=960,g=500,h=a.utils.defaultColor(),i=Math.floor(1e5*Math.random()),j=null,k=function(a){return a.x},l=function(a){return a.y},m="stack",n="zero",o="default",p="linear",q=!1,r=a.models.scatter(),s=250,t=d3.dispatch("areaClick","areaMouseover","areaMouseout","renderEnd","elementClick","elementMouseover","elementMouseout");r.pointSize(2.2).pointDomain([2.2,2.2]);var u=a.utils.renderWatch(t,s);return b.dispatch=t,b.scatter=r,r.dispatch.on("elementClick",function(){t.elementClick.apply(this,arguments)}),r.dispatch.on("elementMouseover",function(){t.elementMouseover.apply(this,arguments)}),r.dispatch.on("elementMouseout",function(){t.elementMouseout.apply(this,arguments)}),b.interpolate=function(a){return arguments.length?(p=a,b):p},b.duration=function(a){return arguments.length?(s=a,u.reset(s),r.duration(s),b):s},b.dispatch=t,b.scatter=r,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return f},set:function(a){f=a}},height:{get:function(){return g},set:function(a){g=a}},clipEdge:{get:function(){return q},set:function(a){q=a}},offset:{get:function(){return n},set:function(a){n=a}},order:{get:function(){return o},set:function(a){o=a}},interpolate:{get:function(){return p},set:function(a){p=a}},x:{get:function(){return k},set:function(a){k=d3.functor(a)}},y:{get:function(){return l},set:function(a){l=d3.functor(a)}},margin:{get:function(){return e},set:function(a){e.top=void 0!==a.top?a.top:e.top,e.right=void 0!==a.right?a.right:e.right,e.bottom=void 0!==a.bottom?a.bottom:e.bottom,e.left=void 0!==a.left?a.left:e.left}},color:{get:function(){return h},set:function(b){h=a.utils.getColor(b)}},style:{get:function(){return m},set:function(a){switch(m=a){case"stack":b.offset("zero"),b.order("default");break;case"stream":b.offset("wiggle"),b.order("inside-out");break;case"stream-center":b.offset("silhouette"),b.order("inside-out");break;case"expand":b.offset("expand"),b.order("default");break;case"stack_percent":b.offset(b.d3_stackedOffset_stackPercent),b.order("default")}}},duration:{get:function(){return s},set:function(a){s=a,u.reset(s),r.duration(s)}}}),a.utils.inheritOptions(b,r),a.utils.initOptions(b),b},a.models.stackedAreaChart=function(){"use strict";function b(k){return F.reset(),F.models(e),r&&F.models(f),s&&F.models(g),k.each(function(k){var x=d3.select(this),F=this;a.utils.initSVG(x);var K=a.utils.availableWidth(m,x,l),L=a.utils.availableHeight(n,x,l);if(b.update=function(){x.transition().duration(C).call(b)},b.container=this,v.setter(I(k),b.update).getter(H(k)).update(),v.disabled=k.map(function(a){return!!a.disabled}),!w){var M;w={};for(M in v)w[M]=v[M]instanceof Array?v[M].slice(0):v[M]}if(!(k&&k.length&&k.filter(function(a){return a.values.length}).length))return a.utils.noData(b,x),b;x.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale();var N=x.selectAll("g.nv-wrap.nv-stackedAreaChart").data([k]),O=N.enter().append("g").attr("class","nvd3 nv-wrap nv-stackedAreaChart").append("g"),P=N.select("g");if(O.append("rect").style("opacity",0),O.append("g").attr("class","nv-x nv-axis"),O.append("g").attr("class","nv-y nv-axis"),O.append("g").attr("class","nv-stackedWrap"),O.append("g").attr("class","nv-legendWrap"),O.append("g").attr("class","nv-controlsWrap"),O.append("g").attr("class","nv-interactive"),P.select("rect").attr("width",K).attr("height",L),q){var Q=p?K-z:K;h.width(Q),P.select(".nv-legendWrap").datum(k).call(h),l.top!=h.height()&&(l.top=h.height(),L=a.utils.availableHeight(n,x,l)),P.select(".nv-legendWrap").attr("transform","translate("+(K-Q)+","+-l.top+")")}if(p){var R=[{key:B.stacked||"Stacked",metaKey:"Stacked",disabled:"stack"!=e.style(),style:"stack"},{key:B.stream||"Stream",metaKey:"Stream",disabled:"stream"!=e.style(),style:"stream"},{key:B.expanded||"Expanded",metaKey:"Expanded",disabled:"expand"!=e.style(),style:"expand"},{key:B.stack_percent||"Stack %",metaKey:"Stack_Percent",disabled:"stack_percent"!=e.style(),style:"stack_percent"}];z=A.length/3*260,R=R.filter(function(a){return-1!==A.indexOf(a.metaKey)}),i.width(z).color(["#444","#444","#444"]),P.select(".nv-controlsWrap").datum(R).call(i),l.top!=Math.max(i.height(),h.height())&&(l.top=Math.max(i.height(),h.height()),L=a.utils.availableHeight(n,x,l)),P.select(".nv-controlsWrap").attr("transform","translate(0,"+-l.top+")")}N.attr("transform","translate("+l.left+","+l.top+")"),t&&P.select(".nv-y.nv-axis").attr("transform","translate("+K+",0)"),u&&(j.width(K).height(L).margin({left:l.left,top:l.top}).svgContainer(x).xScale(c),N.select(".nv-interactive").call(j)),e.width(K).height(L);var S=P.select(".nv-stackedWrap").datum(k);if(S.transition().call(e),r&&(f.scale(c)._ticks(a.utils.calcTicksX(K/100,k)).tickSize(-L,0),P.select(".nv-x.nv-axis").attr("transform","translate(0,"+L+")"),P.select(".nv-x.nv-axis").transition().duration(0).call(f)),s){var T;if(T="wiggle"===e.offset()?0:a.utils.calcTicksY(L/36,k),g.scale(d)._ticks(T).tickSize(-K,0),"expand"===e.style()||"stack_percent"===e.style()){var U=g.tickFormat();D&&U===J||(D=U),g.tickFormat(J)}else D&&(g.tickFormat(D),D=null);P.select(".nv-y.nv-axis").transition().duration(0).call(g)}e.dispatch.on("areaClick.toggle",function(a){k.forEach(1===k.filter(function(a){return!a.disabled}).length?function(a){a.disabled=!1}:function(b,c){b.disabled=c!=a.seriesIndex}),v.disabled=k.map(function(a){return!!a.disabled}),y.stateChange(v),b.update()}),h.dispatch.on("stateChange",function(a){for(var c in a)v[c]=a[c];y.stateChange(v),b.update()}),i.dispatch.on("legendClick",function(a){a.disabled&&(R=R.map(function(a){return a.disabled=!0,a}),a.disabled=!1,e.style(a.style),v.style=e.style(),y.stateChange(v),b.update())}),j.dispatch.on("elementMousemove",function(c){e.clearHighlights();var d,g,h,i=[];if(k.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(f,j){g=a.interactiveBisect(f.values,c.pointXValue,b.x());var k=f.values[g],l=b.y()(k,g);if(null!=l&&e.highlightPoint(j,g,!0),"undefined"!=typeof k){"undefined"==typeof d&&(d=k),"undefined"==typeof h&&(h=b.xScale()(b.x()(k,g)));var m="expand"==e.style()?k.display.y:b.y()(k,g);i.push({key:f.key,value:m,color:o(f,f.seriesIndex),stackedValue:k.display})}}),i.reverse(),i.length>2){var m=b.yScale().invert(c.mouseY),n=null;i.forEach(function(a,b){m=Math.abs(m);var c=Math.abs(a.stackedValue.y0),d=Math.abs(a.stackedValue.y);return m>=c&&d+c>=m?void(n=b):void 0}),null!=n&&(i[n].highlight=!0)}var p=f.tickFormat()(b.x()(d,g)),q=j.tooltip.valueFormatter();"expand"===e.style()||"stack_percent"===e.style()?(E||(E=q),q=d3.format(".1%")):E&&(q=E,E=null),j.tooltip.position({left:h+l.left,top:c.mouseY+l.top}).chartContainer(F.parentNode).valueFormatter(q).data({value:p,series:i})(),j.renderGuideLine(h)}),j.dispatch.on("elementMouseout",function(){e.clearHighlights()}),y.on("changeState",function(a){"undefined"!=typeof a.disabled&&k.length===a.disabled.length&&(k.forEach(function(b,c){b.disabled=a.disabled[c]}),v.disabled=a.disabled),"undefined"!=typeof a.style&&(e.style(a.style),G=a.style),b.update()})}),F.renderEnd("stacked Area chart immediate"),b}var c,d,e=a.models.stackedArea(),f=a.models.axis(),g=a.models.axis(),h=a.models.legend(),i=a.models.legend(),j=a.interactiveGuideline(),k=a.models.tooltip(),l={top:30,right:25,bottom:50,left:60},m=null,n=null,o=a.utils.defaultColor(),p=!0,q=!0,r=!0,s=!0,t=!1,u=!1,v=a.utils.state(),w=null,x=null,y=d3.dispatch("stateChange","changeState","renderEnd"),z=250,A=["Stacked","Stream","Expanded"],B={},C=250;v.style=e.style(),f.orient("bottom").tickPadding(7),g.orient(t?"right":"left"),k.headerFormatter(function(a,b){return f.tickFormat()(a,b)}).valueFormatter(function(a,b){return g.tickFormat()(a,b)}),j.tooltip.headerFormatter(function(a,b){return f.tickFormat()(a,b)}).valueFormatter(function(a,b){return g.tickFormat()(a,b)});var D=null,E=null;i.updateState(!1);var F=a.utils.renderWatch(y),G=e.style(),H=function(a){return function(){return{active:a.map(function(a){return!a.disabled}),style:e.style()}}},I=function(a){return function(b){void 0!==b.style&&(G=b.style),void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}},J=d3.format("%");return e.dispatch.on("elementMouseover.tooltip",function(a){a.point.x=e.x()(a.point),a.point.y=e.y()(a.point),k.data(a).position(a.pos).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(){k.hidden(!0)}),b.dispatch=y,b.stacked=e,b.legend=h,b.controls=i,b.xAxis=f,b.yAxis=g,b.interactiveLayer=j,b.tooltip=k,b.dispatch=y,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return m},set:function(a){m=a}},height:{get:function(){return n},set:function(a){n=a}},showLegend:{get:function(){return q},set:function(a){q=a}},showXAxis:{get:function(){return r},set:function(a){r=a}},showYAxis:{get:function(){return s},set:function(a){s=a}},defaultState:{get:function(){return w},set:function(a){w=a}},noData:{get:function(){return x},set:function(a){x=a}},showControls:{get:function(){return p},set:function(a){p=a}},controlLabels:{get:function(){return B},set:function(a){B=a}},controlOptions:{get:function(){return A},set:function(a){A=a}},tooltips:{get:function(){return k.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),k.enabled(!!b)}},tooltipContent:{get:function(){return k.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),k.contentGenerator(b)}},margin:{get:function(){return l},set:function(a){l.top=void 0!==a.top?a.top:l.top,l.right=void 0!==a.right?a.right:l.right,l.bottom=void 0!==a.bottom?a.bottom:l.bottom,l.left=void 0!==a.left?a.left:l.left}},duration:{get:function(){return C},set:function(a){C=a,F.reset(C),e.duration(C),f.duration(C),g.duration(C)}},color:{get:function(){return o},set:function(b){o=a.utils.getColor(b),h.color(o),e.color(o)}},rightAlignYAxis:{get:function(){return t},set:function(a){t=a,g.orient(t?"right":"left")}},useInteractiveGuideline:{get:function(){return u},set:function(a){u=!!a,b.interactive(!a),b.useVoronoi(!a),e.scatter.interactive(!a)}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.sunburst=function(){"use strict";function b(u){return t.reset(),u.each(function(b){function t(a){a.x0=a.x,a.dx0=a.dx}function u(a){var b=d3.interpolate(p.domain(),[a.x,a.x+a.dx]),c=d3.interpolate(q.domain(),[a.y,1]),d=d3.interpolate(q.range(),[a.y?20:0,y]);return function(a,e){return e?function(){return s(a)}:function(e){return p.domain(b(e)),q.domain(c(e)).range(d(e)),s(a)}}}l=d3.select(this);var v,w=a.utils.availableWidth(g,l,f),x=a.utils.availableHeight(h,l,f),y=Math.min(w,x)/2;a.utils.initSVG(l);var z=l.selectAll(".nv-wrap.nv-sunburst").data(b),A=z.enter().append("g").attr("class","nvd3 nv-wrap nv-sunburst nv-chart-"+k),B=A.selectAll("nv-sunburst");z.attr("transform","translate("+w/2+","+x/2+")"),l.on("click",function(a,b){o.chartClick({data:a,index:b,pos:d3.event,id:k})}),q.range([0,y]),c=c||b,e=b[0],r.value(j[i]||j.count),v=B.data(r.nodes).enter().append("path").attr("d",s).style("fill",function(a){return m((a.children?a:a.parent).name)}).style("stroke","#FFF").on("click",function(a){d!==c&&c!==a&&(d=c),c=a,v.transition().duration(n).attrTween("d",u(a))}).each(t).on("dblclick",function(a){d.parent==a&&v.transition().duration(n).attrTween("d",u(e))}).each(t).on("mouseover",function(a){d3.select(this).classed("hover",!0).style("opacity",.8),o.elementMouseover({data:a,color:d3.select(this).style("fill")})}).on("mouseout",function(a){d3.select(this).classed("hover",!1).style("opacity",1),o.elementMouseout({data:a})}).on("mousemove",function(a){o.elementMousemove({data:a})})}),t.renderEnd("sunburst immediate"),b}var c,d,e,f={top:0,right:0,bottom:0,left:0},g=null,h=null,i="count",j={count:function(){return 1},size:function(a){return a.size}},k=Math.floor(1e4*Math.random()),l=null,m=a.utils.defaultColor(),n=500,o=d3.dispatch("chartClick","elementClick","elementDblClick","elementMousemove","elementMouseover","elementMouseout","renderEnd"),p=d3.scale.linear().range([0,2*Math.PI]),q=d3.scale.sqrt(),r=d3.layout.partition().sort(null).value(function(){return 1}),s=d3.svg.arc().startAngle(function(a){return Math.max(0,Math.min(2*Math.PI,p(a.x)))}).endAngle(function(a){return Math.max(0,Math.min(2*Math.PI,p(a.x+a.dx)))}).innerRadius(function(a){return Math.max(0,q(a.y))}).outerRadius(function(a){return Math.max(0,q(a.y+a.dy))}),t=a.utils.renderWatch(o);return b.dispatch=o,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return g},set:function(a){g=a}},height:{get:function(){return h},set:function(a){h=a}},mode:{get:function(){return i},set:function(a){i=a}},id:{get:function(){return k},set:function(a){k=a}},duration:{get:function(){return n},set:function(a){n=a}},margin:{get:function(){return f},set:function(a){f.top=void 0!=a.top?a.top:f.top,f.right=void 0!=a.right?a.right:f.right,f.bottom=void 0!=a.bottom?a.bottom:f.bottom,f.left=void 0!=a.left?a.left:f.left}},color:{get:function(){return m},set:function(b){m=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.sunburstChart=function(){"use strict";function b(d){return m.reset(),m.models(c),d.each(function(d){var h=d3.select(this);a.utils.initSVG(h);var i=a.utils.availableWidth(f,h,e),j=a.utils.availableHeight(g,h,e);if(b.update=function(){0===k?h.call(b):h.transition().duration(k).call(b)},b.container=this,!d||!d.length)return a.utils.noData(b,h),b;h.selectAll(".nv-noData").remove();var l=h.selectAll("g.nv-wrap.nv-sunburstChart").data(d),m=l.enter().append("g").attr("class","nvd3 nv-wrap nv-sunburstChart").append("g"),n=l.select("g");m.append("g").attr("class","nv-sunburstWrap"),l.attr("transform","translate("+e.left+","+e.top+")"),c.width(i).height(j);var o=n.select(".nv-sunburstWrap").datum(d);d3.transition(o).call(c)}),m.renderEnd("sunburstChart immediate"),b}var c=a.models.sunburst(),d=a.models.tooltip(),e={top:30,right:20,bottom:20,left:20},f=null,g=null,h=a.utils.defaultColor(),i=(Math.round(1e5*Math.random()),null),j=null,k=250,l=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd"),m=a.utils.renderWatch(l);return d.headerEnabled(!1).duration(0).valueFormatter(function(a){return a}),c.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:a.data.name,value:a.data.size,color:a.color},d.data(a).hidden(!1)}),c.dispatch.on("elementMouseout.tooltip",function(){d.hidden(!0)}),c.dispatch.on("elementMousemove.tooltip",function(){d.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=l,b.sunburst=c,b.tooltip=d,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{noData:{get:function(){return j},set:function(a){j=a}},defaultState:{get:function(){return i},set:function(a){i=a}},color:{get:function(){return h},set:function(a){h=a,c.color(h)}},duration:{get:function(){return k},set:function(a){k=a,m.reset(k),c.duration(k)}},margin:{get:function(){return e},set:function(a){e.top=void 0!==a.top?a.top:e.top,e.right=void 0!==a.right?a.right:e.right,e.bottom=void 0!==a.bottom?a.bottom:e.bottom,e.left=void 0!==a.left?a.left:e.left}}}),a.utils.inheritOptions(b,c),a.utils.initOptions(b),b},a.version="1.8.1"}(); \ No newline at end of file diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/popper.min.js b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/popper.min.js deleted file mode 100644 index bb1aaae..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/popper.min.js +++ /dev/null @@ -1,5 +0,0 @@ -/* - Copyright (C) Federico Zivolo 2020 - Distributed under the MIT License (license terms are at http://opensource.org/licenses/MIT). - */(function(e,t){'object'==typeof exports&&'undefined'!=typeof module?module.exports=t():'function'==typeof define&&define.amd?define(t):e.Popper=t()})(this,function(){'use strict';function e(e){return e&&'[object Function]'==={}.toString.call(e)}function t(e,t){if(1!==e.nodeType)return[];var o=e.ownerDocument.defaultView,n=o.getComputedStyle(e,null);return t?n[t]:n}function o(e){return'HTML'===e.nodeName?e:e.parentNode||e.host}function n(e){if(!e)return document.body;switch(e.nodeName){case'HTML':case'BODY':return e.ownerDocument.body;case'#document':return e.body;}var i=t(e),r=i.overflow,p=i.overflowX,s=i.overflowY;return /(auto|scroll|overlay)/.test(r+s+p)?e:n(o(e))}function i(e){return e&&e.referenceNode?e.referenceNode:e}function r(e){return 11===e?re:10===e?pe:re||pe}function p(e){if(!e)return document.documentElement;for(var o=r(10)?document.body:null,n=e.offsetParent||null;n===o&&e.nextElementSibling;)n=(e=e.nextElementSibling).offsetParent;var i=n&&n.nodeName;return i&&'BODY'!==i&&'HTML'!==i?-1!==['TH','TD','TABLE'].indexOf(n.nodeName)&&'static'===t(n,'position')?p(n):n:e?e.ownerDocument.documentElement:document.documentElement}function s(e){var t=e.nodeName;return'BODY'!==t&&('HTML'===t||p(e.firstElementChild)===e)}function d(e){return null===e.parentNode?e:d(e.parentNode)}function a(e,t){if(!e||!e.nodeType||!t||!t.nodeType)return document.documentElement;var o=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,n=o?e:t,i=o?t:e,r=document.createRange();r.setStart(n,0),r.setEnd(i,0);var l=r.commonAncestorContainer;if(e!==l&&t!==l||n.contains(i))return s(l)?l:p(l);var f=d(e);return f.host?a(f.host,t):a(e,d(t).host)}function l(e){var t=1=o.clientWidth&&n>=o.clientHeight}),l=0a[e]&&!t.escapeWithReference&&(n=Q(f[o],a[e]-('right'===e?f.width:f.height))),ae({},o,n)}};return l.forEach(function(e){var t=-1===['left','top'].indexOf(e)?'secondary':'primary';f=le({},f,m[t](e))}),e.offsets.popper=f,e},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,o=t.popper,n=t.reference,i=e.placement.split('-')[0],r=Z,p=-1!==['top','bottom'].indexOf(i),s=p?'right':'bottom',d=p?'left':'top',a=p?'width':'height';return o[s]r(n[s])&&(e.offsets.popper[d]=r(n[s])),e}},arrow:{order:500,enabled:!0,fn:function(e,o){var n;if(!K(e.instance.modifiers,'arrow','keepTogether'))return e;var i=o.element;if('string'==typeof i){if(i=e.instance.popper.querySelector(i),!i)return e;}else if(!e.instance.popper.contains(i))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),e;var r=e.placement.split('-')[0],p=e.offsets,s=p.popper,d=p.reference,a=-1!==['left','right'].indexOf(r),l=a?'height':'width',f=a?'Top':'Left',m=f.toLowerCase(),h=a?'left':'top',c=a?'bottom':'right',u=S(i)[l];d[c]-us[c]&&(e.offsets.popper[m]+=d[m]+u-s[c]),e.offsets.popper=g(e.offsets.popper);var b=d[m]+d[l]/2-u/2,w=t(e.instance.popper),y=parseFloat(w['margin'+f]),E=parseFloat(w['border'+f+'Width']),v=b-e.offsets.popper[m]-y-E;return v=ee(Q(s[l]-u,v),0),e.arrowElement=i,e.offsets.arrow=(n={},ae(n,m,$(v)),ae(n,h,''),n),e},element:'[x-arrow]'},flip:{order:600,enabled:!0,fn:function(e,t){if(W(e.instance.modifiers,'inner'))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var o=v(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement,e.positionFixed),n=e.placement.split('-')[0],i=T(n),r=e.placement.split('-')[1]||'',p=[];switch(t.behavior){case ce.FLIP:p=[n,i];break;case ce.CLOCKWISE:p=G(n);break;case ce.COUNTERCLOCKWISE:p=G(n,!0);break;default:p=t.behavior;}return p.forEach(function(s,d){if(n!==s||p.length===d+1)return e;n=e.placement.split('-')[0],i=T(n);var a=e.offsets.popper,l=e.offsets.reference,f=Z,m='left'===n&&f(a.right)>f(l.left)||'right'===n&&f(a.left)f(l.top)||'bottom'===n&&f(a.top)f(o.right),g=f(a.top)f(o.bottom),b='left'===n&&h||'right'===n&&c||'top'===n&&g||'bottom'===n&&u,w=-1!==['top','bottom'].indexOf(n),y=!!t.flipVariations&&(w&&'start'===r&&h||w&&'end'===r&&c||!w&&'start'===r&&g||!w&&'end'===r&&u),E=!!t.flipVariationsByContent&&(w&&'start'===r&&c||w&&'end'===r&&h||!w&&'start'===r&&u||!w&&'end'===r&&g),v=y||E;(m||b||v)&&(e.flipped=!0,(m||b)&&(n=p[d+1]),v&&(r=z(r)),e.placement=n+(r?'-'+r:''),e.offsets.popper=le({},e.offsets.popper,C(e.instance.popper,e.offsets.reference,e.placement)),e=P(e.instance.modifiers,e,'flip'))}),e},behavior:'flip',padding:5,boundariesElement:'viewport',flipVariations:!1,flipVariationsByContent:!1},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,o=t.split('-')[0],n=e.offsets,i=n.popper,r=n.reference,p=-1!==['left','right'].indexOf(o),s=-1===['top','left'].indexOf(o);return i[p?'left':'top']=r[o]-(s?i[p?'width':'height']:0),e.placement=T(t),e.offsets.popper=g(i),e}},hide:{order:800,enabled:!0,fn:function(e){if(!K(e.instance.modifiers,'hide','preventOverflow'))return e;var t=e.offsets.reference,o=D(e.instance.modifiers,function(e){return'preventOverflow'===e.name}).boundaries;if(t.bottomo.right||t.top>o.bottom||t.rightwindow.devicePixelRatio||!fe),c='bottom'===o?'top':'bottom',g='right'===n?'left':'right',b=B('transform');if(d='bottom'==c?'HTML'===l.nodeName?-l.clientHeight+h.bottom:-f.height+h.bottom:h.top,s='right'==g?'HTML'===l.nodeName?-l.clientWidth+h.right:-f.width+h.right:h.left,a&&b)m[b]='translate3d('+s+'px, '+d+'px, 0)',m[c]=0,m[g]=0,m.willChange='transform';else{var w='bottom'==c?-1:1,y='right'==g?-1:1;m[c]=d*w,m[g]=s*y,m.willChange=c+', '+g}var E={"x-placement":e.placement};return e.attributes=le({},E,e.attributes),e.styles=le({},m,e.styles),e.arrowStyles=le({},e.offsets.arrow,e.arrowStyles),e},gpuAcceleration:!0,x:'bottom',y:'right'},applyStyle:{order:900,enabled:!0,fn:function(e){return V(e.instance.popper,e.styles),j(e.instance.popper,e.attributes),e.arrowElement&&Object.keys(e.arrowStyles).length&&V(e.arrowElement,e.arrowStyles),e},onLoad:function(e,t,o,n,i){var r=L(i,t,e,o.positionFixed),p=O(o.placement,r,t,e,o.modifiers.flip.boundariesElement,o.modifiers.flip.padding);return t.setAttribute('x-placement',p),V(t,{position:o.positionFixed?'fixed':'absolute'}),o},gpuAcceleration:void 0}}},ge}); -//# sourceMappingURL=popper.min.js.map diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/line.html.dist b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/line.html.dist deleted file mode 100644 index 89810d1..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/line.html.dist +++ /dev/null @@ -1 +0,0 @@ - {{lineNumber}}{{lineContent}} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/lines.html.dist b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/lines.html.dist deleted file mode 100644 index add40e4..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/lines.html.dist +++ /dev/null @@ -1,5 +0,0 @@ - - -{{lines}} - -
diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/method_item.html.dist b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/method_item.html.dist deleted file mode 100644 index 2311d45..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/method_item.html.dist +++ /dev/null @@ -1,12 +0,0 @@ - - {{name}} - {{lines_bar}} -
{{lines_executed_percent}}
-
{{lines_number}}
- {{methods_bar}} -
{{methods_tested_percent}}
-
{{methods_number}}
- {{crap}} - - - diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/method_item_branch.html.dist b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/method_item_branch.html.dist deleted file mode 100644 index 36d6cb7..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/method_item_branch.html.dist +++ /dev/null @@ -1,18 +0,0 @@ - - {{name}} - {{lines_bar}} -
{{lines_executed_percent}}
-
{{lines_number}}
- {{branches_bar}} -
{{branches_executed_percent}}
-
{{branches_number}}
- {{paths_bar}} -
{{paths_executed_percent}}
-
{{paths_number}}
- {{methods_bar}} -
{{methods_tested_percent}}
-
{{methods_number}}
- {{crap}} - - - diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/paths.html.dist b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/paths.html.dist deleted file mode 100644 index d14b8ad..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/paths.html.dist +++ /dev/null @@ -1,9 +0,0 @@ -
-

Paths

-

- Below are the source code lines that represent each code path as identified by Xdebug. Please note a path is not - necessarily coterminous with a line, a line may contain multiple paths and therefore show up more than once. - Please also be aware that some paths may include implicit rather than explicit branches, e.g. an if statement - always has an else as part of its logical flow even if you didn't write one. -

-{{paths}} diff --git a/vendor/phpunit/php-code-coverage/src/Report/PHP.php b/vendor/phpunit/php-code-coverage/src/Report/PHP.php deleted file mode 100644 index 6f46f99..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/PHP.php +++ /dev/null @@ -1,41 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report; - -use function dirname; -use function file_put_contents; -use function serialize; -use function str_contains; -use SebastianBergmann\CodeCoverage\CodeCoverage; -use SebastianBergmann\CodeCoverage\Driver\WriteOperationFailedException; -use SebastianBergmann\CodeCoverage\Util\Filesystem; - -final class PHP -{ - public function process(CodeCoverage $coverage, ?string $target = null): string - { - $coverage->clearCache(); - - $buffer = " - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report; - -use const PHP_EOL; -use function array_map; -use function date; -use function ksort; -use function max; -use function sprintf; -use function str_pad; -use function strlen; -use SebastianBergmann\CodeCoverage\CodeCoverage; -use SebastianBergmann\CodeCoverage\Node\File; -use SebastianBergmann\CodeCoverage\Util\Percentage; - -final class Text -{ - /** - * @var string - */ - private const COLOR_GREEN = "\x1b[30;42m"; - - /** - * @var string - */ - private const COLOR_YELLOW = "\x1b[30;43m"; - - /** - * @var string - */ - private const COLOR_RED = "\x1b[37;41m"; - - /** - * @var string - */ - private const COLOR_HEADER = "\x1b[1;37;40m"; - - /** - * @var string - */ - private const COLOR_RESET = "\x1b[0m"; - private readonly Thresholds $thresholds; - private readonly bool $showUncoveredFiles; - private readonly bool $showOnlySummary; - - public function __construct(Thresholds $thresholds, bool $showUncoveredFiles = false, bool $showOnlySummary = false) - { - $this->thresholds = $thresholds; - $this->showUncoveredFiles = $showUncoveredFiles; - $this->showOnlySummary = $showOnlySummary; - } - - public function process(CodeCoverage $coverage, bool $showColors = false): string - { - $hasBranchCoverage = !empty($coverage->getData(true)->functionCoverage()); - - $output = PHP_EOL . PHP_EOL; - $report = $coverage->getReport(); - - $colors = [ - 'header' => '', - 'classes' => '', - 'methods' => '', - 'lines' => '', - 'branches' => '', - 'paths' => '', - 'reset' => '', - ]; - - if ($showColors) { - $colors['classes'] = $this->coverageColor( - $report->numberOfTestedClassesAndTraits(), - $report->numberOfClassesAndTraits(), - ); - - $colors['methods'] = $this->coverageColor( - $report->numberOfTestedMethods(), - $report->numberOfMethods(), - ); - - $colors['lines'] = $this->coverageColor( - $report->numberOfExecutedLines(), - $report->numberOfExecutableLines(), - ); - - $colors['branches'] = $this->coverageColor( - $report->numberOfExecutedBranches(), - $report->numberOfExecutableBranches(), - ); - - $colors['paths'] = $this->coverageColor( - $report->numberOfExecutedPaths(), - $report->numberOfExecutablePaths(), - ); - - $colors['reset'] = self::COLOR_RESET; - $colors['header'] = self::COLOR_HEADER; - } - - $classes = sprintf( - ' Classes: %6s (%d/%d)', - Percentage::fromFractionAndTotal( - $report->numberOfTestedClassesAndTraits(), - $report->numberOfClassesAndTraits(), - )->asString(), - $report->numberOfTestedClassesAndTraits(), - $report->numberOfClassesAndTraits(), - ); - - $methods = sprintf( - ' Methods: %6s (%d/%d)', - Percentage::fromFractionAndTotal( - $report->numberOfTestedMethods(), - $report->numberOfMethods(), - )->asString(), - $report->numberOfTestedMethods(), - $report->numberOfMethods(), - ); - - $paths = ''; - $branches = ''; - - if ($hasBranchCoverage) { - $paths = sprintf( - ' Paths: %6s (%d/%d)', - Percentage::fromFractionAndTotal( - $report->numberOfExecutedPaths(), - $report->numberOfExecutablePaths(), - )->asString(), - $report->numberOfExecutedPaths(), - $report->numberOfExecutablePaths(), - ); - - $branches = sprintf( - ' Branches: %6s (%d/%d)', - Percentage::fromFractionAndTotal( - $report->numberOfExecutedBranches(), - $report->numberOfExecutableBranches(), - )->asString(), - $report->numberOfExecutedBranches(), - $report->numberOfExecutableBranches(), - ); - } - - $lines = sprintf( - ' Lines: %6s (%d/%d)', - Percentage::fromFractionAndTotal( - $report->numberOfExecutedLines(), - $report->numberOfExecutableLines(), - )->asString(), - $report->numberOfExecutedLines(), - $report->numberOfExecutableLines(), - ); - - $padding = max(array_map('strlen', [$classes, $methods, $lines])); - - if ($this->showOnlySummary) { - $title = 'Code Coverage Report Summary:'; - $padding = max($padding, strlen($title)); - - $output .= $this->format($colors['header'], $padding, $title); - } else { - $date = date(' Y-m-d H:i:s'); - $title = 'Code Coverage Report:'; - - $output .= $this->format($colors['header'], $padding, $title); - $output .= $this->format($colors['header'], $padding, $date); - $output .= $this->format($colors['header'], $padding, ''); - $output .= $this->format($colors['header'], $padding, ' Summary:'); - } - - $output .= $this->format($colors['classes'], $padding, $classes); - $output .= $this->format($colors['methods'], $padding, $methods); - - if ($hasBranchCoverage) { - $output .= $this->format($colors['paths'], $padding, $paths); - $output .= $this->format($colors['branches'], $padding, $branches); - } - $output .= $this->format($colors['lines'], $padding, $lines); - - if ($this->showOnlySummary) { - return $output . PHP_EOL; - } - - $classCoverage = []; - - foreach ($report as $item) { - if (!$item instanceof File) { - continue; - } - - $classes = $item->classesAndTraits(); - - foreach ($classes as $className => $class) { - $classExecutableLines = 0; - $classExecutedLines = 0; - $classExecutableBranches = 0; - $classExecutedBranches = 0; - $classExecutablePaths = 0; - $classExecutedPaths = 0; - $coveredMethods = 0; - $classMethods = 0; - - foreach ($class['methods'] as $method) { - if ($method['executableLines'] == 0) { - continue; - } - - $classMethods++; - $classExecutableLines += $method['executableLines']; - $classExecutedLines += $method['executedLines']; - $classExecutableBranches += $method['executableBranches']; - $classExecutedBranches += $method['executedBranches']; - $classExecutablePaths += $method['executablePaths']; - $classExecutedPaths += $method['executedPaths']; - - if ($method['coverage'] == 100) { - $coveredMethods++; - } - } - - $classCoverage[$className] = [ - 'namespace' => $class['namespace'], - 'className' => $className, - 'methodsCovered' => $coveredMethods, - 'methodCount' => $classMethods, - 'statementsCovered' => $classExecutedLines, - 'statementCount' => $classExecutableLines, - 'branchesCovered' => $classExecutedBranches, - 'branchesCount' => $classExecutableBranches, - 'pathsCovered' => $classExecutedPaths, - 'pathsCount' => $classExecutablePaths, - ]; - } - } - - ksort($classCoverage); - - $methodColor = ''; - $pathsColor = ''; - $branchesColor = ''; - $linesColor = ''; - $resetColor = ''; - - foreach ($classCoverage as $fullQualifiedPath => $classInfo) { - if ($this->showUncoveredFiles || $classInfo['statementsCovered'] != 0) { - if ($showColors) { - $methodColor = $this->coverageColor($classInfo['methodsCovered'], $classInfo['methodCount']); - $pathsColor = $this->coverageColor($classInfo['pathsCovered'], $classInfo['pathsCount']); - $branchesColor = $this->coverageColor($classInfo['branchesCovered'], $classInfo['branchesCount']); - $linesColor = $this->coverageColor($classInfo['statementsCovered'], $classInfo['statementCount']); - $resetColor = $colors['reset']; - } - - $output .= PHP_EOL . $fullQualifiedPath . PHP_EOL - . ' ' . $methodColor . 'Methods: ' . $this->printCoverageCounts($classInfo['methodsCovered'], $classInfo['methodCount'], 2) . $resetColor . ' '; - - if ($hasBranchCoverage) { - $output .= ' ' . $pathsColor . 'Paths: ' . $this->printCoverageCounts($classInfo['pathsCovered'], $classInfo['pathsCount'], 3) . $resetColor . ' ' - . ' ' . $branchesColor . 'Branches: ' . $this->printCoverageCounts($classInfo['branchesCovered'], $classInfo['branchesCount'], 3) . $resetColor . ' '; - } - $output .= ' ' . $linesColor . 'Lines: ' . $this->printCoverageCounts($classInfo['statementsCovered'], $classInfo['statementCount'], 3) . $resetColor; - } - } - - return $output . PHP_EOL; - } - - private function coverageColor(int $numberOfCoveredElements, int $totalNumberOfElements): string - { - $coverage = Percentage::fromFractionAndTotal( - $numberOfCoveredElements, - $totalNumberOfElements, - ); - - if ($coverage->asFloat() >= $this->thresholds->highLowerBound()) { - return self::COLOR_GREEN; - } - - if ($coverage->asFloat() > $this->thresholds->lowUpperBound()) { - return self::COLOR_YELLOW; - } - - return self::COLOR_RED; - } - - private function printCoverageCounts(int $numberOfCoveredElements, int $totalNumberOfElements, int $precision): string - { - $format = '%' . $precision . 's'; - - return Percentage::fromFractionAndTotal( - $numberOfCoveredElements, - $totalNumberOfElements, - )->asFixedWidthString() . - ' (' . sprintf($format, $numberOfCoveredElements) . '/' . - sprintf($format, $totalNumberOfElements) . ')'; - } - - private function format(string $color, int $padding, false|string $string): string - { - if ($color === '') { - return (string) $string . PHP_EOL; - } - - return $color . str_pad((string) $string, $padding) . self::COLOR_RESET . PHP_EOL; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Thresholds.php b/vendor/phpunit/php-code-coverage/src/Report/Thresholds.php deleted file mode 100644 index af6c6ce..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Thresholds.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report; - -use SebastianBergmann\CodeCoverage\InvalidArgumentException; - -/** - * @psalm-immutable - */ -final class Thresholds -{ - private readonly int $lowUpperBound; - private readonly int $highLowerBound; - - public static function default(): self - { - return new self(50, 90); - } - - /** - * @throws InvalidArgumentException - */ - public static function from(int $lowUpperBound, int $highLowerBound): self - { - if ($lowUpperBound > $highLowerBound) { - throw new InvalidArgumentException( - '$lowUpperBound must not be larger than $highLowerBound', - ); - } - - return new self($lowUpperBound, $highLowerBound); - } - - private function __construct(int $lowUpperBound, int $highLowerBound) - { - $this->lowUpperBound = $lowUpperBound; - $this->highLowerBound = $highLowerBound; - } - - public function lowUpperBound(): int - { - return $this->lowUpperBound; - } - - public function highLowerBound(): int - { - return $this->highLowerBound; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Xml/BuildInformation.php b/vendor/phpunit/php-code-coverage/src/Report/Xml/BuildInformation.php deleted file mode 100644 index 264bf71..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Xml/BuildInformation.php +++ /dev/null @@ -1,79 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Xml; - -use function phpversion; -use DateTimeImmutable; -use DOMElement; -use SebastianBergmann\Environment\Runtime; - -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage - */ -final class BuildInformation -{ - private readonly DOMElement $contextNode; - - public function __construct(DOMElement $contextNode) - { - $this->contextNode = $contextNode; - } - - public function setRuntimeInformation(Runtime $runtime): void - { - $runtimeNode = $this->nodeByName('runtime'); - - $runtimeNode->setAttribute('name', $runtime->getName()); - $runtimeNode->setAttribute('version', $runtime->getVersion()); - $runtimeNode->setAttribute('url', $runtime->getVendorUrl()); - - $driverNode = $this->nodeByName('driver'); - - if ($runtime->hasXdebug()) { - $driverNode->setAttribute('name', 'xdebug'); - $driverNode->setAttribute('version', phpversion('xdebug')); - } - - if ($runtime->hasPCOV()) { - $driverNode->setAttribute('name', 'pcov'); - $driverNode->setAttribute('version', phpversion('pcov')); - } - } - - public function setBuildTime(DateTimeImmutable $date): void - { - $this->contextNode->setAttribute('time', $date->format('D M j G:i:s T Y')); - } - - public function setGeneratorVersions(string $phpUnitVersion, string $coverageVersion): void - { - $this->contextNode->setAttribute('phpunit', $phpUnitVersion); - $this->contextNode->setAttribute('coverage', $coverageVersion); - } - - private function nodeByName(string $name): DOMElement - { - $node = $this->contextNode->getElementsByTagNameNS( - 'https://schema.phpunit.de/coverage/1.0', - $name, - )->item(0); - - if (!$node) { - $node = $this->contextNode->appendChild( - $this->contextNode->ownerDocument->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - $name, - ), - ); - } - - return $node; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Xml/Coverage.php b/vendor/phpunit/php-code-coverage/src/Report/Xml/Coverage.php deleted file mode 100644 index bb41dfb..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Xml/Coverage.php +++ /dev/null @@ -1,63 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Xml; - -use DOMElement; -use SebastianBergmann\CodeCoverage\ReportAlreadyFinalizedException; -use XMLWriter; - -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage - */ -final class Coverage -{ - private readonly XMLWriter $writer; - private readonly DOMElement $contextNode; - private bool $finalized = false; - - public function __construct(DOMElement $context, string $line) - { - $this->contextNode = $context; - - $this->writer = new XMLWriter; - $this->writer->openMemory(); - $this->writer->startElementNS(null, $context->nodeName, 'https://schema.phpunit.de/coverage/1.0'); - $this->writer->writeAttribute('nr', $line); - } - - /** - * @throws ReportAlreadyFinalizedException - */ - public function addTest(string $test): void - { - if ($this->finalized) { - throw new ReportAlreadyFinalizedException; - } - - $this->writer->startElement('covered'); - $this->writer->writeAttribute('by', $test); - $this->writer->endElement(); - } - - public function finalize(): void - { - $this->writer->endElement(); - - $fragment = $this->contextNode->ownerDocument->createDocumentFragment(); - $fragment->appendXML($this->writer->outputMemory()); - - $this->contextNode->parentNode->replaceChild( - $fragment, - $this->contextNode, - ); - - $this->finalized = true; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Xml/Directory.php b/vendor/phpunit/php-code-coverage/src/Report/Xml/Directory.php deleted file mode 100644 index b712953..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Xml/Directory.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Xml; - -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage - */ -final class Directory extends Node -{ -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Xml/Facade.php b/vendor/phpunit/php-code-coverage/src/Report/Xml/Facade.php deleted file mode 100644 index 3264718..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Xml/Facade.php +++ /dev/null @@ -1,304 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Xml; - -use const DIRECTORY_SEPARATOR; -use const PHP_EOL; -use function count; -use function dirname; -use function file_get_contents; -use function file_put_contents; -use function is_array; -use function is_dir; -use function is_file; -use function is_writable; -use function libxml_clear_errors; -use function libxml_get_errors; -use function libxml_use_internal_errors; -use function sprintf; -use function strlen; -use function substr; -use DateTimeImmutable; -use DOMDocument; -use SebastianBergmann\CodeCoverage\CodeCoverage; -use SebastianBergmann\CodeCoverage\Driver\PathExistsButIsNotDirectoryException; -use SebastianBergmann\CodeCoverage\Driver\WriteOperationFailedException; -use SebastianBergmann\CodeCoverage\Node\AbstractNode; -use SebastianBergmann\CodeCoverage\Node\Directory as DirectoryNode; -use SebastianBergmann\CodeCoverage\Node\File as FileNode; -use SebastianBergmann\CodeCoverage\Util\Filesystem as DirectoryUtil; -use SebastianBergmann\CodeCoverage\Version; -use SebastianBergmann\CodeCoverage\XmlException; -use SebastianBergmann\Environment\Runtime; - -final class Facade -{ - private string $target; - private Project $project; - private readonly string $phpUnitVersion; - - public function __construct(string $version) - { - $this->phpUnitVersion = $version; - } - - /** - * @throws XmlException - */ - public function process(CodeCoverage $coverage, string $target): void - { - if (substr($target, -1, 1) !== DIRECTORY_SEPARATOR) { - $target .= DIRECTORY_SEPARATOR; - } - - $this->target = $target; - $this->initTargetDirectory($target); - - $report = $coverage->getReport(); - - $this->project = new Project( - $coverage->getReport()->name(), - ); - - $this->setBuildInformation(); - $this->processTests($coverage->getTests()); - $this->processDirectory($report, $this->project); - - $this->saveDocument($this->project->asDom(), 'index'); - } - - private function setBuildInformation(): void - { - $buildNode = $this->project->buildInformation(); - $buildNode->setRuntimeInformation(new Runtime); - $buildNode->setBuildTime(new DateTimeImmutable); - $buildNode->setGeneratorVersions($this->phpUnitVersion, Version::id()); - } - - /** - * @throws PathExistsButIsNotDirectoryException - * @throws WriteOperationFailedException - */ - private function initTargetDirectory(string $directory): void - { - if (is_file($directory)) { - if (!is_dir($directory)) { - throw new PathExistsButIsNotDirectoryException($directory); - } - - if (!is_writable($directory)) { - throw new WriteOperationFailedException($directory); - } - } - - DirectoryUtil::createDirectory($directory); - } - - /** - * @throws XmlException - */ - private function processDirectory(DirectoryNode $directory, Node $context): void - { - $directoryName = $directory->name(); - - if ($this->project->projectSourceDirectory() === $directoryName) { - $directoryName = '/'; - } - - $directoryObject = $context->addDirectory($directoryName); - - $this->setTotals($directory, $directoryObject->totals()); - - foreach ($directory->directories() as $node) { - $this->processDirectory($node, $directoryObject); - } - - foreach ($directory->files() as $node) { - $this->processFile($node, $directoryObject); - } - } - - /** - * @throws XmlException - */ - private function processFile(FileNode $file, Directory $context): void - { - $fileObject = $context->addFile( - $file->name(), - $file->id() . '.xml', - ); - - $this->setTotals($file, $fileObject->totals()); - - $path = substr( - $file->pathAsString(), - strlen($this->project->projectSourceDirectory()), - ); - - $fileReport = new Report($path); - - $this->setTotals($file, $fileReport->totals()); - - foreach ($file->classesAndTraits() as $unit) { - $this->processUnit($unit, $fileReport); - } - - foreach ($file->functions() as $function) { - $this->processFunction($function, $fileReport); - } - - foreach ($file->lineCoverageData() as $line => $tests) { - if (!is_array($tests) || count($tests) === 0) { - continue; - } - - $coverage = $fileReport->lineCoverage((string) $line); - - foreach ($tests as $test) { - $coverage->addTest($test); - } - - $coverage->finalize(); - } - - $fileReport->source()->setSourceCode( - file_get_contents($file->pathAsString()), - ); - - $this->saveDocument($fileReport->asDom(), $file->id()); - } - - private function processUnit(array $unit, Report $report): void - { - if (isset($unit['className'])) { - $unitObject = $report->classObject($unit['className']); - } else { - $unitObject = $report->traitObject($unit['traitName']); - } - - $unitObject->setLines( - $unit['startLine'], - $unit['executableLines'], - $unit['executedLines'], - ); - - $unitObject->setCrap((float) $unit['crap']); - $unitObject->setNamespace($unit['namespace']); - - foreach ($unit['methods'] as $method) { - $methodObject = $unitObject->addMethod($method['methodName']); - $methodObject->setSignature($method['signature']); - $methodObject->setLines((string) $method['startLine'], (string) $method['endLine']); - $methodObject->setCrap($method['crap']); - $methodObject->setTotals( - (string) $method['executableLines'], - (string) $method['executedLines'], - (string) $method['coverage'], - ); - } - } - - private function processFunction(array $function, Report $report): void - { - $functionObject = $report->functionObject($function['functionName']); - - $functionObject->setSignature($function['signature']); - $functionObject->setLines((string) $function['startLine']); - $functionObject->setCrap($function['crap']); - $functionObject->setTotals((string) $function['executableLines'], (string) $function['executedLines'], (string) $function['coverage']); - } - - private function processTests(array $tests): void - { - $testsObject = $this->project->tests(); - - foreach ($tests as $test => $result) { - $testsObject->addTest($test, $result); - } - } - - private function setTotals(AbstractNode $node, Totals $totals): void - { - $loc = $node->linesOfCode(); - - $totals->setNumLines( - $loc['linesOfCode'], - $loc['commentLinesOfCode'], - $loc['nonCommentLinesOfCode'], - $node->numberOfExecutableLines(), - $node->numberOfExecutedLines(), - ); - - $totals->setNumClasses( - $node->numberOfClasses(), - $node->numberOfTestedClasses(), - ); - - $totals->setNumTraits( - $node->numberOfTraits(), - $node->numberOfTestedTraits(), - ); - - $totals->setNumMethods( - $node->numberOfMethods(), - $node->numberOfTestedMethods(), - ); - - $totals->setNumFunctions( - $node->numberOfFunctions(), - $node->numberOfTestedFunctions(), - ); - } - - private function targetDirectory(): string - { - return $this->target; - } - - /** - * @throws XmlException - */ - private function saveDocument(DOMDocument $document, string $name): void - { - $filename = sprintf('%s/%s.xml', $this->targetDirectory(), $name); - - $document->formatOutput = true; - $document->preserveWhiteSpace = false; - $this->initTargetDirectory(dirname($filename)); - - file_put_contents($filename, $this->documentAsString($document)); - } - - /** - * @throws XmlException - * - * @see https://bugs.php.net/bug.php?id=79191 - */ - private function documentAsString(DOMDocument $document): string - { - $xmlErrorHandling = libxml_use_internal_errors(true); - $xml = $document->saveXML(); - - if ($xml === false) { - $message = 'Unable to generate the XML'; - - foreach (libxml_get_errors() as $error) { - $message .= PHP_EOL . $error->message; - } - - throw new XmlException($message); - } - - libxml_clear_errors(); - libxml_use_internal_errors($xmlErrorHandling); - - return $xml; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Xml/File.php b/vendor/phpunit/php-code-coverage/src/Report/Xml/File.php deleted file mode 100644 index 69b2751..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Xml/File.php +++ /dev/null @@ -1,80 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Xml; - -use DOMDocument; -use DOMElement; - -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage - */ -class File -{ - private readonly DOMDocument $dom; - private readonly DOMElement $contextNode; - - public function __construct(DOMElement $context) - { - $this->dom = $context->ownerDocument; - $this->contextNode = $context; - } - - public function totals(): Totals - { - $totalsContainer = $this->contextNode->firstChild; - - if (!$totalsContainer) { - $totalsContainer = $this->contextNode->appendChild( - $this->dom->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - 'totals', - ), - ); - } - - return new Totals($totalsContainer); - } - - public function lineCoverage(string $line): Coverage - { - $coverage = $this->contextNode->getElementsByTagNameNS( - 'https://schema.phpunit.de/coverage/1.0', - 'coverage', - )->item(0); - - if (!$coverage) { - $coverage = $this->contextNode->appendChild( - $this->dom->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - 'coverage', - ), - ); - } - - $lineNode = $coverage->appendChild( - $this->dom->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - 'line', - ), - ); - - return new Coverage($lineNode, $line); - } - - protected function contextNode(): DOMElement - { - return $this->contextNode; - } - - protected function dom(): DOMDocument - { - return $this->dom; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Xml/Method.php b/vendor/phpunit/php-code-coverage/src/Report/Xml/Method.php deleted file mode 100644 index b1ab9ae..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Xml/Method.php +++ /dev/null @@ -1,58 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Xml; - -use DOMElement; - -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage - */ -final class Method -{ - private readonly DOMElement $contextNode; - - public function __construct(DOMElement $context, string $name) - { - $this->contextNode = $context; - - $this->setName($name); - } - - public function setSignature(string $signature): void - { - $this->contextNode->setAttribute('signature', $signature); - } - - public function setLines(string $start, ?string $end = null): void - { - $this->contextNode->setAttribute('start', $start); - - if ($end !== null) { - $this->contextNode->setAttribute('end', $end); - } - } - - public function setTotals(string $executable, string $executed, string $coverage): void - { - $this->contextNode->setAttribute('executable', $executable); - $this->contextNode->setAttribute('executed', $executed); - $this->contextNode->setAttribute('coverage', $coverage); - } - - public function setCrap(string $crap): void - { - $this->contextNode->setAttribute('crap', $crap); - } - - private function setName(string $name): void - { - $this->contextNode->setAttribute('name', $name); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Xml/Node.php b/vendor/phpunit/php-code-coverage/src/Report/Xml/Node.php deleted file mode 100644 index b2ba54b..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Xml/Node.php +++ /dev/null @@ -1,86 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Xml; - -use DOMDocument; -use DOMElement; - -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage - */ -abstract class Node -{ - private DOMDocument $dom; - private DOMElement $contextNode; - - public function __construct(DOMElement $context) - { - $this->setContextNode($context); - } - - public function dom(): DOMDocument - { - return $this->dom; - } - - public function totals(): Totals - { - $totalsContainer = $this->contextNode()->firstChild; - - if (!$totalsContainer) { - $totalsContainer = $this->contextNode()->appendChild( - $this->dom->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - 'totals', - ), - ); - } - - return new Totals($totalsContainer); - } - - public function addDirectory(string $name): Directory - { - $dirNode = $this->dom()->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - 'directory', - ); - - $dirNode->setAttribute('name', $name); - $this->contextNode()->appendChild($dirNode); - - return new Directory($dirNode); - } - - public function addFile(string $name, string $href): File - { - $fileNode = $this->dom()->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - 'file', - ); - - $fileNode->setAttribute('name', $name); - $fileNode->setAttribute('href', $href); - $this->contextNode()->appendChild($fileNode); - - return new File($fileNode); - } - - protected function setContextNode(DOMElement $context): void - { - $this->dom = $context->ownerDocument; - $this->contextNode = $context; - } - - protected function contextNode(): DOMElement - { - return $this->contextNode; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Xml/Project.php b/vendor/phpunit/php-code-coverage/src/Report/Xml/Project.php deleted file mode 100644 index b450beb..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Xml/Project.php +++ /dev/null @@ -1,90 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Xml; - -use DOMDocument; - -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage - */ -final class Project extends Node -{ - public function __construct(string $directory) - { - $this->init(); - $this->setProjectSourceDirectory($directory); - } - - public function projectSourceDirectory(): string - { - return $this->contextNode()->getAttribute('source'); - } - - public function buildInformation(): BuildInformation - { - $buildNode = $this->dom()->getElementsByTagNameNS( - 'https://schema.phpunit.de/coverage/1.0', - 'build', - )->item(0); - - if (!$buildNode) { - $buildNode = $this->dom()->documentElement->appendChild( - $this->dom()->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - 'build', - ), - ); - } - - return new BuildInformation($buildNode); - } - - public function tests(): Tests - { - $testsNode = $this->contextNode()->getElementsByTagNameNS( - 'https://schema.phpunit.de/coverage/1.0', - 'tests', - )->item(0); - - if (!$testsNode) { - $testsNode = $this->contextNode()->appendChild( - $this->dom()->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - 'tests', - ), - ); - } - - return new Tests($testsNode); - } - - public function asDom(): DOMDocument - { - return $this->dom(); - } - - private function init(): void - { - $dom = new DOMDocument; - $dom->loadXML(''); - - $this->setContextNode( - $dom->getElementsByTagNameNS( - 'https://schema.phpunit.de/coverage/1.0', - 'project', - )->item(0), - ); - } - - private function setProjectSourceDirectory(string $name): void - { - $this->contextNode()->setAttribute('source', $name); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Xml/Report.php b/vendor/phpunit/php-code-coverage/src/Report/Xml/Report.php deleted file mode 100644 index 09d1034..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Xml/Report.php +++ /dev/null @@ -1,99 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Xml; - -use function basename; -use function dirname; -use DOMDocument; - -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage - */ -final class Report extends File -{ - public function __construct(string $name) - { - $dom = new DOMDocument; - $dom->loadXML(''); - - $contextNode = $dom->getElementsByTagNameNS( - 'https://schema.phpunit.de/coverage/1.0', - 'file', - )->item(0); - - parent::__construct($contextNode); - - $this->setName($name); - } - - public function asDom(): DOMDocument - { - return $this->dom(); - } - - public function functionObject($name): Method - { - $node = $this->contextNode()->appendChild( - $this->dom()->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - 'function', - ), - ); - - return new Method($node, $name); - } - - public function classObject($name): Unit - { - return $this->unitObject('class', $name); - } - - public function traitObject($name): Unit - { - return $this->unitObject('trait', $name); - } - - public function source(): Source - { - $source = $this->contextNode()->getElementsByTagNameNS( - 'https://schema.phpunit.de/coverage/1.0', - 'source', - )->item(0); - - if (!$source) { - $source = $this->contextNode()->appendChild( - $this->dom()->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - 'source', - ), - ); - } - - return new Source($source); - } - - private function setName(string $name): void - { - $this->contextNode()->setAttribute('name', basename($name)); - $this->contextNode()->setAttribute('path', dirname($name)); - } - - private function unitObject(string $tagName, $name): Unit - { - $node = $this->contextNode()->appendChild( - $this->dom()->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - $tagName, - ), - ); - - return new Unit($node, $name); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Xml/Source.php b/vendor/phpunit/php-code-coverage/src/Report/Xml/Source.php deleted file mode 100644 index cd1fb90..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Xml/Source.php +++ /dev/null @@ -1,41 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Xml; - -use DOMElement; -use TheSeer\Tokenizer\NamespaceUri; -use TheSeer\Tokenizer\Tokenizer; -use TheSeer\Tokenizer\XMLSerializer; - -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage - */ -final class Source -{ - private readonly DOMElement $context; - - public function __construct(DOMElement $context) - { - $this->context = $context; - } - - public function setSourceCode(string $source): void - { - $context = $this->context; - - $tokens = (new Tokenizer)->parse($source); - $srcDom = (new XMLSerializer(new NamespaceUri($context->namespaceURI)))->toDom($tokens); - - $context->parentNode->replaceChild( - $context->ownerDocument->importNode($srcDom->documentElement, true), - $context, - ); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Xml/Tests.php b/vendor/phpunit/php-code-coverage/src/Report/Xml/Tests.php deleted file mode 100644 index 44d6010..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Xml/Tests.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Xml; - -use DOMElement; - -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage - * - * @psalm-import-type TestType from \SebastianBergmann\CodeCoverage\CodeCoverage - */ -final class Tests -{ - private readonly DOMElement $contextNode; - - public function __construct(DOMElement $context) - { - $this->contextNode = $context; - } - - /** - * @param TestType $result - */ - public function addTest(string $test, array $result): void - { - $node = $this->contextNode->appendChild( - $this->contextNode->ownerDocument->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - 'test', - ), - ); - - $node->setAttribute('name', $test); - $node->setAttribute('size', $result['size']); - $node->setAttribute('status', $result['status']); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Xml/Totals.php b/vendor/phpunit/php-code-coverage/src/Report/Xml/Totals.php deleted file mode 100644 index 239f6d4..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Xml/Totals.php +++ /dev/null @@ -1,123 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Xml; - -use function sprintf; -use DOMElement; -use DOMNode; -use SebastianBergmann\CodeCoverage\Util\Percentage; - -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage - */ -final class Totals -{ - private readonly DOMNode $container; - private readonly DOMElement $linesNode; - private readonly DOMElement $methodsNode; - private readonly DOMElement $functionsNode; - private readonly DOMElement $classesNode; - private readonly DOMElement $traitsNode; - - public function __construct(DOMElement $container) - { - $this->container = $container; - $dom = $container->ownerDocument; - - $this->linesNode = $dom->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - 'lines', - ); - - $this->methodsNode = $dom->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - 'methods', - ); - - $this->functionsNode = $dom->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - 'functions', - ); - - $this->classesNode = $dom->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - 'classes', - ); - - $this->traitsNode = $dom->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - 'traits', - ); - - $container->appendChild($this->linesNode); - $container->appendChild($this->methodsNode); - $container->appendChild($this->functionsNode); - $container->appendChild($this->classesNode); - $container->appendChild($this->traitsNode); - } - - public function container(): DOMNode - { - return $this->container; - } - - public function setNumLines(int $loc, int $cloc, int $ncloc, int $executable, int $executed): void - { - $this->linesNode->setAttribute('total', (string) $loc); - $this->linesNode->setAttribute('comments', (string) $cloc); - $this->linesNode->setAttribute('code', (string) $ncloc); - $this->linesNode->setAttribute('executable', (string) $executable); - $this->linesNode->setAttribute('executed', (string) $executed); - $this->linesNode->setAttribute( - 'percent', - $executable === 0 ? '0' : sprintf('%01.2F', Percentage::fromFractionAndTotal($executed, $executable)->asFloat()), - ); - } - - public function setNumClasses(int $count, int $tested): void - { - $this->classesNode->setAttribute('count', (string) $count); - $this->classesNode->setAttribute('tested', (string) $tested); - $this->classesNode->setAttribute( - 'percent', - $count === 0 ? '0' : sprintf('%01.2F', Percentage::fromFractionAndTotal($tested, $count)->asFloat()), - ); - } - - public function setNumTraits(int $count, int $tested): void - { - $this->traitsNode->setAttribute('count', (string) $count); - $this->traitsNode->setAttribute('tested', (string) $tested); - $this->traitsNode->setAttribute( - 'percent', - $count === 0 ? '0' : sprintf('%01.2F', Percentage::fromFractionAndTotal($tested, $count)->asFloat()), - ); - } - - public function setNumMethods(int $count, int $tested): void - { - $this->methodsNode->setAttribute('count', (string) $count); - $this->methodsNode->setAttribute('tested', (string) $tested); - $this->methodsNode->setAttribute( - 'percent', - $count === 0 ? '0' : sprintf('%01.2F', Percentage::fromFractionAndTotal($tested, $count)->asFloat()), - ); - } - - public function setNumFunctions(int $count, int $tested): void - { - $this->functionsNode->setAttribute('count', (string) $count); - $this->functionsNode->setAttribute('tested', (string) $tested); - $this->functionsNode->setAttribute( - 'percent', - $count === 0 ? '0' : sprintf('%01.2F', Percentage::fromFractionAndTotal($tested, $count)->asFloat()), - ); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Xml/Unit.php b/vendor/phpunit/php-code-coverage/src/Report/Xml/Unit.php deleted file mode 100644 index ea1a47f..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Xml/Unit.php +++ /dev/null @@ -1,75 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Xml; - -use DOMElement; - -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage - */ -final class Unit -{ - private readonly DOMElement $contextNode; - - public function __construct(DOMElement $context, string $name) - { - $this->contextNode = $context; - - $this->setName($name); - } - - public function setLines(int $start, int $executable, int $executed): void - { - $this->contextNode->setAttribute('start', (string) $start); - $this->contextNode->setAttribute('executable', (string) $executable); - $this->contextNode->setAttribute('executed', (string) $executed); - } - - public function setCrap(float $crap): void - { - $this->contextNode->setAttribute('crap', (string) $crap); - } - - public function setNamespace(string $namespace): void - { - $node = $this->contextNode->getElementsByTagNameNS( - 'https://schema.phpunit.de/coverage/1.0', - 'namespace', - )->item(0); - - if (!$node) { - $node = $this->contextNode->appendChild( - $this->contextNode->ownerDocument->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - 'namespace', - ), - ); - } - - $node->setAttribute('name', $namespace); - } - - public function addMethod(string $name): Method - { - $node = $this->contextNode->appendChild( - $this->contextNode->ownerDocument->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - 'method', - ), - ); - - return new Method($node, $name); - } - - private function setName(string $name): void - { - $this->contextNode->setAttribute('name', $name); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/StaticAnalysis/CacheWarmer.php b/vendor/phpunit/php-code-coverage/src/StaticAnalysis/CacheWarmer.php deleted file mode 100644 index 47cc756..0000000 --- a/vendor/phpunit/php-code-coverage/src/StaticAnalysis/CacheWarmer.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\StaticAnalysis; - -use SebastianBergmann\CodeCoverage\Filter; - -final class CacheWarmer -{ - public function warmCache(string $cacheDirectory, bool $useAnnotationsForIgnoringCode, bool $ignoreDeprecatedCode, Filter $filter): void - { - $analyser = new CachingFileAnalyser( - $cacheDirectory, - new ParsingFileAnalyser( - $useAnnotationsForIgnoringCode, - $ignoreDeprecatedCode, - ), - $useAnnotationsForIgnoringCode, - $ignoreDeprecatedCode, - ); - - foreach ($filter->files() as $file) { - $analyser->process($file); - } - } -} diff --git a/vendor/phpunit/php-code-coverage/src/StaticAnalysis/CachingFileAnalyser.php b/vendor/phpunit/php-code-coverage/src/StaticAnalysis/CachingFileAnalyser.php deleted file mode 100644 index 2ce4d60..0000000 --- a/vendor/phpunit/php-code-coverage/src/StaticAnalysis/CachingFileAnalyser.php +++ /dev/null @@ -1,182 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\StaticAnalysis; - -use function file_get_contents; -use function file_put_contents; -use function implode; -use function is_file; -use function md5; -use function serialize; -use function unserialize; -use SebastianBergmann\CodeCoverage\Util\Filesystem; -use SebastianBergmann\FileIterator\Facade as FileIteratorFacade; - -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage - * - * @psalm-import-type LinesOfCodeType from \SebastianBergmann\CodeCoverage\StaticAnalysis\FileAnalyser - */ -final class CachingFileAnalyser implements FileAnalyser -{ - private static ?string $cacheVersion = null; - private readonly string $directory; - private readonly FileAnalyser $analyser; - private readonly bool $useAnnotationsForIgnoringCode; - private readonly bool $ignoreDeprecatedCode; - private array $cache = []; - - public function __construct(string $directory, FileAnalyser $analyser, bool $useAnnotationsForIgnoringCode, bool $ignoreDeprecatedCode) - { - Filesystem::createDirectory($directory); - - $this->analyser = $analyser; - $this->directory = $directory; - $this->useAnnotationsForIgnoringCode = $useAnnotationsForIgnoringCode; - $this->ignoreDeprecatedCode = $ignoreDeprecatedCode; - } - - public function classesIn(string $filename): array - { - if (!isset($this->cache[$filename])) { - $this->process($filename); - } - - return $this->cache[$filename]['classesIn']; - } - - public function traitsIn(string $filename): array - { - if (!isset($this->cache[$filename])) { - $this->process($filename); - } - - return $this->cache[$filename]['traitsIn']; - } - - public function functionsIn(string $filename): array - { - if (!isset($this->cache[$filename])) { - $this->process($filename); - } - - return $this->cache[$filename]['functionsIn']; - } - - /** - * @psalm-return LinesOfCodeType - */ - public function linesOfCodeFor(string $filename): array - { - if (!isset($this->cache[$filename])) { - $this->process($filename); - } - - return $this->cache[$filename]['linesOfCodeFor']; - } - - public function executableLinesIn(string $filename): array - { - if (!isset($this->cache[$filename])) { - $this->process($filename); - } - - return $this->cache[$filename]['executableLinesIn']; - } - - public function ignoredLinesFor(string $filename): array - { - if (!isset($this->cache[$filename])) { - $this->process($filename); - } - - return $this->cache[$filename]['ignoredLinesFor']; - } - - public function process(string $filename): void - { - $cache = $this->read($filename); - - if ($cache !== false) { - $this->cache[$filename] = $cache; - - return; - } - - $this->cache[$filename] = [ - 'classesIn' => $this->analyser->classesIn($filename), - 'traitsIn' => $this->analyser->traitsIn($filename), - 'functionsIn' => $this->analyser->functionsIn($filename), - 'linesOfCodeFor' => $this->analyser->linesOfCodeFor($filename), - 'ignoredLinesFor' => $this->analyser->ignoredLinesFor($filename), - 'executableLinesIn' => $this->analyser->executableLinesIn($filename), - ]; - - $this->write($filename, $this->cache[$filename]); - } - - private function read(string $filename): array|false - { - $cacheFile = $this->cacheFile($filename); - - if (!is_file($cacheFile)) { - return false; - } - - return unserialize( - file_get_contents($cacheFile), - ['allowed_classes' => false], - ); - } - - private function write(string $filename, array $data): void - { - file_put_contents( - $this->cacheFile($filename), - serialize($data), - ); - } - - private function cacheFile(string $filename): string - { - $cacheKey = md5( - implode( - "\0", - [ - $filename, - file_get_contents($filename), - self::cacheVersion(), - $this->useAnnotationsForIgnoringCode, - $this->ignoreDeprecatedCode, - ], - ), - ); - - return $this->directory . DIRECTORY_SEPARATOR . $cacheKey; - } - - private static function cacheVersion(): string - { - if (self::$cacheVersion !== null) { - return self::$cacheVersion; - } - - $buffer = []; - - foreach ((new FileIteratorFacade)->getFilesAsArray(__DIR__, '.php') as $file) { - $buffer[] = $file; - $buffer[] = file_get_contents($file); - } - - self::$cacheVersion = md5(implode("\0", $buffer)); - - return self::$cacheVersion; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/StaticAnalysis/CodeUnitFindingVisitor.php b/vendor/phpunit/php-code-coverage/src/StaticAnalysis/CodeUnitFindingVisitor.php deleted file mode 100644 index 5530221..0000000 --- a/vendor/phpunit/php-code-coverage/src/StaticAnalysis/CodeUnitFindingVisitor.php +++ /dev/null @@ -1,360 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\StaticAnalysis; - -use function assert; -use function implode; -use function rtrim; -use function trim; -use PhpParser\Node; -use PhpParser\Node\ComplexType; -use PhpParser\Node\Identifier; -use PhpParser\Node\IntersectionType; -use PhpParser\Node\Name; -use PhpParser\Node\NullableType; -use PhpParser\Node\Stmt\Class_; -use PhpParser\Node\Stmt\ClassMethod; -use PhpParser\Node\Stmt\Enum_; -use PhpParser\Node\Stmt\Function_; -use PhpParser\Node\Stmt\Interface_; -use PhpParser\Node\Stmt\Trait_; -use PhpParser\Node\UnionType; -use PhpParser\NodeTraverser; -use PhpParser\NodeVisitorAbstract; -use SebastianBergmann\Complexity\CyclomaticComplexityCalculatingVisitor; - -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage - * - * @psalm-type CodeUnitFunctionType = array{ - * name: string, - * namespacedName: string, - * namespace: string, - * signature: string, - * startLine: int, - * endLine: int, - * ccn: int - * } - * @psalm-type CodeUnitMethodType = array{ - * methodName: string, - * signature: string, - * visibility: string, - * startLine: int, - * endLine: int, - * ccn: int - * } - * @psalm-type CodeUnitClassType = array{ - * name: string, - * namespacedName: string, - * namespace: string, - * startLine: int, - * endLine: int, - * methods: array - * } - * @psalm-type CodeUnitTraitType = array{ - * name: string, - * namespacedName: string, - * namespace: string, - * startLine: int, - * endLine: int, - * methods: array - * } - */ -final class CodeUnitFindingVisitor extends NodeVisitorAbstract -{ - /** - * @psalm-var array - */ - private array $classes = []; - - /** - * @psalm-var array - */ - private array $traits = []; - - /** - * @psalm-var array - */ - private array $functions = []; - - public function enterNode(Node $node): void - { - if ($node instanceof Class_) { - if ($node->isAnonymous()) { - return; - } - - $this->processClass($node); - } - - if ($node instanceof Trait_) { - $this->processTrait($node); - } - - if (!$node instanceof ClassMethod && !$node instanceof Function_) { - return; - } - - if ($node instanceof ClassMethod) { - $parentNode = $node->getAttribute('parent'); - - if ($parentNode instanceof Class_ && $parentNode->isAnonymous()) { - return; - } - - $this->processMethod($node); - - return; - } - - $this->processFunction($node); - } - - /** - * @psalm-return array - */ - public function classes(): array - { - return $this->classes; - } - - /** - * @psalm-return array - */ - public function traits(): array - { - return $this->traits; - } - - /** - * @psalm-return array - */ - public function functions(): array - { - return $this->functions; - } - - private function cyclomaticComplexity(ClassMethod|Function_ $node): int - { - $nodes = $node->getStmts(); - - if ($nodes === null) { - return 0; - } - - $traverser = new NodeTraverser; - - $cyclomaticComplexityCalculatingVisitor = new CyclomaticComplexityCalculatingVisitor; - - $traverser->addVisitor($cyclomaticComplexityCalculatingVisitor); - - /* @noinspection UnusedFunctionResultInspection */ - $traverser->traverse($nodes); - - return $cyclomaticComplexityCalculatingVisitor->cyclomaticComplexity(); - } - - private function signature(ClassMethod|Function_ $node): string - { - $signature = ($node->returnsByRef() ? '&' : '') . $node->name->toString() . '('; - $parameters = []; - - foreach ($node->getParams() as $parameter) { - assert(isset($parameter->var->name)); - - $parameterAsString = ''; - - if ($parameter->type !== null) { - $parameterAsString = $this->type($parameter->type) . ' '; - } - - $parameterAsString .= '$' . $parameter->var->name; - - /* @todo Handle default values */ - - $parameters[] = $parameterAsString; - } - - $signature .= implode(', ', $parameters) . ')'; - - $returnType = $node->getReturnType(); - - if ($returnType !== null) { - $signature .= ': ' . $this->type($returnType); - } - - return $signature; - } - - private function type(ComplexType|Identifier|Name $type): string - { - if ($type instanceof NullableType) { - return '?' . $type->type; - } - - if ($type instanceof UnionType) { - return $this->unionTypeAsString($type); - } - - if ($type instanceof IntersectionType) { - return $this->intersectionTypeAsString($type); - } - - return $type->toString(); - } - - private function visibility(ClassMethod $node): string - { - if ($node->isPrivate()) { - return 'private'; - } - - if ($node->isProtected()) { - return 'protected'; - } - - return 'public'; - } - - private function processClass(Class_ $node): void - { - $name = $node->name->toString(); - $namespacedName = $node->namespacedName->toString(); - - $this->classes[$namespacedName] = [ - 'name' => $name, - 'namespacedName' => $namespacedName, - 'namespace' => $this->namespace($namespacedName, $name), - 'startLine' => $node->getStartLine(), - 'endLine' => $node->getEndLine(), - 'methods' => [], - ]; - } - - private function processTrait(Trait_ $node): void - { - $name = $node->name->toString(); - $namespacedName = $node->namespacedName->toString(); - - $this->traits[$namespacedName] = [ - 'name' => $name, - 'namespacedName' => $namespacedName, - 'namespace' => $this->namespace($namespacedName, $name), - 'startLine' => $node->getStartLine(), - 'endLine' => $node->getEndLine(), - 'methods' => [], - ]; - } - - private function processMethod(ClassMethod $node): void - { - $parentNode = $node->getAttribute('parent'); - - if ($parentNode instanceof Interface_) { - return; - } - - assert($parentNode instanceof Class_ || $parentNode instanceof Trait_ || $parentNode instanceof Enum_); - assert(isset($parentNode->name)); - assert(isset($parentNode->namespacedName)); - assert($parentNode->namespacedName instanceof Name); - - $parentName = $parentNode->name->toString(); - $parentNamespacedName = $parentNode->namespacedName->toString(); - - if ($parentNode instanceof Class_) { - $storage = &$this->classes; - } else { - $storage = &$this->traits; - } - - if (!isset($storage[$parentNamespacedName])) { - $storage[$parentNamespacedName] = [ - 'name' => $parentName, - 'namespacedName' => $parentNamespacedName, - 'namespace' => $this->namespace($parentNamespacedName, $parentName), - 'startLine' => $parentNode->getStartLine(), - 'endLine' => $parentNode->getEndLine(), - 'methods' => [], - ]; - } - - $storage[$parentNamespacedName]['methods'][$node->name->toString()] = [ - 'methodName' => $node->name->toString(), - 'signature' => $this->signature($node), - 'visibility' => $this->visibility($node), - 'startLine' => $node->getStartLine(), - 'endLine' => $node->getEndLine(), - 'ccn' => $this->cyclomaticComplexity($node), - ]; - } - - private function processFunction(Function_ $node): void - { - assert(isset($node->name)); - assert(isset($node->namespacedName)); - assert($node->namespacedName instanceof Name); - - $name = $node->name->toString(); - $namespacedName = $node->namespacedName->toString(); - - $this->functions[$namespacedName] = [ - 'name' => $name, - 'namespacedName' => $namespacedName, - 'namespace' => $this->namespace($namespacedName, $name), - 'signature' => $this->signature($node), - 'startLine' => $node->getStartLine(), - 'endLine' => $node->getEndLine(), - 'ccn' => $this->cyclomaticComplexity($node), - ]; - } - - private function namespace(string $namespacedName, string $name): string - { - return trim(rtrim($namespacedName, $name), '\\'); - } - - private function unionTypeAsString(UnionType $node): string - { - $types = []; - - foreach ($node->types as $type) { - if ($type instanceof IntersectionType) { - $types[] = '(' . $this->intersectionTypeAsString($type) . ')'; - - continue; - } - - $types[] = $this->typeAsString($type); - } - - return implode('|', $types); - } - - private function intersectionTypeAsString(IntersectionType $node): string - { - $types = []; - - foreach ($node->types as $type) { - $types[] = $this->typeAsString($type); - } - - return implode('&', $types); - } - - private function typeAsString(Identifier|Name $node): string - { - if ($node instanceof Name) { - return $node->toCodeString(); - } - - return $node->toString(); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/StaticAnalysis/ExecutableLinesFindingVisitor.php b/vendor/phpunit/php-code-coverage/src/StaticAnalysis/ExecutableLinesFindingVisitor.php deleted file mode 100644 index a15894d..0000000 --- a/vendor/phpunit/php-code-coverage/src/StaticAnalysis/ExecutableLinesFindingVisitor.php +++ /dev/null @@ -1,413 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\StaticAnalysis; - -use function array_diff_key; -use function assert; -use function count; -use function current; -use function end; -use function explode; -use function max; -use function preg_match; -use function preg_quote; -use function range; -use function reset; -use function sprintf; -use PhpParser\Node; -use PhpParser\NodeVisitorAbstract; - -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage - * - * @psalm-import-type LinesType from \SebastianBergmann\CodeCoverage\StaticAnalysis\FileAnalyser - */ -final class ExecutableLinesFindingVisitor extends NodeVisitorAbstract -{ - private int $nextBranch = 0; - private readonly string $source; - - /** - * @psalm-var LinesType - */ - private array $executableLinesGroupedByBranch = []; - - /** - * @psalm-var array - */ - private array $unsets = []; - - /** - * @psalm-var array - */ - private array $commentsToCheckForUnset = []; - - public function __construct(string $source) - { - $this->source = $source; - } - - public function enterNode(Node $node): void - { - foreach ($node->getComments() as $comment) { - $commentLine = $comment->getStartLine(); - - if (!isset($this->executableLinesGroupedByBranch[$commentLine])) { - continue; - } - - foreach (explode("\n", $comment->getText()) as $text) { - $this->commentsToCheckForUnset[$commentLine] = $text; - $commentLine++; - } - } - - if ($node instanceof Node\Scalar\String_ || - $node instanceof Node\Scalar\EncapsedStringPart) { - $startLine = $node->getStartLine() + 1; - $endLine = $node->getEndLine() - 1; - - if ($startLine <= $endLine) { - foreach (range($startLine, $endLine) as $line) { - unset($this->executableLinesGroupedByBranch[$line]); - } - } - - return; - } - - if ($node instanceof Node\Stmt\Interface_) { - foreach (range($node->getStartLine(), $node->getEndLine()) as $line) { - $this->unsets[$line] = true; - } - - return; - } - - if ($node instanceof Node\Stmt\Declare_ || - $node instanceof Node\Stmt\DeclareDeclare || - $node instanceof Node\Stmt\Else_ || - $node instanceof Node\Stmt\EnumCase || - $node instanceof Node\Stmt\Finally_ || - $node instanceof Node\Stmt\GroupUse || - $node instanceof Node\Stmt\Label || - $node instanceof Node\Stmt\Namespace_ || - $node instanceof Node\Stmt\Nop || - $node instanceof Node\Stmt\Switch_ || - $node instanceof Node\Stmt\TryCatch || - $node instanceof Node\Stmt\Use_ || - $node instanceof Node\Stmt\UseUse || - $node instanceof Node\Expr\ConstFetch || - $node instanceof Node\Expr\Variable || - $node instanceof Node\Expr\Throw_ || - $node instanceof Node\ComplexType || - $node instanceof Node\Const_ || - $node instanceof Node\Identifier || - $node instanceof Node\Name || - $node instanceof Node\Param || - $node instanceof Node\Scalar) { - return; - } - - if ($node instanceof Node\Expr\Match_) { - foreach ($node->arms as $arm) { - $this->setLineBranch( - $arm->body->getStartLine(), - $arm->body->getEndLine(), - ++$this->nextBranch, - ); - } - - return; - } - - /* - * nikic/php-parser ^4.18 represents throw statements - * as Stmt\Throw_ objects - */ - if ($node instanceof Node\Stmt\Throw_) { - $this->setLineBranch($node->expr->getEndLine(), $node->expr->getEndLine(), ++$this->nextBranch); - - return; - } - - /* - * nikic/php-parser ^5 represents throw statements - * as Stmt\Expression objects that contain an - * Expr\Throw_ object - */ - if ($node instanceof Node\Stmt\Expression && $node->expr instanceof Node\Expr\Throw_) { - $this->setLineBranch($node->expr->expr->getEndLine(), $node->expr->expr->getEndLine(), ++$this->nextBranch); - - return; - } - - if ($node instanceof Node\Stmt\Enum_ || - $node instanceof Node\Stmt\Function_ || - $node instanceof Node\Stmt\Class_ || - $node instanceof Node\Stmt\ClassMethod || - $node instanceof Node\Expr\Closure || - $node instanceof Node\Stmt\Trait_) { - if ($node instanceof Node\Stmt\Function_ || $node instanceof Node\Stmt\ClassMethod) { - $unsets = []; - - foreach ($node->getParams() as $param) { - foreach (range($param->getStartLine(), $param->getEndLine()) as $line) { - $unsets[$line] = true; - } - } - - unset($unsets[$node->getEndLine()]); - - $this->unsets += $unsets; - } - - $isConcreteClassLike = $node instanceof Node\Stmt\Enum_ || $node instanceof Node\Stmt\Class_ || $node instanceof Node\Stmt\Trait_; - - if (null !== $node->stmts) { - foreach ($node->stmts as $stmt) { - if ($stmt instanceof Node\Stmt\Nop) { - continue; - } - - foreach (range($stmt->getStartLine(), $stmt->getEndLine()) as $line) { - unset($this->executableLinesGroupedByBranch[$line]); - - if ( - $isConcreteClassLike && - !$stmt instanceof Node\Stmt\ClassMethod - ) { - $this->unsets[$line] = true; - } - } - } - } - - if ($isConcreteClassLike) { - return; - } - - $hasEmptyBody = [] === $node->stmts || - null === $node->stmts || - ( - 1 === count($node->stmts) && - $node->stmts[0] instanceof Node\Stmt\Nop - ); - - if ($hasEmptyBody) { - if ($node->getEndLine() === $node->getStartLine() && isset($this->executableLinesGroupedByBranch[$node->getStartLine()])) { - return; - } - - $this->setLineBranch($node->getEndLine(), $node->getEndLine(), ++$this->nextBranch); - - return; - } - - return; - } - - if ($node instanceof Node\Expr\ArrowFunction) { - $startLine = max( - $node->getStartLine() + 1, - $node->expr->getStartLine(), - ); - - $endLine = $node->expr->getEndLine(); - - if ($endLine < $startLine) { - return; - } - - $this->setLineBranch($startLine, $endLine, ++$this->nextBranch); - - return; - } - - if ($node instanceof Node\Expr\Ternary) { - if (null !== $node->if && - $node->getStartLine() !== $node->if->getEndLine()) { - $this->setLineBranch($node->if->getStartLine(), $node->if->getEndLine(), ++$this->nextBranch); - } - - if ($node->getStartLine() !== $node->else->getEndLine()) { - $this->setLineBranch($node->else->getStartLine(), $node->else->getEndLine(), ++$this->nextBranch); - } - - return; - } - - if ($node instanceof Node\Expr\BinaryOp\Coalesce) { - if ($node->getStartLine() !== $node->getEndLine()) { - $this->setLineBranch($node->getEndLine(), $node->getEndLine(), ++$this->nextBranch); - } - - return; - } - - if ($node instanceof Node\Stmt\If_ || - $node instanceof Node\Stmt\ElseIf_ || - $node instanceof Node\Stmt\Case_) { - if (null === $node->cond) { - return; - } - - $this->setLineBranch( - $node->cond->getStartLine(), - $node->cond->getStartLine(), - ++$this->nextBranch, - ); - - return; - } - - if ($node instanceof Node\Stmt\For_) { - $startLine = null; - $endLine = null; - - if ([] !== $node->init) { - $startLine = $node->init[0]->getStartLine(); - - end($node->init); - - $endLine = current($node->init)->getEndLine(); - - reset($node->init); - } - - if ([] !== $node->cond) { - if (null === $startLine) { - $startLine = $node->cond[0]->getStartLine(); - } - - end($node->cond); - - $endLine = current($node->cond)->getEndLine(); - - reset($node->cond); - } - - if ([] !== $node->loop) { - if (null === $startLine) { - $startLine = $node->loop[0]->getStartLine(); - } - - end($node->loop); - - $endLine = current($node->loop)->getEndLine(); - - reset($node->loop); - } - - if (null === $startLine || null === $endLine) { - return; - } - - $this->setLineBranch( - $startLine, - $endLine, - ++$this->nextBranch, - ); - - return; - } - - if ($node instanceof Node\Stmt\Foreach_) { - $this->setLineBranch( - $node->expr->getStartLine(), - $node->valueVar->getEndLine(), - ++$this->nextBranch, - ); - - return; - } - - if ($node instanceof Node\Stmt\While_ || - $node instanceof Node\Stmt\Do_) { - $this->setLineBranch( - $node->cond->getStartLine(), - $node->cond->getEndLine(), - ++$this->nextBranch, - ); - - return; - } - - if ($node instanceof Node\Stmt\Catch_) { - assert([] !== $node->types); - $startLine = $node->types[0]->getStartLine(); - end($node->types); - $endLine = current($node->types)->getEndLine(); - - $this->setLineBranch( - $startLine, - $endLine, - ++$this->nextBranch, - ); - - return; - } - - if ($node instanceof Node\Expr\CallLike) { - if (isset($this->executableLinesGroupedByBranch[$node->getStartLine()])) { - $branch = $this->executableLinesGroupedByBranch[$node->getStartLine()]; - } else { - $branch = ++$this->nextBranch; - } - - $this->setLineBranch($node->getStartLine(), $node->getEndLine(), $branch); - - return; - } - - if (isset($this->executableLinesGroupedByBranch[$node->getStartLine()])) { - return; - } - - $this->setLineBranch($node->getStartLine(), $node->getEndLine(), ++$this->nextBranch); - } - - public function afterTraverse(array $nodes): void - { - $lines = explode("\n", $this->source); - - foreach ($lines as $lineNumber => $line) { - $lineNumber++; - - if (1 === preg_match('/^\s*$/', $line) || - ( - isset($this->commentsToCheckForUnset[$lineNumber]) && - 1 === preg_match(sprintf('/^\s*%s\s*$/', preg_quote($this->commentsToCheckForUnset[$lineNumber], '/')), $line) - )) { - unset($this->executableLinesGroupedByBranch[$lineNumber]); - } - } - - $this->executableLinesGroupedByBranch = array_diff_key( - $this->executableLinesGroupedByBranch, - $this->unsets, - ); - } - - /** - * @psalm-return LinesType - */ - public function executableLinesGroupedByBranch(): array - { - return $this->executableLinesGroupedByBranch; - } - - private function setLineBranch(int $start, int $end, int $branch): void - { - foreach (range($start, $end) as $line) { - $this->executableLinesGroupedByBranch[$line] = $branch; - } - } -} diff --git a/vendor/phpunit/php-code-coverage/src/StaticAnalysis/FileAnalyser.php b/vendor/phpunit/php-code-coverage/src/StaticAnalysis/FileAnalyser.php deleted file mode 100644 index f260341..0000000 --- a/vendor/phpunit/php-code-coverage/src/StaticAnalysis/FileAnalyser.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\StaticAnalysis; - -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage - * - * @psalm-import-type CodeUnitFunctionType from \SebastianBergmann\CodeCoverage\StaticAnalysis\CodeUnitFindingVisitor - * @psalm-import-type CodeUnitMethodType from \SebastianBergmann\CodeCoverage\StaticAnalysis\CodeUnitFindingVisitor - * @psalm-import-type CodeUnitClassType from \SebastianBergmann\CodeCoverage\StaticAnalysis\CodeUnitFindingVisitor - * @psalm-import-type CodeUnitTraitType from \SebastianBergmann\CodeCoverage\StaticAnalysis\CodeUnitFindingVisitor - * @psalm-import-type LinesOfCodeType from \SebastianBergmann\CodeCoverage\StaticAnalysis\FileAnalyser - * @psalm-import-type LinesType from \SebastianBergmann\CodeCoverage\StaticAnalysis\FileAnalyser - * - * @psalm-type LinesOfCodeType = array{ - * linesOfCode: int, - * commentLinesOfCode: int, - * nonCommentLinesOfCode: int - * } - * @psalm-type LinesType = array - */ -interface FileAnalyser -{ - /** - * @psalm-return array - */ - public function classesIn(string $filename): array; - - /** - * @psalm-return array - */ - public function traitsIn(string $filename): array; - - /** - * @psalm-return array - */ - public function functionsIn(string $filename): array; - - /** - * @psalm-return LinesOfCodeType - */ - public function linesOfCodeFor(string $filename): array; - - /** - * @psalm-return LinesType - */ - public function executableLinesIn(string $filename): array; - - /** - * @psalm-return LinesType - */ - public function ignoredLinesFor(string $filename): array; -} diff --git a/vendor/phpunit/php-code-coverage/src/StaticAnalysis/IgnoredLinesFindingVisitor.php b/vendor/phpunit/php-code-coverage/src/StaticAnalysis/IgnoredLinesFindingVisitor.php deleted file mode 100644 index a3be120..0000000 --- a/vendor/phpunit/php-code-coverage/src/StaticAnalysis/IgnoredLinesFindingVisitor.php +++ /dev/null @@ -1,121 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\StaticAnalysis; - -use function assert; -use function str_contains; -use PhpParser\Node; -use PhpParser\Node\Attribute; -use PhpParser\Node\Stmt\Class_; -use PhpParser\Node\Stmt\ClassMethod; -use PhpParser\Node\Stmt\Enum_; -use PhpParser\Node\Stmt\Function_; -use PhpParser\Node\Stmt\Interface_; -use PhpParser\Node\Stmt\Trait_; -use PhpParser\NodeVisitorAbstract; - -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage - */ -final class IgnoredLinesFindingVisitor extends NodeVisitorAbstract -{ - /** - * @psalm-var array - */ - private array $ignoredLines = []; - private readonly bool $useAnnotationsForIgnoringCode; - private readonly bool $ignoreDeprecated; - - public function __construct(bool $useAnnotationsForIgnoringCode, bool $ignoreDeprecated) - { - $this->useAnnotationsForIgnoringCode = $useAnnotationsForIgnoringCode; - $this->ignoreDeprecated = $ignoreDeprecated; - } - - public function enterNode(Node $node): void - { - if (!$node instanceof Class_ && - !$node instanceof Trait_ && - !$node instanceof Interface_ && - !$node instanceof Enum_ && - !$node instanceof ClassMethod && - !$node instanceof Function_ && - !$node instanceof Attribute) { - return; - } - - if ($node instanceof Class_ && $node->isAnonymous()) { - return; - } - - if ($node instanceof Class_ || - $node instanceof Trait_ || - $node instanceof Interface_ || - $node instanceof Attribute) { - $this->ignoredLines[] = $node->getStartLine(); - - assert($node->name !== null); - - // Workaround for https://github.com/nikic/PHP-Parser/issues/886 - $this->ignoredLines[] = $node->name->getStartLine(); - } - - if (!$this->useAnnotationsForIgnoringCode) { - return; - } - - if ($node instanceof Interface_) { - return; - } - - if ($node instanceof Attribute && - $node->name->toString() === 'PHPUnit\Framework\Attributes\CodeCoverageIgnore') { - $attributeGroup = $node->getAttribute('parent'); - $attributedNode = $attributeGroup->getAttribute('parent'); - - for ($line = $attributedNode->getStartLine(); $line <= $attributedNode->getEndLine(); $line++) { - $this->ignoredLines[] = $line; - } - - return; - } - - $this->processDocComment($node); - } - - /** - * @psalm-return array - */ - public function ignoredLines(): array - { - return $this->ignoredLines; - } - - private function processDocComment(Node $node): void - { - $docComment = $node->getDocComment(); - - if ($docComment === null) { - return; - } - - if (str_contains($docComment->getText(), '@codeCoverageIgnore')) { - for ($line = $node->getStartLine(); $line <= $node->getEndLine(); $line++) { - $this->ignoredLines[] = $line; - } - } - - if ($this->ignoreDeprecated && str_contains($docComment->getText(), '@deprecated')) { - for ($line = $node->getStartLine(); $line <= $node->getEndLine(); $line++) { - $this->ignoredLines[] = $line; - } - } - } -} diff --git a/vendor/phpunit/php-code-coverage/src/StaticAnalysis/ParsingFileAnalyser.php b/vendor/phpunit/php-code-coverage/src/StaticAnalysis/ParsingFileAnalyser.php deleted file mode 100644 index ae2619f..0000000 --- a/vendor/phpunit/php-code-coverage/src/StaticAnalysis/ParsingFileAnalyser.php +++ /dev/null @@ -1,247 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\StaticAnalysis; - -use function array_merge; -use function array_unique; -use function assert; -use function file_get_contents; -use function is_array; -use function max; -use function range; -use function sort; -use function sprintf; -use function substr_count; -use function token_get_all; -use function trim; -use PhpParser\Error; -use PhpParser\NodeTraverser; -use PhpParser\NodeVisitor\NameResolver; -use PhpParser\NodeVisitor\ParentConnectingVisitor; -use PhpParser\ParserFactory; -use SebastianBergmann\CodeCoverage\ParserException; -use SebastianBergmann\LinesOfCode\LineCountingVisitor; - -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage - * - * @psalm-import-type CodeUnitFunctionType from \SebastianBergmann\CodeCoverage\StaticAnalysis\CodeUnitFindingVisitor - * @psalm-import-type CodeUnitMethodType from \SebastianBergmann\CodeCoverage\StaticAnalysis\CodeUnitFindingVisitor - * @psalm-import-type CodeUnitClassType from \SebastianBergmann\CodeCoverage\StaticAnalysis\CodeUnitFindingVisitor - * @psalm-import-type CodeUnitTraitType from \SebastianBergmann\CodeCoverage\StaticAnalysis\CodeUnitFindingVisitor - * @psalm-import-type LinesOfCodeType from \SebastianBergmann\CodeCoverage\StaticAnalysis\FileAnalyser - * @psalm-import-type LinesType from \SebastianBergmann\CodeCoverage\StaticAnalysis\FileAnalyser - */ -final class ParsingFileAnalyser implements FileAnalyser -{ - /** - * @psalm-var array> - */ - private array $classes = []; - - /** - * @psalm-var array> - */ - private array $traits = []; - - /** - * @psalm-var array> - */ - private array $functions = []; - - /** - * @var array - */ - private array $linesOfCode = []; - - /** - * @var array - */ - private array $ignoredLines = []; - - /** - * @var array - */ - private array $executableLines = []; - private readonly bool $useAnnotationsForIgnoringCode; - private readonly bool $ignoreDeprecatedCode; - - public function __construct(bool $useAnnotationsForIgnoringCode, bool $ignoreDeprecatedCode) - { - $this->useAnnotationsForIgnoringCode = $useAnnotationsForIgnoringCode; - $this->ignoreDeprecatedCode = $ignoreDeprecatedCode; - } - - public function classesIn(string $filename): array - { - $this->analyse($filename); - - return $this->classes[$filename]; - } - - public function traitsIn(string $filename): array - { - $this->analyse($filename); - - return $this->traits[$filename]; - } - - public function functionsIn(string $filename): array - { - $this->analyse($filename); - - return $this->functions[$filename]; - } - - public function linesOfCodeFor(string $filename): array - { - $this->analyse($filename); - - return $this->linesOfCode[$filename]; - } - - public function executableLinesIn(string $filename): array - { - $this->analyse($filename); - - return $this->executableLines[$filename]; - } - - public function ignoredLinesFor(string $filename): array - { - $this->analyse($filename); - - return $this->ignoredLines[$filename]; - } - - /** - * @throws ParserException - */ - private function analyse(string $filename): void - { - if (isset($this->classes[$filename])) { - return; - } - - $source = file_get_contents($filename); - $linesOfCode = max(substr_count($source, "\n") + 1, substr_count($source, "\r") + 1); - - if ($linesOfCode === 0 && !empty($source)) { - $linesOfCode = 1; - } - - assert($linesOfCode > 0); - - $parser = (new ParserFactory)->createForHostVersion(); - - try { - $nodes = $parser->parse($source); - - assert($nodes !== null); - - $traverser = new NodeTraverser; - $codeUnitFindingVisitor = new CodeUnitFindingVisitor; - $lineCountingVisitor = new LineCountingVisitor($linesOfCode); - $ignoredLinesFindingVisitor = new IgnoredLinesFindingVisitor($this->useAnnotationsForIgnoringCode, $this->ignoreDeprecatedCode); - $executableLinesFindingVisitor = new ExecutableLinesFindingVisitor($source); - - $traverser->addVisitor(new NameResolver); - $traverser->addVisitor(new ParentConnectingVisitor); - $traverser->addVisitor($codeUnitFindingVisitor); - $traverser->addVisitor($lineCountingVisitor); - $traverser->addVisitor($ignoredLinesFindingVisitor); - $traverser->addVisitor($executableLinesFindingVisitor); - - /* @noinspection UnusedFunctionResultInspection */ - $traverser->traverse($nodes); - // @codeCoverageIgnoreStart - } catch (Error $error) { - throw new ParserException( - sprintf( - 'Cannot parse %s: %s', - $filename, - $error->getMessage(), - ), - $error->getCode(), - $error, - ); - } - // @codeCoverageIgnoreEnd - - $this->classes[$filename] = $codeUnitFindingVisitor->classes(); - $this->traits[$filename] = $codeUnitFindingVisitor->traits(); - $this->functions[$filename] = $codeUnitFindingVisitor->functions(); - $this->executableLines[$filename] = $executableLinesFindingVisitor->executableLinesGroupedByBranch(); - $this->ignoredLines[$filename] = []; - - $this->findLinesIgnoredByLineBasedAnnotations($filename, $source, $this->useAnnotationsForIgnoringCode); - - $this->ignoredLines[$filename] = array_unique( - array_merge( - $this->ignoredLines[$filename], - $ignoredLinesFindingVisitor->ignoredLines(), - ), - ); - - sort($this->ignoredLines[$filename]); - - $result = $lineCountingVisitor->result(); - - $this->linesOfCode[$filename] = [ - 'linesOfCode' => $result->linesOfCode(), - 'commentLinesOfCode' => $result->commentLinesOfCode(), - 'nonCommentLinesOfCode' => $result->nonCommentLinesOfCode(), - ]; - } - - private function findLinesIgnoredByLineBasedAnnotations(string $filename, string $source, bool $useAnnotationsForIgnoringCode): void - { - if (!$useAnnotationsForIgnoringCode) { - return; - } - - $start = false; - - foreach (token_get_all($source) as $token) { - if (!is_array($token) || - !(T_COMMENT === $token[0] || T_DOC_COMMENT === $token[0])) { - continue; - } - - $comment = trim($token[1]); - - if ($comment === '// @codeCoverageIgnore' || - $comment === '//@codeCoverageIgnore') { - $this->ignoredLines[$filename][] = $token[2]; - - continue; - } - - if ($comment === '// @codeCoverageIgnoreStart' || - $comment === '//@codeCoverageIgnoreStart') { - $start = $token[2]; - - continue; - } - - if ($comment === '// @codeCoverageIgnoreEnd' || - $comment === '//@codeCoverageIgnoreEnd') { - if (false === $start) { - $start = $token[2]; - } - - $this->ignoredLines[$filename] = array_merge( - $this->ignoredLines[$filename], - range($start, $token[2]), - ); - } - } - } -} diff --git a/vendor/phpunit/php-code-coverage/src/TestSize/Known.php b/vendor/phpunit/php-code-coverage/src/TestSize/Known.php deleted file mode 100644 index 785fa86..0000000 --- a/vendor/phpunit/php-code-coverage/src/TestSize/Known.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Test\TestSize; - -/** - * @psalm-immutable - */ -abstract class Known extends TestSize -{ - /** - * @psalm-assert-if-true Known $this - */ - public function isKnown(): bool - { - return true; - } - - abstract public function isGreaterThan(self $other): bool; -} diff --git a/vendor/phpunit/php-code-coverage/src/TestSize/Large.php b/vendor/phpunit/php-code-coverage/src/TestSize/Large.php deleted file mode 100644 index cdf3441..0000000 --- a/vendor/phpunit/php-code-coverage/src/TestSize/Large.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Test\TestSize; - -/** - * @psalm-immutable - */ -final class Large extends Known -{ - /** - * @psalm-assert-if-true Large $this - */ - public function isLarge(): bool - { - return true; - } - - public function isGreaterThan(TestSize $other): bool - { - return !$other->isLarge(); - } - - public function asString(): string - { - return 'large'; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/TestSize/Medium.php b/vendor/phpunit/php-code-coverage/src/TestSize/Medium.php deleted file mode 100644 index 3096554..0000000 --- a/vendor/phpunit/php-code-coverage/src/TestSize/Medium.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Test\TestSize; - -/** - * @psalm-immutable - */ -final class Medium extends Known -{ - /** - * @psalm-assert-if-true Medium $this - */ - public function isMedium(): bool - { - return true; - } - - public function isGreaterThan(TestSize $other): bool - { - return $other->isSmall(); - } - - public function asString(): string - { - return 'medium'; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/TestSize/Small.php b/vendor/phpunit/php-code-coverage/src/TestSize/Small.php deleted file mode 100644 index 6697bde..0000000 --- a/vendor/phpunit/php-code-coverage/src/TestSize/Small.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Test\TestSize; - -/** - * @psalm-immutable - */ -final class Small extends Known -{ - /** - * @psalm-assert-if-true Small $this - */ - public function isSmall(): bool - { - return true; - } - - public function isGreaterThan(TestSize $other): bool - { - return false; - } - - public function asString(): string - { - return 'small'; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/TestSize/TestSize.php b/vendor/phpunit/php-code-coverage/src/TestSize/TestSize.php deleted file mode 100644 index 0eacc59..0000000 --- a/vendor/phpunit/php-code-coverage/src/TestSize/TestSize.php +++ /dev/null @@ -1,78 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Test\TestSize; - -/** - * @psalm-immutable - */ -abstract class TestSize -{ - public static function unknown(): self - { - return new Unknown; - } - - public static function small(): self - { - return new Small; - } - - public static function medium(): self - { - return new Medium; - } - - public static function large(): self - { - return new Large; - } - - /** - * @psalm-assert-if-true Known $this - */ - public function isKnown(): bool - { - return false; - } - - /** - * @psalm-assert-if-true Unknown $this - */ - public function isUnknown(): bool - { - return false; - } - - /** - * @psalm-assert-if-true Small $this - */ - public function isSmall(): bool - { - return false; - } - - /** - * @psalm-assert-if-true Medium $this - */ - public function isMedium(): bool - { - return false; - } - - /** - * @psalm-assert-if-true Large $this - */ - public function isLarge(): bool - { - return false; - } - - abstract public function asString(): string; -} diff --git a/vendor/phpunit/php-code-coverage/src/TestSize/Unknown.php b/vendor/phpunit/php-code-coverage/src/TestSize/Unknown.php deleted file mode 100644 index 24116f9..0000000 --- a/vendor/phpunit/php-code-coverage/src/TestSize/Unknown.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Test\TestSize; - -/** - * @psalm-immutable - */ -final class Unknown extends TestSize -{ - /** - * @psalm-assert-if-true Unknown $this - */ - public function isUnknown(): bool - { - return true; - } - - public function asString(): string - { - return 'unknown'; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/TestStatus/Failure.php b/vendor/phpunit/php-code-coverage/src/TestStatus/Failure.php deleted file mode 100644 index 1867d81..0000000 --- a/vendor/phpunit/php-code-coverage/src/TestStatus/Failure.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Test\TestStatus; - -/** - * @psalm-immutable - */ -final class Failure extends Known -{ - /** - * @psalm-assert-if-true Failure $this - */ - public function isFailure(): bool - { - return true; - } - - public function asString(): string - { - return 'failure'; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/TestStatus/Known.php b/vendor/phpunit/php-code-coverage/src/TestStatus/Known.php deleted file mode 100644 index 9c0a52a..0000000 --- a/vendor/phpunit/php-code-coverage/src/TestStatus/Known.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Test\TestStatus; - -/** - * @psalm-immutable - */ -abstract class Known extends TestStatus -{ - /** - * @psalm-assert-if-true Known $this - */ - public function isKnown(): bool - { - return true; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/TestStatus/Success.php b/vendor/phpunit/php-code-coverage/src/TestStatus/Success.php deleted file mode 100644 index dcb81a3..0000000 --- a/vendor/phpunit/php-code-coverage/src/TestStatus/Success.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Test\TestStatus; - -/** - * @psalm-immutable - */ -final class Success extends Known -{ - /** - * @psalm-assert-if-true Success $this - */ - public function isSuccess(): bool - { - return true; - } - - public function asString(): string - { - return 'success'; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/TestStatus/TestStatus.php b/vendor/phpunit/php-code-coverage/src/TestStatus/TestStatus.php deleted file mode 100644 index 5d532ea..0000000 --- a/vendor/phpunit/php-code-coverage/src/TestStatus/TestStatus.php +++ /dev/null @@ -1,65 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Test\TestStatus; - -/** - * @psalm-immutable - */ -abstract class TestStatus -{ - public static function unknown(): self - { - return new Unknown; - } - - public static function success(): self - { - return new Success; - } - - public static function failure(): self - { - return new Failure; - } - - /** - * @psalm-assert-if-true Known $this - */ - public function isKnown(): bool - { - return false; - } - - /** - * @psalm-assert-if-true Unknown $this - */ - public function isUnknown(): bool - { - return false; - } - - /** - * @psalm-assert-if-true Success $this - */ - public function isSuccess(): bool - { - return false; - } - - /** - * @psalm-assert-if-true Failure $this - */ - public function isFailure(): bool - { - return false; - } - - abstract public function asString(): string; -} diff --git a/vendor/phpunit/php-code-coverage/src/TestStatus/Unknown.php b/vendor/phpunit/php-code-coverage/src/TestStatus/Unknown.php deleted file mode 100644 index d9183fb..0000000 --- a/vendor/phpunit/php-code-coverage/src/TestStatus/Unknown.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Test\TestStatus; - -/** - * @psalm-immutable - */ -final class Unknown extends TestStatus -{ - /** - * @psalm-assert-if-true Unknown $this - */ - public function isUnknown(): bool - { - return true; - } - - public function asString(): string - { - return 'unknown'; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Util/Filesystem.php b/vendor/phpunit/php-code-coverage/src/Util/Filesystem.php deleted file mode 100644 index 0e99b15..0000000 --- a/vendor/phpunit/php-code-coverage/src/Util/Filesystem.php +++ /dev/null @@ -1,37 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Util; - -use function is_dir; -use function mkdir; -use function sprintf; - -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage - */ -final class Filesystem -{ - /** - * @throws DirectoryCouldNotBeCreatedException - */ - public static function createDirectory(string $directory): void - { - $success = !(!is_dir($directory) && !@mkdir($directory, 0o777, true) && !is_dir($directory)); - - if (!$success) { - throw new DirectoryCouldNotBeCreatedException( - sprintf( - 'Directory "%s" could not be created', - $directory, - ), - ); - } - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Util/Percentage.php b/vendor/phpunit/php-code-coverage/src/Util/Percentage.php deleted file mode 100644 index a69f236..0000000 --- a/vendor/phpunit/php-code-coverage/src/Util/Percentage.php +++ /dev/null @@ -1,59 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Util; - -use function sprintf; - -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage - */ -final class Percentage -{ - private readonly float $fraction; - private readonly float $total; - - public static function fromFractionAndTotal(float $fraction, float $total): self - { - return new self($fraction, $total); - } - - private function __construct(float $fraction, float $total) - { - $this->fraction = $fraction; - $this->total = $total; - } - - public function asFloat(): float - { - if ($this->total > 0) { - return ($this->fraction / $this->total) * 100; - } - - return 100.0; - } - - public function asString(): string - { - if ($this->total > 0) { - return sprintf('%01.2F%%', $this->asFloat()); - } - - return ''; - } - - public function asFixedWidthString(): string - { - if ($this->total > 0) { - return sprintf('%6.2F%%', $this->asFloat()); - } - - return ''; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Version.php b/vendor/phpunit/php-code-coverage/src/Version.php deleted file mode 100644 index 80b27f4..0000000 --- a/vendor/phpunit/php-code-coverage/src/Version.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage; - -use function dirname; -use SebastianBergmann\Version as VersionId; - -final class Version -{ - private static string $version = ''; - - public static function id(): string - { - if (self::$version === '') { - self::$version = (new VersionId('10.1.16', dirname(__DIR__)))->asString(); - } - - return self::$version; - } -} diff --git a/vendor/phpunit/php-file-iterator/ChangeLog.md b/vendor/phpunit/php-file-iterator/ChangeLog.md deleted file mode 100644 index e2ddc64..0000000 --- a/vendor/phpunit/php-file-iterator/ChangeLog.md +++ /dev/null @@ -1,174 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). - -## [4.1.0] - 2023-08-31 - -### Added - -* [#81](https://github.com/sebastianbergmann/php-file-iterator/issues/81): Accept `array|string $paths` in `Facade::getFilesAsArray()` - -## [4.0.2] - 2023-05-07 - -### Fixed - -* [#80](https://github.com/sebastianbergmann/php-file-iterator/pull/80): Ignore unresolvable symbolic link - -## [4.0.1] - 2023-02-10 - -### Fixed - -* [#67](https://github.com/sebastianbergmann/php-file-iterator/issues/61): Excluded directories are traversed unnecessarily - -## [4.0.0] - 2023-02-03 - -### Removed - -* The optional `$commonPath` parameter of `SebastianBergmann\FileIterator\Facade` as well as the functionality it controlled has been removed -* The `SebastianBergmann\FileIterator\Factory` and `SebastianBergmann\FileIterator\Iterator` classes are now marked `@internal` -* This component is no longer supported on PHP 7.3, PHP 7.4 and PHP 8.0 - -## [3.0.6] - 2021-12-02 - -### Changed - -* [#73](https://github.com/sebastianbergmann/php-file-iterator/pull/73): Micro performance improvements on parsing paths - -## [3.0.5] - 2020-09-28 - -### Changed - -* Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` - -## [3.0.4] - 2020-07-11 - -### Fixed - -* [#67](https://github.com/sebastianbergmann/php-file-iterator/issues/67): `TypeError` in `SebastianBergmann\FileIterator\Iterator::accept()` - -## [3.0.3] - 2020-06-26 - -### Added - -* This component is now supported on PHP 8 - -## [3.0.2] - 2020-06-15 - -### Changed - -* Tests etc. are now ignored for archive exports - -## [3.0.1] - 2020-04-18 - -### Fixed - -* [#64](https://github.com/sebastianbergmann/php-file-iterator/issues/64): Release tarball contains Composer PHAR - -## [3.0.0] - 2020-02-07 - -### Removed - -* This component is no longer supported on PHP 7.1 and PHP 7.2 - -## [2.0.5] - 2021-12-02 - -### Changed - -* [#73](https://github.com/sebastianbergmann/php-file-iterator/pull/73): Micro performance improvements on parsing paths - -### Fixed - -* [#74](https://github.com/sebastianbergmann/php-file-iterator/pull/74): Document return type of `SebastianBergmann\FileIterator\Iterator::accept()` so that Symfony's `DebugClassLoader` does not trigger a deprecation warning - -## [2.0.4] - 2021-07-19 - -### Changed - -* Added `ReturnTypeWillChange` attribute to `SebastianBergmann\FileIterator\Iterator::accept()` because the return type of `\FilterIterator::accept()` will change in PHP 8.1 - -## [2.0.3] - 2020-11-30 - -### Changed - -* Changed PHP version constraint in `composer.json` from `^7.1` to `>=7.1` - -## [2.0.2] - 2018-09-13 - -### Fixed - -* [#48](https://github.com/sebastianbergmann/php-file-iterator/issues/48): Excluding an array that contains false ends up excluding the current working directory - -## [2.0.1] - 2018-06-11 - -### Fixed - -* [#46](https://github.com/sebastianbergmann/php-file-iterator/issues/46): Regression with hidden parent directory - -## [2.0.0] - 2018-05-28 - -### Fixed - -* [#30](https://github.com/sebastianbergmann/php-file-iterator/issues/30): Exclude is not considered if it is a parent of the base path - -### Changed - -* This component now uses namespaces - -### Removed - -* This component is no longer supported on PHP 5.3, PHP 5.4, PHP 5.5, PHP 5.6, and PHP 7.0 - -## [1.4.5] - 2017-11-27 - -### Fixed - -* [#37](https://github.com/sebastianbergmann/php-file-iterator/issues/37): Regression caused by fix for [#30](https://github.com/sebastianbergmann/php-file-iterator/issues/30) - -## [1.4.4] - 2017-11-27 - -### Fixed - -* [#30](https://github.com/sebastianbergmann/php-file-iterator/issues/30): Exclude is not considered if it is a parent of the base path - -## [1.4.3] - 2017-11-25 - -### Fixed - -* [#34](https://github.com/sebastianbergmann/php-file-iterator/issues/34): Factory should use canonical directory names - -## [1.4.2] - 2016-11-26 - -No changes - -## [1.4.1] - 2015-07-26 - -No changes - -## 1.4.0 - 2015-04-02 - -### Added - -* [#23](https://github.com/sebastianbergmann/php-file-iterator/pull/23): Added support for wildcards (glob) in exclude - -[4.1.0]: https://github.com/sebastianbergmann/php-file-iterator/compare/4.0.2...4.1.0 -[4.0.2]: https://github.com/sebastianbergmann/php-file-iterator/compare/4.0.1...4.0.2 -[4.0.1]: https://github.com/sebastianbergmann/php-file-iterator/compare/4.0.0...4.0.1 -[4.0.0]: https://github.com/sebastianbergmann/php-file-iterator/compare/3.0.6...4.0.0 -[3.0.6]: https://github.com/sebastianbergmann/php-file-iterator/compare/3.0.5...3.0.6 -[3.0.5]: https://github.com/sebastianbergmann/php-file-iterator/compare/3.0.4...3.0.5 -[3.0.4]: https://github.com/sebastianbergmann/php-file-iterator/compare/3.0.3...3.0.4 -[3.0.3]: https://github.com/sebastianbergmann/php-file-iterator/compare/3.0.2...3.0.3 -[3.0.2]: https://github.com/sebastianbergmann/php-file-iterator/compare/3.0.1...3.0.2 -[3.0.1]: https://github.com/sebastianbergmann/php-file-iterator/compare/3.0.0...3.0.1 -[3.0.0]: https://github.com/sebastianbergmann/php-file-iterator/compare/2.0.5...3.0.0 -[2.0.5]: https://github.com/sebastianbergmann/php-file-iterator/compare/2.0.4...2.0.5 -[2.0.4]: https://github.com/sebastianbergmann/php-file-iterator/compare/2.0.3...2.0.4 -[2.0.3]: https://github.com/sebastianbergmann/php-file-iterator/compare/2.0.2...2.0.3 -[2.0.2]: https://github.com/sebastianbergmann/php-file-iterator/compare/2.0.1...2.0.2 -[2.0.1]: https://github.com/sebastianbergmann/php-file-iterator/compare/2.0.0...2.0.1 -[2.0.0]: https://github.com/sebastianbergmann/php-file-iterator/compare/1.4.5...2.0.0 -[1.4.5]: https://github.com/sebastianbergmann/php-file-iterator/compare/1.4.4...1.4.5 -[1.4.4]: https://github.com/sebastianbergmann/php-file-iterator/compare/1.4.3...1.4.4 -[1.4.3]: https://github.com/sebastianbergmann/php-file-iterator/compare/1.4.2...1.4.3 -[1.4.2]: https://github.com/sebastianbergmann/php-file-iterator/compare/1.4.1...1.4.2 -[1.4.1]: https://github.com/sebastianbergmann/php-file-iterator/compare/1.4.0...1.4.1 diff --git a/vendor/phpunit/php-file-iterator/LICENSE b/vendor/phpunit/php-file-iterator/LICENSE deleted file mode 100644 index 80e09f7..0000000 --- a/vendor/phpunit/php-file-iterator/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2009-2023, Sebastian Bergmann -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/phpunit/php-file-iterator/README.md b/vendor/phpunit/php-file-iterator/README.md deleted file mode 100644 index f012ba7..0000000 --- a/vendor/phpunit/php-file-iterator/README.md +++ /dev/null @@ -1,17 +0,0 @@ -[![Latest Stable Version](https://poser.pugx.org/phpunit/php-file-iterator/v/stable.png)](https://packagist.org/packages/phpunit/php-file-iterator) -[![CI Status](https://github.com/sebastianbergmann/php-file-iterator/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/php-file-iterator/actions) -[![Type Coverage](https://shepherd.dev/github/sebastianbergmann/php-file-iterator/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/php-file-iterator) -[![codecov](https://codecov.io/gh/sebastianbergmann/php-file-iterator/branch/main/graph/badge.svg)](https://codecov.io/gh/sebastianbergmann/php-file-iterator) - -# php-file-iterator - -## Installation - -You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - - composer require phpunit/php-file-iterator - -If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - - composer require --dev phpunit/php-file-iterator - diff --git a/vendor/phpunit/php-file-iterator/SECURITY.md b/vendor/phpunit/php-file-iterator/SECURITY.md deleted file mode 100644 index d88ff00..0000000 --- a/vendor/phpunit/php-file-iterator/SECURITY.md +++ /dev/null @@ -1,30 +0,0 @@ -# Security Policy - -If you believe you have found a security vulnerability in the library that is developed in this repository, please report it to us through coordinated disclosure. - -**Please do not report security vulnerabilities through public GitHub issues, discussions, or pull requests.** - -Instead, please email `sebastian@phpunit.de`. - -Please include as much of the information listed below as you can to help us better understand and resolve the issue: - -* The type of issue -* Full paths of source file(s) related to the manifestation of the issue -* The location of the affected source code (tag/branch/commit or direct URL) -* Any special configuration required to reproduce the issue -* Step-by-step instructions to reproduce the issue -* Proof-of-concept or exploit code (if possible) -* Impact of the issue, including how an attacker might exploit the issue - -This information will help us triage your report more quickly. - -## Web Context - -The library that is developed in this repository was either extracted from [PHPUnit](https://github.com/sebastianbergmann/phpunit) or developed specifically as a dependency for PHPUnit. - -The library is developed with a focus on development environments and the command-line. No specific testing or hardening with regard to using the library in an HTTP or web context or with untrusted input data is performed. The library might also contain functionality that intentionally exposes internal application data for debugging purposes. - -If the library is used in a web application, the application developer is responsible for filtering inputs or escaping outputs as necessary and for verifying that the used functionality is safe for use within the intended context. - -Vulnerabilities specific to the use outside a development context will be fixed as applicable, provided that the fix does not have an averse effect on the primary use case for development purposes. - diff --git a/vendor/phpunit/php-file-iterator/composer.json b/vendor/phpunit/php-file-iterator/composer.json deleted file mode 100644 index 3f0089c..0000000 --- a/vendor/phpunit/php-file-iterator/composer.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "name": "phpunit/php-file-iterator", - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "type": "library", - "keywords": [ - "iterator", - "filesystem" - ], - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy" - }, - "config": { - "platform": { - "php": "8.1.0" - }, - "optimize-autoloader": true, - "sort-packages": true - }, - "prefer-stable": true, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - } -} diff --git a/vendor/phpunit/php-file-iterator/src/ExcludeIterator.php b/vendor/phpunit/php-file-iterator/src/ExcludeIterator.php deleted file mode 100644 index a928b4b..0000000 --- a/vendor/phpunit/php-file-iterator/src/ExcludeIterator.php +++ /dev/null @@ -1,80 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\FileIterator; - -use function assert; -use function str_starts_with; -use RecursiveDirectoryIterator; -use RecursiveFilterIterator; -use SplFileInfo; - -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-file-iterator - */ -final class ExcludeIterator extends RecursiveFilterIterator -{ - /** - * @psalm-var list - */ - private array $exclude; - - /** - * @psalm-param list $exclude - */ - public function __construct(RecursiveDirectoryIterator $iterator, array $exclude) - { - parent::__construct($iterator); - - $this->exclude = $exclude; - } - - public function accept(): bool - { - $current = $this->current(); - - assert($current instanceof SplFileInfo); - - $path = $current->getRealPath(); - - if ($path === false) { - return false; - } - - foreach ($this->exclude as $exclude) { - if (str_starts_with($path, $exclude)) { - return false; - } - } - - return true; - } - - public function hasChildren(): bool - { - return $this->getInnerIterator()->hasChildren(); - } - - public function getChildren(): self - { - return new self( - $this->getInnerIterator()->getChildren(), - $this->exclude - ); - } - - public function getInnerIterator(): RecursiveDirectoryIterator - { - $innerIterator = parent::getInnerIterator(); - - assert($innerIterator instanceof RecursiveDirectoryIterator); - - return $innerIterator; - } -} diff --git a/vendor/phpunit/php-file-iterator/src/Facade.php b/vendor/phpunit/php-file-iterator/src/Facade.php deleted file mode 100644 index b782bf9..0000000 --- a/vendor/phpunit/php-file-iterator/src/Facade.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\FileIterator; - -use function array_unique; -use function assert; -use function sort; -use SplFileInfo; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class Facade -{ - /** - * @psalm-param list|non-empty-string $paths - * @psalm-param list|string $suffixes - * @psalm-param list|string $prefixes - * @psalm-param list $exclude - * - * @psalm-return list - */ - public function getFilesAsArray(array|string $paths, array|string $suffixes = '', array|string $prefixes = '', array $exclude = []): array - { - $iterator = (new Factory)->getFileIterator($paths, $suffixes, $prefixes, $exclude); - - $files = []; - - foreach ($iterator as $file) { - assert($file instanceof SplFileInfo); - - $file = $file->getRealPath(); - - if ($file) { - $files[] = $file; - } - } - - $files = array_unique($files); - - sort($files); - - return $files; - } -} diff --git a/vendor/phpunit/php-file-iterator/src/Factory.php b/vendor/phpunit/php-file-iterator/src/Factory.php deleted file mode 100644 index 35f9ca0..0000000 --- a/vendor/phpunit/php-file-iterator/src/Factory.php +++ /dev/null @@ -1,106 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\FileIterator; - -use const GLOB_ONLYDIR; -use function array_filter; -use function array_map; -use function array_merge; -use function array_values; -use function glob; -use function is_dir; -use function is_string; -use function realpath; -use AppendIterator; -use FilesystemIterator; -use RecursiveDirectoryIterator; -use RecursiveIteratorIterator; - -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-file-iterator - */ -final class Factory -{ - /** - * @psalm-param list|non-empty-string $paths - * @psalm-param list|string $suffixes - * @psalm-param list|string $prefixes - * @psalm-param list $exclude - */ - public function getFileIterator(array|string $paths, array|string $suffixes = '', array|string $prefixes = '', array $exclude = []): AppendIterator - { - if (is_string($paths)) { - $paths = [$paths]; - } - - $paths = $this->resolveWildcards($paths); - $exclude = $this->resolveWildcards($exclude); - - if (is_string($prefixes)) { - if ($prefixes !== '') { - $prefixes = [$prefixes]; - } else { - $prefixes = []; - } - } - - if (is_string($suffixes)) { - if ($suffixes !== '') { - $suffixes = [$suffixes]; - } else { - $suffixes = []; - } - } - - $iterator = new AppendIterator; - - foreach ($paths as $path) { - if (is_dir($path)) { - $iterator->append( - new Iterator( - $path, - new RecursiveIteratorIterator( - new ExcludeIterator( - new RecursiveDirectoryIterator($path, FilesystemIterator::FOLLOW_SYMLINKS | FilesystemIterator::SKIP_DOTS), - $exclude, - ), - ), - $suffixes, - $prefixes, - ) - ); - } - } - - return $iterator; - } - - /** - * @psalm-param list $paths - * - * @psalm-return list - */ - private function resolveWildcards(array $paths): array - { - $_paths = [[]]; - - foreach ($paths as $path) { - if ($locals = glob($path, GLOB_ONLYDIR)) { - $_paths[] = array_map('\realpath', $locals); - } else { - // @codeCoverageIgnoreStart - $_paths[] = [realpath($path)]; - // @codeCoverageIgnoreEnd - } - } - - return array_values(array_filter(array_merge(...$_paths))); - } -} diff --git a/vendor/phpunit/php-file-iterator/src/Iterator.php b/vendor/phpunit/php-file-iterator/src/Iterator.php deleted file mode 100644 index d071205..0000000 --- a/vendor/phpunit/php-file-iterator/src/Iterator.php +++ /dev/null @@ -1,114 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\FileIterator; - -use function assert; -use function preg_match; -use function realpath; -use function str_ends_with; -use function str_replace; -use function str_starts_with; -use AppendIterator; -use FilterIterator; -use SplFileInfo; - -/** - * @template-extends FilterIterator - * - * @internal This class is not covered by the backward compatibility promise for phpunit/php-file-iterator - */ -final class Iterator extends FilterIterator -{ - public const PREFIX = 0; - public const SUFFIX = 1; - private string|false $basePath; - - /** - * @psalm-var list - */ - private array $suffixes; - - /** - * @psalm-var list - */ - private array $prefixes; - - /** - * @psalm-param list $suffixes - * @psalm-param list $prefixes - */ - public function __construct(string $basePath, \Iterator $iterator, array $suffixes = [], array $prefixes = []) - { - $this->basePath = realpath($basePath); - $this->prefixes = $prefixes; - $this->suffixes = $suffixes; - - parent::__construct($iterator); - } - - public function accept(): bool - { - $current = $this->getInnerIterator()->current(); - - assert($current instanceof SplFileInfo); - - $filename = $current->getFilename(); - $realPath = $current->getRealPath(); - - if ($realPath === false) { - // @codeCoverageIgnoreStart - return false; - // @codeCoverageIgnoreEnd - } - - return $this->acceptPath($realPath) && - $this->acceptPrefix($filename) && - $this->acceptSuffix($filename); - } - - private function acceptPath(string $path): bool - { - // Filter files in hidden directories by checking path that is relative to the base path. - if (preg_match('=/\.[^/]*/=', str_replace((string) $this->basePath, '', $path))) { - return false; - } - - return true; - } - - private function acceptPrefix(string $filename): bool - { - return $this->acceptSubString($filename, $this->prefixes, self::PREFIX); - } - - private function acceptSuffix(string $filename): bool - { - return $this->acceptSubString($filename, $this->suffixes, self::SUFFIX); - } - - /** - * @psalm-param list $subStrings - */ - private function acceptSubString(string $filename, array $subStrings, int $type): bool - { - if (empty($subStrings)) { - return true; - } - - foreach ($subStrings as $string) { - if (($type === self::PREFIX && str_starts_with($filename, $string)) || - ($type === self::SUFFIX && str_ends_with($filename, $string))) { - return true; - } - } - - return false; - } -} diff --git a/vendor/phpunit/php-invoker/.psalm/baseline.xml b/vendor/phpunit/php-invoker/.psalm/baseline.xml deleted file mode 100644 index 7aaad59..0000000 --- a/vendor/phpunit/php-invoker/.psalm/baseline.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - $timeout - - - diff --git a/vendor/phpunit/php-invoker/.psalm/config.xml b/vendor/phpunit/php-invoker/.psalm/config.xml deleted file mode 100644 index a231236..0000000 --- a/vendor/phpunit/php-invoker/.psalm/config.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - diff --git a/vendor/phpunit/php-invoker/ChangeLog.md b/vendor/phpunit/php-invoker/ChangeLog.md deleted file mode 100644 index c6e815d..0000000 --- a/vendor/phpunit/php-invoker/ChangeLog.md +++ /dev/null @@ -1,55 +0,0 @@ -# ChangeLog - -All notable changes are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. - -## [4.0.0] - 2023-02-03 - -### Removed - -* This component is no longer supported on PHP 7.3, PHP 7.4 and PHP 8.0 - -## [3.1.1] - 2020-09-28 - -### Changed - -* Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` - -## [3.1.0] - 2020-08-06 - -### Changed - -* [#14](https://github.com/sebastianbergmann/php-invoker/pull/14): Clear alarm in `finally` block - -## [3.0.2] - 2020-06-26 - -### Added - -* This component is now supported on PHP 8 - -## [3.0.1] - 2020-06-15 - -### Changed - -* Tests etc. are now ignored for archive exports - -## [3.0.0] - 2020-02-07 - -### Added - -* Added `canInvokeWithTimeout()` method to check requirements for the functionality provided by this component to work - -### Changed - -* Moved `"ext-pcntl": "*"` requirement from `require` to `suggest` so that this component can be installed even if `ext/pcntl` is not available -* `invoke()` now raises an exception when the requirements for the functionality provided by this component to work are not met - -### Removed - -* This component is no longer supported on PHP 7.1 and PHP 7.2 - -[4.0.0]: https://github.com/sebastianbergmann/php-invoker/compare/3.1.1...4.0.0 -[3.1.1]: https://github.com/sebastianbergmann/php-invoker/compare/3.1.0...3.1.1 -[3.1.0]: https://github.com/sebastianbergmann/php-invoker/compare/3.0.2...3.1.0 -[3.0.2]: https://github.com/sebastianbergmann/php-invoker/compare/3.0.1...3.0.2 -[3.0.1]: https://github.com/sebastianbergmann/php-invoker/compare/3.0.0...3.0.1 -[3.0.0]: https://github.com/sebastianbergmann/php-invoker/compare/2.0.0...3.0.0 diff --git a/vendor/phpunit/php-invoker/LICENSE b/vendor/phpunit/php-invoker/LICENSE deleted file mode 100644 index 4530131..0000000 --- a/vendor/phpunit/php-invoker/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2011-2023, Sebastian Bergmann -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/phpunit/php-invoker/README.md b/vendor/phpunit/php-invoker/README.md deleted file mode 100644 index 7b6ff13..0000000 --- a/vendor/phpunit/php-invoker/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# phpunit/php-invoker - -[![Latest Stable Version](https://poser.pugx.org/phpunit/php-invoker/v/stable.png)](https://packagist.org/packages/phpunit/php-invoker) -[![CI Status](https://github.com/sebastianbergmann/php-invoker/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/php-invoker/actions) -[![Type Coverage](https://shepherd.dev/github/sebastianbergmann/php-invoker/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/php-invoker) -[![codecov](https://codecov.io/gh/sebastianbergmann/php-invoker/branch/main/graph/badge.svg)](https://codecov.io/gh/sebastianbergmann/php-invoker) - -## Installation - -You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - -``` -composer require phpunit/php-invoker -``` - -If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - -``` -composer require --dev phpunit/php-invoker -``` diff --git a/vendor/phpunit/php-invoker/SECURITY.md b/vendor/phpunit/php-invoker/SECURITY.md deleted file mode 100644 index d4ee967..0000000 --- a/vendor/phpunit/php-invoker/SECURITY.md +++ /dev/null @@ -1,9 +0,0 @@ -# Security Policy - -This library is intended to be used in development environments only. For instance, it is used by the testing framework PHPUnit. There is no reason why this library should be installed on a webserver. - -**If you upload this library to a webserver then your deployment process is broken. On a more general note, if your `vendor` directory is publicly accessible on your webserver then your deployment process is also broken.** - -## Security Contact Information - -After the above, if you still would like to report a security vulnerability, please email `sebastian@phpunit.de`. diff --git a/vendor/phpunit/php-invoker/composer.json b/vendor/phpunit/php-invoker/composer.json deleted file mode 100644 index c3dc5ac..0000000 --- a/vendor/phpunit/php-invoker/composer.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "name": "phpunit/php-invoker", - "description": "Invoke callables with a timeout", - "type": "library", - "keywords": [ - "process" - ], - "homepage": "https://github.com/sebastianbergmann/php-invoker/", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-invoker/issues" - }, - "prefer-stable": true, - "config": { - "platform": { - "php": "8.1.0" - }, - "optimize-autoloader": true, - "sort-packages": true - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "ext-pcntl": "*", - "phpunit/phpunit": "^10.0" - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "autoload-dev": { - "classmap": [ - "tests/_fixture/" - ] - }, - "suggest": { - "ext-pcntl": "*" - }, - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - } -} - diff --git a/vendor/phpunit/php-invoker/src/Invoker.php b/vendor/phpunit/php-invoker/src/Invoker.php deleted file mode 100644 index d576521..0000000 --- a/vendor/phpunit/php-invoker/src/Invoker.php +++ /dev/null @@ -1,67 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Invoker; - -use const SIGALRM; -use function call_user_func_array; -use function function_exists; -use function pcntl_alarm; -use function pcntl_async_signals; -use function pcntl_signal; -use function sprintf; -use Throwable; - -final class Invoker -{ - private int $timeout; - - /** - * @throws Throwable - */ - public function invoke(callable $callable, array $arguments, int $timeout): mixed - { - if (!$this->canInvokeWithTimeout()) { - throw new ProcessControlExtensionNotLoadedException( - 'The pcntl (process control) extension for PHP is required' - ); - } - - pcntl_signal( - SIGALRM, - function (): void - { - throw new TimeoutException( - sprintf( - 'Execution aborted after %d second%s', - $this->timeout, - $this->timeout === 1 ? '' : 's' - ) - ); - }, - true - ); - - $this->timeout = $timeout; - - pcntl_async_signals(true); - pcntl_alarm($timeout); - - try { - return call_user_func_array($callable, $arguments); - } finally { - pcntl_alarm(0); - } - } - - public function canInvokeWithTimeout(): bool - { - return function_exists('pcntl_signal') && function_exists('pcntl_async_signals') && function_exists('pcntl_alarm'); - } -} diff --git a/vendor/phpunit/php-invoker/src/exceptions/Exception.php b/vendor/phpunit/php-invoker/src/exceptions/Exception.php deleted file mode 100644 index 6ecbf5d..0000000 --- a/vendor/phpunit/php-invoker/src/exceptions/Exception.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Invoker; - -use Throwable; - -interface Exception extends Throwable -{ -} diff --git a/vendor/phpunit/php-invoker/src/exceptions/ProcessControlExtensionNotLoadedException.php b/vendor/phpunit/php-invoker/src/exceptions/ProcessControlExtensionNotLoadedException.php deleted file mode 100644 index ef42fd1..0000000 --- a/vendor/phpunit/php-invoker/src/exceptions/ProcessControlExtensionNotLoadedException.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Invoker; - -use RuntimeException; - -final class ProcessControlExtensionNotLoadedException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/php-invoker/src/exceptions/TimeoutException.php b/vendor/phpunit/php-invoker/src/exceptions/TimeoutException.php deleted file mode 100644 index 2f7631c..0000000 --- a/vendor/phpunit/php-invoker/src/exceptions/TimeoutException.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Invoker; - -use RuntimeException; - -final class TimeoutException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/php-text-template/ChangeLog.md b/vendor/phpunit/php-text-template/ChangeLog.md deleted file mode 100644 index 012f02b..0000000 --- a/vendor/phpunit/php-text-template/ChangeLog.md +++ /dev/null @@ -1,57 +0,0 @@ -# ChangeLog - -All notable changes are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. - -## [3.0.1] - 2023-08-31 - -### Changed - -* Warnings from `file_put_contents()` are now suppressed - -## [3.0.0] - 2023-02-03 - -### Removed - -* This component is no longer supported on PHP 7.3, PHP 7.4 and PHP 8.0 - -## [2.0.4] - 2020-10-26 - -### Fixed - -* `SebastianBergmann\Template\Exception` now correctly extends `\Throwable` - -## [2.0.3] - 2020-09-28 - -### Changed - -* Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` - -## [2.0.2] - 2020-06-26 - -### Added - -* This component is now supported on PHP 8 - -## [2.0.1] - 2020-06-15 - -### Changed - -* Tests etc. are now ignored for archive exports - -## [2.0.0] - 2020-02-07 - -### Changed - -* The `Text_Template` class was renamed to `SebastianBergmann\Template\Template` - -### Removed - -* Removed support for PHP 5.3, PHP 5.4, PHP 5.5, PHP 5.6, PHP 7.0, PHP 7.1, and PHP 7.2 - -[3.0.1]: https://github.com/sebastianbergmann/php-text-template/compare/3.0.0...3.0.1 -[3.0.0]: https://github.com/sebastianbergmann/php-text-template/compare/2.0.4...3.0.0 -[2.0.4]: https://github.com/sebastianbergmann/php-text-template/compare/2.0.3...2.0.4 -[2.0.3]: https://github.com/sebastianbergmann/php-text-template/compare/2.0.2...2.0.3 -[2.0.2]: https://github.com/sebastianbergmann/php-text-template/compare/2.0.1...2.0.2 -[2.0.1]: https://github.com/sebastianbergmann/php-text-template/compare/2.0.0...2.0.1 -[2.0.0]: https://github.com/sebastianbergmann/php-text-template/compare/1.2.1...2.0.0 diff --git a/vendor/phpunit/php-text-template/LICENSE b/vendor/phpunit/php-text-template/LICENSE deleted file mode 100644 index 80e09f7..0000000 --- a/vendor/phpunit/php-text-template/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2009-2023, Sebastian Bergmann -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/phpunit/php-text-template/README.md b/vendor/phpunit/php-text-template/README.md deleted file mode 100644 index 5144a6a..0000000 --- a/vendor/phpunit/php-text-template/README.md +++ /dev/null @@ -1,17 +0,0 @@ -[![Latest Stable Version](https://poser.pugx.org/phpunit/php-text-template/v/stable.png)](https://packagist.org/packages/phpunit/php-text-template) -[![CI Status](https://github.com/sebastianbergmann/php-text-template/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/php-text-template/actions) -[![Type Coverage](https://shepherd.dev/github/sebastianbergmann/php-text-template/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/php-text-template) -[![codecov](https://codecov.io/gh/sebastianbergmann/php-text-template/branch/main/graph/badge.svg)](https://codecov.io/gh/sebastianbergmann/php-text-template) - -# php-text-template - -## Installation - -You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - - composer require phpunit/php-text-template - -If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - - composer require --dev phpunit/php-text-template - diff --git a/vendor/phpunit/php-text-template/SECURITY.md b/vendor/phpunit/php-text-template/SECURITY.md deleted file mode 100644 index d88ff00..0000000 --- a/vendor/phpunit/php-text-template/SECURITY.md +++ /dev/null @@ -1,30 +0,0 @@ -# Security Policy - -If you believe you have found a security vulnerability in the library that is developed in this repository, please report it to us through coordinated disclosure. - -**Please do not report security vulnerabilities through public GitHub issues, discussions, or pull requests.** - -Instead, please email `sebastian@phpunit.de`. - -Please include as much of the information listed below as you can to help us better understand and resolve the issue: - -* The type of issue -* Full paths of source file(s) related to the manifestation of the issue -* The location of the affected source code (tag/branch/commit or direct URL) -* Any special configuration required to reproduce the issue -* Step-by-step instructions to reproduce the issue -* Proof-of-concept or exploit code (if possible) -* Impact of the issue, including how an attacker might exploit the issue - -This information will help us triage your report more quickly. - -## Web Context - -The library that is developed in this repository was either extracted from [PHPUnit](https://github.com/sebastianbergmann/phpunit) or developed specifically as a dependency for PHPUnit. - -The library is developed with a focus on development environments and the command-line. No specific testing or hardening with regard to using the library in an HTTP or web context or with untrusted input data is performed. The library might also contain functionality that intentionally exposes internal application data for debugging purposes. - -If the library is used in a web application, the application developer is responsible for filtering inputs or escaping outputs as necessary and for verifying that the used functionality is safe for use within the intended context. - -Vulnerabilities specific to the use outside a development context will be fixed as applicable, provided that the fix does not have an averse effect on the primary use case for development purposes. - diff --git a/vendor/phpunit/php-text-template/composer.json b/vendor/phpunit/php-text-template/composer.json deleted file mode 100644 index cd6cf75..0000000 --- a/vendor/phpunit/php-text-template/composer.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "name": "phpunit/php-text-template", - "description": "Simple template engine.", - "type": "library", - "keywords": [ - "template" - ], - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "security": "https://github.com/sebastianbergmann/php-text-template/security/policy" - }, - "config": { - "platform": { - "php": "8.1.0" - }, - "optimize-autoloader": true, - "sort-packages": true - }, - "prefer-stable": true, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - } -} diff --git a/vendor/phpunit/php-text-template/src/Template.php b/vendor/phpunit/php-text-template/src/Template.php deleted file mode 100644 index 167e238..0000000 --- a/vendor/phpunit/php-text-template/src/Template.php +++ /dev/null @@ -1,108 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Template; - -use function array_keys; -use function array_merge; -use function file_get_contents; -use function file_put_contents; -use function is_file; -use function sprintf; -use function str_replace; - -final class Template -{ - private string $template = ''; - private string $openDelimiter; - private string $closeDelimiter; - - /** - * @psalm-var array - */ - private array $values = []; - - /** - * @throws InvalidArgumentException - */ - public function __construct(string $file = '', string $openDelimiter = '{', string $closeDelimiter = '}') - { - $this->setFile($file); - - $this->openDelimiter = $openDelimiter; - $this->closeDelimiter = $closeDelimiter; - } - - /** - * @throws InvalidArgumentException - */ - public function setFile(string $file): void - { - if (is_file($file)) { - $this->template = file_get_contents($file); - - return; - } - - $distFile = $file . '.dist'; - - if (is_file($distFile)) { - $this->template = file_get_contents($distFile); - - return; - } - - throw new InvalidArgumentException( - sprintf( - 'Failed to load template "%s"', - $file - ) - ); - } - - /** - * @psalm-param array $values - */ - public function setVar(array $values, bool $merge = true): void - { - if (!$merge || empty($this->values)) { - $this->values = $values; - - return; - } - - $this->values = array_merge($this->values, $values); - } - - public function render(): string - { - $keys = []; - - foreach (array_keys($this->values) as $key) { - $keys[] = $this->openDelimiter . $key . $this->closeDelimiter; - } - - return str_replace($keys, $this->values, $this->template); - } - - /** - * @codeCoverageIgnore - */ - public function renderTo(string $target): void - { - if (!@file_put_contents($target, $this->render())) { - throw new RuntimeException( - sprintf( - 'Writing rendered result to "%s" failed', - $target - ) - ); - } - } -} diff --git a/vendor/phpunit/php-text-template/src/exceptions/Exception.php b/vendor/phpunit/php-text-template/src/exceptions/Exception.php deleted file mode 100644 index d7dc5cb..0000000 --- a/vendor/phpunit/php-text-template/src/exceptions/Exception.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Template; - -use Throwable; - -interface Exception extends Throwable -{ -} diff --git a/vendor/phpunit/php-text-template/src/exceptions/InvalidArgumentException.php b/vendor/phpunit/php-text-template/src/exceptions/InvalidArgumentException.php deleted file mode 100644 index 10e1cd1..0000000 --- a/vendor/phpunit/php-text-template/src/exceptions/InvalidArgumentException.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Template; - -final class InvalidArgumentException extends \InvalidArgumentException implements Exception -{ -} diff --git a/vendor/phpunit/php-text-template/src/exceptions/RuntimeException.php b/vendor/phpunit/php-text-template/src/exceptions/RuntimeException.php deleted file mode 100644 index 131498e..0000000 --- a/vendor/phpunit/php-text-template/src/exceptions/RuntimeException.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Template; - -use InvalidArgumentException; - -final class RuntimeException extends InvalidArgumentException implements Exception -{ -} diff --git a/vendor/phpunit/php-timer/ChangeLog.md b/vendor/phpunit/php-timer/ChangeLog.md deleted file mode 100644 index 2814b00..0000000 --- a/vendor/phpunit/php-timer/ChangeLog.md +++ /dev/null @@ -1,145 +0,0 @@ -# ChangeLog - -All notable changes are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. - -## [6.0.0] - 2023-02-03 - -### Removed - -* This component is no longer supported on PHP 7.3, PHP 7.4 and PHP 8.0 - -## [5.0.3] - 2020-10-26 - -### Fixed - -* `SebastianBergmann\Timer\Exception` now correctly extends `\Throwable` - -## [5.0.2] - 2020-09-28 - -### Changed - -* Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` - -## [5.0.1] - 2020-06-26 - -### Added - -* This component is now supported on PHP 8 - -## [5.0.0] - 2020-06-07 - -### Changed - -* Parameter type for `SebastianBergmann\Timer\Duration::fromMicroseconds()` was changed from `int` to `float` -* Parameter type for `SebastianBergmann\Timer\Duration::fromNanoseconds()` was changed from `int` to `float` -* Return type for `SebastianBergmann\Timer\Duration::asNanoseconds()` was changed from `int` to `float` - -### Fixed - -* [#31](https://github.com/sebastianbergmann/php-timer/issues/31): Type Error on 32-bit systems (where `hrtime()` returns `float` instead of `int`) - -## [4.0.0] - 2020-06-01 - -### Added - -* Introduced `Duration` value object for encapsulating a duration with nanosecond granularity -* Introduced `ResourceUsageFormatter` object for formatting resource usage with option to explicitly pass a duration (instead of looking at the unreliable `$_SERVER['REQUEST_TIME_FLOAT']` variable) - -### Changed - -* The methods of `Timer` are no longer static -* `Timer::stop()` now returns a `Duration` value object - -### Removed - -* Functionality that is now implemented in `Duration` and `ResourceUsageFormatter` has been removed from `Timer` - -## [3.1.4] - 2020-04-20 - -### Changed - -* `Timer::timeSinceStartOfRequest()` no longer tries `$_SERVER['REQUEST_TIME']` when `$_SERVER['REQUEST_TIME_FLOAT']` is not available (`$_SERVER['REQUEST_TIME_FLOAT']` was added in PHP 5.4 and this library requires PHP 7.3) -* Improved exception messages when `$_SERVER['REQUEST_TIME_FLOAT']` is not set or is not of type `float` - -### Changed - -## [3.1.3] - 2020-04-20 - -### Changed - -* `Timer::timeSinceStartOfRequest()` now raises an exception if `$_SERVER['REQUEST_TIME_FLOAT']` does not contain a `float` (or `$_SERVER['REQUEST_TIME']` does not contain an `int`) - -## [3.1.2] - 2020-04-17 - -### Changed - -* Improved the fix for [#30](https://github.com/sebastianbergmann/php-timer/issues/30) and restored usage of `hrtime()` - -## [3.1.1] - 2020-04-17 - -### Fixed - -* [#30](https://github.com/sebastianbergmann/php-timer/issues/30): Resolution of time returned by `Timer::stop()` is different than before (this reverts using `hrtime()` instead of `microtime()`) - -## [3.1.0] - 2020-04-17 - -### Added - -* `Timer::secondsToShortTimeString()` as alternative to `Timer::secondsToTimeString()` - -### Changed - -* `Timer::start()` and `Timer::stop()` now use `hrtime()` (high resolution monotonic timer) instead of `microtime()` -* `Timer::timeSinceStartOfRequest()` now uses `Timer::secondsToShortTimeString()` for time formatting -* Improved formatting of `Timer::secondsToTimeString()` result - -## [3.0.0] - 2020-02-07 - -### Removed - -* This component is no longer supported on PHP 7.1 and PHP 7.2 - -## [2.1.2] - 2019-06-07 - -### Fixed - -* [#21](https://github.com/sebastianbergmann/php-timer/pull/21): Formatting of memory consumption does not work on 32bit systems - -## [2.1.1] - 2019-02-20 - -### Changed - -* Improved formatting of memory consumption for `resourceUsage()` - -## [2.1.0] - 2019-02-20 - -### Changed - -* Improved formatting of memory consumption for `resourceUsage()` - -## [2.0.0] - 2018-02-01 - -### Changed - -* This component now uses namespaces - -### Removed - -* This component is no longer supported on PHP 5.3, PHP 5.4, PHP 5.5, PHP 5.6, and PHP 7.0 - -[6.0.0]: https://github.com/sebastianbergmann/php-timer/compare/5.0.3...6.0.0 -[5.0.3]: https://github.com/sebastianbergmann/php-timer/compare/5.0.2...5.0.3 -[5.0.2]: https://github.com/sebastianbergmann/php-timer/compare/5.0.1...5.0.2 -[5.0.1]: https://github.com/sebastianbergmann/php-timer/compare/5.0.0...5.0.1 -[5.0.0]: https://github.com/sebastianbergmann/php-timer/compare/4.0.0...5.0.0 -[4.0.0]: https://github.com/sebastianbergmann/php-timer/compare/3.1.4...4.0.0 -[3.1.4]: https://github.com/sebastianbergmann/php-timer/compare/3.1.3...3.1.4 -[3.1.3]: https://github.com/sebastianbergmann/php-timer/compare/3.1.2...3.1.3 -[3.1.2]: https://github.com/sebastianbergmann/php-timer/compare/3.1.1...3.1.2 -[3.1.1]: https://github.com/sebastianbergmann/php-timer/compare/3.1.0...3.1.1 -[3.1.0]: https://github.com/sebastianbergmann/php-timer/compare/3.0.0...3.1.0 -[3.0.0]: https://github.com/sebastianbergmann/php-timer/compare/2.1.2...3.0.0 -[2.1.2]: https://github.com/sebastianbergmann/php-timer/compare/2.1.1...2.1.2 -[2.1.1]: https://github.com/sebastianbergmann/php-timer/compare/2.1.0...2.1.1 -[2.1.0]: https://github.com/sebastianbergmann/php-timer/compare/2.0.0...2.1.0 -[2.0.0]: https://github.com/sebastianbergmann/php-timer/compare/1.0.9...2.0.0 diff --git a/vendor/phpunit/php-timer/LICENSE b/vendor/phpunit/php-timer/LICENSE deleted file mode 100644 index bf96e0e..0000000 --- a/vendor/phpunit/php-timer/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2010-2023, Sebastian Bergmann -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/phpunit/php-timer/README.md b/vendor/phpunit/php-timer/README.md deleted file mode 100644 index b553e32..0000000 --- a/vendor/phpunit/php-timer/README.md +++ /dev/null @@ -1,106 +0,0 @@ -# phpunit/php-timer - -[![Latest Stable Version](https://poser.pugx.org/phpunit/php-timer/v/stable.png)](https://packagist.org/packages/phpunit/php-timer) -[![CI Status](https://github.com/sebastianbergmann/php-timer/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/php-timer/actions) -[![Type Coverage](https://shepherd.dev/github/sebastianbergmann/php-timer/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/php-timer) -[![codecov](https://codecov.io/gh/sebastianbergmann/php-timer/branch/main/graph/badge.svg)](https://codecov.io/gh/sebastianbergmann/php-timer) - -Utility class for timing things, factored out of PHPUnit into a stand-alone component. - -## Installation - -You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - -``` -composer require phpunit/php-timer -``` - -If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - -``` -composer require --dev phpunit/php-timer -``` - -## Usage - -### Basic Timing - -```php -require __DIR__ . '/vendor/autoload.php'; - -use SebastianBergmann\Timer\Timer; - -$timer = new Timer; - -$timer->start(); - -foreach (\range(0, 100000) as $i) { - // ... -} - -$duration = $timer->stop(); - -var_dump(get_class($duration)); -var_dump($duration->asString()); -var_dump($duration->asSeconds()); -var_dump($duration->asMilliseconds()); -var_dump($duration->asMicroseconds()); -var_dump($duration->asNanoseconds()); -``` - -The code above yields the output below: - -``` -string(32) "SebastianBergmann\Timer\Duration" -string(9) "00:00.002" -float(0.002851062) -float(2.851062) -float(2851.062) -int(2851062) -``` - -### Resource Consumption - -#### Explicit duration - -```php -require __DIR__ . '/vendor/autoload.php'; - -use SebastianBergmann\Timer\ResourceUsageFormatter; -use SebastianBergmann\Timer\Timer; - -$timer = new Timer; -$timer->start(); - -foreach (\range(0, 100000) as $i) { - // ... -} - -print (new ResourceUsageFormatter)->resourceUsage($timer->stop()); -``` - -The code above yields the output below: - -``` -Time: 00:00.002, Memory: 6.00 MB -``` - -#### Duration since PHP Startup (using unreliable `$_SERVER['REQUEST_TIME_FLOAT']`) - -```php -require __DIR__ . '/vendor/autoload.php'; - -use SebastianBergmann\Timer\ResourceUsageFormatter; - -foreach (\range(0, 100000) as $i) { - // ... -} - -print (new ResourceUsageFormatter)->resourceUsageSinceStartOfRequest(); -``` - -The code above yields the output below: - -``` -Time: 00:00.002, Memory: 6.00 MB -``` diff --git a/vendor/phpunit/php-timer/SECURITY.md b/vendor/phpunit/php-timer/SECURITY.md deleted file mode 100644 index d4ee967..0000000 --- a/vendor/phpunit/php-timer/SECURITY.md +++ /dev/null @@ -1,9 +0,0 @@ -# Security Policy - -This library is intended to be used in development environments only. For instance, it is used by the testing framework PHPUnit. There is no reason why this library should be installed on a webserver. - -**If you upload this library to a webserver then your deployment process is broken. On a more general note, if your `vendor` directory is publicly accessible on your webserver then your deployment process is also broken.** - -## Security Contact Information - -After the above, if you still would like to report a security vulnerability, please email `sebastian@phpunit.de`. diff --git a/vendor/phpunit/php-timer/composer.json b/vendor/phpunit/php-timer/composer.json deleted file mode 100644 index 6f5880b..0000000 --- a/vendor/phpunit/php-timer/composer.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "name": "phpunit/php-timer", - "description": "Utility class for timing", - "type": "library", - "keywords": [ - "timer" - ], - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues" - }, - "prefer-stable": true, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "config": { - "platform": { - "php": "8.1.0" - }, - "optimize-autoloader": true, - "sort-packages": true - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "extra": { - "branch-alias": { - "dev-main": "6.0-dev" - } - } -} - diff --git a/vendor/phpunit/php-timer/src/Duration.php b/vendor/phpunit/php-timer/src/Duration.php deleted file mode 100644 index ef3f3be..0000000 --- a/vendor/phpunit/php-timer/src/Duration.php +++ /dev/null @@ -1,90 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Timer; - -use function floor; -use function sprintf; - -/** - * @psalm-immutable - */ -final class Duration -{ - private readonly float $nanoseconds; - private readonly int $hours; - private readonly int $minutes; - private readonly int $seconds; - private readonly int $milliseconds; - - public static function fromMicroseconds(float $microseconds): self - { - return new self($microseconds * 1000); - } - - public static function fromNanoseconds(float $nanoseconds): self - { - return new self($nanoseconds); - } - - private function __construct(float $nanoseconds) - { - $this->nanoseconds = $nanoseconds; - $timeInMilliseconds = $nanoseconds / 1000000; - $hours = floor($timeInMilliseconds / 60 / 60 / 1000); - $hoursInMilliseconds = $hours * 60 * 60 * 1000; - $minutes = floor($timeInMilliseconds / 60 / 1000) % 60; - $minutesInMilliseconds = $minutes * 60 * 1000; - $seconds = floor(($timeInMilliseconds - $hoursInMilliseconds - $minutesInMilliseconds) / 1000); - $secondsInMilliseconds = $seconds * 1000; - $milliseconds = $timeInMilliseconds - $hoursInMilliseconds - $minutesInMilliseconds - $secondsInMilliseconds; - $this->hours = (int) $hours; - $this->minutes = $minutes; - $this->seconds = (int) $seconds; - $this->milliseconds = (int) $milliseconds; - } - - public function asNanoseconds(): float - { - return $this->nanoseconds; - } - - public function asMicroseconds(): float - { - return $this->nanoseconds / 1000; - } - - public function asMilliseconds(): float - { - return $this->nanoseconds / 1000000; - } - - public function asSeconds(): float - { - return $this->nanoseconds / 1000000000; - } - - public function asString(): string - { - $result = ''; - - if ($this->hours > 0) { - $result = sprintf('%02d', $this->hours) . ':'; - } - - $result .= sprintf('%02d', $this->minutes) . ':'; - $result .= sprintf('%02d', $this->seconds); - - if ($this->milliseconds > 0) { - $result .= '.' . sprintf('%03d', $this->milliseconds); - } - - return $result; - } -} diff --git a/vendor/phpunit/php-timer/src/ResourceUsageFormatter.php b/vendor/phpunit/php-timer/src/ResourceUsageFormatter.php deleted file mode 100644 index 0c94b9b..0000000 --- a/vendor/phpunit/php-timer/src/ResourceUsageFormatter.php +++ /dev/null @@ -1,73 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Timer; - -use function is_float; -use function memory_get_peak_usage; -use function microtime; -use function sprintf; - -final class ResourceUsageFormatter -{ - /** - * @psalm-var array - */ - private const SIZES = [ - 'GB' => 1073741824, - 'MB' => 1048576, - 'KB' => 1024, - ]; - - public function resourceUsage(Duration $duration): string - { - return sprintf( - 'Time: %s, Memory: %s', - $duration->asString(), - $this->bytesToString(memory_get_peak_usage(true)) - ); - } - - /** - * @throws TimeSinceStartOfRequestNotAvailableException - */ - public function resourceUsageSinceStartOfRequest(): string - { - if (!isset($_SERVER['REQUEST_TIME_FLOAT'])) { - throw new TimeSinceStartOfRequestNotAvailableException( - 'Cannot determine time at which the request started because $_SERVER[\'REQUEST_TIME_FLOAT\'] is not available' - ); - } - - if (!is_float($_SERVER['REQUEST_TIME_FLOAT'])) { - throw new TimeSinceStartOfRequestNotAvailableException( - 'Cannot determine time at which the request started because $_SERVER[\'REQUEST_TIME_FLOAT\'] is not of type float' - ); - } - - return $this->resourceUsage( - Duration::fromMicroseconds( - (1000000 * (microtime(true) - $_SERVER['REQUEST_TIME_FLOAT'])) - ) - ); - } - - private function bytesToString(int $bytes): string - { - foreach (self::SIZES as $unit => $value) { - if ($bytes >= $value) { - return sprintf('%.2f %s', $bytes / $value, $unit); - } - } - - // @codeCoverageIgnoreStart - return $bytes . ' byte' . ($bytes !== 1 ? 's' : ''); - // @codeCoverageIgnoreEnd - } -} diff --git a/vendor/phpunit/php-timer/src/Timer.php b/vendor/phpunit/php-timer/src/Timer.php deleted file mode 100644 index ead2618..0000000 --- a/vendor/phpunit/php-timer/src/Timer.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Timer; - -use function array_pop; -use function hrtime; - -final class Timer -{ - /** - * @psalm-var list - */ - private array $startTimes = []; - - public function start(): void - { - $this->startTimes[] = (float) hrtime(true); - } - - /** - * @throws NoActiveTimerException - */ - public function stop(): Duration - { - if (empty($this->startTimes)) { - throw new NoActiveTimerException( - 'Timer::start() has to be called before Timer::stop()' - ); - } - - return Duration::fromNanoseconds((float) hrtime(true) - array_pop($this->startTimes)); - } -} diff --git a/vendor/phpunit/php-timer/src/exceptions/Exception.php b/vendor/phpunit/php-timer/src/exceptions/Exception.php deleted file mode 100644 index 996da08..0000000 --- a/vendor/phpunit/php-timer/src/exceptions/Exception.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Timer; - -use Throwable; - -interface Exception extends Throwable -{ -} diff --git a/vendor/phpunit/php-timer/src/exceptions/NoActiveTimerException.php b/vendor/phpunit/php-timer/src/exceptions/NoActiveTimerException.php deleted file mode 100644 index 40fe45e..0000000 --- a/vendor/phpunit/php-timer/src/exceptions/NoActiveTimerException.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Timer; - -use LogicException; - -final class NoActiveTimerException extends LogicException implements Exception -{ -} diff --git a/vendor/phpunit/php-timer/src/exceptions/TimeSinceStartOfRequestNotAvailableException.php b/vendor/phpunit/php-timer/src/exceptions/TimeSinceStartOfRequestNotAvailableException.php deleted file mode 100644 index a2d94ce..0000000 --- a/vendor/phpunit/php-timer/src/exceptions/TimeSinceStartOfRequestNotAvailableException.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Timer; - -use RuntimeException; - -final class TimeSinceStartOfRequestNotAvailableException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/ChangeLog-10.5.md b/vendor/phpunit/phpunit/ChangeLog-10.5.md deleted file mode 100644 index 0abe098..0000000 --- a/vendor/phpunit/phpunit/ChangeLog-10.5.md +++ /dev/null @@ -1,593 +0,0 @@ -# Changes in PHPUnit 10.5 - -All notable changes of the PHPUnit 10.5 release series are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. - -## [10.5.63] - 2026-01-27 - -### Fixed - -* Regression introduced in PHPUnit 9.6.33 - -## [10.5.62] - 2026-01-27 - -### Changed - -* To prevent Poisoned Pipeline Execution (PPE) attacks using prepared `.coverage` files in pull requests, a PHPT test will no longer be run if the temporary file for writing code coverage information already exists before the test runs - -## [10.5.61] - 2026-01-24 - -### Changed - -* `PHPUnit\Framework\MockObject` exceptions are now subtypes of `PHPUnit\Exception` - -## [10.5.60] - 2025-12-06 - -* No changes; `phpunit.phar` rebuilt with PHP 8.4 to work around PHP-Scoper issue [#1139](https://github.com/humbug/php-scoper/issues/1139) - -## [10.5.59] - 2025-12-01 - -### Changed - -* [#6338](https://github.com/sebastianbergmann/phpunit/pull/6338): Removed code from `PHPUnit\Runner\TestSuiteSorter` that was only used in the tests for this class -* Updated list of deprecated PHP configuration settings for PHP 8.4, PHP 8.5, and PHP 8.6 - -## [10.5.58] - 2025-09-28 - -### Fixed - -* [#6368](https://github.com/sebastianbergmann/phpunit/issues/6368): `failOnPhpunitWarning="false"` has no effect - -## [10.5.57] - 2025-09-24 - -* No changes; `phpunit.phar` rebuilt with updated dependencies - -## [10.5.56] - 2025-09-23 - -* No changes; `phpunit.phar` rebuilt with updated dependencies - -## [10.5.55] - 2025-09-14 - -### Changed - -* [#6366](https://github.com/sebastianbergmann/phpunit/issues/6366): Exclude `__sleep()` and `__wakeup()` from test double code generation on PHP >= 8.5 - -## [10.5.54] - 2025-09-11 - -### Changed - -* Do not use `__sleep()` method (which will be deprecated in PHP 8.5) - -## [10.5.53] - 2025-08-20 - -### Changed - -* Do not configure `report_memleaks` setting (which will be deprecated in PHP 8.5) for PHPT processes - -## [10.5.52] - 2025-08-16 - -### Changed - -* [#6321](https://github.com/sebastianbergmann/phpunit/issues/6321): Allow `error_reporting=E_ALL` for `--check-php-configuration` - -## [10.5.51] - 2025-08-12 - -### Changed - -* [#6308](https://github.com/sebastianbergmann/phpunit/pull/6308): Improve output of `--check-php-configuration` -* The version number for the test result cache file has been incremented to reflect that its structure for PHPUnit 10.5 is not compatible with its structure for PHPUnit 8.5 and PHPUnit 9.6 - -## [10.5.50] - 2025-08-10 - -### Changed - -* [#6300](https://github.com/sebastianbergmann/phpunit/issues/6300): Emit warning when the name of a data provider method begins with `test` -* Do not use `SplObjectStorage` methods that will be deprecated in PHP 8.5 - -## [10.5.49] - 2025-08-09 - -### Added - -* [#6297](https://github.com/sebastianbergmann/phpunit/issues/6297): `--check-php-configuration` CLI option for checking whether PHP is configured for testing - -### Fixed - -* Errors due to invalid data provided using `#[TestWith]` or `#[TestWithJson]` attributes are now properly reported - -## [10.5.48] - 2025-07-11 - -### Fixed - -* [#6254](https://github.com/sebastianbergmann/phpunit/issues/6254): `defects,random`configuration is supported by implementation, but it is not allowed by the XML configuration file schema - -## [10.5.47] - 2025-06-20 - -### Added - -* [#6236](https://github.com/sebastianbergmann/phpunit/issues/6236): `failOnPhpunitWarning` attribute on the `` element of the XML configuration file and `--fail-on-phpunit-warning` CLI option for controlling whether PHPUnit should fail on PHPUnit warnings (default: `true`) -* [#6239](https://github.com/sebastianbergmann/phpunit/issues/6239): `--do-not-fail-on-deprecation`, `--do-not-fail-on-phpunit-warning`, `--do-not-fail-on-phpunit-deprecation`, `--do-not-fail-on-empty-test-suite`, `--do-not-fail-on-incomplete`, `--do-not-fail-on-notice`, `--do-not-fail-on-risky`, `--do-not-fail-on-skipped`, and `--do-not-fail-on-warning` CLI options -* `--do-not-report-useless-tests` CLI option as a replacement for `--dont-report-useless-tests` - -### Deprecated - -* `--dont-report-useless-tests` CLI option (use `--do-not-report-useless-tests` instead) - -### Fixed - -* [#6243](https://github.com/sebastianbergmann/phpunit/issues/6243): Constraints cannot be implemented without using internal class `ExpectationFailedException` - -## [10.5.46] - 2025-05-02 - -### Added - -* `displayDetailsOnAllIssues` attribute on the `` element of the XML configuration file and `--display-all-issues` CLI option for controlling whether PHPUnit should display details on all issues that are triggered (default: `false`) -* `failOnAllIssues` attribute on the `` element of the XML configuration file and `--fail-on-all-issues` CLI option for controlling whether PHPUnit should fail on all issues that are triggered (default: `false`) - -### Changed - -* [#5956](https://github.com/sebastianbergmann/phpunit/issues/5956): Improved handling of deprecated `E_STRICT` constant -* Improved message when test is considered risky for printing unexpected output - -## [10.5.45] - 2025-02-06 - -### Changed - -* [#6117](https://github.com/sebastianbergmann/phpunit/issues/6117): Include source location information for issues triggered during test in `--debug` output -* [#6119](https://github.com/sebastianbergmann/phpunit/issues/6119): Improve message for errors that occur while parsing attributes - -## [10.5.44] - 2025-01-31 - -### Fixed - -* [#6115](https://github.com/sebastianbergmann/phpunit/issues/6115): Backed enumerations with values not of type `string` cannot be used in customized TestDox output - -## [10.5.43] - 2025-01-29 - -### Changed - -* Do not skip execution of test that depends on a test that is larger than itself - -## [10.5.42] - 2025-01-28 - -### Fixed - -* [#6103](https://github.com/sebastianbergmann/phpunit/issues/6103): Output from test run in separate process is printed twice -* [#6109](https://github.com/sebastianbergmann/phpunit/issues/6109): Skipping a test in a before-class method crashes JUnit XML logger -* [#6111](https://github.com/sebastianbergmann/phpunit/issues/6111): Deprecations cause `SourceMapper` to scan all `` files - -## [10.5.41] - 2025-01-13 - -### Added - -* `Test\AfterLastTestMethodErrored`, `Test\AfterTestMethodErrored`, `Test\BeforeTestMethodErrored`, `Test\PostConditionErrored`, and `Test\PreConditionErrored` events - -### Fixed - -* [#6094](https://github.com/sebastianbergmann/phpunit/issues/6094): Errors in after-last-test methods are not reported -* [#6095](https://github.com/sebastianbergmann/phpunit/issues/6095): Expectation is not counted correctly when a doubled method is called more often than is expected -* [#6098](https://github.com/sebastianbergmann/phpunit/issues/6098): No `system-out` element in JUnit XML logfile - -## [10.5.40] - 2024-12-21 - -### Fixed - -* [#6082](https://github.com/sebastianbergmann/phpunit/issues/6082): `assertArrayHasKey()`, `assertArrayNotHasKey()`, `arrayHasKey()`, and `ArrayHasKey::__construct()` do not support all possible key types -* [#6087](https://github.com/sebastianbergmann/phpunit/issues/6087): `--migrate-configuration` does not remove `beStrictAboutTodoAnnotatedTests` attribute from XML configuration file - -## [10.5.39] - 2024-12-11 - -### Added - -* [#6081](https://github.com/sebastianbergmann/phpunit/pull/6081): `DefaultResultCache::mergeWith()` for merging result cache instances - -### Fixed - -* [#6066](https://github.com/sebastianbergmann/phpunit/pull/6066): TeamCity logger does not handle error/skipped events in before-class methods correctly - -## [10.5.38] - 2024-10-28 - -### Changed - -* [#6012](https://github.com/sebastianbergmann/phpunit/pull/6012): Remove empty lines between TeamCity events - -## [10.5.37] - 2024-10-19 - -### Fixed - -* [#5982](https://github.com/sebastianbergmann/phpunit/pull/5982): Typo in exception message - -## [10.5.36] - 2024-10-08 - -### Changed - -* [#5957](https://github.com/sebastianbergmann/phpunit/pull/5957): Skip data provider build when requirements are not satisfied -* [#5969](https://github.com/sebastianbergmann/phpunit/pull/5969): Check for requirements before creating a separate process -* Updated regular expressions used by `StringMatchesFormatDescription` constraint to be consistent with PHP's `run-tests.php` - -### Fixed - -* [#5965](https://github.com/sebastianbergmann/phpunit/issues/5965): `PHPUnit\Framework\Exception` does not handle string error codes (`PDOException` with error code `'HY000'`, for example) - -## [10.5.35] - 2024-09-19 - -### Changed - -* [#5956](https://github.com/sebastianbergmann/phpunit/issues/5956): Deprecation of the `E_STRICT` constant in PHP 8.4 - -### Fixed - -* [#5950](https://github.com/sebastianbergmann/phpunit/pull/5950): TestDox text should not be `trim()`med when it contains `$` character -* The attribute parser will no longer try to instantiate attribute classes that do not exist - -## [10.5.34] - 2024-09-13 - -### Fixed - -* [#5931](https://github.com/sebastianbergmann/phpunit/pull/5931): Reverted addition of `name` property on `` element in JUnit XML logfile -* [#5946](https://github.com/sebastianbergmann/phpunit/issues/5946): `Callback` throws a `TypeError` when checking a `callable` has variadic parameters - -## [10.5.33] - 2024-09-09 - -### Fixed - -* [#4584](https://github.com/sebastianbergmann/phpunit/issues/4584): `assertJsonStringEqualsJsonString()` considers objects with sequential numeric keys equal to be arrays -* [#4625](https://github.com/sebastianbergmann/phpunit/issues/4625): Generator yielding keys that are neither integer or string leads to hard-to-understand error message when used as data provider -* [#4674](https://github.com/sebastianbergmann/phpunit/issues/4674): JSON assertions should treat objects as unordered -* [#5891](https://github.com/sebastianbergmann/phpunit/issues/5891): `Callback` constraint does not handle variadic arguments correctly when used for mock object expectations -* [#5929](https://github.com/sebastianbergmann/phpunit/issues/5929): TestDox output containing `$` at the beginning gets truncated when used with a data provider - -## [10.5.32] - 2024-09-04 - -### Added - -* [#5937](https://github.com/sebastianbergmann/phpunit/issues/5937): `failOnPhpunitDeprecation` attribute on the `` element of the XML configuration file and `--fail-on-phpunit-deprecation` CLI option for controlling whether PHPUnit deprecations should be considered when determining the test runner's shell exit code (default: do not consider) -* `displayDetailsOnPhpunitDeprecations` attribute on the `` element of the XML configuration file and `--display-phpunit-deprecations` CLI option for controlling whether details on PHPUnit deprecations should be displayed (default: do not display) - -### Changed - -* [#5937](https://github.com/sebastianbergmann/phpunit/issues/5937): PHPUnit deprecations will, by default, no longer affect the test runner's shell exit code. This can optionally be turned back on using the `--fail-on-phpunit-deprecation` CLI option or the `failOnPhpunitDeprecation="true"` attribute on the `` element of the XML configuration file. -* Details for PHPUnit deprecations will, by default, no longer be displayed. This can optionally be turned back on using the `--display-phpunit-deprecations` CLI option or the `displayDetailsOnPhpunitDeprecations` attribute on the `` element of the XML configuration file. - -## [10.5.31] - 2024-09-03 - -### Changed - -* [#5931](https://github.com/sebastianbergmann/phpunit/pull/5931): `name` property on `` element in JUnit XML logfile -* Removed `.phpstorm.meta.php` file as methods such as `TestCase::createStub()` use generics / template types for their return types and PhpStorm, for example, uses that information - -### Fixed - -* [#5884](https://github.com/sebastianbergmann/phpunit/issues/5884): TestDox printer does not consider that issues can be suppressed by attribute, baseline, source location, or `@` operator - -## [10.5.30] - 2024-08-13 - -### Changed - -* Improved error message when stubbed method is called more often than return values were configured for it - -## [10.5.29] - 2024-07-30 - -### Fixed - -* [#5887](https://github.com/sebastianbergmann/phpunit/pull/5887): Issue baseline generator does not correctly handle ignoring suppressed issues -* [#5908](https://github.com/sebastianbergmann/phpunit/issues/5908): `--list-tests` and `--list-tests-xml` CLI options do not report error when data provider method throws exception - -## [10.5.28] - 2024-07-18 - -### Fixed - -* [#5898](https://github.com/sebastianbergmann/phpunit/issues/5898): `Test\Passed` event is not emitted for PHPT tests -* `--coverage-filter` CLI option could not be used multiple times - -## [10.5.27] - 2024-07-10 - -### Changed - -* Updated dependencies (so that users that install using Composer's `--prefer-lowest` CLI option also get recent versions) - -### Fixed - -* [#5892](https://github.com/sebastianbergmann/phpunit/issues/5892): Errors during write of `phpunit.xml` are not handled correctly when `--generate-configuration` is used - -## [10.5.26] - 2024-07-08 - -### Added - -* `--only-summary-for-coverage-text` CLI option to reduce the code coverage report in text format to a summary -* `--show-uncovered-for-coverage-text` CLI option to expand the code coverage report in text format to include a list of uncovered files - -## [10.5.25] - 2024-07-03 - -### Changed - -* Updated dependencies for PHAR distribution - -## [10.5.24] - 2024-06-20 - -### Changed - -* [#5877](https://github.com/sebastianbergmann/phpunit/pull/5877): Use `array_pop()` instead of `array_shift()` for processing `Test` objects in `TestSuite::run()` and optimize `TestSuite::isEmpty()` - -## [10.5.23] - 2024-06-20 - -### Changed - -* [#5875](https://github.com/sebastianbergmann/phpunit/pull/5875): Also destruct `TestCase` objects early that use a data provider - -## [10.5.22] - 2024-06-19 - -### Changed - -* [#5871](https://github.com/sebastianbergmann/phpunit/pull/5871): Do not collect unnecessary information using `debug_backtrace()` - -## [10.5.21] - 2024-06-15 - -### Changed - -* [#5861](https://github.com/sebastianbergmann/phpunit/pull/5861): Destroy `TestCase` object after its test was run - -## [10.5.20] - 2024-04-24 - -* [#5771](https://github.com/sebastianbergmann/phpunit/issues/5771): JUnit XML logger may crash when test that is run in separate process exits unexpectedly -* [#5819](https://github.com/sebastianbergmann/phpunit/issues/5819): Duplicate keys from different data providers are not handled properly - -## [10.5.19] - 2024-04-17 - -### Fixed - -* [#5818](https://github.com/sebastianbergmann/phpunit/issues/5818): Calling `method()` on a test stub created using `createStubForIntersectionOfInterfaces()` throws an unexpected exception - -## [10.5.18] - 2024-04-14 - -### Deprecated - -* [#5812](https://github.com/sebastianbergmann/phpunit/pull/5812): Support for string array keys in data sets returned by data provider methods that do not match the parameter names of the test method(s) that use(s) them - -### Fixed - -* [#5795](https://github.com/sebastianbergmann/phpunit/issues/5795): Using `@testWith` annotation may generate `PHP Warning: Uninitialized string offset 0` - -## [10.5.17] - 2024-04-05 - -### Changed - -* The namespaces of dependencies are now prefixed with `PHPUnitPHAR` instead of just `PHPUnit` for the PHAR distribution of PHPUnit - -## [10.5.16] - 2024-03-28 - -### Changed - -* [#5766](https://github.com/sebastianbergmann/phpunit/pull/5766): Do not use a shell in `proc_open()` if not really needed -* [#5772](https://github.com/sebastianbergmann/phpunit/pull/5772): Cleanup process handling after dropping temp-file handling - -### Fixed - -* [#5570](https://github.com/sebastianbergmann/phpunit/pull/5570): Windows does not support exclusive locks on stdout - -## [10.5.15] - 2024-03-22 - -### Fixed - -* [#5765](https://github.com/sebastianbergmann/phpunit/pull/5765): Be more forgiving with error handlers that do not respect error suppression - -## [10.5.14] - 2024-03-21 - -### Changed - -* [#5747](https://github.com/sebastianbergmann/phpunit/pull/5747): Cache result of `Groups::groups()` -* [#5748](https://github.com/sebastianbergmann/phpunit/pull/5748): Improve performance of `NamePrettifier::prettifyTestMethodName()` -* [#5750](https://github.com/sebastianbergmann/phpunit/pull/5750): Micro-optimize `NamePrettifier::prettifyTestMethodName()` once again - -### Fixed - -* [#5760](https://github.com/sebastianbergmann/phpunit/issues/5760): TestDox printer does not display details about exceptions raised in before-test methods - -## [10.5.13] - 2024-03-12 - -### Changed - -* [#5727](https://github.com/sebastianbergmann/phpunit/pull/5727): Prevent duplicate call of `NamePrettifier::prettifyTestMethodName()` -* [#5739](https://github.com/sebastianbergmann/phpunit/pull/5739): Micro-optimize `NamePrettifier::prettifyTestMethodName()` -* [#5740](https://github.com/sebastianbergmann/phpunit/pull/5740): Micro-optimize `TestRunner::runTestWithTimeout()` -* [#5741](https://github.com/sebastianbergmann/phpunit/pull/5741): Save call to `Telemetry\System::snapshot()` -* [#5742](https://github.com/sebastianbergmann/phpunit/pull/5742): Prevent file IO when not strictly necessary -* [#5743](https://github.com/sebastianbergmann/phpunit/pull/5743): Prevent unnecessary `ExecutionOrderDependency::getTarget()` call -* [#5744](https://github.com/sebastianbergmann/phpunit/pull/5744): Simplify `NamePrettifier::prettifyTestMethodName()` - -### Fixed - -* [#5351](https://github.com/sebastianbergmann/phpunit/issues/5351): Incorrect code coverage metadata does not prevent code coverage data from being collected -* [#5746](https://github.com/sebastianbergmann/phpunit/issues/5746): Using `-d` CLI option multiple times triggers warning - -## [10.5.12] - 2024-03-09 - -### Fixed - -* [#5652](https://github.com/sebastianbergmann/phpunit/issues/5652): `HRTime::duration()` throws `InvalidArgumentException` - -## [10.5.11] - 2024-02-25 - -### Fixed - -* [#5704](https://github.com/sebastianbergmann/phpunit/issues/5704#issuecomment-1951105254): No warning when CLI options are used multiple times -* [#5707](https://github.com/sebastianbergmann/phpunit/issues/5707): `--fail-on-empty-test-suite` CLI option is not documented in `--help` output -* No warning when the `#[CoversClass]` and `#[UsesClass]` attributes are used with the name of an interface -* Resource usage information is printed when the `--debug` CLI option is used - -## [10.5.10] - 2024-02-04 - -### Changed - -* Improve output of `--check-version` CLI option -* Improve description of `--check-version` CLI option - -### Fixed - -* [#5692](https://github.com/sebastianbergmann/phpunit/issues/5692): `--log-events-text` and `--log-events-verbose-text` require the destination file to exit - -## [10.5.9] - 2024-01-22 - -### Changed - -* Show help for `--manifest`, `--sbom`, and `--composer-lock` when the PHAR is used - -### Fixed - -* [#5676](https://github.com/sebastianbergmann/phpunit/issues/5676): PHPUnit's test runner overwrites custom error handler registered using `set_error_handler()` in bootstrap script - -## [10.5.8] - 2024-01-19 - -### Fixed - -* [#5673](https://github.com/sebastianbergmann/phpunit/issues/5673): Confusing error message when migration of a configuration is requested that does not need to be migrated - -## [10.5.7] - 2024-01-14 - -### Fixed - -* [#5662](https://github.com/sebastianbergmann/phpunit/issues/5662): PHPUnit errors out on startup when the `ctype` extension is not loaded but a polyfill for it was installed - -## [10.5.6] - 2024-01-13 - -### Added - -* Added the `--debug` CLI option as an alias for `--no-output --log-events-text php://stdout` - -### Fixed - -* [#5455](https://github.com/sebastianbergmann/phpunit/issues/5455): `willReturnCallback()` does not pass unknown named variadic arguments to callback -* [#5488](https://github.com/sebastianbergmann/phpunit/issues/5488): Details about tests that are considered risky are not displayed when the TestDox result printer is used -* [#5516](https://github.com/sebastianbergmann/phpunit/issues/5516): Assertions that use the `LogicalNot` constraint (`assertNotEquals()`, `assertStringNotContainsString()`, ...) can generate confusing failure messages -* [#5518](https://github.com/sebastianbergmann/phpunit/issues/5518): Details about deprecations, notices, and warnings are not displayed when the TestDox result printer is used -* [#5574](https://github.com/sebastianbergmann/phpunit/issues/5574): Wrong backtrace line is reported -* [#5633](https://github.com/sebastianbergmann/phpunit/pull/5633): `--log-events-text` and `--log-events-verbose-text` CLI options do not handle absolute and relative paths -* [#5634](https://github.com/sebastianbergmann/phpunit/pull/5634): Exceptions in the destructor of a test double are ignored -* [#5641](https://github.com/sebastianbergmann/phpunit/issues/5641): The `TestSuite` value object returned by `TestSuite\Filtered::testSuite()` contains all tests instead of only the filtered tests - -## [10.5.5] - 2023-12-27 - -### Fixed - -* [#5619](https://github.com/sebastianbergmann/phpunit/pull/5619): Reverted change introduced in PHPUnit 10.5.4 that broke backward compatibility - -## [10.5.4] - 2023-12-27 - -### Fixed - -* [#5592](https://github.com/sebastianbergmann/phpunit/issues/5592): Error Handler prevents `error_get_last()` usage in tests -* [#5592](https://github.com/sebastianbergmann/phpunit/issues/5592): `E_USER_ERROR` does not abort test execution -* [#5612](https://github.com/sebastianbergmann/phpunit/issues/5612): Empty `` element in XML configuration after migrating configuration -* [#5616](https://github.com/sebastianbergmann/phpunit/issues/5616): Values from data provider are not shown for failed test -* [#5619](https://github.com/sebastianbergmann/phpunit/pull/5619): Check and restore error/exception global handlers -* [#5621](https://github.com/sebastianbergmann/phpunit/issues/5621): Name of data set is missing from TeamCity output - -## [10.5.3] - 2023-12-13 - -### Changed - -* Make PHAR build reproducible (the only remaining differences were in the timestamps for the files in the PHAR) - -### Deprecated - -* `Test\AssertionFailed` and `Test\AssertionSucceeded` events -* `PHPUnit\Runner\Extension\Facade::requireExportOfObjects()` and `PHPUnit\Runner\Extension\Facade::requiresExportOfObjects()` -* `registerMockObjectsFromTestArgumentsRecursively` attribute on the `` element of the XML configuration file -* `PHPUnit\TextUI\Configuration\Configuration::registerMockObjectsFromTestArgumentsRecursively()` - -### Fixed - -* [#5614](https://github.com/sebastianbergmann/phpunit/issues/5614): Infinite recursion when data provider provides recursive array - -## [10.5.2] - 2023-12-05 - -### Fixed - -* [#5561](https://github.com/sebastianbergmann/phpunit/issues/5561): JUnit XML logger does not handle assertion failures in before-test methods -* [#5567](https://github.com/sebastianbergmann/phpunit/issues/5567): Infinite recursion when recursive / self-referencing arrays are checked whether they contain only scalar values - -## [10.5.1] - 2023-12-01 - -### Fixed - -* [#5593](https://github.com/sebastianbergmann/phpunit/issues/5593): Return Value Generator fails to correctly create test stub for method with `static` return type declaration when used recursively -* [#5596](https://github.com/sebastianbergmann/phpunit/issues/5596): `PHPUnit\Framework\TestCase` has `@internal` annotation in PHAR - -## [10.5.0] - 2023-12-01 - -### Added - -* [#5532](https://github.com/sebastianbergmann/phpunit/issues/5532): `#[IgnoreDeprecations]` attribute to ignore `E_(USER_)DEPRECATED` issues on test class and test method level -* [#5551](https://github.com/sebastianbergmann/phpunit/issues/5551): Support for omitting parameter default values for `willReturnMap()` -* [#5577](https://github.com/sebastianbergmann/phpunit/issues/5577): `--composer-lock` CLI option for PHAR binary that displays the `composer.lock` used to build the PHAR - -### Changed - -* `MockBuilder::disableAutoReturnValueGeneration()` and `MockBuilder::enableAutoReturnValueGeneration()` are no longer deprecated - -### Fixed - -* [#5563](https://github.com/sebastianbergmann/phpunit/issues/5563): `createMockForIntersectionOfInterfaces()` does not automatically register mock object for expectation verification - -[10.5.63]: https://github.com/sebastianbergmann/phpunit/compare/10.5.62...10.5.63 -[10.5.62]: https://github.com/sebastianbergmann/phpunit/compare/10.5.61...10.5.62 -[10.5.61]: https://github.com/sebastianbergmann/phpunit/compare/10.5.60...10.5.61 -[10.5.60]: https://github.com/sebastianbergmann/phpunit/compare/10.5.59...10.5.60 -[10.5.59]: https://github.com/sebastianbergmann/phpunit/compare/10.5.58...10.5.59 -[10.5.58]: https://github.com/sebastianbergmann/phpunit/compare/10.5.57...10.5.58 -[10.5.57]: https://github.com/sebastianbergmann/phpunit/compare/10.5.56...10.5.57 -[10.5.56]: https://github.com/sebastianbergmann/phpunit/compare/10.5.55...10.5.56 -[10.5.55]: https://github.com/sebastianbergmann/phpunit/compare/10.5.54...10.5.55 -[10.5.54]: https://github.com/sebastianbergmann/phpunit/compare/10.5.53...10.5.54 -[10.5.53]: https://github.com/sebastianbergmann/phpunit/compare/10.5.52...10.5.53 -[10.5.52]: https://github.com/sebastianbergmann/phpunit/compare/10.5.51...10.5.52 -[10.5.51]: https://github.com/sebastianbergmann/phpunit/compare/10.5.50...10.5.51 -[10.5.50]: https://github.com/sebastianbergmann/phpunit/compare/10.5.49...10.5.50 -[10.5.49]: https://github.com/sebastianbergmann/phpunit/compare/10.5.48...10.5.49 -[10.5.48]: https://github.com/sebastianbergmann/phpunit/compare/10.5.47...10.5.48 -[10.5.47]: https://github.com/sebastianbergmann/phpunit/compare/10.5.46...10.5.47 -[10.5.46]: https://github.com/sebastianbergmann/phpunit/compare/10.5.45...10.5.46 -[10.5.45]: https://github.com/sebastianbergmann/phpunit/compare/10.5.44...10.5.45 -[10.5.44]: https://github.com/sebastianbergmann/phpunit/compare/10.5.43...10.5.44 -[10.5.43]: https://github.com/sebastianbergmann/phpunit/compare/10.5.42...10.5.43 -[10.5.42]: https://github.com/sebastianbergmann/phpunit/compare/10.5.41...10.5.42 -[10.5.41]: https://github.com/sebastianbergmann/phpunit/compare/10.5.40...10.5.41 -[10.5.40]: https://github.com/sebastianbergmann/phpunit/compare/10.5.39...10.5.40 -[10.5.39]: https://github.com/sebastianbergmann/phpunit/compare/10.5.38...10.5.39 -[10.5.38]: https://github.com/sebastianbergmann/phpunit/compare/10.5.37...10.5.38 -[10.5.37]: https://github.com/sebastianbergmann/phpunit/compare/10.5.36...10.5.37 -[10.5.36]: https://github.com/sebastianbergmann/phpunit/compare/10.5.35...10.5.36 -[10.5.35]: https://github.com/sebastianbergmann/phpunit/compare/10.5.34...10.5.35 -[10.5.34]: https://github.com/sebastianbergmann/phpunit/compare/10.5.33...10.5.34 -[10.5.33]: https://github.com/sebastianbergmann/phpunit/compare/10.5.32...10.5.33 -[10.5.32]: https://github.com/sebastianbergmann/phpunit/compare/10.5.31...10.5.32 -[10.5.31]: https://github.com/sebastianbergmann/phpunit/compare/10.5.30...10.5.31 -[10.5.30]: https://github.com/sebastianbergmann/phpunit/compare/10.5.29...10.5.30 -[10.5.29]: https://github.com/sebastianbergmann/phpunit/compare/10.5.28...10.5.29 -[10.5.28]: https://github.com/sebastianbergmann/phpunit/compare/10.5.27...10.5.28 -[10.5.27]: https://github.com/sebastianbergmann/phpunit/compare/10.5.26...10.5.27 -[10.5.26]: https://github.com/sebastianbergmann/phpunit/compare/10.5.25...10.5.26 -[10.5.25]: https://github.com/sebastianbergmann/phpunit/compare/10.5.24...10.5.25 -[10.5.24]: https://github.com/sebastianbergmann/phpunit/compare/10.5.23...10.5.24 -[10.5.23]: https://github.com/sebastianbergmann/phpunit/compare/10.5.22...10.5.23 -[10.5.22]: https://github.com/sebastianbergmann/phpunit/compare/10.5.21...10.5.22 -[10.5.21]: https://github.com/sebastianbergmann/phpunit/compare/10.5.20...10.5.21 -[10.5.20]: https://github.com/sebastianbergmann/phpunit/compare/10.5.19...10.5.20 -[10.5.19]: https://github.com/sebastianbergmann/phpunit/compare/10.5.18...10.5.19 -[10.5.18]: https://github.com/sebastianbergmann/phpunit/compare/10.5.17...10.5.18 -[10.5.17]: https://github.com/sebastianbergmann/phpunit/compare/10.5.16...10.5.17 -[10.5.16]: https://github.com/sebastianbergmann/phpunit/compare/10.5.15...10.5.16 -[10.5.15]: https://github.com/sebastianbergmann/phpunit/compare/10.5.14...10.5.15 -[10.5.14]: https://github.com/sebastianbergmann/phpunit/compare/10.5.13...10.5.14 -[10.5.13]: https://github.com/sebastianbergmann/phpunit/compare/10.5.12...10.5.13 -[10.5.12]: https://github.com/sebastianbergmann/phpunit/compare/10.5.11...10.5.12 -[10.5.11]: https://github.com/sebastianbergmann/phpunit/compare/10.5.10...10.5.11 -[10.5.10]: https://github.com/sebastianbergmann/phpunit/compare/10.5.9...10.5.10 -[10.5.9]: https://github.com/sebastianbergmann/phpunit/compare/10.5.8...10.5.9 -[10.5.8]: https://github.com/sebastianbergmann/phpunit/compare/10.5.7...10.5.8 -[10.5.7]: https://github.com/sebastianbergmann/phpunit/compare/10.5.6...10.5.7 -[10.5.6]: https://github.com/sebastianbergmann/phpunit/compare/10.5.5...10.5.6 -[10.5.5]: https://github.com/sebastianbergmann/phpunit/compare/10.5.4...10.5.5 -[10.5.4]: https://github.com/sebastianbergmann/phpunit/compare/10.5.3...10.5.4 -[10.5.3]: https://github.com/sebastianbergmann/phpunit/compare/10.5.2...10.5.3 -[10.5.2]: https://github.com/sebastianbergmann/phpunit/compare/10.5.1...10.5.2 -[10.5.1]: https://github.com/sebastianbergmann/phpunit/compare/10.5.0...10.5.1 -[10.5.0]: https://github.com/sebastianbergmann/phpunit/compare/10.4.2...10.5.0 diff --git a/vendor/phpunit/phpunit/DEPRECATIONS.md b/vendor/phpunit/phpunit/DEPRECATIONS.md deleted file mode 100644 index 75d1b3e..0000000 --- a/vendor/phpunit/phpunit/DEPRECATIONS.md +++ /dev/null @@ -1,92 +0,0 @@ -# Deprecations - -## Soft Deprecations - -This functionality is currently [soft-deprecated](https://phpunit.de/backward-compatibility.html#soft-deprecation): - -### Writing Tests - -#### Assertions, Constraints, and Expectations - -| Issue | Description | Since | Replacement | -|-------------------------------------------------------------------|----------------------------------------------|--------|-------------| -| [#5472](https://github.com/sebastianbergmann/phpunit/issues/5472) | `Assert::assertStringNotMatchesFormat()` | 10.4.0 | | -| [#5472](https://github.com/sebastianbergmann/phpunit/issues/5472) | `Assert::assertStringNotMatchesFormatFile()` | 10.4.0 | | - -#### Test Double API - -| Issue | Description | Since | Replacement | -|-------------------------------------------------------------------|---------------------------------------------------|--------|-----------------------------------------------------------------------------------------| -| [#5240](https://github.com/sebastianbergmann/phpunit/issues/5240) | `TestCase::createTestProxy()` | 10.1.0 | | -| [#5241](https://github.com/sebastianbergmann/phpunit/issues/5241) | `TestCase::getMockForAbstractClass()` | 10.1.0 | | -| [#5242](https://github.com/sebastianbergmann/phpunit/issues/5242) | `TestCase::getMockFromWsdl()` | 10.1.0 | | -| [#5243](https://github.com/sebastianbergmann/phpunit/issues/5243) | `TestCase::getMockForTrait()` | 10.1.0 | | -| [#5244](https://github.com/sebastianbergmann/phpunit/issues/5244) | `TestCase::getObjectForTrait()` | 10.1.0 | | -| [#5305](https://github.com/sebastianbergmann/phpunit/issues/5305) | `MockBuilder::getMockForAbstractClass()` | 10.1.0 | | -| [#5306](https://github.com/sebastianbergmann/phpunit/issues/5306) | `MockBuilder::getMockForTrait()` | 10.1.0 | | -| [#5307](https://github.com/sebastianbergmann/phpunit/issues/5307) | `MockBuilder::disableProxyingToOriginalMethods()` | 10.1.0 | | -| [#5307](https://github.com/sebastianbergmann/phpunit/issues/5307) | `MockBuilder::enableProxyingToOriginalMethods()` | 10.1.0 | | -| [#5307](https://github.com/sebastianbergmann/phpunit/issues/5307) | `MockBuilder::setProxyTarget()` | 10.1.0 | | -| [#5308](https://github.com/sebastianbergmann/phpunit/issues/5308) | `MockBuilder::allowMockingUnknownTypes()` | 10.1.0 | | -| [#5308](https://github.com/sebastianbergmann/phpunit/issues/5308) | `MockBuilder::disallowMockingUnknownTypes()` | 10.1.0 | | -| [#5309](https://github.com/sebastianbergmann/phpunit/issues/5309) | `MockBuilder::disableAutoload()` | 10.1.0 | | -| [#5309](https://github.com/sebastianbergmann/phpunit/issues/5309) | `MockBuilder::enableAutoload()` | 10.1.0 | | -| [#5315](https://github.com/sebastianbergmann/phpunit/issues/5315) | `MockBuilder::disableArgumentCloning()` | 10.1.0 | | -| [#5315](https://github.com/sebastianbergmann/phpunit/issues/5315) | `MockBuilder::enableArgumentCloning()` | 10.1.0 | | -| [#5320](https://github.com/sebastianbergmann/phpunit/issues/5320) | `MockBuilder::addMethods()` | 10.1.0 | | -| [#5423](https://github.com/sebastianbergmann/phpunit/issues/5423) | `TestCase::onConsecutiveCalls()` | 10.3.0 | Use `$double->willReturn()` instead of `$double->will($this->onConsecutiveCalls())` | -| [#5423](https://github.com/sebastianbergmann/phpunit/issues/5423) | `TestCase::returnArgument()` | 10.3.0 | Use `$double->willReturnArgument()` instead of `$double->will($this->returnArgument())` | -| [#5423](https://github.com/sebastianbergmann/phpunit/issues/5423) | `TestCase::returnCallback()` | 10.3.0 | Use `$double->willReturnCallback()` instead of `$double->will($this->returnCallback())` | -| [#5423](https://github.com/sebastianbergmann/phpunit/issues/5423) | `TestCase::returnSelf()` | 10.3.0 | Use `$double->willReturnSelf()` instead of `$double->will($this->returnSelf())` | -| [#5423](https://github.com/sebastianbergmann/phpunit/issues/5423) | `TestCase::returnValue()` | 10.3.0 | Use `$double->willReturn()` instead of `$double->will($this->returnValue())` | -| [#5423](https://github.com/sebastianbergmann/phpunit/issues/5423) | `TestCase::returnValueMap()` | 10.3.0 | Use `$double->willReturnMap()` instead of `$double->will($this->returnValueMap())` | - -#### Miscellaneous - -| Issue | Description | Since | Replacement | -|-------------------------------------------------------------------|----------------------------------------------------------------|--------|--------------------------------------------------------------------| -| [#5236](https://github.com/sebastianbergmann/phpunit/issues/5236) | `PHPUnit\Framework\Attributes\CodeCoverageIgnore()` | 10.1.0 | | -| [#5214](https://github.com/sebastianbergmann/phpunit/issues/5214) | `TestCase::iniSet()` | 10.3.0 | | -| [#5216](https://github.com/sebastianbergmann/phpunit/issues/5216) | `TestCase::setLocale()` | 10.3.0 | | -| [#5236](https://github.com/sebastianbergmann/phpunit/issues/5513) | `PHPUnit\Framework\Attributes\IgnoreClassForCodeCoverage()` | 10.4.0 | Use `@codeCoverageIgnore` annotation in the class' doc-comment | -| [#5236](https://github.com/sebastianbergmann/phpunit/issues/5513) | `PHPUnit\Framework\Attributes\IgnoreMethodForCodeCoverage()` | 10.4.0 | Use `@codeCoverageIgnore` annotation in the method's doc-comment | -| [#5236](https://github.com/sebastianbergmann/phpunit/issues/5513) | `PHPUnit\Framework\Attributes\IgnoreFunctionForCodeCoverage()` | 10.4.0 | Use `@codeCoverageIgnore` annotation in the function's doc-comment | - -### Running Tests - -| Issue | Description | Since | Replacement | -|-------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------|--------|-------------| -| [#5481](https://github.com/sebastianbergmann/phpunit/issues/5481) | `dataSet` attribute for `testCaseMethod` elements in the XML document generated by `--list-tests-xml` | 10.4.0 | | - -### Extending PHPUnit - -| Issue | Description | Since | Replacement | -|-------|------------------------------------------------------------------------------------------------------------------------------|--------|--------------------------------------------------------------------------------| -| | `PHPUnit\TextUI\Configuration\Configuration::coverageExcludeDirectories()` | 10.2.0 | `PHPUnit\TextUI\Configuration\Configuration::source()->excludeDirectories()` | -| | `PHPUnit\TextUI\Configuration\Configuration::coverageExcludeFiles()` | 10.2.0 | `PHPUnit\TextUI\Configuration\Configuration::source()->excludeFiles()` | -| | `PHPUnit\TextUI\Configuration\Configuration::coverageIncludeDirectories()` | 10.2.0 | `PHPUnit\TextUI\Configuration\Configuration::source()->includeDirectories()` | -| | `PHPUnit\TextUI\Configuration\Configuration::coverageIncludeFiles()` | 10.2.0 | `PHPUnit\TextUI\Configuration\Configuration::source()->includeFiles()` | -| | `PHPUnit\TextUI\Configuration\Configuration::loadPharExtensions()` | 10.2.0 | `PHPUnit\TextUI\Configuration\Configuration::noExtensions()` | -| | `PHPUnit\TextUI\Configuration\Configuration::hasNonEmptyListOfFilesToBeIncludedInCodeCoverageReport()` | 10.2.0 | `PHPUnit\TextUI\Configuration\Configuration::source()->notEmpty()` | -| | `PHPUnit\TextUI\Configuration\Configuration::restrictDeprecations()` | 10.2.0 | `PHPUnit\TextUI\Configuration\Configuration::source()->restrictDeprecations()` | -| | `PHPUnit\TextUI\Configuration\Configuration::restrictNotices()` | 10.2.0 | `PHPUnit\TextUI\Configuration\Configuration::source()->restrictNotices()` | -| | `PHPUnit\TextUI\Configuration\Configuration::restrictWarnings()` | 10.2.0 | `PHPUnit\TextUI\Configuration\Configuration::source()->restrictWarnings()` | -| | `PHPUnit\TextUI\Configuration\Configuration::cliArgument()` | 10.4.0 | `PHPUnit\TextUI\Configuration\Configuration::cliArguments()[0]` | -| | `PHPUnit\TextUI\Configuration\Configuration::hasCliArgument()` | 10.4.0 | `PHPUnit\TextUI\Configuration\Configuration::hasCliArguments()` | -| | `PHPUnit\Framework\Constraint\Constraint::exporter()` | 10.4.0 | | -| | `PHPUnit\TextUI\Configuration\Configuration::registerMockObjectsFromTestArgumentsRecursively()` | 10.5.3 | | -| | `Test\AssertionFailed` and `Test\AssertionSucceeded` events | 10.5.3 | | -| | `PHPUnit\Runner\Extension\Facade::requireExportOfObjects()` and `PHPUnit\Runner\Extension\Facade::requiresExportOfObjects()` | 10.5.3 | | - -## Hard Deprecations - -This functionality is currently [hard-deprecated](https://phpunit.de/backward-compatibility.html#hard-deprecation): - -### Writing Tests - -#### Miscellaneous - -| Issue | Description | Since | Replacement | -|-------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------|---------|-------------| -| [#5100](https://github.com/sebastianbergmann/phpunit/issues/5100) | Support for non-static data provider methods, non-public data provider methods, and data provider methods that declare parameters | 10.0.0 | | -| [#5812](https://github.com/sebastianbergmann/phpunit/pull/5812) | Support for string array keys in data sets returned by data provider methods that do not match the parameter names of the test method(s) that use(s) them | 10.5.18 | | diff --git a/vendor/phpunit/phpunit/LICENSE b/vendor/phpunit/phpunit/LICENSE deleted file mode 100644 index 83489d6..0000000 --- a/vendor/phpunit/phpunit/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2001-2026, Sebastian Bergmann -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/phpunit/phpunit/README.md b/vendor/phpunit/phpunit/README.md deleted file mode 100644 index 1ca144a..0000000 --- a/vendor/phpunit/phpunit/README.md +++ /dev/null @@ -1,34 +0,0 @@ -# PHPUnit - -[![Latest Stable Version](https://poser.pugx.org/phpunit/phpunit/v)](https://packagist.org/packages/phpunit/phpunit) -[![CI Status](https://github.com/sebastianbergmann/phpunit/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/phpunit/actions) -[![codecov](https://codecov.io/gh/sebastianbergmann/phpunit/branch/main/graph/badge.svg)](https://codecov.io/gh/sebastianbergmann/phpunit) - -PHPUnit is a programmer-oriented testing framework for PHP. It is an instance of the xUnit architecture for unit testing frameworks. - -## Installation - -We distribute a [PHP Archive (PHAR)](https://php.net/phar) that has all required (as well as some optional) dependencies of PHPUnit bundled in a single file: - -```bash -$ wget https://phar.phpunit.de/phpunit-X.Y.phar - -$ php phpunit-X.Y.phar --version -``` - -Please replace `X.Y` with the version of PHPUnit you are interested in. - -Alternatively, you may use [Composer](https://getcomposer.org/) to download and install PHPUnit as well as its dependencies. Please refer to the [documentation](https://phpunit.de/documentation.html) for details on how to install PHPUnit. - -## Contribute - -Please refer to [CONTRIBUTING.md](https://github.com/sebastianbergmann/phpunit/blob/main/.github/CONTRIBUTING.md) for information on how to contribute to PHPUnit and its related projects. - -## List of Contributors - -Thanks to everyone who has contributed to PHPUnit! You can find a detailed list of contributors on every PHPUnit related package on GitHub. This list shows only the major components: - -* [PHPUnit](https://github.com/sebastianbergmann/phpunit/graphs/contributors) -* [php-code-coverage](https://github.com/sebastianbergmann/php-code-coverage/graphs/contributors) - -A very special thanks to everyone who has contributed to the [documentation](https://github.com/sebastianbergmann/phpunit-documentation-english/graphs/contributors). diff --git a/vendor/phpunit/phpunit/SECURITY.md b/vendor/phpunit/phpunit/SECURITY.md deleted file mode 100644 index 5f55c41..0000000 --- a/vendor/phpunit/phpunit/SECURITY.md +++ /dev/null @@ -1,33 +0,0 @@ -# Security Policy - -If you believe you have found a security vulnerability in PHPUnit, please report it to us through coordinated disclosure. - -**Please do not report security vulnerabilities through public GitHub issues, discussions, or pull requests.** - -Instead, please email `sebastian@phpunit.de`. - -Please include as much of the information listed below as you can to help us better understand and resolve the issue: - -* The type of issue -* Full paths of source file(s) related to the manifestation of the issue -* The location of the affected source code (tag/branch/commit or direct URL) -* Any special configuration required to reproduce the issue -* Step-by-step instructions to reproduce the issue -* Proof-of-concept or exploit code (if possible) -* Impact of the issue, including how an attacker might exploit the issue - -This information will help us triage your report more quickly. - -## Web Context - -PHPUnit is a framework for writing as well as a command-line tool for running tests. Writing and running tests is a development-time activity. There is no reason why PHPUnit should be installed on a webserver and/or in a production environment. - -**If you upload PHPUnit to a webserver then your deployment process is broken. On a more general note, if your `vendor` directory is publicly accessible on your webserver then your deployment process is also broken.** - -Please note that if you upload PHPUnit to a webserver "bad things" may happen. [You have been warned.](https://thephp.cc/articles/phpunit-a-security-risk?ref=phpunit) - -PHPUnit is developed with a focus on development environments and the command-line. No specific testing or hardening with regard to using PHPUnit in an HTTP or web context or with untrusted input data is performed. PHPUnit might also contain functionality that intentionally exposes internal application data for debugging purposes. - -If PHPUnit is used in a web application, the application developer is responsible for filtering inputs or escaping outputs as necessary and for verifying that the used functionality is safe for use within the intended context. - -Vulnerabilities specific to the use outside a development context will be fixed as applicable, provided that the fix does not have an averse effect on the primary use case for development purposes. diff --git a/vendor/phpunit/phpunit/composer.json b/vendor/phpunit/phpunit/composer.json deleted file mode 100644 index db3f8e4..0000000 --- a/vendor/phpunit/phpunit/composer.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "name": "phpunit/phpunit", - "description": "The PHP Unit Testing framework.", - "type": "library", - "keywords": [ - "phpunit", - "xunit", - "testing" - ], - "homepage": "https://phpunit.de/", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "security": "https://github.com/sebastianbergmann/phpunit/security/policy" - }, - "prefer-stable": true, - "require": { - "php": ">=8.1", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.13.4", - "phar-io/manifest": "^2.0.4", - "phar-io/version": "^3.2.1", - "phpunit/php-code-coverage": "^10.1.16", - "phpunit/php-file-iterator": "^4.1.0", - "phpunit/php-invoker": "^4.0.0", - "phpunit/php-text-template": "^3.0.1", - "phpunit/php-timer": "^6.0.0", - "sebastian/cli-parser": "^2.0.1", - "sebastian/code-unit": "^2.0.0", - "sebastian/comparator": "^5.0.5", - "sebastian/diff": "^5.1.1", - "sebastian/environment": "^6.1.0", - "sebastian/exporter": "^5.1.4", - "sebastian/global-state": "^6.0.2", - "sebastian/object-enumerator": "^5.0.0", - "sebastian/recursion-context": "^5.0.1", - "sebastian/type": "^4.0.0", - "sebastian/version": "^4.0.1" - }, - "config": { - "platform": { - "php": "8.1.0" - }, - "classmap-authoritative": true, - "optimize-autoloader": true, - "sort-packages": true - }, - "suggest": { - "ext-soap": "To be able to generate mocks based on WSDL files" - }, - "bin": [ - "phpunit" - ], - "autoload": { - "classmap": [ - "src/" - ], - "files": [ - "src/Framework/Assert/Functions.php" - ] - }, - "autoload-dev": { - "classmap": [ - "tests/_files" - ], - "files": [ - "tests/unit/Event/AbstractEventTestCase.php", - "tests/unit/Framework/MockObject/TestDoubleTestCase.php", - "tests/unit/Metadata/Parser/AnnotationParserTestCase.php", - "tests/unit/Metadata/Parser/AttributeParserTestCase.php", - "tests/_files/CoverageNamespacedFunctionTest.php", - "tests/_files/CoveredFunction.php", - "tests/_files/Generator.php", - "tests/_files/NamespaceCoveredFunction.php", - "tests/end-to-end/code-coverage/ignore-function-using-attribute/src/CoveredFunction.php" - ] - }, - "extra": { - "branch-alias": { - "dev-main": "10.5-dev" - } - } -} diff --git a/vendor/phpunit/phpunit/composer.lock b/vendor/phpunit/phpunit/composer.lock deleted file mode 100644 index 254ef26..0000000 --- a/vendor/phpunit/phpunit/composer.lock +++ /dev/null @@ -1,1590 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "8dfe5ace1a29844a4ff8db731eb68f21", - "packages": [ - { - "name": "myclabs/deep-copy", - "version": "1.13.4", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", - "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "conflict": { - "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3 <3.2.2" - }, - "require-dev": { - "doctrine/collections": "^1.6.8", - "doctrine/common": "^2.13.3 || ^3.2.2", - "phpspec/prophecy": "^1.10", - "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" - }, - "type": "library", - "autoload": { - "files": [ - "src/DeepCopy/deep_copy.php" - ], - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ], - "support": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" - }, - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" - } - ], - "time": "2025-08-01T08:46:24+00:00" - }, - { - "name": "nikic/php-parser", - "version": "v5.7.0", - "source": { - "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", - "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "ext-json": "*", - "ext-tokenizer": "*", - "php": ">=7.4" - }, - "require-dev": { - "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^9.0" - }, - "bin": [ - "bin/php-parse" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "autoload": { - "psr-4": { - "PhpParser\\": "lib/PhpParser" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Nikita Popov" - } - ], - "description": "A PHP parser written in PHP", - "keywords": [ - "parser", - "php" - ], - "support": { - "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0" - }, - "time": "2025-12-06T11:56:16+00:00" - }, - { - "name": "phar-io/manifest", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "54750ef60c58e43759730615a392c31c80e23176" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", - "reference": "54750ef60c58e43759730615a392c31c80e23176", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-phar": "*", - "ext-xmlwriter": "*", - "phar-io/version": "^3.0.1", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "support": { - "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.4" - }, - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "time": "2024-03-03T12:33:53+00:00" - }, - { - "name": "phar-io/version", - "version": "3.2.1", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Library for handling version information and constraints", - "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.2.1" - }, - "time": "2022-02-21T01:04:05+00:00" - }, - { - "name": "phpunit/php-code-coverage", - "version": "10.1.16", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "7e308268858ed6baedc8704a304727d20bc07c77" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e308268858ed6baedc8704a304727d20bc07c77", - "reference": "7e308268858ed6baedc8704a304727d20bc07c77", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-xmlwriter": "*", - "nikic/php-parser": "^4.19.1 || ^5.1.0", - "php": ">=8.1", - "phpunit/php-file-iterator": "^4.1.0", - "phpunit/php-text-template": "^3.0.1", - "sebastian/code-unit-reverse-lookup": "^3.0.0", - "sebastian/complexity": "^3.2.0", - "sebastian/environment": "^6.1.0", - "sebastian/lines-of-code": "^2.0.2", - "sebastian/version": "^4.0.1", - "theseer/tokenizer": "^1.2.3" - }, - "require-dev": { - "phpunit/phpunit": "^10.1" - }, - "suggest": { - "ext-pcov": "PHP extension that provides line coverage", - "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "10.1.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.16" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-08-22T04:31:57+00:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "4.1.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", - "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-08-31T06:24:48+00:00" - }, - { - "name": "phpunit/php-invoker", - "version": "4.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", - "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "ext-pcntl": "*", - "phpunit/phpunit": "^10.0" - }, - "suggest": { - "ext-pcntl": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Invoke callables with a timeout", - "homepage": "https://github.com/sebastianbergmann/php-invoker/", - "keywords": [ - "process" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T06:56:09+00:00" - }, - { - "name": "phpunit/php-text-template", - "version": "3.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", - "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-08-31T14:07:24+00:00" - }, - { - "name": "phpunit/php-timer", - "version": "6.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", - "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T06:57:52+00:00" - }, - { - "name": "sebastian/cli-parser", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", - "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for parsing CLI options", - "homepage": "https://github.com/sebastianbergmann/cli-parser", - "support": { - "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-02T07:12:49+00:00" - }, - { - "name": "sebastian/code-unit", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", - "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the PHP code units", - "homepage": "https://github.com/sebastianbergmann/code-unit", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T06:58:43+00:00" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", - "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T06:59:15+00:00" - }, - { - "name": "sebastian/comparator", - "version": "5.0.5", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "55dfef806eb7dfeb6e7a6935601fef866f8ca48d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55dfef806eb7dfeb6e7a6935601fef866f8ca48d", - "reference": "55dfef806eb7dfeb6e7a6935601fef866f8ca48d", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-mbstring": "*", - "php": ">=8.1", - "sebastian/diff": "^5.0", - "sebastian/exporter": "^5.0" - }, - "require-dev": { - "phpunit/phpunit": "^10.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "https://github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/comparator/issues", - "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.5" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", - "type": "tidelift" - } - ], - "time": "2026-01-24T09:25:16+00:00" - }, - { - "name": "sebastian/complexity", - "version": "3.2.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "68ff824baeae169ec9f2137158ee529584553799" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", - "reference": "68ff824baeae169ec9f2137158ee529584553799", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.2-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for calculating the complexity of PHP code units", - "homepage": "https://github.com/sebastianbergmann/complexity", - "support": { - "issues": "https://github.com/sebastianbergmann/complexity/issues", - "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-12-21T08:37:17+00:00" - }, - { - "name": "sebastian/diff", - "version": "5.1.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", - "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0", - "symfony/process": "^6.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/diff/issues", - "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-02T07:15:17+00:00" - }, - { - "name": "sebastian/environment", - "version": "6.1.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", - "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "suggest": { - "ext-posix": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "https://github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/environment/issues", - "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-23T08:47:14+00:00" - }, - { - "name": "sebastian/exporter", - "version": "5.1.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "0735b90f4da94969541dac1da743446e276defa6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/0735b90f4da94969541dac1da743446e276defa6", - "reference": "0735b90f4da94969541dac1da743446e276defa6", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "php": ">=8.1", - "sebastian/recursion-context": "^5.0" - }, - "require-dev": { - "phpunit/phpunit": "^10.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "https://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/exporter/issues", - "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", - "type": "tidelift" - } - ], - "time": "2025-09-24T06:09:11+00:00" - }, - { - "name": "sebastian/global-state", - "version": "6.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", - "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "sebastian/object-reflector": "^3.0", - "sebastian/recursion-context": "^5.0" - }, - "require-dev": { - "ext-dom": "*", - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Snapshotting of global state", - "homepage": "https://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/global-state/issues", - "security": "https://github.com/sebastianbergmann/global-state/security/policy", - "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-02T07:19:19+00:00" - }, - { - "name": "sebastian/lines-of-code", - "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", - "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for counting the lines of code in PHP source code", - "homepage": "https://github.com/sebastianbergmann/lines-of-code", - "support": { - "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-12-21T08:38:20+00:00" - }, - { - "name": "sebastian/object-enumerator", - "version": "5.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", - "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "sebastian/object-reflector": "^3.0", - "sebastian/recursion-context": "^5.0" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T07:08:32+00:00" - }, - { - "name": "sebastian/object-reflector", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", - "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T07:06:18+00:00" - }, - { - "name": "sebastian/recursion-context", - "version": "5.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "47e34210757a2f37a97dcd207d032e1b01e64c7a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/47e34210757a2f37a97dcd207d032e1b01e64c7a", - "reference": "47e34210757a2f37a97dcd207d032e1b01e64c7a", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "https://github.com/sebastianbergmann/recursion-context", - "support": { - "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", - "type": "tidelift" - } - ], - "time": "2025-08-10T07:50:56+00:00" - }, - { - "name": "sebastian/type", - "version": "4.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/type.git", - "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", - "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the types of the PHP type system", - "homepage": "https://github.com/sebastianbergmann/type", - "support": { - "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T07:10:45+00:00" - }, - { - "name": "sebastian/version", - "version": "4.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", - "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "support": { - "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-07T11:34:05+00:00" - }, - { - "name": "theseer/tokenizer", - "version": "1.3.1", - "source": { - "type": "git", - "url": "https://github.com/theseer/tokenizer.git", - "reference": "b7489ce515e168639d17feec34b8847c326b0b3c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c", - "reference": "b7489ce515e168639d17feec34b8847c326b0b3c", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - } - ], - "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "support": { - "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.3.1" - }, - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "time": "2025-11-17T20:03:58+00:00" - } - ], - "packages-dev": [], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": {}, - "prefer-stable": true, - "prefer-lowest": false, - "platform": { - "php": ">=8.1", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "ext-xmlwriter": "*" - }, - "platform-dev": {}, - "platform-overrides": { - "php": "8.1.0" - }, - "plugin-api-version": "2.9.0" -} diff --git a/vendor/phpunit/phpunit/phpunit b/vendor/phpunit/phpunit/phpunit deleted file mode 100644 index 95aaf92..0000000 --- a/vendor/phpunit/phpunit/phpunit +++ /dev/null @@ -1,104 +0,0 @@ -#!/usr/bin/env php - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -if (!version_compare(PHP_VERSION, PHP_VERSION, '=')) { - fwrite( - STDERR, - sprintf( - '%s declares an invalid value for PHP_VERSION.' . PHP_EOL . - 'This breaks fundamental functionality such as version_compare().' . PHP_EOL . - 'Please use a different PHP interpreter.' . PHP_EOL, - - PHP_BINARY - ) - ); - - die(1); -} - -if (version_compare('8.1.0', PHP_VERSION, '>')) { - fwrite( - STDERR, - sprintf( - 'This version of PHPUnit requires PHP >= 8.1.' . PHP_EOL . - 'You are using PHP %s (%s).' . PHP_EOL, - PHP_VERSION, - PHP_BINARY - ) - ); - - die(1); -} - -if (!ini_get('date.timezone')) { - ini_set('date.timezone', 'UTC'); -} - -if (isset($GLOBALS['_composer_autoload_path'])) { - define('PHPUNIT_COMPOSER_INSTALL', $GLOBALS['_composer_autoload_path']); - - unset($GLOBALS['_composer_autoload_path']); -} else { - foreach (array(__DIR__ . '/../../autoload.php', __DIR__ . '/../vendor/autoload.php', __DIR__ . '/vendor/autoload.php') as $file) { - if (file_exists($file)) { - define('PHPUNIT_COMPOSER_INSTALL', $file); - - break; - } - } - - unset($file); -} - -if (!defined('PHPUNIT_COMPOSER_INSTALL')) { - fwrite( - STDERR, - 'You need to set up the project dependencies using Composer:' . PHP_EOL . PHP_EOL . - ' composer install' . PHP_EOL . PHP_EOL . - 'You can learn all about Composer on https://getcomposer.org/.' . PHP_EOL - ); - - die(1); -} - -require PHPUNIT_COMPOSER_INSTALL; - -$requiredExtensions = ['dom', 'json', 'libxml', 'mbstring', 'tokenizer', 'xml', 'xmlwriter']; - -$unavailableExtensions = array_filter( - $requiredExtensions, - static function ($extension) { - return !extension_loaded($extension); - } -); - -// Workaround for https://github.com/sebastianbergmann/phpunit/issues/5662 -if (!function_exists('ctype_alnum')) { - $unavailableExtensions[] = 'ctype'; -} - -if ([] !== $unavailableExtensions) { - fwrite( - STDERR, - sprintf( - 'PHPUnit requires the "%s" extensions, but the "%s" %s not available.' . PHP_EOL, - implode('", "', $requiredExtensions), - implode('", "', $unavailableExtensions), - count($unavailableExtensions) === 1 ? 'extension is' : 'extensions are' - ) - ); - - die(1); -} - -unset($requiredExtensions, $unavailableExtensions); - -exit((new PHPUnit\TextUI\Application)->run($_SERVER['argv'])); diff --git a/vendor/phpunit/phpunit/phpunit.xsd b/vendor/phpunit/phpunit/phpunit.xsd deleted file mode 100644 index 284820b..0000000 --- a/vendor/phpunit/phpunit/phpunit.xsd +++ /dev/null @@ -1,327 +0,0 @@ - - - - - This Schema file defines the rules by which the XML configuration file of PHPUnit 10.5 may be structured. - - - - - - Root Element - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The main type specifying the document structure - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/phpunit/phpunit/schema/10.0.xsd b/vendor/phpunit/phpunit/schema/10.0.xsd deleted file mode 100644 index 480d54d..0000000 --- a/vendor/phpunit/phpunit/schema/10.0.xsd +++ /dev/null @@ -1,284 +0,0 @@ - - - - - This Schema file defines the rules by which the XML configuration file of PHPUnit 10.0 may be structured. - - - - - - Root Element - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The main type specifying the document structure - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/phpunit/phpunit/schema/10.1.xsd b/vendor/phpunit/phpunit/schema/10.1.xsd deleted file mode 100644 index 1b190c2..0000000 --- a/vendor/phpunit/phpunit/schema/10.1.xsd +++ /dev/null @@ -1,312 +0,0 @@ - - - - - This Schema file defines the rules by which the XML configuration file of PHPUnit 10.1 may be structured. - - - - - - Root Element - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The main type specifying the document structure - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/phpunit/phpunit/schema/10.2.xsd b/vendor/phpunit/phpunit/schema/10.2.xsd deleted file mode 100644 index 269b7a3..0000000 --- a/vendor/phpunit/phpunit/schema/10.2.xsd +++ /dev/null @@ -1,319 +0,0 @@ - - - - - This Schema file defines the rules by which the XML configuration file of PHPUnit 10.2 may be structured. - - - - - - Root Element - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The main type specifying the document structure - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/phpunit/phpunit/schema/10.3.xsd b/vendor/phpunit/phpunit/schema/10.3.xsd deleted file mode 100644 index 03a54ee..0000000 --- a/vendor/phpunit/phpunit/schema/10.3.xsd +++ /dev/null @@ -1,321 +0,0 @@ - - - - - This Schema file defines the rules by which the XML configuration file of PHPUnit 10.3 may be structured. - - - - - - Root Element - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The main type specifying the document structure - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/phpunit/phpunit/schema/10.4.xsd b/vendor/phpunit/phpunit/schema/10.4.xsd deleted file mode 100644 index bd22b2c..0000000 --- a/vendor/phpunit/phpunit/schema/10.4.xsd +++ /dev/null @@ -1,322 +0,0 @@ - - - - - This Schema file defines the rules by which the XML configuration file of PHPUnit 10.4 may be structured. - - - - - - Root Element - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The main type specifying the document structure - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/phpunit/phpunit/schema/8.5.xsd b/vendor/phpunit/phpunit/schema/8.5.xsd deleted file mode 100644 index 75e2228..0000000 --- a/vendor/phpunit/phpunit/schema/8.5.xsd +++ /dev/null @@ -1,319 +0,0 @@ - - - - - This Schema file defines the rules by which the XML configuration file of PHPUnit 8.5 may be structured. - - - - - - Root Element - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The main type specifying the document structure - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/phpunit/phpunit/schema/9.0.xsd b/vendor/phpunit/phpunit/schema/9.0.xsd deleted file mode 100644 index 6db04c0..0000000 --- a/vendor/phpunit/phpunit/schema/9.0.xsd +++ /dev/null @@ -1,315 +0,0 @@ - - - - - This Schema file defines the rules by which the XML configuration file of PHPUnit 9.0 may be structured. - - - - - - Root Element - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The main type specifying the document structure - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/phpunit/phpunit/schema/9.1.xsd b/vendor/phpunit/phpunit/schema/9.1.xsd deleted file mode 100644 index b10d30b..0000000 --- a/vendor/phpunit/phpunit/schema/9.1.xsd +++ /dev/null @@ -1,317 +0,0 @@ - - - - - This Schema file defines the rules by which the XML configuration file of PHPUnit 9.0 may be structured. - - - - - - Root Element - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The main type specifying the document structure - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/phpunit/phpunit/schema/9.2.xsd b/vendor/phpunit/phpunit/schema/9.2.xsd deleted file mode 100644 index d770e8b..0000000 --- a/vendor/phpunit/phpunit/schema/9.2.xsd +++ /dev/null @@ -1,317 +0,0 @@ - - - - - This Schema file defines the rules by which the XML configuration file of PHPUnit 9.2 may be structured. - - - - - - Root Element - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The main type specifying the document structure - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/phpunit/phpunit/schema/9.3.xsd b/vendor/phpunit/phpunit/schema/9.3.xsd deleted file mode 100644 index 638f663..0000000 --- a/vendor/phpunit/phpunit/schema/9.3.xsd +++ /dev/null @@ -1,327 +0,0 @@ - - - - - This Schema file defines the rules by which the XML configuration file of PHPUnit 9.3 may be structured. - - - - - - Root Element - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The main type specifying the document structure - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/phpunit/phpunit/schema/9.4.xsd b/vendor/phpunit/phpunit/schema/9.4.xsd deleted file mode 100644 index 75a91e8..0000000 --- a/vendor/phpunit/phpunit/schema/9.4.xsd +++ /dev/null @@ -1,328 +0,0 @@ - - - - - This Schema file defines the rules by which the XML configuration file of PHPUnit 9.4 may be structured. - - - - - - Root Element - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The main type specifying the document structure - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/phpunit/phpunit/schema/9.5.xsd b/vendor/phpunit/phpunit/schema/9.5.xsd deleted file mode 100644 index eabefac..0000000 --- a/vendor/phpunit/phpunit/schema/9.5.xsd +++ /dev/null @@ -1,330 +0,0 @@ - - - - - This Schema file defines the rules by which the XML configuration file of PHPUnit 9.5 may be structured. - - - - - - Root Element - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The main type specifying the document structure - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/phpunit/phpunit/src/Event/Dispatcher/CollectingDispatcher.php b/vendor/phpunit/phpunit/src/Event/Dispatcher/CollectingDispatcher.php deleted file mode 100644 index c431b93..0000000 --- a/vendor/phpunit/phpunit/src/Event/Dispatcher/CollectingDispatcher.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class CollectingDispatcher implements Dispatcher -{ - private EventCollection $events; - - public function __construct() - { - $this->events = new EventCollection; - } - - public function dispatch(Event $event): void - { - $this->events->add($event); - } - - public function flush(): EventCollection - { - $events = $this->events; - - $this->events = new EventCollection; - - return $events; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Dispatcher/DeferringDispatcher.php b/vendor/phpunit/phpunit/src/Event/Dispatcher/DeferringDispatcher.php deleted file mode 100644 index 6895fac..0000000 --- a/vendor/phpunit/phpunit/src/Event/Dispatcher/DeferringDispatcher.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class DeferringDispatcher implements SubscribableDispatcher -{ - private readonly SubscribableDispatcher $dispatcher; - private EventCollection $events; - private bool $recording = true; - - public function __construct(SubscribableDispatcher $dispatcher) - { - $this->dispatcher = $dispatcher; - $this->events = new EventCollection; - } - - public function registerTracer(Tracer\Tracer $tracer): void - { - $this->dispatcher->registerTracer($tracer); - } - - public function registerSubscriber(Subscriber $subscriber): void - { - $this->dispatcher->registerSubscriber($subscriber); - } - - public function dispatch(Event $event): void - { - if ($this->recording) { - $this->events->add($event); - - return; - } - - $this->dispatcher->dispatch($event); - } - - public function flush(): void - { - $this->recording = false; - - foreach ($this->events as $event) { - $this->dispatcher->dispatch($event); - } - - $this->events = new EventCollection; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Dispatcher/DirectDispatcher.php b/vendor/phpunit/phpunit/src/Event/Dispatcher/DirectDispatcher.php deleted file mode 100644 index dc1da61..0000000 --- a/vendor/phpunit/phpunit/src/Event/Dispatcher/DirectDispatcher.php +++ /dev/null @@ -1,139 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event; - -use const PHP_EOL; -use function array_key_exists; -use function dirname; -use function sprintf; -use function str_starts_with; -use Throwable; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class DirectDispatcher implements SubscribableDispatcher -{ - private readonly TypeMap $typeMap; - - /** - * @psalm-var array> - */ - private array $subscribers = []; - - /** - * @psalm-var list - */ - private array $tracers = []; - - public function __construct(TypeMap $map) - { - $this->typeMap = $map; - } - - public function registerTracer(Tracer\Tracer $tracer): void - { - $this->tracers[] = $tracer; - } - - /** - * @throws MapError - * @throws UnknownSubscriberTypeException - */ - public function registerSubscriber(Subscriber $subscriber): void - { - if (!$this->typeMap->isKnownSubscriberType($subscriber)) { - throw new UnknownSubscriberTypeException( - sprintf( - 'Subscriber "%s" does not implement any known interface - did you forget to register it?', - $subscriber::class, - ), - ); - } - - $eventClassName = $this->typeMap->map($subscriber); - - if (!array_key_exists($eventClassName, $this->subscribers)) { - $this->subscribers[$eventClassName] = []; - } - - $this->subscribers[$eventClassName][] = $subscriber; - } - - /** - * @throws Throwable - * @throws UnknownEventTypeException - */ - public function dispatch(Event $event): void - { - $eventClassName = $event::class; - - if (!$this->typeMap->isKnownEventType($event)) { - throw new UnknownEventTypeException( - sprintf( - 'Unknown event type "%s"', - $eventClassName, - ), - ); - } - - foreach ($this->tracers as $tracer) { - try { - $tracer->trace($event); - // @codeCoverageIgnoreStart - } catch (Throwable $t) { - $this->handleThrowable($t); - } - // @codeCoverageIgnoreEnd - } - - if (!array_key_exists($eventClassName, $this->subscribers)) { - return; - } - - foreach ($this->subscribers[$eventClassName] as $subscriber) { - try { - $subscriber->notify($event); - } catch (Throwable $t) { - $this->handleThrowable($t); - } - } - } - - /** - * @throws Throwable - */ - public function handleThrowable(Throwable $t): void - { - if ($this->isThrowableFromThirdPartySubscriber($t)) { - Facade::emitter()->testRunnerTriggeredPhpunitWarning( - sprintf( - 'Exception in third-party event subscriber: %s%s%s', - $t->getMessage(), - PHP_EOL, - $t->getTraceAsString(), - ), - ); - - return; - } - - // @codeCoverageIgnoreStart - throw $t; - // @codeCoverageIgnoreEnd - } - - private function isThrowableFromThirdPartySubscriber(Throwable $t): bool - { - return !str_starts_with($t->getFile(), dirname(__DIR__, 2)); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Dispatcher/Dispatcher.php b/vendor/phpunit/phpunit/src/Event/Dispatcher/Dispatcher.php deleted file mode 100644 index e708653..0000000 --- a/vendor/phpunit/phpunit/src/Event/Dispatcher/Dispatcher.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This interface is not covered by the backward compatibility promise for PHPUnit - */ -interface Dispatcher -{ - /** - * @throws UnknownEventTypeException - */ - public function dispatch(Event $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Dispatcher/SubscribableDispatcher.php b/vendor/phpunit/phpunit/src/Event/Dispatcher/SubscribableDispatcher.php deleted file mode 100644 index c4393da..0000000 --- a/vendor/phpunit/phpunit/src/Event/Dispatcher/SubscribableDispatcher.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This interface is not covered by the backward compatibility promise for PHPUnit - */ -interface SubscribableDispatcher extends Dispatcher -{ - /** - * @throws UnknownSubscriberTypeException - */ - public function registerSubscriber(Subscriber $subscriber): void; - - public function registerTracer(Tracer\Tracer $tracer): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Emitter/DispatchingEmitter.php b/vendor/phpunit/phpunit/src/Event/Emitter/DispatchingEmitter.php deleted file mode 100644 index e296060..0000000 --- a/vendor/phpunit/phpunit/src/Event/Emitter/DispatchingEmitter.php +++ /dev/null @@ -1,1320 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event; - -use PHPUnit\Event\Code\ClassMethod; -use PHPUnit\Event\Code\ComparisonFailure; -use PHPUnit\Event\Code\Throwable; -use PHPUnit\Event\Test\DataProviderMethodCalled; -use PHPUnit\Event\Test\DataProviderMethodFinished; -use PHPUnit\Event\TestSuite\Filtered as TestSuiteFiltered; -use PHPUnit\Event\TestSuite\Finished as TestSuiteFinished; -use PHPUnit\Event\TestSuite\Loaded as TestSuiteLoaded; -use PHPUnit\Event\TestSuite\Skipped as TestSuiteSkipped; -use PHPUnit\Event\TestSuite\Sorted as TestSuiteSorted; -use PHPUnit\Event\TestSuite\Started as TestSuiteStarted; -use PHPUnit\Event\TestSuite\TestSuite; -use PHPUnit\Framework\Constraint; -use PHPUnit\TextUI\Configuration\Configuration; -use PHPUnit\Util\Exporter; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class DispatchingEmitter implements Emitter -{ - private readonly Dispatcher $dispatcher; - private readonly Telemetry\System $system; - private readonly Telemetry\Snapshot $startSnapshot; - private Telemetry\Snapshot $previousSnapshot; - private bool $exportObjects = false; - - public function __construct(Dispatcher $dispatcher, Telemetry\System $system) - { - $this->dispatcher = $dispatcher; - $this->system = $system; - - $this->startSnapshot = $system->snapshot(); - $this->previousSnapshot = $this->startSnapshot; - } - - /** - * @deprecated - */ - public function exportObjects(): void - { - $this->exportObjects = true; - } - - /** - * @deprecated - */ - public function exportsObjects(): bool - { - return $this->exportObjects; - } - - /** - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function applicationStarted(): void - { - $this->dispatcher->dispatch( - new Application\Started( - $this->telemetryInfo(), - new Runtime\Runtime, - ), - ); - } - - /** - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testRunnerStarted(): void - { - $this->dispatcher->dispatch( - new TestRunner\Started( - $this->telemetryInfo(), - ), - ); - } - - /** - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testRunnerConfigured(Configuration $configuration): void - { - $this->dispatcher->dispatch( - new TestRunner\Configured( - $this->telemetryInfo(), - $configuration, - ), - ); - } - - /** - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testRunnerBootstrapFinished(string $filename): void - { - $this->dispatcher->dispatch( - new TestRunner\BootstrapFinished( - $this->telemetryInfo(), - $filename, - ), - ); - } - - /** - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testRunnerLoadedExtensionFromPhar(string $filename, string $name, string $version): void - { - $this->dispatcher->dispatch( - new TestRunner\ExtensionLoadedFromPhar( - $this->telemetryInfo(), - $filename, - $name, - $version, - ), - ); - } - - /** - * @psalm-param class-string $className - * @psalm-param array $parameters - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testRunnerBootstrappedExtension(string $className, array $parameters): void - { - $this->dispatcher->dispatch( - new TestRunner\ExtensionBootstrapped( - $this->telemetryInfo(), - $className, - $parameters, - ), - ); - } - - /** - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function dataProviderMethodCalled(ClassMethod $testMethod, ClassMethod $dataProviderMethod): void - { - $this->dispatcher->dispatch( - new DataProviderMethodCalled( - $this->telemetryInfo(), - $testMethod, - $dataProviderMethod, - ), - ); - } - - /** - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function dataProviderMethodFinished(ClassMethod $testMethod, ClassMethod ...$calledMethods): void - { - $this->dispatcher->dispatch( - new DataProviderMethodFinished( - $this->telemetryInfo(), - $testMethod, - ...$calledMethods, - ), - ); - } - - /** - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testSuiteLoaded(TestSuite $testSuite): void - { - $this->dispatcher->dispatch( - new TestSuiteLoaded( - $this->telemetryInfo(), - $testSuite, - ), - ); - } - - /** - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testSuiteFiltered(TestSuite $testSuite): void - { - $this->dispatcher->dispatch( - new TestSuiteFiltered( - $this->telemetryInfo(), - $testSuite, - ), - ); - } - - /** - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testSuiteSorted(int $executionOrder, int $executionOrderDefects, bool $resolveDependencies): void - { - $this->dispatcher->dispatch( - new TestSuiteSorted( - $this->telemetryInfo(), - $executionOrder, - $executionOrderDefects, - $resolveDependencies, - ), - ); - } - - /** - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testRunnerEventFacadeSealed(): void - { - $this->dispatcher->dispatch( - new TestRunner\EventFacadeSealed( - $this->telemetryInfo(), - ), - ); - } - - /** - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testRunnerExecutionStarted(TestSuite $testSuite): void - { - $this->dispatcher->dispatch( - new TestRunner\ExecutionStarted( - $this->telemetryInfo(), - $testSuite, - ), - ); - } - - /** - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testRunnerDisabledGarbageCollection(): void - { - $this->dispatcher->dispatch( - new TestRunner\GarbageCollectionDisabled($this->telemetryInfo()), - ); - } - - /** - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testRunnerTriggeredGarbageCollection(): void - { - $this->dispatcher->dispatch( - new TestRunner\GarbageCollectionTriggered($this->telemetryInfo()), - ); - } - - /** - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testSuiteSkipped(TestSuite $testSuite, string $message): void - { - $this->dispatcher->dispatch( - new TestSuiteSkipped( - $this->telemetryInfo(), - $testSuite, - $message, - ), - ); - } - - /** - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testSuiteStarted(TestSuite $testSuite): void - { - $this->dispatcher->dispatch( - new TestSuiteStarted( - $this->telemetryInfo(), - $testSuite, - ), - ); - } - - /** - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testPreparationStarted(Code\Test $test): void - { - $this->dispatcher->dispatch( - new Test\PreparationStarted( - $this->telemetryInfo(), - $test, - ), - ); - } - - /** - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testPreparationFailed(Code\Test $test): void - { - $this->dispatcher->dispatch( - new Test\PreparationFailed( - $this->telemetryInfo(), - $test, - ), - ); - } - - /** - * @psalm-param class-string $testClassName - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function beforeFirstTestMethodCalled(string $testClassName, ClassMethod $calledMethod): void - { - $this->dispatcher->dispatch( - new Test\BeforeFirstTestMethodCalled( - $this->telemetryInfo(), - $testClassName, - $calledMethod, - ), - ); - } - - /** - * @psalm-param class-string $testClassName - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function beforeFirstTestMethodErrored(string $testClassName, ClassMethod $calledMethod, Throwable $throwable): void - { - $this->dispatcher->dispatch( - new Test\BeforeFirstTestMethodErrored( - $this->telemetryInfo(), - $testClassName, - $calledMethod, - $throwable, - ), - ); - } - - /** - * @psalm-param class-string $testClassName - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function beforeFirstTestMethodFinished(string $testClassName, ClassMethod ...$calledMethods): void - { - $this->dispatcher->dispatch( - new Test\BeforeFirstTestMethodFinished( - $this->telemetryInfo(), - $testClassName, - ...$calledMethods, - ), - ); - } - - /** - * @psalm-param class-string $testClassName - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function beforeTestMethodCalled(string $testClassName, ClassMethod $calledMethod): void - { - $this->dispatcher->dispatch( - new Test\BeforeTestMethodCalled( - $this->telemetryInfo(), - $testClassName, - $calledMethod, - ), - ); - } - - /** - * @psalm-param class-string $testClassName - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function beforeTestMethodErrored(string $testClassName, ClassMethod $calledMethod, Throwable $throwable): void - { - $this->dispatcher->dispatch( - new Test\BeforeTestMethodErrored( - $this->telemetryInfo(), - $testClassName, - $calledMethod, - $throwable, - ), - ); - } - - /** - * @psalm-param class-string $testClassName - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function beforeTestMethodFinished(string $testClassName, ClassMethod ...$calledMethods): void - { - $this->dispatcher->dispatch( - new Test\BeforeTestMethodFinished( - $this->telemetryInfo(), - $testClassName, - ...$calledMethods, - ), - ); - } - - /** - * @psalm-param class-string $testClassName - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function preConditionCalled(string $testClassName, ClassMethod $calledMethod): void - { - $this->dispatcher->dispatch( - new Test\PreConditionCalled( - $this->telemetryInfo(), - $testClassName, - $calledMethod, - ), - ); - } - - /** - * @psalm-param class-string $testClassName - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function preConditionErrored(string $testClassName, ClassMethod $calledMethod, Throwable $throwable): void - { - $this->dispatcher->dispatch( - new Test\PreConditionErrored( - $this->telemetryInfo(), - $testClassName, - $calledMethod, - $throwable, - ), - ); - } - - /** - * @psalm-param class-string $testClassName - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function preConditionFinished(string $testClassName, ClassMethod ...$calledMethods): void - { - $this->dispatcher->dispatch( - new Test\PreConditionFinished( - $this->telemetryInfo(), - $testClassName, - ...$calledMethods, - ), - ); - } - - /** - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testPrepared(Code\Test $test): void - { - $this->dispatcher->dispatch( - new Test\Prepared( - $this->telemetryInfo(), - $test, - ), - ); - } - - /** - * @psalm-param class-string $className - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testRegisteredComparator(string $className): void - { - $this->dispatcher->dispatch( - new Test\ComparatorRegistered( - $this->telemetryInfo(), - $className, - ), - ); - } - - /** - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - * - * @deprecated - */ - public function testAssertionSucceeded(mixed $value, Constraint\Constraint $constraint, string $message): void - { - $this->dispatcher->dispatch( - new Test\AssertionSucceeded( - $this->telemetryInfo(), - Exporter::export($value, $this->exportObjects), - $constraint->toString($this->exportObjects), - $constraint->count(), - $message, - ), - ); - } - - /** - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - * - * @deprecated - */ - public function testAssertionFailed(mixed $value, Constraint\Constraint $constraint, string $message): void - { - $this->dispatcher->dispatch( - new Test\AssertionFailed( - $this->telemetryInfo(), - Exporter::export($value, $this->exportObjects), - $constraint->toString($this->exportObjects), - $constraint->count(), - $message, - ), - ); - } - - /** - * @psalm-param class-string $className - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testCreatedMockObject(string $className): void - { - $this->dispatcher->dispatch( - new Test\MockObjectCreated( - $this->telemetryInfo(), - $className, - ), - ); - } - - /** - * @psalm-param list $interfaces - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testCreatedMockObjectForIntersectionOfInterfaces(array $interfaces): void - { - $this->dispatcher->dispatch( - new Test\MockObjectForIntersectionOfInterfacesCreated( - $this->telemetryInfo(), - $interfaces, - ), - ); - } - - /** - * @psalm-param trait-string $traitName - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testCreatedMockObjectForTrait(string $traitName): void - { - $this->dispatcher->dispatch( - new Test\MockObjectForTraitCreated( - $this->telemetryInfo(), - $traitName, - ), - ); - } - - /** - * @psalm-param class-string $className - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testCreatedMockObjectForAbstractClass(string $className): void - { - $this->dispatcher->dispatch( - new Test\MockObjectForAbstractClassCreated( - $this->telemetryInfo(), - $className, - ), - ); - } - - /** - * @psalm-param class-string $originalClassName - * @psalm-param class-string $mockClassName - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testCreatedMockObjectFromWsdl(string $wsdlFile, string $originalClassName, string $mockClassName, array $methods, bool $callOriginalConstructor, array $options): void - { - $this->dispatcher->dispatch( - new Test\MockObjectFromWsdlCreated( - $this->telemetryInfo(), - $wsdlFile, - $originalClassName, - $mockClassName, - $methods, - $callOriginalConstructor, - $options, - ), - ); - } - - /** - * @psalm-param class-string $className - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testCreatedPartialMockObject(string $className, string ...$methodNames): void - { - $this->dispatcher->dispatch( - new Test\PartialMockObjectCreated( - $this->telemetryInfo(), - $className, - ...$methodNames, - ), - ); - } - - /** - * @psalm-param class-string $className - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testCreatedTestProxy(string $className, array $constructorArguments): void - { - $this->dispatcher->dispatch( - new Test\TestProxyCreated( - $this->telemetryInfo(), - $className, - Exporter::export($constructorArguments, $this->exportObjects), - ), - ); - } - - /** - * @psalm-param class-string $className - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testCreatedStub(string $className): void - { - $this->dispatcher->dispatch( - new Test\TestStubCreated( - $this->telemetryInfo(), - $className, - ), - ); - } - - /** - * @psalm-param list $interfaces - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testCreatedStubForIntersectionOfInterfaces(array $interfaces): void - { - $this->dispatcher->dispatch( - new Test\TestStubForIntersectionOfInterfacesCreated( - $this->telemetryInfo(), - $interfaces, - ), - ); - } - - /** - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testErrored(Code\Test $test, Throwable $throwable): void - { - $this->dispatcher->dispatch( - new Test\Errored( - $this->telemetryInfo(), - $test, - $throwable, - ), - ); - } - - /** - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testFailed(Code\Test $test, Throwable $throwable, ?ComparisonFailure $comparisonFailure): void - { - $this->dispatcher->dispatch( - new Test\Failed( - $this->telemetryInfo(), - $test, - $throwable, - $comparisonFailure, - ), - ); - } - - /** - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testPassed(Code\Test $test): void - { - $this->dispatcher->dispatch( - new Test\Passed( - $this->telemetryInfo(), - $test, - ), - ); - } - - /** - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testConsideredRisky(Code\Test $test, string $message): void - { - $this->dispatcher->dispatch( - new Test\ConsideredRisky( - $this->telemetryInfo(), - $test, - $message, - ), - ); - } - - /** - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testMarkedAsIncomplete(Code\Test $test, Throwable $throwable): void - { - $this->dispatcher->dispatch( - new Test\MarkedIncomplete( - $this->telemetryInfo(), - $test, - $throwable, - ), - ); - } - - /** - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testSkipped(Code\Test $test, string $message): void - { - $this->dispatcher->dispatch( - new Test\Skipped( - $this->telemetryInfo(), - $test, - $message, - ), - ); - } - - /** - * @psalm-param non-empty-string $message - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testTriggeredPhpunitDeprecation(Code\Test $test, string $message): void - { - $this->dispatcher->dispatch( - new Test\PhpunitDeprecationTriggered( - $this->telemetryInfo(), - $test, - $message, - ), - ); - } - - /** - * @psalm-param non-empty-string $message - * @psalm-param non-empty-string $file - * @psalm-param positive-int $line - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testTriggeredPhpDeprecation(Code\Test $test, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline, bool $ignoredByTest): void - { - $this->dispatcher->dispatch( - new Test\PhpDeprecationTriggered( - $this->telemetryInfo(), - $test, - $message, - $file, - $line, - $suppressed, - $ignoredByBaseline, - $ignoredByTest, - ), - ); - } - - /** - * @psalm-param non-empty-string $message - * @psalm-param non-empty-string $file - * @psalm-param positive-int $line - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testTriggeredDeprecation(Code\Test $test, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline, bool $ignoredByTest): void - { - $this->dispatcher->dispatch( - new Test\DeprecationTriggered( - $this->telemetryInfo(), - $test, - $message, - $file, - $line, - $suppressed, - $ignoredByBaseline, - $ignoredByTest, - ), - ); - } - - /** - * @psalm-param non-empty-string $message - * @psalm-param non-empty-string $file - * @psalm-param positive-int $line - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testTriggeredError(Code\Test $test, string $message, string $file, int $line, bool $suppressed): void - { - $this->dispatcher->dispatch( - new Test\ErrorTriggered( - $this->telemetryInfo(), - $test, - $message, - $file, - $line, - $suppressed, - ), - ); - } - - /** - * @psalm-param non-empty-string $message - * @psalm-param non-empty-string $file - * @psalm-param positive-int $line - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testTriggeredNotice(Code\Test $test, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline): void - { - $this->dispatcher->dispatch( - new Test\NoticeTriggered( - $this->telemetryInfo(), - $test, - $message, - $file, - $line, - $suppressed, - $ignoredByBaseline, - ), - ); - } - - /** - * @psalm-param non-empty-string $message - * @psalm-param non-empty-string $file - * @psalm-param positive-int $line - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testTriggeredPhpNotice(Code\Test $test, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline): void - { - $this->dispatcher->dispatch( - new Test\PhpNoticeTriggered( - $this->telemetryInfo(), - $test, - $message, - $file, - $line, - $suppressed, - $ignoredByBaseline, - ), - ); - } - - /** - * @psalm-param non-empty-string $message - * @psalm-param non-empty-string $file - * @psalm-param positive-int $line - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testTriggeredWarning(Code\Test $test, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline): void - { - $this->dispatcher->dispatch( - new Test\WarningTriggered( - $this->telemetryInfo(), - $test, - $message, - $file, - $line, - $suppressed, - $ignoredByBaseline, - ), - ); - } - - /** - * @psalm-param non-empty-string $message - * @psalm-param non-empty-string $file - * @psalm-param positive-int $line - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testTriggeredPhpWarning(Code\Test $test, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline): void - { - $this->dispatcher->dispatch( - new Test\PhpWarningTriggered( - $this->telemetryInfo(), - $test, - $message, - $file, - $line, - $suppressed, - $ignoredByBaseline, - ), - ); - } - - /** - * @psalm-param non-empty-string $message - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testTriggeredPhpunitError(Code\Test $test, string $message): void - { - $this->dispatcher->dispatch( - new Test\PhpunitErrorTriggered( - $this->telemetryInfo(), - $test, - $message, - ), - ); - } - - /** - * @psalm-param non-empty-string $message - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testTriggeredPhpunitWarning(Code\Test $test, string $message): void - { - $this->dispatcher->dispatch( - new Test\PhpunitWarningTriggered( - $this->telemetryInfo(), - $test, - $message, - ), - ); - } - - /** - * @psalm-param non-empty-string $output - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testPrintedUnexpectedOutput(string $output): void - { - $this->dispatcher->dispatch( - new Test\PrintedUnexpectedOutput( - $this->telemetryInfo(), - $output, - ), - ); - } - - /** - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testFinished(Code\Test $test, int $numberOfAssertionsPerformed): void - { - $this->dispatcher->dispatch( - new Test\Finished( - $this->telemetryInfo(), - $test, - $numberOfAssertionsPerformed, - ), - ); - } - - /** - * @psalm-param class-string $testClassName - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function postConditionCalled(string $testClassName, ClassMethod $calledMethod): void - { - $this->dispatcher->dispatch( - new Test\PostConditionCalled( - $this->telemetryInfo(), - $testClassName, - $calledMethod, - ), - ); - } - - /** - * @psalm-param class-string $testClassName - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function postConditionErrored(string $testClassName, ClassMethod $calledMethod, Throwable $throwable): void - { - $this->dispatcher->dispatch( - new Test\PostConditionErrored( - $this->telemetryInfo(), - $testClassName, - $calledMethod, - $throwable, - ), - ); - } - - /** - * @psalm-param class-string $testClassName - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function postConditionFinished(string $testClassName, ClassMethod ...$calledMethods): void - { - $this->dispatcher->dispatch( - new Test\PostConditionFinished( - $this->telemetryInfo(), - $testClassName, - ...$calledMethods, - ), - ); - } - - /** - * @psalm-param class-string $testClassName - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function afterTestMethodCalled(string $testClassName, ClassMethod $calledMethod): void - { - $this->dispatcher->dispatch( - new Test\AfterTestMethodCalled( - $this->telemetryInfo(), - $testClassName, - $calledMethod, - ), - ); - } - - /** - * @psalm-param class-string $testClassName - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function afterTestMethodErrored(string $testClassName, ClassMethod $calledMethod, Throwable $throwable): void - { - $this->dispatcher->dispatch( - new Test\AfterTestMethodErrored( - $this->telemetryInfo(), - $testClassName, - $calledMethod, - $throwable, - ), - ); - } - - /** - * @psalm-param class-string $testClassName - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function afterTestMethodFinished(string $testClassName, ClassMethod ...$calledMethods): void - { - $this->dispatcher->dispatch( - new Test\AfterTestMethodFinished( - $this->telemetryInfo(), - $testClassName, - ...$calledMethods, - ), - ); - } - - /** - * @psalm-param class-string $testClassName - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function afterLastTestMethodCalled(string $testClassName, ClassMethod $calledMethod): void - { - $this->dispatcher->dispatch( - new Test\AfterLastTestMethodCalled( - $this->telemetryInfo(), - $testClassName, - $calledMethod, - ), - ); - } - - /** - * @psalm-param class-string $testClassName - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function afterLastTestMethodErrored(string $testClassName, ClassMethod $calledMethod, Throwable $throwable): void - { - $this->dispatcher->dispatch( - new Test\AfterLastTestMethodErrored( - $this->telemetryInfo(), - $testClassName, - $calledMethod, - $throwable, - ), - ); - } - - /** - * @psalm-param class-string $testClassName - * - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function afterLastTestMethodFinished(string $testClassName, ClassMethod ...$calledMethods): void - { - $this->dispatcher->dispatch( - new Test\AfterLastTestMethodFinished( - $this->telemetryInfo(), - $testClassName, - ...$calledMethods, - ), - ); - } - - /** - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testSuiteFinished(TestSuite $testSuite): void - { - $this->dispatcher->dispatch( - new TestSuiteFinished( - $this->telemetryInfo(), - $testSuite, - ), - ); - } - - /** - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testRunnerTriggeredPhpunitDeprecation(string $message): void - { - $this->dispatcher->dispatch( - new TestRunner\DeprecationTriggered( - $this->telemetryInfo(), - $message, - ), - ); - } - - /** - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testRunnerTriggeredPhpunitWarning(string $message): void - { - $this->dispatcher->dispatch( - new TestRunner\WarningTriggered( - $this->telemetryInfo(), - $message, - ), - ); - } - - /** - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testRunnerEnabledGarbageCollection(): void - { - $this->dispatcher->dispatch( - new TestRunner\GarbageCollectionEnabled($this->telemetryInfo()), - ); - } - - /** - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testRunnerExecutionAborted(): void - { - $this->dispatcher->dispatch( - new TestRunner\ExecutionAborted($this->telemetryInfo()), - ); - } - - /** - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testRunnerExecutionFinished(): void - { - $this->dispatcher->dispatch( - new TestRunner\ExecutionFinished($this->telemetryInfo()), - ); - } - - /** - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function testRunnerFinished(): void - { - $this->dispatcher->dispatch( - new TestRunner\Finished($this->telemetryInfo()), - ); - } - - /** - * @throws InvalidArgumentException - * @throws UnknownEventTypeException - */ - public function applicationFinished(int $shellExitCode): void - { - $this->dispatcher->dispatch( - new Application\Finished( - $this->telemetryInfo(), - $shellExitCode, - ), - ); - } - - /** - * @throws InvalidArgumentException - */ - private function telemetryInfo(): Telemetry\Info - { - $current = $this->system->snapshot(); - - $info = new Telemetry\Info( - $current, - $current->time()->duration($this->startSnapshot->time()), - $current->memoryUsage()->diff($this->startSnapshot->memoryUsage()), - $current->time()->duration($this->previousSnapshot->time()), - $current->memoryUsage()->diff($this->previousSnapshot->memoryUsage()), - ); - - $this->previousSnapshot = $current; - - return $info; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Emitter/Emitter.php b/vendor/phpunit/phpunit/src/Event/Emitter/Emitter.php deleted file mode 100644 index 4aaae39..0000000 --- a/vendor/phpunit/phpunit/src/Event/Emitter/Emitter.php +++ /dev/null @@ -1,335 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event; - -use PHPUnit\Event\Code\ClassMethod; -use PHPUnit\Event\Code\ComparisonFailure; -use PHPUnit\Event\Code\Throwable; -use PHPUnit\Event\TestSuite\TestSuite; -use PHPUnit\Framework\Constraint; -use PHPUnit\TextUI\Configuration\Configuration; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This interface is not covered by the backward compatibility promise for PHPUnit - */ -interface Emitter -{ - /** - * @deprecated - */ - public function exportObjects(): void; - - /** - * @deprecated - */ - public function exportsObjects(): bool; - - public function applicationStarted(): void; - - public function testRunnerStarted(): void; - - public function testRunnerConfigured(Configuration $configuration): void; - - public function testRunnerBootstrapFinished(string $filename): void; - - public function testRunnerLoadedExtensionFromPhar(string $filename, string $name, string $version): void; - - /** - * @psalm-param class-string $className - * @psalm-param array $parameters - */ - public function testRunnerBootstrappedExtension(string $className, array $parameters): void; - - public function dataProviderMethodCalled(ClassMethod $testMethod, ClassMethod $dataProviderMethod): void; - - public function dataProviderMethodFinished(ClassMethod $testMethod, ClassMethod ...$calledMethods): void; - - public function testSuiteLoaded(TestSuite $testSuite): void; - - public function testSuiteFiltered(TestSuite $testSuite): void; - - public function testSuiteSorted(int $executionOrder, int $executionOrderDefects, bool $resolveDependencies): void; - - public function testRunnerEventFacadeSealed(): void; - - public function testRunnerExecutionStarted(TestSuite $testSuite): void; - - public function testRunnerDisabledGarbageCollection(): void; - - public function testRunnerTriggeredGarbageCollection(): void; - - public function testSuiteSkipped(TestSuite $testSuite, string $message): void; - - public function testSuiteStarted(TestSuite $testSuite): void; - - public function testPreparationStarted(Code\Test $test): void; - - public function testPreparationFailed(Code\Test $test): void; - - /** - * @psalm-param class-string $testClassName - */ - public function beforeFirstTestMethodCalled(string $testClassName, ClassMethod $calledMethod): void; - - /** - * @psalm-param class-string $testClassName - */ - public function beforeFirstTestMethodErrored(string $testClassName, ClassMethod $calledMethod, Throwable $throwable): void; - - /** - * @psalm-param class-string $testClassName - */ - public function beforeFirstTestMethodFinished(string $testClassName, ClassMethod ...$calledMethods): void; - - /** - * @psalm-param class-string $testClassName - */ - public function beforeTestMethodCalled(string $testClassName, ClassMethod $calledMethod): void; - - /** - * @psalm-param class-string $testClassName - */ - public function beforeTestMethodErrored(string $testClassName, ClassMethod $calledMethod, Throwable $throwable): void; - - /** - * @psalm-param class-string $testClassName - */ - public function beforeTestMethodFinished(string $testClassName, ClassMethod ...$calledMethods): void; - - /** - * @psalm-param class-string $testClassName - */ - public function preConditionCalled(string $testClassName, ClassMethod $calledMethod): void; - - /** - * @psalm-param class-string $testClassName - */ - public function preConditionErrored(string $testClassName, ClassMethod $calledMethod, Throwable $throwable): void; - - /** - * @psalm-param class-string $testClassName - */ - public function preConditionFinished(string $testClassName, ClassMethod ...$calledMethods): void; - - public function testPrepared(Code\Test $test): void; - - /** - * @psalm-param class-string $className - */ - public function testRegisteredComparator(string $className): void; - - /** - * @deprecated - */ - public function testAssertionSucceeded(mixed $value, Constraint\Constraint $constraint, string $message): void; - - /** - * @deprecated - */ - public function testAssertionFailed(mixed $value, Constraint\Constraint $constraint, string $message): void; - - /** - * @psalm-param class-string $className - */ - public function testCreatedMockObject(string $className): void; - - /** - * @psalm-param list $interfaces - */ - public function testCreatedMockObjectForIntersectionOfInterfaces(array $interfaces): void; - - /** - * @psalm-param trait-string $traitName - */ - public function testCreatedMockObjectForTrait(string $traitName): void; - - /** - * @psalm-param class-string $className - */ - public function testCreatedMockObjectForAbstractClass(string $className): void; - - /** - * @psalm-param class-string $originalClassName - * @psalm-param class-string $mockClassName - */ - public function testCreatedMockObjectFromWsdl(string $wsdlFile, string $originalClassName, string $mockClassName, array $methods, bool $callOriginalConstructor, array $options): void; - - /** - * @psalm-param class-string $className - */ - public function testCreatedPartialMockObject(string $className, string ...$methodNames): void; - - /** - * @psalm-param class-string $className - */ - public function testCreatedTestProxy(string $className, array $constructorArguments): void; - - /** - * @psalm-param class-string $className - */ - public function testCreatedStub(string $className): void; - - /** - * @psalm-param list $interfaces - */ - public function testCreatedStubForIntersectionOfInterfaces(array $interfaces): void; - - public function testErrored(Code\Test $test, Throwable $throwable): void; - - public function testFailed(Code\Test $test, Throwable $throwable, ?ComparisonFailure $comparisonFailure): void; - - public function testPassed(Code\Test $test): void; - - /** - * @psalm-param non-empty-string $message - */ - public function testConsideredRisky(Code\Test $test, string $message): void; - - public function testMarkedAsIncomplete(Code\Test $test, Throwable $throwable): void; - - /** - * @psalm-param non-empty-string $message - */ - public function testSkipped(Code\Test $test, string $message): void; - - /** - * @psalm-param non-empty-string $message - */ - public function testTriggeredPhpunitDeprecation(Code\Test $test, string $message): void; - - /** - * @psalm-param non-empty-string $message - * @psalm-param non-empty-string $file - * @psalm-param positive-int $line - */ - public function testTriggeredPhpDeprecation(Code\Test $test, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline, bool $ignoredByTest): void; - - /** - * @psalm-param non-empty-string $message - * @psalm-param non-empty-string $file - * @psalm-param positive-int $line - */ - public function testTriggeredDeprecation(Code\Test $test, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline, bool $ignoredByTest): void; - - /** - * @psalm-param non-empty-string $message - * @psalm-param non-empty-string $file - * @psalm-param positive-int $line - */ - public function testTriggeredError(Code\Test $test, string $message, string $file, int $line, bool $suppressed): void; - - /** - * @psalm-param non-empty-string $message - * @psalm-param non-empty-string $file - * @psalm-param positive-int $line - */ - public function testTriggeredNotice(Code\Test $test, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline): void; - - /** - * @psalm-param non-empty-string $message - * @psalm-param non-empty-string $file - * @psalm-param positive-int $line - */ - public function testTriggeredPhpNotice(Code\Test $test, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline): void; - - /** - * @psalm-param non-empty-string $message - * @psalm-param non-empty-string $file - * @psalm-param positive-int $line - */ - public function testTriggeredWarning(Code\Test $test, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline): void; - - /** - * @psalm-param non-empty-string $message - * @psalm-param non-empty-string $file - * @psalm-param positive-int $line - */ - public function testTriggeredPhpWarning(Code\Test $test, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline): void; - - /** - * @psalm-param non-empty-string $message - */ - public function testTriggeredPhpunitError(Code\Test $test, string $message): void; - - /** - * @psalm-param non-empty-string $message - */ - public function testTriggeredPhpunitWarning(Code\Test $test, string $message): void; - - /** - * @psalm-param non-empty-string $output - */ - public function testPrintedUnexpectedOutput(string $output): void; - - public function testFinished(Code\Test $test, int $numberOfAssertionsPerformed): void; - - /** - * @psalm-param class-string $testClassName - */ - public function postConditionCalled(string $testClassName, ClassMethod $calledMethod): void; - - /** - * @psalm-param class-string $testClassName - */ - public function postConditionErrored(string $testClassName, ClassMethod $calledMethod, Throwable $throwable): void; - - /** - * @psalm-param class-string $testClassName - */ - public function postConditionFinished(string $testClassName, ClassMethod ...$calledMethods): void; - - /** - * @psalm-param class-string $testClassName - */ - public function afterTestMethodCalled(string $testClassName, ClassMethod $calledMethod): void; - - /** - * @psalm-param class-string $testClassName - */ - public function afterTestMethodErrored(string $testClassName, ClassMethod $calledMethod, Throwable $throwable): void; - - /** - * @psalm-param class-string $testClassName - */ - public function afterTestMethodFinished(string $testClassName, ClassMethod ...$calledMethods): void; - - /** - * @psalm-param class-string $testClassName - */ - public function afterLastTestMethodCalled(string $testClassName, ClassMethod $calledMethod): void; - - /** - * @psalm-param class-string $testClassName - */ - public function afterLastTestMethodErrored(string $testClassName, ClassMethod $calledMethod, Throwable $throwable): void; - - /** - * @psalm-param class-string $testClassName - */ - public function afterLastTestMethodFinished(string $testClassName, ClassMethod ...$calledMethods): void; - - public function testSuiteFinished(TestSuite $testSuite): void; - - public function testRunnerTriggeredPhpunitDeprecation(string $message): void; - - public function testRunnerTriggeredPhpunitWarning(string $message): void; - - public function testRunnerEnabledGarbageCollection(): void; - - public function testRunnerExecutionAborted(): void; - - public function testRunnerExecutionFinished(): void; - - public function testRunnerFinished(): void; - - public function applicationFinished(int $shellExitCode): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Application/Finished.php b/vendor/phpunit/phpunit/src/Event/Events/Application/Finished.php deleted file mode 100644 index e196c4f..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Application/Finished.php +++ /dev/null @@ -1,49 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Application; - -use function sprintf; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class Finished implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - private readonly int $shellExitCode; - - public function __construct(Telemetry\Info $telemetryInfo, int $shellExitCode) - { - $this->telemetryInfo = $telemetryInfo; - $this->shellExitCode = $shellExitCode; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function shellExitCode(): int - { - return $this->shellExitCode; - } - - public function asString(): string - { - return sprintf( - 'PHPUnit Finished (Shell Exit Code: %d)', - $this->shellExitCode, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Application/FinishedSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Application/FinishedSubscriber.php deleted file mode 100644 index 1e75977..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Application/FinishedSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Application; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface FinishedSubscriber extends Subscriber -{ - public function notify(Finished $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Application/Started.php b/vendor/phpunit/phpunit/src/Event/Events/Application/Started.php deleted file mode 100644 index da570a0..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Application/Started.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Application; - -use function sprintf; -use PHPUnit\Event\Event; -use PHPUnit\Event\Runtime\Runtime; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class Started implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - private readonly Runtime $runtime; - - public function __construct(Telemetry\Info $telemetryInfo, Runtime $runtime) - { - $this->telemetryInfo = $telemetryInfo; - $this->runtime = $runtime; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function runtime(): Runtime - { - return $this->runtime; - } - - public function asString(): string - { - return sprintf( - 'PHPUnit Started (%s)', - $this->runtime->asString(), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Application/StartedSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Application/StartedSubscriber.php deleted file mode 100644 index f2ebee2..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Application/StartedSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Application; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface StartedSubscriber extends Subscriber -{ - public function notify(Started $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Event.php b/vendor/phpunit/phpunit/src/Event/Events/Event.php deleted file mode 100644 index 8aa014b..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Event.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface Event -{ - public function telemetryInfo(): Telemetry\Info; - - public function asString(): string; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/EventCollection.php b/vendor/phpunit/phpunit/src/Event/Events/EventCollection.php deleted file mode 100644 index ecefb37..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/EventCollection.php +++ /dev/null @@ -1,62 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event; - -use function count; -use Countable; -use IteratorAggregate; - -/** - * @template-implements IteratorAggregate - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class EventCollection implements Countable, IteratorAggregate -{ - /** - * @psalm-var list - */ - private array $events = []; - - public function add(Event ...$events): void - { - foreach ($events as $event) { - $this->events[] = $event; - } - } - - /** - * @psalm-return list - */ - public function asArray(): array - { - return $this->events; - } - - public function count(): int - { - return count($this->events); - } - - public function isEmpty(): bool - { - return $this->count() === 0; - } - - public function isNotEmpty(): bool - { - return $this->count() > 0; - } - - public function getIterator(): EventCollectionIterator - { - return new EventCollectionIterator($this); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/EventCollectionIterator.php b/vendor/phpunit/phpunit/src/Event/Events/EventCollectionIterator.php deleted file mode 100644 index 7a09fa4..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/EventCollectionIterator.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event; - -use function count; -use Iterator; - -/** - * @template-implements Iterator - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class EventCollectionIterator implements Iterator -{ - /** - * @psalm-var list - */ - private readonly array $events; - private int $position = 0; - - public function __construct(EventCollection $events) - { - $this->events = $events->asArray(); - } - - public function rewind(): void - { - $this->position = 0; - } - - public function valid(): bool - { - return $this->position < count($this->events); - } - - public function key(): int - { - return $this->position; - } - - public function current(): Event - { - return $this->events[$this->position]; - } - - public function next(): void - { - $this->position++; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionFailed.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionFailed.php deleted file mode 100644 index 68954f2..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionFailed.php +++ /dev/null @@ -1,76 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use function sprintf; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @deprecated - */ -final class AssertionFailed implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - private readonly string $value; - private readonly string $constraint; - private readonly int $count; - private readonly string $message; - - public function __construct(Telemetry\Info $telemetryInfo, string $value, string $constraint, int $count, string $message) - { - $this->telemetryInfo = $telemetryInfo; - $this->value = $value; - $this->constraint = $constraint; - $this->count = $count; - $this->message = $message; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function value(): string - { - return $this->value; - } - - public function count(): int - { - return $this->count; - } - - public function message(): string - { - return $this->message; - } - - public function asString(): string - { - $message = ''; - - if (!empty($this->message)) { - $message = sprintf( - ', Message: %s', - $this->message, - ); - } - - return sprintf( - 'Assertion Failed (Constraint: %s, Value: %s%s)', - $this->constraint, - $this->value, - $message, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionFailedSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionFailedSubscriber.php deleted file mode 100644 index c569bcc..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionFailedSubscriber.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @deprecated - */ -interface AssertionFailedSubscriber extends Subscriber -{ - public function notify(AssertionFailed $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionSucceeded.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionSucceeded.php deleted file mode 100644 index d4f8548..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionSucceeded.php +++ /dev/null @@ -1,76 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use function sprintf; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @deprecated - */ -final class AssertionSucceeded implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - private readonly string $value; - private readonly string $constraint; - private readonly int $count; - private readonly string $message; - - public function __construct(Telemetry\Info $telemetryInfo, string $value, string $constraint, int $count, string $message) - { - $this->telemetryInfo = $telemetryInfo; - $this->value = $value; - $this->constraint = $constraint; - $this->count = $count; - $this->message = $message; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function value(): string - { - return $this->value; - } - - public function count(): int - { - return $this->count; - } - - public function message(): string - { - return $this->message; - } - - public function asString(): string - { - $message = ''; - - if (!empty($this->message)) { - $message = sprintf( - ', Message: %s', - $this->message, - ); - } - - return sprintf( - 'Assertion Succeeded (Constraint: %s, Value: %s%s)', - $this->constraint, - $this->value, - $message, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionSucceededSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionSucceededSubscriber.php deleted file mode 100644 index 59d72c0..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionSucceededSubscriber.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @deprecated - */ -interface AssertionSucceededSubscriber extends Subscriber -{ - public function notify(AssertionSucceeded $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/ComparatorRegistered.php b/vendor/phpunit/phpunit/src/Event/Events/Test/ComparatorRegistered.php deleted file mode 100644 index 9e83d3d..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/ComparatorRegistered.php +++ /dev/null @@ -1,59 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use function sprintf; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class ComparatorRegistered implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - - /** - * @psalm-var class-string - */ - private readonly string $className; - - /** - * @psalm-param class-string $className - */ - public function __construct(Telemetry\Info $telemetryInfo, string $className) - { - $this->telemetryInfo = $telemetryInfo; - $this->className = $className; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - /** - * @psalm-return class-string - */ - public function className(): string - { - return $this->className; - } - - public function asString(): string - { - return sprintf( - 'Comparator Registered (%s)', - $this->className, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/ComparatorRegisteredSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/ComparatorRegisteredSubscriber.php deleted file mode 100644 index 10ba78e..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/ComparatorRegisteredSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface ComparatorRegisteredSubscriber extends Subscriber -{ - public function notify(ComparatorRegistered $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodCalled.php b/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodCalled.php deleted file mode 100644 index fec2a79..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodCalled.php +++ /dev/null @@ -1,68 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use function sprintf; -use PHPUnit\Event\Code; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class AfterLastTestMethodCalled implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - - /** - * @psalm-var class-string - */ - private readonly string $testClassName; - private readonly Code\ClassMethod $calledMethod; - - /** - * @psalm-param class-string $testClassName - */ - public function __construct(Telemetry\Info $telemetryInfo, string $testClassName, Code\ClassMethod $calledMethod) - { - $this->telemetryInfo = $telemetryInfo; - $this->testClassName = $testClassName; - $this->calledMethod = $calledMethod; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - /** - * @psalm-return class-string - */ - public function testClassName(): string - { - return $this->testClassName; - } - - public function calledMethod(): Code\ClassMethod - { - return $this->calledMethod; - } - - public function asString(): string - { - return sprintf( - 'After Last Test Method Called (%s::%s)', - $this->calledMethod->className(), - $this->calledMethod->methodName(), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodCalledSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodCalledSubscriber.php deleted file mode 100644 index 08530ab..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodCalledSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface AfterLastTestMethodCalledSubscriber extends Subscriber -{ - public function notify(AfterLastTestMethodCalled $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodErrored.php b/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodErrored.php deleted file mode 100644 index 874bae4..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodErrored.php +++ /dev/null @@ -1,84 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use const PHP_EOL; -use function sprintf; -use PHPUnit\Event\Code; -use PHPUnit\Event\Code\Throwable; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class AfterLastTestMethodErrored implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - - /** - * @psalm-var class-string - */ - private readonly string $testClassName; - private readonly Code\ClassMethod $calledMethod; - private readonly Throwable $throwable; - - /** - * @psalm-param class-string $testClassName - */ - public function __construct(Telemetry\Info $telemetryInfo, string $testClassName, Code\ClassMethod $calledMethod, Throwable $throwable) - { - $this->telemetryInfo = $telemetryInfo; - $this->testClassName = $testClassName; - $this->calledMethod = $calledMethod; - $this->throwable = $throwable; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - /** - * @psalm-return class-string - */ - public function testClassName(): string - { - return $this->testClassName; - } - - public function calledMethod(): Code\ClassMethod - { - return $this->calledMethod; - } - - public function throwable(): Throwable - { - return $this->throwable; - } - - public function asString(): string - { - $message = $this->throwable->message(); - - if (!empty($message)) { - $message = PHP_EOL . $message; - } - - return sprintf( - 'After Last Test Method Errored (%s::%s)%s', - $this->calledMethod->className(), - $this->calledMethod->methodName(), - $message, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodErroredSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodErroredSubscriber.php deleted file mode 100644 index b994fde..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodErroredSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface AfterLastTestMethodErroredSubscriber extends Subscriber -{ - public function notify(AfterLastTestMethodErrored $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodFinished.php b/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodFinished.php deleted file mode 100644 index 40a6c9f..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodFinished.php +++ /dev/null @@ -1,82 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use const PHP_EOL; -use function sprintf; -use PHPUnit\Event\Code; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class AfterLastTestMethodFinished implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - - /** - * @psalm-var class-string - */ - private readonly string $testClassName; - - /** - * @psalm-var list - */ - private readonly array $calledMethods; - - /** - * @psalm-param class-string $testClassName - */ - public function __construct(Telemetry\Info $telemetryInfo, string $testClassName, Code\ClassMethod ...$calledMethods) - { - $this->telemetryInfo = $telemetryInfo; - $this->testClassName = $testClassName; - $this->calledMethods = $calledMethods; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - /** - * @psalm-return class-string - */ - public function testClassName(): string - { - return $this->testClassName; - } - - /** - * @psalm-return list - */ - public function calledMethods(): array - { - return $this->calledMethods; - } - - public function asString(): string - { - $buffer = 'After Last Test Method Finished:'; - - foreach ($this->calledMethods as $calledMethod) { - $buffer .= sprintf( - PHP_EOL . '- %s::%s', - $calledMethod->className(), - $calledMethod->methodName(), - ); - } - - return $buffer; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodFinishedSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodFinishedSubscriber.php deleted file mode 100644 index 0a366b0..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodFinishedSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface AfterLastTestMethodFinishedSubscriber extends Subscriber -{ - public function notify(AfterLastTestMethodFinished $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodCalled.php b/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodCalled.php deleted file mode 100644 index 52afc14..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodCalled.php +++ /dev/null @@ -1,68 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use function sprintf; -use PHPUnit\Event\Code; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class AfterTestMethodCalled implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - - /** - * @psalm-var class-string - */ - private readonly string $testClassName; - private readonly Code\ClassMethod $calledMethod; - - /** - * @psalm-param class-string $testClassName - */ - public function __construct(Telemetry\Info $telemetryInfo, string $testClassName, Code\ClassMethod $calledMethod) - { - $this->telemetryInfo = $telemetryInfo; - $this->testClassName = $testClassName; - $this->calledMethod = $calledMethod; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - /** - * @psalm-return class-string - */ - public function testClassName(): string - { - return $this->testClassName; - } - - public function calledMethod(): Code\ClassMethod - { - return $this->calledMethod; - } - - public function asString(): string - { - return sprintf( - 'After Test Method Called (%s::%s)', - $this->calledMethod->className(), - $this->calledMethod->methodName(), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodCalledSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodCalledSubscriber.php deleted file mode 100644 index 3e72fc9..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodCalledSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface AfterTestMethodCalledSubscriber extends Subscriber -{ - public function notify(AfterTestMethodCalled $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodErrored.php b/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodErrored.php deleted file mode 100644 index 676f4c5..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodErrored.php +++ /dev/null @@ -1,84 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use const PHP_EOL; -use function sprintf; -use PHPUnit\Event\Code; -use PHPUnit\Event\Code\Throwable; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class AfterTestMethodErrored implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - - /** - * @psalm-var class-string - */ - private readonly string $testClassName; - private readonly Code\ClassMethod $calledMethod; - private readonly Throwable $throwable; - - /** - * @psalm-param class-string $testClassName - */ - public function __construct(Telemetry\Info $telemetryInfo, string $testClassName, Code\ClassMethod $calledMethod, Throwable $throwable) - { - $this->telemetryInfo = $telemetryInfo; - $this->testClassName = $testClassName; - $this->calledMethod = $calledMethod; - $this->throwable = $throwable; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - /** - * @psalm-return class-string - */ - public function testClassName(): string - { - return $this->testClassName; - } - - public function calledMethod(): Code\ClassMethod - { - return $this->calledMethod; - } - - public function throwable(): Throwable - { - return $this->throwable; - } - - public function asString(): string - { - $message = $this->throwable->message(); - - if (!empty($message)) { - $message = PHP_EOL . $message; - } - - return sprintf( - 'After Test Method Errored (%s::%s)%s', - $this->calledMethod->className(), - $this->calledMethod->methodName(), - $message, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodErroredSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodErroredSubscriber.php deleted file mode 100644 index 622f916..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodErroredSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface AfterTestMethodErroredSubscriber extends Subscriber -{ - public function notify(AfterTestMethodErrored $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodFinished.php b/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodFinished.php deleted file mode 100644 index e934eea..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodFinished.php +++ /dev/null @@ -1,82 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use const PHP_EOL; -use function sprintf; -use PHPUnit\Event\Code; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class AfterTestMethodFinished implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - - /** - * @psalm-var class-string - */ - private readonly string $testClassName; - - /** - * @psalm-var list - */ - private readonly array $calledMethods; - - /** - * @psalm-param class-string $testClassName - */ - public function __construct(Telemetry\Info $telemetryInfo, string $testClassName, Code\ClassMethod ...$calledMethods) - { - $this->telemetryInfo = $telemetryInfo; - $this->testClassName = $testClassName; - $this->calledMethods = $calledMethods; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - /** - * @psalm-return class-string - */ - public function testClassName(): string - { - return $this->testClassName; - } - - /** - * @psalm-return list - */ - public function calledMethods(): array - { - return $this->calledMethods; - } - - public function asString(): string - { - $buffer = 'After Test Method Finished:'; - - foreach ($this->calledMethods as $calledMethod) { - $buffer .= sprintf( - PHP_EOL . '- %s::%s', - $calledMethod->className(), - $calledMethod->methodName(), - ); - } - - return $buffer; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodFinishedSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodFinishedSubscriber.php deleted file mode 100644 index 5e56688..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodFinishedSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface AfterTestMethodFinishedSubscriber extends Subscriber -{ - public function notify(AfterTestMethodFinished $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodCalled.php b/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodCalled.php deleted file mode 100644 index da28f2b..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodCalled.php +++ /dev/null @@ -1,68 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use function sprintf; -use PHPUnit\Event\Code; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class BeforeFirstTestMethodCalled implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - - /** - * @psalm-var class-string - */ - private readonly string $testClassName; - private readonly Code\ClassMethod $calledMethod; - - /** - * @psalm-param class-string $testClassName - */ - public function __construct(Telemetry\Info $telemetryInfo, string $testClassName, Code\ClassMethod $calledMethod) - { - $this->telemetryInfo = $telemetryInfo; - $this->testClassName = $testClassName; - $this->calledMethod = $calledMethod; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - /** - * @psalm-return class-string - */ - public function testClassName(): string - { - return $this->testClassName; - } - - public function calledMethod(): Code\ClassMethod - { - return $this->calledMethod; - } - - public function asString(): string - { - return sprintf( - 'Before First Test Method Called (%s::%s)', - $this->calledMethod->className(), - $this->calledMethod->methodName(), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodCalledSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodCalledSubscriber.php deleted file mode 100644 index a0d4281..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodCalledSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface BeforeFirstTestMethodCalledSubscriber extends Subscriber -{ - public function notify(BeforeFirstTestMethodCalled $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodErrored.php b/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodErrored.php deleted file mode 100644 index 959b135..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodErrored.php +++ /dev/null @@ -1,84 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use const PHP_EOL; -use function sprintf; -use PHPUnit\Event\Code; -use PHPUnit\Event\Code\Throwable; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class BeforeFirstTestMethodErrored implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - - /** - * @psalm-var class-string - */ - private readonly string $testClassName; - private readonly Code\ClassMethod $calledMethod; - private readonly Throwable $throwable; - - /** - * @psalm-param class-string $testClassName - */ - public function __construct(Telemetry\Info $telemetryInfo, string $testClassName, Code\ClassMethod $calledMethod, Throwable $throwable) - { - $this->telemetryInfo = $telemetryInfo; - $this->testClassName = $testClassName; - $this->calledMethod = $calledMethod; - $this->throwable = $throwable; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - /** - * @psalm-return class-string - */ - public function testClassName(): string - { - return $this->testClassName; - } - - public function calledMethod(): Code\ClassMethod - { - return $this->calledMethod; - } - - public function throwable(): Throwable - { - return $this->throwable; - } - - public function asString(): string - { - $message = $this->throwable->message(); - - if (!empty($message)) { - $message = PHP_EOL . $message; - } - - return sprintf( - 'Before First Test Method Errored (%s::%s)%s', - $this->calledMethod->className(), - $this->calledMethod->methodName(), - $message, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodErroredSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodErroredSubscriber.php deleted file mode 100644 index 9a1b875..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodErroredSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface BeforeFirstTestMethodErroredSubscriber extends Subscriber -{ - public function notify(BeforeFirstTestMethodErrored $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodFinished.php b/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodFinished.php deleted file mode 100644 index fba563d..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodFinished.php +++ /dev/null @@ -1,82 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use const PHP_EOL; -use function sprintf; -use PHPUnit\Event\Code; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class BeforeFirstTestMethodFinished implements Event -{ - private readonly Telemetry\Info$telemetryInfo; - - /** - * @psalm-var class-string - */ - private readonly string $testClassName; - - /** - * @psalm-var list - */ - private readonly array $calledMethods; - - /** - * @psalm-param class-string $testClassName - */ - public function __construct(Telemetry\Info $telemetryInfo, string $testClassName, Code\ClassMethod ...$calledMethods) - { - $this->telemetryInfo = $telemetryInfo; - $this->testClassName = $testClassName; - $this->calledMethods = $calledMethods; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - /** - * @psalm-return class-string - */ - public function testClassName(): string - { - return $this->testClassName; - } - - /** - * @psalm-return list - */ - public function calledMethods(): array - { - return $this->calledMethods; - } - - public function asString(): string - { - $buffer = 'Before First Test Method Finished:'; - - foreach ($this->calledMethods as $calledMethod) { - $buffer .= sprintf( - PHP_EOL . '- %s::%s', - $calledMethod->className(), - $calledMethod->methodName(), - ); - } - - return $buffer; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodFinishedSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodFinishedSubscriber.php deleted file mode 100644 index c9f1806..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodFinishedSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface BeforeFirstTestMethodFinishedSubscriber extends Subscriber -{ - public function notify(BeforeFirstTestMethodFinished $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodCalled.php b/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodCalled.php deleted file mode 100644 index 3b300fa..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodCalled.php +++ /dev/null @@ -1,68 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use function sprintf; -use PHPUnit\Event\Code; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class BeforeTestMethodCalled implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - - /** - * @psalm-var class-string - */ - private readonly string $testClassName; - private readonly Code\ClassMethod $calledMethod; - - /** - * @psalm-param class-string $testClassName - */ - public function __construct(Telemetry\Info $telemetryInfo, string $testClassName, Code\ClassMethod $calledMethod) - { - $this->telemetryInfo = $telemetryInfo; - $this->testClassName = $testClassName; - $this->calledMethod = $calledMethod; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - /** - * @psalm-return class-string - */ - public function testClassName(): string - { - return $this->testClassName; - } - - public function calledMethod(): Code\ClassMethod - { - return $this->calledMethod; - } - - public function asString(): string - { - return sprintf( - 'Before Test Method Called (%s::%s)', - $this->calledMethod->className(), - $this->calledMethod->methodName(), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodCalledSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodCalledSubscriber.php deleted file mode 100644 index 5f4e180..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodCalledSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface BeforeTestMethodCalledSubscriber extends Subscriber -{ - public function notify(BeforeTestMethodCalled $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodErrored.php b/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodErrored.php deleted file mode 100644 index 0293fb8..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodErrored.php +++ /dev/null @@ -1,84 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use const PHP_EOL; -use function sprintf; -use PHPUnit\Event\Code; -use PHPUnit\Event\Code\Throwable; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class BeforeTestMethodErrored implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - - /** - * @psalm-var class-string - */ - private readonly string $testClassName; - private readonly Code\ClassMethod $calledMethod; - private readonly Throwable $throwable; - - /** - * @psalm-param class-string $testClassName - */ - public function __construct(Telemetry\Info $telemetryInfo, string $testClassName, Code\ClassMethod $calledMethod, Throwable $throwable) - { - $this->telemetryInfo = $telemetryInfo; - $this->testClassName = $testClassName; - $this->calledMethod = $calledMethod; - $this->throwable = $throwable; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - /** - * @psalm-return class-string - */ - public function testClassName(): string - { - return $this->testClassName; - } - - public function calledMethod(): Code\ClassMethod - { - return $this->calledMethod; - } - - public function throwable(): Throwable - { - return $this->throwable; - } - - public function asString(): string - { - $message = $this->throwable->message(); - - if (!empty($message)) { - $message = PHP_EOL . $message; - } - - return sprintf( - 'Before Test Method Errored (%s::%s)%s', - $this->calledMethod->className(), - $this->calledMethod->methodName(), - $message, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodErroredSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodErroredSubscriber.php deleted file mode 100644 index e53771c..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodErroredSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface BeforeTestMethodErroredSubscriber extends Subscriber -{ - public function notify(BeforeTestMethodErrored $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodFinished.php b/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodFinished.php deleted file mode 100644 index f84b51b..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodFinished.php +++ /dev/null @@ -1,82 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use const PHP_EOL; -use function sprintf; -use PHPUnit\Event\Code; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class BeforeTestMethodFinished implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - - /** - * @psalm-var class-string - */ - private readonly string $testClassName; - - /** - * @psalm-var list - */ - private readonly array $calledMethods; - - /** - * @psalm-param class-string $testClassName - */ - public function __construct(Telemetry\Info $telemetryInfo, string $testClassName, Code\ClassMethod ...$calledMethods) - { - $this->telemetryInfo = $telemetryInfo; - $this->testClassName = $testClassName; - $this->calledMethods = $calledMethods; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - /** - * @psalm-return class-string - */ - public function testClassName(): string - { - return $this->testClassName; - } - - /** - * @psalm-return list - */ - public function calledMethods(): array - { - return $this->calledMethods; - } - - public function asString(): string - { - $buffer = 'Before Test Method Finished:'; - - foreach ($this->calledMethods as $calledMethod) { - $buffer .= sprintf( - PHP_EOL . '- %s::%s', - $calledMethod->className(), - $calledMethod->methodName(), - ); - } - - return $buffer; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodFinishedSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodFinishedSubscriber.php deleted file mode 100644 index 2a6c758..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodFinishedSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface BeforeTestMethodFinishedSubscriber extends Subscriber -{ - public function notify(BeforeTestMethodFinished $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionCalled.php b/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionCalled.php deleted file mode 100644 index e7b6c43..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionCalled.php +++ /dev/null @@ -1,68 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use function sprintf; -use PHPUnit\Event\Code; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class PostConditionCalled implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - - /** - * @psalm-var class-string - */ - private readonly string $testClassName; - private readonly Code\ClassMethod $calledMethod; - - /** - * @psalm-param class-string $testClassName - */ - public function __construct(Telemetry\Info $telemetryInfo, string $testClassName, Code\ClassMethod $calledMethod) - { - $this->telemetryInfo = $telemetryInfo; - $this->testClassName = $testClassName; - $this->calledMethod = $calledMethod; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - /** - * @psalm-return class-string - */ - public function testClassName(): string - { - return $this->testClassName; - } - - public function calledMethod(): Code\ClassMethod - { - return $this->calledMethod; - } - - public function asString(): string - { - return sprintf( - 'Post Condition Method Called (%s::%s)', - $this->calledMethod->className(), - $this->calledMethod->methodName(), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionCalledSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionCalledSubscriber.php deleted file mode 100644 index 2c135f5..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionCalledSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface PostConditionCalledSubscriber extends Subscriber -{ - public function notify(PostConditionCalled $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionErrored.php b/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionErrored.php deleted file mode 100644 index 9aa4f6f..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionErrored.php +++ /dev/null @@ -1,84 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use const PHP_EOL; -use function sprintf; -use PHPUnit\Event\Code; -use PHPUnit\Event\Code\Throwable; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class PostConditionErrored implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - - /** - * @psalm-var class-string - */ - private readonly string $testClassName; - private readonly Code\ClassMethod $calledMethod; - private readonly Throwable $throwable; - - /** - * @psalm-param class-string $testClassName - */ - public function __construct(Telemetry\Info $telemetryInfo, string $testClassName, Code\ClassMethod $calledMethod, Throwable $throwable) - { - $this->telemetryInfo = $telemetryInfo; - $this->testClassName = $testClassName; - $this->calledMethod = $calledMethod; - $this->throwable = $throwable; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - /** - * @psalm-return class-string - */ - public function testClassName(): string - { - return $this->testClassName; - } - - public function calledMethod(): Code\ClassMethod - { - return $this->calledMethod; - } - - public function throwable(): Throwable - { - return $this->throwable; - } - - public function asString(): string - { - $message = $this->throwable->message(); - - if (!empty($message)) { - $message = PHP_EOL . $message; - } - - return sprintf( - 'Post Condition Method Errored (%s::%s)%s', - $this->calledMethod->className(), - $this->calledMethod->methodName(), - $message, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionErroredSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionErroredSubscriber.php deleted file mode 100644 index 7bd2c54..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionErroredSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface PostConditionErroredSubscriber extends Subscriber -{ - public function notify(PostConditionErrored $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionFinished.php b/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionFinished.php deleted file mode 100644 index fff07ce..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionFinished.php +++ /dev/null @@ -1,82 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use const PHP_EOL; -use function sprintf; -use PHPUnit\Event\Code; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class PostConditionFinished implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - - /** - * @psalm-var class-string - */ - private readonly string $testClassName; - - /** - * @psalm-var list - */ - private readonly array $calledMethods; - - /** - * @psalm-param class-string $testClassName - */ - public function __construct(Telemetry\Info $telemetryInfo, string $testClassName, Code\ClassMethod ...$calledMethods) - { - $this->telemetryInfo = $telemetryInfo; - $this->testClassName = $testClassName; - $this->calledMethods = $calledMethods; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - /** - * @psalm-return class-string - */ - public function testClassName(): string - { - return $this->testClassName; - } - - /** - * @psalm-return list - */ - public function calledMethods(): array - { - return $this->calledMethods; - } - - public function asString(): string - { - $buffer = 'Post Condition Method Finished:'; - - foreach ($this->calledMethods as $calledMethod) { - $buffer .= sprintf( - PHP_EOL . '- %s::%s', - $calledMethod->className(), - $calledMethod->methodName(), - ); - } - - return $buffer; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionFinishedSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionFinishedSubscriber.php deleted file mode 100644 index f24d948..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionFinishedSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface PostConditionFinishedSubscriber extends Subscriber -{ - public function notify(PostConditionFinished $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionCalled.php b/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionCalled.php deleted file mode 100644 index 9375254..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionCalled.php +++ /dev/null @@ -1,68 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use function sprintf; -use PHPUnit\Event\Code; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class PreConditionCalled implements Event -{ - private readonly Telemetry\Info$telemetryInfo; - - /** - * @psalm-var class-string - */ - private readonly string $testClassName; - private readonly Code\ClassMethod $calledMethod; - - /** - * @psalm-param class-string $testClassName - */ - public function __construct(Telemetry\Info $telemetryInfo, string $testClassName, Code\ClassMethod $calledMethod) - { - $this->telemetryInfo = $telemetryInfo; - $this->testClassName = $testClassName; - $this->calledMethod = $calledMethod; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - /** - * @psalm-return class-string - */ - public function testClassName(): string - { - return $this->testClassName; - } - - public function calledMethod(): Code\ClassMethod - { - return $this->calledMethod; - } - - public function asString(): string - { - return sprintf( - 'Pre Condition Method Called (%s::%s)', - $this->calledMethod->className(), - $this->calledMethod->methodName(), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionCalledSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionCalledSubscriber.php deleted file mode 100644 index 431dfcc..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionCalledSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface PreConditionCalledSubscriber extends Subscriber -{ - public function notify(PreConditionCalled $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionErrored.php b/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionErrored.php deleted file mode 100644 index 7bfbc37..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionErrored.php +++ /dev/null @@ -1,84 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use const PHP_EOL; -use function sprintf; -use PHPUnit\Event\Code; -use PHPUnit\Event\Code\Throwable; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class PreConditionErrored implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - - /** - * @psalm-var class-string - */ - private readonly string $testClassName; - private readonly Code\ClassMethod $calledMethod; - private readonly Throwable $throwable; - - /** - * @psalm-param class-string $testClassName - */ - public function __construct(Telemetry\Info $telemetryInfo, string $testClassName, Code\ClassMethod $calledMethod, Throwable $throwable) - { - $this->telemetryInfo = $telemetryInfo; - $this->testClassName = $testClassName; - $this->calledMethod = $calledMethod; - $this->throwable = $throwable; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - /** - * @psalm-return class-string - */ - public function testClassName(): string - { - return $this->testClassName; - } - - public function calledMethod(): Code\ClassMethod - { - return $this->calledMethod; - } - - public function throwable(): Throwable - { - return $this->throwable; - } - - public function asString(): string - { - $message = $this->throwable->message(); - - if (!empty($message)) { - $message = PHP_EOL . $message; - } - - return sprintf( - 'Pre Condition Method Errored (%s::%s)%s', - $this->calledMethod->className(), - $this->calledMethod->methodName(), - $message, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionErroredSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionErroredSubscriber.php deleted file mode 100644 index 3465040..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionErroredSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface PreConditionErroredSubscriber extends Subscriber -{ - public function notify(PreConditionErrored $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionFinished.php b/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionFinished.php deleted file mode 100644 index 0534079..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionFinished.php +++ /dev/null @@ -1,82 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use const PHP_EOL; -use function sprintf; -use PHPUnit\Event\Code; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class PreConditionFinished implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - - /** - * @psalm-var class-string - */ - private readonly string $testClassName; - - /** - * @psalm-var list - */ - private readonly array $calledMethods; - - /** - * @psalm-param class-string $testClassName - */ - public function __construct(Telemetry\Info $telemetryInfo, string $testClassName, Code\ClassMethod ...$calledMethods) - { - $this->telemetryInfo = $telemetryInfo; - $this->testClassName = $testClassName; - $this->calledMethods = $calledMethods; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - /** - * @psalm-return class-string - */ - public function testClassName(): string - { - return $this->testClassName; - } - - /** - * @psalm-return list - */ - public function calledMethods(): array - { - return $this->calledMethods; - } - - public function asString(): string - { - $buffer = 'Pre Condition Method Finished:'; - - foreach ($this->calledMethods as $calledMethod) { - $buffer .= sprintf( - PHP_EOL . '- %s::%s', - $calledMethod->className(), - $calledMethod->methodName(), - ); - } - - return $buffer; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionFinishedSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionFinishedSubscriber.php deleted file mode 100644 index 9c49940..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionFinishedSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface PreConditionFinishedSubscriber extends Subscriber -{ - public function notify(PreConditionFinished $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/ConsideredRisky.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/ConsideredRisky.php deleted file mode 100644 index 5b90d1b..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/ConsideredRisky.php +++ /dev/null @@ -1,70 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use const PHP_EOL; -use function sprintf; -use PHPUnit\Event\Code; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class ConsideredRisky implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - private readonly Code\Test $test; - - /** - * @psalm-var non-empty-string - */ - private readonly string $message; - - /** - * @psalm-param non-empty-string $message - */ - public function __construct(Telemetry\Info $telemetryInfo, Code\Test $test, string $message) - { - $this->telemetryInfo = $telemetryInfo; - $this->test = $test; - $this->message = $message; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function test(): Code\Test - { - return $this->test; - } - - /** - * @psalm-return non-empty-string - */ - public function message(): string - { - return $this->message; - } - - public function asString(): string - { - return sprintf( - 'Test Considered Risky (%s)%s%s', - $this->test->id(), - PHP_EOL, - $this->message, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/ConsideredRiskySubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/ConsideredRiskySubscriber.php deleted file mode 100644 index a0c714a..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/ConsideredRiskySubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface ConsideredRiskySubscriber extends Subscriber -{ - public function notify(ConsideredRisky $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/DeprecationTriggered.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/DeprecationTriggered.php deleted file mode 100644 index b776732..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/DeprecationTriggered.php +++ /dev/null @@ -1,139 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use const PHP_EOL; -use function sprintf; -use PHPUnit\Event\Code\Test; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class DeprecationTriggered implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - private readonly Test $test; - - /** - * @psalm-var non-empty-string - */ - private readonly string $message; - - /** - * @psalm-var non-empty-string - */ - private readonly string $file; - - /** - * @psalm-var positive-int - */ - private readonly int $line; - private readonly bool $suppressed; - private readonly bool $ignoredByBaseline; - private readonly bool $ignoredByTest; - - /** - * @psalm-param non-empty-string $message - * @psalm-param non-empty-string $file - * @psalm-param positive-int $line - */ - public function __construct(Telemetry\Info $telemetryInfo, Test $test, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline, bool $ignoredByTest) - { - $this->telemetryInfo = $telemetryInfo; - $this->test = $test; - $this->message = $message; - $this->file = $file; - $this->line = $line; - $this->suppressed = $suppressed; - $this->ignoredByBaseline = $ignoredByBaseline; - $this->ignoredByTest = $ignoredByTest; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function test(): Test - { - return $this->test; - } - - /** - * @psalm-return non-empty-string - */ - public function message(): string - { - return $this->message; - } - - /** - * @psalm-return non-empty-string - */ - public function file(): string - { - return $this->file; - } - - /** - * @psalm-return positive-int - */ - public function line(): int - { - return $this->line; - } - - public function wasSuppressed(): bool - { - return $this->suppressed; - } - - public function ignoredByBaseline(): bool - { - return $this->ignoredByBaseline; - } - - public function ignoredByTest(): bool - { - return $this->ignoredByTest; - } - - public function asString(): string - { - $message = $this->message; - - if (!empty($message)) { - $message = PHP_EOL . $message; - } - - $status = ''; - - if ($this->ignoredByTest) { - $status = 'Test-Ignored '; - } elseif ($this->ignoredByBaseline) { - $status = 'Baseline-Ignored '; - } elseif ($this->suppressed) { - $status = 'Suppressed '; - } - - return sprintf( - 'Test Triggered %sDeprecation (%s) in %s:%d%s', - $status, - $this->test->id(), - $this->file, - $this->line, - $message, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/DeprecationTriggeredSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/DeprecationTriggeredSubscriber.php deleted file mode 100644 index e166dbe..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/DeprecationTriggeredSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface DeprecationTriggeredSubscriber extends Subscriber -{ - public function notify(DeprecationTriggered $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/ErrorTriggered.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/ErrorTriggered.php deleted file mode 100644 index 8dcca1f..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/ErrorTriggered.php +++ /dev/null @@ -1,115 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use const PHP_EOL; -use function sprintf; -use PHPUnit\Event\Code\Test; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class ErrorTriggered implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - private readonly Test $test; - - /** - * @psalm-var non-empty-string - */ - private readonly string $message; - - /** - * @psalm-var non-empty-string - */ - private readonly string $file; - - /** - * @psalm-var positive-int - */ - private readonly int $line; - private readonly bool $suppressed; - - /** - * @psalm-param non-empty-string $message - * @psalm-param non-empty-string $file - * @psalm-param positive-int $line - */ - public function __construct(Telemetry\Info $telemetryInfo, Test $test, string $message, string $file, int $line, bool $suppressed) - { - $this->telemetryInfo = $telemetryInfo; - $this->test = $test; - $this->message = $message; - $this->file = $file; - $this->line = $line; - $this->suppressed = $suppressed; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function test(): Test - { - return $this->test; - } - - /** - * @psalm-return non-empty-string - */ - public function message(): string - { - return $this->message; - } - - /** - * @psalm-return non-empty-string - */ - public function file(): string - { - return $this->file; - } - - /** - * @psalm-return positive-int - */ - public function line(): int - { - return $this->line; - } - - public function wasSuppressed(): bool - { - return $this->suppressed; - } - - public function asString(): string - { - $message = $this->message; - - if (!empty($message)) { - $message = PHP_EOL . $message; - } - - return sprintf( - 'Test Triggered %sError (%s) in %s:%d%s', - $this->wasSuppressed() ? 'Suppressed ' : '', - $this->test->id(), - $this->file, - $this->line, - $message, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/ErrorTriggeredSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/ErrorTriggeredSubscriber.php deleted file mode 100644 index 901d885..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/ErrorTriggeredSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface ErrorTriggeredSubscriber extends Subscriber -{ - public function notify(ErrorTriggered $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/NoticeTriggered.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/NoticeTriggered.php deleted file mode 100644 index 501af12..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/NoticeTriggered.php +++ /dev/null @@ -1,130 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use const PHP_EOL; -use function sprintf; -use PHPUnit\Event\Code\Test; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class NoticeTriggered implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - private readonly Test $test; - - /** - * @psalm-var non-empty-string - */ - private readonly string $message; - - /** - * @psalm-var non-empty-string - */ - private readonly string $file; - - /** - * @psalm-var positive-int - */ - private readonly int $line; - private readonly bool $suppressed; - private readonly bool $ignoredByBaseline; - - /** - * @psalm-param non-empty-string $message - * @psalm-param non-empty-string $file - * @psalm-param positive-int $line - */ - public function __construct(Telemetry\Info $telemetryInfo, Test $test, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline) - { - $this->telemetryInfo = $telemetryInfo; - $this->test = $test; - $this->message = $message; - $this->file = $file; - $this->line = $line; - $this->suppressed = $suppressed; - $this->ignoredByBaseline = $ignoredByBaseline; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function test(): Test - { - return $this->test; - } - - /** - * @psalm-return non-empty-string - */ - public function message(): string - { - return $this->message; - } - - /** - * @psalm-return non-empty-string - */ - public function file(): string - { - return $this->file; - } - - /** - * @psalm-return positive-int - */ - public function line(): int - { - return $this->line; - } - - public function wasSuppressed(): bool - { - return $this->suppressed; - } - - public function ignoredByBaseline(): bool - { - return $this->ignoredByBaseline; - } - - public function asString(): string - { - $message = $this->message; - - if (!empty($message)) { - $message = PHP_EOL . $message; - } - - $status = ''; - - if ($this->ignoredByBaseline) { - $status = 'Baseline-Ignored '; - } elseif ($this->suppressed) { - $status = 'Suppressed '; - } - - return sprintf( - 'Test Triggered %sNotice (%s) in %s:%d%s', - $status, - $this->test->id(), - $this->file, - $this->line, - $message, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/NoticeTriggeredSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/NoticeTriggeredSubscriber.php deleted file mode 100644 index 95230d0..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/NoticeTriggeredSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface NoticeTriggeredSubscriber extends Subscriber -{ - public function notify(NoticeTriggered $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpDeprecationTriggered.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpDeprecationTriggered.php deleted file mode 100644 index a9105e0..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpDeprecationTriggered.php +++ /dev/null @@ -1,139 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use const PHP_EOL; -use function sprintf; -use PHPUnit\Event\Code\Test; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class PhpDeprecationTriggered implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - private readonly Test $test; - - /** - * @psalm-var non-empty-string - */ - private readonly string $message; - - /** - * @psalm-var non-empty-string - */ - private readonly string $file; - - /** - * @psalm-var positive-int - */ - private readonly int $line; - private readonly bool $suppressed; - private readonly bool $ignoredByBaseline; - private readonly bool $ignoredByTest; - - /** - * @psalm-param non-empty-string $message - * @psalm-param non-empty-string $file - * @psalm-param positive-int $line - */ - public function __construct(Telemetry\Info $telemetryInfo, Test $test, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline, bool $ignoredByTest) - { - $this->telemetryInfo = $telemetryInfo; - $this->test = $test; - $this->message = $message; - $this->file = $file; - $this->line = $line; - $this->suppressed = $suppressed; - $this->ignoredByBaseline = $ignoredByBaseline; - $this->ignoredByTest = $ignoredByTest; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function test(): Test - { - return $this->test; - } - - /** - * @psalm-return non-empty-string - */ - public function message(): string - { - return $this->message; - } - - /** - * @psalm-return non-empty-string - */ - public function file(): string - { - return $this->file; - } - - /** - * @psalm-return positive-int - */ - public function line(): int - { - return $this->line; - } - - public function wasSuppressed(): bool - { - return $this->suppressed; - } - - public function ignoredByBaseline(): bool - { - return $this->ignoredByBaseline; - } - - public function ignoredByTest(): bool - { - return $this->ignoredByTest; - } - - public function asString(): string - { - $message = $this->message; - - if (!empty($message)) { - $message = PHP_EOL . $message; - } - - $status = ''; - - if ($this->ignoredByTest) { - $status = 'Test-Ignored '; - } elseif ($this->ignoredByBaseline) { - $status = 'Baseline-Ignored '; - } elseif ($this->suppressed) { - $status = 'Suppressed '; - } - - return sprintf( - 'Test Triggered %sPHP Deprecation (%s) in %s:%d%s', - $status, - $this->test->id(), - $this->file, - $this->line, - $message, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpDeprecationTriggeredSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpDeprecationTriggeredSubscriber.php deleted file mode 100644 index 06159a7..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpDeprecationTriggeredSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface PhpDeprecationTriggeredSubscriber extends Subscriber -{ - public function notify(PhpDeprecationTriggered $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpNoticeTriggered.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpNoticeTriggered.php deleted file mode 100644 index 045c5ef..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpNoticeTriggered.php +++ /dev/null @@ -1,130 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use const PHP_EOL; -use function sprintf; -use PHPUnit\Event\Code\Test; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class PhpNoticeTriggered implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - private readonly Test $test; - - /** - * @psalm-var non-empty-string - */ - private readonly string $message; - - /** - * @psalm-var non-empty-string - */ - private readonly string $file; - - /** - * @psalm-var positive-int - */ - private readonly int $line; - private readonly bool $suppressed; - private readonly bool $ignoredByBaseline; - - /** - * @psalm-param non-empty-string $message - * @psalm-param non-empty-string $file - * @psalm-param positive-int $line - */ - public function __construct(Telemetry\Info $telemetryInfo, Test $test, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline) - { - $this->telemetryInfo = $telemetryInfo; - $this->test = $test; - $this->message = $message; - $this->file = $file; - $this->line = $line; - $this->suppressed = $suppressed; - $this->ignoredByBaseline = $ignoredByBaseline; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function test(): Test - { - return $this->test; - } - - /** - * @psalm-return non-empty-string - */ - public function message(): string - { - return $this->message; - } - - /** - * @psalm-return non-empty-string - */ - public function file(): string - { - return $this->file; - } - - /** - * @psalm-return positive-int - */ - public function line(): int - { - return $this->line; - } - - public function wasSuppressed(): bool - { - return $this->suppressed; - } - - public function ignoredByBaseline(): bool - { - return $this->ignoredByBaseline; - } - - public function asString(): string - { - $message = $this->message; - - if (!empty($message)) { - $message = PHP_EOL . $message; - } - - $status = ''; - - if ($this->ignoredByBaseline) { - $status = 'Baseline-Ignored '; - } elseif ($this->suppressed) { - $status = 'Suppressed '; - } - - return sprintf( - 'Test Triggered %sPHP Notice (%s) in %s:%d%s', - $status, - $this->test->id(), - $this->file, - $this->line, - $message, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpNoticeTriggeredSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpNoticeTriggeredSubscriber.php deleted file mode 100644 index 98649bd..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpNoticeTriggeredSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface PhpNoticeTriggeredSubscriber extends Subscriber -{ - public function notify(PhpNoticeTriggered $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpWarningTriggered.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpWarningTriggered.php deleted file mode 100644 index 9d2c2f2..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpWarningTriggered.php +++ /dev/null @@ -1,130 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use const PHP_EOL; -use function sprintf; -use PHPUnit\Event\Code\Test; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class PhpWarningTriggered implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - private readonly Test $test; - - /** - * @psalm-var non-empty-string - */ - private readonly string $message; - - /** - * @psalm-var non-empty-string - */ - private readonly string $file; - - /** - * @psalm-var positive-int - */ - private readonly int $line; - private readonly bool $suppressed; - private readonly bool $ignoredByBaseline; - - /** - * @psalm-param non-empty-string $message - * @psalm-param non-empty-string $file - * @psalm-param positive-int $line - */ - public function __construct(Telemetry\Info $telemetryInfo, Test $test, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline) - { - $this->telemetryInfo = $telemetryInfo; - $this->test = $test; - $this->message = $message; - $this->file = $file; - $this->line = $line; - $this->suppressed = $suppressed; - $this->ignoredByBaseline = $ignoredByBaseline; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function test(): Test - { - return $this->test; - } - - /** - * @psalm-return non-empty-string - */ - public function message(): string - { - return $this->message; - } - - /** - * @psalm-return non-empty-string - */ - public function file(): string - { - return $this->file; - } - - /** - * @psalm-return positive-int - */ - public function line(): int - { - return $this->line; - } - - public function wasSuppressed(): bool - { - return $this->suppressed; - } - - public function ignoredByBaseline(): bool - { - return $this->ignoredByBaseline; - } - - public function asString(): string - { - $message = $this->message; - - if (!empty($message)) { - $message = PHP_EOL . $message; - } - - $status = ''; - - if ($this->ignoredByBaseline) { - $status = 'Baseline-Ignored '; - } elseif ($this->suppressed) { - $status = 'Suppressed '; - } - - return sprintf( - 'Test Triggered %sPHP Warning (%s) in %s:%d%s', - $status, - $this->test->id(), - $this->file, - $this->line, - $message, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpWarningTriggeredSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpWarningTriggeredSubscriber.php deleted file mode 100644 index 3638ba1..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpWarningTriggeredSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface PhpWarningTriggeredSubscriber extends Subscriber -{ - public function notify(PhpWarningTriggered $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitDeprecationTriggered.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitDeprecationTriggered.php deleted file mode 100644 index 3b1162f..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitDeprecationTriggered.php +++ /dev/null @@ -1,75 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use const PHP_EOL; -use function sprintf; -use PHPUnit\Event\Code\Test; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class PhpunitDeprecationTriggered implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - private readonly Test $test; - - /** - * @psalm-var non-empty-string - */ - private readonly string $message; - - /** - * @psalm-param non-empty-string $message - */ - public function __construct(Telemetry\Info $telemetryInfo, Test $test, string $message) - { - $this->telemetryInfo = $telemetryInfo; - $this->test = $test; - $this->message = $message; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function test(): Test - { - return $this->test; - } - - /** - * @psalm-return non-empty-string - */ - public function message(): string - { - return $this->message; - } - - public function asString(): string - { - $message = $this->message; - - if (!empty($message)) { - $message = PHP_EOL . $message; - } - - return sprintf( - 'Test Triggered PHPUnit Deprecation (%s)%s', - $this->test->id(), - $message, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitDeprecationTriggeredSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitDeprecationTriggeredSubscriber.php deleted file mode 100644 index f6b3a23..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitDeprecationTriggeredSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface PhpunitDeprecationTriggeredSubscriber extends Subscriber -{ - public function notify(PhpunitDeprecationTriggered $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitErrorTriggered.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitErrorTriggered.php deleted file mode 100644 index 8e7d7d4..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitErrorTriggered.php +++ /dev/null @@ -1,76 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use const PHP_EOL; -use function sprintf; -use function trim; -use PHPUnit\Event\Code\Test; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class PhpunitErrorTriggered implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - private readonly Test $test; - - /** - * @psalm-var non-empty-string - */ - private readonly string $message; - - /** - * @psalm-param non-empty-string $message - */ - public function __construct(Telemetry\Info $telemetryInfo, Test $test, string $message) - { - $this->telemetryInfo = $telemetryInfo; - $this->test = $test; - $this->message = $message; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function test(): Test - { - return $this->test; - } - - /** - * @psalm-return non-empty-string - */ - public function message(): string - { - return $this->message; - } - - public function asString(): string - { - $message = trim($this->message); - - if (!empty($message)) { - $message = PHP_EOL . $message; - } - - return sprintf( - 'Test Triggered PHPUnit Error (%s)%s', - $this->test->id(), - $message, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitErrorTriggeredSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitErrorTriggeredSubscriber.php deleted file mode 100644 index e94d1dd..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitErrorTriggeredSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface PhpunitErrorTriggeredSubscriber extends Subscriber -{ - public function notify(PhpunitErrorTriggered $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitWarningTriggered.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitWarningTriggered.php deleted file mode 100644 index 164c6eb..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitWarningTriggered.php +++ /dev/null @@ -1,75 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use const PHP_EOL; -use function sprintf; -use PHPUnit\Event\Code\Test; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class PhpunitWarningTriggered implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - private readonly Test $test; - - /** - * @psalm-var non-empty-string - */ - private readonly string $message; - - /** - * @psalm-param non-empty-string $message - */ - public function __construct(Telemetry\Info $telemetryInfo, Test $test, string $message) - { - $this->telemetryInfo = $telemetryInfo; - $this->test = $test; - $this->message = $message; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function test(): Test - { - return $this->test; - } - - /** - * @psalm-return non-empty-string - */ - public function message(): string - { - return $this->message; - } - - public function asString(): string - { - $message = $this->message; - - if (!empty($message)) { - $message = PHP_EOL . $message; - } - - return sprintf( - 'Test Triggered PHPUnit Warning (%s)%s', - $this->test->id(), - $message, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitWarningTriggeredSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitWarningTriggeredSubscriber.php deleted file mode 100644 index 72149b2..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitWarningTriggeredSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface PhpunitWarningTriggeredSubscriber extends Subscriber -{ - public function notify(PhpunitWarningTriggered $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/WarningTriggered.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/WarningTriggered.php deleted file mode 100644 index 839af38..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/WarningTriggered.php +++ /dev/null @@ -1,130 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use const PHP_EOL; -use function sprintf; -use PHPUnit\Event\Code\Test; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class WarningTriggered implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - private readonly Test $test; - - /** - * @psalm-var non-empty-string - */ - private readonly string $message; - - /** - * @psalm-var non-empty-string - */ - private readonly string $file; - - /** - * @psalm-var positive-int - */ - private readonly int $line; - private readonly bool $suppressed; - private readonly bool $ignoredByBaseline; - - /** - * @psalm-param non-empty-string $message - * @psalm-param non-empty-string $file - * @psalm-param positive-int $line - */ - public function __construct(Telemetry\Info $telemetryInfo, Test $test, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline) - { - $this->telemetryInfo = $telemetryInfo; - $this->test = $test; - $this->message = $message; - $this->file = $file; - $this->line = $line; - $this->suppressed = $suppressed; - $this->ignoredByBaseline = $ignoredByBaseline; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function test(): Test - { - return $this->test; - } - - /** - * @psalm-return non-empty-string - */ - public function message(): string - { - return $this->message; - } - - /** - * @psalm-return non-empty-string - */ - public function file(): string - { - return $this->file; - } - - /** - * @psalm-return positive-int - */ - public function line(): int - { - return $this->line; - } - - public function wasSuppressed(): bool - { - return $this->suppressed; - } - - public function ignoredByBaseline(): bool - { - return $this->ignoredByBaseline; - } - - public function asString(): string - { - $message = $this->message; - - if (!empty($message)) { - $message = PHP_EOL . $message; - } - - $status = ''; - - if ($this->ignoredByBaseline) { - $status = 'Baseline-Ignored '; - } elseif ($this->suppressed) { - $status = 'Suppressed '; - } - - return sprintf( - 'Test Triggered %sWarning (%s) in %s:%d%s', - $status, - $this->test->id(), - $this->file, - $this->line, - $message, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/WarningTriggeredSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/WarningTriggeredSubscriber.php deleted file mode 100644 index 8eb6664..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/WarningTriggeredSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface WarningTriggeredSubscriber extends Subscriber -{ - public function notify(WarningTriggered $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/DataProviderMethodCalled.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/DataProviderMethodCalled.php deleted file mode 100644 index 2b6beca..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/DataProviderMethodCalled.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use function sprintf; -use PHPUnit\Event\Code\ClassMethod; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry\Info; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class DataProviderMethodCalled implements Event -{ - private readonly Info $telemetryInfo; - private readonly ClassMethod $testMethod; - private readonly ClassMethod $dataProviderMethod; - - public function __construct(Info $telemetryInfo, ClassMethod $testMethod, ClassMethod $dataProviderMethod) - { - $this->telemetryInfo = $telemetryInfo; - $this->testMethod = $testMethod; - $this->dataProviderMethod = $dataProviderMethod; - } - - public function telemetryInfo(): Info - { - return $this->telemetryInfo; - } - - public function testMethod(): ClassMethod - { - return $this->testMethod; - } - - public function dataProviderMethod(): ClassMethod - { - return $this->dataProviderMethod; - } - - public function asString(): string - { - return sprintf( - 'Data Provider Method Called (%s::%s for test method %s::%s)', - $this->dataProviderMethod->className(), - $this->dataProviderMethod->methodName(), - $this->testMethod->className(), - $this->testMethod->methodName(), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/DataProviderMethodCalledSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/DataProviderMethodCalledSubscriber.php deleted file mode 100644 index 5f7d401..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/DataProviderMethodCalledSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface DataProviderMethodCalledSubscriber extends Subscriber -{ - public function notify(DataProviderMethodCalled $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/DataProviderMethodFinished.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/DataProviderMethodFinished.php deleted file mode 100644 index bd521df..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/DataProviderMethodFinished.php +++ /dev/null @@ -1,76 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use const PHP_EOL; -use function sprintf; -use PHPUnit\Event\Code\ClassMethod; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class DataProviderMethodFinished implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - private readonly ClassMethod $testMethod; - - /** - * @psalm-var list - */ - private readonly array $calledMethods; - - public function __construct(Telemetry\Info $telemetryInfo, ClassMethod $testMethod, ClassMethod ...$calledMethods) - { - $this->telemetryInfo = $telemetryInfo; - $this->testMethod = $testMethod; - $this->calledMethods = $calledMethods; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function testMethod(): ClassMethod - { - return $this->testMethod; - } - - /** - * @psalm-return list - */ - public function calledMethods(): array - { - return $this->calledMethods; - } - - public function asString(): string - { - $buffer = sprintf( - 'Data Provider Method Finished for %s::%s:', - $this->testMethod->className(), - $this->testMethod->methodName(), - ); - - foreach ($this->calledMethods as $calledMethod) { - $buffer .= sprintf( - PHP_EOL . '- %s::%s', - $calledMethod->className(), - $calledMethod->methodName(), - ); - } - - return $buffer; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/DataProviderMethodFinishedSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/DataProviderMethodFinishedSubscriber.php deleted file mode 100644 index 624f892..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/DataProviderMethodFinishedSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface DataProviderMethodFinishedSubscriber extends Subscriber -{ - public function notify(DataProviderMethodFinished $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/Finished.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/Finished.php deleted file mode 100644 index fd82815..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/Finished.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use function sprintf; -use PHPUnit\Event\Code; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class Finished implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - private readonly Code\Test $test; - private readonly int $numberOfAssertionsPerformed; - - public function __construct(Telemetry\Info $telemetryInfo, Code\Test $test, int $numberOfAssertionsPerformed) - { - $this->telemetryInfo = $telemetryInfo; - $this->test = $test; - $this->numberOfAssertionsPerformed = $numberOfAssertionsPerformed; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function test(): Code\Test - { - return $this->test; - } - - public function numberOfAssertionsPerformed(): int - { - return $this->numberOfAssertionsPerformed; - } - - public function asString(): string - { - return sprintf( - 'Test Finished (%s)', - $this->test->id(), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/FinishedSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/FinishedSubscriber.php deleted file mode 100644 index 5751e3d..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/FinishedSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface FinishedSubscriber extends Subscriber -{ - public function notify(Finished $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparationFailed.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparationFailed.php deleted file mode 100644 index 4989d9e..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparationFailed.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use function sprintf; -use PHPUnit\Event\Code; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class PreparationFailed implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - private readonly Code\Test $test; - - public function __construct(Telemetry\Info $telemetryInfo, Code\Test $test) - { - $this->telemetryInfo = $telemetryInfo; - $this->test = $test; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function test(): Code\Test - { - return $this->test; - } - - public function asString(): string - { - return sprintf( - 'Test Preparation Failed (%s)', - $this->test->id(), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparationFailedSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparationFailedSubscriber.php deleted file mode 100644 index da20f11..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparationFailedSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface PreparationFailedSubscriber extends Subscriber -{ - public function notify(PreparationFailed $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparationStarted.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparationStarted.php deleted file mode 100644 index a6e8b8a..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparationStarted.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use function sprintf; -use PHPUnit\Event\Code; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class PreparationStarted implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - private readonly Code\Test $test; - - public function __construct(Telemetry\Info $telemetryInfo, Code\Test $test) - { - $this->telemetryInfo = $telemetryInfo; - $this->test = $test; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function test(): Code\Test - { - return $this->test; - } - - public function asString(): string - { - return sprintf( - 'Test Preparation Started (%s)', - $this->test->id(), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparationStartedSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparationStartedSubscriber.php deleted file mode 100644 index f13296b..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparationStartedSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface PreparationStartedSubscriber extends Subscriber -{ - public function notify(PreparationStarted $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/Prepared.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/Prepared.php deleted file mode 100644 index 2507585..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/Prepared.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use function sprintf; -use PHPUnit\Event\Code; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class Prepared implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - private readonly Code\Test $test; - - public function __construct(Telemetry\Info $telemetryInfo, Code\Test $test) - { - $this->telemetryInfo = $telemetryInfo; - $this->test = $test; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function test(): Code\Test - { - return $this->test; - } - - public function asString(): string - { - return sprintf( - 'Test Prepared (%s)', - $this->test->id(), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparedSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparedSubscriber.php deleted file mode 100644 index f53e227..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparedSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface PreparedSubscriber extends Subscriber -{ - public function notify(Prepared $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/Errored.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/Errored.php deleted file mode 100644 index 0c3f4aa..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/Errored.php +++ /dev/null @@ -1,67 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use const PHP_EOL; -use function sprintf; -use function trim; -use PHPUnit\Event\Code; -use PHPUnit\Event\Code\Throwable; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class Errored implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - private readonly Code\Test $test; - private readonly Throwable $throwable; - - public function __construct(Telemetry\Info $telemetryInfo, Code\Test $test, Throwable $throwable) - { - $this->telemetryInfo = $telemetryInfo; - $this->test = $test; - $this->throwable = $throwable; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function test(): Code\Test - { - return $this->test; - } - - public function throwable(): Throwable - { - return $this->throwable; - } - - public function asString(): string - { - $message = trim($this->throwable->message()); - - if (!empty($message)) { - $message = PHP_EOL . $message; - } - - return sprintf( - 'Test Errored (%s)%s', - $this->test->id(), - $message, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/ErroredSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/ErroredSubscriber.php deleted file mode 100644 index 42dd5b2..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/ErroredSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface ErroredSubscriber extends Subscriber -{ - public function notify(Errored $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/Failed.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/Failed.php deleted file mode 100644 index 0bce79e..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/Failed.php +++ /dev/null @@ -1,90 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use const PHP_EOL; -use function sprintf; -use function trim; -use PHPUnit\Event\Code; -use PHPUnit\Event\Code\ComparisonFailure; -use PHPUnit\Event\Code\Throwable; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class Failed implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - private readonly Code\Test $test; - private readonly Throwable $throwable; - private readonly ?ComparisonFailure $comparisonFailure; - - public function __construct(Telemetry\Info $telemetryInfo, Code\Test $test, Throwable $throwable, ?ComparisonFailure $comparisonFailure) - { - $this->telemetryInfo = $telemetryInfo; - $this->test = $test; - $this->throwable = $throwable; - $this->comparisonFailure = $comparisonFailure; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function test(): Code\Test - { - return $this->test; - } - - public function throwable(): Throwable - { - return $this->throwable; - } - - /** - * @psalm-assert-if-true !null $this->comparisonFailure - */ - public function hasComparisonFailure(): bool - { - return $this->comparisonFailure !== null; - } - - /** - * @throws NoComparisonFailureException - */ - public function comparisonFailure(): ComparisonFailure - { - if ($this->comparisonFailure === null) { - throw new NoComparisonFailureException; - } - - return $this->comparisonFailure; - } - - public function asString(): string - { - $message = trim($this->throwable->message()); - - if (!empty($message)) { - $message = PHP_EOL . $message; - } - - return sprintf( - 'Test Failed (%s)%s', - $this->test->id(), - $message, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/FailedSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/FailedSubscriber.php deleted file mode 100644 index 8da6a85..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/FailedSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface FailedSubscriber extends Subscriber -{ - public function notify(Failed $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/MarkedIncomplete.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/MarkedIncomplete.php deleted file mode 100644 index c501fa4..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/MarkedIncomplete.php +++ /dev/null @@ -1,67 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use const PHP_EOL; -use function sprintf; -use function trim; -use PHPUnit\Event\Code; -use PHPUnit\Event\Code\Throwable; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class MarkedIncomplete implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - private readonly Code\Test $test; - private readonly Throwable $throwable; - - public function __construct(Telemetry\Info $telemetryInfo, Code\Test $test, Throwable $throwable) - { - $this->telemetryInfo = $telemetryInfo; - $this->test = $test; - $this->throwable = $throwable; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function test(): Code\Test - { - return $this->test; - } - - public function throwable(): Throwable - { - return $this->throwable; - } - - public function asString(): string - { - $message = trim($this->throwable->message()); - - if (!empty($message)) { - $message = PHP_EOL . $message; - } - - return sprintf( - 'Test Marked Incomplete (%s)%s', - $this->test->id(), - $message, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/MarkedIncompleteSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/MarkedIncompleteSubscriber.php deleted file mode 100644 index ff0acd8..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/MarkedIncompleteSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface MarkedIncompleteSubscriber extends Subscriber -{ - public function notify(MarkedIncomplete $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/Passed.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/Passed.php deleted file mode 100644 index 256923d..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/Passed.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use function sprintf; -use PHPUnit\Event\Code; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class Passed implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - private readonly Code\Test $test; - - public function __construct(Telemetry\Info $telemetryInfo, Code\Test $test) - { - $this->telemetryInfo = $telemetryInfo; - $this->test = $test; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function test(): Code\Test - { - return $this->test; - } - - public function asString(): string - { - return sprintf( - 'Test Passed (%s)', - $this->test->id(), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/PassedSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/PassedSubscriber.php deleted file mode 100644 index 4a56738..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/PassedSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface PassedSubscriber extends Subscriber -{ - public function notify(Passed $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/Skipped.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/Skipped.php deleted file mode 100644 index 1450105..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/Skipped.php +++ /dev/null @@ -1,65 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use const PHP_EOL; -use function sprintf; -use PHPUnit\Event\Code; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class Skipped implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - private readonly Code\Test $test; - private readonly string $message; - - public function __construct(Telemetry\Info $telemetryInfo, Code\Test $test, string $message) - { - $this->telemetryInfo = $telemetryInfo; - $this->test = $test; - $this->message = $message; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function test(): Code\Test - { - return $this->test; - } - - public function message(): string - { - return $this->message; - } - - public function asString(): string - { - $message = $this->message; - - if (!empty($message)) { - $message = PHP_EOL . $message; - } - - return sprintf( - 'Test Skipped (%s)%s', - $this->test->id(), - $message, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/SkippedSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/SkippedSubscriber.php deleted file mode 100644 index 5fd48ac..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/SkippedSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface SkippedSubscriber extends Subscriber -{ - public function notify(Skipped $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/PrintedUnexpectedOutput.php b/vendor/phpunit/phpunit/src/Event/Events/Test/PrintedUnexpectedOutput.php deleted file mode 100644 index 308332e..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/PrintedUnexpectedOutput.php +++ /dev/null @@ -1,61 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use const PHP_EOL; -use function sprintf; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class PrintedUnexpectedOutput implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - - /** - * @psalm-var non-empty-string - */ - private readonly string $output; - - /** - * @psalm-param non-empty-string $output - */ - public function __construct(Telemetry\Info $telemetryInfo, string $output) - { - $this->telemetryInfo = $telemetryInfo; - $this->output = $output; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - /** - * @psalm-return non-empty-string - */ - public function output(): string - { - return $this->output; - } - - public function asString(): string - { - return sprintf( - 'Test Printed Unexpected Output%s%s', - PHP_EOL, - $this->output, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/PrintedUnexpectedOutputSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/PrintedUnexpectedOutputSubscriber.php deleted file mode 100644 index ee20157..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/PrintedUnexpectedOutputSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface PrintedUnexpectedOutputSubscriber extends Subscriber -{ - public function notify(PrintedUnexpectedOutput $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectCreated.php b/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectCreated.php deleted file mode 100644 index ad46244..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectCreated.php +++ /dev/null @@ -1,59 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use function sprintf; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class MockObjectCreated implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - - /** - * @psalm-var class-string - */ - private readonly string $className; - - /** - * @psalm-param class-string $className - */ - public function __construct(Telemetry\Info $telemetryInfo, string $className) - { - $this->telemetryInfo = $telemetryInfo; - $this->className = $className; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - /** - * @psalm-return class-string - */ - public function className(): string - { - return $this->className; - } - - public function asString(): string - { - return sprintf( - 'Mock Object Created (%s)', - $this->className, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectCreatedSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectCreatedSubscriber.php deleted file mode 100644 index 8ad2f17..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectCreatedSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface MockObjectCreatedSubscriber extends Subscriber -{ - public function notify(MockObjectCreated $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForAbstractClassCreated.php b/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForAbstractClassCreated.php deleted file mode 100644 index 7976a1c..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForAbstractClassCreated.php +++ /dev/null @@ -1,59 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use function sprintf; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class MockObjectForAbstractClassCreated implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - - /** - * @psalm-var class-string - */ - private readonly string $className; - - /** - * @psalm-param class-string $className - */ - public function __construct(Telemetry\Info $telemetryInfo, string $className) - { - $this->telemetryInfo = $telemetryInfo; - $this->className = $className; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - /** - * @psalm-return class-string - */ - public function className(): string - { - return $this->className; - } - - public function asString(): string - { - return sprintf( - 'Mock Object Created (%s)', - $this->className, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForAbstractClassCreatedSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForAbstractClassCreatedSubscriber.php deleted file mode 100644 index c335d19..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForAbstractClassCreatedSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface MockObjectForAbstractClassCreatedSubscriber extends Subscriber -{ - public function notify(MockObjectForAbstractClassCreated $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForIntersectionOfInterfacesCreated.php b/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForIntersectionOfInterfacesCreated.php deleted file mode 100644 index deb7ec7..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForIntersectionOfInterfacesCreated.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use function implode; -use function sprintf; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class MockObjectForIntersectionOfInterfacesCreated implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - - /** - * @psalm-var list - */ - private readonly array $interfaces; - - /** - * @psalm-param list $interfaces - */ - public function __construct(Telemetry\Info $telemetryInfo, array $interfaces) - { - $this->telemetryInfo = $telemetryInfo; - $this->interfaces = $interfaces; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - /** - * @return list - */ - public function interfaces(): array - { - return $this->interfaces; - } - - public function asString(): string - { - return sprintf( - 'Mock Object Created (%s)', - implode('&', $this->interfaces), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForIntersectionOfInterfacesCreatedSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForIntersectionOfInterfacesCreatedSubscriber.php deleted file mode 100644 index 5b345b5..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForIntersectionOfInterfacesCreatedSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface MockObjectForIntersectionOfInterfacesCreatedSubscriber extends Subscriber -{ - public function notify(MockObjectForIntersectionOfInterfacesCreated $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForTraitCreated.php b/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForTraitCreated.php deleted file mode 100644 index fd09d59..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForTraitCreated.php +++ /dev/null @@ -1,59 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use function sprintf; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class MockObjectForTraitCreated implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - - /** - * @psalm-var trait-string - */ - private readonly string $traitName; - - /** - * @psalm-param trait-string $traitName - */ - public function __construct(Telemetry\Info $telemetryInfo, string $traitName) - { - $this->telemetryInfo = $telemetryInfo; - $this->traitName = $traitName; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - /** - * @psalm-return trait-string - */ - public function traitName(): string - { - return $this->traitName; - } - - public function asString(): string - { - return sprintf( - 'Mock Object Created (%s)', - $this->traitName, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForTraitCreatedSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForTraitCreatedSubscriber.php deleted file mode 100644 index a7e7dd0..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForTraitCreatedSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface MockObjectForTraitCreatedSubscriber extends Subscriber -{ - public function notify(MockObjectForTraitCreated $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectFromWsdlCreated.php b/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectFromWsdlCreated.php deleted file mode 100644 index 0999283..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectFromWsdlCreated.php +++ /dev/null @@ -1,109 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use function sprintf; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class MockObjectFromWsdlCreated implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - private readonly string $wsdlFile; - - /** - * @psalm-var class-string - */ - private readonly string $originalClassName; - - /** - * @psalm-var class-string - */ - private readonly string $mockClassName; - - /** - * @psalm-var list - */ - private readonly array $methods; - private readonly bool $callOriginalConstructor; - private readonly array $options; - - /** - * @psalm-param class-string $originalClassName - * @psalm-param class-string $mockClassName - */ - public function __construct(Telemetry\Info $telemetryInfo, string $wsdlFile, string $originalClassName, string $mockClassName, array $methods, bool $callOriginalConstructor, array $options) - { - $this->telemetryInfo = $telemetryInfo; - $this->wsdlFile = $wsdlFile; - $this->originalClassName = $originalClassName; - $this->mockClassName = $mockClassName; - $this->methods = $methods; - $this->callOriginalConstructor = $callOriginalConstructor; - $this->options = $options; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function wsdlFile(): string - { - return $this->wsdlFile; - } - - /** - * @psalm-return class-string - */ - public function originalClassName(): string - { - return $this->originalClassName; - } - - /** - * @psalm-return class-string - */ - public function mockClassName(): string - { - return $this->mockClassName; - } - - /** - * @psalm-return list - */ - public function methods(): array - { - return $this->methods; - } - - public function callOriginalConstructor(): bool - { - return $this->callOriginalConstructor; - } - - public function options(): array - { - return $this->options; - } - - public function asString(): string - { - return sprintf( - 'Mock Object Created (%s)', - $this->wsdlFile, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectFromWsdlCreatedSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectFromWsdlCreatedSubscriber.php deleted file mode 100644 index fb0524b..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectFromWsdlCreatedSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface MockObjectFromWsdlCreatedSubscriber extends Subscriber -{ - public function notify(MockObjectFromWsdlCreated $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/PartialMockObjectCreated.php b/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/PartialMockObjectCreated.php deleted file mode 100644 index 604ba3c..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/PartialMockObjectCreated.php +++ /dev/null @@ -1,73 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use function sprintf; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class PartialMockObjectCreated implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - - /** - * @psalm-var class-string - */ - private readonly string $className; - - /** - * @psalm-var list - */ - private readonly array $methodNames; - - /** - * @psalm-param class-string $className - */ - public function __construct(Telemetry\Info $telemetryInfo, string $className, string ...$methodNames) - { - $this->telemetryInfo = $telemetryInfo; - $this->className = $className; - $this->methodNames = $methodNames; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - /** - * @psalm-return class-string - */ - public function className(): string - { - return $this->className; - } - - /** - * @psalm-return list - */ - public function methodNames(): array - { - return $this->methodNames; - } - - public function asString(): string - { - return sprintf( - 'Partial Mock Object Created (%s)', - $this->className, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/PartialMockObjectCreatedSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/PartialMockObjectCreatedSubscriber.php deleted file mode 100644 index e764074..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/PartialMockObjectCreatedSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface PartialMockObjectCreatedSubscriber extends Subscriber -{ - public function notify(PartialMockObjectCreated $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestProxyCreated.php b/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestProxyCreated.php deleted file mode 100644 index 3f08941..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestProxyCreated.php +++ /dev/null @@ -1,66 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use function sprintf; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class TestProxyCreated implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - - /** - * @psalm-var class-string - */ - private readonly string $className; - private readonly string $constructorArguments; - - /** - * @psalm-param class-string $className - */ - public function __construct(Telemetry\Info $telemetryInfo, string $className, string $constructorArguments) - { - $this->telemetryInfo = $telemetryInfo; - $this->className = $className; - $this->constructorArguments = $constructorArguments; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - /** - * @psalm-return class-string - */ - public function className(): string - { - return $this->className; - } - - public function constructorArguments(): string - { - return $this->constructorArguments; - } - - public function asString(): string - { - return sprintf( - 'Test Proxy Created (%s)', - $this->className, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestProxyCreatedSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestProxyCreatedSubscriber.php deleted file mode 100644 index 8af8384..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestProxyCreatedSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface TestProxyCreatedSubscriber extends Subscriber -{ - public function notify(TestProxyCreated $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestStubCreated.php b/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestStubCreated.php deleted file mode 100644 index 9d0330f..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestStubCreated.php +++ /dev/null @@ -1,59 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use function sprintf; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class TestStubCreated implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - - /** - * @var class-string - */ - private readonly string $className; - - /** - * @psalm-param class-string $className - */ - public function __construct(Telemetry\Info $telemetryInfo, string $className) - { - $this->telemetryInfo = $telemetryInfo; - $this->className = $className; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - /** - * @return class-string - */ - public function className(): string - { - return $this->className; - } - - public function asString(): string - { - return sprintf( - 'Test Stub Created (%s)', - $this->className, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestStubCreatedSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestStubCreatedSubscriber.php deleted file mode 100644 index 6b5deaf..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestStubCreatedSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface TestStubCreatedSubscriber extends Subscriber -{ - public function notify(TestStubCreated $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestStubForIntersectionOfInterfacesCreated.php b/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestStubForIntersectionOfInterfacesCreated.php deleted file mode 100644 index 4aded8c..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestStubForIntersectionOfInterfacesCreated.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use function implode; -use function sprintf; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class TestStubForIntersectionOfInterfacesCreated implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - - /** - * @psalm-var list - */ - private readonly array $interfaces; - - /** - * @psalm-param list $interfaces - */ - public function __construct(Telemetry\Info $telemetryInfo, array $interfaces) - { - $this->telemetryInfo = $telemetryInfo; - $this->interfaces = $interfaces; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - /** - * @return list - */ - public function interfaces(): array - { - return $this->interfaces; - } - - public function asString(): string - { - return sprintf( - 'Test Stub Created (%s)', - implode('&', $this->interfaces), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestStubForIntersectionOfInterfacesCreatedSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestStubForIntersectionOfInterfacesCreatedSubscriber.php deleted file mode 100644 index aec6f66..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestStubForIntersectionOfInterfacesCreatedSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface TestStubForIntersectionOfInterfacesCreatedSubscriber extends Subscriber -{ - public function notify(TestStubForIntersectionOfInterfacesCreated $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/BootstrapFinished.php b/vendor/phpunit/phpunit/src/Event/Events/TestRunner/BootstrapFinished.php deleted file mode 100644 index 9ec3f34..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/BootstrapFinished.php +++ /dev/null @@ -1,49 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestRunner; - -use function sprintf; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class BootstrapFinished implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - private readonly string $filename; - - public function __construct(Telemetry\Info $telemetryInfo, string $filename) - { - $this->telemetryInfo = $telemetryInfo; - $this->filename = $filename; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function filename(): string - { - return $this->filename; - } - - public function asString(): string - { - return sprintf( - 'Bootstrap Finished (%s)', - $this->filename, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/BootstrapFinishedSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/TestRunner/BootstrapFinishedSubscriber.php deleted file mode 100644 index 749648e..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/BootstrapFinishedSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestRunner; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface BootstrapFinishedSubscriber extends Subscriber -{ - public function notify(BootstrapFinished $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/Configured.php b/vendor/phpunit/phpunit/src/Event/Events/TestRunner/Configured.php deleted file mode 100644 index e27fd7b..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/Configured.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestRunner; - -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; -use PHPUnit\TextUI\Configuration\Configuration; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class Configured implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - private readonly Configuration $configuration; - - public function __construct(Telemetry\Info $telemetryInfo, Configuration $configuration) - { - $this->telemetryInfo = $telemetryInfo; - $this->configuration = $configuration; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function configuration(): Configuration - { - return $this->configuration; - } - - public function asString(): string - { - return 'Test Runner Configured'; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/ConfiguredSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/TestRunner/ConfiguredSubscriber.php deleted file mode 100644 index 0b58f70..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/ConfiguredSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestRunner; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface ConfiguredSubscriber extends Subscriber -{ - public function notify(Configured $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/DeprecationTriggered.php b/vendor/phpunit/phpunit/src/Event/Events/TestRunner/DeprecationTriggered.php deleted file mode 100644 index 31d27e2..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/DeprecationTriggered.php +++ /dev/null @@ -1,49 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestRunner; - -use function sprintf; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class DeprecationTriggered implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - private readonly string $message; - - public function __construct(Telemetry\Info $telemetryInfo, string $message) - { - $this->telemetryInfo = $telemetryInfo; - $this->message = $message; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function message(): string - { - return $this->message; - } - - public function asString(): string - { - return sprintf( - 'Test Runner Triggered Deprecation (%s)', - $this->message, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/DeprecationTriggeredSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/TestRunner/DeprecationTriggeredSubscriber.php deleted file mode 100644 index 627ffbd..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/DeprecationTriggeredSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestRunner; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface DeprecationTriggeredSubscriber extends Subscriber -{ - public function notify(DeprecationTriggered $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/EventFacadeSealed.php b/vendor/phpunit/phpunit/src/Event/Events/TestRunner/EventFacadeSealed.php deleted file mode 100644 index ea8ab98..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/EventFacadeSealed.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestRunner; - -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class EventFacadeSealed implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - - public function __construct(Telemetry\Info $telemetryInfo) - { - $this->telemetryInfo = $telemetryInfo; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function asString(): string - { - return 'Event Facade Sealed'; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/EventFacadeSealedSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/TestRunner/EventFacadeSealedSubscriber.php deleted file mode 100644 index 4d0d3d0..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/EventFacadeSealedSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestRunner; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface EventFacadeSealedSubscriber extends Subscriber -{ - public function notify(EventFacadeSealed $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionAborted.php b/vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionAborted.php deleted file mode 100644 index 2e2b92c..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionAborted.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestRunner; - -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class ExecutionAborted implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - - public function __construct(Telemetry\Info $telemetryInfo) - { - $this->telemetryInfo = $telemetryInfo; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function asString(): string - { - return 'Test Runner Execution Aborted'; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionAbortedSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionAbortedSubscriber.php deleted file mode 100644 index 00397cc..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionAbortedSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestRunner; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface ExecutionAbortedSubscriber extends Subscriber -{ - public function notify(ExecutionAborted $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionFinished.php b/vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionFinished.php deleted file mode 100644 index 5496d1e..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionFinished.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestRunner; - -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class ExecutionFinished implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - - public function __construct(Telemetry\Info $telemetryInfo) - { - $this->telemetryInfo = $telemetryInfo; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function asString(): string - { - return 'Test Runner Execution Finished'; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionFinishedSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionFinishedSubscriber.php deleted file mode 100644 index 9945fc7..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionFinishedSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestRunner; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface ExecutionFinishedSubscriber extends Subscriber -{ - public function notify(ExecutionFinished $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionStarted.php b/vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionStarted.php deleted file mode 100644 index 77fd570..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionStarted.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestRunner; - -use function sprintf; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; -use PHPUnit\Event\TestSuite\TestSuite; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class ExecutionStarted implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - private readonly TestSuite $testSuite; - - public function __construct(Telemetry\Info $telemetryInfo, TestSuite $testSuite) - { - $this->telemetryInfo = $telemetryInfo; - $this->testSuite = $testSuite; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function testSuite(): TestSuite - { - return $this->testSuite; - } - - public function asString(): string - { - return sprintf( - 'Test Runner Execution Started (%d test%s)', - $this->testSuite->count(), - $this->testSuite->count() !== 1 ? 's' : '', - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionStartedSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionStartedSubscriber.php deleted file mode 100644 index 532f440..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionStartedSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestRunner; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface ExecutionStartedSubscriber extends Subscriber -{ - public function notify(ExecutionStarted $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionBootstrapped.php b/vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionBootstrapped.php deleted file mode 100644 index 8ef3ff1..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionBootstrapped.php +++ /dev/null @@ -1,74 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestRunner; - -use function sprintf; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class ExtensionBootstrapped implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - - /** - * @psalm-var class-string - */ - private readonly string $className; - - /** - * @psalm-var array - */ - private readonly array $parameters; - - /** - * @psalm-param class-string $className - * @psalm-param array $parameters - */ - public function __construct(Telemetry\Info $telemetryInfo, string $className, array $parameters) - { - $this->telemetryInfo = $telemetryInfo; - $this->className = $className; - $this->parameters = $parameters; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - /** - * @psalm-return class-string - */ - public function className(): string - { - return $this->className; - } - - /** - * @psalm-return array - */ - public function parameters(): array - { - return $this->parameters; - } - - public function asString(): string - { - return sprintf( - 'Extension Bootstrapped (%s)', - $this->className, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionBootstrappedSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionBootstrappedSubscriber.php deleted file mode 100644 index c4c7d55..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionBootstrappedSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestRunner; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface ExtensionBootstrappedSubscriber extends Subscriber -{ - public function notify(ExtensionBootstrapped $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionLoadedFromPhar.php b/vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionLoadedFromPhar.php deleted file mode 100644 index a2f1f14..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionLoadedFromPhar.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestRunner; - -use function sprintf; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class ExtensionLoadedFromPhar implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - private readonly string $filename; - private readonly string $name; - private readonly string $version; - - public function __construct(Telemetry\Info $telemetryInfo, string $filename, string $name, string $version) - { - $this->telemetryInfo = $telemetryInfo; - $this->filename = $filename; - $this->name = $name; - $this->version = $version; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function filename(): string - { - return $this->filename; - } - - public function name(): string - { - return $this->name; - } - - public function version(): string - { - return $this->version; - } - - public function asString(): string - { - return sprintf( - 'Extension Loaded from PHAR (%s %s)', - $this->name, - $this->version, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionLoadedFromPharSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionLoadedFromPharSubscriber.php deleted file mode 100644 index fc7c2b0..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionLoadedFromPharSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestRunner; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface ExtensionLoadedFromPharSubscriber extends Subscriber -{ - public function notify(ExtensionLoadedFromPhar $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/Finished.php b/vendor/phpunit/phpunit/src/Event/Events/TestRunner/Finished.php deleted file mode 100644 index 3b98406..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/Finished.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestRunner; - -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class Finished implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - - public function __construct(Telemetry\Info $telemetryInfo) - { - $this->telemetryInfo = $telemetryInfo; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function asString(): string - { - return 'Test Runner Finished'; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/FinishedSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/TestRunner/FinishedSubscriber.php deleted file mode 100644 index 6efc622..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/FinishedSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestRunner; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface FinishedSubscriber extends Subscriber -{ - public function notify(Finished $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionDisabled.php b/vendor/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionDisabled.php deleted file mode 100644 index b7ac6a0..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionDisabled.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestRunner; - -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class GarbageCollectionDisabled implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - - public function __construct(Telemetry\Info $telemetryInfo) - { - $this->telemetryInfo = $telemetryInfo; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function asString(): string - { - return 'Test Runner Disabled Garbage Collection'; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionDisabledSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionDisabledSubscriber.php deleted file mode 100644 index bb7e224..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionDisabledSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestRunner; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface GarbageCollectionDisabledSubscriber extends Subscriber -{ - public function notify(GarbageCollectionDisabled $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionEnabled.php b/vendor/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionEnabled.php deleted file mode 100644 index 9f3e8b8..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionEnabled.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestRunner; - -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class GarbageCollectionEnabled implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - - public function __construct(Telemetry\Info $telemetryInfo) - { - $this->telemetryInfo = $telemetryInfo; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function asString(): string - { - return 'Test Runner Enabled Garbage Collection'; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionEnabledSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionEnabledSubscriber.php deleted file mode 100644 index 437eddc..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionEnabledSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestRunner; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface GarbageCollectionEnabledSubscriber extends Subscriber -{ - public function notify(GarbageCollectionEnabled $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionTriggered.php b/vendor/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionTriggered.php deleted file mode 100644 index 5ab2f82..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionTriggered.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestRunner; - -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class GarbageCollectionTriggered implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - - public function __construct(Telemetry\Info $telemetryInfo) - { - $this->telemetryInfo = $telemetryInfo; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function asString(): string - { - return 'Test Runner Triggered Garbage Collection'; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionTriggeredSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionTriggeredSubscriber.php deleted file mode 100644 index 8b941c5..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionTriggeredSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestRunner; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface GarbageCollectionTriggeredSubscriber extends Subscriber -{ - public function notify(GarbageCollectionTriggered $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/Started.php b/vendor/phpunit/phpunit/src/Event/Events/TestRunner/Started.php deleted file mode 100644 index fd2f494..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/Started.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestRunner; - -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class Started implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - - public function __construct(Telemetry\Info $telemetryInfo) - { - $this->telemetryInfo = $telemetryInfo; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function asString(): string - { - return 'Test Runner Started'; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/StartedSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/TestRunner/StartedSubscriber.php deleted file mode 100644 index 3424070..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/StartedSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestRunner; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface StartedSubscriber extends Subscriber -{ - public function notify(Started $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/WarningTriggered.php b/vendor/phpunit/phpunit/src/Event/Events/TestRunner/WarningTriggered.php deleted file mode 100644 index cb80a07..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/WarningTriggered.php +++ /dev/null @@ -1,49 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestRunner; - -use function sprintf; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class WarningTriggered implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - private readonly string $message; - - public function __construct(Telemetry\Info $telemetryInfo, string $message) - { - $this->telemetryInfo = $telemetryInfo; - $this->message = $message; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function message(): string - { - return $this->message; - } - - public function asString(): string - { - return sprintf( - 'Test Runner Triggered Warning (%s)', - $this->message, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/WarningTriggeredSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/TestRunner/WarningTriggeredSubscriber.php deleted file mode 100644 index 9afdd18..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestRunner/WarningTriggeredSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestRunner; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface WarningTriggeredSubscriber extends Subscriber -{ - public function notify(WarningTriggered $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestSuite/Filtered.php b/vendor/phpunit/phpunit/src/Event/Events/TestSuite/Filtered.php deleted file mode 100644 index 1beadde..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestSuite/Filtered.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestSuite; - -use function sprintf; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class Filtered implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - private readonly TestSuite $testSuite; - - public function __construct(Telemetry\Info $telemetryInfo, TestSuite $testSuite) - { - $this->telemetryInfo = $telemetryInfo; - $this->testSuite = $testSuite; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function testSuite(): TestSuite - { - return $this->testSuite; - } - - public function asString(): string - { - return sprintf( - 'Test Suite Filtered (%d test%s)', - $this->testSuite->count(), - $this->testSuite->count() !== 1 ? 's' : '', - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestSuite/FilteredSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/TestSuite/FilteredSubscriber.php deleted file mode 100644 index 6bba3ad..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestSuite/FilteredSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestSuite; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface FilteredSubscriber extends Subscriber -{ - public function notify(Filtered $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestSuite/Finished.php b/vendor/phpunit/phpunit/src/Event/Events/TestSuite/Finished.php deleted file mode 100644 index e89076c..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestSuite/Finished.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestSuite; - -use function sprintf; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class Finished implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - private readonly TestSuite $testSuite; - - public function __construct(Telemetry\Info $telemetryInfo, TestSuite $testSuite) - { - $this->telemetryInfo = $telemetryInfo; - $this->testSuite = $testSuite; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function testSuite(): TestSuite - { - return $this->testSuite; - } - - public function asString(): string - { - return sprintf( - 'Test Suite Finished (%s, %d test%s)', - $this->testSuite->name(), - $this->testSuite->count(), - $this->testSuite->count() !== 1 ? 's' : '', - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestSuite/FinishedSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/TestSuite/FinishedSubscriber.php deleted file mode 100644 index 463c621..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestSuite/FinishedSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestSuite; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface FinishedSubscriber extends Subscriber -{ - public function notify(Finished $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestSuite/Loaded.php b/vendor/phpunit/phpunit/src/Event/Events/TestSuite/Loaded.php deleted file mode 100644 index 271ab37..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestSuite/Loaded.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestSuite; - -use function sprintf; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class Loaded implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - private readonly TestSuite $testSuite; - - public function __construct(Telemetry\Info $telemetryInfo, TestSuite $testSuite) - { - $this->telemetryInfo = $telemetryInfo; - $this->testSuite = $testSuite; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function testSuite(): TestSuite - { - return $this->testSuite; - } - - public function asString(): string - { - return sprintf( - 'Test Suite Loaded (%d test%s)', - $this->testSuite->count(), - $this->testSuite->count() !== 1 ? 's' : '', - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestSuite/LoadedSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/TestSuite/LoadedSubscriber.php deleted file mode 100644 index e43886c..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestSuite/LoadedSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestSuite; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface LoadedSubscriber extends Subscriber -{ - public function notify(Loaded $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestSuite/Skipped.php b/vendor/phpunit/phpunit/src/Event/Events/TestSuite/Skipped.php deleted file mode 100644 index 9a8f523..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestSuite/Skipped.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestSuite; - -use function sprintf; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class Skipped implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - private readonly TestSuite $testSuite; - private readonly string $message; - - public function __construct(Telemetry\Info $telemetryInfo, TestSuite $testSuite, string $message) - { - $this->telemetryInfo = $telemetryInfo; - $this->testSuite = $testSuite; - $this->message = $message; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function testSuite(): TestSuite - { - return $this->testSuite; - } - - public function message(): string - { - return $this->message; - } - - public function asString(): string - { - return sprintf( - 'Test Suite Skipped (%s, %s)', - $this->testSuite->name(), - $this->message, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestSuite/SkippedSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/TestSuite/SkippedSubscriber.php deleted file mode 100644 index 30f509f..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestSuite/SkippedSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestSuite; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface SkippedSubscriber extends Subscriber -{ - public function notify(Skipped $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestSuite/Sorted.php b/vendor/phpunit/phpunit/src/Event/Events/TestSuite/Sorted.php deleted file mode 100644 index ae2b53c..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestSuite/Sorted.php +++ /dev/null @@ -1,59 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestSuite; - -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class Sorted implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - private readonly int $executionOrder; - private readonly int $executionOrderDefects; - private readonly bool $resolveDependencies; - - public function __construct(Telemetry\Info $telemetryInfo, int $executionOrder, int $executionOrderDefects, bool $resolveDependencies) - { - $this->telemetryInfo = $telemetryInfo; - $this->executionOrder = $executionOrder; - $this->executionOrderDefects = $executionOrderDefects; - $this->resolveDependencies = $resolveDependencies; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function executionOrder(): int - { - return $this->executionOrder; - } - - public function executionOrderDefects(): int - { - return $this->executionOrderDefects; - } - - public function resolveDependencies(): bool - { - return $this->resolveDependencies; - } - - public function asString(): string - { - return 'Test Suite Sorted'; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestSuite/SortedSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/TestSuite/SortedSubscriber.php deleted file mode 100644 index 481eabb..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestSuite/SortedSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestSuite; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface SortedSubscriber extends Subscriber -{ - public function notify(Sorted $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestSuite/Started.php b/vendor/phpunit/phpunit/src/Event/Events/TestSuite/Started.php deleted file mode 100644 index 1e34aa7..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestSuite/Started.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestSuite; - -use function sprintf; -use PHPUnit\Event\Event; -use PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class Started implements Event -{ - private readonly Telemetry\Info $telemetryInfo; - private readonly TestSuite $testSuite; - - public function __construct(Telemetry\Info $telemetryInfo, TestSuite $testSuite) - { - $this->telemetryInfo = $telemetryInfo; - $this->testSuite = $testSuite; - } - - public function telemetryInfo(): Telemetry\Info - { - return $this->telemetryInfo; - } - - public function testSuite(): TestSuite - { - return $this->testSuite; - } - - public function asString(): string - { - return sprintf( - 'Test Suite Started (%s, %d test%s)', - $this->testSuite->name(), - $this->testSuite->count(), - $this->testSuite->count() !== 1 ? 's' : '', - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Events/TestSuite/StartedSubscriber.php b/vendor/phpunit/phpunit/src/Event/Events/TestSuite/StartedSubscriber.php deleted file mode 100644 index 66c4e1b..0000000 --- a/vendor/phpunit/phpunit/src/Event/Events/TestSuite/StartedSubscriber.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestSuite; - -use PHPUnit\Event\Subscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface StartedSubscriber extends Subscriber -{ - public function notify(Started $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/Exception/EventAlreadyAssignedException.php b/vendor/phpunit/phpunit/src/Event/Exception/EventAlreadyAssignedException.php deleted file mode 100644 index a7dba26..0000000 --- a/vendor/phpunit/phpunit/src/Event/Exception/EventAlreadyAssignedException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event; - -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class EventAlreadyAssignedException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Event/Exception/EventFacadeIsSealedException.php b/vendor/phpunit/phpunit/src/Event/Exception/EventFacadeIsSealedException.php deleted file mode 100644 index 96bf949..0000000 --- a/vendor/phpunit/phpunit/src/Event/Exception/EventFacadeIsSealedException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event; - -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class EventFacadeIsSealedException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Event/Exception/Exception.php b/vendor/phpunit/phpunit/src/Event/Exception/Exception.php deleted file mode 100644 index 88b526d..0000000 --- a/vendor/phpunit/phpunit/src/Event/Exception/Exception.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event; - -interface Exception extends \PHPUnit\Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Event/Exception/InvalidArgumentException.php b/vendor/phpunit/phpunit/src/Event/Exception/InvalidArgumentException.php deleted file mode 100644 index 3fb060c..0000000 --- a/vendor/phpunit/phpunit/src/Event/Exception/InvalidArgumentException.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class InvalidArgumentException extends \InvalidArgumentException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Event/Exception/InvalidEventException.php b/vendor/phpunit/phpunit/src/Event/Exception/InvalidEventException.php deleted file mode 100644 index 0529037..0000000 --- a/vendor/phpunit/phpunit/src/Event/Exception/InvalidEventException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event; - -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class InvalidEventException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Event/Exception/InvalidSubscriberException.php b/vendor/phpunit/phpunit/src/Event/Exception/InvalidSubscriberException.php deleted file mode 100644 index d12deb7..0000000 --- a/vendor/phpunit/phpunit/src/Event/Exception/InvalidSubscriberException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event; - -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class InvalidSubscriberException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Event/Exception/MapError.php b/vendor/phpunit/phpunit/src/Event/Exception/MapError.php deleted file mode 100644 index b97a18e..0000000 --- a/vendor/phpunit/phpunit/src/Event/Exception/MapError.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event; - -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class MapError extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Event/Exception/MoreThanOneDataSetFromDataProviderException.php b/vendor/phpunit/phpunit/src/Event/Exception/MoreThanOneDataSetFromDataProviderException.php deleted file mode 100644 index 0d26b7f..0000000 --- a/vendor/phpunit/phpunit/src/Event/Exception/MoreThanOneDataSetFromDataProviderException.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestData; - -use PHPUnit\Event\Exception; -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class MoreThanOneDataSetFromDataProviderException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Event/Exception/NoComparisonFailureException.php b/vendor/phpunit/phpunit/src/Event/Exception/NoComparisonFailureException.php deleted file mode 100644 index f992677..0000000 --- a/vendor/phpunit/phpunit/src/Event/Exception/NoComparisonFailureException.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Test; - -use PHPUnit\Event\Exception; -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class NoComparisonFailureException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Event/Exception/NoDataSetFromDataProviderException.php b/vendor/phpunit/phpunit/src/Event/Exception/NoDataSetFromDataProviderException.php deleted file mode 100644 index b17a4d1..0000000 --- a/vendor/phpunit/phpunit/src/Event/Exception/NoDataSetFromDataProviderException.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestData; - -use PHPUnit\Event\Exception; -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class NoDataSetFromDataProviderException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Event/Exception/NoPreviousThrowableException.php b/vendor/phpunit/phpunit/src/Event/Exception/NoPreviousThrowableException.php deleted file mode 100644 index e339323..0000000 --- a/vendor/phpunit/phpunit/src/Event/Exception/NoPreviousThrowableException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event; - -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class NoPreviousThrowableException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Event/Exception/NoTestCaseObjectOnCallStackException.php b/vendor/phpunit/phpunit/src/Event/Exception/NoTestCaseObjectOnCallStackException.php deleted file mode 100644 index 35b4c25..0000000 --- a/vendor/phpunit/phpunit/src/Event/Exception/NoTestCaseObjectOnCallStackException.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Code; - -use PHPUnit\Event\Exception; -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class NoTestCaseObjectOnCallStackException extends RuntimeException implements Exception -{ - public function __construct() - { - parent::__construct('Cannot find TestCase object on call stack'); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Exception/RuntimeException.php b/vendor/phpunit/phpunit/src/Event/Exception/RuntimeException.php deleted file mode 100644 index 2a444db..0000000 --- a/vendor/phpunit/phpunit/src/Event/Exception/RuntimeException.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class RuntimeException extends \RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Event/Exception/SubscriberTypeAlreadyRegisteredException.php b/vendor/phpunit/phpunit/src/Event/Exception/SubscriberTypeAlreadyRegisteredException.php deleted file mode 100644 index ebbbd3f..0000000 --- a/vendor/phpunit/phpunit/src/Event/Exception/SubscriberTypeAlreadyRegisteredException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event; - -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class SubscriberTypeAlreadyRegisteredException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Event/Exception/UnknownEventException.php b/vendor/phpunit/phpunit/src/Event/Exception/UnknownEventException.php deleted file mode 100644 index 0c12114..0000000 --- a/vendor/phpunit/phpunit/src/Event/Exception/UnknownEventException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event; - -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class UnknownEventException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Event/Exception/UnknownEventTypeException.php b/vendor/phpunit/phpunit/src/Event/Exception/UnknownEventTypeException.php deleted file mode 100644 index ab9432d..0000000 --- a/vendor/phpunit/phpunit/src/Event/Exception/UnknownEventTypeException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event; - -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class UnknownEventTypeException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Event/Exception/UnknownSubscriberException.php b/vendor/phpunit/phpunit/src/Event/Exception/UnknownSubscriberException.php deleted file mode 100644 index b9aaedb..0000000 --- a/vendor/phpunit/phpunit/src/Event/Exception/UnknownSubscriberException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event; - -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class UnknownSubscriberException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Event/Exception/UnknownSubscriberTypeException.php b/vendor/phpunit/phpunit/src/Event/Exception/UnknownSubscriberTypeException.php deleted file mode 100644 index d44ff0e..0000000 --- a/vendor/phpunit/phpunit/src/Event/Exception/UnknownSubscriberTypeException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event; - -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class UnknownSubscriberTypeException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Event/Facade.php b/vendor/phpunit/phpunit/src/Event/Facade.php deleted file mode 100644 index 0a25644..0000000 --- a/vendor/phpunit/phpunit/src/Event/Facade.php +++ /dev/null @@ -1,274 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event; - -use function gc_status; -use PHPUnit\Event\Telemetry\HRTime; -use PHPUnit\Event\Telemetry\Php81GarbageCollectorStatusProvider; -use PHPUnit\Event\Telemetry\Php83GarbageCollectorStatusProvider; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Facade -{ - private static ?self $instance = null; - private Emitter $emitter; - private ?TypeMap $typeMap = null; - private ?DeferringDispatcher $deferringDispatcher = null; - private bool $sealed = false; - - public static function instance(): self - { - if (self::$instance === null) { - self::$instance = new self; - } - - return self::$instance; - } - - public static function emitter(): Emitter - { - return self::instance()->emitter; - } - - public function __construct() - { - $this->emitter = $this->createDispatchingEmitter(); - } - - /** - * @throws EventFacadeIsSealedException - * @throws UnknownSubscriberTypeException - */ - public function registerSubscribers(Subscriber ...$subscribers): void - { - foreach ($subscribers as $subscriber) { - $this->registerSubscriber($subscriber); - } - } - - /** - * @throws EventFacadeIsSealedException - * @throws UnknownSubscriberTypeException - */ - public function registerSubscriber(Subscriber $subscriber): void - { - if ($this->sealed) { - throw new EventFacadeIsSealedException; - } - - $this->deferredDispatcher()->registerSubscriber($subscriber); - } - - /** - * @throws EventFacadeIsSealedException - */ - public function registerTracer(Tracer\Tracer $tracer): void - { - if ($this->sealed) { - throw new EventFacadeIsSealedException; - } - - $this->deferredDispatcher()->registerTracer($tracer); - } - - /** - * @codeCoverageIgnore - * - * @noinspection PhpUnused - */ - public function initForIsolation(HRTime $offset, bool $exportObjects): CollectingDispatcher - { - $dispatcher = new CollectingDispatcher; - - $this->emitter = new DispatchingEmitter( - $dispatcher, - new Telemetry\System( - new Telemetry\SystemStopWatchWithOffset($offset), - new Telemetry\SystemMemoryMeter, - $this->garbageCollectorStatusProvider(), - ), - ); - - if ($exportObjects) { - $this->emitter->exportObjects(); - } - - $this->sealed = true; - - return $dispatcher; - } - - public function forward(EventCollection $events): void - { - $dispatcher = $this->deferredDispatcher(); - - foreach ($events as $event) { - $dispatcher->dispatch($event); - } - } - - public function seal(): void - { - $this->deferredDispatcher()->flush(); - - $this->sealed = true; - - $this->emitter->testRunnerEventFacadeSealed(); - } - - private function createDispatchingEmitter(): DispatchingEmitter - { - return new DispatchingEmitter( - $this->deferredDispatcher(), - $this->createTelemetrySystem(), - ); - } - - private function createTelemetrySystem(): Telemetry\System - { - return new Telemetry\System( - new Telemetry\SystemStopWatch, - new Telemetry\SystemMemoryMeter, - $this->garbageCollectorStatusProvider(), - ); - } - - private function deferredDispatcher(): DeferringDispatcher - { - if ($this->deferringDispatcher === null) { - $this->deferringDispatcher = new DeferringDispatcher( - new DirectDispatcher($this->typeMap()), - ); - } - - return $this->deferringDispatcher; - } - - private function typeMap(): TypeMap - { - if ($this->typeMap === null) { - $typeMap = new TypeMap; - - $this->registerDefaultTypes($typeMap); - - $this->typeMap = $typeMap; - } - - return $this->typeMap; - } - - private function registerDefaultTypes(TypeMap $typeMap): void - { - $defaultEvents = [ - Application\Started::class, - Application\Finished::class, - - Test\DataProviderMethodCalled::class, - Test\DataProviderMethodFinished::class, - Test\MarkedIncomplete::class, - Test\AfterLastTestMethodCalled::class, - Test\AfterLastTestMethodErrored::class, - Test\AfterLastTestMethodFinished::class, - Test\AfterTestMethodCalled::class, - Test\AfterTestMethodErrored::class, - Test\AfterTestMethodFinished::class, - Test\AssertionSucceeded::class, - Test\AssertionFailed::class, - Test\BeforeFirstTestMethodCalled::class, - Test\BeforeFirstTestMethodErrored::class, - Test\BeforeFirstTestMethodFinished::class, - Test\BeforeTestMethodCalled::class, - Test\BeforeTestMethodErrored::class, - Test\BeforeTestMethodFinished::class, - Test\ComparatorRegistered::class, - Test\ConsideredRisky::class, - Test\DeprecationTriggered::class, - Test\Errored::class, - Test\ErrorTriggered::class, - Test\Failed::class, - Test\Finished::class, - Test\NoticeTriggered::class, - Test\Passed::class, - Test\PhpDeprecationTriggered::class, - Test\PhpNoticeTriggered::class, - Test\PhpunitDeprecationTriggered::class, - Test\PhpunitErrorTriggered::class, - Test\PhpunitWarningTriggered::class, - Test\PhpWarningTriggered::class, - Test\PostConditionCalled::class, - Test\PostConditionErrored::class, - Test\PostConditionFinished::class, - Test\PreConditionCalled::class, - Test\PreConditionErrored::class, - Test\PreConditionFinished::class, - Test\PreparationStarted::class, - Test\Prepared::class, - Test\PreparationFailed::class, - Test\PrintedUnexpectedOutput::class, - Test\Skipped::class, - Test\WarningTriggered::class, - - Test\MockObjectCreated::class, - Test\MockObjectForAbstractClassCreated::class, - Test\MockObjectForIntersectionOfInterfacesCreated::class, - Test\MockObjectForTraitCreated::class, - Test\MockObjectFromWsdlCreated::class, - Test\PartialMockObjectCreated::class, - Test\TestProxyCreated::class, - Test\TestStubCreated::class, - Test\TestStubForIntersectionOfInterfacesCreated::class, - - TestRunner\BootstrapFinished::class, - TestRunner\Configured::class, - TestRunner\EventFacadeSealed::class, - TestRunner\ExecutionAborted::class, - TestRunner\ExecutionFinished::class, - TestRunner\ExecutionStarted::class, - TestRunner\ExtensionLoadedFromPhar::class, - TestRunner\ExtensionBootstrapped::class, - TestRunner\Finished::class, - TestRunner\Started::class, - TestRunner\DeprecationTriggered::class, - TestRunner\WarningTriggered::class, - TestRunner\GarbageCollectionDisabled::class, - TestRunner\GarbageCollectionTriggered::class, - TestRunner\GarbageCollectionEnabled::class, - - TestSuite\Filtered::class, - TestSuite\Finished::class, - TestSuite\Loaded::class, - TestSuite\Skipped::class, - TestSuite\Sorted::class, - TestSuite\Started::class, - ]; - - foreach ($defaultEvents as $eventClass) { - $typeMap->addMapping( - $eventClass . 'Subscriber', - $eventClass, - ); - } - } - - private function garbageCollectorStatusProvider(): Telemetry\GarbageCollectorStatusProvider - { - if (!isset(gc_status()['running'])) { - // @codeCoverageIgnoreStart - return new Php81GarbageCollectorStatusProvider; - // @codeCoverageIgnoreEnd - } - - return new Php83GarbageCollectorStatusProvider; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Subscriber.php b/vendor/phpunit/phpunit/src/Event/Subscriber.php deleted file mode 100644 index e0455c0..0000000 --- a/vendor/phpunit/phpunit/src/Event/Subscriber.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface Subscriber -{ -} diff --git a/vendor/phpunit/phpunit/src/Event/Tracer.php b/vendor/phpunit/phpunit/src/Event/Tracer.php deleted file mode 100644 index 3b029fd..0000000 --- a/vendor/phpunit/phpunit/src/Event/Tracer.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Tracer; - -use PHPUnit\Event\Event; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface Tracer -{ - public function trace(Event $event): void; -} diff --git a/vendor/phpunit/phpunit/src/Event/TypeMap.php b/vendor/phpunit/phpunit/src/Event/TypeMap.php deleted file mode 100644 index f808c9b..0000000 --- a/vendor/phpunit/phpunit/src/Event/TypeMap.php +++ /dev/null @@ -1,192 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event; - -use function array_key_exists; -use function class_exists; -use function class_implements; -use function in_array; -use function interface_exists; -use function sprintf; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TypeMap -{ - /** - * @psalm-var array - */ - private array $mapping = []; - - /** - * @psalm-param class-string $subscriberInterface - * @psalm-param class-string $eventClass - * - * @throws EventAlreadyAssignedException - * @throws InvalidEventException - * @throws InvalidSubscriberException - * @throws SubscriberTypeAlreadyRegisteredException - * @throws UnknownEventException - * @throws UnknownSubscriberException - */ - public function addMapping(string $subscriberInterface, string $eventClass): void - { - $this->ensureSubscriberInterfaceExists($subscriberInterface); - $this->ensureSubscriberInterfaceExtendsInterface($subscriberInterface); - $this->ensureEventClassExists($eventClass); - $this->ensureEventClassImplementsEventInterface($eventClass); - $this->ensureSubscriberWasNotAlreadyRegistered($subscriberInterface); - $this->ensureEventWasNotAlreadyAssigned($eventClass); - - $this->mapping[$subscriberInterface] = $eventClass; - } - - public function isKnownSubscriberType(Subscriber $subscriber): bool - { - foreach (class_implements($subscriber) as $interface) { - if (array_key_exists($interface, $this->mapping)) { - return true; - } - } - - return false; - } - - public function isKnownEventType(Event $event): bool - { - return in_array($event::class, $this->mapping, true); - } - - /** - * @throws MapError - * - * @psalm-return class-string - */ - public function map(Subscriber $subscriber): string - { - foreach (class_implements($subscriber) as $interface) { - if (array_key_exists($interface, $this->mapping)) { - return $this->mapping[$interface]; - } - } - - throw new MapError( - sprintf( - 'Subscriber "%s" does not implement a known interface', - $subscriber::class, - ), - ); - } - - /** - * @psalm-param class-string $subscriberInterface - * - * @throws UnknownSubscriberException - */ - private function ensureSubscriberInterfaceExists(string $subscriberInterface): void - { - if (!interface_exists($subscriberInterface)) { - throw new UnknownSubscriberException( - sprintf( - 'Subscriber "%s" does not exist or is not an interface', - $subscriberInterface, - ), - ); - } - } - - /** - * @psalm-param class-string $eventClass - * - * @throws UnknownEventException - */ - private function ensureEventClassExists(string $eventClass): void - { - if (!class_exists($eventClass)) { - throw new UnknownEventException( - sprintf( - 'Event class "%s" does not exist', - $eventClass, - ), - ); - } - } - - /** - * @psalm-param class-string $subscriberInterface - * - * @throws InvalidSubscriberException - */ - private function ensureSubscriberInterfaceExtendsInterface(string $subscriberInterface): void - { - if (!in_array(Subscriber::class, class_implements($subscriberInterface), true)) { - throw new InvalidSubscriberException( - sprintf( - 'Subscriber "%s" does not extend Subscriber interface', - $subscriberInterface, - ), - ); - } - } - - /** - * @psalm-param class-string $eventClass - * - * @throws InvalidEventException - */ - private function ensureEventClassImplementsEventInterface(string $eventClass): void - { - if (!in_array(Event::class, class_implements($eventClass), true)) { - throw new InvalidEventException( - sprintf( - 'Event "%s" does not implement Event interface', - $eventClass, - ), - ); - } - } - - /** - * @psalm-param class-string $subscriberInterface - * - * @throws SubscriberTypeAlreadyRegisteredException - */ - private function ensureSubscriberWasNotAlreadyRegistered(string $subscriberInterface): void - { - if (array_key_exists($subscriberInterface, $this->mapping)) { - throw new SubscriberTypeAlreadyRegisteredException( - sprintf( - 'Subscriber type "%s" already registered', - $subscriberInterface, - ), - ); - } - } - - /** - * @psalm-param class-string $eventClass - * - * @throws EventAlreadyAssignedException - */ - private function ensureEventWasNotAlreadyAssigned(string $eventClass): void - { - if (in_array($eventClass, $this->mapping, true)) { - throw new EventAlreadyAssignedException( - sprintf( - 'Event "%s" already assigned', - $eventClass, - ), - ); - } - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/ClassMethod.php b/vendor/phpunit/phpunit/src/Event/Value/ClassMethod.php deleted file mode 100644 index 5b7d56c..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/ClassMethod.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Code; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class ClassMethod -{ - /** - * @psalm-var class-string - */ - private readonly string $className; - - /** - * @psalm-var non-empty-string - */ - private readonly string $methodName; - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - */ - public function __construct(string $className, string $methodName) - { - $this->className = $className; - $this->methodName = $methodName; - } - - /** - * @psalm-return class-string - */ - public function className(): string - { - return $this->className; - } - - /** - * @psalm-return non-empty-string - */ - public function methodName(): string - { - return $this->methodName; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/ComparisonFailure.php b/vendor/phpunit/phpunit/src/Event/Value/ComparisonFailure.php deleted file mode 100644 index b8e5cc9..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/ComparisonFailure.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Code; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class ComparisonFailure -{ - private readonly string $expected; - private readonly string $actual; - private readonly string $diff; - - public function __construct(string $expected, string $actual, string $diff) - { - $this->expected = $expected; - $this->actual = $actual; - $this->diff = $diff; - } - - public function expected(): string - { - return $this->expected; - } - - public function actual(): string - { - return $this->actual; - } - - public function diff(): string - { - return $this->diff; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/ComparisonFailureBuilder.php b/vendor/phpunit/phpunit/src/Event/Value/ComparisonFailureBuilder.php deleted file mode 100644 index ece0342..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/ComparisonFailureBuilder.php +++ /dev/null @@ -1,70 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Code; - -use function is_bool; -use function is_scalar; -use function print_r; -use PHPUnit\Framework\ExpectationFailedException; -use Throwable; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ComparisonFailureBuilder -{ - public static function from(Throwable $t): ?ComparisonFailure - { - if (!$t instanceof ExpectationFailedException) { - return null; - } - - if (!$t->getComparisonFailure()) { - return null; - } - - $expectedAsString = $t->getComparisonFailure()->getExpectedAsString(); - - if (empty($expectedAsString)) { - $expectedAsString = self::mapScalarValueToString($t->getComparisonFailure()->getExpected()); - } - - $actualAsString = $t->getComparisonFailure()->getActualAsString(); - - if (empty($actualAsString)) { - $actualAsString = self::mapScalarValueToString($t->getComparisonFailure()->getActual()); - } - - return new ComparisonFailure( - $expectedAsString, - $actualAsString, - $t->getComparisonFailure()->getDiff(), - ); - } - - private static function mapScalarValueToString(mixed $value): string - { - if ($value === null) { - return 'null'; - } - - if (is_bool($value)) { - return $value ? 'true' : 'false'; - } - - if (is_scalar($value)) { - return print_r($value, true); - } - - return ''; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/Runtime/OperatingSystem.php b/vendor/phpunit/phpunit/src/Event/Value/Runtime/OperatingSystem.php deleted file mode 100644 index a901be4..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/Runtime/OperatingSystem.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Runtime; - -use const PHP_OS; -use const PHP_OS_FAMILY; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class OperatingSystem -{ - private readonly string $operatingSystem; - private readonly string $operatingSystemFamily; - - public function __construct() - { - $this->operatingSystem = PHP_OS; - $this->operatingSystemFamily = PHP_OS_FAMILY; - } - - public function operatingSystem(): string - { - return $this->operatingSystem; - } - - public function operatingSystemFamily(): string - { - return $this->operatingSystemFamily; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/Runtime/PHP.php b/vendor/phpunit/phpunit/src/Event/Value/Runtime/PHP.php deleted file mode 100644 index 717f3c1..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/Runtime/PHP.php +++ /dev/null @@ -1,105 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Runtime; - -use const PHP_EXTRA_VERSION; -use const PHP_MAJOR_VERSION; -use const PHP_MINOR_VERSION; -use const PHP_RELEASE_VERSION; -use const PHP_SAPI; -use const PHP_VERSION; -use const PHP_VERSION_ID; -use function array_merge; -use function get_loaded_extensions; -use function sort; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class PHP -{ - private readonly string $version; - private readonly int $versionId; - private readonly int $majorVersion; - private readonly int $minorVersion; - private readonly int $releaseVersion; - private readonly string $extraVersion; - private readonly string $sapi; - - /** - * @psalm-var list - */ - private readonly array $extensions; - - public function __construct() - { - $this->version = PHP_VERSION; - $this->versionId = PHP_VERSION_ID; - $this->majorVersion = PHP_MAJOR_VERSION; - $this->minorVersion = PHP_MINOR_VERSION; - $this->releaseVersion = PHP_RELEASE_VERSION; - $this->extraVersion = PHP_EXTRA_VERSION; - $this->sapi = PHP_SAPI; - - $extensions = array_merge( - get_loaded_extensions(true), - get_loaded_extensions(), - ); - - sort($extensions); - - $this->extensions = $extensions; - } - - public function version(): string - { - return $this->version; - } - - public function sapi(): string - { - return $this->sapi; - } - - public function majorVersion(): int - { - return $this->majorVersion; - } - - public function minorVersion(): int - { - return $this->minorVersion; - } - - public function releaseVersion(): int - { - return $this->releaseVersion; - } - - public function extraVersion(): string - { - return $this->extraVersion; - } - - public function versionId(): int - { - return $this->versionId; - } - - /** - * @psalm-return list - */ - public function extensions(): array - { - return $this->extensions; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/Runtime/PHPUnit.php b/vendor/phpunit/phpunit/src/Event/Value/Runtime/PHPUnit.php deleted file mode 100644 index f6fb037..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/Runtime/PHPUnit.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Runtime; - -use PHPUnit\Runner\Version; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class PHPUnit -{ - private readonly string $versionId; - private readonly string $releaseSeries; - - public function __construct() - { - $this->versionId = Version::id(); - $this->releaseSeries = Version::series(); - } - - public function versionId(): string - { - return $this->versionId; - } - - public function releaseSeries(): string - { - return $this->releaseSeries; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/Runtime/Runtime.php b/vendor/phpunit/phpunit/src/Event/Value/Runtime/Runtime.php deleted file mode 100644 index cea7ba3..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/Runtime/Runtime.php +++ /dev/null @@ -1,59 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Runtime; - -use function sprintf; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class Runtime -{ - private readonly OperatingSystem $operatingSystem; - private readonly PHP $php; - private readonly PHPUnit $phpunit; - - public function __construct() - { - $this->operatingSystem = new OperatingSystem; - $this->php = new PHP; - $this->phpunit = new PHPUnit; - } - - public function asString(): string - { - $php = $this->php(); - - return sprintf( - 'PHPUnit %s using PHP %s (%s) on %s', - $this->phpunit()->versionId(), - $php->version(), - $php->sapi(), - $this->operatingSystem()->operatingSystem(), - ); - } - - public function operatingSystem(): OperatingSystem - { - return $this->operatingSystem; - } - - public function php(): PHP - { - return $this->php; - } - - public function phpunit(): PHPUnit - { - return $this->phpunit; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/Telemetry/Duration.php b/vendor/phpunit/phpunit/src/Event/Value/Telemetry/Duration.php deleted file mode 100644 index 000216c..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/Telemetry/Duration.php +++ /dev/null @@ -1,148 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Telemetry; - -use function floor; -use function sprintf; -use PHPUnit\Event\InvalidArgumentException; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class Duration -{ - private readonly int $seconds; - private readonly int $nanoseconds; - - /** - * @throws InvalidArgumentException - */ - public static function fromSecondsAndNanoseconds(int $seconds, int $nanoseconds): self - { - return new self( - $seconds, - $nanoseconds, - ); - } - - /** - * @throws InvalidArgumentException - */ - private function __construct(int $seconds, int $nanoseconds) - { - $this->ensureNotNegative($seconds, 'seconds'); - $this->ensureNotNegative($nanoseconds, 'nanoseconds'); - $this->ensureNanoSecondsInRange($nanoseconds); - - $this->seconds = $seconds; - $this->nanoseconds = $nanoseconds; - } - - public function seconds(): int - { - return $this->seconds; - } - - public function nanoseconds(): int - { - return $this->nanoseconds; - } - - public function asFloat(): float - { - return $this->seconds() + ($this->nanoseconds() / 1000000000); - } - - public function asString(): string - { - $seconds = $this->seconds(); - $minutes = 0; - $hours = 0; - - if ($seconds > 60 * 60) { - $hours = floor($seconds / 60 / 60); - $seconds -= ($hours * 60 * 60); - } - - if ($seconds > 60) { - $minutes = floor($seconds / 60); - $seconds -= ($minutes * 60); - } - - return sprintf( - '%02d:%02d:%02d.%09d', - $hours, - $minutes, - $seconds, - $this->nanoseconds(), - ); - } - - public function equals(self $other): bool - { - return $this->seconds === $other->seconds && - $this->nanoseconds === $other->nanoseconds; - } - - public function isLessThan(self $other): bool - { - if ($this->seconds < $other->seconds) { - return true; - } - - if ($this->seconds > $other->seconds) { - return false; - } - - return $this->nanoseconds < $other->nanoseconds; - } - - public function isGreaterThan(self $other): bool - { - if ($this->seconds > $other->seconds) { - return true; - } - - if ($this->seconds < $other->seconds) { - return false; - } - - return $this->nanoseconds > $other->nanoseconds; - } - - /** - * @throws InvalidArgumentException - */ - private function ensureNotNegative(int $value, string $type): void - { - if ($value < 0) { - throw new InvalidArgumentException( - sprintf( - 'Value for %s must not be negative.', - $type, - ), - ); - } - } - - /** - * @throws InvalidArgumentException - */ - private function ensureNanoSecondsInRange(int $nanoseconds): void - { - if ($nanoseconds > 999999999) { - throw new InvalidArgumentException( - 'Value for nanoseconds must not be greater than 999999999.', - ); - } - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/Telemetry/GarbageCollectorStatus.php b/vendor/phpunit/phpunit/src/Event/Value/Telemetry/GarbageCollectorStatus.php deleted file mode 100644 index 51a5ac6..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/Telemetry/GarbageCollectorStatus.php +++ /dev/null @@ -1,180 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Telemetry; - -use PHPUnit\Event\RuntimeException; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class GarbageCollectorStatus -{ - private readonly int $runs; - private readonly int $collected; - private readonly int $threshold; - private readonly int $roots; - private readonly ?float $applicationTime; - private readonly ?float $collectorTime; - private readonly ?float $destructorTime; - private readonly ?float $freeTime; - private readonly ?bool $running; - private readonly ?bool $protected; - private readonly ?bool $full; - private readonly ?int $bufferSize; - - public function __construct(int $runs, int $collected, int $threshold, int $roots, ?float $applicationTime, ?float $collectorTime, ?float $destructorTime, ?float $freeTime, ?bool $running, ?bool $protected, ?bool $full, ?int $bufferSize) - { - $this->runs = $runs; - $this->collected = $collected; - $this->threshold = $threshold; - $this->roots = $roots; - $this->applicationTime = $applicationTime; - $this->collectorTime = $collectorTime; - $this->destructorTime = $destructorTime; - $this->freeTime = $freeTime; - $this->running = $running; - $this->protected = $protected; - $this->full = $full; - $this->bufferSize = $bufferSize; - } - - public function runs(): int - { - return $this->runs; - } - - public function collected(): int - { - return $this->collected; - } - - public function threshold(): int - { - return $this->threshold; - } - - public function roots(): int - { - return $this->roots; - } - - /** - * @psalm-assert-if-true !null $this->applicationTime - * @psalm-assert-if-true !null $this->collectorTime - * @psalm-assert-if-true !null $this->destructorTime - * @psalm-assert-if-true !null $this->freeTime - * @psalm-assert-if-true !null $this->running - * @psalm-assert-if-true !null $this->protected - * @psalm-assert-if-true !null $this->full - * @psalm-assert-if-true !null $this->bufferSize - */ - public function hasExtendedInformation(): bool - { - return $this->running !== null; - } - - /** - * @throws RuntimeException on PHP < 8.3 - */ - public function applicationTime(): float - { - if ($this->applicationTime === null) { - throw new RuntimeException('Information not available'); - } - - return $this->applicationTime; - } - - /** - * @throws RuntimeException on PHP < 8.3 - */ - public function collectorTime(): float - { - if ($this->collectorTime === null) { - throw new RuntimeException('Information not available'); - } - - return $this->collectorTime; - } - - /** - * @throws RuntimeException on PHP < 8.3 - */ - public function destructorTime(): float - { - if ($this->destructorTime === null) { - throw new RuntimeException('Information not available'); - } - - return $this->destructorTime; - } - - /** - * @throws RuntimeException on PHP < 8.3 - */ - public function freeTime(): float - { - if ($this->freeTime === null) { - throw new RuntimeException('Information not available'); - } - - return $this->freeTime; - } - - /** - * @throws RuntimeException on PHP < 8.3 - */ - public function isRunning(): bool - { - if ($this->running === null) { - throw new RuntimeException('Information not available'); - } - - return $this->running; - } - - /** - * @throws RuntimeException on PHP < 8.3 - */ - public function isProtected(): bool - { - if ($this->protected === null) { - throw new RuntimeException('Information not available'); - } - - return $this->protected; - } - - /** - * @throws RuntimeException on PHP < 8.3 - */ - public function isFull(): bool - { - if ($this->full === null) { - throw new RuntimeException('Information not available'); - } - - return $this->full; - } - - /** - * @throws RuntimeException on PHP < 8.3 - */ - public function bufferSize(): int - { - if ($this->bufferSize === null) { - throw new RuntimeException('Information not available'); - } - - return $this->bufferSize; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/Telemetry/GarbageCollectorStatusProvider.php b/vendor/phpunit/phpunit/src/Event/Value/Telemetry/GarbageCollectorStatusProvider.php deleted file mode 100644 index 09bede2..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/Telemetry/GarbageCollectorStatusProvider.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Telemetry; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This interface is not covered by the backward compatibility promise for PHPUnit - */ -interface GarbageCollectorStatusProvider -{ - public function status(): GarbageCollectorStatus; -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/Telemetry/HRTime.php b/vendor/phpunit/phpunit/src/Event/Value/Telemetry/HRTime.php deleted file mode 100644 index df2aa65..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/Telemetry/HRTime.php +++ /dev/null @@ -1,106 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Telemetry; - -use function sprintf; -use PHPUnit\Event\InvalidArgumentException; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class HRTime -{ - private readonly int $seconds; - private readonly int $nanoseconds; - - /** - * @throws InvalidArgumentException - */ - public static function fromSecondsAndNanoseconds(int $seconds, int $nanoseconds): self - { - return new self( - $seconds, - $nanoseconds, - ); - } - - /** - * @throws InvalidArgumentException - */ - private function __construct(int $seconds, int $nanoseconds) - { - $this->ensureNotNegative($seconds, 'seconds'); - $this->ensureNotNegative($nanoseconds, 'nanoseconds'); - $this->ensureNanoSecondsInRange($nanoseconds); - - $this->seconds = $seconds; - $this->nanoseconds = $nanoseconds; - } - - public function seconds(): int - { - return $this->seconds; - } - - public function nanoseconds(): int - { - return $this->nanoseconds; - } - - public function duration(self $start): Duration - { - $seconds = $this->seconds - $start->seconds(); - $nanoseconds = $this->nanoseconds - $start->nanoseconds(); - - if ($nanoseconds < 0) { - $seconds--; - - $nanoseconds += 1000000000; - } - - if ($seconds < 0) { - return Duration::fromSecondsAndNanoseconds(0, 0); - } - - return Duration::fromSecondsAndNanoseconds( - $seconds, - $nanoseconds, - ); - } - - /** - * @throws InvalidArgumentException - */ - private function ensureNotNegative(int $value, string $type): void - { - if ($value < 0) { - throw new InvalidArgumentException( - sprintf( - 'Value for %s must not be negative.', - $type, - ), - ); - } - } - - /** - * @throws InvalidArgumentException - */ - private function ensureNanoSecondsInRange(int $nanoseconds): void - { - if ($nanoseconds > 999999999) { - throw new InvalidArgumentException( - 'Value for nanoseconds must not be greater than 999999999.', - ); - } - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/Telemetry/Info.php b/vendor/phpunit/phpunit/src/Event/Value/Telemetry/Info.php deleted file mode 100644 index 1546d94..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/Telemetry/Info.php +++ /dev/null @@ -1,85 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Telemetry; - -use function sprintf; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class Info -{ - private readonly Snapshot $current; - private readonly Duration $durationSinceStart; - private readonly MemoryUsage $memorySinceStart; - private readonly Duration $durationSincePrevious; - private readonly MemoryUsage $memorySincePrevious; - - public function __construct(Snapshot $current, Duration $durationSinceStart, MemoryUsage $memorySinceStart, Duration $durationSincePrevious, MemoryUsage $memorySincePrevious) - { - $this->current = $current; - $this->durationSinceStart = $durationSinceStart; - $this->memorySinceStart = $memorySinceStart; - $this->durationSincePrevious = $durationSincePrevious; - $this->memorySincePrevious = $memorySincePrevious; - } - - public function time(): HRTime - { - return $this->current->time(); - } - - public function memoryUsage(): MemoryUsage - { - return $this->current->memoryUsage(); - } - - public function peakMemoryUsage(): MemoryUsage - { - return $this->current->peakMemoryUsage(); - } - - public function durationSinceStart(): Duration - { - return $this->durationSinceStart; - } - - public function memoryUsageSinceStart(): MemoryUsage - { - return $this->memorySinceStart; - } - - public function durationSincePrevious(): Duration - { - return $this->durationSincePrevious; - } - - public function memoryUsageSincePrevious(): MemoryUsage - { - return $this->memorySincePrevious; - } - - public function garbageCollectorStatus(): GarbageCollectorStatus - { - return $this->current->garbageCollectorStatus(); - } - - public function asString(): string - { - return sprintf( - '[%s / %s] [%d bytes]', - $this->durationSinceStart()->asString(), - $this->durationSincePrevious()->asString(), - $this->memoryUsage()->bytes(), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/Telemetry/MemoryMeter.php b/vendor/phpunit/phpunit/src/Event/Value/Telemetry/MemoryMeter.php deleted file mode 100644 index 4d116ff..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/Telemetry/MemoryMeter.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Telemetry; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This interface is not covered by the backward compatibility promise for PHPUnit - */ -interface MemoryMeter -{ - public function memoryUsage(): MemoryUsage; - - public function peakMemoryUsage(): MemoryUsage; -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/Telemetry/MemoryUsage.php b/vendor/phpunit/phpunit/src/Event/Value/Telemetry/MemoryUsage.php deleted file mode 100644 index 7e8bc69..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/Telemetry/MemoryUsage.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class MemoryUsage -{ - private readonly int $bytes; - - public static function fromBytes(int $bytes): self - { - return new self($bytes); - } - - private function __construct(int $bytes) - { - $this->bytes = $bytes; - } - - public function bytes(): int - { - return $this->bytes; - } - - public function diff(self $other): self - { - return self::fromBytes($this->bytes - $other->bytes); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/Telemetry/Php81GarbageCollectorStatusProvider.php b/vendor/phpunit/phpunit/src/Event/Value/Telemetry/Php81GarbageCollectorStatusProvider.php deleted file mode 100644 index a96eff3..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/Telemetry/Php81GarbageCollectorStatusProvider.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Telemetry; - -use function gc_status; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @codeCoverageIgnore - */ -final class Php81GarbageCollectorStatusProvider implements GarbageCollectorStatusProvider -{ - public function status(): GarbageCollectorStatus - { - $status = gc_status(); - - return new GarbageCollectorStatus( - $status['runs'], - $status['collected'], - $status['threshold'], - $status['roots'], - null, - null, - null, - null, - null, - null, - null, - null, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/Telemetry/Php83GarbageCollectorStatusProvider.php b/vendor/phpunit/phpunit/src/Event/Value/Telemetry/Php83GarbageCollectorStatusProvider.php deleted file mode 100644 index ffac76f..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/Telemetry/Php83GarbageCollectorStatusProvider.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Telemetry; - -use function gc_status; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Php83GarbageCollectorStatusProvider implements GarbageCollectorStatusProvider -{ - public function status(): GarbageCollectorStatus - { - $status = gc_status(); - - return new GarbageCollectorStatus( - $status['runs'], - $status['collected'], - $status['threshold'], - $status['roots'], - $status['application_time'], - $status['collector_time'], - $status['destructor_time'], - $status['free_time'], - $status['running'], - $status['protected'], - $status['full'], - $status['buffer_size'], - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/Telemetry/Snapshot.php b/vendor/phpunit/phpunit/src/Event/Value/Telemetry/Snapshot.php deleted file mode 100644 index 6c5a165..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/Telemetry/Snapshot.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Telemetry; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class Snapshot -{ - private readonly HRTime $time; - private readonly MemoryUsage $memoryUsage; - private readonly MemoryUsage $peakMemoryUsage; - private readonly GarbageCollectorStatus $garbageCollectorStatus; - - public function __construct(HRTime $time, MemoryUsage $memoryUsage, MemoryUsage $peakMemoryUsage, GarbageCollectorStatus $garbageCollectorStatus) - { - $this->time = $time; - $this->memoryUsage = $memoryUsage; - $this->peakMemoryUsage = $peakMemoryUsage; - $this->garbageCollectorStatus = $garbageCollectorStatus; - } - - public function time(): HRTime - { - return $this->time; - } - - public function memoryUsage(): MemoryUsage - { - return $this->memoryUsage; - } - - public function peakMemoryUsage(): MemoryUsage - { - return $this->peakMemoryUsage; - } - - public function garbageCollectorStatus(): GarbageCollectorStatus - { - return $this->garbageCollectorStatus; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/Telemetry/StopWatch.php b/vendor/phpunit/phpunit/src/Event/Value/Telemetry/StopWatch.php deleted file mode 100644 index 07ce522..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/Telemetry/StopWatch.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Telemetry; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This interface is not covered by the backward compatibility promise for PHPUnit - */ -interface StopWatch -{ - public function current(): HRTime; -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/Telemetry/System.php b/vendor/phpunit/phpunit/src/Event/Value/Telemetry/System.php deleted file mode 100644 index 368054d..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/Telemetry/System.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Telemetry; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class System -{ - private readonly StopWatch $stopWatch; - private readonly MemoryMeter $memoryMeter; - private readonly GarbageCollectorStatusProvider $garbageCollectorStatusProvider; - - public function __construct(StopWatch $stopWatch, MemoryMeter $memoryMeter, GarbageCollectorStatusProvider $garbageCollectorStatusProvider) - { - $this->stopWatch = $stopWatch; - $this->memoryMeter = $memoryMeter; - $this->garbageCollectorStatusProvider = $garbageCollectorStatusProvider; - } - - public function snapshot(): Snapshot - { - return new Snapshot( - $this->stopWatch->current(), - $this->memoryMeter->memoryUsage(), - $this->memoryMeter->peakMemoryUsage(), - $this->garbageCollectorStatusProvider->status(), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/Telemetry/SystemMemoryMeter.php b/vendor/phpunit/phpunit/src/Event/Value/Telemetry/SystemMemoryMeter.php deleted file mode 100644 index f525665..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/Telemetry/SystemMemoryMeter.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Telemetry; - -use function memory_get_peak_usage; -use function memory_get_usage; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class SystemMemoryMeter implements MemoryMeter -{ - public function memoryUsage(): MemoryUsage - { - return MemoryUsage::fromBytes(memory_get_usage(true)); - } - - public function peakMemoryUsage(): MemoryUsage - { - return MemoryUsage::fromBytes(memory_get_peak_usage(true)); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/Telemetry/SystemStopWatch.php b/vendor/phpunit/phpunit/src/Event/Value/Telemetry/SystemStopWatch.php deleted file mode 100644 index 9c9373e..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/Telemetry/SystemStopWatch.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Telemetry; - -use function hrtime; -use PHPUnit\Event\InvalidArgumentException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class SystemStopWatch implements StopWatch -{ - /** - * @throws InvalidArgumentException - */ - public function current(): HRTime - { - return HRTime::fromSecondsAndNanoseconds(...hrtime()); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/Telemetry/SystemStopWatchWithOffset.php b/vendor/phpunit/phpunit/src/Event/Value/Telemetry/SystemStopWatchWithOffset.php deleted file mode 100644 index d27fd98..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/Telemetry/SystemStopWatchWithOffset.php +++ /dev/null @@ -1,46 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Telemetry; - -use function hrtime; -use PHPUnit\Event\InvalidArgumentException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @codeCoverageIgnore - */ -final class SystemStopWatchWithOffset implements StopWatch -{ - private ?HRTime $offset; - - public function __construct(HRTime $offset) - { - $this->offset = $offset; - } - - /** - * @throws InvalidArgumentException - */ - public function current(): HRTime - { - if ($this->offset !== null) { - $offset = $this->offset; - - $this->offset = null; - - return $offset; - } - - return HRTime::fromSecondsAndNanoseconds(...hrtime()); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/Test/Phpt.php b/vendor/phpunit/phpunit/src/Event/Value/Test/Phpt.php deleted file mode 100644 index 1056787..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/Test/Phpt.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Code; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class Phpt extends Test -{ - /** - * @psalm-assert-if-true Phpt $this - */ - public function isPhpt(): bool - { - return true; - } - - /** - * @psalm-return non-empty-string - */ - public function id(): string - { - return $this->file(); - } - - /** - * @psalm-return non-empty-string - */ - public function name(): string - { - return $this->file(); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/Test/Test.php b/vendor/phpunit/phpunit/src/Event/Value/Test/Test.php deleted file mode 100644 index 6ec899c..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/Test/Test.php +++ /dev/null @@ -1,65 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Code; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -abstract class Test -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $file; - - /** - * @psalm-param non-empty-string $file - */ - public function __construct(string $file) - { - $this->file = $file; - } - - /** - * @psalm-return non-empty-string - */ - public function file(): string - { - return $this->file; - } - - /** - * @psalm-assert-if-true TestMethod $this - */ - public function isTestMethod(): bool - { - return false; - } - - /** - * @psalm-assert-if-true Phpt $this - */ - public function isPhpt(): bool - { - return false; - } - - /** - * @psalm-return non-empty-string - */ - abstract public function id(): string; - - /** - * @psalm-return non-empty-string - */ - abstract public function name(): string; -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/Test/TestCollection.php b/vendor/phpunit/phpunit/src/Event/Value/Test/TestCollection.php deleted file mode 100644 index 2656e1c..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/Test/TestCollection.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Code; - -use function count; -use Countable; -use IteratorAggregate; - -/** - * @template-implements IteratorAggregate - * - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class TestCollection implements Countable, IteratorAggregate -{ - /** - * @psalm-var list - */ - private readonly array $tests; - - /** - * @psalm-param list $tests - */ - public static function fromArray(array $tests): self - { - return new self(...$tests); - } - - private function __construct(Test ...$tests) - { - $this->tests = $tests; - } - - /** - * @psalm-return list - */ - public function asArray(): array - { - return $this->tests; - } - - public function count(): int - { - return count($this->tests); - } - - public function getIterator(): TestCollectionIterator - { - return new TestCollectionIterator($this); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/Test/TestCollectionIterator.php b/vendor/phpunit/phpunit/src/Event/Value/Test/TestCollectionIterator.php deleted file mode 100644 index a392a60..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/Test/TestCollectionIterator.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Code; - -use function count; -use Iterator; - -/** - * @template-implements Iterator - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class TestCollectionIterator implements Iterator -{ - /** - * @psalm-var list - */ - private readonly array $tests; - private int $position = 0; - - public function __construct(TestCollection $tests) - { - $this->tests = $tests->asArray(); - } - - public function rewind(): void - { - $this->position = 0; - } - - public function valid(): bool - { - return $this->position < count($this->tests); - } - - public function key(): int - { - return $this->position; - } - - public function current(): Test - { - return $this->tests[$this->position]; - } - - public function next(): void - { - $this->position++; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/Test/TestData/DataFromDataProvider.php b/vendor/phpunit/phpunit/src/Event/Value/Test/TestData/DataFromDataProvider.php deleted file mode 100644 index fb7d561..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/Test/TestData/DataFromDataProvider.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestData; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class DataFromDataProvider extends TestData -{ - private readonly int|string $dataSetName; - private readonly string $dataAsStringForResultOutput; - - public static function from(int|string $dataSetName, string $data, string $dataAsStringForResultOutput): self - { - return new self($dataSetName, $data, $dataAsStringForResultOutput); - } - - protected function __construct(int|string $dataSetName, string $data, string $dataAsStringForResultOutput) - { - $this->dataSetName = $dataSetName; - $this->dataAsStringForResultOutput = $dataAsStringForResultOutput; - - parent::__construct($data); - } - - public function dataSetName(): int|string - { - return $this->dataSetName; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function dataAsStringForResultOutput(): string - { - return $this->dataAsStringForResultOutput; - } - - /** - * @psalm-assert-if-true DataFromDataProvider $this - */ - public function isFromDataProvider(): bool - { - return true; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/Test/TestData/DataFromTestDependency.php b/vendor/phpunit/phpunit/src/Event/Value/Test/TestData/DataFromTestDependency.php deleted file mode 100644 index 48fa5cd..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/Test/TestData/DataFromTestDependency.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestData; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class DataFromTestDependency extends TestData -{ - public static function from(string $data): self - { - return new self($data); - } - - /** - * @psalm-assert-if-true DataFromTestDependency $this - */ - public function isFromTestDependency(): bool - { - return true; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/Test/TestData/TestData.php b/vendor/phpunit/phpunit/src/Event/Value/Test/TestData/TestData.php deleted file mode 100644 index dd68d1f..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/Test/TestData/TestData.php +++ /dev/null @@ -1,46 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestData; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -abstract class TestData -{ - private readonly string $data; - - protected function __construct(string $data) - { - $this->data = $data; - } - - public function data(): string - { - return $this->data; - } - - /** - * @psalm-assert-if-true DataFromDataProvider $this - */ - public function isFromDataProvider(): bool - { - return false; - } - - /** - * @psalm-assert-if-true DataFromTestDependency $this - */ - public function isFromTestDependency(): bool - { - return false; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/Test/TestData/TestDataCollection.php b/vendor/phpunit/phpunit/src/Event/Value/Test/TestData/TestDataCollection.php deleted file mode 100644 index 5501225..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/Test/TestData/TestDataCollection.php +++ /dev/null @@ -1,104 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestData; - -use function count; -use Countable; -use IteratorAggregate; - -/** - * @template-implements IteratorAggregate - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class TestDataCollection implements Countable, IteratorAggregate -{ - /** - * @psalm-var list - */ - private readonly array $data; - private ?DataFromDataProvider $fromDataProvider = null; - - /** - * @psalm-param list $data - * - * @throws MoreThanOneDataSetFromDataProviderException - */ - public static function fromArray(array $data): self - { - return new self(...$data); - } - - /** - * @throws MoreThanOneDataSetFromDataProviderException - */ - private function __construct(TestData ...$data) - { - $this->ensureNoMoreThanOneDataFromDataProvider($data); - - $this->data = $data; - } - - /** - * @psalm-return list - */ - public function asArray(): array - { - return $this->data; - } - - public function count(): int - { - return count($this->data); - } - - /** - * @psalm-assert-if-true !null $this->fromDataProvider - */ - public function hasDataFromDataProvider(): bool - { - return $this->fromDataProvider !== null; - } - - /** - * @throws NoDataSetFromDataProviderException - */ - public function dataFromDataProvider(): DataFromDataProvider - { - if (!$this->hasDataFromDataProvider()) { - throw new NoDataSetFromDataProviderException; - } - - return $this->fromDataProvider; - } - - public function getIterator(): TestDataCollectionIterator - { - return new TestDataCollectionIterator($this); - } - - /** - * @psalm-param list $data - * - * @throws MoreThanOneDataSetFromDataProviderException - */ - private function ensureNoMoreThanOneDataFromDataProvider(array $data): void - { - foreach ($data as $_data) { - if ($_data->isFromDataProvider()) { - if ($this->fromDataProvider !== null) { - throw new MoreThanOneDataSetFromDataProviderException; - } - - $this->fromDataProvider = $_data; - } - } - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/Test/TestData/TestDataCollectionIterator.php b/vendor/phpunit/phpunit/src/Event/Value/Test/TestData/TestDataCollectionIterator.php deleted file mode 100644 index 93f02c4..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/Test/TestData/TestDataCollectionIterator.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestData; - -use function count; -use Iterator; - -/** - * @template-implements Iterator - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class TestDataCollectionIterator implements Iterator -{ - /** - * @psalm-var list - */ - private readonly array $data; - private int $position = 0; - - public function __construct(TestDataCollection $data) - { - $this->data = $data->asArray(); - } - - public function rewind(): void - { - $this->position = 0; - } - - public function valid(): bool - { - return $this->position < count($this->data); - } - - public function key(): int - { - return $this->position; - } - - public function current(): TestData - { - return $this->data[$this->position]; - } - - public function next(): void - { - $this->position++; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/Test/TestDox.php b/vendor/phpunit/phpunit/src/Event/Value/Test/TestDox.php deleted file mode 100644 index 948d55f..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/Test/TestDox.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Code; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class TestDox -{ - private readonly string $prettifiedClassName; - private readonly string $prettifiedMethodName; - private readonly string $prettifiedAndColorizedMethodName; - - public function __construct(string $prettifiedClassName, string $prettifiedMethodName, string $prettifiedAndColorizedMethodName) - { - $this->prettifiedClassName = $prettifiedClassName; - $this->prettifiedMethodName = $prettifiedMethodName; - $this->prettifiedAndColorizedMethodName = $prettifiedAndColorizedMethodName; - } - - public function prettifiedClassName(): string - { - return $this->prettifiedClassName; - } - - public function prettifiedMethodName(bool $colorize = false): string - { - if ($colorize) { - return $this->prettifiedAndColorizedMethodName; - } - - return $this->prettifiedMethodName; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/Test/TestDoxBuilder.php b/vendor/phpunit/phpunit/src/Event/Value/Test/TestDoxBuilder.php deleted file mode 100644 index e591979..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/Test/TestDoxBuilder.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Code; - -use PHPUnit\Event\TestData\MoreThanOneDataSetFromDataProviderException; -use PHPUnit\Framework\TestCase; -use PHPUnit\Logging\TestDox\NamePrettifier; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestDoxBuilder -{ - /** - * @throws MoreThanOneDataSetFromDataProviderException - */ - public static function fromTestCase(TestCase $testCase): TestDox - { - $prettifier = new NamePrettifier; - - return new TestDox( - $prettifier->prettifyTestClassName($testCase::class), - $prettifier->prettifyTestCase($testCase, false), - $prettifier->prettifyTestCase($testCase, true), - ); - } - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - */ - public static function fromClassNameAndMethodName(string $className, string $methodName): TestDox - { - $prettifier = new NamePrettifier; - - $prettifiedMethodName = $prettifier->prettifyTestMethodName($methodName); - - return new TestDox( - $prettifier->prettifyTestClassName($className), - $prettifiedMethodName, - $prettifiedMethodName, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/Test/TestMethod.php b/vendor/phpunit/phpunit/src/Event/Value/Test/TestMethod.php deleted file mode 100644 index 4033089..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/Test/TestMethod.php +++ /dev/null @@ -1,155 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Code; - -use function assert; -use function is_int; -use function sprintf; -use PHPUnit\Event\TestData\TestDataCollection; -use PHPUnit\Metadata\MetadataCollection; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class TestMethod extends Test -{ - /** - * @psalm-var class-string - */ - private readonly string $className; - - /** - * @psalm-var non-empty-string - */ - private readonly string $methodName; - - /** - * @psalm-var non-negative-int - */ - private readonly int $line; - private readonly TestDox $testDox; - private readonly MetadataCollection $metadata; - private readonly TestDataCollection $testData; - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - * @psalm-param non-empty-string $file - * @psalm-param non-negative-int $line - */ - public function __construct(string $className, string $methodName, string $file, int $line, TestDox $testDox, MetadataCollection $metadata, TestDataCollection $testData) - { - parent::__construct($file); - - $this->className = $className; - $this->methodName = $methodName; - $this->line = $line; - $this->testDox = $testDox; - $this->metadata = $metadata; - $this->testData = $testData; - } - - /** - * @psalm-return class-string - */ - public function className(): string - { - return $this->className; - } - - /** - * @psalm-return non-empty-string - */ - public function methodName(): string - { - return $this->methodName; - } - - /** - * @psalm-return non-negative-int - */ - public function line(): int - { - return $this->line; - } - - public function testDox(): TestDox - { - return $this->testDox; - } - - public function metadata(): MetadataCollection - { - return $this->metadata; - } - - public function testData(): TestDataCollection - { - return $this->testData; - } - - /** - * @psalm-assert-if-true TestMethod $this - */ - public function isTestMethod(): bool - { - return true; - } - - /** - * @psalm-return non-empty-string - */ - public function id(): string - { - $buffer = $this->className . '::' . $this->methodName; - - if ($this->testData()->hasDataFromDataProvider()) { - $buffer .= '#' . $this->testData->dataFromDataProvider()->dataSetName(); - } - - return $buffer; - } - - /** - * @psalm-return non-empty-string - */ - public function nameWithClass(): string - { - return $this->className . '::' . $this->name(); - } - - /** - * @psalm-return non-empty-string - */ - public function name(): string - { - if (!$this->testData->hasDataFromDataProvider()) { - return $this->methodName; - } - - $dataSetName = $this->testData->dataFromDataProvider()->dataSetName(); - - if (is_int($dataSetName)) { - $dataSetName = sprintf( - ' with data set #%d', - $dataSetName, - ); - } else { - $dataSetName = sprintf( - ' with data set "%s"', - $dataSetName, - ); - } - - return $this->methodName . $dataSetName; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/Test/TestMethodBuilder.php b/vendor/phpunit/phpunit/src/Event/Value/Test/TestMethodBuilder.php deleted file mode 100644 index 25ccf02..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/Test/TestMethodBuilder.php +++ /dev/null @@ -1,99 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Code; - -use const DEBUG_BACKTRACE_IGNORE_ARGS; -use const DEBUG_BACKTRACE_PROVIDE_OBJECT; -use function assert; -use function debug_backtrace; -use function is_numeric; -use PHPUnit\Event\Facade as EventFacade; -use PHPUnit\Event\TestData\DataFromDataProvider; -use PHPUnit\Event\TestData\DataFromTestDependency; -use PHPUnit\Event\TestData\MoreThanOneDataSetFromDataProviderException; -use PHPUnit\Event\TestData\TestDataCollection; -use PHPUnit\Framework\TestCase; -use PHPUnit\Metadata\Parser\Registry as MetadataRegistry; -use PHPUnit\Util\Exporter; -use PHPUnit\Util\Reflection; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestMethodBuilder -{ - /** - * @throws MoreThanOneDataSetFromDataProviderException - */ - public static function fromTestCase(TestCase $testCase): TestMethod - { - $methodName = $testCase->name(); - - assert(!empty($methodName)); - - $location = Reflection::sourceLocationFor($testCase::class, $methodName); - - return new TestMethod( - $testCase::class, - $methodName, - $location['file'], - $location['line'], - TestDoxBuilder::fromTestCase($testCase), - MetadataRegistry::parser()->forClassAndMethod($testCase::class, $methodName), - self::dataFor($testCase), - ); - } - - /** - * @throws NoTestCaseObjectOnCallStackException - */ - public static function fromCallStack(): TestMethod - { - foreach (debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT | DEBUG_BACKTRACE_IGNORE_ARGS) as $frame) { - if (isset($frame['object']) && $frame['object'] instanceof TestCase) { - return $frame['object']->valueObjectForEvents(); - } - } - - throw new NoTestCaseObjectOnCallStackException; - } - - /** - * @throws MoreThanOneDataSetFromDataProviderException - */ - private static function dataFor(TestCase $testCase): TestDataCollection - { - $testData = []; - - if ($testCase->usesDataProvider()) { - $dataSetName = $testCase->dataName(); - - if (is_numeric($dataSetName)) { - $dataSetName = (int) $dataSetName; - } - - $testData[] = DataFromDataProvider::from( - $dataSetName, - Exporter::export($testCase->providedData(), EventFacade::emitter()->exportsObjects()), - $testCase->dataSetAsStringWithData(), - ); - } - - if ($testCase->hasDependencyInput()) { - $testData[] = DataFromTestDependency::from( - Exporter::export($testCase->dependencyInput(), EventFacade::emitter()->exportsObjects()), - ); - } - - return TestDataCollection::fromArray($testData); - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/TestSuite/TestSuite.php b/vendor/phpunit/phpunit/src/Event/Value/TestSuite/TestSuite.php deleted file mode 100644 index 744f709..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/TestSuite/TestSuite.php +++ /dev/null @@ -1,79 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestSuite; - -use PHPUnit\Event\Code\TestCollection; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -abstract class TestSuite -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $name; - private readonly int $count; - private readonly TestCollection $tests; - - /** - * @psalm-param non-empty-string $name - */ - public function __construct(string $name, int $size, TestCollection $tests) - { - $this->name = $name; - $this->count = $size; - $this->tests = $tests; - } - - /** - * @psalm-return non-empty-string - */ - public function name(): string - { - return $this->name; - } - - public function count(): int - { - return $this->count; - } - - public function tests(): TestCollection - { - return $this->tests; - } - - /** - * @psalm-assert-if-true TestSuiteWithName $this - */ - public function isWithName(): bool - { - return false; - } - - /** - * @psalm-assert-if-true TestSuiteForTestClass $this - */ - public function isForTestClass(): bool - { - return false; - } - - /** - * @psalm-assert-if-true TestSuiteForTestMethodWithDataProvider $this - */ - public function isForTestMethodWithDataProvider(): bool - { - return false; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteBuilder.php b/vendor/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteBuilder.php deleted file mode 100644 index 96a2937..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteBuilder.php +++ /dev/null @@ -1,112 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestSuite; - -use function explode; -use PHPUnit\Event\Code\Test; -use PHPUnit\Event\Code\TestCollection; -use PHPUnit\Event\RuntimeException; -use PHPUnit\Framework\DataProviderTestSuite; -use PHPUnit\Framework\TestCase; -use PHPUnit\Framework\TestSuite as FrameworkTestSuite; -use PHPUnit\Runner\PhptTestCase; -use ReflectionClass; -use ReflectionException; -use ReflectionMethod; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestSuiteBuilder -{ - /** - * @throws RuntimeException - */ - public static function from(FrameworkTestSuite $testSuite): TestSuite - { - $tests = []; - - self::process($testSuite, $tests); - - if ($testSuite instanceof DataProviderTestSuite) { - [$className, $methodName] = explode('::', $testSuite->name()); - - try { - $reflector = new ReflectionMethod($className, $methodName); - - return new TestSuiteForTestMethodWithDataProvider( - $testSuite->name(), - $testSuite->count(), - TestCollection::fromArray($tests), - $className, - $methodName, - $reflector->getFileName(), - $reflector->getStartLine(), - ); - // @codeCoverageIgnoreStart - } catch (ReflectionException $e) { - throw new RuntimeException( - $e->getMessage(), - $e->getCode(), - $e, - ); - } - // @codeCoverageIgnoreEnd - } - - if ($testSuite->isForTestClass()) { - try { - $reflector = new ReflectionClass($testSuite->name()); - - return new TestSuiteForTestClass( - $testSuite->name(), - $testSuite->count(), - TestCollection::fromArray($tests), - $reflector->getFileName(), - $reflector->getStartLine(), - ); - // @codeCoverageIgnoreStart - } catch (ReflectionException $e) { - throw new RuntimeException( - $e->getMessage(), - $e->getCode(), - $e, - ); - } - // @codeCoverageIgnoreEnd - } - - return new TestSuiteWithName( - $testSuite->name(), - $testSuite->count(), - TestCollection::fromArray($tests), - ); - } - - /** - * @psalm-param list $tests - */ - private static function process(FrameworkTestSuite $testSuite, array &$tests): void - { - foreach ($testSuite->getIterator() as $test) { - if ($test instanceof FrameworkTestSuite) { - self::process($test, $tests); - - continue; - } - - if ($test instanceof TestCase || $test instanceof PhptTestCase) { - $tests[] = $test->valueObjectForEvents(); - } - } - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteForTestClass.php b/vendor/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteForTestClass.php deleted file mode 100644 index fcfc9d0..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteForTestClass.php +++ /dev/null @@ -1,65 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestSuite; - -use PHPUnit\Event\Code\TestCollection; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class TestSuiteForTestClass extends TestSuite -{ - /** - * @psalm-var class-string - */ - private readonly string $className; - private readonly string $file; - private readonly int $line; - - /** - * @psalm-param class-string $name - */ - public function __construct(string $name, int $size, TestCollection $tests, string $file, int $line) - { - parent::__construct($name, $size, $tests); - - $this->className = $name; - $this->file = $file; - $this->line = $line; - } - - /** - * @psalm-return class-string - */ - public function className(): string - { - return $this->className; - } - - public function file(): string - { - return $this->file; - } - - public function line(): int - { - return $this->line; - } - - /** - * @psalm-assert-if-true TestSuiteForTestClass $this - */ - public function isForTestClass(): bool - { - return true; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteForTestMethodWithDataProvider.php b/vendor/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteForTestMethodWithDataProvider.php deleted file mode 100644 index 29bebc6..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteForTestMethodWithDataProvider.php +++ /dev/null @@ -1,81 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestSuite; - -use PHPUnit\Event\Code\TestCollection; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class TestSuiteForTestMethodWithDataProvider extends TestSuite -{ - /** - * @psalm-var class-string - */ - private readonly string $className; - - /** - * @psalm-var non-empty-string - */ - private readonly string $methodName; - private readonly string $file; - private readonly int $line; - - /** - * @psalm-param non-empty-string $name - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - */ - public function __construct(string $name, int $size, TestCollection $tests, string $className, string $methodName, string $file, int $line) - { - parent::__construct($name, $size, $tests); - - $this->className = $className; - $this->methodName = $methodName; - $this->file = $file; - $this->line = $line; - } - - /** - * @psalm-return class-string - */ - public function className(): string - { - return $this->className; - } - - /** - * @psalm-return non-empty-string - */ - public function methodName(): string - { - return $this->methodName; - } - - public function file(): string - { - return $this->file; - } - - public function line(): int - { - return $this->line; - } - - /** - * @psalm-assert-if-true TestSuiteForTestMethodWithDataProvider $this - */ - public function isForTestMethodWithDataProvider(): bool - { - return true; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteWithName.php b/vendor/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteWithName.php deleted file mode 100644 index 68c2f70..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteWithName.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\TestSuite; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class TestSuiteWithName extends TestSuite -{ - /** - * @psalm-assert-if-true TestSuiteWithName $this - */ - public function isWithName(): bool - { - return true; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/Throwable.php b/vendor/phpunit/phpunit/src/Event/Value/Throwable.php deleted file mode 100644 index f94a8a2..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/Throwable.php +++ /dev/null @@ -1,103 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Code; - -use const PHP_EOL; -use PHPUnit\Event\NoPreviousThrowableException; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class Throwable -{ - /** - * @psalm-var class-string - */ - private readonly string $className; - private readonly string $message; - private readonly string $description; - private readonly string $stackTrace; - private readonly ?Throwable $previous; - - /** - * @psalm-param class-string $className - */ - public function __construct(string $className, string $message, string $description, string $stackTrace, ?self $previous) - { - $this->className = $className; - $this->message = $message; - $this->description = $description; - $this->stackTrace = $stackTrace; - $this->previous = $previous; - } - - /** - * @throws NoPreviousThrowableException - */ - public function asString(): string - { - $buffer = $this->description(); - - if (!empty($this->stackTrace())) { - $buffer .= PHP_EOL . $this->stackTrace(); - } - - if ($this->hasPrevious()) { - $buffer .= PHP_EOL . 'Caused by' . PHP_EOL . $this->previous()->asString(); - } - - return $buffer; - } - - /** - * @psalm-return class-string - */ - public function className(): string - { - return $this->className; - } - - public function message(): string - { - return $this->message; - } - - public function description(): string - { - return $this->description; - } - - public function stackTrace(): string - { - return $this->stackTrace; - } - - /** - * @psalm-assert-if-true !null $this->previous - */ - public function hasPrevious(): bool - { - return $this->previous !== null; - } - - /** - * @throws NoPreviousThrowableException - */ - public function previous(): self - { - if ($this->previous === null) { - throw new NoPreviousThrowableException; - } - - return $this->previous; - } -} diff --git a/vendor/phpunit/phpunit/src/Event/Value/ThrowableBuilder.php b/vendor/phpunit/phpunit/src/Event/Value/ThrowableBuilder.php deleted file mode 100644 index 4c12b6e..0000000 --- a/vendor/phpunit/phpunit/src/Event/Value/ThrowableBuilder.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Event\Code; - -use PHPUnit\Event\NoPreviousThrowableException; -use PHPUnit\Framework\Exception; -use PHPUnit\Util\Filter; -use PHPUnit\Util\ThrowableToStringMapper; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ThrowableBuilder -{ - /** - * @throws Exception - * @throws NoPreviousThrowableException - */ - public static function from(\Throwable $t): Throwable - { - $previous = $t->getPrevious(); - - if ($previous !== null) { - $previous = self::from($previous); - } - - return new Throwable( - $t::class, - $t->getMessage(), - ThrowableToStringMapper::map($t), - Filter::getFilteredStacktrace($t, false), - $previous, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Exception.php b/vendor/phpunit/phpunit/src/Exception.php deleted file mode 100644 index 21721b7..0000000 --- a/vendor/phpunit/phpunit/src/Exception.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit; - -use Throwable; - -interface Exception extends Throwable -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Assert.php b/vendor/phpunit/phpunit/src/Framework/Assert.php deleted file mode 100644 index f89bded..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Assert.php +++ /dev/null @@ -1,2332 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -use function class_exists; -use function count; -use function file_get_contents; -use function interface_exists; -use function is_bool; -use ArrayAccess; -use Countable; -use Generator; -use PHPUnit\Event; -use PHPUnit\Framework\Constraint\ArrayHasKey; -use PHPUnit\Framework\Constraint\Callback; -use PHPUnit\Framework\Constraint\Constraint; -use PHPUnit\Framework\Constraint\Count; -use PHPUnit\Framework\Constraint\DirectoryExists; -use PHPUnit\Framework\Constraint\FileExists; -use PHPUnit\Framework\Constraint\GreaterThan; -use PHPUnit\Framework\Constraint\IsAnything; -use PHPUnit\Framework\Constraint\IsEmpty; -use PHPUnit\Framework\Constraint\IsEqual; -use PHPUnit\Framework\Constraint\IsEqualCanonicalizing; -use PHPUnit\Framework\Constraint\IsEqualIgnoringCase; -use PHPUnit\Framework\Constraint\IsEqualWithDelta; -use PHPUnit\Framework\Constraint\IsFalse; -use PHPUnit\Framework\Constraint\IsFinite; -use PHPUnit\Framework\Constraint\IsIdentical; -use PHPUnit\Framework\Constraint\IsInfinite; -use PHPUnit\Framework\Constraint\IsInstanceOf; -use PHPUnit\Framework\Constraint\IsJson; -use PHPUnit\Framework\Constraint\IsList; -use PHPUnit\Framework\Constraint\IsNan; -use PHPUnit\Framework\Constraint\IsNull; -use PHPUnit\Framework\Constraint\IsReadable; -use PHPUnit\Framework\Constraint\IsTrue; -use PHPUnit\Framework\Constraint\IsType; -use PHPUnit\Framework\Constraint\IsWritable; -use PHPUnit\Framework\Constraint\JsonMatches; -use PHPUnit\Framework\Constraint\LessThan; -use PHPUnit\Framework\Constraint\LogicalAnd; -use PHPUnit\Framework\Constraint\LogicalNot; -use PHPUnit\Framework\Constraint\LogicalOr; -use PHPUnit\Framework\Constraint\LogicalXor; -use PHPUnit\Framework\Constraint\ObjectEquals; -use PHPUnit\Framework\Constraint\ObjectHasProperty; -use PHPUnit\Framework\Constraint\RegularExpression; -use PHPUnit\Framework\Constraint\SameSize; -use PHPUnit\Framework\Constraint\StringContains; -use PHPUnit\Framework\Constraint\StringEndsWith; -use PHPUnit\Framework\Constraint\StringEqualsStringIgnoringLineEndings; -use PHPUnit\Framework\Constraint\StringMatchesFormatDescription; -use PHPUnit\Framework\Constraint\StringStartsWith; -use PHPUnit\Framework\Constraint\TraversableContainsEqual; -use PHPUnit\Framework\Constraint\TraversableContainsIdentical; -use PHPUnit\Framework\Constraint\TraversableContainsOnly; -use PHPUnit\Util\Xml\Loader as XmlLoader; -use PHPUnit\Util\Xml\XmlException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -abstract class Assert -{ - private static int $count = 0; - - /** - * Asserts that an array has a specified key. - * - * @throws Exception - * @throws ExpectationFailedException - */ - final public static function assertArrayHasKey(mixed $key, array|ArrayAccess $array, string $message = ''): void - { - $constraint = new ArrayHasKey($key); - - static::assertThat($array, $constraint, $message); - } - - /** - * Asserts that an array does not have a specified key. - * - * @throws Exception - * @throws ExpectationFailedException - */ - final public static function assertArrayNotHasKey(mixed $key, array|ArrayAccess $array, string $message = ''): void - { - $constraint = new LogicalNot( - new ArrayHasKey($key), - ); - - static::assertThat($array, $constraint, $message); - } - - /** - * @throws ExpectationFailedException - */ - final public static function assertIsList(mixed $array, string $message = ''): void - { - static::assertThat( - $array, - new IsList, - $message, - ); - } - - /** - * Asserts that a haystack contains a needle. - * - * @throws Exception - * @throws ExpectationFailedException - */ - final public static function assertContains(mixed $needle, iterable $haystack, string $message = ''): void - { - $constraint = new TraversableContainsIdentical($needle); - - static::assertThat($haystack, $constraint, $message); - } - - /** - * @throws ExpectationFailedException - */ - final public static function assertContainsEquals(mixed $needle, iterable $haystack, string $message = ''): void - { - $constraint = new TraversableContainsEqual($needle); - - static::assertThat($haystack, $constraint, $message); - } - - /** - * Asserts that a haystack does not contain a needle. - * - * @throws Exception - * @throws ExpectationFailedException - */ - final public static function assertNotContains(mixed $needle, iterable $haystack, string $message = ''): void - { - $constraint = new LogicalNot( - new TraversableContainsIdentical($needle), - ); - - static::assertThat($haystack, $constraint, $message); - } - - /** - * @throws ExpectationFailedException - */ - final public static function assertNotContainsEquals(mixed $needle, iterable $haystack, string $message = ''): void - { - $constraint = new LogicalNot(new TraversableContainsEqual($needle)); - - static::assertThat($haystack, $constraint, $message); - } - - /** - * Asserts that a haystack contains only values of a given type. - * - * @throws Exception - * @throws ExpectationFailedException - */ - final public static function assertContainsOnly(string $type, iterable $haystack, ?bool $isNativeType = null, string $message = ''): void - { - if ($isNativeType === null) { - $isNativeType = self::isNativeType($type); - } - - static::assertThat( - $haystack, - new TraversableContainsOnly( - $type, - $isNativeType, - ), - $message, - ); - } - - /** - * Asserts that a haystack contains only instances of a given class name. - * - * @throws Exception - * @throws ExpectationFailedException - */ - final public static function assertContainsOnlyInstancesOf(string $className, iterable $haystack, string $message = ''): void - { - static::assertThat( - $haystack, - new TraversableContainsOnly( - $className, - false, - ), - $message, - ); - } - - /** - * Asserts that a haystack does not contain only values of a given type. - * - * @throws Exception - * @throws ExpectationFailedException - */ - final public static function assertNotContainsOnly(string $type, iterable $haystack, ?bool $isNativeType = null, string $message = ''): void - { - if ($isNativeType === null) { - $isNativeType = self::isNativeType($type); - } - - static::assertThat( - $haystack, - new LogicalNot( - new TraversableContainsOnly( - $type, - $isNativeType, - ), - ), - $message, - ); - } - - /** - * Asserts the number of elements of an array, Countable or Traversable. - * - * @throws Exception - * @throws ExpectationFailedException - * @throws GeneratorNotSupportedException - */ - final public static function assertCount(int $expectedCount, Countable|iterable $haystack, string $message = ''): void - { - if ($haystack instanceof Generator) { - throw GeneratorNotSupportedException::fromParameterName('$haystack'); - } - - static::assertThat( - $haystack, - new Count($expectedCount), - $message, - ); - } - - /** - * Asserts the number of elements of an array, Countable or Traversable. - * - * @throws Exception - * @throws ExpectationFailedException - * @throws GeneratorNotSupportedException - */ - final public static function assertNotCount(int $expectedCount, Countable|iterable $haystack, string $message = ''): void - { - if ($haystack instanceof Generator) { - throw GeneratorNotSupportedException::fromParameterName('$haystack'); - } - - $constraint = new LogicalNot( - new Count($expectedCount), - ); - - static::assertThat($haystack, $constraint, $message); - } - - /** - * Asserts that two variables are equal. - * - * @throws ExpectationFailedException - */ - final public static function assertEquals(mixed $expected, mixed $actual, string $message = ''): void - { - $constraint = new IsEqual($expected); - - static::assertThat($actual, $constraint, $message); - } - - /** - * Asserts that two variables are equal (canonicalizing). - * - * @throws ExpectationFailedException - */ - final public static function assertEqualsCanonicalizing(mixed $expected, mixed $actual, string $message = ''): void - { - $constraint = new IsEqualCanonicalizing($expected); - - static::assertThat($actual, $constraint, $message); - } - - /** - * Asserts that two variables are equal (ignoring case). - * - * @throws ExpectationFailedException - */ - final public static function assertEqualsIgnoringCase(mixed $expected, mixed $actual, string $message = ''): void - { - $constraint = new IsEqualIgnoringCase($expected); - - static::assertThat($actual, $constraint, $message); - } - - /** - * Asserts that two variables are equal (with delta). - * - * @throws ExpectationFailedException - */ - final public static function assertEqualsWithDelta(mixed $expected, mixed $actual, float $delta, string $message = ''): void - { - $constraint = new IsEqualWithDelta( - $expected, - $delta, - ); - - static::assertThat($actual, $constraint, $message); - } - - /** - * Asserts that two variables are not equal. - * - * @throws ExpectationFailedException - */ - final public static function assertNotEquals(mixed $expected, mixed $actual, string $message = ''): void - { - $constraint = new LogicalNot( - new IsEqual($expected), - ); - - static::assertThat($actual, $constraint, $message); - } - - /** - * Asserts that two variables are not equal (canonicalizing). - * - * @throws ExpectationFailedException - */ - final public static function assertNotEqualsCanonicalizing(mixed $expected, mixed $actual, string $message = ''): void - { - $constraint = new LogicalNot( - new IsEqualCanonicalizing($expected), - ); - - static::assertThat($actual, $constraint, $message); - } - - /** - * Asserts that two variables are not equal (ignoring case). - * - * @throws ExpectationFailedException - */ - final public static function assertNotEqualsIgnoringCase(mixed $expected, mixed $actual, string $message = ''): void - { - $constraint = new LogicalNot( - new IsEqualIgnoringCase($expected), - ); - - static::assertThat($actual, $constraint, $message); - } - - /** - * Asserts that two variables are not equal (with delta). - * - * @throws ExpectationFailedException - */ - final public static function assertNotEqualsWithDelta(mixed $expected, mixed $actual, float $delta, string $message = ''): void - { - $constraint = new LogicalNot( - new IsEqualWithDelta( - $expected, - $delta, - ), - ); - - static::assertThat($actual, $constraint, $message); - } - - /** - * @throws ExpectationFailedException - */ - final public static function assertObjectEquals(object $expected, object $actual, string $method = 'equals', string $message = ''): void - { - static::assertThat( - $actual, - static::objectEquals($expected, $method), - $message, - ); - } - - /** - * Asserts that a variable is empty. - * - * @throws ExpectationFailedException - * @throws GeneratorNotSupportedException - * - * @psalm-assert empty $actual - */ - final public static function assertEmpty(mixed $actual, string $message = ''): void - { - if ($actual instanceof Generator) { - throw GeneratorNotSupportedException::fromParameterName('$actual'); - } - - static::assertThat($actual, static::isEmpty(), $message); - } - - /** - * Asserts that a variable is not empty. - * - * @throws ExpectationFailedException - * @throws GeneratorNotSupportedException - * - * @psalm-assert !empty $actual - */ - final public static function assertNotEmpty(mixed $actual, string $message = ''): void - { - if ($actual instanceof Generator) { - throw GeneratorNotSupportedException::fromParameterName('$actual'); - } - - static::assertThat($actual, static::logicalNot(static::isEmpty()), $message); - } - - /** - * Asserts that a value is greater than another value. - * - * @throws ExpectationFailedException - */ - final public static function assertGreaterThan(mixed $expected, mixed $actual, string $message = ''): void - { - static::assertThat($actual, static::greaterThan($expected), $message); - } - - /** - * Asserts that a value is greater than or equal to another value. - * - * @throws ExpectationFailedException - */ - final public static function assertGreaterThanOrEqual(mixed $expected, mixed $actual, string $message = ''): void - { - static::assertThat( - $actual, - static::greaterThanOrEqual($expected), - $message, - ); - } - - /** - * Asserts that a value is smaller than another value. - * - * @throws ExpectationFailedException - */ - final public static function assertLessThan(mixed $expected, mixed $actual, string $message = ''): void - { - static::assertThat($actual, static::lessThan($expected), $message); - } - - /** - * Asserts that a value is smaller than or equal to another value. - * - * @throws ExpectationFailedException - */ - final public static function assertLessThanOrEqual(mixed $expected, mixed $actual, string $message = ''): void - { - static::assertThat($actual, static::lessThanOrEqual($expected), $message); - } - - /** - * Asserts that the contents of one file is equal to the contents of another - * file. - * - * @throws ExpectationFailedException - */ - final public static function assertFileEquals(string $expected, string $actual, string $message = ''): void - { - static::assertFileExists($expected, $message); - static::assertFileExists($actual, $message); - - $constraint = new IsEqual(file_get_contents($expected)); - - static::assertThat(file_get_contents($actual), $constraint, $message); - } - - /** - * Asserts that the contents of one file is equal to the contents of another - * file (canonicalizing). - * - * @throws ExpectationFailedException - */ - final public static function assertFileEqualsCanonicalizing(string $expected, string $actual, string $message = ''): void - { - static::assertFileExists($expected, $message); - static::assertFileExists($actual, $message); - - $constraint = new IsEqualCanonicalizing( - file_get_contents($expected), - ); - - static::assertThat(file_get_contents($actual), $constraint, $message); - } - - /** - * Asserts that the contents of one file is equal to the contents of another - * file (ignoring case). - * - * @throws ExpectationFailedException - */ - final public static function assertFileEqualsIgnoringCase(string $expected, string $actual, string $message = ''): void - { - static::assertFileExists($expected, $message); - static::assertFileExists($actual, $message); - - $constraint = new IsEqualIgnoringCase(file_get_contents($expected)); - - static::assertThat(file_get_contents($actual), $constraint, $message); - } - - /** - * Asserts that the contents of one file is not equal to the contents of - * another file. - * - * @throws ExpectationFailedException - */ - final public static function assertFileNotEquals(string $expected, string $actual, string $message = ''): void - { - static::assertFileExists($expected, $message); - static::assertFileExists($actual, $message); - - $constraint = new LogicalNot( - new IsEqual(file_get_contents($expected)), - ); - - static::assertThat(file_get_contents($actual), $constraint, $message); - } - - /** - * Asserts that the contents of one file is not equal to the contents of another - * file (canonicalizing). - * - * @throws ExpectationFailedException - */ - final public static function assertFileNotEqualsCanonicalizing(string $expected, string $actual, string $message = ''): void - { - static::assertFileExists($expected, $message); - static::assertFileExists($actual, $message); - - $constraint = new LogicalNot( - new IsEqualCanonicalizing(file_get_contents($expected)), - ); - - static::assertThat(file_get_contents($actual), $constraint, $message); - } - - /** - * Asserts that the contents of one file is not equal to the contents of another - * file (ignoring case). - * - * @throws ExpectationFailedException - */ - final public static function assertFileNotEqualsIgnoringCase(string $expected, string $actual, string $message = ''): void - { - static::assertFileExists($expected, $message); - static::assertFileExists($actual, $message); - - $constraint = new LogicalNot( - new IsEqualIgnoringCase(file_get_contents($expected)), - ); - - static::assertThat(file_get_contents($actual), $constraint, $message); - } - - /** - * Asserts that the contents of a string is equal - * to the contents of a file. - * - * @throws ExpectationFailedException - */ - final public static function assertStringEqualsFile(string $expectedFile, string $actualString, string $message = ''): void - { - static::assertFileExists($expectedFile, $message); - - $constraint = new IsEqual(file_get_contents($expectedFile)); - - static::assertThat($actualString, $constraint, $message); - } - - /** - * Asserts that the contents of a string is equal - * to the contents of a file (canonicalizing). - * - * @throws ExpectationFailedException - */ - final public static function assertStringEqualsFileCanonicalizing(string $expectedFile, string $actualString, string $message = ''): void - { - static::assertFileExists($expectedFile, $message); - - $constraint = new IsEqualCanonicalizing(file_get_contents($expectedFile)); - - static::assertThat($actualString, $constraint, $message); - } - - /** - * Asserts that the contents of a string is equal - * to the contents of a file (ignoring case). - * - * @throws ExpectationFailedException - */ - final public static function assertStringEqualsFileIgnoringCase(string $expectedFile, string $actualString, string $message = ''): void - { - static::assertFileExists($expectedFile, $message); - - $constraint = new IsEqualIgnoringCase(file_get_contents($expectedFile)); - - static::assertThat($actualString, $constraint, $message); - } - - /** - * Asserts that the contents of a string is not equal - * to the contents of a file. - * - * @throws ExpectationFailedException - */ - final public static function assertStringNotEqualsFile(string $expectedFile, string $actualString, string $message = ''): void - { - static::assertFileExists($expectedFile, $message); - - $constraint = new LogicalNot( - new IsEqual(file_get_contents($expectedFile)), - ); - - static::assertThat($actualString, $constraint, $message); - } - - /** - * Asserts that the contents of a string is not equal - * to the contents of a file (canonicalizing). - * - * @throws ExpectationFailedException - */ - final public static function assertStringNotEqualsFileCanonicalizing(string $expectedFile, string $actualString, string $message = ''): void - { - static::assertFileExists($expectedFile, $message); - - $constraint = new LogicalNot( - new IsEqualCanonicalizing(file_get_contents($expectedFile)), - ); - - static::assertThat($actualString, $constraint, $message); - } - - /** - * Asserts that the contents of a string is not equal - * to the contents of a file (ignoring case). - * - * @throws ExpectationFailedException - */ - final public static function assertStringNotEqualsFileIgnoringCase(string $expectedFile, string $actualString, string $message = ''): void - { - static::assertFileExists($expectedFile, $message); - - $constraint = new LogicalNot( - new IsEqualIgnoringCase(file_get_contents($expectedFile)), - ); - - static::assertThat($actualString, $constraint, $message); - } - - /** - * Asserts that a file/dir is readable. - * - * @throws ExpectationFailedException - */ - final public static function assertIsReadable(string $filename, string $message = ''): void - { - static::assertThat($filename, new IsReadable, $message); - } - - /** - * Asserts that a file/dir exists and is not readable. - * - * @throws ExpectationFailedException - */ - final public static function assertIsNotReadable(string $filename, string $message = ''): void - { - static::assertThat($filename, new LogicalNot(new IsReadable), $message); - } - - /** - * Asserts that a file/dir exists and is writable. - * - * @throws ExpectationFailedException - */ - final public static function assertIsWritable(string $filename, string $message = ''): void - { - static::assertThat($filename, new IsWritable, $message); - } - - /** - * Asserts that a file/dir exists and is not writable. - * - * @throws ExpectationFailedException - */ - final public static function assertIsNotWritable(string $filename, string $message = ''): void - { - static::assertThat($filename, new LogicalNot(new IsWritable), $message); - } - - /** - * Asserts that a directory exists. - * - * @throws ExpectationFailedException - */ - final public static function assertDirectoryExists(string $directory, string $message = ''): void - { - static::assertThat($directory, new DirectoryExists, $message); - } - - /** - * Asserts that a directory does not exist. - * - * @throws ExpectationFailedException - */ - final public static function assertDirectoryDoesNotExist(string $directory, string $message = ''): void - { - static::assertThat($directory, new LogicalNot(new DirectoryExists), $message); - } - - /** - * Asserts that a directory exists and is readable. - * - * @throws ExpectationFailedException - */ - final public static function assertDirectoryIsReadable(string $directory, string $message = ''): void - { - self::assertDirectoryExists($directory, $message); - self::assertIsReadable($directory, $message); - } - - /** - * Asserts that a directory exists and is not readable. - * - * @throws ExpectationFailedException - */ - final public static function assertDirectoryIsNotReadable(string $directory, string $message = ''): void - { - self::assertDirectoryExists($directory, $message); - self::assertIsNotReadable($directory, $message); - } - - /** - * Asserts that a directory exists and is writable. - * - * @throws ExpectationFailedException - */ - final public static function assertDirectoryIsWritable(string $directory, string $message = ''): void - { - self::assertDirectoryExists($directory, $message); - self::assertIsWritable($directory, $message); - } - - /** - * Asserts that a directory exists and is not writable. - * - * @throws ExpectationFailedException - */ - final public static function assertDirectoryIsNotWritable(string $directory, string $message = ''): void - { - self::assertDirectoryExists($directory, $message); - self::assertIsNotWritable($directory, $message); - } - - /** - * Asserts that a file exists. - * - * @throws ExpectationFailedException - */ - final public static function assertFileExists(string $filename, string $message = ''): void - { - static::assertThat($filename, new FileExists, $message); - } - - /** - * Asserts that a file does not exist. - * - * @throws ExpectationFailedException - */ - final public static function assertFileDoesNotExist(string $filename, string $message = ''): void - { - static::assertThat($filename, new LogicalNot(new FileExists), $message); - } - - /** - * Asserts that a file exists and is readable. - * - * @throws ExpectationFailedException - */ - final public static function assertFileIsReadable(string $file, string $message = ''): void - { - self::assertFileExists($file, $message); - self::assertIsReadable($file, $message); - } - - /** - * Asserts that a file exists and is not readable. - * - * @throws ExpectationFailedException - */ - final public static function assertFileIsNotReadable(string $file, string $message = ''): void - { - self::assertFileExists($file, $message); - self::assertIsNotReadable($file, $message); - } - - /** - * Asserts that a file exists and is writable. - * - * @throws ExpectationFailedException - */ - final public static function assertFileIsWritable(string $file, string $message = ''): void - { - self::assertFileExists($file, $message); - self::assertIsWritable($file, $message); - } - - /** - * Asserts that a file exists and is not writable. - * - * @throws ExpectationFailedException - */ - final public static function assertFileIsNotWritable(string $file, string $message = ''): void - { - self::assertFileExists($file, $message); - self::assertIsNotWritable($file, $message); - } - - /** - * Asserts that a condition is true. - * - * @throws ExpectationFailedException - * - * @psalm-assert true $condition - */ - final public static function assertTrue(mixed $condition, string $message = ''): void - { - static::assertThat($condition, static::isTrue(), $message); - } - - /** - * Asserts that a condition is not true. - * - * @throws ExpectationFailedException - * - * @psalm-assert !true $condition - */ - final public static function assertNotTrue(mixed $condition, string $message = ''): void - { - static::assertThat($condition, static::logicalNot(static::isTrue()), $message); - } - - /** - * Asserts that a condition is false. - * - * @throws ExpectationFailedException - * - * @psalm-assert false $condition - */ - final public static function assertFalse(mixed $condition, string $message = ''): void - { - static::assertThat($condition, static::isFalse(), $message); - } - - /** - * Asserts that a condition is not false. - * - * @throws ExpectationFailedException - * - * @psalm-assert !false $condition - */ - final public static function assertNotFalse(mixed $condition, string $message = ''): void - { - static::assertThat($condition, static::logicalNot(static::isFalse()), $message); - } - - /** - * Asserts that a variable is null. - * - * @throws ExpectationFailedException - * - * @psalm-assert null $actual - */ - final public static function assertNull(mixed $actual, string $message = ''): void - { - static::assertThat($actual, static::isNull(), $message); - } - - /** - * Asserts that a variable is not null. - * - * @throws ExpectationFailedException - * - * @psalm-assert !null $actual - */ - final public static function assertNotNull(mixed $actual, string $message = ''): void - { - static::assertThat($actual, static::logicalNot(static::isNull()), $message); - } - - /** - * Asserts that a variable is finite. - * - * @throws ExpectationFailedException - */ - final public static function assertFinite(mixed $actual, string $message = ''): void - { - static::assertThat($actual, static::isFinite(), $message); - } - - /** - * Asserts that a variable is infinite. - * - * @throws ExpectationFailedException - */ - final public static function assertInfinite(mixed $actual, string $message = ''): void - { - static::assertThat($actual, static::isInfinite(), $message); - } - - /** - * Asserts that a variable is nan. - * - * @throws ExpectationFailedException - */ - final public static function assertNan(mixed $actual, string $message = ''): void - { - static::assertThat($actual, static::isNan(), $message); - } - - /** - * Asserts that an object has a specified property. - * - * @throws ExpectationFailedException - */ - final public static function assertObjectHasProperty(string $propertyName, object $object, string $message = ''): void - { - static::assertThat( - $object, - new ObjectHasProperty($propertyName), - $message, - ); - } - - /** - * Asserts that an object does not have a specified property. - * - * @throws ExpectationFailedException - */ - final public static function assertObjectNotHasProperty(string $propertyName, object $object, string $message = ''): void - { - static::assertThat( - $object, - new LogicalNot( - new ObjectHasProperty($propertyName), - ), - $message, - ); - } - - /** - * Asserts that two variables have the same type and value. - * Used on objects, it asserts that two variables reference - * the same object. - * - * @psalm-template ExpectedType - * - * @psalm-param ExpectedType $expected - * - * @throws ExpectationFailedException - * - * @psalm-assert =ExpectedType $actual - */ - final public static function assertSame(mixed $expected, mixed $actual, string $message = ''): void - { - static::assertThat( - $actual, - new IsIdentical($expected), - $message, - ); - } - - /** - * Asserts that two variables do not have the same type and value. - * Used on objects, it asserts that two variables do not reference - * the same object. - * - * @throws ExpectationFailedException - */ - final public static function assertNotSame(mixed $expected, mixed $actual, string $message = ''): void - { - if (is_bool($expected) && is_bool($actual)) { - static::assertNotEquals($expected, $actual, $message); - } - - static::assertThat( - $actual, - new LogicalNot( - new IsIdentical($expected), - ), - $message, - ); - } - - /** - * Asserts that a variable is of a given type. - * - * @psalm-template ExpectedType of object - * - * @psalm-param class-string $expected - * - * @throws Exception - * @throws ExpectationFailedException - * @throws UnknownClassOrInterfaceException - * - * @psalm-assert =ExpectedType $actual - */ - final public static function assertInstanceOf(string $expected, mixed $actual, string $message = ''): void - { - if (!class_exists($expected) && !interface_exists($expected)) { - throw new UnknownClassOrInterfaceException($expected); - } - - static::assertThat( - $actual, - new IsInstanceOf($expected), - $message, - ); - } - - /** - * Asserts that a variable is not of a given type. - * - * @psalm-template ExpectedType of object - * - * @psalm-param class-string $expected - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert !ExpectedType $actual - */ - final public static function assertNotInstanceOf(string $expected, mixed $actual, string $message = ''): void - { - if (!class_exists($expected) && !interface_exists($expected)) { - throw new UnknownClassOrInterfaceException($expected); - } - - static::assertThat( - $actual, - new LogicalNot( - new IsInstanceOf($expected), - ), - $message, - ); - } - - /** - * Asserts that a variable is of type array. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert array $actual - */ - final public static function assertIsArray(mixed $actual, string $message = ''): void - { - static::assertThat( - $actual, - new IsType(IsType::TYPE_ARRAY), - $message, - ); - } - - /** - * Asserts that a variable is of type bool. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert bool $actual - */ - final public static function assertIsBool(mixed $actual, string $message = ''): void - { - static::assertThat( - $actual, - new IsType(IsType::TYPE_BOOL), - $message, - ); - } - - /** - * Asserts that a variable is of type float. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert float $actual - */ - final public static function assertIsFloat(mixed $actual, string $message = ''): void - { - static::assertThat( - $actual, - new IsType(IsType::TYPE_FLOAT), - $message, - ); - } - - /** - * Asserts that a variable is of type int. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert int $actual - */ - final public static function assertIsInt(mixed $actual, string $message = ''): void - { - static::assertThat( - $actual, - new IsType(IsType::TYPE_INT), - $message, - ); - } - - /** - * Asserts that a variable is of type numeric. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert numeric $actual - */ - final public static function assertIsNumeric(mixed $actual, string $message = ''): void - { - static::assertThat( - $actual, - new IsType(IsType::TYPE_NUMERIC), - $message, - ); - } - - /** - * Asserts that a variable is of type object. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert object $actual - */ - final public static function assertIsObject(mixed $actual, string $message = ''): void - { - static::assertThat( - $actual, - new IsType(IsType::TYPE_OBJECT), - $message, - ); - } - - /** - * Asserts that a variable is of type resource. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert resource $actual - */ - final public static function assertIsResource(mixed $actual, string $message = ''): void - { - static::assertThat( - $actual, - new IsType(IsType::TYPE_RESOURCE), - $message, - ); - } - - /** - * Asserts that a variable is of type resource and is closed. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert resource $actual - */ - final public static function assertIsClosedResource(mixed $actual, string $message = ''): void - { - static::assertThat( - $actual, - new IsType(IsType::TYPE_CLOSED_RESOURCE), - $message, - ); - } - - /** - * Asserts that a variable is of type string. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert string $actual - */ - final public static function assertIsString(mixed $actual, string $message = ''): void - { - static::assertThat( - $actual, - new IsType(IsType::TYPE_STRING), - $message, - ); - } - - /** - * Asserts that a variable is of type scalar. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert scalar $actual - */ - final public static function assertIsScalar(mixed $actual, string $message = ''): void - { - static::assertThat( - $actual, - new IsType(IsType::TYPE_SCALAR), - $message, - ); - } - - /** - * Asserts that a variable is of type callable. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert callable $actual - */ - final public static function assertIsCallable(mixed $actual, string $message = ''): void - { - static::assertThat( - $actual, - new IsType(IsType::TYPE_CALLABLE), - $message, - ); - } - - /** - * Asserts that a variable is of type iterable. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert iterable $actual - */ - final public static function assertIsIterable(mixed $actual, string $message = ''): void - { - static::assertThat( - $actual, - new IsType(IsType::TYPE_ITERABLE), - $message, - ); - } - - /** - * Asserts that a variable is not of type array. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert !array $actual - */ - final public static function assertIsNotArray(mixed $actual, string $message = ''): void - { - static::assertThat( - $actual, - new LogicalNot(new IsType(IsType::TYPE_ARRAY)), - $message, - ); - } - - /** - * Asserts that a variable is not of type bool. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert !bool $actual - */ - final public static function assertIsNotBool(mixed $actual, string $message = ''): void - { - static::assertThat( - $actual, - new LogicalNot(new IsType(IsType::TYPE_BOOL)), - $message, - ); - } - - /** - * Asserts that a variable is not of type float. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert !float $actual - */ - final public static function assertIsNotFloat(mixed $actual, string $message = ''): void - { - static::assertThat( - $actual, - new LogicalNot(new IsType(IsType::TYPE_FLOAT)), - $message, - ); - } - - /** - * Asserts that a variable is not of type int. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert !int $actual - */ - final public static function assertIsNotInt(mixed $actual, string $message = ''): void - { - static::assertThat( - $actual, - new LogicalNot(new IsType(IsType::TYPE_INT)), - $message, - ); - } - - /** - * Asserts that a variable is not of type numeric. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert !numeric $actual - */ - final public static function assertIsNotNumeric(mixed $actual, string $message = ''): void - { - static::assertThat( - $actual, - new LogicalNot(new IsType(IsType::TYPE_NUMERIC)), - $message, - ); - } - - /** - * Asserts that a variable is not of type object. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert !object $actual - */ - final public static function assertIsNotObject(mixed $actual, string $message = ''): void - { - static::assertThat( - $actual, - new LogicalNot(new IsType(IsType::TYPE_OBJECT)), - $message, - ); - } - - /** - * Asserts that a variable is not of type resource. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert !resource $actual - */ - final public static function assertIsNotResource(mixed $actual, string $message = ''): void - { - static::assertThat( - $actual, - new LogicalNot(new IsType(IsType::TYPE_RESOURCE)), - $message, - ); - } - - /** - * Asserts that a variable is not of type resource. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert !resource $actual - */ - final public static function assertIsNotClosedResource(mixed $actual, string $message = ''): void - { - static::assertThat( - $actual, - new LogicalNot(new IsType(IsType::TYPE_CLOSED_RESOURCE)), - $message, - ); - } - - /** - * Asserts that a variable is not of type string. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert !string $actual - */ - final public static function assertIsNotString(mixed $actual, string $message = ''): void - { - static::assertThat( - $actual, - new LogicalNot(new IsType(IsType::TYPE_STRING)), - $message, - ); - } - - /** - * Asserts that a variable is not of type scalar. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert !scalar $actual - */ - final public static function assertIsNotScalar(mixed $actual, string $message = ''): void - { - static::assertThat( - $actual, - new LogicalNot(new IsType(IsType::TYPE_SCALAR)), - $message, - ); - } - - /** - * Asserts that a variable is not of type callable. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert !callable $actual - */ - final public static function assertIsNotCallable(mixed $actual, string $message = ''): void - { - static::assertThat( - $actual, - new LogicalNot(new IsType(IsType::TYPE_CALLABLE)), - $message, - ); - } - - /** - * Asserts that a variable is not of type iterable. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert !iterable $actual - */ - final public static function assertIsNotIterable(mixed $actual, string $message = ''): void - { - static::assertThat( - $actual, - new LogicalNot(new IsType(IsType::TYPE_ITERABLE)), - $message, - ); - } - - /** - * Asserts that a string matches a given regular expression. - * - * @throws ExpectationFailedException - */ - final public static function assertMatchesRegularExpression(string $pattern, string $string, string $message = ''): void - { - static::assertThat($string, new RegularExpression($pattern), $message); - } - - /** - * Asserts that a string does not match a given regular expression. - * - * @throws ExpectationFailedException - */ - final public static function assertDoesNotMatchRegularExpression(string $pattern, string $string, string $message = ''): void - { - static::assertThat( - $string, - new LogicalNot( - new RegularExpression($pattern), - ), - $message, - ); - } - - /** - * Assert that the size of two arrays (or `Countable` or `Traversable` objects) - * is the same. - * - * @throws Exception - * @throws ExpectationFailedException - * @throws GeneratorNotSupportedException - */ - final public static function assertSameSize(Countable|iterable $expected, Countable|iterable $actual, string $message = ''): void - { - if ($expected instanceof Generator) { - throw GeneratorNotSupportedException::fromParameterName('$expected'); - } - - if ($actual instanceof Generator) { - throw GeneratorNotSupportedException::fromParameterName('$actual'); - } - - static::assertThat( - $actual, - new SameSize($expected), - $message, - ); - } - - /** - * Assert that the size of two arrays (or `Countable` or `Traversable` objects) - * is not the same. - * - * @throws Exception - * @throws ExpectationFailedException - * @throws GeneratorNotSupportedException - */ - final public static function assertNotSameSize(Countable|iterable $expected, Countable|iterable $actual, string $message = ''): void - { - if ($expected instanceof Generator) { - throw GeneratorNotSupportedException::fromParameterName('$expected'); - } - - if ($actual instanceof Generator) { - throw GeneratorNotSupportedException::fromParameterName('$actual'); - } - - static::assertThat( - $actual, - new LogicalNot( - new SameSize($expected), - ), - $message, - ); - } - - /** - * @throws ExpectationFailedException - */ - final public static function assertStringContainsStringIgnoringLineEndings(string $needle, string $haystack, string $message = ''): void - { - static::assertThat($haystack, new StringContains($needle, false, true), $message); - } - - /** - * Asserts that two strings are equal except for line endings. - * - * @throws ExpectationFailedException - */ - final public static function assertStringEqualsStringIgnoringLineEndings(string $expected, string $actual, string $message = ''): void - { - static::assertThat($actual, new StringEqualsStringIgnoringLineEndings($expected), $message); - } - - /** - * Asserts that a string matches a given format string. - * - * @throws ExpectationFailedException - */ - final public static function assertFileMatchesFormat(string $format, string $actualFile, string $message = ''): void - { - static::assertFileExists($actualFile, $message); - - static::assertThat( - file_get_contents($actualFile), - new StringMatchesFormatDescription($format), - $message, - ); - } - - /** - * Asserts that a string matches a given format string. - * - * @throws ExpectationFailedException - */ - final public static function assertFileMatchesFormatFile(string $formatFile, string $actualFile, string $message = ''): void - { - static::assertFileExists($formatFile, $message); - static::assertFileExists($actualFile, $message); - - static::assertThat( - file_get_contents($actualFile), - new StringMatchesFormatDescription(file_get_contents($formatFile)), - $message, - ); - } - - /** - * Asserts that a string matches a given format string. - * - * @throws ExpectationFailedException - */ - final public static function assertStringMatchesFormat(string $format, string $string, string $message = ''): void - { - static::assertThat($string, new StringMatchesFormatDescription($format), $message); - } - - /** - * Asserts that a string does not match a given format string. - * - * @throws ExpectationFailedException - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5472 - */ - final public static function assertStringNotMatchesFormat(string $format, string $string, string $message = ''): void - { - static::assertThat( - $string, - new LogicalNot( - new StringMatchesFormatDescription($format), - ), - $message, - ); - } - - /** - * Asserts that a string matches a given format file. - * - * @throws ExpectationFailedException - */ - final public static function assertStringMatchesFormatFile(string $formatFile, string $string, string $message = ''): void - { - static::assertFileExists($formatFile, $message); - - static::assertThat( - $string, - new StringMatchesFormatDescription( - file_get_contents($formatFile), - ), - $message, - ); - } - - /** - * Asserts that a string does not match a given format string. - * - * @throws ExpectationFailedException - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5472 - */ - final public static function assertStringNotMatchesFormatFile(string $formatFile, string $string, string $message = ''): void - { - static::assertFileExists($formatFile, $message); - - static::assertThat( - $string, - new LogicalNot( - new StringMatchesFormatDescription( - file_get_contents($formatFile), - ), - ), - $message, - ); - } - - /** - * Asserts that a string starts with a given prefix. - * - * @psalm-param non-empty-string $prefix - * - * @throws ExpectationFailedException - * @throws InvalidArgumentException - */ - final public static function assertStringStartsWith(string $prefix, string $string, string $message = ''): void - { - static::assertThat($string, new StringStartsWith($prefix), $message); - } - - /** - * Asserts that a string starts not with a given prefix. - * - * @psalm-param non-empty-string $prefix - * - * @throws ExpectationFailedException - * @throws InvalidArgumentException - */ - final public static function assertStringStartsNotWith(string $prefix, string $string, string $message = ''): void - { - static::assertThat( - $string, - new LogicalNot( - new StringStartsWith($prefix), - ), - $message, - ); - } - - /** - * @throws ExpectationFailedException - */ - final public static function assertStringContainsString(string $needle, string $haystack, string $message = ''): void - { - $constraint = new StringContains($needle); - - static::assertThat($haystack, $constraint, $message); - } - - /** - * @throws ExpectationFailedException - */ - final public static function assertStringContainsStringIgnoringCase(string $needle, string $haystack, string $message = ''): void - { - $constraint = new StringContains($needle, true); - - static::assertThat($haystack, $constraint, $message); - } - - /** - * @throws ExpectationFailedException - */ - final public static function assertStringNotContainsString(string $needle, string $haystack, string $message = ''): void - { - $constraint = new LogicalNot(new StringContains($needle)); - - static::assertThat($haystack, $constraint, $message); - } - - /** - * @throws ExpectationFailedException - */ - final public static function assertStringNotContainsStringIgnoringCase(string $needle, string $haystack, string $message = ''): void - { - $constraint = new LogicalNot(new StringContains($needle, true)); - - static::assertThat($haystack, $constraint, $message); - } - - /** - * Asserts that a string ends with a given suffix. - * - * @psalm-param non-empty-string $suffix - * - * @throws ExpectationFailedException - * @throws InvalidArgumentException - */ - final public static function assertStringEndsWith(string $suffix, string $string, string $message = ''): void - { - static::assertThat($string, new StringEndsWith($suffix), $message); - } - - /** - * Asserts that a string ends not with a given suffix. - * - * @psalm-param non-empty-string $suffix - * - * @throws ExpectationFailedException - * @throws InvalidArgumentException - */ - final public static function assertStringEndsNotWith(string $suffix, string $string, string $message = ''): void - { - static::assertThat( - $string, - new LogicalNot( - new StringEndsWith($suffix), - ), - $message, - ); - } - - /** - * Asserts that two XML files are equal. - * - * @throws Exception - * @throws ExpectationFailedException - * @throws XmlException - */ - final public static function assertXmlFileEqualsXmlFile(string $expectedFile, string $actualFile, string $message = ''): void - { - $expected = (new XmlLoader)->loadFile($expectedFile); - $actual = (new XmlLoader)->loadFile($actualFile); - - static::assertEquals($expected, $actual, $message); - } - - /** - * Asserts that two XML files are not equal. - * - * @throws \PHPUnit\Util\Exception - * @throws ExpectationFailedException - */ - final public static function assertXmlFileNotEqualsXmlFile(string $expectedFile, string $actualFile, string $message = ''): void - { - $expected = (new XmlLoader)->loadFile($expectedFile); - $actual = (new XmlLoader)->loadFile($actualFile); - - static::assertNotEquals($expected, $actual, $message); - } - - /** - * Asserts that two XML documents are equal. - * - * @throws ExpectationFailedException - * @throws XmlException - */ - final public static function assertXmlStringEqualsXmlFile(string $expectedFile, string $actualXml, string $message = ''): void - { - $expected = (new XmlLoader)->loadFile($expectedFile); - $actual = (new XmlLoader)->load($actualXml); - - static::assertEquals($expected, $actual, $message); - } - - /** - * Asserts that two XML documents are not equal. - * - * @throws ExpectationFailedException - * @throws XmlException - */ - final public static function assertXmlStringNotEqualsXmlFile(string $expectedFile, string $actualXml, string $message = ''): void - { - $expected = (new XmlLoader)->loadFile($expectedFile); - $actual = (new XmlLoader)->load($actualXml); - - static::assertNotEquals($expected, $actual, $message); - } - - /** - * Asserts that two XML documents are equal. - * - * @throws ExpectationFailedException - * @throws XmlException - */ - final public static function assertXmlStringEqualsXmlString(string $expectedXml, string $actualXml, string $message = ''): void - { - $expected = (new XmlLoader)->load($expectedXml); - $actual = (new XmlLoader)->load($actualXml); - - static::assertEquals($expected, $actual, $message); - } - - /** - * Asserts that two XML documents are not equal. - * - * @throws ExpectationFailedException - * @throws XmlException - */ - final public static function assertXmlStringNotEqualsXmlString(string $expectedXml, string $actualXml, string $message = ''): void - { - $expected = (new XmlLoader)->load($expectedXml); - $actual = (new XmlLoader)->load($actualXml); - - static::assertNotEquals($expected, $actual, $message); - } - - /** - * Evaluates a PHPUnit\Framework\Constraint matcher object. - * - * @throws ExpectationFailedException - */ - final public static function assertThat(mixed $value, Constraint $constraint, string $message = ''): void - { - self::$count += count($constraint); - - $hasFailed = true; - - try { - $constraint->evaluate($value, $message); - - $hasFailed = false; - } finally { - if ($hasFailed) { - Event\Facade::emitter()->testAssertionFailed( - $value, - $constraint, - $message, - ); - } else { - Event\Facade::emitter()->testAssertionSucceeded( - $value, - $constraint, - $message, - ); - } - } - } - - /** - * Asserts that a string is a valid JSON string. - * - * @throws ExpectationFailedException - */ - final public static function assertJson(string $actual, string $message = ''): void - { - static::assertThat($actual, static::isJson(), $message); - } - - /** - * Asserts that two given JSON encoded objects or arrays are equal. - * - * @throws ExpectationFailedException - */ - final public static function assertJsonStringEqualsJsonString(string $expectedJson, string $actualJson, string $message = ''): void - { - static::assertJson($expectedJson, $message); - static::assertJson($actualJson, $message); - - static::assertThat($actualJson, new JsonMatches($expectedJson), $message); - } - - /** - * Asserts that two given JSON encoded objects or arrays are not equal. - * - * @throws ExpectationFailedException - */ - final public static function assertJsonStringNotEqualsJsonString(string $expectedJson, string $actualJson, string $message = ''): void - { - static::assertJson($expectedJson, $message); - static::assertJson($actualJson, $message); - - static::assertThat( - $actualJson, - new LogicalNot( - new JsonMatches($expectedJson), - ), - $message, - ); - } - - /** - * Asserts that the generated JSON encoded object and the content of the given file are equal. - * - * @throws ExpectationFailedException - */ - final public static function assertJsonStringEqualsJsonFile(string $expectedFile, string $actualJson, string $message = ''): void - { - static::assertFileExists($expectedFile, $message); - $expectedJson = file_get_contents($expectedFile); - - static::assertJson($expectedJson, $message); - static::assertJson($actualJson, $message); - - static::assertThat($actualJson, new JsonMatches($expectedJson), $message); - } - - /** - * Asserts that the generated JSON encoded object and the content of the given file are not equal. - * - * @throws ExpectationFailedException - */ - final public static function assertJsonStringNotEqualsJsonFile(string $expectedFile, string $actualJson, string $message = ''): void - { - static::assertFileExists($expectedFile, $message); - $expectedJson = file_get_contents($expectedFile); - - static::assertJson($expectedJson, $message); - static::assertJson($actualJson, $message); - - static::assertThat( - $actualJson, - new LogicalNot( - new JsonMatches($expectedJson), - ), - $message, - ); - } - - /** - * Asserts that two JSON files are equal. - * - * @throws ExpectationFailedException - */ - final public static function assertJsonFileEqualsJsonFile(string $expectedFile, string $actualFile, string $message = ''): void - { - static::assertFileExists($expectedFile, $message); - static::assertFileExists($actualFile, $message); - - $actualJson = file_get_contents($actualFile); - $expectedJson = file_get_contents($expectedFile); - - static::assertJson($expectedJson, $message); - static::assertJson($actualJson, $message); - - $constraintExpected = new JsonMatches( - $expectedJson, - ); - - $constraintActual = new JsonMatches($actualJson); - - static::assertThat($expectedJson, $constraintActual, $message); - static::assertThat($actualJson, $constraintExpected, $message); - } - - /** - * Asserts that two JSON files are not equal. - * - * @throws ExpectationFailedException - */ - final public static function assertJsonFileNotEqualsJsonFile(string $expectedFile, string $actualFile, string $message = ''): void - { - static::assertFileExists($expectedFile, $message); - static::assertFileExists($actualFile, $message); - - $actualJson = file_get_contents($actualFile); - $expectedJson = file_get_contents($expectedFile); - - static::assertJson($expectedJson, $message); - static::assertJson($actualJson, $message); - - $constraintExpected = new JsonMatches( - $expectedJson, - ); - - $constraintActual = new JsonMatches($actualJson); - - static::assertThat($expectedJson, new LogicalNot($constraintActual), $message); - static::assertThat($actualJson, new LogicalNot($constraintExpected), $message); - } - - /** - * @throws Exception - */ - final public static function logicalAnd(mixed ...$constraints): LogicalAnd - { - return LogicalAnd::fromConstraints(...$constraints); - } - - final public static function logicalOr(mixed ...$constraints): LogicalOr - { - return LogicalOr::fromConstraints(...$constraints); - } - - final public static function logicalNot(Constraint $constraint): LogicalNot - { - return new LogicalNot($constraint); - } - - final public static function logicalXor(mixed ...$constraints): LogicalXor - { - return LogicalXor::fromConstraints(...$constraints); - } - - final public static function anything(): IsAnything - { - return new IsAnything; - } - - final public static function isTrue(): IsTrue - { - return new IsTrue; - } - - /** - * @psalm-template CallbackInput of mixed - * - * @psalm-param callable(CallbackInput $callback): bool $callback - * - * @psalm-return Callback - */ - final public static function callback(callable $callback): Callback - { - return new Callback($callback); - } - - final public static function isFalse(): IsFalse - { - return new IsFalse; - } - - final public static function isJson(): IsJson - { - return new IsJson; - } - - final public static function isNull(): IsNull - { - return new IsNull; - } - - final public static function isFinite(): IsFinite - { - return new IsFinite; - } - - final public static function isInfinite(): IsInfinite - { - return new IsInfinite; - } - - final public static function isNan(): IsNan - { - return new IsNan; - } - - final public static function containsEqual(mixed $value): TraversableContainsEqual - { - return new TraversableContainsEqual($value); - } - - final public static function containsIdentical(mixed $value): TraversableContainsIdentical - { - return new TraversableContainsIdentical($value); - } - - /** - * @throws Exception - */ - final public static function containsOnly(string $type): TraversableContainsOnly - { - return new TraversableContainsOnly($type); - } - - /** - * @throws Exception - */ - final public static function containsOnlyInstancesOf(string $className): TraversableContainsOnly - { - return new TraversableContainsOnly($className, false); - } - - final public static function arrayHasKey(mixed $key): ArrayHasKey - { - return new ArrayHasKey($key); - } - - final public static function isList(): IsList - { - return new IsList; - } - - final public static function equalTo(mixed $value): IsEqual - { - return new IsEqual($value, 0.0, false, false); - } - - final public static function equalToCanonicalizing(mixed $value): IsEqualCanonicalizing - { - return new IsEqualCanonicalizing($value); - } - - final public static function equalToIgnoringCase(mixed $value): IsEqualIgnoringCase - { - return new IsEqualIgnoringCase($value); - } - - final public static function equalToWithDelta(mixed $value, float $delta): IsEqualWithDelta - { - return new IsEqualWithDelta($value, $delta); - } - - final public static function isEmpty(): IsEmpty - { - return new IsEmpty; - } - - final public static function isWritable(): IsWritable - { - return new IsWritable; - } - - final public static function isReadable(): IsReadable - { - return new IsReadable; - } - - final public static function directoryExists(): DirectoryExists - { - return new DirectoryExists; - } - - final public static function fileExists(): FileExists - { - return new FileExists; - } - - final public static function greaterThan(mixed $value): GreaterThan - { - return new GreaterThan($value); - } - - final public static function greaterThanOrEqual(mixed $value): LogicalOr - { - return static::logicalOr( - new IsEqual($value), - new GreaterThan($value), - ); - } - - final public static function identicalTo(mixed $value): IsIdentical - { - return new IsIdentical($value); - } - - /** - * @throws UnknownClassOrInterfaceException - */ - final public static function isInstanceOf(string $className): IsInstanceOf - { - return new IsInstanceOf($className); - } - - /** - * @psalm-param 'array'|'boolean'|'bool'|'double'|'float'|'integer'|'int'|'null'|'numeric'|'object'|'real'|'resource'|'resource (closed)'|'string'|'scalar'|'callable'|'iterable' $type - * - * @throws Exception - */ - final public static function isType(string $type): IsType - { - return new IsType($type); - } - - final public static function lessThan(mixed $value): LessThan - { - return new LessThan($value); - } - - final public static function lessThanOrEqual(mixed $value): LogicalOr - { - return static::logicalOr( - new IsEqual($value), - new LessThan($value), - ); - } - - final public static function matchesRegularExpression(string $pattern): RegularExpression - { - return new RegularExpression($pattern); - } - - final public static function matches(string $string): StringMatchesFormatDescription - { - return new StringMatchesFormatDescription($string); - } - - /** - * @psalm-param non-empty-string $prefix - * - * @throws InvalidArgumentException - */ - final public static function stringStartsWith(string $prefix): StringStartsWith - { - return new StringStartsWith($prefix); - } - - final public static function stringContains(string $string, bool $case = true): StringContains - { - return new StringContains($string, $case); - } - - /** - * @psalm-param non-empty-string $suffix - * - * @throws InvalidArgumentException - */ - final public static function stringEndsWith(string $suffix): StringEndsWith - { - return new StringEndsWith($suffix); - } - - final public static function stringEqualsStringIgnoringLineEndings(string $string): StringEqualsStringIgnoringLineEndings - { - return new StringEqualsStringIgnoringLineEndings($string); - } - - final public static function countOf(int $count): Count - { - return new Count($count); - } - - final public static function objectEquals(object $object, string $method = 'equals'): ObjectEquals - { - return new ObjectEquals($object, $method); - } - - /** - * Fails a test with the given message. - * - * @throws AssertionFailedError - */ - final public static function fail(string $message = ''): never - { - self::$count++; - - throw new AssertionFailedError($message); - } - - /** - * Mark the test as incomplete. - * - * @throws IncompleteTestError - */ - final public static function markTestIncomplete(string $message = ''): never - { - throw new IncompleteTestError($message); - } - - /** - * Mark the test as skipped. - * - * @throws SkippedWithMessageException - */ - final public static function markTestSkipped(string $message = ''): never - { - throw new SkippedWithMessageException($message); - } - - /** - * Return the current assertion count. - */ - final public static function getCount(): int - { - return self::$count; - } - - /** - * Reset the assertion counter. - */ - final public static function resetCount(): void - { - self::$count = 0; - } - - private static function isNativeType(string $type): bool - { - return match ($type) { - 'numeric', 'integer', 'int', 'iterable', 'float', 'string', 'boolean', 'bool', 'null', 'array', 'object', 'resource', 'scalar' => true, - default => false, - }; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Assert/Functions.php b/vendor/phpunit/phpunit/src/Framework/Assert/Functions.php deleted file mode 100644 index b686eab..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Assert/Functions.php +++ /dev/null @@ -1,2707 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -use function func_get_args; -use function function_exists; -use ArrayAccess; -use Countable; -use PHPUnit\Framework\Constraint\ArrayHasKey; -use PHPUnit\Framework\Constraint\Callback; -use PHPUnit\Framework\Constraint\Constraint; -use PHPUnit\Framework\Constraint\Count; -use PHPUnit\Framework\Constraint\DirectoryExists; -use PHPUnit\Framework\Constraint\FileExists; -use PHPUnit\Framework\Constraint\GreaterThan; -use PHPUnit\Framework\Constraint\IsAnything; -use PHPUnit\Framework\Constraint\IsEmpty; -use PHPUnit\Framework\Constraint\IsEqual; -use PHPUnit\Framework\Constraint\IsEqualCanonicalizing; -use PHPUnit\Framework\Constraint\IsEqualIgnoringCase; -use PHPUnit\Framework\Constraint\IsEqualWithDelta; -use PHPUnit\Framework\Constraint\IsFalse; -use PHPUnit\Framework\Constraint\IsFinite; -use PHPUnit\Framework\Constraint\IsIdentical; -use PHPUnit\Framework\Constraint\IsInfinite; -use PHPUnit\Framework\Constraint\IsInstanceOf; -use PHPUnit\Framework\Constraint\IsJson; -use PHPUnit\Framework\Constraint\IsList; -use PHPUnit\Framework\Constraint\IsNan; -use PHPUnit\Framework\Constraint\IsNull; -use PHPUnit\Framework\Constraint\IsReadable; -use PHPUnit\Framework\Constraint\IsTrue; -use PHPUnit\Framework\Constraint\IsType; -use PHPUnit\Framework\Constraint\IsWritable; -use PHPUnit\Framework\Constraint\LessThan; -use PHPUnit\Framework\Constraint\LogicalAnd; -use PHPUnit\Framework\Constraint\LogicalNot; -use PHPUnit\Framework\Constraint\LogicalOr; -use PHPUnit\Framework\Constraint\LogicalXor; -use PHPUnit\Framework\Constraint\ObjectEquals; -use PHPUnit\Framework\Constraint\RegularExpression; -use PHPUnit\Framework\Constraint\StringContains; -use PHPUnit\Framework\Constraint\StringEndsWith; -use PHPUnit\Framework\Constraint\StringEqualsStringIgnoringLineEndings; -use PHPUnit\Framework\Constraint\StringMatchesFormatDescription; -use PHPUnit\Framework\Constraint\StringStartsWith; -use PHPUnit\Framework\Constraint\TraversableContainsEqual; -use PHPUnit\Framework\Constraint\TraversableContainsIdentical; -use PHPUnit\Framework\Constraint\TraversableContainsOnly; -use PHPUnit\Framework\MockObject\Rule\AnyInvokedCount as AnyInvokedCountMatcher; -use PHPUnit\Framework\MockObject\Rule\InvokedAtLeastCount as InvokedAtLeastCountMatcher; -use PHPUnit\Framework\MockObject\Rule\InvokedAtLeastOnce as InvokedAtLeastOnceMatcher; -use PHPUnit\Framework\MockObject\Rule\InvokedAtMostCount as InvokedAtMostCountMatcher; -use PHPUnit\Framework\MockObject\Rule\InvokedCount as InvokedCountMatcher; -use PHPUnit\Framework\MockObject\Stub\ConsecutiveCalls as ConsecutiveCallsStub; -use PHPUnit\Framework\MockObject\Stub\Exception as ExceptionStub; -use PHPUnit\Framework\MockObject\Stub\ReturnArgument as ReturnArgumentStub; -use PHPUnit\Framework\MockObject\Stub\ReturnCallback as ReturnCallbackStub; -use PHPUnit\Framework\MockObject\Stub\ReturnSelf as ReturnSelfStub; -use PHPUnit\Framework\MockObject\Stub\ReturnStub; -use PHPUnit\Framework\MockObject\Stub\ReturnValueMap as ReturnValueMapStub; -use PHPUnit\Util\Xml\XmlException; -use Throwable; - -if (!function_exists('PHPUnit\Framework\assertArrayHasKey')) { - /** - * Asserts that an array has a specified key. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertArrayHasKey - */ - function assertArrayHasKey(mixed $key, array|ArrayAccess $array, string $message = ''): void - { - Assert::assertArrayHasKey(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertArrayNotHasKey')) { - /** - * Asserts that an array does not have a specified key. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertArrayNotHasKey - */ - function assertArrayNotHasKey(mixed $key, array|ArrayAccess $array, string $message = ''): void - { - Assert::assertArrayNotHasKey(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertIsList')) { - /** - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertIsList - */ - function assertIsList(mixed $array, string $message = ''): void - { - Assert::assertIsList(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertContains')) { - /** - * Asserts that a haystack contains a needle. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertContains - */ - function assertContains(mixed $needle, iterable $haystack, string $message = ''): void - { - Assert::assertContains(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertContainsEquals')) { - /** - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertContainsEquals - */ - function assertContainsEquals(mixed $needle, iterable $haystack, string $message = ''): void - { - Assert::assertContainsEquals(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertNotContains')) { - /** - * Asserts that a haystack does not contain a needle. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertNotContains - */ - function assertNotContains(mixed $needle, iterable $haystack, string $message = ''): void - { - Assert::assertNotContains(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertNotContainsEquals')) { - /** - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertNotContainsEquals - */ - function assertNotContainsEquals(mixed $needle, iterable $haystack, string $message = ''): void - { - Assert::assertNotContainsEquals(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertContainsOnly')) { - /** - * Asserts that a haystack contains only values of a given type. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertContainsOnly - */ - function assertContainsOnly(string $type, iterable $haystack, ?bool $isNativeType = null, string $message = ''): void - { - Assert::assertContainsOnly(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertContainsOnlyInstancesOf')) { - /** - * Asserts that a haystack contains only instances of a given class name. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertContainsOnlyInstancesOf - */ - function assertContainsOnlyInstancesOf(string $className, iterable $haystack, string $message = ''): void - { - Assert::assertContainsOnlyInstancesOf(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertNotContainsOnly')) { - /** - * Asserts that a haystack does not contain only values of a given type. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertNotContainsOnly - */ - function assertNotContainsOnly(string $type, iterable $haystack, ?bool $isNativeType = null, string $message = ''): void - { - Assert::assertNotContainsOnly(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertCount')) { - /** - * Asserts the number of elements of an array, Countable or Traversable. - * - * @throws Exception - * @throws ExpectationFailedException - * @throws GeneratorNotSupportedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertCount - */ - function assertCount(int $expectedCount, Countable|iterable $haystack, string $message = ''): void - { - Assert::assertCount(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertNotCount')) { - /** - * Asserts the number of elements of an array, Countable or Traversable. - * - * @throws Exception - * @throws ExpectationFailedException - * @throws GeneratorNotSupportedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertNotCount - */ - function assertNotCount(int $expectedCount, Countable|iterable $haystack, string $message = ''): void - { - Assert::assertNotCount(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertEquals')) { - /** - * Asserts that two variables are equal. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertEquals - */ - function assertEquals(mixed $expected, mixed $actual, string $message = ''): void - { - Assert::assertEquals(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertEqualsCanonicalizing')) { - /** - * Asserts that two variables are equal (canonicalizing). - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertEqualsCanonicalizing - */ - function assertEqualsCanonicalizing(mixed $expected, mixed $actual, string $message = ''): void - { - Assert::assertEqualsCanonicalizing(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertEqualsIgnoringCase')) { - /** - * Asserts that two variables are equal (ignoring case). - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertEqualsIgnoringCase - */ - function assertEqualsIgnoringCase(mixed $expected, mixed $actual, string $message = ''): void - { - Assert::assertEqualsIgnoringCase(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertEqualsWithDelta')) { - /** - * Asserts that two variables are equal (with delta). - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertEqualsWithDelta - */ - function assertEqualsWithDelta(mixed $expected, mixed $actual, float $delta, string $message = ''): void - { - Assert::assertEqualsWithDelta(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertNotEquals')) { - /** - * Asserts that two variables are not equal. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertNotEquals - */ - function assertNotEquals(mixed $expected, mixed $actual, string $message = ''): void - { - Assert::assertNotEquals(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertNotEqualsCanonicalizing')) { - /** - * Asserts that two variables are not equal (canonicalizing). - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertNotEqualsCanonicalizing - */ - function assertNotEqualsCanonicalizing(mixed $expected, mixed $actual, string $message = ''): void - { - Assert::assertNotEqualsCanonicalizing(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertNotEqualsIgnoringCase')) { - /** - * Asserts that two variables are not equal (ignoring case). - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertNotEqualsIgnoringCase - */ - function assertNotEqualsIgnoringCase(mixed $expected, mixed $actual, string $message = ''): void - { - Assert::assertNotEqualsIgnoringCase(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertNotEqualsWithDelta')) { - /** - * Asserts that two variables are not equal (with delta). - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertNotEqualsWithDelta - */ - function assertNotEqualsWithDelta(mixed $expected, mixed $actual, float $delta, string $message = ''): void - { - Assert::assertNotEqualsWithDelta(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertObjectEquals')) { - /** - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertObjectEquals - */ - function assertObjectEquals(object $expected, object $actual, string $method = 'equals', string $message = ''): void - { - Assert::assertObjectEquals(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertEmpty')) { - /** - * Asserts that a variable is empty. - * - * @throws ExpectationFailedException - * @throws GeneratorNotSupportedException - * - * @psalm-assert empty $actual - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertEmpty - */ - function assertEmpty(mixed $actual, string $message = ''): void - { - Assert::assertEmpty(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertNotEmpty')) { - /** - * Asserts that a variable is not empty. - * - * @throws ExpectationFailedException - * @throws GeneratorNotSupportedException - * - * @psalm-assert !empty $actual - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertNotEmpty - */ - function assertNotEmpty(mixed $actual, string $message = ''): void - { - Assert::assertNotEmpty(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertGreaterThan')) { - /** - * Asserts that a value is greater than another value. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertGreaterThan - */ - function assertGreaterThan(mixed $expected, mixed $actual, string $message = ''): void - { - Assert::assertGreaterThan(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertGreaterThanOrEqual')) { - /** - * Asserts that a value is greater than or equal to another value. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertGreaterThanOrEqual - */ - function assertGreaterThanOrEqual(mixed $expected, mixed $actual, string $message = ''): void - { - Assert::assertGreaterThanOrEqual(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertLessThan')) { - /** - * Asserts that a value is smaller than another value. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertLessThan - */ - function assertLessThan(mixed $expected, mixed $actual, string $message = ''): void - { - Assert::assertLessThan(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertLessThanOrEqual')) { - /** - * Asserts that a value is smaller than or equal to another value. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertLessThanOrEqual - */ - function assertLessThanOrEqual(mixed $expected, mixed $actual, string $message = ''): void - { - Assert::assertLessThanOrEqual(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertFileEquals')) { - /** - * Asserts that the contents of one file is equal to the contents of another - * file. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertFileEquals - */ - function assertFileEquals(string $expected, string $actual, string $message = ''): void - { - Assert::assertFileEquals(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertFileEqualsCanonicalizing')) { - /** - * Asserts that the contents of one file is equal to the contents of another - * file (canonicalizing). - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertFileEqualsCanonicalizing - */ - function assertFileEqualsCanonicalizing(string $expected, string $actual, string $message = ''): void - { - Assert::assertFileEqualsCanonicalizing(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertFileEqualsIgnoringCase')) { - /** - * Asserts that the contents of one file is equal to the contents of another - * file (ignoring case). - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertFileEqualsIgnoringCase - */ - function assertFileEqualsIgnoringCase(string $expected, string $actual, string $message = ''): void - { - Assert::assertFileEqualsIgnoringCase(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertFileNotEquals')) { - /** - * Asserts that the contents of one file is not equal to the contents of - * another file. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertFileNotEquals - */ - function assertFileNotEquals(string $expected, string $actual, string $message = ''): void - { - Assert::assertFileNotEquals(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertFileNotEqualsCanonicalizing')) { - /** - * Asserts that the contents of one file is not equal to the contents of another - * file (canonicalizing). - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertFileNotEqualsCanonicalizing - */ - function assertFileNotEqualsCanonicalizing(string $expected, string $actual, string $message = ''): void - { - Assert::assertFileNotEqualsCanonicalizing(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertFileNotEqualsIgnoringCase')) { - /** - * Asserts that the contents of one file is not equal to the contents of another - * file (ignoring case). - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertFileNotEqualsIgnoringCase - */ - function assertFileNotEqualsIgnoringCase(string $expected, string $actual, string $message = ''): void - { - Assert::assertFileNotEqualsIgnoringCase(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertStringEqualsFile')) { - /** - * Asserts that the contents of a string is equal - * to the contents of a file. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertStringEqualsFile - */ - function assertStringEqualsFile(string $expectedFile, string $actualString, string $message = ''): void - { - Assert::assertStringEqualsFile(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertStringEqualsFileCanonicalizing')) { - /** - * Asserts that the contents of a string is equal - * to the contents of a file (canonicalizing). - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertStringEqualsFileCanonicalizing - */ - function assertStringEqualsFileCanonicalizing(string $expectedFile, string $actualString, string $message = ''): void - { - Assert::assertStringEqualsFileCanonicalizing(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertStringEqualsFileIgnoringCase')) { - /** - * Asserts that the contents of a string is equal - * to the contents of a file (ignoring case). - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertStringEqualsFileIgnoringCase - */ - function assertStringEqualsFileIgnoringCase(string $expectedFile, string $actualString, string $message = ''): void - { - Assert::assertStringEqualsFileIgnoringCase(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertStringNotEqualsFile')) { - /** - * Asserts that the contents of a string is not equal - * to the contents of a file. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertStringNotEqualsFile - */ - function assertStringNotEqualsFile(string $expectedFile, string $actualString, string $message = ''): void - { - Assert::assertStringNotEqualsFile(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertStringNotEqualsFileCanonicalizing')) { - /** - * Asserts that the contents of a string is not equal - * to the contents of a file (canonicalizing). - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertStringNotEqualsFileCanonicalizing - */ - function assertStringNotEqualsFileCanonicalizing(string $expectedFile, string $actualString, string $message = ''): void - { - Assert::assertStringNotEqualsFileCanonicalizing(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertStringNotEqualsFileIgnoringCase')) { - /** - * Asserts that the contents of a string is not equal - * to the contents of a file (ignoring case). - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertStringNotEqualsFileIgnoringCase - */ - function assertStringNotEqualsFileIgnoringCase(string $expectedFile, string $actualString, string $message = ''): void - { - Assert::assertStringNotEqualsFileIgnoringCase(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertIsReadable')) { - /** - * Asserts that a file/dir is readable. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertIsReadable - */ - function assertIsReadable(string $filename, string $message = ''): void - { - Assert::assertIsReadable(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertIsNotReadable')) { - /** - * Asserts that a file/dir exists and is not readable. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertIsNotReadable - */ - function assertIsNotReadable(string $filename, string $message = ''): void - { - Assert::assertIsNotReadable(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertIsWritable')) { - /** - * Asserts that a file/dir exists and is writable. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertIsWritable - */ - function assertIsWritable(string $filename, string $message = ''): void - { - Assert::assertIsWritable(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertIsNotWritable')) { - /** - * Asserts that a file/dir exists and is not writable. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertIsNotWritable - */ - function assertIsNotWritable(string $filename, string $message = ''): void - { - Assert::assertIsNotWritable(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertDirectoryExists')) { - /** - * Asserts that a directory exists. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertDirectoryExists - */ - function assertDirectoryExists(string $directory, string $message = ''): void - { - Assert::assertDirectoryExists(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertDirectoryDoesNotExist')) { - /** - * Asserts that a directory does not exist. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertDirectoryDoesNotExist - */ - function assertDirectoryDoesNotExist(string $directory, string $message = ''): void - { - Assert::assertDirectoryDoesNotExist(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertDirectoryIsReadable')) { - /** - * Asserts that a directory exists and is readable. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertDirectoryIsReadable - */ - function assertDirectoryIsReadable(string $directory, string $message = ''): void - { - Assert::assertDirectoryIsReadable(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertDirectoryIsNotReadable')) { - /** - * Asserts that a directory exists and is not readable. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertDirectoryIsNotReadable - */ - function assertDirectoryIsNotReadable(string $directory, string $message = ''): void - { - Assert::assertDirectoryIsNotReadable(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertDirectoryIsWritable')) { - /** - * Asserts that a directory exists and is writable. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertDirectoryIsWritable - */ - function assertDirectoryIsWritable(string $directory, string $message = ''): void - { - Assert::assertDirectoryIsWritable(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertDirectoryIsNotWritable')) { - /** - * Asserts that a directory exists and is not writable. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertDirectoryIsNotWritable - */ - function assertDirectoryIsNotWritable(string $directory, string $message = ''): void - { - Assert::assertDirectoryIsNotWritable(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertFileExists')) { - /** - * Asserts that a file exists. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertFileExists - */ - function assertFileExists(string $filename, string $message = ''): void - { - Assert::assertFileExists(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertFileDoesNotExist')) { - /** - * Asserts that a file does not exist. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertFileDoesNotExist - */ - function assertFileDoesNotExist(string $filename, string $message = ''): void - { - Assert::assertFileDoesNotExist(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertFileIsReadable')) { - /** - * Asserts that a file exists and is readable. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertFileIsReadable - */ - function assertFileIsReadable(string $file, string $message = ''): void - { - Assert::assertFileIsReadable(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertFileIsNotReadable')) { - /** - * Asserts that a file exists and is not readable. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertFileIsNotReadable - */ - function assertFileIsNotReadable(string $file, string $message = ''): void - { - Assert::assertFileIsNotReadable(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertFileIsWritable')) { - /** - * Asserts that a file exists and is writable. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertFileIsWritable - */ - function assertFileIsWritable(string $file, string $message = ''): void - { - Assert::assertFileIsWritable(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertFileIsNotWritable')) { - /** - * Asserts that a file exists and is not writable. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertFileIsNotWritable - */ - function assertFileIsNotWritable(string $file, string $message = ''): void - { - Assert::assertFileIsNotWritable(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertTrue')) { - /** - * Asserts that a condition is true. - * - * @throws ExpectationFailedException - * - * @psalm-assert true $condition - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertTrue - */ - function assertTrue(mixed $condition, string $message = ''): void - { - Assert::assertTrue(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertNotTrue')) { - /** - * Asserts that a condition is not true. - * - * @throws ExpectationFailedException - * - * @psalm-assert !true $condition - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertNotTrue - */ - function assertNotTrue(mixed $condition, string $message = ''): void - { - Assert::assertNotTrue(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertFalse')) { - /** - * Asserts that a condition is false. - * - * @throws ExpectationFailedException - * - * @psalm-assert false $condition - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertFalse - */ - function assertFalse(mixed $condition, string $message = ''): void - { - Assert::assertFalse(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertNotFalse')) { - /** - * Asserts that a condition is not false. - * - * @throws ExpectationFailedException - * - * @psalm-assert !false $condition - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertNotFalse - */ - function assertNotFalse(mixed $condition, string $message = ''): void - { - Assert::assertNotFalse(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertNull')) { - /** - * Asserts that a variable is null. - * - * @throws ExpectationFailedException - * - * @psalm-assert null $actual - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertNull - */ - function assertNull(mixed $actual, string $message = ''): void - { - Assert::assertNull(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertNotNull')) { - /** - * Asserts that a variable is not null. - * - * @throws ExpectationFailedException - * - * @psalm-assert !null $actual - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertNotNull - */ - function assertNotNull(mixed $actual, string $message = ''): void - { - Assert::assertNotNull(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertFinite')) { - /** - * Asserts that a variable is finite. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertFinite - */ - function assertFinite(mixed $actual, string $message = ''): void - { - Assert::assertFinite(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertInfinite')) { - /** - * Asserts that a variable is infinite. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertInfinite - */ - function assertInfinite(mixed $actual, string $message = ''): void - { - Assert::assertInfinite(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertNan')) { - /** - * Asserts that a variable is nan. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertNan - */ - function assertNan(mixed $actual, string $message = ''): void - { - Assert::assertNan(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertObjectHasProperty')) { - /** - * Asserts that an object has a specified property. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertObjectHasProperty - */ - function assertObjectHasProperty(string $propertyName, object $object, string $message = ''): void - { - Assert::assertObjectHasProperty(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertObjectNotHasProperty')) { - /** - * Asserts that an object does not have a specified property. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertObjectNotHasProperty - */ - function assertObjectNotHasProperty(string $propertyName, object $object, string $message = ''): void - { - Assert::assertObjectNotHasProperty(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertSame')) { - /** - * Asserts that two variables have the same type and value. - * Used on objects, it asserts that two variables reference - * the same object. - * - * @psalm-template ExpectedType - * - * @psalm-param ExpectedType $expected - * - * @throws ExpectationFailedException - * - * @psalm-assert =ExpectedType $actual - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertSame - */ - function assertSame(mixed $expected, mixed $actual, string $message = ''): void - { - Assert::assertSame(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertNotSame')) { - /** - * Asserts that two variables do not have the same type and value. - * Used on objects, it asserts that two variables do not reference - * the same object. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertNotSame - */ - function assertNotSame(mixed $expected, mixed $actual, string $message = ''): void - { - Assert::assertNotSame(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertInstanceOf')) { - /** - * Asserts that a variable is of a given type. - * - * @psalm-template ExpectedType of object - * - * @psalm-param class-string $expected - * - * @throws Exception - * @throws ExpectationFailedException - * @throws UnknownClassOrInterfaceException - * - * @psalm-assert =ExpectedType $actual - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertInstanceOf - */ - function assertInstanceOf(string $expected, mixed $actual, string $message = ''): void - { - Assert::assertInstanceOf(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertNotInstanceOf')) { - /** - * Asserts that a variable is not of a given type. - * - * @psalm-template ExpectedType of object - * - * @psalm-param class-string $expected - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert !ExpectedType $actual - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertNotInstanceOf - */ - function assertNotInstanceOf(string $expected, mixed $actual, string $message = ''): void - { - Assert::assertNotInstanceOf(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertIsArray')) { - /** - * Asserts that a variable is of type array. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert array $actual - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertIsArray - */ - function assertIsArray(mixed $actual, string $message = ''): void - { - Assert::assertIsArray(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertIsBool')) { - /** - * Asserts that a variable is of type bool. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert bool $actual - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertIsBool - */ - function assertIsBool(mixed $actual, string $message = ''): void - { - Assert::assertIsBool(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertIsFloat')) { - /** - * Asserts that a variable is of type float. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert float $actual - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertIsFloat - */ - function assertIsFloat(mixed $actual, string $message = ''): void - { - Assert::assertIsFloat(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertIsInt')) { - /** - * Asserts that a variable is of type int. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert int $actual - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertIsInt - */ - function assertIsInt(mixed $actual, string $message = ''): void - { - Assert::assertIsInt(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertIsNumeric')) { - /** - * Asserts that a variable is of type numeric. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert numeric $actual - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertIsNumeric - */ - function assertIsNumeric(mixed $actual, string $message = ''): void - { - Assert::assertIsNumeric(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertIsObject')) { - /** - * Asserts that a variable is of type object. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert object $actual - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertIsObject - */ - function assertIsObject(mixed $actual, string $message = ''): void - { - Assert::assertIsObject(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertIsResource')) { - /** - * Asserts that a variable is of type resource. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert resource $actual - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertIsResource - */ - function assertIsResource(mixed $actual, string $message = ''): void - { - Assert::assertIsResource(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertIsClosedResource')) { - /** - * Asserts that a variable is of type resource and is closed. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert resource $actual - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertIsClosedResource - */ - function assertIsClosedResource(mixed $actual, string $message = ''): void - { - Assert::assertIsClosedResource(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertIsString')) { - /** - * Asserts that a variable is of type string. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert string $actual - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertIsString - */ - function assertIsString(mixed $actual, string $message = ''): void - { - Assert::assertIsString(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertIsScalar')) { - /** - * Asserts that a variable is of type scalar. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert scalar $actual - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertIsScalar - */ - function assertIsScalar(mixed $actual, string $message = ''): void - { - Assert::assertIsScalar(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertIsCallable')) { - /** - * Asserts that a variable is of type callable. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert callable $actual - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertIsCallable - */ - function assertIsCallable(mixed $actual, string $message = ''): void - { - Assert::assertIsCallable(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertIsIterable')) { - /** - * Asserts that a variable is of type iterable. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert iterable $actual - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertIsIterable - */ - function assertIsIterable(mixed $actual, string $message = ''): void - { - Assert::assertIsIterable(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertIsNotArray')) { - /** - * Asserts that a variable is not of type array. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert !array $actual - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertIsNotArray - */ - function assertIsNotArray(mixed $actual, string $message = ''): void - { - Assert::assertIsNotArray(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertIsNotBool')) { - /** - * Asserts that a variable is not of type bool. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert !bool $actual - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertIsNotBool - */ - function assertIsNotBool(mixed $actual, string $message = ''): void - { - Assert::assertIsNotBool(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertIsNotFloat')) { - /** - * Asserts that a variable is not of type float. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert !float $actual - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertIsNotFloat - */ - function assertIsNotFloat(mixed $actual, string $message = ''): void - { - Assert::assertIsNotFloat(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertIsNotInt')) { - /** - * Asserts that a variable is not of type int. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert !int $actual - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertIsNotInt - */ - function assertIsNotInt(mixed $actual, string $message = ''): void - { - Assert::assertIsNotInt(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertIsNotNumeric')) { - /** - * Asserts that a variable is not of type numeric. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert !numeric $actual - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertIsNotNumeric - */ - function assertIsNotNumeric(mixed $actual, string $message = ''): void - { - Assert::assertIsNotNumeric(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertIsNotObject')) { - /** - * Asserts that a variable is not of type object. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert !object $actual - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertIsNotObject - */ - function assertIsNotObject(mixed $actual, string $message = ''): void - { - Assert::assertIsNotObject(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertIsNotResource')) { - /** - * Asserts that a variable is not of type resource. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert !resource $actual - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertIsNotResource - */ - function assertIsNotResource(mixed $actual, string $message = ''): void - { - Assert::assertIsNotResource(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertIsNotClosedResource')) { - /** - * Asserts that a variable is not of type resource. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert !resource $actual - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertIsNotClosedResource - */ - function assertIsNotClosedResource(mixed $actual, string $message = ''): void - { - Assert::assertIsNotClosedResource(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertIsNotString')) { - /** - * Asserts that a variable is not of type string. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert !string $actual - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertIsNotString - */ - function assertIsNotString(mixed $actual, string $message = ''): void - { - Assert::assertIsNotString(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertIsNotScalar')) { - /** - * Asserts that a variable is not of type scalar. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert !scalar $actual - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertIsNotScalar - */ - function assertIsNotScalar(mixed $actual, string $message = ''): void - { - Assert::assertIsNotScalar(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertIsNotCallable')) { - /** - * Asserts that a variable is not of type callable. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert !callable $actual - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertIsNotCallable - */ - function assertIsNotCallable(mixed $actual, string $message = ''): void - { - Assert::assertIsNotCallable(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertIsNotIterable')) { - /** - * Asserts that a variable is not of type iterable. - * - * @throws Exception - * @throws ExpectationFailedException - * - * @psalm-assert !iterable $actual - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertIsNotIterable - */ - function assertIsNotIterable(mixed $actual, string $message = ''): void - { - Assert::assertIsNotIterable(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertMatchesRegularExpression')) { - /** - * Asserts that a string matches a given regular expression. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertMatchesRegularExpression - */ - function assertMatchesRegularExpression(string $pattern, string $string, string $message = ''): void - { - Assert::assertMatchesRegularExpression(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertDoesNotMatchRegularExpression')) { - /** - * Asserts that a string does not match a given regular expression. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertDoesNotMatchRegularExpression - */ - function assertDoesNotMatchRegularExpression(string $pattern, string $string, string $message = ''): void - { - Assert::assertDoesNotMatchRegularExpression(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertSameSize')) { - /** - * Assert that the size of two arrays (or `Countable` or `Traversable` objects) - * is the same. - * - * @throws Exception - * @throws ExpectationFailedException - * @throws GeneratorNotSupportedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertSameSize - */ - function assertSameSize(Countable|iterable $expected, Countable|iterable $actual, string $message = ''): void - { - Assert::assertSameSize(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertNotSameSize')) { - /** - * Assert that the size of two arrays (or `Countable` or `Traversable` objects) - * is not the same. - * - * @throws Exception - * @throws ExpectationFailedException - * @throws GeneratorNotSupportedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertNotSameSize - */ - function assertNotSameSize(Countable|iterable $expected, Countable|iterable $actual, string $message = ''): void - { - Assert::assertNotSameSize(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertStringContainsStringIgnoringLineEndings')) { - /** - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertStringContainsStringIgnoringLineEndings - */ - function assertStringContainsStringIgnoringLineEndings(string $needle, string $haystack, string $message = ''): void - { - Assert::assertStringContainsStringIgnoringLineEndings(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertStringEqualsStringIgnoringLineEndings')) { - /** - * Asserts that two strings are equal except for line endings. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertStringEqualsStringIgnoringLineEndings - */ - function assertStringEqualsStringIgnoringLineEndings(string $expected, string $actual, string $message = ''): void - { - Assert::assertStringEqualsStringIgnoringLineEndings(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertFileMatchesFormat')) { - /** - * Asserts that a string matches a given format string. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertFileMatchesFormat - */ - function assertFileMatchesFormat(string $format, string $actualFile, string $message = ''): void - { - Assert::assertFileMatchesFormat(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertFileMatchesFormatFile')) { - /** - * Asserts that a string matches a given format string. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertFileMatchesFormatFile - */ - function assertFileMatchesFormatFile(string $formatFile, string $actualFile, string $message = ''): void - { - Assert::assertFileMatchesFormatFile(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertStringMatchesFormat')) { - /** - * Asserts that a string matches a given format string. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertStringMatchesFormat - */ - function assertStringMatchesFormat(string $format, string $string, string $message = ''): void - { - Assert::assertStringMatchesFormat(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertStringNotMatchesFormat')) { - /** - * Asserts that a string does not match a given format string. - * - * @throws ExpectationFailedException - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5472 - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertStringNotMatchesFormat - */ - function assertStringNotMatchesFormat(string $format, string $string, string $message = ''): void - { - Assert::assertStringNotMatchesFormat(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertStringMatchesFormatFile')) { - /** - * Asserts that a string matches a given format file. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertStringMatchesFormatFile - */ - function assertStringMatchesFormatFile(string $formatFile, string $string, string $message = ''): void - { - Assert::assertStringMatchesFormatFile(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertStringNotMatchesFormatFile')) { - /** - * Asserts that a string does not match a given format string. - * - * @throws ExpectationFailedException - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5472 - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertStringNotMatchesFormatFile - */ - function assertStringNotMatchesFormatFile(string $formatFile, string $string, string $message = ''): void - { - Assert::assertStringNotMatchesFormatFile(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertStringStartsWith')) { - /** - * Asserts that a string starts with a given prefix. - * - * @psalm-param non-empty-string $prefix - * - * @throws ExpectationFailedException - * @throws InvalidArgumentException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertStringStartsWith - */ - function assertStringStartsWith(string $prefix, string $string, string $message = ''): void - { - Assert::assertStringStartsWith(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertStringStartsNotWith')) { - /** - * Asserts that a string starts not with a given prefix. - * - * @psalm-param non-empty-string $prefix - * - * @throws ExpectationFailedException - * @throws InvalidArgumentException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertStringStartsNotWith - */ - function assertStringStartsNotWith(string $prefix, string $string, string $message = ''): void - { - Assert::assertStringStartsNotWith(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertStringContainsString')) { - /** - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertStringContainsString - */ - function assertStringContainsString(string $needle, string $haystack, string $message = ''): void - { - Assert::assertStringContainsString(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertStringContainsStringIgnoringCase')) { - /** - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertStringContainsStringIgnoringCase - */ - function assertStringContainsStringIgnoringCase(string $needle, string $haystack, string $message = ''): void - { - Assert::assertStringContainsStringIgnoringCase(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertStringNotContainsString')) { - /** - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertStringNotContainsString - */ - function assertStringNotContainsString(string $needle, string $haystack, string $message = ''): void - { - Assert::assertStringNotContainsString(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertStringNotContainsStringIgnoringCase')) { - /** - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertStringNotContainsStringIgnoringCase - */ - function assertStringNotContainsStringIgnoringCase(string $needle, string $haystack, string $message = ''): void - { - Assert::assertStringNotContainsStringIgnoringCase(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertStringEndsWith')) { - /** - * Asserts that a string ends with a given suffix. - * - * @psalm-param non-empty-string $suffix - * - * @throws ExpectationFailedException - * @throws InvalidArgumentException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertStringEndsWith - */ - function assertStringEndsWith(string $suffix, string $string, string $message = ''): void - { - Assert::assertStringEndsWith(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertStringEndsNotWith')) { - /** - * Asserts that a string ends not with a given suffix. - * - * @psalm-param non-empty-string $suffix - * - * @throws ExpectationFailedException - * @throws InvalidArgumentException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertStringEndsNotWith - */ - function assertStringEndsNotWith(string $suffix, string $string, string $message = ''): void - { - Assert::assertStringEndsNotWith(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertXmlFileEqualsXmlFile')) { - /** - * Asserts that two XML files are equal. - * - * @throws Exception - * @throws ExpectationFailedException - * @throws XmlException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertXmlFileEqualsXmlFile - */ - function assertXmlFileEqualsXmlFile(string $expectedFile, string $actualFile, string $message = ''): void - { - Assert::assertXmlFileEqualsXmlFile(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertXmlFileNotEqualsXmlFile')) { - /** - * Asserts that two XML files are not equal. - * - * @throws \PHPUnit\Util\Exception - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertXmlFileNotEqualsXmlFile - */ - function assertXmlFileNotEqualsXmlFile(string $expectedFile, string $actualFile, string $message = ''): void - { - Assert::assertXmlFileNotEqualsXmlFile(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertXmlStringEqualsXmlFile')) { - /** - * Asserts that two XML documents are equal. - * - * @throws ExpectationFailedException - * @throws XmlException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertXmlStringEqualsXmlFile - */ - function assertXmlStringEqualsXmlFile(string $expectedFile, string $actualXml, string $message = ''): void - { - Assert::assertXmlStringEqualsXmlFile(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertXmlStringNotEqualsXmlFile')) { - /** - * Asserts that two XML documents are not equal. - * - * @throws ExpectationFailedException - * @throws XmlException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertXmlStringNotEqualsXmlFile - */ - function assertXmlStringNotEqualsXmlFile(string $expectedFile, string $actualXml, string $message = ''): void - { - Assert::assertXmlStringNotEqualsXmlFile(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertXmlStringEqualsXmlString')) { - /** - * Asserts that two XML documents are equal. - * - * @throws ExpectationFailedException - * @throws XmlException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertXmlStringEqualsXmlString - */ - function assertXmlStringEqualsXmlString(string $expectedXml, string $actualXml, string $message = ''): void - { - Assert::assertXmlStringEqualsXmlString(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertXmlStringNotEqualsXmlString')) { - /** - * Asserts that two XML documents are not equal. - * - * @throws ExpectationFailedException - * @throws XmlException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertXmlStringNotEqualsXmlString - */ - function assertXmlStringNotEqualsXmlString(string $expectedXml, string $actualXml, string $message = ''): void - { - Assert::assertXmlStringNotEqualsXmlString(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertThat')) { - /** - * Evaluates a PHPUnit\Framework\Constraint matcher object. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertThat - */ - function assertThat(mixed $value, Constraint $constraint, string $message = ''): void - { - Assert::assertThat(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertJson')) { - /** - * Asserts that a string is a valid JSON string. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertJson - */ - function assertJson(string $actual, string $message = ''): void - { - Assert::assertJson(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertJsonStringEqualsJsonString')) { - /** - * Asserts that two given JSON encoded objects or arrays are equal. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertJsonStringEqualsJsonString - */ - function assertJsonStringEqualsJsonString(string $expectedJson, string $actualJson, string $message = ''): void - { - Assert::assertJsonStringEqualsJsonString(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertJsonStringNotEqualsJsonString')) { - /** - * Asserts that two given JSON encoded objects or arrays are not equal. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertJsonStringNotEqualsJsonString - */ - function assertJsonStringNotEqualsJsonString(string $expectedJson, string $actualJson, string $message = ''): void - { - Assert::assertJsonStringNotEqualsJsonString(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertJsonStringEqualsJsonFile')) { - /** - * Asserts that the generated JSON encoded object and the content of the given file are equal. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertJsonStringEqualsJsonFile - */ - function assertJsonStringEqualsJsonFile(string $expectedFile, string $actualJson, string $message = ''): void - { - Assert::assertJsonStringEqualsJsonFile(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertJsonStringNotEqualsJsonFile')) { - /** - * Asserts that the generated JSON encoded object and the content of the given file are not equal. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertJsonStringNotEqualsJsonFile - */ - function assertJsonStringNotEqualsJsonFile(string $expectedFile, string $actualJson, string $message = ''): void - { - Assert::assertJsonStringNotEqualsJsonFile(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertJsonFileEqualsJsonFile')) { - /** - * Asserts that two JSON files are equal. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertJsonFileEqualsJsonFile - */ - function assertJsonFileEqualsJsonFile(string $expectedFile, string $actualFile, string $message = ''): void - { - Assert::assertJsonFileEqualsJsonFile(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\assertJsonFileNotEqualsJsonFile')) { - /** - * Asserts that two JSON files are not equal. - * - * @throws ExpectationFailedException - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @see Assert::assertJsonFileNotEqualsJsonFile - */ - function assertJsonFileNotEqualsJsonFile(string $expectedFile, string $actualFile, string $message = ''): void - { - Assert::assertJsonFileNotEqualsJsonFile(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\logicalAnd')) { - function logicalAnd(mixed ...$constraints): LogicalAnd - { - return Assert::logicalAnd(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\logicalOr')) { - function logicalOr(mixed ...$constraints): LogicalOr - { - return Assert::logicalOr(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\logicalNot')) { - function logicalNot(Constraint $constraint): LogicalNot - { - return Assert::logicalNot(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\logicalXor')) { - function logicalXor(mixed ...$constraints): LogicalXor - { - return Assert::logicalXor(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\anything')) { - function anything(): IsAnything - { - return Assert::anything(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\isTrue')) { - function isTrue(): IsTrue - { - return Assert::isTrue(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\isFalse')) { - function isFalse(): IsFalse - { - return Assert::isFalse(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\isJson')) { - function isJson(): IsJson - { - return Assert::isJson(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\isNull')) { - function isNull(): IsNull - { - return Assert::isNull(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\isFinite')) { - function isFinite(): IsFinite - { - return Assert::isFinite(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\isInfinite')) { - function isInfinite(): IsInfinite - { - return Assert::isInfinite(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\isNan')) { - function isNan(): IsNan - { - return Assert::isNan(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\containsEqual')) { - function containsEqual(mixed $value): TraversableContainsEqual - { - return Assert::containsEqual(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\containsIdentical')) { - function containsIdentical(mixed $value): TraversableContainsIdentical - { - return Assert::containsIdentical(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\containsOnly')) { - function containsOnly(string $type): TraversableContainsOnly - { - return Assert::containsOnly(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\containsOnlyInstancesOf')) { - function containsOnlyInstancesOf(string $className): TraversableContainsOnly - { - return Assert::containsOnlyInstancesOf(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\arrayHasKey')) { - function arrayHasKey(mixed $key): ArrayHasKey - { - return Assert::arrayHasKey(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\isList')) { - function isList(): IsList - { - return Assert::isList(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\equalTo')) { - function equalTo(mixed $value): IsEqual - { - return Assert::equalTo(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\equalToCanonicalizing')) { - function equalToCanonicalizing(mixed $value): IsEqualCanonicalizing - { - return Assert::equalToCanonicalizing(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\equalToIgnoringCase')) { - function equalToIgnoringCase(mixed $value): IsEqualIgnoringCase - { - return Assert::equalToIgnoringCase(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\equalToWithDelta')) { - function equalToWithDelta(mixed $value, float $delta): IsEqualWithDelta - { - return Assert::equalToWithDelta(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\isEmpty')) { - function isEmpty(): IsEmpty - { - return Assert::isEmpty(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\isWritable')) { - function isWritable(): IsWritable - { - return Assert::isWritable(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\isReadable')) { - function isReadable(): IsReadable - { - return Assert::isReadable(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\directoryExists')) { - function directoryExists(): DirectoryExists - { - return Assert::directoryExists(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\fileExists')) { - function fileExists(): FileExists - { - return Assert::fileExists(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\greaterThan')) { - function greaterThan(mixed $value): GreaterThan - { - return Assert::greaterThan(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\greaterThanOrEqual')) { - function greaterThanOrEqual(mixed $value): LogicalOr - { - return Assert::greaterThanOrEqual(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\identicalTo')) { - function identicalTo(mixed $value): IsIdentical - { - return Assert::identicalTo(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\isInstanceOf')) { - function isInstanceOf(string $className): IsInstanceOf - { - return Assert::isInstanceOf(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\isType')) { - function isType(string $type): IsType - { - return Assert::isType(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\lessThan')) { - function lessThan(mixed $value): LessThan - { - return Assert::lessThan(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\lessThanOrEqual')) { - function lessThanOrEqual(mixed $value): LogicalOr - { - return Assert::lessThanOrEqual(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\matchesRegularExpression')) { - function matchesRegularExpression(string $pattern): RegularExpression - { - return Assert::matchesRegularExpression(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\matches')) { - function matches(string $string): StringMatchesFormatDescription - { - return Assert::matches(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\stringStartsWith')) { - function stringStartsWith(string $prefix): StringStartsWith - { - return Assert::stringStartsWith(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\stringContains')) { - function stringContains(string $string, bool $case = true): StringContains - { - return Assert::stringContains(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\stringEndsWith')) { - function stringEndsWith(string $suffix): StringEndsWith - { - return Assert::stringEndsWith(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\stringEqualsStringIgnoringLineEndings')) { - function stringEqualsStringIgnoringLineEndings(string $string): StringEqualsStringIgnoringLineEndings - { - return Assert::stringEqualsStringIgnoringLineEndings(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\countOf')) { - function countOf(int $count): Count - { - return Assert::countOf(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\objectEquals')) { - function objectEquals(object $object, string $method = 'equals'): ObjectEquals - { - return Assert::objectEquals(...func_get_args()); - } -} - -if (!function_exists('PHPUnit\Framework\callback')) { - /** - * @psalm-template CallbackInput of mixed - * - * @psalm-param callable(CallbackInput $callback): bool $callback - * - * @psalm-return Callback - */ - function callback(callable $callback): Callback - { - return Assert::callback($callback); - } -} - -if (!function_exists('PHPUnit\Framework\any')) { - /** - * Returns a matcher that matches when the method is executed - * zero or more times. - */ - function any(): AnyInvokedCountMatcher - { - return new AnyInvokedCountMatcher; - } -} - -if (!function_exists('PHPUnit\Framework\never')) { - /** - * Returns a matcher that matches when the method is never executed. - */ - function never(): InvokedCountMatcher - { - return new InvokedCountMatcher(0); - } -} - -if (!function_exists('PHPUnit\Framework\atLeast')) { - /** - * Returns a matcher that matches when the method is executed - * at least N times. - */ - function atLeast(int $requiredInvocations): InvokedAtLeastCountMatcher - { - return new InvokedAtLeastCountMatcher( - $requiredInvocations, - ); - } -} - -if (!function_exists('PHPUnit\Framework\atLeastOnce')) { - /** - * Returns a matcher that matches when the method is executed at least once. - */ - function atLeastOnce(): InvokedAtLeastOnceMatcher - { - return new InvokedAtLeastOnceMatcher; - } -} - -if (!function_exists('PHPUnit\Framework\once')) { - /** - * Returns a matcher that matches when the method is executed exactly once. - */ - function once(): InvokedCountMatcher - { - return new InvokedCountMatcher(1); - } -} - -if (!function_exists('PHPUnit\Framework\exactly')) { - /** - * Returns a matcher that matches when the method is executed - * exactly $count times. - */ - function exactly(int $count): InvokedCountMatcher - { - return new InvokedCountMatcher($count); - } -} - -if (!function_exists('PHPUnit\Framework\atMost')) { - /** - * Returns a matcher that matches when the method is executed - * at most N times. - */ - function atMost(int $allowedInvocations): InvokedAtMostCountMatcher - { - return new InvokedAtMostCountMatcher($allowedInvocations); - } -} - -if (!function_exists('PHPUnit\Framework\returnValue')) { - function returnValue(mixed $value): ReturnStub - { - return new ReturnStub($value); - } -} - -if (!function_exists('PHPUnit\Framework\returnValueMap')) { - function returnValueMap(array $valueMap): ReturnValueMapStub - { - return new ReturnValueMapStub($valueMap); - } -} - -if (!function_exists('PHPUnit\Framework\returnArgument')) { - function returnArgument(int $argumentIndex): ReturnArgumentStub - { - return new ReturnArgumentStub($argumentIndex); - } -} - -if (!function_exists('PHPUnit\Framework\returnCallback')) { - function returnCallback(callable $callback): ReturnCallbackStub - { - return new ReturnCallbackStub($callback); - } -} - -if (!function_exists('PHPUnit\Framework\returnSelf')) { - /** - * Returns the current object. - * - * This method is useful when mocking a fluent interface. - */ - function returnSelf(): ReturnSelfStub - { - return new ReturnSelfStub; - } -} - -if (!function_exists('PHPUnit\Framework\throwException')) { - function throwException(Throwable $exception): ExceptionStub - { - return new ExceptionStub($exception); - } -} - -if (!function_exists('PHPUnit\Framework\onConsecutiveCalls')) { - function onConsecutiveCalls(): ConsecutiveCallsStub - { - $arguments = func_get_args(); - - return new ConsecutiveCallsStub($arguments); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/After.php b/vendor/phpunit/phpunit/src/Framework/Attributes/After.php deleted file mode 100644 index 6fe0a3c..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/After.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_METHOD)] -final class After -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/AfterClass.php b/vendor/phpunit/phpunit/src/Framework/Attributes/AfterClass.php deleted file mode 100644 index 8ef97f2..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/AfterClass.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_METHOD)] -final class AfterClass -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/BackupGlobals.php b/vendor/phpunit/phpunit/src/Framework/Attributes/BackupGlobals.php deleted file mode 100644 index 481687e..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/BackupGlobals.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_METHOD)] -final class BackupGlobals -{ - private readonly bool $enabled; - - public function __construct(bool $enabled) - { - $this->enabled = $enabled; - } - - public function enabled(): bool - { - return $this->enabled; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/BackupStaticProperties.php b/vendor/phpunit/phpunit/src/Framework/Attributes/BackupStaticProperties.php deleted file mode 100644 index 8fa215b..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/BackupStaticProperties.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_METHOD)] -final class BackupStaticProperties -{ - private readonly bool $enabled; - - public function __construct(bool $enabled) - { - $this->enabled = $enabled; - } - - public function enabled(): bool - { - return $this->enabled; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/Before.php b/vendor/phpunit/phpunit/src/Framework/Attributes/Before.php deleted file mode 100644 index 39ecf43..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/Before.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_METHOD)] -final class Before -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/BeforeClass.php b/vendor/phpunit/phpunit/src/Framework/Attributes/BeforeClass.php deleted file mode 100644 index 4ea55e0..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/BeforeClass.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_METHOD)] -final class BeforeClass -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/CodeCoverageIgnore.php b/vendor/phpunit/phpunit/src/Framework/Attributes/CodeCoverageIgnore.php deleted file mode 100644 index 38ec37a..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/CodeCoverageIgnore.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5236 - */ -#[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_METHOD)] -final class CodeCoverageIgnore -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/CoversClass.php b/vendor/phpunit/phpunit/src/Framework/Attributes/CoversClass.php deleted file mode 100644 index 9b070c8..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/CoversClass.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_CLASS | Attribute::IS_REPEATABLE)] -final class CoversClass -{ - /** - * @psalm-var class-string - */ - private readonly string $className; - - /** - * @psalm-param class-string $className - */ - public function __construct(string $className) - { - $this->className = $className; - } - - /** - * @psalm-return class-string - */ - public function className(): string - { - return $this->className; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/CoversFunction.php b/vendor/phpunit/phpunit/src/Framework/Attributes/CoversFunction.php deleted file mode 100644 index ad0bbd2..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/CoversFunction.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_CLASS | Attribute::IS_REPEATABLE)] -final class CoversFunction -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $functionName; - - /** - * @psalm-param non-empty-string $functionName - */ - public function __construct(string $functionName) - { - $this->functionName = $functionName; - } - - /** - * @psalm-return non-empty-string - */ - public function functionName(): string - { - return $this->functionName; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/CoversNothing.php b/vendor/phpunit/phpunit/src/Framework/Attributes/CoversNothing.php deleted file mode 100644 index 8ac6a2e..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/CoversNothing.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_METHOD)] -final class CoversNothing -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/DataProvider.php b/vendor/phpunit/phpunit/src/Framework/Attributes/DataProvider.php deleted file mode 100644 index d31130f..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/DataProvider.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_METHOD | Attribute::IS_REPEATABLE)] -final class DataProvider -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $methodName; - - /** - * @psalm-param non-empty-string $methodName - */ - public function __construct(string $methodName) - { - $this->methodName = $methodName; - } - - /** - * @psalm-return non-empty-string - */ - public function methodName(): string - { - return $this->methodName; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/DataProviderExternal.php b/vendor/phpunit/phpunit/src/Framework/Attributes/DataProviderExternal.php deleted file mode 100644 index 37f8586..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/DataProviderExternal.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_METHOD | Attribute::IS_REPEATABLE)] -final class DataProviderExternal -{ - /** - * @psalm-var class-string - */ - private readonly string $className; - - /** - * @psalm-var non-empty-string - */ - private readonly string $methodName; - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - */ - public function __construct(string $className, string $methodName) - { - $this->className = $className; - $this->methodName = $methodName; - } - - /** - * @psalm-return class-string - */ - public function className(): string - { - return $this->className; - } - - /** - * @psalm-return non-empty-string - */ - public function methodName(): string - { - return $this->methodName; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/Depends.php b/vendor/phpunit/phpunit/src/Framework/Attributes/Depends.php deleted file mode 100644 index 38daf1e..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/Depends.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_METHOD | Attribute::IS_REPEATABLE)] -final class Depends -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $methodName; - - /** - * @psalm-param non-empty-string $methodName - */ - public function __construct(string $methodName) - { - $this->methodName = $methodName; - } - - /** - * @psalm-return non-empty-string - */ - public function methodName(): string - { - return $this->methodName; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/DependsExternal.php b/vendor/phpunit/phpunit/src/Framework/Attributes/DependsExternal.php deleted file mode 100644 index ba5bc32..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/DependsExternal.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_METHOD | Attribute::IS_REPEATABLE)] -final class DependsExternal -{ - /** - * @psalm-var class-string - */ - private readonly string $className; - - /** - * @psalm-var non-empty-string - */ - private readonly string $methodName; - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - */ - public function __construct(string $className, string $methodName) - { - $this->className = $className; - $this->methodName = $methodName; - } - - /** - * @psalm-return class-string - */ - public function className(): string - { - return $this->className; - } - - /** - * @psalm-return non-empty-string - */ - public function methodName(): string - { - return $this->methodName; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/DependsExternalUsingDeepClone.php b/vendor/phpunit/phpunit/src/Framework/Attributes/DependsExternalUsingDeepClone.php deleted file mode 100644 index 9e426ab..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/DependsExternalUsingDeepClone.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_METHOD | Attribute::IS_REPEATABLE)] -final class DependsExternalUsingDeepClone -{ - /** - * @psalm-var class-string - */ - private readonly string $className; - - /** - * @psalm-var non-empty-string - */ - private readonly string $methodName; - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - */ - public function __construct(string $className, string $methodName) - { - $this->className = $className; - $this->methodName = $methodName; - } - - /** - * @psalm-return class-string - */ - public function className(): string - { - return $this->className; - } - - /** - * @psalm-return non-empty-string - */ - public function methodName(): string - { - return $this->methodName; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/DependsExternalUsingShallowClone.php b/vendor/phpunit/phpunit/src/Framework/Attributes/DependsExternalUsingShallowClone.php deleted file mode 100644 index 5b9a85d..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/DependsExternalUsingShallowClone.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_METHOD | Attribute::IS_REPEATABLE)] -final class DependsExternalUsingShallowClone -{ - /** - * @psalm-var class-string - */ - private readonly string $className; - - /** - * @psalm-var non-empty-string - */ - private readonly string $methodName; - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - */ - public function __construct(string $className, string $methodName) - { - $this->className = $className; - $this->methodName = $methodName; - } - - /** - * @psalm-return class-string - */ - public function className(): string - { - return $this->className; - } - - /** - * @psalm-return non-empty-string - */ - public function methodName(): string - { - return $this->methodName; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/DependsOnClass.php b/vendor/phpunit/phpunit/src/Framework/Attributes/DependsOnClass.php deleted file mode 100644 index 73722e3..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/DependsOnClass.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_METHOD | Attribute::IS_REPEATABLE)] -final class DependsOnClass -{ - /** - * @psalm-var class-string - */ - private readonly string $className; - - /** - * @psalm-param class-string $className - */ - public function __construct(string $className) - { - $this->className = $className; - } - - /** - * @psalm-return class-string - */ - public function className(): string - { - return $this->className; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/DependsOnClassUsingDeepClone.php b/vendor/phpunit/phpunit/src/Framework/Attributes/DependsOnClassUsingDeepClone.php deleted file mode 100644 index 7ce0547..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/DependsOnClassUsingDeepClone.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_METHOD | Attribute::IS_REPEATABLE)] -final class DependsOnClassUsingDeepClone -{ - /** - * @psalm-var class-string - */ - private readonly string $className; - - /** - * @psalm-param class-string $className - */ - public function __construct(string $className) - { - $this->className = $className; - } - - /** - * @psalm-return class-string - */ - public function className(): string - { - return $this->className; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/DependsOnClassUsingShallowClone.php b/vendor/phpunit/phpunit/src/Framework/Attributes/DependsOnClassUsingShallowClone.php deleted file mode 100644 index 206c0ad..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/DependsOnClassUsingShallowClone.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_METHOD | Attribute::IS_REPEATABLE)] -final class DependsOnClassUsingShallowClone -{ - /** - * @psalm-var class-string - */ - private readonly string $className; - - /** - * @psalm-param class-string $className - */ - public function __construct(string $className) - { - $this->className = $className; - } - - /** - * @psalm-return class-string - */ - public function className(): string - { - return $this->className; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/DependsUsingDeepClone.php b/vendor/phpunit/phpunit/src/Framework/Attributes/DependsUsingDeepClone.php deleted file mode 100644 index 11c4091..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/DependsUsingDeepClone.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_METHOD | Attribute::IS_REPEATABLE)] -final class DependsUsingDeepClone -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $methodName; - - /** - * @psalm-param non-empty-string $methodName - */ - public function __construct(string $methodName) - { - $this->methodName = $methodName; - } - - /** - * @psalm-return non-empty-string - */ - public function methodName(): string - { - return $this->methodName; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/DependsUsingShallowClone.php b/vendor/phpunit/phpunit/src/Framework/Attributes/DependsUsingShallowClone.php deleted file mode 100644 index 0812c85..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/DependsUsingShallowClone.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_METHOD | Attribute::IS_REPEATABLE)] -final class DependsUsingShallowClone -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $methodName; - - /** - * @psalm-param non-empty-string $methodName - */ - public function __construct(string $methodName) - { - $this->methodName = $methodName; - } - - /** - * @psalm-return non-empty-string - */ - public function methodName(): string - { - return $this->methodName; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/DoesNotPerformAssertions.php b/vendor/phpunit/phpunit/src/Framework/Attributes/DoesNotPerformAssertions.php deleted file mode 100644 index 3d6045a..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/DoesNotPerformAssertions.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_METHOD)] -final class DoesNotPerformAssertions -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/ExcludeGlobalVariableFromBackup.php b/vendor/phpunit/phpunit/src/Framework/Attributes/ExcludeGlobalVariableFromBackup.php deleted file mode 100644 index dcd7a12..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/ExcludeGlobalVariableFromBackup.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_METHOD | Attribute::IS_REPEATABLE)] -final class ExcludeGlobalVariableFromBackup -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $globalVariableName; - - /** - * @psalm-param non-empty-string $globalVariableName - */ - public function __construct(string $globalVariableName) - { - $this->globalVariableName = $globalVariableName; - } - - /** - * @psalm-return non-empty-string - */ - public function globalVariableName(): string - { - return $this->globalVariableName; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/ExcludeStaticPropertyFromBackup.php b/vendor/phpunit/phpunit/src/Framework/Attributes/ExcludeStaticPropertyFromBackup.php deleted file mode 100644 index 64b25ed..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/ExcludeStaticPropertyFromBackup.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_METHOD | Attribute::IS_REPEATABLE)] -final class ExcludeStaticPropertyFromBackup -{ - /** - * @psalm-var class-string - */ - private readonly string $className; - - /** - * @psalm-var non-empty-string - */ - private readonly string $propertyName; - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $propertyName - */ - public function __construct(string $className, string $propertyName) - { - $this->className = $className; - $this->propertyName = $propertyName; - } - - /** - * @psalm-return class-string - */ - public function className(): string - { - return $this->className; - } - - /** - * @psalm-return non-empty-string - */ - public function propertyName(): string - { - return $this->propertyName; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/Group.php b/vendor/phpunit/phpunit/src/Framework/Attributes/Group.php deleted file mode 100644 index feccb28..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/Group.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_METHOD | Attribute::IS_REPEATABLE)] -final class Group -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $name; - - /** - * @psalm-param non-empty-string $name - */ - public function __construct(string $name) - { - $this->name = $name; - } - - /** - * @psalm-return non-empty-string - */ - public function name(): string - { - return $this->name; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/IgnoreClassForCodeCoverage.php b/vendor/phpunit/phpunit/src/Framework/Attributes/IgnoreClassForCodeCoverage.php deleted file mode 100644 index 2835507..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/IgnoreClassForCodeCoverage.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5513 - */ -#[Attribute(Attribute::TARGET_CLASS | Attribute::IS_REPEATABLE)] -final class IgnoreClassForCodeCoverage -{ - /** - * @psalm-var class-string - */ - private readonly string $className; - - /** - * @psalm-param class-string $className - */ - public function __construct(string $className) - { - $this->className = $className; - } - - /** - * @psalm-return class-string - */ - public function className(): string - { - return $this->className; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/IgnoreDeprecations.php b/vendor/phpunit/phpunit/src/Framework/Attributes/IgnoreDeprecations.php deleted file mode 100644 index cf48aac..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/IgnoreDeprecations.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_METHOD)] -final class IgnoreDeprecations -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/IgnoreFunctionForCodeCoverage.php b/vendor/phpunit/phpunit/src/Framework/Attributes/IgnoreFunctionForCodeCoverage.php deleted file mode 100644 index 90a4bab..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/IgnoreFunctionForCodeCoverage.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5513 - */ -#[Attribute(Attribute::TARGET_CLASS | Attribute::IS_REPEATABLE)] -final class IgnoreFunctionForCodeCoverage -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $functionName; - - /** - * @psalm-param non-empty-string $functionName - */ - public function __construct(string $functionName) - { - $this->functionName = $functionName; - } - - /** - * @psalm-return non-empty-string - */ - public function functionName(): string - { - return $this->functionName; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/IgnoreMethodForCodeCoverage.php b/vendor/phpunit/phpunit/src/Framework/Attributes/IgnoreMethodForCodeCoverage.php deleted file mode 100644 index a76188f..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/IgnoreMethodForCodeCoverage.php +++ /dev/null @@ -1,59 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5513 - */ -#[Attribute(Attribute::TARGET_CLASS | Attribute::IS_REPEATABLE)] -final class IgnoreMethodForCodeCoverage -{ - /** - * @psalm-var class-string - */ - private readonly string $className; - - /** - * @psalm-var non-empty-string - */ - private readonly string $methodName; - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - */ - public function __construct(string $className, string $methodName) - { - $this->className = $className; - $this->methodName = $methodName; - } - - /** - * @psalm-return class-string - */ - public function className(): string - { - return $this->className; - } - - /** - * @psalm-return non-empty-string - */ - public function methodName(): string - { - return $this->methodName; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/Large.php b/vendor/phpunit/phpunit/src/Framework/Attributes/Large.php deleted file mode 100644 index 6d46c1b..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/Large.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_CLASS)] -final class Large -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/Medium.php b/vendor/phpunit/phpunit/src/Framework/Attributes/Medium.php deleted file mode 100644 index 40e9c45..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/Medium.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_CLASS)] -final class Medium -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/PostCondition.php b/vendor/phpunit/phpunit/src/Framework/Attributes/PostCondition.php deleted file mode 100644 index 461aab4..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/PostCondition.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_METHOD)] -final class PostCondition -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/PreCondition.php b/vendor/phpunit/phpunit/src/Framework/Attributes/PreCondition.php deleted file mode 100644 index 120ed6c..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/PreCondition.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_METHOD)] -final class PreCondition -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/PreserveGlobalState.php b/vendor/phpunit/phpunit/src/Framework/Attributes/PreserveGlobalState.php deleted file mode 100644 index 69bc3f5..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/PreserveGlobalState.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_METHOD)] -final class PreserveGlobalState -{ - private readonly bool $enabled; - - public function __construct(bool $enabled) - { - $this->enabled = $enabled; - } - - public function enabled(): bool - { - return $this->enabled; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/RequiresFunction.php b/vendor/phpunit/phpunit/src/Framework/Attributes/RequiresFunction.php deleted file mode 100644 index 250915d..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/RequiresFunction.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_METHOD | Attribute::IS_REPEATABLE)] -final class RequiresFunction -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $functionName; - - /** - * @psalm-param non-empty-string $functionName - */ - public function __construct(string $functionName) - { - $this->functionName = $functionName; - } - - /** - * @psalm-return non-empty-string - */ - public function functionName(): string - { - return $this->functionName; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/RequiresMethod.php b/vendor/phpunit/phpunit/src/Framework/Attributes/RequiresMethod.php deleted file mode 100644 index 120c705..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/RequiresMethod.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_METHOD | Attribute::IS_REPEATABLE)] -final class RequiresMethod -{ - /** - * @psalm-var class-string - */ - private readonly string $className; - - /** - * @psalm-var non-empty-string - */ - private readonly string $methodName; - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - */ - public function __construct(string $className, string $methodName) - { - $this->className = $className; - $this->methodName = $methodName; - } - - /** - * @psalm-return class-string - */ - public function className(): string - { - return $this->className; - } - - /** - * @psalm-return non-empty-string - */ - public function methodName(): string - { - return $this->methodName; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/RequiresOperatingSystem.php b/vendor/phpunit/phpunit/src/Framework/Attributes/RequiresOperatingSystem.php deleted file mode 100644 index cbf8211..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/RequiresOperatingSystem.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_METHOD)] -final class RequiresOperatingSystem -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $regularExpression; - - /** - * @psalm-param non-empty-string $regularExpression - */ - public function __construct(string $regularExpression) - { - $this->regularExpression = $regularExpression; - } - - /** - * @psalm-return non-empty-string - */ - public function regularExpression(): string - { - return $this->regularExpression; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/RequiresOperatingSystemFamily.php b/vendor/phpunit/phpunit/src/Framework/Attributes/RequiresOperatingSystemFamily.php deleted file mode 100644 index d4e2c92..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/RequiresOperatingSystemFamily.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_METHOD)] -final class RequiresOperatingSystemFamily -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $operatingSystemFamily; - - /** - * @psalm-param non-empty-string $operatingSystemFamily - */ - public function __construct(string $operatingSystemFamily) - { - $this->operatingSystemFamily = $operatingSystemFamily; - } - - /** - * @psalm-return non-empty-string - */ - public function operatingSystemFamily(): string - { - return $this->operatingSystemFamily; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/RequiresPhp.php b/vendor/phpunit/phpunit/src/Framework/Attributes/RequiresPhp.php deleted file mode 100644 index a6c20b3..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/RequiresPhp.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_METHOD)] -final class RequiresPhp -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $versionRequirement; - - /** - * @psalm-param non-empty-string $versionRequirement - */ - public function __construct(string $versionRequirement) - { - $this->versionRequirement = $versionRequirement; - } - - /** - * @psalm-return non-empty-string - */ - public function versionRequirement(): string - { - return $this->versionRequirement; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/RequiresPhpExtension.php b/vendor/phpunit/phpunit/src/Framework/Attributes/RequiresPhpExtension.php deleted file mode 100644 index ab3b57a..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/RequiresPhpExtension.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_METHOD | Attribute::IS_REPEATABLE)] -final class RequiresPhpExtension -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $extension; - - /** - * @psalm-var null|non-empty-string - */ - private readonly ?string $versionRequirement; - - /** - * @psalm-param non-empty-string $extension - * @psalm-param null|non-empty-string $versionRequirement - */ - public function __construct(string $extension, ?string $versionRequirement = null) - { - $this->extension = $extension; - $this->versionRequirement = $versionRequirement; - } - - /** - * @psalm-return non-empty-string - */ - public function extension(): string - { - return $this->extension; - } - - /** - * @psalm-return null|non-empty-string - */ - public function versionRequirement(): ?string - { - return $this->versionRequirement; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/RequiresPhpunit.php b/vendor/phpunit/phpunit/src/Framework/Attributes/RequiresPhpunit.php deleted file mode 100644 index 908e400..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/RequiresPhpunit.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_METHOD)] -final class RequiresPhpunit -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $versionRequirement; - - /** - * @psalm-param non-empty-string $versionRequirement - */ - public function __construct(string $versionRequirement) - { - $this->versionRequirement = $versionRequirement; - } - - /** - * @psalm-return non-empty-string - */ - public function versionRequirement(): string - { - return $this->versionRequirement; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/RequiresSetting.php b/vendor/phpunit/phpunit/src/Framework/Attributes/RequiresSetting.php deleted file mode 100644 index cb7127a..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/RequiresSetting.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_METHOD | Attribute::IS_REPEATABLE)] -final class RequiresSetting -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $setting; - - /** - * @psalm-var non-empty-string - */ - private readonly string $value; - - /** - * @psalm-param non-empty-string $setting - * @psalm-param non-empty-string $value - */ - public function __construct(string $setting, string $value) - { - $this->setting = $setting; - $this->value = $value; - } - - /** - * @psalm-return non-empty-string - */ - public function setting(): string - { - return $this->setting; - } - - /** - * @psalm-return non-empty-string - */ - public function value(): string - { - return $this->value; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/RunClassInSeparateProcess.php b/vendor/phpunit/phpunit/src/Framework/Attributes/RunClassInSeparateProcess.php deleted file mode 100644 index 621774f..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/RunClassInSeparateProcess.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_CLASS)] -final class RunClassInSeparateProcess -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/RunInSeparateProcess.php b/vendor/phpunit/phpunit/src/Framework/Attributes/RunInSeparateProcess.php deleted file mode 100644 index dd0066b..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/RunInSeparateProcess.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_METHOD)] -final class RunInSeparateProcess -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/RunTestsInSeparateProcesses.php b/vendor/phpunit/phpunit/src/Framework/Attributes/RunTestsInSeparateProcesses.php deleted file mode 100644 index b823ccb..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/RunTestsInSeparateProcesses.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_CLASS)] -final class RunTestsInSeparateProcesses -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/Small.php b/vendor/phpunit/phpunit/src/Framework/Attributes/Small.php deleted file mode 100644 index 598b654..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/Small.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_CLASS)] -final class Small -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/Test.php b/vendor/phpunit/phpunit/src/Framework/Attributes/Test.php deleted file mode 100644 index 711d58d..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/Test.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_METHOD)] -final class Test -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/TestDox.php b/vendor/phpunit/phpunit/src/Framework/Attributes/TestDox.php deleted file mode 100644 index f49c4bd..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/TestDox.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_METHOD)] -final class TestDox -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $text; - - /** - * @psalm-param non-empty-string $text - */ - public function __construct(string $text) - { - $this->text = $text; - } - - /** - * @psalm-return non-empty-string - */ - public function text(): string - { - return $this->text; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/TestWith.php b/vendor/phpunit/phpunit/src/Framework/Attributes/TestWith.php deleted file mode 100644 index ed20baa..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/TestWith.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_METHOD | Attribute::IS_REPEATABLE)] -final class TestWith -{ - private readonly array $data; - - public function __construct(array $data) - { - $this->data = $data; - } - - public function data(): array - { - return $this->data; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/TestWithJson.php b/vendor/phpunit/phpunit/src/Framework/Attributes/TestWithJson.php deleted file mode 100644 index b1cbc34..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/TestWithJson.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_METHOD | Attribute::IS_REPEATABLE)] -final class TestWithJson -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $json; - - /** - * @psalm-param non-empty-string $json - */ - public function __construct(string $json) - { - $this->json = $json; - } - - /** - * @psalm-return non-empty-string - */ - public function json(): string - { - return $this->json; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/Ticket.php b/vendor/phpunit/phpunit/src/Framework/Attributes/Ticket.php deleted file mode 100644 index c0418e5..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/Ticket.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_METHOD | Attribute::IS_REPEATABLE)] -final class Ticket -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $text; - - /** - * @psalm-param non-empty-string $text - */ - public function __construct(string $text) - { - $this->text = $text; - } - - /** - * @psalm-return non-empty-string - */ - public function text(): string - { - return $this->text; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/UsesClass.php b/vendor/phpunit/phpunit/src/Framework/Attributes/UsesClass.php deleted file mode 100644 index 78c64e7..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/UsesClass.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_CLASS | Attribute::IS_REPEATABLE)] -final class UsesClass -{ - /** - * @psalm-var class-string - */ - private readonly string $className; - - /** - * @psalm-param class-string $className - */ - public function __construct(string $className) - { - $this->className = $className; - } - - /** - * @psalm-return class-string - */ - public function className(): string - { - return $this->className; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/UsesFunction.php b/vendor/phpunit/phpunit/src/Framework/Attributes/UsesFunction.php deleted file mode 100644 index 9e108ad..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/UsesFunction.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_CLASS | Attribute::IS_REPEATABLE)] -final class UsesFunction -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $functionName; - - /** - * @psalm-param non-empty-string $functionName - */ - public function __construct(string $functionName) - { - $this->functionName = $functionName; - } - - /** - * @psalm-return non-empty-string - */ - public function functionName(): string - { - return $this->functionName; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Attributes/WithoutErrorHandler.php b/vendor/phpunit/phpunit/src/Framework/Attributes/WithoutErrorHandler.php deleted file mode 100644 index 2dce1e9..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Attributes/WithoutErrorHandler.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Attributes; - -use Attribute; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -#[Attribute(Attribute::TARGET_METHOD)] -final class WithoutErrorHandler -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Boolean/IsFalse.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Boolean/IsFalse.php deleted file mode 100644 index 5846cf1..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Boolean/IsFalse.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class IsFalse extends Constraint -{ - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return 'is false'; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - */ - protected function matches(mixed $other): bool - { - return $other === false; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Boolean/IsTrue.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Boolean/IsTrue.php deleted file mode 100644 index be58952..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Boolean/IsTrue.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class IsTrue extends Constraint -{ - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return 'is true'; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - */ - protected function matches(mixed $other): bool - { - return $other === true; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Callback.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Callback.php deleted file mode 100644 index 8a0e1b8..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Callback.php +++ /dev/null @@ -1,73 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use Closure; -use ReflectionFunction; - -/** - * @psalm-template CallbackInput of mixed - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class Callback extends Constraint -{ - /** - * @psalm-var callable(CallbackInput $input): bool - */ - private readonly mixed $callback; - - /** - * @psalm-param callable(CallbackInput $input): bool $callback - */ - public function __construct(callable $callback) - { - $this->callback = $callback; - } - - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return 'is accepted by specified callback'; - } - - /** - * @psalm-suppress ArgumentTypeCoercion - */ - public function isVariadic(): bool - { - foreach ((new ReflectionFunction(Closure::fromCallable($this->callback)))->getParameters() as $parameter) { - if ($parameter->isVariadic()) { - return true; - } - } - - return false; - } - - /** - * Evaluates the constraint for parameter $value. Returns true if the - * constraint is met, false otherwise. - * - * @psalm-param CallbackInput $other - * - * @psalm-suppress InvalidArgument - */ - protected function matches(mixed $other): bool - { - if ($this->isVariadic()) { - return ($this->callback)(...$other); - } - - return ($this->callback)($other); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/Count.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/Count.php deleted file mode 100644 index 2ec012a..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/Count.php +++ /dev/null @@ -1,126 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use function count; -use function is_countable; -use function iterator_count; -use function sprintf; -use EmptyIterator; -use Generator; -use Iterator; -use IteratorAggregate; -use PHPUnit\Framework\Exception; -use PHPUnit\Framework\GeneratorNotSupportedException; -use Traversable; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -class Count extends Constraint -{ - private readonly int $expectedCount; - - public function __construct(int $expected) - { - $this->expectedCount = $expected; - } - - public function toString(): string - { - return sprintf( - 'count matches %d', - $this->expectedCount, - ); - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @throws Exception - */ - protected function matches(mixed $other): bool - { - return $this->expectedCount === $this->getCountOf($other); - } - - /** - * @throws Exception - */ - protected function getCountOf(mixed $other): ?int - { - if (is_countable($other)) { - return count($other); - } - - if ($other instanceof EmptyIterator) { - return 0; - } - - if ($other instanceof Traversable) { - while ($other instanceof IteratorAggregate) { - try { - $other = $other->getIterator(); - } catch (\Exception $e) { - throw new Exception( - $e->getMessage(), - $e->getCode(), - $e, - ); - } - } - - $iterator = $other; - - if ($iterator instanceof Generator) { - throw new GeneratorNotSupportedException; - } - - if (!$iterator instanceof Iterator) { - return iterator_count($iterator); - } - - $key = $iterator->key(); - $count = iterator_count($iterator); - - // Manually rewind $iterator to previous key, since iterator_count - // moves pointer. - if ($key !== null) { - $iterator->rewind(); - - while ($iterator->valid() && $key !== $iterator->key()) { - $iterator->next(); - } - } - - return $count; - } - - return null; - } - - /** - * Returns the description of the failure. - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * @throws Exception - */ - protected function failureDescription(mixed $other): string - { - return sprintf( - 'actual size %d matches expected size %d', - (int) $this->getCountOf($other), - $this->expectedCount, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/GreaterThan.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/GreaterThan.php deleted file mode 100644 index 7e8f0ee..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/GreaterThan.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use PHPUnit\Util\Exporter; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class GreaterThan extends Constraint -{ - private readonly mixed $value; - - public function __construct(mixed $value) - { - $this->value = $value; - } - - /** - * Returns a string representation of the constraint. - */ - public function toString(bool $exportObjects = false): string - { - return 'is greater than ' . Exporter::export($this->value, $exportObjects); - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - */ - protected function matches(mixed $other): bool - { - return $this->value < $other; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/IsEmpty.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/IsEmpty.php deleted file mode 100644 index ddf4a9f..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/IsEmpty.php +++ /dev/null @@ -1,66 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use function count; -use function gettype; -use function sprintf; -use function str_starts_with; -use Countable; -use EmptyIterator; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class IsEmpty extends Constraint -{ - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return 'is empty'; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - */ - protected function matches(mixed $other): bool - { - if ($other instanceof EmptyIterator) { - return true; - } - - if ($other instanceof Countable) { - return count($other) === 0; - } - - return empty($other); - } - - /** - * Returns the description of the failure. - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - */ - protected function failureDescription(mixed $other): string - { - $type = gettype($other); - - return sprintf( - '%s %s %s', - str_starts_with($type, 'a') || str_starts_with($type, 'o') ? 'an' : 'a', - $type, - $this->toString(true), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/LessThan.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/LessThan.php deleted file mode 100644 index cc3ec34..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/LessThan.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use PHPUnit\Util\Exporter; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class LessThan extends Constraint -{ - private readonly mixed $value; - - public function __construct(mixed $value) - { - $this->value = $value; - } - - /** - * Returns a string representation of the constraint. - */ - public function toString(bool $exportObjects = false): string - { - return 'is less than ' . Exporter::export($this->value, $exportObjects); - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - */ - protected function matches(mixed $other): bool - { - return $this->value > $other; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/SameSize.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/SameSize.php deleted file mode 100644 index f3cd3c3..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/SameSize.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use Countable; -use PHPUnit\Framework\Exception; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class SameSize extends Count -{ - /** - * @psalm-param Countable|iterable $expected - * - * @throws Exception - */ - public function __construct($expected) - { - parent::__construct((int) $this->getCountOf($expected)); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Constraint.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Constraint.php deleted file mode 100644 index 1fead9a..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Constraint.php +++ /dev/null @@ -1,264 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use function gettype; -use function sprintf; -use function strtolower; -use Countable; -use PHPUnit\Framework\ExpectationFailedException; -use PHPUnit\Framework\SelfDescribing; -use PHPUnit\Util\Exporter; -use SebastianBergmann\Comparator\ComparisonFailure; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -abstract class Constraint implements Countable, SelfDescribing -{ - /** - * Evaluates the constraint for parameter $other. - * - * If $returnResult is set to false (the default), an exception is thrown - * in case of a failure. null is returned otherwise. - * - * If $returnResult is true, the result of the evaluation is returned as - * a boolean value instead: true in case of success, false in case of a - * failure. - * - * @throws ExpectationFailedException - */ - public function evaluate(mixed $other, string $description = '', bool $returnResult = false): ?bool - { - $success = false; - - if ($this->matches($other)) { - $success = true; - } - - if ($returnResult) { - return $success; - } - - if (!$success) { - $this->fail($other, $description); - } - - return null; - } - - /** - * Counts the number of constraint elements. - */ - public function count(): int - { - return 1; - } - - /** - * @deprecated - */ - protected function exporter(): \SebastianBergmann\Exporter\Exporter - { - return new \SebastianBergmann\Exporter\Exporter; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * This method can be overridden to implement the evaluation algorithm. - */ - protected function matches(mixed $other): bool - { - return false; - } - - /** - * Throws an exception for the given compared value and test description. - * - * @throws ExpectationFailedException - */ - protected function fail(mixed $other, string $description, ?ComparisonFailure $comparisonFailure = null): never - { - $failureDescription = sprintf( - 'Failed asserting that %s.', - $this->failureDescription($other), - ); - - $additionalFailureDescription = $this->additionalFailureDescription($other); - - if ($additionalFailureDescription) { - $failureDescription .= "\n" . $additionalFailureDescription; - } - - if (!empty($description)) { - $failureDescription = $description . "\n" . $failureDescription; - } - - throw new ExpectationFailedException( - $failureDescription, - $comparisonFailure, - ); - } - - /** - * Return additional failure description where needed. - * - * The function can be overridden to provide additional failure - * information like a diff - */ - protected function additionalFailureDescription(mixed $other): string - { - return ''; - } - - /** - * Returns the description of the failure. - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * To provide additional failure information additionalFailureDescription - * can be used. - */ - protected function failureDescription(mixed $other): string - { - return Exporter::export($other, true) . ' ' . $this->toString(true); - } - - /** - * Returns a custom string representation of the constraint object when it - * appears in context of an $operator expression. - * - * The purpose of this method is to provide meaningful descriptive string - * in context of operators such as LogicalNot. Native PHPUnit constraints - * are supported out of the box by LogicalNot, but externally developed - * ones had no way to provide correct strings in this context. - * - * The method shall return empty string, when it does not handle - * customization by itself. - */ - protected function toStringInContext(Operator $operator, mixed $role): string - { - return ''; - } - - /** - * Returns the description of the failure when this constraint appears in - * context of an $operator expression. - * - * The purpose of this method is to provide meaningful failure description - * in context of operators such as LogicalNot. Native PHPUnit constraints - * are supported out of the box by LogicalNot, but externally developed - * ones had no way to provide correct messages in this context. - * - * The method shall return empty string, when it does not handle - * customization by itself. - */ - protected function failureDescriptionInContext(Operator $operator, mixed $role, mixed $other): string - { - $string = $this->toStringInContext($operator, $role); - - if ($string === '') { - return ''; - } - - return Exporter::export($other, true) . ' ' . $string; - } - - /** - * Reduces the sub-expression starting at $this by skipping degenerate - * sub-expression and returns first descendant constraint that starts - * a non-reducible sub-expression. - * - * Returns $this for terminal constraints and for operators that start - * non-reducible sub-expression, or the nearest descendant of $this that - * starts a non-reducible sub-expression. - * - * A constraint expression may be modelled as a tree with non-terminal - * nodes (operators) and terminal nodes. For example: - * - * LogicalOr (operator, non-terminal) - * + LogicalAnd (operator, non-terminal) - * | + IsType('int') (terminal) - * | + GreaterThan(10) (terminal) - * + LogicalNot (operator, non-terminal) - * + IsType('array') (terminal) - * - * A degenerate sub-expression is a part of the tree, that effectively does - * not contribute to the evaluation of the expression it appears in. An example - * of degenerate sub-expression is a BinaryOperator constructed with single - * operand or nested BinaryOperators, each with single operand. An - * expression involving a degenerate sub-expression is equivalent to a - * reduced expression with the degenerate sub-expression removed, for example - * - * LogicalAnd (operator) - * + LogicalOr (degenerate operator) - * | + LogicalAnd (degenerate operator) - * | + IsType('int') (terminal) - * + GreaterThan(10) (terminal) - * - * is equivalent to - * - * LogicalAnd (operator) - * + IsType('int') (terminal) - * + GreaterThan(10) (terminal) - * - * because the subexpression - * - * + LogicalOr - * + LogicalAnd - * + - - * - * is degenerate. Calling reduce() on the LogicalOr object above, as well - * as on LogicalAnd, shall return the IsType('int') instance. - * - * Other specific reductions can be implemented, for example cascade of - * LogicalNot operators - * - * + LogicalNot - * + LogicalNot - * +LogicalNot - * + IsTrue - * - * can be reduced to - * - * LogicalNot - * + IsTrue - */ - protected function reduce(): self - { - return $this; - } - - /** - * @psalm-return non-empty-string - */ - protected function valueToTypeStringFragment(mixed $value): string - { - $type = strtolower(gettype($value)); - - if ($type === 'double') { - $type = 'float'; - } - - if ($type === 'resource (closed)') { - $type = 'closed resource'; - } - - return match ($type) { - 'array', 'integer', 'object' => 'an ' . $type . ' ', - 'boolean', 'closed resource', 'float', 'resource', 'string' => 'a ' . $type . ' ', - 'null' => 'null ', - default => 'a value of ' . $type . ' ', - }; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqual.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqual.php deleted file mode 100644 index 2238475..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqual.php +++ /dev/null @@ -1,120 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use function is_string; -use function sprintf; -use function str_contains; -use function trim; -use PHPUnit\Framework\ExpectationFailedException; -use PHPUnit\Util\Exporter; -use SebastianBergmann\Comparator\ComparisonFailure; -use SebastianBergmann\Comparator\Factory as ComparatorFactory; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class IsEqual extends Constraint -{ - private readonly mixed $value; - private readonly float $delta; - private readonly bool $canonicalize; - private readonly bool $ignoreCase; - - public function __construct(mixed $value, float $delta = 0.0, bool $canonicalize = false, bool $ignoreCase = false) - { - $this->value = $value; - $this->delta = $delta; - $this->canonicalize = $canonicalize; - $this->ignoreCase = $ignoreCase; - } - - /** - * Evaluates the constraint for parameter $other. - * - * If $returnResult is set to false (the default), an exception is thrown - * in case of a failure. null is returned otherwise. - * - * If $returnResult is true, the result of the evaluation is returned as - * a boolean value instead: true in case of success, false in case of a - * failure. - * - * @throws ExpectationFailedException - */ - public function evaluate(mixed $other, string $description = '', bool $returnResult = false): ?bool - { - // If $this->value and $other are identical, they are also equal. - // This is the most common path and will allow us to skip - // initialization of all the comparators. - if ($this->value === $other) { - return true; - } - - $comparatorFactory = ComparatorFactory::getInstance(); - - try { - $comparator = $comparatorFactory->getComparatorFor( - $this->value, - $other, - ); - - $comparator->assertEquals( - $this->value, - $other, - $this->delta, - $this->canonicalize, - $this->ignoreCase, - ); - } catch (ComparisonFailure $f) { - if ($returnResult) { - return false; - } - - throw new ExpectationFailedException( - trim($description . "\n" . $f->getMessage()), - $f, - ); - } - - return true; - } - - /** - * Returns a string representation of the constraint. - */ - public function toString(bool $exportObjects = false): string - { - $delta = ''; - - if (is_string($this->value)) { - if (str_contains($this->value, "\n")) { - return 'is equal to '; - } - - return sprintf( - "is equal to '%s'", - $this->value, - ); - } - - if ($this->delta != 0) { - $delta = sprintf( - ' with delta <%F>', - $this->delta, - ); - } - - return sprintf( - 'is equal to %s%s', - Exporter::export($this->value, $exportObjects), - $delta, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualCanonicalizing.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualCanonicalizing.php deleted file mode 100644 index 425569d..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualCanonicalizing.php +++ /dev/null @@ -1,103 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use function is_string; -use function sprintf; -use function str_contains; -use function trim; -use PHPUnit\Framework\ExpectationFailedException; -use PHPUnit\Util\Exporter; -use SebastianBergmann\Comparator\ComparisonFailure; -use SebastianBergmann\Comparator\Factory as ComparatorFactory; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class IsEqualCanonicalizing extends Constraint -{ - private readonly mixed $value; - - public function __construct(mixed $value) - { - $this->value = $value; - } - - /** - * Evaluates the constraint for parameter $other. - * - * If $returnResult is set to false (the default), an exception is thrown - * in case of a failure. null is returned otherwise. - * - * If $returnResult is true, the result of the evaluation is returned as - * a boolean value instead: true in case of success, false in case of a - * failure. - * - * @throws ExpectationFailedException - */ - public function evaluate(mixed $other, string $description = '', bool $returnResult = false): ?bool - { - // If $this->value and $other are identical, they are also equal. - // This is the most common path and will allow us to skip - // initialization of all the comparators. - if ($this->value === $other) { - return true; - } - - $comparatorFactory = ComparatorFactory::getInstance(); - - try { - $comparator = $comparatorFactory->getComparatorFor( - $this->value, - $other, - ); - - $comparator->assertEquals( - $this->value, - $other, - 0.0, - true, - ); - } catch (ComparisonFailure $f) { - if ($returnResult) { - return false; - } - - throw new ExpectationFailedException( - trim($description . "\n" . $f->getMessage()), - $f, - ); - } - - return true; - } - - /** - * Returns a string representation of the constraint. - */ - public function toString(bool $exportObjects = false): string - { - if (is_string($this->value)) { - if (str_contains($this->value, "\n")) { - return 'is equal to '; - } - - return sprintf( - "is equal to '%s'", - $this->value, - ); - } - - return sprintf( - 'is equal to %s', - Exporter::export($this->value, $exportObjects), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualIgnoringCase.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualIgnoringCase.php deleted file mode 100644 index f5b9b99..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualIgnoringCase.php +++ /dev/null @@ -1,104 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use function is_string; -use function sprintf; -use function str_contains; -use function trim; -use PHPUnit\Framework\ExpectationFailedException; -use PHPUnit\Util\Exporter; -use SebastianBergmann\Comparator\ComparisonFailure; -use SebastianBergmann\Comparator\Factory as ComparatorFactory; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class IsEqualIgnoringCase extends Constraint -{ - private readonly mixed $value; - - public function __construct(mixed $value) - { - $this->value = $value; - } - - /** - * Evaluates the constraint for parameter $other. - * - * If $returnResult is set to false (the default), an exception is thrown - * in case of a failure. null is returned otherwise. - * - * If $returnResult is true, the result of the evaluation is returned as - * a boolean value instead: true in case of success, false in case of a - * failure. - * - * @throws ExpectationFailedException - */ - public function evaluate(mixed $other, string $description = '', bool $returnResult = false): ?bool - { - // If $this->value and $other are identical, they are also equal. - // This is the most common path and will allow us to skip - // initialization of all the comparators. - if ($this->value === $other) { - return true; - } - - $comparatorFactory = ComparatorFactory::getInstance(); - - try { - $comparator = $comparatorFactory->getComparatorFor( - $this->value, - $other, - ); - - $comparator->assertEquals( - $this->value, - $other, - 0.0, - false, - true, - ); - } catch (ComparisonFailure $f) { - if ($returnResult) { - return false; - } - - throw new ExpectationFailedException( - trim($description . "\n" . $f->getMessage()), - $f, - ); - } - - return true; - } - - /** - * Returns a string representation of the constraint. - */ - public function toString(bool $exportObjects = false): string - { - if (is_string($this->value)) { - if (str_contains($this->value, "\n")) { - return 'is equal to '; - } - - return sprintf( - "is equal to '%s'", - $this->value, - ); - } - - return sprintf( - 'is equal to %s', - Exporter::export($this->value, $exportObjects), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualWithDelta.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualWithDelta.php deleted file mode 100644 index d587f6f..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualWithDelta.php +++ /dev/null @@ -1,92 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use function sprintf; -use function trim; -use PHPUnit\Framework\ExpectationFailedException; -use PHPUnit\Util\Exporter; -use SebastianBergmann\Comparator\ComparisonFailure; -use SebastianBergmann\Comparator\Factory as ComparatorFactory; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class IsEqualWithDelta extends Constraint -{ - private readonly mixed $value; - private readonly float $delta; - - public function __construct(mixed $value, float $delta) - { - $this->value = $value; - $this->delta = $delta; - } - - /** - * Evaluates the constraint for parameter $other. - * - * If $returnResult is set to false (the default), an exception is thrown - * in case of a failure. null is returned otherwise. - * - * If $returnResult is true, the result of the evaluation is returned as - * a boolean value instead: true in case of success, false in case of a - * failure. - * - * @throws ExpectationFailedException - */ - public function evaluate(mixed $other, string $description = '', bool $returnResult = false): ?bool - { - // If $this->value and $other are identical, they are also equal. - // This is the most common path and will allow us to skip - // initialization of all the comparators. - if ($this->value === $other) { - return true; - } - - $comparatorFactory = ComparatorFactory::getInstance(); - - try { - $comparator = $comparatorFactory->getComparatorFor( - $this->value, - $other, - ); - - $comparator->assertEquals( - $this->value, - $other, - $this->delta, - ); - } catch (ComparisonFailure $f) { - if ($returnResult) { - return false; - } - - throw new ExpectationFailedException( - trim($description . "\n" . $f->getMessage()), - $f, - ); - } - - return true; - } - - /** - * Returns a string representation of the constraint. - */ - public function toString(bool $exportObjects = false): string - { - return sprintf( - 'is equal to %s with delta <%F>', - Exporter::export($this->value, $exportObjects), - $this->delta, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Exception/Exception.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Exception/Exception.php deleted file mode 100644 index 3bbae76..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Exception/Exception.php +++ /dev/null @@ -1,81 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use function sprintf; -use PHPUnit\Util\Filter; -use Throwable; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Exception extends Constraint -{ - private readonly string $className; - - public function __construct(string $className) - { - $this->className = $className; - } - - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return sprintf( - 'exception of type "%s"', - $this->className, - ); - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - */ - protected function matches(mixed $other): bool - { - return $other instanceof $this->className; - } - - /** - * Returns the description of the failure. - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * @throws \PHPUnit\Framework\Exception - */ - protected function failureDescription(mixed $other): string - { - if ($other === null) { - return sprintf( - 'exception of type "%s" is thrown', - $this->className, - ); - } - - $message = ''; - - if ($other instanceof Throwable) { - $message = '. Message was: "' . $other->getMessage() . '" at' - . "\n" . Filter::getFilteredStacktrace($other); - } - - return sprintf( - 'exception of type "%s" matches expected exception "%s"%s', - $other::class, - $this->className, - $message, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionCode.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionCode.php deleted file mode 100644 index 338588e..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionCode.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use function sprintf; -use PHPUnit\Util\Exporter; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ExceptionCode extends Constraint -{ - private readonly int|string $expectedCode; - - public function __construct(int|string $expected) - { - $this->expectedCode = $expected; - } - - public function toString(): string - { - return 'exception code is ' . $this->expectedCode; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - */ - protected function matches(mixed $other): bool - { - return (string) $other === (string) $this->expectedCode; - } - - /** - * Returns the description of the failure. - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - */ - protected function failureDescription(mixed $other): string - { - return sprintf( - '%s is equal to expected exception code %s', - Exporter::export($other, true), - Exporter::export($this->expectedCode, true), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionMessageIsOrContains.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionMessageIsOrContains.php deleted file mode 100644 index ae92090..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionMessageIsOrContains.php +++ /dev/null @@ -1,69 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use function sprintf; -use function str_contains; -use PHPUnit\Util\Exporter; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ExceptionMessageIsOrContains extends Constraint -{ - private readonly string $expectedMessage; - - public function __construct(string $expectedMessage) - { - $this->expectedMessage = $expectedMessage; - } - - public function toString(): string - { - if ($this->expectedMessage === '') { - return 'exception message is empty'; - } - - return 'exception message contains ' . Exporter::export($this->expectedMessage); - } - - protected function matches(mixed $other): bool - { - if ($this->expectedMessage === '') { - return $other === ''; - } - - return str_contains((string) $other, $this->expectedMessage); - } - - /** - * Returns the description of the failure. - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - */ - protected function failureDescription(mixed $other): string - { - if ($this->expectedMessage === '') { - return sprintf( - "exception message is empty but is '%s'", - $other, - ); - } - - return sprintf( - "exception message '%s' contains '%s'", - $other, - $this->expectedMessage, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionMessageMatchesRegularExpression.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionMessageMatchesRegularExpression.php deleted file mode 100644 index 611af03..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionMessageMatchesRegularExpression.php +++ /dev/null @@ -1,73 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use function preg_match; -use function sprintf; -use Exception; -use PHPUnit\Util\Exporter; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ExceptionMessageMatchesRegularExpression extends Constraint -{ - private readonly string $regularExpression; - - public function __construct(string $regularExpression) - { - $this->regularExpression = $regularExpression; - } - - public function toString(): string - { - return 'exception message matches ' . Exporter::export($this->regularExpression); - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @throws \PHPUnit\Framework\Exception - * @throws Exception - */ - protected function matches(mixed $other): bool - { - $match = @preg_match($this->regularExpression, (string) $other); - - if ($match === false) { - throw new \PHPUnit\Framework\Exception( - sprintf( - 'Invalid expected exception message regular expression given: %s', - $this->regularExpression, - ), - ); - } - - return $match === 1; - } - - /** - * Returns the description of the failure. - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - */ - protected function failureDescription(mixed $other): string - { - return sprintf( - "exception message '%s' matches '%s'", - $other, - $this->regularExpression, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/DirectoryExists.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/DirectoryExists.php deleted file mode 100644 index 83b991e..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/DirectoryExists.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use function is_dir; -use function sprintf; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class DirectoryExists extends Constraint -{ - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return 'directory exists'; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - */ - protected function matches(mixed $other): bool - { - return is_dir($other); - } - - /** - * Returns the description of the failure. - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - */ - protected function failureDescription(mixed $other): string - { - return sprintf( - 'directory "%s" exists', - $other, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/FileExists.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/FileExists.php deleted file mode 100644 index cfc3b1b..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/FileExists.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use function file_exists; -use function sprintf; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class FileExists extends Constraint -{ - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return 'file exists'; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - */ - protected function matches(mixed $other): bool - { - return file_exists($other); - } - - /** - * Returns the description of the failure. - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - */ - protected function failureDescription(mixed $other): string - { - return sprintf( - 'file "%s" exists', - $other, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/IsReadable.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/IsReadable.php deleted file mode 100644 index 1a32546..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/IsReadable.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use function is_readable; -use function sprintf; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class IsReadable extends Constraint -{ - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return 'is readable'; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - */ - protected function matches(mixed $other): bool - { - return is_readable($other); - } - - /** - * Returns the description of the failure. - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - */ - protected function failureDescription(mixed $other): string - { - return sprintf( - '"%s" is readable', - $other, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/IsWritable.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/IsWritable.php deleted file mode 100644 index 24e94f8..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/IsWritable.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use function is_writable; -use function sprintf; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class IsWritable extends Constraint -{ - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return 'is writable'; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - */ - protected function matches(mixed $other): bool - { - return is_writable($other); - } - - /** - * Returns the description of the failure. - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - */ - protected function failureDescription(mixed $other): string - { - return sprintf( - '"%s" is writable', - $other, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/IsAnything.php b/vendor/phpunit/phpunit/src/Framework/Constraint/IsAnything.php deleted file mode 100644 index ef1b8bd..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/IsAnything.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use PHPUnit\Framework\ExpectationFailedException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class IsAnything extends Constraint -{ - /** - * Evaluates the constraint for parameter $other. - * - * If $returnResult is set to false (the default), an exception is thrown - * in case of a failure. null is returned otherwise. - * - * If $returnResult is true, the result of the evaluation is returned as - * a boolean value instead: true in case of success, false in case of a - * failure. - * - * @throws ExpectationFailedException - */ - public function evaluate(mixed $other, string $description = '', bool $returnResult = false): ?bool - { - return $returnResult ? true : null; - } - - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return 'is anything'; - } - - /** - * Counts the number of constraint elements. - */ - public function count(): int - { - return 0; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php b/vendor/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php deleted file mode 100644 index 48ef3d6..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php +++ /dev/null @@ -1,123 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use function explode; -use function gettype; -use function is_array; -use function is_object; -use function is_string; -use function sprintf; -use PHPUnit\Framework\ExpectationFailedException; -use PHPUnit\Util\Exporter; -use SebastianBergmann\Comparator\ComparisonFailure; -use UnitEnum; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class IsIdentical extends Constraint -{ - private readonly mixed $value; - - public function __construct(mixed $value) - { - $this->value = $value; - } - - /** - * Evaluates the constraint for parameter $other. - * - * If $returnResult is set to false (the default), an exception is thrown - * in case of a failure. null is returned otherwise. - * - * If $returnResult is true, the result of the evaluation is returned as - * a boolean value instead: true in case of success, false in case of a - * failure. - * - * @throws ExpectationFailedException - */ - public function evaluate(mixed $other, string $description = '', bool $returnResult = false): ?bool - { - $success = $this->value === $other; - - if ($returnResult) { - return $success; - } - - if (!$success) { - $f = null; - - // if both values are strings, make sure a diff is generated - if (is_string($this->value) && is_string($other)) { - $f = new ComparisonFailure( - $this->value, - $other, - sprintf("'%s'", $this->value), - sprintf("'%s'", $other), - ); - } - - // if both values are array or enums, make sure a diff is generated - if ((is_array($this->value) && is_array($other)) || ($this->value instanceof UnitEnum && $other instanceof UnitEnum)) { - $f = new ComparisonFailure( - $this->value, - $other, - Exporter::export($this->value, true), - Exporter::export($other, true), - ); - } - - $this->fail($other, $description, $f); - } - - return null; - } - - /** - * Returns a string representation of the constraint. - */ - public function toString(bool $exportObjects = false): string - { - if (is_object($this->value)) { - return 'is identical to an object of class "' . - $this->value::class . '"'; - } - - return 'is identical to ' . Exporter::export($this->value, $exportObjects); - } - - /** - * Returns the description of the failure. - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - */ - protected function failureDescription(mixed $other): string - { - if (is_object($this->value) && is_object($other)) { - return 'two variables reference the same object'; - } - - if (explode(' ', gettype($this->value), 2)[0] === 'resource' && explode(' ', gettype($other), 2)[0] === 'resource') { - return 'two variables reference the same resource'; - } - - if (is_string($this->value) && is_string($other)) { - return 'two strings are identical'; - } - - if (is_array($this->value) && is_array($other)) { - return 'two arrays are identical'; - } - - return parent::failureDescription($other); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php b/vendor/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php deleted file mode 100644 index dc3be3b..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php +++ /dev/null @@ -1,97 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use function json_decode; -use function sprintf; -use PHPUnit\Framework\ExpectationFailedException; -use PHPUnit\Util\InvalidJsonException; -use PHPUnit\Util\Json; -use SebastianBergmann\Comparator\ComparisonFailure; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class JsonMatches extends Constraint -{ - private readonly string $value; - - public function __construct(string $value) - { - $this->value = $value; - } - - /** - * Returns a string representation of the object. - */ - public function toString(): string - { - return sprintf( - 'matches JSON string "%s"', - $this->value, - ); - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * This method can be overridden to implement the evaluation algorithm. - */ - protected function matches(mixed $other): bool - { - [$error, $recodedOther] = Json::canonicalize($other); - - if ($error) { - return false; - } - - [$error, $recodedValue] = Json::canonicalize($this->value); - - if ($error) { - return false; - } - - return $recodedOther == $recodedValue; - } - - /** - * Throws an exception for the given compared value and test description. - * - * @throws ExpectationFailedException - * @throws InvalidJsonException - */ - protected function fail(mixed $other, string $description, ?ComparisonFailure $comparisonFailure = null): never - { - if ($comparisonFailure === null) { - [$error, $recodedOther] = Json::canonicalize($other); - - if ($error) { - parent::fail($other, $description); - } - - [$error, $recodedValue] = Json::canonicalize($this->value); - - if ($error) { - parent::fail($other, $description); - } - - $comparisonFailure = new ComparisonFailure( - json_decode($this->value), - json_decode($other), - Json::prettify($recodedValue), - Json::prettify($recodedOther), - 'Failed asserting that two json values are equal.', - ); - } - - parent::fail($other, $description, $comparisonFailure); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Math/IsFinite.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Math/IsFinite.php deleted file mode 100644 index b70de50..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Math/IsFinite.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use function is_finite; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class IsFinite extends Constraint -{ - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return 'is finite'; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - */ - protected function matches(mixed $other): bool - { - return is_finite($other); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Math/IsInfinite.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Math/IsInfinite.php deleted file mode 100644 index dbf4803..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Math/IsInfinite.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use function is_infinite; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class IsInfinite extends Constraint -{ - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return 'is infinite'; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - */ - protected function matches(mixed $other): bool - { - return is_infinite($other); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Math/IsNan.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Math/IsNan.php deleted file mode 100644 index f9c4721..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Math/IsNan.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use function is_nan; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class IsNan extends Constraint -{ - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return 'is nan'; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - */ - protected function matches(mixed $other): bool - { - return is_nan($other); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Object/ObjectEquals.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Object/ObjectEquals.php deleted file mode 100644 index b513545..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Object/ObjectEquals.php +++ /dev/null @@ -1,142 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use function is_object; -use PHPUnit\Framework\ActualValueIsNotAnObjectException; -use PHPUnit\Framework\ComparisonMethodDoesNotAcceptParameterTypeException; -use PHPUnit\Framework\ComparisonMethodDoesNotDeclareBoolReturnTypeException; -use PHPUnit\Framework\ComparisonMethodDoesNotDeclareExactlyOneParameterException; -use PHPUnit\Framework\ComparisonMethodDoesNotDeclareParameterTypeException; -use PHPUnit\Framework\ComparisonMethodDoesNotExistException; -use ReflectionNamedType; -use ReflectionObject; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class ObjectEquals extends Constraint -{ - private readonly object $expected; - private readonly string $method; - - public function __construct(object $object, string $method = 'equals') - { - $this->expected = $object; - $this->method = $method; - } - - public function toString(): string - { - return 'two objects are equal'; - } - - /** - * @throws ActualValueIsNotAnObjectException - * @throws ComparisonMethodDoesNotAcceptParameterTypeException - * @throws ComparisonMethodDoesNotDeclareBoolReturnTypeException - * @throws ComparisonMethodDoesNotDeclareExactlyOneParameterException - * @throws ComparisonMethodDoesNotDeclareParameterTypeException - * @throws ComparisonMethodDoesNotExistException - */ - protected function matches(mixed $other): bool - { - if (!is_object($other)) { - throw new ActualValueIsNotAnObjectException; - } - - $object = new ReflectionObject($other); - - if (!$object->hasMethod($this->method)) { - throw new ComparisonMethodDoesNotExistException( - $other::class, - $this->method, - ); - } - - $method = $object->getMethod($this->method); - - if (!$method->hasReturnType()) { - throw new ComparisonMethodDoesNotDeclareBoolReturnTypeException( - $other::class, - $this->method, - ); - } - - $returnType = $method->getReturnType(); - - if (!$returnType instanceof ReflectionNamedType) { - throw new ComparisonMethodDoesNotDeclareBoolReturnTypeException( - $other::class, - $this->method, - ); - } - - if ($returnType->allowsNull()) { - throw new ComparisonMethodDoesNotDeclareBoolReturnTypeException( - $other::class, - $this->method, - ); - } - - if ($returnType->getName() !== 'bool') { - throw new ComparisonMethodDoesNotDeclareBoolReturnTypeException( - $other::class, - $this->method, - ); - } - - if ($method->getNumberOfParameters() !== 1 || $method->getNumberOfRequiredParameters() !== 1) { - throw new ComparisonMethodDoesNotDeclareExactlyOneParameterException( - $other::class, - $this->method, - ); - } - - $parameter = $method->getParameters()[0]; - - if (!$parameter->hasType()) { - throw new ComparisonMethodDoesNotDeclareParameterTypeException( - $other::class, - $this->method, - ); - } - - $type = $parameter->getType(); - - if (!$type instanceof ReflectionNamedType) { - throw new ComparisonMethodDoesNotDeclareParameterTypeException( - $other::class, - $this->method, - ); - } - - $typeName = $type->getName(); - - if ($typeName === 'self') { - $typeName = $other::class; - } - - if (!$this->expected instanceof $typeName) { - throw new ComparisonMethodDoesNotAcceptParameterTypeException( - $other::class, - $this->method, - $this->expected::class, - ); - } - - return $other->{$this->method}($this->expected); - } - - protected function failureDescription(mixed $other): string - { - return $this->toString(true); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Object/ObjectHasProperty.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Object/ObjectHasProperty.php deleted file mode 100644 index 6c8bc41..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Object/ObjectHasProperty.php +++ /dev/null @@ -1,80 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use function gettype; -use function is_object; -use function sprintf; -use ReflectionObject; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class ObjectHasProperty extends Constraint -{ - private readonly string $propertyName; - - public function __construct(string $propertyName) - { - $this->propertyName = $propertyName; - } - - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return sprintf( - 'has property "%s"', - $this->propertyName, - ); - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other value or object to evaluate - */ - protected function matches(mixed $other): bool - { - if (!is_object($other)) { - return false; - } - - return (new ReflectionObject($other))->hasProperty($this->propertyName); - } - - /** - * Returns the description of the failure. - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * @param mixed $other evaluated value or object - */ - protected function failureDescription(mixed $other): string - { - if (is_object($other)) { - return sprintf( - 'object of class "%s" %s', - $other::class, - $this->toString(true), - ); - } - - return sprintf( - '"%s" (%s) %s', - $other, - gettype($other), - $this->toString(true), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Operator/BinaryOperator.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Operator/BinaryOperator.php deleted file mode 100644 index 4c3d8e4..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Operator/BinaryOperator.php +++ /dev/null @@ -1,132 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use function array_map; -use function count; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -abstract class BinaryOperator extends Operator -{ - /** - * @psalm-var list - */ - private readonly array $constraints; - - protected function __construct(mixed ...$constraints) - { - $this->constraints = array_map( - fn ($constraint): Constraint => $this->checkConstraint($constraint), - $constraints, - ); - } - - /** - * Returns the number of operands (constraints). - */ - final public function arity(): int - { - return count($this->constraints); - } - - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - $reduced = $this->reduce(); - - if ($reduced !== $this) { - return $reduced->toString(); - } - - $text = ''; - - foreach ($this->constraints as $key => $constraint) { - $constraint = $constraint->reduce(); - - $text .= $this->constraintToString($constraint, $key); - } - - return $text; - } - - /** - * Counts the number of constraint elements. - */ - public function count(): int - { - $count = 0; - - foreach ($this->constraints as $constraint) { - $count += count($constraint); - } - - return $count; - } - - /** - * @psalm-return list - */ - final protected function constraints(): array - { - return $this->constraints; - } - - /** - * Returns true if the $constraint needs to be wrapped with braces. - */ - final protected function constraintNeedsParentheses(Constraint $constraint): bool - { - return $this->arity() > 1 && parent::constraintNeedsParentheses($constraint); - } - - /** - * Reduces the sub-expression starting at $this by skipping degenerate - * sub-expression and returns first descendant constraint that starts - * a non-reducible sub-expression. - * - * See Constraint::reduce() for more. - */ - protected function reduce(): Constraint - { - if ($this->arity() === 1 && $this->constraints[0] instanceof Operator) { - return $this->constraints[0]->reduce(); - } - - return parent::reduce(); - } - - /** - * Returns string representation of given operand in context of this operator. - */ - private function constraintToString(Constraint $constraint, int $position): string - { - $prefix = ''; - - if ($position > 0) { - $prefix = (' ' . $this->operator() . ' '); - } - - if ($this->constraintNeedsParentheses($constraint)) { - return $prefix . '( ' . $constraint->toString() . ' )'; - } - - $string = $constraint->toStringInContext($this, $position); - - if ($string === '') { - $string = $constraint->toString(); - } - - return $prefix . $string; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalAnd.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalAnd.php deleted file mode 100644 index e0a00a0..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalAnd.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class LogicalAnd extends BinaryOperator -{ - public static function fromConstraints(mixed ...$constraints): self - { - return new self(...$constraints); - } - - /** - * Returns the name of this operator. - */ - public function operator(): string - { - return 'and'; - } - - /** - * Returns this operator's precedence. - * - * @see https://www.php.net/manual/en/language.operators.precedence.php - */ - public function precedence(): int - { - return 22; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - */ - protected function matches(mixed $other): bool - { - foreach ($this->constraints() as $constraint) { - if (!$constraint->evaluate($other, '', true)) { - return false; - } - } - - return [] !== $this->constraints(); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalNot.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalNot.php deleted file mode 100644 index 837e3a5..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalNot.php +++ /dev/null @@ -1,141 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use function array_map; -use function count; -use function preg_match; -use function preg_quote; -use function preg_replace; -use PHPUnit\Framework\ExpectationFailedException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class LogicalNot extends UnaryOperator -{ - public static function negate(string $string): string - { - $positives = [ - 'contains ', - 'exists', - 'has ', - 'is ', - 'are ', - 'matches ', - 'starts with ', - 'ends with ', - 'reference ', - 'not not ', - ]; - - $negatives = [ - 'does not contain ', - 'does not exist', - 'does not have ', - 'is not ', - 'are not ', - 'does not match ', - 'starts not with ', - 'ends not with ', - 'don\'t reference ', - 'not ', - ]; - - preg_match('/(\'[\w\W]*\')([\w\W]*)("[\w\W]*")/i', $string, $matches); - - if (count($matches) === 0) { - preg_match('/(\'[\w\W]*\')([\w\W]*)(\'[\w\W]*\')/i', $string, $matches); - } - - $positives = array_map( - static fn (string $s) => '/\\b' . preg_quote($s, '/') . '/', - $positives, - ); - - if (count($matches) > 0) { - $nonInput = $matches[2]; - - $negatedString = preg_replace( - '/' . preg_quote($nonInput, '/') . '/', - preg_replace( - $positives, - $negatives, - $nonInput, - ), - $string, - ); - } else { - $negatedString = preg_replace( - $positives, - $negatives, - $string, - ); - } - - return $negatedString; - } - - /** - * Returns the name of this operator. - */ - public function operator(): string - { - return 'not'; - } - - /** - * Returns this operator's precedence. - * - * @see https://www.php.net/manual/en/language.operators.precedence.php - */ - public function precedence(): int - { - return 5; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @throws ExpectationFailedException - */ - protected function matches(mixed $other): bool - { - return !$this->constraint()->evaluate($other, '', true); - } - - /** - * Applies additional transformation to strings returned by toString() or - * failureDescription(). - */ - protected function transformString(string $string): string - { - return self::negate($string); - } - - /** - * Reduces the sub-expression starting at $this by skipping degenerate - * sub-expression and returns first descendant constraint that starts - * a non-reducible sub-expression. - * - * See Constraint::reduce() for more. - */ - protected function reduce(): Constraint - { - $constraint = $this->constraint(); - - if ($constraint instanceof self) { - return $constraint->constraint()->reduce(); - } - - return parent::reduce(); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalOr.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalOr.php deleted file mode 100644 index cbd87b9..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalOr.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class LogicalOr extends BinaryOperator -{ - public static function fromConstraints(mixed ...$constraints): self - { - return new self(...$constraints); - } - - /** - * Returns the name of this operator. - */ - public function operator(): string - { - return 'or'; - } - - /** - * Returns this operator's precedence. - * - * @see https://www.php.net/manual/en/language.operators.precedence.php - */ - public function precedence(): int - { - return 24; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - */ - public function matches(mixed $other): bool - { - foreach ($this->constraints() as $constraint) { - if ($constraint->evaluate($other, '', true)) { - return true; - } - } - - return false; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalXor.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalXor.php deleted file mode 100644 index e8ffc34..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalXor.php +++ /dev/null @@ -1,66 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use function array_reduce; -use function array_shift; -use PHPUnit\Framework\ExpectationFailedException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class LogicalXor extends BinaryOperator -{ - public static function fromConstraints(mixed ...$constraints): self - { - return new self(...$constraints); - } - - /** - * Returns the name of this operator. - */ - public function operator(): string - { - return 'xor'; - } - - /** - * Returns this operator's precedence. - * - * @see https://www.php.net/manual/en/language.operators.precedence.php. - */ - public function precedence(): int - { - return 23; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @throws ExpectationFailedException - */ - public function matches(mixed $other): bool - { - $constraints = $this->constraints(); - - $initial = array_shift($constraints); - - if ($initial === null) { - return false; - } - - return array_reduce( - $constraints, - static fn (bool $matches, Constraint $constraint): bool => $matches xor $constraint->evaluate($other, '', true), - $initial->evaluate($other, '', true), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Operator/Operator.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Operator/Operator.php deleted file mode 100644 index 1195156..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Operator/Operator.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -abstract class Operator extends Constraint -{ - /** - * Returns the name of this operator. - */ - abstract public function operator(): string; - - /** - * Returns this operator's precedence. - * - * @see https://www.php.net/manual/en/language.operators.precedence.php - */ - abstract public function precedence(): int; - - /** - * Returns the number of operands. - */ - abstract public function arity(): int; - - /** - * Validates $constraint argument. - */ - protected function checkConstraint(mixed $constraint): Constraint - { - if (!$constraint instanceof Constraint) { - return new IsEqual($constraint); - } - - return $constraint; - } - - /** - * Returns true if the $constraint needs to be wrapped with braces. - */ - protected function constraintNeedsParentheses(Constraint $constraint): bool - { - return $constraint instanceof self && - $constraint->arity() > 1 && - $this->precedence() <= $constraint->precedence(); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Operator/UnaryOperator.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Operator/UnaryOperator.php deleted file mode 100644 index d6ac6e3..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Operator/UnaryOperator.php +++ /dev/null @@ -1,128 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use function count; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -abstract class UnaryOperator extends Operator -{ - private readonly Constraint $constraint; - - public function __construct(mixed $constraint) - { - $this->constraint = $this->checkConstraint($constraint); - } - - /** - * Returns the number of operands (constraints). - */ - public function arity(): int - { - return 1; - } - - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - $reduced = $this->reduce(); - - if ($reduced !== $this) { - return $reduced->toString(); - } - - $constraint = $this->constraint->reduce(); - - if ($this->constraintNeedsParentheses($constraint)) { - return $this->operator() . '( ' . $constraint->toString() . ' )'; - } - - $string = $constraint->toStringInContext($this, 0); - - if ($string === '') { - return $this->transformString($constraint->toString()); - } - - return $string; - } - - /** - * Counts the number of constraint elements. - */ - public function count(): int - { - return count($this->constraint); - } - - /** - * Returns the description of the failure. - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - */ - protected function failureDescription(mixed $other): string - { - $reduced = $this->reduce(); - - if ($reduced !== $this) { - return $reduced->failureDescription($other); - } - - $constraint = $this->constraint->reduce(); - - if ($this->constraintNeedsParentheses($constraint)) { - return $this->operator() . '( ' . $constraint->failureDescription($other) . ' )'; - } - - $string = $constraint->failureDescriptionInContext($this, 0, $other); - - if ($string === '') { - return $this->transformString($constraint->failureDescription($other)); - } - - return $string; - } - - /** - * Transforms string returned by the member constraint's toString() or - * failureDescription() such that it reflects constraint's participation in - * this expression. - * - * The method may be overwritten in a subclass to apply default - * transformation in case the operand constraint does not provide its own - * custom strings via toStringInContext() or failureDescriptionInContext(). - */ - protected function transformString(string $string): string - { - return $string; - } - - /** - * Provides access to $this->constraint for subclasses. - */ - final protected function constraint(): Constraint - { - return $this->constraint; - } - - /** - * Returns true if the $constraint needs to be wrapped with parentheses. - */ - protected function constraintNeedsParentheses(Constraint $constraint): bool - { - $constraint = $constraint->reduce(); - - return $constraint instanceof self || parent::constraintNeedsParentheses($constraint); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/String/IsJson.php b/vendor/phpunit/phpunit/src/Framework/Constraint/String/IsJson.php deleted file mode 100644 index 79b2c70..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/String/IsJson.php +++ /dev/null @@ -1,91 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use const JSON_ERROR_CTRL_CHAR; -use const JSON_ERROR_DEPTH; -use const JSON_ERROR_NONE; -use const JSON_ERROR_STATE_MISMATCH; -use const JSON_ERROR_SYNTAX; -use const JSON_ERROR_UTF8; -use function is_string; -use function json_decode; -use function json_last_error; -use function sprintf; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class IsJson extends Constraint -{ - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return 'is valid JSON'; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - */ - protected function matches(mixed $other): bool - { - if (!is_string($other) || $other === '') { - return false; - } - - json_decode($other); - - if (json_last_error()) { - return false; - } - - return true; - } - - /** - * Returns the description of the failure. - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - */ - protected function failureDescription(mixed $other): string - { - if (!is_string($other)) { - return $this->valueToTypeStringFragment($other) . 'is valid JSON'; - } - - if ($other === '') { - return 'an empty string is valid JSON'; - } - - return sprintf( - 'a string is valid JSON (%s)', - $this->determineJsonError($other), - ); - } - - private function determineJsonError(string $json): string - { - json_decode($json); - - return match (json_last_error()) { - JSON_ERROR_NONE => '', - JSON_ERROR_DEPTH => 'Maximum stack depth exceeded', - JSON_ERROR_STATE_MISMATCH => 'Underflow or the modes mismatch', - JSON_ERROR_CTRL_CHAR => 'Unexpected control character found', - JSON_ERROR_SYNTAX => 'Syntax error, malformed JSON', - JSON_ERROR_UTF8 => 'Malformed UTF-8 characters, possibly incorrectly encoded', - default => 'Unknown error', - }; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/String/RegularExpression.php b/vendor/phpunit/phpunit/src/Framework/Constraint/String/RegularExpression.php deleted file mode 100644 index 03b0e4e..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/String/RegularExpression.php +++ /dev/null @@ -1,46 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use function preg_match; -use function sprintf; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class RegularExpression extends Constraint -{ - private readonly string $pattern; - - public function __construct(string $pattern) - { - $this->pattern = $pattern; - } - - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return sprintf( - 'matches PCRE pattern "%s"', - $this->pattern, - ); - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - */ - protected function matches(mixed $other): bool - { - return preg_match($this->pattern, $other) > 0; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/String/StringContains.php b/vendor/phpunit/phpunit/src/Framework/Constraint/String/StringContains.php deleted file mode 100644 index 7a805ed..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/String/StringContains.php +++ /dev/null @@ -1,160 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use function is_string; -use function mb_detect_encoding; -use function mb_stripos; -use function mb_strtolower; -use function sprintf; -use function str_contains; -use function strlen; -use function strtr; -use PHPUnit\Util\Exporter; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class StringContains extends Constraint -{ - private readonly string $needle; - private readonly bool $ignoreCase; - private readonly bool $ignoreLineEndings; - - public function __construct(string $needle, bool $ignoreCase = false, bool $ignoreLineEndings = false) - { - if ($ignoreLineEndings) { - $needle = $this->normalizeLineEndings($needle); - } - - $this->needle = $needle; - $this->ignoreCase = $ignoreCase; - $this->ignoreLineEndings = $ignoreLineEndings; - } - - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - $needle = $this->needle; - - if ($this->ignoreCase) { - $needle = mb_strtolower($this->needle, 'UTF-8'); - } - - return sprintf( - 'contains "%s" [%s](length: %s)', - $needle, - $this->getDetectedEncoding($needle), - strlen($needle), - ); - } - - public function failureDescription(mixed $other): string - { - $stringifiedHaystack = Exporter::export($other, true); - $haystackEncoding = $this->getDetectedEncoding($other); - $haystackLength = $this->getHaystackLength($other); - - $haystackInformation = sprintf( - '%s [%s](length: %s) ', - $stringifiedHaystack, - $haystackEncoding, - $haystackLength, - ); - - $needleInformation = $this->toString(true); - - return $haystackInformation . $needleInformation; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - */ - protected function matches(mixed $other): bool - { - $haystack = $other; - - if ('' === $this->needle) { - return true; - } - - if (!is_string($haystack)) { - return false; - } - - if ($this->ignoreLineEndings) { - $haystack = $this->normalizeLineEndings($haystack); - } - - if ($this->ignoreCase) { - /* - * We must use the multibyte-safe version, so we can accurately compare non-latin uppercase characters with - * their lowercase equivalents. - */ - return mb_stripos($haystack, $this->needle, 0, 'UTF-8') !== false; - } - - /* - * Use the non-multibyte safe functions to see if the string is contained in $other. - * - * This function is very fast, and we don't care about the character position in the string. - * - * Additionally, we want this method to be binary safe, so we can check if some binary data is in other binary - * data. - */ - return str_contains($haystack, $this->needle); - } - - private function getDetectedEncoding(mixed $other): string - { - if ($this->ignoreCase) { - return 'Encoding ignored'; - } - - if (!is_string($other)) { - return 'Encoding detection failed'; - } - - $detectedEncoding = mb_detect_encoding($other, null, true); - - if ($detectedEncoding === false) { - return 'Encoding detection failed'; - } - - return $detectedEncoding; - } - - private function getHaystackLength(mixed $haystack): int - { - if (!is_string($haystack)) { - return 0; - } - - if ($this->ignoreLineEndings) { - $haystack = $this->normalizeLineEndings($haystack); - } - - return strlen($haystack); - } - - private function normalizeLineEndings(string $string): string - { - return strtr( - $string, - [ - "\r\n" => "\n", - "\r" => "\n", - ], - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/String/StringEndsWith.php b/vendor/phpunit/phpunit/src/Framework/Constraint/String/StringEndsWith.php deleted file mode 100644 index 1dd43b8..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/String/StringEndsWith.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use function str_ends_with; -use PHPUnit\Framework\EmptyStringException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class StringEndsWith extends Constraint -{ - private readonly string $suffix; - - /** - * @throws EmptyStringException - */ - public function __construct(string $suffix) - { - if ($suffix === '') { - throw new EmptyStringException; - } - - $this->suffix = $suffix; - } - - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return 'ends with "' . $this->suffix . '"'; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - */ - protected function matches(mixed $other): bool - { - return str_ends_with((string) $other, $this->suffix); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/String/StringEqualsStringIgnoringLineEndings.php b/vendor/phpunit/phpunit/src/Framework/Constraint/String/StringEqualsStringIgnoringLineEndings.php deleted file mode 100644 index 56c5994..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/String/StringEqualsStringIgnoringLineEndings.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use function sprintf; -use function strtr; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class StringEqualsStringIgnoringLineEndings extends Constraint -{ - private readonly string $string; - - public function __construct(string $string) - { - $this->string = $this->normalizeLineEndings($string); - } - - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return sprintf( - 'is equal to "%s" ignoring line endings', - $this->string, - ); - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - */ - protected function matches(mixed $other): bool - { - return $this->string === $this->normalizeLineEndings((string) $other); - } - - private function normalizeLineEndings(string $string): string - { - return strtr( - $string, - [ - "\r\n" => "\n", - "\r" => "\n", - ], - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/String/StringMatchesFormatDescription.php b/vendor/phpunit/phpunit/src/Framework/Constraint/String/StringMatchesFormatDescription.php deleted file mode 100644 index f9659e2..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/String/StringMatchesFormatDescription.php +++ /dev/null @@ -1,117 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use const DIRECTORY_SEPARATOR; -use const PHP_EOL; -use function explode; -use function implode; -use function preg_match; -use function preg_quote; -use function preg_replace; -use function strtr; -use SebastianBergmann\Diff\Differ; -use SebastianBergmann\Diff\Output\UnifiedDiffOutputBuilder; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class StringMatchesFormatDescription extends Constraint -{ - private readonly string $formatDescription; - - public function __construct(string $formatDescription) - { - $this->formatDescription = $formatDescription; - } - - public function toString(): string - { - return 'matches format description:' . PHP_EOL . $this->formatDescription; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - */ - protected function matches(mixed $other): bool - { - $other = $this->convertNewlines($other); - - $matches = preg_match( - $this->regularExpressionForFormatDescription( - $this->convertNewlines($this->formatDescription), - ), - $other, - ); - - return $matches > 0; - } - - protected function failureDescription(mixed $other): string - { - return 'string matches format description'; - } - - protected function additionalFailureDescription(mixed $other): string - { - $from = explode("\n", $this->formatDescription); - $to = explode("\n", $this->convertNewlines($other)); - - foreach ($from as $index => $line) { - if (isset($to[$index]) && $line !== $to[$index]) { - $line = $this->regularExpressionForFormatDescription($line); - - if (preg_match($line, $to[$index]) > 0) { - $from[$index] = $to[$index]; - } - } - } - - $from = implode("\n", $from); - $to = implode("\n", $to); - - return $this->differ()->diff($from, $to); - } - - private function regularExpressionForFormatDescription(string $string): string - { - $string = strtr( - preg_quote($string, '/'), - [ - '%%' => '%', - '%e' => preg_quote(DIRECTORY_SEPARATOR, '/'), - '%s' => '[^\r\n]+', - '%S' => '[^\r\n]*', - '%a' => '.+?', - '%A' => '.*?', - '%w' => '\s*', - '%i' => '[+-]?\d+', - '%d' => '\d+', - '%x' => '[0-9a-fA-F]+', - '%f' => '[+-]?(?:\d+|(?=\.\d))(?:\.\d+)?(?:[Ee][+-]?\d+)?', - '%c' => '.', - '%0' => '\x00', - ], - ); - - return '/^' . $string . '$/s'; - } - - private function convertNewlines(string $text): string - { - return preg_replace('/\r\n/', "\n", $text); - } - - private function differ(): Differ - { - return new Differ(new UnifiedDiffOutputBuilder("--- Expected\n+++ Actual\n")); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/String/StringStartsWith.php b/vendor/phpunit/phpunit/src/Framework/Constraint/String/StringStartsWith.php deleted file mode 100644 index eee545c..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/String/StringStartsWith.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use function str_starts_with; -use PHPUnit\Framework\EmptyStringException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class StringStartsWith extends Constraint -{ - private readonly string $prefix; - - /** - * @throws EmptyStringException - */ - public function __construct(string $prefix) - { - if ($prefix === '') { - throw new EmptyStringException; - } - - $this->prefix = $prefix; - } - - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return 'starts with "' . $this->prefix . '"'; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - */ - protected function matches(mixed $other): bool - { - return str_starts_with((string) $other, $this->prefix); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/ArrayHasKey.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/ArrayHasKey.php deleted file mode 100644 index db8251e..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/ArrayHasKey.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use function array_key_exists; -use function is_array; -use ArrayAccess; -use PHPUnit\Util\Exporter; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class ArrayHasKey extends Constraint -{ - private readonly mixed $key; - - public function __construct(mixed $key) - { - $this->key = $key; - } - - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return 'has the key ' . Exporter::export($this->key); - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - */ - protected function matches(mixed $other): bool - { - if (is_array($other)) { - return array_key_exists($this->key, $other); - } - - if ($other instanceof ArrayAccess) { - return $other->offsetExists($this->key); - } - - return false; - } - - /** - * Returns the description of the failure. - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - */ - protected function failureDescription(mixed $other): string - { - return 'an array ' . $this->toString(true); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/IsList.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/IsList.php deleted file mode 100644 index 2e2f60c..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/IsList.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use function array_is_list; -use function is_array; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class IsList extends Constraint -{ - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return 'is a list'; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - */ - protected function matches(mixed $other): bool - { - if (!is_array($other)) { - return false; - } - - return array_is_list($other); - } - - /** - * Returns the description of the failure. - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - */ - protected function failureDescription(mixed $other): string - { - return $this->valueToTypeStringFragment($other) . $this->toString(true); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContains.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContains.php deleted file mode 100644 index 770bdb8..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContains.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use function is_array; -use function sprintf; -use PHPUnit\Util\Exporter; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -abstract class TraversableContains extends Constraint -{ - private readonly mixed $value; - - public function __construct(mixed $value) - { - $this->value = $value; - } - - /** - * Returns a string representation of the constraint. - */ - public function toString(bool $exportObjects = false): string - { - return 'contains ' . Exporter::export($this->value, $exportObjects); - } - - /** - * Returns the description of the failure. - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - */ - protected function failureDescription(mixed $other): string - { - return sprintf( - '%s %s', - is_array($other) ? 'an array' : 'a traversable', - $this->toString(true), - ); - } - - protected function value(): mixed - { - return $this->value; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsEqual.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsEqual.php deleted file mode 100644 index 0877bc2..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsEqual.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use SplObjectStorage; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class TraversableContainsEqual extends TraversableContains -{ - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - */ - protected function matches(mixed $other): bool - { - if ($other instanceof SplObjectStorage) { - return $other->offsetExists($this->value()); - } - - foreach ($other as $element) { - /* @noinspection TypeUnsafeComparisonInspection */ - if ($this->value() == $element) { - return true; - } - } - - return false; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsIdentical.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsIdentical.php deleted file mode 100644 index b4e2953..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsIdentical.php +++ /dev/null @@ -1,37 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use SplObjectStorage; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class TraversableContainsIdentical extends TraversableContains -{ - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - */ - protected function matches(mixed $other): bool - { - if ($other instanceof SplObjectStorage) { - return $other->offsetExists($this->value()); - } - - foreach ($other as $element) { - if ($this->value() === $element) { - return true; - } - } - - return false; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsOnly.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsOnly.php deleted file mode 100644 index 274d76f..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsOnly.php +++ /dev/null @@ -1,75 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use PHPUnit\Framework\Exception; -use PHPUnit\Framework\ExpectationFailedException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class TraversableContainsOnly extends Constraint -{ - private Constraint $constraint; - private readonly string $type; - - /** - * @throws Exception - */ - public function __construct(string $type, bool $isNativeType = true) - { - if ($isNativeType) { - $this->constraint = new IsType($type); - } else { - $this->constraint = new IsInstanceOf($type); - } - - $this->type = $type; - } - - /** - * Evaluates the constraint for parameter $other. - * - * If $returnResult is set to false (the default), an exception is thrown - * in case of a failure. null is returned otherwise. - * - * If $returnResult is true, the result of the evaluation is returned as - * a boolean value instead: true in case of success, false in case of a - * failure. - * - * @throws ExpectationFailedException - */ - public function evaluate(mixed $other, string $description = '', bool $returnResult = false): bool - { - $success = true; - - foreach ($other as $item) { - if (!$this->constraint->evaluate($item, '', true)) { - $success = false; - - break; - } - } - - if (!$success && !$returnResult) { - $this->fail($other, $description); - } - - return $success; - } - - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return 'contains only values of type "' . $this->type . '"'; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Type/IsInstanceOf.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Type/IsInstanceOf.php deleted file mode 100644 index e69f4f8..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Type/IsInstanceOf.php +++ /dev/null @@ -1,79 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use function class_exists; -use function interface_exists; -use function sprintf; -use PHPUnit\Framework\UnknownClassOrInterfaceException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class IsInstanceOf extends Constraint -{ - /** - * @psalm-var class-string - */ - private readonly string $name; - - /** - * @psalm-var 'class'|'interface' - */ - private readonly string $type; - - /** - * @throws UnknownClassOrInterfaceException - */ - public function __construct(string $name) - { - if (class_exists($name)) { - $this->type = 'class'; - } elseif (interface_exists($name)) { - $this->type = 'interface'; - } else { - throw new UnknownClassOrInterfaceException($name); - } - - $this->name = $name; - } - - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return sprintf( - 'is an instance of %s %s', - $this->type, - $this->name, - ); - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - */ - protected function matches(mixed $other): bool - { - return $other instanceof $this->name; - } - - /** - * Returns the description of the failure. - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - */ - protected function failureDescription(mixed $other): string - { - return $this->valueToTypeStringFragment($other) . $this->toString(true); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Type/IsNull.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Type/IsNull.php deleted file mode 100644 index 37c89f7..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Type/IsNull.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class IsNull extends Constraint -{ - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return 'is null'; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - */ - protected function matches(mixed $other): bool - { - return $other === null; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Type/IsType.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Type/IsType.php deleted file mode 100644 index 84c422f..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Type/IsType.php +++ /dev/null @@ -1,205 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use function gettype; -use function is_array; -use function is_bool; -use function is_callable; -use function is_float; -use function is_int; -use function is_iterable; -use function is_numeric; -use function is_object; -use function is_scalar; -use function is_string; -use function sprintf; -use PHPUnit\Framework\UnknownTypeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class IsType extends Constraint -{ - /** - * @var string - */ - public const TYPE_ARRAY = 'array'; - - /** - * @var string - */ - public const TYPE_BOOL = 'bool'; - - /** - * @var string - */ - public const TYPE_FLOAT = 'float'; - - /** - * @var string - */ - public const TYPE_INT = 'int'; - - /** - * @var string - */ - public const TYPE_NULL = 'null'; - - /** - * @var string - */ - public const TYPE_NUMERIC = 'numeric'; - - /** - * @var string - */ - public const TYPE_OBJECT = 'object'; - - /** - * @var string - */ - public const TYPE_RESOURCE = 'resource'; - - /** - * @var string - */ - public const TYPE_CLOSED_RESOURCE = 'resource (closed)'; - - /** - * @var string - */ - public const TYPE_STRING = 'string'; - - /** - * @var string - */ - public const TYPE_SCALAR = 'scalar'; - - /** - * @var string - */ - public const TYPE_CALLABLE = 'callable'; - - /** - * @var string - */ - public const TYPE_ITERABLE = 'iterable'; - - /** - * @psalm-var array - */ - private const KNOWN_TYPES = [ - 'array' => true, - 'boolean' => true, - 'bool' => true, - 'double' => true, - 'float' => true, - 'integer' => true, - 'int' => true, - 'null' => true, - 'numeric' => true, - 'object' => true, - 'real' => true, - 'resource' => true, - 'resource (closed)' => true, - 'string' => true, - 'scalar' => true, - 'callable' => true, - 'iterable' => true, - ]; - - /** - * @psalm-var 'array'|'boolean'|'bool'|'double'|'float'|'integer'|'int'|'null'|'numeric'|'object'|'real'|'resource'|'resource (closed)'|'string'|'scalar'|'callable'|'iterable' - */ - private readonly string $type; - - /** - * @psalm-param 'array'|'boolean'|'bool'|'double'|'float'|'integer'|'int'|'null'|'numeric'|'object'|'real'|'resource'|'resource (closed)'|'string'|'scalar'|'callable'|'iterable' $type - * - * @throws UnknownTypeException - */ - public function __construct(string $type) - { - if (!isset(self::KNOWN_TYPES[$type])) { - throw new UnknownTypeException($type); - } - - $this->type = $type; - } - - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return sprintf( - 'is of type %s', - $this->type, - ); - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - */ - protected function matches(mixed $other): bool - { - switch ($this->type) { - case 'numeric': - return is_numeric($other); - - case 'integer': - case 'int': - return is_int($other); - - case 'double': - case 'float': - case 'real': - return is_float($other); - - case 'string': - return is_string($other); - - case 'boolean': - case 'bool': - return is_bool($other); - - case 'null': - return null === $other; - - case 'array': - return is_array($other); - - case 'object': - return is_object($other); - - case 'resource': - $type = gettype($other); - - return $type === 'resource' || $type === 'resource (closed)'; - - case 'resource (closed)': - return gettype($other) === 'resource (closed)'; - - case 'scalar': - return is_scalar($other); - - case 'callable': - return is_callable($other); - - case 'iterable': - return is_iterable($other); - - default: - return false; - } - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/DataProviderTestSuite.php b/vendor/phpunit/phpunit/src/Framework/DataProviderTestSuite.php deleted file mode 100644 index e506cec..0000000 --- a/vendor/phpunit/phpunit/src/Framework/DataProviderTestSuite.php +++ /dev/null @@ -1,76 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -use function explode; -use PHPUnit\Framework\TestSize\TestSize; -use PHPUnit\Metadata\Api\Groups; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class DataProviderTestSuite extends TestSuite -{ - /** - * @psalm-var list - */ - private array $dependencies = []; - private ?array $providedTests = null; - - /** - * @psalm-param list $dependencies - */ - public function setDependencies(array $dependencies): void - { - $this->dependencies = $dependencies; - - foreach ($this->tests() as $test) { - if (!$test instanceof TestCase) { - continue; - } - - $test->setDependencies($dependencies); - } - } - - /** - * @psalm-return list - */ - public function provides(): array - { - if ($this->providedTests === null) { - $this->providedTests = [new ExecutionOrderDependency($this->name())]; - } - - return $this->providedTests; - } - - /** - * @psalm-return list - */ - public function requires(): array - { - // A DataProviderTestSuite does not have to traverse its child tests - // as these are inherited and cannot reference dataProvider rows directly - return $this->dependencies; - } - - /** - * Returns the size of each test created using the data provider(s). - */ - public function size(): TestSize - { - [$className, $methodName] = explode('::', $this->name()); - - return (new Groups)->size($className, $methodName); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/AssertionFailedError.php b/vendor/phpunit/phpunit/src/Framework/Exception/AssertionFailedError.php deleted file mode 100644 index 6bd59c4..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/AssertionFailedError.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -class AssertionFailedError extends Exception implements SelfDescribing -{ - /** - * Wrapper for getMessage() which is declared as final. - */ - public function toString(): string - { - return $this->getMessage(); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/CodeCoverageException.php b/vendor/phpunit/phpunit/src/Framework/Exception/CodeCoverageException.php deleted file mode 100644 index 41169ff..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/CodeCoverageException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -class CodeCoverageException extends Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/EmptyStringException.php b/vendor/phpunit/phpunit/src/Framework/Exception/EmptyStringException.php deleted file mode 100644 index f5980cd..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/EmptyStringException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class EmptyStringException extends InvalidArgumentException -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/Exception.php b/vendor/phpunit/phpunit/src/Framework/Exception/Exception.php deleted file mode 100644 index 2ee4e98..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/Exception.php +++ /dev/null @@ -1,82 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -use function array_keys; -use function get_object_vars; -use function is_int; -use function sprintf; -use RuntimeException; -use Throwable; - -/** - * Base class for all PHPUnit Framework exceptions. - * - * Ensures that exceptions thrown during a test run do not leave stray - * references behind. - * - * Every Exception contains a stack trace. Each stack frame contains the 'args' - * of the called function. The function arguments can contain references to - * instantiated objects. The references prevent the objects from being - * destructed (until test results are eventually printed), so memory cannot be - * freed up. - * - * With enabled process isolation, test results are serialized in the child - * process and unserialized in the parent process. The stack trace of Exceptions - * may contain objects that cannot be serialized or unserialized (e.g., PDO - * connections). Unserializing user-space objects from the child process into - * the parent would break the intended encapsulation of process isolation. - * - * @see http://fabien.potencier.org/article/9/php-serialization-stack-traces-and-exceptions - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -class Exception extends RuntimeException implements \PHPUnit\Exception -{ - protected array $serializableTrace; - - public function __construct(string $message = '', int|string $code = 0, ?Throwable $previous = null) - { - /** - * @see https://github.com/sebastianbergmann/phpunit/issues/5965 - */ - if (!is_int($code)) { - $message .= sprintf( - ' (exception code: %s)', - $code, - ); - - $code = 0; - } - - parent::__construct($message, $code, $previous); - - $this->serializableTrace = $this->getTrace(); - - foreach (array_keys($this->serializableTrace) as $key) { - unset($this->serializableTrace[$key]['args']); - } - } - - public function __serialize(): array - { - return get_object_vars($this); - } - - /** - * Returns the serializable trace (without 'args'). - */ - public function getSerializableTrace(): array - { - return $this->serializableTrace; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/ExpectationFailedException.php b/vendor/phpunit/phpunit/src/Framework/Exception/ExpectationFailedException.php deleted file mode 100644 index c46a27b..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/ExpectationFailedException.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -use Exception; -use SebastianBergmann\Comparator\ComparisonFailure; - -/** - * Exception for expectations which failed their check. - * - * The exception contains the error message and optionally a - * SebastianBergmann\Comparator\ComparisonFailure which is used to - * generate diff output of the failed expectations. - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class ExpectationFailedException extends AssertionFailedError -{ - protected ?ComparisonFailure $comparisonFailure = null; - - public function __construct(string $message, ?ComparisonFailure $comparisonFailure = null, ?Exception $previous = null) - { - $this->comparisonFailure = $comparisonFailure; - - parent::__construct($message, 0, $previous); - } - - public function getComparisonFailure(): ?ComparisonFailure - { - return $this->comparisonFailure; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/GeneratorNotSupportedException.php b/vendor/phpunit/phpunit/src/Framework/Exception/GeneratorNotSupportedException.php deleted file mode 100644 index b3b1795..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/GeneratorNotSupportedException.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -use function sprintf; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class GeneratorNotSupportedException extends InvalidArgumentException -{ - public static function fromParameterName(string $parameterName): self - { - return new self( - sprintf( - 'Passing an argument of type Generator for the %s parameter is not supported', - $parameterName, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/Incomplete/IncompleteTest.php b/vendor/phpunit/phpunit/src/Framework/Exception/Incomplete/IncompleteTest.php deleted file mode 100644 index 39637fc..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/Incomplete/IncompleteTest.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -use Throwable; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This interface is not covered by the backward compatibility promise for PHPUnit - */ -interface IncompleteTest extends Throwable -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/Incomplete/IncompleteTestError.php b/vendor/phpunit/phpunit/src/Framework/Exception/Incomplete/IncompleteTestError.php deleted file mode 100644 index a45564d..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/Incomplete/IncompleteTestError.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class IncompleteTestError extends AssertionFailedError implements IncompleteTest -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/InvalidArgumentException.php b/vendor/phpunit/phpunit/src/Framework/Exception/InvalidArgumentException.php deleted file mode 100644 index 700abf0..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/InvalidArgumentException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -abstract class InvalidArgumentException extends Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/InvalidCoversTargetException.php b/vendor/phpunit/phpunit/src/Framework/Exception/InvalidCoversTargetException.php deleted file mode 100644 index c6300d9..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/InvalidCoversTargetException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class InvalidCoversTargetException extends CodeCoverageException -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/InvalidDataProviderException.php b/vendor/phpunit/phpunit/src/Framework/Exception/InvalidDataProviderException.php deleted file mode 100644 index a29f4bd..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/InvalidDataProviderException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class InvalidDataProviderException extends Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/InvalidDependencyException.php b/vendor/phpunit/phpunit/src/Framework/Exception/InvalidDependencyException.php deleted file mode 100644 index 8a636fd..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/InvalidDependencyException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class InvalidDependencyException extends AssertionFailedError implements SkippedTest -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/NoChildTestSuiteException.php b/vendor/phpunit/phpunit/src/Framework/Exception/NoChildTestSuiteException.php deleted file mode 100644 index e59df81..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/NoChildTestSuiteException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class NoChildTestSuiteException extends Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ActualValueIsNotAnObjectException.php b/vendor/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ActualValueIsNotAnObjectException.php deleted file mode 100644 index 258b940..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ActualValueIsNotAnObjectException.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ActualValueIsNotAnObjectException extends Exception -{ - public function __construct() - { - parent::__construct( - 'Actual value is not an object', - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotAcceptParameterTypeException.php b/vendor/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotAcceptParameterTypeException.php deleted file mode 100644 index 74d00a1..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotAcceptParameterTypeException.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -use function sprintf; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ComparisonMethodDoesNotAcceptParameterTypeException extends Exception -{ - public function __construct(string $className, string $methodName, string $type) - { - parent::__construct( - sprintf( - '%s is not an accepted argument type for comparison method %s::%s().', - $type, - $className, - $methodName, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotDeclareBoolReturnTypeException.php b/vendor/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotDeclareBoolReturnTypeException.php deleted file mode 100644 index 62dc7e8..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotDeclareBoolReturnTypeException.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -use function sprintf; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ComparisonMethodDoesNotDeclareBoolReturnTypeException extends Exception -{ - public function __construct(string $className, string $methodName) - { - parent::__construct( - sprintf( - 'Comparison method %s::%s() does not declare bool return type.', - $className, - $methodName, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotDeclareExactlyOneParameterException.php b/vendor/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotDeclareExactlyOneParameterException.php deleted file mode 100644 index d576074..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotDeclareExactlyOneParameterException.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -use function sprintf; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ComparisonMethodDoesNotDeclareExactlyOneParameterException extends Exception -{ - public function __construct(string $className, string $methodName) - { - parent::__construct( - sprintf( - 'Comparison method %s::%s() does not declare exactly one parameter.', - $className, - $methodName, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotDeclareParameterTypeException.php b/vendor/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotDeclareParameterTypeException.php deleted file mode 100644 index 6571868..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotDeclareParameterTypeException.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -use function sprintf; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ComparisonMethodDoesNotDeclareParameterTypeException extends Exception -{ - public function __construct(string $className, string $methodName) - { - parent::__construct( - sprintf( - 'Parameter of comparison method %s::%s() does not have a declared type.', - $className, - $methodName, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotExistException.php b/vendor/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotExistException.php deleted file mode 100644 index 94590b5..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotExistException.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -use function sprintf; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ComparisonMethodDoesNotExistException extends Exception -{ - public function __construct(string $className, string $methodName) - { - parent::__construct( - sprintf( - 'Comparison method %s::%s() does not exist.', - $className, - $methodName, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/PhptAssertionFailedError.php b/vendor/phpunit/phpunit/src/Framework/Exception/PhptAssertionFailedError.php deleted file mode 100644 index 73f602a..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/PhptAssertionFailedError.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class PhptAssertionFailedError extends AssertionFailedError -{ - private readonly string $syntheticFile; - private readonly int $syntheticLine; - private readonly array $syntheticTrace; - private readonly string $diff; - - public function __construct(string $message, int $code, string $file, int $line, array $trace, string $diff) - { - parent::__construct($message, $code); - - $this->syntheticFile = $file; - $this->syntheticLine = $line; - $this->syntheticTrace = $trace; - $this->diff = $diff; - } - - public function syntheticFile(): string - { - return $this->syntheticFile; - } - - public function syntheticLine(): int - { - return $this->syntheticLine; - } - - public function syntheticTrace(): array - { - return $this->syntheticTrace; - } - - public function diff(): string - { - return $this->diff; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/ProcessIsolationException.php b/vendor/phpunit/phpunit/src/Framework/Exception/ProcessIsolationException.php deleted file mode 100644 index e59c9c6..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/ProcessIsolationException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ProcessIsolationException extends Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/Skipped/SkippedTest.php b/vendor/phpunit/phpunit/src/Framework/Exception/Skipped/SkippedTest.php deleted file mode 100644 index 3678b60..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/Skipped/SkippedTest.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -use Throwable; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This interface is not covered by the backward compatibility promise for PHPUnit - */ -interface SkippedTest extends Throwable -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/Skipped/SkippedTestSuiteError.php b/vendor/phpunit/phpunit/src/Framework/Exception/Skipped/SkippedTestSuiteError.php deleted file mode 100644 index d3a4788..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/Skipped/SkippedTestSuiteError.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class SkippedTestSuiteError extends AssertionFailedError implements SkippedTest -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/Skipped/SkippedWithMessageException.php b/vendor/phpunit/phpunit/src/Framework/Exception/Skipped/SkippedWithMessageException.php deleted file mode 100644 index d09a760..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/Skipped/SkippedWithMessageException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class SkippedWithMessageException extends AssertionFailedError implements SkippedTest -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/UnknownClassOrInterfaceException.php b/vendor/phpunit/phpunit/src/Framework/Exception/UnknownClassOrInterfaceException.php deleted file mode 100644 index 6a10f97..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/UnknownClassOrInterfaceException.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -use function sprintf; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class UnknownClassOrInterfaceException extends InvalidArgumentException -{ - public function __construct(string $name) - { - parent::__construct( - sprintf( - 'Class or interface "%s" does not exist', - $name, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/UnknownTypeException.php b/vendor/phpunit/phpunit/src/Framework/Exception/UnknownTypeException.php deleted file mode 100644 index b58b695..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/UnknownTypeException.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -use function sprintf; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class UnknownTypeException extends InvalidArgumentException -{ - public function __construct(string $name) - { - parent::__construct( - sprintf( - 'Type "%s" is not known', - $name, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/ExecutionOrderDependency.php b/vendor/phpunit/phpunit/src/Framework/ExecutionOrderDependency.php deleted file mode 100644 index 091628c..0000000 --- a/vendor/phpunit/phpunit/src/Framework/ExecutionOrderDependency.php +++ /dev/null @@ -1,193 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -use function array_filter; -use function array_map; -use function array_values; -use function explode; -use function in_array; -use function str_contains; -use PHPUnit\Metadata\DependsOnClass; -use PHPUnit\Metadata\DependsOnMethod; -use Stringable; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ExecutionOrderDependency implements Stringable -{ - private string $className = ''; - private string $methodName = ''; - private readonly bool $shallowClone; - private readonly bool $deepClone; - - public static function invalid(): self - { - return new self( - '', - '', - false, - false, - ); - } - - public static function forClass(DependsOnClass $metadata): self - { - return new self( - $metadata->className(), - 'class', - $metadata->deepClone(), - $metadata->shallowClone(), - ); - } - - public static function forMethod(DependsOnMethod $metadata): self - { - return new self( - $metadata->className(), - $metadata->methodName(), - $metadata->deepClone(), - $metadata->shallowClone(), - ); - } - - /** - * @psalm-param list $dependencies - * - * @psalm-return list - */ - public static function filterInvalid(array $dependencies): array - { - return array_values( - array_filter( - $dependencies, - static fn (self $d) => $d->isValid(), - ), - ); - } - - /** - * @psalm-param list $existing - * @psalm-param list $additional - * - * @psalm-return list - */ - public static function mergeUnique(array $existing, array $additional): array - { - $existingTargets = array_map( - static fn ($dependency) => $dependency->getTarget(), - $existing, - ); - - foreach ($additional as $dependency) { - $additionalTarget = $dependency->getTarget(); - - if (in_array($additionalTarget, $existingTargets, true)) { - continue; - } - - $existingTargets[] = $additionalTarget; - $existing[] = $dependency; - } - - return $existing; - } - - /** - * @psalm-param list $left - * @psalm-param list $right - * - * @psalm-return list - */ - public static function diff(array $left, array $right): array - { - if ($right === []) { - return $left; - } - - if ($left === []) { - return []; - } - - $diff = []; - $rightTargets = array_map( - static fn ($dependency) => $dependency->getTarget(), - $right, - ); - - foreach ($left as $dependency) { - if (in_array($dependency->getTarget(), $rightTargets, true)) { - continue; - } - - $diff[] = $dependency; - } - - return $diff; - } - - public function __construct(string $classOrCallableName, ?string $methodName = null, bool $deepClone = false, bool $shallowClone = false) - { - $this->deepClone = $deepClone; - $this->shallowClone = $shallowClone; - - if ($classOrCallableName === '') { - return; - } - - if (str_contains($classOrCallableName, '::')) { - [$this->className, $this->methodName] = explode('::', $classOrCallableName); - } else { - $this->className = $classOrCallableName; - $this->methodName = !empty($methodName) ? $methodName : 'class'; - } - } - - public function __toString(): string - { - return $this->getTarget(); - } - - public function isValid(): bool - { - // Invalid dependencies can be declared and are skipped by the runner - return $this->className !== '' && $this->methodName !== ''; - } - - public function shallowClone(): bool - { - return $this->shallowClone; - } - - public function deepClone(): bool - { - return $this->deepClone; - } - - public function targetIsClass(): bool - { - return $this->methodName === 'class'; - } - - public function getTarget(): string - { - return $this->isValid() - ? $this->className . '::' . $this->methodName - : ''; - } - - public function getTargetClassName(): string - { - return $this->className; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/ConfigurableMethod.php b/vendor/phpunit/phpunit/src/Framework/MockObject/ConfigurableMethod.php deleted file mode 100644 index 54d408c..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/ConfigurableMethod.php +++ /dev/null @@ -1,83 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -use SebastianBergmann\Type\Type; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ConfigurableMethod -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $name; - - /** - * @psalm-var array - */ - private readonly array $defaultParameterValues; - - /** - * @psalm-var non-negative-int - */ - private readonly int $numberOfParameters; - private readonly Type $returnType; - - /** - * @psalm-param non-empty-string $name - * @psalm-param array $defaultParameterValues - * @psalm-param non-negative-int $numberOfParameters - */ - public function __construct(string $name, array $defaultParameterValues, int $numberOfParameters, Type $returnType) - { - $this->name = $name; - $this->defaultParameterValues = $defaultParameterValues; - $this->numberOfParameters = $numberOfParameters; - $this->returnType = $returnType; - } - - /** - * @psalm-return non-empty-string - */ - public function name(): string - { - return $this->name; - } - - /** - * @psalm-return array - */ - public function defaultParameterValues(): array - { - return $this->defaultParameterValues; - } - - /** - * @psalm-return non-negative-int - */ - public function numberOfParameters(): int - { - return $this->numberOfParameters; - } - - public function mayReturn(mixed $value): bool - { - return $this->returnType->isAssignable(Type::fromValue($value, false)); - } - - public function returnTypeDeclaration(): string - { - return $this->returnType->asString(); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/BadMethodCallException.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/BadMethodCallException.php deleted file mode 100644 index e8ddadd..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/BadMethodCallException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class BadMethodCallException extends \BadMethodCallException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/CannotUseOnlyMethodsException.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/CannotUseOnlyMethodsException.php deleted file mode 100644 index 6cb399e..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/CannotUseOnlyMethodsException.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -use function sprintf; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class CannotUseOnlyMethodsException extends \PHPUnit\Framework\Exception implements Exception -{ - public function __construct(string $type, string $methodName) - { - parent::__construct( - sprintf( - 'Trying to configure method "%s" with onlyMethods(), but it does not exist in class "%s"', - $methodName, - $type, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/Exception.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/Exception.php deleted file mode 100644 index 0d73a5f..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/Exception.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This interface is not covered by the backward compatibility promise for PHPUnit - */ -interface Exception extends \PHPUnit\Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/IncompatibleReturnValueException.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/IncompatibleReturnValueException.php deleted file mode 100644 index faf8a49..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/IncompatibleReturnValueException.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -use function get_debug_type; -use function sprintf; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class IncompatibleReturnValueException extends \PHPUnit\Framework\Exception implements Exception -{ - public function __construct(ConfigurableMethod $method, mixed $value) - { - parent::__construct( - sprintf( - 'Method %s may not return value of type %s, its declared return type is "%s"', - $method->name(), - get_debug_type($value), - $method->returnTypeDeclaration(), - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MatchBuilderNotFoundException.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MatchBuilderNotFoundException.php deleted file mode 100644 index 8bf8967..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MatchBuilderNotFoundException.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -use function sprintf; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class MatchBuilderNotFoundException extends \PHPUnit\Framework\Exception implements Exception -{ - public function __construct(string $id) - { - parent::__construct( - sprintf( - 'No builder found for match builder identification <%s>', - $id, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MatcherAlreadyRegisteredException.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MatcherAlreadyRegisteredException.php deleted file mode 100644 index de62b86..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MatcherAlreadyRegisteredException.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -use function sprintf; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class MatcherAlreadyRegisteredException extends \PHPUnit\Framework\Exception implements Exception -{ - public function __construct(string $id) - { - parent::__construct( - sprintf( - 'Matcher with id <%s> is already registered', - $id, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MethodCannotBeConfiguredException.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MethodCannotBeConfiguredException.php deleted file mode 100644 index 4d39b5d..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MethodCannotBeConfiguredException.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -use function sprintf; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class MethodCannotBeConfiguredException extends \PHPUnit\Framework\Exception implements Exception -{ - public function __construct(string $method) - { - parent::__construct( - sprintf( - 'Trying to configure method "%s" which cannot be configured because it does not exist, has not been specified, is final, or is static', - $method, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MethodNameAlreadyConfiguredException.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MethodNameAlreadyConfiguredException.php deleted file mode 100644 index e4a3759..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MethodNameAlreadyConfiguredException.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class MethodNameAlreadyConfiguredException extends \PHPUnit\Framework\Exception implements Exception -{ - public function __construct() - { - parent::__construct('Method name is already configured'); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MethodNameNotConfiguredException.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MethodNameNotConfiguredException.php deleted file mode 100644 index 25c1134..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MethodNameNotConfiguredException.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class MethodNameNotConfiguredException extends \PHPUnit\Framework\Exception implements Exception -{ - public function __construct() - { - parent::__construct('Method name is not configured'); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MethodParametersAlreadyConfiguredException.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MethodParametersAlreadyConfiguredException.php deleted file mode 100644 index fba96cf..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MethodParametersAlreadyConfiguredException.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class MethodParametersAlreadyConfiguredException extends \PHPUnit\Framework\Exception implements Exception -{ - public function __construct() - { - parent::__construct('Method parameters already configured'); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/NeverReturningMethodException.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/NeverReturningMethodException.php deleted file mode 100644 index 21aa698..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/NeverReturningMethodException.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -use function sprintf; -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class NeverReturningMethodException extends RuntimeException implements Exception -{ - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - */ - public function __construct(string $className, string $methodName) - { - parent::__construct( - sprintf( - 'Method %s::%s() is declared to never return', - $className, - $methodName, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/NoMoreReturnValuesConfiguredException.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/NoMoreReturnValuesConfiguredException.php deleted file mode 100644 index c4b1816..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/NoMoreReturnValuesConfiguredException.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -use function sprintf; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class NoMoreReturnValuesConfiguredException extends \PHPUnit\Framework\Exception implements Exception -{ - public function __construct(Invocation $invocation, int $numberOfConfiguredReturnValues) - { - parent::__construct( - sprintf( - 'Only %d return values have been configured for %s::%s()', - $numberOfConfiguredReturnValues, - $invocation->className(), - $invocation->methodName(), - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/ReturnValueNotConfiguredException.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/ReturnValueNotConfiguredException.php deleted file mode 100644 index cf193f1..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/ReturnValueNotConfiguredException.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -use function sprintf; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ReturnValueNotConfiguredException extends \PHPUnit\Framework\Exception implements Exception -{ - public function __construct(Invocation $invocation) - { - parent::__construct( - sprintf( - 'No return value is configured for %s::%s() and return value generation is disabled', - $invocation->className(), - $invocation->methodName(), - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/RuntimeException.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/RuntimeException.php deleted file mode 100644 index b99a903..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/RuntimeException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class RuntimeException extends \RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/CannotUseAddMethodsException.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/CannotUseAddMethodsException.php deleted file mode 100644 index 9fc5078..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/CannotUseAddMethodsException.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Generator; - -use function sprintf; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class CannotUseAddMethodsException extends \PHPUnit\Framework\Exception implements Exception -{ - public function __construct(string $type, string $methodName) - { - parent::__construct( - sprintf( - 'Trying to configure method "%s" with addMethods(), but it exists in class "%s". Use onlyMethods() for methods that exist in the class', - $methodName, - $type, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ClassIsEnumerationException.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ClassIsEnumerationException.php deleted file mode 100644 index e2cde18..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ClassIsEnumerationException.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Generator; - -use function sprintf; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ClassIsEnumerationException extends \PHPUnit\Framework\Exception implements Exception -{ - public function __construct(string $className) - { - parent::__construct( - sprintf( - 'Class "%s" is an enumeration and cannot be doubled', - $className, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ClassIsFinalException.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ClassIsFinalException.php deleted file mode 100644 index f10100b..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ClassIsFinalException.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Generator; - -use function sprintf; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ClassIsFinalException extends \PHPUnit\Framework\Exception implements Exception -{ - public function __construct(string $className) - { - parent::__construct( - sprintf( - 'Class "%s" is declared "final" and cannot be doubled', - $className, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ClassIsReadonlyException.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ClassIsReadonlyException.php deleted file mode 100644 index 2b549c7..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ClassIsReadonlyException.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Generator; - -use function sprintf; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ClassIsReadonlyException extends \PHPUnit\Framework\Exception implements Exception -{ - public function __construct(string $className) - { - parent::__construct( - sprintf( - 'Class "%s" is declared "readonly" and cannot be doubled', - $className, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/DuplicateMethodException.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/DuplicateMethodException.php deleted file mode 100644 index f9a0a76..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/DuplicateMethodException.php +++ /dev/null @@ -1,37 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Generator; - -use function array_diff_assoc; -use function array_unique; -use function implode; -use function sprintf; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class DuplicateMethodException extends \PHPUnit\Framework\Exception implements Exception -{ - /** - * @psalm-param list $methods - */ - public function __construct(array $methods) - { - parent::__construct( - sprintf( - 'Cannot double using a method list that contains duplicates: "%s" (duplicate: "%s")', - implode(', ', $methods), - implode(', ', array_unique(array_diff_assoc($methods, array_unique($methods)))), - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/Exception.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/Exception.php deleted file mode 100644 index 8d62606..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/Exception.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Generator; - -use PHPUnit\Framework\MockObject\Exception as BaseException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This interface is not covered by the backward compatibility promise for PHPUnit - */ -interface Exception extends BaseException -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/InvalidMethodNameException.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/InvalidMethodNameException.php deleted file mode 100644 index 32296ce..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/InvalidMethodNameException.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Generator; - -use function sprintf; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class InvalidMethodNameException extends \PHPUnit\Framework\Exception implements Exception -{ - public function __construct(string $method) - { - parent::__construct( - sprintf( - 'Cannot double method with invalid name "%s"', - $method, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/NameAlreadyInUseException.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/NameAlreadyInUseException.php deleted file mode 100644 index c73e717..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/NameAlreadyInUseException.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Generator; - -use function sprintf; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class NameAlreadyInUseException extends \PHPUnit\Framework\Exception implements Exception -{ - /** - * @psalm-param class-string|trait-string $name - */ - public function __construct(string $name) - { - parent::__construct( - sprintf( - 'The name "%s" is already in use', - $name, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/OriginalConstructorInvocationRequiredException.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/OriginalConstructorInvocationRequiredException.php deleted file mode 100644 index b284d94..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/OriginalConstructorInvocationRequiredException.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Generator; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class OriginalConstructorInvocationRequiredException extends \PHPUnit\Framework\Exception implements Exception -{ - public function __construct() - { - parent::__construct('Proxying to original methods requires invoking the original constructor'); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ReflectionException.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ReflectionException.php deleted file mode 100644 index f4a84f1..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ReflectionException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Generator; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ReflectionException extends \PHPUnit\Framework\Exception implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/RuntimeException.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/RuntimeException.php deleted file mode 100644 index eed41c3..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/RuntimeException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Generator; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class RuntimeException extends \PHPUnit\Framework\Exception implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/SoapExtensionNotAvailableException.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/SoapExtensionNotAvailableException.php deleted file mode 100644 index f6f513b..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/SoapExtensionNotAvailableException.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Generator; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class SoapExtensionNotAvailableException extends \PHPUnit\Framework\Exception implements Exception -{ - public function __construct() - { - parent::__construct( - 'The SOAP extension is required to generate a test double from WSDL', - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/UnknownClassException.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/UnknownClassException.php deleted file mode 100644 index c512745..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/UnknownClassException.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Generator; - -use function sprintf; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class UnknownClassException extends \PHPUnit\Framework\Exception implements Exception -{ - public function __construct(string $className) - { - parent::__construct( - sprintf( - 'Class "%s" does not exist', - $className, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/UnknownTraitException.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/UnknownTraitException.php deleted file mode 100644 index a536b15..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/UnknownTraitException.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Generator; - -use function sprintf; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5243 - */ -final class UnknownTraitException extends \PHPUnit\Framework\Exception implements Exception -{ - public function __construct(string $traitName) - { - parent::__construct( - sprintf( - 'Trait "%s" does not exist', - $traitName, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/UnknownTypeException.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/UnknownTypeException.php deleted file mode 100644 index cd1e1e0..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/UnknownTypeException.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Generator; - -use function sprintf; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class UnknownTypeException extends \PHPUnit\Framework\Exception implements Exception -{ - public function __construct(string $type) - { - parent::__construct( - sprintf( - 'Class or interface "%s" does not exist', - $type, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Generator.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Generator.php deleted file mode 100644 index 3be8289..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Generator.php +++ /dev/null @@ -1,1085 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Generator; - -use const PHP_EOL; -use const PHP_VERSION; -use const PREG_OFFSET_CAPTURE; -use const WSDL_CACHE_NONE; -use function array_merge; -use function array_pop; -use function array_unique; -use function assert; -use function class_exists; -use function count; -use function explode; -use function extension_loaded; -use function implode; -use function in_array; -use function interface_exists; -use function is_array; -use function is_object; -use function md5; -use function method_exists; -use function mt_rand; -use function preg_match; -use function preg_match_all; -use function range; -use function serialize; -use function sort; -use function sprintf; -use function str_contains; -use function str_replace; -use function strlen; -use function strpos; -use function substr; -use function trait_exists; -use function version_compare; -use Exception; -use Iterator; -use IteratorAggregate; -use PHPUnit\Framework\InvalidArgumentException; -use PHPUnit\Framework\MockObject\ConfigurableMethod; -use PHPUnit\Framework\MockObject\DoubledCloneMethod; -use PHPUnit\Framework\MockObject\Method; -use PHPUnit\Framework\MockObject\MockObject; -use PHPUnit\Framework\MockObject\MockObjectApi; -use PHPUnit\Framework\MockObject\MockObjectInternal; -use PHPUnit\Framework\MockObject\ProxiedCloneMethod; -use PHPUnit\Framework\MockObject\Stub; -use PHPUnit\Framework\MockObject\StubApi; -use PHPUnit\Framework\MockObject\StubInternal; -use ReflectionClass; -use ReflectionMethod; -use SoapClient; -use SoapFault; -use Throwable; -use Traversable; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Generator -{ - use TemplateLoader; - - /** - * @var array - */ - private static $excludedMethodNames = []; - - /** - * @psalm-var array - */ - private static array $cache = []; - - /** - * Returns a test double for the specified class. - * - * @throws ClassIsEnumerationException - * @throws ClassIsFinalException - * @throws ClassIsReadonlyException - * @throws DuplicateMethodException - * @throws InvalidMethodNameException - * @throws NameAlreadyInUseException - * @throws OriginalConstructorInvocationRequiredException - * @throws ReflectionException - * @throws RuntimeException - * @throws UnknownTypeException - */ - public function testDouble(string $type, bool $mockObject, ?array $methods = [], array $arguments = [], string $mockClassName = '', bool $callOriginalConstructor = true, bool $callOriginalClone = true, bool $callAutoload = true, bool $cloneArguments = true, bool $callOriginalMethods = false, ?object $proxyTarget = null, bool $allowMockingUnknownTypes = true, bool $returnValueGeneration = true): MockObject|Stub - { - if ($type === Traversable::class) { - $type = Iterator::class; - } - - if (!$allowMockingUnknownTypes) { - $this->ensureKnownType($type, $callAutoload); - } - - $this->ensureValidMethods($methods); - $this->ensureNameForTestDoubleClassIsAvailable($mockClassName); - - if (!$callOriginalConstructor && $callOriginalMethods) { - throw new OriginalConstructorInvocationRequiredException; - } - - $mock = $this->generate( - $type, - $mockObject, - $methods, - $mockClassName, - $callOriginalClone, - $callAutoload, - $cloneArguments, - $callOriginalMethods, - ); - - $object = $this->getObject( - $mock, - $type, - $callOriginalConstructor, - $arguments, - $callOriginalMethods, - $proxyTarget, - $returnValueGeneration, - ); - - assert($object instanceof $type); - - if ($mockObject) { - assert($object instanceof MockObject); - } else { - assert($object instanceof Stub); - } - - return $object; - } - - /** - * @psalm-param list $interfaces - * - * @throws RuntimeException - * @throws UnknownTypeException - */ - public function testDoubleForInterfaceIntersection(array $interfaces, bool $mockObject, bool $callAutoload = true): MockObject|Stub - { - if (count($interfaces) < 2) { - throw new RuntimeException('At least two interfaces must be specified'); - } - - foreach ($interfaces as $interface) { - if (!interface_exists($interface, $callAutoload)) { - throw new UnknownTypeException($interface); - } - } - - sort($interfaces); - - $methods = []; - - foreach ($interfaces as $interface) { - $methods = array_merge($methods, $this->namesOfMethodsIn($interface)); - } - - if (count(array_unique($methods)) < count($methods)) { - throw new RuntimeException('Interfaces must not declare the same method'); - } - - $unqualifiedNames = []; - - foreach ($interfaces as $interface) { - $parts = explode('\\', $interface); - $unqualifiedNames[] = array_pop($parts); - } - - sort($unqualifiedNames); - - do { - $intersectionName = sprintf( - 'Intersection_%s_%s', - implode('_', $unqualifiedNames), - substr(md5((string) mt_rand()), 0, 8), - ); - } while (interface_exists($intersectionName, false)); - - $template = $this->loadTemplate('intersection.tpl'); - - $template->setVar( - [ - 'intersection' => $intersectionName, - 'interfaces' => implode(', ', $interfaces), - ], - ); - - eval($template->render()); - - return $this->testDouble($intersectionName, $mockObject); - } - - /** - * Returns a mock object for the specified abstract class with all abstract - * methods of the class mocked. - * - * Concrete methods to mock can be specified with the $mockedMethods parameter. - * - * @throws ClassIsEnumerationException - * @throws ClassIsFinalException - * @throws ClassIsReadonlyException - * @throws DuplicateMethodException - * @throws InvalidArgumentException - * @throws InvalidMethodNameException - * @throws NameAlreadyInUseException - * @throws OriginalConstructorInvocationRequiredException - * @throws ReflectionException - * @throws RuntimeException - * @throws UnknownClassException - * @throws UnknownTypeException - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5241 - */ - public function mockObjectForAbstractClass(string $originalClassName, array $arguments = [], string $mockClassName = '', bool $callOriginalConstructor = true, bool $callOriginalClone = true, bool $callAutoload = true, ?array $mockedMethods = null, bool $cloneArguments = true): MockObject - { - if (class_exists($originalClassName, $callAutoload) || - interface_exists($originalClassName, $callAutoload)) { - $reflector = $this->reflectClass($originalClassName); - $methods = $mockedMethods; - - foreach ($reflector->getMethods() as $method) { - if ($method->isAbstract() && !in_array($method->getName(), $methods ?? [], true)) { - $methods[] = $method->getName(); - } - } - - if (empty($methods)) { - $methods = null; - } - - $mockObject = $this->testDouble( - $originalClassName, - true, - $methods, - $arguments, - $mockClassName, - $callOriginalConstructor, - $callOriginalClone, - $callAutoload, - $cloneArguments, - ); - - assert($mockObject instanceof $originalClassName); - assert($mockObject instanceof MockObject); - - return $mockObject; - } - - throw new UnknownClassException($originalClassName); - } - - /** - * Returns a mock object for the specified trait with all abstract methods - * of the trait mocked. Concrete methods to mock can be specified with the - * `$mockedMethods` parameter. - * - * @psalm-param trait-string $traitName - * - * @throws ClassIsEnumerationException - * @throws ClassIsFinalException - * @throws ClassIsReadonlyException - * @throws DuplicateMethodException - * @throws InvalidArgumentException - * @throws InvalidMethodNameException - * @throws NameAlreadyInUseException - * @throws OriginalConstructorInvocationRequiredException - * @throws ReflectionException - * @throws RuntimeException - * @throws UnknownClassException - * @throws UnknownTraitException - * @throws UnknownTypeException - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5243 - */ - public function mockObjectForTrait(string $traitName, array $arguments = [], string $mockClassName = '', bool $callOriginalConstructor = true, bool $callOriginalClone = true, bool $callAutoload = true, ?array $mockedMethods = null, bool $cloneArguments = true): MockObject - { - if (!trait_exists($traitName, $callAutoload)) { - throw new UnknownTraitException($traitName); - } - - $className = $this->generateClassName( - $traitName, - '', - 'Trait_', - ); - - $classTemplate = $this->loadTemplate('trait_class.tpl'); - - $classTemplate->setVar( - [ - 'prologue' => 'abstract ', - 'class_name' => $className['className'], - 'trait_name' => $traitName, - ], - ); - - $mockTrait = new MockTrait($classTemplate->render(), $className['className']); - $mockTrait->generate(); - - return $this->mockObjectForAbstractClass($className['className'], $arguments, $mockClassName, $callOriginalConstructor, $callOriginalClone, $callAutoload, $mockedMethods, $cloneArguments); - } - - /** - * Returns an object for the specified trait. - * - * @psalm-param trait-string $traitName - * - * @throws ReflectionException - * @throws RuntimeException - * @throws UnknownTraitException - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5244 - */ - public function objectForTrait(string $traitName, string $traitClassName = '', bool $callAutoload = true, bool $callOriginalConstructor = false, array $arguments = []): object - { - if (!trait_exists($traitName, $callAutoload)) { - throw new UnknownTraitException($traitName); - } - - $className = $this->generateClassName( - $traitName, - $traitClassName, - 'Trait_', - ); - - $classTemplate = $this->loadTemplate('trait_class.tpl'); - - $classTemplate->setVar( - [ - 'prologue' => '', - 'class_name' => $className['className'], - 'trait_name' => $traitName, - ], - ); - - return $this->getObject( - new MockTrait( - $classTemplate->render(), - $className['className'], - ), - '', - $callOriginalConstructor, - $arguments, - ); - } - - /** - * @throws ClassIsEnumerationException - * @throws ClassIsFinalException - * @throws ClassIsReadonlyException - * @throws ReflectionException - * @throws RuntimeException - * - * @todo This method is only public because it is used to test generated code in PHPT tests - * - * @see https://github.com/sebastianbergmann/phpunit/issues/5476 - */ - public function generate(string $type, bool $mockObject, ?array $methods = null, string $mockClassName = '', bool $callOriginalClone = true, bool $callAutoload = true, bool $cloneArguments = true, bool $callOriginalMethods = false): MockClass - { - if ($mockClassName !== '') { - return $this->generateCodeForTestDoubleClass( - $type, - $mockObject, - $methods, - $mockClassName, - $callOriginalClone, - $callAutoload, - $cloneArguments, - $callOriginalMethods, - ); - } - - $key = md5( - $type . - ($mockObject ? 'MockObject' : 'TestStub') . - serialize($methods) . - serialize($callOriginalClone) . - serialize($cloneArguments) . - serialize($callOriginalMethods), - ); - - if (!isset(self::$cache[$key])) { - self::$cache[$key] = $this->generateCodeForTestDoubleClass( - $type, - $mockObject, - $methods, - $mockClassName, - $callOriginalClone, - $callAutoload, - $cloneArguments, - $callOriginalMethods, - ); - } - - return self::$cache[$key]; - } - - /** - * @throws RuntimeException - * @throws SoapExtensionNotAvailableException - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5242 - */ - public function generateClassFromWsdl(string $wsdlFile, string $className, array $methods = [], array $options = []): string - { - if (!extension_loaded('soap')) { - throw new SoapExtensionNotAvailableException; - } - - $options['cache_wsdl'] = WSDL_CACHE_NONE; - - try { - $client = new SoapClient($wsdlFile, $options); - $_methods = array_unique($client->__getFunctions()); - - unset($client); - } catch (SoapFault $e) { - throw new RuntimeException( - $e->getMessage(), - $e->getCode(), - $e, - ); - } - - sort($_methods); - - $methodTemplate = $this->loadTemplate('wsdl_method.tpl'); - $methodsBuffer = ''; - - foreach ($_methods as $method) { - preg_match_all('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*\(/', $method, $matches, PREG_OFFSET_CAPTURE); - - $lastFunction = array_pop($matches[0]); - $nameStart = $lastFunction[1]; - $nameEnd = $nameStart + strlen($lastFunction[0]) - 1; - $name = str_replace('(', '', $lastFunction[0]); - - if (empty($methods) || in_array($name, $methods, true)) { - $arguments = explode( - ',', - str_replace(')', '', substr($method, $nameEnd + 1)), - ); - - foreach (range(0, count($arguments) - 1) as $i) { - $parameterStart = strpos($arguments[$i], '$'); - - if (!$parameterStart) { - continue; - } - - $arguments[$i] = substr($arguments[$i], $parameterStart); - } - - $methodTemplate->setVar( - [ - 'method_name' => $name, - 'arguments' => implode(', ', $arguments), - ], - ); - - $methodsBuffer .= $methodTemplate->render(); - } - } - - $optionsBuffer = '['; - - foreach ($options as $key => $value) { - $optionsBuffer .= $key . ' => ' . $value; - } - - $optionsBuffer .= ']'; - - $classTemplate = $this->loadTemplate('wsdl_class.tpl'); - $namespace = ''; - - if (str_contains($className, '\\')) { - $parts = explode('\\', $className); - $className = array_pop($parts); - $namespace = 'namespace ' . implode('\\', $parts) . ';' . "\n\n"; - } - - $classTemplate->setVar( - [ - 'namespace' => $namespace, - 'class_name' => $className, - 'wsdl' => $wsdlFile, - 'options' => $optionsBuffer, - 'methods' => $methodsBuffer, - ], - ); - - return $classTemplate->render(); - } - - /** - * @throws ReflectionException - * - * @psalm-return list - */ - public function mockClassMethods(string $className, bool $callOriginalMethods, bool $cloneArguments): array - { - $class = $this->reflectClass($className); - $methods = []; - - foreach ($class->getMethods() as $method) { - if (($method->isPublic() || $method->isAbstract()) && $this->canMethodBeDoubled($method)) { - $methods[] = MockMethod::fromReflection($method, $callOriginalMethods, $cloneArguments); - } - } - - return $methods; - } - - /** - * @psalm-param class-string $interfaceName - * - * @throws ReflectionException - * - * @psalm-return list - */ - private function userDefinedInterfaceMethods(string $interfaceName): array - { - $interface = $this->reflectClass($interfaceName); - $methods = []; - - foreach ($interface->getMethods() as $method) { - if (!$method->isUserDefined()) { - continue; - } - - $methods[] = $method; - } - - return $methods; - } - - /** - * @throws ReflectionException - * @throws RuntimeException - */ - private function getObject(MockType $mockClass, string $type = '', bool $callOriginalConstructor = false, array $arguments = [], bool $callOriginalMethods = false, ?object $proxyTarget = null, bool $returnValueGeneration = true): object - { - $className = $mockClass->generate(); - $object = $this->instantiate($className, $callOriginalConstructor, $arguments); - - if ($callOriginalMethods) { - $this->instantiateProxyTarget($proxyTarget, $object, $type, $arguments); - } - - if ($object instanceof StubInternal) { - $object->__phpunit_setReturnValueGeneration($returnValueGeneration); - } - - return $object; - } - - /** - * @throws ClassIsEnumerationException - * @throws ClassIsFinalException - * @throws ClassIsReadonlyException - * @throws ReflectionException - * @throws RuntimeException - */ - private function generateCodeForTestDoubleClass(string $type, bool $mockObject, ?array $explicitMethods, string $mockClassName, bool $callOriginalClone, bool $callAutoload, bool $cloneArguments, bool $callOriginalMethods): MockClass - { - $classTemplate = $this->loadTemplate('test_double_class.tpl'); - $additionalInterfaces = []; - $doubledCloneMethod = false; - $proxiedCloneMethod = false; - $isClass = false; - $isInterface = false; - $class = null; - $mockMethods = new MockMethodSet; - $testDoubleClassPrefix = $mockObject ? 'MockObject_' : 'TestStub_'; - - $_mockClassName = $this->generateClassName( - $type, - $mockClassName, - $testDoubleClassPrefix, - ); - - if (class_exists($_mockClassName['fullClassName'], $callAutoload)) { - $isClass = true; - } elseif (interface_exists($_mockClassName['fullClassName'], $callAutoload)) { - $isInterface = true; - } - - if (!$isClass && !$isInterface) { - $prologue = 'class ' . $_mockClassName['originalClassName'] . "\n{\n}\n\n"; - - if (!empty($_mockClassName['namespaceName'])) { - $prologue = 'namespace ' . $_mockClassName['namespaceName'] . - " {\n\n" . $prologue . "}\n\n" . - "namespace {\n\n"; - - $epilogue = "\n\n}"; - } - - $doubledCloneMethod = true; - } else { - $class = $this->reflectClass($_mockClassName['fullClassName']); - - if ($class->isEnum()) { - throw new ClassIsEnumerationException($_mockClassName['fullClassName']); - } - - if ($class->isFinal()) { - throw new ClassIsFinalException($_mockClassName['fullClassName']); - } - - if (method_exists($class, 'isReadOnly') && $class->isReadOnly()) { - throw new ClassIsReadonlyException($_mockClassName['fullClassName']); - } - - // @see https://github.com/sebastianbergmann/phpunit/issues/2995 - if ($isInterface && $class->implementsInterface(Throwable::class)) { - $actualClassName = Exception::class; - $additionalInterfaces[] = $class->getName(); - $isInterface = false; - $class = $this->reflectClass($actualClassName); - - foreach ($this->userDefinedInterfaceMethods($_mockClassName['fullClassName']) as $method) { - $methodName = $method->getName(); - - if ($class->hasMethod($methodName)) { - $classMethod = $class->getMethod($methodName); - - if (!$this->canMethodBeDoubled($classMethod)) { - continue; - } - } - - $mockMethods->addMethods( - MockMethod::fromReflection($method, $callOriginalMethods, $cloneArguments), - ); - } - - $_mockClassName = $this->generateClassName( - $actualClassName, - $_mockClassName['className'], - $testDoubleClassPrefix, - ); - } - - // @see https://github.com/sebastianbergmann/phpunit-mock-objects/issues/103 - if ($isInterface && $class->implementsInterface(Traversable::class) && - !$class->implementsInterface(Iterator::class) && - !$class->implementsInterface(IteratorAggregate::class)) { - $additionalInterfaces[] = Iterator::class; - - $mockMethods->addMethods( - ...$this->mockClassMethods(Iterator::class, $callOriginalMethods, $cloneArguments), - ); - } - - if ($class->hasMethod('__clone')) { - $cloneMethod = $class->getMethod('__clone'); - - if (!$cloneMethod->isFinal()) { - if ($callOriginalClone && !$isInterface) { - $proxiedCloneMethod = true; - } else { - $doubledCloneMethod = true; - } - } - } else { - $doubledCloneMethod = true; - } - } - - if ($isClass && $explicitMethods === []) { - $mockMethods->addMethods( - ...$this->mockClassMethods($_mockClassName['fullClassName'], $callOriginalMethods, $cloneArguments), - ); - } - - if ($isInterface && ($explicitMethods === [] || $explicitMethods === null)) { - $mockMethods->addMethods( - ...$this->interfaceMethods($_mockClassName['fullClassName'], $cloneArguments), - ); - } - - if (is_array($explicitMethods)) { - foreach ($explicitMethods as $methodName) { - if ($class !== null && $class->hasMethod($methodName)) { - $method = $class->getMethod($methodName); - - if ($this->canMethodBeDoubled($method)) { - $mockMethods->addMethods( - MockMethod::fromReflection($method, $callOriginalMethods, $cloneArguments), - ); - } - } else { - $mockMethods->addMethods( - MockMethod::fromName( - $_mockClassName['fullClassName'], - $methodName, - $cloneArguments, - ), - ); - } - } - } - - $mockedMethods = ''; - $configurable = []; - - foreach ($mockMethods->asArray() as $mockMethod) { - $mockedMethods .= $mockMethod->generateCode(); - - $configurable[] = new ConfigurableMethod( - $mockMethod->methodName(), - $mockMethod->defaultParameterValues(), - $mockMethod->numberOfParameters(), - $mockMethod->returnType(), - ); - } - - /** @psalm-var trait-string[] $traits */ - $traits = [StubApi::class]; - - if ($mockObject) { - $traits[] = MockObjectApi::class; - } - - if (!$mockMethods->hasMethod('method') && (!isset($class) || !$class->hasMethod('method'))) { - $traits[] = Method::class; - } - - if ($doubledCloneMethod) { - $traits[] = DoubledCloneMethod::class; - } - - if ($proxiedCloneMethod) { - $traits[] = ProxiedCloneMethod::class; - } - - $useStatements = ''; - - foreach ($traits as $trait) { - $useStatements .= sprintf( - ' use %s;' . PHP_EOL, - $trait, - ); - } - - unset($traits); - - $classTemplate->setVar( - [ - 'prologue' => $prologue ?? '', - 'epilogue' => $epilogue ?? '', - 'class_declaration' => $this->generateTestDoubleClassDeclaration( - $mockObject, - $_mockClassName, - $isInterface, - $additionalInterfaces, - ), - 'use_statements' => $useStatements, - 'mock_class_name' => $_mockClassName['className'], - 'mocked_methods' => $mockedMethods, - ], - ); - - return new MockClass( - $classTemplate->render(), - $_mockClassName['className'], - $configurable, - ); - } - - private function generateClassName(string $type, string $className, string $prefix): array - { - if ($type[0] === '\\') { - $type = substr($type, 1); - } - - $classNameParts = explode('\\', $type); - - if (count($classNameParts) > 1) { - $type = array_pop($classNameParts); - $namespaceName = implode('\\', $classNameParts); - $fullClassName = $namespaceName . '\\' . $type; - } else { - $namespaceName = ''; - $fullClassName = $type; - } - - if ($className === '') { - do { - $className = $prefix . $type . '_' . - substr(md5((string) mt_rand()), 0, 8); - } while (class_exists($className, false)); - } - - return [ - 'className' => $className, - 'originalClassName' => $type, - 'fullClassName' => $fullClassName, - 'namespaceName' => $namespaceName, - ]; - } - - private function generateTestDoubleClassDeclaration(bool $mockObject, array $mockClassName, bool $isInterface, array $additionalInterfaces = []): string - { - if ($mockObject) { - $additionalInterfaces[] = MockObjectInternal::class; - } else { - $additionalInterfaces[] = StubInternal::class; - } - - $buffer = 'class '; - $interfaces = implode(', ', $additionalInterfaces); - - if ($isInterface) { - $buffer .= sprintf( - '%s implements %s', - $mockClassName['className'], - $interfaces, - ); - - if (!in_array($mockClassName['originalClassName'], $additionalInterfaces, true)) { - $buffer .= ', '; - - if (!empty($mockClassName['namespaceName'])) { - $buffer .= $mockClassName['namespaceName'] . '\\'; - } - - $buffer .= $mockClassName['originalClassName']; - } - } else { - $buffer .= sprintf( - '%s extends %s%s implements %s', - $mockClassName['className'], - !empty($mockClassName['namespaceName']) ? $mockClassName['namespaceName'] . '\\' : '', - $mockClassName['originalClassName'], - $interfaces, - ); - } - - return $buffer; - } - - private function canMethodBeDoubled(ReflectionMethod $method): bool - { - if ($method->isConstructor()) { - return false; - } - - if ($method->isDestructor()) { - return false; - } - - if ($method->isFinal()) { - return false; - } - - if ($method->isPrivate()) { - return false; - } - - return !$this->isMethodNameExcluded($method->getName()); - } - - private function isMethodNameExcluded(string $name): bool - { - if (self::$excludedMethodNames === []) { - self::$excludedMethodNames = [ - '__CLASS__' => true, - '__DIR__' => true, - '__FILE__' => true, - '__FUNCTION__' => true, - '__LINE__' => true, - '__METHOD__' => true, - '__NAMESPACE__' => true, - '__TRAIT__' => true, - '__clone' => true, - '__halt_compiler' => true, - ]; - - if (version_compare(PHP_VERSION, '8.5', '>=')) { - self::$excludedMethodNames['__sleep'] = true; - self::$excludedMethodNames['__wakeup'] = true; - } - } - - return isset(self::$excludedMethodNames[$name]); - } - - /** - * @throws UnknownTypeException - */ - private function ensureKnownType(string $type, bool $callAutoload): void - { - if (!class_exists($type, $callAutoload) && !interface_exists($type, $callAutoload)) { - throw new UnknownTypeException($type); - } - } - - /** - * @throws DuplicateMethodException - * @throws InvalidMethodNameException - */ - private function ensureValidMethods(?array $methods): void - { - if ($methods === null) { - return; - } - - foreach ($methods as $method) { - if (!preg_match('~[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*~', (string) $method)) { - throw new InvalidMethodNameException((string) $method); - } - } - - if ($methods !== array_unique($methods)) { - throw new DuplicateMethodException($methods); - } - } - - /** - * @throws NameAlreadyInUseException - * @throws ReflectionException - */ - private function ensureNameForTestDoubleClassIsAvailable(string $className): void - { - if ($className === '') { - return; - } - - if (class_exists($className, false) || - interface_exists($className, false) || - trait_exists($className, false)) { - throw new NameAlreadyInUseException($className); - } - } - - /** - * @psalm-param class-string $className - * - * @throws ReflectionException - */ - private function instantiate(string $className, bool $callOriginalConstructor, array $arguments): object - { - if ($callOriginalConstructor) { - if (count($arguments) === 0) { - return new $className; - } - - try { - return (new ReflectionClass($className))->newInstanceArgs($arguments); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new ReflectionException( - $e->getMessage(), - $e->getCode(), - $e, - ); - } - // @codeCoverageIgnoreEnd - } - - try { - return (new ReflectionClass($className))->newInstanceWithoutConstructor(); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new ReflectionException( - $e->getMessage(), - $e->getCode(), - $e, - ); - // @codeCoverageIgnoreEnd - } - } - - /** - * @psalm-param class-string $type - * - * @throws ReflectionException - */ - private function instantiateProxyTarget(?object $proxyTarget, object $object, string $type, array $arguments): void - { - if (!is_object($proxyTarget)) { - assert(class_exists($type)); - - if (count($arguments) === 0) { - $proxyTarget = new $type; - } else { - $class = new ReflectionClass($type); - - try { - $proxyTarget = $class->newInstanceArgs($arguments); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new ReflectionException( - $e->getMessage(), - $e->getCode(), - $e, - ); - } - // @codeCoverageIgnoreEnd - } - } - - $object->__phpunit_setOriginalObject($proxyTarget); - } - - /** - * @psalm-param class-string $className - * - * @throws ReflectionException - */ - private function reflectClass(string $className): ReflectionClass - { - try { - $class = new ReflectionClass($className); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new ReflectionException( - $e->getMessage(), - $e->getCode(), - $e, - ); - } - // @codeCoverageIgnoreEnd - - return $class; - } - - /** - * @psalm-param class-string $classOrInterfaceName - * - * @throws ReflectionException - * - * @psalm-return list - */ - private function namesOfMethodsIn(string $classOrInterfaceName): array - { - $class = $this->reflectClass($classOrInterfaceName); - $methods = []; - - foreach ($class->getMethods() as $method) { - if ($method->isPublic() || $method->isAbstract()) { - $methods[] = $method->getName(); - } - } - - return $methods; - } - - /** - * @psalm-param class-string $interfaceName - * - * @throws ReflectionException - * - * @psalm-return list - */ - private function interfaceMethods(string $interfaceName, bool $cloneArguments): array - { - $class = $this->reflectClass($interfaceName); - $methods = []; - - foreach ($class->getMethods() as $method) { - $methods[] = MockMethod::fromReflection($method, false, $cloneArguments); - } - - return $methods; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/MockClass.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/MockClass.php deleted file mode 100644 index 8fe3c82..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/MockClass.php +++ /dev/null @@ -1,70 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Generator; - -use function call_user_func; -use function class_exists; -use PHPUnit\Framework\MockObject\ConfigurableMethod; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class MockClass implements MockType -{ - private readonly string $classCode; - - /** - * @psalm-var class-string - */ - private readonly string $mockName; - - /** - * @psalm-var list - */ - private readonly array $configurableMethods; - - /** - * @psalm-param class-string $mockName - * @psalm-param list $configurableMethods - */ - public function __construct(string $classCode, string $mockName, array $configurableMethods) - { - $this->classCode = $classCode; - $this->mockName = $mockName; - $this->configurableMethods = $configurableMethods; - } - - /** - * @psalm-return class-string - */ - public function generate(): string - { - if (!class_exists($this->mockName, false)) { - eval($this->classCode); - - call_user_func( - [ - $this->mockName, - '__phpunit_initConfigurableMethods', - ], - ...$this->configurableMethods, - ); - } - - return $this->mockName; - } - - public function classCode(): string - { - return $this->classCode; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/MockMethod.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/MockMethod.php deleted file mode 100644 index 497cd11..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/MockMethod.php +++ /dev/null @@ -1,396 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Generator; - -use function count; -use function explode; -use function implode; -use function is_object; -use function is_string; -use function preg_match; -use function preg_replace; -use function sprintf; -use function str_contains; -use function strlen; -use function strpos; -use function substr; -use function substr_count; -use function trim; -use function var_export; -use ReflectionMethod; -use ReflectionParameter; -use SebastianBergmann\Type\ReflectionMapper; -use SebastianBergmann\Type\Type; -use SebastianBergmann\Type\UnknownType; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class MockMethod -{ - use TemplateLoader; - - /** - * @psalm-var class-string - */ - private readonly string $className; - - /** - * @psalm-var non-empty-string - */ - private readonly string $methodName; - private readonly bool $cloneArguments; - private readonly string $modifier; - private readonly string $argumentsForDeclaration; - private readonly string $argumentsForCall; - private readonly Type $returnType; - private readonly string $reference; - private readonly bool $callOriginalMethod; - private readonly bool $static; - private readonly ?string $deprecation; - - /** - * @psalm-var array - */ - private readonly array $defaultParameterValues; - - /** - * @psalm-var non-negative-int - */ - private readonly int $numberOfParameters; - - /** - * @throws ReflectionException - * @throws RuntimeException - */ - public static function fromReflection(ReflectionMethod $method, bool $callOriginalMethod, bool $cloneArguments): self - { - if ($method->isPrivate()) { - $modifier = 'private'; - } elseif ($method->isProtected()) { - $modifier = 'protected'; - } else { - $modifier = 'public'; - } - - if ($method->isStatic()) { - $modifier .= ' static'; - } - - if ($method->returnsReference()) { - $reference = '&'; - } else { - $reference = ''; - } - - $docComment = $method->getDocComment(); - - if (is_string($docComment) && - preg_match('#\*[ \t]*+@deprecated[ \t]*+(.*?)\r?+\n[ \t]*+\*(?:[ \t]*+@|/$)#s', $docComment, $deprecation)) { - $deprecation = trim(preg_replace('#[ \t]*\r?\n[ \t]*+\*[ \t]*+#', ' ', $deprecation[1])); - } else { - $deprecation = null; - } - - return new self( - $method->getDeclaringClass()->getName(), - $method->getName(), - $cloneArguments, - $modifier, - self::methodParametersForDeclaration($method), - self::methodParametersForCall($method), - self::methodParametersDefaultValues($method), - count($method->getParameters()), - (new ReflectionMapper)->fromReturnType($method), - $reference, - $callOriginalMethod, - $method->isStatic(), - $deprecation, - ); - } - - /** - * @param class-string $className - * @param non-empty-string $methodName - */ - public static function fromName(string $className, string $methodName, bool $cloneArguments): self - { - return new self( - $className, - $methodName, - $cloneArguments, - 'public', - '', - '', - [], - 0, - new UnknownType, - '', - false, - false, - null, - ); - } - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - * @psalm-param array $defaultParameterValues - * @psalm-param non-negative-int $numberOfParameters - */ - private function __construct(string $className, string $methodName, bool $cloneArguments, string $modifier, string $argumentsForDeclaration, string $argumentsForCall, array $defaultParameterValues, int $numberOfParameters, Type $returnType, string $reference, bool $callOriginalMethod, bool $static, ?string $deprecation) - { - $this->className = $className; - $this->methodName = $methodName; - $this->cloneArguments = $cloneArguments; - $this->modifier = $modifier; - $this->argumentsForDeclaration = $argumentsForDeclaration; - $this->argumentsForCall = $argumentsForCall; - $this->defaultParameterValues = $defaultParameterValues; - $this->numberOfParameters = $numberOfParameters; - $this->returnType = $returnType; - $this->reference = $reference; - $this->callOriginalMethod = $callOriginalMethod; - $this->static = $static; - $this->deprecation = $deprecation; - } - - /** - * @psalm-return non-empty-string - */ - public function methodName(): string - { - return $this->methodName; - } - - /** - * @throws RuntimeException - */ - public function generateCode(): string - { - if ($this->static) { - $templateFile = 'doubled_static_method.tpl'; - } else { - $templateFile = sprintf( - '%s_method.tpl', - $this->callOriginalMethod ? 'proxied' : 'doubled', - ); - } - - $deprecation = $this->deprecation; - $returnResult = ''; - - if (!$this->returnType->isNever() && !$this->returnType->isVoid()) { - $returnResult = <<<'EOT' - - - return $__phpunit_result; -EOT; - } - - if (null !== $this->deprecation) { - $deprecation = "The {$this->className}::{$this->methodName} method is deprecated ({$this->deprecation})."; - $deprecationTemplate = $this->loadTemplate('deprecation.tpl'); - - $deprecationTemplate->setVar( - [ - 'deprecation' => var_export($deprecation, true), - ], - ); - - $deprecation = $deprecationTemplate->render(); - } - - $template = $this->loadTemplate($templateFile); - - $argumentsCount = 0; - - if (str_contains($this->argumentsForCall, '...')) { - $argumentsCount = null; - } elseif (!empty($this->argumentsForCall)) { - $argumentsCount = substr_count($this->argumentsForCall, ',') + 1; - } - - $template->setVar( - [ - 'arguments_decl' => $this->argumentsForDeclaration, - 'arguments_call' => $this->argumentsForCall, - 'return_declaration' => !empty($this->returnType->asString()) ? (': ' . $this->returnType->asString()) : '', - 'return_type' => $this->returnType->asString(), - 'arguments_count' => $argumentsCount, - 'class_name' => $this->className, - 'method_name' => $this->methodName, - 'modifier' => $this->modifier, - 'reference' => $this->reference, - 'clone_arguments' => $this->cloneArguments ? 'true' : 'false', - 'deprecation' => $deprecation, - 'return_result' => $returnResult, - ], - ); - - return $template->render(); - } - - public function returnType(): Type - { - return $this->returnType; - } - - /** - * @psalm-return array - */ - public function defaultParameterValues(): array - { - return $this->defaultParameterValues; - } - - /** - * @psalm-return non-negative-int - */ - public function numberOfParameters(): int - { - return $this->numberOfParameters; - } - - /** - * Returns the parameters of a function or method. - * - * @throws RuntimeException - */ - private static function methodParametersForDeclaration(ReflectionMethod $method): string - { - $parameters = []; - $types = (new ReflectionMapper)->fromParameterTypes($method); - - foreach ($method->getParameters() as $i => $parameter) { - $name = '$' . $parameter->getName(); - - /* Note: PHP extensions may use empty names for reference arguments - * or "..." for methods taking a variable number of arguments. - */ - if ($name === '$' || $name === '$...') { - $name = '$arg' . $i; - } - - $default = ''; - $reference = ''; - $typeDeclaration = ''; - - if (!$types[$i]->type()->isUnknown()) { - $typeDeclaration = $types[$i]->type()->asString() . ' '; - } - - if ($parameter->isPassedByReference()) { - $reference = '&'; - } - - if ($parameter->isVariadic()) { - $name = '...' . $name; - } elseif ($parameter->isDefaultValueAvailable()) { - $default = ' = ' . self::exportDefaultValue($parameter); - } elseif ($parameter->isOptional()) { - $default = ' = null'; - } - - $parameters[] = $typeDeclaration . $reference . $name . $default; - } - - return implode(', ', $parameters); - } - - /** - * Returns the parameters of a function or method. - * - * @throws ReflectionException - */ - private static function methodParametersForCall(ReflectionMethod $method): string - { - $parameters = []; - - foreach ($method->getParameters() as $i => $parameter) { - $name = '$' . $parameter->getName(); - - /* Note: PHP extensions may use empty names for reference arguments - * or "..." for methods taking a variable number of arguments. - */ - if ($name === '$' || $name === '$...') { - $name = '$arg' . $i; - } - - if ($parameter->isVariadic()) { - continue; - } - - if ($parameter->isPassedByReference()) { - $parameters[] = '&' . $name; - } else { - $parameters[] = $name; - } - } - - return implode(', ', $parameters); - } - - /** - * @throws ReflectionException - */ - private static function exportDefaultValue(ReflectionParameter $parameter): string - { - try { - $defaultValue = $parameter->getDefaultValue(); - - if (!is_object($defaultValue)) { - return var_export($defaultValue, true); - } - - $parameterAsString = $parameter->__toString(); - - return explode( - ' = ', - substr( - substr( - $parameterAsString, - strpos($parameterAsString, ' ') + strlen(' '), - ), - 0, - -2, - ), - )[1]; - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new ReflectionException( - $e->getMessage(), - $e->getCode(), - $e, - ); - } - // @codeCoverageIgnoreEnd - } - - /** - * @psalm-return array - */ - private static function methodParametersDefaultValues(ReflectionMethod $method): array - { - $result = []; - - foreach ($method->getParameters() as $i => $parameter) { - if (!$parameter->isDefaultValueAvailable()) { - continue; - } - - $result[$i] = $parameter->getDefaultValue(); - } - - return $result; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/MockMethodSet.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/MockMethodSet.php deleted file mode 100644 index 92785cc..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/MockMethodSet.php +++ /dev/null @@ -1,47 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Generator; - -use function array_key_exists; -use function array_values; -use function strtolower; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class MockMethodSet -{ - /** - * @psalm-var array - */ - private array $methods = []; - - public function addMethods(MockMethod ...$methods): void - { - foreach ($methods as $method) { - $this->methods[strtolower($method->methodName())] = $method; - } - } - - /** - * @psalm-return list - */ - public function asArray(): array - { - return array_values($this->methods); - } - - public function hasMethod(string $methodName): bool - { - return array_key_exists(strtolower($methodName), $this->methods); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/MockTrait.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/MockTrait.php deleted file mode 100644 index 2e78a6a..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/MockTrait.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Generator; - -use function class_exists; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5243 - */ -final class MockTrait implements MockType -{ - private readonly string $classCode; - - /** - * @psalm-var class-string - */ - private readonly string $mockName; - - /** - * @psalm-param class-string $mockName - */ - public function __construct(string $classCode, string $mockName) - { - $this->classCode = $classCode; - $this->mockName = $mockName; - } - - /** - * @psalm-return class-string - */ - public function generate(): string - { - if (!class_exists($this->mockName, false)) { - eval($this->classCode); - } - - return $this->mockName; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/MockType.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/MockType.php deleted file mode 100644 index 35c92a5..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/MockType.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Generator; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This interface is not covered by the backward compatibility promise for PHPUnit - */ -interface MockType -{ - /** - * @psalm-return class-string - */ - public function generate(): string; -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/TemplateLoader.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/TemplateLoader.php deleted file mode 100644 index 37545fc..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/TemplateLoader.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Generator; - -use SebastianBergmann\Template\Template; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This trait is not covered by the backward compatibility promise for PHPUnit - */ -trait TemplateLoader -{ - /** - * @psalm-var array - */ - private static array $templates = []; - - /** - * @psalm-suppress MissingThrowsDocblock - */ - private function loadTemplate(string $template): Template - { - $filename = __DIR__ . '/templates/' . $template; - - if (!isset(self::$templates[$filename])) { - self::$templates[$filename] = new Template($filename); - } - - return self::$templates[$filename]; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/deprecation.tpl b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/deprecation.tpl deleted file mode 100644 index 5bf06f5..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/deprecation.tpl +++ /dev/null @@ -1,2 +0,0 @@ - - @trigger_error({deprecation}, E_USER_DEPRECATED); diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/doubled_method.tpl b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/doubled_method.tpl deleted file mode 100644 index 1b1b663..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/doubled_method.tpl +++ /dev/null @@ -1,35 +0,0 @@ - - {modifier} function {reference}{method_name}({arguments_decl}){return_declaration} - {{deprecation} - $__phpunit_definedVariables = get_defined_vars(); - $__phpunit_namedVariadicParameters = []; - - foreach ($__phpunit_definedVariables as $__phpunit_definedVariableName => $__phpunit_definedVariableValue) { - if ((new ReflectionParameter([__CLASS__, __FUNCTION__], $__phpunit_definedVariableName))->isVariadic()) { - foreach ($__phpunit_definedVariableValue as $__phpunit_key => $__phpunit_namedValue) { - if (is_string($__phpunit_key)) { - $__phpunit_namedVariadicParameters[$__phpunit_key] = $__phpunit_namedValue; - } - } - } - } - - $__phpunit_arguments = [{arguments_call}]; - $__phpunit_count = func_num_args(); - - if ({arguments_count} !== null && $__phpunit_count > {arguments_count}) { - $__phpunit_arguments_tmp = func_get_args(); - - for ($__phpunit_i = {arguments_count}; $__phpunit_i < $__phpunit_count; $__phpunit_i++) { - $__phpunit_arguments[] = $__phpunit_arguments_tmp[$__phpunit_i]; - } - } - - $__phpunit_arguments = array_merge($__phpunit_arguments, $__phpunit_namedVariadicParameters); - - $__phpunit_result = $this->__phpunit_getInvocationHandler()->invoke( - new \PHPUnit\Framework\MockObject\Invocation( - '{class_name}', '{method_name}', $__phpunit_arguments, '{return_type}', $this, {clone_arguments} - ) - );{return_result} - } diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/doubled_static_method.tpl b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/doubled_static_method.tpl deleted file mode 100644 index 5e5cf23..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/doubled_static_method.tpl +++ /dev/null @@ -1,5 +0,0 @@ - - {modifier} function {reference}{method_name}({arguments_decl}){return_declaration} - { - throw new \PHPUnit\Framework\MockObject\BadMethodCallException('Static method "{method_name}" cannot be invoked on mock object'); - } diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/intersection.tpl b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/intersection.tpl deleted file mode 100644 index 75cd27a..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/intersection.tpl +++ /dev/null @@ -1,5 +0,0 @@ -declare(strict_types=1); - -interface {intersection} extends {interfaces} -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/proxied_method.tpl b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/proxied_method.tpl deleted file mode 100644 index 94db466..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/proxied_method.tpl +++ /dev/null @@ -1,37 +0,0 @@ - - {modifier} function {reference}{method_name}({arguments_decl}){return_declaration} - { - $__phpunit_definedVariables = get_defined_vars(); - $__phpunit_namedVariadicParameters = []; - - foreach ($__phpunit_definedVariables as $__phpunit_definedVariableName => $__phpunit_definedVariableValue) { - if ((new ReflectionParameter([__CLASS__, __FUNCTION__], $__phpunit_definedVariableName))->isVariadic()) { - foreach ($__phpunit_definedVariableValue as $__phpunit_key => $__phpunit_namedValue) { - if (is_string($__phpunit_key)) { - $__phpunit_namedVariadicParameters[$__phpunit_key] = $__phpunit_namedValue; - } - } - } - } - - $__phpunit_arguments = [{arguments_call}]; - $__phpunit_count = func_num_args(); - - if ($__phpunit_count > {arguments_count}) { - $__phpunit_arguments_tmp = func_get_args(); - - for ($__phpunit_i = {arguments_count}; $__phpunit_i < $__phpunit_count; $__phpunit_i++) { - $__phpunit_arguments[] = $__phpunit_arguments_tmp[$__phpunit_i]; - } - } - - $__phpunit_arguments = array_merge($__phpunit_arguments, $__phpunit_namedVariadicParameters); - - $this->__phpunit_getInvocationHandler()->invoke( - new \PHPUnit\Framework\MockObject\Invocation( - '{class_name}', '{method_name}', $__phpunit_arguments, '{return_type}', $this, {clone_arguments}, true - ) - ); - - $__phpunit_result = call_user_func_array([$this->__phpunit_originalObject, "{method_name}"], $__phpunit_arguments);{return_result} - } diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/test_double_class.tpl b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/test_double_class.tpl deleted file mode 100644 index 369a47a..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/test_double_class.tpl +++ /dev/null @@ -1,5 +0,0 @@ -declare(strict_types=1); - -{prologue}{class_declaration} -{ -{use_statements}{mocked_methods}}{epilogue} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/trait_class.tpl b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/trait_class.tpl deleted file mode 100644 index a8fe470..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/trait_class.tpl +++ /dev/null @@ -1,6 +0,0 @@ -declare(strict_types=1); - -{prologue}class {class_name} -{ - use {trait_name}; -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/wsdl_class.tpl b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/wsdl_class.tpl deleted file mode 100644 index b3100b4..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/wsdl_class.tpl +++ /dev/null @@ -1,9 +0,0 @@ -declare(strict_types=1); - -{namespace}class {class_name} extends \SoapClient -{ - public function __construct($wsdl, array $options) - { - parent::__construct('{wsdl}', $options); - } -{methods}} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/wsdl_method.tpl b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/wsdl_method.tpl deleted file mode 100644 index bb16e76..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/wsdl_method.tpl +++ /dev/null @@ -1,4 +0,0 @@ - - public function {method_name}({arguments}) - { - } diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php b/vendor/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php deleted file mode 100644 index 547c502..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php +++ /dev/null @@ -1,491 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -use function array_merge; -use function assert; -use function trait_exists; -use PHPUnit\Framework\Exception; -use PHPUnit\Framework\InvalidArgumentException; -use PHPUnit\Framework\MockObject\Generator\CannotUseAddMethodsException; -use PHPUnit\Framework\MockObject\Generator\ClassIsEnumerationException; -use PHPUnit\Framework\MockObject\Generator\ClassIsFinalException; -use PHPUnit\Framework\MockObject\Generator\ClassIsReadonlyException; -use PHPUnit\Framework\MockObject\Generator\DuplicateMethodException; -use PHPUnit\Framework\MockObject\Generator\Generator; -use PHPUnit\Framework\MockObject\Generator\InvalidMethodNameException; -use PHPUnit\Framework\MockObject\Generator\NameAlreadyInUseException; -use PHPUnit\Framework\MockObject\Generator\OriginalConstructorInvocationRequiredException; -use PHPUnit\Framework\MockObject\Generator\ReflectionException; -use PHPUnit\Framework\MockObject\Generator\RuntimeException; -use PHPUnit\Framework\MockObject\Generator\UnknownTypeException; -use PHPUnit\Framework\TestCase; -use ReflectionClass; - -/** - * @psalm-template MockedType - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class MockBuilder -{ - private readonly TestCase $testCase; - - /** - * @psalm-var class-string|trait-string - */ - private readonly string $type; - - /** - * @psalm-var list - */ - private array $methods = []; - private bool $emptyMethodsArray = false; - - /** - * @psalm-var ?class-string - */ - private ?string $mockClassName = null; - private array $constructorArgs = []; - private bool $originalConstructor = true; - private bool $originalClone = true; - private bool $autoload = true; - private bool $cloneArguments = false; - private bool $callOriginalMethods = false; - private ?object $proxyTarget = null; - private bool $allowMockingUnknownTypes = true; - private bool $returnValueGeneration = true; - private readonly Generator $generator; - - /** - * @psalm-param class-string|trait-string $type - */ - public function __construct(TestCase $testCase, string $type) - { - $this->testCase = $testCase; - $this->type = $type; - $this->generator = new Generator; - } - - /** - * Creates a mock object using a fluent interface. - * - * @throws ClassIsEnumerationException - * @throws ClassIsFinalException - * @throws ClassIsReadonlyException - * @throws DuplicateMethodException - * @throws InvalidArgumentException - * @throws InvalidMethodNameException - * @throws NameAlreadyInUseException - * @throws OriginalConstructorInvocationRequiredException - * @throws ReflectionException - * @throws RuntimeException - * @throws UnknownTypeException - * - * @psalm-return MockObject&MockedType - */ - public function getMock(): MockObject - { - $object = $this->generator->testDouble( - $this->type, - true, - !$this->emptyMethodsArray ? $this->methods : null, - $this->constructorArgs, - $this->mockClassName ?? '', - $this->originalConstructor, - $this->originalClone, - $this->autoload, - $this->cloneArguments, - $this->callOriginalMethods, - $this->proxyTarget, - $this->allowMockingUnknownTypes, - $this->returnValueGeneration, - ); - - assert($object instanceof $this->type); - assert($object instanceof MockObject); - - $this->testCase->registerMockObject($object); - - return $object; - } - - /** - * Creates a mock object for an abstract class using a fluent interface. - * - * @throws Exception - * @throws ReflectionException - * @throws RuntimeException - * - * @psalm-return MockObject&MockedType - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5305 - */ - public function getMockForAbstractClass(): MockObject - { - $object = $this->generator->mockObjectForAbstractClass( - $this->type, - $this->constructorArgs, - $this->mockClassName ?? '', - $this->originalConstructor, - $this->originalClone, - $this->autoload, - $this->methods, - $this->cloneArguments, - ); - - assert($object instanceof MockObject); - - $this->testCase->registerMockObject($object); - - return $object; - } - - /** - * Creates a mock object for a trait using a fluent interface. - * - * @throws Exception - * @throws ReflectionException - * @throws RuntimeException - * - * @psalm-return MockObject&MockedType - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5306 - */ - public function getMockForTrait(): MockObject - { - assert(trait_exists($this->type)); - - $object = $this->generator->mockObjectForTrait( - $this->type, - $this->constructorArgs, - $this->mockClassName ?? '', - $this->originalConstructor, - $this->originalClone, - $this->autoload, - $this->methods, - $this->cloneArguments, - ); - - assert($object instanceof MockObject); - - $this->testCase->registerMockObject($object); - - return $object; - } - - /** - * Specifies the subset of methods to mock, requiring each to exist in the class. - * - * @psalm-param list $methods - * - * @throws CannotUseOnlyMethodsException - * @throws ReflectionException - * - * @return $this - */ - public function onlyMethods(array $methods): self - { - if (empty($methods)) { - $this->emptyMethodsArray = true; - - return $this; - } - - try { - $reflector = new ReflectionClass($this->type); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new ReflectionException( - $e->getMessage(), - $e->getCode(), - $e, - ); - // @codeCoverageIgnoreEnd - } - - foreach ($methods as $method) { - if (!$reflector->hasMethod($method)) { - throw new CannotUseOnlyMethodsException($this->type, $method); - } - } - - $this->methods = array_merge($this->methods, $methods); - - return $this; - } - - /** - * Specifies methods that don't exist in the class which you want to mock. - * - * @psalm-param list $methods - * - * @throws CannotUseAddMethodsException - * @throws ReflectionException - * @throws RuntimeException - * - * @return $this - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5320 - */ - public function addMethods(array $methods): self - { - if (empty($methods)) { - $this->emptyMethodsArray = true; - - return $this; - } - - try { - $reflector = new ReflectionClass($this->type); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new ReflectionException( - $e->getMessage(), - $e->getCode(), - $e, - ); - // @codeCoverageIgnoreEnd - } - - foreach ($methods as $method) { - if ($reflector->hasMethod($method)) { - throw new CannotUseAddMethodsException($this->type, $method); - } - } - - $this->methods = array_merge($this->methods, $methods); - - return $this; - } - - /** - * Specifies the arguments for the constructor. - * - * @return $this - */ - public function setConstructorArgs(array $arguments): self - { - $this->constructorArgs = $arguments; - - return $this; - } - - /** - * Specifies the name for the mock class. - * - * @psalm-param class-string $name - * - * @return $this - */ - public function setMockClassName(string $name): self - { - $this->mockClassName = $name; - - return $this; - } - - /** - * Disables the invocation of the original constructor. - * - * @return $this - */ - public function disableOriginalConstructor(): self - { - $this->originalConstructor = false; - - return $this; - } - - /** - * Enables the invocation of the original constructor. - * - * @return $this - */ - public function enableOriginalConstructor(): self - { - $this->originalConstructor = true; - - return $this; - } - - /** - * Disables the invocation of the original clone constructor. - * - * @return $this - */ - public function disableOriginalClone(): self - { - $this->originalClone = false; - - return $this; - } - - /** - * Enables the invocation of the original clone constructor. - * - * @return $this - */ - public function enableOriginalClone(): self - { - $this->originalClone = true; - - return $this; - } - - /** - * Disables the use of class autoloading while creating the mock object. - * - * @return $this - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5309 - * - * @codeCoverageIgnore - */ - public function disableAutoload(): self - { - $this->autoload = false; - - return $this; - } - - /** - * Enables the use of class autoloading while creating the mock object. - * - * @return $this - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5309 - */ - public function enableAutoload(): self - { - $this->autoload = true; - - return $this; - } - - /** - * Disables the cloning of arguments passed to mocked methods. - * - * @return $this - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5315 - */ - public function disableArgumentCloning(): self - { - $this->cloneArguments = false; - - return $this; - } - - /** - * Enables the cloning of arguments passed to mocked methods. - * - * @return $this - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5315 - */ - public function enableArgumentCloning(): self - { - $this->cloneArguments = true; - - return $this; - } - - /** - * Enables the invocation of the original methods. - * - * @return $this - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5307 - * - * @codeCoverageIgnore - */ - public function enableProxyingToOriginalMethods(): self - { - $this->callOriginalMethods = true; - - return $this; - } - - /** - * Disables the invocation of the original methods. - * - * @return $this - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5307 - */ - public function disableProxyingToOriginalMethods(): self - { - $this->callOriginalMethods = false; - $this->proxyTarget = null; - - return $this; - } - - /** - * Sets the proxy target. - * - * @return $this - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5307 - * - * @codeCoverageIgnore - */ - public function setProxyTarget(object $object): self - { - $this->proxyTarget = $object; - - return $this; - } - - /** - * @return $this - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5308 - */ - public function allowMockingUnknownTypes(): self - { - $this->allowMockingUnknownTypes = true; - - return $this; - } - - /** - * @return $this - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5308 - */ - public function disallowMockingUnknownTypes(): self - { - $this->allowMockingUnknownTypes = false; - - return $this; - } - - /** - * @return $this - */ - public function enableAutoReturnValueGeneration(): self - { - $this->returnValueGeneration = true; - - return $this; - } - - /** - * @return $this - */ - public function disableAutoReturnValueGeneration(): self - { - $this->returnValueGeneration = false; - - return $this; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/DoubledCloneMethod.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/DoubledCloneMethod.php deleted file mode 100644 index 17ad85d..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/DoubledCloneMethod.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This trait is not covered by the backward compatibility promise for PHPUnit - */ -trait DoubledCloneMethod -{ - public function __clone(): void - { - $this->__phpunit_invocationMocker = clone $this->__phpunit_getInvocationHandler(); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/Method.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/Method.php deleted file mode 100644 index ef77e3c..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/Method.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -use function call_user_func_array; -use function func_get_args; -use PHPUnit\Framework\MockObject\Builder\InvocationMocker; -use PHPUnit\Framework\MockObject\Rule\AnyInvokedCount; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This trait is not covered by the backward compatibility promise for PHPUnit - */ -trait Method -{ - public function method(): InvocationMocker - { - $expects = $this->expects(new AnyInvokedCount); - - return call_user_func_array( - [$expects, 'method'], - func_get_args(), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/MockObjectApi.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/MockObjectApi.php deleted file mode 100644 index 28b55d6..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/MockObjectApi.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -use PHPUnit\Framework\MockObject\Builder\InvocationMocker as InvocationMockerBuilder; -use PHPUnit\Framework\MockObject\Rule\InvocationOrder; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This trait is not covered by the backward compatibility promise for PHPUnit - */ -trait MockObjectApi -{ - private object $__phpunit_originalObject; - - /** @noinspection MagicMethodsValidityInspection */ - public function __phpunit_hasMatchers(): bool - { - return $this->__phpunit_getInvocationHandler()->hasMatchers(); - } - - /** @noinspection MagicMethodsValidityInspection */ - public function __phpunit_setOriginalObject(object $originalObject): void - { - $this->__phpunit_originalObject = $originalObject; - } - - /** @noinspection MagicMethodsValidityInspection */ - public function __phpunit_verify(bool $unsetInvocationMocker = true): void - { - $this->__phpunit_getInvocationHandler()->verify(); - - if ($unsetInvocationMocker) { - $this->__phpunit_unsetInvocationMocker(); - } - } - - abstract public function __phpunit_getInvocationHandler(): InvocationHandler; - - abstract public function __phpunit_unsetInvocationMocker(): void; - - public function expects(InvocationOrder $matcher): InvocationMockerBuilder - { - return $this->__phpunit_getInvocationHandler()->expects($matcher); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/ProxiedCloneMethod.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/ProxiedCloneMethod.php deleted file mode 100644 index 4099a64..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/ProxiedCloneMethod.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This trait is not covered by the backward compatibility promise for PHPUnit - */ -trait ProxiedCloneMethod -{ - public function __clone(): void - { - $this->__phpunit_invocationMocker = clone $this->__phpunit_getInvocationHandler(); - - parent::__clone(); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/StubApi.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/StubApi.php deleted file mode 100644 index 10dfe4c..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/StubApi.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This trait is not covered by the backward compatibility promise for PHPUnit - */ -trait StubApi -{ - /** - * @psalm-var list - */ - private static array $__phpunit_configurableMethods; - private bool $__phpunit_returnValueGeneration = true; - private ?InvocationHandler $__phpunit_invocationMocker = null; - - /** @noinspection MagicMethodsValidityInspection */ - public static function __phpunit_initConfigurableMethods(ConfigurableMethod ...$configurableMethods): void - { - static::$__phpunit_configurableMethods = $configurableMethods; - } - - /** @noinspection MagicMethodsValidityInspection */ - public function __phpunit_setReturnValueGeneration(bool $returnValueGeneration): void - { - $this->__phpunit_returnValueGeneration = $returnValueGeneration; - } - - /** @noinspection MagicMethodsValidityInspection */ - public function __phpunit_getInvocationHandler(): InvocationHandler - { - if ($this->__phpunit_invocationMocker === null) { - $this->__phpunit_invocationMocker = new InvocationHandler( - static::$__phpunit_configurableMethods, - $this->__phpunit_returnValueGeneration, - ); - } - - return $this->__phpunit_invocationMocker; - } - - /** @noinspection MagicMethodsValidityInspection */ - public function __phpunit_unsetInvocationMocker(): void - { - $this->__phpunit_invocationMocker = null; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/Identity.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/Identity.php deleted file mode 100644 index fafbdd7..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/Identity.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Builder; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This interface is not covered by the backward compatibility promise for PHPUnit - */ -interface Identity -{ - /** - * Sets the identification of the expectation to $id. - * - * @note The identifier is unique per mock object. - */ - public function id(string $id): self; -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/InvocationMocker.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/InvocationMocker.php deleted file mode 100644 index fbff6cb..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/InvocationMocker.php +++ /dev/null @@ -1,325 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Builder; - -use function array_flip; -use function array_key_exists; -use function array_map; -use function array_merge; -use function array_pop; -use function assert; -use function count; -use function is_string; -use function range; -use function strtolower; -use PHPUnit\Framework\Constraint\Constraint; -use PHPUnit\Framework\InvalidArgumentException; -use PHPUnit\Framework\MockObject\ConfigurableMethod; -use PHPUnit\Framework\MockObject\IncompatibleReturnValueException; -use PHPUnit\Framework\MockObject\InvocationHandler; -use PHPUnit\Framework\MockObject\Matcher; -use PHPUnit\Framework\MockObject\MatcherAlreadyRegisteredException; -use PHPUnit\Framework\MockObject\MethodCannotBeConfiguredException; -use PHPUnit\Framework\MockObject\MethodNameAlreadyConfiguredException; -use PHPUnit\Framework\MockObject\MethodNameNotConfiguredException; -use PHPUnit\Framework\MockObject\MethodParametersAlreadyConfiguredException; -use PHPUnit\Framework\MockObject\Rule; -use PHPUnit\Framework\MockObject\Stub\ConsecutiveCalls; -use PHPUnit\Framework\MockObject\Stub\Exception; -use PHPUnit\Framework\MockObject\Stub\ReturnArgument; -use PHPUnit\Framework\MockObject\Stub\ReturnCallback; -use PHPUnit\Framework\MockObject\Stub\ReturnReference; -use PHPUnit\Framework\MockObject\Stub\ReturnSelf; -use PHPUnit\Framework\MockObject\Stub\ReturnStub; -use PHPUnit\Framework\MockObject\Stub\ReturnValueMap; -use PHPUnit\Framework\MockObject\Stub\Stub; -use Throwable; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class InvocationMocker implements InvocationStubber, MethodNameMatch -{ - private readonly InvocationHandler $invocationHandler; - private readonly Matcher $matcher; - - /** - * @psalm-var list - */ - private readonly array $configurableMethods; - - /** - * @psalm-var ?array - */ - private ?array $configurableMethodNames = null; - - public function __construct(InvocationHandler $handler, Matcher $matcher, ConfigurableMethod ...$configurableMethods) - { - $this->invocationHandler = $handler; - $this->matcher = $matcher; - $this->configurableMethods = $configurableMethods; - } - - /** - * @throws MatcherAlreadyRegisteredException - * - * @return $this - */ - public function id(string $id): self - { - $this->invocationHandler->registerMatcher($id, $this->matcher); - - return $this; - } - - /** - * @return $this - */ - public function will(Stub $stub): Identity - { - $this->matcher->setStub($stub); - - return $this; - } - - /** - * @throws IncompatibleReturnValueException - */ - public function willReturn(mixed $value, mixed ...$nextValues): self - { - if (count($nextValues) === 0) { - $this->ensureTypeOfReturnValues([$value]); - - $stub = $value instanceof Stub ? $value : new ReturnStub($value); - - return $this->will($stub); - } - - $values = array_merge([$value], $nextValues); - - $this->ensureTypeOfReturnValues($values); - - $stub = new ConsecutiveCalls($values); - - return $this->will($stub); - } - - public function willReturnReference(mixed &$reference): self - { - $stub = new ReturnReference($reference); - - return $this->will($stub); - } - - public function willReturnMap(array $valueMap): self - { - $method = $this->configuredMethod(); - - assert($method instanceof ConfigurableMethod); - - $numberOfParameters = $method->numberOfParameters(); - $defaultValues = $method->defaultParameterValues(); - $hasDefaultValues = !empty($defaultValues); - - $_valueMap = []; - - foreach ($valueMap as $mapping) { - $numberOfConfiguredParameters = count($mapping) - 1; - - if ($numberOfConfiguredParameters === $numberOfParameters || !$hasDefaultValues) { - $_valueMap[] = $mapping; - - continue; - } - - $_mapping = []; - $returnValue = array_pop($mapping); - - foreach (range(0, $numberOfParameters - 1) as $i) { - if (isset($mapping[$i])) { - $_mapping[] = $mapping[$i]; - - continue; - } - - if (isset($defaultValues[$i])) { - $_mapping[] = $defaultValues[$i]; - } - } - - $_mapping[] = $returnValue; - $_valueMap[] = $_mapping; - } - - $stub = new ReturnValueMap($_valueMap); - - return $this->will($stub); - } - - public function willReturnArgument(int $argumentIndex): self - { - $stub = new ReturnArgument($argumentIndex); - - return $this->will($stub); - } - - public function willReturnCallback(callable $callback): self - { - $stub = new ReturnCallback($callback); - - return $this->will($stub); - } - - public function willReturnSelf(): self - { - $stub = new ReturnSelf; - - return $this->will($stub); - } - - public function willReturnOnConsecutiveCalls(mixed ...$values): self - { - $stub = new ConsecutiveCalls($values); - - return $this->will($stub); - } - - public function willThrowException(Throwable $exception): self - { - $stub = new Exception($exception); - - return $this->will($stub); - } - - /** - * @return $this - */ - public function after(string $id): self - { - $this->matcher->setAfterMatchBuilderId($id); - - return $this; - } - - /** - * @throws \PHPUnit\Framework\Exception - * @throws MethodNameNotConfiguredException - * @throws MethodParametersAlreadyConfiguredException - * - * @return $this - */ - public function with(mixed ...$arguments): self - { - $this->ensureParametersCanBeConfigured(); - - $this->matcher->setParametersRule(new Rule\Parameters($arguments)); - - return $this; - } - - /** - * @throws MethodNameNotConfiguredException - * @throws MethodParametersAlreadyConfiguredException - * - * @return $this - */ - public function withAnyParameters(): self - { - $this->ensureParametersCanBeConfigured(); - - $this->matcher->setParametersRule(new Rule\AnyParameters); - - return $this; - } - - /** - * @throws InvalidArgumentException - * @throws MethodCannotBeConfiguredException - * @throws MethodNameAlreadyConfiguredException - * - * @return $this - */ - public function method(Constraint|string $constraint): self - { - if ($this->matcher->hasMethodNameRule()) { - throw new MethodNameAlreadyConfiguredException; - } - - if (is_string($constraint)) { - $this->configurableMethodNames ??= array_flip( - array_map( - static fn (ConfigurableMethod $configurable) => strtolower($configurable->name()), - $this->configurableMethods, - ), - ); - - if (!array_key_exists(strtolower($constraint), $this->configurableMethodNames)) { - throw new MethodCannotBeConfiguredException($constraint); - } - } - - $this->matcher->setMethodNameRule(new Rule\MethodName($constraint)); - - return $this; - } - - /** - * @throws MethodNameNotConfiguredException - * @throws MethodParametersAlreadyConfiguredException - */ - private function ensureParametersCanBeConfigured(): void - { - if (!$this->matcher->hasMethodNameRule()) { - throw new MethodNameNotConfiguredException; - } - - if ($this->matcher->hasParametersRule()) { - throw new MethodParametersAlreadyConfiguredException; - } - } - - private function configuredMethod(): ?ConfigurableMethod - { - $configuredMethod = null; - - foreach ($this->configurableMethods as $configurableMethod) { - if ($this->matcher->methodNameRule()->matchesName($configurableMethod->name())) { - if ($configuredMethod !== null) { - return null; - } - - $configuredMethod = $configurableMethod; - } - } - - return $configuredMethod; - } - - /** - * @throws IncompatibleReturnValueException - */ - private function ensureTypeOfReturnValues(array $values): void - { - $configuredMethod = $this->configuredMethod(); - - if ($configuredMethod === null) { - return; - } - - foreach ($values as $value) { - if (!$configuredMethod->mayReturn($value)) { - throw new IncompatibleReturnValueException( - $configuredMethod, - $value, - ); - } - } - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/InvocationStubber.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/InvocationStubber.php deleted file mode 100644 index 9918b77..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/InvocationStubber.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Builder; - -use PHPUnit\Framework\MockObject\Stub\Stub; -use Throwable; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface InvocationStubber -{ - public function will(Stub $stub): Identity; - - public function willReturn(mixed $value, mixed ...$nextValues): self; - - public function willReturnReference(mixed &$reference): self; - - /** - * @psalm-param array> $valueMap - */ - public function willReturnMap(array $valueMap): self; - - public function willReturnArgument(int $argumentIndex): self; - - public function willReturnCallback(callable $callback): self; - - public function willReturnSelf(): self; - - public function willReturnOnConsecutiveCalls(mixed ...$values): self; - - public function willThrowException(Throwable $exception): self; -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/MethodNameMatch.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/MethodNameMatch.php deleted file mode 100644 index 75c1f63..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/MethodNameMatch.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Builder; - -use PHPUnit\Framework\Constraint\Constraint; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This interface is not covered by the backward compatibility promise for PHPUnit - */ -interface MethodNameMatch extends ParametersMatch -{ - /** - * Adds a new method name match and returns the parameter match object for - * further matching possibilities. - */ - public function method(Constraint|string $constraint): self; -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/ParametersMatch.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/ParametersMatch.php deleted file mode 100644 index 72c116e..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/ParametersMatch.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Builder; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This interface is not covered by the backward compatibility promise for PHPUnit - */ -interface ParametersMatch extends Stub -{ - /** - * Defines the expectation which must occur before the current is valid. - */ - public function after(string $id): Stub; - - /** - * Sets the parameters to match for, each parameter to this function will - * be part of match. To perform specific matches or constraints create a - * new PHPUnit\Framework\Constraint\Constraint and use it for the parameter. - * If the parameter value is not a constraint it will use the - * PHPUnit\Framework\Constraint\IsEqual for the value. - * - * Some examples: - * - * // match first parameter with value 2 - * $b->with(2); - * // match first parameter with value 'smock' and second identical to 42 - * $b->with('smock', new PHPUnit\Framework\Constraint\IsEqual(42)); - * - */ - public function with(mixed ...$arguments): self; - - /** - * Sets a rule which allows any kind of parameters. - * - * Some examples: - * - * // match any number of parameters - * $b->withAnyParameters(); - * - */ - public function withAnyParameters(): self; -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/Stub.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/Stub.php deleted file mode 100644 index c4aaf1f..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/Stub.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Builder; - -use PHPUnit\Framework\MockObject\Stub\Stub as BaseStub; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This interface is not covered by the backward compatibility promise for PHPUnit - */ -interface Stub extends Identity -{ - /** - * Stubs the matching method with the stub object $stub. Any invocations of - * the matched method will now be handled by the stub instead. - */ - public function will(BaseStub $stub): Identity; -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/MockObject.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/MockObject.php deleted file mode 100644 index 4096d73..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/MockObject.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -use PHPUnit\Framework\MockObject\Builder\InvocationMocker; -use PHPUnit\Framework\MockObject\Rule\InvocationOrder; - -/** - * @method InvocationMocker method($constraint) - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface MockObject extends Stub -{ - public function expects(InvocationOrder $invocationRule): InvocationMocker; -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/MockObjectInternal.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/MockObjectInternal.php deleted file mode 100644 index fe5bbdf..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/MockObjectInternal.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This interface is not covered by the backward compatibility promise for PHPUnit - */ -interface MockObjectInternal extends MockObject, StubInternal -{ - public function __phpunit_hasMatchers(): bool; - - public function __phpunit_setOriginalObject(object $originalObject): void; - - public function __phpunit_verify(bool $unsetInvocationMocker = true): void; -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/Stub.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/Stub.php deleted file mode 100644 index 96f84d2..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/Stub.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -use PHPUnit\Framework\MockObject\Builder\InvocationStubber; - -/** - * @method InvocationStubber method($constraint) - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface Stub -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/StubInternal.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/StubInternal.php deleted file mode 100644 index 91f6464..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/StubInternal.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This interface is not covered by the backward compatibility promise for PHPUnit - */ -interface StubInternal extends Stub -{ - public static function __phpunit_initConfigurableMethods(ConfigurableMethod ...$configurableMethods): void; - - public function __phpunit_getInvocationHandler(): InvocationHandler; - - public function __phpunit_setReturnValueGeneration(bool $returnValueGeneration): void; - - public function __phpunit_unsetInvocationMocker(): void; -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Invocation.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Invocation.php deleted file mode 100644 index 008b372..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Invocation.php +++ /dev/null @@ -1,152 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -use function array_map; -use function implode; -use function is_object; -use function sprintf; -use function str_starts_with; -use function strtolower; -use function substr; -use PHPUnit\Framework\SelfDescribing; -use PHPUnit\Util\Cloner; -use SebastianBergmann\Exporter\Exporter; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Invocation implements SelfDescribing -{ - /** - * @psalm-var class-string - */ - private readonly string $className; - - /** - * @psalm-var non-empty-string - */ - private readonly string $methodName; - private readonly array $parameters; - private readonly string $returnType; - private readonly bool $isReturnTypeNullable; - private readonly bool $proxiedCall; - private readonly MockObjectInternal|StubInternal $object; - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - */ - public function __construct(string $className, string $methodName, array $parameters, string $returnType, MockObjectInternal|StubInternal $object, bool $cloneObjects = false, bool $proxiedCall = false) - { - $this->className = $className; - $this->methodName = $methodName; - $this->object = $object; - $this->proxiedCall = $proxiedCall; - - if (strtolower($methodName) === '__tostring') { - $returnType = 'string'; - } - - if (str_starts_with($returnType, '?')) { - $returnType = substr($returnType, 1); - $this->isReturnTypeNullable = true; - } else { - $this->isReturnTypeNullable = false; - } - - $this->returnType = $returnType; - - if (!$cloneObjects) { - $this->parameters = $parameters; - - return; - } - - foreach ($parameters as $key => $value) { - if (is_object($value)) { - $parameters[$key] = Cloner::clone($value); - } - } - - $this->parameters = $parameters; - } - - /** - * @psalm-return class-string - */ - public function className(): string - { - return $this->className; - } - - /** - * @psalm-return non-empty-string - */ - public function methodName(): string - { - return $this->methodName; - } - - public function parameters(): array - { - return $this->parameters; - } - - /** - * @throws Exception - */ - public function generateReturnValue(): mixed - { - if ($this->returnType === 'never') { - throw new NeverReturningMethodException( - $this->className, - $this->methodName, - ); - } - - if ($this->isReturnTypeNullable || $this->proxiedCall) { - return null; - } - - return (new ReturnValueGenerator)->generate( - $this->className, - $this->methodName, - $this->object::class, - $this->returnType, - ); - } - - public function toString(): string - { - $exporter = new Exporter; - - return sprintf( - '%s::%s(%s)%s', - $this->className, - $this->methodName, - implode( - ', ', - array_map( - [$exporter, 'shortenedExport'], - $this->parameters, - ), - ), - $this->returnType ? sprintf(': %s', $this->returnType) : '', - ); - } - - public function object(): MockObjectInternal|StubInternal - { - return $this->object; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/InvocationHandler.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/InvocationHandler.php deleted file mode 100644 index 4228d17..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/InvocationHandler.php +++ /dev/null @@ -1,154 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -use function strtolower; -use Exception; -use PHPUnit\Framework\MockObject\Builder\InvocationMocker; -use PHPUnit\Framework\MockObject\Rule\InvocationOrder; -use Throwable; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class InvocationHandler -{ - /** - * @psalm-var list - */ - private array $matchers = []; - - /** - * @psalm-var array - */ - private array $matcherMap = []; - - /** - * @psalm-var list - */ - private readonly array $configurableMethods; - private readonly bool $returnValueGeneration; - - /** - * @psalm-param list $configurableMethods - */ - public function __construct(array $configurableMethods, bool $returnValueGeneration) - { - $this->configurableMethods = $configurableMethods; - $this->returnValueGeneration = $returnValueGeneration; - } - - public function hasMatchers(): bool - { - foreach ($this->matchers as $matcher) { - if ($matcher->hasMatchers()) { - return true; - } - } - - return false; - } - - /** - * Looks up the match builder with identification $id and returns it. - */ - public function lookupMatcher(string $id): ?Matcher - { - return $this->matcherMap[$id] ?? null; - } - - /** - * Registers a matcher with the identification $id. The matcher can later be - * looked up using lookupMatcher() to figure out if it has been invoked. - * - * @throws MatcherAlreadyRegisteredException - */ - public function registerMatcher(string $id, Matcher $matcher): void - { - if (isset($this->matcherMap[$id])) { - throw new MatcherAlreadyRegisteredException($id); - } - - $this->matcherMap[$id] = $matcher; - } - - public function expects(InvocationOrder $rule): InvocationMocker - { - $matcher = new Matcher($rule); - $this->addMatcher($matcher); - - return new InvocationMocker( - $this, - $matcher, - ...$this->configurableMethods, - ); - } - - /** - * @throws \PHPUnit\Framework\MockObject\Exception - * @throws Exception - */ - public function invoke(Invocation $invocation): mixed - { - $exception = null; - $hasReturnValue = false; - $returnValue = null; - - foreach ($this->matchers as $match) { - try { - if ($match->matches($invocation)) { - $value = $match->invoked($invocation); - - if (!$hasReturnValue) { - $returnValue = $value; - $hasReturnValue = true; - } - } - } catch (Exception $e) { - $exception = $e; - } - } - - if ($exception !== null) { - throw $exception; - } - - if ($hasReturnValue) { - return $returnValue; - } - - if (!$this->returnValueGeneration) { - if (strtolower($invocation->methodName()) === '__tostring') { - return ''; - } - - throw new ReturnValueNotConfiguredException($invocation); - } - - return $invocation->generateReturnValue(); - } - - /** - * @throws Throwable - */ - public function verify(): void - { - foreach ($this->matchers as $matcher) { - $matcher->verify(); - } - } - - private function addMatcher(Matcher $matcher): void - { - $this->matchers[] = $matcher; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Matcher.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Matcher.php deleted file mode 100644 index 128a585..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Matcher.php +++ /dev/null @@ -1,212 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -use function sprintf; -use PHPUnit\Framework\ExpectationFailedException; -use PHPUnit\Framework\MockObject\Rule\AnyInvokedCount; -use PHPUnit\Framework\MockObject\Rule\AnyParameters; -use PHPUnit\Framework\MockObject\Rule\InvocationOrder; -use PHPUnit\Framework\MockObject\Rule\InvokedAtMostCount; -use PHPUnit\Framework\MockObject\Rule\InvokedCount; -use PHPUnit\Framework\MockObject\Rule\MethodName; -use PHPUnit\Framework\MockObject\Rule\ParametersRule; -use PHPUnit\Framework\MockObject\Stub\Stub; -use PHPUnit\Util\ThrowableToStringMapper; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Matcher -{ - private readonly InvocationOrder $invocationRule; - private ?string $afterMatchBuilderId = null; - private ?MethodName $methodNameRule = null; - private ?ParametersRule $parametersRule = null; - private ?Stub $stub = null; - - public function __construct(InvocationOrder $rule) - { - $this->invocationRule = $rule; - } - - public function hasMatchers(): bool - { - return !$this->invocationRule instanceof AnyInvokedCount; - } - - public function hasMethodNameRule(): bool - { - return $this->methodNameRule !== null; - } - - public function methodNameRule(): MethodName - { - return $this->methodNameRule; - } - - public function setMethodNameRule(MethodName $rule): void - { - $this->methodNameRule = $rule; - } - - public function hasParametersRule(): bool - { - return $this->parametersRule !== null; - } - - public function setParametersRule(ParametersRule $rule): void - { - $this->parametersRule = $rule; - } - - public function setStub(Stub $stub): void - { - $this->stub = $stub; - } - - public function setAfterMatchBuilderId(string $id): void - { - $this->afterMatchBuilderId = $id; - } - - /** - * @throws Exception - * @throws ExpectationFailedException - * @throws MatchBuilderNotFoundException - * @throws MethodNameNotConfiguredException - * @throws RuntimeException - */ - public function invoked(Invocation $invocation): mixed - { - if ($this->methodNameRule === null) { - throw new MethodNameNotConfiguredException; - } - - if ($this->afterMatchBuilderId !== null) { - $matcher = $invocation->object() - ->__phpunit_getInvocationHandler() - ->lookupMatcher($this->afterMatchBuilderId); - - if (!$matcher) { - throw new MatchBuilderNotFoundException($this->afterMatchBuilderId); - } - } - - $this->invocationRule->invoked($invocation); - - try { - $this->parametersRule?->apply($invocation); - } catch (ExpectationFailedException $e) { - throw new ExpectationFailedException( - sprintf( - "Expectation failed for %s when %s\n%s", - $this->methodNameRule->toString(), - $this->invocationRule->toString(), - $e->getMessage(), - ), - $e->getComparisonFailure(), - ); - } - - if ($this->stub) { - return $this->stub->invoke($invocation); - } - - return $invocation->generateReturnValue(); - } - - /** - * @throws ExpectationFailedException - * @throws MatchBuilderNotFoundException - * @throws MethodNameNotConfiguredException - * @throws RuntimeException - */ - public function matches(Invocation $invocation): bool - { - if ($this->afterMatchBuilderId !== null) { - $matcher = $invocation->object() - ->__phpunit_getInvocationHandler() - ->lookupMatcher($this->afterMatchBuilderId); - - if (!$matcher) { - throw new MatchBuilderNotFoundException($this->afterMatchBuilderId); - } - - if (!$matcher->invocationRule->hasBeenInvoked()) { - return false; - } - } - - if ($this->methodNameRule === null) { - throw new MethodNameNotConfiguredException; - } - - if (!$this->invocationRule->matches($invocation)) { - return false; - } - - try { - if (!$this->methodNameRule->matches($invocation)) { - return false; - } - } catch (ExpectationFailedException $e) { - throw new ExpectationFailedException( - sprintf( - "Expectation failed for %s when %s\n%s", - $this->methodNameRule->toString(), - $this->invocationRule->toString(), - $e->getMessage(), - ), - $e->getComparisonFailure(), - ); - } - - return true; - } - - /** - * @throws ExpectationFailedException - * @throws MethodNameNotConfiguredException - */ - public function verify(): void - { - if ($this->methodNameRule === null) { - throw new MethodNameNotConfiguredException; - } - - try { - $this->invocationRule->verify(); - - if ($this->parametersRule === null) { - $this->parametersRule = new AnyParameters; - } - - $invocationIsAny = $this->invocationRule instanceof AnyInvokedCount; - $invocationIsNever = $this->invocationRule instanceof InvokedCount && $this->invocationRule->isNever(); - $invocationIsAtMost = $this->invocationRule instanceof InvokedAtMostCount; - - if (!$invocationIsAny && !$invocationIsNever && !$invocationIsAtMost) { - $this->parametersRule->verify(); - } - } catch (ExpectationFailedException $e) { - throw new ExpectationFailedException( - sprintf( - "Expectation failed for %s when %s.\n%s", - $this->methodNameRule->toString(), - $this->invocationRule->toString(), - ThrowableToStringMapper::map($e), - ), - ); - } - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/MethodNameConstraint.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/MethodNameConstraint.php deleted file mode 100644 index db17134..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/MethodNameConstraint.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -use function sprintf; -use function strtolower; -use PHPUnit\Framework\Constraint\Constraint; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class MethodNameConstraint extends Constraint -{ - private readonly string $methodName; - - public function __construct(string $methodName) - { - $this->methodName = $methodName; - } - - public function toString(): string - { - return sprintf( - 'is "%s"', - $this->methodName, - ); - } - - protected function matches(mixed $other): bool - { - return strtolower($this->methodName) === strtolower((string) $other); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/ReturnValueGenerator.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/ReturnValueGenerator.php deleted file mode 100644 index 7cf1cd6..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/ReturnValueGenerator.php +++ /dev/null @@ -1,250 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -use function array_keys; -use function array_map; -use function explode; -use function in_array; -use function interface_exists; -use function sprintf; -use function str_contains; -use function str_ends_with; -use function str_starts_with; -use function substr; -use PHPUnit\Framework\MockObject\Generator\Generator; -use ReflectionClass; -use stdClass; -use Throwable; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ReturnValueGenerator -{ - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - * @psalm-param class-string $stubClassName - * - * @throws Exception - */ - public function generate(string $className, string $methodName, string $stubClassName, string $returnType): mixed - { - $intersection = false; - $union = false; - - if (str_contains($returnType, '|')) { - $types = explode('|', $returnType); - $union = true; - - foreach (array_keys($types) as $key) { - if (str_starts_with($types[$key], '(') && str_ends_with($types[$key], ')')) { - $types[$key] = substr($types[$key], 1, -1); - } - } - } elseif (str_contains($returnType, '&')) { - $types = explode('&', $returnType); - $intersection = true; - } else { - $types = [$returnType]; - } - - if (!$intersection) { - $lowerTypes = array_map('strtolower', $types); - - if (in_array('', $lowerTypes, true) || - in_array('null', $lowerTypes, true) || - in_array('mixed', $lowerTypes, true) || - in_array('void', $lowerTypes, true)) { - return null; - } - - if (in_array('true', $lowerTypes, true)) { - return true; - } - - if (in_array('false', $lowerTypes, true) || - in_array('bool', $lowerTypes, true)) { - return false; - } - - if (in_array('float', $lowerTypes, true)) { - return 0.0; - } - - if (in_array('int', $lowerTypes, true)) { - return 0; - } - - if (in_array('string', $lowerTypes, true)) { - return ''; - } - - if (in_array('array', $lowerTypes, true)) { - return []; - } - - if (in_array('static', $lowerTypes, true)) { - return $this->newInstanceOf($stubClassName, $className, $methodName); - } - - if (in_array('object', $lowerTypes, true)) { - return new stdClass; - } - - if (in_array('callable', $lowerTypes, true) || - in_array('closure', $lowerTypes, true)) { - return static function (): void - { - }; - } - - if (in_array('traversable', $lowerTypes, true) || - in_array('generator', $lowerTypes, true) || - in_array('iterable', $lowerTypes, true)) { - $generator = static function (): \Generator - { - yield from []; - }; - - return $generator(); - } - - if (!$union) { - return $this->testDoubleFor($returnType, $className, $methodName); - } - } - - if ($union) { - foreach ($types as $type) { - if (str_contains($type, '&')) { - $_types = explode('&', $type); - - if ($this->onlyInterfaces($_types)) { - return $this->testDoubleForIntersectionOfInterfaces($_types, $className, $methodName); - } - } - } - } - - if ($intersection && $this->onlyInterfaces($types)) { - return $this->testDoubleForIntersectionOfInterfaces($types, $className, $methodName); - } - - $reason = ''; - - if ($union) { - $reason = ' because the declared return type is a union'; - } elseif ($intersection) { - $reason = ' because the declared return type is an intersection'; - } - - throw new RuntimeException( - sprintf( - 'Return value for %s::%s() cannot be generated%s, please configure a return value for this method', - $className, - $methodName, - $reason, - ), - ); - } - - /** - * @psalm-param non-empty-list $types - */ - private function onlyInterfaces(array $types): bool - { - foreach ($types as $type) { - if (!interface_exists($type)) { - return false; - } - } - - return true; - } - - /** - * @psalm-param class-string $stubClassName - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - * - * @throws RuntimeException - */ - private function newInstanceOf(string $stubClassName, string $className, string $methodName): Stub - { - try { - return (new ReflectionClass($stubClassName))->newInstanceWithoutConstructor(); - // @codeCoverageIgnoreStart - } catch (Throwable $t) { - throw new RuntimeException( - sprintf( - 'Return value for %s::%s() cannot be generated: %s', - $className, - $methodName, - $t->getMessage(), - ), - ); - // @codeCoverageIgnoreEnd - } - } - - /** - * @psalm-param class-string $type - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - * - * @throws RuntimeException - */ - private function testDoubleFor(string $type, string $className, string $methodName): Stub - { - try { - return (new Generator)->testDouble($type, false, [], [], '', false); - // @codeCoverageIgnoreStart - } catch (Throwable $t) { - throw new RuntimeException( - sprintf( - 'Return value for %s::%s() cannot be generated: %s', - $className, - $methodName, - $t->getMessage(), - ), - ); - // @codeCoverageIgnoreEnd - } - } - - /** - * @psalm-param non-empty-list $types - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - * - * @throws RuntimeException - */ - private function testDoubleForIntersectionOfInterfaces(array $types, string $className, string $methodName): Stub - { - try { - return (new Generator)->testDoubleForInterfaceIntersection($types, false); - // @codeCoverageIgnoreStart - } catch (Throwable $t) { - throw new RuntimeException( - sprintf( - 'Return value for %s::%s() cannot be generated: %s', - $className, - $methodName, - $t->getMessage(), - ), - ); - // @codeCoverageIgnoreEnd - } - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/AnyInvokedCount.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/AnyInvokedCount.php deleted file mode 100644 index 382f930..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/AnyInvokedCount.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Rule; - -use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class AnyInvokedCount extends InvocationOrder -{ - public function toString(): string - { - return 'invoked zero or more times'; - } - - public function verify(): void - { - } - - public function matches(BaseInvocation $invocation): bool - { - return true; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/AnyParameters.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/AnyParameters.php deleted file mode 100644 index 01a54d1..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/AnyParameters.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Rule; - -use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class AnyParameters implements ParametersRule -{ - public function apply(BaseInvocation $invocation): void - { - } - - public function verify(): void - { - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvocationOrder.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvocationOrder.php deleted file mode 100644 index 5d8429d..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvocationOrder.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Rule; - -use function count; -use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; -use PHPUnit\Framework\SelfDescribing; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -abstract class InvocationOrder implements SelfDescribing -{ - /** - * @psalm-var list - */ - private array $invocations = []; - - public function numberOfInvocations(): int - { - return count($this->invocations); - } - - public function hasBeenInvoked(): bool - { - return count($this->invocations) > 0; - } - - final public function invoked(BaseInvocation $invocation): void - { - $this->invocations[] = $invocation; - - $this->invokedDo($invocation); - } - - abstract public function matches(BaseInvocation $invocation): bool; - - abstract public function verify(): void; - - protected function invokedDo(BaseInvocation $invocation): void - { - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedAtLeastCount.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedAtLeastCount.php deleted file mode 100644 index a78d933..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedAtLeastCount.php +++ /dev/null @@ -1,66 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Rule; - -use function sprintf; -use PHPUnit\Framework\ExpectationFailedException; -use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class InvokedAtLeastCount extends InvocationOrder -{ - private readonly int $requiredInvocations; - - public function __construct(int $requiredInvocations) - { - $this->requiredInvocations = $requiredInvocations; - } - - public function toString(): string - { - return sprintf( - 'invoked at least %d time%s', - $this->requiredInvocations, - $this->requiredInvocations !== 1 ? 's' : '', - ); - } - - /** - * Verifies that the current expectation is valid. If everything is OK the - * code should just return, if not it must throw an exception. - * - * @throws ExpectationFailedException - */ - public function verify(): void - { - $actualInvocations = $this->numberOfInvocations(); - - if ($actualInvocations < $this->requiredInvocations) { - throw new ExpectationFailedException( - sprintf( - 'Expected invocation at least %d time%s but it occurred %d time%s.', - $this->requiredInvocations, - $this->requiredInvocations !== 1 ? 's' : '', - $actualInvocations, - $actualInvocations !== 1 ? 's' : '', - ), - ); - } - } - - public function matches(BaseInvocation $invocation): bool - { - return true; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedAtLeastOnce.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedAtLeastOnce.php deleted file mode 100644 index 91026f5..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedAtLeastOnce.php +++ /dev/null @@ -1,48 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Rule; - -use PHPUnit\Framework\ExpectationFailedException; -use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class InvokedAtLeastOnce extends InvocationOrder -{ - public function toString(): string - { - return 'invoked at least once'; - } - - /** - * Verifies that the current expectation is valid. If everything is OK the - * code should just return, if not it must throw an exception. - * - * @throws ExpectationFailedException - */ - public function verify(): void - { - $count = $this->numberOfInvocations(); - - if ($count < 1) { - throw new ExpectationFailedException( - 'Expected invocation at least once but it never occurred.', - ); - } - } - - public function matches(BaseInvocation $invocation): bool - { - return true; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedAtMostCount.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedAtMostCount.php deleted file mode 100644 index 0cfda5e..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedAtMostCount.php +++ /dev/null @@ -1,66 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Rule; - -use function sprintf; -use PHPUnit\Framework\ExpectationFailedException; -use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class InvokedAtMostCount extends InvocationOrder -{ - private readonly int $allowedInvocations; - - public function __construct(int $allowedInvocations) - { - $this->allowedInvocations = $allowedInvocations; - } - - public function toString(): string - { - return sprintf( - 'invoked at most %d time%s', - $this->allowedInvocations, - $this->allowedInvocations !== 1 ? 's' : '', - ); - } - - /** - * Verifies that the current expectation is valid. If everything is OK the - * code should just return, if not it must throw an exception. - * - * @throws ExpectationFailedException - */ - public function verify(): void - { - $actualInvocations = $this->numberOfInvocations(); - - if ($actualInvocations > $this->allowedInvocations) { - throw new ExpectationFailedException( - sprintf( - 'Expected invocation at most %d time%s but it occurred %d time%s.', - $this->allowedInvocations, - $this->allowedInvocations !== 1 ? 's' : '', - $actualInvocations, - $actualInvocations !== 1 ? 's' : '', - ), - ); - } - } - - public function matches(BaseInvocation $invocation): bool - { - return true; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedCount.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedCount.php deleted file mode 100644 index 3f0e505..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedCount.php +++ /dev/null @@ -1,94 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Rule; - -use function sprintf; -use PHPUnit\Framework\ExpectationFailedException; -use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class InvokedCount extends InvocationOrder -{ - private readonly int $expectedCount; - - public function __construct(int $expectedCount) - { - $this->expectedCount = $expectedCount; - } - - public function isNever(): bool - { - return $this->expectedCount === 0; - } - - public function toString(): string - { - return sprintf( - 'invoked %d time%s', - $this->expectedCount, - $this->expectedCount !== 1 ? 's' : '', - ); - } - - public function matches(BaseInvocation $invocation): bool - { - return true; - } - - /** - * Verifies that the current expectation is valid. If everything is OK the - * code should just return, if not it must throw an exception. - * - * @throws ExpectationFailedException - */ - public function verify(): void - { - $actualCount = $this->numberOfInvocations(); - - if ($actualCount !== $this->expectedCount) { - throw new ExpectationFailedException( - sprintf( - 'Method was expected to be called %d time%s, actually called %d time%s.', - $this->expectedCount, - $this->expectedCount !== 1 ? 's' : '', - $actualCount, - $actualCount !== 1 ? 's' : '', - ), - ); - } - } - - /** - * @throws ExpectationFailedException - */ - protected function invokedDo(BaseInvocation $invocation): void - { - $count = $this->numberOfInvocations(); - - if ($count > $this->expectedCount) { - $message = $invocation->toString() . ' '; - - $message .= match ($this->expectedCount) { - 0 => 'was not expected to be called.', - 1 => 'was not expected to be called more than once.', - default => sprintf( - 'was not expected to be called more than %d times.', - $this->expectedCount, - ), - }; - - throw new ExpectationFailedException($message); - } - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/MethodName.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/MethodName.php deleted file mode 100644 index 8ca6da6..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/MethodName.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Rule; - -use function is_string; -use PHPUnit\Framework\Constraint\Constraint; -use PHPUnit\Framework\ExpectationFailedException; -use PHPUnit\Framework\InvalidArgumentException; -use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; -use PHPUnit\Framework\MockObject\MethodNameConstraint; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class MethodName -{ - private readonly Constraint $constraint; - - /** - * @throws InvalidArgumentException - */ - public function __construct(Constraint|string $constraint) - { - if (is_string($constraint)) { - $constraint = new MethodNameConstraint($constraint); - } - - $this->constraint = $constraint; - } - - public function toString(): string - { - return 'method name ' . $this->constraint->toString(); - } - - /** - * @throws ExpectationFailedException - */ - public function matches(BaseInvocation $invocation): bool - { - return $this->matchesName($invocation->methodName()); - } - - /** - * @throws ExpectationFailedException - */ - public function matchesName(string $methodName): bool - { - return (bool) $this->constraint->evaluate($methodName, '', true); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/Parameters.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/Parameters.php deleted file mode 100644 index 61c7918..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/Parameters.php +++ /dev/null @@ -1,141 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Rule; - -use function count; -use function sprintf; -use Exception; -use PHPUnit\Framework\Constraint\Callback; -use PHPUnit\Framework\Constraint\Constraint; -use PHPUnit\Framework\Constraint\IsAnything; -use PHPUnit\Framework\Constraint\IsEqual; -use PHPUnit\Framework\ExpectationFailedException; -use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Parameters implements ParametersRule -{ - /** - * @psalm-var list - */ - private array $parameters = []; - private ?BaseInvocation $invocation = null; - private null|bool|ExpectationFailedException $parameterVerificationResult; - - /** - * @throws \PHPUnit\Framework\Exception - */ - public function __construct(array $parameters) - { - foreach ($parameters as $parameter) { - if (!($parameter instanceof Constraint)) { - $parameter = new IsEqual( - $parameter, - ); - } - - $this->parameters[] = $parameter; - } - } - - /** - * @throws Exception - */ - public function apply(BaseInvocation $invocation): void - { - $this->invocation = $invocation; - $this->parameterVerificationResult = null; - - try { - $this->parameterVerificationResult = $this->doVerify(); - } catch (ExpectationFailedException $e) { - $this->parameterVerificationResult = $e; - - throw $this->parameterVerificationResult; - } - } - - /** - * Checks if the invocation $invocation matches the current rules. If it - * does the rule will get the invoked() method called which should check - * if an expectation is met. - * - * @throws ExpectationFailedException - */ - public function verify(): void - { - $this->doVerify(); - } - - /** - * @throws ExpectationFailedException - */ - private function doVerify(): bool - { - if (isset($this->parameterVerificationResult)) { - return $this->guardAgainstDuplicateEvaluationOfParameterConstraints(); - } - - if ($this->invocation === null) { - throw new ExpectationFailedException('Doubled method does not exist.'); - } - - if (count($this->invocation->parameters()) < count($this->parameters)) { - $message = 'Parameter count for invocation %s is too low.'; - - // The user called `->with($this->anything())`, but may have meant - // `->withAnyParameters()`. - // - // @see https://github.com/sebastianbergmann/phpunit-mock-objects/issues/199 - if (count($this->parameters) === 1 && - $this->parameters[0]::class === IsAnything::class) { - $message .= "\nTo allow 0 or more parameters with any value, omit ->with() or use ->withAnyParameters() instead."; - } - - throw new ExpectationFailedException( - sprintf($message, $this->invocation->toString()), - ); - } - - foreach ($this->parameters as $i => $parameter) { - if ($parameter instanceof Callback && $parameter->isVariadic()) { - $other = $this->invocation->parameters(); - } else { - $other = $this->invocation->parameters()[$i]; - } - $parameter->evaluate( - $other, - sprintf( - 'Parameter %s for invocation %s does not match expected value.', - $i, - $this->invocation->toString(), - ), - ); - } - - return true; - } - - /** - * @throws ExpectationFailedException - */ - private function guardAgainstDuplicateEvaluationOfParameterConstraints(): bool - { - if ($this->parameterVerificationResult instanceof ExpectationFailedException) { - throw $this->parameterVerificationResult; - } - - return (bool) $this->parameterVerificationResult; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/ParametersRule.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/ParametersRule.php deleted file mode 100644 index 03cfe2a..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/ParametersRule.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Rule; - -use PHPUnit\Framework\ExpectationFailedException; -use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface ParametersRule -{ - /** - * @throws ExpectationFailedException if the invocation violates the rule - */ - public function apply(BaseInvocation $invocation): void; - - public function verify(): void; -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ConsecutiveCalls.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ConsecutiveCalls.php deleted file mode 100644 index 7b1297d..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ConsecutiveCalls.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Stub; - -use function array_shift; -use function count; -use PHPUnit\Framework\MockObject\Invocation; -use PHPUnit\Framework\MockObject\NoMoreReturnValuesConfiguredException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ConsecutiveCalls implements Stub -{ - private array $stack; - private int $numberOfConfiguredReturnValues; - - public function __construct(array $stack) - { - $this->stack = $stack; - $this->numberOfConfiguredReturnValues = count($stack); - } - - /** - * @throws NoMoreReturnValuesConfiguredException - */ - public function invoke(Invocation $invocation): mixed - { - if (empty($this->stack)) { - throw new NoMoreReturnValuesConfiguredException( - $invocation, - $this->numberOfConfiguredReturnValues, - ); - } - - $value = array_shift($this->stack); - - if ($value instanceof Stub) { - $value = $value->invoke($invocation); - } - - return $value; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/Exception.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/Exception.php deleted file mode 100644 index a17fe97..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/Exception.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Stub; - -use PHPUnit\Framework\MockObject\Invocation; -use Throwable; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Exception implements Stub -{ - private readonly Throwable $exception; - - public function __construct(Throwable $exception) - { - $this->exception = $exception; - } - - /** - * @throws Throwable - */ - public function invoke(Invocation $invocation): never - { - throw $this->exception; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnArgument.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnArgument.php deleted file mode 100644 index 18fdce0..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnArgument.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Stub; - -use PHPUnit\Framework\MockObject\Invocation; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ReturnArgument implements Stub -{ - private readonly int $argumentIndex; - - public function __construct(int $argumentIndex) - { - $this->argumentIndex = $argumentIndex; - } - - public function invoke(Invocation $invocation): mixed - { - return $invocation->parameters()[$this->argumentIndex] ?? null; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnCallback.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnCallback.php deleted file mode 100644 index 4e4cd53..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnCallback.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Stub; - -use function call_user_func_array; -use PHPUnit\Framework\MockObject\Invocation; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ReturnCallback implements Stub -{ - /** - * @var callable - */ - private $callback; - - public function __construct(callable $callback) - { - $this->callback = $callback; - } - - public function invoke(Invocation $invocation): mixed - { - return call_user_func_array($this->callback, $invocation->parameters()); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnReference.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnReference.php deleted file mode 100644 index 448df45..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnReference.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Stub; - -use PHPUnit\Framework\MockObject\Invocation; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ReturnReference implements Stub -{ - private mixed $reference; - - public function __construct(mixed &$reference) - { - $this->reference = &$reference; - } - - public function invoke(Invocation $invocation): mixed - { - return $this->reference; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnSelf.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnSelf.php deleted file mode 100644 index 4101d71..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnSelf.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Stub; - -use PHPUnit\Framework\MockObject\Invocation; -use PHPUnit\Framework\MockObject\RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ReturnSelf implements Stub -{ - /** - * @throws RuntimeException - */ - public function invoke(Invocation $invocation): object - { - return $invocation->object(); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnStub.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnStub.php deleted file mode 100644 index 278c4da..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnStub.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Stub; - -use PHPUnit\Framework\MockObject\Invocation; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ReturnStub implements Stub -{ - private readonly mixed $value; - - public function __construct(mixed $value) - { - $this->value = $value; - } - - public function invoke(Invocation $invocation): mixed - { - return $this->value; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnValueMap.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnValueMap.php deleted file mode 100644 index b1b62c5..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnValueMap.php +++ /dev/null @@ -1,49 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Stub; - -use function array_pop; -use function count; -use function is_array; -use PHPUnit\Framework\MockObject\Invocation; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ReturnValueMap implements Stub -{ - private readonly array $valueMap; - - public function __construct(array $valueMap) - { - $this->valueMap = $valueMap; - } - - public function invoke(Invocation $invocation): mixed - { - $parameterCount = count($invocation->parameters()); - - foreach ($this->valueMap as $map) { - if (!is_array($map) || $parameterCount !== (count($map) - 1)) { - continue; - } - - $return = array_pop($map); - - if ($invocation->parameters() === $map) { - return $return; - } - } - - return null; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/Stub.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/Stub.php deleted file mode 100644 index dc613d4..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/Stub.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Stub; - -use PHPUnit\Framework\MockObject\Invocation; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This interface is not covered by the backward compatibility promise for PHPUnit - */ -interface Stub -{ - /** - * Fakes the processing of the invocation $invocation by returning a - * specific value. - */ - public function invoke(Invocation $invocation): mixed; -} diff --git a/vendor/phpunit/phpunit/src/Framework/Reorderable.php b/vendor/phpunit/phpunit/src/Framework/Reorderable.php deleted file mode 100644 index ed070d3..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Reorderable.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This interface is not covered by the backward compatibility promise for PHPUnit - */ -interface Reorderable -{ - public function sortId(): string; - - /** - * @psalm-return list - */ - public function provides(): array; - - /** - * @psalm-return list - */ - public function requires(): array; -} diff --git a/vendor/phpunit/phpunit/src/Framework/SelfDescribing.php b/vendor/phpunit/phpunit/src/Framework/SelfDescribing.php deleted file mode 100644 index bdf91a4..0000000 --- a/vendor/phpunit/phpunit/src/Framework/SelfDescribing.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This interface is not covered by the backward compatibility promise for PHPUnit - */ -interface SelfDescribing -{ - /** - * Returns a string representation of the object. - */ - public function toString(): string; -} diff --git a/vendor/phpunit/phpunit/src/Framework/Test.php b/vendor/phpunit/phpunit/src/Framework/Test.php deleted file mode 100644 index b3e862f..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Test.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -use Countable; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface Test extends Countable -{ - public function run(): void; -} diff --git a/vendor/phpunit/phpunit/src/Framework/TestBuilder.php b/vendor/phpunit/phpunit/src/Framework/TestBuilder.php deleted file mode 100644 index 9bf77b3..0000000 --- a/vendor/phpunit/phpunit/src/Framework/TestBuilder.php +++ /dev/null @@ -1,282 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -use function assert; -use PHPUnit\Metadata\Api\DataProvider; -use PHPUnit\Metadata\Api\Groups; -use PHPUnit\Metadata\Api\Requirements; -use PHPUnit\Metadata\BackupGlobals; -use PHPUnit\Metadata\BackupStaticProperties; -use PHPUnit\Metadata\ExcludeGlobalVariableFromBackup; -use PHPUnit\Metadata\ExcludeStaticPropertyFromBackup; -use PHPUnit\Metadata\Parser\Registry as MetadataRegistry; -use PHPUnit\Metadata\PreserveGlobalState; -use PHPUnit\TextUI\Configuration\Registry as ConfigurationRegistry; -use ReflectionClass; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestBuilder -{ - /** - * @psalm-param non-empty-string $methodName - * - * @throws InvalidDataProviderException - */ - public function build(ReflectionClass $theClass, string $methodName): Test - { - $className = $theClass->getName(); - - $data = null; - - if ($this->requirementsSatisfied($className, $methodName)) { - $data = (new DataProvider)->providedData($className, $methodName); - } - - if ($data !== null) { - return $this->buildDataProviderTestSuite( - $methodName, - $className, - $data, - $this->shouldTestMethodBeRunInSeparateProcess($className, $methodName), - $this->shouldGlobalStateBePreserved($className, $methodName), - $this->shouldAllTestMethodsOfTestClassBeRunInSingleSeparateProcess($className), - $this->backupSettings($className, $methodName), - ); - } - - $test = new $className($methodName); - - assert($test instanceof TestCase); - - $this->configureTestCase( - $test, - $this->shouldTestMethodBeRunInSeparateProcess($className, $methodName), - $this->shouldGlobalStateBePreserved($className, $methodName), - $this->shouldAllTestMethodsOfTestClassBeRunInSingleSeparateProcess($className), - $this->backupSettings($className, $methodName), - ); - - return $test; - } - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - * @psalm-param array{backupGlobals: ?bool, backupGlobalsExcludeList: list, backupStaticProperties: ?bool, backupStaticPropertiesExcludeList: array>} $backupSettings - */ - private function buildDataProviderTestSuite(string $methodName, string $className, array $data, bool $runTestInSeparateProcess, ?bool $preserveGlobalState, bool $runClassInSeparateProcess, array $backupSettings): DataProviderTestSuite - { - $dataProviderTestSuite = DataProviderTestSuite::empty( - $className . '::' . $methodName, - ); - - $groups = (new Groups)->groups($className, $methodName); - - foreach ($data as $_dataName => $_data) { - $_test = new $className($methodName); - - assert($_test instanceof TestCase); - - $_test->setData($_dataName, $_data); - - $this->configureTestCase( - $_test, - $runTestInSeparateProcess, - $preserveGlobalState, - $runClassInSeparateProcess, - $backupSettings, - ); - - $dataProviderTestSuite->addTest($_test, $groups); - } - - return $dataProviderTestSuite; - } - - /** - * @psalm-param array{backupGlobals: ?bool, backupGlobalsExcludeList: list, backupStaticProperties: ?bool, backupStaticPropertiesExcludeList: array>} $backupSettings - */ - private function configureTestCase(TestCase $test, bool $runTestInSeparateProcess, ?bool $preserveGlobalState, bool $runClassInSeparateProcess, array $backupSettings): void - { - if ($runTestInSeparateProcess) { - $test->setRunTestInSeparateProcess(true); - } - - if ($runClassInSeparateProcess) { - $test->setRunClassInSeparateProcess(true); - } - - if ($preserveGlobalState !== null) { - $test->setPreserveGlobalState($preserveGlobalState); - } - - if ($backupSettings['backupGlobals'] !== null) { - $test->setBackupGlobals($backupSettings['backupGlobals']); - } else { - $test->setBackupGlobals(ConfigurationRegistry::get()->backupGlobals()); - } - - $test->setBackupGlobalsExcludeList($backupSettings['backupGlobalsExcludeList']); - - if ($backupSettings['backupStaticProperties'] !== null) { - $test->setBackupStaticProperties($backupSettings['backupStaticProperties']); - } else { - $test->setBackupStaticProperties(ConfigurationRegistry::get()->backupStaticProperties()); - } - - $test->setBackupStaticPropertiesExcludeList($backupSettings['backupStaticPropertiesExcludeList']); - } - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - * - * @psalm-return array{backupGlobals: ?bool, backupGlobalsExcludeList: list, backupStaticProperties: ?bool, backupStaticPropertiesExcludeList: array>} - */ - private function backupSettings(string $className, string $methodName): array - { - $metadataForClass = MetadataRegistry::parser()->forClass($className); - $metadataForMethod = MetadataRegistry::parser()->forMethod($className, $methodName); - $metadataForClassAndMethod = MetadataRegistry::parser()->forClassAndMethod($className, $methodName); - - $backupGlobals = null; - $backupGlobalsExcludeList = []; - - if ($metadataForMethod->isBackupGlobals()->isNotEmpty()) { - $metadata = $metadataForMethod->isBackupGlobals()->asArray()[0]; - - assert($metadata instanceof BackupGlobals); - - if ($metadata->enabled()) { - $backupGlobals = true; - } - } elseif ($metadataForClass->isBackupGlobals()->isNotEmpty()) { - $metadata = $metadataForClass->isBackupGlobals()->asArray()[0]; - - assert($metadata instanceof BackupGlobals); - - if ($metadata->enabled()) { - $backupGlobals = true; - } - } - - foreach ($metadataForClassAndMethod->isExcludeGlobalVariableFromBackup() as $metadata) { - assert($metadata instanceof ExcludeGlobalVariableFromBackup); - - $backupGlobalsExcludeList[] = $metadata->globalVariableName(); - } - - $backupStaticProperties = null; - $backupStaticPropertiesExcludeList = []; - - if ($metadataForMethod->isBackupStaticProperties()->isNotEmpty()) { - $metadata = $metadataForMethod->isBackupStaticProperties()->asArray()[0]; - - assert($metadata instanceof BackupStaticProperties); - - if ($metadata->enabled()) { - $backupStaticProperties = true; - } - } elseif ($metadataForClass->isBackupStaticProperties()->isNotEmpty()) { - $metadata = $metadataForClass->isBackupStaticProperties()->asArray()[0]; - - assert($metadata instanceof BackupStaticProperties); - - if ($metadata->enabled()) { - $backupStaticProperties = true; - } - } - - foreach ($metadataForClassAndMethod->isExcludeStaticPropertyFromBackup() as $metadata) { - assert($metadata instanceof ExcludeStaticPropertyFromBackup); - - if (!isset($backupStaticPropertiesExcludeList[$metadata->className()])) { - $backupStaticPropertiesExcludeList[$metadata->className()] = []; - } - - $backupStaticPropertiesExcludeList[$metadata->className()][] = $metadata->propertyName(); - } - - return [ - 'backupGlobals' => $backupGlobals, - 'backupGlobalsExcludeList' => $backupGlobalsExcludeList, - 'backupStaticProperties' => $backupStaticProperties, - 'backupStaticPropertiesExcludeList' => $backupStaticPropertiesExcludeList, - ]; - } - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - */ - private function shouldGlobalStateBePreserved(string $className, string $methodName): ?bool - { - $metadataForMethod = MetadataRegistry::parser()->forMethod($className, $methodName); - - if ($metadataForMethod->isPreserveGlobalState()->isNotEmpty()) { - $metadata = $metadataForMethod->isPreserveGlobalState()->asArray()[0]; - - assert($metadata instanceof PreserveGlobalState); - - return $metadata->enabled(); - } - - $metadataForClass = MetadataRegistry::parser()->forClass($className); - - if ($metadataForClass->isPreserveGlobalState()->isNotEmpty()) { - $metadata = $metadataForClass->isPreserveGlobalState()->asArray()[0]; - - assert($metadata instanceof PreserveGlobalState); - - return $metadata->enabled(); - } - - return null; - } - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - */ - private function shouldTestMethodBeRunInSeparateProcess(string $className, string $methodName): bool - { - if (MetadataRegistry::parser()->forClass($className)->isRunTestsInSeparateProcesses()->isNotEmpty()) { - return true; - } - - if (MetadataRegistry::parser()->forMethod($className, $methodName)->isRunInSeparateProcess()->isNotEmpty()) { - return true; - } - - return false; - } - - /** - * @psalm-param class-string $className - */ - private function shouldAllTestMethodsOfTestClassBeRunInSingleSeparateProcess(string $className): bool - { - return MetadataRegistry::parser()->forClass($className)->isRunClassInSeparateProcess()->isNotEmpty(); - } - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - */ - private function requirementsSatisfied(string $className, string $methodName): bool - { - return (new Requirements)->requirementsNotSatisfiedFor($className, $methodName) === []; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/TestCase.php b/vendor/phpunit/phpunit/src/Framework/TestCase.php deleted file mode 100644 index 9cd9854..0000000 --- a/vendor/phpunit/phpunit/src/Framework/TestCase.php +++ /dev/null @@ -1,2414 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -use const LC_ALL; -use const LC_COLLATE; -use const LC_CTYPE; -use const LC_MONETARY; -use const LC_NUMERIC; -use const LC_TIME; -use const PATHINFO_FILENAME; -use const PHP_EOL; -use const PHP_URL_PATH; -use function array_is_list; -use function array_keys; -use function array_map; -use function array_merge; -use function array_values; -use function assert; -use function basename; -use function chdir; -use function class_exists; -use function clearstatcache; -use function count; -use function defined; -use function explode; -use function getcwd; -use function implode; -use function in_array; -use function ini_set; -use function is_array; -use function is_callable; -use function is_int; -use function is_object; -use function is_string; -use function libxml_clear_errors; -use function method_exists; -use function ob_end_clean; -use function ob_get_clean; -use function ob_get_contents; -use function ob_get_level; -use function ob_start; -use function parse_url; -use function pathinfo; -use function preg_replace; -use function setlocale; -use function sprintf; -use function str_contains; -use function trim; -use AssertionError; -use DeepCopy\DeepCopy; -use PHPUnit\Event; -use PHPUnit\Event\NoPreviousThrowableException; -use PHPUnit\Event\RuntimeException; -use PHPUnit\Event\TestData\MoreThanOneDataSetFromDataProviderException; -use PHPUnit\Framework\Constraint\Exception as ExceptionConstraint; -use PHPUnit\Framework\Constraint\ExceptionCode; -use PHPUnit\Framework\Constraint\ExceptionMessageIsOrContains; -use PHPUnit\Framework\Constraint\ExceptionMessageMatchesRegularExpression; -use PHPUnit\Framework\MockObject\Exception as MockObjectException; -use PHPUnit\Framework\MockObject\Generator\Generator as MockGenerator; -use PHPUnit\Framework\MockObject\MockBuilder; -use PHPUnit\Framework\MockObject\MockObject; -use PHPUnit\Framework\MockObject\MockObjectInternal; -use PHPUnit\Framework\MockObject\Rule\AnyInvokedCount as AnyInvokedCountMatcher; -use PHPUnit\Framework\MockObject\Rule\InvokedAtLeastCount as InvokedAtLeastCountMatcher; -use PHPUnit\Framework\MockObject\Rule\InvokedAtLeastOnce as InvokedAtLeastOnceMatcher; -use PHPUnit\Framework\MockObject\Rule\InvokedAtMostCount as InvokedAtMostCountMatcher; -use PHPUnit\Framework\MockObject\Rule\InvokedCount; -use PHPUnit\Framework\MockObject\Rule\InvokedCount as InvokedCountMatcher; -use PHPUnit\Framework\MockObject\Stub; -use PHPUnit\Framework\MockObject\Stub\ConsecutiveCalls as ConsecutiveCallsStub; -use PHPUnit\Framework\MockObject\Stub\Exception as ExceptionStub; -use PHPUnit\Framework\MockObject\Stub\ReturnArgument as ReturnArgumentStub; -use PHPUnit\Framework\MockObject\Stub\ReturnCallback as ReturnCallbackStub; -use PHPUnit\Framework\MockObject\Stub\ReturnSelf as ReturnSelfStub; -use PHPUnit\Framework\MockObject\Stub\ReturnStub; -use PHPUnit\Framework\MockObject\Stub\ReturnValueMap as ReturnValueMapStub; -use PHPUnit\Framework\TestSize\TestSize; -use PHPUnit\Framework\TestStatus\TestStatus; -use PHPUnit\Metadata\Api\Groups; -use PHPUnit\Metadata\Api\HookMethods; -use PHPUnit\Metadata\Api\Requirements; -use PHPUnit\Metadata\Parser\Registry as MetadataRegistry; -use PHPUnit\TestRunner\TestResult\PassedTests; -use PHPUnit\TextUI\Configuration\Registry as ConfigurationRegistry; -use PHPUnit\Util\Cloner; -use PHPUnit\Util\Test as TestUtil; -use ReflectionClass; -use ReflectionException; -use ReflectionMethod; -use ReflectionObject; -use ReflectionParameter; -use SebastianBergmann\CodeCoverage\UnintentionallyCoveredCodeException; -use SebastianBergmann\Comparator\Comparator; -use SebastianBergmann\Comparator\Factory as ComparatorFactory; -use SebastianBergmann\Diff\Differ; -use SebastianBergmann\Diff\Output\UnifiedDiffOutputBuilder; -use SebastianBergmann\Exporter\Exporter; -use SebastianBergmann\GlobalState\ExcludeList as GlobalStateExcludeList; -use SebastianBergmann\GlobalState\Restorer; -use SebastianBergmann\GlobalState\Snapshot; -use SebastianBergmann\Invoker\TimeoutException; -use SebastianBergmann\ObjectEnumerator\Enumerator; -use SebastianBergmann\RecursionContext\Context; -use Throwable; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -abstract class TestCase extends Assert implements Reorderable, SelfDescribing, Test -{ - private const LOCALE_CATEGORIES = [LC_ALL, LC_COLLATE, LC_CTYPE, LC_MONETARY, LC_NUMERIC, LC_TIME]; - private ?bool $backupGlobals = null; - - /** - * @psalm-var list - */ - private array $backupGlobalsExcludeList = []; - private ?bool $backupStaticProperties = null; - - /** - * @psalm-var array> - */ - private array $backupStaticPropertiesExcludeList = []; - private ?Snapshot $snapshot = null; - private ?bool $runClassInSeparateProcess = null; - private ?bool $runTestInSeparateProcess = null; - private bool $preserveGlobalState = false; - private bool $inIsolation = false; - private ?string $expectedException = null; - private ?string $expectedExceptionMessage = null; - private ?string $expectedExceptionMessageRegExp = null; - private null|int|string $expectedExceptionCode = null; - - /** - * @psalm-var list - */ - private array $providedTests = []; - private array $data = []; - private int|string $dataName = ''; - - /** - * @psalm-var non-empty-string - */ - private string $name; - - /** - * @psalm-var list - */ - private array $groups = []; - - /** - * @psalm-var list - */ - private array $dependencies = []; - private array $dependencyInput = []; - - /** - * @psalm-var array - */ - private array $iniSettings = []; - private array $locale = []; - - /** - * @psalm-var list - */ - private array $mockObjects = []; - private bool $registerMockObjectsFromTestArgumentsRecursively = false; - private TestStatus $status; - private int $numberOfAssertionsPerformed = 0; - private mixed $testResult = null; - private string $output = ''; - private ?string $outputExpectedRegex = null; - private ?string $outputExpectedString = null; - private bool $outputBufferingActive = false; - private int $outputBufferingLevel; - private bool $outputRetrievedForAssertion = false; - private bool $doesNotPerformAssertions = false; - - /** - * @psalm-var list - */ - private array $customComparators = []; - private ?Event\Code\TestMethod $testValueObjectForEvents = null; - private bool $wasPrepared = false; - - /** - * @psalm-var array - */ - private array $failureTypes = []; - - /** - * Returns a matcher that matches when the method is executed - * zero or more times. - */ - final public static function any(): AnyInvokedCountMatcher - { - return new AnyInvokedCountMatcher; - } - - /** - * Returns a matcher that matches when the method is never executed. - */ - final public static function never(): InvokedCountMatcher - { - return new InvokedCountMatcher(0); - } - - /** - * Returns a matcher that matches when the method is executed - * at least N times. - */ - final public static function atLeast(int $requiredInvocations): InvokedAtLeastCountMatcher - { - return new InvokedAtLeastCountMatcher( - $requiredInvocations, - ); - } - - /** - * Returns a matcher that matches when the method is executed at least once. - */ - final public static function atLeastOnce(): InvokedAtLeastOnceMatcher - { - return new InvokedAtLeastOnceMatcher; - } - - /** - * Returns a matcher that matches when the method is executed exactly once. - */ - final public static function once(): InvokedCountMatcher - { - return new InvokedCountMatcher(1); - } - - /** - * Returns a matcher that matches when the method is executed - * exactly $count times. - */ - final public static function exactly(int $count): InvokedCountMatcher - { - return new InvokedCountMatcher($count); - } - - /** - * Returns a matcher that matches when the method is executed - * at most N times. - */ - final public static function atMost(int $allowedInvocations): InvokedAtMostCountMatcher - { - return new InvokedAtMostCountMatcher($allowedInvocations); - } - - /** - * @deprecated Use $double->willReturn() instead of $double->will($this->returnValue()) - * @see https://github.com/sebastianbergmann/phpunit/issues/5423 - * - * @codeCoverageIgnore - */ - final public static function returnValue(mixed $value): ReturnStub - { - return new ReturnStub($value); - } - - /** - * @deprecated Use $double->willReturnMap() instead of $double->will($this->returnValueMap()) - * @see https://github.com/sebastianbergmann/phpunit/issues/5423 - * - * @codeCoverageIgnore - */ - final public static function returnValueMap(array $valueMap): ReturnValueMapStub - { - return new ReturnValueMapStub($valueMap); - } - - /** - * @deprecated Use $double->willReturnArgument() instead of $double->will($this->returnArgument()) - * @see https://github.com/sebastianbergmann/phpunit/issues/5423 - * - * @codeCoverageIgnore - */ - final public static function returnArgument(int $argumentIndex): ReturnArgumentStub - { - return new ReturnArgumentStub($argumentIndex); - } - - /** - * @deprecated Use $double->willReturnCallback() instead of $double->will($this->returnCallback()) - * @see https://github.com/sebastianbergmann/phpunit/issues/5423 - * - * @codeCoverageIgnore - */ - final public static function returnCallback(callable $callback): ReturnCallbackStub - { - return new ReturnCallbackStub($callback); - } - - /** - * @deprecated Use $double->willReturnSelf() instead of $double->will($this->returnSelf()) - * @see https://github.com/sebastianbergmann/phpunit/issues/5423 - * - * @codeCoverageIgnore - */ - final public static function returnSelf(): ReturnSelfStub - { - return new ReturnSelfStub; - } - - final public static function throwException(Throwable $exception): ExceptionStub - { - return new ExceptionStub($exception); - } - - /** - * @deprecated Use $double->willReturn() instead of $double->will($this->onConsecutiveCalls()) - * @see https://github.com/sebastianbergmann/phpunit/issues/5423 - * @see https://github.com/sebastianbergmann/phpunit/issues/5425 - * - * @codeCoverageIgnore - */ - final public static function onConsecutiveCalls(mixed ...$arguments): ConsecutiveCallsStub - { - return new ConsecutiveCallsStub($arguments); - } - - /** - * @psalm-param non-empty-string $name - * - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function __construct(string $name) - { - $this->setName($name); - - $this->status = TestStatus::unknown(); - } - - /** - * This method is called before the first test of this test class is run. - * - * @codeCoverageIgnore - */ - public static function setUpBeforeClass(): void - { - } - - /** - * This method is called after the last test of this test class is run. - * - * @codeCoverageIgnore - */ - public static function tearDownAfterClass(): void - { - } - - /** - * This method is called before each test. - * - * @codeCoverageIgnore - */ - protected function setUp(): void - { - } - - /** - * Performs assertions shared by all tests of a test case. - * - * This method is called between setUp() and test. - * - * @codeCoverageIgnore - */ - protected function assertPreConditions(): void - { - } - - /** - * Performs assertions shared by all tests of a test case. - * - * This method is called between test and tearDown(). - * - * @codeCoverageIgnore - */ - protected function assertPostConditions(): void - { - } - - /** - * This method is called after each test. - * - * @codeCoverageIgnore - */ - protected function tearDown(): void - { - } - - /** - * Returns a string representation of the test case. - * - * @throws Exception - * - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function toString(): string - { - $buffer = sprintf( - '%s::%s', - (new ReflectionClass($this))->getName(), - $this->name, - ); - - return $buffer . $this->dataSetAsStringWithData(); - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - final public function count(): int - { - return 1; - } - - final public function getActualOutputForAssertion(): string - { - $this->outputRetrievedForAssertion = true; - - return $this->output(); - } - - final public function expectOutputRegex(string $expectedRegex): void - { - $this->outputExpectedRegex = $expectedRegex; - } - - final public function expectOutputString(string $expectedString): void - { - $this->outputExpectedString = $expectedString; - } - - /** - * @psalm-param class-string $exception - */ - final public function expectException(string $exception): void - { - $this->expectedException = $exception; - } - - final public function expectExceptionCode(int|string $code): void - { - $this->expectedExceptionCode = $code; - } - - final public function expectExceptionMessage(string $message): void - { - $this->expectedExceptionMessage = $message; - } - - final public function expectExceptionMessageMatches(string $regularExpression): void - { - $this->expectedExceptionMessageRegExp = $regularExpression; - } - - /** - * Sets up an expectation for an exception to be raised by the code under test. - * Information for expected exception class, expected exception message, and - * expected exception code are retrieved from a given Exception object. - */ - final public function expectExceptionObject(\Exception $exception): void - { - $this->expectException($exception::class); - $this->expectExceptionMessage($exception->getMessage()); - $this->expectExceptionCode($exception->getCode()); - } - - final public function expectNotToPerformAssertions(): void - { - $this->doesNotPerformAssertions = true; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - final public function status(): TestStatus - { - return $this->status; - } - - /** - * @throws \PHPUnit\Runner\Exception - * @throws \PHPUnit\Util\Exception - * @throws \SebastianBergmann\CodeCoverage\InvalidArgumentException - * @throws \SebastianBergmann\Template\InvalidArgumentException - * @throws CodeCoverageException - * @throws Exception - * @throws MoreThanOneDataSetFromDataProviderException - * @throws NoPreviousThrowableException - * @throws ProcessIsolationException - * @throws UnintentionallyCoveredCodeException - * - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - final public function run(): void - { - if (!$this->handleDependencies()) { - return; - } - - if (!$this->shouldRunInSeparateProcess() || $this->requirementsNotSatisfied()) { - (new TestRunner)->run($this); - } else { - (new TestRunner)->runInSeparateProcess( - $this, - $this->runClassInSeparateProcess && !$this->runTestInSeparateProcess, - $this->preserveGlobalState, - ); - } - } - - /** - * Returns a builder object to create mock objects using a fluent interface. - * - * @psalm-template RealInstanceType of object - * - * @psalm-param class-string $className - * - * @psalm-return MockBuilder - */ - final public function getMockBuilder(string $className): MockBuilder - { - return new MockBuilder($this, $className); - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - final public function groups(): array - { - return $this->groups; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - final public function setGroups(array $groups): void - { - $this->groups = $groups; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - final public function nameWithDataSet(): string - { - return $this->name . $this->dataSetAsString(); - } - - /** - * @psalm-return non-empty-string - * - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - final public function name(): string - { - return $this->name; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - final public function size(): TestSize - { - return (new Groups)->size( - static::class, - $this->name, - ); - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - final public function hasUnexpectedOutput(): bool - { - if ($this->output === '') { - return false; - } - - if ($this->expectsOutput()) { - return false; - } - - return true; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - final public function output(): string - { - if (!$this->outputBufferingActive) { - return $this->output; - } - - return (string) ob_get_contents(); - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - final public function doesNotPerformAssertions(): bool - { - return $this->doesNotPerformAssertions; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - final public function expectsOutput(): bool - { - return $this->hasExpectationOnOutput() || $this->outputRetrievedForAssertion; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - * - * @deprecated - * - * @codeCoverageIgnore - */ - final public function registerMockObjectsFromTestArgumentsRecursively(): void - { - $this->registerMockObjectsFromTestArgumentsRecursively = true; - } - - /** - * @throws Throwable - * - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - final public function runBare(): void - { - $emitter = Event\Facade::emitter(); - - $emitter->testPreparationStarted( - $this->valueObjectForEvents(), - ); - - $this->snapshotGlobalState(); - $this->startOutputBuffering(); - clearstatcache(); - - $hookMethods = (new HookMethods)->hookMethods(static::class); - $hasMetRequirements = false; - $this->numberOfAssertionsPerformed = 0; - $currentWorkingDirectory = getcwd(); - - try { - $this->checkRequirements(); - $hasMetRequirements = true; - - if ($this->inIsolation) { - // @codeCoverageIgnoreStart - $this->invokeBeforeClassHookMethods($hookMethods, $emitter); - // @codeCoverageIgnoreEnd - } - - if (method_exists(static::class, $this->name) && - MetadataRegistry::parser()->forClassAndMethod(static::class, $this->name)->isDoesNotPerformAssertions()->isNotEmpty()) { - $this->doesNotPerformAssertions = true; - } - - $this->invokeBeforeTestHookMethods($hookMethods, $emitter); - $this->invokePreConditionHookMethods($hookMethods, $emitter); - - $emitter->testPrepared( - $this->valueObjectForEvents(), - ); - - $this->wasPrepared = true; - $this->testResult = $this->runTest(); - - $this->verifyMockObjects(); - $this->invokePostConditionHookMethods($hookMethods, $emitter); - - $this->status = TestStatus::success(); - } catch (IncompleteTest $e) { - $this->status = TestStatus::incomplete($e->getMessage()); - - $emitter->testMarkedAsIncomplete( - $this->valueObjectForEvents(), - Event\Code\ThrowableBuilder::from($e), - ); - } catch (SkippedTest $e) { - $this->status = TestStatus::skipped($e->getMessage()); - - $emitter->testSkipped( - $this->valueObjectForEvents(), - $e->getMessage(), - ); - } catch (AssertionError|AssertionFailedError $e) { - $this->handleExceptionFromInvokedCountMockObjectRule($e); - - if (!$this->wasPrepared) { - $this->wasPrepared = true; - - $emitter->testPreparationFailed( - $this->valueObjectForEvents(), - ); - } - - $this->status = TestStatus::failure($e->getMessage()); - - $emitter->testFailed( - $this->valueObjectForEvents(), - Event\Code\ThrowableBuilder::from($e), - Event\Code\ComparisonFailureBuilder::from($e), - ); - } catch (TimeoutException $e) { - } catch (Throwable $_e) { - if ($this->isRegisteredFailure($_e)) { - $this->status = TestStatus::failure($_e->getMessage()); - - $emitter->testFailed( - $this->valueObjectForEvents(), - Event\Code\ThrowableBuilder::from($_e), - null, - ); - } else { - $e = $this->transformException($_e); - - $this->status = TestStatus::error($e->getMessage()); - - $emitter->testErrored( - $this->valueObjectForEvents(), - Event\Code\ThrowableBuilder::from($e), - ); - } - } - - $outputBufferingStopped = false; - - if (!isset($e) && - $this->hasExpectationOnOutput() && - $this->stopOutputBuffering()) { - $outputBufferingStopped = true; - - $this->performAssertionsOnOutput(); - } - - if ($this->status->isSuccess()) { - $emitter->testPassed( - $this->valueObjectForEvents(), - ); - - if (!$this->usesDataProvider()) { - PassedTests::instance()->testMethodPassed( - $this->valueObjectForEvents(), - $this->testResult, - ); - } - } - - try { - $this->mockObjects = []; - } catch (Throwable $t) { - Event\Facade::emitter()->testErrored( - $this->valueObjectForEvents(), - Event\Code\ThrowableBuilder::from($t), - ); - } - - // Tear down the fixture. An exception raised in tearDown() will be - // caught and passed on when no exception was raised before. - try { - if ($hasMetRequirements) { - $this->invokeAfterTestHookMethods($hookMethods, $emitter); - - if ($this->inIsolation) { - // @codeCoverageIgnoreStart - $this->invokeAfterClassHookMethods($hookMethods, $emitter); - // @codeCoverageIgnoreEnd - } - } - } catch (AssertionError|AssertionFailedError $e) { - $this->status = TestStatus::failure($e->getMessage()); - - $emitter->testFailed( - $this->valueObjectForEvents(), - Event\Code\ThrowableBuilder::from($e), - Event\Code\ComparisonFailureBuilder::from($e), - ); - } catch (Throwable $exceptionRaisedDuringTearDown) { - if (!isset($e)) { - $this->status = TestStatus::error($exceptionRaisedDuringTearDown->getMessage()); - $e = $exceptionRaisedDuringTearDown; - - $emitter->testErrored( - $this->valueObjectForEvents(), - Event\Code\ThrowableBuilder::from($exceptionRaisedDuringTearDown), - ); - } - } - - if (!$outputBufferingStopped) { - $this->stopOutputBuffering(); - } - - clearstatcache(); - - if ($currentWorkingDirectory !== getcwd()) { - chdir($currentWorkingDirectory); - } - - $this->restoreGlobalState(); - $this->unregisterCustomComparators(); - $this->cleanupIniSettings(); - $this->cleanupLocaleSettings(); - libxml_clear_errors(); - - $this->testValueObjectForEvents = null; - - if (isset($e)) { - $this->onNotSuccessfulTest($e); - } - } - - /** - * @psalm-param non-empty-string $name - * - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - final public function setName(string $name): void - { - $this->name = $name; - - if (is_callable($this->sortId(), true)) { - $this->providedTests = [new ExecutionOrderDependency($this->sortId())]; - } - } - - /** - * @psalm-param list $dependencies - * - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - final public function setDependencies(array $dependencies): void - { - $this->dependencies = $dependencies; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - * - * @codeCoverageIgnore - */ - final public function setDependencyInput(array $dependencyInput): void - { - $this->dependencyInput = $dependencyInput; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - final public function dependencyInput(): array - { - return $this->dependencyInput; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - final public function hasDependencyInput(): bool - { - return !empty($this->dependencyInput); - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - final public function setBackupGlobals(bool $backupGlobals): void - { - $this->backupGlobals = $backupGlobals; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - final public function setBackupGlobalsExcludeList(array $backupGlobalsExcludeList): void - { - $this->backupGlobalsExcludeList = $backupGlobalsExcludeList; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - final public function setBackupStaticProperties(bool $backupStaticProperties): void - { - $this->backupStaticProperties = $backupStaticProperties; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - final public function setBackupStaticPropertiesExcludeList(array $backupStaticPropertiesExcludeList): void - { - $this->backupStaticPropertiesExcludeList = $backupStaticPropertiesExcludeList; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - final public function setRunTestInSeparateProcess(bool $runTestInSeparateProcess): void - { - if ($this->runTestInSeparateProcess === null) { - $this->runTestInSeparateProcess = $runTestInSeparateProcess; - } - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - final public function setRunClassInSeparateProcess(bool $runClassInSeparateProcess): void - { - $this->runClassInSeparateProcess = $runClassInSeparateProcess; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - final public function setPreserveGlobalState(bool $preserveGlobalState): void - { - $this->preserveGlobalState = $preserveGlobalState; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - * - * @codeCoverageIgnore - */ - final public function setInIsolation(bool $inIsolation): void - { - $this->inIsolation = $inIsolation; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - * - * @codeCoverageIgnore - */ - final public function result(): mixed - { - return $this->testResult; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - final public function setResult(mixed $result): void - { - $this->testResult = $result; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - final public function registerMockObject(MockObject $mockObject): void - { - assert($mockObject instanceof MockObjectInternal); - - $this->mockObjects[] = $mockObject; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - final public function addToAssertionCount(int $count): void - { - $this->numberOfAssertionsPerformed += $count; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - final public function numberOfAssertionsPerformed(): int - { - return $this->numberOfAssertionsPerformed; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - final public function usesDataProvider(): bool - { - return !empty($this->data); - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - final public function dataName(): int|string - { - return $this->dataName; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - final public function dataSetAsString(): string - { - $buffer = ''; - - if (!empty($this->data)) { - if (is_int($this->dataName)) { - $buffer .= sprintf(' with data set #%d', $this->dataName); - } else { - $buffer .= sprintf(' with data set "%s"', $this->dataName); - } - } - - return $buffer; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - final public function dataSetAsStringWithData(): string - { - if (empty($this->data)) { - return ''; - } - - return $this->dataSetAsString() . sprintf( - ' (%s)', - (new Exporter)->shortenedRecursiveExport($this->data), - ); - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - final public function providedData(): array - { - return $this->data; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - final public function sortId(): string - { - $id = $this->name; - - if (!str_contains($id, '::')) { - $id = static::class . '::' . $id; - } - - if ($this->usesDataProvider()) { - $id .= $this->dataSetAsString(); - } - - return $id; - } - - /** - * @psalm-return list - * - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - final public function provides(): array - { - return $this->providedTests; - } - - /** - * @psalm-return list - * - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - final public function requires(): array - { - return $this->dependencies; - } - - /** - * @throws RuntimeException - * - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - final public function setData(int|string $dataName, array $data): void - { - $this->dataName = $dataName; - $this->data = $data; - - if (array_is_list($data)) { - return; - } - - try { - $reflector = new ReflectionMethod($this, $this->name); - $parameters = array_map(static fn (ReflectionParameter $parameter) => $parameter->name, $reflector->getParameters()); - - foreach (array_keys($data) as $parameter) { - if (is_string($parameter) && !in_array($parameter, $parameters, true)) { - Event\Facade::emitter()->testTriggeredPhpunitDeprecation( - $this->valueObjectForEvents(), - sprintf( - 'Providing invalid named argument $%s for method %s::%s() is deprecated and will not be supported in PHPUnit 11.0.', - $parameter, - $this::class, - $this->name, - ), - ); - } - } - // @codeCoverageIgnoreStart - } catch (ReflectionException $e) { - throw new RuntimeException( - $e->getMessage(), - $e->getCode(), - $e, - ); - } - // @codeCoverageIgnoreEnd - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - * - * @throws MoreThanOneDataSetFromDataProviderException - */ - final public function valueObjectForEvents(): Event\Code\TestMethod - { - if ($this->testValueObjectForEvents !== null) { - return $this->testValueObjectForEvents; - } - - $this->testValueObjectForEvents = Event\Code\TestMethodBuilder::fromTestCase($this); - - return $this->testValueObjectForEvents; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - final public function wasPrepared(): bool - { - return $this->wasPrepared; - } - - final protected function registerComparator(Comparator $comparator): void - { - ComparatorFactory::getInstance()->register($comparator); - - Event\Facade::emitter()->testRegisteredComparator($comparator::class); - - $this->customComparators[] = $comparator; - } - - /** - * @psalm-param class-string $classOrInterface - */ - final protected function registerFailureType(string $classOrInterface): void - { - $this->failureTypes[$classOrInterface] = true; - } - - /** - * This method is a wrapper for the ini_set() function that automatically - * resets the modified php.ini setting to its original value after the - * test is run. - * - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5214 - * - * @codeCoverageIgnore - */ - protected function iniSet(string $varName, string $newValue): void - { - $currentValue = ini_set($varName, $newValue); - - if ($currentValue !== false) { - $this->iniSettings[$varName] = $currentValue; - } else { - throw new Exception( - sprintf( - 'INI setting "%s" could not be set to "%s".', - $varName, - $newValue, - ), - ); - } - } - - /** - * This method is a wrapper for the setlocale() function that automatically - * resets the locale to its original value after the test is run. - * - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5216 - * - * @codeCoverageIgnore - */ - protected function setLocale(mixed ...$arguments): void - { - if (count($arguments) < 2) { - throw new Exception; - } - - [$category, $locale] = $arguments; - - if (!in_array($category, self::LOCALE_CATEGORIES, true)) { - throw new Exception; - } - - if (!is_array($locale) && !is_string($locale)) { - throw new Exception; - } - - $this->locale[$category] = setlocale($category, '0'); - - $result = setlocale(...$arguments); - - if ($result === false) { - throw new Exception( - 'The locale functionality is not implemented on your platform, ' . - 'the specified locale does not exist or the category name is ' . - 'invalid.', - ); - } - } - - /** - * Creates a mock object for the specified interface or class. - * - * @psalm-template RealInstanceType of object - * - * @psalm-param class-string $originalClassName - * - * @throws InvalidArgumentException - * @throws MockObjectException - * @throws NoPreviousThrowableException - * - * @psalm-return MockObject&RealInstanceType - */ - protected function createMock(string $originalClassName): MockObject - { - $mock = (new MockGenerator)->testDouble( - $originalClassName, - true, - callOriginalConstructor: false, - callOriginalClone: false, - cloneArguments: false, - allowMockingUnknownTypes: false, - ); - - assert($mock instanceof $originalClassName); - assert($mock instanceof MockObject); - - $this->registerMockObject($mock); - - Event\Facade::emitter()->testCreatedMockObject($originalClassName); - - return $mock; - } - - /** - * @psalm-param list $interfaces - * - * @throws MockObjectException - */ - protected function createMockForIntersectionOfInterfaces(array $interfaces): MockObject - { - $mock = (new MockGenerator)->testDoubleForInterfaceIntersection($interfaces, true); - - assert($mock instanceof MockObject); - - $this->registerMockObject($mock); - - Event\Facade::emitter()->testCreatedMockObjectForIntersectionOfInterfaces($interfaces); - - return $mock; - } - - /** - * Creates (and configures) a mock object for the specified interface or class. - * - * @psalm-template RealInstanceType of object - * - * @psalm-param class-string $originalClassName - * - * @throws InvalidArgumentException - * @throws MockObjectException - * @throws NoPreviousThrowableException - * - * @psalm-return MockObject&RealInstanceType - */ - protected function createConfiguredMock(string $originalClassName, array $configuration): MockObject - { - $o = $this->createMock($originalClassName); - - foreach ($configuration as $method => $return) { - $o->method($method)->willReturn($return); - } - - return $o; - } - - /** - * Creates a partial mock object for the specified interface or class. - * - * @psalm-param list $methods - * - * @psalm-template RealInstanceType of object - * - * @psalm-param class-string $originalClassName - * - * @throws InvalidArgumentException - * @throws MockObjectException - * - * @psalm-return MockObject&RealInstanceType - */ - protected function createPartialMock(string $originalClassName, array $methods): MockObject - { - $partialMock = $this->getMockBuilder($originalClassName) - ->disableOriginalConstructor() - ->disableOriginalClone() - ->disableArgumentCloning() - ->disallowMockingUnknownTypes() - ->onlyMethods($methods) - ->getMock(); - - Event\Facade::emitter()->testCreatedPartialMockObject( - $originalClassName, - ...$methods, - ); - - return $partialMock; - } - - /** - * Creates a test proxy for the specified class. - * - * @psalm-template RealInstanceType of object - * - * @psalm-param class-string $originalClassName - * - * @throws InvalidArgumentException - * @throws MockObjectException - * - * @psalm-return MockObject&RealInstanceType - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5240 - */ - protected function createTestProxy(string $originalClassName, array $constructorArguments = []): MockObject - { - $testProxy = $this->getMockBuilder($originalClassName) - ->setConstructorArgs($constructorArguments) - ->enableProxyingToOriginalMethods() - ->getMock(); - - Event\Facade::emitter()->testCreatedTestProxy( - $originalClassName, - $constructorArguments, - ); - - return $testProxy; - } - - /** - * Creates a mock object for the specified abstract class with all abstract - * methods of the class mocked. Concrete methods are not mocked by default. - * To mock concrete methods, use the 7th parameter ($mockedMethods). - * - * @psalm-template RealInstanceType of object - * - * @psalm-param class-string $originalClassName - * - * @throws InvalidArgumentException - * @throws MockObjectException - * - * @psalm-return MockObject&RealInstanceType - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5241 - */ - protected function getMockForAbstractClass(string $originalClassName, array $arguments = [], string $mockClassName = '', bool $callOriginalConstructor = true, bool $callOriginalClone = true, bool $callAutoload = true, array $mockedMethods = [], bool $cloneArguments = false): MockObject - { - $mockObject = (new MockGenerator)->mockObjectForAbstractClass( - $originalClassName, - $arguments, - $mockClassName, - $callOriginalConstructor, - $callOriginalClone, - $callAutoload, - $mockedMethods, - $cloneArguments, - ); - - $this->registerMockObject($mockObject); - - Event\Facade::emitter()->testCreatedMockObjectForAbstractClass($originalClassName); - - assert($mockObject instanceof $originalClassName); - assert($mockObject instanceof MockObject); - - return $mockObject; - } - - /** - * Creates a mock object based on the given WSDL file. - * - * @throws MockObjectException - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5242 - */ - protected function getMockFromWsdl(string $wsdlFile, string $originalClassName = '', string $mockClassName = '', array $methods = [], bool $callOriginalConstructor = true, array $options = []): MockObject - { - if ($originalClassName === '') { - $fileName = pathinfo(basename(parse_url($wsdlFile, PHP_URL_PATH)), PATHINFO_FILENAME); - $originalClassName = preg_replace('/\W/', '', $fileName); - } - - if (!class_exists($originalClassName)) { - eval( - (new MockGenerator)->generateClassFromWsdl( - $wsdlFile, - $originalClassName, - $methods, - $options, - ) - ); - } - - $mockObject = (new MockGenerator)->testDouble( - $originalClassName, - true, - $methods, - ['', $options], - $mockClassName, - $callOriginalConstructor, - false, - false, - ); - - Event\Facade::emitter()->testCreatedMockObjectFromWsdl( - $wsdlFile, - $originalClassName, - $mockClassName, - $methods, - $callOriginalConstructor, - $options, - ); - - assert($mockObject instanceof MockObject); - - $this->registerMockObject($mockObject); - - return $mockObject; - } - - /** - * Creates a mock object for the specified trait with all abstract methods - * of the trait mocked. Concrete methods to mock can be specified with the - * `$mockedMethods` parameter. - * - * @psalm-param trait-string $traitName - * - * @throws InvalidArgumentException - * @throws MockObjectException - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5243 - */ - protected function getMockForTrait(string $traitName, array $arguments = [], string $mockClassName = '', bool $callOriginalConstructor = true, bool $callOriginalClone = true, bool $callAutoload = true, array $mockedMethods = [], bool $cloneArguments = false): MockObject - { - $mockObject = (new MockGenerator)->mockObjectForTrait( - $traitName, - $arguments, - $mockClassName, - $callOriginalConstructor, - $callOriginalClone, - $callAutoload, - $mockedMethods, - $cloneArguments, - ); - - $this->registerMockObject($mockObject); - - Event\Facade::emitter()->testCreatedMockObjectForTrait($traitName); - - return $mockObject; - } - - /** - * Creates an object that uses the specified trait. - * - * @psalm-param trait-string $traitName - * - * @throws MockObjectException - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5244 - */ - protected function getObjectForTrait(string $traitName, array $arguments = [], string $traitClassName = '', bool $callOriginalConstructor = true, bool $callOriginalClone = true, bool $callAutoload = true): object - { - return (new MockGenerator)->objectForTrait( - $traitName, - $traitClassName, - $callAutoload, - $callOriginalConstructor, - $arguments, - ); - } - - protected function transformException(Throwable $t): Throwable - { - return $t; - } - - /** - * This method is called when a test method did not execute successfully. - * - * @throws Throwable - */ - protected function onNotSuccessfulTest(Throwable $t): never - { - throw $t; - } - - /** - * @throws AssertionFailedError - * @throws Exception - * @throws ExpectationFailedException - * @throws Throwable - */ - private function runTest(): mixed - { - $testArguments = array_merge($this->data, $this->dependencyInput); - - $this->registerMockObjectsFromTestArguments($testArguments); - - try { - $testResult = $this->{$this->name}(...array_values($testArguments)); - } catch (Throwable $exception) { - if (!$this->shouldExceptionExpectationsBeVerified($exception)) { - throw $exception; - } - - $this->verifyExceptionExpectations($exception); - - return null; - } - - $this->expectedExceptionWasNotRaised(); - - return $testResult; - } - - /** - * @throws Throwable - */ - private function verifyMockObjects(): void - { - foreach ($this->mockObjects as $mockObject) { - if ($mockObject->__phpunit_hasMatchers()) { - $this->numberOfAssertionsPerformed++; - } - - $mockObject->__phpunit_verify( - $this->shouldInvocationMockerBeReset($mockObject), - ); - } - } - - /** - * @throws SkippedTest - */ - private function checkRequirements(): void - { - if (!$this->name || !method_exists($this, $this->name)) { - return; - } - - $missingRequirements = (new Requirements)->requirementsNotSatisfiedFor( - static::class, - $this->name, - ); - - if (!empty($missingRequirements)) { - $this->markTestSkipped(implode(PHP_EOL, $missingRequirements)); - } - } - - private function handleDependencies(): bool - { - if ([] === $this->dependencies || $this->inIsolation) { - return true; - } - - $passedTests = PassedTests::instance(); - - foreach ($this->dependencies as $dependency) { - if (!$dependency->isValid()) { - $this->markErrorForInvalidDependency(); - - return false; - } - - if ($dependency->targetIsClass()) { - $dependencyClassName = $dependency->getTargetClassName(); - - if (!class_exists($dependencyClassName)) { - $this->markErrorForInvalidDependency($dependency); - - return false; - } - - if (!$passedTests->hasTestClassPassed($dependencyClassName)) { - $this->markSkippedForMissingDependency($dependency); - - return false; - } - - continue; - } - - $dependencyTarget = $dependency->getTarget(); - - if (!$passedTests->hasTestMethodPassed($dependencyTarget)) { - if (!$this->isCallableTestMethod($dependencyTarget)) { - $this->markErrorForInvalidDependency($dependency); - } else { - $this->markSkippedForMissingDependency($dependency); - } - - return false; - } - - if ($passedTests->isGreaterThan($dependencyTarget, $this->size())) { - Event\Facade::emitter()->testConsideredRisky( - $this->valueObjectForEvents(), - 'This test depends on a test that is larger than itself', - ); - - return true; - } - - $returnValue = $passedTests->returnValue($dependencyTarget); - - if ($dependency->deepClone()) { - $deepCopy = new DeepCopy; - $deepCopy->skipUncloneable(false); - - $this->dependencyInput[$dependencyTarget] = $deepCopy->copy($returnValue); - } elseif ($dependency->shallowClone()) { - $this->dependencyInput[$dependencyTarget] = clone $returnValue; - } else { - $this->dependencyInput[$dependencyTarget] = $returnValue; - } - } - - $this->testValueObjectForEvents = null; - - return true; - } - - /** - * @throws Exception - * @throws MoreThanOneDataSetFromDataProviderException - * @throws NoPreviousThrowableException - */ - private function markErrorForInvalidDependency(?ExecutionOrderDependency $dependency = null): void - { - $message = 'This test has an invalid dependency'; - - if ($dependency !== null) { - $message = sprintf( - 'This test depends on "%s" which does not exist', - $dependency->targetIsClass() ? $dependency->getTargetClassName() : $dependency->getTarget(), - ); - } - - $exception = new InvalidDependencyException($message); - - Event\Facade::emitter()->testErrored( - $this->valueObjectForEvents(), - Event\Code\ThrowableBuilder::from($exception), - ); - - $this->status = TestStatus::error($message); - } - - /** - * @throws MoreThanOneDataSetFromDataProviderException - */ - private function markSkippedForMissingDependency(ExecutionOrderDependency $dependency): void - { - $message = sprintf( - 'This test depends on "%s" to pass', - $dependency->getTarget(), - ); - - Event\Facade::emitter()->testSkipped( - $this->valueObjectForEvents(), - $message, - ); - - $this->status = TestStatus::skipped($message); - } - - private function startOutputBuffering(): void - { - ob_start(); - - $this->outputBufferingActive = true; - $this->outputBufferingLevel = ob_get_level(); - } - - /** - * @throws MoreThanOneDataSetFromDataProviderException - */ - private function stopOutputBuffering(): bool - { - $bufferingLevel = ob_get_level(); - - if ($bufferingLevel !== $this->outputBufferingLevel) { - if ($bufferingLevel > $this->outputBufferingLevel) { - $message = 'Test code or tested code did not close its own output buffers'; - } else { - $message = 'Test code or tested code closed output buffers other than its own'; - } - - while (ob_get_level() >= $this->outputBufferingLevel) { - ob_end_clean(); - } - - Event\Facade::emitter()->testConsideredRisky( - $this->valueObjectForEvents(), - $message, - ); - - return false; - } - - $this->output = ob_get_clean(); - - $this->outputBufferingActive = false; - $this->outputBufferingLevel = ob_get_level(); - - return true; - } - - private function snapshotGlobalState(): void - { - if ($this->runTestInSeparateProcess || $this->inIsolation || - (!$this->backupGlobals && !$this->backupStaticProperties)) { - return; - } - - $snapshot = $this->createGlobalStateSnapshot($this->backupGlobals === true); - - $this->snapshot = $snapshot; - } - - /** - * @throws MoreThanOneDataSetFromDataProviderException - */ - private function restoreGlobalState(): void - { - if (!$this->snapshot instanceof Snapshot) { - return; - } - - if (ConfigurationRegistry::get()->beStrictAboutChangesToGlobalState()) { - $this->compareGlobalStateSnapshots( - $this->snapshot, - $this->createGlobalStateSnapshot($this->backupGlobals === true), - ); - } - - $restorer = new Restorer; - - if ($this->backupGlobals) { - $restorer->restoreGlobalVariables($this->snapshot); - } - - if ($this->backupStaticProperties) { - $restorer->restoreStaticProperties($this->snapshot); - } - - $this->snapshot = null; - } - - private function createGlobalStateSnapshot(bool $backupGlobals): Snapshot - { - $excludeList = new GlobalStateExcludeList; - - foreach ($this->backupGlobalsExcludeList as $globalVariable) { - $excludeList->addGlobalVariable($globalVariable); - } - - if (!defined('PHPUNIT_TESTSUITE')) { - $excludeList->addClassNamePrefix('PHPUnit'); - $excludeList->addClassNamePrefix('SebastianBergmann\CodeCoverage'); - $excludeList->addClassNamePrefix('SebastianBergmann\FileIterator'); - $excludeList->addClassNamePrefix('SebastianBergmann\Invoker'); - $excludeList->addClassNamePrefix('SebastianBergmann\Template'); - $excludeList->addClassNamePrefix('SebastianBergmann\Timer'); - $excludeList->addStaticProperty(ComparatorFactory::class, 'instance'); - - foreach ($this->backupStaticPropertiesExcludeList as $class => $properties) { - foreach ($properties as $property) { - $excludeList->addStaticProperty($class, $property); - } - } - } - - return new Snapshot( - $excludeList, - $backupGlobals, - (bool) $this->backupStaticProperties, - false, - false, - false, - false, - false, - false, - false, - ); - } - - /** - * @throws MoreThanOneDataSetFromDataProviderException - */ - private function compareGlobalStateSnapshots(Snapshot $before, Snapshot $after): void - { - $backupGlobals = $this->backupGlobals === null || $this->backupGlobals; - - if ($backupGlobals) { - $this->compareGlobalStateSnapshotPart( - $before->globalVariables(), - $after->globalVariables(), - "--- Global variables before the test\n+++ Global variables after the test\n", - ); - - $this->compareGlobalStateSnapshotPart( - $before->superGlobalVariables(), - $after->superGlobalVariables(), - "--- Super-global variables before the test\n+++ Super-global variables after the test\n", - ); - } - - if ($this->backupStaticProperties) { - $this->compareGlobalStateSnapshotPart( - $before->staticProperties(), - $after->staticProperties(), - "--- Static properties before the test\n+++ Static properties after the test\n", - ); - } - } - - /** - * @throws MoreThanOneDataSetFromDataProviderException - */ - private function compareGlobalStateSnapshotPart(array $before, array $after, string $header): void - { - if ($before == $after) { - return; - } - - $differ = new Differ(new UnifiedDiffOutputBuilder($header)); - $exporter = new Exporter; - - Event\Facade::emitter()->testConsideredRisky( - $this->valueObjectForEvents(), - 'This test modified global state but was not expected to do so' . PHP_EOL . - trim( - $differ->diff( - $exporter->export($before), - $exporter->export($after), - ), - ), - ); - } - - private function shouldInvocationMockerBeReset(MockObject $mock): bool - { - $enumerator = new Enumerator; - - if (in_array($mock, $enumerator->enumerate($this->dependencyInput), true)) { - return false; - } - - if (!is_array($this->testResult) && !is_object($this->testResult)) { - return true; - } - - return !in_array($mock, $enumerator->enumerate($this->testResult), true); - } - - /** - * @deprecated - */ - private function registerMockObjectsFromTestArguments(array $testArguments, Context $context = new Context): void - { - if ($this->registerMockObjectsFromTestArgumentsRecursively) { - foreach ((new Enumerator)->enumerate($testArguments) as $object) { - if ($object instanceof MockObject) { - $this->registerMockObject($object); - } - } - } else { - foreach ($testArguments as &$testArgument) { - if ($testArgument instanceof MockObject) { - $testArgument = Cloner::clone($testArgument); - - $this->registerMockObject($testArgument); - } elseif (is_array($testArgument) && !$context->contains($testArgument)) { - $testArgumentCopy = $testArgument; - $context->add($testArgument); - - $this->registerMockObjectsFromTestArguments( - $testArgumentCopy, - $context, - ); - } - } - } - } - - private function unregisterCustomComparators(): void - { - $factory = ComparatorFactory::getInstance(); - - foreach ($this->customComparators as $comparator) { - $factory->unregister($comparator); - } - - $this->customComparators = []; - } - - private function cleanupIniSettings(): void - { - foreach ($this->iniSettings as $varName => $oldValue) { - ini_set($varName, $oldValue); - } - - $this->iniSettings = []; - } - - private function cleanupLocaleSettings(): void - { - foreach ($this->locale as $category => $locale) { - setlocale($category, $locale); - } - - $this->locale = []; - } - - /** - * @throws Exception - */ - private function shouldExceptionExpectationsBeVerified(Throwable $throwable): bool - { - $result = false; - - if ($this->expectedException !== null || $this->expectedExceptionCode !== null || $this->expectedExceptionMessage !== null || $this->expectedExceptionMessageRegExp !== null) { - $result = true; - } - - if ($throwable instanceof Exception) { - $result = false; - } - - if (is_string($this->expectedException)) { - try { - $reflector = new ReflectionClass($this->expectedException); - // @codeCoverageIgnoreStart - } catch (ReflectionException $e) { - throw new Exception( - $e->getMessage(), - $e->getCode(), - $e, - ); - } - // @codeCoverageIgnoreEnd - - if ($this->expectedException === 'PHPUnit\Framework\Exception' || - $this->expectedException === '\PHPUnit\Framework\Exception' || - $reflector->isSubclassOf(Exception::class)) { - $result = true; - } - } - - return $result; - } - - private function shouldRunInSeparateProcess(): bool - { - if ($this->inIsolation) { - return false; - } - - if ($this->runTestInSeparateProcess) { - return true; - } - - if ($this->runClassInSeparateProcess) { - return true; - } - - return ConfigurationRegistry::get()->processIsolation(); - } - - private function isCallableTestMethod(string $dependency): bool - { - [$className, $methodName] = explode('::', $dependency); - - if (!class_exists($className)) { - return false; - } - - $class = new ReflectionClass($className); - - if (!$class->isSubclassOf(__CLASS__)) { - return false; - } - - if (!$class->hasMethod($methodName)) { - return false; - } - - return TestUtil::isTestMethod( - $class->getMethod($methodName), - ); - } - - /** - * @throws Exception - * @throws ExpectationFailedException - * @throws MoreThanOneDataSetFromDataProviderException - * @throws NoPreviousThrowableException - */ - private function performAssertionsOnOutput(): void - { - try { - if ($this->outputExpectedRegex !== null) { - $this->assertMatchesRegularExpression($this->outputExpectedRegex, $this->output); - } elseif ($this->outputExpectedString !== null) { - $this->assertSame($this->outputExpectedString, $this->output); - } - } catch (ExpectationFailedException $e) { - $this->status = TestStatus::failure($e->getMessage()); - - Event\Facade::emitter()->testFailed( - $this->valueObjectForEvents(), - Event\Code\ThrowableBuilder::from($e), - Event\Code\ComparisonFailureBuilder::from($e), - ); - - throw $e; - } - } - - /** - * @throws Throwable - * - * @codeCoverageIgnore - */ - private function invokeBeforeClassHookMethods(array $hookMethods, Event\Emitter $emitter): void - { - $this->invokeHookMethods( - $hookMethods['beforeClass'], - $emitter, - 'beforeFirstTestMethodCalled', - 'beforeFirstTestMethodErrored', - 'beforeFirstTestMethodFinished', - ); - } - - /** - * @throws Throwable - */ - private function invokeBeforeTestHookMethods(array $hookMethods, Event\Emitter $emitter): void - { - $this->invokeHookMethods( - $hookMethods['before'], - $emitter, - 'beforeTestMethodCalled', - 'beforeTestMethodErrored', - 'beforeTestMethodFinished', - ); - } - - /** - * @throws Throwable - */ - private function invokePreConditionHookMethods(array $hookMethods, Event\Emitter $emitter): void - { - $this->invokeHookMethods( - $hookMethods['preCondition'], - $emitter, - 'preConditionCalled', - 'preConditionErrored', - 'preConditionFinished', - ); - } - - /** - * @throws Throwable - */ - private function invokePostConditionHookMethods(array $hookMethods, Event\Emitter $emitter): void - { - $this->invokeHookMethods( - $hookMethods['postCondition'], - $emitter, - 'postConditionCalled', - 'postConditionErrored', - 'postConditionFinished', - ); - } - - /** - * @throws Throwable - */ - private function invokeAfterTestHookMethods(array $hookMethods, Event\Emitter $emitter): void - { - $this->invokeHookMethods( - $hookMethods['after'], - $emitter, - 'afterTestMethodCalled', - 'afterTestMethodErrored', - 'afterTestMethodFinished', - ); - } - - /** - * @throws Throwable - * - * @codeCoverageIgnore - */ - private function invokeAfterClassHookMethods(array $hookMethods, Event\Emitter $emitter): void - { - $this->invokeHookMethods( - $hookMethods['afterClass'], - $emitter, - 'afterLastTestMethodCalled', - 'afterLastTestMethodErrored', - 'afterLastTestMethodFinished', - ); - } - - /** - * @psalm-param list $hookMethods - * @psalm-param 'beforeFirstTestMethodCalled'|'beforeTestMethodCalled'|'preConditionCalled'|'postConditionCalled'|'afterTestMethodCalled'|'afterLastTestMethodCalled' $calledMethod - * @psalm-param 'beforeFirstTestMethodErrored'|'beforeTestMethodErrored'|'preConditionErrored'|'postConditionErrored'|'afterTestMethodErrored'|'afterLastTestMethodErrored' $erroredMethod - * @psalm-param 'beforeFirstTestMethodFinished'|'beforeTestMethodFinished'|'preConditionFinished'|'postConditionFinished'|'afterTestMethodFinished'|'afterLastTestMethodFinished' $finishedMethod - * - * @throws Throwable - */ - private function invokeHookMethods(array $hookMethods, Event\Emitter $emitter, string $calledMethod, string $erroredMethod, string $finishedMethod): void - { - $methodsInvoked = []; - - foreach ($hookMethods as $methodName) { - if ($this->methodDoesNotExistOrIsDeclaredInTestCase($methodName)) { - continue; - } - - $methodInvoked = new Event\Code\ClassMethod( - static::class, - $methodName, - ); - - try { - $this->{$methodName}(); - } catch (Throwable $t) { - } - - $emitter->{$calledMethod}( - static::class, - $methodInvoked - ); - - $methodsInvoked[] = $methodInvoked; - - if (isset($t)) { - $emitter->{$erroredMethod}( - static::class, - $methodInvoked, - Event\Code\ThrowableBuilder::from($t), - ); - - break; - } - } - - if (!empty($methodsInvoked)) { - $emitter->{$finishedMethod}( - static::class, - ...$methodsInvoked - ); - } - - if (isset($t)) { - throw $t; - } - } - - private function methodDoesNotExistOrIsDeclaredInTestCase(string $methodName): bool - { - $reflector = new ReflectionObject($this); - - return !$reflector->hasMethod($methodName) || - $reflector->getMethod($methodName)->getDeclaringClass()->getName() === self::class; - } - - /** - * @throws ExpectationFailedException - */ - private function verifyExceptionExpectations(\Exception|Throwable $exception): void - { - if ($this->expectedException !== null) { - $this->assertThat( - $exception, - new ExceptionConstraint( - $this->expectedException, - ), - ); - } - - if ($this->expectedExceptionMessage !== null) { - $this->assertThat( - $exception->getMessage(), - new ExceptionMessageIsOrContains( - $this->expectedExceptionMessage, - ), - ); - } - - if ($this->expectedExceptionMessageRegExp !== null) { - $this->assertThat( - $exception->getMessage(), - new ExceptionMessageMatchesRegularExpression( - $this->expectedExceptionMessageRegExp, - ), - ); - } - - if ($this->expectedExceptionCode !== null) { - $this->assertThat( - $exception->getCode(), - new ExceptionCode( - $this->expectedExceptionCode, - ), - ); - } - } - - /** - * @throws AssertionFailedError - */ - private function expectedExceptionWasNotRaised(): void - { - if ($this->expectedException !== null) { - $this->assertThat( - null, - new ExceptionConstraint($this->expectedException), - ); - } elseif ($this->expectedExceptionMessage !== null) { - $this->numberOfAssertionsPerformed++; - - throw new AssertionFailedError( - sprintf( - 'Failed asserting that exception with message "%s" is thrown', - $this->expectedExceptionMessage, - ), - ); - } elseif ($this->expectedExceptionMessageRegExp !== null) { - $this->numberOfAssertionsPerformed++; - - throw new AssertionFailedError( - sprintf( - 'Failed asserting that exception with message matching "%s" is thrown', - $this->expectedExceptionMessageRegExp, - ), - ); - } elseif ($this->expectedExceptionCode !== null) { - $this->numberOfAssertionsPerformed++; - - throw new AssertionFailedError( - sprintf( - 'Failed asserting that exception with code "%s" is thrown', - $this->expectedExceptionCode, - ), - ); - } - } - - private function isRegisteredFailure(Throwable $t): bool - { - foreach (array_keys($this->failureTypes) as $failureType) { - if ($t instanceof $failureType) { - return true; - } - } - - return false; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - private function hasExpectationOnOutput(): bool - { - return is_string($this->outputExpectedString) || is_string($this->outputExpectedRegex); - } - - private function requirementsNotSatisfied(): bool - { - return (new Requirements)->requirementsNotSatisfiedFor(static::class, $this->name) !== []; - } - - /** - * @see https://github.com/sebastianbergmann/phpunit/issues/6095 - */ - private function handleExceptionFromInvokedCountMockObjectRule(Throwable $t): void - { - if (!$t instanceof ExpectationFailedException) { - return; - } - - $trace = $t->getTrace(); - - if (isset($trace[0]['class']) && $trace[0]['class'] === InvokedCount::class) { - $this->numberOfAssertionsPerformed++; - } - } - - /** - * Creates a test stub for the specified interface or class. - * - * @psalm-template RealInstanceType of object - * - * @psalm-param class-string $originalClassName - * - * @throws InvalidArgumentException - * @throws MockObjectException - * @throws NoPreviousThrowableException - * - * @psalm-return Stub&RealInstanceType - */ - protected static function createStub(string $originalClassName): Stub - { - $stub = (new MockGenerator)->testDouble( - $originalClassName, - true, - callOriginalConstructor: false, - callOriginalClone: false, - cloneArguments: false, - allowMockingUnknownTypes: false, - ); - - Event\Facade::emitter()->testCreatedStub($originalClassName); - - assert($stub instanceof $originalClassName); - assert($stub instanceof Stub); - - return $stub; - } - - /** - * @psalm-param list $interfaces - * - * @throws MockObjectException - */ - protected static function createStubForIntersectionOfInterfaces(array $interfaces): Stub - { - $stub = (new MockGenerator)->testDoubleForInterfaceIntersection($interfaces, true); - - Event\Facade::emitter()->testCreatedStubForIntersectionOfInterfaces($interfaces); - - return $stub; - } - - /** - * Creates (and configures) a test stub for the specified interface or class. - * - * @psalm-template RealInstanceType of object - * - * @psalm-param class-string $originalClassName - * - * @throws InvalidArgumentException - * @throws MockObjectException - * @throws NoPreviousThrowableException - * - * @psalm-return Stub&RealInstanceType - */ - final protected static function createConfiguredStub(string $originalClassName, array $configuration): Stub - { - $o = self::createStub($originalClassName); - - foreach ($configuration as $method => $return) { - $o->method($method)->willReturn($return); - } - - return $o; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/TestRunner.php b/vendor/phpunit/phpunit/src/Framework/TestRunner.php deleted file mode 100644 index 9171b37..0000000 --- a/vendor/phpunit/phpunit/src/Framework/TestRunner.php +++ /dev/null @@ -1,471 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -use const PHP_EOL; -use function assert; -use function defined; -use function error_clear_last; -use function extension_loaded; -use function get_include_path; -use function hrtime; -use function serialize; -use function sprintf; -use function sys_get_temp_dir; -use function tempnam; -use function unlink; -use function var_export; -use function xdebug_is_debugger_active; -use AssertionError; -use PHPUnit\Event; -use PHPUnit\Event\NoPreviousThrowableException; -use PHPUnit\Event\TestData\MoreThanOneDataSetFromDataProviderException; -use PHPUnit\Metadata\Api\CodeCoverage as CodeCoverageMetadataApi; -use PHPUnit\Metadata\Parser\Registry as MetadataRegistry; -use PHPUnit\Runner\CodeCoverage; -use PHPUnit\Runner\ErrorHandler; -use PHPUnit\TextUI\Configuration\Configuration; -use PHPUnit\TextUI\Configuration\Registry as ConfigurationRegistry; -use PHPUnit\Util\GlobalState; -use PHPUnit\Util\PHP\AbstractPhpProcess; -use ReflectionClass; -use SebastianBergmann\CodeCoverage\Exception as OriginalCodeCoverageException; -use SebastianBergmann\CodeCoverage\InvalidArgumentException; -use SebastianBergmann\CodeCoverage\UnintentionallyCoveredCodeException; -use SebastianBergmann\Invoker\Invoker; -use SebastianBergmann\Invoker\TimeoutException; -use SebastianBergmann\Template\Template; -use Throwable; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestRunner -{ - private ?bool $timeLimitCanBeEnforced = null; - private readonly Configuration $configuration; - - public function __construct() - { - $this->configuration = ConfigurationRegistry::get(); - } - - /** - * @throws \PHPUnit\Runner\Exception - * @throws CodeCoverageException - * @throws InvalidArgumentException - * @throws MoreThanOneDataSetFromDataProviderException - * @throws UnintentionallyCoveredCodeException - */ - public function run(TestCase $test): void - { - Assert::resetCount(); - - if ($this->configuration->registerMockObjectsFromTestArgumentsRecursively()) { - $test->registerMockObjectsFromTestArgumentsRecursively(); - } - - $shouldCodeCoverageBeCollected = (new CodeCoverageMetadataApi)->shouldCodeCoverageBeCollectedFor( - $test::class, - $test->name(), - ); - - $error = false; - $failure = false; - $incomplete = false; - $risky = false; - $skipped = false; - - error_clear_last(); - - if ($this->shouldErrorHandlerBeUsed($test)) { - ErrorHandler::instance()->enable(); - } - - $collectCodeCoverage = CodeCoverage::instance()->isActive() && - $shouldCodeCoverageBeCollected; - - if ($collectCodeCoverage) { - CodeCoverage::instance()->start($test); - } - - try { - if ($this->canTimeLimitBeEnforced() && - $this->shouldTimeLimitBeEnforced($test)) { - $risky = $this->runTestWithTimeout($test); - } else { - $test->runBare(); - } - } catch (AssertionFailedError $e) { - $failure = true; - - if ($e instanceof IncompleteTestError) { - $incomplete = true; - } elseif ($e instanceof SkippedTest) { - $skipped = true; - } - } catch (AssertionError $e) { - $test->addToAssertionCount(1); - - $failure = true; - $frame = $e->getTrace()[0]; - - assert(isset($frame['file'])); - assert(isset($frame['line'])); - - $e = new AssertionFailedError( - sprintf( - '%s in %s:%s', - $e->getMessage(), - $frame['file'], - $frame['line'], - ), - ); - } catch (Throwable $e) { - $error = true; - } - - $test->addToAssertionCount(Assert::getCount()); - - if ($this->configuration->reportUselessTests() && - !$test->doesNotPerformAssertions() && - $test->numberOfAssertionsPerformed() === 0) { - $risky = true; - } - - if (!$error && !$failure && !$incomplete && !$skipped && !$risky && - $this->configuration->requireCoverageMetadata() && - !$this->hasCoverageMetadata($test::class, $test->name())) { - Event\Facade::emitter()->testConsideredRisky( - $test->valueObjectForEvents(), - 'This test does not define a code coverage target but is expected to do so', - ); - - $risky = true; - } - - if ($collectCodeCoverage) { - $append = !$risky && !$incomplete && !$skipped; - $linesToBeCovered = []; - $linesToBeUsed = []; - - if ($append) { - try { - $linesToBeCovered = (new CodeCoverageMetadataApi)->linesToBeCovered( - $test::class, - $test->name(), - ); - - $linesToBeUsed = (new CodeCoverageMetadataApi)->linesToBeUsed( - $test::class, - $test->name(), - ); - } catch (InvalidCoversTargetException $cce) { - Event\Facade::emitter()->testTriggeredPhpunitWarning( - $test->valueObjectForEvents(), - $cce->getMessage(), - ); - - $append = false; - } - } - - try { - CodeCoverage::instance()->stop( - $append, - $linesToBeCovered, - $linesToBeUsed, - ); - } catch (UnintentionallyCoveredCodeException $cce) { - Event\Facade::emitter()->testConsideredRisky( - $test->valueObjectForEvents(), - 'This test executed code that is not listed as code to be covered or used:' . - PHP_EOL . - $cce->getMessage(), - ); - } catch (OriginalCodeCoverageException $cce) { - $error = true; - - $e = $e ?? $cce; - } - } - - ErrorHandler::instance()->disable(); - - if (!$error && - !$incomplete && - !$skipped && - $this->configuration->reportUselessTests() && - !$test->doesNotPerformAssertions() && - $test->numberOfAssertionsPerformed() === 0) { - Event\Facade::emitter()->testConsideredRisky( - $test->valueObjectForEvents(), - 'This test did not perform any assertions', - ); - } - - if ($test->doesNotPerformAssertions() && - $test->numberOfAssertionsPerformed() > 0) { - Event\Facade::emitter()->testConsideredRisky( - $test->valueObjectForEvents(), - sprintf( - 'This test is not expected to perform assertions but performed %d assertion%s', - $test->numberOfAssertionsPerformed(), - $test->numberOfAssertionsPerformed() > 1 ? 's' : '', - ), - ); - } - - if ($test->hasUnexpectedOutput()) { - Event\Facade::emitter()->testPrintedUnexpectedOutput($test->output()); - } - - if ($this->configuration->disallowTestOutput() && $test->hasUnexpectedOutput()) { - Event\Facade::emitter()->testConsideredRisky( - $test->valueObjectForEvents(), - sprintf( - 'Test code or tested code printed unexpected output: %s', - $test->output(), - ), - ); - } - - if ($test->wasPrepared()) { - Event\Facade::emitter()->testFinished( - $test->valueObjectForEvents(), - $test->numberOfAssertionsPerformed(), - ); - } - } - - /** - * @throws \PHPUnit\Runner\Exception - * @throws \PHPUnit\Util\Exception - * @throws \SebastianBergmann\Template\InvalidArgumentException - * @throws Exception - * @throws MoreThanOneDataSetFromDataProviderException - * @throws NoPreviousThrowableException - * @throws ProcessIsolationException - */ - public function runInSeparateProcess(TestCase $test, bool $runEntireClass, bool $preserveGlobalState): void - { - $class = new ReflectionClass($test); - - if ($runEntireClass) { - $template = new Template( - __DIR__ . '/../Util/PHP/Template/TestCaseClass.tpl', - ); - } else { - $template = new Template( - __DIR__ . '/../Util/PHP/Template/TestCaseMethod.tpl', - ); - } - - $bootstrap = ''; - $constants = ''; - $globals = ''; - $includedFiles = ''; - $iniSettings = ''; - - if (ConfigurationRegistry::get()->hasBootstrap()) { - $bootstrap = ConfigurationRegistry::get()->bootstrap(); - } - - if ($preserveGlobalState) { - $constants = GlobalState::getConstantsAsString(); - $globals = GlobalState::getGlobalsAsString(); - $includedFiles = GlobalState::getIncludedFilesAsString(); - $iniSettings = GlobalState::getIniSettingsAsString(); - } - - $exportObjects = Event\Facade::emitter()->exportsObjects() ? 'true' : 'false'; - $coverage = CodeCoverage::instance()->isActive() ? 'true' : 'false'; - $linesToBeIgnored = var_export(CodeCoverage::instance()->linesToBeIgnored(), true); - - if (defined('PHPUNIT_COMPOSER_INSTALL')) { - $composerAutoload = var_export(PHPUNIT_COMPOSER_INSTALL, true); - } else { - $composerAutoload = '\'\''; - } - - if (defined('__PHPUNIT_PHAR__')) { - $phar = var_export(__PHPUNIT_PHAR__, true); - } else { - $phar = '\'\''; - } - - $data = var_export(serialize($test->providedData()), true); - $dataName = var_export($test->dataName(), true); - $dependencyInput = var_export(serialize($test->dependencyInput()), true); - $includePath = var_export(get_include_path(), true); - // must do these fixes because TestCaseMethod.tpl has unserialize('{data}') in it, and we can't break BC - // the lines above used to use addcslashes() rather than var_export(), which breaks null byte escape sequences - $data = "'." . $data . ".'"; - $dataName = "'.(" . $dataName . ").'"; - $dependencyInput = "'." . $dependencyInput . ".'"; - $includePath = "'." . $includePath . ".'"; - $offset = hrtime(); - $serializedConfiguration = $this->saveConfigurationForChildProcess(); - $processResultFile = tempnam(sys_get_temp_dir(), 'phpunit_'); - - $var = [ - 'bootstrap' => $bootstrap, - 'composerAutoload' => $composerAutoload, - 'phar' => $phar, - 'filename' => $class->getFileName(), - 'className' => $class->getName(), - 'collectCodeCoverageInformation' => $coverage, - 'linesToBeIgnored' => $linesToBeIgnored, - 'data' => $data, - 'dataName' => $dataName, - 'dependencyInput' => $dependencyInput, - 'constants' => $constants, - 'globals' => $globals, - 'include_path' => $includePath, - 'included_files' => $includedFiles, - 'iniSettings' => $iniSettings, - 'name' => $test->name(), - 'offsetSeconds' => $offset[0], - 'offsetNanoseconds' => $offset[1], - 'serializedConfiguration' => $serializedConfiguration, - 'processResultFile' => $processResultFile, - 'exportObjects' => $exportObjects, - ]; - - if (!$runEntireClass) { - $var['methodName'] = $test->name(); - } - - $template->setVar($var); - - $php = AbstractPhpProcess::factory(); - $php->runTestJob($template->render(), $test, $processResultFile); - - @unlink($serializedConfiguration); - } - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - */ - private function hasCoverageMetadata(string $className, string $methodName): bool - { - foreach (MetadataRegistry::parser()->forClassAndMethod($className, $methodName) as $metadata) { - if ($metadata->isCovers()) { - return true; - } - - if ($metadata->isCoversClass()) { - return true; - } - - if ($metadata->isCoversFunction()) { - return true; - } - - if ($metadata->isCoversNothing()) { - return true; - } - } - - return false; - } - - private function canTimeLimitBeEnforced(): bool - { - if ($this->timeLimitCanBeEnforced !== null) { - return $this->timeLimitCanBeEnforced; - } - - $this->timeLimitCanBeEnforced = (new Invoker)->canInvokeWithTimeout(); - - return $this->timeLimitCanBeEnforced; - } - - private function shouldTimeLimitBeEnforced(TestCase $test): bool - { - if (!$this->configuration->enforceTimeLimit()) { - return false; - } - - if (!(($this->configuration->defaultTimeLimit() || $test->size()->isKnown()))) { - return false; - } - - if (extension_loaded('xdebug') && xdebug_is_debugger_active()) { - return false; - } - - return true; - } - - /** - * @throws Throwable - */ - private function runTestWithTimeout(TestCase $test): bool - { - $_timeout = $this->configuration->defaultTimeLimit(); - $testSize = $test->size(); - - if ($testSize->isSmall()) { - $_timeout = $this->configuration->timeoutForSmallTests(); - } elseif ($testSize->isMedium()) { - $_timeout = $this->configuration->timeoutForMediumTests(); - } elseif ($testSize->isLarge()) { - $_timeout = $this->configuration->timeoutForLargeTests(); - } - - try { - (new Invoker)->invoke([$test, 'runBare'], [], $_timeout); - } catch (TimeoutException) { - Event\Facade::emitter()->testConsideredRisky( - $test->valueObjectForEvents(), - sprintf( - 'This test was aborted after %d second%s', - $_timeout, - $_timeout !== 1 ? 's' : '', - ), - ); - - return true; - } - - return false; - } - - /** - * @throws ProcessIsolationException - */ - private function saveConfigurationForChildProcess(): string - { - $path = tempnam(sys_get_temp_dir(), 'phpunit_'); - - if ($path === false) { - throw new ProcessIsolationException; - } - - if (!ConfigurationRegistry::saveTo($path)) { - throw new ProcessIsolationException; - } - - return $path; - } - - private function shouldErrorHandlerBeUsed(TestCase $test): bool - { - if (MetadataRegistry::parser()->forMethod($test::class, $test->name())->isWithoutErrorHandler()->isNotEmpty()) { - return false; - } - - return true; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/TestSize/Known.php b/vendor/phpunit/phpunit/src/Framework/TestSize/Known.php deleted file mode 100644 index ea8cb29..0000000 --- a/vendor/phpunit/phpunit/src/Framework/TestSize/Known.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\TestSize; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -abstract class Known extends TestSize -{ - /** - * @psalm-assert-if-true Known $this - */ - public function isKnown(): bool - { - return true; - } - - abstract public function isGreaterThan(self $other): bool; -} diff --git a/vendor/phpunit/phpunit/src/Framework/TestSize/Large.php b/vendor/phpunit/phpunit/src/Framework/TestSize/Large.php deleted file mode 100644 index 833dbc0..0000000 --- a/vendor/phpunit/phpunit/src/Framework/TestSize/Large.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\TestSize; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class Large extends Known -{ - /** - * @psalm-assert-if-true Large $this - */ - public function isLarge(): bool - { - return true; - } - - public function isGreaterThan(TestSize $other): bool - { - return !$other->isLarge(); - } - - public function asString(): string - { - return 'large'; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/TestSize/Medium.php b/vendor/phpunit/phpunit/src/Framework/TestSize/Medium.php deleted file mode 100644 index dd934be..0000000 --- a/vendor/phpunit/phpunit/src/Framework/TestSize/Medium.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\TestSize; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class Medium extends Known -{ - /** - * @psalm-assert-if-true Medium $this - */ - public function isMedium(): bool - { - return true; - } - - public function isGreaterThan(TestSize $other): bool - { - return $other->isSmall(); - } - - public function asString(): string - { - return 'medium'; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/TestSize/Small.php b/vendor/phpunit/phpunit/src/Framework/TestSize/Small.php deleted file mode 100644 index eb7250d..0000000 --- a/vendor/phpunit/phpunit/src/Framework/TestSize/Small.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\TestSize; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class Small extends Known -{ - /** - * @psalm-assert-if-true Small $this - */ - public function isSmall(): bool - { - return true; - } - - public function isGreaterThan(TestSize $other): bool - { - return false; - } - - public function asString(): string - { - return 'small'; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/TestSize/TestSize.php b/vendor/phpunit/phpunit/src/Framework/TestSize/TestSize.php deleted file mode 100644 index 82b0bb2..0000000 --- a/vendor/phpunit/phpunit/src/Framework/TestSize/TestSize.php +++ /dev/null @@ -1,82 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\TestSize; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -abstract class TestSize -{ - public static function unknown(): self - { - return new Unknown; - } - - public static function small(): self - { - return new Small; - } - - public static function medium(): self - { - return new Medium; - } - - public static function large(): self - { - return new Large; - } - - /** - * @psalm-assert-if-true Known $this - */ - public function isKnown(): bool - { - return false; - } - - /** - * @psalm-assert-if-true Unknown $this - */ - public function isUnknown(): bool - { - return false; - } - - /** - * @psalm-assert-if-true Small $this - */ - public function isSmall(): bool - { - return false; - } - - /** - * @psalm-assert-if-true Medium $this - */ - public function isMedium(): bool - { - return false; - } - - /** - * @psalm-assert-if-true Large $this - */ - public function isLarge(): bool - { - return false; - } - - abstract public function asString(): string; -} diff --git a/vendor/phpunit/phpunit/src/Framework/TestSize/Unknown.php b/vendor/phpunit/phpunit/src/Framework/TestSize/Unknown.php deleted file mode 100644 index 5089f3f..0000000 --- a/vendor/phpunit/phpunit/src/Framework/TestSize/Unknown.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\TestSize; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class Unknown extends TestSize -{ - /** - * @psalm-assert-if-true Unknown $this - */ - public function isUnknown(): bool - { - return true; - } - - public function asString(): string - { - return 'unknown'; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/TestStatus/Deprecation.php b/vendor/phpunit/phpunit/src/Framework/TestStatus/Deprecation.php deleted file mode 100644 index 545f6aa..0000000 --- a/vendor/phpunit/phpunit/src/Framework/TestStatus/Deprecation.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\TestStatus; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Deprecation extends Known -{ - /** - * @psalm-assert-if-true Deprecation $this - */ - public function isDeprecation(): bool - { - return true; - } - - public function asInt(): int - { - return 4; - } - - public function asString(): string - { - return 'deprecation'; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/TestStatus/Error.php b/vendor/phpunit/phpunit/src/Framework/TestStatus/Error.php deleted file mode 100644 index 8dedfdf..0000000 --- a/vendor/phpunit/phpunit/src/Framework/TestStatus/Error.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\TestStatus; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Error extends Known -{ - /** - * @psalm-assert-if-true Error $this - */ - public function isError(): bool - { - return true; - } - - public function asInt(): int - { - return 8; - } - - public function asString(): string - { - return 'error'; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/TestStatus/Failure.php b/vendor/phpunit/phpunit/src/Framework/TestStatus/Failure.php deleted file mode 100644 index 2568445..0000000 --- a/vendor/phpunit/phpunit/src/Framework/TestStatus/Failure.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\TestStatus; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Failure extends Known -{ - /** - * @psalm-assert-if-true Failure $this - */ - public function isFailure(): bool - { - return true; - } - - public function asInt(): int - { - return 7; - } - - public function asString(): string - { - return 'failure'; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/TestStatus/Incomplete.php b/vendor/phpunit/phpunit/src/Framework/TestStatus/Incomplete.php deleted file mode 100644 index 6b81dce..0000000 --- a/vendor/phpunit/phpunit/src/Framework/TestStatus/Incomplete.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\TestStatus; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Incomplete extends Known -{ - /** - * @psalm-assert-if-true Incomplete $this - */ - public function isIncomplete(): bool - { - return true; - } - - public function asInt(): int - { - return 2; - } - - public function asString(): string - { - return 'incomplete'; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/TestStatus/Known.php b/vendor/phpunit/phpunit/src/Framework/TestStatus/Known.php deleted file mode 100644 index 30838d3..0000000 --- a/vendor/phpunit/phpunit/src/Framework/TestStatus/Known.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\TestStatus; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -abstract class Known extends TestStatus -{ - /** - * @psalm-assert-if-true Known $this - */ - public function isKnown(): bool - { - return true; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/TestStatus/Notice.php b/vendor/phpunit/phpunit/src/Framework/TestStatus/Notice.php deleted file mode 100644 index 322db6f..0000000 --- a/vendor/phpunit/phpunit/src/Framework/TestStatus/Notice.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\TestStatus; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Notice extends Known -{ - /** - * @psalm-assert-if-true Notice $this - */ - public function isNotice(): bool - { - return true; - } - - public function asInt(): int - { - return 3; - } - - public function asString(): string - { - return 'notice'; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/TestStatus/Risky.php b/vendor/phpunit/phpunit/src/Framework/TestStatus/Risky.php deleted file mode 100644 index 7e7db70..0000000 --- a/vendor/phpunit/phpunit/src/Framework/TestStatus/Risky.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\TestStatus; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Risky extends Known -{ - /** - * @psalm-assert-if-true Risky $this - */ - public function isRisky(): bool - { - return true; - } - - public function asInt(): int - { - return 5; - } - - public function asString(): string - { - return 'risky'; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/TestStatus/Skipped.php b/vendor/phpunit/phpunit/src/Framework/TestStatus/Skipped.php deleted file mode 100644 index 345aae9..0000000 --- a/vendor/phpunit/phpunit/src/Framework/TestStatus/Skipped.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\TestStatus; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Skipped extends Known -{ - /** - * @psalm-assert-if-true Skipped $this - */ - public function isSkipped(): bool - { - return true; - } - - public function asInt(): int - { - return 1; - } - - public function asString(): string - { - return 'skipped'; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/TestStatus/Success.php b/vendor/phpunit/phpunit/src/Framework/TestStatus/Success.php deleted file mode 100644 index 973fbdf..0000000 --- a/vendor/phpunit/phpunit/src/Framework/TestStatus/Success.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\TestStatus; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Success extends Known -{ - /** - * @psalm-assert-if-true Success $this - */ - public function isSuccess(): bool - { - return true; - } - - public function asInt(): int - { - return 0; - } - - public function asString(): string - { - return 'success'; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/TestStatus/TestStatus.php b/vendor/phpunit/phpunit/src/Framework/TestStatus/TestStatus.php deleted file mode 100644 index 4448408..0000000 --- a/vendor/phpunit/phpunit/src/Framework/TestStatus/TestStatus.php +++ /dev/null @@ -1,195 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\TestStatus; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -abstract class TestStatus -{ - private readonly string $message; - - public static function from(int $status): self - { - return match ($status) { - 0 => self::success(), - 1 => self::skipped(), - 2 => self::incomplete(), - 3 => self::notice(), - 4 => self::deprecation(), - 5 => self::risky(), - 6 => self::warning(), - 7 => self::failure(), - 8 => self::error(), - default => self::unknown(), - }; - } - - public static function unknown(): self - { - return new Unknown; - } - - public static function success(): self - { - return new Success; - } - - public static function skipped(string $message = ''): self - { - return new Skipped($message); - } - - public static function incomplete(string $message = ''): self - { - return new Incomplete($message); - } - - public static function notice(string $message = ''): self - { - return new Notice($message); - } - - public static function deprecation(string $message = ''): self - { - return new Deprecation($message); - } - - public static function failure(string $message = ''): self - { - return new Failure($message); - } - - public static function error(string $message = ''): self - { - return new Error($message); - } - - public static function warning(string $message = ''): self - { - return new Warning($message); - } - - public static function risky(string $message = ''): self - { - return new Risky($message); - } - - private function __construct(string $message = '') - { - $this->message = $message; - } - - /** - * @psalm-assert-if-true Known $this - */ - public function isKnown(): bool - { - return false; - } - - /** - * @psalm-assert-if-true Unknown $this - */ - public function isUnknown(): bool - { - return false; - } - - /** - * @psalm-assert-if-true Success $this - */ - public function isSuccess(): bool - { - return false; - } - - /** - * @psalm-assert-if-true Skipped $this - */ - public function isSkipped(): bool - { - return false; - } - - /** - * @psalm-assert-if-true Incomplete $this - */ - public function isIncomplete(): bool - { - return false; - } - - /** - * @psalm-assert-if-true Notice $this - */ - public function isNotice(): bool - { - return false; - } - - /** - * @psalm-assert-if-true Deprecation $this - */ - public function isDeprecation(): bool - { - return false; - } - - /** - * @psalm-assert-if-true Failure $this - */ - public function isFailure(): bool - { - return false; - } - - /** - * @psalm-assert-if-true Error $this - */ - public function isError(): bool - { - return false; - } - - /** - * @psalm-assert-if-true Warning $this - */ - public function isWarning(): bool - { - return false; - } - - /** - * @psalm-assert-if-true Risky $this - */ - public function isRisky(): bool - { - return false; - } - - public function message(): string - { - return $this->message; - } - - public function isMoreImportantThan(self $other): bool - { - return $this->asInt() > $other->asInt(); - } - - abstract public function asInt(): int; - - abstract public function asString(): string; -} diff --git a/vendor/phpunit/phpunit/src/Framework/TestStatus/Unknown.php b/vendor/phpunit/phpunit/src/Framework/TestStatus/Unknown.php deleted file mode 100644 index 7a39163..0000000 --- a/vendor/phpunit/phpunit/src/Framework/TestStatus/Unknown.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\TestStatus; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Unknown extends TestStatus -{ - /** - * @psalm-assert-if-true Unknown $this - */ - public function isUnknown(): bool - { - return true; - } - - public function asInt(): int - { - return -1; - } - - public function asString(): string - { - return 'unknown'; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/TestStatus/Warning.php b/vendor/phpunit/phpunit/src/Framework/TestStatus/Warning.php deleted file mode 100644 index ebb05b0..0000000 --- a/vendor/phpunit/phpunit/src/Framework/TestStatus/Warning.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\TestStatus; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Warning extends Known -{ - /** - * @psalm-assert-if-true Warning $this - */ - public function isWarning(): bool - { - return true; - } - - public function asInt(): int - { - return 6; - } - - public function asString(): string - { - return 'warning'; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/TestSuite.php b/vendor/phpunit/phpunit/src/Framework/TestSuite.php deleted file mode 100644 index 6c84242..0000000 --- a/vendor/phpunit/phpunit/src/Framework/TestSuite.php +++ /dev/null @@ -1,726 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -use const PHP_EOL; -use function array_keys; -use function array_map; -use function array_pop; -use function array_reverse; -use function assert; -use function call_user_func; -use function class_exists; -use function count; -use function implode; -use function is_callable; -use function is_file; -use function is_subclass_of; -use function sprintf; -use function str_ends_with; -use function str_starts_with; -use function trim; -use Iterator; -use IteratorAggregate; -use PHPUnit\Event; -use PHPUnit\Event\Code\TestMethod; -use PHPUnit\Event\NoPreviousThrowableException; -use PHPUnit\Metadata\Api\Dependencies; -use PHPUnit\Metadata\Api\Groups; -use PHPUnit\Metadata\Api\HookMethods; -use PHPUnit\Metadata\Api\Requirements; -use PHPUnit\Metadata\MetadataCollection; -use PHPUnit\Runner\Exception as RunnerException; -use PHPUnit\Runner\Filter\Factory; -use PHPUnit\Runner\PhptTestCase; -use PHPUnit\Runner\TestSuiteLoader; -use PHPUnit\TestRunner\TestResult\Facade as TestResultFacade; -use PHPUnit\Util\Filter; -use PHPUnit\Util\Reflection; -use PHPUnit\Util\Test as TestUtil; -use ReflectionClass; -use ReflectionMethod; -use SebastianBergmann\CodeCoverage\InvalidArgumentException; -use SebastianBergmann\CodeCoverage\UnintentionallyCoveredCodeException; -use Throwable; - -/** - * @template-implements IteratorAggregate - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -class TestSuite implements IteratorAggregate, Reorderable, SelfDescribing, Test -{ - /** - * @psalm-var non-empty-string - */ - private string $name; - - /** - * @psalm-var array> - */ - private array $groups = []; - - /** - * @psalm-var ?list - */ - private ?array $requiredTests = null; - - /** - * @psalm-var list - */ - private array $tests = []; - - /** - * @psalm-var ?list - */ - private ?array $providedTests = null; - private ?Factory $iteratorFilter = null; - private bool $wasRun = false; - - /** - * @psalm-param non-empty-string $name - */ - public static function empty(string $name): static - { - return new static($name); - } - - /** - * @psalm-param class-string $className - */ - public static function fromClassName(string $className): static - { - assert(class_exists($className)); - - $class = new ReflectionClass($className); - - return static::fromClassReflector($class); - } - - public static function fromClassReflector(ReflectionClass $class): static - { - $testSuite = new static($class->getName()); - - $constructor = $class->getConstructor(); - - if ($constructor !== null && !$constructor->isPublic()) { - Event\Facade::emitter()->testRunnerTriggeredPhpunitWarning( - sprintf( - 'Class "%s" has no public constructor.', - $class->getName(), - ), - ); - - return $testSuite; - } - - foreach (Reflection::publicMethodsInTestClass($class) as $method) { - if ($method->getDeclaringClass()->getName() === Assert::class) { - continue; - } - - if ($method->getDeclaringClass()->getName() === TestCase::class) { - continue; - } - - if (!TestUtil::isTestMethod($method)) { - continue; - } - - $testSuite->addTestMethod($class, $method); - } - - if ($testSuite->isEmpty()) { - Event\Facade::emitter()->testRunnerTriggeredPhpunitWarning( - sprintf( - 'No tests found in class "%s".', - $class->getName(), - ), - ); - } - - return $testSuite; - } - - /** - * @psalm-param non-empty-string $name - */ - final private function __construct(string $name) - { - $this->name = $name; - } - - /** - * Returns a string representation of the test suite. - */ - public function toString(): string - { - return $this->name(); - } - - /** - * Adds a test to the suite. - */ - public function addTest(Test $test, array $groups = []): void - { - $class = new ReflectionClass($test); - - if ($class->isAbstract()) { - return; - } - - $this->tests[] = $test; - $this->clearCaches(); - - if ($test instanceof self && empty($groups)) { - $groups = $test->groups(); - } - - if ($this->containsOnlyVirtualGroups($groups)) { - $groups[] = 'default'; - } - - foreach ($groups as $group) { - if (!isset($this->groups[$group])) { - $this->groups[$group] = [$test]; - } else { - $this->groups[$group][] = $test; - } - } - - if ($test instanceof TestCase) { - $test->setGroups($groups); - } - } - - /** - * Adds the tests from the given class to the suite. - * - * @throws Exception - */ - public function addTestSuite(ReflectionClass $testClass): void - { - if ($testClass->isAbstract()) { - throw new Exception( - sprintf( - 'Class %s is abstract', - $testClass->getName(), - ), - ); - } - - if (!$testClass->isSubclassOf(TestCase::class)) { - throw new Exception( - sprintf( - 'Class %s is not a subclass of %s', - $testClass->getName(), - TestCase::class, - ), - ); - } - - $this->addTest(self::fromClassReflector($testClass)); - } - - /** - * Wraps both addTest() and addTestSuite - * as well as the separate import statements for the user's convenience. - * - * If the named file cannot be read or there are no new tests that can be - * added, a PHPUnit\Framework\WarningTestCase will be created instead, - * leaving the current test run untouched. - * - * @throws Exception - */ - public function addTestFile(string $filename): void - { - try { - if (str_ends_with($filename, '.phpt') && is_file($filename)) { - $this->addTest(new PhptTestCase($filename)); - } else { - $this->addTestSuite( - (new TestSuiteLoader)->load($filename), - ); - } - } catch (RunnerException $e) { - Event\Facade::emitter()->testRunnerTriggeredPhpunitWarning( - $e->getMessage(), - ); - } - } - - /** - * Wrapper for addTestFile() that adds multiple test files. - * - * @throws Exception - */ - public function addTestFiles(iterable $fileNames): void - { - foreach ($fileNames as $filename) { - $this->addTestFile((string) $filename); - } - } - - /** - * Counts the number of test cases that will be run by this test. - */ - public function count(): int - { - $numTests = 0; - - foreach ($this as $test) { - $numTests += count($test); - } - - return $numTests; - } - - public function isEmpty(): bool - { - foreach ($this as $test) { - if (count($test) !== 0) { - return false; - } - } - - return true; - } - - /** - * @psalm-return non-empty-string - */ - public function name(): string - { - return $this->name; - } - - /** - * Returns the test groups of the suite. - * - * @psalm-return list - */ - public function groups(): array - { - return array_map( - 'strval', - array_keys($this->groups), - ); - } - - public function groupDetails(): array - { - return $this->groups; - } - - /** - * @throws CodeCoverageException - * @throws Event\RuntimeException - * @throws Exception - * @throws InvalidArgumentException - * @throws NoPreviousThrowableException - * @throws UnintentionallyCoveredCodeException - */ - public function run(): void - { - if ($this->wasRun) { - // @codeCoverageIgnoreStart - throw new Exception('The tests aggregated by this TestSuite were already run'); - // @codeCoverageIgnoreEnd - } - - $this->wasRun = true; - - if ($this->isEmpty()) { - return; - } - - $emitter = Event\Facade::emitter(); - $testSuiteValueObjectForEvents = Event\TestSuite\TestSuiteBuilder::from($this); - - $emitter->testSuiteStarted($testSuiteValueObjectForEvents); - - if (!$this->invokeMethodsBeforeFirstTest($emitter, $testSuiteValueObjectForEvents)) { - return; - } - - /** @psalm-var list $tests */ - $tests = []; - - foreach ($this as $test) { - $tests[] = $test; - } - - $tests = array_reverse($tests); - - $this->tests = []; - $this->groups = []; - - while (($test = array_pop($tests)) !== null) { - if (TestResultFacade::shouldStop()) { - $emitter->testRunnerExecutionAborted(); - - break; - } - - $test->run(); - } - - $this->invokeMethodsAfterLastTest($emitter); - - $emitter->testSuiteFinished($testSuiteValueObjectForEvents); - } - - /** - * Returns the tests as an enumeration. - * - * @psalm-return list - */ - public function tests(): array - { - return $this->tests; - } - - /** - * Set tests of the test suite. - * - * @psalm-param list $tests - */ - public function setTests(array $tests): void - { - $this->tests = $tests; - } - - /** - * Mark the test suite as skipped. - * - * @throws SkippedTestSuiteError - */ - public function markTestSuiteSkipped(string $message = ''): never - { - throw new SkippedTestSuiteError($message); - } - - /** - * Returns an iterator for this test suite. - */ - public function getIterator(): Iterator - { - $iterator = new TestSuiteIterator($this); - - if ($this->iteratorFilter !== null) { - $iterator = $this->iteratorFilter->factory($iterator, $this); - } - - return $iterator; - } - - public function injectFilter(Factory $filter): void - { - $this->iteratorFilter = $filter; - - foreach ($this as $test) { - if ($test instanceof self) { - $test->injectFilter($filter); - } - } - } - - /** - * @psalm-return list - */ - public function provides(): array - { - if ($this->providedTests === null) { - $this->providedTests = []; - - if (is_callable($this->sortId(), true)) { - $this->providedTests[] = new ExecutionOrderDependency($this->sortId()); - } - - foreach ($this->tests as $test) { - if (!($test instanceof Reorderable)) { - continue; - } - - $this->providedTests = ExecutionOrderDependency::mergeUnique($this->providedTests, $test->provides()); - } - } - - return $this->providedTests; - } - - /** - * @psalm-return list - */ - public function requires(): array - { - if ($this->requiredTests === null) { - $this->requiredTests = []; - - foreach ($this->tests as $test) { - if (!($test instanceof Reorderable)) { - continue; - } - - $this->requiredTests = ExecutionOrderDependency::mergeUnique( - ExecutionOrderDependency::filterInvalid($this->requiredTests), - $test->requires(), - ); - } - - $this->requiredTests = ExecutionOrderDependency::diff($this->requiredTests, $this->provides()); - } - - return $this->requiredTests; - } - - public function sortId(): string - { - return $this->name() . '::class'; - } - - /** - * @psalm-assert-if-true class-string $this->name - */ - public function isForTestClass(): bool - { - return class_exists($this->name, false) && is_subclass_of($this->name, TestCase::class); - } - - /** - * @throws Event\TestData\MoreThanOneDataSetFromDataProviderException - * @throws Exception - */ - protected function addTestMethod(ReflectionClass $class, ReflectionMethod $method): void - { - $className = $class->getName(); - $methodName = $method->getName(); - - assert(!empty($methodName)); - - try { - $test = (new TestBuilder)->build($class, $methodName); - } catch (InvalidDataProviderException $e) { - Event\Facade::emitter()->testTriggeredPhpunitError( - new TestMethod( - $className, - $methodName, - $class->getFileName(), - $method->getStartLine(), - Event\Code\TestDoxBuilder::fromClassNameAndMethodName( - $className, - $methodName, - ), - MetadataCollection::fromArray([]), - Event\TestData\TestDataCollection::fromArray([]), - ), - sprintf( - "The data provider specified for %s::%s is invalid\n%s", - $className, - $methodName, - $this->throwableToString($e), - ), - ); - - return; - } - - if ($test instanceof TestCase || $test instanceof DataProviderTestSuite) { - $test->setDependencies( - Dependencies::dependencies($class->getName(), $methodName), - ); - } - - $this->addTest( - $test, - (new Groups)->groups($class->getName(), $methodName), - ); - } - - private function clearCaches(): void - { - $this->providedTests = null; - $this->requiredTests = null; - } - - private function containsOnlyVirtualGroups(array $groups): bool - { - foreach ($groups as $group) { - if (!str_starts_with($group, '__phpunit_')) { - return false; - } - } - - return true; - } - - private function methodDoesNotExistOrIsDeclaredInTestCase(string $methodName): bool - { - $reflector = new ReflectionClass($this->name); - - return !$reflector->hasMethod($methodName) || - $reflector->getMethod($methodName)->getDeclaringClass()->getName() === TestCase::class; - } - - /** - * @throws Exception - */ - private function throwableToString(Throwable $t): string - { - $message = $t->getMessage(); - - if (empty(trim($message))) { - $message = ''; - } - - if ($t instanceof InvalidDataProviderException) { - return sprintf( - "%s\n%s", - $message, - Filter::getFilteredStacktrace($t), - ); - } - - return sprintf( - "%s: %s\n%s", - $t::class, - $message, - Filter::getFilteredStacktrace($t), - ); - } - - /** - * @throws Exception - * @throws NoPreviousThrowableException - */ - private function invokeMethodsBeforeFirstTest(Event\Emitter $emitter, Event\TestSuite\TestSuite $testSuiteValueObjectForEvents): bool - { - if (!$this->isForTestClass()) { - return true; - } - - $methods = (new HookMethods)->hookMethods($this->name)['beforeClass']; - $calledMethods = []; - $emitCalledEvent = true; - $result = true; - - foreach ($methods as $method) { - if ($this->methodDoesNotExistOrIsDeclaredInTestCase($method)) { - continue; - } - - $calledMethod = new Event\Code\ClassMethod( - $this->name, - $method, - ); - - try { - $missingRequirements = (new Requirements)->requirementsNotSatisfiedFor($this->name, $method); - - if ($missingRequirements !== []) { - $emitCalledEvent = false; - - $this->markTestSuiteSkipped(implode(PHP_EOL, $missingRequirements)); - } - - call_user_func([$this->name, $method]); - } catch (Throwable $t) { - } - - /** @psalm-suppress RedundantCondition */ - if ($emitCalledEvent) { - $emitter->beforeFirstTestMethodCalled( - $this->name, - $calledMethod, - ); - - $calledMethods[] = $calledMethod; - } - - if (isset($t) && $t instanceof SkippedTest) { - $emitter->testSuiteSkipped( - $testSuiteValueObjectForEvents, - $t->getMessage(), - ); - - return false; - } - - if (isset($t)) { - $emitter->beforeFirstTestMethodErrored( - $this->name, - $calledMethod, - Event\Code\ThrowableBuilder::from($t), - ); - - $result = false; - } - } - - if (!empty($calledMethods)) { - $emitter->beforeFirstTestMethodFinished( - $this->name, - ...$calledMethods, - ); - } - - return $result; - } - - private function invokeMethodsAfterLastTest(Event\Emitter $emitter): void - { - if (!$this->isForTestClass()) { - return; - } - - $methods = (new HookMethods)->hookMethods($this->name)['afterClass']; - $calledMethods = []; - - foreach ($methods as $method) { - if ($this->methodDoesNotExistOrIsDeclaredInTestCase($method)) { - continue; - } - - $calledMethod = new Event\Code\ClassMethod( - $this->name, - $method, - ); - - try { - call_user_func([$this->name, $method]); - } catch (Throwable $t) { - } - - $emitter->afterLastTestMethodCalled( - $this->name, - $calledMethod, - ); - - $calledMethods[] = $calledMethod; - - if (isset($t)) { - $emitter->afterLastTestMethodErrored( - $this->name, - $calledMethod, - Event\Code\ThrowableBuilder::from($t), - ); - } - } - - if (!empty($calledMethods)) { - $emitter->afterLastTestMethodFinished( - $this->name, - ...$calledMethods, - ); - } - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/TestSuiteIterator.php b/vendor/phpunit/phpunit/src/Framework/TestSuiteIterator.php deleted file mode 100644 index 8af0121..0000000 --- a/vendor/phpunit/phpunit/src/Framework/TestSuiteIterator.php +++ /dev/null @@ -1,84 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -use function assert; -use function count; -use RecursiveIterator; - -/** - * @template-implements RecursiveIterator - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestSuiteIterator implements RecursiveIterator -{ - private int $position = 0; - - /** - * @psalm-var list - */ - private readonly array $tests; - - public function __construct(TestSuite $testSuite) - { - $this->tests = $testSuite->tests(); - } - - public function rewind(): void - { - $this->position = 0; - } - - public function valid(): bool - { - return $this->position < count($this->tests); - } - - public function key(): int - { - return $this->position; - } - - public function current(): Test - { - return $this->tests[$this->position]; - } - - public function next(): void - { - $this->position++; - } - - /** - * @throws NoChildTestSuiteException - */ - public function getChildren(): self - { - if (!$this->hasChildren()) { - throw new NoChildTestSuiteException( - 'The current item is not a TestSuite instance and therefore does not have any children.', - ); - } - - $current = $this->current(); - - assert($current instanceof TestSuite); - - return new self($current); - } - - public function hasChildren(): bool - { - return $this->valid() && $this->current() instanceof TestSuite; - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/EventLogger.php b/vendor/phpunit/phpunit/src/Logging/EventLogger.php deleted file mode 100644 index 0835021..0000000 --- a/vendor/phpunit/phpunit/src/Logging/EventLogger.php +++ /dev/null @@ -1,68 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging; - -use const FILE_APPEND; -use const LOCK_EX; -use const PHP_EOL; -use const PHP_OS_FAMILY; -use function file_put_contents; -use function implode; -use function preg_split; -use function str_repeat; -use function strlen; -use PHPUnit\Event\Event; -use PHPUnit\Event\Tracer\Tracer; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class EventLogger implements Tracer -{ - private readonly string $path; - private readonly bool $includeTelemetryInfo; - - public function __construct(string $path, bool $includeTelemetryInfo) - { - $this->path = $path; - $this->includeTelemetryInfo = $includeTelemetryInfo; - } - - public function trace(Event $event): void - { - $telemetryInfo = $this->telemetryInfo($event); - $indentation = PHP_EOL . str_repeat(' ', strlen($telemetryInfo)); - $lines = preg_split('/\r\n|\r|\n/', $event->asString()); - - $flags = FILE_APPEND; - - if (!(PHP_OS_FAMILY === 'Windows' || PHP_OS_FAMILY === 'Darwin') || - $this->path !== 'php://stdout') { - $flags |= LOCK_EX; - } - - file_put_contents( - $this->path, - $telemetryInfo . implode($indentation, $lines) . PHP_EOL, - $flags, - ); - } - - private function telemetryInfo(Event $event): string - { - if (!$this->includeTelemetryInfo) { - return ''; - } - - return $event->telemetryInfo()->asString() . ' '; - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/JUnit/JunitXmlLogger.php b/vendor/phpunit/phpunit/src/Logging/JUnit/JunitXmlLogger.php deleted file mode 100644 index 8bd9ffe..0000000 --- a/vendor/phpunit/phpunit/src/Logging/JUnit/JunitXmlLogger.php +++ /dev/null @@ -1,464 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\JUnit; - -use const PHP_EOL; -use function assert; -use function basename; -use function is_int; -use function sprintf; -use function str_replace; -use function trim; -use DOMDocument; -use DOMElement; -use PHPUnit\Event\Code\Test; -use PHPUnit\Event\Code\TestMethod; -use PHPUnit\Event\EventFacadeIsSealedException; -use PHPUnit\Event\Facade; -use PHPUnit\Event\InvalidArgumentException; -use PHPUnit\Event\Telemetry\HRTime; -use PHPUnit\Event\Telemetry\Info; -use PHPUnit\Event\Test\Errored; -use PHPUnit\Event\Test\Failed; -use PHPUnit\Event\Test\Finished; -use PHPUnit\Event\Test\MarkedIncomplete; -use PHPUnit\Event\Test\PreparationStarted; -use PHPUnit\Event\Test\Prepared; -use PHPUnit\Event\Test\PrintedUnexpectedOutput; -use PHPUnit\Event\Test\Skipped; -use PHPUnit\Event\TestSuite\Started; -use PHPUnit\Event\UnknownSubscriberTypeException; -use PHPUnit\TextUI\Output\Printer; -use PHPUnit\Util\Xml; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class JunitXmlLogger -{ - private readonly Printer $printer; - private DOMDocument $document; - private DOMElement $root; - - /** - * @var DOMElement[] - */ - private array $testSuites = []; - - /** - * @psalm-var array - */ - private array $testSuiteTests = [0]; - - /** - * @psalm-var array - */ - private array $testSuiteAssertions = [0]; - - /** - * @psalm-var array - */ - private array $testSuiteErrors = [0]; - - /** - * @psalm-var array - */ - private array $testSuiteFailures = [0]; - - /** - * @psalm-var array - */ - private array $testSuiteSkipped = [0]; - - /** - * @psalm-var array - */ - private array $testSuiteTimes = [0]; - private int $testSuiteLevel = 0; - private ?DOMElement $currentTestCase = null; - private ?HRTime $time = null; - private bool $prepared = false; - private bool $preparationFailed = false; - private ?string $unexpectedOutput = null; - - /** - * @throws EventFacadeIsSealedException - * @throws UnknownSubscriberTypeException - */ - public function __construct(Printer $printer, Facade $facade) - { - $this->printer = $printer; - - $this->registerSubscribers($facade); - $this->createDocument(); - } - - public function flush(): void - { - $this->printer->print($this->document->saveXML()); - - $this->printer->flush(); - } - - public function testSuiteStarted(Started $event): void - { - $testSuite = $this->document->createElement('testsuite'); - $testSuite->setAttribute('name', $event->testSuite()->name()); - - if ($event->testSuite()->isForTestClass()) { - $testSuite->setAttribute('file', $event->testSuite()->file()); - } - - if ($this->testSuiteLevel > 0) { - $this->testSuites[$this->testSuiteLevel]->appendChild($testSuite); - } else { - $this->root->appendChild($testSuite); - } - - $this->testSuiteLevel++; - $this->testSuites[$this->testSuiteLevel] = $testSuite; - $this->testSuiteTests[$this->testSuiteLevel] = 0; - $this->testSuiteAssertions[$this->testSuiteLevel] = 0; - $this->testSuiteErrors[$this->testSuiteLevel] = 0; - $this->testSuiteFailures[$this->testSuiteLevel] = 0; - $this->testSuiteSkipped[$this->testSuiteLevel] = 0; - $this->testSuiteTimes[$this->testSuiteLevel] = 0; - } - - public function testSuiteFinished(): void - { - $this->testSuites[$this->testSuiteLevel]->setAttribute( - 'tests', - (string) $this->testSuiteTests[$this->testSuiteLevel], - ); - - $this->testSuites[$this->testSuiteLevel]->setAttribute( - 'assertions', - (string) $this->testSuiteAssertions[$this->testSuiteLevel], - ); - - $this->testSuites[$this->testSuiteLevel]->setAttribute( - 'errors', - (string) $this->testSuiteErrors[$this->testSuiteLevel], - ); - - $this->testSuites[$this->testSuiteLevel]->setAttribute( - 'failures', - (string) $this->testSuiteFailures[$this->testSuiteLevel], - ); - - $this->testSuites[$this->testSuiteLevel]->setAttribute( - 'skipped', - (string) $this->testSuiteSkipped[$this->testSuiteLevel], - ); - - $this->testSuites[$this->testSuiteLevel]->setAttribute( - 'time', - sprintf('%F', $this->testSuiteTimes[$this->testSuiteLevel]), - ); - - if ($this->testSuiteLevel > 1) { - $this->testSuiteTests[$this->testSuiteLevel - 1] += $this->testSuiteTests[$this->testSuiteLevel]; - $this->testSuiteAssertions[$this->testSuiteLevel - 1] += $this->testSuiteAssertions[$this->testSuiteLevel]; - $this->testSuiteErrors[$this->testSuiteLevel - 1] += $this->testSuiteErrors[$this->testSuiteLevel]; - $this->testSuiteFailures[$this->testSuiteLevel - 1] += $this->testSuiteFailures[$this->testSuiteLevel]; - $this->testSuiteSkipped[$this->testSuiteLevel - 1] += $this->testSuiteSkipped[$this->testSuiteLevel]; - $this->testSuiteTimes[$this->testSuiteLevel - 1] += $this->testSuiteTimes[$this->testSuiteLevel]; - } - - $this->testSuiteLevel--; - } - - /** - * @throws InvalidArgumentException - */ - public function testPreparationStarted(PreparationStarted $event): void - { - $this->createTestCase($event); - } - - /** - * @throws InvalidArgumentException - */ - public function testPreparationFailed(): void - { - $this->preparationFailed = true; - } - - /** - * @throws InvalidArgumentException - */ - public function testPrepared(): void - { - $this->prepared = true; - } - - public function testPrintedUnexpectedOutput(PrintedUnexpectedOutput $event): void - { - $this->unexpectedOutput = $event->output(); - } - - /** - * @throws InvalidArgumentException - */ - public function testFinished(Finished $event): void - { - if (!$this->prepared || $this->preparationFailed) { - return; - } - - $this->handleFinish($event->telemetryInfo(), $event->numberOfAssertionsPerformed()); - } - - /** - * @throws InvalidArgumentException - */ - public function testMarkedIncomplete(MarkedIncomplete $event): void - { - $this->handleIncompleteOrSkipped($event); - } - - /** - * @throws InvalidArgumentException - */ - public function testSkipped(Skipped $event): void - { - $this->handleIncompleteOrSkipped($event); - } - - /** - * @throws InvalidArgumentException - */ - public function testErrored(Errored $event): void - { - $this->handleFault($event, 'error'); - - $this->testSuiteErrors[$this->testSuiteLevel]++; - } - - /** - * @throws InvalidArgumentException - */ - public function testFailed(Failed $event): void - { - $this->handleFault($event, 'failure'); - - $this->testSuiteFailures[$this->testSuiteLevel]++; - } - - /** - * @throws InvalidArgumentException - */ - private function handleFinish(Info $telemetryInfo, int $numberOfAssertionsPerformed): void - { - assert($this->currentTestCase !== null); - assert($this->time !== null); - - $time = $telemetryInfo->time()->duration($this->time)->asFloat(); - - $this->testSuiteAssertions[$this->testSuiteLevel] += $numberOfAssertionsPerformed; - - $this->currentTestCase->setAttribute( - 'assertions', - (string) $numberOfAssertionsPerformed, - ); - - $this->currentTestCase->setAttribute( - 'time', - sprintf('%F', $time), - ); - - if ($this->unexpectedOutput !== null) { - $systemOut = $this->document->createElement( - 'system-out', - Xml::prepareString($this->unexpectedOutput), - ); - - $this->currentTestCase->appendChild($systemOut); - } - - $this->testSuites[$this->testSuiteLevel]->appendChild( - $this->currentTestCase, - ); - - $this->testSuiteTests[$this->testSuiteLevel]++; - $this->testSuiteTimes[$this->testSuiteLevel] += $time; - - $this->currentTestCase = null; - $this->time = null; - $this->prepared = false; - $this->unexpectedOutput = null; - } - - /** - * @throws EventFacadeIsSealedException - * @throws UnknownSubscriberTypeException - */ - private function registerSubscribers(Facade $facade): void - { - $facade->registerSubscribers( - new TestSuiteStartedSubscriber($this), - new TestSuiteFinishedSubscriber($this), - new TestPreparationStartedSubscriber($this), - new TestPreparationFailedSubscriber($this), - new TestPreparedSubscriber($this), - new TestPrintedUnexpectedOutputSubscriber($this), - new TestFinishedSubscriber($this), - new TestErroredSubscriber($this), - new TestFailedSubscriber($this), - new TestMarkedIncompleteSubscriber($this), - new TestSkippedSubscriber($this), - new TestRunnerExecutionFinishedSubscriber($this), - ); - } - - private function createDocument(): void - { - $this->document = new DOMDocument('1.0', 'UTF-8'); - $this->document->formatOutput = true; - - $this->root = $this->document->createElement('testsuites'); - $this->document->appendChild($this->root); - } - - /** - * @throws InvalidArgumentException - */ - private function handleFault(Errored|Failed $event, string $type): void - { - if (!$this->prepared) { - $this->createTestCase($event); - } - - assert($this->currentTestCase !== null); - - $buffer = $this->testAsString($event->test()); - - $throwable = $event->throwable(); - $buffer .= trim( - $throwable->description() . PHP_EOL . - $throwable->stackTrace(), - ); - - $fault = $this->document->createElement( - $type, - Xml::prepareString($buffer), - ); - - $fault->setAttribute('type', $throwable->className()); - - $this->currentTestCase->appendChild($fault); - - if (!$this->prepared) { - $this->handleFinish($event->telemetryInfo(), 0); - } - } - - /** - * @throws InvalidArgumentException - */ - private function handleIncompleteOrSkipped(MarkedIncomplete|Skipped $event): void - { - if (!$this->prepared) { - $this->createTestCase($event); - } - - assert($this->currentTestCase !== null); - - $skipped = $this->document->createElement('skipped'); - - $this->currentTestCase->appendChild($skipped); - - $this->testSuiteSkipped[$this->testSuiteLevel]++; - - if (!$this->prepared) { - $this->handleFinish($event->telemetryInfo(), 0); - } - } - - /** - * @throws InvalidArgumentException - */ - private function testAsString(Test $test): string - { - if ($test->isPhpt()) { - return basename($test->file()); - } - - assert($test instanceof TestMethod); - - return sprintf( - '%s::%s%s', - $test->className(), - $this->name($test), - PHP_EOL, - ); - } - - /** - * @throws InvalidArgumentException - */ - private function name(Test $test): string - { - if ($test->isPhpt()) { - return basename($test->file()); - } - - assert($test instanceof TestMethod); - - if (!$test->testData()->hasDataFromDataProvider()) { - return $test->methodName(); - } - - $dataSetName = $test->testData()->dataFromDataProvider()->dataSetName(); - - if (is_int($dataSetName)) { - return sprintf( - '%s with data set #%d', - $test->methodName(), - $dataSetName, - ); - } - - return sprintf( - '%s with data set "%s"', - $test->methodName(), - $dataSetName, - ); - } - - /** - * @throws InvalidArgumentException - * - * @psalm-assert !null $this->currentTestCase - */ - private function createTestCase(Errored|Failed|MarkedIncomplete|PreparationStarted|Prepared|Skipped $event): void - { - $testCase = $this->document->createElement('testcase'); - - $test = $event->test(); - - $testCase->setAttribute('name', $this->name($test)); - $testCase->setAttribute('file', $test->file()); - - if ($test->isTestMethod()) { - assert($test instanceof TestMethod); - - $testCase->setAttribute('line', (string) $test->line()); - $testCase->setAttribute('class', $test->className()); - $testCase->setAttribute('classname', str_replace('\\', '.', $test->className())); - } - - $this->currentTestCase = $testCase; - $this->time = $event->telemetryInfo()->time(); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/Subscriber.php b/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/Subscriber.php deleted file mode 100644 index 7067461..0000000 --- a/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/Subscriber.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\JUnit; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -abstract class Subscriber -{ - private readonly JunitXmlLogger $logger; - - public function __construct(JunitXmlLogger $logger) - { - $this->logger = $logger; - } - - protected function logger(): JunitXmlLogger - { - return $this->logger; - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestErroredSubscriber.php b/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestErroredSubscriber.php deleted file mode 100644 index 1c5ca7b..0000000 --- a/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestErroredSubscriber.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\JUnit; - -use PHPUnit\Event\InvalidArgumentException; -use PHPUnit\Event\Test\Errored; -use PHPUnit\Event\Test\ErroredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestErroredSubscriber extends Subscriber implements ErroredSubscriber -{ - /** - * @throws InvalidArgumentException - */ - public function notify(Errored $event): void - { - $this->logger()->testErrored($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestFailedSubscriber.php b/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestFailedSubscriber.php deleted file mode 100644 index 286012a..0000000 --- a/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestFailedSubscriber.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\JUnit; - -use PHPUnit\Event\InvalidArgumentException; -use PHPUnit\Event\Test\Failed; -use PHPUnit\Event\Test\FailedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestFailedSubscriber extends Subscriber implements FailedSubscriber -{ - /** - * @throws InvalidArgumentException - */ - public function notify(Failed $event): void - { - $this->logger()->testFailed($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestFinishedSubscriber.php b/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestFinishedSubscriber.php deleted file mode 100644 index 3f3ecac..0000000 --- a/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestFinishedSubscriber.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\JUnit; - -use PHPUnit\Event\InvalidArgumentException; -use PHPUnit\Event\Test\Finished; -use PHPUnit\Event\Test\FinishedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestFinishedSubscriber extends Subscriber implements FinishedSubscriber -{ - /** - * @throws InvalidArgumentException - */ - public function notify(Finished $event): void - { - $this->logger()->testFinished($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestMarkedIncompleteSubscriber.php b/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestMarkedIncompleteSubscriber.php deleted file mode 100644 index 5354427..0000000 --- a/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestMarkedIncompleteSubscriber.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\JUnit; - -use PHPUnit\Event\InvalidArgumentException; -use PHPUnit\Event\Test\MarkedIncomplete; -use PHPUnit\Event\Test\MarkedIncompleteSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestMarkedIncompleteSubscriber extends Subscriber implements MarkedIncompleteSubscriber -{ - /** - * @throws InvalidArgumentException - */ - public function notify(MarkedIncomplete $event): void - { - $this->logger()->testMarkedIncomplete($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparationFailedSubscriber.php b/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparationFailedSubscriber.php deleted file mode 100644 index d052f8d..0000000 --- a/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparationFailedSubscriber.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\JUnit; - -use PHPUnit\Event\InvalidArgumentException; -use PHPUnit\Event\Test\PreparationFailed; -use PHPUnit\Event\Test\PreparationFailedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestPreparationFailedSubscriber extends Subscriber implements PreparationFailedSubscriber -{ - /** - * @throws InvalidArgumentException - */ - public function notify(PreparationFailed $event): void - { - $this->logger()->testPreparationFailed(); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparationStartedSubscriber.php b/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparationStartedSubscriber.php deleted file mode 100644 index 91ce18f..0000000 --- a/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparationStartedSubscriber.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\JUnit; - -use PHPUnit\Event\InvalidArgumentException; -use PHPUnit\Event\Test\PreparationStarted; -use PHPUnit\Event\Test\PreparationStartedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestPreparationStartedSubscriber extends Subscriber implements PreparationStartedSubscriber -{ - /** - * @throws InvalidArgumentException - */ - public function notify(PreparationStarted $event): void - { - $this->logger()->testPreparationStarted($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparedSubscriber.php b/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparedSubscriber.php deleted file mode 100644 index d3de506..0000000 --- a/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparedSubscriber.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\JUnit; - -use PHPUnit\Event\InvalidArgumentException; -use PHPUnit\Event\Test\Prepared; -use PHPUnit\Event\Test\PreparedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestPreparedSubscriber extends Subscriber implements PreparedSubscriber -{ - /** - * @throws InvalidArgumentException - */ - public function notify(Prepared $event): void - { - $this->logger()->testPrepared(); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPrintedUnexpectedOutputSubscriber.php b/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPrintedUnexpectedOutputSubscriber.php deleted file mode 100644 index fc281c0..0000000 --- a/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPrintedUnexpectedOutputSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\JUnit; - -use PHPUnit\Event\Test\PrintedUnexpectedOutput; -use PHPUnit\Event\Test\PrintedUnexpectedOutputSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestPrintedUnexpectedOutputSubscriber extends Subscriber implements PrintedUnexpectedOutputSubscriber -{ - public function notify(PrintedUnexpectedOutput $event): void - { - $this->logger()->testPrintedUnexpectedOutput($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestRunnerExecutionFinishedSubscriber.php b/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestRunnerExecutionFinishedSubscriber.php deleted file mode 100644 index b544b04..0000000 --- a/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestRunnerExecutionFinishedSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\JUnit; - -use PHPUnit\Event\TestRunner\ExecutionFinished; -use PHPUnit\Event\TestRunner\ExecutionFinishedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestRunnerExecutionFinishedSubscriber extends Subscriber implements ExecutionFinishedSubscriber -{ - public function notify(ExecutionFinished $event): void - { - $this->logger()->flush(); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestSkippedSubscriber.php b/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestSkippedSubscriber.php deleted file mode 100644 index 383b89d..0000000 --- a/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestSkippedSubscriber.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\JUnit; - -use PHPUnit\Event\InvalidArgumentException; -use PHPUnit\Event\Test\Skipped; -use PHPUnit\Event\Test\SkippedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestSkippedSubscriber extends Subscriber implements SkippedSubscriber -{ - /** - * @throws InvalidArgumentException - */ - public function notify(Skipped $event): void - { - $this->logger()->testSkipped($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestSuiteFinishedSubscriber.php b/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestSuiteFinishedSubscriber.php deleted file mode 100644 index 122f4aa..0000000 --- a/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestSuiteFinishedSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\JUnit; - -use PHPUnit\Event\TestSuite\Finished; -use PHPUnit\Event\TestSuite\FinishedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestSuiteFinishedSubscriber extends Subscriber implements FinishedSubscriber -{ - public function notify(Finished $event): void - { - $this->logger()->testSuiteFinished(); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestSuiteStartedSubscriber.php b/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestSuiteStartedSubscriber.php deleted file mode 100644 index c213d77..0000000 --- a/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestSuiteStartedSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\JUnit; - -use PHPUnit\Event\TestSuite\Started; -use PHPUnit\Event\TestSuite\StartedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestSuiteStartedSubscriber extends Subscriber implements StartedSubscriber -{ - public function notify(Started $event): void - { - $this->logger()->testSuiteStarted($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/Subscriber.php b/vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/Subscriber.php deleted file mode 100644 index ae72b8b..0000000 --- a/vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/Subscriber.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TeamCity; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -abstract class Subscriber -{ - private readonly TeamCityLogger $logger; - - public function __construct(TeamCityLogger $logger) - { - $this->logger = $logger; - } - - protected function logger(): TeamCityLogger - { - return $this->logger; - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestConsideredRiskySubscriber.php b/vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestConsideredRiskySubscriber.php deleted file mode 100644 index ab26634..0000000 --- a/vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestConsideredRiskySubscriber.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TeamCity; - -use PHPUnit\Event\InvalidArgumentException; -use PHPUnit\Event\Test\ConsideredRisky; -use PHPUnit\Event\Test\ConsideredRiskySubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestConsideredRiskySubscriber extends Subscriber implements ConsideredRiskySubscriber -{ - /** - * @throws InvalidArgumentException - */ - public function notify(ConsideredRisky $event): void - { - $this->logger()->testConsideredRisky($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestErroredSubscriber.php b/vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestErroredSubscriber.php deleted file mode 100644 index 2c4141b..0000000 --- a/vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestErroredSubscriber.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TeamCity; - -use PHPUnit\Event\InvalidArgumentException; -use PHPUnit\Event\Test\Errored; -use PHPUnit\Event\Test\ErroredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestErroredSubscriber extends Subscriber implements ErroredSubscriber -{ - /** - * @throws InvalidArgumentException - */ - public function notify(Errored $event): void - { - $this->logger()->testErrored($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestFailedSubscriber.php b/vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestFailedSubscriber.php deleted file mode 100644 index 248cc1b..0000000 --- a/vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestFailedSubscriber.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TeamCity; - -use PHPUnit\Event\InvalidArgumentException; -use PHPUnit\Event\Test\Failed; -use PHPUnit\Event\Test\FailedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestFailedSubscriber extends Subscriber implements FailedSubscriber -{ - /** - * @throws InvalidArgumentException - */ - public function notify(Failed $event): void - { - $this->logger()->testFailed($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestFinishedSubscriber.php b/vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestFinishedSubscriber.php deleted file mode 100644 index 82eaab6..0000000 --- a/vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestFinishedSubscriber.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TeamCity; - -use PHPUnit\Event\InvalidArgumentException; -use PHPUnit\Event\Test\Finished; -use PHPUnit\Event\Test\FinishedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestFinishedSubscriber extends Subscriber implements FinishedSubscriber -{ - /** - * @throws InvalidArgumentException - */ - public function notify(Finished $event): void - { - $this->logger()->testFinished($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestMarkedIncompleteSubscriber.php b/vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestMarkedIncompleteSubscriber.php deleted file mode 100644 index d0cb921..0000000 --- a/vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestMarkedIncompleteSubscriber.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TeamCity; - -use PHPUnit\Event\InvalidArgumentException; -use PHPUnit\Event\Test\MarkedIncomplete; -use PHPUnit\Event\Test\MarkedIncompleteSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestMarkedIncompleteSubscriber extends Subscriber implements MarkedIncompleteSubscriber -{ - /** - * @throws InvalidArgumentException - */ - public function notify(MarkedIncomplete $event): void - { - $this->logger()->testMarkedIncomplete($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestPreparedSubscriber.php b/vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestPreparedSubscriber.php deleted file mode 100644 index 34e9200..0000000 --- a/vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestPreparedSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TeamCity; - -use PHPUnit\Event\Test\Prepared; -use PHPUnit\Event\Test\PreparedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestPreparedSubscriber extends Subscriber implements PreparedSubscriber -{ - public function notify(Prepared $event): void - { - $this->logger()->testPrepared($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestRunnerExecutionFinishedSubscriber.php b/vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestRunnerExecutionFinishedSubscriber.php deleted file mode 100644 index e87aa21..0000000 --- a/vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestRunnerExecutionFinishedSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TeamCity; - -use PHPUnit\Event\TestRunner\ExecutionFinished; -use PHPUnit\Event\TestRunner\ExecutionFinishedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestRunnerExecutionFinishedSubscriber extends Subscriber implements ExecutionFinishedSubscriber -{ - public function notify(ExecutionFinished $event): void - { - $this->logger()->flush(); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSkippedSubscriber.php b/vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSkippedSubscriber.php deleted file mode 100644 index 17951c3..0000000 --- a/vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSkippedSubscriber.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TeamCity; - -use PHPUnit\Event\InvalidArgumentException; -use PHPUnit\Event\Test\Skipped; -use PHPUnit\Event\Test\SkippedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestSkippedSubscriber extends Subscriber implements SkippedSubscriber -{ - /** - * @throws InvalidArgumentException - */ - public function notify(Skipped $event): void - { - $this->logger()->testSkipped($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteBeforeFirstTestMethodErroredSubscriber.php b/vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteBeforeFirstTestMethodErroredSubscriber.php deleted file mode 100644 index 6961b40..0000000 --- a/vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteBeforeFirstTestMethodErroredSubscriber.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TeamCity; - -use PHPUnit\Event\InvalidArgumentException; -use PHPUnit\Event\Test\BeforeFirstTestMethodErrored; -use PHPUnit\Event\Test\BeforeFirstTestMethodErroredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestSuiteBeforeFirstTestMethodErroredSubscriber extends Subscriber implements BeforeFirstTestMethodErroredSubscriber -{ - /** - * @throws InvalidArgumentException - */ - public function notify(BeforeFirstTestMethodErrored $event): void - { - $this->logger()->beforeFirstTestMethodErrored($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteFinishedSubscriber.php b/vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteFinishedSubscriber.php deleted file mode 100644 index ff96fb2..0000000 --- a/vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteFinishedSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TeamCity; - -use PHPUnit\Event\TestSuite\Finished; -use PHPUnit\Event\TestSuite\FinishedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestSuiteFinishedSubscriber extends Subscriber implements FinishedSubscriber -{ - public function notify(Finished $event): void - { - $this->logger()->testSuiteFinished($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteSkippedSubscriber.php b/vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteSkippedSubscriber.php deleted file mode 100644 index 8f9e3cf..0000000 --- a/vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteSkippedSubscriber.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TeamCity; - -use PHPUnit\Event\InvalidArgumentException; -use PHPUnit\Event\TestSuite\Skipped; -use PHPUnit\Event\TestSuite\SkippedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestSuiteSkippedSubscriber extends Subscriber implements SkippedSubscriber -{ - /** - * @throws InvalidArgumentException - */ - public function notify(Skipped $event): void - { - $this->logger()->testSuiteSkipped($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteStartedSubscriber.php b/vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteStartedSubscriber.php deleted file mode 100644 index 6bebe6a..0000000 --- a/vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteStartedSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TeamCity; - -use PHPUnit\Event\TestSuite\Started; -use PHPUnit\Event\TestSuite\StartedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestSuiteStartedSubscriber extends Subscriber implements StartedSubscriber -{ - public function notify(Started $event): void - { - $this->logger()->testSuiteStarted($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/TeamCity/TeamCityLogger.php b/vendor/phpunit/phpunit/src/Logging/TeamCity/TeamCityLogger.php deleted file mode 100644 index 47600a1..0000000 --- a/vendor/phpunit/phpunit/src/Logging/TeamCity/TeamCityLogger.php +++ /dev/null @@ -1,425 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TeamCity; - -use function assert; -use function getmypid; -use function ini_get; -use function is_a; -use function round; -use function sprintf; -use function str_replace; -use function stripos; -use PHPUnit\Event\Code\TestMethod; -use PHPUnit\Event\Code\Throwable; -use PHPUnit\Event\Event; -use PHPUnit\Event\EventFacadeIsSealedException; -use PHPUnit\Event\Facade; -use PHPUnit\Event\InvalidArgumentException; -use PHPUnit\Event\Telemetry\HRTime; -use PHPUnit\Event\Test\BeforeFirstTestMethodErrored; -use PHPUnit\Event\Test\ConsideredRisky; -use PHPUnit\Event\Test\Errored; -use PHPUnit\Event\Test\Failed; -use PHPUnit\Event\Test\Finished; -use PHPUnit\Event\Test\MarkedIncomplete; -use PHPUnit\Event\Test\Prepared; -use PHPUnit\Event\Test\Skipped; -use PHPUnit\Event\TestSuite\Finished as TestSuiteFinished; -use PHPUnit\Event\TestSuite\Skipped as TestSuiteSkipped; -use PHPUnit\Event\TestSuite\Started as TestSuiteStarted; -use PHPUnit\Event\TestSuite\TestSuiteForTestClass; -use PHPUnit\Event\TestSuite\TestSuiteForTestMethodWithDataProvider; -use PHPUnit\Event\UnknownSubscriberTypeException; -use PHPUnit\Framework\Exception as FrameworkException; -use PHPUnit\TextUI\Output\Printer; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TeamCityLogger -{ - private readonly Printer $printer; - private bool $isSummaryTestCountPrinted = false; - private ?HRTime $time = null; - private ?int $flowId; - - /** - * @throws EventFacadeIsSealedException - * @throws UnknownSubscriberTypeException - */ - public function __construct(Printer $printer, Facade $facade) - { - $this->printer = $printer; - - $this->registerSubscribers($facade); - $this->setFlowId(); - } - - public function testSuiteStarted(TestSuiteStarted $event): void - { - $testSuite = $event->testSuite(); - - if (!$this->isSummaryTestCountPrinted) { - $this->isSummaryTestCountPrinted = true; - - $this->writeMessage( - 'testCount', - ['count' => $testSuite->count()], - ); - } - - $parameters = ['name' => $testSuite->name()]; - - if ($testSuite->isForTestClass()) { - assert($testSuite instanceof TestSuiteForTestClass); - - $parameters['locationHint'] = sprintf( - 'php_qn://%s::\\%s', - $testSuite->file(), - $testSuite->name(), - ); - } elseif ($testSuite->isForTestMethodWithDataProvider()) { - assert($testSuite instanceof TestSuiteForTestMethodWithDataProvider); - - $parameters['locationHint'] = sprintf( - 'php_qn://%s::\\%s', - $testSuite->file(), - $testSuite->name(), - ); - - $parameters['name'] = $testSuite->methodName(); - } - - $this->writeMessage('testSuiteStarted', $parameters); - } - - public function testSuiteFinished(TestSuiteFinished $event): void - { - $testSuite = $event->testSuite(); - - $parameters = ['name' => $testSuite->name()]; - - if ($testSuite->isForTestMethodWithDataProvider()) { - assert($testSuite instanceof TestSuiteForTestMethodWithDataProvider); - - $parameters['name'] = $testSuite->methodName(); - } - - $this->writeMessage('testSuiteFinished', $parameters); - } - - public function testPrepared(Prepared $event): void - { - $test = $event->test(); - - $parameters = [ - 'name' => $test->name(), - ]; - - if ($test->isTestMethod()) { - assert($test instanceof TestMethod); - - $parameters['locationHint'] = sprintf( - 'php_qn://%s::\\%s::%s', - $test->file(), - $test->className(), - $test->name(), - ); - } - - $this->writeMessage('testStarted', $parameters); - - $this->time = $event->telemetryInfo()->time(); - } - - /** - * @throws InvalidArgumentException - */ - public function testMarkedIncomplete(MarkedIncomplete $event): void - { - if ($this->time === null) { - // @codeCoverageIgnoreStart - $this->time = $event->telemetryInfo()->time(); - // @codeCoverageIgnoreEnd - } - - $this->writeMessage( - 'testIgnored', - [ - 'name' => $event->test()->name(), - 'message' => $event->throwable()->message(), - 'details' => $this->details($event->throwable()), - 'duration' => $this->duration($event), - ], - ); - } - - /** - * @throws InvalidArgumentException - */ - public function testSkipped(Skipped $event): void - { - if ($this->time === null) { - $this->time = $event->telemetryInfo()->time(); - } - - $parameters = [ - 'name' => $event->test()->name(), - 'message' => $event->message(), - ]; - - $parameters['duration'] = $this->duration($event); - - $this->writeMessage('testIgnored', $parameters); - } - - /** - * @throws InvalidArgumentException - */ - public function testSuiteSkipped(TestSuiteSkipped $event): void - { - if ($this->time === null) { - $this->time = $event->telemetryInfo()->time(); - } - - $parameters = [ - 'name' => $event->testSuite()->name(), - 'message' => $event->message(), - ]; - - $parameters['duration'] = $this->duration($event); - - $this->writeMessage('testIgnored', $parameters); - $this->writeMessage('testSuiteFinished', $parameters); - } - - /** - * @throws InvalidArgumentException - */ - public function beforeFirstTestMethodErrored(BeforeFirstTestMethodErrored $event): void - { - if ($this->time === null) { - $this->time = $event->telemetryInfo()->time(); - } - - $parameters = [ - 'name' => $event->testClassName(), - 'message' => $this->message($event->throwable()), - 'details' => $this->details($event->throwable()), - 'duration' => $this->duration($event), - ]; - - $this->writeMessage('testFailed', $parameters); - $this->writeMessage('testSuiteFinished', $parameters); - } - - /** - * @throws InvalidArgumentException - */ - public function testErrored(Errored $event): void - { - if ($this->time === null) { - $this->time = $event->telemetryInfo()->time(); - } - - $this->writeMessage( - 'testFailed', - [ - 'name' => $event->test()->name(), - 'message' => $this->message($event->throwable()), - 'details' => $this->details($event->throwable()), - 'duration' => $this->duration($event), - ], - ); - } - - /** - * @throws InvalidArgumentException - */ - public function testFailed(Failed $event): void - { - if ($this->time === null) { - // @codeCoverageIgnoreStart - $this->time = $event->telemetryInfo()->time(); - // @codeCoverageIgnoreEnd - } - - $parameters = [ - 'name' => $event->test()->name(), - 'message' => $this->message($event->throwable()), - 'details' => $this->details($event->throwable()), - 'duration' => $this->duration($event), - ]; - - if ($event->hasComparisonFailure()) { - $parameters['type'] = 'comparisonFailure'; - $parameters['actual'] = $event->comparisonFailure()->actual(); - $parameters['expected'] = $event->comparisonFailure()->expected(); - } - - $this->writeMessage('testFailed', $parameters); - } - - /** - * @throws InvalidArgumentException - */ - public function testConsideredRisky(ConsideredRisky $event): void - { - if ($this->time === null) { - // @codeCoverageIgnoreStart - $this->time = $event->telemetryInfo()->time(); - // @codeCoverageIgnoreEnd - } - - $this->writeMessage( - 'testFailed', - [ - 'name' => $event->test()->name(), - 'message' => $event->message(), - 'details' => '', - 'duration' => $this->duration($event), - ], - ); - } - - /** - * @throws InvalidArgumentException - */ - public function testFinished(Finished $event): void - { - $this->writeMessage( - 'testFinished', - [ - 'name' => $event->test()->name(), - 'duration' => $this->duration($event), - ], - ); - - $this->time = null; - } - - public function flush(): void - { - $this->printer->flush(); - } - - /** - * @throws EventFacadeIsSealedException - * @throws UnknownSubscriberTypeException - */ - private function registerSubscribers(Facade $facade): void - { - $facade->registerSubscribers( - new TestSuiteStartedSubscriber($this), - new TestSuiteFinishedSubscriber($this), - new TestPreparedSubscriber($this), - new TestFinishedSubscriber($this), - new TestErroredSubscriber($this), - new TestFailedSubscriber($this), - new TestMarkedIncompleteSubscriber($this), - new TestSkippedSubscriber($this), - new TestSuiteSkippedSubscriber($this), - new TestConsideredRiskySubscriber($this), - new TestRunnerExecutionFinishedSubscriber($this), - new TestSuiteBeforeFirstTestMethodErroredSubscriber($this), - ); - } - - private function setFlowId(): void - { - if (stripos(ini_get('disable_functions'), 'getmypid') === false) { - $this->flowId = getmypid(); - } - } - - private function writeMessage(string $eventName, array $parameters = []): void - { - $this->printer->print( - sprintf( - '##teamcity[%s', - $eventName, - ), - ); - - if ($this->flowId !== null) { - $parameters['flowId'] = $this->flowId; - } - - foreach ($parameters as $key => $value) { - $this->printer->print( - sprintf( - " %s='%s'", - $key, - $this->escape((string) $value), - ), - ); - } - - $this->printer->print("]\n"); - } - - /** - * @throws InvalidArgumentException - */ - private function duration(Event $event): int - { - if ($this->time === null) { - // @codeCoverageIgnoreStart - return 0; - // @codeCoverageIgnoreEnd - } - - return (int) round($event->telemetryInfo()->time()->duration($this->time)->asFloat() * 1000); - } - - private function escape(string $string): string - { - return str_replace( - ['|', "'", "\n", "\r", ']', '['], - ['||', "|'", '|n', '|r', '|]', '|['], - $string, - ); - } - - private function message(Throwable $throwable): string - { - if (is_a($throwable->className(), FrameworkException::class, true)) { - return $throwable->message(); - } - - $buffer = $throwable->className(); - - if (!empty($throwable->message())) { - $buffer .= ': ' . $throwable->message(); - } - - return $buffer; - } - - private function details(Throwable $throwable): string - { - $buffer = $throwable->stackTrace(); - - while ($throwable->hasPrevious()) { - $throwable = $throwable->previous(); - - $buffer .= sprintf( - "\nCaused by\n%s\n%s", - $throwable->description(), - $throwable->stackTrace(), - ); - } - - return $buffer; - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/TestDox/HtmlRenderer.php b/vendor/phpunit/phpunit/src/Logging/TestDox/HtmlRenderer.php deleted file mode 100644 index 35bc243..0000000 --- a/vendor/phpunit/phpunit/src/Logging/TestDox/HtmlRenderer.php +++ /dev/null @@ -1,158 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TestDox; - -use function sprintf; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class HtmlRenderer -{ - /** - * @var string - */ - private const PAGE_HEADER = <<<'EOT' - - - - - Test Documentation - - - -EOT; - - /** - * @var string - */ - private const CLASS_HEADER = <<<'EOT' - -

%s

-
    - -EOT; - - /** - * @var string - */ - private const CLASS_FOOTER = <<<'EOT' -
-EOT; - - /** - * @var string - */ - private const PAGE_FOOTER = <<<'EOT' - - - -EOT; - - /** - * @psalm-param array $tests - */ - public function render(array $tests): string - { - $buffer = self::PAGE_HEADER; - - foreach ($tests as $prettifiedClassName => $_tests) { - $buffer .= sprintf( - self::CLASS_HEADER, - $prettifiedClassName, - ); - - foreach ($this->reduce($_tests) as $prettifiedMethodName => $outcome) { - $buffer .= sprintf( - "
  • %s
  • \n", - $outcome, - $prettifiedMethodName, - ); - } - - $buffer .= self::CLASS_FOOTER; - } - - return $buffer . self::PAGE_FOOTER; - } - - /** - * @psalm-return array - */ - private function reduce(TestResultCollection $tests): array - { - $result = []; - - foreach ($tests as $test) { - $prettifiedMethodName = $test->test()->testDox()->prettifiedMethodName(); - - if (!isset($result[$prettifiedMethodName])) { - $result[$prettifiedMethodName] = $test->status()->isSuccess() ? 'success' : 'defect'; - - continue; - } - - if ($test->status()->isSuccess()) { - continue; - } - - $result[$prettifiedMethodName] = 'defect'; - } - - return $result; - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/TestDox/NamePrettifier.php b/vendor/phpunit/phpunit/src/Logging/TestDox/NamePrettifier.php deleted file mode 100644 index 7b229fc..0000000 --- a/vendor/phpunit/phpunit/src/Logging/TestDox/NamePrettifier.php +++ /dev/null @@ -1,305 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TestDox; - -use function array_key_exists; -use function array_keys; -use function array_map; -use function array_pop; -use function array_values; -use function assert; -use function class_exists; -use function explode; -use function gettype; -use function implode; -use function is_bool; -use function is_float; -use function is_int; -use function is_object; -use function is_scalar; -use function method_exists; -use function preg_quote; -use function preg_replace; -use function rtrim; -use function sprintf; -use function str_contains; -use function str_ends_with; -use function str_replace; -use function str_starts_with; -use function strlen; -use function strtolower; -use function strtoupper; -use function substr; -use function trim; -use PHPUnit\Framework\TestCase; -use PHPUnit\Metadata\Parser\Registry as MetadataRegistry; -use PHPUnit\Metadata\TestDox; -use PHPUnit\Util\Color; -use ReflectionEnum; -use ReflectionMethod; -use ReflectionObject; -use SebastianBergmann\Exporter\Exporter; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class NamePrettifier -{ - /** - * @psalm-var array - */ - private static array $strings = []; - - /** - * @psalm-param class-string $className - */ - public function prettifyTestClassName(string $className): string - { - if (class_exists($className)) { - $classLevelTestDox = MetadataRegistry::parser()->forClass($className)->isTestDox(); - - if ($classLevelTestDox->isNotEmpty()) { - $classLevelTestDox = $classLevelTestDox->asArray()[0]; - - assert($classLevelTestDox instanceof TestDox); - - return $classLevelTestDox->text(); - } - } - - $parts = explode('\\', $className); - $className = array_pop($parts); - - if (str_ends_with($className, 'Test')) { - $className = substr($className, 0, strlen($className) - strlen('Test')); - } - - if (str_starts_with($className, 'Tests')) { - $className = substr($className, strlen('Tests')); - } elseif (str_starts_with($className, 'Test')) { - $className = substr($className, strlen('Test')); - } - - if (empty($className)) { - $className = 'UnnamedTests'; - } - - if (!empty($parts)) { - $parts[] = $className; - $fullyQualifiedName = implode('\\', $parts); - } else { - $fullyQualifiedName = $className; - } - - $result = preg_replace('/(?<=[[:lower:]])(?=[[:upper:]])/u', ' ', $className); - - if ($fullyQualifiedName !== $className) { - return $result . ' (' . $fullyQualifiedName . ')'; - } - - return $result; - } - - // NOTE: this method is on a hot path and very performance sensitive. change with care. - public function prettifyTestMethodName(string $name): string - { - if ($name === '') { - return ''; - } - - $string = rtrim($name, '0123456789'); - - if (array_key_exists($string, self::$strings)) { - $name = $string; - } elseif ($string === $name) { - self::$strings[$string] = 1; - } - - if (str_starts_with($name, 'test_')) { - $name = substr($name, 5); - } elseif (str_starts_with($name, 'test')) { - $name = substr($name, 4); - } - - if ($name === '') { - return ''; - } - - $name[0] = strtoupper($name[0]); - - $noUnderscore = str_replace('_', ' ', $name); - - if ($noUnderscore !== $name) { - return trim($noUnderscore); - } - - $wasNumeric = false; - - $buffer = ''; - - $len = strlen($name); - - for ($i = 0; $i < $len; $i++) { - if ($i > 0 && $name[$i] >= 'A' && $name[$i] <= 'Z') { - $buffer .= ' ' . strtolower($name[$i]); - } else { - $isNumeric = $name[$i] >= '0' && $name[$i] <= '9'; - - if (!$wasNumeric && $isNumeric) { - $buffer .= ' '; - $wasNumeric = true; - } - - if ($wasNumeric && !$isNumeric) { - $wasNumeric = false; - } - - $buffer .= $name[$i]; - } - } - - return $buffer; - } - - public function prettifyTestCase(TestCase $test, bool $colorize): string - { - $annotationWithPlaceholders = false; - $methodLevelTestDox = MetadataRegistry::parser()->forMethod($test::class, $test->name())->isTestDox()->isMethodLevel(); - - if ($methodLevelTestDox->isNotEmpty()) { - $methodLevelTestDox = $methodLevelTestDox->asArray()[0]; - - assert($methodLevelTestDox instanceof TestDox); - - $result = $methodLevelTestDox->text(); - - if (str_contains($result, '$')) { - $annotation = $result; - $providedData = $this->mapTestMethodParameterNamesToProvidedDataValues($test, $colorize); - - $variables = array_map( - static fn (string $variable): string => sprintf( - '/%s(?=\b)/', - preg_quote($variable, '/'), - ), - array_keys($providedData), - ); - - $result = preg_replace($variables, $providedData, $annotation); - - $annotationWithPlaceholders = true; - } - } else { - $result = $this->prettifyTestMethodName($test->name()); - } - - if (!$annotationWithPlaceholders && $test->usesDataProvider()) { - $result .= $this->prettifyDataSet($test, $colorize); - } - - return $result; - } - - public function prettifyDataSet(TestCase $test, bool $colorize): string - { - if (!$colorize) { - return $test->dataSetAsString(); - } - - if (is_int($test->dataName())) { - return Color::dim(' with data set ') . Color::colorize('fg-cyan', (string) $test->dataName()); - } - - return Color::dim(' with ') . Color::colorize('fg-cyan', Color::visualizeWhitespace($test->dataName())); - } - - private function mapTestMethodParameterNamesToProvidedDataValues(TestCase $test, bool $colorize): array - { - assert(method_exists($test, $test->name())); - - /** @noinspection PhpUnhandledExceptionInspection */ - $reflector = new ReflectionMethod($test::class, $test->name()); - - $providedData = []; - $providedDataValues = array_values($test->providedData()); - $i = 0; - - $providedData['$_dataName'] = $test->dataName(); - - foreach ($reflector->getParameters() as $parameter) { - if (!array_key_exists($i, $providedDataValues) && $parameter->isDefaultValueAvailable()) { - $providedDataValues[$i] = $parameter->getDefaultValue(); - } - - $value = $providedDataValues[$i++] ?? null; - - if (is_object($value)) { - $value = $this->objectToString($value); - } - - if (!is_scalar($value)) { - $value = gettype($value); - - if ($value === 'NULL') { - $value = 'null'; - } - } - - if (is_bool($value) || is_int($value) || is_float($value)) { - $value = (new Exporter)->export($value); - } - - if ($value === '') { - if ($colorize) { - $value = Color::colorize('dim,underlined', 'empty'); - } else { - $value = "''"; - } - } - - $providedData['$' . $parameter->getName()] = str_replace('$', '\\$', $value); - } - - if ($colorize) { - $providedData = array_map( - static fn ($value) => Color::colorize('fg-cyan', Color::visualizeWhitespace((string) $value, true)), - $providedData, - ); - } - - return $providedData; - } - - /** - * @return non-empty-string - */ - private function objectToString(object $value): string - { - $reflector = new ReflectionObject($value); - - if ($reflector->isEnum()) { - $enumReflector = new ReflectionEnum($value); - - if ($enumReflector->isBacked()) { - return (string) $value->value; - } - - return $value->name; - } - - if ($reflector->hasMethod('__toString')) { - return $value->__toString(); - } - - return $value::class; - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/TestDox/PlainTextRenderer.php b/vendor/phpunit/phpunit/src/Logging/TestDox/PlainTextRenderer.php deleted file mode 100644 index 8d11c1c..0000000 --- a/vendor/phpunit/phpunit/src/Logging/TestDox/PlainTextRenderer.php +++ /dev/null @@ -1,79 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TestDox; - -use function sprintf; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class PlainTextRenderer -{ - /** - * @psalm-param array $tests - */ - public function render(array $tests): string - { - $buffer = ''; - - foreach ($tests as $prettifiedClassName => $_tests) { - $buffer .= $prettifiedClassName . "\n"; - - foreach ($this->reduce($_tests) as $prettifiedMethodName => $outcome) { - $buffer .= sprintf( - ' [%s] %s' . "\n", - $outcome, - $prettifiedMethodName, - ); - } - - $buffer .= "\n"; - } - - return $buffer; - } - - /** - * @psalm-return array - */ - private function reduce(TestResultCollection $tests): array - { - $result = []; - - foreach ($tests as $test) { - $prettifiedMethodName = $test->test()->testDox()->prettifiedMethodName(); - - $success = true; - - if ($test->status()->isError() || - $test->status()->isFailure() || - $test->status()->isIncomplete() || - $test->status()->isSkipped()) { - $success = false; - } - - if (!isset($result[$prettifiedMethodName])) { - $result[$prettifiedMethodName] = $success ? 'x' : ' '; - - continue; - } - - if ($success) { - continue; - } - - $result[$prettifiedMethodName] = ' '; - } - - return $result; - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/Subscriber.php b/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/Subscriber.php deleted file mode 100644 index 9d7e347..0000000 --- a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/Subscriber.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TestDox; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -abstract class Subscriber -{ - private readonly TestResultCollector $collector; - - public function __construct(TestResultCollector $collector) - { - $this->collector = $collector; - } - - protected function collector(): TestResultCollector - { - return $this->collector; - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestConsideredRiskySubscriber.php b/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestConsideredRiskySubscriber.php deleted file mode 100644 index 9bace36..0000000 --- a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestConsideredRiskySubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TestDox; - -use PHPUnit\Event\Test\ConsideredRisky; -use PHPUnit\Event\Test\ConsideredRiskySubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestConsideredRiskySubscriber extends Subscriber implements ConsideredRiskySubscriber -{ - public function notify(ConsideredRisky $event): void - { - $this->collector()->testConsideredRisky($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestErroredSubscriber.php b/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestErroredSubscriber.php deleted file mode 100644 index bd5c56e..0000000 --- a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestErroredSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TestDox; - -use PHPUnit\Event\Test\Errored; -use PHPUnit\Event\Test\ErroredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestErroredSubscriber extends Subscriber implements ErroredSubscriber -{ - public function notify(Errored $event): void - { - $this->collector()->testErrored($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestFailedSubscriber.php b/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestFailedSubscriber.php deleted file mode 100644 index 8efe91c..0000000 --- a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestFailedSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TestDox; - -use PHPUnit\Event\Test\Failed; -use PHPUnit\Event\Test\FailedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestFailedSubscriber extends Subscriber implements FailedSubscriber -{ - public function notify(Failed $event): void - { - $this->collector()->testFailed($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestFinishedSubscriber.php b/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestFinishedSubscriber.php deleted file mode 100644 index 2ec85f8..0000000 --- a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestFinishedSubscriber.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TestDox; - -use PHPUnit\Event\InvalidArgumentException; -use PHPUnit\Event\Test\Finished; -use PHPUnit\Event\Test\FinishedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestFinishedSubscriber extends Subscriber implements FinishedSubscriber -{ - /** - * @throws InvalidArgumentException - */ - public function notify(Finished $event): void - { - $this->collector()->testFinished($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestMarkedIncompleteSubscriber.php b/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestMarkedIncompleteSubscriber.php deleted file mode 100644 index 6c2e407..0000000 --- a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestMarkedIncompleteSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TestDox; - -use PHPUnit\Event\Test\MarkedIncomplete; -use PHPUnit\Event\Test\MarkedIncompleteSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestMarkedIncompleteSubscriber extends Subscriber implements MarkedIncompleteSubscriber -{ - public function notify(MarkedIncomplete $event): void - { - $this->collector()->testMarkedIncomplete($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestPassedSubscriber.php b/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestPassedSubscriber.php deleted file mode 100644 index 2821d8e..0000000 --- a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestPassedSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TestDox; - -use PHPUnit\Event\Test\Passed; -use PHPUnit\Event\Test\PassedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestPassedSubscriber extends Subscriber implements PassedSubscriber -{ - public function notify(Passed $event): void - { - $this->collector()->testPassed($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestPreparedSubscriber.php b/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestPreparedSubscriber.php deleted file mode 100644 index a2bf06a..0000000 --- a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestPreparedSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TestDox; - -use PHPUnit\Event\Test\Prepared; -use PHPUnit\Event\Test\PreparedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestPreparedSubscriber extends Subscriber implements PreparedSubscriber -{ - public function notify(Prepared $event): void - { - $this->collector()->testPrepared($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestSkippedSubscriber.php b/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestSkippedSubscriber.php deleted file mode 100644 index f6ea04b..0000000 --- a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestSkippedSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TestDox; - -use PHPUnit\Event\Test\Skipped; -use PHPUnit\Event\Test\SkippedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestSkippedSubscriber extends Subscriber implements SkippedSubscriber -{ - public function notify(Skipped $event): void - { - $this->collector()->testSkipped($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredDeprecationSubscriber.php b/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredDeprecationSubscriber.php deleted file mode 100644 index 15872b7..0000000 --- a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredDeprecationSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TestDox; - -use PHPUnit\Event\Test\DeprecationTriggered; -use PHPUnit\Event\Test\DeprecationTriggeredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestTriggeredDeprecationSubscriber extends Subscriber implements DeprecationTriggeredSubscriber -{ - public function notify(DeprecationTriggered $event): void - { - $this->collector()->testTriggeredDeprecation($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredNoticeSubscriber.php b/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredNoticeSubscriber.php deleted file mode 100644 index a6d5a0a..0000000 --- a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredNoticeSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TestDox; - -use PHPUnit\Event\Test\NoticeTriggered; -use PHPUnit\Event\Test\NoticeTriggeredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestTriggeredNoticeSubscriber extends Subscriber implements NoticeTriggeredSubscriber -{ - public function notify(NoticeTriggered $event): void - { - $this->collector()->testTriggeredNotice($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpDeprecationSubscriber.php b/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpDeprecationSubscriber.php deleted file mode 100644 index bcdd394..0000000 --- a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpDeprecationSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TestDox; - -use PHPUnit\Event\Test\PhpDeprecationTriggered; -use PHPUnit\Event\Test\PhpDeprecationTriggeredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestTriggeredPhpDeprecationSubscriber extends Subscriber implements PhpDeprecationTriggeredSubscriber -{ - public function notify(PhpDeprecationTriggered $event): void - { - $this->collector()->testTriggeredPhpDeprecation($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpNoticeSubscriber.php b/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpNoticeSubscriber.php deleted file mode 100644 index 2601c19..0000000 --- a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpNoticeSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TestDox; - -use PHPUnit\Event\Test\PhpNoticeTriggered; -use PHPUnit\Event\Test\PhpNoticeTriggeredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestTriggeredPhpNoticeSubscriber extends Subscriber implements PhpNoticeTriggeredSubscriber -{ - public function notify(PhpNoticeTriggered $event): void - { - $this->collector()->testTriggeredPhpNotice($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpWarningSubscriber.php b/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpWarningSubscriber.php deleted file mode 100644 index 3af20b8..0000000 --- a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpWarningSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TestDox; - -use PHPUnit\Event\Test\PhpWarningTriggered; -use PHPUnit\Event\Test\PhpWarningTriggeredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestTriggeredPhpWarningSubscriber extends Subscriber implements PhpWarningTriggeredSubscriber -{ - public function notify(PhpWarningTriggered $event): void - { - $this->collector()->testTriggeredPhpWarning($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpunitDeprecationSubscriber.php b/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpunitDeprecationSubscriber.php deleted file mode 100644 index 9fc4f26..0000000 --- a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpunitDeprecationSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TestDox; - -use PHPUnit\Event\Test\PhpunitDeprecationTriggered; -use PHPUnit\Event\Test\PhpunitDeprecationTriggeredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestTriggeredPhpunitDeprecationSubscriber extends Subscriber implements PhpunitDeprecationTriggeredSubscriber -{ - public function notify(PhpunitDeprecationTriggered $event): void - { - $this->collector()->testTriggeredPhpunitDeprecation($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpunitErrorSubscriber.php b/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpunitErrorSubscriber.php deleted file mode 100644 index 43f32d9..0000000 --- a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpunitErrorSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TestDox; - -use PHPUnit\Event\Test\PhpunitErrorTriggered; -use PHPUnit\Event\Test\PhpunitErrorTriggeredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestTriggeredPhpunitErrorSubscriber extends Subscriber implements PhpunitErrorTriggeredSubscriber -{ - public function notify(PhpunitErrorTriggered $event): void - { - $this->collector()->testTriggeredPhpunitError($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpunitWarningSubscriber.php b/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpunitWarningSubscriber.php deleted file mode 100644 index 3774b82..0000000 --- a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpunitWarningSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TestDox; - -use PHPUnit\Event\Test\PhpunitWarningTriggered; -use PHPUnit\Event\Test\PhpunitWarningTriggeredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestTriggeredPhpunitWarningSubscriber extends Subscriber implements PhpunitWarningTriggeredSubscriber -{ - public function notify(PhpunitWarningTriggered $event): void - { - $this->collector()->testTriggeredPhpunitWarning($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredWarningSubscriber.php b/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredWarningSubscriber.php deleted file mode 100644 index fc8979d..0000000 --- a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredWarningSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TestDox; - -use PHPUnit\Event\Test\WarningTriggered; -use PHPUnit\Event\Test\WarningTriggeredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestTriggeredWarningSubscriber extends Subscriber implements WarningTriggeredSubscriber -{ - public function notify(WarningTriggered $event): void - { - $this->collector()->testTriggeredWarning($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResult.php b/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResult.php deleted file mode 100644 index 74c6e9d..0000000 --- a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResult.php +++ /dev/null @@ -1,58 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TestDox; - -use PHPUnit\Event\Code\TestMethod; -use PHPUnit\Event\Code\Throwable; -use PHPUnit\Framework\TestStatus\TestStatus; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestResult -{ - private readonly TestMethod $test; - private readonly TestStatus $status; - private readonly ?Throwable $throwable; - - public function __construct(TestMethod $test, TestStatus $status, ?Throwable $throwable) - { - $this->test = $test; - $this->status = $status; - $this->throwable = $throwable; - } - - public function test(): TestMethod - { - return $this->test; - } - - public function status(): TestStatus - { - return $this->status; - } - - /** - * @psalm-assert-if-true !null $this->throwable - */ - public function hasThrowable(): bool - { - return $this->throwable !== null; - } - - public function throwable(): ?Throwable - { - return $this->throwable; - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollection.php b/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollection.php deleted file mode 100644 index 1ef1d83..0000000 --- a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollection.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TestDox; - -use IteratorAggregate; - -/** - * @template-implements IteratorAggregate - * - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestResultCollection implements IteratorAggregate -{ - /** - * @psalm-var list - */ - private readonly array $testResults; - - /** - * @psalm-param list $testResults - */ - public static function fromArray(array $testResults): self - { - return new self(...$testResults); - } - - private function __construct(TestResult ...$testResults) - { - $this->testResults = $testResults; - } - - /** - * @psalm-return list - */ - public function asArray(): array - { - return $this->testResults; - } - - public function getIterator(): TestResultCollectionIterator - { - return new TestResultCollectionIterator($this); - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollectionIterator.php b/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollectionIterator.php deleted file mode 100644 index b409fe1..0000000 --- a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollectionIterator.php +++ /dev/null @@ -1,59 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TestDox; - -use function count; -use Iterator; - -/** - * @template-implements Iterator - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestResultCollectionIterator implements Iterator -{ - /** - * @psalm-var list - */ - private readonly array $testResults; - private int $position = 0; - - public function __construct(TestResultCollection $testResults) - { - $this->testResults = $testResults->asArray(); - } - - public function rewind(): void - { - $this->position = 0; - } - - public function valid(): bool - { - return $this->position < count($this->testResults); - } - - public function key(): int - { - return $this->position; - } - - public function current(): TestResult - { - return $this->testResults[$this->position]; - } - - public function next(): void - { - $this->position++; - } -} diff --git a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollector.php b/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollector.php deleted file mode 100644 index e49c86b..0000000 --- a/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollector.php +++ /dev/null @@ -1,447 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TestDox; - -use function array_keys; -use function array_merge; -use function assert; -use function is_subclass_of; -use function ksort; -use function uksort; -use function usort; -use PHPUnit\Event\Code\TestMethod; -use PHPUnit\Event\Code\Throwable; -use PHPUnit\Event\EventFacadeIsSealedException; -use PHPUnit\Event\Facade; -use PHPUnit\Event\InvalidArgumentException; -use PHPUnit\Event\Test\ConsideredRisky; -use PHPUnit\Event\Test\DeprecationTriggered; -use PHPUnit\Event\Test\Errored; -use PHPUnit\Event\Test\Failed; -use PHPUnit\Event\Test\Finished; -use PHPUnit\Event\Test\MarkedIncomplete; -use PHPUnit\Event\Test\NoticeTriggered; -use PHPUnit\Event\Test\Passed; -use PHPUnit\Event\Test\PhpDeprecationTriggered; -use PHPUnit\Event\Test\PhpNoticeTriggered; -use PHPUnit\Event\Test\PhpunitDeprecationTriggered; -use PHPUnit\Event\Test\PhpunitErrorTriggered; -use PHPUnit\Event\Test\PhpunitWarningTriggered; -use PHPUnit\Event\Test\PhpWarningTriggered; -use PHPUnit\Event\Test\Prepared; -use PHPUnit\Event\Test\Skipped; -use PHPUnit\Event\Test\WarningTriggered; -use PHPUnit\Event\UnknownSubscriberTypeException; -use PHPUnit\Framework\TestStatus\TestStatus; -use PHPUnit\Logging\TestDox\TestResult as TestDoxTestMethod; -use PHPUnit\TextUI\Configuration\Source; -use PHPUnit\TextUI\Configuration\SourceFilter; -use ReflectionMethod; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestResultCollector -{ - private readonly Source $source; - - /** - * @psalm-var array> - */ - private array $tests = []; - private ?TestStatus $status = null; - private ?Throwable $throwable = null; - private bool $prepared = false; - - /** - * @throws EventFacadeIsSealedException - * @throws UnknownSubscriberTypeException - */ - public function __construct(Facade $facade, Source $source) - { - $this->source = $source; - - $this->registerSubscribers($facade); - } - - /** - * @psalm-return array - */ - public function testMethodsGroupedByClass(): array - { - $result = []; - - foreach ($this->tests as $prettifiedClassName => $tests) { - $testsByDeclaringClass = []; - - foreach ($tests as $test) { - $declaringClassName = (new ReflectionMethod($test->test()->className(), $test->test()->methodName()))->getDeclaringClass()->getName(); - - if (!isset($testsByDeclaringClass[$declaringClassName])) { - $testsByDeclaringClass[$declaringClassName] = []; - } - - $testsByDeclaringClass[$declaringClassName][] = $test; - } - - foreach (array_keys($testsByDeclaringClass) as $declaringClassName) { - usort( - $testsByDeclaringClass[$declaringClassName], - static function (TestDoxTestMethod $a, TestDoxTestMethod $b): int - { - return $a->test()->line() <=> $b->test()->line(); - }, - ); - } - - uksort( - $testsByDeclaringClass, - /** - * @psalm-param class-string $a - * @psalm-param class-string $b - */ - static function (string $a, string $b): int - { - if (is_subclass_of($b, $a)) { - return -1; - } - - if (is_subclass_of($a, $b)) { - return 1; - } - - return 0; - }, - ); - - $tests = []; - - foreach ($testsByDeclaringClass as $_tests) { - $tests = array_merge($tests, $_tests); - } - - $result[$prettifiedClassName] = TestResultCollection::fromArray($tests); - } - - ksort($result); - - return $result; - } - - public function testPrepared(Prepared $event): void - { - if (!$event->test()->isTestMethod()) { - return; - } - - $this->status = TestStatus::unknown(); - $this->throwable = null; - $this->prepared = true; - } - - public function testErrored(Errored $event): void - { - if (!$event->test()->isTestMethod()) { - return; - } - - $this->status = TestStatus::error($event->throwable()->message()); - $this->throwable = $event->throwable(); - - if (!$this->prepared) { - $test = $event->test(); - - assert($test instanceof TestMethod); - - $this->process($test); - } - } - - public function testFailed(Failed $event): void - { - if (!$event->test()->isTestMethod()) { - return; - } - - $this->status = TestStatus::failure($event->throwable()->message()); - $this->throwable = $event->throwable(); - } - - public function testPassed(Passed $event): void - { - if (!$event->test()->isTestMethod()) { - return; - } - - $this->updateTestStatus(TestStatus::success()); - } - - public function testSkipped(Skipped $event): void - { - if (!$event->test()->isTestMethod()) { - return; - } - - $this->updateTestStatus(TestStatus::skipped($event->message())); - } - - public function testMarkedIncomplete(MarkedIncomplete $event): void - { - if (!$event->test()->isTestMethod()) { - return; - } - - $this->updateTestStatus(TestStatus::incomplete($event->throwable()->message())); - - $this->throwable = $event->throwable(); - } - - public function testConsideredRisky(ConsideredRisky $event): void - { - if (!$event->test()->isTestMethod()) { - return; - } - - $this->updateTestStatus(TestStatus::risky()); - } - - public function testTriggeredDeprecation(DeprecationTriggered $event): void - { - if (!$event->test()->isTestMethod()) { - return; - } - - if ($event->ignoredByTest()) { - return; - } - - if ($event->ignoredByBaseline()) { - return; - } - - if (!$this->source->ignoreSuppressionOfDeprecations() && $event->wasSuppressed()) { - return; - } - - if ($this->source->restrictDeprecations() && !SourceFilter::instance()->includes($event->file())) { - return; - } - - $this->updateTestStatus(TestStatus::deprecation()); - } - - public function testTriggeredNotice(NoticeTriggered $event): void - { - if (!$event->test()->isTestMethod()) { - return; - } - - if ($event->ignoredByBaseline()) { - return; - } - - if (!$this->source->ignoreSuppressionOfNotices() && $event->wasSuppressed()) { - return; - } - - if ($this->source->restrictNotices() && !SourceFilter::instance()->includes($event->file())) { - return; - } - - $this->updateTestStatus(TestStatus::notice()); - } - - public function testTriggeredWarning(WarningTriggered $event): void - { - if (!$event->test()->isTestMethod()) { - return; - } - - if ($event->ignoredByBaseline()) { - return; - } - - if (!$this->source->ignoreSuppressionOfWarnings() && $event->wasSuppressed()) { - return; - } - - if ($this->source->restrictWarnings() && !SourceFilter::instance()->includes($event->file())) { - return; - } - - $this->updateTestStatus(TestStatus::warning()); - } - - public function testTriggeredPhpDeprecation(PhpDeprecationTriggered $event): void - { - if (!$event->test()->isTestMethod()) { - return; - } - - if ($event->ignoredByTest()) { - return; - } - - if ($event->ignoredByBaseline()) { - return; - } - - if (!$this->source->ignoreSuppressionOfPhpDeprecations() && $event->wasSuppressed()) { - return; - } - - if ($this->source->restrictDeprecations() && !SourceFilter::instance()->includes($event->file())) { - return; - } - - $this->updateTestStatus(TestStatus::deprecation()); - } - - public function testTriggeredPhpNotice(PhpNoticeTriggered $event): void - { - if (!$event->test()->isTestMethod()) { - return; - } - - if ($event->ignoredByBaseline()) { - return; - } - - if (!$this->source->ignoreSuppressionOfPhpNotices() && $event->wasSuppressed()) { - return; - } - - if ($this->source->restrictNotices() && !SourceFilter::instance()->includes($event->file())) { - return; - } - - $this->updateTestStatus(TestStatus::notice()); - } - - public function testTriggeredPhpWarning(PhpWarningTriggered $event): void - { - if (!$event->test()->isTestMethod()) { - return; - } - - if ($event->ignoredByBaseline()) { - return; - } - - if (!$this->source->ignoreSuppressionOfPhpWarnings() && $event->wasSuppressed()) { - return; - } - - if ($this->source->restrictWarnings() && !SourceFilter::instance()->includes($event->file())) { - return; - } - - $this->updateTestStatus(TestStatus::warning()); - } - - public function testTriggeredPhpunitDeprecation(PhpunitDeprecationTriggered $event): void - { - if (!$event->test()->isTestMethod()) { - return; - } - - $this->updateTestStatus(TestStatus::deprecation()); - } - - public function testTriggeredPhpunitError(PhpunitErrorTriggered $event): void - { - if (!$event->test()->isTestMethod()) { - return; - } - - $this->updateTestStatus(TestStatus::error()); - } - - public function testTriggeredPhpunitWarning(PhpunitWarningTriggered $event): void - { - if (!$event->test()->isTestMethod()) { - return; - } - - $this->updateTestStatus(TestStatus::warning()); - } - - /** - * @throws InvalidArgumentException - */ - public function testFinished(Finished $event): void - { - if (!$event->test()->isTestMethod()) { - return; - } - - $test = $event->test(); - - assert($test instanceof TestMethod); - - $this->process($test); - - $this->status = null; - $this->throwable = null; - $this->prepared = false; - } - - /** - * @throws EventFacadeIsSealedException - * @throws UnknownSubscriberTypeException - */ - private function registerSubscribers(Facade $facade): void - { - $facade->registerSubscribers( - new TestConsideredRiskySubscriber($this), - new TestErroredSubscriber($this), - new TestFailedSubscriber($this), - new TestFinishedSubscriber($this), - new TestMarkedIncompleteSubscriber($this), - new TestPassedSubscriber($this), - new TestPreparedSubscriber($this), - new TestSkippedSubscriber($this), - new TestTriggeredDeprecationSubscriber($this), - new TestTriggeredNoticeSubscriber($this), - new TestTriggeredPhpDeprecationSubscriber($this), - new TestTriggeredPhpNoticeSubscriber($this), - new TestTriggeredPhpunitDeprecationSubscriber($this), - new TestTriggeredPhpunitErrorSubscriber($this), - new TestTriggeredPhpunitWarningSubscriber($this), - new TestTriggeredPhpWarningSubscriber($this), - new TestTriggeredWarningSubscriber($this), - ); - } - - private function updateTestStatus(TestStatus $status): void - { - if ($this->status !== null && - $this->status->isMoreImportantThan($status)) { - return; - } - - $this->status = $status; - } - - private function process(TestMethod $test): void - { - if (!isset($this->tests[$test->testDox()->prettifiedClassName()])) { - $this->tests[$test->testDox()->prettifiedClassName()] = []; - } - - $this->tests[$test->testDox()->prettifiedClassName()][] = new TestDoxTestMethod( - $test, - $this->status, - $this->throwable, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/After.php b/vendor/phpunit/phpunit/src/Metadata/After.php deleted file mode 100644 index 8790059..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/After.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class After extends Metadata -{ - /** - * @psalm-assert-if-true After $this - */ - public function isAfter(): bool - { - return true; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/AfterClass.php b/vendor/phpunit/phpunit/src/Metadata/AfterClass.php deleted file mode 100644 index 16bb5cc..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/AfterClass.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class AfterClass extends Metadata -{ - /** - * @psalm-assert-if-true AfterClass $this - */ - public function isAfterClass(): bool - { - return true; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/Api/CodeCoverage.php b/vendor/phpunit/phpunit/src/Metadata/Api/CodeCoverage.php deleted file mode 100644 index d09abbf..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/Api/CodeCoverage.php +++ /dev/null @@ -1,317 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata\Api; - -use function array_unique; -use function array_values; -use function assert; -use function count; -use function interface_exists; -use function sprintf; -use function str_starts_with; -use PHPUnit\Framework\CodeCoverageException; -use PHPUnit\Framework\InvalidCoversTargetException; -use PHPUnit\Framework\TestSuite; -use PHPUnit\Metadata\Covers; -use PHPUnit\Metadata\CoversClass; -use PHPUnit\Metadata\CoversDefaultClass; -use PHPUnit\Metadata\CoversFunction; -use PHPUnit\Metadata\IgnoreClassForCodeCoverage; -use PHPUnit\Metadata\IgnoreFunctionForCodeCoverage; -use PHPUnit\Metadata\IgnoreMethodForCodeCoverage; -use PHPUnit\Metadata\Parser\Registry; -use PHPUnit\Metadata\Uses; -use PHPUnit\Metadata\UsesClass; -use PHPUnit\Metadata\UsesDefaultClass; -use PHPUnit\Metadata\UsesFunction; -use RecursiveIteratorIterator; -use SebastianBergmann\CodeUnit\CodeUnitCollection; -use SebastianBergmann\CodeUnit\Exception as CodeUnitException; -use SebastianBergmann\CodeUnit\InvalidCodeUnitException; -use SebastianBergmann\CodeUnit\Mapper; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class CodeCoverage -{ - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - * - * @throws CodeCoverageException - * - * @psalm-return array>|false - */ - public function linesToBeCovered(string $className, string $methodName): array|false - { - if (!$this->shouldCodeCoverageBeCollectedFor($className, $methodName)) { - return false; - } - - $metadataForClass = Registry::parser()->forClass($className); - $classShortcut = null; - - if ($metadataForClass->isCoversDefaultClass()->isNotEmpty()) { - if (count($metadataForClass->isCoversDefaultClass()) > 1) { - throw new CodeCoverageException( - sprintf( - 'More than one @coversDefaultClass annotation for class or interface "%s"', - $className, - ), - ); - } - - $metadata = $metadataForClass->isCoversDefaultClass()->asArray()[0]; - - assert($metadata instanceof CoversDefaultClass); - - $classShortcut = $metadata->className(); - } - - $codeUnits = CodeUnitCollection::fromList(); - $mapper = new Mapper; - - foreach (Registry::parser()->forClassAndMethod($className, $methodName) as $metadata) { - if (!$metadata->isCoversClass() && !$metadata->isCoversFunction() && !$metadata->isCovers()) { - continue; - } - - assert($metadata instanceof CoversClass || $metadata instanceof CoversFunction || $metadata instanceof Covers); - - if ($metadata->isCoversClass() || $metadata->isCoversFunction()) { - $codeUnits = $codeUnits->mergeWith($this->mapToCodeUnits($metadata)); - } elseif ($metadata->isCovers()) { - assert($metadata instanceof Covers); - - $target = $metadata->target(); - - if (interface_exists($target)) { - throw new InvalidCoversTargetException( - sprintf( - 'Trying to @cover interface "%s".', - $target, - ), - ); - } - - if ($classShortcut !== null && str_starts_with($target, '::')) { - $target = $classShortcut . $target; - } - - try { - $codeUnits = $codeUnits->mergeWith($mapper->stringToCodeUnits($target)); - } catch (InvalidCodeUnitException $e) { - throw new InvalidCoversTargetException( - sprintf( - '"@covers %s" is invalid', - $target, - ), - $e->getCode(), - $e, - ); - } - } - } - - return $mapper->codeUnitsToSourceLines($codeUnits); - } - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - * - * @throws CodeCoverageException - * - * @psalm-return array> - */ - public function linesToBeUsed(string $className, string $methodName): array - { - $metadataForClass = Registry::parser()->forClass($className); - $classShortcut = null; - - if ($metadataForClass->isUsesDefaultClass()->isNotEmpty()) { - if (count($metadataForClass->isUsesDefaultClass()) > 1) { - throw new CodeCoverageException( - sprintf( - 'More than one @usesDefaultClass annotation for class or interface "%s"', - $className, - ), - ); - } - - $metadata = $metadataForClass->isUsesDefaultClass()->asArray()[0]; - - assert($metadata instanceof UsesDefaultClass); - - $classShortcut = $metadata->className(); - } - - $codeUnits = CodeUnitCollection::fromList(); - $mapper = new Mapper; - - foreach (Registry::parser()->forClassAndMethod($className, $methodName) as $metadata) { - if (!$metadata->isUsesClass() && !$metadata->isUsesFunction() && !$metadata->isUses()) { - continue; - } - - assert($metadata instanceof UsesClass || $metadata instanceof UsesFunction || $metadata instanceof Uses); - - if ($metadata->isUsesClass() || $metadata->isUsesFunction()) { - $codeUnits = $codeUnits->mergeWith($this->mapToCodeUnits($metadata)); - } elseif ($metadata->isUses()) { - assert($metadata instanceof Uses); - - $target = $metadata->target(); - - if ($classShortcut !== null && str_starts_with($target, '::')) { - $target = $classShortcut . $target; - } - - try { - $codeUnits = $codeUnits->mergeWith($mapper->stringToCodeUnits($target)); - } catch (InvalidCodeUnitException $e) { - throw new InvalidCoversTargetException( - sprintf( - '"@uses %s" is invalid', - $target, - ), - $e->getCode(), - $e, - ); - } - } - } - - return $mapper->codeUnitsToSourceLines($codeUnits); - } - - /** - * @psalm-return array> - */ - public function linesToBeIgnored(TestSuite $testSuite): array - { - $codeUnits = CodeUnitCollection::fromList(); - $mapper = new Mapper; - - foreach ($this->testCaseClassesIn($testSuite) as $testCaseClassName) { - $codeUnits = $codeUnits->mergeWith( - $this->codeUnitsIgnoredBy($testCaseClassName), - ); - } - - return $mapper->codeUnitsToSourceLines($codeUnits); - } - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - */ - public function shouldCodeCoverageBeCollectedFor(string $className, string $methodName): bool - { - $metadataForClass = Registry::parser()->forClass($className); - $metadataForMethod = Registry::parser()->forMethod($className, $methodName); - - if ($metadataForMethod->isCoversNothing()->isNotEmpty()) { - return false; - } - - if ($metadataForMethod->isCovers()->isNotEmpty() || - $metadataForMethod->isCoversClass()->isNotEmpty() || - $metadataForMethod->isCoversFunction()->isNotEmpty()) { - return true; - } - - if ($metadataForClass->isCoversNothing()->isNotEmpty()) { - return false; - } - - return true; - } - - /** - * @psalm-return list - */ - private function testCaseClassesIn(TestSuite $testSuite): array - { - $classNames = []; - - foreach (new RecursiveIteratorIterator($testSuite) as $test) { - $classNames[] = $test::class; - } - - return array_values(array_unique($classNames)); - } - - /** - * @psalm-param class-string $className - */ - private function codeUnitsIgnoredBy(string $className): CodeUnitCollection - { - $codeUnits = CodeUnitCollection::fromList(); - $mapper = new Mapper; - - foreach (Registry::parser()->forClass($className) as $metadata) { - if ($metadata instanceof IgnoreClassForCodeCoverage) { - $codeUnits = $codeUnits->mergeWith( - $mapper->stringToCodeUnits($metadata->className()), - ); - } - - if ($metadata instanceof IgnoreMethodForCodeCoverage) { - $codeUnits = $codeUnits->mergeWith( - $mapper->stringToCodeUnits($metadata->className() . '::' . $metadata->methodName()), - ); - } - - if ($metadata instanceof IgnoreFunctionForCodeCoverage) { - $codeUnits = $codeUnits->mergeWith( - $mapper->stringToCodeUnits('::' . $metadata->functionName()), - ); - } - } - - return $codeUnits; - } - - /** - * @throws InvalidCoversTargetException - */ - private function mapToCodeUnits(CoversClass|CoversFunction|UsesClass|UsesFunction $metadata): CodeUnitCollection - { - $mapper = new Mapper; - - try { - return $mapper->stringToCodeUnits($metadata->asStringForCodeUnitMapper()); - } catch (CodeUnitException $e) { - if ($metadata->isCoversClass() || $metadata->isUsesClass()) { - if (interface_exists($metadata->className())) { - $type = 'Interface'; - } else { - $type = 'Class'; - } - } else { - $type = 'Function'; - } - - throw new InvalidCoversTargetException( - sprintf( - '%s "%s" is not a valid target for code coverage', - $type, - $metadata->asStringForCodeUnitMapper(), - ), - $e->getCode(), - $e, - ); - } - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/Api/DataProvider.php b/vendor/phpunit/phpunit/src/Metadata/Api/DataProvider.php deleted file mode 100644 index 6dab314..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/Api/DataProvider.php +++ /dev/null @@ -1,327 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata\Api; - -use const JSON_ERROR_NONE; -use const PREG_OFFSET_CAPTURE; -use function array_key_exists; -use function assert; -use function explode; -use function get_debug_type; -use function is_array; -use function is_int; -use function is_string; -use function json_decode; -use function json_last_error; -use function json_last_error_msg; -use function preg_match; -use function preg_replace; -use function rtrim; -use function sprintf; -use function str_replace; -use function strlen; -use function substr; -use function trim; -use PHPUnit\Event; -use PHPUnit\Event\Code\TestMethod; -use PHPUnit\Event\TestData\MoreThanOneDataSetFromDataProviderException; -use PHPUnit\Event\TestData\TestDataCollection; -use PHPUnit\Framework\InvalidDataProviderException; -use PHPUnit\Metadata\DataProvider as DataProviderMetadata; -use PHPUnit\Metadata\MetadataCollection; -use PHPUnit\Metadata\Parser\Registry as MetadataRegistry; -use PHPUnit\Metadata\TestWith; -use PHPUnit\Util\Reflection; -use PHPUnit\Util\Test; -use ReflectionClass; -use ReflectionMethod; -use Throwable; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class DataProvider -{ - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - * - * @throws InvalidDataProviderException - */ - public function providedData(string $className, string $methodName): ?array - { - $dataProvider = MetadataRegistry::parser()->forMethod($className, $methodName)->isDataProvider(); - $testWith = MetadataRegistry::parser()->forMethod($className, $methodName)->isTestWith(); - - if ($dataProvider->isEmpty() && $testWith->isEmpty()) { - return $this->dataProvidedByTestWithAnnotation($className, $methodName); - } - - if ($dataProvider->isNotEmpty()) { - $data = $this->dataProvidedByMethods($className, $methodName, $dataProvider); - } else { - $data = $this->dataProvidedByMetadata($testWith); - } - - if ($data === []) { - throw new InvalidDataProviderException( - 'Empty data set provided by data provider', - ); - } - - foreach ($data as $key => $value) { - if (!is_array($value)) { - throw new InvalidDataProviderException( - sprintf( - 'Data set %s is invalid', - is_int($key) ? '#' . $key : '"' . $key . '"', - ), - ); - } - } - - return $data; - } - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - * - * @throws InvalidDataProviderException - */ - private function dataProvidedByMethods(string $className, string $methodName, MetadataCollection $dataProvider): array - { - $testMethod = new Event\Code\ClassMethod($className, $methodName); - $methodsCalled = []; - $result = []; - - foreach ($dataProvider as $_dataProvider) { - assert($_dataProvider instanceof DataProviderMetadata); - - $dataProviderMethod = new Event\Code\ClassMethod($_dataProvider->className(), $_dataProvider->methodName()); - - Event\Facade::emitter()->dataProviderMethodCalled( - $testMethod, - $dataProviderMethod, - ); - - $methodsCalled[] = $dataProviderMethod; - - try { - $class = new ReflectionClass($_dataProvider->className()); - $method = $class->getMethod($_dataProvider->methodName()); - - if (Test::isTestMethod($method)) { - Event\Facade::emitter()->testRunnerTriggeredPhpunitWarning( - sprintf( - 'Method %s::%s() used by test method %s::%s() is also a test method', - $_dataProvider->className(), - $_dataProvider->methodName(), - $className, - $methodName, - ), - ); - } - - $object = null; - - if (!$method->isPublic()) { - Event\Facade::emitter()->testTriggeredPhpunitDeprecation( - $this->valueObjectForTestMethodWithoutTestData( - $className, - $methodName, - ), - sprintf( - 'Data Provider method %s::%s() is not public', - $_dataProvider->className(), - $_dataProvider->methodName(), - ), - ); - } - - if (!$method->isStatic()) { - Event\Facade::emitter()->testTriggeredPhpunitDeprecation( - $this->valueObjectForTestMethodWithoutTestData( - $className, - $methodName, - ), - sprintf( - 'Data Provider method %s::%s() is not static', - $_dataProvider->className(), - $_dataProvider->methodName(), - ), - ); - - $object = $class->newInstanceWithoutConstructor(); - } - - if ($method->getNumberOfParameters() === 0) { - $data = $method->invoke($object); - } else { - Event\Facade::emitter()->testTriggeredPhpunitDeprecation( - $this->valueObjectForTestMethodWithoutTestData( - $className, - $methodName, - ), - sprintf( - 'Data Provider method %s::%s() expects an argument', - $_dataProvider->className(), - $_dataProvider->methodName(), - ), - ); - - $data = $method->invoke($object, $_dataProvider->methodName()); - } - } catch (Throwable $e) { - Event\Facade::emitter()->dataProviderMethodFinished( - $testMethod, - ...$methodsCalled, - ); - - throw new InvalidDataProviderException( - $e->getMessage(), - $e->getCode(), - $e, - ); - } - - foreach ($data as $key => $value) { - if (is_int($key)) { - $result[] = $value; - } elseif (is_string($key)) { - if (array_key_exists($key, $result)) { - Event\Facade::emitter()->dataProviderMethodFinished( - $testMethod, - ...$methodsCalled, - ); - - throw new InvalidDataProviderException( - sprintf( - 'The key "%s" has already been defined by a previous data provider', - $key, - ), - ); - } - - $result[$key] = $value; - } else { - throw new InvalidDataProviderException( - sprintf( - 'The key must be an integer or a string, %s given', - get_debug_type($key), - ), - ); - } - } - } - - Event\Facade::emitter()->dataProviderMethodFinished( - $testMethod, - ...$methodsCalled, - ); - - return $result; - } - - private function dataProvidedByMetadata(MetadataCollection $testWith): array - { - $result = []; - - foreach ($testWith as $_testWith) { - assert($_testWith instanceof TestWith); - - $result[] = $_testWith->data(); - } - - return $result; - } - - /** - * @psalm-param class-string $className - * - * @throws InvalidDataProviderException - */ - private function dataProvidedByTestWithAnnotation(string $className, string $methodName): ?array - { - $docComment = (new ReflectionMethod($className, $methodName))->getDocComment(); - - if ($docComment === false) { - return null; - } - - $docComment = str_replace("\r\n", "\n", $docComment); - $docComment = preg_replace('/\n\s*\*\s?/', "\n", $docComment); - $docComment = substr($docComment, 0, -1); - $docComment = rtrim($docComment, "\n"); - - if (!preg_match('/@testWith\s+/', $docComment, $matches, PREG_OFFSET_CAPTURE)) { - return null; - } - - $offset = strlen($matches[0][0]) + (int) $matches[0][1]; - $annotationContent = substr($docComment, $offset); - $data = []; - - foreach (explode("\n", $annotationContent) as $candidateRow) { - $candidateRow = trim($candidateRow); - - if ($candidateRow === '' || $candidateRow[0] !== '[') { - break; - } - - $dataSet = json_decode($candidateRow, true); - - if (json_last_error() !== JSON_ERROR_NONE) { - throw new InvalidDataProviderException( - 'The data set for the @testWith annotation cannot be parsed: ' . json_last_error_msg(), - ); - } - - $data[] = $dataSet; - } - - if (!$data) { - throw new InvalidDataProviderException( - 'The data set for the @testWith annotation cannot be parsed.', - ); - } - - return $data; - } - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - * - * @throws MoreThanOneDataSetFromDataProviderException - */ - private function valueObjectForTestMethodWithoutTestData(string $className, string $methodName): TestMethod - { - $location = Reflection::sourceLocationFor($className, $methodName); - - return new TestMethod( - $className, - $methodName, - $location['file'], - $location['line'], - Event\Code\TestDoxBuilder::fromClassNameAndMethodName( - $className, - $methodName, - ), - MetadataRegistry::parser()->forClassAndMethod( - $className, - $methodName, - ), - TestDataCollection::fromArray([]), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/Api/Dependencies.php b/vendor/phpunit/phpunit/src/Metadata/Api/Dependencies.php deleted file mode 100644 index 1b20df9..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/Api/Dependencies.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata\Api; - -use function assert; -use PHPUnit\Framework\ExecutionOrderDependency; -use PHPUnit\Metadata\DependsOnClass; -use PHPUnit\Metadata\DependsOnMethod; -use PHPUnit\Metadata\Parser\Registry; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Dependencies -{ - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - * - * @psalm-return list - */ - public static function dependencies(string $className, string $methodName): array - { - $dependencies = []; - - foreach (Registry::parser()->forClassAndMethod($className, $methodName)->isDepends() as $metadata) { - if ($metadata->isDependsOnClass()) { - assert($metadata instanceof DependsOnClass); - - $dependencies[] = ExecutionOrderDependency::forClass($metadata); - - continue; - } - - assert($metadata instanceof DependsOnMethod); - - if (empty($metadata->methodName())) { - $dependencies[] = ExecutionOrderDependency::invalid(); - - continue; - } - - $dependencies[] = ExecutionOrderDependency::forMethod($metadata); - } - - return $dependencies; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/Api/Groups.php b/vendor/phpunit/phpunit/src/Metadata/Api/Groups.php deleted file mode 100644 index dca8ef6..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/Api/Groups.php +++ /dev/null @@ -1,132 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata\Api; - -use function array_flip; -use function array_key_exists; -use function array_unique; -use function assert; -use function strtolower; -use function trim; -use PHPUnit\Framework\TestSize\TestSize; -use PHPUnit\Metadata\Covers; -use PHPUnit\Metadata\CoversClass; -use PHPUnit\Metadata\CoversFunction; -use PHPUnit\Metadata\Group; -use PHPUnit\Metadata\Parser\Registry; -use PHPUnit\Metadata\Uses; -use PHPUnit\Metadata\UsesClass; -use PHPUnit\Metadata\UsesFunction; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Groups -{ - /** - * @var array> - */ - private static array $groupCache = []; - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - * - * @psalm-return array - */ - public function groups(string $className, string $methodName, bool $includeVirtual = true): array - { - $key = $className . '::' . $methodName . '::' . $includeVirtual; - - if (array_key_exists($key, self::$groupCache)) { - return self::$groupCache[$key]; - } - - $groups = []; - - foreach (Registry::parser()->forClassAndMethod($className, $methodName)->isGroup() as $group) { - assert($group instanceof Group); - - $groups[] = $group->groupName(); - } - - if ($groups === []) { - $groups[] = 'default'; - } - - if (!$includeVirtual) { - return self::$groupCache[$key] = array_unique($groups); - } - - foreach (Registry::parser()->forClassAndMethod($className, $methodName) as $metadata) { - if ($metadata->isCoversClass() || $metadata->isCoversFunction()) { - assert($metadata instanceof CoversClass || $metadata instanceof CoversFunction); - - $groups[] = '__phpunit_covers_' . $this->canonicalizeName($metadata->asStringForCodeUnitMapper()); - - continue; - } - - if ($metadata->isCovers()) { - assert($metadata instanceof Covers); - - $groups[] = '__phpunit_covers_' . $this->canonicalizeName($metadata->target()); - - continue; - } - - if ($metadata->isUsesClass() || $metadata->isUsesFunction()) { - assert($metadata instanceof UsesClass || $metadata instanceof UsesFunction); - - $groups[] = '__phpunit_uses_' . $this->canonicalizeName($metadata->asStringForCodeUnitMapper()); - - continue; - } - - if ($metadata->isUses()) { - assert($metadata instanceof Uses); - - $groups[] = '__phpunit_uses_' . $this->canonicalizeName($metadata->target()); - } - } - - return self::$groupCache[$key] = array_unique($groups); - } - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - */ - public function size(string $className, string $methodName): TestSize - { - $groups = array_flip($this->groups($className, $methodName)); - - if (isset($groups['large'])) { - return TestSize::large(); - } - - if (isset($groups['medium'])) { - return TestSize::medium(); - } - - if (isset($groups['small'])) { - return TestSize::small(); - } - - return TestSize::unknown(); - } - - private function canonicalizeName(string $name): string - { - return strtolower(trim($name, '\\')); - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/Api/HookMethods.php b/vendor/phpunit/phpunit/src/Metadata/Api/HookMethods.php deleted file mode 100644 index 89b8c2c..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/Api/HookMethods.php +++ /dev/null @@ -1,108 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata\Api; - -use function array_unshift; -use function assert; -use function class_exists; -use PHPUnit\Metadata\Parser\Registry; -use PHPUnit\Util\Reflection; -use ReflectionClass; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class HookMethods -{ - /** - * @psalm-var array, before: list, preCondition: list, postCondition: list, after: list, afterClass: list}> - */ - private static array $hookMethods = []; - - /** - * @psalm-param class-string $className - * - * @psalm-return array{beforeClass: list, before: list, preCondition: list, postCondition: list, after: list, afterClass: list} - */ - public function hookMethods(string $className): array - { - if (!class_exists($className)) { - return self::emptyHookMethodsArray(); - } - - if (isset(self::$hookMethods[$className])) { - return self::$hookMethods[$className]; - } - - self::$hookMethods[$className] = self::emptyHookMethodsArray(); - - foreach (Reflection::methodsInTestClass(new ReflectionClass($className)) as $method) { - $methodName = $method->getName(); - - assert(!empty($methodName)); - - $metadata = Registry::parser()->forMethod($className, $methodName); - - if ($method->isStatic()) { - if ($metadata->isBeforeClass()->isNotEmpty()) { - array_unshift( - self::$hookMethods[$className]['beforeClass'], - $methodName, - ); - } - - if ($metadata->isAfterClass()->isNotEmpty()) { - self::$hookMethods[$className]['afterClass'][] = $methodName; - } - } - - if ($metadata->isBefore()->isNotEmpty()) { - array_unshift( - self::$hookMethods[$className]['before'], - $methodName, - ); - } - - if ($metadata->isPreCondition()->isNotEmpty()) { - array_unshift( - self::$hookMethods[$className]['preCondition'], - $methodName, - ); - } - - if ($metadata->isPostCondition()->isNotEmpty()) { - self::$hookMethods[$className]['postCondition'][] = $methodName; - } - - if ($metadata->isAfter()->isNotEmpty()) { - self::$hookMethods[$className]['after'][] = $methodName; - } - } - - return self::$hookMethods[$className]; - } - - /** - * @psalm-return array{beforeClass: list, before: list, preCondition: list, postCondition: list, after: list, afterClass: list} - */ - private function emptyHookMethodsArray(): array - { - return [ - 'beforeClass' => ['setUpBeforeClass'], - 'before' => ['setUp'], - 'preCondition' => ['assertPreConditions'], - 'postCondition' => ['assertPostConditions'], - 'after' => ['tearDown'], - 'afterClass' => ['tearDownAfterClass'], - ]; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/Api/Requirements.php b/vendor/phpunit/phpunit/src/Metadata/Api/Requirements.php deleted file mode 100644 index 922421f..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/Api/Requirements.php +++ /dev/null @@ -1,154 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata\Api; - -use const PHP_OS; -use const PHP_OS_FAMILY; -use const PHP_VERSION; -use function addcslashes; -use function assert; -use function extension_loaded; -use function function_exists; -use function ini_get; -use function method_exists; -use function phpversion; -use function preg_match; -use function sprintf; -use PHPUnit\Metadata\Parser\Registry; -use PHPUnit\Metadata\RequiresFunction; -use PHPUnit\Metadata\RequiresMethod; -use PHPUnit\Metadata\RequiresOperatingSystem; -use PHPUnit\Metadata\RequiresOperatingSystemFamily; -use PHPUnit\Metadata\RequiresPhp; -use PHPUnit\Metadata\RequiresPhpExtension; -use PHPUnit\Metadata\RequiresPhpunit; -use PHPUnit\Metadata\RequiresSetting; -use PHPUnit\Runner\Version; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Requirements -{ - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - * - * @psalm-return list - */ - public function requirementsNotSatisfiedFor(string $className, string $methodName): array - { - $notSatisfied = []; - - foreach (Registry::parser()->forClassAndMethod($className, $methodName) as $metadata) { - if ($metadata->isRequiresPhp()) { - assert($metadata instanceof RequiresPhp); - - if (!$metadata->versionRequirement()->isSatisfiedBy(PHP_VERSION)) { - $notSatisfied[] = sprintf( - 'PHP %s is required.', - $metadata->versionRequirement()->asString(), - ); - } - } - - if ($metadata->isRequiresPhpExtension()) { - assert($metadata instanceof RequiresPhpExtension); - - if (!extension_loaded($metadata->extension()) || - ($metadata->hasVersionRequirement() && - !$metadata->versionRequirement()->isSatisfiedBy(phpversion($metadata->extension())))) { - $notSatisfied[] = sprintf( - 'PHP extension %s%s is required.', - $metadata->extension(), - $metadata->hasVersionRequirement() ? (' ' . $metadata->versionRequirement()->asString()) : '', - ); - } - } - - if ($metadata->isRequiresPhpunit()) { - assert($metadata instanceof RequiresPhpunit); - - if (!$metadata->versionRequirement()->isSatisfiedBy(Version::id())) { - $notSatisfied[] = sprintf( - 'PHPUnit %s is required.', - $metadata->versionRequirement()->asString(), - ); - } - } - - if ($metadata->isRequiresOperatingSystemFamily()) { - assert($metadata instanceof RequiresOperatingSystemFamily); - - if ($metadata->operatingSystemFamily() !== PHP_OS_FAMILY) { - $notSatisfied[] = sprintf( - 'Operating system %s is required.', - $metadata->operatingSystemFamily(), - ); - } - } - - if ($metadata->isRequiresOperatingSystem()) { - assert($metadata instanceof RequiresOperatingSystem); - - $pattern = sprintf( - '/%s/i', - addcslashes($metadata->operatingSystem(), '/'), - ); - - if (!preg_match($pattern, PHP_OS)) { - $notSatisfied[] = sprintf( - 'Operating system %s is required.', - $metadata->operatingSystem(), - ); - } - } - - if ($metadata->isRequiresFunction()) { - assert($metadata instanceof RequiresFunction); - - if (!function_exists($metadata->functionName())) { - $notSatisfied[] = sprintf( - 'Function %s() is required.', - $metadata->functionName(), - ); - } - } - - if ($metadata->isRequiresMethod()) { - assert($metadata instanceof RequiresMethod); - - if (!method_exists($metadata->className(), $metadata->methodName())) { - $notSatisfied[] = sprintf( - 'Method %s::%s() is required.', - $metadata->className(), - $metadata->methodName(), - ); - } - } - - if ($metadata->isRequiresSetting()) { - assert($metadata instanceof RequiresSetting); - - if (ini_get($metadata->setting()) !== $metadata->value()) { - $notSatisfied[] = sprintf( - 'Setting "%s" is required to be "%s".', - $metadata->setting(), - $metadata->value(), - ); - } - } - } - - return $notSatisfied; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/BackupGlobals.php b/vendor/phpunit/phpunit/src/Metadata/BackupGlobals.php deleted file mode 100644 index b6c485c..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/BackupGlobals.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class BackupGlobals extends Metadata -{ - private readonly bool $enabled; - - /** - * @psalm-param 0|1 $level - */ - protected function __construct(int $level, bool $enabled) - { - parent::__construct($level); - - $this->enabled = $enabled; - } - - /** - * @psalm-assert-if-true BackupGlobals $this - */ - public function isBackupGlobals(): bool - { - return true; - } - - public function enabled(): bool - { - return $this->enabled; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/BackupStaticProperties.php b/vendor/phpunit/phpunit/src/Metadata/BackupStaticProperties.php deleted file mode 100644 index 30cb9c4..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/BackupStaticProperties.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class BackupStaticProperties extends Metadata -{ - private readonly bool $enabled; - - /** - * @psalm-param 0|1 $level - */ - protected function __construct(int $level, bool $enabled) - { - parent::__construct($level); - - $this->enabled = $enabled; - } - - /** - * @psalm-assert-if-true BackupStaticProperties $this - */ - public function isBackupStaticProperties(): bool - { - return true; - } - - public function enabled(): bool - { - return $this->enabled; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/Before.php b/vendor/phpunit/phpunit/src/Metadata/Before.php deleted file mode 100644 index 08a72b4..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/Before.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class Before extends Metadata -{ - /** - * @psalm-assert-if-true Before $this - */ - public function isBefore(): bool - { - return true; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/BeforeClass.php b/vendor/phpunit/phpunit/src/Metadata/BeforeClass.php deleted file mode 100644 index 9ae35e5..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/BeforeClass.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class BeforeClass extends Metadata -{ - /** - * @psalm-assert-if-true BeforeClass $this - */ - public function isBeforeClass(): bool - { - return true; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/Covers.php b/vendor/phpunit/phpunit/src/Metadata/Covers.php deleted file mode 100644 index b4c7234..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/Covers.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class Covers extends Metadata -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $target; - - /** - * @psalm-param 0|1 $level - * @psalm-param non-empty-string $target - */ - protected function __construct(int $level, string $target) - { - parent::__construct($level); - - $this->target = $target; - } - - /** - * @psalm-assert-if-true Covers $this - */ - public function isCovers(): bool - { - return true; - } - - /** - * @psalm-return non-empty-string - */ - public function target(): string - { - return $this->target; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/CoversClass.php b/vendor/phpunit/phpunit/src/Metadata/CoversClass.php deleted file mode 100644 index 22889ad..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/CoversClass.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class CoversClass extends Metadata -{ - /** - * @psalm-var class-string - */ - private readonly string $className; - - /** - * @psalm-param 0|1 $level - * @psalm-param class-string $className - */ - protected function __construct(int $level, string $className) - { - parent::__construct($level); - - $this->className = $className; - } - - /** - * @psalm-assert-if-true CoversClass $this - */ - public function isCoversClass(): bool - { - return true; - } - - /** - * @psalm-return class-string - */ - public function className(): string - { - return $this->className; - } - - /** - * @psalm-return class-string - * - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function asStringForCodeUnitMapper(): string - { - return $this->className; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/CoversDefaultClass.php b/vendor/phpunit/phpunit/src/Metadata/CoversDefaultClass.php deleted file mode 100644 index 3f7b57c..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/CoversDefaultClass.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class CoversDefaultClass extends Metadata -{ - /** - * @psalm-var class-string - */ - private readonly string $className; - - /** - * @psalm-param 0|1 $level - * @psalm-param class-string $className - */ - protected function __construct(int $level, string $className) - { - parent::__construct($level); - - $this->className = $className; - } - - /** - * @psalm-assert-if-true CoversDefaultClass $this - */ - public function isCoversDefaultClass(): bool - { - return true; - } - - /** - * @psalm-return class-string - */ - public function className(): string - { - return $this->className; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/CoversFunction.php b/vendor/phpunit/phpunit/src/Metadata/CoversFunction.php deleted file mode 100644 index ee9f858..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/CoversFunction.php +++ /dev/null @@ -1,58 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class CoversFunction extends Metadata -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $functionName; - - /** - * @psalm-param 0|1 $level - * @psalm-param non-empty-string $functionName - */ - protected function __construct(int $level, string $functionName) - { - parent::__construct($level); - - $this->functionName = $functionName; - } - - /** - * @psalm-assert-if-true CoversFunction $this - */ - public function isCoversFunction(): bool - { - return true; - } - - /** - * @psalm-return non-empty-string - */ - public function functionName(): string - { - return $this->functionName; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function asStringForCodeUnitMapper(): string - { - return '::' . $this->functionName; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/CoversNothing.php b/vendor/phpunit/phpunit/src/Metadata/CoversNothing.php deleted file mode 100644 index 4703964..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/CoversNothing.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class CoversNothing extends Metadata -{ - /** - * @psalm-assert-if-true CoversNothing $this - */ - public function isCoversNothing(): bool - { - return true; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/DataProvider.php b/vendor/phpunit/phpunit/src/Metadata/DataProvider.php deleted file mode 100644 index d1a0bfd..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/DataProvider.php +++ /dev/null @@ -1,65 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class DataProvider extends Metadata -{ - /** - * @psalm-var class-string - */ - private readonly string $className; - - /** - * @psalm-var non-empty-string - */ - private readonly string $methodName; - - /** - * @psalm-param 0|1 $level - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - */ - protected function __construct(int $level, string $className, string $methodName) - { - parent::__construct($level); - - $this->className = $className; - $this->methodName = $methodName; - } - - /** - * @psalm-assert-if-true DataProvider $this - */ - public function isDataProvider(): bool - { - return true; - } - - /** - * @psalm-return class-string - */ - public function className(): string - { - return $this->className; - } - - /** - * @psalm-return non-empty-string - */ - public function methodName(): string - { - return $this->methodName; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/DependsOnClass.php b/vendor/phpunit/phpunit/src/Metadata/DependsOnClass.php deleted file mode 100644 index c146afd..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/DependsOnClass.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class DependsOnClass extends Metadata -{ - /** - * @psalm-var class-string - */ - private readonly string $className; - private readonly bool $deepClone; - private readonly bool $shallowClone; - - /** - * @psalm-param 0|1 $level - * @psalm-param class-string $className - */ - protected function __construct(int $level, string $className, bool $deepClone, bool $shallowClone) - { - parent::__construct($level); - - $this->className = $className; - $this->deepClone = $deepClone; - $this->shallowClone = $shallowClone; - } - - /** - * @psalm-assert-if-true DependsOnClass $this - */ - public function isDependsOnClass(): bool - { - return true; - } - - /** - * @psalm-return class-string - */ - public function className(): string - { - return $this->className; - } - - public function deepClone(): bool - { - return $this->deepClone; - } - - public function shallowClone(): bool - { - return $this->shallowClone; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/DependsOnMethod.php b/vendor/phpunit/phpunit/src/Metadata/DependsOnMethod.php deleted file mode 100644 index 1db27c7..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/DependsOnMethod.php +++ /dev/null @@ -1,79 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class DependsOnMethod extends Metadata -{ - /** - * @psalm-var class-string - */ - private readonly string $className; - - /** - * @psalm-var non-empty-string - */ - private readonly string $methodName; - private readonly bool $deepClone; - private readonly bool $shallowClone; - - /** - * @psalm-param 0|1 $level - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - */ - protected function __construct(int $level, string $className, string $methodName, bool $deepClone, bool $shallowClone) - { - parent::__construct($level); - - $this->className = $className; - $this->methodName = $methodName; - $this->deepClone = $deepClone; - $this->shallowClone = $shallowClone; - } - - /** - * @psalm-assert-if-true DependsOnMethod $this - */ - public function isDependsOnMethod(): bool - { - return true; - } - - /** - * @psalm-return class-string - */ - public function className(): string - { - return $this->className; - } - - /** - * @psalm-return non-empty-string - */ - public function methodName(): string - { - return $this->methodName; - } - - public function deepClone(): bool - { - return $this->deepClone; - } - - public function shallowClone(): bool - { - return $this->shallowClone; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/DoesNotPerformAssertions.php b/vendor/phpunit/phpunit/src/Metadata/DoesNotPerformAssertions.php deleted file mode 100644 index 0e1ac0e..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/DoesNotPerformAssertions.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class DoesNotPerformAssertions extends Metadata -{ - /** - * @psalm-assert-if-true DoesNotPerformAssertions $this - */ - public function isDoesNotPerformAssertions(): bool - { - return true; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/Exception/AnnotationsAreNotSupportedForInternalClassesException.php b/vendor/phpunit/phpunit/src/Metadata/Exception/AnnotationsAreNotSupportedForInternalClassesException.php deleted file mode 100644 index ddff62e..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/Exception/AnnotationsAreNotSupportedForInternalClassesException.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -use function sprintf; -use PHPUnit\Exception; -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class AnnotationsAreNotSupportedForInternalClassesException extends RuntimeException implements Exception -{ - /** - * @psalm-param class-string $className - */ - public function __construct(string $className) - { - parent::__construct( - sprintf( - 'Annotations can only be parsed for user-defined classes, trying to parse annotations for class "%s"', - $className, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/Exception/Exception.php b/vendor/phpunit/phpunit/src/Metadata/Exception/Exception.php deleted file mode 100644 index 0faa9b7..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/Exception/Exception.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -interface Exception extends \PHPUnit\Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Metadata/Exception/InvalidAttributeException.php b/vendor/phpunit/phpunit/src/Metadata/Exception/InvalidAttributeException.php deleted file mode 100644 index 9158de3..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/Exception/InvalidAttributeException.php +++ /dev/null @@ -1,45 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -use const PHP_EOL; -use function sprintf; -use PHPUnit\Exception; -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class InvalidAttributeException extends RuntimeException implements Exception -{ - /** - * @param non-empty-string $attributeName - * @param non-empty-string $target - * @param non-empty-string $file - * @param positive-int $line - * @param non-empty-string $message - */ - public function __construct(string $attributeName, string $target, string $file, int $line, string $message) - { - parent::__construct( - sprintf( - 'Invalid attribute %s for %s in %s:%d%s%s', - $attributeName, - $target, - $file, - $line, - PHP_EOL, - $message, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/Exception/InvalidVersionRequirementException.php b/vendor/phpunit/phpunit/src/Metadata/Exception/InvalidVersionRequirementException.php deleted file mode 100644 index cb82e84..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/Exception/InvalidVersionRequirementException.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -use RuntimeException; - -final class InvalidVersionRequirementException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Metadata/Exception/NoVersionRequirementException.php b/vendor/phpunit/phpunit/src/Metadata/Exception/NoVersionRequirementException.php deleted file mode 100644 index 8351067..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/Exception/NoVersionRequirementException.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -use RuntimeException; - -final class NoVersionRequirementException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Metadata/Exception/ReflectionException.php b/vendor/phpunit/phpunit/src/Metadata/Exception/ReflectionException.php deleted file mode 100644 index 04e0d22..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/Exception/ReflectionException.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -use PHPUnit\Exception; -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ReflectionException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Metadata/ExcludeGlobalVariableFromBackup.php b/vendor/phpunit/phpunit/src/Metadata/ExcludeGlobalVariableFromBackup.php deleted file mode 100644 index a096d67..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/ExcludeGlobalVariableFromBackup.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class ExcludeGlobalVariableFromBackup extends Metadata -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $globalVariableName; - - /** - * @psalm-param 0|1 $level - * @psalm-param non-empty-string $globalVariableName - */ - protected function __construct(int $level, string $globalVariableName) - { - parent::__construct($level); - - $this->globalVariableName = $globalVariableName; - } - - /** - * @psalm-assert-if-true ExcludeGlobalVariableFromBackup $this - */ - public function isExcludeGlobalVariableFromBackup(): bool - { - return true; - } - - /** - * @psalm-return non-empty-string - */ - public function globalVariableName(): string - { - return $this->globalVariableName; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/ExcludeStaticPropertyFromBackup.php b/vendor/phpunit/phpunit/src/Metadata/ExcludeStaticPropertyFromBackup.php deleted file mode 100644 index 53a3c52..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/ExcludeStaticPropertyFromBackup.php +++ /dev/null @@ -1,65 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class ExcludeStaticPropertyFromBackup extends Metadata -{ - /** - * @psalm-var class-string - */ - private readonly string $className; - - /** - * @psalm-var non-empty-string - */ - private readonly string $propertyName; - - /** - * @psalm-param 0|1 $level - * @psalm-param class-string $className - * @psalm-param non-empty-string $propertyName - */ - protected function __construct(int $level, string $className, string $propertyName) - { - parent::__construct($level); - - $this->className = $className; - $this->propertyName = $propertyName; - } - - /** - * @psalm-assert-if-true ExcludeStaticPropertyFromBackup $this - */ - public function isExcludeStaticPropertyFromBackup(): bool - { - return true; - } - - /** - * @psalm-return class-string - */ - public function className(): string - { - return $this->className; - } - - /** - * @psalm-return non-empty-string - */ - public function propertyName(): string - { - return $this->propertyName; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/Group.php b/vendor/phpunit/phpunit/src/Metadata/Group.php deleted file mode 100644 index e609d2e..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/Group.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class Group extends Metadata -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $groupName; - - /** - * @psalm-param 0|1 $level - * @psalm-param non-empty-string $groupName - */ - protected function __construct(int $level, string $groupName) - { - parent::__construct($level); - - $this->groupName = $groupName; - } - - /** - * @psalm-assert-if-true Group $this - */ - public function isGroup(): bool - { - return true; - } - - /** - * @psalm-return non-empty-string - */ - public function groupName(): string - { - return $this->groupName; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/IgnoreClassForCodeCoverage.php b/vendor/phpunit/phpunit/src/Metadata/IgnoreClassForCodeCoverage.php deleted file mode 100644 index 5887cca..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/IgnoreClassForCodeCoverage.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5513 - */ -final class IgnoreClassForCodeCoverage extends Metadata -{ - /** - * @psalm-var class-string - */ - private readonly string $className; - - /** - * @psalm-param 0|1 $level - * @psalm-param class-string $className - */ - protected function __construct(int $level, string $className) - { - parent::__construct($level); - - $this->className = $className; - } - - /** - * @psalm-assert-if-true IgnoreClassForCodeCoverage $this - */ - public function isIgnoreClassForCodeCoverage(): bool - { - return true; - } - - /** - * @psalm-return class-string - */ - public function className(): string - { - return $this->className; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/IgnoreDeprecations.php b/vendor/phpunit/phpunit/src/Metadata/IgnoreDeprecations.php deleted file mode 100644 index b84a868..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/IgnoreDeprecations.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class IgnoreDeprecations extends Metadata -{ - /** - * @psalm-assert-if-true IgnoreDeprecations $this - */ - public function isIgnoreDeprecations(): bool - { - return true; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/IgnoreFunctionForCodeCoverage.php b/vendor/phpunit/phpunit/src/Metadata/IgnoreFunctionForCodeCoverage.php deleted file mode 100644 index bc4c9b1..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/IgnoreFunctionForCodeCoverage.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5513 - */ -final class IgnoreFunctionForCodeCoverage extends Metadata -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $functionName; - - /** - * @psalm-param 0|1 $level - * @psalm-param non-empty-string $functionName - */ - protected function __construct(int $level, string $functionName) - { - parent::__construct($level); - - $this->functionName = $functionName; - } - - /** - * @psalm-assert-if-true IgnoreFunctionForCodeCoverage $this - */ - public function isIgnoreFunctionForCodeCoverage(): bool - { - return true; - } - - /** - * @psalm-return non-empty-string - */ - public function functionName(): string - { - return $this->functionName; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/IgnoreMethodForCodeCoverage.php b/vendor/phpunit/phpunit/src/Metadata/IgnoreMethodForCodeCoverage.php deleted file mode 100644 index 398f031..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/IgnoreMethodForCodeCoverage.php +++ /dev/null @@ -1,67 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5513 - */ -final class IgnoreMethodForCodeCoverage extends Metadata -{ - /** - * @psalm-var class-string - */ - private readonly string $className; - - /** - * @psalm-var non-empty-string - */ - private readonly string $methodName; - - /** - * @psalm-param 0|1 $level - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - */ - protected function __construct(int $level, string $className, string $methodName) - { - parent::__construct($level); - - $this->className = $className; - $this->methodName = $methodName; - } - - /** - * @psalm-assert-if-true IgnoreMethodForCodeCoverage $this - */ - public function isIgnoreMethodForCodeCoverage(): bool - { - return true; - } - - /** - * @psalm-return class-string - */ - public function className(): string - { - return $this->className; - } - - /** - * @psalm-return non-empty-string - */ - public function methodName(): string - { - return $this->methodName; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/Metadata.php b/vendor/phpunit/phpunit/src/Metadata/Metadata.php deleted file mode 100644 index a98985f..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/Metadata.php +++ /dev/null @@ -1,835 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -use PHPUnit\Metadata\Version\Requirement; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -abstract class Metadata -{ - private const CLASS_LEVEL = 0; - private const METHOD_LEVEL = 1; - - /** - * @psalm-var 0|1 - */ - private readonly int $level; - - public static function after(): After - { - return new After(self::METHOD_LEVEL); - } - - public static function afterClass(): AfterClass - { - return new AfterClass(self::METHOD_LEVEL); - } - - public static function backupGlobalsOnClass(bool $enabled): BackupGlobals - { - return new BackupGlobals(self::CLASS_LEVEL, $enabled); - } - - public static function backupGlobalsOnMethod(bool $enabled): BackupGlobals - { - return new BackupGlobals(self::METHOD_LEVEL, $enabled); - } - - public static function backupStaticPropertiesOnClass(bool $enabled): BackupStaticProperties - { - return new BackupStaticProperties(self::CLASS_LEVEL, $enabled); - } - - public static function backupStaticPropertiesOnMethod(bool $enabled): BackupStaticProperties - { - return new BackupStaticProperties(self::METHOD_LEVEL, $enabled); - } - - public static function before(): Before - { - return new Before(self::METHOD_LEVEL); - } - - public static function beforeClass(): BeforeClass - { - return new BeforeClass(self::METHOD_LEVEL); - } - - /** - * @psalm-param class-string $className - */ - public static function coversClass(string $className): CoversClass - { - return new CoversClass(self::CLASS_LEVEL, $className); - } - - /** - * @psalm-param non-empty-string $functionName - */ - public static function coversFunction(string $functionName): CoversFunction - { - return new CoversFunction(self::CLASS_LEVEL, $functionName); - } - - /** - * @psalm-param non-empty-string $target - */ - public static function coversOnClass(string $target): Covers - { - return new Covers(self::CLASS_LEVEL, $target); - } - - /** - * @psalm-param non-empty-string $target - */ - public static function coversOnMethod(string $target): Covers - { - return new Covers(self::METHOD_LEVEL, $target); - } - - /** - * @psalm-param class-string $className - */ - public static function coversDefaultClass(string $className): CoversDefaultClass - { - return new CoversDefaultClass(self::CLASS_LEVEL, $className); - } - - public static function coversNothingOnClass(): CoversNothing - { - return new CoversNothing(self::CLASS_LEVEL); - } - - public static function coversNothingOnMethod(): CoversNothing - { - return new CoversNothing(self::METHOD_LEVEL); - } - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - */ - public static function dataProvider(string $className, string $methodName): DataProvider - { - return new DataProvider(self::METHOD_LEVEL, $className, $methodName); - } - - /** - * @psalm-param class-string $className - */ - public static function dependsOnClass(string $className, bool $deepClone, bool $shallowClone): DependsOnClass - { - return new DependsOnClass(self::METHOD_LEVEL, $className, $deepClone, $shallowClone); - } - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - */ - public static function dependsOnMethod(string $className, string $methodName, bool $deepClone, bool $shallowClone): DependsOnMethod - { - return new DependsOnMethod(self::METHOD_LEVEL, $className, $methodName, $deepClone, $shallowClone); - } - - public static function doesNotPerformAssertionsOnClass(): DoesNotPerformAssertions - { - return new DoesNotPerformAssertions(self::CLASS_LEVEL); - } - - public static function doesNotPerformAssertionsOnMethod(): DoesNotPerformAssertions - { - return new DoesNotPerformAssertions(self::METHOD_LEVEL); - } - - /** - * @psalm-param non-empty-string $globalVariableName - */ - public static function excludeGlobalVariableFromBackupOnClass(string $globalVariableName): ExcludeGlobalVariableFromBackup - { - return new ExcludeGlobalVariableFromBackup(self::CLASS_LEVEL, $globalVariableName); - } - - /** - * @psalm-param non-empty-string $globalVariableName - */ - public static function excludeGlobalVariableFromBackupOnMethod(string $globalVariableName): ExcludeGlobalVariableFromBackup - { - return new ExcludeGlobalVariableFromBackup(self::METHOD_LEVEL, $globalVariableName); - } - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $propertyName - */ - public static function excludeStaticPropertyFromBackupOnClass(string $className, string $propertyName): ExcludeStaticPropertyFromBackup - { - return new ExcludeStaticPropertyFromBackup(self::CLASS_LEVEL, $className, $propertyName); - } - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $propertyName - */ - public static function excludeStaticPropertyFromBackupOnMethod(string $className, string $propertyName): ExcludeStaticPropertyFromBackup - { - return new ExcludeStaticPropertyFromBackup(self::METHOD_LEVEL, $className, $propertyName); - } - - /** - * @psalm-param non-empty-string $groupName - */ - public static function groupOnClass(string $groupName): Group - { - return new Group(self::CLASS_LEVEL, $groupName); - } - - /** - * @psalm-param non-empty-string $groupName - */ - public static function groupOnMethod(string $groupName): Group - { - return new Group(self::METHOD_LEVEL, $groupName); - } - - public static function ignoreDeprecationsOnClass(): IgnoreDeprecations - { - return new IgnoreDeprecations(self::CLASS_LEVEL); - } - - public static function ignoreDeprecationsOnMethod(): IgnoreDeprecations - { - return new IgnoreDeprecations(self::METHOD_LEVEL); - } - - /** - * @psalm-param class-string $className - */ - public static function ignoreClassForCodeCoverage(string $className): IgnoreClassForCodeCoverage - { - return new IgnoreClassForCodeCoverage(self::CLASS_LEVEL, $className); - } - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - */ - public static function ignoreMethodForCodeCoverage(string $className, string $methodName): IgnoreMethodForCodeCoverage - { - return new IgnoreMethodForCodeCoverage(self::CLASS_LEVEL, $className, $methodName); - } - - /** - * @psalm-param non-empty-string $functionName - */ - public static function ignoreFunctionForCodeCoverage(string $functionName): IgnoreFunctionForCodeCoverage - { - return new IgnoreFunctionForCodeCoverage(self::CLASS_LEVEL, $functionName); - } - - public static function postCondition(): PostCondition - { - return new PostCondition(self::METHOD_LEVEL); - } - - public static function preCondition(): PreCondition - { - return new PreCondition(self::METHOD_LEVEL); - } - - public static function preserveGlobalStateOnClass(bool $enabled): PreserveGlobalState - { - return new PreserveGlobalState(self::CLASS_LEVEL, $enabled); - } - - public static function preserveGlobalStateOnMethod(bool $enabled): PreserveGlobalState - { - return new PreserveGlobalState(self::METHOD_LEVEL, $enabled); - } - - /** - * @psalm-param non-empty-string $functionName - */ - public static function requiresFunctionOnClass(string $functionName): RequiresFunction - { - return new RequiresFunction(self::CLASS_LEVEL, $functionName); - } - - /** - * @psalm-param non-empty-string $functionName - */ - public static function requiresFunctionOnMethod(string $functionName): RequiresFunction - { - return new RequiresFunction(self::METHOD_LEVEL, $functionName); - } - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - */ - public static function requiresMethodOnClass(string $className, string $methodName): RequiresMethod - { - return new RequiresMethod(self::CLASS_LEVEL, $className, $methodName); - } - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - */ - public static function requiresMethodOnMethod(string $className, string $methodName): RequiresMethod - { - return new RequiresMethod(self::METHOD_LEVEL, $className, $methodName); - } - - /** - * @psalm-param non-empty-string $operatingSystem - */ - public static function requiresOperatingSystemOnClass(string $operatingSystem): RequiresOperatingSystem - { - return new RequiresOperatingSystem(self::CLASS_LEVEL, $operatingSystem); - } - - /** - * @psalm-param non-empty-string $operatingSystem - */ - public static function requiresOperatingSystemOnMethod(string $operatingSystem): RequiresOperatingSystem - { - return new RequiresOperatingSystem(self::METHOD_LEVEL, $operatingSystem); - } - - /** - * @psalm-param non-empty-string $operatingSystemFamily - */ - public static function requiresOperatingSystemFamilyOnClass(string $operatingSystemFamily): RequiresOperatingSystemFamily - { - return new RequiresOperatingSystemFamily(self::CLASS_LEVEL, $operatingSystemFamily); - } - - /** - * @psalm-param non-empty-string $operatingSystemFamily - */ - public static function requiresOperatingSystemFamilyOnMethod(string $operatingSystemFamily): RequiresOperatingSystemFamily - { - return new RequiresOperatingSystemFamily(self::METHOD_LEVEL, $operatingSystemFamily); - } - - public static function requiresPhpOnClass(Requirement $versionRequirement): RequiresPhp - { - return new RequiresPhp(self::CLASS_LEVEL, $versionRequirement); - } - - public static function requiresPhpOnMethod(Requirement $versionRequirement): RequiresPhp - { - return new RequiresPhp(self::METHOD_LEVEL, $versionRequirement); - } - - /** - * @psalm-param non-empty-string $extension - */ - public static function requiresPhpExtensionOnClass(string $extension, ?Requirement $versionRequirement): RequiresPhpExtension - { - return new RequiresPhpExtension(self::CLASS_LEVEL, $extension, $versionRequirement); - } - - /** - * @psalm-param non-empty-string $extension - */ - public static function requiresPhpExtensionOnMethod(string $extension, ?Requirement $versionRequirement): RequiresPhpExtension - { - return new RequiresPhpExtension(self::METHOD_LEVEL, $extension, $versionRequirement); - } - - public static function requiresPhpunitOnClass(Requirement $versionRequirement): RequiresPhpunit - { - return new RequiresPhpunit(self::CLASS_LEVEL, $versionRequirement); - } - - public static function requiresPhpunitOnMethod(Requirement $versionRequirement): RequiresPhpunit - { - return new RequiresPhpunit(self::METHOD_LEVEL, $versionRequirement); - } - - /** - * @psalm-param non-empty-string $setting - * @psalm-param non-empty-string $value - */ - public static function requiresSettingOnClass(string $setting, string $value): RequiresSetting - { - return new RequiresSetting(self::CLASS_LEVEL, $setting, $value); - } - - /** - * @psalm-param non-empty-string $setting - * @psalm-param non-empty-string $value - */ - public static function requiresSettingOnMethod(string $setting, string $value): RequiresSetting - { - return new RequiresSetting(self::METHOD_LEVEL, $setting, $value); - } - - public static function runClassInSeparateProcess(): RunClassInSeparateProcess - { - return new RunClassInSeparateProcess(self::CLASS_LEVEL); - } - - public static function runTestsInSeparateProcesses(): RunTestsInSeparateProcesses - { - return new RunTestsInSeparateProcesses(self::CLASS_LEVEL); - } - - public static function runInSeparateProcess(): RunInSeparateProcess - { - return new RunInSeparateProcess(self::METHOD_LEVEL); - } - - public static function test(): Test - { - return new Test(self::METHOD_LEVEL); - } - - /** - * @psalm-param non-empty-string $text - */ - public static function testDoxOnClass(string $text): TestDox - { - return new TestDox(self::CLASS_LEVEL, $text); - } - - /** - * @psalm-param non-empty-string $text - */ - public static function testDoxOnMethod(string $text): TestDox - { - return new TestDox(self::METHOD_LEVEL, $text); - } - - public static function testWith(mixed $data): TestWith - { - return new TestWith(self::METHOD_LEVEL, $data); - } - - /** - * @psalm-param class-string $className - */ - public static function usesClass(string $className): UsesClass - { - return new UsesClass(self::CLASS_LEVEL, $className); - } - - /** - * @psalm-param non-empty-string $functionName - */ - public static function usesFunction(string $functionName): UsesFunction - { - return new UsesFunction(self::CLASS_LEVEL, $functionName); - } - - /** - * @psalm-param non-empty-string $target - */ - public static function usesOnClass(string $target): Uses - { - return new Uses(self::CLASS_LEVEL, $target); - } - - /** - * @psalm-param non-empty-string $target - */ - public static function usesOnMethod(string $target): Uses - { - return new Uses(self::METHOD_LEVEL, $target); - } - - /** - * @psalm-param class-string $className - */ - public static function usesDefaultClass(string $className): UsesDefaultClass - { - return new UsesDefaultClass(self::CLASS_LEVEL, $className); - } - - public static function withoutErrorHandler(): WithoutErrorHandler - { - return new WithoutErrorHandler(self::METHOD_LEVEL); - } - - /** - * @psalm-param 0|1 $level - */ - protected function __construct(int $level) - { - $this->level = $level; - } - - public function isClassLevel(): bool - { - return $this->level === self::CLASS_LEVEL; - } - - public function isMethodLevel(): bool - { - return $this->level === self::METHOD_LEVEL; - } - - /** - * @psalm-assert-if-true After $this - */ - public function isAfter(): bool - { - return false; - } - - /** - * @psalm-assert-if-true AfterClass $this - */ - public function isAfterClass(): bool - { - return false; - } - - /** - * @psalm-assert-if-true BackupGlobals $this - */ - public function isBackupGlobals(): bool - { - return false; - } - - /** - * @psalm-assert-if-true BackupStaticProperties $this - */ - public function isBackupStaticProperties(): bool - { - return false; - } - - /** - * @psalm-assert-if-true BeforeClass $this - */ - public function isBeforeClass(): bool - { - return false; - } - - /** - * @psalm-assert-if-true Before $this - */ - public function isBefore(): bool - { - return false; - } - - /** - * @psalm-assert-if-true Covers $this - */ - public function isCovers(): bool - { - return false; - } - - /** - * @psalm-assert-if-true CoversClass $this - */ - public function isCoversClass(): bool - { - return false; - } - - /** - * @psalm-assert-if-true CoversDefaultClass $this - */ - public function isCoversDefaultClass(): bool - { - return false; - } - - /** - * @psalm-assert-if-true CoversFunction $this - */ - public function isCoversFunction(): bool - { - return false; - } - - /** - * @psalm-assert-if-true CoversNothing $this - */ - public function isCoversNothing(): bool - { - return false; - } - - /** - * @psalm-assert-if-true DataProvider $this - */ - public function isDataProvider(): bool - { - return false; - } - - /** - * @psalm-assert-if-true DependsOnClass $this - */ - public function isDependsOnClass(): bool - { - return false; - } - - /** - * @psalm-assert-if-true DependsOnMethod $this - */ - public function isDependsOnMethod(): bool - { - return false; - } - - /** - * @psalm-assert-if-true DoesNotPerformAssertions $this - */ - public function isDoesNotPerformAssertions(): bool - { - return false; - } - - /** - * @psalm-assert-if-true ExcludeGlobalVariableFromBackup $this - */ - public function isExcludeGlobalVariableFromBackup(): bool - { - return false; - } - - /** - * @psalm-assert-if-true ExcludeStaticPropertyFromBackup $this - */ - public function isExcludeStaticPropertyFromBackup(): bool - { - return false; - } - - /** - * @psalm-assert-if-true Group $this - */ - public function isGroup(): bool - { - return false; - } - - /** - * @psalm-assert-if-true IgnoreDeprecations $this - */ - public function isIgnoreDeprecations(): bool - { - return false; - } - - /** - * @psalm-assert-if-true IgnoreClassForCodeCoverage $this - */ - public function isIgnoreClassForCodeCoverage(): bool - { - return false; - } - - /** - * @psalm-assert-if-true IgnoreMethodForCodeCoverage $this - */ - public function isIgnoreMethodForCodeCoverage(): bool - { - return false; - } - - /** - * @psalm-assert-if-true IgnoreFunctionForCodeCoverage $this - */ - public function isIgnoreFunctionForCodeCoverage(): bool - { - return false; - } - - /** - * @psalm-assert-if-true RunClassInSeparateProcess $this - */ - public function isRunClassInSeparateProcess(): bool - { - return false; - } - - /** - * @psalm-assert-if-true RunInSeparateProcess $this - */ - public function isRunInSeparateProcess(): bool - { - return false; - } - - /** - * @psalm-assert-if-true RunTestsInSeparateProcesses $this - */ - public function isRunTestsInSeparateProcesses(): bool - { - return false; - } - - /** - * @psalm-assert-if-true Test $this - */ - public function isTest(): bool - { - return false; - } - - /** - * @psalm-assert-if-true PreCondition $this - */ - public function isPreCondition(): bool - { - return false; - } - - /** - * @psalm-assert-if-true PostCondition $this - */ - public function isPostCondition(): bool - { - return false; - } - - /** - * @psalm-assert-if-true PreserveGlobalState $this - */ - public function isPreserveGlobalState(): bool - { - return false; - } - - /** - * @psalm-assert-if-true RequiresMethod $this - */ - public function isRequiresMethod(): bool - { - return false; - } - - /** - * @psalm-assert-if-true RequiresFunction $this - */ - public function isRequiresFunction(): bool - { - return false; - } - - /** - * @psalm-assert-if-true RequiresOperatingSystem $this - */ - public function isRequiresOperatingSystem(): bool - { - return false; - } - - /** - * @psalm-assert-if-true RequiresOperatingSystemFamily $this - */ - public function isRequiresOperatingSystemFamily(): bool - { - return false; - } - - /** - * @psalm-assert-if-true RequiresPhp $this - */ - public function isRequiresPhp(): bool - { - return false; - } - - /** - * @psalm-assert-if-true RequiresPhpExtension $this - */ - public function isRequiresPhpExtension(): bool - { - return false; - } - - /** - * @psalm-assert-if-true RequiresPhpunit $this - */ - public function isRequiresPhpunit(): bool - { - return false; - } - - /** - * @psalm-assert-if-true RequiresSetting $this - */ - public function isRequiresSetting(): bool - { - return false; - } - - /** - * @psalm-assert-if-true TestDox $this - */ - public function isTestDox(): bool - { - return false; - } - - /** - * @psalm-assert-if-true TestWith $this - */ - public function isTestWith(): bool - { - return false; - } - - /** - * @psalm-assert-if-true Uses $this - */ - public function isUses(): bool - { - return false; - } - - /** - * @psalm-assert-if-true UsesClass $this - */ - public function isUsesClass(): bool - { - return false; - } - - /** - * @psalm-assert-if-true UsesDefaultClass $this - */ - public function isUsesDefaultClass(): bool - { - return false; - } - - /** - * @psalm-assert-if-true UsesFunction $this - */ - public function isUsesFunction(): bool - { - return false; - } - - /** - * @psalm-assert-if-true WithoutErrorHandler $this - */ - public function isWithoutErrorHandler(): bool - { - return false; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/MetadataCollection.php b/vendor/phpunit/phpunit/src/Metadata/MetadataCollection.php deleted file mode 100644 index d0b9656..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/MetadataCollection.php +++ /dev/null @@ -1,561 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -use function array_filter; -use function array_merge; -use function count; -use Countable; -use IteratorAggregate; - -/** - * @template-implements IteratorAggregate - * - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class MetadataCollection implements Countable, IteratorAggregate -{ - /** - * @psalm-var list - */ - private readonly array $metadata; - - /** - * @psalm-param list $metadata - */ - public static function fromArray(array $metadata): self - { - return new self(...$metadata); - } - - private function __construct(Metadata ...$metadata) - { - $this->metadata = $metadata; - } - - /** - * @psalm-return list - */ - public function asArray(): array - { - return $this->metadata; - } - - public function count(): int - { - return count($this->metadata); - } - - public function isEmpty(): bool - { - return $this->count() === 0; - } - - public function isNotEmpty(): bool - { - return $this->count() > 0; - } - - public function getIterator(): MetadataCollectionIterator - { - return new MetadataCollectionIterator($this); - } - - public function mergeWith(self $other): self - { - return new self( - ...array_merge( - $this->asArray(), - $other->asArray(), - ), - ); - } - - public function isClassLevel(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isClassLevel(), - ), - ); - } - - public function isMethodLevel(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isMethodLevel(), - ), - ); - } - - public function isAfter(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isAfter(), - ), - ); - } - - public function isAfterClass(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isAfterClass(), - ), - ); - } - - public function isBackupGlobals(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isBackupGlobals(), - ), - ); - } - - public function isBackupStaticProperties(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isBackupStaticProperties(), - ), - ); - } - - public function isBeforeClass(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isBeforeClass(), - ), - ); - } - - public function isBefore(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isBefore(), - ), - ); - } - - public function isCovers(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isCovers(), - ), - ); - } - - public function isCoversClass(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isCoversClass(), - ), - ); - } - - public function isCoversDefaultClass(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isCoversDefaultClass(), - ), - ); - } - - public function isCoversFunction(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isCoversFunction(), - ), - ); - } - - public function isExcludeGlobalVariableFromBackup(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isExcludeGlobalVariableFromBackup(), - ), - ); - } - - public function isExcludeStaticPropertyFromBackup(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isExcludeStaticPropertyFromBackup(), - ), - ); - } - - public function isCoversNothing(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isCoversNothing(), - ), - ); - } - - public function isDataProvider(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isDataProvider(), - ), - ); - } - - public function isDepends(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isDependsOnClass() || $metadata->isDependsOnMethod(), - ), - ); - } - - public function isDependsOnClass(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isDependsOnClass(), - ), - ); - } - - public function isDependsOnMethod(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isDependsOnMethod(), - ), - ); - } - - public function isDoesNotPerformAssertions(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isDoesNotPerformAssertions(), - ), - ); - } - - public function isGroup(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isGroup(), - ), - ); - } - - public function isIgnoreDeprecations(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isIgnoreDeprecations(), - ), - ); - } - - /** - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5513 - */ - public function isIgnoreClassForCodeCoverage(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isIgnoreClassForCodeCoverage(), - ), - ); - } - - /** - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5513 - */ - public function isIgnoreMethodForCodeCoverage(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isIgnoreMethodForCodeCoverage(), - ), - ); - } - - /** - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5513 - */ - public function isIgnoreFunctionForCodeCoverage(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isIgnoreFunctionForCodeCoverage(), - ), - ); - } - - public function isRunClassInSeparateProcess(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isRunClassInSeparateProcess(), - ), - ); - } - - public function isRunInSeparateProcess(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isRunInSeparateProcess(), - ), - ); - } - - public function isRunTestsInSeparateProcesses(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isRunTestsInSeparateProcesses(), - ), - ); - } - - public function isTest(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isTest(), - ), - ); - } - - public function isPreCondition(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isPreCondition(), - ), - ); - } - - public function isPostCondition(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isPostCondition(), - ), - ); - } - - public function isPreserveGlobalState(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isPreserveGlobalState(), - ), - ); - } - - public function isRequiresMethod(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isRequiresMethod(), - ), - ); - } - - public function isRequiresFunction(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isRequiresFunction(), - ), - ); - } - - public function isRequiresOperatingSystem(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isRequiresOperatingSystem(), - ), - ); - } - - public function isRequiresOperatingSystemFamily(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isRequiresOperatingSystemFamily(), - ), - ); - } - - public function isRequiresPhp(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isRequiresPhp(), - ), - ); - } - - public function isRequiresPhpExtension(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isRequiresPhpExtension(), - ), - ); - } - - public function isRequiresPhpunit(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isRequiresPhpunit(), - ), - ); - } - - public function isRequiresSetting(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isRequiresSetting(), - ), - ); - } - - public function isTestDox(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isTestDox(), - ), - ); - } - - public function isTestWith(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isTestWith(), - ), - ); - } - - public function isUses(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isUses(), - ), - ); - } - - public function isUsesClass(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isUsesClass(), - ), - ); - } - - public function isUsesDefaultClass(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isUsesDefaultClass(), - ), - ); - } - - public function isUsesFunction(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isUsesFunction(), - ), - ); - } - - public function isWithoutErrorHandler(): self - { - return new self( - ...array_filter( - $this->metadata, - static fn (Metadata $metadata): bool => $metadata->isWithoutErrorHandler(), - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/MetadataCollectionIterator.php b/vendor/phpunit/phpunit/src/Metadata/MetadataCollectionIterator.php deleted file mode 100644 index 4d4aa57..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/MetadataCollectionIterator.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -use function count; -use Iterator; - -/** - * @template-implements Iterator - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class MetadataCollectionIterator implements Iterator -{ - /** - * @psalm-var list - */ - private readonly array $metadata; - private int $position = 0; - - public function __construct(MetadataCollection $metadata) - { - $this->metadata = $metadata->asArray(); - } - - public function rewind(): void - { - $this->position = 0; - } - - public function valid(): bool - { - return $this->position < count($this->metadata); - } - - public function key(): int - { - return $this->position; - } - - public function current(): Metadata - { - return $this->metadata[$this->position]; - } - - public function next(): void - { - $this->position++; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/Parser/Annotation/DocBlock.php b/vendor/phpunit/phpunit/src/Metadata/Parser/Annotation/DocBlock.php deleted file mode 100644 index eaa5f9d..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/Parser/Annotation/DocBlock.php +++ /dev/null @@ -1,267 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata\Annotation\Parser; - -use function array_filter; -use function array_map; -use function array_merge; -use function array_values; -use function count; -use function preg_match; -use function preg_match_all; -use function preg_replace; -use function preg_split; -use function realpath; -use function substr; -use function trim; -use PharIo\Version\Exception as PharIoVersionException; -use PharIo\Version\VersionConstraintParser; -use PHPUnit\Metadata\AnnotationsAreNotSupportedForInternalClassesException; -use PHPUnit\Metadata\InvalidVersionRequirementException; -use ReflectionClass; -use ReflectionFunctionAbstract; -use ReflectionMethod; - -/** - * This is an abstraction around a PHPUnit-specific docBlock, - * allowing us to ask meaningful questions about a specific - * reflection symbol. - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class DocBlock -{ - private const REGEX_REQUIRES_VERSION = '/@requires\s+(?PPHP(?:Unit)?)\s+(?P[<>=!]{0,2})\s*(?P[\d\.-]+(dev|(RC|alpha|beta)[\d\.])?)[ \t]*\r?$/m'; - private const REGEX_REQUIRES_VERSION_CONSTRAINT = '/@requires\s+(?PPHP(?:Unit)?)\s+(?P[\d\t \-.|~^]+)[ \t]*\r?$/m'; - private const REGEX_REQUIRES_OS = '/@requires\s+(?POS(?:FAMILY)?)\s+(?P.+?)[ \t]*\r?$/m'; - private const REGEX_REQUIRES_SETTING = '/@requires\s+(?Psetting)\s+(?P([^ ]+?))\s*(?P[\w\.-]+[\w\.]?)?[ \t]*\r?$/m'; - private const REGEX_REQUIRES = '/@requires\s+(?Pfunction|extension)\s+(?P([^\s<>=!]+))\s*(?P[<>=!]{0,2})\s*(?P[\d\.-]+[\d\.]?)?[ \t]*\r?$/m'; - private readonly string $docComment; - - /** - * @psalm-var array> pre-parsed annotations indexed by name and occurrence index - */ - private readonly array $symbolAnnotations; - - /** - * @psalm-var null|(array{ - * __OFFSET: array&array{__FILE: string}, - * setting?: array, - * extension_versions?: array - * }&array< - * string, - * string|array{version: string, operator: string}|array{constraint: string}|array - * >) - */ - private ?array $parsedRequirements = null; - private readonly int $startLine; - private readonly string $fileName; - - /** - * @throws AnnotationsAreNotSupportedForInternalClassesException - */ - public static function ofClass(ReflectionClass $class): self - { - if ($class->isInternal()) { - throw new AnnotationsAreNotSupportedForInternalClassesException($class->getName()); - } - - return new self( - (string) $class->getDocComment(), - self::extractAnnotationsFromReflector($class), - $class->getStartLine(), - $class->getFileName(), - ); - } - - /** - * @throws AnnotationsAreNotSupportedForInternalClassesException - */ - public static function ofMethod(ReflectionMethod $method): self - { - if ($method->getDeclaringClass()->isInternal()) { - throw new AnnotationsAreNotSupportedForInternalClassesException($method->getDeclaringClass()->getName()); - } - - return new self( - (string) $method->getDocComment(), - self::extractAnnotationsFromReflector($method), - $method->getStartLine(), - $method->getFileName(), - ); - } - - /** - * Note: we do not preserve an instance of the reflection object, since it cannot be safely (de-)serialized. - * - * @param array> $symbolAnnotations - */ - private function __construct(string $docComment, array $symbolAnnotations, int $startLine, string $fileName) - { - $this->docComment = $docComment; - $this->symbolAnnotations = $symbolAnnotations; - $this->startLine = $startLine; - $this->fileName = $fileName; - } - - /** - * @throws InvalidVersionRequirementException - * - * @psalm-return array{ - * __OFFSET: array&array{__FILE: string}, - * setting?: array, - * extension_versions?: array - * }&array< - * string, - * string|array{version: string, operator: string}|array{constraint: string}|array - * > - */ - public function requirements(): array - { - if ($this->parsedRequirements !== null) { - return $this->parsedRequirements; - } - - $offset = $this->startLine; - $requires = []; - $recordedSettings = []; - $extensionVersions = []; - $recordedOffsets = [ - '__FILE' => realpath($this->fileName), - ]; - - // Trim docblock markers, split it into lines and rewind offset to start of docblock - $lines = preg_replace(['#^/\*{2}#', '#\*/$#'], '', preg_split('/\r\n|\r|\n/', $this->docComment)); - $offset -= count($lines); - - foreach ($lines as $line) { - if (preg_match(self::REGEX_REQUIRES_OS, $line, $matches)) { - $requires[$matches['name']] = $matches['value']; - $recordedOffsets[$matches['name']] = $offset; - } - - if (preg_match(self::REGEX_REQUIRES_VERSION, $line, $matches)) { - $requires[$matches['name']] = [ - 'version' => $matches['version'], - 'operator' => $matches['operator'], - ]; - - $recordedOffsets[$matches['name']] = $offset; - } - - if (preg_match(self::REGEX_REQUIRES_VERSION_CONSTRAINT, $line, $matches)) { - if (!empty($requires[$matches['name']])) { - $offset++; - - continue; - } - - try { - $versionConstraintParser = new VersionConstraintParser; - - $requires[$matches['name'] . '_constraint'] = [ - 'constraint' => $versionConstraintParser->parse(trim($matches['constraint'])), - ]; - - $recordedOffsets[$matches['name'] . '_constraint'] = $offset; - } catch (PharIoVersionException $e) { - throw new InvalidVersionRequirementException( - $e->getMessage(), - $e->getCode(), - $e, - ); - } - } - - if (preg_match(self::REGEX_REQUIRES_SETTING, $line, $matches)) { - $recordedSettings[$matches['setting']] = $matches['value']; - $recordedOffsets['__SETTING_' . $matches['setting']] = $offset; - } - - if (preg_match(self::REGEX_REQUIRES, $line, $matches)) { - $name = $matches['name'] . 's'; - - if (!isset($requires[$name])) { - $requires[$name] = []; - } - - $requires[$name][] = $matches['value']; - $recordedOffsets[$matches['name'] . '_' . $matches['value']] = $offset; - - if ($name === 'extensions' && !empty($matches['version'])) { - $extensionVersions[$matches['value']] = [ - 'version' => $matches['version'], - 'operator' => $matches['operator'], - ]; - } - } - - $offset++; - } - - return $this->parsedRequirements = array_merge( - $requires, - ['__OFFSET' => $recordedOffsets], - array_filter( - [ - 'setting' => $recordedSettings, - 'extension_versions' => $extensionVersions, - ], - ), - ); - } - - public function symbolAnnotations(): array - { - return $this->symbolAnnotations; - } - - /** - * @psalm-return array> - */ - private static function parseDocBlock(string $docBlock): array - { - // Strip away the docblock header and footer to ease parsing of one line annotations - $docBlock = substr($docBlock, 3, -2); - $annotations = []; - - if (preg_match_all('/@(?P[A-Za-z_-]+)(?:[ \t]+(?P.*?))?[ \t]*\r?$/m', $docBlock, $matches)) { - $numMatches = count($matches[0]); - - for ($i = 0; $i < $numMatches; $i++) { - $annotations[$matches['name'][$i]][] = $matches['value'][$i]; - } - } - - return $annotations; - } - - private static function extractAnnotationsFromReflector(ReflectionClass|ReflectionFunctionAbstract $reflector): array - { - $annotations = []; - - if ($reflector instanceof ReflectionClass) { - $annotations = array_merge( - $annotations, - ...array_map( - static fn (ReflectionClass $trait): array => self::parseDocBlock((string) $trait->getDocComment()), - array_values($reflector->getTraits()), - ), - ); - } - - return array_merge( - $annotations, - self::parseDocBlock((string) $reflector->getDocComment()), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/Parser/Annotation/Registry.php b/vendor/phpunit/phpunit/src/Metadata/Parser/Annotation/Registry.php deleted file mode 100644 index 51397a7..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/Parser/Annotation/Registry.php +++ /dev/null @@ -1,98 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata\Annotation\Parser; - -use function array_key_exists; -use PHPUnit\Metadata\AnnotationsAreNotSupportedForInternalClassesException; -use PHPUnit\Metadata\ReflectionException; -use ReflectionClass; -use ReflectionMethod; - -/** - * Reflection information, and therefore DocBlock information, is static within - * a single PHP process. It is therefore okay to use a Singleton registry here. - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Registry -{ - private static ?Registry $instance = null; - - /** - * @psalm-var array indexed by class name - */ - private array $classDocBlocks = []; - - /** - * @psalm-var array> indexed by class name and method name - */ - private array $methodDocBlocks = []; - - public static function getInstance(): self - { - return self::$instance ?? self::$instance = new self; - } - - /** - * @psalm-param class-string $class - * - * @throws AnnotationsAreNotSupportedForInternalClassesException - * @throws ReflectionException - */ - public function forClassName(string $class): DocBlock - { - if (array_key_exists($class, $this->classDocBlocks)) { - return $this->classDocBlocks[$class]; - } - - try { - $reflection = new ReflectionClass($class); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new ReflectionException( - $e->getMessage(), - $e->getCode(), - $e, - ); - } - // @codeCoverageIgnoreEnd - - return $this->classDocBlocks[$class] = DocBlock::ofClass($reflection); - } - - /** - * @psalm-param class-string $classInHierarchy - * - * @throws AnnotationsAreNotSupportedForInternalClassesException - * @throws ReflectionException - */ - public function forMethod(string $classInHierarchy, string $method): DocBlock - { - if (isset($this->methodDocBlocks[$classInHierarchy][$method])) { - return $this->methodDocBlocks[$classInHierarchy][$method]; - } - - try { - $reflection = new ReflectionMethod($classInHierarchy, $method); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new ReflectionException( - $e->getMessage(), - $e->getCode(), - $e, - ); - } - // @codeCoverageIgnoreEnd - - return $this->methodDocBlocks[$classInHierarchy][$method] = DocBlock::ofMethod($reflection); - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/Parser/AnnotationParser.php b/vendor/phpunit/phpunit/src/Metadata/Parser/AnnotationParser.php deleted file mode 100644 index cdb42dc..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/Parser/AnnotationParser.php +++ /dev/null @@ -1,568 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata\Parser; - -use function array_merge; -use function assert; -use function class_exists; -use function count; -use function explode; -use function method_exists; -use function preg_replace; -use function rtrim; -use function sprintf; -use function str_contains; -use function str_starts_with; -use function strlen; -use function substr; -use function trim; -use PHPUnit\Event\Facade as EventFacade; -use PHPUnit\Metadata\Annotation\Parser\Registry as AnnotationRegistry; -use PHPUnit\Metadata\AnnotationsAreNotSupportedForInternalClassesException; -use PHPUnit\Metadata\InvalidVersionRequirementException; -use PHPUnit\Metadata\Metadata; -use PHPUnit\Metadata\MetadataCollection; -use PHPUnit\Metadata\ReflectionException; -use PHPUnit\Metadata\Version\ComparisonRequirement; -use PHPUnit\Metadata\Version\ConstraintRequirement; -use PHPUnit\Util\InvalidVersionOperatorException; -use PHPUnit\Util\VersionComparisonOperator; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class AnnotationParser implements Parser -{ - /** - * @psalm-param class-string $className - * - * @throws AnnotationsAreNotSupportedForInternalClassesException - * @throws InvalidVersionOperatorException - * @throws ReflectionException - */ - public function forClass(string $className): MetadataCollection - { - assert(class_exists($className)); - - $result = []; - - foreach (AnnotationRegistry::getInstance()->forClassName($className)->symbolAnnotations() as $annotation => $values) { - switch ($annotation) { - case 'backupGlobals': - $result[] = Metadata::backupGlobalsOnClass($this->stringToBool($values[0])); - - break; - - case 'backupStaticAttributes': - case 'backupStaticProperties': - $result[] = Metadata::backupStaticPropertiesOnClass($this->stringToBool($values[0])); - - break; - - case 'covers': - foreach ($values as $value) { - $value = $this->cleanUpCoversOrUsesTarget($value); - - $result[] = Metadata::coversOnClass($value); - } - - break; - - case 'coversDefaultClass': - foreach ($values as $value) { - $result[] = Metadata::coversDefaultClass($value); - } - - break; - - case 'coversNothing': - $result[] = Metadata::coversNothingOnClass(); - - break; - - case 'doesNotPerformAssertions': - $result[] = Metadata::doesNotPerformAssertionsOnClass(); - - break; - - case 'group': - case 'ticket': - foreach ($values as $value) { - $result[] = Metadata::groupOnClass($value); - } - - break; - - case 'large': - $result[] = Metadata::groupOnClass('large'); - - break; - - case 'medium': - $result[] = Metadata::groupOnClass('medium'); - - break; - - case 'preserveGlobalState': - $result[] = Metadata::preserveGlobalStateOnClass($this->stringToBool($values[0])); - - break; - - case 'runClassInSeparateProcess': - $result[] = Metadata::runClassInSeparateProcess(); - - break; - - case 'runTestsInSeparateProcesses': - $result[] = Metadata::runTestsInSeparateProcesses(); - - break; - - case 'small': - $result[] = Metadata::groupOnClass('small'); - - break; - - case 'testdox': - $result[] = Metadata::testDoxOnClass($values[0]); - - break; - - case 'uses': - foreach ($values as $value) { - $value = $this->cleanUpCoversOrUsesTarget($value); - - $result[] = Metadata::usesOnClass($value); - } - - break; - - case 'usesDefaultClass': - foreach ($values as $value) { - $result[] = Metadata::usesDefaultClass($value); - } - - break; - } - } - - try { - $result = array_merge( - $result, - $this->parseRequirements( - AnnotationRegistry::getInstance()->forClassName($className)->requirements(), - 'class', - ), - ); - } catch (InvalidVersionRequirementException $e) { - EventFacade::emitter()->testRunnerTriggeredPhpunitWarning( - sprintf( - 'Class %s is annotated using an invalid version requirement: %s', - $className, - $e->getMessage(), - ), - ); - } - - return MetadataCollection::fromArray($result); - } - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - * - * @throws AnnotationsAreNotSupportedForInternalClassesException - * @throws InvalidVersionOperatorException - * @throws ReflectionException - */ - public function forMethod(string $className, string $methodName): MetadataCollection - { - assert(class_exists($className)); - assert(method_exists($className, $methodName)); - - $result = []; - - foreach (AnnotationRegistry::getInstance()->forMethod($className, $methodName)->symbolAnnotations() as $annotation => $values) { - switch ($annotation) { - case 'after': - $result[] = Metadata::after(); - - break; - - case 'afterClass': - $result[] = Metadata::afterClass(); - - break; - - case 'backupGlobals': - $result[] = Metadata::backupGlobalsOnMethod($this->stringToBool($values[0])); - - break; - - case 'backupStaticAttributes': - case 'backupStaticProperties': - $result[] = Metadata::backupStaticPropertiesOnMethod($this->stringToBool($values[0])); - - break; - - case 'before': - $result[] = Metadata::before(); - - break; - - case 'beforeClass': - $result[] = Metadata::beforeClass(); - - break; - - case 'covers': - foreach ($values as $value) { - $value = $this->cleanUpCoversOrUsesTarget($value); - - $result[] = Metadata::coversOnMethod($value); - } - - break; - - case 'coversNothing': - $result[] = Metadata::coversNothingOnMethod(); - - break; - - case 'dataProvider': - foreach ($values as $value) { - $value = rtrim($value, " ()\n\r\t\v\x00"); - - if (str_contains($value, '::')) { - $result[] = Metadata::dataProvider(...explode('::', $value)); - - continue; - } - - $result[] = Metadata::dataProvider($className, $value); - } - - break; - - case 'depends': - foreach ($values as $value) { - $deepClone = false; - $shallowClone = false; - - if (str_starts_with($value, 'clone ')) { - $deepClone = true; - $value = substr($value, strlen('clone ')); - } elseif (str_starts_with($value, '!clone ')) { - $value = substr($value, strlen('!clone ')); - } elseif (str_starts_with($value, 'shallowClone ')) { - $shallowClone = true; - $value = substr($value, strlen('shallowClone ')); - } elseif (str_starts_with($value, '!shallowClone ')) { - $value = substr($value, strlen('!shallowClone ')); - } - - if (str_contains($value, '::')) { - [$_className, $_methodName] = explode('::', $value); - - assert($_className !== ''); - assert($_methodName !== ''); - - if ($_methodName === 'class') { - $result[] = Metadata::dependsOnClass($_className, $deepClone, $shallowClone); - - continue; - } - - $result[] = Metadata::dependsOnMethod($_className, $_methodName, $deepClone, $shallowClone); - - continue; - } - - $result[] = Metadata::dependsOnMethod($className, $value, $deepClone, $shallowClone); - } - - break; - - case 'doesNotPerformAssertions': - $result[] = Metadata::doesNotPerformAssertionsOnMethod(); - - break; - - case 'excludeGlobalVariableFromBackup': - foreach ($values as $value) { - $result[] = Metadata::excludeGlobalVariableFromBackupOnMethod($value); - } - - break; - - case 'excludeStaticPropertyFromBackup': - foreach ($values as $value) { - $tmp = explode(' ', $value); - - if (count($tmp) !== 2) { - continue; - } - - $result[] = Metadata::excludeStaticPropertyFromBackupOnMethod( - trim($tmp[0]), - trim($tmp[1]), - ); - } - - break; - - case 'group': - case 'ticket': - foreach ($values as $value) { - $result[] = Metadata::groupOnMethod($value); - } - - break; - - case 'large': - $result[] = Metadata::groupOnMethod('large'); - - break; - - case 'medium': - $result[] = Metadata::groupOnMethod('medium'); - - break; - - case 'postCondition': - $result[] = Metadata::postCondition(); - - break; - - case 'preCondition': - $result[] = Metadata::preCondition(); - - break; - - case 'preserveGlobalState': - $result[] = Metadata::preserveGlobalStateOnMethod($this->stringToBool($values[0])); - - break; - - case 'runInSeparateProcess': - $result[] = Metadata::runInSeparateProcess(); - - break; - - case 'small': - $result[] = Metadata::groupOnMethod('small'); - - break; - - case 'test': - $result[] = Metadata::test(); - - break; - - case 'testdox': - $result[] = Metadata::testDoxOnMethod($values[0]); - - break; - - case 'uses': - foreach ($values as $value) { - $value = $this->cleanUpCoversOrUsesTarget($value); - - $result[] = Metadata::usesOnMethod($value); - } - - break; - } - } - - if (method_exists($className, $methodName)) { - try { - $result = array_merge( - $result, - $this->parseRequirements( - AnnotationRegistry::getInstance()->forMethod($className, $methodName)->requirements(), - 'method', - ), - ); - } catch (InvalidVersionRequirementException $e) { - EventFacade::emitter()->testRunnerTriggeredPhpunitWarning( - sprintf( - 'Method %s::%s is annotated using an invalid version requirement: %s', - $className, - $methodName, - $e->getMessage(), - ), - ); - } - } - - return MetadataCollection::fromArray($result); - } - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - * - * @throws AnnotationsAreNotSupportedForInternalClassesException - * @throws InvalidVersionOperatorException - * @throws ReflectionException - */ - public function forClassAndMethod(string $className, string $methodName): MetadataCollection - { - return $this->forClass($className)->mergeWith( - $this->forMethod($className, $methodName), - ); - } - - private function stringToBool(string $value): bool - { - if ($value === 'enabled') { - return true; - } - - return false; - } - - private function cleanUpCoversOrUsesTarget(string $value): string - { - $value = preg_replace('/[\s()]+$/', '', $value); - - return explode(' ', $value, 2)[0]; - } - - /** - * @throws InvalidVersionOperatorException - * - * @psalm-return list - */ - private function parseRequirements(array $requirements, string $level): array - { - $result = []; - - if (!empty($requirements['PHP'])) { - $versionRequirement = new ComparisonRequirement( - $requirements['PHP']['version'], - new VersionComparisonOperator(empty($requirements['PHP']['operator']) ? '>=' : $requirements['PHP']['operator']), - ); - - if ($level === 'class') { - $result[] = Metadata::requiresPhpOnClass($versionRequirement); - } else { - $result[] = Metadata::requiresPhpOnMethod($versionRequirement); - } - } elseif (!empty($requirements['PHP_constraint'])) { - $versionRequirement = new ConstraintRequirement($requirements['PHP_constraint']['constraint']); - - if ($level === 'class') { - $result[] = Metadata::requiresPhpOnClass($versionRequirement); - } else { - $result[] = Metadata::requiresPhpOnMethod($versionRequirement); - } - } - - if (!empty($requirements['extensions'])) { - foreach ($requirements['extensions'] as $extension) { - if (isset($requirements['extension_versions'][$extension])) { - continue; - } - - if ($level === 'class') { - $result[] = Metadata::requiresPhpExtensionOnClass($extension, null); - } else { - $result[] = Metadata::requiresPhpExtensionOnMethod($extension, null); - } - } - } - - if (!empty($requirements['extension_versions'])) { - foreach ($requirements['extension_versions'] as $extension => $version) { - $versionRequirement = new ComparisonRequirement( - $version['version'], - new VersionComparisonOperator(empty($version['operator']) ? '>=' : $version['operator']), - ); - - if ($level === 'class') { - $result[] = Metadata::requiresPhpExtensionOnClass($extension, $versionRequirement); - } else { - $result[] = Metadata::requiresPhpExtensionOnMethod($extension, $versionRequirement); - } - } - } - - if (!empty($requirements['PHPUnit'])) { - $versionRequirement = new ComparisonRequirement( - $requirements['PHPUnit']['version'], - new VersionComparisonOperator(empty($requirements['PHPUnit']['operator']) ? '>=' : $requirements['PHPUnit']['operator']), - ); - - if ($level === 'class') { - $result[] = Metadata::requiresPhpunitOnClass($versionRequirement); - } else { - $result[] = Metadata::requiresPhpunitOnMethod($versionRequirement); - } - } elseif (!empty($requirements['PHPUnit_constraint'])) { - $versionRequirement = new ConstraintRequirement($requirements['PHPUnit_constraint']['constraint']); - - if ($level === 'class') { - $result[] = Metadata::requiresPhpunitOnClass($versionRequirement); - } else { - $result[] = Metadata::requiresPhpunitOnMethod($versionRequirement); - } - } - - if (!empty($requirements['OSFAMILY'])) { - if ($level === 'class') { - $result[] = Metadata::requiresOperatingSystemFamilyOnClass($requirements['OSFAMILY']); - } else { - $result[] = Metadata::requiresOperatingSystemFamilyOnMethod($requirements['OSFAMILY']); - } - } - - if (!empty($requirements['OS'])) { - if ($level === 'class') { - $result[] = Metadata::requiresOperatingSystemOnClass($requirements['OS']); - } else { - $result[] = Metadata::requiresOperatingSystemOnMethod($requirements['OS']); - } - } - - if (!empty($requirements['functions'])) { - foreach ($requirements['functions'] as $function) { - $pieces = explode('::', $function); - - if (count($pieces) === 2) { - if ($level === 'class') { - $result[] = Metadata::requiresMethodOnClass($pieces[0], $pieces[1]); - } else { - $result[] = Metadata::requiresMethodOnMethod($pieces[0], $pieces[1]); - } - } elseif ($level === 'class') { - $result[] = Metadata::requiresFunctionOnClass($function); - } else { - $result[] = Metadata::requiresFunctionOnMethod($function); - } - } - } - - if (!empty($requirements['setting'])) { - foreach ($requirements['setting'] as $setting => $value) { - if ($level === 'class') { - $result[] = Metadata::requiresSettingOnClass($setting, $value); - } else { - $result[] = Metadata::requiresSettingOnMethod($setting, $value); - } - } - } - - return $result; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/Parser/AttributeParser.php b/vendor/phpunit/phpunit/src/Metadata/Parser/AttributeParser.php deleted file mode 100644 index e6f0b70..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/Parser/AttributeParser.php +++ /dev/null @@ -1,698 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata\Parser; - -use const JSON_THROW_ON_ERROR; -use function assert; -use function class_exists; -use function json_decode; -use function method_exists; -use function str_starts_with; -use Error; -use PHPUnit\Framework\Attributes\After; -use PHPUnit\Framework\Attributes\AfterClass; -use PHPUnit\Framework\Attributes\BackupGlobals; -use PHPUnit\Framework\Attributes\BackupStaticProperties; -use PHPUnit\Framework\Attributes\Before; -use PHPUnit\Framework\Attributes\BeforeClass; -use PHPUnit\Framework\Attributes\CoversClass; -use PHPUnit\Framework\Attributes\CoversFunction; -use PHPUnit\Framework\Attributes\CoversNothing; -use PHPUnit\Framework\Attributes\DataProvider; -use PHPUnit\Framework\Attributes\DataProviderExternal; -use PHPUnit\Framework\Attributes\Depends; -use PHPUnit\Framework\Attributes\DependsExternal; -use PHPUnit\Framework\Attributes\DependsExternalUsingDeepClone; -use PHPUnit\Framework\Attributes\DependsExternalUsingShallowClone; -use PHPUnit\Framework\Attributes\DependsOnClass; -use PHPUnit\Framework\Attributes\DependsOnClassUsingDeepClone; -use PHPUnit\Framework\Attributes\DependsOnClassUsingShallowClone; -use PHPUnit\Framework\Attributes\DependsUsingDeepClone; -use PHPUnit\Framework\Attributes\DependsUsingShallowClone; -use PHPUnit\Framework\Attributes\DoesNotPerformAssertions; -use PHPUnit\Framework\Attributes\ExcludeGlobalVariableFromBackup; -use PHPUnit\Framework\Attributes\ExcludeStaticPropertyFromBackup; -use PHPUnit\Framework\Attributes\Group; -use PHPUnit\Framework\Attributes\IgnoreClassForCodeCoverage; -use PHPUnit\Framework\Attributes\IgnoreDeprecations; -use PHPUnit\Framework\Attributes\IgnoreFunctionForCodeCoverage; -use PHPUnit\Framework\Attributes\IgnoreMethodForCodeCoverage; -use PHPUnit\Framework\Attributes\Large; -use PHPUnit\Framework\Attributes\Medium; -use PHPUnit\Framework\Attributes\PostCondition; -use PHPUnit\Framework\Attributes\PreCondition; -use PHPUnit\Framework\Attributes\PreserveGlobalState; -use PHPUnit\Framework\Attributes\RequiresFunction; -use PHPUnit\Framework\Attributes\RequiresMethod; -use PHPUnit\Framework\Attributes\RequiresOperatingSystem; -use PHPUnit\Framework\Attributes\RequiresOperatingSystemFamily; -use PHPUnit\Framework\Attributes\RequiresPhp; -use PHPUnit\Framework\Attributes\RequiresPhpExtension; -use PHPUnit\Framework\Attributes\RequiresPhpunit; -use PHPUnit\Framework\Attributes\RequiresSetting; -use PHPUnit\Framework\Attributes\RunClassInSeparateProcess; -use PHPUnit\Framework\Attributes\RunInSeparateProcess; -use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses; -use PHPUnit\Framework\Attributes\Small; -use PHPUnit\Framework\Attributes\Test; -use PHPUnit\Framework\Attributes\TestDox; -use PHPUnit\Framework\Attributes\TestWith; -use PHPUnit\Framework\Attributes\TestWithJson; -use PHPUnit\Framework\Attributes\Ticket; -use PHPUnit\Framework\Attributes\UsesClass; -use PHPUnit\Framework\Attributes\UsesFunction; -use PHPUnit\Framework\Attributes\WithoutErrorHandler; -use PHPUnit\Metadata\InvalidAttributeException; -use PHPUnit\Metadata\Metadata; -use PHPUnit\Metadata\MetadataCollection; -use PHPUnit\Metadata\Version\Requirement; -use ReflectionClass; -use ReflectionMethod; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class AttributeParser implements Parser -{ - /** - * @psalm-param class-string $className - */ - public function forClass(string $className): MetadataCollection - { - assert(class_exists($className)); - - $reflector = new ReflectionClass($className); - $result = []; - - foreach ($reflector->getAttributes() as $attribute) { - if (!str_starts_with($attribute->getName(), 'PHPUnit\\Framework\\Attributes\\')) { - continue; - } - - if (!class_exists($attribute->getName())) { - continue; - } - - try { - $attributeInstance = $attribute->newInstance(); - } catch (Error $e) { - throw new InvalidAttributeException( - $attribute->getName(), - 'class ' . $className, - $reflector->getFileName(), - $reflector->getStartLine(), - $e->getMessage(), - ); - } - - switch ($attribute->getName()) { - case BackupGlobals::class: - assert($attributeInstance instanceof BackupGlobals); - - $result[] = Metadata::backupGlobalsOnClass($attributeInstance->enabled()); - - break; - - case BackupStaticProperties::class: - assert($attributeInstance instanceof BackupStaticProperties); - - $result[] = Metadata::backupStaticPropertiesOnClass($attributeInstance->enabled()); - - break; - - case CoversClass::class: - assert($attributeInstance instanceof CoversClass); - - $result[] = Metadata::coversClass($attributeInstance->className()); - - break; - - case CoversFunction::class: - assert($attributeInstance instanceof CoversFunction); - - $result[] = Metadata::coversFunction($attributeInstance->functionName()); - - break; - - case CoversNothing::class: - $result[] = Metadata::coversNothingOnClass(); - - break; - - case DoesNotPerformAssertions::class: - $result[] = Metadata::doesNotPerformAssertionsOnClass(); - - break; - - case ExcludeGlobalVariableFromBackup::class: - assert($attributeInstance instanceof ExcludeGlobalVariableFromBackup); - - $result[] = Metadata::excludeGlobalVariableFromBackupOnClass($attributeInstance->globalVariableName()); - - break; - - case ExcludeStaticPropertyFromBackup::class: - assert($attributeInstance instanceof ExcludeStaticPropertyFromBackup); - - $result[] = Metadata::excludeStaticPropertyFromBackupOnClass( - $attributeInstance->className(), - $attributeInstance->propertyName(), - ); - - break; - - case Group::class: - assert($attributeInstance instanceof Group); - - $result[] = Metadata::groupOnClass($attributeInstance->name()); - - break; - - case Large::class: - $result[] = Metadata::groupOnClass('large'); - - break; - - case Medium::class: - $result[] = Metadata::groupOnClass('medium'); - - break; - - case IgnoreClassForCodeCoverage::class: - assert($attributeInstance instanceof IgnoreClassForCodeCoverage); - - $result[] = Metadata::ignoreClassForCodeCoverage($attributeInstance->className()); - - break; - - case IgnoreDeprecations::class: - assert($attributeInstance instanceof IgnoreDeprecations); - - $result[] = Metadata::ignoreDeprecationsOnClass(); - - break; - - case IgnoreMethodForCodeCoverage::class: - assert($attributeInstance instanceof IgnoreMethodForCodeCoverage); - - $result[] = Metadata::ignoreMethodForCodeCoverage($attributeInstance->className(), $attributeInstance->methodName()); - - break; - - case IgnoreFunctionForCodeCoverage::class: - assert($attributeInstance instanceof IgnoreFunctionForCodeCoverage); - - $result[] = Metadata::ignoreFunctionForCodeCoverage($attributeInstance->functionName()); - - break; - - case PreserveGlobalState::class: - assert($attributeInstance instanceof PreserveGlobalState); - - $result[] = Metadata::preserveGlobalStateOnClass($attributeInstance->enabled()); - - break; - - case RequiresMethod::class: - assert($attributeInstance instanceof RequiresMethod); - - $result[] = Metadata::requiresMethodOnClass( - $attributeInstance->className(), - $attributeInstance->methodName(), - ); - - break; - - case RequiresFunction::class: - assert($attributeInstance instanceof RequiresFunction); - - $result[] = Metadata::requiresFunctionOnClass($attributeInstance->functionName()); - - break; - - case RequiresOperatingSystem::class: - assert($attributeInstance instanceof RequiresOperatingSystem); - - $result[] = Metadata::requiresOperatingSystemOnClass($attributeInstance->regularExpression()); - - break; - - case RequiresOperatingSystemFamily::class: - assert($attributeInstance instanceof RequiresOperatingSystemFamily); - - $result[] = Metadata::requiresOperatingSystemFamilyOnClass($attributeInstance->operatingSystemFamily()); - - break; - - case RequiresPhp::class: - assert($attributeInstance instanceof RequiresPhp); - - $result[] = Metadata::requiresPhpOnClass( - Requirement::from( - $attributeInstance->versionRequirement(), - ), - ); - - break; - - case RequiresPhpExtension::class: - assert($attributeInstance instanceof RequiresPhpExtension); - - $versionConstraint = null; - $versionRequirement = $attributeInstance->versionRequirement(); - - if ($versionRequirement !== null) { - $versionConstraint = Requirement::from($versionRequirement); - } - - $result[] = Metadata::requiresPhpExtensionOnClass( - $attributeInstance->extension(), - $versionConstraint, - ); - - break; - - case RequiresPhpunit::class: - assert($attributeInstance instanceof RequiresPhpunit); - - $result[] = Metadata::requiresPhpunitOnClass( - Requirement::from( - $attributeInstance->versionRequirement(), - ), - ); - - break; - - case RequiresSetting::class: - assert($attributeInstance instanceof RequiresSetting); - - $result[] = Metadata::requiresSettingOnClass( - $attributeInstance->setting(), - $attributeInstance->value(), - ); - - break; - - case RunClassInSeparateProcess::class: - $result[] = Metadata::runClassInSeparateProcess(); - - break; - - case RunTestsInSeparateProcesses::class: - $result[] = Metadata::runTestsInSeparateProcesses(); - - break; - - case Small::class: - $result[] = Metadata::groupOnClass('small'); - - break; - - case TestDox::class: - assert($attributeInstance instanceof TestDox); - - $result[] = Metadata::testDoxOnClass($attributeInstance->text()); - - break; - - case Ticket::class: - assert($attributeInstance instanceof Ticket); - - $result[] = Metadata::groupOnClass($attributeInstance->text()); - - break; - - case UsesClass::class: - assert($attributeInstance instanceof UsesClass); - - $result[] = Metadata::usesClass($attributeInstance->className()); - - break; - - case UsesFunction::class: - assert($attributeInstance instanceof UsesFunction); - - $result[] = Metadata::usesFunction($attributeInstance->functionName()); - - break; - } - } - - return MetadataCollection::fromArray($result); - } - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - */ - public function forMethod(string $className, string $methodName): MetadataCollection - { - assert(class_exists($className)); - assert(method_exists($className, $methodName)); - - $reflector = new ReflectionMethod($className, $methodName); - $result = []; - - foreach ($reflector->getAttributes() as $attribute) { - if (!str_starts_with($attribute->getName(), 'PHPUnit\\Framework\\Attributes\\')) { - continue; - } - - if (!class_exists($attribute->getName())) { - continue; - } - - try { - $attributeInstance = $attribute->newInstance(); - } catch (Error $e) { - throw new InvalidAttributeException( - $attribute->getName(), - 'method ' . $className . '::' . $methodName . '()', - $reflector->getFileName(), - $reflector->getStartLine(), - $e->getMessage(), - ); - } - - switch ($attribute->getName()) { - case After::class: - $result[] = Metadata::after(); - - break; - - case AfterClass::class: - $result[] = Metadata::afterClass(); - - break; - - case BackupGlobals::class: - assert($attributeInstance instanceof BackupGlobals); - - $result[] = Metadata::backupGlobalsOnMethod($attributeInstance->enabled()); - - break; - - case BackupStaticProperties::class: - assert($attributeInstance instanceof BackupStaticProperties); - - $result[] = Metadata::backupStaticPropertiesOnMethod($attributeInstance->enabled()); - - break; - - case Before::class: - $result[] = Metadata::before(); - - break; - - case BeforeClass::class: - $result[] = Metadata::beforeClass(); - - break; - - case CoversNothing::class: - $result[] = Metadata::coversNothingOnMethod(); - - break; - - case DataProvider::class: - assert($attributeInstance instanceof DataProvider); - - $result[] = Metadata::dataProvider($className, $attributeInstance->methodName()); - - break; - - case DataProviderExternal::class: - assert($attributeInstance instanceof DataProviderExternal); - - $result[] = Metadata::dataProvider($attributeInstance->className(), $attributeInstance->methodName()); - - break; - - case Depends::class: - assert($attributeInstance instanceof Depends); - - $result[] = Metadata::dependsOnMethod($className, $attributeInstance->methodName(), false, false); - - break; - - case DependsUsingDeepClone::class: - assert($attributeInstance instanceof DependsUsingDeepClone); - - $result[] = Metadata::dependsOnMethod($className, $attributeInstance->methodName(), true, false); - - break; - - case DependsUsingShallowClone::class: - assert($attributeInstance instanceof DependsUsingShallowClone); - - $result[] = Metadata::dependsOnMethod($className, $attributeInstance->methodName(), false, true); - - break; - - case DependsExternal::class: - assert($attributeInstance instanceof DependsExternal); - - $result[] = Metadata::dependsOnMethod($attributeInstance->className(), $attributeInstance->methodName(), false, false); - - break; - - case DependsExternalUsingDeepClone::class: - assert($attributeInstance instanceof DependsExternalUsingDeepClone); - - $result[] = Metadata::dependsOnMethod($attributeInstance->className(), $attributeInstance->methodName(), true, false); - - break; - - case DependsExternalUsingShallowClone::class: - assert($attributeInstance instanceof DependsExternalUsingShallowClone); - - $result[] = Metadata::dependsOnMethod($attributeInstance->className(), $attributeInstance->methodName(), false, true); - - break; - - case DependsOnClass::class: - assert($attributeInstance instanceof DependsOnClass); - - $result[] = Metadata::dependsOnClass($attributeInstance->className(), false, false); - - break; - - case DependsOnClassUsingDeepClone::class: - assert($attributeInstance instanceof DependsOnClassUsingDeepClone); - - $result[] = Metadata::dependsOnClass($attributeInstance->className(), true, false); - - break; - - case DependsOnClassUsingShallowClone::class: - assert($attributeInstance instanceof DependsOnClassUsingShallowClone); - - $result[] = Metadata::dependsOnClass($attributeInstance->className(), false, true); - - break; - - case DoesNotPerformAssertions::class: - assert($attributeInstance instanceof DoesNotPerformAssertions); - - $result[] = Metadata::doesNotPerformAssertionsOnMethod(); - - break; - - case ExcludeGlobalVariableFromBackup::class: - assert($attributeInstance instanceof ExcludeGlobalVariableFromBackup); - - $result[] = Metadata::excludeGlobalVariableFromBackupOnMethod($attributeInstance->globalVariableName()); - - break; - - case ExcludeStaticPropertyFromBackup::class: - assert($attributeInstance instanceof ExcludeStaticPropertyFromBackup); - - $result[] = Metadata::excludeStaticPropertyFromBackupOnMethod( - $attributeInstance->className(), - $attributeInstance->propertyName(), - ); - - break; - - case Group::class: - assert($attributeInstance instanceof Group); - - $result[] = Metadata::groupOnMethod($attributeInstance->name()); - - break; - - case IgnoreDeprecations::class: - assert($attributeInstance instanceof IgnoreDeprecations); - - $result[] = Metadata::ignoreDeprecationsOnMethod(); - - break; - - case PostCondition::class: - $result[] = Metadata::postCondition(); - - break; - - case PreCondition::class: - $result[] = Metadata::preCondition(); - - break; - - case PreserveGlobalState::class: - assert($attributeInstance instanceof PreserveGlobalState); - - $result[] = Metadata::preserveGlobalStateOnMethod($attributeInstance->enabled()); - - break; - - case RequiresMethod::class: - assert($attributeInstance instanceof RequiresMethod); - - $result[] = Metadata::requiresMethodOnMethod( - $attributeInstance->className(), - $attributeInstance->methodName(), - ); - - break; - - case RequiresFunction::class: - assert($attributeInstance instanceof RequiresFunction); - - $result[] = Metadata::requiresFunctionOnMethod($attributeInstance->functionName()); - - break; - - case RequiresOperatingSystem::class: - assert($attributeInstance instanceof RequiresOperatingSystem); - - $result[] = Metadata::requiresOperatingSystemOnMethod($attributeInstance->regularExpression()); - - break; - - case RequiresOperatingSystemFamily::class: - assert($attributeInstance instanceof RequiresOperatingSystemFamily); - - $result[] = Metadata::requiresOperatingSystemFamilyOnMethod($attributeInstance->operatingSystemFamily()); - - break; - - case RequiresPhp::class: - assert($attributeInstance instanceof RequiresPhp); - - $result[] = Metadata::requiresPhpOnMethod( - Requirement::from( - $attributeInstance->versionRequirement(), - ), - ); - - break; - - case RequiresPhpExtension::class: - assert($attributeInstance instanceof RequiresPhpExtension); - - $versionConstraint = null; - $versionRequirement = $attributeInstance->versionRequirement(); - - if ($versionRequirement !== null) { - $versionConstraint = Requirement::from($versionRequirement); - } - - $result[] = Metadata::requiresPhpExtensionOnMethod( - $attributeInstance->extension(), - $versionConstraint, - ); - - break; - - case RequiresPhpunit::class: - assert($attributeInstance instanceof RequiresPhpunit); - - $result[] = Metadata::requiresPhpunitOnMethod( - Requirement::from( - $attributeInstance->versionRequirement(), - ), - ); - - break; - - case RequiresSetting::class: - assert($attributeInstance instanceof RequiresSetting); - - $result[] = Metadata::requiresSettingOnMethod( - $attributeInstance->setting(), - $attributeInstance->value(), - ); - - break; - - case RunInSeparateProcess::class: - $result[] = Metadata::runInSeparateProcess(); - - break; - - case Test::class: - $result[] = Metadata::test(); - - break; - - case TestDox::class: - assert($attributeInstance instanceof TestDox); - - $result[] = Metadata::testDoxOnMethod($attributeInstance->text()); - - break; - - case TestWith::class: - assert($attributeInstance instanceof TestWith); - - $result[] = Metadata::testWith($attributeInstance->data()); - - break; - - case TestWithJson::class: - assert($attributeInstance instanceof TestWithJson); - - $result[] = Metadata::testWith(json_decode($attributeInstance->json(), true, 512, JSON_THROW_ON_ERROR)); - - break; - - case Ticket::class: - assert($attributeInstance instanceof Ticket); - - $result[] = Metadata::groupOnMethod($attributeInstance->text()); - - break; - - case WithoutErrorHandler::class: - assert($attributeInstance instanceof WithoutErrorHandler); - - $result[] = Metadata::withoutErrorHandler(); - - break; - } - } - - return MetadataCollection::fromArray($result); - } - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - */ - public function forClassAndMethod(string $className, string $methodName): MetadataCollection - { - return $this->forClass($className)->mergeWith( - $this->forMethod($className, $methodName), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/Parser/CachingParser.php b/vendor/phpunit/phpunit/src/Metadata/Parser/CachingParser.php deleted file mode 100644 index a383006..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/Parser/CachingParser.php +++ /dev/null @@ -1,88 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata\Parser; - -use function assert; -use function class_exists; -use function method_exists; -use PHPUnit\Metadata\MetadataCollection; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class CachingParser implements Parser -{ - private readonly Parser $reader; - private array $classCache = []; - private array $methodCache = []; - private array $classAndMethodCache = []; - - public function __construct(Parser $reader) - { - $this->reader = $reader; - } - - /** - * @psalm-param class-string $className - */ - public function forClass(string $className): MetadataCollection - { - assert(class_exists($className)); - - if (isset($this->classCache[$className])) { - return $this->classCache[$className]; - } - - $this->classCache[$className] = $this->reader->forClass($className); - - return $this->classCache[$className]; - } - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - */ - public function forMethod(string $className, string $methodName): MetadataCollection - { - assert(class_exists($className)); - assert(method_exists($className, $methodName)); - - $key = $className . '::' . $methodName; - - if (isset($this->methodCache[$key])) { - return $this->methodCache[$key]; - } - - $this->methodCache[$key] = $this->reader->forMethod($className, $methodName); - - return $this->methodCache[$key]; - } - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - */ - public function forClassAndMethod(string $className, string $methodName): MetadataCollection - { - $key = $className . '::' . $methodName; - - if (isset($this->classAndMethodCache[$key])) { - return $this->classAndMethodCache[$key]; - } - - $this->classAndMethodCache[$key] = $this->forClass($className)->mergeWith( - $this->forMethod($className, $methodName), - ); - - return $this->classAndMethodCache[$key]; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/Parser/Parser.php b/vendor/phpunit/phpunit/src/Metadata/Parser/Parser.php deleted file mode 100644 index b5efd35..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/Parser/Parser.php +++ /dev/null @@ -1,37 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata\Parser; - -use PHPUnit\Metadata\MetadataCollection; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This interface is not covered by the backward compatibility promise for PHPUnit - */ -interface Parser -{ - /** - * @psalm-param class-string $className - */ - public function forClass(string $className): MetadataCollection; - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - */ - public function forMethod(string $className, string $methodName): MetadataCollection; - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - */ - public function forClassAndMethod(string $className, string $methodName): MetadataCollection; -} diff --git a/vendor/phpunit/phpunit/src/Metadata/Parser/ParserChain.php b/vendor/phpunit/phpunit/src/Metadata/Parser/ParserChain.php deleted file mode 100644 index 89d69dc..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/Parser/ParserChain.php +++ /dev/null @@ -1,77 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata\Parser; - -use function assert; -use function class_exists; -use function method_exists; -use PHPUnit\Metadata\MetadataCollection; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ParserChain implements Parser -{ - private readonly Parser $attributeReader; - private readonly Parser $annotationReader; - - public function __construct(Parser $attributeReader, Parser $annotationReader) - { - $this->attributeReader = $attributeReader; - $this->annotationReader = $annotationReader; - } - - /** - * @psalm-param class-string $className - */ - public function forClass(string $className): MetadataCollection - { - assert(class_exists($className)); - - $metadata = $this->attributeReader->forClass($className); - - if (!$metadata->isEmpty()) { - return $metadata; - } - - return $this->annotationReader->forClass($className); - } - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - */ - public function forMethod(string $className, string $methodName): MetadataCollection - { - assert(class_exists($className)); - assert(method_exists($className, $methodName)); - - $metadata = $this->attributeReader->forMethod($className, $methodName); - - if (!$metadata->isEmpty()) { - return $metadata; - } - - return $this->annotationReader->forMethod($className, $methodName); - } - - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - */ - public function forClassAndMethod(string $className, string $methodName): MetadataCollection - { - return $this->forClass($className)->mergeWith( - $this->forMethod($className, $methodName), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/Parser/Registry.php b/vendor/phpunit/phpunit/src/Metadata/Parser/Registry.php deleted file mode 100644 index a68ab01..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/Parser/Registry.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata\Parser; - -/** - * Attribute and annotation information is static within a single PHP process. - * It is therefore okay to use a Singleton registry here. - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Registry -{ - private static ?Parser $instance = null; - - public static function parser(): Parser - { - return self::$instance ?? self::$instance = self::build(); - } - - private static function build(): Parser - { - return new CachingParser( - new ParserChain( - new AttributeParser, - new AnnotationParser, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/PostCondition.php b/vendor/phpunit/phpunit/src/Metadata/PostCondition.php deleted file mode 100644 index 1e30f55..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/PostCondition.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class PostCondition extends Metadata -{ - /** - * @psalm-assert-if-true PostCondition $this - */ - public function isPostCondition(): bool - { - return true; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/PreCondition.php b/vendor/phpunit/phpunit/src/Metadata/PreCondition.php deleted file mode 100644 index 4691f11..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/PreCondition.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class PreCondition extends Metadata -{ - /** - * @psalm-assert-if-true PreCondition $this - */ - public function isPreCondition(): bool - { - return true; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/PreserveGlobalState.php b/vendor/phpunit/phpunit/src/Metadata/PreserveGlobalState.php deleted file mode 100644 index 521af6d..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/PreserveGlobalState.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class PreserveGlobalState extends Metadata -{ - private readonly bool $enabled; - - /** - * @psalm-param 0|1 $level - */ - protected function __construct(int $level, bool $enabled) - { - parent::__construct($level); - - $this->enabled = $enabled; - } - - /** - * @psalm-assert-if-true PreserveGlobalState $this - */ - public function isPreserveGlobalState(): bool - { - return true; - } - - public function enabled(): bool - { - return $this->enabled; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/RequiresFunction.php b/vendor/phpunit/phpunit/src/Metadata/RequiresFunction.php deleted file mode 100644 index 638d35c..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/RequiresFunction.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class RequiresFunction extends Metadata -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $functionName; - - /** - * @psalm-param 0|1 $level - * @psalm-param non-empty-string $functionName - */ - protected function __construct(int $level, string $functionName) - { - parent::__construct($level); - - $this->functionName = $functionName; - } - - /** - * @psalm-assert-if-true RequiresFunction $this - */ - public function isRequiresFunction(): bool - { - return true; - } - - /** - * @psalm-return non-empty-string - */ - public function functionName(): string - { - return $this->functionName; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/RequiresMethod.php b/vendor/phpunit/phpunit/src/Metadata/RequiresMethod.php deleted file mode 100644 index 45d611f..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/RequiresMethod.php +++ /dev/null @@ -1,65 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class RequiresMethod extends Metadata -{ - /** - * @psalm-var class-string - */ - private readonly string $className; - - /** - * @psalm-var non-empty-string - */ - private readonly string $methodName; - - /** - * @psalm-param 0|1 $level - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - */ - protected function __construct(int $level, string $className, string $methodName) - { - parent::__construct($level); - - $this->className = $className; - $this->methodName = $methodName; - } - - /** - * @psalm-assert-if-true RequiresMethod $this - */ - public function isRequiresMethod(): bool - { - return true; - } - - /** - * @psalm-return class-string - */ - public function className(): string - { - return $this->className; - } - - /** - * @psalm-return non-empty-string - */ - public function methodName(): string - { - return $this->methodName; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/RequiresOperatingSystem.php b/vendor/phpunit/phpunit/src/Metadata/RequiresOperatingSystem.php deleted file mode 100644 index d359863..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/RequiresOperatingSystem.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class RequiresOperatingSystem extends Metadata -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $operatingSystem; - - /** - * @psalm-param 0|1 $level - * @psalm-param non-empty-string $operatingSystem - */ - protected function __construct(int $level, string $operatingSystem) - { - parent::__construct($level); - - $this->operatingSystem = $operatingSystem; - } - - /** - * @psalm-assert-if-true RequiresOperatingSystem $this - */ - public function isRequiresOperatingSystem(): bool - { - return true; - } - - /** - * @psalm-return non-empty-string - */ - public function operatingSystem(): string - { - return $this->operatingSystem; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/RequiresOperatingSystemFamily.php b/vendor/phpunit/phpunit/src/Metadata/RequiresOperatingSystemFamily.php deleted file mode 100644 index 8418274..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/RequiresOperatingSystemFamily.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class RequiresOperatingSystemFamily extends Metadata -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $operatingSystemFamily; - - /** - * @psalm-param 0|1 $level - * @psalm-param non-empty-string $operatingSystemFamily - */ - protected function __construct(int $level, string $operatingSystemFamily) - { - parent::__construct($level); - - $this->operatingSystemFamily = $operatingSystemFamily; - } - - /** - * @psalm-assert-if-true RequiresOperatingSystemFamily $this - */ - public function isRequiresOperatingSystemFamily(): bool - { - return true; - } - - /** - * @psalm-return non-empty-string - */ - public function operatingSystemFamily(): string - { - return $this->operatingSystemFamily; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/RequiresPhp.php b/vendor/phpunit/phpunit/src/Metadata/RequiresPhp.php deleted file mode 100644 index e73bfb4..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/RequiresPhp.php +++ /dev/null @@ -1,45 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -use PHPUnit\Metadata\Version\Requirement; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class RequiresPhp extends Metadata -{ - private readonly Requirement $versionRequirement; - - /** - * @psalm-param 0|1 $level - */ - protected function __construct(int $level, Requirement $versionRequirement) - { - parent::__construct($level); - - $this->versionRequirement = $versionRequirement; - } - - /** - * @psalm-assert-if-true RequiresPhp $this - */ - public function isRequiresPhp(): bool - { - return true; - } - - public function versionRequirement(): Requirement - { - return $this->versionRequirement; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/RequiresPhpExtension.php b/vendor/phpunit/phpunit/src/Metadata/RequiresPhpExtension.php deleted file mode 100644 index 053b896..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/RequiresPhpExtension.php +++ /dev/null @@ -1,74 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -use PHPUnit\Metadata\Version\Requirement; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class RequiresPhpExtension extends Metadata -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $extension; - private readonly ?Requirement $versionRequirement; - - /** - * @psalm-param 0|1 $level - * @psalm-param non-empty-string $extension - */ - protected function __construct(int $level, string $extension, ?Requirement $versionRequirement) - { - parent::__construct($level); - - $this->extension = $extension; - $this->versionRequirement = $versionRequirement; - } - - /** - * @psalm-assert-if-true RequiresPhpExtension $this - */ - public function isRequiresPhpExtension(): bool - { - return true; - } - - /** - * @psalm-return non-empty-string - */ - public function extension(): string - { - return $this->extension; - } - - /** - * @psalm-assert-if-true !null $this->versionRequirement - */ - public function hasVersionRequirement(): bool - { - return $this->versionRequirement !== null; - } - - /** - * @throws NoVersionRequirementException - */ - public function versionRequirement(): Requirement - { - if ($this->versionRequirement === null) { - throw new NoVersionRequirementException; - } - - return $this->versionRequirement; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/RequiresPhpunit.php b/vendor/phpunit/phpunit/src/Metadata/RequiresPhpunit.php deleted file mode 100644 index 250190e..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/RequiresPhpunit.php +++ /dev/null @@ -1,45 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -use PHPUnit\Metadata\Version\Requirement; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class RequiresPhpunit extends Metadata -{ - private readonly Requirement $versionRequirement; - - /** - * @psalm-param 0|1 $level - */ - protected function __construct(int $level, Requirement $versionRequirement) - { - parent::__construct($level); - - $this->versionRequirement = $versionRequirement; - } - - /** - * @psalm-assert-if-true RequiresPhpunit $this - */ - public function isRequiresPhpunit(): bool - { - return true; - } - - public function versionRequirement(): Requirement - { - return $this->versionRequirement; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/RequiresSetting.php b/vendor/phpunit/phpunit/src/Metadata/RequiresSetting.php deleted file mode 100644 index 03f710d..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/RequiresSetting.php +++ /dev/null @@ -1,65 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class RequiresSetting extends Metadata -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $setting; - - /** - * @psalm-var non-empty-string - */ - private readonly string $value; - - /** - * @psalm-param 0|1 $level - * @psalm-param non-empty-string $setting - * @psalm-param non-empty-string $value - */ - protected function __construct(int $level, string $setting, string $value) - { - parent::__construct($level); - - $this->setting = $setting; - $this->value = $value; - } - - /** - * @psalm-assert-if-true RequiresSetting $this - */ - public function isRequiresSetting(): bool - { - return true; - } - - /** - * @psalm-return non-empty-string - */ - public function setting(): string - { - return $this->setting; - } - - /** - * @psalm-return non-empty-string - */ - public function value(): string - { - return $this->value; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/RunClassInSeparateProcess.php b/vendor/phpunit/phpunit/src/Metadata/RunClassInSeparateProcess.php deleted file mode 100644 index eb0b774..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/RunClassInSeparateProcess.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class RunClassInSeparateProcess extends Metadata -{ - /** - * @psalm-assert-if-true RunClassInSeparateProcess $this - */ - public function isRunClassInSeparateProcess(): bool - { - return true; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/RunInSeparateProcess.php b/vendor/phpunit/phpunit/src/Metadata/RunInSeparateProcess.php deleted file mode 100644 index 62d552a..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/RunInSeparateProcess.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class RunInSeparateProcess extends Metadata -{ - /** - * @psalm-assert-if-true RunInSeparateProcess $this - */ - public function isRunInSeparateProcess(): bool - { - return true; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/RunTestsInSeparateProcesses.php b/vendor/phpunit/phpunit/src/Metadata/RunTestsInSeparateProcesses.php deleted file mode 100644 index ea0807a..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/RunTestsInSeparateProcesses.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class RunTestsInSeparateProcesses extends Metadata -{ - /** - * @psalm-assert-if-true RunTestsInSeparateProcesses $this - */ - public function isRunTestsInSeparateProcesses(): bool - { - return true; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/Test.php b/vendor/phpunit/phpunit/src/Metadata/Test.php deleted file mode 100644 index 6d2aeec..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/Test.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class Test extends Metadata -{ - /** - * @psalm-assert-if-true Test $this - */ - public function isTest(): bool - { - return true; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/TestDox.php b/vendor/phpunit/phpunit/src/Metadata/TestDox.php deleted file mode 100644 index d78d86c..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/TestDox.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class TestDox extends Metadata -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $text; - - /** - * @psalm-param 0|1 $level - * @psalm-param non-empty-string $text - */ - protected function __construct(int $level, string $text) - { - parent::__construct($level); - - $this->text = $text; - } - - /** - * @psalm-assert-if-true TestDox $this - */ - public function isTestDox(): bool - { - return true; - } - - /** - * @psalm-return non-empty-string - */ - public function text(): string - { - return $this->text; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/TestWith.php b/vendor/phpunit/phpunit/src/Metadata/TestWith.php deleted file mode 100644 index e1ffec7..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/TestWith.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class TestWith extends Metadata -{ - private readonly mixed $data; - - /** - * @psalm-param 0|1 $level - */ - protected function __construct(int $level, mixed $data) - { - parent::__construct($level); - - $this->data = $data; - } - - /** - * @psalm-assert-if-true TestWith $this - */ - public function isTestWith(): bool - { - return true; - } - - public function data(): mixed - { - return $this->data; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/Uses.php b/vendor/phpunit/phpunit/src/Metadata/Uses.php deleted file mode 100644 index d3fa216..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/Uses.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class Uses extends Metadata -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $target; - - /** - * @psalm-param 0|1 $level - * @psalm-param non-empty-string $target - */ - protected function __construct(int $level, string $target) - { - parent::__construct($level); - - $this->target = $target; - } - - /** - * @psalm-assert-if-true Uses $this - */ - public function isUses(): bool - { - return true; - } - - /** - * @psalm-return non-empty-string - */ - public function target(): string - { - return $this->target; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/UsesClass.php b/vendor/phpunit/phpunit/src/Metadata/UsesClass.php deleted file mode 100644 index 01e7741..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/UsesClass.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class UsesClass extends Metadata -{ - /** - * @psalm-var class-string - */ - private readonly string $className; - - /** - * @psalm-param 0|1 $level - * @psalm-param class-string $className - */ - protected function __construct(int $level, string $className) - { - parent::__construct($level); - - $this->className = $className; - } - - /** - * @psalm-assert-if-true UsesClass $this - */ - public function isUsesClass(): bool - { - return true; - } - - /** - * @psalm-return class-string - */ - public function className(): string - { - return $this->className; - } - - /** - * @psalm-return class-string - * - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function asStringForCodeUnitMapper(): string - { - return $this->className; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/UsesDefaultClass.php b/vendor/phpunit/phpunit/src/Metadata/UsesDefaultClass.php deleted file mode 100644 index 48a8247..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/UsesDefaultClass.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class UsesDefaultClass extends Metadata -{ - /** - * @psalm-var class-string - */ - private readonly string $className; - - /** - * @psalm-param 0|1 $level - * @psalm-param class-string $className - */ - protected function __construct(int $level, string $className) - { - parent::__construct($level); - - $this->className = $className; - } - - /** - * @psalm-assert-if-true UsesDefaultClass $this - */ - public function isUsesDefaultClass(): bool - { - return true; - } - - /** - * @psalm-return class-string - */ - public function className(): string - { - return $this->className; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/UsesFunction.php b/vendor/phpunit/phpunit/src/Metadata/UsesFunction.php deleted file mode 100644 index 357dc1a..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/UsesFunction.php +++ /dev/null @@ -1,58 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class UsesFunction extends Metadata -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $functionName; - - /** - * @psalm-param 0|1 $level - * @psalm-param non-empty-string $functionName - */ - protected function __construct(int $level, string $functionName) - { - parent::__construct($level); - - $this->functionName = $functionName; - } - - /** - * @psalm-assert-if-true UsesFunction $this - */ - public function isUsesFunction(): bool - { - return true; - } - - /** - * @psalm-return non-empty-string - */ - public function functionName(): string - { - return $this->functionName; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function asStringForCodeUnitMapper(): string - { - return '::' . $this->functionName; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/Version/ComparisonRequirement.php b/vendor/phpunit/phpunit/src/Metadata/Version/ComparisonRequirement.php deleted file mode 100644 index 86aefaf..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/Version/ComparisonRequirement.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata\Version; - -use function version_compare; -use PHPUnit\Util\VersionComparisonOperator; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class ComparisonRequirement extends Requirement -{ - private readonly string $version; - private readonly VersionComparisonOperator $operator; - - public function __construct(string $version, VersionComparisonOperator $operator) - { - $this->version = $version; - $this->operator = $operator; - } - - public function isSatisfiedBy(string $version): bool - { - return version_compare($version, $this->version, $this->operator->asString()); - } - - public function asString(): string - { - return $this->operator->asString() . ' ' . $this->version; - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/Version/ConstraintRequirement.php b/vendor/phpunit/phpunit/src/Metadata/Version/ConstraintRequirement.php deleted file mode 100644 index 3285789..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/Version/ConstraintRequirement.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata\Version; - -use function preg_replace; -use PharIo\Version\Version; -use PharIo\Version\VersionConstraint; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class ConstraintRequirement extends Requirement -{ - private readonly VersionConstraint $constraint; - - public function __construct(VersionConstraint $constraint) - { - $this->constraint = $constraint; - } - - /** - * @psalm-suppress ImpureMethodCall - */ - public function isSatisfiedBy(string $version): bool - { - return $this->constraint->complies( - new Version($this->sanitize($version)), - ); - } - - /** - * @psalm-suppress ImpureMethodCall - */ - public function asString(): string - { - return $this->constraint->asString(); - } - - private function sanitize(string $version): string - { - return preg_replace( - '/^(\d+\.\d+(?:.\d+)?).*$/', - '$1', - $version, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Metadata/Version/Requirement.php b/vendor/phpunit/phpunit/src/Metadata/Version/Requirement.php deleted file mode 100644 index a61e500..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/Version/Requirement.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata\Version; - -use function preg_match; -use PharIo\Version\UnsupportedVersionConstraintException; -use PharIo\Version\VersionConstraintParser; -use PHPUnit\Metadata\InvalidVersionRequirementException; -use PHPUnit\Util\InvalidVersionOperatorException; -use PHPUnit\Util\VersionComparisonOperator; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -abstract class Requirement -{ - private const VERSION_COMPARISON = '/(?P[<>=!]{0,2})\s*(?P[\d\.-]+(dev|(RC|alpha|beta)[\d\.])?)[ \t]*\r?$/m'; - - /** - * @throws InvalidVersionOperatorException - * @throws InvalidVersionRequirementException - */ - public static function from(string $versionRequirement): self - { - try { - return new ConstraintRequirement( - (new VersionConstraintParser)->parse( - $versionRequirement, - ), - ); - } catch (UnsupportedVersionConstraintException) { - if (preg_match(self::VERSION_COMPARISON, $versionRequirement, $matches)) { - return new ComparisonRequirement( - $matches['version'], - new VersionComparisonOperator( - !empty($matches['operator']) ? $matches['operator'] : '>=', - ), - ); - } - } - - throw new InvalidVersionRequirementException; - } - - abstract public function isSatisfiedBy(string $version): bool; - - abstract public function asString(): string; -} diff --git a/vendor/phpunit/phpunit/src/Metadata/WithoutErrorHandler.php b/vendor/phpunit/phpunit/src/Metadata/WithoutErrorHandler.php deleted file mode 100644 index d10f41e..0000000 --- a/vendor/phpunit/phpunit/src/Metadata/WithoutErrorHandler.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Metadata; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class WithoutErrorHandler extends Metadata -{ - /** - * @psalm-assert-if-true WithoutErrorHandler $this - */ - public function isWithoutErrorHandler(): bool - { - return true; - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/Baseline/Baseline.php b/vendor/phpunit/phpunit/src/Runner/Baseline/Baseline.php deleted file mode 100644 index 3e38617..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Baseline/Baseline.php +++ /dev/null @@ -1,61 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\Baseline; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Baseline -{ - public const VERSION = 1; - - /** - * @psalm-var array>> - */ - private array $issues = []; - - public function add(Issue $issue): void - { - if (!isset($this->issues[$issue->file()])) { - $this->issues[$issue->file()] = []; - } - - if (!isset($this->issues[$issue->file()][$issue->line()])) { - $this->issues[$issue->file()][$issue->line()] = []; - } - - $this->issues[$issue->file()][$issue->line()][] = $issue; - } - - public function has(Issue $issue): bool - { - if (!isset($this->issues[$issue->file()][$issue->line()])) { - return false; - } - - foreach ($this->issues[$issue->file()][$issue->line()] as $_issue) { - if ($_issue->equals($issue)) { - return true; - } - } - - return false; - } - - /** - * @psalm-return array>> - */ - public function groupedByFileAndLine(): array - { - return $this->issues; - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/Baseline/Exception/CannotLoadBaselineException.php b/vendor/phpunit/phpunit/src/Runner/Baseline/Exception/CannotLoadBaselineException.php deleted file mode 100644 index c559013..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Baseline/Exception/CannotLoadBaselineException.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\Baseline; - -use PHPUnit\Runner\Exception; -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class CannotLoadBaselineException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Runner/Baseline/Exception/FileDoesNotHaveLineException.php b/vendor/phpunit/phpunit/src/Runner/Baseline/Exception/FileDoesNotHaveLineException.php deleted file mode 100644 index 20c6ca0..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Baseline/Exception/FileDoesNotHaveLineException.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\Baseline; - -use function sprintf; -use PHPUnit\Runner\Exception; -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class FileDoesNotHaveLineException extends RuntimeException implements Exception -{ - public function __construct(string $file, int $line) - { - parent::__construct( - sprintf( - 'File "%s" does not have line %d', - $file, - $line, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/Baseline/Generator.php b/vendor/phpunit/phpunit/src/Runner/Baseline/Generator.php deleted file mode 100644 index 8cba0e0..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Baseline/Generator.php +++ /dev/null @@ -1,120 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\Baseline; - -use PHPUnit\Event\EventFacadeIsSealedException; -use PHPUnit\Event\Facade; -use PHPUnit\Event\Test\DeprecationTriggered; -use PHPUnit\Event\Test\NoticeTriggered; -use PHPUnit\Event\Test\PhpDeprecationTriggered; -use PHPUnit\Event\Test\PhpNoticeTriggered; -use PHPUnit\Event\Test\PhpWarningTriggered; -use PHPUnit\Event\Test\WarningTriggered; -use PHPUnit\Event\UnknownSubscriberTypeException; -use PHPUnit\Runner\FileDoesNotExistException; -use PHPUnit\TextUI\Configuration\Source; -use PHPUnit\TextUI\Configuration\SourceFilter; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Generator -{ - private Baseline $baseline; - private readonly Source $source; - - /** - * @throws EventFacadeIsSealedException - * @throws UnknownSubscriberTypeException - */ - public function __construct(Facade $facade, Source $source) - { - $facade->registerSubscribers( - new TestTriggeredDeprecationSubscriber($this), - new TestTriggeredNoticeSubscriber($this), - new TestTriggeredPhpDeprecationSubscriber($this), - new TestTriggeredPhpNoticeSubscriber($this), - new TestTriggeredPhpWarningSubscriber($this), - new TestTriggeredWarningSubscriber($this), - ); - - $this->baseline = new Baseline; - $this->source = $source; - } - - public function baseline(): Baseline - { - return $this->baseline; - } - - /** - * @throws FileDoesNotExistException - * @throws FileDoesNotHaveLineException - */ - public function testTriggeredIssue(DeprecationTriggered|NoticeTriggered|PhpDeprecationTriggered|PhpNoticeTriggered|PhpWarningTriggered|WarningTriggered $event): void - { - if ($event->wasSuppressed() && !$this->isSuppressionIgnored($event)) { - return; - } - - if ($this->restrict($event) && !SourceFilter::instance()->includes($event->file())) { - return; - } - - $this->baseline->add( - Issue::from( - $event->file(), - $event->line(), - null, - $event->message(), - ), - ); - } - - private function restrict(DeprecationTriggered|NoticeTriggered|PhpDeprecationTriggered|PhpNoticeTriggered|PhpWarningTriggered|WarningTriggered $event): bool - { - if ($event instanceof WarningTriggered || $event instanceof PhpWarningTriggered) { - return $this->source->restrictWarnings(); - } - - if ($event instanceof NoticeTriggered || $event instanceof PhpNoticeTriggered) { - return $this->source->restrictNotices(); - } - - return $this->source->restrictDeprecations(); - } - - private function isSuppressionIgnored(DeprecationTriggered|NoticeTriggered|PhpDeprecationTriggered|PhpNoticeTriggered|PhpWarningTriggered|WarningTriggered $event): bool - { - if ($event instanceof WarningTriggered) { - return $this->source->ignoreSuppressionOfWarnings(); - } - - if ($event instanceof PhpWarningTriggered) { - return $this->source->ignoreSuppressionOfPhpWarnings(); - } - - if ($event instanceof PhpNoticeTriggered) { - return $this->source->ignoreSuppressionOfPhpNotices(); - } - - if ($event instanceof NoticeTriggered) { - return $this->source->ignoreSuppressionOfNotices(); - } - - if ($event instanceof PhpDeprecationTriggered) { - return $this->source->ignoreSuppressionOfPhpDeprecations(); - } - - return $this->source->ignoreSuppressionOfDeprecations(); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/Baseline/Issue.php b/vendor/phpunit/phpunit/src/Runner/Baseline/Issue.php deleted file mode 100644 index b0b5e27..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Baseline/Issue.php +++ /dev/null @@ -1,147 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\Baseline; - -use const FILE_IGNORE_NEW_LINES; -use function assert; -use function file; -use function is_file; -use function sha1; -use PHPUnit\Runner\FileDoesNotExistException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Issue -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $file; - - /** - * @psalm-var positive-int - */ - private readonly int $line; - - /** - * @psalm-var non-empty-string - */ - private readonly string $hash; - - /** - * @psalm-var non-empty-string - */ - private readonly string $description; - - /** - * @psalm-param non-empty-string $file - * @psalm-param positive-int $line - * @psalm-param ?non-empty-string $hash - * @psalm-param non-empty-string $description - * - * @throws FileDoesNotExistException - * @throws FileDoesNotHaveLineException - */ - public static function from(string $file, int $line, ?string $hash, string $description): self - { - if ($hash === null) { - $hash = self::calculateHash($file, $line); - } - - return new self($file, $line, $hash, $description); - } - - /** - * @psalm-param non-empty-string $file - * @psalm-param positive-int $line - * @psalm-param non-empty-string $hash - * @psalm-param non-empty-string $description - */ - private function __construct(string $file, int $line, string $hash, string $description) - { - $this->file = $file; - $this->line = $line; - $this->hash = $hash; - $this->description = $description; - } - - /** - * @psalm-return non-empty-string - */ - public function file(): string - { - return $this->file; - } - - /** - * @psalm-return positive-int - */ - public function line(): int - { - return $this->line; - } - - /** - * @psalm-return non-empty-string - */ - public function hash(): string - { - return $this->hash; - } - - /** - * @psalm-return non-empty-string - */ - public function description(): string - { - return $this->description; - } - - public function equals(self $other): bool - { - return $this->file() === $other->file() && - $this->line() === $other->line() && - $this->hash() === $other->hash() && - $this->description() === $other->description(); - } - - /** - * @psalm-param non-empty-string $file - * @psalm-param positive-int $line - * - * @throws FileDoesNotExistException - * @throws FileDoesNotHaveLineException - * - * @psalm-return non-empty-string - */ - private static function calculateHash(string $file, int $line): string - { - $lines = @file($file, FILE_IGNORE_NEW_LINES); - - if ($lines === false && !is_file($file)) { - throw new FileDoesNotExistException($file); - } - - $key = $line - 1; - - if (!isset($lines[$key])) { - throw new FileDoesNotHaveLineException($file, $line); - } - - $hash = sha1($lines[$key]); - - assert($hash !== ''); - - return $hash; - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/Baseline/Reader.php b/vendor/phpunit/phpunit/src/Runner/Baseline/Reader.php deleted file mode 100644 index 09529b4..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Baseline/Reader.php +++ /dev/null @@ -1,102 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\Baseline; - -use const DIRECTORY_SEPARATOR; -use function assert; -use function dirname; -use function is_file; -use function realpath; -use function sprintf; -use function str_replace; -use function trim; -use DOMElement; -use DOMXPath; -use PHPUnit\Util\Xml\Loader as XmlLoader; -use PHPUnit\Util\Xml\XmlException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Reader -{ - /** - * @psalm-param non-empty-string $baselineFile - * - * @throws CannotLoadBaselineException - */ - public function read(string $baselineFile): Baseline - { - if (!is_file($baselineFile)) { - throw new CannotLoadBaselineException( - sprintf( - 'Cannot read baseline %s, file does not exist', - $baselineFile, - ), - ); - } - - try { - $document = (new XmlLoader)->loadFile($baselineFile); - } catch (XmlException $e) { - throw new CannotLoadBaselineException( - sprintf( - 'Cannot read baseline: %s', - trim($e->getMessage()), - ), - ); - } - - $version = (int) $document->documentElement->getAttribute('version'); - - if ($version !== Baseline::VERSION) { - throw new CannotLoadBaselineException( - sprintf( - 'Cannot read baseline %s, version %d is not supported', - $baselineFile, - $version, - ), - ); - } - - $baseline = new Baseline; - $baselineDirectory = dirname(realpath($baselineFile)); - $xpath = new DOMXPath($document); - - foreach ($xpath->query('file') as $fileElement) { - assert($fileElement instanceof DOMElement); - - $file = $baselineDirectory . DIRECTORY_SEPARATOR . str_replace('/', DIRECTORY_SEPARATOR, $fileElement->getAttribute('path')); - - foreach ($xpath->query('line', $fileElement) as $lineElement) { - assert($lineElement instanceof DOMElement); - - $line = (int) $lineElement->getAttribute('number'); - $hash = $lineElement->getAttribute('hash'); - - foreach ($xpath->query('issue', $lineElement) as $issueElement) { - assert($issueElement instanceof DOMElement); - - $description = $issueElement->textContent; - - assert($line > 0); - assert(!empty($hash)); - assert(!empty($description)); - - $baseline->add(Issue::from($file, $line, $hash, $description)); - } - } - } - - return $baseline; - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/Baseline/RelativePathCalculator.php b/vendor/phpunit/phpunit/src/Runner/Baseline/RelativePathCalculator.php deleted file mode 100644 index 5172d61..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Baseline/RelativePathCalculator.php +++ /dev/null @@ -1,105 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\Baseline; - -use function array_fill; -use function array_merge; -use function array_slice; -use function assert; -use function count; -use function explode; -use function implode; -use function str_replace; -use function strpos; -use function substr; -use function trim; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @see Copied from https://github.com/phpstan/phpstan-src/blob/1.10.33/src/File/ParentDirectoryRelativePathHelper.php - */ -final class RelativePathCalculator -{ - /** - * @psalm-var non-empty-string $baselineDirectory - */ - private readonly string $baselineDirectory; - - /** - * @psalm-param non-empty-string $baselineDirectory - */ - public function __construct(string $baselineDirectory) - { - $this->baselineDirectory = $baselineDirectory; - } - - /** - * @psalm-param non-empty-string $filename - * - * @psalm-return non-empty-string - */ - public function calculate(string $filename): string - { - $result = implode('/', $this->parts($filename)); - - assert($result !== ''); - - return $result; - } - - /** - * @psalm-param non-empty-string $filename - * - * @psalm-return list - */ - public function parts(string $filename): array - { - $schemePosition = strpos($filename, '://'); - - if ($schemePosition !== false) { - $filename = substr($filename, $schemePosition + 3); - - assert($filename !== ''); - } - - $parentParts = explode('/', trim(str_replace('\\', '/', $this->baselineDirectory), '/')); - $parentPartsCount = count($parentParts); - $filenameParts = explode('/', trim(str_replace('\\', '/', $filename), '/')); - $filenamePartsCount = count($filenameParts); - - $i = 0; - - for (; $i < $filenamePartsCount; $i++) { - if ($parentPartsCount < $i + 1) { - break; - } - - $parentPath = implode('/', array_slice($parentParts, 0, $i + 1)); - $filenamePath = implode('/', array_slice($filenameParts, 0, $i + 1)); - - if ($parentPath !== $filenamePath) { - break; - } - } - - if ($i === 0) { - return [$filename]; - } - - $dotsCount = $parentPartsCount - $i; - - assert($dotsCount >= 0); - - return array_merge(array_fill(0, $dotsCount, '..'), array_slice($filenameParts, $i)); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/Subscriber.php b/vendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/Subscriber.php deleted file mode 100644 index 5007bfc..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/Subscriber.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\Baseline; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -abstract class Subscriber -{ - private readonly Generator $generator; - - public function __construct(Generator $generator) - { - $this->generator = $generator; - } - - protected function generator(): Generator - { - return $this->generator; - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredDeprecationSubscriber.php b/vendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredDeprecationSubscriber.php deleted file mode 100644 index 62c8ed1..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredDeprecationSubscriber.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\Baseline; - -use PHPUnit\Event\Test\DeprecationTriggered; -use PHPUnit\Event\Test\DeprecationTriggeredSubscriber; -use PHPUnit\Runner\FileDoesNotExistException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestTriggeredDeprecationSubscriber extends Subscriber implements DeprecationTriggeredSubscriber -{ - /** - * @throws FileDoesNotExistException - * @throws FileDoesNotHaveLineException - */ - public function notify(DeprecationTriggered $event): void - { - $this->generator()->testTriggeredIssue($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredNoticeSubscriber.php b/vendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredNoticeSubscriber.php deleted file mode 100644 index 9eec35f..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredNoticeSubscriber.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\Baseline; - -use PHPUnit\Event\Test\NoticeTriggered; -use PHPUnit\Event\Test\NoticeTriggeredSubscriber; -use PHPUnit\Runner\FileDoesNotExistException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestTriggeredNoticeSubscriber extends Subscriber implements NoticeTriggeredSubscriber -{ - /** - * @throws FileDoesNotExistException - * @throws FileDoesNotHaveLineException - */ - public function notify(NoticeTriggered $event): void - { - $this->generator()->testTriggeredIssue($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredPhpDeprecationSubscriber.php b/vendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredPhpDeprecationSubscriber.php deleted file mode 100644 index 43ae644..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredPhpDeprecationSubscriber.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\Baseline; - -use PHPUnit\Event\Test\PhpDeprecationTriggered; -use PHPUnit\Event\Test\PhpDeprecationTriggeredSubscriber; -use PHPUnit\Runner\FileDoesNotExistException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestTriggeredPhpDeprecationSubscriber extends Subscriber implements PhpDeprecationTriggeredSubscriber -{ - /** - * @throws FileDoesNotExistException - * @throws FileDoesNotHaveLineException - */ - public function notify(PhpDeprecationTriggered $event): void - { - $this->generator()->testTriggeredIssue($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredPhpNoticeSubscriber.php b/vendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredPhpNoticeSubscriber.php deleted file mode 100644 index d3e9625..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredPhpNoticeSubscriber.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\Baseline; - -use PHPUnit\Event\Test\PhpNoticeTriggered; -use PHPUnit\Event\Test\PhpNoticeTriggeredSubscriber; -use PHPUnit\Runner\FileDoesNotExistException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestTriggeredPhpNoticeSubscriber extends Subscriber implements PhpNoticeTriggeredSubscriber -{ - /** - * @throws FileDoesNotExistException - * @throws FileDoesNotHaveLineException - */ - public function notify(PhpNoticeTriggered $event): void - { - $this->generator()->testTriggeredIssue($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredPhpWarningSubscriber.php b/vendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredPhpWarningSubscriber.php deleted file mode 100644 index 00bd4b5..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredPhpWarningSubscriber.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\Baseline; - -use PHPUnit\Event\Test\PhpWarningTriggered; -use PHPUnit\Event\Test\PhpWarningTriggeredSubscriber; -use PHPUnit\Runner\FileDoesNotExistException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestTriggeredPhpWarningSubscriber extends Subscriber implements PhpWarningTriggeredSubscriber -{ - /** - * @throws FileDoesNotExistException - * @throws FileDoesNotHaveLineException - */ - public function notify(PhpWarningTriggered $event): void - { - $this->generator()->testTriggeredIssue($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredWarningSubscriber.php b/vendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredWarningSubscriber.php deleted file mode 100644 index ed21fe8..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredWarningSubscriber.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\Baseline; - -use PHPUnit\Event\Test\WarningTriggered; -use PHPUnit\Event\Test\WarningTriggeredSubscriber; -use PHPUnit\Runner\FileDoesNotExistException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestTriggeredWarningSubscriber extends Subscriber implements WarningTriggeredSubscriber -{ - /** - * @throws FileDoesNotExistException - * @throws FileDoesNotHaveLineException - */ - public function notify(WarningTriggered $event): void - { - $this->generator()->testTriggeredIssue($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/Baseline/Writer.php b/vendor/phpunit/phpunit/src/Runner/Baseline/Writer.php deleted file mode 100644 index 8703269..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Baseline/Writer.php +++ /dev/null @@ -1,67 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\Baseline; - -use function assert; -use function dirname; -use function file_put_contents; -use XMLWriter; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Writer -{ - /** - * @psalm-param non-empty-string $baselineFile - */ - public function write(string $baselineFile, Baseline $baseline): void - { - $pathCalculator = new RelativePathCalculator(dirname($baselineFile)); - - $writer = new XMLWriter; - - $writer->openMemory(); - $writer->setIndent(true); - $writer->startDocument(); - - $writer->startElement('files'); - $writer->writeAttribute('version', (string) Baseline::VERSION); - - foreach ($baseline->groupedByFileAndLine() as $file => $lines) { - assert(!empty($file)); - - $writer->startElement('file'); - $writer->writeAttribute('path', $pathCalculator->calculate($file)); - - foreach ($lines as $line => $issues) { - $writer->startElement('line'); - $writer->writeAttribute('number', (string) $line); - $writer->writeAttribute('hash', $issues[0]->hash()); - - foreach ($issues as $issue) { - $writer->startElement('issue'); - $writer->writeCData($issue->description()); - $writer->endElement(); - } - - $writer->endElement(); - } - - $writer->endElement(); - } - - $writer->endElement(); - - file_put_contents($baselineFile, $writer->outputMemory()); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/CodeCoverage.php b/vendor/phpunit/phpunit/src/Runner/CodeCoverage.php deleted file mode 100644 index e6faf41..0000000 --- a/vendor/phpunit/phpunit/src/Runner/CodeCoverage.php +++ /dev/null @@ -1,426 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -use function file_put_contents; -use function sprintf; -use PHPUnit\Event\Facade as EventFacade; -use PHPUnit\Event\TestData\MoreThanOneDataSetFromDataProviderException; -use PHPUnit\Framework\TestCase; -use PHPUnit\TextUI\Configuration\CodeCoverageFilterRegistry; -use PHPUnit\TextUI\Configuration\Configuration; -use PHPUnit\TextUI\Output\Printer; -use SebastianBergmann\CodeCoverage\Driver\Driver; -use SebastianBergmann\CodeCoverage\Driver\Selector; -use SebastianBergmann\CodeCoverage\Exception as CodeCoverageException; -use SebastianBergmann\CodeCoverage\Filter; -use SebastianBergmann\CodeCoverage\Report\Clover as CloverReport; -use SebastianBergmann\CodeCoverage\Report\Cobertura as CoberturaReport; -use SebastianBergmann\CodeCoverage\Report\Crap4j as Crap4jReport; -use SebastianBergmann\CodeCoverage\Report\Html\Colors; -use SebastianBergmann\CodeCoverage\Report\Html\CustomCssFile; -use SebastianBergmann\CodeCoverage\Report\Html\Facade as HtmlReport; -use SebastianBergmann\CodeCoverage\Report\PHP as PhpReport; -use SebastianBergmann\CodeCoverage\Report\Text as TextReport; -use SebastianBergmann\CodeCoverage\Report\Thresholds; -use SebastianBergmann\CodeCoverage\Report\Xml\Facade as XmlReport; -use SebastianBergmann\CodeCoverage\Test\TestSize\TestSize; -use SebastianBergmann\CodeCoverage\Test\TestStatus\TestStatus; -use SebastianBergmann\Comparator\Comparator; -use SebastianBergmann\Timer\NoActiveTimerException; -use SebastianBergmann\Timer\Timer; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @codeCoverageIgnore - */ -final class CodeCoverage -{ - private static ?self $instance = null; - private ?\SebastianBergmann\CodeCoverage\CodeCoverage $codeCoverage = null; - private ?Driver $driver = null; - private bool $collecting = false; - private ?TestCase $test = null; - private ?Timer $timer = null; - - /** - * @psalm-var array> - */ - private array $linesToBeIgnored = []; - - public static function instance(): self - { - if (self::$instance === null) { - self::$instance = new self; - } - - return self::$instance; - } - - public function init(Configuration $configuration, CodeCoverageFilterRegistry $codeCoverageFilterRegistry, bool $extensionRequiresCodeCoverageCollection): void - { - $codeCoverageFilterRegistry->init($configuration); - - if (!$configuration->hasCoverageReport() && !$extensionRequiresCodeCoverageCollection) { - return; - } - - $this->activate($codeCoverageFilterRegistry->get(), $configuration->pathCoverage()); - - if (!$this->isActive()) { - return; - } - - if ($configuration->hasCoverageCacheDirectory()) { - $this->codeCoverage()->cacheStaticAnalysis($configuration->coverageCacheDirectory()); - } - - $this->codeCoverage()->excludeSubclassesOfThisClassFromUnintentionallyCoveredCodeCheck(Comparator::class); - - if ($configuration->strictCoverage()) { - $this->codeCoverage()->enableCheckForUnintentionallyCoveredCode(); - } - - if ($configuration->ignoreDeprecatedCodeUnitsFromCodeCoverage()) { - $this->codeCoverage()->ignoreDeprecatedCode(); - } else { - $this->codeCoverage()->doNotIgnoreDeprecatedCode(); - } - - if ($configuration->disableCodeCoverageIgnore()) { - $this->codeCoverage()->disableAnnotationsForIgnoringCode(); - } else { - $this->codeCoverage()->enableAnnotationsForIgnoringCode(); - } - - if ($configuration->includeUncoveredFiles()) { - $this->codeCoverage()->includeUncoveredFiles(); - } else { - $this->codeCoverage()->excludeUncoveredFiles(); - } - - if ($codeCoverageFilterRegistry->get()->isEmpty()) { - if (!$codeCoverageFilterRegistry->configured()) { - EventFacade::emitter()->testRunnerTriggeredPhpunitWarning( - 'No filter is configured, code coverage will not be processed', - ); - } else { - EventFacade::emitter()->testRunnerTriggeredPhpunitWarning( - 'Incorrect filter configuration, code coverage will not be processed', - ); - } - - $this->deactivate(); - } - } - - /** - * @psalm-assert-if-true !null $this->instance - */ - public function isActive(): bool - { - return $this->codeCoverage !== null; - } - - public function codeCoverage(): \SebastianBergmann\CodeCoverage\CodeCoverage - { - return $this->codeCoverage; - } - - public function driver(): Driver - { - return $this->driver; - } - - /** - * @throws MoreThanOneDataSetFromDataProviderException - */ - public function start(TestCase $test): void - { - if ($this->collecting) { - return; - } - - $size = TestSize::unknown(); - - if ($test->size()->isSmall()) { - $size = TestSize::small(); - } elseif ($test->size()->isMedium()) { - $size = TestSize::medium(); - } elseif ($test->size()->isLarge()) { - $size = TestSize::large(); - } - - $this->test = $test; - - $this->codeCoverage->start( - $test->valueObjectForEvents()->id(), - $size, - ); - - $this->collecting = true; - } - - public function stop(bool $append, array|false $linesToBeCovered = [], array $linesToBeUsed = []): void - { - if (!$this->collecting) { - return; - } - - $status = TestStatus::unknown(); - - if ($this->test !== null) { - if ($this->test->status()->isSuccess()) { - $status = TestStatus::success(); - } else { - $status = TestStatus::failure(); - } - } - - /* @noinspection UnusedFunctionResultInspection */ - $this->codeCoverage->stop($append, $status, $linesToBeCovered, $linesToBeUsed, $this->linesToBeIgnored); - - $this->test = null; - $this->collecting = false; - } - - public function deactivate(): void - { - $this->driver = null; - $this->codeCoverage = null; - $this->test = null; - } - - public function generateReports(Printer $printer, Configuration $configuration): void - { - if (!$this->isActive()) { - return; - } - - if ($configuration->hasCoveragePhp()) { - $this->codeCoverageGenerationStart($printer, 'PHP'); - - try { - $writer = new PhpReport; - $writer->process($this->codeCoverage(), $configuration->coveragePhp()); - - $this->codeCoverageGenerationSucceeded($printer); - - unset($writer); - } catch (CodeCoverageException $e) { - $this->codeCoverageGenerationFailed($printer, $e); - } - } - - if ($configuration->hasCoverageClover()) { - $this->codeCoverageGenerationStart($printer, 'Clover XML'); - - try { - $writer = new CloverReport; - $writer->process($this->codeCoverage(), $configuration->coverageClover()); - - $this->codeCoverageGenerationSucceeded($printer); - - unset($writer); - } catch (CodeCoverageException $e) { - $this->codeCoverageGenerationFailed($printer, $e); - } - } - - if ($configuration->hasCoverageCobertura()) { - $this->codeCoverageGenerationStart($printer, 'Cobertura XML'); - - try { - $writer = new CoberturaReport; - $writer->process($this->codeCoverage(), $configuration->coverageCobertura()); - - $this->codeCoverageGenerationSucceeded($printer); - - unset($writer); - } catch (CodeCoverageException $e) { - $this->codeCoverageGenerationFailed($printer, $e); - } - } - - if ($configuration->hasCoverageCrap4j()) { - $this->codeCoverageGenerationStart($printer, 'Crap4J XML'); - - try { - $writer = new Crap4jReport($configuration->coverageCrap4jThreshold()); - $writer->process($this->codeCoverage(), $configuration->coverageCrap4j()); - - $this->codeCoverageGenerationSucceeded($printer); - - unset($writer); - } catch (CodeCoverageException $e) { - $this->codeCoverageGenerationFailed($printer, $e); - } - } - - if ($configuration->hasCoverageHtml()) { - $this->codeCoverageGenerationStart($printer, 'HTML'); - - try { - $customCssFile = CustomCssFile::default(); - - if ($configuration->hasCoverageHtmlCustomCssFile()) { - $customCssFile = CustomCssFile::from($configuration->coverageHtmlCustomCssFile()); - } - - $writer = new HtmlReport( - sprintf( - ' and PHPUnit %s', - Version::id(), - ), - Colors::from( - $configuration->coverageHtmlColorSuccessLow(), - $configuration->coverageHtmlColorSuccessMedium(), - $configuration->coverageHtmlColorSuccessHigh(), - $configuration->coverageHtmlColorWarning(), - $configuration->coverageHtmlColorDanger(), - ), - Thresholds::from( - $configuration->coverageHtmlLowUpperBound(), - $configuration->coverageHtmlHighLowerBound(), - ), - $customCssFile, - ); - - $writer->process($this->codeCoverage(), $configuration->coverageHtml()); - - $this->codeCoverageGenerationSucceeded($printer); - - unset($writer); - } catch (CodeCoverageException $e) { - $this->codeCoverageGenerationFailed($printer, $e); - } - } - - if ($configuration->hasCoverageText()) { - $processor = new TextReport( - Thresholds::default(), - $configuration->coverageTextShowUncoveredFiles(), - $configuration->coverageTextShowOnlySummary(), - ); - - $textReport = $processor->process($this->codeCoverage(), $configuration->colors()); - - if ($configuration->coverageText() === 'php://stdout') { - if (!$configuration->noOutput() && !$configuration->debug()) { - $printer->print($textReport); - } - } else { - file_put_contents($configuration->coverageText(), $textReport); - } - } - - if ($configuration->hasCoverageXml()) { - $this->codeCoverageGenerationStart($printer, 'PHPUnit XML'); - - try { - $writer = new XmlReport(Version::id()); - $writer->process($this->codeCoverage(), $configuration->coverageXml()); - - $this->codeCoverageGenerationSucceeded($printer); - - unset($writer); - } catch (CodeCoverageException $e) { - $this->codeCoverageGenerationFailed($printer, $e); - } - } - } - - /** - * @psalm-param array> $linesToBeIgnored - */ - public function ignoreLines(array $linesToBeIgnored): void - { - $this->linesToBeIgnored = $linesToBeIgnored; - } - - /** - * @psalm-return array> - */ - public function linesToBeIgnored(): array - { - return $this->linesToBeIgnored; - } - - private function activate(Filter $filter, bool $pathCoverage): void - { - try { - if ($pathCoverage) { - $this->driver = (new Selector)->forLineAndPathCoverage($filter); - } else { - $this->driver = (new Selector)->forLineCoverage($filter); - } - - $this->codeCoverage = new \SebastianBergmann\CodeCoverage\CodeCoverage( - $this->driver, - $filter, - ); - } catch (CodeCoverageException $e) { - EventFacade::emitter()->testRunnerTriggeredPhpunitWarning( - $e->getMessage(), - ); - } - } - - private function codeCoverageGenerationStart(Printer $printer, string $format): void - { - $printer->print( - sprintf( - "\nGenerating code coverage report in %s format ... ", - $format, - ), - ); - - $this->timer()->start(); - } - - /** - * @throws NoActiveTimerException - */ - private function codeCoverageGenerationSucceeded(Printer $printer): void - { - $printer->print( - sprintf( - "done [%s]\n", - $this->timer()->stop()->asString(), - ), - ); - } - - /** - * @throws NoActiveTimerException - */ - private function codeCoverageGenerationFailed(Printer $printer, CodeCoverageException $e): void - { - $printer->print( - sprintf( - "failed [%s]\n%s\n", - $this->timer()->stop()->asString(), - $e->getMessage(), - ), - ); - } - - private function timer(): Timer - { - if ($this->timer === null) { - $this->timer = new Timer; - } - - return $this->timer; - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/ErrorHandler.php b/vendor/phpunit/phpunit/src/Runner/ErrorHandler.php deleted file mode 100644 index fd104ac..0000000 --- a/vendor/phpunit/phpunit/src/Runner/ErrorHandler.php +++ /dev/null @@ -1,225 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -use const E_COMPILE_ERROR; -use const E_COMPILE_WARNING; -use const E_CORE_ERROR; -use const E_CORE_WARNING; -use const E_DEPRECATED; -use const E_ERROR; -use const E_NOTICE; -use const E_PARSE; -use const E_RECOVERABLE_ERROR; -use const E_USER_DEPRECATED; -use const E_USER_ERROR; -use const E_USER_NOTICE; -use const E_USER_WARNING; -use const E_WARNING; -use function defined; -use function error_reporting; -use function restore_error_handler; -use function set_error_handler; -use PHPUnit\Event; -use PHPUnit\Event\Code\NoTestCaseObjectOnCallStackException; -use PHPUnit\Runner\Baseline\Baseline; -use PHPUnit\Runner\Baseline\Issue; -use PHPUnit\Util\ExcludeList; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ErrorHandler -{ - private const UNHANDLEABLE_LEVELS = E_ERROR | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING; - private const INSUPPRESSIBLE_LEVELS = E_ERROR | E_PARSE | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR | E_RECOVERABLE_ERROR; - private static ?self $instance = null; - private ?Baseline $baseline = null; - private bool $enabled = false; - private ?int $originalErrorReportingLevel = null; - - public static function instance(): self - { - return self::$instance ?? self::$instance = new self; - } - - /** - * @throws NoTestCaseObjectOnCallStackException - */ - public function __invoke(int $errorNumber, string $errorString, string $errorFile, int $errorLine): bool - { - $suppressed = (error_reporting() & ~self::INSUPPRESSIBLE_LEVELS) === 0; - - if ($suppressed && (new ExcludeList)->isExcluded($errorFile)) { - return false; - } - - /** - * E_STRICT is deprecated since PHP 8.4. - * - * @see https://github.com/sebastianbergmann/phpunit/issues/5956 - */ - if (defined('E_STRICT') && $errorNumber === 2048) { - $errorNumber = E_NOTICE; - } - - $test = Event\Code\TestMethodBuilder::fromCallStack(); - - $ignoredByBaseline = $this->ignoredByBaseline($errorFile, $errorLine, $errorString); - $ignoredByTest = $test->metadata()->isIgnoreDeprecations()->isNotEmpty(); - - switch ($errorNumber) { - case E_NOTICE: - Event\Facade::emitter()->testTriggeredPhpNotice( - $test, - $errorString, - $errorFile, - $errorLine, - $suppressed, - $ignoredByBaseline, - ); - - break; - - case E_USER_NOTICE: - Event\Facade::emitter()->testTriggeredNotice( - $test, - $errorString, - $errorFile, - $errorLine, - $suppressed, - $ignoredByBaseline, - ); - - break; - - case E_WARNING: - Event\Facade::emitter()->testTriggeredPhpWarning( - $test, - $errorString, - $errorFile, - $errorLine, - $suppressed, - $ignoredByBaseline, - ); - - break; - - case E_USER_WARNING: - Event\Facade::emitter()->testTriggeredWarning( - $test, - $errorString, - $errorFile, - $errorLine, - $suppressed, - $ignoredByBaseline, - ); - - break; - - case E_DEPRECATED: - Event\Facade::emitter()->testTriggeredPhpDeprecation( - $test, - $errorString, - $errorFile, - $errorLine, - $suppressed, - $ignoredByBaseline, - $ignoredByTest, - ); - - break; - - case E_USER_DEPRECATED: - Event\Facade::emitter()->testTriggeredDeprecation( - $test, - $errorString, - $errorFile, - $errorLine, - $suppressed, - $ignoredByBaseline, - $ignoredByTest, - ); - - break; - - case E_USER_ERROR: - Event\Facade::emitter()->testTriggeredError( - $test, - $errorString, - $errorFile, - $errorLine, - $suppressed, - ); - - throw new ErrorException('E_USER_ERROR was triggered'); - - default: - return false; - } - - return false; - } - - public function enable(): void - { - if ($this->enabled) { - return; - } - - $oldErrorHandler = set_error_handler($this); - - if ($oldErrorHandler !== null) { - restore_error_handler(); - - return; - } - - $this->enabled = true; - $this->originalErrorReportingLevel = error_reporting(); - - error_reporting($this->originalErrorReportingLevel & self::UNHANDLEABLE_LEVELS); - } - - public function disable(): void - { - if (!$this->enabled) { - return; - } - - restore_error_handler(); - - error_reporting(error_reporting() | $this->originalErrorReportingLevel); - - $this->enabled = false; - $this->originalErrorReportingLevel = null; - } - - public function use(Baseline $baseline): void - { - $this->baseline = $baseline; - } - - /** - * @psalm-param non-empty-string $file - * @psalm-param positive-int $line - * @psalm-param non-empty-string $description - */ - private function ignoredByBaseline(string $file, int $line, string $description): bool - { - if ($this->baseline === null) { - return false; - } - - return $this->baseline->has(Issue::from($file, $line, null, $description)); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/Exception/ClassCannotBeFoundException.php b/vendor/phpunit/phpunit/src/Runner/Exception/ClassCannotBeFoundException.php deleted file mode 100644 index 701cbb5..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Exception/ClassCannotBeFoundException.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -use function sprintf; -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ClassCannotBeFoundException extends RuntimeException implements Exception -{ - public function __construct(string $className, string $file) - { - parent::__construct( - sprintf( - 'Class %s cannot be found in %s', - $className, - $file, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/Exception/ClassDoesNotExtendTestCaseException.php b/vendor/phpunit/phpunit/src/Runner/Exception/ClassDoesNotExtendTestCaseException.php deleted file mode 100644 index c9d5474..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Exception/ClassDoesNotExtendTestCaseException.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -use function sprintf; -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ClassDoesNotExtendTestCaseException extends RuntimeException implements Exception -{ - public function __construct(string $className, string $file) - { - parent::__construct( - sprintf( - 'Class %s declared in %s does not extend PHPUnit\Framework\TestCase', - $className, - $file, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/Exception/ClassIsAbstractException.php b/vendor/phpunit/phpunit/src/Runner/Exception/ClassIsAbstractException.php deleted file mode 100644 index bf94758..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Exception/ClassIsAbstractException.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -use function sprintf; -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ClassIsAbstractException extends RuntimeException implements Exception -{ - public function __construct(string $className, string $file) - { - parent::__construct( - sprintf( - 'Class %s declared in %s is abstract', - $className, - $file, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/Exception/CodeCoverageFileExistsException.php b/vendor/phpunit/phpunit/src/Runner/Exception/CodeCoverageFileExistsException.php deleted file mode 100644 index 3ffde5b..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Exception/CodeCoverageFileExistsException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class CodeCoverageFileExistsException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Runner/Exception/DirectoryDoesNotExistException.php b/vendor/phpunit/phpunit/src/Runner/Exception/DirectoryDoesNotExistException.php deleted file mode 100644 index 626c422..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Exception/DirectoryDoesNotExistException.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -use function sprintf; -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class DirectoryDoesNotExistException extends RuntimeException implements Exception -{ - public function __construct(string $directory) - { - parent::__construct( - sprintf( - 'Directory "%s" does not exist and could not be created', - $directory, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/Exception/ErrorException.php b/vendor/phpunit/phpunit/src/Runner/Exception/ErrorException.php deleted file mode 100644 index c3f0b4d..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Exception/ErrorException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -use Error; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This interface is not covered by the backward compatibility promise for PHPUnit - */ -final class ErrorException extends Error implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Runner/Exception/Exception.php b/vendor/phpunit/phpunit/src/Runner/Exception/Exception.php deleted file mode 100644 index d2577c2..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Exception/Exception.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This interface is not covered by the backward compatibility promise for PHPUnit - */ -interface Exception extends \PHPUnit\Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Runner/Exception/FileDoesNotExistException.php b/vendor/phpunit/phpunit/src/Runner/Exception/FileDoesNotExistException.php deleted file mode 100644 index 5b84c78..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Exception/FileDoesNotExistException.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -use function sprintf; -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class FileDoesNotExistException extends RuntimeException implements Exception -{ - public function __construct(string $file) - { - parent::__construct( - sprintf( - 'File "%s" does not exist', - $file, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/Exception/InvalidOrderException.php b/vendor/phpunit/phpunit/src/Runner/Exception/InvalidOrderException.php deleted file mode 100644 index 016ec85..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Exception/InvalidOrderException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class InvalidOrderException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Runner/Exception/InvalidPhptFileException.php b/vendor/phpunit/phpunit/src/Runner/Exception/InvalidPhptFileException.php deleted file mode 100644 index d1f593b..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Exception/InvalidPhptFileException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class InvalidPhptFileException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Runner/Exception/ParameterDoesNotExistException.php b/vendor/phpunit/phpunit/src/Runner/Exception/ParameterDoesNotExistException.php deleted file mode 100644 index 5d7a096..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Exception/ParameterDoesNotExistException.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -use function sprintf; -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ParameterDoesNotExistException extends RuntimeException implements Exception -{ - public function __construct(string $name) - { - parent::__construct( - sprintf( - 'Parameter "%s" does not exist', - $name, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/Exception/PhptExternalFileCannotBeLoadedException.php b/vendor/phpunit/phpunit/src/Runner/Exception/PhptExternalFileCannotBeLoadedException.php deleted file mode 100644 index 3397715..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Exception/PhptExternalFileCannotBeLoadedException.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -use function sprintf; -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class PhptExternalFileCannotBeLoadedException extends RuntimeException implements Exception -{ - public function __construct(string $section, string $file) - { - parent::__construct( - sprintf( - 'Could not load --%s-- %s for PHPT file', - $section . '_EXTERNAL', - $file, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/Exception/UnsupportedPhptSectionException.php b/vendor/phpunit/phpunit/src/Runner/Exception/UnsupportedPhptSectionException.php deleted file mode 100644 index ca8647e..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Exception/UnsupportedPhptSectionException.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -use function sprintf; -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class UnsupportedPhptSectionException extends RuntimeException implements Exception -{ - public function __construct(string $section) - { - parent::__construct( - sprintf( - 'PHPUnit does not support PHPT %s sections', - $section, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/Extension/Extension.php b/vendor/phpunit/phpunit/src/Runner/Extension/Extension.php deleted file mode 100644 index 35610bc..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Extension/Extension.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\Extension; - -use PHPUnit\TextUI\Configuration\Configuration; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -interface Extension -{ - public function bootstrap(Configuration $configuration, Facade $facade, ParameterCollection $parameters): void; -} diff --git a/vendor/phpunit/phpunit/src/Runner/Extension/ExtensionBootstrapper.php b/vendor/phpunit/phpunit/src/Runner/Extension/ExtensionBootstrapper.php deleted file mode 100644 index eb90a45..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Extension/ExtensionBootstrapper.php +++ /dev/null @@ -1,97 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\Extension; - -use const PHP_EOL; -use function assert; -use function class_exists; -use function class_implements; -use function in_array; -use function sprintf; -use PHPUnit\Event\Facade as EventFacade; -use PHPUnit\TextUI\Configuration\Configuration; -use ReflectionClass; -use Throwable; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ExtensionBootstrapper -{ - private readonly Configuration $configuration; - private readonly Facade $facade; - - public function __construct(Configuration $configuration, Facade $facade) - { - $this->configuration = $configuration; - $this->facade = $facade; - } - - /** - * @psalm-param class-string $className - * @psalm-param array $parameters - */ - public function bootstrap(string $className, array $parameters): void - { - if (!class_exists($className)) { - EventFacade::emitter()->testRunnerTriggeredPhpunitWarning( - sprintf( - 'Cannot bootstrap extension because class %s does not exist', - $className, - ), - ); - - return; - } - - if (!in_array(Extension::class, class_implements($className), true)) { - EventFacade::emitter()->testRunnerTriggeredPhpunitWarning( - sprintf( - 'Cannot bootstrap extension because class %s does not implement interface %s', - $className, - Extension::class, - ), - ); - - return; - } - - try { - $instance = (new ReflectionClass($className))->newInstance(); - - assert($instance instanceof Extension); - - $instance->bootstrap( - $this->configuration, - $this->facade, - ParameterCollection::fromArray($parameters), - ); - } catch (Throwable $t) { - EventFacade::emitter()->testRunnerTriggeredPhpunitWarning( - sprintf( - 'Bootstrapping of extension %s failed: %s%s%s', - $className, - $t->getMessage(), - PHP_EOL, - $t->getTraceAsString(), - ), - ); - - return; - } - - EventFacade::emitter()->testRunnerBootstrappedExtension( - $className, - $parameters, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/Extension/Facade.php b/vendor/phpunit/phpunit/src/Runner/Extension/Facade.php deleted file mode 100644 index b168eb6..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Extension/Facade.php +++ /dev/null @@ -1,110 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\Extension; - -use PHPUnit\Event\EventFacadeIsSealedException; -use PHPUnit\Event\Facade as EventFacade; -use PHPUnit\Event\Subscriber; -use PHPUnit\Event\Tracer\Tracer; -use PHPUnit\Event\UnknownSubscriberTypeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class Facade -{ - private bool $replacesOutput = false; - private bool $replacesProgressOutput = false; - private bool $replacesResultOutput = false; - private bool $requiresCodeCoverageCollection = false; - private bool $requiresExportOfObjects = false; - - /** - * @throws EventFacadeIsSealedException - * @throws UnknownSubscriberTypeException - */ - public function registerSubscribers(Subscriber ...$subscribers): void - { - EventFacade::instance()->registerSubscribers(...$subscribers); - } - - /** - * @throws EventFacadeIsSealedException - * @throws UnknownSubscriberTypeException - */ - public function registerSubscriber(Subscriber $subscriber): void - { - EventFacade::instance()->registerSubscriber($subscriber); - } - - /** - * @throws EventFacadeIsSealedException - */ - public function registerTracer(Tracer $tracer): void - { - EventFacade::instance()->registerTracer($tracer); - } - - public function replaceOutput(): void - { - $this->replacesOutput = true; - } - - public function replacesOutput(): bool - { - return $this->replacesOutput; - } - - public function replaceProgressOutput(): void - { - $this->replacesProgressOutput = true; - } - - public function replacesProgressOutput(): bool - { - return $this->replacesOutput || $this->replacesProgressOutput; - } - - public function replaceResultOutput(): void - { - $this->replacesResultOutput = true; - } - - public function replacesResultOutput(): bool - { - return $this->replacesOutput || $this->replacesResultOutput; - } - - public function requireCodeCoverageCollection(): void - { - $this->requiresCodeCoverageCollection = true; - } - - public function requiresCodeCoverageCollection(): bool - { - return $this->requiresCodeCoverageCollection; - } - - /** - * @deprecated - */ - public function requireExportOfObjects(): void - { - $this->requiresExportOfObjects = true; - } - - /** - * @deprecated - */ - public function requiresExportOfObjects(): bool - { - return $this->requiresExportOfObjects; - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/Extension/ParameterCollection.php b/vendor/phpunit/phpunit/src/Runner/Extension/ParameterCollection.php deleted file mode 100644 index 08b0996..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Extension/ParameterCollection.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\Extension; - -use function array_key_exists; -use PHPUnit\Runner\ParameterDoesNotExistException; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class ParameterCollection -{ - private readonly array $parameters; - - /** - * @psalm-param array $parameters - */ - public static function fromArray(array $parameters): self - { - return new self($parameters); - } - - private function __construct(array $parameters) - { - $this->parameters = $parameters; - } - - public function has(string $name): bool - { - return array_key_exists($name, $this->parameters); - } - - /** - * @throws ParameterDoesNotExistException - */ - public function get(string $name): string - { - if (!$this->has($name)) { - throw new ParameterDoesNotExistException($name); - } - - return $this->parameters[$name]; - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/Extension/PharLoader.php b/vendor/phpunit/phpunit/src/Runner/Extension/PharLoader.php deleted file mode 100644 index 70750cf..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Extension/PharLoader.php +++ /dev/null @@ -1,150 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\Extension; - -use function count; -use function explode; -use function extension_loaded; -use function implode; -use function is_file; -use function sprintf; -use function str_contains; -use PharIo\Manifest\ApplicationName; -use PharIo\Manifest\Exception as ManifestException; -use PharIo\Manifest\ManifestLoader; -use PharIo\Version\Version as PharIoVersion; -use PHPUnit\Event; -use PHPUnit\Runner\Version; -use SebastianBergmann\FileIterator\Facade as FileIteratorFacade; -use Throwable; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class PharLoader -{ - /** - * @psalm-param non-empty-string $directory - * - * @psalm-return list - */ - public function loadPharExtensionsInDirectory(string $directory): array - { - $pharExtensionLoaded = extension_loaded('phar'); - $loadedExtensions = []; - - foreach ((new FileIteratorFacade)->getFilesAsArray($directory, '.phar') as $file) { - if (!$pharExtensionLoaded) { - Event\Facade::emitter()->testRunnerTriggeredPhpunitWarning( - sprintf( - 'Cannot load extension from %s because the PHAR extension is not available', - $file, - ), - ); - - continue; - } - - if (!is_file('phar://' . $file . '/manifest.xml')) { - Event\Facade::emitter()->testRunnerTriggeredPhpunitWarning( - sprintf( - '%s is not an extension for PHPUnit', - $file, - ), - ); - - continue; - } - - try { - $applicationName = new ApplicationName('phpunit/phpunit'); - $version = new PharIoVersion($this->phpunitVersion()); - $manifest = ManifestLoader::fromFile('phar://' . $file . '/manifest.xml'); - - if (!$manifest->isExtensionFor($applicationName)) { - Event\Facade::emitter()->testRunnerTriggeredPhpunitWarning( - sprintf( - '%s is not an extension for PHPUnit', - $file, - ), - ); - - continue; - } - - if (!$manifest->isExtensionFor($applicationName, $version)) { - Event\Facade::emitter()->testRunnerTriggeredPhpunitWarning( - sprintf( - '%s is not compatible with PHPUnit %s', - $file, - Version::series(), - ), - ); - - continue; - } - } catch (ManifestException $e) { - Event\Facade::emitter()->testRunnerTriggeredPhpunitWarning( - sprintf( - 'Cannot load extension from %s: %s', - $file, - $e->getMessage(), - ), - ); - - continue; - } - - try { - /** @psalm-suppress UnresolvableInclude */ - @require $file; - } catch (Throwable $t) { - Event\Facade::emitter()->testRunnerTriggeredPhpunitWarning( - sprintf( - 'Cannot load extension from %s: %s', - $file, - $t->getMessage(), - ), - ); - - continue; - } - - $loadedExtensions[] = $manifest->getName()->asString() . ' ' . $manifest->getVersion()->getVersionString(); - - Event\Facade::emitter()->testRunnerLoadedExtensionFromPhar( - $file, - $manifest->getName()->asString(), - $manifest->getVersion()->getVersionString(), - ); - } - - return $loadedExtensions; - } - - private function phpunitVersion(): string - { - $version = Version::id(); - - if (!str_contains($version, '-')) { - return $version; - } - - $parts = explode('.', explode('-', $version)[0]); - - if (count($parts) === 2) { - $parts[] = 0; - } - - return implode('.', $parts); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/Filter/ExcludeGroupFilterIterator.php b/vendor/phpunit/phpunit/src/Runner/Filter/ExcludeGroupFilterIterator.php deleted file mode 100644 index 63a26b4..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Filter/ExcludeGroupFilterIterator.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\Filter; - -use function in_array; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ExcludeGroupFilterIterator extends GroupFilterIterator -{ - protected function doAccept(int $id): bool - { - return !in_array($id, $this->groupTests, true); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/Filter/Factory.php b/vendor/phpunit/phpunit/src/Runner/Filter/Factory.php deleted file mode 100644 index 4afa5d9..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Filter/Factory.php +++ /dev/null @@ -1,81 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\Filter; - -use function assert; -use FilterIterator; -use Iterator; -use PHPUnit\Framework\TestSuite; -use ReflectionClass; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Factory -{ - /** - * @psalm-var array - */ - private array $filters = []; - - /** - * @psalm-param list $testIds - */ - public function addTestIdFilter(array $testIds): void - { - $this->filters[] = [ - new ReflectionClass(TestIdFilterIterator::class), $testIds, - ]; - } - - /** - * @psalm-param list $groups - */ - public function addExcludeGroupFilter(array $groups): void - { - $this->filters[] = [ - new ReflectionClass(ExcludeGroupFilterIterator::class), $groups, - ]; - } - - /** - * @psalm-param list $groups - */ - public function addIncludeGroupFilter(array $groups): void - { - $this->filters[] = [ - new ReflectionClass(IncludeGroupFilterIterator::class), $groups, - ]; - } - - /** - * @psalm-param non-empty-string $name - */ - public function addNameFilter(string $name): void - { - $this->filters[] = [ - new ReflectionClass(NameFilterIterator::class), $name, - ]; - } - - public function factory(Iterator $iterator, TestSuite $suite): FilterIterator - { - foreach ($this->filters as $filter) { - [$class, $arguments] = $filter; - $iterator = $class->newInstance($iterator, $arguments, $suite); - } - - assert($iterator instanceof FilterIterator); - - return $iterator; - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.php b/vendor/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.php deleted file mode 100644 index f2114de..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.php +++ /dev/null @@ -1,65 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\Filter; - -use function array_map; -use function array_push; -use function in_array; -use function spl_object_id; -use PHPUnit\Framework\Test; -use PHPUnit\Framework\TestSuite; -use RecursiveFilterIterator; -use RecursiveIterator; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -abstract class GroupFilterIterator extends RecursiveFilterIterator -{ - /** - * @psalm-var list - */ - protected array $groupTests = []; - - /** - * @psalm-param RecursiveIterator $iterator - * @psalm-param list $groups - */ - public function __construct(RecursiveIterator $iterator, array $groups, TestSuite $suite) - { - parent::__construct($iterator); - - foreach ($suite->groupDetails() as $group => $tests) { - if (in_array((string) $group, $groups, true)) { - $testHashes = array_map( - 'spl_object_id', - $tests, - ); - - array_push($this->groupTests, ...$testHashes); - } - } - } - - public function accept(): bool - { - $test = $this->getInnerIterator()->current(); - - if ($test instanceof TestSuite) { - return true; - } - - return $this->doAccept(spl_object_id($test)); - } - - abstract protected function doAccept(int $id): bool; -} diff --git a/vendor/phpunit/phpunit/src/Runner/Filter/IncludeGroupFilterIterator.php b/vendor/phpunit/phpunit/src/Runner/Filter/IncludeGroupFilterIterator.php deleted file mode 100644 index 34b0652..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Filter/IncludeGroupFilterIterator.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\Filter; - -use function in_array; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class IncludeGroupFilterIterator extends GroupFilterIterator -{ - protected function doAccept(int $id): bool - { - return in_array($id, $this->groupTests, true); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.php b/vendor/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.php deleted file mode 100644 index 5b0c63b..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.php +++ /dev/null @@ -1,142 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\Filter; - -use function end; -use function implode; -use function preg_match; -use function sprintf; -use function str_replace; -use function substr; -use Exception; -use PHPUnit\Framework\SelfDescribing; -use PHPUnit\Framework\Test; -use PHPUnit\Framework\TestCase; -use PHPUnit\Framework\TestSuite; -use RecursiveFilterIterator; -use RecursiveIterator; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class NameFilterIterator extends RecursiveFilterIterator -{ - private ?string $filter = null; - private ?int $filterMin = null; - private ?int $filterMax = null; - - /** - * @psalm-param RecursiveIterator $iterator - * @psalm-param non-empty-string $filter - * - * @throws Exception - */ - public function __construct(RecursiveIterator $iterator, string $filter) - { - parent::__construct($iterator); - - $this->setFilter($filter); - } - - public function accept(): bool - { - $test = $this->getInnerIterator()->current(); - - if ($test instanceof TestSuite) { - return true; - } - - $tmp = $this->describe($test); - - if ($tmp[0] !== '') { - $name = implode('::', $tmp); - } else { - $name = $tmp[1]; - } - - $accepted = @preg_match($this->filter, $name, $matches); - - if ($accepted && isset($this->filterMax)) { - $set = end($matches); - $accepted = $set >= $this->filterMin && $set <= $this->filterMax; - } - - return (bool) $accepted; - } - - /** - * @throws Exception - */ - private function setFilter(string $filter): void - { - if (preg_match('/[a-zA-Z0-9]/', substr($filter, 0, 1)) === 1 || @preg_match($filter, '') === false) { - // Handles: - // * testAssertEqualsSucceeds#4 - // * testAssertEqualsSucceeds#4-8 - if (preg_match('/^(.*?)#(\d+)(?:-(\d+))?$/', $filter, $matches)) { - if (isset($matches[3]) && $matches[2] < $matches[3]) { - $filter = sprintf( - '%s.*with data set #(\d+)$', - $matches[1], - ); - - $this->filterMin = (int) $matches[2]; - $this->filterMax = (int) $matches[3]; - } else { - $filter = sprintf( - '%s.*with data set #%s$', - $matches[1], - $matches[2], - ); - } - } // Handles: - // * testDetermineJsonError@JSON_ERROR_NONE - // * testDetermineJsonError@JSON.* - elseif (preg_match('/^(.*?)@(.+)$/', $filter, $matches)) { - $filter = sprintf( - '%s.*with data set "%s"$', - $matches[1], - $matches[2], - ); - } - - // Escape delimiters in regular expression. Do NOT use preg_quote, - // to keep magic characters. - $filter = sprintf( - '/%s/i', - str_replace( - '/', - '\\/', - $filter, - ), - ); - } - - $this->filter = $filter; - } - - /** - * @psalm-return array{0: string, 1: string} - */ - private function describe(Test $test): array - { - if ($test instanceof TestCase) { - return [$test::class, $test->nameWithDataSet()]; - } - - if ($test instanceof SelfDescribing) { - return ['', $test->toString()]; - } - - return ['', $test::class]; - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/Filter/TestIdFilterIterator.php b/vendor/phpunit/phpunit/src/Runner/Filter/TestIdFilterIterator.php deleted file mode 100644 index 3c6c773..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Filter/TestIdFilterIterator.php +++ /dev/null @@ -1,63 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\Filter; - -use function in_array; -use PHPUnit\Event\TestData\MoreThanOneDataSetFromDataProviderException; -use PHPUnit\Event\TestData\NoDataSetFromDataProviderException; -use PHPUnit\Framework\Test; -use PHPUnit\Framework\TestCase; -use PHPUnit\Framework\TestSuite; -use PHPUnit\Runner\PhptTestCase; -use RecursiveFilterIterator; -use RecursiveIterator; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestIdFilterIterator extends RecursiveFilterIterator -{ - /** - * @psalm-var non-empty-list - */ - private readonly array $testIds; - - /** - * @psalm-param RecursiveIterator $iterator - * @psalm-param non-empty-list $testIds - */ - public function __construct(RecursiveIterator $iterator, array $testIds) - { - parent::__construct($iterator); - - $this->testIds = $testIds; - } - - public function accept(): bool - { - $test = $this->getInnerIterator()->current(); - - if ($test instanceof TestSuite) { - return true; - } - - if (!$test instanceof TestCase && !$test instanceof PhptTestCase) { - return false; - } - - try { - return in_array($test->valueObjectForEvents()->id(), $this->testIds, true); - } catch (MoreThanOneDataSetFromDataProviderException|NoDataSetFromDataProviderException) { - return false; - } - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/GarbageCollection/GarbageCollectionHandler.php b/vendor/phpunit/phpunit/src/Runner/GarbageCollection/GarbageCollectionHandler.php deleted file mode 100644 index be46055..0000000 --- a/vendor/phpunit/phpunit/src/Runner/GarbageCollection/GarbageCollectionHandler.php +++ /dev/null @@ -1,89 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\GarbageCollection; - -use function gc_collect_cycles; -use function gc_disable; -use function gc_enable; -use PHPUnit\Event\EventFacadeIsSealedException; -use PHPUnit\Event\Facade; -use PHPUnit\Event\UnknownSubscriberTypeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class GarbageCollectionHandler -{ - private readonly Facade $facade; - private readonly int $threshold; - private int $tests = 0; - - /** - * @throws EventFacadeIsSealedException - * @throws UnknownSubscriberTypeException - */ - public function __construct(Facade $facade, int $threshold) - { - $this->facade = $facade; - $this->threshold = $threshold; - - $this->registerSubscribers(); - } - - public function executionStarted(): void - { - gc_disable(); - - $this->facade->emitter()->testRunnerDisabledGarbageCollection(); - - gc_collect_cycles(); - - $this->facade->emitter()->testRunnerTriggeredGarbageCollection(); - } - - public function executionFinished(): void - { - gc_collect_cycles(); - - $this->facade->emitter()->testRunnerTriggeredGarbageCollection(); - - gc_enable(); - - $this->facade->emitter()->testRunnerEnabledGarbageCollection(); - } - - public function testFinished(): void - { - $this->tests++; - - if ($this->tests === $this->threshold) { - gc_collect_cycles(); - - $this->facade->emitter()->testRunnerTriggeredGarbageCollection(); - - $this->tests = 0; - } - } - - /** - * @throws EventFacadeIsSealedException - * @throws UnknownSubscriberTypeException - */ - private function registerSubscribers(): void - { - $this->facade->registerSubscribers( - new ExecutionStartedSubscriber($this), - new ExecutionFinishedSubscriber($this), - new TestFinishedSubscriber($this), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/ExecutionFinishedSubscriber.php b/vendor/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/ExecutionFinishedSubscriber.php deleted file mode 100644 index 7721d0d..0000000 --- a/vendor/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/ExecutionFinishedSubscriber.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\GarbageCollection; - -use PHPUnit\Event\InvalidArgumentException; -use PHPUnit\Event\TestRunner\ExecutionFinished; -use PHPUnit\Event\TestRunner\ExecutionFinishedSubscriber as TestRunnerExecutionFinishedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ExecutionFinishedSubscriber extends Subscriber implements TestRunnerExecutionFinishedSubscriber -{ - /** - * @throws \PHPUnit\Framework\InvalidArgumentException - * @throws InvalidArgumentException - */ - public function notify(ExecutionFinished $event): void - { - $this->handler()->executionFinished(); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/ExecutionStartedSubscriber.php b/vendor/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/ExecutionStartedSubscriber.php deleted file mode 100644 index 2cccb21..0000000 --- a/vendor/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/ExecutionStartedSubscriber.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\GarbageCollection; - -use PHPUnit\Event\InvalidArgumentException; -use PHPUnit\Event\TestRunner\ExecutionStarted; -use PHPUnit\Event\TestRunner\ExecutionStartedSubscriber as TestRunnerExecutionStartedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ExecutionStartedSubscriber extends Subscriber implements TestRunnerExecutionStartedSubscriber -{ - /** - * @throws \PHPUnit\Framework\InvalidArgumentException - * @throws InvalidArgumentException - */ - public function notify(ExecutionStarted $event): void - { - $this->handler()->executionStarted(); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/Subscriber.php b/vendor/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/Subscriber.php deleted file mode 100644 index c3b08c6..0000000 --- a/vendor/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/Subscriber.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\GarbageCollection; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -abstract class Subscriber -{ - private readonly GarbageCollectionHandler $handler; - - public function __construct(GarbageCollectionHandler $handler) - { - $this->handler = $handler; - } - - protected function handler(): GarbageCollectionHandler - { - return $this->handler; - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/TestFinishedSubscriber.php b/vendor/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/TestFinishedSubscriber.php deleted file mode 100644 index 35806c4..0000000 --- a/vendor/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/TestFinishedSubscriber.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\GarbageCollection; - -use PHPUnit\Event\InvalidArgumentException; -use PHPUnit\Event\Test\Finished; -use PHPUnit\Event\Test\FinishedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestFinishedSubscriber extends Subscriber implements FinishedSubscriber -{ - /** - * @throws \PHPUnit\Framework\InvalidArgumentException - * @throws InvalidArgumentException - */ - public function notify(Finished $event): void - { - $this->handler()->testFinished(); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/PhptTestCase.php b/vendor/phpunit/phpunit/src/Runner/PhptTestCase.php deleted file mode 100644 index dd98c45..0000000 --- a/vendor/phpunit/phpunit/src/Runner/PhptTestCase.php +++ /dev/null @@ -1,873 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -use const DEBUG_BACKTRACE_IGNORE_ARGS; -use const DIRECTORY_SEPARATOR; -use function array_merge; -use function basename; -use function debug_backtrace; -use function defined; -use function dirname; -use function explode; -use function extension_loaded; -use function file; -use function file_exists; -use function file_get_contents; -use function file_put_contents; -use function is_array; -use function is_file; -use function is_readable; -use function is_string; -use function ltrim; -use function preg_match; -use function preg_replace; -use function preg_split; -use function realpath; -use function rtrim; -use function sprintf; -use function str_contains; -use function str_replace; -use function str_starts_with; -use function strncasecmp; -use function substr; -use function trim; -use function unlink; -use function unserialize; -use function var_export; -use PHPUnit\Event\Code\Phpt; -use PHPUnit\Event\Code\ThrowableBuilder; -use PHPUnit\Event\Facade as EventFacade; -use PHPUnit\Event\NoPreviousThrowableException; -use PHPUnit\Framework\Assert; -use PHPUnit\Framework\AssertionFailedError; -use PHPUnit\Framework\ExecutionOrderDependency; -use PHPUnit\Framework\ExpectationFailedException; -use PHPUnit\Framework\IncompleteTestError; -use PHPUnit\Framework\PhptAssertionFailedError; -use PHPUnit\Framework\Reorderable; -use PHPUnit\Framework\SelfDescribing; -use PHPUnit\Framework\Test; -use PHPUnit\TextUI\Configuration\Registry as ConfigurationRegistry; -use PHPUnit\Util\PHP\AbstractPhpProcess; -use SebastianBergmann\CodeCoverage\Data\RawCodeCoverageData; -use SebastianBergmann\CodeCoverage\InvalidArgumentException; -use SebastianBergmann\CodeCoverage\ReflectionException; -use SebastianBergmann\CodeCoverage\Test\TestSize\TestSize; -use SebastianBergmann\CodeCoverage\Test\TestStatus\TestStatus; -use SebastianBergmann\CodeCoverage\TestIdMissingException; -use SebastianBergmann\CodeCoverage\UnintentionallyCoveredCodeException; -use SebastianBergmann\Template\Template; -use Throwable; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class PhptTestCase implements Reorderable, SelfDescribing, Test -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $filename; - private readonly AbstractPhpProcess $phpUtil; - private string $output = ''; - - /** - * Constructs a test case with the given filename. - * - * @psalm-param non-empty-string $filename - * - * @throws Exception - */ - public function __construct(string $filename, ?AbstractPhpProcess $phpUtil = null) - { - $this->filename = $filename; - - $this->ensureCoverageFileDoesNotExist(); - - $this->phpUtil = $phpUtil ?: AbstractPhpProcess::factory(); - } - - /** - * Counts the number of test cases executed by run(TestResult result). - */ - public function count(): int - { - return 1; - } - - /** - * Runs a test and collects its result in a TestResult instance. - * - * @throws \PHPUnit\Framework\Exception - * @throws \SebastianBergmann\Template\InvalidArgumentException - * @throws Exception - * @throws InvalidArgumentException - * @throws NoPreviousThrowableException - * @throws ReflectionException - * @throws TestIdMissingException - * @throws UnintentionallyCoveredCodeException - * - * @noinspection RepetitiveMethodCallsInspection - */ - public function run(): void - { - $emitter = EventFacade::emitter(); - - $emitter->testPreparationStarted( - $this->valueObjectForEvents(), - ); - - try { - $sections = $this->parse(); - } catch (Exception $e) { - $emitter->testPrepared($this->valueObjectForEvents()); - $emitter->testErrored($this->valueObjectForEvents(), ThrowableBuilder::from($e)); - $emitter->testFinished($this->valueObjectForEvents(), 0); - - return; - } - - $code = $this->render($sections['FILE']); - $xfail = false; - $settings = $this->parseIniSection($this->settings(CodeCoverage::instance()->isActive())); - - $emitter->testPrepared($this->valueObjectForEvents()); - - if (isset($sections['INI'])) { - $settings = $this->parseIniSection($sections['INI'], $settings); - } - - if (isset($sections['ENV'])) { - $env = $this->parseEnvSection($sections['ENV']); - $this->phpUtil->setEnv($env); - } - - $this->phpUtil->setUseStderrRedirection(true); - - if ($this->shouldTestBeSkipped($sections, $settings)) { - return; - } - - if (isset($sections['XFAIL'])) { - $xfail = trim($sections['XFAIL']); - } - - if (isset($sections['STDIN'])) { - $this->phpUtil->setStdin($sections['STDIN']); - } - - if (isset($sections['ARGS'])) { - $this->phpUtil->setArgs($sections['ARGS']); - } - - if (CodeCoverage::instance()->isActive()) { - $codeCoverageCacheDirectory = null; - - if (CodeCoverage::instance()->codeCoverage()->cachesStaticAnalysis()) { - /** @psalm-suppress MissingThrowsDocblock */ - $codeCoverageCacheDirectory = CodeCoverage::instance()->codeCoverage()->cacheDirectory(); - } - - $this->renderForCoverage( - $code, - CodeCoverage::instance()->codeCoverage()->collectsBranchAndPathCoverage(), - $codeCoverageCacheDirectory, - ); - } - - $jobResult = $this->phpUtil->runJob($code, $this->stringifyIni($settings)); - $this->output = $jobResult['stdout'] ?? ''; - - if (CodeCoverage::instance()->isActive()) { - $coverage = $this->cleanupForCoverage(); - - CodeCoverage::instance()->codeCoverage()->start($this->filename, TestSize::large()); - - CodeCoverage::instance()->codeCoverage()->append( - $coverage, - $this->filename, - true, - TestStatus::unknown(), - ); - } - - $passed = true; - - try { - $this->assertPhptExpectation($sections, $this->output); - } catch (AssertionFailedError $e) { - $failure = $e; - - if ($xfail !== false) { - $failure = new IncompleteTestError($xfail, 0, $e); - } elseif ($e instanceof ExpectationFailedException) { - $comparisonFailure = $e->getComparisonFailure(); - - if ($comparisonFailure) { - $diff = $comparisonFailure->getDiff(); - } else { - $diff = $e->getMessage(); - } - - $hint = $this->getLocationHintFromDiff($diff, $sections); - $trace = array_merge($hint, debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)); - $failure = new PhptAssertionFailedError( - $e->getMessage(), - 0, - (string) $trace[0]['file'], - (int) $trace[0]['line'], - $trace, - $comparisonFailure ? $diff : '', - ); - } - - if ($failure instanceof IncompleteTestError) { - $emitter->testMarkedAsIncomplete($this->valueObjectForEvents(), ThrowableBuilder::from($failure)); - } else { - $emitter->testFailed($this->valueObjectForEvents(), ThrowableBuilder::from($failure), null); - } - - $passed = false; - } catch (Throwable $t) { - $emitter->testErrored($this->valueObjectForEvents(), ThrowableBuilder::from($t)); - - $passed = false; - } - - if ($passed) { - $emitter->testPassed($this->valueObjectForEvents()); - } - - $this->runClean($sections, CodeCoverage::instance()->isActive()); - - $emitter->testFinished($this->valueObjectForEvents(), 1); - } - - /** - * Returns the name of the test case. - */ - public function getName(): string - { - return $this->toString(); - } - - /** - * Returns a string representation of the test case. - */ - public function toString(): string - { - return $this->filename; - } - - public function usesDataProvider(): bool - { - return false; - } - - public function numberOfAssertionsPerformed(): int - { - return 1; - } - - public function output(): string - { - return $this->output; - } - - public function hasOutput(): bool - { - return !empty($this->output); - } - - public function sortId(): string - { - return $this->filename; - } - - /** - * @psalm-return list - */ - public function provides(): array - { - return []; - } - - /** - * @psalm-return list - */ - public function requires(): array - { - return []; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function valueObjectForEvents(): Phpt - { - return new Phpt($this->filename); - } - - /** - * Parse --INI-- section key value pairs and return as array. - */ - private function parseIniSection(array|string $content, array $ini = []): array - { - if (is_string($content)) { - $content = explode("\n", trim($content)); - } - - foreach ($content as $setting) { - if (!str_contains($setting, '=')) { - continue; - } - - $setting = explode('=', $setting, 2); - $name = trim($setting[0]); - $value = trim($setting[1]); - - if ($name === 'extension' || $name === 'zend_extension') { - if (!isset($ini[$name])) { - $ini[$name] = []; - } - - $ini[$name][] = $value; - - continue; - } - - $ini[$name] = $value; - } - - return $ini; - } - - private function parseEnvSection(string $content): array - { - $env = []; - - foreach (explode("\n", trim($content)) as $e) { - $e = explode('=', trim($e), 2); - - if ($e[0] !== '' && isset($e[1])) { - $env[$e[0]] = $e[1]; - } - } - - return $env; - } - - /** - * @throws Exception - * @throws ExpectationFailedException - */ - private function assertPhptExpectation(array $sections, string $output): void - { - $assertions = [ - 'EXPECT' => 'assertEquals', - 'EXPECTF' => 'assertStringMatchesFormat', - 'EXPECTREGEX' => 'assertMatchesRegularExpression', - ]; - - $actual = preg_replace('/\r\n/', "\n", trim($output)); - - foreach ($assertions as $sectionName => $sectionAssertion) { - if (isset($sections[$sectionName])) { - $sectionContent = preg_replace('/\r\n/', "\n", trim($sections[$sectionName])); - $expected = $sectionName === 'EXPECTREGEX' ? "/{$sectionContent}/" : $sectionContent; - - Assert::$sectionAssertion($expected, $actual); - - return; - } - } - - throw new InvalidPhptFileException; - } - - private function shouldTestBeSkipped(array $sections, array $settings): bool - { - if (!isset($sections['SKIPIF'])) { - return false; - } - - $skipif = $this->render($sections['SKIPIF']); - $jobResult = $this->phpUtil->runJob($skipif, $this->stringifyIni($settings)); - - if (!strncasecmp('skip', ltrim($jobResult['stdout']), 4)) { - $message = ''; - - if (preg_match('/^\s*skip\s*(.+)\s*/i', $jobResult['stdout'], $skipMatch)) { - $message = substr($skipMatch[1], 2); - } - - EventFacade::emitter()->testSkipped( - $this->valueObjectForEvents(), - $message, - ); - - EventFacade::emitter()->testFinished($this->valueObjectForEvents(), 0); - - return true; - } - - return false; - } - - private function runClean(array $sections, bool $collectCoverage): void - { - $this->phpUtil->setStdin(''); - $this->phpUtil->setArgs(''); - - if (isset($sections['CLEAN'])) { - $cleanCode = $this->render($sections['CLEAN']); - - $this->phpUtil->runJob($cleanCode, $this->settings($collectCoverage)); - } - } - - /** - * @throws Exception - */ - private function parse(): array - { - $sections = []; - $section = ''; - - $unsupportedSections = [ - 'CGI', - 'COOKIE', - 'DEFLATE_POST', - 'EXPECTHEADERS', - 'EXTENSIONS', - 'GET', - 'GZIP_POST', - 'HEADERS', - 'PHPDBG', - 'POST', - 'POST_RAW', - 'PUT', - 'REDIRECTTEST', - 'REQUEST', - ]; - - $lineNr = 0; - - foreach (file($this->filename) as $line) { - $lineNr++; - - if (preg_match('/^--([_A-Z]+)--/', $line, $result)) { - $section = $result[1]; - $sections[$section] = ''; - $sections[$section . '_offset'] = $lineNr; - - continue; - } - - if (empty($section)) { - throw new InvalidPhptFileException; - } - - $sections[$section] .= $line; - } - - if (isset($sections['FILEEOF'])) { - $sections['FILE'] = rtrim($sections['FILEEOF'], "\r\n"); - unset($sections['FILEEOF']); - } - - $this->parseExternal($sections); - - if (!$this->validate($sections)) { - throw new InvalidPhptFileException; - } - - foreach ($unsupportedSections as $section) { - if (isset($sections[$section])) { - throw new UnsupportedPhptSectionException($section); - } - } - - return $sections; - } - - /** - * @throws Exception - */ - private function parseExternal(array &$sections): void - { - $allowSections = [ - 'FILE', - 'EXPECT', - 'EXPECTF', - 'EXPECTREGEX', - ]; - $testDirectory = dirname($this->filename) . DIRECTORY_SEPARATOR; - - foreach ($allowSections as $section) { - if (isset($sections[$section . '_EXTERNAL'])) { - $externalFilename = trim($sections[$section . '_EXTERNAL']); - - if (!is_file($testDirectory . $externalFilename) || - !is_readable($testDirectory . $externalFilename)) { - throw new PhptExternalFileCannotBeLoadedException( - $section, - $testDirectory . $externalFilename, - ); - } - - $sections[$section] = file_get_contents($testDirectory . $externalFilename); - } - } - } - - private function validate(array $sections): bool - { - $requiredSections = [ - 'FILE', - [ - 'EXPECT', - 'EXPECTF', - 'EXPECTREGEX', - ], - ]; - - foreach ($requiredSections as $section) { - if (is_array($section)) { - $foundSection = false; - - foreach ($section as $anySection) { - if (isset($sections[$anySection])) { - $foundSection = true; - - break; - } - } - - if (!$foundSection) { - return false; - } - - continue; - } - - if (!isset($sections[$section])) { - return false; - } - } - - return true; - } - - private function render(string $code): string - { - return str_replace( - [ - '__DIR__', - '__FILE__', - ], - [ - "'" . dirname($this->filename) . "'", - "'" . $this->filename . "'", - ], - $code, - ); - } - - private function getCoverageFiles(): array - { - $baseDir = dirname(realpath($this->filename)) . DIRECTORY_SEPARATOR; - $basename = basename($this->filename, 'phpt'); - - return [ - 'coverage' => $baseDir . $basename . 'coverage', - 'job' => $baseDir . $basename . 'php', - ]; - } - - /** - * @throws \SebastianBergmann\Template\InvalidArgumentException - */ - private function renderForCoverage(string &$job, bool $pathCoverage, ?string $codeCoverageCacheDirectory): void - { - $files = $this->getCoverageFiles(); - - $template = new Template( - __DIR__ . '/../Util/PHP/Template/PhptTestCase.tpl', - ); - - $composerAutoload = '\'\''; - - if (defined('PHPUNIT_COMPOSER_INSTALL')) { - $composerAutoload = var_export(PHPUNIT_COMPOSER_INSTALL, true); - } - - $phar = '\'\''; - - if (defined('__PHPUNIT_PHAR__')) { - $phar = var_export(__PHPUNIT_PHAR__, true); - } - - if ($codeCoverageCacheDirectory === null) { - $codeCoverageCacheDirectory = 'null'; - } else { - $codeCoverageCacheDirectory = "'" . $codeCoverageCacheDirectory . "'"; - } - - $bootstrap = ''; - - if (ConfigurationRegistry::get()->hasBootstrap()) { - $bootstrap = ConfigurationRegistry::get()->bootstrap(); - } - - $template->setVar( - [ - 'bootstrap' => $bootstrap, - 'composerAutoload' => $composerAutoload, - 'phar' => $phar, - 'job' => $files['job'], - 'coverageFile' => $files['coverage'], - 'driverMethod' => $pathCoverage ? 'forLineAndPathCoverage' : 'forLineCoverage', - 'codeCoverageCacheDirectory' => $codeCoverageCacheDirectory, - ], - ); - - file_put_contents($files['job'], $job); - - $job = $template->render(); - } - - private function cleanupForCoverage(): RawCodeCoverageData - { - $coverage = RawCodeCoverageData::fromXdebugWithoutPathCoverage([]); - $files = $this->getCoverageFiles(); - - $buffer = false; - - if (is_file($files['coverage'])) { - $buffer = @file_get_contents($files['coverage']); - } - - if ($buffer !== false) { - $coverage = @unserialize( - $buffer, - [ - 'allowed_classes' => [ - RawCodeCoverageData::class, - ], - ], - ); - - if ($coverage === false) { - $coverage = RawCodeCoverageData::fromXdebugWithoutPathCoverage([]); - } - } - - foreach ($files as $file) { - @unlink($file); - } - - return $coverage; - } - - private function stringifyIni(array $ini): array - { - $settings = []; - - foreach ($ini as $key => $value) { - if (is_array($value)) { - foreach ($value as $val) { - $settings[] = $key . '=' . $val; - } - - continue; - } - - $settings[] = $key . '=' . $value; - } - - return $settings; - } - - private function getLocationHintFromDiff(string $message, array $sections): array - { - $needle = ''; - $previousLine = ''; - $block = 'message'; - - foreach (preg_split('/\r\n|\r|\n/', $message) as $line) { - $line = trim($line); - - if ($block === 'message' && $line === '--- Expected') { - $block = 'expected'; - } - - if ($block === 'expected' && $line === '@@ @@') { - $block = 'diff'; - } - - if ($block === 'diff') { - if (str_starts_with($line, '+')) { - $needle = $this->getCleanDiffLine($previousLine); - - break; - } - - if (str_starts_with($line, '-')) { - $needle = $this->getCleanDiffLine($line); - - break; - } - } - - if (!empty($line)) { - $previousLine = $line; - } - } - - return $this->getLocationHint($needle, $sections); - } - - private function getCleanDiffLine(string $line): string - { - if (preg_match('/^[\-+]([\'\"]?)(.*)\1$/', $line, $matches)) { - $line = $matches[2]; - } - - return $line; - } - - private function getLocationHint(string $needle, array $sections): array - { - $needle = trim($needle); - - if (empty($needle)) { - return [[ - 'file' => realpath($this->filename), - 'line' => 1, - ]]; - } - - $search = [ - // 'FILE', - 'EXPECT', - 'EXPECTF', - 'EXPECTREGEX', - ]; - - foreach ($search as $section) { - if (!isset($sections[$section])) { - continue; - } - - if (isset($sections[$section . '_EXTERNAL'])) { - $externalFile = trim($sections[$section . '_EXTERNAL']); - - return [ - [ - 'file' => realpath(dirname($this->filename) . DIRECTORY_SEPARATOR . $externalFile), - 'line' => 1, - ], - [ - 'file' => realpath($this->filename), - 'line' => ($sections[$section . '_EXTERNAL_offset'] ?? 0) + 1, - ], - ]; - } - - $sectionOffset = $sections[$section . '_offset'] ?? 0; - $offset = $sectionOffset + 1; - - foreach (preg_split('/\r\n|\r|\n/', $sections[$section]) as $line) { - if (str_contains($line, $needle)) { - return [ - [ - 'file' => realpath($this->filename), - 'line' => $offset, - ], - ]; - } - - $offset++; - } - } - - return [ - [ - 'file' => realpath($this->filename), - 'line' => 1, - ], - ]; - } - - /** - * @psalm-return list - */ - private function settings(bool $collectCoverage): array - { - $settings = [ - 'allow_url_fopen=1', - 'auto_append_file=', - 'auto_prepend_file=', - 'disable_functions=', - 'display_errors=1', - 'docref_ext=.html', - 'docref_root=', - 'error_append_string=', - 'error_prepend_string=', - 'error_reporting=-1', - 'html_errors=0', - 'log_errors=0', - 'open_basedir=', - 'output_buffering=Off', - 'output_handler=', - 'report_zend_debug=0', - ]; - - if (extension_loaded('pcov')) { - if ($collectCoverage) { - $settings[] = 'pcov.enabled=1'; - } else { - $settings[] = 'pcov.enabled=0'; - } - } - - if (extension_loaded('xdebug')) { - if ($collectCoverage) { - $settings[] = 'xdebug.mode=coverage'; - } else { - $settings[] = 'xdebug.mode=off'; - } - } - - return $settings; - } - - /** - * @throws CodeCoverageFileExistsException - */ - private function ensureCoverageFileDoesNotExist(): void - { - $files = $this->getCoverageFiles(); - - if (file_exists($files['coverage'])) { - throw new CodeCoverageFileExistsException( - sprintf( - 'File %s exists, PHPT test %s will not be executed', - $files['coverage'], - $this->filename, - ), - ); - } - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/ResultCache/DefaultResultCache.php b/vendor/phpunit/phpunit/src/Runner/ResultCache/DefaultResultCache.php deleted file mode 100644 index 32340ef..0000000 --- a/vendor/phpunit/phpunit/src/Runner/ResultCache/DefaultResultCache.php +++ /dev/null @@ -1,166 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\ResultCache; - -use const DIRECTORY_SEPARATOR; -use const LOCK_EX; -use function array_keys; -use function assert; -use function dirname; -use function file_get_contents; -use function file_put_contents; -use function is_array; -use function is_dir; -use function is_file; -use function json_decode; -use function json_encode; -use PHPUnit\Framework\TestStatus\TestStatus; -use PHPUnit\Runner\DirectoryDoesNotExistException; -use PHPUnit\Runner\Exception; -use PHPUnit\Util\Filesystem; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class DefaultResultCache implements ResultCache -{ - /** - * @var int - */ - private const VERSION = 2; - - /** - * @var string - */ - private const DEFAULT_RESULT_CACHE_FILENAME = '.phpunit.result.cache'; - private readonly string $cacheFilename; - - /** - * @psalm-var array - */ - private array $defects = []; - - /** - * @psalm-var array - */ - private array $times = []; - - public function __construct(?string $filepath = null) - { - if ($filepath !== null && is_dir($filepath)) { - $filepath .= DIRECTORY_SEPARATOR . self::DEFAULT_RESULT_CACHE_FILENAME; - } - - $this->cacheFilename = $filepath ?? $_ENV['PHPUNIT_RESULT_CACHE'] ?? self::DEFAULT_RESULT_CACHE_FILENAME; - } - - public function setStatus(string $id, TestStatus $status): void - { - if ($status->isSuccess()) { - return; - } - - $this->defects[$id] = $status; - } - - public function status(string $id): TestStatus - { - return $this->defects[$id] ?? TestStatus::unknown(); - } - - public function setTime(string $id, float $time): void - { - $this->times[$id] = $time; - } - - public function time(string $id): float - { - return $this->times[$id] ?? 0.0; - } - - public function mergeWith(self $other): void - { - foreach ($other->defects as $id => $defect) { - $this->defects[$id] = $defect; - } - - foreach ($other->times as $id => $time) { - $this->times[$id] = $time; - } - } - - public function load(): void - { - if (!is_file($this->cacheFilename)) { - return; - } - - $contents = file_get_contents($this->cacheFilename); - - if ($contents === false) { - return; - } - - $data = json_decode( - $contents, - true, - ); - - if ($data === null) { - return; - } - - if (!isset($data['version'])) { - return; - } - - if ($data['version'] !== self::VERSION) { - return; - } - - assert(isset($data['defects']) && is_array($data['defects'])); - assert(isset($data['times']) && is_array($data['times'])); - - foreach (array_keys($data['defects']) as $test) { - $data['defects'][$test] = TestStatus::from($data['defects'][$test]); - } - - $this->defects = $data['defects']; - $this->times = $data['times']; - } - - /** - * @throws Exception - */ - public function persist(): void - { - if (!Filesystem::createDirectory(dirname($this->cacheFilename))) { - throw new DirectoryDoesNotExistException(dirname($this->cacheFilename)); - } - - $data = [ - 'version' => self::VERSION, - 'defects' => [], - 'times' => $this->times, - ]; - - foreach ($this->defects as $test => $status) { - $data['defects'][$test] = $status->asInt(); - } - - file_put_contents( - $this->cacheFilename, - json_encode($data), - LOCK_EX, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/ResultCache/NullResultCache.php b/vendor/phpunit/phpunit/src/Runner/ResultCache/NullResultCache.php deleted file mode 100644 index f0cc4c3..0000000 --- a/vendor/phpunit/phpunit/src/Runner/ResultCache/NullResultCache.php +++ /dev/null @@ -1,46 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\ResultCache; - -use PHPUnit\Framework\TestStatus\TestStatus; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class NullResultCache implements ResultCache -{ - public function setStatus(string $id, TestStatus $status): void - { - } - - public function status(string $id): TestStatus - { - return TestStatus::unknown(); - } - - public function setTime(string $id, float $time): void - { - } - - public function time(string $id): float - { - return 0; - } - - public function load(): void - { - } - - public function persist(): void - { - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/ResultCache/ResultCache.php b/vendor/phpunit/phpunit/src/Runner/ResultCache/ResultCache.php deleted file mode 100644 index 5b9a0cc..0000000 --- a/vendor/phpunit/phpunit/src/Runner/ResultCache/ResultCache.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\ResultCache; - -use PHPUnit\Framework\TestStatus\TestStatus; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This interface is not covered by the backward compatibility promise for PHPUnit - */ -interface ResultCache -{ - public function setStatus(string $id, TestStatus $status): void; - - public function status(string $id): TestStatus; - - public function setTime(string $id, float $time): void; - - public function time(string $id): float; - - public function load(): void; - - public function persist(): void; -} diff --git a/vendor/phpunit/phpunit/src/Runner/ResultCache/ResultCacheHandler.php b/vendor/phpunit/phpunit/src/Runner/ResultCache/ResultCacheHandler.php deleted file mode 100644 index 927725a..0000000 --- a/vendor/phpunit/phpunit/src/Runner/ResultCache/ResultCacheHandler.php +++ /dev/null @@ -1,157 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\ResultCache; - -use function round; -use PHPUnit\Event\Event; -use PHPUnit\Event\EventFacadeIsSealedException; -use PHPUnit\Event\Facade; -use PHPUnit\Event\Telemetry\HRTime; -use PHPUnit\Event\Test\ConsideredRisky; -use PHPUnit\Event\Test\Errored; -use PHPUnit\Event\Test\Failed; -use PHPUnit\Event\Test\Finished; -use PHPUnit\Event\Test\MarkedIncomplete; -use PHPUnit\Event\Test\Prepared; -use PHPUnit\Event\Test\Skipped; -use PHPUnit\Event\UnknownSubscriberTypeException; -use PHPUnit\Framework\InvalidArgumentException; -use PHPUnit\Framework\TestStatus\TestStatus; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ResultCacheHandler -{ - private readonly ResultCache $cache; - private ?HRTime $time = null; - private int $testSuite = 0; - - /** - * @throws EventFacadeIsSealedException - * @throws UnknownSubscriberTypeException - */ - public function __construct(ResultCache $cache, Facade $facade) - { - $this->cache = $cache; - - $this->registerSubscribers($facade); - } - - public function testSuiteStarted(): void - { - $this->testSuite++; - } - - public function testSuiteFinished(): void - { - $this->testSuite--; - - if ($this->testSuite === 0) { - $this->cache->persist(); - } - } - - public function testPrepared(Prepared $event): void - { - $this->time = $event->telemetryInfo()->time(); - } - - public function testMarkedIncomplete(MarkedIncomplete $event): void - { - $this->cache->setStatus( - $event->test()->id(), - TestStatus::incomplete($event->throwable()->message()), - ); - } - - public function testConsideredRisky(ConsideredRisky $event): void - { - $this->cache->setStatus( - $event->test()->id(), - TestStatus::risky($event->message()), - ); - } - - public function testErrored(Errored $event): void - { - $this->cache->setStatus( - $event->test()->id(), - TestStatus::error($event->throwable()->message()), - ); - } - - public function testFailed(Failed $event): void - { - $this->cache->setStatus( - $event->test()->id(), - TestStatus::failure($event->throwable()->message()), - ); - } - - /** - * @throws \PHPUnit\Event\InvalidArgumentException - * @throws InvalidArgumentException - */ - public function testSkipped(Skipped $event): void - { - $this->cache->setStatus( - $event->test()->id(), - TestStatus::skipped($event->message()), - ); - - $this->cache->setTime($event->test()->id(), $this->duration($event)); - } - - /** - * @throws \PHPUnit\Event\InvalidArgumentException - * @throws InvalidArgumentException - */ - public function testFinished(Finished $event): void - { - $this->cache->setTime($event->test()->id(), $this->duration($event)); - - $this->time = null; - } - - /** - * @throws \PHPUnit\Event\InvalidArgumentException - * @throws InvalidArgumentException - */ - private function duration(Event $event): float - { - if ($this->time === null) { - return 0.0; - } - - return round($event->telemetryInfo()->time()->duration($this->time)->asFloat(), 3); - } - - /** - * @throws EventFacadeIsSealedException - * @throws UnknownSubscriberTypeException - */ - private function registerSubscribers(Facade $facade): void - { - $facade->registerSubscribers( - new TestSuiteStartedSubscriber($this), - new TestSuiteFinishedSubscriber($this), - new TestPreparedSubscriber($this), - new TestMarkedIncompleteSubscriber($this), - new TestConsideredRiskySubscriber($this), - new TestErroredSubscriber($this), - new TestFailedSubscriber($this), - new TestSkippedSubscriber($this), - new TestFinishedSubscriber($this), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/Subscriber.php b/vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/Subscriber.php deleted file mode 100644 index 254b36a..0000000 --- a/vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/Subscriber.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\ResultCache; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -abstract class Subscriber -{ - private readonly ResultCacheHandler $handler; - - public function __construct(ResultCacheHandler $handler) - { - $this->handler = $handler; - } - - protected function handler(): ResultCacheHandler - { - return $this->handler; - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestConsideredRiskySubscriber.php b/vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestConsideredRiskySubscriber.php deleted file mode 100644 index 5675f46..0000000 --- a/vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestConsideredRiskySubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\ResultCache; - -use PHPUnit\Event\Test\ConsideredRisky; -use PHPUnit\Event\Test\ConsideredRiskySubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestConsideredRiskySubscriber extends Subscriber implements ConsideredRiskySubscriber -{ - public function notify(ConsideredRisky $event): void - { - $this->handler()->testConsideredRisky($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestErroredSubscriber.php b/vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestErroredSubscriber.php deleted file mode 100644 index 6acc7fb..0000000 --- a/vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestErroredSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\ResultCache; - -use PHPUnit\Event\Test\Errored; -use PHPUnit\Event\Test\ErroredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestErroredSubscriber extends Subscriber implements ErroredSubscriber -{ - public function notify(Errored $event): void - { - $this->handler()->testErrored($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestFailedSubscriber.php b/vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestFailedSubscriber.php deleted file mode 100644 index d952898..0000000 --- a/vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestFailedSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\ResultCache; - -use PHPUnit\Event\Test\Failed; -use PHPUnit\Event\Test\FailedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestFailedSubscriber extends Subscriber implements FailedSubscriber -{ - public function notify(Failed $event): void - { - $this->handler()->testFailed($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestFinishedSubscriber.php b/vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestFinishedSubscriber.php deleted file mode 100644 index d045737..0000000 --- a/vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestFinishedSubscriber.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\ResultCache; - -use PHPUnit\Event\InvalidArgumentException; -use PHPUnit\Event\Test\Finished; -use PHPUnit\Event\Test\FinishedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestFinishedSubscriber extends Subscriber implements FinishedSubscriber -{ - /** - * @throws \PHPUnit\Framework\InvalidArgumentException - * @throws InvalidArgumentException - */ - public function notify(Finished $event): void - { - $this->handler()->testFinished($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestMarkedIncompleteSubscriber.php b/vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestMarkedIncompleteSubscriber.php deleted file mode 100644 index e983835..0000000 --- a/vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestMarkedIncompleteSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\ResultCache; - -use PHPUnit\Event\Test\MarkedIncomplete; -use PHPUnit\Event\Test\MarkedIncompleteSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestMarkedIncompleteSubscriber extends Subscriber implements MarkedIncompleteSubscriber -{ - public function notify(MarkedIncomplete $event): void - { - $this->handler()->testMarkedIncomplete($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestPreparedSubscriber.php b/vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestPreparedSubscriber.php deleted file mode 100644 index 6e7cd77..0000000 --- a/vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestPreparedSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\ResultCache; - -use PHPUnit\Event\Test\Prepared; -use PHPUnit\Event\Test\PreparedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestPreparedSubscriber extends Subscriber implements PreparedSubscriber -{ - public function notify(Prepared $event): void - { - $this->handler()->testPrepared($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestSkippedSubscriber.php b/vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestSkippedSubscriber.php deleted file mode 100644 index b9ad4e3..0000000 --- a/vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestSkippedSubscriber.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\ResultCache; - -use PHPUnit\Event\InvalidArgumentException; -use PHPUnit\Event\Test\Skipped; -use PHPUnit\Event\Test\SkippedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestSkippedSubscriber extends Subscriber implements SkippedSubscriber -{ - /** - * @throws \PHPUnit\Framework\InvalidArgumentException - * @throws InvalidArgumentException - */ - public function notify(Skipped $event): void - { - $this->handler()->testSkipped($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestSuiteFinishedSubscriber.php b/vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestSuiteFinishedSubscriber.php deleted file mode 100644 index 1c6fef3..0000000 --- a/vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestSuiteFinishedSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\ResultCache; - -use PHPUnit\Event\TestSuite\Finished; -use PHPUnit\Event\TestSuite\FinishedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestSuiteFinishedSubscriber extends Subscriber implements FinishedSubscriber -{ - public function notify(Finished $event): void - { - $this->handler()->testSuiteFinished(); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestSuiteStartedSubscriber.php b/vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestSuiteStartedSubscriber.php deleted file mode 100644 index e56874f..0000000 --- a/vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestSuiteStartedSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\ResultCache; - -use PHPUnit\Event\TestSuite\Started; -use PHPUnit\Event\TestSuite\StartedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestSuiteStartedSubscriber extends Subscriber implements StartedSubscriber -{ - public function notify(Started $event): void - { - $this->handler()->testSuiteStarted(); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/TestResult/Collector.php b/vendor/phpunit/phpunit/src/Runner/TestResult/Collector.php deleted file mode 100644 index d50536c..0000000 --- a/vendor/phpunit/phpunit/src/Runner/TestResult/Collector.php +++ /dev/null @@ -1,667 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TestRunner\TestResult; - -use function array_values; -use function assert; -use function implode; -use function str_contains; -use PHPUnit\Event\Code\TestMethod; -use PHPUnit\Event\EventFacadeIsSealedException; -use PHPUnit\Event\Facade; -use PHPUnit\Event\Test\AfterLastTestMethodErrored; -use PHPUnit\Event\Test\BeforeFirstTestMethodErrored; -use PHPUnit\Event\Test\ConsideredRisky; -use PHPUnit\Event\Test\DeprecationTriggered; -use PHPUnit\Event\Test\Errored; -use PHPUnit\Event\Test\ErrorTriggered; -use PHPUnit\Event\Test\Failed; -use PHPUnit\Event\Test\Finished; -use PHPUnit\Event\Test\MarkedIncomplete; -use PHPUnit\Event\Test\NoticeTriggered; -use PHPUnit\Event\Test\PhpDeprecationTriggered; -use PHPUnit\Event\Test\PhpNoticeTriggered; -use PHPUnit\Event\Test\PhpunitDeprecationTriggered; -use PHPUnit\Event\Test\PhpunitErrorTriggered; -use PHPUnit\Event\Test\PhpunitWarningTriggered; -use PHPUnit\Event\Test\PhpWarningTriggered; -use PHPUnit\Event\Test\Skipped as TestSkipped; -use PHPUnit\Event\Test\WarningTriggered; -use PHPUnit\Event\TestRunner\DeprecationTriggered as TestRunnerDeprecationTriggered; -use PHPUnit\Event\TestRunner\ExecutionStarted; -use PHPUnit\Event\TestRunner\WarningTriggered as TestRunnerWarningTriggered; -use PHPUnit\Event\TestSuite\Finished as TestSuiteFinished; -use PHPUnit\Event\TestSuite\Skipped as TestSuiteSkipped; -use PHPUnit\Event\TestSuite\Started as TestSuiteStarted; -use PHPUnit\Event\TestSuite\TestSuiteForTestClass; -use PHPUnit\Event\TestSuite\TestSuiteForTestMethodWithDataProvider; -use PHPUnit\Event\UnknownSubscriberTypeException; -use PHPUnit\TestRunner\TestResult\Issues\Issue; -use PHPUnit\TextUI\Configuration\Source; -use PHPUnit\TextUI\Configuration\SourceFilter; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Collector -{ - private readonly Source $source; - private int $numberOfTests = 0; - private int $numberOfTestsRun = 0; - private int $numberOfAssertions = 0; - private bool $prepared = false; - private bool $currentTestSuiteForTestClassFailed = false; - - /** - * @psalm-var non-negative-int - */ - private int $numberOfIssuesIgnoredByBaseline = 0; - - /** - * @psalm-var list - */ - private array $testErroredEvents = []; - - /** - * @psalm-var list - */ - private array $testFailedEvents = []; - - /** - * @psalm-var list - */ - private array $testMarkedIncompleteEvents = []; - - /** - * @psalm-var list - */ - private array $testSuiteSkippedEvents = []; - - /** - * @psalm-var list - */ - private array $testSkippedEvents = []; - - /** - * @psalm-var array> - */ - private array $testConsideredRiskyEvents = []; - - /** - * @psalm-var array> - */ - private array $testTriggeredPhpunitDeprecationEvents = []; - - /** - * @psalm-var array> - */ - private array $testTriggeredPhpunitErrorEvents = []; - - /** - * @psalm-var array> - */ - private array $testTriggeredPhpunitWarningEvents = []; - - /** - * @psalm-var list - */ - private array $testRunnerTriggeredWarningEvents = []; - - /** - * @psalm-var list - */ - private array $testRunnerTriggeredDeprecationEvents = []; - - /** - * @psalm-var array - */ - private array $errors = []; - - /** - * @psalm-var array - */ - private array $deprecations = []; - - /** - * @psalm-var array - */ - private array $notices = []; - - /** - * @psalm-var array - */ - private array $warnings = []; - - /** - * @psalm-var array - */ - private array $phpDeprecations = []; - - /** - * @psalm-var array - */ - private array $phpNotices = []; - - /** - * @psalm-var array - */ - private array $phpWarnings = []; - - /** - * @throws EventFacadeIsSealedException - * @throws UnknownSubscriberTypeException - */ - public function __construct(Facade $facade, Source $source) - { - $facade->registerSubscribers( - new ExecutionStartedSubscriber($this), - new TestSuiteSkippedSubscriber($this), - new TestSuiteStartedSubscriber($this), - new TestSuiteFinishedSubscriber($this), - new TestPreparedSubscriber($this), - new TestFinishedSubscriber($this), - new BeforeTestClassMethodErroredSubscriber($this), - new AfterTestClassMethodErroredSubscriber($this), - new TestErroredSubscriber($this), - new TestFailedSubscriber($this), - new TestMarkedIncompleteSubscriber($this), - new TestSkippedSubscriber($this), - new TestConsideredRiskySubscriber($this), - new TestTriggeredDeprecationSubscriber($this), - new TestTriggeredErrorSubscriber($this), - new TestTriggeredNoticeSubscriber($this), - new TestTriggeredPhpDeprecationSubscriber($this), - new TestTriggeredPhpNoticeSubscriber($this), - new TestTriggeredPhpunitDeprecationSubscriber($this), - new TestTriggeredPhpunitErrorSubscriber($this), - new TestTriggeredPhpunitWarningSubscriber($this), - new TestTriggeredPhpWarningSubscriber($this), - new TestTriggeredWarningSubscriber($this), - new TestRunnerTriggeredDeprecationSubscriber($this), - new TestRunnerTriggeredWarningSubscriber($this), - ); - - $this->source = $source; - } - - public function result(): TestResult - { - return new TestResult( - $this->numberOfTests, - $this->numberOfTestsRun, - $this->numberOfAssertions, - $this->testErroredEvents, - $this->testFailedEvents, - $this->testConsideredRiskyEvents, - $this->testSuiteSkippedEvents, - $this->testSkippedEvents, - $this->testMarkedIncompleteEvents, - $this->testTriggeredPhpunitDeprecationEvents, - $this->testTriggeredPhpunitErrorEvents, - $this->testTriggeredPhpunitWarningEvents, - $this->testRunnerTriggeredDeprecationEvents, - $this->testRunnerTriggeredWarningEvents, - array_values($this->errors), - array_values($this->deprecations), - array_values($this->notices), - array_values($this->warnings), - array_values($this->phpDeprecations), - array_values($this->phpNotices), - array_values($this->phpWarnings), - $this->numberOfIssuesIgnoredByBaseline, - ); - } - - public function executionStarted(ExecutionStarted $event): void - { - $this->numberOfTests = $event->testSuite()->count(); - } - - public function testSuiteSkipped(TestSuiteSkipped $event): void - { - $testSuite = $event->testSuite(); - - if (!$testSuite->isForTestClass()) { - return; - } - - $this->testSuiteSkippedEvents[] = $event; - } - - public function testSuiteStarted(TestSuiteStarted $event): void - { - $testSuite = $event->testSuite(); - - if (!$testSuite->isForTestClass()) { - return; - } - - $this->currentTestSuiteForTestClassFailed = false; - } - - public function testSuiteFinished(TestSuiteFinished $event): void - { - if ($this->currentTestSuiteForTestClassFailed) { - return; - } - - $testSuite = $event->testSuite(); - - if ($testSuite->isWithName()) { - return; - } - - if ($testSuite->isForTestMethodWithDataProvider()) { - assert($testSuite instanceof TestSuiteForTestMethodWithDataProvider); - - $test = $testSuite->tests()->asArray()[0]; - - assert($test instanceof TestMethod); - - PassedTests::instance()->testMethodPassed($test, null); - - return; - } - - assert($testSuite instanceof TestSuiteForTestClass); - - PassedTests::instance()->testClassPassed($testSuite->className()); - } - - public function testPrepared(): void - { - $this->prepared = true; - } - - public function testFinished(Finished $event): void - { - $this->numberOfAssertions += $event->numberOfAssertionsPerformed(); - - $this->numberOfTestsRun++; - - $this->prepared = false; - } - - public function beforeTestClassMethodErrored(BeforeFirstTestMethodErrored $event): void - { - $this->testErroredEvents[] = $event; - - $this->numberOfTestsRun++; - } - - public function afterTestClassMethodErrored(AfterLastTestMethodErrored $event): void - { - $this->testErroredEvents[] = $event; - } - - public function testErrored(Errored $event): void - { - $this->testErroredEvents[] = $event; - - $this->currentTestSuiteForTestClassFailed = true; - - /* - * @todo Eliminate this special case - */ - if (str_contains($event->asString(), 'Test was run in child process and ended unexpectedly')) { - return; - } - - if (!$this->prepared) { - $this->numberOfTestsRun++; - } - } - - public function testFailed(Failed $event): void - { - $this->testFailedEvents[] = $event; - - $this->currentTestSuiteForTestClassFailed = true; - } - - public function testMarkedIncomplete(MarkedIncomplete $event): void - { - $this->testMarkedIncompleteEvents[] = $event; - } - - public function testSkipped(TestSkipped $event): void - { - $this->testSkippedEvents[] = $event; - - if (!$this->prepared) { - $this->numberOfTestsRun++; - } - } - - public function testConsideredRisky(ConsideredRisky $event): void - { - if (!isset($this->testConsideredRiskyEvents[$event->test()->id()])) { - $this->testConsideredRiskyEvents[$event->test()->id()] = []; - } - - $this->testConsideredRiskyEvents[$event->test()->id()][] = $event; - } - - public function testTriggeredDeprecation(DeprecationTriggered $event): void - { - if ($event->ignoredByTest()) { - return; - } - - if ($event->ignoredByBaseline()) { - $this->numberOfIssuesIgnoredByBaseline++; - - return; - } - - if (!$this->source->ignoreSuppressionOfDeprecations() && $event->wasSuppressed()) { - return; - } - - if ($this->source->restrictDeprecations() && !SourceFilter::instance()->includes($event->file())) { - return; - } - - $id = $this->issueId($event); - - if (!isset($this->deprecations[$id])) { - $this->deprecations[$id] = Issue::from( - $event->file(), - $event->line(), - $event->message(), - $event->test(), - ); - - return; - } - - $this->deprecations[$id]->triggeredBy($event->test()); - } - - public function testTriggeredPhpDeprecation(PhpDeprecationTriggered $event): void - { - if ($event->ignoredByTest()) { - return; - } - - if ($event->ignoredByBaseline()) { - $this->numberOfIssuesIgnoredByBaseline++; - - return; - } - - if (!$this->source->ignoreSuppressionOfPhpDeprecations() && $event->wasSuppressed()) { - return; - } - - if ($this->source->restrictDeprecations() && !SourceFilter::instance()->includes($event->file())) { - return; - } - - $id = $this->issueId($event); - - if (!isset($this->phpDeprecations[$id])) { - $this->phpDeprecations[$id] = Issue::from( - $event->file(), - $event->line(), - $event->message(), - $event->test(), - ); - - return; - } - - $this->phpDeprecations[$id]->triggeredBy($event->test()); - } - - public function testTriggeredPhpunitDeprecation(PhpunitDeprecationTriggered $event): void - { - if (!isset($this->testTriggeredPhpunitDeprecationEvents[$event->test()->id()])) { - $this->testTriggeredPhpunitDeprecationEvents[$event->test()->id()] = []; - } - - $this->testTriggeredPhpunitDeprecationEvents[$event->test()->id()][] = $event; - } - - public function testTriggeredError(ErrorTriggered $event): void - { - if (!$this->source->ignoreSuppressionOfErrors() && $event->wasSuppressed()) { - return; - } - - $id = $this->issueId($event); - - if (!isset($this->errors[$id])) { - $this->errors[$id] = Issue::from( - $event->file(), - $event->line(), - $event->message(), - $event->test(), - ); - - return; - } - - $this->errors[$id]->triggeredBy($event->test()); - } - - public function testTriggeredNotice(NoticeTriggered $event): void - { - if ($event->ignoredByBaseline()) { - $this->numberOfIssuesIgnoredByBaseline++; - - return; - } - - if (!$this->source->ignoreSuppressionOfNotices() && $event->wasSuppressed()) { - return; - } - - if ($this->source->restrictNotices() && !SourceFilter::instance()->includes($event->file())) { - return; - } - - $id = $this->issueId($event); - - if (!isset($this->notices[$id])) { - $this->notices[$id] = Issue::from( - $event->file(), - $event->line(), - $event->message(), - $event->test(), - ); - - return; - } - - $this->notices[$id]->triggeredBy($event->test()); - } - - public function testTriggeredPhpNotice(PhpNoticeTriggered $event): void - { - if ($event->ignoredByBaseline()) { - $this->numberOfIssuesIgnoredByBaseline++; - - return; - } - - if (!$this->source->ignoreSuppressionOfPhpNotices() && $event->wasSuppressed()) { - return; - } - - if ($this->source->restrictNotices() && !SourceFilter::instance()->includes($event->file())) { - return; - } - - $id = $this->issueId($event); - - if (!isset($this->phpNotices[$id])) { - $this->phpNotices[$id] = Issue::from( - $event->file(), - $event->line(), - $event->message(), - $event->test(), - ); - - return; - } - - $this->phpNotices[$id]->triggeredBy($event->test()); - } - - public function testTriggeredWarning(WarningTriggered $event): void - { - if ($event->ignoredByBaseline()) { - $this->numberOfIssuesIgnoredByBaseline++; - - return; - } - - if (!$this->source->ignoreSuppressionOfWarnings() && $event->wasSuppressed()) { - return; - } - - if ($this->source->restrictWarnings() && !SourceFilter::instance()->includes($event->file())) { - return; - } - - $id = $this->issueId($event); - - if (!isset($this->warnings[$id])) { - $this->warnings[$id] = Issue::from( - $event->file(), - $event->line(), - $event->message(), - $event->test(), - ); - - return; - } - - $this->warnings[$id]->triggeredBy($event->test()); - } - - public function testTriggeredPhpWarning(PhpWarningTriggered $event): void - { - if ($event->ignoredByBaseline()) { - $this->numberOfIssuesIgnoredByBaseline++; - - return; - } - - if (!$this->source->ignoreSuppressionOfPhpWarnings() && $event->wasSuppressed()) { - return; - } - - if ($this->source->restrictWarnings() && !SourceFilter::instance()->includes($event->file())) { - return; - } - - $id = $this->issueId($event); - - if (!isset($this->phpWarnings[$id])) { - $this->phpWarnings[$id] = Issue::from( - $event->file(), - $event->line(), - $event->message(), - $event->test(), - ); - - return; - } - - $this->phpWarnings[$id]->triggeredBy($event->test()); - } - - public function testTriggeredPhpunitError(PhpunitErrorTriggered $event): void - { - if (!isset($this->testTriggeredPhpunitErrorEvents[$event->test()->id()])) { - $this->testTriggeredPhpunitErrorEvents[$event->test()->id()] = []; - } - - $this->testTriggeredPhpunitErrorEvents[$event->test()->id()][] = $event; - } - - public function testTriggeredPhpunitWarning(PhpunitWarningTriggered $event): void - { - if (!isset($this->testTriggeredPhpunitWarningEvents[$event->test()->id()])) { - $this->testTriggeredPhpunitWarningEvents[$event->test()->id()] = []; - } - - $this->testTriggeredPhpunitWarningEvents[$event->test()->id()][] = $event; - } - - public function testRunnerTriggeredDeprecation(TestRunnerDeprecationTriggered $event): void - { - $this->testRunnerTriggeredDeprecationEvents[] = $event; - } - - public function testRunnerTriggeredWarning(TestRunnerWarningTriggered $event): void - { - $this->testRunnerTriggeredWarningEvents[] = $event; - } - - public function hasErroredTests(): bool - { - return !empty($this->testErroredEvents); - } - - public function hasFailedTests(): bool - { - return !empty($this->testFailedEvents); - } - - public function hasRiskyTests(): bool - { - return !empty($this->testConsideredRiskyEvents); - } - - public function hasSkippedTests(): bool - { - return !empty($this->testSkippedEvents); - } - - public function hasIncompleteTests(): bool - { - return !empty($this->testMarkedIncompleteEvents); - } - - public function hasDeprecations(): bool - { - return !empty($this->deprecations) || - !empty($this->phpDeprecations) || - !empty($this->testTriggeredPhpunitDeprecationEvents) || - !empty($this->testRunnerTriggeredDeprecationEvents); - } - - public function hasNotices(): bool - { - return !empty($this->notices) || - !empty($this->phpNotices); - } - - public function hasWarnings(): bool - { - return !empty($this->warnings) || - !empty($this->phpWarnings) || - !empty($this->testTriggeredPhpunitWarningEvents) || - !empty($this->testRunnerTriggeredWarningEvents); - } - - /** - * @psalm-return non-empty-string - */ - private function issueId(DeprecationTriggered|ErrorTriggered|NoticeTriggered|PhpDeprecationTriggered|PhpNoticeTriggered|PhpWarningTriggered|WarningTriggered $event): string - { - return implode(':', [$event->file(), $event->line(), $event->message()]); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/TestResult/Facade.php b/vendor/phpunit/phpunit/src/Runner/TestResult/Facade.php deleted file mode 100644 index 75b7471..0000000 --- a/vendor/phpunit/phpunit/src/Runner/TestResult/Facade.php +++ /dev/null @@ -1,105 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TestRunner\TestResult; - -use PHPUnit\Event\EventFacadeIsSealedException; -use PHPUnit\Event\Facade as EventFacade; -use PHPUnit\Event\UnknownSubscriberTypeException; -use PHPUnit\TextUI\Configuration\Registry as ConfigurationRegistry; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Facade -{ - private static ?Collector $collector = null; - - /** - * @throws EventFacadeIsSealedException - * @throws UnknownSubscriberTypeException - */ - public static function init(): void - { - self::collector(); - } - - /** - * @throws EventFacadeIsSealedException - * @throws UnknownSubscriberTypeException - */ - public static function result(): TestResult - { - return self::collector()->result(); - } - - /** - * @throws EventFacadeIsSealedException - * @throws UnknownSubscriberTypeException - */ - public static function shouldStop(): bool - { - $configuration = ConfigurationRegistry::get(); - $collector = self::collector(); - - if (($configuration->stopOnDefect() || $configuration->stopOnError()) && $collector->hasErroredTests()) { - return true; - } - - if (($configuration->stopOnDefect() || $configuration->stopOnFailure()) && $collector->hasFailedTests()) { - return true; - } - - if (($configuration->stopOnDefect() || $configuration->stopOnWarning()) && $collector->hasWarnings()) { - return true; - } - - if (($configuration->stopOnDefect() || $configuration->stopOnRisky()) && $collector->hasRiskyTests()) { - return true; - } - - if ($configuration->stopOnDeprecation() && $collector->hasDeprecations()) { - return true; - } - - if ($configuration->stopOnNotice() && $collector->hasNotices()) { - return true; - } - - if ($configuration->stopOnIncomplete() && $collector->hasIncompleteTests()) { - return true; - } - - if ($configuration->stopOnSkipped() && $collector->hasSkippedTests()) { - return true; - } - - return false; - } - - /** - * @throws EventFacadeIsSealedException - * @throws UnknownSubscriberTypeException - */ - private static function collector(): Collector - { - if (self::$collector === null) { - $configuration = ConfigurationRegistry::get(); - - self::$collector = new Collector( - EventFacade::instance(), - $configuration->source(), - ); - } - - return self::$collector; - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/TestResult/Issue.php b/vendor/phpunit/phpunit/src/Runner/TestResult/Issue.php deleted file mode 100644 index dcfd17f..0000000 --- a/vendor/phpunit/phpunit/src/Runner/TestResult/Issue.php +++ /dev/null @@ -1,115 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TestRunner\TestResult\Issues; - -use PHPUnit\Event\Code\Test; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Issue -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $file; - - /** - * @psalm-var positive-int - */ - private readonly int $line; - - /** - * @psalm-var non-empty-string - */ - private readonly string $description; - - /** - * @psalm-var non-empty-array - */ - private array $triggeringTests; - - /** - * @psalm-param non-empty-string $file - * @psalm-param positive-int $line - * @psalm-param non-empty-string $description - */ - public static function from(string $file, int $line, string $description, Test $triggeringTest): self - { - return new self($file, $line, $description, $triggeringTest); - } - - /** - * @psalm-param non-empty-string $file - * @psalm-param positive-int $line - * @psalm-param non-empty-string $description - */ - private function __construct(string $file, int $line, string $description, Test $triggeringTest) - { - $this->file = $file; - $this->line = $line; - $this->description = $description; - - $this->triggeringTests = [ - $triggeringTest->id() => [ - 'test' => $triggeringTest, - 'count' => 1, - ], - ]; - } - - public function triggeredBy(Test $test): void - { - if (isset($this->triggeringTests[$test->id()])) { - $this->triggeringTests[$test->id()]['count']++; - - return; - } - - $this->triggeringTests[$test->id()] = [ - 'test' => $test, - 'count' => 1, - ]; - } - - /** - * @psalm-return non-empty-string - */ - public function file(): string - { - return $this->file; - } - - /** - * @psalm-return positive-int - */ - public function line(): int - { - return $this->line; - } - - /** - * @psalm-return non-empty-string - */ - public function description(): string - { - return $this->description; - } - - /** - * @psalm-return non-empty-array - */ - public function triggeringTests(): array - { - return $this->triggeringTests; - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/TestResult/PassedTests.php b/vendor/phpunit/phpunit/src/Runner/TestResult/PassedTests.php deleted file mode 100644 index b448bc8..0000000 --- a/vendor/phpunit/phpunit/src/Runner/TestResult/PassedTests.php +++ /dev/null @@ -1,124 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TestRunner\TestResult; - -use function array_merge; -use function assert; -use function in_array; -use PHPUnit\Event\Code\TestMethod; -use PHPUnit\Framework\TestSize\Known; -use PHPUnit\Framework\TestSize\TestSize; -use PHPUnit\Metadata\Api\Groups; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class PassedTests -{ - private static ?self $instance = null; - - /** - * @psalm-var list - */ - private array $passedTestClasses = []; - - /** - * @psalm-var array - */ - private array $passedTestMethods = []; - - public static function instance(): self - { - if (self::$instance !== null) { - return self::$instance; - } - - self::$instance = new self; - - return self::$instance; - } - - /** - * @psalm-param class-string $className - */ - public function testClassPassed(string $className): void - { - $this->passedTestClasses[] = $className; - } - - public function testMethodPassed(TestMethod $test, mixed $returnValue): void - { - $size = (new Groups)->size( - $test->className(), - $test->methodName(), - ); - - $this->passedTestMethods[$test->className() . '::' . $test->methodName()] = [ - 'returnValue' => $returnValue, - 'size' => $size, - ]; - } - - public function import(self $other): void - { - $this->passedTestClasses = array_merge( - $this->passedTestClasses, - $other->passedTestClasses, - ); - - $this->passedTestMethods = array_merge( - $this->passedTestMethods, - $other->passedTestMethods, - ); - } - - /** - * @psalm-param class-string $className - */ - public function hasTestClassPassed(string $className): bool - { - return in_array($className, $this->passedTestClasses, true); - } - - public function hasTestMethodPassed(string $method): bool - { - return isset($this->passedTestMethods[$method]); - } - - public function isGreaterThan(string $method, TestSize $other): bool - { - if ($other->isUnknown()) { - return false; - } - - assert($other instanceof Known); - - $size = $this->passedTestMethods[$method]['size']; - - if ($size->isUnknown()) { - return false; - } - - assert($size instanceof Known); - - return $size->isGreaterThan($other); - } - - public function returnValue(string $method): mixed - { - if (isset($this->passedTestMethods[$method])) { - return $this->passedTestMethods[$method]['returnValue']; - } - - return null; - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/AfterTestClassMethodErroredSubscriber.php b/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/AfterTestClassMethodErroredSubscriber.php deleted file mode 100644 index abbbec2..0000000 --- a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/AfterTestClassMethodErroredSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TestRunner\TestResult; - -use PHPUnit\Event\Test\AfterLastTestMethodErrored; -use PHPUnit\Event\Test\AfterLastTestMethodErroredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class AfterTestClassMethodErroredSubscriber extends Subscriber implements AfterLastTestMethodErroredSubscriber -{ - public function notify(AfterLastTestMethodErrored $event): void - { - $this->collector()->afterTestClassMethodErrored($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/BeforeTestClassMethodErroredSubscriber.php b/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/BeforeTestClassMethodErroredSubscriber.php deleted file mode 100644 index c9facc2..0000000 --- a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/BeforeTestClassMethodErroredSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TestRunner\TestResult; - -use PHPUnit\Event\Test\BeforeFirstTestMethodErrored; -use PHPUnit\Event\Test\BeforeFirstTestMethodErroredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class BeforeTestClassMethodErroredSubscriber extends Subscriber implements BeforeFirstTestMethodErroredSubscriber -{ - public function notify(BeforeFirstTestMethodErrored $event): void - { - $this->collector()->beforeTestClassMethodErrored($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/ExecutionStartedSubscriber.php b/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/ExecutionStartedSubscriber.php deleted file mode 100644 index 56f16d7..0000000 --- a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/ExecutionStartedSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TestRunner\TestResult; - -use PHPUnit\Event\TestRunner\ExecutionStarted; -use PHPUnit\Event\TestRunner\ExecutionStartedSubscriber as TestRunnerExecutionStartedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ExecutionStartedSubscriber extends Subscriber implements TestRunnerExecutionStartedSubscriber -{ - public function notify(ExecutionStarted $event): void - { - $this->collector()->executionStarted($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/Subscriber.php b/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/Subscriber.php deleted file mode 100644 index f9abbb7..0000000 --- a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/Subscriber.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TestRunner\TestResult; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -abstract class Subscriber -{ - private readonly Collector $collector; - - public function __construct(Collector $collector) - { - $this->collector = $collector; - } - - protected function collector(): Collector - { - return $this->collector; - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestConsideredRiskySubscriber.php b/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestConsideredRiskySubscriber.php deleted file mode 100644 index b3656e4..0000000 --- a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestConsideredRiskySubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TestRunner\TestResult; - -use PHPUnit\Event\Test\ConsideredRisky; -use PHPUnit\Event\Test\ConsideredRiskySubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestConsideredRiskySubscriber extends Subscriber implements ConsideredRiskySubscriber -{ - public function notify(ConsideredRisky $event): void - { - $this->collector()->testConsideredRisky($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestErroredSubscriber.php b/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestErroredSubscriber.php deleted file mode 100644 index 272c992..0000000 --- a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestErroredSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TestRunner\TestResult; - -use PHPUnit\Event\Test\Errored; -use PHPUnit\Event\Test\ErroredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestErroredSubscriber extends Subscriber implements ErroredSubscriber -{ - public function notify(Errored $event): void - { - $this->collector()->testErrored($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestFailedSubscriber.php b/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestFailedSubscriber.php deleted file mode 100644 index c0b059d..0000000 --- a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestFailedSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TestRunner\TestResult; - -use PHPUnit\Event\Test\Failed; -use PHPUnit\Event\Test\FailedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestFailedSubscriber extends Subscriber implements FailedSubscriber -{ - public function notify(Failed $event): void - { - $this->collector()->testFailed($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestFinishedSubscriber.php b/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestFinishedSubscriber.php deleted file mode 100644 index 6ce115b..0000000 --- a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestFinishedSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TestRunner\TestResult; - -use PHPUnit\Event\Test\Finished; -use PHPUnit\Event\Test\FinishedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestFinishedSubscriber extends Subscriber implements FinishedSubscriber -{ - public function notify(Finished $event): void - { - $this->collector()->testFinished($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestMarkedIncompleteSubscriber.php b/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestMarkedIncompleteSubscriber.php deleted file mode 100644 index b57a098..0000000 --- a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestMarkedIncompleteSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TestRunner\TestResult; - -use PHPUnit\Event\Test\MarkedIncomplete; -use PHPUnit\Event\Test\MarkedIncompleteSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestMarkedIncompleteSubscriber extends Subscriber implements MarkedIncompleteSubscriber -{ - public function notify(MarkedIncomplete $event): void - { - $this->collector()->testMarkedIncomplete($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestPreparedSubscriber.php b/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestPreparedSubscriber.php deleted file mode 100644 index b68c0d5..0000000 --- a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestPreparedSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TestRunner\TestResult; - -use PHPUnit\Event\Test\Prepared; -use PHPUnit\Event\Test\PreparedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestPreparedSubscriber extends Subscriber implements PreparedSubscriber -{ - public function notify(Prepared $event): void - { - $this->collector()->testPrepared(); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestRunnerTriggeredDeprecationSubscriber.php b/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestRunnerTriggeredDeprecationSubscriber.php deleted file mode 100644 index 0550ada..0000000 --- a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestRunnerTriggeredDeprecationSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TestRunner\TestResult; - -use PHPUnit\Event\TestRunner\DeprecationTriggered; -use PHPUnit\Event\TestRunner\DeprecationTriggeredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestRunnerTriggeredDeprecationSubscriber extends Subscriber implements DeprecationTriggeredSubscriber -{ - public function notify(DeprecationTriggered $event): void - { - $this->collector()->testRunnerTriggeredDeprecation($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestRunnerTriggeredWarningSubscriber.php b/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestRunnerTriggeredWarningSubscriber.php deleted file mode 100644 index b66e749..0000000 --- a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestRunnerTriggeredWarningSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TestRunner\TestResult; - -use PHPUnit\Event\TestRunner\WarningTriggered; -use PHPUnit\Event\TestRunner\WarningTriggeredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestRunnerTriggeredWarningSubscriber extends Subscriber implements WarningTriggeredSubscriber -{ - public function notify(WarningTriggered $event): void - { - $this->collector()->testRunnerTriggeredWarning($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSkippedSubscriber.php b/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSkippedSubscriber.php deleted file mode 100644 index 4cc4454..0000000 --- a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSkippedSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TestRunner\TestResult; - -use PHPUnit\Event\Test\Skipped; -use PHPUnit\Event\Test\SkippedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestSkippedSubscriber extends Subscriber implements SkippedSubscriber -{ - public function notify(Skipped $event): void - { - $this->collector()->testSkipped($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSuiteFinishedSubscriber.php b/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSuiteFinishedSubscriber.php deleted file mode 100644 index 125cd51..0000000 --- a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSuiteFinishedSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TestRunner\TestResult; - -use PHPUnit\Event\TestSuite\Finished; -use PHPUnit\Event\TestSuite\FinishedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestSuiteFinishedSubscriber extends Subscriber implements FinishedSubscriber -{ - public function notify(Finished $event): void - { - $this->collector()->testSuiteFinished($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSuiteSkippedSubscriber.php b/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSuiteSkippedSubscriber.php deleted file mode 100644 index bf26b15..0000000 --- a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSuiteSkippedSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TestRunner\TestResult; - -use PHPUnit\Event\TestSuite\Skipped; -use PHPUnit\Event\TestSuite\SkippedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestSuiteSkippedSubscriber extends Subscriber implements SkippedSubscriber -{ - public function notify(Skipped $event): void - { - $this->collector()->testSuiteSkipped($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSuiteStartedSubscriber.php b/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSuiteStartedSubscriber.php deleted file mode 100644 index ef8c8d0..0000000 --- a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSuiteStartedSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TestRunner\TestResult; - -use PHPUnit\Event\TestSuite\Started; -use PHPUnit\Event\TestSuite\StartedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestSuiteStartedSubscriber extends Subscriber implements StartedSubscriber -{ - public function notify(Started $event): void - { - $this->collector()->testSuiteStarted($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredDeprecationSubscriber.php b/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredDeprecationSubscriber.php deleted file mode 100644 index 6185723..0000000 --- a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredDeprecationSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TestRunner\TestResult; - -use PHPUnit\Event\Test\DeprecationTriggered; -use PHPUnit\Event\Test\DeprecationTriggeredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestTriggeredDeprecationSubscriber extends Subscriber implements DeprecationTriggeredSubscriber -{ - public function notify(DeprecationTriggered $event): void - { - $this->collector()->testTriggeredDeprecation($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredErrorSubscriber.php b/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredErrorSubscriber.php deleted file mode 100644 index c5daf0d..0000000 --- a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredErrorSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TestRunner\TestResult; - -use PHPUnit\Event\Test\ErrorTriggered; -use PHPUnit\Event\Test\ErrorTriggeredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestTriggeredErrorSubscriber extends Subscriber implements ErrorTriggeredSubscriber -{ - public function notify(ErrorTriggered $event): void - { - $this->collector()->testTriggeredError($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredNoticeSubscriber.php b/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredNoticeSubscriber.php deleted file mode 100644 index e0c4b55..0000000 --- a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredNoticeSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TestRunner\TestResult; - -use PHPUnit\Event\Test\NoticeTriggered; -use PHPUnit\Event\Test\NoticeTriggeredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestTriggeredNoticeSubscriber extends Subscriber implements NoticeTriggeredSubscriber -{ - public function notify(NoticeTriggered $event): void - { - $this->collector()->testTriggeredNotice($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpDeprecationSubscriber.php b/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpDeprecationSubscriber.php deleted file mode 100644 index b0ddcba..0000000 --- a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpDeprecationSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TestRunner\TestResult; - -use PHPUnit\Event\Test\PhpDeprecationTriggered; -use PHPUnit\Event\Test\PhpDeprecationTriggeredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestTriggeredPhpDeprecationSubscriber extends Subscriber implements PhpDeprecationTriggeredSubscriber -{ - public function notify(PhpDeprecationTriggered $event): void - { - $this->collector()->testTriggeredPhpDeprecation($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpNoticeSubscriber.php b/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpNoticeSubscriber.php deleted file mode 100644 index 3f6e54c..0000000 --- a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpNoticeSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TestRunner\TestResult; - -use PHPUnit\Event\Test\PhpNoticeTriggered; -use PHPUnit\Event\Test\PhpNoticeTriggeredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestTriggeredPhpNoticeSubscriber extends Subscriber implements PhpNoticeTriggeredSubscriber -{ - public function notify(PhpNoticeTriggered $event): void - { - $this->collector()->testTriggeredPhpNotice($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpWarningSubscriber.php b/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpWarningSubscriber.php deleted file mode 100644 index c8af289..0000000 --- a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpWarningSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TestRunner\TestResult; - -use PHPUnit\Event\Test\PhpWarningTriggered; -use PHPUnit\Event\Test\PhpWarningTriggeredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestTriggeredPhpWarningSubscriber extends Subscriber implements PhpWarningTriggeredSubscriber -{ - public function notify(PhpWarningTriggered $event): void - { - $this->collector()->testTriggeredPhpWarning($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpunitDeprecationSubscriber.php b/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpunitDeprecationSubscriber.php deleted file mode 100644 index 704895b..0000000 --- a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpunitDeprecationSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TestRunner\TestResult; - -use PHPUnit\Event\Test\PhpunitDeprecationTriggered; -use PHPUnit\Event\Test\PhpunitDeprecationTriggeredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestTriggeredPhpunitDeprecationSubscriber extends Subscriber implements PhpunitDeprecationTriggeredSubscriber -{ - public function notify(PhpunitDeprecationTriggered $event): void - { - $this->collector()->testTriggeredPhpunitDeprecation($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpunitErrorSubscriber.php b/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpunitErrorSubscriber.php deleted file mode 100644 index 0fcb017..0000000 --- a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpunitErrorSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TestRunner\TestResult; - -use PHPUnit\Event\Test\PhpunitErrorTriggered; -use PHPUnit\Event\Test\PhpunitErrorTriggeredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestTriggeredPhpunitErrorSubscriber extends Subscriber implements PhpunitErrorTriggeredSubscriber -{ - public function notify(PhpunitErrorTriggered $event): void - { - $this->collector()->testTriggeredPhpunitError($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpunitWarningSubscriber.php b/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpunitWarningSubscriber.php deleted file mode 100644 index 6c6c49a..0000000 --- a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpunitWarningSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TestRunner\TestResult; - -use PHPUnit\Event\Test\PhpunitWarningTriggered; -use PHPUnit\Event\Test\PhpunitWarningTriggeredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestTriggeredPhpunitWarningSubscriber extends Subscriber implements PhpunitWarningTriggeredSubscriber -{ - public function notify(PhpunitWarningTriggered $event): void - { - $this->collector()->testTriggeredPhpunitWarning($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredWarningSubscriber.php b/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredWarningSubscriber.php deleted file mode 100644 index a68d1e2..0000000 --- a/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredWarningSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TestRunner\TestResult; - -use PHPUnit\Event\Test\WarningTriggered; -use PHPUnit\Event\Test\WarningTriggeredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestTriggeredWarningSubscriber extends Subscriber implements WarningTriggeredSubscriber -{ - public function notify(WarningTriggered $event): void - { - $this->collector()->testTriggeredWarning($event); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/TestResult/TestResult.php b/vendor/phpunit/phpunit/src/Runner/TestResult/TestResult.php deleted file mode 100644 index 52bf78e..0000000 --- a/vendor/phpunit/phpunit/src/Runner/TestResult/TestResult.php +++ /dev/null @@ -1,586 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TestRunner\TestResult; - -use function count; -use PHPUnit\Event\Test\AfterLastTestMethodErrored; -use PHPUnit\Event\Test\BeforeFirstTestMethodErrored; -use PHPUnit\Event\Test\ConsideredRisky; -use PHPUnit\Event\Test\Errored; -use PHPUnit\Event\Test\Failed; -use PHPUnit\Event\Test\MarkedIncomplete; -use PHPUnit\Event\Test\PhpunitDeprecationTriggered; -use PHPUnit\Event\Test\PhpunitErrorTriggered; -use PHPUnit\Event\Test\PhpunitWarningTriggered; -use PHPUnit\Event\Test\Skipped as TestSkipped; -use PHPUnit\Event\TestRunner\DeprecationTriggered as TestRunnerDeprecationTriggered; -use PHPUnit\Event\TestRunner\WarningTriggered as TestRunnerWarningTriggered; -use PHPUnit\Event\TestSuite\Skipped as TestSuiteSkipped; -use PHPUnit\TestRunner\TestResult\Issues\Issue; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestResult -{ - private readonly int $numberOfTests; - private readonly int $numberOfTestsRun; - private readonly int $numberOfAssertions; - - /** - * @psalm-var list - */ - private readonly array $testErroredEvents; - - /** - * @psalm-var list - */ - private readonly array $testFailedEvents; - - /** - * @psalm-var list - */ - private readonly array $testMarkedIncompleteEvents; - - /** - * @psalm-var list - */ - private readonly array $testSuiteSkippedEvents; - - /** - * @psalm-var list - */ - private readonly array $testSkippedEvents; - - /** - * @psalm-var array> - */ - private readonly array $testConsideredRiskyEvents; - - /** - * @psalm-var array> - */ - private readonly array $testTriggeredPhpunitDeprecationEvents; - - /** - * @psalm-var array> - */ - private readonly array $testTriggeredPhpunitErrorEvents; - - /** - * @psalm-var array> - */ - private readonly array $testTriggeredPhpunitWarningEvents; - - /** - * @psalm-var list - */ - private readonly array $testRunnerTriggeredDeprecationEvents; - - /** - * @psalm-var list - */ - private readonly array $testRunnerTriggeredWarningEvents; - - /** - * @psalm-var list - */ - private readonly array $errors; - - /** - * @psalm-var list - */ - private readonly array $deprecations; - - /** - * @psalm-var list - */ - private readonly array $notices; - - /** - * @psalm-var list - */ - private readonly array $warnings; - - /** - * @psalm-var list - */ - private readonly array $phpDeprecations; - - /** - * @psalm-var list - */ - private readonly array $phpNotices; - - /** - * @psalm-var list - */ - private readonly array $phpWarnings; - - /** - * @psalm-var non-negative-int - */ - private readonly int $numberOfIssuesIgnoredByBaseline; - - /** - * @psalm-param list $testErroredEvents - * @psalm-param list $testFailedEvents - * @psalm-param array> $testConsideredRiskyEvents - * @psalm-param list $testSuiteSkippedEvents - * @psalm-param list $testSkippedEvents - * @psalm-param list $testMarkedIncompleteEvents - * @psalm-param array> $testTriggeredPhpunitDeprecationEvents - * @psalm-param array> $testTriggeredPhpunitErrorEvents - * @psalm-param array> $testTriggeredPhpunitWarningEvents - * @psalm-param list $testRunnerTriggeredDeprecationEvents - * @psalm-param list $testRunnerTriggeredWarningEvents - * @psalm-param list $errors - * @psalm-param list $deprecations - * @psalm-param list $notices - * @psalm-param list $warnings - * @psalm-param list $phpDeprecations - * @psalm-param list $phpNotices - * @psalm-param list $phpWarnings - * @psalm-param non-negative-int $numberOfIssuesIgnoredByBaseline - */ - public function __construct(int $numberOfTests, int $numberOfTestsRun, int $numberOfAssertions, array $testErroredEvents, array $testFailedEvents, array $testConsideredRiskyEvents, array $testSuiteSkippedEvents, array $testSkippedEvents, array $testMarkedIncompleteEvents, array $testTriggeredPhpunitDeprecationEvents, array $testTriggeredPhpunitErrorEvents, array $testTriggeredPhpunitWarningEvents, array $testRunnerTriggeredDeprecationEvents, array $testRunnerTriggeredWarningEvents, array $errors, array $deprecations, array $notices, array $warnings, array $phpDeprecations, array $phpNotices, array $phpWarnings, int $numberOfIssuesIgnoredByBaseline) - { - $this->numberOfTests = $numberOfTests; - $this->numberOfTestsRun = $numberOfTestsRun; - $this->numberOfAssertions = $numberOfAssertions; - $this->testErroredEvents = $testErroredEvents; - $this->testFailedEvents = $testFailedEvents; - $this->testConsideredRiskyEvents = $testConsideredRiskyEvents; - $this->testSuiteSkippedEvents = $testSuiteSkippedEvents; - $this->testSkippedEvents = $testSkippedEvents; - $this->testMarkedIncompleteEvents = $testMarkedIncompleteEvents; - $this->testTriggeredPhpunitDeprecationEvents = $testTriggeredPhpunitDeprecationEvents; - $this->testTriggeredPhpunitErrorEvents = $testTriggeredPhpunitErrorEvents; - $this->testTriggeredPhpunitWarningEvents = $testTriggeredPhpunitWarningEvents; - $this->testRunnerTriggeredDeprecationEvents = $testRunnerTriggeredDeprecationEvents; - $this->testRunnerTriggeredWarningEvents = $testRunnerTriggeredWarningEvents; - $this->errors = $errors; - $this->deprecations = $deprecations; - $this->notices = $notices; - $this->warnings = $warnings; - $this->phpDeprecations = $phpDeprecations; - $this->phpNotices = $phpNotices; - $this->phpWarnings = $phpWarnings; - $this->numberOfIssuesIgnoredByBaseline = $numberOfIssuesIgnoredByBaseline; - } - - public function numberOfTestsRun(): int - { - return $this->numberOfTestsRun; - } - - public function numberOfAssertions(): int - { - return $this->numberOfAssertions; - } - - /** - * @psalm-return list - */ - public function testErroredEvents(): array - { - return $this->testErroredEvents; - } - - public function numberOfTestErroredEvents(): int - { - return count($this->testErroredEvents); - } - - public function hasTestErroredEvents(): bool - { - return $this->numberOfTestErroredEvents() > 0; - } - - /** - * @psalm-return list - */ - public function testFailedEvents(): array - { - return $this->testFailedEvents; - } - - public function numberOfTestFailedEvents(): int - { - return count($this->testFailedEvents); - } - - public function hasTestFailedEvents(): bool - { - return $this->numberOfTestFailedEvents() > 0; - } - - /** - * @psalm-return array> - */ - public function testConsideredRiskyEvents(): array - { - return $this->testConsideredRiskyEvents; - } - - public function numberOfTestsWithTestConsideredRiskyEvents(): int - { - return count($this->testConsideredRiskyEvents); - } - - public function hasTestConsideredRiskyEvents(): bool - { - return $this->numberOfTestsWithTestConsideredRiskyEvents() > 0; - } - - /** - * @psalm-return list - */ - public function testSuiteSkippedEvents(): array - { - return $this->testSuiteSkippedEvents; - } - - public function numberOfTestSuiteSkippedEvents(): int - { - return count($this->testSuiteSkippedEvents); - } - - public function hasTestSuiteSkippedEvents(): bool - { - return $this->numberOfTestSuiteSkippedEvents() > 0; - } - - /** - * @psalm-return list - */ - public function testSkippedEvents(): array - { - return $this->testSkippedEvents; - } - - public function numberOfTestSkippedEvents(): int - { - return count($this->testSkippedEvents); - } - - public function hasTestSkippedEvents(): bool - { - return $this->numberOfTestSkippedEvents() > 0; - } - - /** - * @psalm-return list - */ - public function testMarkedIncompleteEvents(): array - { - return $this->testMarkedIncompleteEvents; - } - - public function numberOfTestMarkedIncompleteEvents(): int - { - return count($this->testMarkedIncompleteEvents); - } - - public function hasTestMarkedIncompleteEvents(): bool - { - return $this->numberOfTestMarkedIncompleteEvents() > 0; - } - - /** - * @psalm-return array> - */ - public function testTriggeredPhpunitDeprecationEvents(): array - { - return $this->testTriggeredPhpunitDeprecationEvents; - } - - public function numberOfTestsWithTestTriggeredPhpunitDeprecationEvents(): int - { - return count($this->testTriggeredPhpunitDeprecationEvents); - } - - public function hasTestTriggeredPhpunitDeprecationEvents(): bool - { - return $this->numberOfTestsWithTestTriggeredPhpunitDeprecationEvents() > 0; - } - - /** - * @psalm-return array> - */ - public function testTriggeredPhpunitErrorEvents(): array - { - return $this->testTriggeredPhpunitErrorEvents; - } - - public function numberOfTestsWithTestTriggeredPhpunitErrorEvents(): int - { - return count($this->testTriggeredPhpunitErrorEvents); - } - - public function hasTestTriggeredPhpunitErrorEvents(): bool - { - return $this->numberOfTestsWithTestTriggeredPhpunitErrorEvents() > 0; - } - - /** - * @psalm-return array> - */ - public function testTriggeredPhpunitWarningEvents(): array - { - return $this->testTriggeredPhpunitWarningEvents; - } - - public function numberOfTestsWithTestTriggeredPhpunitWarningEvents(): int - { - return count($this->testTriggeredPhpunitWarningEvents); - } - - public function hasTestTriggeredPhpunitWarningEvents(): bool - { - return $this->numberOfTestsWithTestTriggeredPhpunitWarningEvents() > 0; - } - - /** - * @psalm-return list - */ - public function testRunnerTriggeredDeprecationEvents(): array - { - return $this->testRunnerTriggeredDeprecationEvents; - } - - public function numberOfTestRunnerTriggeredDeprecationEvents(): int - { - return count($this->testRunnerTriggeredDeprecationEvents); - } - - public function hasTestRunnerTriggeredDeprecationEvents(): bool - { - return $this->numberOfTestRunnerTriggeredDeprecationEvents() > 0; - } - - /** - * @psalm-return list - */ - public function testRunnerTriggeredWarningEvents(): array - { - return $this->testRunnerTriggeredWarningEvents; - } - - public function numberOfTestRunnerTriggeredWarningEvents(): int - { - return count($this->testRunnerTriggeredWarningEvents); - } - - public function hasTestRunnerTriggeredWarningEvents(): bool - { - return $this->numberOfTestRunnerTriggeredWarningEvents() > 0; - } - - public function wasSuccessful(): bool - { - return !$this->hasTestErroredEvents() && - !$this->hasTestFailedEvents() && - !$this->hasTestTriggeredPhpunitErrorEvents(); - } - - public function wasSuccessfulAndNoTestHasIssues(): bool - { - return $this->wasSuccessful() && !$this->hasTestsWithIssues(); - } - - public function hasIssues(): bool - { - return $this->hasTestsWithIssues() || - $this->hasTestRunnerTriggeredWarningEvents(); - } - - public function hasTestsWithIssues(): bool - { - return $this->hasRiskyTests() || - $this->hasIncompleteTests() || - $this->hasDeprecations() || - !empty($this->errors) || - $this->hasNotices() || - $this->hasWarnings() || - $this->hasPhpunitWarnings(); - } - - /** - * @psalm-return list - */ - public function errors(): array - { - return $this->errors; - } - - /** - * @psalm-return list - */ - public function deprecations(): array - { - return $this->deprecations; - } - - /** - * @psalm-return list - */ - public function notices(): array - { - return $this->notices; - } - - /** - * @psalm-return list - */ - public function warnings(): array - { - return $this->warnings; - } - - /** - * @psalm-return list - */ - public function phpDeprecations(): array - { - return $this->phpDeprecations; - } - - /** - * @psalm-return list - */ - public function phpNotices(): array - { - return $this->phpNotices; - } - - /** - * @psalm-return list - */ - public function phpWarnings(): array - { - return $this->phpWarnings; - } - - public function hasTests(): bool - { - return $this->numberOfTests > 0; - } - - public function hasErrors(): bool - { - return $this->numberOfErrors() > 0; - } - - public function numberOfErrors(): int - { - return $this->numberOfTestErroredEvents() + - count($this->errors) + - $this->numberOfTestsWithTestTriggeredPhpunitErrorEvents(); - } - - public function hasDeprecations(): bool - { - return $this->numberOfDeprecations() > 0; - } - - public function hasPhpOrUserDeprecations(): bool - { - return $this->numberOfPhpOrUserDeprecations() > 0; - } - - public function numberOfPhpOrUserDeprecations(): int - { - return count($this->deprecations) + - count($this->phpDeprecations); - } - - public function hasPhpunitDeprecations(): bool - { - return $this->numberOfPhpunitDeprecations() > 0; - } - - public function numberOfPhpunitDeprecations(): int - { - return count($this->testTriggeredPhpunitDeprecationEvents) + - count($this->testRunnerTriggeredDeprecationEvents); - } - - public function hasPhpunitWarnings(): bool - { - return $this->numberOfPhpunitWarnings() > 0; - } - - public function numberOfPhpunitWarnings(): int - { - return count($this->testTriggeredPhpunitWarningEvents) + - count($this->testRunnerTriggeredWarningEvents); - } - - public function numberOfDeprecations(): int - { - return count($this->deprecations) + - count($this->phpDeprecations) + - count($this->testTriggeredPhpunitDeprecationEvents) + - count($this->testRunnerTriggeredDeprecationEvents); - } - - public function hasNotices(): bool - { - return $this->numberOfNotices() > 0; - } - - public function numberOfNotices(): int - { - return count($this->notices) + - count($this->phpNotices); - } - - public function hasWarnings(): bool - { - return $this->numberOfWarnings() > 0; - } - - public function numberOfWarnings(): int - { - return count($this->warnings) + - count($this->phpWarnings); - } - - public function hasIncompleteTests(): bool - { - return !empty($this->testMarkedIncompleteEvents); - } - - public function hasRiskyTests(): bool - { - return !empty($this->testConsideredRiskyEvents); - } - - public function hasSkippedTests(): bool - { - return !empty($this->testSkippedEvents); - } - - public function hasIssuesIgnoredByBaseline(): bool - { - return $this->numberOfIssuesIgnoredByBaseline > 0; - } - - /** - * @psalm-return non-negative-int - */ - public function numberOfIssuesIgnoredByBaseline(): int - { - return $this->numberOfIssuesIgnoredByBaseline; - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/TestSuiteLoader.php b/vendor/phpunit/phpunit/src/Runner/TestSuiteLoader.php deleted file mode 100644 index e3b984c..0000000 --- a/vendor/phpunit/phpunit/src/Runner/TestSuiteLoader.php +++ /dev/null @@ -1,143 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -use function array_diff; -use function array_values; -use function basename; -use function get_declared_classes; -use function realpath; -use function str_ends_with; -use function strpos; -use function strtolower; -use function substr; -use PHPUnit\Framework\TestCase; -use ReflectionClass; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestSuiteLoader -{ - /** - * @psalm-var list - */ - private static array $declaredClasses = []; - - /** - * @psalm-var array> - */ - private static array $fileToClassesMap = []; - - /** - * @throws Exception - */ - public function load(string $suiteClassFile): ReflectionClass - { - $suiteClassFile = realpath($suiteClassFile); - $suiteClassName = $this->classNameFromFileName($suiteClassFile); - $loadedClasses = $this->loadSuiteClassFile($suiteClassFile); - - foreach ($loadedClasses as $className) { - /** @noinspection PhpUnhandledExceptionInspection */ - $class = new ReflectionClass($className); - - if ($class->isAnonymous()) { - continue; - } - - if ($class->getFileName() !== $suiteClassFile) { - continue; - } - - if (!$class->isSubclassOf(TestCase::class)) { - continue; - } - - if (!str_ends_with(strtolower($class->getShortName()), strtolower($suiteClassName))) { - continue; - } - - if (!$class->isAbstract()) { - return $class; - } - - $e = new ClassIsAbstractException($class->getName(), $suiteClassFile); - } - - if (isset($e)) { - throw $e; - } - - foreach ($loadedClasses as $className) { - if (str_ends_with(strtolower($className), strtolower($suiteClassName))) { - throw new ClassDoesNotExtendTestCaseException($className, $suiteClassFile); - } - } - - throw new ClassCannotBeFoundException($suiteClassName, $suiteClassFile); - } - - private function classNameFromFileName(string $suiteClassFile): string - { - $className = basename($suiteClassFile, '.php'); - $dotPos = strpos($className, '.'); - - if ($dotPos !== false) { - $className = substr($className, 0, $dotPos); - } - - return $className; - } - - /** - * @psalm-return list - */ - private function loadSuiteClassFile(string $suiteClassFile): array - { - if (isset(self::$fileToClassesMap[$suiteClassFile])) { - return self::$fileToClassesMap[$suiteClassFile]; - } - - if (empty(self::$declaredClasses)) { - self::$declaredClasses = get_declared_classes(); - } - - require_once $suiteClassFile; - - $loadedClasses = array_values( - array_diff( - get_declared_classes(), - self::$declaredClasses, - ), - ); - - foreach ($loadedClasses as $loadedClass) { - /** @noinspection PhpUnhandledExceptionInspection */ - $class = new ReflectionClass($loadedClass); - - if (!isset(self::$fileToClassesMap[$class->getFileName()])) { - self::$fileToClassesMap[$class->getFileName()] = []; - } - - self::$fileToClassesMap[$class->getFileName()][] = $class->getName(); - } - - self::$declaredClasses = get_declared_classes(); - - if (empty($loadedClasses)) { - return self::$declaredClasses; - } - - return $loadedClasses; - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/TestSuiteSorter.php b/vendor/phpunit/phpunit/src/Runner/TestSuiteSorter.php deleted file mode 100644 index b332c43..0000000 --- a/vendor/phpunit/phpunit/src/Runner/TestSuiteSorter.php +++ /dev/null @@ -1,300 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -use function array_diff; -use function array_merge; -use function array_reverse; -use function array_splice; -use function assert; -use function count; -use function in_array; -use function max; -use function shuffle; -use function usort; -use PHPUnit\Framework\DataProviderTestSuite; -use PHPUnit\Framework\Reorderable; -use PHPUnit\Framework\Test; -use PHPUnit\Framework\TestCase; -use PHPUnit\Framework\TestSuite; -use PHPUnit\Runner\ResultCache\NullResultCache; -use PHPUnit\Runner\ResultCache\ResultCache; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestSuiteSorter -{ - /** - * @var int - */ - public const ORDER_DEFAULT = 0; - - /** - * @var int - */ - public const ORDER_RANDOMIZED = 1; - - /** - * @var int - */ - public const ORDER_REVERSED = 2; - - /** - * @var int - */ - public const ORDER_DEFECTS_FIRST = 3; - - /** - * @var int - */ - public const ORDER_DURATION = 4; - - /** - * @var int - */ - public const ORDER_SIZE = 5; - - private const SIZE_SORT_WEIGHT = [ - 'small' => 1, - 'medium' => 2, - 'large' => 3, - 'unknown' => 4, - ]; - - /** - * @psalm-var array Associative array of (string => DEFECT_SORT_WEIGHT) elements - */ - private array $defectSortOrder = []; - private readonly ResultCache $cache; - - public function __construct(?ResultCache $cache = null) - { - $this->cache = $cache ?? new NullResultCache; - } - - /** - * @throws Exception - */ - public function reorderTestsInSuite(Test $suite, int $order, bool $resolveDependencies, int $orderDefects): void - { - $allowedOrders = [ - self::ORDER_DEFAULT, - self::ORDER_REVERSED, - self::ORDER_RANDOMIZED, - self::ORDER_DURATION, - self::ORDER_SIZE, - ]; - - if (!in_array($order, $allowedOrders, true)) { - // @codeCoverageIgnoreStart - throw new InvalidOrderException; - // @codeCoverageIgnoreEnd - } - - $allowedOrderDefects = [ - self::ORDER_DEFAULT, - self::ORDER_DEFECTS_FIRST, - ]; - - if (!in_array($orderDefects, $allowedOrderDefects, true)) { - // @codeCoverageIgnoreStart - throw new InvalidOrderException; - // @codeCoverageIgnoreEnd - } - - if ($suite instanceof TestSuite) { - foreach ($suite as $_suite) { - $this->reorderTestsInSuite($_suite, $order, $resolveDependencies, $orderDefects); - } - - if ($orderDefects === self::ORDER_DEFECTS_FIRST) { - $this->addSuiteToDefectSortOrder($suite); - } - - $this->sort($suite, $order, $resolveDependencies, $orderDefects); - } - } - - private function sort(TestSuite $suite, int $order, bool $resolveDependencies, int $orderDefects): void - { - if (empty($suite->tests())) { - return; - } - - if ($order === self::ORDER_REVERSED) { - $suite->setTests($this->reverse($suite->tests())); - } elseif ($order === self::ORDER_RANDOMIZED) { - $suite->setTests($this->randomize($suite->tests())); - } elseif ($order === self::ORDER_DURATION) { - $suite->setTests($this->sortByDuration($suite->tests())); - } elseif ($order === self::ORDER_SIZE) { - $suite->setTests($this->sortBySize($suite->tests())); - } - - if ($orderDefects === self::ORDER_DEFECTS_FIRST) { - $suite->setTests($this->sortDefectsFirst($suite->tests())); - } - - if ($resolveDependencies && !($suite instanceof DataProviderTestSuite)) { - $tests = $suite->tests(); - - $suite->setTests($this->resolveDependencies($tests)); - } - } - - private function addSuiteToDefectSortOrder(TestSuite $suite): void - { - $max = 0; - - foreach ($suite->tests() as $test) { - assert($test instanceof Reorderable); - - if (!isset($this->defectSortOrder[$test->sortId()])) { - $this->defectSortOrder[$test->sortId()] = $this->cache->status($test->sortId())->asInt(); - $max = max($max, $this->defectSortOrder[$test->sortId()]); - } - } - - $this->defectSortOrder[$suite->sortId()] = $max; - } - - private function reverse(array $tests): array - { - return array_reverse($tests); - } - - private function randomize(array $tests): array - { - shuffle($tests); - - return $tests; - } - - private function sortDefectsFirst(array $tests): array - { - usort( - $tests, - fn ($left, $right) => $this->cmpDefectPriorityAndTime($left, $right), - ); - - return $tests; - } - - private function sortByDuration(array $tests): array - { - usort( - $tests, - fn ($left, $right) => $this->cmpDuration($left, $right), - ); - - return $tests; - } - - private function sortBySize(array $tests): array - { - usort( - $tests, - fn ($left, $right) => $this->cmpSize($left, $right), - ); - - return $tests; - } - - /** - * Comparator callback function to sort tests for "reach failure as fast as possible". - * - * 1. sort tests by defect weight defined in self::DEFECT_SORT_WEIGHT - * 2. when tests are equally defective, sort the fastest to the front - * 3. do not reorder successful tests - */ - private function cmpDefectPriorityAndTime(Test $a, Test $b): int - { - assert($a instanceof Reorderable); - assert($b instanceof Reorderable); - - $priorityA = $this->defectSortOrder[$a->sortId()] ?? 0; - $priorityB = $this->defectSortOrder[$b->sortId()] ?? 0; - - if ($priorityB <=> $priorityA) { - // Sort defect weight descending - return $priorityB <=> $priorityA; - } - - if ($priorityA || $priorityB) { - return $this->cmpDuration($a, $b); - } - - // do not change execution order - return 0; - } - - /** - * Compares test duration for sorting tests by duration ascending. - */ - private function cmpDuration(Test $a, Test $b): int - { - assert($a instanceof Reorderable); - assert($b instanceof Reorderable); - - return $this->cache->time($a->sortId()) <=> $this->cache->time($b->sortId()); - } - - /** - * Compares test size for sorting tests small->medium->large->unknown. - */ - private function cmpSize(Test $a, Test $b): int - { - $sizeA = ($a instanceof TestCase || $a instanceof DataProviderTestSuite) - ? $a->size()->asString() - : 'unknown'; - $sizeB = ($b instanceof TestCase || $b instanceof DataProviderTestSuite) - ? $b->size()->asString() - : 'unknown'; - - return self::SIZE_SORT_WEIGHT[$sizeA] <=> self::SIZE_SORT_WEIGHT[$sizeB]; - } - - /** - * Reorder Tests within a TestCase in such a way as to resolve as many dependencies as possible. - * The algorithm will leave the tests in original running order when it can. - * For more details see the documentation for test dependencies. - * - * Short description of algorithm: - * 1. Pick the next Test from remaining tests to be checked for dependencies. - * 2. If the test has no dependencies: mark done, start again from the top - * 3. If the test has dependencies but none left to do: mark done, start again from the top - * 4. When we reach the end add any leftover tests to the end. These will be marked 'skipped' during execution. - * - * @psalm-param array $tests - * - * @psalm-return array - */ - private function resolveDependencies(array $tests): array - { - $newTestOrder = []; - $i = 0; - $provided = []; - - do { - if ([] === array_diff($tests[$i]->requires(), $provided)) { - $provided = array_merge($provided, $tests[$i]->provides()); - $newTestOrder = array_merge($newTestOrder, array_splice($tests, $i, 1)); - $i = 0; - } else { - $i++; - } - } while (!empty($tests) && ($i < count($tests))); - - return array_merge($newTestOrder, $tests); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/Version.php b/vendor/phpunit/phpunit/src/Runner/Version.php deleted file mode 100644 index 2c29fca..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Version.php +++ /dev/null @@ -1,63 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -use function array_slice; -use function dirname; -use function explode; -use function implode; -use function str_contains; -use SebastianBergmann\Version as VersionId; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class Version -{ - private static string $pharVersion = ''; - private static string $version = ''; - - /** - * Returns the current version of PHPUnit. - */ - public static function id(): string - { - if (self::$pharVersion !== '') { - return self::$pharVersion; - } - - if (self::$version === '') { - self::$version = (new VersionId('10.5.63', dirname(__DIR__, 2)))->asString(); - } - - return self::$version; - } - - public static function series(): string - { - if (str_contains(self::id(), '-')) { - $version = explode('-', self::id(), 2)[0]; - } else { - $version = self::id(); - } - - return implode('.', array_slice(explode('.', $version), 0, 2)); - } - - public static function majorVersionNumber(): int - { - return (int) explode('.', self::series())[0]; - } - - public static function getVersionString(): string - { - return 'PHPUnit ' . self::id() . ' by Sebastian Bergmann and contributors.'; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Application.php b/vendor/phpunit/phpunit/src/TextUI/Application.php deleted file mode 100644 index 5c9d2d2..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Application.php +++ /dev/null @@ -1,752 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI; - -use const PHP_EOL; -use const PHP_VERSION; -use function is_file; -use function is_readable; -use function printf; -use function realpath; -use function sprintf; -use function trim; -use function unlink; -use PHPUnit\Event\EventFacadeIsSealedException; -use PHPUnit\Event\Facade as EventFacade; -use PHPUnit\Event\UnknownSubscriberTypeException; -use PHPUnit\Framework\TestSuite; -use PHPUnit\Logging\EventLogger; -use PHPUnit\Logging\JUnit\JunitXmlLogger; -use PHPUnit\Logging\TeamCity\TeamCityLogger; -use PHPUnit\Logging\TestDox\HtmlRenderer as TestDoxHtmlRenderer; -use PHPUnit\Logging\TestDox\PlainTextRenderer as TestDoxTextRenderer; -use PHPUnit\Logging\TestDox\TestResultCollector as TestDoxResultCollector; -use PHPUnit\Metadata\Api\CodeCoverage as CodeCoverageMetadataApi; -use PHPUnit\Runner\Baseline\CannotLoadBaselineException; -use PHPUnit\Runner\Baseline\Generator as BaselineGenerator; -use PHPUnit\Runner\Baseline\Reader; -use PHPUnit\Runner\Baseline\Writer; -use PHPUnit\Runner\CodeCoverage; -use PHPUnit\Runner\DirectoryDoesNotExistException; -use PHPUnit\Runner\ErrorHandler; -use PHPUnit\Runner\Extension\ExtensionBootstrapper; -use PHPUnit\Runner\Extension\Facade as ExtensionFacade; -use PHPUnit\Runner\Extension\PharLoader; -use PHPUnit\Runner\GarbageCollection\GarbageCollectionHandler; -use PHPUnit\Runner\ResultCache\DefaultResultCache; -use PHPUnit\Runner\ResultCache\NullResultCache; -use PHPUnit\Runner\ResultCache\ResultCache; -use PHPUnit\Runner\ResultCache\ResultCacheHandler; -use PHPUnit\Runner\TestSuiteSorter; -use PHPUnit\Runner\Version; -use PHPUnit\TestRunner\TestResult\Facade as TestResultFacade; -use PHPUnit\TextUI\CliArguments\Builder; -use PHPUnit\TextUI\CliArguments\Configuration as CliConfiguration; -use PHPUnit\TextUI\CliArguments\Exception as ArgumentsException; -use PHPUnit\TextUI\CliArguments\XmlConfigurationFileFinder; -use PHPUnit\TextUI\Command\AtLeastVersionCommand; -use PHPUnit\TextUI\Command\CheckPhpConfigurationCommand; -use PHPUnit\TextUI\Command\GenerateConfigurationCommand; -use PHPUnit\TextUI\Command\ListGroupsCommand; -use PHPUnit\TextUI\Command\ListTestsAsTextCommand; -use PHPUnit\TextUI\Command\ListTestsAsXmlCommand; -use PHPUnit\TextUI\Command\ListTestSuitesCommand; -use PHPUnit\TextUI\Command\MigrateConfigurationCommand; -use PHPUnit\TextUI\Command\Result; -use PHPUnit\TextUI\Command\ShowHelpCommand; -use PHPUnit\TextUI\Command\ShowVersionCommand; -use PHPUnit\TextUI\Command\VersionCheckCommand; -use PHPUnit\TextUI\Command\WarmCodeCoverageCacheCommand; -use PHPUnit\TextUI\Configuration\CodeCoverageFilterRegistry; -use PHPUnit\TextUI\Configuration\Configuration; -use PHPUnit\TextUI\Configuration\PhpHandler; -use PHPUnit\TextUI\Configuration\Registry; -use PHPUnit\TextUI\Configuration\TestSuiteBuilder; -use PHPUnit\TextUI\Output\DefaultPrinter; -use PHPUnit\TextUI\Output\Facade as OutputFacade; -use PHPUnit\TextUI\Output\Printer; -use PHPUnit\TextUI\XmlConfiguration\Configuration as XmlConfiguration; -use PHPUnit\TextUI\XmlConfiguration\DefaultConfiguration; -use PHPUnit\TextUI\XmlConfiguration\Loader; -use PHPUnit\Util\Http\PhpDownloader; -use SebastianBergmann\Timer\Timer; -use Throwable; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Application -{ - public function run(array $argv): int - { - try { - EventFacade::emitter()->applicationStarted(); - - $cliConfiguration = $this->buildCliConfiguration($argv); - $pathToXmlConfigurationFile = (new XmlConfigurationFileFinder)->find($cliConfiguration); - - $this->executeCommandsThatOnlyRequireCliConfiguration($cliConfiguration, $pathToXmlConfigurationFile); - - $xmlConfiguration = $this->loadXmlConfiguration($pathToXmlConfigurationFile); - - $configuration = Registry::init( - $cliConfiguration, - $xmlConfiguration, - ); - - (new PhpHandler)->handle($configuration->php()); - - if ($configuration->hasBootstrap()) { - $this->loadBootstrapScript($configuration->bootstrap()); - } - - $this->executeCommandsThatRequireCompleteConfiguration($configuration, $cliConfiguration); - - $testSuite = $this->buildTestSuite($configuration); - - $this->executeCommandsThatRequireCliConfigurationAndTestSuite($cliConfiguration, $testSuite); - $this->executeHelpCommandWhenThereIsNothingElseToDo($configuration, $testSuite); - - $pharExtensions = null; - $extensionRequiresCodeCoverageCollection = false; - $extensionReplacesOutput = false; - $extensionReplacesProgressOutput = false; - $extensionReplacesResultOutput = false; - $extensionRequiresExportOfObjects = false; - - if (!$configuration->noExtensions()) { - if ($configuration->hasPharExtensionDirectory()) { - $pharExtensions = (new PharLoader)->loadPharExtensionsInDirectory( - $configuration->pharExtensionDirectory(), - ); - } - - $bootstrappedExtensions = $this->bootstrapExtensions($configuration); - $extensionRequiresCodeCoverageCollection = $bootstrappedExtensions['requiresCodeCoverageCollection']; - $extensionReplacesOutput = $bootstrappedExtensions['replacesOutput']; - $extensionReplacesProgressOutput = $bootstrappedExtensions['replacesProgressOutput']; - $extensionReplacesResultOutput = $bootstrappedExtensions['replacesResultOutput']; - $extensionRequiresExportOfObjects = $bootstrappedExtensions['requiresExportOfObjects']; - } - - if ($extensionRequiresExportOfObjects) { - EventFacade::emitter()->exportObjects(); - } - - CodeCoverage::instance()->init( - $configuration, - CodeCoverageFilterRegistry::instance(), - $extensionRequiresCodeCoverageCollection, - ); - - if (CodeCoverage::instance()->isActive()) { - CodeCoverage::instance()->ignoreLines( - (new CodeCoverageMetadataApi)->linesToBeIgnored($testSuite), - ); - } - - $printer = OutputFacade::init( - $configuration, - $extensionReplacesProgressOutput, - $extensionReplacesResultOutput, - ); - - if (!$configuration->debug() && !$extensionReplacesOutput) { - $this->writeRuntimeInformation($printer, $configuration); - $this->writePharExtensionInformation($printer, $pharExtensions); - $this->writeRandomSeedInformation($printer, $configuration); - - $printer->print(PHP_EOL); - } - - if ($configuration->debug()) { - EventFacade::instance()->registerTracer( - new EventLogger( - 'php://stdout', - false, - ), - ); - } - - $this->registerLogfileWriters($configuration); - - $testDoxResultCollector = $this->testDoxResultCollector($configuration); - - TestResultFacade::init(); - - $resultCache = $this->initializeTestResultCache($configuration); - - if ($configuration->controlGarbageCollector()) { - new GarbageCollectionHandler( - EventFacade::instance(), - $configuration->numberOfTestsBeforeGarbageCollection(), - ); - } - - $baselineGenerator = $this->configureBaseline($configuration); - - EventFacade::instance()->seal(); - - $timer = new Timer; - $timer->start(); - - $runner = new TestRunner; - - $runner->run( - $configuration, - $resultCache, - $testSuite, - ); - - $duration = $timer->stop(); - - $testDoxResult = null; - - if (isset($testDoxResultCollector)) { - $testDoxResult = $testDoxResultCollector->testMethodsGroupedByClass(); - } - - if ($testDoxResult !== null && - $configuration->hasLogfileTestdoxHtml()) { - try { - OutputFacade::printerFor($configuration->logfileTestdoxHtml())->print( - (new TestDoxHtmlRenderer)->render($testDoxResult), - ); - } catch (DirectoryDoesNotExistException|InvalidSocketException $e) { - EventFacade::emitter()->testRunnerTriggeredPhpunitWarning( - sprintf( - 'Cannot log test results in TestDox HTML format to "%s": %s', - $configuration->logfileTestdoxHtml(), - $e->getMessage(), - ), - ); - } - } - - if ($testDoxResult !== null && - $configuration->hasLogfileTestdoxText()) { - try { - OutputFacade::printerFor($configuration->logfileTestdoxText())->print( - (new TestDoxTextRenderer)->render($testDoxResult), - ); - } catch (DirectoryDoesNotExistException|InvalidSocketException $e) { - EventFacade::emitter()->testRunnerTriggeredPhpunitWarning( - sprintf( - 'Cannot log test results in TestDox plain text format to "%s": %s', - $configuration->logfileTestdoxText(), - $e->getMessage(), - ), - ); - } - } - - $result = TestResultFacade::result(); - - if (!$extensionReplacesResultOutput && !$configuration->debug()) { - OutputFacade::printResult($result, $testDoxResult, $duration); - } - - CodeCoverage::instance()->generateReports($printer, $configuration); - - if (isset($baselineGenerator)) { - (new Writer)->write( - $configuration->generateBaseline(), - $baselineGenerator->baseline(), - ); - - $printer->print( - sprintf( - PHP_EOL . 'Baseline written to %s.' . PHP_EOL, - realpath($configuration->generateBaseline()), - ), - ); - } - - $shellExitCode = (new ShellExitCodeCalculator)->calculate( - $configuration, - $result, - ); - - EventFacade::emitter()->applicationFinished($shellExitCode); - - return $shellExitCode; - // @codeCoverageIgnoreStart - } catch (Throwable $t) { - $this->exitWithCrashMessage($t); - } - // @codeCoverageIgnoreEnd - } - - private function execute(Command\Command $command, bool $requiresResultCollectedFromEvents = false): never - { - if ($requiresResultCollectedFromEvents) { - try { - TestResultFacade::init(); - EventFacade::instance()->seal(); - - $resultCollectedFromEvents = TestResultFacade::result(); - } catch (EventFacadeIsSealedException|UnknownSubscriberTypeException) { - } - } - - print Version::getVersionString() . PHP_EOL . PHP_EOL; - - $result = $command->execute(); - - print $result->output(); - - $shellExitCode = $result->shellExitCode(); - - if (isset($resultCollectedFromEvents) && - $resultCollectedFromEvents->hasTestTriggeredPhpunitErrorEvents()) { - $shellExitCode = Result::EXCEPTION; - - print PHP_EOL . PHP_EOL . 'There were errors:' . PHP_EOL; - - foreach ($resultCollectedFromEvents->testTriggeredPhpunitErrorEvents() as $events) { - foreach ($events as $event) { - print PHP_EOL . trim($event->message()) . PHP_EOL; - } - } - } - - exit($shellExitCode); - } - - private function loadBootstrapScript(string $filename): void - { - if (!is_readable($filename)) { - $this->exitWithErrorMessage( - sprintf( - 'Cannot open bootstrap script "%s"', - $filename, - ), - ); - } - - try { - include_once $filename; - } catch (Throwable $t) { - $message = sprintf( - 'Error in bootstrap script: %s:%s%s%s%s', - $t::class, - PHP_EOL, - $t->getMessage(), - PHP_EOL, - $t->getTraceAsString(), - ); - - while ($t = $t->getPrevious()) { - $message .= sprintf( - '%s%sPrevious error: %s:%s%s%s%s', - PHP_EOL, - PHP_EOL, - $t::class, - PHP_EOL, - $t->getMessage(), - PHP_EOL, - $t->getTraceAsString(), - ); - } - - $this->exitWithErrorMessage($message); - } - - EventFacade::emitter()->testRunnerBootstrapFinished($filename); - } - - private function buildCliConfiguration(array $argv): CliConfiguration - { - try { - $cliConfiguration = (new Builder)->fromParameters($argv); - } catch (ArgumentsException $e) { - $this->exitWithErrorMessage($e->getMessage()); - } - - return $cliConfiguration; - } - - private function loadXmlConfiguration(false|string $configurationFile): XmlConfiguration - { - if ($configurationFile === false) { - return DefaultConfiguration::create(); - } - - try { - return (new Loader)->load($configurationFile); - } catch (Throwable $e) { - $this->exitWithErrorMessage($e->getMessage()); - } - } - - private function buildTestSuite(Configuration $configuration): TestSuite - { - try { - return (new TestSuiteBuilder)->build($configuration); - } catch (Exception $e) { - $this->exitWithErrorMessage($e->getMessage()); - } - } - - /** - * @psalm-return array{requiresCodeCoverageCollection: bool, replacesOutput: bool, replacesProgressOutput: bool, replacesResultOutput: bool, requiresExportOfObjects: bool} - */ - private function bootstrapExtensions(Configuration $configuration): array - { - $facade = new ExtensionFacade; - - $extensionBootstrapper = new ExtensionBootstrapper( - $configuration, - $facade, - ); - - foreach ($configuration->extensionBootstrappers() as $bootstrapper) { - $extensionBootstrapper->bootstrap( - $bootstrapper['className'], - $bootstrapper['parameters'], - ); - } - - return [ - 'requiresCodeCoverageCollection' => $facade->requiresCodeCoverageCollection(), - 'replacesOutput' => $facade->replacesOutput(), - 'replacesProgressOutput' => $facade->replacesProgressOutput(), - 'replacesResultOutput' => $facade->replacesResultOutput(), - 'requiresExportOfObjects' => $facade->requiresExportOfObjects(), - ]; - } - - private function executeCommandsThatOnlyRequireCliConfiguration(CliConfiguration $cliConfiguration, false|string $configurationFile): void - { - if ($cliConfiguration->generateConfiguration()) { - $this->execute(new GenerateConfigurationCommand); - } - - if ($cliConfiguration->migrateConfiguration()) { - if ($configurationFile === false) { - $this->exitWithErrorMessage('No configuration file found to migrate'); - } - - $this->execute(new MigrateConfigurationCommand(realpath($configurationFile))); - } - - if ($cliConfiguration->hasAtLeastVersion()) { - $this->execute(new AtLeastVersionCommand($cliConfiguration->atLeastVersion())); - } - - if ($cliConfiguration->version()) { - $this->execute(new ShowVersionCommand); - } - - if ($cliConfiguration->checkPhpConfiguration()) { - $this->execute(new CheckPhpConfigurationCommand); - } - - if ($cliConfiguration->checkVersion()) { - $this->execute(new VersionCheckCommand(new PhpDownloader, Version::majorVersionNumber(), Version::id())); - } - - if ($cliConfiguration->help()) { - $this->execute(new ShowHelpCommand(Result::SUCCESS)); - } - } - - private function executeCommandsThatRequireCliConfigurationAndTestSuite(CliConfiguration $cliConfiguration, TestSuite $testSuite): void - { - if ($cliConfiguration->listGroups()) { - $this->execute(new ListGroupsCommand($testSuite), true); - } - - if ($cliConfiguration->listTests()) { - $this->execute(new ListTestsAsTextCommand($testSuite), true); - } - - if ($cliConfiguration->hasListTestsXml()) { - $this->execute( - new ListTestsAsXmlCommand( - $cliConfiguration->listTestsXml(), - $testSuite, - ), - true, - ); - } - } - - private function executeCommandsThatRequireCompleteConfiguration(Configuration $configuration, CliConfiguration $cliConfiguration): void - { - if ($cliConfiguration->listSuites()) { - $this->execute(new ListTestSuitesCommand($configuration->testSuite())); - } - - if ($cliConfiguration->warmCoverageCache()) { - $this->execute(new WarmCodeCoverageCacheCommand($configuration, CodeCoverageFilterRegistry::instance())); - } - } - - private function executeHelpCommandWhenThereIsNothingElseToDo(Configuration $configuration, TestSuite $testSuite): void - { - if ($testSuite->isEmpty() && !$configuration->hasCliArguments() && $configuration->testSuite()->isEmpty()) { - $this->execute(new ShowHelpCommand(Result::FAILURE)); - } - } - - private function writeRuntimeInformation(Printer $printer, Configuration $configuration): void - { - $printer->print(Version::getVersionString() . PHP_EOL . PHP_EOL); - - $runtime = 'PHP ' . PHP_VERSION; - - if (CodeCoverage::instance()->isActive()) { - $runtime .= ' with ' . CodeCoverage::instance()->driver()->nameAndVersion(); - } - - $this->writeMessage($printer, 'Runtime', $runtime); - - if ($configuration->hasConfigurationFile()) { - $this->writeMessage( - $printer, - 'Configuration', - $configuration->configurationFile(), - ); - } - } - - /** - * @psalm-param ?list $pharExtensions - */ - private function writePharExtensionInformation(Printer $printer, ?array $pharExtensions): void - { - if ($pharExtensions === null) { - return; - } - - foreach ($pharExtensions as $extension) { - $this->writeMessage( - $printer, - 'Extension', - $extension, - ); - } - } - - private function writeMessage(Printer $printer, string $type, string $message): void - { - $printer->print( - sprintf( - "%-15s%s\n", - $type . ':', - $message, - ), - ); - } - - private function writeRandomSeedInformation(Printer $printer, Configuration $configuration): void - { - if ($configuration->executionOrder() === TestSuiteSorter::ORDER_RANDOMIZED) { - $this->writeMessage( - $printer, - 'Random Seed', - (string) $configuration->randomOrderSeed(), - ); - } - } - - /** - * @throws EventFacadeIsSealedException - * @throws UnknownSubscriberTypeException - */ - private function registerLogfileWriters(Configuration $configuration): void - { - if ($configuration->hasLogEventsText()) { - if (is_file($configuration->logEventsText())) { - unlink($configuration->logEventsText()); - } - - EventFacade::instance()->registerTracer( - new EventLogger( - $configuration->logEventsText(), - false, - ), - ); - } - - if ($configuration->hasLogEventsVerboseText()) { - if (is_file($configuration->logEventsVerboseText())) { - unlink($configuration->logEventsVerboseText()); - } - - EventFacade::instance()->registerTracer( - new EventLogger( - $configuration->logEventsVerboseText(), - true, - ), - ); - - EventFacade::emitter()->exportObjects(); - } - - if ($configuration->hasLogfileJunit()) { - try { - new JunitXmlLogger( - OutputFacade::printerFor($configuration->logfileJunit()), - EventFacade::instance(), - ); - } catch (DirectoryDoesNotExistException|InvalidSocketException $e) { - EventFacade::emitter()->testRunnerTriggeredPhpunitWarning( - sprintf( - 'Cannot log test results in JUnit XML format to "%s": %s', - $configuration->logfileJunit(), - $e->getMessage(), - ), - ); - } - } - - if ($configuration->hasLogfileTeamcity()) { - try { - new TeamCityLogger( - DefaultPrinter::from( - $configuration->logfileTeamcity(), - ), - EventFacade::instance(), - ); - } catch (DirectoryDoesNotExistException|InvalidSocketException $e) { - EventFacade::emitter()->testRunnerTriggeredPhpunitWarning( - sprintf( - 'Cannot log test results in TeamCity format to "%s": %s', - $configuration->logfileTeamcity(), - $e->getMessage(), - ), - ); - } - } - } - - /** - * @throws EventFacadeIsSealedException - * @throws UnknownSubscriberTypeException - */ - private function testDoxResultCollector(Configuration $configuration): ?TestDoxResultCollector - { - if ($configuration->hasLogfileTestdoxHtml() || - $configuration->hasLogfileTestdoxText() || - $configuration->outputIsTestDox()) { - return new TestDoxResultCollector( - EventFacade::instance(), - $configuration->source(), - ); - } - - return null; - } - - /** - * @throws EventFacadeIsSealedException - * @throws UnknownSubscriberTypeException - */ - private function initializeTestResultCache(Configuration $configuration): ResultCache - { - if ($configuration->cacheResult()) { - $cache = new DefaultResultCache($configuration->testResultCacheFile()); - - new ResultCacheHandler($cache, EventFacade::instance()); - - return $cache; - } - - return new NullResultCache; - } - - /** - * @throws EventFacadeIsSealedException - * @throws UnknownSubscriberTypeException - */ - private function configureBaseline(Configuration $configuration): ?BaselineGenerator - { - if ($configuration->hasGenerateBaseline()) { - return new BaselineGenerator( - EventFacade::instance(), - $configuration->source(), - ); - } - - if ($configuration->source()->useBaseline()) { - /** @psalm-suppress MissingThrowsDocblock */ - $baselineFile = $configuration->source()->baseline(); - $baseline = null; - - try { - $baseline = (new Reader)->read($baselineFile); - } catch (CannotLoadBaselineException $e) { - EventFacade::emitter()->testRunnerTriggeredPhpunitWarning($e->getMessage()); - } - - if ($baseline !== null) { - ErrorHandler::instance()->use($baseline); - } - } - - return null; - } - - /** - * @codeCoverageIgnore - */ - private function exitWithCrashMessage(Throwable $t): never - { - $message = $t->getMessage(); - - if (empty(trim($message))) { - $message = '(no message)'; - } - - printf( - '%s%sAn error occurred inside PHPUnit.%s%sMessage: %s', - PHP_EOL, - PHP_EOL, - PHP_EOL, - PHP_EOL, - $message, - ); - - $first = true; - - if ($t->getPrevious()) { - $t = $t->getPrevious(); - } - - do { - printf( - '%s%s: %s:%d%s%s%s%s', - PHP_EOL, - $first ? 'Location' : 'Caused by', - $t->getFile(), - $t->getLine(), - PHP_EOL, - PHP_EOL, - $t->getTraceAsString(), - PHP_EOL, - ); - - $first = false; - } while ($t = $t->getPrevious()); - - exit(Result::CRASH); - } - - private function exitWithErrorMessage(string $message): never - { - print Version::getVersionString() . PHP_EOL . PHP_EOL . $message . PHP_EOL; - - exit(Result::EXCEPTION); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Command/Command.php b/vendor/phpunit/phpunit/src/TextUI/Command/Command.php deleted file mode 100644 index faa9ebc..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Command/Command.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Command; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This interface is not covered by the backward compatibility promise for PHPUnit - */ -interface Command -{ - public function execute(): Result; -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Command/Commands/AtLeastVersionCommand.php b/vendor/phpunit/phpunit/src/TextUI/Command/Commands/AtLeastVersionCommand.php deleted file mode 100644 index 06d7835..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Command/Commands/AtLeastVersionCommand.php +++ /dev/null @@ -1,37 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Command; - -use function version_compare; -use PHPUnit\Runner\Version; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class AtLeastVersionCommand implements Command -{ - private readonly string $version; - - public function __construct(string $version) - { - $this->version = $version; - } - - public function execute(): Result - { - if (version_compare(Version::id(), $this->version, '>=')) { - return Result::from(); - } - - return Result::from('', Result::FAILURE); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Command/Commands/CheckPhpConfigurationCommand.php b/vendor/phpunit/phpunit/src/TextUI/Command/Commands/CheckPhpConfigurationCommand.php deleted file mode 100644 index c6316d7..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Command/Commands/CheckPhpConfigurationCommand.php +++ /dev/null @@ -1,166 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Command; - -use const E_ALL; -use const PHP_EOL; -use function extension_loaded; -use function in_array; -use function ini_get; -use function max; -use function sprintf; -use function strlen; -use PHPUnit\Runner\Version; -use PHPUnit\Util\Color; -use SebastianBergmann\Environment\Console; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class CheckPhpConfigurationCommand implements Command -{ - private readonly bool $colorize; - - public function __construct() - { - $this->colorize = (new Console)->hasColorSupport(); - } - - public function execute(): Result - { - $lines = []; - $shellExitCode = 0; - - foreach ($this->settings() as $name => $setting) { - foreach ($setting['requiredExtensions'] as $extension) { - if (!extension_loaded($extension)) { - // @codeCoverageIgnoreStart - continue 2; - // @codeCoverageIgnoreEnd - } - } - - $actualValue = ini_get($name); - - if (in_array($actualValue, $setting['expectedValues'], true)) { - $check = $this->ok(); - } else { - $check = $this->notOk($actualValue); - $shellExitCode = 1; - } - - $lines[] = [ - sprintf( - '%s = %s', - $name, - $setting['valueForConfiguration'], - ), - $check, - ]; - } - - $maxLength = 0; - - foreach ($lines as $line) { - $maxLength = max($maxLength, strlen($line[0])); - } - - $buffer = sprintf( - 'Checking whether PHP is configured according to https://docs.phpunit.de/en/%s/installation.html#configuring-php-for-development' . PHP_EOL . PHP_EOL, - Version::series(), - ); - - foreach ($lines as $line) { - $buffer .= sprintf( - '%-' . $maxLength . 's ... %s' . PHP_EOL, - $line[0], - $line[1], - ); - } - - return Result::from($buffer, $shellExitCode); - } - - /** - * @return non-empty-string - */ - private function ok(): string - { - if (!$this->colorize) { - return 'ok'; - } - - // @codeCoverageIgnoreStart - return Color::colorizeTextBox('fg-green, bold', 'ok'); - // @codeCoverageIgnoreEnd - } - - /** - * @return non-empty-string - */ - private function notOk(string $actualValue): string - { - $message = sprintf('not ok (%s)', $actualValue); - - if (!$this->colorize) { - return $message; - } - - // @codeCoverageIgnoreStart - return Color::colorizeTextBox('fg-red, bold', $message); - // @codeCoverageIgnoreEnd - } - - /** - * @return non-empty-array, valueForConfiguration: non-empty-string, requiredExtensions: list}> - */ - private function settings(): array - { - return [ - 'display_errors' => [ - 'expectedValues' => ['1'], - 'valueForConfiguration' => 'On', - 'requiredExtensions' => [], - ], - 'display_startup_errors' => [ - 'expectedValues' => ['1'], - 'valueForConfiguration' => 'On', - 'requiredExtensions' => [], - ], - 'error_reporting' => [ - 'expectedValues' => ['-1', (string) E_ALL], - 'valueForConfiguration' => '-1', - 'requiredExtensions' => [], - ], - 'xdebug.show_exception_trace' => [ - 'expectedValues' => ['0'], - 'valueForConfiguration' => '0', - 'requiredExtensions' => ['xdebug'], - ], - 'zend.assertions' => [ - 'expectedValues' => ['1'], - 'valueForConfiguration' => '1', - 'requiredExtensions' => [], - ], - 'assert.exception' => [ - 'expectedValues' => ['1'], - 'valueForConfiguration' => '1', - 'requiredExtensions' => [], - ], - 'memory_limit' => [ - 'expectedValues' => ['-1'], - 'valueForConfiguration' => '-1', - 'requiredExtensions' => [], - ], - ]; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Command/Commands/GenerateConfigurationCommand.php b/vendor/phpunit/phpunit/src/TextUI/Command/Commands/GenerateConfigurationCommand.php deleted file mode 100644 index b71d8b0..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Command/Commands/GenerateConfigurationCommand.php +++ /dev/null @@ -1,103 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Command; - -use const PHP_EOL; -use const STDIN; -use function fgets; -use function file_put_contents; -use function getcwd; -use function sprintf; -use function trim; -use PHPUnit\Runner\Version; -use PHPUnit\TextUI\XmlConfiguration\Generator; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class GenerateConfigurationCommand implements Command -{ - public function execute(): Result - { - print 'Generating phpunit.xml in ' . getcwd() . PHP_EOL . PHP_EOL; - print 'Bootstrap script (relative to path shown above; default: vendor/autoload.php): '; - - $bootstrapScript = $this->read(); - - print 'Tests directory (relative to path shown above; default: tests): '; - - $testsDirectory = $this->read(); - - print 'Source directory (relative to path shown above; default: src): '; - - $src = $this->read(); - - print 'Cache directory (relative to path shown above; default: .phpunit.cache): '; - - $cacheDirectory = $this->read(); - - if ($bootstrapScript === '') { - $bootstrapScript = 'vendor/autoload.php'; - } - - if ($testsDirectory === '') { - $testsDirectory = 'tests'; - } - - if ($src === '') { - $src = 'src'; - } - - if ($cacheDirectory === '') { - $cacheDirectory = '.phpunit.cache'; - } - - $generator = new Generator; - - $result = @file_put_contents( - 'phpunit.xml', - $generator->generateDefaultConfiguration( - Version::series(), - $bootstrapScript, - $testsDirectory, - $src, - $cacheDirectory, - ), - ); - - if ($result !== false) { - return Result::from( - sprintf( - PHP_EOL . 'Generated phpunit.xml in %s.' . PHP_EOL . - 'Make sure to exclude the %s directory from version control.' . PHP_EOL, - getcwd(), - $cacheDirectory, - ), - ); - } - - // @codeCoverageIgnoreStart - return Result::from( - sprintf( - PHP_EOL . 'Could not write phpunit.xml in %s.' . PHP_EOL, - getcwd(), - ), - Result::EXCEPTION, - ); - // @codeCoverageIgnoreEnd - } - - private function read(): string - { - return trim(fgets(STDIN)); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Command/Commands/ListGroupsCommand.php b/vendor/phpunit/phpunit/src/TextUI/Command/Commands/ListGroupsCommand.php deleted file mode 100644 index f5f0fac..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Command/Commands/ListGroupsCommand.php +++ /dev/null @@ -1,83 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Command; - -use const PHP_EOL; -use function sort; -use function sprintf; -use function str_starts_with; -use PHPUnit\Framework\TestSuite; -use PHPUnit\TextUI\Configuration\Registry; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ListGroupsCommand implements Command -{ - private readonly TestSuite $suite; - - public function __construct(TestSuite $suite) - { - $this->suite = $suite; - } - - public function execute(): Result - { - $buffer = $this->warnAboutConflictingOptions(); - $buffer .= 'Available test group(s):' . PHP_EOL; - - $groups = $this->suite->groups(); - sort($groups); - - foreach ($groups as $group) { - if (str_starts_with($group, '__phpunit_')) { - continue; - } - - $buffer .= sprintf( - ' - %s' . PHP_EOL, - $group, - ); - } - - return Result::from($buffer); - } - - private function warnAboutConflictingOptions(): string - { - $buffer = ''; - - $configuration = Registry::get(); - - if ($configuration->hasFilter()) { - $buffer .= 'The --filter and --list-groups options cannot be combined, --filter is ignored' . PHP_EOL; - } - - if ($configuration->hasGroups()) { - $buffer .= 'The --group and --list-groups options cannot be combined, --group is ignored' . PHP_EOL; - } - - if ($configuration->hasExcludeGroups()) { - $buffer .= 'The --exclude-group and --list-groups options cannot be combined, --exclude-group is ignored' . PHP_EOL; - } - - if ($configuration->includeTestSuite() !== '') { - $buffer .= 'The --testsuite and --list-groups options cannot be combined, --exclude-group is ignored' . PHP_EOL; - } - - if (!empty($buffer)) { - $buffer .= PHP_EOL; - } - - return $buffer; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Command/Commands/ListTestSuitesCommand.php b/vendor/phpunit/phpunit/src/TextUI/Command/Commands/ListTestSuitesCommand.php deleted file mode 100644 index 44aead5..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Command/Commands/ListTestSuitesCommand.php +++ /dev/null @@ -1,74 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Command; - -use const PHP_EOL; -use function sprintf; -use PHPUnit\TextUI\Configuration\Registry; -use PHPUnit\TextUI\Configuration\TestSuiteCollection; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ListTestSuitesCommand implements Command -{ - private readonly TestSuiteCollection $suites; - - public function __construct(TestSuiteCollection $suites) - { - $this->suites = $suites; - } - - public function execute(): Result - { - $buffer = $this->warnAboutConflictingOptions(); - $buffer .= 'Available test suite(s):' . PHP_EOL; - - foreach ($this->suites as $suite) { - $buffer .= sprintf( - ' - %s' . PHP_EOL, - $suite->name(), - ); - } - - return Result::from($buffer); - } - - private function warnAboutConflictingOptions(): string - { - $buffer = ''; - - $configuration = Registry::get(); - - if ($configuration->hasFilter()) { - $buffer .= 'The --filter and --list-suites options cannot be combined, --filter is ignored' . PHP_EOL; - } - - if ($configuration->hasGroups()) { - $buffer .= 'The --group and --list-suites options cannot be combined, --group is ignored' . PHP_EOL; - } - - if ($configuration->hasExcludeGroups()) { - $buffer .= 'The --exclude-group and --list-suites options cannot be combined, --exclude-group is ignored' . PHP_EOL; - } - - if ($configuration->includeTestSuite() !== '') { - $buffer .= 'The --testsuite and --list-suites options cannot be combined, --testsuite is ignored' . PHP_EOL; - } - - if (!empty($buffer)) { - $buffer .= PHP_EOL; - } - - return $buffer; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Command/Commands/ListTestsAsTextCommand.php b/vendor/phpunit/phpunit/src/TextUI/Command/Commands/ListTestsAsTextCommand.php deleted file mode 100644 index 0d37701..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Command/Commands/ListTestsAsTextCommand.php +++ /dev/null @@ -1,87 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Command; - -use const PHP_EOL; -use function sprintf; -use function str_replace; -use PHPUnit\Framework\TestCase; -use PHPUnit\Framework\TestSuite; -use PHPUnit\Runner\PhptTestCase; -use PHPUnit\TextUI\Configuration\Registry; -use RecursiveIteratorIterator; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ListTestsAsTextCommand implements Command -{ - private readonly TestSuite $suite; - - public function __construct(TestSuite $suite) - { - $this->suite = $suite; - } - - public function execute(): Result - { - $buffer = $this->warnAboutConflictingOptions(); - - $buffer .= 'Available test(s):' . PHP_EOL; - - foreach (new RecursiveIteratorIterator($this->suite) as $test) { - if ($test instanceof TestCase) { - $name = sprintf( - '%s::%s', - $test::class, - str_replace(' with data set ', '', $test->nameWithDataSet()), - ); - } elseif ($test instanceof PhptTestCase) { - $name = $test->getName(); - } else { - continue; - } - - $buffer .= sprintf( - ' - %s' . PHP_EOL, - $name, - ); - } - - return Result::from($buffer); - } - - private function warnAboutConflictingOptions(): string - { - $buffer = ''; - - $configuration = Registry::get(); - - if ($configuration->hasFilter()) { - $buffer .= 'The --filter and --list-tests options cannot be combined, --filter is ignored' . PHP_EOL; - } - - if ($configuration->hasGroups()) { - $buffer .= 'The --group and --list-tests options cannot be combined, --group is ignored' . PHP_EOL; - } - - if ($configuration->hasExcludeGroups()) { - $buffer .= 'The --exclude-group and --list-tests options cannot be combined, --exclude-group is ignored' . PHP_EOL; - } - - if (!empty($buffer)) { - $buffer .= PHP_EOL; - } - - return $buffer; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Command/Commands/ListTestsAsXmlCommand.php b/vendor/phpunit/phpunit/src/TextUI/Command/Commands/ListTestsAsXmlCommand.php deleted file mode 100644 index 5a1085f..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Command/Commands/ListTestsAsXmlCommand.php +++ /dev/null @@ -1,142 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Command; - -use const PHP_EOL; -use function file_put_contents; -use function implode; -use function sprintf; -use function str_replace; -use PHPUnit\Framework\TestCase; -use PHPUnit\Framework\TestSuite; -use PHPUnit\Runner\PhptTestCase; -use PHPUnit\TextUI\Configuration\Registry; -use RecursiveIteratorIterator; -use XMLWriter; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ListTestsAsXmlCommand implements Command -{ - private readonly string $filename; - private readonly TestSuite $suite; - - public function __construct(string $filename, TestSuite $suite) - { - $this->filename = $filename; - $this->suite = $suite; - } - - public function execute(): Result - { - $buffer = $this->warnAboutConflictingOptions(); - $writer = new XMLWriter; - - $writer->openMemory(); - $writer->setIndent(true); - $writer->startDocument(); - $writer->startElement('tests'); - - $currentTestCase = null; - - foreach (new RecursiveIteratorIterator($this->suite) as $test) { - if ($test instanceof TestCase) { - if ($test::class !== $currentTestCase) { - if ($currentTestCase !== null) { - $writer->endElement(); - } - - $writer->startElement('testCaseClass'); - $writer->writeAttribute('name', $test::class); - - $currentTestCase = $test::class; - } - - $writer->startElement('testCaseMethod'); - $writer->writeAttribute('id', $test->valueObjectForEvents()->id()); - $writer->writeAttribute('name', $test->name()); - $writer->writeAttribute('groups', implode(',', $test->groups())); - - /** - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5481 - */ - if (!empty($test->dataSetAsString())) { - $writer->writeAttribute( - 'dataSet', - str_replace( - ' with data set ', - '', - $test->dataSetAsString(), - ), - ); - } - - $writer->endElement(); - - continue; - } - - if ($test instanceof PhptTestCase) { - if ($currentTestCase !== null) { - $writer->endElement(); - - $currentTestCase = null; - } - - $writer->startElement('phptFile'); - $writer->writeAttribute('path', $test->getName()); - $writer->endElement(); - } - } - - if ($currentTestCase !== null) { - $writer->endElement(); - } - - $writer->endElement(); - - file_put_contents($this->filename, $writer->outputMemory()); - - $buffer .= sprintf( - 'Wrote list of tests that would have been run to %s' . PHP_EOL, - $this->filename, - ); - - return Result::from($buffer); - } - - private function warnAboutConflictingOptions(): string - { - $buffer = ''; - - $configuration = Registry::get(); - - if ($configuration->hasFilter()) { - $buffer .= 'The --filter and --list-tests-xml options cannot be combined, --filter is ignored' . PHP_EOL; - } - - if ($configuration->hasGroups()) { - $buffer .= 'The --group and --list-tests-xml options cannot be combined, --group is ignored' . PHP_EOL; - } - - if ($configuration->hasExcludeGroups()) { - $buffer .= 'The --exclude-group and --list-tests-xml options cannot be combined, --exclude-group is ignored' . PHP_EOL; - } - - if (!empty($buffer)) { - $buffer .= PHP_EOL; - } - - return $buffer; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Command/Commands/MigrateConfigurationCommand.php b/vendor/phpunit/phpunit/src/TextUI/Command/Commands/MigrateConfigurationCommand.php deleted file mode 100644 index cde391a..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Command/Commands/MigrateConfigurationCommand.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Command; - -use const PHP_EOL; -use function copy; -use function file_put_contents; -use function sprintf; -use PHPUnit\TextUI\XmlConfiguration\Migrator; -use Throwable; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class MigrateConfigurationCommand implements Command -{ - private readonly string $filename; - - public function __construct(string $filename) - { - $this->filename = $filename; - } - - public function execute(): Result - { - try { - $migrated = (new Migrator)->migrate($this->filename); - - copy($this->filename, $this->filename . '.bak'); - - file_put_contents($this->filename, $migrated); - - return Result::from( - sprintf( - 'Created backup: %s.bak%sMigrated configuration: %s%s', - $this->filename, - PHP_EOL, - $this->filename, - PHP_EOL, - ), - ); - } catch (Throwable $t) { - return Result::from( - sprintf( - 'Migration of %s failed:%s%s%s', - $this->filename, - PHP_EOL, - $t->getMessage(), - PHP_EOL, - ), - Result::FAILURE, - ); - } - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Command/Commands/ShowHelpCommand.php b/vendor/phpunit/phpunit/src/TextUI/Command/Commands/ShowHelpCommand.php deleted file mode 100644 index 654cbb8..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Command/Commands/ShowHelpCommand.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Command; - -use PHPUnit\TextUI\Help; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ShowHelpCommand implements Command -{ - private readonly int $shellExitCode; - - public function __construct(int $shellExitCode) - { - $this->shellExitCode = $shellExitCode; - } - - public function execute(): Result - { - return Result::from( - (new Help)->generate(), - $this->shellExitCode, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Command/Commands/ShowVersionCommand.php b/vendor/phpunit/phpunit/src/TextUI/Command/Commands/ShowVersionCommand.php deleted file mode 100644 index b1e6651..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Command/Commands/ShowVersionCommand.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Command; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ShowVersionCommand implements Command -{ - public function execute(): Result - { - return Result::from(); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Command/Commands/VersionCheckCommand.php b/vendor/phpunit/phpunit/src/TextUI/Command/Commands/VersionCheckCommand.php deleted file mode 100644 index 95dabba..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Command/Commands/VersionCheckCommand.php +++ /dev/null @@ -1,74 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Command; - -use const PHP_EOL; -use function assert; -use function sprintf; -use function version_compare; -use PHPUnit\Util\Http\Downloader; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class VersionCheckCommand implements Command -{ - private readonly Downloader $downloader; - private readonly int $majorVersionNumber; - private readonly string $versionId; - - public function __construct(Downloader $downloader, int $majorVersionNumber, string $versionId) - { - $this->downloader = $downloader; - $this->majorVersionNumber = $majorVersionNumber; - $this->versionId = $versionId; - } - - public function execute(): Result - { - $latestVersion = $this->downloader->download('https://phar.phpunit.de/latest-version-of/phpunit'); - - assert($latestVersion !== false); - - $latestCompatibleVersion = $this->downloader->download('https://phar.phpunit.de/latest-version-of/phpunit-' . $this->majorVersionNumber); - - assert($latestCompatibleVersion !== false); - - $notLatest = version_compare($latestVersion, $this->versionId, '>'); - $notLatestCompatible = version_compare($latestCompatibleVersion, $this->versionId, '>'); - - if (!$notLatest && !$notLatestCompatible) { - return Result::from( - 'You are using the latest version of PHPUnit.' . PHP_EOL, - ); - } - - $buffer = 'You are not using the latest version of PHPUnit.' . PHP_EOL; - - if ($notLatestCompatible) { - $buffer .= sprintf( - 'The latest version compatible with PHPUnit %s is PHPUnit %s.' . PHP_EOL, - $this->versionId, - $latestCompatibleVersion, - ); - } - - if ($notLatest) { - $buffer .= sprintf( - 'The latest version is PHPUnit %s.' . PHP_EOL, - $latestVersion, - ); - } - - return Result::from($buffer); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Command/Commands/WarmCodeCoverageCacheCommand.php b/vendor/phpunit/phpunit/src/TextUI/Command/Commands/WarmCodeCoverageCacheCommand.php deleted file mode 100644 index fa8256e..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Command/Commands/WarmCodeCoverageCacheCommand.php +++ /dev/null @@ -1,81 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Command; - -use const PHP_EOL; -use function printf; -use PHPUnit\TextUI\Configuration\CodeCoverageFilterRegistry; -use PHPUnit\TextUI\Configuration\Configuration; -use PHPUnit\TextUI\Configuration\NoCoverageCacheDirectoryException; -use SebastianBergmann\CodeCoverage\StaticAnalysis\CacheWarmer; -use SebastianBergmann\Timer\NoActiveTimerException; -use SebastianBergmann\Timer\Timer; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @codeCoverageIgnore - */ -final class WarmCodeCoverageCacheCommand implements Command -{ - private readonly Configuration $configuration; - private readonly CodeCoverageFilterRegistry $codeCoverageFilterRegistry; - - public function __construct(Configuration $configuration, CodeCoverageFilterRegistry $codeCoverageFilterRegistry) - { - $this->configuration = $configuration; - $this->codeCoverageFilterRegistry = $codeCoverageFilterRegistry; - } - - /** - * @throws NoActiveTimerException - * @throws NoCoverageCacheDirectoryException - */ - public function execute(): Result - { - if (!$this->configuration->hasCoverageCacheDirectory()) { - return Result::from( - 'Cache for static analysis has not been configured' . PHP_EOL, - Result::FAILURE, - ); - } - - $this->codeCoverageFilterRegistry->init($this->configuration, true); - - if (!$this->codeCoverageFilterRegistry->configured()) { - return Result::from( - 'Filter for code coverage has not been configured' . PHP_EOL, - Result::FAILURE, - ); - } - - $timer = new Timer; - $timer->start(); - - print 'Warming cache for static analysis ... '; - - (new CacheWarmer)->warmCache( - $this->configuration->coverageCacheDirectory(), - !$this->configuration->disableCodeCoverageIgnore(), - $this->configuration->ignoreDeprecatedCodeUnitsFromCodeCoverage(), - $this->codeCoverageFilterRegistry->get(), - ); - - printf( - '[%s]%s', - $timer->stop()->asString(), - PHP_EOL, - ); - - return Result::from(); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Command/Result.php b/vendor/phpunit/phpunit/src/TextUI/Command/Result.php deleted file mode 100644 index b0544e7..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Command/Result.php +++ /dev/null @@ -1,48 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Command; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Result -{ - public const SUCCESS = 0; - public const FAILURE = 1; - public const EXCEPTION = 2; - public const CRASH = 255; - private readonly string $output; - private readonly int $shellExitCode; - - public static function from(string $output = '', int $shellExitCode = self::SUCCESS): self - { - return new self($output, $shellExitCode); - } - - private function __construct(string $output, int $shellExitCode) - { - $this->output = $output; - $this->shellExitCode = $shellExitCode; - } - - public function output(): string - { - return $this->output; - } - - public function shellExitCode(): int - { - return $this->shellExitCode; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Builder.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Builder.php deleted file mode 100644 index 6ada9b4..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Builder.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use PHPUnit\TextUI\CliArguments\Builder as CliConfigurationBuilder; -use PHPUnit\TextUI\CliArguments\Exception as CliConfigurationException; -use PHPUnit\TextUI\CliArguments\XmlConfigurationFileFinder; -use PHPUnit\TextUI\XmlConfiguration\DefaultConfiguration; -use PHPUnit\TextUI\XmlConfiguration\Exception as XmlConfigurationException; -use PHPUnit\TextUI\XmlConfiguration\Loader; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @codeCoverageIgnore - */ -final class Builder -{ - /** - * @throws ConfigurationCannotBeBuiltException - */ - public function build(array $argv): Configuration - { - try { - $cliConfiguration = (new CliConfigurationBuilder)->fromParameters($argv); - $configurationFile = (new XmlConfigurationFileFinder)->find($cliConfiguration); - $xmlConfiguration = DefaultConfiguration::create(); - - if ($configurationFile !== false) { - $xmlConfiguration = (new Loader)->load($configurationFile); - } - - return Registry::init( - $cliConfiguration, - $xmlConfiguration, - ); - } catch (CliConfigurationException|XmlConfigurationException $e) { - throw new ConfigurationCannotBeBuiltException( - $e->getMessage(), - $e->getCode(), - $e, - ); - } - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Cli/Builder.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Cli/Builder.php deleted file mode 100644 index 17559f7..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Cli/Builder.php +++ /dev/null @@ -1,1252 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\CliArguments; - -use const DIRECTORY_SEPARATOR; -use function array_map; -use function basename; -use function explode; -use function getcwd; -use function is_file; -use function is_numeric; -use function sprintf; -use PHPUnit\Event\Facade as EventFacade; -use PHPUnit\Runner\TestSuiteSorter; -use PHPUnit\Util\Filesystem; -use SebastianBergmann\CliParser\Exception as CliParserException; -use SebastianBergmann\CliParser\Parser as CliParser; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Builder -{ - private const LONG_OPTIONS = [ - 'atleast-version=', - 'bootstrap=', - 'cache-result', - 'do-not-cache-result', - 'cache-directory=', - 'cache-result-file=', - 'check-version', - 'check-php-configuration', - 'colors==', - 'columns=', - 'configuration=', - 'coverage-cache=', - 'warm-coverage-cache', - 'coverage-filter=', - 'coverage-clover=', - 'coverage-cobertura=', - 'coverage-crap4j=', - 'coverage-html=', - 'coverage-php=', - 'coverage-text==', - 'only-summary-for-coverage-text', - 'show-uncovered-for-coverage-text', - 'coverage-xml=', - 'path-coverage', - 'disallow-test-output', - 'display-all-issues', - 'display-incomplete', - 'display-skipped', - 'display-deprecations', - 'display-phpunit-deprecations', - 'display-errors', - 'display-notices', - 'display-warnings', - 'default-time-limit=', - 'enforce-time-limit', - 'exclude-group=', - 'filter=', - 'generate-baseline=', - 'use-baseline=', - 'ignore-baseline', - 'generate-configuration', - 'globals-backup', - 'group=', - 'covers=', - 'uses=', - 'help', - 'resolve-dependencies', - 'ignore-dependencies', - 'include-path=', - 'list-groups', - 'list-suites', - 'list-tests', - 'list-tests-xml=', - 'log-junit=', - 'log-teamcity=', - 'migrate-configuration', - 'no-configuration', - 'no-coverage', - 'no-logging', - 'no-extensions', - 'no-output', - 'no-progress', - 'no-results', - 'order-by=', - 'process-isolation', - 'do-not-report-useless-tests', - 'dont-report-useless-tests', - 'random-order', - 'random-order-seed=', - 'reverse-order', - 'reverse-list', - 'static-backup', - 'stderr', - 'fail-on-all-issues', - 'fail-on-deprecation', - 'fail-on-phpunit-deprecation', - 'fail-on-phpunit-warning', - 'fail-on-empty-test-suite', - 'fail-on-incomplete', - 'fail-on-notice', - 'fail-on-risky', - 'fail-on-skipped', - 'fail-on-warning', - 'do-not-fail-on-deprecation', - 'do-not-fail-on-phpunit-deprecation', - 'do-not-fail-on-phpunit-warning', - 'do-not-fail-on-empty-test-suite', - 'do-not-fail-on-incomplete', - 'do-not-fail-on-notice', - 'do-not-fail-on-risky', - 'do-not-fail-on-skipped', - 'do-not-fail-on-warning', - 'stop-on-defect', - 'stop-on-deprecation', - 'stop-on-error', - 'stop-on-failure', - 'stop-on-incomplete', - 'stop-on-notice', - 'stop-on-risky', - 'stop-on-skipped', - 'stop-on-warning', - 'strict-coverage', - 'disable-coverage-ignore', - 'strict-global-state', - 'teamcity', - 'testdox', - 'testdox-html=', - 'testdox-text=', - 'test-suffix=', - 'testsuite=', - 'exclude-testsuite=', - 'log-events-text=', - 'log-events-verbose-text=', - 'version', - 'debug', - ]; - private const SHORT_OPTIONS = 'd:c:h'; - - /** - * @psalm-var array - */ - private array $processed = []; - - /** - * @throws Exception - */ - public function fromParameters(array $parameters): Configuration - { - try { - $options = (new CliParser)->parse( - $parameters, - self::SHORT_OPTIONS, - self::LONG_OPTIONS, - ); - } catch (CliParserException $e) { - throw new Exception( - $e->getMessage(), - $e->getCode(), - $e, - ); - } - - $atLeastVersion = null; - $backupGlobals = null; - $backupStaticProperties = null; - $beStrictAboutChangesToGlobalState = null; - $bootstrap = null; - $cacheDirectory = null; - $cacheResult = null; - $cacheResultFile = null; - $checkPhpConfiguration = false; - $checkVersion = false; - $colors = null; - $columns = null; - $configuration = null; - $coverageCacheDirectory = null; - $warmCoverageCache = false; - $coverageFilter = null; - $coverageClover = null; - $coverageCobertura = null; - $coverageCrap4J = null; - $coverageHtml = null; - $coveragePhp = null; - $coverageText = null; - $coverageTextShowUncoveredFiles = null; - $coverageTextShowOnlySummary = null; - $coverageXml = null; - $pathCoverage = null; - $defaultTimeLimit = null; - $disableCodeCoverageIgnore = null; - $disallowTestOutput = null; - $displayAllIssues = null; - $displayIncomplete = null; - $displaySkipped = null; - $displayDeprecations = null; - $displayPhpunitDeprecations = null; - $displayErrors = null; - $displayNotices = null; - $displayWarnings = null; - $enforceTimeLimit = null; - $excludeGroups = null; - $executionOrder = null; - $executionOrderDefects = null; - $failOnAllIssues = null; - $failOnDeprecation = null; - $failOnPhpunitDeprecation = null; - $failOnPhpunitWarning = null; - $failOnEmptyTestSuite = null; - $failOnIncomplete = null; - $failOnNotice = null; - $failOnRisky = null; - $failOnSkipped = null; - $failOnWarning = null; - $doNotFailOnDeprecation = null; - $doNotFailOnPhpunitDeprecation = null; - $doNotFailOnPhpunitWarning = null; - $doNotFailOnEmptyTestSuite = null; - $doNotFailOnIncomplete = null; - $doNotFailOnNotice = null; - $doNotFailOnRisky = null; - $doNotFailOnSkipped = null; - $doNotFailOnWarning = null; - $stopOnDefect = null; - $stopOnDeprecation = null; - $stopOnError = null; - $stopOnFailure = null; - $stopOnIncomplete = null; - $stopOnNotice = null; - $stopOnRisky = null; - $stopOnSkipped = null; - $stopOnWarning = null; - $filter = null; - $generateBaseline = null; - $useBaseline = null; - $ignoreBaseline = false; - $generateConfiguration = false; - $migrateConfiguration = false; - $groups = null; - $testsCovering = null; - $testsUsing = null; - $help = false; - $includePath = null; - $iniSettings = []; - $junitLogfile = null; - $listGroups = false; - $listSuites = false; - $listTests = false; - $listTestsXml = null; - $noCoverage = null; - $noExtensions = null; - $noOutput = null; - $noProgress = null; - $noResults = null; - $noLogging = null; - $processIsolation = null; - $randomOrderSeed = null; - $reportUselessTests = null; - $resolveDependencies = null; - $reverseList = null; - $stderr = null; - $strictCoverage = null; - $teamcityLogfile = null; - $testdoxHtmlFile = null; - $testdoxTextFile = null; - $testSuffixes = null; - $testSuite = null; - $excludeTestSuite = null; - $useDefaultConfiguration = true; - $version = false; - $logEventsText = null; - $logEventsVerboseText = null; - $printerTeamCity = null; - $printerTestDox = null; - $debug = false; - - foreach ($options[0] as $option) { - $optionAllowedMultipleTimes = false; - - switch ($option[0]) { - case '--colors': - $colors = $option[1] ?: \PHPUnit\TextUI\Configuration\Configuration::COLOR_AUTO; - - break; - - case '--bootstrap': - $bootstrap = $option[1]; - - break; - - case '--cache-directory': - $cacheDirectory = $option[1]; - - break; - - case '--cache-result': - $cacheResult = true; - - break; - - case '--do-not-cache-result': - $cacheResult = false; - - break; - - case '--cache-result-file': - $cacheResultFile = $option[1]; - - break; - - case '--columns': - if (is_numeric($option[1])) { - $columns = (int) $option[1]; - } elseif ($option[1] === 'max') { - $columns = 'max'; - } - - break; - - case 'c': - case '--configuration': - $configuration = $option[1]; - - break; - - case '--coverage-cache': - $coverageCacheDirectory = $option[1]; - - break; - - case '--warm-coverage-cache': - $warmCoverageCache = true; - - break; - - case '--coverage-clover': - $coverageClover = $option[1]; - - break; - - case '--coverage-cobertura': - $coverageCobertura = $option[1]; - - break; - - case '--coverage-crap4j': - $coverageCrap4J = $option[1]; - - break; - - case '--coverage-html': - $coverageHtml = $option[1]; - - break; - - case '--coverage-php': - $coveragePhp = $option[1]; - - break; - - case '--coverage-text': - if ($option[1] === null) { - $option[1] = 'php://stdout'; - } - - $coverageText = $option[1]; - - break; - - case '--only-summary-for-coverage-text': - $coverageTextShowOnlySummary = true; - - break; - - case '--show-uncovered-for-coverage-text': - $coverageTextShowUncoveredFiles = true; - - break; - - case '--coverage-xml': - $coverageXml = $option[1]; - - break; - - case '--path-coverage': - $pathCoverage = true; - - break; - - case 'd': - $tmp = explode('=', $option[1]); - - if (isset($tmp[0])) { - if (isset($tmp[1])) { - $iniSettings[$tmp[0]] = $tmp[1]; - } else { - $iniSettings[$tmp[0]] = '1'; - } - } - - $optionAllowedMultipleTimes = true; - - break; - - case 'h': - case '--help': - $help = true; - - break; - - case '--filter': - $filter = $option[1]; - - break; - - case '--testsuite': - $testSuite = $option[1]; - - break; - - case '--exclude-testsuite': - $excludeTestSuite = $option[1]; - - break; - - case '--generate-baseline': - $generateBaseline = $option[1]; - - if (basename($generateBaseline) === $generateBaseline) { - $generateBaseline = getcwd() . DIRECTORY_SEPARATOR . $generateBaseline; - } - - break; - - case '--use-baseline': - $useBaseline = $option[1]; - - if (basename($useBaseline) === $useBaseline && !is_file($useBaseline)) { - $useBaseline = getcwd() . DIRECTORY_SEPARATOR . $useBaseline; - } - - break; - - case '--ignore-baseline': - $ignoreBaseline = true; - - break; - - case '--generate-configuration': - $generateConfiguration = true; - - break; - - case '--migrate-configuration': - $migrateConfiguration = true; - - break; - - case '--group': - $groups = explode(',', $option[1]); - - break; - - case '--exclude-group': - $excludeGroups = explode(',', $option[1]); - - break; - - case '--covers': - $testsCovering = array_map('strtolower', explode(',', $option[1])); - - break; - - case '--uses': - $testsUsing = array_map('strtolower', explode(',', $option[1])); - - break; - - case '--test-suffix': - $testSuffixes = explode(',', $option[1]); - - break; - - case '--include-path': - $includePath = $option[1]; - - break; - - case '--list-groups': - $listGroups = true; - - break; - - case '--list-suites': - $listSuites = true; - - break; - - case '--list-tests': - $listTests = true; - - break; - - case '--list-tests-xml': - $listTestsXml = $option[1]; - - break; - - case '--log-junit': - $junitLogfile = $option[1]; - - break; - - case '--log-teamcity': - $teamcityLogfile = $option[1]; - - break; - - case '--order-by': - foreach (explode(',', $option[1]) as $order) { - switch ($order) { - case 'default': - $executionOrder = TestSuiteSorter::ORDER_DEFAULT; - $executionOrderDefects = TestSuiteSorter::ORDER_DEFAULT; - $resolveDependencies = true; - - break; - - case 'defects': - $executionOrderDefects = TestSuiteSorter::ORDER_DEFECTS_FIRST; - - break; - - case 'depends': - $resolveDependencies = true; - - break; - - case 'duration': - $executionOrder = TestSuiteSorter::ORDER_DURATION; - - break; - - case 'no-depends': - $resolveDependencies = false; - - break; - - case 'random': - $executionOrder = TestSuiteSorter::ORDER_RANDOMIZED; - - break; - - case 'reverse': - $executionOrder = TestSuiteSorter::ORDER_REVERSED; - - break; - - case 'size': - $executionOrder = TestSuiteSorter::ORDER_SIZE; - - break; - - default: - throw new Exception( - sprintf( - 'unrecognized --order-by option: %s', - $order, - ), - ); - } - } - - break; - - case '--process-isolation': - $processIsolation = true; - - break; - - case '--stderr': - $stderr = true; - - break; - - case '--fail-on-all-issues': - $failOnAllIssues = true; - - break; - - case '--fail-on-deprecation': - $this->warnWhenOptionsConflict( - $doNotFailOnDeprecation, - '--fail-on-deprecation', - '--do-not-fail-on-deprecation', - ); - - $failOnDeprecation = true; - - break; - - case '--fail-on-phpunit-deprecation': - $this->warnWhenOptionsConflict( - $doNotFailOnPhpunitDeprecation, - '--fail-on-phpunit-deprecation', - '--do-not-fail-on-phpunit-deprecation', - ); - - $failOnPhpunitDeprecation = true; - - break; - - case '--fail-on-phpunit-warning': - $this->warnWhenOptionsConflict( - $doNotFailOnPhpunitWarning, - '--fail-on-phpunit-warning', - '--do-not-fail-on-phpunit-warning', - ); - - $failOnPhpunitWarning = true; - - break; - - case '--fail-on-empty-test-suite': - $this->warnWhenOptionsConflict( - $doNotFailOnEmptyTestSuite, - '--fail-on-empty-test-suite', - '--do-not-fail-on-empty-test-suite', - ); - - $failOnEmptyTestSuite = true; - - break; - - case '--fail-on-incomplete': - $this->warnWhenOptionsConflict( - $doNotFailOnIncomplete, - '--fail-on-incomplete', - '--do-not-fail-on-incomplete', - ); - - $failOnIncomplete = true; - - break; - - case '--fail-on-notice': - $this->warnWhenOptionsConflict( - $doNotFailOnNotice, - '--fail-on-notice', - '--do-not-fail-on-notice', - ); - - $failOnNotice = true; - - break; - - case '--fail-on-risky': - $this->warnWhenOptionsConflict( - $doNotFailOnRisky, - '--fail-on-risky', - '--do-not-fail-on-risky', - ); - - $failOnRisky = true; - - break; - - case '--fail-on-skipped': - $this->warnWhenOptionsConflict( - $doNotFailOnSkipped, - '--fail-on-skipped', - '--do-not-fail-on-skipped', - ); - - $failOnSkipped = true; - - break; - - case '--fail-on-warning': - $this->warnWhenOptionsConflict( - $doNotFailOnWarning, - '--fail-on-warning', - '--do-not-fail-on-warning', - ); - - $failOnWarning = true; - - break; - - case '--do-not-fail-on-deprecation': - $this->warnWhenOptionsConflict( - $failOnDeprecation, - '--do-not-fail-on-deprecation', - '--fail-on-deprecation', - ); - - $doNotFailOnDeprecation = true; - - break; - - case '--do-not-fail-on-phpunit-deprecation': - $this->warnWhenOptionsConflict( - $failOnPhpunitDeprecation, - '--do-not-fail-on-phpunit-deprecation', - '--fail-on-phpunit-deprecation', - ); - - $doNotFailOnPhpunitDeprecation = true; - - break; - - case '--do-not-fail-on-phpunit-warning': - $this->warnWhenOptionsConflict( - $failOnPhpunitWarning, - '--do-not-fail-on-phpunit-warning', - '--fail-on-phpunit-warning', - ); - - $doNotFailOnPhpunitWarning = true; - - break; - - case '--do-not-fail-on-empty-test-suite': - $this->warnWhenOptionsConflict( - $failOnEmptyTestSuite, - '--do-not-fail-on-empty-test-suite', - '--fail-on-empty-test-suite', - ); - - $doNotFailOnEmptyTestSuite = true; - - break; - - case '--do-not-fail-on-incomplete': - $this->warnWhenOptionsConflict( - $failOnIncomplete, - '--do-not-fail-on-incomplete', - '--fail-on-incomplete', - ); - - $doNotFailOnIncomplete = true; - - break; - - case '--do-not-fail-on-notice': - $this->warnWhenOptionsConflict( - $failOnNotice, - '--do-not-fail-on-notice', - '--fail-on-notice', - ); - - $doNotFailOnNotice = true; - - break; - - case '--do-not-fail-on-risky': - $this->warnWhenOptionsConflict( - $failOnRisky, - '--do-not-fail-on-risky', - '--fail-on-risky', - ); - - $doNotFailOnRisky = true; - - break; - - case '--do-not-fail-on-skipped': - $this->warnWhenOptionsConflict( - $failOnSkipped, - '--do-not-fail-on-skipped', - '--fail-on-skipped', - ); - - $doNotFailOnSkipped = true; - - break; - - case '--do-not-fail-on-warning': - $this->warnWhenOptionsConflict( - $failOnWarning, - '--do-not-fail-on-warning', - '--fail-on-warning', - ); - - $doNotFailOnWarning = true; - - break; - - case '--stop-on-defect': - $stopOnDefect = true; - - break; - - case '--stop-on-deprecation': - $stopOnDeprecation = true; - - break; - - case '--stop-on-error': - $stopOnError = true; - - break; - - case '--stop-on-failure': - $stopOnFailure = true; - - break; - - case '--stop-on-incomplete': - $stopOnIncomplete = true; - - break; - - case '--stop-on-notice': - $stopOnNotice = true; - - break; - - case '--stop-on-risky': - $stopOnRisky = true; - - break; - - case '--stop-on-skipped': - $stopOnSkipped = true; - - break; - - case '--stop-on-warning': - $stopOnWarning = true; - - break; - - case '--teamcity': - $printerTeamCity = true; - - break; - - case '--testdox': - $printerTestDox = true; - - break; - - case '--testdox-html': - $testdoxHtmlFile = $option[1]; - - break; - - case '--testdox-text': - $testdoxTextFile = $option[1]; - - break; - - case '--no-configuration': - $useDefaultConfiguration = false; - - break; - - case '--no-extensions': - $noExtensions = true; - - break; - - case '--no-coverage': - $noCoverage = true; - - break; - - case '--no-logging': - $noLogging = true; - - break; - - case '--no-output': - $noOutput = true; - - break; - - case '--no-progress': - $noProgress = true; - - break; - - case '--no-results': - $noResults = true; - - break; - - case '--globals-backup': - $backupGlobals = true; - - break; - - case '--static-backup': - $backupStaticProperties = true; - - break; - - case '--atleast-version': - $atLeastVersion = $option[1]; - - break; - - case '--version': - $version = true; - - break; - - case '--do-not-report-useless-tests': - case '--dont-report-useless-tests': - $reportUselessTests = false; - - break; - - case '--strict-coverage': - $strictCoverage = true; - - break; - - case '--disable-coverage-ignore': - $disableCodeCoverageIgnore = true; - - break; - - case '--strict-global-state': - $beStrictAboutChangesToGlobalState = true; - - break; - - case '--disallow-test-output': - $disallowTestOutput = true; - - break; - - case '--display-all-issues': - $displayAllIssues = true; - - break; - - case '--display-incomplete': - $displayIncomplete = true; - - break; - - case '--display-skipped': - $displaySkipped = true; - - break; - - case '--display-deprecations': - $displayDeprecations = true; - - break; - - case '--display-phpunit-deprecations': - $displayPhpunitDeprecations = true; - - break; - - case '--display-errors': - $displayErrors = true; - - break; - - case '--display-notices': - $displayNotices = true; - - break; - - case '--display-warnings': - $displayWarnings = true; - - break; - - case '--default-time-limit': - $defaultTimeLimit = (int) $option[1]; - - break; - - case '--enforce-time-limit': - $enforceTimeLimit = true; - - break; - - case '--reverse-list': - $reverseList = true; - - break; - - case '--check-php-configuration': - $checkPhpConfiguration = true; - - break; - - case '--check-version': - $checkVersion = true; - - break; - - case '--coverage-filter': - if ($coverageFilter === null) { - $coverageFilter = []; - } - - $coverageFilter[] = $option[1]; - - $optionAllowedMultipleTimes = true; - - break; - - case '--random-order': - $executionOrder = TestSuiteSorter::ORDER_RANDOMIZED; - - break; - - case '--random-order-seed': - $randomOrderSeed = (int) $option[1]; - - break; - - case '--resolve-dependencies': - $resolveDependencies = true; - - break; - - case '--ignore-dependencies': - $resolveDependencies = false; - - break; - - case '--reverse-order': - $executionOrder = TestSuiteSorter::ORDER_REVERSED; - - break; - - case '--log-events-text': - $logEventsText = Filesystem::resolveStreamOrFile($option[1]); - - if ($logEventsText === false) { - throw new Exception( - sprintf( - 'The path "%s" specified for the --log-events-text option could not be resolved', - $option[1], - ), - ); - } - - break; - - case '--log-events-verbose-text': - $logEventsVerboseText = Filesystem::resolveStreamOrFile($option[1]); - - if ($logEventsVerboseText === false) { - throw new Exception( - sprintf( - 'The path "%s" specified for the --log-events-verbose-text option could not be resolved', - $option[1], - ), - ); - } - - break; - - case '--debug': - $debug = true; - - break; - } - - if (!$optionAllowedMultipleTimes) { - $this->markProcessed($option[0]); - } - } - - if (empty($iniSettings)) { - $iniSettings = null; - } - - if (empty($coverageFilter)) { - $coverageFilter = null; - } - - return new Configuration( - $options[1], - $atLeastVersion, - $backupGlobals, - $backupStaticProperties, - $beStrictAboutChangesToGlobalState, - $bootstrap, - $cacheDirectory, - $cacheResult, - $cacheResultFile, - $checkPhpConfiguration, - $checkVersion, - $colors, - $columns, - $configuration, - $coverageClover, - $coverageCobertura, - $coverageCrap4J, - $coverageHtml, - $coveragePhp, - $coverageText, - $coverageTextShowUncoveredFiles, - $coverageTextShowOnlySummary, - $coverageXml, - $pathCoverage, - $coverageCacheDirectory, - $warmCoverageCache, - $defaultTimeLimit, - $disableCodeCoverageIgnore, - $disallowTestOutput, - $enforceTimeLimit, - $excludeGroups, - $executionOrder, - $executionOrderDefects, - $failOnAllIssues, - $failOnDeprecation, - $failOnPhpunitDeprecation, - $failOnPhpunitWarning, - $failOnEmptyTestSuite, - $failOnIncomplete, - $failOnNotice, - $failOnRisky, - $failOnSkipped, - $failOnWarning, - $doNotFailOnDeprecation, - $doNotFailOnPhpunitDeprecation, - $doNotFailOnPhpunitWarning, - $doNotFailOnEmptyTestSuite, - $doNotFailOnIncomplete, - $doNotFailOnNotice, - $doNotFailOnRisky, - $doNotFailOnSkipped, - $doNotFailOnWarning, - $stopOnDefect, - $stopOnDeprecation, - $stopOnError, - $stopOnFailure, - $stopOnIncomplete, - $stopOnNotice, - $stopOnRisky, - $stopOnSkipped, - $stopOnWarning, - $filter, - $generateBaseline, - $useBaseline, - $ignoreBaseline, - $generateConfiguration, - $migrateConfiguration, - $groups, - $testsCovering, - $testsUsing, - $help, - $includePath, - $iniSettings, - $junitLogfile, - $listGroups, - $listSuites, - $listTests, - $listTestsXml, - $noCoverage, - $noExtensions, - $noOutput, - $noProgress, - $noResults, - $noLogging, - $processIsolation, - $randomOrderSeed, - $reportUselessTests, - $resolveDependencies, - $reverseList, - $stderr, - $strictCoverage, - $teamcityLogfile, - $testdoxHtmlFile, - $testdoxTextFile, - $testSuffixes, - $testSuite, - $excludeTestSuite, - $useDefaultConfiguration, - $displayAllIssues, - $displayIncomplete, - $displaySkipped, - $displayDeprecations, - $displayPhpunitDeprecations, - $displayErrors, - $displayNotices, - $displayWarnings, - $version, - $coverageFilter, - $logEventsText, - $logEventsVerboseText, - $printerTeamCity, - $printerTestDox, - $debug, - ); - } - - /** - * @psalm-param non-empty-string $option - */ - private function markProcessed(string $option): void - { - if (!isset($this->processed[$option])) { - $this->processed[$option] = 1; - - return; - } - - $this->processed[$option]++; - - if ($this->processed[$option] === 2) { - EventFacade::emitter()->testRunnerTriggeredPhpunitWarning( - sprintf( - 'Option %s cannot be used more than once', - $option, - ), - ); - } - } - - /** - * @psalm-param non-empty-string $option - */ - private function warnWhenOptionsConflict(?bool $current, string $option, string $opposite): void - { - if ($current === null) { - return; - } - - EventFacade::emitter()->testRunnerTriggeredPhpunitWarning( - sprintf( - 'Options %s and %s cannot be used together', - $option, - $opposite, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Cli/Configuration.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Cli/Configuration.php deleted file mode 100644 index f243003..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Cli/Configuration.php +++ /dev/null @@ -1,2325 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\CliArguments; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class Configuration -{ - /** - * @psalm-var list - */ - private readonly array $arguments; - private readonly ?string $atLeastVersion; - private readonly ?bool $backupGlobals; - private readonly ?bool $backupStaticProperties; - private readonly ?bool $beStrictAboutChangesToGlobalState; - private readonly ?string $bootstrap; - private readonly ?string $cacheDirectory; - private readonly ?bool $cacheResult; - private readonly ?string $cacheResultFile; - private readonly bool $checkPhpConfiguration; - private readonly bool $checkVersion; - private readonly ?string $colors; - private readonly null|int|string $columns; - private readonly ?string $configurationFile; - private readonly ?array $coverageFilter; - private readonly ?string $coverageClover; - private readonly ?string $coverageCobertura; - private readonly ?string $coverageCrap4J; - private readonly ?string $coverageHtml; - private readonly ?string $coveragePhp; - private readonly ?string $coverageText; - private readonly ?bool $coverageTextShowUncoveredFiles; - private readonly ?bool $coverageTextShowOnlySummary; - private readonly ?string $coverageXml; - private readonly ?bool $pathCoverage; - private readonly ?string $coverageCacheDirectory; - private readonly bool $warmCoverageCache; - private readonly ?int $defaultTimeLimit; - private readonly ?bool $disableCodeCoverageIgnore; - private readonly ?bool $disallowTestOutput; - private readonly ?bool $enforceTimeLimit; - private readonly ?array $excludeGroups; - private readonly ?int $executionOrder; - private readonly ?int $executionOrderDefects; - private readonly ?bool $failOnAllIssues; - private readonly ?bool $failOnDeprecation; - private readonly ?bool $failOnPhpunitDeprecation; - private readonly ?bool $failOnPhpunitWarning; - private readonly ?bool $failOnEmptyTestSuite; - private readonly ?bool $failOnIncomplete; - private readonly ?bool $failOnNotice; - private readonly ?bool $failOnRisky; - private readonly ?bool $failOnSkipped; - private readonly ?bool $failOnWarning; - private readonly ?bool $doNotFailOnDeprecation; - private readonly ?bool $doNotFailOnPhpunitDeprecation; - private readonly ?bool $doNotFailOnPhpunitWarning; - private readonly ?bool $doNotFailOnEmptyTestSuite; - private readonly ?bool $doNotFailOnIncomplete; - private readonly ?bool $doNotFailOnNotice; - private readonly ?bool $doNotFailOnRisky; - private readonly ?bool $doNotFailOnSkipped; - private readonly ?bool $doNotFailOnWarning; - private readonly ?bool $stopOnDefect; - private readonly ?bool $stopOnDeprecation; - private readonly ?bool $stopOnError; - private readonly ?bool $stopOnFailure; - private readonly ?bool $stopOnIncomplete; - private readonly ?bool $stopOnNotice; - private readonly ?bool $stopOnRisky; - private readonly ?bool $stopOnSkipped; - private readonly ?bool $stopOnWarning; - private readonly ?string $filter; - private readonly ?string $generateBaseline; - private readonly ?string $useBaseline; - private readonly bool $ignoreBaseline; - private readonly bool $generateConfiguration; - private readonly bool $migrateConfiguration; - private readonly ?array $groups; - private readonly ?array $testsCovering; - private readonly ?array $testsUsing; - private readonly bool $help; - private readonly ?string $includePath; - private readonly ?array $iniSettings; - private readonly ?string $junitLogfile; - private readonly bool $listGroups; - private readonly bool $listSuites; - private readonly bool $listTests; - private readonly ?string $listTestsXml; - private readonly ?bool $noCoverage; - private readonly ?bool $noExtensions; - private readonly ?bool $noOutput; - private readonly ?bool $noProgress; - private readonly ?bool $noResults; - private readonly ?bool $noLogging; - private readonly ?bool $processIsolation; - private readonly ?int $randomOrderSeed; - private readonly ?bool $reportUselessTests; - private readonly ?bool $resolveDependencies; - private readonly ?bool $reverseList; - private readonly ?bool $stderr; - private readonly ?bool $strictCoverage; - private readonly ?string $teamcityLogfile; - private readonly ?bool $teamCityPrinter; - private readonly ?string $testdoxHtmlFile; - private readonly ?string $testdoxTextFile; - private readonly ?bool $testdoxPrinter; - - /** - * @psalm-var ?non-empty-list - */ - private readonly ?array $testSuffixes; - private readonly ?string $testSuite; - private readonly ?string $excludeTestSuite; - private readonly bool $useDefaultConfiguration; - private readonly ?bool $displayDetailsOnAllIssues; - private readonly ?bool $displayDetailsOnIncompleteTests; - private readonly ?bool $displayDetailsOnSkippedTests; - private readonly ?bool $displayDetailsOnTestsThatTriggerDeprecations; - private readonly ?bool $displayDetailsOnPhpunitDeprecations; - private readonly ?bool $displayDetailsOnTestsThatTriggerErrors; - private readonly ?bool $displayDetailsOnTestsThatTriggerNotices; - private readonly ?bool $displayDetailsOnTestsThatTriggerWarnings; - private readonly bool $version; - private readonly ?string $logEventsText; - private readonly ?string $logEventsVerboseText; - private readonly bool $debug; - - /** - * @psalm-param list $arguments - * @psalm-param ?non-empty-list $testSuffixes - */ - public function __construct(array $arguments, ?string $atLeastVersion, ?bool $backupGlobals, ?bool $backupStaticProperties, ?bool $beStrictAboutChangesToGlobalState, ?string $bootstrap, ?string $cacheDirectory, ?bool $cacheResult, ?string $cacheResultFile, bool $checkPhpConfiguration, bool $checkVersion, ?string $colors, null|int|string $columns, ?string $configurationFile, ?string $coverageClover, ?string $coverageCobertura, ?string $coverageCrap4J, ?string $coverageHtml, ?string $coveragePhp, ?string $coverageText, ?bool $coverageTextShowUncoveredFiles, ?bool $coverageTextShowOnlySummary, ?string $coverageXml, ?bool $pathCoverage, ?string $coverageCacheDirectory, bool $warmCoverageCache, ?int $defaultTimeLimit, ?bool $disableCodeCoverageIgnore, ?bool $disallowTestOutput, ?bool $enforceTimeLimit, ?array $excludeGroups, ?int $executionOrder, ?int $executionOrderDefects, ?bool $failOnAllIssues, ?bool $failOnDeprecation, ?bool $failOnPhpunitDeprecation, ?bool $failOnPhpunitWarning, ?bool $failOnEmptyTestSuite, ?bool $failOnIncomplete, ?bool $failOnNotice, ?bool $failOnRisky, ?bool $failOnSkipped, ?bool $failOnWarning, ?bool $doNotFailOnDeprecation, ?bool $doNotFailOnPhpunitDeprecation, ?bool $doNotFailOnPhpunitWarning, ?bool $doNotFailOnEmptyTestSuite, ?bool $doNotFailOnIncomplete, ?bool $doNotFailOnNotice, ?bool $doNotFailOnRisky, ?bool $doNotFailOnSkipped, ?bool $doNotFailOnWarning, ?bool $stopOnDefect, ?bool $stopOnDeprecation, ?bool $stopOnError, ?bool $stopOnFailure, ?bool $stopOnIncomplete, ?bool $stopOnNotice, ?bool $stopOnRisky, ?bool $stopOnSkipped, ?bool $stopOnWarning, ?string $filter, ?string $generateBaseline, ?string $useBaseline, bool $ignoreBaseline, bool $generateConfiguration, bool $migrateConfiguration, ?array $groups, ?array $testsCovering, ?array $testsUsing, bool $help, ?string $includePath, ?array $iniSettings, ?string $junitLogfile, bool $listGroups, bool $listSuites, bool $listTests, ?string $listTestsXml, ?bool $noCoverage, ?bool $noExtensions, ?bool $noOutput, ?bool $noProgress, ?bool $noResults, ?bool $noLogging, ?bool $processIsolation, ?int $randomOrderSeed, ?bool $reportUselessTests, ?bool $resolveDependencies, ?bool $reverseList, ?bool $stderr, ?bool $strictCoverage, ?string $teamcityLogfile, ?string $testdoxHtmlFile, ?string $testdoxTextFile, ?array $testSuffixes, ?string $testSuite, ?string $excludeTestSuite, bool $useDefaultConfiguration, ?bool $displayDetailsOnAllIssues, ?bool $displayDetailsOnIncompleteTests, ?bool $displayDetailsOnSkippedTests, ?bool $displayDetailsOnTestsThatTriggerDeprecations, ?bool $displayDetailsOnPhpunitDeprecations, ?bool $displayDetailsOnTestsThatTriggerErrors, ?bool $displayDetailsOnTestsThatTriggerNotices, ?bool $displayDetailsOnTestsThatTriggerWarnings, bool $version, ?array $coverageFilter, ?string $logEventsText, ?string $logEventsVerboseText, ?bool $printerTeamCity, ?bool $printerTestDox, bool $debug) - { - $this->arguments = $arguments; - $this->atLeastVersion = $atLeastVersion; - $this->backupGlobals = $backupGlobals; - $this->backupStaticProperties = $backupStaticProperties; - $this->beStrictAboutChangesToGlobalState = $beStrictAboutChangesToGlobalState; - $this->bootstrap = $bootstrap; - $this->cacheDirectory = $cacheDirectory; - $this->cacheResult = $cacheResult; - $this->cacheResultFile = $cacheResultFile; - $this->checkPhpConfiguration = $checkPhpConfiguration; - $this->checkVersion = $checkVersion; - $this->colors = $colors; - $this->columns = $columns; - $this->configurationFile = $configurationFile; - $this->coverageFilter = $coverageFilter; - $this->coverageClover = $coverageClover; - $this->coverageCobertura = $coverageCobertura; - $this->coverageCrap4J = $coverageCrap4J; - $this->coverageHtml = $coverageHtml; - $this->coveragePhp = $coveragePhp; - $this->coverageText = $coverageText; - $this->coverageTextShowUncoveredFiles = $coverageTextShowUncoveredFiles; - $this->coverageTextShowOnlySummary = $coverageTextShowOnlySummary; - $this->coverageXml = $coverageXml; - $this->pathCoverage = $pathCoverage; - $this->coverageCacheDirectory = $coverageCacheDirectory; - $this->warmCoverageCache = $warmCoverageCache; - $this->defaultTimeLimit = $defaultTimeLimit; - $this->disableCodeCoverageIgnore = $disableCodeCoverageIgnore; - $this->disallowTestOutput = $disallowTestOutput; - $this->enforceTimeLimit = $enforceTimeLimit; - $this->excludeGroups = $excludeGroups; - $this->executionOrder = $executionOrder; - $this->executionOrderDefects = $executionOrderDefects; - $this->failOnAllIssues = $failOnAllIssues; - $this->failOnDeprecation = $failOnDeprecation; - $this->failOnPhpunitDeprecation = $failOnPhpunitDeprecation; - $this->failOnPhpunitWarning = $failOnPhpunitWarning; - $this->failOnEmptyTestSuite = $failOnEmptyTestSuite; - $this->failOnIncomplete = $failOnIncomplete; - $this->failOnNotice = $failOnNotice; - $this->failOnRisky = $failOnRisky; - $this->failOnSkipped = $failOnSkipped; - $this->failOnWarning = $failOnWarning; - $this->doNotFailOnDeprecation = $doNotFailOnDeprecation; - $this->doNotFailOnPhpunitDeprecation = $doNotFailOnPhpunitDeprecation; - $this->doNotFailOnPhpunitWarning = $doNotFailOnPhpunitWarning; - $this->doNotFailOnEmptyTestSuite = $doNotFailOnEmptyTestSuite; - $this->doNotFailOnIncomplete = $doNotFailOnIncomplete; - $this->doNotFailOnNotice = $doNotFailOnNotice; - $this->doNotFailOnRisky = $doNotFailOnRisky; - $this->doNotFailOnSkipped = $doNotFailOnSkipped; - $this->doNotFailOnWarning = $doNotFailOnWarning; - $this->stopOnDefect = $stopOnDefect; - $this->stopOnDeprecation = $stopOnDeprecation; - $this->stopOnError = $stopOnError; - $this->stopOnFailure = $stopOnFailure; - $this->stopOnIncomplete = $stopOnIncomplete; - $this->stopOnNotice = $stopOnNotice; - $this->stopOnRisky = $stopOnRisky; - $this->stopOnSkipped = $stopOnSkipped; - $this->stopOnWarning = $stopOnWarning; - $this->filter = $filter; - $this->generateBaseline = $generateBaseline; - $this->useBaseline = $useBaseline; - $this->ignoreBaseline = $ignoreBaseline; - $this->generateConfiguration = $generateConfiguration; - $this->migrateConfiguration = $migrateConfiguration; - $this->groups = $groups; - $this->testsCovering = $testsCovering; - $this->testsUsing = $testsUsing; - $this->help = $help; - $this->includePath = $includePath; - $this->iniSettings = $iniSettings; - $this->junitLogfile = $junitLogfile; - $this->listGroups = $listGroups; - $this->listSuites = $listSuites; - $this->listTests = $listTests; - $this->listTestsXml = $listTestsXml; - $this->noCoverage = $noCoverage; - $this->noExtensions = $noExtensions; - $this->noOutput = $noOutput; - $this->noProgress = $noProgress; - $this->noResults = $noResults; - $this->noLogging = $noLogging; - $this->processIsolation = $processIsolation; - $this->randomOrderSeed = $randomOrderSeed; - $this->reportUselessTests = $reportUselessTests; - $this->resolveDependencies = $resolveDependencies; - $this->reverseList = $reverseList; - $this->stderr = $stderr; - $this->strictCoverage = $strictCoverage; - $this->teamcityLogfile = $teamcityLogfile; - $this->testdoxHtmlFile = $testdoxHtmlFile; - $this->testdoxTextFile = $testdoxTextFile; - $this->testSuffixes = $testSuffixes; - $this->testSuite = $testSuite; - $this->excludeTestSuite = $excludeTestSuite; - $this->useDefaultConfiguration = $useDefaultConfiguration; - $this->displayDetailsOnAllIssues = $displayDetailsOnAllIssues; - $this->displayDetailsOnIncompleteTests = $displayDetailsOnIncompleteTests; - $this->displayDetailsOnSkippedTests = $displayDetailsOnSkippedTests; - $this->displayDetailsOnTestsThatTriggerDeprecations = $displayDetailsOnTestsThatTriggerDeprecations; - $this->displayDetailsOnPhpunitDeprecations = $displayDetailsOnPhpunitDeprecations; - $this->displayDetailsOnTestsThatTriggerErrors = $displayDetailsOnTestsThatTriggerErrors; - $this->displayDetailsOnTestsThatTriggerNotices = $displayDetailsOnTestsThatTriggerNotices; - $this->displayDetailsOnTestsThatTriggerWarnings = $displayDetailsOnTestsThatTriggerWarnings; - $this->version = $version; - $this->logEventsText = $logEventsText; - $this->logEventsVerboseText = $logEventsVerboseText; - $this->teamCityPrinter = $printerTeamCity; - $this->testdoxPrinter = $printerTestDox; - $this->debug = $debug; - } - - /** - * @psalm-return list - */ - public function arguments(): array - { - return $this->arguments; - } - - /** - * @psalm-assert-if-true !null $this->atLeastVersion - */ - public function hasAtLeastVersion(): bool - { - return $this->atLeastVersion !== null; - } - - /** - * @throws Exception - */ - public function atLeastVersion(): string - { - if (!$this->hasAtLeastVersion()) { - throw new Exception; - } - - return $this->atLeastVersion; - } - - /** - * @psalm-assert-if-true !null $this->backupGlobals - */ - public function hasBackupGlobals(): bool - { - return $this->backupGlobals !== null; - } - - /** - * @throws Exception - */ - public function backupGlobals(): bool - { - if (!$this->hasBackupGlobals()) { - throw new Exception; - } - - return $this->backupGlobals; - } - - /** - * @psalm-assert-if-true !null $this->backupStaticProperties - */ - public function hasBackupStaticProperties(): bool - { - return $this->backupStaticProperties !== null; - } - - /** - * @throws Exception - */ - public function backupStaticProperties(): bool - { - if (!$this->hasBackupStaticProperties()) { - throw new Exception; - } - - return $this->backupStaticProperties; - } - - /** - * @psalm-assert-if-true !null $this->beStrictAboutChangesToGlobalState - */ - public function hasBeStrictAboutChangesToGlobalState(): bool - { - return $this->beStrictAboutChangesToGlobalState !== null; - } - - /** - * @throws Exception - */ - public function beStrictAboutChangesToGlobalState(): bool - { - if (!$this->hasBeStrictAboutChangesToGlobalState()) { - throw new Exception; - } - - return $this->beStrictAboutChangesToGlobalState; - } - - /** - * @psalm-assert-if-true !null $this->bootstrap - */ - public function hasBootstrap(): bool - { - return $this->bootstrap !== null; - } - - /** - * @throws Exception - */ - public function bootstrap(): string - { - if (!$this->hasBootstrap()) { - throw new Exception; - } - - return $this->bootstrap; - } - - /** - * @psalm-assert-if-true !null $this->cacheDirectory - */ - public function hasCacheDirectory(): bool - { - return $this->cacheDirectory !== null; - } - - /** - * @throws Exception - */ - public function cacheDirectory(): string - { - if (!$this->hasCacheDirectory()) { - throw new Exception; - } - - return $this->cacheDirectory; - } - - /** - * @psalm-assert-if-true !null $this->cacheResult - */ - public function hasCacheResult(): bool - { - return $this->cacheResult !== null; - } - - /** - * @throws Exception - */ - public function cacheResult(): bool - { - if (!$this->hasCacheResult()) { - throw new Exception; - } - - return $this->cacheResult; - } - - /** - * @psalm-assert-if-true !null $this->cacheResultFile - * - * @deprecated - */ - public function hasCacheResultFile(): bool - { - return $this->cacheResultFile !== null; - } - - /** - * @throws Exception - * - * @deprecated - */ - public function cacheResultFile(): string - { - if (!$this->hasCacheResultFile()) { - throw new Exception; - } - - return $this->cacheResultFile; - } - - public function checkPhpConfiguration(): bool - { - return $this->checkPhpConfiguration; - } - - public function checkVersion(): bool - { - return $this->checkVersion; - } - - /** - * @psalm-assert-if-true !null $this->colors - */ - public function hasColors(): bool - { - return $this->colors !== null; - } - - /** - * @throws Exception - */ - public function colors(): string - { - if (!$this->hasColors()) { - throw new Exception; - } - - return $this->colors; - } - - /** - * @psalm-assert-if-true !null $this->columns - */ - public function hasColumns(): bool - { - return $this->columns !== null; - } - - /** - * @throws Exception - */ - public function columns(): int|string - { - if (!$this->hasColumns()) { - throw new Exception; - } - - return $this->columns; - } - - /** - * @psalm-assert-if-true !null $this->configurationFile - */ - public function hasConfigurationFile(): bool - { - return $this->configurationFile !== null; - } - - /** - * @throws Exception - */ - public function configurationFile(): string - { - if (!$this->hasConfigurationFile()) { - throw new Exception; - } - - return $this->configurationFile; - } - - /** - * @psalm-assert-if-true !null $this->coverageFilter - */ - public function hasCoverageFilter(): bool - { - return $this->coverageFilter !== null; - } - - /** - * @throws Exception - */ - public function coverageFilter(): array - { - if (!$this->hasCoverageFilter()) { - throw new Exception; - } - - return $this->coverageFilter; - } - - /** - * @psalm-assert-if-true !null $this->coverageClover - */ - public function hasCoverageClover(): bool - { - return $this->coverageClover !== null; - } - - /** - * @throws Exception - */ - public function coverageClover(): string - { - if (!$this->hasCoverageClover()) { - throw new Exception; - } - - return $this->coverageClover; - } - - /** - * @psalm-assert-if-true !null $this->coverageCobertura - */ - public function hasCoverageCobertura(): bool - { - return $this->coverageCobertura !== null; - } - - /** - * @throws Exception - */ - public function coverageCobertura(): string - { - if (!$this->hasCoverageCobertura()) { - throw new Exception; - } - - return $this->coverageCobertura; - } - - /** - * @psalm-assert-if-true !null $this->coverageCrap4J - */ - public function hasCoverageCrap4J(): bool - { - return $this->coverageCrap4J !== null; - } - - /** - * @throws Exception - */ - public function coverageCrap4J(): string - { - if (!$this->hasCoverageCrap4J()) { - throw new Exception; - } - - return $this->coverageCrap4J; - } - - /** - * @psalm-assert-if-true !null $this->coverageHtml - */ - public function hasCoverageHtml(): bool - { - return $this->coverageHtml !== null; - } - - /** - * @throws Exception - */ - public function coverageHtml(): string - { - if (!$this->hasCoverageHtml()) { - throw new Exception; - } - - return $this->coverageHtml; - } - - /** - * @psalm-assert-if-true !null $this->coveragePhp - */ - public function hasCoveragePhp(): bool - { - return $this->coveragePhp !== null; - } - - /** - * @throws Exception - */ - public function coveragePhp(): string - { - if (!$this->hasCoveragePhp()) { - throw new Exception; - } - - return $this->coveragePhp; - } - - /** - * @psalm-assert-if-true !null $this->coverageText - */ - public function hasCoverageText(): bool - { - return $this->coverageText !== null; - } - - /** - * @throws Exception - */ - public function coverageText(): string - { - if (!$this->hasCoverageText()) { - throw new Exception; - } - - return $this->coverageText; - } - - /** - * @psalm-assert-if-true !null $this->coverageTextShowUncoveredFiles - */ - public function hasCoverageTextShowUncoveredFiles(): bool - { - return $this->coverageTextShowUncoveredFiles !== null; - } - - /** - * @throws Exception - */ - public function coverageTextShowUncoveredFiles(): bool - { - if (!$this->hasCoverageTextShowUncoveredFiles()) { - throw new Exception; - } - - return $this->coverageTextShowUncoveredFiles; - } - - /** - * @psalm-assert-if-true !null $this->coverageTextShowOnlySummary - */ - public function hasCoverageTextShowOnlySummary(): bool - { - return $this->coverageTextShowOnlySummary !== null; - } - - /** - * @throws Exception - */ - public function coverageTextShowOnlySummary(): bool - { - if (!$this->hasCoverageTextShowOnlySummary()) { - throw new Exception; - } - - return $this->coverageTextShowOnlySummary; - } - - /** - * @psalm-assert-if-true !null $this->coverageXml - */ - public function hasCoverageXml(): bool - { - return $this->coverageXml !== null; - } - - /** - * @throws Exception - */ - public function coverageXml(): string - { - if (!$this->hasCoverageXml()) { - throw new Exception; - } - - return $this->coverageXml; - } - - /** - * @psalm-assert-if-true !null $this->pathCoverage - */ - public function hasPathCoverage(): bool - { - return $this->pathCoverage !== null; - } - - /** - * @throws Exception - */ - public function pathCoverage(): bool - { - if (!$this->hasPathCoverage()) { - throw new Exception; - } - - return $this->pathCoverage; - } - - /** - * @psalm-assert-if-true !null $this->coverageCacheDirectory - * - * @deprecated - */ - public function hasCoverageCacheDirectory(): bool - { - return $this->coverageCacheDirectory !== null; - } - - /** - * @throws Exception - * - * @deprecated - */ - public function coverageCacheDirectory(): string - { - if (!$this->hasCoverageCacheDirectory()) { - throw new Exception; - } - - return $this->coverageCacheDirectory; - } - - public function warmCoverageCache(): bool - { - return $this->warmCoverageCache; - } - - /** - * @psalm-assert-if-true !null $this->defaultTimeLimit - */ - public function hasDefaultTimeLimit(): bool - { - return $this->defaultTimeLimit !== null; - } - - /** - * @throws Exception - */ - public function defaultTimeLimit(): int - { - if (!$this->hasDefaultTimeLimit()) { - throw new Exception; - } - - return $this->defaultTimeLimit; - } - - /** - * @psalm-assert-if-true !null $this->disableCodeCoverageIgnore - */ - public function hasDisableCodeCoverageIgnore(): bool - { - return $this->disableCodeCoverageIgnore !== null; - } - - /** - * @throws Exception - */ - public function disableCodeCoverageIgnore(): bool - { - if (!$this->hasDisableCodeCoverageIgnore()) { - throw new Exception; - } - - return $this->disableCodeCoverageIgnore; - } - - /** - * @psalm-assert-if-true !null $this->disallowTestOutput - */ - public function hasDisallowTestOutput(): bool - { - return $this->disallowTestOutput !== null; - } - - /** - * @throws Exception - */ - public function disallowTestOutput(): bool - { - if (!$this->hasDisallowTestOutput()) { - throw new Exception; - } - - return $this->disallowTestOutput; - } - - /** - * @psalm-assert-if-true !null $this->enforceTimeLimit - */ - public function hasEnforceTimeLimit(): bool - { - return $this->enforceTimeLimit !== null; - } - - /** - * @throws Exception - */ - public function enforceTimeLimit(): bool - { - if (!$this->hasEnforceTimeLimit()) { - throw new Exception; - } - - return $this->enforceTimeLimit; - } - - /** - * @psalm-assert-if-true !null $this->excludeGroups - */ - public function hasExcludeGroups(): bool - { - return $this->excludeGroups !== null; - } - - /** - * @throws Exception - */ - public function excludeGroups(): array - { - if (!$this->hasExcludeGroups()) { - throw new Exception; - } - - return $this->excludeGroups; - } - - /** - * @psalm-assert-if-true !null $this->executionOrder - */ - public function hasExecutionOrder(): bool - { - return $this->executionOrder !== null; - } - - /** - * @throws Exception - */ - public function executionOrder(): int - { - if (!$this->hasExecutionOrder()) { - throw new Exception; - } - - return $this->executionOrder; - } - - /** - * @psalm-assert-if-true !null $this->executionOrderDefects - */ - public function hasExecutionOrderDefects(): bool - { - return $this->executionOrderDefects !== null; - } - - /** - * @throws Exception - */ - public function executionOrderDefects(): int - { - if (!$this->hasExecutionOrderDefects()) { - throw new Exception; - } - - return $this->executionOrderDefects; - } - - /** - * @psalm-assert-if-true !null $this->failOnAllIssues - */ - public function hasFailOnAllIssues(): bool - { - return $this->failOnAllIssues !== null; - } - - /** - * @throws Exception - */ - public function failOnAllIssues(): bool - { - if (!$this->hasFailOnAllIssues()) { - throw new Exception; - } - - return $this->failOnAllIssues; - } - - /** - * @psalm-assert-if-true !null $this->failOnDeprecation - */ - public function hasFailOnDeprecation(): bool - { - return $this->failOnDeprecation !== null; - } - - /** - * @throws Exception - */ - public function failOnDeprecation(): bool - { - if (!$this->hasFailOnDeprecation()) { - throw new Exception; - } - - return $this->failOnDeprecation; - } - - /** - * @psalm-assert-if-true !null $this->failOnPhpunitDeprecation - */ - public function hasFailOnPhpunitDeprecation(): bool - { - return $this->failOnPhpunitDeprecation !== null; - } - - /** - * @throws Exception - */ - public function failOnPhpunitDeprecation(): bool - { - if (!$this->hasFailOnPhpunitDeprecation()) { - throw new Exception; - } - - return $this->failOnPhpunitDeprecation; - } - - /** - * @psalm-assert-if-true !null $this->failOnPhpunitWarning - */ - public function hasFailOnPhpunitWarning(): bool - { - return $this->failOnPhpunitWarning !== null; - } - - /** - * @throws Exception - */ - public function failOnPhpunitWarning(): bool - { - if (!$this->hasFailOnPhpunitWarning()) { - throw new Exception; - } - - return $this->failOnPhpunitWarning; - } - - /** - * @psalm-assert-if-true !null $this->failOnEmptyTestSuite - */ - public function hasFailOnEmptyTestSuite(): bool - { - return $this->failOnEmptyTestSuite !== null; - } - - /** - * @throws Exception - */ - public function failOnEmptyTestSuite(): bool - { - if (!$this->hasFailOnEmptyTestSuite()) { - throw new Exception; - } - - return $this->failOnEmptyTestSuite; - } - - /** - * @psalm-assert-if-true !null $this->failOnIncomplete - */ - public function hasFailOnIncomplete(): bool - { - return $this->failOnIncomplete !== null; - } - - /** - * @throws Exception - */ - public function failOnIncomplete(): bool - { - if (!$this->hasFailOnIncomplete()) { - throw new Exception; - } - - return $this->failOnIncomplete; - } - - /** - * @psalm-assert-if-true !null $this->failOnNotice - */ - public function hasFailOnNotice(): bool - { - return $this->failOnNotice !== null; - } - - /** - * @throws Exception - */ - public function failOnNotice(): bool - { - if (!$this->hasFailOnNotice()) { - throw new Exception; - } - - return $this->failOnNotice; - } - - /** - * @psalm-assert-if-true !null $this->failOnRisky - */ - public function hasFailOnRisky(): bool - { - return $this->failOnRisky !== null; - } - - /** - * @throws Exception - */ - public function failOnRisky(): bool - { - if (!$this->hasFailOnRisky()) { - throw new Exception; - } - - return $this->failOnRisky; - } - - /** - * @psalm-assert-if-true !null $this->failOnSkipped - */ - public function hasFailOnSkipped(): bool - { - return $this->failOnSkipped !== null; - } - - /** - * @throws Exception - */ - public function failOnSkipped(): bool - { - if (!$this->hasFailOnSkipped()) { - throw new Exception; - } - - return $this->failOnSkipped; - } - - /** - * @psalm-assert-if-true !null $this->failOnWarning - */ - public function hasFailOnWarning(): bool - { - return $this->failOnWarning !== null; - } - - /** - * @throws Exception - */ - public function failOnWarning(): bool - { - if (!$this->hasFailOnWarning()) { - throw new Exception; - } - - return $this->failOnWarning; - } - - /** - * @psalm-assert-if-true !null $this->doNotFailOnDeprecation - */ - public function hasDoNotFailOnDeprecation(): bool - { - return $this->doNotFailOnDeprecation !== null; - } - - /** - * @throws Exception - */ - public function doNotFailOnDeprecation(): bool - { - if (!$this->hasDoNotFailOnDeprecation()) { - throw new Exception; - } - - return $this->doNotFailOnDeprecation; - } - - /** - * @psalm-assert-if-true !null $this->doNotFailOnPhpunitDeprecation - */ - public function hasDoNotFailOnPhpunitDeprecation(): bool - { - return $this->doNotFailOnPhpunitDeprecation !== null; - } - - /** - * @throws Exception - */ - public function doNotFailOnPhpunitDeprecation(): bool - { - if (!$this->hasDoNotFailOnPhpunitDeprecation()) { - throw new Exception; - } - - return $this->doNotFailOnPhpunitDeprecation; - } - - /** - * @psalm-assert-if-true !null $this->doNotFailOnPhpunitWarning - */ - public function hasDoNotFailOnPhpunitWarning(): bool - { - return $this->doNotFailOnPhpunitWarning !== null; - } - - /** - * @throws Exception - */ - public function doNotFailOnPhpunitWarning(): bool - { - if (!$this->hasDoNotFailOnPhpunitWarning()) { - throw new Exception; - } - - return $this->doNotFailOnPhpunitWarning; - } - - /** - * @psalm-assert-if-true !null $this->doNotFailOnEmptyTestSuite - */ - public function hasDoNotFailOnEmptyTestSuite(): bool - { - return $this->doNotFailOnEmptyTestSuite !== null; - } - - /** - * @throws Exception - */ - public function doNotFailOnEmptyTestSuite(): bool - { - if (!$this->hasDoNotFailOnEmptyTestSuite()) { - throw new Exception; - } - - return $this->doNotFailOnEmptyTestSuite; - } - - /** - * @psalm-assert-if-true !null $this->doNotFailOnIncomplete - */ - public function hasDoNotFailOnIncomplete(): bool - { - return $this->doNotFailOnIncomplete !== null; - } - - /** - * @throws Exception - */ - public function doNotFailOnIncomplete(): bool - { - if (!$this->hasDoNotFailOnIncomplete()) { - throw new Exception; - } - - return $this->doNotFailOnIncomplete; - } - - /** - * @psalm-assert-if-true !null $this->doNotFailOnNotice - */ - public function hasDoNotFailOnNotice(): bool - { - return $this->doNotFailOnNotice !== null; - } - - /** - * @throws Exception - */ - public function doNotFailOnNotice(): bool - { - if (!$this->hasDoNotFailOnNotice()) { - throw new Exception; - } - - return $this->doNotFailOnNotice; - } - - /** - * @psalm-assert-if-true !null $this->doNotFailOnRisky - */ - public function hasDoNotFailOnRisky(): bool - { - return $this->doNotFailOnRisky !== null; - } - - /** - * @throws Exception - */ - public function doNotFailOnRisky(): bool - { - if (!$this->hasDoNotFailOnRisky()) { - throw new Exception; - } - - return $this->doNotFailOnRisky; - } - - /** - * @psalm-assert-if-true !null $this->doNotFailOnSkipped - */ - public function hasDoNotFailOnSkipped(): bool - { - return $this->doNotFailOnSkipped !== null; - } - - /** - * @throws Exception - */ - public function doNotFailOnSkipped(): bool - { - if (!$this->hasDoNotFailOnSkipped()) { - throw new Exception; - } - - return $this->doNotFailOnSkipped; - } - - /** - * @psalm-assert-if-true !null $this->doNotFailOnWarning - */ - public function hasDoNotFailOnWarning(): bool - { - return $this->doNotFailOnWarning !== null; - } - - /** - * @throws Exception - */ - public function doNotFailOnWarning(): bool - { - if (!$this->hasDoNotFailOnWarning()) { - throw new Exception; - } - - return $this->doNotFailOnWarning; - } - - /** - * @psalm-assert-if-true !null $this->stopOnDefect - */ - public function hasStopOnDefect(): bool - { - return $this->stopOnDefect !== null; - } - - /** - * @throws Exception - */ - public function stopOnDefect(): bool - { - if (!$this->hasStopOnDefect()) { - throw new Exception; - } - - return $this->stopOnDefect; - } - - /** - * @psalm-assert-if-true !null $this->stopOnDeprecation - */ - public function hasStopOnDeprecation(): bool - { - return $this->stopOnDeprecation !== null; - } - - /** - * @throws Exception - */ - public function stopOnDeprecation(): bool - { - if (!$this->hasStopOnDeprecation()) { - throw new Exception; - } - - return $this->stopOnDeprecation; - } - - /** - * @psalm-assert-if-true !null $this->stopOnError - */ - public function hasStopOnError(): bool - { - return $this->stopOnError !== null; - } - - /** - * @throws Exception - */ - public function stopOnError(): bool - { - if (!$this->hasStopOnError()) { - throw new Exception; - } - - return $this->stopOnError; - } - - /** - * @psalm-assert-if-true !null $this->stopOnFailure - */ - public function hasStopOnFailure(): bool - { - return $this->stopOnFailure !== null; - } - - /** - * @throws Exception - */ - public function stopOnFailure(): bool - { - if (!$this->hasStopOnFailure()) { - throw new Exception; - } - - return $this->stopOnFailure; - } - - /** - * @psalm-assert-if-true !null $this->stopOnIncomplete - */ - public function hasStopOnIncomplete(): bool - { - return $this->stopOnIncomplete !== null; - } - - /** - * @throws Exception - */ - public function stopOnIncomplete(): bool - { - if (!$this->hasStopOnIncomplete()) { - throw new Exception; - } - - return $this->stopOnIncomplete; - } - - /** - * @psalm-assert-if-true !null $this->stopOnNotice - */ - public function hasStopOnNotice(): bool - { - return $this->stopOnNotice !== null; - } - - /** - * @throws Exception - */ - public function stopOnNotice(): bool - { - if (!$this->hasStopOnNotice()) { - throw new Exception; - } - - return $this->stopOnNotice; - } - - /** - * @psalm-assert-if-true !null $this->stopOnRisky - */ - public function hasStopOnRisky(): bool - { - return $this->stopOnRisky !== null; - } - - /** - * @throws Exception - */ - public function stopOnRisky(): bool - { - if (!$this->hasStopOnRisky()) { - throw new Exception; - } - - return $this->stopOnRisky; - } - - /** - * @psalm-assert-if-true !null $this->stopOnSkipped - */ - public function hasStopOnSkipped(): bool - { - return $this->stopOnSkipped !== null; - } - - /** - * @throws Exception - */ - public function stopOnSkipped(): bool - { - if (!$this->hasStopOnSkipped()) { - throw new Exception; - } - - return $this->stopOnSkipped; - } - - /** - * @psalm-assert-if-true !null $this->stopOnWarning - */ - public function hasStopOnWarning(): bool - { - return $this->stopOnWarning !== null; - } - - /** - * @throws Exception - */ - public function stopOnWarning(): bool - { - if (!$this->hasStopOnWarning()) { - throw new Exception; - } - - return $this->stopOnWarning; - } - - /** - * @psalm-assert-if-true !null $this->filter - */ - public function hasFilter(): bool - { - return $this->filter !== null; - } - - /** - * @throws Exception - */ - public function filter(): string - { - if (!$this->hasFilter()) { - throw new Exception; - } - - return $this->filter; - } - - /** - * @psalm-assert-if-true !null $this->generateBaseline - */ - public function hasGenerateBaseline(): bool - { - return $this->generateBaseline !== null; - } - - /** - * @throws Exception - */ - public function generateBaseline(): string - { - if (!$this->hasGenerateBaseline()) { - throw new Exception; - } - - return $this->generateBaseline; - } - - /** - * @psalm-assert-if-true !null $this->useBaseline - */ - public function hasUseBaseline(): bool - { - return $this->useBaseline !== null; - } - - /** - * @throws Exception - */ - public function useBaseline(): string - { - if (!$this->hasUseBaseline()) { - throw new Exception; - } - - return $this->useBaseline; - } - - public function ignoreBaseline(): bool - { - return $this->ignoreBaseline; - } - - public function generateConfiguration(): bool - { - return $this->generateConfiguration; - } - - public function migrateConfiguration(): bool - { - return $this->migrateConfiguration; - } - - /** - * @psalm-assert-if-true !null $this->groups - */ - public function hasGroups(): bool - { - return $this->groups !== null; - } - - /** - * @throws Exception - */ - public function groups(): array - { - if (!$this->hasGroups()) { - throw new Exception; - } - - return $this->groups; - } - - /** - * @psalm-assert-if-true !null $this->testsCovering - */ - public function hasTestsCovering(): bool - { - return $this->testsCovering !== null; - } - - /** - * @throws Exception - */ - public function testsCovering(): array - { - if (!$this->hasTestsCovering()) { - throw new Exception; - } - - return $this->testsCovering; - } - - /** - * @psalm-assert-if-true !null $this->testsUsing - */ - public function hasTestsUsing(): bool - { - return $this->testsUsing !== null; - } - - /** - * @throws Exception - */ - public function testsUsing(): array - { - if (!$this->hasTestsUsing()) { - throw new Exception; - } - - return $this->testsUsing; - } - - public function help(): bool - { - return $this->help; - } - - /** - * @psalm-assert-if-true !null $this->includePath - */ - public function hasIncludePath(): bool - { - return $this->includePath !== null; - } - - /** - * @throws Exception - */ - public function includePath(): string - { - if (!$this->hasIncludePath()) { - throw new Exception; - } - - return $this->includePath; - } - - /** - * @psalm-assert-if-true !null $this->iniSettings - */ - public function hasIniSettings(): bool - { - return $this->iniSettings !== null; - } - - /** - * @throws Exception - */ - public function iniSettings(): array - { - if (!$this->hasIniSettings()) { - throw new Exception; - } - - return $this->iniSettings; - } - - /** - * @psalm-assert-if-true !null $this->junitLogfile - */ - public function hasJunitLogfile(): bool - { - return $this->junitLogfile !== null; - } - - /** - * @throws Exception - */ - public function junitLogfile(): string - { - if (!$this->hasJunitLogfile()) { - throw new Exception; - } - - return $this->junitLogfile; - } - - public function listGroups(): bool - { - return $this->listGroups; - } - - public function listSuites(): bool - { - return $this->listSuites; - } - - public function listTests(): bool - { - return $this->listTests; - } - - /** - * @psalm-assert-if-true !null $this->listTestsXml - */ - public function hasListTestsXml(): bool - { - return $this->listTestsXml !== null; - } - - /** - * @throws Exception - */ - public function listTestsXml(): string - { - if (!$this->hasListTestsXml()) { - throw new Exception; - } - - return $this->listTestsXml; - } - - /** - * @psalm-assert-if-true !null $this->noCoverage - */ - public function hasNoCoverage(): bool - { - return $this->noCoverage !== null; - } - - /** - * @throws Exception - */ - public function noCoverage(): bool - { - if (!$this->hasNoCoverage()) { - throw new Exception; - } - - return $this->noCoverage; - } - - /** - * @psalm-assert-if-true !null $this->noExtensions - */ - public function hasNoExtensions(): bool - { - return $this->noExtensions !== null; - } - - /** - * @throws Exception - */ - public function noExtensions(): bool - { - if (!$this->hasNoExtensions()) { - throw new Exception; - } - - return $this->noExtensions; - } - - /** - * @psalm-assert-if-true !null $this->noOutput - */ - public function hasNoOutput(): bool - { - return $this->noOutput !== null; - } - - /** - * @throws Exception - */ - public function noOutput(): bool - { - if ($this->noOutput === null) { - throw new Exception; - } - - return $this->noOutput; - } - - /** - * @psalm-assert-if-true !null $this->noProgress - */ - public function hasNoProgress(): bool - { - return $this->noProgress !== null; - } - - /** - * @throws Exception - */ - public function noProgress(): bool - { - if ($this->noProgress === null) { - throw new Exception; - } - - return $this->noProgress; - } - - /** - * @psalm-assert-if-true !null $this->noResults - */ - public function hasNoResults(): bool - { - return $this->noResults !== null; - } - - /** - * @throws Exception - */ - public function noResults(): bool - { - if ($this->noResults === null) { - throw new Exception; - } - - return $this->noResults; - } - - /** - * @psalm-assert-if-true !null $this->noLogging - */ - public function hasNoLogging(): bool - { - return $this->noLogging !== null; - } - - /** - * @throws Exception - */ - public function noLogging(): bool - { - if (!$this->hasNoLogging()) { - throw new Exception; - } - - return $this->noLogging; - } - - /** - * @psalm-assert-if-true !null $this->processIsolation - */ - public function hasProcessIsolation(): bool - { - return $this->processIsolation !== null; - } - - /** - * @throws Exception - */ - public function processIsolation(): bool - { - if (!$this->hasProcessIsolation()) { - throw new Exception; - } - - return $this->processIsolation; - } - - /** - * @psalm-assert-if-true !null $this->randomOrderSeed - */ - public function hasRandomOrderSeed(): bool - { - return $this->randomOrderSeed !== null; - } - - /** - * @throws Exception - */ - public function randomOrderSeed(): int - { - if (!$this->hasRandomOrderSeed()) { - throw new Exception; - } - - return $this->randomOrderSeed; - } - - /** - * @psalm-assert-if-true !null $this->reportUselessTests - */ - public function hasReportUselessTests(): bool - { - return $this->reportUselessTests !== null; - } - - /** - * @throws Exception - */ - public function reportUselessTests(): bool - { - if (!$this->hasReportUselessTests()) { - throw new Exception; - } - - return $this->reportUselessTests; - } - - /** - * @psalm-assert-if-true !null $this->resolveDependencies - */ - public function hasResolveDependencies(): bool - { - return $this->resolveDependencies !== null; - } - - /** - * @throws Exception - */ - public function resolveDependencies(): bool - { - if (!$this->hasResolveDependencies()) { - throw new Exception; - } - - return $this->resolveDependencies; - } - - /** - * @psalm-assert-if-true !null $this->reverseList - */ - public function hasReverseList(): bool - { - return $this->reverseList !== null; - } - - /** - * @throws Exception - */ - public function reverseList(): bool - { - if (!$this->hasReverseList()) { - throw new Exception; - } - - return $this->reverseList; - } - - /** - * @psalm-assert-if-true !null $this->stderr - */ - public function hasStderr(): bool - { - return $this->stderr !== null; - } - - /** - * @throws Exception - */ - public function stderr(): bool - { - if (!$this->hasStderr()) { - throw new Exception; - } - - return $this->stderr; - } - - /** - * @psalm-assert-if-true !null $this->strictCoverage - */ - public function hasStrictCoverage(): bool - { - return $this->strictCoverage !== null; - } - - /** - * @throws Exception - */ - public function strictCoverage(): bool - { - if (!$this->hasStrictCoverage()) { - throw new Exception; - } - - return $this->strictCoverage; - } - - /** - * @psalm-assert-if-true !null $this->teamcityLogfile - */ - public function hasTeamcityLogfile(): bool - { - return $this->teamcityLogfile !== null; - } - - /** - * @throws Exception - */ - public function teamcityLogfile(): string - { - if (!$this->hasTeamcityLogfile()) { - throw new Exception; - } - - return $this->teamcityLogfile; - } - - /** - * @psalm-assert-if-true !null $this->teamcityPrinter - */ - public function hasTeamCityPrinter(): bool - { - return $this->teamCityPrinter !== null; - } - - /** - * @throws Exception - */ - public function teamCityPrinter(): bool - { - if (!$this->hasTeamCityPrinter()) { - throw new Exception; - } - - return $this->teamCityPrinter; - } - - /** - * @psalm-assert-if-true !null $this->testdoxHtmlFile - */ - public function hasTestdoxHtmlFile(): bool - { - return $this->testdoxHtmlFile !== null; - } - - /** - * @throws Exception - */ - public function testdoxHtmlFile(): string - { - if (!$this->hasTestdoxHtmlFile()) { - throw new Exception; - } - - return $this->testdoxHtmlFile; - } - - /** - * @psalm-assert-if-true !null $this->testdoxTextFile - */ - public function hasTestdoxTextFile(): bool - { - return $this->testdoxTextFile !== null; - } - - /** - * @throws Exception - */ - public function testdoxTextFile(): string - { - if (!$this->hasTestdoxTextFile()) { - throw new Exception; - } - - return $this->testdoxTextFile; - } - - /** - * @psalm-assert-if-true !null $this->testdoxPrinter - */ - public function hasTestDoxPrinter(): bool - { - return $this->testdoxPrinter !== null; - } - - /** - * @throws Exception - */ - public function testdoxPrinter(): bool - { - if (!$this->hasTestdoxPrinter()) { - throw new Exception; - } - - return $this->testdoxPrinter; - } - - /** - * @psalm-assert-if-true !null $this->testSuffixes - */ - public function hasTestSuffixes(): bool - { - return $this->testSuffixes !== null; - } - - /** - * @throws Exception - * - * @psalm-return non-empty-list - */ - public function testSuffixes(): array - { - if (!$this->hasTestSuffixes()) { - throw new Exception; - } - - return $this->testSuffixes; - } - - /** - * @psalm-assert-if-true !null $this->testSuite - */ - public function hasTestSuite(): bool - { - return $this->testSuite !== null; - } - - /** - * @throws Exception - */ - public function testSuite(): string - { - if (!$this->hasTestSuite()) { - throw new Exception; - } - - return $this->testSuite; - } - - /** - * @psalm-assert-if-true !null $this->excludedTestSuite - */ - public function hasExcludedTestSuite(): bool - { - return $this->excludeTestSuite !== null; - } - - /** - * @throws Exception - */ - public function excludedTestSuite(): string - { - if (!$this->hasExcludedTestSuite()) { - throw new Exception; - } - - return $this->excludeTestSuite; - } - - public function useDefaultConfiguration(): bool - { - return $this->useDefaultConfiguration; - } - - /** - * @psalm-assert-if-true !null $this->displayDetailsOnAllIssues - */ - public function hasDisplayDetailsOnAllIssues(): bool - { - return $this->displayDetailsOnAllIssues !== null; - } - - /** - * @throws Exception - */ - public function displayDetailsOnAllIssues(): bool - { - if (!$this->hasDisplayDetailsOnAllIssues()) { - throw new Exception; - } - - return $this->displayDetailsOnAllIssues; - } - - /** - * @psalm-assert-if-true !null $this->displayDetailsOnIncompleteTests - */ - public function hasDisplayDetailsOnIncompleteTests(): bool - { - return $this->displayDetailsOnIncompleteTests !== null; - } - - /** - * @throws Exception - */ - public function displayDetailsOnIncompleteTests(): bool - { - if (!$this->hasDisplayDetailsOnIncompleteTests()) { - throw new Exception; - } - - return $this->displayDetailsOnIncompleteTests; - } - - /** - * @psalm-assert-if-true !null $this->displayDetailsOnSkippedTests - */ - public function hasDisplayDetailsOnSkippedTests(): bool - { - return $this->displayDetailsOnSkippedTests !== null; - } - - /** - * @throws Exception - */ - public function displayDetailsOnSkippedTests(): bool - { - if (!$this->hasDisplayDetailsOnSkippedTests()) { - throw new Exception; - } - - return $this->displayDetailsOnSkippedTests; - } - - /** - * @psalm-assert-if-true !null $this->displayDetailsOnTestsThatTriggerDeprecations - */ - public function hasDisplayDetailsOnTestsThatTriggerDeprecations(): bool - { - return $this->displayDetailsOnTestsThatTriggerDeprecations !== null; - } - - /** - * @throws Exception - */ - public function displayDetailsOnTestsThatTriggerDeprecations(): bool - { - if (!$this->hasDisplayDetailsOnTestsThatTriggerDeprecations()) { - throw new Exception; - } - - return $this->displayDetailsOnTestsThatTriggerDeprecations; - } - - /** - * @psalm-assert-if-true !null $this->displayDetailsOnPhpunitDeprecations - */ - public function hasDisplayDetailsOnPhpunitDeprecations(): bool - { - return $this->displayDetailsOnPhpunitDeprecations !== null; - } - - /** - * @throws Exception - */ - public function displayDetailsOnPhpunitDeprecations(): bool - { - if (!$this->hasDisplayDetailsOnPhpunitDeprecations()) { - throw new Exception; - } - - return $this->displayDetailsOnPhpunitDeprecations; - } - - /** - * @psalm-assert-if-true !null $this->displayDetailsOnTestsThatTriggerErrors - */ - public function hasDisplayDetailsOnTestsThatTriggerErrors(): bool - { - return $this->displayDetailsOnTestsThatTriggerErrors !== null; - } - - /** - * @throws Exception - */ - public function displayDetailsOnTestsThatTriggerErrors(): bool - { - if (!$this->hasDisplayDetailsOnTestsThatTriggerErrors()) { - throw new Exception; - } - - return $this->displayDetailsOnTestsThatTriggerErrors; - } - - /** - * @psalm-assert-if-true !null $this->displayDetailsOnTestsThatTriggerNotices - */ - public function hasDisplayDetailsOnTestsThatTriggerNotices(): bool - { - return $this->displayDetailsOnTestsThatTriggerNotices !== null; - } - - /** - * @throws Exception - */ - public function displayDetailsOnTestsThatTriggerNotices(): bool - { - if (!$this->hasDisplayDetailsOnTestsThatTriggerNotices()) { - throw new Exception; - } - - return $this->displayDetailsOnTestsThatTriggerNotices; - } - - /** - * @psalm-assert-if-true !null $this->displayDetailsOnTestsThatTriggerWarnings - */ - public function hasDisplayDetailsOnTestsThatTriggerWarnings(): bool - { - return $this->displayDetailsOnTestsThatTriggerWarnings !== null; - } - - /** - * @throws Exception - */ - public function displayDetailsOnTestsThatTriggerWarnings(): bool - { - if (!$this->hasDisplayDetailsOnTestsThatTriggerWarnings()) { - throw new Exception; - } - - return $this->displayDetailsOnTestsThatTriggerWarnings; - } - - public function version(): bool - { - return $this->version; - } - - /** - * @psalm-assert-if-true !null $this->logEventsText - */ - public function hasLogEventsText(): bool - { - return $this->logEventsText !== null; - } - - /** - * @throws Exception - */ - public function logEventsText(): string - { - if (!$this->hasLogEventsText()) { - throw new Exception; - } - - return $this->logEventsText; - } - - /** - * @psalm-assert-if-true !null $this->logEventsVerboseText - */ - public function hasLogEventsVerboseText(): bool - { - return $this->logEventsVerboseText !== null; - } - - /** - * @throws Exception - */ - public function logEventsVerboseText(): string - { - if (!$this->hasLogEventsVerboseText()) { - throw new Exception; - } - - return $this->logEventsVerboseText; - } - - public function debug(): bool - { - return $this->debug; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Cli/Exception.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Cli/Exception.php deleted file mode 100644 index 0d9a5a0..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Cli/Exception.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\CliArguments; - -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Exception extends RuntimeException implements \PHPUnit\Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Cli/XmlConfigurationFileFinder.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Cli/XmlConfigurationFileFinder.php deleted file mode 100644 index 03ac43a..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Cli/XmlConfigurationFileFinder.php +++ /dev/null @@ -1,69 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\CliArguments; - -use function getcwd; -use function is_dir; -use function is_file; -use function realpath; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class XmlConfigurationFileFinder -{ - public function find(Configuration $configuration): false|string - { - $useDefaultConfiguration = $configuration->useDefaultConfiguration(); - - if ($configuration->hasConfigurationFile()) { - if (is_dir($configuration->configurationFile())) { - $candidate = $this->configurationFileInDirectory($configuration->configurationFile()); - - if ($candidate !== false) { - return $candidate; - } - - return false; - } - - return $configuration->configurationFile(); - } - - if ($useDefaultConfiguration) { - $candidate = $this->configurationFileInDirectory(getcwd()); - - if ($candidate !== false) { - return $candidate; - } - } - - return false; - } - - private function configurationFileInDirectory(string $directory): false|string - { - $candidates = [ - $directory . '/phpunit.xml', - $directory . '/phpunit.dist.xml', - $directory . '/phpunit.xml.dist', - ]; - - foreach ($candidates as $candidate) { - if (is_file($candidate)) { - return realpath($candidate); - } - } - - return false; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/CodeCoverageFilterRegistry.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/CodeCoverageFilterRegistry.php deleted file mode 100644 index 7051d28..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/CodeCoverageFilterRegistry.php +++ /dev/null @@ -1,78 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use function array_keys; -use function assert; -use SebastianBergmann\CodeCoverage\Filter; - -/** - * CLI options and XML configuration are static within a single PHPUnit process. - * It is therefore okay to use a Singleton registry here. - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class CodeCoverageFilterRegistry -{ - private static ?self $instance = null; - private ?Filter $filter = null; - private bool $configured = false; - - public static function instance(): self - { - if (self::$instance === null) { - self::$instance = new self; - } - - return self::$instance; - } - - /** - * @codeCoverageIgnore - */ - public function get(): Filter - { - assert($this->filter !== null); - - return $this->filter; - } - - /** - * @codeCoverageIgnore - */ - public function init(Configuration $configuration, bool $force = false): void - { - if (!$configuration->hasCoverageReport() && !$force) { - return; - } - - if ($this->configured && !$force) { - return; - } - - $this->filter = new Filter; - - if ($configuration->source()->notEmpty()) { - $this->filter->includeFiles(array_keys((new SourceMapper)->map($configuration->source()))); - - $this->configured = true; - } - } - - /** - * @codeCoverageIgnore - */ - public function configured(): bool - { - return $this->configured; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Configuration.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Configuration.php deleted file mode 100644 index d209425..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Configuration.php +++ /dev/null @@ -1,1393 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -/** - * @psalm-immutable - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class Configuration -{ - public const COLOR_NEVER = 'never'; - public const COLOR_AUTO = 'auto'; - public const COLOR_ALWAYS = 'always'; - public const COLOR_DEFAULT = self::COLOR_NEVER; - - /** - * @psalm-var list - */ - private readonly array $cliArguments; - private readonly ?string $configurationFile; - private readonly ?string $bootstrap; - private readonly bool $cacheResult; - private readonly ?string $cacheDirectory; - private readonly ?string $coverageCacheDirectory; - private readonly Source $source; - private readonly bool $pathCoverage; - private readonly ?string $coverageClover; - private readonly ?string $coverageCobertura; - private readonly ?string $coverageCrap4j; - private readonly int $coverageCrap4jThreshold; - private readonly ?string $coverageHtml; - private readonly int $coverageHtmlLowUpperBound; - private readonly int $coverageHtmlHighLowerBound; - private readonly string $coverageHtmlColorSuccessLow; - private readonly string $coverageHtmlColorSuccessMedium; - private readonly string $coverageHtmlColorSuccessHigh; - private readonly string $coverageHtmlColorWarning; - private readonly string $coverageHtmlColorDanger; - private readonly ?string $coverageHtmlCustomCssFile; - private readonly ?string $coveragePhp; - private readonly ?string $coverageText; - private readonly bool $coverageTextShowUncoveredFiles; - private readonly bool $coverageTextShowOnlySummary; - private readonly ?string $coverageXml; - private readonly string $testResultCacheFile; - private readonly bool $ignoreDeprecatedCodeUnitsFromCodeCoverage; - private readonly bool $disableCodeCoverageIgnore; - private readonly bool $failOnAllIssues; - private readonly bool $failOnDeprecation; - private readonly bool $failOnPhpunitDeprecation; - private readonly bool $failOnPhpunitWarning; - private readonly bool $failOnEmptyTestSuite; - private readonly bool $failOnIncomplete; - private readonly bool $failOnNotice; - private readonly bool $failOnRisky; - private readonly bool $failOnSkipped; - private readonly bool $failOnWarning; - private readonly bool $doNotFailOnDeprecation; - private readonly bool $doNotFailOnPhpunitDeprecation; - private readonly bool $doNotFailOnPhpunitWarning; - private readonly bool $doNotFailOnEmptyTestSuite; - private readonly bool $doNotFailOnIncomplete; - private readonly bool $doNotFailOnNotice; - private readonly bool $doNotFailOnRisky; - private readonly bool $doNotFailOnSkipped; - private readonly bool $doNotFailOnWarning; - private readonly bool $stopOnDefect; - private readonly bool $stopOnDeprecation; - private readonly bool $stopOnError; - private readonly bool $stopOnFailure; - private readonly bool $stopOnIncomplete; - private readonly bool $stopOnNotice; - private readonly bool $stopOnRisky; - private readonly bool $stopOnSkipped; - private readonly bool $stopOnWarning; - private readonly bool $outputToStandardErrorStream; - private readonly int $columns; - private readonly bool $noExtensions; - - /** - * @psalm-var ?non-empty-string - */ - private readonly ?string $pharExtensionDirectory; - - /** - * @psalm-var list}> - */ - private readonly array $extensionBootstrappers; - private readonly bool $backupGlobals; - private readonly bool $backupStaticProperties; - private readonly bool $beStrictAboutChangesToGlobalState; - private readonly bool $colors; - private readonly bool $processIsolation; - private readonly bool $enforceTimeLimit; - private readonly int $defaultTimeLimit; - private readonly int $timeoutForSmallTests; - private readonly int $timeoutForMediumTests; - private readonly int $timeoutForLargeTests; - private readonly bool $reportUselessTests; - private readonly bool $strictCoverage; - private readonly bool $disallowTestOutput; - private readonly bool $displayDetailsOnAllIssues; - private readonly bool $displayDetailsOnIncompleteTests; - private readonly bool $displayDetailsOnSkippedTests; - private readonly bool $displayDetailsOnTestsThatTriggerDeprecations; - private readonly bool $displayDetailsOnPhpunitDeprecations; - private readonly bool $displayDetailsOnTestsThatTriggerErrors; - private readonly bool $displayDetailsOnTestsThatTriggerNotices; - private readonly bool $displayDetailsOnTestsThatTriggerWarnings; - private readonly bool $reverseDefectList; - private readonly bool $requireCoverageMetadata; - private readonly bool $registerMockObjectsFromTestArgumentsRecursively; - private readonly bool $noProgress; - private readonly bool $noResults; - private readonly bool $noOutput; - private readonly int $executionOrder; - private readonly int $executionOrderDefects; - private readonly bool $resolveDependencies; - private readonly ?string $logfileTeamcity; - private readonly ?string $logfileJunit; - private readonly ?string $logfileTestdoxHtml; - private readonly ?string $logfileTestdoxText; - private readonly ?string $logEventsText; - private readonly ?string $logEventsVerboseText; - private readonly ?array $testsCovering; - private readonly ?array $testsUsing; - private readonly bool $teamCityOutput; - private readonly bool $testDoxOutput; - private readonly ?string $filter; - private readonly ?array $groups; - private readonly ?array $excludeGroups; - private readonly int $randomOrderSeed; - private readonly bool $includeUncoveredFiles; - private readonly TestSuiteCollection $testSuite; - private readonly string $includeTestSuite; - private readonly string $excludeTestSuite; - private readonly ?string $defaultTestSuite; - - /** - * @psalm-var non-empty-list - */ - private readonly array $testSuffixes; - private readonly Php $php; - private readonly bool $controlGarbageCollector; - private readonly int $numberOfTestsBeforeGarbageCollection; - private readonly ?string $generateBaseline; - private readonly bool $debug; - - /** - * @psalm-param list $cliArguments - * @psalm-param ?non-empty-string $pharExtensionDirectory - * @psalm-param non-empty-list $testSuffixes - * @psalm-param list}> $extensionBootstrappers - */ - public function __construct(array $cliArguments, ?string $configurationFile, ?string $bootstrap, bool $cacheResult, ?string $cacheDirectory, ?string $coverageCacheDirectory, Source $source, string $testResultCacheFile, ?string $coverageClover, ?string $coverageCobertura, ?string $coverageCrap4j, int $coverageCrap4jThreshold, ?string $coverageHtml, int $coverageHtmlLowUpperBound, int $coverageHtmlHighLowerBound, string $coverageHtmlColorSuccessLow, string $coverageHtmlColorSuccessMedium, string $coverageHtmlColorSuccessHigh, string $coverageHtmlColorWarning, string $coverageHtmlColorDanger, ?string $coverageHtmlCustomCssFile, ?string $coveragePhp, ?string $coverageText, bool $coverageTextShowUncoveredFiles, bool $coverageTextShowOnlySummary, ?string $coverageXml, bool $pathCoverage, bool $ignoreDeprecatedCodeUnitsFromCodeCoverage, bool $disableCodeCoverageIgnore, bool $failOnAllIssues, bool $failOnDeprecation, bool $failOnPhpunitDeprecation, bool $failOnPhpunitWarning, bool $failOnEmptyTestSuite, bool $failOnIncomplete, bool $failOnNotice, bool $failOnRisky, bool $failOnSkipped, bool $failOnWarning, bool $doNotFailOnDeprecation, bool $doNotFailOnPhpunitDeprecation, bool $doNotFailOnPhpunitWarning, bool $doNotFailOnEmptyTestSuite, bool $doNotFailOnIncomplete, bool $doNotFailOnNotice, bool $doNotFailOnRisky, bool $doNotFailOnSkipped, bool $doNotFailOnWarning, bool $stopOnDefect, bool $stopOnDeprecation, bool $stopOnError, bool $stopOnFailure, bool $stopOnIncomplete, bool $stopOnNotice, bool $stopOnRisky, bool $stopOnSkipped, bool $stopOnWarning, bool $outputToStandardErrorStream, int|string $columns, bool $noExtensions, ?string $pharExtensionDirectory, array $extensionBootstrappers, bool $backupGlobals, bool $backupStaticProperties, bool $beStrictAboutChangesToGlobalState, bool $colors, bool $processIsolation, bool $enforceTimeLimit, int $defaultTimeLimit, int $timeoutForSmallTests, int $timeoutForMediumTests, int $timeoutForLargeTests, bool $reportUselessTests, bool $strictCoverage, bool $disallowTestOutput, bool $displayDetailsOnAllIssues, bool $displayDetailsOnIncompleteTests, bool $displayDetailsOnSkippedTests, bool $displayDetailsOnTestsThatTriggerDeprecations, bool $displayDetailsOnPhpunitDeprecations, bool $displayDetailsOnTestsThatTriggerErrors, bool $displayDetailsOnTestsThatTriggerNotices, bool $displayDetailsOnTestsThatTriggerWarnings, bool $reverseDefectList, bool $requireCoverageMetadata, bool $registerMockObjectsFromTestArgumentsRecursively, bool $noProgress, bool $noResults, bool $noOutput, int $executionOrder, int $executionOrderDefects, bool $resolveDependencies, ?string $logfileTeamcity, ?string $logfileJunit, ?string $logfileTestdoxHtml, ?string $logfileTestdoxText, ?string $logEventsText, ?string $logEventsVerboseText, bool $teamCityOutput, bool $testDoxOutput, ?array $testsCovering, ?array $testsUsing, ?string $filter, ?array $groups, ?array $excludeGroups, int $randomOrderSeed, bool $includeUncoveredFiles, TestSuiteCollection $testSuite, string $includeTestSuite, string $excludeTestSuite, ?string $defaultTestSuite, array $testSuffixes, Php $php, bool $controlGarbageCollector, int $numberOfTestsBeforeGarbageCollection, ?string $generateBaseline, bool $debug) - { - $this->cliArguments = $cliArguments; - $this->configurationFile = $configurationFile; - $this->bootstrap = $bootstrap; - $this->cacheResult = $cacheResult; - $this->cacheDirectory = $cacheDirectory; - $this->coverageCacheDirectory = $coverageCacheDirectory; - $this->source = $source; - $this->testResultCacheFile = $testResultCacheFile; - $this->coverageClover = $coverageClover; - $this->coverageCobertura = $coverageCobertura; - $this->coverageCrap4j = $coverageCrap4j; - $this->coverageCrap4jThreshold = $coverageCrap4jThreshold; - $this->coverageHtml = $coverageHtml; - $this->coverageHtmlLowUpperBound = $coverageHtmlLowUpperBound; - $this->coverageHtmlHighLowerBound = $coverageHtmlHighLowerBound; - $this->coverageHtmlColorSuccessLow = $coverageHtmlColorSuccessLow; - $this->coverageHtmlColorSuccessMedium = $coverageHtmlColorSuccessMedium; - $this->coverageHtmlColorSuccessHigh = $coverageHtmlColorSuccessHigh; - $this->coverageHtmlColorWarning = $coverageHtmlColorWarning; - $this->coverageHtmlColorDanger = $coverageHtmlColorDanger; - $this->coverageHtmlCustomCssFile = $coverageHtmlCustomCssFile; - $this->coveragePhp = $coveragePhp; - $this->coverageText = $coverageText; - $this->coverageTextShowUncoveredFiles = $coverageTextShowUncoveredFiles; - $this->coverageTextShowOnlySummary = $coverageTextShowOnlySummary; - $this->coverageXml = $coverageXml; - $this->pathCoverage = $pathCoverage; - $this->ignoreDeprecatedCodeUnitsFromCodeCoverage = $ignoreDeprecatedCodeUnitsFromCodeCoverage; - $this->disableCodeCoverageIgnore = $disableCodeCoverageIgnore; - $this->failOnAllIssues = $failOnAllIssues; - $this->failOnDeprecation = $failOnDeprecation; - $this->failOnPhpunitDeprecation = $failOnPhpunitDeprecation; - $this->failOnPhpunitWarning = $failOnPhpunitWarning; - $this->failOnEmptyTestSuite = $failOnEmptyTestSuite; - $this->failOnIncomplete = $failOnIncomplete; - $this->failOnNotice = $failOnNotice; - $this->failOnRisky = $failOnRisky; - $this->failOnSkipped = $failOnSkipped; - $this->failOnWarning = $failOnWarning; - $this->doNotFailOnDeprecation = $doNotFailOnDeprecation; - $this->doNotFailOnPhpunitDeprecation = $doNotFailOnPhpunitDeprecation; - $this->doNotFailOnPhpunitWarning = $doNotFailOnPhpunitWarning; - $this->doNotFailOnEmptyTestSuite = $doNotFailOnEmptyTestSuite; - $this->doNotFailOnIncomplete = $doNotFailOnIncomplete; - $this->doNotFailOnNotice = $doNotFailOnNotice; - $this->doNotFailOnRisky = $doNotFailOnRisky; - $this->doNotFailOnSkipped = $doNotFailOnSkipped; - $this->doNotFailOnWarning = $doNotFailOnWarning; - $this->stopOnDefect = $stopOnDefect; - $this->stopOnDeprecation = $stopOnDeprecation; - $this->stopOnError = $stopOnError; - $this->stopOnFailure = $stopOnFailure; - $this->stopOnIncomplete = $stopOnIncomplete; - $this->stopOnNotice = $stopOnNotice; - $this->stopOnRisky = $stopOnRisky; - $this->stopOnSkipped = $stopOnSkipped; - $this->stopOnWarning = $stopOnWarning; - $this->outputToStandardErrorStream = $outputToStandardErrorStream; - $this->columns = $columns; - $this->noExtensions = $noExtensions; - $this->pharExtensionDirectory = $pharExtensionDirectory; - $this->extensionBootstrappers = $extensionBootstrappers; - $this->backupGlobals = $backupGlobals; - $this->backupStaticProperties = $backupStaticProperties; - $this->beStrictAboutChangesToGlobalState = $beStrictAboutChangesToGlobalState; - $this->colors = $colors; - $this->processIsolation = $processIsolation; - $this->enforceTimeLimit = $enforceTimeLimit; - $this->defaultTimeLimit = $defaultTimeLimit; - $this->timeoutForSmallTests = $timeoutForSmallTests; - $this->timeoutForMediumTests = $timeoutForMediumTests; - $this->timeoutForLargeTests = $timeoutForLargeTests; - $this->reportUselessTests = $reportUselessTests; - $this->strictCoverage = $strictCoverage; - $this->disallowTestOutput = $disallowTestOutput; - $this->displayDetailsOnAllIssues = $displayDetailsOnAllIssues; - $this->displayDetailsOnIncompleteTests = $displayDetailsOnIncompleteTests; - $this->displayDetailsOnSkippedTests = $displayDetailsOnSkippedTests; - $this->displayDetailsOnTestsThatTriggerDeprecations = $displayDetailsOnTestsThatTriggerDeprecations; - $this->displayDetailsOnPhpunitDeprecations = $displayDetailsOnPhpunitDeprecations; - $this->displayDetailsOnTestsThatTriggerErrors = $displayDetailsOnTestsThatTriggerErrors; - $this->displayDetailsOnTestsThatTriggerNotices = $displayDetailsOnTestsThatTriggerNotices; - $this->displayDetailsOnTestsThatTriggerWarnings = $displayDetailsOnTestsThatTriggerWarnings; - $this->reverseDefectList = $reverseDefectList; - $this->requireCoverageMetadata = $requireCoverageMetadata; - $this->registerMockObjectsFromTestArgumentsRecursively = $registerMockObjectsFromTestArgumentsRecursively; - $this->noProgress = $noProgress; - $this->noResults = $noResults; - $this->noOutput = $noOutput; - $this->executionOrder = $executionOrder; - $this->executionOrderDefects = $executionOrderDefects; - $this->resolveDependencies = $resolveDependencies; - $this->logfileTeamcity = $logfileTeamcity; - $this->logfileJunit = $logfileJunit; - $this->logfileTestdoxHtml = $logfileTestdoxHtml; - $this->logfileTestdoxText = $logfileTestdoxText; - $this->logEventsText = $logEventsText; - $this->logEventsVerboseText = $logEventsVerboseText; - $this->teamCityOutput = $teamCityOutput; - $this->testDoxOutput = $testDoxOutput; - $this->testsCovering = $testsCovering; - $this->testsUsing = $testsUsing; - $this->filter = $filter; - $this->groups = $groups; - $this->excludeGroups = $excludeGroups; - $this->randomOrderSeed = $randomOrderSeed; - $this->includeUncoveredFiles = $includeUncoveredFiles; - $this->testSuite = $testSuite; - $this->includeTestSuite = $includeTestSuite; - $this->excludeTestSuite = $excludeTestSuite; - $this->defaultTestSuite = $defaultTestSuite; - $this->testSuffixes = $testSuffixes; - $this->php = $php; - $this->controlGarbageCollector = $controlGarbageCollector; - $this->numberOfTestsBeforeGarbageCollection = $numberOfTestsBeforeGarbageCollection; - $this->generateBaseline = $generateBaseline; - $this->debug = $debug; - } - - /** - * @psalm-assert-if-true !empty $this->cliArguments - */ - public function hasCliArguments(): bool - { - return !empty($this->cliArguments); - } - - /** - * @psalm-return list - */ - public function cliArguments(): array - { - return $this->cliArguments; - } - - /** - * @psalm-assert-if-true !empty $this->cliArguments - * - * @deprecated Use hasCliArguments() instead - */ - public function hasCliArgument(): bool - { - return !empty($this->cliArguments); - } - - /** - * @throws NoCliArgumentException - * - * @return non-empty-string - * - * @deprecated Use cliArguments()[0] instead - */ - public function cliArgument(): string - { - if (!$this->hasCliArguments()) { - throw new NoCliArgumentException; - } - - return $this->cliArguments[0]; - } - - /** - * @psalm-assert-if-true !null $this->configurationFile - */ - public function hasConfigurationFile(): bool - { - return $this->configurationFile !== null; - } - - /** - * @throws NoConfigurationFileException - */ - public function configurationFile(): string - { - if (!$this->hasConfigurationFile()) { - throw new NoConfigurationFileException; - } - - return $this->configurationFile; - } - - /** - * @psalm-assert-if-true !null $this->bootstrap - */ - public function hasBootstrap(): bool - { - return $this->bootstrap !== null; - } - - /** - * @throws NoBootstrapException - */ - public function bootstrap(): string - { - if (!$this->hasBootstrap()) { - throw new NoBootstrapException; - } - - return $this->bootstrap; - } - - public function cacheResult(): bool - { - return $this->cacheResult; - } - - /** - * @psalm-assert-if-true !null $this->cacheDirectory - */ - public function hasCacheDirectory(): bool - { - return $this->cacheDirectory !== null; - } - - /** - * @throws NoCacheDirectoryException - */ - public function cacheDirectory(): string - { - if (!$this->hasCacheDirectory()) { - throw new NoCacheDirectoryException; - } - - return $this->cacheDirectory; - } - - /** - * @psalm-assert-if-true !null $this->coverageCacheDirectory - */ - public function hasCoverageCacheDirectory(): bool - { - return $this->coverageCacheDirectory !== null; - } - - /** - * @throws NoCoverageCacheDirectoryException - */ - public function coverageCacheDirectory(): string - { - if (!$this->hasCoverageCacheDirectory()) { - throw new NoCoverageCacheDirectoryException; - } - - return $this->coverageCacheDirectory; - } - - public function source(): Source - { - return $this->source; - } - - /** - * @deprecated Use source()->restrictDeprecations() instead - */ - public function restrictDeprecations(): bool - { - return $this->source()->restrictDeprecations(); - } - - /** - * @deprecated Use source()->restrictNotices() instead - */ - public function restrictNotices(): bool - { - return $this->source()->restrictNotices(); - } - - /** - * @deprecated Use source()->restrictWarnings() instead - */ - public function restrictWarnings(): bool - { - return $this->source()->restrictWarnings(); - } - - /** - * @deprecated Use source()->notEmpty() instead - */ - public function hasNonEmptyListOfFilesToBeIncludedInCodeCoverageReport(): bool - { - return $this->source->notEmpty(); - } - - /** - * @deprecated Use source()->includeDirectories() instead - */ - public function coverageIncludeDirectories(): FilterDirectoryCollection - { - return $this->source()->includeDirectories(); - } - - /** - * @deprecated Use source()->includeFiles() instead - */ - public function coverageIncludeFiles(): FileCollection - { - return $this->source()->includeFiles(); - } - - /** - * @deprecated Use source()->excludeDirectories() instead - */ - public function coverageExcludeDirectories(): FilterDirectoryCollection - { - return $this->source()->excludeDirectories(); - } - - /** - * @deprecated Use source()->excludeFiles() instead - */ - public function coverageExcludeFiles(): FileCollection - { - return $this->source()->excludeFiles(); - } - - public function testResultCacheFile(): string - { - return $this->testResultCacheFile; - } - - public function ignoreDeprecatedCodeUnitsFromCodeCoverage(): bool - { - return $this->ignoreDeprecatedCodeUnitsFromCodeCoverage; - } - - public function disableCodeCoverageIgnore(): bool - { - return $this->disableCodeCoverageIgnore; - } - - public function pathCoverage(): bool - { - return $this->pathCoverage; - } - - public function hasCoverageReport(): bool - { - return $this->hasCoverageClover() || - $this->hasCoverageCobertura() || - $this->hasCoverageCrap4j() || - $this->hasCoverageHtml() || - $this->hasCoveragePhp() || - $this->hasCoverageText() || - $this->hasCoverageXml(); - } - - /** - * @psalm-assert-if-true !null $this->coverageClover - */ - public function hasCoverageClover(): bool - { - return $this->coverageClover !== null; - } - - /** - * @throws CodeCoverageReportNotConfiguredException - */ - public function coverageClover(): string - { - if (!$this->hasCoverageClover()) { - throw new CodeCoverageReportNotConfiguredException; - } - - return $this->coverageClover; - } - - /** - * @psalm-assert-if-true !null $this->coverageCobertura - */ - public function hasCoverageCobertura(): bool - { - return $this->coverageCobertura !== null; - } - - /** - * @throws CodeCoverageReportNotConfiguredException - */ - public function coverageCobertura(): string - { - if (!$this->hasCoverageCobertura()) { - throw new CodeCoverageReportNotConfiguredException; - } - - return $this->coverageCobertura; - } - - /** - * @psalm-assert-if-true !null $this->coverageCrap4j - */ - public function hasCoverageCrap4j(): bool - { - return $this->coverageCrap4j !== null; - } - - /** - * @throws CodeCoverageReportNotConfiguredException - */ - public function coverageCrap4j(): string - { - if (!$this->hasCoverageCrap4j()) { - throw new CodeCoverageReportNotConfiguredException; - } - - return $this->coverageCrap4j; - } - - public function coverageCrap4jThreshold(): int - { - return $this->coverageCrap4jThreshold; - } - - /** - * @psalm-assert-if-true !null $this->coverageHtml - */ - public function hasCoverageHtml(): bool - { - return $this->coverageHtml !== null; - } - - /** - * @throws CodeCoverageReportNotConfiguredException - */ - public function coverageHtml(): string - { - if (!$this->hasCoverageHtml()) { - throw new CodeCoverageReportNotConfiguredException; - } - - return $this->coverageHtml; - } - - public function coverageHtmlLowUpperBound(): int - { - return $this->coverageHtmlLowUpperBound; - } - - public function coverageHtmlHighLowerBound(): int - { - return $this->coverageHtmlHighLowerBound; - } - - public function coverageHtmlColorSuccessLow(): string - { - return $this->coverageHtmlColorSuccessLow; - } - - public function coverageHtmlColorSuccessMedium(): string - { - return $this->coverageHtmlColorSuccessMedium; - } - - public function coverageHtmlColorSuccessHigh(): string - { - return $this->coverageHtmlColorSuccessHigh; - } - - public function coverageHtmlColorWarning(): string - { - return $this->coverageHtmlColorWarning; - } - - public function coverageHtmlColorDanger(): string - { - return $this->coverageHtmlColorDanger; - } - - /** - * @psalm-assert-if-true !null $this->coverageHtmlCustomCssFile - */ - public function hasCoverageHtmlCustomCssFile(): bool - { - return $this->coverageHtmlCustomCssFile !== null; - } - - /** - * @throws NoCustomCssFileException - */ - public function coverageHtmlCustomCssFile(): string - { - if (!$this->hasCoverageHtmlCustomCssFile()) { - throw new NoCustomCssFileException; - } - - return $this->coverageHtmlCustomCssFile; - } - - /** - * @psalm-assert-if-true !null $this->coveragePhp - */ - public function hasCoveragePhp(): bool - { - return $this->coveragePhp !== null; - } - - /** - * @throws CodeCoverageReportNotConfiguredException - */ - public function coveragePhp(): string - { - if (!$this->hasCoveragePhp()) { - throw new CodeCoverageReportNotConfiguredException; - } - - return $this->coveragePhp; - } - - /** - * @psalm-assert-if-true !null $this->coverageText - */ - public function hasCoverageText(): bool - { - return $this->coverageText !== null; - } - - /** - * @throws CodeCoverageReportNotConfiguredException - */ - public function coverageText(): string - { - if (!$this->hasCoverageText()) { - throw new CodeCoverageReportNotConfiguredException; - } - - return $this->coverageText; - } - - public function coverageTextShowUncoveredFiles(): bool - { - return $this->coverageTextShowUncoveredFiles; - } - - public function coverageTextShowOnlySummary(): bool - { - return $this->coverageTextShowOnlySummary; - } - - /** - * @psalm-assert-if-true !null $this->coverageXml - */ - public function hasCoverageXml(): bool - { - return $this->coverageXml !== null; - } - - /** - * @throws CodeCoverageReportNotConfiguredException - */ - public function coverageXml(): string - { - if (!$this->hasCoverageXml()) { - throw new CodeCoverageReportNotConfiguredException; - } - - return $this->coverageXml; - } - - public function failOnAllIssues(): bool - { - return $this->failOnAllIssues; - } - - public function failOnDeprecation(): bool - { - return $this->failOnDeprecation; - } - - public function failOnPhpunitDeprecation(): bool - { - return $this->failOnPhpunitDeprecation; - } - - public function failOnPhpunitWarning(): bool - { - return $this->failOnPhpunitWarning; - } - - public function failOnEmptyTestSuite(): bool - { - return $this->failOnEmptyTestSuite; - } - - public function failOnIncomplete(): bool - { - return $this->failOnIncomplete; - } - - public function failOnNotice(): bool - { - return $this->failOnNotice; - } - - public function failOnRisky(): bool - { - return $this->failOnRisky; - } - - public function failOnSkipped(): bool - { - return $this->failOnSkipped; - } - - public function failOnWarning(): bool - { - return $this->failOnWarning; - } - - public function doNotFailOnDeprecation(): bool - { - return $this->doNotFailOnDeprecation; - } - - public function doNotFailOnPhpunitDeprecation(): bool - { - return $this->doNotFailOnPhpunitDeprecation; - } - - public function doNotFailOnPhpunitWarning(): bool - { - return $this->doNotFailOnPhpunitWarning; - } - - public function doNotFailOnEmptyTestSuite(): bool - { - return $this->doNotFailOnEmptyTestSuite; - } - - public function doNotFailOnIncomplete(): bool - { - return $this->doNotFailOnIncomplete; - } - - public function doNotFailOnNotice(): bool - { - return $this->doNotFailOnNotice; - } - - public function doNotFailOnRisky(): bool - { - return $this->doNotFailOnRisky; - } - - public function doNotFailOnSkipped(): bool - { - return $this->doNotFailOnSkipped; - } - - public function doNotFailOnWarning(): bool - { - return $this->doNotFailOnWarning; - } - - public function stopOnDefect(): bool - { - return $this->stopOnDefect; - } - - public function stopOnDeprecation(): bool - { - return $this->stopOnDeprecation; - } - - public function stopOnError(): bool - { - return $this->stopOnError; - } - - public function stopOnFailure(): bool - { - return $this->stopOnFailure; - } - - public function stopOnIncomplete(): bool - { - return $this->stopOnIncomplete; - } - - public function stopOnNotice(): bool - { - return $this->stopOnNotice; - } - - public function stopOnRisky(): bool - { - return $this->stopOnRisky; - } - - public function stopOnSkipped(): bool - { - return $this->stopOnSkipped; - } - - public function stopOnWarning(): bool - { - return $this->stopOnWarning; - } - - public function outputToStandardErrorStream(): bool - { - return $this->outputToStandardErrorStream; - } - - public function columns(): int - { - return $this->columns; - } - - /** - * @deprecated Use noExtensions() instead - */ - public function loadPharExtensions(): bool - { - return $this->noExtensions; - } - - public function noExtensions(): bool - { - return $this->noExtensions; - } - - /** - * @psalm-assert-if-true !null $this->pharExtensionDirectory - */ - public function hasPharExtensionDirectory(): bool - { - return $this->pharExtensionDirectory !== null; - } - - /** - * @throws NoPharExtensionDirectoryException - * - * @psalm-return non-empty-string - */ - public function pharExtensionDirectory(): string - { - if (!$this->hasPharExtensionDirectory()) { - throw new NoPharExtensionDirectoryException; - } - - return $this->pharExtensionDirectory; - } - - /** - * @psalm-return list}> - */ - public function extensionBootstrappers(): array - { - return $this->extensionBootstrappers; - } - - public function backupGlobals(): bool - { - return $this->backupGlobals; - } - - public function backupStaticProperties(): bool - { - return $this->backupStaticProperties; - } - - public function beStrictAboutChangesToGlobalState(): bool - { - return $this->beStrictAboutChangesToGlobalState; - } - - public function colors(): bool - { - return $this->colors; - } - - public function processIsolation(): bool - { - return $this->processIsolation; - } - - public function enforceTimeLimit(): bool - { - return $this->enforceTimeLimit; - } - - public function defaultTimeLimit(): int - { - return $this->defaultTimeLimit; - } - - public function timeoutForSmallTests(): int - { - return $this->timeoutForSmallTests; - } - - public function timeoutForMediumTests(): int - { - return $this->timeoutForMediumTests; - } - - public function timeoutForLargeTests(): int - { - return $this->timeoutForLargeTests; - } - - public function reportUselessTests(): bool - { - return $this->reportUselessTests; - } - - public function strictCoverage(): bool - { - return $this->strictCoverage; - } - - public function disallowTestOutput(): bool - { - return $this->disallowTestOutput; - } - - public function displayDetailsOnAllIssues(): bool - { - return $this->displayDetailsOnAllIssues; - } - - public function displayDetailsOnIncompleteTests(): bool - { - return $this->displayDetailsOnIncompleteTests; - } - - public function displayDetailsOnSkippedTests(): bool - { - return $this->displayDetailsOnSkippedTests; - } - - public function displayDetailsOnTestsThatTriggerDeprecations(): bool - { - return $this->displayDetailsOnTestsThatTriggerDeprecations; - } - - public function displayDetailsOnPhpunitDeprecations(): bool - { - return $this->displayDetailsOnPhpunitDeprecations; - } - - public function displayDetailsOnTestsThatTriggerErrors(): bool - { - return $this->displayDetailsOnTestsThatTriggerErrors; - } - - public function displayDetailsOnTestsThatTriggerNotices(): bool - { - return $this->displayDetailsOnTestsThatTriggerNotices; - } - - public function displayDetailsOnTestsThatTriggerWarnings(): bool - { - return $this->displayDetailsOnTestsThatTriggerWarnings; - } - - public function reverseDefectList(): bool - { - return $this->reverseDefectList; - } - - public function requireCoverageMetadata(): bool - { - return $this->requireCoverageMetadata; - } - - /** - * @deprecated - */ - public function registerMockObjectsFromTestArgumentsRecursively(): bool - { - return $this->registerMockObjectsFromTestArgumentsRecursively; - } - - public function noProgress(): bool - { - return $this->noProgress; - } - - public function noResults(): bool - { - return $this->noResults; - } - - public function noOutput(): bool - { - return $this->noOutput; - } - - public function executionOrder(): int - { - return $this->executionOrder; - } - - public function executionOrderDefects(): int - { - return $this->executionOrderDefects; - } - - public function resolveDependencies(): bool - { - return $this->resolveDependencies; - } - - /** - * @psalm-assert-if-true !null $this->logfileTeamcity - */ - public function hasLogfileTeamcity(): bool - { - return $this->logfileTeamcity !== null; - } - - /** - * @throws LoggingNotConfiguredException - */ - public function logfileTeamcity(): string - { - if (!$this->hasLogfileTeamcity()) { - throw new LoggingNotConfiguredException; - } - - return $this->logfileTeamcity; - } - - /** - * @psalm-assert-if-true !null $this->logfileJunit - */ - public function hasLogfileJunit(): bool - { - return $this->logfileJunit !== null; - } - - /** - * @throws LoggingNotConfiguredException - */ - public function logfileJunit(): string - { - if (!$this->hasLogfileJunit()) { - throw new LoggingNotConfiguredException; - } - - return $this->logfileJunit; - } - - /** - * @psalm-assert-if-true !null $this->logfileTestdoxHtml - */ - public function hasLogfileTestdoxHtml(): bool - { - return $this->logfileTestdoxHtml !== null; - } - - /** - * @throws LoggingNotConfiguredException - */ - public function logfileTestdoxHtml(): string - { - if (!$this->hasLogfileTestdoxHtml()) { - throw new LoggingNotConfiguredException; - } - - return $this->logfileTestdoxHtml; - } - - /** - * @psalm-assert-if-true !null $this->logfileTestdoxText - */ - public function hasLogfileTestdoxText(): bool - { - return $this->logfileTestdoxText !== null; - } - - /** - * @throws LoggingNotConfiguredException - */ - public function logfileTestdoxText(): string - { - if (!$this->hasLogfileTestdoxText()) { - throw new LoggingNotConfiguredException; - } - - return $this->logfileTestdoxText; - } - - /** - * @psalm-assert-if-true !null $this->logEventsText - */ - public function hasLogEventsText(): bool - { - return $this->logEventsText !== null; - } - - /** - * @throws LoggingNotConfiguredException - */ - public function logEventsText(): string - { - if (!$this->hasLogEventsText()) { - throw new LoggingNotConfiguredException; - } - - return $this->logEventsText; - } - - /** - * @psalm-assert-if-true !null $this->logEventsVerboseText - */ - public function hasLogEventsVerboseText(): bool - { - return $this->logEventsVerboseText !== null; - } - - /** - * @throws LoggingNotConfiguredException - */ - public function logEventsVerboseText(): string - { - if (!$this->hasLogEventsVerboseText()) { - throw new LoggingNotConfiguredException; - } - - return $this->logEventsVerboseText; - } - - public function outputIsTeamCity(): bool - { - return $this->teamCityOutput; - } - - public function outputIsTestDox(): bool - { - return $this->testDoxOutput; - } - - /** - * @psalm-assert-if-true !empty $this->testsCovering - */ - public function hasTestsCovering(): bool - { - return !empty($this->testsCovering); - } - - /** - * @throws FilterNotConfiguredException - * - * @psalm-return list - */ - public function testsCovering(): array - { - if (!$this->hasTestsCovering()) { - throw new FilterNotConfiguredException; - } - - return $this->testsCovering; - } - - /** - * @psalm-assert-if-true !empty $this->testsUsing - */ - public function hasTestsUsing(): bool - { - return !empty($this->testsUsing); - } - - /** - * @throws FilterNotConfiguredException - * - * @psalm-return list - */ - public function testsUsing(): array - { - if (!$this->hasTestsUsing()) { - throw new FilterNotConfiguredException; - } - - return $this->testsUsing; - } - - /** - * @psalm-assert-if-true !null $this->filter - */ - public function hasFilter(): bool - { - return $this->filter !== null; - } - - /** - * @throws FilterNotConfiguredException - */ - public function filter(): string - { - if (!$this->hasFilter()) { - throw new FilterNotConfiguredException; - } - - return $this->filter; - } - - /** - * @psalm-assert-if-true !empty $this->groups - */ - public function hasGroups(): bool - { - return !empty($this->groups); - } - - /** - * @throws FilterNotConfiguredException - */ - public function groups(): array - { - if (!$this->hasGroups()) { - throw new FilterNotConfiguredException; - } - - return $this->groups; - } - - /** - * @psalm-assert-if-true !empty $this->excludeGroups - */ - public function hasExcludeGroups(): bool - { - return !empty($this->excludeGroups); - } - - /** - * @throws FilterNotConfiguredException - */ - public function excludeGroups(): array - { - if (!$this->hasExcludeGroups()) { - throw new FilterNotConfiguredException; - } - - return $this->excludeGroups; - } - - public function randomOrderSeed(): int - { - return $this->randomOrderSeed; - } - - public function includeUncoveredFiles(): bool - { - return $this->includeUncoveredFiles; - } - - public function testSuite(): TestSuiteCollection - { - return $this->testSuite; - } - - public function includeTestSuite(): string - { - return $this->includeTestSuite; - } - - public function excludeTestSuite(): string - { - return $this->excludeTestSuite; - } - - /** - * @psalm-assert-if-true !null $this->defaultTestSuite - */ - public function hasDefaultTestSuite(): bool - { - return $this->defaultTestSuite !== null; - } - - /** - * @throws NoDefaultTestSuiteException - */ - public function defaultTestSuite(): string - { - if (!$this->hasDefaultTestSuite()) { - throw new NoDefaultTestSuiteException; - } - - return $this->defaultTestSuite; - } - - /** - * @psalm-return non-empty-list - */ - public function testSuffixes(): array - { - return $this->testSuffixes; - } - - public function php(): Php - { - return $this->php; - } - - public function controlGarbageCollector(): bool - { - return $this->controlGarbageCollector; - } - - public function numberOfTestsBeforeGarbageCollection(): int - { - return $this->numberOfTestsBeforeGarbageCollection; - } - - /** - * @psalm-assert-if-true !null $this->generateBaseline - */ - public function hasGenerateBaseline(): bool - { - return $this->generateBaseline !== null; - } - - /** - * @throws NoBaselineException - */ - public function generateBaseline(): string - { - if (!$this->hasGenerateBaseline()) { - throw new NoBaselineException; - } - - return $this->generateBaseline; - } - - public function debug(): bool - { - return $this->debug; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/CannotFindSchemaException.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/CannotFindSchemaException.php deleted file mode 100644 index 6eef052..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/CannotFindSchemaException.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use PHPUnit\TextUI\Configuration\Exception; -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class CannotFindSchemaException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/CodeCoverageReportNotConfiguredException.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/CodeCoverageReportNotConfiguredException.php deleted file mode 100644 index 83faa0a..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/CodeCoverageReportNotConfiguredException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class CodeCoverageReportNotConfiguredException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/ConfigurationCannotBeBuiltException.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/ConfigurationCannotBeBuiltException.php deleted file mode 100644 index e95e094..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/ConfigurationCannotBeBuiltException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ConfigurationCannotBeBuiltException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/Exception.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/Exception.php deleted file mode 100644 index dc49125..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/Exception.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This interface is not covered by the backward compatibility promise for PHPUnit - */ -interface Exception extends \PHPUnit\TextUI\Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/FilterNotConfiguredException.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/FilterNotConfiguredException.php deleted file mode 100644 index 5ae4331..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/FilterNotConfiguredException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class FilterNotConfiguredException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/LoggingNotConfiguredException.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/LoggingNotConfiguredException.php deleted file mode 100644 index 63cf9b0..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/LoggingNotConfiguredException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class LoggingNotConfiguredException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoBaselineException.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoBaselineException.php deleted file mode 100644 index 7611dce..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoBaselineException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class NoBaselineException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoBootstrapException.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoBootstrapException.php deleted file mode 100644 index ff1bddf..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoBootstrapException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class NoBootstrapException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCacheDirectoryException.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCacheDirectoryException.php deleted file mode 100644 index 215fe21..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCacheDirectoryException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class NoCacheDirectoryException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCliArgumentException.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCliArgumentException.php deleted file mode 100644 index 42ed0d4..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCliArgumentException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class NoCliArgumentException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoConfigurationFileException.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoConfigurationFileException.php deleted file mode 100644 index f8ceb80..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoConfigurationFileException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class NoConfigurationFileException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCoverageCacheDirectoryException.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCoverageCacheDirectoryException.php deleted file mode 100644 index 113950b..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCoverageCacheDirectoryException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class NoCoverageCacheDirectoryException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCustomCssFileException.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCustomCssFileException.php deleted file mode 100644 index e524c8d..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCustomCssFileException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class NoCustomCssFileException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoDefaultTestSuiteException.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoDefaultTestSuiteException.php deleted file mode 100644 index 96e7a7a..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoDefaultTestSuiteException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class NoDefaultTestSuiteException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoPharExtensionDirectoryException.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoPharExtensionDirectoryException.php deleted file mode 100644 index ce573ca..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoPharExtensionDirectoryException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class NoPharExtensionDirectoryException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Merger.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Merger.php deleted file mode 100644 index 3768ff3..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Merger.php +++ /dev/null @@ -1,963 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use const DIRECTORY_SEPARATOR; -use const PATH_SEPARATOR; -use function array_diff; -use function assert; -use function dirname; -use function explode; -use function is_int; -use function realpath; -use function time; -use PHPUnit\Event\Facade as EventFacade; -use PHPUnit\Runner\TestSuiteSorter; -use PHPUnit\TextUI\CliArguments\Configuration as CliConfiguration; -use PHPUnit\TextUI\CliArguments\Exception; -use PHPUnit\TextUI\XmlConfiguration\Configuration as XmlConfiguration; -use PHPUnit\TextUI\XmlConfiguration\LoadedFromFileConfiguration; -use PHPUnit\TextUI\XmlConfiguration\SchemaDetector; -use PHPUnit\Util\Filesystem; -use SebastianBergmann\CodeCoverage\Report\Html\Colors; -use SebastianBergmann\CodeCoverage\Report\Thresholds; -use SebastianBergmann\Environment\Console; -use SebastianBergmann\Invoker\Invoker; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Merger -{ - /** - * @throws \PHPUnit\TextUI\XmlConfiguration\Exception - * @throws Exception - * @throws NoCustomCssFileException - */ - public function merge(CliConfiguration $cliConfiguration, XmlConfiguration $xmlConfiguration): Configuration - { - $configurationFile = null; - - if ($xmlConfiguration->wasLoadedFromFile()) { - assert($xmlConfiguration instanceof LoadedFromFileConfiguration); - - $configurationFile = $xmlConfiguration->filename(); - } - - $bootstrap = null; - - if ($cliConfiguration->hasBootstrap()) { - $bootstrap = $cliConfiguration->bootstrap(); - } elseif ($xmlConfiguration->phpunit()->hasBootstrap()) { - $bootstrap = $xmlConfiguration->phpunit()->bootstrap(); - } - - if ($cliConfiguration->hasCacheResult()) { - $cacheResult = $cliConfiguration->cacheResult(); - } else { - $cacheResult = $xmlConfiguration->phpunit()->cacheResult(); - } - - $cacheDirectory = null; - $coverageCacheDirectory = null; - - if ($cliConfiguration->hasCacheDirectory() && Filesystem::createDirectory($cliConfiguration->cacheDirectory())) { - $cacheDirectory = realpath($cliConfiguration->cacheDirectory()); - } elseif ($xmlConfiguration->phpunit()->hasCacheDirectory() && Filesystem::createDirectory($xmlConfiguration->phpunit()->cacheDirectory())) { - $cacheDirectory = realpath($xmlConfiguration->phpunit()->cacheDirectory()); - } - - if ($cacheDirectory !== null) { - $coverageCacheDirectory = $cacheDirectory . DIRECTORY_SEPARATOR . 'code-coverage'; - $testResultCacheFile = $cacheDirectory . DIRECTORY_SEPARATOR . 'test-results'; - } - - if ($coverageCacheDirectory === null) { - if ($cliConfiguration->hasCoverageCacheDirectory() && Filesystem::createDirectory($cliConfiguration->coverageCacheDirectory())) { - $coverageCacheDirectory = realpath($cliConfiguration->coverageCacheDirectory()); - } elseif ($xmlConfiguration->codeCoverage()->hasCacheDirectory()) { - $coverageCacheDirectory = $xmlConfiguration->codeCoverage()->cacheDirectory()->path(); - } - } - - if (!isset($testResultCacheFile)) { - if ($cliConfiguration->hasCacheResultFile()) { - $testResultCacheFile = $cliConfiguration->cacheResultFile(); - } elseif ($xmlConfiguration->phpunit()->hasCacheResultFile()) { - $testResultCacheFile = $xmlConfiguration->phpunit()->cacheResultFile(); - } elseif ($xmlConfiguration->wasLoadedFromFile()) { - $testResultCacheFile = dirname(realpath($xmlConfiguration->filename())) . DIRECTORY_SEPARATOR . '.phpunit.result.cache'; - } else { - $candidate = realpath($_SERVER['PHP_SELF']); - - if ($candidate) { - $testResultCacheFile = dirname($candidate) . DIRECTORY_SEPARATOR . '.phpunit.result.cache'; - } else { - $testResultCacheFile = '.phpunit.result.cache'; - } - } - } - - if ($cliConfiguration->hasDisableCodeCoverageIgnore()) { - $disableCodeCoverageIgnore = $cliConfiguration->disableCodeCoverageIgnore(); - } else { - $disableCodeCoverageIgnore = $xmlConfiguration->codeCoverage()->disableCodeCoverageIgnore(); - } - - if ($cliConfiguration->hasFailOnAllIssues()) { - $failOnAllIssues = $cliConfiguration->failOnAllIssues(); - } else { - $failOnAllIssues = $xmlConfiguration->phpunit()->failOnAllIssues(); - } - - if ($cliConfiguration->hasFailOnDeprecation()) { - $failOnDeprecation = $cliConfiguration->failOnDeprecation(); - } else { - $failOnDeprecation = $xmlConfiguration->phpunit()->failOnDeprecation(); - } - - if ($cliConfiguration->hasFailOnPhpunitDeprecation()) { - $failOnPhpunitDeprecation = $cliConfiguration->failOnPhpunitDeprecation(); - } else { - $failOnPhpunitDeprecation = $xmlConfiguration->phpunit()->failOnPhpunitDeprecation(); - } - - if ($cliConfiguration->hasFailOnPhpunitWarning()) { - $failOnPhpunitWarning = $cliConfiguration->failOnPhpunitWarning(); - } else { - $failOnPhpunitWarning = $xmlConfiguration->phpunit()->failOnPhpunitWarning(); - } - - if ($cliConfiguration->hasFailOnEmptyTestSuite()) { - $failOnEmptyTestSuite = $cliConfiguration->failOnEmptyTestSuite(); - } else { - $failOnEmptyTestSuite = $xmlConfiguration->phpunit()->failOnEmptyTestSuite(); - } - - if ($cliConfiguration->hasFailOnIncomplete()) { - $failOnIncomplete = $cliConfiguration->failOnIncomplete(); - } else { - $failOnIncomplete = $xmlConfiguration->phpunit()->failOnIncomplete(); - } - - if ($cliConfiguration->hasFailOnNotice()) { - $failOnNotice = $cliConfiguration->failOnNotice(); - } else { - $failOnNotice = $xmlConfiguration->phpunit()->failOnNotice(); - } - - if ($cliConfiguration->hasFailOnRisky()) { - $failOnRisky = $cliConfiguration->failOnRisky(); - } else { - $failOnRisky = $xmlConfiguration->phpunit()->failOnRisky(); - } - - if ($cliConfiguration->hasFailOnSkipped()) { - $failOnSkipped = $cliConfiguration->failOnSkipped(); - } else { - $failOnSkipped = $xmlConfiguration->phpunit()->failOnSkipped(); - } - - if ($cliConfiguration->hasFailOnWarning()) { - $failOnWarning = $cliConfiguration->failOnWarning(); - } else { - $failOnWarning = $xmlConfiguration->phpunit()->failOnWarning(); - } - - $doNotFailOnDeprecation = false; - - if ($cliConfiguration->hasDoNotFailOnDeprecation()) { - $doNotFailOnDeprecation = $cliConfiguration->doNotFailOnDeprecation(); - } - - $doNotFailOnPhpunitDeprecation = false; - - if ($cliConfiguration->hasDoNotFailOnPhpunitDeprecation()) { - $doNotFailOnPhpunitDeprecation = $cliConfiguration->doNotFailOnPhpunitDeprecation(); - } - - $doNotFailOnPhpunitWarning = false; - - if ($cliConfiguration->hasDoNotFailOnPhpunitWarning()) { - $doNotFailOnPhpunitWarning = $cliConfiguration->doNotFailOnPhpunitWarning(); - } - - $doNotFailOnEmptyTestSuite = false; - - if ($cliConfiguration->hasDoNotFailOnEmptyTestSuite()) { - $doNotFailOnEmptyTestSuite = $cliConfiguration->doNotFailOnEmptyTestSuite(); - } - - $doNotFailOnIncomplete = false; - - if ($cliConfiguration->hasDoNotFailOnIncomplete()) { - $doNotFailOnIncomplete = $cliConfiguration->doNotFailOnIncomplete(); - } - - $doNotFailOnNotice = false; - - if ($cliConfiguration->hasDoNotFailOnNotice()) { - $doNotFailOnNotice = $cliConfiguration->doNotFailOnNotice(); - } - - $doNotFailOnRisky = false; - - if ($cliConfiguration->hasDoNotFailOnRisky()) { - $doNotFailOnRisky = $cliConfiguration->doNotFailOnRisky(); - } - - $doNotFailOnSkipped = false; - - if ($cliConfiguration->hasDoNotFailOnSkipped()) { - $doNotFailOnSkipped = $cliConfiguration->doNotFailOnSkipped(); - } - - $doNotFailOnWarning = false; - - if ($cliConfiguration->hasDoNotFailOnWarning()) { - $doNotFailOnWarning = $cliConfiguration->doNotFailOnWarning(); - } - - if ($cliConfiguration->hasStopOnDefect()) { - $stopOnDefect = $cliConfiguration->stopOnDefect(); - } else { - $stopOnDefect = $xmlConfiguration->phpunit()->stopOnDefect(); - } - - if ($cliConfiguration->hasStopOnDeprecation()) { - $stopOnDeprecation = $cliConfiguration->stopOnDeprecation(); - } else { - $stopOnDeprecation = $xmlConfiguration->phpunit()->stopOnDeprecation(); - } - - if ($cliConfiguration->hasStopOnError()) { - $stopOnError = $cliConfiguration->stopOnError(); - } else { - $stopOnError = $xmlConfiguration->phpunit()->stopOnError(); - } - - if ($cliConfiguration->hasStopOnFailure()) { - $stopOnFailure = $cliConfiguration->stopOnFailure(); - } else { - $stopOnFailure = $xmlConfiguration->phpunit()->stopOnFailure(); - } - - if ($cliConfiguration->hasStopOnIncomplete()) { - $stopOnIncomplete = $cliConfiguration->stopOnIncomplete(); - } else { - $stopOnIncomplete = $xmlConfiguration->phpunit()->stopOnIncomplete(); - } - - if ($cliConfiguration->hasStopOnNotice()) { - $stopOnNotice = $cliConfiguration->stopOnNotice(); - } else { - $stopOnNotice = $xmlConfiguration->phpunit()->stopOnNotice(); - } - - if ($cliConfiguration->hasStopOnRisky()) { - $stopOnRisky = $cliConfiguration->stopOnRisky(); - } else { - $stopOnRisky = $xmlConfiguration->phpunit()->stopOnRisky(); - } - - if ($cliConfiguration->hasStopOnSkipped()) { - $stopOnSkipped = $cliConfiguration->stopOnSkipped(); - } else { - $stopOnSkipped = $xmlConfiguration->phpunit()->stopOnSkipped(); - } - - if ($cliConfiguration->hasStopOnWarning()) { - $stopOnWarning = $cliConfiguration->stopOnWarning(); - } else { - $stopOnWarning = $xmlConfiguration->phpunit()->stopOnWarning(); - } - - if ($cliConfiguration->hasStderr() && $cliConfiguration->stderr()) { - $outputToStandardErrorStream = true; - } else { - $outputToStandardErrorStream = $xmlConfiguration->phpunit()->stderr(); - } - - if ($cliConfiguration->hasColumns()) { - $columns = $cliConfiguration->columns(); - } else { - $columns = $xmlConfiguration->phpunit()->columns(); - } - - if ($columns === 'max') { - $columns = (new Console)->getNumberOfColumns(); - } - - if ($columns < 16) { - $columns = 16; - - EventFacade::emitter()->testRunnerTriggeredPhpunitWarning( - 'Less than 16 columns requested, number of columns set to 16', - ); - } - - assert(is_int($columns)); - - $noExtensions = false; - - if ($cliConfiguration->hasNoExtensions() && $cliConfiguration->noExtensions()) { - $noExtensions = true; - } - - $pharExtensionDirectory = null; - - if ($xmlConfiguration->phpunit()->hasExtensionsDirectory()) { - $pharExtensionDirectory = $xmlConfiguration->phpunit()->extensionsDirectory(); - } - - $extensionBootstrappers = []; - - foreach ($xmlConfiguration->extensions() as $extension) { - $extensionBootstrappers[] = [ - 'className' => $extension->className(), - 'parameters' => $extension->parameters(), - ]; - } - - if ($cliConfiguration->hasPathCoverage() && $cliConfiguration->pathCoverage()) { - $pathCoverage = $cliConfiguration->pathCoverage(); - } else { - $pathCoverage = $xmlConfiguration->codeCoverage()->pathCoverage(); - } - - $defaultColors = Colors::default(); - $defaultThresholds = Thresholds::default(); - - $coverageClover = null; - $coverageCobertura = null; - $coverageCrap4j = null; - $coverageCrap4jThreshold = 30; - $coverageHtml = null; - $coverageHtmlLowUpperBound = $defaultThresholds->lowUpperBound(); - $coverageHtmlHighLowerBound = $defaultThresholds->highLowerBound(); - $coverageHtmlColorSuccessLow = $defaultColors->successLow(); - $coverageHtmlColorSuccessMedium = $defaultColors->successMedium(); - $coverageHtmlColorSuccessHigh = $defaultColors->successHigh(); - $coverageHtmlColorWarning = $defaultColors->warning(); - $coverageHtmlColorDanger = $defaultColors->danger(); - $coverageHtmlCustomCssFile = null; - $coveragePhp = null; - $coverageText = null; - $coverageTextShowUncoveredFiles = false; - $coverageTextShowOnlySummary = false; - $coverageXml = null; - $coverageFromXmlConfiguration = true; - - if ($cliConfiguration->hasNoCoverage() && $cliConfiguration->noCoverage()) { - $coverageFromXmlConfiguration = false; - } - - if ($cliConfiguration->hasCoverageClover()) { - $coverageClover = $cliConfiguration->coverageClover(); - } elseif ($coverageFromXmlConfiguration && $xmlConfiguration->codeCoverage()->hasClover()) { - $coverageClover = $xmlConfiguration->codeCoverage()->clover()->target()->path(); - } - - if ($cliConfiguration->hasCoverageCobertura()) { - $coverageCobertura = $cliConfiguration->coverageCobertura(); - } elseif ($coverageFromXmlConfiguration && $xmlConfiguration->codeCoverage()->hasCobertura()) { - $coverageCobertura = $xmlConfiguration->codeCoverage()->cobertura()->target()->path(); - } - - if ($xmlConfiguration->codeCoverage()->hasCrap4j()) { - $coverageCrap4jThreshold = $xmlConfiguration->codeCoverage()->crap4j()->threshold(); - } - - if ($cliConfiguration->hasCoverageCrap4J()) { - $coverageCrap4j = $cliConfiguration->coverageCrap4J(); - } elseif ($coverageFromXmlConfiguration && $xmlConfiguration->codeCoverage()->hasCrap4j()) { - $coverageCrap4j = $xmlConfiguration->codeCoverage()->crap4j()->target()->path(); - } - - if ($xmlConfiguration->codeCoverage()->hasHtml()) { - $coverageHtmlHighLowerBound = $xmlConfiguration->codeCoverage()->html()->highLowerBound(); - $coverageHtmlLowUpperBound = $xmlConfiguration->codeCoverage()->html()->lowUpperBound(); - - if ($coverageHtmlLowUpperBound > $coverageHtmlHighLowerBound) { - $coverageHtmlLowUpperBound = $defaultThresholds->lowUpperBound(); - $coverageHtmlHighLowerBound = $defaultThresholds->highLowerBound(); - } - - $coverageHtmlColorSuccessLow = $xmlConfiguration->codeCoverage()->html()->colorSuccessLow(); - $coverageHtmlColorSuccessMedium = $xmlConfiguration->codeCoverage()->html()->colorSuccessMedium(); - $coverageHtmlColorSuccessHigh = $xmlConfiguration->codeCoverage()->html()->colorSuccessHigh(); - $coverageHtmlColorWarning = $xmlConfiguration->codeCoverage()->html()->colorWarning(); - $coverageHtmlColorDanger = $xmlConfiguration->codeCoverage()->html()->colorDanger(); - - if ($xmlConfiguration->codeCoverage()->html()->hasCustomCssFile()) { - $coverageHtmlCustomCssFile = $xmlConfiguration->codeCoverage()->html()->customCssFile(); - } - } - - if ($cliConfiguration->hasCoverageHtml()) { - $coverageHtml = $cliConfiguration->coverageHtml(); - } elseif ($coverageFromXmlConfiguration && $xmlConfiguration->codeCoverage()->hasHtml()) { - $coverageHtml = $xmlConfiguration->codeCoverage()->html()->target()->path(); - } - - if ($cliConfiguration->hasCoveragePhp()) { - $coveragePhp = $cliConfiguration->coveragePhp(); - } elseif ($coverageFromXmlConfiguration && $xmlConfiguration->codeCoverage()->hasPhp()) { - $coveragePhp = $xmlConfiguration->codeCoverage()->php()->target()->path(); - } - - if ($xmlConfiguration->codeCoverage()->hasText()) { - $coverageTextShowUncoveredFiles = $xmlConfiguration->codeCoverage()->text()->showUncoveredFiles(); - $coverageTextShowOnlySummary = $xmlConfiguration->codeCoverage()->text()->showOnlySummary(); - } - - if ($cliConfiguration->hasCoverageTextShowUncoveredFiles()) { - $coverageTextShowUncoveredFiles = $cliConfiguration->coverageTextShowUncoveredFiles(); - } - - if ($cliConfiguration->hasCoverageTextShowOnlySummary()) { - $coverageTextShowOnlySummary = $cliConfiguration->coverageTextShowOnlySummary(); - } - - if ($cliConfiguration->hasCoverageText()) { - $coverageText = $cliConfiguration->coverageText(); - } elseif ($coverageFromXmlConfiguration && $xmlConfiguration->codeCoverage()->hasText()) { - $coverageText = $xmlConfiguration->codeCoverage()->text()->target()->path(); - } - - if ($cliConfiguration->hasCoverageXml()) { - $coverageXml = $cliConfiguration->coverageXml(); - } elseif ($coverageFromXmlConfiguration && $xmlConfiguration->codeCoverage()->hasXml()) { - $coverageXml = $xmlConfiguration->codeCoverage()->xml()->target()->path(); - } - - if ($cliConfiguration->hasBackupGlobals()) { - $backupGlobals = $cliConfiguration->backupGlobals(); - } else { - $backupGlobals = $xmlConfiguration->phpunit()->backupGlobals(); - } - - if ($cliConfiguration->hasBackupStaticProperties()) { - $backupStaticProperties = $cliConfiguration->backupStaticProperties(); - } else { - $backupStaticProperties = $xmlConfiguration->phpunit()->backupStaticProperties(); - } - - if ($cliConfiguration->hasBeStrictAboutChangesToGlobalState()) { - $beStrictAboutChangesToGlobalState = $cliConfiguration->beStrictAboutChangesToGlobalState(); - } else { - $beStrictAboutChangesToGlobalState = $xmlConfiguration->phpunit()->beStrictAboutChangesToGlobalState(); - } - - if ($cliConfiguration->hasProcessIsolation()) { - $processIsolation = $cliConfiguration->processIsolation(); - } else { - $processIsolation = $xmlConfiguration->phpunit()->processIsolation(); - } - - if ($cliConfiguration->hasEnforceTimeLimit()) { - $enforceTimeLimit = $cliConfiguration->enforceTimeLimit(); - } else { - $enforceTimeLimit = $xmlConfiguration->phpunit()->enforceTimeLimit(); - } - - if ($enforceTimeLimit && !(new Invoker)->canInvokeWithTimeout()) { - EventFacade::emitter()->testRunnerTriggeredPhpunitWarning( - 'The pcntl extension is required for enforcing time limits', - ); - } - - if ($cliConfiguration->hasDefaultTimeLimit()) { - $defaultTimeLimit = $cliConfiguration->defaultTimeLimit(); - } else { - $defaultTimeLimit = $xmlConfiguration->phpunit()->defaultTimeLimit(); - } - - $timeoutForSmallTests = $xmlConfiguration->phpunit()->timeoutForSmallTests(); - $timeoutForMediumTests = $xmlConfiguration->phpunit()->timeoutForMediumTests(); - $timeoutForLargeTests = $xmlConfiguration->phpunit()->timeoutForLargeTests(); - - if ($cliConfiguration->hasReportUselessTests()) { - $reportUselessTests = $cliConfiguration->reportUselessTests(); - } else { - $reportUselessTests = $xmlConfiguration->phpunit()->beStrictAboutTestsThatDoNotTestAnything(); - } - - if ($cliConfiguration->hasStrictCoverage()) { - $strictCoverage = $cliConfiguration->strictCoverage(); - } else { - $strictCoverage = $xmlConfiguration->phpunit()->beStrictAboutCoverageMetadata(); - } - - if ($cliConfiguration->hasDisallowTestOutput()) { - $disallowTestOutput = $cliConfiguration->disallowTestOutput(); - } else { - $disallowTestOutput = $xmlConfiguration->phpunit()->beStrictAboutOutputDuringTests(); - } - - if ($cliConfiguration->hasDisplayDetailsOnAllIssues()) { - $displayDetailsOnAllIssues = $cliConfiguration->displayDetailsOnAllIssues(); - } else { - $displayDetailsOnAllIssues = $xmlConfiguration->phpunit()->displayDetailsOnAllIssues(); - } - - if ($cliConfiguration->hasDisplayDetailsOnIncompleteTests()) { - $displayDetailsOnIncompleteTests = $cliConfiguration->displayDetailsOnIncompleteTests(); - } else { - $displayDetailsOnIncompleteTests = $xmlConfiguration->phpunit()->displayDetailsOnIncompleteTests(); - } - - if ($cliConfiguration->hasDisplayDetailsOnSkippedTests()) { - $displayDetailsOnSkippedTests = $cliConfiguration->displayDetailsOnSkippedTests(); - } else { - $displayDetailsOnSkippedTests = $xmlConfiguration->phpunit()->displayDetailsOnSkippedTests(); - } - - if ($cliConfiguration->hasDisplayDetailsOnTestsThatTriggerDeprecations()) { - $displayDetailsOnTestsThatTriggerDeprecations = $cliConfiguration->displayDetailsOnTestsThatTriggerDeprecations(); - } else { - $displayDetailsOnTestsThatTriggerDeprecations = $xmlConfiguration->phpunit()->displayDetailsOnTestsThatTriggerDeprecations(); - } - - if ($cliConfiguration->hasDisplayDetailsOnPhpunitDeprecations()) { - $displayDetailsOnPhpunitDeprecations = $cliConfiguration->displayDetailsOnPhpunitDeprecations(); - } else { - $displayDetailsOnPhpunitDeprecations = $xmlConfiguration->phpunit()->displayDetailsOnPhpunitDeprecations(); - } - - if ($cliConfiguration->hasDisplayDetailsOnTestsThatTriggerErrors()) { - $displayDetailsOnTestsThatTriggerErrors = $cliConfiguration->displayDetailsOnTestsThatTriggerErrors(); - } else { - $displayDetailsOnTestsThatTriggerErrors = $xmlConfiguration->phpunit()->displayDetailsOnTestsThatTriggerErrors(); - } - - if ($cliConfiguration->hasDisplayDetailsOnTestsThatTriggerNotices()) { - $displayDetailsOnTestsThatTriggerNotices = $cliConfiguration->displayDetailsOnTestsThatTriggerNotices(); - } else { - $displayDetailsOnTestsThatTriggerNotices = $xmlConfiguration->phpunit()->displayDetailsOnTestsThatTriggerNotices(); - } - - if ($cliConfiguration->hasDisplayDetailsOnTestsThatTriggerWarnings()) { - $displayDetailsOnTestsThatTriggerWarnings = $cliConfiguration->displayDetailsOnTestsThatTriggerWarnings(); - } else { - $displayDetailsOnTestsThatTriggerWarnings = $xmlConfiguration->phpunit()->displayDetailsOnTestsThatTriggerWarnings(); - } - - if ($cliConfiguration->hasReverseList()) { - $reverseDefectList = $cliConfiguration->reverseList(); - } else { - $reverseDefectList = $xmlConfiguration->phpunit()->reverseDefectList(); - } - - $requireCoverageMetadata = $xmlConfiguration->phpunit()->requireCoverageMetadata(); - $registerMockObjectsFromTestArgumentsRecursively = $xmlConfiguration->phpunit()->registerMockObjectsFromTestArgumentsRecursively(); - - if ($cliConfiguration->hasExecutionOrder()) { - $executionOrder = $cliConfiguration->executionOrder(); - } else { - $executionOrder = $xmlConfiguration->phpunit()->executionOrder(); - } - - $executionOrderDefects = TestSuiteSorter::ORDER_DEFAULT; - - if ($cliConfiguration->hasExecutionOrderDefects()) { - $executionOrderDefects = $cliConfiguration->executionOrderDefects(); - } elseif ($xmlConfiguration->phpunit()->defectsFirst()) { - $executionOrderDefects = TestSuiteSorter::ORDER_DEFECTS_FIRST; - } - - if ($cliConfiguration->hasResolveDependencies()) { - $resolveDependencies = $cliConfiguration->resolveDependencies(); - } else { - $resolveDependencies = $xmlConfiguration->phpunit()->resolveDependencies(); - } - - $colors = false; - $colorsSupported = (new Console)->hasColorSupport(); - - if ($cliConfiguration->hasColors()) { - if ($cliConfiguration->colors() === Configuration::COLOR_ALWAYS) { - $colors = true; - } elseif ($colorsSupported && $cliConfiguration->colors() === Configuration::COLOR_AUTO) { - $colors = true; - } - } elseif ($xmlConfiguration->phpunit()->colors() === Configuration::COLOR_ALWAYS) { - $colors = true; - } elseif ($colorsSupported && $xmlConfiguration->phpunit()->colors() === Configuration::COLOR_AUTO) { - $colors = true; - } - - $logfileTeamcity = null; - $logfileJunit = null; - $logfileTestdoxHtml = null; - $logfileTestdoxText = null; - $loggingFromXmlConfiguration = true; - - if ($cliConfiguration->hasNoLogging() && $cliConfiguration->noLogging()) { - $loggingFromXmlConfiguration = false; - } - - if ($cliConfiguration->hasTeamcityLogfile()) { - $logfileTeamcity = $cliConfiguration->teamcityLogfile(); - } elseif ($loggingFromXmlConfiguration && $xmlConfiguration->logging()->hasTeamCity()) { - $logfileTeamcity = $xmlConfiguration->logging()->teamCity()->target()->path(); - } - - if ($cliConfiguration->hasJunitLogfile()) { - $logfileJunit = $cliConfiguration->junitLogfile(); - } elseif ($loggingFromXmlConfiguration && $xmlConfiguration->logging()->hasJunit()) { - $logfileJunit = $xmlConfiguration->logging()->junit()->target()->path(); - } - - if ($cliConfiguration->hasTestdoxHtmlFile()) { - $logfileTestdoxHtml = $cliConfiguration->testdoxHtmlFile(); - } elseif ($loggingFromXmlConfiguration && $xmlConfiguration->logging()->hasTestDoxHtml()) { - $logfileTestdoxHtml = $xmlConfiguration->logging()->testDoxHtml()->target()->path(); - } - - if ($cliConfiguration->hasTestdoxTextFile()) { - $logfileTestdoxText = $cliConfiguration->testdoxTextFile(); - } elseif ($loggingFromXmlConfiguration && $xmlConfiguration->logging()->hasTestDoxText()) { - $logfileTestdoxText = $xmlConfiguration->logging()->testDoxText()->target()->path(); - } - - $logEventsText = null; - - if ($cliConfiguration->hasLogEventsText()) { - $logEventsText = $cliConfiguration->logEventsText(); - } - - $logEventsVerboseText = null; - - if ($cliConfiguration->hasLogEventsVerboseText()) { - $logEventsVerboseText = $cliConfiguration->logEventsVerboseText(); - } - - $teamCityOutput = false; - - if ($cliConfiguration->hasTeamCityPrinter() && $cliConfiguration->teamCityPrinter()) { - $teamCityOutput = true; - } - - if ($cliConfiguration->hasTestDoxPrinter() && $cliConfiguration->testdoxPrinter()) { - $testDoxOutput = true; - } else { - $testDoxOutput = $xmlConfiguration->phpunit()->testdoxPrinter(); - } - - $noProgress = false; - - if ($cliConfiguration->hasNoProgress() && $cliConfiguration->noProgress()) { - $noProgress = true; - } - - $noResults = false; - - if ($cliConfiguration->hasNoResults() && $cliConfiguration->noResults()) { - $noResults = true; - } - - $noOutput = false; - - if ($cliConfiguration->hasNoOutput() && $cliConfiguration->noOutput()) { - $noOutput = true; - } - - $testsCovering = null; - - if ($cliConfiguration->hasTestsCovering()) { - $testsCovering = $cliConfiguration->testsCovering(); - } - - $testsUsing = null; - - if ($cliConfiguration->hasTestsUsing()) { - $testsUsing = $cliConfiguration->testsUsing(); - } - - $filter = null; - - if ($cliConfiguration->hasFilter()) { - $filter = $cliConfiguration->filter(); - } - - if ($cliConfiguration->hasGroups()) { - $groups = $cliConfiguration->groups(); - } else { - $groups = $xmlConfiguration->groups()->include()->asArrayOfStrings(); - } - - if ($cliConfiguration->hasExcludeGroups()) { - $excludeGroups = $cliConfiguration->excludeGroups(); - } else { - $excludeGroups = $xmlConfiguration->groups()->exclude()->asArrayOfStrings(); - } - - $excludeGroups = array_diff($excludeGroups, $groups); - - if ($cliConfiguration->hasRandomOrderSeed()) { - $randomOrderSeed = $cliConfiguration->randomOrderSeed(); - } else { - $randomOrderSeed = time(); - } - - if ($xmlConfiguration->wasLoadedFromFile() && $xmlConfiguration->hasValidationErrors()) { - if ((new SchemaDetector)->detect($xmlConfiguration->filename())->detected()) { - EventFacade::emitter()->testRunnerTriggeredPhpunitDeprecation( - 'Your XML configuration validates against a deprecated schema. Migrate your XML configuration using "--migrate-configuration"!', - ); - } else { - EventFacade::emitter()->testRunnerTriggeredPhpunitWarning( - "Test results may not be as expected because the XML configuration file did not pass validation:\n" . - $xmlConfiguration->validationErrors(), - ); - } - } - - $includeUncoveredFiles = $xmlConfiguration->codeCoverage()->includeUncoveredFiles(); - - $includePaths = []; - - if ($cliConfiguration->hasIncludePath()) { - foreach (explode(PATH_SEPARATOR, $cliConfiguration->includePath()) as $includePath) { - $includePaths[] = new Directory($includePath); - } - } - - foreach ($xmlConfiguration->php()->includePaths() as $includePath) { - $includePaths[] = $includePath; - } - - $iniSettings = []; - - if ($cliConfiguration->hasIniSettings()) { - foreach ($cliConfiguration->iniSettings() as $name => $value) { - $iniSettings[] = new IniSetting($name, $value); - } - } - - foreach ($xmlConfiguration->php()->iniSettings() as $iniSetting) { - $iniSettings[] = $iniSetting; - } - - $includeTestSuite = ''; - - if ($cliConfiguration->hasTestSuite()) { - $includeTestSuite = $cliConfiguration->testSuite(); - } elseif ($xmlConfiguration->phpunit()->hasDefaultTestSuite()) { - $includeTestSuite = $xmlConfiguration->phpunit()->defaultTestSuite(); - } - - $excludeTestSuite = ''; - - if ($cliConfiguration->hasExcludedTestSuite()) { - $excludeTestSuite = $cliConfiguration->excludedTestSuite(); - } - - $testSuffixes = ['Test.php', '.phpt']; - - if ($cliConfiguration->hasTestSuffixes()) { - $testSuffixes = $cliConfiguration->testSuffixes(); - } - - $sourceIncludeDirectories = []; - - if ($cliConfiguration->hasCoverageFilter()) { - foreach ($cliConfiguration->coverageFilter() as $directory) { - $sourceIncludeDirectories[] = new FilterDirectory($directory, '', '.php'); - } - } - - if ($xmlConfiguration->codeCoverage()->hasNonEmptyListOfFilesToBeIncludedInCodeCoverageReport()) { - foreach ($xmlConfiguration->codeCoverage()->directories() as $directory) { - $sourceIncludeDirectories[] = $directory; - } - - $sourceIncludeFiles = $xmlConfiguration->codeCoverage()->files(); - $sourceExcludeDirectories = $xmlConfiguration->codeCoverage()->excludeDirectories(); - $sourceExcludeFiles = $xmlConfiguration->codeCoverage()->excludeFiles(); - } else { - foreach ($xmlConfiguration->source()->includeDirectories() as $directory) { - $sourceIncludeDirectories[] = $directory; - } - - $sourceIncludeFiles = $xmlConfiguration->source()->includeFiles(); - $sourceExcludeDirectories = $xmlConfiguration->source()->excludeDirectories(); - $sourceExcludeFiles = $xmlConfiguration->source()->excludeFiles(); - } - - $useBaseline = null; - $generateBaseline = null; - - if (!$cliConfiguration->hasGenerateBaseline()) { - if ($cliConfiguration->hasUseBaseline()) { - $useBaseline = $cliConfiguration->useBaseline(); - } elseif ($xmlConfiguration->source()->hasBaseline()) { - $useBaseline = $xmlConfiguration->source()->baseline(); - } - } else { - $generateBaseline = $cliConfiguration->generateBaseline(); - } - - assert($useBaseline !== ''); - assert($generateBaseline !== ''); - - return new Configuration( - $cliConfiguration->arguments(), - $configurationFile, - $bootstrap, - $cacheResult, - $cacheDirectory, - $coverageCacheDirectory, - new Source( - $useBaseline, - $cliConfiguration->ignoreBaseline(), - FilterDirectoryCollection::fromArray($sourceIncludeDirectories), - $sourceIncludeFiles, - $sourceExcludeDirectories, - $sourceExcludeFiles, - $xmlConfiguration->source()->restrictDeprecations(), - $xmlConfiguration->source()->restrictNotices(), - $xmlConfiguration->source()->restrictWarnings(), - $xmlConfiguration->source()->ignoreSuppressionOfDeprecations(), - $xmlConfiguration->source()->ignoreSuppressionOfPhpDeprecations(), - $xmlConfiguration->source()->ignoreSuppressionOfErrors(), - $xmlConfiguration->source()->ignoreSuppressionOfNotices(), - $xmlConfiguration->source()->ignoreSuppressionOfPhpNotices(), - $xmlConfiguration->source()->ignoreSuppressionOfWarnings(), - $xmlConfiguration->source()->ignoreSuppressionOfPhpWarnings(), - ), - $testResultCacheFile, - $coverageClover, - $coverageCobertura, - $coverageCrap4j, - $coverageCrap4jThreshold, - $coverageHtml, - $coverageHtmlLowUpperBound, - $coverageHtmlHighLowerBound, - $coverageHtmlColorSuccessLow, - $coverageHtmlColorSuccessMedium, - $coverageHtmlColorSuccessHigh, - $coverageHtmlColorWarning, - $coverageHtmlColorDanger, - $coverageHtmlCustomCssFile, - $coveragePhp, - $coverageText, - $coverageTextShowUncoveredFiles, - $coverageTextShowOnlySummary, - $coverageXml, - $pathCoverage, - $xmlConfiguration->codeCoverage()->ignoreDeprecatedCodeUnits(), - $disableCodeCoverageIgnore, - $failOnAllIssues, - $failOnDeprecation, - $failOnPhpunitDeprecation, - $failOnPhpunitWarning, - $failOnEmptyTestSuite, - $failOnIncomplete, - $failOnNotice, - $failOnRisky, - $failOnSkipped, - $failOnWarning, - $doNotFailOnDeprecation, - $doNotFailOnPhpunitDeprecation, - $doNotFailOnPhpunitWarning, - $doNotFailOnEmptyTestSuite, - $doNotFailOnIncomplete, - $doNotFailOnNotice, - $doNotFailOnRisky, - $doNotFailOnSkipped, - $doNotFailOnWarning, - $stopOnDefect, - $stopOnDeprecation, - $stopOnError, - $stopOnFailure, - $stopOnIncomplete, - $stopOnNotice, - $stopOnRisky, - $stopOnSkipped, - $stopOnWarning, - $outputToStandardErrorStream, - $columns, - $noExtensions, - $pharExtensionDirectory, - $extensionBootstrappers, - $backupGlobals, - $backupStaticProperties, - $beStrictAboutChangesToGlobalState, - $colors, - $processIsolation, - $enforceTimeLimit, - $defaultTimeLimit, - $timeoutForSmallTests, - $timeoutForMediumTests, - $timeoutForLargeTests, - $reportUselessTests, - $strictCoverage, - $disallowTestOutput, - $displayDetailsOnAllIssues, - $displayDetailsOnIncompleteTests, - $displayDetailsOnSkippedTests, - $displayDetailsOnTestsThatTriggerDeprecations, - $displayDetailsOnPhpunitDeprecations, - $displayDetailsOnTestsThatTriggerErrors, - $displayDetailsOnTestsThatTriggerNotices, - $displayDetailsOnTestsThatTriggerWarnings, - $reverseDefectList, - $requireCoverageMetadata, - $registerMockObjectsFromTestArgumentsRecursively, - $noProgress, - $noResults, - $noOutput, - $executionOrder, - $executionOrderDefects, - $resolveDependencies, - $logfileTeamcity, - $logfileJunit, - $logfileTestdoxHtml, - $logfileTestdoxText, - $logEventsText, - $logEventsVerboseText, - $teamCityOutput, - $testDoxOutput, - $testsCovering, - $testsUsing, - $filter, - $groups, - $excludeGroups, - $randomOrderSeed, - $includeUncoveredFiles, - $xmlConfiguration->testSuite(), - $includeTestSuite, - $excludeTestSuite, - $xmlConfiguration->phpunit()->hasDefaultTestSuite() ? $xmlConfiguration->phpunit()->defaultTestSuite() : null, - $testSuffixes, - new Php( - DirectoryCollection::fromArray($includePaths), - IniSettingCollection::fromArray($iniSettings), - $xmlConfiguration->php()->constants(), - $xmlConfiguration->php()->globalVariables(), - $xmlConfiguration->php()->envVariables(), - $xmlConfiguration->php()->postVariables(), - $xmlConfiguration->php()->getVariables(), - $xmlConfiguration->php()->cookieVariables(), - $xmlConfiguration->php()->serverVariables(), - $xmlConfiguration->php()->filesVariables(), - $xmlConfiguration->php()->requestVariables(), - ), - $xmlConfiguration->phpunit()->controlGarbageCollector(), - $xmlConfiguration->phpunit()->numberOfTestsBeforeGarbageCollection(), - $generateBaseline, - $cliConfiguration->debug(), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/PhpHandler.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/PhpHandler.php deleted file mode 100644 index 8bd727f..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/PhpHandler.php +++ /dev/null @@ -1,123 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use const PATH_SEPARATOR; -use function constant; -use function define; -use function defined; -use function getenv; -use function implode; -use function ini_get; -use function ini_set; -use function putenv; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class PhpHandler -{ - public function handle(Php $configuration): void - { - $this->handleIncludePaths($configuration->includePaths()); - $this->handleIniSettings($configuration->iniSettings()); - $this->handleConstants($configuration->constants()); - $this->handleGlobalVariables($configuration->globalVariables()); - $this->handleServerVariables($configuration->serverVariables()); - $this->handleEnvVariables($configuration->envVariables()); - $this->handleVariables('_POST', $configuration->postVariables()); - $this->handleVariables('_GET', $configuration->getVariables()); - $this->handleVariables('_COOKIE', $configuration->cookieVariables()); - $this->handleVariables('_FILES', $configuration->filesVariables()); - $this->handleVariables('_REQUEST', $configuration->requestVariables()); - } - - private function handleIncludePaths(DirectoryCollection $includePaths): void - { - if (!$includePaths->isEmpty()) { - $includePathsAsStrings = []; - - foreach ($includePaths as $includePath) { - $includePathsAsStrings[] = $includePath->path(); - } - - ini_set( - 'include_path', - implode(PATH_SEPARATOR, $includePathsAsStrings) . - PATH_SEPARATOR . - ini_get('include_path'), - ); - } - } - - private function handleIniSettings(IniSettingCollection $iniSettings): void - { - foreach ($iniSettings as $iniSetting) { - $value = $iniSetting->value(); - - if (defined($value)) { - $value = (string) constant($value); - } - - ini_set($iniSetting->name(), $value); - } - } - - private function handleConstants(ConstantCollection $constants): void - { - foreach ($constants as $constant) { - if (!defined($constant->name())) { - define($constant->name(), $constant->value()); - } - } - } - - private function handleGlobalVariables(VariableCollection $variables): void - { - foreach ($variables as $variable) { - $GLOBALS[$variable->name()] = $variable->value(); - } - } - - private function handleServerVariables(VariableCollection $variables): void - { - foreach ($variables as $variable) { - $_SERVER[$variable->name()] = $variable->value(); - } - } - - private function handleVariables(string $target, VariableCollection $variables): void - { - foreach ($variables as $variable) { - $GLOBALS[$target][$variable->name()] = $variable->value(); - } - } - - private function handleEnvVariables(VariableCollection $variables): void - { - foreach ($variables as $variable) { - $name = $variable->name(); - $value = $variable->value(); - $force = $variable->force(); - - if ($force || getenv($name) === false) { - putenv("{$name}={$value}"); - } - - $value = getenv($name); - - if ($force || !isset($_ENV[$name])) { - $_ENV[$name] = $value; - } - } - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Registry.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Registry.php deleted file mode 100644 index bde319a..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Registry.php +++ /dev/null @@ -1,111 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use function assert; -use function file_get_contents; -use function file_put_contents; -use function serialize; -use function unserialize; -use PHPUnit\Event\Facade as EventFacade; -use PHPUnit\TextUI\CliArguments\Configuration as CliConfiguration; -use PHPUnit\TextUI\CliArguments\Exception; -use PHPUnit\TextUI\XmlConfiguration\Configuration as XmlConfiguration; -use PHPUnit\Util\VersionComparisonOperator; - -/** - * CLI options and XML configuration are static within a single PHPUnit process. - * It is therefore okay to use a Singleton registry here. - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Registry -{ - private static ?Configuration $instance = null; - - public static function saveTo(string $path): bool - { - $result = file_put_contents( - $path, - serialize(self::get()), - ); - - if ($result) { - return true; - } - - // @codeCoverageIgnoreStart - return false; - // @codeCoverageIgnoreEnd - } - - /** - * This method is used by the "run test(s) in separate process" templates. - * - * @noinspection PhpUnused - * - * @codeCoverageIgnore - */ - public static function loadFrom(string $path): void - { - self::$instance = unserialize( - file_get_contents($path), - [ - 'allowed_classes' => [ - Configuration::class, - Php::class, - ConstantCollection::class, - Constant::class, - IniSettingCollection::class, - IniSetting::class, - VariableCollection::class, - Variable::class, - DirectoryCollection::class, - Directory::class, - FileCollection::class, - File::class, - FilterDirectoryCollection::class, - FilterDirectory::class, - TestDirectoryCollection::class, - TestDirectory::class, - TestFileCollection::class, - TestFile::class, - TestSuiteCollection::class, - TestSuite::class, - VersionComparisonOperator::class, - Source::class, - ], - ], - ); - } - - public static function get(): Configuration - { - assert(self::$instance instanceof Configuration); - - return self::$instance; - } - - /** - * @throws \PHPUnit\TextUI\XmlConfiguration\Exception - * @throws Exception - * @throws NoCustomCssFileException - */ - public static function init(CliConfiguration $cliConfiguration, XmlConfiguration $xmlConfiguration): Configuration - { - self::$instance = (new Merger)->merge($cliConfiguration, $xmlConfiguration); - - EventFacade::emitter()->testRunnerConfigured(self::$instance); - - return self::$instance; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/SourceFilter.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/SourceFilter.php deleted file mode 100644 index 0b64e18..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/SourceFilter.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class SourceFilter -{ - private static ?self $instance = null; - - /** - * @psalm-var array - */ - private readonly array $map; - - public static function instance(): self - { - if (self::$instance === null) { - self::$instance = new self( - (new SourceMapper)->map( - Registry::get()->source(), - ), - ); - } - - return self::$instance; - } - - /** - * @psalm-param array $map - */ - public function __construct(array $map) - { - $this->map = $map; - } - - public function includes(string $path): bool - { - return isset($this->map[$path]); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/SourceMapper.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/SourceMapper.php deleted file mode 100644 index f5d837f..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/SourceMapper.php +++ /dev/null @@ -1,99 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use function realpath; -use SebastianBergmann\FileIterator\Facade as FileIteratorFacade; -use SplObjectStorage; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class SourceMapper -{ - /** - * @psalm-var SplObjectStorage> - */ - private static ?SplObjectStorage $files = null; - - /** - * @psalm-return array - */ - public function map(Source $source): array - { - if (self::$files === null) { - self::$files = new SplObjectStorage; - } - - if (isset(self::$files[$source])) { - return self::$files[$source]; - } - - $files = []; - - foreach ($source->includeDirectories() as $directory) { - foreach ((new FileIteratorFacade)->getFilesAsArray($directory->path(), $directory->suffix(), $directory->prefix()) as $file) { - $file = realpath($file); - - if (!$file) { - continue; - } - - $files[$file] = true; - } - } - - foreach ($source->includeFiles() as $file) { - $file = realpath($file->path()); - - if (!$file) { - continue; - } - - $files[$file] = true; - } - - foreach ($source->excludeDirectories() as $directory) { - foreach ((new FileIteratorFacade)->getFilesAsArray($directory->path(), $directory->suffix(), $directory->prefix()) as $file) { - $file = realpath($file); - - if (!$file) { - continue; - } - - if (!isset($files[$file])) { - continue; - } - - unset($files[$file]); - } - } - - foreach ($source->excludeFiles() as $file) { - $file = realpath($file->path()); - - if (!$file) { - continue; - } - - if (!isset($files[$file])) { - continue; - } - - unset($files[$file]); - } - - self::$files[$source] = $files; - - return $files; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/TestSuiteBuilder.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/TestSuiteBuilder.php deleted file mode 100644 index 0b94805..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/TestSuiteBuilder.php +++ /dev/null @@ -1,146 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use const PHP_EOL; -use function assert; -use function count; -use function is_dir; -use function is_file; -use function realpath; -use function str_ends_with; -use PHPUnit\Event\Facade as EventFacade; -use PHPUnit\Exception; -use PHPUnit\Framework\TestSuite; -use PHPUnit\Runner\TestSuiteLoader; -use PHPUnit\TextUI\RuntimeException; -use PHPUnit\TextUI\TestDirectoryNotFoundException; -use PHPUnit\TextUI\TestFileNotFoundException; -use PHPUnit\TextUI\XmlConfiguration\TestSuiteMapper; -use SebastianBergmann\FileIterator\Facade as FileIteratorFacade; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestSuiteBuilder -{ - /** - * @throws \PHPUnit\Framework\Exception - * @throws RuntimeException - * @throws TestDirectoryNotFoundException - * @throws TestFileNotFoundException - */ - public function build(Configuration $configuration): TestSuite - { - if ($configuration->hasCliArguments()) { - $arguments = []; - - foreach ($configuration->cliArguments() as $cliArgument) { - $argument = realpath($cliArgument); - - if (!$argument) { - throw new TestFileNotFoundException($cliArgument); - } - - $arguments[] = $argument; - } - - if (count($arguments) === 1) { - $testSuite = $this->testSuiteFromPath( - $arguments[0], - $configuration->testSuffixes(), - ); - } else { - $testSuite = $this->testSuiteFromPathList( - $arguments, - $configuration->testSuffixes(), - ); - } - } - - if (!isset($testSuite)) { - $xmlConfigurationFile = $configuration->hasConfigurationFile() ? $configuration->configurationFile() : 'Root Test Suite'; - - assert(!empty($xmlConfigurationFile)); - - $testSuite = (new TestSuiteMapper)->map( - $xmlConfigurationFile, - $configuration->testSuite(), - $configuration->includeTestSuite(), - $configuration->excludeTestSuite(), - ); - } - - EventFacade::emitter()->testSuiteLoaded(\PHPUnit\Event\TestSuite\TestSuiteBuilder::from($testSuite)); - - return $testSuite; - } - - /** - * @psalm-param non-empty-string $path - * @psalm-param list $suffixes - * @psalm-param ?TestSuite $suite - * - * @throws \PHPUnit\Framework\Exception - */ - private function testSuiteFromPath(string $path, array $suffixes, ?TestSuite $suite = null): TestSuite - { - if (str_ends_with($path, '.phpt') && is_file($path)) { - $suite = $suite ?: TestSuite::empty($path); - $suite->addTestFile($path); - - return $suite; - } - - if (is_dir($path)) { - $files = (new FileIteratorFacade)->getFilesAsArray($path, $suffixes); - - $suite = $suite ?: TestSuite::empty('CLI Arguments'); - $suite->addTestFiles($files); - - return $suite; - } - - try { - $testClass = (new TestSuiteLoader)->load($path); - } catch (Exception $e) { - print $e->getMessage() . PHP_EOL; - - exit(1); - } - - if (!$suite) { - return TestSuite::fromClassReflector($testClass); - } - - $suite->addTestSuite($testClass); - - return $suite; - } - - /** - * @psalm-param list $paths - * @psalm-param list $suffixes - * - * @throws \PHPUnit\Framework\Exception - */ - private function testSuiteFromPathList(array $paths, array $suffixes): TestSuite - { - $suite = TestSuite::empty('CLI Arguments'); - - foreach ($paths as $path) { - $this->testSuiteFromPath($path, $suffixes, $suite); - } - - return $suite; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/Constant.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/Constant.php deleted file mode 100644 index 44a4a83..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/Constant.php +++ /dev/null @@ -1,37 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class Constant -{ - private readonly string $name; - private readonly bool|string $value; - - public function __construct(string $name, bool|string $value) - { - $this->name = $name; - $this->value = $value; - } - - public function name(): string - { - return $this->name; - } - - public function value(): bool|string - { - return $this->value; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/ConstantCollection.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/ConstantCollection.php deleted file mode 100644 index f93ab5f..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/ConstantCollection.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use function count; -use Countable; -use IteratorAggregate; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - * - * @template-implements IteratorAggregate - */ -final class ConstantCollection implements Countable, IteratorAggregate -{ - /** - * @psalm-var list - */ - private readonly array $constants; - - /** - * @psalm-param list $constants - */ - public static function fromArray(array $constants): self - { - return new self(...$constants); - } - - private function __construct(Constant ...$constants) - { - $this->constants = $constants; - } - - /** - * @psalm-return list - */ - public function asArray(): array - { - return $this->constants; - } - - public function count(): int - { - return count($this->constants); - } - - public function getIterator(): ConstantCollectionIterator - { - return new ConstantCollectionIterator($this); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/ConstantCollectionIterator.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/ConstantCollectionIterator.php deleted file mode 100644 index acb4c8b..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/ConstantCollectionIterator.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use function count; -use function iterator_count; -use Countable; -use Iterator; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @template-implements Iterator - */ -final class ConstantCollectionIterator implements Countable, Iterator -{ - /** - * @psalm-var list - */ - private readonly array $constants; - private int $position = 0; - - public function __construct(ConstantCollection $constants) - { - $this->constants = $constants->asArray(); - } - - public function count(): int - { - return iterator_count($this); - } - - public function rewind(): void - { - $this->position = 0; - } - - public function valid(): bool - { - return $this->position < count($this->constants); - } - - public function key(): int - { - return $this->position; - } - - public function current(): Constant - { - return $this->constants[$this->position]; - } - - public function next(): void - { - $this->position++; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/Directory.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/Directory.php deleted file mode 100644 index 4158b65..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/Directory.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class Directory -{ - private readonly string $path; - - public function __construct(string $path) - { - $this->path = $path; - } - - public function path(): string - { - return $this->path; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/DirectoryCollection.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/DirectoryCollection.php deleted file mode 100644 index 618adcc..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/DirectoryCollection.php +++ /dev/null @@ -1,65 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use function count; -use Countable; -use IteratorAggregate; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - * - * @template-implements IteratorAggregate - */ -final class DirectoryCollection implements Countable, IteratorAggregate -{ - /** - * @psalm-var list - */ - private readonly array $directories; - - /** - * @psalm-param list $directories - */ - public static function fromArray(array $directories): self - { - return new self(...$directories); - } - - private function __construct(Directory ...$directories) - { - $this->directories = $directories; - } - - /** - * @psalm-return list - */ - public function asArray(): array - { - return $this->directories; - } - - public function count(): int - { - return count($this->directories); - } - - public function getIterator(): DirectoryCollectionIterator - { - return new DirectoryCollectionIterator($this); - } - - public function isEmpty(): bool - { - return $this->count() === 0; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/DirectoryCollectionIterator.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/DirectoryCollectionIterator.php deleted file mode 100644 index 4e5655c..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/DirectoryCollectionIterator.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use function count; -use function iterator_count; -use Countable; -use Iterator; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @template-implements Iterator - */ -final class DirectoryCollectionIterator implements Countable, Iterator -{ - /** - * @psalm-var list - */ - private readonly array $directories; - private int $position = 0; - - public function __construct(DirectoryCollection $directories) - { - $this->directories = $directories->asArray(); - } - - public function count(): int - { - return iterator_count($this); - } - - public function rewind(): void - { - $this->position = 0; - } - - public function valid(): bool - { - return $this->position < count($this->directories); - } - - public function key(): int - { - return $this->position; - } - - public function current(): Directory - { - return $this->directories[$this->position]; - } - - public function next(): void - { - $this->position++; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/ExtensionBootstrap.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/ExtensionBootstrap.php deleted file mode 100644 index c689342..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/ExtensionBootstrap.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class ExtensionBootstrap -{ - /** - * @psalm-var class-string - */ - private readonly string $className; - - /** - * @psalm-var array - */ - private readonly array $parameters; - - /** - * @psalm-param class-string $className - * @psalm-param array $parameters - */ - public function __construct(string $className, array $parameters) - { - $this->className = $className; - $this->parameters = $parameters; - } - - /** - * @psalm-return class-string - */ - public function className(): string - { - return $this->className; - } - - /** - * @psalm-return array - */ - public function parameters(): array - { - return $this->parameters; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/ExtensionBootstrapCollection.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/ExtensionBootstrapCollection.php deleted file mode 100644 index 2a14437..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/ExtensionBootstrapCollection.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use IteratorAggregate; - -/** - * @template-implements IteratorAggregate - * - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class ExtensionBootstrapCollection implements IteratorAggregate -{ - /** - * @psalm-var list - */ - private readonly array $extensionBootstraps; - - /** - * @psalm-param list $extensionBootstraps - */ - public static function fromArray(array $extensionBootstraps): self - { - return new self(...$extensionBootstraps); - } - - private function __construct(ExtensionBootstrap ...$extensionBootstraps) - { - $this->extensionBootstraps = $extensionBootstraps; - } - - /** - * @psalm-return list - */ - public function asArray(): array - { - return $this->extensionBootstraps; - } - - public function getIterator(): ExtensionBootstrapCollectionIterator - { - return new ExtensionBootstrapCollectionIterator($this); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/ExtensionBootstrapCollectionIterator.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/ExtensionBootstrapCollectionIterator.php deleted file mode 100644 index 0de1711..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/ExtensionBootstrapCollectionIterator.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use function count; -use function iterator_count; -use Countable; -use Iterator; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @template-implements Iterator - */ -final class ExtensionBootstrapCollectionIterator implements Countable, Iterator -{ - /** - * @psalm-var list - */ - private readonly array $extensionBootstraps; - private int $position = 0; - - public function __construct(ExtensionBootstrapCollection $extensionBootstraps) - { - $this->extensionBootstraps = $extensionBootstraps->asArray(); - } - - public function count(): int - { - return iterator_count($this); - } - - public function rewind(): void - { - $this->position = 0; - } - - public function valid(): bool - { - return $this->position < count($this->extensionBootstraps); - } - - public function key(): int - { - return $this->position; - } - - public function current(): ExtensionBootstrap - { - return $this->extensionBootstraps[$this->position]; - } - - public function next(): void - { - $this->position++; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/File.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/File.php deleted file mode 100644 index 035b9a3..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/File.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class File -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $path; - - /** - * @psalm-param non-empty-string $path - */ - public function __construct(string $path) - { - $this->path = $path; - } - - /** - * @psalm-return non-empty-string - */ - public function path(): string - { - return $this->path; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/FileCollection.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/FileCollection.php deleted file mode 100644 index ee730aa..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/FileCollection.php +++ /dev/null @@ -1,65 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use function count; -use Countable; -use IteratorAggregate; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - * - * @template-implements IteratorAggregate - */ -final class FileCollection implements Countable, IteratorAggregate -{ - /** - * @psalm-var list - */ - private readonly array $files; - - /** - * @psalm-param list $files - */ - public static function fromArray(array $files): self - { - return new self(...$files); - } - - private function __construct(File ...$files) - { - $this->files = $files; - } - - /** - * @psalm-return list - */ - public function asArray(): array - { - return $this->files; - } - - public function count(): int - { - return count($this->files); - } - - public function notEmpty(): bool - { - return !empty($this->files); - } - - public function getIterator(): FileCollectionIterator - { - return new FileCollectionIterator($this); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/FileCollectionIterator.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/FileCollectionIterator.php deleted file mode 100644 index 9627fca..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/FileCollectionIterator.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use function count; -use function iterator_count; -use Countable; -use Iterator; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @template-implements Iterator - */ -final class FileCollectionIterator implements Countable, Iterator -{ - /** - * @psalm-var list - */ - private readonly array $files; - private int $position = 0; - - public function __construct(FileCollection $files) - { - $this->files = $files->asArray(); - } - - public function count(): int - { - return iterator_count($this); - } - - public function rewind(): void - { - $this->position = 0; - } - - public function valid(): bool - { - return $this->position < count($this->files); - } - - public function key(): int - { - return $this->position; - } - - public function current(): File - { - return $this->files[$this->position]; - } - - public function next(): void - { - $this->position++; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/FilterDirectory.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/FilterDirectory.php deleted file mode 100644 index d66f951..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/FilterDirectory.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class FilterDirectory -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $path; - private readonly string $prefix; - private readonly string $suffix; - - /** - * @psalm-param non-empty-string $path - */ - public function __construct(string $path, string $prefix, string $suffix) - { - $this->path = $path; - $this->prefix = $prefix; - $this->suffix = $suffix; - } - - /** - * @psalm-return non-empty-string - */ - public function path(): string - { - return $this->path; - } - - public function prefix(): string - { - return $this->prefix; - } - - public function suffix(): string - { - return $this->suffix; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/FilterDirectoryCollection.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/FilterDirectoryCollection.php deleted file mode 100644 index 53b474d..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/FilterDirectoryCollection.php +++ /dev/null @@ -1,65 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use function count; -use Countable; -use IteratorAggregate; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - * - * @template-implements IteratorAggregate - */ -final class FilterDirectoryCollection implements Countable, IteratorAggregate -{ - /** - * @psalm-var list - */ - private readonly array $directories; - - /** - * @psalm-param list $directories - */ - public static function fromArray(array $directories): self - { - return new self(...$directories); - } - - private function __construct(FilterDirectory ...$directories) - { - $this->directories = $directories; - } - - /** - * @psalm-return list - */ - public function asArray(): array - { - return $this->directories; - } - - public function count(): int - { - return count($this->directories); - } - - public function notEmpty(): bool - { - return !empty($this->directories); - } - - public function getIterator(): FilterDirectoryCollectionIterator - { - return new FilterDirectoryCollectionIterator($this); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/FilterDirectoryCollectionIterator.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/FilterDirectoryCollectionIterator.php deleted file mode 100644 index 3d14598..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/FilterDirectoryCollectionIterator.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use function count; -use function iterator_count; -use Countable; -use Iterator; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @template-implements Iterator - */ -final class FilterDirectoryCollectionIterator implements Countable, Iterator -{ - /** - * @psalm-var list - */ - private readonly array $directories; - private int $position = 0; - - public function __construct(FilterDirectoryCollection $directories) - { - $this->directories = $directories->asArray(); - } - - public function count(): int - { - return iterator_count($this); - } - - public function rewind(): void - { - $this->position = 0; - } - - public function valid(): bool - { - return $this->position < count($this->directories); - } - - public function key(): int - { - return $this->position; - } - - public function current(): FilterDirectory - { - return $this->directories[$this->position]; - } - - public function next(): void - { - $this->position++; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/Group.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/Group.php deleted file mode 100644 index 1ee1baa..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/Group.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class Group -{ - private readonly string $name; - - public function __construct(string $name) - { - $this->name = $name; - } - - public function name(): string - { - return $this->name; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/GroupCollection.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/GroupCollection.php deleted file mode 100644 index eb581de..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/GroupCollection.php +++ /dev/null @@ -1,72 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use IteratorAggregate; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - * - * @template-implements IteratorAggregate - */ -final class GroupCollection implements IteratorAggregate -{ - /** - * @psalm-var list - */ - private readonly array $groups; - - /** - * @psalm-param list $groups - */ - public static function fromArray(array $groups): self - { - return new self(...$groups); - } - - private function __construct(Group ...$groups) - { - $this->groups = $groups; - } - - /** - * @psalm-return list - */ - public function asArray(): array - { - return $this->groups; - } - - /** - * @psalm-return list - */ - public function asArrayOfStrings(): array - { - $result = []; - - foreach ($this->groups as $group) { - $result[] = $group->name(); - } - - return $result; - } - - public function isEmpty(): bool - { - return empty($this->groups); - } - - public function getIterator(): GroupCollectionIterator - { - return new GroupCollectionIterator($this); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/GroupCollectionIterator.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/GroupCollectionIterator.php deleted file mode 100644 index 9b4795a..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/GroupCollectionIterator.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use function count; -use function iterator_count; -use Countable; -use Iterator; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @template-implements Iterator - */ -final class GroupCollectionIterator implements Countable, Iterator -{ - /** - * @psalm-var list - */ - private readonly array $groups; - private int $position = 0; - - public function __construct(GroupCollection $groups) - { - $this->groups = $groups->asArray(); - } - - public function count(): int - { - return iterator_count($this); - } - - public function rewind(): void - { - $this->position = 0; - } - - public function valid(): bool - { - return $this->position < count($this->groups); - } - - public function key(): int - { - return $this->position; - } - - public function current(): Group - { - return $this->groups[$this->position]; - } - - public function next(): void - { - $this->position++; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/IniSetting.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/IniSetting.php deleted file mode 100644 index aa88d73..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/IniSetting.php +++ /dev/null @@ -1,37 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class IniSetting -{ - private readonly string $name; - private readonly string $value; - - public function __construct(string $name, string $value) - { - $this->name = $name; - $this->value = $value; - } - - public function name(): string - { - return $this->name; - } - - public function value(): string - { - return $this->value; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/IniSettingCollection.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/IniSettingCollection.php deleted file mode 100644 index 2d405b4..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/IniSettingCollection.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use function count; -use Countable; -use IteratorAggregate; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - * - * @template-implements IteratorAggregate - */ -final class IniSettingCollection implements Countable, IteratorAggregate -{ - /** - * @psalm-var list - */ - private readonly array $iniSettings; - - /** - * @psalm-param list $iniSettings - */ - public static function fromArray(array $iniSettings): self - { - return new self(...$iniSettings); - } - - private function __construct(IniSetting ...$iniSettings) - { - $this->iniSettings = $iniSettings; - } - - /** - * @psalm-return list - */ - public function asArray(): array - { - return $this->iniSettings; - } - - public function count(): int - { - return count($this->iniSettings); - } - - public function getIterator(): IniSettingCollectionIterator - { - return new IniSettingCollectionIterator($this); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/IniSettingCollectionIterator.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/IniSettingCollectionIterator.php deleted file mode 100644 index 196358c..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/IniSettingCollectionIterator.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use function count; -use function iterator_count; -use Countable; -use Iterator; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @template-implements Iterator - */ -final class IniSettingCollectionIterator implements Countable, Iterator -{ - /** - * @psalm-var list - */ - private readonly array $iniSettings; - private int $position = 0; - - public function __construct(IniSettingCollection $iniSettings) - { - $this->iniSettings = $iniSettings->asArray(); - } - - public function count(): int - { - return iterator_count($this); - } - - public function rewind(): void - { - $this->position = 0; - } - - public function valid(): bool - { - return $this->position < count($this->iniSettings); - } - - public function key(): int - { - return $this->position; - } - - public function current(): IniSetting - { - return $this->iniSettings[$this->position]; - } - - public function next(): void - { - $this->position++; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/Php.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/Php.php deleted file mode 100644 index 17d0848..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/Php.php +++ /dev/null @@ -1,100 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class Php -{ - private readonly DirectoryCollection $includePaths; - private readonly IniSettingCollection $iniSettings; - private readonly ConstantCollection $constants; - private readonly VariableCollection $globalVariables; - private readonly VariableCollection $envVariables; - private readonly VariableCollection $postVariables; - private readonly VariableCollection $getVariables; - private readonly VariableCollection $cookieVariables; - private readonly VariableCollection $serverVariables; - private readonly VariableCollection $filesVariables; - private readonly VariableCollection $requestVariables; - - public function __construct(DirectoryCollection $includePaths, IniSettingCollection $iniSettings, ConstantCollection $constants, VariableCollection $globalVariables, VariableCollection $envVariables, VariableCollection $postVariables, VariableCollection $getVariables, VariableCollection $cookieVariables, VariableCollection $serverVariables, VariableCollection $filesVariables, VariableCollection $requestVariables) - { - $this->includePaths = $includePaths; - $this->iniSettings = $iniSettings; - $this->constants = $constants; - $this->globalVariables = $globalVariables; - $this->envVariables = $envVariables; - $this->postVariables = $postVariables; - $this->getVariables = $getVariables; - $this->cookieVariables = $cookieVariables; - $this->serverVariables = $serverVariables; - $this->filesVariables = $filesVariables; - $this->requestVariables = $requestVariables; - } - - public function includePaths(): DirectoryCollection - { - return $this->includePaths; - } - - public function iniSettings(): IniSettingCollection - { - return $this->iniSettings; - } - - public function constants(): ConstantCollection - { - return $this->constants; - } - - public function globalVariables(): VariableCollection - { - return $this->globalVariables; - } - - public function envVariables(): VariableCollection - { - return $this->envVariables; - } - - public function postVariables(): VariableCollection - { - return $this->postVariables; - } - - public function getVariables(): VariableCollection - { - return $this->getVariables; - } - - public function cookieVariables(): VariableCollection - { - return $this->cookieVariables; - } - - public function serverVariables(): VariableCollection - { - return $this->serverVariables; - } - - public function filesVariables(): VariableCollection - { - return $this->filesVariables; - } - - public function requestVariables(): VariableCollection - { - return $this->requestVariables; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/Source.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/Source.php deleted file mode 100644 index 6957111..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/Source.php +++ /dev/null @@ -1,166 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class Source -{ - /** - * @psalm-var non-empty-string - */ - private readonly ?string $baseline; - private readonly bool $ignoreBaseline; - private readonly FilterDirectoryCollection $includeDirectories; - private readonly FileCollection $includeFiles; - private readonly FilterDirectoryCollection $excludeDirectories; - private readonly FileCollection $excludeFiles; - private readonly bool $restrictDeprecations; - private readonly bool $restrictNotices; - private readonly bool $restrictWarnings; - private readonly bool $ignoreSuppressionOfDeprecations; - private readonly bool $ignoreSuppressionOfPhpDeprecations; - private readonly bool $ignoreSuppressionOfErrors; - private readonly bool $ignoreSuppressionOfNotices; - private readonly bool $ignoreSuppressionOfPhpNotices; - private readonly bool $ignoreSuppressionOfWarnings; - private readonly bool $ignoreSuppressionOfPhpWarnings; - - /** - * @psalm-param non-empty-string $baseline - */ - public function __construct(?string $baseline, bool $ignoreBaseline, FilterDirectoryCollection $includeDirectories, FileCollection $includeFiles, FilterDirectoryCollection $excludeDirectories, FileCollection $excludeFiles, bool $restrictDeprecations, bool $restrictNotices, bool $restrictWarnings, bool $ignoreSuppressionOfDeprecations, bool $ignoreSuppressionOfPhpDeprecations, bool $ignoreSuppressionOfErrors, bool $ignoreSuppressionOfNotices, bool $ignoreSuppressionOfPhpNotices, bool $ignoreSuppressionOfWarnings, bool $ignoreSuppressionOfPhpWarnings) - { - $this->baseline = $baseline; - $this->ignoreBaseline = $ignoreBaseline; - $this->includeDirectories = $includeDirectories; - $this->includeFiles = $includeFiles; - $this->excludeDirectories = $excludeDirectories; - $this->excludeFiles = $excludeFiles; - $this->restrictDeprecations = $restrictDeprecations; - $this->restrictNotices = $restrictNotices; - $this->restrictWarnings = $restrictWarnings; - $this->ignoreSuppressionOfDeprecations = $ignoreSuppressionOfDeprecations; - $this->ignoreSuppressionOfPhpDeprecations = $ignoreSuppressionOfPhpDeprecations; - $this->ignoreSuppressionOfErrors = $ignoreSuppressionOfErrors; - $this->ignoreSuppressionOfNotices = $ignoreSuppressionOfNotices; - $this->ignoreSuppressionOfPhpNotices = $ignoreSuppressionOfPhpNotices; - $this->ignoreSuppressionOfWarnings = $ignoreSuppressionOfWarnings; - $this->ignoreSuppressionOfPhpWarnings = $ignoreSuppressionOfPhpWarnings; - } - - /** - * @psalm-assert-if-true !null $this->baseline - */ - public function useBaseline(): bool - { - return $this->hasBaseline() && !$this->ignoreBaseline; - } - - /** - * @psalm-assert-if-true !null $this->baseline - */ - public function hasBaseline(): bool - { - return $this->baseline !== null; - } - - /** - * @throws NoBaselineException - * - * @psalm-return non-empty-string - */ - public function baseline(): string - { - if (!$this->hasBaseline()) { - throw new NoBaselineException; - } - - return $this->baseline; - } - - public function includeDirectories(): FilterDirectoryCollection - { - return $this->includeDirectories; - } - - public function includeFiles(): FileCollection - { - return $this->includeFiles; - } - - public function excludeDirectories(): FilterDirectoryCollection - { - return $this->excludeDirectories; - } - - public function excludeFiles(): FileCollection - { - return $this->excludeFiles; - } - - public function notEmpty(): bool - { - return $this->includeDirectories->notEmpty() || $this->includeFiles->notEmpty(); - } - - public function restrictDeprecations(): bool - { - return $this->restrictDeprecations; - } - - public function restrictNotices(): bool - { - return $this->restrictNotices; - } - - public function restrictWarnings(): bool - { - return $this->restrictWarnings; - } - - public function ignoreSuppressionOfDeprecations(): bool - { - return $this->ignoreSuppressionOfDeprecations; - } - - public function ignoreSuppressionOfPhpDeprecations(): bool - { - return $this->ignoreSuppressionOfPhpDeprecations; - } - - public function ignoreSuppressionOfErrors(): bool - { - return $this->ignoreSuppressionOfErrors; - } - - public function ignoreSuppressionOfNotices(): bool - { - return $this->ignoreSuppressionOfNotices; - } - - public function ignoreSuppressionOfPhpNotices(): bool - { - return $this->ignoreSuppressionOfPhpNotices; - } - - public function ignoreSuppressionOfWarnings(): bool - { - return $this->ignoreSuppressionOfWarnings; - } - - public function ignoreSuppressionOfPhpWarnings(): bool - { - return $this->ignoreSuppressionOfPhpWarnings; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestDirectory.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestDirectory.php deleted file mode 100644 index d19e885..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestDirectory.php +++ /dev/null @@ -1,69 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use PHPUnit\Util\VersionComparisonOperator; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class TestDirectory -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $path; - private readonly string $prefix; - private readonly string $suffix; - private readonly string $phpVersion; - private readonly VersionComparisonOperator $phpVersionOperator; - - /** - * @psalm-param non-empty-string $path - */ - public function __construct(string $path, string $prefix, string $suffix, string $phpVersion, VersionComparisonOperator $phpVersionOperator) - { - $this->path = $path; - $this->prefix = $prefix; - $this->suffix = $suffix; - $this->phpVersion = $phpVersion; - $this->phpVersionOperator = $phpVersionOperator; - } - - /** - * @psalm-return non-empty-string - */ - public function path(): string - { - return $this->path; - } - - public function prefix(): string - { - return $this->prefix; - } - - public function suffix(): string - { - return $this->suffix; - } - - public function phpVersion(): string - { - return $this->phpVersion; - } - - public function phpVersionOperator(): VersionComparisonOperator - { - return $this->phpVersionOperator; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestDirectoryCollection.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestDirectoryCollection.php deleted file mode 100644 index a3667a8..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestDirectoryCollection.php +++ /dev/null @@ -1,65 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use function count; -use Countable; -use IteratorAggregate; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - * - * @template-implements IteratorAggregate - */ -final class TestDirectoryCollection implements Countable, IteratorAggregate -{ - /** - * @psalm-var list - */ - private readonly array $directories; - - /** - * @psalm-param list $directories - */ - public static function fromArray(array $directories): self - { - return new self(...$directories); - } - - private function __construct(TestDirectory ...$directories) - { - $this->directories = $directories; - } - - /** - * @psalm-return list - */ - public function asArray(): array - { - return $this->directories; - } - - public function count(): int - { - return count($this->directories); - } - - public function getIterator(): TestDirectoryCollectionIterator - { - return new TestDirectoryCollectionIterator($this); - } - - public function isEmpty(): bool - { - return $this->count() === 0; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestDirectoryCollectionIterator.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestDirectoryCollectionIterator.php deleted file mode 100644 index 157c498..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestDirectoryCollectionIterator.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use function count; -use function iterator_count; -use Countable; -use Iterator; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @template-implements Iterator - */ -final class TestDirectoryCollectionIterator implements Countable, Iterator -{ - /** - * @psalm-var list - */ - private readonly array $directories; - private int $position = 0; - - public function __construct(TestDirectoryCollection $directories) - { - $this->directories = $directories->asArray(); - } - - public function count(): int - { - return iterator_count($this); - } - - public function rewind(): void - { - $this->position = 0; - } - - public function valid(): bool - { - return $this->position < count($this->directories); - } - - public function key(): int - { - return $this->position; - } - - public function current(): TestDirectory - { - return $this->directories[$this->position]; - } - - public function next(): void - { - $this->position++; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestFile.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestFile.php deleted file mode 100644 index f0a8101..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestFile.php +++ /dev/null @@ -1,46 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use PHPUnit\Util\VersionComparisonOperator; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class TestFile -{ - private readonly string $path; - private readonly string $phpVersion; - private readonly VersionComparisonOperator $phpVersionOperator; - - public function __construct(string $path, string $phpVersion, VersionComparisonOperator $phpVersionOperator) - { - $this->path = $path; - $this->phpVersion = $phpVersion; - $this->phpVersionOperator = $phpVersionOperator; - } - - public function path(): string - { - return $this->path; - } - - public function phpVersion(): string - { - return $this->phpVersion; - } - - public function phpVersionOperator(): VersionComparisonOperator - { - return $this->phpVersionOperator; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestFileCollection.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestFileCollection.php deleted file mode 100644 index 4582664..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestFileCollection.php +++ /dev/null @@ -1,65 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use function count; -use Countable; -use IteratorAggregate; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - * - * @template-implements IteratorAggregate - */ -final class TestFileCollection implements Countable, IteratorAggregate -{ - /** - * @psalm-var list - */ - private readonly array $files; - - /** - * @psalm-param list $files - */ - public static function fromArray(array $files): self - { - return new self(...$files); - } - - private function __construct(TestFile ...$files) - { - $this->files = $files; - } - - /** - * @psalm-return list - */ - public function asArray(): array - { - return $this->files; - } - - public function count(): int - { - return count($this->files); - } - - public function getIterator(): TestFileCollectionIterator - { - return new TestFileCollectionIterator($this); - } - - public function isEmpty(): bool - { - return $this->count() === 0; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestFileCollectionIterator.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestFileCollectionIterator.php deleted file mode 100644 index 4efdfdd..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestFileCollectionIterator.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use function count; -use function iterator_count; -use Countable; -use Iterator; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @template-implements Iterator - */ -final class TestFileCollectionIterator implements Countable, Iterator -{ - /** - * @psalm-var list - */ - private readonly array $files; - private int $position = 0; - - public function __construct(TestFileCollection $files) - { - $this->files = $files->asArray(); - } - - public function count(): int - { - return iterator_count($this); - } - - public function rewind(): void - { - $this->position = 0; - } - - public function valid(): bool - { - return $this->position < count($this->files); - } - - public function key(): int - { - return $this->position; - } - - public function current(): TestFile - { - return $this->files[$this->position]; - } - - public function next(): void - { - $this->position++; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestSuite.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestSuite.php deleted file mode 100644 index 7105242..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestSuite.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class TestSuite -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $name; - private readonly TestDirectoryCollection $directories; - private readonly TestFileCollection $files; - private readonly FileCollection $exclude; - - /** - * @psalm-param non-empty-string $name - */ - public function __construct(string $name, TestDirectoryCollection $directories, TestFileCollection $files, FileCollection $exclude) - { - $this->name = $name; - $this->directories = $directories; - $this->files = $files; - $this->exclude = $exclude; - } - - /** - * @psalm-return non-empty-string - */ - public function name(): string - { - return $this->name; - } - - public function directories(): TestDirectoryCollection - { - return $this->directories; - } - - public function files(): TestFileCollection - { - return $this->files; - } - - public function exclude(): FileCollection - { - return $this->exclude; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestSuiteCollection.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestSuiteCollection.php deleted file mode 100644 index 493ef0a..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestSuiteCollection.php +++ /dev/null @@ -1,65 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use function count; -use Countable; -use IteratorAggregate; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - * - * @template-implements IteratorAggregate - */ -final class TestSuiteCollection implements Countable, IteratorAggregate -{ - /** - * @psalm-var list - */ - private readonly array $testSuites; - - /** - * @psalm-param list $testSuites - */ - public static function fromArray(array $testSuites): self - { - return new self(...$testSuites); - } - - private function __construct(TestSuite ...$testSuites) - { - $this->testSuites = $testSuites; - } - - /** - * @psalm-return list - */ - public function asArray(): array - { - return $this->testSuites; - } - - public function count(): int - { - return count($this->testSuites); - } - - public function getIterator(): TestSuiteCollectionIterator - { - return new TestSuiteCollectionIterator($this); - } - - public function isEmpty(): bool - { - return $this->count() === 0; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestSuiteCollectionIterator.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestSuiteCollectionIterator.php deleted file mode 100644 index 89d35d9..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestSuiteCollectionIterator.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use function count; -use function iterator_count; -use Countable; -use Iterator; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @template-implements Iterator - */ -final class TestSuiteCollectionIterator implements Countable, Iterator -{ - /** - * @psalm-var list - */ - private readonly array $testSuites; - private int $position = 0; - - public function __construct(TestSuiteCollection $testSuites) - { - $this->testSuites = $testSuites->asArray(); - } - - public function count(): int - { - return iterator_count($this); - } - - public function rewind(): void - { - $this->position = 0; - } - - public function valid(): bool - { - return $this->position < count($this->testSuites); - } - - public function key(): int - { - return $this->position; - } - - public function current(): TestSuite - { - return $this->testSuites[$this->position]; - } - - public function next(): void - { - $this->position++; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/Variable.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/Variable.php deleted file mode 100644 index edf41d9..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/Variable.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class Variable -{ - private readonly string $name; - private readonly mixed $value; - private readonly bool $force; - - public function __construct(string $name, mixed $value, bool $force) - { - $this->name = $name; - $this->value = $value; - $this->force = $force; - } - - public function name(): string - { - return $this->name; - } - - public function value(): mixed - { - return $this->value; - } - - public function force(): bool - { - return $this->force; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/VariableCollection.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/VariableCollection.php deleted file mode 100644 index 9c3dc45..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/VariableCollection.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use function count; -use Countable; -use IteratorAggregate; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - * - * @template-implements IteratorAggregate - */ -final class VariableCollection implements Countable, IteratorAggregate -{ - /** - * @psalm-var list - */ - private readonly array $variables; - - /** - * @psalm-param list $variables - */ - public static function fromArray(array $variables): self - { - return new self(...$variables); - } - - private function __construct(Variable ...$variables) - { - $this->variables = $variables; - } - - /** - * @psalm-return list - */ - public function asArray(): array - { - return $this->variables; - } - - public function count(): int - { - return count($this->variables); - } - - public function getIterator(): VariableCollectionIterator - { - return new VariableCollectionIterator($this); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/VariableCollectionIterator.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/VariableCollectionIterator.php deleted file mode 100644 index e9d6a35..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Value/VariableCollectionIterator.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Configuration; - -use function count; -use function iterator_count; -use Countable; -use Iterator; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @template-implements Iterator - */ -final class VariableCollectionIterator implements Countable, Iterator -{ - /** - * @psalm-var list - */ - private readonly array $variables; - private int $position = 0; - - public function __construct(VariableCollection $variables) - { - $this->variables = $variables->asArray(); - } - - public function count(): int - { - return iterator_count($this); - } - - public function rewind(): void - { - $this->position = 0; - } - - public function valid(): bool - { - return $this->position < count($this->variables); - } - - public function key(): int - { - return $this->position; - } - - public function current(): Variable - { - return $this->variables[$this->position]; - } - - public function next(): void - { - $this->position++; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/CodeCoverage.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/CodeCoverage.php deleted file mode 100644 index 4450970..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/CodeCoverage.php +++ /dev/null @@ -1,295 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration\CodeCoverage; - -use function count; -use PHPUnit\TextUI\Configuration\Directory; -use PHPUnit\TextUI\Configuration\FileCollection; -use PHPUnit\TextUI\Configuration\FilterDirectoryCollection; -use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report\Clover; -use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report\Cobertura; -use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report\Crap4j; -use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report\Html; -use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report\Php; -use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report\Text; -use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report\Xml; -use PHPUnit\TextUI\XmlConfiguration\Exception; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class CodeCoverage -{ - private readonly ?Directory $cacheDirectory; - private readonly FilterDirectoryCollection $directories; - private readonly FileCollection $files; - private readonly FilterDirectoryCollection $excludeDirectories; - private readonly FileCollection $excludeFiles; - private readonly bool $pathCoverage; - private readonly bool $includeUncoveredFiles; - private readonly bool $ignoreDeprecatedCodeUnits; - private readonly bool $disableCodeCoverageIgnore; - private readonly ?Clover $clover; - private readonly ?Cobertura $cobertura; - private readonly ?Crap4j $crap4j; - private readonly ?Html $html; - private readonly ?Php $php; - private readonly ?Text $text; - private readonly ?Xml $xml; - - public function __construct(?Directory $cacheDirectory, FilterDirectoryCollection $directories, FileCollection $files, FilterDirectoryCollection $excludeDirectories, FileCollection $excludeFiles, bool $pathCoverage, bool $includeUncoveredFiles, bool $ignoreDeprecatedCodeUnits, bool $disableCodeCoverageIgnore, ?Clover $clover, ?Cobertura $cobertura, ?Crap4j $crap4j, ?Html $html, ?Php $php, ?Text $text, ?Xml $xml) - { - $this->cacheDirectory = $cacheDirectory; - $this->directories = $directories; - $this->files = $files; - $this->excludeDirectories = $excludeDirectories; - $this->excludeFiles = $excludeFiles; - $this->pathCoverage = $pathCoverage; - $this->includeUncoveredFiles = $includeUncoveredFiles; - $this->ignoreDeprecatedCodeUnits = $ignoreDeprecatedCodeUnits; - $this->disableCodeCoverageIgnore = $disableCodeCoverageIgnore; - $this->clover = $clover; - $this->cobertura = $cobertura; - $this->crap4j = $crap4j; - $this->html = $html; - $this->php = $php; - $this->text = $text; - $this->xml = $xml; - } - - /** - * @psalm-assert-if-true !null $this->cacheDirectory - * - * @deprecated - */ - public function hasCacheDirectory(): bool - { - return $this->cacheDirectory !== null; - } - - /** - * @throws Exception - * - * @deprecated - */ - public function cacheDirectory(): Directory - { - if (!$this->hasCacheDirectory()) { - throw new Exception( - 'No cache directory has been configured', - ); - } - - return $this->cacheDirectory; - } - - public function hasNonEmptyListOfFilesToBeIncludedInCodeCoverageReport(): bool - { - return count($this->directories) > 0 || count($this->files) > 0; - } - - public function directories(): FilterDirectoryCollection - { - return $this->directories; - } - - public function files(): FileCollection - { - return $this->files; - } - - public function excludeDirectories(): FilterDirectoryCollection - { - return $this->excludeDirectories; - } - - public function excludeFiles(): FileCollection - { - return $this->excludeFiles; - } - - public function pathCoverage(): bool - { - return $this->pathCoverage; - } - - public function includeUncoveredFiles(): bool - { - return $this->includeUncoveredFiles; - } - - public function ignoreDeprecatedCodeUnits(): bool - { - return $this->ignoreDeprecatedCodeUnits; - } - - public function disableCodeCoverageIgnore(): bool - { - return $this->disableCodeCoverageIgnore; - } - - /** - * @psalm-assert-if-true !null $this->clover - */ - public function hasClover(): bool - { - return $this->clover !== null; - } - - /** - * @throws Exception - */ - public function clover(): Clover - { - if (!$this->hasClover()) { - throw new Exception( - 'Code Coverage report "Clover XML" has not been configured', - ); - } - - return $this->clover; - } - - /** - * @psalm-assert-if-true !null $this->cobertura - */ - public function hasCobertura(): bool - { - return $this->cobertura !== null; - } - - /** - * @throws Exception - */ - public function cobertura(): Cobertura - { - if (!$this->hasCobertura()) { - throw new Exception( - 'Code Coverage report "Cobertura XML" has not been configured', - ); - } - - return $this->cobertura; - } - - /** - * @psalm-assert-if-true !null $this->crap4j - */ - public function hasCrap4j(): bool - { - return $this->crap4j !== null; - } - - /** - * @throws Exception - */ - public function crap4j(): Crap4j - { - if (!$this->hasCrap4j()) { - throw new Exception( - 'Code Coverage report "Crap4J" has not been configured', - ); - } - - return $this->crap4j; - } - - /** - * @psalm-assert-if-true !null $this->html - */ - public function hasHtml(): bool - { - return $this->html !== null; - } - - /** - * @throws Exception - */ - public function html(): Html - { - if (!$this->hasHtml()) { - throw new Exception( - 'Code Coverage report "HTML" has not been configured', - ); - } - - return $this->html; - } - - /** - * @psalm-assert-if-true !null $this->php - */ - public function hasPhp(): bool - { - return $this->php !== null; - } - - /** - * @throws Exception - */ - public function php(): Php - { - if (!$this->hasPhp()) { - throw new Exception( - 'Code Coverage report "PHP" has not been configured', - ); - } - - return $this->php; - } - - /** - * @psalm-assert-if-true !null $this->text - */ - public function hasText(): bool - { - return $this->text !== null; - } - - /** - * @throws Exception - */ - public function text(): Text - { - if (!$this->hasText()) { - throw new Exception( - 'Code Coverage report "Text" has not been configured', - ); - } - - return $this->text; - } - - /** - * @psalm-assert-if-true !null $this->xml - */ - public function hasXml(): bool - { - return $this->xml !== null; - } - - /** - * @throws Exception - */ - public function xml(): Xml - { - if (!$this->hasXml()) { - throw new Exception( - 'Code Coverage report "XML" has not been configured', - ); - } - - return $this->xml; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Clover.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Clover.php deleted file mode 100644 index a815dc4..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Clover.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report; - -use PHPUnit\TextUI\Configuration\File; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class Clover -{ - private readonly File $target; - - public function __construct(File $target) - { - $this->target = $target; - } - - public function target(): File - { - return $this->target; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Cobertura.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Cobertura.php deleted file mode 100644 index c8b560d..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Cobertura.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report; - -use PHPUnit\TextUI\Configuration\File; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class Cobertura -{ - private readonly File $target; - - public function __construct(File $target) - { - $this->target = $target; - } - - public function target(): File - { - return $this->target; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Crap4j.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Crap4j.php deleted file mode 100644 index eff20d6..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Crap4j.php +++ /dev/null @@ -1,41 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report; - -use PHPUnit\TextUI\Configuration\File; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class Crap4j -{ - private readonly File $target; - private readonly int $threshold; - - public function __construct(File $target, int $threshold) - { - $this->target = $target; - $this->threshold = $threshold; - } - - public function target(): File - { - return $this->target; - } - - public function threshold(): int - { - return $this->threshold; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Html.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Html.php deleted file mode 100644 index db6fa53..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Html.php +++ /dev/null @@ -1,106 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report; - -use PHPUnit\TextUI\Configuration\Directory; -use PHPUnit\TextUI\Configuration\NoCustomCssFileException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class Html -{ - private readonly Directory $target; - private readonly int $lowUpperBound; - private readonly int $highLowerBound; - private readonly string $colorSuccessLow; - private readonly string $colorSuccessMedium; - private readonly string $colorSuccessHigh; - private readonly string $colorWarning; - private readonly string $colorDanger; - private readonly ?string $customCssFile; - - public function __construct(Directory $target, int $lowUpperBound, int $highLowerBound, string $colorSuccessLow, string $colorSuccessMedium, string $colorSuccessHigh, string $colorWarning, string $colorDanger, ?string $customCssFile) - { - $this->target = $target; - $this->lowUpperBound = $lowUpperBound; - $this->highLowerBound = $highLowerBound; - $this->colorSuccessLow = $colorSuccessLow; - $this->colorSuccessMedium = $colorSuccessMedium; - $this->colorSuccessHigh = $colorSuccessHigh; - $this->colorWarning = $colorWarning; - $this->colorDanger = $colorDanger; - $this->customCssFile = $customCssFile; - } - - public function target(): Directory - { - return $this->target; - } - - public function lowUpperBound(): int - { - return $this->lowUpperBound; - } - - public function highLowerBound(): int - { - return $this->highLowerBound; - } - - public function colorSuccessLow(): string - { - return $this->colorSuccessLow; - } - - public function colorSuccessMedium(): string - { - return $this->colorSuccessMedium; - } - - public function colorSuccessHigh(): string - { - return $this->colorSuccessHigh; - } - - public function colorWarning(): string - { - return $this->colorWarning; - } - - public function colorDanger(): string - { - return $this->colorDanger; - } - - /** - * @psalm-assert-if-true !null $this->customCssFile - */ - public function hasCustomCssFile(): bool - { - return $this->customCssFile !== null; - } - - /** - * @throws NoCustomCssFileException - */ - public function customCssFile(): string - { - if (!$this->hasCustomCssFile()) { - throw new NoCustomCssFileException; - } - - return $this->customCssFile; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Php.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Php.php deleted file mode 100644 index 39a3762..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Php.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report; - -use PHPUnit\TextUI\Configuration\File; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class Php -{ - private readonly File $target; - - public function __construct(File $target) - { - $this->target = $target; - } - - public function target(): File - { - return $this->target; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Text.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Text.php deleted file mode 100644 index 6ff3c8c..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Text.php +++ /dev/null @@ -1,48 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report; - -use PHPUnit\TextUI\Configuration\File; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class Text -{ - private readonly File $target; - private readonly bool $showUncoveredFiles; - private readonly bool $showOnlySummary; - - public function __construct(File $target, bool $showUncoveredFiles, bool $showOnlySummary) - { - $this->target = $target; - $this->showUncoveredFiles = $showUncoveredFiles; - $this->showOnlySummary = $showOnlySummary; - } - - public function target(): File - { - return $this->target; - } - - public function showUncoveredFiles(): bool - { - return $this->showUncoveredFiles; - } - - public function showOnlySummary(): bool - { - return $this->showOnlySummary; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Xml.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Xml.php deleted file mode 100644 index 09dddc0..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Xml.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report; - -use PHPUnit\TextUI\Configuration\Directory; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class Xml -{ - private readonly Directory $target; - - public function __construct(Directory $target) - { - $this->target = $target; - } - - public function target(): Directory - { - return $this->target; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Configuration.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Configuration.php deleted file mode 100644 index d9a74fa..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Configuration.php +++ /dev/null @@ -1,104 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use PHPUnit\TextUI\Configuration\ExtensionBootstrapCollection; -use PHPUnit\TextUI\Configuration\Php; -use PHPUnit\TextUI\Configuration\Source; -use PHPUnit\TextUI\Configuration\TestSuiteCollection; -use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\CodeCoverage; -use PHPUnit\TextUI\XmlConfiguration\Logging\Logging; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -abstract class Configuration -{ - private readonly ExtensionBootstrapCollection $extensions; - private readonly Source $source; - private readonly CodeCoverage $codeCoverage; - private readonly Groups $groups; - private readonly Logging $logging; - private readonly Php $php; - private readonly PHPUnit $phpunit; - private readonly TestSuiteCollection $testSuite; - - public function __construct(ExtensionBootstrapCollection $extensions, Source $source, CodeCoverage $codeCoverage, Groups $groups, Logging $logging, Php $php, PHPUnit $phpunit, TestSuiteCollection $testSuite) - { - $this->extensions = $extensions; - $this->source = $source; - $this->codeCoverage = $codeCoverage; - $this->groups = $groups; - $this->logging = $logging; - $this->php = $php; - $this->phpunit = $phpunit; - $this->testSuite = $testSuite; - } - - public function extensions(): ExtensionBootstrapCollection - { - return $this->extensions; - } - - public function source(): Source - { - return $this->source; - } - - public function codeCoverage(): CodeCoverage - { - return $this->codeCoverage; - } - - public function groups(): Groups - { - return $this->groups; - } - - public function logging(): Logging - { - return $this->logging; - } - - public function php(): Php - { - return $this->php; - } - - public function phpunit(): PHPUnit - { - return $this->phpunit; - } - - public function testSuite(): TestSuiteCollection - { - return $this->testSuite; - } - - /** - * @psalm-assert-if-true DefaultConfiguration $this - */ - public function isDefault(): bool - { - return false; - } - - /** - * @psalm-assert-if-true LoadedFromFileConfiguration $this - */ - public function wasLoadedFromFile(): bool - { - return false; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/DefaultConfiguration.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/DefaultConfiguration.php deleted file mode 100644 index aa9b8fc..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/DefaultConfiguration.php +++ /dev/null @@ -1,166 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use PHPUnit\Runner\TestSuiteSorter; -use PHPUnit\TextUI\Configuration\ConstantCollection; -use PHPUnit\TextUI\Configuration\DirectoryCollection; -use PHPUnit\TextUI\Configuration\ExtensionBootstrapCollection; -use PHPUnit\TextUI\Configuration\FileCollection; -use PHPUnit\TextUI\Configuration\FilterDirectoryCollection as CodeCoverageFilterDirectoryCollection; -use PHPUnit\TextUI\Configuration\GroupCollection; -use PHPUnit\TextUI\Configuration\IniSettingCollection; -use PHPUnit\TextUI\Configuration\Php; -use PHPUnit\TextUI\Configuration\Source; -use PHPUnit\TextUI\Configuration\TestSuiteCollection; -use PHPUnit\TextUI\Configuration\VariableCollection; -use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\CodeCoverage; -use PHPUnit\TextUI\XmlConfiguration\Logging\Logging; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class DefaultConfiguration extends Configuration -{ - public static function create(): self - { - return new self( - ExtensionBootstrapCollection::fromArray([]), - new Source( - null, - false, - CodeCoverageFilterDirectoryCollection::fromArray([]), - FileCollection::fromArray([]), - CodeCoverageFilterDirectoryCollection::fromArray([]), - FileCollection::fromArray([]), - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - ), - new CodeCoverage( - null, - CodeCoverageFilterDirectoryCollection::fromArray([]), - FileCollection::fromArray([]), - CodeCoverageFilterDirectoryCollection::fromArray([]), - FileCollection::fromArray([]), - false, - true, - false, - false, - null, - null, - null, - null, - null, - null, - null, - ), - new Groups( - GroupCollection::fromArray([]), - GroupCollection::fromArray([]), - ), - new Logging( - null, - null, - null, - null, - ), - new Php( - DirectoryCollection::fromArray([]), - IniSettingCollection::fromArray([]), - ConstantCollection::fromArray([]), - VariableCollection::fromArray([]), - VariableCollection::fromArray([]), - VariableCollection::fromArray([]), - VariableCollection::fromArray([]), - VariableCollection::fromArray([]), - VariableCollection::fromArray([]), - VariableCollection::fromArray([]), - VariableCollection::fromArray([]), - ), - new PHPUnit( - null, - true, - null, - 80, - \PHPUnit\TextUI\Configuration\Configuration::COLOR_DEFAULT, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - null, - false, - false, - false, - false, - true, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - null, - false, - false, - true, - false, - false, - 1, - 1, - 10, - 60, - null, - TestSuiteSorter::ORDER_DEFAULT, - true, - false, - false, - false, - false, - false, - false, - 100, - ), - TestSuiteCollection::fromArray([]), - ); - } - - public function isDefault(): bool - { - return true; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Exception.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Exception.php deleted file mode 100644 index 60c3c9a..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Exception.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Exception extends RuntimeException implements \PHPUnit\Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Generator.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Generator.php deleted file mode 100644 index 865fb5d..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Generator.php +++ /dev/null @@ -1,73 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use function str_replace; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Generator -{ - /** - * @var string - */ - private const TEMPLATE = <<<'EOT' - - - - - {tests_directory} - - - - - - {src_directory} - - - - -EOT; - - public function generateDefaultConfiguration(string $phpunitVersion, string $bootstrapScript, string $testsDirectory, string $srcDirectory, string $cacheDirectory): string - { - return str_replace( - [ - '{phpunit_version}', - '{bootstrap_script}', - '{tests_directory}', - '{src_directory}', - '{cache_directory}', - ], - [ - $phpunitVersion, - $bootstrapScript, - $testsDirectory, - $srcDirectory, - $cacheDirectory, - ], - self::TEMPLATE, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Groups.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Groups.php deleted file mode 100644 index d89908c..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Groups.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use PHPUnit\TextUI\Configuration\GroupCollection; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class Groups -{ - private readonly GroupCollection $include; - private readonly GroupCollection $exclude; - - public function __construct(GroupCollection $include, GroupCollection $exclude) - { - $this->include = $include; - $this->exclude = $exclude; - } - - public function hasInclude(): bool - { - return !$this->include->isEmpty(); - } - - public function include(): GroupCollection - { - return $this->include; - } - - public function hasExclude(): bool - { - return !$this->exclude->isEmpty(); - } - - public function exclude(): GroupCollection - { - return $this->exclude; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/LoadedFromFileConfiguration.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/LoadedFromFileConfiguration.php deleted file mode 100644 index 31106ed..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/LoadedFromFileConfiguration.php +++ /dev/null @@ -1,67 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use PHPUnit\TextUI\Configuration\ExtensionBootstrapCollection; -use PHPUnit\TextUI\Configuration\Php; -use PHPUnit\TextUI\Configuration\Source; -use PHPUnit\TextUI\Configuration\TestSuiteCollection; -use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\CodeCoverage; -use PHPUnit\TextUI\XmlConfiguration\Logging\Logging; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class LoadedFromFileConfiguration extends Configuration -{ - private readonly string $filename; - private readonly ValidationResult $validationResult; - - public function __construct(string $filename, ValidationResult $validationResult, ExtensionBootstrapCollection $extensions, Source $source, CodeCoverage $codeCoverage, Groups $groups, Logging $logging, Php $php, PHPUnit $phpunit, TestSuiteCollection $testSuite) - { - $this->filename = $filename; - $this->validationResult = $validationResult; - - parent::__construct( - $extensions, - $source, - $codeCoverage, - $groups, - $logging, - $php, - $phpunit, - $testSuite, - ); - } - - public function filename(): string - { - return $this->filename; - } - - public function hasValidationErrors(): bool - { - return $this->validationResult->hasValidationErrors(); - } - - public function validationErrors(): string - { - return $this->validationResult->asString(); - } - - public function wasLoadedFromFile(): bool - { - return true; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Loader.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Loader.php deleted file mode 100644 index bc7b420..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Loader.php +++ /dev/null @@ -1,1052 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use const DIRECTORY_SEPARATOR; -use const PHP_VERSION; -use function assert; -use function defined; -use function dirname; -use function explode; -use function is_numeric; -use function preg_match; -use function realpath; -use function str_contains; -use function str_starts_with; -use function strlen; -use function strtolower; -use function substr; -use function trim; -use DOMDocument; -use DOMElement; -use DOMNode; -use DOMXPath; -use PHPUnit\Runner\TestSuiteSorter; -use PHPUnit\Runner\Version; -use PHPUnit\TextUI\Configuration\Configuration; -use PHPUnit\TextUI\Configuration\Constant; -use PHPUnit\TextUI\Configuration\ConstantCollection; -use PHPUnit\TextUI\Configuration\Directory; -use PHPUnit\TextUI\Configuration\DirectoryCollection; -use PHPUnit\TextUI\Configuration\ExtensionBootstrap; -use PHPUnit\TextUI\Configuration\ExtensionBootstrapCollection; -use PHPUnit\TextUI\Configuration\File; -use PHPUnit\TextUI\Configuration\FileCollection; -use PHPUnit\TextUI\Configuration\FilterDirectory; -use PHPUnit\TextUI\Configuration\FilterDirectoryCollection; -use PHPUnit\TextUI\Configuration\Group; -use PHPUnit\TextUI\Configuration\GroupCollection; -use PHPUnit\TextUI\Configuration\IniSetting; -use PHPUnit\TextUI\Configuration\IniSettingCollection; -use PHPUnit\TextUI\Configuration\Php; -use PHPUnit\TextUI\Configuration\Source; -use PHPUnit\TextUI\Configuration\TestDirectory; -use PHPUnit\TextUI\Configuration\TestDirectoryCollection; -use PHPUnit\TextUI\Configuration\TestFile; -use PHPUnit\TextUI\Configuration\TestFileCollection; -use PHPUnit\TextUI\Configuration\TestSuite as TestSuiteConfiguration; -use PHPUnit\TextUI\Configuration\TestSuiteCollection; -use PHPUnit\TextUI\Configuration\Variable; -use PHPUnit\TextUI\Configuration\VariableCollection; -use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\CodeCoverage; -use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report\Clover; -use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report\Cobertura; -use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report\Crap4j; -use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report\Html as CodeCoverageHtml; -use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report\Php as CodeCoveragePhp; -use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report\Text as CodeCoverageText; -use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report\Xml as CodeCoverageXml; -use PHPUnit\TextUI\XmlConfiguration\Logging\Junit; -use PHPUnit\TextUI\XmlConfiguration\Logging\Logging; -use PHPUnit\TextUI\XmlConfiguration\Logging\TeamCity; -use PHPUnit\TextUI\XmlConfiguration\Logging\TestDox\Html as TestDoxHtml; -use PHPUnit\TextUI\XmlConfiguration\Logging\TestDox\Text as TestDoxText; -use PHPUnit\Util\VersionComparisonOperator; -use PHPUnit\Util\Xml\Loader as XmlLoader; -use PHPUnit\Util\Xml\XmlException; -use SebastianBergmann\CodeCoverage\Report\Html\Colors; -use SebastianBergmann\CodeCoverage\Report\Thresholds; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Loader -{ - /** - * @throws Exception - */ - public function load(string $filename): LoadedFromFileConfiguration - { - try { - $document = (new XmlLoader)->loadFile($filename); - } catch (XmlException $e) { - throw new Exception( - $e->getMessage(), - $e->getCode(), - $e, - ); - } - - $xpath = new DOMXPath($document); - - try { - $xsdFilename = (new SchemaFinder)->find(Version::series()); - } catch (CannotFindSchemaException $e) { - throw new Exception( - $e->getMessage(), - $e->getCode(), - $e, - ); - } - - $configurationFileRealpath = realpath($filename); - - return new LoadedFromFileConfiguration( - $configurationFileRealpath, - (new Validator)->validate($document, $xsdFilename), - $this->extensions($xpath), - $this->source($configurationFileRealpath, $xpath), - $this->codeCoverage($configurationFileRealpath, $xpath), - $this->groups($xpath), - $this->logging($configurationFileRealpath, $xpath), - $this->php($configurationFileRealpath, $xpath), - $this->phpunit($configurationFileRealpath, $document), - $this->testSuite($configurationFileRealpath, $xpath), - ); - } - - private function logging(string $filename, DOMXPath $xpath): Logging - { - $junit = null; - $element = $this->element($xpath, 'logging/junit'); - - if ($element) { - $junit = new Junit( - new File( - $this->toAbsolutePath( - $filename, - (string) $this->getStringAttribute($element, 'outputFile'), - ), - ), - ); - } - - $teamCity = null; - $element = $this->element($xpath, 'logging/teamcity'); - - if ($element) { - $teamCity = new TeamCity( - new File( - $this->toAbsolutePath( - $filename, - (string) $this->getStringAttribute($element, 'outputFile'), - ), - ), - ); - } - - $testDoxHtml = null; - $element = $this->element($xpath, 'logging/testdoxHtml'); - - if ($element) { - $testDoxHtml = new TestDoxHtml( - new File( - $this->toAbsolutePath( - $filename, - (string) $this->getStringAttribute($element, 'outputFile'), - ), - ), - ); - } - - $testDoxText = null; - $element = $this->element($xpath, 'logging/testdoxText'); - - if ($element) { - $testDoxText = new TestDoxText( - new File( - $this->toAbsolutePath( - $filename, - (string) $this->getStringAttribute($element, 'outputFile'), - ), - ), - ); - } - - return new Logging( - $junit, - $teamCity, - $testDoxHtml, - $testDoxText, - ); - } - - private function extensions(DOMXPath $xpath): ExtensionBootstrapCollection - { - $extensionBootstrappers = []; - - foreach ($xpath->query('extensions/bootstrap') as $bootstrap) { - assert($bootstrap instanceof DOMElement); - - $parameters = []; - - foreach ($xpath->query('parameter', $bootstrap) as $parameter) { - assert($parameter instanceof DOMElement); - - $parameters[$parameter->getAttribute('name')] = $parameter->getAttribute('value'); - } - - $extensionBootstrappers[] = new ExtensionBootstrap( - $bootstrap->getAttribute('class'), - $parameters, - ); - } - - return ExtensionBootstrapCollection::fromArray($extensionBootstrappers); - } - - /** - * @psalm-return non-empty-string - */ - private function toAbsolutePath(string $filename, string $path): string - { - $path = trim($path); - - if (str_starts_with($path, '/')) { - return $path; - } - - // Matches the following on Windows: - // - \\NetworkComputer\Path - // - \\.\D: - // - \\.\c: - // - C:\Windows - // - C:\windows - // - C:/windows - // - c:/windows - if (defined('PHP_WINDOWS_VERSION_BUILD') && - !empty($path) && - ($path[0] === '\\' || (strlen($path) >= 3 && preg_match('#^[A-Z]:[/\\\]#i', substr($path, 0, 3))))) { - return $path; - } - - if (str_contains($path, '://')) { - return $path; - } - - return dirname($filename) . DIRECTORY_SEPARATOR . $path; - } - - private function source(string $filename, DOMXPath $xpath): Source - { - $baseline = null; - $restrictDeprecations = false; - $restrictNotices = false; - $restrictWarnings = false; - $ignoreSuppressionOfDeprecations = false; - $ignoreSuppressionOfPhpDeprecations = false; - $ignoreSuppressionOfErrors = false; - $ignoreSuppressionOfNotices = false; - $ignoreSuppressionOfPhpNotices = false; - $ignoreSuppressionOfWarnings = false; - $ignoreSuppressionOfPhpWarnings = false; - - $element = $this->element($xpath, 'source'); - - if ($element) { - $baseline = $this->getStringAttribute($element, 'baseline'); - - if ($baseline !== null) { - $baseline = $this->toAbsolutePath($filename, $baseline); - } - - $restrictDeprecations = $this->getBooleanAttribute($element, 'restrictDeprecations', false); - $restrictNotices = $this->getBooleanAttribute($element, 'restrictNotices', false); - $restrictWarnings = $this->getBooleanAttribute($element, 'restrictWarnings', false); - $ignoreSuppressionOfDeprecations = $this->getBooleanAttribute($element, 'ignoreSuppressionOfDeprecations', false); - $ignoreSuppressionOfPhpDeprecations = $this->getBooleanAttribute($element, 'ignoreSuppressionOfPhpDeprecations', false); - $ignoreSuppressionOfErrors = $this->getBooleanAttribute($element, 'ignoreSuppressionOfErrors', false); - $ignoreSuppressionOfNotices = $this->getBooleanAttribute($element, 'ignoreSuppressionOfNotices', false); - $ignoreSuppressionOfPhpNotices = $this->getBooleanAttribute($element, 'ignoreSuppressionOfPhpNotices', false); - $ignoreSuppressionOfWarnings = $this->getBooleanAttribute($element, 'ignoreSuppressionOfWarnings', false); - $ignoreSuppressionOfPhpWarnings = $this->getBooleanAttribute($element, 'ignoreSuppressionOfPhpWarnings', false); - } - - return new Source( - $baseline, - false, - $this->readFilterDirectories($filename, $xpath, 'source/include/directory'), - $this->readFilterFiles($filename, $xpath, 'source/include/file'), - $this->readFilterDirectories($filename, $xpath, 'source/exclude/directory'), - $this->readFilterFiles($filename, $xpath, 'source/exclude/file'), - $restrictDeprecations, - $restrictNotices, - $restrictWarnings, - $ignoreSuppressionOfDeprecations, - $ignoreSuppressionOfPhpDeprecations, - $ignoreSuppressionOfErrors, - $ignoreSuppressionOfNotices, - $ignoreSuppressionOfPhpNotices, - $ignoreSuppressionOfWarnings, - $ignoreSuppressionOfPhpWarnings, - ); - } - - private function codeCoverage(string $filename, DOMXPath $xpath): CodeCoverage - { - $cacheDirectory = null; - $pathCoverage = false; - $includeUncoveredFiles = true; - $ignoreDeprecatedCodeUnits = false; - $disableCodeCoverageIgnore = false; - - $element = $this->element($xpath, 'coverage'); - - if ($element) { - $cacheDirectory = $this->getStringAttribute($element, 'cacheDirectory'); - - if ($cacheDirectory !== null) { - $cacheDirectory = new Directory( - $this->toAbsolutePath($filename, $cacheDirectory), - ); - } - - $pathCoverage = $this->getBooleanAttribute( - $element, - 'pathCoverage', - false, - ); - - $includeUncoveredFiles = $this->getBooleanAttribute( - $element, - 'includeUncoveredFiles', - true, - ); - - $ignoreDeprecatedCodeUnits = $this->getBooleanAttribute( - $element, - 'ignoreDeprecatedCodeUnits', - false, - ); - - $disableCodeCoverageIgnore = $this->getBooleanAttribute( - $element, - 'disableCodeCoverageIgnore', - false, - ); - } - - $clover = null; - $element = $this->element($xpath, 'coverage/report/clover'); - - if ($element) { - $clover = new Clover( - new File( - $this->toAbsolutePath( - $filename, - (string) $this->getStringAttribute($element, 'outputFile'), - ), - ), - ); - } - - $cobertura = null; - $element = $this->element($xpath, 'coverage/report/cobertura'); - - if ($element) { - $cobertura = new Cobertura( - new File( - $this->toAbsolutePath( - $filename, - (string) $this->getStringAttribute($element, 'outputFile'), - ), - ), - ); - } - - $crap4j = null; - $element = $this->element($xpath, 'coverage/report/crap4j'); - - if ($element) { - $crap4j = new Crap4j( - new File( - $this->toAbsolutePath( - $filename, - (string) $this->getStringAttribute($element, 'outputFile'), - ), - ), - $this->getIntegerAttribute($element, 'threshold', 30), - ); - } - - $html = null; - $element = $this->element($xpath, 'coverage/report/html'); - - if ($element) { - $defaultColors = Colors::default(); - $defaultThresholds = Thresholds::default(); - - $html = new CodeCoverageHtml( - new Directory( - $this->toAbsolutePath( - $filename, - (string) $this->getStringAttribute($element, 'outputDirectory'), - ), - ), - $this->getIntegerAttribute($element, 'lowUpperBound', $defaultThresholds->lowUpperBound()), - $this->getIntegerAttribute($element, 'highLowerBound', $defaultThresholds->highLowerBound()), - $this->getStringAttributeWithDefault($element, 'colorSuccessLow', $defaultColors->successLow()), - $this->getStringAttributeWithDefault($element, 'colorSuccessMedium', $defaultColors->successMedium()), - $this->getStringAttributeWithDefault($element, 'colorSuccessHigh', $defaultColors->successHigh()), - $this->getStringAttributeWithDefault($element, 'colorWarning', $defaultColors->warning()), - $this->getStringAttributeWithDefault($element, 'colorDanger', $defaultColors->danger()), - $this->getStringAttribute($element, 'customCssFile'), - ); - } - - $php = null; - $element = $this->element($xpath, 'coverage/report/php'); - - if ($element) { - $php = new CodeCoveragePhp( - new File( - $this->toAbsolutePath( - $filename, - (string) $this->getStringAttribute($element, 'outputFile'), - ), - ), - ); - } - - $text = null; - $element = $this->element($xpath, 'coverage/report/text'); - - if ($element) { - $text = new CodeCoverageText( - new File( - $this->toAbsolutePath( - $filename, - (string) $this->getStringAttribute($element, 'outputFile'), - ), - ), - $this->getBooleanAttribute($element, 'showUncoveredFiles', false), - $this->getBooleanAttribute($element, 'showOnlySummary', false), - ); - } - - $xml = null; - $element = $this->element($xpath, 'coverage/report/xml'); - - if ($element) { - $xml = new CodeCoverageXml( - new Directory( - $this->toAbsolutePath( - $filename, - (string) $this->getStringAttribute($element, 'outputDirectory'), - ), - ), - ); - } - - return new CodeCoverage( - $cacheDirectory, - $this->readFilterDirectories($filename, $xpath, 'coverage/include/directory'), - $this->readFilterFiles($filename, $xpath, 'coverage/include/file'), - $this->readFilterDirectories($filename, $xpath, 'coverage/exclude/directory'), - $this->readFilterFiles($filename, $xpath, 'coverage/exclude/file'), - $pathCoverage, - $includeUncoveredFiles, - $ignoreDeprecatedCodeUnits, - $disableCodeCoverageIgnore, - $clover, - $cobertura, - $crap4j, - $html, - $php, - $text, - $xml, - ); - } - - private function getBoolean(string $value, bool $default): bool - { - if (strtolower($value) === 'false') { - return false; - } - - if (strtolower($value) === 'true') { - return true; - } - - return $default; - } - - private function getValue(string $value): bool|string - { - if (strtolower($value) === 'false') { - return false; - } - - if (strtolower($value) === 'true') { - return true; - } - - return $value; - } - - private function readFilterDirectories(string $filename, DOMXPath $xpath, string $query): FilterDirectoryCollection - { - $directories = []; - - foreach ($xpath->query($query) as $directoryNode) { - assert($directoryNode instanceof DOMElement); - - $directoryPath = $directoryNode->textContent; - - if (!$directoryPath) { - continue; - } - - $directories[] = new FilterDirectory( - $this->toAbsolutePath($filename, $directoryPath), - $directoryNode->hasAttribute('prefix') ? $directoryNode->getAttribute('prefix') : '', - $directoryNode->hasAttribute('suffix') ? $directoryNode->getAttribute('suffix') : '.php', - ); - } - - return FilterDirectoryCollection::fromArray($directories); - } - - private function readFilterFiles(string $filename, DOMXPath $xpath, string $query): FileCollection - { - $files = []; - - foreach ($xpath->query($query) as $file) { - assert($file instanceof DOMNode); - - $filePath = $file->textContent; - - if ($filePath) { - $files[] = new File($this->toAbsolutePath($filename, $filePath)); - } - } - - return FileCollection::fromArray($files); - } - - private function groups(DOMXPath $xpath): Groups - { - $include = []; - $exclude = []; - - foreach ($xpath->query('groups/include/group') as $group) { - assert($group instanceof DOMNode); - - $include[] = new Group($group->textContent); - } - - foreach ($xpath->query('groups/exclude/group') as $group) { - assert($group instanceof DOMNode); - - $exclude[] = new Group($group->textContent); - } - - return new Groups( - GroupCollection::fromArray($include), - GroupCollection::fromArray($exclude), - ); - } - - private function getBooleanAttribute(DOMElement $element, string $attribute, bool $default): bool - { - if (!$element->hasAttribute($attribute)) { - return $default; - } - - return $this->getBoolean( - $element->getAttribute($attribute), - false, - ); - } - - private function getIntegerAttribute(DOMElement $element, string $attribute, int $default): int - { - if (!$element->hasAttribute($attribute)) { - return $default; - } - - return $this->getInteger( - $element->getAttribute($attribute), - $default, - ); - } - - private function getStringAttribute(DOMElement $element, string $attribute): ?string - { - if (!$element->hasAttribute($attribute)) { - return null; - } - - return $element->getAttribute($attribute); - } - - private function getStringAttributeWithDefault(DOMElement $element, string $attribute, string $default): string - { - if (!$element->hasAttribute($attribute)) { - return $default; - } - - return $element->getAttribute($attribute); - } - - private function getInteger(string $value, int $default): int - { - if (is_numeric($value)) { - return (int) $value; - } - - return $default; - } - - private function php(string $filename, DOMXPath $xpath): Php - { - $includePaths = []; - - foreach ($xpath->query('php/includePath') as $includePath) { - assert($includePath instanceof DOMNode); - - $path = $includePath->textContent; - - if ($path) { - $includePaths[] = new Directory($this->toAbsolutePath($filename, $path)); - } - } - - $iniSettings = []; - - foreach ($xpath->query('php/ini') as $ini) { - assert($ini instanceof DOMElement); - - $iniSettings[] = new IniSetting( - $ini->getAttribute('name'), - $ini->getAttribute('value'), - ); - } - - $constants = []; - - foreach ($xpath->query('php/const') as $const) { - assert($const instanceof DOMElement); - - $value = $const->getAttribute('value'); - - $constants[] = new Constant( - $const->getAttribute('name'), - $this->getValue($value), - ); - } - - $variables = [ - 'var' => [], - 'env' => [], - 'post' => [], - 'get' => [], - 'cookie' => [], - 'server' => [], - 'files' => [], - 'request' => [], - ]; - - foreach (['var', 'env', 'post', 'get', 'cookie', 'server', 'files', 'request'] as $array) { - foreach ($xpath->query('php/' . $array) as $var) { - assert($var instanceof DOMElement); - - $name = $var->getAttribute('name'); - $value = $var->getAttribute('value'); - $force = false; - $verbatim = false; - - if ($var->hasAttribute('force')) { - $force = $this->getBoolean($var->getAttribute('force'), false); - } - - if ($var->hasAttribute('verbatim')) { - $verbatim = $this->getBoolean($var->getAttribute('verbatim'), false); - } - - if (!$verbatim) { - $value = $this->getValue($value); - } - - $variables[$array][] = new Variable($name, $value, $force); - } - } - - return new Php( - DirectoryCollection::fromArray($includePaths), - IniSettingCollection::fromArray($iniSettings), - ConstantCollection::fromArray($constants), - VariableCollection::fromArray($variables['var']), - VariableCollection::fromArray($variables['env']), - VariableCollection::fromArray($variables['post']), - VariableCollection::fromArray($variables['get']), - VariableCollection::fromArray($variables['cookie']), - VariableCollection::fromArray($variables['server']), - VariableCollection::fromArray($variables['files']), - VariableCollection::fromArray($variables['request']), - ); - } - - private function phpunit(string $filename, DOMDocument $document): PHPUnit - { - $executionOrder = TestSuiteSorter::ORDER_DEFAULT; - $defectsFirst = false; - $resolveDependencies = $this->getBooleanAttribute($document->documentElement, 'resolveDependencies', true); - - if ($document->documentElement->hasAttribute('executionOrder')) { - foreach (explode(',', $document->documentElement->getAttribute('executionOrder')) as $order) { - switch ($order) { - case 'default': - $executionOrder = TestSuiteSorter::ORDER_DEFAULT; - $defectsFirst = false; - $resolveDependencies = true; - - break; - - case 'depends': - $resolveDependencies = true; - - break; - - case 'no-depends': - $resolveDependencies = false; - - break; - - case 'defects': - $defectsFirst = true; - - break; - - case 'duration': - $executionOrder = TestSuiteSorter::ORDER_DURATION; - - break; - - case 'random': - $executionOrder = TestSuiteSorter::ORDER_RANDOMIZED; - - break; - - case 'reverse': - $executionOrder = TestSuiteSorter::ORDER_REVERSED; - - break; - - case 'size': - $executionOrder = TestSuiteSorter::ORDER_SIZE; - - break; - } - } - } - - $cacheDirectory = $this->getStringAttribute($document->documentElement, 'cacheDirectory'); - - if ($cacheDirectory !== null) { - $cacheDirectory = $this->toAbsolutePath($filename, $cacheDirectory); - } - - $cacheResultFile = $this->getStringAttribute($document->documentElement, 'cacheResultFile'); - - if ($cacheResultFile !== null) { - $cacheResultFile = $this->toAbsolutePath($filename, $cacheResultFile); - } - - $bootstrap = $this->getStringAttribute($document->documentElement, 'bootstrap'); - - if ($bootstrap !== null) { - $bootstrap = $this->toAbsolutePath($filename, $bootstrap); - } - - $extensionsDirectory = $this->getStringAttribute($document->documentElement, 'extensionsDirectory'); - - if ($extensionsDirectory !== null) { - $extensionsDirectory = $this->toAbsolutePath($filename, $extensionsDirectory); - } - - $backupStaticProperties = false; - - if ($document->documentElement->hasAttribute('backupStaticProperties')) { - $backupStaticProperties = $this->getBooleanAttribute($document->documentElement, 'backupStaticProperties', false); - } elseif ($document->documentElement->hasAttribute('backupStaticAttributes')) { - $backupStaticProperties = $this->getBooleanAttribute($document->documentElement, 'backupStaticAttributes', false); - } - - $requireCoverageMetadata = false; - - if ($document->documentElement->hasAttribute('requireCoverageMetadata')) { - $requireCoverageMetadata = $this->getBooleanAttribute($document->documentElement, 'requireCoverageMetadata', false); - } elseif ($document->documentElement->hasAttribute('forceCoversAnnotation')) { - $requireCoverageMetadata = $this->getBooleanAttribute($document->documentElement, 'forceCoversAnnotation', false); - } - - $beStrictAboutCoverageMetadata = false; - - if ($document->documentElement->hasAttribute('beStrictAboutCoverageMetadata')) { - $beStrictAboutCoverageMetadata = $this->getBooleanAttribute($document->documentElement, 'beStrictAboutCoverageMetadata', false); - } elseif ($document->documentElement->hasAttribute('forceCoversAnnotation')) { - $beStrictAboutCoverageMetadata = $this->getBooleanAttribute($document->documentElement, 'beStrictAboutCoversAnnotation', false); - } - - return new PHPUnit( - $cacheDirectory, - $this->getBooleanAttribute($document->documentElement, 'cacheResult', true), - $cacheResultFile, - $this->getColumns($document), - $this->getColors($document), - $this->getBooleanAttribute($document->documentElement, 'stderr', false), - $this->getBooleanAttribute($document->documentElement, 'displayDetailsOnAllIssues', false), - $this->getBooleanAttribute($document->documentElement, 'displayDetailsOnIncompleteTests', false), - $this->getBooleanAttribute($document->documentElement, 'displayDetailsOnSkippedTests', false), - $this->getBooleanAttribute($document->documentElement, 'displayDetailsOnTestsThatTriggerDeprecations', false), - $this->getBooleanAttribute($document->documentElement, 'displayDetailsOnPhpunitDeprecations', false), - $this->getBooleanAttribute($document->documentElement, 'displayDetailsOnTestsThatTriggerErrors', false), - $this->getBooleanAttribute($document->documentElement, 'displayDetailsOnTestsThatTriggerNotices', false), - $this->getBooleanAttribute($document->documentElement, 'displayDetailsOnTestsThatTriggerWarnings', false), - $this->getBooleanAttribute($document->documentElement, 'reverseDefectList', false), - $requireCoverageMetadata, - $bootstrap, - $this->getBooleanAttribute($document->documentElement, 'processIsolation', false), - $this->getBooleanAttribute($document->documentElement, 'failOnAllIssues', false), - $this->getBooleanAttribute($document->documentElement, 'failOnDeprecation', false), - $this->getBooleanAttribute($document->documentElement, 'failOnPhpunitDeprecation', false), - $this->getBooleanAttribute($document->documentElement, 'failOnPhpunitWarning', true), - $this->getBooleanAttribute($document->documentElement, 'failOnEmptyTestSuite', false), - $this->getBooleanAttribute($document->documentElement, 'failOnIncomplete', false), - $this->getBooleanAttribute($document->documentElement, 'failOnNotice', false), - $this->getBooleanAttribute($document->documentElement, 'failOnRisky', false), - $this->getBooleanAttribute($document->documentElement, 'failOnSkipped', false), - $this->getBooleanAttribute($document->documentElement, 'failOnWarning', false), - $this->getBooleanAttribute($document->documentElement, 'stopOnDefect', false), - $this->getBooleanAttribute($document->documentElement, 'stopOnDeprecation', false), - $this->getBooleanAttribute($document->documentElement, 'stopOnError', false), - $this->getBooleanAttribute($document->documentElement, 'stopOnFailure', false), - $this->getBooleanAttribute($document->documentElement, 'stopOnIncomplete', false), - $this->getBooleanAttribute($document->documentElement, 'stopOnNotice', false), - $this->getBooleanAttribute($document->documentElement, 'stopOnRisky', false), - $this->getBooleanAttribute($document->documentElement, 'stopOnSkipped', false), - $this->getBooleanAttribute($document->documentElement, 'stopOnWarning', false), - $extensionsDirectory, - $this->getBooleanAttribute($document->documentElement, 'beStrictAboutChangesToGlobalState', false), - $this->getBooleanAttribute($document->documentElement, 'beStrictAboutOutputDuringTests', false), - $this->getBooleanAttribute($document->documentElement, 'beStrictAboutTestsThatDoNotTestAnything', true), - $beStrictAboutCoverageMetadata, - $this->getBooleanAttribute($document->documentElement, 'enforceTimeLimit', false), - $this->getIntegerAttribute($document->documentElement, 'defaultTimeLimit', 1), - $this->getIntegerAttribute($document->documentElement, 'timeoutForSmallTests', 1), - $this->getIntegerAttribute($document->documentElement, 'timeoutForMediumTests', 10), - $this->getIntegerAttribute($document->documentElement, 'timeoutForLargeTests', 60), - $this->getStringAttribute($document->documentElement, 'defaultTestSuite'), - $executionOrder, - $resolveDependencies, - $defectsFirst, - $this->getBooleanAttribute($document->documentElement, 'backupGlobals', false), - $backupStaticProperties, - $this->getBooleanAttribute($document->documentElement, 'registerMockObjectsFromTestArgumentsRecursively', false), - $this->getBooleanAttribute($document->documentElement, 'testdox', false), - $this->getBooleanAttribute($document->documentElement, 'controlGarbageCollector', false), - $this->getIntegerAttribute($document->documentElement, 'numberOfTestsBeforeGarbageCollection', 100), - ); - } - - private function getColors(DOMDocument $document): string - { - $colors = Configuration::COLOR_DEFAULT; - - if ($document->documentElement->hasAttribute('colors')) { - /* only allow boolean for compatibility with previous versions - 'always' only allowed from command line */ - if ($this->getBoolean($document->documentElement->getAttribute('colors'), false)) { - $colors = Configuration::COLOR_AUTO; - } else { - $colors = Configuration::COLOR_NEVER; - } - } - - return $colors; - } - - private function getColumns(DOMDocument $document): int|string - { - $columns = 80; - - if ($document->documentElement->hasAttribute('columns')) { - $columns = $document->documentElement->getAttribute('columns'); - - if ($columns !== 'max') { - $columns = $this->getInteger($columns, 80); - } - } - - return $columns; - } - - private function testSuite(string $filename, DOMXPath $xpath): TestSuiteCollection - { - $testSuites = []; - - foreach ($this->getTestSuiteElements($xpath) as $element) { - $exclude = []; - - foreach ($element->getElementsByTagName('exclude') as $excludeNode) { - $excludeFile = $excludeNode->textContent; - - if ($excludeFile) { - $exclude[] = new File($this->toAbsolutePath($filename, $excludeFile)); - } - } - - $directories = []; - - foreach ($element->getElementsByTagName('directory') as $directoryNode) { - assert($directoryNode instanceof DOMElement); - - $directory = $directoryNode->textContent; - - if (empty($directory)) { - continue; - } - - $prefix = ''; - - if ($directoryNode->hasAttribute('prefix')) { - $prefix = $directoryNode->getAttribute('prefix'); - } - - $suffix = 'Test.php'; - - if ($directoryNode->hasAttribute('suffix')) { - $suffix = $directoryNode->getAttribute('suffix'); - } - - $phpVersion = PHP_VERSION; - - if ($directoryNode->hasAttribute('phpVersion')) { - $phpVersion = $directoryNode->getAttribute('phpVersion'); - } - - $phpVersionOperator = new VersionComparisonOperator('>='); - - if ($directoryNode->hasAttribute('phpVersionOperator')) { - $phpVersionOperator = new VersionComparisonOperator($directoryNode->getAttribute('phpVersionOperator')); - } - - $directories[] = new TestDirectory( - $this->toAbsolutePath($filename, $directory), - $prefix, - $suffix, - $phpVersion, - $phpVersionOperator, - ); - } - - $files = []; - - foreach ($element->getElementsByTagName('file') as $fileNode) { - assert($fileNode instanceof DOMElement); - - $file = $fileNode->textContent; - - if (empty($file)) { - continue; - } - - $phpVersion = PHP_VERSION; - - if ($fileNode->hasAttribute('phpVersion')) { - $phpVersion = $fileNode->getAttribute('phpVersion'); - } - - $phpVersionOperator = new VersionComparisonOperator('>='); - - if ($fileNode->hasAttribute('phpVersionOperator')) { - $phpVersionOperator = new VersionComparisonOperator($fileNode->getAttribute('phpVersionOperator')); - } - - $files[] = new TestFile( - $this->toAbsolutePath($filename, $file), - $phpVersion, - $phpVersionOperator, - ); - } - - $name = $element->getAttribute('name'); - - assert(!empty($name)); - - $testSuites[] = new TestSuiteConfiguration( - $name, - TestDirectoryCollection::fromArray($directories), - TestFileCollection::fromArray($files), - FileCollection::fromArray($exclude), - ); - } - - return TestSuiteCollection::fromArray($testSuites); - } - - /** - * @psalm-return list - */ - private function getTestSuiteElements(DOMXPath $xpath): array - { - $elements = []; - - $testSuiteNodes = $xpath->query('testsuites/testsuite'); - - if ($testSuiteNodes->length === 0) { - $testSuiteNodes = $xpath->query('testsuite'); - } - - if ($testSuiteNodes->length === 1) { - $element = $testSuiteNodes->item(0); - - assert($element instanceof DOMElement); - - $elements[] = $element; - } else { - foreach ($testSuiteNodes as $testSuiteNode) { - assert($testSuiteNode instanceof DOMElement); - - $elements[] = $testSuiteNode; - } - } - - return $elements; - } - - private function element(DOMXPath $xpath, string $element): ?DOMElement - { - $nodes = $xpath->query($element); - - if ($nodes->length === 1) { - $node = $nodes->item(0); - - assert($node instanceof DOMElement); - - return $node; - } - - return null; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/Junit.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/Junit.php deleted file mode 100644 index 406aaf2..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/Junit.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration\Logging; - -use PHPUnit\TextUI\Configuration\File; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class Junit -{ - private readonly File $target; - - public function __construct(File $target) - { - $this->target = $target; - } - - public function target(): File - { - return $this->target; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/Logging.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/Logging.php deleted file mode 100644 index 8fc3439..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/Logging.php +++ /dev/null @@ -1,105 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration\Logging; - -use PHPUnit\TextUI\XmlConfiguration\Exception; -use PHPUnit\TextUI\XmlConfiguration\Logging\TestDox\Html as TestDoxHtml; -use PHPUnit\TextUI\XmlConfiguration\Logging\TestDox\Text as TestDoxText; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class Logging -{ - private readonly ?Junit $junit; - private readonly ?TeamCity $teamCity; - private readonly ?TestDoxHtml $testDoxHtml; - private readonly ?TestDoxText $testDoxText; - - public function __construct(?Junit $junit, ?TeamCity $teamCity, ?TestDoxHtml $testDoxHtml, ?TestDoxText $testDoxText) - { - $this->junit = $junit; - $this->teamCity = $teamCity; - $this->testDoxHtml = $testDoxHtml; - $this->testDoxText = $testDoxText; - } - - public function hasJunit(): bool - { - return $this->junit !== null; - } - - /** - * @throws Exception - */ - public function junit(): Junit - { - if ($this->junit === null) { - throw new Exception('Logger "JUnit XML" is not configured'); - } - - return $this->junit; - } - - public function hasTeamCity(): bool - { - return $this->teamCity !== null; - } - - /** - * @throws Exception - */ - public function teamCity(): TeamCity - { - if ($this->teamCity === null) { - throw new Exception('Logger "Team City" is not configured'); - } - - return $this->teamCity; - } - - public function hasTestDoxHtml(): bool - { - return $this->testDoxHtml !== null; - } - - /** - * @throws Exception - */ - public function testDoxHtml(): TestDoxHtml - { - if ($this->testDoxHtml === null) { - throw new Exception('Logger "TestDox HTML" is not configured'); - } - - return $this->testDoxHtml; - } - - public function hasTestDoxText(): bool - { - return $this->testDoxText !== null; - } - - /** - * @throws Exception - */ - public function testDoxText(): TestDoxText - { - if ($this->testDoxText === null) { - throw new Exception('Logger "TestDox Text" is not configured'); - } - - return $this->testDoxText; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/TeamCity.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/TeamCity.php deleted file mode 100644 index 2025c1f..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/TeamCity.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration\Logging; - -use PHPUnit\TextUI\Configuration\File; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class TeamCity -{ - private readonly File $target; - - public function __construct(File $target) - { - $this->target = $target; - } - - public function target(): File - { - return $this->target; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/TestDox/Html.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/TestDox/Html.php deleted file mode 100644 index e52587b..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/TestDox/Html.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration\Logging\TestDox; - -use PHPUnit\TextUI\Configuration\File; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class Html -{ - private readonly File $target; - - public function __construct(File $target) - { - $this->target = $target; - } - - public function target(): File - { - return $this->target; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/TestDox/Text.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/TestDox/Text.php deleted file mode 100644 index db47a3e..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/TestDox/Text.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration\Logging\TestDox; - -use PHPUnit\TextUI\Configuration\File; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class Text -{ - private readonly File $target; - - public function __construct(File $target) - { - $this->target = $target; - } - - public function target(): File - { - return $this->target; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/MigrationBuilder.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/MigrationBuilder.php deleted file mode 100644 index 212281f..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/MigrationBuilder.php +++ /dev/null @@ -1,88 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use function version_compare; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class MigrationBuilder -{ - private const AVAILABLE_MIGRATIONS = [ - '8.5' => [ - RemoveLogTypes::class, - ], - - '9.2' => [ - RemoveCacheTokensAttribute::class, - IntroduceCoverageElement::class, - MoveAttributesFromRootToCoverage::class, - MoveAttributesFromFilterWhitelistToCoverage::class, - MoveWhitelistIncludesToCoverage::class, - MoveWhitelistExcludesToCoverage::class, - RemoveEmptyFilter::class, - CoverageCloverToReport::class, - CoverageCrap4jToReport::class, - CoverageHtmlToReport::class, - CoveragePhpToReport::class, - CoverageTextToReport::class, - CoverageXmlToReport::class, - ConvertLogTypes::class, - ], - - '9.5' => [ - RemoveListeners::class, - RemoveTestSuiteLoaderAttributes::class, - RemoveCacheResultFileAttribute::class, - RemoveCoverageElementCacheDirectoryAttribute::class, - RemoveCoverageElementProcessUncoveredFilesAttribute::class, - IntroduceCacheDirectoryAttribute::class, - RenameBackupStaticAttributesAttribute::class, - RemoveBeStrictAboutResourceUsageDuringSmallTestsAttribute::class, - RemoveBeStrictAboutTodoAnnotatedTestsAttribute::class, - RemovePrinterAttributes::class, - RemoveVerboseAttribute::class, - RenameForceCoversAnnotationAttribute::class, - RenameBeStrictAboutCoversAnnotationAttribute::class, - RemoveConversionToExceptionsAttributes::class, - RemoveNoInteractionAttribute::class, - RemoveLoggingElements::class, - RemoveTestDoxGroupsElement::class, - ], - - '10.0' => [ - MoveCoverageDirectoriesToSource::class, - ], - - '10.4' => [ - RemoveBeStrictAboutTodoAnnotatedTestsAttribute::class, - ], - ]; - - public function build(string $fromVersion): array - { - $stack = [new UpdateSchemaLocation]; - - foreach (self::AVAILABLE_MIGRATIONS as $version => $migrations) { - if (version_compare($version, $fromVersion, '<')) { - continue; - } - - foreach ($migrations as $migration) { - $stack[] = new $migration; - } - } - - return $stack; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/MigrationException.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/MigrationException.php deleted file mode 100644 index bb35aca..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/MigrationException.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use PHPUnit\Exception; -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class MigrationException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/ConvertLogTypes.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/ConvertLogTypes.php deleted file mode 100644 index 43a9bf1..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/ConvertLogTypes.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use DOMDocument; -use DOMElement; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ConvertLogTypes implements Migration -{ - public function migrate(DOMDocument $document): void - { - $logging = $document->getElementsByTagName('logging')->item(0); - - if (!$logging instanceof DOMElement) { - return; - } - $types = [ - 'junit' => 'junit', - 'teamcity' => 'teamcity', - 'testdox-html' => 'testdoxHtml', - 'testdox-text' => 'testdoxText', - 'testdox-xml' => 'testdoxXml', - 'plain' => 'text', - ]; - - $logNodes = []; - - foreach ($logging->getElementsByTagName('log') as $logNode) { - if (!isset($types[$logNode->getAttribute('type')])) { - continue; - } - - $logNodes[] = $logNode; - } - - foreach ($logNodes as $oldNode) { - $newLogNode = $document->createElement($types[$oldNode->getAttribute('type')]); - $newLogNode->setAttribute('outputFile', $oldNode->getAttribute('target')); - - $logging->replaceChild($newLogNode, $oldNode); - } - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageCloverToReport.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageCloverToReport.php deleted file mode 100644 index 7d3ee49..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageCloverToReport.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use DOMElement; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class CoverageCloverToReport extends LogToReportMigration -{ - protected function forType(): string - { - return 'coverage-clover'; - } - - protected function toReportFormat(DOMElement $logNode): DOMElement - { - $clover = $logNode->ownerDocument->createElement('clover'); - - $clover->setAttribute('outputFile', $logNode->getAttribute('target')); - - return $clover; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageCrap4jToReport.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageCrap4jToReport.php deleted file mode 100644 index 2b49478..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageCrap4jToReport.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use DOMElement; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class CoverageCrap4jToReport extends LogToReportMigration -{ - protected function forType(): string - { - return 'coverage-crap4j'; - } - - protected function toReportFormat(DOMElement $logNode): DOMElement - { - $crap4j = $logNode->ownerDocument->createElement('crap4j'); - $crap4j->setAttribute('outputFile', $logNode->getAttribute('target')); - - $this->migrateAttributes($logNode, $crap4j, ['threshold']); - - return $crap4j; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageHtmlToReport.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageHtmlToReport.php deleted file mode 100644 index 64af982..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageHtmlToReport.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use DOMElement; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class CoverageHtmlToReport extends LogToReportMigration -{ - protected function forType(): string - { - return 'coverage-html'; - } - - protected function toReportFormat(DOMElement $logNode): DOMElement - { - $html = $logNode->ownerDocument->createElement('html'); - $html->setAttribute('outputDirectory', $logNode->getAttribute('target')); - - $this->migrateAttributes($logNode, $html, ['lowUpperBound', 'highLowerBound']); - - return $html; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoveragePhpToReport.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoveragePhpToReport.php deleted file mode 100644 index 93868c4..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoveragePhpToReport.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use DOMElement; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class CoveragePhpToReport extends LogToReportMigration -{ - protected function forType(): string - { - return 'coverage-php'; - } - - protected function toReportFormat(DOMElement $logNode): DOMElement - { - $php = $logNode->ownerDocument->createElement('php'); - $php->setAttribute('outputFile', $logNode->getAttribute('target')); - - return $php; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageTextToReport.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageTextToReport.php deleted file mode 100644 index f50be1d..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageTextToReport.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use DOMElement; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class CoverageTextToReport extends LogToReportMigration -{ - protected function forType(): string - { - return 'coverage-text'; - } - - protected function toReportFormat(DOMElement $logNode): DOMElement - { - $text = $logNode->ownerDocument->createElement('text'); - $text->setAttribute('outputFile', $logNode->getAttribute('target')); - - $this->migrateAttributes($logNode, $text, ['showUncoveredFiles', 'showOnlySummary']); - - return $text; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageXmlToReport.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageXmlToReport.php deleted file mode 100644 index 2ea7cdc..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageXmlToReport.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use DOMElement; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class CoverageXmlToReport extends LogToReportMigration -{ - protected function forType(): string - { - return 'coverage-xml'; - } - - protected function toReportFormat(DOMElement $logNode): DOMElement - { - $xml = $logNode->ownerDocument->createElement('xml'); - $xml->setAttribute('outputDirectory', $logNode->getAttribute('target')); - - return $xml; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/IntroduceCacheDirectoryAttribute.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/IntroduceCacheDirectoryAttribute.php deleted file mode 100644 index fe0e0a2..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/IntroduceCacheDirectoryAttribute.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use function assert; -use DOMDocument; -use DOMElement; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class IntroduceCacheDirectoryAttribute implements Migration -{ - public function migrate(DOMDocument $document): void - { - $root = $document->documentElement; - - assert($root instanceof DOMElement); - - if ($root->hasAttribute('cacheDirectory')) { - return; - } - - $root->setAttribute('cacheDirectory', '.phpunit.cache'); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/IntroduceCoverageElement.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/IntroduceCoverageElement.php deleted file mode 100644 index 54b5485..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/IntroduceCoverageElement.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use DOMDocument; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class IntroduceCoverageElement implements Migration -{ - public function migrate(DOMDocument $document): void - { - $coverage = $document->createElement('coverage'); - - $document->documentElement->insertBefore( - $coverage, - $document->documentElement->firstChild, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/LogToReportMigration.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/LogToReportMigration.php deleted file mode 100644 index 321260b..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/LogToReportMigration.php +++ /dev/null @@ -1,81 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use function sprintf; -use DOMDocument; -use DOMElement; -use DOMXPath; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -abstract class LogToReportMigration implements Migration -{ - /** - * @throws MigrationException - */ - public function migrate(DOMDocument $document): void - { - $coverage = $document->getElementsByTagName('coverage')->item(0); - - if (!$coverage instanceof DOMElement) { - throw new MigrationException('Unexpected state - No coverage element'); - } - - $logNode = $this->findLogNode($document); - - if ($logNode === null) { - return; - } - - $reportChild = $this->toReportFormat($logNode); - - $report = $coverage->getElementsByTagName('report')->item(0); - - if ($report === null) { - $report = $coverage->appendChild($document->createElement('report')); - } - - $report->appendChild($reportChild); - $logNode->parentNode->removeChild($logNode); - } - - protected function migrateAttributes(DOMElement $src, DOMElement $dest, array $attributes): void - { - foreach ($attributes as $attr) { - if (!$src->hasAttribute($attr)) { - continue; - } - - $dest->setAttribute($attr, $src->getAttribute($attr)); - $src->removeAttribute($attr); - } - } - - abstract protected function forType(): string; - - abstract protected function toReportFormat(DOMElement $logNode): DOMElement; - - private function findLogNode(DOMDocument $document): ?DOMElement - { - $logNode = (new DOMXPath($document))->query( - sprintf('//logging/log[@type="%s"]', $this->forType()), - )->item(0); - - if (!$logNode instanceof DOMElement) { - return null; - } - - return $logNode; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/Migration.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/Migration.php deleted file mode 100644 index 6fd0524..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/Migration.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use DOMDocument; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This interface is not covered by the backward compatibility promise for PHPUnit - */ -interface Migration -{ - public function migrate(DOMDocument $document): void; -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveAttributesFromFilterWhitelistToCoverage.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveAttributesFromFilterWhitelistToCoverage.php deleted file mode 100644 index b6ed401..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveAttributesFromFilterWhitelistToCoverage.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use DOMDocument; -use DOMElement; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class MoveAttributesFromFilterWhitelistToCoverage implements Migration -{ - /** - * @throws MigrationException - */ - public function migrate(DOMDocument $document): void - { - $whitelist = $document->getElementsByTagName('whitelist')->item(0); - - if (!$whitelist) { - return; - } - - $coverage = $document->getElementsByTagName('coverage')->item(0); - - if (!$coverage instanceof DOMElement) { - throw new MigrationException('Unexpected state - No coverage element'); - } - - $map = [ - 'addUncoveredFilesFromWhitelist' => 'includeUncoveredFiles', - 'processUncoveredFilesFromWhitelist' => 'processUncoveredFiles', - ]; - - foreach ($map as $old => $new) { - if (!$whitelist->hasAttribute($old)) { - continue; - } - - $coverage->setAttribute($new, $whitelist->getAttribute($old)); - $whitelist->removeAttribute($old); - } - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveAttributesFromRootToCoverage.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveAttributesFromRootToCoverage.php deleted file mode 100644 index 40b95fe..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveAttributesFromRootToCoverage.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use function assert; -use DOMDocument; -use DOMElement; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class MoveAttributesFromRootToCoverage implements Migration -{ - /** - * @throws MigrationException - */ - public function migrate(DOMDocument $document): void - { - $map = [ - 'disableCodeCoverageIgnore' => 'disableCodeCoverageIgnore', - 'ignoreDeprecatedCodeUnitsFromCodeCoverage' => 'ignoreDeprecatedCodeUnits', - ]; - - $root = $document->documentElement; - - assert($root instanceof DOMElement); - - $coverage = $document->getElementsByTagName('coverage')->item(0); - - if (!$coverage instanceof DOMElement) { - throw new MigrationException('Unexpected state - No coverage element'); - } - - foreach ($map as $old => $new) { - if (!$root->hasAttribute($old)) { - continue; - } - - $coverage->setAttribute($new, $root->getAttribute($old)); - $root->removeAttribute($old); - } - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveCoverageDirectoriesToSource.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveCoverageDirectoriesToSource.php deleted file mode 100644 index 737c473..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveCoverageDirectoriesToSource.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use function assert; -use DOMDocument; -use DOMElement; -use DOMXPath; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class MoveCoverageDirectoriesToSource implements Migration -{ - /** - * @throws MigrationException - */ - public function migrate(DOMDocument $document): void - { - $source = $document->getElementsByTagName('source')->item(0); - - if ($source !== null) { - return; - } - - $coverage = $document->getElementsByTagName('coverage')->item(0); - - if ($coverage === null) { - return; - } - - $root = $document->documentElement; - - assert($root instanceof DOMElement); - - $source = $document->createElement('source'); - $root->appendChild($source); - - $xpath = new DOMXPath($document); - - foreach (['include', 'exclude'] as $element) { - foreach (SnapshotNodeList::fromNodeList($xpath->query('//coverage/' . $element)) as $node) { - $source->appendChild($node); - } - } - - if ($coverage->childElementCount !== 0) { - return; - } - - assert($coverage->parentNode !== null); - - $coverage->parentNode->removeChild($coverage); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveWhitelistExcludesToCoverage.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveWhitelistExcludesToCoverage.php deleted file mode 100644 index 311fb56..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveWhitelistExcludesToCoverage.php +++ /dev/null @@ -1,73 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use function assert; -use function in_array; -use DOMDocument; -use DOMElement; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class MoveWhitelistExcludesToCoverage implements Migration -{ - /** - * @throws MigrationException - */ - public function migrate(DOMDocument $document): void - { - $whitelist = $document->getElementsByTagName('whitelist')->item(0); - - if ($whitelist === null) { - return; - } - - $excludeNodes = SnapshotNodeList::fromNodeList($whitelist->getElementsByTagName('exclude')); - - if ($excludeNodes->count() === 0) { - return; - } - - $coverage = $document->getElementsByTagName('coverage')->item(0); - - if (!$coverage instanceof DOMElement) { - throw new MigrationException('Unexpected state - No coverage element'); - } - - $targetExclude = $coverage->getElementsByTagName('exclude')->item(0); - - if ($targetExclude === null) { - $targetExclude = $coverage->appendChild( - $document->createElement('exclude'), - ); - } - - foreach ($excludeNodes as $excludeNode) { - assert($excludeNode instanceof DOMElement); - - foreach (SnapshotNodeList::fromNodeList($excludeNode->childNodes) as $child) { - if (!$child instanceof DOMElement || !in_array($child->nodeName, ['directory', 'file'], true)) { - continue; - } - - $targetExclude->appendChild($child); - } - - if ($excludeNode->getElementsByTagName('*')->count() !== 0) { - throw new MigrationException('Dangling child elements in exclude found.'); - } - - $whitelist->removeChild($excludeNode); - } - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveWhitelistIncludesToCoverage.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveWhitelistIncludesToCoverage.php deleted file mode 100644 index 19c1f14..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveWhitelistIncludesToCoverage.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use DOMDocument; -use DOMElement; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class MoveWhitelistIncludesToCoverage implements Migration -{ - /** - * @throws MigrationException - */ - public function migrate(DOMDocument $document): void - { - $whitelist = $document->getElementsByTagName('whitelist')->item(0); - - if ($whitelist === null) { - return; - } - - $coverage = $document->getElementsByTagName('coverage')->item(0); - - if (!$coverage instanceof DOMElement) { - throw new MigrationException('Unexpected state - No coverage element'); - } - - $include = $document->createElement('include'); - $coverage->appendChild($include); - - foreach (SnapshotNodeList::fromNodeList($whitelist->childNodes) as $child) { - if (!$child instanceof DOMElement) { - continue; - } - - if (!($child->nodeName === 'directory' || $child->nodeName === 'file')) { - continue; - } - - $include->appendChild($child); - } - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveBeStrictAboutResourceUsageDuringSmallTestsAttribute.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveBeStrictAboutResourceUsageDuringSmallTestsAttribute.php deleted file mode 100644 index ee49fcf..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveBeStrictAboutResourceUsageDuringSmallTestsAttribute.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use function assert; -use DOMDocument; -use DOMElement; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class RemoveBeStrictAboutResourceUsageDuringSmallTestsAttribute implements Migration -{ - public function migrate(DOMDocument $document): void - { - $root = $document->documentElement; - - assert($root instanceof DOMElement); - - if ($root->hasAttribute('beStrictAboutResourceUsageDuringSmallTests')) { - $root->removeAttribute('beStrictAboutResourceUsageDuringSmallTests'); - } - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveBeStrictAboutTodoAnnotatedTestsAttribute.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveBeStrictAboutTodoAnnotatedTestsAttribute.php deleted file mode 100644 index d7ab28f..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveBeStrictAboutTodoAnnotatedTestsAttribute.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use function assert; -use DOMDocument; -use DOMElement; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class RemoveBeStrictAboutTodoAnnotatedTestsAttribute implements Migration -{ - public function migrate(DOMDocument $document): void - { - $root = $document->documentElement; - - assert($root instanceof DOMElement); - - if ($root->hasAttribute('beStrictAboutTodoAnnotatedTests')) { - $root->removeAttribute('beStrictAboutTodoAnnotatedTests'); - } - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCacheResultFileAttribute.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCacheResultFileAttribute.php deleted file mode 100644 index e283b64..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCacheResultFileAttribute.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use function assert; -use DOMDocument; -use DOMElement; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class RemoveCacheResultFileAttribute implements Migration -{ - public function migrate(DOMDocument $document): void - { - $root = $document->documentElement; - - assert($root instanceof DOMElement); - - if ($root->hasAttribute('cacheResultFile')) { - $root->removeAttribute('cacheResultFile'); - } - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCacheTokensAttribute.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCacheTokensAttribute.php deleted file mode 100644 index 5ab7e04..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCacheTokensAttribute.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use function assert; -use DOMDocument; -use DOMElement; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class RemoveCacheTokensAttribute implements Migration -{ - public function migrate(DOMDocument $document): void - { - $root = $document->documentElement; - - assert($root instanceof DOMElement); - - if ($root->hasAttribute('cacheTokens')) { - $root->removeAttribute('cacheTokens'); - } - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveConversionToExceptionsAttributes.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveConversionToExceptionsAttributes.php deleted file mode 100644 index 339b3e2..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveConversionToExceptionsAttributes.php +++ /dev/null @@ -1,45 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use function assert; -use DOMDocument; -use DOMElement; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class RemoveConversionToExceptionsAttributes implements Migration -{ - public function migrate(DOMDocument $document): void - { - $root = $document->documentElement; - - assert($root instanceof DOMElement); - - if ($root->hasAttribute('convertDeprecationsToExceptions')) { - $root->removeAttribute('convertDeprecationsToExceptions'); - } - - if ($root->hasAttribute('convertErrorsToExceptions')) { - $root->removeAttribute('convertErrorsToExceptions'); - } - - if ($root->hasAttribute('convertNoticesToExceptions')) { - $root->removeAttribute('convertNoticesToExceptions'); - } - - if ($root->hasAttribute('convertWarningsToExceptions')) { - $root->removeAttribute('convertWarningsToExceptions'); - } - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCoverageElementCacheDirectoryAttribute.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCoverageElementCacheDirectoryAttribute.php deleted file mode 100644 index 4a71bbb..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCoverageElementCacheDirectoryAttribute.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use DOMDocument; -use DOMElement; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class RemoveCoverageElementCacheDirectoryAttribute implements Migration -{ - public function migrate(DOMDocument $document): void - { - $node = $document->getElementsByTagName('coverage')->item(0); - - if (!$node instanceof DOMElement || $node->parentNode === null) { - return; - } - - if ($node->hasAttribute('cacheDirectory')) { - $node->removeAttribute('cacheDirectory'); - } - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCoverageElementProcessUncoveredFilesAttribute.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCoverageElementProcessUncoveredFilesAttribute.php deleted file mode 100644 index 720b65c..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCoverageElementProcessUncoveredFilesAttribute.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use DOMDocument; -use DOMElement; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class RemoveCoverageElementProcessUncoveredFilesAttribute implements Migration -{ - public function migrate(DOMDocument $document): void - { - $node = $document->getElementsByTagName('coverage')->item(0); - - if (!$node instanceof DOMElement || $node->parentNode === null) { - return; - } - - if ($node->hasAttribute('processUncoveredFiles')) { - $node->removeAttribute('processUncoveredFiles'); - } - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveEmptyFilter.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveEmptyFilter.php deleted file mode 100644 index 2d8fea5..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveEmptyFilter.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use function sprintf; -use DOMDocument; -use DOMElement; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class RemoveEmptyFilter implements Migration -{ - /** - * @throws MigrationException - */ - public function migrate(DOMDocument $document): void - { - $whitelist = $document->getElementsByTagName('whitelist')->item(0); - - if ($whitelist instanceof DOMElement) { - $this->ensureEmpty($whitelist); - $whitelist->parentNode->removeChild($whitelist); - } - - $filter = $document->getElementsByTagName('filter')->item(0); - - if ($filter instanceof DOMElement) { - $this->ensureEmpty($filter); - $filter->parentNode->removeChild($filter); - } - } - - /** - * @throws MigrationException - */ - private function ensureEmpty(DOMElement $element): void - { - if ($element->attributes->length > 0) { - throw new MigrationException(sprintf('%s element has unexpected attributes', $element->nodeName)); - } - - if ($element->getElementsByTagName('*')->length > 0) { - throw new MigrationException(sprintf('%s element has unexpected children', $element->nodeName)); - } - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveListeners.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveListeners.php deleted file mode 100644 index b493d1c..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveListeners.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use DOMDocument; -use DOMElement; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class RemoveListeners implements Migration -{ - public function migrate(DOMDocument $document): void - { - $node = $document->getElementsByTagName('listeners')->item(0); - - if (!$node instanceof DOMElement || $node->parentNode === null) { - return; - } - - $node->parentNode->removeChild($node); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveLogTypes.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveLogTypes.php deleted file mode 100644 index 9591f8c..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveLogTypes.php +++ /dev/null @@ -1,41 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use function assert; -use DOMDocument; -use DOMElement; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class RemoveLogTypes implements Migration -{ - public function migrate(DOMDocument $document): void - { - $logging = $document->getElementsByTagName('logging')->item(0); - - if (!$logging instanceof DOMElement) { - return; - } - - foreach (SnapshotNodeList::fromNodeList($logging->getElementsByTagName('log')) as $logNode) { - assert($logNode instanceof DOMElement); - - switch ($logNode->getAttribute('type')) { - case 'json': - case 'tap': - $logging->removeChild($logNode); - } - } - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveLoggingElements.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveLoggingElements.php deleted file mode 100644 index de09f8c..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveLoggingElements.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use DOMDocument; -use DOMElement; -use DOMXPath; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class RemoveLoggingElements implements Migration -{ - public function migrate(DOMDocument $document): void - { - $this->removeTestDoxElement($document); - $this->removeTextElement($document); - } - - private function removeTestDoxElement(DOMDocument $document): void - { - $node = (new DOMXPath($document))->query('logging/testdoxXml')->item(0); - - if (!$node instanceof DOMElement || $node->parentNode === null) { - return; - } - - $node->parentNode->removeChild($node); - } - - private function removeTextElement(DOMDocument $document): void - { - $node = (new DOMXPath($document))->query('logging/text')->item(0); - - if (!$node instanceof DOMElement || $node->parentNode === null) { - return; - } - - $node->parentNode->removeChild($node); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveNoInteractionAttribute.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveNoInteractionAttribute.php deleted file mode 100644 index c3dd3f1..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveNoInteractionAttribute.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use function assert; -use DOMDocument; -use DOMElement; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class RemoveNoInteractionAttribute implements Migration -{ - public function migrate(DOMDocument $document): void - { - $root = $document->documentElement; - - assert($root instanceof DOMElement); - - if ($root->hasAttribute('noInteraction')) { - $root->removeAttribute('noInteraction'); - } - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemovePrinterAttributes.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemovePrinterAttributes.php deleted file mode 100644 index 2d1d03f..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemovePrinterAttributes.php +++ /dev/null @@ -1,37 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use function assert; -use DOMDocument; -use DOMElement; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class RemovePrinterAttributes implements Migration -{ - public function migrate(DOMDocument $document): void - { - $root = $document->documentElement; - - assert($root instanceof DOMElement); - - if ($root->hasAttribute('printerClass')) { - $root->removeAttribute('printerClass'); - } - - if ($root->hasAttribute('printerFile')) { - $root->removeAttribute('printerFile'); - } - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveTestDoxGroupsElement.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveTestDoxGroupsElement.php deleted file mode 100644 index eb2f135..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveTestDoxGroupsElement.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use DOMDocument; -use DOMElement; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class RemoveTestDoxGroupsElement implements Migration -{ - public function migrate(DOMDocument $document): void - { - $node = $document->getElementsByTagName('testdoxGroups')->item(0); - - if (!$node instanceof DOMElement || $node->parentNode === null) { - return; - } - - $node->parentNode->removeChild($node); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveTestSuiteLoaderAttributes.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveTestSuiteLoaderAttributes.php deleted file mode 100644 index 823c964..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveTestSuiteLoaderAttributes.php +++ /dev/null @@ -1,37 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use function assert; -use DOMDocument; -use DOMElement; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class RemoveTestSuiteLoaderAttributes implements Migration -{ - public function migrate(DOMDocument $document): void - { - $root = $document->documentElement; - - assert($root instanceof DOMElement); - - if ($root->hasAttribute('testSuiteLoaderClass')) { - $root->removeAttribute('testSuiteLoaderClass'); - } - - if ($root->hasAttribute('testSuiteLoaderFile')) { - $root->removeAttribute('testSuiteLoaderFile'); - } - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveVerboseAttribute.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveVerboseAttribute.php deleted file mode 100644 index 0233d8b..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveVerboseAttribute.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use function assert; -use DOMDocument; -use DOMElement; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class RemoveVerboseAttribute implements Migration -{ - public function migrate(DOMDocument $document): void - { - $root = $document->documentElement; - - assert($root instanceof DOMElement); - - if ($root->hasAttribute('verbose')) { - $root->removeAttribute('verbose'); - } - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RenameBackupStaticAttributesAttribute.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RenameBackupStaticAttributesAttribute.php deleted file mode 100644 index b04bbdb..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RenameBackupStaticAttributesAttribute.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use function assert; -use DOMDocument; -use DOMElement; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class RenameBackupStaticAttributesAttribute implements Migration -{ - public function migrate(DOMDocument $document): void - { - $root = $document->documentElement; - - assert($root instanceof DOMElement); - - if ($root->hasAttribute('backupStaticProperties')) { - return; - } - - if (!$root->hasAttribute('backupStaticAttributes')) { - return; - } - - $root->setAttribute('backupStaticProperties', $root->getAttribute('backupStaticAttributes')); - $root->removeAttribute('backupStaticAttributes'); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RenameBeStrictAboutCoversAnnotationAttribute.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RenameBeStrictAboutCoversAnnotationAttribute.php deleted file mode 100644 index 3950e2a..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RenameBeStrictAboutCoversAnnotationAttribute.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use function assert; -use DOMDocument; -use DOMElement; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class RenameBeStrictAboutCoversAnnotationAttribute implements Migration -{ - public function migrate(DOMDocument $document): void - { - $root = $document->documentElement; - - assert($root instanceof DOMElement); - - if ($root->hasAttribute('beStrictAboutCoverageMetadata')) { - return; - } - - if (!$root->hasAttribute('beStrictAboutCoversAnnotation')) { - return; - } - - $root->setAttribute('beStrictAboutCoverageMetadata', $root->getAttribute('beStrictAboutCoversAnnotation')); - $root->removeAttribute('beStrictAboutCoversAnnotation'); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RenameForceCoversAnnotationAttribute.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RenameForceCoversAnnotationAttribute.php deleted file mode 100644 index c384be2..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RenameForceCoversAnnotationAttribute.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use function assert; -use DOMDocument; -use DOMElement; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class RenameForceCoversAnnotationAttribute implements Migration -{ - public function migrate(DOMDocument $document): void - { - $root = $document->documentElement; - - assert($root instanceof DOMElement); - - if ($root->hasAttribute('requireCoverageMetadata')) { - return; - } - - if (!$root->hasAttribute('forceCoversAnnotation')) { - return; - } - - $root->setAttribute('requireCoverageMetadata', $root->getAttribute('forceCoversAnnotation')); - $root->removeAttribute('forceCoversAnnotation'); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/UpdateSchemaLocation.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/UpdateSchemaLocation.php deleted file mode 100644 index 6f39eb4..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/UpdateSchemaLocation.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use function assert; -use DOMDocument; -use DOMElement; -use PHPUnit\Runner\Version; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class UpdateSchemaLocation implements Migration -{ - public function migrate(DOMDocument $document): void - { - $root = $document->documentElement; - - assert($root instanceof DOMElement); - - $root->setAttributeNS( - 'http://www.w3.org/2001/XMLSchema-instance', - 'xsi:noNamespaceSchemaLocation', - 'https://schema.phpunit.de/' . Version::series() . '/phpunit.xsd', - ); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrator.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrator.php deleted file mode 100644 index 278789f..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrator.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use PHPUnit\Runner\Version; -use PHPUnit\Util\Xml\Loader as XmlLoader; -use PHPUnit\Util\Xml\XmlException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Migrator -{ - /** - * @throws Exception - * @throws MigrationException - * @throws XmlException - */ - public function migrate(string $filename): string - { - $origin = (new SchemaDetector)->detect($filename); - - if (!$origin->detected()) { - throw new Exception('The file does not validate against any known schema'); - } - - if ($origin->version() === Version::series()) { - throw new Exception('The file does not need to be migrated'); - } - - $configurationDocument = (new XmlLoader)->loadFile($filename); - - foreach ((new MigrationBuilder)->build($origin->version()) as $migration) { - $migration->migrate($configurationDocument); - } - - $configurationDocument->formatOutput = true; - $configurationDocument->preserveWhiteSpace = false; - - return $configurationDocument->saveXML(); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/SnapshotNodeList.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/SnapshotNodeList.php deleted file mode 100644 index c87d054..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/SnapshotNodeList.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use function count; -use ArrayIterator; -use Countable; -use DOMNode; -use DOMNodeList; -use IteratorAggregate; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @template-implements IteratorAggregate - */ -final class SnapshotNodeList implements Countable, IteratorAggregate -{ - /** - * @psalm-var list - */ - private array $nodes = []; - - public static function fromNodeList(DOMNodeList $list): self - { - $snapshot = new self; - - foreach ($list as $node) { - $snapshot->nodes[] = $node; - } - - return $snapshot; - } - - public function count(): int - { - return count($this->nodes); - } - - public function getIterator(): ArrayIterator - { - return new ArrayIterator($this->nodes); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/PHPUnit.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/PHPUnit.php deleted file mode 100644 index 55a006f..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/PHPUnit.php +++ /dev/null @@ -1,515 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class PHPUnit -{ - private readonly ?string $cacheDirectory; - private readonly bool $cacheResult; - private readonly ?string $cacheResultFile; - private readonly int|string $columns; - private readonly string $colors; - private readonly bool $stderr; - private readonly bool $displayDetailsOnAllIssues; - private readonly bool $displayDetailsOnIncompleteTests; - private readonly bool $displayDetailsOnSkippedTests; - private readonly bool $displayDetailsOnTestsThatTriggerDeprecations; - private readonly bool $displayDetailsOnPhpunitDeprecations; - private readonly bool $displayDetailsOnTestsThatTriggerErrors; - private readonly bool $displayDetailsOnTestsThatTriggerNotices; - private readonly bool $displayDetailsOnTestsThatTriggerWarnings; - private readonly bool $reverseDefectList; - private readonly bool $requireCoverageMetadata; - private readonly ?string $bootstrap; - private readonly bool $processIsolation; - private readonly bool $failOnAllIssues; - private readonly bool $failOnDeprecation; - private readonly bool $failOnPhpunitDeprecation; - private readonly bool $failOnPhpunitWarning; - private readonly bool $failOnEmptyTestSuite; - private readonly bool $failOnIncomplete; - private readonly bool $failOnNotice; - private readonly bool $failOnRisky; - private readonly bool $failOnSkipped; - private readonly bool $failOnWarning; - private readonly bool $stopOnDefect; - private readonly bool $stopOnDeprecation; - private readonly bool $stopOnError; - private readonly bool $stopOnFailure; - private readonly bool $stopOnIncomplete; - private readonly bool $stopOnNotice; - private readonly bool $stopOnRisky; - private readonly bool $stopOnSkipped; - private readonly bool $stopOnWarning; - - /** - * @psalm-var ?non-empty-string - */ - private readonly ?string $extensionsDirectory; - private readonly bool $beStrictAboutChangesToGlobalState; - private readonly bool $beStrictAboutOutputDuringTests; - private readonly bool $beStrictAboutTestsThatDoNotTestAnything; - private readonly bool $beStrictAboutCoverageMetadata; - private readonly bool $enforceTimeLimit; - private readonly int $defaultTimeLimit; - private readonly int $timeoutForSmallTests; - private readonly int $timeoutForMediumTests; - private readonly int $timeoutForLargeTests; - private readonly ?string $defaultTestSuite; - private readonly int $executionOrder; - private readonly bool $resolveDependencies; - private readonly bool $defectsFirst; - private readonly bool $backupGlobals; - private readonly bool $backupStaticProperties; - private readonly bool $registerMockObjectsFromTestArgumentsRecursively; - private readonly bool $testdoxPrinter; - private readonly bool $controlGarbageCollector; - private readonly int $numberOfTestsBeforeGarbageCollection; - - /** - * @psalm-param ?non-empty-string $extensionsDirectory - */ - public function __construct(?string $cacheDirectory, bool $cacheResult, ?string $cacheResultFile, int|string $columns, string $colors, bool $stderr, bool $displayDetailsOnAllIssues, bool $displayDetailsOnIncompleteTests, bool $displayDetailsOnSkippedTests, bool $displayDetailsOnTestsThatTriggerDeprecations, bool $displayDetailsOnPhpunitDeprecations, bool $displayDetailsOnTestsThatTriggerErrors, bool $displayDetailsOnTestsThatTriggerNotices, bool $displayDetailsOnTestsThatTriggerWarnings, bool $reverseDefectList, bool $requireCoverageMetadata, ?string $bootstrap, bool $processIsolation, bool $failOnAllIssues, bool $failOnDeprecation, bool $failOnPhpunitDeprecation, bool $failOnPhpunitWarning, bool $failOnEmptyTestSuite, bool $failOnIncomplete, bool $failOnNotice, bool $failOnRisky, bool $failOnSkipped, bool $failOnWarning, bool $stopOnDefect, bool $stopOnDeprecation, bool $stopOnError, bool $stopOnFailure, bool $stopOnIncomplete, bool $stopOnNotice, bool $stopOnRisky, bool $stopOnSkipped, bool $stopOnWarning, ?string $extensionsDirectory, bool $beStrictAboutChangesToGlobalState, bool $beStrictAboutOutputDuringTests, bool $beStrictAboutTestsThatDoNotTestAnything, bool $beStrictAboutCoverageMetadata, bool $enforceTimeLimit, int $defaultTimeLimit, int $timeoutForSmallTests, int $timeoutForMediumTests, int $timeoutForLargeTests, ?string $defaultTestSuite, int $executionOrder, bool $resolveDependencies, bool $defectsFirst, bool $backupGlobals, bool $backupStaticProperties, bool $registerMockObjectsFromTestArgumentsRecursively, bool $testdoxPrinter, bool $controlGarbageCollector, int $numberOfTestsBeforeGarbageCollection) - { - $this->cacheDirectory = $cacheDirectory; - $this->cacheResult = $cacheResult; - $this->cacheResultFile = $cacheResultFile; - $this->columns = $columns; - $this->colors = $colors; - $this->stderr = $stderr; - $this->displayDetailsOnAllIssues = $displayDetailsOnAllIssues; - $this->displayDetailsOnIncompleteTests = $displayDetailsOnIncompleteTests; - $this->displayDetailsOnSkippedTests = $displayDetailsOnSkippedTests; - $this->displayDetailsOnTestsThatTriggerDeprecations = $displayDetailsOnTestsThatTriggerDeprecations; - $this->displayDetailsOnPhpunitDeprecations = $displayDetailsOnPhpunitDeprecations; - $this->displayDetailsOnTestsThatTriggerErrors = $displayDetailsOnTestsThatTriggerErrors; - $this->displayDetailsOnTestsThatTriggerNotices = $displayDetailsOnTestsThatTriggerNotices; - $this->displayDetailsOnTestsThatTriggerWarnings = $displayDetailsOnTestsThatTriggerWarnings; - $this->reverseDefectList = $reverseDefectList; - $this->requireCoverageMetadata = $requireCoverageMetadata; - $this->bootstrap = $bootstrap; - $this->processIsolation = $processIsolation; - $this->failOnAllIssues = $failOnAllIssues; - $this->failOnDeprecation = $failOnDeprecation; - $this->failOnPhpunitDeprecation = $failOnPhpunitDeprecation; - $this->failOnPhpunitWarning = $failOnPhpunitWarning; - $this->failOnEmptyTestSuite = $failOnEmptyTestSuite; - $this->failOnIncomplete = $failOnIncomplete; - $this->failOnNotice = $failOnNotice; - $this->failOnRisky = $failOnRisky; - $this->failOnSkipped = $failOnSkipped; - $this->failOnWarning = $failOnWarning; - $this->stopOnDefect = $stopOnDefect; - $this->stopOnDeprecation = $stopOnDeprecation; - $this->stopOnError = $stopOnError; - $this->stopOnFailure = $stopOnFailure; - $this->stopOnIncomplete = $stopOnIncomplete; - $this->stopOnNotice = $stopOnNotice; - $this->stopOnRisky = $stopOnRisky; - $this->stopOnSkipped = $stopOnSkipped; - $this->stopOnWarning = $stopOnWarning; - $this->extensionsDirectory = $extensionsDirectory; - $this->beStrictAboutChangesToGlobalState = $beStrictAboutChangesToGlobalState; - $this->beStrictAboutOutputDuringTests = $beStrictAboutOutputDuringTests; - $this->beStrictAboutTestsThatDoNotTestAnything = $beStrictAboutTestsThatDoNotTestAnything; - $this->beStrictAboutCoverageMetadata = $beStrictAboutCoverageMetadata; - $this->enforceTimeLimit = $enforceTimeLimit; - $this->defaultTimeLimit = $defaultTimeLimit; - $this->timeoutForSmallTests = $timeoutForSmallTests; - $this->timeoutForMediumTests = $timeoutForMediumTests; - $this->timeoutForLargeTests = $timeoutForLargeTests; - $this->defaultTestSuite = $defaultTestSuite; - $this->executionOrder = $executionOrder; - $this->resolveDependencies = $resolveDependencies; - $this->defectsFirst = $defectsFirst; - $this->backupGlobals = $backupGlobals; - $this->backupStaticProperties = $backupStaticProperties; - $this->registerMockObjectsFromTestArgumentsRecursively = $registerMockObjectsFromTestArgumentsRecursively; - $this->testdoxPrinter = $testdoxPrinter; - $this->controlGarbageCollector = $controlGarbageCollector; - $this->numberOfTestsBeforeGarbageCollection = $numberOfTestsBeforeGarbageCollection; - } - - /** - * @psalm-assert-if-true !null $this->cacheDirectory - */ - public function hasCacheDirectory(): bool - { - return $this->cacheDirectory !== null; - } - - /** - * @throws Exception - */ - public function cacheDirectory(): string - { - if (!$this->hasCacheDirectory()) { - throw new Exception('Cache directory is not configured'); - } - - return $this->cacheDirectory; - } - - public function cacheResult(): bool - { - return $this->cacheResult; - } - - /** - * @psalm-assert-if-true !null $this->cacheResultFile - * - * @deprecated - */ - public function hasCacheResultFile(): bool - { - return $this->cacheResultFile !== null; - } - - /** - * @throws Exception - * - * @deprecated - */ - public function cacheResultFile(): string - { - if (!$this->hasCacheResultFile()) { - throw new Exception('Cache result file is not configured'); - } - - return $this->cacheResultFile; - } - - public function columns(): int|string - { - return $this->columns; - } - - public function colors(): string - { - return $this->colors; - } - - public function stderr(): bool - { - return $this->stderr; - } - - public function displayDetailsOnAllIssues(): bool - { - return $this->displayDetailsOnAllIssues; - } - - public function displayDetailsOnIncompleteTests(): bool - { - return $this->displayDetailsOnIncompleteTests; - } - - public function displayDetailsOnSkippedTests(): bool - { - return $this->displayDetailsOnSkippedTests; - } - - public function displayDetailsOnTestsThatTriggerDeprecations(): bool - { - return $this->displayDetailsOnTestsThatTriggerDeprecations; - } - - public function displayDetailsOnPhpunitDeprecations(): bool - { - return $this->displayDetailsOnPhpunitDeprecations; - } - - public function displayDetailsOnTestsThatTriggerErrors(): bool - { - return $this->displayDetailsOnTestsThatTriggerErrors; - } - - public function displayDetailsOnTestsThatTriggerNotices(): bool - { - return $this->displayDetailsOnTestsThatTriggerNotices; - } - - public function displayDetailsOnTestsThatTriggerWarnings(): bool - { - return $this->displayDetailsOnTestsThatTriggerWarnings; - } - - public function reverseDefectList(): bool - { - return $this->reverseDefectList; - } - - public function requireCoverageMetadata(): bool - { - return $this->requireCoverageMetadata; - } - - /** - * @psalm-assert-if-true !null $this->bootstrap - */ - public function hasBootstrap(): bool - { - return $this->bootstrap !== null; - } - - /** - * @throws Exception - */ - public function bootstrap(): string - { - if (!$this->hasBootstrap()) { - throw new Exception('Bootstrap script is not configured'); - } - - return $this->bootstrap; - } - - public function processIsolation(): bool - { - return $this->processIsolation; - } - - public function failOnAllIssues(): bool - { - return $this->failOnAllIssues; - } - - public function failOnDeprecation(): bool - { - return $this->failOnDeprecation; - } - - public function failOnPhpunitDeprecation(): bool - { - return $this->failOnPhpunitDeprecation; - } - - public function failOnPhpunitWarning(): bool - { - return $this->failOnPhpunitWarning; - } - - public function failOnEmptyTestSuite(): bool - { - return $this->failOnEmptyTestSuite; - } - - public function failOnIncomplete(): bool - { - return $this->failOnIncomplete; - } - - public function failOnNotice(): bool - { - return $this->failOnNotice; - } - - public function failOnRisky(): bool - { - return $this->failOnRisky; - } - - public function failOnSkipped(): bool - { - return $this->failOnSkipped; - } - - public function failOnWarning(): bool - { - return $this->failOnWarning; - } - - public function stopOnDefect(): bool - { - return $this->stopOnDefect; - } - - public function stopOnDeprecation(): bool - { - return $this->stopOnDeprecation; - } - - public function stopOnError(): bool - { - return $this->stopOnError; - } - - public function stopOnFailure(): bool - { - return $this->stopOnFailure; - } - - public function stopOnIncomplete(): bool - { - return $this->stopOnIncomplete; - } - - public function stopOnNotice(): bool - { - return $this->stopOnNotice; - } - - public function stopOnRisky(): bool - { - return $this->stopOnRisky; - } - - public function stopOnSkipped(): bool - { - return $this->stopOnSkipped; - } - - public function stopOnWarning(): bool - { - return $this->stopOnWarning; - } - - /** - * @psalm-assert-if-true !null $this->extensionsDirectory - */ - public function hasExtensionsDirectory(): bool - { - return $this->extensionsDirectory !== null; - } - - /** - * @throws Exception - * - * @psalm-return non-empty-string - */ - public function extensionsDirectory(): string - { - if (!$this->hasExtensionsDirectory()) { - throw new Exception('Extensions directory is not configured'); - } - - return $this->extensionsDirectory; - } - - public function beStrictAboutChangesToGlobalState(): bool - { - return $this->beStrictAboutChangesToGlobalState; - } - - public function beStrictAboutOutputDuringTests(): bool - { - return $this->beStrictAboutOutputDuringTests; - } - - public function beStrictAboutTestsThatDoNotTestAnything(): bool - { - return $this->beStrictAboutTestsThatDoNotTestAnything; - } - - public function beStrictAboutCoverageMetadata(): bool - { - return $this->beStrictAboutCoverageMetadata; - } - - public function enforceTimeLimit(): bool - { - return $this->enforceTimeLimit; - } - - public function defaultTimeLimit(): int - { - return $this->defaultTimeLimit; - } - - public function timeoutForSmallTests(): int - { - return $this->timeoutForSmallTests; - } - - public function timeoutForMediumTests(): int - { - return $this->timeoutForMediumTests; - } - - public function timeoutForLargeTests(): int - { - return $this->timeoutForLargeTests; - } - - /** - * @psalm-assert-if-true !null $this->defaultTestSuite - */ - public function hasDefaultTestSuite(): bool - { - return $this->defaultTestSuite !== null; - } - - /** - * @throws Exception - */ - public function defaultTestSuite(): string - { - if (!$this->hasDefaultTestSuite()) { - throw new Exception('Default test suite is not configured'); - } - - return $this->defaultTestSuite; - } - - public function executionOrder(): int - { - return $this->executionOrder; - } - - public function resolveDependencies(): bool - { - return $this->resolveDependencies; - } - - public function defectsFirst(): bool - { - return $this->defectsFirst; - } - - public function backupGlobals(): bool - { - return $this->backupGlobals; - } - - public function backupStaticProperties(): bool - { - return $this->backupStaticProperties; - } - - /** - * @deprecated - */ - public function registerMockObjectsFromTestArgumentsRecursively(): bool - { - return $this->registerMockObjectsFromTestArgumentsRecursively; - } - - public function testdoxPrinter(): bool - { - return $this->testdoxPrinter; - } - - public function controlGarbageCollector(): bool - { - return $this->controlGarbageCollector; - } - - public function numberOfTestsBeforeGarbageCollection(): int - { - return $this->numberOfTestsBeforeGarbageCollection; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/FailedSchemaDetectionResult.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/FailedSchemaDetectionResult.php deleted file mode 100644 index ef413ca..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/FailedSchemaDetectionResult.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class FailedSchemaDetectionResult extends SchemaDetectionResult -{ -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/SchemaDetectionResult.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/SchemaDetectionResult.php deleted file mode 100644 index 7f036f9..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/SchemaDetectionResult.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use PHPUnit\Util\Xml\XmlException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -abstract class SchemaDetectionResult -{ - /** - * @psalm-assert-if-true SuccessfulSchemaDetectionResult $this - */ - public function detected(): bool - { - return false; - } - - /** - * @throws XmlException - */ - public function version(): string - { - throw new XmlException('No supported schema was detected'); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/SchemaDetector.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/SchemaDetector.php deleted file mode 100644 index 9ad74c6..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/SchemaDetector.php +++ /dev/null @@ -1,41 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use PHPUnit\Util\Xml\Loader; -use PHPUnit\Util\Xml\XmlException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class SchemaDetector -{ - /** - * @throws XmlException - */ - public function detect(string $filename): SchemaDetectionResult - { - $document = (new Loader)->loadFile($filename); - - $schemaFinder = new SchemaFinder; - - foreach ($schemaFinder->available() as $candidate) { - $schema = (new SchemaFinder)->find($candidate); - - if (!(new Validator)->validate($document, $schema)->hasValidationErrors()) { - return new SuccessfulSchemaDetectionResult($candidate); - } - } - - return new FailedSchemaDetectionResult; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/SuccessfulSchemaDetectionResult.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/SuccessfulSchemaDetectionResult.php deleted file mode 100644 index d7eabb1..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/SuccessfulSchemaDetectionResult.php +++ /dev/null @@ -1,49 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class SuccessfulSchemaDetectionResult extends SchemaDetectionResult -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $version; - - /** - * @psalm-param non-empty-string $version - */ - public function __construct(string $version) - { - $this->version = $version; - } - - /** - * @psalm-assert-if-true SuccessfulSchemaDetectionResult $this - */ - public function detected(): bool - { - return true; - } - - /** - * @psalm-return non-empty-string - */ - public function version(): string - { - return $this->version; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaFinder.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaFinder.php deleted file mode 100644 index b86e8d8..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaFinder.php +++ /dev/null @@ -1,82 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use function assert; -use function defined; -use function is_file; -use function rsort; -use function sprintf; -use DirectoryIterator; -use PHPUnit\Runner\Version; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class SchemaFinder -{ - /** - * @psalm-return non-empty-list - */ - public function available(): array - { - $result = [Version::series()]; - - foreach ((new DirectoryIterator($this->path() . 'schema')) as $file) { - if ($file->isDot()) { - continue; - } - - $version = $file->getBasename('.xsd'); - - assert(!empty($version)); - - $result[] = $version; - } - - rsort($result); - - return $result; - } - - /** - * @throws CannotFindSchemaException - */ - public function find(string $version): string - { - if ($version === Version::series()) { - $filename = $this->path() . 'phpunit.xsd'; - } else { - $filename = $this->path() . 'schema/' . $version . '.xsd'; - } - - if (!is_file($filename)) { - throw new CannotFindSchemaException( - sprintf( - 'Schema for PHPUnit %s is not available', - $version, - ), - ); - } - - return $filename; - } - - private function path(): string - { - if (defined('__PHPUNIT_PHAR_ROOT__')) { - return __PHPUNIT_PHAR_ROOT__ . '/'; - } - - return __DIR__ . '/../../../../'; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/TestSuiteMapper.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/TestSuiteMapper.php deleted file mode 100644 index 7721ca4..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/TestSuiteMapper.php +++ /dev/null @@ -1,117 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use const PHP_VERSION; -use function array_merge; -use function array_unique; -use function explode; -use function in_array; -use function is_dir; -use function is_file; -use function str_contains; -use function version_compare; -use PHPUnit\Framework\Exception as FrameworkException; -use PHPUnit\Framework\TestSuite as TestSuiteObject; -use PHPUnit\TextUI\Configuration\TestSuiteCollection; -use PHPUnit\TextUI\RuntimeException; -use PHPUnit\TextUI\TestDirectoryNotFoundException; -use PHPUnit\TextUI\TestFileNotFoundException; -use SebastianBergmann\FileIterator\Facade; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestSuiteMapper -{ - /** - * @psalm-param non-empty-string $xmlConfigurationFile, - * - * @throws RuntimeException - * @throws TestDirectoryNotFoundException - * @throws TestFileNotFoundException - */ - public function map(string $xmlConfigurationFile, TestSuiteCollection $configuration, string $filter, string $excludedTestSuites): TestSuiteObject - { - try { - $filterAsArray = $filter ? explode(',', $filter) : []; - $excludedFilterAsArray = $excludedTestSuites ? explode(',', $excludedTestSuites) : []; - $result = TestSuiteObject::empty($xmlConfigurationFile); - - foreach ($configuration as $testSuiteConfiguration) { - if (!empty($filterAsArray) && !in_array($testSuiteConfiguration->name(), $filterAsArray, true)) { - continue; - } - - if (!empty($excludedFilterAsArray) && in_array($testSuiteConfiguration->name(), $excludedFilterAsArray, true)) { - continue; - } - - $exclude = []; - - foreach ($testSuiteConfiguration->exclude()->asArray() as $file) { - $exclude[] = $file->path(); - } - - $files = []; - - foreach ($testSuiteConfiguration->directories() as $directory) { - if (!str_contains($directory->path(), '*') && !is_dir($directory->path())) { - throw new TestDirectoryNotFoundException($directory->path()); - } - - if (!version_compare(PHP_VERSION, $directory->phpVersion(), $directory->phpVersionOperator()->asString())) { - continue; - } - - $files = array_merge( - $files, - (new Facade)->getFilesAsArray( - $directory->path(), - $directory->suffix(), - $directory->prefix(), - $exclude, - ), - ); - } - - foreach ($testSuiteConfiguration->files() as $file) { - if (!is_file($file->path())) { - throw new TestFileNotFoundException($file->path()); - } - - if (!version_compare(PHP_VERSION, $file->phpVersion(), $file->phpVersionOperator()->asString())) { - continue; - } - - $files[] = $file->path(); - } - - if (!empty($files)) { - $testSuite = TestSuiteObject::empty($testSuiteConfiguration->name()); - - $testSuite->addTestFiles(array_unique($files)); - - $result->addTest($testSuite); - } - } - - return $result; - } catch (FrameworkException $e) { - throw new RuntimeException( - $e->getMessage(), - $e->getCode(), - $e, - ); - } - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Validator/ValidationResult.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Validator/ValidationResult.php deleted file mode 100644 index d62a38b..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Validator/ValidationResult.php +++ /dev/null @@ -1,73 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use const PHP_EOL; -use function sprintf; -use function trim; -use LibXMLError; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class ValidationResult -{ - /** - * @psalm-var array> - */ - private readonly array $validationErrors; - - /** - * @psalm-param array $errors - */ - public static function fromArray(array $errors): self - { - $validationErrors = []; - - foreach ($errors as $error) { - if (!isset($validationErrors[$error->line])) { - $validationErrors[$error->line] = []; - } - - $validationErrors[$error->line][] = trim($error->message); - } - - return new self($validationErrors); - } - - private function __construct(array $validationErrors) - { - $this->validationErrors = $validationErrors; - } - - public function hasValidationErrors(): bool - { - return !empty($this->validationErrors); - } - - public function asString(): string - { - $buffer = ''; - - foreach ($this->validationErrors as $line => $validationErrorsOnLine) { - $buffer .= sprintf(PHP_EOL . ' Line %d:' . PHP_EOL, $line); - - foreach ($validationErrorsOnLine as $validationError) { - $buffer .= sprintf(' - %s' . PHP_EOL, $validationError); - } - } - - return $buffer; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Validator/Validator.php b/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Validator/Validator.php deleted file mode 100644 index 7f7889e..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Validator/Validator.php +++ /dev/null @@ -1,37 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\XmlConfiguration; - -use function file_get_contents; -use function libxml_clear_errors; -use function libxml_get_errors; -use function libxml_use_internal_errors; -use DOMDocument; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Validator -{ - public function validate(DOMDocument $document, string $xsdFilename): ValidationResult - { - $originalErrorHandling = libxml_use_internal_errors(true); - - $document->schemaValidateSource(file_get_contents($xsdFilename)); - - $errors = libxml_get_errors(); - libxml_clear_errors(); - libxml_use_internal_errors($originalErrorHandling); - - return ValidationResult::fromArray($errors); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Exception/CannotOpenSocketException.php b/vendor/phpunit/phpunit/src/TextUI/Exception/CannotOpenSocketException.php deleted file mode 100644 index 519d137..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Exception/CannotOpenSocketException.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI; - -use function sprintf; -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class CannotOpenSocketException extends RuntimeException implements Exception -{ - public function __construct(string $hostname, int $port) - { - parent::__construct( - sprintf( - 'Cannot open socket %s:%d', - $hostname, - $port, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Exception/Exception.php b/vendor/phpunit/phpunit/src/TextUI/Exception/Exception.php deleted file mode 100644 index 6b370ca..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Exception/Exception.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI; - -use Throwable; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This interface is not covered by the backward compatibility promise for PHPUnit - */ -interface Exception extends Throwable -{ -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Exception/InvalidSocketException.php b/vendor/phpunit/phpunit/src/TextUI/Exception/InvalidSocketException.php deleted file mode 100644 index 441afd2..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Exception/InvalidSocketException.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI; - -use function sprintf; -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class InvalidSocketException extends RuntimeException implements Exception -{ - public function __construct(string $socket) - { - parent::__construct( - sprintf( - '"%s" does not match "socket://hostname:port" format', - $socket, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Exception/RuntimeException.php b/vendor/phpunit/phpunit/src/TextUI/Exception/RuntimeException.php deleted file mode 100644 index 875a048..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Exception/RuntimeException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class RuntimeException extends \RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Exception/TestDirectoryNotFoundException.php b/vendor/phpunit/phpunit/src/TextUI/Exception/TestDirectoryNotFoundException.php deleted file mode 100644 index 9b35390..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Exception/TestDirectoryNotFoundException.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI; - -use function sprintf; -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestDirectoryNotFoundException extends RuntimeException implements Exception -{ - public function __construct(string $path) - { - parent::__construct( - sprintf( - 'Test directory "%s" not found', - $path, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Exception/TestFileNotFoundException.php b/vendor/phpunit/phpunit/src/TextUI/Exception/TestFileNotFoundException.php deleted file mode 100644 index 46c9df8..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Exception/TestFileNotFoundException.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI; - -use function sprintf; -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestFileNotFoundException extends RuntimeException implements Exception -{ - public function __construct(string $path) - { - parent::__construct( - sprintf( - 'Test file "%s" not found', - $path, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Help.php b/vendor/phpunit/phpunit/src/TextUI/Help.php deleted file mode 100644 index ef8fbed..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Help.php +++ /dev/null @@ -1,318 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI; - -use const PHP_EOL; -use function count; -use function defined; -use function explode; -use function max; -use function preg_replace_callback; -use function str_pad; -use function str_repeat; -use function strlen; -use function wordwrap; -use PHPUnit\Util\Color; -use SebastianBergmann\Environment\Console; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Help -{ - private const LEFT_MARGIN = ' '; - private int $lengthOfLongestOptionName = 0; - private readonly int $columnsAvailableForDescription; - private ?bool $hasColor; - - public function __construct(?int $width = null, ?bool $withColor = null) - { - if ($width === null) { - $width = (new Console)->getNumberOfColumns(); - } - - if ($withColor === null) { - $this->hasColor = (new Console)->hasColorSupport(); - } else { - $this->hasColor = $withColor; - } - - foreach ($this->elements() as $options) { - foreach ($options as $option) { - if (isset($option['arg'])) { - $this->lengthOfLongestOptionName = max($this->lengthOfLongestOptionName, strlen($option['arg'])); - } - } - } - - $this->columnsAvailableForDescription = $width - $this->lengthOfLongestOptionName - 4; - } - - public function generate(): string - { - if ($this->hasColor) { - return $this->writeWithColor(); - } - - return $this->writeWithoutColor(); - } - - private function writeWithoutColor(): string - { - $buffer = ''; - - foreach ($this->elements() as $section => $options) { - $buffer .= "{$section}:" . PHP_EOL; - - if ($section !== 'Usage') { - $buffer .= PHP_EOL; - } - - foreach ($options as $option) { - if (isset($option['spacer'])) { - $buffer .= PHP_EOL; - } - - if (isset($option['text'])) { - $buffer .= self::LEFT_MARGIN . $option['text'] . PHP_EOL; - } - - if (isset($option['arg'])) { - $arg = str_pad($option['arg'], $this->lengthOfLongestOptionName); - - $buffer .= self::LEFT_MARGIN . $arg . ' ' . $option['desc'] . PHP_EOL; - } - } - - $buffer .= PHP_EOL; - } - - return $buffer; - } - - private function writeWithColor(): string - { - $buffer = ''; - - foreach ($this->elements() as $section => $options) { - $buffer .= Color::colorize('fg-yellow', "{$section}:") . PHP_EOL; - - if ($section !== 'Usage') { - $buffer .= PHP_EOL; - } - - foreach ($options as $option) { - if (isset($option['spacer'])) { - $buffer .= PHP_EOL; - } - - if (isset($option['text'])) { - $buffer .= self::LEFT_MARGIN . $option['text'] . PHP_EOL; - } - - if (isset($option['arg'])) { - $arg = Color::colorize('fg-green', str_pad($option['arg'], $this->lengthOfLongestOptionName)); - $arg = preg_replace_callback( - '/(<[^>]+>)/', - static fn ($matches) => Color::colorize('fg-cyan', $matches[0]), - $arg, - ); - - $desc = explode(PHP_EOL, wordwrap($option['desc'], $this->columnsAvailableForDescription, PHP_EOL)); - - $buffer .= self::LEFT_MARGIN . $arg . ' ' . $desc[0] . PHP_EOL; - - for ($i = 1; $i < count($desc); $i++) { - $buffer .= str_repeat(' ', $this->lengthOfLongestOptionName + 3) . $desc[$i] . PHP_EOL; - } - } - } - - $buffer .= PHP_EOL; - } - - return $buffer; - } - - /** - * @psalm-return array> - */ - private function elements(): array - { - $elements = [ - 'Usage' => [ - ['text' => 'phpunit [options] ...'], - ], - - 'Configuration' => [ - ['arg' => '--bootstrap ', 'desc' => 'A PHP script that is included before the tests run'], - ['arg' => '-c|--configuration ', 'desc' => 'Read configuration from XML file'], - ['arg' => '--no-configuration', 'desc' => 'Ignore default configuration file (phpunit.xml)'], - ['arg' => '--no-extensions', 'desc' => 'Do not load PHPUnit extensions'], - ['arg' => '--include-path ', 'desc' => 'Prepend PHP\'s include_path with given path(s)'], - ['arg' => '-d ', 'desc' => 'Sets a php.ini value'], - ['arg' => '--cache-directory ', 'desc' => 'Specify cache directory'], - ['arg' => '--generate-configuration', 'desc' => 'Generate configuration file with suggested settings'], - ['arg' => '--migrate-configuration', 'desc' => 'Migrate configuration file to current format'], - ['arg' => '--generate-baseline ', 'desc' => 'Generate baseline for issues'], - ['arg' => '--use-baseline ', 'desc' => 'Use baseline to ignore issues'], - ['arg' => '--ignore-baseline', 'desc' => 'Do not use baseline to ignore issues'], - ], - - 'Selection' => [ - ['arg' => '--list-suites', 'desc' => 'List available test suites'], - ['arg' => '--testsuite ', 'desc' => 'Only run tests from the specified test suite(s)'], - ['arg' => '--exclude-testsuite ', 'desc' => 'Exclude tests from the specified test suite(s)'], - ['arg' => '--list-groups', 'desc' => 'List available test groups'], - ['arg' => '--group ', 'desc' => 'Only run tests from the specified group(s)'], - ['arg' => '--exclude-group ', 'desc' => 'Exclude tests from the specified group(s)'], - ['arg' => '--covers ', 'desc' => 'Only run tests that intend to cover '], - ['arg' => '--uses ', 'desc' => 'Only run tests that intend to use '], - ['arg' => '--list-tests', 'desc' => 'List available tests'], - ['arg' => '--list-tests-xml ', 'desc' => 'List available tests in XML format'], - ['arg' => '--filter ', 'desc' => 'Filter which tests to run'], - ['arg' => '--test-suffix ', 'desc' => 'Only search for test in files with specified suffix(es). Default: Test.php,.phpt'], - ], - - 'Execution' => [ - ['arg' => '--process-isolation', 'desc' => 'Run each test in a separate PHP process'], - ['arg' => '--globals-backup', 'desc' => 'Backup and restore $GLOBALS for each test'], - ['arg' => '--static-backup', 'desc' => 'Backup and restore static properties for each test'], - ['spacer' => ''], - - ['arg' => '--strict-coverage', 'desc' => 'Be strict about code coverage metadata'], - ['arg' => '--strict-global-state', 'desc' => 'Be strict about changes to global state'], - ['arg' => '--disallow-test-output', 'desc' => 'Be strict about output during tests'], - ['arg' => '--enforce-time-limit', 'desc' => 'Enforce time limit based on test size'], - ['arg' => '--default-time-limit ', 'desc' => 'Timeout in seconds for tests that have no declared size'], - ['arg' => '--do-not-report-useless-tests', 'desc' => 'Do not report tests that do not test anything'], - ['spacer' => ''], - - ['arg' => '--stop-on-defect', 'desc' => 'Stop after first error, failure, warning, or risky test'], - ['arg' => '--stop-on-error', 'desc' => 'Stop after first error'], - ['arg' => '--stop-on-failure', 'desc' => 'Stop after first failure'], - ['arg' => '--stop-on-warning', 'desc' => 'Stop after first warning'], - ['arg' => '--stop-on-risky', 'desc' => 'Stop after first risky test'], - ['arg' => '--stop-on-deprecation', 'desc' => 'Stop after first test that triggered a deprecation'], - ['arg' => '--stop-on-notice', 'desc' => 'Stop after first test that triggered a notice'], - ['arg' => '--stop-on-skipped', 'desc' => 'Stop after first skipped test'], - ['arg' => '--stop-on-incomplete', 'desc' => 'Stop after first incomplete test'], - ['spacer' => ''], - - ['arg' => '--fail-on-empty-test-suite', 'desc' => 'Signal failure using shell exit code when no tests were run'], - ['arg' => '--fail-on-warning', 'desc' => 'Signal failure using shell exit code when a warning was triggered'], - ['arg' => '--fail-on-risky', 'desc' => 'Signal failure using shell exit code when a test was considered risky'], - ['arg' => '--fail-on-deprecation', 'desc' => 'Signal failure using shell exit code when a deprecation was triggered'], - ['arg' => '--fail-on-phpunit-deprecation', 'desc' => 'Signal failure using shell exit code when a PHPUnit deprecation was triggered'], - ['arg' => '--fail-on-phpunit-warning', 'desc' => 'Signal failure using shell exit code when a PHPUnit warning was triggered'], - ['arg' => '--fail-on-notice', 'desc' => 'Signal failure using shell exit code when a notice was triggered'], - ['arg' => '--fail-on-skipped', 'desc' => 'Signal failure using shell exit code when a test was skipped'], - ['arg' => '--fail-on-incomplete', 'desc' => 'Signal failure using shell exit code when a test was marked incomplete'], - ['arg' => '--fail-on-all-issues', 'desc' => 'Signal failure using shell exit code when an issue is triggered'], - ['spacer' => ''], - - ['arg' => '--do-not-fail-on-empty-test-suite', 'desc' => 'Do not signal failure using shell exit code when no tests were run'], - ['arg' => '--do-not-fail-on-warning', 'desc' => 'Do not signal failure using shell exit code when a warning was triggered'], - ['arg' => '--do-not-fail-on-risky', 'desc' => 'Do not signal failure using shell exit code when a test was considered risky'], - ['arg' => '--do-not-fail-on-deprecation', 'desc' => 'Do not signal failure using shell exit code when a deprecation was triggered'], - ['arg' => '--do-not-fail-on-phpunit-deprecation', 'desc' => 'Do not signal failure using shell exit code when a PHPUnit deprecation was triggered'], - ['arg' => '--do-not-fail-on-phpunit-warning', 'desc' => 'Do not signal failure using shell exit code when a PHPUnit warning was triggered'], - ['arg' => '--do-not-fail-on-notice', 'desc' => 'Do not signal failure using shell exit code when a notice was triggered'], - ['arg' => '--do-not-fail-on-skipped', 'desc' => 'Do not signal failure using shell exit code when a test was skipped'], - ['arg' => '--do-not-fail-on-incomplete', 'desc' => 'Do not signal failure using shell exit code when a test was marked incomplete'], - ['spacer' => ''], - - ['arg' => '--cache-result', 'desc' => 'Write test results to cache file'], - ['arg' => '--do-not-cache-result', 'desc' => 'Do not write test results to cache file'], - ['spacer' => ''], - - ['arg' => '--order-by ', 'desc' => 'Run tests in order: default|defects|depends|duration|no-depends|random|reverse|size'], - ['arg' => '--random-order-seed ', 'desc' => 'Use the specified random seed when running tests in random order'], - ], - - 'Reporting' => [ - ['arg' => '--colors ', 'desc' => 'Use colors in output ("never", "auto" or "always")'], - ['arg' => '--columns ', 'desc' => 'Number of columns to use for progress output'], - ['arg' => '--columns max', 'desc' => 'Use maximum number of columns for progress output'], - ['arg' => '--stderr', 'desc' => 'Write to STDERR instead of STDOUT'], - ['spacer' => ''], - - ['arg' => '--no-progress', 'desc' => 'Disable output of test execution progress'], - ['arg' => '--no-results', 'desc' => 'Disable output of test results'], - ['arg' => '--no-output', 'desc' => 'Disable all output'], - ['spacer' => ''], - - ['arg' => '--display-incomplete', 'desc' => 'Display details for incomplete tests'], - ['arg' => '--display-skipped', 'desc' => 'Display details for skipped tests'], - ['arg' => '--display-deprecations', 'desc' => 'Display details for deprecations triggered by tests'], - ['arg' => '--display-phpunit-deprecations', 'desc' => 'Display details for PHPUnit deprecations'], - ['arg' => '--display-errors', 'desc' => 'Display details for errors triggered by tests'], - ['arg' => '--display-notices', 'desc' => 'Display details for notices triggered by tests'], - ['arg' => '--display-warnings', 'desc' => 'Display details for warnings triggered by tests'], - ['arg' => '--display-all-issues', 'desc' => 'Display details for all issues that are triggered'], - ['arg' => '--reverse-list', 'desc' => 'Print defects in reverse order'], - ['spacer' => ''], - - ['arg' => '--teamcity', 'desc' => 'Replace default progress and result output with TeamCity format'], - ['arg' => '--testdox', 'desc' => 'Replace default result output with TestDox format'], - ['spacer' => ''], - - ['arg' => '--debug', 'desc' => 'Replace default progress and result output with debugging information'], - ], - - 'Logging' => [ - ['arg' => '--log-junit ', 'desc' => 'Write test results in JUnit XML format to file'], - ['arg' => '--log-teamcity ', 'desc' => 'Write test results in TeamCity format to file'], - ['arg' => '--testdox-html ', 'desc' => 'Write test results in TestDox format (HTML) to file'], - ['arg' => '--testdox-text ', 'desc' => 'Write test results in TestDox format (plain text) to file'], - ['arg' => '--log-events-text ', 'desc' => 'Stream events as plain text to file'], - ['arg' => '--log-events-verbose-text ', 'desc' => 'Stream events as plain text with extended information to file'], - ['arg' => '--no-logging', 'desc' => 'Ignore logging configured in the XML configuration file'], - ], - - 'Code Coverage' => [ - ['arg' => '--coverage-clover ', 'desc' => 'Write code coverage report in Clover XML format to file'], - ['arg' => '--coverage-cobertura ', 'desc' => 'Write code coverage report in Cobertura XML format to file'], - ['arg' => '--coverage-crap4j ', 'desc' => 'Write code coverage report in Crap4J XML format to file'], - ['arg' => '--coverage-html ', 'desc' => 'Write code coverage report in HTML format to directory'], - ['arg' => '--coverage-php ', 'desc' => 'Write serialized code coverage data to file'], - ['arg' => '--coverage-text=', 'desc' => 'Write code coverage report in text format to file [default: standard output]'], - ['arg' => '--only-summary-for-coverage-text', 'desc' => 'Option for code coverage report in text format: only show summary'], - ['arg' => '--show-uncovered-for-coverage-text', 'desc' => 'Option for code coverage report in text format: show uncovered files'], - ['arg' => '--coverage-xml ', 'desc' => 'Write code coverage report in XML format to directory'], - ['arg' => '--warm-coverage-cache', 'desc' => 'Warm static analysis cache'], - ['arg' => '--coverage-filter ', 'desc' => 'Include in code coverage reporting'], - ['arg' => '--path-coverage', 'desc' => 'Report path coverage in addition to line coverage'], - ['arg' => '--disable-coverage-ignore', 'desc' => 'Disable metadata for ignoring code coverage'], - ['arg' => '--no-coverage', 'desc' => 'Ignore code coverage reporting configured in the XML configuration file'], - ], - ]; - - if (defined('__PHPUNIT_PHAR__')) { - $elements['PHAR'] = [ - ['arg' => '--manifest', 'desc' => 'Print Software Bill of Materials (SBOM) in plain-text format'], - ['arg' => '--sbom', 'desc' => 'Print Software Bill of Materials (SBOM) in CycloneDX XML format'], - ['arg' => '--composer-lock', 'desc' => 'Print composer.lock file used to build the PHAR'], - ]; - } - - $elements['Miscellaneous'] = [ - ['arg' => '-h|--help', 'desc' => 'Prints this usage information'], - ['arg' => '--version', 'desc' => 'Prints the version and exits'], - ['arg' => '--atleast-version ', 'desc' => 'Checks that version is greater than and exits'], - ['arg' => '--check-version', 'desc' => 'Checks whether PHPUnit is the latest version and exits'], - ['arg' => '--check-php-configuration', 'desc' => 'Checks whether PHP configuration follows best practices'], - ]; - - return $elements; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/ProgressPrinter.php b/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/ProgressPrinter.php deleted file mode 100644 index 0247f02..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/ProgressPrinter.php +++ /dev/null @@ -1,402 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Output\Default\ProgressPrinter; - -use function floor; -use function sprintf; -use function str_contains; -use function str_repeat; -use function strlen; -use PHPUnit\Event\EventFacadeIsSealedException; -use PHPUnit\Event\Facade; -use PHPUnit\Event\Test\DeprecationTriggered; -use PHPUnit\Event\Test\Errored; -use PHPUnit\Event\Test\ErrorTriggered; -use PHPUnit\Event\Test\NoticeTriggered; -use PHPUnit\Event\Test\PhpDeprecationTriggered; -use PHPUnit\Event\Test\PhpNoticeTriggered; -use PHPUnit\Event\Test\PhpWarningTriggered; -use PHPUnit\Event\Test\WarningTriggered; -use PHPUnit\Event\TestRunner\ExecutionStarted; -use PHPUnit\Event\UnknownSubscriberTypeException; -use PHPUnit\Framework\TestStatus\TestStatus; -use PHPUnit\TextUI\Configuration\Source; -use PHPUnit\TextUI\Configuration\SourceFilter; -use PHPUnit\TextUI\Output\Printer; -use PHPUnit\Util\Color; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ProgressPrinter -{ - private readonly Printer $printer; - private readonly bool $colors; - private readonly int $numberOfColumns; - private readonly Source $source; - private int $column = 0; - private int $numberOfTests = 0; - private int $numberOfTestsWidth = 0; - private int $maxColumn = 0; - private int $numberOfTestsRun = 0; - private ?TestStatus $status = null; - private bool $prepared = false; - - /** - * @throws EventFacadeIsSealedException - * @throws UnknownSubscriberTypeException - */ - public function __construct(Printer $printer, Facade $facade, bool $colors, int $numberOfColumns, Source $source) - { - $this->printer = $printer; - $this->colors = $colors; - $this->numberOfColumns = $numberOfColumns; - $this->source = $source; - - $this->registerSubscribers($facade); - } - - public function testRunnerExecutionStarted(ExecutionStarted $event): void - { - $this->numberOfTestsRun = 0; - $this->numberOfTests = $event->testSuite()->count(); - $this->numberOfTestsWidth = strlen((string) $this->numberOfTests); - $this->column = 0; - $this->maxColumn = $this->numberOfColumns - strlen(' / (XXX%)') - (2 * $this->numberOfTestsWidth); - } - - public function beforeTestClassMethodErrored(): void - { - $this->printProgressForError(); - $this->updateTestStatus(TestStatus::error()); - } - - public function testPrepared(): void - { - $this->prepared = true; - } - - public function testSkipped(): void - { - if (!$this->prepared) { - $this->printProgressForSkipped(); - } else { - $this->updateTestStatus(TestStatus::skipped()); - } - } - - public function testMarkedIncomplete(): void - { - $this->updateTestStatus(TestStatus::incomplete()); - } - - public function testTriggeredNotice(NoticeTriggered $event): void - { - if ($event->ignoredByBaseline()) { - return; - } - - if ($this->source->restrictNotices() && - !SourceFilter::instance()->includes($event->file())) { - return; - } - - if (!$this->source->ignoreSuppressionOfNotices() && $event->wasSuppressed()) { - return; - } - - $this->updateTestStatus(TestStatus::notice()); - } - - public function testTriggeredPhpNotice(PhpNoticeTriggered $event): void - { - if ($event->ignoredByBaseline()) { - return; - } - - if ($this->source->restrictNotices() && - !SourceFilter::instance()->includes($event->file())) { - return; - } - - if (!$this->source->ignoreSuppressionOfPhpNotices() && $event->wasSuppressed()) { - return; - } - - $this->updateTestStatus(TestStatus::notice()); - } - - public function testTriggeredDeprecation(DeprecationTriggered $event): void - { - if ($event->ignoredByBaseline() || $event->ignoredByTest()) { - return; - } - - if ($this->source->restrictDeprecations() && - !SourceFilter::instance()->includes($event->file())) { - return; - } - - if (!$this->source->ignoreSuppressionOfDeprecations() && $event->wasSuppressed()) { - return; - } - - $this->updateTestStatus(TestStatus::deprecation()); - } - - public function testTriggeredPhpDeprecation(PhpDeprecationTriggered $event): void - { - if ($event->ignoredByBaseline() || $event->ignoredByTest()) { - return; - } - - if ($this->source->restrictDeprecations() && - !SourceFilter::instance()->includes($event->file())) { - return; - } - - if (!$this->source->ignoreSuppressionOfPhpDeprecations() && $event->wasSuppressed()) { - return; - } - - $this->updateTestStatus(TestStatus::deprecation()); - } - - public function testTriggeredPhpunitDeprecation(): void - { - $this->updateTestStatus(TestStatus::deprecation()); - } - - public function testConsideredRisky(): void - { - $this->updateTestStatus(TestStatus::risky()); - } - - public function testTriggeredWarning(WarningTriggered $event): void - { - if ($event->ignoredByBaseline()) { - return; - } - - if ($this->source->restrictWarnings() && - !SourceFilter::instance()->includes($event->file())) { - return; - } - - if (!$this->source->ignoreSuppressionOfWarnings() && $event->wasSuppressed()) { - return; - } - - $this->updateTestStatus(TestStatus::warning()); - } - - public function testTriggeredPhpWarning(PhpWarningTriggered $event): void - { - if ($event->ignoredByBaseline()) { - return; - } - - if ($this->source->restrictWarnings() && - !SourceFilter::instance()->includes($event->file())) { - return; - } - - if (!$this->source->ignoreSuppressionOfPhpWarnings() && $event->wasSuppressed()) { - return; - } - - $this->updateTestStatus(TestStatus::warning()); - } - - public function testTriggeredPhpunitWarning(): void - { - $this->updateTestStatus(TestStatus::warning()); - } - - public function testTriggeredError(ErrorTriggered $event): void - { - if (!$this->source->ignoreSuppressionOfErrors() && $event->wasSuppressed()) { - return; - } - - $this->updateTestStatus(TestStatus::error()); - } - - public function testFailed(): void - { - $this->updateTestStatus(TestStatus::failure()); - } - - public function testErrored(Errored $event): void - { - /* - * @todo Eliminate this special case - */ - if (str_contains($event->asString(), 'Test was run in child process and ended unexpectedly')) { - $this->updateTestStatus(TestStatus::error()); - - return; - } - - if (!$this->prepared) { - $this->printProgressForError(); - } else { - $this->updateTestStatus(TestStatus::error()); - } - } - - public function testFinished(): void - { - if ($this->status === null) { - $this->printProgressForSuccess(); - } elseif ($this->status->isSkipped()) { - $this->printProgressForSkipped(); - } elseif ($this->status->isIncomplete()) { - $this->printProgressForIncomplete(); - } elseif ($this->status->isRisky()) { - $this->printProgressForRisky(); - } elseif ($this->status->isNotice()) { - $this->printProgressForNotice(); - } elseif ($this->status->isDeprecation()) { - $this->printProgressForDeprecation(); - } elseif ($this->status->isWarning()) { - $this->printProgressForWarning(); - } elseif ($this->status->isFailure()) { - $this->printProgressForFailure(); - } else { - $this->printProgressForError(); - } - - $this->status = null; - $this->prepared = false; - } - - /** - * @throws EventFacadeIsSealedException - * @throws UnknownSubscriberTypeException - */ - private function registerSubscribers(Facade $facade): void - { - $facade->registerSubscribers( - new BeforeTestClassMethodErroredSubscriber($this), - new TestConsideredRiskySubscriber($this), - new TestErroredSubscriber($this), - new TestFailedSubscriber($this), - new TestFinishedSubscriber($this), - new TestMarkedIncompleteSubscriber($this), - new TestPreparedSubscriber($this), - new TestRunnerExecutionStartedSubscriber($this), - new TestSkippedSubscriber($this), - new TestTriggeredDeprecationSubscriber($this), - new TestTriggeredNoticeSubscriber($this), - new TestTriggeredPhpDeprecationSubscriber($this), - new TestTriggeredPhpNoticeSubscriber($this), - new TestTriggeredPhpunitDeprecationSubscriber($this), - new TestTriggeredPhpunitWarningSubscriber($this), - new TestTriggeredPhpWarningSubscriber($this), - new TestTriggeredWarningSubscriber($this), - ); - } - - private function updateTestStatus(TestStatus $status): void - { - if ($this->status !== null && - $this->status->isMoreImportantThan($status)) { - return; - } - - $this->status = $status; - } - - private function printProgressForSuccess(): void - { - $this->printProgress('.'); - } - - private function printProgressForSkipped(): void - { - $this->printProgressWithColor('fg-cyan, bold', 'S'); - } - - private function printProgressForIncomplete(): void - { - $this->printProgressWithColor('fg-yellow, bold', 'I'); - } - - private function printProgressForNotice(): void - { - $this->printProgressWithColor('fg-yellow, bold', 'N'); - } - - private function printProgressForDeprecation(): void - { - $this->printProgressWithColor('fg-yellow, bold', 'D'); - } - - private function printProgressForRisky(): void - { - $this->printProgressWithColor('fg-yellow, bold', 'R'); - } - - private function printProgressForWarning(): void - { - $this->printProgressWithColor('fg-yellow, bold', 'W'); - } - - private function printProgressForFailure(): void - { - $this->printProgressWithColor('bg-red, fg-white', 'F'); - } - - private function printProgressForError(): void - { - $this->printProgressWithColor('fg-red, bold', 'E'); - } - - private function printProgressWithColor(string $color, string $progress): void - { - if ($this->colors) { - $progress = Color::colorizeTextBox($color, $progress); - } - - $this->printProgress($progress); - } - - private function printProgress(string $progress): void - { - $this->printer->print($progress); - - $this->column++; - $this->numberOfTestsRun++; - - if ($this->column === $this->maxColumn || $this->numberOfTestsRun === $this->numberOfTests) { - if ($this->numberOfTestsRun === $this->numberOfTests) { - $this->printer->print(str_repeat(' ', $this->maxColumn - $this->column)); - } - - $this->printer->print( - sprintf( - ' %' . $this->numberOfTestsWidth . 'd / %' . - $this->numberOfTestsWidth . 'd (%3s%%)', - $this->numberOfTestsRun, - $this->numberOfTests, - floor(($this->numberOfTestsRun / $this->numberOfTests) * 100), - ), - ); - - if ($this->column === $this->maxColumn) { - $this->column = 0; - $this->printer->print("\n"); - } - } - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/BeforeTestClassMethodErroredSubscriber.php b/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/BeforeTestClassMethodErroredSubscriber.php deleted file mode 100644 index 85e6315..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/BeforeTestClassMethodErroredSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Output\Default\ProgressPrinter; - -use PHPUnit\Event\Test\BeforeFirstTestMethodErrored; -use PHPUnit\Event\Test\BeforeFirstTestMethodErroredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class BeforeTestClassMethodErroredSubscriber extends Subscriber implements BeforeFirstTestMethodErroredSubscriber -{ - public function notify(BeforeFirstTestMethodErrored $event): void - { - $this->printer()->beforeTestClassMethodErrored(); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/Subscriber.php b/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/Subscriber.php deleted file mode 100644 index f238ed2..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/Subscriber.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Output\Default\ProgressPrinter; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -abstract class Subscriber -{ - private readonly ProgressPrinter $printer; - - public function __construct(ProgressPrinter $printer) - { - $this->printer = $printer; - } - - protected function printer(): ProgressPrinter - { - return $this->printer; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestConsideredRiskySubscriber.php b/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestConsideredRiskySubscriber.php deleted file mode 100644 index f72056d..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestConsideredRiskySubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Output\Default\ProgressPrinter; - -use PHPUnit\Event\Test\ConsideredRisky; -use PHPUnit\Event\Test\ConsideredRiskySubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestConsideredRiskySubscriber extends Subscriber implements ConsideredRiskySubscriber -{ - public function notify(ConsideredRisky $event): void - { - $this->printer()->testConsideredRisky(); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestErroredSubscriber.php b/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestErroredSubscriber.php deleted file mode 100644 index 2c07b78..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestErroredSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Output\Default\ProgressPrinter; - -use PHPUnit\Event\Test\Errored; -use PHPUnit\Event\Test\ErroredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestErroredSubscriber extends Subscriber implements ErroredSubscriber -{ - public function notify(Errored $event): void - { - $this->printer()->testErrored($event); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestFailedSubscriber.php b/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestFailedSubscriber.php deleted file mode 100644 index 27f3303..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestFailedSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Output\Default\ProgressPrinter; - -use PHPUnit\Event\Test\Failed; -use PHPUnit\Event\Test\FailedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestFailedSubscriber extends Subscriber implements FailedSubscriber -{ - public function notify(Failed $event): void - { - $this->printer()->testFailed(); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestFinishedSubscriber.php b/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestFinishedSubscriber.php deleted file mode 100644 index fa4d95c..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestFinishedSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Output\Default\ProgressPrinter; - -use PHPUnit\Event\Test\Finished; -use PHPUnit\Event\Test\FinishedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestFinishedSubscriber extends Subscriber implements FinishedSubscriber -{ - public function notify(Finished $event): void - { - $this->printer()->testFinished(); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestMarkedIncompleteSubscriber.php b/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestMarkedIncompleteSubscriber.php deleted file mode 100644 index 2be2d1f..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestMarkedIncompleteSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Output\Default\ProgressPrinter; - -use PHPUnit\Event\Test\MarkedIncomplete; -use PHPUnit\Event\Test\MarkedIncompleteSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestMarkedIncompleteSubscriber extends Subscriber implements MarkedIncompleteSubscriber -{ - public function notify(MarkedIncomplete $event): void - { - $this->printer()->testMarkedIncomplete(); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestPreparedSubscriber.php b/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestPreparedSubscriber.php deleted file mode 100644 index 2225ea0..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestPreparedSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Output\Default\ProgressPrinter; - -use PHPUnit\Event\Test\Prepared; -use PHPUnit\Event\Test\PreparedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestPreparedSubscriber extends Subscriber implements PreparedSubscriber -{ - public function notify(Prepared $event): void - { - $this->printer()->testPrepared(); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestRunnerExecutionStartedSubscriber.php b/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestRunnerExecutionStartedSubscriber.php deleted file mode 100644 index 666dcc9..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestRunnerExecutionStartedSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Output\Default\ProgressPrinter; - -use PHPUnit\Event\TestRunner\ExecutionStarted; -use PHPUnit\Event\TestRunner\ExecutionStartedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestRunnerExecutionStartedSubscriber extends Subscriber implements ExecutionStartedSubscriber -{ - public function notify(ExecutionStarted $event): void - { - $this->printer()->testRunnerExecutionStarted($event); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestSkippedSubscriber.php b/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestSkippedSubscriber.php deleted file mode 100644 index 2b05a75..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestSkippedSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Output\Default\ProgressPrinter; - -use PHPUnit\Event\Test\Skipped; -use PHPUnit\Event\Test\SkippedSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestSkippedSubscriber extends Subscriber implements SkippedSubscriber -{ - public function notify(Skipped $event): void - { - $this->printer()->testSkipped(); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredDeprecationSubscriber.php b/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredDeprecationSubscriber.php deleted file mode 100644 index d7eb797..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredDeprecationSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Output\Default\ProgressPrinter; - -use PHPUnit\Event\Test\DeprecationTriggered; -use PHPUnit\Event\Test\DeprecationTriggeredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestTriggeredDeprecationSubscriber extends Subscriber implements DeprecationTriggeredSubscriber -{ - public function notify(DeprecationTriggered $event): void - { - $this->printer()->testTriggeredDeprecation($event); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredErrorSubscriber.php b/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredErrorSubscriber.php deleted file mode 100644 index 049a1e6..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredErrorSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Output\Default\ProgressPrinter; - -use PHPUnit\Event\Test\ErrorTriggered; -use PHPUnit\Event\Test\ErrorTriggeredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestTriggeredErrorSubscriber extends Subscriber implements ErrorTriggeredSubscriber -{ - public function notify(ErrorTriggered $event): void - { - $this->printer()->testTriggeredError($event); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredNoticeSubscriber.php b/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredNoticeSubscriber.php deleted file mode 100644 index e396c96..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredNoticeSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Output\Default\ProgressPrinter; - -use PHPUnit\Event\Test\NoticeTriggered; -use PHPUnit\Event\Test\NoticeTriggeredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestTriggeredNoticeSubscriber extends Subscriber implements NoticeTriggeredSubscriber -{ - public function notify(NoticeTriggered $event): void - { - $this->printer()->testTriggeredNotice($event); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpDeprecationSubscriber.php b/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpDeprecationSubscriber.php deleted file mode 100644 index 65a2420..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpDeprecationSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Output\Default\ProgressPrinter; - -use PHPUnit\Event\Test\PhpDeprecationTriggered; -use PHPUnit\Event\Test\PhpDeprecationTriggeredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestTriggeredPhpDeprecationSubscriber extends Subscriber implements PhpDeprecationTriggeredSubscriber -{ - public function notify(PhpDeprecationTriggered $event): void - { - $this->printer()->testTriggeredPhpDeprecation($event); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpNoticeSubscriber.php b/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpNoticeSubscriber.php deleted file mode 100644 index f783fbc..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpNoticeSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Output\Default\ProgressPrinter; - -use PHPUnit\Event\Test\PhpNoticeTriggered; -use PHPUnit\Event\Test\PhpNoticeTriggeredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestTriggeredPhpNoticeSubscriber extends Subscriber implements PhpNoticeTriggeredSubscriber -{ - public function notify(PhpNoticeTriggered $event): void - { - $this->printer()->testTriggeredPhpNotice($event); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpWarningSubscriber.php b/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpWarningSubscriber.php deleted file mode 100644 index 18e723b..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpWarningSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Output\Default\ProgressPrinter; - -use PHPUnit\Event\Test\PhpWarningTriggered; -use PHPUnit\Event\Test\PhpWarningTriggeredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestTriggeredPhpWarningSubscriber extends Subscriber implements PhpWarningTriggeredSubscriber -{ - public function notify(PhpWarningTriggered $event): void - { - $this->printer()->testTriggeredPhpWarning($event); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpunitDeprecationSubscriber.php b/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpunitDeprecationSubscriber.php deleted file mode 100644 index f273f8a..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpunitDeprecationSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Output\Default\ProgressPrinter; - -use PHPUnit\Event\Test\PhpunitDeprecationTriggered; -use PHPUnit\Event\Test\PhpunitDeprecationTriggeredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestTriggeredPhpunitDeprecationSubscriber extends Subscriber implements PhpunitDeprecationTriggeredSubscriber -{ - public function notify(PhpunitDeprecationTriggered $event): void - { - $this->printer()->testTriggeredPhpunitDeprecation(); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpunitWarningSubscriber.php b/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpunitWarningSubscriber.php deleted file mode 100644 index 12087c4..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpunitWarningSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Output\Default\ProgressPrinter; - -use PHPUnit\Event\Test\PhpunitWarningTriggered; -use PHPUnit\Event\Test\PhpunitWarningTriggeredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestTriggeredPhpunitWarningSubscriber extends Subscriber implements PhpunitWarningTriggeredSubscriber -{ - public function notify(PhpunitWarningTriggered $event): void - { - $this->printer()->testTriggeredPhpunitWarning(); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredWarningSubscriber.php b/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredWarningSubscriber.php deleted file mode 100644 index 05188dc..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredWarningSubscriber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Output\Default\ProgressPrinter; - -use PHPUnit\Event\Test\WarningTriggered; -use PHPUnit\Event\Test\WarningTriggeredSubscriber; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestTriggeredWarningSubscriber extends Subscriber implements WarningTriggeredSubscriber -{ - public function notify(WarningTriggered $event): void - { - $this->printer()->testTriggeredWarning($event); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ResultPrinter.php b/vendor/phpunit/phpunit/src/TextUI/Output/Default/ResultPrinter.php deleted file mode 100644 index c57035c..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Output/Default/ResultPrinter.php +++ /dev/null @@ -1,634 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Output\Default; - -use const PHP_EOL; -use function array_keys; -use function array_merge; -use function array_reverse; -use function array_unique; -use function assert; -use function count; -use function explode; -use function ksort; -use function range; -use function sprintf; -use function str_starts_with; -use function strlen; -use function substr; -use function trim; -use PHPUnit\Event\Code\Test; -use PHPUnit\Event\Code\TestMethod; -use PHPUnit\Event\Test\AfterLastTestMethodErrored; -use PHPUnit\Event\Test\BeforeFirstTestMethodErrored; -use PHPUnit\Event\Test\ConsideredRisky; -use PHPUnit\Event\Test\DeprecationTriggered; -use PHPUnit\Event\Test\ErrorTriggered; -use PHPUnit\Event\Test\NoticeTriggered; -use PHPUnit\Event\Test\PhpDeprecationTriggered; -use PHPUnit\Event\Test\PhpNoticeTriggered; -use PHPUnit\Event\Test\PhpunitDeprecationTriggered; -use PHPUnit\Event\Test\PhpunitErrorTriggered; -use PHPUnit\Event\Test\PhpunitWarningTriggered; -use PHPUnit\Event\Test\PhpWarningTriggered; -use PHPUnit\Event\Test\WarningTriggered; -use PHPUnit\TestRunner\TestResult\Issues\Issue; -use PHPUnit\TestRunner\TestResult\TestResult; -use PHPUnit\TextUI\Output\Printer; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ResultPrinter -{ - private readonly Printer $printer; - private readonly bool $displayPhpunitErrors; - private readonly bool $displayPhpunitWarnings; - private readonly bool $displayTestsWithErrors; - private readonly bool $displayTestsWithFailedAssertions; - private readonly bool $displayRiskyTests; - private readonly bool $displayPhpunitDeprecations; - private readonly bool $displayDetailsOnIncompleteTests; - private readonly bool $displayDetailsOnSkippedTests; - private readonly bool $displayDetailsOnTestsThatTriggerDeprecations; - private readonly bool $displayDetailsOnTestsThatTriggerErrors; - private readonly bool $displayDetailsOnTestsThatTriggerNotices; - private readonly bool $displayDetailsOnTestsThatTriggerWarnings; - private readonly bool $displayDefectsInReverseOrder; - private bool $listPrinted = false; - - public function __construct(Printer $printer, bool $displayPhpunitErrors, bool $displayPhpunitWarnings, bool $displayPhpunitDeprecations, bool $displayTestsWithErrors, bool $displayTestsWithFailedAssertions, bool $displayRiskyTests, bool $displayDetailsOnIncompleteTests, bool $displayDetailsOnSkippedTests, bool $displayDetailsOnTestsThatTriggerDeprecations, bool $displayDetailsOnTestsThatTriggerErrors, bool $displayDetailsOnTestsThatTriggerNotices, bool $displayDetailsOnTestsThatTriggerWarnings, bool $displayDefectsInReverseOrder) - { - $this->printer = $printer; - $this->displayPhpunitErrors = $displayPhpunitErrors; - $this->displayPhpunitWarnings = $displayPhpunitWarnings; - $this->displayPhpunitDeprecations = $displayPhpunitDeprecations; - $this->displayTestsWithErrors = $displayTestsWithErrors; - $this->displayTestsWithFailedAssertions = $displayTestsWithFailedAssertions; - $this->displayRiskyTests = $displayRiskyTests; - $this->displayDetailsOnIncompleteTests = $displayDetailsOnIncompleteTests; - $this->displayDetailsOnSkippedTests = $displayDetailsOnSkippedTests; - $this->displayDetailsOnTestsThatTriggerDeprecations = $displayDetailsOnTestsThatTriggerDeprecations; - $this->displayDetailsOnTestsThatTriggerErrors = $displayDetailsOnTestsThatTriggerErrors; - $this->displayDetailsOnTestsThatTriggerNotices = $displayDetailsOnTestsThatTriggerNotices; - $this->displayDetailsOnTestsThatTriggerWarnings = $displayDetailsOnTestsThatTriggerWarnings; - $this->displayDefectsInReverseOrder = $displayDefectsInReverseOrder; - } - - public function print(TestResult $result): void - { - if ($this->displayPhpunitErrors) { - $this->printPhpunitErrors($result); - } - - if ($this->displayPhpunitWarnings) { - $this->printTestRunnerWarnings($result); - } - - if ($this->displayPhpunitDeprecations) { - $this->printTestRunnerDeprecations($result); - } - - if ($this->displayTestsWithErrors) { - $this->printTestsWithErrors($result); - } - - if ($this->displayTestsWithFailedAssertions) { - $this->printTestsWithFailedAssertions($result); - } - - if ($this->displayPhpunitWarnings) { - $this->printDetailsOnTestsThatTriggeredPhpunitWarnings($result); - } - - if ($this->displayPhpunitDeprecations) { - $this->printDetailsOnTestsThatTriggeredPhpunitDeprecations($result); - } - - if ($this->displayRiskyTests) { - $this->printRiskyTests($result); - } - - if ($this->displayDetailsOnIncompleteTests) { - $this->printIncompleteTests($result); - } - - if ($this->displayDetailsOnSkippedTests) { - $this->printSkippedTestSuites($result); - $this->printSkippedTests($result); - } - - if ($this->displayDetailsOnTestsThatTriggerErrors) { - $this->printIssueList('error', $result->errors()); - } - - if ($this->displayDetailsOnTestsThatTriggerWarnings) { - $this->printIssueList('PHP warning', $result->phpWarnings()); - $this->printIssueList('warning', $result->warnings()); - } - - if ($this->displayDetailsOnTestsThatTriggerNotices) { - $this->printIssueList('PHP notice', $result->phpNotices()); - $this->printIssueList('notice', $result->notices()); - } - - if ($this->displayDetailsOnTestsThatTriggerDeprecations) { - $this->printIssueList('PHP deprecation', $result->phpDeprecations()); - $this->printIssueList('deprecation', $result->deprecations()); - } - } - - private function printPhpunitErrors(TestResult $result): void - { - if (!$result->hasTestTriggeredPhpunitErrorEvents()) { - return; - } - - $elements = $this->mapTestsWithIssuesEventsToElements($result->testTriggeredPhpunitErrorEvents()); - - $this->printListHeaderWithNumber($elements['numberOfTestsWithIssues'], 'PHPUnit error'); - $this->printList($elements['elements']); - } - - private function printDetailsOnTestsThatTriggeredPhpunitDeprecations(TestResult $result): void - { - if (!$result->hasTestTriggeredPhpunitDeprecationEvents()) { - return; - } - - $elements = $this->mapTestsWithIssuesEventsToElements($result->testTriggeredPhpunitDeprecationEvents()); - - $this->printListHeaderWithNumberOfTestsAndNumberOfIssues( - $elements['numberOfTestsWithIssues'], - $elements['numberOfIssues'], - 'PHPUnit deprecation', - ); - - $this->printList($elements['elements']); - } - - private function printTestRunnerWarnings(TestResult $result): void - { - if (!$result->hasTestRunnerTriggeredWarningEvents()) { - return; - } - - $elements = []; - $messages = []; - - foreach ($result->testRunnerTriggeredWarningEvents() as $event) { - if (isset($messages[$event->message()])) { - continue; - } - - $elements[] = [ - 'title' => $event->message(), - 'body' => '', - ]; - - $messages[$event->message()] = true; - } - - $this->printListHeaderWithNumber(count($elements), 'PHPUnit test runner warning'); - $this->printList($elements); - } - - private function printTestRunnerDeprecations(TestResult $result): void - { - if (!$result->hasTestRunnerTriggeredDeprecationEvents()) { - return; - } - - $elements = []; - - foreach ($result->testRunnerTriggeredDeprecationEvents() as $event) { - $elements[] = [ - 'title' => $event->message(), - 'body' => '', - ]; - } - - $this->printListHeaderWithNumber(count($elements), 'PHPUnit test runner deprecation'); - $this->printList($elements); - } - - private function printDetailsOnTestsThatTriggeredPhpunitWarnings(TestResult $result): void - { - if (!$result->hasTestTriggeredPhpunitWarningEvents()) { - return; - } - - $elements = $this->mapTestsWithIssuesEventsToElements($result->testTriggeredPhpunitWarningEvents()); - - $this->printListHeaderWithNumberOfTestsAndNumberOfIssues( - $elements['numberOfTestsWithIssues'], - $elements['numberOfIssues'], - 'PHPUnit warning', - ); - - $this->printList($elements['elements']); - } - - private function printTestsWithErrors(TestResult $result): void - { - if (!$result->hasTestErroredEvents()) { - return; - } - - $elements = []; - - foreach ($result->testErroredEvents() as $event) { - if ($event instanceof AfterLastTestMethodErrored || $event instanceof BeforeFirstTestMethodErrored) { - $title = $event->testClassName(); - } else { - $title = $this->name($event->test()); - } - - $elements[] = [ - 'title' => $title, - 'body' => $event->throwable()->asString(), - ]; - } - - $this->printListHeaderWithNumber(count($elements), 'error'); - $this->printList($elements); - } - - private function printTestsWithFailedAssertions(TestResult $result): void - { - if (!$result->hasTestFailedEvents()) { - return; - } - - $elements = []; - - foreach ($result->testFailedEvents() as $event) { - $body = $event->throwable()->asString(); - - if (str_starts_with($body, 'AssertionError: ')) { - $body = substr($body, strlen('AssertionError: ')); - } - - $elements[] = [ - 'title' => $this->name($event->test()), - 'body' => $body, - ]; - } - - $this->printListHeaderWithNumber(count($elements), 'failure'); - $this->printList($elements); - } - - private function printRiskyTests(TestResult $result): void - { - if (!$result->hasTestConsideredRiskyEvents()) { - return; - } - - $elements = $this->mapTestsWithIssuesEventsToElements($result->testConsideredRiskyEvents()); - - $this->printListHeaderWithNumber($elements['numberOfTestsWithIssues'], 'risky test'); - $this->printList($elements['elements']); - } - - private function printIncompleteTests(TestResult $result): void - { - if (!$result->hasTestMarkedIncompleteEvents()) { - return; - } - - $elements = []; - - foreach ($result->testMarkedIncompleteEvents() as $event) { - $elements[] = [ - 'title' => $this->name($event->test()), - 'body' => $event->throwable()->asString(), - ]; - } - - $this->printListHeaderWithNumber(count($elements), 'incomplete test'); - $this->printList($elements); - } - - private function printSkippedTestSuites(TestResult $result): void - { - if (!$result->hasTestSuiteSkippedEvents()) { - return; - } - - $elements = []; - - foreach ($result->testSuiteSkippedEvents() as $event) { - $elements[] = [ - 'title' => $event->testSuite()->name(), - 'body' => $event->message(), - ]; - } - - $this->printListHeaderWithNumber(count($elements), 'skipped test suite'); - $this->printList($elements); - } - - private function printSkippedTests(TestResult $result): void - { - if (!$result->hasTestSkippedEvents()) { - return; - } - - $elements = []; - - foreach ($result->testSkippedEvents() as $event) { - $elements[] = [ - 'title' => $this->name($event->test()), - 'body' => $event->message(), - ]; - } - - $this->printListHeaderWithNumber(count($elements), 'skipped test'); - $this->printList($elements); - } - - /** - * @psalm-param non-empty-string $type - * @psalm-param list $issues - */ - private function printIssueList(string $type, array $issues): void - { - if (empty($issues)) { - return; - } - - $numberOfUniqueIssues = count($issues); - $triggeringTests = []; - - foreach ($issues as $issue) { - $triggeringTests = array_merge($triggeringTests, array_keys($issue->triggeringTests())); - } - - $numberOfTests = count(array_unique($triggeringTests)); - unset($triggeringTests); - - $this->printListHeader( - sprintf( - '%d test%s triggered %d %s%s:' . PHP_EOL . PHP_EOL, - $numberOfTests, - $numberOfTests !== 1 ? 's' : '', - $numberOfUniqueIssues, - $type, - $numberOfUniqueIssues !== 1 ? 's' : '', - ), - ); - - $i = 1; - - foreach ($issues as $issue) { - $title = sprintf( - '%s:%d', - $issue->file(), - $issue->line(), - ); - - $body = trim($issue->description()) . PHP_EOL . PHP_EOL . 'Triggered by:'; - - $triggeringTests = $issue->triggeringTests(); - - ksort($triggeringTests); - - foreach ($triggeringTests as $triggeringTest) { - $body .= PHP_EOL . PHP_EOL . '* ' . $triggeringTest['test']->id(); - - if ($triggeringTest['count'] > 1) { - $body .= sprintf( - ' (%d times)', - $triggeringTest['count'], - ); - } - - if ($triggeringTest['test']->isTestMethod()) { - $body .= PHP_EOL . ' ' . $triggeringTest['test']->file() . ':' . $triggeringTest['test']->line(); - } - } - - $this->printIssueListElement($i++, $title, $body); - - $this->printer->print(PHP_EOL); - } - } - - private function printListHeaderWithNumberOfTestsAndNumberOfIssues(int $numberOfTestsWithIssues, int $numberOfIssues, string $type): void - { - $this->printListHeader( - sprintf( - "%d test%s triggered %d %s%s:\n\n", - $numberOfTestsWithIssues, - $numberOfTestsWithIssues !== 1 ? 's' : '', - $numberOfIssues, - $type, - $numberOfIssues !== 1 ? 's' : '', - ), - ); - } - - private function printListHeaderWithNumber(int $number, string $type): void - { - $this->printListHeader( - sprintf( - "There %s %d %s%s:\n\n", - ($number === 1) ? 'was' : 'were', - $number, - $type, - ($number === 1) ? '' : 's', - ), - ); - } - - private function printListHeader(string $header): void - { - if ($this->listPrinted) { - $this->printer->print("--\n\n"); - } - - $this->listPrinted = true; - - $this->printer->print($header); - } - - /** - * @psalm-param list $elements - */ - private function printList(array $elements): void - { - $i = 1; - - if ($this->displayDefectsInReverseOrder) { - $elements = array_reverse($elements); - } - - foreach ($elements as $element) { - $this->printListElement($i++, $element['title'], $element['body']); - } - - $this->printer->print("\n"); - } - - private function printListElement(int $number, string $title, string $body): void - { - $body = trim($body); - - $this->printer->print( - sprintf( - "%s%d) %s\n%s%s", - $number > 1 ? "\n" : '', - $number, - $title, - $body, - !empty($body) ? "\n" : '', - ), - ); - } - - private function printIssueListElement(int $number, string $title, string $body): void - { - $body = trim($body); - - $this->printer->print( - sprintf( - "%d) %s\n%s%s", - $number, - $title, - $body, - !empty($body) ? "\n" : '', - ), - ); - } - - private function name(Test $test): string - { - if ($test->isTestMethod()) { - assert($test instanceof TestMethod); - - if (!$test->testData()->hasDataFromDataProvider()) { - return $test->nameWithClass(); - } - - return $test->className() . '::' . $test->methodName() . $test->testData()->dataFromDataProvider()->dataAsStringForResultOutput(); - } - - return $test->name(); - } - - /** - * @psalm-param array> $events - * - * @psalm-return array{numberOfTestsWithIssues: int, numberOfIssues: int, elements: list} - */ - private function mapTestsWithIssuesEventsToElements(array $events): array - { - $elements = []; - $issues = 0; - - foreach ($events as $reasons) { - $test = $reasons[0]->test(); - $testLocation = $this->testLocation($test); - $title = $this->name($test); - $body = ''; - $first = true; - $single = count($reasons) === 1; - - foreach ($reasons as $reason) { - if ($first) { - $first = false; - } else { - $body .= PHP_EOL; - } - - $body .= $this->reasonMessage($reason, $single); - $body .= $this->reasonLocation($reason, $single); - - $issues++; - } - - if (!empty($testLocation)) { - $body .= $testLocation; - } - - $elements[] = [ - 'title' => $title, - 'body' => $body, - ]; - } - - return [ - 'numberOfTestsWithIssues' => count($events), - 'numberOfIssues' => $issues, - 'elements' => $elements, - ]; - } - - private function testLocation(Test $test): string - { - if (!$test->isTestMethod()) { - return ''; - } - - assert($test instanceof TestMethod); - - return sprintf( - '%s%s:%d%s', - PHP_EOL, - $test->file(), - $test->line(), - PHP_EOL, - ); - } - - private function reasonMessage(ConsideredRisky|DeprecationTriggered|ErrorTriggered|NoticeTriggered|PhpDeprecationTriggered|PhpNoticeTriggered|PhpunitDeprecationTriggered|PhpunitErrorTriggered|PhpunitWarningTriggered|PhpWarningTriggered|WarningTriggered $reason, bool $single): string - { - $message = trim($reason->message()); - - if ($single) { - return $message . PHP_EOL; - } - - $lines = explode(PHP_EOL, $message); - $buffer = '* ' . $lines[0] . PHP_EOL; - - if (count($lines) > 1) { - foreach (range(1, count($lines) - 1) as $line) { - $buffer .= ' ' . $lines[$line] . PHP_EOL; - } - } - - return $buffer; - } - - private function reasonLocation(ConsideredRisky|DeprecationTriggered|ErrorTriggered|NoticeTriggered|PhpDeprecationTriggered|PhpNoticeTriggered|PhpunitDeprecationTriggered|PhpunitErrorTriggered|PhpunitWarningTriggered|PhpWarningTriggered|WarningTriggered $reason, bool $single): string - { - if (!$reason instanceof DeprecationTriggered && - !$reason instanceof PhpDeprecationTriggered && - !$reason instanceof ErrorTriggered && - !$reason instanceof NoticeTriggered && - !$reason instanceof PhpNoticeTriggered && - !$reason instanceof WarningTriggered && - !$reason instanceof PhpWarningTriggered) { - return ''; - } - - return sprintf( - '%s%s:%d%s', - $single ? '' : ' ', - $reason->file(), - $reason->line(), - PHP_EOL, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Output/Default/UnexpectedOutputPrinter.php b/vendor/phpunit/phpunit/src/TextUI/Output/Default/UnexpectedOutputPrinter.php deleted file mode 100644 index 08c72d9..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Output/Default/UnexpectedOutputPrinter.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Output\Default; - -use PHPUnit\Event\EventFacadeIsSealedException; -use PHPUnit\Event\Facade; -use PHPUnit\Event\Test\PrintedUnexpectedOutput; -use PHPUnit\Event\Test\PrintedUnexpectedOutputSubscriber; -use PHPUnit\Event\UnknownSubscriberTypeException; -use PHPUnit\TextUI\Output\Printer; - -final class UnexpectedOutputPrinter implements PrintedUnexpectedOutputSubscriber -{ - private readonly Printer $printer; - - /** - * @throws EventFacadeIsSealedException - * @throws UnknownSubscriberTypeException - */ - public function __construct(Printer $printer, Facade $facade) - { - $this->printer = $printer; - - $facade->registerSubscriber($this); - } - - public function notify(PrintedUnexpectedOutput $event): void - { - $this->printer->print($event->output()); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Output/Facade.php b/vendor/phpunit/phpunit/src/TextUI/Output/Facade.php deleted file mode 100644 index 0306e98..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Output/Facade.php +++ /dev/null @@ -1,281 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Output; - -use const PHP_EOL; -use function assert; -use PHPUnit\Event\EventFacadeIsSealedException; -use PHPUnit\Event\Facade as EventFacade; -use PHPUnit\Event\UnknownSubscriberTypeException; -use PHPUnit\Logging\TeamCity\TeamCityLogger; -use PHPUnit\Logging\TestDox\TestResultCollection; -use PHPUnit\Runner\DirectoryDoesNotExistException; -use PHPUnit\TestRunner\TestResult\TestResult; -use PHPUnit\TextUI\CannotOpenSocketException; -use PHPUnit\TextUI\Configuration\Configuration; -use PHPUnit\TextUI\InvalidSocketException; -use PHPUnit\TextUI\Output\Default\ProgressPrinter\ProgressPrinter as DefaultProgressPrinter; -use PHPUnit\TextUI\Output\Default\ResultPrinter as DefaultResultPrinter; -use PHPUnit\TextUI\Output\Default\UnexpectedOutputPrinter; -use PHPUnit\TextUI\Output\TestDox\ResultPrinter as TestDoxResultPrinter; -use SebastianBergmann\Timer\Duration; -use SebastianBergmann\Timer\ResourceUsageFormatter; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Facade -{ - private static ?Printer $printer = null; - private static ?DefaultResultPrinter $defaultResultPrinter = null; - private static ?TestDoxResultPrinter $testDoxResultPrinter = null; - private static ?SummaryPrinter $summaryPrinter = null; - private static bool $defaultProgressPrinter = false; - - /** - * @throws EventFacadeIsSealedException - * @throws UnknownSubscriberTypeException - */ - public static function init(Configuration $configuration, bool $extensionReplacesProgressOutput, bool $extensionReplacesResultOutput): Printer - { - self::createPrinter($configuration); - - assert(self::$printer !== null); - - if ($configuration->debug()) { - return self::$printer; - } - - self::createUnexpectedOutputPrinter(); - - if (!$extensionReplacesProgressOutput) { - self::createProgressPrinter($configuration); - } - - if (!$extensionReplacesResultOutput) { - self::createResultPrinter($configuration); - self::createSummaryPrinter($configuration); - } - - if ($configuration->outputIsTeamCity()) { - new TeamCityLogger( - DefaultPrinter::standardOutput(), - EventFacade::instance(), - ); - } - - return self::$printer; - } - - /** - * @psalm-param ?array $testDoxResult - */ - public static function printResult(TestResult $result, ?array $testDoxResult, Duration $duration): void - { - assert(self::$printer !== null); - - if ($result->numberOfTestsRun() > 0) { - if (self::$defaultProgressPrinter) { - self::$printer->print(PHP_EOL . PHP_EOL); - } - - self::$printer->print((new ResourceUsageFormatter)->resourceUsage($duration) . PHP_EOL . PHP_EOL); - } - - if (self::$testDoxResultPrinter !== null && $testDoxResult !== null) { - self::$testDoxResultPrinter->print($testDoxResult); - } - - if (self::$defaultResultPrinter !== null) { - self::$defaultResultPrinter->print($result); - } - - if (self::$summaryPrinter !== null) { - self::$summaryPrinter->print($result); - } - } - - /** - * @throws CannotOpenSocketException - * @throws DirectoryDoesNotExistException - * @throws InvalidSocketException - */ - public static function printerFor(string $target): Printer - { - if ($target === 'php://stdout') { - if (!self::$printer instanceof NullPrinter) { - return self::$printer; - } - - return DefaultPrinter::standardOutput(); - } - - return DefaultPrinter::from($target); - } - - private static function createPrinter(Configuration $configuration): void - { - $printerNeeded = false; - - if ($configuration->debug()) { - $printerNeeded = true; - } - - if ($configuration->outputIsTeamCity()) { - $printerNeeded = true; - } - - if ($configuration->outputIsTestDox()) { - $printerNeeded = true; - } - - if (!$configuration->noOutput() && !$configuration->noProgress()) { - $printerNeeded = true; - } - - if (!$configuration->noOutput() && !$configuration->noResults()) { - $printerNeeded = true; - } - - if ($printerNeeded) { - if ($configuration->outputToStandardErrorStream()) { - self::$printer = DefaultPrinter::standardError(); - - return; - } - - self::$printer = DefaultPrinter::standardOutput(); - - return; - } - - self::$printer = new NullPrinter; - } - - private static function createProgressPrinter(Configuration $configuration): void - { - assert(self::$printer !== null); - - if (!self::useDefaultProgressPrinter($configuration)) { - return; - } - - new DefaultProgressPrinter( - self::$printer, - EventFacade::instance(), - $configuration->colors(), - $configuration->columns(), - $configuration->source(), - ); - - self::$defaultProgressPrinter = true; - } - - private static function useDefaultProgressPrinter(Configuration $configuration): bool - { - if ($configuration->noOutput()) { - return false; - } - - if ($configuration->noProgress()) { - return false; - } - - if ($configuration->outputIsTeamCity()) { - return false; - } - - return true; - } - - private static function createResultPrinter(Configuration $configuration): void - { - assert(self::$printer !== null); - - if ($configuration->outputIsTestDox()) { - self::$defaultResultPrinter = new DefaultResultPrinter( - self::$printer, - true, - true, - $configuration->displayDetailsOnPhpunitDeprecations() || $configuration->displayDetailsOnAllIssues(), - false, - false, - true, - false, - false, - $configuration->displayDetailsOnTestsThatTriggerDeprecations() || $configuration->displayDetailsOnAllIssues(), - $configuration->displayDetailsOnTestsThatTriggerErrors() || $configuration->displayDetailsOnAllIssues(), - $configuration->displayDetailsOnTestsThatTriggerNotices() || $configuration->displayDetailsOnAllIssues(), - $configuration->displayDetailsOnTestsThatTriggerWarnings() || $configuration->displayDetailsOnAllIssues(), - $configuration->reverseDefectList(), - ); - } - - if ($configuration->outputIsTestDox()) { - self::$testDoxResultPrinter = new TestDoxResultPrinter( - self::$printer, - $configuration->colors(), - ); - } - - if ($configuration->noOutput() || $configuration->noResults()) { - return; - } - - if (self::$defaultResultPrinter !== null) { - return; - } - - self::$defaultResultPrinter = new DefaultResultPrinter( - self::$printer, - true, - true, - $configuration->displayDetailsOnPhpunitDeprecations() || $configuration->displayDetailsOnAllIssues(), - true, - true, - true, - $configuration->displayDetailsOnIncompleteTests() || $configuration->displayDetailsOnAllIssues(), - $configuration->displayDetailsOnSkippedTests() || $configuration->displayDetailsOnAllIssues(), - $configuration->displayDetailsOnTestsThatTriggerDeprecations() || $configuration->displayDetailsOnAllIssues(), - $configuration->displayDetailsOnTestsThatTriggerErrors() || $configuration->displayDetailsOnAllIssues(), - $configuration->displayDetailsOnTestsThatTriggerNotices() || $configuration->displayDetailsOnAllIssues(), - $configuration->displayDetailsOnTestsThatTriggerWarnings() || $configuration->displayDetailsOnAllIssues(), - $configuration->reverseDefectList(), - ); - } - - private static function createSummaryPrinter(Configuration $configuration): void - { - assert(self::$printer !== null); - - if (($configuration->noOutput() || $configuration->noResults()) && - !($configuration->outputIsTeamCity() || $configuration->outputIsTestDox())) { - return; - } - - self::$summaryPrinter = new SummaryPrinter( - self::$printer, - $configuration->colors(), - ); - } - - /** - * @throws EventFacadeIsSealedException - * @throws UnknownSubscriberTypeException - */ - private static function createUnexpectedOutputPrinter(): void - { - assert(self::$printer !== null); - - new UnexpectedOutputPrinter(self::$printer, EventFacade::instance()); - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Output/Printer/DefaultPrinter.php b/vendor/phpunit/phpunit/src/TextUI/Output/Printer/DefaultPrinter.php deleted file mode 100644 index 38f3b2b..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Output/Printer/DefaultPrinter.php +++ /dev/null @@ -1,122 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Output; - -use function assert; -use function count; -use function dirname; -use function explode; -use function fclose; -use function fopen; -use function fsockopen; -use function fwrite; -use function str_replace; -use function str_starts_with; -use PHPUnit\Runner\DirectoryDoesNotExistException; -use PHPUnit\TextUI\CannotOpenSocketException; -use PHPUnit\TextUI\InvalidSocketException; -use PHPUnit\Util\Filesystem; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class DefaultPrinter implements Printer -{ - /** - * @psalm-var closed-resource|resource - */ - private $stream; - private readonly bool $isPhpStream; - private bool $isOpen; - - /** - * @throws CannotOpenSocketException - * @throws DirectoryDoesNotExistException - * @throws InvalidSocketException - */ - public static function from(string $out): self - { - return new self($out); - } - - /** - * @throws CannotOpenSocketException - * @throws DirectoryDoesNotExistException - * @throws InvalidSocketException - */ - public static function standardOutput(): self - { - return new self('php://stdout'); - } - - /** - * @throws CannotOpenSocketException - * @throws DirectoryDoesNotExistException - * @throws InvalidSocketException - */ - public static function standardError(): self - { - return new self('php://stderr'); - } - - /** - * @throws CannotOpenSocketException - * @throws DirectoryDoesNotExistException - * @throws InvalidSocketException - */ - private function __construct(string $out) - { - $this->isPhpStream = str_starts_with($out, 'php://'); - - if (str_starts_with($out, 'socket://')) { - $tmp = explode(':', str_replace('socket://', '', $out)); - - if (count($tmp) !== 2) { - throw new InvalidSocketException($out); - } - - $stream = @fsockopen($tmp[0], (int) $tmp[1]); - - if ($stream === false) { - throw new CannotOpenSocketException($tmp[0], (int) $tmp[1]); - } - - $this->stream = $stream; - $this->isOpen = true; - - return; - } - - if (!$this->isPhpStream && !Filesystem::createDirectory(dirname($out))) { - throw new DirectoryDoesNotExistException(dirname($out)); - } - - $this->stream = fopen($out, 'wb'); - $this->isOpen = true; - } - - public function print(string $buffer): void - { - assert($this->isOpen); - - fwrite($this->stream, $buffer); - } - - public function flush(): void - { - if ($this->isOpen && $this->isPhpStream) { - fclose($this->stream); - - $this->isOpen = false; - } - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Output/Printer/NullPrinter.php b/vendor/phpunit/phpunit/src/TextUI/Output/Printer/NullPrinter.php deleted file mode 100644 index cf27e6b..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Output/Printer/NullPrinter.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Output; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class NullPrinter implements Printer -{ - public function print(string $buffer): void - { - } - - public function flush(): void - { - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Output/Printer/Printer.php b/vendor/phpunit/phpunit/src/TextUI/Output/Printer/Printer.php deleted file mode 100644 index c9b0fb9..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Output/Printer/Printer.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Output; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This interface is not covered by the backward compatibility promise for PHPUnit - */ -interface Printer -{ - public function print(string $buffer): void; - - public function flush(): void; -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Output/SummaryPrinter.php b/vendor/phpunit/phpunit/src/TextUI/Output/SummaryPrinter.php deleted file mode 100644 index 7ca6cdf..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Output/SummaryPrinter.php +++ /dev/null @@ -1,160 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Output; - -use const PHP_EOL; -use function sprintf; -use PHPUnit\TestRunner\TestResult\TestResult; -use PHPUnit\Util\Color; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class SummaryPrinter -{ - private readonly Printer $printer; - private readonly bool $colors; - private bool $countPrinted = false; - - public function __construct(Printer $printer, bool $colors) - { - $this->printer = $printer; - $this->colors = $colors; - } - - public function print(TestResult $result): void - { - if ($result->numberOfTestsRun() === 0) { - $this->printWithColor( - 'fg-black, bg-yellow', - 'No tests executed!', - ); - - return; - } - - if ($result->wasSuccessful() && - !$result->hasIssues() && - !$result->hasTestSuiteSkippedEvents() && - !$result->hasTestSkippedEvents()) { - $this->printWithColor( - 'fg-black, bg-green', - sprintf( - 'OK (%d test%s, %d assertion%s)', - $result->numberOfTestsRun(), - $result->numberOfTestsRun() === 1 ? '' : 's', - $result->numberOfAssertions(), - $result->numberOfAssertions() === 1 ? '' : 's', - ), - ); - - $this->printNumberOfIssuesIgnoredByBaseline($result); - - return; - } - - $color = 'fg-black, bg-yellow'; - - if ($result->wasSuccessful()) { - if ($result->hasIssues()) { - $this->printWithColor( - $color, - 'OK, but there were issues!', - ); - } else { - $this->printWithColor( - $color, - 'OK, but some tests were skipped!', - ); - } - } else { - if ($result->hasTestErroredEvents() || $result->hasTestTriggeredPhpunitErrorEvents()) { - $color = 'fg-white, bg-red'; - - $this->printWithColor( - $color, - 'ERRORS!', - ); - } elseif ($result->hasTestFailedEvents()) { - $color = 'fg-white, bg-red'; - - $this->printWithColor( - $color, - 'FAILURES!', - ); - } - } - - $this->printCountString($result->numberOfTestsRun(), 'Tests', $color, true); - $this->printCountString($result->numberOfAssertions(), 'Assertions', $color, true); - $this->printCountString($result->numberOfErrors(), 'Errors', $color); - $this->printCountString($result->numberOfTestFailedEvents(), 'Failures', $color); - $this->printCountString($result->numberOfPhpunitWarnings(), 'PHPUnit Warnings', $color); - $this->printCountString($result->numberOfWarnings(), 'Warnings', $color); - $this->printCountString($result->numberOfPhpOrUserDeprecations(), 'Deprecations', $color); - $this->printCountString($result->numberOfPhpunitDeprecations(), 'PHPUnit Deprecations', $color); - $this->printCountString($result->numberOfNotices(), 'Notices', $color); - $this->printCountString($result->numberOfTestSuiteSkippedEvents() + $result->numberOfTestSkippedEvents(), 'Skipped', $color); - $this->printCountString($result->numberOfTestMarkedIncompleteEvents(), 'Incomplete', $color); - $this->printCountString($result->numberOfTestsWithTestConsideredRiskyEvents(), 'Risky', $color); - $this->printWithColor($color, '.'); - - $this->printNumberOfIssuesIgnoredByBaseline($result); - } - - private function printCountString(int $count, string $name, string $color, bool $always = false): void - { - if ($always || $count > 0) { - $this->printWithColor( - $color, - sprintf( - '%s%s: %d', - $this->countPrinted ? ', ' : '', - $name, - $count, - ), - false, - ); - - $this->countPrinted = true; - } - } - - private function printWithColor(string $color, string $buffer, bool $lf = true): void - { - if ($this->colors) { - $buffer = Color::colorizeTextBox($color, $buffer); - } - - $this->printer->print($buffer); - - if ($lf) { - $this->printer->print(PHP_EOL); - } - } - - private function printNumberOfIssuesIgnoredByBaseline(TestResult $result): void - { - if ($result->hasIssuesIgnoredByBaseline()) { - $this->printer->print( - sprintf( - '%s%d issue%s %s ignored by baseline.%s', - PHP_EOL, - $result->numberOfIssuesIgnoredByBaseline(), - $result->numberOfIssuesIgnoredByBaseline() > 1 ? 's' : '', - $result->numberOfIssuesIgnoredByBaseline() > 1 ? 'were' : 'was', - PHP_EOL, - ), - ); - } - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Output/TestDox/ResultPrinter.php b/vendor/phpunit/phpunit/src/TextUI/Output/TestDox/ResultPrinter.php deleted file mode 100644 index e063b90..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Output/TestDox/ResultPrinter.php +++ /dev/null @@ -1,366 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI\Output\TestDox; - -use const PHP_EOL; -use function array_map; -use function assert; -use function explode; -use function implode; -use function preg_match; -use function preg_split; -use function rtrim; -use function str_starts_with; -use function trim; -use PHPUnit\Event\Code\Throwable; -use PHPUnit\Framework\TestStatus\TestStatus; -use PHPUnit\Logging\TestDox\TestResult as TestDoxTestResult; -use PHPUnit\Logging\TestDox\TestResultCollection; -use PHPUnit\TextUI\Output\Printer; -use PHPUnit\Util\Color; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ResultPrinter -{ - private readonly Printer $printer; - private readonly bool $colors; - - public function __construct(Printer $printer, bool $colors) - { - $this->printer = $printer; - $this->colors = $colors; - } - - /** - * @psalm-param array $tests - */ - public function print(array $tests): void - { - foreach ($tests as $prettifiedClassName => $_tests) { - $this->printPrettifiedClassName($prettifiedClassName); - - foreach ($_tests as $test) { - $this->printTestResult($test); - } - - $this->printer->print(PHP_EOL); - } - } - - /** - * @psalm-param string $prettifiedClassName - */ - private function printPrettifiedClassName(string $prettifiedClassName): void - { - $buffer = $prettifiedClassName; - - if ($this->colors) { - $buffer = Color::colorizeTextBox('underlined', $buffer); - } - - $this->printer->print($buffer . PHP_EOL); - } - - private function printTestResult(TestDoxTestResult $test): void - { - $this->printTestResultHeader($test); - $this->printTestResultBody($test); - } - - private function printTestResultHeader(TestDoxTestResult $test): void - { - $buffer = ' ' . $this->symbolFor($test->status()) . ' '; - - if ($this->colors) { - $this->printer->print( - Color::colorizeTextBox( - $this->colorFor($test->status()), - $buffer, - ), - ); - } else { - $this->printer->print($buffer); - } - - $this->printer->print($test->test()->testDox()->prettifiedMethodName($this->colors) . PHP_EOL); - } - - private function printTestResultBody(TestDoxTestResult $test): void - { - if ($test->status()->isSuccess()) { - return; - } - - if (!$test->hasThrowable()) { - return; - } - - $this->printTestResultBodyStart($test); - $this->printThrowable($test); - $this->printTestResultBodyEnd($test); - } - - private function printTestResultBodyStart(TestDoxTestResult $test): void - { - $this->printer->print( - $this->prefixLines( - $this->prefixFor('start', $test->status()), - '', - ), - ); - - $this->printer->print(PHP_EOL); - } - - private function printTestResultBodyEnd(TestDoxTestResult $test): void - { - $this->printer->print(PHP_EOL); - - $this->printer->print( - $this->prefixLines( - $this->prefixFor('last', $test->status()), - '', - ), - ); - - $this->printer->print(PHP_EOL); - } - - private function printThrowable(TestDoxTestResult $test): void - { - $throwable = $test->throwable(); - - assert($throwable instanceof Throwable); - - $message = trim($throwable->description()); - $stackTrace = $this->formatStackTrace($throwable->stackTrace()); - $diff = ''; - - if (!empty($message) && $this->colors) { - ['message' => $message, 'diff' => $diff] = $this->colorizeMessageAndDiff( - $message, - $this->messageColorFor($test->status()), - ); - } - - if (!empty($message)) { - $this->printer->print( - $this->prefixLines( - $this->prefixFor('message', $test->status()), - $message, - ), - ); - - $this->printer->print(PHP_EOL); - } - - if (!empty($diff)) { - $this->printer->print( - $this->prefixLines( - $this->prefixFor('diff', $test->status()), - $diff, - ), - ); - - $this->printer->print(PHP_EOL); - } - - if (!empty($stackTrace)) { - if (!empty($message) || !empty($diff)) { - $prefix = $this->prefixFor('default', $test->status()); - } else { - $prefix = $this->prefixFor('trace', $test->status()); - } - - $this->printer->print( - $this->prefixLines($prefix, PHP_EOL . $stackTrace), - ); - } - } - - /** - * @psalm-return array{message: string, diff: string} - */ - private function colorizeMessageAndDiff(string $buffer, string $style): array - { - $lines = $buffer ? array_map('\rtrim', explode(PHP_EOL, $buffer)) : []; - $message = []; - $diff = []; - $insideDiff = false; - - foreach ($lines as $line) { - if ($line === '--- Expected') { - $insideDiff = true; - } - - if (!$insideDiff) { - $message[] = $line; - } else { - if (str_starts_with($line, '-')) { - $line = Color::colorize('fg-red', Color::visualizeWhitespace($line, true)); - } elseif (str_starts_with($line, '+')) { - $line = Color::colorize('fg-green', Color::visualizeWhitespace($line, true)); - } elseif ($line === '@@ @@') { - $line = Color::colorize('fg-cyan', $line); - } - - $diff[] = $line; - } - } - - $message = implode(PHP_EOL, $message); - $diff = implode(PHP_EOL, $diff); - - if (!empty($message)) { - $message = Color::colorizeTextBox($style, $message); - } - - return [ - 'message' => $message, - 'diff' => $diff, - ]; - } - - private function formatStackTrace(string $stackTrace): string - { - if (!$this->colors) { - return rtrim($stackTrace); - } - - $lines = []; - $previousPath = ''; - - foreach (explode(PHP_EOL, $stackTrace) as $line) { - if (preg_match('/^(.*):(\d+)$/', $line, $matches)) { - $lines[] = Color::colorizePath($matches[1], $previousPath) . Color::dim(':') . Color::colorize('fg-blue', $matches[2]) . "\n"; - $previousPath = $matches[1]; - - continue; - } - - $lines[] = $line; - $previousPath = ''; - } - - return rtrim(implode('', $lines)); - } - - private function prefixLines(string $prefix, string $message): string - { - return implode( - PHP_EOL, - array_map( - static fn (string $line) => ' ' . $prefix . ($line ? ' ' . $line : ''), - preg_split('/\r\n|\r|\n/', $message), - ), - ); - } - - /** - * @psalm-param 'default'|'start'|'message'|'diff'|'trace'|'last' $type - */ - private function prefixFor(string $type, TestStatus $status): string - { - if (!$this->colors) { - return '│'; - } - - return Color::colorize( - $this->colorFor($status), - match ($type) { - 'default' => '│', - 'start' => '┐', - 'message' => '├', - 'diff' => '┊', - 'trace' => '╵', - 'last' => '┴', - }, - ); - } - - private function colorFor(TestStatus $status): string - { - if ($status->isSuccess()) { - return 'fg-green'; - } - - if ($status->isError()) { - return 'fg-yellow'; - } - - if ($status->isFailure()) { - return 'fg-red'; - } - - if ($status->isSkipped()) { - return 'fg-cyan'; - } - - if ($status->isIncomplete() || $status->isDeprecation() || $status->isNotice() || $status->isRisky() || $status->isWarning()) { - return 'fg-yellow'; - } - - return 'fg-blue'; - } - - private function messageColorFor(TestStatus $status): string - { - if ($status->isSuccess()) { - return ''; - } - - if ($status->isError()) { - return 'bg-yellow,fg-black'; - } - - if ($status->isFailure()) { - return 'bg-red,fg-white'; - } - - if ($status->isSkipped()) { - return 'fg-cyan'; - } - - if ($status->isIncomplete() || $status->isDeprecation() || $status->isNotice() || $status->isRisky() || $status->isWarning()) { - return 'fg-yellow'; - } - - return 'fg-white,bg-blue'; - } - - private function symbolFor(TestStatus $status): string - { - if ($status->isSuccess()) { - return '✔'; - } - - if ($status->isError() || $status->isFailure()) { - return '✘'; - } - - if ($status->isSkipped()) { - return '↩'; - } - - if ($status->isDeprecation() || $status->isNotice() || $status->isRisky() || $status->isWarning()) { - return '⚠'; - } - - if ($status->isIncomplete()) { - return '∅'; - } - - return '?'; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/ShellExitCodeCalculator.php b/vendor/phpunit/phpunit/src/TextUI/ShellExitCodeCalculator.php deleted file mode 100644 index ea80d16..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/ShellExitCodeCalculator.php +++ /dev/null @@ -1,170 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI; - -use PHPUnit\TestRunner\TestResult\TestResult; -use PHPUnit\TextUI\Configuration\Configuration; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ShellExitCodeCalculator -{ - private const SUCCESS_EXIT = 0; - private const FAILURE_EXIT = 1; - private const EXCEPTION_EXIT = 2; - - public function calculate(Configuration $configuration, TestResult $result): int - { - $failOnDeprecation = false; - $failOnPhpunitDeprecation = false; - $failOnPhpunitWarning = false; - $failOnEmptyTestSuite = false; - $failOnIncomplete = false; - $failOnNotice = false; - $failOnRisky = false; - $failOnSkipped = false; - $failOnWarning = false; - - if ($configuration->failOnAllIssues()) { - $failOnDeprecation = true; - $failOnPhpunitDeprecation = true; - $failOnPhpunitWarning = true; - $failOnEmptyTestSuite = true; - $failOnIncomplete = true; - $failOnNotice = true; - $failOnRisky = true; - $failOnSkipped = true; - $failOnWarning = true; - } - - if ($configuration->failOnDeprecation()) { - $failOnDeprecation = true; - } - - if ($configuration->doNotFailOnDeprecation()) { - $failOnDeprecation = false; - } - - if ($configuration->failOnPhpunitDeprecation()) { - $failOnPhpunitDeprecation = true; - } - - if ($configuration->doNotFailOnPhpunitDeprecation()) { - $failOnPhpunitDeprecation = false; - } - - if ($configuration->failOnPhpunitWarning()) { - $failOnPhpunitWarning = true; - } - - if ($configuration->doNotFailOnPhpunitWarning()) { - $failOnPhpunitWarning = false; - } - - if ($configuration->failOnEmptyTestSuite()) { - $failOnEmptyTestSuite = true; - } - - if ($configuration->doNotFailOnEmptyTestSuite()) { - $failOnEmptyTestSuite = false; - } - - if ($configuration->failOnIncomplete()) { - $failOnIncomplete = true; - } - - if ($configuration->doNotFailOnIncomplete()) { - $failOnIncomplete = false; - } - - if ($configuration->failOnNotice()) { - $failOnNotice = true; - } - - if ($configuration->doNotFailOnNotice()) { - $failOnNotice = false; - } - - if ($configuration->failOnRisky()) { - $failOnRisky = true; - } - - if ($configuration->doNotFailOnRisky()) { - $failOnRisky = false; - } - - if ($configuration->failOnSkipped()) { - $failOnSkipped = true; - } - - if ($configuration->doNotFailOnSkipped()) { - $failOnSkipped = false; - } - - if ($configuration->failOnWarning()) { - $failOnWarning = true; - } - - if ($configuration->doNotFailOnWarning()) { - $failOnWarning = false; - } - - $returnCode = self::FAILURE_EXIT; - - if ($result->wasSuccessful()) { - $returnCode = self::SUCCESS_EXIT; - } - - if ($failOnEmptyTestSuite && !$result->hasTests()) { - $returnCode = self::FAILURE_EXIT; - } - - if ($failOnDeprecation && $result->hasPhpOrUserDeprecations()) { - $returnCode = self::FAILURE_EXIT; - } - - if ($failOnPhpunitDeprecation && $result->hasPhpunitDeprecations()) { - $returnCode = self::FAILURE_EXIT; - } - - if ($failOnPhpunitWarning && $result->hasPhpunitWarnings()) { - $returnCode = self::FAILURE_EXIT; - } - - if ($failOnIncomplete && $result->hasIncompleteTests()) { - $returnCode = self::FAILURE_EXIT; - } - - if ($failOnNotice && $result->hasNotices()) { - $returnCode = self::FAILURE_EXIT; - } - - if ($failOnRisky && $result->hasRiskyTests()) { - $returnCode = self::FAILURE_EXIT; - } - - if ($failOnSkipped && $result->hasSkippedTests()) { - $returnCode = self::FAILURE_EXIT; - } - - if ($failOnWarning && $result->hasWarnings()) { - $returnCode = self::FAILURE_EXIT; - } - - if ($result->hasErrors()) { - $returnCode = self::EXCEPTION_EXIT; - } - - return $returnCode; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/TestRunner.php b/vendor/phpunit/phpunit/src/TextUI/TestRunner.php deleted file mode 100644 index 2363ca2..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/TestRunner.php +++ /dev/null @@ -1,76 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI; - -use function mt_srand; -use PHPUnit\Event; -use PHPUnit\Framework\TestSuite; -use PHPUnit\Runner\ResultCache\ResultCache; -use PHPUnit\Runner\TestSuiteSorter; -use PHPUnit\TextUI\Configuration\Configuration; -use Throwable; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestRunner -{ - /** - * @throws RuntimeException - */ - public function run(Configuration $configuration, ResultCache $resultCache, TestSuite $suite): void - { - try { - Event\Facade::emitter()->testRunnerStarted(); - - if ($configuration->executionOrder() === TestSuiteSorter::ORDER_RANDOMIZED) { - mt_srand($configuration->randomOrderSeed()); - } - - if ($configuration->executionOrder() !== TestSuiteSorter::ORDER_DEFAULT || - $configuration->executionOrderDefects() !== TestSuiteSorter::ORDER_DEFAULT || - $configuration->resolveDependencies()) { - $resultCache->load(); - - (new TestSuiteSorter($resultCache))->reorderTestsInSuite( - $suite, - $configuration->executionOrder(), - $configuration->resolveDependencies(), - $configuration->executionOrderDefects(), - ); - - Event\Facade::emitter()->testSuiteSorted( - $configuration->executionOrder(), - $configuration->executionOrderDefects(), - $configuration->resolveDependencies(), - ); - } - - (new TestSuiteFilterProcessor)->process($configuration, $suite); - - Event\Facade::emitter()->testRunnerExecutionStarted( - Event\TestSuite\TestSuiteBuilder::from($suite), - ); - - $suite->run(); - - Event\Facade::emitter()->testRunnerExecutionFinished(); - Event\Facade::emitter()->testRunnerFinished(); - } catch (Throwable $t) { - throw new RuntimeException( - $t->getMessage(), - (int) $t->getCode(), - $t, - ); - } - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/TestSuiteFilterProcessor.php b/vendor/phpunit/phpunit/src/TextUI/TestSuiteFilterProcessor.php deleted file mode 100644 index 63ba1b3..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/TestSuiteFilterProcessor.php +++ /dev/null @@ -1,84 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI; - -use function array_map; -use PHPUnit\Event; -use PHPUnit\Framework\TestSuite; -use PHPUnit\Runner\Filter\Factory; -use PHPUnit\TextUI\Configuration\Configuration; -use PHPUnit\TextUI\Configuration\FilterNotConfiguredException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestSuiteFilterProcessor -{ - /** - * @throws Event\RuntimeException - * @throws FilterNotConfiguredException - */ - public function process(Configuration $configuration, TestSuite $suite): void - { - $factory = new Factory; - - if (!$configuration->hasFilter() && - !$configuration->hasGroups() && - !$configuration->hasExcludeGroups() && - !$configuration->hasTestsCovering() && - !$configuration->hasTestsUsing()) { - return; - } - - if ($configuration->hasExcludeGroups()) { - $factory->addExcludeGroupFilter( - $configuration->excludeGroups(), - ); - } - - if ($configuration->hasGroups()) { - $factory->addIncludeGroupFilter( - $configuration->groups(), - ); - } - - if ($configuration->hasTestsCovering()) { - $factory->addIncludeGroupFilter( - array_map( - static fn (string $name): string => '__phpunit_covers_' . $name, - $configuration->testsCovering(), - ), - ); - } - - if ($configuration->hasTestsUsing()) { - $factory->addIncludeGroupFilter( - array_map( - static fn (string $name): string => '__phpunit_uses_' . $name, - $configuration->testsUsing(), - ), - ); - } - - if ($configuration->hasFilter()) { - $factory->addNameFilter( - $configuration->filter(), - ); - } - - $suite->injectFilter($factory); - - Event\Facade::emitter()->testSuiteFiltered( - Event\TestSuite\TestSuiteBuilder::from($suite), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Util/Cloner.php b/vendor/phpunit/phpunit/src/Util/Cloner.php deleted file mode 100644 index 7e3e5aa..0000000 --- a/vendor/phpunit/phpunit/src/Util/Cloner.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util; - -use Throwable; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Cloner -{ - /** - * @psalm-template OriginalType of object - * - * @psalm-param OriginalType $original - * - * @psalm-return OriginalType - */ - public static function clone(object $original): object - { - try { - return clone $original; - } catch (Throwable) { - return $original; - } - } -} diff --git a/vendor/phpunit/phpunit/src/Util/Color.php b/vendor/phpunit/phpunit/src/Util/Color.php deleted file mode 100644 index 0e3642c..0000000 --- a/vendor/phpunit/phpunit/src/Util/Color.php +++ /dev/null @@ -1,181 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util; - -use const DIRECTORY_SEPARATOR; -use const PHP_EOL; -use function array_map; -use function count; -use function explode; -use function implode; -use function max; -use function min; -use function preg_replace; -use function preg_replace_callback; -use function preg_split; -use function sprintf; -use function str_pad; -use function strtr; -use function trim; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Color -{ - /** - * @psalm-var array - */ - private const WHITESPACE_MAP = [ - ' ' => '·', - "\t" => '⇥', - ]; - - /** - * @psalm-var array - */ - private const WHITESPACE_EOL_MAP = [ - ' ' => '·', - "\t" => '⇥', - "\n" => '↵', - "\r" => '⟵', - ]; - - /** - * @psalm-var array - */ - private static array $ansiCodes = [ - 'reset' => '0', - 'bold' => '1', - 'dim' => '2', - 'dim-reset' => '22', - 'underlined' => '4', - 'fg-default' => '39', - 'fg-black' => '30', - 'fg-red' => '31', - 'fg-green' => '32', - 'fg-yellow' => '33', - 'fg-blue' => '34', - 'fg-magenta' => '35', - 'fg-cyan' => '36', - 'fg-white' => '37', - 'bg-default' => '49', - 'bg-black' => '40', - 'bg-red' => '41', - 'bg-green' => '42', - 'bg-yellow' => '43', - 'bg-blue' => '44', - 'bg-magenta' => '45', - 'bg-cyan' => '46', - 'bg-white' => '47', - ]; - - public static function colorize(string $color, string $buffer): string - { - if (trim($buffer) === '') { - return $buffer; - } - - $codes = array_map('\trim', explode(',', $color)); - $styles = []; - - foreach ($codes as $code) { - if (isset(self::$ansiCodes[$code])) { - $styles[] = self::$ansiCodes[$code] ?? ''; - } - } - - if (empty($styles)) { - return $buffer; - } - - return self::optimizeColor(sprintf("\x1b[%sm", implode(';', $styles)) . $buffer . "\x1b[0m"); - } - - public static function colorizeTextBox(string $color, string $buffer): string - { - $lines = preg_split('/\r\n|\r|\n/', $buffer); - $padding = max(array_map('\strlen', $lines)); - - $styledLines = []; - - foreach ($lines as $line) { - $styledLines[] = self::colorize($color, str_pad($line, $padding)); - } - - return implode(PHP_EOL, $styledLines); - } - - public static function colorizePath(string $path, ?string $previousPath = null, bool $colorizeFilename = false): string - { - if ($previousPath === null) { - $previousPath = ''; - } - - $path = explode(DIRECTORY_SEPARATOR, $path); - $previousPath = explode(DIRECTORY_SEPARATOR, $previousPath); - - for ($i = 0; $i < min(count($path), count($previousPath)); $i++) { - if ($path[$i] === $previousPath[$i]) { - $path[$i] = self::dim($path[$i]); - } - } - - if ($colorizeFilename) { - $last = count($path) - 1; - $path[$last] = preg_replace_callback( - '/([\-_.]+|phpt$)/', - static fn ($matches) => self::dim($matches[0]), - $path[$last], - ); - } - - return self::optimizeColor(implode(self::dim(DIRECTORY_SEPARATOR), $path)); - } - - public static function dim(string $buffer): string - { - if (trim($buffer) === '') { - return $buffer; - } - - return "\e[2m{$buffer}\e[22m"; - } - - public static function visualizeWhitespace(string $buffer, bool $visualizeEOL = false): string - { - $replaceMap = $visualizeEOL ? self::WHITESPACE_EOL_MAP : self::WHITESPACE_MAP; - - return preg_replace_callback( - '/\s+/', - static fn ($matches) => self::dim(strtr($matches[0], $replaceMap)), - $buffer, - ); - } - - private static function optimizeColor(string $buffer): string - { - return preg_replace( - [ - "/\e\\[22m\e\\[2m/", - "/\e\\[([^m]*)m\e\\[([1-9][0-9;]*)m/", - "/(\e\\[[^m]*m)+(\e\\[0m)/", - ], - [ - '', - "\e[$1;$2m", - '$2', - ], - $buffer, - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Util/Exception/Exception.php b/vendor/phpunit/phpunit/src/Util/Exception/Exception.php deleted file mode 100644 index 58f42db..0000000 --- a/vendor/phpunit/phpunit/src/Util/Exception/Exception.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util; - -use Throwable; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This interface is not covered by the backward compatibility promise for PHPUnit - */ -interface Exception extends Throwable -{ -} diff --git a/vendor/phpunit/phpunit/src/Util/Exception/InvalidDirectoryException.php b/vendor/phpunit/phpunit/src/Util/Exception/InvalidDirectoryException.php deleted file mode 100644 index 623af2d..0000000 --- a/vendor/phpunit/phpunit/src/Util/Exception/InvalidDirectoryException.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util; - -use function sprintf; -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class InvalidDirectoryException extends RuntimeException implements Exception -{ - public function __construct(string $directory) - { - parent::__construct( - sprintf( - '"%s" is not a directory', - $directory, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Util/Exception/InvalidJsonException.php b/vendor/phpunit/phpunit/src/Util/Exception/InvalidJsonException.php deleted file mode 100644 index 224f711..0000000 --- a/vendor/phpunit/phpunit/src/Util/Exception/InvalidJsonException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util; - -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class InvalidJsonException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Util/Exception/InvalidVersionOperatorException.php b/vendor/phpunit/phpunit/src/Util/Exception/InvalidVersionOperatorException.php deleted file mode 100644 index bc2fe9a..0000000 --- a/vendor/phpunit/phpunit/src/Util/Exception/InvalidVersionOperatorException.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util; - -use function sprintf; -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class InvalidVersionOperatorException extends RuntimeException implements Exception -{ - public function __construct(string $operator) - { - parent::__construct( - sprintf( - '"%s" is not a valid version_compare() operator', - $operator, - ), - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Util/Exception/PhpProcessException.php b/vendor/phpunit/phpunit/src/Util/Exception/PhpProcessException.php deleted file mode 100644 index 05069ef..0000000 --- a/vendor/phpunit/phpunit/src/Util/Exception/PhpProcessException.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util\PHP; - -use PHPUnit\Util\Exception; -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class PhpProcessException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Util/Exception/XmlException.php b/vendor/phpunit/phpunit/src/Util/Exception/XmlException.php deleted file mode 100644 index 127e1ec..0000000 --- a/vendor/phpunit/phpunit/src/Util/Exception/XmlException.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util\Xml; - -use PHPUnit\Util\Exception; -use RuntimeException; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class XmlException extends RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Util/ExcludeList.php b/vendor/phpunit/phpunit/src/Util/ExcludeList.php deleted file mode 100644 index 88e80ba..0000000 --- a/vendor/phpunit/phpunit/src/Util/ExcludeList.php +++ /dev/null @@ -1,231 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util; - -use const PHP_OS_FAMILY; -use function class_exists; -use function defined; -use function dirname; -use function is_dir; -use function realpath; -use function str_starts_with; -use function sys_get_temp_dir; -use Composer\Autoload\ClassLoader; -use DeepCopy\DeepCopy; -use PharIo\Manifest\Manifest; -use PharIo\Version\Version as PharIoVersion; -use PhpParser\Parser; -use PHPUnit\Framework\TestCase; -use ReflectionClass; -use SebastianBergmann\CliParser\Parser as CliParser; -use SebastianBergmann\CodeCoverage\CodeCoverage; -use SebastianBergmann\CodeUnit\CodeUnit; -use SebastianBergmann\CodeUnitReverseLookup\Wizard; -use SebastianBergmann\Comparator\Comparator; -use SebastianBergmann\Complexity\Calculator; -use SebastianBergmann\Diff\Diff; -use SebastianBergmann\Environment\Runtime; -use SebastianBergmann\Exporter\Exporter; -use SebastianBergmann\FileIterator\Facade as FileIteratorFacade; -use SebastianBergmann\GlobalState\Snapshot; -use SebastianBergmann\Invoker\Invoker; -use SebastianBergmann\LinesOfCode\Counter; -use SebastianBergmann\ObjectEnumerator\Enumerator; -use SebastianBergmann\ObjectReflector\ObjectReflector; -use SebastianBergmann\RecursionContext\Context; -use SebastianBergmann\Template\Template; -use SebastianBergmann\Timer\Timer; -use SebastianBergmann\Type\TypeName; -use SebastianBergmann\Version; -use TheSeer\Tokenizer\Tokenizer; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - */ -final class ExcludeList -{ - /** - * @psalm-var array - */ - private const EXCLUDED_CLASS_NAMES = [ - // composer - ClassLoader::class => 1, - - // myclabs/deepcopy - DeepCopy::class => 1, - - // nikic/php-parser - Parser::class => 1, - - // phar-io/manifest - Manifest::class => 1, - - // phar-io/version - PharIoVersion::class => 1, - - // phpunit/phpunit - TestCase::class => 2, - - // phpunit/php-code-coverage - CodeCoverage::class => 1, - - // phpunit/php-file-iterator - FileIteratorFacade::class => 1, - - // phpunit/php-invoker - Invoker::class => 1, - - // phpunit/php-text-template - Template::class => 1, - - // phpunit/php-timer - Timer::class => 1, - - // sebastian/cli-parser - CliParser::class => 1, - - // sebastian/code-unit - CodeUnit::class => 1, - - // sebastian/code-unit-reverse-lookup - Wizard::class => 1, - - // sebastian/comparator - Comparator::class => 1, - - // sebastian/complexity - Calculator::class => 1, - - // sebastian/diff - Diff::class => 1, - - // sebastian/environment - Runtime::class => 1, - - // sebastian/exporter - Exporter::class => 1, - - // sebastian/global-state - Snapshot::class => 1, - - // sebastian/lines-of-code - Counter::class => 1, - - // sebastian/object-enumerator - Enumerator::class => 1, - - // sebastian/object-reflector - ObjectReflector::class => 1, - - // sebastian/recursion-context - Context::class => 1, - - // sebastian/type - TypeName::class => 1, - - // sebastian/version - Version::class => 1, - - // theseer/tokenizer - Tokenizer::class => 1, - ]; - - /** - * @psalm-var list - */ - private static array $directories = []; - private static bool $initialized = false; - private readonly bool $enabled; - - /** - * @psalm-param non-empty-string $directory - * - * @throws InvalidDirectoryException - */ - public static function addDirectory(string $directory): void - { - if (!is_dir($directory)) { - throw new InvalidDirectoryException($directory); - } - - self::$directories[] = realpath($directory); - } - - public function __construct(?bool $enabled = null) - { - if ($enabled === null) { - $enabled = !defined('PHPUNIT_TESTSUITE'); - } - - $this->enabled = $enabled; - } - - /** - * @psalm-return list - */ - public function getExcludedDirectories(): array - { - self::initialize(); - - return self::$directories; - } - - public function isExcluded(string $file): bool - { - if (!$this->enabled) { - return false; - } - - self::initialize(); - - foreach (self::$directories as $directory) { - if (str_starts_with($file, $directory)) { - return true; - } - } - - return false; - } - - private static function initialize(): void - { - if (self::$initialized) { - return; - } - - foreach (self::EXCLUDED_CLASS_NAMES as $className => $parent) { - if (!class_exists($className)) { - continue; - } - - $directory = (new ReflectionClass($className))->getFileName(); - - for ($i = 0; $i < $parent; $i++) { - $directory = dirname($directory); - } - - self::$directories[] = $directory; - } - - /** - * Hide process isolation workaround on Windows: - * tempnam() prefix is limited to first 3 characters. - * - * @see https://php.net/manual/en/function.tempnam.php - */ - if (PHP_OS_FAMILY === 'Windows') { - // @codeCoverageIgnoreStart - self::$directories[] = sys_get_temp_dir() . '\\PHP'; - // @codeCoverageIgnoreEnd - } - - self::$initialized = true; - } -} diff --git a/vendor/phpunit/phpunit/src/Util/Exporter.php b/vendor/phpunit/phpunit/src/Util/Exporter.php deleted file mode 100644 index 20cf6f4..0000000 --- a/vendor/phpunit/phpunit/src/Util/Exporter.php +++ /dev/null @@ -1,63 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util; - -use function is_array; -use function is_scalar; -use SebastianBergmann\RecursionContext\Context; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @deprecated - */ -final class Exporter -{ - public static function export(mixed $value, bool $exportObjects = false): string - { - if (self::isExportable($value) || $exportObjects) { - return (new \SebastianBergmann\Exporter\Exporter)->export($value); - } - - return '{enable export of objects to see this value}'; - } - - private static function isExportable(mixed &$value, ?Context $context = null): bool - { - if (is_scalar($value) || $value === null) { - return true; - } - - if (!is_array($value)) { - return false; - } - - if (!$context) { - $context = new Context; - } - - if ($context->contains($value) !== false) { - return true; - } - - $array = $value; - $context->add($value); - - foreach ($array as &$_value) { - if (!self::isExportable($_value, $context)) { - return false; - } - } - - return true; - } -} diff --git a/vendor/phpunit/phpunit/src/Util/Filesystem.php b/vendor/phpunit/phpunit/src/Util/Filesystem.php deleted file mode 100644 index 948ee28..0000000 --- a/vendor/phpunit/phpunit/src/Util/Filesystem.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util; - -use const DIRECTORY_SEPARATOR; -use function basename; -use function dirname; -use function is_dir; -use function mkdir; -use function realpath; -use function str_starts_with; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Filesystem -{ - public static function createDirectory(string $directory): bool - { - return !(!is_dir($directory) && !@mkdir($directory, 0o777, true) && !is_dir($directory)); - } - - /** - * @psalm-param non-empty-string $path - * - * @return false|non-empty-string - */ - public static function resolveStreamOrFile(string $path): false|string - { - if (str_starts_with($path, 'php://') || str_starts_with($path, 'socket://')) { - return $path; - } - - $directory = dirname($path); - - if (is_dir($directory)) { - return realpath($directory) . DIRECTORY_SEPARATOR . basename($path); - } - - return false; - } -} diff --git a/vendor/phpunit/phpunit/src/Util/Filter.php b/vendor/phpunit/phpunit/src/Util/Filter.php deleted file mode 100644 index 424e35a..0000000 --- a/vendor/phpunit/phpunit/src/Util/Filter.php +++ /dev/null @@ -1,117 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util; - -use function array_unshift; -use function defined; -use function in_array; -use function is_file; -use function realpath; -use function sprintf; -use function str_starts_with; -use PHPUnit\Framework\Exception; -use PHPUnit\Framework\PhptAssertionFailedError; -use Throwable; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Filter -{ - /** - * @throws Exception - */ - public static function getFilteredStacktrace(Throwable $t, bool $unwrap = true): string - { - $filteredStacktrace = ''; - - if ($t instanceof PhptAssertionFailedError) { - $eTrace = $t->syntheticTrace(); - $eFile = $t->syntheticFile(); - $eLine = $t->syntheticLine(); - } elseif ($t instanceof Exception) { - $eTrace = $t->getSerializableTrace(); - $eFile = $t->getFile(); - $eLine = $t->getLine(); - } else { - if ($unwrap && $t->getPrevious()) { - $t = $t->getPrevious(); - } - - $eTrace = $t->getTrace(); - $eFile = $t->getFile(); - $eLine = $t->getLine(); - } - - if (!self::frameExists($eTrace, $eFile, $eLine)) { - array_unshift( - $eTrace, - ['file' => $eFile, 'line' => $eLine], - ); - } - - $prefix = defined('__PHPUNIT_PHAR_ROOT__') ? __PHPUNIT_PHAR_ROOT__ : false; - $excludeList = new ExcludeList; - - foreach ($eTrace as $frame) { - if (self::shouldPrintFrame($frame, $prefix, $excludeList)) { - $filteredStacktrace .= sprintf( - "%s:%s\n", - $frame['file'], - $frame['line'] ?? '?', - ); - } - } - - return $filteredStacktrace; - } - - private static function shouldPrintFrame(array $frame, false|string $prefix, ExcludeList $excludeList): bool - { - if (!isset($frame['file'])) { - return false; - } - - $file = $frame['file']; - $fileIsNotPrefixed = $prefix === false || !str_starts_with($file, $prefix); - - // @see https://github.com/sebastianbergmann/phpunit/issues/4033 - if (isset($GLOBALS['_SERVER']['SCRIPT_NAME'])) { - $script = realpath($GLOBALS['_SERVER']['SCRIPT_NAME']); - } else { - $script = ''; - } - - return $fileIsNotPrefixed && - $file !== $script && - self::fileIsExcluded($file, $excludeList) && - is_file($file); - } - - private static function fileIsExcluded(string $file, ExcludeList $excludeList): bool - { - return (empty($GLOBALS['__PHPUNIT_ISOLATION_EXCLUDE_LIST']) || - !in_array($file, $GLOBALS['__PHPUNIT_ISOLATION_EXCLUDE_LIST'], true)) && - !$excludeList->isExcluded($file); - } - - private static function frameExists(array $trace, string $file, int $line): bool - { - foreach ($trace as $frame) { - if (isset($frame['file'], $frame['line']) && $frame['file'] === $file && $frame['line'] === $line) { - return true; - } - } - - return false; - } -} diff --git a/vendor/phpunit/phpunit/src/Util/GlobalState.php b/vendor/phpunit/phpunit/src/Util/GlobalState.php deleted file mode 100644 index 9918409..0000000 --- a/vendor/phpunit/phpunit/src/Util/GlobalState.php +++ /dev/null @@ -1,325 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util; - -use const PHP_MAJOR_VERSION; -use const PHP_MINOR_VERSION; -use function array_keys; -use function array_reverse; -use function array_shift; -use function defined; -use function get_defined_constants; -use function get_included_files; -use function in_array; -use function ini_get_all; -use function is_array; -use function is_file; -use function is_scalar; -use function preg_match; -use function serialize; -use function sprintf; -use function str_ends_with; -use function str_starts_with; -use function strtr; -use function var_export; -use Closure; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class GlobalState -{ - /** - * @psalm-var list - */ - private const SUPER_GLOBAL_ARRAYS = [ - '_ENV', - '_POST', - '_GET', - '_COOKIE', - '_SERVER', - '_FILES', - '_REQUEST', - ]; - - /** - * @psalm-var array> - */ - private const DEPRECATED_INI_SETTINGS = [ - '7.3' => [ - 'iconv.input_encoding' => true, - 'iconv.output_encoding' => true, - 'iconv.internal_encoding' => true, - 'mbstring.func_overload' => true, - 'mbstring.http_input' => true, - 'mbstring.http_output' => true, - 'mbstring.internal_encoding' => true, - 'string.strip_tags' => true, - ], - - '7.4' => [ - 'iconv.input_encoding' => true, - 'iconv.output_encoding' => true, - 'iconv.internal_encoding' => true, - 'mbstring.func_overload' => true, - 'mbstring.http_input' => true, - 'mbstring.http_output' => true, - 'mbstring.internal_encoding' => true, - 'pdo_odbc.db2_instance_name' => true, - 'string.strip_tags' => true, - ], - - '8.0' => [ - 'iconv.input_encoding' => true, - 'iconv.output_encoding' => true, - 'iconv.internal_encoding' => true, - 'mbstring.http_input' => true, - 'mbstring.http_output' => true, - 'mbstring.internal_encoding' => true, - ], - - '8.1' => [ - 'auto_detect_line_endings' => true, - 'filter.default' => true, - 'iconv.input_encoding' => true, - 'iconv.output_encoding' => true, - 'iconv.internal_encoding' => true, - 'mbstring.http_input' => true, - 'mbstring.http_output' => true, - 'mbstring.internal_encoding' => true, - 'oci8.old_oci_close_semantics' => true, - ], - - '8.2' => [ - 'auto_detect_line_endings' => true, - 'filter.default' => true, - 'iconv.input_encoding' => true, - 'iconv.output_encoding' => true, - 'iconv.internal_encoding' => true, - 'mbstring.http_input' => true, - 'mbstring.http_output' => true, - 'mbstring.internal_encoding' => true, - 'oci8.old_oci_close_semantics' => true, - ], - - '8.3' => [ - 'auto_detect_line_endings' => true, - 'filter.default' => true, - 'iconv.input_encoding' => true, - 'iconv.output_encoding' => true, - 'iconv.internal_encoding' => true, - 'mbstring.http_input' => true, - 'mbstring.http_output' => true, - 'mbstring.internal_encoding' => true, - 'oci8.old_oci_close_semantics' => true, - ], - - '8.4' => [ - 'auto_detect_line_endings' => true, - 'filter.default' => true, - 'iconv.input_encoding' => true, - 'iconv.output_encoding' => true, - 'iconv.internal_encoding' => true, - 'mbstring.http_input' => true, - 'mbstring.http_output' => true, - 'mbstring.internal_encoding' => true, - 'oci8.old_oci_close_semantics' => true, - ], - - '8.5' => [ - 'auto_detect_line_endings' => true, - 'filter.default' => true, - 'iconv.input_encoding' => true, - 'iconv.output_encoding' => true, - 'iconv.internal_encoding' => true, - 'mbstring.http_input' => true, - 'mbstring.http_output' => true, - 'mbstring.internal_encoding' => true, - 'oci8.old_oci_close_semantics' => true, - ], - - '8.6' => [ - 'auto_detect_line_endings' => true, - 'filter.default' => true, - 'iconv.input_encoding' => true, - 'iconv.output_encoding' => true, - 'iconv.internal_encoding' => true, - 'mbstring.http_input' => true, - 'mbstring.http_output' => true, - 'mbstring.internal_encoding' => true, - 'oci8.old_oci_close_semantics' => true, - ], - ]; - - /** - * @throws Exception - */ - public static function getIncludedFilesAsString(): string - { - return self::processIncludedFilesAsString(get_included_files()); - } - - /** - * @psalm-param list $files - * - * @throws Exception - */ - public static function processIncludedFilesAsString(array $files): string - { - $excludeList = new ExcludeList; - $prefix = false; - $result = ''; - - if (defined('__PHPUNIT_PHAR__')) { - $prefix = 'phar://' . __PHPUNIT_PHAR__ . '/'; - } - - // Do not process bootstrap script - array_shift($files); - - // If bootstrap script was a Composer bin proxy, skip the second entry as well - if (str_ends_with(strtr($files[0], '\\', '/'), '/phpunit/phpunit/phpunit')) { - array_shift($files); - } - - foreach (array_reverse($files) as $file) { - if (!empty($GLOBALS['__PHPUNIT_ISOLATION_EXCLUDE_LIST']) && - in_array($file, $GLOBALS['__PHPUNIT_ISOLATION_EXCLUDE_LIST'], true)) { - continue; - } - - if ($prefix !== false && str_starts_with($file, $prefix)) { - continue; - } - - // Skip virtual file system protocols - if (preg_match('/^(vfs|phpvfs[a-z0-9]+):/', $file)) { - continue; - } - - if (!$excludeList->isExcluded($file) && is_file($file)) { - $result = 'require_once \'' . $file . "';\n" . $result; - } - } - - return $result; - } - - public static function getIniSettingsAsString(): string - { - $result = ''; - - foreach (ini_get_all(null, false) as $key => $value) { - if (self::isIniSettingDeprecated($key)) { - continue; - } - - $result .= sprintf( - '@ini_set(%s, %s);' . "\n", - self::exportVariable($key), - self::exportVariable((string) $value), - ); - } - - return $result; - } - - public static function getConstantsAsString(): string - { - $constants = get_defined_constants(true); - $result = ''; - - if (isset($constants['user'])) { - foreach ($constants['user'] as $name => $value) { - $result .= sprintf( - 'if (!defined(\'%s\')) define(\'%s\', %s);' . "\n", - $name, - $name, - self::exportVariable($value), - ); - } - } - - return $result; - } - - public static function getGlobalsAsString(): string - { - $result = ''; - - foreach (self::SUPER_GLOBAL_ARRAYS as $superGlobalArray) { - if (isset($GLOBALS[$superGlobalArray]) && is_array($GLOBALS[$superGlobalArray])) { - foreach (array_keys($GLOBALS[$superGlobalArray]) as $key) { - if ($GLOBALS[$superGlobalArray][$key] instanceof Closure) { - continue; - } - - $result .= sprintf( - '$GLOBALS[\'%s\'][\'%s\'] = %s;' . "\n", - $superGlobalArray, - $key, - self::exportVariable($GLOBALS[$superGlobalArray][$key]), - ); - } - } - } - - $excludeList = self::SUPER_GLOBAL_ARRAYS; - $excludeList[] = 'GLOBALS'; - - foreach (array_keys($GLOBALS) as $key) { - if (!$GLOBALS[$key] instanceof Closure && !in_array($key, $excludeList, true)) { - $result .= sprintf( - '$GLOBALS[\'%s\'] = %s;' . "\n", - $key, - self::exportVariable($GLOBALS[$key]), - ); - } - } - - return $result; - } - - private static function exportVariable(mixed $variable): string - { - if (is_scalar($variable) || $variable === null || - (is_array($variable) && self::arrayOnlyContainsScalars($variable))) { - return var_export($variable, true); - } - - return 'unserialize(' . var_export(serialize($variable), true) . ')'; - } - - private static function arrayOnlyContainsScalars(array $array): bool - { - $result = true; - - foreach ($array as $element) { - if (is_array($element)) { - $result = self::arrayOnlyContainsScalars($element); - } elseif (!is_scalar($element) && $element !== null) { - $result = false; - } - - if (!$result) { - break; - } - } - - return $result; - } - - private static function isIniSettingDeprecated(string $iniSetting): bool - { - return isset(self::DEPRECATED_INI_SETTINGS[PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION][$iniSetting]); - } -} diff --git a/vendor/phpunit/phpunit/src/Util/Http/Downloader.php b/vendor/phpunit/phpunit/src/Util/Http/Downloader.php deleted file mode 100644 index 4e8252b..0000000 --- a/vendor/phpunit/phpunit/src/Util/Http/Downloader.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util\Http; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This interface is not covered by the backward compatibility promise for PHPUnit - */ -interface Downloader -{ - /** - * @param non-empty-string $url - */ - public function download(string $url): false|string; -} diff --git a/vendor/phpunit/phpunit/src/Util/Http/PhpDownloader.php b/vendor/phpunit/phpunit/src/Util/Http/PhpDownloader.php deleted file mode 100644 index 5969c04..0000000 --- a/vendor/phpunit/phpunit/src/Util/Http/PhpDownloader.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util\Http; - -use function file_get_contents; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @codeCoverageIgnore - */ -final class PhpDownloader implements Downloader -{ - /** - * @param non-empty-string $url - */ - public function download(string $url): false|string - { - return file_get_contents($url); - } -} diff --git a/vendor/phpunit/phpunit/src/Util/Json.php b/vendor/phpunit/phpunit/src/Util/Json.php deleted file mode 100644 index a9b5e2d..0000000 --- a/vendor/phpunit/phpunit/src/Util/Json.php +++ /dev/null @@ -1,102 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util; - -use const JSON_PRETTY_PRINT; -use const JSON_UNESCAPED_SLASHES; -use const JSON_UNESCAPED_UNICODE; -use const SORT_STRING; -use function is_object; -use function is_scalar; -use function json_decode; -use function json_encode; -use function json_last_error; -use function ksort; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Json -{ - /** - * @throws InvalidJsonException - */ - public static function prettify(string $json): string - { - $decodedJson = json_decode($json, false); - - if (json_last_error()) { - throw new InvalidJsonException; - } - - return json_encode($decodedJson, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); - } - - /** - * To allow comparison of JSON strings, first process them into a consistent - * format so that they can be compared as strings. - * - * @return array ($error, $canonicalized_json) The $error parameter is used - * to indicate an error decoding the json. This is used to avoid ambiguity - * with JSON strings consisting entirely of 'null' or 'false'. - */ - public static function canonicalize(string $json): array - { - $decodedJson = json_decode($json); - - if (json_last_error()) { - return [true, null]; - } - - self::recursiveSort($decodedJson); - - $reencodedJson = json_encode($decodedJson); - - return [false, $reencodedJson]; - } - - /** - * JSON object keys are unordered while PHP array keys are ordered. - * - * Sort all array keys to ensure both the expected and actual values have - * their keys in the same order. - */ - private static function recursiveSort(mixed &$json): void - { - // Nulls, empty arrays, and scalars need no further handling. - if (!$json || is_scalar($json)) { - return; - } - - $isObject = is_object($json); - - if ($isObject) { - // Objects need to be sorted during canonicalization to ensure - // correct comparsion since JSON objects are unordered. It must be - // kept as an object so that the value correctly stays as a JSON - // object instead of potentially being converted to an array. This - // approach ensures that numeric string JSON keys are preserved and - // don't risk being flattened due to PHP's array semantics. - // See #2919, #4584, #4674 - $json = (array) $json; - ksort($json, SORT_STRING); - } - - foreach ($json as &$value) { - self::recursiveSort($value); - } - - if ($isObject) { - $json = (object) $json; - } - } -} diff --git a/vendor/phpunit/phpunit/src/Util/PHP/AbstractPhpProcess.php b/vendor/phpunit/phpunit/src/Util/PHP/AbstractPhpProcess.php deleted file mode 100644 index 7e20155..0000000 --- a/vendor/phpunit/phpunit/src/Util/PHP/AbstractPhpProcess.php +++ /dev/null @@ -1,314 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util\PHP; - -use const PHP_BINARY; -use const PHP_SAPI; -use function array_keys; -use function array_merge; -use function assert; -use function explode; -use function file_get_contents; -use function ini_get_all; -use function is_file; -use function restore_error_handler; -use function set_error_handler; -use function trim; -use function unlink; -use function unserialize; -use ErrorException; -use PHPUnit\Event\Code\TestMethodBuilder; -use PHPUnit\Event\Code\ThrowableBuilder; -use PHPUnit\Event\Facade; -use PHPUnit\Event\NoPreviousThrowableException; -use PHPUnit\Event\TestData\MoreThanOneDataSetFromDataProviderException; -use PHPUnit\Framework\AssertionFailedError; -use PHPUnit\Framework\Exception; -use PHPUnit\Framework\Test; -use PHPUnit\Framework\TestCase; -use PHPUnit\Runner\CodeCoverage; -use PHPUnit\TestRunner\TestResult\PassedTests; -use SebastianBergmann\Environment\Runtime; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -abstract class AbstractPhpProcess -{ - protected bool $stderrRedirection = false; - protected string $stdin = ''; - protected string $arguments = ''; - - /** - * @psalm-var array - */ - protected array $env = []; - - public static function factory(): self - { - return new DefaultPhpProcess; - } - - /** - * Defines if should use STDERR redirection or not. - * - * Then $stderrRedirection is TRUE, STDERR is redirected to STDOUT. - */ - public function setUseStderrRedirection(bool $stderrRedirection): void - { - $this->stderrRedirection = $stderrRedirection; - } - - /** - * Returns TRUE if uses STDERR redirection or FALSE if not. - */ - public function useStderrRedirection(): bool - { - return $this->stderrRedirection; - } - - /** - * Sets the input string to be sent via STDIN. - */ - public function setStdin(string $stdin): void - { - $this->stdin = $stdin; - } - - /** - * Returns the input string to be sent via STDIN. - */ - public function getStdin(): string - { - return $this->stdin; - } - - /** - * Sets the string of arguments to pass to the php job. - */ - public function setArgs(string $arguments): void - { - $this->arguments = $arguments; - } - - /** - * Returns the string of arguments to pass to the php job. - */ - public function getArgs(): string - { - return $this->arguments; - } - - /** - * Sets the array of environment variables to start the child process with. - * - * @psalm-param array $env - */ - public function setEnv(array $env): void - { - $this->env = $env; - } - - /** - * Returns the array of environment variables to start the child process with. - */ - public function getEnv(): array - { - return $this->env; - } - - /** - * Runs a single test in a separate PHP process. - * - * @throws \PHPUnit\Runner\Exception - * @throws Exception - * @throws MoreThanOneDataSetFromDataProviderException - * @throws NoPreviousThrowableException - */ - public function runTestJob(string $job, Test $test, string $processResultFile): void - { - $_result = $this->runJob($job); - - $processResult = ''; - - if (is_file($processResultFile)) { - $processResult = file_get_contents($processResultFile); - - @unlink($processResultFile); - } - - $this->processChildResult( - $test, - $processResult, - $_result['stderr'], - ); - } - - /** - * Returns the command based into the configurations. - * - * @return string[] - */ - public function getCommand(array $settings, ?string $file = null): array - { - $runtime = new Runtime; - - $command = []; - $command[] = PHP_BINARY; - - if ($runtime->hasPCOV()) { - $settings = array_merge( - $settings, - $runtime->getCurrentSettings( - array_keys(ini_get_all('pcov')), - ), - ); - } elseif ($runtime->hasXdebug()) { - $settings = array_merge( - $settings, - $runtime->getCurrentSettings( - array_keys(ini_get_all('xdebug')), - ), - ); - } - - $command = array_merge($command, $this->settingsToParameters($settings)); - - if (PHP_SAPI === 'phpdbg') { - $command[] = '-qrr'; - - if (!$file) { - $command[] = 's='; - } - } - - if ($file) { - $command[] = '-f'; - $command[] = $file; - } - - if ($this->arguments) { - if (!$file) { - $command[] = '--'; - } - - foreach (explode(' ', $this->arguments) as $arg) { - $command[] = trim($arg); - } - } - - return $command; - } - - /** - * Runs a single job (PHP code) using a separate PHP process. - */ - abstract public function runJob(string $job, array $settings = []): array; - - /** - * @return list - */ - protected function settingsToParameters(array $settings): array - { - $buffer = []; - - foreach ($settings as $setting) { - $buffer[] = '-d'; - $buffer[] = $setting; - } - - return $buffer; - } - - /** - * @throws \PHPUnit\Runner\Exception - * @throws Exception - * @throws MoreThanOneDataSetFromDataProviderException - * @throws NoPreviousThrowableException - */ - private function processChildResult(Test $test, string $stdout, string $stderr): void - { - if (!empty($stderr)) { - $exception = new Exception(trim($stderr)); - - assert($test instanceof TestCase); - - Facade::emitter()->testErrored( - TestMethodBuilder::fromTestCase($test), - ThrowableBuilder::from($exception), - ); - - return; - } - - set_error_handler( - /** - * @throws ErrorException - */ - static function (int $errno, string $errstr, string $errfile, int $errline): never - { - throw new ErrorException($errstr, $errno, $errno, $errfile, $errline); - }, - ); - - try { - $childResult = unserialize($stdout); - - restore_error_handler(); - - if ($childResult === false) { - $exception = new AssertionFailedError('Test was run in child process and ended unexpectedly'); - - assert($test instanceof TestCase); - - Facade::emitter()->testErrored( - TestMethodBuilder::fromTestCase($test), - ThrowableBuilder::from($exception), - ); - - Facade::emitter()->testFinished( - TestMethodBuilder::fromTestCase($test), - 0, - ); - } - } catch (ErrorException $e) { - restore_error_handler(); - - $childResult = false; - - $exception = new Exception(trim($stdout), 0, $e); - - assert($test instanceof TestCase); - - Facade::emitter()->testErrored( - TestMethodBuilder::fromTestCase($test), - ThrowableBuilder::from($exception), - ); - } - - if ($childResult !== false) { - Facade::instance()->forward($childResult['events']); - PassedTests::instance()->import($childResult['passedTests']); - - assert($test instanceof TestCase); - - $test->setResult($childResult['testResult']); - $test->addToAssertionCount($childResult['numAssertions']); - - if (CodeCoverage::instance()->isActive() && $childResult['codeCoverage'] instanceof \SebastianBergmann\CodeCoverage\CodeCoverage) { - CodeCoverage::instance()->codeCoverage()->merge( - $childResult['codeCoverage'], - ); - } - } - } -} diff --git a/vendor/phpunit/phpunit/src/Util/PHP/DefaultPhpProcess.php b/vendor/phpunit/phpunit/src/Util/PHP/DefaultPhpProcess.php deleted file mode 100644 index 3cc0fc1..0000000 --- a/vendor/phpunit/phpunit/src/Util/PHP/DefaultPhpProcess.php +++ /dev/null @@ -1,148 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util\PHP; - -use function array_merge; -use function fclose; -use function file_put_contents; -use function fwrite; -use function is_array; -use function is_resource; -use function proc_close; -use function proc_open; -use function stream_get_contents; -use function sys_get_temp_dir; -use function tempnam; -use function unlink; -use PHPUnit\Framework\Exception; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -class DefaultPhpProcess extends AbstractPhpProcess -{ - private ?string $tempFile = null; - - /** - * Runs a single job (PHP code) using a separate PHP process. - * - * @throws Exception - * @throws PhpProcessException - * - * @psalm-return array{stdout: string, stderr: string} - */ - public function runJob(string $job, array $settings = []): array - { - if ($this->stdin) { - if (!($this->tempFile = tempnam(sys_get_temp_dir(), 'phpunit_')) || - file_put_contents($this->tempFile, $job) === false) { - throw new PhpProcessException( - 'Unable to write temporary file', - ); - } - - $job = $this->stdin; - } - - return $this->runProcess($job, $settings); - } - - /** - * Handles creating the child process and returning the STDOUT and STDERR. - * - * @throws Exception - * @throws PhpProcessException - * - * @psalm-return array{stdout: string, stderr: string} - */ - protected function runProcess(string $job, array $settings): array - { - $env = null; - - if ($this->env) { - $env = $_SERVER ?? []; - unset($env['argv'], $env['argc']); - $env = array_merge($env, $this->env); - - foreach ($env as $envKey => $envVar) { - if (is_array($envVar)) { - unset($env[$envKey]); - } - } - } - - $pipeSpec = [ - 0 => ['pipe', 'r'], - 1 => ['pipe', 'w'], - 2 => ['pipe', 'w'], - ]; - - if ($this->stderrRedirection) { - $pipeSpec[2] = ['redirect', 1]; - } - - $process = proc_open( - $this->getCommand($settings, $this->tempFile), - $pipeSpec, - $pipes, - null, - $env, - ); - - if (!is_resource($process)) { - throw new PhpProcessException( - 'Unable to spawn worker process', - ); - } - - if ($job) { - $this->process($pipes[0], $job); - } - - fclose($pipes[0]); - - $stderr = $stdout = ''; - - if (isset($pipes[1])) { - $stdout = stream_get_contents($pipes[1]); - - fclose($pipes[1]); - } - - if (isset($pipes[2])) { - $stderr = stream_get_contents($pipes[2]); - - fclose($pipes[2]); - } - - proc_close($process); - - $this->cleanup(); - - return ['stdout' => $stdout, 'stderr' => $stderr]; - } - - /** - * @param resource $pipe - */ - protected function process($pipe, string $job): void - { - fwrite($pipe, $job); - } - - protected function cleanup(): void - { - if ($this->tempFile) { - unlink($this->tempFile); - } - } -} diff --git a/vendor/phpunit/phpunit/src/Util/PHP/Template/PhptTestCase.tpl b/vendor/phpunit/phpunit/src/Util/PHP/Template/PhptTestCase.tpl deleted file mode 100644 index c425188..0000000 --- a/vendor/phpunit/phpunit/src/Util/PHP/Template/PhptTestCase.tpl +++ /dev/null @@ -1,56 +0,0 @@ -{driverMethod}($filter), - $filter - ); - - if ({codeCoverageCacheDirectory}) { - $coverage->cacheStaticAnalysis({codeCoverageCacheDirectory}); - } - - $coverage->start(__FILE__); -} - -register_shutdown_function( - function() use ($coverage) { - $output = null; - - if ($coverage) { - $output = $coverage->stop(); - } - - file_put_contents('{coverageFile}', serialize($output)); - } -); - -ob_end_clean(); - -require '{job}'; diff --git a/vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseClass.tpl b/vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseClass.tpl deleted file mode 100644 index 0a869c4..0000000 --- a/vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseClass.tpl +++ /dev/null @@ -1,116 +0,0 @@ -initForIsolation( - PHPUnit\Event\Telemetry\HRTime::fromSecondsAndNanoseconds( - {offsetSeconds}, - {offsetNanoseconds} - ), - {exportObjects}, - ); - - require_once '{filename}'; - - if ({collectCodeCoverageInformation}) { - CodeCoverage::instance()->init(ConfigurationRegistry::get(), CodeCoverageFilterRegistry::instance(), true); - CodeCoverage::instance()->ignoreLines({linesToBeIgnored}); - } - - $test = new {className}('{name}'); - - $test->setData('{dataName}', unserialize('{data}')); - $test->setDependencyInput(unserialize('{dependencyInput}')); - $test->setInIsolation(true); - - ob_end_clean(); - - $test->run(); - - $output = ''; - - if (!$test->expectsOutput()) { - $output = $test->output(); - } - - ini_set('xdebug.scream', '0'); - - // Not every STDOUT target stream is rewindable - @rewind(STDOUT); - - if ($stdout = @stream_get_contents(STDOUT)) { - $output = $stdout . $output; - $streamMetaData = stream_get_meta_data(STDOUT); - - if (!empty($streamMetaData['stream_type']) && 'STDIO' === $streamMetaData['stream_type']) { - @ftruncate(STDOUT, 0); - @rewind(STDOUT); - } - } - - file_put_contents( - '{processResultFile}', - serialize( - [ - 'testResult' => $test->result(), - 'codeCoverage' => {collectCodeCoverageInformation} ? CodeCoverage::instance()->codeCoverage() : null, - 'numAssertions' => $test->numberOfAssertionsPerformed(), - 'output' => $output, - 'events' => $dispatcher->flush(), - 'passedTests' => PassedTests::instance() - ] - ) - ); -} - -function __phpunit_error_handler($errno, $errstr, $errfile, $errline) -{ - return true; -} - -set_error_handler('__phpunit_error_handler'); - -{constants} -{included_files} -{globals} - -restore_error_handler(); - -ConfigurationRegistry::loadFrom('{serializedConfiguration}'); -(new PhpHandler)->handle(ConfigurationRegistry::get()->php()); - -if ('{bootstrap}' !== '') { - require_once '{bootstrap}'; -} - -__phpunit_run_isolated_test(); diff --git a/vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseMethod.tpl b/vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseMethod.tpl deleted file mode 100644 index 3e508ef..0000000 --- a/vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseMethod.tpl +++ /dev/null @@ -1,116 +0,0 @@ -initForIsolation( - PHPUnit\Event\Telemetry\HRTime::fromSecondsAndNanoseconds( - {offsetSeconds}, - {offsetNanoseconds} - ), - {exportObjects}, - ); - - require_once '{filename}'; - - if ({collectCodeCoverageInformation}) { - CodeCoverage::instance()->init(ConfigurationRegistry::get(), CodeCoverageFilterRegistry::instance(), true); - CodeCoverage::instance()->ignoreLines({linesToBeIgnored}); - } - - $test = new {className}('{methodName}'); - - $test->setData('{dataName}', unserialize('{data}')); - $test->setDependencyInput(unserialize('{dependencyInput}')); - $test->setInIsolation(true); - - ob_end_clean(); - - $test->run(); - - $output = ''; - - if (!$test->expectsOutput()) { - $output = $test->output(); - } - - ini_set('xdebug.scream', '0'); - - // Not every STDOUT target stream is rewindable - @rewind(STDOUT); - - if ($stdout = @stream_get_contents(STDOUT)) { - $output = $stdout . $output; - $streamMetaData = stream_get_meta_data(STDOUT); - - if (!empty($streamMetaData['stream_type']) && 'STDIO' === $streamMetaData['stream_type']) { - @ftruncate(STDOUT, 0); - @rewind(STDOUT); - } - } - - file_put_contents( - '{processResultFile}', - serialize( - [ - 'testResult' => $test->result(), - 'codeCoverage' => {collectCodeCoverageInformation} ? CodeCoverage::instance()->codeCoverage() : null, - 'numAssertions' => $test->numberOfAssertionsPerformed(), - 'output' => $output, - 'events' => $dispatcher->flush(), - 'passedTests' => PassedTests::instance() - ] - ) - ); -} - -function __phpunit_error_handler($errno, $errstr, $errfile, $errline) -{ - return true; -} - -set_error_handler('__phpunit_error_handler'); - -{constants} -{included_files} -{globals} - -restore_error_handler(); - -ConfigurationRegistry::loadFrom('{serializedConfiguration}'); -(new PhpHandler)->handle(ConfigurationRegistry::get()->php()); - -if ('{bootstrap}' !== '') { - require_once '{bootstrap}'; -} - -__phpunit_run_isolated_test(); diff --git a/vendor/phpunit/phpunit/src/Util/Reflection.php b/vendor/phpunit/phpunit/src/Util/Reflection.php deleted file mode 100644 index 0aac925..0000000 --- a/vendor/phpunit/phpunit/src/Util/Reflection.php +++ /dev/null @@ -1,107 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util; - -use function array_keys; -use function array_merge; -use function array_reverse; -use PHPUnit\Framework\Assert; -use PHPUnit\Framework\TestCase; -use ReflectionClass; -use ReflectionException; -use ReflectionMethod; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Reflection -{ - /** - * @psalm-param class-string $className - * @psalm-param non-empty-string $methodName - * - * @psalm-return array{file: non-empty-string, line: non-negative-int} - */ - public static function sourceLocationFor(string $className, string $methodName): array - { - try { - $reflector = new ReflectionMethod($className, $methodName); - - $file = $reflector->getFileName(); - $line = $reflector->getStartLine(); - } catch (ReflectionException) { - $file = 'unknown'; - $line = 0; - } - - return [ - 'file' => $file, - 'line' => $line, - ]; - } - - /** - * @psalm-return list - */ - public static function publicMethodsInTestClass(ReflectionClass $class): array - { - return self::filterAndSortMethods($class, ReflectionMethod::IS_PUBLIC, true); - } - - /** - * @psalm-return list - */ - public static function methodsInTestClass(ReflectionClass $class): array - { - return self::filterAndSortMethods($class, null, false); - } - - /** - * @psalm-return list - */ - private static function filterAndSortMethods(ReflectionClass $class, ?int $filter, bool $sortHighestToLowest): array - { - $methodsByClass = []; - - foreach ($class->getMethods($filter) as $method) { - $declaringClassName = $method->getDeclaringClass()->getName(); - - if ($declaringClassName === TestCase::class) { - continue; - } - - if ($declaringClassName === Assert::class) { - continue; - } - - if (!isset($methodsByClass[$declaringClassName])) { - $methodsByClass[$declaringClassName] = []; - } - - $methodsByClass[$declaringClassName][] = $method; - } - - $classNames = array_keys($methodsByClass); - - if ($sortHighestToLowest) { - $classNames = array_reverse($classNames); - } - - $methods = []; - - foreach ($classNames as $className) { - $methods = array_merge($methods, $methodsByClass[$className]); - } - - return $methods; - } -} diff --git a/vendor/phpunit/phpunit/src/Util/Test.php b/vendor/phpunit/phpunit/src/Util/Test.php deleted file mode 100644 index 51d9076..0000000 --- a/vendor/phpunit/phpunit/src/Util/Test.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util; - -use function str_starts_with; -use PHPUnit\Metadata\Parser\Registry; -use ReflectionMethod; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Test -{ - public static function isTestMethod(ReflectionMethod $method): bool - { - if (!$method->isPublic()) { - return false; - } - - if (str_starts_with($method->getName(), 'test')) { - return true; - } - - $metadata = Registry::parser()->forMethod( - $method->getDeclaringClass()->getName(), - $method->getName(), - ); - - return $metadata->isTest()->isNotEmpty(); - } -} diff --git a/vendor/phpunit/phpunit/src/Util/ThrowableToStringMapper.php b/vendor/phpunit/phpunit/src/Util/ThrowableToStringMapper.php deleted file mode 100644 index a0c1289..0000000 --- a/vendor/phpunit/phpunit/src/Util/ThrowableToStringMapper.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util; - -use function trim; -use PHPUnit\Framework\ExpectationFailedException; -use PHPUnit\Framework\PhptAssertionFailedError; -use PHPUnit\Framework\SelfDescribing; -use PHPUnit\Runner\ErrorException; -use Throwable; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ThrowableToStringMapper -{ - public static function map(Throwable $t): string - { - if ($t instanceof ErrorException) { - return $t->getMessage(); - } - - if ($t instanceof SelfDescribing) { - $buffer = $t->toString(); - - if ($t instanceof ExpectationFailedException && $t->getComparisonFailure()) { - $buffer .= $t->getComparisonFailure()->getDiff(); - } - - if ($t instanceof PhptAssertionFailedError) { - $buffer .= $t->diff(); - } - - if (!empty($buffer)) { - $buffer = trim($buffer) . "\n"; - } - - return $buffer; - } - - return $t::class . ': ' . $t->getMessage() . "\n"; - } -} diff --git a/vendor/phpunit/phpunit/src/Util/VersionComparisonOperator.php b/vendor/phpunit/phpunit/src/Util/VersionComparisonOperator.php deleted file mode 100644 index ad10833..0000000 --- a/vendor/phpunit/phpunit/src/Util/VersionComparisonOperator.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util; - -use function in_array; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @psalm-immutable - */ -final class VersionComparisonOperator -{ - /** - * @psalm-var '<'|'lt'|'<='|'le'|'>'|'gt'|'>='|'ge'|'=='|'='|'eq'|'!='|'<>'|'ne' - */ - private readonly string $operator; - - /** - * @psalm-param '<'|'lt'|'<='|'le'|'>'|'gt'|'>='|'ge'|'=='|'='|'eq'|'!='|'<>'|'ne' $operator - * - * @throws InvalidVersionOperatorException - */ - public function __construct(string $operator) - { - $this->ensureOperatorIsValid($operator); - - $this->operator = $operator; - } - - /** - * @psalm-return '<'|'lt'|'<='|'le'|'>'|'gt'|'>='|'ge'|'=='|'='|'eq'|'!='|'<>'|'ne' - */ - public function asString(): string - { - return $this->operator; - } - - /** - * @psalm-param '<'|'lt'|'<='|'le'|'>'|'gt'|'>='|'ge'|'=='|'='|'eq'|'!='|'<>'|'ne' $operator - * - * @throws InvalidVersionOperatorException - */ - private function ensureOperatorIsValid(string $operator): void - { - if (!in_array($operator, ['<', 'lt', '<=', 'le', '>', 'gt', '>=', 'ge', '==', '=', 'eq', '!=', '<>', 'ne'], true)) { - throw new InvalidVersionOperatorException($operator); - } - } -} diff --git a/vendor/phpunit/phpunit/src/Util/Xml/Loader.php b/vendor/phpunit/phpunit/src/Util/Xml/Loader.php deleted file mode 100644 index 927927d..0000000 --- a/vendor/phpunit/phpunit/src/Util/Xml/Loader.php +++ /dev/null @@ -1,127 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util\Xml; - -use const PHP_OS_FAMILY; -use function chdir; -use function dirname; -use function error_reporting; -use function file_get_contents; -use function getcwd; -use function libxml_get_errors; -use function libxml_use_internal_errors; -use function sprintf; -use DOMDocument; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Loader -{ - /** - * @throws XmlException - */ - public function loadFile(string $filename): DOMDocument - { - $reporting = error_reporting(0); - $contents = file_get_contents($filename); - - error_reporting($reporting); - - if ($contents === false) { - throw new XmlException( - sprintf( - 'Could not read XML from file "%s"', - $filename, - ), - ); - } - - return $this->load($contents, $filename); - } - - /** - * @throws XmlException - */ - public function load(string $actual, ?string $filename = null): DOMDocument - { - if ($actual === '') { - if ($filename === null) { - throw new XmlException('Could not parse XML from empty string'); - } - - throw new XmlException( - sprintf( - 'Could not parse XML from empty file "%s"', - $filename, - ), - ); - } - - $document = new DOMDocument; - $document->preserveWhiteSpace = false; - - $internal = libxml_use_internal_errors(true); - $message = ''; - $reporting = error_reporting(0); - - // Required for XInclude - if ($filename !== null) { - // Required for XInclude on Windows - if (PHP_OS_FAMILY === 'Windows') { - $cwd = getcwd(); - @chdir(dirname($filename)); - } - - $document->documentURI = $filename; - } - - $loaded = $document->loadXML($actual); - - if ($filename !== null) { - $document->xinclude(); - } - - foreach (libxml_get_errors() as $error) { - $message .= "\n" . $error->message; - } - - libxml_use_internal_errors($internal); - error_reporting($reporting); - - if (isset($cwd)) { - @chdir($cwd); - } - - if ($loaded === false || $message !== '') { - if ($filename !== null) { - throw new XmlException( - sprintf( - 'Could not load "%s"%s', - $filename, - $message !== '' ? ":\n" . $message : '', - ), - ); - } - - if ($message === '') { - // @codeCoverageIgnoreStart - $message = 'Could not load XML for unknown reason'; - // @codeCoverageIgnoreEnd - } - - throw new XmlException($message); - } - - return $document; - } -} diff --git a/vendor/phpunit/phpunit/src/Util/Xml/Xml.php b/vendor/phpunit/phpunit/src/Util/Xml/Xml.php deleted file mode 100644 index 70c5fec..0000000 --- a/vendor/phpunit/phpunit/src/Util/Xml/Xml.php +++ /dev/null @@ -1,81 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util; - -use const ENT_QUOTES; -use function htmlspecialchars; -use function mb_convert_encoding; -use function ord; -use function preg_replace; -use function strlen; - -/** - * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Xml -{ - /** - * Escapes a string for the use in XML documents. - * - * Any Unicode character is allowed, excluding the surrogate blocks, FFFE, - * and FFFF (not even as character reference). - * - * @see https://www.w3.org/TR/xml/#charsets - */ - public static function prepareString(string $string): string - { - return preg_replace( - '/[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]/', - '', - htmlspecialchars( - self::convertToUtf8($string), - ENT_QUOTES, - ), - ); - } - - private static function convertToUtf8(string $string): string - { - if (!self::isUtf8($string)) { - $string = mb_convert_encoding($string, 'UTF-8'); - } - - return $string; - } - - private static function isUtf8(string $string): bool - { - $length = strlen($string); - - for ($i = 0; $i < $length; $i++) { - if (ord($string[$i]) < 0x80) { - $n = 0; - } elseif ((ord($string[$i]) & 0xE0) === 0xC0) { - $n = 1; - } elseif ((ord($string[$i]) & 0xF0) === 0xE0) { - $n = 2; - } elseif ((ord($string[$i]) & 0xF0) === 0xF0) { - $n = 3; - } else { - return false; - } - - for ($j = 0; $j < $n; $j++) { - if ((++$i === $length) || ((ord($string[$i]) & 0xC0) !== 0x80)) { - return false; - } - } - } - - return true; - } -} diff --git a/vendor/psr/event-dispatcher/.editorconfig b/vendor/psr/event-dispatcher/.editorconfig deleted file mode 100644 index 164f092..0000000 --- a/vendor/psr/event-dispatcher/.editorconfig +++ /dev/null @@ -1,15 +0,0 @@ -; This file is for unifying the coding style for different editors and IDEs. -; More information at http://editorconfig.org - -root = true - -[*] -charset = utf-8 -indent_size = 4 -indent_style = space -end_of_line = lf -insert_final_newline = true -trim_trailing_whitespace = true - -[Makefile] -indent_style = tab diff --git a/vendor/psr/event-dispatcher/.gitignore b/vendor/psr/event-dispatcher/.gitignore deleted file mode 100644 index 3a9875b..0000000 --- a/vendor/psr/event-dispatcher/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/vendor/ -composer.lock diff --git a/vendor/psr/event-dispatcher/README.md b/vendor/psr/event-dispatcher/README.md deleted file mode 100644 index 294214a..0000000 --- a/vendor/psr/event-dispatcher/README.md +++ /dev/null @@ -1,6 +0,0 @@ -PSR Event Dispatcher -==================== - -This repository holds the interfaces related to [PSR-14](http://www.php-fig.org/psr/psr-14/). - -Note that this is not an Event Dispatcher implementation of its own. It is merely interfaces that describe the components of an Event Dispatcher. See the specification for more details. diff --git a/vendor/psr/event-dispatcher/composer.json b/vendor/psr/event-dispatcher/composer.json deleted file mode 100644 index 667a714..0000000 --- a/vendor/psr/event-dispatcher/composer.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "psr/event-dispatcher", - "description": "Standard interfaces for event handling.", - "type": "library", - "keywords": ["psr", "psr-14", "events"], - "license": "MIT", - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "require": { - "php": ">=7.2.0" - }, - "autoload": { - "psr-4": { - "Psr\\EventDispatcher\\": "src/" - } - }, - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - } -} diff --git a/vendor/sebastian/cli-parser/ChangeLog.md b/vendor/sebastian/cli-parser/ChangeLog.md deleted file mode 100644 index 0cc528e..0000000 --- a/vendor/sebastian/cli-parser/ChangeLog.md +++ /dev/null @@ -1,30 +0,0 @@ -# ChangeLog - -All notable changes are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. - -## [2.0.1] - 2024-03-02 - -### Changed - -* Do not use implicitly nullable parameters - -## [2.0.0] - 2023-02-03 - -### Removed - -* This component is no longer supported on PHP 7.3, PHP 7.4, and PHP 8.0 - -## [1.0.1] - 2020-09-28 - -### Changed - -* Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` - -## [1.0.0] - 2020-08-12 - -* Initial release - -[2.0.1]: https://github.com/sebastianbergmann/cli-parser/compare/2.0.0...2.0.1 -[2.0.0]: https://github.com/sebastianbergmann/cli-parser/compare/1.0.1...2.0.0 -[1.0.1]: https://github.com/sebastianbergmann/cli-parser/compare/1.0.0...1.0.1 -[1.0.0]: https://github.com/sebastianbergmann/cli-parser/compare/bb7bb3297957927962b0a3335befe7b66f7462e9...1.0.0 diff --git a/vendor/sebastian/cli-parser/LICENSE b/vendor/sebastian/cli-parser/LICENSE deleted file mode 100644 index edaedf6..0000000 --- a/vendor/sebastian/cli-parser/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2020-2024, Sebastian Bergmann -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/sebastian/cli-parser/README.md b/vendor/sebastian/cli-parser/README.md deleted file mode 100644 index 4db2c04..0000000 --- a/vendor/sebastian/cli-parser/README.md +++ /dev/null @@ -1,22 +0,0 @@ -[![Latest Stable Version](https://poser.pugx.org/sebastian/cli-parser/v/stable.png)](https://packagist.org/packages/sebastian/cli-parser) -[![CI Status](https://github.com/sebastianbergmann/cli-parser/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/cli-parser/actions) -[![Type Coverage](https://shepherd.dev/github/sebastianbergmann/cli-parser/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/cli-parser) -[![codecov](https://codecov.io/gh/sebastianbergmann/cli-parser/branch/main/graph/badge.svg)](https://codecov.io/gh/sebastianbergmann/cli-parser) - -# sebastian/cli-parser - -Library for parsing `$_SERVER['argv']`, extracted from `phpunit/phpunit`. - -## Installation - -You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - -``` -composer require sebastian/cli-parser -``` - -If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - -``` -composer require --dev sebastian/cli-parser -``` diff --git a/vendor/sebastian/cli-parser/SECURITY.md b/vendor/sebastian/cli-parser/SECURITY.md deleted file mode 100644 index d88ff00..0000000 --- a/vendor/sebastian/cli-parser/SECURITY.md +++ /dev/null @@ -1,30 +0,0 @@ -# Security Policy - -If you believe you have found a security vulnerability in the library that is developed in this repository, please report it to us through coordinated disclosure. - -**Please do not report security vulnerabilities through public GitHub issues, discussions, or pull requests.** - -Instead, please email `sebastian@phpunit.de`. - -Please include as much of the information listed below as you can to help us better understand and resolve the issue: - -* The type of issue -* Full paths of source file(s) related to the manifestation of the issue -* The location of the affected source code (tag/branch/commit or direct URL) -* Any special configuration required to reproduce the issue -* Step-by-step instructions to reproduce the issue -* Proof-of-concept or exploit code (if possible) -* Impact of the issue, including how an attacker might exploit the issue - -This information will help us triage your report more quickly. - -## Web Context - -The library that is developed in this repository was either extracted from [PHPUnit](https://github.com/sebastianbergmann/phpunit) or developed specifically as a dependency for PHPUnit. - -The library is developed with a focus on development environments and the command-line. No specific testing or hardening with regard to using the library in an HTTP or web context or with untrusted input data is performed. The library might also contain functionality that intentionally exposes internal application data for debugging purposes. - -If the library is used in a web application, the application developer is responsible for filtering inputs or escaping outputs as necessary and for verifying that the used functionality is safe for use within the intended context. - -Vulnerabilities specific to the use outside a development context will be fixed as applicable, provided that the fix does not have an averse effect on the primary use case for development purposes. - diff --git a/vendor/sebastian/cli-parser/composer.json b/vendor/sebastian/cli-parser/composer.json deleted file mode 100644 index 51b7447..0000000 --- a/vendor/sebastian/cli-parser/composer.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "sebastian/cli-parser", - "description": "Library for parsing CLI options", - "type": "library", - "homepage": "https://github.com/sebastianbergmann/cli-parser", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "support": { - "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "security": "https://github.com/sebastianbergmann/cli-parser/security/policy" - }, - "prefer-stable": true, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "config": { - "platform": { - "php": "8.1.0" - }, - "optimize-autoloader": true, - "sort-packages": true - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "extra": { - "branch-alias": { - "dev-main": "2.0-dev" - } - } -} diff --git a/vendor/sebastian/cli-parser/src/Parser.php b/vendor/sebastian/cli-parser/src/Parser.php deleted file mode 100644 index ab2d975..0000000 --- a/vendor/sebastian/cli-parser/src/Parser.php +++ /dev/null @@ -1,206 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CliParser; - -use function array_map; -use function array_merge; -use function array_shift; -use function array_slice; -use function assert; -use function count; -use function current; -use function explode; -use function is_array; -use function is_int; -use function is_string; -use function key; -use function next; -use function preg_replace; -use function reset; -use function sort; -use function str_ends_with; -use function str_starts_with; -use function strlen; -use function strstr; -use function substr; - -final class Parser -{ - /** - * @psalm-param list $argv - * @psalm-param list $longOptions - * - * @psalm-return array{0: array, 1: array} - * - * @throws AmbiguousOptionException - * @throws OptionDoesNotAllowArgumentException - * @throws RequiredOptionArgumentMissingException - * @throws UnknownOptionException - */ - public function parse(array $argv, string $shortOptions, ?array $longOptions = null): array - { - if (empty($argv)) { - return [[], []]; - } - - $options = []; - $nonOptions = []; - - if ($longOptions) { - sort($longOptions); - } - - if (isset($argv[0][0]) && $argv[0][0] !== '-') { - array_shift($argv); - } - - reset($argv); - - $argv = array_map('trim', $argv); - - while (false !== $arg = current($argv)) { - $i = key($argv); - - assert(is_int($i)); - - next($argv); - - if ($arg === '') { - continue; - } - - if ($arg === '--') { - $nonOptions = array_merge($nonOptions, array_slice($argv, $i + 1)); - - break; - } - - if ($arg[0] !== '-' || (strlen($arg) > 1 && $arg[1] === '-' && !$longOptions)) { - $nonOptions[] = $arg; - - continue; - } - - if (strlen($arg) > 1 && $arg[1] === '-' && is_array($longOptions)) { - $this->parseLongOption( - substr($arg, 2), - $longOptions, - $options, - $argv, - ); - - continue; - } - - $this->parseShortOption( - substr($arg, 1), - $shortOptions, - $options, - $argv, - ); - } - - return [$options, $nonOptions]; - } - - /** - * @throws RequiredOptionArgumentMissingException - */ - private function parseShortOption(string $argument, string $shortOptions, array &$options, array &$argv): void - { - $argumentLength = strlen($argument); - - for ($i = 0; $i < $argumentLength; $i++) { - $option = $argument[$i]; - $optionArgument = null; - - if ($argument[$i] === ':' || ($spec = strstr($shortOptions, $option)) === false) { - throw new UnknownOptionException('-' . $option); - } - - if (strlen($spec) > 1 && $spec[1] === ':') { - if ($i + 1 < $argumentLength) { - $options[] = [$option, substr($argument, $i + 1)]; - - break; - } - - if (!(strlen($spec) > 2 && $spec[2] === ':')) { - $optionArgument = current($argv); - - if (!$optionArgument) { - throw new RequiredOptionArgumentMissingException('-' . $option); - } - - assert(is_string($optionArgument)); - - next($argv); - } - } - - $options[] = [$option, $optionArgument]; - } - } - - /** - * @psalm-param list $longOptions - * - * @throws AmbiguousOptionException - * @throws OptionDoesNotAllowArgumentException - * @throws RequiredOptionArgumentMissingException - * @throws UnknownOptionException - */ - private function parseLongOption(string $argument, array $longOptions, array &$options, array &$argv): void - { - $count = count($longOptions); - $list = explode('=', $argument); - $option = $list[0]; - $optionArgument = null; - - if (count($list) > 1) { - $optionArgument = $list[1]; - } - - $optionLength = strlen($option); - - foreach ($longOptions as $i => $longOption) { - $opt_start = substr($longOption, 0, $optionLength); - - if ($opt_start !== $option) { - continue; - } - - $opt_rest = substr($longOption, $optionLength); - - if ($opt_rest !== '' && $i + 1 < $count && $option[0] !== '=' && str_starts_with($longOptions[$i + 1], $option)) { - throw new AmbiguousOptionException('--' . $option); - } - - if (str_ends_with($longOption, '=')) { - if (!str_ends_with($longOption, '==') && !strlen((string) $optionArgument)) { - if (false === $optionArgument = current($argv)) { - throw new RequiredOptionArgumentMissingException('--' . $option); - } - - next($argv); - } - } elseif ($optionArgument) { - throw new OptionDoesNotAllowArgumentException('--' . $option); - } - - $fullOption = '--' . preg_replace('/={1,2}$/', '', $longOption); - $options[] = [$fullOption, $optionArgument]; - - return; - } - - throw new UnknownOptionException('--' . $option); - } -} diff --git a/vendor/sebastian/cli-parser/src/exceptions/AmbiguousOptionException.php b/vendor/sebastian/cli-parser/src/exceptions/AmbiguousOptionException.php deleted file mode 100644 index 99eb625..0000000 --- a/vendor/sebastian/cli-parser/src/exceptions/AmbiguousOptionException.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CliParser; - -use function sprintf; -use RuntimeException; - -final class AmbiguousOptionException extends RuntimeException implements Exception -{ - public function __construct(string $option) - { - parent::__construct( - sprintf( - 'Option "%s" is ambiguous', - $option, - ), - ); - } -} diff --git a/vendor/sebastian/cli-parser/src/exceptions/Exception.php b/vendor/sebastian/cli-parser/src/exceptions/Exception.php deleted file mode 100644 index f35ad24..0000000 --- a/vendor/sebastian/cli-parser/src/exceptions/Exception.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CliParser; - -use Throwable; - -interface Exception extends Throwable -{ -} diff --git a/vendor/sebastian/cli-parser/src/exceptions/OptionDoesNotAllowArgumentException.php b/vendor/sebastian/cli-parser/src/exceptions/OptionDoesNotAllowArgumentException.php deleted file mode 100644 index 7fea616..0000000 --- a/vendor/sebastian/cli-parser/src/exceptions/OptionDoesNotAllowArgumentException.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CliParser; - -use function sprintf; -use RuntimeException; - -final class OptionDoesNotAllowArgumentException extends RuntimeException implements Exception -{ - public function __construct(string $option) - { - parent::__construct( - sprintf( - 'Option "%s" does not allow an argument', - $option, - ), - ); - } -} diff --git a/vendor/sebastian/cli-parser/src/exceptions/RequiredOptionArgumentMissingException.php b/vendor/sebastian/cli-parser/src/exceptions/RequiredOptionArgumentMissingException.php deleted file mode 100644 index 9add49a..0000000 --- a/vendor/sebastian/cli-parser/src/exceptions/RequiredOptionArgumentMissingException.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CliParser; - -use function sprintf; -use RuntimeException; - -final class RequiredOptionArgumentMissingException extends RuntimeException implements Exception -{ - public function __construct(string $option) - { - parent::__construct( - sprintf( - 'Required argument for option "%s" is missing', - $option, - ), - ); - } -} diff --git a/vendor/sebastian/cli-parser/src/exceptions/UnknownOptionException.php b/vendor/sebastian/cli-parser/src/exceptions/UnknownOptionException.php deleted file mode 100644 index 560c7ad..0000000 --- a/vendor/sebastian/cli-parser/src/exceptions/UnknownOptionException.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CliParser; - -use function sprintf; -use RuntimeException; - -final class UnknownOptionException extends RuntimeException implements Exception -{ - public function __construct(string $option) - { - parent::__construct( - sprintf( - 'Unknown option "%s"', - $option, - ), - ); - } -} diff --git a/vendor/sebastian/code-unit-reverse-lookup/.psalm/baseline.xml b/vendor/sebastian/code-unit-reverse-lookup/.psalm/baseline.xml deleted file mode 100644 index 0ba3bcc..0000000 --- a/vendor/sebastian/code-unit-reverse-lookup/.psalm/baseline.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - assert(is_array($traits)) - is_array($traits) - - - diff --git a/vendor/sebastian/code-unit-reverse-lookup/.psalm/config.xml b/vendor/sebastian/code-unit-reverse-lookup/.psalm/config.xml deleted file mode 100644 index a231236..0000000 --- a/vendor/sebastian/code-unit-reverse-lookup/.psalm/config.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - diff --git a/vendor/sebastian/code-unit-reverse-lookup/ChangeLog.md b/vendor/sebastian/code-unit-reverse-lookup/ChangeLog.md deleted file mode 100644 index 4ff9718..0000000 --- a/vendor/sebastian/code-unit-reverse-lookup/ChangeLog.md +++ /dev/null @@ -1,45 +0,0 @@ -# Change Log - -All notable changes to `sebastianbergmann/code-unit-reverse-lookup` are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. - -## [3.0.0] - 2023-02-03 - -### Removed - -* This component is no longer supported on PHP 7.3, PHP 7.4, and PHP 8.0 - -## [2.0.3] - 2020-09-28 - -### Changed - -* Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` - -## [2.0.2] - 2020-06-26 - -### Added - -* This component is now supported on PHP 8 - -## [2.0.1] - 2020-06-15 - -### Changed - -* Tests etc. are now ignored for archive exports - -## 2.0.0 - 2020-02-07 - -### Removed - -* This component is no longer supported on PHP 5.6, PHP 7.0, PHP 7.1, and PHP 7.2 - -## 1.0.0 - 2016-02-13 - -### Added - -* Initial release - -[3.0.0]: https://github.com/sebastianbergmann/code-unit-reverse-lookup/compare/2.0.3...3.0.0 -[2.0.3]: https://github.com/sebastianbergmann/code-unit-reverse-lookup/compare/2.0.2...2.0.3 -[2.0.2]: https://github.com/sebastianbergmann/code-unit-reverse-lookup/compare/2.0.1...2.0.2 -[2.0.1]: https://github.com/sebastianbergmann/code-unit-reverse-lookup/compare/2.0.0...2.0.1 -[2.0.0]: https://github.com/sebastianbergmann/code-unit-reverse-lookup/compare/1.0.0...2.0.0 diff --git a/vendor/sebastian/code-unit-reverse-lookup/LICENSE b/vendor/sebastian/code-unit-reverse-lookup/LICENSE deleted file mode 100644 index 16e1ba9..0000000 --- a/vendor/sebastian/code-unit-reverse-lookup/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2016-2023, Sebastian Bergmann -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/sebastian/code-unit-reverse-lookup/README.md b/vendor/sebastian/code-unit-reverse-lookup/README.md deleted file mode 100644 index fb2c0df..0000000 --- a/vendor/sebastian/code-unit-reverse-lookup/README.md +++ /dev/null @@ -1,22 +0,0 @@ -[![Latest Stable Version](https://poser.pugx.org/sebastian/code-unit-reverse-lookup/v/stable.png)](https://packagist.org/packages/sebastian/code-unit-reverse-lookup) -[![CI Status](https://github.com/sebastianbergmann/code-unit-reverse-lookup/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/code-unit-reverse-lookup/actions) -[![Type Coverage](https://shepherd.dev/github/sebastianbergmann/code-unit-reverse-lookup/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/code-unit-reverse-lookup) -[![codecov](https://codecov.io/gh/sebastianbergmann/code-unit-reverse-lookup/branch/main/graph/badge.svg)](https://codecov.io/gh/sebastianbergmann/code-unit-reverse-lookup) - -# sebastian/code-unit-reverse-lookup - -Looks up which function or method a line of code belongs to. - -## Installation - -You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - -``` -composer require sebastian/code-unit-reverse-lookup -``` - -If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - -``` -composer require --dev sebastian/code-unit-reverse-lookup -``` diff --git a/vendor/sebastian/code-unit-reverse-lookup/SECURITY.md b/vendor/sebastian/code-unit-reverse-lookup/SECURITY.md deleted file mode 100644 index d4ee967..0000000 --- a/vendor/sebastian/code-unit-reverse-lookup/SECURITY.md +++ /dev/null @@ -1,9 +0,0 @@ -# Security Policy - -This library is intended to be used in development environments only. For instance, it is used by the testing framework PHPUnit. There is no reason why this library should be installed on a webserver. - -**If you upload this library to a webserver then your deployment process is broken. On a more general note, if your `vendor` directory is publicly accessible on your webserver then your deployment process is also broken.** - -## Security Contact Information - -After the above, if you still would like to report a security vulnerability, please email `sebastian@phpunit.de`. diff --git a/vendor/sebastian/code-unit-reverse-lookup/composer.json b/vendor/sebastian/code-unit-reverse-lookup/composer.json deleted file mode 100644 index 37cc1cc..0000000 --- a/vendor/sebastian/code-unit-reverse-lookup/composer.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "sebastian/code-unit-reverse-lookup", - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "config": { - "platform": { - "php": "8.1.0" - }, - "optimize-autoloader": true, - "sort-packages": true - }, - "prefer-stable": true, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - } -} diff --git a/vendor/sebastian/code-unit-reverse-lookup/src/Wizard.php b/vendor/sebastian/code-unit-reverse-lookup/src/Wizard.php deleted file mode 100644 index 355405e..0000000 --- a/vendor/sebastian/code-unit-reverse-lookup/src/Wizard.php +++ /dev/null @@ -1,114 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeUnitReverseLookup; - -use function array_merge; -use function assert; -use function get_declared_classes; -use function get_declared_traits; -use function get_defined_functions; -use function is_array; -use function range; -use ReflectionClass; -use ReflectionFunction; -use ReflectionFunctionAbstract; -use ReflectionMethod; - -class Wizard -{ - /** - * @psalm-var array> - */ - private array $lookupTable = []; - - /** - * @psalm-var array - */ - private array $processedClasses = []; - - /** - * @psalm-var array - */ - private array $processedFunctions = []; - - public function lookup(string $filename, int $lineNumber): string - { - if (!isset($this->lookupTable[$filename][$lineNumber])) { - $this->updateLookupTable(); - } - - if (isset($this->lookupTable[$filename][$lineNumber])) { - return $this->lookupTable[$filename][$lineNumber]; - } - - return $filename . ':' . $lineNumber; - } - - private function updateLookupTable(): void - { - $this->processClassesAndTraits(); - $this->processFunctions(); - } - - private function processClassesAndTraits(): void - { - $classes = get_declared_classes(); - $traits = get_declared_traits(); - - /* @noinspection PhpConditionAlreadyCheckedInspection */ - assert(is_array($traits)); - - foreach (array_merge($classes, $traits) as $classOrTrait) { - if (isset($this->processedClasses[$classOrTrait])) { - continue; - } - - foreach ((new ReflectionClass($classOrTrait))->getMethods() as $method) { - $this->processFunctionOrMethod($method); - } - - $this->processedClasses[$classOrTrait] = true; - } - } - - private function processFunctions(): void - { - foreach (get_defined_functions()['user'] as $function) { - if (isset($this->processedFunctions[$function])) { - continue; - } - - $this->processFunctionOrMethod(new ReflectionFunction($function)); - - $this->processedFunctions[$function] = true; - } - } - - private function processFunctionOrMethod(ReflectionFunctionAbstract $functionOrMethod): void - { - if ($functionOrMethod->isInternal()) { - return; - } - - $name = $functionOrMethod->getName(); - - if ($functionOrMethod instanceof ReflectionMethod) { - $name = $functionOrMethod->getDeclaringClass()->getName() . '::' . $name; - } - - if (!isset($this->lookupTable[$functionOrMethod->getFileName()])) { - $this->lookupTable[$functionOrMethod->getFileName()] = []; - } - - foreach (range($functionOrMethod->getStartLine(), $functionOrMethod->getEndLine()) as $line) { - $this->lookupTable[$functionOrMethod->getFileName()][$line] = $name; - } - } -} diff --git a/vendor/sebastian/code-unit/ChangeLog.md b/vendor/sebastian/code-unit/ChangeLog.md deleted file mode 100644 index 8b9c88b..0000000 --- a/vendor/sebastian/code-unit/ChangeLog.md +++ /dev/null @@ -1,78 +0,0 @@ -# ChangeLog - -All notable changes are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. - -## [2.0.0] - 2023-02-03 - -### Added - -* Added `SebastianBergmann\CodeUnit\FileUnit` value object that represents a sourcecode file - -### Removed - -* `SebastianBergmann\CodeUnit\CodeUnitCollection::fromArray()` has been removed -* `SebastianBergmann\CodeUnit\Mapper::stringToCodeUnits()` no longer supports `ClassName<*>` -* This component is no longer supported on PHP 7.3, PHP 7.4, and PHP 8.0 - -## [1.0.8] - 2020-10-26 - -### Fixed - -* `SebastianBergmann\CodeUnit\Exception` now correctly extends `\Throwable` - -## [1.0.7] - 2020-10-02 - -### Fixed - -* `SebastianBergmann\CodeUnit\Mapper::stringToCodeUnits()` no longer attempts to create `CodeUnit` objects for code units that are not declared in userland - -## [1.0.6] - 2020-09-28 - -### Changed - -* Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` - -## [1.0.5] - 2020-06-26 - -### Fixed - -* [#3](https://github.com/sebastianbergmann/code-unit/issues/3): Regression in 1.0.4 - -## [1.0.4] - 2020-06-26 - -### Added - -* This component is now supported on PHP 8 - -## [1.0.3] - 2020-06-15 - -### Changed - -* Tests etc. are now ignored for archive exports - -## [1.0.2] - 2020-04-30 - -### Fixed - -* `Mapper::stringToCodeUnits()` raised the wrong exception for `Class::method` when a class named `Class` exists but does not have a method named `method` - -## [1.0.1] - 2020-04-27 - -### Fixed - -* [#2](https://github.com/sebastianbergmann/code-unit/issues/2): `Mapper::stringToCodeUnits()` breaks when `ClassName` is used for class that extends built-in class - -## [1.0.0] - 2020-03-30 - -* Initial release - -[2.0.0]: https://github.com/sebastianbergmann/code-unit/compare/1.0.8...2.0.0 -[1.0.8]: https://github.com/sebastianbergmann/code-unit/compare/1.0.7...1.0.8 -[1.0.7]: https://github.com/sebastianbergmann/code-unit/compare/1.0.6...1.0.7 -[1.0.6]: https://github.com/sebastianbergmann/code-unit/compare/1.0.5...1.0.6 -[1.0.5]: https://github.com/sebastianbergmann/code-unit/compare/1.0.4...1.0.5 -[1.0.4]: https://github.com/sebastianbergmann/code-unit/compare/1.0.3...1.0.4 -[1.0.3]: https://github.com/sebastianbergmann/code-unit/compare/1.0.2...1.0.3 -[1.0.2]: https://github.com/sebastianbergmann/code-unit/compare/1.0.1...1.0.2 -[1.0.1]: https://github.com/sebastianbergmann/code-unit/compare/1.0.0...1.0.1 -[1.0.0]: https://github.com/sebastianbergmann/code-unit/compare/530c3900e5db9bcb8516da545bef0d62536cedaa...1.0.0 diff --git a/vendor/sebastian/code-unit/LICENSE b/vendor/sebastian/code-unit/LICENSE deleted file mode 100644 index 5716d96..0000000 --- a/vendor/sebastian/code-unit/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2020-2023, Sebastian Bergmann -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/sebastian/code-unit/README.md b/vendor/sebastian/code-unit/README.md deleted file mode 100644 index 95839c4..0000000 --- a/vendor/sebastian/code-unit/README.md +++ /dev/null @@ -1,22 +0,0 @@ -[![Latest Stable Version](https://poser.pugx.org/sebastian/code-unit/v/stable.png)](https://packagist.org/packages/sebastian/code-unit) -[![CI Status](https://github.com/sebastianbergmann/code-unit/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/code-unit/actions) -[![Type Coverage](https://shepherd.dev/github/sebastianbergmann/code-unit/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/code-unit) -[![codecov](https://codecov.io/gh/sebastianbergmann/code-unit/branch/main/graph/badge.svg)](https://codecov.io/gh/sebastianbergmann/code-unit) - -# sebastian/code-unit - -Collection of value objects that represent the PHP code units. - -## Installation - -You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - -``` -composer require sebastian/code-unit -``` - -If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - -``` -composer require --dev sebastian/code-unit -``` diff --git a/vendor/sebastian/code-unit/SECURITY.md b/vendor/sebastian/code-unit/SECURITY.md deleted file mode 100644 index d4ee967..0000000 --- a/vendor/sebastian/code-unit/SECURITY.md +++ /dev/null @@ -1,9 +0,0 @@ -# Security Policy - -This library is intended to be used in development environments only. For instance, it is used by the testing framework PHPUnit. There is no reason why this library should be installed on a webserver. - -**If you upload this library to a webserver then your deployment process is broken. On a more general note, if your `vendor` directory is publicly accessible on your webserver then your deployment process is also broken.** - -## Security Contact Information - -After the above, if you still would like to report a security vulnerability, please email `sebastian@phpunit.de`. diff --git a/vendor/sebastian/code-unit/composer.json b/vendor/sebastian/code-unit/composer.json deleted file mode 100644 index 8cec528..0000000 --- a/vendor/sebastian/code-unit/composer.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "name": "sebastian/code-unit", - "description": "Collection of value objects that represent the PHP code units", - "type": "library", - "homepage": "https://github.com/sebastianbergmann/code-unit", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit/issues" - }, - "prefer-stable": true, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "config": { - "platform": { - "php": "8.1.0" - }, - "optimize-autoloader": true, - "sort-packages": true - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "autoload-dev": { - "classmap": [ - "tests/_fixture" - ], - "files": [ - "tests/_fixture/file_with_multiple_code_units.php", - "tests/_fixture/function.php" - ] - }, - "extra": { - "branch-alias": { - "dev-main": "2.0-dev" - } - } -} diff --git a/vendor/sebastian/code-unit/src/ClassMethodUnit.php b/vendor/sebastian/code-unit/src/ClassMethodUnit.php deleted file mode 100644 index f9ddac2..0000000 --- a/vendor/sebastian/code-unit/src/ClassMethodUnit.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeUnit; - -/** - * @psalm-immutable - */ -final class ClassMethodUnit extends CodeUnit -{ - /** - * @psalm-assert-if-true ClassMethodUnit $this - */ - public function isClassMethod(): bool - { - return true; - } -} diff --git a/vendor/sebastian/code-unit/src/ClassUnit.php b/vendor/sebastian/code-unit/src/ClassUnit.php deleted file mode 100644 index 3ba0ee6..0000000 --- a/vendor/sebastian/code-unit/src/ClassUnit.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeUnit; - -/** - * @psalm-immutable - */ -final class ClassUnit extends CodeUnit -{ - /** - * @psalm-assert-if-true ClassUnit $this - */ - public function isClass(): bool - { - return true; - } -} diff --git a/vendor/sebastian/code-unit/src/CodeUnit.php b/vendor/sebastian/code-unit/src/CodeUnit.php deleted file mode 100644 index ced52b4..0000000 --- a/vendor/sebastian/code-unit/src/CodeUnit.php +++ /dev/null @@ -1,478 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeUnit; - -use function count; -use function file; -use function file_exists; -use function is_readable; -use function range; -use function sprintf; -use ReflectionClass; -use ReflectionFunction; -use ReflectionMethod; - -/** - * @psalm-immutable - */ -abstract class CodeUnit -{ - private readonly string $name; - private readonly string $sourceFileName; - - /** - * @psalm-var list - */ - private readonly array $sourceLines; - - /** - * @psalm-param class-string $className - * - * @throws InvalidCodeUnitException - * @throws ReflectionException - */ - public static function forClass(string $className): ClassUnit - { - self::ensureUserDefinedClass($className); - - $reflector = self::reflectorForClass($className); - - return new ClassUnit( - $className, - $reflector->getFileName(), - range( - $reflector->getStartLine(), - $reflector->getEndLine() - ) - ); - } - - /** - * @psalm-param class-string $className - * - * @throws InvalidCodeUnitException - * @throws ReflectionException - */ - public static function forClassMethod(string $className, string $methodName): ClassMethodUnit - { - self::ensureUserDefinedClass($className); - - $reflector = self::reflectorForClassMethod($className, $methodName); - - return new ClassMethodUnit( - $className . '::' . $methodName, - $reflector->getFileName(), - range( - $reflector->getStartLine(), - $reflector->getEndLine() - ) - ); - } - - /** - * @throws InvalidCodeUnitException - */ - public static function forFileWithAbsolutePath(string $path): FileUnit - { - self::ensureFileExistsAndIsReadable($path); - - return new FileUnit( - $path, - $path, - range( - 1, - count(file($path)) - ) - ); - } - - /** - * @psalm-param class-string $interfaceName - * - * @throws InvalidCodeUnitException - * @throws ReflectionException - */ - public static function forInterface(string $interfaceName): InterfaceUnit - { - self::ensureUserDefinedInterface($interfaceName); - - $reflector = self::reflectorForClass($interfaceName); - - return new InterfaceUnit( - $interfaceName, - $reflector->getFileName(), - range( - $reflector->getStartLine(), - $reflector->getEndLine() - ) - ); - } - - /** - * @psalm-param class-string $interfaceName - * - * @throws InvalidCodeUnitException - * @throws ReflectionException - */ - public static function forInterfaceMethod(string $interfaceName, string $methodName): InterfaceMethodUnit - { - self::ensureUserDefinedInterface($interfaceName); - - $reflector = self::reflectorForClassMethod($interfaceName, $methodName); - - return new InterfaceMethodUnit( - $interfaceName . '::' . $methodName, - $reflector->getFileName(), - range( - $reflector->getStartLine(), - $reflector->getEndLine() - ) - ); - } - - /** - * @psalm-param class-string $traitName - * - * @throws InvalidCodeUnitException - * @throws ReflectionException - */ - public static function forTrait(string $traitName): TraitUnit - { - self::ensureUserDefinedTrait($traitName); - - $reflector = self::reflectorForClass($traitName); - - return new TraitUnit( - $traitName, - $reflector->getFileName(), - range( - $reflector->getStartLine(), - $reflector->getEndLine() - ) - ); - } - - /** - * @psalm-param class-string $traitName - * - * @throws InvalidCodeUnitException - * @throws ReflectionException - */ - public static function forTraitMethod(string $traitName, string $methodName): TraitMethodUnit - { - self::ensureUserDefinedTrait($traitName); - - $reflector = self::reflectorForClassMethod($traitName, $methodName); - - return new TraitMethodUnit( - $traitName . '::' . $methodName, - $reflector->getFileName(), - range( - $reflector->getStartLine(), - $reflector->getEndLine() - ) - ); - } - - /** - * @psalm-param callable-string $functionName - * - * @throws InvalidCodeUnitException - * @throws ReflectionException - */ - public static function forFunction(string $functionName): FunctionUnit - { - $reflector = self::reflectorForFunction($functionName); - - if (!$reflector->isUserDefined()) { - throw new InvalidCodeUnitException( - sprintf( - '"%s" is not a user-defined function', - $functionName - ) - ); - } - - return new FunctionUnit( - $functionName, - $reflector->getFileName(), - range( - $reflector->getStartLine(), - $reflector->getEndLine() - ) - ); - } - - /** - * @psalm-param list $sourceLines - */ - private function __construct(string $name, string $sourceFileName, array $sourceLines) - { - $this->name = $name; - $this->sourceFileName = $sourceFileName; - $this->sourceLines = $sourceLines; - } - - public function name(): string - { - return $this->name; - } - - public function sourceFileName(): string - { - return $this->sourceFileName; - } - - /** - * @psalm-return list - */ - public function sourceLines(): array - { - return $this->sourceLines; - } - - public function isClass(): bool - { - return false; - } - - public function isClassMethod(): bool - { - return false; - } - - public function isInterface(): bool - { - return false; - } - - public function isInterfaceMethod(): bool - { - return false; - } - - public function isTrait(): bool - { - return false; - } - - public function isTraitMethod(): bool - { - return false; - } - - public function isFunction(): bool - { - return false; - } - - public function isFile(): bool - { - return false; - } - - /** - * @throws InvalidCodeUnitException - */ - private static function ensureFileExistsAndIsReadable(string $path): void - { - if (!(file_exists($path) && is_readable($path))) { - throw new InvalidCodeUnitException( - sprintf( - 'File "%s" does not exist or is not readable', - $path - ) - ); - } - } - - /** - * @psalm-param class-string $className - * - * @throws InvalidCodeUnitException - */ - private static function ensureUserDefinedClass(string $className): void - { - try { - $reflector = new ReflectionClass($className); - - if ($reflector->isInterface()) { - throw new InvalidCodeUnitException( - sprintf( - '"%s" is an interface and not a class', - $className - ) - ); - } - - if ($reflector->isTrait()) { - throw new InvalidCodeUnitException( - sprintf( - '"%s" is a trait and not a class', - $className - ) - ); - } - - if (!$reflector->isUserDefined()) { - throw new InvalidCodeUnitException( - sprintf( - '"%s" is not a user-defined class', - $className - ) - ); - } - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new ReflectionException( - $e->getMessage(), - $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - } - - /** - * @psalm-param class-string $interfaceName - * - * @throws InvalidCodeUnitException - */ - private static function ensureUserDefinedInterface(string $interfaceName): void - { - try { - $reflector = new ReflectionClass($interfaceName); - - if (!$reflector->isInterface()) { - throw new InvalidCodeUnitException( - sprintf( - '"%s" is not an interface', - $interfaceName - ) - ); - } - - if (!$reflector->isUserDefined()) { - throw new InvalidCodeUnitException( - sprintf( - '"%s" is not a user-defined interface', - $interfaceName - ) - ); - } - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new ReflectionException( - $e->getMessage(), - $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - } - - /** - * @psalm-param class-string $traitName - * - * @throws InvalidCodeUnitException - */ - private static function ensureUserDefinedTrait(string $traitName): void - { - try { - $reflector = new ReflectionClass($traitName); - - if (!$reflector->isTrait()) { - throw new InvalidCodeUnitException( - sprintf( - '"%s" is not a trait', - $traitName - ) - ); - } - - // @codeCoverageIgnoreStart - if (!$reflector->isUserDefined()) { - throw new InvalidCodeUnitException( - sprintf( - '"%s" is not a user-defined trait', - $traitName - ) - ); - } - } catch (\ReflectionException $e) { - throw new ReflectionException( - $e->getMessage(), - $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - } - - /** - * @psalm-param class-string $className - * - * @throws ReflectionException - */ - private static function reflectorForClass(string $className): ReflectionClass - { - try { - return new ReflectionClass($className); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new ReflectionException( - $e->getMessage(), - $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - } - - /** - * @psalm-param class-string $className - * - * @throws ReflectionException - */ - private static function reflectorForClassMethod(string $className, string $methodName): ReflectionMethod - { - try { - return new ReflectionMethod($className, $methodName); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new ReflectionException( - $e->getMessage(), - $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - } - - /** - * @psalm-param callable-string $functionName - * - * @throws ReflectionException - */ - private static function reflectorForFunction(string $functionName): ReflectionFunction - { - try { - return new ReflectionFunction($functionName); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new ReflectionException( - $e->getMessage(), - $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - } -} diff --git a/vendor/sebastian/code-unit/src/CodeUnitCollection.php b/vendor/sebastian/code-unit/src/CodeUnitCollection.php deleted file mode 100644 index a23a7c4..0000000 --- a/vendor/sebastian/code-unit/src/CodeUnitCollection.php +++ /dev/null @@ -1,74 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeUnit; - -use function array_merge; -use function count; -use Countable; -use IteratorAggregate; - -/** - * @template-implements IteratorAggregate - * - * @psalm-immutable - */ -final class CodeUnitCollection implements Countable, IteratorAggregate -{ - /** - * @psalm-var list - */ - private readonly array $codeUnits; - - public static function fromList(CodeUnit ...$codeUnits): self - { - return new self($codeUnits); - } - - /** - * @psalm-param list $codeUnits - */ - private function __construct(array $codeUnits) - { - $this->codeUnits = $codeUnits; - } - - /** - * @psalm-return list - */ - public function asArray(): array - { - return $this->codeUnits; - } - - public function getIterator(): CodeUnitCollectionIterator - { - return new CodeUnitCollectionIterator($this); - } - - public function count(): int - { - return count($this->codeUnits); - } - - public function isEmpty(): bool - { - return empty($this->codeUnits); - } - - public function mergeWith(self $other): self - { - return new self( - array_merge( - $this->asArray(), - $other->asArray() - ) - ); - } -} diff --git a/vendor/sebastian/code-unit/src/CodeUnitCollectionIterator.php b/vendor/sebastian/code-unit/src/CodeUnitCollectionIterator.php deleted file mode 100644 index f04bd65..0000000 --- a/vendor/sebastian/code-unit/src/CodeUnitCollectionIterator.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeUnit; - -use Iterator; - -/** - * @template-implements Iterator - */ -final class CodeUnitCollectionIterator implements Iterator -{ - /** - * @psalm-var list - */ - private array $codeUnits; - private int $position = 0; - - public function __construct(CodeUnitCollection $collection) - { - $this->codeUnits = $collection->asArray(); - } - - public function rewind(): void - { - $this->position = 0; - } - - public function valid(): bool - { - return isset($this->codeUnits[$this->position]); - } - - public function key(): int - { - return $this->position; - } - - public function current(): CodeUnit - { - return $this->codeUnits[$this->position]; - } - - public function next(): void - { - $this->position++; - } -} diff --git a/vendor/sebastian/code-unit/src/FileUnit.php b/vendor/sebastian/code-unit/src/FileUnit.php deleted file mode 100644 index 3bd9a36..0000000 --- a/vendor/sebastian/code-unit/src/FileUnit.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeUnit; - -/** - * @psalm-immutable - */ -final class FileUnit extends CodeUnit -{ - /** - * @psalm-assert-if-true FileUnit $this - */ - public function isFile(): bool - { - return true; - } -} diff --git a/vendor/sebastian/code-unit/src/FunctionUnit.php b/vendor/sebastian/code-unit/src/FunctionUnit.php deleted file mode 100644 index df76cf1..0000000 --- a/vendor/sebastian/code-unit/src/FunctionUnit.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeUnit; - -/** - * @psalm-immutable - */ -final class FunctionUnit extends CodeUnit -{ - /** - * @psalm-assert-if-true FunctionUnit $this - */ - public function isFunction(): bool - { - return true; - } -} diff --git a/vendor/sebastian/code-unit/src/InterfaceMethodUnit.php b/vendor/sebastian/code-unit/src/InterfaceMethodUnit.php deleted file mode 100644 index fcd44f4..0000000 --- a/vendor/sebastian/code-unit/src/InterfaceMethodUnit.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeUnit; - -/** - * @psalm-immutable - */ -final class InterfaceMethodUnit extends CodeUnit -{ - /** - * @psalm-assert-if-true InterfaceMethod $this - */ - public function isInterfaceMethod(): bool - { - return true; - } -} diff --git a/vendor/sebastian/code-unit/src/InterfaceUnit.php b/vendor/sebastian/code-unit/src/InterfaceUnit.php deleted file mode 100644 index 5cf585b..0000000 --- a/vendor/sebastian/code-unit/src/InterfaceUnit.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeUnit; - -/** - * @psalm-immutable - */ -final class InterfaceUnit extends CodeUnit -{ - /** - * @psalm-assert-if-true InterfaceUnit $this - */ - public function isInterface(): bool - { - return true; - } -} diff --git a/vendor/sebastian/code-unit/src/Mapper.php b/vendor/sebastian/code-unit/src/Mapper.php deleted file mode 100644 index ad11259..0000000 --- a/vendor/sebastian/code-unit/src/Mapper.php +++ /dev/null @@ -1,259 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeUnit; - -use function array_keys; -use function array_merge; -use function array_unique; -use function array_values; -use function class_exists; -use function explode; -use function function_exists; -use function interface_exists; -use function ksort; -use function method_exists; -use function sort; -use function sprintf; -use function str_contains; -use function trait_exists; -use ReflectionClass; -use ReflectionFunction; -use ReflectionMethod; - -final class Mapper -{ - /** - * @psalm-return array> - */ - public function codeUnitsToSourceLines(CodeUnitCollection $codeUnits): array - { - $result = []; - - foreach ($codeUnits as $codeUnit) { - $sourceFileName = $codeUnit->sourceFileName(); - - if (!isset($result[$sourceFileName])) { - $result[$sourceFileName] = []; - } - - $result[$sourceFileName] = array_merge($result[$sourceFileName], $codeUnit->sourceLines()); - } - - foreach (array_keys($result) as $sourceFileName) { - $result[$sourceFileName] = array_values(array_unique($result[$sourceFileName])); - - sort($result[$sourceFileName]); - } - - ksort($result); - - return $result; - } - - /** - * @throws InvalidCodeUnitException - * @throws ReflectionException - */ - public function stringToCodeUnits(string $unit): CodeUnitCollection - { - if (str_contains($unit, '::')) { - [$firstPart, $secondPart] = explode('::', $unit); - - if ($this->isUserDefinedFunction($secondPart)) { - return CodeUnitCollection::fromList(CodeUnit::forFunction($secondPart)); - } - - if ($this->isUserDefinedMethod($firstPart, $secondPart)) { - return CodeUnitCollection::fromList(CodeUnit::forClassMethod($firstPart, $secondPart)); - } - - if ($this->isUserDefinedInterface($firstPart)) { - return CodeUnitCollection::fromList(CodeUnit::forInterfaceMethod($firstPart, $secondPart)); - } - - if ($this->isUserDefinedTrait($firstPart)) { - return CodeUnitCollection::fromList(CodeUnit::forTraitMethod($firstPart, $secondPart)); - } - } else { - if ($this->isUserDefinedClass($unit)) { - $units = [CodeUnit::forClass($unit)]; - - foreach ($this->reflectorForClass($unit)->getTraits() as $trait) { - if (!$trait->isUserDefined()) { - // @codeCoverageIgnoreStart - continue; - // @codeCoverageIgnoreEnd - } - - $units[] = CodeUnit::forTrait($trait->getName()); - } - - return CodeUnitCollection::fromList(...$units); - } - - if ($this->isUserDefinedInterface($unit)) { - return CodeUnitCollection::fromList(CodeUnit::forInterface($unit)); - } - - if ($this->isUserDefinedTrait($unit)) { - return CodeUnitCollection::fromList(CodeUnit::forTrait($unit)); - } - - if ($this->isUserDefinedFunction($unit)) { - return CodeUnitCollection::fromList(CodeUnit::forFunction($unit)); - } - } - - throw new InvalidCodeUnitException( - sprintf( - '"%s" is not a valid code unit', - $unit - ) - ); - } - - /** - * @psalm-param class-string $className - * - * @throws ReflectionException - */ - private function reflectorForClass(string $className): ReflectionClass - { - try { - return new ReflectionClass($className); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new ReflectionException( - $e->getMessage(), - $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - } - - /** - * @throws ReflectionException - */ - private function isUserDefinedFunction(string $functionName): bool - { - if (!function_exists($functionName)) { - return false; - } - - try { - return (new ReflectionFunction($functionName))->isUserDefined(); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new ReflectionException( - $e->getMessage(), - $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - } - - /** - * @throws ReflectionException - */ - private function isUserDefinedClass(string $className): bool - { - if (!class_exists($className)) { - return false; - } - - try { - return (new ReflectionClass($className))->isUserDefined(); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new ReflectionException( - $e->getMessage(), - $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - } - - /** - * @throws ReflectionException - */ - private function isUserDefinedInterface(string $interfaceName): bool - { - if (!interface_exists($interfaceName)) { - return false; - } - - try { - return (new ReflectionClass($interfaceName))->isUserDefined(); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new ReflectionException( - $e->getMessage(), - $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - } - - /** - * @throws ReflectionException - */ - private function isUserDefinedTrait(string $traitName): bool - { - if (!trait_exists($traitName)) { - return false; - } - - try { - return (new ReflectionClass($traitName))->isUserDefined(); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new ReflectionException( - $e->getMessage(), - $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - } - - /** - * @throws ReflectionException - */ - private function isUserDefinedMethod(string $className, string $methodName): bool - { - if (!class_exists($className)) { - // @codeCoverageIgnoreStart - return false; - // @codeCoverageIgnoreEnd - } - - if (!method_exists($className, $methodName)) { - // @codeCoverageIgnoreStart - return false; - // @codeCoverageIgnoreEnd - } - - try { - return (new ReflectionMethod($className, $methodName))->isUserDefined(); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new ReflectionException( - $e->getMessage(), - $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - } -} diff --git a/vendor/sebastian/code-unit/src/TraitMethodUnit.php b/vendor/sebastian/code-unit/src/TraitMethodUnit.php deleted file mode 100644 index a58f724..0000000 --- a/vendor/sebastian/code-unit/src/TraitMethodUnit.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeUnit; - -/** - * @psalm-immutable - */ -final class TraitMethodUnit extends CodeUnit -{ - /** - * @psalm-assert-if-true TraitMethodUnit $this - */ - public function isTraitMethod(): bool - { - return true; - } -} diff --git a/vendor/sebastian/code-unit/src/TraitUnit.php b/vendor/sebastian/code-unit/src/TraitUnit.php deleted file mode 100644 index abddfc1..0000000 --- a/vendor/sebastian/code-unit/src/TraitUnit.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeUnit; - -/** - * @psalm-immutable - */ -final class TraitUnit extends CodeUnit -{ - /** - * @psalm-assert-if-true TraitUnit $this - */ - public function isTrait(): bool - { - return true; - } -} diff --git a/vendor/sebastian/code-unit/src/exceptions/Exception.php b/vendor/sebastian/code-unit/src/exceptions/Exception.php deleted file mode 100644 index 74d0eee..0000000 --- a/vendor/sebastian/code-unit/src/exceptions/Exception.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeUnit; - -use Throwable; - -interface Exception extends Throwable -{ -} diff --git a/vendor/sebastian/code-unit/src/exceptions/InvalidCodeUnitException.php b/vendor/sebastian/code-unit/src/exceptions/InvalidCodeUnitException.php deleted file mode 100644 index 60a3da8..0000000 --- a/vendor/sebastian/code-unit/src/exceptions/InvalidCodeUnitException.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeUnit; - -use RuntimeException; - -final class InvalidCodeUnitException extends RuntimeException implements Exception -{ -} diff --git a/vendor/sebastian/code-unit/src/exceptions/NoTraitException.php b/vendor/sebastian/code-unit/src/exceptions/NoTraitException.php deleted file mode 100644 index e9b9b9c..0000000 --- a/vendor/sebastian/code-unit/src/exceptions/NoTraitException.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeUnit; - -use RuntimeException; - -final class NoTraitException extends RuntimeException implements Exception -{ -} diff --git a/vendor/sebastian/code-unit/src/exceptions/ReflectionException.php b/vendor/sebastian/code-unit/src/exceptions/ReflectionException.php deleted file mode 100644 index 2320127..0000000 --- a/vendor/sebastian/code-unit/src/exceptions/ReflectionException.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeUnit; - -use RuntimeException; - -final class ReflectionException extends RuntimeException implements Exception -{ -} diff --git a/vendor/sebastian/comparator/ChangeLog.md b/vendor/sebastian/comparator/ChangeLog.md deleted file mode 100644 index bdd88fd..0000000 --- a/vendor/sebastian/comparator/ChangeLog.md +++ /dev/null @@ -1,199 +0,0 @@ -# ChangeLog - -All notable changes are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. - -## [5.0.5] - 2026-01-24 - -### Changed - -* [#134](https://github.com/sebastianbergmann/comparator/issues/134): Suppress warning introduced in PHP 8.5 - -## [5.0.4] - 2025-09-07 - -### Changed - -* Do not use `SplObjectStorage` methods that will be deprecated in PHP 8.5 - -## [5.0.3] - 2024-10-18 - -### Fixed - -* Reverted [#113](https://github.com/sebastianbergmann/comparator/pull/113) as it broke backward compatibility - -## [5.0.2] - 2024-08-12 - -### Fixed - -* [#112](https://github.com/sebastianbergmann/comparator/issues/112): Arrays with different keys and the same values are considered equal in canonicalize mode - -## [5.0.1] - 2023-08-14 - -### Fixed - -* `MockObjectComparator` only works on instances of `PHPUnit\Framework\MockObject\MockObject`, but not on instances of `PHPUnit\Framework\MockObject\Stub` -* `MockObjectComparator` only ignores the `$__phpunit_invocationMocker` property, but not other properties with names prefixed with `__phpunit_` - -## [5.0.0] - 2023-02-03 - -### Changed - -* Methods now have parameter and return type declarations -* `Comparator::$factory` is now private, use `Comparator::factory()` instead -* `ComparisonFailure`, `DOMNodeComparator`, `DateTimeComparator`, `ExceptionComparator`, `MockObjectComparator`, `NumericComparator`, `ResourceComparator`, `SplObjectStorageComparator`, and `TypeComparator` are now `final` -* `ScalarComparator` and `DOMNodeComparator` now use `mb_strtolower($string, 'UTF-8')` instead of `strtolower($string)` - -### Removed - -* Removed `$identical` parameter from `ComparisonFailure::__construct()` -* Removed `Comparator::$exporter` -* Removed support for PHP 7.3, PHP 7.4, and PHP 8.0 - -## [4.0.8] - 2022-09-14 - -### Fixed - -* [#102](https://github.com/sebastianbergmann/comparator/pull/102): Fix `float` comparison precision - -## [4.0.7] - 2022-09-14 - -### Fixed - -* [#99](https://github.com/sebastianbergmann/comparator/pull/99): Fix weak comparison between `'0'` and `false` - -## [4.0.6] - 2020-10-26 - -### Fixed - -* `SebastianBergmann\Comparator\Exception` now correctly extends `\Throwable` - -## [4.0.5] - 2020-09-30 - -### Fixed - -* [#89](https://github.com/sebastianbergmann/comparator/pull/89): Handle PHP 8 `ValueError` - -## [4.0.4] - 2020-09-28 - -### Changed - -* Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` - -## [4.0.3] - 2020-06-26 - -### Added - -* This component is now supported on PHP 8 - -## [4.0.2] - 2020-06-15 - -### Fixed - -* [#85](https://github.com/sebastianbergmann/comparator/issues/85): Version 4.0.1 breaks backward compatibility - -## [4.0.1] - 2020-06-15 - -### Changed - -* Tests etc. are now ignored for archive exports - -## [4.0.0] - 2020-02-07 - -### Removed - -* Removed support for PHP 7.1 and PHP 7.2 - -## [3.0.5] - 2022-09-14 - -### Fixed - -* [#102](https://github.com/sebastianbergmann/comparator/pull/102): Fix `float` comparison precision - -## [3.0.4] - 2022-09-14 - -### Fixed - -* [#99](https://github.com/sebastianbergmann/comparator/pull/99): Fix weak comparison between `'0'` and `false` - -## [3.0.3] - 2020-11-30 - -### Changed - -* Changed PHP version constraint in `composer.json` from `^7.1` to `>=7.1` - -## [3.0.2] - 2018-07-12 - -### Changed - -* By default, `MockObjectComparator` is now tried before all other (default) comparators - -## [3.0.1] - 2018-06-14 - -### Fixed - -* [#53](https://github.com/sebastianbergmann/comparator/pull/53): `DOMNodeComparator` ignores `$ignoreCase` parameter -* [#58](https://github.com/sebastianbergmann/comparator/pull/58): `ScalarComparator` does not handle extremely ugly string comparison edge cases - -## [3.0.0] - 2018-04-18 - -### Fixed - -* [#48](https://github.com/sebastianbergmann/comparator/issues/48): `DateTimeComparator` does not support fractional second deltas - -### Removed - -* Removed support for PHP 7.0 - -## [2.1.3] - 2018-02-01 - -### Changed - -* This component is now compatible with version 3 of `sebastian/diff` - -## [2.1.2] - 2018-01-12 - -### Fixed - -* Fix comparison of `DateTimeImmutable` objects - -## [2.1.1] - 2017-12-22 - -### Fixed - -* [phpunit/#2923](https://github.com/sebastianbergmann/phpunit/issues/2923): Unexpected failed date matching - -## [2.1.0] - 2017-11-03 - -### Added - -* Added `SebastianBergmann\Comparator\Factory::reset()` to unregister all non-default comparators -* Added support for `phpunit/phpunit-mock-objects` version `^5.0` - -[5.0.5]: https://github.com/sebastianbergmann/comparator/compare/5.0.4...5.0.5 -[5.0.4]: https://github.com/sebastianbergmann/comparator/compare/5.0.3...5.0.4 -[5.0.3]: https://github.com/sebastianbergmann/comparator/compare/5.0.2...5.0.3 -[5.0.2]: https://github.com/sebastianbergmann/comparator/compare/5.0.1...5.0.2 -[5.0.1]: https://github.com/sebastianbergmann/comparator/compare/5.0.0...5.0.1 -[5.0.0]: https://github.com/sebastianbergmann/comparator/compare/4.0...5.0.0 -[4.0.10]: https://github.com/sebastianbergmann/comparator/compare/4.0.9...4.0.10 -[4.0.9]: https://github.com/sebastianbergmann/comparator/compare/4.0.8...4.0.9 -[4.0.8]: https://github.com/sebastianbergmann/comparator/compare/4.0.7...4.0.8 -[4.0.7]: https://github.com/sebastianbergmann/comparator/compare/4.0.6...4.0.7 -[4.0.6]: https://github.com/sebastianbergmann/comparator/compare/4.0.5...4.0.6 -[4.0.5]: https://github.com/sebastianbergmann/comparator/compare/4.0.4...4.0.5 -[4.0.4]: https://github.com/sebastianbergmann/comparator/compare/4.0.3...4.0.4 -[4.0.3]: https://github.com/sebastianbergmann/comparator/compare/4.0.2...4.0.3 -[4.0.2]: https://github.com/sebastianbergmann/comparator/compare/4.0.1...4.0.2 -[4.0.1]: https://github.com/sebastianbergmann/comparator/compare/4.0.0...4.0.1 -[4.0.0]: https://github.com/sebastianbergmann/comparator/compare/3.0...4.0.0 -[3.0.7]: https://github.com/sebastianbergmann/comparator/compare/3.0.6...3.0.7 -[3.0.6]: https://github.com/sebastianbergmann/comparator/compare/3.0.5...3.0.6 -[3.0.5]: https://github.com/sebastianbergmann/comparator/compare/3.0.4...3.0.5 -[3.0.4]: https://github.com/sebastianbergmann/comparator/compare/3.0.3...3.0.4 -[3.0.3]: https://github.com/sebastianbergmann/comparator/compare/3.0.2...3.0.3 -[3.0.2]: https://github.com/sebastianbergmann/comparator/compare/3.0.1...3.0.2 -[3.0.1]: https://github.com/sebastianbergmann/comparator/compare/3.0.0...3.0.1 -[3.0.0]: https://github.com/sebastianbergmann/comparator/compare/2.1.3...3.0.0 -[2.1.3]: https://github.com/sebastianbergmann/comparator/compare/2.1.2...2.1.3 -[2.1.2]: https://github.com/sebastianbergmann/comparator/compare/2.1.1...2.1.2 -[2.1.1]: https://github.com/sebastianbergmann/comparator/compare/2.1.0...2.1.1 -[2.1.0]: https://github.com/sebastianbergmann/comparator/compare/2.0.2...2.1.0 diff --git a/vendor/sebastian/comparator/LICENSE b/vendor/sebastian/comparator/LICENSE deleted file mode 100644 index c5268a9..0000000 --- a/vendor/sebastian/comparator/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2002-2025, Sebastian Bergmann -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/sebastian/comparator/README.md b/vendor/sebastian/comparator/README.md deleted file mode 100644 index edce75d..0000000 --- a/vendor/sebastian/comparator/README.md +++ /dev/null @@ -1,43 +0,0 @@ -[![Latest Stable Version](https://poser.pugx.org/sebastian/comparator/v/stable.png)](https://packagist.org/packages/sebastian/comparator) -[![CI Status](https://github.com/sebastianbergmann/comparator/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/comparator/actions) -[![Type Coverage](https://shepherd.dev/github/sebastianbergmann/comparator/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/comparator) -[![codecov](https://codecov.io/gh/sebastianbergmann/comparator/branch/main/graph/badge.svg)](https://codecov.io/gh/sebastianbergmann/comparator) - -# sebastian/comparator - -This component provides the functionality to compare PHP values for equality. - -## Installation - -You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - -``` -composer require sebastian/comparator -``` - -If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - -``` -composer require --dev sebastian/comparator -``` - -## Usage - -```php -getComparatorFor($date1, $date2); - -try { - $comparator->assertEquals($date1, $date2); - print "Dates match"; -} catch (ComparisonFailure $failure) { - print "Dates don't match"; -} -``` diff --git a/vendor/sebastian/comparator/SECURITY.md b/vendor/sebastian/comparator/SECURITY.md deleted file mode 100644 index d88ff00..0000000 --- a/vendor/sebastian/comparator/SECURITY.md +++ /dev/null @@ -1,30 +0,0 @@ -# Security Policy - -If you believe you have found a security vulnerability in the library that is developed in this repository, please report it to us through coordinated disclosure. - -**Please do not report security vulnerabilities through public GitHub issues, discussions, or pull requests.** - -Instead, please email `sebastian@phpunit.de`. - -Please include as much of the information listed below as you can to help us better understand and resolve the issue: - -* The type of issue -* Full paths of source file(s) related to the manifestation of the issue -* The location of the affected source code (tag/branch/commit or direct URL) -* Any special configuration required to reproduce the issue -* Step-by-step instructions to reproduce the issue -* Proof-of-concept or exploit code (if possible) -* Impact of the issue, including how an attacker might exploit the issue - -This information will help us triage your report more quickly. - -## Web Context - -The library that is developed in this repository was either extracted from [PHPUnit](https://github.com/sebastianbergmann/phpunit) or developed specifically as a dependency for PHPUnit. - -The library is developed with a focus on development environments and the command-line. No specific testing or hardening with regard to using the library in an HTTP or web context or with untrusted input data is performed. The library might also contain functionality that intentionally exposes internal application data for debugging purposes. - -If the library is used in a web application, the application developer is responsible for filtering inputs or escaping outputs as necessary and for verifying that the used functionality is safe for use within the intended context. - -Vulnerabilities specific to the use outside a development context will be fixed as applicable, provided that the fix does not have an averse effect on the primary use case for development purposes. - diff --git a/vendor/sebastian/comparator/composer.json b/vendor/sebastian/comparator/composer.json deleted file mode 100644 index 16bf525..0000000 --- a/vendor/sebastian/comparator/composer.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "name": "sebastian/comparator", - "description": "Provides the functionality to compare PHP values for equality", - "keywords": ["comparator","compare","equality"], - "homepage": "https://github.com/sebastianbergmann/comparator", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - } - ], - "support": { - "issues": "https://github.com/sebastianbergmann/comparator/issues", - "security": "https://github.com/sebastianbergmann/comparator/security/policy" - }, - "prefer-stable": true, - "require": { - "php": ">=8.1", - "sebastian/diff": "^5.0", - "sebastian/exporter": "^5.0", - "ext-dom": "*", - "ext-mbstring": "*" - }, - "require-dev": { - "phpunit/phpunit": "^10.5" - }, - "config": { - "platform": { - "php": "8.1.0" - }, - "optimize-autoloader": true, - "sort-packages": true - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "autoload-dev": { - "classmap": [ - "tests/_fixture" - ] - }, - "extra": { - "branch-alias": { - "dev-main": "5.0-dev" - } - } -} - diff --git a/vendor/sebastian/comparator/src/ArrayComparator.php b/vendor/sebastian/comparator/src/ArrayComparator.php deleted file mode 100644 index 7550832..0000000 --- a/vendor/sebastian/comparator/src/ArrayComparator.php +++ /dev/null @@ -1,127 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Comparator; - -use function array_key_exists; -use function assert; -use function is_array; -use function sort; -use function sprintf; -use function str_replace; -use function trim; -use SebastianBergmann\Exporter\Exporter; - -/** - * Arrays are equal if they contain the same key-value pairs. - * The order of the keys does not matter. - * The types of key-value pairs do not matter. - */ -class ArrayComparator extends Comparator -{ - public function accepts(mixed $expected, mixed $actual): bool - { - return is_array($expected) && is_array($actual); - } - - /** - * @throws ComparisonFailure - */ - public function assertEquals(mixed $expected, mixed $actual, float $delta = 0.0, bool $canonicalize = false, bool $ignoreCase = false, array &$processed = []): void - { - assert(is_array($expected)); - assert(is_array($actual)); - - if ($canonicalize) { - sort($expected); - sort($actual); - } - - $remaining = $actual; - $actualAsString = "Array (\n"; - $expectedAsString = "Array (\n"; - $equal = true; - $exporter = new Exporter; - - foreach ($expected as $key => $value) { - unset($remaining[$key]); - - if (!array_key_exists($key, $actual)) { - $expectedAsString .= sprintf( - " %s => %s\n", - $exporter->export($key), - $exporter->shortenedExport($value), - ); - - $equal = false; - - continue; - } - - try { - $comparator = $this->factory()->getComparatorFor($value, $actual[$key]); - $comparator->assertEquals($value, $actual[$key], $delta, $canonicalize, $ignoreCase, $processed); - - $expectedAsString .= sprintf( - " %s => %s\n", - $exporter->export($key), - $exporter->shortenedExport($value), - ); - - $actualAsString .= sprintf( - " %s => %s\n", - $exporter->export($key), - $exporter->shortenedExport($actual[$key]), - ); - } catch (ComparisonFailure $e) { - $expectedAsString .= sprintf( - " %s => %s\n", - $exporter->export($key), - $e->getExpectedAsString() ? $this->indent($e->getExpectedAsString()) : $exporter->shortenedExport($e->getExpected()), - ); - - $actualAsString .= sprintf( - " %s => %s\n", - $exporter->export($key), - $e->getActualAsString() ? $this->indent($e->getActualAsString()) : $exporter->shortenedExport($e->getActual()), - ); - - $equal = false; - } - } - - foreach ($remaining as $key => $value) { - $actualAsString .= sprintf( - " %s => %s\n", - $exporter->export($key), - $exporter->shortenedExport($value), - ); - - $equal = false; - } - - $expectedAsString .= ')'; - $actualAsString .= ')'; - - if (!$equal) { - throw new ComparisonFailure( - $expected, - $actual, - $expectedAsString, - $actualAsString, - 'Failed asserting that two arrays are equal.', - ); - } - } - - private function indent(string $lines): string - { - return trim(str_replace("\n", "\n ", $lines)); - } -} diff --git a/vendor/sebastian/comparator/src/Comparator.php b/vendor/sebastian/comparator/src/Comparator.php deleted file mode 100644 index 69347ef..0000000 --- a/vendor/sebastian/comparator/src/Comparator.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Comparator; - -abstract class Comparator -{ - private Factory $factory; - - public function setFactory(Factory $factory): void - { - $this->factory = $factory; - } - - abstract public function accepts(mixed $expected, mixed $actual): bool; - - /** - * @throws ComparisonFailure - */ - abstract public function assertEquals(mixed $expected, mixed $actual, float $delta = 0.0, bool $canonicalize = false, bool $ignoreCase = false): void; - - protected function factory(): Factory - { - return $this->factory; - } -} diff --git a/vendor/sebastian/comparator/src/ComparisonFailure.php b/vendor/sebastian/comparator/src/ComparisonFailure.php deleted file mode 100644 index b5c2ac2..0000000 --- a/vendor/sebastian/comparator/src/ComparisonFailure.php +++ /dev/null @@ -1,68 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Comparator; - -use RuntimeException; -use SebastianBergmann\Diff\Differ; -use SebastianBergmann\Diff\Output\UnifiedDiffOutputBuilder; - -final class ComparisonFailure extends RuntimeException -{ - private mixed $expected; - private mixed $actual; - private string $expectedAsString; - private string $actualAsString; - - public function __construct(mixed $expected, mixed $actual, string $expectedAsString, string $actualAsString, string $message = '') - { - parent::__construct($message); - - $this->expected = $expected; - $this->actual = $actual; - $this->expectedAsString = $expectedAsString; - $this->actualAsString = $actualAsString; - } - - public function getActual(): mixed - { - return $this->actual; - } - - public function getExpected(): mixed - { - return $this->expected; - } - - public function getActualAsString(): string - { - return $this->actualAsString; - } - - public function getExpectedAsString(): string - { - return $this->expectedAsString; - } - - public function getDiff(): string - { - if (!$this->actualAsString && !$this->expectedAsString) { - return ''; - } - - $differ = new Differ(new UnifiedDiffOutputBuilder("\n--- Expected\n+++ Actual\n")); - - return $differ->diff($this->expectedAsString, $this->actualAsString); - } - - public function toString(): string - { - return $this->getMessage() . $this->getDiff(); - } -} diff --git a/vendor/sebastian/comparator/src/DOMNodeComparator.php b/vendor/sebastian/comparator/src/DOMNodeComparator.php deleted file mode 100644 index e78a401..0000000 --- a/vendor/sebastian/comparator/src/DOMNodeComparator.php +++ /dev/null @@ -1,80 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Comparator; - -use function assert; -use function mb_strtolower; -use function sprintf; -use DOMDocument; -use DOMNode; -use ValueError; - -final class DOMNodeComparator extends ObjectComparator -{ - public function accepts(mixed $expected, mixed $actual): bool - { - return $expected instanceof DOMNode && $actual instanceof DOMNode; - } - - /** - * @throws ComparisonFailure - */ - public function assertEquals(mixed $expected, mixed $actual, float $delta = 0.0, bool $canonicalize = false, bool $ignoreCase = false, array &$processed = []): void - { - assert($expected instanceof DOMNode); - assert($actual instanceof DOMNode); - - $expectedAsString = $this->nodeToText($expected, true, $ignoreCase); - $actualAsString = $this->nodeToText($actual, true, $ignoreCase); - - if ($expectedAsString !== $actualAsString) { - $type = $expected instanceof DOMDocument ? 'documents' : 'nodes'; - - throw new ComparisonFailure( - $expected, - $actual, - $expectedAsString, - $actualAsString, - sprintf("Failed asserting that two DOM %s are equal.\n", $type), - ); - } - } - - /** - * Returns the normalized, whitespace-cleaned, and indented textual - * representation of a DOMNode. - */ - private function nodeToText(DOMNode $node, bool $canonicalize, bool $ignoreCase): string - { - if ($canonicalize) { - $document = new DOMDocument; - - try { - $c14n = $node->C14N(); - - assert(!empty($c14n)); - - @$document->loadXML($c14n); - } catch (ValueError) { - } - - $node = $document; - } - - $document = $node instanceof DOMDocument ? $node : $node->ownerDocument; - - $document->formatOutput = true; - $document->normalizeDocument(); - - $text = $node instanceof DOMDocument ? $node->saveXML() : $document->saveXML($node); - - return $ignoreCase ? mb_strtolower($text, 'UTF-8') : $text; - } -} diff --git a/vendor/sebastian/comparator/src/DateTimeComparator.php b/vendor/sebastian/comparator/src/DateTimeComparator.php deleted file mode 100644 index 16792d7..0000000 --- a/vendor/sebastian/comparator/src/DateTimeComparator.php +++ /dev/null @@ -1,73 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Comparator; - -use function abs; -use function assert; -use function floor; -use function sprintf; -use DateInterval; -use DateTimeInterface; -use DateTimeZone; - -final class DateTimeComparator extends ObjectComparator -{ - public function accepts(mixed $expected, mixed $actual): bool - { - return ($expected instanceof DateTimeInterface) && - ($actual instanceof DateTimeInterface); - } - - /** - * @throws ComparisonFailure - */ - public function assertEquals(mixed $expected, mixed $actual, float $delta = 0.0, bool $canonicalize = false, bool $ignoreCase = false, array &$processed = []): void - { - assert($expected instanceof DateTimeInterface); - assert($actual instanceof DateTimeInterface); - - $absDelta = abs($delta); - $delta = new DateInterval(sprintf('PT%dS', $absDelta)); - $delta->f = $absDelta - floor($absDelta); - - $actualClone = (clone $actual) - ->setTimezone(new DateTimeZone('UTC')); - - $expectedLower = (clone $expected) - ->setTimezone(new DateTimeZone('UTC')) - ->sub($delta); - - $expectedUpper = (clone $expected) - ->setTimezone(new DateTimeZone('UTC')) - ->add($delta); - - if ($actualClone < $expectedLower || $actualClone > $expectedUpper) { - throw new ComparisonFailure( - $expected, - $actual, - $this->dateTimeToString($expected), - $this->dateTimeToString($actual), - 'Failed asserting that two DateTime objects are equal.', - ); - } - } - - /** - * Returns an ISO 8601 formatted string representation of a datetime or - * 'Invalid DateTimeInterface object' if the provided DateTimeInterface was not properly - * initialized. - */ - private function dateTimeToString(DateTimeInterface $datetime): string - { - $string = $datetime->format('Y-m-d\TH:i:s.uO'); - - return $string ?: 'Invalid DateTimeInterface object'; - } -} diff --git a/vendor/sebastian/comparator/src/ExceptionComparator.php b/vendor/sebastian/comparator/src/ExceptionComparator.php deleted file mode 100644 index b44dd81..0000000 --- a/vendor/sebastian/comparator/src/ExceptionComparator.php +++ /dev/null @@ -1,41 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Comparator; - -use function assert; -use Exception; - -/** - * Compares Exception instances for equality. - */ -final class ExceptionComparator extends ObjectComparator -{ - public function accepts(mixed $expected, mixed $actual): bool - { - return $expected instanceof Exception && $actual instanceof Exception; - } - - protected function toArray(object $object): array - { - assert($object instanceof Exception); - - $array = parent::toArray($object); - - unset( - $array['file'], - $array['line'], - $array['trace'], - $array['string'], - $array['xdebug_message'], - ); - - return $array; - } -} diff --git a/vendor/sebastian/comparator/src/Factory.php b/vendor/sebastian/comparator/src/Factory.php deleted file mode 100644 index 7285c75..0000000 --- a/vendor/sebastian/comparator/src/Factory.php +++ /dev/null @@ -1,114 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Comparator; - -use function array_unshift; - -final class Factory -{ - private static ?Factory $instance = null; - - /** - * @psalm-var list - */ - private array $customComparators = []; - - /** - * @psalm-var list - */ - private array $defaultComparators = []; - - public static function getInstance(): self - { - if (self::$instance === null) { - self::$instance = new self; // @codeCoverageIgnore - } - - return self::$instance; - } - - public function __construct() - { - $this->registerDefaultComparators(); - } - - public function getComparatorFor(mixed $expected, mixed $actual): Comparator - { - foreach ($this->customComparators as $comparator) { - if ($comparator->accepts($expected, $actual)) { - return $comparator; - } - } - - foreach ($this->defaultComparators as $comparator) { - if ($comparator->accepts($expected, $actual)) { - return $comparator; - } - } - - throw new RuntimeException('No suitable Comparator implementation found'); - } - - /** - * Registers a new comparator. - * - * This comparator will be returned by getComparatorFor() if its accept() method - * returns TRUE for the compared values. It has higher priority than the - * existing comparators, meaning that its accept() method will be invoked - * before those of the other comparators. - */ - public function register(Comparator $comparator): void - { - array_unshift($this->customComparators, $comparator); - - $comparator->setFactory($this); - } - - /** - * Unregisters a comparator. - * - * This comparator will no longer be considered by getComparatorFor(). - */ - public function unregister(Comparator $comparator): void - { - foreach ($this->customComparators as $key => $_comparator) { - if ($comparator === $_comparator) { - unset($this->customComparators[$key]); - } - } - } - - public function reset(): void - { - $this->customComparators = []; - } - - private function registerDefaultComparators(): void - { - $this->registerDefaultComparator(new MockObjectComparator); - $this->registerDefaultComparator(new DateTimeComparator); - $this->registerDefaultComparator(new DOMNodeComparator); - $this->registerDefaultComparator(new SplObjectStorageComparator); - $this->registerDefaultComparator(new ExceptionComparator); - $this->registerDefaultComparator(new ObjectComparator); - $this->registerDefaultComparator(new ResourceComparator); - $this->registerDefaultComparator(new ArrayComparator); - $this->registerDefaultComparator(new NumericComparator); - $this->registerDefaultComparator(new ScalarComparator); - $this->registerDefaultComparator(new TypeComparator); - } - - private function registerDefaultComparator(Comparator $comparator): void - { - $this->defaultComparators[] = $comparator; - - $comparator->setFactory($this); - } -} diff --git a/vendor/sebastian/comparator/src/MockObjectComparator.php b/vendor/sebastian/comparator/src/MockObjectComparator.php deleted file mode 100644 index 67d5ade..0000000 --- a/vendor/sebastian/comparator/src/MockObjectComparator.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Comparator; - -use function array_keys; -use function assert; -use function str_starts_with; -use PHPUnit\Framework\MockObject\Stub; - -/** - * Compares PHPUnit\Framework\MockObject\MockObject instances for equality. - */ -final class MockObjectComparator extends ObjectComparator -{ - public function accepts(mixed $expected, mixed $actual): bool - { - return $expected instanceof Stub && $actual instanceof Stub; - } - - protected function toArray(object $object): array - { - assert($object instanceof Stub); - - $array = parent::toArray($object); - - foreach (array_keys($array) as $key) { - if (!str_starts_with($key, '__phpunit_')) { - continue; - } - - unset($array[$key]); - } - - return $array; - } -} diff --git a/vendor/sebastian/comparator/src/NumericComparator.php b/vendor/sebastian/comparator/src/NumericComparator.php deleted file mode 100644 index 3d783ed..0000000 --- a/vendor/sebastian/comparator/src/NumericComparator.php +++ /dev/null @@ -1,67 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Comparator; - -use function abs; -use function is_float; -use function is_infinite; -use function is_nan; -use function is_numeric; -use function is_string; -use function sprintf; -use SebastianBergmann\Exporter\Exporter; - -final class NumericComparator extends ScalarComparator -{ - public function accepts(mixed $expected, mixed $actual): bool - { - // all numerical values, but not if both of them are strings - return is_numeric($expected) && is_numeric($actual) && - !(is_string($expected) && is_string($actual)); - } - - /** - * @throws ComparisonFailure - */ - public function assertEquals(mixed $expected, mixed $actual, float $delta = 0.0, bool $canonicalize = false, bool $ignoreCase = false): void - { - if ($this->isInfinite($actual) && $this->isInfinite($expected)) { - return; - } - - if (($this->isInfinite($actual) xor $this->isInfinite($expected)) || - ($this->isNan($actual) || $this->isNan($expected)) || - abs($actual - $expected) > $delta) { - $exporter = new Exporter; - - throw new ComparisonFailure( - $expected, - $actual, - '', - '', - sprintf( - 'Failed asserting that %s matches expected %s.', - $exporter->export($actual), - $exporter->export($expected), - ), - ); - } - } - - private function isInfinite(mixed $value): bool - { - return is_float($value) && is_infinite($value); - } - - private function isNan(mixed $value): bool - { - return is_float($value) && is_nan($value); - } -} diff --git a/vendor/sebastian/comparator/src/ObjectComparator.php b/vendor/sebastian/comparator/src/ObjectComparator.php deleted file mode 100644 index 95f97ed..0000000 --- a/vendor/sebastian/comparator/src/ObjectComparator.php +++ /dev/null @@ -1,88 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Comparator; - -use function assert; -use function in_array; -use function is_object; -use function sprintf; -use function substr_replace; -use SebastianBergmann\Exporter\Exporter; - -class ObjectComparator extends ArrayComparator -{ - public function accepts(mixed $expected, mixed $actual): bool - { - return is_object($expected) && is_object($actual); - } - - /** - * @throws ComparisonFailure - */ - public function assertEquals(mixed $expected, mixed $actual, float $delta = 0.0, bool $canonicalize = false, bool $ignoreCase = false, array &$processed = []): void - { - assert(is_object($expected)); - assert(is_object($actual)); - - if ($actual::class !== $expected::class) { - $exporter = new Exporter; - - throw new ComparisonFailure( - $expected, - $actual, - $exporter->export($expected), - $exporter->export($actual), - sprintf( - '%s is not instance of expected class "%s".', - $exporter->export($actual), - $expected::class, - ), - ); - } - - // don't compare twice to allow for cyclic dependencies - if (in_array([$actual, $expected], $processed, true) || - in_array([$expected, $actual], $processed, true)) { - return; - } - - $processed[] = [$actual, $expected]; - - // don't compare objects if they are identical - // this helps to avoid the error "maximum function nesting level reached" - // CAUTION: this conditional clause is not tested - if ($actual !== $expected) { - try { - parent::assertEquals( - $this->toArray($expected), - $this->toArray($actual), - $delta, - $canonicalize, - $ignoreCase, - $processed, - ); - } catch (ComparisonFailure $e) { - throw new ComparisonFailure( - $expected, - $actual, - // replace "Array" with "MyClass object" - substr_replace($e->getExpectedAsString(), $expected::class . ' Object', 0, 5), - substr_replace($e->getActualAsString(), $actual::class . ' Object', 0, 5), - 'Failed asserting that two objects are equal.', - ); - } - } - } - - protected function toArray(object $object): array - { - return (new Exporter)->toArray($object); - } -} diff --git a/vendor/sebastian/comparator/src/ResourceComparator.php b/vendor/sebastian/comparator/src/ResourceComparator.php deleted file mode 100644 index 1699562..0000000 --- a/vendor/sebastian/comparator/src/ResourceComparator.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Comparator; - -use function assert; -use function is_resource; -use SebastianBergmann\Exporter\Exporter; - -final class ResourceComparator extends Comparator -{ - public function accepts(mixed $expected, mixed $actual): bool - { - return is_resource($expected) && is_resource($actual); - } - - /** - * @throws ComparisonFailure - */ - public function assertEquals(mixed $expected, mixed $actual, float $delta = 0.0, bool $canonicalize = false, bool $ignoreCase = false): void - { - assert(is_resource($expected)); - assert(is_resource($actual)); - - $exporter = new Exporter; - - if ($actual != $expected) { - throw new ComparisonFailure( - $expected, - $actual, - $exporter->export($expected), - $exporter->export($actual), - ); - } - } -} diff --git a/vendor/sebastian/comparator/src/ScalarComparator.php b/vendor/sebastian/comparator/src/ScalarComparator.php deleted file mode 100644 index 68b924c..0000000 --- a/vendor/sebastian/comparator/src/ScalarComparator.php +++ /dev/null @@ -1,81 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Comparator; - -use function is_bool; -use function is_object; -use function is_scalar; -use function is_string; -use function mb_strtolower; -use function method_exists; -use function sprintf; -use SebastianBergmann\Exporter\Exporter; - -/** - * Compares scalar or NULL values for equality. - */ -class ScalarComparator extends Comparator -{ - public function accepts(mixed $expected, mixed $actual): bool - { - return ((is_scalar($expected) xor null === $expected) && - (is_scalar($actual) xor null === $actual)) || - // allow comparison between strings and objects featuring __toString() - (is_string($expected) && is_object($actual) && method_exists($actual, '__toString')) || - (is_object($expected) && method_exists($expected, '__toString') && is_string($actual)); - } - - /** - * @throws ComparisonFailure - */ - public function assertEquals(mixed $expected, mixed $actual, float $delta = 0.0, bool $canonicalize = false, bool $ignoreCase = false): void - { - $expectedToCompare = $expected; - $actualToCompare = $actual; - $exporter = new Exporter; - - // always compare as strings to avoid strange behaviour - // otherwise 0 == 'Foobar' - if ((is_string($expected) && !is_bool($actual)) || (is_string($actual) && !is_bool($expected))) { - $expectedToCompare = @(string) $expectedToCompare; - $actualToCompare = @(string) $actualToCompare; - - if ($ignoreCase) { - $expectedToCompare = mb_strtolower($expectedToCompare, 'UTF-8'); - $actualToCompare = mb_strtolower($actualToCompare, 'UTF-8'); - } - } - - if ($expectedToCompare !== $actualToCompare && is_string($expected) && is_string($actual)) { - throw new ComparisonFailure( - $expected, - $actual, - $exporter->export($expected), - $exporter->export($actual), - 'Failed asserting that two strings are equal.', - ); - } - - if ($expectedToCompare != $actualToCompare) { - throw new ComparisonFailure( - $expected, - $actual, - // no diff is required - '', - '', - sprintf( - 'Failed asserting that %s matches expected %s.', - $exporter->export($actual), - $exporter->export($expected), - ), - ); - } - } -} diff --git a/vendor/sebastian/comparator/src/SplObjectStorageComparator.php b/vendor/sebastian/comparator/src/SplObjectStorageComparator.php deleted file mode 100644 index ee37f4f..0000000 --- a/vendor/sebastian/comparator/src/SplObjectStorageComparator.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Comparator; - -use function assert; -use SebastianBergmann\Exporter\Exporter; -use SplObjectStorage; - -final class SplObjectStorageComparator extends Comparator -{ - public function accepts(mixed $expected, mixed $actual): bool - { - return $expected instanceof SplObjectStorage && $actual instanceof SplObjectStorage; - } - - /** - * @throws ComparisonFailure - */ - public function assertEquals(mixed $expected, mixed $actual, float $delta = 0.0, bool $canonicalize = false, bool $ignoreCase = false): void - { - assert($expected instanceof SplObjectStorage); - assert($actual instanceof SplObjectStorage); - - $exporter = new Exporter; - - foreach ($actual as $object) { - if (!$expected->offsetExists($object)) { - throw new ComparisonFailure( - $expected, - $actual, - $exporter->export($expected), - $exporter->export($actual), - 'Failed asserting that two objects are equal.', - ); - } - } - - foreach ($expected as $object) { - if (!$actual->offsetExists($object)) { - throw new ComparisonFailure( - $expected, - $actual, - $exporter->export($expected), - $exporter->export($actual), - 'Failed asserting that two objects are equal.', - ); - } - } - } -} diff --git a/vendor/sebastian/comparator/src/TypeComparator.php b/vendor/sebastian/comparator/src/TypeComparator.php deleted file mode 100644 index 67994e9..0000000 --- a/vendor/sebastian/comparator/src/TypeComparator.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Comparator; - -use function gettype; -use function sprintf; -use SebastianBergmann\Exporter\Exporter; - -final class TypeComparator extends Comparator -{ - public function accepts(mixed $expected, mixed $actual): bool - { - return true; - } - - /** - * @throws ComparisonFailure - */ - public function assertEquals(mixed $expected, mixed $actual, float $delta = 0.0, bool $canonicalize = false, bool $ignoreCase = false): void - { - if (gettype($expected) != gettype($actual)) { - throw new ComparisonFailure( - $expected, - $actual, - // we don't need a diff - '', - '', - sprintf( - '%s does not match expected type "%s".', - (new Exporter)->shortenedExport($actual), - gettype($expected), - ), - ); - } - } -} diff --git a/vendor/sebastian/comparator/src/exceptions/Exception.php b/vendor/sebastian/comparator/src/exceptions/Exception.php deleted file mode 100644 index 8975aaf..0000000 --- a/vendor/sebastian/comparator/src/exceptions/Exception.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Comparator; - -use Throwable; - -interface Exception extends Throwable -{ -} diff --git a/vendor/sebastian/comparator/src/exceptions/RuntimeException.php b/vendor/sebastian/comparator/src/exceptions/RuntimeException.php deleted file mode 100644 index ca72608..0000000 --- a/vendor/sebastian/comparator/src/exceptions/RuntimeException.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Comparator; - -final class RuntimeException extends \RuntimeException implements Exception -{ -} diff --git a/vendor/sebastian/complexity/ChangeLog.md b/vendor/sebastian/complexity/ChangeLog.md deleted file mode 100644 index eb168af..0000000 --- a/vendor/sebastian/complexity/ChangeLog.md +++ /dev/null @@ -1,68 +0,0 @@ -# ChangeLog - -All notable changes are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. - -## [3.2.0] - 2023-12-21 - -### Added - -* `ComplexityCollection::sortByDescendingCyclomaticComplexity()` - -### Changed - -* This component is now compatible with `nikic/php-parser` 5.0 - -## [3.1.0] - 2023-09-28 - -### Added - -* `Complexity::isFunction()` and `Complexity::isMethod()` -* `ComplexityCollection::isFunction()` and `ComplexityCollection::isMethod()` -* `ComplexityCollection::mergeWith()` - -### Fixed - -* Anonymous classes are not processed correctly - -## [3.0.1] - 2023-08-31 - -### Fixed - -* [#7](https://github.com/sebastianbergmann/complexity/pull/7): `ComplexityCalculatingVisitor` tries to process interface methods - -## [3.0.0] - 2023-02-03 - -### Removed - -* This component is no longer supported on PHP 7.3, PHP 7.4 and PHP 8.0 - -## [2.0.2] - 2020-10-26 - -### Fixed - -* `SebastianBergmann\Complexity\Exception` now correctly extends `\Throwable` - -## [2.0.1] - 2020-09-28 - -### Changed - -* Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` - -## [2.0.0] - 2020-07-25 - -### Removed - -* The `ParentConnectingVisitor` has been removed (it should have been marked as `@internal`) - -## [1.0.0] - 2020-07-22 - -* Initial release - -[3.2.0]: https://github.com/sebastianbergmann/complexity/compare/3.1.0...3.2.0 -[3.1.0]: https://github.com/sebastianbergmann/complexity/compare/3.0.1...3.1.0 -[3.0.1]: https://github.com/sebastianbergmann/complexity/compare/3.0.0...3.0.1 -[3.0.0]: https://github.com/sebastianbergmann/complexity/compare/2.0.2...3.0.0 -[2.0.2]: https://github.com/sebastianbergmann/complexity/compare/2.0.1...2.0.2 -[2.0.1]: https://github.com/sebastianbergmann/complexity/compare/2.0.0...2.0.1 -[2.0.0]: https://github.com/sebastianbergmann/complexity/compare/1.0.0...2.0.0 -[1.0.0]: https://github.com/sebastianbergmann/complexity/compare/70ee0ad32d9e2be3f85beffa3e2eb474193f2487...1.0.0 diff --git a/vendor/sebastian/complexity/LICENSE b/vendor/sebastian/complexity/LICENSE deleted file mode 100644 index 5716d96..0000000 --- a/vendor/sebastian/complexity/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2020-2023, Sebastian Bergmann -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/sebastian/complexity/README.md b/vendor/sebastian/complexity/README.md deleted file mode 100644 index 3903c36..0000000 --- a/vendor/sebastian/complexity/README.md +++ /dev/null @@ -1,22 +0,0 @@ -[![Latest Stable Version](https://poser.pugx.org/sebastian/complexity/v/stable.png)](https://packagist.org/packages/sebastian/complexity) -[![CI Status](https://github.com/sebastianbergmann/complexity/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/complexity/actions) -[![Type Coverage](https://shepherd.dev/github/sebastianbergmann/complexity/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/complexity) -[![codecov](https://codecov.io/gh/sebastianbergmann/complexity/branch/main/graph/badge.svg)](https://codecov.io/gh/sebastianbergmann/complexity) - -# sebastian/complexity - -Library for calculating the complexity of PHP code units. - -## Installation - -You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - -``` -composer require sebastian/complexity -``` - -If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - -``` -composer require --dev sebastian/complexity -``` diff --git a/vendor/sebastian/complexity/SECURITY.md b/vendor/sebastian/complexity/SECURITY.md deleted file mode 100644 index d88ff00..0000000 --- a/vendor/sebastian/complexity/SECURITY.md +++ /dev/null @@ -1,30 +0,0 @@ -# Security Policy - -If you believe you have found a security vulnerability in the library that is developed in this repository, please report it to us through coordinated disclosure. - -**Please do not report security vulnerabilities through public GitHub issues, discussions, or pull requests.** - -Instead, please email `sebastian@phpunit.de`. - -Please include as much of the information listed below as you can to help us better understand and resolve the issue: - -* The type of issue -* Full paths of source file(s) related to the manifestation of the issue -* The location of the affected source code (tag/branch/commit or direct URL) -* Any special configuration required to reproduce the issue -* Step-by-step instructions to reproduce the issue -* Proof-of-concept or exploit code (if possible) -* Impact of the issue, including how an attacker might exploit the issue - -This information will help us triage your report more quickly. - -## Web Context - -The library that is developed in this repository was either extracted from [PHPUnit](https://github.com/sebastianbergmann/phpunit) or developed specifically as a dependency for PHPUnit. - -The library is developed with a focus on development environments and the command-line. No specific testing or hardening with regard to using the library in an HTTP or web context or with untrusted input data is performed. The library might also contain functionality that intentionally exposes internal application data for debugging purposes. - -If the library is used in a web application, the application developer is responsible for filtering inputs or escaping outputs as necessary and for verifying that the used functionality is safe for use within the intended context. - -Vulnerabilities specific to the use outside a development context will be fixed as applicable, provided that the fix does not have an averse effect on the primary use case for development purposes. - diff --git a/vendor/sebastian/complexity/composer.json b/vendor/sebastian/complexity/composer.json deleted file mode 100644 index 77001bb..0000000 --- a/vendor/sebastian/complexity/composer.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "sebastian/complexity", - "description": "Library for calculating the complexity of PHP code units", - "type": "library", - "homepage": "https://github.com/sebastianbergmann/complexity", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "support": { - "issues": "https://github.com/sebastianbergmann/complexity/issues", - "security": "https://github.com/sebastianbergmann/complexity/security/policy" - }, - "prefer-stable": true, - "require": { - "php": ">=8.1", - "nikic/php-parser": "^4.18 || ^5.0" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "config": { - "platform": { - "php": "8.1.0" - }, - "optimize-autoloader": true, - "sort-packages": true - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "extra": { - "branch-alias": { - "dev-main": "3.2-dev" - } - } -} diff --git a/vendor/sebastian/complexity/src/Calculator.php b/vendor/sebastian/complexity/src/Calculator.php deleted file mode 100644 index 18580bd..0000000 --- a/vendor/sebastian/complexity/src/Calculator.php +++ /dev/null @@ -1,83 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Complexity; - -use function assert; -use function file_get_contents; -use PhpParser\Error; -use PhpParser\Node; -use PhpParser\NodeTraverser; -use PhpParser\NodeVisitor\NameResolver; -use PhpParser\NodeVisitor\ParentConnectingVisitor; -use PhpParser\ParserFactory; - -final class Calculator -{ - /** - * @throws RuntimeException - */ - public function calculateForSourceFile(string $sourceFile): ComplexityCollection - { - return $this->calculateForSourceString(file_get_contents($sourceFile)); - } - - /** - * @throws RuntimeException - */ - public function calculateForSourceString(string $source): ComplexityCollection - { - try { - $nodes = (new ParserFactory)->createForHostVersion()->parse($source); - - assert($nodes !== null); - - return $this->calculateForAbstractSyntaxTree($nodes); - - // @codeCoverageIgnoreStart - } catch (Error $error) { - throw new RuntimeException( - $error->getMessage(), - $error->getCode(), - $error, - ); - } - // @codeCoverageIgnoreEnd - } - - /** - * @param Node[] $nodes - * - * @throws RuntimeException - */ - public function calculateForAbstractSyntaxTree(array $nodes): ComplexityCollection - { - $traverser = new NodeTraverser; - $complexityCalculatingVisitor = new ComplexityCalculatingVisitor(true); - - $traverser->addVisitor(new NameResolver); - $traverser->addVisitor(new ParentConnectingVisitor); - $traverser->addVisitor($complexityCalculatingVisitor); - - try { - /* @noinspection UnusedFunctionResultInspection */ - $traverser->traverse($nodes); - // @codeCoverageIgnoreStart - } catch (Error $error) { - throw new RuntimeException( - $error->getMessage(), - $error->getCode(), - $error, - ); - } - // @codeCoverageIgnoreEnd - - return $complexityCalculatingVisitor->result(); - } -} diff --git a/vendor/sebastian/complexity/src/Complexity/Complexity.php b/vendor/sebastian/complexity/src/Complexity/Complexity.php deleted file mode 100644 index 5203454..0000000 --- a/vendor/sebastian/complexity/src/Complexity/Complexity.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Complexity; - -use function str_contains; - -/** - * @psalm-immutable - */ -final class Complexity -{ - /** - * @psalm-var non-empty-string - */ - private readonly string $name; - - /** - * @psalm-var positive-int - */ - private int $cyclomaticComplexity; - - /** - * @psalm-param non-empty-string $name - * @psalm-param positive-int $cyclomaticComplexity - */ - public function __construct(string $name, int $cyclomaticComplexity) - { - $this->name = $name; - $this->cyclomaticComplexity = $cyclomaticComplexity; - } - - /** - * @psalm-return non-empty-string - */ - public function name(): string - { - return $this->name; - } - - /** - * @psalm-return positive-int - */ - public function cyclomaticComplexity(): int - { - return $this->cyclomaticComplexity; - } - - public function isFunction(): bool - { - return !$this->isMethod(); - } - - public function isMethod(): bool - { - return str_contains($this->name, '::'); - } -} diff --git a/vendor/sebastian/complexity/src/Complexity/ComplexityCollection.php b/vendor/sebastian/complexity/src/Complexity/ComplexityCollection.php deleted file mode 100644 index 0f851c2..0000000 --- a/vendor/sebastian/complexity/src/Complexity/ComplexityCollection.php +++ /dev/null @@ -1,132 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Complexity; - -use function array_filter; -use function array_merge; -use function array_reverse; -use function array_values; -use function count; -use function usort; -use Countable; -use IteratorAggregate; - -/** - * @psalm-immutable - */ -final class ComplexityCollection implements Countable, IteratorAggregate -{ - /** - * @psalm-var list - */ - private readonly array $items; - - public static function fromList(Complexity ...$items): self - { - return new self($items); - } - - /** - * @psalm-param list $items - */ - private function __construct(array $items) - { - $this->items = $items; - } - - /** - * @psalm-return list - */ - public function asArray(): array - { - return $this->items; - } - - public function getIterator(): ComplexityCollectionIterator - { - return new ComplexityCollectionIterator($this); - } - - /** - * @psalm-return non-negative-int - */ - public function count(): int - { - return count($this->items); - } - - public function isEmpty(): bool - { - return empty($this->items); - } - - /** - * @psalm-return non-negative-int - */ - public function cyclomaticComplexity(): int - { - $cyclomaticComplexity = 0; - - foreach ($this as $item) { - $cyclomaticComplexity += $item->cyclomaticComplexity(); - } - - return $cyclomaticComplexity; - } - - public function isFunction(): self - { - return new self( - array_values( - array_filter( - $this->items, - static fn (Complexity $complexity): bool => $complexity->isFunction(), - ), - ), - ); - } - - public function isMethod(): self - { - return new self( - array_values( - array_filter( - $this->items, - static fn (Complexity $complexity): bool => $complexity->isMethod(), - ), - ), - ); - } - - public function mergeWith(self $other): self - { - return new self( - array_merge( - $this->asArray(), - $other->asArray(), - ), - ); - } - - public function sortByDescendingCyclomaticComplexity(): self - { - $items = $this->items; - - usort( - $items, - static function (Complexity $a, Complexity $b): int - { - return $a->cyclomaticComplexity() <=> $b->cyclomaticComplexity(); - }, - ); - - return new self(array_reverse($items)); - } -} diff --git a/vendor/sebastian/complexity/src/Complexity/ComplexityCollectionIterator.php b/vendor/sebastian/complexity/src/Complexity/ComplexityCollectionIterator.php deleted file mode 100644 index c3ac690..0000000 --- a/vendor/sebastian/complexity/src/Complexity/ComplexityCollectionIterator.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Complexity; - -use Iterator; - -final class ComplexityCollectionIterator implements Iterator -{ - /** - * @psalm-var list - */ - private readonly array $items; - private int $position = 0; - - public function __construct(ComplexityCollection $items) - { - $this->items = $items->asArray(); - } - - public function rewind(): void - { - $this->position = 0; - } - - public function valid(): bool - { - return isset($this->items[$this->position]); - } - - public function key(): int - { - return $this->position; - } - - public function current(): Complexity - { - return $this->items[$this->position]; - } - - public function next(): void - { - $this->position++; - } -} diff --git a/vendor/sebastian/complexity/src/Exception/Exception.php b/vendor/sebastian/complexity/src/Exception/Exception.php deleted file mode 100644 index 897ecdc..0000000 --- a/vendor/sebastian/complexity/src/Exception/Exception.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Complexity; - -use Throwable; - -interface Exception extends Throwable -{ -} diff --git a/vendor/sebastian/complexity/src/Exception/RuntimeException.php b/vendor/sebastian/complexity/src/Exception/RuntimeException.php deleted file mode 100644 index 6c68a6f..0000000 --- a/vendor/sebastian/complexity/src/Exception/RuntimeException.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Complexity; - -final class RuntimeException extends \RuntimeException implements Exception -{ -} diff --git a/vendor/sebastian/complexity/src/Visitor/ComplexityCalculatingVisitor.php b/vendor/sebastian/complexity/src/Visitor/ComplexityCalculatingVisitor.php deleted file mode 100644 index 0314bf1..0000000 --- a/vendor/sebastian/complexity/src/Visitor/ComplexityCalculatingVisitor.php +++ /dev/null @@ -1,132 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Complexity; - -use function assert; -use function is_array; -use PhpParser\Node; -use PhpParser\Node\Expr\New_; -use PhpParser\Node\Name; -use PhpParser\Node\Stmt; -use PhpParser\Node\Stmt\Class_; -use PhpParser\Node\Stmt\ClassMethod; -use PhpParser\Node\Stmt\Function_; -use PhpParser\Node\Stmt\Interface_; -use PhpParser\Node\Stmt\Trait_; -use PhpParser\NodeTraverser; -use PhpParser\NodeVisitorAbstract; - -final class ComplexityCalculatingVisitor extends NodeVisitorAbstract -{ - /** - * @psalm-var list - */ - private array $result = []; - private bool $shortCircuitTraversal; - - public function __construct(bool $shortCircuitTraversal) - { - $this->shortCircuitTraversal = $shortCircuitTraversal; - } - - public function enterNode(Node $node): ?int - { - if (!$node instanceof ClassMethod && !$node instanceof Function_) { - return null; - } - - if ($node instanceof ClassMethod) { - if ($node->getAttribute('parent') instanceof Interface_) { - return null; - } - - if ($node->isAbstract()) { - return null; - } - - $name = $this->classMethodName($node); - } else { - $name = $this->functionName($node); - } - - $statements = $node->getStmts(); - - assert(is_array($statements)); - - $this->result[] = new Complexity( - $name, - $this->cyclomaticComplexity($statements), - ); - - if ($this->shortCircuitTraversal) { - return NodeTraverser::DONT_TRAVERSE_CHILDREN; - } - - return null; - } - - public function result(): ComplexityCollection - { - return ComplexityCollection::fromList(...$this->result); - } - - /** - * @param Stmt[] $statements - * - * @psalm-return positive-int - */ - private function cyclomaticComplexity(array $statements): int - { - $traverser = new NodeTraverser; - - $cyclomaticComplexityCalculatingVisitor = new CyclomaticComplexityCalculatingVisitor; - - $traverser->addVisitor($cyclomaticComplexityCalculatingVisitor); - - /* @noinspection UnusedFunctionResultInspection */ - $traverser->traverse($statements); - - return $cyclomaticComplexityCalculatingVisitor->cyclomaticComplexity(); - } - - /** - * @psalm-return non-empty-string - */ - private function classMethodName(ClassMethod $node): string - { - $parent = $node->getAttribute('parent'); - - assert($parent instanceof Class_ || $parent instanceof Trait_); - - if ($parent->getAttribute('parent') instanceof New_) { - return 'anonymous class'; - } - - assert(isset($parent->namespacedName)); - assert($parent->namespacedName instanceof Name); - - return $parent->namespacedName->toString() . '::' . $node->name->toString(); - } - - /** - * @psalm-return non-empty-string - */ - private function functionName(Function_ $node): string - { - assert(isset($node->namespacedName)); - assert($node->namespacedName instanceof Name); - - $functionName = $node->namespacedName->toString(); - - assert($functionName !== ''); - - return $functionName; - } -} diff --git a/vendor/sebastian/complexity/src/Visitor/CyclomaticComplexityCalculatingVisitor.php b/vendor/sebastian/complexity/src/Visitor/CyclomaticComplexityCalculatingVisitor.php deleted file mode 100644 index 551ed1a..0000000 --- a/vendor/sebastian/complexity/src/Visitor/CyclomaticComplexityCalculatingVisitor.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Complexity; - -use PhpParser\Node; -use PhpParser\Node\Expr\BinaryOp\BooleanAnd; -use PhpParser\Node\Expr\BinaryOp\BooleanOr; -use PhpParser\Node\Expr\BinaryOp\LogicalAnd; -use PhpParser\Node\Expr\BinaryOp\LogicalOr; -use PhpParser\Node\Expr\Ternary; -use PhpParser\Node\Stmt\Case_; -use PhpParser\Node\Stmt\Catch_; -use PhpParser\Node\Stmt\ElseIf_; -use PhpParser\Node\Stmt\For_; -use PhpParser\Node\Stmt\Foreach_; -use PhpParser\Node\Stmt\If_; -use PhpParser\Node\Stmt\While_; -use PhpParser\NodeVisitorAbstract; - -final class CyclomaticComplexityCalculatingVisitor extends NodeVisitorAbstract -{ - /** - * @psalm-var positive-int - */ - private int $cyclomaticComplexity = 1; - - public function enterNode(Node $node): void - { - switch ($node::class) { - case BooleanAnd::class: - case BooleanOr::class: - case Case_::class: - case Catch_::class: - case ElseIf_::class: - case For_::class: - case Foreach_::class: - case If_::class: - case LogicalAnd::class: - case LogicalOr::class: - case Ternary::class: - case While_::class: - $this->cyclomaticComplexity++; - } - } - - /** - * @psalm-return positive-int - */ - public function cyclomaticComplexity(): int - { - return $this->cyclomaticComplexity; - } -} diff --git a/vendor/sebastian/diff/ChangeLog.md b/vendor/sebastian/diff/ChangeLog.md deleted file mode 100644 index 10c5452..0000000 --- a/vendor/sebastian/diff/ChangeLog.md +++ /dev/null @@ -1,148 +0,0 @@ -# ChangeLog - -All notable changes are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. - -## [5.1.1] - 2024-03-02 - -### Changed - -* Do not use implicitly nullable parameters - -## [5.1.0] - 2023-12-22 - -### Added - -* `SebastianBergmann\Diff\Chunk::start()`, `SebastianBergmann\Diff\Chunk::startRange()`, `SebastianBergmann\Diff\Chunk::end()`, `SebastianBergmann\Diff\Chunk::endRange()`, and `SebastianBergmann\Diff\Chunk::lines()` -* `SebastianBergmann\Diff\Diff::from()`, `SebastianBergmann\Diff\Diff::to()`, and `SebastianBergmann\Diff\Diff::chunks()` -* `SebastianBergmann\Diff\Line::content()` and `SebastianBergmann\Diff\Diff::type()` -* `SebastianBergmann\Diff\Line::isAdded()`,`SebastianBergmann\Diff\Line::isRemoved()`, and `SebastianBergmann\Diff\Line::isUnchanged()` - -### Changed - -* `SebastianBergmann\Diff\Diff` now implements `IteratorAggregate`, iterating over it yields the aggregated `SebastianBergmann\Diff\Chunk` objects -* `SebastianBergmann\Diff\Chunk` now implements `IteratorAggregate`, iterating over it yields the aggregated `SebastianBergmann\Diff\Line` objects - -### Deprecated - -* `SebastianBergmann\Diff\Chunk::getStart()`, `SebastianBergmann\Diff\Chunk::getStartRange()`, `SebastianBergmann\Diff\Chunk::getEnd()`, `SebastianBergmann\Diff\Chunk::getEndRange()`, and `SebastianBergmann\Diff\Chunk::getLines()` -* `SebastianBergmann\Diff\Diff::getFrom()`, `SebastianBergmann\Diff\Diff::getTo()`, and `SebastianBergmann\Diff\Diff::getChunks()` -* `SebastianBergmann\Diff\Line::getContent()` and `SebastianBergmann\Diff\Diff::getType()` - -## [5.0.3] - 2023-05-01 - -### Changed - -* [#119](https://github.com/sebastianbergmann/diff/pull/119): Improve performance of `TimeEfficientLongestCommonSubsequenceCalculator` - -## [5.0.2] - 2023-05-01 - -### Changed - -* [#118](https://github.com/sebastianbergmann/diff/pull/118): Improve performance of `MemoryEfficientLongestCommonSubsequenceCalculator` - -## [5.0.1] - 2023-03-23 - -### Fixed - -* [#115](https://github.com/sebastianbergmann/diff/pull/115): `Parser::parseFileDiff()` does not handle diffs correctly that only add lines or only remove lines - -## [5.0.0] - 2023-02-03 - -### Changed - -* Passing a `DiffOutputBuilderInterface` instance to `Differ::__construct()` is no longer optional - -### Removed - -* Removed support for PHP 7.3, PHP 7.4, and PHP 8.0 - -## [4.0.4] - 2020-10-26 - -### Fixed - -* `SebastianBergmann\Diff\Exception` now correctly extends `\Throwable` - -## [4.0.3] - 2020-09-28 - -### Changed - -* Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` - -## [4.0.2] - 2020-06-30 - -### Added - -* This component is now supported on PHP 8 - -## [4.0.1] - 2020-05-08 - -### Fixed - -* [#99](https://github.com/sebastianbergmann/diff/pull/99): Regression in unified diff output of identical strings - -## [4.0.0] - 2020-02-07 - -### Removed - -* Removed support for PHP 7.1 and PHP 7.2 - -## [3.0.2] - 2019-02-04 - -### Changed - -* `Chunk::setLines()` now ensures that the `$lines` array only contains `Line` objects - -## [3.0.1] - 2018-06-10 - -### Fixed - -* Removed `"minimum-stability": "dev",` from `composer.json` - -## [3.0.0] - 2018-02-01 - -* The `StrictUnifiedDiffOutputBuilder` implementation of the `DiffOutputBuilderInterface` was added - -### Changed - -* The default `DiffOutputBuilderInterface` implementation now generates context lines (unchanged lines) - -### Removed - -* Removed support for PHP 7.0 - -### Fixed - -* [#70](https://github.com/sebastianbergmann/diff/issues/70): Diffing of arrays no longer works - -## [2.0.1] - 2017-08-03 - -### Fixed - -* [#66](https://github.com/sebastianbergmann/diff/pull/66): Restored backwards compatibility for PHPUnit 6.1.4, 6.2.0, 6.2.1, 6.2.2, and 6.2.3 - -## [2.0.0] - 2017-07-11 [YANKED] - -### Added - -* [#64](https://github.com/sebastianbergmann/diff/pull/64): Show line numbers for chunks of a diff - -### Removed - -* This component is no longer supported on PHP 5.6 - -[5.1.1]: https://github.com/sebastianbergmann/diff/compare/5.1.0...5.1.1 -[5.1.0]: https://github.com/sebastianbergmann/diff/compare/5.0.3...5.1.0 -[5.0.3]: https://github.com/sebastianbergmann/diff/compare/5.0.2...5.0.3 -[5.0.2]: https://github.com/sebastianbergmann/diff/compare/5.0.1...5.0.2 -[5.0.1]: https://github.com/sebastianbergmann/diff/compare/5.0.0...5.0.1 -[5.0.0]: https://github.com/sebastianbergmann/diff/compare/4.0.4...5.0.0 -[4.0.4]: https://github.com/sebastianbergmann/diff/compare/4.0.3...4.0.4 -[4.0.3]: https://github.com/sebastianbergmann/diff/compare/4.0.2...4.0.3 -[4.0.2]: https://github.com/sebastianbergmann/diff/compare/4.0.1...4.0.2 -[4.0.1]: https://github.com/sebastianbergmann/diff/compare/4.0.0...4.0.1 -[4.0.0]: https://github.com/sebastianbergmann/diff/compare/3.0.2...4.0.0 -[3.0.2]: https://github.com/sebastianbergmann/diff/compare/3.0.1...3.0.2 -[3.0.1]: https://github.com/sebastianbergmann/diff/compare/3.0.0...3.0.1 -[3.0.0]: https://github.com/sebastianbergmann/diff/compare/2.0...3.0.0 -[2.0.1]: https://github.com/sebastianbergmann/diff/compare/c341c98ce083db77f896a0aa64f5ee7652915970...2.0.1 -[2.0.0]: https://github.com/sebastianbergmann/diff/compare/1.4...c341c98ce083db77f896a0aa64f5ee7652915970 diff --git a/vendor/sebastian/diff/LICENSE b/vendor/sebastian/diff/LICENSE deleted file mode 100644 index 5b4705a..0000000 --- a/vendor/sebastian/diff/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2002-2024, Sebastian Bergmann -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/sebastian/diff/README.md b/vendor/sebastian/diff/README.md deleted file mode 100644 index 539dc59..0000000 --- a/vendor/sebastian/diff/README.md +++ /dev/null @@ -1,206 +0,0 @@ -[![Latest Stable Version](https://poser.pugx.org/sebastian/diff/v/stable.png)](https://packagist.org/packages/sebastian/diff) -[![CI Status](https://github.com/sebastianbergmann/diff/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/diff/actions) -[![Type Coverage](https://shepherd.dev/github/sebastianbergmann/diff/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/diff) -[![codecov](https://codecov.io/gh/sebastianbergmann/diff/branch/main/graph/badge.svg)](https://codecov.io/gh/sebastianbergmann/diff) - -# sebastian/diff - -Diff implementation for PHP, factored out of PHPUnit into a stand-alone component. - -## Installation - -You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - -``` -composer require sebastian/diff -``` - -If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - -``` -composer require --dev sebastian/diff -``` - -### Usage - -#### Generating diff - -The `Differ` class can be used to generate a textual representation of the difference between two strings: - -```php -diff('foo', 'bar'); -``` - -The code above yields the output below: -```diff ---- Original -+++ New -@@ @@ --foo -+bar -``` - -There are three output builders available in this package: - -#### UnifiedDiffOutputBuilder - -This is default builder, which generates the output close to udiff and is used by PHPUnit. - -```php -diff('foo', 'bar'); -``` - -#### StrictUnifiedDiffOutputBuilder - -Generates (strict) Unified diff's (unidiffs) with hunks, -similar to `diff -u` and compatible with `patch` and `git apply`. - -```php - true, // ranges of length one are rendered with the trailing `,1` - 'commonLineThreshold' => 6, // number of same lines before ending a new hunk and creating a new one (if needed) - 'contextLines' => 3, // like `diff: -u, -U NUM, --unified[=NUM]`, for patch/git apply compatibility best to keep at least @ 3 - 'fromFile' => '', - 'fromFileDate' => null, - 'toFile' => '', - 'toFileDate' => null, -]); - -$differ = new Differ($builder); -print $differ->diff('foo', 'bar'); -``` - -#### DiffOnlyOutputBuilder - -Output only the lines that differ. - -```php -diff('foo', 'bar'); -``` - -#### DiffOutputBuilderInterface - -You can pass any output builder to the `Differ` class as longs as it implements the `DiffOutputBuilderInterface`. - -#### Parsing diff - -The `Parser` class can be used to parse a unified diff into an object graph: - -```php -use SebastianBergmann\Diff\Parser; -use SebastianBergmann\Git; - -$git = new Git('/usr/local/src/money'); - -$diff = $git->getDiff( - '948a1a07768d8edd10dcefa8315c1cbeffb31833', - 'c07a373d2399f3e686234c4f7f088d635eb9641b' -); - -$parser = new Parser; - -print_r($parser->parse($diff)); -``` - -The code above yields the output below: - - Array - ( - [0] => SebastianBergmann\Diff\Diff Object - ( - [from:SebastianBergmann\Diff\Diff:private] => a/tests/MoneyTest.php - [to:SebastianBergmann\Diff\Diff:private] => b/tests/MoneyTest.php - [chunks:SebastianBergmann\Diff\Diff:private] => Array - ( - [0] => SebastianBergmann\Diff\Chunk Object - ( - [start:SebastianBergmann\Diff\Chunk:private] => 87 - [startRange:SebastianBergmann\Diff\Chunk:private] => 7 - [end:SebastianBergmann\Diff\Chunk:private] => 87 - [endRange:SebastianBergmann\Diff\Chunk:private] => 7 - [lines:SebastianBergmann\Diff\Chunk:private] => Array - ( - [0] => SebastianBergmann\Diff\Line Object - ( - [type:SebastianBergmann\Diff\Line:private] => 3 - [content:SebastianBergmann\Diff\Line:private] => * @covers SebastianBergmann\Money\Money::add - ) - - [1] => SebastianBergmann\Diff\Line Object - ( - [type:SebastianBergmann\Diff\Line:private] => 3 - [content:SebastianBergmann\Diff\Line:private] => * @covers SebastianBergmann\Money\Money::newMoney - ) - - [2] => SebastianBergmann\Diff\Line Object - ( - [type:SebastianBergmann\Diff\Line:private] => 3 - [content:SebastianBergmann\Diff\Line:private] => */ - ) - - [3] => SebastianBergmann\Diff\Line Object - ( - [type:SebastianBergmann\Diff\Line:private] => 2 - [content:SebastianBergmann\Diff\Line:private] => public function testAnotherMoneyWithSameCurrencyObjectCanBeAdded() - ) - - [4] => SebastianBergmann\Diff\Line Object - ( - [type:SebastianBergmann\Diff\Line:private] => 1 - [content:SebastianBergmann\Diff\Line:private] => public function testAnotherMoneyObjectWithSameCurrencyCanBeAdded() - ) - - [5] => SebastianBergmann\Diff\Line Object - ( - [type:SebastianBergmann\Diff\Line:private] => 3 - [content:SebastianBergmann\Diff\Line:private] => { - ) - - [6] => SebastianBergmann\Diff\Line Object - ( - [type:SebastianBergmann\Diff\Line:private] => 3 - [content:SebastianBergmann\Diff\Line:private] => $a = new Money(1, new Currency('EUR')); - ) - - [7] => SebastianBergmann\Diff\Line Object - ( - [type:SebastianBergmann\Diff\Line:private] => 3 - [content:SebastianBergmann\Diff\Line:private] => $b = new Money(2, new Currency('EUR')); - ) - ) - ) - ) - ) - ) - -Note: If the chunk size is 0 lines, i.e., `getStartRange()` or `getEndRange()` return 0, the number of line returned by `getStart()` or `getEnd()` is one lower than one would expect. It is the line number after which the chunk should be inserted or deleted; in all other cases, it gives the first line number of the replaced range of lines. diff --git a/vendor/sebastian/diff/SECURITY.md b/vendor/sebastian/diff/SECURITY.md deleted file mode 100644 index d88ff00..0000000 --- a/vendor/sebastian/diff/SECURITY.md +++ /dev/null @@ -1,30 +0,0 @@ -# Security Policy - -If you believe you have found a security vulnerability in the library that is developed in this repository, please report it to us through coordinated disclosure. - -**Please do not report security vulnerabilities through public GitHub issues, discussions, or pull requests.** - -Instead, please email `sebastian@phpunit.de`. - -Please include as much of the information listed below as you can to help us better understand and resolve the issue: - -* The type of issue -* Full paths of source file(s) related to the manifestation of the issue -* The location of the affected source code (tag/branch/commit or direct URL) -* Any special configuration required to reproduce the issue -* Step-by-step instructions to reproduce the issue -* Proof-of-concept or exploit code (if possible) -* Impact of the issue, including how an attacker might exploit the issue - -This information will help us triage your report more quickly. - -## Web Context - -The library that is developed in this repository was either extracted from [PHPUnit](https://github.com/sebastianbergmann/phpunit) or developed specifically as a dependency for PHPUnit. - -The library is developed with a focus on development environments and the command-line. No specific testing or hardening with regard to using the library in an HTTP or web context or with untrusted input data is performed. The library might also contain functionality that intentionally exposes internal application data for debugging purposes. - -If the library is used in a web application, the application developer is responsible for filtering inputs or escaping outputs as necessary and for verifying that the used functionality is safe for use within the intended context. - -Vulnerabilities specific to the use outside a development context will be fixed as applicable, provided that the fix does not have an averse effect on the primary use case for development purposes. - diff --git a/vendor/sebastian/diff/composer.json b/vendor/sebastian/diff/composer.json deleted file mode 100644 index c6ebec9..0000000 --- a/vendor/sebastian/diff/composer.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "name": "sebastian/diff", - "description": "Diff implementation", - "keywords": ["diff", "udiff", "unidiff", "unified diff"], - "homepage": "https://github.com/sebastianbergmann/diff", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - } - ], - "support": { - "issues": "https://github.com/sebastianbergmann/diff/issues", - "security": "https://github.com/sebastianbergmann/diff/security/policy" - }, - "prefer-stable": true, - "config": { - "platform": { - "php": "8.1.0" - }, - "optimize-autoloader": true, - "sort-packages": true - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0", - "symfony/process": "^6.4" - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "autoload-dev": { - "classmap": [ - "tests/" - ] - }, - "extra": { - "branch-alias": { - "dev-main": "5.1-dev" - } - } -} diff --git a/vendor/sebastian/diff/src/Chunk.php b/vendor/sebastian/diff/src/Chunk.php deleted file mode 100644 index a956854..0000000 --- a/vendor/sebastian/diff/src/Chunk.php +++ /dev/null @@ -1,124 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Diff; - -use ArrayIterator; -use IteratorAggregate; -use Traversable; - -/** - * @template-implements IteratorAggregate - */ -final class Chunk implements IteratorAggregate -{ - private int $start; - private int $startRange; - private int $end; - private int $endRange; - private array $lines; - - public function __construct(int $start = 0, int $startRange = 1, int $end = 0, int $endRange = 1, array $lines = []) - { - $this->start = $start; - $this->startRange = $startRange; - $this->end = $end; - $this->endRange = $endRange; - $this->lines = $lines; - } - - public function start(): int - { - return $this->start; - } - - public function startRange(): int - { - return $this->startRange; - } - - public function end(): int - { - return $this->end; - } - - public function endRange(): int - { - return $this->endRange; - } - - /** - * @psalm-return list - */ - public function lines(): array - { - return $this->lines; - } - - /** - * @psalm-param list $lines - */ - public function setLines(array $lines): void - { - foreach ($lines as $line) { - if (!$line instanceof Line) { - throw new InvalidArgumentException; - } - } - - $this->lines = $lines; - } - - /** - * @deprecated Use start() instead - */ - public function getStart(): int - { - return $this->start; - } - - /** - * @deprecated Use startRange() instead - */ - public function getStartRange(): int - { - return $this->startRange; - } - - /** - * @deprecated Use end() instead - */ - public function getEnd(): int - { - return $this->end; - } - - /** - * @deprecated Use endRange() instead - */ - public function getEndRange(): int - { - return $this->endRange; - } - - /** - * @psalm-return list - * - * @deprecated Use lines() instead - */ - public function getLines(): array - { - return $this->lines; - } - - public function getIterator(): Traversable - { - return new ArrayIterator($this->lines); - } -} diff --git a/vendor/sebastian/diff/src/Diff.php b/vendor/sebastian/diff/src/Diff.php deleted file mode 100644 index 5dc8dd0..0000000 --- a/vendor/sebastian/diff/src/Diff.php +++ /dev/null @@ -1,114 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Diff; - -use ArrayIterator; -use IteratorAggregate; -use Traversable; - -/** - * @template-implements IteratorAggregate - */ -final class Diff implements IteratorAggregate -{ - /** - * @psalm-var non-empty-string - */ - private string $from; - - /** - * @psalm-var non-empty-string - */ - private string $to; - - /** - * @psalm-var list - */ - private array $chunks; - - /** - * @psalm-param non-empty-string $from - * @psalm-param non-empty-string $to - * @psalm-param list $chunks - */ - public function __construct(string $from, string $to, array $chunks = []) - { - $this->from = $from; - $this->to = $to; - $this->chunks = $chunks; - } - - /** - * @psalm-return non-empty-string - */ - public function from(): string - { - return $this->from; - } - - /** - * @psalm-return non-empty-string - */ - public function to(): string - { - return $this->to; - } - - /** - * @psalm-return list - */ - public function chunks(): array - { - return $this->chunks; - } - - /** - * @psalm-param list $chunks - */ - public function setChunks(array $chunks): void - { - $this->chunks = $chunks; - } - - /** - * @psalm-return non-empty-string - * - * @deprecated - */ - public function getFrom(): string - { - return $this->from; - } - - /** - * @psalm-return non-empty-string - * - * @deprecated - */ - public function getTo(): string - { - return $this->to; - } - - /** - * @psalm-return list - * - * @deprecated - */ - public function getChunks(): array - { - return $this->chunks; - } - - public function getIterator(): Traversable - { - return new ArrayIterator($this->chunks); - } -} diff --git a/vendor/sebastian/diff/src/Differ.php b/vendor/sebastian/diff/src/Differ.php deleted file mode 100644 index 801fe02..0000000 --- a/vendor/sebastian/diff/src/Differ.php +++ /dev/null @@ -1,239 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Diff; - -use const PHP_INT_SIZE; -use const PREG_SPLIT_DELIM_CAPTURE; -use const PREG_SPLIT_NO_EMPTY; -use function array_shift; -use function array_unshift; -use function array_values; -use function count; -use function current; -use function end; -use function is_string; -use function key; -use function min; -use function preg_split; -use function prev; -use function reset; -use function str_ends_with; -use function substr; -use SebastianBergmann\Diff\Output\DiffOutputBuilderInterface; - -final class Differ -{ - public const OLD = 0; - public const ADDED = 1; - public const REMOVED = 2; - public const DIFF_LINE_END_WARNING = 3; - public const NO_LINE_END_EOF_WARNING = 4; - private DiffOutputBuilderInterface $outputBuilder; - - public function __construct(DiffOutputBuilderInterface $outputBuilder) - { - $this->outputBuilder = $outputBuilder; - } - - public function diff(array|string $from, array|string $to, ?LongestCommonSubsequenceCalculator $lcs = null): string - { - $diff = $this->diffToArray($from, $to, $lcs); - - return $this->outputBuilder->getDiff($diff); - } - - public function diffToArray(array|string $from, array|string $to, ?LongestCommonSubsequenceCalculator $lcs = null): array - { - if (is_string($from)) { - $from = $this->splitStringByLines($from); - } - - if (is_string($to)) { - $to = $this->splitStringByLines($to); - } - - [$from, $to, $start, $end] = self::getArrayDiffParted($from, $to); - - if ($lcs === null) { - $lcs = $this->selectLcsImplementation($from, $to); - } - - $common = $lcs->calculate(array_values($from), array_values($to)); - $diff = []; - - foreach ($start as $token) { - $diff[] = [$token, self::OLD]; - } - - reset($from); - reset($to); - - foreach ($common as $token) { - while (($fromToken = reset($from)) !== $token) { - $diff[] = [array_shift($from), self::REMOVED]; - } - - while (($toToken = reset($to)) !== $token) { - $diff[] = [array_shift($to), self::ADDED]; - } - - $diff[] = [$token, self::OLD]; - - array_shift($from); - array_shift($to); - } - - while (($token = array_shift($from)) !== null) { - $diff[] = [$token, self::REMOVED]; - } - - while (($token = array_shift($to)) !== null) { - $diff[] = [$token, self::ADDED]; - } - - foreach ($end as $token) { - $diff[] = [$token, self::OLD]; - } - - if ($this->detectUnmatchedLineEndings($diff)) { - array_unshift($diff, ["#Warning: Strings contain different line endings!\n", self::DIFF_LINE_END_WARNING]); - } - - return $diff; - } - - private function splitStringByLines(string $input): array - { - return preg_split('/(.*\R)/', $input, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); - } - - private function selectLcsImplementation(array $from, array $to): LongestCommonSubsequenceCalculator - { - // We do not want to use the time-efficient implementation if its memory - // footprint will probably exceed this value. Note that the footprint - // calculation is only an estimation for the matrix and the LCS method - // will typically allocate a bit more memory than this. - $memoryLimit = 100 * 1024 * 1024; - - if ($this->calculateEstimatedFootprint($from, $to) > $memoryLimit) { - return new MemoryEfficientLongestCommonSubsequenceCalculator; - } - - return new TimeEfficientLongestCommonSubsequenceCalculator; - } - - private function calculateEstimatedFootprint(array $from, array $to): float|int - { - $itemSize = PHP_INT_SIZE === 4 ? 76 : 144; - - return $itemSize * min(count($from), count($to)) ** 2; - } - - private function detectUnmatchedLineEndings(array $diff): bool - { - $newLineBreaks = ['' => true]; - $oldLineBreaks = ['' => true]; - - foreach ($diff as $entry) { - if (self::OLD === $entry[1]) { - $ln = $this->getLinebreak($entry[0]); - $oldLineBreaks[$ln] = true; - $newLineBreaks[$ln] = true; - } elseif (self::ADDED === $entry[1]) { - $newLineBreaks[$this->getLinebreak($entry[0])] = true; - } elseif (self::REMOVED === $entry[1]) { - $oldLineBreaks[$this->getLinebreak($entry[0])] = true; - } - } - - // if either input or output is a single line without breaks than no warning should be raised - if (['' => true] === $newLineBreaks || ['' => true] === $oldLineBreaks) { - return false; - } - - // two-way compare - foreach ($newLineBreaks as $break => $set) { - if (!isset($oldLineBreaks[$break])) { - return true; - } - } - - foreach ($oldLineBreaks as $break => $set) { - if (!isset($newLineBreaks[$break])) { - return true; - } - } - - return false; - } - - private function getLinebreak($line): string - { - if (!is_string($line)) { - return ''; - } - - $lc = substr($line, -1); - - if ("\r" === $lc) { - return "\r"; - } - - if ("\n" !== $lc) { - return ''; - } - - if (str_ends_with($line, "\r\n")) { - return "\r\n"; - } - - return "\n"; - } - - private static function getArrayDiffParted(array &$from, array &$to): array - { - $start = []; - $end = []; - - reset($to); - - foreach ($from as $k => $v) { - $toK = key($to); - - if ($toK === $k && $v === $to[$k]) { - $start[$k] = $v; - - unset($from[$k], $to[$k]); - } else { - break; - } - } - - end($from); - end($to); - - do { - $fromK = key($from); - $toK = key($to); - - if (null === $fromK || null === $toK || current($from) !== current($to)) { - break; - } - - prev($from); - prev($to); - - $end = [$fromK => $from[$fromK]] + $end; - unset($from[$fromK], $to[$toK]); - } while (true); - - return [$from, $to, $start, $end]; - } -} diff --git a/vendor/sebastian/diff/src/Exception/ConfigurationException.php b/vendor/sebastian/diff/src/Exception/ConfigurationException.php deleted file mode 100644 index b2abf0c..0000000 --- a/vendor/sebastian/diff/src/Exception/ConfigurationException.php +++ /dev/null @@ -1,37 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Diff; - -use function gettype; -use function is_object; -use function sprintf; -use Exception; - -final class ConfigurationException extends InvalidArgumentException -{ - public function __construct( - string $option, - string $expected, - $value, - int $code = 0, - ?Exception $previous = null - ) { - parent::__construct( - sprintf( - 'Option "%s" must be %s, got "%s".', - $option, - $expected, - is_object($value) ? $value::class : (null === $value ? '' : gettype($value) . '#' . $value), - ), - $code, - $previous, - ); - } -} diff --git a/vendor/sebastian/diff/src/Exception/Exception.php b/vendor/sebastian/diff/src/Exception/Exception.php deleted file mode 100644 index e20d320..0000000 --- a/vendor/sebastian/diff/src/Exception/Exception.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Diff; - -use Throwable; - -interface Exception extends Throwable -{ -} diff --git a/vendor/sebastian/diff/src/Exception/InvalidArgumentException.php b/vendor/sebastian/diff/src/Exception/InvalidArgumentException.php deleted file mode 100644 index 846ac3f..0000000 --- a/vendor/sebastian/diff/src/Exception/InvalidArgumentException.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Diff; - -class InvalidArgumentException extends \InvalidArgumentException implements Exception -{ -} diff --git a/vendor/sebastian/diff/src/Line.php b/vendor/sebastian/diff/src/Line.php deleted file mode 100644 index 4e708ab..0000000 --- a/vendor/sebastian/diff/src/Line.php +++ /dev/null @@ -1,66 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Diff; - -final class Line -{ - public const ADDED = 1; - public const REMOVED = 2; - public const UNCHANGED = 3; - private int $type; - private string $content; - - public function __construct(int $type = self::UNCHANGED, string $content = '') - { - $this->type = $type; - $this->content = $content; - } - - public function content(): string - { - return $this->content; - } - - public function type(): int - { - return $this->type; - } - - public function isAdded(): bool - { - return $this->type === self::ADDED; - } - - public function isRemoved(): bool - { - return $this->type === self::REMOVED; - } - - public function isUnchanged(): bool - { - return $this->type === self::UNCHANGED; - } - - /** - * @deprecated - */ - public function getContent(): string - { - return $this->content; - } - - /** - * @deprecated - */ - public function getType(): int - { - return $this->type; - } -} diff --git a/vendor/sebastian/diff/src/LongestCommonSubsequenceCalculator.php b/vendor/sebastian/diff/src/LongestCommonSubsequenceCalculator.php deleted file mode 100644 index dea8fe1..0000000 --- a/vendor/sebastian/diff/src/LongestCommonSubsequenceCalculator.php +++ /dev/null @@ -1,18 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Diff; - -interface LongestCommonSubsequenceCalculator -{ - /** - * Calculates the longest common subsequence of two arrays. - */ - public function calculate(array $from, array $to): array; -} diff --git a/vendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php b/vendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php deleted file mode 100644 index b9846c3..0000000 --- a/vendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php +++ /dev/null @@ -1,97 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Diff; - -use function array_fill; -use function array_merge; -use function array_reverse; -use function array_slice; -use function count; -use function in_array; -use function max; - -final class MemoryEfficientLongestCommonSubsequenceCalculator implements LongestCommonSubsequenceCalculator -{ - /** - * @inheritDoc - */ - public function calculate(array $from, array $to): array - { - $cFrom = count($from); - $cTo = count($to); - - if ($cFrom === 0) { - return []; - } - - if ($cFrom === 1) { - if (in_array($from[0], $to, true)) { - return [$from[0]]; - } - - return []; - } - - $i = (int) ($cFrom / 2); - $fromStart = array_slice($from, 0, $i); - $fromEnd = array_slice($from, $i); - $llB = $this->length($fromStart, $to); - $llE = $this->length(array_reverse($fromEnd), array_reverse($to)); - $jMax = 0; - $max = 0; - - for ($j = 0; $j <= $cTo; $j++) { - $m = $llB[$j] + $llE[$cTo - $j]; - - if ($m >= $max) { - $max = $m; - $jMax = $j; - } - } - - $toStart = array_slice($to, 0, $jMax); - $toEnd = array_slice($to, $jMax); - - return array_merge( - $this->calculate($fromStart, $toStart), - $this->calculate($fromEnd, $toEnd), - ); - } - - private function length(array $from, array $to): array - { - $current = array_fill(0, count($to) + 1, 0); - $cFrom = count($from); - $cTo = count($to); - - for ($i = 0; $i < $cFrom; $i++) { - $prev = $current; - - for ($j = 0; $j < $cTo; $j++) { - if ($from[$i] === $to[$j]) { - $current[$j + 1] = $prev[$j] + 1; - } else { - /** - * @noinspection PhpConditionCanBeReplacedWithMinMaxCallInspection - * - * We do not use max() here to avoid the function call overhead - */ - if ($current[$j] > $prev[$j + 1]) { - $current[$j + 1] = $current[$j]; - } else { - $current[$j + 1] = $prev[$j + 1]; - } - } - } - } - - return $current; - } -} diff --git a/vendor/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php b/vendor/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php deleted file mode 100644 index 6c70683..0000000 --- a/vendor/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Diff\Output; - -use function count; - -abstract class AbstractChunkOutputBuilder implements DiffOutputBuilderInterface -{ - /** - * Takes input of the diff array and returns the common parts. - * Iterates through diff line by line. - */ - protected function getCommonChunks(array $diff, int $lineThreshold = 5): array - { - $diffSize = count($diff); - $capturing = false; - $chunkStart = 0; - $chunkSize = 0; - $commonChunks = []; - - for ($i = 0; $i < $diffSize; $i++) { - if ($diff[$i][1] === 0 /* OLD */) { - if ($capturing === false) { - $capturing = true; - $chunkStart = $i; - $chunkSize = 0; - } else { - $chunkSize++; - } - } elseif ($capturing !== false) { - if ($chunkSize >= $lineThreshold) { - $commonChunks[$chunkStart] = $chunkStart + $chunkSize; - } - - $capturing = false; - } - } - - if ($capturing !== false && $chunkSize >= $lineThreshold) { - $commonChunks[$chunkStart] = $chunkStart + $chunkSize; - } - - return $commonChunks; - } -} diff --git a/vendor/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php b/vendor/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php deleted file mode 100644 index fd6ce76..0000000 --- a/vendor/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php +++ /dev/null @@ -1,70 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Diff\Output; - -use function fclose; -use function fopen; -use function fwrite; -use function str_ends_with; -use function stream_get_contents; -use function substr; -use SebastianBergmann\Diff\Differ; - -/** - * Builds a diff string representation in a loose unified diff format - * listing only changes lines. Does not include line numbers. - */ -final class DiffOnlyOutputBuilder implements DiffOutputBuilderInterface -{ - private string $header; - - public function __construct(string $header = "--- Original\n+++ New\n") - { - $this->header = $header; - } - - public function getDiff(array $diff): string - { - $buffer = fopen('php://memory', 'r+b'); - - if ('' !== $this->header) { - fwrite($buffer, $this->header); - - if (!str_ends_with($this->header, "\n")) { - fwrite($buffer, "\n"); - } - } - - foreach ($diff as $diffEntry) { - if ($diffEntry[1] === Differ::ADDED) { - fwrite($buffer, '+' . $diffEntry[0]); - } elseif ($diffEntry[1] === Differ::REMOVED) { - fwrite($buffer, '-' . $diffEntry[0]); - } elseif ($diffEntry[1] === Differ::DIFF_LINE_END_WARNING) { - fwrite($buffer, ' ' . $diffEntry[0]); - - continue; // Warnings should not be tested for line break, it will always be there - } else { /* Not changed (old) 0 */ - continue; // we didn't write the not-changed line, so do not add a line break either - } - - $lc = substr($diffEntry[0], -1); - - if ($lc !== "\n" && $lc !== "\r") { - fwrite($buffer, "\n"); // \No newline at end of file - } - } - - $diff = stream_get_contents($buffer, -1, 0); - fclose($buffer); - - return $diff; - } -} diff --git a/vendor/sebastian/diff/src/Output/DiffOutputBuilderInterface.php b/vendor/sebastian/diff/src/Output/DiffOutputBuilderInterface.php deleted file mode 100644 index 0e18f9f..0000000 --- a/vendor/sebastian/diff/src/Output/DiffOutputBuilderInterface.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Diff\Output; - -/** - * Defines how an output builder should take a generated - * diff array and return a string representation of that diff. - */ -interface DiffOutputBuilderInterface -{ - public function getDiff(array $diff): string; -} diff --git a/vendor/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php b/vendor/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php deleted file mode 100644 index a2a73b6..0000000 --- a/vendor/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php +++ /dev/null @@ -1,326 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Diff\Output; - -use function array_merge; -use function array_splice; -use function count; -use function fclose; -use function fopen; -use function fwrite; -use function is_bool; -use function is_int; -use function is_string; -use function max; -use function min; -use function sprintf; -use function stream_get_contents; -use function substr; -use SebastianBergmann\Diff\ConfigurationException; -use SebastianBergmann\Diff\Differ; - -/** - * Strict Unified diff output builder. - * - * Generates (strict) Unified diff's (unidiffs) with hunks. - */ -final class StrictUnifiedDiffOutputBuilder implements DiffOutputBuilderInterface -{ - private static array $default = [ - 'collapseRanges' => true, // ranges of length one are rendered with the trailing `,1` - 'commonLineThreshold' => 6, // number of same lines before ending a new hunk and creating a new one (if needed) - 'contextLines' => 3, // like `diff: -u, -U NUM, --unified[=NUM]`, for patch/git apply compatibility best to keep at least @ 3 - 'fromFile' => null, - 'fromFileDate' => null, - 'toFile' => null, - 'toFileDate' => null, - ]; - private bool $changed; - private bool $collapseRanges; - - /** - * @psalm-var positive-int - */ - private int $commonLineThreshold; - private string $header; - - /** - * @psalm-var positive-int - */ - private int $contextLines; - - public function __construct(array $options = []) - { - $options = array_merge(self::$default, $options); - - if (!is_bool($options['collapseRanges'])) { - throw new ConfigurationException('collapseRanges', 'a bool', $options['collapseRanges']); - } - - if (!is_int($options['contextLines']) || $options['contextLines'] < 0) { - throw new ConfigurationException('contextLines', 'an int >= 0', $options['contextLines']); - } - - if (!is_int($options['commonLineThreshold']) || $options['commonLineThreshold'] <= 0) { - throw new ConfigurationException('commonLineThreshold', 'an int > 0', $options['commonLineThreshold']); - } - - $this->assertString($options, 'fromFile'); - $this->assertString($options, 'toFile'); - $this->assertStringOrNull($options, 'fromFileDate'); - $this->assertStringOrNull($options, 'toFileDate'); - - $this->header = sprintf( - "--- %s%s\n+++ %s%s\n", - $options['fromFile'], - null === $options['fromFileDate'] ? '' : "\t" . $options['fromFileDate'], - $options['toFile'], - null === $options['toFileDate'] ? '' : "\t" . $options['toFileDate'], - ); - - $this->collapseRanges = $options['collapseRanges']; - $this->commonLineThreshold = $options['commonLineThreshold']; - $this->contextLines = $options['contextLines']; - } - - public function getDiff(array $diff): string - { - if (0 === count($diff)) { - return ''; - } - - $this->changed = false; - - $buffer = fopen('php://memory', 'r+b'); - fwrite($buffer, $this->header); - - $this->writeDiffHunks($buffer, $diff); - - if (!$this->changed) { - fclose($buffer); - - return ''; - } - - $diff = stream_get_contents($buffer, -1, 0); - - fclose($buffer); - - // If the last char is not a linebreak: add it. - // This might happen when both the `from` and `to` do not have a trailing linebreak - $last = substr($diff, -1); - - return "\n" !== $last && "\r" !== $last - ? $diff . "\n" - : $diff; - } - - private function writeDiffHunks($output, array $diff): void - { - // detect "No newline at end of file" and insert into `$diff` if needed - - $upperLimit = count($diff); - - if (0 === $diff[$upperLimit - 1][1]) { - $lc = substr($diff[$upperLimit - 1][0], -1); - - if ("\n" !== $lc) { - array_splice($diff, $upperLimit, 0, [["\n\\ No newline at end of file\n", Differ::NO_LINE_END_EOF_WARNING]]); - } - } else { - // search back for the last `+` and `-` line, - // check if it has a trailing linebreak, else add a warning under it - $toFind = [1 => true, 2 => true]; - - for ($i = $upperLimit - 1; $i >= 0; $i--) { - if (isset($toFind[$diff[$i][1]])) { - unset($toFind[$diff[$i][1]]); - $lc = substr($diff[$i][0], -1); - - if ("\n" !== $lc) { - array_splice($diff, $i + 1, 0, [["\n\\ No newline at end of file\n", Differ::NO_LINE_END_EOF_WARNING]]); - } - - if (!count($toFind)) { - break; - } - } - } - } - - // write hunks to output buffer - - $cutOff = max($this->commonLineThreshold, $this->contextLines); - $hunkCapture = false; - $sameCount = $toRange = $fromRange = 0; - $toStart = $fromStart = 1; - $i = 0; - - /** @var int $i */ - foreach ($diff as $i => $entry) { - if (0 === $entry[1]) { // same - if (false === $hunkCapture) { - $fromStart++; - $toStart++; - - continue; - } - - $sameCount++; - $toRange++; - $fromRange++; - - if ($sameCount === $cutOff) { - $contextStartOffset = ($hunkCapture - $this->contextLines) < 0 - ? $hunkCapture - : $this->contextLines; - - // note: $contextEndOffset = $this->contextLines; - // - // because we never go beyond the end of the diff. - // with the cutoff/contextlines here the follow is never true; - // - // if ($i - $cutOff + $this->contextLines + 1 > \count($diff)) { - // $contextEndOffset = count($diff) - 1; - // } - // - // ; that would be true for a trailing incomplete hunk case which is dealt with after this loop - - $this->writeHunk( - $diff, - $hunkCapture - $contextStartOffset, - $i - $cutOff + $this->contextLines + 1, - $fromStart - $contextStartOffset, - $fromRange - $cutOff + $contextStartOffset + $this->contextLines, - $toStart - $contextStartOffset, - $toRange - $cutOff + $contextStartOffset + $this->contextLines, - $output, - ); - - $fromStart += $fromRange; - $toStart += $toRange; - - $hunkCapture = false; - $sameCount = $toRange = $fromRange = 0; - } - - continue; - } - - $sameCount = 0; - - if ($entry[1] === Differ::NO_LINE_END_EOF_WARNING) { - continue; - } - - $this->changed = true; - - if (false === $hunkCapture) { - $hunkCapture = $i; - } - - if (Differ::ADDED === $entry[1]) { // added - $toRange++; - } - - if (Differ::REMOVED === $entry[1]) { // removed - $fromRange++; - } - } - - if (false === $hunkCapture) { - return; - } - - // we end here when cutoff (commonLineThreshold) was not reached, but we were capturing a hunk, - // do not render hunk till end automatically because the number of context lines might be less than the commonLineThreshold - - $contextStartOffset = $hunkCapture - $this->contextLines < 0 - ? $hunkCapture - : $this->contextLines; - - // prevent trying to write out more common lines than there are in the diff _and_ - // do not write more than configured through the context lines - $contextEndOffset = min($sameCount, $this->contextLines); - - $fromRange -= $sameCount; - $toRange -= $sameCount; - - $this->writeHunk( - $diff, - $hunkCapture - $contextStartOffset, - $i - $sameCount + $contextEndOffset + 1, - $fromStart - $contextStartOffset, - $fromRange + $contextStartOffset + $contextEndOffset, - $toStart - $contextStartOffset, - $toRange + $contextStartOffset + $contextEndOffset, - $output, - ); - } - - private function writeHunk( - array $diff, - int $diffStartIndex, - int $diffEndIndex, - int $fromStart, - int $fromRange, - int $toStart, - int $toRange, - $output - ): void { - fwrite($output, '@@ -' . $fromStart); - - if (!$this->collapseRanges || 1 !== $fromRange) { - fwrite($output, ',' . $fromRange); - } - - fwrite($output, ' +' . $toStart); - - if (!$this->collapseRanges || 1 !== $toRange) { - fwrite($output, ',' . $toRange); - } - - fwrite($output, " @@\n"); - - for ($i = $diffStartIndex; $i < $diffEndIndex; $i++) { - if ($diff[$i][1] === Differ::ADDED) { - $this->changed = true; - fwrite($output, '+' . $diff[$i][0]); - } elseif ($diff[$i][1] === Differ::REMOVED) { - $this->changed = true; - fwrite($output, '-' . $diff[$i][0]); - } elseif ($diff[$i][1] === Differ::OLD) { - fwrite($output, ' ' . $diff[$i][0]); - } elseif ($diff[$i][1] === Differ::NO_LINE_END_EOF_WARNING) { - $this->changed = true; - fwrite($output, $diff[$i][0]); - } - // } elseif ($diff[$i][1] === Differ::DIFF_LINE_END_WARNING) { // custom comment inserted by PHPUnit/diff package - // skip - // } else { - // unknown/invalid - // } - } - } - - private function assertString(array $options, string $option): void - { - if (!is_string($options[$option])) { - throw new ConfigurationException($option, 'a string', $options[$option]); - } - } - - private function assertStringOrNull(array $options, string $option): void - { - if (null !== $options[$option] && !is_string($options[$option])) { - throw new ConfigurationException($option, 'a string or ', $options[$option]); - } - } -} diff --git a/vendor/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php b/vendor/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php deleted file mode 100644 index 683ab1b..0000000 --- a/vendor/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php +++ /dev/null @@ -1,257 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Diff\Output; - -use function array_splice; -use function count; -use function fclose; -use function fopen; -use function fwrite; -use function max; -use function min; -use function str_ends_with; -use function stream_get_contents; -use function substr; -use SebastianBergmann\Diff\Differ; - -/** - * Builds a diff string representation in unified diff format in chunks. - */ -final class UnifiedDiffOutputBuilder extends AbstractChunkOutputBuilder -{ - private bool $collapseRanges = true; - private int $commonLineThreshold = 6; - - /** - * @psalm-var positive-int - */ - private int $contextLines = 3; - private string $header; - private bool $addLineNumbers; - - public function __construct(string $header = "--- Original\n+++ New\n", bool $addLineNumbers = false) - { - $this->header = $header; - $this->addLineNumbers = $addLineNumbers; - } - - public function getDiff(array $diff): string - { - $buffer = fopen('php://memory', 'r+b'); - - if ('' !== $this->header) { - fwrite($buffer, $this->header); - - if (!str_ends_with($this->header, "\n")) { - fwrite($buffer, "\n"); - } - } - - if (0 !== count($diff)) { - $this->writeDiffHunks($buffer, $diff); - } - - $diff = stream_get_contents($buffer, -1, 0); - - fclose($buffer); - - // If the diff is non-empty and last char is not a linebreak: add it. - // This might happen when both the `from` and `to` do not have a trailing linebreak - $last = substr($diff, -1); - - return '' !== $diff && "\n" !== $last && "\r" !== $last - ? $diff . "\n" - : $diff; - } - - private function writeDiffHunks($output, array $diff): void - { - // detect "No newline at end of file" and insert into `$diff` if needed - - $upperLimit = count($diff); - - if (0 === $diff[$upperLimit - 1][1]) { - $lc = substr($diff[$upperLimit - 1][0], -1); - - if ("\n" !== $lc) { - array_splice($diff, $upperLimit, 0, [["\n\\ No newline at end of file\n", Differ::NO_LINE_END_EOF_WARNING]]); - } - } else { - // search back for the last `+` and `-` line, - // check if it has trailing linebreak, else add a warning under it - $toFind = [1 => true, 2 => true]; - - for ($i = $upperLimit - 1; $i >= 0; $i--) { - if (isset($toFind[$diff[$i][1]])) { - unset($toFind[$diff[$i][1]]); - $lc = substr($diff[$i][0], -1); - - if ("\n" !== $lc) { - array_splice($diff, $i + 1, 0, [["\n\\ No newline at end of file\n", Differ::NO_LINE_END_EOF_WARNING]]); - } - - if (!count($toFind)) { - break; - } - } - } - } - - // write hunks to output buffer - - $cutOff = max($this->commonLineThreshold, $this->contextLines); - $hunkCapture = false; - $sameCount = $toRange = $fromRange = 0; - $toStart = $fromStart = 1; - $i = 0; - - /** @var int $i */ - foreach ($diff as $i => $entry) { - if (0 === $entry[1]) { // same - if (false === $hunkCapture) { - $fromStart++; - $toStart++; - - continue; - } - - $sameCount++; - $toRange++; - $fromRange++; - - if ($sameCount === $cutOff) { - $contextStartOffset = ($hunkCapture - $this->contextLines) < 0 - ? $hunkCapture - : $this->contextLines; - - // note: $contextEndOffset = $this->contextLines; - // - // because we never go beyond the end of the diff. - // with the cutoff/contextlines here the follow is never true; - // - // if ($i - $cutOff + $this->contextLines + 1 > \count($diff)) { - // $contextEndOffset = count($diff) - 1; - // } - // - // ; that would be true for a trailing incomplete hunk case which is dealt with after this loop - - $this->writeHunk( - $diff, - $hunkCapture - $contextStartOffset, - $i - $cutOff + $this->contextLines + 1, - $fromStart - $contextStartOffset, - $fromRange - $cutOff + $contextStartOffset + $this->contextLines, - $toStart - $contextStartOffset, - $toRange - $cutOff + $contextStartOffset + $this->contextLines, - $output, - ); - - $fromStart += $fromRange; - $toStart += $toRange; - - $hunkCapture = false; - $sameCount = $toRange = $fromRange = 0; - } - - continue; - } - - $sameCount = 0; - - if ($entry[1] === Differ::NO_LINE_END_EOF_WARNING) { - continue; - } - - if (false === $hunkCapture) { - $hunkCapture = $i; - } - - if (Differ::ADDED === $entry[1]) { - $toRange++; - } - - if (Differ::REMOVED === $entry[1]) { - $fromRange++; - } - } - - if (false === $hunkCapture) { - return; - } - - // we end here when cutoff (commonLineThreshold) was not reached, but we were capturing a hunk, - // do not render hunk till end automatically because the number of context lines might be less than the commonLineThreshold - - $contextStartOffset = $hunkCapture - $this->contextLines < 0 - ? $hunkCapture - : $this->contextLines; - - // prevent trying to write out more common lines than there are in the diff _and_ - // do not write more than configured through the context lines - $contextEndOffset = min($sameCount, $this->contextLines); - - $fromRange -= $sameCount; - $toRange -= $sameCount; - - $this->writeHunk( - $diff, - $hunkCapture - $contextStartOffset, - $i - $sameCount + $contextEndOffset + 1, - $fromStart - $contextStartOffset, - $fromRange + $contextStartOffset + $contextEndOffset, - $toStart - $contextStartOffset, - $toRange + $contextStartOffset + $contextEndOffset, - $output, - ); - } - - private function writeHunk( - array $diff, - int $diffStartIndex, - int $diffEndIndex, - int $fromStart, - int $fromRange, - int $toStart, - int $toRange, - $output - ): void { - if ($this->addLineNumbers) { - fwrite($output, '@@ -' . $fromStart); - - if (!$this->collapseRanges || 1 !== $fromRange) { - fwrite($output, ',' . $fromRange); - } - - fwrite($output, ' +' . $toStart); - - if (!$this->collapseRanges || 1 !== $toRange) { - fwrite($output, ',' . $toRange); - } - - fwrite($output, " @@\n"); - } else { - fwrite($output, "@@ @@\n"); - } - - for ($i = $diffStartIndex; $i < $diffEndIndex; $i++) { - if ($diff[$i][1] === Differ::ADDED) { - fwrite($output, '+' . $diff[$i][0]); - } elseif ($diff[$i][1] === Differ::REMOVED) { - fwrite($output, '-' . $diff[$i][0]); - } elseif ($diff[$i][1] === Differ::OLD) { - fwrite($output, ' ' . $diff[$i][0]); - } elseif ($diff[$i][1] === Differ::NO_LINE_END_EOF_WARNING) { - fwrite($output, "\n"); // $diff[$i][0] - } else { /* Not changed (old) Differ::OLD or Warning Differ::DIFF_LINE_END_WARNING */ - fwrite($output, ' ' . $diff[$i][0]); - } - } - } -} diff --git a/vendor/sebastian/diff/src/Parser.php b/vendor/sebastian/diff/src/Parser.php deleted file mode 100644 index 9293fc9..0000000 --- a/vendor/sebastian/diff/src/Parser.php +++ /dev/null @@ -1,112 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Diff; - -use function array_pop; -use function assert; -use function count; -use function max; -use function preg_match; -use function preg_split; - -/** - * Unified diff parser. - */ -final class Parser -{ - /** - * @return Diff[] - */ - public function parse(string $string): array - { - $lines = preg_split('(\r\n|\r|\n)', $string); - - if (!empty($lines) && $lines[count($lines) - 1] === '') { - array_pop($lines); - } - - $lineCount = count($lines); - $diffs = []; - $diff = null; - $collected = []; - - for ($i = 0; $i < $lineCount; $i++) { - if (preg_match('#^---\h+"?(?P[^\\v\\t"]+)#', $lines[$i], $fromMatch) && - preg_match('#^\\+\\+\\+\\h+"?(?P[^\\v\\t"]+)#', $lines[$i + 1], $toMatch)) { - if ($diff !== null) { - $this->parseFileDiff($diff, $collected); - - $diffs[] = $diff; - $collected = []; - } - - assert(!empty($fromMatch['file'])); - assert(!empty($toMatch['file'])); - - $diff = new Diff($fromMatch['file'], $toMatch['file']); - - $i++; - } else { - if (preg_match('/^(?:diff --git |index [\da-f.]+|[+-]{3} [ab])/', $lines[$i])) { - continue; - } - - $collected[] = $lines[$i]; - } - } - - if ($diff !== null && count($collected)) { - $this->parseFileDiff($diff, $collected); - - $diffs[] = $diff; - } - - return $diffs; - } - - private function parseFileDiff(Diff $diff, array $lines): void - { - $chunks = []; - $chunk = null; - $diffLines = []; - - foreach ($lines as $line) { - if (preg_match('/^@@\s+-(?P\d+)(?:,\s*(?P\d+))?\s+\+(?P\d+)(?:,\s*(?P\d+))?\s+@@/', $line, $match, PREG_UNMATCHED_AS_NULL)) { - $chunk = new Chunk( - (int) $match['start'], - isset($match['startrange']) ? max(0, (int) $match['startrange']) : 1, - (int) $match['end'], - isset($match['endrange']) ? max(0, (int) $match['endrange']) : 1, - ); - - $chunks[] = $chunk; - $diffLines = []; - - continue; - } - - if (preg_match('/^(?P[+ -])?(?P.*)/', $line, $match)) { - $type = Line::UNCHANGED; - - if ($match['type'] === '+') { - $type = Line::ADDED; - } elseif ($match['type'] === '-') { - $type = Line::REMOVED; - } - - $diffLines[] = new Line($type, $match['line']); - - $chunk?->setLines($diffLines); - } - } - - $diff->setChunks($chunks); - } -} diff --git a/vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php b/vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php deleted file mode 100644 index 93b7628..0000000 --- a/vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php +++ /dev/null @@ -1,82 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Diff; - -use function array_reverse; -use function count; -use function max; -use SplFixedArray; - -final class TimeEfficientLongestCommonSubsequenceCalculator implements LongestCommonSubsequenceCalculator -{ - /** - * @inheritDoc - */ - public function calculate(array $from, array $to): array - { - $common = []; - $fromLength = count($from); - $toLength = count($to); - $width = $fromLength + 1; - $matrix = new SplFixedArray($width * ($toLength + 1)); - - for ($i = 0; $i <= $fromLength; $i++) { - $matrix[$i] = 0; - } - - for ($j = 0; $j <= $toLength; $j++) { - $matrix[$j * $width] = 0; - } - - for ($i = 1; $i <= $fromLength; $i++) { - for ($j = 1; $j <= $toLength; $j++) { - $o = ($j * $width) + $i; - - // don't use max() to avoid function call overhead - $firstOrLast = $from[$i - 1] === $to[$j - 1] ? $matrix[$o - $width - 1] + 1 : 0; - - if ($matrix[$o - 1] > $matrix[$o - $width]) { - if ($firstOrLast > $matrix[$o - 1]) { - $matrix[$o] = $firstOrLast; - } else { - $matrix[$o] = $matrix[$o - 1]; - } - } else { - if ($firstOrLast > $matrix[$o - $width]) { - $matrix[$o] = $firstOrLast; - } else { - $matrix[$o] = $matrix[$o - $width]; - } - } - } - } - - $i = $fromLength; - $j = $toLength; - - while ($i > 0 && $j > 0) { - if ($from[$i - 1] === $to[$j - 1]) { - $common[] = $from[$i - 1]; - $i--; - $j--; - } else { - $o = ($j * $width) + $i; - - if ($matrix[$o - $width] > $matrix[$o - 1]) { - $j--; - } else { - $i--; - } - } - } - - return array_reverse($common); - } -} diff --git a/vendor/sebastian/environment/ChangeLog.md b/vendor/sebastian/environment/ChangeLog.md deleted file mode 100644 index d3f29e1..0000000 --- a/vendor/sebastian/environment/ChangeLog.md +++ /dev/null @@ -1,207 +0,0 @@ -# Changes in sebastianbergmann/environment - -All notable changes in `sebastianbergmann/environment` are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. - -## [6.1.0] - 2024-03-23 - -### Added - -* [#72](https://github.com/sebastianbergmann/environment/pull/72): `Runtime::getRawBinary()` - -## [6.0.1] - 2023-04-11 - -### Fixed - -* [#68](https://github.com/sebastianbergmann/environment/pull/68): The Just-in-Time compiler is disabled when `opcache.jit_buffer_size` is set to `0` -* [#70](https://github.com/sebastianbergmann/environment/pull/70): The first `0` of `opcache.jit` only disables CPU-specific optimizations, not the Just-in-Time compiler itself - -## [6.0.0] - 2023-02-03 - -### Removed - -* Removed `SebastianBergmann\Environment\OperatingSystem::getFamily()` because this component is no longer supported on PHP versions that do not have `PHP_OS_FAMILY` -* Removed `SebastianBergmann\Environment\Runtime::isHHVM()` -* This component is no longer supported on PHP 7.3, PHP 7.4, and PHP 8.0 - -## [5.1.5] - 2022-MM-DD - -### Fixed - -* [#59](https://github.com/sebastianbergmann/environment/issues/59): Wrong usage of `stream_isatty()`, `fstat()` used without checking whether the function is available - -## [5.1.4] - 2022-04-03 - -### Fixed - -* [#63](https://github.com/sebastianbergmann/environment/pull/63): `Runtime::getCurrentSettings()` does not correctly process INI settings - -## [5.1.3] - 2020-09-28 - -### Changed - -* Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` - -## [5.1.2] - 2020-06-26 - -### Added - -* This component is now supported on PHP 8 - -## [5.1.1] - 2020-06-15 - -### Changed - -* Tests etc. are now ignored for archive exports - -## [5.1.0] - 2020-04-14 - -### Added - -* `Runtime::performsJustInTimeCompilation()` returns `true` if PHP 8's JIT is active, `false` otherwise - -## [5.0.2] - 2020-03-31 - -### Fixed - -* [#55](https://github.com/sebastianbergmann/environment/issues/55): `stty` command is executed even if no tty is available - -## [5.0.1] - 2020-02-19 - -### Changed - -* `Runtime::getNameWithVersionAndCodeCoverageDriver()` now prioritizes PCOV over Xdebug when both extensions are loaded (just like php-code-coverage does) - -## [5.0.0] - 2020-02-07 - -### Removed - -* This component is no longer supported on PHP 7.1 and PHP 7.2 - -## [4.2.3] - 2019-11-20 - -### Changed - -* [#50](https://github.com/sebastianbergmann/environment/pull/50): Windows improvements to console capabilities - -### Fixed - -* [#49](https://github.com/sebastianbergmann/environment/issues/49): Detection how OpCache handles docblocks does not work correctly when PHPDBG is used - -## [4.2.2] - 2019-05-05 - -### Fixed - -* [#44](https://github.com/sebastianbergmann/environment/pull/44): `TypeError` in `Console::getNumberOfColumnsInteractive()` - -## [4.2.1] - 2019-04-25 - -### Fixed - -* Fixed an issue in `Runtime::getCurrentSettings()` - -## [4.2.0] - 2019-04-25 - -### Added - -* [#36](https://github.com/sebastianbergmann/environment/pull/36): `Runtime::getCurrentSettings()` - -## [4.1.0] - 2019-02-01 - -### Added - -* Implemented `Runtime::getNameWithVersionAndCodeCoverageDriver()` method -* [#34](https://github.com/sebastianbergmann/environment/pull/34): Support for PCOV extension - -## [4.0.2] - 2019-01-28 - -### Fixed - -* [#33](https://github.com/sebastianbergmann/environment/issues/33): `Runtime::discardsComments()` returns true too eagerly - -### Removed - -* Removed support for Zend Optimizer+ in `Runtime::discardsComments()` - -## [4.0.1] - 2018-11-25 - -### Fixed - -* [#31](https://github.com/sebastianbergmann/environment/issues/31): Regressions in `Console` class - -## [4.0.0] - 2018-10-23 [YANKED] - -### Fixed - -* [#25](https://github.com/sebastianbergmann/environment/pull/25): `Console::hasColorSupport()` does not work on Windows - -### Removed - -* This component is no longer supported on PHP 7.0 - -## [3.1.0] - 2017-07-01 - -### Added - -* [#21](https://github.com/sebastianbergmann/environment/issues/21): Equivalent of `PHP_OS_FAMILY` (for PHP < 7.2) - -## [3.0.4] - 2017-06-20 - -### Fixed - -* [#20](https://github.com/sebastianbergmann/environment/pull/20): PHP 7 mode of HHVM not forced - -## [3.0.3] - 2017-05-18 - -### Fixed - -* [#18](https://github.com/sebastianbergmann/environment/issues/18): `Uncaught TypeError: preg_match() expects parameter 2 to be string, null given` - -## [3.0.2] - 2017-04-21 - -### Fixed - -* [#17](https://github.com/sebastianbergmann/environment/issues/17): `Uncaught TypeError: trim() expects parameter 1 to be string, boolean given` - -## [3.0.1] - 2017-04-21 - -### Fixed - -* Fixed inverted logic in `Runtime::discardsComments()` - -## [3.0.0] - 2017-04-21 - -### Added - -* Implemented `Runtime::discardsComments()` for querying whether the PHP runtime discards annotations - -### Removed - -* This component is no longer supported on PHP 5.6 - -[6.1.0]: https://github.com/sebastianbergmann/environment/compare/6.0.1...6.1.0 -[6.0.1]: https://github.com/sebastianbergmann/environment/compare/6.0.0...6.0.1 -[6.0.0]: https://github.com/sebastianbergmann/environment/compare/5.1.5...6.0.0 -[5.1.5]: https://github.com/sebastianbergmann/environment/compare/5.1.4...5.1.5 -[5.1.4]: https://github.com/sebastianbergmann/environment/compare/5.1.3...5.1.4 -[5.1.3]: https://github.com/sebastianbergmann/environment/compare/5.1.2...5.1.3 -[5.1.2]: https://github.com/sebastianbergmann/environment/compare/5.1.1...5.1.2 -[5.1.1]: https://github.com/sebastianbergmann/environment/compare/5.1.0...5.1.1 -[5.1.0]: https://github.com/sebastianbergmann/environment/compare/5.0.2...5.1.0 -[5.0.2]: https://github.com/sebastianbergmann/environment/compare/5.0.1...5.0.2 -[5.0.1]: https://github.com/sebastianbergmann/environment/compare/5.0.0...5.0.1 -[5.0.0]: https://github.com/sebastianbergmann/environment/compare/4.2.3...5.0.0 -[4.2.3]: https://github.com/sebastianbergmann/environment/compare/4.2.2...4.2.3 -[4.2.2]: https://github.com/sebastianbergmann/environment/compare/4.2.1...4.2.2 -[4.2.1]: https://github.com/sebastianbergmann/environment/compare/4.2.0...4.2.1 -[4.2.0]: https://github.com/sebastianbergmann/environment/compare/4.1.0...4.2.0 -[4.1.0]: https://github.com/sebastianbergmann/environment/compare/4.0.2...4.1.0 -[4.0.2]: https://github.com/sebastianbergmann/environment/compare/4.0.1...4.0.2 -[4.0.1]: https://github.com/sebastianbergmann/environment/compare/66691f8e2dc4641909166b275a9a4f45c0e89092...4.0.1 -[4.0.0]: https://github.com/sebastianbergmann/environment/compare/3.1.0...66691f8e2dc4641909166b275a9a4f45c0e89092 -[3.1.0]: https://github.com/sebastianbergmann/environment/compare/3.0...3.1.0 -[3.0.4]: https://github.com/sebastianbergmann/environment/compare/3.0.3...3.0.4 -[3.0.3]: https://github.com/sebastianbergmann/environment/compare/3.0.2...3.0.3 -[3.0.2]: https://github.com/sebastianbergmann/environment/compare/3.0.1...3.0.2 -[3.0.1]: https://github.com/sebastianbergmann/environment/compare/3.0.0...3.0.1 -[3.0.0]: https://github.com/sebastianbergmann/environment/compare/2.0...3.0.0 - diff --git a/vendor/sebastian/environment/LICENSE b/vendor/sebastian/environment/LICENSE deleted file mode 100644 index aecdbc7..0000000 --- a/vendor/sebastian/environment/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2014-2024, Sebastian Bergmann -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/sebastian/environment/README.md b/vendor/sebastian/environment/README.md deleted file mode 100644 index efe0a86..0000000 --- a/vendor/sebastian/environment/README.md +++ /dev/null @@ -1,22 +0,0 @@ -[![Latest Stable Version](https://poser.pugx.org/sebastian/environment/v/stable.png)](https://packagist.org/packages/sebastian/environment) -[![CI Status](https://github.com/sebastianbergmann/environment/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/environment/actions) -[![Type Coverage](https://shepherd.dev/github/sebastianbergmann/environment/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/environment) -[![codecov](https://codecov.io/gh/sebastianbergmann/environment/branch/main/graph/badge.svg)](https://codecov.io/gh/sebastianbergmann/environment) - -# sebastian/environment - -This component provides functionality that helps writing PHP code that has runtime-specific (PHP / HHVM) execution paths. - -## Installation - -You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - -``` -composer require sebastian/environment -``` - -If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - -``` -composer require --dev sebastian/environment -``` diff --git a/vendor/sebastian/environment/SECURITY.md b/vendor/sebastian/environment/SECURITY.md deleted file mode 100644 index d88ff00..0000000 --- a/vendor/sebastian/environment/SECURITY.md +++ /dev/null @@ -1,30 +0,0 @@ -# Security Policy - -If you believe you have found a security vulnerability in the library that is developed in this repository, please report it to us through coordinated disclosure. - -**Please do not report security vulnerabilities through public GitHub issues, discussions, or pull requests.** - -Instead, please email `sebastian@phpunit.de`. - -Please include as much of the information listed below as you can to help us better understand and resolve the issue: - -* The type of issue -* Full paths of source file(s) related to the manifestation of the issue -* The location of the affected source code (tag/branch/commit or direct URL) -* Any special configuration required to reproduce the issue -* Step-by-step instructions to reproduce the issue -* Proof-of-concept or exploit code (if possible) -* Impact of the issue, including how an attacker might exploit the issue - -This information will help us triage your report more quickly. - -## Web Context - -The library that is developed in this repository was either extracted from [PHPUnit](https://github.com/sebastianbergmann/phpunit) or developed specifically as a dependency for PHPUnit. - -The library is developed with a focus on development environments and the command-line. No specific testing or hardening with regard to using the library in an HTTP or web context or with untrusted input data is performed. The library might also contain functionality that intentionally exposes internal application data for debugging purposes. - -If the library is used in a web application, the application developer is responsible for filtering inputs or escaping outputs as necessary and for verifying that the used functionality is safe for use within the intended context. - -Vulnerabilities specific to the use outside a development context will be fixed as applicable, provided that the fix does not have an averse effect on the primary use case for development purposes. - diff --git a/vendor/sebastian/environment/composer.json b/vendor/sebastian/environment/composer.json deleted file mode 100644 index 61e4193..0000000 --- a/vendor/sebastian/environment/composer.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "sebastian/environment", - "description": "Provides functionality to handle HHVM/PHP environments", - "keywords": ["environment","hhvm","xdebug"], - "homepage": "https://github.com/sebastianbergmann/environment", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "support": { - "issues": "https://github.com/sebastianbergmann/environment/issues", - "security": "https://github.com/sebastianbergmann/environment/security/policy" - }, - "config": { - "platform": { - "php": "8.1.0" - }, - "optimize-autoloader": true, - "sort-packages": true - }, - "prefer-stable": true, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "suggest": { - "ext-posix": "*" - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "extra": { - "branch-alias": { - "dev-main": "6.1-dev" - } - } -} diff --git a/vendor/sebastian/environment/src/Console.php b/vendor/sebastian/environment/src/Console.php deleted file mode 100644 index 4f5943c..0000000 --- a/vendor/sebastian/environment/src/Console.php +++ /dev/null @@ -1,187 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Environment; - -use const DIRECTORY_SEPARATOR; -use const STDIN; -use const STDOUT; -use function defined; -use function fclose; -use function fstat; -use function function_exists; -use function getenv; -use function is_resource; -use function is_string; -use function posix_isatty; -use function preg_match; -use function proc_close; -use function proc_open; -use function sapi_windows_vt100_support; -use function shell_exec; -use function stream_get_contents; -use function stream_isatty; -use function trim; - -final class Console -{ - /** - * @var int - */ - public const STDIN = 0; - - /** - * @var int - */ - public const STDOUT = 1; - - /** - * @var int - */ - public const STDERR = 2; - - /** - * Returns true if STDOUT supports colorization. - * - * This code has been copied and adapted from - * Symfony\Component\Console\Output\StreamOutput. - */ - public function hasColorSupport(): bool - { - if ('Hyper' === getenv('TERM_PROGRAM')) { - return true; - } - - if ($this->isWindows()) { - // @codeCoverageIgnoreStart - return (defined('STDOUT') && function_exists('sapi_windows_vt100_support') && @sapi_windows_vt100_support(STDOUT)) || - false !== getenv('ANSICON') || - 'ON' === getenv('ConEmuANSI') || - 'xterm' === getenv('TERM'); - // @codeCoverageIgnoreEnd - } - - if (!defined('STDOUT')) { - // @codeCoverageIgnoreStart - return false; - // @codeCoverageIgnoreEnd - } - - return $this->isInteractive(STDOUT); - } - - /** - * Returns the number of columns of the terminal. - * - * @codeCoverageIgnore - */ - public function getNumberOfColumns(): int - { - if (!$this->isInteractive(defined('STDIN') ? STDIN : self::STDIN)) { - return 80; - } - - if ($this->isWindows()) { - return $this->getNumberOfColumnsWindows(); - } - - return $this->getNumberOfColumnsInteractive(); - } - - /** - * Returns if the file descriptor is an interactive terminal or not. - * - * Normally, we want to use a resource as a parameter, yet sadly it's not always available, - * eg when running code in interactive console (`php -a`), STDIN/STDOUT/STDERR constants are not defined. - * - * @param int|resource $fileDescriptor - */ - public function isInteractive($fileDescriptor = self::STDOUT): bool - { - if (is_resource($fileDescriptor)) { - if (function_exists('stream_isatty') && @stream_isatty($fileDescriptor)) { - return true; - } - - if (function_exists('fstat')) { - $stat = @fstat(STDOUT); - - return $stat && 0o020000 === ($stat['mode'] & 0o170000); - } - - return false; - } - - return function_exists('posix_isatty') && @posix_isatty($fileDescriptor); - } - - private function isWindows(): bool - { - return DIRECTORY_SEPARATOR === '\\'; - } - - /** - * @codeCoverageIgnore - */ - private function getNumberOfColumnsInteractive(): int - { - if (function_exists('shell_exec') && preg_match('#\d+ (\d+)#', shell_exec('stty size') ?: '', $match) === 1) { - if ((int) $match[1] > 0) { - return (int) $match[1]; - } - } - - if (function_exists('shell_exec') && preg_match('#columns = (\d+);#', shell_exec('stty') ?: '', $match) === 1) { - if ((int) $match[1] > 0) { - return (int) $match[1]; - } - } - - return 80; - } - - /** - * @codeCoverageIgnore - */ - private function getNumberOfColumnsWindows(): int - { - $ansicon = getenv('ANSICON'); - $columns = 80; - - if (is_string($ansicon) && preg_match('/^(\d+)x\d+ \(\d+x(\d+)\)$/', trim($ansicon), $matches)) { - $columns = (int) $matches[1]; - } elseif (function_exists('proc_open')) { - $process = proc_open( - 'mode CON', - [ - 1 => ['pipe', 'w'], - 2 => ['pipe', 'w'], - ], - $pipes, - null, - null, - ['suppress_errors' => true], - ); - - if (is_resource($process)) { - $info = stream_get_contents($pipes[1]); - - fclose($pipes[1]); - fclose($pipes[2]); - proc_close($process); - - if (preg_match('/--------+\r?\n.+?(\d+)\r?\n.+?(\d+)\r?\n/', $info, $matches)) { - $columns = (int) $matches[2]; - } - } - } - - return $columns - 1; - } -} diff --git a/vendor/sebastian/environment/src/Runtime.php b/vendor/sebastian/environment/src/Runtime.php deleted file mode 100644 index f9ec057..0000000 --- a/vendor/sebastian/environment/src/Runtime.php +++ /dev/null @@ -1,294 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Environment; - -use const PHP_BINARY; -use const PHP_BINDIR; -use const PHP_MAJOR_VERSION; -use const PHP_SAPI; -use const PHP_VERSION; -use function array_map; -use function array_merge; -use function escapeshellarg; -use function explode; -use function extension_loaded; -use function ini_get; -use function is_readable; -use function parse_ini_file; -use function php_ini_loaded_file; -use function php_ini_scanned_files; -use function phpversion; -use function sprintf; -use function strrpos; - -final class Runtime -{ - private static string $rawBinary; - private static bool $initialized = false; - - /** - * Returns true when Xdebug or PCOV is available or - * the runtime used is PHPDBG. - */ - public function canCollectCodeCoverage(): bool - { - return $this->hasXdebug() || $this->hasPCOV() || $this->hasPHPDBGCodeCoverage(); - } - - /** - * Returns true when Zend OPcache is loaded, enabled, - * and is configured to discard comments. - */ - public function discardsComments(): bool - { - if (!$this->isOpcacheActive()) { - return false; - } - - if (ini_get('opcache.save_comments') !== '0') { - return false; - } - - return true; - } - - /** - * Returns true when Zend OPcache is loaded, enabled, - * and is configured to perform just-in-time compilation. - */ - public function performsJustInTimeCompilation(): bool - { - if (PHP_MAJOR_VERSION < 8) { - return false; - } - - if (!$this->isOpcacheActive()) { - return false; - } - - if (ini_get('opcache.jit_buffer_size') === '0') { - return false; - } - - $jit = ini_get('opcache.jit'); - - if (($jit === 'disable') || ($jit === 'off')) { - return false; - } - - if (strrpos($jit, '0') === 3) { - return false; - } - - return true; - } - - /** - * Returns the raw path to the binary of the current runtime. - */ - public function getRawBinary(): string - { - if (self::$initialized) { - return self::$rawBinary; - } - - if (PHP_BINARY !== '') { - self::$rawBinary = PHP_BINARY; - self::$initialized = true; - - return self::$rawBinary; - } - - // @codeCoverageIgnoreStart - $possibleBinaryLocations = [ - PHP_BINDIR . '/php', - PHP_BINDIR . '/php-cli.exe', - PHP_BINDIR . '/php.exe', - ]; - - foreach ($possibleBinaryLocations as $binary) { - if (is_readable($binary)) { - self::$rawBinary = $binary; - self::$initialized = true; - - return self::$rawBinary; - } - } - - self::$rawBinary = 'php'; - self::$initialized = true; - - return self::$rawBinary; - // @codeCoverageIgnoreEnd - } - - /** - * Returns the escaped path to the binary of the current runtime. - */ - public function getBinary(): string - { - return escapeshellarg($this->getRawBinary()); - } - - public function getNameWithVersion(): string - { - return $this->getName() . ' ' . $this->getVersion(); - } - - public function getNameWithVersionAndCodeCoverageDriver(): string - { - if ($this->hasPCOV()) { - return sprintf( - '%s with PCOV %s', - $this->getNameWithVersion(), - phpversion('pcov'), - ); - } - - if ($this->hasXdebug()) { - return sprintf( - '%s with Xdebug %s', - $this->getNameWithVersion(), - phpversion('xdebug'), - ); - } - - return $this->getNameWithVersion(); - } - - public function getName(): string - { - if ($this->isPHPDBG()) { - // @codeCoverageIgnoreStart - return 'PHPDBG'; - // @codeCoverageIgnoreEnd - } - - return 'PHP'; - } - - public function getVendorUrl(): string - { - return 'https://www.php.net/'; - } - - public function getVersion(): string - { - return PHP_VERSION; - } - - /** - * Returns true when the runtime used is PHP and Xdebug is loaded. - */ - public function hasXdebug(): bool - { - return $this->isPHP() && extension_loaded('xdebug'); - } - - /** - * Returns true when the runtime used is PHP without the PHPDBG SAPI. - */ - public function isPHP(): bool - { - return !$this->isPHPDBG(); - } - - /** - * Returns true when the runtime used is PHP with the PHPDBG SAPI. - */ - public function isPHPDBG(): bool - { - return PHP_SAPI === 'phpdbg'; - } - - /** - * Returns true when the runtime used is PHP with the PHPDBG SAPI - * and the phpdbg_*_oplog() functions are available (PHP >= 7.0). - */ - public function hasPHPDBGCodeCoverage(): bool - { - return $this->isPHPDBG(); - } - - /** - * Returns true when the runtime used is PHP with PCOV loaded and enabled. - */ - public function hasPCOV(): bool - { - return $this->isPHP() && extension_loaded('pcov') && ini_get('pcov.enabled'); - } - - /** - * Parses the loaded php.ini file (if any) as well as all - * additional php.ini files from the additional ini dir for - * a list of all configuration settings loaded from files - * at startup. Then checks for each php.ini setting passed - * via the `$values` parameter whether this setting has - * been changed at runtime. Returns an array of strings - * where each string has the format `key=value` denoting - * the name of a changed php.ini setting with its new value. - * - * @return string[] - */ - public function getCurrentSettings(array $values): array - { - $diff = []; - $files = []; - - if ($file = php_ini_loaded_file()) { - $files[] = $file; - } - - if ($scanned = php_ini_scanned_files()) { - $files = array_merge( - $files, - array_map( - 'trim', - explode(",\n", $scanned), - ), - ); - } - - foreach ($files as $ini) { - $config = parse_ini_file($ini, true); - - foreach ($values as $value) { - $set = ini_get($value); - - if (empty($set)) { - continue; - } - - if ((!isset($config[$value]) || ($set !== $config[$value]))) { - $diff[$value] = sprintf('%s=%s', $value, $set); - } - } - } - - return $diff; - } - - private function isOpcacheActive(): bool - { - if (!extension_loaded('Zend OPcache')) { - return false; - } - - if ((PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') && ini_get('opcache.enable_cli') === '1') { - return true; - } - - if (PHP_SAPI !== 'cli' && PHP_SAPI !== 'phpdbg' && ini_get('opcache.enable') === '1') { - return true; - } - - return false; - } -} diff --git a/vendor/sebastian/exporter/ChangeLog.md b/vendor/sebastian/exporter/ChangeLog.md deleted file mode 100644 index 89fd353..0000000 --- a/vendor/sebastian/exporter/ChangeLog.md +++ /dev/null @@ -1,39 +0,0 @@ -# ChangeLog - -All notable changes are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. - -## [5.1.4] - 2025-09-24 - -### Changed - -* Suppress `unexpected NAN value was coerced to string` warning triggered on PHP 8.5 - -## [5.1.3] - 2025-09-22 - -### Changed - -* Suppress `not representable as an int, cast occurred` warning triggered on PHP 8.5 - -## [5.1.2] - 2024-03-02 - -### Changed - -* Do not use implicitly nullable parameters - -## [5.1.1] - 2023-09-24 - -### Changed - -* [#52](https://github.com/sebastianbergmann/exporter/pull/52): Optimize export of large arrays and object graphs - -## [5.1.0] - 2023-09-18 - -### Changed - -* [#51](https://github.com/sebastianbergmann/exporter/pull/51): Export arrays using short array syntax - -[5.1.4]: https://github.com/sebastianbergmann/exporter/compare/5.1.3...5.1.4 -[5.1.3]: https://github.com/sebastianbergmann/exporter/compare/5.1.2...5.1.3 -[5.1.2]: https://github.com/sebastianbergmann/exporter/compare/5.1.1...5.1.2 -[5.1.1]: https://github.com/sebastianbergmann/exporter/compare/5.1.0...5.1.1 -[5.1.0]: https://github.com/sebastianbergmann/exporter/compare/5.0.1...5.1.0 diff --git a/vendor/sebastian/exporter/LICENSE b/vendor/sebastian/exporter/LICENSE deleted file mode 100644 index c5268a9..0000000 --- a/vendor/sebastian/exporter/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2002-2025, Sebastian Bergmann -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/sebastian/exporter/README.md b/vendor/sebastian/exporter/README.md deleted file mode 100644 index ea62a31..0000000 --- a/vendor/sebastian/exporter/README.md +++ /dev/null @@ -1,176 +0,0 @@ -[![Latest Stable Version](https://poser.pugx.org/sebastian/exporter/v/stable.png)](https://packagist.org/packages/sebastian/exporter) -[![CI Status](https://github.com/sebastianbergmann/exporter/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/exporter/actions) -[![Type Coverage](https://shepherd.dev/github/sebastianbergmann/exporter/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/exporter) -[![codecov](https://codecov.io/gh/sebastianbergmann/exporter/branch/main/graph/badge.svg)](https://codecov.io/gh/sebastianbergmann/exporter) - -# sebastian/exporter - -This component provides the functionality to export PHP variables for visualization. - -## Installation - -You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - -``` -composer require sebastian/exporter -``` - -If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - -``` -composer require --dev sebastian/exporter -``` - -## Usage - -Exporting: - -```php - '' - 'string' => '' - 'code' => 0 - 'file' => '/home/sebastianbergmann/test.php' - 'line' => 34 - 'previous' => null -) -*/ - -print $exporter->export(new Exception); -``` - -## Data Types - -Exporting simple types: - -```php -export(46); - -// 4.0 -print $exporter->export(4.0); - -// 'hello, world!' -print $exporter->export('hello, world!'); - -// false -print $exporter->export(false); - -// NAN -print $exporter->export(acos(8)); - -// -INF -print $exporter->export(log(0)); - -// null -print $exporter->export(null); - -// resource(13) of type (stream) -print $exporter->export(fopen('php://stderr', 'w')); - -// Binary String: 0x000102030405 -print $exporter->export(chr(0) . chr(1) . chr(2) . chr(3) . chr(4) . chr(5)); -``` - -Exporting complex types: - -```php - Array &1 ( - 0 => 1 - 1 => 2 - 2 => 3 - ) - 1 => Array &2 ( - 0 => '' - 1 => 0 - 2 => false - ) -) -*/ - -print $exporter->export(array(array(1,2,3), array("",0,FALSE))); - -/* -Array &0 ( - 'self' => Array &1 ( - 'self' => Array &1 - ) -) -*/ - -$array = array(); -$array['self'] = &$array; -print $exporter->export($array); - -/* -stdClass Object &0000000003a66dcc0000000025e723e2 ( - 'self' => stdClass Object &0000000003a66dcc0000000025e723e2 -) -*/ - -$obj = new stdClass(); -$obj->self = $obj; -print $exporter->export($obj); -``` - -Compact exports: - -```php -shortenedExport(array()); - -// Array (...) -print $exporter->shortenedExport(array(1,2,3,4,5)); - -// stdClass Object () -print $exporter->shortenedExport(new stdClass); - -// Exception Object (...) -print $exporter->shortenedExport(new Exception); - -// this\nis\na\nsuper\nlong\nstring\nt...\nspace -print $exporter->shortenedExport( -<<=8.1", - "ext-mbstring": "*", - "sebastian/recursion-context": "^5.0" - }, - "require-dev": { - "phpunit/phpunit": "^10.5" - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "autoload-dev": { - "classmap": [ - "tests/_fixture" - ] - }, - "extra": { - "branch-alias": { - "dev-main": "5.1-dev" - } - } -} - diff --git a/vendor/sebastian/exporter/src/Exporter.php b/vendor/sebastian/exporter/src/Exporter.php deleted file mode 100644 index 36613bd..0000000 --- a/vendor/sebastian/exporter/src/Exporter.php +++ /dev/null @@ -1,334 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Exporter; - -use function bin2hex; -use function count; -use function get_resource_type; -use function gettype; -use function implode; -use function ini_get; -use function ini_set; -use function is_array; -use function is_bool; -use function is_float; -use function is_object; -use function is_resource; -use function is_string; -use function mb_strlen; -use function mb_substr; -use function preg_match; -use function spl_object_id; -use function sprintf; -use function str_repeat; -use function str_replace; -use function var_export; -use BackedEnum; -use SebastianBergmann\RecursionContext\Context; -use SplObjectStorage; -use UnitEnum; - -final class Exporter -{ - /** - * Exports a value as a string. - * - * The output of this method is similar to the output of print_r(), but - * improved in various aspects: - * - * - NULL is rendered as "null" (instead of "") - * - TRUE is rendered as "true" (instead of "1") - * - FALSE is rendered as "false" (instead of "") - * - Strings are always quoted with single quotes - * - Carriage returns and newlines are normalized to \n - * - Recursion and repeated rendering is treated properly - */ - public function export(mixed $value, int $indentation = 0): string - { - return $this->recursiveExport($value, $indentation); - } - - public function shortenedRecursiveExport(array &$data, ?Context $context = null): string - { - $result = []; - $exporter = new self; - - if (!$context) { - $context = new Context; - } - - $array = $data; - - /* @noinspection UnusedFunctionResultInspection */ - $context->add($data); - - foreach ($array as $key => $value) { - if (is_array($value)) { - if ($context->contains($data[$key]) !== false) { - $result[] = '*RECURSION*'; - } else { - $result[] = sprintf('[%s]', $this->shortenedRecursiveExport($data[$key], $context)); - } - } else { - $result[] = $exporter->shortenedExport($value); - } - } - - return implode(', ', $result); - } - - /** - * Exports a value into a single-line string. - * - * The output of this method is similar to the output of - * SebastianBergmann\Exporter\Exporter::export(). - * - * Newlines are replaced by the visible string '\n'. - * Contents of arrays and objects (if any) are replaced by '...'. - */ - public function shortenedExport(mixed $value): string - { - if (is_string($value)) { - $string = str_replace("\n", '', $this->export($value)); - - if (mb_strlen($string) > 40) { - return mb_substr($string, 0, 30) . '...' . mb_substr($string, -7); - } - - return $string; - } - - if ($value instanceof BackedEnum) { - return sprintf( - '%s Enum (%s, %s)', - $value::class, - $value->name, - $this->export($value->value), - ); - } - - if ($value instanceof UnitEnum) { - return sprintf( - '%s Enum (%s)', - $value::class, - $value->name, - ); - } - - if (is_object($value)) { - return sprintf( - '%s Object (%s)', - $value::class, - count($this->toArray($value)) > 0 ? '...' : '', - ); - } - - if (is_array($value)) { - return sprintf( - '[%s]', - count($value) > 0 ? '...' : '', - ); - } - - return $this->export($value); - } - - /** - * Converts an object to an array containing all of its private, protected - * and public properties. - */ - public function toArray(mixed $value): array - { - if (!is_object($value)) { - return (array) $value; - } - - $array = []; - - foreach ((array) $value as $key => $val) { - // Exception traces commonly reference hundreds to thousands of - // objects currently loaded in memory. Including them in the result - // has a severe negative performance impact. - if ("\0Error\0trace" === $key || "\0Exception\0trace" === $key) { - continue; - } - - // properties are transformed to keys in the following way: - // private $propertyName => "\0ClassName\0propertyName" - // protected $propertyName => "\0*\0propertyName" - // public $propertyName => "propertyName" - if (preg_match('/\0.+\0(.+)/', (string) $key, $matches)) { - $key = $matches[1]; - } - - // See https://github.com/php/php-src/commit/5721132 - if ($key === "\0gcdata") { - continue; - } - - $array[$key] = $val; - } - - // Some internal classes like SplObjectStorage do not work with the - // above (fast) mechanism nor with reflection in Zend. - // Format the output similarly to print_r() in this case - if ($value instanceof SplObjectStorage) { - foreach ($value as $_value) { - $array['Object #' . spl_object_id($_value)] = [ - 'obj' => $_value, - 'inf' => $value->getInfo(), - ]; - } - - $value->rewind(); - } - - return $array; - } - - private function recursiveExport(mixed &$value, int $indentation, ?Context $processed = null): string - { - if ($value === null) { - return 'null'; - } - - if (is_bool($value)) { - return $value ? 'true' : 'false'; - } - - if (is_float($value)) { - $precisionBackup = ini_get('precision'); - - ini_set('precision', '-1'); - - $valueAsString = @(string) $value; - - ini_set('precision', $precisionBackup); - - if ((string) @(int) $value === $valueAsString) { - return $valueAsString . '.0'; - } - - return $valueAsString; - } - - if (gettype($value) === 'resource (closed)') { - return 'resource (closed)'; - } - - if (is_resource($value)) { - return sprintf( - 'resource(%d) of type (%s)', - (int) $value, - get_resource_type($value), - ); - } - - if ($value instanceof BackedEnum) { - return sprintf( - '%s Enum #%d (%s, %s)', - $value::class, - spl_object_id($value), - $value->name, - $this->export($value->value, $indentation), - ); - } - - if ($value instanceof UnitEnum) { - return sprintf( - '%s Enum #%d (%s)', - $value::class, - spl_object_id($value), - $value->name, - ); - } - - if (is_string($value)) { - // Match for most non-printable chars somewhat taking multibyte chars into account - if (preg_match('/[^\x09-\x0d\x1b\x20-\xff]/', $value)) { - return 'Binary String: 0x' . bin2hex($value); - } - - return "'" . - str_replace( - '', - "\n", - str_replace( - ["\r\n", "\n\r", "\r", "\n"], - ['\r\n', '\n\r', '\r', '\n'], - $value, - ), - ) . - "'"; - } - - $whitespace = str_repeat(' ', 4 * $indentation); - - if (!$processed) { - $processed = new Context; - } - - if (is_array($value)) { - if (($key = $processed->contains($value)) !== false) { - return 'Array &' . $key; - } - - $array = $value; - $key = $processed->add($value); - $values = ''; - - if (count($array) > 0) { - foreach ($array as $k => $v) { - $values .= - $whitespace - . ' ' . - $this->recursiveExport($k, $indentation) - . ' => ' . - $this->recursiveExport($value[$k], $indentation + 1, $processed) - . ",\n"; - } - - $values = "\n" . $values . $whitespace; - } - - return 'Array &' . (string) $key . ' [' . $values . ']'; - } - - if (is_object($value)) { - $class = $value::class; - - if ($processed->contains($value) !== false) { - return $class . ' Object #' . spl_object_id($value); - } - - $processed->add($value); - $values = ''; - $array = $this->toArray($value); - - if (count($array) > 0) { - foreach ($array as $k => $v) { - $values .= - $whitespace - . ' ' . - $this->recursiveExport($k, $indentation) - . ' => ' . - $this->recursiveExport($v, $indentation + 1, $processed) - . ",\n"; - } - - $values = "\n" . $values . $whitespace; - } - - return $class . ' Object #' . spl_object_id($value) . ' (' . $values . ')'; - } - - return var_export($value, true); - } -} diff --git a/vendor/sebastian/global-state/ChangeLog.md b/vendor/sebastian/global-state/ChangeLog.md deleted file mode 100644 index 03f2547..0000000 --- a/vendor/sebastian/global-state/ChangeLog.md +++ /dev/null @@ -1,108 +0,0 @@ -# Changes in sebastian/global-state - -All notable changes in `sebastian/global-state` are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. - -## [6.0.2] - 2024-03-02 - -### Changed - -* Do not use implicitly nullable parameters - -## [6.0.1] - 2023-07-19 - -### Changed - -* Changed usage of `ReflectionProperty::setValue()` to be compatible with PHP 8.3 - -## [6.0.0] - 2023-02-03 - -### Changed - -* Renamed `SebastianBergmann\GlobalState\ExcludeList::addStaticAttribute()` to `SebastianBergmann\GlobalState\ExcludeList::addStaticProperty()` -* Renamed `SebastianBergmann\GlobalState\ExcludeList::isStaticAttributeExcluded()` to `SebastianBergmann\GlobalState\ExcludeList::isStaticPropertyExcluded()` -* Renamed `SebastianBergmann\GlobalState\Restorer::restoreStaticAttributes()` to `SebastianBergmann\GlobalState\Restorer::restoreStaticProperties()` -* Renamed `SebastianBergmann\GlobalState\Snapshot::staticAttributes()` to `SebastianBergmann\GlobalState\Snapshot::staticProperties()` - -### Removed - -* Removed `SebastianBergmann\GlobalState\Restorer::restoreFunctions()` -* This component is no longer supported on PHP 7.3, PHP 7.4 and PHP 8.0 - -## [5.0.5] - 2022-02-14 - -### Fixed - -* [#34](https://github.com/sebastianbergmann/global-state/pull/34): Uninitialised typed static properties are not handled correctly - -## [5.0.4] - 2022-02-10 - -### Fixed - -* The `$includeTraits` parameter of `SebastianBergmann\GlobalState\Snapshot::__construct()` is not respected - -## [5.0.3] - 2021-06-11 - -### Changed - -* `SebastianBergmann\GlobalState\CodeExporter::globalVariables()` now generates code that is compatible with PHP 8.1 - -## [5.0.2] - 2020-10-26 - -### Fixed - -* `SebastianBergmann\GlobalState\Exception` now correctly extends `\Throwable` - -## [5.0.1] - 2020-09-28 - -### Changed - -* Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` - -## [5.0.0] - 2020-08-07 - -### Changed - -* The `SebastianBergmann\GlobalState\Blacklist` class has been renamed to `SebastianBergmann\GlobalState\ExcludeList` - -## [4.0.0] - 2020-02-07 - -### Removed - -* This component is no longer supported on PHP 7.2 - -## [3.0.2] - 2022-02-10 - -### Fixed - -* The `$includeTraits` parameter of `SebastianBergmann\GlobalState\Snapshot::__construct()` is not respected - -## [3.0.1] - 2020-11-30 - -### Changed - -* Changed PHP version constraint in `composer.json` from `^7.2` to `>=7.2` - -## [3.0.0] - 2019-02-01 - -### Changed - -* `Snapshot::canBeSerialized()` now recursively checks arrays and object graphs for variables that cannot be serialized - -### Removed - -* This component is no longer supported on PHP 7.0 and PHP 7.1 - -[6.0.2]: https://github.com/sebastianbergmann/global-state/compare/6.0.1...6.0.2 -[6.0.1]: https://github.com/sebastianbergmann/global-state/compare/6.0.0...6.0.1 -[6.0.0]: https://github.com/sebastianbergmann/global-state/compare/5.0.5...6.0.0 -[5.0.5]: https://github.com/sebastianbergmann/global-state/compare/5.0.4...5.0.5 -[5.0.4]: https://github.com/sebastianbergmann/global-state/compare/5.0.3...5.0.4 -[5.0.3]: https://github.com/sebastianbergmann/global-state/compare/5.0.2...5.0.3 -[5.0.2]: https://github.com/sebastianbergmann/global-state/compare/5.0.1...5.0.2 -[5.0.1]: https://github.com/sebastianbergmann/global-state/compare/5.0.0...5.0.1 -[5.0.0]: https://github.com/sebastianbergmann/global-state/compare/4.0.0...5.0.0 -[4.0.0]: https://github.com/sebastianbergmann/global-state/compare/3.0.2...4.0.0 -[3.0.2]: https://github.com/sebastianbergmann/phpunit/compare/3.0.1...3.0.2 -[3.0.1]: https://github.com/sebastianbergmann/phpunit/compare/3.0.0...3.0.1 -[3.0.0]: https://github.com/sebastianbergmann/phpunit/compare/2.0.0...3.0.0 - diff --git a/vendor/sebastian/global-state/LICENSE b/vendor/sebastian/global-state/LICENSE deleted file mode 100644 index bdb57ec..0000000 --- a/vendor/sebastian/global-state/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2001-2024, Sebastian Bergmann -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/sebastian/global-state/README.md b/vendor/sebastian/global-state/README.md deleted file mode 100644 index d4bd4cf..0000000 --- a/vendor/sebastian/global-state/README.md +++ /dev/null @@ -1,22 +0,0 @@ -[![Latest Stable Version](https://poser.pugx.org/sebastian/global-state/v/stable.png)](https://packagist.org/packages/sebastian/global-state) -[![CI Status](https://github.com/sebastianbergmann/global-state/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/global-state/actions) -[![Type Coverage](https://shepherd.dev/github/sebastianbergmann/global-state/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/global-state) -[![codecov](https://codecov.io/gh/sebastianbergmann/global-state/branch/main/graph/badge.svg)](https://codecov.io/gh/sebastianbergmann/global-state) - -# sebastian/global-state - -Snapshotting of global state, factored out of PHPUnit into a stand-alone component. - -## Installation - -You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - -``` -composer require sebastian/global-state -``` - -If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - -``` -composer require --dev sebastian/global-state -``` diff --git a/vendor/sebastian/global-state/SECURITY.md b/vendor/sebastian/global-state/SECURITY.md deleted file mode 100644 index d88ff00..0000000 --- a/vendor/sebastian/global-state/SECURITY.md +++ /dev/null @@ -1,30 +0,0 @@ -# Security Policy - -If you believe you have found a security vulnerability in the library that is developed in this repository, please report it to us through coordinated disclosure. - -**Please do not report security vulnerabilities through public GitHub issues, discussions, or pull requests.** - -Instead, please email `sebastian@phpunit.de`. - -Please include as much of the information listed below as you can to help us better understand and resolve the issue: - -* The type of issue -* Full paths of source file(s) related to the manifestation of the issue -* The location of the affected source code (tag/branch/commit or direct URL) -* Any special configuration required to reproduce the issue -* Step-by-step instructions to reproduce the issue -* Proof-of-concept or exploit code (if possible) -* Impact of the issue, including how an attacker might exploit the issue - -This information will help us triage your report more quickly. - -## Web Context - -The library that is developed in this repository was either extracted from [PHPUnit](https://github.com/sebastianbergmann/phpunit) or developed specifically as a dependency for PHPUnit. - -The library is developed with a focus on development environments and the command-line. No specific testing or hardening with regard to using the library in an HTTP or web context or with untrusted input data is performed. The library might also contain functionality that intentionally exposes internal application data for debugging purposes. - -If the library is used in a web application, the application developer is responsible for filtering inputs or escaping outputs as necessary and for verifying that the used functionality is safe for use within the intended context. - -Vulnerabilities specific to the use outside a development context will be fixed as applicable, provided that the fix does not have an averse effect on the primary use case for development purposes. - diff --git a/vendor/sebastian/global-state/composer.json b/vendor/sebastian/global-state/composer.json deleted file mode 100644 index d38d64d..0000000 --- a/vendor/sebastian/global-state/composer.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "name": "sebastian/global-state", - "description": "Snapshotting of global state", - "keywords": ["global state"], - "homepage": "https://www.github.com/sebastianbergmann/global-state", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "support": { - "issues": "https://github.com/sebastianbergmann/global-state/issues", - "security": "https://github.com/sebastianbergmann/global-state/security/policy" - }, - "prefer-stable": true, - "config": { - "platform": { - "php": "8.1.0" - }, - "optimize-autoloader": true, - "sort-packages": true - }, - "require": { - "php": ">=8.1", - "sebastian/object-reflector": "^3.0", - "sebastian/recursion-context": "^5.0" - }, - "require-dev": { - "ext-dom": "*", - "phpunit/phpunit": "^10.0" - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "autoload-dev": { - "classmap": [ - "tests/_fixture/" - ], - "files": [ - "tests/_fixture/SnapshotFunctions.php" - ] - }, - "extra": { - "branch-alias": { - "dev-main": "6.0-dev" - } - } -} diff --git a/vendor/sebastian/global-state/src/CodeExporter.php b/vendor/sebastian/global-state/src/CodeExporter.php deleted file mode 100644 index 6b72081..0000000 --- a/vendor/sebastian/global-state/src/CodeExporter.php +++ /dev/null @@ -1,106 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\GlobalState; - -use const PHP_EOL; -use function is_array; -use function is_scalar; -use function serialize; -use function sprintf; -use function var_export; - -final class CodeExporter -{ - public function constants(Snapshot $snapshot): string - { - $result = ''; - - foreach ($snapshot->constants() as $name => $value) { - $result .= sprintf( - 'if (!defined(\'%s\')) define(\'%s\', %s);' . "\n", - $name, - $name, - $this->exportVariable($value), - ); - } - - return $result; - } - - public function globalVariables(Snapshot $snapshot): string - { - $result = <<<'EOT' -call_user_func( - function () - { - foreach (array_keys($GLOBALS) as $key) { - unset($GLOBALS[$key]); - } - } -); - - -EOT; - - foreach ($snapshot->globalVariables() as $name => $value) { - $result .= sprintf( - '$GLOBALS[%s] = %s;' . PHP_EOL, - $this->exportVariable($name), - $this->exportVariable($value), - ); - } - - return $result; - } - - public function iniSettings(Snapshot $snapshot): string - { - $result = ''; - - foreach ($snapshot->iniSettings() as $key => $value) { - $result .= sprintf( - '@ini_set(%s, %s);' . "\n", - $this->exportVariable($key), - $this->exportVariable($value), - ); - } - - return $result; - } - - private function exportVariable(mixed $variable): string - { - if (is_scalar($variable) || null === $variable || - (is_array($variable) && $this->arrayOnlyContainsScalars($variable))) { - return var_export($variable, true); - } - - return 'unserialize(' . var_export(serialize($variable), true) . ')'; - } - - private function arrayOnlyContainsScalars(array $array): bool - { - $result = true; - - foreach ($array as $element) { - if (is_array($element)) { - $result = $this->arrayOnlyContainsScalars($element); - } elseif (!is_scalar($element) && null !== $element) { - $result = false; - } - - if ($result === false) { - break; - } - } - - return $result; - } -} diff --git a/vendor/sebastian/global-state/src/ExcludeList.php b/vendor/sebastian/global-state/src/ExcludeList.php deleted file mode 100644 index 3754e81..0000000 --- a/vendor/sebastian/global-state/src/ExcludeList.php +++ /dev/null @@ -1,95 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\GlobalState; - -use function in_array; -use function str_starts_with; -use ReflectionClass; - -final class ExcludeList -{ - private array $globalVariables = []; - private array $classes = []; - private array $classNamePrefixes = []; - private array $parentClasses = []; - private array $interfaces = []; - private array $staticProperties = []; - - public function addGlobalVariable(string $variableName): void - { - $this->globalVariables[$variableName] = true; - } - - public function addClass(string $className): void - { - $this->classes[] = $className; - } - - public function addSubclassesOf(string $className): void - { - $this->parentClasses[] = $className; - } - - public function addImplementorsOf(string $interfaceName): void - { - $this->interfaces[] = $interfaceName; - } - - public function addClassNamePrefix(string $classNamePrefix): void - { - $this->classNamePrefixes[] = $classNamePrefix; - } - - public function addStaticProperty(string $className, string $propertyName): void - { - if (!isset($this->staticProperties[$className])) { - $this->staticProperties[$className] = []; - } - - $this->staticProperties[$className][$propertyName] = true; - } - - public function isGlobalVariableExcluded(string $variableName): bool - { - return isset($this->globalVariables[$variableName]); - } - - /** - * @psalm-param class-string $className - */ - public function isStaticPropertyExcluded(string $className, string $propertyName): bool - { - if (in_array($className, $this->classes, true)) { - return true; - } - - foreach ($this->classNamePrefixes as $prefix) { - if (str_starts_with($className, $prefix)) { - return true; - } - } - - $class = new ReflectionClass($className); - - foreach ($this->parentClasses as $type) { - if ($class->isSubclassOf($type)) { - return true; - } - } - - foreach ($this->interfaces as $type) { - if ($class->implementsInterface($type)) { - return true; - } - } - - return isset($this->staticProperties[$className][$propertyName]); - } -} diff --git a/vendor/sebastian/global-state/src/Restorer.php b/vendor/sebastian/global-state/src/Restorer.php deleted file mode 100644 index d84e155..0000000 --- a/vendor/sebastian/global-state/src/Restorer.php +++ /dev/null @@ -1,106 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\GlobalState; - -use function array_diff; -use function array_key_exists; -use function array_keys; -use function array_merge; -use function in_array; -use function is_array; -use ReflectionClass; -use ReflectionProperty; - -final class Restorer -{ - public function restoreGlobalVariables(Snapshot $snapshot): void - { - $superGlobalArrays = $snapshot->superGlobalArrays(); - - foreach ($superGlobalArrays as $superGlobalArray) { - $this->restoreSuperGlobalArray($snapshot, $superGlobalArray); - } - - $globalVariables = $snapshot->globalVariables(); - - foreach (array_keys($GLOBALS) as $key) { - if ($key !== 'GLOBALS' && - !in_array($key, $superGlobalArrays, true) && - !$snapshot->excludeList()->isGlobalVariableExcluded($key)) { - if (array_key_exists($key, $globalVariables)) { - $GLOBALS[$key] = $globalVariables[$key]; - } else { - unset($GLOBALS[$key]); - } - } - } - } - - public function restoreStaticProperties(Snapshot $snapshot): void - { - $current = new Snapshot($snapshot->excludeList(), false, false, false, false, true, false, false, false, false); - $newClasses = array_diff($current->classes(), $snapshot->classes()); - - unset($current); - - foreach ($snapshot->staticProperties() as $className => $staticProperties) { - foreach ($staticProperties as $name => $value) { - $reflector = new ReflectionProperty($className, $name); - $reflector->setValue(null, $value); - } - } - - foreach ($newClasses as $className) { - $class = new ReflectionClass($className); - $defaults = $class->getDefaultProperties(); - - foreach ($class->getProperties() as $property) { - if (!$property->isStatic()) { - continue; - } - - $name = $property->getName(); - - if ($snapshot->excludeList()->isStaticPropertyExcluded($className, $name)) { - continue; - } - - if (!isset($defaults[$name])) { - continue; - } - - $property->setValue(null, $defaults[$name]); - } - } - } - - private function restoreSuperGlobalArray(Snapshot $snapshot, string $superGlobalArray): void - { - $superGlobalVariables = $snapshot->superGlobalVariables(); - - if (isset($GLOBALS[$superGlobalArray], $superGlobalVariables[$superGlobalArray]) && - is_array($GLOBALS[$superGlobalArray])) { - $keys = array_keys( - array_merge( - $GLOBALS[$superGlobalArray], - $superGlobalVariables[$superGlobalArray], - ), - ); - - foreach ($keys as $key) { - if (isset($superGlobalVariables[$superGlobalArray][$key])) { - $GLOBALS[$superGlobalArray][$key] = $superGlobalVariables[$superGlobalArray][$key]; - } else { - unset($GLOBALS[$superGlobalArray][$key]); - } - } - } - } -} diff --git a/vendor/sebastian/global-state/src/Snapshot.php b/vendor/sebastian/global-state/src/Snapshot.php deleted file mode 100644 index 310c856..0000000 --- a/vendor/sebastian/global-state/src/Snapshot.php +++ /dev/null @@ -1,371 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\GlobalState; - -use function array_keys; -use function array_merge; -use function array_reverse; -use function assert; -use function func_get_args; -use function get_declared_classes; -use function get_declared_interfaces; -use function get_declared_traits; -use function get_defined_constants; -use function get_defined_functions; -use function get_included_files; -use function in_array; -use function ini_get_all; -use function is_array; -use function is_object; -use function is_resource; -use function is_scalar; -use function serialize; -use function unserialize; -use ReflectionClass; -use SebastianBergmann\ObjectReflector\ObjectReflector; -use SebastianBergmann\RecursionContext\Context; -use Throwable; - -/** - * A snapshot of global state. - */ -class Snapshot -{ - private ExcludeList $excludeList; - private array $globalVariables = []; - private array $superGlobalArrays = []; - private array $superGlobalVariables = []; - private array $staticProperties = []; - private array $iniSettings = []; - private array $includedFiles = []; - private array $constants = []; - private array $functions = []; - private array $interfaces = []; - private array $classes = []; - private array $traits = []; - - public function __construct(?ExcludeList $excludeList = null, bool $includeGlobalVariables = true, bool $includeStaticProperties = true, bool $includeConstants = true, bool $includeFunctions = true, bool $includeClasses = true, bool $includeInterfaces = true, bool $includeTraits = true, bool $includeIniSettings = true, bool $includeIncludedFiles = true) - { - $this->excludeList = $excludeList ?: new ExcludeList; - - if ($includeConstants) { - $this->snapshotConstants(); - } - - if ($includeFunctions) { - $this->snapshotFunctions(); - } - - if ($includeClasses || $includeStaticProperties) { - $this->snapshotClasses(); - } - - if ($includeInterfaces) { - $this->snapshotInterfaces(); - } - - if ($includeGlobalVariables) { - $this->setupSuperGlobalArrays(); - $this->snapshotGlobals(); - } - - if ($includeStaticProperties) { - $this->snapshotStaticProperties(); - } - - if ($includeIniSettings) { - $this->iniSettings = ini_get_all(null, false); - } - - if ($includeIncludedFiles) { - $this->includedFiles = get_included_files(); - } - - if ($includeTraits) { - $this->traits = get_declared_traits(); - } - } - - public function excludeList(): ExcludeList - { - return $this->excludeList; - } - - public function globalVariables(): array - { - return $this->globalVariables; - } - - public function superGlobalVariables(): array - { - return $this->superGlobalVariables; - } - - public function superGlobalArrays(): array - { - return $this->superGlobalArrays; - } - - public function staticProperties(): array - { - return $this->staticProperties; - } - - public function iniSettings(): array - { - return $this->iniSettings; - } - - public function includedFiles(): array - { - return $this->includedFiles; - } - - public function constants(): array - { - return $this->constants; - } - - public function functions(): array - { - return $this->functions; - } - - public function interfaces(): array - { - return $this->interfaces; - } - - public function classes(): array - { - return $this->classes; - } - - public function traits(): array - { - return $this->traits; - } - - private function snapshotConstants(): void - { - $constants = get_defined_constants(true); - - if (isset($constants['user'])) { - $this->constants = $constants['user']; - } - } - - private function snapshotFunctions(): void - { - $functions = get_defined_functions(); - - $this->functions = $functions['user']; - } - - private function snapshotClasses(): void - { - foreach (array_reverse(get_declared_classes()) as $className) { - $class = new ReflectionClass($className); - - if (!$class->isUserDefined()) { - break; - } - - $this->classes[] = $className; - } - - $this->classes = array_reverse($this->classes); - } - - private function snapshotInterfaces(): void - { - foreach (array_reverse(get_declared_interfaces()) as $interfaceName) { - $class = new ReflectionClass($interfaceName); - - if (!$class->isUserDefined()) { - break; - } - - $this->interfaces[] = $interfaceName; - } - - $this->interfaces = array_reverse($this->interfaces); - } - - private function snapshotGlobals(): void - { - $superGlobalArrays = $this->superGlobalArrays(); - - foreach ($superGlobalArrays as $superGlobalArray) { - $this->snapshotSuperGlobalArray($superGlobalArray); - } - - foreach (array_keys($GLOBALS) as $key) { - if ($key !== 'GLOBALS' && - !in_array($key, $superGlobalArrays, true) && - $this->canBeSerialized($GLOBALS[$key]) && - !$this->excludeList->isGlobalVariableExcluded($key)) { - /* @noinspection UnserializeExploitsInspection */ - $this->globalVariables[$key] = unserialize(serialize($GLOBALS[$key])); - } - } - } - - private function snapshotSuperGlobalArray(string $superGlobalArray): void - { - $this->superGlobalVariables[$superGlobalArray] = []; - - if (isset($GLOBALS[$superGlobalArray]) && is_array($GLOBALS[$superGlobalArray])) { - foreach ($GLOBALS[$superGlobalArray] as $key => $value) { - /* @noinspection UnserializeExploitsInspection */ - $this->superGlobalVariables[$superGlobalArray][$key] = unserialize(serialize($value)); - } - } - } - - private function snapshotStaticProperties(): void - { - foreach ($this->classes as $className) { - $class = new ReflectionClass($className); - $snapshot = []; - - foreach ($class->getProperties() as $property) { - if ($property->isStatic()) { - $name = $property->getName(); - - if ($this->excludeList->isStaticPropertyExcluded($className, $name)) { - continue; - } - - if (!$property->isInitialized()) { - continue; - } - - $value = $property->getValue(); - - if ($this->canBeSerialized($value)) { - /* @noinspection UnserializeExploitsInspection */ - $snapshot[$name] = unserialize(serialize($value)); - } - } - } - - if (!empty($snapshot)) { - $this->staticProperties[$className] = $snapshot; - } - } - } - - private function setupSuperGlobalArrays(): void - { - $this->superGlobalArrays = [ - '_ENV', - '_POST', - '_GET', - '_COOKIE', - '_SERVER', - '_FILES', - '_REQUEST', - ]; - } - - private function canBeSerialized(mixed $variable): bool - { - if (is_scalar($variable) || $variable === null) { - return true; - } - - if (is_resource($variable)) { - return false; - } - - foreach ($this->enumerateObjectsAndResources($variable) as $value) { - if (is_resource($value)) { - return false; - } - - if (is_object($value)) { - $class = new ReflectionClass($value); - - if ($class->isAnonymous()) { - return false; - } - - try { - @serialize($value); - } catch (Throwable $t) { - return false; - } - } - } - - return true; - } - - private function enumerateObjectsAndResources(mixed $variable): array - { - if (isset(func_get_args()[1])) { - $processed = func_get_args()[1]; - } else { - $processed = new Context; - } - - assert($processed instanceof Context); - - $result = []; - - if ($processed->contains($variable)) { - return $result; - } - - $array = $variable; - - /* @noinspection UnusedFunctionResultInspection */ - $processed->add($variable); - - if (is_array($variable)) { - foreach ($array as $element) { - if (!is_array($element) && !is_object($element) && !is_resource($element)) { - continue; - } - - if (!is_resource($element)) { - /** @noinspection SlowArrayOperationsInLoopInspection */ - $result = array_merge( - $result, - $this->enumerateObjectsAndResources($element, $processed), - ); - } else { - $result[] = $element; - } - } - } else { - $result[] = $variable; - - foreach ((new ObjectReflector)->getProperties($variable) as $value) { - if (!is_array($value) && !is_object($value) && !is_resource($value)) { - continue; - } - - if (!is_resource($value)) { - /** @noinspection SlowArrayOperationsInLoopInspection */ - $result = array_merge( - $result, - $this->enumerateObjectsAndResources($value, $processed), - ); - } else { - $result[] = $value; - } - } - } - - return $result; - } -} diff --git a/vendor/sebastian/global-state/src/exceptions/Exception.php b/vendor/sebastian/global-state/src/exceptions/Exception.php deleted file mode 100644 index 9443200..0000000 --- a/vendor/sebastian/global-state/src/exceptions/Exception.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\GlobalState; - -use Throwable; - -interface Exception extends Throwable -{ -} diff --git a/vendor/sebastian/global-state/src/exceptions/RuntimeException.php b/vendor/sebastian/global-state/src/exceptions/RuntimeException.php deleted file mode 100644 index 79f02a1..0000000 --- a/vendor/sebastian/global-state/src/exceptions/RuntimeException.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\GlobalState; - -final class RuntimeException extends \RuntimeException implements Exception -{ -} diff --git a/vendor/sebastian/lines-of-code/ChangeLog.md b/vendor/sebastian/lines-of-code/ChangeLog.md deleted file mode 100644 index 27db580..0000000 --- a/vendor/sebastian/lines-of-code/ChangeLog.md +++ /dev/null @@ -1,55 +0,0 @@ -# ChangeLog - -All notable changes are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. - -## [2.0.2] - 2023-12-21 - -### Changed - -* This component is now compatible with `nikic/php-parser` 5.0 - -## [2.0.1] - 2023-08-31 - -### Changed - -* Improved type information - -## [2.0.0] - 2023-02-03 - -### Removed - -* This component is no longer supported on PHP 7.3, PHP 7.4 and PHP 8.0 - -## [1.0.3] - 2020-11-28 - -### Fixed - -* Files that do not contain a newline were not handled correctly - -### Changed - -* A line of code is no longer considered to be a Logical Line of Code if it does not contain an `Expr` node - -## [1.0.2] - 2020-10-26 - -### Fixed - -* `SebastianBergmann\LinesOfCode\Exception` now correctly extends `\Throwable` - -## [1.0.1] - 2020-09-28 - -### Changed - -* Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` - -## [1.0.0] - 2020-07-22 - -* Initial release - -[2.0.2]: https://github.com/sebastianbergmann/lines-of-code/compare/2.0.1...2.0.2 -[2.0.1]: https://github.com/sebastianbergmann/lines-of-code/compare/2.0.0...2.0.1 -[2.0.0]: https://github.com/sebastianbergmann/lines-of-code/compare/1.0.3...2.0.0 -[1.0.3]: https://github.com/sebastianbergmann/lines-of-code/compare/1.0.2...1.0.3 -[1.0.2]: https://github.com/sebastianbergmann/lines-of-code/compare/1.0.1...1.0.2 -[1.0.1]: https://github.com/sebastianbergmann/lines-of-code/compare/1.0.0...1.0.1 -[1.0.0]: https://github.com/sebastianbergmann/lines-of-code/compare/f959e71f00e591288acc024afe9cb966c6cf9bd6...1.0.0 diff --git a/vendor/sebastian/lines-of-code/LICENSE b/vendor/sebastian/lines-of-code/LICENSE deleted file mode 100644 index 5716d96..0000000 --- a/vendor/sebastian/lines-of-code/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2020-2023, Sebastian Bergmann -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/sebastian/lines-of-code/README.md b/vendor/sebastian/lines-of-code/README.md deleted file mode 100644 index 79daa10..0000000 --- a/vendor/sebastian/lines-of-code/README.md +++ /dev/null @@ -1,22 +0,0 @@ -[![Latest Stable Version](https://poser.pugx.org/sebastian/lines-of-code/v/stable.png)](https://packagist.org/packages/sebastian/lines-of-code) -[![CI Status](https://github.com/sebastianbergmann/lines-of-code/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/lines-of-code/actions) -[![Type Coverage](https://shepherd.dev/github/sebastianbergmann/lines-of-code/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/lines-of-code) -[![codecov](https://codecov.io/gh/sebastianbergmann/lines-of-code/branch/main/graph/badge.svg)](https://codecov.io/gh/sebastianbergmann/lines-of-code) - -# sebastian/lines-of-code - -Library for counting the lines of code in PHP source code. - -## Installation - -You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - -``` -composer require sebastian/lines-of-code -``` - -If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - -``` -composer require --dev sebastian/lines-of-code -``` diff --git a/vendor/sebastian/lines-of-code/SECURITY.md b/vendor/sebastian/lines-of-code/SECURITY.md deleted file mode 100644 index d88ff00..0000000 --- a/vendor/sebastian/lines-of-code/SECURITY.md +++ /dev/null @@ -1,30 +0,0 @@ -# Security Policy - -If you believe you have found a security vulnerability in the library that is developed in this repository, please report it to us through coordinated disclosure. - -**Please do not report security vulnerabilities through public GitHub issues, discussions, or pull requests.** - -Instead, please email `sebastian@phpunit.de`. - -Please include as much of the information listed below as you can to help us better understand and resolve the issue: - -* The type of issue -* Full paths of source file(s) related to the manifestation of the issue -* The location of the affected source code (tag/branch/commit or direct URL) -* Any special configuration required to reproduce the issue -* Step-by-step instructions to reproduce the issue -* Proof-of-concept or exploit code (if possible) -* Impact of the issue, including how an attacker might exploit the issue - -This information will help us triage your report more quickly. - -## Web Context - -The library that is developed in this repository was either extracted from [PHPUnit](https://github.com/sebastianbergmann/phpunit) or developed specifically as a dependency for PHPUnit. - -The library is developed with a focus on development environments and the command-line. No specific testing or hardening with regard to using the library in an HTTP or web context or with untrusted input data is performed. The library might also contain functionality that intentionally exposes internal application data for debugging purposes. - -If the library is used in a web application, the application developer is responsible for filtering inputs or escaping outputs as necessary and for verifying that the used functionality is safe for use within the intended context. - -Vulnerabilities specific to the use outside a development context will be fixed as applicable, provided that the fix does not have an averse effect on the primary use case for development purposes. - diff --git a/vendor/sebastian/lines-of-code/composer.json b/vendor/sebastian/lines-of-code/composer.json deleted file mode 100644 index 1f3b747..0000000 --- a/vendor/sebastian/lines-of-code/composer.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "sebastian/lines-of-code", - "description": "Library for counting the lines of code in PHP source code", - "type": "library", - "homepage": "https://github.com/sebastianbergmann/lines-of-code", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "support": { - "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy" - }, - "prefer-stable": true, - "require": { - "php": ">=8.1", - "nikic/php-parser": "^4.18 || ^5.0" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "config": { - "platform": { - "php": "8.1" - }, - "optimize-autoloader": true, - "sort-packages": true - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "extra": { - "branch-alias": { - "dev-main": "2.0-dev" - } - } -} diff --git a/vendor/sebastian/lines-of-code/src/Counter.php b/vendor/sebastian/lines-of-code/src/Counter.php deleted file mode 100644 index 9519268..0000000 --- a/vendor/sebastian/lines-of-code/src/Counter.php +++ /dev/null @@ -1,90 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\LinesOfCode; - -use function assert; -use function file_get_contents; -use function substr_count; -use PhpParser\Error; -use PhpParser\Node; -use PhpParser\NodeTraverser; -use PhpParser\ParserFactory; - -final class Counter -{ - /** - * @throws RuntimeException - */ - public function countInSourceFile(string $sourceFile): LinesOfCode - { - return $this->countInSourceString(file_get_contents($sourceFile)); - } - - /** - * @throws RuntimeException - */ - public function countInSourceString(string $source): LinesOfCode - { - $linesOfCode = substr_count($source, "\n"); - - if ($linesOfCode === 0 && !empty($source)) { - $linesOfCode = 1; - } - - assert($linesOfCode >= 0); - - try { - $nodes = (new ParserFactory)->createForHostVersion()->parse($source); - - assert($nodes !== null); - - return $this->countInAbstractSyntaxTree($linesOfCode, $nodes); - - // @codeCoverageIgnoreStart - } catch (Error $error) { - throw new RuntimeException( - $error->getMessage(), - $error->getCode(), - $error, - ); - } - // @codeCoverageIgnoreEnd - } - - /** - * @psalm-param non-negative-int $linesOfCode - * - * @param Node[] $nodes - * - * @throws RuntimeException - */ - public function countInAbstractSyntaxTree(int $linesOfCode, array $nodes): LinesOfCode - { - $traverser = new NodeTraverser; - $visitor = new LineCountingVisitor($linesOfCode); - - $traverser->addVisitor($visitor); - - try { - /* @noinspection UnusedFunctionResultInspection */ - $traverser->traverse($nodes); - // @codeCoverageIgnoreStart - } catch (Error $error) { - throw new RuntimeException( - $error->getMessage(), - $error->getCode(), - $error, - ); - } - // @codeCoverageIgnoreEnd - - return $visitor->result(); - } -} diff --git a/vendor/sebastian/lines-of-code/src/Exception/Exception.php b/vendor/sebastian/lines-of-code/src/Exception/Exception.php deleted file mode 100644 index 11d543a..0000000 --- a/vendor/sebastian/lines-of-code/src/Exception/Exception.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\LinesOfCode; - -use Throwable; - -interface Exception extends Throwable -{ -} diff --git a/vendor/sebastian/lines-of-code/src/Exception/IllogicalValuesException.php b/vendor/sebastian/lines-of-code/src/Exception/IllogicalValuesException.php deleted file mode 100644 index 46a5c1b..0000000 --- a/vendor/sebastian/lines-of-code/src/Exception/IllogicalValuesException.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\LinesOfCode; - -use LogicException; - -final class IllogicalValuesException extends LogicException implements Exception -{ -} diff --git a/vendor/sebastian/lines-of-code/src/Exception/NegativeValueException.php b/vendor/sebastian/lines-of-code/src/Exception/NegativeValueException.php deleted file mode 100644 index 40d27e1..0000000 --- a/vendor/sebastian/lines-of-code/src/Exception/NegativeValueException.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\LinesOfCode; - -use InvalidArgumentException; - -final class NegativeValueException extends InvalidArgumentException implements Exception -{ -} diff --git a/vendor/sebastian/lines-of-code/src/Exception/RuntimeException.php b/vendor/sebastian/lines-of-code/src/Exception/RuntimeException.php deleted file mode 100644 index 4e6d66d..0000000 --- a/vendor/sebastian/lines-of-code/src/Exception/RuntimeException.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\LinesOfCode; - -final class RuntimeException extends \RuntimeException implements Exception -{ -} diff --git a/vendor/sebastian/lines-of-code/src/LineCountingVisitor.php b/vendor/sebastian/lines-of-code/src/LineCountingVisitor.php deleted file mode 100644 index ec394d9..0000000 --- a/vendor/sebastian/lines-of-code/src/LineCountingVisitor.php +++ /dev/null @@ -1,93 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\LinesOfCode; - -use function array_merge; -use function array_unique; -use function assert; -use function count; -use PhpParser\Comment; -use PhpParser\Node; -use PhpParser\Node\Expr; -use PhpParser\NodeVisitorAbstract; - -final class LineCountingVisitor extends NodeVisitorAbstract -{ - /** - * @psalm-var non-negative-int - */ - private readonly int $linesOfCode; - - /** - * @var Comment[] - */ - private array $comments = []; - - /** - * @var int[] - */ - private array $linesWithStatements = []; - - /** - * @psalm-param non-negative-int $linesOfCode - */ - public function __construct(int $linesOfCode) - { - $this->linesOfCode = $linesOfCode; - } - - public function enterNode(Node $node): void - { - $this->comments = array_merge($this->comments, $node->getComments()); - - if (!$node instanceof Expr) { - return; - } - - $this->linesWithStatements[] = $node->getStartLine(); - } - - public function result(): LinesOfCode - { - $commentLinesOfCode = 0; - - foreach ($this->comments() as $comment) { - $commentLinesOfCode += ($comment->getEndLine() - $comment->getStartLine() + 1); - } - - $nonCommentLinesOfCode = $this->linesOfCode - $commentLinesOfCode; - $logicalLinesOfCode = count(array_unique($this->linesWithStatements)); - - assert($commentLinesOfCode >= 0); - assert($nonCommentLinesOfCode >= 0); - assert($logicalLinesOfCode >= 0); - - return new LinesOfCode( - $this->linesOfCode, - $commentLinesOfCode, - $nonCommentLinesOfCode, - $logicalLinesOfCode, - ); - } - - /** - * @return Comment[] - */ - private function comments(): array - { - $comments = []; - - foreach ($this->comments as $comment) { - $comments[$comment->getStartLine() . '_' . $comment->getStartTokenPos() . '_' . $comment->getEndLine() . '_' . $comment->getEndTokenPos()] = $comment; - } - - return $comments; - } -} diff --git a/vendor/sebastian/lines-of-code/src/LinesOfCode.php b/vendor/sebastian/lines-of-code/src/LinesOfCode.php deleted file mode 100644 index 729eba5..0000000 --- a/vendor/sebastian/lines-of-code/src/LinesOfCode.php +++ /dev/null @@ -1,119 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\LinesOfCode; - -/** - * @psalm-immutable - */ -final class LinesOfCode -{ - /** - * @psalm-var non-negative-int - */ - private readonly int $linesOfCode; - - /** - * @psalm-var non-negative-int - */ - private readonly int $commentLinesOfCode; - - /** - * @psalm-var non-negative-int - */ - private readonly int $nonCommentLinesOfCode; - - /** - * @psalm-var non-negative-int - */ - private readonly int $logicalLinesOfCode; - - /** - * @psalm-param non-negative-int $linesOfCode - * @psalm-param non-negative-int $commentLinesOfCode - * @psalm-param non-negative-int $nonCommentLinesOfCode - * @psalm-param non-negative-int $logicalLinesOfCode - * - * @throws IllogicalValuesException - * @throws NegativeValueException - */ - public function __construct(int $linesOfCode, int $commentLinesOfCode, int $nonCommentLinesOfCode, int $logicalLinesOfCode) - { - /** @psalm-suppress DocblockTypeContradiction */ - if ($linesOfCode < 0) { - throw new NegativeValueException('$linesOfCode must not be negative'); - } - - /** @psalm-suppress DocblockTypeContradiction */ - if ($commentLinesOfCode < 0) { - throw new NegativeValueException('$commentLinesOfCode must not be negative'); - } - - /** @psalm-suppress DocblockTypeContradiction */ - if ($nonCommentLinesOfCode < 0) { - throw new NegativeValueException('$nonCommentLinesOfCode must not be negative'); - } - - /** @psalm-suppress DocblockTypeContradiction */ - if ($logicalLinesOfCode < 0) { - throw new NegativeValueException('$logicalLinesOfCode must not be negative'); - } - - if ($linesOfCode - $commentLinesOfCode !== $nonCommentLinesOfCode) { - throw new IllogicalValuesException('$linesOfCode !== $commentLinesOfCode + $nonCommentLinesOfCode'); - } - - $this->linesOfCode = $linesOfCode; - $this->commentLinesOfCode = $commentLinesOfCode; - $this->nonCommentLinesOfCode = $nonCommentLinesOfCode; - $this->logicalLinesOfCode = $logicalLinesOfCode; - } - - /** - * @psalm-return non-negative-int - */ - public function linesOfCode(): int - { - return $this->linesOfCode; - } - - /** - * @psalm-return non-negative-int - */ - public function commentLinesOfCode(): int - { - return $this->commentLinesOfCode; - } - - /** - * @psalm-return non-negative-int - */ - public function nonCommentLinesOfCode(): int - { - return $this->nonCommentLinesOfCode; - } - - /** - * @psalm-return non-negative-int - */ - public function logicalLinesOfCode(): int - { - return $this->logicalLinesOfCode; - } - - public function plus(self $other): self - { - return new self( - $this->linesOfCode() + $other->linesOfCode(), - $this->commentLinesOfCode() + $other->commentLinesOfCode(), - $this->nonCommentLinesOfCode() + $other->nonCommentLinesOfCode(), - $this->logicalLinesOfCode() + $other->logicalLinesOfCode(), - ); - } -} diff --git a/vendor/sebastian/object-enumerator/ChangeLog.md b/vendor/sebastian/object-enumerator/ChangeLog.md deleted file mode 100644 index c04f46f..0000000 --- a/vendor/sebastian/object-enumerator/ChangeLog.md +++ /dev/null @@ -1,95 +0,0 @@ -# Change Log - -All notable changes to `sebastianbergmann/object-enumerator` are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. - -## [5.0.0] - 2023-02-03 - -### Removed - -* This component is no longer supported on PHP 7.3, PHP 7.4 and PHP 8.0 - -## [4.0.4] - 2020-10-26 - -### Fixed - -* `SebastianBergmann\ObjectEnumerator\Exception` now correctly extends `\Throwable` - -## [4.0.3] - 2020-09-28 - -### Changed - -* Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` - -## [4.0.2] - 2020-06-26 - -### Added - -* This component is now supported on PHP 8 - -## [4.0.1] - 2020-06-15 - -### Changed - -* Tests etc. are now ignored for archive exports - -## [4.0.0] - 2020-02-07 - -### Removed - -* This component is no longer supported on PHP 7.0, PHP 7.1, and PHP 7.2 - -## [3.0.3] - 2017-08-03 - -### Changed - -* Bumped required version of `sebastian/object-reflector` - -## [3.0.2] - 2017-03-12 - -### Changed - -* `sebastian/object-reflector` is now a dependency - -## [3.0.1] - 2017-03-12 - -### Fixed - -* Objects aggregated in inherited attributes are not enumerated - -## [3.0.0] - 2017-03-03 - -### Removed - -* This component is no longer supported on PHP 5.6 - -## [2.0.1] - 2017-02-18 - -### Fixed - -* Fixed [#2](https://github.com/sebastianbergmann/phpunit/pull/2): Exceptions in `ReflectionProperty::getValue()` are not handled - -## [2.0.0] - 2016-11-19 - -### Changed - -* This component is now compatible with `sebastian/recursion-context: ~1.0.4` - -## 1.0.0 - 2016-02-04 - -### Added - -* Initial release - -[5.0.0]: https://github.com/sebastianbergmann/object-enumerator/compare/4.0.4...5.0.0 -[4.0.4]: https://github.com/sebastianbergmann/object-enumerator/compare/4.0.3...4.0.4 -[4.0.3]: https://github.com/sebastianbergmann/object-enumerator/compare/4.0.2...4.0.3 -[4.0.2]: https://github.com/sebastianbergmann/object-enumerator/compare/4.0.1...4.0.2 -[4.0.1]: https://github.com/sebastianbergmann/object-enumerator/compare/4.0.0...4.0.1 -[4.0.0]: https://github.com/sebastianbergmann/object-enumerator/compare/3.0.3...4.0.0 -[3.0.3]: https://github.com/sebastianbergmann/object-enumerator/compare/3.0.2...3.0.3 -[3.0.2]: https://github.com/sebastianbergmann/object-enumerator/compare/3.0.1...3.0.2 -[3.0.1]: https://github.com/sebastianbergmann/object-enumerator/compare/3.0.0...3.0.1 -[3.0.0]: https://github.com/sebastianbergmann/object-enumerator/compare/2.0...3.0.0 -[2.0.1]: https://github.com/sebastianbergmann/object-enumerator/compare/2.0.0...2.0.1 -[2.0.0]: https://github.com/sebastianbergmann/object-enumerator/compare/1.0...2.0.0 - diff --git a/vendor/sebastian/object-enumerator/LICENSE b/vendor/sebastian/object-enumerator/LICENSE deleted file mode 100644 index 16e1ba9..0000000 --- a/vendor/sebastian/object-enumerator/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2016-2023, Sebastian Bergmann -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/sebastian/object-enumerator/README.md b/vendor/sebastian/object-enumerator/README.md deleted file mode 100644 index fc1a7aa..0000000 --- a/vendor/sebastian/object-enumerator/README.md +++ /dev/null @@ -1,22 +0,0 @@ -[![Latest Stable Version](https://poser.pugx.org/sebastian/object-enumerator/v/stable.png)](https://packagist.org/packages/sebastian/object-enumerator) -[![CI Status](https://github.com/sebastianbergmann/object-enumerator/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/object-enumerator/actions) -[![Type Coverage](https://shepherd.dev/github/sebastianbergmann/object-enumerator/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/object-enumerator) -[![codecov](https://codecov.io/gh/sebastianbergmann/object-enumerator/branch/main/graph/badge.svg)](https://codecov.io/gh/sebastianbergmann/object-enumerator) - -# sebastian/object-enumerator - -Traverses array structures and object graphs to enumerate all referenced objects. - -## Installation - -You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - -``` -composer require sebastian/object-enumerator -``` - -If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - -``` -composer require --dev sebastian/object-enumerator -``` diff --git a/vendor/sebastian/object-enumerator/SECURITY.md b/vendor/sebastian/object-enumerator/SECURITY.md deleted file mode 100644 index d4ee967..0000000 --- a/vendor/sebastian/object-enumerator/SECURITY.md +++ /dev/null @@ -1,9 +0,0 @@ -# Security Policy - -This library is intended to be used in development environments only. For instance, it is used by the testing framework PHPUnit. There is no reason why this library should be installed on a webserver. - -**If you upload this library to a webserver then your deployment process is broken. On a more general note, if your `vendor` directory is publicly accessible on your webserver then your deployment process is also broken.** - -## Security Contact Information - -After the above, if you still would like to report a security vulnerability, please email `sebastian@phpunit.de`. diff --git a/vendor/sebastian/object-enumerator/composer.json b/vendor/sebastian/object-enumerator/composer.json deleted file mode 100644 index 1d1a714..0000000 --- a/vendor/sebastian/object-enumerator/composer.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "sebastian/object-enumerator", - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "prefer-stable": true, - "config": { - "platform": { - "php": "8.1.0" - }, - "optimize-autoloader": true, - "sort-packages": true - }, - "require": { - "php": ">=8.1", - "sebastian/object-reflector": "^3.0", - "sebastian/recursion-context": "^5.0" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "autoload-dev": { - "classmap": [ - "tests/_fixture/" - ] - }, - "extra": { - "branch-alias": { - "dev-main": "5.0-dev" - } - } -} diff --git a/vendor/sebastian/object-enumerator/phpunit.xml b/vendor/sebastian/object-enumerator/phpunit.xml deleted file mode 100644 index bf94af0..0000000 --- a/vendor/sebastian/object-enumerator/phpunit.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - tests - - - - - - src - - - diff --git a/vendor/sebastian/object-enumerator/src/Enumerator.php b/vendor/sebastian/object-enumerator/src/Enumerator.php deleted file mode 100644 index c0897e5..0000000 --- a/vendor/sebastian/object-enumerator/src/Enumerator.php +++ /dev/null @@ -1,68 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\ObjectEnumerator; - -use function array_merge; -use function is_array; -use function is_object; -use SebastianBergmann\ObjectReflector\ObjectReflector; -use SebastianBergmann\RecursionContext\Context; - -final class Enumerator -{ - /** - * @psalm-return list - */ - public function enumerate(array|object $variable, Context $processed = new Context): array - { - $objects = []; - - if ($processed->contains($variable)) { - return $objects; - } - - $array = $variable; - - /* @noinspection UnusedFunctionResultInspection */ - $processed->add($variable); - - if (is_array($variable)) { - foreach ($array as $element) { - if (!is_array($element) && !is_object($element)) { - continue; - } - - /** @noinspection SlowArrayOperationsInLoopInspection */ - $objects = array_merge( - $objects, - $this->enumerate($element, $processed) - ); - } - - return $objects; - } - - $objects[] = $variable; - - foreach ((new ObjectReflector)->getProperties($variable) as $value) { - if (!is_array($value) && !is_object($value)) { - continue; - } - - /** @noinspection SlowArrayOperationsInLoopInspection */ - $objects = array_merge( - $objects, - $this->enumerate($value, $processed) - ); - } - - return $objects; - } -} diff --git a/vendor/sebastian/object-reflector/ChangeLog.md b/vendor/sebastian/object-reflector/ChangeLog.md deleted file mode 100644 index f6deff8..0000000 --- a/vendor/sebastian/object-reflector/ChangeLog.md +++ /dev/null @@ -1,66 +0,0 @@ -# Change Log - -All notable changes to `sebastianbergmann/object-reflector` are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. - -## [3.0.0] - 2023-02-03 - -### Changed - -* `ObjectReflector::getAttributes()` has been renamed to `ObjectReflector::getProperties()` - -### Removed - -* This component is no longer supported on PHP 7.3, PHP 7.4 and PHP 8.0 - -## [2.0.4] - 2020-10-26 - -### Fixed - -* `SebastianBergmann\ObjectReflector\Exception` now correctly extends `\Throwable` - -## [2.0.3] - 2020-09-28 - -### Changed - -* Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` - -## [2.0.2] - 2020-06-26 - -### Added - -* This component is now supported on PHP 8 - -## [2.0.1] - 2020-06-15 - -### Changed - -* Tests etc. are now ignored for archive exports - -## [2.0.0] - 2020-02-07 - -### Removed - -* This component is no longer supported on PHP 7.0, PHP 7.1, and PHP 7.2 - -## [1.1.1] - 2017-03-29 - -* Fixed [#1](https://github.com/sebastianbergmann/object-reflector/issues/1): Attributes with non-string names are not handled correctly - -## [1.1.0] - 2017-03-16 - -### Changed - -* Changed implementation of `ObjectReflector::getattributes()` to use `(array)` cast instead of `ReflectionObject` - -## 1.0.0 - 2017-03-12 - -* Initial release - -[3.0.0]: https://github.com/sebastianbergmann/object-reflector/compare/2.0.4...3.0.0 -[2.0.4]: https://github.com/sebastianbergmann/object-reflector/compare/2.0.3...2.0.4 -[2.0.3]: https://github.com/sebastianbergmann/object-reflector/compare/2.0.2...2.0.3 -[2.0.2]: https://github.com/sebastianbergmann/object-reflector/compare/2.0.1...2.0.2 -[2.0.1]: https://github.com/sebastianbergmann/object-reflector/compare/2.0.0...2.0.1 -[2.0.0]: https://github.com/sebastianbergmann/object-reflector/compare/1.1.1...2.0.0 -[1.1.1]: https://github.com/sebastianbergmann/object-reflector/compare/1.1.0...1.1.1 -[1.1.0]: https://github.com/sebastianbergmann/object-reflector/compare/1.0.0...1.1.0 diff --git a/vendor/sebastian/object-reflector/LICENSE b/vendor/sebastian/object-reflector/LICENSE deleted file mode 100644 index 371decf..0000000 --- a/vendor/sebastian/object-reflector/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2017-2023, Sebastian Bergmann -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/sebastian/object-reflector/README.md b/vendor/sebastian/object-reflector/README.md deleted file mode 100644 index 629c82d..0000000 --- a/vendor/sebastian/object-reflector/README.md +++ /dev/null @@ -1,22 +0,0 @@ -[![Latest Stable Version](https://poser.pugx.org/sebastian/object-reflector/v/stable.png)](https://packagist.org/packages/sebastian/object-reflector) -[![CI Status](https://github.com/sebastianbergmann/object-reflector/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/object-reflector/actions) -[![Type Coverage](https://shepherd.dev/github/sebastianbergmann/object-reflector/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/object-reflector) -[![codecov](https://codecov.io/gh/sebastianbergmann/object-reflector/branch/main/graph/badge.svg)](https://codecov.io/gh/sebastianbergmann/object-reflector) - -# sebastian/object-reflector - -Allows reflection of object properties, including inherited and private as well as protected ones. - -## Installation - -You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - -``` -composer require sebastian/object-reflector -``` - -If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - -``` -composer require --dev sebastian/object-reflector -``` diff --git a/vendor/sebastian/object-reflector/SECURITY.md b/vendor/sebastian/object-reflector/SECURITY.md deleted file mode 100644 index d4ee967..0000000 --- a/vendor/sebastian/object-reflector/SECURITY.md +++ /dev/null @@ -1,9 +0,0 @@ -# Security Policy - -This library is intended to be used in development environments only. For instance, it is used by the testing framework PHPUnit. There is no reason why this library should be installed on a webserver. - -**If you upload this library to a webserver then your deployment process is broken. On a more general note, if your `vendor` directory is publicly accessible on your webserver then your deployment process is also broken.** - -## Security Contact Information - -After the above, if you still would like to report a security vulnerability, please email `sebastian@phpunit.de`. diff --git a/vendor/sebastian/object-reflector/composer.json b/vendor/sebastian/object-reflector/composer.json deleted file mode 100644 index c9dcad0..0000000 --- a/vendor/sebastian/object-reflector/composer.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "sebastian/object-reflector", - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "prefer-stable": true, - "config": { - "platform": { - "php": "8.1.0" - }, - "optimize-autoloader": true, - "sort-packages": true - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "autoload-dev": { - "classmap": [ - "tests/_fixture/" - ] - }, - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - } -} diff --git a/vendor/sebastian/object-reflector/src/ObjectReflector.php b/vendor/sebastian/object-reflector/src/ObjectReflector.php deleted file mode 100644 index ba9cbaf..0000000 --- a/vendor/sebastian/object-reflector/src/ObjectReflector.php +++ /dev/null @@ -1,41 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\ObjectReflector; - -use function count; -use function explode; - -final class ObjectReflector -{ - /** - * @psalm-return array - */ - public function getProperties(object $object): array - { - $properties = []; - $className = $object::class; - - foreach ((array) $object as $name => $value) { - $name = explode("\0", (string) $name); - - if (count($name) === 1) { - $name = $name[0]; - } elseif ($name[1] !== $className) { - $name = $name[1] . '::' . $name[2]; - } else { - $name = $name[2]; - } - - $properties[$name] = $value; - } - - return $properties; - } -} diff --git a/vendor/sebastian/recursion-context/ChangeLog.md b/vendor/sebastian/recursion-context/ChangeLog.md deleted file mode 100644 index d888e43..0000000 --- a/vendor/sebastian/recursion-context/ChangeLog.md +++ /dev/null @@ -1,54 +0,0 @@ -# ChangeLog - -All notable changes are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. - -## [5.0.1] - 2025-08-10 - -### Changed - -* Do not use `SplObjectStorage` methods that will be deprecated in PHP 8.5 - -## [5.0.0] - 2023-02-03 - -### Removed - -* This component is no longer supported on PHP 7.3, PHP 7.4 and PHP 8.0 - -## [4.0.5] - 2023-02-03 - -### Fixed - -* [#26](https://github.com/sebastianbergmann/recursion-context/pull/26): Don't clobber `null` values if `array_key_exists(PHP_INT_MAX, $array)` - -## [4.0.4] - 2020-10-26 - -### Fixed - -* `SebastianBergmann\RecursionContext\Exception` now correctly extends `\Throwable` - -## [4.0.3] - 2020-09-28 - -### Changed - -* [#21](https://github.com/sebastianbergmann/recursion-context/pull/21): Add type annotations for in/out parameters -* Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` - -## [4.0.2] - 2020-06-26 - -### Added - -* This component is now supported on PHP 8 - -## [4.0.1] - 2020-06-15 - -### Changed - -* Tests etc. are now ignored for archive exports - -[5.0.1]: https://github.com/sebastianbergmann/recursion-context/compare/5.0.0...5.0.1 -[5.0.0]: https://github.com/sebastianbergmann/recursion-context/compare/4.0.5...5.0.0 -[4.0.5]: https://github.com/sebastianbergmann/recursion-context/compare/4.0.4...4.0.5 -[4.0.4]: https://github.com/sebastianbergmann/recursion-context/compare/4.0.3...4.0.4 -[4.0.3]: https://github.com/sebastianbergmann/recursion-context/compare/4.0.2...4.0.3 -[4.0.2]: https://github.com/sebastianbergmann/recursion-context/compare/4.0.1...4.0.2 -[4.0.1]: https://github.com/sebastianbergmann/recursion-context/compare/4.0.0...4.0.1 diff --git a/vendor/sebastian/recursion-context/LICENSE b/vendor/sebastian/recursion-context/LICENSE deleted file mode 100644 index c5268a9..0000000 --- a/vendor/sebastian/recursion-context/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2002-2025, Sebastian Bergmann -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/sebastian/recursion-context/README.md b/vendor/sebastian/recursion-context/README.md deleted file mode 100644 index 8204e10..0000000 --- a/vendor/sebastian/recursion-context/README.md +++ /dev/null @@ -1,20 +0,0 @@ -[![Latest Stable Version](https://poser.pugx.org/sebastian/recursion-context/v/stable.png)](https://packagist.org/packages/sebastian/recursion-context) -[![CI Status](https://github.com/sebastianbergmann/recursion-context/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/recursion-context/actions) -[![Type Coverage](https://shepherd.dev/github/sebastianbergmann/recursion-context/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/recursion-context) -[![codecov](https://codecov.io/gh/sebastianbergmann/recursion-context/branch/main/graph/badge.svg)](https://codecov.io/gh/sebastianbergmann/recursion-context) - -# sebastian/recursion-context - -## Installation - -You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - -``` -composer require sebastian/recursion-context -``` - -If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - -``` -composer require --dev sebastian/recursion-context -``` diff --git a/vendor/sebastian/recursion-context/SECURITY.md b/vendor/sebastian/recursion-context/SECURITY.md deleted file mode 100644 index d88ff00..0000000 --- a/vendor/sebastian/recursion-context/SECURITY.md +++ /dev/null @@ -1,30 +0,0 @@ -# Security Policy - -If you believe you have found a security vulnerability in the library that is developed in this repository, please report it to us through coordinated disclosure. - -**Please do not report security vulnerabilities through public GitHub issues, discussions, or pull requests.** - -Instead, please email `sebastian@phpunit.de`. - -Please include as much of the information listed below as you can to help us better understand and resolve the issue: - -* The type of issue -* Full paths of source file(s) related to the manifestation of the issue -* The location of the affected source code (tag/branch/commit or direct URL) -* Any special configuration required to reproduce the issue -* Step-by-step instructions to reproduce the issue -* Proof-of-concept or exploit code (if possible) -* Impact of the issue, including how an attacker might exploit the issue - -This information will help us triage your report more quickly. - -## Web Context - -The library that is developed in this repository was either extracted from [PHPUnit](https://github.com/sebastianbergmann/phpunit) or developed specifically as a dependency for PHPUnit. - -The library is developed with a focus on development environments and the command-line. No specific testing or hardening with regard to using the library in an HTTP or web context or with untrusted input data is performed. The library might also contain functionality that intentionally exposes internal application data for debugging purposes. - -If the library is used in a web application, the application developer is responsible for filtering inputs or escaping outputs as necessary and for verifying that the used functionality is safe for use within the intended context. - -Vulnerabilities specific to the use outside a development context will be fixed as applicable, provided that the fix does not have an averse effect on the primary use case for development purposes. - diff --git a/vendor/sebastian/recursion-context/composer.json b/vendor/sebastian/recursion-context/composer.json deleted file mode 100644 index b3a827f..0000000 --- a/vendor/sebastian/recursion-context/composer.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "name": "sebastian/recursion-context", - "description": "Provides functionality to recursively process PHP variables", - "homepage": "https://github.com/sebastianbergmann/recursion-context", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "support": { - "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "security": "https://github.com/sebastianbergmann/recursion-context/security/policy" - }, - "prefer-stable": true, - "config": { - "platform": { - "php": "8.1.0" - }, - "optimize-autoloader": true, - "sort-packages": true - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.5" - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "extra": { - "branch-alias": { - "dev-main": "5.0-dev" - } - } -} diff --git a/vendor/sebastian/recursion-context/src/Context.php b/vendor/sebastian/recursion-context/src/Context.php deleted file mode 100644 index 4be8704..0000000 --- a/vendor/sebastian/recursion-context/src/Context.php +++ /dev/null @@ -1,141 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\RecursionContext; - -use const PHP_INT_MAX; -use const PHP_INT_MIN; -use function array_key_exists; -use function array_pop; -use function array_slice; -use function count; -use function is_array; -use function random_int; -use function spl_object_hash; -use SplObjectStorage; - -final class Context -{ - private array $arrays = []; - private SplObjectStorage $objects; - - public function __construct() - { - $this->objects = new SplObjectStorage; - } - - /** - * @codeCoverageIgnore - */ - public function __destruct() - { - foreach ($this->arrays as &$array) { - if (is_array($array)) { - array_pop($array); - array_pop($array); - } - } - } - - /** - * @psalm-template T of object|array - * - * @psalm-param T $value - * - * @param-out T $value - */ - public function add(array|object &$value): false|int|string - { - if (is_array($value)) { - return $this->addArray($value); - } - - return $this->addObject($value); - } - - /** - * @psalm-template T of object|array - * - * @psalm-param T $value - * - * @param-out T $value - */ - public function contains(array|object &$value): false|int|string - { - if (is_array($value)) { - return $this->containsArray($value); - } - - return $this->containsObject($value); - } - - private function addArray(array &$array): int - { - $key = $this->containsArray($array); - - if ($key !== false) { - return $key; - } - - $key = count($this->arrays); - $this->arrays[] = &$array; - - if (!array_key_exists(PHP_INT_MAX, $array) && !array_key_exists(PHP_INT_MAX - 1, $array)) { - $array[] = $key; - $array[] = $this->objects; - } else { - /* Cover the improbable case, too. - * - * Note that array_slice() (used in containsArray()) will return the - * last two values added, *not necessarily* the highest integer keys - * in the array. Therefore, the order of these writes to $array is - * important, but the actual keys used is not. */ - do { - /** @noinspection PhpUnhandledExceptionInspection */ - $key = random_int(PHP_INT_MIN, PHP_INT_MAX); - } while (array_key_exists($key, $array)); - - $array[$key] = $key; - - do { - /** @noinspection PhpUnhandledExceptionInspection */ - $key = random_int(PHP_INT_MIN, PHP_INT_MAX); - } while (array_key_exists($key, $array)); - - $array[$key] = $this->objects; - } - - return $key; - } - - private function addObject(object $object): string - { - if (!$this->objects->offsetExists($object)) { - $this->objects->offsetSet($object); - } - - return spl_object_hash($object); - } - - private function containsArray(array $array): false|int - { - $end = array_slice($array, -2); - - return isset($end[1]) && $end[1] === $this->objects ? $end[0] : false; - } - - private function containsObject(object $value): false|string - { - if ($this->objects->offsetExists($value)) { - return spl_object_hash($value); - } - - return false; - } -} diff --git a/vendor/sebastian/type/ChangeLog.md b/vendor/sebastian/type/ChangeLog.md deleted file mode 100644 index 6c66140..0000000 --- a/vendor/sebastian/type/ChangeLog.md +++ /dev/null @@ -1,176 +0,0 @@ -# ChangeLog - -All notable changes are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. - -## [4.0.0] - 2023-02-03 - -### Removed - -* This component is no longer supported on PHP 7.3, PHP 7.4 and PHP 8.0 - -## [3.2.1] - 2023-02-03 - -### Fixed - -* [#28](https://github.com/sebastianbergmann/type/pull/28): Potential undefined offset warning/notice - -## [3.2.0] - 2022-09-12 - -### Added - -* [#25](https://github.com/sebastianbergmann/type/issues/25): Support Disjunctive Normal Form types -* Added `ReflectionMapper::fromParameterTypes()` -* Added `IntersectionType::types()` and `UnionType::types()` -* Added `UnionType::containsIntersectionTypes()` - -## [3.1.0] - 2022-08-29 - -### Added - -* [#21](https://github.com/sebastianbergmann/type/issues/21): Support `true` as stand-alone type - -## [3.0.0] - 2022-03-15 - -### Added - -* Support for intersection types introduced in PHP 8.1 -* Support for the `never` return type introduced in PHP 8.1 -* Added `Type::isCallable()`, `Type::isGenericObject()`, `Type::isIterable()`, `Type::isMixed()`, `Type::isNever()`, `Type::isNull()`, `Type::isObject()`, `Type::isSimple()`, `Type::isStatic()`, `Type::isUnion()`, `Type::isUnknown()`, and `Type::isVoid()` - -### Changed - -* Renamed `ReflectionMapper::fromMethodReturnType(ReflectionMethod $method)` to `ReflectionMapper::fromReturnType(ReflectionFunctionAbstract $functionOrMethod)` - -### Removed - -* Removed `Type::getReturnTypeDeclaration()` (use `Type::asString()` instead and prefix its result with `': '`) -* Removed `TypeName::getNamespaceName()` (use `TypeName::namespaceName()` instead) -* Removed `TypeName::getSimpleName()` (use `TypeName::simpleName()` instead) -* Removed `TypeName::getQualifiedName()` (use `TypeName::qualifiedName()` instead) - -## [2.3.4] - 2021-06-15 - -### Fixed - -* Fixed regression introduced in 2.3.3 - -## [2.3.3] - 2021-06-15 [YANKED] - -### Fixed - -* [#15](https://github.com/sebastianbergmann/type/issues/15): "false" pseudo type is not handled properly - -## [2.3.2] - 2021-06-04 - -### Fixed - -* Fixed handling of tentatively declared return types - -## [2.3.1] - 2020-10-26 - -### Fixed - -* `SebastianBergmann\Type\Exception` now correctly extends `\Throwable` - -## [2.3.0] - 2020-10-06 - -### Added - -* [#14](https://github.com/sebastianbergmann/type/issues/14): Support for `static` return type that is introduced in PHP 8 - -## [2.2.2] - 2020-09-28 - -### Changed - -* Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` - -## [2.2.1] - 2020-07-05 - -### Fixed - -* Fixed handling of `mixed` type in `ReflectionMapper::fromMethodReturnType()` - -## [2.2.0] - 2020-07-05 - -### Added - -* Added `MixedType` object for representing PHP 8's `mixed` type - -## [2.1.1] - 2020-06-26 - -### Added - -* This component is now supported on PHP 8 - -## [2.1.0] - 2020-06-01 - -### Added - -* Added `UnionType` object for representing PHP 8's Union Types -* Added `ReflectionMapper::fromMethodReturnType()` for mapping `\ReflectionMethod::getReturnType()` to a `Type` object -* Added `Type::name()` for retrieving the name of a type -* Added `Type::asString()` for retrieving a textual representation of a type - -### Changed - -* Deprecated `Type::getReturnTypeDeclaration()` (use `Type::asString()` instead and prefix its result with `': '`) -* Deprecated `TypeName::getNamespaceName()` (use `TypeName::namespaceName()` instead) -* Deprecated `TypeName::getSimpleName()` (use `TypeName::simpleName()` instead) -* Deprecated `TypeName::getQualifiedName()` (use `TypeName::qualifiedName()` instead) - -## [2.0.0] - 2020-02-07 - -### Removed - -* This component is no longer supported on PHP 7.2 - -## [1.1.3] - 2019-07-02 - -### Fixed - -* Fixed class name comparison in `ObjectType` to be case-insensitive - -## [1.1.2] - 2019-06-19 - -### Fixed - -* Fixed handling of `object` type - -## [1.1.1] - 2019-06-08 - -### Fixed - -* Fixed autoloading of `callback_function.php` fixture file - -## [1.1.0] - 2019-06-07 - -### Added - -* Added support for `callable` type -* Added support for `iterable` type - -## [1.0.0] - 2019-06-06 - -* Initial release based on [code contributed by Michel Hartmann to PHPUnit](https://github.com/sebastianbergmann/phpunit/pull/3673) - -[4.0.0]: https://github.com/sebastianbergmann/type/compare/3.2.1...4.0.0 -[3.2.1]: https://github.com/sebastianbergmann/type/compare/3.2.0...3.2.1 -[3.2.0]: https://github.com/sebastianbergmann/type/compare/3.1.0...3.2.0 -[3.1.0]: https://github.com/sebastianbergmann/type/compare/3.0.0...3.1.0 -[3.0.0]: https://github.com/sebastianbergmann/type/compare/2.3.4...3.0.0 -[2.3.4]: https://github.com/sebastianbergmann/type/compare/ca39369c41313ed12c071ed38ecda8fcdb248859...2.3.4 -[2.3.3]: https://github.com/sebastianbergmann/type/compare/2.3.2...ca39369c41313ed12c071ed38ecda8fcdb248859 -[2.3.2]: https://github.com/sebastianbergmann/type/compare/2.3.1...2.3.2 -[2.3.1]: https://github.com/sebastianbergmann/type/compare/2.3.0...2.3.1 -[2.3.0]: https://github.com/sebastianbergmann/type/compare/2.2.2...2.3.0 -[2.2.2]: https://github.com/sebastianbergmann/type/compare/2.2.1...2.2.2 -[2.2.1]: https://github.com/sebastianbergmann/type/compare/2.2.0...2.2.1 -[2.2.0]: https://github.com/sebastianbergmann/type/compare/2.1.1...2.2.0 -[2.1.1]: https://github.com/sebastianbergmann/type/compare/2.1.0...2.1.1 -[2.1.0]: https://github.com/sebastianbergmann/type/compare/2.0.0...2.1.0 -[2.0.0]: https://github.com/sebastianbergmann/type/compare/1.1.3...2.0.0 -[1.1.3]: https://github.com/sebastianbergmann/type/compare/1.1.2...1.1.3 -[1.1.2]: https://github.com/sebastianbergmann/type/compare/1.1.1...1.1.2 -[1.1.1]: https://github.com/sebastianbergmann/type/compare/1.1.0...1.1.1 -[1.1.0]: https://github.com/sebastianbergmann/type/compare/1.0.0...1.1.0 -[1.0.0]: https://github.com/sebastianbergmann/type/compare/ff74aa41746bd8d10e931843ebf37d42da513ede...1.0.0 diff --git a/vendor/sebastian/type/LICENSE b/vendor/sebastian/type/LICENSE deleted file mode 100644 index 5b4bf45..0000000 --- a/vendor/sebastian/type/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2019-2023, Sebastian Bergmann -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/sebastian/type/README.md b/vendor/sebastian/type/README.md deleted file mode 100644 index fef3de2..0000000 --- a/vendor/sebastian/type/README.md +++ /dev/null @@ -1,22 +0,0 @@ -[![Latest Stable Version](https://poser.pugx.org/sebastian/type/v/stable.png)](https://packagist.org/packages/sebastian/type) -[![CI Status](https://github.com/sebastianbergmann/type/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/type/actions) -[![Type Coverage](https://shepherd.dev/github/sebastianbergmann/type/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/type) -[![codecov](https://codecov.io/gh/sebastianbergmann/type/branch/main/graph/badge.svg)](https://codecov.io/gh/sebastianbergmann/type) - -# sebastian/type - -Collection of value objects that represent the types of the PHP type system. - -## Installation - -You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - -``` -composer require sebastian/type -``` - -If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - -``` -composer require --dev sebastian/type -``` diff --git a/vendor/sebastian/type/SECURITY.md b/vendor/sebastian/type/SECURITY.md deleted file mode 100644 index d4ee967..0000000 --- a/vendor/sebastian/type/SECURITY.md +++ /dev/null @@ -1,9 +0,0 @@ -# Security Policy - -This library is intended to be used in development environments only. For instance, it is used by the testing framework PHPUnit. There is no reason why this library should be installed on a webserver. - -**If you upload this library to a webserver then your deployment process is broken. On a more general note, if your `vendor` directory is publicly accessible on your webserver then your deployment process is also broken.** - -## Security Contact Information - -After the above, if you still would like to report a security vulnerability, please email `sebastian@phpunit.de`. diff --git a/vendor/sebastian/type/composer.json b/vendor/sebastian/type/composer.json deleted file mode 100644 index faf8a0e..0000000 --- a/vendor/sebastian/type/composer.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "name": "sebastian/type", - "description": "Collection of value objects that represent the types of the PHP type system", - "type": "library", - "homepage": "https://github.com/sebastianbergmann/type", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "support": { - "issues": "https://github.com/sebastianbergmann/type/issues" - }, - "prefer-stable": true, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "config": { - "platform": { - "php": "8.1.0" - }, - "optimize-autoloader": true, - "sort-packages": true - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "autoload-dev": { - "classmap": [ - "tests/_fixture" - ], - "files": [ - "tests/_fixture/callback_function.php", - "tests/_fixture/functions_that_declare_return_types.php" - ] - }, - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - } -} diff --git a/vendor/sebastian/type/infection.json b/vendor/sebastian/type/infection.json deleted file mode 100644 index 0954651..0000000 --- a/vendor/sebastian/type/infection.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "source": { - "directories": [ - "src" - ] - }, - "mutators": { - "@default": true - }, - "minMsi": 100, - "minCoveredMsi": 100 -} diff --git a/vendor/sebastian/type/src/Parameter.php b/vendor/sebastian/type/src/Parameter.php deleted file mode 100644 index b8cd8b1..0000000 --- a/vendor/sebastian/type/src/Parameter.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Type; - -final class Parameter -{ - /** - * @psalm-var non-empty-string - */ - private string $name; - private Type $type; - - /** - * @psalm-param non-empty-string $name - */ - public function __construct(string $name, Type $type) - { - $this->name = $name; - $this->type = $type; - } - - public function name(): string - { - return $this->name; - } - - public function type(): Type - { - return $this->type; - } -} diff --git a/vendor/sebastian/type/src/ReflectionMapper.php b/vendor/sebastian/type/src/ReflectionMapper.php deleted file mode 100644 index a39d619..0000000 --- a/vendor/sebastian/type/src/ReflectionMapper.php +++ /dev/null @@ -1,176 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Type; - -use function assert; -use ReflectionFunction; -use ReflectionIntersectionType; -use ReflectionMethod; -use ReflectionNamedType; -use ReflectionType; -use ReflectionUnionType; - -final class ReflectionMapper -{ - /** - * @psalm-return list - */ - public function fromParameterTypes(ReflectionFunction|ReflectionMethod $functionOrMethod): array - { - $parameters = []; - - foreach ($functionOrMethod->getParameters() as $parameter) { - $name = $parameter->getName(); - - assert($name !== ''); - - if (!$parameter->hasType()) { - $parameters[] = new Parameter($name, new UnknownType); - - continue; - } - - $type = $parameter->getType(); - - if ($type instanceof ReflectionNamedType) { - $parameters[] = new Parameter( - $name, - $this->mapNamedType($type, $functionOrMethod) - ); - - continue; - } - - if ($type instanceof ReflectionUnionType) { - $parameters[] = new Parameter( - $name, - $this->mapUnionType($type, $functionOrMethod) - ); - - continue; - } - - if ($type instanceof ReflectionIntersectionType) { - $parameters[] = new Parameter( - $name, - $this->mapIntersectionType($type, $functionOrMethod) - ); - } - } - - return $parameters; - } - - public function fromReturnType(ReflectionFunction|ReflectionMethod $functionOrMethod): Type - { - if (!$this->hasReturnType($functionOrMethod)) { - return new UnknownType; - } - - $returnType = $this->returnType($functionOrMethod); - - assert($returnType instanceof ReflectionNamedType || $returnType instanceof ReflectionUnionType || $returnType instanceof ReflectionIntersectionType); - - if ($returnType instanceof ReflectionNamedType) { - return $this->mapNamedType($returnType, $functionOrMethod); - } - - if ($returnType instanceof ReflectionUnionType) { - return $this->mapUnionType($returnType, $functionOrMethod); - } - - if ($returnType instanceof ReflectionIntersectionType) { - return $this->mapIntersectionType($returnType, $functionOrMethod); - } - } - - private function mapNamedType(ReflectionNamedType $type, ReflectionFunction|ReflectionMethod $functionOrMethod): Type - { - if ($functionOrMethod instanceof ReflectionMethod && $type->getName() === 'self') { - return ObjectType::fromName( - $functionOrMethod->getDeclaringClass()->getName(), - $type->allowsNull() - ); - } - - if ($functionOrMethod instanceof ReflectionMethod && $type->getName() === 'static') { - return new StaticType( - TypeName::fromReflection($functionOrMethod->getDeclaringClass()), - $type->allowsNull() - ); - } - - if ($type->getName() === 'mixed') { - return new MixedType; - } - - if ($functionOrMethod instanceof ReflectionMethod && $type->getName() === 'parent') { - return ObjectType::fromName( - $functionOrMethod->getDeclaringClass()->getParentClass()->getName(), - $type->allowsNull() - ); - } - - return Type::fromName( - $type->getName(), - $type->allowsNull() - ); - } - - private function mapUnionType(ReflectionUnionType $type, ReflectionFunction|ReflectionMethod $functionOrMethod): Type - { - $types = []; - - foreach ($type->getTypes() as $_type) { - assert($_type instanceof ReflectionNamedType || $_type instanceof ReflectionIntersectionType); - - if ($_type instanceof ReflectionNamedType) { - $types[] = $this->mapNamedType($_type, $functionOrMethod); - - continue; - } - - $types[] = $this->mapIntersectionType($_type, $functionOrMethod); - } - - return new UnionType(...$types); - } - - private function mapIntersectionType(ReflectionIntersectionType $type, ReflectionFunction|ReflectionMethod $functionOrMethod): Type - { - $types = []; - - foreach ($type->getTypes() as $_type) { - assert($_type instanceof ReflectionNamedType); - - $types[] = $this->mapNamedType($_type, $functionOrMethod); - } - - return new IntersectionType(...$types); - } - - private function hasReturnType(ReflectionFunction|ReflectionMethod $functionOrMethod): bool - { - if ($functionOrMethod->hasReturnType()) { - return true; - } - - return $functionOrMethod->hasTentativeReturnType(); - } - - private function returnType(ReflectionFunction|ReflectionMethod $functionOrMethod): ?ReflectionType - { - if ($functionOrMethod->hasReturnType()) { - return $functionOrMethod->getReturnType(); - } - - return $functionOrMethod->getTentativeReturnType(); - } -} diff --git a/vendor/sebastian/type/src/TypeName.php b/vendor/sebastian/type/src/TypeName.php deleted file mode 100644 index e63b57c..0000000 --- a/vendor/sebastian/type/src/TypeName.php +++ /dev/null @@ -1,76 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Type; - -use function array_pop; -use function explode; -use function implode; -use function substr; -use ReflectionClass; - -final class TypeName -{ - private ?string $namespaceName; - private string $simpleName; - - public static function fromQualifiedName(string $fullClassName): self - { - if ($fullClassName[0] === '\\') { - $fullClassName = substr($fullClassName, 1); - } - - $classNameParts = explode('\\', $fullClassName); - - $simpleName = array_pop($classNameParts); - $namespaceName = implode('\\', $classNameParts); - - return new self($namespaceName, $simpleName); - } - - public static function fromReflection(ReflectionClass $type): self - { - return new self( - $type->getNamespaceName(), - $type->getShortName() - ); - } - - public function __construct(?string $namespaceName, string $simpleName) - { - if ($namespaceName === '') { - $namespaceName = null; - } - - $this->namespaceName = $namespaceName; - $this->simpleName = $simpleName; - } - - public function namespaceName(): ?string - { - return $this->namespaceName; - } - - public function simpleName(): string - { - return $this->simpleName; - } - - public function qualifiedName(): string - { - return $this->namespaceName === null - ? $this->simpleName - : $this->namespaceName . '\\' . $this->simpleName; - } - - public function isNamespaced(): bool - { - return $this->namespaceName !== null; - } -} diff --git a/vendor/sebastian/type/src/exception/Exception.php b/vendor/sebastian/type/src/exception/Exception.php deleted file mode 100644 index e0e7ee5..0000000 --- a/vendor/sebastian/type/src/exception/Exception.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Type; - -use Throwable; - -interface Exception extends Throwable -{ -} diff --git a/vendor/sebastian/type/src/exception/RuntimeException.php b/vendor/sebastian/type/src/exception/RuntimeException.php deleted file mode 100644 index 4dfea6a..0000000 --- a/vendor/sebastian/type/src/exception/RuntimeException.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Type; - -final class RuntimeException extends \RuntimeException implements Exception -{ -} diff --git a/vendor/sebastian/type/src/type/CallableType.php b/vendor/sebastian/type/src/type/CallableType.php deleted file mode 100644 index 0da42a7..0000000 --- a/vendor/sebastian/type/src/type/CallableType.php +++ /dev/null @@ -1,182 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Type; - -use function assert; -use function class_exists; -use function count; -use function explode; -use function function_exists; -use function is_array; -use function is_object; -use function is_string; -use function str_contains; -use Closure; -use ReflectionClass; -use ReflectionObject; - -final class CallableType extends Type -{ - private bool $allowsNull; - - public function __construct(bool $nullable) - { - $this->allowsNull = $nullable; - } - - public function isAssignable(Type $other): bool - { - if ($this->allowsNull && $other instanceof NullType) { - return true; - } - - if ($other instanceof self) { - return true; - } - - if ($other instanceof ObjectType) { - if ($this->isClosure($other)) { - return true; - } - - if ($this->hasInvokeMethod($other)) { - return true; - } - } - - if ($other instanceof SimpleType) { - if ($this->isFunction($other)) { - return true; - } - - if ($this->isClassCallback($other)) { - return true; - } - - if ($this->isObjectCallback($other)) { - return true; - } - } - - return false; - } - - public function name(): string - { - return 'callable'; - } - - public function allowsNull(): bool - { - return $this->allowsNull; - } - - /** - * @psalm-assert-if-true CallableType $this - */ - public function isCallable(): bool - { - return true; - } - - private function isClosure(ObjectType $type): bool - { - return $type->className()->qualifiedName() === Closure::class; - } - - private function hasInvokeMethod(ObjectType $type): bool - { - $className = $type->className()->qualifiedName(); - - assert(class_exists($className)); - - return (new ReflectionClass($className))->hasMethod('__invoke'); - } - - private function isFunction(SimpleType $type): bool - { - if (!is_string($type->value())) { - return false; - } - - return function_exists($type->value()); - } - - private function isObjectCallback(SimpleType $type): bool - { - if (!is_array($type->value())) { - return false; - } - - if (count($type->value()) !== 2) { - return false; - } - - if (!isset($type->value()[0], $type->value()[1])) { - return false; - } - - if (!is_object($type->value()[0]) || !is_string($type->value()[1])) { - return false; - } - - [$object, $methodName] = $type->value(); - - return (new ReflectionObject($object))->hasMethod($methodName); - } - - private function isClassCallback(SimpleType $type): bool - { - if (!is_string($type->value()) && !is_array($type->value())) { - return false; - } - - if (is_string($type->value())) { - if (!str_contains($type->value(), '::')) { - return false; - } - - [$className, $methodName] = explode('::', $type->value()); - } - - if (is_array($type->value())) { - if (count($type->value()) !== 2) { - return false; - } - - if (!isset($type->value()[0], $type->value()[1])) { - return false; - } - - if (!is_string($type->value()[0]) || !is_string($type->value()[1])) { - return false; - } - - [$className, $methodName] = $type->value(); - } - - assert(isset($className) && is_string($className)); - assert(isset($methodName) && is_string($methodName)); - - if (!class_exists($className)) { - return false; - } - - $class = new ReflectionClass($className); - - if (!$class->hasMethod($methodName)) { - return false; - } - - $method = $class->getMethod($methodName); - - return $method->isPublic() && $method->isStatic(); - } -} diff --git a/vendor/sebastian/type/src/type/FalseType.php b/vendor/sebastian/type/src/type/FalseType.php deleted file mode 100644 index f417fb6..0000000 --- a/vendor/sebastian/type/src/type/FalseType.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Type; - -final class FalseType extends Type -{ - public function isAssignable(Type $other): bool - { - if ($other instanceof self) { - return true; - } - - return $other instanceof SimpleType && - $other->name() === 'bool' && - $other->value() === false; - } - - public function name(): string - { - return 'false'; - } - - public function allowsNull(): bool - { - return false; - } - - /** - * @psalm-assert-if-true FalseType $this - */ - public function isFalse(): bool - { - return true; - } -} diff --git a/vendor/sebastian/type/src/type/GenericObjectType.php b/vendor/sebastian/type/src/type/GenericObjectType.php deleted file mode 100644 index 76ab6a9..0000000 --- a/vendor/sebastian/type/src/type/GenericObjectType.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Type; - -final class GenericObjectType extends Type -{ - private bool $allowsNull; - - public function __construct(bool $nullable) - { - $this->allowsNull = $nullable; - } - - public function isAssignable(Type $other): bool - { - if ($this->allowsNull && $other instanceof NullType) { - return true; - } - - if (!$other instanceof ObjectType) { - return false; - } - - return true; - } - - public function name(): string - { - return 'object'; - } - - public function allowsNull(): bool - { - return $this->allowsNull; - } - - /** - * @psalm-assert-if-true GenericObjectType $this - */ - public function isGenericObject(): bool - { - return true; - } -} diff --git a/vendor/sebastian/type/src/type/IntersectionType.php b/vendor/sebastian/type/src/type/IntersectionType.php deleted file mode 100644 index 71d5dc2..0000000 --- a/vendor/sebastian/type/src/type/IntersectionType.php +++ /dev/null @@ -1,126 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Type; - -use function assert; -use function count; -use function implode; -use function in_array; -use function sort; - -final class IntersectionType extends Type -{ - /** - * @psalm-var non-empty-list - */ - private array $types; - - /** - * @throws RuntimeException - */ - public function __construct(Type ...$types) - { - $this->ensureMinimumOfTwoTypes(...$types); - $this->ensureOnlyValidTypes(...$types); - $this->ensureNoDuplicateTypes(...$types); - - $this->types = $types; - } - - public function isAssignable(Type $other): bool - { - return $other->isObject(); - } - - public function asString(): string - { - return $this->name(); - } - - public function name(): string - { - $types = []; - - foreach ($this->types as $type) { - $types[] = $type->name(); - } - - sort($types); - - return implode('&', $types); - } - - public function allowsNull(): bool - { - return false; - } - - /** - * @psalm-assert-if-true IntersectionType $this - */ - public function isIntersection(): bool - { - return true; - } - - /** - * @psalm-return non-empty-list - */ - public function types(): array - { - return $this->types; - } - - /** - * @throws RuntimeException - */ - private function ensureMinimumOfTwoTypes(Type ...$types): void - { - if (count($types) < 2) { - throw new RuntimeException( - 'An intersection type must be composed of at least two types' - ); - } - } - - /** - * @throws RuntimeException - */ - private function ensureOnlyValidTypes(Type ...$types): void - { - foreach ($types as $type) { - if (!$type->isObject()) { - throw new RuntimeException( - 'An intersection type can only be composed of interfaces and classes' - ); - } - } - } - - /** - * @throws RuntimeException - */ - private function ensureNoDuplicateTypes(Type ...$types): void - { - $names = []; - - foreach ($types as $type) { - assert($type instanceof ObjectType); - - $classQualifiedName = $type->className()->qualifiedName(); - - if (in_array($classQualifiedName, $names, true)) { - throw new RuntimeException('An intersection type must not contain duplicate types'); - } - - $names[] = $classQualifiedName; - } - } -} diff --git a/vendor/sebastian/type/src/type/IterableType.php b/vendor/sebastian/type/src/type/IterableType.php deleted file mode 100644 index d249953..0000000 --- a/vendor/sebastian/type/src/type/IterableType.php +++ /dev/null @@ -1,71 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Type; - -use function assert; -use function class_exists; -use function is_iterable; -use ReflectionClass; - -final class IterableType extends Type -{ - private bool $allowsNull; - - public function __construct(bool $nullable) - { - $this->allowsNull = $nullable; - } - - /** - * @throws RuntimeException - */ - public function isAssignable(Type $other): bool - { - if ($this->allowsNull && $other instanceof NullType) { - return true; - } - - if ($other instanceof self) { - return true; - } - - if ($other instanceof SimpleType) { - return is_iterable($other->value()); - } - - if ($other instanceof ObjectType) { - $className = $other->className()->qualifiedName(); - - assert(class_exists($className)); - - return (new ReflectionClass($className))->isIterable(); - } - - return false; - } - - public function name(): string - { - return 'iterable'; - } - - public function allowsNull(): bool - { - return $this->allowsNull; - } - - /** - * @psalm-assert-if-true IterableType $this - */ - public function isIterable(): bool - { - return true; - } -} diff --git a/vendor/sebastian/type/src/type/MixedType.php b/vendor/sebastian/type/src/type/MixedType.php deleted file mode 100644 index a1412e4..0000000 --- a/vendor/sebastian/type/src/type/MixedType.php +++ /dev/null @@ -1,41 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Type; - -final class MixedType extends Type -{ - public function isAssignable(Type $other): bool - { - return !$other instanceof VoidType; - } - - public function asString(): string - { - return 'mixed'; - } - - public function name(): string - { - return 'mixed'; - } - - public function allowsNull(): bool - { - return true; - } - - /** - * @psalm-assert-if-true MixedType $this - */ - public function isMixed(): bool - { - return true; - } -} diff --git a/vendor/sebastian/type/src/type/NeverType.php b/vendor/sebastian/type/src/type/NeverType.php deleted file mode 100644 index 6c14474..0000000 --- a/vendor/sebastian/type/src/type/NeverType.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Type; - -final class NeverType extends Type -{ - public function isAssignable(Type $other): bool - { - return $other instanceof self; - } - - public function name(): string - { - return 'never'; - } - - public function allowsNull(): bool - { - return false; - } - - /** - * @psalm-assert-if-true NeverType $this - */ - public function isNever(): bool - { - return true; - } -} diff --git a/vendor/sebastian/type/src/type/NullType.php b/vendor/sebastian/type/src/type/NullType.php deleted file mode 100644 index 93834ea..0000000 --- a/vendor/sebastian/type/src/type/NullType.php +++ /dev/null @@ -1,41 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Type; - -final class NullType extends Type -{ - public function isAssignable(Type $other): bool - { - return !($other instanceof VoidType); - } - - public function name(): string - { - return 'null'; - } - - public function asString(): string - { - return 'null'; - } - - public function allowsNull(): bool - { - return true; - } - - /** - * @psalm-assert-if-true NullType $this - */ - public function isNull(): bool - { - return true; - } -} diff --git a/vendor/sebastian/type/src/type/ObjectType.php b/vendor/sebastian/type/src/type/ObjectType.php deleted file mode 100644 index 717cb92..0000000 --- a/vendor/sebastian/type/src/type/ObjectType.php +++ /dev/null @@ -1,67 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Type; - -use function is_subclass_of; -use function strcasecmp; - -final class ObjectType extends Type -{ - private TypeName $className; - private bool $allowsNull; - - public function __construct(TypeName $className, bool $allowsNull) - { - $this->className = $className; - $this->allowsNull = $allowsNull; - } - - public function isAssignable(Type $other): bool - { - if ($this->allowsNull && $other instanceof NullType) { - return true; - } - - if ($other instanceof self) { - if (0 === strcasecmp($this->className->qualifiedName(), $other->className->qualifiedName())) { - return true; - } - - if (is_subclass_of($other->className->qualifiedName(), $this->className->qualifiedName(), true)) { - return true; - } - } - - return false; - } - - public function name(): string - { - return $this->className->qualifiedName(); - } - - public function allowsNull(): bool - { - return $this->allowsNull; - } - - public function className(): TypeName - { - return $this->className; - } - - /** - * @psalm-assert-if-true ObjectType $this - */ - public function isObject(): bool - { - return true; - } -} diff --git a/vendor/sebastian/type/src/type/SimpleType.php b/vendor/sebastian/type/src/type/SimpleType.php deleted file mode 100644 index 4f210a8..0000000 --- a/vendor/sebastian/type/src/type/SimpleType.php +++ /dev/null @@ -1,83 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Type; - -use function strtolower; - -final class SimpleType extends Type -{ - private string $name; - private bool $allowsNull; - private mixed $value; - - public function __construct(string $name, bool $nullable, mixed $value = null) - { - $this->name = $this->normalize($name); - $this->allowsNull = $nullable; - $this->value = $value; - } - - public function isAssignable(Type $other): bool - { - if ($this->allowsNull && $other instanceof NullType) { - return true; - } - - if ($this->name === 'bool' && $other->name() === 'true') { - return true; - } - - if ($this->name === 'bool' && $other->name() === 'false') { - return true; - } - - if ($other instanceof self) { - return $this->name === $other->name; - } - - return false; - } - - public function name(): string - { - return $this->name; - } - - public function allowsNull(): bool - { - return $this->allowsNull; - } - - public function value(): mixed - { - return $this->value; - } - - /** - * @psalm-assert-if-true SimpleType $this - */ - public function isSimple(): bool - { - return true; - } - - private function normalize(string $name): string - { - $name = strtolower($name); - - return match ($name) { - 'boolean' => 'bool', - 'real', 'double' => 'float', - 'integer' => 'int', - '[]' => 'array', - default => $name, - }; - } -} diff --git a/vendor/sebastian/type/src/type/StaticType.php b/vendor/sebastian/type/src/type/StaticType.php deleted file mode 100644 index b53708b..0000000 --- a/vendor/sebastian/type/src/type/StaticType.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Type; - -use function is_subclass_of; -use function strcasecmp; - -final class StaticType extends Type -{ - private TypeName $className; - private bool $allowsNull; - - public function __construct(TypeName $className, bool $allowsNull) - { - $this->className = $className; - $this->allowsNull = $allowsNull; - } - - public function isAssignable(Type $other): bool - { - if ($this->allowsNull && $other instanceof NullType) { - return true; - } - - if (!$other instanceof ObjectType) { - return false; - } - - if (0 === strcasecmp($this->className->qualifiedName(), $other->className()->qualifiedName())) { - return true; - } - - if (is_subclass_of($other->className()->qualifiedName(), $this->className->qualifiedName(), true)) { - return true; - } - - return false; - } - - public function name(): string - { - return 'static'; - } - - public function allowsNull(): bool - { - return $this->allowsNull; - } - - /** - * @psalm-assert-if-true StaticType $this - */ - public function isStatic(): bool - { - return true; - } -} diff --git a/vendor/sebastian/type/src/type/TrueType.php b/vendor/sebastian/type/src/type/TrueType.php deleted file mode 100644 index 94e5be9..0000000 --- a/vendor/sebastian/type/src/type/TrueType.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Type; - -final class TrueType extends Type -{ - public function isAssignable(Type $other): bool - { - if ($other instanceof self) { - return true; - } - - return $other instanceof SimpleType && - $other->name() === 'bool' && - $other->value() === true; - } - - public function name(): string - { - return 'true'; - } - - public function allowsNull(): bool - { - return false; - } - - /** - * @psalm-assert-if-true TrueType $this - */ - public function isTrue(): bool - { - return true; - } -} diff --git a/vendor/sebastian/type/src/type/Type.php b/vendor/sebastian/type/src/type/Type.php deleted file mode 100644 index 76029cf..0000000 --- a/vendor/sebastian/type/src/type/Type.php +++ /dev/null @@ -1,192 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Type; - -use function gettype; -use function strtolower; - -abstract class Type -{ - public static function fromValue(mixed $value, bool $allowsNull): self - { - if ($allowsNull === false) { - if ($value === true) { - return new TrueType; - } - - if ($value === false) { - return new FalseType; - } - } - - $typeName = gettype($value); - - if ($typeName === 'object') { - return new ObjectType(TypeName::fromQualifiedName($value::class), $allowsNull); - } - - $type = self::fromName($typeName, $allowsNull); - - if ($type instanceof SimpleType) { - $type = new SimpleType($typeName, $allowsNull, $value); - } - - return $type; - } - - public static function fromName(string $typeName, bool $allowsNull): self - { - return match (strtolower($typeName)) { - 'callable' => new CallableType($allowsNull), - 'true' => new TrueType, - 'false' => new FalseType, - 'iterable' => new IterableType($allowsNull), - 'never' => new NeverType, - 'null' => new NullType, - 'object' => new GenericObjectType($allowsNull), - 'unknown type' => new UnknownType, - 'void' => new VoidType, - 'array', 'bool', 'boolean', 'double', 'float', 'int', 'integer', 'real', 'resource', 'resource (closed)', 'string' => new SimpleType($typeName, $allowsNull), - 'mixed' => new MixedType, - default => new ObjectType(TypeName::fromQualifiedName($typeName), $allowsNull), - }; - } - - public function asString(): string - { - return ($this->allowsNull() ? '?' : '') . $this->name(); - } - - /** - * @psalm-assert-if-true CallableType $this - */ - public function isCallable(): bool - { - return false; - } - - /** - * @psalm-assert-if-true TrueType $this - */ - public function isTrue(): bool - { - return false; - } - - /** - * @psalm-assert-if-true FalseType $this - */ - public function isFalse(): bool - { - return false; - } - - /** - * @psalm-assert-if-true GenericObjectType $this - */ - public function isGenericObject(): bool - { - return false; - } - - /** - * @psalm-assert-if-true IntersectionType $this - */ - public function isIntersection(): bool - { - return false; - } - - /** - * @psalm-assert-if-true IterableType $this - */ - public function isIterable(): bool - { - return false; - } - - /** - * @psalm-assert-if-true MixedType $this - */ - public function isMixed(): bool - { - return false; - } - - /** - * @psalm-assert-if-true NeverType $this - */ - public function isNever(): bool - { - return false; - } - - /** - * @psalm-assert-if-true NullType $this - */ - public function isNull(): bool - { - return false; - } - - /** - * @psalm-assert-if-true ObjectType $this - */ - public function isObject(): bool - { - return false; - } - - /** - * @psalm-assert-if-true SimpleType $this - */ - public function isSimple(): bool - { - return false; - } - - /** - * @psalm-assert-if-true StaticType $this - */ - public function isStatic(): bool - { - return false; - } - - /** - * @psalm-assert-if-true UnionType $this - */ - public function isUnion(): bool - { - return false; - } - - /** - * @psalm-assert-if-true UnknownType $this - */ - public function isUnknown(): bool - { - return false; - } - - /** - * @psalm-assert-if-true VoidType $this - */ - public function isVoid(): bool - { - return false; - } - - abstract public function isAssignable(self $other): bool; - - abstract public function name(): string; - - abstract public function allowsNull(): bool; -} diff --git a/vendor/sebastian/type/src/type/UnionType.php b/vendor/sebastian/type/src/type/UnionType.php deleted file mode 100644 index 01c4b71..0000000 --- a/vendor/sebastian/type/src/type/UnionType.php +++ /dev/null @@ -1,138 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Type; - -use function count; -use function implode; -use function sort; - -final class UnionType extends Type -{ - /** - * @psalm-var non-empty-list - */ - private array $types; - - /** - * @throws RuntimeException - */ - public function __construct(Type ...$types) - { - $this->ensureMinimumOfTwoTypes(...$types); - $this->ensureOnlyValidTypes(...$types); - - $this->types = $types; - } - - public function isAssignable(Type $other): bool - { - foreach ($this->types as $type) { - if ($type->isAssignable($other)) { - return true; - } - } - - return false; - } - - public function asString(): string - { - return $this->name(); - } - - public function name(): string - { - $types = []; - - foreach ($this->types as $type) { - if ($type->isIntersection()) { - $types[] = '(' . $type->name() . ')'; - - continue; - } - - $types[] = $type->name(); - } - - sort($types); - - return implode('|', $types); - } - - public function allowsNull(): bool - { - foreach ($this->types as $type) { - if ($type instanceof NullType) { - return true; - } - } - - return false; - } - - /** - * @psalm-assert-if-true UnionType $this - */ - public function isUnion(): bool - { - return true; - } - - public function containsIntersectionTypes(): bool - { - foreach ($this->types as $type) { - if ($type->isIntersection()) { - return true; - } - } - - return false; - } - - /** - * @psalm-return non-empty-list - */ - public function types(): array - { - return $this->types; - } - - /** - * @throws RuntimeException - */ - private function ensureMinimumOfTwoTypes(Type ...$types): void - { - if (count($types) < 2) { - throw new RuntimeException( - 'A union type must be composed of at least two types' - ); - } - } - - /** - * @throws RuntimeException - */ - private function ensureOnlyValidTypes(Type ...$types): void - { - foreach ($types as $type) { - if ($type instanceof UnknownType) { - throw new RuntimeException( - 'A union type must not be composed of an unknown type' - ); - } - - if ($type instanceof VoidType) { - throw new RuntimeException( - 'A union type must not be composed of a void type' - ); - } - } - } -} diff --git a/vendor/sebastian/type/src/type/UnknownType.php b/vendor/sebastian/type/src/type/UnknownType.php deleted file mode 100644 index dc27440..0000000 --- a/vendor/sebastian/type/src/type/UnknownType.php +++ /dev/null @@ -1,41 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Type; - -final class UnknownType extends Type -{ - public function isAssignable(Type $other): bool - { - return true; - } - - public function name(): string - { - return 'unknown type'; - } - - public function asString(): string - { - return ''; - } - - public function allowsNull(): bool - { - return true; - } - - /** - * @psalm-assert-if-true UnknownType $this - */ - public function isUnknown(): bool - { - return true; - } -} diff --git a/vendor/sebastian/type/src/type/VoidType.php b/vendor/sebastian/type/src/type/VoidType.php deleted file mode 100644 index f740fe2..0000000 --- a/vendor/sebastian/type/src/type/VoidType.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Type; - -final class VoidType extends Type -{ - public function isAssignable(Type $other): bool - { - return $other instanceof self; - } - - public function name(): string - { - return 'void'; - } - - public function allowsNull(): bool - { - return false; - } - - /** - * @psalm-assert-if-true VoidType $this - */ - public function isVoid(): bool - { - return true; - } -} diff --git a/vendor/sebastian/version/ChangeLog.md b/vendor/sebastian/version/ChangeLog.md deleted file mode 100644 index f589eb9..0000000 --- a/vendor/sebastian/version/ChangeLog.md +++ /dev/null @@ -1,43 +0,0 @@ -# ChangeLog - -All notable changes are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. - -## [4.0.1] - 2023-02-07 - -### Fixed - -* [#17](https://github.com/sebastianbergmann/version/pull/17): Release archive contains unnecessary assets - -## [4.0.0] - 2023-02-03 - -### Changed - -* `Version::getVersion()` has been renamed to `Version::asString()` - -### Removed - -* This component is no longer supported on PHP 7.3, PHP 7.4, and PHP 8.0 - -## [3.0.2] - 2020-09-28 - -### Changed - -* Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` - -## [3.0.1] - 2020-06-26 - -### Added - -* This component is now supported on PHP 8 - -## [3.0.0] - 2020-01-21 - -### Removed - -* This component is no longer supported on PHP 7.1 and PHP 7.2 - -[4.0.1]: https://github.com/sebastianbergmann/version/compare/4.0.0...4.0.1 -[4.0.0]: https://github.com/sebastianbergmann/version/compare/3.0.2...4.0.0 -[3.0.2]: https://github.com/sebastianbergmann/version/compare/3.0.1...3.0.2 -[3.0.1]: https://github.com/sebastianbergmann/version/compare/3.0.0...3.0.1 -[3.0.0]: https://github.com/sebastianbergmann/version/compare/2.0.1...3.0.0 diff --git a/vendor/sebastian/version/LICENSE b/vendor/sebastian/version/LICENSE deleted file mode 100644 index 2a4db82..0000000 --- a/vendor/sebastian/version/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2013-2023, Sebastian Bergmann -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/sebastian/version/README.md b/vendor/sebastian/version/README.md deleted file mode 100644 index 6135788..0000000 --- a/vendor/sebastian/version/README.md +++ /dev/null @@ -1,50 +0,0 @@ -[![Latest Stable Version](https://poser.pugx.org/sebastian/version/v/stable.png)](https://packagist.org/packages/sebastian/version) - -# sebastian/version - -**sebastian/version** is a library that helps with managing the version number of Git-hosted PHP projects. - -## Installation - -You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - -``` -composer require sebastian/version -``` - -If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - -``` -composer require --dev sebastian/version -``` -## Usage - -The constructor of the `SebastianBergmann\Version` class expects two parameters: - -* `$release` is the version number of the latest release (`X.Y.Z`, for instance) or the name of the release series (`X.Y`) when no release has been made from that branch / for that release series yet. -* `$path` is the path to the directory (or a subdirectory thereof) where the sourcecode of the project can be found. Simply passing `__DIR__` here usually suffices. - -Apart from the constructor, the `SebastianBergmann\Version` class has a single public method: `asString()`. - -Here is a contrived example that shows the basic usage: - -```php -asString()); -``` -``` -string(18) "1.0.0-17-g00f3408" -``` - -When a new release is prepared, the string that is passed to the constructor as the first argument needs to be updated. - -### How SebastianBergmann\Version::asString() works - -* If `$path` is not (part of) a Git repository and `$release` is in `X.Y.Z` format then `$release` is returned as-is. -* If `$path` is not (part of) a Git repository and `$release` is in `X.Y` format then `$release` is returned suffixed with `-dev`. -* If `$path` is (part of) a Git repository and `$release` is in `X.Y.Z` format then the output of `git describe --tags` is returned as-is. -* If `$path` is (part of) a Git repository and `$release` is in `X.Y` format then a string is returned that begins with `X.Y` and ends with information from `git describe --tags`. diff --git a/vendor/sebastian/version/SECURITY.md b/vendor/sebastian/version/SECURITY.md deleted file mode 100644 index d4ee967..0000000 --- a/vendor/sebastian/version/SECURITY.md +++ /dev/null @@ -1,9 +0,0 @@ -# Security Policy - -This library is intended to be used in development environments only. For instance, it is used by the testing framework PHPUnit. There is no reason why this library should be installed on a webserver. - -**If you upload this library to a webserver then your deployment process is broken. On a more general note, if your `vendor` directory is publicly accessible on your webserver then your deployment process is also broken.** - -## Security Contact Information - -After the above, if you still would like to report a security vulnerability, please email `sebastian@phpunit.de`. diff --git a/vendor/sebastian/version/composer.json b/vendor/sebastian/version/composer.json deleted file mode 100644 index 1215a32..0000000 --- a/vendor/sebastian/version/composer.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "sebastian/version", - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "support": { - "issues": "https://github.com/sebastianbergmann/version/issues" - }, - "config": { - "platform": { - "php": "8.1.0" - }, - "optimize-autoloader": true, - "sort-packages": true - }, - "prefer-stable": true, - "require": { - "php": ">=8.1" - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - } -} diff --git a/vendor/sebastian/version/src/Version.php b/vendor/sebastian/version/src/Version.php deleted file mode 100644 index 4b7c858..0000000 --- a/vendor/sebastian/version/src/Version.php +++ /dev/null @@ -1,93 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann; - -use function end; -use function explode; -use function fclose; -use function is_dir; -use function is_resource; -use function proc_close; -use function proc_open; -use function stream_get_contents; -use function substr_count; -use function trim; - -final class Version -{ - private readonly string $version; - - public function __construct(string $release, string $path) - { - $this->version = $this->generate($release, $path); - } - - public function asString(): string - { - return $this->version; - } - - private function generate(string $release, string $path): string - { - if (substr_count($release, '.') + 1 === 3) { - $version = $release; - } else { - $version = $release . '-dev'; - } - - $git = $this->getGitInformation($path); - - if (!$git) { - return $version; - } - - if (substr_count($release, '.') + 1 === 3) { - return $git; - } - - $git = explode('-', $git); - - return $release . '-' . end($git); - } - - private function getGitInformation(string $path): bool|string - { - if (!is_dir($path . DIRECTORY_SEPARATOR . '.git')) { - return false; - } - - $process = proc_open( - 'git describe --tags', - [ - 1 => ['pipe', 'w'], - 2 => ['pipe', 'w'], - ], - $pipes, - $path - ); - - if (!is_resource($process)) { - return false; - } - - $result = trim(stream_get_contents($pipes[1])); - - fclose($pipes[1]); - fclose($pipes[2]); - - $returnCode = proc_close($process); - - if ($returnCode !== 0) { - return false; - } - - return $result; - } -} diff --git a/vendor/squizlabs/php_codesniffer/CHANGELOG.md b/vendor/squizlabs/php_codesniffer/CHANGELOG.md deleted file mode 100644 index 174a7cc..0000000 --- a/vendor/squizlabs/php_codesniffer/CHANGELOG.md +++ /dev/null @@ -1,8138 +0,0 @@ -# Changelog - -The file documents changes to the PHP_CodeSniffer project. - -## [Unreleased] - -_Nothing yet._ - -## [3.13.5] - 2025-11-04 - -### Added -- Runtime support for PHP 8.5. All known PHP 8.5 deprecation notices have been fixed. - - Syntax support for new PHP 8.5 features will follow in a future release. - - If you find any PHP 8.5 deprecation notices which were missed, please report them. - -### Changed -- Various housekeeping, including improvements to the tests and documentation. - - Thanks to [Rodrigo Primo][@rodrigoprimo] and [Juliette Reinders Folmer][@jrfnl] for their contributions. - -### Fixed -- Fixed bug [#1216]: Tokenizer/PHP: added more defensive coding to prevent PHP 8.5 "Using null as an array offset" deprecation notices. - - Thanks to [Andrew Lyons][@andrewnicols] for the patch. -- Fixed bug [#1279]: Tokenizer/PHP: on PHP < 8.0, an unclosed attribute (parse error) could end up removing some tokens from the token stream. - - This could lead to false positives and false negative from sniffs, but could also lead to incorrect fixes being made mangling the file under scan. - - Thanks to [Juliette Reinders Folmer](https://github.com/jrfnl) for the patch. - -### Other -- Please be aware that the `master` branch has been renamed to `3.x` and the default branch has changed to the `4.x` branch. - - If you contribute to PHP_CodeSniffer, you will need to update your local git clone. - - If you develop against PHP_CodeSniffer and run your tests against dev branches of PHPCS, you will need to update your workflows. - -[#1216]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/1216 -[#1279]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/1279 - - -## [3.13.4] - 2025-09-05 - -### Fixed -- Fixed bug [#1213]: ability to run tests for external standards using the PHPCS native test framework was broken. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#1214]: PHP 8.5 "Using null as an array offset" deprecation notices. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. - -[#1213]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/1213 -[#1214]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/1214 - - -## [3.13.3] - 2025-09-04 - -### Added -- Tokenizer support for PHP 8.4 dereferencing of new expressions without wrapping parentheses. [#1160] - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Tokenizer support for PHP 8.4 `abstract` properties. [#1183] - - The `File::getMemberProperties()` method now also supports `abstract` properties through a new `is_abstract` array index in the return value. [#1184] - - Additionally, the following sniffs have been updated to support `abstract` properties: - - Generic.PHP.LowerCaseConstant [#1185] - - Generic.PHP.UpperCaseConstant [#1185] - - PSR2.Classes.PropertyDeclaration [#1188] - - Squiz.Commenting.VariableComment [#1186] - - Squiz.WhiteSpace.MemberVarSpacing [#1187] - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patches -- Tokenizer support for the PHP 8.4 "exit as a function call" change. [#1201] - - When `exit`/`die` is used as a fully qualified "function call", it will now be tokenized as `T_NS_SEPARATOR` + `T_EXIT`. - - Additionally, the following sniff has been updated to handle fully qualified exit/die correctly: - - Squiz.PHP.NonExecutableCode - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patches - -### Changed -- Tokenizer/PHP: fully qualified `true`/`false`/`null` will now be tokenized as `T_NS_SEPARATOR` + `T_TRUE`/`T_FALSE`/`T_NULL`. [#1201] - - Previously, these were tokenized as `T_NS_SEPARATOR` + `T_STRING`. - - Additionally, the following sniffs have been updated to handle fully qualified true/false/null correctly: - - Generic.CodeAnalysis.UnconditionalIfStatement - - Generic.ControlStructures.DisallowYodaConditions - - PEAR.Functions.ValidDefaultValue - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patches. -- Generic.PHP.Syntax: the sniff is now able to scan input provided via STDIN on non-Windows OSes. [#915] - - Thanks to [Rodrigo Primo][@rodrigoprimo] for the patch. -- PSR2.ControlStructures.SwitchDeclaration: the `WrongOpener*` error code is now auto-fixable if the identified "wrong opener" is a semi-colon. [#1161] - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- The PSR2.Classes.PropertyDeclaration will now check that the abstract modifier keyword is placed before a visibility keyword. [#1188] - - Errors will be reported via a new `AbstractAfterVisibility` error code. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Various housekeeping, including improvements to the tests and documentation. - - Thanks to [Bernhard Zwein][@benno5020], [Rick Kerkhof][@NanoSector], [Rodrigo Primo][@rodrigoprimo] and [Juliette Reinders Folmer][@jrfnl] for their contributions. - -### Fixed -- Fixed bug [#1112] : `--parallel` option fails if PHP_CodeSniffer is invoked via bash and the invokation creates a non-PHPCS-managed process. - - Thanks to [Rick Kerkhof][@NanoSector] for the patch. -- Fixed bug [#1113] : fatal error when the specified "files to scan" would result in the same file being added multiple times to the queue. - - This error only occured when `--parallel` scanning was enabled. - - Thanks to [Rodrigo Primo][@rodrigoprimo] for the patch. -- Fixed bug [#1154] : PEAR.WhiteSpace.ObjectOperatorIndent: false positive when checking multiple chained method calls in a multidimensional array. - - Thanks to [Rodrigo Primo][@rodrigoprimo] for the patch. -- Fixed bug [#1193] : edge case inconsistency in how empty string array keys for sniff properties are handled. - - Thanks to [Rodrigo Primo][@rodrigoprimo] and [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#1197] : Squiz.Commenting.FunctionComment: return types containing a class name with underscores would be truncated leading to incorrect results. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. - -### Other -- The [Wiki documentation] is now publicly editable. :tada: - - Update proposals can be submittted by opening a pull request in the [PHPCSStandards/PHP_CodeSniffer-documentation][docs-repo] repository. - Contributions welcome ! - - Thanks to [Anna Filina][@afilina], [Dan Wallis][@fredden] and [Juliette Reinders Folmer][@jrfnl] for their work on getting this set up. -- The [Phar website] has had a facelift. [#107] - - Thanks to [Bernhard Zwein][@benno5020] for making this happen! - -[Wiki documentation]: https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki -[docs-repo]: https://github.com/PHPCSStandards/PHP_CodeSniffer-documentation -[Phar website]: https://phars.phpcodesniffer.com/ - -[#107]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/107 -[#915]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/915 -[#1112]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/1112 -[#1113]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/1113 -[#1154]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/1154 -[#1160]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/1160 -[#1161]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/1161 -[#1183]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/1183 -[#1184]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/1184 -[#1185]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/1185 -[#1186]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/1186 -[#1187]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/1187 -[#1188]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/1188 -[#1193]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/1193 -[#1197]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/1197 -[#1201]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/1201 - - -## [3.13.2] - 2025-06-18 - -### Changed -- The documentation for the following sniffs has been improved: - - Squiz.Classes.SelfMemberReference - - Thanks to [Rodrigo Primo][@rodrigoprimo] for the patch. -- Various housekeeping, including improvements to the tests and documentation. - - Thanks to [Rodrigo Primo][@rodrigoprimo] and [Juliette Reinders Folmer][@jrfnl] for their contributions. - -### Fixed -- Fixed bug [#1135] : Squiz.Functions.FunctionDeclarationArgumentSpacing: typo in new error code `SpacingAfterSetVis\[i\]bility`. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. - -[#1135]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/1135 - - -## [3.13.1] - 2025-06-13 - -### Added -- Added support for PHP 8.4 properties with asymmetric visibility to File::getMemberProperties() through a new `set_scope` array index in the return value. [#1116] - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patches. -- Added support for PHP 8.4 (constructor promoted) properties with asymmetric visibility to File::getMethodParameters() through new `set_visibility` and `set_visibility_token` array indexes in the return value. [#1116] - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patches. -- Added support for PHP 8.4 asymmetric visibility modifiers to the following sniffs: - - Generic.PHP.LowerCaseKeyword [#1117] - - PEAR.NamingConventions.ValidVariableName [#1118] - - PSR2.Classes.PropertyDeclaration [#1119] - - Squiz.Commenting.BlockComment [#1120] - - Squiz.Commenting.DocCommentAlignment [#1120] - - Squiz.Commenting.VariableComment [#1120] - - Squiz.Functions.FunctionDeclarationArgumentSpacing [#1121] - - Squiz.Scope.MemberVarScope [#1122] - - Squiz.WhiteSpace.MemberVarSpacing [#1123] - - Squiz.WhiteSpace.ScopeKeywordSpacing [#1124] - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patches. - -### Changed -- The PSR2.Classes.PropertyDeclaration will now check that a set-visibility modifier keyword is placed after a potential general visibility keyword. [#1119] - - Errors will be reported via a new `AvizKeywordOrder` error code. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- The Squiz.Functions.FunctionDeclarationArgumentSpacing will now check spacing after a set-visibility modifier keyword. [#1121] - - Errors will be reported via a new `SpacingAfterSetVisibility` error code. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- The Squiz.Scope.MemberVarScope will now flag missing "read" visibility, when "write" visibility is set, under a separate error code `AsymReadMissing`. [#1122] - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- The documentation for the following sniffs has been improved: - - PEAR.Classes.ClassDeclaration - - Squiz.WhiteSpace.FunctionOpeningBraceSpace - - Thanks to [Brian Dunne][@braindawg] and [Rodrigo Primo][@rodrigoprimo] for the patches. -- Various housekeeping, including improvements to the tests and documentation. - - Thanks to [Dan Wallis][@fredden], [Rodrigo Primo][@rodrigoprimo] and [Juliette Reinders Folmer][@jrfnl] for their contributions. - -### Other -- The latest PHP_CodeSniffer XSD file is now available via the following permalink: . [#1094] - Older XSD files can be referenced via permalinks based on their minor: `https://schema.phpcodesniffer.com/#.#/phpcs.xsd`. -- The GPG signature for the PHAR files has been rotated. The new fingerprint is: D91D86963AF3A29B6520462297B02DD8E5071466. - -[#1094]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/1094 -[#1116]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/1116 -[#1117]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/1117 -[#1118]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/1118 -[#1119]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/1119 -[#1120]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/1120 -[#1121]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/1121 -[#1122]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/1122 -[#1123]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/1123 -[#1124]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/1124 - - -## [3.13.0] - 2025-05-11 - -### Added -- Added support for PHP 8.4 asymmetric visibility modifiers to the tokenizer. [#871] - - Thanks to [Daniel Scherzer][@DanielEScherzer] for the patch. -- Added support for PHP 8.4 `final` properties to the following sniffs: - - PSR2.Classes.PropertyDeclaration [#950] - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patches. - -### Changed -- Generic.WhiteSpace.LanguageConstructSpacing: will now also check the spacing after the `goto` language construct keyword. [#917] - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- The PSR2.Classes.PropertyDeclaration will now check that the `final` modifier keyword is placed before a visibility keyword. [#950] - - Errors will be reported via a new `FinalAfterVisibility` error code. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Improved Help information about the `--reports` CLI flag. [#1078] - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- The documentation for the following sniffs has been improved: - - PSR1.Files.SideEffects - - PSR2.ControlStructures.SwitchDeclaration - - PSR2.Namespaces.NamespaceDeclaration - - Thanks to [Rodrigo Primo][@rodrigoprimo] for the patches. -- Various housekeeping, including improvements to the tests and documentation. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for their contributions. - -### Deprecated - -- Nearly everything which was soft deprecated before is now hard deprecated and will show deprecation notices: - - This applies to: - - All sniffs which will be removed in 4.0. [#888] - - The deprecated Generator methods. [#889] - - The old array property setting format (via comma separated strings). [#890] - - Sniffs not implementing the `PHP_CodeSniffer\Sniffs\Sniff` interface. [#891] - - Sniffs not following the naming conventions. [#892] - - Standards called Internal. [#893] - - Sniffs which don't listen for PHP, like JS/CSS specific sniffs. [#894] - - The deprecation notices can be silenced by using the `-q` (=quiet) CLI flag. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patches. - -### Fixed -- Fixed bug [#1040] : Generic.Strings.UnnecessaryHeredoc - false positive for heredocs containing escape sequences. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#1040] : Generic.Strings.UnnecessaryHeredoc - fixer would not clean up escape sequences which aren't necessary in nowdocs. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#1048] : A file under scan would sometimes be updated with partial fixes, even though the file "failed to fix". - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. - -### Other -**Calling all testers!** - -The first beta release for PHP_CodeSniffer 4.0 has been tagged. Please help by testing the beta release and reporting any issues you run into. -Upgrade guides for both [ruleset maintainers/end-users][wiki-upgrade-guide-users-40], as well as for [sniff developers and integrators][wiki-upgrade-guide-devs-40], have been published to the Wiki to help smooth the transition. - -[wiki-upgrade-guide-users-40]: https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki/Version-4.0-User-Upgrade-Guide -[wiki-upgrade-guide-devs-40]: https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki/Version-4.0-Developer-Upgrade-Guide - -[#871]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/871 -[#888]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/888 -[#889]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/889 -[#890]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/890 -[#891]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/891 -[#892]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/892 -[#893]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/893 -[#894]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/894 -[#917]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/917 -[#950]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/950 -[#1040]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/1040 -[#1048]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/1048 -[#1078]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/1078 - -## [3.12.2] - 2025-04-13 - -### Added -- Added support for PHP 8.4 `final` properties to the following sniffs: - - Generic.PHP.LowerCaseConstant [#948] - - Generic.PHP.UpperCaseConstant [#948] - - Squiz.Commenting.DocCommentAlignment [#951] - - Squiz.Commenting.VariableComment [#949] - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patches. - -### Changed -- Tokenizer/PHP: a PHP open tag at the very end of a file will now always be tokenized as T_OPEN_TAG, independently of the PHP version. [#937] - - Previously, a PHP open tag at the end of a file was not tokenized as an open tag on PHP < 7.4 and the tokenization would depend on the `short_open_tag` setting. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- PEAR.Commenting.FunctionComment: improved message for "blank lines between docblock and declaration" check. [#830] -- The documentation for the following sniffs has been improved: - - Generic.Functions.OpeningFunctionBraceBsdAllman - - Generic.Functions.OpeningFunctionBraceKernighanRitchie - - Generic.WhiteSpace.LanguageConstructSpacing - - Thanks to [Rodrigo Primo][@rodrigoprimo] for the patches. -- Various housekeeping, including improvements to the tests and documentation. - - Thanks to [Rodrigo Primo][@rodrigoprimo] and [Juliette Reinders Folmer][@jrfnl] for their contributions. - -### Fixed -- Fixed bug [#830] : PEAR.Commenting.FunctionComment will no longer remove blank lines within attributes. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#929] : Generic.PHP.ForbiddenFunctions: prevent false positives/negatives for code interlaced with comments. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#934] : Generic.PHP.LowerCaseConstant and Generic.PHP.UpperCaseConstant will now correctly ignore DNF types for properties. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#936] : Squiz.Commenting.FunctionCommentThrowTag: sniff would bow out when function has attributes attached, leading to false negatives. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#940] : Squiz.Commenting.VariableComment: false positive for missing docblock for properties using DNF types. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#944] : Squiz.Commenting.FunctionComment did not support DNF/intersection types in `@param` tags. - - Thanks to [Jeffrey Angenent][@devfrey] for the patch. -- Fixed bug [#945] : Squiz.WhiteSpace.FunctionSpacing would get confused when there are two docblocks above a function declaration. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#947] : Squiz.Commenting.FunctionCommentThrowTag: prevent false positives/negatives for code interlaced with comments. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#951] : Squiz.Commenting.DocCommentAlignment did not examine docblocks for `final` classes. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#955] : Potential race condition, leading to a fatal error, when both the `Diff` + the `Code` reports are requested and caching is on. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#956] : Generic.WhiteSpace.ScopeIndent: undefined array index notice when running in debug mode. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. - -[#830]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/830 -[#929]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/929 -[#934]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/934 -[#936]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/936 -[#937]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/937 -[#940]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/940 -[#944]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/944 -[#945]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/945 -[#947]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/947 -[#948]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/948 -[#949]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/949 -[#951]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/951 -[#955]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/955 -[#956]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/956 - -## [3.12.1] - 2025-04-04 - -### Added -- Documentation for the following sniffs: - - Squiz.Commenting.BlockComment - - Thanks to [Colin Stewart][@costdev] for the patch. - -### Changed -- Generic.WhiteSpace.HereNowdocIdentifierSpacing: improved error message text. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Various housekeeping, including improvements to the tests and documentation. - - Thanks to [Rodrigo Primo][@rodrigoprimo] and [Juliette Reinders Folmer][@jrfnl] for their contributions. - -### Deprecated -- The `Generic.Functions.CallTimePassByReference` sniff. See [#921]. - - This sniff will be removed in version 4.0.0. - -### Fixed -- Fixed bug [#906] : Fixer: prevent `InvalidArgumentException`s when displaying verbose information. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#907] : Tokenizer/PHP: tokenization of tokens related to union, intersection and DNF types in combination with PHP 8.4 final properties. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#908] : Tokenizer/PHP: tokenization of `?` in nullable types for readonly properties. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#916] : Tokenizer/PHP: `goto` was not recognized as a terminating statement for a case/default in a switch control structure. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. - -### Other -- PHP_CodeSniffer 4.0 is coming soon! Interested in a sneak peek ? Join the live stream at any time on April 14, 15, 17 or 18. - Read the open invitation ([#924]) for all the details. - -[#906]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/906 -[#907]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/907 -[#908]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/908 -[#916]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/916 -[#921]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/921 -[#924]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/924 - -## [3.12.0] - 2025-03-18 - -### Added -- Added support for PHP 8.4 `final` properties to File::getMemberProperties() through a new `is_final` array index in the return value. [#834] - - Thanks to [Daniel Scherzer][@DanielEScherzer] for the patch. -- Generators/HTML: each section title now has a unique anchor link, which can be copied when hovering over a title. [#859] - - This should make sharing a link to a specific section of the documentation more straight-forward. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Documentation for the following sniffs: - - Squiz.Classes.ClassFileName - - Squiz.Classes.ValidClassName - - Thanks to [Brian Dunne][@braindawg] for the patches. - -### Changed -- PHPCBF: the messaging when no fixable errors are found will now distinguish between "No violations" (at all) versus "No fixable errors". [#806] - - Thanks to [Peter Wilson][@peterwilsoncc] for the patch. -- The `-h` (Help) option now contains a more extensive list of "config" options which can be set. [#809] - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Improved error message when invalid sniff codes are supplied to `--sniffs` or `--exclude` command line arguments. [#344] - - Thanks to [Dan Wallis][@fredden] for the patch. -- Improved error message when an invalid generator name is supplied to the `--generator` command line argument. [#709], [#771] - - The generator name will now also always be handled case-insensitively, independently of the OS used. - - Thanks to [Rodrigo Primo][@rodrigoprimo] for the patch. -- The user will be shown an informative error message for sniffs missing one of the required methods. [#873] - - Previously this would result in a fatal error. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Ruleset processing will now be allowed to run to its conclusion - barring critical errors - before displaying all ruleset errors in one go. [#857] - - Previously an error in a ruleset would cause PHPCS to exit immediately and show only one error at a time. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Generators: XML documentation files which don't contain any actual documentation will now silently be ignored. [#755] - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Generators: when the `title` attribute is missing, the documentation generation will now fall back to the sniff name as the title. [#820] - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Generators: cleaner output based on the elements of the documentation which are available. [#819], [#821] - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Generators/HTML: improved display of code tables by using semantic HTML. [#854] - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Squiz.Classes.ClassFileName: recommend changing the file name instead of changing the class name. [#845] - - This prevents unactionable recommendations due to the file name not translating to a valid PHP symbol name. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Squiz.Functions.FunctionDeclarationArgumentSpacing: incorrect spacing after a comma followed by a promoted property has an improved error message and will now be flagged with the `SpacingBeforePropertyModifier` or `NoSpaceBeforePropertyModifier` error codes. [#792] - - This was previously already flagged, but using either the `SpacingBeforeHint` or `NoSpaceBeforeHint` error code, which was misleading. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Squiz.Functions.FunctionDeclarationArgumentSpacing: the sniff will now also check the spacing after property modifiers for promoted properties in constructor methods. [#792] - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Squiz.WhiteSpace.ScopeKeywordSpacing: the sniff will now also check the spacing after the `final` and `abstract` modifier keywords. [#604] - - Thanks to [Klaus Purer][@klausi] for the patch. -- The following sniff(s) have received efficiency improvements: - - Squiz.WhiteSpace.ScopeKeywordSpacing - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patches. -- Incorrectly set inline properties (in test case files) will be silently ignored again. [#884] - - This removes the `Internal.PropertyDoesNotExist` error code. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- The AbstractMethodUnitTest class will now flag duplicate test case markers in a test case file. [#773] - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Various housekeeping, including improvements to the tests and documentation. - - Thanks to [Asis Pattisahusiwa][@asispts], [Dan Wallis][@fredden], [Rodrigo Primo][@rodrigoprimo] and [Juliette Reinders Folmer][@jrfnl] for their contributions. - -### Deprecated -All deprecation are slated for removal in PHP_CodeSniffer 4.0. - -- Support for sniffs not implementing the PHPCS `Sniff` interface. See [#694]. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Support for including sniffs which don't comply with the PHPCS naming conventions (by referencing the sniff file directly). See [#689]. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Support for external standards named "Internal". See [#799]. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- The following Generator methods are now (soft) deprecated. See [#755]: - - `PHP_CodeSniffer\Generators\Text::printTitle()` in favour of `PHP_CodeSniffer\Generators\Text::getFormattedTitle()` - - `PHP_CodeSniffer\Generators\Text::printTextBlock()` in favour of `PHP_CodeSniffer\Generators\Text::getFormattedTextBlock()` - - `PHP_CodeSniffer\Generators\Text::printCodeComparisonBlock()` in favour of `PHP_CodeSniffer\Generators\Text::getFormattedCodeComparisonBlock()` - - `PHP_CodeSniffer\Generators\Markdown::printHeader()` in favour of `PHP_CodeSniffer\Generators\Markdown::getFormattedHeader()` - - `PHP_CodeSniffer\Generators\Markdown::printFooter()` in favour of `PHP_CodeSniffer\Generators\Markdown::getFormattedFooter()` - - `PHP_CodeSniffer\Generators\Markdown::printTextBlock()` in favour of `PHP_CodeSniffer\Generators\Markdown::getFormattedTextBlock()` - - `PHP_CodeSniffer\Generators\Markdown::printCodeComparisonBlock()` in favour of `PHP_CodeSniffer\Generators\Markdown::getFormattedCodeComparisonBlock()` - - `PHP_CodeSniffer\Generators\HTML::printHeader()` in favour of `PHP_CodeSniffer\Generators\HTML::getFormattedHeader()` - - `PHP_CodeSniffer\Generators\HTML::printToc()` in favour of `PHP_CodeSniffer\Generators\HTML::getFormattedToc()` - - `PHP_CodeSniffer\Generators\HTML::printFooter()` in favour of `PHP_CodeSniffer\Generators\HTML::getFormattedFooter()` - - `PHP_CodeSniffer\Generators\HTML::printTextBlock()` in favour of `PHP_CodeSniffer\Generators\HTML::getFormattedTextBlock()` - - `PHP_CodeSniffer\Generators\HTML::printCodeComparisonBlock()` in favour of `PHP_CodeSniffer\Generators\HTML::getFormattedCodeComparisonBlock()` - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. - -### Fixed -- Fixed bug [#794] : Generators: prevent fatal error when the XML documentation does not comply with the expected format. - - It is recommended to validate XML documentation files against the XSD file: - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#814] : Generic.NamingConventions.ConstructorName: prevent potential fatal errors during live coding. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#816] : File::getDeclarationName(): prevent incorrect result for unfinished closures during live coding. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#817] : Squiz.Classes.ValidClassName: ignore comments when determining the name to be validated. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#825] : Squiz.Classes.ClassDeclaration: false positives when the next thing after a class was a function with an attribute attached. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#826] : Squiz.WhiteSpace.FunctionSpacing: prevent incorrect some results when attributes are attached to a function. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#827] : PEAR.Functions.FunctionDeclaration: fixer conflict over an unfinished closure during live coding. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#828] : Squiz.WhiteSpace.MemberVarSpacing: allow for `readonly` properties. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#832] : Squiz.WhiteSpace.MemberVarSpacing: prevent potential fixer conflict during live coding. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#833] : Squiz.PHP.EmbeddedPhp: fixer conflict when a PHP open tag for a multi-line snippet is found on the same line as a single-line embedded PHP snippet. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#833] : Squiz.PHP.EmbeddedPhp: incorrect indent calculation in certain specific situations. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#835] : Generic.PHP.DisallowShortOpenTag: don't act on parse errors. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#838] : Squiz.PHP.EmbeddedPhp: no new line before close tag was incorrectly enforced when a preceding OO construct or function had a trailing comment after the close curly. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#840] : Squiz.WhiteSpace.MemberVarSpacing: more accurate reporting on blank lines in the property "pre-amble" (i.e. docblock, attributes). - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#845] : Squiz.Classes.ClassFileName: don't throw an incorrect error for an unfinished OO declaration during live coding. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#865] : Setting an array property to an empty array from an XML ruleset now works correctly. - - Previously, the property value would be set to `[0 => '']`. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#866] : Squiz.WhiteSpace.FunctionOpeningBraceSpace: XML docs were not accessible due to an issue with the file name. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. - -### Other -- A new [wiki page][wiki-about-standards] is available to clarify the difference between a project ruleset and an external standard. - - This wiki page also contains detailed information about the naming conventions external standards must comply with. -- A new [XMLLint validate][xmllint-validate] action runner is available which can be used in CI to validate rulesets for PHP_CodeSniffer against the XSD. - -[wiki-about-standards]: https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki/About-Standards-for-PHP_CodeSniffer -[xmllint-validate]: https://github.com/marketplace/actions/xmllint-validate - -[#344]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/344 -[#604]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/604 -[#689]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/689 -[#694]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/694 -[#709]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/709 -[#755]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/755 -[#771]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/771 -[#773]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/773 -[#792]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/792 -[#794]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/794 -[#799]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/799 -[#806]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/806 -[#809]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/809 -[#814]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/814 -[#816]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/816 -[#817]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/817 -[#819]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/819 -[#820]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/820 -[#821]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/821 -[#825]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/825 -[#826]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/826 -[#827]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/827 -[#828]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/828 -[#832]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/832 -[#833]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/833 -[#834]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/834 -[#835]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/835 -[#838]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/838 -[#840]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/840 -[#845]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/845 -[#854]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/854 -[#857]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/857 -[#859]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/859 -[#865]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/865 -[#866]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/866 -[#873]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/873 -[#884]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/884 - -## [3.11.3] - 2025-01-23 - -### Changed -- Generic.ControlStructures.InlineControlStructure no longer unnecessarily listens for T_SWITCH tokens. [#595] - - Thanks to [Rodrigo Primo][@rodrigoprimo] for the patch. -- Squiz.Functions.FunctionDeclarationArgumentSpacing: improvements to error message for `SpaceBeforeComma` error. [#783] - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- The following sniff(s) have received efficiency improvements: - - Squiz.Functions.FunctionDeclarationArgumentSpacing - - Thanks to [Dan Wallis][@fredden] and [Juliette Reinders Folmer][@jrfnl] for the patches. -- Various housekeeping, including improvements to the tests and documentation. - - Thanks to [Michał Bundyra][@michalbundyra], [Rodrigo Primo][@rodrigoprimo] and [Juliette Reinders Folmer][@jrfnl] for their contributions. - -### Fixed -- Fixed bug [#620] : Squiz.Functions.FunctionDeclarationArgumentSpacing: newlines after type will now be handled by the fixer. This also prevents a potential fixer conflict. - - Thanks to [Dan Wallis][@fredden] for the patch. -- Fixed bug [#782] : Tokenizer/PHP: prevent an "Undefined array key" notice during live coding for unfinished arrow functions. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#783] : Squiz.Functions.FunctionDeclarationArgumentSpacing: new line after reference token was not flagged nor fixed. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#783] : Squiz.Functions.FunctionDeclarationArgumentSpacing: new line after variadic token was not flagged nor fixed. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#783] : Squiz.Functions.FunctionDeclarationArgumentSpacing: new line before/after the equal sign for default values was not flagged nor fixed when `equalsSpacing` was set to `0`. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#783] : Squiz.Functions.FunctionDeclarationArgumentSpacing: fixer conflict when a new line is found before/after the equal sign for default values and `equalsSpacing` was set to `1`. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#783] : Squiz.Functions.FunctionDeclarationArgumentSpacing: fixer for spacing before/after equal sign could inadvertently remove comment. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#783] : Squiz.Functions.FunctionDeclarationArgumentSpacing: fixer will now handle comments between the end of a parameter and a comma more cleanly. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#784] : Squiz.WhiteSpace.FunctionSpacing: prevent fixer conflict when a multi-line docblock would start on the same line as the function close curly being examined. - - Thanks to [Klaus Purer][@klausi] for the patch - -[#595]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/595 -[#620]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/620 -[#782]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/782 -[#783]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/783 -[#784]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/784 - -## [3.11.2] - 2024-12-11 - -### Changed -- Generators/HTML + Markdown: the output will now be empty (no page header/footer) when there are no docs to display. [#687] - - This is in line with the Text Generator which already didn't produce output if there are no docs. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Generators/HTML: only display a Table of Contents when there is more than one sniff with documentation. [#697] - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Generators/HTML: improved handling of line breaks in `` blocks. [#723] - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Generators/Markdown: improved compatibility with the variety of available markdown parsers. [#722] - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Generators/Markdown: improved handling of line breaks in `` blocks. [#737] - - This prevents additional paragraphs from being displayed as code blocks. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Generic.NamingConventions.UpperCaseConstantName: the exact token containing the non-uppercase constant name will now be identified with more accuracy. [#665] - - Thanks to [Rodrigo Primo][@rodrigoprimo] for the patch. -- Generic.Functions.OpeningFunctionBraceKernighanRitchie: minor improvement to the error message wording. [#736] - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Various housekeeping, including improvements to the tests and documentation. - - Thanks to [Rodrigo Primo][@rodrigoprimo] and [Juliette Reinders Folmer][@jrfnl] for their contributions. - -### Fixed -- Fixed bug [#527] : Squiz.Arrays.ArrayDeclaration: short lists within a foreach condition should be ignored. - - Thanks to [Rodrigo Primo][@rodrigoprimo] for the patch. -- Fixed bug [#665] : Generic.NamingConventions.UpperCaseConstantName: false positives and false negatives when code uses unconventional spacing and comments when calling `define()`. - - Thanks to [Rodrigo Primo][@rodrigoprimo] for the patch. -- Fixed bug [#665] : Generic.NamingConventions.UpperCaseConstantName: false positive when a constant named `DEFINE` is encountered. - - Thanks to [Rodrigo Primo][@rodrigoprimo] for the patch. -- Fixed bug [#665] : Generic.NamingConventions.UpperCaseConstantName: false positive for attribute class called `define`. - - Thanks to [Rodrigo Primo][@rodrigoprimo] for the patch. -- Fixed bug [#665] : Generic.NamingConventions.UpperCaseConstantName: false positive when handling the instantiation of a class named `define`. - - Thanks to [Rodrigo Primo][@rodrigoprimo] for the patch. -- Fixed bug [#688] : Generators/Markdown could leave error_reporting in an incorrect state. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#698] : Generators/Markdown : link in the documentation footer would not parse as a link. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#738] : Generators/Text: stray blank lines after code sample titles. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#739] : Generators/HTML + Markdown: multi-space whitespace within a code sample title was folded into a single space. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. - -[#527]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/527 -[#665]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/665 -[#687]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/687 -[#688]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/688 -[#697]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/697 -[#698]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/698 -[#722]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/722 -[#723]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/723 -[#736]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/736 -[#737]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/737 -[#738]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/738 -[#739]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/739 - -## [3.11.1] - 2024-11-16 - -### Changed -- Output from the `--generator=...` feature will respect the OS-expected EOL char in more places. [#671] - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Various housekeeping, including improvements to the tests and documentation. - - Thanks to [Bartosz Dziewoński][@MatmaRex] and [Juliette Reinders Folmer][@jrfnl] for their contributions. - -### Fixed -- Fixed bug [#674] : Generic.WhiteSpace.HereNowdocIdentifierSpacing broken XML documentation - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Fixed bug [#675] : InvalidArgumentException when a ruleset includes a sniff by file name and the included sniff does not comply with the PHPCS naming conventions. - - Notwithstanding this fix, it is strongly recommended to ensure custom sniff classes comply with the PHPCS naming conventions. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. - -[#671]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/671 -[#674]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/674 -[#675]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/675 - -## [3.11.0] - 2024-11-12 - -### Added -- Runtime support for PHP 8.4. All known PHP 8.4 deprecation notices have been fixed. - - Syntax support for new PHP 8.4 features will follow in a future release. - - If you find any PHP 8.4 deprecation notices which were missed, please report them. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patches. -- Tokenizer support for PHP 8.3 "yield from" expressions with a comment between the keywords. [#529], [#647] - - Sniffs explicitly handling T_YIELD_FROM tokens may need updating. The PR description contains example code for use by sniff developers. - - Additionally, the following sniff has been updated to support "yield from" expressions with comments: - - Generic.WhiteSpace.LanguageConstructSpacing - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- New `Generic.WhiteSpace.HereNowdocIdentifierSpacing` sniff. [#586], [#637] - - Forbid whitespace between the `<<<` and the identifier string in heredoc/nowdoc start tokens. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- New `Generic.Strings.UnnecessaryHeredoc` sniff. [#633] - - Warns about heredocs without interpolation or expressions in the body text and can auto-fix these to nowdocs. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Documentation for the following sniffs: - - Generic.Arrays.ArrayIndent - - Squiz.PHP.Heredoc - - Thanks to [Rodrigo Primo][@rodrigoprimo] and [Juliette Reinders Folmer][@jrfnl] for the patches. - -### Changed -- The Common::getSniffCode() method will now throw an InvalidArgumentException exception if an invalid `$sniffClass` is passed. [#524], [#625] - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Documentation generated using the `--generator=...` feature will now always be presented in natural order based on the sniff name(s). [#668] - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Minor improvements to the display of runtime information. [#658] - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Squiz.Commenting.PostStatementComment: trailing annotations in PHP files will now be reported under a separate, non-auto-fixable error code `AnnotationFound`. [#560], [#627] - - This prevents (tooling related) annotations from taking on a different meaning when moved by the fixer. - - The separate error code also allows for selectively excluding it to prevent the sniff from triggering on trailing annotations, while still forbidding other trailing comments. - - Thanks to [Rodrigo Primo][@rodrigoprimo] for the patch. -- Squiz.ControlStructures.ForEachLoopDeclaration: the `SpacingAfterOpen` error code has been replaced by the `SpaceAfterOpen` error code. The latter is a pre-existing code. The former appears to have been a typo. [#582] - - Thanks to [Dan Wallis][@fredden] for the patch. -- The following sniff(s) have received efficiency improvements: - - Generic.Classes.DuplicateClassName - - Generic.NamingConventions.ConstructorName - - Thanks to [Rodrigo Primo][@rodrigoprimo] and [Juliette Reinders Folmer][@jrfnl] for the patches. -- Various housekeeping, including improvements to the tests and documentation. - - Thanks to [Rodrigo Primo][@rodrigoprimo] and [Juliette Reinders Folmer][@jrfnl] for their contributions. - -### Fixed -- Fixed bug [#3808][sq-3808] : Generic.WhiteSpace.ScopeIndent would throw false positive for tab indented multi-token yield from expression. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#630] : The tokenizer could inadvertently transform "normal" parentheses to DNF parentheses, when a function call was preceded by a switch-case / alternative syntax control structure colon. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#645] : On PHP 5.4, if yield was used as the declaration name for a function declared to return by reference, the function name would incorrectly be tokenized as T_YIELD instead of T_STRING. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#647] : Tokenizer not applying tab replacement in single token "yield from" keywords. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#647] : Generic.WhiteSpace.DisallowSpaceIndent did not flag space indentation in multi-line yield from. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#647] : Generic.WhiteSpace.DisallowTabIndent did not flag tabs inside yield from. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#652] : Generic.NamingConventions.ConstructorName: false positives for PHP-4 style calls to PHP-4 style parent constructor when a method with the same name as the parent class was called on another class. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#652] : Generic.NamingConventions.ConstructorName: false negatives for PHP-4 style calls to parent constructor for function calls with whitespace and comments in unconventional places. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#653] : Generic.Classes.DuplicateClassName : the sniff did not skip namespace keywords used as operators, which could lead to false positives. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#653] : Generic.Classes.DuplicateClassName : sniff going into an infinite loop during live coding. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#653] : Generic.Classes.DuplicateClassName : false positives/negatives when a namespace declaration contained whitespace or comments in unconventional places. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#653] : Generic.Classes.DuplicateClassName : namespace for a file going in/out of PHP was not remembered/applied correctly. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch - -[sq-3808]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3808 -[#524]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/524 -[#529]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/529 -[#560]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/560 -[#582]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/582 -[#586]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/586 -[#625]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/625 -[#627]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/627 -[#630]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/630 -[#633]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/633 -[#637]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/637 -[#645]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/645 -[#647]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/647 -[#652]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/652 -[#653]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/653 -[#658]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/658 -[#668]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/668 - -## [3.10.3] - 2024-09-18 - -### Changed -- Various housekeeping, including improvements to the tests and documentation. - - Thanks to [Rodrigo Primo][@rodrigoprimo] and [Juliette Reinders Folmer][@jrfnl] for their contributions. - -### Fixed -- Fixed bug [#553] : Squiz.Classes.SelfMemberReference: false negative(s) when namespace operator was encountered between the namespace declaration and the OO declaration. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#579] : AbstractPatternSniff: potential PHP notice during live coding. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#580] : Squiz.Formatting.OperatorBracket: potential PHP notice during live coding. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#581] : PSR12.ControlStructures.ControlStructureSpacing: prevent fixer conflict by correctly handling multiple empty newlines before the first condition in a multi-line control structure. - - Thanks to [Dan Wallis][@fredden] for the patch. -- Fixed bug [#585] : Tokenizer not applying tab replacement in heredoc/nowdoc openers. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#588] : Squiz.PHP.EmbeddedPhp false positive when checking spaces after a PHP short open tag. - - Thanks to [Rodrigo Primo][@rodrigoprimo] for the patch. -- Fixed bug [#597] : Generic.PHP.LowerCaseKeyword did not flag nor fix non-lowercase anonymous class keywords. - - Thanks to [Marek Štípek][@maryo] for the patch. -- Fixed bug [#598] : Squiz.PHP.DisallowMultipleAssignments: false positive on assignments to variable property on object stored in array. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#608] : Squiz.Functions.MultiLineFunctionDeclaration did not take (parameter) attributes into account when checking for one parameter per line. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch - -### Other -- The provenance of PHAR files associated with a release can now be verified via [GitHub Artifact Attestations][ghattest] using the [GitHub CLI tool][ghcli] with the following command: `gh attestation verify [phpcs|phpcbf].phar -o PHPCSStandards`. [#574] - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. - -[#553]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/553 -[#574]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/574 -[#579]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/579 -[#580]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/580 -[#581]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/581 -[#585]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/585 -[#588]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/588 -[#597]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/597 -[#598]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/598 -[#608]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/608 - -[ghcli]: https://cli.github.com/ -[ghattest]: https://docs.github.com/en/actions/how-tos/secure-your-work/use-artifact-attestations/use-artifact-attestations - -## [3.10.2] - 2024-07-22 - -### Changed -- The following sniff(s) have received efficiency improvements: - - Generic.Functions.FunctionCallArgumentSpacing - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- The array format of the information passed to the `Reports::generateFileReport()` method is now documented in the Reports interface. [#523] - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Various housekeeping, including improvements to the tests and documentation. - - Thanks to [Bill Ruddock][@biinari], [Dan Wallis][@fredden], [Klaus Purer][@klausi], [Rodrigo Primo][@rodrigoprimo] and [Juliette Reinders Folmer][@jrfnl] for their contributions. - -### Fixed -- Fixed bug [#513] : Generic.Functions.FunctionCallArgumentSpacing did not ignore the body of a match expressions passed as a function argument, which could lead to false positives. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#533] : Generic.WhiteSpace.DisallowTabIndent: tab indentation for heredoc/nowdoc closers will no longer be auto-fixed to prevent parse errors. The issue will still be reported. - - The error code for heredoc/nowdoc indentation using tabs has been made more specific - `TabsUsedHeredocCloser` - to allow for selectively excluding the indentation check for heredoc/nowdoc closers. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#534] : Generic.WhiteSpace.DisallowSpaceIndent did not report on space indentation for PHP 7.3 flexible heredoc/nowdoc closers. - - Closers using space indentation will be reported with a dedicated error code: `SpacesUsedHeredocCloser`. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#537] : Squiz.PHP.DisallowMultipleAssignments false positive for list assignments at the start of a new PHP block after an embedded PHP statement. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#551] : Squiz.PHP.DisallowMultipleAssignments prevent false positive for function parameters during live coding. - - Thanks to [Rodrigo Primo][@rodrigoprimo] for the patch. -- Fixed bug [#554] : Generic.CodeAnalysis.UselessOverridingMethod edge case false negative when the call to the parent method would end on a PHP close tag. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#555] : Squiz.Classes.SelfMemberReference edge case false negative when the namespace declaration would end on a PHP close tag. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch - -[#513]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/513 -[#523]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/523 -[#533]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/533 -[#534]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/534 -[#537]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/537 -[#551]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/551 -[#554]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/554 -[#555]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/555 - -## [3.10.1] - 2024-05-22 - -### Added -- Documentation for the following sniffs: - - Generic.Commenting.DocComment - - Thanks to [Rodrigo Primo][@rodrigoprimo] for the patch. - -### Changed -- The following have received efficiency improvements: - - Type handling in the PHP Tokenizer - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Various housekeeping, including improvements to the tests and documentation. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for their contributions. - -### Fixed -- Fixed bug [#110], [#437], [#475] : `File::findStartOfStatement()`: the start of statement/expression determination for tokens in parentheses/short array brackets/others scopes, nested within match expressions, was incorrect in most cases. - The trickle down effect of the bug fixes made to the `File::findStartOfStatement()` method, is that the Generic.WhiteSpace.ScopeIndent and the PEAR.WhiteSpace.ScopeIndent sniffs should now be able to correctly determine and fix the indent for match expressions containing nested expressions. - These fixes also fix an issue with the `Squiz.Arrays.ArrayDeclaration` sniff and possibly other, unreported bugs. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#504] : The tokenizer could inadvertently mistake the last parameter in a function call using named arguments for a DNF type. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#508] : Tokenizer/PHP: extra hardening against handling parse errors in the type handling layer. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch - -[#110]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/110 -[#437]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/437 -[#475]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/475 -[#504]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/504 -[#508]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/508 - -## [3.10.0] - 2024-05-20 - -### Added -- Tokenizer support for PHP 8.2 Disjunctive Normal Form (DNF) types. [#3731][sq-3731], [#387], [#461] - - Includes new `T_TYPE_OPEN_PARENTHESIS` and `T_TYPE_CLOSE_PARENTHESIS` tokens to represent the parentheses in DNF types. - - These new tokens, like other parentheses, will have the `parenthesis_opener` and `parenthesis_closer` token array indexes set and the tokens between them will have the `nested_parenthesis` index. - - The `File::getMethodProperties()`, `File::getMethodParameters()` and `File::getMemberProperties()` methods now all support DNF types. [#471], [#472], [#473] - - Additionally, the following sniff has been updated to support DNF types: - - Generic.PHP.LowerCaseType [#478] - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patches. -- Documentation for the following sniffs: - - Squiz.WhiteSpace.FunctionClosingBraceSpace - - Thanks to [Przemek Hernik][@przemekhernik] for the patch. - -### Changed -- The help screens have received a face-lift for improved usability and readability. [#447] - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch and thanks to [Colin Stewart][@costdev], [Gary Jones][@GaryJones] and [@mbomb007] for reviewing. -- The Squiz.Commenting.ClosingDeclarationComment sniff will now also examine and flag closing comments for traits. [#442] - - Thanks to [Rodrigo Primo][@rodrigoprimo] for the patch. -- The following sniff(s) have efficiency improvements: - - Generic.Arrays.ArrayIndent - - Thanks to [Rodrigo Primo][@rodrigoprimo] for the patch. -- The autoloader will now always return a boolean value indicating whether it has loaded a class or not. [#479] - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Various housekeeping, including improvements to the tests and documentation. - - Thanks to [Dan Wallis][@fredden], [Danny van der Sluijs][@DannyvdSluijs], [Rodrigo Primo][@rodrigoprimo] and [Juliette Reinders Folmer][@jrfnl] for their contributions. - -### Fixed -- Fixed bug [#466] : Generic.Functions.CallTimePassByReference was not flagging call-time pass-by-reference in class instantiations using the self/parent/static keywords. - - Thanks to [Rodrigo Primo][@rodrigoprimo] for the patch. -- Fixed bug [#494] : edge case bug in tokenization of an empty block comment. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#494] : edge case bug in tokenization of an empty single-line DocBlock. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#499] : Generic.ControlStructures.InlineControlStructure now handles statements with a comment between `else` and `if` correctly. - - Thanks to [Rodrigo Primo][@rodrigoprimo] for the patch. - -[sq-3731]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3731 -[#387]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/387 -[#442]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/442 -[#447]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/447 -[#461]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/461 -[#466]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/466 -[#471]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/471 -[#472]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/472 -[#473]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/473 -[#478]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/478 -[#479]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/479 -[#494]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/494 -[#499]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/499 - -## [3.9.2] - 2024-04-24 - -### Changed -- The Generic.ControlStructures.DisallowYodaConditions sniff no longer listens for the null coalesce operator. [#458] - - Thanks to [Rodrigo Primo][@rodrigoprimo] for the patch. -- Various housekeeping, including improvements to the tests and documentation. - - Thanks to [Dan Wallis][@fredden], [Rodrigo Primo][@rodrigoprimo] and [Juliette Reinders Folmer][@jrfnl] for their contributions. - -### Fixed -- Fixed bug [#381] : Squiz.Commenting.ClosingDeclarationComment could throw the wrong error when the close brace being examined is at the very end of a file. - - Thanks to [Rodrigo Primo][@rodrigoprimo] for the patch. -- Fixed bug [#385] : Generic.CodeAnalysis.JumbledIncrementer improved handling of parse errors/live coding. - - Thanks to [Rodrigo Primo][@rodrigoprimo] for the patch. -- Fixed bug [#394] : Generic.Functions.CallTimePassByReference was not flagging call-time pass-by-reference in anonymous class instantiations - - Thanks to [Rodrigo Primo][@rodrigoprimo] for the patch. -- Fixed bug [#420] : PEAR.Functions.FunctionDeclaration could run into a blocking PHP notice while fixing code containing a parse error. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#421] : File::getMethodProperties() small performance improvement & more defensive coding. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#423] : PEAR.WhiteSpace.ScopeClosingBrace would have a fixer conflict with itself when a close tag was preceded by non-empty inline HTML. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#424] : PSR2.Classes.ClassDeclaration using namespace relative interface names in the extends/implements part of a class declaration would lead to a fixer conflict. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#427] : Squiz.Operators.OperatorSpacing would have a fixer conflict with itself when an operator was preceeded by a new line and the previous line ended in a comment. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#430] : Squiz.ControlStructures.ForLoopDeclaration: fixed potential undefined array index notice - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#431] : PSR2.Classes.ClassDeclaration will no longer try to auto-fix multi-line interface implements statements if these are interlaced with comments on their own line. This prevents a potential fixer conflict. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#453] : Arrow function tokenization was broken when the return type was a stand-alone `true` or `false`; or contained `true` or `false` as part of a union type. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch - -### Other -- [ESLint 9.0] has been released and changes the supported configuration file format. - The (deprecated) `Generic.Debug.ESLint` sniff only supports the "old" configuration file formats and when using the sniff to run ESLint, the `ESLINT_USE_FLAT_CONFIG=false` environment variable will need to be set when using ESLint >= 9.0. - For more information, see [#436]. - - -[ESLint 9.0]: https://eslint.org/blog/2024/04/eslint-v9.0.0-released/#flat-config-is-now-the-default-and-has-some-changes - -[#381]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/381 -[#385]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/385 -[#394]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/394 -[#420]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/420 -[#421]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/421 -[#423]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/423 -[#424]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/424 -[#427]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/427 -[#430]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/430 -[#431]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/431 -[#436]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/436 -[#453]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/453 -[#458]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/458 - -## [3.9.1] - 2024-03-31 - -### Added -- Documentation for the following sniffs: - - Generic.PHP.RequireStrictTypes - - Squiz.WhiteSpace.MemberVarSpacing - - Squiz.WhiteSpace.ScopeClosingBrace - - Squiz.WhiteSpace.SuperfluousWhitespace - - Thanks to [Jay McPartland][@jaymcp] and [Rodrigo Primo][@rodrigoprimo] for the patches. - -### Changed -- The following sniffs have received performance related improvements: - - Generic.CodeAnalysis.UselessOverridingMethod - - Generic.Files.ByteOrderMark - - Thanks to [Rodrigo Primo][@rodrigoprimo] for the patches. -- Performance improvement for the "Diff" report. Should be most notable for Windows users. [#355] - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- The test suite has received some performance improvements. Should be most notable contributors using Windows. [#351] - - External standards with sniff tests using the PHP_CodeSniffer native test framework will also benefit from these changes. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch. -- Various housekeeping, including improvements to the tests and documentation. - - Thanks to [Jay McPartland][@jaymcp], [João Pedro Oliveira][@jpoliveira08], [Rodrigo Primo][@rodrigoprimo] and [Juliette Reinders Folmer][@jrfnl] for their contributions. - -### Fixed -- Fixed bug [#289] : Squiz.WhiteSpace.OperatorSpacing and PSR12.Operators.OperatorSpacing : improved fixer conflict protection by more strenuously avoiding handling operators in declare statements. - - Thanks to [Dan Wallis][@fredden] for the patch. -- Fixed bug [#366] : Generic.CodeAnalysis.UselessOverridingMethod : prevent false negative when the declared method name and the called method name do not use the same case. - - Thanks to [Rodrigo Primo][@rodrigoprimo] for the patch. -- Fixed bug [#368] : Squiz.Arrays.ArrayDeclaration fixer did not handle static closures correctly when moving array items to their own line. - - Thanks to [Michał Bundyra][@michalbundyra] for the patch. -- Fixed bug [#404] : Test framework : fixed PHP 8.4 deprecation notice. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch - -[#289]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/289 -[#351]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/351 -[#355]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/355 -[#366]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/366 -[#368]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/368 -[#404]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/404 - -## [3.9.0] - 2024-02-16 - -### Added -- Tokenizer support for PHP 8.3 typed class constants. [#321] - - Additionally, the following sniffs have been updated to support typed class constants: - - Generic.NamingConventions.UpperCaseConstantName [#332] - - Generic.PHP.LowerCaseConstant [#330] - - Generic.PHP.LowerCaseType [#331] - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patches -- Tokenizer support for PHP 8.3 readonly anonymous classes. [#309] - - Additionally, the following sniffs have been updated to support readonly anonymous classes: - - PSR12.Classes.ClassInstantiation [#324] - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patches -- New `PHP_CodeSniffer\Sniffs\DeprecatedSniff` interface to allow for marking a sniff as deprecated. [#281] - - If a ruleset uses deprecated sniffs, deprecation notices will be shown to the end-user before the scan starts. - When running in `-q` (quiet) mode, the deprecation notices will be hidden. - - Deprecated sniffs will still run and using them will have no impact on the exit code for a scan. - - In ruleset "explain"-mode (`-e`) an asterix `*` will show next to deprecated sniffs. - - Sniff maintainers are advised to read through the PR description for full details on how to use this feature for their own (deprecated) sniffs. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- New `Generic.CodeAnalysis.RequireExplicitBooleanOperatorPrecedence` sniff. [#197] - - Forbid mixing different binary boolean operators within a single expression without making precedence clear using parentheses - - Thanks to [Tim Düsterhus][@TimWolla] for the contribution -- Squiz.PHP.EmbeddedPhp : the sniff will now also examine the formatting of embedded PHP statements using short open echo tags. [#27] - - Includes a new `ShortOpenEchoNoSemicolon` errorcode to allow for selectively ignoring missing semicolons in single line embedded PHP snippets within short open echo tags. - - The other error codes are the same and do not distinguish between what type of open tag was used. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Documentation for the following sniffs: - - Generic.WhiteSpace.IncrementDecrementSpacing - - PSR12.ControlStructures.ControlStructureSpacing - - PSR12.Files.ImportStatement - - PSR12.Functions.ReturnTypeDeclaration - - PSR12.Properties.ConstantVisibility - - Thanks to [Denis Žoljom][@dingo-d] and [Rodrigo Primo][@rodrigoprimo] for the patches - -### Changed -- The Performance report can now also be used for a `phpcbf` run. [#308] - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Sniff tests which extend the PHPCS native `AbstractSniffUnitTest` class will now show a (non-build-breaking) warning when test case files contain fixable errors/warnings, but there is no corresponding `.fixed` file available in the test suite to verify the fixes against. [#336] - - The warning is only displayed on PHPUnit 7.3.0 and higher. - - The warning will be elevated to a test failure in PHPCS 4.0. - - Thanks to [Dan Wallis][@fredden] for the patch -- The following sniffs have received performance related improvements: - - Squiz.PHP.EmbeddedPhp - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Various housekeeping, including improvements to the tests and documentation - - Thanks to [Dan Wallis][@fredden], [Joachim Noreiko][@joachim-n], [Remi Collet][@remicollet], [Rodrigo Primo][@rodrigoprimo] and [Juliette Reinders Folmer][@jrfnl] for their contributions - -### Deprecated -- Support for scanning JavaScript and CSS files. See [#2448][sq-2448]. - - This also means that all sniffs which are only aimed at JavaScript or CSS files are now deprecated. - - The Javascript and CSS Tokenizers, all Javascript and CSS specific sniffs, and support for JS and CSS in select sniffs which support multiple file types, will be removed in version 4.0.0. -- The abstract `PHP_CodeSniffer\Filters\ExactMatch::getBlacklist()` and `PHP_CodeSniffer\Filters\ExactMatch::getWhitelist()` methods are deprecated and will be removed in the 4.0 release. See [#198]. - - In version 4.0, these methods will be replaced with abstract `ExactMatch::getDisallowedFiles()` and `ExactMatch::getAllowedFiles()` methods - - To make Filters extending `ExactMatch` cross-version compatible with both PHP_CodeSniffer 3.9.0+ as well as 4.0+, implement the new `getDisallowedFiles()` and `getAllowedFiles()` methods. - - When both the `getDisallowedFiles()` and `getAllowedFiles()` methods as well as the `getBlacklist()` and `getWhitelist()` are available, the new methods will take precedence over the old methods. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- The MySource standard and all sniffs in it. See [#2471][sq-2471]. - - The MySource standard and all sniffs in it will be removed in version 4.0.0. -- The `Zend.Debug.CodeAnalyzer` sniff. See [#277]. - - This sniff will be removed in version 4.0.0. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch - -### Fixed -- Fixed bug [#127] : Squiz.Commenting.FunctionComment : The `MissingParamType` error code will now be used instead of `MissingParamName` when a parameter name is provided, but not its type. Additionally, invalid type hint suggestions will no longer be provided in these cases. - - Thanks to [Dan Wallis][@fredden] for the patch -- Fixed bug [#196] : Squiz.PHP.EmbeddedPhp : fixer will no longer leave behind trailing whitespace when moving code to another line. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#196] : Squiz.PHP.EmbeddedPhp : will now determine the needed indent with higher precision in multiple situations. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#196] : Squiz.PHP.EmbeddedPhp : fixer will no longer insert a stray new line when the closer of a multi-line embedded PHP block and the opener of the next multi-line embedded PHP block would be on the same line. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#235] : Generic.CodeAnalysis.ForLoopWithTestFunctionCall : prevent a potential PHP 8.3 deprecation notice during live coding - - Thanks to [Rodrigo Primo][@rodrigoprimo] for the patch -- Fixed bug [#288] : Generic.WhiteSpace.IncrementDecrementSpacing : error message for post-in/decrement will now correctly inform about new lines found before the operator. - - Thanks to [Rodrigo Primo][@rodrigoprimo] for the patch -- Fixed bug [#296] : Generic.WhiteSpace.ArbitraryParenthesesSpacing : false positive for non-arbitrary parentheses when these follow the scope closer of a `switch` `case`. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#307] : PSR2.Classes.ClassDeclaration : space between a modifier keyword and the `class` keyword was not checked when the space included a new line or comment. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#325] : Squiz.Operators.IncrementDecrementUsage : the sniff was underreporting when there was (no) whitespace and/or comments in unexpected places. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#335] : PSR12.Files.DeclareStatement : bow out in a certain parse error situation to prevent incorrect auto-fixes from being made. - - Thanks to [Dan Wallis][@fredden] for the patch -- Fixed bug [#340] : Squiz.Commenting.ClosingDeclarationComment : no longer adds a stray newline when adding a missing comment. - - Thanks to [Dan Wallis][@fredden] for the patch - -### Other -- A "Community cc list" has been introduced to ping maintainers of external standards and integrators for input regarding change proposals for PHP_CodeSniffer which may impact them. [#227] - - For anyone who missed the discussion about this and is interested to be on this list, please feel invited to submit a PR to add yourself. - The list is located in the `.github` folder. - -[sq-2448]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2448 -[sq-2471]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2471 -[#27]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/27 -[#127]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/127 -[#196]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/196 -[#197]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/197 -[#198]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/198 -[#227]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/227 -[#235]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/235 -[#277]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/277 -[#281]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/281 -[#288]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/288 -[#296]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/296 -[#307]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/307 -[#308]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/308 -[#309]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/309 -[#321]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/321 -[#324]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/324 -[#325]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/325 -[#330]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/330 -[#331]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/331 -[#332]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/332 -[#335]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/335 -[#336]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/336 -[#340]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/340 - -## [3.8.1] - 2024-01-11 - -### Added -- Documentation has been added for the following sniffs: - - Generic.CodeAnalysis.EmptyPHPStatement - - Generic.Formatting.SpaceBeforeCast - - Generic.PHP.Syntax - - Generic.WhiteSpace.LanguageConstructSpacing - - PSR12.Classes.ClosingBrace - - PSR12.Classes.OpeningBraceSpace - - PSR12.ControlStructures.BooleanOperatorPlacement - - PSR12.Files.OpenTag - - Thanks to [Rodrigo Primo][@rodrigoprimo] and [Denis Žoljom][@dingo-d] for the patches - -### Changed -- GitHub releases will now always only contain unversioned release assets (PHARS + asc files) (same as it previously was in the squizlabs repo). See [#205] for context. - - Thanks to [Shivam Mathur][@shivammathur] for opening a discussion about this -- Various housekeeping, includes improvements to the tests and documentation - - Thanks to [Dan Wallis][@fredden], [Lucas Hoffmann][@lucc], [Rodrigo Primo][@rodrigoprimo] and [Juliette Reinders Folmer][@jrfnl] for their contributions - -### Fixed -- Fixed bug [#124] : Report Full : avoid unnecessarily wrapping lines when `-s` is used - - Thanks to [Brad Jorsch][@anomiex] for the patch -- Fixed bug [#124] : Report Full : fix incorrect bolding of pipes when `-s` is used and messages wraps - - Thanks to [Brad Jorsch][@anomiex] for the patch -- Fixed bug [#150] : Squiz.WhiteSpace.KeywordSpacing : prevent a PHP notice when run during live coding - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#154] : Report Full : delimiter line calculation could go wonky on wide screens when a report contains multi-line messages - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#178] : Squiz.Commenting.VariableComment : docblocks were incorrectly being flagged as missing when a property declaration used PHP native union/intersection type declarations - - Thanks to [Ferdinand Kuhl][@fcool] for the patch -- Fixed bug [#211] : Squiz.Commenting.VariableComment : docblocks were incorrectly being flagged as missing when a property declaration used PHP 8.2+ stand-alone `true`/`false`/`null` type declarations - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#211] : Squiz.Commenting.VariableComment : docblocks were incorrectly being flagged as missing when a property declaration used PHP native `parent`, `self` or a namespace relative class name type declaration - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#226] : Generic.CodeAnalysis.ForLoopShouldBeWhileLoop : prevent a potential PHP 8.3 deprecation notice during live coding - - Thanks to [Rodrigo Primo][@rodrigoprimo] for the patch - -[#124]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/124 -[#150]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/150 -[#154]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/154 -[#178]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/178 -[#205]: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/205 -[#211]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/211 -[#226]: https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/226 - -## [3.8.0] - 2023-12-08 - -[Squizlabs/PHP_CodeSniffer](https://github.com/squizlabs/PHP_CodeSniffer) is dead. Long live [PHPCSStandards/PHP_CodeSniffer](https://github.com/PHPCSStandards/PHP_CodeSniffer)! - -### Breaking Changes -- The `squizlabs/PHP_CodeSniffer` repository has been abandoned. The `PHPCSStandards/PHP_CodeSniffer` repository will serve as the continuation of the project. For more information about this change, please read the [announcement](https://github.com/squizlabs/PHP_CodeSniffer/issues/3932). - - Installation of PHP_CodeSniffer via PEAR is no longer supported. - - Users will need to switch to another installation method. - - Note: this does not affect the PEAR sniffs. - - For Composer users, nothing changes. - - **_In contrast to earlier information, the `squizlabs/php_codesniffer` package now points to the new repository and everything will continue to work as before._** - - PHIVE users may need to clear the PHIVE URL cache. - - PHIVE users who don't use the package alias, but refer to the package URL, will need to update the URL from `https://squizlabs.github.io/PHP_CodeSniffer/phars/` to `https://phars.phpcodesniffer.com/phars/`. - - Users who download the PHAR files using curl or wget, will need to update the download URL from `https://squizlabs.github.io/PHP_CodeSniffer/[phpcs|phpcbf].phar` or `https://github.com/squizlabs/PHP_CodeSniffer/releases/latest/download/[phpcs|phpcbf].phar` to `https://phars.phpcodesniffer.com/[phpcs|phpcbf].phar`. - - For users who install PHP_CodeSniffer via the [Setup-PHP](https://github.com/shivammathur/setup-php/) action runner for GitHub Actions, nothing changes. - - Users using a git clone will need to update the clone address from `git@github.com:squizlabs/PHP_CodeSniffer.git` to `git@github.com:PHPCSStandards/PHP_CodeSniffer.git`. - - Contributors will need to fork the new repo and add both the new fork as well as the new repo as remotes to their local git copy of PHP_CodeSniffer. - - Users who have (valid) open issues or pull requests in the `squizlabs/PHP_CodeSniffer` repository are invited to resubmit these to the `PHPCSStandards/PHP_CodeSniffer` repository. - -### Added -- Runtime support for PHP 8.3. All known PHP 8.3 deprecation notices have been fixed - - Syntax support for new PHP 8.3 features will follow in a future release - - If you find any PHP 8.3 deprecation notices which were missed, please report them - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patches -- Added support for PHP 8.2 readonly classes to File::getClassProperties() through a new is_readonly array index in the return value - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Added support for PHP 8.2 readonly classes to a number of sniffs - - Generic.CodeAnalysis.UnnecessaryFinalModifier - - PEAR.Commenting.ClassComment - - PEAR.Commenting.FileComment - - PSR1.Files.SideEffects - - PSR2.Classes.ClassDeclaration - - PSR12.Files.FileHeader - - Squiz.Classes.ClassDeclaration - - Squiz.Classes.LowercaseClassKeywords - - Squiz.Commenting.ClassComment - - Squiz.Commenting.DocCommentAlignment - - Squiz.Commenting.FileComment - - Squiz.Commenting.InlineComment - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Added support for PHP 8.2 `true` as a stand-alone type declaration - - The `File::getMethodProperties()`, `File::getMethodParameters()` and `File::getMemberProperties()` methods now all support the `true` type - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Added support for PHP 8.2 `true` as a stand-alone type to a number of sniffs - - Generic.PHP.LowerCaseType - - PSr12.Functions.NullableTypeDeclaration - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Added a Performance report to allow for finding "slow" sniffs - - To run this report, run PHPCS with --report=Performance. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Generic.PHP.RequireStrictTypes : new warning for when there is a declare statement, but the strict_types directive is set to 0 - - The warning can be turned off by excluding the `Generic.PHP.RequireStrictTypes.Disabled` error code - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.Commenting.FunctionComment : new `ParamNameUnexpectedAmpersandPrefix` error for parameters annotated as passed by reference while the parameter is not passed by reference - - Thanks to [Dan Wallis][@fredden] for the patch -- Documentation has been added for the following sniffs: - - PSR2.Files.ClosingTag - - PSR2.Methods.FunctionCallSignature - - PSR2.Methods.FunctionClosingBrace - - Thanks to [Atsushi Okui][@blue32a] for the patch -- Support for PHPUnit 8 and 9 to the test suite - - Test suites for external standards which run via the PHPCS native test suite can now run on PHPUnit 4-9 (was 4-7) - - If any of these tests use the PHPUnit `setUp()`/`tearDown()` methods or overload the `setUp()` in the `AbstractSniffUnitTest` test case, they will need to be adjusted. See the [PR details for further information](https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/59/commits/bc302dd977877a22c5e60d42a2f6b7d9e9192dab) - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch - -### Changed -- Changes have been made to the way PHPCS handles invalid sniff properties being set in a custom ruleset - - Fixes PHP 8.2 deprecation notices for properties set in a (custom) ruleset for complete standards/complete sniff categories - - Invalid sniff properties set for individual sniffs will now result in an error and halt the execution of PHPCS - - A descriptive error message is provided to allow users to fix their ruleset - - Sniff properties set for complete standards/complete sniff categories will now only be set on sniffs which explicitly support the property - - The property will be silently ignored for those sniffs which do not support the property - - Invalid sniff properties set for sniffs via inline annotations will result in an informative `Internal.PropertyDoesNotExist` errror on line 1 of the scanned file, but will not halt the execution of PHPCS - - For sniff developers, it is strongly recommended for sniffs to explicitly declare any user-adjustable public properties - - If dynamic properties need to be supported for a sniff, either declare the magic __set()/__get()/__isset()/__unset() methods on the sniff or let the sniff extend stdClass - - Note: The `#[\AllowDynamicProperties]` attribute will have no effect for properties which are being set in rulesets - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- The third parameter for the Ruleset::setSniffProperty() method has been changed to expect an array - - Sniff developers/integrators of PHPCS may need to make some small adjustments to allow for this change - - Existing code will continue to work but will throw a deprecation error - - The backwards compatiblity layer will be removed in PHPCS 4.0 - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- When using `auto` report width (the default) a value of 80 columns will be used if the width cannot be determined - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Sniff error messages are now more informative to help bugs get reported to the correct project - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Generic.CodeAnalysis.UnusedFunctionParameter will now ignore magic methods for which the signature is defined by PHP - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Generic.Functions.OpeningFunctionBraceBsdAllman will now check the brace indent before the opening brace for empty functions - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Generic.Functions.OpeningFunctionBraceKernighanRitchie will now check the spacing before the opening brace for empty functions - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Generic.WhiteSpace.IncrementDecrementSpacing now detects more spacing issues - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- PSR2.Classes.PropertyDeclaration now enforces that the readonly modifier comes after the visibility modifier - - PSR2 and PSR12 do not have documented rules for this as they pre-date the readonly modifier - - PSR-PER has been used to confirm the order of this keyword so it can be applied to PSR2 and PSR12 correctly - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- PEAR.Commenting.FunctionComment + Squiz.Commenting.FunctionComment: the SpacingAfter error can now be auto-fixed - - Thanks to [Dan Wallis][@fredden] for the patch -- Squiz.PHP.InnerFunctions sniff no longer reports on OO methods for OO structures declared within a function or closure - - Thanks to [@Daimona] for the patch -- Squiz.PHP.NonExecutableCode will now also flag redundant return statements just before a closure close brace - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Runtime performance improvement for PHPCS CLI users. The improvement should be most noticeable for users on Windows. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- The following sniffs have received performance related improvements: - - Generic.PHP.LowerCaseConstant - - Generic.PHP.LowerCaseType - - PSR12.Files.OpenTag - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patches -- The -e (explain) command will now list sniffs in natural order - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Tests using the PHPCS native test framework with multiple test case files will now run the test case files in numeric order. - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- The following sniffs have received minor message readability improvements: - - Generic.Arrays.ArrayIndent - - Generic.Formatting.SpaceAfterCast - - Generic.Formatting.SpaceAfterNot - - Generic.WhiteSpace.SpreadOperatorSpacingAfter - - Squiz.Arrays.ArrayDeclaration - - Squiz.Commenting.DocCommentAlignment - - Squiz.ControlStructures.ControlSignature - - Thanks to [Danny van der Sluijs][@DannyvdSluijs] and [Juliette Reinders Folmer][@jrfnl] for the patches -- Improved README syntax highlighting - - Thanks to [Benjamin Loison][@Benjamin-Loison] for the patch -- Various documentation improvements - - Thanks to [Andrew Dawes][@AndrewDawes], [Danny van der Sluijs][@DannyvdSluijs] and [Juliette Reinders Folmer][@jrfnl] for the patches - -### Removed -- Removed support for installation via PEAR - - Use composer or the PHAR files instead - -### Fixed -- Fixed bug [#2857][sq-2857] : Squiz/NonExecutableCode: prevent false positives when exit is used in a ternary expression or as default with null coalesce - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3386][sq-3386] : PSR1/SideEffects : improved recognition of disable/enable annotations - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3557][sq-3557] : Squiz.Arrays.ArrayDeclaration will now ignore PHP 7.4 array unpacking when determining whether an array is associative - - Thanks to [Volker Dusch][@edorian] for the patch -- Fixed bug [#3592][sq-3592] : Squiz/NonExecutableCode: prevent false positives when a PHP 8.0+ inline throw expression is encountered - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3715][sq-3715] : Generic/UnusedFunctionParameter: fixed incorrect errorcode for closures/arrow functions nested within extended classes/classes which implement - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3717][sq-3717] : Squiz.Commenting.FunctionComment: fixed false positive for `InvalidNoReturn` when type is never - - Thanks to [Choraimy Kroonstuiver][@axlon] for the patch -- Fixed bug [#3720][sq-3720] : Generic/RequireStrictTypes : will now bow out silently in case of parse errors/live coding instead of throwing false positives/false negatives - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3720][sq-3720] : Generic/RequireStrictTypes : did not handle multi-directive declare statements - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3722][sq-3722] : Potential "Uninitialized string offset 1" in octal notation backfill - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3736][sq-3736] : PEAR/FunctionDeclaration: prevent fixer removing the close brace (and creating a parse error) when there is no space between the open brace and close brace of a function - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3739][sq-3739] : PEAR/FunctionDeclaration: prevent fixer conflict, and potentially creating a parse error, for unconventionally formatted return types - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3770][sq-3770] : Squiz/NonExecutableCode: prevent false positives for switching between PHP and HTML - - Thanks to [Dan Wallis][@fredden] for the patch -- Fixed bug [#3773][sq-3773] : Tokenizer/PHP: tokenization of the readonly keyword when used in combination with PHP 8.2 disjunctive normal types - - Thanks to [Dan Wallis][@fredden] and [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3776][sq-3776] : Generic/JSHint: error when JSHint is not available - - Thanks to [Dan Wallis][@fredden] for the patch -- Fixed bug [#3777][sq-3777] : Squiz/NonExecutableCode: slew of bug fixes, mostly related to modern PHP - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3778][sq-3778] : Squiz/LowercasePHPFunctions: bug fix for class names in attributes - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3779][sq-3779] : Generic/ForbiddenFunctions: bug fix for class names in attributes - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3785][sq-3785] : Squiz.Commenting.FunctionComment: potential "Uninitialized string offset 0" when a type contains a duplicate pipe symbol - - Thanks to [Dan Wallis][@fredden] for the patch -- Fixed bug [#3787][sq-3787] : `PEAR/Squiz/[MultiLine]FunctionDeclaration`: allow for PHP 8.1 new in initializers - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3789][sq-3789] : Incorrect tokenization for ternary operator with `match` inside of it - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3790][sq-3790] : PSR12/AnonClassDeclaration: prevent fixer creating parse error when there was no space before the open brace - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3797][sq-3797] : Tokenizer/PHP: more context sensitive keyword fixes - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3801][sq-3801] : File::getMethodParameters(): allow for readonly promoted properties without visibility - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3805][sq-3805] : Generic/FunctionCallArgumentSpacing: prevent fixer conflict over PHP 7.3+ trailing comma's in function calls - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3806][sq-3806] : Squiz.PHP.InnerFunctions sniff now correctly reports inner functions declared within a closure - - Thanks to [@Daimona] for the patch -- Fixed bug [#3809][sq-3809] : GitBlame report was broken when passing a basepath - - Thanks to [Chris][@datengraben] for the patch -- Fixed bug [#3813][sq-3813] : Squiz.Commenting.FunctionComment: false positive for parameter name mismatch on parameters annotated as passed by reference - - Thanks to [Dan Wallis][@fredden] for the patch -- Fixed bug [#3833][sq-3833] : Generic.PHP.LowerCaseType: fixed potential undefined array index notice - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3846][sq-3846] : PSR2.Classes.ClassDeclaration.CloseBraceAfterBody : fixer will no longer remove indentation on the close brace line - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3854][sq-3854] : Fatal error when using Gitblame report in combination with `--basepath` and running from project subdirectory - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3856][sq-3856] : PSR12.Traits.UseDeclaration was using the wrong error code - SpacingAfterAs - for spacing issues after the `use` keyword - - These will now be reported using the SpacingAfterUse error code - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3856][sq-3856] : PSR12.Traits.UseDeclaration did not check spacing after `use` keyword for multi-line trait use statements - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3867][sq-3867] : Tokenizer/PHP: union type and intersection type operators were not correctly tokenized for static properties without explicit visibility - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3877][sq-3877] : Filter names can be case-sensitive. The -h help text will now display the correct case for the available filters - - Thanks to [@simonsan] for the patch -- Fixed bug [#3893][sq-3893] : Generic/DocComment : the SpacingAfterTagGroup fixer could accidentally remove ignore annotations - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3898][sq-3898] : Squiz/NonExecutableCode : the sniff could get confused over comments in unexpected places - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3904][sq-3904] : Squiz/FunctionSpacing : prevent potential fixer conflict - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3906][sq-3906] : Tokenizer/CSS: bug fix related to the unsupported slash comment syntax - - Thanks to [Dan Wallis][@fredden] for the patch -- Fixed bug [#3913][sq-3913] : Config did not always correctly store unknown "long" arguments in the `$unknown` property - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch - -Thanks go to [Dan Wallis][@fredden] and [Danny van der Sluijs][@DannyvdSluijs] for reviewing quite a few of the PRs for this release. -Additionally, thanks to [Alexander Turek][@derrabus] for consulting on the repo change over. - -[sq-2857]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2857 -[sq-3386]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3386 -[sq-3557]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3557 -[sq-3592]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3592 -[sq-3715]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3715 -[sq-3717]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3717 -[sq-3720]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3720 -[sq-3722]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3722 -[sq-3736]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3736 -[sq-3739]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3739 -[sq-3770]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3770 -[sq-3773]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3773 -[sq-3776]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3776 -[sq-3777]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3777 -[sq-3778]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3778 -[sq-3779]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3779 -[sq-3785]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3785 -[sq-3787]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3787 -[sq-3789]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3789 -[sq-3790]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3790 -[sq-3797]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3797 -[sq-3801]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3801 -[sq-3805]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3805 -[sq-3806]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3806 -[sq-3809]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3809 -[sq-3813]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3813 -[sq-3833]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3833 -[sq-3846]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3846 -[sq-3854]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3854 -[sq-3856]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3856 -[sq-3867]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3867 -[sq-3877]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3877 -[sq-3893]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3893 -[sq-3898]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3898 -[sq-3904]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3904 -[sq-3906]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3906 -[sq-3913]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3913 - -## [3.7.2] - 2023-02-23 - -### Changed -- Newer versions of Composer will now suggest installing PHPCS using require-dev instead of require - - Thanks to [Gary Jones][@GaryJones] for the patch -- A custom Out Of Memory error will now be shown if PHPCS or PHPCBF run out of memory during a run - - Error message provides actionable information about how to fix the problem and ensures the error is not silent - - Thanks to [Juliette Reinders Folmer][@jrfnl] and [Alain Schlesser][@schlessera] for the patch -- Generic.PHP.LowerCaseType sniff now correctly examines types inside arrow functions - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.Formatting.OperatorBracket no longer reports false positives in match() structures - -### Fixed -- Fixed bug [#3616][sq-3616] : Squiz.PHP.DisallowComparisonAssignment false positive for PHP 8 match expression - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3618][sq-3618] : Generic.WhiteSpace.ArbitraryParenthesesSpacing false positive for return new parent() - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3632][sq-3632] : Short list not tokenized correctly in control structures without braces - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3639][sq-3639] : Tokenizer not applying tab replacement to heredoc/nowdoc closers - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3640][sq-3640] : Generic.WhiteSpace.DisallowTabIndent not reporting errors for PHP 7.3 flexible heredoc/nowdoc syntax - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3645][sq-3645] : PHPCS can show 0 exit code when running in parallel even if child process has fatal error - - Thanks to [Alex Panshin][@enl] for the patch -- Fixed bug [#3653][sq-3653] : False positives for match() in OperatorSpacingSniff - - Thanks to [Jaroslav Hanslík][@kukulich] for the patch -- Fixed bug [#3666][sq-3666] : PEAR.Functions.FunctionCallSignature incorrect indent fix when checking mixed HTML/PHP files -- Fixed bug [#3668][sq-3668] : PSR12.Classes.ClassInstantiation.MissingParentheses false positive when instantiating parent classes - - Similar issues also fixed in Generic.Functions.FunctionCallArgumentSpacing and Squiz.Formatting.OperatorBracket - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3672][sq-3672] : Incorrect ScopeIndent.IncorrectExact report for match inside array literal -- Fixed bug [#3694][sq-3694] : Generic.WhiteSpace.SpreadOperatorSpacingAfter does not ignore spread operator in PHP 8.1 first class callables - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch - -[sq-3616]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3616 -[sq-3618]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3618 -[sq-3632]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3632 -[sq-3639]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3639 -[sq-3640]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3640 -[sq-3645]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3645 -[sq-3653]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3653 -[sq-3666]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3666 -[sq-3668]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3668 -[sq-3672]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3672 -[sq-3694]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3694 - -## [3.7.1] - 2022-06-18 - -### Fixed -- Fixed bug [#3609][sq-3609] : Methods/constants with name empty/isset/unset are always reported as error - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch - -[sq-3609]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3609 - -## [3.7.0] - 2022-06-13 - -### Added -- Added support for PHP 8.1 explicit octal notation - - This new syntax has been backfilled for PHP versions less than 8.1 - - Thanks to [Mark Baker][@MarkBaker] for the patch - - Thanks to [Juliette Reinders Folmer][@jrfnl] for additional fixes -- Added support for PHP 8.1 enums - - This new syntax has been backfilled for PHP versions less than 8.1 - - Includes a new T_ENUM_CASE token to represent the case statements inside an enum - - Thanks to [Jaroslav Hanslík][@kukulich] for the patch - - Thanks to [Juliette Reinders Folmer][@jrfnl] for additional core and sniff support -- Added support for the PHP 8.1 readonly token - - Tokenizing of the readonly keyword has been backfilled for PHP versions less than 8.1 - - Thanks to [Jaroslav Hanslík][@kukulich] for the patch -- Added support for PHP 8.1 intersection types - - Includes a new T_TYPE_INTERSECTION token to represent the ampersand character inside intersection types - - Thanks to [Jaroslav Hanslík][@kukulich] for the patch - -### Changed -- File::getMethodParameters now supports the new PHP 8.1 readonly token - - When constructor property promotion is used, a new property_readonly array index is included in the return value - - This is a boolean value indicating if the property is readonly - - If the readonly token is detected, a new readonly_token array index is included in the return value - - This contains the token index of the readonly keyword - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Support for new PHP 8.1 readonly keyword has been added to the following sniffs: - - Generic.PHP.LowerCaseKeyword - - PSR2.Classes.PropertyDeclaration - - Squiz.Commenting.BlockComment - - Squiz.Commenting.DocCommentAlignment - - Squiz.Commenting.VariableComment - - Squiz.WhiteSpace.ScopeKeywordSpacing - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patches -- The parallel feature is now more efficient and runs faster in some situations due to improved process management - - Thanks to [Sergei Morozov][@morozov] for the patch -- The list of installed coding standards now has consistent ordering across all platforms - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Generic.PHP.UpperCaseConstant and Generic.PHP.LowerCaseConstant now ignore type declarations - - These sniffs now only report errors for true/false/null when used as values - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Generic.PHP.LowerCaseType now supports the PHP 8.1 never type - - Thanks to [Jaroslav Hanslík][@kukulich] for the patch - -### Fixed -- Fixed bug [#3502][sq-3502] : A match statement within an array produces Squiz.Arrays.ArrayDeclaration.NoKeySpecified -- Fixed bug [#3503][sq-3503] : Squiz.Commenting.FunctionComment.ThrowsNoFullStop false positive when one line @throw -- Fixed bug [#3505][sq-3505] : The nullsafe operator is not counted in Generic.Metrics.CyclomaticComplexity - - Thanks to [Mark Baker][@MarkBaker] for the patch -- Fixed bug [#3526][sq-3526] : PSR12.Properties.ConstantVisibility false positive when using public final const syntax - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3530][sq-3530] : Line indented incorrectly false positive when using match-expression inside switch case -- Fixed bug [#3534][sq-3534] : Name of typed enum tokenized as T_GOTO_LABEL - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3546][sq-3546] : Tokenizer/PHP: bug fix - parent/static keywords in class instantiations - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3550][sq-3550] : False positive from PSR2.ControlStructures.SwitchDeclaration.TerminatingComment when using trailing comment - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3575][sq-3575] : Squiz.Scope.MethodScope misses visibility keyword on previous line - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3604][sq-3604] : Tokenizer/PHP: bug fix for double quoted strings using ${ - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch - -[sq-3502]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3502 -[sq-3503]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3503 -[sq-3505]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3505 -[sq-3526]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3526 -[sq-3530]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3530 -[sq-3534]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3534 -[sq-3546]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3546 -[sq-3550]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3550 -[sq-3575]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3575 -[sq-3604]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3604 - -## [3.6.2] - 2021-12-13 - -### Changed -- Processing large code bases that use tab indenting inside comments and strings will now be faster - - Thanks to [Thiemo Kreuz][@thiemowmde] for the patch - -### Fixed -- Fixed bug [#3388][sq-3388] : phpcs does not work when run from WSL drives - - Thanks to [Juliette Reinders Folmer][@jrfnl] and [Graham Wharton][@gwharton] for the patch -- Fixed bug [#3422][sq-3422] : Squiz.WhiteSpace.ScopeClosingBrace fixer removes HTML content when fixing closing brace alignment - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3437][sq-3437] : PSR12 does not forbid blank lines at the start of the class body - - Added new PSR12.Classes.OpeningBraceSpace sniff to enforce this -- Fixed bug [#3440][sq-3440] : Squiz.WhiteSpace.MemberVarSpacing false positives when attributes used without docblock - - Thanks to [Vadim Borodavko][@javer] for the patch -- Fixed bug [#3448][sq-3448] : PHP 8.1 deprecation notice while generating running time value - - Thanks to [Juliette Reinders Folmer][@jrfnl] and [Andy Postnikov][@andypost] for the patch -- Fixed bug [#3456][sq-3456] : PSR12.Classes.ClassInstantiation.MissingParentheses false positive using attributes on anonymous class - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3460][sq-3460] : Generic.Formatting.MultipleStatementAlignment false positive on closure with parameters - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3468][sq-3468] : do/while loops are double-counted in Generic.Metrics.CyclomaticComplexity - - Thanks to [Mark Baker][@MarkBaker] for the patch -- Fixed bug [#3469][sq-3469] : Ternary Operator and Null Coalescing Operator are not counted in Generic.Metrics.CyclomaticComplexity - - Thanks to [Mark Baker][@MarkBaker] for the patch -- Fixed bug [#3472][sq-3472] : PHP 8 match() expression is not counted in Generic.Metrics.CyclomaticComplexity - - Thanks to [Mark Baker][@MarkBaker] for the patch - -[sq-3388]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3388 -[sq-3422]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3422 -[sq-3437]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3437 -[sq-3440]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3440 -[sq-3448]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3448 -[sq-3456]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3456 -[sq-3460]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3460 -[sq-3468]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3468 -[sq-3469]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3469 -[sq-3472]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3472 - -## [3.6.1] - 2021-10-11 - -### Changed -- PHPCS annotations can now be specified using hash-style comments - - Previously, only slash-style and block-style comments could be used to do things like disable errors - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- The new PHP 8.1 tokenization for ampersands has been reverted to use the existing PHP_CodeSniffer method - - The PHP 8.1 tokens T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG and T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG are unused - - Ampersands continue to be tokenized as T_BITWISE_AND for all PHP versions - - Thanks to [Juliette Reinders Folmer][@jrfnl] and [Anna Filina][@afilina] for the patch -- File::getMethodParameters() no longer incorrectly returns argument attributes in the type hint array index - - A new has_attributes array index is available and set to TRUE if the argument has attributes defined - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed an issue where some sniffs would not run on PHP files that only used the short echo tag - - The following sniffs were affected: - - Generic.Files.ExecutableFile - - Generic.Files.LowercasedFilename - - Generic.Files.LineEndings - - Generic.Files.EndFileNewline - - Generic.Files.EndFileNoNewline - - Generic.PHP.ClosingPHPTag - - Generic.PHP.Syntax - - Generic.VersionControl.GitMergeConflict - - Generic.WhiteSpace.DisallowSpaceIndent - - Generic.WhiteSpace.DisallowTabIndent - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.Commenting.BlockComment now correctly applies rules for block comments after a short echo tag - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch - -### Fixed -- Generic.NamingConventions.ConstructorName no longer throws deprecation notices on PHP 8.1 - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed false positives when using attributes in the following sniffs: - - PEAR.Commenting.FunctionComment - - Squiz.Commenting.InlineComment - - Squiz.Commenting.BlockComment - - Squiz.Commenting.VariableComment - - Squiz.WhiteSpace.MemberVarSpacing - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3294][sq-3294] : Bug in attribute tokenization when content contains PHP end token or attribute closer on new line - - Thanks to [Alessandro Chitolina][@alekitto] for the patch - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the tests -- Fixed bug [#3296][sq-3296] : PSR2.ControlStructures.SwitchDeclaration takes phpcs:ignore as content of case body -- Fixed bug [#3297][sq-3297] : PSR2.ControlStructures.SwitchDeclaration.TerminatingComment does not handle try/finally blocks - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3302][sq-3302] : PHP 8.0 | Tokenizer/PHP: bugfix for union types using namespace operator - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3303][sq-3303] : findStartOfStatement() doesn't work with T_OPEN_TAG_WITH_ECHO -- Fixed bug [#3316][sq-3316] : Arrow function not tokenized correctly when using null in union type -- Fixed bug [#3317][sq-3317] : Problem with how phpcs handles ignored files when running in parallel - - Thanks to [Emil Andersson][@emil-nasso] for the patch -- Fixed bug [#3324][sq-3324] : PHPCS hangs processing some nested arrow functions inside a function call -- Fixed bug [#3326][sq-3326] : Generic.Formatting.MultipleStatementAlignment error with const DEFAULT - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3333][sq-3333] : Squiz.Objects.ObjectInstantiation: null coalesce operators are not recognized as assignment - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3340][sq-3340] : Ensure interface and trait names are always tokenized as T_STRING - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3342][sq-3342] : PSR12/Squiz/PEAR standards all error on promoted properties with docblocks - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3345][sq-3345] : IF statement with no braces and double catch turned into syntax error by auto-fixer - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3352][sq-3352] : PSR2.ControlStructures.SwitchDeclaration can remove comments on the same line as the case statement while fixing - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3357][sq-3357] : Generic.Functions.OpeningFunctionBraceBsdAllman removes return type when additional lines are present - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3362][sq-3362] : Generic.WhiteSpace.ScopeIndent false positive for arrow functions inside arrays -- Fixed bug [#3384][sq-3384] : Squiz.Commenting.FileComment.SpacingAfterComment false positive on empty file -- Fixed bug [#3394][sq-3394] : Fix PHP 8.1 auto_detect_line_endings deprecation notice -- Fixed bug [#3400][sq-3400] : PHP 8.1: prevent deprecation notices about missing return types - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3424][sq-3424] : PHPCS fails when using PHP 8 Constructor property promotion with attributes - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3425][sq-3425] : PHP 8.1 | Runner::processChildProcs(): fix passing null to non-nullable bug - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3445][sq-3445] : Nullable parameter after attribute incorrectly tokenized as ternary operator - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch - -[sq-3294]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3294 -[sq-3296]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3296 -[sq-3297]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3297 -[sq-3302]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3302 -[sq-3303]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3303 -[sq-3316]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3316 -[sq-3317]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3317 -[sq-3324]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3324 -[sq-3326]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3326 -[sq-3333]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3333 -[sq-3340]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3340 -[sq-3342]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3342 -[sq-3345]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3345 -[sq-3352]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3352 -[sq-3357]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3357 -[sq-3362]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3362 -[sq-3384]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3384 -[sq-3394]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3394 -[sq-3400]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3400 -[sq-3424]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3424 -[sq-3425]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3425 -[sq-3445]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3445 - -## [3.6.0] - 2021-04-09 - -### Added -- Added support for PHP 8.0 union types - - A new T_TYPE_UNION token is available to represent the pipe character - - File::getMethodParameters(), getMethodProperties(), and getMemberProperties() will now return union types - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Added support for PHP 8.0 named function call arguments - - A new T_PARAM_NAME token is available to represent the label with the name of the function argument in it - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Added support for PHP 8.0 attributes - - The PHP-supplied T_ATTRIBUTE token marks the start of an attribute - - A new T_ATTRIBUTE_END token is available to mark the end of an attribute - - New attribute_owner and attribute_closer indexes are available in the tokens array for all tokens inside an attribute - - Tokenizing of attributes has been backfilled for older PHP versions - - The following sniffs have been updated to support attributes: - - PEAR.Commenting.ClassComment - - PEAR.Commenting.FileComment - - PSR1.Files.SideEffects - - PSR12.Files.FileHeader - - Squiz.Commenting.ClassComment - - Squiz.Commenting.FileComment - - Squiz.WhiteSpace.FunctionSpacing - - Thanks to [Vadim Borodavko][@javer] for the patch - - Thanks to [Alessandro Chitolina][@alekitto] for the patch -- Added support for PHP 8.0 dereferencing of text strings with interpolated variables - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Added support for PHP 8.0 match expressions - - Match expressions are now tokenized with parenthesis and scope openers and closers - - Sniffs can listen for the T_MATCH token to process match expressions - - Note that the case and default statements inside match expressions do not have scopes set - - A new T_MATCH_ARROW token is available to represent the arrows in match expressions - - A new T_MATCH_DEFAULT token is available to represent the default keyword in match expressions - - All tokenizing of match expressions has been backfilled for older PHP versions - - The following sniffs have been updated to support match expressions: - - Generic.CodeAnalysis.AssignmentInCondition - - Generic.CodeAnalysis.EmptyPHPStatement - - Thanks to [Vadim Borodavko][@javer] for the patch - - Generic.CodeAnalysis.EmptyStatement - - Generic.PHP.LowerCaseKeyword - - PEAR.ControlStructures.ControlSignature - - PSR12.ControlStructures.BooleanOperatorPlacement - - Squiz.Commenting.LongConditionClosingComment - - Squiz.Commenting.PostStatementComment - - Squiz.ControlStructures.LowercaseDeclaration - - Squiz.ControlStructures.ControlSignature - - Squiz.Formatting.OperatorBracket - - Squiz.PHP.DisallowMultipleAssignments - - Squiz.Objects.ObjectInstantiation - - Squiz.WhiteSpace.ControlStructureSpacing - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Added Generic.NamingConventions.AbstractClassNamePrefix to enforce that class names are prefixed with "Abstract" - - Thanks to [Anna Borzenko][@annechko] for the contribution -- Added Generic.NamingConventions.InterfaceNameSuffix to enforce that interface names are suffixed with "Interface" - - Thanks to [Anna Borzenko][@annechko] for the contribution -- Added Generic.NamingConventions.TraitNameSuffix to enforce that trait names are suffixed with "Trait" - - Thanks to [Anna Borzenko][@annechko] for the contribution - -### Changed -- The value of the T_FN_ARROW token has changed from "T_FN_ARROW" to "PHPCS_T_FN_ARROW" to avoid package conflicts - - This will have no impact on custom sniffs unless they are specifically looking at the value of the T_FN_ARROW constant - - If sniffs are just using constant to find arrow functions, they will continue to work without modification - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- File::findStartOfStatement() now works correctly when passed the last token in a statement -- File::getMethodParameters() now supports PHP 8.0 constructor property promotion - - Returned method params now include a "property_visibility" and "visibility_token" index if property promotion is detected - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- File::getMethodProperties() now includes a "return_type_end_token" index in the return value - - This indicates the last token in the return type, which is helpful when checking union types - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Include patterns are now ignored when processing STDIN - - Previously, checks using include patterns were excluded when processing STDIN when no file path was provided via --stdin-path - - Now, all include and exclude rules are ignored when no file path is provided, allowing all checks to run - - If you want include and exclude rules enforced when checking STDIN, use --stdin-path to set the file path - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Spaces are now correctly escaped in the paths to external on Windows - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Generic.CodeAnalysis.UnusedFunctionParameter can now be configured to ignore variable usage for specific type hints - - This allows you to suppress warnings for some variables that are not required, but leave warnings for others - - Set the ignoreTypeHints array property to a list of type hints to ignore - - Thanks to [Petr Bugyík][@o5] for the patch -- Generic.Formatting.MultipleStatementAlignment can now align statements at the start of the assignment token - - Previously, the sniff enforced that the values were aligned, even if this meant the assignment tokens were not - - Now, the sniff can enforce that the assignment tokens are aligned, even if this means the values are not - - Set the "alignAtEnd" sniff property to "false" to align the assignment tokens - - The default remains at "true", so the assigned values are aligned - - Thanks to [John P. Bloch][@johnpbloch] for the patch -- Generic.PHP.LowerCaseType now supports checking of typed properties - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Generic.PHP.LowerCaseType now supports checking of union types - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- PEAR.Commenting.FunctionComment and Squiz.Commenting.FunctionComment sniffs can now ignore private and protected methods - - Set the "minimumVisibility" sniff property to "protected" to ignore private methods - - Set the "minimumVisibility" sniff property to "public" to ignore both private and protected methods - - The default remains at "private", so all methods are checked - - Thanks to [Vincent Langlet][@VincentLanglet] for the patch -- PEAR.Commenting.FunctionComment and Squiz.Commenting.FunctionComment sniffs can now ignore return tags in any method - - Previously, only `__construct()` and `__destruct()` were ignored - - Set the list of method names to ignore in the "specialMethods" sniff property - - The default remains at "__construct" and "__destruct" only - - Thanks to [Vincent Langlet][@VincentLanglet] for the patch -- PSR2.ControlStructures.SwitchDeclaration now supports nested switch statements where every branch terminates - - Previously, if a CASE only contained a SWITCH and no direct terminating statement, a fall-through error was displayed - - Now, the error is suppressed if every branch of the SWITCH has a terminating statement - - Thanks to [Vincent Langlet][@VincentLanglet] for the patch -- The PSR2.Methods.FunctionCallSignature.SpaceBeforeCloseBracket error message is now reported on the closing parenthesis token - - Previously, the error was being reported on the function keyword, leading to confusing line numbers in the error report -- Squiz.Commenting.FunctionComment is now able to ignore function comments that are only inheritdoc statements - - Set the skipIfInheritdoc sniff property to "true" to skip checking function comments if the content is only {@inhertidoc} - - The default remains at "false", so these comments will continue to report errors - - Thanks to [Jess Myrbo][@xjm] for the patch -- Squiz.Commenting.FunctionComment now supports the PHP 8 mixed type - - Thanks to [Vadim Borodavko][@javer] for the patch -- Squiz.PHP.NonExecutableCode now has improved handling of syntax errors - - Thanks to [Thiemo Kreuz][@thiemowmde] for the patch -- Squiz.WhiteSpace.ScopeKeywordSpacing now checks spacing when using PHP 8.0 constructor property promotion - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch - -### Fixed -- Fixed an issue that could occur when checking files on network drives, such as with WSL2 on Windows 10 - - This works around a long-standing PHP bug with is_readable() - - Thanks to [Michael S][@codebymikey] for the patch -- Fixed a number of false positives in the Squiz.PHP.DisallowMultipleAssignments sniff - - Sniff no longer errors for default value assignments in arrow functions - - Sniff no longer errors for assignments on first line of closure - - Sniff no longer errors for assignments after a goto label - - Thanks to [Jaroslav Hanslík][@kukulich] for the patch -- Fixed bug [#2913][sq-2913] : Generic.WhiteSpace.ScopeIndent false positive when opening and closing tag on same line inside conditional -- Fixed bug [#2992][sq-2992] : Enabling caching using a ruleset produces invalid cache files when using --sniffs and --exclude CLI args -- Fixed bug [#3003][sq-3003] : Squiz.Formatting.OperatorBracket autofix incorrect when assignment used with null coalescing operator -- Fixed bug [#3145][sq-3145] : Autoloading of sniff fails when multiple classes declared in same file -- Fixed bug [#3157][sq-3157] : PSR2.ControlStructures.SwitchDeclaration.BreakIndent false positive when case keyword is not indented -- Fixed bug [#3163][sq-3163] : Undefined index error with pre-commit hook using husky on PHP 7.4 - - Thanks to [Ismo Vuorinen][@ivuorinen] for the patch -- Fixed bug [#3165][sq-3165] : Squiz.PHP.DisallowComparisonAssignment false positive when comparison inside closure -- Fixed bug [#3167][sq-3167] : Generic.WhiteSpace.ScopeIndent false positive when using PHP 8.0 constructor property promotion -- Fixed bug [#3170][sq-3170] : Squiz.WhiteSpace.OperatorSpacing false positive when using negation with string concat - - This also fixes the same issue in the PSR12.Operators.OperatorSpacing sniff -- Fixed bug [#3177][sq-3177] : Incorrect tokenization of GOTO statements in mixed PHP/HTML files - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3184][sq-3184] : PSR2.Namespace.NamespaceDeclaration false positive on namespace operator - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3188][sq-3188] : Squiz.WhiteSpace.ScopeKeywordSpacing false positive for static return type - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3192][sq-3192] : findStartOfStatement doesn't work correctly inside switch - - Thanks to [Vincent Langlet][@VincentLanglet] for the patch -- Fixed bug [#3195][sq-3195] : Generic.WhiteSpace.ScopeIndent confusing message when combination of tabs and spaces found -- Fixed bug [#3197][sq-3197] : Squiz.NamingConventions.ValidVariableName does not use correct error code for all member vars -- Fixed bug [#3219][sq-3219] : Generic.Formatting.MultipleStatementAlignment false positive for empty anonymous classes and closures -- Fixed bug [#3258][sq-3258] : Squiz.Formatting.OperatorBracket duplicate error messages for unary minus - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3273][sq-3273] : Squiz.Functions.FunctionDeclarationArgumentSpacing reports line break as 0 spaces between parenthesis -- Fixed bug [#3277][sq-3277] : Nullable static return typehint causes whitespace error -- Fixed bug [#3284][sq-3284] : Unused parameter false positive when using array index in arrow function - -[sq-2913]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2913 -[sq-2992]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2992 -[sq-3003]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3003 -[sq-3145]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3145 -[sq-3157]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3157 -[sq-3163]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3163 -[sq-3165]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3165 -[sq-3167]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3167 -[sq-3170]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3170 -[sq-3177]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3177 -[sq-3184]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3184 -[sq-3188]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3188 -[sq-3192]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3192 -[sq-3195]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3195 -[sq-3197]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3197 -[sq-3219]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3219 -[sq-3258]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3258 -[sq-3273]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3273 -[sq-3277]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3277 -[sq-3284]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3284 - -## [3.5.8] - 2020-10-23 - -### Removed -- Reverted a change to the way include/exclude patterns are processed for STDIN content - - This change is not backwards compatible and will be re-introduced in version 3.6.0 - -## [3.5.7] - 2020-10-23 - -### Added -- The PHP 8.0 T_NULLSAFE_OBJECT_OPERATOR token has been made available for older versions - - Existing sniffs that check for T_OBJECT_OPERATOR have been modified to apply the same rules for the nullsafe object operator - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- The new method of PHP 8.0 tokenizing for namespaced names has been reverted to the pre 8.0 method - - This maintains backwards compatible for existing sniffs on PHP 8.0 - - This change will be removed in PHPCS 4.0 as the PHP 8.0 tokenizing method will be backported for pre 8.0 versions - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Added support for changes to the way PHP 8.0 tokenizes hash comments - - The existing PHP 5-7 behaviour has been replicated for version 8, so no sniff changes are required - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Running the unit tests now includes warnings in the found and fixable error code counts - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- PSR12.Functions.NullableTypeDeclaration now supports the PHP8 static return type - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch - -### Changed -- The autoloader has been changed to fix sniff class name detection issues that may occur when running on PHP 7.4+ - - Thanks to [Eloy Lafuente][@stronk7] for the patch -- PSR12.ControlStructures.BooleanOperatorPlacement.FoundMixed error message is now more accurate when using the allowOnly setting - - Thanks to [Vincent Langlet][@VincentLanglet] for the patch - -### Fixed -- Fixed Squiz.Formatting.OperatorBracket false positive when exiting with a negative number -- Fixed Squiz.PHP.DisallowComparisonAssignment false positive for methods called on an object -- Fixed bug [#2882][sq-2882] : Generic.Arrays.ArrayIndent can request close brace indent to be less than the statement indent level -- Fixed bug [#2883][sq-2883] : Generic.WhiteSpace.ScopeIndent.Incorrect issue after NOWDOC -- Fixed bug [#2975][sq-2975] : Undefined offset in PSR12.Functions.ReturnTypeDeclaration when checking function return type inside ternary -- Fixed bug [#2988][sq-2988] : Undefined offset in Squiz.Strings.ConcatenationSpacing during live coding - - Thanks to [Thiemo Kreuz][@thiemowmde] for the patch -- Fixed bug [#2989][sq-2989] : Incorrect auto-fixing in Generic.ControlStructures.InlineControlStructure during live coding - - Thanks to [Thiemo Kreuz][@thiemowmde] for the patch -- Fixed bug [#3007][sq-3007] : Directory exclude pattern improperly excludes directories with names that start the same - - Thanks to [Steve Talbot][@SteveTalbot] for the patch -- Fixed bug [#3043][sq-3043] : Squiz.WhiteSpace.OperatorSpacing false positive for negation in arrow function - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3049][sq-3049] : Incorrect error with arrow function and parameter passed as reference - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3053][sq-3053] : PSR2 incorrect fix when multiple use statements on same line do not have whitespace between them -- Fixed bug [#3058][sq-3058] : Progress gets unaligned when 100% happens at the end of the available dots -- Fixed bug [#3059][sq-3059] : Squiz.Arrays.ArrayDeclaration false positive when using type casting - - Thanks to [Sergei Morozov][@morozov] for the patch -- Fixed bug [#3060][sq-3060] : Squiz.Arrays.ArrayDeclaration false positive for static functions - - Thanks to [Sergei Morozov][@morozov] for the patch -- Fixed bug [#3065][sq-3065] : Should not fix Squiz.Arrays.ArrayDeclaration.SpaceBeforeComma if comment between element and comma - - Thanks to [Sergei Morozov][@morozov] for the patch -- Fixed bug [#3066][sq-3066] : No support for namespace operator used in type declarations - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3075][sq-3075] : PSR12.ControlStructures.BooleanOperatorPlacement false positive when operator is the only content on line -- Fixed bug [#3099][sq-3099] : Squiz.WhiteSpace.OperatorSpacing false positive when exiting with negative number - - Thanks to [Sergei Morozov][@morozov] for the patch -- Fixed bug [#3102][sq-3102] : PSR12.Squiz.OperatorSpacing false positive for default values of arrow functions - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#3124][sq-3124] : PSR-12 not reporting error for empty lines with only whitespace -- Fixed bug [#3135][sq-3135] : Ignore annotations are broken on PHP 8.0 - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch - -[sq-2882]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2882 -[sq-2883]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2883 -[sq-2975]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2975 -[sq-2988]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2988 -[sq-2989]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2989 -[sq-3007]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3007 -[sq-3043]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3043 -[sq-3049]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3049 -[sq-3053]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3053 -[sq-3058]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3058 -[sq-3059]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3059 -[sq-3060]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3060 -[sq-3065]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3065 -[sq-3066]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3066 -[sq-3075]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3075 -[sq-3099]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3099 -[sq-3102]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3102 -[sq-3124]: https://github.com/squizlabs/PHP_CodeSniffer/issues/3124 -[sq-3135]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3135 - -## [3.5.6] - 2020-08-10 - -### Added -- Added support for PHP 8.0 magic constant dereferencing - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Added support for changes to the way PHP 8.0 tokenizes comments - - The existing PHP 5-7 behaviour has been replicated for version 8, so no sniff changes are required - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- `File::getMethodProperties()` now detects the PHP 8.0 static return type - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- The PHP 8.0 static return type is now supported for arrow functions - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch - -### Changed -- The cache is no longer used if the list of loaded PHP extensions changes - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- `Generic.NamingConventions.CamelCapsFunctionName` no longer reports `__serialize` and `__unserialize` as invalid names - - Thanks to [Filip Š][@filips123] for the patch -- `PEAR.NamingConventions.ValidFunctionName` no longer reports `__serialize` and `__unserialize` as invalid names - - Thanks to [Filip Š][@filips123] for the patch -- `Squiz.Scope.StaticThisUsage` now detects usage of `$this` inside closures and arrow functions - - Thanks to [Michał Bundyra][@michalbundyra] for the patch - -### Fixed -- Fixed bug [#2877][sq-2877] : PEAR.Functions.FunctionCallSignature false positive for array of functions - - Thanks to [Vincent Langlet][@VincentLanglet] for the patch -- Fixed bug [#2888][sq-2888] : PSR12.Files.FileHeader blank line error with multiple namespaces in one file -- Fixed bug [#2926][sq-2926] : phpcs hangs when using arrow functions that return heredoc -- Fixed bug [#2943][sq-2943] : Redundant semicolon added to a file when fixing PSR2.Files.ClosingTag.NotAllowed -- Fixed bug [#2967][sq-2967] : Markdown generator does not output headings correctly - - Thanks to [Petr Bugyík][@o5] for the patch -- Fixed bug [#2977][sq-2977] : File::isReference() does not detect return by reference for closures - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#2994][sq-2994] : Generic.Formatting.DisallowMultipleStatements false positive for FOR loop with no body -- Fixed bug [#3033][sq-3033] : Error generated during tokenizing of goto statements on PHP 8 - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch - -[sq-2877]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2877 -[sq-2888]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2888 -[sq-2926]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2926 -[sq-2943]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2943 -[sq-2967]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2967 -[sq-2977]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2977 -[sq-2994]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2994 -[sq-3033]: https://github.com/squizlabs/PHP_CodeSniffer/pull/3033 - -## [3.5.5] - 2020-04-17 - -### Changed -- The T_FN backfill now works more reliably so T_FN tokens only ever represent real arrow functions - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed an issue where including sniffs using paths containing multiple dots would silently fail -- Generic.CodeAnalysis.EmptyPHPStatement now detects empty statements at the start of control structures - -### Fixed -- Error wording in PEAR.Functions.FunctionCallSignature now always uses "parenthesis" instead of sometimes using "bracket" - - Thanks to [Vincent Langlet][@VincentLanglet] for the patch -- Fixed bug [#2787][sq-2787] : Squiz.PHP.DisallowMultipleAssignments not ignoring typed property declarations - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#2810][sq-2810] : PHPCBF fails to fix file with empty statement at start on control structure -- Fixed bug [#2812][sq-2812] : Squiz.Arrays.ArrayDeclaration not detecting some arrays with multiple arguments on the same line - - Thanks to [Jakub Chábek][@grongor] for the patch -- Fixed bug [#2826][sq-2826] : Generic.WhiteSpace.ArbitraryParenthesesSpacing doesn't detect issues for statements directly after a control structure - - Thanks to [Vincent Langlet][@VincentLanglet] for the patch -- Fixed bug [#2848][sq-2848] : PSR12.Files.FileHeader false positive for file with mixed PHP and HTML and no file header -- Fixed bug [#2849][sq-2849] : Generic.WhiteSpace.ScopeIndent false positive with arrow function inside array -- Fixed bug [#2850][sq-2850] : Generic.PHP.LowerCaseKeyword complains __HALT_COMPILER is uppercase -- Fixed bug [#2853][sq-2853] : Undefined variable error when using Info report - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#2865][sq-2865] : Double arrow tokenized as T_STRING when placed after function named "fn" -- Fixed bug [#2867][sq-2867] : Incorrect scope matching when arrow function used inside IF condition -- Fixed bug [#2868][sq-2868] : phpcs:ignore annotation doesn't work inside a docblock -- Fixed bug [#2878][sq-2878] : PSR12.Files.FileHeader conflicts with Generic.Files.LineEndings -- Fixed bug [#2895][sq-2895] : PSR2.Methods.FunctionCallSignature.MultipleArguments false positive with arrow function argument - -[sq-2787]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2787 -[sq-2810]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2810 -[sq-2812]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2812 -[sq-2826]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2826 -[sq-2848]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2848 -[sq-2849]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2849 -[sq-2850]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2850 -[sq-2853]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2853 -[sq-2865]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2865 -[sq-2867]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2867 -[sq-2868]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2868 -[sq-2878]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2878 -[sq-2895]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2895 - -## [3.5.4] - 2020-01-31 - -### Changed -- The PHP 7.4 numeric separator backfill now works correctly for more float formats - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- The PHP 7.4 numeric separator backfill is no longer run on PHP version 7.4.0 or greater -- File::getCondition() now accepts a 3rd argument that allows for the closest matching token to be returned - - By default, it continues to return the first matched token found from the top of the file -- Fixed detection of array return types for arrow functions -- Added Generic.PHP.DisallowRequestSuperglobal to ban the use of the $_REQUEST superglobal - - Thanks to [Jeantwan Teuma][@Morerice] for the contribution -- Generic.ControlStructures.InlineControlStructure no longer shows errors for WHILE and FOR statements without a body - - Previously it required these to have curly braces, but there were no statements to enclose in them - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- PSR12.ControlStructures.BooleanOperatorPlacement can now be configured to enforce a specific operator position - - By default, the sniff ensures that operators are all at the beginning or end of lines, but not a mix of both - - Set the allowOnly property to "first" to enforce all boolean operators to be at the start of a line - - Set the allowOnly property to "last" to enforce all boolean operators to be at the end of a line - - Thanks to [Vincent Langlet][@VincentLanglet] for the patch -- PSR12.Files.ImportStatement now auto-fixes import statements by removing the leading slash - - Thanks to [Michał Bundyra][@michalbundyra] for the patch -- Squiz.ControlStructures.ForLoopDeclaration now has a setting to ignore newline characters - - Default remains FALSE, so newlines are not allowed within FOR definitions - - Override the "ignoreNewlines" setting in a ruleset.xml file to change -- Squiz.PHP.InnerFunctions now handles multiple nested anon classes correctly - -### Fixed -- Fixed bug [#2497][sq-2497] : Sniff properties not set when referencing a sniff using relative paths or non-native slashes - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#2657][sq-2657] : Squiz.WhiteSpace.FunctionSpacing can remove spaces between comment and first/last method during auto-fixing - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#2688][sq-2688] : Case statements not tokenized correctly when switch is contained within ternary -- Fixed bug [#2698][sq-2698] : PHPCS throws errors determining auto report width when shell_exec is disabled - - Thanks to [Matthew Peveler][@MasterOdin] for the patch -- Fixed bug [#2730][sq-2730] : PSR12.ControlStructures.ControlStructureSpacing does not ignore comments between conditions - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#2732][sq-2732] : PSR12.Files.FileHeader misidentifies file header in mixed content file -- Fixed bug [#2745][sq-2745] : AbstractArraySniff wrong indices when mixed coalesce and ternary values - - Thanks to [Michał Bundyra][@michalbundyra] for the patch -- Fixed bug [#2748][sq-2748] : Wrong end of statement for fn closures - - Thanks to [Michał Bundyra][@michalbundyra] for the patch -- Fixed bug [#2751][sq-2751] : Autoload relative paths first to avoid confusion with files from the global include path - - Thanks to [Klaus Purer][@klausi] for the patch -- Fixed bug [#2763][sq-2763] : PSR12 standard reports errors for multi-line FOR definitions -- Fixed bug [#2768][sq-2768] : Generic.Files.LineLength false positive for non-breakable strings at exactly the soft limit - - Thanks to [Alex Miles][@ghostal] for the patch -- Fixed bug [#2773][sq-2773] : PSR2.Methods.FunctionCallSignature false positive when arrow function has array return type -- Fixed bug [#2790][sq-2790] : PSR12.Traits.UseDeclaration ignores block comments - - Thanks to [Vincent Langlet][@VincentLanglet] for the patch -- Fixed bug [#2791][sq-2791] : PSR12.Functions.NullableTypeDeclaration false positive when ternary operator used with instanceof - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#2802][sq-2802] : Can't specify a report file path using the tilde shortcut -- Fixed bug [#2804][sq-2804] : PHP4-style typed properties not tokenized correctly - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#2805][sq-2805] : Undefined Offset notice during live coding of arrow functions - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#2843][sq-2843] : Tokenizer does not support alternative syntax for declare statements - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch - -[sq-2497]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2497 -[sq-2657]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2657 -[sq-2688]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2688 -[sq-2698]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2698 -[sq-2730]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2730 -[sq-2732]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2732 -[sq-2745]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2745 -[sq-2748]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2748 -[sq-2751]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2751 -[sq-2763]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2763 -[sq-2768]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2768 -[sq-2773]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2773 -[sq-2790]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2790 -[sq-2791]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2791 -[sq-2802]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2802 -[sq-2804]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2804 -[sq-2805]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2805 -[sq-2843]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2843 - -## [3.5.3] - 2019-12-04 - -### Changed -- The PHP 7.4 T_FN token has been made available for older versions - - T_FN represents the fn string used for arrow functions - - The double arrow becomes the scope opener, and uses a new T_FN_ARROW token type - - The token after the statement (normally a semicolon) becomes the scope closer - - The token is also associated with the opening and closing parenthesis of the statement - - Any functions named "fn" will have a T_FN token for the function name, but have no scope information - - Thanks to [Michał Bundyra][@michalbundyra] for the help with this change -- PHP 7.4 numeric separators are now tokenized in the same way when using older PHP versions - - Previously, a number like 1_000 would tokenize as T_LNUMBER (1), T_STRING (_000) - - Now, the number tokenizes as T_LNUMBER (1_000) - - Sniff developers should consider how numbers with underscores impact their custom sniffs -- The PHPCS file cache now takes file permissions into account - - The cache is now invalidated for a file when its permissions are changed -- File::getMethodParameters() now supports arrow functions -- File::getMethodProperties() now supports arrow functions -- Added Fixer::changeCodeBlockIndent() to change the indent of a code block while auto-fixing - - Can be used to either increase or decrease the indent - - Useful when moving the start position of something like a closure, where you want the content to also move -- Added Generic.Files.ExecutableFile sniff - - Ensures that files are not executable - - Thanks to [Matthew Peveler][@MasterOdin] for the contribution -- Generic.CodeAnalysis.EmptyPhpStatement now reports unnecessary semicolons after control structure closing braces - - Thanks to [Vincent Langlet][@VincentLanglet] for the patch -- Generic.PHP.LowerCaseKeyword now enforces that the "fn" keyword is lowercase - - Thanks to [Michał Bundyra][@michalbundyra] for the patch -- Generic.WhiteSpace.ScopeIndent now supports static arrow functions -- PEAR.Functions.FunctionCallSignature now adjusts the indent of function argument contents during auto-fixing - - Previously, only the first line of an argument was changed, leading to inconsistent indents - - This change also applies to PSR2.Methods.FunctionCallSignature -- PSR2.ControlStructures.ControlStructureSpacing now checks whitespace before the closing parenthesis of multi-line control structures - - Previously, it incorrectly applied the whitespace check for single-line definitions only -- PSR12.Functions.ReturnTypeDeclaration now checks the return type of arrow functions - - Thanks to [Michał Bundyra][@michalbundyra] for the patch -- PSR12.Traits.UseDeclaration now ensures all trait import statements are grouped together - - Previously, the trait import section of the class ended when the first non-import statement was found - - Checking now continues throughout the class to ensure all statements are grouped together - - This also ensures that empty lines are not requested after an import statement that isn't the last one -- Squiz.Functions.LowercaseFunctionKeywords now enforces that the "fn" keyword is lowercase - - Thanks to [Michał Bundyra][@michalbundyra] for the patch - -### Fixed -- Fixed bug [#2586][sq-2586] : Generic.WhiteSpace.ScopeIndent false positives when indenting open tags at a non tab-stop -- Fixed bug [#2638][sq-2638] : Squiz.CSS.DuplicateClassDefinitionSniff sees comments as part of the class name - - Thanks to [Raphael Horber][@rhorber] for the patch -- Fixed bug [#2640][sq-2640] : Squiz.WhiteSpace.OperatorSpacing false positives for some negation operators - - Thanks to [Jakub Chábek][@grongor] and [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#2674][sq-2674] : Squiz.Functions.FunctionDeclarationArgumentSpacing prints wrong argument name in error message -- Fixed bug [#2676][sq-2676] : PSR12.Files.FileHeader locks up when file ends with multiple inline comments -- Fixed bug [#2678][sq-2678] : PSR12.Classes.AnonClassDeclaration incorrectly enforcing that closing brace be on a line by itself -- Fixed bug [#2685][sq-2685] : File::getMethodParameters() setting typeHintEndToken for vars with no type hint - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#2694][sq-2694] : AbstractArraySniff produces invalid indices when using ternary operator - - Thanks to [Michał Bundyra][@michalbundyra] for the patch -- Fixed bug [#2702][sq-2702] : Generic.WhiteSpace.ScopeIndent false positive when using ternary operator with short arrays - -[sq-2586]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2586 -[sq-2638]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2638 -[sq-2640]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2640 -[sq-2674]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2674 -[sq-2676]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2676 -[sq-2678]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2678 -[sq-2685]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2685 -[sq-2694]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2694 -[sq-2702]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2702 - -## [3.5.2] - 2019-10-28 - -### Changed -- Generic.ControlStructures.DisallowYodaConditions now returns less false positives - - False positives were being returned for array comparisons, or when performing some function calls -- Squiz.WhiteSpace.SemicolonSpacing.Incorrect error message now escapes newlines and tabs - - Provides a clearer error message as whitespace is now visible - - Also allows for better output for report types such as CSV and XML -- The error message for PSR12.Files.FileHeader.SpacingAfterBlock has been made clearer - - It now uses the wording from the published PSR-12 standard to indicate that blocks must be separated by a blank line - - Thanks to [Craig Duncan][@duncan3dc] for the patch - -### Fixed -- Fixed bug [#2654][sq-2654] : Incorrect indentation for arguments of multiline function calls -- Fixed bug [#2656][sq-2656] : Squiz.WhiteSpace.MemberVarSpacing removes comments before first member var during auto fixing - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#2663][sq-2663] : Generic.NamingConventions.ConstructorName complains about old constructor in interfaces -- Fixed bug [#2664][sq-2664] : PSR12.Files.OpenTag incorrectly identifies PHP file with only an opening tag -- Fixed bug [#2665][sq-2665] : PSR12.Files.ImportStatement should not apply to traits -- Fixed bug [#2673][sq-2673] : PSR12.Traits.UseDeclaration does not allow comments or blank lines between use statements - -[sq-2654]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2654 -[sq-2656]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2656 -[sq-2663]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2663 -[sq-2664]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2664 -[sq-2665]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2665 -[sq-2673]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2673 - -## [3.5.1] - 2019-10-17 - -### Changed -- Very very verbose diff report output has slightly changed to improve readability - - Output is printed when running PHPCS with the --report=diff and -vvv command line arguments - - Fully qualified class names have been replaced with sniff codes - - Tokens being changed now display the line number they are on -- PSR2, PSR12, and PEAR standards now correctly check for blank lines at the start of function calls - - This check has been missing from these standards, but has now been implemented - - When using the PEAR standard, the error code is PEAR.Functions.FunctionCallSignature.FirstArgumentPosition - - When using PSR2 or PSR12, the error code is PSR2.Methods.FunctionCallSignature.FirstArgumentPosition -- PSR12.ControlStructures.BooleanOperatorPlacement no longer complains when multiple expressions appear on the same line - - Previously, boolean operators were enforced to appear at the start or end of lines only - - Boolean operators can now appear in the middle of the line -- PSR12.Files.FileHeader no longer ignores comments preceding a use, namespace, or declare statement -- PSR12.Files.FileHeader now allows a hashbang line at the top of the file - -### Fixed -- Fixed bug [#2506][sq-2506] : PSR2 standard can't auto fix multi-line function call inside a string concat statement -- Fixed bug [#2530][sq-2530] : PEAR.Commenting.FunctionComment does not support intersection types in comments -- Fixed bug [#2615][sq-2615] : Constant visibility false positive on non-class constants -- Fixed bug [#2616][sq-2616] : PSR12.Files.FileHeader false positive when file only contains docblock -- Fixed bug [#2619][sq-2619] : PSR12.Files.FileHeader locks up when inline comment is the last content in a file -- Fixed bug [#2621][sq-2621] : PSR12.Classes.AnonClassDeclaration.CloseBraceSameLine false positive for anon class passed as function argument - - Thanks to [Martins Sipenko][@martinssipenko] for the patch -- Fixed bug [#2623][sq-2623] : PSR12.ControlStructures.ControlStructureSpacing not ignoring indentation inside multi-line string arguments -- Fixed bug [#2624][sq-2624] : PSR12.Traits.UseDeclaration doesnt apply the correct indent during auto fixing -- Fixed bug [#2626][sq-2626] : PSR12.Files.FileHeader detects @var annotations as file docblocks -- Fixed bug [#2628][sq-2628] : PSR12.Traits.UseDeclaration does not allow comments above a USE declaration -- Fixed bug [#2632][sq-2632] : Incorrect indentation of lines starting with "static" inside closures -- Fixed bug [#2641][sq-2641] : PSR12.Functions.NullableTypeDeclaration false positive when using new static() - -[sq-2506]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2506 -[sq-2530]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2530 -[sq-2615]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2615 -[sq-2616]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2616 -[sq-2619]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2619 -[sq-2621]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2621 -[sq-2623]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2623 -[sq-2624]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2624 -[sq-2626]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2626 -[sq-2628]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2628 -[sq-2632]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2632 -[sq-2641]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2641 - -## [3.5.0] - 2019-09-27 - -### Changed -- The included PSR12 standard is now complete and ready to use - - Check your code using PSR-12 by running PHPCS with --standard=PSR12 -- Added support for PHP 7.4 typed properties - - The nullable operator is now tokenized as T_NULLABLE inside property types, as it is elsewhere - - To get the type of a member var, use the File::getMemberProperties() method, which now contains a "type" array index - - This contains the type of the member var, or a blank string if not specified - - If the type is nullable, the return type will contain the leading ? - - If a type is specified, the position of the first token in the type will be set in a "type_token" array index - - If a type is specified, the position of the last token in the type will be set in a "type_end_token" array index - - If the type is nullable, a "nullable_type" array index will also be set to TRUE - - If the type contains namespace information, it will be cleaned of whitespace and comments in the return value -- The PSR1 standard now correctly bans alternate PHP tags - - Previously, it only banned short open tags and not the pre-7.0 alternate tags -- Added support for only checking files that have been locally staged in a git repo - - Use --filter=gitstaged to check these files - - You still need to give PHPCS a list of files or directories in which to apply the filter - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the contribution -- JSON reports now end with a newline character -- The phpcs.xsd schema now validates phpcs-only and phpcbf-only attributes correctly - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- The tokenizer now correctly identifies inline control structures in more cases -- All helper methods inside the File class now throw RuntimeException instead of TokenizerException - - Some tokenizer methods were also throwing RuntimeException but now correctly throw TokenizerException - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- The File::getMethodParameters() method now returns more information, and supports closure USE groups - - If a type hint is specified, the position of the last token in the hint will be set in a "type_hint_end_token" array index - - If a default is specified, the position of the first token in the default value will be set in a "default_token" array index - - If a default is specified, the position of the equals sign will be set in a "default_equal_token" array index - - If the param is not the last, the position of the comma will be set in a "comma_token" array index - - If the param is passed by reference, the position of the reference operator will be set in a "reference_token" array index - - If the param is variable length, the position of the variadic operator will be set in a "variadic_token" array index -- The T_LIST token and it's opening and closing parentheses now contain references to each other in the tokens array - - Uses the same parenthesis_opener/closer/owner indexes as other tokens - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- The T_ANON_CLASS token and it's opening and closing parentheses now contain references to each other in the tokens array - - Uses the same parenthesis_opener/closer/owner indexes as other tokens - - Only applicable if the anon class is passing arguments to the constructor - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- The PHP 7.4 T_BAD_CHARACTER token has been made available for older versions - - Allows you to safely look for this token, but it will not appear unless checking with PHP 7.4+ -- Metrics are now available for Squiz.WhiteSpace.FunctionSpacing - - Use the "info" report to see blank lines before/after functions - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Metrics are now available for Squiz.WhiteSpace.MemberVarSpacing - - Use the "info" report to see blank lines before member vars - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Added Generic.ControlStructures.DisallowYodaConditions sniff - - Ban the use of Yoda conditions - - Thanks to [Mponos George][@gmponos] for the contribution -- Added Generic.PHP.RequireStrictTypes sniff - - Enforce the use of a strict types declaration in PHP files -- Added Generic.WhiteSpace.SpreadOperatorSpacingAfter sniff - - Checks whitespace between the spread operator and the variable/function call it applies to - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the contribution -- Added PSR12.Classes.AnonClassDeclaration sniff - - Enforces the formatting of anonymous classes -- Added PSR12.Classes.ClosingBrace sniff - - Enforces that closing braces of classes/interfaces/traits/functions are not followed by a comment or statement -- Added PSR12.ControlStructures.BooleanOperatorPlacement sniff - - Enforces that boolean operators between conditions are consistently at the start or end of the line -- Added PSR12.ControlStructures.ControlStructureSpacing sniff - - Enforces that spacing and indents are correct inside control structure parenthesis -- Added PSR12.Files.DeclareStatement sniff - - Enforces the formatting of declare statements within a file -- Added PSR12.Files.FileHeader sniff - - Enforces the order and formatting of file header blocks -- Added PSR12.Files.ImportStatement sniff - - Enforces the formatting of import statements within a file -- Added PSR12.Files.OpenTag sniff - - Enforces that the open tag is on a line by itself when used at the start of a PHP-only file -- Added PSR12.Functions.ReturnTypeDeclaration sniff - - Enforces the formatting of return type declarations in functions and closures -- Added PSR12.Properties.ConstantVisibility sniff - - Enforces that constants must have their visibility defined - - Uses a warning instead of an error due to this conditionally requiring the project to support PHP 7.1+ -- Added PSR12.Traits.UseDeclaration sniff - - Enforces the formatting of trait import statements within a class -- Generic.Files.LineLength ignoreComments property now ignores comments at the end of a line - - Previously, this property was incorrectly causing the sniff to ignore any line that ended with a comment - - Now, the trailing comment is not included in the line length, but the rest of the line is still checked -- Generic.Files.LineLength now only ignores unwrappable comments when the comment is on a line by itself - - Previously, a short unwrappable comment at the end of the line would have the sniff ignore the entire line -- Generic.Functions.FunctionCallArgumentSpacing no longer checks spacing around assignment operators inside function calls - - Use the Squiz.WhiteSpace.OperatorSpacing sniff to enforce spacing around assignment operators - - Note that this sniff checks spacing around all assignment operators, not just inside function calls - - The Generic.Functions.FunctionCallArgumentSpacing.NoSpaceBeforeEquals error has been removed - - Use Squiz.WhiteSpace.OperatorSpacing.NoSpaceBefore instead - - The Generic.Functions.FunctionCallArgumentSpacing.NoSpaceAfterEquals error has been removed - - Use Squiz.WhiteSpace.OperatorSpacing.NoSpaceAfter instead - - This also changes the PEAR/PSR2/PSR12 standards so they no longer check assignment operators inside function calls - - They were previously checking these operators when they should not have - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Generic.WhiteSpace.ScopeIndent no longer performs exact indents checking for chained method calls - - Other sniffs can be used to enforce chained method call indent rules - - Thanks to [Pieter Frenssen][@pfrenssen] for the patch -- PEAR.WhiteSpace.ObjectOperatorIndent now supports multi-level chained statements - - When enabled, chained calls must be indented 1 level more or less than the previous line - - Set the new "multilevel" setting to TRUE in a ruleset.xml file to enable this behaviour - - Thanks to [Marcos Passos][@marcospassos] for the patch -- PSR2.ControlStructures.ControlStructureSpacing now allows whitespace after the opening parenthesis if followed by a comment - - Thanks to [Michał Bundyra][@michalbundyra] for the patch -- PSR2.Classes.PropertyDeclaration now enforces a single space after a property type keyword - - The PSR2 standard itself excludes this new check as it is not defined in the written standard - - Using the PSR12 standard will enforce this check -- Squiz.Commenting.BlockComment no longer requires blank line before comment if it's the first content after the PHP open tag - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.Functions.FunctionDeclarationArgumentSpacing now has more accurate error messages - - This includes renaming the SpaceAfterDefault error code to SpaceAfterEquals, which reflects the real error -- Squiz.Functions.FunctionDeclarationArgumentSpacing now checks for no space after a reference operator - - If you don't want this new behaviour, exclude the SpacingAfterReference error message in a ruleset.xml file -- Squiz.Functions.FunctionDeclarationArgumentSpacing now checks for no space after a variadic operator - - If you don't want this new behaviour, exclude the SpacingAfterVariadic error message in a ruleset.xml file -- Squiz.Functions.MultiLineFunctionDeclaration now has improved fixing for the FirstParamSpacing and UseFirstParamSpacing errors -- Squiz.Operators.IncrementDecrementUsage now suggests pre-increment of variables instead of post-increment - - This change does not enforce pre-increment over post-increment; only the suggestion has changed - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.PHP.DisallowMultipleAssignments now has a second error code for when assignments are found inside control structure conditions - - The new error code is Squiz.PHP.DisallowMultipleAssignments.FoundInControlStructure - - All other multiple assignment cases use the existing error code Squiz.PHP.DisallowMultipleAssignments.Found - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.WhiteSpace.FunctionSpacing now applies beforeFirst and afterLast spacing rules to nested functions - - Previously, these rules only applied to the first and last function in a class, interface, or trait - - These rules now apply to functions nested in any statement block, including other functions and conditions -- Squiz.WhiteSpace.OperatorSpacing now has improved handling of parse errors - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.WhiteSpace.OperatorSpacing now checks spacing around the instanceof operator - - Thanks to [Jakub Chábek][@grongor] for the patch -- Squiz.WhiteSpace.OperatorSpacing can now enforce a single space before assignment operators - - Previously, the sniff this spacing as multiple assignment operators are sometimes aligned - - Now, you can set the ignoreSpacingBeforeAssignments sniff property to FALSE to enable checking - - Default remains TRUE, so spacing before assignments is not checked by default - - Thanks to [Jakub Chábek][@grongor] for the patch - -### Fixed -- Fixed bug [#2391][sq-2391] : Sniff-specific ignore rules inside rulesets are filtering out too many files - - Thanks to [Juliette Reinders Folmer][@jrfnl] and [Willington Vega][@wvega] for the patch -- Fixed bug [#2478][sq-2478] : FunctionCommentThrowTag.WrongNumber when exception is thrown once but built conditionally -- Fixed bug [#2479][sq-2479] : Generic.WhiteSpace.ScopeIndent error when using array destructing with exact indent checking -- Fixed bug [#2498][sq-2498] : Squiz.Arrays.ArrayDeclaration.MultiLineNotAllowed autofix breaks heredoc -- Fixed bug [#2502][sq-2502] : Generic.WhiteSpace.ScopeIndent false positives with nested switch indentation and case fall-through -- Fixed bug [#2504][sq-2504] : Generic.WhiteSpace.ScopeIndent false positives with nested arrays and nowdoc string -- Fixed bug [#2511][sq-2511] : PSR2 standard not checking if closing paren of single-line function declaration is on new line -- Fixed bug [#2512][sq-2512] : Squiz.PHP.NonExecutableCode does not support alternate SWITCH control structure - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#2522][sq-2522] : Text generator throws error when code sample line is too long - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#2526][sq-2526] : XML report format has bad syntax on Windows - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#2529][sq-2529] : Generic.Formatting.MultipleStatementAlignment wrong error for assign in string concat -- Fixed bug [#2534][sq-2534] : Unresolvable installed_paths can lead to open_basedir errors - - Thanks to [Oliver Nowak][@ndm2] for the patch -- Fixed bug [#2541][sq-2541] : Text doc generator does not allow for multi-line rule explanations - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#2549][sq-2549] : Searching for a phpcs.xml file can throw warnings due to open_basedir restrictions - - Thanks to [Matthew Peveler][@MasterOdin] for the patch -- Fixed bug [#2558][sq-2558] : PHP 7.4 throwing offset syntax with curly braces is deprecated message - - Thanks to [Matthew Peveler][@MasterOdin] for the patch -- Fixed bug [#2561][sq-2561] : PHP 7.4 compatibility fix / implode argument order - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#2562][sq-2562] : Inline WHILE triggers SpaceBeforeSemicolon incorrectly - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#2565][sq-2565] : Generic.ControlStructures.InlineControlStructure confused by mixed short/long tags - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#2566][sq-2566] : Author tag email validation doesn't support all TLDs - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#2575][sq-2575] : Custom error messages don't have data replaced when cache is enabled -- Fixed bug [#2601][sq-2601] : Squiz.WhiteSpace.FunctionSpacing incorrect fix when spacing is 0 -- Fixed bug [#2608][sq-2608] : PSR2 throws errors for use statements when multiple namespaces are defined in a file - -[sq-2391]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2391 -[sq-2478]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2478 -[sq-2479]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2479 -[sq-2498]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2498 -[sq-2502]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2502 -[sq-2504]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2504 -[sq-2511]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2511 -[sq-2512]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2512 -[sq-2522]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2522 -[sq-2526]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2526 -[sq-2529]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2529 -[sq-2534]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2534 -[sq-2541]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2541 -[sq-2549]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2549 -[sq-2558]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2558 -[sq-2561]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2561 -[sq-2562]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2562 -[sq-2565]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2565 -[sq-2566]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2566 -[sq-2575]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2575 -[sq-2601]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2601 -[sq-2608]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2608 - -## [3.4.2] - 2019-04-11 - -### Changed -- Squiz.Arrays.ArrayDeclaration now has improved handling of syntax errors - -### Fixed -- Fixed an issue where the PCRE JIT on PHP 7.3 caused PHPCS to die when using the parallel option - - PHPCS now disables the PCRE JIT before running -- Fixed bug [#2368][sq-2368] : MySource.PHP.AjaxNullComparison throws error when first function has no doc comment -- Fixed bug [#2414][sq-2414] : Indention false positive in switch/case/if combination -- Fixed bug [#2423][sq-2423] : Squiz.Formatting.OperatorBracket.MissingBrackets error with static -- Fixed bug [#2450][sq-2450] : Indentation false positive when closure containing nested IF conditions used as function argument -- Fixed bug [#2452][sq-2452] : LowercasePHPFunctions sniff failing on "new \File()" -- Fixed bug [#2453][sq-2453] : Squiz.CSS.SemicolonSpacingSniff false positive when style name proceeded by an asterisk - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#2464][sq-2464] : Fixer conflict between Generic.WhiteSpace.ScopeIndent and Squiz.WhiteSpace.ScopeClosingBrace when class indented 1 space -- Fixed bug [#2465][sq-2465] : Excluding a sniff by path is not working -- Fixed bug [#2467][sq-2467] : PHP open/close tags inside CSS files are replaced with internal PHPCS token strings when auto fixing - -[sq-2368]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2368 -[sq-2414]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2414 -[sq-2423]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2423 -[sq-2450]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2450 -[sq-2452]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2452 -[sq-2453]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2453 -[sq-2464]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2464 -[sq-2465]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2465 -[sq-2467]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2467 - -## [3.4.1] - 2019-03-19 - -### Changed -- The PEAR installable version of PHPCS was missing some files, which have been re-included in this release - - The code report was not previously available for PEAR installs - - The Generic.Formatting.SpaceBeforeCast sniff was not previously available for PEAR installs - - The Generic.WhiteSpace.LanguageConstructSpacing sniff was not previously available for PEAR installs - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- PHPCS will now refuse to run if any of the required PHP extensions are not loaded - - Previously, PHPCS only relied on requirements being checked by PEAR and Composer - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Ruleset XML parsing errors are now displayed in a readable format so they are easier to correct - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- The PSR2 standard no longer throws duplicate errors for spacing around FOR loop parentheses - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- T_PHPCS_SET tokens now contain sniffCode, sniffProperty, and sniffPropertyValue indexes - - Sniffs can use this information instead of having to parse the token content manually -- Added more guard code for syntax errors to various CSS sniffs - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Generic.Commenting.DocComment error messages now contain the name of the comment tag that caused the error - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Generic.ControlStructures.InlineControlStructure now handles syntax errors correctly - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Generic.Debug.JSHint now longer requires rhino and can be run directly from the npm install - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Generic.Files.LineEndings no longer adds superfluous new line at the end of JS and CSS files - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Generic.Formatting.DisallowMultipleStatements no longer tries to fix lines containing phpcs:ignore statements - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Generic.Functions.FunctionCallArgumentSpacing now has improved performance and anonymous class support - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Generic.WhiteSpace.ScopeIndent now respects changes to the "exact" property using phpcs:set mid-way through a file - - This allows you to change the "exact" rule for only some parts of a file -- Generic.WhiteSpace.ScopeIndent now disables exact indent checking inside all arrays - - Previously, this was only done when using long array syntax, but it now works for short array syntax as well -- PEAR.Classes.ClassDeclaration now has improved handling of PHPCS annotations and tab indents -- PSR12.Classes.ClassInstantiation has changed its error code from MissingParenthesis to MissingParentheses -- PSR12.Keywords.ShortFormTypeKeywords now ignores all spacing inside type casts during both checking and fixing - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.Classes.LowercaseClassKeywords now examines the class keyword for anonymous classes - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.ControlStructures.ControlSignature now has improved handling of parse errors - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.Commenting.PostStatementComment fixer no longer adds a blank line at the start of a JS file that begins with a comment - - Fixes a conflict between this sniff and the Squiz.WhiteSpace.SuperfluousWhitespace sniff - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.Commenting.PostStatementComment now ignores comments inside control structure conditions, such as FOR loops - - Fixes a conflict between this sniff and the Squiz.ControlStructures.ForLoopDeclaration sniff - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.Commenting.FunctionCommentThrowTag now has improved support for unknown exception types and namespaces - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.ControlStructures.ForLoopDeclaration has improved whitespace, closure, and empty expression support - - The SpacingAfterSecondNoThird error code has been removed as part of these fixes - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.CSS.ClassDefinitionOpeningBraceSpace now handles comments and indentation correctly - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.CSS.ClassDefinitionClosingBrace now handles comments, indentation, and multiple statements on the same line correctly - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.CSS.Opacity now handles comments correctly - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.CSS.SemicolonSpacing now handles comments and syntax errors correctly - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.NamingConventions.ValidVariableName now supports variables inside anonymous classes correctly - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.PHP.LowercasePHPFunctions now handles use statements, namespaces, and comments correctly - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.WhiteSpace.FunctionSpacing now fixes function spacing correctly when a function is the first content in a file - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.WhiteSpace.SuperfluousWhitespace no longer throws errors for spacing between functions and properties in anon classes - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Zend.Files.ClosingTag no longer adds a semicolon during fixing of a file that only contains a comment - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Zend.NamingConventions.ValidVariableName now supports variables inside anonymous classes correctly - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch - -### Fixed -- Fixed bug [#2298][sq-2298] : PSR2.Classes.ClassDeclaration allows extended class on new line - - Thanks to [Michał Bundyra][@michalbundyra] for the patch -- Fixed bug [#2337][sq-2337] : Generic.WhiteSpace.ScopeIndent incorrect error when multi-line function call starts on same line as open tag -- Fixed bug [#2348][sq-2348] : Cache not invalidated when changing a ruleset included by another -- Fixed bug [#2376][sq-2376] : Using __halt_compiler() breaks Generic.PHP.ForbiddenFunctions unless it's last in the function list - - Thanks to [Sijun Zhu][@Billz95] for the patch -- Fixed bug [#2393][sq-2393] : The gitmodified filter will infinitely loop when encountering deleted file paths - - Thanks to [Lucas Manzke][@lmanzke] for the patch -- Fixed bug [#2396][sq-2396] : Generic.WhiteSpace.ScopeIndent incorrect error when multi-line IF condition mixed with HTML -- Fixed bug [#2431][sq-2431] : Use function/const not tokenized as T_STRING when preceded by comment - -[sq-2298]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2298 -[sq-2337]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2337 -[sq-2348]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2348 -[sq-2376]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2376 -[sq-2393]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2393 -[sq-2396]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2396 -[sq-2431]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2431 - -## [3.4.0] - 2018-12-20 - -### Deprecated -- The Generic.Formatting.NoSpaceAfterCast sniff has been deprecated and will be removed in version 4 - - The functionality of this sniff is now available in the Generic.Formatting.SpaceAfterCast sniff - - Include the Generic.Formatting.SpaceAfterCast sniff and set the "spacing" property to "0" - - As soon as possible, replace all instances of the old sniff code with the new sniff code and property setting - - The existing sniff will continue to work until version 4 has been released - -### Changed -- Rule include patterns in a ruleset.xml file are now evaluated as OR instead of AND - - Previously, a file had to match every include pattern and no exclude patterns to be included - - Now, a file must match at least one include pattern and no exclude patterns to be included - - This is a bug fix as include patterns are already documented to work this way -- New token T_BITWISE_NOT added for the bitwise not operator - - This token was previously tokenized as T_NONE - - Any sniffs specifically looking for T_NONE tokens with a tilde as the contents must now also look for T_BITWISE_NOT - - Sniffs can continue looking for T_NONE as well as T_BITWISE_NOT to support older PHP_CodeSniffer versions -- All types of binary casting are now tokenized as T_BINARY_CAST - - Previously, the 'b' in 'b"some string with $var"' would be a T_BINARY_CAST, but only when the string contained a var - - This change ensures the 'b' is always tokenized as T_BINARY_CAST - - This change also converts '(binary)' from T_STRING_CAST to T_BINARY_CAST - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the help with this patch -- Array properties set inside a ruleset.xml file can now extend a previous value instead of always overwriting it - - e.g., if you include a ruleset that defines forbidden functions, can you now add to that list instead of having to redefine it - - To use this feature, add extend="true" to the property tag - - e.g., property name="forbiddenFunctionNames" type="array" extend="true" - - Thanks to [Michael Moravec][@Majkl578] for the patch -- If $XDG_CACHE_HOME is set and points to a valid directory, it will be used for caching instead of the system temp directory -- PHPCBF now disables parallel running if you are passing content on STDIN - - Stops an error from being shown after the fixed output is printed -- The progress report now shows files with tokenizer errors as skipped (S) instead of a warning (W) - - The tokenizer error is still displayed in reports as normal - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- The Squiz standard now ensures there is no space between an increment/decrement operator and its variable -- The File::getMethodProperties() method now includes a has_body array index in the return value - - FALSE if the method has no body (as with abstract and interface methods) or TRUE otherwise - - Thanks to [Chris Wilkinson][@thewilkybarkid] for the patch -- The File::getTokensAsString() method now throws an exception if the $start param is invalid - - If the $length param is invalid, an empty string will be returned - - Stops an infinite loop when the function is passed invalid data - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Added new Generic.CodeAnalysis.EmptyPHPStatement sniff - - Warns when it finds empty PHP open/close tag combinations or superfluous semicolons - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the contribution -- Added new Generic.Formatting.SpaceBeforeCast sniff - - Ensures there is exactly 1 space before a type cast, unless the cast statement is indented or multi-line - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the contribution -- Added new Generic.VersionControl.GitMergeConflict sniff - - Detects merge conflict artifacts left in files - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the contribution -- Added Generic.WhiteSpace.IncrementDecrementSpacing sniff - - Ensures there is no space between the operator and the variable it applies to - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the contribution -- Added PSR12.Functions.NullableTypeDeclaration sniff - - Ensures there is no space after the question mark in a nullable type declaration - - Thanks to [Timo Schinkel][@timoschinkel] for the contribution -- A number of sniffs have improved support for methods in anonymous classes - - These sniffs would often throw the same error twice for functions in nested classes - - Error messages have also been changed to be less confusing - - The full list of affected sniffs is: - - Generic.NamingConventions.CamelCapsFunctionName - - PEAR.NamingConventions.ValidFunctionName - - PSR1.Methods.CamelCapsMethodName - - PSR2.Methods.MethodDeclaration - - Squiz.Scope.MethodScope - - Squiz.Scope.StaticThisUsage - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Generic.CodeAnalysis.UnusedFunctionParameter now only skips functions with empty bodies when the class implements an interface - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Generic.CodeAnalysis.UnusedFunctionParameter now has additional error codes to indicate where unused params were found - - The new error code prefixes are: - - FoundInExtendedClass: when the class extends another - - FoundInImplementedInterface: when the class implements an interface - - Found: used in all other cases, including closures - - The new error code suffixes are: - - BeforeLastUsed: the unused param was positioned before the last used param in the function signature - - AfterLastUsed: the unused param was positioned after the last used param in the function signature - - This makes the new error code list for this sniff: - - Found - - FoundBeforeLastUsed - - FoundAfterLastUsed - - FoundInExtendedClass - - FoundInExtendedClassBeforeLastUsed - - FoundInExtendedClassAfterLastUsed - - FoundInImplementedInterface - - FoundInImplementedInterfaceBeforeLastUsed - - FoundInImplementedInterfaceAfterLastUsed - - These errors code make it easier for specific cases to be ignored or promoted using a ruleset.xml file - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the contribution -- Generic.Classes.DuplicateClassName now inspects traits for duplicate names as well as classes and interfaces - - Thanks to [Chris Wilkinson][@thewilkybarkid] for the patch -- Generic.Files.InlineHTML now ignores a BOM at the start of the file - - Thanks to [Chris Wilkinson][@thewilkybarkid] for the patch -- Generic.PHP.CharacterBeforePHPOpeningTag now ignores a BOM at the start of the file - - Thanks to [Chris Wilkinson][@thewilkybarkid] for the patch -- Generic.Formatting.SpaceAfterCast now has a setting to specify how many spaces are required after a type cast - - Default remains 1 - - Override the "spacing" setting in a ruleset.xml file to change - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Generic.Formatting.SpaceAfterCast now has a setting to ignore newline characters after a type cast - - Default remains FALSE, so newlines are not allowed - - Override the "ignoreNewlines" setting in a ruleset.xml file to change - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Generic.Formatting.SpaceAfterNot now has a setting to specify how many spaces are required after a NOT operator - - Default remains 1 - - Override the "spacing" setting in a ruleset.xml file to change - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Generic.Formatting.SpaceAfterNot now has a setting to ignore newline characters after the NOT operator - - Default remains FALSE, so newlines are not allowed - - Override the "ignoreNewlines" setting in a ruleset.xml file to change - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- PEAR.Functions.FunctionDeclaration now checks spacing before the opening parenthesis of functions with no body - - Thanks to [Chris Wilkinson][@thewilkybarkid] for the patch -- PEAR.Functions.FunctionDeclaration now enforces no space before the semicolon in functions with no body - - Thanks to [Chris Wilkinson][@thewilkybarkid] for the patch -- PSR2.Classes.PropertyDeclaration now checks the order of property modifier keywords - - This is a rule that is documented in PSR-2 but was not enforced by the included PSR2 standard until now - - This sniff is also able to fix the order of the modifier keywords if they are incorrect - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- PSR2.Methods.MethodDeclaration now checks method declarations inside traits - - Thanks to [Chris Wilkinson][@thewilkybarkid] for the patch -- Squiz.Commenting.InlineComment now has better detection of comment block boundaries -- Squiz.Classes.ClassFileName now checks that a trait name matches the filename - - Thanks to [Chris Wilkinson][@thewilkybarkid] for the patch -- Squiz.Classes.SelfMemberReference now supports scoped declarations and anonymous classes - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.Classes.SelfMemberReference now fixes multiple errors at once, increasing fixer performance - - Thanks to [Gabriel Ostrolucký][@ostrolucky] for the patch -- Squiz.Functions.LowercaseFunctionKeywords now checks abstract and final prefixes, and auto-fixes errors - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.Objects.ObjectMemberComma.Missing has been renamed to Squiz.Objects.ObjectMemberComma.Found - - The error is thrown when the comma is found but not required, so the error code was incorrect - - If you are referencing the old error code in a ruleset XML file, please use the new code instead - - If you wish to maintain backwards compatibility, you can provide rules for both the old and new codes - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.WhiteSpace.ObjectOperatorSpacing is now more tolerant of parse errors -- Squiz.WhiteSpace.ObjectOperatorSpacing now fixes errors more efficiently - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch - -### Fixed -- Fixed bug [#2109][sq-2109] : Generic.Functions.CallTimePassByReference false positive for bitwise and used in function argument -- Fixed bug [#2165][sq-2165] : Conflict between Squiz.Arrays.ArrayDeclaration and ScopeIndent sniffs when heredoc used in array -- Fixed bug [#2167][sq-2167] : Generic.WhiteSpace.ScopeIndent shows invalid error when scope opener indented inside inline HTML -- Fixed bug [#2178][sq-2178] : Generic.NamingConventions.ConstructorName matches methods in anon classes with same name as containing class - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#2190][sq-2190] : PEAR.Functions.FunctionCallSignature incorrect error when encountering trailing PHPCS annotation - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#2194][sq-2194] : Generic.Whitespace.LanguageConstructSpacing should not be checking namespace operators - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#2202][sq-2202] : Squiz.WhiteSpace.OperatorSpacing throws error for negative index when using curly braces for string access - - Same issue fixed in Squiz.Formatting.OperatorBracket - - Thanks to [Andreas Buchenrieder][@anbuc] for the patch -- Fixed bug [#2210][sq-2210] : Generic.NamingConventions.CamelCapsFunctionName not ignoring SoapClient __getCookies() method - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#2211][sq-2211] : PSR2.Methods.MethodDeclaration gets confused over comments between modifier keywords - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#2212][sq-2212] : FUNCTION and CONST in use groups being tokenized as T_FUNCTION and T_CONST - - Thanks to [Chris Wilkinson][@thewilkybarkid] for the patch -- Fixed bug [#2214][sq-2214] : File::getMemberProperties() is recognizing method params as properties - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#2236][sq-2236] : Memory info measurement unit is Mb but probably should be MB -- Fixed bug [#2246][sq-2246] : CSS tokenizer does not tokenize class names correctly when they contain the string NEW - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#2278][sq-2278] : Squiz.Operators.ComparisonOperatorUsage false positive when inline IF contained in parentheses - - Thanks to [Arnout Boks][@aboks] for the patch -- Fixed bug [#2284][sq-2284] : Squiz.Functions.FunctionDeclarationArgumentSpacing removing type hint during fixing - - Thanks to [Michał Bundyra][@michalbundyra] for the patch -- Fixed bug [#2297][sq-2297] : Anonymous class not tokenized correctly when used as argument to another anon class - - Thanks to [Michał Bundyra][@michalbundyra] for the patch - -[sq-2109]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2109 -[sq-2165]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2165 -[sq-2167]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2167 -[sq-2178]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2178 -[sq-2190]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2190 -[sq-2194]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2194 -[sq-2202]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2202 -[sq-2210]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2210 -[sq-2211]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2211 -[sq-2212]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2212 -[sq-2214]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2214 -[sq-2236]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2236 -[sq-2246]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2246 -[sq-2278]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2278 -[sq-2284]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2284 -[sq-2297]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2297 - -## [2.9.2] - 2018-11-08 - -### Changed -- PHPCS should now run under PHP 7.3 without deprecation warnings - - Thanks to [Nick Wilde][@NickDickinsonWilde] for the patch - -### Fixed -- Fixed bug [#1496][sq-1496] : Squiz.Strings.DoubleQuoteUsage not unescaping dollar sign when fixing - - Thanks to [Michał Bundyra][@michalbundyra] for the patch -- Fixed bug [#1549][sq-1549] : Squiz.PHP.EmbeddedPhp fixer conflict with // comment before PHP close tag - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#1890][sq-1890] : Incorrect Squiz.WhiteSpace.ControlStructureSpacing.NoLineAfterClose error between catch and finally statements - -## [3.3.2] - 2018-09-24 - -### Changed -- Fixed a problem where the report cache was not being cleared when the sniffs inside a standard were updated -- The info report (--report=info) now has improved formatting for metrics that span multiple lines - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- The unit test runner now skips .bak files when looking for test cases - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- The Squiz standard now ensures underscores are not used to indicate visibility of private members vars and methods - - Previously, this standard enforced the use of underscores -- Generic.PHP.NoSilencedErrors error messages now contain a code snippet to show the context of the error - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.Arrays.ArrayDeclaration no longer reports errors for a comma on a line new after a here/nowdoc - - Also stops a parse error being generated when auto-fixing - - The SpaceBeforeComma error message has been changed to only have one data value instead of two -- Squiz.Commenting.FunctionComment no longer errors when trying to fix indents of multi-line param comments -- Squiz.Formatting.OperatorBracket now correctly fixes statements that contain strings -- Squiz.PHP.CommentedOutCode now ignores more @-style annotations and includes better comment block detection - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch - -### Fixed -- Fixed a problem where referencing a relative file path in a ruleset XML file could add unnecessary sniff exclusions - - This didn't actually exclude anything, but caused verbose output to list strange exclusion rules -- Fixed bug [#2110][sq-2110] : Squiz.WhiteSpace.FunctionSpacing is removing indents from the start of functions when fixing - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#2115][sq-2115] : Squiz.Commenting.VariableComment not checking var types when the @var line contains a comment -- Fixed bug [#2120][sq-2120] : Tokenizer fails to match T_INLINE_ELSE when used after function call containing closure -- Fixed bug [#2121][sq-2121] : Squiz.PHP.DisallowMultipleAssignments false positive in while loop conditions - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#2127][sq-2127] : File::findExtendedClassName() doesn't support nested classes - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#2138][sq-2138] : Tokenizer detects wrong token for PHP ::class feature with spaces -- Fixed bug [#2143][sq-2143] : PSR2.Namespaces.UseDeclaration does not properly fix "use function" and "use const" statements - - Thanks to [Chris Wilkinson][@thewilkybarkid] for the patch -- Fixed bug [#2144][sq-2144] : Squiz.Arrays.ArrayDeclaration does incorrect align calculation in array with cyrillic keys -- Fixed bug [#2146][sq-2146] : Zend.Files.ClosingTag removes closing tag from end of file without inserting a semicolon -- Fixed bug [#2151][sq-2151] : XML schema not updated with the new array property syntax - -[sq-2110]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2110 -[sq-2115]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2115 -[sq-2120]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2120 -[sq-2121]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2121 -[sq-2127]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2127 -[sq-2138]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2138 -[sq-2143]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2143 -[sq-2144]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2144 -[sq-2146]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2146 -[sq-2151]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2151 - -## [3.3.1] - 2018-07-27 - -### Removed -- Support for HHVM has been dropped due to recent unfixed bugs and HHVM refocus on Hack only - - Thanks to [Walt Sorensen][@photodude] and [Juliette Reinders Folmer][@jrfnl] for helping to remove all HHVM exceptions from the core - -### Changed -- The full report (the default report) now has improved word wrapping for multi-line messages and sniff codes - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- The summary report now sorts files based on their directory location instead of just a basic string sort - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- The source report now orders error codes by name when they have the same number of errors - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- The junit report no longer generates validation errors with the Jenkins xUnit plugin - - Thanks to [Nikolay Geo][@nicholascus] for the patch -- Generic.Commenting.DocComment no longer generates the SpacingBeforeTags error if tags are the first content in the docblock - - The sniff will still generate a MissingShort error if there is no short comment - - This allows the MissingShort error to be suppressed in a ruleset to make short descriptions optional -- Generic.Functions.FunctionCallArgumentSpacing now properly fixes multi-line function calls with leading commas - - Previously, newlines between function arguments would be removed - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Generic.PHP.Syntax will now use PHP_BINARY instead of trying to discover the executable path - - This ensures that the sniff will always syntax check files using the PHP version that PHPCS is running under - - Setting the `php_path` config var will still override this value as normal - - Thanks to [Willem Stuursma-Ruwen][@willemstuursma] for the patch -- PSR2.Namespaces.UseDeclaration now supports commas at the end of group use declarations - - Also improves checking and fixing for use statements containing parse errors - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.Arrays.ArrayDeclaration no longer removes the array opening brace while fixing - - This could occur when the opening brace was on a new line and the first array key directly followed - - This change also stops the KeyNotAligned error message being incorrectly reported in these cases -- Squiz.Arrays.ArrayDeclaration no longer tries to change multi-line arrays to single line when they contain comments - - Fixes a conflict between this sniff and some indentation sniffs -- Squiz.Classes.ClassDeclaration no longer enforces spacing rules when a class is followed by a function - - Fixes a conflict between this sniff and the Squiz.WhiteSpace.FunctionSpacing sniff -- The Squiz.Classes.ValidClassName.NotCamelCaps message now references PascalCase instead of CamelCase - - The "CamelCase class name" metric produced by the sniff has been changed to "PascalCase class name" - - This reflects the fact that the class name check is actually a Pascal Case check and not really Camel Case - - Thanks to [Tom H Anderson][@TomHAnderson] for the patch -- Squiz.Commenting.InlineComment no longer enforces spacing rules when an inline comment is followed by a docblock - - Fixes a conflict between this sniff and the Squiz.WhiteSpace.FunctionSpacing sniff -- Squiz.WhiteSpace.OperatorSpacing no longer tries to fix operator spacing if the next content is a comment on a new line - - Fixes a conflict between this sniff and the Squiz.Commenting.PostStatementComment sniff - - Also stops PHPCS annotations from being moved to a different line, potentially changing their meaning - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.WhiteSpace.FunctionSpacing no longer checks spacing of functions at the top of an embedded PHP block - - Fixes a conflict between this sniff and the Squiz.PHP.EmbeddedPHP sniff - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.WhiteSpace.MemberVarSpacing no longer checks spacing before member vars that come directly after methods - - Fixes a conflict between this sniff and the Squiz.WhiteSpace.FunctionSpacing sniff -- Squiz.WhiteSpace.SuperfluousWhitespace now recognizes unicode whitespace at the start and end of a file - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch - -### Fixed -- Fixed bug [#2029][sq-2029] : Squiz.Scope.MemberVarScope throws fatal error when a property is found in an interface - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#2047][sq-2047] : PSR12.Classes.ClassInstantiation false positive when instantiating class from array index -- Fixed bug [#2048][sq-2048] : GenericFormatting.MultipleStatementAlignment false positive when assigning values inside an array -- Fixed bug [#2053][sq-2053] : PSR12.Classes.ClassInstantiation incorrectly fix when using member vars and some variable formats -- Fixed bug [#2065][sq-2065] : Generic.ControlStructures.InlineControlStructure fixing fails when inline control structure contains closure -- Fixed bug [#2072][sq-2072] : Squiz.Arrays.ArrayDeclaration throws NoComma error when array value is a shorthand IF statement -- Fixed bug [#2082][sq-2082] : File with "defined() or define()" syntax triggers PSR1.Files.SideEffects.FoundWithSymbols -- Fixed bug [#2095][sq-2095] : PSR2.Namespaces.NamespaceDeclaration does not handle namespaces defined over multiple lines - -[sq-2029]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2029 -[sq-2047]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2047 -[sq-2048]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2048 -[sq-2053]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2053 -[sq-2065]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2065 -[sq-2072]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2072 -[sq-2082]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2082 -[sq-2095]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2095 - -## [3.3.0] - 2018-06-07 - -### Deprecated -- The Squiz.WhiteSpace.LanguageConstructSpacing sniff has been deprecated and will be removed in version 4 - - The sniff has been moved to the Generic standard, with a new code of Generic.WhiteSpace.LanguageConstructSpacing - - As soon as possible, replace all instances of the old sniff code with the new sniff code in your ruleset.xml files - - The existing Squiz sniff will continue to work until version 4 has been released - - The new Generic sniff now also checks many more language constructs to enforce additional spacing rules - - Thanks to [Mponos George][@gmponos] for the contribution -- The current method for setting array properties in ruleset files has been deprecated and will be removed in version 4 - - Currently, setting an array value uses the string syntax "print=>echo,create_function=>null" - - Now, individual array elements are specified using a new "element" tag with "key" and "value" attributes - - For example, element key="print" value="echo" - - Thanks to [Michał Bundyra][@michalbundyra] for the patch -- The T_ARRAY_HINT token has been deprecated and will be removed in version 4 - - The token was used to ensure array type hints were not tokenized as T_ARRAY, but no other type hints were given a special token - - Array type hints now use the standard T_STRING token instead - - Sniffs referencing this token type will continue to run without error until version 4, but will not find any T_ARRAY_HINT tokens -- The T_RETURN_TYPE token has been deprecated and will be removed in version 4 - - The token was used to ensure array/self/parent/callable return types were tokenized consistently - - For namespaced return types, only the last part of the string (the class name) was tokenized as T_RETURN_TYPE - - This was not consistent and so return types are now left using their original token types so they are not skipped by sniffs - - The exception are array return types, which are tokenized as T_STRING instead of T_ARRAY, as they are for type hints - - Sniffs referencing this token type will continue to run without error until version 4, but will not find any T_RETUTN_TYPE tokens - - To get the return type of a function, use the File::getMethodProperties() method, which now contains a "return_type" array index - - This contains the return type of the function or closer, or a blank string if not specified - - If the return type is nullable, the return type will contain the leading ? - - A nullable_return_type array index in the return value will also be set to true - - If the return type contains namespace information, it will be cleaned of whitespace and comments - - To access the original return value string, use the main tokens array - -### Added -- This release contains an incomplete version of the PSR-12 coding standard - - Errors found using this standard should be valid, but it will miss a lot of violations until it is complete - - If you'd like to test and help, you can use the standard by running PHPCS with --standard=PSR12 - -### Changed -- Config values set using --runtime-set now override any config values set in rulesets or the CodeSniffer.conf file -- You can now apply include-pattern rules to individual message codes in a ruleset like you can with exclude-pattern rules - - Previously, include-pattern rules only applied to entire sniffs - - If a message code has both include and exclude patterns, the exclude patterns will be ignored -- Using PHPCS annotations to selectively re-enable sniffs is now more flexible - - Previously, you could only re-enable a sniff/category/standard using the exact same code that was disabled - - Now, you can disable a standard and only re-enable a specific category or sniff - - Or, you can disable a specific sniff and have it re-enable when you re-enable the category or standard -- The value of array sniff properties can now be set using phpcs:set annotations - - e.g., phpcs:set Standard.Category.SniffName property[] key=>value,key2=>value2 - - Thanks to [Michał Bundyra][@michalbundyra] for the patch -- PHPCS annotations now remain as T_PHPCS_* tokens instead of reverting to comment tokens when --ignore-annotations is used - - This stops sniffs (especially commenting sniffs) from generating a large number of false errors when ignoring - - Any custom sniffs that are using the T_PHPCS_* tokens to detect annotations may need to be changed to ignore them - - Check $phpcsFile->config->annotations to see if annotations are enabled and ignore when false -- You can now use fully or partially qualified class names for custom reports instead of absolute file paths - - To support this, you must specify an autoload file in your ruleset.xml file and use it to register an autoloader - - Your autoloader will need to load your custom report class when requested - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- The JSON report format now does escaping in error source codes as well as error messages - - Thanks to [Martin Vasel][@marvasDE] for the patch -- Invalid installed_paths values are now ignored instead of causing a fatal error -- Improved testability of custom rulesets by allowing the installed standards to be overridden - - Thanks to [Timo Schinkel][@timoschinkel] for the patch -- The key used for caching PHPCS runs now includes all set config values - - This fixes a problem where changing config values (e.g., via --runtime-set) used an incorrect cache file -- The "Function opening brace placement" metric has been separated into function and closure metrics in the info report - - Closures are no longer included in the "Function opening brace placement" metric - - A new "Closure opening brace placement" metric now shows information for closures -- Multi-line T_YIELD_FROM statements are now replicated properly for older PHP versions -- The PSR2 standard no longer produces 2 error messages when the AS keyword in a foreach loop is not lowercase -- Specifying a path to a non-existent dir when using the `--report-[reportType]=/path/to/report` CLI option no longer throws an exception - - This now prints a readable error message, as it does when using `--report-file` -- The File::getMethodParamaters() method now includes a type_hint_token array index in the return value - - Provides the position in the token stack of the first token in the type hint -- The File::getMethodProperties() method now includes a return_type_token array index in the return value - - Provides the position in the token stack of the first token in the return type -- The File::getTokensAsString() method can now optionally return original (non tab-replaced) content - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Removed Squiz.PHP.DisallowObEndFlush from the Squiz standard - - If you use this sniff and want to continue banning ob_end_flush(), use Generic.PHP.ForbiddenFunctions instead - - You will need to set the forbiddenFunctions property in your ruleset.xml file -- Removed Squiz.PHP.ForbiddenFunctions from the Squiz standard - - Replaced by using the forbiddenFunctions property of Generic.PHP.ForbiddenFunctions in the Squiz ruleset.xml - - Functionality of the Squiz standard remains the same, but the error codes are now different - - Previously, Squiz.PHP.ForbiddenFunctions.Found and Squiz.PHP.ForbiddenFunctions.FoundWithAlternative - - Now, Generic.PHP.ForbiddenFunctions.Found and Generic.PHP.ForbiddenFunctions.FoundWithAlternative -- Added new Generic.PHP.LowerCaseType sniff - - Ensures PHP types used for type hints, return types, and type casting are lowercase - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the contribution -- Added new Generic.WhiteSpace.ArbitraryParenthesesSpacing sniff - - Generates an error for whitespace inside parenthesis that don't belong to a function call/declaration or control structure - - Generates a warning for any empty parenthesis found - - Allows the required spacing to be set using the spacing sniff property (default is 0) - - Allows newlines to be used by setting the ignoreNewlines sniff property (default is false) - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the contribution -- Added new PSR12.Classes.ClassInstantiation sniff - - Ensures parenthesis are used when instantiating a new class -- Added new PSR12.Keywords.ShortFormTypeKeywords sniff - - Ensures the short form of PHP types is used when type casting -- Added new PSR12.Namespaces.CompundNamespaceDepth sniff - - Ensures compound namespace use statements have a max depth of 2 levels - - The max depth can be changed by setting the 'maxDepth' sniff property in a ruleset.xml file -- Added new PSR12.Operators.OperatorSpacing sniff - - Ensures operators are preceded and followed by at least 1 space -- Improved core support for grouped property declarations - - Also improves support in Squiz.WhiteSpace.ScopeKeywordSpacing and Squiz.WhiteSpace.MemberVarSpacing - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Generic.Commenting.DocComment now produces a NonParamGroup error when tags are mixed in with the @param tag group - - It would previously throw either a NonParamGroup or ParamGroup error depending on the order of tags - - This change allows the NonParamGroup error to be suppressed in a ruleset to allow the @param group to contain other tags - - Thanks to [Phil Davis][@phil-davis] for the patch -- Generic.Commenting.DocComment now continues checks param tags even if the doc comment short description is missing - - This change allows the MissingShort error to be suppressed in a ruleset without all other errors being suppressed as well - - Thanks to [Phil Davis][@phil-davis] for the patch -- Generic.CodeAnalysis.AssignmentInCondition now reports a different error code for assignments found in WHILE conditions - - The return value of a function call is often assigned in a WHILE condition, so this change makes it easier to exclude these cases - - The new code for this error message is Generic.CodeAnalysis.AssignmentInCondition.FoundInWhileCondition - - The error code for all other cases remains as Generic.CodeAnalysis.AssignmentInCondition.Found - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Generic.Functions.OpeningFunctionBraceBsdAllman now longer leaves trailing whitespace when moving the opening brace during fixing - - Also applies to fixes made by PEAR.Functions.FunctionDeclaration and Squiz.Functions.MultiLineFunctionDeclaration -- Generic.WhiteSpace.ScopeIndent now does a better job of fixing the indent of multi-line comments -- Generic.WhiteSpace.ScopeIndent now does a better job of fixing the indent of PHP open and close tags -- PEAR.Commenting.FunctionComment now report a different error code for param comment lines with too much padding - - Previously, any lines of a param comment that don't start at the exact comment position got the same error code - - Now, only comment lines with too little padding use ParamCommentAlignment as they are clearly mistakes - - Comment lines with too much padding may be using precision alignment as now use ParamCommentAlignmentExceeded - - This allows for excessive padding to be excluded from a ruleset while continuing to enforce a minimum padding -- PEAR.WhiteSpace.ObjectOperatorIndent now checks the indent of more chained operators - - Previously, it only checked chains beginning with a variable - - Now, it checks chains beginning with function calls, static class names, etc -- Squiz.Arrays.ArrayDeclaration now continues checking array formatting even if the key indent is not correct - - Allows for using different array indent rules while still checking/fixing double arrow and value alignment -- Squiz.Commenting.BlockComment has improved support for tab-indented comments - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.Commenting.BlockComment auto fixing no longer breaks when two block comments follow each other - - Also stopped single-line block comments from being auto fixed when they are embedded in other code - - Also fixed as issue found when PHPCS annotations were used inside a block comment - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.Commenting.BlockComment.LastLineIndent is now able to be fixed with phpcbf - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.Commenting.BlockComment now aligns star-prefixed lines under the opening tag while fixing, instead of indenting them - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.Commenting.FunctionComment.IncorrectTypeHint message no longer contains cut-off suggested type hints -- Squiz.Commenting.InlineComment now uses a new error code for inline comments at the end of a function - - Previously, all inline comments followed by a blank line threw a Squiz.Commenting.InlineComment.SpacingAfter error - - Now, inline comments at the end of a function will instead throw Squiz.Commenting.InlineComment.SpacingAfterAtFunctionEnd - - If you previously excluded SpacingAfter, add an exclusion for SpacingAfterAtFunctionEnd to your ruleset as well - - If you previously only included SpacingAfter, consider including SpacingAfterAtFunctionEnd as well - - The Squiz standard now excludes SpacingAfterAtFunctionEnd as the blank line is checked elsewhere - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.ControlStructures.ControlSignature now errors when a comment follows the closing brace of an earlier body - - Applies to catch, finally, else, elseif, and do/while structures - - The included PSR2 standard now enforces this rule - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.Formatting.OperatorBracket.MissingBrackets message has been changed to remove the word "arithmetic" - - The sniff checks more than just arithmetic operators, so the message is now clearer -- Sniffs.Operators.ComparisonOperatorUsage now detects more cases of implicit true comparisons - - It could previously be confused by comparisons used as function arguments -- Squiz.PHP.CommentedOutCode now ignores simple @-style annotation comments so they are not flagged as commented out code - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.PHP.CommentedOutCode now ignores a greater number of short comments so they are not flagged as commented out code - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.PHP.DisallowComparisonAssignment no longer errors when using the null coalescing operator - - Given this operator is used almost exclusively to assign values, it didn't make sense to generate an error -- Squiz.WhiteSpacing.FunctionSpacing now has a property to specify how many blank lines should be before the first class method - - Only applies when a method is the first code block in a class (i.e., there are no member vars before it) - - Override the 'spacingBeforeFirst' property in a ruleset.xml file to change - - If not set, the sniff will use whatever value is set for the existing 'spacing' property -- Squiz.WhiteSpacing.FunctionSpacing now has a property to specify how many blank lines should be after the last class method - - Only applies when a method is the last code block in a class (i.e., there are no member vars after it) - - Override the 'spacingAfterLast' property in a ruleset.xml file to change - - If not set, the sniff will use whatever value is set for the existing 'spacing' property - -### Fixed -- Fixed bug [#1863][sq-1863] : File::findEndOfStatement() not working when passed a scope opener -- Fixed bug [#1876][sq-1876] : PSR2.Namespaces.UseDeclaration not giving error for use statements before the namespace declaration - - Adds a new PSR2.Namespaces.UseDeclaration.UseBeforeNamespace error message -- Fixed bug [#1881][sq-1881] : Generic.Arrays.ArrayIndent is indenting sub-arrays incorrectly when comma not used after the last value -- Fixed bug [#1882][sq-1882] : Conditional with missing braces confused by indirect variables -- Fixed bug [#1915][sq-1915] : JS tokenizer fails to tokenize regular expression proceeded by boolean not operator -- Fixed bug [#1920][sq-1920] : Directory exclude pattern improperly excludes files with names that start the same - - Thanks to [Jeff Puckett][@jpuck] for the patch -- Fixed bug [#1922][sq-1922] : Equal sign alignment check broken when list syntax used before assignment operator -- Fixed bug [#1925][sq-1925] : Generic.Formatting.MultipleStatementAlignment skipping assignments within closures -- Fixed bug [#1931][sq-1931] : Generic opening brace placement sniffs do not correctly support function return types -- Fixed bug [#1932][sq-1932] : Generic.ControlStructures.InlineControlStructure fixer moves new PHPCS annotations -- Fixed bug [#1938][sq-1938] : Generic opening brace placement sniffs incorrectly move PHPCS annotations - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#1939][sq-1939] : phpcs:set annotations do not cause the line they are on to be ignored - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#1949][sq-1949] : Squiz.PHP.DisallowMultipleAssignments false positive when using namespaces with static assignments -- Fixed bug [#1959][sq-1959] : SquizMultiLineFunctionDeclaration error when param has trailing comment - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#1963][sq-1963] : Squiz.Scope.MemberVarScope does not work for multiline member declaration - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#1971][sq-1971] : Short array list syntax not correctly tokenized if short array is the first content in a file -- Fixed bug [#1979][sq-1979] : Tokenizer does not change heredoc to nowdoc token if the start tag contains spaces -- Fixed bug [#1982][sq-1982] : Squiz.Arrays.ArrayDeclaration fixer sometimes puts a comma in front of the last array value -- Fixed bug [#1993][sq-1993] : PSR1/PSR2 not reporting or fixing short open tags -- Fixed bug [#1996][sq-1996] : Custom report paths don't work on case-sensitive filesystems -- Fixed bug [#2006][sq-2006] : Squiz.Functions.FunctionDeclarationArgumentSpacing fixer removes comment between parens when no args - - The SpacingAfterOpenHint error message has been removed - - It is replaced by the existing SpacingAfterOpen message - - The error message format for the SpacingAfterOpen and SpacingBeforeClose messages has been changed - - These used to contain 3 pieces of data, but now only contain 2 - - If you have customised the error messages of this sniff, please review your ruleset after upgrading -- Fixed bug [#2018][sq-2018] : Generic.Formatting.MultipleStatementAlignment does see PHP close tag as end of statement block - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#2027][sq-2027] : PEAR.NamingConventions.ValidFunctionName error when function name includes double underscore - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch - -[sq-1863]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1863 -[sq-1876]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1876 -[sq-1881]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1881 -[sq-1882]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1882 -[sq-1915]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1915 -[sq-1920]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1920 -[sq-1922]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1922 -[sq-1925]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1925 -[sq-1931]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1931 -[sq-1932]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1932 -[sq-1938]: https://github.com/squizlabs/PHP_CodeSniffer/pull/1938 -[sq-1939]: https://github.com/squizlabs/PHP_CodeSniffer/pull/1939 -[sq-1949]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1949 -[sq-1959]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1959 -[sq-1963]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1963 -[sq-1971]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1971 -[sq-1979]: https://github.com/squizlabs/PHP_CodeSniffer/pull/1979 -[sq-1982]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1982 -[sq-1993]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1993 -[sq-1996]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1996 -[sq-2006]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2006 -[sq-2018]: https://github.com/squizlabs/PHP_CodeSniffer/pull/2018 -[sq-2027]: https://github.com/squizlabs/PHP_CodeSniffer/issues/2027 - -## [3.2.3] - 2018-02-21 - -### Changed -- The new phpcs: comment syntax can now be prefixed with an at symbol ( @phpcs: ) - - This restores the behaviour of the previous syntax where these comments are ignored by doc generators -- The current PHP version ID is now used to generate cache files - - This ensures that only cache files generated by the current PHP version are selected - - This change fixes caching issues when using sniffs that produce errors based on the current PHP version -- A new Tokens::$phpcsCommentTokens array is now available for sniff developers to detect phpcs: comment syntax - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- The PEAR.Commenting.FunctionComment.Missing error message now includes the name of the function - - Thanks to [Yorman Arias][@cixtor] for the patch -- The PEAR.Commenting.ClassComment.Missing and Squiz.Commenting.ClassComment.Missing error messages now include the name of the class - - Thanks to [Yorman Arias][@cixtor] for the patch -- PEAR.Functions.FunctionCallSignature now only forces alignment at a specific tab stop while fixing - - It was enforcing this during checking, but this meant invalid errors if the OpeningIndent message was being muted - - This fixes incorrect errors when using the PSR2 standard with some code blocks -- Generic.Files.LineLength now ignores lines that only contain phpcs: annotation comments - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Generic.Formatting.MultipleStatementAlignment now skips over arrays containing comments - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Generic.PHP.Syntax now forces display_errors to ON when linting - - Thanks to [Raúl Arellano][@raul338] for the patch -- PSR2.Namespaces.UseDeclaration has improved syntax error handling and closure detection - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.PHP.CommentedOutCode now has improved comment block detection for improved accuracy - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.PHP.NonExecutableCode could fatal error while fixing file with syntax error -- Squiz.PHP.NonExecutableCode now detects unreachable code after a goto statement - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.WhiteSpace.LanguageConstructSpacing has improved syntax error handling while fixing - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Improved phpcs: annotation syntax handling for a number of sniffs - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Improved auto-fixing of files with incomplete comment blocks for various commenting sniffs - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch - -### Fixed -- Fixed test suite compatibility with PHPUnit 7 -- Fixed bug [#1793][sq-1793] : PSR2 forcing exact indent for function call opening statements -- Fixed bug [#1803][sq-1803] : Squiz.WhiteSpace.ScopeKeywordSpacing removes member var name while fixing if no space after scope keyword -- Fixed bug [#1817][sq-1817] : Blank line not enforced after control structure if comment on same line as closing brace -- Fixed bug [#1827][sq-1827] : A phpcs:enable comment is not tokenized correctly if it is outside a phpcs:disable block - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#1828][sq-1828] : Squiz.WhiteSpace.SuperfluousWhiteSpace ignoreBlankLines property ignores whitespace after single line comments - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#1840][sq-1840] : When a comment has too many asterisks, phpcbf gives FAILED TO FIX error -- Fixed bug [#1867][sq-1867] : Can't use phpcs:ignore where the next line is HTML -- Fixed bug [#1870][sq-1870] : Invalid warning in multiple assignments alignment with closure or anon class -- Fixed bug [#1890][sq-1890] : Incorrect Squiz.WhiteSpace.ControlStructureSpacing.NoLineAfterClose error between catch and finally statements -- Fixed bug [#1891][sq-1891] : Comment on last USE statement causes false positive for PSR2.Namespaces.UseDeclaration.SpaceAfterLastUse - - Thanks to [Matt Coleman][@iammattcoleman], [Daniel Hensby][@dhensby], and [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#1901][sq-1901] : Fixed PHPCS annotations in multi-line tab-indented comments + not ignoring whole line for phpcs:set - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch - -[sq-1793]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1793 -[sq-1803]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1803 -[sq-1817]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1817 -[sq-1827]: https://github.com/squizlabs/PHP_CodeSniffer/pull/1827 -[sq-1828]: https://github.com/squizlabs/PHP_CodeSniffer/pull/1828 -[sq-1840]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1840 -[sq-1867]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1867 -[sq-1870]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1870 -[sq-1890]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1890 -[sq-1891]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1891 -[sq-1901]: https://github.com/squizlabs/PHP_CodeSniffer/pull/1901 - -## [3.2.2] - 2017-12-20 - -### Changed -- Disabled STDIN detection on Windows - - This fixes a problem with IDE plugins (e.g., PHPStorm) hanging on Windows - -## [3.2.1] - 2017-12-18 - -### Changed -- Empty diffs are no longer followed by a newline character (request [#1781][sq-1781]) -- Generic.Functions.OpeningFunctionBraceKernighanRitchie no longer complains when the open brace is followed by a close tag - - This makes the sniff more useful when used in templates - - Thanks to [Joseph Zidell][@josephzidell] for the patch - -### Fixed -- Fixed problems with some scripts and plugins waiting for STDIN - - This was a notable problem with IDE plugins (e.g., PHPStorm) and build systems -- Fixed bug [#1782][sq-1782] : Incorrect detection of operator in ternary + anonymous function - -[sq-1781]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1781 -[sq-1782]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1782 - -## [3.2.0] - 2017-12-13 - -### Deprecated -- This release deprecates the @codingStandards comment syntax used for sending commands to PHP_CodeSniffer - - The existing syntax will continue to work in all version 3 releases, but will be removed in version 4 - - The comment formats have been replaced by a shorter syntax: - - @codingStandardsIgnoreFile becomes phpcs:ignoreFile - - @codingStandardsIgnoreStart becomes phpcs:disable - - @codingStandardsIgnoreEnd becomes phpcs:enable - - @codingStandardsIgnoreLine becomes phpcs:ignore - - @codingStandardsChangeSetting becomes phpcs:set - - The new syntax allows for additional developer comments to be added after a -- separator - - This is useful for describing why a code block is being ignored, or why a setting is being changed - - E.g., phpcs:disable -- This code block must be left as-is. - - Comments using the new syntax are assigned new comment token types to allow them to be detected: - - phpcs:ignoreFile has the token T_PHPCS_IGNORE_FILE - - phpcs:disable has the token T_PHPCS_DISABLE - - phpcs:enable has the token T_PHPCS_ENABLE - - phpcs:ignore has the token T_PHPCS_IGNORE - - phpcs:set has the token T_PHPCS_SET - -### Changed -- The phpcs:disable and phpcs:ignore comments can now selectively ignore specific sniffs (request [#604][sq-604]) - - E.g., phpcs:disable Generic.Commenting.Todo.Found for a specific message - - E.g., phpcs:disable Generic.Commenting.Todo for a whole sniff - - E.g., phpcs:disable Generic.Commenting for a whole category of sniffs - - E.g., phpcs:disable Generic for a whole standard - - Multiple sniff codes can be specified by comma separating them - - E.g., phpcs:disable Generic.Commenting.Todo,PSR1.Files -- @codingStandardsIgnoreLine comments now only ignore the following line if they are on a line by themselves - - If they are at the end of an existing line, they will only ignore the line they are on - - Stops some lines from accidentally being ignored - - Same rule applies for the new phpcs:ignore comment syntax -- PSR1.Files.SideEffects now respects the new phpcs:disable comment syntax - - The sniff will no longer check any code that is between phpcs:disable and phpcs:enable comments - - The sniff does not support phpcs:ignore; you must wrap code structures with disable/enable comments - - Previously, there was no way to have this sniff ignore parts of a file -- Fixed a problem where PHPCS would sometimes hang waiting for STDIN, or read incomplete versions of large files - - Thanks to [Arne Jørgensen][@arnested] for the patch -- Array properties specified in ruleset files now have their keys and values trimmed - - This saves having to do this in individual sniffs and stops errors introduced by whitespace in rulesets - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Added phpcs.xsd to allow validation of ruleset XML files - - Thanks to [Renaat De Muynck][@renaatdemuynck] for the contribution -- File paths specified using --stdin-path can now point to fake file locations (request [#1488][sq-1488]) - - Previously, STDIN files using fake file paths were excluded from checking -- Setting an empty basepath (--basepath=) on the CLI will now clear a basepath set directly in a ruleset - - Thanks to [Xaver Loppenstedt][@xalopp] for the patch -- Ignore patterns are now checked on symlink target paths instead of symlink source paths - - Restores previous behaviour of this feature -- Metrics were being double counted when multiple sniffs were recording the same metric -- Added support for bash process substitution - - Thanks to [Scott Dutton][@exussum12] for the contribution -- Files included in the cache file code hash are now sorted to aid in cache file reuse across servers -- Windows BAT files can now be used outside a PEAR install - - You must have the path to PHP set in your PATH environment variable - - Thanks to [Joris Debonnet][@JorisDebonnet] for the patch -- The JS unsigned right shift assignment operator is now properly classified as an assignment operator - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- The AbstractVariableSniff abstract sniff now supports anonymous classes and nested functions - - Also fixes an issue with Squiz.Scope.MemberVarScope where member vars of anonymous classes were not being checked -- Added AbstractArraySniff to make it easier to create sniffs that check array formatting - - Allows for checking of single and multi line arrays easily - - Provides a parsed structure of the array including positions of keys, values, and double arrows -- Added Generic.Arrays.ArrayIndent to enforce a single tab stop indent for array keys in multi-line arrays - - Also ensures the close brace is on a new line and indented to the same level as the original statement - - Allows for the indent size to be set using an "indent" property of the sniff -- Added Generic.PHP.DiscourageGoto to warn about the use of the GOTO language construct - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the contribution -- Generic.Debug.ClosureLinter was not running the gjslint command - - Thanks to [Michał Bundyra][@michalbundyra] for the patch -- Generic.WhiteSpace.DisallowSpaceIndent now fixes space indents in multi-line block comments - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Generic.WhiteSpace.DisallowSpaceIndent now fixes mixed space/tab indents more accurately - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Generic.WhiteSpace.DisallowTabIndent now fixes tab indents in multi-line block comments - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- PEAR.Functions.FunctionDeclaration no longer errors when a function declaration is the first content in a JS file - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- PEAR.Functions.FunctionCallSignature now requires the function name to be indented to an exact tab stop - - If the function name is not the start of the statement, the opening statement must be indented correctly instead - - Added a new fixable error code PEAR.Functions.FunctionCallSignature.OpeningIndent for this error -- Squiz.Functions.FunctionDeclarationArgumentSpacing is no longer confused about comments in function declarations - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.PHP.NonExecutableCode error messages now indicate which line the code block ending is on - - Makes it easier to identify where the code block exited or returned - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.Commenting.FunctionComment now supports nullable type hints -- Squiz.Commenting.FunctionCommentThrowTag no longer assigns throw tags inside anon classes to the enclosing function -- Squiz.WhiteSpace.SemicolonSpacing now ignores semicolons used for empty statements inside FOR conditions - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.ControlStructures.ControlSignature now allows configuring the number of spaces before the colon in alternative syntax - - Override the 'requiredSpacesBeforeColon' setting in a ruleset.xml file to change - - Default remains at 1 - - Thanks to [Nikola Kovacs][@nkovacs] for the patch -- The Squiz standard now ensures array keys are indented 4 spaces from the main statement - - Previously, this standard aligned keys 1 space from the start of the array keyword -- The Squiz standard now ensures array end braces are aligned with the main statement - - Previously, this standard aligned the close brace with the start of the array keyword -- The standard for PHP_CodeSniffer itself now enforces short array syntax -- The standard for PHP_CodeSniffer itself now uses the Generic.Arrays/ArrayIndent sniff rules -- Improved fixer conflicts and syntax error handling for a number of sniffs - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch - -### Fixed -- Fixed bug [#1462][sq-1462] : Error processing cyrillic strings in Tokenizer -- Fixed bug [#1573][sq-1573] : Squiz.WhiteSpace.LanguageConstructSpacing does not properly check for tabs and newlines - - Thanks to [Michał Bundyra][@michalbundyra] for the patch -- Fixed bug [#1590][sq-1590] : InlineControlStructure CBF issue while adding braces to an if that's returning a nested function -- Fixed bug [#1718][sq-1718] : Unclosed strings at EOF sometimes tokenized as T_WHITESPACE by the JS tokenizer -- Fixed bug [#1731][sq-1731] : Directory exclusions do not work as expected when a single file name is passed to phpcs -- Fixed bug [#1737][sq-1737] : Squiz.CSS.EmptyStyleDefinition sees comment as style definition and fails to report error -- Fixed bug [#1746][sq-1746] : Very large reports can sometimes become garbled when using the parallel option -- Fixed bug [#1747][sq-1747] : Squiz.Scope.StaticThisUsage incorrectly looking inside closures -- Fixed bug [#1757][sq-1757] : Unknown type hint "object" in Squiz.Commenting.FunctionComment -- Fixed bug [#1758][sq-1758] : PHPCS gets stuck creating file list when processing circular symlinks -- Fixed bug [#1761][sq-1761] : Generic.WhiteSpace.ScopeIndent error on multi-line function call with static closure argument -- Fixed bug [#1762][sq-1762] : `Generic.WhiteSpace.Disallow[Space/Tab]Indent` not inspecting content before open tag - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#1769][sq-1769] : Custom "define" function triggers a warning about declaring new symbols -- Fixed bug [#1776][sq-1776] : Squiz.Scope.StaticThisUsage incorrectly looking inside anon classes -- Fixed bug [#1777][sq-1777] : Generic.WhiteSpace.ScopeIndent incorrect indent errors when self called function proceeded by comment - -[sq-604]: https://github.com/squizlabs/PHP_CodeSniffer/issues/604 -[sq-1462]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1462 -[sq-1488]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1488 -[sq-1573]: https://github.com/squizlabs/PHP_CodeSniffer/pull/1573 -[sq-1590]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1590 -[sq-1718]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1718 -[sq-1731]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1731 -[sq-1737]: https://github.com/squizlabs/PHP_CodeSniffer/pull/1737 -[sq-1746]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1746 -[sq-1747]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1747 -[sq-1757]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1757 -[sq-1758]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1758 -[sq-1761]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1761 -[sq-1762]: https://github.com/squizlabs/PHP_CodeSniffer/pull/1762 -[sq-1769]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1769 -[sq-1776]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1776 -[sq-1777]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1777 - -## [3.1.1] - 2017-10-17 - -### Changed -- Restored preference of non-dist files over dist files for phpcs.xml and phpcs.xml.dist - - The order that the files are searched is now: .phpcs.xml, phpcs.xml, .phpcs.xml.dist, phpcs.xml.dist - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Progress output now correctly shows skipped files -- Progress output now shows 100% when the file list has finished processing (request [#1697][sq-1697]) -- Stopped some IDEs complaining about testing class aliases - - Thanks to [Vytautas Stankus][@svycka] for the patch -- Squiz.Commenting.InlineComment incorrectly identified comment blocks in some cases, muting some errors - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch - -### Fixed -- Fixed bug [#1512][sq-1512] : PEAR.Functions.FunctionCallSignature enforces spaces when no arguments if required spaces is not 0 -- Fixed bug [#1522][sq-1522] : Squiz Arrays.ArrayDeclaration and Strings.ConcatenationSpacing fixers causing parse errors with here/nowdocs -- Fixed bug [#1570][sq-1570] : Squiz.Arrays.ArrayDeclaration fixer removes comments between array keyword and open parentheses -- Fixed bug [#1604][sq-1604] : File::isReference has problems with some bitwise operators and class property references - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#1645][sq-1645] : Squiz.Commenting.InlineComment will fail to fix comments at the end of the file - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#1656][sq-1656] : Using the --sniffs argument has a problem with case sensitivity -- Fixed bug [#1657][sq-1657] : Uninitialized string offset: 0 when sniffing CSS -- Fixed bug [#1669][sq-1669] : Temporary expression proceeded by curly brace is detected as function call -- Fixed bug [#1681][sq-1681] : Huge arrays are super slow to scan with Squiz.Arrays.ArrayDeclaration sniff -- Fixed bug [#1694][sq-1694] : Squiz.Arrays.ArrayBracketSpacing is removing some comments during fixing - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#1702][sq-1702] : Generic.WhiteSpaceDisallowSpaceIndent fixer bug when line only contains superfluous whitespace - -[sq-1512]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1512 -[sq-1522]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1522 -[sq-1570]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1570 -[sq-1604]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1604 -[sq-1645]: https://github.com/squizlabs/PHP_CodeSniffer/pull/1645 -[sq-1656]: https://github.com/squizlabs/PHP_CodeSniffer/pull/1656 -[sq-1657]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1657 -[sq-1669]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1669 -[sq-1681]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1681 -[sq-1694]: https://github.com/squizlabs/PHP_CodeSniffer/pull/1694 -[sq-1697]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1697 -[sq-1702]: https://github.com/squizlabs/PHP_CodeSniffer/pull/1702 - -## [3.1.0] - 2017-09-20 - -### Changed -- This release includes a change to support newer versions of PHPUnit (versions 4, 5, and 6 are now supported) - - The custom PHP_CodeSniffer test runner now requires a bootstrap file - - Developers with custom standards using the PHP_CodeSniffer test runner will need to do one of the following: - - run your unit tests from the PHP_CodeSniffer root dir so the bootstrap file is included - - specify the PHP_CodeSniffer bootstrap file on the command line: `phpunit --bootstrap=/path/to/phpcs/tests/bootstrap.php` - - require the PHP_CodeSniffer bootstrap file from your own bootstrap file - - If you don't run PHP_CodeSniffer unit tests, this change will not affect you - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- A phpcs.xml or phpcs.xml.dist file now takes precedence over the default_standard config setting - - Thanks to [Björn Fischer][@Fischer-Bjoern] for the patch -- Both phpcs.xml and phpcs.xml.dist files can now be prefixed with a dot (request [#1566][sq-1566]) - - The order that the files are searched is: .phpcs.xml, .phpcs.xml.dist, phpcs.xml, phpcs.xml.dist -- The autoloader will now search for files during unit tests runs from the same locations as during normal phpcs runs - - Allows for easier unit testing of custom standards that use helper classes or custom namespaces -- Include patterns for sniffs now use OR logic instead of AND logic - - Previously, a file had to be in each of the include patterns to be processed by a sniff - - Now, a file has to only be in at least one of the patterns - - This change reflects the original intention of the feature -- PHPCS will now follow symlinks under the list of checked directories - - This previously only worked if you specified the path to a symlink on the command line -- Output from --config-show, --config-set, and --config-delete now includes the path to the loaded config file -- PHPCS now cleanly exits if its config file is not readable - - Previously, a combination of PHP notices and PHPCS errors would be generated -- Comment tokens that start with /** are now always tokenized as docblocks - - Thanks to [Michał Bundyra][@michalbundyra] for the patch -- The PHP-supplied T_YIELD and T_YIELD_FROM token have been replicated for older PHP versions - - Thanks to [Michał Bundyra][@michalbundyra] for the patch -- Added new Generic.CodeAnalysis.AssignmentInCondition sniff to warn about variable assignments inside conditions - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the contribution -- Added Generic.Files.OneObjectStructurePerFile sniff to ensure there is a single class/interface/trait per file - - Thanks to [Mponos George][@gmponos] for the contribution -- Function call sniffs now check variable function names and self/static object creation - - Specific sniffs are Generic.Functions.FunctionCallArgumentSpacing, PEAR.Functions.FunctionCallSignature, and PSR2.Methods.FunctionCallSignature - - Thanks to [Michał Bundyra][@michalbundyra] for the patch -- Generic.Files.LineLength can now be configured to ignore all comment lines, no matter their length - - Set the ignoreComments property to TRUE (default is FALSE) in your ruleset.xml file to enable this - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Generic.PHP.LowerCaseKeyword now checks self, parent, yield, yield from, and closure (function) keywords - - Thanks to [Michał Bundyra][@michalbundyra] for the patch -- PEAR.Functions.FunctionDeclaration now removes a blank line if it creates one by moving the curly brace during fixing -- Squiz.Commenting.FunctionCommentThrowTag now supports PHP 7.1 multi catch exceptions -- Squiz.Formatting.OperatorBracket no longer throws errors for PHP 7.1 multi catch exceptions -- Squiz.Commenting.LongConditionClosingComment now supports finally statements -- Squiz.Formatting.OperatorBracket now correctly fixes pipe separated flags -- Squiz.Formatting.OperatorBracket now correctly fixes statements containing short array syntax -- Squiz.PHP.EmbeddedPhp now properly fixes cases where the only content in an embedded PHP block is a comment - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.WhiteSpace.ControlStructureSpacing now ignores comments when checking blank lines at the top of control structures -- Squiz.WhiteSpace.ObjectOperatorSpacing now detects and fixes spaces around double colons - - Thanks to [Julius Šmatavičius][@bondas83] for the patch -- Squiz.WhiteSpace.MemberVarSpacing can now be configured to check any number of blank lines between member vars - - Set the spacing property (default is 1) in your ruleset.xml file to set the spacing -- Squiz.WhiteSpace.MemberVarSpacing can now be configured to check a different number of blank lines before the first member var - - Set the spacingBeforeFirst property (default is 1) in your ruleset.xml file to set the spacing -- Added a new PHP_CodeSniffer\Util\Tokens::$ooScopeTokens static member var for quickly checking object scope - - Includes T_CLASS, T_ANON_CLASS, T_INTERFACE, and T_TRAIT - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- PHP_CodeSniffer\Files\File::findExtendedClassName() now supports extended interfaces - - Thanks to [Martin Hujer][@mhujer] for the patch - -### Fixed -- Fixed bug [#1550][sq-1550] : Squiz.Commenting.FunctionComment false positive when function contains closure -- Fixed bug [#1577][sq-1577] : Generic.InlineControlStructureSniff breaks with a comment between body and condition in do while loops -- Fixed bug [#1581][sq-1581] : Sniffs not loaded when one-standard directories are being registered in installed_paths -- Fixed bug [#1591][sq-1591] : Autoloader failing to load arbitrary files when installed_paths only set via a custom ruleset -- Fixed bug [#1605][sq-1605] : Squiz.WhiteSpace.OperatorSpacing false positive on unary minus after comment - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#1615][sq-1615] : Uncaught RuntimeException when phpcbf fails to fix files -- Fixed bug [#1637][sq-1637] : Generic.WhiteSpaceScopeIndent closure argument indenting incorrect with multi-line strings -- Fixed bug [#1638][sq-1638] : Squiz.WhiteSpace.ScopeClosingBrace closure argument indenting incorrect with multi-line strings -- Fixed bug [#1640][sq-1640] : Squiz.Strings.DoubleQuoteUsage replaces tabs with spaces when fixing - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch - -[sq-1550]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1550 -[sq-1566]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1566 -[sq-1577]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1577 -[sq-1581]: https://github.com/squizlabs/PHP_CodeSniffer/pull/1581 -[sq-1591]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1591 -[sq-1605]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1605 -[sq-1615]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1615 -[sq-1637]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1637 -[sq-1638]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1638 -[sq-1640]: https://github.com/squizlabs/PHP_CodeSniffer/pull/1640 - -## [3.0.2] - 2017-07-18 - -### Changed -- The code report now gracefully handles tokenizer exceptions -- The phpcs and phpcbf scripts are now the only places that exit() in the code - - This allows for easier usage of core PHPCS functions from external scripts - - If you are calling Runner::runPHPCS() or Runner::runPHPCBF() directly, you will get back the full range of exit codes - - If not, catch the new DeepExitException to get the error message ($e->getMessage()) and exit code ($e->getCode()); -- NOWDOC tokens are now considered conditions, just as HEREDOC tokens are - - This makes it easier to find the start and end of a NOWDOC from any token within it - - Thanks to [Michał Bundyra][@michalbundyra] for the patch -- Custom autoloaders are now only included once in case multiple standards are using the same one - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Improved tokenizing of fallthrough CASE and DEFAULT statements that share a closing statement and use curly braces -- Improved the error message when Squiz.ControlStructures.ControlSignature detects a newline after the closing parenthesis - -### Fixed -- Fixed a problem where the source report was not printing the correct number of errors found -- Fixed a problem where the --cache=/path/to/cachefile CLI argument was not working -- Fixed bug [#1465][sq-1465] : Generic.WhiteSpace.ScopeIndent reports incorrect errors when indenting double arrows in short arrays -- Fixed bug [#1478][sq-1478] : Indentation in fallthrough CASE that contains a closure -- Fixed bug [#1497][sq-1497] : Fatal error if composer prepend-autoloader is set to false - - Thanks to [Kunal Mehta][@legoktm] for the patch -- Fixed bug [#1503][sq-1503] : Alternative control structure syntax not always recognized as scoped -- Fixed bug [#1523][sq-1523] : Fatal error when using the --suffix argument - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#1526][sq-1526] : Use of basepath setting can stop PHPCBF being able to write fixed files -- Fixed bug [#1530][sq-1530] : Generic.WhiteSpace.ScopeIndent can increase indent too much for lines within code blocks -- Fixed bug [#1547][sq-1547] : Wrong token type for backslash in use function - - Thanks to [Michał Bundyra][@michalbundyra] for the patch -- Fixed bug [#1549][sq-1549] : Squiz.PHP.EmbeddedPhp fixer conflict with // comment before PHP close tag - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#1560][sq-1560] : Squiz.Commenting.FunctionComment fatal error when fixing additional param comment lines that have no indent - -[sq-1465]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1465 -[sq-1478]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1478 -[sq-1497]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1497 -[sq-1503]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1503 -[sq-1523]: https://github.com/squizlabs/PHP_CodeSniffer/pull/1523 -[sq-1526]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1526 -[sq-1530]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1530 -[sq-1547]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1547 -[sq-1549]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1549 -[sq-1560]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1560 - -## [3.0.1] - 2017-06-14 - -### Security -- This release contains a fix for a security advisory related to the improper handling of a shell command - - A properly crafted filename would allow for arbitrary code execution when using the --filter=gitmodified command line option - - All version 3 users are encouraged to upgrade to this version, especially if you are checking 3rd-party code - - e.g., you run PHPCS over libraries that you did not write - - e.g., you provide a web service that runs PHPCS over user-uploaded files or 3rd-party repositories - - e.g., you allow external tool paths to be set by user-defined values - - If you are unable to upgrade but you check 3rd-party code, ensure you are not using the Git modified filter - - This advisory does not affect PHP_CodeSniffer version 2. - - Thanks to [Sergei Morozov][@morozov] for the report and patch - -### Changed -- Arguments on the command line now override or merge with those specified in a ruleset.xml file in all cases -- PHPCS now stops looking for a phpcs.xml file as soon as one is found, favoring the closest one to the current dir -- Added missing help text for the --stdin-path CLI option to --help -- Re-added missing help text for the --file-list and --bootstrap CLI options to --help -- Runner::runPHPCS() and Runner::runPHPCBF() now return an exit code instead of exiting directly (request [#1484][sq-1484]) -- The Squiz standard now enforces short array syntax by default -- The autoloader is now working correctly with classes created with class_alias() -- The autoloader will now search for files inside all directories in the installed_paths config var - - This allows autoloading of files inside included custom coding standards without manually requiring them -- You can now specify a namespace for a custom coding standard, used by the autoloader to load non-sniff helper files - - Also used by the autoloader to help other standards directly include sniffs for your standard - - Set the value to the namespace prefix you are using for sniff files (everything up to \Sniffs\) - - e.g., if your namespace format is MyProject\CS\Standard\Sniffs\Category set the namespace to MyProject\CS\Standard - - If omitted, the namespace is assumed to be the same as the directory name containing the ruleset.xml file - - The namespace is set in the ruleset tag of the ruleset.xml file - - e.g., ruleset name="My Coding Standard" namespace="MyProject\CS\Standard" -- Rulesets can now specify custom autoloaders using the new autoload tag - - Autoloaders are included while the ruleset is being processed and before any custom sniffs are included - - Allows for very custom autoloading of helper classes well before the boostrap files are included -- The PEAR standard now includes Squiz.Commenting.DocCommentAlignment - - It previously broke comments onto multiple lines, but didn't align them - -### Fixed -- Fixed a problem where excluding a message from a custom standard's own sniff would exclude the whole sniff - - This caused some PSR2 errors to be under-reported -- Fixed bug [#1442][sq-1442] : T_NULLABLE detection not working for nullable parameters and return type hints in some cases -- Fixed bug [#1447][sq-1447] : Running the unit tests with a PHPUnit config file breaks the test suite - - Unknown arguments were not being handled correctly, but are now stored in $config->unknown -- Fixed bug [#1449][sq-1449] : Generic.Classes.OpeningBraceSameLine doesn't detect comment before opening brace - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#1450][sq-1450] : Coding standard located under an installed_path with the same directory name throws an error - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#1451][sq-1451] : Sniff exclusions/restrictions don't work with custom sniffs unless they use the PHP_CodeSniffer NS -- Fixed bug [#1454][sq-1454] : Squiz.WhiteSpace.OperatorSpacing is not checking spacing on either side of a short ternary operator - - Thanks to [Mponos George][@gmponos] for the patch -- Fixed bug [#1495][sq-1495] : Setting an invalid installed path breaks all commands -- Fixed bug [#1496][sq-1496] : Squiz.Strings.DoubleQuoteUsage not unescaping dollar sign when fixing - - Thanks to [Michał Bundyra][@michalbundyra] for the patch -- Fixed bug [#1501][sq-1501] : Interactive mode is broken -- Fixed bug [#1504][sq-1504] : PSR2.Namespaces.UseDeclaration hangs fixing use statement with no trailing code - -[sq-1447]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1447 -[sq-1449]: https://github.com/squizlabs/PHP_CodeSniffer/pull/1449 -[sq-1450]: https://github.com/squizlabs/PHP_CodeSniffer/pull/1450 -[sq-1451]: https://github.com/squizlabs/PHP_CodeSniffer/pull/1451 -[sq-1454]: https://github.com/squizlabs/PHP_CodeSniffer/pull/1454 -[sq-1484]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1484 -[sq-1495]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1495 -[sq-1496]: https://github.com/squizlabs/PHP_CodeSniffer/pull/1496 -[sq-1501]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1501 -[sq-1504]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1504 - -## [2.9.1] - 2017-05-22 - -### Fixed -- Fixed bug [#1442][sq-1442] : T_NULLABLE detection not working for nullable parameters and return type hints in some cases -- Fixed bug [#1448][sq-1448] : Generic.Classes.OpeningBraceSameLine doesn't detect comment before opening brace - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch - -[sq-1442]: https://github.com/squizlabs/PHP_CodeSniffer/pull/1442 -[sq-1448]: https://github.com/squizlabs/PHP_CodeSniffer/pull/1448 - -## [3.0.0] - 2017-05-04 - -### Changed -- Added an --ignore-annotations command line argument to ignore all @codingStandards annotations in code comments (request [#811][sq-811]) -- This allows you to force errors to be shown that would otherwise be ignored by code comments - - Also stop files being able to change sniff properties midway through processing -- An error is now reported if no sniffs were registered to be run (request [#1129][sq-1129]) -- The autoloader will now search for files inside the directory of any loaded coding standard - - This allows autoloading of any file inside a custom coding standard without manually requiring them - - Ensure your namespace begins with your coding standard's directory name and follows PSR-4 - - e.g., StandardName\Sniffs\CategoryName\AbstractHelper or StandardName\Helpers\StringSniffHelper -- Fixed an error where STDIN was sometimes not checked when using the --parallel CLI option -- The is_closure index has been removed from the return value of File::getMethodProperties() - - This value was always false because T_FUNCTION tokens are never closures - - Closures have a token type of T_CLOSURE -- The File::isAnonymousFunction() method has been removed - - This function always returned false because it only accepted T_FUNCTION tokens, which are never closures - - Closures have a token type of T_CLOSURE -- Includes all changes from the 2.9.0 release - -### Fixed -- Fixed bug [#834][sq-834] : PSR2.ControlStructures.SwitchDeclaration does not handle if branches with returns - - Thanks to [Fabian Wiget][@fabacino] for the patch - -[sq-811]: https://github.com/squizlabs/PHP_CodeSniffer/issues/811 -[sq-834]: https://github.com/squizlabs/PHP_CodeSniffer/issues/834 -[sq-1129]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1129 - -## [3.0.0RC4] - 2017-03-02 - -### Security -- This release contains a fix for a security advisory related to the improper handling of shell commands - - Uses of shell_exec() and exec() were not escaping filenames and configuration settings in most cases - - A properly crafted filename or configuration option would allow for arbitrary code execution when using some features - - All users are encouraged to upgrade to this version, especially if you are checking 3rd-party code - - e.g., you run PHPCS over libraries that you did not write - - e.g., you provide a web service that runs PHPCS over user-uploaded files or 3rd-party repositories - - e.g., you allow external tool paths to be set by user-defined values - - If you are unable to upgrade but you check 3rd-party code, ensure you are not using the following features: - - The diff report - - The notify-send report - - The Generic.PHP.Syntax sniff - - The Generic.Debug.CSSLint sniff - - The Generic.Debug.ClosureLinter sniff - - The Generic.Debug.JSHint sniff - - The Squiz.Debug.JSLint sniff - - The Squiz.Debug.JavaScriptLint sniff - - The Zend.Debug.CodeAnalyzer sniff - - Thanks to [Klaus Purer][@klausi] for the report - -### Changed -- The indent property of PEAR.Classes.ClassDeclaration has been removed - - Instead of calculating the indent of the brace, it just ensures the brace is aligned with the class keyword - - Other sniffs can be used to ensure the class itself is indented correctly -- Invalid exclude rules inside a ruleset.xml file are now ignored instead of potentially causing out of memory errors - - Using the -vv command line argument now also shows the invalid exclude rule as XML -- Includes all changes from the 2.8.1 release - -### Fixed -- Fixed bug [#1333][sq-1333] : The new autoloader breaks some frameworks with custom autoloaders -- Fixed bug [#1334][sq-1334] : Undefined offset when explaining standard with custom sniffs - -[sq-1333]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1333 -[sq-1334]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1334 - -## [3.0.0RC3] - 2017-02-02 - -### Changed -- Added support for ES6 class declarations - - Previously, these class were tokenized as JS objects but are now tokenized as normal T_CLASS structures -- Added support for ES6 method declarations, where the "function" keyword is not used - - Previously, these methods were tokenized as JS objects (fixes bug [#1251][sq-1251]) - - The name of the ES6 method is now assigned the T_FUNCTION keyword and treated like a normal function - - Custom sniffs that support JS and listen for T_FUNCTION tokens can't assume the token represents the word "function" - - Check the contents of the token first, or use $phpcsFile->getDeclarationName($stackPtr) if you just want its name - - There is no change for custom sniffs that only check PHP code -- PHPCBF exit codes have been changed so they are now more useful (request [#1270][sq-1270]) - - Exit code 0 is now used to indicate that no fixable errors were found, and so nothing was fixed - - Exit code 1 is now used to indicate that all fixable errors were fixed correctly - - Exit code 2 is now used to indicate that PHPCBF failed to fix some of the fixable errors it found - - Exit code 3 is now used for general script execution errors -- Added PEAR.Commenting.FileComment.ParamCommentAlignment to check alignment of multi-line param comments -- Includes all changes from the 2.8.0 release - -### Fixed -- Fixed an issue where excluding a file using a @codingStandardsIgnoreFile comment would produce errors - - For PHPCS, it would show empty files being processed - - For PHPCBF, it would produce a PHP error -- Fixed bug [#1233][sq-1233] : Can't set config data inside ruleset.xml file -- Fixed bug [#1241][sq-1241] : CodeSniffer.conf not working with 3.x PHAR file - -[sq-1233]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1233 -[sq-1241]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1241 -[sq-1251]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1251 -[sq-1270]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1270 - -## [3.0.0RC2] - 2016-11-30 - -### Changed -- Made the Runner class easier to use with wrapper scripts -- Full usage information is no longer printed when a usage error is encountered (request [#1186][sq-1186]) - - Makes it a lot easier to find and read the error message that was printed -- Includes all changes from the 2.7.1 release - -### Fixed -- Fixed an undefined var name error that could be produced while running PHPCBF -- Fixed bug [#1167][sq-1167] : 3.0.0RC1 PHAR does not work with PEAR standard -- Fixed bug [#1208][sq-1208] : Excluding files doesn't work when using STDIN with a filename specified - -[sq-1167]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1167 -[sq-1186]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1186 -[sq-1208]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1208 - -## [3.0.0RC1] - 2016-09-02 - -### Changed -- Progress output now shows E and W in green when a file has fixable errors or warnings - - Only supported if colors are enabled -- PHPCBF no longer produces verbose output by default (request [#699][sq-699]) - - Use the -v command line argument to show verbose fixing output - - Use the -q command line argument to disable verbose information if enabled by default -- PHPBF now prints a summary report after fixing files - - Report shows files that were fixed, how many errors were fixed, and how many remain -- PHPCBF now supports the -p command line argument to print progress information - - Prints a green F for files where fixes occurred - - Prints a red E for files that could not be fixed due to an error - - Use the -q command line argument to disable progress information if enabled by default -- Running unit tests using --verbose no longer throws errors -- Includes all changes from the 2.7.0 release - -### Fixed -- Fixed shell error appearing on some systems when trying to find executable paths - -[sq-699]: https://github.com/squizlabs/PHP_CodeSniffer/issues/699 - -## [3.0.0a1] - 2016-07-20 - -### Changed -- Min PHP version increased from 5.1.2 to 5.4.0 -- Added optional caching of results between runs (request [#530][sq-530]) - - Enable the cache by using the --cache command line argument - - If you want the cache file written somewhere specific, use --cache=/path/to/cacheFile - - Use the command "phpcs --config-set cache true" to turn caching on by default - - Use the --no-cache command line argument to disable caching if it is being turned on automatically -- Add support for checking file in parallel (request [#421][sq-421]) - - Tell PHPCS how many files to check at once using the --parallel command line argument - - To check 100 files at once, using --parallel=100 - - To disable parallel checking if it is being turned on automatically, use --parallel=1 - - Requires PHP to be compiled with the PCNTL package -- The default encoding has been changed from iso-8859-1 to utf-8 (request [#760][sq-760]) - - The --encoding command line argument still works, but you no longer have to set it to process files as utf-8 - - If encoding is being set to utf-8 in a ruleset or on the CLI, it can be safely removed - - If the iconv PHP extension is not installed, standard non-multibyte aware functions will be used -- Added a new "code" report type to show a code snippet for each error (request [#419][sq-419]) - - The line containing the error is printed, along with 2 lines above and below it to show context - - The location of the errors is underlined in the code snippet if you also use --colors - - Use --report=code to generate this report -- Added support for custom filtering of the file list - - Developers can write their own filter classes to perform custom filtering of the list before the run starts - - Use the command line arg `--filter=/path/to/filter.php` to specify a filter to use - - Extend \PHP_CodeSniffer\Filters\Filter to also support the core PHPCS extension and path filtering - - Extend \PHP_CodeSniffer\Filters\ExactMatch to get the core filtering and the ability to use blacklists and whitelists - - The included \PHP_CodeSniffer\Filters\GitModified filter is a good example of an ExactMatch filter -- Added support for only checking files that have been locally modified or added in a git repo - - Use --filter=gitmodified to check these files - - You still need to give PHPCS a list of files or directories in which to check -- Added automatic discovery of executable paths (request [#571][sq-571]) - - Thanks to [Sergei Morozov][@morozov] for the patch -- You must now pass "-" on the command line to have PHPCS wait for STDIN - - E.g., phpcs --standard=PSR2 - - - You can still pipe content via STDIN as normal as PHPCS will see this and process it - - But without the "-", PHPCS will throw an error if no content or files are passed to it -- All PHP errors generated by sniffs are caught, re-thrown as exceptions, and reported in the standard error reports - - This should stop bugs inside sniffs causing infinite loops - - Also stops invalid reports being produced as errors don't print to the screen directly -- Sniff codes are no longer optional - - If a sniff throws an error or a warning, it must specify an internal code for that message -- The installed_paths config setting can now point directly to a standard - - Previously, it had to always point to the directory in which the standard lives -- Multiple reports can now be specified using the --report command line argument - - Report types are separated by commas - - E.g., --report=full,summary,info - - Previously, you had to use one argument for each report such as --report=full --report=summary --report=info -- You can now set the severity, message type, and exclude patterns for an entire sniff, category, or standard - - Previously, this was only available for a single message -- You can now include a single sniff code in a ruleset instead of having to include an entire sniff - - Including a sniff code will automatically exclude all other messages from that sniff - - If the sniff is already included by an imported standard, set the sniff severity to 0 and include the specific message you want -- PHPCBF no longer uses patch - - Files are now always overwritten - - The --no-patch option has been removed -- Added a --basepath option to strip a directory from the front of file paths in output (request [#470][sq-470]) - - The basepath is absolute or relative to the current directory - - E.g., to output paths relative to current dir in reports, use --basepath=. -- Ignore rules are now checked when using STDIN (request [#733][sq-733]) -- Added an include-pattern tag to rulesets to include a sniff for specific files and folders only (request [#656][sq-656]) - - This is the exact opposite of the exclude-pattern tag - - This option is only usable within sniffs, not globally like exclude-patterns are -- Added a new -m option to stop error messages from being recorded, which saves a lot of memory - - PHPCBF always uses this setting to reduce memory as it never outputs error messages - - Setting the $recordErrors member var inside custom report classes is no longer supported (use -m instead) -- Exit code 2 is now used to indicate fixable errors were found (request [#930][sq-930]) - - Exit code 3 is now used for general script execution errors - - Exit code 1 is used to indicate that coding standard errors were found, but none are fixable - - Exit code 0 is unchanged and continues to mean no coding standard errors found - -### Removed -- The included PHPCS standard has been removed - - All rules are now found inside the phpcs.xml.dist file - - Running "phpcs" without any arguments from a git clone will use this ruleset -- The included SVN pre-commit hook has been removed - - Hooks for version control systems will no longer be maintained within the PHPCS project - -[sq-419]: https://github.com/squizlabs/PHP_CodeSniffer/issues/419 -[sq-421]: https://github.com/squizlabs/PHP_CodeSniffer/issues/421 -[sq-470]: https://github.com/squizlabs/PHP_CodeSniffer/issues/470 -[sq-530]: https://github.com/squizlabs/PHP_CodeSniffer/issues/530 -[sq-571]: https://github.com/squizlabs/PHP_CodeSniffer/pull/571 -[sq-656]: https://github.com/squizlabs/PHP_CodeSniffer/issues/656 -[sq-733]: https://github.com/squizlabs/PHP_CodeSniffer/issues/733 -[sq-760]: https://github.com/squizlabs/PHP_CodeSniffer/issues/760 -[sq-930]: https://github.com/squizlabs/PHP_CodeSniffer/issues/930 - -## [2.9.0] - 2017-05-04 - -### Changed -- Added Generic.Debug.ESLint sniff to run ESLint over JS files and report errors - - Set eslint path using: phpcs --config-set eslint_path /path/to/eslint - - Thanks to [Ryan McCue][@rmccue] for the contribution -- T_POW is now properly considered an arithmetic operator, and will be checked as such - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- T_SPACESHIP and T_COALESCE are now properly considered comparison operators, and will be checked as such - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Generic.PHP.DisallowShortOpenTag now warns about possible short open tags even when short_open_tag is set to OFF - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Generic.WhiteSpace.DisallowTabIndent now finds and fixes improper use of spaces anywhere inside the line indent - - Previously, only the first part of the indent was used to determine the indent type - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- PEAR.Commenting.ClassComment now supports checking of traits as well as classes and interfaces - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.Commenting.FunctionCommentThrowTag now supports re-throwing exceptions (request [#946][sq-946]) - - Thanks to [Samuel Levy][@samlev] for the patch -- Squiz.PHP.DisallowMultipleAssignments now ignores PHP4-style member var assignments - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.WhiteSpace.FunctionSpacing now ignores spacing above functions when they are preceded by inline comments - - Stops conflicts between this sniff and comment spacing sniffs -- Squiz.WhiteSpace.OperatorSpacing no longer checks the equal sign in declare statements - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Added missing error codes for a couple of sniffs so they can now be customised as normal - -### Fixed -- Fixed bug [#1266][sq-1266] : PEAR.WhiteSpace.ScopeClosingBrace can throw an error while fixing mixed PHP/HTML -- Fixed bug [#1364][sq-1364] : Yield From values are not recognised as returned values in Squiz FunctionComment sniff -- Fixed bug [#1373][sq-1373] : Error in tab expansion results in white-space of incorrect size - - Thanks to [Mark Clements][@MarkMaldaba] for the patch -- Fixed bug [#1381][sq-1381] : Tokenizer: dereferencing incorrectly identified as short array -- Fixed bug [#1387][sq-1387] : Squiz.ControlStructures.ControlSignature does not handle alt syntax when checking space after closing brace -- Fixed bug [#1392][sq-1392] : Scope indent calculated incorrectly when using array destructuring -- Fixed bug [#1394][sq-1394] : integer type hints appearing as TypeHintMissing instead of ScalarTypeHintMissing - - PHP 7 type hints were also being shown when run under PHP 5 in some cases -- Fixed bug [#1405][sq-1405] : Squiz.WhiteSpace.ScopeClosingBrace fails to fix closing brace within indented PHP tags -- Fixed bug [#1421][sq-1421] : Ternaries used in constant scalar expression for param default misidentified by tokenizer -- Fixed bug [#1431][sq-1431] : PHPCBF can't fix short open tags when they are not followed by a space - - Thanks to [Gonçalo Queirós][@ghunti] for the patch -- Fixed bug [#1432][sq-1432] : PHPCBF can make invalid fixes to inline JS control structures that make use of JS objects - -[sq-946]: https://github.com/squizlabs/PHP_CodeSniffer/pull/946 -[sq-1266]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1266 -[sq-1364]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1364 -[sq-1373]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1373 -[sq-1381]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1381 -[sq-1387]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1387 -[sq-1392]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1392 -[sq-1394]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1394 -[sq-1405]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1405 -[sq-1421]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1421 -[sq-1431]: https://github.com/squizlabs/PHP_CodeSniffer/pull/1431 -[sq-1432]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1432 - -## [2.8.1] - 2017-03-02 - -### Security -- This release contains a fix for a security advisory related to the improper handling of shell commands - - Uses of shell_exec() and exec() were not escaping filenames and configuration settings in most cases - - A properly crafted filename or configuration option would allow for arbitrary code execution when using some features - - All users are encouraged to upgrade to this version, especially if you are checking 3rd-party code - - e.g., you run PHPCS over libraries that you did not write - - e.g., you provide a web service that runs PHPCS over user-uploaded files or 3rd-party repositories - - e.g., you allow external tool paths to be set by user-defined values - - If you are unable to upgrade but you check 3rd-party code, ensure you are not using the following features: - - The diff report - - The notify-send report - - The Generic.PHP.Syntax sniff - - The Generic.Debug.CSSLint sniff - - The Generic.Debug.ClosureLinter sniff - - The Generic.Debug.JSHint sniff - - The Squiz.Debug.JSLint sniff - - The Squiz.Debug.JavaScriptLint sniff - - The Zend.Debug.CodeAnalyzer sniff - - Thanks to [Klaus Purer][@klausi] for the report - -### Changed -- The PHP-supplied T_COALESCE_EQUAL token has been replicated for PHP versions before 7.2 -- PEAR.Functions.FunctionDeclaration now reports an error for blank lines found inside a function declaration -- PEAR.Functions.FunctionDeclaration no longer reports indent errors for blank lines in a function declaration -- Squiz.Functions.MultiLineFunctionDeclaration no longer reports errors for blank lines in a function declaration - - It would previously report that only one argument is allowed per line -- Squiz.Commenting.FunctionComment now corrects multi-line param comment padding more accurately -- Squiz.Commenting.FunctionComment now properly fixes pipe-separated param types -- Squiz.Commenting.FunctionComment now works correctly when function return types also contain a comment - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.ControlStructures.InlineIfDeclaration now supports the elvis operator - - As this is not a real PHP operator, it enforces no spaces between ? and : when the THEN statement is empty -- Squiz.ControlStructures.InlineIfDeclaration is now able to fix the spacing errors it reports - -### Fixed -- Fixed bug [#1340][sq-1340] : STDIN file contents not being populated in some cases - - Thanks to [David Biňovec][@david-binda] for the patch -- Fixed bug [#1344][sq-1344] : PEAR.Functions.FunctionCallSignatureSniff throws error for blank comment lines -- Fixed bug [#1347][sq-1347] : PSR2.Methods.FunctionCallSignature strips some comments during fixing - - Thanks to [Algirdas Gurevicius][@uniquexor] for the patch -- Fixed bug [#1349][sq-1349] : Squiz.Strings.DoubleQuoteUsage.NotRequired message is badly formatted when string contains a CR newline char - - Thanks to [Algirdas Gurevicius][@uniquexor] for the patch -- Fixed bug [#1350][sq-1350] : Invalid Squiz.Formatting.OperatorBracket error when using namespaces -- Fixed bug [#1369][sq-1369] : Empty line in multi-line function declaration cause infinite loop - -[sq-1340]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1340 -[sq-1344]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1344 -[sq-1347]: https://github.com/squizlabs/PHP_CodeSniffer/pull/1347 -[sq-1349]: https://github.com/squizlabs/PHP_CodeSniffer/pull/1349 -[sq-1350]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1350 -[sq-1369]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1369 - -## [2.8.0] - 2017-02-02 - -### Changed -- The Internal.NoCodeFound error is no longer generated for content sourced from STDIN - - This should stop some Git hooks generating errors because PHPCS is trying to process the refs passed on STDIN -- Squiz.Commenting.DocCommentAlignment now checks comments on class properties defined using the VAR keyword - - Thanks to [Klaus Purer][@klausi] for the patch -- The getMethodParameters() method now recognises "self" as a valid type hint - - The return array now contains a new "content" index containing the raw content of the param definition - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- The getMethodParameters() method now supports nullable types - - The return array now contains a new "nullable_type" index set to true or false for each method param - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- The getMethodParameters() method now supports closures - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Added more guard code for JS files with syntax errors (request [#1271][sq-1271] and request [#1272][sq-1272]) -- Added more guard code for CSS files with syntax errors (request [#1304][sq-1304]) -- PEAR.Commenting.FunctionComment fixers now correctly handle multi-line param comments -- AbstractVariableSniff now supports anonymous classes - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Generic.NamingConventions.ConstructorName and PEAR.NamingConventions.ValidVariable now support anonymous classes -- Generic.NamingConventions.CamelCapsFunctionName and PEAR.NamingConventions.ValidFunctionName now support anonymous classes - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Generic.CodeAnalysis.UnusedFunctionParameter and PEAR.Functions.ValidDefaultValue now support closures - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- PEAR.NamingConventions.ValidClassName and Squiz.Classes.ValidClassName now support traits - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Generic.Functions.FunctionCallArgumentSpacing now supports closures other PHP-provided functions - - Thanks to [Algirdas Gurevicius][@uniquexor] for the patch -- Fixed an error where a nullable type character was detected as an inline then token - - A new T_NULLABLE token has been added to represent the ? nullable type character - - Thanks to [Jaroslav Hanslík][@kukulich] for the patch -- Squiz.WhiteSpace.SemicolonSpacing no longer removes comments while fixing the placement of semicolons - - Thanks to [Algirdas Gurevicius][@uniquexor] for the patch - -### Fixed -- Fixed bug [#1230][sq-1230] : JS tokeniser incorrectly tokenises bitwise shifts as comparison - - Thanks to [Ryan McCue][@rmccue] for the patch -- Fixed bug [#1237][sq-1237] : Uninitialized string offset in PHP Tokenizer on PHP 5.2 -- Fixed bug [#1239][sq-1239] : Warning when static method name is 'default' -- Fixed bug [#1240][sq-1240] : False positive for function names starting with triple underscore - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#1245][sq-1245] : SELF is not recognised as T_SELF token in: return new self -- Fixed bug [#1246][sq-1246] : A mix of USE statements with and without braces can cause the tokenizer to mismatch brace tokens - - Thanks to [Michał Bundyra][@michalbundyra] for the patch -- Fixed bug [#1249][sq-1249] : GitBlame report requires a .git directory -- Fixed bug [#1252][sq-1252] : Squiz.Strings.ConcatenationSpacing fix creates syntax error when joining a number to a string -- Fixed bug [#1253][sq-1253] : Generic.ControlStructures.InlineControlStructure fix creates syntax error fixing if-try/catch -- Fixed bug [#1255][sq-1255] : Inconsistent indentation check results when ELSE on new line -- Fixed bug [#1257][sq-1257] : Double dash in CSS class name can lead to "Named colours are forbidden" false positives -- Fixed bug [#1260][sq-1260] : Syntax errors not being shown when error_prepend_string is set - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Fixed bug [#1264][sq-1264] : Array return type hint is sometimes detected as T_ARRAY_HINT instead of T_RETURN_TYPE - - Thanks to [Jaroslav Hanslík][@kukulich] for the patch -- Fixed bug [#1265][sq-1265] : ES6 arrow function raises unexpected operator spacing errors -- Fixed bug [#1267][sq-1267] : Fixer incorrectly handles filepaths with repeated dir names - - Thanks to [Sergey Ovchinnikov][@orx0r] for the patch -- Fixed bug [#1276][sq-1276] : Commenting.FunctionComment.InvalidReturnVoid conditional issue with anonymous classes -- Fixed bug [#1277][sq-1277] : Squiz.PHP.DisallowMultipleAssignments.Found error when var assignment is on the same line as an open tag -- Fixed bug [#1284][sq-1284] : Squiz.Arrays.ArrayBracketSpacing.SpaceBeforeBracket false positive match for short list syntax - -[sq-1230]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1230 -[sq-1237]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1237 -[sq-1239]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1239 -[sq-1240]: https://github.com/squizlabs/PHP_CodeSniffer/pull/1240 -[sq-1245]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1245 -[sq-1246]: https://github.com/squizlabs/PHP_CodeSniffer/pull/1246 -[sq-1249]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1249 -[sq-1252]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1252 -[sq-1253]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1253 -[sq-1255]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1255 -[sq-1257]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1257 -[sq-1260]: https://github.com/squizlabs/PHP_CodeSniffer/pull/1260 -[sq-1264]: https://github.com/squizlabs/PHP_CodeSniffer/pull/1264 -[sq-1265]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1265 -[sq-1267]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1267 -[sq-1271]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1271 -[sq-1272]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1272 -[sq-1276]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1276 -[sq-1277]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1277 -[sq-1284]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1284 -[sq-1304]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1304 - -## [2.7.1] - 2016-11-30 - -### Changed -- Squiz.ControlStructures.ControlSignature.SpaceAfterCloseParenthesis fix now removes unnecessary whitespace -- Squiz.Formatting.OperatorBracket no longer errors for negative array indexes used within a function call -- Squiz.PHP.EmbeddedPhp no longer expects a semicolon after statements that are only opening a scope -- Fixed a problem where the content of T_DOC_COMMENT_CLOSE_TAG tokens could sometimes be (boolean) false -- Developers of custom standards with custom test runners can now have their standards ignored by the built-in test runner - - Set the value of an environment variable called PHPCS_IGNORE_TESTS with a comma separated list of your standard names - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- The unit test runner now loads the test sniff outside of the standard's ruleset so that exclude rules do not get applied - - This may have caused problems when testing custom sniffs inside custom standards - - Also makes the unit tests runs a little faster -- The SVN pre-commit hook now works correctly when installed via composer - - Thanks to [Sergey][@sserbin] for the patch - -### Fixed -- Fixed bug [#1135][sq-1135] : PEAR.ControlStructures.MultiLineCondition.CloseBracketNewLine not detected if preceded by multiline function call -- Fixed bug [#1138][sq-1138] : PEAR.ControlStructures.MultiLineCondition.Alignment not detected if closing brace is first token on line -- Fixed bug [#1141][sq-1141] : Sniffs that check EOF newlines don't detect newlines properly when the last token is a doc block -- Fixed bug [#1150][sq-1150] : Squiz.Strings.EchoedStrings does not properly fix bracketed statements -- Fixed bug [#1156][sq-1156] : Generic.Formatting.DisallowMultipleStatements errors when multiple short echo tags are used on the same line - - Thanks to [Nikola Kovacs][@nkovacs] for the patch -- Fixed bug [#1161][sq-1161] : Absolute report path is treated like a relative path if it also exists within the current directory -- Fixed bug [#1170][sq-1170] : Javascript regular expression literal not recognized after comparison operator -- Fixed bug [#1180][sq-1180] : Class constant named FUNCTION is incorrectly tokenized -- Fixed bug [#1181][sq-1181] : Squiz.Operators.IncrementDecrementUsage.NoBrackets false positive when incrementing properties - - Thanks to [Jürgen Henge-Ernst][@hernst42] for the patch -- Fixed bug [#1188][sq-1188] : Generic.WhiteSpace.ScopeIndent issues with inline HTML and multi-line function signatures -- Fixed bug [#1190][sq-1190] : phpcbf on if/else with trailing comment generates erroneous code -- Fixed bug [#1191][sq-1191] : Javascript sniffer fails with function called "Function" -- Fixed bug [#1203][sq-1203] : Inconsistent behavior of PHP_CodeSniffer_File::findEndOfStatement -- Fixed bug [#1218][sq-1218] : CASE conditions using class constants named NAMESPACE/INTERFACE/TRAIT etc are incorrectly tokenized -- Fixed bug [#1221][sq-1221] : Indented function call with multiple closure arguments can cause scope indent error -- Fixed bug [#1224][sq-1224] : PHPCBF fails to fix code with heredoc/nowdoc as first argument to a function - -[sq-1135]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1135 -[sq-1138]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1138 -[sq-1141]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1141 -[sq-1150]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1150 -[sq-1156]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1156 -[sq-1161]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1161 -[sq-1170]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1170 -[sq-1180]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1180 -[sq-1181]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1181 -[sq-1188]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1188 -[sq-1190]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1190 -[sq-1191]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1191 -[sq-1203]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1203 -[sq-1218]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1218 -[sq-1221]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1221 -[sq-1224]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1224 - -## [2.7.0] - 2016-09-02 - -### Changed -- Added --file-list command line argument to allow a list of files and directories to be specified in an external file - - Useful if you have a generated list of files to check that would be too long for the command line - - File and directory paths are listed one per line - - Usage is: phpcs --file-list=/path/to/file-list ... - - Thanks to [Blotzu][@andrei-propertyguru] for the patch -- Values set using @codingStandardsChangeSetting comments can now contain spaces -- Sniff unit tests can now specify a list of test files instead of letting the runner pick them (request [#1078][sq-1078]) - - Useful if a sniff needs to exclude files based on the environment, or is checking filenames - - Override the new getTestFiles() method to specify your own list of test files -- Generic.Functions.OpeningFunctionBraceKernighanRitchie now ignores spacing for function return types - - The sniff code Generic.Functions.OpeningFunctionBraceKernighanRitchie.SpaceAfterBracket has been removed - - Replaced by Generic.Functions.OpeningFunctionBraceKernighanRitchie.SpaceBeforeBrace - - The new error message is slightly clearer as it indicates that a single space is needed before the brace -- Squiz.Commenting.LongConditionClosingComment now allows for the length of a code block to be configured - - Set the lineLimit property (default is 20) in your ruleset.xml file to set the code block length - - When the code block length is reached, the sniff will enforce a closing comment after the closing brace - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.Commenting.LongConditionClosingComment now allows for the end comment format to be configured - - Set the commentFormat property (default is "//end %s") in your ruleset.xml file to set the format - - The placeholder %s will be replaced with the type of condition opener, e.g., "//end foreach" - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Generic.PHPForbiddenFunctions now allows forbidden functions to have mixed case - - Previously, it would only do a strtolower comparison - - Error message now shows what case was found in the code and what the correct case should be - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Added Generic.Classes.OpeningBraceSameLine to ensure opening brace of class/interface/trait is on the same line as the declaration - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Added Generic.PHP.BacktickOperator to ban the use of the backtick operator for running shell commands - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Added Generic.PHP.DisallowAlternativePHPTags to ban the use of alternate PHP tags - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Squiz.WhiteSpace.LanguageConstructSpacing no longer checks for spaces if parenthesis are being used (request [#1062][sq-1062]) - - Makes this sniff more compatible with those that check parenthesis spacing of function calls -- Squiz.WhiteSpace.ObjectOperatorSpacing now has a setting to ignore newline characters around object operators - - Default remains FALSE, so newlines are not allowed - - Override the "ignoreNewlines" setting in a ruleset.xml file to change - - Thanks to [Alex Howansky][@AlexHowansky] for the patch -- Squiz.Scope.MethodScope now sniffs traits as well as classes and interfaces - - Thanks to [Jesse Donat][@donatj] for the patch -- PHPCBF is now able to fix Squiz.SelfMemberReference.IncorrectCase errors - - Thanks to [Nikola Kovacs][@nkovacs] for the patch -- PHPCBF is now able to fix Squiz.Commenting.VariableComment.IncorrectVarType - - Thanks to [Walt Sorensen][@photodude] for the patch -- PHPCBF is now able to fix Generic.PHP.DisallowShortOpenTag - - Thanks to [Juliette Reinders Folmer][@jrfnl] for the patch -- Improved the formatting of the end brace when auto fixing InlineControlStructure errors (request [#1121][sq-1121]) -- Generic.Functions.OpeningFunctionBraceKernighanRitchie.BraceOnNewLine fix no longer leaves blank line after brace (request [#1085][sq-1085]) -- Generic UpperCaseConstantNameSniff now allows lowercase namespaces in constant definitions - - Thanks to [Daniel Schniepp][@dschniepp] for the patch -- Squiz DoubleQuoteUsageSniff is now more tolerant of syntax errors caused by mismatched string tokens -- A few sniffs that produce errors based on the current PHP version can now be told to run using a specific PHP version - - Set the `php_version` config var using `--config-set`, `--runtime-set`, or in a ruleset to specify a specific PHP version - - The format of the PHP version is the same as the `PHP_VERSION_ID` constant (e.g., 50403 for version 5.4.3) - - Supported sniffs are Generic.PHP.DisallowAlternativePHPTags, PSR1.Classes.ClassDeclaration, Squiz.Commenting.FunctionComment - - Thanks to [Finlay Beaton][@ofbeaton] for the patch - -### Fixed -- Fixed bug [#985][sq-985] : Duplicate class definition detection generates false-positives in media queries - - Thanks to [Raphael Horber][@rhorber] for the patch -- Fixed bug [#1014][sq-1014] : Squiz VariableCommentSniff doesn't always detect a missing comment -- Fixed bug [#1066][sq-1066] : Undefined index: quiet in `CLI.php` during unit test run with `-v` command line arg -- Fixed bug [#1072][sq-1072] : Squiz.SelfMemberReference.NotUsed not detected if leading namespace separator is used -- Fixed bug [#1089][sq-1089] : Rulesets cannot be loaded if the path contains urlencoded characters -- Fixed bug [#1091][sq-1091] : PEAR and Squiz FunctionComment sniffs throw errors for some invalid @param line formats -- Fixed bug [#1092][sq-1092] : PEAR.Functions.ValidDefaultValue should not flag type hinted methods with a NULL default argument -- Fixed bug [#1095][sq-1095] : Generic LineEndings sniff replaces tabs with spaces with --tab-width is set -- Fixed bug [#1096][sq-1096] : Squiz FunctionDeclarationArgumentSpacing gives incorrect error/fix when variadic operator is followed by a space -- Fixed bug [#1099][sq-1099] : Group use declarations are incorrectly fixed by the PSR2 standard - - Thanks to [Jason McCreary][@jasonmccreary] for the patch -- Fixed bug [#1101][sq-1101] : Incorrect indent errors when breaking out of PHP inside an IF statement -- Fixed bug [#1102][sq-1102] : Squiz.Formatting.OperatorBracket.MissingBrackets faulty bracketing fix -- Fixed bug [#1109][sq-1109] : Wrong scope indent reported in anonymous class -- Fixed bug [#1112][sq-1112] : File docblock not recognized when require_once follows it -- Fixed bug [#1120][sq-1120] : InlineControlStructureSniff does not handle auto-fixing for control structures that make function calls -- Fixed bug [#1124][sq-1124] : Squiz.Operators.ComparisonOperatorUsage does not detect bracketed conditions for inline IF statements - - Thanks to [Raphael Horber][@rhorber] for the patch - -[sq-985]: https://github.com/squizlabs/PHP_CodeSniffer/issues/985 -[sq-1014]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1014 -[sq-1062]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1062 -[sq-1066]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1066 -[sq-1072]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1072 -[sq-1078]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1078 -[sq-1085]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1085 -[sq-1089]: https://github.com/squizlabs/PHP_CodeSniffer/pull/1089 -[sq-1091]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1091 -[sq-1092]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1092 -[sq-1095]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1095 -[sq-1096]: https://github.com/squizlabs/PHP_CodeSniffer/pull/1096 -[sq-1099]: https://github.com/squizlabs/PHP_CodeSniffer/pull/1099 -[sq-1101]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1101 -[sq-1102]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1102 -[sq-1109]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1109 -[sq-1112]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1112 -[sq-1120]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1120 -[sq-1121]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1121 -[sq-1124]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1124 - -## [2.6.2] - 2016-07-14 - -### Changed -- Added a new --exclude CLI argument to exclude a list of sniffs from checking and fixing (request [#904][sq-904]) - - Accepts the same sniff codes as the --sniffs command line argument, but provides the opposite functionality -- Added a new -q command line argument to disable progress and verbose information from being printed (request [#969][sq-969]) - - Useful if a coding standard hard-codes progress or verbose output but you want PHPCS to be quiet - - Use the command "phpcs --config-set quiet true" to turn quiet mode on by default -- Generic LineLength sniff no longer errors for comments that cannot be broken out onto a new line (request [#766][sq-766]) - - A typical case is a comment that contains a very long URL - - The comment is ignored if putting the URL on an indented new comment line would be longer than the allowed length -- Settings extensions in a ruleset no longer causes PHP notices during unit testing - - Thanks to [Klaus Purer][@klausi] for the patch -- Version control reports now show which errors are fixable if you are showing sources -- Added a new sniff to enforce a single space after a NOT operator (request [#1051][sq-1051]) - - Include in a ruleset using the code Generic.Formatting.SpaceAfterNot -- The Squiz.Commenting.BlockComment sniff now supports tabs for indenting comment lines (request [#1056][sq-1056]) - -### Fixed -- Fixed bug [#790][sq-790] : Incorrect missing @throws error in methods that use closures -- Fixed bug [#908][sq-908] : PSR2 standard is not checking that closing brace is on line following the body -- Fixed bug [#945][sq-945] : Incorrect indent behavior using deep-nested function and arrays -- Fixed bug [#961][sq-961] : Two anonymous functions passed as function/method arguments cause indentation false positive -- Fixed bug [#1005][sq-1005] : Using global composer vendor autoload breaks PHP lowercase built-in function sniff - - Thanks to [Michael Butler][@michaelbutler] for the patch -- Fixed bug [#1007][sq-1007] : Squiz Unreachable code detection is not working properly with a closure inside a case -- Fixed bug [#1023][sq-1023] : PSR2.Classes.ClassDeclaration fails if class extends base class and "implements" is on trailing line -- Fixed bug [#1026][sq-1026] : Arrays in comma delimited class properties cause ScopeIndent to increase indent -- Fixed bug [#1028][sq-1028] : Squiz ArrayDeclaration incorrectly fixes multi-line array where end bracket is not on a new line -- Fixed bug [#1034][sq-1034] : Squiz FunctionDeclarationArgumentSpacing gives incorrect error when first arg is a variadic -- Fixed bug [#1036][sq-1036] : Adjacent assignments aligned analysis statement wrong -- Fixed bug [#1049][sq-1049] : Version control reports can show notices when the report width is very small -- Fixed bug [#21050][pear-21050] : PEAR MultiLineCondition sniff suppresses errors on last condition line - -[sq-766]: https://github.com/squizlabs/PHP_CodeSniffer/issues/766 -[sq-790]: https://github.com/squizlabs/PHP_CodeSniffer/issues/790 -[sq-904]: https://github.com/squizlabs/PHP_CodeSniffer/issues/904 -[sq-908]: https://github.com/squizlabs/PHP_CodeSniffer/issues/908 -[sq-945]: https://github.com/squizlabs/PHP_CodeSniffer/issues/945 -[sq-961]: https://github.com/squizlabs/PHP_CodeSniffer/issues/961 -[sq-969]: https://github.com/squizlabs/PHP_CodeSniffer/issues/969 -[sq-1005]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1005 -[sq-1007]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1007 -[sq-1023]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1023 -[sq-1026]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1026 -[sq-1028]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1028 -[sq-1034]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1034 -[sq-1036]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1036 -[sq-1049]: https://github.com/squizlabs/PHP_CodeSniffer/pull/1049 -[sq-1051]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1051 -[sq-1056]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1056 -[pear-21050]: https://pear.php.net/bugs/bug.php?id=21050 - -## [2.6.1] - 2016-05-31 - -### Changed -- The PHP-supplied T_COALESCE token has been replicated for PHP versions before 7.0 -- Function return types of self, parent and callable are now tokenized as T_RETURN_TYPE - - Thanks to [Jaroslav Hanslík][@kukulich] for the patch -- The default_standard config setting now allows multiple standards to be listed, like on the command line - - Thanks to [Michael Mayer][@schnittstabil] for the patch -- Installations done via composer now only include the composer autoloader for PHP 5.3.2+ (request [#942][sq-942]) -- Added a rollbackChangeset() method to the Fixer class to purposely rollback the active changeset - -### Fixed -- Fixed bug [#940][sq-940] : Auto-fixing issue encountered with inconsistent use of braces -- Fixed bug [#943][sq-943] : Squiz.PHP.InnerFunctions.NotAllowed reported in anonymous classes -- Fixed bug [#944][sq-944] : PHP warning when running the latest phar -- Fixed bug [#951][sq-951] : InlineIfDeclaration: invalid error produced with UTF-8 string -- Fixed bug [#957][sq-957] : Operator spacing sniff errors when plus is used as part of a number - - Thanks to [Klaus Purer][@klausi] for the patch -- Fixed bug [#959][sq-959] : Call-time pass-by-reference false positive if there is a square bracket before the ampersand - - Thanks to [Konstantin Leboev][@realmfoo] for the patch -- Fixed bug [#962][sq-962] : Null coalescing operator (??) not detected as a token - - Thanks to [Joel Posti][@joelposti] for the patch -- Fixed bug [#973][sq-973] : Anonymous class declaration and PSR1.Files.SideEffects.FoundWithSymbols -- Fixed bug [#974][sq-974] : Error when file ends with "function" -- Fixed bug [#979][sq-979] : Anonymous function with return type hint is not refactored as expected -- Fixed bug [#983][sq-983] : Squiz.WhiteSpace.MemberVarSpacing.AfterComment fails to fix error when comment is not a docblock -- Fixed bug [#1010][sq-1010] : Squiz NonExecutableCode sniff does not detect boolean OR - - Thanks to [Derek Henderson][@2shediac] for the patch -- Fixed bug [#1015][sq-1015] : The Squiz.Commenting.FunctionComment sniff doesn't allow description in @return tag - - Thanks to [Alexander Obuhovich][@aik099] for the patch -- Fixed bug [#1022][sq-1022] : Duplicate spaces after opening bracket error with PSR2 standard -- Fixed bug [#1025][sq-1025] : Syntax error in JS file can cause undefined index for parenthesis_closer - -[sq-940]: https://github.com/squizlabs/PHP_CodeSniffer/issues/940 -[sq-942]: https://github.com/squizlabs/PHP_CodeSniffer/issues/942 -[sq-943]: https://github.com/squizlabs/PHP_CodeSniffer/issues/943 -[sq-944]: https://github.com/squizlabs/PHP_CodeSniffer/issues/944 -[sq-951]: https://github.com/squizlabs/PHP_CodeSniffer/issues/951 -[sq-957]: https://github.com/squizlabs/PHP_CodeSniffer/pull/957 -[sq-959]: https://github.com/squizlabs/PHP_CodeSniffer/issues/959 -[sq-962]: https://github.com/squizlabs/PHP_CodeSniffer/issues/962 -[sq-973]: https://github.com/squizlabs/PHP_CodeSniffer/issues/973 -[sq-974]: https://github.com/squizlabs/PHP_CodeSniffer/issues/974 -[sq-979]: https://github.com/squizlabs/PHP_CodeSniffer/issues/979 -[sq-983]: https://github.com/squizlabs/PHP_CodeSniffer/issues/983 -[sq-1010]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1010 -[sq-1015]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1015 -[sq-1022]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1022 -[sq-1025]: https://github.com/squizlabs/PHP_CodeSniffer/issues/1025 - -## [2.6.0] - 2016-04-04 - -### Changed -- Paths used when setting CLI arguments inside ruleset.xml files are now relative to the ruleset location (request [#847][sq-847]) - - This change only applies to paths within ARG tags, used to set CLI arguments - - Previously, the paths were relative to the directory PHPCS was being run from - - Absolute paths are still allowed and work the same way they always have - - This change allows ruleset.xml files to be more portable -- Content passed via STDIN will now be processed even if files are specified on the command line or in a ruleset -- When passing content via STDIN, you can now specify the file path to use on the command line (request [#934][sq-934]) - - This allows sniffs that check file paths to work correctly - - This is the same functionality provided by the phpcs_input_file line, except it is available on the command line -- Files processed with custom tokenizers will no longer be skipped if they appear minified (request [#877][sq-877]) - - If the custom tokenizer wants minified files skipped, it can set a $skipMinified member var to TRUE - - See the included JS and CSS tokenizers for an example -- Config vars set in ruleset.xml files are now processed earlier, allowing them to be used during sniff registration - - Among other things, this allows the installed_paths config var to be set in ruleset.xml files - - Thanks to [Pieter Frenssen][@pfrenssen] for the patch -- Improved detection of regular expressions in the JS tokenizer -- Generic PHP Syntax sniff now uses PHP_BINARY (if available) to determine the path to PHP if no other path is available - - You can still manually set `php_path` to use a specific binary for testing - - Thanks to [Andrew Berry][@deviantintegral] for the patch -- The PHP-supplied T_POW_EQUAL token has been replicated for PHP versions before 5.6 -- Added support for PHP7 use group declarations (request [#878][sq-878]) - - New tokens T_OPEN_USE_GROUP and T_CLOSE_USE_GROUP are assigned to the open and close curly braces -- Generic ScopeIndent sniff now reports errors for every line that needs the indent changed (request [#903][sq-903]) - - Previously, it ignored lines that were indented correctly in the context of their block - - This change produces more technically accurate error messages, but is much more verbose -- The PSR2 and Squiz standards now allow multi-line default values in function declarations (request [#542][sq-542]) - - Previously, these would automatically make the function a multi-line declaration -- Squiz InlineCommentSniff now allows docblocks on require(_once) and include(_once) statements - - Thanks to [Gary Jones][@GaryJones] for the patch -- Squiz and PEAR Class and File sniffs no longer assume the first comment in a file is always a file comment - - phpDocumentor assigns the comment to the file only if it is not followed by a structural element - - These sniffs now follow this same rule -- Squiz ClassCommentSniff no longer checks for blank lines before class comments - - Removes the error Squiz.Commenting.ClassComment.SpaceBefore -- Renamed Squiz.CSS.Opacity.SpacingAfterPoint to Squiz.CSS.Opacity.DecimalPrecision - - Please update your ruleset if you are referencing this error code directly -- Fixed PHP tokenizer problem that caused an infinite loop when checking a comment with specific content -- Generic Disallow Space and Tab indent sniffs now detect and fix indents inside embedded HTML chunks (request [#882][sq-882]) -- Squiz CSS IndentationSniff no longer assumes the class opening brace is at the end of a line -- Squiz FunctionCommentThrowTagSniff now ignores non-docblock comments -- Squiz ComparisonOperatorUsageSniff now allows conditions like while(true) -- PEAR FunctionCallSignatureSniff (and the Squiz and PSR2 sniffs that use it) now correctly check the first argument - - Further fix for bug [#698][sq-698] - -### Fixed -- Fixed bug [#791][sq-791] : codingStandardsChangeSetting settings not working with namespaces -- Fixed bug [#872][sq-872] : Incorrect detection of blank lines between CSS class names -- Fixed bug [#879][sq-879] : Generic InlineControlStructureSniff can create parse error when case/if/elseif/else have mixed brace and braceless definitions -- Fixed bug [#883][sq-883] : PSR2 is not checking for blank lines at the start and end of control structures -- Fixed bug [#884][sq-884] : Incorrect indentation notice for anonymous classes -- Fixed bug [#887][sq-887] : Using curly braces for a shared CASE/DEFAULT statement can generate an error in PSR2 SwitchDeclaration -- Fixed bug [#889][sq-889] : Closure inside catch/else/elseif causes indentation error -- Fixed bug [#890][sq-890] : Function call inside returned short array value can cause indentation error inside CASE statements -- Fixed bug [#897][sq-897] : Generic.Functions.CallTimePassByReference.NotAllowed false positive when short array syntax -- Fixed bug [#900][sq-900] : Squiz.Functions.FunctionDeclarationArgumentSpacing bug when no space between type hint and argument -- Fixed bug [#902][sq-902] : T_OR_EQUAL and T_POW_EQUAL are not seen as assignment tokens -- Fixed bug [#910][sq-910] : Unrecognized "extends" and indentation on anonymous classes -- Fixed bug [#915][sq-915] : JS Tokenizer generates errors when processing some decimals -- Fixed bug [#928][sq-928] : Endless loop when sniffing a PHP file with a git merge conflict inside a function -- Fixed bug [#937][sq-937] : Shebang can cause PSR1 SideEffects warning - - Thanks to [Clay Loveless][@claylo] for the patch -- Fixed bug [#938][sq-938] : CallTimePassByReferenceSniff ignores functions with return value - -[sq-542]: https://github.com/squizlabs/PHP_CodeSniffer/issues/542 -[sq-791]: https://github.com/squizlabs/PHP_CodeSniffer/issues/791 -[sq-847]: https://github.com/squizlabs/PHP_CodeSniffer/issues/847 -[sq-872]: https://github.com/squizlabs/PHP_CodeSniffer/issues/872 -[sq-877]: https://github.com/squizlabs/PHP_CodeSniffer/issues/877 -[sq-878]: https://github.com/squizlabs/PHP_CodeSniffer/issues/878 -[sq-879]: https://github.com/squizlabs/PHP_CodeSniffer/issues/879 -[sq-882]: https://github.com/squizlabs/PHP_CodeSniffer/issues/882 -[sq-883]: https://github.com/squizlabs/PHP_CodeSniffer/issues/883 -[sq-884]: https://github.com/squizlabs/PHP_CodeSniffer/issues/884 -[sq-887]: https://github.com/squizlabs/PHP_CodeSniffer/issues/887 -[sq-889]: https://github.com/squizlabs/PHP_CodeSniffer/issues/889 -[sq-890]: https://github.com/squizlabs/PHP_CodeSniffer/issues/890 -[sq-897]: https://github.com/squizlabs/PHP_CodeSniffer/issues/897 -[sq-900]: https://github.com/squizlabs/PHP_CodeSniffer/issues/900 -[sq-902]: https://github.com/squizlabs/PHP_CodeSniffer/issues/902 -[sq-903]: https://github.com/squizlabs/PHP_CodeSniffer/issues/903 -[sq-910]: https://github.com/squizlabs/PHP_CodeSniffer/issues/910 -[sq-915]: https://github.com/squizlabs/PHP_CodeSniffer/issues/915 -[sq-928]: https://github.com/squizlabs/PHP_CodeSniffer/issues/928 -[sq-934]: https://github.com/squizlabs/PHP_CodeSniffer/issues/934 -[sq-937]: https://github.com/squizlabs/PHP_CodeSniffer/pull/937 -[sq-938]: https://github.com/squizlabs/PHP_CodeSniffer/issues/938 - -## [2.5.1] - 2016-01-20 - -### Changed -- The PHP-supplied T_SPACESHIP token has been replicated for PHP versions before 7.0 -- T_SPACESHIP is now correctly identified as an operator - - Thanks to [Alexander Obuhovich][@aik099] for the patch -- Generic LowerCaseKeyword now ensures array type hints are lowercase as well - - Thanks to [Mathieu Rochette][@mathroc] for the patch -- Squiz ComparisonOperatorUsageSniff no longer hangs on JS FOR loops that don't use semicolons -- PHP_CodesSniffer now includes the composer `autoload.php` file, if there is one - - Thanks to [Klaus Purer][@klausi] for the patch -- Added error Squiz.Commenting.FunctionComment.ScalarTypeHintMissing for PHP7 only (request [#858][sq-858]) - - These errors were previously reported as Squiz.Commenting.FunctionComment.TypeHintMissing on PHP7 - - Disable this error message in a ruleset.xml file if your code needs to run on both PHP5 and PHP7 -- The PHP 5.6 __debugInfo magic method no longer produces naming convention errors - - Thanks to [Michael Nowack][@syranez] for the patch -- PEAR and Squiz FunctionComment sniffs now support variadic functions (request [#841][sq-841]) - -### Fixed -- Fixed bug [#622][sq-622] : Wrong detection of Squiz.CSS.DuplicateStyleDefinition with media queries -- Fixed bug [#752][sq-752] : The missing exception error is reported in first found DocBlock -- Fixed bug [#794][sq-794] : PSR2 MultiLineFunctionDeclaration forbids comments after opening parenthesis of a multiline call -- Fixed bug [#820][sq-820] : PEAR/PSR2 FunctionCallSignature sniffs suggest wrong indent when there are multiple arguments on a line -- Fixed bug [#822][sq-822] : Ruleset hard-coded file paths are not used if not running from the same directory as the ruleset -- Fixed bug [#825][sq-825] : FunctionCallArgumentSpacing sniff complains about more than one space before comment in multi-line function call -- Fixed bug [#828][sq-828] : Null classname is tokenized as T_NULL instead of T_STRING -- Fixed bug [#829][sq-829] : Short array argument not fixed correctly when multiple function arguments are on the same line -- Fixed bug [#831][sq-831] : PHPCS freezes in an infinite loop under Windows if no standard is passed -- Fixed bug [#832][sq-832] : Tokenizer does not support context sensitive parsing - - Thanks to [Jaroslav Hanslík][@kukulich] for the patch -- Fixed bug [#835][sq-835] : PEAR.Functions.FunctionCallSignature broken when closure uses return types -- Fixed bug [#838][sq-838] : CSS indentation fixer changes color codes - - Thanks to [Klaus Purer][@klausi] for the patch -- Fixed bug [#839][sq-839] : "__()" method is marked as not camel caps - - Thanks to [Tim Bezhashvyly][@tim-bezhashvyly] for the patch -- Fixed bug [#852][sq-852] : Generic.Commenting.DocComment not finding errors when long description is omitted -- Fixed bug [#854][sq-854] : Return typehints in interfaces are not reported as T_RETURN_TYPE - - Thanks to [Jaroslav Hanslík][@kukulich] for the patch -- Fixed bug [#855][sq-855] : Capital letter detection for multibyte strings doesn't work correctly -- Fixed bug [#857][sq-857] : PSR2.ControlStructure.SwitchDeclaration shouldn't check indent of curly brace closers -- Fixed bug [#859][sq-859] : Switch statement indention issue when returning function call with closure -- Fixed bug [#861][sq-861] : Single-line arrays and function calls can generate incorrect indentation errors -- Fixed bug [#867][sq-867] : Squiz.Strings.DoubleQuoteUsage broken for some escape codes - - Thanks to [Jack Blower][@ElvenSpellmaker] for the help with the fix -- Fixed bug [#21005][pear-21005] : Incorrect indent detection when multiple properties are initialized to arrays -- Fixed bug [#21010][pear-21010] : Incorrect missing colon detection in CSS when first style is not on new line -- Fixed bug [#21011][pear-21011] : Incorrect error message text when newline found after opening brace - -[sq-622]: https://github.com/squizlabs/PHP_CodeSniffer/issues/622 -[sq-752]: https://github.com/squizlabs/PHP_CodeSniffer/issues/752 -[sq-794]: https://github.com/squizlabs/PHP_CodeSniffer/issues/794 -[sq-820]: https://github.com/squizlabs/PHP_CodeSniffer/issues/820 -[sq-822]: https://github.com/squizlabs/PHP_CodeSniffer/issues/822 -[sq-825]: https://github.com/squizlabs/PHP_CodeSniffer/issues/825 -[sq-828]: https://github.com/squizlabs/PHP_CodeSniffer/issues/828 -[sq-829]: https://github.com/squizlabs/PHP_CodeSniffer/issues/829 -[sq-831]: https://github.com/squizlabs/PHP_CodeSniffer/issues/831 -[sq-832]: https://github.com/squizlabs/PHP_CodeSniffer/issues/832 -[sq-835]: https://github.com/squizlabs/PHP_CodeSniffer/issues/835 -[sq-838]: https://github.com/squizlabs/PHP_CodeSniffer/pull/838 -[sq-839]: https://github.com/squizlabs/PHP_CodeSniffer/issues/839 -[sq-841]: https://github.com/squizlabs/PHP_CodeSniffer/issues/841 -[sq-852]: https://github.com/squizlabs/PHP_CodeSniffer/issues/852 -[sq-854]: https://github.com/squizlabs/PHP_CodeSniffer/issues/854 -[sq-855]: https://github.com/squizlabs/PHP_CodeSniffer/pull/855 -[sq-857]: https://github.com/squizlabs/PHP_CodeSniffer/issues/857 -[sq-858]: https://github.com/squizlabs/PHP_CodeSniffer/issues/858 -[sq-859]: https://github.com/squizlabs/PHP_CodeSniffer/issues/859 -[sq-861]: https://github.com/squizlabs/PHP_CodeSniffer/issues/861 -[sq-867]: https://github.com/squizlabs/PHP_CodeSniffer/issues/867 -[pear-21005]: https://pear.php.net/bugs/bug.php?id=21005 -[pear-21010]: https://pear.php.net/bugs/bug.php?id=21010 -[pear-21011]: https://pear.php.net/bugs/bug.php?id=21011 - -## [2.5.0] - 2015-12-11 - -### Changed -- PHPCS will now look for a phpcs.xml file in parent directories as well as the current directory (request [#626][sq-626]) -- PHPCS will now use a phpcs.xml file even if files are specified on the command line - - This file is still only used if no standard is specified on the command line -- Added support for a phpcs.xml.dist file (request [#583][sq-583]) - - If both a phpcs.xml and phpcs.xml.dist file are present, the phpcs.xml file will be used -- Added support for setting PHP ini values in ruleset.xml files (request [#560][sq-560]) - - Setting the value of the new ini tags to name="memory_limit" value="32M" is the same as -d memory_limit=32M -- Added support for one or more bootstrap files to be run before processing begins - - Use the --bootstrap=file,file,file command line argument to include bootstrap files - - Useful if you want to override some of the high-level settings of PHPCS or PHPCBF - - Thanks to [John Maguire][@johnmaguire] for the patch -- Added additional verbose output for CSS tokenizing -- Squiz ComparisonOperatorUsageSniff now checks FOR, WHILE and DO-WHILE statements - - Thanks to [Arnout Boks][@aboks] for the patch - -### Fixed -- Fixed bug [#660][sq-660] : Syntax checks can fail on Windows with PHP5.6 -- Fixed bug [#784][sq-784] : $this->trait is seen as a T_TRAIT token -- Fixed bug [#786][sq-786] : Switch indent issue with short array notation -- Fixed bug [#787][sq-787] : SpacingAfterDefaultBreak confused by multi-line statements -- Fixed bug [#797][sq-797] : Parsing CSS url() value breaks further parsing -- Fixed bug [#805][sq-805] : Squiz.Commenting.FunctionComment.InvalidTypeHint on Scalar types on PHP7 -- Fixed bug [#807][sq-807] : Cannot fix line endings when open PHP tag is not on the first line -- Fixed bug [#808][sq-808] : JS tokenizer incorrectly setting some function and class names to control structure tokens -- Fixed bug [#809][sq-809] : PHPCBF can break a require_once statement with a space before the open parenthesis -- Fixed bug [#813][sq-813] : PEAR FunctionCallSignature checks wrong indent when first token on line is part of a multi-line string - -[sq-560]: https://github.com/squizlabs/PHP_CodeSniffer/issues/560 -[sq-583]: https://github.com/squizlabs/PHP_CodeSniffer/issues/583 -[sq-626]: https://github.com/squizlabs/PHP_CodeSniffer/issues/626 -[sq-660]: https://github.com/squizlabs/PHP_CodeSniffer/pull/660 -[sq-784]: https://github.com/squizlabs/PHP_CodeSniffer/issues/784 -[sq-786]: https://github.com/squizlabs/PHP_CodeSniffer/issues/786 -[sq-787]: https://github.com/squizlabs/PHP_CodeSniffer/issues/787 -[sq-797]: https://github.com/squizlabs/PHP_CodeSniffer/issues/797 -[sq-805]: https://github.com/squizlabs/PHP_CodeSniffer/issues/805 -[sq-807]: https://github.com/squizlabs/PHP_CodeSniffer/issues/807 -[sq-808]: https://github.com/squizlabs/PHP_CodeSniffer/issues/808 -[sq-809]: https://github.com/squizlabs/PHP_CodeSniffer/issues/809 -[sq-813]: https://github.com/squizlabs/PHP_CodeSniffer/issues/813 - -## [2.4.0] - 2015-11-24 - -### Changed -- Added support for PHP 7 anonymous classes - - Anonymous classes are now tokenized as T_ANON_CLASS and ignored by normal class sniffs -- Added support for PHP 7 function return type declarations - - Return types are now tokenized as T_RETURN_TYPE -- Fixed tokenizing of the XOR operator, which was incorrectly identified as a power operator (bug [#765][sq-765]) - - The T_POWER token has been removed and replaced by the T_BITWISE_XOR token - - The PHP-supplied T_POW token has been replicated for PHP versions before 5.6 -- Traits are now tokenized in PHP versions before 5.4 to make testing easier -- Improved regular expression detection in JS files -- PEAR FunctionCallSignatureSniff now properly detects indents in more mixed HTML/PHP code blocks -- Full report now properly indents lines when newlines are found inside error messages -- Generating documentation without specifying a standard now uses the default standard instead - - Thanks to [Ken Guest][@kenguest] for the patch -- Generic InlineControlStructureSniff now supports braceless do/while loops in JS - - Thanks to [Pieter Frenssen][@pfrenssen] for the patch -- Added more guard code for function declarations with syntax errors - - Thanks to Yun Young-jin for the patch -- Added more guard code for foreach declarations with syntax errors - - Thanks to [Johan de Ruijter][@johanderuijter] for the patch -- Added more guard code for class declarations with syntax errors -- Squiz ArrayDeclarationSniff now has guard code for arrays with syntax errors -- Generic InlineControlStructureSniff now correctly fixes ELSEIF statements - -### Fixed -- Fixed bug [#601][sq-601] : Expected type hint int[]; found array in Squiz FunctionCommentSniff - - Thanks to [Scato Eggen][@scato] for the patch -- Fixed bug [#625][sq-625] : Consider working around T_HASHBANG in HHVM 3.5.x and 3.6.x - - Thanks to [Kunal Mehta][@legoktm] for the patch -- Fixed bug [#692][sq-692] : Comment tokenizer can break when using mbstring function overloading -- Fixed bug [#694][sq-694] : Long sniff codes can cause PHP warnings in source report when showing error codes -- Fixed bug [#698][sq-698] : PSR2.Methods.FunctionCallSignature.Indent forces exact indent of ternary operator parameters -- Fixed bug [#704][sq-704] : ScopeIndent can fail when an opening parenthesis is on a line by itself -- Fixed bug [#707][sq-707] : Squiz MethodScopeSniff doesn't handle nested functions -- Fixed bug [#709][sq-709] : Squiz.Sniffs.Whitespace.ScopeClosingBraceSniff marking indented endif in mixed inline HTML blocks -- Fixed bug [#711][sq-711] : Sniffing from STDIN shows Generic.Files.LowercasedFilename.NotFound error -- Fixed bug [#714][sq-714] : Fixes suppression of errors using docblocks - - Thanks to [Andrzej Karmazyn][@akarmazyn] for the patch -- Fixed bug [#716][sq-716] : JSON report is invalid when messages contain newlines or tabs - - Thanks to [Pieter Frenssen][@pfrenssen] for the patch -- Fixed bug [#723][sq-723] : ScopeIndent can fail when multiple array closers are on the same line -- Fixed bug [#730][sq-730] : ScopeIndent can fail when a short array opening square bracket is on a line by itself -- Fixed bug [#732][sq-732] : PHP Notice if @package name is made up of all invalid characters - - Adds new error code PEAR.Commenting.FileComment.InvalidPackageValue -- Fixed bug [#748][sq-748] : Auto fix for Squiz.Commenting.BlockComment.WrongEnd is incorrect - - Thanks to [J.D. Grimes][@JDGrimes] for the patch -- Fixed bug [#753][sq-753] : PSR2 standard shouldn't require space after USE block when next code is a closing tag -- Fixed bug [#768][sq-768] : PEAR FunctionCallSignature sniff forbids comments after opening parenthesis of a multiline call -- Fixed bug [#769][sq-769] : Incorrect detection of variable reference operator when used with short array syntax - - Thanks to [Klaus Purer][@klausi] for the patch -- Fixed bug [#772][sq-772] : Syntax error when using PHPCBF on alternative style foreach loops -- Fixed bug [#773][sq-773] : Syntax error when stripping trailing PHP close tag and previous statement has no semicolon -- Fixed bug [#778][sq-778] : PHPCBF creates invalid PHP for inline FOREACH containing multiple control structures -- Fixed bug [#781][sq-781] : Incorrect checking for PHP7 return types on multi-line function declarations -- Fixed bug [#782][sq-782] : Conditional function declarations cause fixing conflicts in Squiz standard - - Squiz.ControlStructures.ControlSignature no longer enforces a single newline after open brace - - Squiz.WhiteSpace.ControlStructureSpacing can be used to check spacing at the start/end of control structures - -[sq-601]: https://github.com/squizlabs/PHP_CodeSniffer/issues/601 -[sq-625]: https://github.com/squizlabs/PHP_CodeSniffer/issues/625 -[sq-692]: https://github.com/squizlabs/PHP_CodeSniffer/pull/692 -[sq-694]: https://github.com/squizlabs/PHP_CodeSniffer/issues/694 -[sq-698]: https://github.com/squizlabs/PHP_CodeSniffer/issues/698 -[sq-704]: https://github.com/squizlabs/PHP_CodeSniffer/issues/704 -[sq-707]: https://github.com/squizlabs/PHP_CodeSniffer/pull/707 -[sq-709]: https://github.com/squizlabs/PHP_CodeSniffer/issues/709 -[sq-711]: https://github.com/squizlabs/PHP_CodeSniffer/issues/711 -[sq-714]: https://github.com/squizlabs/PHP_CodeSniffer/pull/714 -[sq-716]: https://github.com/squizlabs/PHP_CodeSniffer/pull/716 -[sq-723]: https://github.com/squizlabs/PHP_CodeSniffer/issues/723 -[sq-730]: https://github.com/squizlabs/PHP_CodeSniffer/pull/730 -[sq-732]: https://github.com/squizlabs/PHP_CodeSniffer/pull/732 -[sq-748]: https://github.com/squizlabs/PHP_CodeSniffer/pull/748 -[sq-753]: https://github.com/squizlabs/PHP_CodeSniffer/issues/753 -[sq-765]: https://github.com/squizlabs/PHP_CodeSniffer/issues/765 -[sq-768]: https://github.com/squizlabs/PHP_CodeSniffer/issues/768 -[sq-769]: https://github.com/squizlabs/PHP_CodeSniffer/pull/769 -[sq-772]: https://github.com/squizlabs/PHP_CodeSniffer/issues/772 -[sq-773]: https://github.com/squizlabs/PHP_CodeSniffer/issues/773 -[sq-778]: https://github.com/squizlabs/PHP_CodeSniffer/issues/778 -[sq-781]: https://github.com/squizlabs/PHP_CodeSniffer/issues/781 -[sq-782]: https://github.com/squizlabs/PHP_CodeSniffer/issues/782 - -## [2.3.4] - 2015-09-09 - -### Changed -- JSON report format now includes the fixable status for each error message and the total number of fixable errors -- Added more guard code for function declarations with syntax errors -- Added tokenizer support for the PHP declare construct - - Thanks to [Andy Blyler][@ablyler] for the patch -- Generic UnnecessaryStringConcatSniff can now allow strings concatenated over multiple lines - - Set the allowMultiline property to TRUE (default is FALSE) in your ruleset.xml file to enable this - - By default, concat used only for getting around line length limits still generates an error - - Thanks to [Stefan Lenselink][@stefanlenselink] for the contribution -- Invalid byte sequences no longer throw iconv_strlen() errors (request [#639][sq-639]) - - Thanks to [Willem Stuursma][@willemstuursma] for the patch -- Generic TodoSniff and FixmeSniff are now better at processing strings with invalid characters -- PEAR FunctionCallSignatureSniff now ignores indentation of inline HTML content -- Squiz ControlSignatureSniff now supports control structures with only inline HTML content - -### Fixed -- Fixed bug [#636][sq-636] : Some class names cause CSS tokenizer to hang -- Fixed bug [#638][sq-638] : VCS blame reports output error content from the blame commands for files not under VC -- Fixed bug [#642][sq-642] : Method params incorrectly detected when default value uses short array syntax - - Thanks to [Josh Davis][@joshdavis11] for the patch -- Fixed bug [#644][sq-644] : PEAR ScopeClosingBrace sniff does not work with mixed HTML/PHP -- Fixed bug [#645][sq-645] : FunctionSignature and ScopeIndent sniffs don't detect indents correctly when PHP open tag is not on a line by itself -- Fixed bug [#648][sq-648] : Namespace not tokenized correctly when followed by multiple use statements -- Fixed bug [#654][sq-654] : Comments affect indent check for BSDAllman brace style -- Fixed bug [#658][sq-658] : Squiz.Functions.FunctionDeclarationSpacing error for multi-line declarations with required spaces greater than zero - - Thanks to [J.D. Grimes][@JDGrimes] for the patch -- Fixed bug [#663][sq-663] : No space after class name generates: Class name "" is not in camel caps format -- Fixed bug [#667][sq-667] : Scope indent check can go into infinite loop due to some parse errors -- Fixed bug [#670][sq-670] : Endless loop in PSR1 SideEffects sniffer if no semicolon after last statement - - Thanks to [Thomas Jarosch][@thomasjfox] for the patch -- Fixed bug [#672][sq-672] : Call-time pass-by-reference false positive -- Fixed bug [#683][sq-683] : Comments are incorrectly reported by PSR2.ControlStructures.SwitchDeclaration sniff -- Fixed bug [#687][sq-687] : ScopeIndent does not check indent correctly for method prefixes like public and abstract -- Fixed bug [#689][sq-689] : False error on some comments after class closing brace - -[sq-636]: https://github.com/squizlabs/PHP_CodeSniffer/issues/636 -[sq-638]: https://github.com/squizlabs/PHP_CodeSniffer/issues/638 -[sq-639]: https://github.com/squizlabs/PHP_CodeSniffer/pull/639 -[sq-642]: https://github.com/squizlabs/PHP_CodeSniffer/pull/642 -[sq-644]: https://github.com/squizlabs/PHP_CodeSniffer/issues/644 -[sq-645]: https://github.com/squizlabs/PHP_CodeSniffer/issues/645 -[sq-648]: https://github.com/squizlabs/PHP_CodeSniffer/issues/648 -[sq-654]: https://github.com/squizlabs/PHP_CodeSniffer/issues/654 -[sq-658]: https://github.com/squizlabs/PHP_CodeSniffer/pull/658 -[sq-663]: https://github.com/squizlabs/PHP_CodeSniffer/issues/663 -[sq-667]: https://github.com/squizlabs/PHP_CodeSniffer/issues/667 -[sq-670]: https://github.com/squizlabs/PHP_CodeSniffer/pull/670 -[sq-672]: https://github.com/squizlabs/PHP_CodeSniffer/issues/672 -[sq-683]: https://github.com/squizlabs/PHP_CodeSniffer/issues/683 -[sq-687]: https://github.com/squizlabs/PHP_CodeSniffer/issues/687 -[sq-689]: https://github.com/squizlabs/PHP_CodeSniffer/issues/689 - -## [2.3.3] - 2015-06-24 - -### Changed -- Improved the performance of the CSS tokenizer, especially on very large CSS files (thousands of lines) - - Thanks to [Klaus Purer][@klausi] for the patch -- Defined tokens for lower PHP versions are now phpcs-specific strings instead of ints - - Stops conflict with other projects, like PHP_CodeCoverage -- Added more guard code for syntax errors to various sniffs -- Improved support for older HHVM versions - - Thanks to [Kunal Mehta][@legoktm] for the patch -- Squiz ValidLogicalOperatorsSniff now ignores XOR as type casting is different when using the ^ operator (request [#567][sq-567]) -- Squiz CommentedOutCodeSniff is now better at ignoring URLs inside comments -- Squiz ControlSignatureSniff is now better at checking embedded PHP code -- Squiz ScopeClosingBraceSniff is now better at checking embedded PHP code - -### Fixed -- Fixed bug [#584][sq-584] : Squiz.Arrays.ArrayDeclaration sniff gives incorrect NoComma error for multiline string values -- Fixed bug [#589][sq-589] : PEAR.Functions.FunctionCallSignature sniff not checking all function calls -- Fixed bug [#592][sq-592] : USE statement tokenizing can sometimes result in mismatched scopes -- Fixed bug [#594][sq-594] : Tokenizer issue on closure that returns by reference -- Fixed bug [#595][sq-595] : Colons in CSS selectors within media queries throw false positives - - Thanks to [Klaus Purer][@klausi] for the patch -- Fixed bug [#598][sq-598] : PHPCBF can break function/use closure brace placement -- Fixed bug [#603][sq-603] : Squiz ControlSignatureSniff hard-codes opener type while fixing -- Fixed bug [#605][sq-605] : Auto report-width specified in ruleset.xml ignored -- Fixed bug [#611][sq-611] : Invalid numeric literal on CSS files under PHP7 -- Fixed bug [#612][sq-612] : Multi-file diff generating incorrectly if files do not end with EOL char -- Fixed bug [#615][sq-615] : Squiz OperatorBracketSniff incorrectly reports and fixes operations using self:: -- Fixed bug [#616][sq-616] : Squiz DisallowComparisonAssignmentSniff inconsistent errors with inline IF statements -- Fixed bug [#617][sq-617] : Space after switch keyword in PSR-2 is not being enforced -- Fixed bug [#621][sq-621] : PSR2 SwitchDeclaration sniff doesn't detect, or correctly fix, case body on same line as statement - -[sq-567]: https://github.com/squizlabs/PHP_CodeSniffer/issues/567 -[sq-584]: https://github.com/squizlabs/PHP_CodeSniffer/issues/584 -[sq-589]: https://github.com/squizlabs/PHP_CodeSniffer/issues/589 -[sq-592]: https://github.com/squizlabs/PHP_CodeSniffer/issues/592 -[sq-594]: https://github.com/squizlabs/PHP_CodeSniffer/issues/594 -[sq-595]: https://github.com/squizlabs/PHP_CodeSniffer/pull/595 -[sq-598]: https://github.com/squizlabs/PHP_CodeSniffer/issues/598 -[sq-603]: https://github.com/squizlabs/PHP_CodeSniffer/issues/603 -[sq-605]: https://github.com/squizlabs/PHP_CodeSniffer/issues/605 -[sq-611]: https://github.com/squizlabs/PHP_CodeSniffer/issues/611 -[sq-612]: https://github.com/squizlabs/PHP_CodeSniffer/issues/612 -[sq-615]: https://github.com/squizlabs/PHP_CodeSniffer/issues/615 -[sq-616]: https://github.com/squizlabs/PHP_CodeSniffer/issues/616 -[sq-617]: https://github.com/squizlabs/PHP_CodeSniffer/issues/617 -[sq-621]: https://github.com/squizlabs/PHP_CodeSniffer/issues/621 - -## [2.3.2] - 2015-04-29 - -### Changed -- The error message for PSR2.ControlStructures.SwitchDeclaration.WrongOpenercase is now clearer (request [#579][sq-579]) - -### Fixed -- Fixed bug [#545][sq-545] : Long list of CASE statements can cause tokenizer to reach a depth limit -- Fixed bug [#565][sq-565] : Squiz.WhiteSpace.OperatorSpacing reports negative number in short array - - Thanks to [Vašek Purchart][@VasekPurchart] for the patch - - Same fix also applied to Squiz.Formatting.OperatorBracket -- Fixed bug [#569][sq-569] : Generic ScopeIndentSniff throws PHP notices in JS files -- Fixed bug [#570][sq-570] : Phar class fatals in PHP less than 5.3 - -[sq-545]: https://github.com/squizlabs/PHP_CodeSniffer/issues/545 -[sq-565]: https://github.com/squizlabs/PHP_CodeSniffer/pull/565 -[sq-569]: https://github.com/squizlabs/PHP_CodeSniffer/pull/569 -[sq-570]: https://github.com/squizlabs/PHP_CodeSniffer/issues/570 -[sq-579]: https://github.com/squizlabs/PHP_CodeSniffer/issues/579 - -## [2.3.1] - 2015-04-23 - -### Changed -- PHPCS can now exit with 0 even if errors are found - - Set the ignore_errors_on_exit config variable to 1 to set this behaviour - - Use with the ignore_warnings_on_exit config variable to never return a non-zero exit code -- Added Generic DisallowLongArraySyntaxSniff to enforce the use of the PHP short array syntax (request [#483][sq-483]) - - Thanks to [Xaver Loppenstedt][@xalopp] for helping with tests -- Added Generic DisallowShortArraySyntaxSniff to ban the use of the PHP short array syntax (request [#483][sq-483]) - - Thanks to [Xaver Loppenstedt][@xalopp] for helping with tests -- Generic ScopeIndentSniff no longer does exact checking for content inside parenthesis (request [#528][sq-528]) - - Only applies to custom coding standards that set the "exact" flag to TRUE -- Squiz ConcatenationSpacingSniff now has a setting to ignore newline characters around operators (request [#511][sq-511]) - - Default remains FALSE, so newlines are not allowed - - Override the "ignoreNewlines" setting in a ruleset.xml file to change -- Squiz InlineCommentSniff no longer checks the last char of a comment if the first char is not a letter (request [#505][sq-505]) -- The Squiz standard has increased the max padding for statement alignment from 12 to 20 - -### Fixed -- Fixed bug [#479][sq-479] : Yielded values are not recognised as returned values in Squiz FunctionComment sniff -- Fixed bug [#512][sq-512] : Endless loop whilst parsing mixture of control structure styles -- Fixed bug [#515][sq-515] : Spaces in JS block incorrectly flagged as indentation error -- Fixed bug [#523][sq-523] : Generic ScopeIndent errors for IF in FINALLY -- Fixed bug [#527][sq-527] : Closure inside IF statement is not tokenized correctly -- Fixed bug [#529][sq-529] : Squiz.Strings.EchoedStrings gives false positive when echoing using an inline condition -- Fixed bug [#537][sq-537] : Using --config-set is breaking phpcs.phar -- Fixed bug [#543][sq-543] : SWITCH with closure in condition generates inline control structure error -- Fixed bug [#551][sq-551] : Multiple catch blocks not checked in Squiz.ControlStructures.ControlSignature sniff -- Fixed bug [#554][sq-554] : ScopeIndentSniff causes errors when encountering an unmatched parenthesis -- Fixed bug [#558][sq-558] : PHPCBF adds brace for ELSE IF split over multiple lines -- Fixed bug [#564][sq-564] : Generic MultipleStatementAlignment sniff reports incorrect errors for multiple assignments on a single line - -[sq-479]: https://github.com/squizlabs/PHP_CodeSniffer/issues/479 -[sq-483]: https://github.com/squizlabs/PHP_CodeSniffer/issues/483 -[sq-505]: https://github.com/squizlabs/PHP_CodeSniffer/issues/505 -[sq-511]: https://github.com/squizlabs/PHP_CodeSniffer/issues/511 -[sq-512]: https://github.com/squizlabs/PHP_CodeSniffer/issues/512 -[sq-515]: https://github.com/squizlabs/PHP_CodeSniffer/issues/515 -[sq-523]: https://github.com/squizlabs/PHP_CodeSniffer/issues/523 -[sq-527]: https://github.com/squizlabs/PHP_CodeSniffer/issues/527 -[sq-528]: https://github.com/squizlabs/PHP_CodeSniffer/issues/528 -[sq-529]: https://github.com/squizlabs/PHP_CodeSniffer/issues/529 -[sq-537]: https://github.com/squizlabs/PHP_CodeSniffer/issues/537 -[sq-543]: https://github.com/squizlabs/PHP_CodeSniffer/issues/543 -[sq-551]: https://github.com/squizlabs/PHP_CodeSniffer/issues/551 -[sq-554]: https://github.com/squizlabs/PHP_CodeSniffer/issues/554 -[sq-558]: https://github.com/squizlabs/PHP_CodeSniffer/issues/558 -[sq-564]: https://github.com/squizlabs/PHP_CodeSniffer/issues/564 - -## [2.3.0] - 2015-03-04 - -### Changed -- The existence of the main config file is now cached to reduce is_file() calls when it doesn't exist (request [#486][sq-486]) -- Abstract classes inside the Sniffs directory are now ignored even if they are named `[Name]Sniff.php` (request [#476][sq-476]) - - Thanks to [David Vernet][@Decave] for the patch -- PEAR and Squiz FileComment sniffs no longer have @ in their error codes - - e.g., PEAR.Commenting.FileComment.Duplicate@categoryTag becomes PEAR.Commenting.FileComment.DuplicateCategoryTag - - e.g., Squiz.Commenting.FileComment.Missing@categoryTag becomes Squiz.Commenting.FileComment.MissingCategoryTag -- PEAR MultiLineConditionSniff now allows comment lines inside multi-line IF statement conditions - - Thanks to [Klaus Purer][@klausi] for the patch -- Generic ForbiddenFunctionsSniff now supports setting null replacements in ruleset files (request [#263][sq-263]) -- Generic opening function brace sniffs now support checking of closures - - Set the checkClosures property to TRUE (default is FALSE) in your ruleset.xml file to enable this - - Can also set the checkFunctions property to FALSE (default is TRUE) in your ruleset.xml file to only check closures - - Affects OpeningFunctionBraceBsdAllmanSniff and OpeningFunctionBraceKernighanRitchieSniff -- Generic OpeningFunctionBraceKernighanRitchieSniff can now fix all the errors it finds -- Generic OpeningFunctionBraceKernighanRitchieSniff now allows empty functions with braces next to each other -- Generic OpeningFunctionBraceBsdAllmanSniff now allows empty functions with braces next to each other -- Improved auto report width for the "full" report -- Improved conflict detection during auto fixing -- Generic ScopeIndentSniff is no longer confused by empty closures -- Squiz ControlSignatureSniff now always ignores comments (fixes bug [#490][sq-490]) - - Include the Squiz.Commenting.PostStatementComment sniff in your ruleset.xml to ban these comments again -- Squiz OperatorSpacingSniff no longer throws errors for code in the form ($foo || -1 === $bar) -- Fixed errors tokenizing T_ELSEIF tokens on HHVM 3.5 -- Squiz ArrayDeclarationSniff is no longer tricked by comments after array values -- PEAR IncludingFileSniff no longer produces invalid code when removing parenthesis from require/include statements - -### Fixed -- Fixed bug [#415][sq-415] : The @codingStandardsIgnoreStart has no effect during fixing -- Fixed bug [#432][sq-432] : Properties of custom sniffs cannot be configured -- Fixed bug [#453][sq-453] : PSR2 standard does not allow closing tag for mixed PHP/HTML files -- Fixed bug [#457][sq-457] : FunctionCallSignature sniffs do not support here/nowdoc syntax and can cause syntax error when fixing -- Fixed bug [#466][sq-466] : PropertyLabelSpacing JS fixer issue when there is no space after colon -- Fixed bug [#473][sq-473] : Writing a report for an empty folder to existing file includes the existing contents -- Fixed bug [#485][sq-485] : PHP notice in Squiz.Commenting.FunctionComment when checking malformed @throws comment -- Fixed bug [#491][sq-491] : Generic InlineControlStructureSniff can correct with missing semicolon - - Thanks to [Jesse Donat][@donatj] for the patch -- Fixed bug [#492][sq-492] : Use statements don't increase the scope indent -- Fixed bug [#493][sq-493] : PSR1_Sniffs_Methods_CamelCapsMethodNameSniff false positives for some magic method detection - - Thanks to [Andreas Möller][@localheinz] for the patch -- Fixed bug [#496][sq-496] : Closures in PSR2 are not checked for a space after the function keyword -- Fixed bug [#497][sq-497] : Generic InlineControlStructureSniff does not support alternative SWITCH syntax -- Fixed bug [#500][sq-500] : Functions not supported as values in Squiz ArrayDeclaration sniff -- Fixed bug [#501][sq-501] : ScopeClosingBrace and ScopeIndent conflict with closures used as array values - - Generic ScopeIndentSniff may now report fewer errors for closures, but perform the same fixes -- Fixed bug [#502][sq-502] : PSR1 SideEffectsSniff sees declare() statements as side effects - -[sq-415]: https://github.com/squizlabs/PHP_CodeSniffer/issues/415 -[sq-432]: https://github.com/squizlabs/PHP_CodeSniffer/issues/432 -[sq-453]: https://github.com/squizlabs/PHP_CodeSniffer/issues/453 -[sq-457]: https://github.com/squizlabs/PHP_CodeSniffer/issues/457 -[sq-466]: https://github.com/squizlabs/PHP_CodeSniffer/issues/466 -[sq-473]: https://github.com/squizlabs/PHP_CodeSniffer/issues/473 -[sq-476]: https://github.com/squizlabs/PHP_CodeSniffer/issues/476 -[sq-485]: https://github.com/squizlabs/PHP_CodeSniffer/issues/485 -[sq-486]: https://github.com/squizlabs/PHP_CodeSniffer/issues/486 -[sq-490]: https://github.com/squizlabs/PHP_CodeSniffer/issues/490 -[sq-491]: https://github.com/squizlabs/PHP_CodeSniffer/pull/491 -[sq-492]: https://github.com/squizlabs/PHP_CodeSniffer/pull/492 -[sq-493]: https://github.com/squizlabs/PHP_CodeSniffer/pull/493 -[sq-496]: https://github.com/squizlabs/PHP_CodeSniffer/issues/496 -[sq-497]: https://github.com/squizlabs/PHP_CodeSniffer/issues/497 -[sq-500]: https://github.com/squizlabs/PHP_CodeSniffer/issues/500 -[sq-501]: https://github.com/squizlabs/PHP_CodeSniffer/issues/501 -[sq-502]: https://github.com/squizlabs/PHP_CodeSniffer/issues/502 - -## [2.2.0] - 2015-01-22 - -### Changed -- Added (hopefully) tastefully used colors to report and progress output for the phpcs command - - Use the --colors command line argument to use colors in output - - Use the command "phpcs --config-set colors true" to turn colors on by default - - Use the --no-colors command line argument to turn colors off when the config value is set -- Added support for using the full terminal width for report output - - Use the --report-width=auto command line argument to auto-size the reports - - Use the command "phpcs --config-set report_width auto" to use auto-sizing by default -- Reports will now size to fit inside the report width setting instead of always using padding to fill the space -- If no files or standards are specified, PHPCS will now look for a phpcs.xml file in the current directory - - This file has the same format as a standard ruleset.xml file - - The phpcs.xml file should specify (at least) files to process and a standard/sniffs to use - - Useful for running the phpcs and phpcbf commands without any arguments at the top of a repository -- Default file paths can now be specified in a ruleset.xml file using the "file" tag - - File paths are only processed if no files were specified on the command line -- Extensions specified on the CLI are now merged with those set in ruleset.xml files - - Previously, the ruleset.xml file setting replaced the CLI setting completely -- Squiz coding standard now requires lowercase PHP constants (true, false and null) - - Removed Squiz.NamingConventions.ConstantCase sniff as the rule is now consistent across PHP and JS files -- Squiz FunctionOpeningBraceSpaceSniff no longer does additional checks for JS functions - - PHP and JS functions and closures are now treated the same way -- Squiz MultiLineFunctionDeclarationSniff now supports JS files -- Interactive mode no longer breaks if you also specify a report type on the command line -- PEAR InlineCommentSniff now fixes the Perl-style comments that it finds (request [#375][sq-375]) -- PSR2 standard no longer fixes the placement of docblock open tags as comments are excluded from this standard -- PSR2 standard now sets a default tab width of 4 spaces -- Generic DocCommentSniff now only disallows lowercase letters at the start of a long/short comment (request [#377][sq-377]) - - All non-letter characters are now allowed, including markdown special characters and numbers -- Generic DisallowMultipleStatementsSniff now allows multiple open/close tags on the same line (request [#423][sq-423]) -- Generic CharacterBeforePHPOpeningTagSniff now only checks the first PHP tag it finds (request [#423][sq-423]) -- Generic CharacterBeforePHPOpeningTagSniff now allows a shebang line at the start of the file (request [#20481][pear-20481]) -- Generic InlineHTMLUnitTest now allows a shebang line at the start of the file (request [#20481][pear-20481]) -- PEAR ObjectOperatorIndentSniff now only checks object operators at the start of a line -- PEAR FileComment and ClassComment sniffs no longer have @ in their error codes - - E.g., PEAR.Commenting.FileComment.Missing@categoryTag becomes PEAR.Commenting.FileComment.MissingCategoryTag - - Thanks to [Grzegorz Rygielski][@grzr] for the patch -- Squiz ControlStructureSpacingSniff no longer enforces a blank line before CATCH statements -- Squiz FunctionCommentSniff now fixes the return type in the @return tag (request [#392][sq-392]) -- Squiz BlockCommentSniff now only disallows lowercase letters at the start of the comment -- Squiz InlineCommentSniff now only disallows lowercase letters at the start of the comment -- Squiz OperatorSpacingSniff now has a setting to ignore newline characters around operators (request [#348][sq-348]) - - Default remains FALSE, so newlines are not allowed - - Override the "ignoreNewlines" setting in a ruleset.xml file to change -- PSR2 ControlStructureSpacingSniff now checks for, and fixes, newlines after the opening parenthesis -- Added a markdown document generator (--generator=markdown to use) - - Thanks to [Stefano Kowalke][@Konafets] for the contribution - -### Fixed -- Fixed bug [#379][sq-379] : Squiz.Arrays.ArrayDeclaration.NoCommaAfterLast incorrectly detects comments -- Fixed bug [#382][sq-382] : JS tokenizer incorrect for inline conditionally created immediately invoked anon function -- Fixed bug [#383][sq-383] : Squiz.Arrays.ArrayDeclaration.ValueNoNewline incorrectly detects nested arrays -- Fixed bug [#386][sq-386] : Undefined offset in Squiz.FunctionComment sniff when param has no comment -- Fixed bug [#390][sq-390] : Indentation of non-control structures isn't adjusted when containing structure is fixed -- Fixed bug [#400][sq-400] : InlineControlStructureSniff fails to fix when statement has no semicolon -- Fixed bug [#401][sq-401] : PHPCBF no-patch option shows an error when there are no fixable violations in a file -- Fixed bug [#405][sq-405] : The "Squiz.WhiteSpace.FunctionSpacing" sniff removes class "}" during fixing -- Fixed bug [#407][sq-407] : PEAR.ControlStructures.MultiLineCondition doesn't account for comments at the end of lines -- Fixed bug [#410][sq-410] : The "Squiz.WhiteSpace.MemberVarSpacing" not respecting "var" -- Fixed bug [#411][sq-411] : Generic.WhiteSpace.ScopeIndent.Incorrect - false positive with multiple arrays in argument list -- Fixed bug [#412][sq-412] : PSR2 multi-line detection doesn't work for inline IF and string concats -- Fixed bug [#414][sq-414] : Squiz.WhiteSpace.MemberVarSpacing - inconsistent checking of member vars with comment -- Fixed bug [#433][sq-433] : Wrong detection of Squiz.Arrays.ArrayDeclaration.KeyNotAligned when key contains space -- Fixed bug [#434][sq-434] : False positive for spacing around "=>" in inline array within foreach -- Fixed bug [#452][sq-452] : Ruleset exclude-pattern for specific sniff code ignored when using CLI --ignore option -- Fixed bug [#20482][pear-20482] : Scope indent sniff can get into infinite loop when processing a parse error - -[sq-348]: https://github.com/squizlabs/PHP_CodeSniffer/issues/348 -[sq-375]: https://github.com/squizlabs/PHP_CodeSniffer/issues/375 -[sq-377]: https://github.com/squizlabs/PHP_CodeSniffer/issues/377 -[sq-379]: https://github.com/squizlabs/PHP_CodeSniffer/issues/379 -[sq-382]: https://github.com/squizlabs/PHP_CodeSniffer/issues/382 -[sq-383]: https://github.com/squizlabs/PHP_CodeSniffer/issues/383 -[sq-386]: https://github.com/squizlabs/PHP_CodeSniffer/issues/386 -[sq-390]: https://github.com/squizlabs/PHP_CodeSniffer/issues/390 -[sq-392]: https://github.com/squizlabs/PHP_CodeSniffer/issues/392 -[sq-400]: https://github.com/squizlabs/PHP_CodeSniffer/issues/400 -[sq-401]: https://github.com/squizlabs/PHP_CodeSniffer/issues/401 -[sq-405]: https://github.com/squizlabs/PHP_CodeSniffer/issues/405 -[sq-407]: https://github.com/squizlabs/PHP_CodeSniffer/issues/407 -[sq-410]: https://github.com/squizlabs/PHP_CodeSniffer/issues/410 -[sq-411]: https://github.com/squizlabs/PHP_CodeSniffer/issues/411 -[sq-412]: https://github.com/squizlabs/PHP_CodeSniffer/issues/412 -[sq-414]: https://github.com/squizlabs/PHP_CodeSniffer/issues/414 -[sq-423]: https://github.com/squizlabs/PHP_CodeSniffer/issues/423 -[sq-433]: https://github.com/squizlabs/PHP_CodeSniffer/issues/433 -[sq-434]: https://github.com/squizlabs/PHP_CodeSniffer/issues/434 -[sq-452]: https://github.com/squizlabs/PHP_CodeSniffer/issues/452 -[pear-20481]: https://pear.php.net/bugs/bug.php?id=20481 -[pear-20482]: https://pear.php.net/bugs/bug.php?id=20482 - -## [2.1.0] - 2014-12-18 - -### Changed -- Time and memory output is now shown if progress information is also shown (request [#335][sq-335]) -- A tilde can now be used to reference a user's home directory in a path to a standard (request [#353][sq-353]) -- Added PHP_CodeSniffer_File::findStartOfStatement() to find the first non-whitespace token in a statement - - Possible alternative for code using PHP_CodeSniffer_File::findPrevious() with the local flag set -- Added PHP_CodeSniffer_File::findEndOfStatement() to find the last non-whitespace token in a statement - - Possible alternative for code using PHP_CodeSniffer_File::findNext() with the local flag set -- Generic opening function brace sniffs now ensure the opening brace is the last content on the line - - Affects OpeningFunctionBraceBsdAllmanSniff and OpeningFunctionBraceKernighanRitchieSniff - - Also enforced in PEAR FunctionDeclarationSniff and Squiz MultiLineFunctionDeclarationSniff -- Generic DisallowTabIndentSniff now replaces tabs everywhere it finds them, except in strings and here/now docs -- Generic EmptyStatementSniff error codes now contain the type of empty statement detected (request [#314][sq-314]) - - All messages generated by this sniff are now errors (empty CATCH was previously a warning) - - Message code `Generic.CodeAnalysis.EmptyStatement.NotAllowed` has been removed - - Message code `Generic.CodeAnalysis.EmptyStatement.NotAllowedWarning` has been removed - - New message codes have the format `Generic.CodeAnalysis.EmptyStatement.Detected[TYPE]` - - Example code is `Generic.CodeAnalysis.EmptyStatement.DetectedCATCH` - - You can now use a custom ruleset to change messages to warnings and to exclude them -- PEAR and Squiz FunctionCommentSniffs no longer ban `@return` tags for constructors and destructors - - Removed message PEAR.Commenting.FunctionComment.ReturnNotRequired - - Removed message Squiz.Commenting.FunctionComment.ReturnNotRequired - - Change initiated by request [#324][sq-324] and request [#369][sq-369] -- Squiz EmptyStatementSniff has been removed - - Squiz standard now includes Generic EmptyStatementSniff and turns off the empty CATCH error -- Squiz ControlSignatureSniff fixes now retain comments between the closing parenthesis and open brace -- Squiz SuperfluousWhitespaceSniff now checks for extra blank lines inside closures - - Thanks to [Sertan Danis][@sertand] for the patch -- Squiz ArrayDeclarationSniff now skips function calls while checking multi-line arrays - -### Fixed -- Fixed bug [#337][sq-337] : False positive with anonymous functions in Generic_Sniffs_WhiteSpace_ScopeIndentSniff -- Fixed bug [#339][sq-339] : reformatting brace location can result in broken code -- Fixed bug [#342][sq-342] : Nested ternary operators not tokenized correctly -- Fixed bug [#345][sq-345] : Javascript regex not tokenized when inside array -- Fixed bug [#346][sq-346] : PHP path can't be determined in some cases in "phpcs.bat" (on Windows XP) -- Fixed bug [#358][sq-358] : False positives for Generic_Sniffs_WhiteSpace_ScopeIndentSniff -- Fixed bug [#361][sq-361] : Sniff-specific exclude patterns don't work for Windows -- Fixed bug [#364][sq-364] : Don't interpret "use function" as declaration -- Fixed bug [#366][sq-366] : phpcbf with PSR2 errors on control structure alternative syntax -- Fixed bug [#367][sq-367] : Nested Anonymous Functions Causing False Negative -- Fixed bug [#371][sq-371] : Shorthand binary cast causes tokenizer errors - - New token T_BINARY_CAST added for the b"string" cast format (the 'b' is the T_BINARY_CAST token) -- Fixed bug [#372][sq-372] : phpcbf parse problem, wrong brace placement for inline IF -- Fixed bug [#373][sq-373] : Double quote usage fix removing too many double quotes -- Fixed bug [#20196][pear-20196] : 1.5.2 breaks scope_closer position - -[sq-314]: https://github.com/squizlabs/PHP_CodeSniffer/issues/314 -[sq-324]: https://github.com/squizlabs/PHP_CodeSniffer/issues/324 -[sq-335]: https://github.com/squizlabs/PHP_CodeSniffer/issues/335 -[sq-337]: https://github.com/squizlabs/PHP_CodeSniffer/issues/337 -[sq-339]: https://github.com/squizlabs/PHP_CodeSniffer/issues/339 -[sq-342]: https://github.com/squizlabs/PHP_CodeSniffer/issues/342 -[sq-345]: https://github.com/squizlabs/PHP_CodeSniffer/issues/345 -[sq-346]: https://github.com/squizlabs/PHP_CodeSniffer/issues/346 -[sq-353]: https://github.com/squizlabs/PHP_CodeSniffer/issues/353 -[sq-358]: https://github.com/squizlabs/PHP_CodeSniffer/issues/358 -[sq-361]: https://github.com/squizlabs/PHP_CodeSniffer/issues/361 -[sq-364]: https://github.com/squizlabs/PHP_CodeSniffer/pull/364 -[sq-366]: https://github.com/squizlabs/PHP_CodeSniffer/issues/366 -[sq-367]: https://github.com/squizlabs/PHP_CodeSniffer/issues/367 -[sq-369]: https://github.com/squizlabs/PHP_CodeSniffer/issues/369 -[sq-371]: https://github.com/squizlabs/PHP_CodeSniffer/issues/371 -[sq-372]: https://github.com/squizlabs/PHP_CodeSniffer/issues/372 -[sq-373]: https://github.com/squizlabs/PHP_CodeSniffer/issues/373 -[pear-20196]: https://pear.php.net/bugs/bug.php?id=20196 - -## [2.0.0] - 2014-12-05 - -### Changed -- JS tokenizer now sets functions as T_CLOSUREs if the function is anonymous -- JS tokenizer now sets all objects to T_OBJECT - - Object end braces are set to a new token T_CLOSE_OBJECT - - T_OBJECT tokens no longer act like scopes; i.e., they have no condition/opener/closer - - T_PROPERTY tokens no longer act like scopes; i.e., they have no condition/opener/closer - - T_OBJECT tokens have a bracket_closer instead, which can be used to find the ending - - T_CLOSE_OBJECT tokens have a bracket_opener -- Improved regular expression detection in the JS tokenizer -- You can now get PHP_CodeSniffer to ignore a single line by putting @codingStandardsIgnoreLine in a comment - - When the comment is found, the comment line and the following line will be ignored - - Thanks to [Andy Bulford][@abulford] for the contribution -- PHPCBF now prints output when it is changing into directories -- Improved conflict detection during auto fixing -- The -vvv command line argument will now output the current file content for each loop during fixing -- Generic ScopeIndentSniff now checks that open/close PHP tags are aligned to the correct column -- PEAR FunctionCallSignatureSniff now checks indent of closing parenthesis even if it is not on a line by itself -- PEAR FunctionCallSignatureSniff now supports JS files -- PEAR MultiLineConditionSniff now supports JS files -- Squiz DocCommentAlignmentSniff now supports JS files -- Fixed a problem correcting the closing brace line in Squiz ArrayDeclarationSniff -- Fixed a problem auto-fixing the Squiz.WhiteSpace.FunctionClosingBraceSpace.SpacingBeforeNestedClose error -- Squiz EmbeddedPhpSniff no longer reports incorrect alignment of tags when they are not on new lines -- Squiz EmbeddedPhpSniff now aligns open tags correctly when moving them onto a new line -- Improved fixing of arrays with multiple values in Squiz ArrayDeclarationSniff -- Improved detection of function comments in Squiz FunctionCommentSpacingSniff -- Improved fixing of lines after cases statements in Squiz SwitchDeclarationSniff - -### Fixed -- Fixed bug [#311][sq-311] : Suppression of function prototype breaks checking of lines within function -- Fixed bug [#320][sq-320] : Code sniffer indentation issue -- Fixed bug [#333][sq-333] : Nested ternary operators causing problems - -[sq-320]: https://github.com/squizlabs/PHP_CodeSniffer/issues/320 -[sq-333]: https://github.com/squizlabs/PHP_CodeSniffer/issues/333 - -## [1.5.6] - 2014-12-05 - -### Changed -- JS tokenizer now detects xor statements correctly -- The --config-show command now pretty-prints the config values - - Thanks to [Ken Guest][@kenguest] for the patch -- Setting and removing config values now catches exceptions if the config file is not writable - - Thanks to [Ken Guest][@kenguest] for the patch -- Setting and removing config values now prints a message to confirm the action and show old values -- You can now get PHP_CodeSniffer to ignore a single line by putting @codingStandardsIgnoreLine in a comment - - When the comment is found, the comment line and the following line will be ignored - - Thanks to [Andy Bulford][@abulford] for the contribution -- Generic ConstructorNameSniff no longer errors for PHP4 style constructors when __construct() is present - - Thanks to [Thibaud Fabre][@fabre-thibaud] for the patch - -### Fixed -- Fixed bug [#280][sq-280] : The --config-show option generates error when there is no config file -- Fixed bug [#306][sq-306] : File containing only a namespace declaration raises undefined index notice -- Fixed bug [#308][sq-308] : Squiz InlineIfDeclarationSniff fails on ternary operators inside closure -- Fixed bug [#310][sq-310] : Variadics not recognized by tokenizer -- Fixed bug [#311][sq-311] : Suppression of function prototype breaks checking of lines within function - -[sq-311]: https://github.com/squizlabs/PHP_CodeSniffer/issues/311 - -## [2.0.0RC4] - 2014-11-07 - -### Changed -- JS tokenizer now detects xor statements correctly -- Improved detection of properties and objects in the JS tokenizer -- Generic ScopeIndentSniff can now fix indents using tabs instead of spaces - - Set the tabIndent property to TRUE in your ruleset.xml file to enable this - - It is important to also set a tab-width setting, either in the ruleset or on the command line, for accuracy -- Generic ScopeIndentSniff now checks and auto-fixes JS files -- Generic DisallowSpaceIndentSniff is now able to replace space indents with tab indents during fixing -- Support for phpcs-only and phpcbf-only attributes has been added to all ruleset.xml elements - - Allows parts of the ruleset to only apply when using a specific tool - - Useful for doing things like excluding indent fixes but still reporting indent errors -- Unit tests can now set command line arguments during a test run - - Override getCliValues() and pass an array of CLI arguments for each file being tested -- File-wide sniff properties can now be set using T_INLINE_HTML content during unit test runs - - Sniffs that start checking at the open tag can only, normally, have properties set using a ruleset -- Generic ConstructorNameSniff no longer errors for PHP4 style constructors when __construct() is present - - Thanks to [Thibaud Fabre][@fabre-thibaud] for the patch -- Generic DocCommentSniff now checks that the end comment tag is on a new line -- Generic MultipleStatementAlignmentSniff no longer skips assignments for closures -- Squiz DocCommentAlignment sniff now has better checking for single line doc block -- Running unit tests with the -v CLI argument no longer generates PHP errors - -### Fixed -- Fixed bug [#295][sq-295] : ScopeIndentSniff hangs when processing nested closures -- Fixed bug [#298][sq-298] : False positive in ScopeIndentSniff when anonymous functions are used with method chaining -- Fixed bug [#302][sq-302] : Fixing code in Squiz InlineComment sniff can remove some comment text -- Fixed bug [#303][sq-303] : Open and close tag on same line can cause a PHP notice checking scope indent -- Fixed bug [#306][sq-306] : File containing only a namespace declaration raises undefined index notice -- Fixed bug [#307][sq-307] : Conditional breaks in case statements get incorrect indentations -- Fixed bug [#308][sq-308] : Squiz InlineIfDeclarationSniff fails on ternary operators inside closure -- Fixed bug [#310][sq-310] : Variadics not recognized by tokenizer - -[sq-295]: https://github.com/squizlabs/PHP_CodeSniffer/issues/295 -[sq-298]: https://github.com/squizlabs/PHP_CodeSniffer/issues/298 -[sq-302]: https://github.com/squizlabs/PHP_CodeSniffer/issues/302 -[sq-303]: https://github.com/squizlabs/PHP_CodeSniffer/issues/303 -[sq-306]: https://github.com/squizlabs/PHP_CodeSniffer/issues/306 -[sq-307]: https://github.com/squizlabs/PHP_CodeSniffer/issues/307 -[sq-308]: https://github.com/squizlabs/PHP_CodeSniffer/issues/308 -[sq-310]: https://github.com/squizlabs/PHP_CodeSniffer/issues/310 - -## [2.0.0RC3] - 2014-10-16 - -### Changed -- Improved default output for PHPCBF and removed the options to print verbose and progress output -- If a .fixed file is supplied for a unit test file, the auto fixes will be checked against it during testing - - See Generic ScopeIndentUnitTest.inc and ScopeIndentUnitTest.inc.fixed for an example -- Fixer token replacement methods now return TRUE if the change was accepted and FALSE if rejected -- The --config-show command now pretty-prints the config values - - Thanks to [Ken Guest][@kenguest] for the patch -- Setting and removing config values now catches exceptions if the config file is not writable - - Thanks to [Ken Guest][@kenguest] for the patch -- Setting and removing config values now prints a message to confirm the action and show old values -- Generic ScopeIndentSniff has been completely rewritten to improve fixing and embedded PHP detection -- Generic DisallowTabIndent and DisallowSpaceIndent sniffs now detect indents at the start of block comments -- Generic DisallowTabIndent and DisallowSpaceIndent sniffs now detect indents inside multi-line strings -- Generic DisallowTabIndentSniff now replaces tabs inside doc block comments -- Squiz ControlStructureSpacingSniff error codes have been corrected; they were reversed -- Squiz EmbeddedPhpSniff now checks open and close tag indents and fixes some errors -- Squiz FileCommentSniff no longer throws incorrect blank line before comment errors in JS files -- Squiz ClassDeclarationSniff now has better checking for blank lines after a closing brace -- Removed error Squiz.Classes.ClassDeclaration.NoNewlineAfterCloseBrace (request [#285][sq-285]) - - Already handled by Squiz.Classes.ClassDeclaration.CloseBraceSameLine - -### Fixed -- Fixed bug [#280][sq-280] : The --config-show option generates error when there is no config file - -[sq-280]: https://github.com/squizlabs/PHP_CodeSniffer/issues/280 -[sq-285]: https://github.com/squizlabs/PHP_CodeSniffer/issues/285 - -## [2.0.0RC2] - 2014-09-26 - -### Changed -- Minified JS and CSS files are now detected and skipped (fixes bug [#252][sq-252] and bug [#19899][pear-19899]) - - A warning will be added to the file so it can be found in the report and ignored in the future -- Fixed incorrect length of JS object operator tokens -- PHP tokenizer no longer converts class/function names to special tokens types - - Class/function names such as parent and true would become special tokens such as T_PARENT and T_TRUE -- PHPCS can now exit with 0 if only warnings were found (request [#262][sq-262]) - - Set the ignore_warnings_on_exit config variable to 1 to set this behaviour - - Default remains at exiting with 0 only if no errors and no warnings were found - - Also changes return value of PHP_CodeSniffer_Reporting::printReport() -- Rulesets can now set associative array properties - - property `name="[property]" type="array" value="foo=>bar,baz=>qux"` -- Generic ForbiddenFunctionsSniff now has a public property called forbiddenFunctions (request [#263][sq-263]) - - Override the property in a ruleset.xml file to define forbidden functions and their replacements - - A replacement of NULL indicates that no replacement is available - - e.g., value="delete=>unset,print=>echo,create_function=>null" - - Custom sniffs overriding this one will need to change the visibility of their member var -- Improved closure support in Generic ScopeIndentSniff -- Improved indented PHP tag support in Generic ScopeIndentSniff -- Improved fixing of mixed line indents in Generic ScopeIndentSniff -- Added conflict detection to the file fixer - - If 2 sniffs look to be conflicting, one change will be ignored to allow a fix to occur -- Generic CamelCapsFunctionNameSniff now ignores a single leading underscore - - Thanks to [Alex Slobodiskiy][@xt99] for the patch -- Standards can now be located within hidden directories (further fix for bug [#20323][pear-20323]) - - Thanks to [Klaus Purer][@klausi] for the patch -- Sniff ignore patterns now replace Win dir separators like file ignore patterns already did -- Exclude patterns now use backtick delimiters, allowing all special characters to work correctly again - - Thanks to [Jeremy Edgell][@jedgell] for the patch -- Errors converted to warnings in a ruleset (and vice versa) now retain their fixable status - - Thanks to [Alexander Obuhovich][@aik099] for the patch -- Squiz ConcatenationSpacingSniff now has a setting to specify how many spaces there should be around concat operators - - Default remains at 0 - - Override the "spacing" setting in a ruleset.xml file to change -- Added auto-fixes for Squiz InlineCommentSniff -- Generic DocCommentSniff now correctly fixes additional blank lines at the end of a comment -- Squiz OperatorBracketSniff now correctly fixes operations that include arrays -- Zend ClosingTagSniff fix now correctly leaves closing tags when followed by HTML -- Added Generic SyntaxSniff to check for syntax errors in PHP files - - Thanks to [Blaine Schmeisser][@bayleedev] for the contribution -- Added Generic OneTraitPerFileSniff to check that only one trait is defined in each file - - Thanks to [Alexander Obuhovich][@aik099] for the contribution -- Squiz DiscouragedFunctionsSniff now warns about var_dump() -- PEAR ValidFunctionNameSniff no longer throws an error for _() -- Squiz and PEAR FunctionCommentSniffs now support _() -- Generic DisallowTabIndentSniff now checks for, and fixes, mixed indents again -- Generic UpperCaseConstantSniff and LowerCaseConstantSniff now ignore function names - -### Fixed -- Fixed bug [#243][sq-243] : Missing DocBlock not detected -- Fixed bug [#248][sq-248] : FunctionCommentSniff expects ampersand on param name -- Fixed bug [#265][sq-265] : False positives with type hints in ForbiddenFunctionsSniff -- Fixed bug [#20373][pear-20373] : Inline comment sniff tab handling way -- Fixed bug [#20377][pear-20377] : Error when trying to execute phpcs with report=json -- Fixed bug [#20378][pear-20378] : Report appended to existing file if no errors found in run -- Fixed bug [#20381][pear-20381] : Invalid "Comment closer must be on a new line" - - Thanks to [Brad Kent][@bkdotcom] for the patch -- Fixed bug [#20402][pear-20402] : SVN pre-commit hook fails due to unknown argument error - -[sq-243]: https://github.com/squizlabs/PHP_CodeSniffer/issues/243 -[sq-252]: https://github.com/squizlabs/PHP_CodeSniffer/issues/252 -[sq-262]: https://github.com/squizlabs/PHP_CodeSniffer/issues/262 -[sq-263]: https://github.com/squizlabs/PHP_CodeSniffer/issues/263 -[pear-19899]: https://pear.php.net/bugs/bug.php?id=19899 -[pear-20377]: https://pear.php.net/bugs/bug.php?id=20377 -[pear-20402]: https://pear.php.net/bugs/bug.php?id=20402 - -## [1.5.5] - 2014-09-25 - -### Changed -- PHP tokenizer no longer converts class/function names to special tokens types - - Class/function names such as parent and true would become special tokens such as T_PARENT and T_TRUE -- Improved closure support in Generic ScopeIndentSniff -- Improved indented PHP tag support in Generic ScopeIndentSniff -- Generic CamelCapsFunctionNameSniff now ignores a single leading underscore - - Thanks to [Alex Slobodiskiy][@xt99] for the patch -- Standards can now be located within hidden directories (further fix for bug [#20323][pear-20323]) - - Thanks to [Klaus Purer][@klausi] for the patch -- Added Generic SyntaxSniff to check for syntax errors in PHP files - - Thanks to [Blaine Schmeisser][@bayleedev] for the contribution -- Squiz DiscouragedFunctionsSniff now warns about var_dump() -- PEAR ValidFunctionNameSniff no longer throws an error for _() -- Squiz and PEAR FunctionCommentSnif now support _() -- Generic UpperCaseConstantSniff and LowerCaseConstantSniff now ignore function names - -### Fixed -- Fixed bug [#248][sq-248] : FunctionCommentSniff expects ampersand on param name -- Fixed bug [#265][sq-265] : False positives with type hints in ForbiddenFunctionsSniff -- Fixed bug [#20373][pear-20373] : Inline comment sniff tab handling way -- Fixed bug [#20378][pear-20378] : Report appended to existing file if no errors found in run -- Fixed bug [#20381][pear-20381] : Invalid "Comment closer must be on a new line" - - Thanks to [Brad Kent][@bkdotcom] for the patch -- Fixed bug [#20386][pear-20386] : Squiz.Commenting.ClassComment.SpacingBefore thrown if first block comment - -[sq-248]: https://github.com/squizlabs/PHP_CodeSniffer/issues/248 -[sq-265]: https://github.com/squizlabs/PHP_CodeSniffer/pull/265 -[pear-20373]: https://pear.php.net/bugs/bug.php?id=20373 -[pear-20378]: https://pear.php.net/bugs/bug.php?id=20378 -[pear-20381]: https://pear.php.net/bugs/bug.php?id=20381 -[pear-20386]: https://pear.php.net/bugs/bug.php?id=20386 - -## [2.0.0RC1] - 2014-08-06 - -### Changed -- PHPCBF will now fix incorrect newline characters in a file -- PHPCBF now exits cleanly when there are no errors to fix -- Added phpcbf.bat file for Windows -- Verbose option no longer errors when using a phar file with a space in the path -- Fixed a reporting error when using HHVM - - Thanks to [Martins Sipenko][@martinssipenko] for the patch -- addFixableError() and addFixableWarning() now only return true if the fixer is enabled - - Saves checking ($phpcsFile->fixer->enabled === true) before every fix -- Added addErrorOnLine() and addWarningOnLine() to add a non-fixable violation to a line at column 1 - - Useful if you are generating errors using an external tool or parser and only know line numbers - - Thanks to [Ondřej Mirtes][@ondrejmirtes] for the patch -- CSS tokenizer now identifies embedded PHP code using the new T_EMBEDDED_PHP token type - - The entire string of PHP is contained in a single token -- PHP tokenizer contains better detection of short array syntax -- Unit test runner now also test any standards installed under the installed_paths config var -- Exclude patterns now use {} delimiters, allowing the | special character to work correctly again -- The filtering component of the --extensions argument is now ignored again when passing filenames - - Can still be used to specify a custom tokenizer for each extension when passing filenames - - If no tokenizer is specified, default values will be used for common file extensions -- Diff report now produces relative paths on Windows, where possible (further fix for bug [#20234][pear-20234]) -- If a token's content has been modified by the tab-width setting, it will now have an orig_content in the tokens array -- Generic DisallowSpaceIndent and DisallowTabIndent sniffs now check original indent content even when tab-width is set - - Previously, setting --tab-width would force both to check the indent as spaces -- Fixed a problem where PHPCBF could replace tabs with too many spaces when changing indents -- Fixed a problem that could occur with line numbers when using HHVM to check files with Windows newline characters -- Removed use of sys_get_temp_dir() as this is not supported by the min PHP version -- Squiz ArrayDeclarationSniff now supports short array syntax -- Squiz ControlSignatureSniff no longer uses the Abstract Pattern sniff - - If you are extending this sniff, you'll need to rewrite your code - - The rewrite allows this sniff to fix all control structure formatting issues it finds -- The installed_paths config var now accepts relative paths - - The paths are relative to the PHP_CodeSniffer install directory - - Thanks to [Weston Ruter][@westonruter] for the patch -- Generic ScopeIndentSniff now accounts for different open tag indents -- PEAR FunctionDeclarationSniff now ignores short arrays when checking indent - - Thanks to [Daniel Tschinder][@danez] for the patch -- PSR2 FunctionCallSignatureSniff now treats multi-line strings as a single-line argument, like arrays and closures - - Thanks to [Dawid Nowak][@MacDada] for the patch -- PSR2 UseDeclarationSniff now checks for a single space after the USE keyword -- Generic ForbiddenFunctionsSniff now detects calls to functions in the global namespace - - Thanks to [Ole Martin Handeland][@olemartinorg] for the patch -- Generic LowerCaseConstantSniff and UpperCaseConstantSniff now ignore namespaces beginning with TRUE/FALSE/NULL - - Thanks to [Renan Gonçalves][@renan] for the patch -- Squiz InlineCommentSniff no longer requires a blank line after post-statement comments (request [#20299][pear-20299]) -- Squiz SelfMemberReferenceSniff now works correctly with namespaces -- Squiz FunctionCommentSniff is now more relaxed when checking namespaced type hints -- Tab characters are now encoded in abstract pattern error messages - - Thanks to [Blaine Schmeisser][@bayleedev] for the patch -- Invalid sniff codes passed to --sniffs now show a friendly error message (request [#20313][pear-20313]) -- Generic LineLengthSniff now shows a warning if the iconv module is disabled (request [#20314][pear-20314]) -- Source report no longer shows errors if category or sniff names ends in an uppercase error - - Thanks to [Jonathan Marcil][@jmarcil] for the patch - -### Fixed -- Fixed bug [#20261][pear-20261] : phpcbf has an endless fixing loop -- Fixed bug [#20268][pear-20268] : Incorrect documentation titles in PEAR documentation -- Fixed bug [#20296][pear-20296] : new array notion in function comma check fails -- Fixed bug [#20297][pear-20297] : phar does not work when renamed it to phpcs -- Fixed bug [#20307][pear-20307] : PHP_CodeSniffer_Standards_AbstractVariableSniff analyze traits -- Fixed bug [#20308][pear-20308] : Squiz.ValidVariableNameSniff - wrong variable usage -- Fixed bug [#20309][pear-20309] : Use "member variable" term in sniff "processMemberVar" method -- Fixed bug [#20310][pear-20310] : PSR2 does not check for space after function name -- Fixed bug [#20322][pear-20322] : Display rules set to type=error even when suppressing warnings -- Fixed bug [#20323][pear-20323] : PHPCS tries to load sniffs from hidden directories -- Fixed bug [#20346][pear-20346] : Fixer endless loop with Squiz.CSS sniffs -- Fixed bug [#20355][pear-20355] : No sniffs are registered with PHAR on Windows - -[pear-20261]: https://pear.php.net/bugs/bug.php?id=20261 -[pear-20297]: https://pear.php.net/bugs/bug.php?id=20297 -[pear-20346]: https://pear.php.net/bugs/bug.php?id=20346 -[pear-20355]: https://pear.php.net/bugs/bug.php?id=20355 - -## [1.5.4] - 2014-08-06 - -### Changed -- Removed use of sys_get_temp_dir() as this is not supported by the min PHP version -- The installed_paths config var now accepts relative paths - - The paths are relative to the PHP_CodeSniffer install directory - - Thanks to [Weston Ruter][@westonruter] for the patch -- Generic ScopeIndentSniff now accounts for different open tag indents -- PEAR FunctionDeclarationSniff now ignores short arrays when checking indent - - Thanks to [Daniel Tschinder][@danez] for the patch -- PSR2 FunctionCallSignatureSniff now treats multi-line strings as a single-line argument, like arrays and closures - - Thanks to [Dawid Nowak][@MacDada] for the patch -- Generic ForbiddenFunctionsSniff now detects calls to functions in the global namespace - - Thanks to [Ole Martin Handeland][@olemartinorg] for the patch -- Generic LowerCaseConstantSniff and UpperCaseConstantSniff now ignore namespaces beginning with TRUE/FALSE/NULL - - Thanks to [Renan Gonçalves][@renan] for the patch -- Squiz InlineCommentSniff no longer requires a blank line after post-statement comments (request [#20299][pear-20299]) -- Squiz SelfMemberReferenceSniff now works correctly with namespaces -- Tab characters are now encoded in abstract pattern error messages - - Thanks to [Blaine Schmeisser][@bayleedev] for the patch -- Invalid sniff codes passed to --sniffs now show a friendly error message (request [#20313][pear-20313]) -- Generic LineLengthSniff now shows a warning if the iconv module is disabled (request [#20314][pear-20314]) -- Source report no longer shows errors if category or sniff names ends in an uppercase error - - Thanks to [Jonathan Marcil][@jmarcil] for the patch - -### Fixed -- Fixed bug [#20268][pear-20268] : Incorrect documentation titles in PEAR documentation -- Fixed bug [#20296][pear-20296] : new array notion in function comma check fails -- Fixed bug [#20307][pear-20307] : PHP_CodeSniffer_Standards_AbstractVariableSniff analyze traits -- Fixed bug [#20308][pear-20308] : Squiz.ValidVariableNameSniff - wrong variable usage -- Fixed bug [#20309][pear-20309] : Use "member variable" term in sniff "processMemberVar" method -- Fixed bug [#20310][pear-20310] : PSR2 does not check for space after function name -- Fixed bug [#20322][pear-20322] : Display rules set to type=error even when suppressing warnings -- Fixed bug [#20323][pear-20323] : PHPCS tries to load sniffs from hidden directories - -[pear-20268]: https://pear.php.net/bugs/bug.php?id=20268 -[pear-20296]: https://pear.php.net/bugs/bug.php?id=20296 -[pear-20299]: https://pear.php.net/bugs/bug.php?id=20299 -[pear-20307]: https://pear.php.net/bugs/bug.php?id=20307 -[pear-20308]: https://pear.php.net/bugs/bug.php?id=20308 -[pear-20309]: https://pear.php.net/bugs/bug.php?id=20309 -[pear-20310]: https://pear.php.net/bugs/bug.php?id=20310 -[pear-20313]: https://pear.php.net/bugs/bug.php?id=20313 -[pear-20314]: https://pear.php.net/bugs/bug.php?id=20314 -[pear-20322]: https://pear.php.net/bugs/bug.php?id=20322 -[pear-20323]: https://pear.php.net/bugs/bug.php?id=20323 - -## [2.0.0a2] - 2014-05-01 - -### Changed -- Added report type --report=info to show information about the checked code to make building a standard easier - - Checks a number of things, such as what line length you use, and spacing are brackets, but not everything - - Still highly experimental -- Generic LineLengthSniff now shows warnings for long lines referring to licence and VCS information - - It previously ignored these lines, but at the expense of performance -- Generic DisallowTabIndent and DisallowSpaceIndent sniffs no longer error when detecting mixed indent types - - Only the first type of indent found on a line (space or indent) is considered -- Lots of little performance improvements that can add up to a substantial saving over large code bases - - Added a "length" array index to tokens so you don't need to call strlen() of them, or deal with encoding - - Can now use isset() to find tokens inside the PHP_CodeSniffer_Tokens static vars instead of in_array() -- Custom reports can now specify a $recordErrors member var; this previously only worked for built-in reports - - When set to FALSE, error messages will not be recorded and only totals will be returned - - This can save significant memory while processing a large code base -- Removed dependence on PHP_Timer -- PHP tokenizer now supports DEFAULT statements opened with a T_SEMICOLON -- The Squiz and PHPCS standards have increased the max padding for statement alignment from 8 to 12 -- Squiz EchoedStringsSniff now supports statements without a semicolon, such as PHP embedded in HTML -- Squiz DoubleQuoteUsageSniff now properly replaces escaped double quotes when fixing a doubled quoted string -- Improved detection of nested IF statements that use the alternate IF/ENDIF syntax -- PSR1 CamelCapsMethodNameSniff now ignores magic methods - - Thanks to [Eser Ozvataf][@eser] for the patch -- PSR1 SideEffectsSniff now ignores methods named define() -- PSR1 and PEAR ClassDeclarationSniffs now support traits (request [#20208][pear-20208]) -- PSR2 ControlStructureSpacingSniff now allows newlines before/after parentheses - - Thanks to [Maurus Cuelenaere][@mcuelenaere] for the patch -- PSR2 ControlStructureSpacingSniff now checks TRY and CATCH statements -- Squiz SuperfluousWhitespaceSniff now detects whitespace at the end of block comment lines - - Thanks to [Klaus Purer][@klausi] for the patch -- Squiz LowercasePHPFunctionsSniff no longer reports errors for namespaced functions - - Thanks to [Max Galbusera][@maxgalbu] for the patch -- Squiz SwitchDeclarationSniff now allows exit() as a breaking statement for case/default -- Squiz ValidVariableNameSniff and Zend ValidVariableNameSniff now ignore additional PHP reserved vars - - Thanks to Mikuláš Dítě and Adrian Crepaz for the patch -- Sniff code Squiz.WhiteSpace.MemberVarSpacing.After changed to Squiz.WhiteSpace.MemberVarSpacing.Incorrect (request [#20241][pear-20241]) - -### Fixed -- Fixed bug [#20200][pear-20200] : Invalid JSON produced with specific error message -- Fixed bug [#20204][pear-20204] : Ruleset exclude checks are case sensitive -- Fixed bug [#20213][pear-20213] : Invalid error, Inline IF must be declared on single line -- Fixed bug [#20225][pear-20225] : array_merge() that takes more than one line generates error -- Fixed bug [#20230][pear-20230] : Squiz ControlStructureSpacing sniff assumes specific condition formatting -- Fixed bug [#20234][pear-20234] : phpcbf patch command absolute paths -- Fixed bug [#20240][pear-20240] : Squiz block comment sniff fails when newline present -- Fixed bug [#20247][pear-20247] : The Squiz.WhiteSpace.ControlStructureSpacing sniff and do-while - - Thanks to [Alexander Obuhovich][@aik099] for the patch -- Fixed bug [#20248][pear-20248] : The Squiz_Sniffs_WhiteSpace_ControlStructureSpacingSniff sniff and empty scope -- Fixed bug [#20252][pear-20252] : Unitialized string offset when package name starts with underscore - -[pear-20234]: https://pear.php.net/bugs/bug.php?id=20234 - -## [1.5.3] - 2014-05-01 - -### Changed -- Improved detection of nested IF statements that use the alternate IF/ENDIF syntax -- PHP tokenizer now supports DEFAULT statements opened with a T_SEMICOLON -- PSR1 CamelCapsMethodNameSniff now ignores magic methods - - Thanks to [Eser Ozvataf][@eser] for the patch -- PSR1 SideEffectsSniff now ignores methods named define() -- PSR1 and PEAR ClassDeclarationSniffs now support traits (request [#20208][pear-20208]) -- PSR2 ControlStructureSpacingSniff now allows newlines before/after parentheses - - Thanks to [Maurus Cuelenaere][@mcuelenaere] for the patch -- Squiz LowercasePHPFunctionsSniff no longer reports errors for namespaced functions - - Thanks to [Max Galbusera][@maxgalbu] for the patch -- Squiz SwitchDeclarationSniff now allows exit() as a breaking statement for case/default -- Squiz ValidVariableNameSniff and Zend ValidVariableNameSniff now ignore additional PHP reserved vars - - Thanks to Mikuláš Dítě and Adrian Crepaz for the patch -- Sniff code Squiz.WhiteSpace.MemberVarSpacing.After changed to Squiz.WhiteSpace.MemberVarSpacing.Incorrect (request [#20241][pear-20241]) - -### Fixed -- Fixed bug [#20200][pear-20200] : Invalid JSON produced with specific error message -- Fixed bug [#20204][pear-20204] : Ruleset exclude checks are case sensitive -- Fixed bug [#20213][pear-20213] : Invalid error, Inline IF must be declared on single line -- Fixed bug [#20225][pear-20225] : array_merge() that takes more than one line generates error -- Fixed bug [#20230][pear-20230] : Squiz ControlStructureSpacing sniff assumes specific condition formatting -- Fixed bug [#20240][pear-20240] : Squiz block comment sniff fails when newline present -- Fixed bug [#20247][pear-20247] : The Squiz.WhiteSpace.ControlStructureSpacing sniff and do-while - - Thanks to [Alexander Obuhovich][@aik099] for the patch -- Fixed bug [#20248][pear-20248] : The Squiz_Sniffs_WhiteSpace_ControlStructureSpacingSniff sniff and empty scope -- Fixed bug [#20252][pear-20252] : Uninitialized string offset when package name starts with underscore - -[pear-20200]: https://pear.php.net/bugs/bug.php?id=20200 -[pear-20204]: https://pear.php.net/bugs/bug.php?id=20204 -[pear-20208]: https://pear.php.net/bugs/bug.php?id=20208 -[pear-20213]: https://pear.php.net/bugs/bug.php?id=20213 -[pear-20225]: https://pear.php.net/bugs/bug.php?id=20225 -[pear-20230]: https://pear.php.net/bugs/bug.php?id=20230 -[pear-20240]: https://pear.php.net/bugs/bug.php?id=20240 -[pear-20241]: https://pear.php.net/bugs/bug.php?id=20241 -[pear-20247]: https://pear.php.net/bugs/bug.php?id=20247 -[pear-20248]: https://pear.php.net/bugs/bug.php?id=20248 -[pear-20252]: https://pear.php.net/bugs/bug.php?id=20252 - -## [2.0.0a1] - 2014-02-05 - -### Changed -- Added the phpcbf script to automatically fix many errors found by the phpcs script -- Added report type --report=diff to show suggested changes to fix coding standard violations -- The --report argument now allows for custom reports to be used - - Use the full path to your custom report class as the report name -- The --extensions argument is now respected when passing filenames; not just with directories -- The --extensions argument now allows you to specify the tokenizer for each extension - - e.g., `--extensions=module/php,es/js` -- Command line arguments can now be set in ruleset files - - e.g., `arg name="report" value="summary"` (print summary report; same as `--report=summary`) - - e.g., `arg value="sp"` (print source and progress information; same as `-sp`) - - The `-vvv`, `--sniffs`, `--standard` and `-l` command line arguments cannot be set in this way -- Sniff process() methods can now optionally return a token to ignore up to - - If returned, the sniff will not be executed again until the passed token is reached in the file - - Useful if you are looking for tokens like T_OPEN_TAG but only want to process the first one -- Removed the comment parser classes and replaced it with a simple comment tokenizer - - T_DOC_COMMENT tokens are now tokenized into T_DOC_COMMENT_* tokens so they can be used more easily - - This change requires a significant rewrite of sniffs that use the comment parser - - This change requires minor changes to sniffs that listen for T_DOC_COMMENT tokens directly -- Added Generic DocCommentSniff to check generic doc block formatting - - Removed doc block formatting checks from PEAR ClassCommentSniff - - Removed doc block formatting checks from PEAR FileCommentSniff - - Removed doc block formatting checks from PEAR FunctionCommentSniff - - Removed doc block formatting checks from Squiz ClassCommentSniff - - Removed doc block formatting checks from Squiz FileCommentSniff - - Removed doc block formatting checks from Squiz FunctionCommentSniff - - Removed doc block formatting checks from Squiz VariableCommentSniff -- Squiz DocCommentAlignmentSniff has had its error codes changed - - NoSpaceBeforeTag becomes NoSpaceAfterStar - - SpaceBeforeTag becomes SpaceAfterStar - - SpaceBeforeAsterisk becomes SpaceBeforeStar -- Generic MultipleStatementAlignment now aligns assignments within a block so they fit within their max padding setting - - The sniff previously requested the padding as 1 space if max padding was exceeded - - It now aligns the assignment with surrounding assignments if it can - - Removed property ignoreMultiline as multi-line assignments are now handled correctly and should not be ignored -- Squiz FunctionClosingBraceSpaceSniff now requires a blank line before the brace in all cases except function args -- Added error Squiz.Commenting.ClassComment.SpacingAfter to ensure there are no blank lines after a class comment -- Added error Squiz.WhiteSpace.MemberVarSpacing.AfterComment to ensure there are no blank lines after a member var comment - - Fixes have also been corrected to not strip the member var comment or indent under some circumstances - - Thanks to [Mark Scherer][@dereuromark] for help with this fix -- Added error Squiz.Commenting.FunctionCommentThrowTag.Missing to ensure a throw is documented -- Removed error Squiz.Commenting.FunctionCommentThrowTag.WrongType -- Content passed via STDIN can now specify the filename to use so that sniffs can run the correct filename checks - - Ensure the first line of the content is: phpcs_input_file: /path/to/file -- Squiz coding standard now enforces no closing PHP tag at the end of a pure PHP file -- Squiz coding standard now enforces a single newline character at the end of the file -- Squiz ClassDeclarationSniff no longer checks for a PHP ending tag after a class definition -- Squiz ControlStructureSpacingSniff now checks TRY and CATCH statements as well -- Removed MySource ChannelExceptionSniff - -## [1.5.2] - 2014-02-05 - -### Changed -- Improved support for the PHP 5.5. classname::class syntax - - PSR2 SwitchDeclarationSniff no longer throws errors when this syntax is used in CASE conditions -- Improved support for negative checks of instanceOf in Squiz ComparisonOperatorUsageSniff - - Thanks to [Martin Winkel][@storeman] for the patch -- Generic FunctionCallArgumentSpacingSniff now longer complains about space before comma when using here/nowdocs - - Thanks to [Richard van Velzen][@rvanvelzen] for the patch -- Generic LowerCaseConstantSniff and UpperCaseConstantSniff now ignore class constants - - Thanks to [Kristopher Wilson][@mrkrstphr] for the patch -- PEAR FunctionCallSignatureSniff now has settings to specify how many spaces should appear before/after parentheses - - Override the 'requiredSpacesAfterOpen' and 'requiredSpacesBeforeClose' settings in a ruleset.xml file to change - - Default remains at 0 for both - - Thanks to [Astinus Eberhard][@Astinus-Eberhard] for the patch -- PSR2 ControlStructureSpacingSniff now has settings to specify how many spaces should appear before/after parentheses - - Override the 'requiredSpacesAfterOpen' and 'requiredSpacesBeforeClose' settings in a ruleset.xml file to change - - Default remains at 0 for both - - Thanks to [Astinus Eberhard][@Astinus-Eberhard] for the patch -- Squiz ForEachLoopDeclarationSniff now has settings to specify how many spaces should appear before/after parentheses - - Override the 'requiredSpacesAfterOpen' and 'requiredSpacesBeforeClose' settings in a ruleset.xml file to change - - Default remains at 0 for both - - Thanks to [Astinus Eberhard][@Astinus-Eberhard] for the patch -- Squiz ForLoopDeclarationSniff now has settings to specify how many spaces should appear before/after parentheses - - Override the 'requiredSpacesAfterOpen' and 'requiredSpacesBeforeClose' settings in a ruleset.xml file to change - - Default remains at 0 for both - - Thanks to [Astinus Eberhard][@Astinus-Eberhard] for the patch -- Squiz FunctionDeclarationArgumentSpacingSniff now has settings to specify how many spaces should appear before/after parentheses - - Override the 'requiredSpacesAfterOpen' and 'requiredSpacesBeforeClose' settings in a ruleset.xml file to change - - Default remains at 0 for both - - Thanks to [Astinus Eberhard][@Astinus-Eberhard] for the patch -- Removed UnusedFunctionParameter, CyclomaticComplexity and NestingLevel from the Squiz standard -- Generic FixmeSniff and TodoSniff now work correctly with accented characters - -### Fixed -- Fixed bug [#20145][pear-20145] : Custom ruleset preferences directory over installed standard -- Fixed bug [#20147][pear-20147] : phpcs-svn-pre-commit - no more default error report -- Fixed bug [#20151][pear-20151] : Problem handling "if(): ... else: ... endif;" syntax -- Fixed bug [#20190][pear-20190] : Invalid regex in Squiz_Sniffs_WhiteSpace_SuperfluousWhitespaceSniff - -[pear-20145]: https://pear.php.net/bugs/bug.php?id=20145 -[pear-20147]: https://pear.php.net/bugs/bug.php?id=20147 -[pear-20151]: https://pear.php.net/bugs/bug.php?id=20151 -[pear-20190]: https://pear.php.net/bugs/bug.php?id=20190 - -## [1.5.1] - 2013-12-12 - -### Changed -- Config values can now be set at runtime using the command line argument `--runtime-set key value` - - Runtime values are the same as config values, but are not written to the main config file - - Thanks to [Wim Godden][@wimg] for the patch -- Config values can now be set in ruleset files - - e.g., config name="zend_ca_path" value="/path/to/ZendCodeAnalyzer" - - Can not be used to set config values that override command line values, such as show_warnings - - Thanks to [Jonathan Marcil][@jmarcil] for helping with the patch -- Added a new installed_paths config value to allow for the setting of directories that contain standards - - By default, standards have to be installed into the CodeSniffer/Standards directory to be considered installed - - New config value allows a list of paths to be set in addition to this internal path - - Installed standards appear when using the -i arg, and can be referenced in rulesets using only their name - - Set paths by running: phpcs --config-set installed_paths /path/one,/path/two,... -- PSR2 ClassDeclarationSniff now allows a list of extended interfaces to be split across multiple lines -- Squiz DoubleQuoteUsageSniff now allows \b in double quoted strings -- Generic ForbiddenFunctionsSniff now ignores object creation - - This is a further fix for bug [#20100][pear-20100] : incorrect Function mysql() has been deprecated report - -### Fixed -- Fixed bug [#20136][pear-20136] : Squiz_Sniffs_WhiteSpace_ScopeKeywordSpacingSniff and Traits -- Fixed bug [#20138][pear-20138] : Protected property underscore and camel caps issue (in trait with Zend) - - Thanks to [Gaetan Rousseau][@Naelyth] for the patch -- Fixed bug [#20139][pear-20139] : No report file generated on success - -[pear-20136]: https://pear.php.net/bugs/bug.php?id=20136 -[pear-20138]: https://pear.php.net/bugs/bug.php?id=20138 -[pear-20139]: https://pear.php.net/bugs/bug.php?id=20139 - -## [1.5.0] - 2013-11-28 - -### Changed -- Doc generation is now working again for installed standards - - Includes a fix for limiting the docs to specific sniffs -- Generic ScopeIndentSniff now allows for ignored tokens to be set via ruleset.xml files - - E.g., to ignore comments, override a property using: - - name="ignoreIndentationTokens" type="array" value="T_COMMENT,T_DOC_COMMENT" -- PSR2 standard now ignores comments when checking indentation rules -- Generic UpperCaseConstantNameSniff no longer reports errors where constants are used (request [#20090][pear-20090]) - - It still reports errors where constants are defined -- Individual messages can now be excluded in ruleset.xml files using the exclude tag (request [#20091][pear-20091]) - - Setting message severity to 0 continues to be supported -- Squiz OperatorSpacingSniff no longer throws errors for the ?: short ternary operator - - Thanks to [Antoine Musso][@hashar] for the patch -- Comment parser now supports non-English characters when splitting comment lines into words - - Thanks to [Nik Sun][@CandySunPlus] for the patch -- Exit statements are now recognised as valid closers for CASE and DEFAULT blocks - - Thanks to [Maksim Kochkin][@ksimka] for the patch -- PHP_CodeSniffer_CLI::process() can now be passed an incomplete array of CLI values - - Missing values will be set to the CLI defaults - - Thanks to [Maksim Kochkin][@ksimka] for the patch - -### Fixed -- Fixed bug [#20093][pear-20093] : Bug with ternary operator token -- Fixed bug [#20097][pear-20097] : `CLI.php` throws error in PHP 5.2 -- Fixed bug [#20100][pear-20100] : incorrect Function mysql() has been deprecated report -- Fixed bug [#20119][pear-20119] : PHP warning: invalid argument to str_repeat() in SVN blame report with -s -- Fixed bug [#20123][pear-20123] : PSR2 complains about an empty second statement in for-loop -- Fixed bug [#20131][pear-20131] : PHP errors in svnblame report, if there are files not under version control -- Fixed bug [#20133][pear-20133] : Allow "HG: hg_id" as value for @version tag - -[pear-20090]: https://pear.php.net/bugs/bug.php?id=20090 -[pear-20091]: https://pear.php.net/bugs/bug.php?id=20091 -[pear-20093]: https://pear.php.net/bugs/bug.php?id=20093 - -## [1.4.8] - 2013-11-26 - -### Changed -- Generic ScopeIndentSniff now allows for ignored tokens to be set via ruleset.xml files - - E.g., to ignore comments, override a property using: - - name="ignoreIndentationTokens" type="array" value="T_COMMENT,T_DOC_COMMENT" -- PSR2 standard now ignores comments when checking indentation rules -- Squiz OperatorSpacingSniff no longer throws errors for the ?: short ternary operator - - Thanks to [Antoine Musso][@hashar] for the patch -- Comment parser now supports non-English characters when splitting comment lines into words - - Thanks to [Nik Sun][@CandySunPlus] for the patch -- Exit statements are now recognised as valid closers for CASE and DEFAULT blocks - - Thanks to [Maksim Kochkin][@ksimka] for the patch -- PHP_CodeSniffer_CLI::process() can now be passed an incomplete array of CLI values - - Missing values will be set to the CLI defaults - - Thanks to [Maksim Kochkin][@ksimka] for the patch - -### Fixed -- Fixed bug [#20097][pear-20097] : `CLI.php` throws error in PHP 5.2 -- Fixed bug [#20100][pear-20100] : incorrect Function mysql() has been deprecated report -- Fixed bug [#20119][pear-20119] : PHP warning: invalid argument to str_repeat() in SVN blame report with -s -- Fixed bug [#20123][pear-20123] : PSR2 complains about an empty second statement in for-loop -- Fixed bug [#20131][pear-20131] : PHP errors in svnblame report, if there are files not under version control -- Fixed bug [#20133][pear-20133] : Allow "HG: hg_id" as value for @version tag - -[pear-20097]: https://pear.php.net/bugs/bug.php?id=20097 -[pear-20100]: https://pear.php.net/bugs/bug.php?id=20100 -[pear-20119]: https://pear.php.net/bugs/bug.php?id=20119 -[pear-20123]: https://pear.php.net/bugs/bug.php?id=20123 -[pear-20131]: https://pear.php.net/bugs/bug.php?id=20131 -[pear-20133]: https://pear.php.net/bugs/bug.php?id=20133 - -## [1.5.0RC4] - 2013-09-26 - -### Changed -- You can now restrict violations to individual sniff codes using the --sniffs command line argument - - Previously, this only restricted violations to an entire sniff and not individual messages - - If you have scripts calling PHP_CodeSniffer::process() or creating PHP_CodeSniffer_File objects, you must update your code - - The array of restrictions passed to PHP_CodeSniffer::process() must now be an array of sniff codes instead of class names - - The PHP_CodeSniffer_File::__construct() method now requires an array of restrictions to be passed -- Doc generation is now working again -- Progress information now shows the percentage complete at the end of each line -- Added report type --report=junit to show the error list in a JUnit compatible format - - Thanks to [Oleg Lobach][@bladeofsteel] for the contribution -- Added support for the PHP 5.4 callable type hint -- Fixed problem where some file content could be ignored when checking STDIN -- Version information is now printed when installed via composer or run from a Git clone (request [#20050][pear-20050]) -- Added Squiz DisallowBooleanStatementSniff to ban boolean operators outside of control structure conditions -- The CSS tokenizer is now more reliable when encountering 'list' and 'break' strings -- Coding standard ignore comments can now appear instead doc blocks as well as inline comments - - Thanks to [Stuart Langley][@sjlangley] for the patch -- Generic LineLengthSniff now ignores SVN URL and Head URL comments - - Thanks to [Karl DeBisschop][@kdebisschop] for the patch -- PEAR MultiLineConditionSniff now has a setting to specify how many spaces code should be indented - - Default remains at 4; override the 'indent' setting in a ruleset.xml file to change - - Thanks to [Szabolcs Sulik][@blerou] for the patch -- PEAR MultiLineAssignmentSniff now has a setting to specify how many spaces code should be indented - - Default remains at 4; override the 'indent' setting in a ruleset.xml file to change - - Thanks to [Szabolcs Sulik][@blerou] for the patch -- PEAR FunctionDeclarationSniff now has a setting to specify how many spaces code should be indented - - Default remains at 4; override the 'indent' setting in a ruleset.xml file to change - - Thanks to [Szabolcs Sulik][@blerou] for the patch -- Squiz SwitchDeclarationSniff now has a setting to specify how many spaces code should be indented - - Default remains at 4; override the 'indent' setting in a ruleset.xml file to change - - Thanks to [Szabolcs Sulik][@blerou] for the patch -- Squiz CSS IndentationSniff now has a setting to specify how many spaces code should be indented - - Default remains at 4; override the 'indent' setting in a ruleset.xml file to change - - Thanks to [Hugo Fonseca][@fonsecas72] for the patch -- Squiz and MySource File and Function comment sniffs now allow all tags and don't require a particular licence -- Squiz standard now allows lines to be 120 characters long before warning; up from 85 -- Squiz LowercaseStyleDefinitionSniff no longer throws errors for class names in nested style definitions -- Squiz ClassFileNameSniff no longer throws errors when checking STDIN -- Squiz CSS sniffs no longer generate errors for IE filters -- Squiz CSS IndentationSniff no longer sees comments as blank lines -- Squiz LogicalOperatorSpacingSniff now ignores whitespace at the end of a line -- Squiz.Scope.MethodScope.Missing error message now mentions 'visibility' instead of 'scope modifier' - - Thanks to [Renat Akhmedyanov][@r3nat] for the patch -- Added support for the PSR2 multi-line arguments errata -- The PSR2 standard no longer throws errors for additional spacing after a type hint -- PSR UseDeclarationSniff no longer throws errors for USE statements inside TRAITs - -### Fixed -- Fixed cases where code was incorrectly assigned the T_GOTO_LABEL token when used in a complex CASE condition -- Fixed bug [#20026][pear-20026] : Check for multi-line arrays that should be single-line is slightly wrong - - Adds new error message for single-line arrays that end with a comma -- Fixed bug [#20029][pear-20029] : ForbiddenFunction sniff incorrectly recognizes methods in USE clauses -- Fixed bug [#20043][pear-20043] : Mis-interpretation of Foo::class -- Fixed bug [#20044][pear-20044] : PSR1 camelCase check does not ignore leading underscores -- Fixed bug [#20045][pear-20045] : Errors about indentation for closures with multi-line 'use' in functions -- Fixed bug [#20051][pear-20051] : Undefined index: scope_opener / scope_closer - - Thanks to [Anthon Pang][@robocoder] for the patch - -[pear-20051]: https://pear.php.net/bugs/bug.php?id=20051 - -## [1.4.7] - 2013-09-26 - -### Changed -- Added report type --report=junit to show the error list in a JUnit compatible format - - Thanks to [Oleg Lobach][@bladeofsteel] for the contribution -- Added support for the PHP 5.4 callable type hint -- Fixed problem where some file content could be ignored when checking STDIN -- Version information is now printed when installed via composer or run from a Git clone (request [#20050][pear-20050]) -- The CSS tokenizer is now more reliable when encountering 'list' and 'break' strings -- Coding standard ignore comments can now appear instead doc blocks as well as inline comments - - Thanks to [Stuart Langley][@sjlangley] for the patch -- Generic LineLengthSniff now ignores SVN URL and Head URL comments - - Thanks to [Karl DeBisschop][@kdebisschop] for the patch -- PEAR MultiLineConditionSniff now has a setting to specify how many spaces code should be indented - - Default remains at 4; override the 'indent' setting in a ruleset.xml file to change - - Thanks to [Szabolcs Sulik][@blerou] for the patch -- PEAR MultiLineAssignmentSniff now has a setting to specify how many spaces code should be indented - - Default remains at 4; override the 'indent' setting in a ruleset.xml file to change - - Thanks to [Szabolcs Sulik][@blerou] for the patch -- PEAR FunctionDeclarationSniff now has a setting to specify how many spaces code should be indented - - Default remains at 4; override the 'indent' setting in a ruleset.xml file to change - - Thanks to [Szabolcs Sulik][@blerou] for the patch -- Squiz SwitchDeclarationSniff now has a setting to specify how many spaces code should be indented - - Default remains at 4; override the 'indent' setting in a ruleset.xml file to change - - Thanks to [Szabolcs Sulik][@blerou] for the patch -- Squiz CSS IndentationSniff now has a setting to specify how many spaces code should be indented - - Default remains at 4; override the 'indent' setting in a ruleset.xml file to change - - Thanks to [Hugo Fonseca][@fonsecas72] for the patch -- Squiz and MySource File and Function comment sniffs now allow all tags and don't require a particular licence -- Squiz LowercaseStyleDefinitionSniff no longer throws errors for class names in nested style definitions -- Squiz ClassFileNameSniff no longer throws errors when checking STDIN -- Squiz CSS sniffs no longer generate errors for IE filters -- Squiz CSS IndentationSniff no longer sees comments as blank lines -- Squiz LogicalOperatorSpacingSniff now ignores whitespace at the end of a line -- Squiz.Scope.MethodScope.Missing error message now mentions 'visibility' instead of 'scope modifier' - - Thanks to [Renat Akhmedyanov][@r3nat] for the patch -- Added support for the PSR2 multi-line arguments errata -- The PSR2 standard no longer throws errors for additional spacing after a type hint -- PSR UseDeclarationSniff no longer throws errors for USE statements inside TRAITs - -### Fixed -- Fixed bug [#20026][pear-20026] : Check for multi-line arrays that should be single-line is slightly wrong - - Adds new error message for single-line arrays that end with a comma -- Fixed bug [#20029][pear-20029] : ForbiddenFunction sniff incorrectly recognizes methods in USE clauses -- Fixed bug [#20043][pear-20043] : Mis-interpretation of Foo::class -- Fixed bug [#20044][pear-20044] : PSR1 camelCase check does not ignore leading underscores -- Fixed bug [#20045][pear-20045] : Errors about indentation for closures with multi-line 'use' in functions - -[pear-20026]: https://pear.php.net/bugs/bug.php?id=20026 -[pear-20029]: https://pear.php.net/bugs/bug.php?id=20029 -[pear-20043]: https://pear.php.net/bugs/bug.php?id=20043 -[pear-20044]: https://pear.php.net/bugs/bug.php?id=20044 -[pear-20045]: https://pear.php.net/bugs/bug.php?id=20045 -[pear-20050]: https://pear.php.net/bugs/bug.php?id=20050 - -## [1.5.0RC3] - 2013-07-25 - -### Changed -- Added report type --report=json to show the error list and total counts for all checked files - - Thanks to [Jeffrey Fisher][@jeffslofish] for the contribution -- PHP_CodeSniffer::isCamelCaps now allows for acronyms at the start of a string if the strict flag is FALSE - - acronyms are defined as at least 2 uppercase characters in a row - - e.g., the following is now valid camel caps with strict set to FALSE: XMLParser -- The PHP tokenizer now tokenizes goto labels as T_GOTO_LABEL instead of T_STRING followed by T_COLON -- The JS tokenizer now has support for the T_THROW token -- Symlinked directories inside CodeSniffer/Standards and in ruleset.xml files are now supported - - Only available since PHP 5.2.11 and 5.3.1 - - Thanks to [Maik Penz][@goatherd] for the patch -- The JS tokenizer now correctly identifies T_INLINE_ELSE tokens instead of leaving them as T_COLON - - Thanks to [Arnout Boks][@aboks] for the patch -- Explaining a standard (phpcs -e) that uses namespaces now works correctly -- Restricting a check to specific sniffs (phpcs --sniffs=...) now works correctly with namespaced sniffs - - Thanks to [Maik Penz][@goatherd] for the patch -- Docs added for the entire Generic standard, and many sniffs from other standards are now documented as well - - Thanks to [Spencer Rinehart][@nubs] for the contribution -- Clearer error message for when the sniff class name does not match the directory structure -- Generated HTML docs now correctly show the open PHP tag in code comparison blocks -- Added Generic InlineHTMLSniff to ensure a file only contains PHP code -- Added Squiz ShorthandSizeSniff to check that CSS sizes are using shorthand notation only when 1 or 2 values are used -- Added Squiz ForbiddenStylesSniff to ban the use of some deprecated browser-specific styles -- Added Squiz NamedColoursSniff to ban the use of colour names -- PSR2 standard no longer enforces no whitespace between the closing parenthesis of a function call and the semicolon -- PSR2 ClassDeclarationSniff now ignores empty classes when checking the end brace position -- PSR2 SwitchDeclarationSniff no longer reports errors for empty lines between CASE statements -- PEAR ObjectOperatorIndentSniff now has a setting to specify how many spaces code should be indented - - Default remains at 4; override the indent setting in a ruleset.xml file to change - - Thanks to [Andrey Mindubaev][@covex-nn] for the patch -- Squiz FileExtensionSniff now supports traits - - Thanks to [Lucas Green][@mythril] for the patch -- Squiz ArrayDeclarationSniff no longer reports errors for no comma at the end of a line that contains a function call -- Squiz SwitchDeclarationSniff now supports T_CONTINUE and T_THROW as valid case/default breaking statements -- Squiz CommentedOutCodeSniff is now better at ignoring commented out HTML, XML and regular expressions -- Squiz DisallowComparisonAssignmentSniff no longer throws errors for the third expression in a FOR statement -- Squiz ColourDefinitionSniff no longer throws errors for some CSS class names -- Squiz ControlStructureSpacingSniff now supports all types of CASE/DEFAULT breaking statements -- Generic CallTimePassByReferenceSniff now reports errors for functions called using a variable - - Thanks to [Maik Penz][@goatherd] for the patch -- Generic ConstructorNameSniff no longer throws a notice for abstract constructors inside abstract classes - - Thanks to [Spencer Rinehart][@nubs] for the patch -- Squiz ComparisonOperatorUsageSniff now checks inside elseif statements - - Thanks to [Arnout Boks][@aboks] for the patch -- Squiz OperatorSpacingSniff now reports errors for no spacing around inline then and else tokens - - Thanks to [Arnout Boks][@aboks] for the patch - -### Fixed -- Fixed bug [#19811][pear-19811] : Comments not ignored in all cases in AbstractPatternSniff - - Thanks to [Erik Wiffin][@erikwiffin] for the patch -- Fixed bug [#19892][pear-19892] : ELSE with no braces causes incorrect SWITCH break statement indentation error -- Fixed bug [#19897][pear-19897] : Indenting warnings in templates not consistent -- Fixed bug [#19908][pear-19908] : PEAR MultiLineCondition Does Not Apply elseif -- Fixed bug [#19930][pear-19930] : option --report-file generate an empty file -- Fixed bug [#19935][pear-19935] : notify-send reports do not vanish in gnome-shell - - Thanks to [Christian Weiske][@cweiske] for the patch -- Fixed bug [#19944][pear-19944] : docblock squiz sniff "return void" trips over return in lambda function -- Fixed bug [#19953][pear-19953] : PSR2 - Spaces before interface name for abstract class -- Fixed bug [#19956][pear-19956] : phpcs warns for Type Hint missing Resource -- Fixed bug [#19957][pear-19957] : Does not understand trait method aliasing -- Fixed bug [#19968][pear-19968] : Permission denied on excluded directory -- Fixed bug [#19969][pear-19969] : Sniffs with namespace not recognized in reports -- Fixed bug [#19997][pear-19997] : Class names incorrectly detected as constants - -[pear-19930]: https://pear.php.net/bugs/bug.php?id=19930 - -## [1.4.6] - 2013-07-25 - -### Changed -- Added report type --report=json to show the error list and total counts for all checked files - - Thanks to [Jeffrey Fisher][@jeffslofish] for the contribution -- The JS tokenizer now has support for the T_THROW token -- Symlinked directories inside CodeSniffer/Standards and in ruleset.xml files are now supported - - Only available since PHP 5.2.11 and 5.3.1 - - Thanks to [Maik Penz][@goatherd] for the patch -- The JS tokenizer now correctly identifies T_INLINE_ELSE tokens instead of leaving them as T_COLON - - Thanks to [Arnout Boks][@aboks] for the patch -- Explaining a standard (phpcs -e) that uses namespaces now works correctly -- Restricting a check to specific sniffs (phpcs --sniffs=...) now works correctly with namespaced sniffs - - Thanks to [Maik Penz][@goatherd] for the patch -- Docs added for the entire Generic standard, and many sniffs from other standards are now documented as well - - Thanks to [Spencer Rinehart][@nubs] for the contribution -- Clearer error message for when the sniff class name does not match the directory structure -- Generated HTML docs now correctly show the open PHP tag in code comparison blocks -- Added Generic InlineHTMLSniff to ensure a file only contains PHP code -- Added Squiz ShorthandSizeSniff to check that CSS sizes are using shorthand notation only when 1 or 2 values are used -- Added Squiz ForbiddenStylesSniff to ban the use of some deprecated browser-specific styles -- Added Squiz NamedColoursSniff to ban the use of colour names -- PSR2 standard no longer enforces no whitespace between the closing parenthesis of a function call and the semicolon -- PSR2 ClassDeclarationSniff now ignores empty classes when checking the end brace position -- PSR2 SwitchDeclarationSniff no longer reports errors for empty lines between CASE statements -- PEAR ObjectOperatorIndentSniff now has a setting to specify how many spaces code should be indented - - Default remains at 4; override the indent setting in a ruleset.xml file to change - - Thanks to [Andrey Mindubaev][@covex-nn] for the patch -- Squiz FileExtensionSniff now supports traits - - Thanks to [Lucas Green][@mythril] for the patch -- Squiz ArrayDeclarationSniff no longer reports errors for no comma at the end of a line that contains a function call -- Squiz SwitchDeclarationSniff now supports T_CONTINUE and T_THROW as valid case/default breaking statements -- Squiz CommentedOutCodeSniff is now better at ignoring commented out HTML, XML and regular expressions -- Squiz DisallowComparisonAssignmentSniff no longer throws errors for the third expression in a FOR statement -- Squiz ColourDefinitionSniff no longer throws errors for some CSS class names -- Squiz ControlStructureSpacingSniff now supports all types of CASE/DEFAULT breaking statements -- Generic CallTimePassByReferenceSniff now reports errors for functions called using a variable - - Thanks to [Maik Penz][@goatherd] for the patch -- Generic ConstructorNameSniff no longer throws a notice for abstract constructors inside abstract classes - - Thanks to [Spencer Rinehart][@nubs] for the patch -- Squiz ComparisonOperatorUsageSniff now checks inside elseif statements - - Thanks to [Arnout Boks][@aboks] for the patch -- Squiz OperatorSpacingSniff now reports errors for no spacing around inline then and else tokens - - Thanks to [Arnout Boks][@aboks] for the patch - -### Fixed -- Fixed bug [#19811][pear-19811] : Comments not ignored in all cases in AbstractPatternSniff - - Thanks to [Erik Wiffin][@erikwiffin] for the patch -- Fixed bug [#19892][pear-19892] : ELSE with no braces causes incorrect SWITCH break statement indentation error -- Fixed bug [#19897][pear-19897] : Indenting warnings in templates not consistent -- Fixed bug [#19908][pear-19908] : PEAR MultiLineCondition Does Not Apply elseif -- Fixed bug [#19913][pear-19913] : Running phpcs in interactive mode causes warnings - - Thanks to [Harald Franndorfer][pear-gemineye] for the patch -- Fixed bug [#19935][pear-19935] : notify-send reports do not vanish in gnome-shell - - Thanks to [Christian Weiske][@cweiske] for the patch -- Fixed bug [#19944][pear-19944] : docblock squiz sniff "return void" trips over return in lambda function -- Fixed bug [#19953][pear-19953] : PSR2 - Spaces before interface name for abstract class -- Fixed bug [#19956][pear-19956] : phpcs warns for Type Hint missing Resource -- Fixed bug [#19957][pear-19957] : Does not understand trait method aliasing -- Fixed bug [#19968][pear-19968] : Permission denied on excluded directory -- Fixed bug [#19969][pear-19969] : Sniffs with namespace not recognized in reports -- Fixed bug [#19997][pear-19997] : Class names incorrectly detected as constants - -[pear-19811]: https://pear.php.net/bugs/bug.php?id=19811 -[pear-19892]: https://pear.php.net/bugs/bug.php?id=19892 -[pear-19897]: https://pear.php.net/bugs/bug.php?id=19897 -[pear-19908]: https://pear.php.net/bugs/bug.php?id=19908 -[pear-19913]: https://pear.php.net/bugs/bug.php?id=19913 -[pear-19935]: https://pear.php.net/bugs/bug.php?id=19935 -[pear-19944]: https://pear.php.net/bugs/bug.php?id=19944 -[pear-19953]: https://pear.php.net/bugs/bug.php?id=19953 -[pear-19956]: https://pear.php.net/bugs/bug.php?id=19956 -[pear-19957]: https://pear.php.net/bugs/bug.php?id=19957 -[pear-19968]: https://pear.php.net/bugs/bug.php?id=19968 -[pear-19969]: https://pear.php.net/bugs/bug.php?id=19969 -[pear-19997]: https://pear.php.net/bugs/bug.php?id=19997 - -## [1.5.0RC2] - 2013-04-04 - -### Changed -- Ruleset processing has been rewritten to be more predictable - - Provides much better support for relative paths inside ruleset files - - May mean that sniffs that were previously ignored are now being included when importing external rulesets - - Ruleset processing output can be seen by using the -vv command line argument - - Internal sniff registering functions have all changed, so please review custom scripts -- You can now pass multiple coding standards on the command line, comma separated (request [#19144][pear-19144]) - - Works with built-in or custom standards and rulesets, or a mix of both -- You can now exclude directories or whole standards in a ruleset XML file (request [#19731][pear-19731]) - - e.g., exclude "Generic.Commenting" or just "Generic" - - You can also pass in a path to a directory instead, if you know it -- Added Generic LowerCaseKeywordSniff to ensure all PHP keywords are defined in lowercase - - The PSR2 and Squiz standards now use this sniff -- Added Generic SAPIUsageSniff to ensure the `PHP_SAPI` constant is used instead of `php_sapi_name()` (request [#19863][pear-19863]) -- Squiz FunctionSpacingSniff now has a setting to specify how many lines there should between functions (request [#19843][pear-19843]) - - Default remains at 2 - - Override the "spacing" setting in a ruleset.xml file to change -- Squiz LowercasePHPFunctionSniff no longer throws errors for the limited set of PHP keywords it was checking - - Add a rule for Generic.PHP.LowerCaseKeyword to your ruleset to replicate this functionality -- Added support for the PHP 5.4 T_CALLABLE token so it can be used in lower PHP versions -- Generic EndFileNoNewlineSniff now supports checking of CSS and JS files -- PSR2 SwitchDeclarationSniff now has a setting to specify how many spaces code should be indented - - Default remains at 4; override the indent setting in a ruleset.xml file to change - - Thanks to [Asher Snyder][@asnyder] for the patch -- Generic ScopeIndentSniff now has a setting to specify a list of tokens that should be ignored - - The first token on the line is checked and the whole line is ignored if the token is in the array - - Thanks to [Eloy Lafuente][@stronk7] for the patch -- Squiz LowercaseClassKeywordsSniff now checks for the TRAIT keyword - - Thanks to [Anthon Pang][@robocoder] for the patch -- If you create your own PHP_CodeSniffer object, PHPCS will no longer exit when an unknown argument is found - - This allows you to create wrapper scripts for PHPCS more easily -- PSR2 MethodDeclarationSniff no longer generates a notice for methods named "_" - - Thanks to [Bart S][@zBart] for the patch -- Squiz BlockCommentSniff no longer reports that a blank line between a scope closer and block comment is invalid -- Generic DuplicateClassNameSniff no longer reports an invalid error if multiple PHP open tags exist in a file -- Generic DuplicateClassNameSniff no longer reports duplicate errors if multiple PHP open tags exist in a file - -### Fixed -- Fixed bug [#19819][pear-19819] : Freeze with syntax error in use statement -- Fixed bug [#19820][pear-19820] : Wrong message level in Generic_Sniffs_CodeAnalysis_EmptyStatementSniff -- Fixed bug [#19859][pear-19859] : CodeSniffer::setIgnorePatterns API changed -- Fixed bug [#19871][pear-19871] : findExtendedClassName doesn't return FQCN on namespaced classes -- Fixed bug [#19879][pear-19879] : bitwise and operator interpreted as reference by value - -[pear-19144]: https://pear.php.net/bugs/bug.php?id=19144 -[pear-19731]: https://pear.php.net/bugs/bug.php?id=19731 - -## [1.4.5] - 2013-04-04 - -### Changed -- Added Generic LowerCaseKeywordSniff to ensure all PHP keywords are defined in lowercase - - The PSR2 and Squiz standards now use this sniff -- Added Generic SAPIUsageSniff to ensure the `PHP_SAPI` constant is used instead of `php_sapi_name()` (request [#19863][pear-19863]) -- Squiz FunctionSpacingSniff now has a setting to specify how many lines there should between functions (request [#19843][pear-19843]) - - Default remains at 2 - - Override the "spacing" setting in a ruleset.xml file to change -- Squiz LowercasePHPFunctionSniff no longer throws errors for the limited set of PHP keywords it was checking - - Add a rule for Generic.PHP.LowerCaseKeyword to your ruleset to replicate this functionality -- Added support for the PHP 5.4 T_CALLABLE token so it can be used in lower PHP versions -- Generic EndFileNoNewlineSniff now supports checking of CSS and JS files -- PSR2 SwitchDeclarationSniff now has a setting to specify how many spaces code should be indented - - Default remains at 4; override the indent setting in a ruleset.xml file to change - - Thanks to [Asher Snyder][@asnyder] for the patch -- Generic ScopeIndentSniff now has a setting to specify a list of tokens that should be ignored - - The first token on the line is checked and the whole line is ignored if the token is in the array - - Thanks to [Eloy Lafuente][@stronk7] for the patch -- Squiz LowercaseClassKeywordsSniff now checks for the TRAIT keyword - - Thanks to [Anthon Pang][@robocoder] for the patch -- If you create your own PHP_CodeSniffer object, PHPCS will no longer exit when an unknown argument is found - - This allows you to create wrapper scripts for PHPCS more easily -- PSR2 MethodDeclarationSniff no longer generates a notice for methods named "_" - - Thanks to [Bart S][@zBart] for the patch -- Squiz BlockCommentSniff no longer reports that a blank line between a scope closer and block comment is invalid -- Generic DuplicateClassNameSniff no longer reports an invalid error if multiple PHP open tags exist in a file -- Generic DuplicateClassNameSniff no longer reports duplicate errors if multiple PHP open tags exist in a file - -### Fixed -- Fixed bug [#19819][pear-19819] : Freeze with syntax error in use statement -- Fixed bug [#19820][pear-19820] : Wrong message level in Generic_Sniffs_CodeAnalysis_EmptyStatementSniff -- Fixed bug [#19859][pear-19859] : CodeSniffer::setIgnorePatterns API changed -- Fixed bug [#19871][pear-19871] : findExtendedClassName doesn't return FQCN on namespaced classes -- Fixed bug [#19879][pear-19879] : bitwise and operator interpreted as reference by value - -[pear-19819]: https://pear.php.net/bugs/bug.php?id=19819 -[pear-19820]: https://pear.php.net/bugs/bug.php?id=19820 -[pear-19843]: https://pear.php.net/bugs/bug.php?id=19843 -[pear-19859]: https://pear.php.net/bugs/bug.php?id=19859 -[pear-19863]: https://pear.php.net/bugs/bug.php?id=19863 -[pear-19871]: https://pear.php.net/bugs/bug.php?id=19871 -[pear-19879]: https://pear.php.net/bugs/bug.php?id=19879 - -## [1.5.0RC1] - 2013-02-08 - -### Changed -- Reports have been completely rewritten to consume far less memory - - Each report is incrementally written to the file system during a run and then printed out when the run ends - - There is no longer a need to keep the list of errors and warnings in memory during a run -- Multi-file sniff support has been removed because they are too memory intensive - - If you have a custom multi-file sniff, you can convert it into a standard sniff quite easily - - See `CodeSniffer/Standards/Generic/Sniffs/Classes/DuplicateClassNameSniff.php` for an example - -## [1.4.4] - 2013-02-07 - -### Changed -- Ignored lines no longer cause the summary report to show incorrect error and warning counts - - Thanks to [Bert Van Hauwaert][@becoded] for the patch -- Added Generic CSSLintSniff to run CSSLint over a CSS file and report warnings - - Set full command to run CSSLint using phpcs --config-set csslint_path /path/to/csslint - - Thanks to [Roman Levishchenko][@index0h] for the contribution -- Added PSR2 ControlStructureSpacingSniff to ensure there are no spaces before and after parenthesis in control structures - - Fixes bug [#19732][pear-19732] : PSR2: some control structures errors not reported -- Squiz commenting sniffs now support non-English characters when checking for capital letters - - Thanks to [Roman Levishchenko][@index0h] for the patch -- Generic EndFileNewlineSniff now supports JS and CSS files - - Thanks to [Denis Ryabkov][@dryabkov] for the patch -- PSR1 SideEffectsSniff no longer reports constant declarations as side effects -- Notifysend report now supports notify-send versions before 0.7.3 - - Thanks to [Ken Guest][@kenguest] for the patch -- PEAR and Squiz FunctionCommentSniffs no longer report errors for misaligned argument comments when they are blank - - Thanks to [Thomas Peterson][@boonkerz] for the patch -- Squiz FunctionDeclarationArgumentSpacingSniff now works correctly for equalsSpacing values greater than 0 - - Thanks to [Klaus Purer][@klausi] for the patch -- Squiz SuperfluousWhitespaceSniff no longer throws errors for CSS files with no newline at the end -- Squiz SuperfluousWhitespaceSniff now allows a single newline at the end of JS and CSS files - -### Fixed -- Fixed bug [#19755][pear-19755] : Token of T_CLASS type has no scope_opener and scope_closer keys -- Fixed bug [#19759][pear-19759] : Squiz.PHP.NonExecutableCode fails for return function()... -- Fixed bug [#19763][pear-19763] : Use statements for traits not recognised correctly for PSR2 code style -- Fixed bug [#19764][pear-19764] : Instead of for traits throws uppercase constant name errors -- Fixed bug [#19772][pear-19772] : PSR2_Sniffs_Namespaces_UseDeclarationSniff does not properly recognize last use -- Fixed bug [#19775][pear-19775] : False positive in NonExecutableCode sniff when not using curly braces -- Fixed bug [#19782][pear-19782] : Invalid found size functions in loop when using object operator -- Fixed bug [#19799][pear-19799] : config folder is not created automatically -- Fixed bug [#19804][pear-19804] : JS Tokenizer wrong /**/ parsing - -[pear-19732]: https://pear.php.net/bugs/bug.php?id=19732 -[pear-19755]: https://pear.php.net/bugs/bug.php?id=19755 -[pear-19759]: https://pear.php.net/bugs/bug.php?id=19759 -[pear-19763]: https://pear.php.net/bugs/bug.php?id=19763 -[pear-19764]: https://pear.php.net/bugs/bug.php?id=19764 -[pear-19772]: https://pear.php.net/bugs/bug.php?id=19772 -[pear-19775]: https://pear.php.net/bugs/bug.php?id=19775 -[pear-19782]: https://pear.php.net/bugs/bug.php?id=19782 -[pear-19799]: https://pear.php.net/bugs/bug.php?id=19799 -[pear-19804]: https://pear.php.net/bugs/bug.php?id=19804 - -## [1.4.3] - 2012-12-04 - -### Changed -- Added support for the PHP 5.5 T_FINALLY token to detect try/catch/finally statements -- Added empty CodeSniffer.conf to enable config settings for Composer installs -- Added Generic EndFileNoNewlineSniff to ensure there is no newline at the end of a file -- Autoloader can now load PSR-0 compliant classes - - Thanks to [Maik Penz][@goatherd] for the patch -- Squiz NonExecutableCodeSniff no longer throws error for multi-line RETURNs inside CASE statements - - Thanks to [Marc Ypes][@ceeram] for the patch -- Squiz OperatorSpacingSniff no longer reports errors for negative numbers inside inline THEN statements - - Thanks to [Klaus Purer][@klausi] for the patch -- Squiz OperatorSpacingSniff no longer reports errors for the assignment of operations involving negative numbers -- Squiz SelfMemberReferenceSniff can no longer get into an infinite loop when checking a static call with a namespace - - Thanks to [Andy Grunwald][@andygrunwald] for the patch - -### Fixed -- Fixed bug [#19699][pear-19699] : Generic.Files.LineLength giving false positives when tab-width is used -- Fixed bug [#19726][pear-19726] : Wrong number of spaces expected after instanceof static -- Fixed bug [#19727][pear-19727] : PSR2: no error reported when using } elseif { - -[pear-19699]: https://pear.php.net/bugs/bug.php?id=19699 -[pear-19726]: https://pear.php.net/bugs/bug.php?id=19726 -[pear-19727]: https://pear.php.net/bugs/bug.php?id=19727 - -## [1.4.2] - 2012-11-09 - -### Changed -- PHP_CodeSniffer can now be installed using Composer - - Require `squizlabs/php_codesniffer` in your `composer.json` file - - Thanks to [Rob Bast][@alcohol], [Stephen Rees-Carter][@valorin], [Stefano Kowalke][@Konafets] and [Ivan Habunek][@ihabunek] for help with this -- Squiz BlockCommentSniff and InlineCommentSniff no longer report errors for trait block comments -- Squiz SelfMemberReferenceSniff now supports namespaces - - Thanks to [Andy Grunwald][@andygrunwald] for the patch -- Squiz FileCommentSniff now uses tag names inside the error codes for many messages - - This allows you to exclude specific missing, out of order etc., tags -- Squiz SuperfluousWhitespaceSniff now has an option to ignore blank lines - - This will stop errors being reported for lines that contain only whitespace - - Set the ignoreBlankLines property to TRUE in your ruleset.xml file to enable this -- PSR2 no longer reports errors for whitespace at the end of blank lines - -### Fixed -- Fixed gitblame report not working on Windows - - Thanks to [Rogerio Prado de Jesus][@rogeriopradoj] -- Fixed an incorrect error in Squiz OperatorSpacingSniff for default values inside a closure definition -- Fixed bug [#19691][pear-19691] : SubversionPropertiesSniff fails to find missing properties - - Thanks to [Kevin Winahradsky][pear-kwinahradsky] for the patch -- Fixed bug [#19692][pear-19692] : DisallowMultipleAssignments is triggered by a closure -- Fixed bug [#19693][pear-19693] : exclude-patterns no longer work on specific messages -- Fixed bug [#19694][pear-19694] : Squiz.PHP.LowercasePHPFunctions incorrectly matches return by ref functions - -[pear-19691]: https://pear.php.net/bugs/bug.php?id=19691 -[pear-19692]: https://pear.php.net/bugs/bug.php?id=19692 -[pear-19693]: https://pear.php.net/bugs/bug.php?id=19693 -[pear-19694]: https://pear.php.net/bugs/bug.php?id=19694 - -## [1.4.1] - 2012-11-02 - -### Changed -- All ignore patterns have been reverted to being checked against the absolute path of a file - - Patterns can be specified to be relative in a ruleset.xml file, but nowhere else - - e.g., `^tests/*` -- Added support for PHP tokenizing of T_INLINE_ELSE colons, so this token type is now available - - Custom sniffs that rely on looking for T_COLON tokens inside inline if statements must be changed to use the new token - - Fixes bug [#19666][pear-19666] : PSR1.Files.SideEffects throws a notice Undefined index: scope_closer -- Messages can now be changed from errors to warnings (and vice versa) inside ruleset.xml files - - As you would with "message" and "severity", specify a "type" tag under a "rule" tag and set the value to "error" or "warning" -- PHP_CodeSniffer will now generate a warning on files that it detects have mixed line endings - - This warning has the code Internal.LineEndings.Mixed and can be overridden in a ruleset.xml file - - Thanks to [Vit Brunner][@tasuki] for help with this -- Sniffs inside PHP 5.3 namespaces are now supported, along with the existing underscore-style emulated namespaces - - For example: namespace MyStandard\Sniffs\Arrays; class ArrayDeclarationSniff implements \PHP_CodeSniffer_Sniff { ... - - Thanks to [Till Klampaeckel][@till] for the patch -- Generic DuplicateClassNameSniff is no longer a multi-file sniff, so it won't max out your memory - - Multi-file sniff support should be considered deprecated as standard sniffs can now do the same thing -- Added Generic DisallowSpaceIndent to check that files are indented using tabs -- Added Generic OneClassPerFileSniff to check that only one class is defined in each file - - Thanks to [Andy Grunwald][@andygrunwald] for the contribution -- Added Generic OneInterfacePerFileSniff to check that only one interface is defined in each file - - Thanks to [Andy Grunwald][@andygrunwald] for the contribution -- Added Generic LowercasedFilenameSniff to check that filenames are lowercase - - Thanks to [Andy Grunwald][@andygrunwald] for the contribution -- Added Generic ClosingPHPTagSniff to check that each open PHP tag has a corresponding close tag - - Thanks to [Andy Grunwald][@andygrunwald] for the contribution -- Added Generic CharacterBeforePHPOpeningTagSniff to check that the open PHP tag is the first content in a file - - Thanks to [Andy Grunwald][@andygrunwald] for the contribution -- Fixed incorrect errors in Squiz OperatorBracketSniff and OperatorSpacingSniff for negative numbers in CASE statements - - Thanks to [Arnout Boks][@aboks] for the patch -- Generic CamelCapsFunctionNameSniff no longer enforces exact case matching for PHP magic methods -- Generic CamelCapsFunctionNameSniff no longer throws errors for overridden SOAPClient methods prefixed with double underscores - - Thanks to [Dorian Villet][@gnutix] for the patch -- PEAR ValidFunctionNameSniff now supports traits -- PSR1 ClassDeclarationSniff no longer throws an error for non-namespaced code if PHP version is less than 5.3.0 - -### Fixed -- Fixed bug [#19616][pear-19616] : Nested switches cause false error in PSR2 -- Fixed bug [#19629][pear-19629] : PSR2 error for inline comments on multi-line argument lists -- Fixed bug [#19644][pear-19644] : Alternative syntax, e.g. if/endif triggers Inline Control Structure error -- Fixed bug [#19655][pear-19655] : Closures reporting as multi-line when they are not -- Fixed bug [#19675][pear-19675] : Improper indent of nested anonymous function bodies in a call -- Fixed bug [#19685][pear-19685] : PSR2 catch-22 with empty third statement in for loop -- Fixed bug [#19687][pear-19687] : Anonymous functions inside arrays marked as indented incorrectly in PSR2 - -[pear-19616]: https://pear.php.net/bugs/bug.php?id=19616 -[pear-19629]: https://pear.php.net/bugs/bug.php?id=19629 -[pear-19644]: https://pear.php.net/bugs/bug.php?id=19644 -[pear-19655]: https://pear.php.net/bugs/bug.php?id=19655 -[pear-19666]: https://pear.php.net/bugs/bug.php?id=19666 -[pear-19675]: https://pear.php.net/bugs/bug.php?id=19675 -[pear-19685]: https://pear.php.net/bugs/bug.php?id=19685 -[pear-19687]: https://pear.php.net/bugs/bug.php?id=19687 - -## [1.4.0] - 2012-09-26 - -### Changed -- Added PSR1 and PSR2 coding standards that can be used to check your code against these guidelines -- PHP 5.4 short array syntax is now detected and tokens are assigned to the open and close characters - - New tokens are T_OPEN_SHORT_ARRAY and T_CLOSE_SHORT_ARRAY as PHP does not define its own -- Added the ability to explain a coding standard by listing the sniffs that it includes - - The sniff list includes all imported and native sniffs - - Explain a standard by using the `-e` and `--standard=[standard]` command line arguments - - E.g., `phpcs -e --standard=Squiz` - - Thanks to [Ben Selby][@benmatselby] for the idea -- Added report to show results using notify-send - - Use --report=notifysend to generate the report - - Thanks to [Christian Weiske][@cweiske] for the contribution -- The JS tokenizer now recognises RETURN as a valid closer for CASE and DEFAULT inside switch statements -- AbstractPatternSniff now sets the ignoreComments option using a public var rather than through the constructor - - This allows the setting to be overwritten in ruleset.xml files - - Old method remains for backwards compatibility -- Generic LowerCaseConstantSniff and UpperCaseConstantSniff no longer report errors on classes named True, False or Null -- PEAR ValidFunctionNameSniff no longer enforces exact case matching for PHP magic methods -- Squiz SwitchDeclarationSniff now allows RETURN statements to close a CASE or DEFAULT statement -- Squiz BlockCommentSniff now correctly reports an error for blank lines before blocks at the start of a control structure - -### Fixed -- Fixed a PHP notice generated when loading custom array settings from a ruleset.xml file -- Fixed bug [#17908][pear-17908] : CodeSniffer does not recognise optional @params - - Thanks to [Pete Walker][pear-pete] for the patch -- Fixed bug [#19538][pear-19538] : Function indentation code sniffer checks inside short arrays -- Fixed bug [#19565][pear-19565] : Non-Executable Code Sniff Broken for Case Statements with both return and break -- Fixed bug [#19612][pear-19612] : Invalid @package suggestion - -[pear-17908]: https://pear.php.net/bugs/bug.php?id=17908 -[pear-19538]: https://pear.php.net/bugs/bug.php?id=19538 -[pear-19565]: https://pear.php.net/bugs/bug.php?id=19565 -[pear-19612]: https://pear.php.net/bugs/bug.php?id=19612 - -## [1.3.6] - 2012-08-08 - -### Changed -- Memory usage has been dramatically reduced when using the summary report - - Reduced memory is only available when displaying a single summary report to the screen - - PHP_CodeSniffer will not generate any messages in this case, storing only error counts instead - - Impact is most notable with very high error and warning counts -- Significantly improved the performance of Squiz NonExecutableCodeSniff -- Ignore patterns now check the relative path of a file based on the dir being checked - - Allows ignore patterns to become more generic as the path to the code is no longer included when checking - - Thanks to [Kristof Coomans][@kristofser] for the patch -- Sniff settings can now be changed by specifying a special comment format inside a file - - e.g., // @codingStandardsChangeSetting PEAR.Functions.FunctionCallSignature allowMultipleArguments false - - If you change a setting, don't forget to change it back -- Added Generic EndFileNewlineSniff to ensure PHP files end with a newline character -- PEAR FunctionCallSignatureSniff now includes a setting to force one argument per line in multi-line calls - - Set allowMultipleArguments to false -- Squiz standard now enforces one argument per line in multi-line function calls -- Squiz FunctionDeclarationArgumentSpacingSniff now supports closures -- Squiz OperatorSpacingSniff no longer throws an error for negative values inside an inline THEN statement - - Thanks to [Klaus Purer][@klausi] for the patch -- Squiz FunctionCommentSniff now throws an error for not closing a comment with */ - - Thanks to [Klaus Purer][@klausi] for the patch -- Summary report no longer shows two lines of PHP_Timer output when showing sources - -### Fixed -- Fixed undefined variable error in PEAR FunctionCallSignatureSniff for lines with no indent -- Fixed bug [#19502][pear-19502] : Generic.Files.LineEndingsSniff fails if no new-lines in file -- Fixed bug [#19508][pear-19508] : switch+return: Closing brace indented incorrectly -- Fixed bug [#19532][pear-19532] : The PSR-2 standard don't recognize Null in class names -- Fixed bug [#19546][pear-19546] : Error thrown for __call() method in traits - -[pear-19502]: https://pear.php.net/bugs/bug.php?id=19502 -[pear-19508]: https://pear.php.net/bugs/bug.php?id=19508 -[pear-19532]: https://pear.php.net/bugs/bug.php?id=19532 -[pear-19546]: https://pear.php.net/bugs/bug.php?id=19546 - -## [1.3.5] - 2012-07-12 - -### Changed -- Added Generic CamelCapsFunctionNameSniff to just check if function and method names use camel caps - - Does not allow underscore prefixes for private/protected methods - - Defaults to strict checking, where two uppercase characters can not be next to each other - - Strict checking can be disabled in a ruleset.xml file -- Squiz FunctionDeclarationArgumentSpacing now has a setting to specify how many spaces should surround equals signs - - Default remains at 0 - - Override the equalsSpacing setting in a ruleset.xml file to change -- Squiz ClassDeclarationSniff now throws errors for > 1 space before extends/implements class name with ns separator -- Squiz standard now warns about deprecated functions using Generic DeprecatedFunctionsSniff -- PEAR FunctionDeclarationSniff now reports an error for multiple spaces after the FUNCTION keyword and around USE -- PEAR FunctionDeclarationSniff now supports closures -- Squiz MultiLineFunctionDeclarationSniff now supports closures -- Exclude rules written for Unix systems will now work correctly on Windows - - Thanks to [Walter Tamboer][@waltertamboer] for the patch -- The PHP tokenizer now recognises T_RETURN as a valid closer for T_CASE and T_DEFAULT inside switch statements - -### Fixed -- Fixed duplicate message codes in Generic OpeningFunctionBraceKernighanRitchieSniff -- Fixed bug [#18651][pear-18651] : PHPUnit Test cases for custom standards are not working on Windows -- Fixed bug [#19416][pear-19416] : Shorthand arrays cause bracket spacing errors -- Fixed bug [#19421][pear-19421] : phpcs doesn't recognize ${x} as equivalent to $x -- Fixed bug [#19428][pear-19428] : PHPCS Report "hgblame" doesn't support windows paths - - Thanks to [Justin Rovang][@rovangju] for the patch -- Fixed bug [#19448][pear-19448] : Problem with detecting remote standards -- Fixed bug [#19463][pear-19463] : Anonymous functions incorrectly being flagged by NonExecutableCodeSniff -- Fixed bug [#19469][pear-19469] : PHP_CodeSniffer_File::getMemberProperties() sets wrong scope -- Fixed bug [#19471][pear-19471] : phpcs on Windows, when using Zend standard, doesn't catch problems - - Thanks to [Ivan Habunek][@ihabunek] for the patch -- Fixed bug [#19478][pear-19478] : Incorrect indent detection in PEAR standard - - Thanks to [Shane Auckland][@shanethehat] for the patch -- Fixed bug [#19483][pear-19483] : Blame Reports fail with space in directory name - -[pear-18651]: https://pear.php.net/bugs/bug.php?id=18651 -[pear-19416]: https://pear.php.net/bugs/bug.php?id=19416 -[pear-19421]: https://pear.php.net/bugs/bug.php?id=19421 -[pear-19428]: https://pear.php.net/bugs/bug.php?id=19428 -[pear-19448]: https://pear.php.net/bugs/bug.php?id=19448 -[pear-19463]: https://pear.php.net/bugs/bug.php?id=19463 -[pear-19469]: https://pear.php.net/bugs/bug.php?id=19469 -[pear-19471]: https://pear.php.net/bugs/bug.php?id=19471 -[pear-19478]: https://pear.php.net/bugs/bug.php?id=19478 -[pear-19483]: https://pear.php.net/bugs/bug.php?id=19483 - -## [1.3.4] - 2012-05-17 - -### Changed -- Added missing package.xml entries for new Generic FixmeSniff - - Thanks to [Jaroslav Hanslík][@kukulich] for the patch -- Expected indents for PEAR ScopeClosingBraceSniff and FunctionCallSignatureSniff can now be set in ruleset files - - Both sniffs use a variable called "indent" - - Thanks to [Thomas Despoix][pear-tomdesp] for the patch -- Standards designed to be installed in the PHPCS Standards dir will now work outside this dir as well - - In particular, allows the Drupal CS to work without needing to symlink it into the PHPCS install - - Thanks to [Peter Philipp][@das-peter] for the patch -- Rule references for standards, directories and specific sniffs can now be relative in ruleset.xml files - - For example: `ref="../MyStandard/Sniffs/Commenting/DisallowHashCommentsSniff.php"` -- Symlinked standards now work correctly, allowing aliasing of installed standards (request [#19417][pear-19417]) - - Thanks to [Tom Klingenberg][@ktomk] for the patch -- Squiz ObjectInstantiationSniff now allows objects to be returned without assigning them to a variable -- Added Squiz.Commenting.FileComment.MissingShort error message for file comments that only contains tags - - Also stops undefined index errors being generated for these comments -- Debug option -vv now shows tokenizer status for CSS files -- Added support for new gjslint error formats - - Thanks to [Meck][@yesmeck] for the patch -- Generic ScopeIndentSniff now allows comment indents to not be exact even if the exact flag is set - - The start of the comment is still checked for exact indentation as normal -- Fixed an issue in AbstractPatternSniff where comments were not being ignored in some cases -- Fixed an issue in Zend ClosingTagSniff where the closing tag was not always being detected correctly - - Thanks to [Jonathan Robson][@jnrbsn] for the patch -- Fixed an issue in Generic FunctionCallArgumentSpacingSniff where closures could cause incorrect errors -- Fixed an issue in Generic UpperCaseConstantNameSniff where errors were incorrectly reported on goto statements - - Thanks to [Tom Klingenberg][@ktomk] for the patch -- PEAR FileCommentSniff and ClassCommentSniff now support author emails with a single character in the local part - - E.g., `a@me.com` - - Thanks to Denis Shapkin for the patch - -### Fixed -- Fixed bug [#19290][pear-19290] : Generic indent sniffer fails for anonymous functions -- Fixed bug [#19324][pear-19324] : Setting show_warnings configuration option does not work -- Fixed bug [#19354][pear-19354] : Not recognizing references passed to method -- Fixed bug [#19361][pear-19361] : CSS tokenizer generates errors when PHP embedded in CSS file -- Fixed bug [#19374][pear-19374] : HEREDOC/NOWDOC Indentation problems -- Fixed bug [#19381][pear-19381] : traits and indentations in traits are not handled properly -- Fixed bug [#19394][pear-19394] : Notice in NonExecutableCodeSniff -- Fixed bug [#19402][pear-19402] : Syntax error when executing phpcs on Windows with parens in PHP path - - Thanks to [Tom Klingenberg][@ktomk] for the patch -- Fixed bug [#19411][pear-19411] : magic method error on __construct() - - The fix required a rewrite of AbstractScopeSniff, so please test any sniffs that extend this class -- Fixed bug [#19412][pear-19412] : Incorrect error about assigning objects to variables when inside inline IF -- Fixed bug [#19413][pear-19413] : PHP_CodeSniffer thinks I haven't used a parameter when I have -- Fixed bug [#19414][pear-19414] : PHP_CodeSniffer seems to not track variables correctly in heredocs - -[pear-19290]: https://pear.php.net/bugs/bug.php?id=19290 -[pear-19324]: https://pear.php.net/bugs/bug.php?id=19324 -[pear-19354]: https://pear.php.net/bugs/bug.php?id=19354 -[pear-19361]: https://pear.php.net/bugs/bug.php?id=19361 -[pear-19374]: https://pear.php.net/bugs/bug.php?id=19374 -[pear-19381]: https://pear.php.net/bugs/bug.php?id=19381 -[pear-19394]: https://pear.php.net/bugs/bug.php?id=19394 -[pear-19402]: https://pear.php.net/bugs/bug.php?id=19402 -[pear-19411]: https://pear.php.net/bugs/bug.php?id=19411 -[pear-19412]: https://pear.php.net/bugs/bug.php?id=19412 -[pear-19413]: https://pear.php.net/bugs/bug.php?id=19413 -[pear-19414]: https://pear.php.net/bugs/bug.php?id=19414 -[pear-19417]: https://pear.php.net/bugs/bug.php?id=19417 - -## [1.3.3] - 2012-02-07 - -### Changed -- Added new Generic FixmeSniff that shows error messages for all FIXME comments left in your code - - Thanks to [Sam Graham][@illusori] for the contribution -- The maxPercentage setting in the Squiz CommentedOutCodeSniff can now be overridden in a ruleset.xml file - - Thanks to [Volker Dusch][@edorian] for the patch -- The Checkstyle and XML reports now use XMLWriter - - Only change in output is that empty file tags are no longer produced for files with no violations - - Thanks to [Sebastian Bergmann][@sebastianbergmann] for the patch -- Added PHP_CodeSniffer_Tokens::$bracketTokens to give sniff writers fast access to open and close bracket tokens -- Fixed an issue in AbstractPatternSniff where EOL tokens were not being correctly checked in some cases -- PHP_CodeSniffer_File::getTokensAsString() now detects incorrect length value (request [#19313][pear-19313]) - -### Fixed -- Fixed bug [#19114][pear-19114] : CodeSniffer checks extension even for single file -- Fixed bug [#19171][pear-19171] : Show sniff codes option is ignored by some report types - - Thanks to [Dominic Scheirlinck][@dominics] for the patch -- Fixed bug [#19188][pear-19188] : Lots of PHP Notices when analyzing the Symfony framework - - First issue was list-style.. lines in CSS files not properly adjusting open/close bracket positions - - Second issue was notices caused by bug [#19137][pear-19137] -- Fixed bug [#19208][pear-19208] : UpperCaseConstantName reports class members - - Was also a problem with LowerCaseConstantName as well -- Fixed bug [#19256][pear-19256] : T_DOC_COMMENT in CSS files breaks ClassDefinitionNameSpacingSniff - - Thanks to [Klaus Purer][@klausi] for the patch -- Fixed bug [#19264][pear-19264] : Squiz.PHP.NonExecutableCode does not handle RETURN in CASE without BREAK -- Fixed bug [#19270][pear-19270] : DuplicateClassName does not handle namespaces correctly -- Fixed bug [#19283][pear-19283] : CSS @media rules cause false positives - - Thanks to [Klaus Purer][@klausi] for the patch - -[pear-19114]: https://pear.php.net/bugs/bug.php?id=19114 -[pear-19137]: https://pear.php.net/bugs/bug.php?id=19137 -[pear-19171]: https://pear.php.net/bugs/bug.php?id=19171 -[pear-19188]: https://pear.php.net/bugs/bug.php?id=19188 -[pear-19208]: https://pear.php.net/bugs/bug.php?id=19208 -[pear-19256]: https://pear.php.net/bugs/bug.php?id=19256 -[pear-19264]: https://pear.php.net/bugs/bug.php?id=19264 -[pear-19270]: https://pear.php.net/bugs/bug.php?id=19270 -[pear-19283]: https://pear.php.net/bugs/bug.php?id=19283 -[pear-19313]: https://pear.php.net/bugs/bug.php?id=19313 - -## [1.3.2] - 2011-12-01 - -### Changed -- Added Generic JSHintSniff to run jshint.js over a JS file and report warnings - - Set jshint path using phpcs --config-set jshint_path /path/to/jshint-rhino.js - - Set rhino path using phpcs --config-set rhino_path /path/to/rhino - - Thanks to Alexander Weiß for the contribution -- Nowdocs are now tokenized using PHP_CodeSniffer specific T_NOWDOC tokens for easier identification -- Generic UpperCaseConstantNameSniff no longer throws errors for namespaces - - Thanks to [Jaroslav Hanslík][@kukulich] for the patch -- Squiz NonExecutableCodeSniff now detects code after thrown exceptions - - Thanks to [Jaroslav Hanslík][@kukulich] for the patch -- Squiz OperatorSpacingSniff now ignores references - - Thanks to [Jaroslav Hanslík][@kukulich] for the patch -- Squiz FunctionCommentSniff now reports a missing function comment if it finds a standard code comment instead -- Squiz FunctionCommentThrownTagSniff no longer reports errors if it can't find a function comment - -### Fixed -- Fixed unit tests not running under Windows - - Thanks to [Jaroslav Hanslík][@kukulich] for the patch -- Fixed bug [#18964][pear-18964] : "$stackPtr must be of type T_VARIABLE" on heredocs and nowdocs -- Fixed bug [#18973][pear-18973] : phpcs is looking for variables in a nowdoc -- Fixed bug [#18974][pear-18974] : Blank line causes "Multi-line function call not indented correctly" - - Adds new error message to ban empty lines in multi-line function calls -- Fixed bug [#18975][pear-18975] : "Closing parenthesis must be on a line by itself" also causes indentation error - -[pear-18964]: https://pear.php.net/bugs/bug.php?id=18964 -[pear-18973]: https://pear.php.net/bugs/bug.php?id=18973 -[pear-18974]: https://pear.php.net/bugs/bug.php?id=18974 -[pear-18975]: https://pear.php.net/bugs/bug.php?id=18975 - -## 1.3.1 - 2011-11-03 - -### Changed -- All report file command line arguments now work with relative paths (request [#17240][pear-17240]) -- The extensions command line argument now supports multi-part file extensions (request [#17227][pear-17227]) -- Added report type --report=hgblame to show number of errors/warnings committed by authors in a Mercurial repository - - Has the same functionality as the svnblame report - - Thanks to [Ben Selby][@benmatselby] for the patch -- Added T_BACKTICK token type to make detection of backticks easier (request [#18799][pear-18799]) -- Added pattern matching support to Generic ForbiddenFunctionsSniff - - If you are extending it and overriding register() or addError() you will need to review your sniff -- Namespaces are now recognised as scope openers, although they do not require braces (request [#18043][pear-18043]) -- Added new ByteOrderMarkSniff to Generic standard (request [#18194][pear-18194]) - - Throws an error if a byte order mark is found in any PHP file - - Thanks to [Piotr Karas][pear-ryba] for the contribution -- PHP_Timer output is no longer included in reports when being written to a file (request [#18252][pear-18252]) - - Also now shown for all report types if nothing is being printed to the screen -- Generic DeprecatedFunctionSniff now reports functions as deprecated and not simply forbidden (request [#18288][pear-18288]) -- PHPCS now accepts file contents from STDIN (request [#18447][pear-18447]) - - Example usage: `cat temp.php | phpcs [options]` -OR- `phpcs [options] < temp.php` - - Not every sniff will work correctly due to the lack of a valid file path -- PHP_CodeSniffer_Exception no longer extends PEAR_Exception (request [#18483][pear-18483]) - - PEAR_Exception added a requirement that PEAR had to be installed - - PHP_CodeSniffer is not used as a library, so unlikely to have any impact -- PEAR FileCommentSniff now allows GIT IDs in the version tag (request [#14874][pear-14874]) -- AbstractVariableSniff now supports heredocs - - Also includes some variable detection fixes - - Thanks to [Sam Graham][@illusori] for the patch -- Squiz FileCommentSniff now enforces rule that package names cannot start with the word Squiz -- MySource AssignThisSniff now allows "this" to be assigned to the private var _self -- PEAR ClassDeclaration sniff now supports indentation checks when using the alternate namespace syntax - - PEAR.Classes.ClassDeclaration.SpaceBeforeBrace message now contains 2 variables instead of 1 - - Sniff allows overriding of the default indent level, which is set to 4 - - Fixes bug [#18933][pear-18933] : Alternative namespace declaration syntax confuses scope sniffs - -### Fixed -- Fixed issue in Squiz FileCommentSniff where suggested package name was the same as the incorrect package name -- Fixed some issues with Squiz ArrayDeclarationSniff when using function calls in array values -- Fixed doc generation so it actually works again - - Also now works when being run from an SVN checkout as well as when installed as a PEAR package - - Should fix bug [#18949][pear-18949] : Call to private method from static -- Fixed bug [#18465][pear-18465] : "self::" does not work in lambda functions - - Also corrects conversion of T_FUNCTION tokens to T_CLOSURE, which was not fixing token condition arrays -- Fixed bug [#18543][pear-18543] : CSS Tokenizer deletes too many # -- Fixed bug [#18624][pear-18624] : @throws namespace problem - - Thanks to [Gavin Davies][pear-boxgav] for the patch -- Fixed bug [#18628][pear-18628] : Generic.Files.LineLength gives incorrect results with Windows line-endings -- Fixed bug [#18633][pear-18633] : CSS Tokenizer doesn't replace T_LIST tokens inside some styles -- Fixed bug [#18657][pear-18657] : anonymous functions wrongly indented -- Fixed bug [#18670][pear-18670] : UpperCaseConstantNameSniff fails on dynamic retrieval of class constant -- Fixed bug [#18709][pear-18709] : Code sniffer sniffs file even if it's in --ignore - - Thanks to [Artem Lopata][@biozshock] for the patch -- Fixed bug [#18762][pear-18762] : Incorrect handling of define and constant in UpperCaseConstantNameSniff - - Thanks to [Thomas Baker][pear-bakert] for the patch -- Fixed bug [#18769][pear-18769] : CSS Tokenizer doesn't replace T_BREAK tokens inside some styles -- Fixed bug [#18835][pear-18835] : Unreachable errors of inline returns of closure functions - - Thanks to [Patrick Schmidt][pear-woellchen] for the patch -- Fixed bug [#18839][pear-18839] : Fix miscount of warnings in `AbstractSniffUnitTest.php` - - Thanks to [Sam Graham][@illusori] for the patch -- Fixed bug [#18844][pear-18844] : Generic_Sniffs_CodeAnalysis_UnusedFunctionParameterSniff with empty body - - Thanks to [Dmitri Medvedev][pear-dvino] for the patch -- Fixed bug [#18847][pear-18847] : Running Squiz_Sniffs_Classes_ClassDeclarationSniff results in PHP notice -- Fixed bug [#18868][pear-18868] : jslint+rhino: errors/warnings not detected - - Thanks to [Christian Weiske][@cweiske] for the patch -- Fixed bug [#18879][pear-18879] : phpcs-svn-pre-commit requires escapeshellarg - - Thanks to [Bjorn Katuin][pear-bjorn] for the patch -- Fixed bug [#18951][pear-18951] : weird behaviour with closures and multi-line use () params - -[pear-14874]: https://pear.php.net/bugs/bug.php?id=14874 -[pear-17227]: https://pear.php.net/bugs/bug.php?id=17227 -[pear-17240]: https://pear.php.net/bugs/bug.php?id=17240 -[pear-18043]: https://pear.php.net/bugs/bug.php?id=18043 -[pear-18194]: https://pear.php.net/bugs/bug.php?id=18194 -[pear-18252]: https://pear.php.net/bugs/bug.php?id=18252 -[pear-18288]: https://pear.php.net/bugs/bug.php?id=18288 -[pear-18447]: https://pear.php.net/bugs/bug.php?id=18447 -[pear-18465]: https://pear.php.net/bugs/bug.php?id=18465 -[pear-18483]: https://pear.php.net/bugs/bug.php?id=18483 -[pear-18543]: https://pear.php.net/bugs/bug.php?id=18543 -[pear-18624]: https://pear.php.net/bugs/bug.php?id=18624 -[pear-18628]: https://pear.php.net/bugs/bug.php?id=18628 -[pear-18633]: https://pear.php.net/bugs/bug.php?id=18633 -[pear-18657]: https://pear.php.net/bugs/bug.php?id=18657 -[pear-18670]: https://pear.php.net/bugs/bug.php?id=18670 -[pear-18709]: https://pear.php.net/bugs/bug.php?id=18709 -[pear-18762]: https://pear.php.net/bugs/bug.php?id=18762 -[pear-18769]: https://pear.php.net/bugs/bug.php?id=18769 -[pear-18799]: https://pear.php.net/bugs/bug.php?id=18799 -[pear-18835]: https://pear.php.net/bugs/bug.php?id=18835 -[pear-18839]: https://pear.php.net/bugs/bug.php?id=18839 -[pear-18844]: https://pear.php.net/bugs/bug.php?id=18844 -[pear-18847]: https://pear.php.net/bugs/bug.php?id=18847 -[pear-18868]: https://pear.php.net/bugs/bug.php?id=18868 -[pear-18879]: https://pear.php.net/bugs/bug.php?id=18879 -[pear-18933]: https://pear.php.net/bugs/bug.php?id=18933 -[pear-18949]: https://pear.php.net/bugs/bug.php?id=18949 -[pear-18951]: https://pear.php.net/bugs/bug.php?id=18951 - -## 1.3.0 - 2011-03-17 - -### Changed -- Add a new token T_CLOSURE that replaces T_FUNCTION if the function keyword is anonymous -- Many Squiz sniffs no longer report errors when checking closures; they are now ignored -- Fixed some error messages in PEAR MultiLineConditionSniff that were not using placeholders for message data -- AbstractVariableSniff now correctly finds variable names wrapped with curly braces inside double quoted strings -- PEAR FunctionDeclarationSniff now ignores arrays in argument default values when checking multi-line declarations - -### Fixed -- Fixed bug [#18200][pear-18200] : Using custom named ruleset file as standard no longer works -- Fixed bug [#18196][pear-18196] : PEAR MultiLineCondition.SpaceBeforeOpenBrace not consistent with newline chars -- Fixed bug [#18204][pear-18204] : FunctionCommentThrowTag picks wrong exception type when throwing function call -- Fixed bug [#18222][pear-18222] : Add __invoke method to PEAR standard -- Fixed bug [#18235][pear-18235] : Invalid error generation in Squiz.Commenting.FunctionCommentThrowTag -- Fixed bug [#18250][pear-18250] : --standard with relative path skips Standards' "implicit" sniffs -- Fixed bug [#18274][pear-18274] : Multi-line IF and function call indent rules conflict -- Fixed bug [#18282][pear-18282] : Squiz doesn't handle final keyword before function comments - - Thanks to [Dave Perrett][pear-recurser] for the patch -- Fixed bug [#18336][pear-18336] : Function isUnderscoreName gives PHP notices - -[pear-18196]: https://pear.php.net/bugs/bug.php?id=18196 -[pear-18200]: https://pear.php.net/bugs/bug.php?id=18200 -[pear-18204]: https://pear.php.net/bugs/bug.php?id=18204 -[pear-18222]: https://pear.php.net/bugs/bug.php?id=18222 -[pear-18235]: https://pear.php.net/bugs/bug.php?id=18235 -[pear-18250]: https://pear.php.net/bugs/bug.php?id=18250 -[pear-18274]: https://pear.php.net/bugs/bug.php?id=18274 -[pear-18282]: https://pear.php.net/bugs/bug.php?id=18282 -[pear-18336]: https://pear.php.net/bugs/bug.php?id=18336 - -## 1.3.0RC2 - 2011-01-14 - -### Changed -- You can now print multiple reports for each run and print each to the screen or a file (request [#12434][pear-12434]) - - Format is `--report-[report][=file]` (e.g., `--report-xml=out.xml`) - - Printing to screen is done by leaving `[file]` empty (e.g., `--report-xml`) - - Multiple reports can be specified in this way (e.g., `--report-summary --report-xml=out.xml`) - - The standard `--report` and `--report-file` command line arguments are unchanged -- Added `-d` command line argument to set `php.ini` settings while running (request [#17244][pear-17244]) - - Usage is: `phpcs -d memory_limit=32M -d ...` - - Thanks to [Ben Selby][@benmatselby] for the patch -- Added -p command line argument to show progress during a run - - Dot means pass, E means errors found, W means only warnings found and S means skipped file - - Particularly good for runs where you are checking more than 100 files - - Enable by default with --config-set show_progress 1 - - Will not print anything if you are already printing verbose output - - This has caused a big change in the way PHP_CodeSniffer processes files (API changes around processing) -- You can now add exclude rules for individual sniffs or error messages (request [#17903][pear-17903]) - - Only available when using a ruleset.xml file to specify rules - - Uses the same exclude-pattern tags as normal but allows them inside rule tags -- Using the -vvv option will now print a list of sniffs executed for each file and how long they took to process -- Added Generic ClosureLinterSniff to run Google's gjslint over your JS files -- The XML and CSV reports now include the severity of the error (request [#18165][pear-18165]) - - The Severity column in the CSV report has been renamed to Type, and a new Severity column added for this -- Fixed issue with Squiz FunctionCommentSniff reporting incorrect type hint when default value uses namespace - - Thanks to Anti Veeranna for the patch -- Generic FileLengthSniff now uses iconv_strlen to check line length if an encoding is specified (request [#14237][pear-14237]) -- Generic UnnecessaryStringConcatSniff now allows strings to be combined to form a PHP open or close tag -- Squiz SwitchDeclarationSniff no longer reports indentation errors for BREAK statements inside IF conditions -- Interactive mode now always prints the full error report (ignores command line) -- Improved regular expression detection in JavaScript files - - Added new T_TYPEOF token that can be used to target the typeof JS operator - - Fixes bug [#17611][pear-17611] : Regular expression tokens not recognised -- Squiz ScopeIndentSniff removed - - Squiz standard no longer requires additional indents between ob_* methods - - Also removed Squiz OutputBufferingIndentSniff that was checking the same thing -- PHP_CodeSniffer_File::getMemberProperties() performance improved significantly - - Improves performance of Squiz ValidVariableNameSniff significantly -- Squiz OperatorSpacingSniff performance improved significantly -- Squiz NonExecutableCodeSniff performance improved significantly - - Will throw duplicate errors in some cases now, but these should be rare -- MySource IncludeSystemSniff performance improved significantly -- MySource JoinStringsSniff no longer reports an error when using join() on a named JS array -- Warnings are now reported for each file when they cannot be opened instead of stopping the script - - Hide warnings with the -n command line argument - - Can override the warnings using the code Internal.DetectLineEndings - -### Fixed -- Fixed bug [#17693][pear-17693] : issue with pre-commit hook script with filenames that start with v -- Fixed bug [#17860][pear-17860] : isReference function fails with references in array - - Thanks to [Lincoln Maskey][pear-ljmaskey] for the patch -- Fixed bug [#17902][pear-17902] : Cannot run tests when tests are symlinked into tests dir - - Thanks to [Matt Button][@BRMatt] for the patch -- Fixed bug [#17928][pear-17928] : Improve error message for Generic_Sniffs_PHP_UpperCaseConstantSniff - - Thanks to [Stefano Kowalke][@Konafets] for the patch -- Fixed bug [#18039][pear-18039] : JS Tokenizer crash when ] is last character in file -- Fixed bug [#18047][pear-18047] : Incorrect handling of namespace aliases as constants - - Thanks to [Dmitri Medvedev][pear-dvino] for the patch -- Fixed bug [#18072][pear-18072] : Impossible to exclude path from processing when symlinked -- Fixed bug [#18073][pear-18073] : Squiz.PHP.NonExecutableCode fault -- Fixed bug [#18117][pear-18117] : PEAR coding standard: Method constructor not sniffed as a function -- Fixed bug [#18135][pear-18135] : Generic FunctionCallArgumentSpacingSniff reports function declaration errors -- Fixed bug [#18140][pear-18140] : Generic scope indent in exact mode: strange expected/found values for switch -- Fixed bug [#18145][pear-18145] : Sniffs are not loaded for custom ruleset file - - Thanks to [Scott McCammon][pear-mccammos] for the patch -- Fixed bug [#18152][pear-18152] : While and do-while with AbstractPatternSniff -- Fixed bug [#18191][pear-18191] : Squiz.PHP.LowercasePHPFunctions does not work with new Date() -- Fixed bug [#18193][pear-18193] : CodeSniffer doesn't reconize CR (\r) line endings - -[pear-12434]: https://pear.php.net/bugs/bug.php?id=12434 -[pear-14237]: https://pear.php.net/bugs/bug.php?id=14237 -[pear-17244]: https://pear.php.net/bugs/bug.php?id=17244 -[pear-17611]: https://pear.php.net/bugs/bug.php?id=17611 -[pear-17693]: https://pear.php.net/bugs/bug.php?id=17693 -[pear-17860]: https://pear.php.net/bugs/bug.php?id=17860 -[pear-17902]: https://pear.php.net/bugs/bug.php?id=17902 -[pear-17903]: https://pear.php.net/bugs/bug.php?id=17903 -[pear-17928]: https://pear.php.net/bugs/bug.php?id=17928 -[pear-18039]: https://pear.php.net/bugs/bug.php?id=18039 -[pear-18047]: https://pear.php.net/bugs/bug.php?id=18047 -[pear-18072]: https://pear.php.net/bugs/bug.php?id=18072 -[pear-18073]: https://pear.php.net/bugs/bug.php?id=18073 -[pear-18117]: https://pear.php.net/bugs/bug.php?id=18117 -[pear-18135]: https://pear.php.net/bugs/bug.php?id=18135 -[pear-18140]: https://pear.php.net/bugs/bug.php?id=18140 -[pear-18145]: https://pear.php.net/bugs/bug.php?id=18145 -[pear-18152]: https://pear.php.net/bugs/bug.php?id=18152 -[pear-18165]: https://pear.php.net/bugs/bug.php?id=18165 -[pear-18191]: https://pear.php.net/bugs/bug.php?id=18191 -[pear-18193]: https://pear.php.net/bugs/bug.php?id=18193 - -## 1.3.0RC1 - 2010-09-03 - -### Changed -- Added exclude pattern support to ruleset.xml file so you can specify ignore patterns in a standard (request [#17683][pear-17683]) - - Use new exclude-pattern tags to include the ignore rules into your ruleset.xml file - - See CodeSniffer/Standards/PHPCS/ruleset.xml for an example -- Added new --encoding command line argument to specify the encoding of the files being checked - - When set to utf-8, stops the XML-based reports from double-encoding - - When set to something else, helps the XML-based reports encode to utf-8 - - Default value is iso-8859-1 but can be changed with `--config-set encoding [value]` -- The report is no longer printed to screen when using the --report-file command line option (request [#17467][pear-17467]) - - If you want to print it to screen as well, use the -v command line argument -- The SVN and GIT blame reports now also show percentage of reported errors per author (request [#17606][pear-17606]) - - Thanks to [Ben Selby][@benmatselby] for the patch -- Updated the SVN pre-commit hook to work with the new severity levels feature -- Generic SubversionPropertiesSniff now allows properties to have NULL values (request [#17682][pear-17682]) - - A null value indicates that the property should exist but the value should not be checked -- Generic UpperCaseConstantName Sniff now longer complains about the PHPUnit_MAIN_METHOD constant (request [#17798][pear-17798]) -- Squiz FileComment sniff now checks JS files as well as PHP files -- Squiz FunctionCommentSniff now supports namespaces in type hints - -### Fixed -- Fixed a problem in Squiz OutputBufferingIndentSniff where block comments were reported as not indented -- Fixed bug [#17092][pear-17092] : Problems with utf8_encode and htmlspecialchars with non-ascii chars - - Use the new --encoding=utf-8 command line argument if your files are utf-8 encoded -- Fixed bug [#17629][pear-17629] : PHP_CodeSniffer_Tokens::$booleanOperators missing T_LOGICAL_XOR - - Thanks to [Matthew Turland][@elazar] for the patch -- Fixed bug [#17699][pear-17699] : Fatal error generating code coverage with PHPUnit 5.3.0RC1 -- Fixed bug [#17718][pear-17718] : Namespace 'use' statement: used global class name is recognized as constant -- Fixed bug [#17734][pear-17734] : Generic SubversionPropertiesSniff complains on non SVN files -- Fixed bug [#17742][pear-17742] : EmbeddedPhpSniff reacts negatively to file without closing PHP tag -- Fixed bug [#17823][pear-17823] : Notice: Please no longer include `PHPUnit/Framework.php` - -[pear-17092]: https://pear.php.net/bugs/bug.php?id=17092 -[pear-17467]: https://pear.php.net/bugs/bug.php?id=17467 -[pear-17606]: https://pear.php.net/bugs/bug.php?id=17606 -[pear-17629]: https://pear.php.net/bugs/bug.php?id=17629 -[pear-17682]: https://pear.php.net/bugs/bug.php?id=17682 -[pear-17683]: https://pear.php.net/bugs/bug.php?id=17683 -[pear-17699]: https://pear.php.net/bugs/bug.php?id=17699 -[pear-17718]: https://pear.php.net/bugs/bug.php?id=17718 -[pear-17734]: https://pear.php.net/bugs/bug.php?id=17734 -[pear-17742]: https://pear.php.net/bugs/bug.php?id=17742 -[pear-17798]: https://pear.php.net/bugs/bug.php?id=17798 -[pear-17823]: https://pear.php.net/bugs/bug.php?id=17823 - -## 1.3.0a1 - 2010-07-15 - -### Changed -- All `CodingStandard.php` files have been replaced by `ruleset.xml` files - - Custom standards will need to be converted over to this new format to continue working -- You can specify a path to your own custom ruleset.xml file by using the --standard command line arg - - e.g., phpcs --standard=/path/to/my/ruleset.xml -- Added a new report type --report=gitblame to show how many errors and warnings were committed by each author - - Has the same functionality as the svnblame report - - Thanks to [Ben Selby][@benmatselby] for the patch -- A new token type T_DOLLAR has been added to allow you to sniff for variable variables (feature request [#17095][pear-17095]) - - Thanks to [Ian Young][pear-youngian] for the patch -- JS tokenizer now supports T_POWER (^) and T_MOD_EQUAL (%=) tokens (feature request [#17441][pear-17441]) -- If you have PHP_Timer installed, you'll now get a time/memory summary at the end of a script run - - Only happens when printing reports that are designed to be read on the command line -- Added Generic DeprecatedFunctionsSniff to warn about the use of deprecated functions (feature request [#16694][pear-16694]) - - Thanks to [Sebastian Bergmann][@sebastianbergmann] for the patch -- Added Squiz LogicalOperatorSniff to ensure that logical operators are surrounded by single spaces -- Added MySource ChannelExceptionSniff to ensure action files only throw ChannelException -- Added new method getClassProperties() for sniffs to use to determine if a class is abstract and/or final - - Thanks to [Christian Kaps][@akkie] for the patch -- Generic UpperCaseConstantSniff no longer throws errors about namespaces - - Thanks to [Christian Kaps][@akkie] for the patch -- Squiz OperatorBracketSniff now correctly checks value assignments in arrays -- Squiz LongConditionClosingCommentSniff now requires a comment for long CASE statements that use curly braces -- Squiz LongConditionClosingCommentSniff now requires an exact comment match on the brace -- MySource IncludeSystemSniff now ignores DOMDocument usage -- MySource IncludeSystemSniff no longer requires inclusion of systems that are being implemented -- Removed found and expected messages from Squiz ConcatenationSpacingSniff because they were messy and not helpful - -### Fixed -- Fixed a problem where Generic CodeAnalysisSniff could show warnings if checking multi-line strings -- Fixed error messages in Squiz ArrayDeclarationSniff reporting incorrect number of found and expected spaces -- Fixed bug [#17048][pear-17048] : False positive in Squiz_WhiteSpace_ScopeKeywordSpacingSniff -- Fixed bug [#17054][pear-17054] : phpcs more strict than PEAR CS regarding function parameter spacing -- Fixed bug [#17096][pear-17096] : Notice: Undefined index: `scope_condition` in `ScopeClosingBraceSniff.php` - - Moved PEAR.Functions.FunctionCallArgumentSpacing to Generic.Functions.FunctionCallArgumentSpacing -- Fixed bug [#17144][pear-17144] : Deprecated: Function eregi() is deprecated -- Fixed bug [#17236][pear-17236] : PHP Warning due to token_get_all() in DoubleQuoteUsageSniff -- Fixed bug [#17243][pear-17243] : Alternate Switch Syntax causes endless loop of Notices in SwitchDeclaration -- Fixed bug [#17313][pear-17313] : Bug with switch case structure -- Fixed bug [#17331][pear-17331] : Possible parse error: interfaces may not include member vars -- Fixed bug [#17337][pear-17337] : CSS tokenizer fails on quotes urls -- Fixed bug [#17420][pear-17420] : Uncaught exception when comment before function brace -- Fixed bug [#17503][pear-17503] : closures formatting is not supported - -[pear-16694]: https://pear.php.net/bugs/bug.php?id=16694 -[pear-17048]: https://pear.php.net/bugs/bug.php?id=17048 -[pear-17054]: https://pear.php.net/bugs/bug.php?id=17054 -[pear-17095]: https://pear.php.net/bugs/bug.php?id=17095 -[pear-17096]: https://pear.php.net/bugs/bug.php?id=17096 -[pear-17144]: https://pear.php.net/bugs/bug.php?id=17144 -[pear-17236]: https://pear.php.net/bugs/bug.php?id=17236 -[pear-17243]: https://pear.php.net/bugs/bug.php?id=17243 -[pear-17313]: https://pear.php.net/bugs/bug.php?id=17313 -[pear-17331]: https://pear.php.net/bugs/bug.php?id=17331 -[pear-17337]: https://pear.php.net/bugs/bug.php?id=17337 -[pear-17420]: https://pear.php.net/bugs/bug.php?id=17420 -[pear-17441]: https://pear.php.net/bugs/bug.php?id=17441 -[pear-17503]: https://pear.php.net/bugs/bug.php?id=17503 - -## 1.2.2 - 2010-01-27 - -### Changed -- The core PHP_CodeSniffer_File methods now understand the concept of closures (feature request [#16866][pear-16866]) - - Thanks to [Christian Kaps][@akkie] for the sample code -- Sniffs can now specify violation codes for each error and warning they add - - Future versions will allow you to override messages and severities using these codes - - Specifying a code is optional, but will be required if you wish to support overriding -- All reports have been broken into separate classes - - Command line usage and report output remains the same - - Thanks to Gabriele Santini for the patch -- Added an interactive mode that can be enabled using the -a command line argument - - Scans files and stops when it finds a file with errors - - Waits for user input to recheck the file (hopefully you fixed the errors) or skip the file - - Useful for very large code bases where full rechecks take a while -- The reports now show the correct number of errors and warnings found -- The isCamelCaps method now allows numbers in class names -- The JS tokenizer now correctly identifies boolean and bitwise AND and OR tokens -- The JS tokenizer now correctly identifies regular expressions used in conditions -- PEAR ValidFunctionNameSniff now ignores closures -- Squiz standard now uses the PEAR setting of 85 chars for LineLengthSniff -- Squiz ControlStructureSpacingSniff now ensure there are no spaces around parentheses -- Squiz LongConditionClosingCommentSniff now checks for comments at the end of try/catch statements -- Squiz LongConditionClosingCommentSniff now checks validity of comments for short structures if they exist -- Squiz IncrementDecrementUsageSniff now has better checking to ensure it only looks at simple variable assignments -- Squiz PostStatementCommentSniff no longer throws errors for end function comments -- Squiz InlineCommentSniff no longer throws errors for end function comments -- Squiz OperatorBracketSniff now allows simple arithmetic operations in SWITCH conditions -- Squiz ValidFunctionNameSniff now ignores closures -- Squiz MethodScopeSniff now ignores closures -- Squiz ClosingDeclarationCommentSniff now ignores closures -- Squiz GlobalFunctionSniff now ignores closures -- Squiz DisallowComparisonAssignmentSniff now ignores the assigning of arrays -- Squiz DisallowObjectStringIndexSniff now allows indexes that contain dots and reserved words -- Squiz standard now throws nesting level and cyclomatic complexity errors at much higher levels -- Squiz CommentedOutCodeSniff now ignores common comment framing characters -- Squiz ClassCommentSniff now ensures the open comment tag is the only content on the first line -- Squiz FileCommentSniff now ensures the open comment tag is the only content on the first line -- Squiz FunctionCommentSniff now ensures the open comment tag is the only content on the first line -- Squiz VariableCommentSniff now ensures the open comment tag is the only content on the first line -- Squiz NonExecutableCodeSniff now warns about empty return statements that are not required -- Removed ForbiddenStylesSniff from Squiz standard - - It is now in the MySource standard as BrowserSpecificStylesSniff - - New BrowserSpecificStylesSniff ignores files with browser-specific suffixes -- MySource IncludeSystemSniff no longer throws errors when extending the Exception class -- MySource IncludeSystemSniff no longer throws errors for the abstract widget class -- MySource IncludeSystemSniff and UnusedSystemSniff now allow includes inside IF statements -- MySource IncludeSystemSniff no longer throws errors for included widgets inside methods -- MySource GetRequestDataSniff now throws errors for using $_FILES -- MySource CreateWidgetTypeCallbackSniff now allows return statements in nested functions -- MySource DisallowSelfActionsSniff now ignores abstract classes - -### Fixed -- Fixed a problem with the SVN pre-commit hook for PHP versions without vertical whitespace regex support -- Fixed bug [#16740][pear-16740] : False positives for heredoc strings and unused parameter sniff -- Fixed bug [#16794][pear-16794] : ValidLogicalOperatorsSniff doesn't report operators not in lowercase -- Fixed bug [#16804][pear-16804] : Report filename is shortened too much -- Fixed bug [#16821][pear-16821] : Bug in Squiz_Sniffs_WhiteSpace_OperatorSpacingSniff - - Thanks to [Jaroslav Hanslík][@kukulich] for the patch -- Fixed bug [#16836][pear-16836] : Notice raised when using semicolon to open case -- Fixed bug [#16855][pear-16855] : Generic standard sniffs incorrectly for define() method -- Fixed bug [#16865][pear-16865] : Two bugs in Squiz_Sniffs_WhiteSpace_OperatorSpacingSniff - - Thanks to [Jaroslav Hanslík][@kukulich] for the patch -- Fixed bug [#16902][pear-16902] : Inline If Declaration bug -- Fixed bug [#16960][pear-16960] : False positive for late static binding in Squiz/ScopeKeywordSpacingSniff - - Thanks to [Jakub Tománek][pear-thezero] for the patch -- Fixed bug [#16976][pear-16976] : The phpcs attempts to process symbolic links that don't resolve to files -- Fixed bug [#17017][pear-17017] : Including one file in the files sniffed alters errors reported for another file - -[pear-16740]: https://pear.php.net/bugs/bug.php?id=16740 -[pear-16794]: https://pear.php.net/bugs/bug.php?id=16794 -[pear-16804]: https://pear.php.net/bugs/bug.php?id=16804 -[pear-16821]: https://pear.php.net/bugs/bug.php?id=16821 -[pear-16836]: https://pear.php.net/bugs/bug.php?id=16836 -[pear-16855]: https://pear.php.net/bugs/bug.php?id=16855 -[pear-16865]: https://pear.php.net/bugs/bug.php?id=16865 -[pear-16866]: https://pear.php.net/bugs/bug.php?id=16866 -[pear-16902]: https://pear.php.net/bugs/bug.php?id=16902 -[pear-16960]: https://pear.php.net/bugs/bug.php?id=16960 -[pear-16976]: https://pear.php.net/bugs/bug.php?id=16976 -[pear-17017]: https://pear.php.net/bugs/bug.php?id=17017 - -## 1.2.1 - 2009-11-17 - -### Changed -- Added a new report type --report=svnblame to show how many errors and warnings were committed by each author - - Also shows the percentage of their code that are errors and warnings - - Requires you to have the SVN command in your path - - Make sure SVN is storing usernames and passwords (if required) or you will need to enter them for each file - - You can also use the -s command line argument to see the different types of errors authors are committing - - You can use the -v command line argument to see all authors, even if they have no errors or warnings -- Added a new command line argument --report-width to allow you to set the column width of screen reports - - Reports won't accept values less than 70 or else they get too small - - Can also be set via a config var: phpcs --config-set report_width 100 -- You can now get PHP_CodeSniffer to ignore a whole file by adding @codingStandardsIgnoreFile in the content - - If you put it in the first two lines the file won't even be tokenized, so it will be much quicker -- Reports now print their file lists in alphabetical order -- PEAR FunctionDeclarationSniff now reports error for incorrect closing bracket placement in multi-line definitions -- Added Generic CallTimePassByReferenceSniff to prohibit the passing of variables into functions by reference - - Thanks to Florian Grandel for the contribution -- Added Squiz DisallowComparisonAssignmentSniff to ban the assignment of comparison values to a variable -- Added Squiz DuplicateStyleDefinitionSniff to check for duplicate CSS styles in a single class block -- Squiz ArrayDeclarationSniff no longer checks the case of array indexes because that is not its job -- Squiz PostStatementCommentSniff now allows end comments for class member functions -- Squiz InlineCommentSniff now supports the checking of JS files -- MySource CreateWidgetTypeCallbackSniff now allows the callback to be passed to another function -- MySource CreateWidgetTypeCallbackSniff now correctly ignores callbacks used inside conditions -- Generic MultipleStatementAlignmentSniff now enforces a single space before equals sign if max padding is reached -- Fixed a problem in the JS tokenizer where regular expressions containing \// were not converted correctly -- Fixed a problem tokenizing CSS files where multiple ID targets on a line would look like comments -- Fixed a problem tokenizing CSS files where class names containing a colon looked like style definitions -- Fixed a problem tokenizing CSS files when style statements had empty url() calls -- Fixed a problem tokenizing CSS colours with the letter E in first half of the code -- Squiz ColonSpacingSniff now ensures it is only checking style definitions in CSS files and not class names -- Squiz DisallowComparisonAssignmentSniff no longer reports errors when assigning the return value of a function -- CSS tokenizer now correctly supports multi-line comments -- When only the case of var names differ for function comments, the error now indicates the case is different - -### Fixed -- Fixed an issue with Generic UnnecessaryStringConcatSniff where it incorrectly suggested removing a concat -- Fixed bug [#16530][pear-16530] : ScopeIndentSniff reports false positive -- Fixed bug [#16533][pear-16533] : Duplicate errors and warnings -- Fixed bug [#16563][pear-16563] : Check file extensions problem in phpcs-svn-pre-commit - - Thanks to [Kaijung Chen][pear-et3w503] for the patch -- Fixed bug [#16592][pear-16592] : Object operator indentation incorrect when first operator is on a new line -- Fixed bug [#16641][pear-16641] : Notice output -- Fixed bug [#16682][pear-16682] : Squiz_Sniffs_Strings_DoubleQuoteUsageSniff reports string "\0" as invalid -- Fixed bug [#16683][pear-16683] : Typing error in PHP_CodeSniffer_CommentParser_AbstractParser -- Fixed bug [#16684][pear-16684] : Bug in Squiz_Sniffs_PHP_NonExecutableCodeSniff -- Fixed bug [#16692][pear-16692] : Spaces in paths in Squiz_Sniffs_Debug_JavaScriptLintSniff - - Thanks to [Jaroslav Hanslík][@kukulich] for the patch -- Fixed bug [#16696][pear-16696] : Spelling error in MultiLineConditionSniff -- Fixed bug [#16697][pear-16697] : MultiLineConditionSniff incorrect result with inline IF -- Fixed bug [#16698][pear-16698] : Notice in JavaScript Tokenizer -- Fixed bug [#16736][pear-16736] : Multi-files sniffs aren't processed when FILE is a single directory - - Thanks to [Alexey Shein][pear-conf] for the patch -- Fixed bug [#16792][pear-16792] : Bug in Generic_Sniffs_PHP_ForbiddenFunctionsSniff - -[pear-16530]: https://pear.php.net/bugs/bug.php?id=16530 -[pear-16533]: https://pear.php.net/bugs/bug.php?id=16533 -[pear-16563]: https://pear.php.net/bugs/bug.php?id=16563 -[pear-16592]: https://pear.php.net/bugs/bug.php?id=16592 -[pear-16641]: https://pear.php.net/bugs/bug.php?id=16641 -[pear-16682]: https://pear.php.net/bugs/bug.php?id=16682 -[pear-16683]: https://pear.php.net/bugs/bug.php?id=16683 -[pear-16684]: https://pear.php.net/bugs/bug.php?id=16684 -[pear-16692]: https://pear.php.net/bugs/bug.php?id=16692 -[pear-16696]: https://pear.php.net/bugs/bug.php?id=16696 -[pear-16697]: https://pear.php.net/bugs/bug.php?id=16697 -[pear-16698]: https://pear.php.net/bugs/bug.php?id=16698 -[pear-16736]: https://pear.php.net/bugs/bug.php?id=16736 -[pear-16792]: https://pear.php.net/bugs/bug.php?id=16792 - -## 1.2.0 - 2009-08-17 - -### Changed -- Installed standards are now favoured over custom standards when using the cmd line arg with relative paths -- Unit tests now use a lot less memory while running -- Squiz standard now uses Generic EmptyStatementSniff but throws errors instead of warnings -- Squiz standard now uses Generic UnusedFunctionParameterSniff -- Removed unused ValidArrayIndexNameSniff from the Squiz standard - -### Fixed -- Fixed bug [#16424][pear-16424] : SubversionPropertiesSniff print PHP Warning -- Fixed bug [#16450][pear-16450] : Constant `PHP_CODESNIFFER_VERBOSITY` already defined (unit tests) -- Fixed bug [#16453][pear-16453] : function declaration long line splitted error -- Fixed bug [#16482][pear-16482] : phpcs-svn-pre-commit ignores extensions parameter - -[pear-16424]: https://pear.php.net/bugs/bug.php?id=16424 -[pear-16450]: https://pear.php.net/bugs/bug.php?id=16450 -[pear-16453]: https://pear.php.net/bugs/bug.php?id=16453 -[pear-16482]: https://pear.php.net/bugs/bug.php?id=16482 - -## 1.2.0RC3 - 2009-07-07 - -### Changed -- You can now use @codingStandardsIgnoreStart and @...End comments to suppress messages (feature request [#14002][pear-14002]) -- A warning is now included for files without any code when short_open_tag is set to Off (feature request [#12952][pear-12952]) -- You can now use relative paths to your custom standards with the --standard cmd line arg (feature request [#14967][pear-14967]) -- You can now override magic methods and functions in PEAR ValidFunctionNameSniff (feature request [#15830][pear-15830]) -- MySource IncludeSystemSniff now recognises widget action classes -- MySource IncludeSystemSniff now knows about unit test classes and changes rules accordingly - -[pear-12952]: https://pear.php.net/bugs/bug.php?id=12952 -[pear-14002]: https://pear.php.net/bugs/bug.php?id=14002 -[pear-14967]: https://pear.php.net/bugs/bug.php?id=14967 -[pear-15830]: https://pear.php.net/bugs/bug.php?id=15830 - -## 1.2.0RC2 - 2009-05-25 - -### Changed -- Test suite can now be run using the full path to `AllTests.php` (feature request [#16179][pear-16179]) - -### Fixed -- Fixed bug [#15980][pear-15980] : PHP_CodeSniffer change PHP current directory - - Thanks to [Dolly Aswin Harahap][pear-dollyaswin] for the patch -- Fixed bug [#16001][pear-16001] : Notice triggered -- Fixed bug [#16054][pear-16054] : phpcs-svn-pre-commit not showing any errors -- Fixed bug [#16071][pear-16071] : Fatal error: Uncaught PHP_CodeSniffer_Exception -- Fixed bug [#16170][pear-16170] : Undefined Offset -1 in `MultiLineConditionSniff.php` on line 68 -- Fixed bug [#16175][pear-16175] : Bug in Squiz-IncrementDecrementUsageSniff - -[pear-15980]: https://pear.php.net/bugs/bug.php?id=15980 -[pear-16001]: https://pear.php.net/bugs/bug.php?id=16001 -[pear-16054]: https://pear.php.net/bugs/bug.php?id=16054 -[pear-16071]: https://pear.php.net/bugs/bug.php?id=16071 -[pear-16170]: https://pear.php.net/bugs/bug.php?id=16170 -[pear-16175]: https://pear.php.net/bugs/bug.php?id=16175 -[pear-16179]: https://pear.php.net/bugs/bug.php?id=16179 - -## 1.2.0RC1 - 2009-03-09 - -### Changed -- Reports that are output to a file now include a trailing newline at the end of the file -- Fixed sniff names not shown in -vvv token processing output -- Added Generic SubversionPropertiesSniff to check that specific svn props are set for files - - Thanks to Jack Bates for the contribution -- The PHP version check can now be overridden in classes that extend PEAR FileCommentSniff - - Thanks to [Helgi Þormar Þorbjörnsson][@helgi] for the suggestion -- Added Generic ConstructorNameSniff to check for PHP4 constructor name usage - - Thanks to Leif Wickland for the contribution -- Squiz standard now supports multi-line function and condition sniffs from PEAR standard -- Squiz standard now uses Generic ConstructorNameSniff -- Added MySource GetRequestDataSniff to ensure REQUEST, GET and POST are not accessed directly -- Squiz OperatorBracketSniff now allows square brackets in simple unbracketed operations - -### Fixed -- Fixed the incorrect tokenizing of multi-line block comments in CSS files -- Fixed bug [#15383][pear-15383] : Uncaught PHP_CodeSniffer_Exception -- Fixed bug [#15408][pear-15408] : An unexpected exception has been caught: Undefined offset: 2 -- Fixed bug [#15519][pear-15519] : Uncaught PHP_CodeSniffer_Exception -- Fixed bug [#15624][pear-15624] : Pre-commit hook fails with PHP errors -- Fixed bug [#15661][pear-15661] : Uncaught PHP_CodeSniffer_Exception -- Fixed bug [#15722][pear-15722] : "declare(encoding = 'utf-8');" leads to "Missing file doc comment" -- Fixed bug [#15910][pear-15910] : Object operator indention not calculated correctly - -[pear-15383]: https://pear.php.net/bugs/bug.php?id=15383 -[pear-15408]: https://pear.php.net/bugs/bug.php?id=15408 -[pear-15519]: https://pear.php.net/bugs/bug.php?id=15519 -[pear-15624]: https://pear.php.net/bugs/bug.php?id=15624 -[pear-15661]: https://pear.php.net/bugs/bug.php?id=15661 -[pear-15722]: https://pear.php.net/bugs/bug.php?id=15722 -[pear-15910]: https://pear.php.net/bugs/bug.php?id=15910 - -## 1.2.0a1 - 2008-12-18 - -### Changed -- PHP_CodeSniffer now has a CSS tokenizer for checking CSS files -- Added support for a new multi-file sniff that sniffs all processed files at once -- Added new output format --report=emacs to output errors using the emacs standard compile output format - - Thanks to Len Trigg for the contribution -- Reports can now be written to a file using the --report-file command line argument (feature request [#14953][pear-14953]) - - The report is also written to screen when using this argument -- The CheckStyle, CSV and XML reports now include a source for each error and warning (feature request [#13242][pear-13242]) - - A new report type --report=source can be used to show you the most common errors in your files -- Added new command line argument -s to show error sources in all reports -- Added new command line argument --sniffs to specify a list of sniffs to restrict checking to - - Uses the sniff source codes that are optionally displayed in reports -- Changed the max width of error lines from 80 to 79 chars to stop blank lines in the default windows cmd window -- PHP_CodeSniffer now has a token for an asperand (@ symbol) so sniffs can listen for them - - Thanks to Andy Brockhurst for the patch -- Added Generic DuplicateClassNameSniff that will warn if the same class name is used in multiple files - - Not currently used by any standard; more of a multi-file sniff sample than anything useful -- Added Generic NoSilencedErrorsSniff that warns if PHP errors are being silenced using the @ symbol - - Thanks to Andy Brockhurst for the contribution -- Added Generic UnnecessaryStringConcatSniff that checks for two strings being concatenated -- Added PEAR FunctionDeclarationSniff to enforce the new multi-line function declaration PEAR standard -- Added PEAR MultiLineAssignmentSniff to enforce the correct indentation of multi-line assignments -- Added PEAR MultiLineConditionSniff to enforce the new multi-line condition PEAR standard -- Added PEAR ObjectOperatorIndentSniff to enforce the new chained function call PEAR standard -- Added MySource DisallowSelfActionSniff to ban the use of self::method() calls in Action classes -- Added MySource DebugCodeSniff to ban the use of Debug::method() calls -- Added MySource CreateWidgetTypeCallback sniff to check callback usage in widget type create methods -- Added Squiz DisallowObjectStringIndexSniff that forces object dot notation in JavaScript files - - Thanks to [Sertan Danis][@sertand] for the contribution -- Added Squiz DiscouragedFunctionsSniff to warn when using debug functions -- Added Squiz PropertyLabelSniff to check whitespace around colons in JS property and label declarations -- Added Squiz DuplicatePropertySniff to check for duplicate property names in JS classes -- Added Squiz ColonSpacingSniff to check for spacing around colons in CSS style definitions -- Added Squiz SemicolonSpacingSniff to check for spacing around semicolons in CSS style definitions -- Added Squiz IndentationSniff to check for correct indentation of CSS files -- Added Squiz ColourDefinitionSniff to check that CSS colours are defined in uppercase and using shorthand -- Added Squiz EmptyStyleDefinitionSniff to check for CSS style definitions without content -- Added Squiz EmptyClassDefinitionSniff to check for CSS class definitions without content -- Added Squiz ClassDefinitionOpeningBraceSpaceSniff to check for spaces around opening brace of CSS class definitions -- Added Squiz ClassDefinitionClosingBraceSpaceSniff to check for a single blank line after CSS class definitions -- Added Squiz ClassDefinitionNameSpacingSniff to check for a blank lines inside CSS class definition names -- Added Squiz DisallowMultipleStyleDefinitionsSniff to check for multiple style definitions on a single line -- Added Squiz DuplicateClassDefinitionSniff to check for duplicate CSS class blocks that can be merged -- Added Squiz ForbiddenStylesSniff to check for usage of browser specific styles -- Added Squiz OpacitySniff to check for incorrect opacity values in CSS -- Added Squiz LowercaseStyleDefinitionSniff to check for styles that are not defined in lowercase -- Added Squiz MissingColonSniff to check for style definitions where the colon has been forgotten -- Added Squiz MultiLineFunctionDeclarationSniff to check that multi-line declarations contain one param per line -- Added Squiz JSLintSniff to check for JS errors using the jslint.js script through Rhino - - Set jslint path using phpcs --config-set jslint_path /path/to/jslint.js - - Set rhino path using phpcs --config-set rhino_path /path/to/rhino -- Added Generic TodoSniff that warns about comments that contain the word TODO -- Removed MultipleStatementAlignmentSniff from the PEAR standard as alignment is now optional -- Generic ForbiddenFunctionsSniff now has protected member var to specify if it should use errors or warnings -- Generic MultipleStatementAlignmentSniff now has correct error message if assignment is on a new line -- Generic MultipleStatementAlignmentSniff now has protected member var to allow it to ignore multi-line assignments -- Generic LineEndingsSniff now supports checking of JS files -- Generic LineEndingsSniff now supports checking of CSS files -- Generic DisallowTabIndentSniff now supports checking of CSS files -- Squiz DoubleQuoteUsageSniff now bans the use of variables in double quoted strings in favour of concatenation -- Squiz SuperfluousWhitespaceSniff now supports checking of JS files -- Squiz SuperfluousWhitespaceSniff now supports checking of CSS files -- Squiz DisallowInlineIfSniff now supports checking of JS files -- Squiz SemicolonSpacingSniff now supports checking of JS files -- Squiz PostStatementCommentSniff now supports checking of JS files -- Squiz FunctionOpeningBraceSpacingSniff now supports checking of JS files -- Squiz FunctionClosingBraceSpacingSniff now supports checking of JS files - - Empty JS functions must have their opening and closing braces next to each other -- Squiz ControlStructureSpacingSniff now supports checking of JS files -- Squiz LongConditionClosingCommentSniff now supports checking of JS files -- Squiz OperatorSpacingSniff now supports checking of JS files -- Squiz SwitchDeclarationSniff now supports checking of JS files -- Squiz CommentedOutCodeSniff now supports checking of CSS files -- Squiz DisallowSizeFunctionsInLoopsSniff now supports checking of JS files for the use of object.length -- Squiz DisallowSizeFunctionsInLoopsSniff no longer complains about size functions outside of the FOR condition -- Squiz ControlStructureSpacingSniff now bans blank lines at the end of a control structure -- Squiz ForLoopDeclarationSniff no longer throws errors for JS FOR loops without semicolons -- Squiz MultipleStatementAlignmentSniff no longer throws errors if a statement would take more than 8 spaces to align -- Squiz standard now uses Generic TodoSniff -- Squiz standard now uses Generic UnnecessaryStringConcatSniff -- Squiz standard now uses PEAR MultiLineAssignmentSniff -- Squiz standard now uses PEAR MultiLineConditionSniff -- Zend standard now uses OpeningFunctionBraceBsdAllmanSniff (feature request [#14647][pear-14647]) -- MySource JoinStringsSniff now bans the use of inline array joins and suggests the + operator -- Fixed incorrect errors that can be generated from abstract scope sniffs when moving to a new file -- Core tokenizer now matches orphaned curly braces in the same way as square brackets -- Whitespace tokens at the end of JS files are now added to the token stack -- JavaScript tokenizer now identifies properties and labels as new token types -- JavaScript tokenizer now identifies object definitions as a new token type and matches curly braces for them -- JavaScript tokenizer now identifies DIV_EQUAL and MUL_EQUAL tokens -- Improved regular expression detection in the JavaScript tokenizer -- Improve AbstractPatternSniff support so it can listen for any token type, not just weighted tokens - -### Fixed -- Fixed Squiz DoubleQuoteUsageSniff so it works correctly with short_open_tag=Off -- Fixed bug [#14409][pear-14409] : Output of warnings to log file -- Fixed bug [#14520][pear-14520] : Notice: Undefined offset: 1 in `CodeSniffer/File.php` on line -- Fixed bug [#14637][pear-14637] : Call to processUnknownArguments() misses second parameter $pos - - Thanks to [Peter Buri][pear-burci] for the patch -- Fixed bug [#14889][pear-14889] : Lack of clarity: licence or license -- Fixed bug [#15008][pear-15008] : Nested Parentheses in Control Structure Sniffs -- Fixed bug [#15091][pear-15091] : pre-commit hook attempts to sniff folders - - Thanks to [Bruce Weirdan][pear-weirdan] for the patch -- Fixed bug [#15124][pear-15124] : `AbstractParser.php` uses deprecated `split()` function - - Thanks to [Sebastian Bergmann][@sebastianbergmann] for the patch -- Fixed bug [#15188][pear-15188] : PHPCS vs HEREDOC strings -- Fixed bug [#15231][pear-15231] : Notice: Uninitialized string offset: 0 in `FileCommentSniff.php` on line 555 -- Fixed bug [#15336][pear-15336] : Notice: Undefined offset: 2 in `CodeSniffer/File.php` on line - -[pear-13242]: https://pear.php.net/bugs/bug.php?id=13242 -[pear-14409]: https://pear.php.net/bugs/bug.php?id=14409 -[pear-14520]: https://pear.php.net/bugs/bug.php?id=14520 -[pear-14637]: https://pear.php.net/bugs/bug.php?id=14637 -[pear-14647]: https://pear.php.net/bugs/bug.php?id=14647 -[pear-14889]: https://pear.php.net/bugs/bug.php?id=14889 -[pear-14953]: https://pear.php.net/bugs/bug.php?id=14953 -[pear-15008]: https://pear.php.net/bugs/bug.php?id=15008 -[pear-15091]: https://pear.php.net/bugs/bug.php?id=15091 -[pear-15124]: https://pear.php.net/bugs/bug.php?id=15124 -[pear-15188]: https://pear.php.net/bugs/bug.php?id=15188 -[pear-15231]: https://pear.php.net/bugs/bug.php?id=15231 -[pear-15336]: https://pear.php.net/bugs/bug.php?id=15336 - -## 1.1.0 - 2008-07-14 - -### Changed -- PEAR FileCommentSniff now allows tag orders to be overridden in child classes - - Thanks to Jeff Hodsdon for the patch -- Added Generic DisallowMultipleStatementsSniff to ensure there is only one statement per line -- Squiz standard now uses DisallowMultipleStatementsSniff - -### Fixed -- Fixed error in Zend ValidVariableNameSniff when checking vars in form: $class->{$var} -- Fixed bug [#14077][pear-14077] : Fatal error: Uncaught PHP_CodeSniffer_Exception: $stackPtr is not a class member -- Fixed bug [#14168][pear-14168] : Global Function -> Static Method and __autoload() -- Fixed bug [#14238][pear-14238] : Line length not checked at last line of a file -- Fixed bug [#14249][pear-14249] : wrong detection of scope_opener -- Fixed bug [#14250][pear-14250] : ArrayDeclarationSniff emit warnings at malformed array -- Fixed bug [#14251][pear-14251] : --extensions option doesn't work - -## 1.1.0RC3 - 2008-07-03 - -### Changed -- PEAR FileCommentSniff now allows tag orders to be overridden in child classes - - Thanks to Jeff Hodsdon for the patch -- Added Generic DisallowMultipleStatementsSniff to ensure there is only one statement per line -- Squiz standard now uses DisallowMultipleStatementsSniff - -### Fixed -- Fixed error in Zend ValidVariableNameSniff when checking vars in form: $class->{$var} -- Fixed bug [#14077][pear-14077] : Fatal error: Uncaught PHP_CodeSniffer_Exception: $stackPtr is not a class member -- Fixed bug [#14168][pear-14168] : Global Function -> Static Method and __autoload() -- Fixed bug [#14238][pear-14238] : Line length not checked at last line of a file -- Fixed bug [#14249][pear-14249] : wrong detection of scope_opener -- Fixed bug [#14250][pear-14250] : ArrayDeclarationSniff emit warnings at malformed array -- Fixed bug [#14251][pear-14251] : --extensions option doesn't work - -[pear-14077]: https://pear.php.net/bugs/bug.php?id=14077 -[pear-14168]: https://pear.php.net/bugs/bug.php?id=14168 -[pear-14238]: https://pear.php.net/bugs/bug.php?id=14238 -[pear-14249]: https://pear.php.net/bugs/bug.php?id=14249 -[pear-14250]: https://pear.php.net/bugs/bug.php?id=14250 -[pear-14251]: https://pear.php.net/bugs/bug.php?id=14251 - -## 1.1.0RC2 - 2008-06-13 - -### Changed -- Permission denied errors now stop script execution but still display current errors (feature request [#14076][pear-14076]) -- Added Squiz ValidArrayIndexNameSniff to ensure array indexes do not use camel case -- Squiz ArrayDeclarationSniff now ensures arrays are not declared with camel case index values -- PEAR ValidVariableNameSniff now alerts about a possible parse error for member vars inside an interface - -### Fixed -- Fixed bug [#13921][pear-13921] : js parsing fails for comments on last line of file -- Fixed bug [#13922][pear-13922] : crash in case of malformed (but tokenized) PHP file - - PEAR and Squiz ClassDeclarationSniff now throw warnings for possible parse errors - - Squiz ValidClassNameSniff now throws warning for possible parse errors - - Squiz ClosingDeclarationCommentSniff now throws additional warnings for parse errors - -[pear-13921]: https://pear.php.net/bugs/bug.php?id=13921 -[pear-13922]: https://pear.php.net/bugs/bug.php?id=13922 -[pear-14076]: https://pear.php.net/bugs/bug.php?id=14076 - -## 1.1.0RC1 - 2008-05-13 - -### Changed -- Added support for multiple tokenizers so PHP_CodeSniffer can check more than just PHP files - - PHP_CodeSniffer now has a JS tokenizer for checking JavaScript files - - Sniffs need to be updated to work with additional tokenizers, or new sniffs written for them -- phpcs now exits with status 2 if the tokenizer extension has been disabled (feature request [#13269][pear-13269]) -- Added scripts/phpcs-svn-pre-commit that can be used as an SVN pre-commit hook - - Also reworked the way the phpcs script works to make it easier to wrap it with other functionality - - Thanks to Jack Bates for the contribution -- Fixed error in phpcs error message when a supplied file does not exist -- Fixed a cosmetic error in AbstractPatternSniff where the "found" string was missing some content -- Added sniffs that implement part of the PMD rule catalog to the Generic standard - - Thanks to [Manuel Pichler][@manuelpichler] for the contribution of all these sniffs. -- Squiz FunctionCommentThrowTagSniff no longer throws errors for function that only throw variables -- Generic ScopeIndentSniff now has private member to enforce exact indent matching -- Replaced Squiz DisallowCountInLoopsSniff with Squiz DisallowSizeFunctionsInLoopsSniff - - Thanks to Jan Miczaika for the sniff -- Squiz BlockCommentSniff now checks inline doc block comments -- Squiz InlineCommentSniff now checks inline doc block comments -- Squiz BlockCommentSniff now checks for no blank line before first comment in a function -- Squiz DocCommentAlignmentSniff now ignores inline doc block comments -- Squiz ControlStructureSpacingSniff now ensures no blank lines at the start of control structures -- Squiz ControlStructureSpacingSniff now ensures no blank lines between control structure closing braces -- Squiz IncrementDecrementUsageSniff now ensures inc/dec ops are bracketed in string concats -- Squiz IncrementDecrementUsageSniff now ensures inc/dec ops are not used in arithmetic operations -- Squiz FunctionCommentSniff no longer throws errors if return value is mixed but function returns void somewhere -- Squiz OperatorBracketSniff no allows function call brackets to count as operator brackets -- Squiz DoubleQuoteUsageSniff now supports \x \f and \v (feature request [#13365][pear-13365]) -- Squiz ComparisonOperatorUsageSniff now supports JS files -- Squiz ControlSignatureSniff now supports JS files -- Squiz ForLoopDeclarationSniff now supports JS files -- Squiz OperatorBracketSniff now supports JS files -- Squiz InlineControlStructureSniff now supports JS files -- Generic LowerCaseConstantSniff now supports JS files -- Generic DisallowTabIndentSniff now supports JS files -- Generic MultipleStatementAlignmentSniff now supports JS files -- Added Squiz ObjectMemberCommaSniff to ensure the last member of a JS object is not followed by a comma -- Added Squiz ConstantCaseSniff to ensure the PHP constants are uppercase and JS lowercase -- Added Squiz JavaScriptLintSniff to check JS files with JSL - - Set path using phpcs --config-set jsl_path /path/to/jsl -- Added MySource FirebugConsoleSniff to ban the use of "console" for JS variable and function names -- Added MySource JoinStringsSniff to enforce the use of join() to concatenate JS strings -- Added MySource AssignThisSniff to ensure this is only assigned to a var called self -- Added MySource DisallowNewWidgetSniff to ban manual creation of widget objects -- Removed warning shown in Zend CodeAnalyzerSniff when the ZCA path is not set - -### Fixed -- Fixed error in Squiz ValidVariableNameSniff when checking vars in the form $obj->$var -- Fixed error in Squiz DisallowMultipleAssignmentsSniff when checking vars in the form $obj->$var -- Fixed error in Squiz InlineCommentSniff where comments for class constants were seen as inline -- Fixed error in Squiz BlockCommentSniff where comments for class constants were not ignored -- Fixed error in Squiz OperatorBracketSniff where negative numbers were ignored during comparisons -- Fixed error in Squiz FunctionSpacingSniff where functions after member vars reported incorrect spacing -- Fixed bug [#13062][pear-13062] : Interface comments aren't handled in PEAR standard - - Thanks to [Manuel Pichler][@manuelpichler] for the path -- Fixed bug [#13119][pear-13119] : PHP minimum requirement need to be fix -- Fixed bug [#13156][pear-13156] : Bug in Squiz_Sniffs_PHP_NonExecutableCodeSniff -- Fixed bug [#13158][pear-13158] : Strange behaviour in AbstractPatternSniff -- Fixed bug [#13169][pear-13169] : Undefined variables -- Fixed bug [#13178][pear-13178] : Catch exception in `File.php` -- Fixed bug [#13254][pear-13254] : Notices output in checkstyle report causes XML issues -- Fixed bug [#13446][pear-13446] : crash with src of phpMyAdmin - - Thanks to [Manuel Pichler][@manuelpichler] for the path - -[pear-13062]: https://pear.php.net/bugs/bug.php?id=13062 -[pear-13119]: https://pear.php.net/bugs/bug.php?id=13119 -[pear-13156]: https://pear.php.net/bugs/bug.php?id=13156 -[pear-13158]: https://pear.php.net/bugs/bug.php?id=13158 -[pear-13169]: https://pear.php.net/bugs/bug.php?id=13169 -[pear-13178]: https://pear.php.net/bugs/bug.php?id=13178 -[pear-13254]: https://pear.php.net/bugs/bug.php?id=13254 -[pear-13269]: https://pear.php.net/bugs/bug.php?id=13269 -[pear-13365]: https://pear.php.net/bugs/bug.php?id=13365 -[pear-13446]: https://pear.php.net/bugs/bug.php?id=13446 - -## 1.0.1a1 - 2008-04-21 - -### Changed -- Fixed error in PEAR ValidClassNameSniff when checking class names with double underscores -- Moved Squiz InlineControlStructureSniff into Generic standard -- PEAR standard now throws warnings for inline control structures -- Squiz OutputBufferingIndentSniff now ignores the indentation of inline HTML -- MySource IncludeSystemSniff now ignores usage of ZipArchive -- Removed "function" from error messages for Generic function brace sniffs (feature request [#13820][pear-13820]) -- Generic UpperCaseConstantSniff no longer throws errors for declare(ticks = ...) - - Thanks to Josh Snyder for the patch -- Squiz ClosingDeclarationCommentSniff and AbstractVariableSniff now throw warnings for possible parse errors - -### Fixed -- Fixed bug [#13827][pear-13827] : AbstractVariableSniff throws "undefined index" -- Fixed bug [#13846][pear-13846] : Bug in Squiz.NonExecutableCodeSniff -- Fixed bug [#13849][pear-13849] : infinite loop in PHP_CodeSniffer_File::findNext() - -[pear-13820]: https://pear.php.net/bugs/bug.php?id=13820 -[pear-13827]: https://pear.php.net/bugs/bug.php?id=13827 -[pear-13846]: https://pear.php.net/bugs/bug.php?id=13846 -[pear-13849]: https://pear.php.net/bugs/bug.php?id=13849 - -## 1.0.1 - 2008-02-04 - -### Changed -- Squiz ArrayDeclarationSniff now throws error if the array keyword is followed by a space -- Squiz ArrayDeclarationSniff now throws error for empty multi-line arrays -- Squiz ArrayDeclarationSniff now throws error for multi-line arrays with a single value -- Squiz DocCommentAlignmentSniff now checks for a single space before tags inside docblocks -- Squiz ForbiddenFunctionsSniff now disallows is_null() to force use of (=== NULL) instead -- Squiz VariableCommentSniff now continues throwing errors after the first one is found -- Squiz SuperfluousWhitespaceSniff now throws errors for multiple blank lines inside functions -- MySource IncludedSystemSniff now checks extended class names -- MySource UnusedSystemSniff now checks extended and implemented class names -- MySource IncludedSystemSniff now supports includeWidget() -- MySource UnusedSystemSniff now supports includeWidget() -- Added PEAR ValidVariableNameSniff to check that only private member vars are prefixed with an underscore -- Added Squiz DisallowCountInLoopsSniff to check for the use of count() in FOR and WHILE loop conditions -- Added MySource UnusedSystemSniff to check for included classes that are never used - -### Fixed -- Fixed a problem that caused the parentheses map to sometimes contain incorrect values -- Fixed bug [#12767][pear-12767] : Cant run phpcs from dir with PEAR subdir -- Fixed bug [#12773][pear-12773] : Reserved variables are not detected in strings - - Thanks to [Wilfried Loche][pear-wloche] for the patch -- Fixed bug [#12832][pear-12832] : Tab to space conversion does not work -- Fixed bug [#12888][pear-12888] : extra space indentation = Notice: Uninitialized string offset... -- Fixed bug [#12909][pear-12909] : Default generateDocs function does not work under linux - - Thanks to [Paul Smith][pear-thing2b] for the patch -- Fixed bug [#12957][pear-12957] : PHP 5.3 magic method __callStatic - - Thanks to [Manuel Pichler][@manuelpichler] for the patch - -[pear-12767]: https://pear.php.net/bugs/bug.php?id=12767 -[pear-12773]: https://pear.php.net/bugs/bug.php?id=12773 -[pear-12832]: https://pear.php.net/bugs/bug.php?id=12832 -[pear-12888]: https://pear.php.net/bugs/bug.php?id=12888 -[pear-12909]: https://pear.php.net/bugs/bug.php?id=12909 -[pear-12957]: https://pear.php.net/bugs/bug.php?id=12957 - -## 1.0.0 - 2007-12-21 - -### Changed -- You can now specify the full path to a coding standard on the command line (feature request [#11886][pear-11886]) - - This allows you to use standards that are stored outside of PHP_CodeSniffer's own Standard dir - - You can also specify full paths in the `CodingStandard.php` include and exclude methods - - Classes, dirs and files need to be names as if the standard was part of PHP_CodeSniffer - - Thanks to Dirk Thomas for the doc generator patch and testing -- Modified the scope map to keep checking after 3 lines for some tokens (feature request [#12561][pear-12561]) - - Those tokens that must have an opener (like T_CLASS) now keep looking until EOF - - Other tokens (like T_FUNCTION) still stop after 3 lines for performance -- You can now escape commas in ignore patterns so they can be matched in file names - - Thanks to [Carsten Wiedmann][pear-cwiedmann] for the patch -- Config data is now cached in a global var so the file system is not hit so often - - You can also set config data temporarily for the script if you are using your own external script - - Pass TRUE as the third argument to PHP_CodeSniffer::setConfigData() -- PEAR ClassDeclarationSniff no longer throws errors for multi-line class declarations -- Squiz ClassDeclarationSniff now ensures there is one blank line after a class closing brace -- Squiz ClassDeclarationSniff now throws errors for a missing end PHP tag after the end class tag -- Squiz IncrementDecrementUsageSniff no longer throws errors when -= and += are being used with vars -- Squiz SwitchDeclarationSniff now throws errors for switch statements that do not contain a case statement - - Thanks to [Sertan Danis][@sertand] for the patch -- MySource IncludeSystemSniff no longer throws errors for the Util package - -### Fixed -- Fixed bug [#12621][pear-12621] : "space after AS" check is wrong - - Thanks to [Satoshi Oikawa][pear-renoiv] for the patch -- Fixed bug [#12645][pear-12645] : error message is wrong - - Thanks to [Satoshi Oikawa][pear-renoiv] for the patch -- Fixed bug [#12651][pear-12651] : Increment/Decrement Operators Usage at -1 - -[pear-11886]: https://pear.php.net/bugs/bug.php?id=11886 -[pear-12561]: https://pear.php.net/bugs/bug.php?id=12561 -[pear-12621]: https://pear.php.net/bugs/bug.php?id=12621 -[pear-12645]: https://pear.php.net/bugs/bug.php?id=12645 -[pear-12651]: https://pear.php.net/bugs/bug.php?id=12651 - -## 1.0.0RC3 - 2007-11-30 - -### Changed -- Added new command line argument --tab-width that will convert tabs to spaces before testing - - This allows you to use the existing sniffs that check for spaces even when you use tabs - - Can also be set via a config var: phpcs --config-set tab_width 4 - - A value of zero (the default) tells PHP_CodeSniffer not to replace tabs with spaces -- You can now change the default report format from "full" to something else - - Run: phpcs `--config-set report_format [format]` -- Improved performance by optimising the way the scope map is created during tokenizing -- Added new Squiz DisallowInlineIfSniff to disallow the usage of inline IF statements -- Fixed incorrect errors being thrown for nested switches in Squiz SwitchDeclarationSniff -- PEAR FunctionCommentSniff no longer complains about missing comments for @throws tags -- PEAR FunctionCommentSniff now throws error for missing exception class name for @throws tags -- PHP_CodeSniffer_File::isReference() now correctly returns for functions that return references -- Generic LineLengthSniff no longer warns about @version lines with CVS or SVN id tags -- Generic LineLengthSniff no longer warns about @license lines with long URLs -- Squiz FunctionCommentThrowTagSniff no longer complains about throwing variables -- Squiz ComparisonOperatorUsageSniff no longer throws incorrect errors for inline IF statements -- Squiz DisallowMultipleAssignmentsSniff no longer throws errors for assignments in inline IF statements - -### Fixed -- Fixed bug [#12455][pear-12455] : CodeSniffer treats content inside heredoc as PHP code -- Fixed bug [#12471][pear-12471] : Checkstyle report is broken -- Fixed bug [#12476][pear-12476] : PHP4 destructors are reported as error -- Fixed bug [#12513][pear-12513] : Checkstyle XML messages need to be utf8_encode()d - - Thanks to [Sebastian Bergmann][@sebastianbergmann] for the patch. -- Fixed bug [#12517][pear-12517] : getNewlineAfter() and dos files - -[pear-12455]: https://pear.php.net/bugs/bug.php?id=12455 -[pear-12471]: https://pear.php.net/bugs/bug.php?id=12471 -[pear-12476]: https://pear.php.net/bugs/bug.php?id=12476 -[pear-12513]: https://pear.php.net/bugs/bug.php?id=12513 -[pear-12517]: https://pear.php.net/bugs/bug.php?id=12517 - -## 1.0.0RC2 - 2007-11-14 - -### Changed -- Added a new Checkstyle report format - - Like the current XML format but modified to look like Checkstyle output - - Thanks to [Manuel Pichler][@manuelpichler] for helping get the format correct -- You can now hide warnings by default - - Run: phpcs --config-set show_warnings 0 - - If warnings are hidden by default, use the new -w command line argument to override -- Added new command line argument --config-delete to delete a config value and revert to the default -- Improved overall performance by optimising tokenizing and next/prev methods (feature request [#12421][pear-12421]) - - Thanks to [Christian Weiske][@cweiske] for the patch -- Added FunctionCallSignatureSniff to Squiz standard -- Added @subpackage support to file and class comment sniffs in PEAR standard (feature request [#12382][pear-12382]) - - Thanks to [Carsten Wiedmann][pear-cwiedmann] for the patch -- An error is now displayed if you use a PHP version less than 5.1.0 (feature request [#12380][pear-12380]) - - Thanks to [Carsten Wiedmann][pear-cwiedmann] for the patch -- phpcs now exits with status 2 if it receives invalid input (feature request [#12380][pear-12380]) - - This is distinct from status 1, which indicates errors or warnings were found -- Added new Squiz LanguageConstructSpacingSniff to throw errors for additional whitespace after echo etc. -- Removed Squiz ValidInterfaceNameSniff -- PEAR FunctionCommentSniff no longer complains about unknown tags - -### Fixed -- Fixed incorrect errors about missing function comments in PEAR FunctionCommentSniff -- Fixed incorrect function docblock detection in Squiz FunctionCommentSniff -- Fixed incorrect errors for list() in Squiz DisallowMultipleAssignmentsSniff -- Errors no longer thrown if control structure is followed by a CASE's BREAK in Squiz ControlStructureSpacingSniff -- Fixed bug [#12368][pear-12368] : Autoloader cannot be found due to include_path override - - Thanks to [Richard Quadling][pear-rquadling] for the patch -- Fixed bug [#12378][pear-12378] : equal sign alignments problem with while() - -[pear-12368]: https://pear.php.net/bugs/bug.php?id=12368 -[pear-12378]: https://pear.php.net/bugs/bug.php?id=12378 -[pear-12380]: https://pear.php.net/bugs/bug.php?id=12380 -[pear-12382]: https://pear.php.net/bugs/bug.php?id=12382 -[pear-12421]: https://pear.php.net/bugs/bug.php?id=12421 - -## 1.0.0RC1 - 2007-11-01 - -### Changed -- Main phpcs script can now be run from a CVS checkout without installing the package -- Added a new CSV report format - - Header row indicates what position each element is in - - Always use the header row to determine positions rather than assuming the format, as it may change -- XML and CSV report formats now contain information about which column the error occurred at - - Useful if you want to highlight the token that caused the error in a custom application -- Square bracket tokens now have bracket_opener and bracket_closer set -- Added new Squiz SemicolonSpacingSniff to throw errors if whitespace is found before a semicolon -- Added new Squiz ArrayBracketSpacingSniff to throw errors if whitespace is found around square brackets -- Added new Squiz ObjectOperatorSpacingSniff to throw errors if whitespace is found around object operators -- Added new Squiz DisallowMultipleAssignmentsSniff to throw errors if multiple assignments are on the same line -- Added new Squiz ScopeKeywordSpacingSniff to throw errors if there is not a single space after a scope modifier -- Added new Squiz ObjectInstantiationSniff to throw errors if new objects are not assigned to a variable -- Added new Squiz FunctionDuplicateArgumentSniff to throw errors if argument is declared multiple times in a function -- Added new Squiz FunctionOpeningBraceSpaceSniff to ensure there are no blank lines after a function open brace -- Added new Squiz CommentedOutCodeSniff to warn about comments that looks like they are commented out code blocks -- Added CyclomaticComplexitySniff to Squiz standard -- Added NestingLevelSniff to Squiz standard -- Squiz ForbiddenFunctionsSniff now recommends echo() instead of print() -- Squiz ValidLogicalOperatorsSniff now recommends ^ instead of xor -- Squiz SwitchDeclarationSniff now contains more checks - - A single space is required after the case keyword - - No space is allowed before the colon in a case or default statement - - All switch statements now require a default case - - Default case must contain a break statement - - Empty default case must contain a comment describing why the default is ignored - - Empty case statements are not allowed - - Case and default statements must not be followed by a blank line - - Break statements must be followed by a blank line or the closing brace - - There must be no blank line before a break statement -- Squiz standard is now using the PEAR IncludingFileSniff -- PEAR ClassCommentSniff no longer complains about unknown tags -- PEAR FileCommentSniff no longer complains about unknown tags -- PEAR FileCommentSniff now accepts multiple @copyright tags -- Squiz BlockCommentSniff now checks that comment starts with a capital letter -- Squiz InlineCommentSniff now has better checking to ensure comment starts with a capital letter -- Squiz ClassCommentSniff now checks that short and long comments start with a capital letter -- Squiz FunctionCommentSniff now checks that short, long and param comments start with a capital letter -- Squiz VariableCommentSniff now checks that short and long comments start with a capital letter - -### Fixed -- Fixed error with multi-token array indexes in Squiz ArrayDeclarationSniff -- Fixed error with checking shorthand IF statements without a semicolon in Squiz InlineIfDeclarationSniff -- Fixed error where constants used as default values in function declarations were seen as type hints -- Fixed bug [#12316][pear-12316] : PEAR is no longer the default standard -- Fixed bug [#12321][pear-12321] : wrong detection of missing function docblock - -[pear-12316]: https://pear.php.net/bugs/bug.php?id=12316 -[pear-12321]: https://pear.php.net/bugs/bug.php?id=12321 - -## 0.9.0 - 2007-09-24 - -### Changed -- Added a config system for setting config data across phpcs runs -- You can now change the default coding standard from PEAR to something else - - Run: phpcs `--config-set default_standard [standard]` -- Added new Zend coding standard to check code against the Zend Framework standards - - The complete standard is not yet implemented - - Specify --standard=Zend to use - - Thanks to Johann-Peter Hartmann for the contribution of some sniffs - - Thanks to Holger Kral for the Code Analyzer sniff - -## 0.8.0 - 2007-08-08 - -### Changed -- Added new XML report format; --report=xml (feature request [#11535][pear-11535]) - - Thanks to [Brett Bieber][@saltybeagle] for the patch -- Added new command line argument --ignore to specify a list of files to skip (feature request [#11556][pear-11556]) -- Added PHPCS and MySource coding standards into the core install -- Scope map no longer gets confused by curly braces that act as string offsets -- Removed `CodeSniffer/SniffException.php` as it is no longer used -- Unit tests can now be run directly from a CVS checkout -- Made private vars and functions protected in PHP_CodeSniffer class so this package can be overridden -- Added new Metrics category to Generic coding standard - - Contains Cyclomatic Complexity and Nesting Level sniffs - - Thanks to Johann-Peter Hartmann for the contribution -- Added new Generic DisallowTabIndentSniff to throw errors if tabs are used for indentation (feature request [#11738][pear-11738]) - - PEAR and Squiz standards use this new sniff to throw more specific indentation errors -- Generic MultipleStatementAlignmentSniff has new private var to set a padding size limit (feature request [#11555][pear-11555]) -- Generic MultipleStatementAlignmentSniff can now handle assignments that span multiple lines (feature request [#11561][pear-11561]) -- Generic LineLengthSniff now has a max line length after which errors are thrown instead of warnings - - BC BREAK: Override the protected member var absoluteLineLimit and set it to zero in custom LineLength sniffs - - Thanks to Johann-Peter Hartmann for the contribution -- Comment sniff errors about incorrect tag orders are now more descriptive (feature request [#11693][pear-11693]) - -### Fixed -- Fixed bug [#11473][pear-11473] : Invalid CamelCaps name when numbers used in names - -[pear-11473]: https://pear.php.net/bugs/bug.php?id=11473 -[pear-11535]: https://pear.php.net/bugs/bug.php?id=11535 -[pear-11555]: https://pear.php.net/bugs/bug.php?id=11555 -[pear-11556]: https://pear.php.net/bugs/bug.php?id=11556 -[pear-11561]: https://pear.php.net/bugs/bug.php?id=11561 -[pear-11693]: https://pear.php.net/bugs/bug.php?id=11693 -[pear-11738]: https://pear.php.net/bugs/bug.php?id=11738 - -## 0.7.0 - 2007-07-02 - -### Changed -- BC BREAK: EOL character is now auto-detected and used instead of hard-coded \n - - Pattern sniffs must now specify "EOL" instead of "\n" or "\r\n" to use auto-detection - - Please use $phpcsFile->eolChar to check for newlines instead of hard-coding "\n" or "\r\n" - - Comment parser classes now require you to pass $phpcsFile as an additional argument -- BC BREAK: Included and excluded sniffs now require `.php` extension - - Please update your coding standard classes and add `.php` to all sniff entries - - See `CodeSniffer/Standards/PEAR/PEARCodingStandard.php` for an example -- Fixed error where including a directory of sniffs in a coding standard class did not work -- Coding standard classes can now specify a list of sniffs to exclude as well as include (feature request [#11056][pear-11056]) -- Two uppercase characters can now be placed side-by-side in class names in Squiz ValidClassNameSniff -- SVN tags now allowed in PEAR file doc blocks (feature request [#11038][pear-11038]) - - Thanks to [Torsten Roehr][pear-troehr] for the patch -- Private methods in commenting sniffs and comment parser are now protected (feature request [#11087][pear-11087]) -- Added Generic LineEndingsSniff to check the EOL character of a file -- PEAR standard now only throws one error per file for incorrect line endings (eg. /r/n) -- Command line arg -v now shows number of registered sniffs -- Command line arg -vvv now shows list of registered sniffs -- Squiz ControlStructureSpacingSniff no longer throws errors if the control structure is at the end of the script -- Squiz FunctionCommentSniff now throws error for "return void" if function has return statement -- Squiz FunctionCommentSniff now throws error for functions that return void but specify something else -- Squiz ValidVariableNameSniff now allows multiple uppercase letters in a row -- Squiz ForEachLoopDeclarationSniff now throws error for AS keyword not being lowercase -- Squiz SwitchDeclarationSniff now throws errors for CASE/DEFAULT/BREAK keywords not being lowercase -- Squiz ArrayDeclarationSniff now handles multi-token array values when checking alignment -- Squiz standard now enforces a space after cast tokens -- Generic MultipleStatementAlignmentSniff no longer gets confused by assignments inside FOR conditions -- Generic MultipleStatementAlignmentSniff no longer gets confused by the use of list() -- Added Generic SpaceAfterCastSniff to ensure there is a single space after a cast token -- Added Generic NoSpaceAfterCastSniff to ensure there is no whitespace after a cast token -- Added PEAR ClassDeclarationSniff to ensure the opening brace of a class is on the line after the keyword -- Added Squiz ScopeClosingBraceSniff to ensure closing braces are aligned correctly -- Added Squiz EvalSniff to discourage the use of eval() -- Added Squiz LowercaseDeclarationSniff to ensure all declaration keywords are lowercase -- Added Squiz LowercaseClassKeywordsSniff to ensure all class declaration keywords are lowercase -- Added Squiz LowercaseFunctionKeywordsSniff to ensure all function declaration keywords are lowercase -- Added Squiz LowercasePHPFunctionsSniff to ensure all calls to inbuilt PHP functions are lowercase -- Added Squiz CastSpacingSniff to ensure cast statements don't contain whitespace -- Errors no longer thrown when checking 0 length files with verbosity on - -### Fixed -- Fixed bug [#11105][pear-11105] : getIncludedSniffs() not working anymore - - Thanks to [Blair Robertson][pear-adviva] for the patch -- Fixed bug [#11120][pear-11120] : Uninitialized string offset in `AbstractParser.php` on line 200 - -[pear-11038]: https://pear.php.net/bugs/bug.php?id=11038 -[pear-11056]: https://pear.php.net/bugs/bug.php?id=11056 -[pear-11087]: https://pear.php.net/bugs/bug.php?id=11087 -[pear-11105]: https://pear.php.net/bugs/bug.php?id=11105 -[pear-11120]: https://pear.php.net/bugs/bug.php?id=11120 - -## 0.6.0 - 2007-05-15 - -### Changed -- The number of errors and warnings found is now shown for each file while checking the file if verbosity is enabled -- Now using PHP_EOL instead of hard-coded \n so output looks good on Windows (feature request [#10761][pear-10761]) - - Thanks to [Carsten Wiedmann][pear-cwiedmann] for the patch. -- phpcs now exits with status 0 (no errors) or 1 (errors found) (feature request [#10348][pear-10348]) -- Added new -l command line argument to stop recursion into directories (feature request [#10979][pear-10979]) - -### Fixed -- Fixed variable name error causing incorrect error message in Squiz ValidVariableNameSniff -- Fixed bug [#10757][pear-10757] : Error in ControlSignatureSniff -- Fixed bugs [#10751][pear-10751], [#10777][pear-10777] : Sniffer class paths handled incorrectly in Windows - - Thanks to [Carsten Wiedmann][pear-cwiedmann] for the patch. -- Fixed bug [#10961][pear-10961] : Error "Last parameter comment requires a blank newline after it" thrown -- Fixed bug [#10983][pear-10983] : phpcs outputs notices when checking invalid PHP -- Fixed bug [#10980][pear-10980] : Incorrect warnings for equals sign - -[pear-10348]: https://pear.php.net/bugs/bug.php?id=10348 -[pear-10751]: https://pear.php.net/bugs/bug.php?id=10751 -[pear-10757]: https://pear.php.net/bugs/bug.php?id=10757 -[pear-10761]: https://pear.php.net/bugs/bug.php?id=10761 -[pear-10777]: https://pear.php.net/bugs/bug.php?id=10777 -[pear-10961]: https://pear.php.net/bugs/bug.php?id=10961 -[pear-10979]: https://pear.php.net/bugs/bug.php?id=10979 -[pear-10980]: https://pear.php.net/bugs/bug.php?id=10980 -[pear-10983]: https://pear.php.net/bugs/bug.php?id=10983 - -## 0.5.0 - 2007-04-17 - -### Changed -- BC BREAK: Coding standards now require a class to be added so PHP_CodeSniffer can get information from them - - Please read the end user docs for info about the new class required for all coding standards -- Coding standards can now include sniffs from other standards, or whole standards, without writing new sniff files -- PHP_CodeSniffer_File::isReference() now correctly returns for references in function declarations -- PHP_CodeSniffer_File::isReference() now returns false if you don't pass it a T_BITWISE_AND token -- PHP_CodeSniffer_File now stores the absolute path to the file so sniffs can check file locations correctly -- Fixed undefined index error in AbstractVariableSniff for variables inside an interface function definition -- Added MemberVarSpacingSniff to Squiz standard to enforce one-line spacing between member vars -- Add FunctionCommentThrowTagSniff to Squiz standard to check that @throws tags are correct - -### Fixed -- Fixed problems caused by references and type hints in Squiz FunctionDeclarationArgumentSpacingSniff -- Fixed problems with errors not being thrown for some misaligned @param comments in Squiz FunctionCommentSniff -- Fixed badly spaced comma error being thrown for "extends" class in Squiz ClassDeclarationSniff -- Errors no longer thrown for class method names in Generic ForbiddenFunctionsSniff -- Errors no longer thrown for type hints in front of references in Generic UpperCaseConstantNameSniff -- Errors no longer thrown for correctly indented buffered lines in Squiz ScopeIndexSniff -- Errors no longer thrown for user-defined functions named as forbidden functions in Generic ForbiddenFunctionsSniff -- Errors no longer thrown on __autoload functions in PEAR ValidFunctionNameSniff -- Errors now thrown for __autoload methods in PEAR ValidFunctionNameSniff -- Errors now thrown if constructors or destructors have @return tags in Squiz FunctionCommentSniff -- Errors now thrown if @throws tags don't start with a capital and end with a full stop in Squiz FunctionCommentSniff -- Errors now thrown for invalid @var tag values in Squiz VariableCommentSniff -- Errors now thrown for missing doc comment in Squiz VariableCommentSniff -- Errors now thrown for unspaced operators in FOR loop declarations in Squiz OperatorSpacingSniff -- Errors now thrown for using ob_get_clean/flush functions to end buffers in Squiz OutputBufferingIndentSniff -- Errors now thrown for all missing member variable comments in Squiz VariableCommentSniff - -## 0.4.0 - 2007-02-19 - -### Changed -- Standard name specified with --standard command line argument is no longer case sensitive -- Long error and warning messages are now wrapped to 80 characters in the full error report (thanks Endre Czirbesz) -- Shortened a lot of error and warning messages so they don't take up so much room -- Squiz FunctionCommentSniff now checks that param comments start with a capital letter and end with a full stop -- Squiz FunctionSpacingSniff now reports incorrect lines below function on closing brace, not function keyword -- Squiz FileCommentSniff now checks that there are no blank lines between the open PHP tag and the comment -- PHP_CodeSniffer_File::isReference() now returns correctly when checking refs on right side of => - -### Fixed -- Fixed incorrect error with switch closing brace in Squiz SwitchDeclarationSniff -- Fixed missing error when multiple statements are not aligned correctly with object operators -- Fixed incorrect errors for some PHP special variables in Squiz ValidVariableNameSniff -- Fixed incorrect errors for arrays that only contain other arrays in Squiz ArrayDeclarationSniff -- Fixed bug [#9844][pear-9844] : throw new Exception(\n accidentally reported as error but it ain't - -[pear-9844]: https://pear.php.net/bugs/bug.php?id=9844 - -## 0.3.0 - 2007-01-11 - -### Changed -- Updated package.xml to version 2 -- Specifying coding standard on command line is now optional, even if you have multiple standards installed - - PHP_CodeSniffer uses the PEAR coding standard by default if no standard is specified -- New command line option, --extensions, to specify a comma separated list of file extensions to check -- Converted all unit tests to PHPUnit 3 format -- Added new coding standard, Squiz, that can be used as an alternative to PEAR - - also contains more examples of sniffs - - some may be moved into the Generic coding standard if required -- Added MultipleStatementAlignmentSniff to Generic standard -- Added ScopeIndentSniff to Generic standard -- Added ForbiddenFunctionsSniff to Generic standard -- Added FileCommentSniff to PEAR standard -- Added ClassCommentSniff to PEAR standard -- Added FunctionCommentSniff to PEAR standard -- Change MultipleStatementSniff to MultipleStatementAlignmentSniff in PEAR standard -- Replaced Methods directory with Functions directory in Generic and PEAR standards - - also renamed some of the sniffs in those directories -- Updated file, class and method comments for all files - -### Fixed -- Fixed bug [#9274][pear-9274] : nested_parenthesis element not set for open and close parenthesis tokens -- Fixed bug [#9411][pear-9411] : too few pattern characters cause incorrect error report - -[pear-9411]: https://pear.php.net/bugs/bug.php?id=9411 - -## 0.2.1 - 2006-11-09 - -### Fixed -- Fixed bug [#9274][pear-9274] : nested_parenthesis element not set for open and close parenthesis tokens - -[pear-9274]: https://pear.php.net/bugs/bug.php?id=9274 - -## 0.2.0 - 2006-10-13 - -### Changed -- Added a generic standards package that will contain generic sniffs to be used in specific coding standards - - thanks to Frederic Poeydomenge for the idea -- Changed PEAR standard to use generic sniffs where available -- Added LowerCaseConstantSniff to Generic standard -- Added UpperCaseConstantSniff to Generic standard -- Added DisallowShortOpenTagSniff to Generic standard -- Added LineLengthSniff to Generic standard -- Added UpperCaseConstantNameSniff to Generic standard -- Added OpeningMethodBraceBsdAllmanSniff to Generic standard (contrib by Frederic Poeydomenge) -- Added OpeningMethodBraceKernighanRitchieSniff to Generic standard (contrib by Frederic Poeydomenge) -- Added framework for core PHP_CodeSniffer unit tests -- Added unit test for PHP_CodeSniffer:isCamelCaps method -- ScopeClosingBraceSniff now checks indentation of BREAK statements -- Added new command line arg (-vv) to show developer debug output - -### Fixed -- Fixed some coding standard errors -- Fixed bug [#8834][pear-8834] : Massive memory consumption -- Fixed bug [#8836][pear-8836] : path case issues in package.xml -- Fixed bug [#8843][pear-8843] : confusion on nested switch() -- Fixed bug [#8841][pear-8841] : comments taken as whitespace -- Fixed bug [#8884][pear-8884] : another problem with nested switch() statements - -[pear-8834]: https://pear.php.net/bugs/bug.php?id=8834 -[pear-8836]: https://pear.php.net/bugs/bug.php?id=8836 -[pear-8841]: https://pear.php.net/bugs/bug.php?id=8841 -[pear-8843]: https://pear.php.net/bugs/bug.php?id=8843 -[pear-8884]: https://pear.php.net/bugs/bug.php?id=8884 - -## 0.1.1 - 2006-09-25 - -### Changed -- Added unit tests for all PEAR sniffs -- Exception class now extends from PEAR_Exception - -### Fixed -- Fixed summary report so files without errors but with warnings are not shown when warnings are hidden - -## 0.1.0 - 2006-09-19 - -### Changed -- Reorganised package contents to conform to PEAR standards -- Changed version numbering to conform to PEAR standards -- Removed duplicate `require_once()` of `Exception.php` from `CodeSniffer.php` - -## 0.0.5 - 2006-09-18 - -### Fixed -- Fixed `.bat` file for situation where `php.ini` cannot be found so `include_path` is not set - -## 0.0.4 - 2006-08-28 - -### Changed -- Added .bat file for easier running of PHP_CodeSniffer on Windows -- Sniff that checks method names now works for PHP4 style code where there is no scope keyword -- Sniff that checks method names now works for PHP4 style constructors -- Sniff that checks method names no longer incorrectly reports error with magic methods -- Sniff that checks method names now reports errors with non-magic methods prefixed with __ -- Sniff that checks for constant names no longer incorrectly reports errors with heredoc strings -- Sniff that checks for constant names no longer incorrectly reports errors with created objects -- Sniff that checks indentation no longer incorrectly reports errors with heredoc strings -- Sniff that checks indentation now correctly reports errors with improperly indented multi-line strings -- Sniff that checks function declarations now checks for spaces before and after an equals sign for default values -- Sniff that checks function declarations no longer incorrectly reports errors with multi-line declarations -- Sniff that checks included code no longer incorrectly reports errors when return value is used conditionally -- Sniff that checks opening brace of function no longer incorrectly reports errors with multi-line declarations -- Sniff that checks spacing after commas in function calls no longer reports too many errors for some code -- Sniff that checks control structure declarations now gives more descriptive error message - -## 0.0.3 - 2006-08-22 - -### Changed -- Added sniff to check for invalid class and interface names -- Added sniff to check for invalid function and method names -- Added sniff to warn if line is greater than 85 characters -- Added sniff to check that function calls are in the correct format -- Added command line arg to print current version (--version) - -### Fixed -- Fixed error where comments were not allowed on the same line as a control structure declaration - -## 0.0.2 - 2006-07-25 - -### Changed -- Removed the including of checked files to stop errors caused by parsing them -- Removed the use of reflection so checked files do not have to be included -- Memory usage has been greatly reduced -- Much faster tokenizing and checking times -- Reworked the PEAR coding standard sniffs (much faster now) -- Fix some bugs with the PEAR scope indentation standard -- Better checking for installed coding standards -- Can now accept multiple files and dirs on the command line -- Added an option to list installed coding standards -- Added an option to print a summary report (number of errors and warnings shown for each file) -- Added an option to hide warnings from reports -- Added an option to print verbose output (so you know what is going on) -- Reordered command line args to put switches first (although order is not enforced) -- Switches can now be specified together (e.g. `phpcs -nv`) as well as separately (`phpcs -n -v`) - -## 0.0.1 - 2006-07-19 - -### Added -- Initial preview release - - - -[Unreleased]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.13.5...3.x -[3.13.5]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.13.4...3.13.5 -[3.13.4]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.13.3...3.13.4 -[3.13.3]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.13.2...3.13.3 -[3.13.2]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.13.1...3.13.2 -[3.13.1]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.13.0...3.13.1 -[3.13.0]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.12.2...3.13.0 -[3.12.2]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.12.1...3.12.2 -[3.12.1]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.12.0...3.12.1 -[3.12.0]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.11.3...3.12.0 -[3.11.3]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.11.2...3.11.3 -[3.11.2]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.11.1...3.11.2 -[3.11.1]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.11.0...3.11.1 -[3.11.0]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.10.3...3.11.0 -[3.10.3]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.10.2...3.10.3 -[3.10.2]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.10.1...3.10.2 -[3.10.1]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.10.0...3.10.1 -[3.10.0]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.9.2...3.10.0 -[3.9.2]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.9.1...3.9.2 -[3.9.1]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.9.0...3.9.1 -[3.9.0]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.8.1...3.9.0 -[3.8.1]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.8.0...3.8.1 -[3.8.0]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.7.2...3.8.0 -[3.7.2]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.7.1...3.7.2 -[3.7.1]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.7.0...3.7.1 -[3.7.0]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.6.2...3.7.0 -[3.6.2]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.6.1...3.6.2 -[3.6.1]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.6.0...3.6.1 -[3.6.0]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.5.8...3.6.0 -[3.5.8]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.5.7...3.5.8 -[3.5.7]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.5.6...3.5.7 -[3.5.6]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.5.5...3.5.6 -[3.5.5]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.5.4...3.5.5 -[3.5.4]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.5.3...3.5.4 -[3.5.3]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.5.2...3.5.3 -[3.5.2]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.5.1...3.5.2 -[3.5.1]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.5.0...3.5.1 -[3.5.0]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.4.2...3.5.0 -[3.4.2]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.4.1...3.4.2 -[3.4.1]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.4.0...3.4.1 -[3.4.0]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.3.2...3.4.0 -[3.3.2]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.3.1...3.3.2 -[3.3.1]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.3.0...3.3.1 -[3.3.0]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.2.3...3.3.0 -[3.2.3]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.2.2...3.2.3 -[3.2.2]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.2.1...3.2.2 -[3.2.1]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.2.0...3.2.1 -[3.2.0]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.1.1...3.2.0 -[3.1.1]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.1.0...3.1.1 -[3.1.0]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.0.2...3.1.0 -[3.0.2]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.0.1...3.0.2 -[3.0.1]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.0.0...3.0.1 -[3.0.0]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.0.0RC4...3.0.0 -[3.0.0RC4]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.0.0RC3...3.0.0RC4 -[3.0.0RC3]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.0.0RC2...3.0.0RC3 -[3.0.0RC2]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.0.0RC1...3.0.0RC2 -[3.0.0RC1]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/3.0.0a1...3.0.0RC1 -[3.0.0a1]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/2.9.2...3.0.0a1 -[2.9.2]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/2.9.1...2.9.2 -[2.9.1]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/2.9.0...2.9.1 -[2.9.0]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/2.8.1...2.9.0 -[2.8.1]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/2.8.0...2.8.1 -[2.8.0]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/2.7.1...2.8.0 -[2.7.1]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/2.7.0...2.7.1 -[2.7.0]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/2.6.2...2.7.0 -[2.6.2]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/2.6.1...2.6.2 -[2.6.1]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/2.6.0...2.6.1 -[2.6.0]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/2.5.1...2.6.0 -[2.5.1]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/2.5.0...2.5.1 -[2.5.0]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/2.4.0...2.5.0 -[2.4.0]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/2.3.4...2.4.0 -[2.3.4]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/2.3.3...2.3.4 -[2.3.3]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/2.3.2...2.3.3 -[2.3.2]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/2.3.1...2.3.2 -[2.3.1]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/2.3.0...2.3.1 -[2.3.0]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/2.2.0...2.3.0 -[2.2.0]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/2.1.0...2.2.0 -[2.1.0]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/2.0.0...2.1.0 -[2.0.0]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/2.0.0RC4...2.0.0 -[2.0.0RC4]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/2.0.0RC3...2.0.0RC4 -[2.0.0RC3]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/2.0.0RC2...2.0.0RC3 -[2.0.0RC2]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/2.0.0RC1...2.0.0RC2 -[2.0.0RC1]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/2.0.0a2...2.0.0RC1 -[2.0.0a2]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/2.0.0a1...2.0.0a2 -[2.0.0a1]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/1.5.6...2.0.0a1 -[1.5.6]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/1.5.5...1.5.6 -[1.5.5]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/1.5.4...1.5.5 -[1.5.4]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/1.5.3...1.5.4 -[1.5.3]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/1.5.2...1.5.3 -[1.5.2]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/1.5.1...1.5.2 -[1.5.1]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/1.5.0...1.5.1 -[1.5.0]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/1.5.0RC4...1.5.0 -[1.5.0RC4]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/1.5.0RC3...1.5.0RC4 -[1.5.0RC3]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/1.5.0RC2...1.5.0RC3 -[1.5.0RC2]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/1.5.0RC1...1.5.0RC2 -[1.5.0RC1]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/1.4.8...1.5.0RC1 -[1.4.8]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/1.4.7...1.4.8 -[1.4.7]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/1.4.6...1.4.7 -[1.4.6]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/1.4.5...1.4.6 -[1.4.5]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/1.4.4...1.4.5 -[1.4.4]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/1.4.3...1.4.4 -[1.4.3]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/1.4.2...1.4.3 -[1.4.2]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/1.4.1...1.4.2 -[1.4.1]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/1.4.0...1.4.1 -[1.4.0]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/1.3.6...1.4.0 -[1.3.6]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/1.3.5...1.3.6 -[1.3.5]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/1.3.4...1.3.5 -[1.3.4]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/1.3.3...1.3.4 -[1.3.3]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/1.3.2...1.3.3 -[1.3.2]: https://github.com/PHPCSStandards/PHP_CodeSniffer/compare/1.3.1...1.3.2 - - - -[@2shediac]: https://github.com/2shediac -[@ablyler]: https://github.com/ablyler -[@aboks]: https://github.com/aboks -[@abulford]: https://github.com/abulford -[@afilina]: https://github.com/afilina -[@aik099]: https://github.com/aik099 -[@akarmazyn]: https://github.com/akarmazyn -[@akkie]: https://github.com/akkie -[@alcohol]: https://github.com/alcohol -[@alekitto]: https://github.com/alekitto -[@AlexHowansky]: https://github.com/AlexHowansky -[@anbuc]: https://github.com/anbuc -[@andrei-propertyguru]: https://github.com/andrei-propertyguru -[@AndrewDawes]: https://github.com/AndrewDawes -[@andrewnicols]: https://github.com/andrewnicols -[@andygrunwald]: https://github.com/andygrunwald -[@andypost]: https://github.com/andypost -[@annechko]: https://github.com/annechko -[@anomiex]: https://github.com/anomiex -[@arnested]: https://github.com/arnested -[@asispts]: https://github.com/asispts -[@asnyder]: https://github.com/asnyder -[@Astinus-Eberhard]: https://github.com/Astinus-Eberhard -[@axlon]: https://github.com/axlon -[@bayleedev]: https://github.com/bayleedev -[@becoded]: https://github.com/becoded -[@Benjamin-Loison]: https://github.com/Benjamin-Loison -[@benmatselby]: https://github.com/benmatselby -[@benno5020]: https://github.com/benno5020 -[@biinari]: https://github.com/biinari -[@Billz95]: https://github.com/Billz95 -[@biozshock]: https://github.com/biozshock -[@bkdotcom]: https://github.com/bkdotcom -[@bladeofsteel]: https://github.com/bladeofsteel -[@blerou]: https://github.com/blerou -[@blue32a]: https://github.com/blue32a -[@bondas83]: https://github.com/bondas83 -[@boonkerz]: https://github.com/boonkerz -[@braindawg]: https://github.com/braindawg -[@BRMatt]: https://github.com/BRMatt -[@CandySunPlus]: https://github.com/CandySunPlus -[@ceeram]: https://github.com/ceeram -[@cixtor]: https://github.com/cixtor -[@claylo]: https://github.com/claylo -[@codebymikey]: https://github.com/codebymikey -[@costdev]: https://github.com/costdev -[@covex-nn]: https://github.com/covex-nn -[@cweiske]: https://github.com/cweiske -[@Daimona]: https://github.com/Daimona -[@danez]: https://github.com/danez -[@DanielEScherzer]: https://github.com/DanielEScherzer -[@DannyvdSluijs]: https://github.com/DannyvdSluijs -[@das-peter]: https://github.com/das-peter -[@datengraben]: https://github.com/datengraben -[@david-binda]: https://github.com/david-binda -[@Decave]: https://github.com/Decave -[@dereuromark]: https://github.com/dereuromark -[@derrabus]: https://github.com/derrabus -[@devfrey]: https://github.com/devfrey -[@deviantintegral]: https://github.com/deviantintegral -[@dhensby]: https://github.com/dhensby -[@dingo-d]: https://github.com/dingo-d -[@dominics]: https://github.com/dominics -[@donatj]: https://github.com/donatj -[@dryabkov]: https://github.com/dryabkov -[@dschniepp]: https://github.com/dschniepp -[@duncan3dc]: https://github.com/duncan3dc -[@edorian]: https://github.com/edorian -[@elazar]: https://github.com/elazar -[@ElvenSpellmaker]: https://github.com/ElvenSpellmaker -[@emil-nasso]: https://github.com/emil-nasso -[@enl]: https://github.com/enl -[@erikwiffin]: https://github.com/erikwiffin -[@eser]: https://github.com/eser -[@exussum12]: https://github.com/exussum12 -[@fabacino]: https://github.com/fabacino -[@fabre-thibaud]: https://github.com/fabre-thibaud -[@fcool]: https://github.com/fcool -[@filips123]: https://github.com/filips123 -[@Fischer-Bjoern]: https://github.com/Fischer-Bjoern -[@fonsecas72]: https://github.com/fonsecas72 -[@fredden]: https://github.com/fredden -[@GaryJones]: https://github.com/GaryJones -[@ghostal]: https://github.com/ghostal -[@ghunti]: https://github.com/ghunti -[@gmponos]: https://github.com/gmponos -[@gnutix]: https://github.com/gnutix -[@goatherd]: https://github.com/goatherd -[@grongor]: https://github.com/grongor -[@grzr]: https://github.com/grzr -[@gwharton]: https://github.com/gwharton -[@hashar]: https://github.com/hashar -[@helgi]: https://github.com/helgi -[@hernst42]: https://github.com/hernst42 -[@iammattcoleman]: https://github.com/iammattcoleman -[@ihabunek]: https://github.com/ihabunek -[@illusori]: https://github.com/illusori -[@index0h]: https://github.com/index0h -[@ivuorinen]: https://github.com/ivuorinen -[@jasonmccreary]: https://github.com/jasonmccreary -[@javer]: https://github.com/javer -[@jaymcp]: https://github.com/jaymcp -[@JDGrimes]: https://github.com/JDGrimes -[@jedgell]: https://github.com/jedgell -[@jeffslofish]: https://github.com/jeffslofish -[@jmarcil]: https://github.com/jmarcil -[@jnrbsn]: https://github.com/jnrbsn -[@joachim-n]: https://github.com/joachim-n -[@joelposti]: https://github.com/joelposti -[@johanderuijter]: https://github.com/johanderuijter -[@johnmaguire]: https://github.com/johnmaguire -[@johnpbloch]: https://github.com/johnpbloch -[@JorisDebonnet]: https://github.com/JorisDebonnet -[@josephzidell]: https://github.com/josephzidell -[@joshdavis11]: https://github.com/joshdavis11 -[@jpoliveira08]: https://github.com/jpoliveira08 -[@jpuck]: https://github.com/jpuck -[@jrfnl]: https://github.com/jrfnl -[@kdebisschop]: https://github.com/kdebisschop -[@kenguest]: https://github.com/kenguest -[@klausi]: https://github.com/klausi -[@Konafets]: https://github.com/Konafets -[@kristofser]: https://github.com/kristofser -[@ksimka]: https://github.com/ksimka -[@ktomk]: https://github.com/ktomk -[@kukulich]: https://github.com/kukulich -[@legoktm]: https://github.com/legoktm -[@lmanzke]: https://github.com/lmanzke -[@localheinz]: https://github.com/localheinz -[@lucc]: https://github.com/lucc -[@MacDada]: https://github.com/MacDada -[@Majkl578]: https://github.com/Majkl578 -[@manuelpichler]: https://github.com/manuelpichler -[@marcospassos]: https://github.com/marcospassos -[@MarkBaker]: https://github.com/MarkBaker -[@MarkMaldaba]: https://github.com/MarkMaldaba -[@martinssipenko]: https://github.com/martinssipenko -[@marvasDE]: https://github.com/marvasDE -[@maryo]: https://github.com/maryo -[@MasterOdin]: https://github.com/MasterOdin -[@mathroc]: https://github.com/mathroc -[@MatmaRex]: https://github.com/MatmaRex -[@maxgalbu]: https://github.com/maxgalbu -[@mcuelenaere]: https://github.com/mcuelenaere -[@mhujer]: https://github.com/mhujer -[@michaelbutler]: https://github.com/michaelbutler -[@michalbundyra]: https://github.com/michalbundyra -[@Morerice]: https://github.com/Morerice -[@mbomb007]: https://github.com/mbomb007 -[@morozov]: https://github.com/morozov -[@mrkrstphr]: https://github.com/mrkrstphr -[@mythril]: https://github.com/mythril -[@Naelyth]: https://github.com/Naelyth -[@NanoSector]: https://github.com/NanoSector -[@ndm2]: https://github.com/ndm2 -[@nicholascus]: https://github.com/nicholascus -[@NickDickinsonWilde]: https://github.com/NickDickinsonWilde -[@nkovacs]: https://github.com/nkovacs -[@nubs]: https://github.com/nubs -[@o5]: https://github.com/o5 -[@ofbeaton]: https://github.com/ofbeaton -[@olemartinorg]: https://github.com/olemartinorg -[@ondrejmirtes]: https://github.com/ondrejmirtes -[@orx0r]: https://github.com/orx0r -[@ostrolucky]: https://github.com/ostrolucky -[@peterwilsoncc]: https://github.com/peterwilsoncc -[@pfrenssen]: https://github.com/pfrenssen -[@phil-davis]: https://github.com/phil-davis -[@photodude]: https://github.com/photodude -[@przemekhernik]: https://github.com/przemekhernik -[@r3nat]: https://github.com/r3nat -[@raul338]: https://github.com/raul338 -[@realmfoo]: https://github.com/realmfoo -[@remicollet]: https://github.com/remicollet -[@renaatdemuynck]: https://github.com/renaatdemuynck -[@renan]: https://github.com/renan -[@rhorber]: https://github.com/rhorber -[@rmccue]: https://github.com/rmccue -[@robocoder]: https://github.com/robocoder -[@rodrigoprimo]: https://github.com/rodrigoprimo -[@rogeriopradoj]: https://github.com/rogeriopradoj -[@rovangju]: https://github.com/rovangju -[@rvanvelzen]: https://github.com/rvanvelzen -[@saltybeagle]: https://github.com/saltybeagle -[@samlev]: https://github.com/samlev -[@scato]: https://github.com/scato -[@schlessera]: https://github.com/schlessera -[@schnittstabil]: https://github.com/schnittstabil -[@sebastianbergmann]: https://github.com/sebastianbergmann -[@sertand]: https://github.com/sertand -[@shanethehat]: https://github.com/shanethehat -[@shivammathur]: https://github.com/shivammathur -[@simonsan]: https://github.com/simonsan -[@sjlangley]: https://github.com/sjlangley -[@sserbin]: https://github.com/sserbin -[@stefanlenselink]: https://github.com/stefanlenselink -[@SteveTalbot]: https://github.com/SteveTalbot -[@storeman]: https://github.com/storeman -[@stronk7]: https://github.com/stronk7 -[@svycka]: https://github.com/svycka -[@syranez]: https://github.com/syranez -[@tasuki]: https://github.com/tasuki -[@tim-bezhashvyly]: https://github.com/tim-bezhashvyly -[@TomHAnderson]: https://github.com/TomHAnderson -[@thewilkybarkid]: https://github.com/thewilkybarkid -[@thiemowmde]: https://github.com/thiemowmde -[@thomasjfox]: https://github.com/thomasjfox -[@till]: https://github.com/till -[@timoschinkel]: https://github.com/timoschinkel -[@TimWolla]: https://github.com/TimWolla -[@uniquexor]: https://github.com/uniquexor -[@valorin]: https://github.com/valorin -[@VasekPurchart]: https://github.com/VasekPurchart -[@VincentLanglet]: https://github.com/VincentLanglet -[@waltertamboer]: https://github.com/waltertamboer -[@westonruter]: https://github.com/westonruter -[@willemstuursma]: https://github.com/willemstuursma -[@wimg]: https://github.com/wimg -[@wvega]: https://github.com/wvega -[@xalopp]: https://github.com/xalopp -[@xjm]: https://github.com/xjm -[@xt99]: https://github.com/xt99 -[@yesmeck]: https://github.com/yesmeck -[@zBart]: https://github.com/zBart -[pear-adviva]: https://pear.php.net/user/adviva -[pear-bakert]: https://pear.php.net/user/bakert -[pear-bjorn]: https://pear.php.net/user/bjorn -[pear-boxgav]: https://pear.php.net/user/boxgav -[pear-burci]: https://pear.php.net/user/burci -[pear-conf]: https://pear.php.net/user/conf -[pear-cwiedmann]: https://pear.php.net/user/cwiedmann -[pear-dollyaswin]: https://pear.php.net/user/dollyaswin -[pear-dvino]: https://pear.php.net/user/dvino -[pear-et3w503]: https://pear.php.net/user/et3w503 -[pear-gemineye]: https://pear.php.net/user/gemineye -[pear-kwinahradsky]: https://pear.php.net/user/kwinahradsky -[pear-ljmaskey]: https://pear.php.net/user/ljmaskey -[pear-mccammos]: https://pear.php.net/user/mccammos -[pear-pete]: https://pear.php.net/user/pete -[pear-recurser]: https://pear.php.net/user/recurser -[pear-renoiv]: https://pear.php.net/user/renoiv -[pear-rquadling]: https://pear.php.net/user/rquadling -[pear-ryba]: https://pear.php.net/user/ryba -[pear-thezero]: https://pear.php.net/user/thezero -[pear-thing2b]: https://pear.php.net/user/thing2b -[pear-tomdesp]: https://pear.php.net/user/tomdesp -[pear-troehr]: https://pear.php.net/user/troehr -[pear-weirdan]: https://pear.php.net/user/weirdan -[pear-wloche]: https://pear.php.net/user/wloche -[pear-woellchen]: https://pear.php.net/user/woellchen -[pear-youngian]: https://pear.php.net/user/youngian diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer.conf b/vendor/squizlabs/php_codesniffer/CodeSniffer.conf deleted file mode 100644 index 164afd3..0000000 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer.conf +++ /dev/null @@ -1,6 +0,0 @@ - '../../phpcompatibility/php-compatibility,../../phpcompatibility/phpcompatibility-paragonie,../../phpcompatibility/phpcompatibility-wp,../../phpcsstandards/phpcsextra,../../phpcsstandards/phpcsutils,../../wp-coding-standards/wpcs', - 'default_standard' => 'WordPress', -); -?> \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer.conf.dist b/vendor/squizlabs/php_codesniffer/CodeSniffer.conf.dist deleted file mode 100644 index e7be332..0000000 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer.conf.dist +++ /dev/null @@ -1,9 +0,0 @@ - 'PSR2', - 'report_format' => 'summary', - 'show_warnings' => '0', - 'show_progress' => '1', - 'report_width' => '120', -]; -?> diff --git a/vendor/squizlabs/php_codesniffer/README.md b/vendor/squizlabs/php_codesniffer/README.md deleted file mode 100644 index 8278abe..0000000 --- a/vendor/squizlabs/php_codesniffer/README.md +++ /dev/null @@ -1,153 +0,0 @@ -# PHP_CodeSniffer - - - -> [!NOTE] -> This package is the official continuation of the now abandoned [PHP_CodeSniffer package which was created by Squizlabs](https://github.com/squizlabs/PHP_CodeSniffer). - -## About - -PHP_CodeSniffer is a set of two PHP scripts; the main `phpcs` script that tokenizes PHP, JavaScript and CSS files to detect violations of a defined coding standard, and a second `phpcbf` script to automatically correct coding standard violations. PHP_CodeSniffer is an essential development tool that ensures your code remains clean and consistent. - - -## Requirements - -PHP_CodeSniffer requires PHP version 5.4.0 or greater, although individual sniffs may have additional requirements such as external applications and scripts. See the [Configuration Options manual page](https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki/Configuration-Options) for a list of these requirements. - -If you're using PHP_CodeSniffer as part of a team, or you're running it on a [CI](https://en.wikipedia.org/wiki/Continuous_integration) server, you may want to configure your project's settings [using a configuration file](https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki/Advanced-Usage#using-a-default-configuration-file). - - -## Installation - -The easiest way to get started with PHP_CodeSniffer is to download the Phar files for each of the commands: -```bash -# Download using curl -curl -OL https://phars.phpcodesniffer.com/phpcs.phar -curl -OL https://phars.phpcodesniffer.com/phpcbf.phar - -# Or download using wget -wget https://phars.phpcodesniffer.com/phpcs.phar -wget https://phars.phpcodesniffer.com/phpcbf.phar - -# Then test the downloaded PHARs -php phpcs.phar -h -php phpcbf.phar -h -``` - -These Phars are signed with the official Release key for PHPCS with the -fingerprint `D91D 8696 3AF3 A29B 6520 4622 97B0 2DD8 E507 1466`. - -As of PHP_CodeSniffer 3.10.3, the provenance of PHAR files associated with a release can be verified via [GitHub Artifact Attestations](https://docs.github.com/en/actions/how-tos/secure-your-work/use-artifact-attestations/use-artifact-attestations) using the [GitHub CLI tool](https://cli.github.com/) with the following command: `gh attestation verify [phpcs|phpcbf].phar -o PHPCSStandards`. - -### Composer -If you use Composer, you can install PHP_CodeSniffer system-wide with the following command: -```bash -composer global require "squizlabs/php_codesniffer=*" -``` -Make sure you have the composer bin dir in your PATH. The default value is `~/.composer/vendor/bin/`, but you can check the value that you need to use by running `composer global config bin-dir --absolute`. - -Or alternatively, include a dependency for `squizlabs/php_codesniffer` in your `composer.json` file. For example: - -```json -{ - "require-dev": { - "squizlabs/php_codesniffer": "^3.0" - } -} -``` - -You will then be able to run PHP_CodeSniffer from the vendor bin directory: -```bash -./vendor/bin/phpcs -h -./vendor/bin/phpcbf -h -``` - -### Phive -If you use Phive, you can install PHP_CodeSniffer as a project tool using the following commands: -```bash -phive install --trust-gpg-keys D91D86963AF3A29B6520462297B02DD8E5071466 phpcs -phive install --trust-gpg-keys D91D86963AF3A29B6520462297B02DD8E5071466 phpcbf -``` -You will then be able to run PHP_CodeSniffer from the `tools` directory: -```bash -./tools/phpcs -h -./tools/phpcbf -h -``` - -### Git Clone -You can also download the PHP_CodeSniffer source and run the `phpcs` and `phpcbf` commands directly from the Git clone: -```bash -git clone https://github.com/PHPCSStandards/PHP_CodeSniffer.git -cd PHP_CodeSniffer -php bin/phpcs -h -php bin/phpcbf -h -``` - -## Getting Started - -The default coding standard used by PHP_CodeSniffer is the PEAR coding standard. To check a file against the PEAR coding standard, simply specify the file's location: -```bash -phpcs /path/to/code/myfile.php -``` -Or if you wish to check an entire directory you can specify the directory location instead of a file. -```bash -phpcs /path/to/code-directory -``` -If you wish to check your code against the PSR-12 coding standard, use the `--standard` command line argument: -```bash -phpcs --standard=PSR12 /path/to/code-directory -``` - -If PHP_CodeSniffer finds any coding standard errors, a report will be shown after running the command. - -Full usage information and example reports are available on the [usage page](https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki/Usage). - -## Documentation - -The documentation for PHP_CodeSniffer is available on the [GitHub wiki](https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki). - -## Issues - -Bug reports and feature requests can be submitted on the [GitHub Issue Tracker](https://github.com/PHPCSStandards/PHP_CodeSniffer/issues). - -## Contributing - -See [CONTRIBUTING.md](.github/CONTRIBUTING.md) for information. - -## Versioning - -PHP_CodeSniffer uses a `MAJOR.MINOR.PATCH` version number format. - -The `MAJOR` version is incremented when: -- backwards-incompatible changes are made to how the `phpcs` or `phpcbf` commands are used, or -- backwards-incompatible changes are made to the `ruleset.xml` format, or -- backwards-incompatible changes are made to the API used by sniff developers, or -- custom PHP_CodeSniffer token types are removed, or -- existing sniffs are removed from PHP_CodeSniffer entirely - -The `MINOR` version is incremented when: -- new backwards-compatible features are added to the `phpcs` and `phpcbf` commands, or -- backwards-compatible changes are made to the `ruleset.xml` format, or -- backwards-compatible changes are made to the API used by sniff developers, or -- new sniffs are added to an included standard, or -- existing sniffs are removed from an included standard - -> NOTE: Backwards-compatible changes to the API used by sniff developers will allow an existing sniff to continue running without producing fatal errors but may not result in the sniff reporting the same errors as it did previously without changes being required. - -The `PATCH` version is incremented when: -- backwards-compatible bug fixes are made - -> NOTE: As PHP_CodeSniffer exists to report and fix issues, most bugs are the result of coding standard errors being incorrectly reported or coding standard errors not being reported when they should be. This means that the messages produced by PHP_CodeSniffer, and the fixes it makes, are likely to be different between PATCH versions. diff --git a/vendor/squizlabs/php_codesniffer/autoload.php b/vendor/squizlabs/php_codesniffer/autoload.php deleted file mode 100644 index 2ab5e56..0000000 --- a/vendor/squizlabs/php_codesniffer/autoload.php +++ /dev/null @@ -1,346 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer; - -use Composer\Autoload\ClassLoader; -use Exception; - -if (class_exists('PHP_CodeSniffer\Autoload', false) === false) { - class Autoload - { - - /** - * The composer autoloader. - * - * @var \Composer\Autoload\ClassLoader|false|null The autoloader object or FALSE if no Composer autoloader could - * be found. NULL when this hasn't been determined yet. - */ - private static $composerAutoloader = null; - - /** - * A mapping of file names to class names. - * - * @var array - */ - private static $loadedClasses = []; - - /** - * A mapping of class names to file names. - * - * @var array - */ - private static $loadedFiles = []; - - /** - * A list of additional directories to search during autoloading. - * - * This is typically a list of coding standard directories. - * - * @var string[] - */ - private static $searchPaths = []; - - - /** - * Loads a class. - * - * This method only loads classes that exist in the PHP_CodeSniffer namespace. - * All other classes are ignored and loaded by subsequent autoloaders. - * - * @param string $class The name of the class to load. - * - * @return bool - */ - public static function load($class) - { - // Include the composer autoloader if there is one, but re-register it - // so this autoloader runs before the composer one as we need to include - // all files so we can figure out what the class/interface/trait name is. - if (self::$composerAutoloader === null) { - // Make sure we don't try to load any of Composer's classes - // while the autoloader is being setup. - if (strpos($class, 'Composer\\') === 0) { - return false; - } - - if (strpos(__DIR__, 'phar://') !== 0 - && @file_exists(__DIR__.'/../../autoload.php') === true - ) { - self::$composerAutoloader = include __DIR__.'/../../autoload.php'; - if (self::$composerAutoloader instanceof ClassLoader) { - self::$composerAutoloader->unregister(); - self::$composerAutoloader->register(); - } else { - // Something went wrong, so keep going without the autoloader - // although namespaced sniffs might error. - self::$composerAutoloader = false; - } - } else { - self::$composerAutoloader = false; - } - }//end if - - $ds = DIRECTORY_SEPARATOR; - $path = false; - - if (substr($class, 0, 16) === 'PHP_CodeSniffer\\') { - if (substr($class, 0, 22) === 'PHP_CodeSniffer\Tests\\') { - $isInstalled = !is_dir(__DIR__.$ds.'tests'); - if ($isInstalled === false) { - $path = __DIR__.$ds.'tests'; - } else { - $path = '@test_dir@'.$ds.'PHP_CodeSniffer'.$ds.'CodeSniffer'; - } - - $path .= $ds.substr(str_replace('\\', $ds, $class), 22).'.php'; - } else { - $path = __DIR__.$ds.'src'.$ds.substr(str_replace('\\', $ds, $class), 16).'.php'; - } - } - - // See if the composer autoloader knows where the class is. - if ($path === false && self::$composerAutoloader !== false) { - $path = self::$composerAutoloader->findFile($class); - } - - // See if the class is inside one of our alternate search paths. - if ($path === false) { - foreach (self::$searchPaths as $searchPath => $nsPrefix) { - $className = $class; - if ($nsPrefix !== '' && substr($class, 0, strlen($nsPrefix)) === $nsPrefix) { - $className = substr($class, (strlen($nsPrefix) + 1)); - } - - $path = $searchPath.$ds.str_replace('\\', $ds, $className).'.php'; - if (is_file($path) === true) { - break; - } - - $path = false; - } - } - - if ($path !== false && is_file($path) === true) { - self::loadFile($path); - return true; - } - - return false; - - }//end load() - - - /** - * Includes a file and tracks what class or interface was loaded as a result. - * - * @param string $path The path of the file to load. - * - * @return string The fully qualified name of the class in the loaded file. - */ - public static function loadFile($path) - { - if (strpos(__DIR__, 'phar://') !== 0) { - $path = realpath($path); - if ($path === false) { - return false; - } - } - - if (isset(self::$loadedClasses[$path]) === true) { - return self::$loadedClasses[$path]; - } - - $classesBeforeLoad = [ - 'classes' => get_declared_classes(), - 'interfaces' => get_declared_interfaces(), - 'traits' => get_declared_traits(), - ]; - - include $path; - - $classesAfterLoad = [ - 'classes' => get_declared_classes(), - 'interfaces' => get_declared_interfaces(), - 'traits' => get_declared_traits(), - ]; - - $className = self::determineLoadedClass($classesBeforeLoad, $classesAfterLoad); - - self::$loadedClasses[$path] = $className; - self::$loadedFiles[$className] = $path; - return self::$loadedClasses[$path]; - - }//end loadFile() - - - /** - * Determine which class was loaded based on the before and after lists of loaded classes. - * - * @param array> $classesBeforeLoad The classes/interfaces/traits before the file was included. - * @param array> $classesAfterLoad The classes/interfaces/traits after the file was included. - * - * @return string The fully qualified name of the class in the loaded file. - */ - public static function determineLoadedClass($classesBeforeLoad, $classesAfterLoad) - { - $className = null; - - $newClasses = array_diff($classesAfterLoad['classes'], $classesBeforeLoad['classes']); - if (PHP_VERSION_ID < 70400) { - $newClasses = array_reverse($newClasses); - } - - // Since PHP 7.4 get_declared_classes() does not guarantee any order, making - // it impossible to use order to determine which is the parent and which is the child. - // Let's reduce the list of candidates by removing all the classes known to be "parents". - // That way, at the end, only the "main" class just included will remain. - $newClasses = array_reduce( - $newClasses, - static function ($remaining, $current) { - return array_diff($remaining, class_parents($current)); - }, - $newClasses - ); - - foreach ($newClasses as $name) { - if (isset(self::$loadedFiles[$name]) === false) { - $className = $name; - break; - } - } - - if ($className === null) { - $newClasses = array_reverse(array_diff($classesAfterLoad['interfaces'], $classesBeforeLoad['interfaces'])); - foreach ($newClasses as $name) { - if (isset(self::$loadedFiles[$name]) === false) { - $className = $name; - break; - } - } - } - - if ($className === null) { - $newClasses = array_reverse(array_diff($classesAfterLoad['traits'], $classesBeforeLoad['traits'])); - foreach ($newClasses as $name) { - if (isset(self::$loadedFiles[$name]) === false) { - $className = $name; - break; - } - } - } - - return $className; - - }//end determineLoadedClass() - - - /** - * Adds a directory to search during autoloading. - * - * @param string $path The path to the directory to search. - * @param string $nsPrefix The namespace prefix used by files under this path. - * - * @return void - */ - public static function addSearchPath($path, $nsPrefix='') - { - self::$searchPaths[$path] = rtrim(trim((string) $nsPrefix), '\\'); - - }//end addSearchPath() - - - /** - * Retrieve the namespaces and paths registered by external standards. - * - * @return array - */ - public static function getSearchPaths() - { - return self::$searchPaths; - - }//end getSearchPaths() - - - /** - * Gets the class name for the given file path. - * - * @param string $path The name of the file. - * - * @throws \Exception If the file path has not been loaded. - * @return string - */ - public static function getLoadedClassName($path) - { - if (isset(self::$loadedClasses[$path]) === false) { - throw new Exception("Cannot get class name for $path; file has not been included"); - } - - return self::$loadedClasses[$path]; - - }//end getLoadedClassName() - - - /** - * Gets the file path for the given class name. - * - * @param string $class The name of the class. - * - * @throws \Exception If the class name has not been loaded. - * @return string - */ - public static function getLoadedFileName($class) - { - if (isset(self::$loadedFiles[$class]) === false) { - throw new Exception("Cannot get file name for $class; class has not been included"); - } - - return self::$loadedFiles[$class]; - - }//end getLoadedFileName() - - - /** - * Gets the mapping of file names to class names. - * - * @return array - */ - public static function getLoadedClasses() - { - return self::$loadedClasses; - - }//end getLoadedClasses() - - - /** - * Gets the mapping of class names to file names. - * - * @return array - */ - public static function getLoadedFiles() - { - return self::$loadedFiles; - - }//end getLoadedFiles() - - - }//end class - - // Register the autoloader before any existing autoloaders to ensure - // it gets a chance to hear about every autoload request, and record - // the file and class name for it. - spl_autoload_register(__NAMESPACE__.'\Autoload::load', true, true); -}//end if diff --git a/vendor/squizlabs/php_codesniffer/bin/phpcbf b/vendor/squizlabs/php_codesniffer/bin/phpcbf deleted file mode 100644 index 7760c32..0000000 --- a/vendor/squizlabs/php_codesniffer/bin/phpcbf +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env php - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -require_once __DIR__.'/../autoload.php'; - -$runner = new PHP_CodeSniffer\Runner(); -$exitCode = $runner->runPHPCBF(); -exit($exitCode); diff --git a/vendor/squizlabs/php_codesniffer/bin/phpcbf.bat b/vendor/squizlabs/php_codesniffer/bin/phpcbf.bat deleted file mode 100644 index 047710e..0000000 --- a/vendor/squizlabs/php_codesniffer/bin/phpcbf.bat +++ /dev/null @@ -1,10 +0,0 @@ -@echo off -REM PHP Code Beautifier and Fixer fixes violations of a defined coding standard. -REM -REM @author Greg Sherwood -REM @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) -REM @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - -set PHPBIN=php - -"%PHPBIN%" "%~dp0\phpcbf" %* diff --git a/vendor/squizlabs/php_codesniffer/bin/phpcs b/vendor/squizlabs/php_codesniffer/bin/phpcs deleted file mode 100644 index c6a2112..0000000 --- a/vendor/squizlabs/php_codesniffer/bin/phpcs +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env php - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -require_once __DIR__.'/../autoload.php'; - -$runner = new PHP_CodeSniffer\Runner(); -$exitCode = $runner->runPHPCS(); -exit($exitCode); diff --git a/vendor/squizlabs/php_codesniffer/bin/phpcs.bat b/vendor/squizlabs/php_codesniffer/bin/phpcs.bat deleted file mode 100644 index 159778a..0000000 --- a/vendor/squizlabs/php_codesniffer/bin/phpcs.bat +++ /dev/null @@ -1,10 +0,0 @@ -@echo off -REM PHP_CodeSniffer detects violations of a defined coding standard. -REM -REM @author Greg Sherwood -REM @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) -REM @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - -set PHPBIN=php - -"%PHPBIN%" "%~dp0\phpcs" %* diff --git a/vendor/squizlabs/php_codesniffer/composer.json b/vendor/squizlabs/php_codesniffer/composer.json deleted file mode 100644 index 0a47a23..0000000 --- a/vendor/squizlabs/php_codesniffer/composer.json +++ /dev/null @@ -1,85 +0,0 @@ -{ - "name": "squizlabs/php_codesniffer", - "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", - "license": "BSD-3-Clause", - "type": "library", - "keywords": [ - "phpcs", - "standards", - "static analysis" - ], - "authors": [ - { - "name": "Greg Sherwood", - "role": "Former lead" - }, - { - "name": "Juliette Reinders Folmer", - "role": "Current lead" - }, - { - "name": "Contributors", - "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" - } - ], - "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", - "support": { - "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", - "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki", - "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", - "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy" - }, - "require": { - "php": ">=5.4.0", - "ext-simplexml": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*" - }, - "require-dev": { - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" - }, - "bin": [ - "bin/phpcbf", - "bin/phpcs" - ], - "config": { - "lock": false - }, - "scripts": { - "cs": [ - "@php ./bin/phpcs" - ], - "cbf": [ - "@php ./bin/phpcbf" - ], - "test": [ - "Composer\\Config::disableProcessTimeout", - "@php ./vendor/phpunit/phpunit/phpunit tests/AllTests.php --no-coverage" - ], - "coverage": [ - "Composer\\Config::disableProcessTimeout", - "@php ./vendor/phpunit/phpunit/phpunit tests/AllTests.php -d max_execution_time=0" - ], - "coverage-local": [ - "Composer\\Config::disableProcessTimeout", - "@php ./vendor/phpunit/phpunit/phpunit tests/AllTests.php --coverage-html ./build/coverage-html -d max_execution_time=0" - ], - "build": [ - "Composer\\Config::disableProcessTimeout", - "@php -d phar.readonly=0 -f ./scripts/build-phar.php" - ], - "check-all": [ - "@cs", - "@test" - ] - }, - "scripts-descriptions": { - "cs": "Check for code style violations.", - "cbf": "Fix code style violations.", - "test": "Run the unit tests without code coverage.", - "coverage": "Run the unit tests with code coverage.", - "coverage-local": "Run the unit tests with code coverage and generate an HTML report in a 'build' directory.", - "build": "Create PHAR files for PHPCS and PHPCBF.", - "check-all": "Run all checks (phpcs, tests)." - } -} diff --git a/vendor/squizlabs/php_codesniffer/licence.txt b/vendor/squizlabs/php_codesniffer/licence.txt deleted file mode 100644 index c7e8000..0000000 --- a/vendor/squizlabs/php_codesniffer/licence.txt +++ /dev/null @@ -1,25 +0,0 @@ -Copyright (c) 2012, Squiz Pty Ltd (ABN 77 084 670 600) -Copyright (c) 2023, PHPCSStandards and contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/squizlabs/php_codesniffer/phpcs.xsd b/vendor/squizlabs/php_codesniffer/phpcs.xsd deleted file mode 100644 index d93dd86..0000000 --- a/vendor/squizlabs/php_codesniffer/phpcs.xsd +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Config.php b/vendor/squizlabs/php_codesniffer/src/Config.php deleted file mode 100644 index 2aaf151..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Config.php +++ /dev/null @@ -1,1760 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer; - -use Exception; -use Phar; -use PHP_CodeSniffer\Exceptions\DeepExitException; -use PHP_CodeSniffer\Exceptions\RuntimeException; -use PHP_CodeSniffer\Util\Common; -use PHP_CodeSniffer\Util\Help; -use PHP_CodeSniffer\Util\Standards; - -/** - * Stores the configuration used to run PHPCS and PHPCBF. - * - * @property string[] $files The files and directories to check. - * @property string[] $standards The standards being used for checking. - * @property int $verbosity How verbose the output should be. - * 0: no unnecessary output - * 1: basic output for files being checked - * 2: ruleset and file parsing output - * 3: sniff execution output - * @property bool $interactive Enable interactive checking mode. - * @property int $parallel Check files in parallel. - * @property bool $cache Enable the use of the file cache. - * @property string $cacheFile Path to the file where the cache data should be written - * @property bool $colors Display colours in output. - * @property bool $explain Explain the coding standards. - * @property bool $local Process local files in directories only (no recursion). - * @property bool $showSources Show sniff source codes in report output. - * @property bool $showProgress Show basic progress information while running. - * @property bool $quiet Quiet mode; disables progress and verbose output. - * @property bool $annotations Process phpcs: annotations. - * @property int $tabWidth How many spaces each tab is worth. - * @property string $encoding The encoding of the files being checked. - * @property string[] $sniffs The sniffs that should be used for checking. - * If empty, all sniffs in the supplied standards will be used. - * @property string[] $exclude The sniffs that should be excluded from checking. - * If empty, all sniffs in the supplied standards will be used. - * @property string[] $ignored Regular expressions used to ignore files and folders during checking. - * @property string $reportFile A file where the report output should be written. - * @property string $generator The documentation generator to use. - * @property string $filter The filter to use for the run. - * @property string[] $bootstrap One of more files to include before the run begins. - * @property int|string $reportWidth The maximum number of columns that reports should use for output. - * Set to "auto" for have this value changed to the width of the terminal. - * @property int $errorSeverity The minimum severity an error must have to be displayed. - * @property int $warningSeverity The minimum severity a warning must have to be displayed. - * @property bool $recordErrors Record the content of error messages as well as error counts. - * @property string $suffix A suffix to add to fixed files. - * @property string|null $basepath A file system location to strip from the paths of files shown in reports. - * @property bool $stdin Read content from STDIN instead of supplied files. - * @property string $stdinContent Content passed directly to PHPCS on STDIN. - * @property string $stdinPath The path to use for content passed on STDIN. - * @property bool $trackTime Whether or not to track sniff run time. - * - * @property array $extensions File extensions that should be checked, and what tokenizer to use. - * E.g., array('inc' => 'PHP'); - * @property array $reports The reports to use for printing output after the run. - * The format of the array is: - * array( - * 'reportName1' => 'outputFile', - * 'reportName2' => null, - * ); - * If the array value is NULL, the report will be written to the screen. - * - * @property string[] $unknown Any arguments gathered on the command line that are unknown to us. - * E.g., using `phpcs -c` will give array('c'); - */ -class Config -{ - - /** - * The current version. - * - * @var string - */ - const VERSION = '3.13.5'; - - /** - * Package stability; either stable, beta or alpha. - * - * @var string - */ - const STABILITY = 'stable'; - - /** - * Default report width when no report width is provided and 'auto' does not yield a valid width. - * - * @var int - */ - const DEFAULT_REPORT_WIDTH = 80; - - /** - * An array of settings that PHPCS and PHPCBF accept. - * - * This array is not meant to be accessed directly. Instead, use the settings - * as if they are class member vars so the __get() and __set() magic methods - * can be used to validate the values. For example, to set the verbosity level to - * level 2, use $this->verbosity = 2; instead of accessing this property directly. - * - * Each of these settings is described in the class comment property list. - * - * @var array - */ - private $settings = [ - 'files' => null, - 'standards' => null, - 'verbosity' => null, - 'interactive' => null, - 'parallel' => null, - 'cache' => null, - 'cacheFile' => null, - 'colors' => null, - 'explain' => null, - 'local' => null, - 'showSources' => null, - 'showProgress' => null, - 'quiet' => null, - 'annotations' => null, - 'tabWidth' => null, - 'encoding' => null, - 'extensions' => null, - 'sniffs' => null, - 'exclude' => null, - 'ignored' => null, - 'reportFile' => null, - 'generator' => null, - 'filter' => null, - 'bootstrap' => null, - 'reports' => null, - 'basepath' => null, - 'reportWidth' => null, - 'errorSeverity' => null, - 'warningSeverity' => null, - 'recordErrors' => null, - 'suffix' => null, - 'stdin' => null, - 'stdinContent' => null, - 'stdinPath' => null, - 'trackTime' => null, - 'unknown' => null, - ]; - - /** - * Whether or not to kill the process when an unknown command line arg is found. - * - * If FALSE, arguments that are not command line options or file/directory paths - * will be ignored and execution will continue. These values will be stored in - * $this->unknown. - * - * @var boolean - */ - public $dieOnUnknownArg; - - /** - * The current command line arguments we are processing. - * - * @var string[] - */ - private $cliArgs = []; - - /** - * A list of valid generators. - * - * {@internal Once support for PHP < 5.6 is dropped, this property should be refactored into a - * class constant.} - * - * @var array Keys are the lowercase version of the generator name, while values - * are the associated PHP generator class. - */ - private $validGenerators = [ - 'text' => 'Text', - 'html' => 'HTML', - 'markdown' => 'Markdown', - ]; - - /** - * Command line values that the user has supplied directly. - * - * @var array> - */ - private static $overriddenDefaults = []; - - /** - * Config file data that has been loaded for the run. - * - * @var array - */ - private static $configData = null; - - /** - * The full path to the config data file that has been loaded. - * - * @var string - */ - private static $configDataFile = null; - - /** - * Automatically discovered executable utility paths. - * - * @var array - */ - private static $executablePaths = []; - - - /** - * Get the value of an inaccessible property. - * - * @param string $name The name of the property. - * - * @return mixed - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If the setting name is invalid. - */ - public function __get($name) - { - if (array_key_exists($name, $this->settings) === false) { - throw new RuntimeException("ERROR: unable to get value of property \"$name\""); - } - - // Figure out what the terminal width needs to be for "auto". - if ($name === 'reportWidth' && $this->settings[$name] === 'auto') { - if (function_exists('shell_exec') === true) { - $dimensions = shell_exec('stty size 2>&1'); - if (is_string($dimensions) === true && preg_match('|\d+ (\d+)|', $dimensions, $matches) === 1) { - $this->settings[$name] = (int) $matches[1]; - } - } - - if ($this->settings[$name] === 'auto') { - // If shell_exec wasn't available or didn't yield a usable value, set to the default. - // This will prevent subsequent retrievals of the reportWidth from making another call to stty. - $this->settings[$name] = self::DEFAULT_REPORT_WIDTH; - } - } - - return $this->settings[$name]; - - }//end __get() - - - /** - * Set the value of an inaccessible property. - * - * @param string $name The name of the property. - * @param mixed $value The value of the property. - * - * @return void - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If the setting name is invalid. - */ - public function __set($name, $value) - { - if (array_key_exists($name, $this->settings) === false) { - throw new RuntimeException("Can't __set() $name; setting doesn't exist"); - } - - switch ($name) { - case 'reportWidth' : - if (is_string($value) === true && $value === 'auto') { - // Nothing to do. Leave at 'auto'. - break; - } - - if (is_int($value) === true) { - $value = abs($value); - } else if (is_string($value) === true && preg_match('`^\d+$`', $value) === 1) { - $value = (int) $value; - } else { - $value = self::DEFAULT_REPORT_WIDTH; - } - break; - - case 'standards' : - $cleaned = []; - - // Check if the standard name is valid, or if the case is invalid. - $installedStandards = Standards::getInstalledStandards(); - foreach ($value as $standard) { - foreach ($installedStandards as $validStandard) { - if (strtolower($standard) === strtolower($validStandard)) { - $standard = $validStandard; - break; - } - } - - $cleaned[] = $standard; - } - - $value = $cleaned; - break; - - // Only track time when explicitly needed. - case 'verbosity': - if ($value > 2) { - $this->settings['trackTime'] = true; - } - break; - case 'reports': - $reports = array_change_key_case($value, CASE_LOWER); - if (array_key_exists('performance', $reports) === true) { - $this->settings['trackTime'] = true; - } - break; - - default : - // No validation required. - break; - }//end switch - - $this->settings[$name] = $value; - - }//end __set() - - - /** - * Check if the value of an inaccessible property is set. - * - * @param string $name The name of the property. - * - * @return bool - */ - public function __isset($name) - { - return isset($this->settings[$name]); - - }//end __isset() - - - /** - * Unset the value of an inaccessible property. - * - * @param string $name The name of the property. - * - * @return void - */ - public function __unset($name) - { - $this->settings[$name] = null; - - }//end __unset() - - - /** - * Get the array of all config settings. - * - * @return array - */ - public function getSettings() - { - return $this->settings; - - }//end getSettings() - - - /** - * Set the array of all config settings. - * - * @param array $settings The array of config settings. - * - * @return void - */ - public function setSettings($settings) - { - return $this->settings = $settings; - - }//end setSettings() - - - /** - * Creates a Config object and populates it with command line values. - * - * @param array $cliArgs An array of values gathered from CLI args. - * @param bool $dieOnUnknownArg Whether or not to kill the process when an - * unknown command line arg is found. - * - * @return void - */ - public function __construct(array $cliArgs=[], $dieOnUnknownArg=true) - { - if (defined('PHP_CODESNIFFER_IN_TESTS') === true) { - // Let everything through during testing so that we can - // make use of PHPUnit command line arguments as well. - $this->dieOnUnknownArg = false; - } else { - $this->dieOnUnknownArg = $dieOnUnknownArg; - } - - if (empty($cliArgs) === true) { - $cliArgs = $_SERVER['argv']; - array_shift($cliArgs); - } - - $this->restoreDefaults(); - $this->setCommandLineValues($cliArgs); - - if (isset(self::$overriddenDefaults['standards']) === false) { - // They did not supply a standard to use. - // Look for a default ruleset in the current directory or higher. - $currentDir = getcwd(); - - $defaultFiles = [ - '.phpcs.xml', - 'phpcs.xml', - '.phpcs.xml.dist', - 'phpcs.xml.dist', - ]; - - do { - foreach ($defaultFiles as $defaultFilename) { - $default = $currentDir.DIRECTORY_SEPARATOR.$defaultFilename; - if (is_file($default) === true) { - $this->standards = [$default]; - break(2); - } - } - - $lastDir = $currentDir; - $currentDir = dirname($currentDir); - } while ($currentDir !== '.' && $currentDir !== $lastDir && Common::isReadable($currentDir) === true); - }//end if - - if (defined('STDIN') === false - || stripos(PHP_OS, 'WIN') === 0 - ) { - return; - } - - $handle = fopen('php://stdin', 'r'); - - // Check for content on STDIN. - if ($this->stdin === true - || (Common::isStdinATTY() === false - && feof($handle) === false) - ) { - $readStreams = [$handle]; - $writeSteams = null; - - $fileContents = ''; - while (is_resource($handle) === true && feof($handle) === false) { - // Set a timeout of 200ms. - if (stream_select($readStreams, $writeSteams, $writeSteams, 0, 200000) === 0) { - break; - } - - $fileContents .= fgets($handle); - } - - if (trim($fileContents) !== '') { - $this->stdin = true; - $this->stdinContent = $fileContents; - self::$overriddenDefaults['stdin'] = true; - self::$overriddenDefaults['stdinContent'] = true; - } - }//end if - - fclose($handle); - - }//end __construct() - - - /** - * Set the command line values. - * - * @param array $args An array of command line arguments to set. - * - * @return void - */ - public function setCommandLineValues($args) - { - $this->cliArgs = $args; - $numArgs = count($args); - - for ($i = 0; $i < $numArgs; $i++) { - $arg = $this->cliArgs[$i]; - if ($arg === '') { - continue; - } - - if ($arg[0] === '-') { - if ($arg === '-') { - // Asking to read from STDIN. - $this->stdin = true; - self::$overriddenDefaults['stdin'] = true; - continue; - } - - if ($arg === '--') { - // Empty argument, ignore it. - continue; - } - - if ($arg[1] === '-') { - $this->processLongArgument(substr($arg, 2), $i); - } else { - $switches = str_split($arg); - foreach ($switches as $switch) { - if ($switch === '-') { - continue; - } - - $this->processShortArgument($switch, $i); - } - } - } else { - $this->processUnknownArgument($arg, $i); - }//end if - }//end for - - }//end setCommandLineValues() - - - /** - * Restore default values for all possible command line arguments. - * - * @return void - */ - public function restoreDefaults() - { - $this->files = []; - $this->standards = ['PEAR']; - $this->verbosity = 0; - $this->interactive = false; - $this->cache = false; - $this->cacheFile = null; - $this->colors = false; - $this->explain = false; - $this->local = false; - $this->showSources = false; - $this->showProgress = false; - $this->quiet = false; - $this->annotations = true; - $this->parallel = 1; - $this->tabWidth = 0; - $this->encoding = 'utf-8'; - $this->extensions = [ - 'php' => 'PHP', - 'inc' => 'PHP', - 'js' => 'JS', - 'css' => 'CSS', - ]; - $this->sniffs = []; - $this->exclude = []; - $this->ignored = []; - $this->reportFile = null; - $this->generator = null; - $this->filter = null; - $this->bootstrap = []; - $this->basepath = null; - $this->reports = ['full' => null]; - $this->reportWidth = 'auto'; - $this->errorSeverity = 5; - $this->warningSeverity = 5; - $this->recordErrors = true; - $this->suffix = ''; - $this->stdin = false; - $this->stdinContent = null; - $this->stdinPath = null; - $this->trackTime = false; - $this->unknown = []; - - $standard = self::getConfigData('default_standard'); - if ($standard !== null) { - $this->standards = explode(',', $standard); - } - - $reportFormat = self::getConfigData('report_format'); - if ($reportFormat !== null) { - $this->reports = [$reportFormat => null]; - } - - $tabWidth = self::getConfigData('tab_width'); - if ($tabWidth !== null) { - $this->tabWidth = (int) $tabWidth; - } - - $encoding = self::getConfigData('encoding'); - if ($encoding !== null) { - $this->encoding = strtolower($encoding); - } - - $severity = self::getConfigData('severity'); - if ($severity !== null) { - $this->errorSeverity = (int) $severity; - $this->warningSeverity = (int) $severity; - } - - $severity = self::getConfigData('error_severity'); - if ($severity !== null) { - $this->errorSeverity = (int) $severity; - } - - $severity = self::getConfigData('warning_severity'); - if ($severity !== null) { - $this->warningSeverity = (int) $severity; - } - - $showWarnings = self::getConfigData('show_warnings'); - if ($showWarnings !== null) { - $showWarnings = (bool) $showWarnings; - if ($showWarnings === false) { - $this->warningSeverity = 0; - } - } - - $reportWidth = self::getConfigData('report_width'); - if ($reportWidth !== null) { - $this->reportWidth = $reportWidth; - } - - $showProgress = self::getConfigData('show_progress'); - if ($showProgress !== null) { - $this->showProgress = (bool) $showProgress; - } - - $quiet = self::getConfigData('quiet'); - if ($quiet !== null) { - $this->quiet = (bool) $quiet; - } - - $colors = self::getConfigData('colors'); - if ($colors !== null) { - $this->colors = (bool) $colors; - } - - if (defined('PHP_CODESNIFFER_IN_TESTS') === false) { - $cache = self::getConfigData('cache'); - if ($cache !== null) { - $this->cache = (bool) $cache; - } - - $parallel = self::getConfigData('parallel'); - if ($parallel !== null) { - $this->parallel = max((int) $parallel, 1); - } - } - - }//end restoreDefaults() - - - /** - * Processes a short (-e) command line argument. - * - * @param string $arg The command line argument. - * @param int $pos The position of the argument on the command line. - * - * @return void - * @throws \PHP_CodeSniffer\Exceptions\DeepExitException - */ - public function processShortArgument($arg, $pos) - { - switch ($arg) { - case 'h': - case '?': - ob_start(); - $this->printUsage(); - $output = ob_get_contents(); - ob_end_clean(); - throw new DeepExitException($output, 0); - case 'i' : - ob_start(); - Standards::printInstalledStandards(); - $output = ob_get_contents(); - ob_end_clean(); - throw new DeepExitException($output, 0); - case 'v' : - if ($this->quiet === true) { - // Ignore when quiet mode is enabled. - break; - } - - $this->verbosity++; - self::$overriddenDefaults['verbosity'] = true; - break; - case 'l' : - $this->local = true; - self::$overriddenDefaults['local'] = true; - break; - case 's' : - $this->showSources = true; - self::$overriddenDefaults['showSources'] = true; - break; - case 'a' : - $this->interactive = true; - self::$overriddenDefaults['interactive'] = true; - break; - case 'e': - $this->explain = true; - self::$overriddenDefaults['explain'] = true; - break; - case 'p' : - if ($this->quiet === true) { - // Ignore when quiet mode is enabled. - break; - } - - $this->showProgress = true; - self::$overriddenDefaults['showProgress'] = true; - break; - case 'q' : - // Quiet mode disables a few other settings as well. - $this->quiet = true; - $this->showProgress = false; - $this->verbosity = 0; - - self::$overriddenDefaults['quiet'] = true; - break; - case 'm' : - $this->recordErrors = false; - self::$overriddenDefaults['recordErrors'] = true; - break; - case 'd' : - $ini = explode('=', $this->cliArgs[($pos + 1)]); - $this->cliArgs[($pos + 1)] = ''; - if (isset($ini[1]) === true) { - ini_set($ini[0], $ini[1]); - } else { - ini_set($ini[0], true); - } - break; - case 'n' : - if (isset(self::$overriddenDefaults['warningSeverity']) === false) { - $this->warningSeverity = 0; - self::$overriddenDefaults['warningSeverity'] = true; - } - break; - case 'w' : - if (isset(self::$overriddenDefaults['warningSeverity']) === false) { - $this->warningSeverity = $this->errorSeverity; - self::$overriddenDefaults['warningSeverity'] = true; - } - break; - default: - if ($this->dieOnUnknownArg === false) { - $unknown = $this->unknown; - $unknown[] = $arg; - $this->unknown = $unknown; - } else { - $this->processUnknownArgument('-'.$arg, $pos); - } - }//end switch - - }//end processShortArgument() - - - /** - * Processes a long (--example) command-line argument. - * - * @param string $arg The command line argument. - * @param int $pos The position of the argument on the command line. - * - * @return void - * @throws \PHP_CodeSniffer\Exceptions\DeepExitException - */ - public function processLongArgument($arg, $pos) - { - switch ($arg) { - case 'help': - ob_start(); - $this->printUsage(); - $output = ob_get_contents(); - ob_end_clean(); - throw new DeepExitException($output, 0); - case 'version': - $output = 'PHP_CodeSniffer version '.self::VERSION.' ('.self::STABILITY.') '; - $output .= 'by Squiz and PHPCSStandards'.PHP_EOL; - throw new DeepExitException($output, 0); - case 'colors': - if (isset(self::$overriddenDefaults['colors']) === true) { - break; - } - - $this->colors = true; - self::$overriddenDefaults['colors'] = true; - break; - case 'no-colors': - if (isset(self::$overriddenDefaults['colors']) === true) { - break; - } - - $this->colors = false; - self::$overriddenDefaults['colors'] = true; - break; - case 'cache': - if (isset(self::$overriddenDefaults['cache']) === true) { - break; - } - - if (defined('PHP_CODESNIFFER_IN_TESTS') === false) { - $this->cache = true; - self::$overriddenDefaults['cache'] = true; - } - break; - case 'no-cache': - if (isset(self::$overriddenDefaults['cache']) === true) { - break; - } - - $this->cache = false; - self::$overriddenDefaults['cache'] = true; - break; - case 'ignore-annotations': - if (isset(self::$overriddenDefaults['annotations']) === true) { - break; - } - - $this->annotations = false; - self::$overriddenDefaults['annotations'] = true; - break; - case 'config-set': - if (isset($this->cliArgs[($pos + 1)]) === false - || isset($this->cliArgs[($pos + 2)]) === false - ) { - $error = 'ERROR: Setting a config option requires a name and value'.PHP_EOL.PHP_EOL; - $error .= $this->printShortUsage(true); - throw new DeepExitException($error, 3); - } - - $key = $this->cliArgs[($pos + 1)]; - $value = $this->cliArgs[($pos + 2)]; - $current = self::getConfigData($key); - - try { - $this->setConfigData($key, $value); - } catch (Exception $e) { - throw new DeepExitException($e->getMessage().PHP_EOL, 3); - } - - $output = 'Using config file: '.self::$configDataFile.PHP_EOL.PHP_EOL; - - if ($current === null) { - $output .= "Config value \"$key\" added successfully".PHP_EOL; - } else { - $output .= "Config value \"$key\" updated successfully; old value was \"$current\"".PHP_EOL; - } - throw new DeepExitException($output, 0); - case 'config-delete': - if (isset($this->cliArgs[($pos + 1)]) === false) { - $error = 'ERROR: Deleting a config option requires the name of the option'.PHP_EOL.PHP_EOL; - $error .= $this->printShortUsage(true); - throw new DeepExitException($error, 3); - } - - $output = 'Using config file: '.self::$configDataFile.PHP_EOL.PHP_EOL; - - $key = $this->cliArgs[($pos + 1)]; - $current = self::getConfigData($key); - if ($current === null) { - $output .= "Config value \"$key\" has not been set".PHP_EOL; - } else { - try { - $this->setConfigData($key, null); - } catch (Exception $e) { - throw new DeepExitException($e->getMessage().PHP_EOL, 3); - } - - $output .= "Config value \"$key\" removed successfully; old value was \"$current\"".PHP_EOL; - } - throw new DeepExitException($output, 0); - case 'config-show': - ob_start(); - $data = self::getAllConfigData(); - echo 'Using config file: '.self::$configDataFile.PHP_EOL.PHP_EOL; - $this->printConfigData($data); - $output = ob_get_contents(); - ob_end_clean(); - throw new DeepExitException($output, 0); - case 'runtime-set': - if (isset($this->cliArgs[($pos + 1)]) === false - || isset($this->cliArgs[($pos + 2)]) === false - ) { - $error = 'ERROR: Setting a runtime config option requires a name and value'.PHP_EOL.PHP_EOL; - $error .= $this->printShortUsage(true); - throw new DeepExitException($error, 3); - } - - $key = $this->cliArgs[($pos + 1)]; - $value = $this->cliArgs[($pos + 2)]; - $this->cliArgs[($pos + 1)] = ''; - $this->cliArgs[($pos + 2)] = ''; - self::setConfigData($key, $value, true); - if (isset(self::$overriddenDefaults['runtime-set']) === false) { - self::$overriddenDefaults['runtime-set'] = []; - } - - self::$overriddenDefaults['runtime-set'][$key] = true; - break; - default: - if (substr($arg, 0, 7) === 'sniffs=') { - if (isset(self::$overriddenDefaults['sniffs']) === true) { - break; - } - - $this->sniffs = $this->parseSniffCodes(substr($arg, 7), 'sniffs'); - self::$overriddenDefaults['sniffs'] = true; - } else if (substr($arg, 0, 8) === 'exclude=') { - if (isset(self::$overriddenDefaults['exclude']) === true) { - break; - } - - $this->exclude = $this->parseSniffCodes(substr($arg, 8), 'exclude'); - self::$overriddenDefaults['exclude'] = true; - } else if (defined('PHP_CODESNIFFER_IN_TESTS') === false - && substr($arg, 0, 6) === 'cache=' - ) { - if ((isset(self::$overriddenDefaults['cache']) === true - && $this->cache === false) - || isset(self::$overriddenDefaults['cacheFile']) === true - ) { - break; - } - - // Turn caching on. - $this->cache = true; - self::$overriddenDefaults['cache'] = true; - - $this->cacheFile = Common::realpath(substr($arg, 6)); - - // It may not exist and return false instead. - if ($this->cacheFile === false) { - $this->cacheFile = substr($arg, 6); - - $dir = dirname($this->cacheFile); - if (is_dir($dir) === false) { - $error = 'ERROR: The specified cache file path "'.$this->cacheFile.'" points to a non-existent directory'.PHP_EOL.PHP_EOL; - $error .= $this->printShortUsage(true); - throw new DeepExitException($error, 3); - } - - if ($dir === '.') { - // Passed cache file is a file in the current directory. - $this->cacheFile = getcwd().'/'.basename($this->cacheFile); - } else { - if ($dir[0] === '/') { - // An absolute path. - $dir = Common::realpath($dir); - } else { - $dir = Common::realpath(getcwd().'/'.$dir); - } - - if ($dir !== false) { - // Cache file path is relative. - $this->cacheFile = $dir.'/'.basename($this->cacheFile); - } - } - }//end if - - self::$overriddenDefaults['cacheFile'] = true; - - if (is_dir($this->cacheFile) === true) { - $error = 'ERROR: The specified cache file path "'.$this->cacheFile.'" is a directory'.PHP_EOL.PHP_EOL; - $error .= $this->printShortUsage(true); - throw new DeepExitException($error, 3); - } - } else if (substr($arg, 0, 10) === 'bootstrap=') { - $files = explode(',', substr($arg, 10)); - $bootstrap = []; - foreach ($files as $file) { - $path = Common::realpath($file); - if ($path === false) { - $error = 'ERROR: The specified bootstrap file "'.$file.'" does not exist'.PHP_EOL.PHP_EOL; - $error .= $this->printShortUsage(true); - throw new DeepExitException($error, 3); - } - - $bootstrap[] = $path; - } - - $this->bootstrap = array_merge($this->bootstrap, $bootstrap); - self::$overriddenDefaults['bootstrap'] = true; - } else if (substr($arg, 0, 10) === 'file-list=') { - $fileList = substr($arg, 10); - $path = Common::realpath($fileList); - if ($path === false) { - $error = 'ERROR: The specified file list "'.$fileList.'" does not exist'.PHP_EOL.PHP_EOL; - $error .= $this->printShortUsage(true); - throw new DeepExitException($error, 3); - } - - $files = file($path); - foreach ($files as $inputFile) { - $inputFile = trim($inputFile); - - // Skip empty lines. - if ($inputFile === '') { - continue; - } - - $this->processFilePath($inputFile); - } - } else if (substr($arg, 0, 11) === 'stdin-path=') { - if (isset(self::$overriddenDefaults['stdinPath']) === true) { - break; - } - - $this->stdinPath = Common::realpath(substr($arg, 11)); - - // It may not exist and return false instead, so use whatever they gave us. - if ($this->stdinPath === false) { - $this->stdinPath = trim(substr($arg, 11)); - } - - self::$overriddenDefaults['stdinPath'] = true; - } else if (substr($arg, 0, 12) === 'report-file=') { - if (PHP_CODESNIFFER_CBF === true || isset(self::$overriddenDefaults['reportFile']) === true) { - break; - } - - $this->reportFile = Common::realpath(substr($arg, 12)); - - // It may not exist and return false instead. - if ($this->reportFile === false) { - $this->reportFile = substr($arg, 12); - - $dir = Common::realpath(dirname($this->reportFile)); - if (is_dir($dir) === false) { - $error = 'ERROR: The specified report file path "'.$this->reportFile.'" points to a non-existent directory'.PHP_EOL.PHP_EOL; - $error .= $this->printShortUsage(true); - throw new DeepExitException($error, 3); - } - - $this->reportFile = $dir.'/'.basename($this->reportFile); - }//end if - - self::$overriddenDefaults['reportFile'] = true; - - if (is_dir($this->reportFile) === true) { - $error = 'ERROR: The specified report file path "'.$this->reportFile.'" is a directory'.PHP_EOL.PHP_EOL; - $error .= $this->printShortUsage(true); - throw new DeepExitException($error, 3); - } - } else if (substr($arg, 0, 13) === 'report-width=') { - if (isset(self::$overriddenDefaults['reportWidth']) === true) { - break; - } - - $this->reportWidth = substr($arg, 13); - self::$overriddenDefaults['reportWidth'] = true; - } else if (substr($arg, 0, 9) === 'basepath=') { - if (isset(self::$overriddenDefaults['basepath']) === true) { - break; - } - - self::$overriddenDefaults['basepath'] = true; - - if (substr($arg, 9) === '') { - $this->basepath = null; - break; - } - - $basepath = Common::realpath(substr($arg, 9)); - - // It may not exist and return false instead. - if ($basepath === false) { - $this->basepath = substr($arg, 9); - } else { - $this->basepath = $basepath; - } - - if (is_dir($this->basepath) === false) { - $error = 'ERROR: The specified basepath "'.$this->basepath.'" points to a non-existent directory'.PHP_EOL.PHP_EOL; - $error .= $this->printShortUsage(true); - throw new DeepExitException($error, 3); - } - } else if ((substr($arg, 0, 7) === 'report=' || substr($arg, 0, 7) === 'report-')) { - $reports = []; - - if ($arg[6] === '-') { - // This is a report with file output. - $split = strpos($arg, '='); - if ($split === false) { - $report = substr($arg, 7); - $output = null; - } else { - $report = substr($arg, 7, ($split - 7)); - $output = substr($arg, ($split + 1)); - if ($output === false) { - $output = null; - } else { - $dir = Common::realpath(dirname($output)); - if (is_dir($dir) === false) { - $error = 'ERROR: The specified '.$report.' report file path "'.$output.'" points to a non-existent directory'.PHP_EOL.PHP_EOL; - $error .= $this->printShortUsage(true); - throw new DeepExitException($error, 3); - } - - $output = $dir.'/'.basename($output); - - if (is_dir($output) === true) { - $error = 'ERROR: The specified '.$report.' report file path "'.$output.'" is a directory'.PHP_EOL.PHP_EOL; - $error .= $this->printShortUsage(true); - throw new DeepExitException($error, 3); - } - }//end if - }//end if - - $reports[$report] = $output; - } else { - // This is a single report. - if (isset(self::$overriddenDefaults['reports']) === true) { - break; - } - - $reportNames = explode(',', substr($arg, 7)); - foreach ($reportNames as $report) { - $reports[$report] = null; - } - }//end if - - // Remove the default value so the CLI value overrides it. - if (isset(self::$overriddenDefaults['reports']) === false) { - $this->reports = $reports; - } else { - $this->reports = array_merge($this->reports, $reports); - } - - self::$overriddenDefaults['reports'] = true; - } else if (substr($arg, 0, 7) === 'filter=') { - if (isset(self::$overriddenDefaults['filter']) === true) { - break; - } - - $this->filter = substr($arg, 7); - self::$overriddenDefaults['filter'] = true; - } else if (substr($arg, 0, 9) === 'standard=') { - $standards = trim(substr($arg, 9)); - if ($standards !== '') { - $this->standards = explode(',', $standards); - } - - self::$overriddenDefaults['standards'] = true; - } else if (substr($arg, 0, 11) === 'extensions=') { - if (isset(self::$overriddenDefaults['extensions']) === true) { - break; - } - - $extensionsString = substr($arg, 11); - $newExtensions = []; - if (empty($extensionsString) === false) { - $extensions = explode(',', $extensionsString); - foreach ($extensions as $ext) { - $slash = strpos($ext, '/'); - if ($slash !== false) { - // They specified the tokenizer too. - list($ext, $tokenizer) = explode('/', $ext); - $newExtensions[$ext] = strtoupper($tokenizer); - continue; - } - - if (isset($this->extensions[$ext]) === true) { - $newExtensions[$ext] = $this->extensions[$ext]; - } else { - $newExtensions[$ext] = 'PHP'; - } - } - } - - $this->extensions = $newExtensions; - self::$overriddenDefaults['extensions'] = true; - } else if (substr($arg, 0, 7) === 'suffix=') { - if (isset(self::$overriddenDefaults['suffix']) === true) { - break; - } - - $this->suffix = substr($arg, 7); - self::$overriddenDefaults['suffix'] = true; - } else if (substr($arg, 0, 9) === 'parallel=') { - if (isset(self::$overriddenDefaults['parallel']) === true) { - break; - } - - $this->parallel = max((int) substr($arg, 9), 1); - self::$overriddenDefaults['parallel'] = true; - } else if (substr($arg, 0, 9) === 'severity=') { - $this->errorSeverity = (int) substr($arg, 9); - $this->warningSeverity = $this->errorSeverity; - if (isset(self::$overriddenDefaults['errorSeverity']) === false) { - self::$overriddenDefaults['errorSeverity'] = true; - } - - if (isset(self::$overriddenDefaults['warningSeverity']) === false) { - self::$overriddenDefaults['warningSeverity'] = true; - } - } else if (substr($arg, 0, 15) === 'error-severity=') { - if (isset(self::$overriddenDefaults['errorSeverity']) === true) { - break; - } - - $this->errorSeverity = (int) substr($arg, 15); - self::$overriddenDefaults['errorSeverity'] = true; - } else if (substr($arg, 0, 17) === 'warning-severity=') { - if (isset(self::$overriddenDefaults['warningSeverity']) === true) { - break; - } - - $this->warningSeverity = (int) substr($arg, 17); - self::$overriddenDefaults['warningSeverity'] = true; - } else if (substr($arg, 0, 7) === 'ignore=') { - if (isset(self::$overriddenDefaults['ignored']) === true) { - break; - } - - // Split the ignore string on commas, unless the comma is escaped - // using 1 or 3 slashes (\, or \\\,). - $patterns = preg_split( - '/(?<=(?ignored = $ignored; - self::$overriddenDefaults['ignored'] = true; - } else if (substr($arg, 0, 10) === 'generator=' - && PHP_CODESNIFFER_CBF === false - ) { - if (isset(self::$overriddenDefaults['generator']) === true) { - break; - } - - $generatorName = substr($arg, 10); - $lowerCaseGeneratorName = strtolower($generatorName); - - if (isset($this->validGenerators[$lowerCaseGeneratorName]) === false) { - $validOptions = implode(', ', $this->validGenerators); - $validOptions = substr_replace($validOptions, ' and', strrpos($validOptions, ','), 1); - $error = sprintf( - 'ERROR: "%s" is not a valid generator. The following generators are supported: %s.'.PHP_EOL.PHP_EOL, - $generatorName, - $validOptions - ); - $error .= $this->printShortUsage(true); - throw new DeepExitException($error, 3); - } - - $this->generator = $this->validGenerators[$lowerCaseGeneratorName]; - self::$overriddenDefaults['generator'] = true; - } else if (substr($arg, 0, 9) === 'encoding=') { - if (isset(self::$overriddenDefaults['encoding']) === true) { - break; - } - - $this->encoding = strtolower(substr($arg, 9)); - self::$overriddenDefaults['encoding'] = true; - } else if (substr($arg, 0, 10) === 'tab-width=') { - if (isset(self::$overriddenDefaults['tabWidth']) === true) { - break; - } - - $this->tabWidth = (int) substr($arg, 10); - self::$overriddenDefaults['tabWidth'] = true; - } else { - if ($this->dieOnUnknownArg === false) { - $eqPos = strpos($arg, '='); - try { - $unknown = $this->unknown; - - if ($eqPos === false) { - $unknown[$arg] = $arg; - } else { - $value = substr($arg, ($eqPos + 1)); - $arg = substr($arg, 0, $eqPos); - $unknown[$arg] = $value; - } - - $this->unknown = $unknown; - } catch (RuntimeException $e) { - // Value is not valid, so just ignore it. - } - } else { - $this->processUnknownArgument('--'.$arg, $pos); - } - }//end if - break; - }//end switch - - }//end processLongArgument() - - - /** - * Parse supplied string into a list of validated sniff codes. - * - * @param string $input Comma-separated string of sniff codes. - * @param string $argument The name of the argument which is being processed. - * - * @return array - * @throws \PHP_CodeSniffer\Exceptions\DeepExitException When any of the provided codes are not valid as sniff codes. - */ - private function parseSniffCodes($input, $argument) - { - $errors = []; - $sniffs = []; - - $possibleSniffs = array_filter(explode(',', $input)); - - if ($possibleSniffs === []) { - $errors[] = 'No codes specified / empty argument'; - } - - foreach ($possibleSniffs as $sniff) { - $sniff = trim($sniff); - - $partCount = substr_count($sniff, '.'); - if ($partCount === 2) { - // Correct number of parts. - $sniffs[] = $sniff; - continue; - } - - if ($partCount === 0) { - $errors[] = 'Standard codes are not supported: '.$sniff; - } else if ($partCount === 1) { - $errors[] = 'Category codes are not supported: '.$sniff; - } else if ($partCount === 3) { - $errors[] = 'Message codes are not supported: '.$sniff; - } else { - $errors[] = 'Too many parts: '.$sniff; - } - - if ($partCount > 2) { - $parts = explode('.', $sniff, 4); - $sniffs[] = $parts[0].'.'.$parts[1].'.'.$parts[2]; - } - }//end foreach - - $sniffs = array_reduce( - $sniffs, - static function ($carry, $item) { - $lower = strtolower($item); - - foreach ($carry as $found) { - if ($lower === strtolower($found)) { - // This sniff is already in our list. - return $carry; - } - } - - $carry[] = $item; - - return $carry; - }, - [] - ); - - if ($errors !== []) { - $error = 'ERROR: The --'.$argument.' option only supports sniff codes.'.PHP_EOL; - $error .= 'Sniff codes are in the form "Standard.Category.Sniff".'.PHP_EOL; - $error .= PHP_EOL; - $error .= 'The following problems were detected:'.PHP_EOL; - $error .= '* '.implode(PHP_EOL.'* ', $errors).PHP_EOL; - - if ($sniffs !== []) { - $error .= PHP_EOL; - $error .= 'Perhaps try --'.$argument.'="'.implode(',', $sniffs).'" instead.'.PHP_EOL; - } - - $error .= PHP_EOL; - $error .= $this->printShortUsage(true); - throw new DeepExitException(ltrim($error), 3); - } - - return $sniffs; - - }//end parseSniffCodes() - - - /** - * Processes an unknown command line argument. - * - * Assumes all unknown arguments are files and folders to check. - * - * @param string $arg The command line argument. - * @param int $pos The position of the argument on the command line. - * - * @return void - * @throws \PHP_CodeSniffer\Exceptions\DeepExitException - */ - public function processUnknownArgument($arg, $pos) - { - // We don't know about any additional switches; just files. - if ($arg[0] === '-') { - if ($this->dieOnUnknownArg === false) { - return; - } - - $error = "ERROR: option \"$arg\" not known".PHP_EOL.PHP_EOL; - $error .= $this->printShortUsage(true); - throw new DeepExitException($error, 3); - } - - $this->processFilePath($arg); - - }//end processUnknownArgument() - - - /** - * Processes a file path and add it to the file list. - * - * @param string $path The path to the file to add. - * - * @return void - * @throws \PHP_CodeSniffer\Exceptions\DeepExitException - */ - public function processFilePath($path) - { - // If we are processing STDIN, don't record any files to check. - if ($this->stdin === true) { - return; - } - - $file = Common::realpath($path); - if (file_exists($file) === false) { - if ($this->dieOnUnknownArg === false) { - return; - } - - $error = 'ERROR: The file "'.$path.'" does not exist.'.PHP_EOL.PHP_EOL; - $error .= $this->printShortUsage(true); - throw new DeepExitException($error, 3); - } else { - // Can't modify the files array directly because it's not a real - // class member, so need to use this little get/modify/set trick. - $files = $this->files; - $files[] = $file; - $this->files = $files; - self::$overriddenDefaults['files'] = true; - } - - }//end processFilePath() - - - /** - * Prints out the usage information for this script. - * - * @return void - */ - public function printUsage() - { - echo PHP_EOL; - - if (PHP_CODESNIFFER_CBF === true) { - $this->printPHPCBFUsage(); - } else { - $this->printPHPCSUsage(); - } - - echo PHP_EOL; - - }//end printUsage() - - - /** - * Prints out the short usage information for this script. - * - * @param bool $return If TRUE, the usage string is returned - * instead of output to screen. - * - * @return string|void - */ - public function printShortUsage($return=false) - { - if (PHP_CODESNIFFER_CBF === true) { - $usage = 'Run "phpcbf --help" for usage information'; - } else { - $usage = 'Run "phpcs --help" for usage information'; - } - - $usage .= PHP_EOL.PHP_EOL; - - if ($return === true) { - return $usage; - } - - echo $usage; - - }//end printShortUsage() - - - /** - * Prints out the usage information for PHPCS. - * - * @return void - */ - public function printPHPCSUsage() - { - $longOptions = explode(',', Help::DEFAULT_LONG_OPTIONS); - $longOptions[] = 'cache'; - $longOptions[] = 'no-cache'; - $longOptions[] = 'report'; - $longOptions[] = 'report-file'; - $longOptions[] = 'report-report'; - $longOptions[] = 'config-explain'; - $longOptions[] = 'config-set'; - $longOptions[] = 'config-delete'; - $longOptions[] = 'config-show'; - $longOptions[] = 'generator'; - - $shortOptions = Help::DEFAULT_SHORT_OPTIONS.'aems'; - - (new Help($this, $longOptions, $shortOptions))->display(); - - }//end printPHPCSUsage() - - - /** - * Prints out the usage information for PHPCBF. - * - * @return void - */ - public function printPHPCBFUsage() - { - $longOptions = explode(',', Help::DEFAULT_LONG_OPTIONS); - $longOptions[] = 'suffix'; - $shortOptions = Help::DEFAULT_SHORT_OPTIONS; - - (new Help($this, $longOptions, $shortOptions))->display(); - - }//end printPHPCBFUsage() - - - /** - * Get a single config value. - * - * @param string $key The name of the config value. - * - * @return string|null - * @see setConfigData() - * @see getAllConfigData() - */ - public static function getConfigData($key) - { - $phpCodeSnifferConfig = self::getAllConfigData(); - - if ($phpCodeSnifferConfig === null) { - return null; - } - - if (isset($phpCodeSnifferConfig[$key]) === false) { - return null; - } - - return $phpCodeSnifferConfig[$key]; - - }//end getConfigData() - - - /** - * Get the path to an executable utility. - * - * @param string $name The name of the executable utility. - * - * @return string|null - * @see getConfigData() - */ - public static function getExecutablePath($name) - { - $data = self::getConfigData($name.'_path'); - if ($data !== null) { - return $data; - } - - if ($name === "php") { - // For php, we know the executable path. There's no need to look it up. - return PHP_BINARY; - } - - if (array_key_exists($name, self::$executablePaths) === true) { - return self::$executablePaths[$name]; - } - - if (stripos(PHP_OS, 'WIN') === 0) { - $cmd = 'where '.escapeshellarg($name).' 2> nul'; - } else { - $cmd = 'which '.escapeshellarg($name).' 2> /dev/null'; - } - - $result = exec($cmd, $output, $retVal); - if ($retVal !== 0) { - $result = null; - } - - self::$executablePaths[$name] = $result; - return $result; - - }//end getExecutablePath() - - - /** - * Set a single config value. - * - * @param string $key The name of the config value. - * @param string|null $value The value to set. If null, the config - * entry is deleted, reverting it to the - * default value. - * @param boolean $temp Set this config data temporarily for this - * script run. This will not write the config - * data to the config file. - * - * @return bool - * @see getConfigData() - * @throws \PHP_CodeSniffer\Exceptions\DeepExitException If the config file can not be written. - */ - public static function setConfigData($key, $value, $temp=false) - { - if (isset(self::$overriddenDefaults['runtime-set']) === true - && isset(self::$overriddenDefaults['runtime-set'][$key]) === true - ) { - return false; - } - - if ($temp === false) { - $path = ''; - if (is_callable('\Phar::running') === true) { - $path = Phar::running(false); - } - - if ($path !== '') { - $configFile = dirname($path).DIRECTORY_SEPARATOR.'CodeSniffer.conf'; - } else { - $configFile = dirname(__DIR__).DIRECTORY_SEPARATOR.'CodeSniffer.conf'; - } - - if (is_file($configFile) === true - && is_writable($configFile) === false - ) { - $error = 'ERROR: Config file '.$configFile.' is not writable'.PHP_EOL.PHP_EOL; - throw new DeepExitException($error, 3); - } - }//end if - - $phpCodeSnifferConfig = self::getAllConfigData(); - - if ($value === null) { - if (isset($phpCodeSnifferConfig[$key]) === true) { - unset($phpCodeSnifferConfig[$key]); - } - } else { - $phpCodeSnifferConfig[$key] = $value; - } - - if ($temp === false) { - $output = '<'.'?php'."\n".' $phpCodeSnifferConfig = '; - $output .= var_export($phpCodeSnifferConfig, true); - $output .= ";\n?".'>'; - - if (file_put_contents($configFile, $output) === false) { - $error = 'ERROR: Config file '.$configFile.' could not be written'.PHP_EOL.PHP_EOL; - throw new DeepExitException($error, 3); - } - - self::$configDataFile = $configFile; - } - - self::$configData = $phpCodeSnifferConfig; - - // If the installed paths are being set, make sure all known - // standards paths are added to the autoloader. - if ($key === 'installed_paths') { - $installedStandards = Standards::getInstalledStandardDetails(); - foreach ($installedStandards as $details) { - Autoload::addSearchPath($details['path'], $details['namespace']); - } - } - - return true; - - }//end setConfigData() - - - /** - * Get all config data. - * - * @return array - * @see getConfigData() - * @throws \PHP_CodeSniffer\Exceptions\DeepExitException If the config file could not be read. - */ - public static function getAllConfigData() - { - if (self::$configData !== null) { - return self::$configData; - } - - $path = ''; - if (is_callable('\Phar::running') === true) { - $path = Phar::running(false); - } - - if ($path !== '') { - $configFile = dirname($path).DIRECTORY_SEPARATOR.'CodeSniffer.conf'; - } else { - $configFile = dirname(__DIR__).DIRECTORY_SEPARATOR.'CodeSniffer.conf'; - } - - if (is_file($configFile) === false) { - self::$configData = []; - return []; - } - - if (Common::isReadable($configFile) === false) { - $error = 'ERROR: Config file '.$configFile.' is not readable'.PHP_EOL.PHP_EOL; - throw new DeepExitException($error, 3); - } - - include $configFile; - self::$configDataFile = $configFile; - self::$configData = $phpCodeSnifferConfig; - return self::$configData; - - }//end getAllConfigData() - - - /** - * Prints out the gathered config data. - * - * @param array $data The config data to print. - * - * @return void - */ - public function printConfigData($data) - { - $max = 0; - $keys = array_keys($data); - foreach ($keys as $key) { - $len = strlen($key); - if (strlen($key) > $max) { - $max = $len; - } - } - - if ($max === 0) { - return; - } - - $max += 2; - ksort($data); - foreach ($data as $name => $value) { - echo str_pad($name.': ', $max).$value.PHP_EOL; - } - - }//end printConfigData() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Exceptions/DeepExitException.php b/vendor/squizlabs/php_codesniffer/src/Exceptions/DeepExitException.php deleted file mode 100644 index a91c742..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Exceptions/DeepExitException.php +++ /dev/null @@ -1,20 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Exceptions; - -use Exception; - -class DeepExitException extends Exception -{ - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Exceptions/RuntimeException.php b/vendor/squizlabs/php_codesniffer/src/Exceptions/RuntimeException.php deleted file mode 100644 index 40dadae..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Exceptions/RuntimeException.php +++ /dev/null @@ -1,17 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Exceptions; - -use RuntimeException as PHPRuntimeException; - -class RuntimeException extends PHPRuntimeException -{ - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Exceptions/TokenizerException.php b/vendor/squizlabs/php_codesniffer/src/Exceptions/TokenizerException.php deleted file mode 100644 index eb4e106..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Exceptions/TokenizerException.php +++ /dev/null @@ -1,17 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Exceptions; - -use Exception; - -class TokenizerException extends Exception -{ - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Files/DummyFile.php b/vendor/squizlabs/php_codesniffer/src/Files/DummyFile.php deleted file mode 100644 index 2bd5995..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Files/DummyFile.php +++ /dev/null @@ -1,82 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Files; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Ruleset; - -class DummyFile extends File -{ - - - /** - * Creates a DummyFile object and sets the content. - * - * @param string $content The content of the file. - * @param \PHP_CodeSniffer\Ruleset $ruleset The ruleset used for the run. - * @param \PHP_CodeSniffer\Config $config The config data for the run. - * - * @return void - */ - public function __construct($content, Ruleset $ruleset, Config $config) - { - $this->setContent($content); - - // See if a filename was defined in the content. - // This is done by including: phpcs_input_file: [file path] - // as the first line of content. - $path = 'STDIN'; - if ($content !== '') { - if (substr($content, 0, 17) === 'phpcs_input_file:') { - $eolPos = strpos($content, $this->eolChar); - $filename = trim(substr($content, 17, ($eolPos - 17))); - $content = substr($content, ($eolPos + strlen($this->eolChar))); - $path = $filename; - - $this->setContent($content); - } - } - - // The CLI arg overrides anything passed in the content. - if ($config->stdinPath !== null) { - $path = $config->stdinPath; - } - - parent::__construct($path, $ruleset, $config); - - }//end __construct() - - - /** - * Set the error, warning, and fixable counts for the file. - * - * @param int $errorCount The number of errors found. - * @param int $warningCount The number of warnings found. - * @param int $fixableCount The number of fixable errors found. - * @param int $fixedCount The number of errors that were fixed. - * - * @return void - */ - public function setErrorCounts($errorCount, $warningCount, $fixableCount, $fixedCount) - { - $this->errorCount = $errorCount; - $this->warningCount = $warningCount; - $this->fixableCount = $fixableCount; - $this->fixedCount = $fixedCount; - - }//end setErrorCounts() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Files/File.php b/vendor/squizlabs/php_codesniffer/src/Files/File.php deleted file mode 100644 index d40a071..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Files/File.php +++ /dev/null @@ -1,2996 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Files; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Exceptions\RuntimeException; -use PHP_CodeSniffer\Exceptions\TokenizerException; -use PHP_CodeSniffer\Fixer; -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Util\Common; -use PHP_CodeSniffer\Util\Tokens; - -class File -{ - - /** - * The absolute path to the file associated with this object. - * - * @var string - */ - public $path = ''; - - /** - * The content of the file. - * - * @var string - */ - protected $content = ''; - - /** - * The config data for the run. - * - * @var \PHP_CodeSniffer\Config - */ - public $config = null; - - /** - * The ruleset used for the run. - * - * @var \PHP_CodeSniffer\Ruleset - */ - public $ruleset = null; - - /** - * If TRUE, the entire file is being ignored. - * - * @var boolean - */ - public $ignored = false; - - /** - * The EOL character this file uses. - * - * @var string - */ - public $eolChar = ''; - - /** - * The Fixer object to control fixing errors. - * - * @var \PHP_CodeSniffer\Fixer - */ - public $fixer = null; - - /** - * The tokenizer being used for this file. - * - * @var \PHP_CodeSniffer\Tokenizers\Tokenizer - */ - public $tokenizer = null; - - /** - * The name of the tokenizer being used for this file. - * - * @var string - */ - public $tokenizerType = 'PHP'; - - /** - * Was the file loaded from cache? - * - * If TRUE, the file was loaded from a local cache. - * If FALSE, the file was tokenized and processed fully. - * - * @var boolean - */ - public $fromCache = false; - - /** - * The number of tokens in this file. - * - * Stored here to save calling count() everywhere. - * - * @var integer - */ - public $numTokens = 0; - - /** - * The tokens stack map. - * - * @var array - */ - protected $tokens = []; - - /** - * The errors raised from sniffs. - * - * @var array - * @see getErrors() - */ - protected $errors = []; - - /** - * The warnings raised from sniffs. - * - * @var array - * @see getWarnings() - */ - protected $warnings = []; - - /** - * The metrics recorded by sniffs. - * - * @var array - * @see getMetrics() - */ - protected $metrics = []; - - /** - * The metrics recorded for each token. - * - * Stops the same metric being recorded for the same token twice. - * - * @var array - * @see getMetrics() - */ - private $metricTokens = []; - - /** - * The total number of errors raised. - * - * @var integer - */ - protected $errorCount = 0; - - /** - * The total number of warnings raised. - * - * @var integer - */ - protected $warningCount = 0; - - /** - * The total number of errors and warnings that can be fixed. - * - * @var integer - */ - protected $fixableCount = 0; - - /** - * The total number of errors and warnings that were fixed. - * - * @var integer - */ - protected $fixedCount = 0; - - /** - * TRUE if errors are being replayed from the cache. - * - * @var boolean - */ - protected $replayingErrors = false; - - /** - * An array of sniffs that are being ignored. - * - * @var array - */ - protected $ignoredListeners = []; - - /** - * An array of message codes that are being ignored. - * - * @var array - */ - protected $ignoredCodes = []; - - /** - * An array of sniffs listening to this file's processing. - * - * @var \PHP_CodeSniffer\Sniffs\Sniff[] - */ - protected $listeners = []; - - /** - * The class name of the sniff currently processing the file. - * - * @var string - */ - protected $activeListener = ''; - - /** - * An array of sniffs being processed and how long they took. - * - * @var array - * @see getListenerTimes() - */ - protected $listenerTimes = []; - - /** - * A cache of often used config settings to improve performance. - * - * Storing them here saves 10k+ calls to __get() in the Config class. - * - * @var array - */ - protected $configCache = []; - - - /** - * Constructs a file. - * - * @param string $path The absolute path to the file to process. - * @param \PHP_CodeSniffer\Ruleset $ruleset The ruleset used for the run. - * @param \PHP_CodeSniffer\Config $config The config data for the run. - * - * @return void - */ - public function __construct($path, Ruleset $ruleset, Config $config) - { - $this->path = $path; - $this->ruleset = $ruleset; - $this->config = $config; - $this->fixer = new Fixer(); - - $parts = explode('.', $path); - $extension = array_pop($parts); - if (isset($config->extensions[$extension]) === true) { - $this->tokenizerType = $config->extensions[$extension]; - } else { - // Revert to default. - $this->tokenizerType = 'PHP'; - } - - $this->configCache['cache'] = $this->config->cache; - $this->configCache['sniffs'] = array_map('strtolower', $this->config->sniffs); - $this->configCache['exclude'] = array_map('strtolower', $this->config->exclude); - $this->configCache['errorSeverity'] = $this->config->errorSeverity; - $this->configCache['warningSeverity'] = $this->config->warningSeverity; - $this->configCache['recordErrors'] = $this->config->recordErrors; - $this->configCache['trackTime'] = $this->config->trackTime; - $this->configCache['ignorePatterns'] = $this->ruleset->ignorePatterns; - $this->configCache['includePatterns'] = $this->ruleset->includePatterns; - - }//end __construct() - - - /** - * Set the content of the file. - * - * Setting the content also calculates the EOL char being used. - * - * @param string $content The file content. - * - * @return void - */ - public function setContent($content) - { - $this->content = $content; - $this->tokens = []; - - try { - $this->eolChar = Common::detectLineEndings($content); - } catch (RuntimeException $e) { - $this->addWarningOnLine($e->getMessage(), 1, 'Internal.DetectLineEndings'); - return; - } - - }//end setContent() - - - /** - * Reloads the content of the file. - * - * By default, we have no idea where our content comes from, - * so we can't do anything. - * - * @return void - */ - public function reloadContent() - { - - }//end reloadContent() - - - /** - * Disables caching of this file. - * - * @return void - */ - public function disableCaching() - { - $this->configCache['cache'] = false; - - }//end disableCaching() - - - /** - * Starts the stack traversal and tells listeners when tokens are found. - * - * @return void - */ - public function process() - { - if ($this->ignored === true) { - return; - } - - $this->errors = []; - $this->warnings = []; - $this->errorCount = 0; - $this->warningCount = 0; - $this->fixableCount = 0; - - $this->parse(); - - // Check if tokenizer errors cause this file to be ignored. - if ($this->ignored === true) { - return; - } - - $this->fixer->startFile($this); - - if (PHP_CODESNIFFER_VERBOSITY > 2) { - echo "\t*** START TOKEN PROCESSING ***".PHP_EOL; - } - - $foundCode = false; - $listenerIgnoreTo = []; - $inTests = defined('PHP_CODESNIFFER_IN_TESTS'); - $checkAnnotations = $this->config->annotations; - - // Foreach of the listeners that have registered to listen for this - // token, get them to process it. - foreach ($this->tokens as $stackPtr => $token) { - // Check for ignored lines. - if ($checkAnnotations === true - && ($token['code'] === T_COMMENT - || $token['code'] === T_PHPCS_IGNORE_FILE - || $token['code'] === T_PHPCS_SET - || $token['code'] === T_DOC_COMMENT_STRING - || $token['code'] === T_DOC_COMMENT_TAG - || ($inTests === true && $token['code'] === T_INLINE_HTML)) - ) { - $commentText = ltrim($this->tokens[$stackPtr]['content'], " \t/*#"); - $commentTextLower = strtolower($commentText); - if (strpos($commentText, '@codingStandards') !== false) { - if (strpos($commentText, '@codingStandardsIgnoreFile') !== false) { - // Ignoring the whole file, just a little late. - $this->errors = []; - $this->warnings = []; - $this->errorCount = 0; - $this->warningCount = 0; - $this->fixableCount = 0; - return; - } else if (strpos($commentText, '@codingStandardsChangeSetting') !== false) { - $start = strpos($commentText, '@codingStandardsChangeSetting'); - $comment = substr($commentText, ($start + 30)); - $parts = explode(' ', $comment); - if (count($parts) >= 2) { - $sniffParts = explode('.', $parts[0]); - if (count($sniffParts) >= 3) { - // If the sniff code is not known to us, it has not been registered in this run. - // But don't throw an error as it could be there for a different standard to use. - if (isset($this->ruleset->sniffCodes[$parts[0]]) === true) { - $listenerCode = array_shift($parts); - $propertyCode = array_shift($parts); - $settings = [ - 'value' => rtrim(implode(' ', $parts), " */\r\n"), - 'scope' => 'sniff', - ]; - $listenerClass = $this->ruleset->sniffCodes[$listenerCode]; - $this->ruleset->setSniffProperty($listenerClass, $propertyCode, $settings); - } - } - } - }//end if - } else if (substr($commentTextLower, 0, 16) === 'phpcs:ignorefile' - || substr($commentTextLower, 0, 17) === '@phpcs:ignorefile' - ) { - // Ignoring the whole file, just a little late. - $this->errors = []; - $this->warnings = []; - $this->errorCount = 0; - $this->warningCount = 0; - $this->fixableCount = 0; - return; - } else if (substr($commentTextLower, 0, 9) === 'phpcs:set' - || substr($commentTextLower, 0, 10) === '@phpcs:set' - ) { - if (isset($token['sniffCode']) === true) { - $listenerCode = $token['sniffCode']; - if (isset($this->ruleset->sniffCodes[$listenerCode]) === true) { - $propertyCode = $token['sniffProperty']; - $settings = [ - 'value' => $token['sniffPropertyValue'], - 'scope' => 'sniff', - ]; - $listenerClass = $this->ruleset->sniffCodes[$listenerCode]; - $this->ruleset->setSniffProperty($listenerClass, $propertyCode, $settings); - } - } - }//end if - }//end if - - if (PHP_CODESNIFFER_VERBOSITY > 2) { - $type = $token['type']; - $content = Common::prepareForOutput($token['content']); - echo "\t\tProcess token $stackPtr: $type => $content".PHP_EOL; - } - - if ($token['code'] !== T_INLINE_HTML) { - $foundCode = true; - } - - if (isset($this->ruleset->tokenListeners[$token['code']]) === false) { - continue; - } - - foreach ($this->ruleset->tokenListeners[$token['code']] as $listenerData) { - if (isset($this->ignoredListeners[$listenerData['class']]) === true - || (isset($listenerIgnoreTo[$listenerData['class']]) === true - && $listenerIgnoreTo[$listenerData['class']] > $stackPtr) - ) { - // This sniff is ignoring past this token, or the whole file. - continue; - } - - // Make sure this sniff supports the tokenizer - // we are currently using. - $class = $listenerData['class']; - - if (isset($listenerData['tokenizers'][$this->tokenizerType]) === false) { - continue; - } - - if (trim($this->path, '\'"') !== 'STDIN') { - // If the file path matches one of our ignore patterns, skip it. - // While there is support for a type of each pattern - // (absolute or relative) we don't actually support it here. - foreach ($listenerData['ignore'] as $pattern) { - // We assume a / directory separator, as do the exclude rules - // most developers write, so we need a special case for any system - // that is different. - if (DIRECTORY_SEPARATOR === '\\') { - $pattern = str_replace('/', '\\\\', $pattern); - } - - $pattern = '`'.$pattern.'`i'; - if (preg_match($pattern, $this->path) === 1) { - $this->ignoredListeners[$class] = true; - continue(2); - } - } - - // If the file path does not match one of our include patterns, skip it. - // While there is support for a type of each pattern - // (absolute or relative) we don't actually support it here. - if (empty($listenerData['include']) === false) { - $included = false; - foreach ($listenerData['include'] as $pattern) { - // We assume a / directory separator, as do the exclude rules - // most developers write, so we need a special case for any system - // that is different. - if (DIRECTORY_SEPARATOR === '\\') { - $pattern = str_replace('/', '\\\\', $pattern); - } - - $pattern = '`'.$pattern.'`i'; - if (preg_match($pattern, $this->path) === 1) { - $included = true; - break; - } - } - - if ($included === false) { - $this->ignoredListeners[$class] = true; - continue; - } - }//end if - }//end if - - $this->activeListener = $class; - - if ($this->configCache['trackTime'] === true) { - $startTime = microtime(true); - } - - if (PHP_CODESNIFFER_VERBOSITY > 2) { - echo "\t\t\tProcessing ".$this->activeListener.'... '; - } - - $ignoreTo = $this->ruleset->sniffs[$class]->process($this, $stackPtr); - if ($ignoreTo !== null) { - $listenerIgnoreTo[$this->activeListener] = $ignoreTo; - } - - if ($this->configCache['trackTime'] === true) { - $timeTaken = (microtime(true) - $startTime); - if (isset($this->listenerTimes[$this->activeListener]) === false) { - $this->listenerTimes[$this->activeListener] = 0; - } - - $this->listenerTimes[$this->activeListener] += $timeTaken; - } - - if (PHP_CODESNIFFER_VERBOSITY > 2) { - $timeTaken = round(($timeTaken), 4); - echo "DONE in $timeTaken seconds".PHP_EOL; - } - - $this->activeListener = ''; - }//end foreach - }//end foreach - - // If short open tags are off but the file being checked uses - // short open tags, the whole content will be inline HTML - // and nothing will be checked. So try and handle this case. - // We don't show this error for STDIN because we can't be sure the content - // actually came directly from the user. It could be something like - // refs from a Git pre-push hook. - if ($foundCode === false && $this->tokenizerType === 'PHP' && $this->path !== 'STDIN') { - $shortTags = (bool) ini_get('short_open_tag'); - if ($shortTags === false) { - $error = 'No PHP code was found in this file and short open tags are not allowed by this install of PHP. This file may be using short open tags but PHP does not allow them.'; - $this->addWarning($error, null, 'Internal.NoCodeFound'); - } - } - - if (PHP_CODESNIFFER_VERBOSITY > 2) { - echo "\t*** END TOKEN PROCESSING ***".PHP_EOL; - echo "\t*** START SNIFF PROCESSING REPORT ***".PHP_EOL; - - arsort($this->listenerTimes, SORT_NUMERIC); - foreach ($this->listenerTimes as $listener => $timeTaken) { - echo "\t$listener: ".round(($timeTaken), 4).' secs'.PHP_EOL; - } - - echo "\t*** END SNIFF PROCESSING REPORT ***".PHP_EOL; - } - - $this->fixedCount += $this->fixer->getFixCount(); - - }//end process() - - - /** - * Tokenizes the file and prepares it for the test run. - * - * @return void - */ - public function parse() - { - if (empty($this->tokens) === false) { - // File has already been parsed. - return; - } - - try { - $tokenizerClass = 'PHP_CodeSniffer\Tokenizers\\'.$this->tokenizerType; - $this->tokenizer = new $tokenizerClass($this->content, $this->config, $this->eolChar); - $this->tokens = $this->tokenizer->getTokens(); - } catch (TokenizerException $e) { - $this->ignored = true; - $this->addWarning($e->getMessage(), null, 'Internal.Tokenizer.Exception'); - if (PHP_CODESNIFFER_VERBOSITY > 0) { - echo "[$this->tokenizerType => tokenizer error]... "; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo PHP_EOL; - } - } - - return; - } - - $this->numTokens = count($this->tokens); - - // Check for mixed line endings as these can cause tokenizer errors and we - // should let the user know that the results they get may be incorrect. - // This is done by removing all backslashes, removing the newline char we - // detected, then converting newlines chars into text. If any backslashes - // are left at the end, we have additional newline chars in use. - $contents = str_replace('\\', '', $this->content); - $contents = str_replace($this->eolChar, '', $contents); - $contents = str_replace("\n", '\n', $contents); - $contents = str_replace("\r", '\r', $contents); - if (strpos($contents, '\\') !== false) { - $error = 'File has mixed line endings; this may cause incorrect results'; - $this->addWarningOnLine($error, 1, 'Internal.LineEndings.Mixed'); - } - - if (PHP_CODESNIFFER_VERBOSITY > 0) { - if ($this->numTokens === 0) { - $numLines = 0; - } else { - $numLines = $this->tokens[($this->numTokens - 1)]['line']; - } - - echo "[$this->tokenizerType => $this->numTokens tokens in $numLines lines]... "; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo PHP_EOL; - } - } - - }//end parse() - - - /** - * Returns the token stack for this file. - * - * @return array - */ - public function getTokens() - { - return $this->tokens; - - }//end getTokens() - - - /** - * Remove vars stored in this file that are no longer required. - * - * @return void - */ - public function cleanUp() - { - $this->listenerTimes = null; - $this->content = null; - $this->tokens = null; - $this->metricTokens = null; - $this->tokenizer = null; - $this->fixer = null; - $this->config = null; - $this->ruleset = null; - - }//end cleanUp() - - - /** - * Records an error against a specific token in the file. - * - * @param string $error The error message. - * @param int|null $stackPtr The stack position where the error occurred. - * @param string $code A violation code unique to the sniff message. - * @param array $data Replacements for the error message. - * @param int $severity The severity level for this error. A value of 0 - * will be converted into the default severity level. - * @param boolean $fixable Can the error be fixed by the sniff? - * - * @return boolean - */ - public function addError( - $error, - $stackPtr, - $code, - $data=[], - $severity=0, - $fixable=false - ) { - if ($stackPtr === null) { - $line = 1; - $column = 1; - } else { - $line = $this->tokens[$stackPtr]['line']; - $column = $this->tokens[$stackPtr]['column']; - } - - return $this->addMessage(true, $error, $line, $column, $code, $data, $severity, $fixable); - - }//end addError() - - - /** - * Records a warning against a specific token in the file. - * - * @param string $warning The error message. - * @param int|null $stackPtr The stack position where the error occurred. - * @param string $code A violation code unique to the sniff message. - * @param array $data Replacements for the warning message. - * @param int $severity The severity level for this warning. A value of 0 - * will be converted into the default severity level. - * @param boolean $fixable Can the warning be fixed by the sniff? - * - * @return boolean - */ - public function addWarning( - $warning, - $stackPtr, - $code, - $data=[], - $severity=0, - $fixable=false - ) { - if ($stackPtr === null) { - $line = 1; - $column = 1; - } else { - $line = $this->tokens[$stackPtr]['line']; - $column = $this->tokens[$stackPtr]['column']; - } - - return $this->addMessage(false, $warning, $line, $column, $code, $data, $severity, $fixable); - - }//end addWarning() - - - /** - * Records an error against a specific line in the file. - * - * @param string $error The error message. - * @param int $line The line on which the error occurred. - * @param string $code A violation code unique to the sniff message. - * @param array $data Replacements for the error message. - * @param int $severity The severity level for this error. A value of 0 - * will be converted into the default severity level. - * - * @return boolean - */ - public function addErrorOnLine( - $error, - $line, - $code, - $data=[], - $severity=0 - ) { - return $this->addMessage(true, $error, $line, 1, $code, $data, $severity, false); - - }//end addErrorOnLine() - - - /** - * Records a warning against a specific line in the file. - * - * @param string $warning The error message. - * @param int $line The line on which the warning occurred. - * @param string $code A violation code unique to the sniff message. - * @param array $data Replacements for the warning message. - * @param int $severity The severity level for this warning. A value of 0 will - * will be converted into the default severity level. - * - * @return boolean - */ - public function addWarningOnLine( - $warning, - $line, - $code, - $data=[], - $severity=0 - ) { - return $this->addMessage(false, $warning, $line, 1, $code, $data, $severity, false); - - }//end addWarningOnLine() - - - /** - * Records a fixable error against a specific token in the file. - * - * Returns true if the error was recorded and should be fixed. - * - * @param string $error The error message. - * @param int $stackPtr The stack position where the error occurred. - * @param string $code A violation code unique to the sniff message. - * @param array $data Replacements for the error message. - * @param int $severity The severity level for this error. A value of 0 - * will be converted into the default severity level. - * - * @return boolean - */ - public function addFixableError( - $error, - $stackPtr, - $code, - $data=[], - $severity=0 - ) { - $recorded = $this->addError($error, $stackPtr, $code, $data, $severity, true); - if ($recorded === true && $this->fixer->enabled === true) { - return true; - } - - return false; - - }//end addFixableError() - - - /** - * Records a fixable warning against a specific token in the file. - * - * Returns true if the warning was recorded and should be fixed. - * - * @param string $warning The error message. - * @param int $stackPtr The stack position where the error occurred. - * @param string $code A violation code unique to the sniff message. - * @param array $data Replacements for the warning message. - * @param int $severity The severity level for this warning. A value of 0 - * will be converted into the default severity level. - * - * @return boolean - */ - public function addFixableWarning( - $warning, - $stackPtr, - $code, - $data=[], - $severity=0 - ) { - $recorded = $this->addWarning($warning, $stackPtr, $code, $data, $severity, true); - if ($recorded === true && $this->fixer->enabled === true) { - return true; - } - - return false; - - }//end addFixableWarning() - - - /** - * Adds an error to the error stack. - * - * @param boolean $error Is this an error message? - * @param string $message The text of the message. - * @param int $line The line on which the message occurred. - * @param int $column The column at which the message occurred. - * @param string $code A violation code unique to the sniff message. - * @param array $data Replacements for the message. - * @param int $severity The severity level for this message. A value of 0 - * will be converted into the default severity level. - * @param boolean $fixable Can the problem be fixed by the sniff? - * - * @return boolean - */ - protected function addMessage($error, $message, $line, $column, $code, $data, $severity, $fixable) - { - // Check if this line is ignoring all message codes. - if (isset($this->tokenizer->ignoredLines[$line]['.all']) === true) { - return false; - } - - // Work out which sniff generated the message. - $parts = explode('.', $code); - if ($parts[0] === 'Internal') { - // An internal message. - $listenerCode = ''; - if ($this->activeListener !== '') { - $listenerCode = Common::getSniffCode($this->activeListener); - } - - $sniffCode = $code; - $checkCodes = [$sniffCode]; - } else { - if ($parts[0] !== $code) { - // The full message code has been passed in. - $sniffCode = $code; - $listenerCode = substr($sniffCode, 0, strrpos($sniffCode, '.')); - } else { - $listenerCode = Common::getSniffCode($this->activeListener); - $sniffCode = $listenerCode.'.'.$code; - $parts = explode('.', $sniffCode); - } - - $checkCodes = [ - $sniffCode, - $parts[0].'.'.$parts[1].'.'.$parts[2], - $parts[0].'.'.$parts[1], - $parts[0], - ]; - }//end if - - if (isset($this->tokenizer->ignoredLines[$line]) === true) { - // Check if this line is ignoring this specific message. - $ignored = false; - foreach ($checkCodes as $checkCode) { - if (isset($this->tokenizer->ignoredLines[$line][$checkCode]) === true) { - $ignored = true; - break; - } - } - - // If it is ignored, make sure there is no exception in place. - if ($ignored === true - && isset($this->tokenizer->ignoredLines[$line]['.except']) === true - ) { - foreach ($checkCodes as $checkCode) { - if (isset($this->tokenizer->ignoredLines[$line]['.except'][$checkCode]) === true) { - $ignored = false; - break; - } - } - } - - if ($ignored === true) { - return false; - } - }//end if - - $includeAll = true; - if ($this->configCache['cache'] === false - || $this->configCache['recordErrors'] === false - ) { - $includeAll = false; - } - - // Filter out any messages for sniffs that shouldn't have run - // due to the use of the --sniffs command line argument. - if ($includeAll === false - && ((empty($this->configCache['sniffs']) === false - && in_array(strtolower($listenerCode), $this->configCache['sniffs'], true) === false) - || (empty($this->configCache['exclude']) === false - && in_array(strtolower($listenerCode), $this->configCache['exclude'], true) === true)) - ) { - return false; - } - - // If we know this sniff code is being ignored for this file, return early. - foreach ($checkCodes as $checkCode) { - if (isset($this->ignoredCodes[$checkCode]) === true) { - return false; - } - } - - $oppositeType = 'warning'; - if ($error === false) { - $oppositeType = 'error'; - } - - foreach ($checkCodes as $checkCode) { - // Make sure this message type has not been set to the opposite message type. - if (isset($this->ruleset->ruleset[$checkCode]['type']) === true - && $this->ruleset->ruleset[$checkCode]['type'] === $oppositeType - ) { - $error = !$error; - break; - } - } - - if ($error === true) { - $configSeverity = $this->configCache['errorSeverity']; - $messageCount = &$this->errorCount; - $messages = &$this->errors; - } else { - $configSeverity = $this->configCache['warningSeverity']; - $messageCount = &$this->warningCount; - $messages = &$this->warnings; - } - - if ($includeAll === false && $configSeverity === 0) { - // Don't bother doing any processing as these messages are just going to - // be hidden in the reports anyway. - return false; - } - - if ($severity === 0) { - $severity = 5; - } - - foreach ($checkCodes as $checkCode) { - // Make sure we are interested in this severity level. - if (isset($this->ruleset->ruleset[$checkCode]['severity']) === true) { - $severity = $this->ruleset->ruleset[$checkCode]['severity']; - break; - } - } - - if ($includeAll === false && $configSeverity > $severity) { - return false; - } - - // Make sure we are not ignoring this file. - $included = null; - if (trim($this->path, '\'"') === 'STDIN') { - $included = true; - } else { - foreach ($checkCodes as $checkCode) { - $patterns = null; - - if (isset($this->configCache['includePatterns'][$checkCode]) === true) { - $patterns = $this->configCache['includePatterns'][$checkCode]; - $excluding = false; - } else if (isset($this->configCache['ignorePatterns'][$checkCode]) === true) { - $patterns = $this->configCache['ignorePatterns'][$checkCode]; - $excluding = true; - } - - if ($patterns === null) { - continue; - } - - foreach ($patterns as $pattern => $type) { - // While there is support for a type of each pattern - // (absolute or relative) we don't actually support it here. - $replacements = [ - '\\,' => ',', - '*' => '.*', - ]; - - // We assume a / directory separator, as do the exclude rules - // most developers write, so we need a special case for any system - // that is different. - if (DIRECTORY_SEPARATOR === '\\') { - $replacements['/'] = '\\\\'; - } - - $pattern = '`'.strtr($pattern, $replacements).'`i'; - $matched = preg_match($pattern, $this->path); - - if ($matched === 0) { - if ($excluding === false && $included === null) { - // This file path is not being included. - $included = false; - } - - continue; - } - - if ($excluding === true) { - // This file path is being excluded. - $this->ignoredCodes[$checkCode] = true; - return false; - } - - // This file path is being included. - $included = true; - break; - }//end foreach - }//end foreach - }//end if - - if ($included === false) { - // There were include rules set, but this file - // path didn't match any of them. - return false; - } - - $messageCount++; - if ($fixable === true) { - $this->fixableCount++; - } - - if ($this->configCache['recordErrors'] === false - && $includeAll === false - ) { - return true; - } - - // See if there is a custom error message format to use. - // But don't do this if we are replaying errors because replayed - // errors have already used the custom format and have had their - // data replaced. - if ($this->replayingErrors === false - && isset($this->ruleset->ruleset[$sniffCode]['message']) === true - ) { - $message = $this->ruleset->ruleset[$sniffCode]['message']; - } - - if (empty($data) === false) { - $message = vsprintf($message, $data); - } - - if (isset($messages[$line]) === false) { - $messages[$line] = []; - } - - if (isset($messages[$line][$column]) === false) { - $messages[$line][$column] = []; - } - - $messages[$line][$column][] = [ - 'message' => $message, - 'source' => $sniffCode, - 'listener' => $this->activeListener, - 'severity' => $severity, - 'fixable' => $fixable, - ]; - - if (PHP_CODESNIFFER_VERBOSITY > 1 - && $this->fixer->enabled === true - && $fixable === true - ) { - @ob_end_clean(); - echo "\tE: [Line $line] $message ($sniffCode)".PHP_EOL; - ob_start(); - } - - return true; - - }//end addMessage() - - - /** - * Record a metric about the file being examined. - * - * @param int $stackPtr The stack position where the metric was recorded. - * @param string $metric The name of the metric being recorded. - * @param string $value The value of the metric being recorded. - * - * @return boolean - */ - public function recordMetric($stackPtr, $metric, $value) - { - if (isset($this->metrics[$metric]) === false) { - $this->metrics[$metric] = ['values' => [$value => 1]]; - $this->metricTokens[$metric][$stackPtr] = true; - } else if (isset($this->metricTokens[$metric][$stackPtr]) === false) { - $this->metricTokens[$metric][$stackPtr] = true; - if (isset($this->metrics[$metric]['values'][$value]) === false) { - $this->metrics[$metric]['values'][$value] = 1; - } else { - $this->metrics[$metric]['values'][$value]++; - } - } - - return true; - - }//end recordMetric() - - - /** - * Returns the number of errors raised. - * - * @return int - */ - public function getErrorCount() - { - return $this->errorCount; - - }//end getErrorCount() - - - /** - * Returns the number of warnings raised. - * - * @return int - */ - public function getWarningCount() - { - return $this->warningCount; - - }//end getWarningCount() - - - /** - * Returns the number of fixable errors/warnings raised. - * - * @return int - */ - public function getFixableCount() - { - return $this->fixableCount; - - }//end getFixableCount() - - - /** - * Returns the number of fixed errors/warnings. - * - * @return int - */ - public function getFixedCount() - { - return $this->fixedCount; - - }//end getFixedCount() - - - /** - * Returns the list of ignored lines. - * - * @return array - */ - public function getIgnoredLines() - { - return $this->tokenizer->ignoredLines; - - }//end getIgnoredLines() - - - /** - * Returns the errors raised from processing this file. - * - * @return array - */ - public function getErrors() - { - return $this->errors; - - }//end getErrors() - - - /** - * Returns the warnings raised from processing this file. - * - * @return array - */ - public function getWarnings() - { - return $this->warnings; - - }//end getWarnings() - - - /** - * Returns the metrics found while processing this file. - * - * @return array - */ - public function getMetrics() - { - return $this->metrics; - - }//end getMetrics() - - - /** - * Returns the time taken processing this file for each invoked sniff. - * - * @return array - */ - public function getListenerTimes() - { - return $this->listenerTimes; - - }//end getListenerTimes() - - - /** - * Returns the absolute filename of this file. - * - * @return string - */ - public function getFilename() - { - return $this->path; - - }//end getFilename() - - - /** - * Returns the declaration name for classes, interfaces, traits, enums, and functions. - * - * @param int $stackPtr The position of the declaration token which - * declared the class, interface, trait, or function. - * - * @return string|null The name of the class, interface, trait, or function; - * or NULL if the function or class is anonymous. - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If the specified token is not of type - * T_FUNCTION, T_CLASS, T_ANON_CLASS, - * T_CLOSURE, T_TRAIT, T_ENUM, or T_INTERFACE. - */ - public function getDeclarationName($stackPtr) - { - $tokenCode = $this->tokens[$stackPtr]['code']; - - if ($tokenCode === T_ANON_CLASS || $tokenCode === T_CLOSURE) { - return null; - } - - if ($tokenCode !== T_FUNCTION - && $tokenCode !== T_CLASS - && $tokenCode !== T_INTERFACE - && $tokenCode !== T_TRAIT - && $tokenCode !== T_ENUM - ) { - throw new RuntimeException('Token type "'.$this->tokens[$stackPtr]['type'].'" is not T_FUNCTION, T_CLASS, T_INTERFACE, T_TRAIT or T_ENUM'); - } - - if ($tokenCode === T_FUNCTION - && strtolower($this->tokens[$stackPtr]['content']) !== 'function' - ) { - // This is a function declared without the "function" keyword. - // So this token is the function name. - return $this->tokens[$stackPtr]['content']; - } - - $stopPoint = $this->numTokens; - if (isset($this->tokens[$stackPtr]['parenthesis_opener']) === true) { - // For functions, stop searching at the parenthesis opener. - $stopPoint = $this->tokens[$stackPtr]['parenthesis_opener']; - } else if (isset($this->tokens[$stackPtr]['scope_opener']) === true) { - // For OO tokens, stop searching at the open curly. - $stopPoint = $this->tokens[$stackPtr]['scope_opener']; - } - - $content = null; - for ($i = $stackPtr; $i < $stopPoint; $i++) { - if ($this->tokens[$i]['code'] === T_STRING) { - $content = $this->tokens[$i]['content']; - break; - } - } - - return $content; - - }//end getDeclarationName() - - - /** - * Returns the method parameters for the specified function token. - * - * Also supports passing in a USE token for a closure use group. - * - * Each parameter is in the following format: - * - * - * 0 => array( - * 'name' => string, // The variable name. - * 'token' => integer, // The stack pointer to the variable name. - * 'content' => string, // The full content of the variable definition. - * 'has_attributes' => boolean, // Does the parameter have one or more attributes attached ? - * 'pass_by_reference' => boolean, // Is the variable passed by reference? - * 'reference_token' => integer|false, // The stack pointer to the reference operator - * // or FALSE if the param is not passed by reference. - * 'variable_length' => boolean, // Is the param of variable length through use of `...` ? - * 'variadic_token' => integer|false, // The stack pointer to the ... operator - * // or FALSE if the param is not variable length. - * 'type_hint' => string, // The type hint for the variable. - * 'type_hint_token' => integer|false, // The stack pointer to the start of the type hint - * // or FALSE if there is no type hint. - * 'type_hint_end_token' => integer|false, // The stack pointer to the end of the type hint - * // or FALSE if there is no type hint. - * 'nullable_type' => boolean, // TRUE if the type is preceded by the nullability - * // operator. - * 'comma_token' => integer|false, // The stack pointer to the comma after the param - * // or FALSE if this is the last param. - * ) - * - * - * Parameters with default values have additional array indexes of: - * 'default' => string, // The full content of the default value. - * 'default_token' => integer, // The stack pointer to the start of the default value. - * 'default_equal_token' => integer, // The stack pointer to the equals sign. - * - * Parameters declared using PHP 8 constructor property promotion, have these additional array indexes: - * 'property_visibility' => string, // The property visibility as declared. - * 'visibility_token' => integer|false, // The stack pointer to the visibility modifier token - * // or FALSE if the visibility is not explicitly declared. - * 'property_readonly' => boolean, // TRUE if the readonly keyword was found. - * 'readonly_token' => integer, // The stack pointer to the readonly modifier token. - * // This index will only be set if the property is readonly. - * - * ... and if the promoted property uses asymmetric visibility, these additional array indexes will also be available: - * 'set_visibility' => string, // The property set-visibility as declared. - * 'set_visibility_token' => integer, // The stack pointer to the set-visibility modifier token. - * - * @param int $stackPtr The position in the stack of the function token - * to acquire the parameters for. - * - * @return array - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If the specified $stackPtr is not of - * type T_FUNCTION, T_CLOSURE, T_USE, - * or T_FN. - */ - public function getMethodParameters($stackPtr) - { - if ($this->tokens[$stackPtr]['code'] !== T_FUNCTION - && $this->tokens[$stackPtr]['code'] !== T_CLOSURE - && $this->tokens[$stackPtr]['code'] !== T_USE - && $this->tokens[$stackPtr]['code'] !== T_FN - ) { - throw new RuntimeException('$stackPtr must be of type T_FUNCTION or T_CLOSURE or T_USE or T_FN'); - } - - if ($this->tokens[$stackPtr]['code'] === T_USE) { - $opener = $this->findNext(T_OPEN_PARENTHESIS, ($stackPtr + 1)); - if ($opener === false || isset($this->tokens[$opener]['parenthesis_owner']) === true) { - throw new RuntimeException('$stackPtr was not a valid T_USE'); - } - } else { - if (isset($this->tokens[$stackPtr]['parenthesis_opener']) === false) { - // Live coding or syntax error, so no params to find. - return []; - } - - $opener = $this->tokens[$stackPtr]['parenthesis_opener']; - } - - if (isset($this->tokens[$opener]['parenthesis_closer']) === false) { - // Live coding or syntax error, so no params to find. - return []; - } - - $closer = $this->tokens[$opener]['parenthesis_closer']; - - $vars = []; - $currVar = null; - $paramStart = ($opener + 1); - $defaultStart = null; - $equalToken = null; - $paramCount = 0; - $hasAttributes = false; - $passByReference = false; - $referenceToken = false; - $variableLength = false; - $variadicToken = false; - $typeHint = ''; - $typeHintToken = false; - $typeHintEndToken = false; - $nullableType = false; - $visibilityToken = null; - $setVisibilityToken = null; - $readonlyToken = null; - - for ($i = $paramStart; $i <= $closer; $i++) { - // Check to see if this token has a parenthesis or bracket opener. If it does - // it's likely to be an array which might have arguments in it. This - // could cause problems in our parsing below, so lets just skip to the - // end of it. - if ($this->tokens[$i]['code'] !== T_TYPE_OPEN_PARENTHESIS - && isset($this->tokens[$i]['parenthesis_opener']) === true - ) { - // Don't do this if it's the close parenthesis for the method. - if ($i !== $this->tokens[$i]['parenthesis_closer']) { - $i = $this->tokens[$i]['parenthesis_closer']; - continue; - } - } - - if (isset($this->tokens[$i]['bracket_opener']) === true) { - if ($i !== $this->tokens[$i]['bracket_closer']) { - $i = $this->tokens[$i]['bracket_closer']; - continue; - } - } - - switch ($this->tokens[$i]['code']) { - case T_ATTRIBUTE: - $hasAttributes = true; - - // Skip to the end of the attribute. - $i = $this->tokens[$i]['attribute_closer']; - break; - case T_BITWISE_AND: - if ($defaultStart === null) { - $passByReference = true; - $referenceToken = $i; - } - break; - case T_VARIABLE: - $currVar = $i; - break; - case T_ELLIPSIS: - $variableLength = true; - $variadicToken = $i; - break; - case T_CALLABLE: - if ($typeHintToken === false) { - $typeHintToken = $i; - } - - $typeHint .= $this->tokens[$i]['content']; - $typeHintEndToken = $i; - break; - case T_SELF: - case T_PARENT: - case T_STATIC: - // Self and parent are valid, static invalid, but was probably intended as type hint. - if (isset($defaultStart) === false) { - if ($typeHintToken === false) { - $typeHintToken = $i; - } - - $typeHint .= $this->tokens[$i]['content']; - $typeHintEndToken = $i; - } - break; - case T_STRING: - // This is a string, so it may be a type hint, but it could - // also be a constant used as a default value. - $prevComma = false; - for ($t = $i; $t >= $opener; $t--) { - if ($this->tokens[$t]['code'] === T_COMMA) { - $prevComma = $t; - break; - } - } - - if ($prevComma !== false) { - $nextEquals = false; - for ($t = $prevComma; $t < $i; $t++) { - if ($this->tokens[$t]['code'] === T_EQUAL) { - $nextEquals = $t; - break; - } - } - - if ($nextEquals !== false) { - break; - } - } - - if ($defaultStart === null) { - if ($typeHintToken === false) { - $typeHintToken = $i; - } - - $typeHint .= $this->tokens[$i]['content']; - $typeHintEndToken = $i; - } - break; - case T_NAMESPACE: - case T_NS_SEPARATOR: - case T_TYPE_UNION: - case T_TYPE_INTERSECTION: - case T_TYPE_OPEN_PARENTHESIS: - case T_TYPE_CLOSE_PARENTHESIS: - case T_FALSE: - case T_TRUE: - case T_NULL: - // Part of a type hint or default value. - if ($defaultStart === null) { - if ($typeHintToken === false) { - $typeHintToken = $i; - } - - $typeHint .= $this->tokens[$i]['content']; - $typeHintEndToken = $i; - } - break; - case T_NULLABLE: - if ($defaultStart === null) { - $nullableType = true; - $typeHint .= $this->tokens[$i]['content']; - $typeHintEndToken = $i; - } - break; - case T_PUBLIC: - case T_PROTECTED: - case T_PRIVATE: - if ($defaultStart === null) { - $visibilityToken = $i; - } - break; - case T_PUBLIC_SET: - case T_PROTECTED_SET: - case T_PRIVATE_SET: - if ($defaultStart === null) { - $setVisibilityToken = $i; - } - break; - case T_READONLY: - if ($defaultStart === null) { - $readonlyToken = $i; - } - break; - case T_CLOSE_PARENTHESIS: - case T_COMMA: - // If it's null, then there must be no parameters for this - // method. - if ($currVar === null) { - continue 2; - } - - $vars[$paramCount] = []; - $vars[$paramCount]['token'] = $currVar; - $vars[$paramCount]['name'] = $this->tokens[$currVar]['content']; - $vars[$paramCount]['content'] = trim($this->getTokensAsString($paramStart, ($i - $paramStart))); - - if ($defaultStart !== null) { - $vars[$paramCount]['default'] = trim($this->getTokensAsString($defaultStart, ($i - $defaultStart))); - $vars[$paramCount]['default_token'] = $defaultStart; - $vars[$paramCount]['default_equal_token'] = $equalToken; - } - - $vars[$paramCount]['has_attributes'] = $hasAttributes; - $vars[$paramCount]['pass_by_reference'] = $passByReference; - $vars[$paramCount]['reference_token'] = $referenceToken; - $vars[$paramCount]['variable_length'] = $variableLength; - $vars[$paramCount]['variadic_token'] = $variadicToken; - $vars[$paramCount]['type_hint'] = $typeHint; - $vars[$paramCount]['type_hint_token'] = $typeHintToken; - $vars[$paramCount]['type_hint_end_token'] = $typeHintEndToken; - $vars[$paramCount]['nullable_type'] = $nullableType; - - if ($visibilityToken !== null || $setVisibilityToken !== null || $readonlyToken !== null) { - $vars[$paramCount]['property_visibility'] = 'public'; - $vars[$paramCount]['visibility_token'] = false; - - if ($visibilityToken !== null) { - $vars[$paramCount]['property_visibility'] = $this->tokens[$visibilityToken]['content']; - $vars[$paramCount]['visibility_token'] = $visibilityToken; - } - - if ($setVisibilityToken !== null) { - $vars[$paramCount]['set_visibility'] = $this->tokens[$setVisibilityToken]['content']; - $vars[$paramCount]['set_visibility_token'] = $setVisibilityToken; - } - - $vars[$paramCount]['property_readonly'] = false; - if ($readonlyToken !== null) { - $vars[$paramCount]['property_readonly'] = true; - $vars[$paramCount]['readonly_token'] = $readonlyToken; - } - } - - if ($this->tokens[$i]['code'] === T_COMMA) { - $vars[$paramCount]['comma_token'] = $i; - } else { - $vars[$paramCount]['comma_token'] = false; - } - - // Reset the vars, as we are about to process the next parameter. - $currVar = null; - $paramStart = ($i + 1); - $defaultStart = null; - $equalToken = null; - $hasAttributes = false; - $passByReference = false; - $referenceToken = false; - $variableLength = false; - $variadicToken = false; - $typeHint = ''; - $typeHintToken = false; - $typeHintEndToken = false; - $nullableType = false; - $visibilityToken = null; - $setVisibilityToken = null; - $readonlyToken = null; - - $paramCount++; - break; - case T_EQUAL: - $defaultStart = $this->findNext(Tokens::$emptyTokens, ($i + 1), null, true); - $equalToken = $i; - break; - }//end switch - }//end for - - return $vars; - - }//end getMethodParameters() - - - /** - * Returns the visibility and implementation properties of a method. - * - * The format of the return value is: - * - * array( - * 'scope' => string, // Public, private, or protected - * 'scope_specified' => boolean, // TRUE if the scope keyword was found. - * 'return_type' => string, // The return type of the method. - * 'return_type_token' => integer|false, // The stack pointer to the start of the return type - * // or FALSE if there is no return type. - * 'return_type_end_token' => integer|false, // The stack pointer to the end of the return type - * // or FALSE if there is no return type. - * 'nullable_return_type' => boolean, // TRUE if the return type is preceded by the - * // nullability operator. - * 'is_abstract' => boolean, // TRUE if the abstract keyword was found. - * 'is_final' => boolean, // TRUE if the final keyword was found. - * 'is_static' => boolean, // TRUE if the static keyword was found. - * 'has_body' => boolean, // TRUE if the method has a body - * ); - * - * - * @param int $stackPtr The position in the stack of the function token to - * acquire the properties for. - * - * @return array - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If the specified position is not a - * T_FUNCTION, T_CLOSURE, or T_FN token. - */ - public function getMethodProperties($stackPtr) - { - if ($this->tokens[$stackPtr]['code'] !== T_FUNCTION - && $this->tokens[$stackPtr]['code'] !== T_CLOSURE - && $this->tokens[$stackPtr]['code'] !== T_FN - ) { - throw new RuntimeException('$stackPtr must be of type T_FUNCTION or T_CLOSURE or T_FN'); - } - - if ($this->tokens[$stackPtr]['code'] === T_FUNCTION) { - $valid = [ - T_PUBLIC => T_PUBLIC, - T_PRIVATE => T_PRIVATE, - T_PROTECTED => T_PROTECTED, - T_STATIC => T_STATIC, - T_FINAL => T_FINAL, - T_ABSTRACT => T_ABSTRACT, - T_WHITESPACE => T_WHITESPACE, - T_COMMENT => T_COMMENT, - T_DOC_COMMENT => T_DOC_COMMENT, - ]; - } else { - $valid = [ - T_STATIC => T_STATIC, - T_WHITESPACE => T_WHITESPACE, - T_COMMENT => T_COMMENT, - T_DOC_COMMENT => T_DOC_COMMENT, - ]; - } - - $scope = 'public'; - $scopeSpecified = false; - $isAbstract = false; - $isFinal = false; - $isStatic = false; - - for ($i = ($stackPtr - 1); $i > 0; $i--) { - if (isset($valid[$this->tokens[$i]['code']]) === false) { - break; - } - - switch ($this->tokens[$i]['code']) { - case T_PUBLIC: - $scope = 'public'; - $scopeSpecified = true; - break; - case T_PRIVATE: - $scope = 'private'; - $scopeSpecified = true; - break; - case T_PROTECTED: - $scope = 'protected'; - $scopeSpecified = true; - break; - case T_ABSTRACT: - $isAbstract = true; - break; - case T_FINAL: - $isFinal = true; - break; - case T_STATIC: - $isStatic = true; - break; - }//end switch - }//end for - - $returnType = ''; - $returnTypeToken = false; - $returnTypeEndToken = false; - $nullableReturnType = false; - $hasBody = true; - - if (isset($this->tokens[$stackPtr]['parenthesis_closer']) === true) { - $scopeOpener = null; - if (isset($this->tokens[$stackPtr]['scope_opener']) === true) { - $scopeOpener = $this->tokens[$stackPtr]['scope_opener']; - } - - $valid = [ - T_STRING => T_STRING, - T_CALLABLE => T_CALLABLE, - T_SELF => T_SELF, - T_PARENT => T_PARENT, - T_STATIC => T_STATIC, - T_FALSE => T_FALSE, - T_TRUE => T_TRUE, - T_NULL => T_NULL, - T_NAMESPACE => T_NAMESPACE, - T_NS_SEPARATOR => T_NS_SEPARATOR, - T_TYPE_UNION => T_TYPE_UNION, - T_TYPE_INTERSECTION => T_TYPE_INTERSECTION, - T_TYPE_OPEN_PARENTHESIS => T_TYPE_OPEN_PARENTHESIS, - T_TYPE_CLOSE_PARENTHESIS => T_TYPE_CLOSE_PARENTHESIS, - ]; - - for ($i = $this->tokens[$stackPtr]['parenthesis_closer']; $i < $this->numTokens; $i++) { - if (($scopeOpener === null && $this->tokens[$i]['code'] === T_SEMICOLON) - || ($scopeOpener !== null && $i === $scopeOpener) - ) { - // End of function definition. - break; - } - - if ($this->tokens[$i]['code'] === T_USE) { - // Skip over closure use statements. - for ($j = ($i + 1); $j < $this->numTokens && isset(Tokens::$emptyTokens[$this->tokens[$j]['code']]) === true; $j++); - if ($this->tokens[$j]['code'] === T_OPEN_PARENTHESIS) { - if (isset($this->tokens[$j]['parenthesis_closer']) === false) { - // Live coding/parse error, stop parsing. - break; - } - - $i = $this->tokens[$j]['parenthesis_closer']; - continue; - } - } - - if ($this->tokens[$i]['code'] === T_NULLABLE) { - $nullableReturnType = true; - } - - if (isset($valid[$this->tokens[$i]['code']]) === true) { - if ($returnTypeToken === false) { - $returnTypeToken = $i; - } - - $returnType .= $this->tokens[$i]['content']; - $returnTypeEndToken = $i; - } - }//end for - - if ($this->tokens[$stackPtr]['code'] === T_FN) { - $bodyToken = T_FN_ARROW; - } else { - $bodyToken = T_OPEN_CURLY_BRACKET; - } - - $end = $this->findNext([$bodyToken, T_SEMICOLON], $this->tokens[$stackPtr]['parenthesis_closer']); - $hasBody = $this->tokens[$end]['code'] === $bodyToken; - }//end if - - if ($returnType !== '' && $nullableReturnType === true) { - $returnType = '?'.$returnType; - } - - return [ - 'scope' => $scope, - 'scope_specified' => $scopeSpecified, - 'return_type' => $returnType, - 'return_type_token' => $returnTypeToken, - 'return_type_end_token' => $returnTypeEndToken, - 'nullable_return_type' => $nullableReturnType, - 'is_abstract' => $isAbstract, - 'is_final' => $isFinal, - 'is_static' => $isStatic, - 'has_body' => $hasBody, - ]; - - }//end getMethodProperties() - - - /** - * Returns the visibility and implementation properties of a class member var. - * - * The format of the return value is: - * - * - * array( - * 'scope' => string, // Public, private, or protected. - * 'scope_specified' => boolean, // TRUE if the scope was explicitly specified. - * 'set_scope' => string|false, // Scope for asymmetric visibility. - * // Either public, private, or protected or - * // FALSE if no set scope is specified. - * 'is_static' => boolean, // TRUE if the static keyword was found. - * 'is_readonly' => boolean, // TRUE if the readonly keyword was found. - * 'is_final' => boolean, // TRUE if the final keyword was found. - * 'is_abstract' => boolean, // TRUE if the abstract keyword was found. - * 'type' => string, // The type of the var (empty if no type specified). - * 'type_token' => integer|false, // The stack pointer to the start of the type - * // or FALSE if there is no type. - * 'type_end_token' => integer|false, // The stack pointer to the end of the type - * // or FALSE if there is no type. - * 'nullable_type' => boolean, // TRUE if the type is preceded by the nullability - * // operator. - * ); - * - * - * @param int $stackPtr The position in the stack of the T_VARIABLE token to - * acquire the properties for. - * - * @return array - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If the specified position is not a - * T_VARIABLE token, or if the position is not - * a class member variable. - */ - public function getMemberProperties($stackPtr) - { - if ($this->tokens[$stackPtr]['code'] !== T_VARIABLE) { - throw new RuntimeException('$stackPtr must be of type T_VARIABLE'); - } - - if (empty($this->tokens[$stackPtr]['conditions']) === true) { - throw new RuntimeException('$stackPtr is not a class member var'); - } - - $conditions = array_keys($this->tokens[$stackPtr]['conditions']); - $ptr = array_pop($conditions); - if (isset($this->tokens[$ptr]) === false - || ($this->tokens[$ptr]['code'] !== T_CLASS - && $this->tokens[$ptr]['code'] !== T_ANON_CLASS - && $this->tokens[$ptr]['code'] !== T_TRAIT) - ) { - if (isset($this->tokens[$ptr]) === true - && ($this->tokens[$ptr]['code'] === T_INTERFACE - || $this->tokens[$ptr]['code'] === T_ENUM) - ) { - // T_VARIABLEs in interfaces/enums can actually be method arguments - // but they won't be seen as being inside the method because there - // are no scope openers and closers for abstract methods. If it is in - // parentheses, we can be pretty sure it is a method argument. - if (isset($this->tokens[$stackPtr]['nested_parenthesis']) === false - || empty($this->tokens[$stackPtr]['nested_parenthesis']) === true - ) { - $error = 'Possible parse error: %ss may not include member vars'; - $code = sprintf('Internal.ParseError.%sHasMemberVar', ucfirst($this->tokens[$ptr]['content'])); - $data = [strtolower($this->tokens[$ptr]['content'])]; - $this->addWarning($error, $stackPtr, $code, $data); - return []; - } - } else { - throw new RuntimeException('$stackPtr is not a class member var'); - } - }//end if - - // Make sure it's not a method parameter. - if (empty($this->tokens[$stackPtr]['nested_parenthesis']) === false) { - $parenthesis = array_keys($this->tokens[$stackPtr]['nested_parenthesis']); - $deepestOpen = array_pop($parenthesis); - if ($deepestOpen > $ptr - && isset($this->tokens[$deepestOpen]['parenthesis_owner']) === true - && $this->tokens[$this->tokens[$deepestOpen]['parenthesis_owner']]['code'] === T_FUNCTION - ) { - throw new RuntimeException('$stackPtr is not a class member var'); - } - } - - $valid = [ - T_STATIC => T_STATIC, - T_VAR => T_VAR, - T_READONLY => T_READONLY, - T_FINAL => T_FINAL, - T_ABSTRACT => T_ABSTRACT, - ]; - - $valid += Tokens::$scopeModifiers; - $valid += Tokens::$emptyTokens; - - $scope = 'public'; - $scopeSpecified = false; - $setScope = false; - $isStatic = false; - $isReadonly = false; - $isFinal = false; - $isAbstract = false; - - $startOfStatement = $this->findPrevious( - [ - T_SEMICOLON, - T_OPEN_CURLY_BRACKET, - T_CLOSE_CURLY_BRACKET, - T_ATTRIBUTE_END, - ], - ($stackPtr - 1) - ); - - for ($i = ($startOfStatement + 1); $i < $stackPtr; $i++) { - if (isset($valid[$this->tokens[$i]['code']]) === false) { - break; - } - - switch ($this->tokens[$i]['code']) { - case T_PUBLIC: - $scope = 'public'; - $scopeSpecified = true; - break; - case T_PRIVATE: - $scope = 'private'; - $scopeSpecified = true; - break; - case T_PROTECTED: - $scope = 'protected'; - $scopeSpecified = true; - break; - case T_PUBLIC_SET: - $setScope = 'public'; - break; - case T_PROTECTED_SET: - $setScope = 'protected'; - break; - case T_PRIVATE_SET: - $setScope = 'private'; - break; - case T_STATIC: - $isStatic = true; - break; - case T_READONLY: - $isReadonly = true; - break; - case T_FINAL: - $isFinal = true; - break; - case T_ABSTRACT: - $isAbstract = true; - break; - }//end switch - }//end for - - $type = ''; - $typeToken = false; - $typeEndToken = false; - $nullableType = false; - - if ($i < $stackPtr) { - // We've found a type. - $valid = [ - T_STRING => T_STRING, - T_CALLABLE => T_CALLABLE, - T_SELF => T_SELF, - T_PARENT => T_PARENT, - T_FALSE => T_FALSE, - T_TRUE => T_TRUE, - T_NULL => T_NULL, - T_NAMESPACE => T_NAMESPACE, - T_NS_SEPARATOR => T_NS_SEPARATOR, - T_TYPE_UNION => T_TYPE_UNION, - T_TYPE_INTERSECTION => T_TYPE_INTERSECTION, - T_TYPE_OPEN_PARENTHESIS => T_TYPE_OPEN_PARENTHESIS, - T_TYPE_CLOSE_PARENTHESIS => T_TYPE_CLOSE_PARENTHESIS, - ]; - - for ($i; $i < $stackPtr; $i++) { - if ($this->tokens[$i]['code'] === T_VARIABLE) { - // Hit another variable in a group definition. - break; - } - - if ($this->tokens[$i]['code'] === T_NULLABLE) { - $nullableType = true; - } - - if (isset($valid[$this->tokens[$i]['code']]) === true) { - $typeEndToken = $i; - if ($typeToken === false) { - $typeToken = $i; - } - - $type .= $this->tokens[$i]['content']; - } - } - - if ($type !== '' && $nullableType === true) { - $type = '?'.$type; - } - }//end if - - return [ - 'scope' => $scope, - 'scope_specified' => $scopeSpecified, - 'set_scope' => $setScope, - 'is_static' => $isStatic, - 'is_readonly' => $isReadonly, - 'is_final' => $isFinal, - 'is_abstract' => $isAbstract, - 'type' => $type, - 'type_token' => $typeToken, - 'type_end_token' => $typeEndToken, - 'nullable_type' => $nullableType, - ]; - - }//end getMemberProperties() - - - /** - * Returns the visibility and implementation properties of a class. - * - * The format of the return value is: - * - * array( - * 'is_abstract' => boolean, // TRUE if the abstract keyword was found. - * 'is_final' => boolean, // TRUE if the final keyword was found. - * 'is_readonly' => boolean, // TRUE if the readonly keyword was found. - * ); - * - * - * @param int $stackPtr The position in the stack of the T_CLASS token to - * acquire the properties for. - * - * @return array - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If the specified position is not a - * T_CLASS token. - */ - public function getClassProperties($stackPtr) - { - if ($this->tokens[$stackPtr]['code'] !== T_CLASS) { - throw new RuntimeException('$stackPtr must be of type T_CLASS'); - } - - $valid = [ - T_FINAL => T_FINAL, - T_ABSTRACT => T_ABSTRACT, - T_READONLY => T_READONLY, - T_WHITESPACE => T_WHITESPACE, - T_COMMENT => T_COMMENT, - T_DOC_COMMENT => T_DOC_COMMENT, - ]; - - $isAbstract = false; - $isFinal = false; - $isReadonly = false; - - for ($i = ($stackPtr - 1); $i > 0; $i--) { - if (isset($valid[$this->tokens[$i]['code']]) === false) { - break; - } - - switch ($this->tokens[$i]['code']) { - case T_ABSTRACT: - $isAbstract = true; - break; - - case T_FINAL: - $isFinal = true; - break; - - case T_READONLY: - $isReadonly = true; - break; - } - }//end for - - return [ - 'is_abstract' => $isAbstract, - 'is_final' => $isFinal, - 'is_readonly' => $isReadonly, - ]; - - }//end getClassProperties() - - - /** - * Determine if the passed token is a reference operator. - * - * Returns true if the specified token position represents a reference. - * Returns false if the token represents a bitwise operator. - * - * @param int $stackPtr The position of the T_BITWISE_AND token. - * - * @return boolean - */ - public function isReference($stackPtr) - { - if ($this->tokens[$stackPtr]['code'] !== T_BITWISE_AND) { - return false; - } - - $tokenBefore = $this->findPrevious( - Tokens::$emptyTokens, - ($stackPtr - 1), - null, - true - ); - - if ($this->tokens[$tokenBefore]['code'] === T_FUNCTION - || $this->tokens[$tokenBefore]['code'] === T_CLOSURE - || $this->tokens[$tokenBefore]['code'] === T_FN - ) { - // Function returns a reference. - return true; - } - - if ($this->tokens[$tokenBefore]['code'] === T_DOUBLE_ARROW) { - // Inside a foreach loop or array assignment, this is a reference. - return true; - } - - if ($this->tokens[$tokenBefore]['code'] === T_AS) { - // Inside a foreach loop, this is a reference. - return true; - } - - if (isset(Tokens::$assignmentTokens[$this->tokens[$tokenBefore]['code']]) === true) { - // This is directly after an assignment. It's a reference. Even if - // it is part of an operation, the other tests will handle it. - return true; - } - - $tokenAfter = $this->findNext( - Tokens::$emptyTokens, - ($stackPtr + 1), - null, - true - ); - - if ($this->tokens[$tokenAfter]['code'] === T_NEW) { - return true; - } - - if (isset($this->tokens[$stackPtr]['nested_parenthesis']) === true) { - $brackets = $this->tokens[$stackPtr]['nested_parenthesis']; - $lastBracket = array_pop($brackets); - if (isset($this->tokens[$lastBracket]['parenthesis_owner']) === true) { - $owner = $this->tokens[$this->tokens[$lastBracket]['parenthesis_owner']]; - if ($owner['code'] === T_FUNCTION - || $owner['code'] === T_CLOSURE - || $owner['code'] === T_FN - ) { - $params = $this->getMethodParameters($this->tokens[$lastBracket]['parenthesis_owner']); - foreach ($params as $param) { - if ($param['reference_token'] === $stackPtr) { - // Function parameter declared to be passed by reference. - return true; - } - } - }//end if - } else { - $prev = false; - for ($t = ($this->tokens[$lastBracket]['parenthesis_opener'] - 1); $t >= 0; $t--) { - if ($this->tokens[$t]['code'] !== T_WHITESPACE) { - $prev = $t; - break; - } - } - - if ($prev !== false && $this->tokens[$prev]['code'] === T_USE) { - // Closure use by reference. - return true; - } - }//end if - }//end if - - // Pass by reference in function calls and assign by reference in arrays. - if ($this->tokens[$tokenBefore]['code'] === T_OPEN_PARENTHESIS - || $this->tokens[$tokenBefore]['code'] === T_COMMA - || $this->tokens[$tokenBefore]['code'] === T_OPEN_SHORT_ARRAY - ) { - if ($this->tokens[$tokenAfter]['code'] === T_VARIABLE) { - return true; - } else { - $skip = Tokens::$emptyTokens; - $skip[] = T_NS_SEPARATOR; - $skip[] = T_SELF; - $skip[] = T_PARENT; - $skip[] = T_STATIC; - $skip[] = T_STRING; - $skip[] = T_NAMESPACE; - $skip[] = T_DOUBLE_COLON; - - $nextSignificantAfter = $this->findNext( - $skip, - ($stackPtr + 1), - null, - true - ); - if ($this->tokens[$nextSignificantAfter]['code'] === T_VARIABLE) { - return true; - } - }//end if - }//end if - - return false; - - }//end isReference() - - - /** - * Returns the content of the tokens from the specified start position in - * the token stack for the specified length. - * - * @param int $start The position to start from in the token stack. - * @param int $length The length of tokens to traverse from the start pos. - * @param bool $origContent Whether the original content or the tab replaced - * content should be used. - * - * @return string The token contents. - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If the specified position does not exist. - */ - public function getTokensAsString($start, $length, $origContent=false) - { - if (is_int($start) === false || isset($this->tokens[$start]) === false) { - throw new RuntimeException('The $start position for getTokensAsString() must exist in the token stack'); - } - - if (is_int($length) === false || $length <= 0) { - return ''; - } - - $str = ''; - $end = ($start + $length); - if ($end > $this->numTokens) { - $end = $this->numTokens; - } - - for ($i = $start; $i < $end; $i++) { - // If tabs are being converted to spaces by the tokeniser, the - // original content should be used instead of the converted content. - if ($origContent === true && isset($this->tokens[$i]['orig_content']) === true) { - $str .= $this->tokens[$i]['orig_content']; - } else { - $str .= $this->tokens[$i]['content']; - } - } - - return $str; - - }//end getTokensAsString() - - - /** - * Returns the position of the previous specified token(s). - * - * If a value is specified, the previous token of the specified type(s) - * containing the specified value will be returned. - * - * Returns false if no token can be found. - * - * @param int|string|array $types The type(s) of tokens to search for. - * @param int $start The position to start searching from in the - * token stack. - * @param int|null $end The end position to fail if no token is found. - * if not specified or null, end will default to - * the start of the token stack. - * @param bool $exclude If true, find the previous token that is NOT of - * the types specified in $types. - * @param string|null $value The value that the token(s) must be equal to. - * If value is omitted, tokens with any value will - * be returned. - * @param bool $local If true, tokens outside the current statement - * will not be checked. IE. checking will stop - * at the previous semicolon found. - * - * @return int|false - * @see findNext() - */ - public function findPrevious( - $types, - $start, - $end=null, - $exclude=false, - $value=null, - $local=false - ) { - $types = (array) $types; - - if ($end === null) { - $end = 0; - } - - for ($i = $start; $i >= $end; $i--) { - $found = (bool) $exclude; - foreach ($types as $type) { - if ($this->tokens[$i]['code'] === $type) { - $found = !$exclude; - break; - } - } - - if ($found === true) { - if ($value === null) { - return $i; - } else if ($this->tokens[$i]['content'] === $value) { - return $i; - } - } - - if ($local === true) { - if (isset($this->tokens[$i]['scope_opener']) === true - && $i === $this->tokens[$i]['scope_closer'] - ) { - $i = $this->tokens[$i]['scope_opener']; - } else if (isset($this->tokens[$i]['bracket_opener']) === true - && $i === $this->tokens[$i]['bracket_closer'] - ) { - $i = $this->tokens[$i]['bracket_opener']; - } else if (isset($this->tokens[$i]['parenthesis_opener']) === true - && $i === $this->tokens[$i]['parenthesis_closer'] - ) { - $i = $this->tokens[$i]['parenthesis_opener']; - } else if ($this->tokens[$i]['code'] === T_SEMICOLON) { - break; - } - } - }//end for - - return false; - - }//end findPrevious() - - - /** - * Returns the position of the next specified token(s). - * - * If a value is specified, the next token of the specified type(s) - * containing the specified value will be returned. - * - * Returns false if no token can be found. - * - * @param int|string|array $types The type(s) of tokens to search for. - * @param int $start The position to start searching from in the - * token stack. - * @param int|null $end The end position to fail if no token is found. - * if not specified or null, end will default to - * the end of the token stack. - * @param bool $exclude If true, find the next token that is NOT of - * a type specified in $types. - * @param string|null $value The value that the token(s) must be equal to. - * If value is omitted, tokens with any value will - * be returned. - * @param bool $local If true, tokens outside the current statement - * will not be checked. i.e., checking will stop - * at the next semicolon found. - * - * @return int|false - * @see findPrevious() - */ - public function findNext( - $types, - $start, - $end=null, - $exclude=false, - $value=null, - $local=false - ) { - $types = (array) $types; - - if ($end === null || $end > $this->numTokens) { - $end = $this->numTokens; - } - - for ($i = $start; $i < $end; $i++) { - $found = (bool) $exclude; - foreach ($types as $type) { - if ($this->tokens[$i]['code'] === $type) { - $found = !$exclude; - break; - } - } - - if ($found === true) { - if ($value === null) { - return $i; - } else if ($this->tokens[$i]['content'] === $value) { - return $i; - } - } - - if ($local === true && $this->tokens[$i]['code'] === T_SEMICOLON) { - break; - } - }//end for - - return false; - - }//end findNext() - - - /** - * Returns the position of the first non-whitespace token in a statement. - * - * @param int $start The position to start searching from in the token stack. - * @param int|string|array|null $ignore Token types that should not be considered stop points. - * - * @return int - */ - public function findStartOfStatement($start, $ignore=null) - { - $startTokens = Tokens::$blockOpeners; - $startTokens[T_OPEN_SHORT_ARRAY] = true; - $startTokens[T_OPEN_TAG] = true; - $startTokens[T_OPEN_TAG_WITH_ECHO] = true; - - $endTokens = [ - T_CLOSE_TAG => true, - T_COLON => true, - T_COMMA => true, - T_DOUBLE_ARROW => true, - T_MATCH_ARROW => true, - T_SEMICOLON => true, - ]; - - if ($ignore !== null) { - $ignore = (array) $ignore; - foreach ($ignore as $code) { - if (isset($startTokens[$code]) === true) { - unset($startTokens[$code]); - } - - if (isset($endTokens[$code]) === true) { - unset($endTokens[$code]); - } - } - } - - // If the start token is inside the case part of a match expression, - // find the start of the condition. If it's in the statement part, find - // the token that comes after the match arrow. - if (empty($this->tokens[$start]['conditions']) === false) { - $conditions = $this->tokens[$start]['conditions']; - $lastConditionOwner = end($conditions); - $matchExpression = key($conditions); - - if ($lastConditionOwner === T_MATCH - // Check if the $start token is at the same parentheses nesting level as the match token. - && ((empty($this->tokens[$matchExpression]['nested_parenthesis']) === true - && empty($this->tokens[$start]['nested_parenthesis']) === true) - || ((empty($this->tokens[$matchExpression]['nested_parenthesis']) === false - && empty($this->tokens[$start]['nested_parenthesis']) === false) - && $this->tokens[$matchExpression]['nested_parenthesis'] === $this->tokens[$start]['nested_parenthesis'])) - ) { - // Walk back to the previous match arrow (if it exists). - $lastComma = null; - $inNestedExpression = false; - for ($prevMatch = $start; $prevMatch > $this->tokens[$matchExpression]['scope_opener']; $prevMatch--) { - if ($prevMatch !== $start && $this->tokens[$prevMatch]['code'] === T_MATCH_ARROW) { - break; - } - - if ($prevMatch !== $start && $this->tokens[$prevMatch]['code'] === T_COMMA) { - $lastComma = $prevMatch; - continue; - } - - // Skip nested statements. - if (isset($this->tokens[$prevMatch]['bracket_opener']) === true - && $prevMatch === $this->tokens[$prevMatch]['bracket_closer'] - ) { - $prevMatch = $this->tokens[$prevMatch]['bracket_opener']; - continue; - } - - if (isset($this->tokens[$prevMatch]['parenthesis_opener']) === true - && $prevMatch === $this->tokens[$prevMatch]['parenthesis_closer'] - ) { - $prevMatch = $this->tokens[$prevMatch]['parenthesis_opener']; - continue; - } - - // Stop if we're _within_ a nested short array statement, which may contain comma's too. - // No need to deal with parentheses, those are handled above via the `nested_parenthesis` checks. - if (isset($this->tokens[$prevMatch]['bracket_opener']) === true - && $this->tokens[$prevMatch]['bracket_closer'] > $start - ) { - $inNestedExpression = true; - break; - } - }//end for - - if ($inNestedExpression === false) { - // $prevMatch will now either be the scope opener or a match arrow. - // If it is the scope opener, go the first non-empty token after. $start will have been part of the first condition. - if ($prevMatch <= $this->tokens[$matchExpression]['scope_opener']) { - // We're before the arrow in the first case. - $next = $this->findNext(Tokens::$emptyTokens, ($this->tokens[$matchExpression]['scope_opener'] + 1), null, true); - if ($next === false) { - // Shouldn't be possible. - return $start; - } - - return $next; - } - - // Okay, so we found a match arrow. - // If $start was part of the "next" condition, the last comma will be set. - // Otherwise, $start must have been part of a return expression. - if (isset($lastComma) === true && $lastComma > $prevMatch) { - $prevMatch = $lastComma; - } - - // In both cases, go to the first non-empty token after. - $next = $this->findNext(Tokens::$emptyTokens, ($prevMatch + 1), null, true); - if ($next === false) { - // Shouldn't be possible. - return $start; - } - - return $next; - }//end if - }//end if - }//end if - - $lastNotEmpty = $start; - - // If we are starting at a token that ends a scope block, skip to - // the start and continue from there. - // If we are starting at a token that ends a statement, skip this - // token so we find the true start of the statement. - while (isset($endTokens[$this->tokens[$start]['code']]) === true - || (isset($this->tokens[$start]['scope_condition']) === true - && $start === $this->tokens[$start]['scope_closer']) - ) { - if (isset($this->tokens[$start]['scope_condition']) === true) { - $start = $this->tokens[$start]['scope_condition']; - } else { - $start--; - } - } - - for ($i = $start; $i >= 0; $i--) { - if (isset($startTokens[$this->tokens[$i]['code']]) === true - || isset($endTokens[$this->tokens[$i]['code']]) === true - ) { - // Found the end of the previous statement. - return $lastNotEmpty; - } - - if (isset($this->tokens[$i]['scope_opener']) === true - && $i === $this->tokens[$i]['scope_closer'] - && $this->tokens[$i]['code'] !== T_CLOSE_PARENTHESIS - && $this->tokens[$i]['code'] !== T_END_NOWDOC - && $this->tokens[$i]['code'] !== T_END_HEREDOC - && $this->tokens[$i]['code'] !== T_BREAK - && $this->tokens[$i]['code'] !== T_RETURN - && $this->tokens[$i]['code'] !== T_CONTINUE - && $this->tokens[$i]['code'] !== T_THROW - && $this->tokens[$i]['code'] !== T_EXIT - && $this->tokens[$i]['code'] !== T_GOTO - ) { - // Found the end of the previous scope block. - return $lastNotEmpty; - } - - // Skip nested statements. - if (isset($this->tokens[$i]['bracket_opener']) === true - && $i === $this->tokens[$i]['bracket_closer'] - ) { - $i = $this->tokens[$i]['bracket_opener']; - } else if (isset($this->tokens[$i]['parenthesis_opener']) === true - && $i === $this->tokens[$i]['parenthesis_closer'] - ) { - $i = $this->tokens[$i]['parenthesis_opener']; - } else if ($this->tokens[$i]['code'] === T_CLOSE_USE_GROUP) { - $start = $this->findPrevious(T_OPEN_USE_GROUP, ($i - 1)); - if ($start !== false) { - $i = $start; - } - }//end if - - if (isset(Tokens::$emptyTokens[$this->tokens[$i]['code']]) === false) { - $lastNotEmpty = $i; - } - }//end for - - return 0; - - }//end findStartOfStatement() - - - /** - * Returns the position of the last non-whitespace token in a statement. - * - * @param int $start The position to start searching from in the token stack. - * @param int|string|array|null $ignore Token types that should not be considered stop points. - * - * @return int - */ - public function findEndOfStatement($start, $ignore=null) - { - $endTokens = [ - T_COLON => true, - T_COMMA => true, - T_DOUBLE_ARROW => true, - T_SEMICOLON => true, - T_CLOSE_PARENTHESIS => true, - T_CLOSE_SQUARE_BRACKET => true, - T_CLOSE_CURLY_BRACKET => true, - T_CLOSE_SHORT_ARRAY => true, - T_OPEN_TAG => true, - T_CLOSE_TAG => true, - ]; - - if ($ignore !== null) { - $ignore = (array) $ignore; - foreach ($ignore as $code) { - unset($endTokens[$code]); - } - } - - // If the start token is inside the case part of a match expression, - // advance to the match arrow and continue looking for the - // end of the statement from there so that we skip over commas. - if ($this->tokens[$start]['code'] !== T_MATCH_ARROW) { - $matchExpression = $this->getCondition($start, T_MATCH); - if ($matchExpression !== false) { - $beforeArrow = true; - $prevMatchArrow = $this->findPrevious(T_MATCH_ARROW, ($start - 1), $this->tokens[$matchExpression]['scope_opener']); - if ($prevMatchArrow !== false) { - $prevComma = $this->findNext(T_COMMA, ($prevMatchArrow + 1), $start); - if ($prevComma === false) { - // No comma between this token and the last match arrow, - // so this token exists after the arrow and we can continue - // checking as normal. - $beforeArrow = false; - } - } - - if ($beforeArrow === true) { - $nextMatchArrow = $this->findNext(T_MATCH_ARROW, ($start + 1), $this->tokens[$matchExpression]['scope_closer']); - if ($nextMatchArrow !== false) { - $start = $nextMatchArrow; - } - } - }//end if - }//end if - - $lastNotEmpty = $start; - for ($i = $start; $i < $this->numTokens; $i++) { - if ($i !== $start && isset($endTokens[$this->tokens[$i]['code']]) === true) { - // Found the end of the statement. - if ($this->tokens[$i]['code'] === T_CLOSE_PARENTHESIS - || $this->tokens[$i]['code'] === T_CLOSE_SQUARE_BRACKET - || $this->tokens[$i]['code'] === T_CLOSE_CURLY_BRACKET - || $this->tokens[$i]['code'] === T_CLOSE_SHORT_ARRAY - || $this->tokens[$i]['code'] === T_OPEN_TAG - || $this->tokens[$i]['code'] === T_CLOSE_TAG - ) { - return $lastNotEmpty; - } - - return $i; - } - - // Skip nested statements. - if (isset($this->tokens[$i]['scope_closer']) === true - && ($i === $this->tokens[$i]['scope_opener'] - || $i === $this->tokens[$i]['scope_condition']) - ) { - if ($this->tokens[$i]['code'] === T_FN) { - $lastNotEmpty = $this->tokens[$i]['scope_closer']; - $i = ($this->tokens[$i]['scope_closer'] - 1); - continue; - } - - if ($i === $start && isset(Tokens::$scopeOpeners[$this->tokens[$i]['code']]) === true) { - return $this->tokens[$i]['scope_closer']; - } - - $i = $this->tokens[$i]['scope_closer']; - } else if (isset($this->tokens[$i]['bracket_closer']) === true - && $i === $this->tokens[$i]['bracket_opener'] - ) { - $i = $this->tokens[$i]['bracket_closer']; - } else if (isset($this->tokens[$i]['parenthesis_closer']) === true - && $i === $this->tokens[$i]['parenthesis_opener'] - ) { - $i = $this->tokens[$i]['parenthesis_closer']; - } else if ($this->tokens[$i]['code'] === T_OPEN_USE_GROUP) { - $end = $this->findNext(T_CLOSE_USE_GROUP, ($i + 1)); - if ($end !== false) { - $i = $end; - } - }//end if - - if (isset(Tokens::$emptyTokens[$this->tokens[$i]['code']]) === false) { - $lastNotEmpty = $i; - } - }//end for - - return ($this->numTokens - 1); - - }//end findEndOfStatement() - - - /** - * Returns the position of the first token on a line, matching given type. - * - * Returns false if no token can be found. - * - * @param int|string|array $types The type(s) of tokens to search for. - * @param int $start The position to start searching from in the - * token stack. - * @param bool $exclude If true, find the token that is NOT of - * the types specified in $types. - * @param string|null $value The value that the token must be equal to. - * If value is omitted, tokens with any value will - * be returned. - * - * @return int|false The first token which matches on the line containing the start - * token, between the start of the line and the start token. - * Note: The first token matching might be the start token. - * FALSE when no matching token could be found between the start of - * the line and the start token. - */ - public function findFirstOnLine($types, $start, $exclude=false, $value=null) - { - if (is_array($types) === false) { - $types = [$types]; - } - - $foundToken = false; - - for ($i = $start; $i >= 0; $i--) { - if ($this->tokens[$i]['line'] < $this->tokens[$start]['line']) { - break; - } - - $found = $exclude; - foreach ($types as $type) { - if ($exclude === false) { - if ($this->tokens[$i]['code'] === $type) { - $found = true; - break; - } - } else { - if ($this->tokens[$i]['code'] === $type) { - $found = false; - break; - } - } - } - - if ($found === true) { - if ($value === null) { - $foundToken = $i; - } else if ($this->tokens[$i]['content'] === $value) { - $foundToken = $i; - } - } - }//end for - - return $foundToken; - - }//end findFirstOnLine() - - - /** - * Determine if the passed token has a condition of one of the passed types. - * - * @param int $stackPtr The position of the token we are checking. - * @param int|string|array $types The type(s) of tokens to search for. - * - * @return boolean - */ - public function hasCondition($stackPtr, $types) - { - // Check for the existence of the token. - if (isset($this->tokens[$stackPtr]) === false) { - return false; - } - - // Make sure the token has conditions. - if (empty($this->tokens[$stackPtr]['conditions']) === true) { - return false; - } - - $types = (array) $types; - $conditions = $this->tokens[$stackPtr]['conditions']; - - foreach ($types as $type) { - if (in_array($type, $conditions, true) === true) { - // We found a token with the required type. - return true; - } - } - - return false; - - }//end hasCondition() - - - /** - * Return the position of the condition for the passed token. - * - * Returns FALSE if the token does not have the condition. - * - * @param int $stackPtr The position of the token we are checking. - * @param int|string $type The type of token to search for. - * @param bool $first If TRUE, will return the matched condition - * furthest away from the passed token. - * If FALSE, will return the matched condition - * closest to the passed token. - * - * @return int|false - */ - public function getCondition($stackPtr, $type, $first=true) - { - // Check for the existence of the token. - if (isset($this->tokens[$stackPtr]) === false) { - return false; - } - - // Make sure the token has conditions. - if (empty($this->tokens[$stackPtr]['conditions']) === true) { - return false; - } - - $conditions = $this->tokens[$stackPtr]['conditions']; - if ($first === false) { - $conditions = array_reverse($conditions, true); - } - - foreach ($conditions as $token => $condition) { - if ($condition === $type) { - return $token; - } - } - - return false; - - }//end getCondition() - - - /** - * Returns the name of the class that the specified class extends. - * (works for classes, anonymous classes and interfaces) - * - * Returns FALSE on error or if there is no extended class name. - * - * @param int $stackPtr The stack position of the class. - * - * @return string|false - */ - public function findExtendedClassName($stackPtr) - { - // Check for the existence of the token. - if (isset($this->tokens[$stackPtr]) === false) { - return false; - } - - if ($this->tokens[$stackPtr]['code'] !== T_CLASS - && $this->tokens[$stackPtr]['code'] !== T_ANON_CLASS - && $this->tokens[$stackPtr]['code'] !== T_INTERFACE - ) { - return false; - } - - if (isset($this->tokens[$stackPtr]['scope_opener']) === false) { - return false; - } - - $classOpenerIndex = $this->tokens[$stackPtr]['scope_opener']; - $extendsIndex = $this->findNext(T_EXTENDS, $stackPtr, $classOpenerIndex); - if ($extendsIndex === false) { - return false; - } - - $find = [ - T_NS_SEPARATOR, - T_STRING, - T_WHITESPACE, - ]; - - $end = $this->findNext($find, ($extendsIndex + 1), ($classOpenerIndex + 1), true); - $name = $this->getTokensAsString(($extendsIndex + 1), ($end - $extendsIndex - 1)); - $name = trim($name); - - if ($name === '') { - return false; - } - - return $name; - - }//end findExtendedClassName() - - - /** - * Returns the names of the interfaces that the specified class or enum implements. - * - * Returns FALSE on error or if there are no implemented interface names. - * - * @param int $stackPtr The stack position of the class or enum token. - * - * @return array|false - */ - public function findImplementedInterfaceNames($stackPtr) - { - // Check for the existence of the token. - if (isset($this->tokens[$stackPtr]) === false) { - return false; - } - - if ($this->tokens[$stackPtr]['code'] !== T_CLASS - && $this->tokens[$stackPtr]['code'] !== T_ANON_CLASS - && $this->tokens[$stackPtr]['code'] !== T_ENUM - ) { - return false; - } - - if (isset($this->tokens[$stackPtr]['scope_closer']) === false) { - return false; - } - - $classOpenerIndex = $this->tokens[$stackPtr]['scope_opener']; - $implementsIndex = $this->findNext(T_IMPLEMENTS, $stackPtr, $classOpenerIndex); - if ($implementsIndex === false) { - return false; - } - - $find = [ - T_NS_SEPARATOR, - T_STRING, - T_WHITESPACE, - T_COMMA, - ]; - - $end = $this->findNext($find, ($implementsIndex + 1), ($classOpenerIndex + 1), true); - $name = $this->getTokensAsString(($implementsIndex + 1), ($end - $implementsIndex - 1)); - $name = trim($name); - - if ($name === '') { - return false; - } else { - $names = explode(',', $name); - $names = array_map('trim', $names); - return $names; - } - - }//end findImplementedInterfaceNames() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Files/FileList.php b/vendor/squizlabs/php_codesniffer/src/Files/FileList.php deleted file mode 100644 index 8bf9334..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Files/FileList.php +++ /dev/null @@ -1,266 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Files; - -use Countable; -use FilesystemIterator; -use Iterator; -use PHP_CodeSniffer\Autoload; -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Exceptions\DeepExitException; -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Util\Common; -use RecursiveArrayIterator; -use RecursiveDirectoryIterator; -use RecursiveIteratorIterator; -use ReturnTypeWillChange; - -class FileList implements Iterator, Countable -{ - - /** - * A list of file paths that are included in the list. - * - * @var array - */ - private $files = []; - - /** - * The number of files in the list. - * - * @var integer - */ - private $numFiles = 0; - - /** - * The config data for the run. - * - * @var \PHP_CodeSniffer\Config - */ - public $config = null; - - /** - * The ruleset used for the run. - * - * @var \PHP_CodeSniffer\Ruleset - */ - public $ruleset = null; - - /** - * An array of patterns to use for skipping files. - * - * @var array - */ - protected $ignorePatterns = []; - - - /** - * Constructs a file list and loads in an array of file paths to process. - * - * @param \PHP_CodeSniffer\Config $config The config data for the run. - * @param \PHP_CodeSniffer\Ruleset $ruleset The ruleset used for the run. - * - * @return void - */ - public function __construct(Config $config, Ruleset $ruleset) - { - $this->ruleset = $ruleset; - $this->config = $config; - - $paths = $config->files; - foreach ($paths as $path) { - $isPharFile = Common::isPharFile($path); - if (is_dir($path) === true || $isPharFile === true) { - if ($isPharFile === true) { - $path = 'phar://'.$path; - } - - $filterClass = $this->getFilterClass(); - - $di = new RecursiveDirectoryIterator($path, (RecursiveDirectoryIterator::SKIP_DOTS | FilesystemIterator::FOLLOW_SYMLINKS)); - $filter = new $filterClass($di, $path, $config, $ruleset); - $iterator = new RecursiveIteratorIterator($filter); - - foreach ($iterator as $file) { - $this->files[$file->getPathname()] = null; - } - } else { - $this->addFile($path); - }//end if - }//end foreach - - reset($this->files); - $this->numFiles = count($this->files); - - }//end __construct() - - - /** - * Add a file to the list. - * - * If a file object has already been created, it can be passed here. - * If it is left NULL, it will be created when accessed. - * - * @param string $path The path to the file being added. - * @param \PHP_CodeSniffer\Files\File|null $file The file being added. - * - * @return void - */ - public function addFile($path, $file=null) - { - // No filtering is done for STDIN when the filename - // has not been specified. - if ($path === 'STDIN') { - $this->files[$path] = $file; - $this->numFiles++; - return; - } - - $filterClass = $this->getFilterClass(); - - $di = new RecursiveArrayIterator([$path]); - $filter = new $filterClass($di, $path, $this->config, $this->ruleset); - $iterator = new RecursiveIteratorIterator($filter); - - foreach ($iterator as $path) { - if (array_key_exists($path, $this->files) === true) { - // The path has already been added. - continue; - } - - $this->files[$path] = $file; - $this->numFiles++; - } - - }//end addFile() - - - /** - * Get the class name of the filter being used for the run. - * - * @return string - * @throws \PHP_CodeSniffer\Exceptions\DeepExitException If the specified filter could not be found. - */ - private function getFilterClass() - { - $filterType = $this->config->filter; - - if ($filterType === null) { - $filterClass = '\PHP_CodeSniffer\Filters\Filter'; - } else { - if (strpos($filterType, '.') !== false) { - // This is a path to a custom filter class. - $filename = realpath($filterType); - if ($filename === false) { - $error = "ERROR: Custom filter \"$filterType\" not found".PHP_EOL; - throw new DeepExitException($error, 3); - } - - $filterClass = Autoload::loadFile($filename); - } else { - $filterClass = '\PHP_CodeSniffer\Filters\\'.$filterType; - } - } - - return $filterClass; - - }//end getFilterClass() - - - /** - * Rewind the iterator to the first file. - * - * @return void - */ - #[ReturnTypeWillChange] - public function rewind() - { - reset($this->files); - - }//end rewind() - - - /** - * Get the file that is currently being processed. - * - * @return \PHP_CodeSniffer\Files\File - */ - #[ReturnTypeWillChange] - public function current() - { - $path = key($this->files); - if (isset($this->files[$path]) === false) { - $this->files[$path] = new LocalFile($path, $this->ruleset, $this->config); - } - - return $this->files[$path]; - - }//end current() - - - /** - * Return the file path of the current file being processed. - * - * @return string|null Path name or `null` when the end of the iterator has been reached. - */ - #[ReturnTypeWillChange] - public function key() - { - return key($this->files); - - }//end key() - - - /** - * Move forward to the next file. - * - * @return void - */ - #[ReturnTypeWillChange] - public function next() - { - next($this->files); - - }//end next() - - - /** - * Checks if current position is valid. - * - * @return boolean - */ - #[ReturnTypeWillChange] - public function valid() - { - if (current($this->files) === false) { - return false; - } - - return true; - - }//end valid() - - - /** - * Return the number of files in the list. - * - * @return integer - */ - #[ReturnTypeWillChange] - public function count() - { - return $this->numFiles; - - }//end count() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Files/LocalFile.php b/vendor/squizlabs/php_codesniffer/src/Files/LocalFile.php deleted file mode 100644 index 118a656..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Files/LocalFile.php +++ /dev/null @@ -1,219 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Files; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Util\Cache; -use PHP_CodeSniffer\Util\Common; - -class LocalFile extends File -{ - - - /** - * Creates a LocalFile object and sets the content. - * - * @param string $path The absolute path to the file. - * @param \PHP_CodeSniffer\Ruleset $ruleset The ruleset used for the run. - * @param \PHP_CodeSniffer\Config $config The config data for the run. - * - * @return void - */ - public function __construct($path, Ruleset $ruleset, Config $config) - { - $this->path = trim($path); - if (Common::isReadable($this->path) === false) { - parent::__construct($this->path, $ruleset, $config); - $error = 'Error opening file; file no longer exists or you do not have access to read the file'; - $this->addMessage(true, $error, 1, 1, 'Internal.LocalFile', [], 5, false); - $this->ignored = true; - return; - } - - // Before we go and spend time tokenizing this file, just check - // to see if there is a tag up top to indicate that the whole - // file should be ignored. It must be on one of the first two lines. - if ($config->annotations === true) { - $handle = fopen($this->path, 'r'); - if ($handle !== false) { - $firstContent = fgets($handle); - $firstContent .= fgets($handle); - fclose($handle); - - if (strpos($firstContent, '@codingStandardsIgnoreFile') !== false - || stripos($firstContent, 'phpcs:ignorefile') !== false - ) { - // We are ignoring the whole file. - $this->ignored = true; - return; - } - } - } - - $this->reloadContent(); - - parent::__construct($this->path, $ruleset, $config); - - }//end __construct() - - - /** - * Loads the latest version of the file's content from the file system. - * - * @return void - */ - public function reloadContent() - { - $this->setContent(file_get_contents($this->path)); - - }//end reloadContent() - - - /** - * Processes the file. - * - * @return void - */ - public function process() - { - if ($this->ignored === true) { - return; - } - - if ($this->configCache['cache'] === false) { - parent::process(); - return; - } - - $hash = md5_file($this->path); - $hash .= fileperms($this->path); - $cache = Cache::get($this->path); - if ($cache !== false && $cache['hash'] === $hash) { - // We can't filter metrics, so just load all of them. - $this->metrics = $cache['metrics']; - - if ($this->configCache['recordErrors'] === true) { - // Replay the cached errors and warnings to filter out the ones - // we don't need for this specific run. - $this->configCache['cache'] = false; - $this->replayErrors($cache['errors'], $cache['warnings']); - $this->configCache['cache'] = true; - } else { - $this->errorCount = $cache['errorCount']; - $this->warningCount = $cache['warningCount']; - $this->fixableCount = $cache['fixableCount']; - } - - if (PHP_CODESNIFFER_VERBOSITY > 0 - || (PHP_CODESNIFFER_CBF === true && empty($this->config->files) === false) - ) { - echo "[loaded from cache]... "; - } - - $this->numTokens = $cache['numTokens']; - $this->fromCache = true; - return; - }//end if - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo PHP_EOL; - } - - parent::process(); - - $cache = [ - 'hash' => $hash, - 'errors' => $this->errors, - 'warnings' => $this->warnings, - 'metrics' => $this->metrics, - 'errorCount' => $this->errorCount, - 'warningCount' => $this->warningCount, - 'fixableCount' => $this->fixableCount, - 'numTokens' => $this->numTokens, - ]; - - Cache::set($this->path, $cache); - - // During caching, we don't filter out errors in any way, so - // we need to do that manually now by replaying them. - if ($this->configCache['recordErrors'] === true) { - $this->configCache['cache'] = false; - $this->replayErrors($this->errors, $this->warnings); - $this->configCache['cache'] = true; - } - - }//end process() - - - /** - * Clears and replays error and warnings for the file. - * - * Replaying errors and warnings allows for filtering rules to be changed - * and then errors and warnings to be reapplied with the new rules. This is - * particularly useful while caching. - * - * @param array>> $errors The list of errors to replay. - * @param array>> $warnings The list of warnings to replay. - * - * @return void - */ - private function replayErrors($errors, $warnings) - { - $this->errors = []; - $this->warnings = []; - $this->errorCount = 0; - $this->warningCount = 0; - $this->fixableCount = 0; - - $this->replayingErrors = true; - - foreach ($errors as $line => $lineErrors) { - foreach ($lineErrors as $column => $colErrors) { - foreach ($colErrors as $error) { - $this->activeListener = $error['listener']; - $this->addMessage( - true, - $error['message'], - $line, - $column, - $error['source'], - [], - $error['severity'], - $error['fixable'] - ); - } - } - } - - foreach ($warnings as $line => $lineErrors) { - foreach ($lineErrors as $column => $colErrors) { - foreach ($colErrors as $error) { - $this->activeListener = $error['listener']; - $this->addMessage( - false, - $error['message'], - $line, - $column, - $error['source'], - [], - $error['severity'], - $error['fixable'] - ); - } - } - } - - $this->replayingErrors = false; - - }//end replayErrors() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Filters/ExactMatch.php b/vendor/squizlabs/php_codesniffer/src/Filters/ExactMatch.php deleted file mode 100644 index 150865e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Filters/ExactMatch.php +++ /dev/null @@ -1,156 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Filters; - -use PHP_CodeSniffer\Util\Common; - -abstract class ExactMatch extends Filter -{ - - /** - * A list of files to exclude. - * - * @var array - */ - private $disallowedFiles = null; - - /** - * A list of files to include. - * - * If the allowed files list is empty, only files in the disallowed files list will be excluded. - * - * @var array - */ - private $allowedFiles = null; - - - /** - * Check whether the current element of the iterator is acceptable. - * - * If a file is both disallowed and allowed, it will be deemed unacceptable. - * - * @return bool - */ - public function accept() - { - if (parent::accept() === false) { - return false; - } - - if ($this->disallowedFiles === null) { - $this->disallowedFiles = $this->getDisallowedFiles(); - - // BC-layer. - if ($this->disallowedFiles === null) { - $this->disallowedFiles = $this->getBlacklist(); - } - } - - if ($this->allowedFiles === null) { - $this->allowedFiles = $this->getAllowedFiles(); - - // BC-layer. - if ($this->allowedFiles === null) { - $this->allowedFiles = $this->getWhitelist(); - } - } - - $filePath = Common::realpath($this->current()); - - // If a file is both disallowed and allowed, the disallowed files list takes precedence. - if (isset($this->disallowedFiles[$filePath]) === true) { - return false; - } - - if (empty($this->allowedFiles) === true && empty($this->disallowedFiles) === false) { - // We are only checking the disallowed files list, so everything else should be allowed. - return true; - } - - return isset($this->allowedFiles[$filePath]); - - }//end accept() - - - /** - * Returns an iterator for the current entry. - * - * Ensures that the disallowed files list and the allowed files list are preserved so they don't have - * to be generated each time. - * - * @return \RecursiveIterator - */ - public function getChildren() - { - $children = parent::getChildren(); - $children->disallowedFiles = $this->disallowedFiles; - $children->allowedFiles = $this->allowedFiles; - return $children; - - }//end getChildren() - - - /** - * Get a list of file paths to exclude. - * - * @deprecated 3.9.0 Implement the `getDisallowedFiles()` method instead. - * The `getDisallowedFiles()` method will be made abstract and therefore required - * in v4.0 and this method will be removed. - * If both methods are implemented, the new `getDisallowedFiles()` method will take precedence. - * - * @return array - */ - abstract protected function getBlacklist(); - - - /** - * Get a list of file paths to include. - * - * @deprecated 3.9.0 Implement the `getAllowedFiles()` method instead. - * The `getAllowedFiles()` method will be made abstract and therefore required - * in v4.0 and this method will be removed. - * If both methods are implemented, the new `getAllowedFiles()` method will take precedence. - * - * @return array - */ - abstract protected function getWhitelist(); - - - /** - * Get a list of file paths to exclude. - * - * @since 3.9.0 Replaces the deprecated `getBlacklist()` method. - * - * @return array|null - */ - protected function getDisallowedFiles() - { - return null; - - }//end getDisallowedFiles() - - - /** - * Get a list of file paths to include. - * - * @since 3.9.0 Replaces the deprecated `getWhitelist()` method. - * - * @return array|null - */ - protected function getAllowedFiles() - { - return null; - - }//end getAllowedFiles() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Filters/Filter.php b/vendor/squizlabs/php_codesniffer/src/Filters/Filter.php deleted file mode 100644 index 2bc6457..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Filters/Filter.php +++ /dev/null @@ -1,281 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Filters; - -use FilesystemIterator; -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Util\Common; -use RecursiveDirectoryIterator; -use RecursiveFilterIterator; -use ReturnTypeWillChange; - -class Filter extends RecursiveFilterIterator -{ - - /** - * The top-level path we are filtering. - * - * @var string - */ - protected $basedir = null; - - /** - * The config data for the run. - * - * @var \PHP_CodeSniffer\Config - */ - protected $config = null; - - /** - * The ruleset used for the run. - * - * @var \PHP_CodeSniffer\Ruleset - */ - protected $ruleset = null; - - /** - * A list of ignore patterns that apply to directories only. - * - * @var array - */ - protected $ignoreDirPatterns = null; - - /** - * A list of ignore patterns that apply to files only. - * - * @var array - */ - protected $ignoreFilePatterns = null; - - /** - * A list of file paths we've already accepted. - * - * Used to ensure we aren't following circular symlinks. - * - * @var array - */ - protected $acceptedPaths = []; - - - /** - * Constructs a filter. - * - * @param \RecursiveIterator $iterator The iterator we are using to get file paths. - * @param string $basedir The top-level path we are filtering. - * @param \PHP_CodeSniffer\Config $config The config data for the run. - * @param \PHP_CodeSniffer\Ruleset $ruleset The ruleset used for the run. - * - * @return void - */ - public function __construct($iterator, $basedir, Config $config, Ruleset $ruleset) - { - parent::__construct($iterator); - $this->basedir = $basedir; - $this->config = $config; - $this->ruleset = $ruleset; - - }//end __construct() - - - /** - * Check whether the current element of the iterator is acceptable. - * - * Files are checked for allowed extensions and ignore patterns. - * Directories are checked for ignore patterns only. - * - * @return bool - */ - #[ReturnTypeWillChange] - public function accept() - { - $filePath = $this->current(); - $realPath = Common::realpath($filePath); - - if ($realPath !== false) { - // It's a real path somewhere, so record it - // to check for circular symlinks. - if (isset($this->acceptedPaths[$realPath]) === true) { - // We've been here before. - return false; - } - } - - $filePath = $this->current(); - if (is_dir($filePath) === true) { - if ($this->config->local === true) { - return false; - } - } else if ($this->shouldProcessFile($filePath) === false) { - return false; - } - - if ($this->shouldIgnorePath($filePath) === true) { - return false; - } - - $this->acceptedPaths[$realPath] = true; - return true; - - }//end accept() - - - /** - * Returns an iterator for the current entry. - * - * Ensures that the ignore patterns are preserved so they don't have - * to be generated each time. - * - * @return \RecursiveIterator - */ - #[ReturnTypeWillChange] - public function getChildren() - { - $filterClass = get_called_class(); - $children = new $filterClass( - new RecursiveDirectoryIterator($this->current(), (RecursiveDirectoryIterator::SKIP_DOTS | FilesystemIterator::FOLLOW_SYMLINKS)), - $this->basedir, - $this->config, - $this->ruleset - ); - - // Set the ignore patterns so we don't have to generate them again. - $children->ignoreDirPatterns = $this->ignoreDirPatterns; - $children->ignoreFilePatterns = $this->ignoreFilePatterns; - $children->acceptedPaths = $this->acceptedPaths; - return $children; - - }//end getChildren() - - - /** - * Checks filtering rules to see if a file should be checked. - * - * Checks both file extension filters and path ignore filters. - * - * @param string $path The path to the file being checked. - * - * @return bool - */ - protected function shouldProcessFile($path) - { - // Check that the file's extension is one we are checking. - // We are strict about checking the extension and we don't - // let files through with no extension or that start with a dot. - $fileName = basename($path); - $fileParts = explode('.', $fileName); - if ($fileParts[0] === $fileName || $fileParts[0] === '') { - return false; - } - - // Checking multi-part file extensions, so need to create a - // complete extension list and make sure one is allowed. - $extensions = []; - array_shift($fileParts); - while (empty($fileParts) === false) { - $extensions[implode('.', $fileParts)] = 1; - array_shift($fileParts); - } - - $matches = array_intersect_key($extensions, $this->config->extensions); - if (empty($matches) === true) { - return false; - } - - return true; - - }//end shouldProcessFile() - - - /** - * Checks filtering rules to see if a path should be ignored. - * - * @param string $path The path to the file or directory being checked. - * - * @return bool - */ - protected function shouldIgnorePath($path) - { - if ($this->ignoreFilePatterns === null) { - $this->ignoreDirPatterns = []; - $this->ignoreFilePatterns = []; - - $ignorePatterns = $this->config->ignored; - $rulesetIgnorePatterns = $this->ruleset->getIgnorePatterns(); - foreach ($rulesetIgnorePatterns as $pattern => $type) { - // Ignore standard/sniff specific exclude rules. - if (is_array($type) === true) { - continue; - } - - $ignorePatterns[$pattern] = $type; - } - - foreach ($ignorePatterns as $pattern => $type) { - // If the ignore pattern ends with /* then it is ignoring an entire directory. - if (substr($pattern, -2) === '/*') { - // Need to check this pattern for dirs as well as individual file paths. - $this->ignoreFilePatterns[$pattern] = $type; - - $pattern = substr($pattern, 0, -2).'(?=/|$)'; - $this->ignoreDirPatterns[$pattern] = $type; - } else { - // This is a file-specific pattern, so only need to check this - // for individual file paths. - $this->ignoreFilePatterns[$pattern] = $type; - } - } - }//end if - - $relativePath = $path; - if (strpos($path, $this->basedir) === 0) { - // The +1 cuts off the directory separator as well. - $relativePath = substr($path, (strlen($this->basedir) + 1)); - } - - if (is_dir($path) === true) { - $ignorePatterns = $this->ignoreDirPatterns; - } else { - $ignorePatterns = $this->ignoreFilePatterns; - } - - foreach ($ignorePatterns as $pattern => $type) { - $replacements = [ - '\\,' => ',', - '*' => '.*', - ]; - - // We assume a / directory separator, as do the exclude rules - // most developers write, so we need a special case for any system - // that is different. - if (DIRECTORY_SEPARATOR === '\\') { - $replacements['/'] = '\\\\'; - } - - $pattern = strtr($pattern, $replacements); - - if ($type === 'relative') { - $testPath = $relativePath; - } else { - $testPath = $path; - } - - $pattern = '`'.$pattern.'`i'; - if (preg_match($pattern, $testPath) === 1) { - return true; - } - }//end foreach - - return false; - - }//end shouldIgnorePath() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Filters/GitModified.php b/vendor/squizlabs/php_codesniffer/src/Filters/GitModified.php deleted file mode 100644 index 9337024..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Filters/GitModified.php +++ /dev/null @@ -1,124 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Filters; - -use PHP_CodeSniffer\Util\Common; - -class GitModified extends ExactMatch -{ - - - /** - * Get a list of file paths to exclude. - * - * @since 3.9.0 - * - * @return array - */ - protected function getDisallowedFiles() - { - return []; - - }//end getDisallowedFiles() - - - /** - * Get a list of file paths to exclude. - * - * @deprecated 3.9.0 Overload the `getDisallowedFiles()` method instead. - * - * @codeCoverageIgnore - * - * @return array - */ - protected function getBlacklist() - { - return $this->getDisallowedFiles(); - - }//end getBlacklist() - - - /** - * Get a list of file paths to include. - * - * @since 3.9.0 - * - * @return array - */ - protected function getAllowedFiles() - { - $modified = []; - - $cmd = 'git ls-files -o -m --exclude-standard -- '.escapeshellarg($this->basedir); - $output = $this->exec($cmd); - - $basedir = $this->basedir; - if (is_dir($basedir) === false) { - $basedir = dirname($basedir); - } - - foreach ($output as $path) { - $path = Common::realpath($path); - - if ($path === false) { - continue; - } - - do { - $modified[$path] = true; - $path = dirname($path); - } while ($path !== $basedir); - } - - return $modified; - - }//end getAllowedFiles() - - - /** - * Get a list of file paths to include. - * - * @deprecated 3.9.0 Overload the `getAllowedFiles()` method instead. - * - * @codeCoverageIgnore - * - * @return array - */ - protected function getWhitelist() - { - return $this->getAllowedFiles(); - - }//end getWhitelist() - - - /** - * Execute an external command. - * - * {@internal This method is only needed to allow for mocking the return value - * to test the class logic.} - * - * @param string $cmd Command. - * - * @return array - */ - protected function exec($cmd) - { - $output = []; - $lastLine = exec($cmd, $output); - if ($lastLine === false) { - return []; - } - - return $output; - - }//end exec() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Filters/GitStaged.php b/vendor/squizlabs/php_codesniffer/src/Filters/GitStaged.php deleted file mode 100644 index 6f0d717..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Filters/GitStaged.php +++ /dev/null @@ -1,126 +0,0 @@ - - * @copyright 2018 Juliette Reinders Folmer. All rights reserved. - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Filters; - -use PHP_CodeSniffer\Util\Common; - -class GitStaged extends ExactMatch -{ - - - /** - * Get a list of file paths to exclude. - * - * @since 3.9.0 - * - * @return array - */ - protected function getDisallowedFiles() - { - return []; - - }//end getDisallowedFiles() - - - /** - * Get a list of file paths to exclude. - * - * @deprecated 3.9.0 Overload the `getDisallowedFiles()` method instead. - * - * @codeCoverageIgnore - * - * @return array - */ - protected function getBlacklist() - { - return $this->getDisallowedFiles(); - - }//end getBlacklist() - - - /** - * Get a list of file paths to include. - * - * @since 3.9.0 - * - * @return array - */ - protected function getAllowedFiles() - { - $modified = []; - - $cmd = 'git diff --cached --name-only -- '.escapeshellarg($this->basedir); - $output = $this->exec($cmd); - - $basedir = $this->basedir; - if (is_dir($basedir) === false) { - $basedir = dirname($basedir); - } - - foreach ($output as $path) { - $path = Common::realpath($path); - if ($path === false) { - // Skip deleted files. - continue; - } - - do { - $modified[$path] = true; - $path = dirname($path); - } while ($path !== $basedir); - } - - return $modified; - - }//end getAllowedFiles() - - - /** - * Get a list of file paths to include. - * - * @deprecated 3.9.0 Overload the `getAllowedFiles()` method instead. - * - * @codeCoverageIgnore - * - * @return array - */ - protected function getWhitelist() - { - return $this->getAllowedFiles(); - - }//end getWhitelist() - - - /** - * Execute an external command. - * - * {@internal This method is only needed to allow for mocking the return value - * to test the class logic.} - * - * @param string $cmd Command. - * - * @return array - */ - protected function exec($cmd) - { - $output = []; - $lastLine = exec($cmd, $output); - if ($lastLine === false) { - return []; - } - - return $output; - - }//end exec() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Fixer.php b/vendor/squizlabs/php_codesniffer/src/Fixer.php deleted file mode 100644 index be07d71..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Fixer.php +++ /dev/null @@ -1,867 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer; - -use InvalidArgumentException; -use PHP_CodeSniffer\Exceptions\RuntimeException; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Common; - -class Fixer -{ - - /** - * Is the fixer enabled and fixing a file? - * - * Sniffs should check this value to ensure they are not - * doing extra processing to prepare for a fix when fixing is - * not required. - * - * @var boolean - */ - public $enabled = false; - - /** - * The number of times we have looped over a file. - * - * @var integer - */ - public $loops = 0; - - /** - * The file being fixed. - * - * @var \PHP_CodeSniffer\Files\File - */ - private $currentFile = null; - - /** - * The list of tokens that make up the file contents. - * - * This is a simplified list which just contains the token content and nothing - * else. This is the array that is updated as fixes are made, not the file's - * token array. Imploding this array will give you the file content back. - * - * @var array - */ - private $tokens = []; - - /** - * A list of tokens that have already been fixed. - * - * We don't allow the same token to be fixed more than once each time - * through a file as this can easily cause conflicts between sniffs. - * - * @var int[] - */ - private $fixedTokens = []; - - /** - * The last value of each fixed token. - * - * If a token is being "fixed" back to its last value, the fix is - * probably conflicting with another. - * - * @var array> - */ - private $oldTokenValues = []; - - /** - * A list of tokens that have been fixed during a changeset. - * - * All changes in changeset must be able to be applied, or else - * the entire changeset is rejected. - * - * @var array - */ - private $changeset = []; - - /** - * Is there an open changeset. - * - * @var boolean - */ - private $inChangeset = false; - - /** - * Is the current fixing loop in conflict? - * - * @var boolean - */ - private $inConflict = false; - - /** - * The number of fixes that have been performed. - * - * @var integer - */ - private $numFixes = 0; - - - /** - * Starts fixing a new file. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being fixed. - * - * @return void - */ - public function startFile(File $phpcsFile) - { - $this->currentFile = $phpcsFile; - $this->numFixes = 0; - $this->fixedTokens = []; - - $tokens = $phpcsFile->getTokens(); - $this->tokens = []; - foreach ($tokens as $index => $token) { - if (isset($token['orig_content']) === true) { - $this->tokens[$index] = $token['orig_content']; - } else { - $this->tokens[$index] = $token['content']; - } - } - - }//end startFile() - - - /** - * Attempt to fix the file by processing it until no fixes are made. - * - * @return boolean - */ - public function fixFile() - { - $fixable = $this->currentFile->getFixableCount(); - if ($fixable === 0) { - // Nothing to fix. - return false; - } - - $this->enabled = true; - - $this->loops = 0; - while ($this->loops < 50) { - ob_start(); - - // Only needed once file content has changed. - $contents = $this->getContents(); - - if (PHP_CODESNIFFER_VERBOSITY > 2) { - @ob_end_clean(); - echo '---START FILE CONTENT---'.PHP_EOL; - $lines = explode($this->currentFile->eolChar, $contents); - $max = strlen(count($lines)); - foreach ($lines as $lineNum => $line) { - $lineNum++; - echo str_pad($lineNum, $max, ' ', STR_PAD_LEFT).'|'.$line.PHP_EOL; - } - - echo '--- END FILE CONTENT ---'.PHP_EOL; - ob_start(); - } - - $this->inConflict = false; - $this->currentFile->ruleset->populateTokenListeners(); - $this->currentFile->setContent($contents); - $this->currentFile->process(); - ob_end_clean(); - - $this->loops++; - - if (PHP_CODESNIFFER_CBF === true && PHP_CODESNIFFER_VERBOSITY > 0) { - echo "\r".str_repeat(' ', 80)."\r"; - echo "\t=> Fixing file: $this->numFixes/$fixable violations remaining [made $this->loops pass"; - if ($this->loops > 1) { - echo 'es'; - } - - echo ']... '; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo PHP_EOL; - } - } - - if ($this->numFixes === 0 && $this->inConflict === false) { - // Nothing left to do. - break; - } else if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t* fixed $this->numFixes violations, starting loop ".($this->loops + 1).' *'.PHP_EOL; - } - }//end while - - $this->enabled = false; - - if ($this->numFixes > 0 || $this->inConflict === true) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - if (ob_get_level() > 0) { - ob_end_clean(); - } - - echo "\t*** Reached maximum number of loops with $this->numFixes violations left unfixed ***".PHP_EOL; - ob_start(); - } - - return false; - } - - return true; - - }//end fixFile() - - - /** - * Generates a text diff of the original file and the new content. - * - * @param string|null $filePath Optional file path to diff the file against. - * If not specified, the original version of the - * file will be used. - * @param boolean $colors Print coloured output or not. - * - * @return string - * - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException When the diff command fails. - */ - public function generateDiff($filePath=null, $colors=true) - { - if ($filePath === null) { - $filePath = $this->currentFile->getFilename(); - } - - $cwd = getcwd().DIRECTORY_SEPARATOR; - if (strpos($filePath, $cwd) === 0) { - $filename = substr($filePath, strlen($cwd)); - } else { - $filename = $filePath; - } - - $contents = $this->getContents(); - - $tempName = tempnam(sys_get_temp_dir(), 'phpcs-fixer'); - $fixedFile = fopen($tempName, 'w'); - fwrite($fixedFile, $contents); - - // We must use something like shell_exec() or proc_open() because whitespace at the end - // of lines is critical to diff files. - // Using proc_open() instead of shell_exec improves performance on Windows significantly, - // while the results are the same (though more code is needed to get the results). - // This is specifically due to proc_open allowing to set the "bypass_shell" option. - $filename = escapeshellarg($filename); - $cmd = "diff -u -L$filename -LPHP_CodeSniffer $filename \"$tempName\""; - - // Stream 0 = STDIN, 1 = STDOUT, 2 = STDERR. - $descriptorspec = [ - 0 => [ - 'pipe', - 'r', - ], - 1 => [ - 'pipe', - 'w', - ], - 2 => [ - 'pipe', - 'w', - ], - ]; - - $options = null; - if (stripos(PHP_OS, 'WIN') === 0) { - $options = ['bypass_shell' => true]; - } - - $process = proc_open($cmd, $descriptorspec, $pipes, $cwd, null, $options); - if (is_resource($process) === false) { - throw new RuntimeException('Could not obtain a resource to execute the diff command.'); - } - - // We don't need these. - fclose($pipes[0]); - fclose($pipes[2]); - - // Stdout will contain the actual diff. - $diff = stream_get_contents($pipes[1]); - fclose($pipes[1]); - - proc_close($process); - - fclose($fixedFile); - if (is_file($tempName) === true) { - unlink($tempName); - } - - if ($diff === false || $diff === '') { - return ''; - } - - if ($colors === false) { - return $diff; - } - - $diffLines = explode(PHP_EOL, $diff); - if (count($diffLines) === 1) { - // Seems to be required for cygwin. - $diffLines = explode("\n", $diff); - } - - $diff = []; - foreach ($diffLines as $line) { - if (isset($line[0]) === true) { - switch ($line[0]) { - case '-': - $diff[] = "\033[31m$line\033[0m"; - break; - case '+': - $diff[] = "\033[32m$line\033[0m"; - break; - default: - $diff[] = $line; - } - } - } - - $diff = implode(PHP_EOL, $diff); - - return $diff; - - }//end generateDiff() - - - /** - * Get a count of fixes that have been performed on the file. - * - * This value is reset every time a new file is started, or an existing - * file is restarted. - * - * @return int - */ - public function getFixCount() - { - return $this->numFixes; - - }//end getFixCount() - - - /** - * Get the current content of the file, as a string. - * - * @return string - */ - public function getContents() - { - $contents = implode($this->tokens); - return $contents; - - }//end getContents() - - - /** - * Get the current fixed content of a token. - * - * This function takes changesets into account so should be used - * instead of directly accessing the token array. - * - * @param int $stackPtr The position of the token in the token stack. - * - * @return string - */ - public function getTokenContent($stackPtr) - { - if ($this->inChangeset === true - && isset($this->changeset[$stackPtr]) === true - ) { - return $this->changeset[$stackPtr]; - } else { - return $this->tokens[$stackPtr]; - } - - }//end getTokenContent() - - - /** - * Start recording actions for a changeset. - * - * @return void|false - */ - public function beginChangeset() - { - if ($this->inConflict === true) { - return false; - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $bt = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); - if ($bt[1]['class'] === __CLASS__) { - $sniff = 'Fixer'; - } else { - $sniff = $this->getSniffCodeForDebug($bt[1]['class']); - } - - $line = $bt[0]['line']; - - @ob_end_clean(); - echo "\t=> Changeset started by $sniff:$line".PHP_EOL; - ob_start(); - } - - $this->changeset = []; - $this->inChangeset = true; - - }//end beginChangeset() - - - /** - * Stop recording actions for a changeset, and apply logged changes. - * - * @return boolean - */ - public function endChangeset() - { - if ($this->inConflict === true) { - return false; - } - - $this->inChangeset = false; - - $success = true; - $applied = []; - foreach ($this->changeset as $stackPtr => $content) { - $success = $this->replaceToken($stackPtr, $content); - if ($success === false) { - break; - } else { - $applied[] = $stackPtr; - } - } - - if ($success === false) { - // Rolling back all changes. - foreach ($applied as $stackPtr) { - $this->revertToken($stackPtr); - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - @ob_end_clean(); - echo "\t=> Changeset failed to apply".PHP_EOL; - ob_start(); - } - } else if (PHP_CODESNIFFER_VERBOSITY > 1) { - $fixes = count($this->changeset); - @ob_end_clean(); - echo "\t=> Changeset ended: $fixes changes applied".PHP_EOL; - ob_start(); - } - - $this->changeset = []; - return true; - - }//end endChangeset() - - - /** - * Stop recording actions for a changeset, and discard logged changes. - * - * @return void - */ - public function rollbackChangeset() - { - $this->inChangeset = false; - $this->inConflict = false; - - if (empty($this->changeset) === false) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $bt = debug_backtrace(); - if ($bt[1]['class'] === 'PHP_CodeSniffer\Fixer') { - $sniff = $bt[2]['class']; - $line = $bt[1]['line']; - } else { - $sniff = $bt[1]['class']; - $line = $bt[0]['line']; - } - - $sniff = $this->getSniffCodeForDebug($sniff); - - $numChanges = count($this->changeset); - - @ob_end_clean(); - echo "\t\tR: $sniff:$line rolled back the changeset ($numChanges changes)".PHP_EOL; - echo "\t=> Changeset rolled back".PHP_EOL; - ob_start(); - } - - $this->changeset = []; - }//end if - - }//end rollbackChangeset() - - - /** - * Replace the entire contents of a token. - * - * @param int $stackPtr The position of the token in the token stack. - * @param string $content The new content of the token. - * - * @return bool If the change was accepted. - */ - public function replaceToken($stackPtr, $content) - { - if ($this->inConflict === true) { - return false; - } - - if ($this->inChangeset === false - && isset($this->fixedTokens[$stackPtr]) === true - ) { - $indent = "\t"; - if (empty($this->changeset) === false) { - $indent .= "\t"; - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - @ob_end_clean(); - echo "$indent* token $stackPtr has already been modified, skipping *".PHP_EOL; - ob_start(); - } - - return false; - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $bt = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); - if ($bt[1]['class'] === 'PHP_CodeSniffer\Fixer') { - $sniff = $bt[2]['class']; - $line = $bt[1]['line']; - } else { - $sniff = $bt[1]['class']; - $line = $bt[0]['line']; - } - - $sniff = $this->getSniffCodeForDebug($sniff); - - $tokens = $this->currentFile->getTokens(); - $type = $tokens[$stackPtr]['type']; - $tokenLine = $tokens[$stackPtr]['line']; - $oldContent = Common::prepareForOutput($this->tokens[$stackPtr]); - $newContent = Common::prepareForOutput($content); - if (trim($this->tokens[$stackPtr]) === '' && isset($this->tokens[($stackPtr + 1)]) === true) { - // Add some context for whitespace only changes. - $append = Common::prepareForOutput($this->tokens[($stackPtr + 1)]); - $oldContent .= $append; - $newContent .= $append; - } - }//end if - - if ($this->inChangeset === true) { - $this->changeset[$stackPtr] = $content; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - @ob_end_clean(); - echo "\t\tQ: $sniff:$line replaced token $stackPtr ($type on line $tokenLine) \"$oldContent\" => \"$newContent\"".PHP_EOL; - ob_start(); - } - - return true; - } - - if (isset($this->oldTokenValues[$stackPtr]) === false) { - $this->oldTokenValues[$stackPtr] = [ - 'curr' => $content, - 'prev' => $this->tokens[$stackPtr], - 'loop' => $this->loops, - ]; - } else { - if ($this->oldTokenValues[$stackPtr]['prev'] === $content - && $this->oldTokenValues[$stackPtr]['loop'] === ($this->loops - 1) - ) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $indent = "\t"; - if (empty($this->changeset) === false) { - $indent .= "\t"; - } - - $loop = $this->oldTokenValues[$stackPtr]['loop']; - - @ob_end_clean(); - echo "$indent**** $sniff:$line has possible conflict with another sniff on loop $loop; caused by the following change ****".PHP_EOL; - echo "$indent**** replaced token $stackPtr ($type on line $tokenLine) \"$oldContent\" => \"$newContent\" ****".PHP_EOL; - } - - if ($this->oldTokenValues[$stackPtr]['loop'] >= ($this->loops - 1)) { - $this->inConflict = true; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "$indent**** ignoring all changes until next loop ****".PHP_EOL; - } - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - ob_start(); - } - - return false; - }//end if - - $this->oldTokenValues[$stackPtr]['prev'] = $this->oldTokenValues[$stackPtr]['curr']; - $this->oldTokenValues[$stackPtr]['curr'] = $content; - $this->oldTokenValues[$stackPtr]['loop'] = $this->loops; - }//end if - - $this->fixedTokens[$stackPtr] = $this->tokens[$stackPtr]; - $this->tokens[$stackPtr] = $content; - $this->numFixes++; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $indent = "\t"; - if (empty($this->changeset) === false) { - $indent .= "\tA: "; - } - - if (ob_get_level() > 0) { - ob_end_clean(); - } - - echo "$indent$sniff:$line replaced token $stackPtr ($type on line $tokenLine) \"$oldContent\" => \"$newContent\"".PHP_EOL; - ob_start(); - } - - return true; - - }//end replaceToken() - - - /** - * Reverts the previous fix made to a token. - * - * @param int $stackPtr The position of the token in the token stack. - * - * @return bool If a change was reverted. - */ - public function revertToken($stackPtr) - { - if (isset($this->fixedTokens[$stackPtr]) === false) { - return false; - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $bt = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); - if ($bt[1]['class'] === 'PHP_CodeSniffer\Fixer') { - $sniff = $bt[2]['class']; - $line = $bt[1]['line']; - } else { - $sniff = $bt[1]['class']; - $line = $bt[0]['line']; - } - - $sniff = $this->getSniffCodeForDebug($sniff); - - $tokens = $this->currentFile->getTokens(); - $type = $tokens[$stackPtr]['type']; - $tokenLine = $tokens[$stackPtr]['line']; - $oldContent = Common::prepareForOutput($this->tokens[$stackPtr]); - $newContent = Common::prepareForOutput($this->fixedTokens[$stackPtr]); - if (trim($this->tokens[$stackPtr]) === '' && isset($tokens[($stackPtr + 1)]) === true) { - // Add some context for whitespace only changes. - $append = Common::prepareForOutput($this->tokens[($stackPtr + 1)]); - $oldContent .= $append; - $newContent .= $append; - } - }//end if - - $this->tokens[$stackPtr] = $this->fixedTokens[$stackPtr]; - unset($this->fixedTokens[$stackPtr]); - $this->numFixes--; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $indent = "\t"; - if (empty($this->changeset) === false) { - $indent .= "\tR: "; - } - - @ob_end_clean(); - echo "$indent$sniff:$line reverted token $stackPtr ($type on line $tokenLine) \"$oldContent\" => \"$newContent\"".PHP_EOL; - ob_start(); - } - - return true; - - }//end revertToken() - - - /** - * Replace the content of a token with a part of its current content. - * - * @param int $stackPtr The position of the token in the token stack. - * @param int $start The first character to keep. - * @param int|null $length The number of characters to keep. If NULL, the content of - * the token from $start to the end of the content is kept. - * - * @return bool If the change was accepted. - */ - public function substrToken($stackPtr, $start, $length=null) - { - $current = $this->getTokenContent($stackPtr); - - if ($length === null) { - $newContent = substr($current, $start); - } else { - $newContent = substr($current, $start, $length); - } - - return $this->replaceToken($stackPtr, $newContent); - - }//end substrToken() - - - /** - * Adds a newline to end of a token's content. - * - * @param int $stackPtr The position of the token in the token stack. - * - * @return bool If the change was accepted. - */ - public function addNewline($stackPtr) - { - $current = $this->getTokenContent($stackPtr); - return $this->replaceToken($stackPtr, $current.$this->currentFile->eolChar); - - }//end addNewline() - - - /** - * Adds a newline to the start of a token's content. - * - * @param int $stackPtr The position of the token in the token stack. - * - * @return bool If the change was accepted. - */ - public function addNewlineBefore($stackPtr) - { - $current = $this->getTokenContent($stackPtr); - return $this->replaceToken($stackPtr, $this->currentFile->eolChar.$current); - - }//end addNewlineBefore() - - - /** - * Adds content to the end of a token's current content. - * - * @param int $stackPtr The position of the token in the token stack. - * @param string $content The content to add. - * - * @return bool If the change was accepted. - */ - public function addContent($stackPtr, $content) - { - $current = $this->getTokenContent($stackPtr); - return $this->replaceToken($stackPtr, $current.$content); - - }//end addContent() - - - /** - * Adds content to the start of a token's current content. - * - * @param int $stackPtr The position of the token in the token stack. - * @param string $content The content to add. - * - * @return bool If the change was accepted. - */ - public function addContentBefore($stackPtr, $content) - { - $current = $this->getTokenContent($stackPtr); - return $this->replaceToken($stackPtr, $content.$current); - - }//end addContentBefore() - - - /** - * Adjust the indent of a code block. - * - * @param int $start The position of the token in the token stack - * to start adjusting the indent from. - * @param int $end The position of the token in the token stack - * to end adjusting the indent. - * @param int $change The number of spaces to adjust the indent by - * (positive or negative). - * - * @return void - */ - public function changeCodeBlockIndent($start, $end, $change) - { - $tokens = $this->currentFile->getTokens(); - - $baseIndent = ''; - if ($change > 0) { - $baseIndent = str_repeat(' ', $change); - } - - $useChangeset = false; - if ($this->inChangeset === false) { - $this->beginChangeset(); - $useChangeset = true; - } - - for ($i = $start; $i <= $end; $i++) { - if ($tokens[$i]['column'] !== 1 - || $tokens[($i + 1)]['line'] !== $tokens[$i]['line'] - ) { - continue; - } - - $length = 0; - if ($tokens[$i]['code'] === T_WHITESPACE - || $tokens[$i]['code'] === T_DOC_COMMENT_WHITESPACE - ) { - $length = $tokens[$i]['length']; - - $padding = ($length + $change); - if ($padding > 0) { - $padding = str_repeat(' ', $padding); - } else { - $padding = ''; - } - - $newContent = $padding.ltrim($tokens[$i]['content']); - } else { - $newContent = $baseIndent.$tokens[$i]['content']; - } - - $this->replaceToken($i, $newContent); - }//end for - - if ($useChangeset === true) { - $this->endChangeset(); - } - - }//end changeCodeBlockIndent() - - - /** - * Get the sniff code for the current sniff or the class name if the passed class is not a sniff. - * - * @param string $className Class name. - * - * @return string - */ - private function getSniffCodeForDebug($className) - { - try { - $sniffCode = Common::getSniffCode($className); - return $sniffCode; - } catch (InvalidArgumentException $e) { - // Sniff code could not be determined. This may be an abstract sniff class or a helper class. - return $className; - } - - }//end getSniffCodeForDebug() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Generators/Generator.php b/vendor/squizlabs/php_codesniffer/src/Generators/Generator.php deleted file mode 100644 index 20de10a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Generators/Generator.php +++ /dev/null @@ -1,143 +0,0 @@ - - * @author Juliette Reinders Folmer - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Generators; - -use DOMDocument; -use DOMNode; -use PHP_CodeSniffer\Autoload; -use PHP_CodeSniffer\Ruleset; - -abstract class Generator -{ - - /** - * The ruleset used for the run. - * - * @var \PHP_CodeSniffer\Ruleset - */ - public $ruleset = null; - - /** - * XML documentation files used to produce the final output. - * - * @var string[] - */ - public $docFiles = []; - - - /** - * Constructs a doc generator. - * - * @param \PHP_CodeSniffer\Ruleset $ruleset The ruleset used for the run. - * - * @see generate() - */ - public function __construct(Ruleset $ruleset) - { - $this->ruleset = $ruleset; - - $find = [ - DIRECTORY_SEPARATOR.'Sniffs'.DIRECTORY_SEPARATOR, - 'Sniff.php', - ]; - $replace = [ - DIRECTORY_SEPARATOR.'Docs'.DIRECTORY_SEPARATOR, - 'Standard.xml', - ]; - - foreach ($ruleset->sniffs as $className => $sniffClass) { - $file = Autoload::getLoadedFileName($className); - $docFile = str_replace($find, $replace, $file); - - if (is_file($docFile) === true) { - $this->docFiles[] = $docFile; - } - } - - // Always present the docs in a consistent alphabetical order. - sort($this->docFiles, (SORT_NATURAL | SORT_FLAG_CASE)); - - }//end __construct() - - - /** - * Retrieves the title of the sniff from the DOMNode supplied. - * - * @param \DOMNode $doc The DOMNode object for the sniff. - * It represents the "documentation" tag in the XML - * standard file. - * - * @return string - */ - protected function getTitle(DOMNode $doc) - { - $title = $doc->getAttribute('title'); - - if (empty($title) === true) { - // Fall back to the sniff name if no title was supplied. - $fileName = $doc->ownerDocument->documentURI; - $lastSlash = strrpos($fileName, '/'); - if (is_int($lastSlash) === true) { - // Get the sniff name without "Standard.xml". - $title = substr($fileName, ($lastSlash + 1), -12); - - // Split the sniff name to individual words. - $title = preg_replace('`[-._]|(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])`', '$1 $2', $title); - } - } - - return $title; - - }//end getTitle() - - - /** - * Generates the documentation for a standard. - * - * It's probably wise for doc generators to override this method so they - * have control over how the docs are produced. Otherwise, the processSniff - * method should be overridden to output content for each sniff. - * - * @return void - * @see processSniff() - */ - public function generate() - { - foreach ($this->docFiles as $file) { - $doc = new DOMDocument(); - $doc->load($file); - $documentation = $doc->getElementsByTagName('documentation')->item(0); - $this->processSniff($documentation); - } - - }//end generate() - - - /** - * Process the documentation for a single sniff. - * - * Doc generators must implement this function to produce output. - * - * @param \DOMNode $doc The DOMNode object for the sniff. - * It represents the "documentation" tag in the XML - * standard file. - * - * @return void - * @see generate() - */ - abstract protected function processSniff(DOMNode $doc); - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Generators/HTML.php b/vendor/squizlabs/php_codesniffer/src/Generators/HTML.php deleted file mode 100644 index ef8dcd3..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Generators/HTML.php +++ /dev/null @@ -1,564 +0,0 @@ - - * @author Juliette Reinders Folmer - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Generators; - -use DOMDocument; -use DOMElement; -use DOMNode; -use PHP_CodeSniffer\Config; - -class HTML extends Generator -{ - - /** - * Stylesheet for the HTML output. - * - * @var string - */ - const STYLESHEET = ''; - - /** - * List of seen slugified anchors to ensure uniqueness. - * - * @var array - */ - private $seenAnchors = []; - - - /** - * Generates the documentation for a standard. - * - * @return void - * @see processSniff() - */ - public function generate() - { - if (empty($this->docFiles) === true) { - return; - } - - ob_start(); - parent::generate(); - - $content = ob_get_contents(); - ob_end_clean(); - - // Clear anchor cache after Documentation generation. - // The anchor generation for the TOC anchor links will use the same logic, so should end up with the same unique slugs. - $this->seenAnchors = []; - - if (trim($content) !== '') { - echo $this->getFormattedHeader(); - echo $this->getFormattedToc(); - echo $content; - echo $this->getFormattedFooter(); - } - - }//end generate() - - - /** - * Print the header of the HTML page. - * - * @deprecated 3.12.0 Use HTML::getFormattedHeader() instead. - * - * @codeCoverageIgnore - * - * @return void - */ - protected function printHeader() - { - trigger_error( - 'The '.__METHOD__.'() method is deprecated. Use "echo '.__CLASS__.'::getFormattedHeader()" instead.', - E_USER_DEPRECATED - ); - - echo $this->getFormattedHeader(); - - }//end printHeader() - - - /** - * Format the header of the HTML page. - * - * @since 3.12.0 Replaces the deprecated HTML::printHeader() method. - * - * @return string - */ - protected function getFormattedHeader() - { - $standard = $this->ruleset->name; - $output = sprintf( - ' - - %1$s Coding Standards - %2$s - - -

    %1$s Coding Standards

    ', - $standard, - self::STYLESHEET - ); - - // Use the correct line endings based on the OS. - return str_replace("\n", PHP_EOL, $output).PHP_EOL; - - }//end getFormattedHeader() - - - /** - * Print the table of contents for the standard. - * - * @deprecated 3.12.0 Use HTML::getFormattedToc() instead. - * - * @codeCoverageIgnore - * - * @return void - */ - protected function printToc() - { - trigger_error( - 'The '.__METHOD__.'() method is deprecated. Use "echo '.__CLASS__.'::getFormattedToc()" instead.', - E_USER_DEPRECATED - ); - - echo $this->getFormattedToc(); - - }//end printToc() - - - /** - * Format the table of contents for the standard. - * - * The TOC is just an unordered list of bookmarks to sniffs on the page. - * - * @since 3.12.0 Replaces the deprecated HTML::printToc() method. - * - * @return string - */ - protected function getFormattedToc() - { - // Only show a TOC when there are two or more docs to display. - if (count($this->docFiles) < 2) { - return ''; - } - - $output = '

    Table of Contents

    '.PHP_EOL; - $output .= '
      '.PHP_EOL; - - $listItemTemplate = '
    • %s
    • '.PHP_EOL; - - foreach ($this->docFiles as $file) { - $doc = new DOMDocument(); - $doc->load($file); - $documentation = $doc->getElementsByTagName('documentation')->item(0); - $title = $this->getTitle($documentation); - $output .= sprintf($listItemTemplate, $this->titleToAnchor($title), $title); - } - - $output .= '
    '.PHP_EOL; - - return $output; - - }//end getFormattedToc() - - - /** - * Print the footer of the HTML page. - * - * @deprecated 3.12.0 Use HTML::getFormattedFooter() instead. - * - * @codeCoverageIgnore - * - * @return void - */ - protected function printFooter() - { - trigger_error( - 'The '.__METHOD__.'() method is deprecated. Use "echo '.__CLASS__.'::getFormattedFooter()" instead.', - E_USER_DEPRECATED - ); - - echo $this->getFormattedFooter(); - - }//end printFooter() - - - /** - * Format the footer of the HTML page. - * - * @since 3.12.0 Replaces the deprecated HTML::printFooter() method. - * - * @return string - */ - protected function getFormattedFooter() - { - // Turn off errors so we don't get timezone warnings if people - // don't have their timezone set. - $errorLevel = error_reporting(0); - $output = sprintf( - '
    Documentation generated on %s by PHP_CodeSniffer %s
    - -', - date('r'), - Config::VERSION - ); - error_reporting($errorLevel); - - // Use the correct line endings based on the OS. - return str_replace("\n", PHP_EOL, $output).PHP_EOL; - - }//end getFormattedFooter() - - - /** - * Process the documentation for a single sniff. - * - * @param \DOMNode $doc The DOMNode object for the sniff. - * It represents the "documentation" tag in the XML - * standard file. - * - * @return void - */ - public function processSniff(DOMNode $doc) - { - $content = ''; - foreach ($doc->childNodes as $node) { - if ($node->nodeName === 'standard') { - $content .= $this->getFormattedTextBlock($node); - } else if ($node->nodeName === 'code_comparison') { - $content .= $this->getFormattedCodeComparisonBlock($node); - } - } - - if (trim($content) !== '') { - $title = $this->getTitle($doc); - printf( - '

    %2$s §

    '.PHP_EOL, - $this->titleToAnchor($title), - $title - ); - echo $content; - } - - }//end processSniff() - - - /** - * Transform a title to a string which can be used as an HTML anchor. - * - * @param string $title The title. - * - * @since 3.12.0 - * - * @return string - */ - private function titleToAnchor($title) - { - // Slugify the text. - $title = strtolower($title); - $title = preg_replace('`[^a-z0-9\._-]`', '-', $title); - - if (isset($this->seenAnchors[$title]) === true) { - // Try to find a unique anchor for this title. - for ($i = 2; (isset($this->seenAnchors[$title.'-'.$i]) === true); $i++); - $title .= '-'.$i; - } - - // Add to "seen" list. - $this->seenAnchors[$title] = true; - - return $title; - - }//end titleToAnchor() - - - /** - * Print a text block found in a standard. - * - * @param \DOMNode $node The DOMNode object for the text block. - * - * @deprecated 3.12.0 Use HTML::getFormattedTextBlock() instead. - * - * @codeCoverageIgnore - * - * @return void - */ - protected function printTextBlock(DOMNode $node) - { - trigger_error( - 'The '.__METHOD__.'() method is deprecated. Use "echo '.__CLASS__.'::getFormattedTextBlock()" instead.', - E_USER_DEPRECATED - ); - - echo $this->getFormattedTextBlock($node); - - }//end printTextBlock() - - - /** - * Format a text block found in a standard. - * - * @param \DOMNode $node The DOMNode object for the text block. - * - * @since 3.12.0 Replaces the deprecated HTML::printTextBlock() method. - * - * @return string - */ - protected function getFormattedTextBlock(DOMNode $node) - { - $content = $node->nodeValue; - if (empty($content) === true) { - return ''; - } - - $content = trim($content); - $content = htmlspecialchars($content, (ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401)); - - // Allow only em tags. - $content = str_replace('<em>', '', $content); - $content = str_replace('</em>', '', $content); - - $nodeLines = explode("\n", $content); - $lineCount = count($nodeLines); - $lines = []; - - for ($i = 0; $i < $lineCount; $i++) { - $currentLine = trim($nodeLines[$i]); - - if (isset($nodeLines[($i + 1)]) === false) { - // We're at the end of the text, just add the line. - $lines[] = $currentLine; - } else { - $nextLine = trim($nodeLines[($i + 1)]); - if ($nextLine === '') { - // Next line is a blank line, end the paragraph and start a new one. - // Also skip over the blank line. - $lines[] = $currentLine.'

    '.PHP_EOL.'

    '; - ++$i; - } else { - // Next line is not blank, so just add a line break. - $lines[] = $currentLine.'
    '.PHP_EOL; - } - } - } - - return '

    '.implode('', $lines).'

    '.PHP_EOL; - - }//end getFormattedTextBlock() - - - /** - * Print a code comparison block found in a standard. - * - * @param \DOMNode $node The DOMNode object for the code comparison block. - * - * @deprecated 3.12.0 Use HTML::getFormattedCodeComparisonBlock() instead. - * - * @codeCoverageIgnore - * - * @return void - */ - protected function printCodeComparisonBlock(DOMNode $node) - { - trigger_error( - 'The '.__METHOD__.'() method is deprecated. Use "echo '.__CLASS__.'::getFormattedCodeComparisonBlock()" instead.', - E_USER_DEPRECATED - ); - - echo $this->getFormattedCodeComparisonBlock($node); - - }//end printCodeComparisonBlock() - - - /** - * Format a code comparison block found in a standard. - * - * @param \DOMNode $node The DOMNode object for the code comparison block. - * - * @since 3.12.0 Replaces the deprecated HTML::printCodeComparisonBlock() method. - * - * @return string - */ - protected function getFormattedCodeComparisonBlock(DOMNode $node) - { - $codeBlocks = $node->getElementsByTagName('code'); - $firstCodeElm = $codeBlocks->item(0); - $secondCodeElm = $codeBlocks->item(1); - - if (isset($firstCodeElm, $secondCodeElm) === false) { - // Missing at least one code block. - return ''; - } - - $firstTitle = $this->formatCodeTitle($firstCodeElm); - $first = $this->formatCodeSample($firstCodeElm); - - $secondTitle = $this->formatCodeTitle($secondCodeElm); - $second = $this->formatCodeSample($secondCodeElm); - - $titleRow = ''; - if ($firstTitle !== '' || $secondTitle !== '') { - $titleRow .= ' '.PHP_EOL; - $titleRow .= " $firstTitle".PHP_EOL; - $titleRow .= " $secondTitle".PHP_EOL; - $titleRow .= ' '.PHP_EOL; - } - - $codeRow = ''; - if ($first !== '' || $second !== '') { - $codeRow .= ' '.PHP_EOL; - $codeRow .= " $first".PHP_EOL; - $codeRow .= " $second".PHP_EOL; - $codeRow .= ' '.PHP_EOL; - } - - $output = ''; - if ($titleRow !== '' || $codeRow !== '') { - $output = ' '.PHP_EOL; - $output .= $titleRow; - $output .= $codeRow; - $output .= '
    '.PHP_EOL; - } - - return $output; - - }//end getFormattedCodeComparisonBlock() - - - /** - * Retrieve a code block title and prepare it for output as HTML. - * - * @param \DOMElement $codeElm The DOMElement object for a code block. - * - * @since 3.12.0 - * - * @return string - */ - private function formatCodeTitle(DOMElement $codeElm) - { - $title = trim($codeElm->getAttribute('title')); - return str_replace(' ', '  ', $title); - - }//end formatCodeTitle() - - - /** - * Retrieve a code block contents and prepare it for output as HTML. - * - * @param \DOMElement $codeElm The DOMElement object for a code block. - * - * @since 3.12.0 - * - * @return string - */ - private function formatCodeSample(DOMElement $codeElm) - { - $code = (string) $codeElm->nodeValue; - $code = trim($code); - $code = str_replace('', ' '], $code); - $code = str_replace(['', ''], ['', ''], $code); - - return $code; - - }//end formatCodeSample() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Generators/Markdown.php b/vendor/squizlabs/php_codesniffer/src/Generators/Markdown.php deleted file mode 100644 index 16e05cf..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Generators/Markdown.php +++ /dev/null @@ -1,350 +0,0 @@ - - * @author Juliette Reinders Folmer - * @copyright 2014 Arroba IT - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Generators; - -use DOMElement; -use DOMNode; -use PHP_CodeSniffer\Config; - -class Markdown extends Generator -{ - - - /** - * Generates the documentation for a standard. - * - * @return void - * @see processSniff() - */ - public function generate() - { - if (empty($this->docFiles) === true) { - return; - } - - ob_start(); - parent::generate(); - - $content = ob_get_contents(); - ob_end_clean(); - - if (trim($content) !== '') { - echo $this->getFormattedHeader(); - echo $content; - echo $this->getFormattedFooter(); - } - - }//end generate() - - - /** - * Print the markdown header. - * - * @deprecated 3.12.0 Use Markdown::getFormattedHeader() instead. - * - * @codeCoverageIgnore - * - * @return void - */ - protected function printHeader() - { - trigger_error( - 'The '.__METHOD__.'() method is deprecated. Use "echo '.__CLASS__.'::getFormattedHeader()" instead.', - E_USER_DEPRECATED - ); - - echo $this->getFormattedHeader(); - - }//end printHeader() - - - /** - * Format the markdown header. - * - * @since 3.12.0 Replaces the deprecated Markdown::printHeader() method. - * - * @return string - */ - protected function getFormattedHeader() - { - $standard = $this->ruleset->name; - - return "# $standard Coding Standard".PHP_EOL; - - }//end getFormattedHeader() - - - /** - * Print the markdown footer. - * - * @deprecated 3.12.0 Use Markdown::getFormattedFooter() instead. - * - * @codeCoverageIgnore - * - * @return void - */ - protected function printFooter() - { - trigger_error( - 'The '.__METHOD__.'() method is deprecated. Use "echo '.__CLASS__.'::getFormattedFooter()" instead.', - E_USER_DEPRECATED - ); - - echo $this->getFormattedFooter(); - - }//end printFooter() - - - /** - * Format the markdown footer. - * - * @since 3.12.0 Replaces the deprecated Markdown::printFooter() method. - * - * @return string - */ - protected function getFormattedFooter() - { - // Turn off errors so we don't get timezone warnings if people - // don't have their timezone set. - $errorLevel = error_reporting(0); - $output = PHP_EOL.'Documentation generated on '.date('r'); - $output .= ' by [PHP_CodeSniffer '.Config::VERSION.'](https://github.com/PHPCSStandards/PHP_CodeSniffer)'.PHP_EOL; - error_reporting($errorLevel); - - return $output; - - }//end getFormattedFooter() - - - /** - * Process the documentation for a single sniff. - * - * @param \DOMNode $doc The DOMNode object for the sniff. - * It represents the "documentation" tag in the XML - * standard file. - * - * @return void - */ - protected function processSniff(DOMNode $doc) - { - $content = ''; - foreach ($doc->childNodes as $node) { - if ($node->nodeName === 'standard') { - $content .= $this->getFormattedTextBlock($node); - } else if ($node->nodeName === 'code_comparison') { - $content .= $this->getFormattedCodeComparisonBlock($node); - } - } - - if (trim($content) !== '') { - $title = $this->getTitle($doc); - echo PHP_EOL."## $title".PHP_EOL.PHP_EOL; - echo $content; - } - - }//end processSniff() - - - /** - * Print a text block found in a standard. - * - * @param \DOMNode $node The DOMNode object for the text block. - * - * @deprecated 3.12.0 Use Markdown::getFormattedTextBlock() instead. - * - * @codeCoverageIgnore - * - * @return void - */ - protected function printTextBlock(DOMNode $node) - { - trigger_error( - 'The '.__METHOD__.'() method is deprecated. Use "echo '.__CLASS__.'::getFormattedTextBlock()" instead.', - E_USER_DEPRECATED - ); - - echo $this->getFormattedTextBlock($node); - - }//end printTextBlock() - - - /** - * Format a text block found in a standard. - * - * @param \DOMNode $node The DOMNode object for the text block. - * - * @since 3.12.0 Replaces the deprecated Markdown::printTextBlock() method. - * - * @return string - */ - protected function getFormattedTextBlock(DOMNode $node) - { - $content = $node->nodeValue; - if (empty($content) === true) { - return ''; - } - - $content = trim($content); - $content = htmlspecialchars($content, (ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401)); - $content = str_replace('<em>', '*', $content); - $content = str_replace('</em>', '*', $content); - - $nodeLines = explode("\n", $content); - $lineCount = count($nodeLines); - $lines = []; - - for ($i = 0; $i < $lineCount; $i++) { - $currentLine = trim($nodeLines[$i]); - if ($currentLine === '') { - // The text contained a blank line. Respect this. - $lines[] = ''; - continue; - } - - // Check if the _next_ line is blank. - if (isset($nodeLines[($i + 1)]) === false - || trim($nodeLines[($i + 1)]) === '' - ) { - // Next line is blank, just add the line. - $lines[] = $currentLine; - } else { - // Ensure that line breaks are respected in markdown. - $lines[] = $currentLine.' '; - } - } - - return implode(PHP_EOL, $lines).PHP_EOL; - - }//end getFormattedTextBlock() - - - /** - * Print a code comparison block found in a standard. - * - * @param \DOMNode $node The DOMNode object for the code comparison block. - * - * @deprecated 3.12.0 Use Markdown::getFormattedCodeComparisonBlock() instead. - * - * @codeCoverageIgnore - * - * @return void - */ - protected function printCodeComparisonBlock(DOMNode $node) - { - trigger_error( - 'The '.__METHOD__.'() method is deprecated. Use "echo '.__CLASS__.'::getFormattedCodeComparisonBlock()" instead.', - E_USER_DEPRECATED - ); - - echo $this->getFormattedCodeComparisonBlock($node); - - }//end printCodeComparisonBlock() - - - /** - * Format a code comparison block found in a standard. - * - * @param \DOMNode $node The DOMNode object for the code comparison block. - * - * @since 3.12.0 Replaces the deprecated Markdown::printCodeComparisonBlock() method. - * - * @return string - */ - protected function getFormattedCodeComparisonBlock(DOMNode $node) - { - $codeBlocks = $node->getElementsByTagName('code'); - $firstCodeElm = $codeBlocks->item(0); - $secondCodeElm = $codeBlocks->item(1); - - if (isset($firstCodeElm, $secondCodeElm) === false) { - // Missing at least one code block. - return ''; - } - - $firstTitle = $this->formatCodeTitle($firstCodeElm); - $first = $this->formatCodeSample($firstCodeElm); - - $secondTitle = $this->formatCodeTitle($secondCodeElm); - $second = $this->formatCodeSample($secondCodeElm); - - $titleRow = ''; - if ($firstTitle !== '' || $secondTitle !== '') { - $titleRow .= ' '.PHP_EOL; - $titleRow .= " $firstTitle".PHP_EOL; - $titleRow .= " $secondTitle".PHP_EOL; - $titleRow .= ' '.PHP_EOL; - } - - $codeRow = ''; - if ($first !== '' || $second !== '') { - $codeRow .= ' '.PHP_EOL; - $codeRow .= ''.PHP_EOL.PHP_EOL; - $codeRow .= " $first".PHP_EOL.PHP_EOL; - $codeRow .= ''.PHP_EOL; - $codeRow .= ''.PHP_EOL.PHP_EOL; - $codeRow .= " $second".PHP_EOL.PHP_EOL; - $codeRow .= ''.PHP_EOL; - $codeRow .= ' '.PHP_EOL; - } - - $output = ''; - if ($titleRow !== '' || $codeRow !== '') { - $output .= ' '.PHP_EOL; - $output .= $titleRow; - $output .= $codeRow; - $output .= '
    '.PHP_EOL; - } - - return $output; - - }//end getFormattedCodeComparisonBlock() - - - /** - * Retrieve a code block title and prepare it for output as HTML. - * - * @param \DOMElement $codeElm The DOMElement object for a code block. - * - * @since 3.12.0 - * - * @return string - */ - private function formatCodeTitle(DOMElement $codeElm) - { - $title = trim($codeElm->getAttribute('title')); - return str_replace(' ', '  ', $title); - - }//end formatCodeTitle() - - - /** - * Retrieve a code block contents and prepare it for output as HTML. - * - * @param \DOMElement $codeElm The DOMElement object for a code block. - * - * @since 3.12.0 - * - * @return string - */ - private function formatCodeSample(DOMElement $codeElm) - { - $code = (string) $codeElm->nodeValue; - $code = trim($code); - $code = str_replace("\n", PHP_EOL.' ', $code); - $code = str_replace(['', ''], '', $code); - - return $code; - - }//end formatCodeSample() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Generators/Text.php b/vendor/squizlabs/php_codesniffer/src/Generators/Text.php deleted file mode 100644 index 28439e0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Generators/Text.php +++ /dev/null @@ -1,313 +0,0 @@ - - * @author Juliette Reinders Folmer - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Generators; - -use DOMElement; -use DOMNode; - -class Text extends Generator -{ - - - /** - * Process the documentation for a single sniff. - * - * @param \DOMNode $doc The DOMNode object for the sniff. - * It represents the "documentation" tag in the XML - * standard file. - * - * @return void - */ - public function processSniff(DOMNode $doc) - { - $content = ''; - foreach ($doc->childNodes as $node) { - if ($node->nodeName === 'standard') { - $content .= $this->getFormattedTextBlock($node); - } else if ($node->nodeName === 'code_comparison') { - $content .= $this->getFormattedCodeComparisonBlock($node); - } - } - - if (trim($content) !== '') { - echo $this->getFormattedTitle($doc), $content; - } - - }//end processSniff() - - - /** - * Prints the title area for a single sniff. - * - * @param \DOMNode $doc The DOMNode object for the sniff. - * It represents the "documentation" tag in the XML - * standard file. - * - * @deprecated 3.12.0 Use Text::getFormattedTitle() instead. - * - * @codeCoverageIgnore - * - * @return void - */ - protected function printTitle(DOMNode $doc) - { - trigger_error( - 'The '.__METHOD__.'() method is deprecated. Use "echo '.__CLASS__.'::getFormattedTitle()" instead.', - E_USER_DEPRECATED - ); - - echo $this->getFormattedTitle($doc); - - }//end printTitle() - - - /** - * Format the title area for a single sniff. - * - * @param \DOMNode $doc The DOMNode object for the sniff. - * It represents the "documentation" tag in the XML - * standard file. - * - * @since 3.12.0 Replaces the deprecated Text::printTitle() method. - * - * @return string - */ - protected function getFormattedTitle(DOMNode $doc) - { - $title = $this->getTitle($doc); - $standard = $this->ruleset->name; - $displayTitle = "$standard CODING STANDARD: $title"; - $titleLength = strlen($displayTitle); - - $output = PHP_EOL; - $output .= str_repeat('-', ($titleLength + 4)); - $output .= strtoupper(PHP_EOL."| $displayTitle |".PHP_EOL); - $output .= str_repeat('-', ($titleLength + 4)); - $output .= PHP_EOL.PHP_EOL; - - return $output; - - }//end getFormattedTitle() - - - /** - * Print a text block found in a standard. - * - * @param \DOMNode $node The DOMNode object for the text block. - * - * @deprecated 3.12.0 Use Text::getFormattedTextBlock() instead. - * - * @codeCoverageIgnore - * - * @return void - */ - protected function printTextBlock(DOMNode $node) - { - trigger_error( - 'The '.__METHOD__.'() method is deprecated. Use "echo '.__CLASS__.'::getFormattedTextBlock()" instead.', - E_USER_DEPRECATED - ); - - echo $this->getFormattedTextBlock($node); - - }//end printTextBlock() - - - /** - * Format a text block found in a standard. - * - * @param \DOMNode $node The DOMNode object for the text block. - * - * @since 3.12.0 Replaces the deprecated Text::printTextBlock() method. - * - * @return string - */ - protected function getFormattedTextBlock(DOMNode $node) - { - $text = $node->nodeValue; - if (empty($text) === true) { - return ''; - } - - $text = trim($text); - $text = str_replace(['', ''], '*', $text); - - $nodeLines = explode("\n", $text); - $nodeLines = array_map('trim', $nodeLines); - $text = implode(PHP_EOL, $nodeLines); - - return wordwrap($text, 100, PHP_EOL).PHP_EOL.PHP_EOL; - - }//end getFormattedTextBlock() - - - /** - * Print a code comparison block found in a standard. - * - * @param \DOMNode $node The DOMNode object for the code comparison block. - * - * @deprecated 3.12.0 Use Text::getFormattedCodeComparisonBlock() instead. - * - * @codeCoverageIgnore - * - * @return void - */ - protected function printCodeComparisonBlock(DOMNode $node) - { - trigger_error( - 'The '.__METHOD__.'() method is deprecated. Use "echo '.__CLASS__.'::getFormattedCodeComparisonBlock()" instead.', - E_USER_DEPRECATED - ); - - echo $this->getFormattedCodeComparisonBlock($node); - - }//end printCodeComparisonBlock() - - - /** - * Format a code comparison block found in a standard. - * - * @param \DOMNode $node The DOMNode object for the code comparison block. - * - * @since 3.12.0 Replaces the deprecated Text::printCodeComparisonBlock() method. - * - * @return string - */ - protected function getFormattedCodeComparisonBlock(DOMNode $node) - { - $codeBlocks = $node->getElementsByTagName('code'); - $firstCodeElm = $codeBlocks->item(0); - $secondCodeElm = $codeBlocks->item(1); - - if (isset($firstCodeElm, $secondCodeElm) === false) { - // Missing at least one code block. - return ''; - } - - $firstTitleLines = $this->codeTitleToLines($firstCodeElm); - $firstLines = $this->codeToLines($firstCodeElm); - - $secondTitleLines = $this->codeTitleToLines($secondCodeElm); - $secondLines = $this->codeToLines($secondCodeElm); - - $titleRow = ''; - if ($firstTitleLines !== [] || $secondTitleLines !== []) { - $titleRow = $this->linesToTableRows($firstTitleLines, $secondTitleLines); - $titleRow .= str_repeat('-', 100).PHP_EOL; - }//end if - - $codeRow = ''; - if ($firstLines !== [] || $secondLines !== []) { - $codeRow = $this->linesToTableRows($firstLines, $secondLines); - $codeRow .= str_repeat('-', 100).PHP_EOL.PHP_EOL; - }//end if - - $output = ''; - if ($titleRow !== '' || $codeRow !== '') { - $output = str_repeat('-', 41); - $output .= ' CODE COMPARISON '; - $output .= str_repeat('-', 42).PHP_EOL; - $output .= $titleRow; - $output .= $codeRow; - } - - return $output; - - }//end getFormattedCodeComparisonBlock() - - - /** - * Retrieve a code block title and split it into lines for use in an ASCII table. - * - * @param \DOMElement $codeElm The DOMElement object for a code block. - * - * @since 3.12.0 - * - * @return array - */ - private function codeTitleToLines(DOMElement $codeElm) - { - $title = trim($codeElm->getAttribute('title')); - if ($title === '') { - return []; - } - - $title = wordwrap($title, 46, "\n"); - - return explode("\n", $title); - - }//end codeTitleToLines() - - - /** - * Retrieve a code block contents and split it into lines for use in an ASCII table. - * - * @param \DOMElement $codeElm The DOMElement object for a code block. - * - * @since 3.12.0 - * - * @return array - */ - private function codeToLines(DOMElement $codeElm) - { - $code = trim($codeElm->nodeValue); - if ($code === '') { - return []; - } - - $code = str_replace(['', ''], '', $code); - return explode("\n", $code); - - }//end codeToLines() - - - /** - * Transform two sets of text lines into rows for use in an ASCII table. - * - * The sets may not contains an equal amount of lines, while the resulting rows should. - * - * @param array $column1Lines Lines of text to place in column 1. - * @param array $column2Lines Lines of text to place in column 2. - * - * @return string - */ - private function linesToTableRows(array $column1Lines, array $column2Lines) - { - $maxLines = max(count($column1Lines), count($column2Lines)); - - $rows = ''; - for ($i = 0; $i < $maxLines; $i++) { - $column1Text = ''; - if (isset($column1Lines[$i]) === true) { - $column1Text = $column1Lines[$i]; - } - - $column2Text = ''; - if (isset($column2Lines[$i]) === true) { - $column2Text = $column2Lines[$i]; - } - - $rows .= '| '; - $rows .= $column1Text.str_repeat(' ', max(0, (47 - strlen($column1Text)))); - $rows .= '| '; - $rows .= $column2Text.str_repeat(' ', max(0, (48 - strlen($column2Text)))); - $rows .= '|'.PHP_EOL; - }//end for - - return $rows; - - }//end linesToTableRows() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Reporter.php b/vendor/squizlabs/php_codesniffer/src/Reporter.php deleted file mode 100644 index 0aafe15..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reporter.php +++ /dev/null @@ -1,445 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer; - -use PHP_CodeSniffer\Exceptions\DeepExitException; -use PHP_CodeSniffer\Exceptions\RuntimeException; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Reports\Report; -use PHP_CodeSniffer\Util\Common; - -class Reporter -{ - - /** - * The config data for the run. - * - * @var \PHP_CodeSniffer\Config - */ - public $config = null; - - /** - * Total number of files that contain errors or warnings. - * - * @var integer - */ - public $totalFiles = 0; - - /** - * Total number of errors found during the run. - * - * @var integer - */ - public $totalErrors = 0; - - /** - * Total number of warnings found during the run. - * - * @var integer - */ - public $totalWarnings = 0; - - /** - * Total number of errors/warnings that can be fixed. - * - * @var integer - */ - public $totalFixable = 0; - - /** - * Total number of errors/warnings that were fixed. - * - * @var integer - */ - public $totalFixed = 0; - - /** - * When the PHPCS run started. - * - * @var float - */ - public static $startTime = 0; - - /** - * A cache of report objects. - * - * @var array - */ - private $reports = []; - - /** - * A cache of opened temporary files. - * - * @var array - */ - private $tmpFiles = []; - - - /** - * Initialise the reporter. - * - * All reports specified in the config will be created and their - * output file (or a temp file if none is specified) initialised by - * clearing the current contents. - * - * @param \PHP_CodeSniffer\Config $config The config data for the run. - * - * @return void - * @throws \PHP_CodeSniffer\Exceptions\DeepExitException If a custom report class could not be found. - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If a report class is incorrectly set up. - */ - public function __construct(Config $config) - { - $this->config = $config; - - foreach ($config->reports as $type => $output) { - if ($output === null) { - $output = $config->reportFile; - } - - $reportClassName = ''; - if (strpos($type, '.') !== false) { - // This is a path to a custom report class. - $filename = realpath($type); - if ($filename === false) { - $error = "ERROR: Custom report \"$type\" not found".PHP_EOL; - throw new DeepExitException($error, 3); - } - - $reportClassName = Autoload::loadFile($filename); - } else if (class_exists('PHP_CodeSniffer\Reports\\'.ucfirst($type)) === true) { - // PHPCS native report. - $reportClassName = 'PHP_CodeSniffer\Reports\\'.ucfirst($type); - } else if (class_exists($type) === true) { - // FQN of a custom report. - $reportClassName = $type; - } else { - // OK, so not a FQN, try and find the report using the registered namespaces. - $registeredNamespaces = Autoload::getSearchPaths(); - $trimmedType = ltrim($type, '\\'); - - foreach ($registeredNamespaces as $nsPrefix) { - if ($nsPrefix === '') { - continue; - } - - if (class_exists($nsPrefix.'\\'.$trimmedType) === true) { - $reportClassName = $nsPrefix.'\\'.$trimmedType; - break; - } - } - }//end if - - if ($reportClassName === '') { - $error = "ERROR: Class file for report \"$type\" not found".PHP_EOL; - throw new DeepExitException($error, 3); - } - - $reportClass = new $reportClassName(); - if (($reportClass instanceof Report) === false) { - throw new RuntimeException('Class "'.$reportClassName.'" must implement the "PHP_CodeSniffer\Report" interface.'); - } - - $this->reports[$type] = [ - 'output' => $output, - 'class' => $reportClass, - ]; - - if ($output === null) { - // Using a temp file. - // This needs to be set in the constructor so that all - // child procs use the same report file when running in parallel. - $this->tmpFiles[$type] = tempnam(sys_get_temp_dir(), 'phpcs'); - file_put_contents($this->tmpFiles[$type], ''); - } else { - file_put_contents($output, ''); - } - }//end foreach - - }//end __construct() - - - /** - * Generates and prints final versions of all reports. - * - * Returns TRUE if any of the reports output content to the screen - * or FALSE if all reports were silently printed to a file. - * - * @return bool - */ - public function printReports() - { - $toScreen = false; - foreach ($this->reports as $type => $report) { - if ($report['output'] === null) { - $toScreen = true; - } - - $this->printReport($type); - } - - return $toScreen; - - }//end printReports() - - - /** - * Generates and prints a single final report. - * - * @param string $report The report type to print. - * - * @return void - */ - public function printReport($report) - { - $reportClass = $this->reports[$report]['class']; - $reportFile = $this->reports[$report]['output']; - - if ($reportFile !== null) { - $filename = $reportFile; - $toScreen = false; - } else { - if (isset($this->tmpFiles[$report]) === true) { - $filename = $this->tmpFiles[$report]; - } else { - $filename = null; - } - - $toScreen = true; - } - - $reportCache = ''; - if ($filename !== null) { - $reportCache = file_get_contents($filename); - } - - ob_start(); - $reportClass->generate( - $reportCache, - $this->totalFiles, - $this->totalErrors, - $this->totalWarnings, - $this->totalFixable, - $this->config->showSources, - $this->config->reportWidth, - $this->config->interactive, - $toScreen - ); - $generatedReport = ob_get_contents(); - ob_end_clean(); - - if ($this->config->colors !== true || $reportFile !== null) { - $generatedReport = Common::stripColors($generatedReport); - } - - if ($reportFile !== null) { - if (PHP_CODESNIFFER_VERBOSITY > 0) { - echo $generatedReport; - } - - file_put_contents($reportFile, $generatedReport.PHP_EOL); - } else { - echo $generatedReport; - if ($filename !== null && file_exists($filename) === true) { - unlink($filename); - unset($this->tmpFiles[$report]); - } - } - - }//end printReport() - - - /** - * Caches the result of a single processed file for all reports. - * - * The report content that is generated is appended to the output file - * assigned to each report. This content may be an intermediate report format - * and not reflect the final report output. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file that has been processed. - * - * @return void - */ - public function cacheFileReport(File $phpcsFile) - { - if (isset($this->config->reports) === false) { - // This happens during unit testing, or any time someone just wants - // the error data and not the printed report. - return; - } - - $reportData = $this->prepareFileReport($phpcsFile); - $errorsShown = false; - - foreach ($this->reports as $type => $report) { - $reportClass = $report['class']; - - ob_start(); - $result = $reportClass->generateFileReport($reportData, $phpcsFile, $this->config->showSources, $this->config->reportWidth); - if ($result === true) { - $errorsShown = true; - } - - $generatedReport = ob_get_contents(); - ob_end_clean(); - - if ($report['output'] === null) { - // Using a temp file. - if (isset($this->tmpFiles[$type]) === false) { - // When running in interactive mode, the reporter prints the full - // report many times, which will unlink the temp file. So we need - // to create a new one if it doesn't exist. - $this->tmpFiles[$type] = tempnam(sys_get_temp_dir(), 'phpcs'); - file_put_contents($this->tmpFiles[$type], ''); - } - - file_put_contents($this->tmpFiles[$type], $generatedReport, (FILE_APPEND | LOCK_EX)); - } else { - file_put_contents($report['output'], $generatedReport, (FILE_APPEND | LOCK_EX)); - }//end if - }//end foreach - - if ($errorsShown === true || PHP_CODESNIFFER_CBF === true) { - $this->totalFiles++; - $this->totalErrors += $reportData['errors']; - $this->totalWarnings += $reportData['warnings']; - - // When PHPCBF is running, we need to use the fixable error values - // after the report has run and fixed what it can. - if (PHP_CODESNIFFER_CBF === true) { - $this->totalFixable += $phpcsFile->getFixableCount(); - $this->totalFixed += $phpcsFile->getFixedCount(); - } else { - $this->totalFixable += $reportData['fixable']; - } - } - - }//end cacheFileReport() - - - /** - * Generate summary information to be used during report generation. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file that has been processed. - * - * @return array Prepared report data. - * The format of prepared data is as follows: - * ``` - * array( - * 'filename' => string The name of the current file. - * 'errors' => int The number of errors seen in the current file. - * 'warnings' => int The number of warnings seen in the current file. - * 'fixable' => int The number of fixable issues seen in the current file. - * 'messages' => array( - * int => array( - * int => array( - * int => array( - * 'message' => string The error/warning message. - * 'source' => string The full error code for the message. - * 'severity' => int The severity of the message. - * 'fixable' => bool Whether this error/warning is auto-fixable. - * 'type' => string The type of message. Either 'ERROR' or 'WARNING'. - * ) - * ) - * ) - * ) - * ) - * ``` - */ - public function prepareFileReport(File $phpcsFile) - { - $report = [ - 'filename' => Common::stripBasepath($phpcsFile->getFilename(), $this->config->basepath), - 'errors' => $phpcsFile->getErrorCount(), - 'warnings' => $phpcsFile->getWarningCount(), - 'fixable' => $phpcsFile->getFixableCount(), - 'messages' => [], - ]; - - if ($report['errors'] === 0 && $report['warnings'] === 0) { - // Perfect score! - return $report; - } - - if ($this->config->recordErrors === false) { - $message = 'Errors are not being recorded but this report requires error messages. '; - $message .= 'This report will not show the correct information.'; - $report['messages'][1][1] = [ - [ - 'message' => $message, - 'source' => 'Internal.RecordErrors', - 'severity' => 5, - 'fixable' => false, - 'type' => 'ERROR', - ], - ]; - return $report; - } - - $errors = []; - - // Merge errors and warnings. - foreach ($phpcsFile->getErrors() as $line => $lineErrors) { - foreach ($lineErrors as $column => $colErrors) { - $newErrors = []; - foreach ($colErrors as $data) { - $newErrors[] = [ - 'message' => $data['message'], - 'source' => $data['source'], - 'severity' => $data['severity'], - 'fixable' => $data['fixable'], - 'type' => 'ERROR', - ]; - } - - $errors[$line][$column] = $newErrors; - } - - ksort($errors[$line]); - }//end foreach - - foreach ($phpcsFile->getWarnings() as $line => $lineWarnings) { - foreach ($lineWarnings as $column => $colWarnings) { - $newWarnings = []; - foreach ($colWarnings as $data) { - $newWarnings[] = [ - 'message' => $data['message'], - 'source' => $data['source'], - 'severity' => $data['severity'], - 'fixable' => $data['fixable'], - 'type' => 'WARNING', - ]; - } - - if (isset($errors[$line]) === false) { - $errors[$line] = []; - } - - if (isset($errors[$line][$column]) === true) { - $errors[$line][$column] = array_merge( - $newWarnings, - $errors[$line][$column] - ); - } else { - $errors[$line][$column] = $newWarnings; - } - }//end foreach - - ksort($errors[$line]); - }//end foreach - - ksort($errors); - $report['messages'] = $errors; - return $report; - - }//end prepareFileReport() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Reports/Cbf.php b/vendor/squizlabs/php_codesniffer/src/Reports/Cbf.php deleted file mode 100644 index d651608..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reports/Cbf.php +++ /dev/null @@ -1,259 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Reports; - -use PHP_CodeSniffer\Exceptions\DeepExitException; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Timing; - -class Cbf implements Report -{ - - - /** - * Generate a partial report for a single processed file. - * - * Function should return TRUE if it printed or stored data about the file - * and FALSE if it ignored the file. Returning TRUE indicates that the file and - * its data should be counted in the grand totals. - * - * @param array $report Prepared report data. - * See the {@see Report} interface for a detailed specification. - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being reported on. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * - * @return bool - * @throws \PHP_CodeSniffer\Exceptions\DeepExitException - */ - public function generateFileReport($report, File $phpcsFile, $showSources=false, $width=80) - { - $errors = $phpcsFile->getFixableCount(); - if ($errors !== 0) { - if (PHP_CODESNIFFER_VERBOSITY > 0) { - ob_end_clean(); - $startTime = microtime(true); - echo "\t=> Fixing file: $errors/$errors violations remaining"; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo PHP_EOL; - } - } - - $fixed = $phpcsFile->fixer->fixFile(); - } - - if ($phpcsFile->config->stdin === true) { - // Replacing STDIN, so output current file to STDOUT - // even if nothing was fixed. Exit here because we - // can't process any more than 1 file in this setup. - $fixedContent = $phpcsFile->fixer->getContents(); - throw new DeepExitException($fixedContent, 1); - } - - if ($errors === 0) { - return false; - } - - if (PHP_CODESNIFFER_VERBOSITY > 0) { - if ($fixed === false) { - echo 'ERROR'; - } else { - echo 'DONE'; - } - - $timeTaken = ((microtime(true) - $startTime) * 1000); - if ($timeTaken < 1000) { - $timeTaken = round($timeTaken); - echo " in {$timeTaken}ms".PHP_EOL; - } else { - $timeTaken = round(($timeTaken / 1000), 2); - echo " in $timeTaken secs".PHP_EOL; - } - } - - if ($fixed === true) { - // The filename in the report may be truncated due to a basepath setting - // but we are using it for writing here and not display, - // so find the correct path if basepath is in use. - $newFilename = $report['filename'].$phpcsFile->config->suffix; - if ($phpcsFile->config->basepath !== null) { - $newFilename = $phpcsFile->config->basepath.DIRECTORY_SEPARATOR.$newFilename; - } - - $newContent = $phpcsFile->fixer->getContents(); - file_put_contents($newFilename, $newContent); - - if (PHP_CODESNIFFER_VERBOSITY > 0) { - if ($newFilename === $report['filename']) { - echo "\t=> File was overwritten".PHP_EOL; - } else { - echo "\t=> Fixed file written to ".basename($newFilename).PHP_EOL; - } - } - } - - if (PHP_CODESNIFFER_VERBOSITY > 0) { - ob_start(); - } - - $errorCount = $phpcsFile->getErrorCount(); - $warningCount = $phpcsFile->getWarningCount(); - $fixableCount = $phpcsFile->getFixableCount(); - $fixedCount = ($errors - $fixableCount); - echo $report['filename'].">>$errorCount>>$warningCount>>$fixableCount>>$fixedCount".PHP_EOL; - - return $fixed; - - }//end generateFileReport() - - - /** - * Prints a summary of fixed files. - * - * @param string $cachedData Any partial report data that was returned from - * generateFileReport during the run. - * @param int $totalFiles Total number of files processed during the run. - * @param int $totalErrors Total number of errors found during the run. - * @param int $totalWarnings Total number of warnings found during the run. - * @param int $totalFixable Total number of problems that can be fixed. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * @param bool $interactive Are we running in interactive mode? - * @param bool $toScreen Is the report being printed to screen? - * - * @return void - */ - public function generate( - $cachedData, - $totalFiles, - $totalErrors, - $totalWarnings, - $totalFixable, - $showSources=false, - $width=80, - $interactive=false, - $toScreen=true - ) { - $lines = explode(PHP_EOL, $cachedData); - array_pop($lines); - - if (empty($lines) === true) { - if (($totalErrors + $totalWarnings) === 0) { - echo PHP_EOL.'No violations were found'.PHP_EOL; - } else { - echo PHP_EOL.'No fixable errors were found'.PHP_EOL; - } - - return; - } - - $reportFiles = []; - $maxLength = 0; - $totalFixed = 0; - $failures = 0; - - foreach ($lines as $line) { - $parts = explode('>>', $line); - $fileLen = strlen($parts[0]); - $reportFiles[$parts[0]] = [ - 'errors' => $parts[1], - 'warnings' => $parts[2], - 'fixable' => $parts[3], - 'fixed' => $parts[4], - 'strlen' => $fileLen, - ]; - - $maxLength = max($maxLength, $fileLen); - - $totalFixed += $parts[4]; - - if ($parts[3] > 0) { - $failures++; - } - } - - $width = min($width, ($maxLength + 21)); - $width = max($width, 70); - - echo PHP_EOL."\033[1m".'PHPCBF RESULT SUMMARY'."\033[0m".PHP_EOL; - echo str_repeat('-', $width).PHP_EOL; - echo "\033[1m".'FILE'.str_repeat(' ', ($width - 20)).'FIXED REMAINING'."\033[0m".PHP_EOL; - echo str_repeat('-', $width).PHP_EOL; - - foreach ($reportFiles as $file => $data) { - $padding = ($width - 18 - $data['strlen']); - if ($padding < 0) { - $file = '...'.substr($file, (($padding * -1) + 3)); - $padding = 0; - } - - echo $file.str_repeat(' ', $padding).' '; - - if ($data['fixable'] > 0) { - echo "\033[31mFAILED TO FIX\033[0m".PHP_EOL; - continue; - } - - $remaining = ($data['errors'] + $data['warnings']); - - if ($data['fixed'] !== 0) { - echo $data['fixed']; - echo str_repeat(' ', (7 - strlen((string) $data['fixed']))); - } else { - echo '0 '; - } - - if ($remaining !== 0) { - echo $remaining; - } else { - echo '0'; - } - - echo PHP_EOL; - }//end foreach - - echo str_repeat('-', $width).PHP_EOL; - echo "\033[1mA TOTAL OF $totalFixed ERROR"; - if ($totalFixed !== 1) { - echo 'S'; - } - - $numFiles = count($reportFiles); - echo ' WERE FIXED IN '.$numFiles.' FILE'; - if ($numFiles !== 1) { - echo 'S'; - } - - echo "\033[0m"; - - if ($failures > 0) { - echo PHP_EOL.str_repeat('-', $width).PHP_EOL; - echo "\033[1mPHPCBF FAILED TO FIX $failures FILE"; - if ($failures !== 1) { - echo 'S'; - } - - echo "\033[0m"; - } - - echo PHP_EOL.str_repeat('-', $width).PHP_EOL.PHP_EOL; - - if ($toScreen === true && $interactive === false) { - Timing::printRunTime(); - } - - }//end generate() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Reports/Checkstyle.php b/vendor/squizlabs/php_codesniffer/src/Reports/Checkstyle.php deleted file mode 100644 index c7e818b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reports/Checkstyle.php +++ /dev/null @@ -1,111 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Reports; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Files\File; -use XMLWriter; - -class Checkstyle implements Report -{ - - - /** - * Generate a partial report for a single processed file. - * - * Function should return TRUE if it printed or stored data about the file - * and FALSE if it ignored the file. Returning TRUE indicates that the file and - * its data should be counted in the grand totals. - * - * @param array $report Prepared report data. - * See the {@see Report} interface for a detailed specification. - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being reported on. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * - * @return bool - */ - public function generateFileReport($report, File $phpcsFile, $showSources=false, $width=80) - { - $out = new XMLWriter; - $out->openMemory(); - $out->setIndent(true); - - if ($report['errors'] === 0 && $report['warnings'] === 0) { - // Nothing to print. - return false; - } - - $out->startElement('file'); - $out->writeAttribute('name', $report['filename']); - - foreach ($report['messages'] as $line => $lineErrors) { - foreach ($lineErrors as $column => $colErrors) { - foreach ($colErrors as $error) { - $error['type'] = strtolower($error['type']); - if ($phpcsFile->config->encoding !== 'utf-8') { - $error['message'] = iconv($phpcsFile->config->encoding, 'utf-8', $error['message']); - } - - $out->startElement('error'); - $out->writeAttribute('line', $line); - $out->writeAttribute('column', $column); - $out->writeAttribute('severity', $error['type']); - $out->writeAttribute('message', $error['message']); - $out->writeAttribute('source', $error['source']); - $out->endElement(); - } - } - }//end foreach - - $out->endElement(); - echo $out->flush(); - - return true; - - }//end generateFileReport() - - - /** - * Prints all violations for processed files, in a Checkstyle format. - * - * @param string $cachedData Any partial report data that was returned from - * generateFileReport during the run. - * @param int $totalFiles Total number of files processed during the run. - * @param int $totalErrors Total number of errors found during the run. - * @param int $totalWarnings Total number of warnings found during the run. - * @param int $totalFixable Total number of problems that can be fixed. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * @param bool $interactive Are we running in interactive mode? - * @param bool $toScreen Is the report being printed to screen? - * - * @return void - */ - public function generate( - $cachedData, - $totalFiles, - $totalErrors, - $totalWarnings, - $totalFixable, - $showSources=false, - $width=80, - $interactive=false, - $toScreen=true - ) { - echo ''.PHP_EOL; - echo ''.PHP_EOL; - echo $cachedData; - echo ''.PHP_EOL; - - }//end generate() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Reports/Code.php b/vendor/squizlabs/php_codesniffer/src/Reports/Code.php deleted file mode 100644 index 2c0ee29..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reports/Code.php +++ /dev/null @@ -1,369 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Reports; - -use Exception; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Common; -use PHP_CodeSniffer\Util\Timing; - -class Code implements Report -{ - - - /** - * Generate a partial report for a single processed file. - * - * Function should return TRUE if it printed or stored data about the file - * and FALSE if it ignored the file. Returning TRUE indicates that the file and - * its data should be counted in the grand totals. - * - * @param array $report Prepared report data. - * See the {@see Report} interface for a detailed specification. - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being reported on. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * - * @return bool - */ - public function generateFileReport($report, File $phpcsFile, $showSources=false, $width=80) - { - if ($report['errors'] === 0 && $report['warnings'] === 0) { - // Nothing to print. - return false; - } - - // How many lines to show above and below the error line. - $surroundingLines = 2; - - $file = $report['filename']; - $tokens = $phpcsFile->getTokens(); - if (empty($tokens) === true) { - if (PHP_CODESNIFFER_VERBOSITY === 1) { - $startTime = microtime(true); - echo 'CODE report is parsing '.basename($file).' '; - } else if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "CODE report is forcing parse of $file".PHP_EOL; - } - - try { - $phpcsFile->parse(); - - // Make sure the fixer is aware of the reparsed file to prevent a race-condition - // with the Diff report also re-parsing the file. - $phpcsFile->fixer->startFile($phpcsFile); - } catch (Exception $e) { - // This is a second parse, so ignore exceptions. - // They would have been added to the file's error list already. - } - - if (PHP_CODESNIFFER_VERBOSITY === 1) { - $timeTaken = ((microtime(true) - $startTime) * 1000); - if ($timeTaken < 1000) { - $timeTaken = round($timeTaken); - echo "DONE in {$timeTaken}ms"; - } else { - $timeTaken = round(($timeTaken / 1000), 2); - echo "DONE in $timeTaken secs"; - } - - echo PHP_EOL; - } - - $tokens = $phpcsFile->getTokens(); - }//end if - - // Create an array that maps lines to the first token on the line. - $lineTokens = []; - $lastLine = 0; - $stackPtr = 0; - foreach ($tokens as $stackPtr => $token) { - if ($token['line'] !== $lastLine) { - if ($lastLine > 0) { - $lineTokens[$lastLine]['end'] = ($stackPtr - 1); - } - - $lastLine++; - $lineTokens[$lastLine] = [ - 'start' => $stackPtr, - 'end' => null, - ]; - } - } - - // Make sure the last token in the file sits on an imaginary - // last line so it is easier to generate code snippets at the - // end of the file. - $lineTokens[$lastLine]['end'] = $stackPtr; - - // Determine the longest code line we will be showing. - $maxSnippetLength = 0; - $eolLen = strlen($phpcsFile->eolChar); - foreach ($report['messages'] as $line => $lineErrors) { - $startLine = max(($line - $surroundingLines), 1); - $endLine = min(($line + $surroundingLines), $lastLine); - - $maxLineNumLength = strlen($endLine); - - for ($i = $startLine; $i <= $endLine; $i++) { - if ($i === 1) { - continue; - } - - $lineLength = ($tokens[($lineTokens[$i]['start'] - 1)]['column'] + $tokens[($lineTokens[$i]['start'] - 1)]['length'] - $eolLen); - $maxSnippetLength = max($lineLength, $maxSnippetLength); - } - } - - $maxSnippetLength += ($maxLineNumLength + 8); - - // Determine the longest error message we will be showing. - $maxErrorLength = 0; - foreach ($report['messages'] as $lineErrors) { - foreach ($lineErrors as $colErrors) { - foreach ($colErrors as $error) { - $length = strlen($error['message']); - if ($showSources === true) { - $length += (strlen($error['source']) + 3); - } - - $maxErrorLength = max($maxErrorLength, ($length + 1)); - } - } - } - - // The padding that all lines will require that are printing an error message overflow. - if ($report['warnings'] > 0) { - $typeLength = 7; - } else { - $typeLength = 5; - } - - $errorPadding = str_repeat(' ', ($maxLineNumLength + 7)); - $errorPadding .= str_repeat(' ', $typeLength); - $errorPadding .= ' '; - if ($report['fixable'] > 0) { - $errorPadding .= ' '; - } - - $errorPaddingLength = strlen($errorPadding); - - // The maximum amount of space an error message can use. - $maxErrorSpace = ($width - $errorPaddingLength); - if ($showSources === true) { - // Account for the chars used to print colors. - $maxErrorSpace += 8; - } - - // Figure out the max report width we need and can use. - $fileLength = strlen($file); - $maxWidth = max(($fileLength + 6), ($maxErrorLength + $errorPaddingLength)); - $width = max(min($width, $maxWidth), $maxSnippetLength); - if ($width < 70) { - $width = 70; - } - - // Print the file header. - echo PHP_EOL."\033[1mFILE: "; - if ($fileLength <= ($width - 6)) { - echo $file; - } else { - echo '...'.substr($file, ($fileLength - ($width - 6))); - } - - echo "\033[0m".PHP_EOL; - echo str_repeat('-', $width).PHP_EOL; - - echo "\033[1m".'FOUND '.$report['errors'].' ERROR'; - if ($report['errors'] !== 1) { - echo 'S'; - } - - if ($report['warnings'] > 0) { - echo ' AND '.$report['warnings'].' WARNING'; - if ($report['warnings'] !== 1) { - echo 'S'; - } - } - - echo ' AFFECTING '.count($report['messages']).' LINE'; - if (count($report['messages']) !== 1) { - echo 'S'; - } - - echo "\033[0m".PHP_EOL; - - foreach ($report['messages'] as $line => $lineErrors) { - $startLine = max(($line - $surroundingLines), 1); - $endLine = min(($line + $surroundingLines), $lastLine); - - $snippet = ''; - if (isset($lineTokens[$startLine]) === true) { - for ($i = $lineTokens[$startLine]['start']; $i <= $lineTokens[$endLine]['end']; $i++) { - $snippetLine = $tokens[$i]['line']; - if ($lineTokens[$snippetLine]['start'] === $i) { - // Starting a new line. - if ($snippetLine === $line) { - $snippet .= "\033[1m".'>> '; - } else { - $snippet .= ' '; - } - - $snippet .= str_repeat(' ', ($maxLineNumLength - strlen($snippetLine))); - $snippet .= $snippetLine.': '; - if ($snippetLine === $line) { - $snippet .= "\033[0m"; - } - } - - if (isset($tokens[$i]['orig_content']) === true) { - $tokenContent = $tokens[$i]['orig_content']; - } else { - $tokenContent = $tokens[$i]['content']; - } - - if (strpos($tokenContent, "\t") !== false) { - $token = $tokens[$i]; - $token['content'] = $tokenContent; - if (stripos(PHP_OS, 'WIN') === 0) { - $tab = "\000"; - } else { - $tab = "\033[30;1m»\033[0m"; - } - - $phpcsFile->tokenizer->replaceTabsInToken($token, $tab, "\000"); - $tokenContent = $token['content']; - } - - $tokenContent = Common::prepareForOutput($tokenContent, ["\r", "\n", "\t"]); - $tokenContent = str_replace("\000", ' ', $tokenContent); - - $underline = false; - if ($snippetLine === $line && isset($lineErrors[$tokens[$i]['column']]) === true) { - $underline = true; - } - - // Underline invisible characters as well. - if ($underline === true && trim($tokenContent) === '') { - $snippet .= "\033[4m".' '."\033[0m".$tokenContent; - } else { - if ($underline === true) { - $snippet .= "\033[4m"; - } - - $snippet .= $tokenContent; - - if ($underline === true) { - $snippet .= "\033[0m"; - } - } - }//end for - }//end if - - echo str_repeat('-', $width).PHP_EOL; - - foreach ($lineErrors as $colErrors) { - foreach ($colErrors as $error) { - $padding = ($maxLineNumLength - strlen($line)); - echo 'LINE '.str_repeat(' ', $padding).$line.': '; - - if ($error['type'] === 'ERROR') { - echo "\033[31mERROR\033[0m"; - if ($report['warnings'] > 0) { - echo ' '; - } - } else { - echo "\033[33mWARNING\033[0m"; - } - - echo ' '; - if ($report['fixable'] > 0) { - echo '['; - if ($error['fixable'] === true) { - echo 'x'; - } else { - echo ' '; - } - - echo '] '; - } - - $message = $error['message']; - $message = str_replace("\n", "\n".$errorPadding, $message); - if ($showSources === true) { - $message = "\033[1m".$message."\033[0m".' ('.$error['source'].')'; - } - - $errorMsg = wordwrap( - $message, - $maxErrorSpace, - PHP_EOL.$errorPadding - ); - - echo $errorMsg.PHP_EOL; - }//end foreach - }//end foreach - - echo str_repeat('-', $width).PHP_EOL; - echo rtrim($snippet).PHP_EOL; - }//end foreach - - echo str_repeat('-', $width).PHP_EOL; - if ($report['fixable'] > 0) { - echo "\033[1m".'PHPCBF CAN FIX THE '.$report['fixable'].' MARKED SNIFF VIOLATIONS AUTOMATICALLY'."\033[0m".PHP_EOL; - echo str_repeat('-', $width).PHP_EOL; - } - - return true; - - }//end generateFileReport() - - - /** - * Prints all errors and warnings for each file processed. - * - * @param string $cachedData Any partial report data that was returned from - * generateFileReport during the run. - * @param int $totalFiles Total number of files processed during the run. - * @param int $totalErrors Total number of errors found during the run. - * @param int $totalWarnings Total number of warnings found during the run. - * @param int $totalFixable Total number of problems that can be fixed. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * @param bool $interactive Are we running in interactive mode? - * @param bool $toScreen Is the report being printed to screen? - * - * @return void - */ - public function generate( - $cachedData, - $totalFiles, - $totalErrors, - $totalWarnings, - $totalFixable, - $showSources=false, - $width=80, - $interactive=false, - $toScreen=true - ) { - if ($cachedData === '') { - return; - } - - echo $cachedData; - - if ($toScreen === true && $interactive === false) { - Timing::printRunTime(); - } - - }//end generate() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Reports/Csv.php b/vendor/squizlabs/php_codesniffer/src/Reports/Csv.php deleted file mode 100644 index a7817a9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reports/Csv.php +++ /dev/null @@ -1,92 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Reports; - -use PHP_CodeSniffer\Files\File; - -class Csv implements Report -{ - - - /** - * Generate a partial report for a single processed file. - * - * Function should return TRUE if it printed or stored data about the file - * and FALSE if it ignored the file. Returning TRUE indicates that the file and - * its data should be counted in the grand totals. - * - * @param array $report Prepared report data. - * See the {@see Report} interface for a detailed specification. - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being reported on. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * - * @return bool - */ - public function generateFileReport($report, File $phpcsFile, $showSources=false, $width=80) - { - if ($report['errors'] === 0 && $report['warnings'] === 0) { - // Nothing to print. - return false; - } - - foreach ($report['messages'] as $line => $lineErrors) { - foreach ($lineErrors as $column => $colErrors) { - foreach ($colErrors as $error) { - $filename = str_replace('"', '\"', $report['filename']); - $message = str_replace('"', '\"', $error['message']); - $type = strtolower($error['type']); - $source = $error['source']; - $severity = $error['severity']; - $fixable = (int) $error['fixable']; - echo "\"$filename\",$line,$column,$type,\"$message\",$source,$severity,$fixable".PHP_EOL; - } - } - } - - return true; - - }//end generateFileReport() - - - /** - * Generates a csv report. - * - * @param string $cachedData Any partial report data that was returned from - * generateFileReport during the run. - * @param int $totalFiles Total number of files processed during the run. - * @param int $totalErrors Total number of errors found during the run. - * @param int $totalWarnings Total number of warnings found during the run. - * @param int $totalFixable Total number of problems that can be fixed. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * @param bool $interactive Are we running in interactive mode? - * @param bool $toScreen Is the report being printed to screen? - * - * @return void - */ - public function generate( - $cachedData, - $totalFiles, - $totalErrors, - $totalWarnings, - $totalFixable, - $showSources=false, - $width=80, - $interactive=false, - $toScreen=true - ) { - echo 'File,Line,Column,Type,Message,Source,Severity,Fixable'.PHP_EOL; - echo $cachedData; - - }//end generate() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Reports/Diff.php b/vendor/squizlabs/php_codesniffer/src/Reports/Diff.php deleted file mode 100644 index 1068689..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reports/Diff.php +++ /dev/null @@ -1,131 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Reports; - -use PHP_CodeSniffer\Files\File; - -class Diff implements Report -{ - - - /** - * Generate a partial report for a single processed file. - * - * Function should return TRUE if it printed or stored data about the file - * and FALSE if it ignored the file. Returning TRUE indicates that the file and - * its data should be counted in the grand totals. - * - * @param array $report Prepared report data. - * See the {@see Report} interface for a detailed specification. - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being reported on. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * - * @return bool - */ - public function generateFileReport($report, File $phpcsFile, $showSources=false, $width=80) - { - $errors = $phpcsFile->getFixableCount(); - if ($errors === 0) { - return false; - } - - $phpcsFile->disableCaching(); - $tokens = $phpcsFile->getTokens(); - if (empty($tokens) === true) { - if (PHP_CODESNIFFER_VERBOSITY === 1) { - $startTime = microtime(true); - echo 'DIFF report is parsing '.basename($report['filename']).' '; - } else if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo 'DIFF report is forcing parse of '.$report['filename'].PHP_EOL; - } - - $phpcsFile->parse(); - - if (PHP_CODESNIFFER_VERBOSITY === 1) { - $timeTaken = ((microtime(true) - $startTime) * 1000); - if ($timeTaken < 1000) { - $timeTaken = round($timeTaken); - echo "DONE in {$timeTaken}ms"; - } else { - $timeTaken = round(($timeTaken / 1000), 2); - echo "DONE in $timeTaken secs"; - } - - echo PHP_EOL; - } - - $phpcsFile->fixer->startFile($phpcsFile); - }//end if - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - ob_end_clean(); - echo "\t*** START FILE FIXING ***".PHP_EOL; - } - - $fixed = $phpcsFile->fixer->fixFile(); - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t*** END FILE FIXING ***".PHP_EOL; - ob_start(); - } - - if ($fixed === false) { - return false; - } - - $diff = $phpcsFile->fixer->generateDiff(); - if ($diff === '') { - // Nothing to print. - return false; - } - - echo $diff.PHP_EOL; - return true; - - }//end generateFileReport() - - - /** - * Prints all errors and warnings for each file processed. - * - * @param string $cachedData Any partial report data that was returned from - * generateFileReport during the run. - * @param int $totalFiles Total number of files processed during the run. - * @param int $totalErrors Total number of errors found during the run. - * @param int $totalWarnings Total number of warnings found during the run. - * @param int $totalFixable Total number of problems that can be fixed. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * @param bool $interactive Are we running in interactive mode? - * @param bool $toScreen Is the report being printed to screen? - * - * @return void - */ - public function generate( - $cachedData, - $totalFiles, - $totalErrors, - $totalWarnings, - $totalFixable, - $showSources=false, - $width=80, - $interactive=false, - $toScreen=true - ) { - echo $cachedData; - if ($toScreen === true && $cachedData !== '') { - echo PHP_EOL; - } - - }//end generate() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Reports/Emacs.php b/vendor/squizlabs/php_codesniffer/src/Reports/Emacs.php deleted file mode 100644 index 5d020e6..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reports/Emacs.php +++ /dev/null @@ -1,91 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Reports; - -use PHP_CodeSniffer\Files\File; - -class Emacs implements Report -{ - - - /** - * Generate a partial report for a single processed file. - * - * Function should return TRUE if it printed or stored data about the file - * and FALSE if it ignored the file. Returning TRUE indicates that the file and - * its data should be counted in the grand totals. - * - * @param array $report Prepared report data. - * See the {@see Report} interface for a detailed specification. - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being reported on. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * - * @return bool - */ - public function generateFileReport($report, File $phpcsFile, $showSources=false, $width=80) - { - if ($report['errors'] === 0 && $report['warnings'] === 0) { - // Nothing to print. - return false; - } - - foreach ($report['messages'] as $line => $lineErrors) { - foreach ($lineErrors as $column => $colErrors) { - foreach ($colErrors as $error) { - $message = $error['message']; - if ($showSources === true) { - $message .= ' ('.$error['source'].')'; - } - - $type = strtolower($error['type']); - echo $report['filename'].':'.$line.':'.$column.': '.$type.' - '.$message.PHP_EOL; - } - } - } - - return true; - - }//end generateFileReport() - - - /** - * Generates an emacs report. - * - * @param string $cachedData Any partial report data that was returned from - * generateFileReport during the run. - * @param int $totalFiles Total number of files processed during the run. - * @param int $totalErrors Total number of errors found during the run. - * @param int $totalWarnings Total number of warnings found during the run. - * @param int $totalFixable Total number of problems that can be fixed. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * @param bool $interactive Are we running in interactive mode? - * @param bool $toScreen Is the report being printed to screen? - * - * @return void - */ - public function generate( - $cachedData, - $totalFiles, - $totalErrors, - $totalWarnings, - $totalFixable, - $showSources=false, - $width=80, - $interactive=false, - $toScreen=true - ) { - echo $cachedData; - - }//end generate() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Reports/Full.php b/vendor/squizlabs/php_codesniffer/src/Reports/Full.php deleted file mode 100644 index f649208..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reports/Full.php +++ /dev/null @@ -1,260 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Reports; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Timing; - -class Full implements Report -{ - - - /** - * Generate a partial report for a single processed file. - * - * Function should return TRUE if it printed or stored data about the file - * and FALSE if it ignored the file. Returning TRUE indicates that the file and - * its data should be counted in the grand totals. - * - * @param array $report Prepared report data. - * See the {@see Report} interface for a detailed specification. - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being reported on. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * - * @return bool - */ - public function generateFileReport($report, File $phpcsFile, $showSources=false, $width=80) - { - if ($report['errors'] === 0 && $report['warnings'] === 0) { - // Nothing to print. - return false; - } - - // The length of the word ERROR or WARNING; used for padding. - if ($report['warnings'] > 0) { - $typeLength = 7; - } else { - $typeLength = 5; - } - - // Work out the max line number length for formatting. - $maxLineNumLength = max(array_map('strlen', array_keys($report['messages']))); - - // The padding that all lines will require that are - // printing an error message overflow. - $paddingLine2 = str_repeat(' ', ($maxLineNumLength + 1)); - $paddingLine2 .= ' | '; - $paddingLine2 .= str_repeat(' ', $typeLength); - $paddingLine2 .= ' | '; - if ($report['fixable'] > 0) { - $paddingLine2 .= ' '; - } - - $paddingLength = strlen($paddingLine2); - - // Make sure the report width isn't too big. - $maxErrorLength = 0; - foreach ($report['messages'] as $lineErrors) { - foreach ($lineErrors as $colErrors) { - foreach ($colErrors as $error) { - // Start with the presumption of a single line error message. - $length = strlen($error['message']); - $srcLength = (strlen($error['source']) + 3); - if ($showSources === true) { - $length += $srcLength; - } - - // ... but also handle multi-line messages correctly. - if (strpos($error['message'], "\n") !== false) { - $errorLines = explode("\n", $error['message']); - $length = max(array_map('strlen', $errorLines)); - - if ($showSources === true) { - $lastLine = array_pop($errorLines); - $length = max($length, (strlen($lastLine) + $srcLength)); - } - } - - $maxErrorLength = max($maxErrorLength, ($length + 1)); - }//end foreach - }//end foreach - }//end foreach - - $file = $report['filename']; - $fileLength = strlen($file); - $maxWidth = max(($fileLength + 6), ($maxErrorLength + $paddingLength)); - $width = min($width, $maxWidth); - if ($width < 70) { - $width = 70; - } - - echo PHP_EOL."\033[1mFILE: "; - if ($fileLength <= ($width - 6)) { - echo $file; - } else { - echo '...'.substr($file, ($fileLength - ($width - 6))); - } - - echo "\033[0m".PHP_EOL; - echo str_repeat('-', $width).PHP_EOL; - - echo "\033[1m".'FOUND '.$report['errors'].' ERROR'; - if ($report['errors'] !== 1) { - echo 'S'; - } - - if ($report['warnings'] > 0) { - echo ' AND '.$report['warnings'].' WARNING'; - if ($report['warnings'] !== 1) { - echo 'S'; - } - } - - echo ' AFFECTING '.count($report['messages']).' LINE'; - if (count($report['messages']) !== 1) { - echo 'S'; - } - - echo "\033[0m".PHP_EOL; - echo str_repeat('-', $width).PHP_EOL; - - // The maximum amount of space an error message can use. - $maxErrorSpace = ($width - $paddingLength - 1); - - $beforeMsg = ''; - $afterMsg = ''; - if ($showSources === true) { - $beforeMsg = "\033[1m"; - $afterMsg = "\033[0m"; - } - - $beforeAfterLength = strlen($beforeMsg.$afterMsg); - - foreach ($report['messages'] as $line => $lineErrors) { - foreach ($lineErrors as $colErrors) { - foreach ($colErrors as $error) { - $errorMsg = wordwrap( - $error['message'], - $maxErrorSpace - ); - - // Add the padding _after_ the wordwrap as the message itself may contain line breaks - // and those lines will also need to receive padding. - $errorMsg = str_replace("\n", $afterMsg.PHP_EOL.$paddingLine2.$beforeMsg, $errorMsg); - $errorMsg = $beforeMsg.$errorMsg.$afterMsg; - - if ($showSources === true) { - $lastMsg = $errorMsg; - $startPosLastLine = strrpos($errorMsg, PHP_EOL.$paddingLine2.$beforeMsg); - if ($startPosLastLine !== false) { - // Message is multiline. Grab the text of last line of the message, including the color codes. - $lastMsg = substr($errorMsg, ($startPosLastLine + strlen(PHP_EOL.$paddingLine2))); - } - - // When show sources is used, the message itself will be bolded, so we need to correct the length. - $sourceSuffix = '('.$error['source'].')'; - - $lastMsgPlusSourceLength = strlen($lastMsg); - // Add space + source suffix length. - $lastMsgPlusSourceLength += (1 + strlen($sourceSuffix)); - // Correct for the color codes. - $lastMsgPlusSourceLength -= $beforeAfterLength; - - if ($lastMsgPlusSourceLength > $maxErrorSpace) { - $errorMsg .= PHP_EOL.$paddingLine2.$sourceSuffix; - } else { - $errorMsg .= ' '.$sourceSuffix; - } - }//end if - - // The padding that goes on the front of the line. - $padding = ($maxLineNumLength - strlen($line)); - - echo ' '.str_repeat(' ', $padding).$line.' | '; - if ($error['type'] === 'ERROR') { - echo "\033[31mERROR\033[0m"; - if ($report['warnings'] > 0) { - echo ' '; - } - } else { - echo "\033[33mWARNING\033[0m"; - } - - echo ' | '; - if ($report['fixable'] > 0) { - echo '['; - if ($error['fixable'] === true) { - echo 'x'; - } else { - echo ' '; - } - - echo '] '; - } - - echo $errorMsg.PHP_EOL; - }//end foreach - }//end foreach - }//end foreach - - echo str_repeat('-', $width).PHP_EOL; - if ($report['fixable'] > 0) { - echo "\033[1m".'PHPCBF CAN FIX THE '.$report['fixable'].' MARKED SNIFF VIOLATIONS AUTOMATICALLY'."\033[0m".PHP_EOL; - echo str_repeat('-', $width).PHP_EOL; - } - - echo PHP_EOL; - return true; - - }//end generateFileReport() - - - /** - * Prints all errors and warnings for each file processed. - * - * @param string $cachedData Any partial report data that was returned from - * generateFileReport during the run. - * @param int $totalFiles Total number of files processed during the run. - * @param int $totalErrors Total number of errors found during the run. - * @param int $totalWarnings Total number of warnings found during the run. - * @param int $totalFixable Total number of problems that can be fixed. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * @param bool $interactive Are we running in interactive mode? - * @param bool $toScreen Is the report being printed to screen? - * - * @return void - */ - public function generate( - $cachedData, - $totalFiles, - $totalErrors, - $totalWarnings, - $totalFixable, - $showSources=false, - $width=80, - $interactive=false, - $toScreen=true - ) { - if ($cachedData === '') { - return; - } - - echo $cachedData; - - if ($toScreen === true && $interactive === false) { - Timing::printRunTime(); - } - - }//end generate() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Reports/Gitblame.php b/vendor/squizlabs/php_codesniffer/src/Reports/Gitblame.php deleted file mode 100644 index 501e8d7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reports/Gitblame.php +++ /dev/null @@ -1,91 +0,0 @@ - - * @author Greg Sherwood - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Reports; - -use PHP_CodeSniffer\Exceptions\DeepExitException; - -class Gitblame extends VersionControl -{ - - /** - * The name of the report we want in the output - * - * @var string - */ - protected $reportName = 'GIT'; - - - /** - * Extract the author from a blame line. - * - * @param string $line Line to parse. - * - * @return mixed string or false if impossible to recover. - */ - protected function getAuthor($line) - { - $blameParts = []; - $line = preg_replace('|\s+|', ' ', $line); - preg_match( - '|\(.+[0-9]{4}-[0-9]{2}-[0-9]{2}\s+[0-9]+\)|', - $line, - $blameParts - ); - - if (isset($blameParts[0]) === false) { - return false; - } - - $parts = explode(' ', $blameParts[0]); - - if (count($parts) < 2) { - return false; - } - - $parts = array_slice($parts, 0, (count($parts) - 2)); - $author = preg_replace('|\(|', '', implode(' ', $parts)); - return $author; - - }//end getAuthor() - - - /** - * Gets the blame output. - * - * @param string $filename File to blame. - * - * @return array - * @throws \PHP_CodeSniffer\Exceptions\DeepExitException - */ - protected function getBlameContent($filename) - { - $cwd = getcwd(); - - chdir(dirname($filename)); - $command = 'git blame --date=short "'.basename($filename).'" 2>&1'; - $handle = popen($command, 'r'); - if ($handle === false) { - $error = 'ERROR: Could not execute "'.$command.'"'.PHP_EOL.PHP_EOL; - throw new DeepExitException($error, 3); - } - - $rawContent = stream_get_contents($handle); - pclose($handle); - - $blames = explode("\n", $rawContent); - chdir($cwd); - - return $blames; - - }//end getBlameContent() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Reports/Hgblame.php b/vendor/squizlabs/php_codesniffer/src/Reports/Hgblame.php deleted file mode 100644 index a5b3d1a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reports/Hgblame.php +++ /dev/null @@ -1,110 +0,0 @@ - - * @author Greg Sherwood - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Reports; - -use PHP_CodeSniffer\Exceptions\DeepExitException; - -class Hgblame extends VersionControl -{ - - /** - * The name of the report we want in the output - * - * @var string - */ - protected $reportName = 'MERCURIAL'; - - - /** - * Extract the author from a blame line. - * - * @param string $line Line to parse. - * - * @return string|false String or FALSE if impossible to recover. - */ - protected function getAuthor($line) - { - $blameParts = []; - $line = preg_replace('|\s+|', ' ', $line); - - preg_match( - '|(.+[0-9]{2}:[0-9]{2}:[0-9]{2}\s[0-9]{4}\s.[0-9]{4}:)|', - $line, - $blameParts - ); - - if (isset($blameParts[0]) === false) { - return false; - } - - $parts = explode(' ', $blameParts[0]); - - if (count($parts) < 6) { - return false; - } - - $parts = array_slice($parts, 0, (count($parts) - 6)); - - return trim(preg_replace('|<.+>|', '', implode(' ', $parts))); - - }//end getAuthor() - - - /** - * Gets the blame output. - * - * @param string $filename File to blame. - * - * @return array - * @throws \PHP_CodeSniffer\Exceptions\DeepExitException - */ - protected function getBlameContent($filename) - { - $cwd = getcwd(); - - $fileParts = explode(DIRECTORY_SEPARATOR, $filename); - $found = false; - $location = ''; - while (empty($fileParts) === false) { - array_pop($fileParts); - $location = implode(DIRECTORY_SEPARATOR, $fileParts); - if (is_dir($location.DIRECTORY_SEPARATOR.'.hg') === true) { - $found = true; - break; - } - } - - if ($found === true) { - chdir($location); - } else { - $error = 'ERROR: Could not locate .hg directory '.PHP_EOL.PHP_EOL; - throw new DeepExitException($error, 3); - } - - $command = 'hg blame -u -d -v "'.$filename.'" 2>&1'; - $handle = popen($command, 'r'); - if ($handle === false) { - $error = 'ERROR: Could not execute "'.$command.'"'.PHP_EOL.PHP_EOL; - throw new DeepExitException($error, 3); - } - - $rawContent = stream_get_contents($handle); - pclose($handle); - - $blames = explode("\n", $rawContent); - chdir($cwd); - - return $blames; - - }//end getBlameContent() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Reports/Info.php b/vendor/squizlabs/php_codesniffer/src/Reports/Info.php deleted file mode 100644 index 3973001..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reports/Info.php +++ /dev/null @@ -1,173 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Reports; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Timing; - -class Info implements Report -{ - - - /** - * Generate a partial report for a single processed file. - * - * Function should return TRUE if it printed or stored data about the file - * and FALSE if it ignored the file. Returning TRUE indicates that the file and - * its data should be counted in the grand totals. - * - * @param array $report Prepared report data. - * See the {@see Report} interface for a detailed specification. - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being reported on. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * - * @return bool - */ - public function generateFileReport($report, File $phpcsFile, $showSources=false, $width=80) - { - $metrics = $phpcsFile->getMetrics(); - foreach ($metrics as $metric => $data) { - foreach ($data['values'] as $value => $count) { - echo "$metric>>$value>>$count".PHP_EOL; - } - } - - return true; - - }//end generateFileReport() - - - /** - * Prints the recorded metrics. - * - * @param string $cachedData Any partial report data that was returned from - * generateFileReport during the run. - * @param int $totalFiles Total number of files processed during the run. - * @param int $totalErrors Total number of errors found during the run. - * @param int $totalWarnings Total number of warnings found during the run. - * @param int $totalFixable Total number of problems that can be fixed. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * @param bool $interactive Are we running in interactive mode? - * @param bool $toScreen Is the report being printed to screen? - * - * @return void - */ - public function generate( - $cachedData, - $totalFiles, - $totalErrors, - $totalWarnings, - $totalFixable, - $showSources=false, - $width=80, - $interactive=false, - $toScreen=true - ) { - $lines = explode(PHP_EOL, $cachedData); - array_pop($lines); - - if (empty($lines) === true) { - return; - } - - $metrics = []; - foreach ($lines as $line) { - $parts = explode('>>', $line); - $metric = $parts[0]; - $value = $parts[1]; - $count = $parts[2]; - if (isset($metrics[$metric]) === false) { - $metrics[$metric] = []; - } - - if (isset($metrics[$metric][$value]) === false) { - $metrics[$metric][$value] = $count; - } else { - $metrics[$metric][$value] += $count; - } - } - - ksort($metrics); - - echo PHP_EOL."\033[1m".'PHP CODE SNIFFER INFORMATION REPORT'."\033[0m".PHP_EOL; - echo str_repeat('-', 70).PHP_EOL; - - foreach ($metrics as $metric => $values) { - if (count($values) === 1) { - $count = reset($values); - $value = key($values); - - echo "$metric: \033[4m$value\033[0m [$count/$count, 100%]".PHP_EOL; - } else { - $totalCount = 0; - $valueWidth = 0; - foreach ($values as $value => $count) { - $totalCount += $count; - $valueWidth = max($valueWidth, strlen($value)); - } - - // Length of the total string, plus however many - // thousands separators there are. - $countWidth = strlen($totalCount); - $thousandSeparatorCount = floor($countWidth / 3); - $countWidth += $thousandSeparatorCount; - - // Account for 'total' line. - $valueWidth = max(5, $valueWidth); - - echo "$metric:".PHP_EOL; - - ksort($values, SORT_NATURAL); - arsort($values); - - $percentPrefixWidth = 0; - $percentWidth = 6; - foreach ($values as $value => $count) { - $percent = round(($count / $totalCount * 100), 2); - $percentPrefix = ''; - if ($percent === 0.00) { - $percent = 0.01; - $percentPrefix = '<'; - $percentPrefixWidth = 2; - $percentWidth = 4; - } - - printf( - "\t%-{$valueWidth}s => %{$countWidth}s (%{$percentPrefixWidth}s%{$percentWidth}.2f%%)".PHP_EOL, - $value, - number_format($count), - $percentPrefix, - $percent - ); - } - - echo "\t".str_repeat('-', ($valueWidth + $countWidth + 15)).PHP_EOL; - printf( - "\t%-{$valueWidth}s => %{$countWidth}s (100.00%%)".PHP_EOL, - 'total', - number_format($totalCount) - ); - }//end if - - echo PHP_EOL; - }//end foreach - - echo str_repeat('-', 70).PHP_EOL; - - if ($toScreen === true && $interactive === false) { - Timing::printRunTime(); - } - - }//end generate() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Reports/Json.php b/vendor/squizlabs/php_codesniffer/src/Reports/Json.php deleted file mode 100644 index 91341c6..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reports/Json.php +++ /dev/null @@ -1,107 +0,0 @@ - - * @author Greg Sherwood - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Reports; - -use PHP_CodeSniffer\Files\File; - -class Json implements Report -{ - - - /** - * Generate a partial report for a single processed file. - * - * Function should return TRUE if it printed or stored data about the file - * and FALSE if it ignored the file. Returning TRUE indicates that the file and - * its data should be counted in the grand totals. - * - * @param array $report Prepared report data. - * See the {@see Report} interface for a detailed specification. - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being reported on. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * - * @return bool - */ - public function generateFileReport($report, File $phpcsFile, $showSources=false, $width=80) - { - $filename = str_replace('\\', '\\\\', $report['filename']); - $filename = str_replace('"', '\"', $filename); - $filename = str_replace('/', '\/', $filename); - echo '"'.$filename.'":{'; - echo '"errors":'.$report['errors'].',"warnings":'.$report['warnings'].',"messages":['; - - $messages = ''; - foreach ($report['messages'] as $line => $lineErrors) { - foreach ($lineErrors as $column => $colErrors) { - foreach ($colErrors as $error) { - $error['message'] = str_replace("\n", '\n', $error['message']); - $error['message'] = str_replace("\r", '\r', $error['message']); - $error['message'] = str_replace("\t", '\t', $error['message']); - - $fixable = false; - if ($error['fixable'] === true) { - $fixable = true; - } - - $messagesObject = (object) $error; - $messagesObject->line = $line; - $messagesObject->column = $column; - $messagesObject->fixable = $fixable; - - $messages .= json_encode($messagesObject).","; - } - } - }//end foreach - - echo rtrim($messages, ','); - echo ']},'; - - return true; - - }//end generateFileReport() - - - /** - * Generates a JSON report. - * - * @param string $cachedData Any partial report data that was returned from - * generateFileReport during the run. - * @param int $totalFiles Total number of files processed during the run. - * @param int $totalErrors Total number of errors found during the run. - * @param int $totalWarnings Total number of warnings found during the run. - * @param int $totalFixable Total number of problems that can be fixed. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * @param bool $interactive Are we running in interactive mode? - * @param bool $toScreen Is the report being printed to screen? - * - * @return void - */ - public function generate( - $cachedData, - $totalFiles, - $totalErrors, - $totalWarnings, - $totalFixable, - $showSources=false, - $width=80, - $interactive=false, - $toScreen=true - ) { - echo '{"totals":{"errors":'.$totalErrors.',"warnings":'.$totalWarnings.',"fixable":'.$totalFixable.'},"files":{'; - echo rtrim($cachedData, ','); - echo "}}".PHP_EOL; - - }//end generate() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Reports/Junit.php b/vendor/squizlabs/php_codesniffer/src/Reports/Junit.php deleted file mode 100644 index 24ccff5..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reports/Junit.php +++ /dev/null @@ -1,133 +0,0 @@ - - * @author Greg Sherwood - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Reports; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Files\File; -use XMLWriter; - -class Junit implements Report -{ - - - /** - * Generate a partial report for a single processed file. - * - * Function should return TRUE if it printed or stored data about the file - * and FALSE if it ignored the file. Returning TRUE indicates that the file and - * its data should be counted in the grand totals. - * - * @param array $report Prepared report data. - * See the {@see Report} interface for a detailed specification. - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being reported on. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * - * @return bool - */ - public function generateFileReport($report, File $phpcsFile, $showSources=false, $width=80) - { - $out = new XMLWriter; - $out->openMemory(); - $out->setIndent(true); - - $out->startElement('testsuite'); - $out->writeAttribute('name', $report['filename']); - $out->writeAttribute('errors', 0); - - if (count($report['messages']) === 0) { - $out->writeAttribute('tests', 1); - $out->writeAttribute('failures', 0); - - $out->startElement('testcase'); - $out->writeAttribute('name', $report['filename']); - $out->endElement(); - } else { - $failures = ($report['errors'] + $report['warnings']); - $out->writeAttribute('tests', $failures); - $out->writeAttribute('failures', $failures); - - foreach ($report['messages'] as $line => $lineErrors) { - foreach ($lineErrors as $column => $colErrors) { - foreach ($colErrors as $error) { - $out->startElement('testcase'); - $out->writeAttribute('name', $error['source'].' at '.$report['filename']." ($line:$column)"); - - $error['type'] = strtolower($error['type']); - if ($phpcsFile->config->encoding !== 'utf-8') { - $error['message'] = iconv($phpcsFile->config->encoding, 'utf-8', $error['message']); - } - - $out->startElement('failure'); - $out->writeAttribute('type', $error['type']); - $out->writeAttribute('message', $error['message']); - $out->endElement(); - - $out->endElement(); - } - } - } - }//end if - - $out->endElement(); - echo $out->flush(); - return true; - - }//end generateFileReport() - - - /** - * Prints all violations for processed files, in a proprietary XML format. - * - * @param string $cachedData Any partial report data that was returned from - * generateFileReport during the run. - * @param int $totalFiles Total number of files processed during the run. - * @param int $totalErrors Total number of errors found during the run. - * @param int $totalWarnings Total number of warnings found during the run. - * @param int $totalFixable Total number of problems that can be fixed. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * @param bool $interactive Are we running in interactive mode? - * @param bool $toScreen Is the report being printed to screen? - * - * @return void - */ - public function generate( - $cachedData, - $totalFiles, - $totalErrors, - $totalWarnings, - $totalFixable, - $showSources=false, - $width=80, - $interactive=false, - $toScreen=true - ) { - // Figure out the total number of tests. - $tests = 0; - $matches = []; - preg_match_all('/tests="([0-9]+)"/', $cachedData, $matches); - if (empty($matches[1]) === false) { - foreach ($matches[1] as $match) { - $tests += $match; - } - } - - $failures = ($totalErrors + $totalWarnings); - echo ''.PHP_EOL; - echo ''.PHP_EOL; - echo $cachedData; - echo ''.PHP_EOL; - - }//end generate() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Reports/Notifysend.php b/vendor/squizlabs/php_codesniffer/src/Reports/Notifysend.php deleted file mode 100644 index 051cf00..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reports/Notifysend.php +++ /dev/null @@ -1,243 +0,0 @@ - - * @author Greg Sherwood - * @copyright 2012-2014 Christian Weiske - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Reports; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Common; - -class Notifysend implements Report -{ - - /** - * Notification timeout in milliseconds. - * - * @var integer - */ - protected $timeout = 3000; - - /** - * Path to notify-send command. - * - * @var string - */ - protected $path = 'notify-send'; - - /** - * Show "ok, all fine" messages. - * - * @var boolean - */ - protected $showOk = true; - - /** - * Version of installed notify-send executable. - * - * @var string - */ - protected $version = null; - - - /** - * Load configuration data. - */ - public function __construct() - { - $path = Config::getExecutablePath('notifysend'); - if ($path !== null) { - $this->path = Common::escapeshellcmd($path); - } - - $timeout = Config::getConfigData('notifysend_timeout'); - if ($timeout !== null) { - $this->timeout = (int) $timeout; - } - - $showOk = Config::getConfigData('notifysend_showok'); - if ($showOk !== null) { - $this->showOk = (bool) $showOk; - } - - $this->version = str_replace( - 'notify-send ', - '', - exec($this->path.' --version') - ); - - }//end __construct() - - - /** - * Generate a partial report for a single processed file. - * - * Function should return TRUE if it printed or stored data about the file - * and FALSE if it ignored the file. Returning TRUE indicates that the file and - * its data should be counted in the grand totals. - * - * @param array $report Prepared report data. - * See the {@see Report} interface for a detailed specification. - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being reported on. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * - * @return bool - */ - public function generateFileReport($report, File $phpcsFile, $showSources=false, $width=80) - { - echo $report['filename'].PHP_EOL; - - // We want this file counted in the total number - // of checked files even if it has no errors. - return true; - - }//end generateFileReport() - - - /** - * Generates a summary of errors and warnings for each file processed. - * - * @param string $cachedData Any partial report data that was returned from - * generateFileReport during the run. - * @param int $totalFiles Total number of files processed during the run. - * @param int $totalErrors Total number of errors found during the run. - * @param int $totalWarnings Total number of warnings found during the run. - * @param int $totalFixable Total number of problems that can be fixed. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * @param bool $interactive Are we running in interactive mode? - * @param bool $toScreen Is the report being printed to screen? - * - * @return void - */ - public function generate( - $cachedData, - $totalFiles, - $totalErrors, - $totalWarnings, - $totalFixable, - $showSources=false, - $width=80, - $interactive=false, - $toScreen=true - ) { - $checkedFiles = explode(PHP_EOL, trim($cachedData)); - - $msg = $this->generateMessage($checkedFiles, $totalErrors, $totalWarnings); - if ($msg === null) { - if ($this->showOk === true) { - $this->notifyAllFine(); - } - } else { - $this->notifyErrors($msg); - } - - }//end generate() - - - /** - * Generate the error message to show to the user. - * - * @param string[] $checkedFiles The files checked during the run. - * @param int $totalErrors Total number of errors found during the run. - * @param int $totalWarnings Total number of warnings found during the run. - * - * @return string|null Error message or NULL if no error/warning found. - */ - protected function generateMessage($checkedFiles, $totalErrors, $totalWarnings) - { - if ($totalErrors === 0 && $totalWarnings === 0) { - // Nothing to print. - return null; - } - - $totalFiles = count($checkedFiles); - - $msg = ''; - if ($totalFiles > 1) { - $msg .= 'Checked '.$totalFiles.' files'.PHP_EOL; - } else { - $msg .= $checkedFiles[0].PHP_EOL; - } - - if ($totalWarnings > 0) { - $msg .= $totalWarnings.' warnings'.PHP_EOL; - } - - if ($totalErrors > 0) { - $msg .= $totalErrors.' errors'.PHP_EOL; - } - - return $msg; - - }//end generateMessage() - - - /** - * Tell the user that all is fine and no error/warning has been found. - * - * @return void - */ - protected function notifyAllFine() - { - $cmd = $this->getBasicCommand(); - $cmd .= ' -i info'; - $cmd .= ' "PHP CodeSniffer: Ok"'; - $cmd .= ' "All fine"'; - exec($cmd); - - }//end notifyAllFine() - - - /** - * Tell the user that errors/warnings have been found. - * - * @param string $msg Message to display. - * - * @return void - */ - protected function notifyErrors($msg) - { - $cmd = $this->getBasicCommand(); - $cmd .= ' -i error'; - $cmd .= ' "PHP CodeSniffer: Error"'; - $cmd .= ' '.escapeshellarg(trim($msg)); - exec($cmd); - - }//end notifyErrors() - - - /** - * Generate and return the basic notify-send command string to execute. - * - * @return string Shell command with common parameters. - */ - protected function getBasicCommand() - { - $cmd = $this->path; - $cmd .= ' --category dev.validate'; - $cmd .= ' -h int:transient:1'; - $cmd .= ' -t '.(int) $this->timeout; - if (version_compare($this->version, '0.7.3', '>=') === true) { - $cmd .= ' -a phpcs'; - } - - return $cmd; - - }//end getBasicCommand() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Reports/Performance.php b/vendor/squizlabs/php_codesniffer/src/Reports/Performance.php deleted file mode 100644 index 47324e5..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reports/Performance.php +++ /dev/null @@ -1,161 +0,0 @@ - - * @copyright 2023 Juliette Reinders Folmer. All rights reserved. - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Reports; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Common; -use PHP_CodeSniffer\Util\Timing; - -class Performance implements Report -{ - - - /** - * Generate a partial report for a single processed file. - * - * Function should return TRUE if it printed or stored data about the file - * and FALSE if it ignored the file. Returning TRUE indicates that the file and - * its data should be counted in the grand totals. - * - * @param array $report Prepared report data. - * See the {@see Report} interface for a detailed specification. - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being reported on. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * - * @return bool - */ - public function generateFileReport($report, File $phpcsFile, $showSources=false, $width=80) - { - $times = $phpcsFile->getListenerTimes(); - foreach ($times as $sniff => $time) { - echo "$sniff>>$time".PHP_EOL; - } - - return true; - - }//end generateFileReport() - - - /** - * Prints the sniff performance report. - * - * @param string $cachedData Any partial report data that was returned from - * generateFileReport during the run. - * @param int $totalFiles Total number of files processed during the run. - * @param int $totalErrors Total number of errors found during the run. - * @param int $totalWarnings Total number of warnings found during the run. - * @param int $totalFixable Total number of problems that can be fixed. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * @param bool $interactive Are we running in interactive mode? - * @param bool $toScreen Is the report being printed to screen? - * - * @return void - */ - public function generate( - $cachedData, - $totalFiles, - $totalErrors, - $totalWarnings, - $totalFixable, - $showSources=false, - $width=80, - $interactive=false, - $toScreen=true - ) { - $lines = explode(PHP_EOL, $cachedData); - array_pop($lines); - - if (empty($lines) === true) { - return; - } - - // First collect the accumulated timings. - $timings = []; - $totalSniffTime = 0; - foreach ($lines as $line) { - $parts = explode('>>', $line); - $sniffClass = $parts[0]; - $time = $parts[1]; - - if (isset($timings[$sniffClass]) === false) { - $timings[$sniffClass] = 0; - } - - $timings[$sniffClass] += $time; - $totalSniffTime += $time; - } - - // Next, tidy up the sniff names and determine max needed column width. - $totalTimes = []; - $maxNameWidth = 0; - foreach ($timings as $sniffClass => $secs) { - $sniffCode = Common::getSniffCode($sniffClass); - $maxNameWidth = max($maxNameWidth, strlen($sniffCode)); - $totalTimes[$sniffCode] = $secs; - } - - // Leading space + up to 12 chars for the number. - $maxTimeWidth = 13; - // Leading space, open parenthesis, up to 5 chars for the number, space + % and close parenthesis. - $maxPercWidth = 10; - // Calculate the maximum width available for the sniff name. - $maxNameWidth = min(($width - $maxTimeWidth - $maxPercWidth), max(($width - $maxTimeWidth - $maxPercWidth), $maxNameWidth)); - - arsort($totalTimes); - - echo PHP_EOL."\033[1m".'PHP CODE SNIFFER SNIFF PERFORMANCE REPORT'."\033[0m".PHP_EOL; - echo str_repeat('-', $width).PHP_EOL; - echo "\033[1m".'SNIFF'.str_repeat(' ', ($width - 31)).'TIME TAKEN (SECS) (%)'."\033[0m".PHP_EOL; - echo str_repeat('-', $width).PHP_EOL; - - // Mark sniffs which take more than twice as long as the average processing time per sniff - // in orange and when they take more than three times as long as the average, - // mark them in red. - $avgSniffTime = ($totalSniffTime / count($totalTimes)); - $doubleAvgSniffTime = (2 * $avgSniffTime); - $tripleAvgSniffTime = (3 * $avgSniffTime); - - $format = "%- {$maxNameWidth}.{$maxNameWidth}s % 12.6f (% 5.1f %%)".PHP_EOL; - $formatBold = "\033[1m%- {$maxNameWidth}.{$maxNameWidth}s % 12.6f (% 5.1f %%)\033[0m".PHP_EOL; - $formatWarning = "%- {$maxNameWidth}.{$maxNameWidth}s \033[33m% 12.6f (% 5.1f %%)\033[0m".PHP_EOL; - $formatError = "%- {$maxNameWidth}.{$maxNameWidth}s \033[31m% 12.6f (% 5.1f %%)\033[0m".PHP_EOL; - - foreach ($totalTimes as $sniff => $time) { - $percent = round((($time / $totalSniffTime) * 100), 1); - - if ($time > $tripleAvgSniffTime) { - printf($formatError, $sniff, $time, $percent); - } else if ($time > $doubleAvgSniffTime) { - printf($formatWarning, $sniff, $time, $percent); - } else { - printf($format, $sniff, $time, $percent); - } - } - - echo str_repeat('-', $width).PHP_EOL; - printf($formatBold, 'TOTAL SNIFF PROCESSING TIME', $totalSniffTime, 100); - - $runTime = (Timing::getDuration() / 1000); - $phpcsTime = ($runTime - $totalSniffTime); - - echo PHP_EOL.str_repeat('-', $width).PHP_EOL; - printf($format, 'Time taken by sniffs', $totalSniffTime, round((($totalSniffTime / $runTime) * 100), 1)); - printf($format, 'Time taken by PHPCS runner', $phpcsTime, round((($phpcsTime / $runTime) * 100), 1)); - - echo str_repeat('-', $width).PHP_EOL; - printf($formatBold, 'TOTAL RUN TIME', $runTime, 100); - echo str_repeat('-', $width).PHP_EOL; - - }//end generate() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Reports/Report.php b/vendor/squizlabs/php_codesniffer/src/Reports/Report.php deleted file mode 100644 index 56f6cef..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reports/Report.php +++ /dev/null @@ -1,87 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Reports; - -use PHP_CodeSniffer\Files\File; - -interface Report -{ - - - /** - * Generate a partial report for a single processed file. - * - * Function should return TRUE if it printed or stored data about the file - * and FALSE if it ignored the file. Returning TRUE indicates that the file and - * its data should be counted in the grand totals. - * - * The format of the `$report` parameter the function receives is as follows: - * ``` - * array( - * 'filename' => string The name of the current file. - * 'errors' => int The number of errors seen in the current file. - * 'warnings' => int The number of warnings seen in the current file. - * 'fixable' => int The number of fixable issues seen in the current file. - * 'messages' => array( - * int => array( - * int => array( - * int => array( - * 'message' => string The error/warning message. - * 'source' => string The full error code for the message. - * 'severity' => int The severity of the message. - * 'fixable' => bool Whether this error/warning is auto-fixable. - * 'type' => string The type of message. Either 'ERROR' or 'WARNING'. - * ) - * ) - * ) - * ) - * ) - * ``` - * - * @param array $report Prepared report data. - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being reported on. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * - * @return bool - */ - public function generateFileReport($report, File $phpcsFile, $showSources=false, $width=80); - - - /** - * Generate the actual report. - * - * @param string $cachedData Any partial report data that was returned from - * generateFileReport during the run. - * @param int $totalFiles Total number of files processed during the run. - * @param int $totalErrors Total number of errors found during the run. - * @param int $totalWarnings Total number of warnings found during the run. - * @param int $totalFixable Total number of problems that can be fixed. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * @param bool $interactive Are we running in interactive mode? - * @param bool $toScreen Is the report being printed to screen? - * - * @return void - */ - public function generate( - $cachedData, - $totalFiles, - $totalErrors, - $totalWarnings, - $totalFixable, - $showSources=false, - $width=80, - $interactive=false, - $toScreen=true - ); - - -}//end interface diff --git a/vendor/squizlabs/php_codesniffer/src/Reports/Source.php b/vendor/squizlabs/php_codesniffer/src/Reports/Source.php deleted file mode 100644 index c87709a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reports/Source.php +++ /dev/null @@ -1,337 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Reports; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Timing; - -class Source implements Report -{ - - - /** - * Generate a partial report for a single processed file. - * - * Function should return TRUE if it printed or stored data about the file - * and FALSE if it ignored the file. Returning TRUE indicates that the file and - * its data should be counted in the grand totals. - * - * @param array $report Prepared report data. - * See the {@see Report} interface for a detailed specification. - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being reported on. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * - * @return bool - */ - public function generateFileReport($report, File $phpcsFile, $showSources=false, $width=80) - { - if ($report['errors'] === 0 && $report['warnings'] === 0) { - // Nothing to print. - return false; - } - - $sources = []; - - foreach ($report['messages'] as $lineErrors) { - foreach ($lineErrors as $colErrors) { - foreach ($colErrors as $error) { - $src = $error['source']; - if (isset($sources[$src]) === false) { - $sources[$src] = [ - 'fixable' => (int) $error['fixable'], - 'count' => 1, - ]; - } else { - $sources[$src]['count']++; - } - } - } - } - - foreach ($sources as $source => $data) { - echo $source.'>>'.$data['fixable'].'>>'.$data['count'].PHP_EOL; - } - - return true; - - }//end generateFileReport() - - - /** - * Prints the source of all errors and warnings. - * - * @param string $cachedData Any partial report data that was returned from - * generateFileReport during the run. - * @param int $totalFiles Total number of files processed during the run. - * @param int $totalErrors Total number of errors found during the run. - * @param int $totalWarnings Total number of warnings found during the run. - * @param int $totalFixable Total number of problems that can be fixed. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * @param bool $interactive Are we running in interactive mode? - * @param bool $toScreen Is the report being printed to screen? - * - * @return void - */ - public function generate( - $cachedData, - $totalFiles, - $totalErrors, - $totalWarnings, - $totalFixable, - $showSources=false, - $width=80, - $interactive=false, - $toScreen=true - ) { - $lines = explode(PHP_EOL, $cachedData); - array_pop($lines); - - if (empty($lines) === true) { - return; - } - - $sources = []; - $maxLength = 0; - - foreach ($lines as $line) { - $parts = explode('>>', $line); - $source = $parts[0]; - $fixable = (bool) $parts[1]; - $count = $parts[2]; - - if (isset($sources[$source]) === false) { - if ($showSources === true) { - $parts = null; - $sniff = $source; - } else { - $parts = explode('.', $source); - if ($parts[0] === 'Internal') { - $parts[2] = $parts[1]; - $parts[1] = ''; - } - - $parts[1] = $this->makeFriendlyName($parts[1]); - - $sniff = $this->makeFriendlyName($parts[2]); - if (isset($parts[3]) === true) { - $name = $this->makeFriendlyName($parts[3]); - $name[0] = strtolower($name[0]); - $sniff .= ' '.$name; - unset($parts[3]); - } - - $parts[2] = $sniff; - }//end if - - $maxLength = max($maxLength, strlen($sniff)); - - $sources[$source] = [ - 'count' => $count, - 'fixable' => $fixable, - 'parts' => $parts, - ]; - } else { - $sources[$source]['count'] += $count; - }//end if - }//end foreach - - if ($showSources === true) { - $width = min($width, ($maxLength + 11)); - } else { - $width = min($width, ($maxLength + 41)); - } - - $width = max($width, 70); - - // Sort the data based on counts and source code. - $sourceCodes = array_keys($sources); - $counts = []; - foreach ($sources as $source => $data) { - $counts[$source] = $data['count']; - } - - array_multisort($counts, SORT_DESC, $sourceCodes, SORT_ASC, SORT_NATURAL, $sources); - - echo PHP_EOL."\033[1mPHP CODE SNIFFER VIOLATION SOURCE SUMMARY\033[0m".PHP_EOL; - echo str_repeat('-', $width).PHP_EOL."\033[1m"; - if ($showSources === true) { - if ($totalFixable > 0) { - echo ' SOURCE'.str_repeat(' ', ($width - 15)).'COUNT'.PHP_EOL; - } else { - echo 'SOURCE'.str_repeat(' ', ($width - 11)).'COUNT'.PHP_EOL; - } - } else { - if ($totalFixable > 0) { - echo ' STANDARD CATEGORY SNIFF'.str_repeat(' ', ($width - 44)).'COUNT'.PHP_EOL; - } else { - echo 'STANDARD CATEGORY SNIFF'.str_repeat(' ', ($width - 40)).'COUNT'.PHP_EOL; - } - } - - echo "\033[0m".str_repeat('-', $width).PHP_EOL; - - $fixableSources = 0; - - if ($showSources === true) { - $maxSniffWidth = ($width - 7); - } else { - $maxSniffWidth = ($width - 37); - } - - if ($totalFixable > 0) { - $maxSniffWidth -= 4; - } - - foreach ($sources as $source => $sourceData) { - if ($totalFixable > 0) { - echo '['; - if ($sourceData['fixable'] === true) { - echo 'x'; - $fixableSources++; - } else { - echo ' '; - } - - echo '] '; - } - - if ($showSources === true) { - if (strlen($source) > $maxSniffWidth) { - $source = substr($source, 0, $maxSniffWidth); - } - - echo $source; - if ($totalFixable > 0) { - echo str_repeat(' ', ($width - 9 - strlen($source))); - } else { - echo str_repeat(' ', ($width - 5 - strlen($source))); - } - } else { - $parts = $sourceData['parts']; - - if (strlen($parts[0]) > 8) { - $parts[0] = substr($parts[0], 0, ((strlen($parts[0]) - 8) * -1)); - } - - echo $parts[0].str_repeat(' ', (10 - strlen($parts[0]))); - - $category = $parts[1]; - if (strlen($category) > 18) { - $category = substr($category, 0, ((strlen($category) - 18) * -1)); - } - - echo $category.str_repeat(' ', (20 - strlen($category))); - - $sniff = $parts[2]; - if (strlen($sniff) > $maxSniffWidth) { - $sniff = substr($sniff, 0, $maxSniffWidth); - } - - if ($totalFixable > 0) { - echo $sniff.str_repeat(' ', ($width - 39 - strlen($sniff))); - } else { - echo $sniff.str_repeat(' ', ($width - 35 - strlen($sniff))); - } - }//end if - - echo $sourceData['count'].PHP_EOL; - }//end foreach - - echo str_repeat('-', $width).PHP_EOL; - echo "\033[1m".'A TOTAL OF '.($totalErrors + $totalWarnings).' SNIFF VIOLATION'; - if (($totalErrors + $totalWarnings) > 1) { - echo 'S'; - } - - echo ' WERE FOUND IN '.count($sources).' SOURCE'; - if (count($sources) !== 1) { - echo 'S'; - } - - echo "\033[0m"; - - if ($totalFixable > 0) { - echo PHP_EOL.str_repeat('-', $width).PHP_EOL; - echo "\033[1mPHPCBF CAN FIX THE $fixableSources MARKED SOURCES AUTOMATICALLY ($totalFixable VIOLATIONS IN TOTAL)\033[0m"; - } - - echo PHP_EOL.str_repeat('-', $width).PHP_EOL.PHP_EOL; - - if ($toScreen === true && $interactive === false) { - Timing::printRunTime(); - } - - }//end generate() - - - /** - * Converts a camel caps name into a readable string. - * - * @param string $name The camel caps name to convert. - * - * @return string - */ - public function makeFriendlyName($name) - { - if (trim($name) === '') { - return ''; - } - - $friendlyName = ''; - $length = strlen($name); - - $lastWasUpper = false; - $lastWasNumeric = false; - for ($i = 0; $i < $length; $i++) { - if (is_numeric($name[$i]) === true) { - if ($lastWasNumeric === false) { - $friendlyName .= ' '; - } - - $lastWasUpper = false; - $lastWasNumeric = true; - } else { - $lastWasNumeric = false; - - $char = strtolower($name[$i]); - if ($char === $name[$i]) { - // Lowercase. - $lastWasUpper = false; - } else { - // Uppercase. - if ($lastWasUpper === false) { - $friendlyName .= ' '; - if ($i < ($length - 1)) { - $next = $name[($i + 1)]; - if (strtolower($next) === $next) { - // Next char is lowercase so it is a word boundary. - $name[$i] = strtolower($name[$i]); - } - } - } - - $lastWasUpper = true; - } - }//end if - - $friendlyName .= $name[$i]; - }//end for - - $friendlyName = trim($friendlyName); - $friendlyName[0] = strtoupper($friendlyName[0]); - - return $friendlyName; - - }//end makeFriendlyName() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Reports/Summary.php b/vendor/squizlabs/php_codesniffer/src/Reports/Summary.php deleted file mode 100644 index 297905f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reports/Summary.php +++ /dev/null @@ -1,184 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Reports; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Timing; - -class Summary implements Report -{ - - - /** - * Generate a partial report for a single processed file. - * - * Function should return TRUE if it printed or stored data about the file - * and FALSE if it ignored the file. Returning TRUE indicates that the file and - * its data should be counted in the grand totals. - * - * @param array $report Prepared report data. - * See the {@see Report} interface for a detailed specification. - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being reported on. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * - * @return bool - */ - public function generateFileReport($report, File $phpcsFile, $showSources=false, $width=80) - { - if (PHP_CODESNIFFER_VERBOSITY === 0 - && $report['errors'] === 0 - && $report['warnings'] === 0 - ) { - // Nothing to print. - return false; - } - - echo $report['filename'].'>>'.$report['errors'].'>>'.$report['warnings'].PHP_EOL; - return true; - - }//end generateFileReport() - - - /** - * Generates a summary of errors and warnings for each file processed. - * - * @param string $cachedData Any partial report data that was returned from - * generateFileReport during the run. - * @param int $totalFiles Total number of files processed during the run. - * @param int $totalErrors Total number of errors found during the run. - * @param int $totalWarnings Total number of warnings found during the run. - * @param int $totalFixable Total number of problems that can be fixed. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * @param bool $interactive Are we running in interactive mode? - * @param bool $toScreen Is the report being printed to screen? - * - * @return void - */ - public function generate( - $cachedData, - $totalFiles, - $totalErrors, - $totalWarnings, - $totalFixable, - $showSources=false, - $width=80, - $interactive=false, - $toScreen=true - ) { - $lines = explode(PHP_EOL, $cachedData); - array_pop($lines); - - if (empty($lines) === true) { - return; - } - - $reportFiles = []; - $maxLength = 0; - - foreach ($lines as $line) { - $parts = explode('>>', $line); - $fileLen = strlen($parts[0]); - $reportFiles[$parts[0]] = [ - 'errors' => $parts[1], - 'warnings' => $parts[2], - 'strlen' => $fileLen, - ]; - - $maxLength = max($maxLength, $fileLen); - } - - uksort( - $reportFiles, - static function ($keyA, $keyB) { - $pathPartsA = explode(DIRECTORY_SEPARATOR, $keyA); - $pathPartsB = explode(DIRECTORY_SEPARATOR, $keyB); - - do { - $partA = array_shift($pathPartsA); - $partB = array_shift($pathPartsB); - } while ($partA === $partB && empty($pathPartsA) === false && empty($pathPartsB) === false); - - if (empty($pathPartsA) === false && empty($pathPartsB) === true) { - return 1; - } else if (empty($pathPartsA) === true && empty($pathPartsB) === false) { - return -1; - } else { - return strcasecmp($partA, $partB); - } - } - ); - - $width = min($width, ($maxLength + 21)); - $width = max($width, 70); - - echo PHP_EOL."\033[1m".'PHP CODE SNIFFER REPORT SUMMARY'."\033[0m".PHP_EOL; - echo str_repeat('-', $width).PHP_EOL; - echo "\033[1m".'FILE'.str_repeat(' ', ($width - 20)).'ERRORS WARNINGS'."\033[0m".PHP_EOL; - echo str_repeat('-', $width).PHP_EOL; - - foreach ($reportFiles as $file => $data) { - $padding = ($width - 18 - $data['strlen']); - if ($padding < 0) { - $file = '...'.substr($file, (($padding * -1) + 3)); - $padding = 0; - } - - echo $file.str_repeat(' ', $padding).' '; - if ($data['errors'] !== 0) { - echo "\033[31m".$data['errors']."\033[0m"; - echo str_repeat(' ', (8 - strlen((string) $data['errors']))); - } else { - echo '0 '; - } - - if ($data['warnings'] !== 0) { - echo "\033[33m".$data['warnings']."\033[0m"; - } else { - echo '0'; - } - - echo PHP_EOL; - }//end foreach - - echo str_repeat('-', $width).PHP_EOL; - echo "\033[1mA TOTAL OF $totalErrors ERROR"; - if ($totalErrors !== 1) { - echo 'S'; - } - - echo ' AND '.$totalWarnings.' WARNING'; - if ($totalWarnings !== 1) { - echo 'S'; - } - - echo ' WERE FOUND IN '.$totalFiles.' FILE'; - if ($totalFiles !== 1) { - echo 'S'; - } - - echo "\033[0m"; - - if ($totalFixable > 0) { - echo PHP_EOL.str_repeat('-', $width).PHP_EOL; - echo "\033[1mPHPCBF CAN FIX $totalFixable OF THESE SNIFF VIOLATIONS AUTOMATICALLY\033[0m"; - } - - echo PHP_EOL.str_repeat('-', $width).PHP_EOL.PHP_EOL; - - if ($toScreen === true && $interactive === false) { - Timing::printRunTime(); - } - - }//end generate() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Reports/Svnblame.php b/vendor/squizlabs/php_codesniffer/src/Reports/Svnblame.php deleted file mode 100644 index 553bc89..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reports/Svnblame.php +++ /dev/null @@ -1,73 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Reports; - -use PHP_CodeSniffer\Exceptions\DeepExitException; - -class Svnblame extends VersionControl -{ - - /** - * The name of the report we want in the output - * - * @var string - */ - protected $reportName = 'SVN'; - - - /** - * Extract the author from a blame line. - * - * @param string $line Line to parse. - * - * @return mixed string or false if impossible to recover. - */ - protected function getAuthor($line) - { - $blameParts = []; - preg_match('|\s*([^\s]+)\s+([^\s]+)|', $line, $blameParts); - - if (isset($blameParts[2]) === false) { - return false; - } - - return $blameParts[2]; - - }//end getAuthor() - - - /** - * Gets the blame output. - * - * @param string $filename File to blame. - * - * @return array - * @throws \PHP_CodeSniffer\Exceptions\DeepExitException - */ - protected function getBlameContent($filename) - { - $command = 'svn blame "'.$filename.'" 2>&1'; - $handle = popen($command, 'r'); - if ($handle === false) { - $error = 'ERROR: Could not execute "'.$command.'"'.PHP_EOL.PHP_EOL; - throw new DeepExitException($error, 3); - } - - $rawContent = stream_get_contents($handle); - pclose($handle); - - $blames = explode("\n", $rawContent); - - return $blames; - - }//end getBlameContent() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Reports/VersionControl.php b/vendor/squizlabs/php_codesniffer/src/Reports/VersionControl.php deleted file mode 100644 index 5c267e8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reports/VersionControl.php +++ /dev/null @@ -1,377 +0,0 @@ - - * @author Greg Sherwood - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Reports; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Timing; - -abstract class VersionControl implements Report -{ - - /** - * The name of the report we want in the output. - * - * @var string - */ - protected $reportName = 'VERSION CONTROL'; - - - /** - * Generate a partial report for a single processed file. - * - * Function should return TRUE if it printed or stored data about the file - * and FALSE if it ignored the file. Returning TRUE indicates that the file and - * its data should be counted in the grand totals. - * - * @param array $report Prepared report data. - * See the {@see Report} interface for a detailed specification. - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being reported on. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * - * @return bool - */ - public function generateFileReport($report, File $phpcsFile, $showSources=false, $width=80) - { - $blames = $this->getBlameContent($phpcsFile->getFilename()); - - $authorCache = []; - $praiseCache = []; - $sourceCache = []; - - foreach ($report['messages'] as $line => $lineErrors) { - $author = 'Unknown'; - if (isset($blames[($line - 1)]) === true) { - $blameAuthor = $this->getAuthor($blames[($line - 1)]); - if ($blameAuthor !== false) { - $author = $blameAuthor; - } - } - - if (isset($authorCache[$author]) === false) { - $authorCache[$author] = 0; - $praiseCache[$author] = [ - 'good' => 0, - 'bad' => 0, - ]; - } - - $praiseCache[$author]['bad']++; - - foreach ($lineErrors as $colErrors) { - foreach ($colErrors as $error) { - $authorCache[$author]++; - - if ($showSources === true) { - $source = $error['source']; - if (isset($sourceCache[$author][$source]) === false) { - $sourceCache[$author][$source] = [ - 'count' => 1, - 'fixable' => $error['fixable'], - ]; - } else { - $sourceCache[$author][$source]['count']++; - } - } - } - } - - unset($blames[($line - 1)]); - }//end foreach - - // Now go through and give the authors some credit for - // all the lines that do not have errors. - foreach ($blames as $line) { - $author = $this->getAuthor($line); - if ($author === false) { - $author = 'Unknown'; - } - - if (isset($authorCache[$author]) === false) { - // This author doesn't have any errors. - if (PHP_CODESNIFFER_VERBOSITY === 0) { - continue; - } - - $authorCache[$author] = 0; - $praiseCache[$author] = [ - 'good' => 0, - 'bad' => 0, - ]; - } - - $praiseCache[$author]['good']++; - }//end foreach - - foreach ($authorCache as $author => $errors) { - echo "AUTHOR>>$author>>$errors".PHP_EOL; - } - - foreach ($praiseCache as $author => $praise) { - echo "PRAISE>>$author>>".$praise['good'].'>>'.$praise['bad'].PHP_EOL; - } - - foreach ($sourceCache as $author => $sources) { - foreach ($sources as $source => $sourceData) { - $count = $sourceData['count']; - $fixable = (int) $sourceData['fixable']; - echo "SOURCE>>$author>>$source>>$count>>$fixable".PHP_EOL; - } - } - - return true; - - }//end generateFileReport() - - - /** - * Prints the author of all errors and warnings, as given by "version control blame". - * - * @param string $cachedData Any partial report data that was returned from - * generateFileReport during the run. - * @param int $totalFiles Total number of files processed during the run. - * @param int $totalErrors Total number of errors found during the run. - * @param int $totalWarnings Total number of warnings found during the run. - * @param int $totalFixable Total number of problems that can be fixed. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * @param bool $interactive Are we running in interactive mode? - * @param bool $toScreen Is the report being printed to screen? - * - * @return void - */ - public function generate( - $cachedData, - $totalFiles, - $totalErrors, - $totalWarnings, - $totalFixable, - $showSources=false, - $width=80, - $interactive=false, - $toScreen=true - ) { - $errorsShown = ($totalErrors + $totalWarnings); - if ($errorsShown === 0) { - // Nothing to show. - return; - } - - $lines = explode(PHP_EOL, $cachedData); - array_pop($lines); - - if (empty($lines) === true) { - return; - } - - $authorCache = []; - $praiseCache = []; - $sourceCache = []; - - foreach ($lines as $line) { - $parts = explode('>>', $line); - switch ($parts[0]) { - case 'AUTHOR': - if (isset($authorCache[$parts[1]]) === false) { - $authorCache[$parts[1]] = $parts[2]; - } else { - $authorCache[$parts[1]] += $parts[2]; - } - break; - case 'PRAISE': - if (isset($praiseCache[$parts[1]]) === false) { - $praiseCache[$parts[1]] = [ - 'good' => $parts[2], - 'bad' => $parts[3], - ]; - } else { - $praiseCache[$parts[1]]['good'] += $parts[2]; - $praiseCache[$parts[1]]['bad'] += $parts[3]; - } - break; - case 'SOURCE': - if (isset($praiseCache[$parts[1]]) === false) { - $praiseCache[$parts[1]] = []; - } - - if (isset($sourceCache[$parts[1]][$parts[2]]) === false) { - $sourceCache[$parts[1]][$parts[2]] = [ - 'count' => $parts[3], - 'fixable' => (bool) $parts[4], - ]; - } else { - $sourceCache[$parts[1]][$parts[2]]['count'] += $parts[3]; - } - break; - default: - break; - }//end switch - }//end foreach - - // Make sure the report width isn't too big. - $maxLength = 0; - foreach ($authorCache as $author => $count) { - $maxLength = max($maxLength, strlen($author)); - if ($showSources === true && isset($sourceCache[$author]) === true) { - foreach ($sourceCache[$author] as $source => $sourceData) { - if ($source === 'count') { - continue; - } - - $maxLength = max($maxLength, (strlen($source) + 9)); - } - } - } - - $width = min($width, ($maxLength + 30)); - $width = max($width, 70); - arsort($authorCache); - - echo PHP_EOL."\033[1m".'PHP CODE SNIFFER '.$this->reportName.' BLAME SUMMARY'."\033[0m".PHP_EOL; - echo str_repeat('-', $width).PHP_EOL."\033[1m"; - if ($showSources === true) { - echo 'AUTHOR SOURCE'.str_repeat(' ', ($width - 43)).'(Author %) (Overall %) COUNT'.PHP_EOL; - echo str_repeat('-', $width).PHP_EOL; - } else { - echo 'AUTHOR'.str_repeat(' ', ($width - 34)).'(Author %) (Overall %) COUNT'.PHP_EOL; - echo str_repeat('-', $width).PHP_EOL; - } - - echo "\033[0m"; - - if ($showSources === true) { - $maxSniffWidth = ($width - 15); - - if ($totalFixable > 0) { - $maxSniffWidth -= 4; - } - } - - $fixableSources = 0; - - foreach ($authorCache as $author => $count) { - if ($praiseCache[$author]['good'] === 0) { - $percent = 0; - } else { - $total = ($praiseCache[$author]['bad'] + $praiseCache[$author]['good']); - $percent = round(($praiseCache[$author]['bad'] / $total * 100), 2); - } - - $overallPercent = '('.round((($count / $errorsShown) * 100), 2).')'; - $authorPercent = '('.$percent.')'; - $line = str_repeat(' ', (6 - strlen($count))).$count; - $line = str_repeat(' ', (12 - strlen($overallPercent))).$overallPercent.$line; - $line = str_repeat(' ', (11 - strlen($authorPercent))).$authorPercent.$line; - $line = $author.str_repeat(' ', ($width - strlen($author) - strlen($line))).$line; - - if ($showSources === true) { - $line = "\033[1m$line\033[0m"; - } - - echo $line.PHP_EOL; - - if ($showSources === true && isset($sourceCache[$author]) === true) { - $errors = $sourceCache[$author]; - asort($errors); - $errors = array_reverse($errors); - - foreach ($errors as $source => $sourceData) { - if ($source === 'count') { - continue; - } - - $count = $sourceData['count']; - - $srcLength = strlen($source); - if ($srcLength > $maxSniffWidth) { - $source = substr($source, 0, $maxSniffWidth); - } - - $line = str_repeat(' ', (5 - strlen($count))).$count; - - echo ' '; - if ($totalFixable > 0) { - echo '['; - if ($sourceData['fixable'] === true) { - echo 'x'; - $fixableSources++; - } else { - echo ' '; - } - - echo '] '; - } - - echo $source; - if ($totalFixable > 0) { - echo str_repeat(' ', ($width - 18 - strlen($source))); - } else { - echo str_repeat(' ', ($width - 14 - strlen($source))); - } - - echo $line.PHP_EOL; - }//end foreach - }//end if - }//end foreach - - echo str_repeat('-', $width).PHP_EOL; - echo "\033[1m".'A TOTAL OF '.$errorsShown.' SNIFF VIOLATION'; - if ($errorsShown !== 1) { - echo 'S'; - } - - echo ' WERE COMMITTED BY '.count($authorCache).' AUTHOR'; - if (count($authorCache) !== 1) { - echo 'S'; - } - - echo "\033[0m"; - - if ($totalFixable > 0) { - if ($showSources === true) { - echo PHP_EOL.str_repeat('-', $width).PHP_EOL; - echo "\033[1mPHPCBF CAN FIX THE $fixableSources MARKED SOURCES AUTOMATICALLY ($totalFixable VIOLATIONS IN TOTAL)\033[0m"; - } else { - echo PHP_EOL.str_repeat('-', $width).PHP_EOL; - echo "\033[1mPHPCBF CAN FIX $totalFixable OF THESE SNIFF VIOLATIONS AUTOMATICALLY\033[0m"; - } - } - - echo PHP_EOL.str_repeat('-', $width).PHP_EOL.PHP_EOL; - - if ($toScreen === true && $interactive === false) { - Timing::printRunTime(); - } - - }//end generate() - - - /** - * Extract the author from a blame line. - * - * @param string $line Line to parse. - * - * @return mixed string or false if impossible to recover. - */ - abstract protected function getAuthor($line); - - - /** - * Gets the blame output. - * - * @param string $filename File to blame. - * - * @return array - */ - abstract protected function getBlameContent($filename); - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Reports/Xml.php b/vendor/squizlabs/php_codesniffer/src/Reports/Xml.php deleted file mode 100644 index 037d063..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Reports/Xml.php +++ /dev/null @@ -1,128 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Reports; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Files\File; -use XMLWriter; - -class Xml implements Report -{ - - - /** - * Generate a partial report for a single processed file. - * - * Function should return TRUE if it printed or stored data about the file - * and FALSE if it ignored the file. Returning TRUE indicates that the file and - * its data should be counted in the grand totals. - * - * @param array $report Prepared report data. - * See the {@see Report} interface for a detailed specification. - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being reported on. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * - * @return bool - */ - public function generateFileReport($report, File $phpcsFile, $showSources=false, $width=80) - { - $out = new XMLWriter; - $out->openMemory(); - $out->setIndent(true); - $out->setIndentString(' '); - $out->startDocument('1.0', 'UTF-8'); - - if ($report['errors'] === 0 && $report['warnings'] === 0) { - // Nothing to print. - return false; - } - - $out->startElement('file'); - $out->writeAttribute('name', $report['filename']); - $out->writeAttribute('errors', $report['errors']); - $out->writeAttribute('warnings', $report['warnings']); - $out->writeAttribute('fixable', $report['fixable']); - - foreach ($report['messages'] as $line => $lineErrors) { - foreach ($lineErrors as $column => $colErrors) { - foreach ($colErrors as $error) { - $error['type'] = strtolower($error['type']); - if ($phpcsFile->config->encoding !== 'utf-8') { - $error['message'] = iconv($phpcsFile->config->encoding, 'utf-8', $error['message']); - } - - $out->startElement($error['type']); - $out->writeAttribute('line', $line); - $out->writeAttribute('column', $column); - $out->writeAttribute('source', $error['source']); - $out->writeAttribute('severity', $error['severity']); - $out->writeAttribute('fixable', (int) $error['fixable']); - $out->text($error['message']); - $out->endElement(); - } - } - }//end foreach - - $out->endElement(); - - // Remove the start of the document because we will - // add that manually later. We only have it in here to - // properly set the encoding. - $content = $out->flush(); - if (strpos($content, PHP_EOL) !== false) { - $content = substr($content, (strpos($content, PHP_EOL) + strlen(PHP_EOL))); - } else if (strpos($content, "\n") !== false) { - $content = substr($content, (strpos($content, "\n") + 1)); - } - - echo $content; - - return true; - - }//end generateFileReport() - - - /** - * Prints all violations for processed files, in a proprietary XML format. - * - * @param string $cachedData Any partial report data that was returned from - * generateFileReport during the run. - * @param int $totalFiles Total number of files processed during the run. - * @param int $totalErrors Total number of errors found during the run. - * @param int $totalWarnings Total number of warnings found during the run. - * @param int $totalFixable Total number of problems that can be fixed. - * @param bool $showSources Show sources? - * @param int $width Maximum allowed line width. - * @param bool $interactive Are we running in interactive mode? - * @param bool $toScreen Is the report being printed to screen? - * - * @return void - */ - public function generate( - $cachedData, - $totalFiles, - $totalErrors, - $totalWarnings, - $totalFixable, - $showSources=false, - $width=80, - $interactive=false, - $toScreen=true - ) { - echo ''.PHP_EOL; - echo ''.PHP_EOL; - echo $cachedData; - echo ''.PHP_EOL; - - }//end generate() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Ruleset.php b/vendor/squizlabs/php_codesniffer/src/Ruleset.php deleted file mode 100644 index 2bd9f4e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Ruleset.php +++ /dev/null @@ -1,1747 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer; - -use PHP_CodeSniffer\Exceptions\RuntimeException; -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Util\Common; -use PHP_CodeSniffer\Util\MessageCollector; -use PHP_CodeSniffer\Util\Standards; -use RecursiveDirectoryIterator; -use RecursiveIteratorIterator; -use ReflectionClass; -use stdClass; - -class Ruleset -{ - - /** - * The name of the coding standard being used. - * - * If a top-level standard includes other standards, or sniffs - * from other standards, only the name of the top-level standard - * will be stored in here. - * - * If multiple top-level standards are being loaded into - * a single ruleset object, this will store a comma separated list - * of the top-level standard names. - * - * @var string - */ - public $name = ''; - - /** - * A list of file paths for the ruleset files being used. - * - * @var string[] - */ - public $paths = []; - - /** - * A list of regular expressions used to ignore specific sniffs for files and folders. - * - * Is also used to set global exclude patterns. - * The key is the regular expression and the value is the type - * of ignore pattern (absolute or relative). - * - * @var array - */ - public $ignorePatterns = []; - - /** - * A list of regular expressions used to include specific sniffs for files and folders. - * - * The key is the sniff code and the value is an array with - * the key being a regular expression and the value is the type - * of ignore pattern (absolute or relative). - * - * @var array> - */ - public $includePatterns = []; - - /** - * An array of sniff objects that are being used to check files. - * - * The key is the fully qualified name of the sniff class - * and the value is the sniff object. - * - * @var array - */ - public $sniffs = []; - - /** - * A mapping of sniff codes to fully qualified class names. - * - * The key is the sniff code and the value - * is the fully qualified name of the sniff class. - * - * @var array - */ - public $sniffCodes = []; - - /** - * An array of token types and the sniffs that are listening for them. - * - * The key is the token name being listened for and the value - * is the sniff object. - * - * @var array>> - */ - public $tokenListeners = []; - - /** - * An array of rules from the ruleset.xml file. - * - * It may be empty, indicating that the ruleset does not override - * any of the default sniff settings. - * - * @var array - */ - public $ruleset = []; - - /** - * The directories that the processed rulesets are in. - * - * @var string[] - */ - protected $rulesetDirs = []; - - /** - * The config data for the run. - * - * @var \PHP_CodeSniffer\Config - */ - private $config = null; - - /** - * An array of the names of sniffs which have been marked as deprecated. - * - * The key is the sniff code and the value - * is the fully qualified name of the sniff class. - * - * @var array - */ - private $deprecatedSniffs = []; - - /** - * Message collector object. - * - * User-facing messages should be collected via this object for display once the ruleset processing has finished. - * - * The following type of errors should *NOT* be collected, but should still throw their own `RuntimeException`: - * - Errors which could cause other (uncollectable) errors further into the ruleset processing, like a missing autoload file. - * - Errors which are directly aimed at and only intended for sniff developers or integrators - * (in contrast to ruleset maintainers or end-users). - * - * @var \PHP_CodeSniffer\Util\MessageCollector - */ - private $msgCache; - - - /** - * Initialise the ruleset that the run will use. - * - * @param \PHP_CodeSniffer\Config $config The config data for the run. - * - * @return void - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If blocking errors were encountered when processing the ruleset. - */ - public function __construct(Config $config) - { - $this->config = $config; - $restrictions = $config->sniffs; - $exclusions = $config->exclude; - $sniffs = []; - $this->msgCache = new MessageCollector(); - - $standardPaths = []; - foreach ($config->standards as $standard) { - $installed = Standards::getInstalledStandardPath($standard); - if ($installed === null) { - $standard = Common::realpath($standard); - if (is_dir($standard) === true - && is_file(Common::realpath($standard.DIRECTORY_SEPARATOR.'ruleset.xml')) === true - ) { - $standard = Common::realpath($standard.DIRECTORY_SEPARATOR.'ruleset.xml'); - } - } else { - $standard = $installed; - } - - $standardPaths[] = $standard; - } - - foreach ($standardPaths as $standard) { - $ruleset = @simplexml_load_string(file_get_contents($standard)); - if ($ruleset !== false) { - $standardName = (string) $ruleset['name']; - if ($this->name !== '') { - $this->name .= ', '; - } - - $this->name .= $standardName; - - // Allow autoloading of custom files inside this standard. - if (isset($ruleset['namespace']) === true) { - $namespace = (string) $ruleset['namespace']; - } else { - $namespace = basename(dirname($standard)); - } - - Autoload::addSearchPath(dirname($standard), $namespace); - } - - if (defined('PHP_CODESNIFFER_IN_TESTS') === true && empty($restrictions) === false) { - // In unit tests, only register the sniffs that the test wants and not the entire standard. - foreach ($restrictions as $restriction) { - $sniffs = array_merge($sniffs, $this->expandRulesetReference($restriction, dirname($standard))); - } - - if (empty($sniffs) === true) { - // Sniff reference could not be expanded, which probably means this - // is an installed standard. Let the unit test system take care of - // setting the correct sniff for testing. - return; - } - - break; - } - - if (PHP_CODESNIFFER_VERBOSITY === 1) { - echo "Registering sniffs in the $standardName standard... "; - if (count($config->standards) > 1 || PHP_CODESNIFFER_VERBOSITY > 2) { - echo PHP_EOL; - } - } - - $sniffs = array_merge($sniffs, $this->processRuleset($standard)); - }//end foreach - - // Ignore sniff restrictions if caching is on. - if ($config->cache === true) { - $restrictions = []; - $exclusions = []; - } - - $sniffRestrictions = []; - foreach ($restrictions as $sniffCode) { - $parts = explode('.', strtolower($sniffCode)); - $sniffName = $parts[0].'\sniffs\\'.$parts[1].'\\'.$parts[2].'sniff'; - $sniffRestrictions[$sniffName] = true; - } - - $sniffExclusions = []; - foreach ($exclusions as $sniffCode) { - $parts = explode('.', strtolower($sniffCode)); - $sniffName = $parts[0].'\sniffs\\'.$parts[1].'\\'.$parts[2].'sniff'; - $sniffExclusions[$sniffName] = true; - } - - $this->registerSniffs($sniffs, $sniffRestrictions, $sniffExclusions); - $this->populateTokenListeners(); - - $numSniffs = count($this->sniffs); - if (PHP_CODESNIFFER_VERBOSITY === 1) { - echo "DONE ($numSniffs sniffs registered)".PHP_EOL; - } - - if ($numSniffs === 0) { - $this->msgCache->add('No sniffs were registered.', MessageCollector::ERROR); - } - - $this->displayCachedMessages(); - - }//end __construct() - - - /** - * Prints a report showing the sniffs contained in a standard. - * - * @return void - */ - public function explain() - { - $sniffs = array_keys($this->sniffCodes); - sort($sniffs, (SORT_NATURAL | SORT_FLAG_CASE)); - - $sniffCount = count($sniffs); - - // Add a dummy entry to the end so we loop one last time - // and echo out the collected info about the last standard. - $sniffs[] = ''; - - $summaryLine = PHP_EOL."The $this->name standard contains 1 sniff".PHP_EOL; - if ($sniffCount !== 1) { - $summaryLine = str_replace('1 sniff', "$sniffCount sniffs", $summaryLine); - } - - echo $summaryLine; - - $lastStandard = null; - $lastCount = 0; - $sniffsInStandard = []; - - foreach ($sniffs as $i => $sniff) { - if ($i === $sniffCount) { - $currentStandard = null; - } else { - $currentStandard = substr($sniff, 0, strpos($sniff, '.')); - if ($lastStandard === null) { - $lastStandard = $currentStandard; - } - } - - // Reached the first item in the next standard. - // Echo out the info collected from the previous standard. - if ($currentStandard !== $lastStandard) { - $subTitle = $lastStandard.' ('.$lastCount.' sniff'; - if ($lastCount > 1) { - $subTitle .= 's'; - } - - $subTitle .= ')'; - - echo PHP_EOL.$subTitle.PHP_EOL; - echo str_repeat('-', strlen($subTitle)).PHP_EOL; - echo ' '.implode(PHP_EOL.' ', $sniffsInStandard).PHP_EOL; - - $lastStandard = $currentStandard; - $lastCount = 0; - $sniffsInStandard = []; - - if ($currentStandard === null) { - break; - } - }//end if - - if (isset($this->deprecatedSniffs[$sniff]) === true) { - $sniff .= ' *'; - } - - $sniffsInStandard[] = $sniff; - ++$lastCount; - }//end foreach - - if (count($this->deprecatedSniffs) > 0) { - echo PHP_EOL.'* Sniffs marked with an asterisk are deprecated.'.PHP_EOL; - } - - }//end explain() - - - /** - * Checks whether any deprecated sniffs were registered via the ruleset. - * - * @return bool - */ - public function hasSniffDeprecations() - { - return (count($this->deprecatedSniffs) > 0); - - }//end hasSniffDeprecations() - - - /** - * Prints an information block about deprecated sniffs being used. - * - * @return void - * - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException When the interface implementation is faulty. - */ - public function showSniffDeprecations() - { - if ($this->hasSniffDeprecations() === false) { - return; - } - - // Don't show deprecation notices in quiet mode, in explain mode - // or when the documentation is being shown. - // Documentation and explain will mark a sniff as deprecated natively - // and also call the Ruleset multiple times which would lead to duplicate - // display of the deprecation messages. - if ($this->config->quiet === true - || $this->config->explain === true - || $this->config->generator !== null - ) { - return; - } - - $reportWidth = $this->config->reportWidth; - // Message takes report width minus the leading dash + two spaces, minus a one space gutter at the end. - $maxMessageWidth = ($reportWidth - 4); - $maxActualWidth = 0; - - ksort($this->deprecatedSniffs, (SORT_NATURAL | SORT_FLAG_CASE)); - - $messages = []; - $messageTemplate = 'This sniff has been deprecated since %s and will be removed in %s. %s'; - $errorTemplate = 'ERROR: The %s::%s() method must return a %sstring, received %s'; - - foreach ($this->deprecatedSniffs as $sniffCode => $className) { - if (isset($this->sniffs[$className]) === false) { - // Should only be possible in test situations, but some extra defensive coding is never a bad thing. - continue; - } - - // Verify the interface was implemented correctly. - // Unfortunately can't be safeguarded via type declarations yet. - $deprecatedSince = $this->sniffs[$className]->getDeprecationVersion(); - if (is_string($deprecatedSince) === false) { - throw new RuntimeException( - sprintf($errorTemplate, $className, 'getDeprecationVersion', 'non-empty ', gettype($deprecatedSince)) - ); - } - - if ($deprecatedSince === '') { - throw new RuntimeException( - sprintf($errorTemplate, $className, 'getDeprecationVersion', 'non-empty ', '""') - ); - } - - $removedIn = $this->sniffs[$className]->getRemovalVersion(); - if (is_string($removedIn) === false) { - throw new RuntimeException( - sprintf($errorTemplate, $className, 'getRemovalVersion', 'non-empty ', gettype($removedIn)) - ); - } - - if ($removedIn === '') { - throw new RuntimeException( - sprintf($errorTemplate, $className, 'getRemovalVersion', 'non-empty ', '""') - ); - } - - $customMessage = $this->sniffs[$className]->getDeprecationMessage(); - if (is_string($customMessage) === false) { - throw new RuntimeException( - sprintf($errorTemplate, $className, 'getDeprecationMessage', '', gettype($customMessage)) - ); - } - - // Truncate the error code if there is not enough report width. - if (strlen($sniffCode) > $maxMessageWidth) { - $sniffCode = substr($sniffCode, 0, ($maxMessageWidth - 3)).'...'; - } - - $message = '- '."\033[36m".$sniffCode."\033[0m".PHP_EOL; - $maxActualWidth = max($maxActualWidth, strlen($sniffCode)); - - // Normalize new line characters in custom message. - $customMessage = preg_replace('`\R`', PHP_EOL, $customMessage); - - $notice = trim(sprintf($messageTemplate, $deprecatedSince, $removedIn, $customMessage)); - $maxActualWidth = max($maxActualWidth, min(strlen($notice), $maxMessageWidth)); - $wrapped = wordwrap($notice, $maxMessageWidth, PHP_EOL); - $message .= ' '.implode(PHP_EOL.' ', explode(PHP_EOL, $wrapped)); - - $messages[] = $message; - }//end foreach - - if (count($messages) === 0) { - return; - } - - $summaryLine = "WARNING: The $this->name standard uses 1 deprecated sniff"; - $sniffCount = count($messages); - if ($sniffCount !== 1) { - $summaryLine = str_replace('1 deprecated sniff', "$sniffCount deprecated sniffs", $summaryLine); - } - - $maxActualWidth = max($maxActualWidth, min(strlen($summaryLine), $maxMessageWidth)); - - $summaryLine = wordwrap($summaryLine, $reportWidth, PHP_EOL); - if ($this->config->colors === true) { - echo "\033[33m".$summaryLine."\033[0m".PHP_EOL; - } else { - echo $summaryLine.PHP_EOL; - } - - $messages = implode(PHP_EOL, $messages); - if ($this->config->colors === false) { - $messages = Common::stripColors($messages); - } - - echo str_repeat('-', min(($maxActualWidth + 4), $reportWidth)).PHP_EOL; - echo $messages; - - $closer = wordwrap('Deprecated sniffs are still run, but will stop working at some point in the future.', $reportWidth, PHP_EOL); - echo PHP_EOL.PHP_EOL.$closer.PHP_EOL.PHP_EOL; - - }//end showSniffDeprecations() - - - /** - * Print any notices encountered while processing the ruleset(s). - * - * Note: these messages aren't shown at the time they are encountered to avoid "one error hiding behind another". - * This way the (end-)user gets to see all of them in one go. - * - * @return void - * - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If blocking errors were encountered. - */ - private function displayCachedMessages() - { - // Don't show deprecations/notices/warnings in quiet mode, in explain mode - // or when the documentation is being shown. - // Documentation and explain will call the Ruleset multiple times which - // would lead to duplicate display of the messages. - if ($this->msgCache->containsBlockingErrors() === false - && ($this->config->quiet === true - || $this->config->explain === true - || $this->config->generator !== null) - ) { - return; - } - - $this->msgCache->display(); - - }//end displayCachedMessages() - - - /** - * Processes a single ruleset and returns a list of the sniffs it represents. - * - * Rules founds within the ruleset are processed immediately, but sniff classes - * are not registered by this method. - * - * @param string $rulesetPath The path to a ruleset XML file. - * @param int $depth How many nested processing steps we are in. This - * is only used for debug output. - * - * @return string[] - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException - If the ruleset path is invalid. - * - If a specified autoload file could not be found. - */ - public function processRuleset($rulesetPath, $depth=0) - { - $rulesetPath = Common::realpath($rulesetPath); - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo 'Processing ruleset '.Common::stripBasepath($rulesetPath, $this->config->basepath).PHP_EOL; - } - - libxml_use_internal_errors(true); - $ruleset = simplexml_load_string(file_get_contents($rulesetPath)); - if ($ruleset === false) { - $errorMsg = "ERROR: Ruleset $rulesetPath is not valid".PHP_EOL; - $errors = libxml_get_errors(); - foreach ($errors as $error) { - $errorMsg .= '- On line '.$error->line.', column '.$error->column.': '.$error->message; - } - - libxml_clear_errors(); - throw new RuntimeException($errorMsg); - } - - libxml_use_internal_errors(false); - - $ownSniffs = []; - $includedSniffs = []; - $excludedSniffs = []; - - $this->paths[] = $rulesetPath; - $rulesetDir = dirname($rulesetPath); - $this->rulesetDirs[] = $rulesetDir; - - $sniffDir = $rulesetDir.DIRECTORY_SEPARATOR.'Sniffs'; - if (is_dir($sniffDir) === true) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\tAdding sniff files from ".Common::stripBasepath($sniffDir, $this->config->basepath).' directory'.PHP_EOL; - } - - $ownSniffs = $this->expandSniffDirectory($sniffDir, $depth); - } - - // Include custom autoloaders. - foreach ($ruleset->{'autoload'} as $autoload) { - if ($this->shouldProcessElement($autoload) === false) { - continue; - } - - $autoloadPath = (string) $autoload; - - // Try relative autoload paths first. - $relativePath = Common::realpath(dirname($rulesetPath).DIRECTORY_SEPARATOR.$autoloadPath); - - if ($relativePath !== false && is_file($relativePath) === true) { - $autoloadPath = $relativePath; - } else if (is_file($autoloadPath) === false) { - throw new RuntimeException('ERROR: The specified autoload file "'.$autoload.'" does not exist'); - } - - include_once $autoloadPath; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t=> included autoloader $autoloadPath".PHP_EOL; - } - }//end foreach - - // Process custom sniff config settings. - foreach ($ruleset->{'config'} as $config) { - if ($this->shouldProcessElement($config) === false) { - continue; - } - - Config::setConfigData((string) $config['name'], (string) $config['value'], true); - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t=> set config value ".(string) $config['name'].': '.(string) $config['value'].PHP_EOL; - } - } - - foreach ($ruleset->rule as $rule) { - if (isset($rule['ref']) === false - || $this->shouldProcessElement($rule) === false - ) { - continue; - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\tProcessing rule \"".$rule['ref'].'"'.PHP_EOL; - } - - $expandedSniffs = $this->expandRulesetReference((string) $rule['ref'], $rulesetDir, $depth); - $newSniffs = array_diff($expandedSniffs, $includedSniffs); - $includedSniffs = array_merge($includedSniffs, $expandedSniffs); - - $parts = explode('.', $rule['ref']); - if (count($parts) === 4 - && $parts[0] !== '' - && $parts[1] !== '' - && $parts[2] !== '' - ) { - $sniffCode = $parts[0].'.'.$parts[1].'.'.$parts[2]; - if (isset($this->ruleset[$sniffCode]['severity']) === true - && $this->ruleset[$sniffCode]['severity'] === 0 - ) { - // This sniff code has already been turned off, but now - // it is being explicitly included again, so turn it back on. - $this->ruleset[(string) $rule['ref']]['severity'] = 5; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\t* disabling sniff exclusion for specific message code *".PHP_EOL; - echo str_repeat("\t", $depth); - echo "\t\t=> severity set to 5".PHP_EOL; - } - } else if (empty($newSniffs) === false) { - $newSniff = $newSniffs[0]; - if (in_array($newSniff, $ownSniffs, true) === false) { - // Including a sniff that hasn't been included higher up, but - // only including a single message from it. So turn off all messages in - // the sniff, except this one. - $this->ruleset[$sniffCode]['severity'] = 0; - $this->ruleset[(string) $rule['ref']]['severity'] = 5; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\tExcluding sniff \"".$sniffCode.'" except for "'.$parts[3].'"'.PHP_EOL; - } - } - }//end if - }//end if - - if (isset($rule->exclude) === true) { - foreach ($rule->exclude as $exclude) { - if (isset($exclude['name']) === false) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\t* ignoring empty exclude rule *".PHP_EOL; - echo "\t\t\t=> ".$exclude->asXML().PHP_EOL; - } - - continue; - } - - if ($this->shouldProcessElement($exclude) === false) { - continue; - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\tExcluding rule \"".$exclude['name'].'"'.PHP_EOL; - } - - // Check if a single code is being excluded, which is a shortcut - // for setting the severity of the message to 0. - $parts = explode('.', $exclude['name']); - if (count($parts) === 4) { - $this->ruleset[(string) $exclude['name']]['severity'] = 0; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\t=> severity set to 0".PHP_EOL; - } - } else { - $excludedSniffs = array_merge( - $excludedSniffs, - $this->expandRulesetReference((string) $exclude['name'], $rulesetDir, ($depth + 1)) - ); - } - }//end foreach - }//end if - - $this->processRule($rule, $newSniffs, $depth); - }//end foreach - - // Process custom command line arguments. - $cliArgs = []; - foreach ($ruleset->{'arg'} as $arg) { - if ($this->shouldProcessElement($arg) === false) { - continue; - } - - if (isset($arg['name']) === true) { - $argString = '--'.(string) $arg['name']; - if (isset($arg['value']) === true) { - $argString .= '='.(string) $arg['value']; - } - } else { - $argString = '-'.(string) $arg['value']; - } - - $cliArgs[] = $argString; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t=> set command line value $argString".PHP_EOL; - } - }//end foreach - - // Set custom php ini values as CLI args. - foreach ($ruleset->{'ini'} as $arg) { - if ($this->shouldProcessElement($arg) === false) { - continue; - } - - if (isset($arg['name']) === false) { - continue; - } - - $name = (string) $arg['name']; - $argString = $name; - if (isset($arg['value']) === true) { - $value = (string) $arg['value']; - $argString .= "=$value"; - } else { - $value = 'true'; - } - - $cliArgs[] = '-d'; - $cliArgs[] = $argString; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t=> set PHP ini value $name to $value".PHP_EOL; - } - }//end foreach - - if (empty($this->config->files) === true) { - // Process hard-coded file paths. - foreach ($ruleset->{'file'} as $file) { - $file = (string) $file; - $cliArgs[] = $file; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t=> added \"$file\" to the file list".PHP_EOL; - } - } - } - - if (empty($cliArgs) === false) { - // Change the directory so all relative paths are worked - // out based on the location of the ruleset instead of - // the location of the user. - $inPhar = Common::isPharFile($rulesetDir); - if ($inPhar === false) { - $currentDir = getcwd(); - chdir($rulesetDir); - } - - $this->config->setCommandLineValues($cliArgs); - - if ($inPhar === false) { - chdir($currentDir); - } - } - - // Process custom ignore pattern rules. - foreach ($ruleset->{'exclude-pattern'} as $pattern) { - if ($this->shouldProcessElement($pattern) === false) { - continue; - } - - if (isset($pattern['type']) === false) { - $pattern['type'] = 'absolute'; - } - - $this->ignorePatterns[(string) $pattern] = (string) $pattern['type']; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t=> added global ".(string) $pattern['type'].' ignore pattern: '.(string) $pattern.PHP_EOL; - } - } - - $includedSniffs = array_unique(array_merge($ownSniffs, $includedSniffs)); - $excludedSniffs = array_unique($excludedSniffs); - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $included = count($includedSniffs); - $excluded = count($excludedSniffs); - echo str_repeat("\t", $depth); - echo "=> Ruleset processing complete; included $included sniffs and excluded $excluded".PHP_EOL; - } - - // Merge our own sniff list with our externally included - // sniff list, but filter out any excluded sniffs. - $files = []; - foreach ($includedSniffs as $sniff) { - if (in_array($sniff, $excludedSniffs, true) === true) { - continue; - } else { - $files[] = Common::realpath($sniff); - } - } - - return $files; - - }//end processRuleset() - - - /** - * Expands a directory into a list of sniff files within. - * - * @param string $directory The path to a directory. - * @param int $depth How many nested processing steps we are in. This - * is only used for debug output. - * - * @return array - */ - private function expandSniffDirectory($directory, $depth=0) - { - $sniffs = []; - - $rdi = new RecursiveDirectoryIterator($directory, RecursiveDirectoryIterator::FOLLOW_SYMLINKS); - $di = new RecursiveIteratorIterator($rdi, 0, RecursiveIteratorIterator::CATCH_GET_CHILD); - - $dirLen = strlen($directory); - - foreach ($di as $file) { - $filename = $file->getFilename(); - - // Skip hidden files. - if (substr($filename, 0, 1) === '.') { - continue; - } - - // We are only interested in PHP and sniff files. - $fileParts = explode('.', $filename); - if (array_pop($fileParts) !== 'php') { - continue; - } - - $basename = basename($filename, '.php'); - if (substr($basename, -5) !== 'Sniff') { - continue; - } - - $path = $file->getPathname(); - - // Skip files in hidden directories within the Sniffs directory of this - // standard. We use the offset with strpos() to allow hidden directories - // before, valid example: - // /home/foo/.composer/vendor/squiz/custom_tool/MyStandard/Sniffs/... - if (strpos($path, DIRECTORY_SEPARATOR.'.', $dirLen) !== false) { - continue; - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\t=> ".Common::stripBasepath($path, $this->config->basepath).PHP_EOL; - } - - $sniffs[] = $path; - }//end foreach - - return $sniffs; - - }//end expandSniffDirectory() - - - /** - * Expands a ruleset reference into a list of sniff files. - * - * @param string $ref The reference from the ruleset XML file. - * @param string $rulesetDir The directory of the ruleset XML file, used to - * evaluate relative paths. - * @param int $depth How many nested processing steps we are in. This - * is only used for debug output. - * - * @return array - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If the reference is invalid. - */ - private function expandRulesetReference($ref, $rulesetDir, $depth=0) - { - // Naming an (external) standard "Internal" is deprecated. - if (strtolower($ref) === 'internal') { - $message = 'The name "Internal" is reserved for internal use. A PHP_CodeSniffer standard should not be called "Internal".'.PHP_EOL; - $message .= 'Contact the maintainer of the standard to fix this.'; - $this->msgCache->add($message, MessageCollector::DEPRECATED); - } - - // Ignore internal sniffs codes as they are used to only - // hide and change internal messages. - if (substr($ref, 0, 9) === 'Internal.') { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\t* ignoring internal sniff code *".PHP_EOL; - } - - return []; - } - - // As sniffs can't begin with a full stop, assume references in - // this format are relative paths and attempt to convert them - // to absolute paths. If this fails, let the reference run through - // the normal checks and have it fail as normal. - if (substr($ref, 0, 1) === '.') { - $realpath = Common::realpath($rulesetDir.'/'.$ref); - if ($realpath !== false) { - $ref = $realpath; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\t=> ".Common::stripBasepath($ref, $this->config->basepath).PHP_EOL; - } - } - } - - // As sniffs can't begin with a tilde, assume references in - // this format are relative to the user's home directory. - if (substr($ref, 0, 2) === '~/') { - $realpath = Common::realpath($ref); - if ($realpath !== false) { - $ref = $realpath; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\t=> ".Common::stripBasepath($ref, $this->config->basepath).PHP_EOL; - } - } - } - - if (is_file($ref) === true) { - if (substr($ref, -9) === 'Sniff.php') { - // A single external sniff. - $this->rulesetDirs[] = dirname(dirname(dirname($ref))); - return [$ref]; - } - } else { - // See if this is a whole standard being referenced. - $path = Standards::getInstalledStandardPath($ref); - if ($path !== null && Common::isPharFile($path) === true && strpos($path, 'ruleset.xml') === false) { - // If the ruleset exists inside the phar file, use it. - if (file_exists($path.DIRECTORY_SEPARATOR.'ruleset.xml') === true) { - $path .= DIRECTORY_SEPARATOR.'ruleset.xml'; - } else { - $path = null; - } - } - - if ($path !== null) { - $ref = $path; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\t=> ".Common::stripBasepath($ref, $this->config->basepath).PHP_EOL; - } - } else if (is_dir($ref) === false) { - // Work out the sniff path. - $sepPos = strpos($ref, DIRECTORY_SEPARATOR); - if ($sepPos !== false) { - $stdName = substr($ref, 0, $sepPos); - $path = substr($ref, $sepPos); - } else { - $parts = explode('.', $ref); - $stdName = $parts[0]; - if (count($parts) === 1) { - // A whole standard? - $path = ''; - } else if (count($parts) === 2) { - // A directory of sniffs? - $path = DIRECTORY_SEPARATOR.'Sniffs'.DIRECTORY_SEPARATOR.$parts[1]; - } else { - // A single sniff? - $path = DIRECTORY_SEPARATOR.'Sniffs'.DIRECTORY_SEPARATOR.$parts[1].DIRECTORY_SEPARATOR.$parts[2].'Sniff.php'; - } - } - - $newRef = false; - $stdPath = Standards::getInstalledStandardPath($stdName); - if ($stdPath !== null && $path !== '') { - if (Common::isPharFile($stdPath) === true - && strpos($stdPath, 'ruleset.xml') === false - ) { - // Phar files can only return the directory, - // since ruleset can be omitted if building one standard. - $newRef = Common::realpath($stdPath.$path); - } else { - $newRef = Common::realpath(dirname($stdPath).$path); - } - } - - if ($newRef === false) { - // The sniff is not locally installed, so check if it is being - // referenced as a remote sniff outside the install. We do this - // by looking through all directories where we have found ruleset - // files before, looking for ones for this particular standard, - // and seeing if it is in there. - foreach ($this->rulesetDirs as $dir) { - if (strtolower(basename($dir)) !== strtolower($stdName)) { - continue; - } - - $newRef = Common::realpath($dir.$path); - - if ($newRef !== false) { - $ref = $newRef; - } - } - } else { - $ref = $newRef; - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\t=> ".Common::stripBasepath($ref, $this->config->basepath).PHP_EOL; - } - }//end if - }//end if - - if (is_dir($ref) === true) { - if (is_file($ref.DIRECTORY_SEPARATOR.'ruleset.xml') === true) { - // We are referencing an external coding standard. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\t* rule is referencing a standard using directory name; processing *".PHP_EOL; - } - - return $this->processRuleset($ref.DIRECTORY_SEPARATOR.'ruleset.xml', ($depth + 2)); - } else { - // We are referencing a whole directory of sniffs. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\t* rule is referencing a directory of sniffs *".PHP_EOL; - echo str_repeat("\t", $depth); - echo "\t\tAdding sniff files from directory".PHP_EOL; - } - - return $this->expandSniffDirectory($ref, ($depth + 1)); - } - } else { - if (is_file($ref) === false) { - $this->msgCache->add("Referenced sniff \"$ref\" does not exist.", MessageCollector::ERROR); - return []; - } - - if (substr($ref, -9) === 'Sniff.php') { - // A single sniff. - return [$ref]; - } else { - // Assume an external ruleset.xml file. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\t* rule is referencing a standard using ruleset path; processing *".PHP_EOL; - } - - return $this->processRuleset($ref, ($depth + 2)); - } - }//end if - - }//end expandRulesetReference() - - - /** - * Processes a rule from a ruleset XML file, overriding built-in defaults. - * - * @param \SimpleXMLElement $rule The rule object from a ruleset XML file. - * @param string[] $newSniffs An array of sniffs that got included by this rule. - * @param int $depth How many nested processing steps we are in. - * This is only used for debug output. - * - * @return void - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If rule settings are invalid. - */ - private function processRule($rule, $newSniffs, $depth=0) - { - $ref = (string) $rule['ref']; - $todo = [$ref]; - - $parts = explode('.', $ref); - $partsCount = count($parts); - if ($partsCount <= 2 - || $partsCount > count(array_filter($parts)) - || in_array($ref, $newSniffs) === true - ) { - // We are processing a standard, a category of sniffs or a relative path inclusion. - foreach ($newSniffs as $sniffFile) { - $parts = explode(DIRECTORY_SEPARATOR, $sniffFile); - if (count($parts) === 1 && DIRECTORY_SEPARATOR === '\\') { - // Path using forward slashes while running on Windows. - $parts = explode('/', $sniffFile); - } - - $sniffName = array_pop($parts); - $sniffCategory = array_pop($parts); - array_pop($parts); - $sniffStandard = array_pop($parts); - $todo[] = $sniffStandard.'.'.$sniffCategory.'.'.substr($sniffName, 0, -9); - } - } - - foreach ($todo as $code) { - // Custom severity. - if (isset($rule->severity) === true - && $this->shouldProcessElement($rule->severity) === true - ) { - if (isset($this->ruleset[$code]) === false) { - $this->ruleset[$code] = []; - } - - $this->ruleset[$code]['severity'] = (int) $rule->severity; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\t=> severity set to ".(int) $rule->severity; - if ($code !== $ref) { - echo " for $code"; - } - - echo PHP_EOL; - } - } - - // Custom message type. - if (isset($rule->type) === true - && $this->shouldProcessElement($rule->type) === true - ) { - if (isset($this->ruleset[$code]) === false) { - $this->ruleset[$code] = []; - } - - $type = strtolower((string) $rule->type); - if ($type !== 'error' && $type !== 'warning') { - $message = "Message type \"$type\" for \"$code\" is invalid; must be \"error\" or \"warning\"."; - $this->msgCache->add($message, MessageCollector::ERROR); - } else { - $this->ruleset[$code]['type'] = $type; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\t=> message type set to ".(string) $rule->type; - if ($code !== $ref) { - echo " for $code"; - } - - echo PHP_EOL; - } - } - }//end if - - // Custom message. - if (isset($rule->message) === true - && $this->shouldProcessElement($rule->message) === true - ) { - if (isset($this->ruleset[$code]) === false) { - $this->ruleset[$code] = []; - } - - $this->ruleset[$code]['message'] = (string) $rule->message; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\t=> message set to ".(string) $rule->message; - if ($code !== $ref) { - echo " for $code"; - } - - echo PHP_EOL; - } - } - - // Custom properties. - if (isset($rule->properties) === true - && $this->shouldProcessElement($rule->properties) === true - ) { - $propertyScope = 'standard'; - if ($code === $ref || substr($ref, -9) === 'Sniff.php') { - $propertyScope = 'sniff'; - } - - foreach ($rule->properties->property as $prop) { - if ($this->shouldProcessElement($prop) === false) { - continue; - } - - if (isset($this->ruleset[$code]) === false) { - $this->ruleset[$code] = [ - 'properties' => [], - ]; - } else if (isset($this->ruleset[$code]['properties']) === false) { - $this->ruleset[$code]['properties'] = []; - } - - $name = (string) $prop['name']; - if (isset($prop['type']) === true - && (string) $prop['type'] === 'array' - ) { - $values = []; - if (isset($prop['extend']) === true - && (string) $prop['extend'] === 'true' - && isset($this->ruleset[$code]['properties'][$name]['value']) === true - ) { - $values = $this->ruleset[$code]['properties'][$name]['value']; - } - - if (isset($prop->element) === true) { - $printValue = ''; - foreach ($prop->element as $element) { - if ($this->shouldProcessElement($element) === false) { - continue; - } - - $value = (string) $element['value']; - if (isset($element['key']) === true && trim($element['key']) !== '') { - $key = (string) $element['key']; - $values[$key] = $value; - $printValue .= $key.'=>'.$value.','; - } else { - $values[] = $value; - $printValue .= $value.','; - } - } - - $printValue = rtrim($printValue, ','); - } else if (isset($prop['value']) === true) { - $message = 'Passing an array of values to a property using a comma-separated string'.PHP_EOL; - $message .= 'was deprecated in PHP_CodeSniffer 3.3.0. Support will be removed in PHPCS 4.0.0.'.PHP_EOL; - $message .= "The deprecated syntax was used for property \"$name\"".PHP_EOL; - $message .= "for sniff \"$code\".".PHP_EOL; - $message .= 'Pass array values via nodes instead.'; - $this->msgCache->add($message, MessageCollector::DEPRECATED); - - $value = (string) $prop['value']; - $printValue = $value; - if ($value !== '') { - foreach (explode(',', $value) as $val) { - list($k, $v) = explode('=>', $val.'=>'); - if ($v !== '') { - $values[trim($k)] = trim($v); - } else { - $values[] = trim($k); - } - } - } - }//end if - - $this->ruleset[$code]['properties'][$name] = [ - 'value' => $values, - 'scope' => $propertyScope, - ]; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\t=> array property \"$name\" set to \"$printValue\""; - if ($code !== $ref) { - echo " for $code"; - } - - echo PHP_EOL; - } - } else { - $this->ruleset[$code]['properties'][$name] = [ - 'value' => (string) $prop['value'], - 'scope' => $propertyScope, - ]; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\t=> property \"$name\" set to \"".(string) $prop['value'].'"'; - if ($code !== $ref) { - echo " for $code"; - } - - echo PHP_EOL; - } - }//end if - }//end foreach - }//end if - - // Ignore patterns. - foreach ($rule->{'exclude-pattern'} as $pattern) { - if ($this->shouldProcessElement($pattern) === false) { - continue; - } - - if (isset($this->ignorePatterns[$code]) === false) { - $this->ignorePatterns[$code] = []; - } - - if (isset($pattern['type']) === false) { - $pattern['type'] = 'absolute'; - } - - $this->ignorePatterns[$code][(string) $pattern] = (string) $pattern['type']; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\t=> added rule-specific ".(string) $pattern['type'].' ignore pattern'; - if ($code !== $ref) { - echo " for $code"; - } - - echo ': '.(string) $pattern.PHP_EOL; - } - }//end foreach - - // Include patterns. - foreach ($rule->{'include-pattern'} as $pattern) { - if ($this->shouldProcessElement($pattern) === false) { - continue; - } - - if (isset($this->includePatterns[$code]) === false) { - $this->includePatterns[$code] = []; - } - - if (isset($pattern['type']) === false) { - $pattern['type'] = 'absolute'; - } - - $this->includePatterns[$code][(string) $pattern] = (string) $pattern['type']; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t\t=> added rule-specific ".(string) $pattern['type'].' include pattern'; - if ($code !== $ref) { - echo " for $code"; - } - - echo ': '.(string) $pattern.PHP_EOL; - } - }//end foreach - }//end foreach - - }//end processRule() - - - /** - * Determine if an element should be processed or ignored. - * - * @param \SimpleXMLElement $element An object from a ruleset XML file. - * - * @return bool - */ - private function shouldProcessElement($element) - { - if (isset($element['phpcbf-only']) === false - && isset($element['phpcs-only']) === false - ) { - // No exceptions are being made. - return true; - } - - if (PHP_CODESNIFFER_CBF === true - && isset($element['phpcbf-only']) === true - && (string) $element['phpcbf-only'] === 'true' - ) { - return true; - } - - if (PHP_CODESNIFFER_CBF === false - && isset($element['phpcs-only']) === true - && (string) $element['phpcs-only'] === 'true' - ) { - return true; - } - - return false; - - }//end shouldProcessElement() - - - /** - * Loads and stores sniffs objects used for sniffing files. - * - * @param array $files Paths to the sniff files to register. - * @param array $restrictions The sniff class names to restrict the allowed - * listeners to. - * @param array $exclusions The sniff class names to exclude from the - * listeners list. - * - * @return void - */ - public function registerSniffs($files, $restrictions, $exclusions) - { - $listeners = []; - - foreach ($files as $file) { - // Work out where the position of /StandardName/Sniffs/... is - // so we can determine what the class will be called. - $sniffPos = strrpos($file, DIRECTORY_SEPARATOR.'Sniffs'.DIRECTORY_SEPARATOR); - if ($sniffPos === false) { - continue; - } - - $slashPos = strrpos(substr($file, 0, $sniffPos), DIRECTORY_SEPARATOR); - if ($slashPos === false) { - continue; - } - - $className = Autoload::loadFile($file); - $compareName = Common::cleanSniffClass($className); - - // If they have specified a list of sniffs to restrict to, check - // to see if this sniff is allowed. - if (empty($restrictions) === false - && isset($restrictions[$compareName]) === false - ) { - continue; - } - - // If they have specified a list of sniffs to exclude, check - // to see if this sniff is allowed. - if (empty($exclusions) === false - && isset($exclusions[$compareName]) === true - ) { - continue; - } - - // Skip abstract classes. - $reflection = new ReflectionClass($className); - if ($reflection->isAbstract() === true) { - continue; - } - - if ($reflection->implementsInterface('PHP_CodeSniffer\\Sniffs\\Sniff') === false) { - $message = 'All sniffs must implement the PHP_CodeSniffer\\Sniffs\\Sniff interface.'.PHP_EOL; - $message .= "Interface not implemented for sniff $className.".PHP_EOL; - $message .= 'Contact the sniff author to fix the sniff.'; - $this->msgCache->add($message, MessageCollector::DEPRECATED); - - // Skip classes which don't implement the register() or process() methods. - if (method_exists($className, 'register') === false - || method_exists($className, 'process') === false - ) { - $errorMsg = 'Sniff class %s is missing required method %s().'; - if (method_exists($className, 'register') === false) { - $this->msgCache->add(sprintf($errorMsg, $className, 'register'), MessageCollector::ERROR); - } - - if (method_exists($className, 'process') === false) { - $this->msgCache->add(sprintf($errorMsg, $className, 'process'), MessageCollector::ERROR); - } - - continue; - } - }//end if - - $listeners[$className] = $className; - - if (PHP_CODESNIFFER_VERBOSITY > 2) { - echo "Registered $className".PHP_EOL; - } - }//end foreach - - $this->sniffs = $listeners; - - }//end registerSniffs() - - - /** - * Populates the array of PHP_CodeSniffer_Sniff objects for this file. - * - * @return void - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If sniff registration fails. - */ - public function populateTokenListeners() - { - // Construct a list of listeners indexed by token being listened for. - $this->tokenListeners = []; - - foreach ($this->sniffs as $sniffClass => $sniffObject) { - $this->sniffs[$sniffClass] = null; - $this->sniffs[$sniffClass] = new $sniffClass(); - - $sniffCode = Common::getSniffCode($sniffClass); - - if (substr($sniffCode, 0, 1) === '.' - || substr($sniffCode, -1) === '.' - || strpos($sniffCode, '..') !== false - || preg_match('`(^|\.)Sniffs\.`', $sniffCode) === 1 - || preg_match('`[^\s\.-]+\\\\Sniffs\\\\[^\s\.-]+\\\\[^\s\.-]+Sniff`', $sniffClass) !== 1 - ) { - $message = "The sniff $sniffClass does not comply with the PHP_CodeSniffer naming conventions."; - $message .= ' This will no longer be supported in PHPCS 4.0.'.PHP_EOL; - $message .= 'Contact the sniff author to fix the sniff.'; - $this->msgCache->add($message, MessageCollector::DEPRECATED); - } - - $this->sniffCodes[$sniffCode] = $sniffClass; - - $isDeprecated = false; - if ($this->sniffs[$sniffClass] instanceof DeprecatedSniff) { - $isDeprecated = true; - $this->deprecatedSniffs[$sniffCode] = $sniffClass; - } - - // Set custom properties. - if (isset($this->ruleset[$sniffCode]['properties']) === true) { - foreach ($this->ruleset[$sniffCode]['properties'] as $name => $settings) { - $this->setSniffProperty($sniffClass, $name, $settings); - } - } - - $tokenizers = []; - $vars = get_class_vars($sniffClass); - if (empty($vars['supportedTokenizers']) === false - && $isDeprecated === false - && in_array('PHP', $vars['supportedTokenizers'], true) === false - ) { - if (in_array('CSS', $vars['supportedTokenizers'], true) === true - || in_array('JS', $vars['supportedTokenizers'], true) === true - ) { - $message = 'Scanning CSS/JS files is deprecated and support will be removed in PHP_CodeSniffer 4.0.'.PHP_EOL; - } else { - // Just in case someone has an integration with a custom tokenizer. - $message = 'Support for custom tokenizers will be removed in PHP_CodeSniffer 4.0.'.PHP_EOL; - } - - $message .= 'The %s sniff is listening for %s.'; - $message = sprintf($message, $sniffCode, implode(', ', $vars['supportedTokenizers'])); - $this->msgCache->add($message, MessageCollector::DEPRECATED); - } - - if (isset($vars['supportedTokenizers']) === true) { - foreach ($vars['supportedTokenizers'] as $tokenizer) { - $tokenizers[$tokenizer] = $tokenizer; - } - } else { - $tokenizers = ['PHP' => 'PHP']; - } - - $tokens = $this->sniffs[$sniffClass]->register(); - if (is_array($tokens) === false) { - $msg = "The sniff {$sniffClass}::register() method must return an array."; - $this->msgCache->add($msg, MessageCollector::ERROR); - - // Unregister the sniff. - unset($this->sniffs[$sniffClass], $this->sniffCodes[$sniffCode], $this->deprecatedSniffs[$sniffCode]); - continue; - } - - $ignorePatterns = []; - $patterns = $this->getIgnorePatterns($sniffCode); - foreach ($patterns as $pattern => $type) { - $replacements = [ - '\\,' => ',', - '*' => '.*', - ]; - - $ignorePatterns[] = strtr($pattern, $replacements); - } - - $includePatterns = []; - $patterns = $this->getIncludePatterns($sniffCode); - foreach ($patterns as $pattern => $type) { - $replacements = [ - '\\,' => ',', - '*' => '.*', - ]; - - $includePatterns[] = strtr($pattern, $replacements); - } - - foreach ($tokens as $token) { - if (isset($this->tokenListeners[$token]) === false) { - $this->tokenListeners[$token] = []; - } - - if (isset($this->tokenListeners[$token][$sniffClass]) === false) { - $this->tokenListeners[$token][$sniffClass] = [ - 'class' => $sniffClass, - 'source' => $sniffCode, - 'tokenizers' => $tokenizers, - 'ignore' => $ignorePatterns, - 'include' => $includePatterns, - ]; - } - } - }//end foreach - - }//end populateTokenListeners() - - - /** - * Set a single property for a sniff. - * - * @param string $sniffClass The class name of the sniff. - * @param string $name The name of the property to change. - * @param array $settings Array with the new value of the property and the scope of the property being set. - * - * @return void - * - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException When attempting to set a non-existent property on a sniff - * which doesn't declare the property or explicitly supports - * dynamic properties. - */ - public function setSniffProperty($sniffClass, $name, $settings) - { - // Setting a property for a sniff we are not using. - if (isset($this->sniffs[$sniffClass]) === false) { - return; - } - - $name = trim($name); - $propertyName = $name; - if (substr($propertyName, -2) === '[]') { - $propertyName = substr($propertyName, 0, -2); - } - - /* - * BC-compatibility layer for $settings using the pre-PHPCS 3.8.0 format. - * - * Prior to PHPCS 3.8.0, `$settings` was expected to only contain the new _value_ - * for the property (which could be an array). - * Since PHPCS 3.8.0, `$settings` is expected to be an array with two keys: 'scope' - * and 'value', where 'scope' indicates whether the property should be set to the given 'value' - * for one individual sniff or for all sniffs in a standard. - * - * This BC-layer is only for integrations with PHPCS which may call this method directly - * and will be removed in PHPCS 4.0.0. - */ - - if (is_array($settings) === false - || isset($settings['scope'], $settings['value']) === false - ) { - // This will be an "old" format value. - $settings = [ - 'value' => $settings, - 'scope' => 'standard', - ]; - - trigger_error( - __FUNCTION__.': the format of the $settings parameter has changed from (mixed) $value to array(\'scope\' => \'sniff|standard\', \'value\' => $value). Please update your integration code. See PR #3629 for more information.', - E_USER_DEPRECATED - ); - } - - $isSettable = false; - $sniffObject = $this->sniffs[$sniffClass]; - if (property_exists($sniffObject, $propertyName) === true - || ($sniffObject instanceof stdClass) === true - || method_exists($sniffObject, '__set') === true - ) { - $isSettable = true; - } - - if ($isSettable === false) { - if ($settings['scope'] === 'sniff') { - $notice = "Property \"$propertyName\" does not exist on sniff "; - $notice .= array_search($sniffClass, $this->sniffCodes, true).'.'; - $this->msgCache->add($notice, MessageCollector::ERROR); - } - - return; - } - - $value = $settings['value']; - - if (is_string($value) === true) { - $value = trim($value); - } - - if ($value === '') { - $value = null; - } - - // Special case for booleans. - if ($value === 'true') { - $value = true; - } else if ($value === 'false') { - $value = false; - } else if (substr($name, -2) === '[]') { - $name = $propertyName; - $values = []; - if ($value !== null) { - foreach (explode(',', $value) as $val) { - list($k, $v) = explode('=>', $val.'=>'); - if ($v !== '') { - $values[trim($k)] = trim($v); - } else { - $values[] = trim($k); - } - } - } - - $value = $values; - } - - $sniffObject->$name = $value; - - }//end setSniffProperty() - - - /** - * Gets the array of ignore patterns. - * - * Optionally takes a listener to get ignore patterns specified - * for that sniff only. - * - * @param string|null $listener The listener to get patterns for. If NULL, all - * patterns are returned. - * - * @return array - */ - public function getIgnorePatterns($listener=null) - { - if ($listener === null) { - return $this->ignorePatterns; - } - - if (isset($this->ignorePatterns[$listener]) === true) { - return $this->ignorePatterns[$listener]; - } - - return []; - - }//end getIgnorePatterns() - - - /** - * Gets the array of include patterns. - * - * Optionally takes a listener to get include patterns specified - * for that sniff only. - * - * @param string|null $listener The listener to get patterns for. If NULL, all - * patterns are returned. - * - * @return array - */ - public function getIncludePatterns($listener=null) - { - if ($listener === null) { - return $this->includePatterns; - } - - if (isset($this->includePatterns[$listener]) === true) { - return $this->includePatterns[$listener]; - } - - return []; - - }//end getIncludePatterns() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Runner.php b/vendor/squizlabs/php_codesniffer/src/Runner.php deleted file mode 100644 index a835b0d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Runner.php +++ /dev/null @@ -1,986 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer; - -use Exception; -use InvalidArgumentException; -use PHP_CodeSniffer\Exceptions\DeepExitException; -use PHP_CodeSniffer\Exceptions\RuntimeException; -use PHP_CodeSniffer\Files\DummyFile; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Files\FileList; -use PHP_CodeSniffer\Util\Cache; -use PHP_CodeSniffer\Util\Common; -use PHP_CodeSniffer\Util\Standards; -use PHP_CodeSniffer\Util\Timing; -use PHP_CodeSniffer\Util\Tokens; - -class Runner -{ - - /** - * The config data for the run. - * - * @var \PHP_CodeSniffer\Config - */ - public $config = null; - - /** - * The ruleset used for the run. - * - * @var \PHP_CodeSniffer\Ruleset - */ - public $ruleset = null; - - /** - * The reporter used for generating reports after the run. - * - * @var \PHP_CodeSniffer\Reporter - */ - public $reporter = null; - - - /** - * Run the PHPCS script. - * - * @return int - */ - public function runPHPCS() - { - $this->registerOutOfMemoryShutdownMessage('phpcs'); - - try { - Timing::startTiming(); - Runner::checkRequirements(); - - if (defined('PHP_CODESNIFFER_CBF') === false) { - define('PHP_CODESNIFFER_CBF', false); - } - - // Creating the Config object populates it with all required settings - // based on the CLI arguments provided to the script and any config - // values the user has set. - $this->config = new Config(); - - // Init the run and load the rulesets to set additional config vars. - $this->init(); - - // Print a list of sniffs in each of the supplied standards. - // We fudge the config here so that each standard is explained in isolation. - if ($this->config->explain === true) { - $standards = $this->config->standards; - foreach ($standards as $standard) { - $this->config->standards = [$standard]; - $ruleset = new Ruleset($this->config); - $ruleset->explain(); - } - - return 0; - } - - // Generate documentation for each of the supplied standards. - if ($this->config->generator !== null) { - $standards = $this->config->standards; - foreach ($standards as $standard) { - $this->config->standards = [$standard]; - $ruleset = new Ruleset($this->config); - $class = 'PHP_CodeSniffer\Generators\\'.$this->config->generator; - $generator = new $class($ruleset); - $generator->generate(); - } - - return 0; - } - - // Other report formats don't really make sense in interactive mode - // so we hard-code the full report here and when outputting. - // We also ensure parallel processing is off because we need to do one file at a time. - if ($this->config->interactive === true) { - $this->config->reports = ['full' => null]; - $this->config->parallel = 1; - $this->config->showProgress = false; - } - - // Disable caching if we are processing STDIN as we can't be 100% - // sure where the file came from or if it will change in the future. - if ($this->config->stdin === true) { - $this->config->cache = false; - } - - $numErrors = $this->run(); - - // Print all the reports for this run. - $toScreen = $this->reporter->printReports(); - - // Only print timer output if no reports were - // printed to the screen so we don't put additional output - // in something like an XML report. If we are printing to screen, - // the report types would have already worked out who should - // print the timer info. - if ($this->config->interactive === false - && ($toScreen === false - || (($this->reporter->totalErrors + $this->reporter->totalWarnings) === 0 && $this->config->showProgress === true)) - ) { - Timing::printRunTime(); - } - } catch (DeepExitException $e) { - echo $e->getMessage(); - return $e->getCode(); - }//end try - - if ($numErrors === 0) { - // No errors found. - return 0; - } else if ($this->reporter->totalFixable === 0) { - // Errors found, but none of them can be fixed by PHPCBF. - return 1; - } else { - // Errors found, and some can be fixed by PHPCBF. - return 2; - } - - }//end runPHPCS() - - - /** - * Run the PHPCBF script. - * - * @return int - */ - public function runPHPCBF() - { - $this->registerOutOfMemoryShutdownMessage('phpcbf'); - - if (defined('PHP_CODESNIFFER_CBF') === false) { - define('PHP_CODESNIFFER_CBF', true); - } - - try { - Timing::startTiming(); - Runner::checkRequirements(); - - // Creating the Config object populates it with all required settings - // based on the CLI arguments provided to the script and any config - // values the user has set. - $this->config = new Config(); - - // When processing STDIN, we can't output anything to the screen - // or it will end up mixed in with the file output. - if ($this->config->stdin === true) { - $this->config->verbosity = 0; - } - - // Init the run and load the rulesets to set additional config vars. - $this->init(); - - // When processing STDIN, we only process one file at a time and - // we don't process all the way through, so we can't use the parallel - // running system. - if ($this->config->stdin === true) { - $this->config->parallel = 1; - } - - // Override some of the command line settings that might break the fixes. - $this->config->generator = null; - $this->config->explain = false; - $this->config->interactive = false; - $this->config->cache = false; - $this->config->showSources = false; - $this->config->recordErrors = false; - $this->config->reportFile = null; - - // Only use the "Cbf" report, but allow for the Performance report as well. - $originalReports = array_change_key_case($this->config->reports, CASE_LOWER); - $newReports = ['cbf' => null]; - if (array_key_exists('performance', $originalReports) === true) { - $newReports['performance'] = $originalReports['performance']; - } - - $this->config->reports = $newReports; - - // If a standard tries to set command line arguments itself, some - // may be blocked because PHPCBF is running, so stop the script - // dying if any are found. - $this->config->dieOnUnknownArg = false; - - $this->run(); - $this->reporter->printReports(); - - echo PHP_EOL; - Timing::printRunTime(); - } catch (DeepExitException $e) { - echo $e->getMessage(); - return $e->getCode(); - }//end try - - if ($this->reporter->totalFixed === 0) { - // Nothing was fixed by PHPCBF. - if ($this->reporter->totalFixable === 0) { - // Nothing found that could be fixed. - return 0; - } else { - // Something failed to fix. - return 2; - } - } - - if ($this->reporter->totalFixable === 0) { - // PHPCBF fixed all fixable errors. - return 1; - } - - // PHPCBF fixed some fixable errors, but others failed to fix. - return 2; - - }//end runPHPCBF() - - - /** - * Exits if the minimum requirements of PHP_CodeSniffer are not met. - * - * @return void - * @throws \PHP_CodeSniffer\Exceptions\DeepExitException If the requirements are not met. - */ - public function checkRequirements() - { - // Check the PHP version. - if (PHP_VERSION_ID < 50400) { - $error = 'ERROR: PHP_CodeSniffer requires PHP version 5.4.0 or greater.'.PHP_EOL; - throw new DeepExitException($error, 3); - } - - $requiredExtensions = [ - 'tokenizer', - 'xmlwriter', - 'SimpleXML', - ]; - $missingExtensions = []; - - foreach ($requiredExtensions as $extension) { - if (extension_loaded($extension) === false) { - $missingExtensions[] = $extension; - } - } - - if (empty($missingExtensions) === false) { - $last = array_pop($requiredExtensions); - $required = implode(', ', $requiredExtensions); - $required .= ' and '.$last; - - if (count($missingExtensions) === 1) { - $missing = $missingExtensions[0]; - } else { - $last = array_pop($missingExtensions); - $missing = implode(', ', $missingExtensions); - $missing .= ' and '.$last; - } - - $error = 'ERROR: PHP_CodeSniffer requires the %s extensions to be enabled. Please enable %s.'.PHP_EOL; - $error = sprintf($error, $required, $missing); - throw new DeepExitException($error, 3); - } - - }//end checkRequirements() - - - /** - * Init the rulesets and other high-level settings. - * - * @return void - * @throws \PHP_CodeSniffer\Exceptions\DeepExitException If a referenced standard is not installed. - */ - public function init() - { - if (defined('PHP_CODESNIFFER_CBF') === false) { - define('PHP_CODESNIFFER_CBF', false); - } - - // Ensure this option is enabled or else line endings will not always - // be detected properly for files created on a Mac with the /r line ending. - @ini_set('auto_detect_line_endings', true); - - // Disable the PCRE JIT as this caused issues with parallel running. - ini_set('pcre.jit', false); - - // Check that the standards are valid. - foreach ($this->config->standards as $standard) { - if (Standards::isInstalledStandard($standard) === false) { - // They didn't select a valid coding standard, so help them - // out by letting them know which standards are installed. - $error = 'ERROR: the "'.$standard.'" coding standard is not installed. '; - ob_start(); - Standards::printInstalledStandards(); - $error .= ob_get_contents(); - ob_end_clean(); - throw new DeepExitException($error, 3); - } - } - - // Saves passing the Config object into other objects that only need - // the verbosity flag for debug output. - if (defined('PHP_CODESNIFFER_VERBOSITY') === false) { - define('PHP_CODESNIFFER_VERBOSITY', $this->config->verbosity); - } - - // Create this class so it is autoloaded and sets up a bunch - // of PHP_CodeSniffer-specific token type constants. - new Tokens(); - - // Allow autoloading of custom files inside installed standards. - $installedStandards = Standards::getInstalledStandardDetails(); - foreach ($installedStandards as $details) { - Autoload::addSearchPath($details['path'], $details['namespace']); - } - - // The ruleset contains all the information about how the files - // should be checked and/or fixed. - try { - $this->ruleset = new Ruleset($this->config); - - if ($this->ruleset->hasSniffDeprecations() === true) { - $this->ruleset->showSniffDeprecations(); - } - } catch (RuntimeException $e) { - $error = rtrim($e->getMessage(), "\r\n").PHP_EOL.PHP_EOL; - $error .= $this->config->printShortUsage(true); - throw new DeepExitException($error, 3); - } - - }//end init() - - - /** - * Performs the run. - * - * @return int The number of errors and warnings found. - * @throws \PHP_CodeSniffer\Exceptions\DeepExitException - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException - */ - private function run() - { - // The class that manages all reporters for the run. - $this->reporter = new Reporter($this->config); - - // Include bootstrap files. - foreach ($this->config->bootstrap as $bootstrap) { - include $bootstrap; - } - - if ($this->config->stdin === true) { - $fileContents = $this->config->stdinContent; - if ($fileContents === null) { - $handle = fopen('php://stdin', 'r'); - stream_set_blocking($handle, true); - $fileContents = stream_get_contents($handle); - fclose($handle); - } - - $todo = new FileList($this->config, $this->ruleset); - $dummy = new DummyFile($fileContents, $this->ruleset, $this->config); - $todo->addFile($dummy->path, $dummy); - } else { - if (empty($this->config->files) === true) { - $error = 'ERROR: You must supply at least one file or directory to process.'.PHP_EOL.PHP_EOL; - $error .= $this->config->printShortUsage(true); - throw new DeepExitException($error, 3); - } - - if (PHP_CODESNIFFER_VERBOSITY > 0) { - echo 'Creating file list... '; - } - - $todo = new FileList($this->config, $this->ruleset); - - if (PHP_CODESNIFFER_VERBOSITY > 0) { - $numFiles = count($todo); - echo "DONE ($numFiles files in queue)".PHP_EOL; - } - - if ($this->config->cache === true) { - if (PHP_CODESNIFFER_VERBOSITY > 0) { - echo 'Loading cache... '; - } - - Cache::load($this->ruleset, $this->config); - - if (PHP_CODESNIFFER_VERBOSITY > 0) { - $size = Cache::getSize(); - echo "DONE ($size files in cache)".PHP_EOL; - } - } - }//end if - - // Turn all sniff errors into exceptions. - set_error_handler([$this, 'handleErrors']); - - // If verbosity is too high, turn off parallelism so the - // debug output is clean. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $this->config->parallel = 1; - } - - // If the PCNTL extension isn't installed, we can't fork. - if (function_exists('pcntl_fork') === false) { - $this->config->parallel = 1; - } - - $lastDir = ''; - $numFiles = count($todo); - - if ($this->config->parallel === 1) { - // Running normally. - $numProcessed = 0; - foreach ($todo as $path => $file) { - if ($file->ignored === false) { - $currDir = dirname($path); - if ($lastDir !== $currDir) { - if (PHP_CODESNIFFER_VERBOSITY > 0) { - echo 'Changing into directory '.Common::stripBasepath($currDir, $this->config->basepath).PHP_EOL; - } - - $lastDir = $currDir; - } - - $this->processFile($file); - } else if (PHP_CODESNIFFER_VERBOSITY > 0) { - echo 'Skipping '.basename($file->path).PHP_EOL; - } - - $numProcessed++; - $this->printProgress($file, $numFiles, $numProcessed); - } - } else { - // Batching and forking. - $childProcs = []; - $numPerBatch = ceil($numFiles / $this->config->parallel); - - for ($batch = 0; $batch < $this->config->parallel; $batch++) { - $startAt = ($batch * $numPerBatch); - if ($startAt >= $numFiles) { - break; - } - - $endAt = ($startAt + $numPerBatch); - if ($endAt > $numFiles) { - $endAt = $numFiles; - } - - $childOutFilename = tempnam(sys_get_temp_dir(), 'phpcs-child'); - $pid = pcntl_fork(); - if ($pid === -1) { - throw new RuntimeException('Failed to create child process'); - } else if ($pid !== 0) { - $childProcs[$pid] = $childOutFilename; - } else { - // Move forward to the start of the batch. - $todo->rewind(); - for ($i = 0; $i < $startAt; $i++) { - $todo->next(); - } - - // Reset the reporter to make sure only figures from this - // file batch are recorded. - $this->reporter->totalFiles = 0; - $this->reporter->totalErrors = 0; - $this->reporter->totalWarnings = 0; - $this->reporter->totalFixable = 0; - $this->reporter->totalFixed = 0; - - // Process the files. - $pathsProcessed = []; - ob_start(); - for ($i = $startAt; $i < $endAt; $i++) { - $path = $todo->key(); - $file = $todo->current(); - - if ($file->ignored === true) { - $todo->next(); - continue; - } - - $currDir = dirname($path); - if ($lastDir !== $currDir) { - if (PHP_CODESNIFFER_VERBOSITY > 0) { - echo 'Changing into directory '.Common::stripBasepath($currDir, $this->config->basepath).PHP_EOL; - } - - $lastDir = $currDir; - } - - $this->processFile($file); - - $pathsProcessed[] = $path; - $todo->next(); - }//end for - - $debugOutput = ob_get_contents(); - ob_end_clean(); - - // Write information about the run to the filesystem - // so it can be picked up by the main process. - $childOutput = [ - 'totalFiles' => $this->reporter->totalFiles, - 'totalErrors' => $this->reporter->totalErrors, - 'totalWarnings' => $this->reporter->totalWarnings, - 'totalFixable' => $this->reporter->totalFixable, - 'totalFixed' => $this->reporter->totalFixed, - ]; - - $output = '<'.'?php'."\n".' $childOutput = '; - $output .= var_export($childOutput, true); - $output .= ";\n\$debugOutput = "; - $output .= var_export($debugOutput, true); - - if ($this->config->cache === true) { - $childCache = []; - foreach ($pathsProcessed as $path) { - $childCache[$path] = Cache::get($path); - } - - $output .= ";\n\$childCache = "; - $output .= var_export($childCache, true); - } - - $output .= ";\n?".'>'; - file_put_contents($childOutFilename, $output); - exit(); - }//end if - }//end for - - $success = $this->processChildProcs($childProcs); - if ($success === false) { - throw new RuntimeException('One or more child processes failed to run'); - } - }//end if - - restore_error_handler(); - - if (PHP_CODESNIFFER_VERBOSITY === 0 - && $this->config->interactive === false - && $this->config->showProgress === true - ) { - echo PHP_EOL.PHP_EOL; - } - - if ($this->config->cache === true) { - Cache::save(); - } - - $ignoreWarnings = Config::getConfigData('ignore_warnings_on_exit'); - $ignoreErrors = Config::getConfigData('ignore_errors_on_exit'); - - $return = ($this->reporter->totalErrors + $this->reporter->totalWarnings); - if ($ignoreErrors !== null) { - $ignoreErrors = (bool) $ignoreErrors; - if ($ignoreErrors === true) { - $return -= $this->reporter->totalErrors; - } - } - - if ($ignoreWarnings !== null) { - $ignoreWarnings = (bool) $ignoreWarnings; - if ($ignoreWarnings === true) { - $return -= $this->reporter->totalWarnings; - } - } - - return $return; - - }//end run() - - - /** - * Converts all PHP errors into exceptions. - * - * This method forces a sniff to stop processing if it is not - * able to handle a specific piece of code, instead of continuing - * and potentially getting into a loop. - * - * @param int $code The level of error raised. - * @param string $message The error message. - * @param string $file The path of the file that raised the error. - * @param int $line The line number the error was raised at. - * - * @return bool - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException - */ - public function handleErrors($code, $message, $file, $line) - { - if ((error_reporting() & $code) === 0) { - // This type of error is being muted. - return true; - } - - throw new RuntimeException("$message in $file on line $line"); - - }//end handleErrors() - - - /** - * Processes a single file, including checking and fixing. - * - * @param \PHP_CodeSniffer\Files\File $file The file to be processed. - * - * @return void - * @throws \PHP_CodeSniffer\Exceptions\DeepExitException - */ - public function processFile($file) - { - if (PHP_CODESNIFFER_VERBOSITY > 0) { - $startTime = microtime(true); - echo 'Processing '.basename($file->path).' '; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo PHP_EOL; - } - } - - try { - $file->process(); - - if (PHP_CODESNIFFER_VERBOSITY > 0) { - $timeTaken = ((microtime(true) - $startTime) * 1000); - if ($timeTaken < 1000) { - $timeTaken = round($timeTaken); - echo "DONE in {$timeTaken}ms"; - } else { - $timeTaken = round(($timeTaken / 1000), 2); - echo "DONE in $timeTaken secs"; - } - - if (PHP_CODESNIFFER_CBF === true) { - $errors = $file->getFixableCount(); - echo " ($errors fixable violations)".PHP_EOL; - } else { - $errors = $file->getErrorCount(); - $warnings = $file->getWarningCount(); - echo " ($errors errors, $warnings warnings)".PHP_EOL; - } - } - } catch (Exception $e) { - $error = 'An error occurred during processing; checking has been aborted. The error message was: '.$e->getMessage(); - - // Determine which sniff caused the error. - $sniffStack = null; - $nextStack = null; - foreach ($e->getTrace() as $step) { - if (isset($step['file']) === false) { - continue; - } - - if (empty($sniffStack) === false) { - $nextStack = $step; - break; - } - - if (substr($step['file'], -9) === 'Sniff.php') { - $sniffStack = $step; - continue; - } - } - - if (empty($sniffStack) === false) { - $sniffCode = ''; - try { - if (empty($nextStack) === false - && isset($nextStack['class']) === true - && substr($nextStack['class'], -5) === 'Sniff' - ) { - $sniffCode = 'the '.Common::getSniffCode($nextStack['class']).' sniff'; - } - } catch (InvalidArgumentException $e) { - // Sniff code could not be determined. This may be an abstract sniff class. - } - - if ($sniffCode === '') { - $sniffCode = substr(strrchr(str_replace('\\', '/', $sniffStack['file']), '/'), 1); - } - - $error .= sprintf(PHP_EOL.'The error originated in %s on line %s.', $sniffCode, $sniffStack['line']); - } - - $file->addErrorOnLine($error, 1, 'Internal.Exception'); - }//end try - - $this->reporter->cacheFileReport($file); - - if ($this->config->interactive === true) { - /* - Running interactively. - Print the error report for the current file and then wait for user input. - */ - - // Get current violations and then clear the list to make sure - // we only print violations for a single file each time. - $numErrors = null; - while ($numErrors !== 0) { - $numErrors = ($file->getErrorCount() + $file->getWarningCount()); - if ($numErrors === 0) { - continue; - } - - $this->reporter->printReport('full'); - - echo ' to recheck, [s] to skip or [q] to quit : '; - $input = fgets(STDIN); - $input = trim($input); - - switch ($input) { - case 's': - break(2); - case 'q': - throw new DeepExitException('', 0); - default: - // Repopulate the sniffs because some of them save their state - // and only clear it when the file changes, but we are rechecking - // the same file. - $file->ruleset->populateTokenListeners(); - $file->reloadContent(); - $file->process(); - $this->reporter->cacheFileReport($file); - break; - } - }//end while - }//end if - - // Clean up the file to save (a lot of) memory. - $file->cleanUp(); - - }//end processFile() - - - /** - * Waits for child processes to complete and cleans up after them. - * - * The reporting information returned by each child process is merged - * into the main reporter class. - * - * @param array $childProcs An array of child processes to wait for. - * - * @return bool - */ - private function processChildProcs($childProcs) - { - $numProcessed = 0; - $totalBatches = count($childProcs); - - $success = true; - - while (count($childProcs) > 0) { - $pid = pcntl_waitpid(0, $status); - if ($pid <= 0 || isset($childProcs[$pid]) === false) { - // No child or a child with an unmanaged PID was returned. - continue; - } - - $childProcessStatus = pcntl_wexitstatus($status); - if ($childProcessStatus !== 0) { - $success = false; - } - - $out = $childProcs[$pid]; - unset($childProcs[$pid]); - if (file_exists($out) === false) { - continue; - } - - include $out; - unlink($out); - - $numProcessed++; - - if (isset($childOutput) === false) { - // The child process died, so the run has failed. - $file = new DummyFile('', $this->ruleset, $this->config); - $file->setErrorCounts(1, 0, 0, 0); - $this->printProgress($file, $totalBatches, $numProcessed); - $success = false; - continue; - } - - $this->reporter->totalFiles += $childOutput['totalFiles']; - $this->reporter->totalErrors += $childOutput['totalErrors']; - $this->reporter->totalWarnings += $childOutput['totalWarnings']; - $this->reporter->totalFixable += $childOutput['totalFixable']; - $this->reporter->totalFixed += $childOutput['totalFixed']; - - if (isset($debugOutput) === true) { - echo $debugOutput; - } - - if (isset($childCache) === true) { - foreach ($childCache as $path => $cache) { - Cache::set($path, $cache); - } - } - - // Fake a processed file so we can print progress output for the batch. - $file = new DummyFile('', $this->ruleset, $this->config); - $file->setErrorCounts( - $childOutput['totalErrors'], - $childOutput['totalWarnings'], - $childOutput['totalFixable'], - $childOutput['totalFixed'] - ); - $this->printProgress($file, $totalBatches, $numProcessed); - }//end while - - return $success; - - }//end processChildProcs() - - - /** - * Print progress information for a single processed file. - * - * @param \PHP_CodeSniffer\Files\File $file The file that was processed. - * @param int $numFiles The total number of files to process. - * @param int $numProcessed The number of files that have been processed, - * including this one. - * - * @return void - */ - public function printProgress(File $file, $numFiles, $numProcessed) - { - if (PHP_CODESNIFFER_VERBOSITY > 0 - || $this->config->showProgress === false - ) { - return; - } - - $showColors = $this->config->colors; - $colorOpen = ''; - $progressDot = '.'; - $colorClose = ''; - - // Show progress information. - if ($file->ignored === true) { - $progressDot = 'S'; - } else { - $errors = $file->getErrorCount(); - $warnings = $file->getWarningCount(); - $fixable = $file->getFixableCount(); - $fixed = $file->getFixedCount(); - - if (PHP_CODESNIFFER_CBF === true) { - // Files with fixed errors or warnings are F (green). - // Files with unfixable errors or warnings are E (red). - // Files with no errors or warnings are . (black). - if ($fixable > 0) { - $progressDot = 'E'; - - if ($showColors === true) { - $colorOpen = "\033[31m"; - $colorClose = "\033[0m"; - } - } else if ($fixed > 0) { - $progressDot = 'F'; - - if ($showColors === true) { - $colorOpen = "\033[32m"; - $colorClose = "\033[0m"; - } - }//end if - } else { - // Files with errors are E (red). - // Files with fixable errors are E (green). - // Files with warnings are W (yellow). - // Files with fixable warnings are W (green). - // Files with no errors or warnings are . (black). - if ($errors > 0) { - $progressDot = 'E'; - - if ($showColors === true) { - if ($fixable > 0) { - $colorOpen = "\033[32m"; - } else { - $colorOpen = "\033[31m"; - } - - $colorClose = "\033[0m"; - } - } else if ($warnings > 0) { - $progressDot = 'W'; - - if ($showColors === true) { - if ($fixable > 0) { - $colorOpen = "\033[32m"; - } else { - $colorOpen = "\033[33m"; - } - - $colorClose = "\033[0m"; - } - }//end if - }//end if - }//end if - - echo $colorOpen.$progressDot.$colorClose; - - $numPerLine = 60; - if ($numProcessed !== $numFiles && ($numProcessed % $numPerLine) !== 0) { - return; - } - - $percent = round(($numProcessed / $numFiles) * 100); - $padding = (strlen($numFiles) - strlen($numProcessed)); - if ($numProcessed === $numFiles - && $numFiles > $numPerLine - && ($numProcessed % $numPerLine) !== 0 - ) { - $padding += ($numPerLine - ($numFiles - (floor($numFiles / $numPerLine) * $numPerLine))); - } - - echo str_repeat(' ', $padding)." $numProcessed / $numFiles ($percent%)".PHP_EOL; - - }//end printProgress() - - - /** - * Registers a PHP shutdown function to provide a more informative out of memory error. - * - * @param string $command The command which was used to initiate the PHPCS run. - * - * @return void - */ - private function registerOutOfMemoryShutdownMessage($command) - { - // Allocate all needed memory beforehand as much as possible. - $errorMsg = PHP_EOL.'The PHP_CodeSniffer "%1$s" command ran out of memory.'.PHP_EOL; - $errorMsg .= 'Either raise the "memory_limit" of PHP in the php.ini file or raise the memory limit at runtime'.PHP_EOL; - $errorMsg .= 'using "%1$s -d memory_limit=512M" (replace 512M with the desired memory limit).'.PHP_EOL; - $errorMsg = sprintf($errorMsg, $command); - $memoryError = 'Allowed memory size of'; - $errorArray = [ - 'type' => 42, - 'message' => 'Some random dummy string to take up memory and take up some more memory and some more and more and more and more', - 'file' => 'Another random string, which would be a filename this time. Should be relatively long to allow for deeply nested files', - 'line' => 31427, - ]; - - register_shutdown_function( - static function () use ( - $errorMsg, - $memoryError, - $errorArray - ) { - $errorArray = error_get_last(); - if (is_array($errorArray) === true && strpos($errorArray['message'], $memoryError) !== false) { - echo $errorMsg; - } - } - ); - - }//end registerOutOfMemoryShutdownMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Sniffs/AbstractArraySniff.php b/vendor/squizlabs/php_codesniffer/src/Sniffs/AbstractArraySniff.php deleted file mode 100644 index 3b2e019..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Sniffs/AbstractArraySniff.php +++ /dev/null @@ -1,172 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Sniffs; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; - -abstract class AbstractArraySniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - final public function register() - { - return [ - T_ARRAY, - T_OPEN_SHORT_ARRAY, - ]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being checked. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['code'] === T_ARRAY) { - $phpcsFile->recordMetric($stackPtr, 'Short array syntax used', 'no'); - - $arrayStart = $tokens[$stackPtr]['parenthesis_opener']; - if (isset($tokens[$arrayStart]['parenthesis_closer']) === false) { - // Incomplete array. - return; - } - - $arrayEnd = $tokens[$arrayStart]['parenthesis_closer']; - } else { - $phpcsFile->recordMetric($stackPtr, 'Short array syntax used', 'yes'); - $arrayStart = $stackPtr; - $arrayEnd = $tokens[$stackPtr]['bracket_closer']; - } - - $lastContent = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($arrayEnd - 1), null, true); - if ($tokens[$lastContent]['code'] === T_COMMA) { - // Last array item ends with a comma. - $phpcsFile->recordMetric($stackPtr, 'Array end comma', 'yes'); - } else { - $phpcsFile->recordMetric($stackPtr, 'Array end comma', 'no'); - } - - $indices = []; - - $current = $arrayStart; - while (($next = $phpcsFile->findNext(Tokens::$emptyTokens, ($current + 1), $arrayEnd, true)) !== false) { - $end = $this->getNext($phpcsFile, $next, $arrayEnd); - - if ($tokens[$end]['code'] === T_DOUBLE_ARROW) { - $indexEnd = $phpcsFile->findPrevious(T_WHITESPACE, ($end - 1), null, true); - $valueStart = $phpcsFile->findNext(Tokens::$emptyTokens, ($end + 1), null, true); - - $indices[] = [ - 'index_start' => $next, - 'index_end' => $indexEnd, - 'arrow' => $end, - 'value_start' => $valueStart, - ]; - } else { - $valueStart = $next; - $indices[] = ['value_start' => $valueStart]; - } - - $current = $this->getNext($phpcsFile, $valueStart, $arrayEnd); - } - - if ($tokens[$arrayStart]['line'] === $tokens[$arrayEnd]['line']) { - $this->processSingleLineArray($phpcsFile, $stackPtr, $arrayStart, $arrayEnd, $indices); - } else { - $this->processMultiLineArray($phpcsFile, $stackPtr, $arrayStart, $arrayEnd, $indices); - } - - }//end process() - - - /** - * Find next separator in array - either: comma or double arrow. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being checked. - * @param int $ptr The position of current token. - * @param int $arrayEnd The token that ends the array definition. - * - * @return int - */ - private function getNext(File $phpcsFile, $ptr, $arrayEnd) - { - $tokens = $phpcsFile->getTokens(); - - while ($ptr < $arrayEnd) { - if (isset($tokens[$ptr]['scope_closer']) === true) { - $ptr = $tokens[$ptr]['scope_closer']; - } else if (isset($tokens[$ptr]['parenthesis_closer']) === true) { - $ptr = $tokens[$ptr]['parenthesis_closer']; - } else if (isset($tokens[$ptr]['bracket_closer']) === true) { - $ptr = $tokens[$ptr]['bracket_closer']; - } - - if ($tokens[$ptr]['code'] === T_COMMA - || $tokens[$ptr]['code'] === T_DOUBLE_ARROW - ) { - return $ptr; - } - - ++$ptr; - } - - return $ptr; - - }//end getNext() - - - /** - * Processes a single-line array definition. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being checked. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $arrayStart The token that starts the array definition. - * @param int $arrayEnd The token that ends the array definition. - * @param array $indices An array of token positions for the array keys, - * double arrows, and values. - * - * @return void - */ - abstract protected function processSingleLineArray($phpcsFile, $stackPtr, $arrayStart, $arrayEnd, $indices); - - - /** - * Processes a multi-line array definition. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being checked. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $arrayStart The token that starts the array definition. - * @param int $arrayEnd The token that ends the array definition. - * @param array $indices An array of token positions for the array keys, - * double arrows, and values. - * - * @return void - */ - abstract protected function processMultiLineArray($phpcsFile, $stackPtr, $arrayStart, $arrayEnd, $indices); - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Sniffs/AbstractPatternSniff.php b/vendor/squizlabs/php_codesniffer/src/Sniffs/AbstractPatternSniff.php deleted file mode 100644 index a54dbce..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Sniffs/AbstractPatternSniff.php +++ /dev/null @@ -1,941 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Sniffs; - -use PHP_CodeSniffer\Exceptions\RuntimeException; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Tokenizers\PHP; -use PHP_CodeSniffer\Util\Tokens; - -abstract class AbstractPatternSniff implements Sniff -{ - - /** - * If true, comments will be ignored if they are found in the code. - * - * @var boolean - */ - public $ignoreComments = false; - - /** - * The current file being checked. - * - * @var string - */ - protected $currFile = ''; - - /** - * The parsed patterns array. - * - * @var array - */ - private $parsedPatterns = []; - - /** - * Tokens that this sniff wishes to process outside of the patterns. - * - * @var int[] - * @see registerSupplementary() - * @see processSupplementary() - */ - private $supplementaryTokens = []; - - /** - * Positions in the stack where errors have occurred. - * - * @var array - */ - private $errorPos = []; - - - /** - * Constructs a AbstractPatternSniff. - * - * @param boolean $ignoreComments If true, comments will be ignored. - */ - public function __construct($ignoreComments=null) - { - // This is here for backwards compatibility. - if ($ignoreComments !== null) { - $this->ignoreComments = $ignoreComments; - } - - $this->supplementaryTokens = $this->registerSupplementary(); - - }//end __construct() - - - /** - * Registers the tokens to listen to. - * - * Classes extending AbstractPatternTest should implement the - * getPatterns() method to register the patterns they wish to test. - * - * @return array - * @see process() - */ - final public function register() - { - $listenTypes = []; - $patterns = $this->getPatterns(); - - foreach ($patterns as $pattern) { - $parsedPattern = $this->parse($pattern); - - // Find a token position in the pattern that we can use - // for a listener token. - $pos = $this->getListenerTokenPos($parsedPattern); - $tokenType = $parsedPattern[$pos]['token']; - $listenTypes[] = $tokenType; - - $patternArray = [ - 'listen_pos' => $pos, - 'pattern' => $parsedPattern, - 'pattern_code' => $pattern, - ]; - - if (isset($this->parsedPatterns[$tokenType]) === false) { - $this->parsedPatterns[$tokenType] = []; - } - - $this->parsedPatterns[$tokenType][] = $patternArray; - }//end foreach - - return array_unique(array_merge($listenTypes, $this->supplementaryTokens)); - - }//end register() - - - /** - * Returns the token types that the specified pattern is checking for. - * - * Returned array is in the format: - * - * array( - * T_WHITESPACE => 0, // 0 is the position where the T_WHITESPACE token - * // should occur in the pattern. - * ); - * - * - * @param array $pattern The parsed pattern to find the acquire the token - * types from. - * - * @return array - */ - private function getPatternTokenTypes($pattern) - { - $tokenTypes = []; - foreach ($pattern as $pos => $patternInfo) { - if ($patternInfo['type'] === 'token') { - if (isset($tokenTypes[$patternInfo['token']]) === false) { - $tokenTypes[$patternInfo['token']] = $pos; - } - } - } - - return $tokenTypes; - - }//end getPatternTokenTypes() - - - /** - * Returns the position in the pattern that this test should register as - * a listener for the pattern. - * - * @param array $pattern The pattern to acquire the listener for. - * - * @return int The position in the pattern that this test should register - * as the listener. - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If we could not determine a token to listen for. - */ - private function getListenerTokenPos($pattern) - { - $tokenTypes = $this->getPatternTokenTypes($pattern); - $tokenCodes = array_keys($tokenTypes); - $token = Tokens::getHighestWeightedToken($tokenCodes); - - // If we could not get a token. - if ($token === false) { - $error = 'Could not determine a token to listen for'; - throw new RuntimeException($error); - } - - return $tokenTypes[$token]; - - }//end getListenerTokenPos() - - - /** - * Processes the test. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where the - * token occurred. - * @param int $stackPtr The position in the tokens stack - * where the listening token type - * was found. - * - * @return void - * @see register() - */ - final public function process(File $phpcsFile, $stackPtr) - { - $file = $phpcsFile->getFilename(); - if ($this->currFile !== $file) { - // We have changed files, so clean up. - $this->errorPos = []; - $this->currFile = $file; - } - - $tokens = $phpcsFile->getTokens(); - - if (in_array($tokens[$stackPtr]['code'], $this->supplementaryTokens, true) === true) { - $this->processSupplementary($phpcsFile, $stackPtr); - } - - $type = $tokens[$stackPtr]['code']; - - // If the type is not set, then it must have been a token registered - // with registerSupplementary(). - if (isset($this->parsedPatterns[$type]) === false) { - return; - } - - $allErrors = []; - - // Loop over each pattern that is listening to the current token type - // that we are processing. - foreach ($this->parsedPatterns[$type] as $patternInfo) { - // If processPattern returns false, then the pattern that we are - // checking the code with must not be designed to check that code. - $errors = $this->processPattern($patternInfo, $phpcsFile, $stackPtr); - if ($errors === false) { - // The pattern didn't match. - continue; - } else if (empty($errors) === true) { - // The pattern matched, but there were no errors. - break; - } - - foreach ($errors as $stackPtr => $error) { - if (isset($this->errorPos[$stackPtr]) === false) { - $this->errorPos[$stackPtr] = true; - $allErrors[$stackPtr] = $error; - } - } - } - - foreach ($allErrors as $stackPtr => $error) { - $phpcsFile->addError($error, $stackPtr, 'Found'); - } - - }//end process() - - - /** - * Processes the pattern and verifies the code at $stackPtr. - * - * @param array $patternInfo Information about the pattern used - * for checking, which includes are - * parsed token representation of the - * pattern. - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where the - * token occurred. - * @param int $stackPtr The position in the tokens stack where - * the listening token type was found. - * - * @return array|false - */ - protected function processPattern($patternInfo, File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $pattern = $patternInfo['pattern']; - $patternCode = $patternInfo['pattern_code']; - $errors = []; - $found = ''; - - $ignoreTokens = [T_WHITESPACE => T_WHITESPACE]; - if ($this->ignoreComments === true) { - $ignoreTokens += Tokens::$commentTokens; - } - - $origStackPtr = $stackPtr; - $hasError = false; - - if ($patternInfo['listen_pos'] > 0) { - $stackPtr--; - - for ($i = ($patternInfo['listen_pos'] - 1); $i >= 0; $i--) { - if ($pattern[$i]['type'] === 'token') { - if ($pattern[$i]['token'] === T_WHITESPACE) { - if ($tokens[$stackPtr]['code'] === T_WHITESPACE) { - $found = $tokens[$stackPtr]['content'].$found; - } - - // Only check the size of the whitespace if this is not - // the first token. We don't care about the size of - // leading whitespace, just that there is some. - if ($i !== 0) { - if ($tokens[$stackPtr]['content'] !== $pattern[$i]['value']) { - $hasError = true; - } - } - } else { - // Check to see if this important token is the same as the - // previous important token in the pattern. If it is not, - // then the pattern cannot be for this piece of code. - $prev = $phpcsFile->findPrevious( - $ignoreTokens, - $stackPtr, - null, - true - ); - - if ($prev === false - || $tokens[$prev]['code'] !== $pattern[$i]['token'] - ) { - return false; - } - - // If we skipped past some whitespace tokens, then add them - // to the found string. - $tokenContent = $phpcsFile->getTokensAsString( - ($prev + 1), - ($stackPtr - $prev - 1) - ); - - $found = $tokens[$prev]['content'].$tokenContent.$found; - - if (isset($pattern[($i - 1)]) === true - && $pattern[($i - 1)]['type'] === 'skip' - ) { - $stackPtr = $prev; - } else { - $stackPtr = ($prev - 1); - } - }//end if - } else if ($pattern[$i]['type'] === 'skip') { - // Skip to next piece of relevant code. - if ($pattern[$i]['to'] === 'parenthesis_closer') { - $to = 'parenthesis_opener'; - } else { - $to = 'scope_opener'; - } - - // Find the previous opener. - $next = $phpcsFile->findPrevious( - $ignoreTokens, - $stackPtr, - null, - true - ); - - if ($next === false || isset($tokens[$next][$to]) === false) { - // If there was not opener, then we must be - // using the wrong pattern. - return false; - } - - if ($to === 'parenthesis_opener') { - $found = '{'.$found; - } else { - $found = '('.$found; - } - - $found = '...'.$found; - - // Skip to the opening token. - $stackPtr = ($tokens[$next][$to] - 1); - } else if ($pattern[$i]['type'] === 'string') { - $found = 'abc'; - } else if ($pattern[$i]['type'] === 'newline') { - if ($this->ignoreComments === true - && isset(Tokens::$commentTokens[$tokens[$stackPtr]['code']]) === true - ) { - $startComment = $phpcsFile->findPrevious( - Tokens::$commentTokens, - ($stackPtr - 1), - null, - true - ); - - if ($tokens[$startComment]['line'] !== $tokens[($startComment + 1)]['line']) { - $startComment++; - } - - $tokenContent = $phpcsFile->getTokensAsString( - $startComment, - ($stackPtr - $startComment + 1) - ); - - $found = $tokenContent.$found; - $stackPtr = ($startComment - 1); - } - - if ($tokens[$stackPtr]['code'] === T_WHITESPACE) { - if ($tokens[$stackPtr]['content'] !== $phpcsFile->eolChar) { - $found = $tokens[$stackPtr]['content'].$found; - - // This may just be an indent that comes after a newline - // so check the token before to make sure. If it is a newline, we - // can ignore the error here. - if (($tokens[($stackPtr - 1)]['content'] !== $phpcsFile->eolChar) - && ($this->ignoreComments === true - && isset(Tokens::$commentTokens[$tokens[($stackPtr - 1)]['code']]) === false) - ) { - $hasError = true; - } else { - $stackPtr--; - } - } else { - $found = 'EOL'.$found; - } - } else { - $found = $tokens[$stackPtr]['content'].$found; - $hasError = true; - }//end if - - if ($hasError === false && $pattern[($i - 1)]['type'] !== 'newline') { - // Make sure they only have 1 newline. - $prev = $phpcsFile->findPrevious($ignoreTokens, ($stackPtr - 1), null, true); - if ($prev !== false && $tokens[$prev]['line'] !== $tokens[$stackPtr]['line']) { - $hasError = true; - } - } - }//end if - }//end for - }//end if - - $stackPtr = $origStackPtr; - $lastAddedStackPtr = null; - $patternLen = count($pattern); - - if (($stackPtr + $patternLen - $patternInfo['listen_pos']) > $phpcsFile->numTokens) { - // Pattern can never match as there are not enough tokens left in the file. - return false; - } - - for ($i = $patternInfo['listen_pos']; $i < $patternLen; $i++) { - if (isset($tokens[$stackPtr]) === false) { - break; - } - - if ($pattern[$i]['type'] === 'token') { - if ($pattern[$i]['token'] === T_WHITESPACE) { - if ($this->ignoreComments === true) { - // If we are ignoring comments, check to see if this current - // token is a comment. If so skip it. - if (isset(Tokens::$commentTokens[$tokens[$stackPtr]['code']]) === true) { - continue; - } - - // If the next token is a comment, the we need to skip the - // current token as we should allow a space before a - // comment for readability. - if (isset($tokens[($stackPtr + 1)]) === true - && isset(Tokens::$commentTokens[$tokens[($stackPtr + 1)]['code']]) === true - ) { - continue; - } - } - - $tokenContent = ''; - if ($tokens[$stackPtr]['code'] === T_WHITESPACE) { - if (isset($pattern[($i + 1)]) === false) { - // This is the last token in the pattern, so just compare - // the next token of content. - $tokenContent = $tokens[$stackPtr]['content']; - } else { - // Get all the whitespace to the next token. - $next = $phpcsFile->findNext( - Tokens::$emptyTokens, - $stackPtr, - null, - true - ); - - $tokenContent = $phpcsFile->getTokensAsString( - $stackPtr, - ($next - $stackPtr) - ); - - $lastAddedStackPtr = $stackPtr; - $stackPtr = $next; - }//end if - - if ($stackPtr !== $lastAddedStackPtr) { - $found .= $tokenContent; - } - } else { - if ($stackPtr !== $lastAddedStackPtr) { - $found .= $tokens[$stackPtr]['content']; - $lastAddedStackPtr = $stackPtr; - } - }//end if - - if (isset($pattern[($i + 1)]) === true - && $pattern[($i + 1)]['type'] === 'skip' - ) { - // The next token is a skip token, so we just need to make - // sure the whitespace we found has *at least* the - // whitespace required. - if (strpos($tokenContent, $pattern[$i]['value']) !== 0) { - $hasError = true; - } - } else { - if ($tokenContent !== $pattern[$i]['value']) { - $hasError = true; - } - } - } else { - // Check to see if this important token is the same as the - // next important token in the pattern. If it is not, then - // the pattern cannot be for this piece of code. - $next = $phpcsFile->findNext( - $ignoreTokens, - $stackPtr, - null, - true - ); - - if ($next === false - || $tokens[$next]['code'] !== $pattern[$i]['token'] - ) { - // The next important token did not match the pattern. - return false; - } - - if ($lastAddedStackPtr !== null) { - if (($tokens[$next]['code'] === T_OPEN_CURLY_BRACKET - || $tokens[$next]['code'] === T_CLOSE_CURLY_BRACKET) - && isset($tokens[$next]['scope_condition']) === true - && $tokens[$next]['scope_condition'] > $lastAddedStackPtr - ) { - // This is a brace, but the owner of it is after the current - // token, which means it does not belong to any token in - // our pattern. This means the pattern is not for us. - return false; - } - - if (($tokens[$next]['code'] === T_OPEN_PARENTHESIS - || $tokens[$next]['code'] === T_CLOSE_PARENTHESIS) - && isset($tokens[$next]['parenthesis_owner']) === true - && $tokens[$next]['parenthesis_owner'] > $lastAddedStackPtr - ) { - // This is a bracket, but the owner of it is after the current - // token, which means it does not belong to any token in - // our pattern. This means the pattern is not for us. - return false; - } - }//end if - - // If we skipped past some whitespace tokens, then add them - // to the found string. - if (($next - $stackPtr) > 0) { - $hasComment = false; - for ($j = $stackPtr; $j < $next; $j++) { - $found .= $tokens[$j]['content']; - if (isset(Tokens::$commentTokens[$tokens[$j]['code']]) === true) { - $hasComment = true; - } - } - - // If we are not ignoring comments, this additional - // whitespace or comment is not allowed. If we are - // ignoring comments, there needs to be at least one - // comment for this to be allowed. - if ($this->ignoreComments === false - || ($this->ignoreComments === true - && $hasComment === false) - ) { - $hasError = true; - } - - // Even when ignoring comments, we are not allowed to include - // newlines without the pattern specifying them, so - // everything should be on the same line. - if ($tokens[$next]['line'] !== $tokens[$stackPtr]['line']) { - $hasError = true; - } - }//end if - - if ($next !== $lastAddedStackPtr) { - $found .= $tokens[$next]['content']; - $lastAddedStackPtr = $next; - } - - if (isset($pattern[($i + 1)]) === true - && $pattern[($i + 1)]['type'] === 'skip' - ) { - $stackPtr = $next; - } else { - $stackPtr = ($next + 1); - } - }//end if - } else if ($pattern[$i]['type'] === 'skip') { - if ($pattern[$i]['to'] === 'unknown') { - $next = $phpcsFile->findNext( - $pattern[($i + 1)]['token'], - $stackPtr - ); - - if ($next === false) { - // Couldn't find the next token, so we must - // be using the wrong pattern. - return false; - } - - $found .= '...'; - $stackPtr = $next; - } else { - // Find the previous opener. - $next = $phpcsFile->findPrevious( - Tokens::$blockOpeners, - $stackPtr - ); - - if ($next === false - || isset($tokens[$next][$pattern[$i]['to']]) === false - ) { - // If there was not opener, then we must - // be using the wrong pattern. - return false; - } - - $found .= '...'; - if ($pattern[$i]['to'] === 'parenthesis_closer') { - $found .= ')'; - } else { - $found .= '}'; - } - - // Skip to the closing token. - $stackPtr = ($tokens[$next][$pattern[$i]['to']] + 1); - }//end if - } else if ($pattern[$i]['type'] === 'string') { - if ($tokens[$stackPtr]['code'] !== T_STRING) { - $hasError = true; - } - - if ($stackPtr !== $lastAddedStackPtr) { - $found .= 'abc'; - $lastAddedStackPtr = $stackPtr; - } - - $stackPtr++; - } else if ($pattern[$i]['type'] === 'newline') { - // Find the next token that contains a newline character. - $newline = 0; - for ($j = $stackPtr; $j < $phpcsFile->numTokens; $j++) { - if (strpos($tokens[$j]['content'], $phpcsFile->eolChar) !== false) { - $newline = $j; - break; - } - } - - if ($newline === 0) { - // We didn't find a newline character in the rest of the file. - $next = ($phpcsFile->numTokens - 1); - $hasError = true; - } else { - if ($this->ignoreComments === false) { - // The newline character cannot be part of a comment. - if (isset(Tokens::$commentTokens[$tokens[$newline]['code']]) === true) { - $hasError = true; - } - } - - if ($newline === $stackPtr) { - $next = ($stackPtr + 1); - } else { - // Check that there were no significant tokens that we - // skipped over to find our newline character. - $next = $phpcsFile->findNext( - $ignoreTokens, - $stackPtr, - null, - true - ); - - if ($next < $newline) { - // We skipped a non-ignored token. - $hasError = true; - } else { - $next = ($newline + 1); - } - } - }//end if - - if ($stackPtr !== $lastAddedStackPtr) { - $found .= $phpcsFile->getTokensAsString( - $stackPtr, - ($next - $stackPtr) - ); - - $lastAddedStackPtr = ($next - 1); - } - - $stackPtr = $next; - }//end if - }//end for - - if ($hasError === true) { - $error = $this->prepareError($found, $patternCode); - $errors[$origStackPtr] = $error; - } - - return $errors; - - }//end processPattern() - - - /** - * Prepares an error for the specified patternCode. - * - * @param string $found The actual found string in the code. - * @param string $patternCode The expected pattern code. - * - * @return string The error message. - */ - protected function prepareError($found, $patternCode) - { - $found = str_replace("\r\n", '\n', $found); - $found = str_replace("\n", '\n', $found); - $found = str_replace("\r", '\n', $found); - $found = str_replace("\t", '\t', $found); - $found = str_replace('EOL', '\n', $found); - $expected = str_replace('EOL', '\n', $patternCode); - - $error = "Expected \"$expected\"; found \"$found\""; - - return $error; - - }//end prepareError() - - - /** - * Returns the patterns that should be checked. - * - * @return string[] - */ - abstract protected function getPatterns(); - - - /** - * Registers any supplementary tokens that this test might wish to process. - * - * A sniff may wish to register supplementary tests when it wishes to group - * an arbitrary validation that cannot be performed using a pattern, with - * other pattern tests. - * - * @return int[] - * @see processSupplementary() - */ - protected function registerSupplementary() - { - return []; - - }//end registerSupplementary() - - - /** - * Processes any tokens registered with registerSupplementary(). - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where to - * process the skip. - * @param int $stackPtr The position in the tokens stack to - * process. - * - * @return void - * @see registerSupplementary() - */ - protected function processSupplementary(File $phpcsFile, $stackPtr) - { - - }//end processSupplementary() - - - /** - * Parses a pattern string into an array of pattern steps. - * - * @param string $pattern The pattern to parse. - * - * @return array The parsed pattern array. - * @see createSkipPattern() - * @see createTokenPattern() - */ - private function parse($pattern) - { - $patterns = []; - $length = strlen($pattern); - $lastToken = 0; - $firstToken = 0; - - for ($i = 0; $i < $length; $i++) { - $specialPattern = false; - $isLastChar = ($i === ($length - 1)); - $oldFirstToken = $firstToken; - - if (substr($pattern, $i, 3) === '...') { - // It's a skip pattern. The skip pattern requires the - // content of the token in the "from" position and the token - // to skip to. - $specialPattern = $this->createSkipPattern($pattern, ($i - 1)); - $lastToken = ($i - $firstToken); - $firstToken = ($i + 3); - $i += 2; - - if ($specialPattern['to'] !== 'unknown') { - $firstToken++; - } - } else if (substr($pattern, $i, 3) === 'abc') { - $specialPattern = ['type' => 'string']; - $lastToken = ($i - $firstToken); - $firstToken = ($i + 3); - $i += 2; - } else if (substr($pattern, $i, 3) === 'EOL') { - $specialPattern = ['type' => 'newline']; - $lastToken = ($i - $firstToken); - $firstToken = ($i + 3); - $i += 2; - }//end if - - if ($specialPattern !== false || $isLastChar === true) { - // If we are at the end of the string, don't worry about a limit. - if ($isLastChar === true) { - // Get the string from the end of the last skip pattern, if any, - // to the end of the pattern string. - $str = substr($pattern, $oldFirstToken); - } else { - // Get the string from the end of the last special pattern, - // if any, to the start of this special pattern. - if ($lastToken === 0) { - // Note that if the last special token was zero characters ago, - // there will be nothing to process so we can skip this bit. - // This happens if you have something like: EOL... in your pattern. - $str = ''; - } else { - $str = substr($pattern, $oldFirstToken, $lastToken); - } - } - - if ($str !== '') { - $tokenPatterns = $this->createTokenPattern($str); - foreach ($tokenPatterns as $tokenPattern) { - $patterns[] = $tokenPattern; - } - } - - // Make sure we don't skip the last token. - if ($isLastChar === false && $i === ($length - 1)) { - $i--; - } - }//end if - - // Add the skip pattern *after* we have processed - // all the tokens from the end of the last skip pattern - // to the start of this skip pattern. - if ($specialPattern !== false) { - $patterns[] = $specialPattern; - } - }//end for - - return $patterns; - - }//end parse() - - - /** - * Creates a skip pattern. - * - * @param string $pattern The pattern being parsed. - * @param int $from The token position that the skip pattern starts from. - * - * @return array The pattern step. - * @see createTokenPattern() - * @see parse() - */ - private function createSkipPattern($pattern, $from) - { - $skip = ['type' => 'skip']; - - $nestedParenthesis = 0; - $nestedBraces = 0; - for ($start = $from; $start >= 0; $start--) { - switch ($pattern[$start]) { - case '(': - if ($nestedParenthesis === 0) { - $skip['to'] = 'parenthesis_closer'; - } - - $nestedParenthesis--; - break; - case '{': - if ($nestedBraces === 0) { - $skip['to'] = 'scope_closer'; - } - - $nestedBraces--; - break; - case '}': - $nestedBraces++; - break; - case ')': - $nestedParenthesis++; - break; - }//end switch - - if (isset($skip['to']) === true) { - break; - } - }//end for - - if (isset($skip['to']) === false) { - $skip['to'] = 'unknown'; - } - - return $skip; - - }//end createSkipPattern() - - - /** - * Creates a token pattern. - * - * @param string $str The tokens string that the pattern should match. - * - * @return array The pattern step. - * @see createSkipPattern() - * @see parse() - */ - private function createTokenPattern($str) - { - // Don't add a space after the closing php tag as it will add a new - // whitespace token. - $tokenizer = new PHP('', null); - - // Remove the getTokens(); - $tokens = array_slice($tokens, 1, (count($tokens) - 2)); - - $patterns = []; - foreach ($tokens as $patternInfo) { - $patterns[] = [ - 'type' => 'token', - 'token' => $patternInfo['code'], - 'value' => $patternInfo['content'], - ]; - } - - return $patterns; - - }//end createTokenPattern() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Sniffs/AbstractScopeSniff.php b/vendor/squizlabs/php_codesniffer/src/Sniffs/AbstractScopeSniff.php deleted file mode 100644 index 13067b7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Sniffs/AbstractScopeSniff.php +++ /dev/null @@ -1,189 +0,0 @@ - - * class ClassScopeTest extends PHP_CodeSniffer_Standards_AbstractScopeSniff - * { - * public function __construct() - * { - * parent::__construct(array(T_CLASS), array(T_FUNCTION)); - * } - * - * protected function processTokenWithinScope(\PHP_CodeSniffer\Files\File $phpcsFile, $stackPtr, $currScope) - * { - * $className = $phpcsFile->getDeclarationName($currScope); - * $phpcsFile->addWarning('encountered a method within class '.$className, $stackPtr, 'MethodFound'); - * } - * } - * - * - * @author Greg Sherwood - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Sniffs; - -use PHP_CodeSniffer\Exceptions\RuntimeException; -use PHP_CodeSniffer\Files\File; - -abstract class AbstractScopeSniff implements Sniff -{ - - /** - * The token types that this test wishes to listen to within the scope. - * - * @var array - */ - private $tokens = []; - - /** - * The type of scope opener tokens that this test wishes to listen to. - * - * @var array - */ - private $scopeTokens = []; - - /** - * True if this test should fire on tokens outside of the scope. - * - * @var boolean - */ - private $listenOutside = false; - - - /** - * Constructs a new AbstractScopeTest. - * - * @param array $scopeTokens The type of scope the test wishes to listen to. - * @param array $tokens The tokens that the test wishes to listen to - * within the scope. - * @param boolean $listenOutside If true this test will also alert the - * extending class when a token is found outside - * the scope, by calling the - * processTokenOutsideScope method. - * - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If the specified tokens arrays are empty - * or invalid. - */ - public function __construct( - array $scopeTokens, - array $tokens, - $listenOutside=false - ) { - if (empty($scopeTokens) === true) { - $error = 'The scope tokens list cannot be empty'; - throw new RuntimeException($error); - } - - if (empty($tokens) === true) { - $error = 'The tokens list cannot be empty'; - throw new RuntimeException($error); - } - - $invalidScopeTokens = array_intersect($scopeTokens, $tokens); - if (empty($invalidScopeTokens) === false) { - $invalid = implode(', ', $invalidScopeTokens); - $error = "Scope tokens [$invalid] can't be in the tokens array"; - throw new RuntimeException($error); - } - - $this->listenOutside = $listenOutside; - $this->scopeTokens = array_flip($scopeTokens); - $this->tokens = $tokens; - - }//end __construct() - - - /** - * The method that is called to register the tokens this test wishes to - * listen to. - * - * DO NOT OVERRIDE THIS METHOD. Use the constructor of this class to register - * for the desired tokens and scope. - * - * @return array - * @see __constructor() - */ - final public function register() - { - return $this->tokens; - - }//end register() - - - /** - * Processes the tokens that this test is listening for. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position in the stack where this - * token was found. - * - * @return void|int Optionally returns a stack pointer. The sniff will not be - * called again on the current file until the returned stack - * pointer is reached. Return `$phpcsFile->numTokens` to skip - * the rest of the file. - * @see processTokenWithinScope() - */ - final public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $foundScope = false; - $skipTokens = []; - foreach ($tokens[$stackPtr]['conditions'] as $scope => $code) { - if (isset($this->scopeTokens[$code]) === true) { - $skipTokens[] = $this->processTokenWithinScope($phpcsFile, $stackPtr, $scope); - $foundScope = true; - } - } - - if ($this->listenOutside === true && $foundScope === false) { - $skipTokens[] = $this->processTokenOutsideScope($phpcsFile, $stackPtr); - } - - if (empty($skipTokens) === false) { - return min($skipTokens); - } - - }//end process() - - - /** - * Processes a token that is found within the scope that this test is - * listening to. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position in the stack where this - * token was found. - * @param int $currScope The position in the tokens array that - * opened the scope that this test is - * listening for. - * - * @return void|int Optionally returns a stack pointer. The sniff will not be - * called again on the current file until the returned stack - * pointer is reached. Return `$phpcsFile->numTokens` to skip - * the rest of the file. - */ - abstract protected function processTokenWithinScope(File $phpcsFile, $stackPtr, $currScope); - - - /** - * Processes a token that is found outside the scope that this test is - * listening to. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position in the stack where this - * token was found. - * - * @return void|int Optionally returns a stack pointer. The sniff will not be - * called again on the current file until the returned stack - * pointer is reached. Return `$phpcsFile->numTokens` to skip - * the rest of the file. - */ - abstract protected function processTokenOutsideScope(File $phpcsFile, $stackPtr); - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Sniffs/AbstractVariableSniff.php b/vendor/squizlabs/php_codesniffer/src/Sniffs/AbstractVariableSniff.php deleted file mode 100644 index 4a341c5..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Sniffs/AbstractVariableSniff.php +++ /dev/null @@ -1,230 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Sniffs; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; - -abstract class AbstractVariableSniff extends AbstractScopeSniff -{ - - /** - * List of PHP Reserved variables. - * - * Used by various naming convention sniffs. - * - * @var array - */ - protected $phpReservedVars = [ - '_SERVER' => true, - '_GET' => true, - '_POST' => true, - '_REQUEST' => true, - '_SESSION' => true, - '_ENV' => true, - '_COOKIE' => true, - '_FILES' => true, - 'GLOBALS' => true, - 'http_response_header' => true, - 'HTTP_RAW_POST_DATA' => true, - 'php_errormsg' => true, - ]; - - - /** - * Constructs an AbstractVariableTest. - */ - public function __construct() - { - $scopes = Tokens::$ooScopeTokens; - - $listen = [ - T_VARIABLE, - T_DOUBLE_QUOTED_STRING, - T_HEREDOC, - ]; - - parent::__construct($scopes, $listen, true); - - }//end __construct() - - - /** - * Processes the token in the specified PHP_CodeSniffer\Files\File. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where this - * token was found. - * @param int $stackPtr The position where the token was found. - * @param int $currScope The current scope opener token. - * - * @return void|int Optionally returns a stack pointer. The sniff will not be - * called again on the current file until the returned stack - * pointer is reached. Return `$phpcsFile->numTokens` to skip - * the rest of the file. - */ - final protected function processTokenWithinScope(File $phpcsFile, $stackPtr, $currScope) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['code'] === T_DOUBLE_QUOTED_STRING - || $tokens[$stackPtr]['code'] === T_HEREDOC - ) { - // Check to see if this string has a variable in it. - $pattern = '|(?processVariableInString($phpcsFile, $stackPtr); - } - - return; - } - - // If this token is nested inside a function at a deeper - // level than the current OO scope that was found, it's a normal - // variable and not a member var. - $conditions = array_reverse($tokens[$stackPtr]['conditions'], true); - $inFunction = false; - foreach ($conditions as $scope => $code) { - if (isset(Tokens::$ooScopeTokens[$code]) === true) { - break; - } - - if ($code === T_FUNCTION || $code === T_CLOSURE) { - $inFunction = true; - } - } - - if ($scope !== $currScope) { - // We found a closer scope to this token, so ignore - // this particular time through the sniff. We will process - // this token when this closer scope is found to avoid - // duplicate checks. - return; - } - - // Just make sure this isn't a variable in a function declaration. - if ($inFunction === false && isset($tokens[$stackPtr]['nested_parenthesis']) === true) { - foreach ($tokens[$stackPtr]['nested_parenthesis'] as $opener => $closer) { - if (isset($tokens[$opener]['parenthesis_owner']) === false) { - // Check if this is a USE statement for a closure. - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($opener - 1), null, true); - if ($tokens[$prev]['code'] === T_USE) { - $inFunction = true; - break; - } - - continue; - } - - $owner = $tokens[$opener]['parenthesis_owner']; - if ($tokens[$owner]['code'] === T_FUNCTION - || $tokens[$owner]['code'] === T_CLOSURE - ) { - $inFunction = true; - break; - } - } - }//end if - - if ($inFunction === true) { - return $this->processVariable($phpcsFile, $stackPtr); - } else { - return $this->processMemberVar($phpcsFile, $stackPtr); - } - - }//end processTokenWithinScope() - - - /** - * Processes the token outside the scope in the file. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where this - * token was found. - * @param int $stackPtr The position where the token was found. - * - * @return void|int Optionally returns a stack pointer. The sniff will not be - * called again on the current file until the returned stack - * pointer is reached. Return `$phpcsFile->numTokens` to skip - * the rest of the file. - */ - final protected function processTokenOutsideScope(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - // These variables are not member vars. - if ($tokens[$stackPtr]['code'] === T_VARIABLE) { - return $this->processVariable($phpcsFile, $stackPtr); - } else if ($tokens[$stackPtr]['code'] === T_DOUBLE_QUOTED_STRING - || $tokens[$stackPtr]['code'] === T_HEREDOC - ) { - // Check to see if this string has a variable in it. - $pattern = '|(?processVariableInString($phpcsFile, $stackPtr); - } - } - - }//end processTokenOutsideScope() - - - /** - * Called to process class member vars. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where this - * token was found. - * @param int $stackPtr The position where the token was found. - * - * @return void|int Optionally returns a stack pointer. The sniff will not be - * called again on the current file until the returned stack - * pointer is reached. Return `$phpcsFile->numTokens` to skip - * the rest of the file. - */ - abstract protected function processMemberVar(File $phpcsFile, $stackPtr); - - - /** - * Called to process normal member vars. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where this - * token was found. - * @param int $stackPtr The position where the token was found. - * - * @return void|int Optionally returns a stack pointer. The sniff will not be - * called again on the current file until the returned stack - * pointer is reached. Return `$phpcsFile->numTokens` to skip - * the rest of the file. - */ - abstract protected function processVariable(File $phpcsFile, $stackPtr); - - - /** - * Called to process variables found in double quoted strings or heredocs. - * - * Note that there may be more than one variable in the string, which will - * result only in one call for the string or one call per line for heredocs. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where this - * token was found. - * @param int $stackPtr The position where the double quoted - * string was found. - * - * @return void|int Optionally returns a stack pointer. The sniff will not be - * called again on the current file until the returned stack - * pointer is reached. Return `$phpcsFile->numTokens` to skip - * the rest of the file. - */ - abstract protected function processVariableInString(File $phpcsFile, $stackPtr); - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Sniffs/DeprecatedSniff.php b/vendor/squizlabs/php_codesniffer/src/Sniffs/DeprecatedSniff.php deleted file mode 100644 index 9daa4a1..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Sniffs/DeprecatedSniff.php +++ /dev/null @@ -1,63 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Sniffs; - -interface DeprecatedSniff -{ - - - /** - * Provide the version number in which the sniff was deprecated. - * - * Recommended format for PHPCS native sniffs: "v3.3.0". - * Recommended format for external sniffs: "StandardName v3.3.0". - * - * @return string - */ - public function getDeprecationVersion(); - - - /** - * Provide the version number in which the sniff will be removed. - * - * Recommended format for PHPCS native sniffs: "v3.3.0". - * Recommended format for external sniffs: "StandardName v3.3.0". - * - * If the removal version is not yet known, it is recommended to set - * this to: "a future version". - * - * @return string - */ - public function getRemovalVersion(); - - - /** - * Optionally provide an arbitrary custom message to display with the deprecation. - * - * Typically intended to allow for displaying information about what to - * replace the deprecated sniff with. - * Example: "Use the Stnd.Cat.SniffName sniff instead." - * Multi-line messages (containing new line characters) are supported. - * - * An empty string can be returned if there is no replacement/no need - * for a custom message. - * - * @return string - */ - public function getDeprecationMessage(); - - -}//end interface diff --git a/vendor/squizlabs/php_codesniffer/src/Sniffs/Sniff.php b/vendor/squizlabs/php_codesniffer/src/Sniffs/Sniff.php deleted file mode 100644 index 760a297..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Sniffs/Sniff.php +++ /dev/null @@ -1,80 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Sniffs; - -use PHP_CodeSniffer\Files\File; - -interface Sniff -{ - - - /** - * Registers the tokens that this sniff wants to listen for. - * - * An example return value for a sniff that wants to listen for whitespace - * and any comments would be: - * - * - * return array( - * T_WHITESPACE, - * T_DOC_COMMENT, - * T_COMMENT, - * ); - * - * - * @return array - * @see Tokens.php - */ - public function register(); - - - /** - * Called when one of the token types that this sniff is listening for - * is found. - * - * The stackPtr variable indicates where in the stack the token was found. - * A sniff can acquire information about this token, along with all the other - * tokens within the stack by first acquiring the token stack: - * - * - * $tokens = $phpcsFile->getTokens(); - * echo 'Encountered a '.$tokens[$stackPtr]['type'].' token'; - * echo 'token information: '; - * print_r($tokens[$stackPtr]); - * - * - * If the sniff discovers an anomaly in the code, they can raise an error - * by calling addError() on the \PHP_CodeSniffer\Files\File object, specifying an error - * message and the position of the offending token: - * - * - * $phpcsFile->addError('Encountered an error', $stackPtr); - * - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where the - * token was found. - * @param int $stackPtr The position in the PHP_CodeSniffer - * file's token stack where the token - * was found. - * - * @return void|int Optionally returns a stack pointer. The sniff will not be - * called again on the current file until the returned stack - * pointer is reached. Return `$phpcsFile->numTokens` to skip - * the rest of the file. - */ - public function process(File $phpcsFile, $stackPtr); - - -}//end interface diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Arrays/ArrayIndentStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Arrays/ArrayIndentStandard.xml deleted file mode 100644 index 0312a70..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Arrays/ArrayIndentStandard.xml +++ /dev/null @@ -1,107 +0,0 @@ - - - - - - - [ - 1, - 2, -]; - -if ($condition) { - $a = - [ - 1, - 2, - ]; -} - - ]]> - - - [ - 1, - 2, - ]; -} - ]]> - - - - - - - - 1, - 2, - 3, -); - ]]> - - - 1, - 2, - 3, -); - ]]> - - - - - - - - -]; - ]]> - - - ]; - ]]> - - - - - - - - ); - ]]> - - - ); - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Arrays/DisallowLongArraySyntaxStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Arrays/DisallowLongArraySyntaxStandard.xml deleted file mode 100644 index 21b0d27..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Arrays/DisallowLongArraySyntaxStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - [ - 'foo' => 'bar', -]; - ]]> - - - array( - 'foo' => 'bar', -); - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Arrays/DisallowShortArraySyntaxStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Arrays/DisallowShortArraySyntaxStandard.xml deleted file mode 100644 index f24767c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Arrays/DisallowShortArraySyntaxStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - array( - 'foo' => 'bar', -); - ]]> - - - [ - 'foo' => 'bar', -]; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Classes/DuplicateClassNameStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Classes/DuplicateClassNameStandard.xml deleted file mode 100644 index 4b0ec96..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Classes/DuplicateClassNameStandard.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - Foo -{ -} - ]]> - - - Foo -{ -} - -class Foo -{ -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Classes/OpeningBraceSameLineStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Classes/OpeningBraceSameLineStandard.xml deleted file mode 100644 index 6fa08be..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Classes/OpeningBraceSameLineStandard.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - { -} - ]]> - - - { -} - ]]> - - - - - { -} - ]]> - - - // Start of class. -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/AssignmentInConditionStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/AssignmentInConditionStandard.xml deleted file mode 100644 index 9961ea0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/AssignmentInConditionStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - $test === 'abc') { - // Code. -} - ]]> - - - $test = 'abc') { - // Code. -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/EmptyPHPStatementStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/EmptyPHPStatementStandard.xml deleted file mode 100644 index 6b96c82..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/EmptyPHPStatementStandard.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - echo 'Hello World'; ?> -'Hello World'; ?> - ]]> - - - ; ?> - ?> - ]]> - - - - - - - - ; -if (true) { - echo 'Hello World'; -} - ]]> - - - ;;; -if (true) { - echo 'Hello World'; -}; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/EmptyStatementStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/EmptyStatementStandard.xml deleted file mode 100644 index c400d75..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/EmptyStatementStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - // do nothing -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/ForLoopShouldBeWhileLoopStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/ForLoopShouldBeWhileLoopStandard.xml deleted file mode 100644 index 06f0b7a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/ForLoopShouldBeWhileLoopStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - $i = 0; $i < 10; $i++) { - echo "{$i}\n"; -} - ]]> - - - ;$test;) { - $test = doSomething(); -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/ForLoopWithTestFunctionCallStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/ForLoopWithTestFunctionCallStandard.xml deleted file mode 100644 index f40d94b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/ForLoopWithTestFunctionCallStandard.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - $end = count($foo); -for ($i = 0; $i < $end; $i++) { - echo $foo[$i]."\n"; -} - ]]> - - - count($foo); $i++) { - echo $foo[$i]."\n"; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/JumbledIncrementerStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/JumbledIncrementerStandard.xml deleted file mode 100644 index 50f0782..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/JumbledIncrementerStandard.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - $i++) { - for ($j = 0; $j < 10; $j++) { - } -} - ]]> - - - $i++) { - for ($j = 0; $j < 10; $i++) { - } -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/RequireExplicitBooleanOperatorPrecedenceStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/RequireExplicitBooleanOperatorPrecedenceStandard.xml deleted file mode 100644 index 006dbff..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/RequireExplicitBooleanOperatorPrecedenceStandard.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - ($one && $two) || $three; -$result2 = $one && ($two || $three); -$result3 = ($one && !$two) xor $three; -$result4 = $one && (!$two xor $three); - -if ( - ($result && !$result3) - || (!$result && $result3) -) {} - ]]> - - - $one && $two || $three; - -$result3 = $one && !$two xor $three; - - -if ( - $result && !$result3 - || !$result && $result3 -) {} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/UnconditionalIfStatementStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/UnconditionalIfStatementStandard.xml deleted file mode 100644 index b2eaabe..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/UnconditionalIfStatementStandard.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - $test) { - $var = 1; -} - ]]> - - - true) { - $var = 1; -} - ]]> - - - - - $test) { - $var = 1; -} - ]]> - - - false) { - $var = 1; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/UnnecessaryFinalModifierStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/UnnecessaryFinalModifierStandard.xml deleted file mode 100644 index 8936740..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/UnnecessaryFinalModifierStandard.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - final function bar() - { - } -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/UnusedFunctionParameterStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/UnusedFunctionParameterStandard.xml deleted file mode 100644 index 181dff4..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/UnusedFunctionParameterStandard.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - $a + $b + $c; -} - ]]> - - - $a + $b; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/UselessOverridingMethodStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/UselessOverridingMethodStandard.xml deleted file mode 100644 index ade3419..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/CodeAnalysis/UselessOverridingMethodStandard.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - $this->doSomethingElse(); - } -} - ]]> - - - parent::bar(); - } -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Commenting/DocCommentStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Commenting/DocCommentStandard.xml deleted file mode 100644 index bbeb4f6..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Commenting/DocCommentStandard.xml +++ /dev/null @@ -1,269 +0,0 @@ - - - - - - - - - - Some content. - */ - ]]> - - - - */ - ]]> - - - - - - - - /** - * Short description. - */ - ]]> - - - /** Short description. */ - ]]> - - - - - - - - Short description. - */ - ]]> - - - @return int - */ - -/** - * - * Short description. - */ - ]]> - - - - - - - - Short description. - * - * Long description. - */ - ]]> - - - short description. - * - * long description. - */ - ]]> - - - - - - - - * - * Long description. - * - * @param int $foo - */ - ]]> - - - * - * - - * Long description. - * @param int $foo - */ - ]]> - - - - - - - - * @param int $foo - * @param string $bar - */ - ]]> - - - * - * @param string $bar - */ - ]]> - - - - - - - - * @param int $foo - * - * @since 3.4.8 - * @deprecated 6.0.0 - */ - ]]> - - - * @param int $foo - * @since 3.4.8 - * @deprecated 6.0.0 - */ - ]]> - - - - - - - - 0.5.0 - * @deprecated 1.0.0 - */ - ]]> - - - 0.5.0 - * @deprecated 1.0.0 - */ - ]]> - - - - - - - - @param string $foo - * - * @return void - */ - ]]> - - - @param string $bar - */ - ]]> - - - - - - - - - */ - ]]> - - - * - */ - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Commenting/FixmeStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Commenting/FixmeStandard.xml deleted file mode 100644 index 174c6b0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Commenting/FixmeStandard.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - Handle strange case -if ($test) { - $var = 1; -} - ]]> - - - FIXME: This needs to be fixed! -if ($test) { - $var = 1; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Commenting/TodoStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Commenting/TodoStandard.xml deleted file mode 100644 index c9c4fc0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Commenting/TodoStandard.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - Handle strange case -if ($test) { - $var = 1; -} - ]]> - - - TODO: This needs to be fixed! -if ($test) { - $var = 1; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/ControlStructures/DisallowYodaConditionsStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/ControlStructures/DisallowYodaConditionsStandard.xml deleted file mode 100644 index 651cc70..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/ControlStructures/DisallowYodaConditionsStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - { - $var = 1; -} - ]]> - - - { - $var = 1; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/ControlStructures/InlineControlStructureStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/ControlStructures/InlineControlStructureStandard.xml deleted file mode 100644 index 06ae14b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/ControlStructures/InlineControlStructureStandard.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - { - $var = 1; -} - ]]> - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Debug/CSSLintStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Debug/CSSLintStandard.xml deleted file mode 100644 index b57a970..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Debug/CSSLintStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - %; } - ]]> - - - %; } - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Debug/ClosureLinterStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Debug/ClosureLinterStandard.xml deleted file mode 100644 index 9df9aec..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Debug/ClosureLinterStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - ]; - ]]> - - - ,]; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Debug/JSHintStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Debug/JSHintStandard.xml deleted file mode 100644 index 7525e9e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Debug/JSHintStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - var foo = 5; - ]]> - - - foo = 5; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/ByteOrderMarkStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/ByteOrderMarkStandard.xml deleted file mode 100644 index 88591f9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/ByteOrderMarkStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/EndFileNewlineStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/EndFileNewlineStandard.xml deleted file mode 100644 index aa757ed..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/EndFileNewlineStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/EndFileNoNewlineStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/EndFileNoNewlineStandard.xml deleted file mode 100644 index 227d562..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/EndFileNoNewlineStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/ExecutableFileStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/ExecutableFileStandard.xml deleted file mode 100644 index 6114f24..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/ExecutableFileStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/InlineHTMLStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/InlineHTMLStandard.xml deleted file mode 100644 index 3c137a9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/InlineHTMLStandard.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - some string here - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/LineEndingsStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/LineEndingsStandard.xml deleted file mode 100644 index 4554d0f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/LineEndingsStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/LineLengthStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/LineLengthStandard.xml deleted file mode 100644 index 31342e3..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/LineLengthStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/LowercasedFilenameStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/LowercasedFilenameStandard.xml deleted file mode 100644 index a1be34c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/LowercasedFilenameStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/OneClassPerFileStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/OneClassPerFileStandard.xml deleted file mode 100644 index 7b58576..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/OneClassPerFileStandard.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - class Foo -{ -} - ]]> - - - class Foo -{ -} - -class Bar -{ -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/OneInterfacePerFileStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/OneInterfacePerFileStandard.xml deleted file mode 100644 index de97531..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/OneInterfacePerFileStandard.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - interface Foo -{ -} - ]]> - - - interface Foo -{ -} - -interface Bar -{ -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/OneObjectStructurePerFileStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/OneObjectStructurePerFileStandard.xml deleted file mode 100644 index 4d957e7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/OneObjectStructurePerFileStandard.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - trait Foo -{ -} - ]]> - - - trait Foo -{ -} - -class Bar -{ -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/OneTraitPerFileStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/OneTraitPerFileStandard.xml deleted file mode 100644 index 58a6482..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Files/OneTraitPerFileStandard.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - trait Foo -{ -} - ]]> - - - trait Foo -{ -} - -trait Bar -{ -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/DisallowMultipleStatementsStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/DisallowMultipleStatementsStandard.xml deleted file mode 100644 index f0d4490..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/DisallowMultipleStatementsStandard.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/MultipleStatementAlignmentStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/MultipleStatementAlignmentStandard.xml deleted file mode 100644 index 09df3b7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/MultipleStatementAlignmentStandard.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - = (1 + 2); -$veryLongVarName = 'string'; -$var = foo($bar, $baz); - ]]> - - - = (1 + 2); -$veryLongVarName = 'string'; -$var = foo($bar, $baz); - ]]> - - - - - - - - += 1; -$veryLongVarName = 1; - ]]> - - - += 1; -$veryLongVarName = 1; - ]]> - - - - - = 1; -$veryLongVarName -= 1; - ]]> - - - = 1; -$veryLongVarName -= 1; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/NoSpaceAfterCastStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/NoSpaceAfterCastStandard.xml deleted file mode 100644 index 80b932d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/NoSpaceAfterCastStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - 1; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/SpaceAfterCastStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/SpaceAfterCastStandard.xml deleted file mode 100644 index 0563bb2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/SpaceAfterCastStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - 1; - ]]> - - - 1; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/SpaceAfterNotStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/SpaceAfterNotStandard.xml deleted file mode 100644 index aea8636..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/SpaceAfterNotStandard.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - $someVar || ! $x instanceOf stdClass) {}; - ]]> - - - $someVar || !$x instanceOf stdClass) {}; - -if (! $someVar || ! - $x instanceOf stdClass) {}; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/SpaceBeforeCastStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/SpaceBeforeCastStandard.xml deleted file mode 100644 index 09fbc18..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Formatting/SpaceBeforeCastStandard.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - (int) $string; -$c = $a . (string) $b; - ]]> - - - (int) $string; -$c = $a . (string) $b; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Functions/CallTimePassByReferenceStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Functions/CallTimePassByReferenceStandard.xml deleted file mode 100644 index 738998d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Functions/CallTimePassByReferenceStandard.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - &$bar) -{ - $bar++; -} - -$baz = 1; -foo($baz); - ]]> - - - &$baz); - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Functions/FunctionCallArgumentSpacingStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Functions/FunctionCallArgumentSpacingStandard.xml deleted file mode 100644 index a133451..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Functions/FunctionCallArgumentSpacingStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - $baz); - ]]> - - - ,$baz); - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Functions/OpeningFunctionBraceBsdAllmanStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Functions/OpeningFunctionBraceBsdAllmanStandard.xml deleted file mode 100644 index 9eea8ca..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Functions/OpeningFunctionBraceBsdAllmanStandard.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - { - // Do something -} - ]]> - - - { - // Do something -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Functions/OpeningFunctionBraceKernighanRitchieStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Functions/OpeningFunctionBraceKernighanRitchieStandard.xml deleted file mode 100644 index 2d5d0ed..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Functions/OpeningFunctionBraceKernighanRitchieStandard.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - { - // Do something. -} - ]]> - - - { - // Do something. -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Metrics/CyclomaticComplexityStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Metrics/CyclomaticComplexityStandard.xml deleted file mode 100644 index a928e7d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Metrics/CyclomaticComplexityStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Metrics/NestingLevelStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Metrics/NestingLevelStandard.xml deleted file mode 100644 index f66cd92..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Metrics/NestingLevelStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/NamingConventions/AbstractClassNamePrefixStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/NamingConventions/AbstractClassNamePrefixStandard.xml deleted file mode 100644 index e9e61dd..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/NamingConventions/AbstractClassNamePrefixStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - AbstractBar -{ -} - ]]> - - - Bar -{ -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/NamingConventions/CamelCapsFunctionNameStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/NamingConventions/CamelCapsFunctionNameStandard.xml deleted file mode 100644 index f5345b7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/NamingConventions/CamelCapsFunctionNameStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - doSomething() -{ -} - ]]> - - - do_something() -{ -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/NamingConventions/ConstructorNameStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/NamingConventions/ConstructorNameStandard.xml deleted file mode 100644 index 9dfc175..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/NamingConventions/ConstructorNameStandard.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - __construct() - { - } -} - ]]> - - - Foo() - { - } -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/NamingConventions/InterfaceNameSuffixStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/NamingConventions/InterfaceNameSuffixStandard.xml deleted file mode 100644 index bf1a707..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/NamingConventions/InterfaceNameSuffixStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - BarInterface -{ -} - ]]> - - - Bar -{ -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/NamingConventions/TraitNameSuffixStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/NamingConventions/TraitNameSuffixStandard.xml deleted file mode 100644 index fb5f2e6..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/NamingConventions/TraitNameSuffixStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - BarTrait -{ -} - ]]> - - - Bar -{ -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/NamingConventions/UpperCaseConstantNameStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/NamingConventions/UpperCaseConstantNameStandard.xml deleted file mode 100644 index 22c2f6b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/NamingConventions/UpperCaseConstantNameStandard.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - FOO_CONSTANT', 'foo'); - -class FooClass -{ - const FOO_CONSTANT = 'foo'; -} - ]]> - - - Foo_Constant', 'foo'); - -class FooClass -{ - const foo_constant = 'foo'; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/BacktickOperatorStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/BacktickOperatorStandard.xml deleted file mode 100644 index 4ebd677..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/BacktickOperatorStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/CharacterBeforePHPOpeningTagStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/CharacterBeforePHPOpeningTagStandard.xml deleted file mode 100644 index 494a5d7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/CharacterBeforePHPOpeningTagStandard.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - Beginning content - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/ClosingPHPTagStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/ClosingPHPTagStandard.xml deleted file mode 100644 index f0c8e52..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/ClosingPHPTagStandard.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - -echo 'Foo'; -?> - ]]> - - - -echo 'Foo'; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DeprecatedFunctionsStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DeprecatedFunctionsStandard.xml deleted file mode 100644 index 33b803a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DeprecatedFunctionsStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - explode('a', $bar); - ]]> - - - split('a', $bar); - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DisallowAlternativePHPTagsStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DisallowAlternativePHPTagsStandard.xml deleted file mode 100644 index bdfd5dc..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DisallowAlternativePHPTagsStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - to delimit PHP code, do not use the ASP <% %> style tags nor the tags. This is the most portable way to include PHP code on differing operating systems and setups. - ]]> - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DisallowRequestSuperglobalStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DisallowRequestSuperglobalStandard.xml deleted file mode 100644 index 519d7f5..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DisallowRequestSuperglobalStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DisallowShortOpenTagStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DisallowShortOpenTagStandard.xml deleted file mode 100644 index 8086ea2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DisallowShortOpenTagStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - to delimit PHP code, not the shorthand. This is the most portable way to include PHP code on differing operating systems and setups. - ]]> - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DiscourageGotoStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DiscourageGotoStandard.xml deleted file mode 100644 index 83bceef..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/DiscourageGotoStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/ForbiddenFunctionsStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/ForbiddenFunctionsStandard.xml deleted file mode 100644 index c0f18b5..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/ForbiddenFunctionsStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - count($bar); - ]]> - - - sizeof($bar); - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/LowerCaseConstantStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/LowerCaseConstantStandard.xml deleted file mode 100644 index d4aac80..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/LowerCaseConstantStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - true, false and null constants must always be lowercase. - ]]> - - - - false || $var === null) { - $var = true; -} - ]]> - - - FALSE || $var === NULL) { - $var = TRUE; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/LowerCaseKeywordStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/LowerCaseKeywordStandard.xml deleted file mode 100644 index 965742d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/LowerCaseKeywordStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - array(); - ]]> - - - Array(); - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/LowerCaseTypeStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/LowerCaseTypeStandard.xml deleted file mode 100644 index f38df3a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/LowerCaseTypeStandard.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - Int $foo) : STRING { -} - ]]> - - - - - - - - - - - (BOOL) $isValid; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/NoSilencedErrorsStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/NoSilencedErrorsStandard.xml deleted file mode 100644 index df69887..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/NoSilencedErrorsStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - isset($foo) && $foo) { - echo "Hello\n"; -} - ]]> - - - @$foo) { - echo "Hello\n"; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/RequireStrictTypesStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/RequireStrictTypesStandard.xml deleted file mode 100644 index dc72430..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/RequireStrictTypesStandard.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - strict_types=1); - -declare(encoding='UTF-8', strict_types=0); - ]]> - - - ); - ]]> - - - - - - - - 1); - ]]> - - - 0); - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/SAPIUsageStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/SAPIUsageStandard.xml deleted file mode 100644 index 989827e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/SAPIUsageStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - PHP_SAPI === 'cli') { - echo "Hello, CLI user."; -} - ]]> - - - php_sapi_name() === 'cli') { - echo "Hello, CLI user."; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/SyntaxStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/SyntaxStandard.xml deleted file mode 100644 index 1c2457d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/SyntaxStandard.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - echo "Hello!"; -$array = [1, 2, 3]; - ]]> - - - // Missing semicolon. -$array = [1, 2, 3; // Missing closing bracket. - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/UpperCaseConstantStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/UpperCaseConstantStandard.xml deleted file mode 100644 index 2cc1df2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/PHP/UpperCaseConstantStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - true, false and null constants must always be uppercase. - ]]> - - - - FALSE || $var === NULL) { - $var = TRUE; -} - ]]> - - - false || $var === null) { - $var = true; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Strings/UnnecessaryHeredocStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Strings/UnnecessaryHeredocStandard.xml deleted file mode 100644 index e0ca14f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Strings/UnnecessaryHeredocStandard.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - <<<'EOD' -some text -EOD; - ]]> - - - << -some text -EOD; - ]]> - - - - - <<<"EOD" -some $text -EOD; - ]]> - - - <<<"EOD" -some text -EOD; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Strings/UnnecessaryStringConcatStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Strings/UnnecessaryStringConcatStandard.xml deleted file mode 100644 index a4c9887..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/Strings/UnnecessaryStringConcatStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/VersionControl/SubversionPropertiesStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/VersionControl/SubversionPropertiesStandard.xml deleted file mode 100644 index c38ae4c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/VersionControl/SubversionPropertiesStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/ArbitraryParenthesesSpacingStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/ArbitraryParenthesesSpacingStandard.xml deleted file mode 100644 index d65c93a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/ArbitraryParenthesesSpacingStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/DisallowSpaceIndentStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/DisallowSpaceIndentStandard.xml deleted file mode 100644 index 2e399b3..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/DisallowSpaceIndentStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/DisallowTabIndentStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/DisallowTabIndentStandard.xml deleted file mode 100644 index 7013ffd..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/DisallowTabIndentStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/HereNowdocIdentifierSpacingStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/HereNowdocIdentifierSpacingStandard.xml deleted file mode 100644 index 66759bf..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/HereNowdocIdentifierSpacingStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - << -some text -EOD; - ]]> - - - <<< END -some text -END; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/IncrementDecrementSpacingStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/IncrementDecrementSpacingStandard.xml deleted file mode 100644 index 92532fc..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/IncrementDecrementSpacingStandard.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - $i; ---$i['key']['id']; -ClassName::$prop++; -$obj->prop--; - ]]> - - - $i; --- $i['key']['id']; -ClassName::$prop ++; -$obj->prop ---; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/LanguageConstructSpacingStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/LanguageConstructSpacingStandard.xml deleted file mode 100644 index af6a4f9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/LanguageConstructSpacingStandard.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - 'Hello, World!'; -throw new Exception(); -return $newLine; - ]]> - - - 'Hello, World!'; -throw new Exception(); -return -$newLine; - ]]> - - - - - - - - from [1, 2, 3]; -} - ]]> - - - from [1, 2, 3]; - yield - from [1, 2, 3]; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/ScopeIndentStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/ScopeIndentStandard.xml deleted file mode 100644 index bdd36d4..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/ScopeIndentStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - $var = 1; -} - ]]> - - - $var = 1; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/SpreadOperatorSpacingAfterStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/SpreadOperatorSpacingAfterStandard.xml deleted file mode 100644 index 558bebf..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Docs/WhiteSpace/SpreadOperatorSpacingAfterStandard.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - &...$spread) { - bar(...$spread); - - bar( - [...$foo], - ...array_values($keyedArray) - ); -} - ]]> - - - ... $spread) { - bar(... - $spread - ); - - bar( - [... $foo ],.../*@*/array_values($keyed) - ); -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Arrays/ArrayIndentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Arrays/ArrayIndentSniff.php deleted file mode 100644 index d1d7d81..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Arrays/ArrayIndentSniff.php +++ /dev/null @@ -1,193 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Arrays; - -use PHP_CodeSniffer\Sniffs\AbstractArraySniff; -use PHP_CodeSniffer\Util\Tokens; - -class ArrayIndentSniff extends AbstractArraySniff -{ - - /** - * The number of spaces each array key should be indented. - * - * @var integer - */ - public $indent = 4; - - - /** - * Processes a single-line array definition. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being checked. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $arrayStart The token that starts the array definition. - * @param int $arrayEnd The token that ends the array definition. - * @param array $indices An array of token positions for the array keys, - * double arrows, and values. - * - * @return void - */ - public function processSingleLineArray($phpcsFile, $stackPtr, $arrayStart, $arrayEnd, $indices) - { - - }//end processSingleLineArray() - - - /** - * Processes a multi-line array definition. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being checked. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $arrayStart The token that starts the array definition. - * @param int $arrayEnd The token that ends the array definition. - * @param array $indices An array of token positions for the array keys, - * double arrows, and values. - * - * @return void - */ - public function processMultiLineArray($phpcsFile, $stackPtr, $arrayStart, $arrayEnd, $indices) - { - $tokens = $phpcsFile->getTokens(); - - // Determine how far indented the entire array declaration should be. - $ignore = Tokens::$emptyTokens; - $ignore[] = T_DOUBLE_ARROW; - $prev = $phpcsFile->findPrevious($ignore, ($stackPtr - 1), null, true); - $start = $phpcsFile->findStartOfStatement($prev); - $first = $phpcsFile->findFirstOnLine(T_WHITESPACE, $start, true); - $baseIndent = ($tokens[$first]['column'] - 1); - - $first = $phpcsFile->findFirstOnLine(T_WHITESPACE, $stackPtr, true); - $startIndent = ($tokens[$first]['column'] - 1); - - // If the open brace is not indented to at least to the level of the start - // of the statement, the sniff will conflict with other sniffs trying to - // check indent levels because it's not valid. But we don't enforce exactly - // how far indented it should be. - if ($startIndent < $baseIndent) { - $pluralizeSpace = 's'; - if ($baseIndent === 1) { - $pluralizeSpace = ''; - } - - $error = 'Array open brace not indented correctly; expected at least %s space%s but found %s'; - $data = [ - $baseIndent, - $pluralizeSpace, - $startIndent, - ]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'OpenBraceIncorrect', $data); - if ($fix === true) { - $padding = str_repeat(' ', $baseIndent); - if ($startIndent === 0) { - $phpcsFile->fixer->addContentBefore($first, $padding); - } else { - $phpcsFile->fixer->replaceToken(($first - 1), $padding); - } - } - - return; - }//end if - - $expectedIndent = ($startIndent + $this->indent); - - foreach ($indices as $index) { - if (isset($index['index_start']) === true) { - $start = $index['index_start']; - } else { - $start = $index['value_start']; - } - - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($start - 1), null, true); - if ($tokens[$prev]['line'] === $tokens[$start]['line']) { - // This index isn't the only content on the line - // so we can't check indent rules. - continue; - } - - $first = $phpcsFile->findFirstOnLine(T_WHITESPACE, $start, true); - - $foundIndent = ($tokens[$first]['column'] - 1); - if ($foundIndent === $expectedIndent) { - continue; - } - - $pluralizeSpace = 's'; - if ($expectedIndent === 1) { - $pluralizeSpace = ''; - } - - $error = 'Array key not indented correctly; expected %s space%s but found %s'; - $data = [ - $expectedIndent, - $pluralizeSpace, - $foundIndent, - ]; - $fix = $phpcsFile->addFixableError($error, $first, 'KeyIncorrect', $data); - if ($fix === false) { - continue; - } - - $padding = str_repeat(' ', $expectedIndent); - if ($foundIndent === 0) { - $phpcsFile->fixer->addContentBefore($first, $padding); - } else { - $phpcsFile->fixer->replaceToken(($first - 1), $padding); - } - }//end foreach - - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($arrayEnd - 1), null, true); - if ($tokens[$prev]['line'] === $tokens[$arrayEnd]['line']) { - $error = 'Closing brace of array declaration must be on a new line'; - $fix = $phpcsFile->addFixableError($error, $arrayEnd, 'CloseBraceNotNewLine'); - if ($fix === true) { - $padding = $phpcsFile->eolChar.str_repeat(' ', $startIndent); - $phpcsFile->fixer->addContentBefore($arrayEnd, $padding); - } - - return; - } - - // The close brace must be indented one stop less. - $foundIndent = ($tokens[$arrayEnd]['column'] - 1); - if ($foundIndent === $startIndent) { - return; - } - - $pluralizeSpace = 's'; - if ($startIndent === 1) { - $pluralizeSpace = ''; - } - - $error = 'Array close brace not indented correctly; expected %s space%s but found %s'; - $data = [ - $startIndent, - $pluralizeSpace, - $foundIndent, - ]; - $fix = $phpcsFile->addFixableError($error, $arrayEnd, 'CloseBraceIncorrect', $data); - if ($fix === false) { - return; - } - - $padding = str_repeat(' ', $startIndent); - if ($foundIndent === 0) { - $phpcsFile->fixer->addContentBefore($arrayEnd, $padding); - } else { - $phpcsFile->fixer->replaceToken(($arrayEnd - 1), $padding); - } - - }//end processMultiLineArray() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Arrays/DisallowLongArraySyntaxSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Arrays/DisallowLongArraySyntaxSniff.php deleted file mode 100644 index 46b498e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Arrays/DisallowLongArraySyntaxSniff.php +++ /dev/null @@ -1,72 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Arrays; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class DisallowLongArraySyntaxSniff implements Sniff -{ - - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @return array - */ - public function register() - { - return [T_ARRAY]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $phpcsFile->recordMetric($stackPtr, 'Short array syntax used', 'no'); - - $error = 'Short array syntax must be used to define arrays'; - - if (isset($tokens[$stackPtr]['parenthesis_opener'], $tokens[$stackPtr]['parenthesis_closer']) === false) { - // Live coding/parse error, just show the error, don't try and fix it. - $phpcsFile->addError($error, $stackPtr, 'Found'); - return; - } - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Found'); - - if ($fix === true) { - $opener = $tokens[$stackPtr]['parenthesis_opener']; - $closer = $tokens[$stackPtr]['parenthesis_closer']; - - $phpcsFile->fixer->beginChangeset(); - - $phpcsFile->fixer->replaceToken($stackPtr, ''); - $phpcsFile->fixer->replaceToken($opener, '['); - $phpcsFile->fixer->replaceToken($closer, ']'); - - $phpcsFile->fixer->endChangeset(); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Arrays/DisallowShortArraySyntaxSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Arrays/DisallowShortArraySyntaxSniff.php deleted file mode 100644 index ce1e56a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Arrays/DisallowShortArraySyntaxSniff.php +++ /dev/null @@ -1,61 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Arrays; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class DisallowShortArraySyntaxSniff implements Sniff -{ - - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @return array - */ - public function register() - { - return [T_OPEN_SHORT_ARRAY]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $phpcsFile->recordMetric($stackPtr, 'Short array syntax used', 'yes'); - - $error = 'Short array syntax is not allowed'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Found'); - - if ($fix === true) { - $tokens = $phpcsFile->getTokens(); - $opener = $tokens[$stackPtr]['bracket_opener']; - $closer = $tokens[$stackPtr]['bracket_closer']; - - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($opener, 'array('); - $phpcsFile->fixer->replaceToken($closer, ')'); - $phpcsFile->fixer->endChangeset(); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Classes/DuplicateClassNameSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Classes/DuplicateClassNameSniff.php deleted file mode 100644 index 854d88e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Classes/DuplicateClassNameSniff.php +++ /dev/null @@ -1,126 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Classes; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class DuplicateClassNameSniff implements Sniff -{ - - /** - * List of classes that have been found during checking. - * - * @var array> - */ - protected $foundClasses = []; - - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @return array - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return int - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $namespace = ''; - $findTokens = [ - T_CLASS, - T_INTERFACE, - T_TRAIT, - T_ENUM, - T_NAMESPACE, - ]; - - $stackPtr = $phpcsFile->findNext($findTokens, ($stackPtr + 1)); - while ($stackPtr !== false) { - // Keep track of what namespace we are in. - if ($tokens[$stackPtr]['code'] === T_NAMESPACE) { - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($nextNonEmpty !== false - // Ignore namespace keyword used as operator. - && $tokens[$nextNonEmpty]['code'] !== T_NS_SEPARATOR - ) { - $namespace = ''; - for ($i = $nextNonEmpty; $i < $phpcsFile->numTokens; $i++) { - if (isset(Tokens::$emptyTokens[$tokens[$i]['code']]) === true) { - continue; - } - - if ($tokens[$i]['code'] !== T_STRING && $tokens[$i]['code'] !== T_NS_SEPARATOR) { - break; - } - - $namespace .= $tokens[$i]['content']; - } - - $stackPtr = $i; - } - } else { - $name = $phpcsFile->getDeclarationName($stackPtr); - if (empty($name) === false) { - if ($namespace !== '') { - $name = $namespace.'\\'.$name; - } - - $compareName = strtolower($name); - if (isset($this->foundClasses[$compareName]) === true) { - $type = strtolower($tokens[$stackPtr]['content']); - $file = $this->foundClasses[$compareName]['file']; - $line = $this->foundClasses[$compareName]['line']; - $error = 'Duplicate %s name "%s" found; first defined in %s on line %s'; - $data = [ - $type, - $name, - $file, - $line, - ]; - $phpcsFile->addWarning($error, $stackPtr, 'Found', $data); - } else { - $this->foundClasses[$compareName] = [ - 'file' => $phpcsFile->getFilename(), - 'line' => $tokens[$stackPtr]['line'], - ]; - } - }//end if - - if (isset($tokens[$stackPtr]['scope_closer']) === true) { - $stackPtr = $tokens[$stackPtr]['scope_closer']; - } - }//end if - - $stackPtr = $phpcsFile->findNext($findTokens, ($stackPtr + 1)); - }//end while - - return $phpcsFile->numTokens; - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Classes/OpeningBraceSameLineSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Classes/OpeningBraceSameLineSniff.php deleted file mode 100644 index acccb31..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Classes/OpeningBraceSameLineSniff.php +++ /dev/null @@ -1,124 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Classes; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class OpeningBraceSameLineSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_CLASS, - T_INTERFACE, - T_TRAIT, - T_ENUM, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $scopeIdentifier = $phpcsFile->findNext(T_STRING, ($stackPtr + 1)); - $errorData = [strtolower($tokens[$stackPtr]['content']).' '.$tokens[$scopeIdentifier]['content']]; - - if (isset($tokens[$stackPtr]['scope_opener']) === false) { - $error = 'Possible parse error: %s missing opening or closing brace'; - $phpcsFile->addWarning($error, $stackPtr, 'MissingBrace', $errorData); - return; - } - - $openingBrace = $tokens[$stackPtr]['scope_opener']; - - // Is the brace on the same line as the class/interface/trait declaration ? - $lastClassLineToken = $phpcsFile->findPrevious(T_WHITESPACE, ($openingBrace - 1), $stackPtr, true); - $lastClassLine = $tokens[$lastClassLineToken]['line']; - $braceLine = $tokens[$openingBrace]['line']; - $lineDifference = ($braceLine - $lastClassLine); - - if ($lineDifference > 0) { - $phpcsFile->recordMetric($stackPtr, 'Class opening brace placement', 'new line'); - $error = 'Opening brace should be on the same line as the declaration for %s'; - $fix = $phpcsFile->addFixableError($error, $openingBrace, 'BraceOnNewLine', $errorData); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->addContent($lastClassLineToken, ' {'); - $phpcsFile->fixer->replaceToken($openingBrace, ''); - $phpcsFile->fixer->endChangeset(); - } - } else { - $phpcsFile->recordMetric($stackPtr, 'Class opening brace placement', 'same line'); - } - - // Is the opening brace the last thing on the line ? - $next = $phpcsFile->findNext(T_WHITESPACE, ($openingBrace + 1), null, true); - if ($tokens[$next]['line'] === $tokens[$openingBrace]['line']) { - if ($next === $tokens[$stackPtr]['scope_closer']) { - // Ignore empty classes. - return; - } - - $error = 'Opening brace must be the last content on the line'; - $fix = $phpcsFile->addFixableError($error, $openingBrace, 'ContentAfterBrace'); - if ($fix === true) { - $phpcsFile->fixer->addNewline($openingBrace); - } - } - - // Only continue checking if the opening brace looks good. - if ($lineDifference > 0) { - return; - } - - // Is there precisely one space before the opening brace ? - if ($tokens[($openingBrace - 1)]['code'] !== T_WHITESPACE) { - $length = 0; - } else if ($tokens[($openingBrace - 1)]['content'] === "\t") { - $length = '\t'; - } else { - $length = $tokens[($openingBrace - 1)]['length']; - } - - if ($length !== 1) { - $error = 'Expected 1 space before opening brace; found %s'; - $data = [$length]; - $fix = $phpcsFile->addFixableError($error, $openingBrace, 'SpaceBeforeBrace', $data); - if ($fix === true) { - if ($length === 0 || $length === '\t') { - $phpcsFile->fixer->addContentBefore($openingBrace, ' '); - } else { - $phpcsFile->fixer->replaceToken(($openingBrace - 1), ' '); - } - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/AssignmentInConditionSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/AssignmentInConditionSniff.php deleted file mode 100644 index a60ee3b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/AssignmentInConditionSniff.php +++ /dev/null @@ -1,171 +0,0 @@ - - * @copyright 2017 Juliette Reinders Folmer. All rights reserved. - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\CodeAnalysis; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class AssignmentInConditionSniff implements Sniff -{ - - /** - * Assignment tokens to trigger on. - * - * Set in the register() method. - * - * @var array - */ - protected $assignmentTokens = []; - - /** - * The tokens that indicate the start of a condition. - * - * @var array - */ - protected $conditionStartTokens = []; - - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @return array - */ - public function register() - { - $this->assignmentTokens = Tokens::$assignmentTokens; - unset($this->assignmentTokens[T_DOUBLE_ARROW]); - - $starters = Tokens::$booleanOperators; - $starters[T_SEMICOLON] = T_SEMICOLON; - $starters[T_OPEN_PARENTHESIS] = T_OPEN_PARENTHESIS; - - $this->conditionStartTokens = $starters; - - return [ - T_IF, - T_ELSEIF, - T_FOR, - T_SWITCH, - T_CASE, - T_WHILE, - T_MATCH, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $token = $tokens[$stackPtr]; - - // Find the condition opener/closer. - if ($token['code'] === T_FOR) { - if (isset($token['parenthesis_opener'], $token['parenthesis_closer']) === false) { - return; - } - - $semicolon = $phpcsFile->findNext(T_SEMICOLON, ($token['parenthesis_opener'] + 1), ($token['parenthesis_closer'])); - if ($semicolon === false) { - return; - } - - $opener = $semicolon; - - $semicolon = $phpcsFile->findNext(T_SEMICOLON, ($opener + 1), ($token['parenthesis_closer'])); - if ($semicolon === false) { - return; - } - - $closer = $semicolon; - unset($semicolon); - } else if ($token['code'] === T_CASE) { - if (isset($token['scope_opener']) === false) { - return; - } - - $opener = $stackPtr; - $closer = $token['scope_opener']; - } else { - if (isset($token['parenthesis_opener'], $token['parenthesis_closer']) === false) { - return; - } - - $opener = $token['parenthesis_opener']; - $closer = $token['parenthesis_closer']; - }//end if - - $startPos = $opener; - - do { - $hasAssignment = $phpcsFile->findNext($this->assignmentTokens, ($startPos + 1), $closer); - if ($hasAssignment === false) { - return; - } - - // Examine whether the left side is a variable. - $hasVariable = false; - $conditionStart = $startPos; - $altConditionStart = $phpcsFile->findPrevious($this->conditionStartTokens, ($hasAssignment - 1), $startPos); - if ($altConditionStart !== false) { - $conditionStart = $altConditionStart; - } - - for ($i = $hasAssignment; $i > $conditionStart; $i--) { - if (isset(Tokens::$emptyTokens[$tokens[$i]['code']]) === true) { - continue; - } - - // If this is a variable or array, we've seen all we need to see. - if ($tokens[$i]['code'] === T_VARIABLE || $tokens[$i]['code'] === T_CLOSE_SQUARE_BRACKET) { - $hasVariable = true; - break; - } - - // If this is a function call or something, we are OK. - if ($tokens[$i]['code'] === T_CLOSE_PARENTHESIS) { - break; - } - } - - if ($hasVariable === true) { - $errorCode = 'Found'; - if ($token['code'] === T_WHILE) { - $errorCode = 'FoundInWhileCondition'; - } - - $phpcsFile->addWarning( - 'Variable assignment found within a condition. Did you mean to do a comparison ?', - $hasAssignment, - $errorCode - ); - } - - $startPos = $hasAssignment; - } while ($startPos < $closer); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/EmptyPHPStatementSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/EmptyPHPStatementSniff.php deleted file mode 100644 index 82025ec..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/EmptyPHPStatementSniff.php +++ /dev/null @@ -1,183 +0,0 @@ - - * @copyright 2017 Juliette Reinders Folmer. All rights reserved. - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\CodeAnalysis; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class EmptyPHPStatementSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_SEMICOLON, - T_CLOSE_TAG, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['code'] === T_SEMICOLON) { - $this->processSemicolon($phpcsFile, $stackPtr); - } else { - $this->processCloseTag($phpcsFile, $stackPtr); - } - - }//end process() - - - /** - * Detect `something();;`. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - private function processSemicolon(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $prevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($tokens[$prevNonEmpty]['code'] !== T_SEMICOLON - && $tokens[$prevNonEmpty]['code'] !== T_OPEN_TAG - && $tokens[$prevNonEmpty]['code'] !== T_OPEN_TAG_WITH_ECHO - ) { - if (isset($tokens[$prevNonEmpty]['scope_condition']) === false) { - return; - } - - if ($tokens[$prevNonEmpty]['scope_opener'] !== $prevNonEmpty - && $tokens[$prevNonEmpty]['code'] !== T_CLOSE_CURLY_BRACKET - ) { - return; - } - - $scopeOwner = $tokens[$tokens[$prevNonEmpty]['scope_condition']]['code']; - if ($scopeOwner === T_CLOSURE || $scopeOwner === T_ANON_CLASS || $scopeOwner === T_MATCH) { - return; - } - - // Else, it's something like `if (foo) {};` and the semicolon is not needed. - } - - if (isset($tokens[$stackPtr]['nested_parenthesis']) === true) { - $nested = $tokens[$stackPtr]['nested_parenthesis']; - $lastCloser = array_pop($nested); - if (isset($tokens[$lastCloser]['parenthesis_owner']) === true - && $tokens[$tokens[$lastCloser]['parenthesis_owner']]['code'] === T_FOR - ) { - // Empty for() condition. - return; - } - } - - $fix = $phpcsFile->addFixableWarning( - 'Empty PHP statement detected: superfluous semicolon.', - $stackPtr, - 'SemicolonWithoutCodeDetected' - ); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - if ($tokens[$prevNonEmpty]['code'] === T_OPEN_TAG - || $tokens[$prevNonEmpty]['code'] === T_OPEN_TAG_WITH_ECHO - ) { - // Check for superfluous whitespace after the semicolon which should be - // removed as the `fixer->replaceToken(($stackPtr + 1), $replacement); - } - } - - for ($i = $stackPtr; $i > $prevNonEmpty; $i--) { - if ($tokens[$i]['code'] !== T_SEMICOLON - && $tokens[$i]['code'] !== T_WHITESPACE - ) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - }//end if - - }//end processSemicolon() - - - /** - * Detect ``. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - private function processCloseTag(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $prevNonEmpty = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - if ($tokens[$prevNonEmpty]['code'] !== T_OPEN_TAG - && $tokens[$prevNonEmpty]['code'] !== T_OPEN_TAG_WITH_ECHO - ) { - return; - } - - $fix = $phpcsFile->addFixableWarning( - 'Empty PHP open/close tag combination detected.', - $prevNonEmpty, - 'EmptyPHPOpenCloseTagsDetected' - ); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - for ($i = $prevNonEmpty; $i <= $stackPtr; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - - }//end processCloseTag() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/EmptyStatementSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/EmptyStatementSniff.php deleted file mode 100644 index 04429eb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/EmptyStatementSniff.php +++ /dev/null @@ -1,97 +0,0 @@ - - * stmt { - * // foo - * } - * stmt (conditions) { - * // foo - * } - * - * - * @author Manuel Pichler - * @author Greg Sherwood - * @copyright 2007-2014 Manuel Pichler. All rights reserved. - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\CodeAnalysis; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class EmptyStatementSniff implements Sniff -{ - - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_TRY, - T_CATCH, - T_FINALLY, - T_DO, - T_ELSE, - T_ELSEIF, - T_FOR, - T_FOREACH, - T_IF, - T_SWITCH, - T_WHILE, - T_MATCH, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $token = $tokens[$stackPtr]; - - // Skip statements without a body. - if (isset($token['scope_opener']) === false) { - return; - } - - $next = $phpcsFile->findNext( - Tokens::$emptyTokens, - ($token['scope_opener'] + 1), - ($token['scope_closer'] - 1), - true - ); - - if ($next !== false) { - return; - } - - // Get token identifier. - $name = strtoupper($token['content']); - $error = 'Empty %s statement detected'; - $phpcsFile->addError($error, $stackPtr, 'Detected'.ucfirst(strtolower($name)), [$name]); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/ForLoopShouldBeWhileLoopSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/ForLoopShouldBeWhileLoopSniff.php deleted file mode 100644 index b942108..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/ForLoopShouldBeWhileLoopSniff.php +++ /dev/null @@ -1,91 +0,0 @@ - - * class Foo - * { - * public function bar($x) - * { - * for (;true;) true; // No Init or Update part, may as well be: while (true) - * } - * } - * - * - * @author Manuel Pichler - * @copyright 2007-2014 Manuel Pichler. All rights reserved. - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\CodeAnalysis; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ForLoopShouldBeWhileLoopSniff implements Sniff -{ - - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @return array - */ - public function register() - { - return [T_FOR]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $token = $tokens[$stackPtr]; - - // Skip invalid statement. - if (isset($token['parenthesis_opener'], $token['parenthesis_closer']) === false) { - return; - } - - $next = ++$token['parenthesis_opener']; - $end = --$token['parenthesis_closer']; - - $parts = [ - 0, - 0, - 0, - ]; - $index = 0; - - for (; $next <= $end; ++$next) { - $code = $tokens[$next]['code']; - if ($code === T_SEMICOLON) { - ++$index; - } else if (isset(Tokens::$emptyTokens[$code]) === false) { - ++$parts[$index]; - } - } - - if ($parts[0] === 0 && $parts[2] === 0 && $parts[1] > 0) { - $error = 'This FOR loop can be simplified to a WHILE loop'; - $phpcsFile->addWarning($error, $stackPtr, 'CanSimplify'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/ForLoopWithTestFunctionCallSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/ForLoopWithTestFunctionCallSniff.php deleted file mode 100644 index 75db5e8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/ForLoopWithTestFunctionCallSniff.php +++ /dev/null @@ -1,101 +0,0 @@ - - * class Foo - * { - * public function bar($x) - * { - * $a = array(1, 2, 3, 4); - * for ($i = 0; $i < count($a); $i++) { - * $a[$i] *= $i; - * } - * } - * } - * - * - * @author Greg Sherwood - * @author Manuel Pichler - * @copyright 2007-2014 Manuel Pichler. All rights reserved. - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\CodeAnalysis; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ForLoopWithTestFunctionCallSniff implements Sniff -{ - - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @return array - */ - public function register() - { - return [T_FOR]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $token = $tokens[$stackPtr]; - - // Skip invalid statement. - if (isset($token['parenthesis_opener'], $token['parenthesis_closer']) === false) { - return; - } - - $next = ++$token['parenthesis_opener']; - $end = --$token['parenthesis_closer']; - - $position = 0; - - for (; $next <= $end; ++$next) { - $code = $tokens[$next]['code']; - if ($code === T_SEMICOLON) { - ++$position; - } - - if ($position < 1) { - continue; - } else if ($position > 1) { - break; - } else if ($code !== T_VARIABLE && $code !== T_STRING) { - continue; - } - - // Find next non empty token, if it is a open parenthesis we have a - // function call. - $index = $phpcsFile->findNext(Tokens::$emptyTokens, ($next + 1), null, true); - - if ($tokens[$index]['code'] === T_OPEN_PARENTHESIS) { - $error = 'Avoid function calls in a FOR loop test part'; - $phpcsFile->addWarning($error, $stackPtr, 'NotAllowed'); - break; - } - }//end for - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/JumbledIncrementerSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/JumbledIncrementerSniff.php deleted file mode 100644 index c666acf..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/JumbledIncrementerSniff.php +++ /dev/null @@ -1,134 +0,0 @@ - - * class Foo - * { - * public function bar($x) - * { - * for ($i = 0; $i < 10; $i++) - * { - * for ($k = 0; $k < 20; $i++) - * { - * echo 'Hello'; - * } - * } - * } - * } - * - * - * @author Manuel Pichler - * @copyright 2007-2014 Manuel Pichler. All rights reserved. - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\CodeAnalysis; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class JumbledIncrementerSniff implements Sniff -{ - - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @return array - */ - public function register() - { - return [T_FOR]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $token = $tokens[$stackPtr]; - - // Skip for-loop without body. - if (isset($token['scope_opener']) === false) { - return; - } - - // Find incrementers for outer loop. - $outer = $this->findIncrementers($tokens, $token); - - // Skip if empty. - if (count($outer) === 0) { - return; - } - - // Find nested for loops. - $start = ++$token['scope_opener']; - $end = --$token['scope_closer']; - - for (; $start <= $end; ++$start) { - if ($tokens[$start]['code'] !== T_FOR) { - continue; - } - - $inner = $this->findIncrementers($tokens, $tokens[$start]); - $diff = array_intersect($outer, $inner); - - if (count($diff) !== 0) { - $error = 'Loop incrementer (%s) jumbling with inner loop'; - $data = [implode(', ', $diff)]; - $phpcsFile->addWarning($error, $stackPtr, 'Found', $data); - } - } - - }//end process() - - - /** - * Get all used variables in the incrementer part of a for statement. - * - * @param array $tokens Array with all code sniffer tokens. - * @param array $token Current for loop token. - * - * @return string[] List of all found incrementer variables. - */ - protected function findIncrementers(array $tokens, array $token) - { - // Skip invalid statement. - if (isset($token['parenthesis_opener'], $token['parenthesis_closer']) === false) { - return []; - } - - $start = ++$token['parenthesis_opener']; - $end = --$token['parenthesis_closer']; - - $incrementers = []; - $semicolons = 0; - for ($next = $start; $next <= $end; ++$next) { - $code = $tokens[$next]['code']; - if ($code === T_SEMICOLON) { - ++$semicolons; - } else if ($semicolons === 2 && $code === T_VARIABLE) { - $incrementers[] = $tokens[$next]['content']; - } - } - - return $incrementers; - - }//end findIncrementers() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/RequireExplicitBooleanOperatorPrecedenceSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/RequireExplicitBooleanOperatorPrecedenceSniff.php deleted file mode 100644 index 95eb705..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/RequireExplicitBooleanOperatorPrecedenceSniff.php +++ /dev/null @@ -1,112 +0,0 @@ - - * $one = false; - * $two = false; - * $three = true; - * - * $result = $one && $two || $three; - * $result3 = $one && !$two xor $three; - * - * - * {@internal The unary `!` operator is not handled, because its high precedence matches its visuals of - * applying only to the sub-expression right next to it, making it unlikely that someone would - * misinterpret its precedence. Requiring parentheses around it would reduce the readability of - * expressions due to the additional characters, especially if multiple subexpressions / variables - * need to be negated.} - * - * Sister-sniff to the `Squiz.ControlStructures.InlineIfDeclaration` and - * `Squiz.Formatting.OperatorBracket.MissingBrackets` sniffs. - * - * @author Tim Duesterhus - * @copyright 2021-2023 WoltLab GmbH. - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\CodeAnalysis; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class RequireExplicitBooleanOperatorPrecedenceSniff implements Sniff -{ - - /** - * Array of tokens this test searches for to find either a boolean - * operator or the start of the current (sub-)expression. Used for - * performance optimization purposes. - * - * @var array - */ - private $searchTargets = []; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - $this->searchTargets = Tokens::$booleanOperators; - $this->searchTargets[T_INLINE_THEN] = T_INLINE_THEN; - $this->searchTargets[T_INLINE_ELSE] = T_INLINE_ELSE; - - return Tokens::$booleanOperators; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $start = $phpcsFile->findStartOfStatement($stackPtr); - - $previous = $phpcsFile->findPrevious( - $this->searchTargets, - ($stackPtr - 1), - $start, - false, - null, - true - ); - - if ($previous === false) { - // No token found. - return; - } - - if ($tokens[$previous]['code'] === $tokens[$stackPtr]['code']) { - // Identical operator found. - return; - } - - if (in_array($tokens[$previous]['code'], [T_INLINE_THEN, T_INLINE_ELSE], true) === true) { - // Beginning of the expression found for the ternary conditional operator. - return; - } - - // We found a mismatching operator, thus we must report the error. - $error = 'Mixing different binary boolean operators within an expression'; - $error .= ' without using parentheses to clarify precedence is not allowed.'; - $phpcsFile->addError($error, $stackPtr, 'MissingParentheses'); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/UnconditionalIfStatementSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/UnconditionalIfStatementSniff.php deleted file mode 100644 index 19c9089..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/UnconditionalIfStatementSniff.php +++ /dev/null @@ -1,93 +0,0 @@ -true or false - * - * - * class Foo - * { - * public function close() - * { - * if (true) - * { - * // ... - * } - * } - * } - * - * - * @author Manuel Pichler - * @copyright 2007-2014 Manuel Pichler. All rights reserved. - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\CodeAnalysis; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class UnconditionalIfStatementSniff implements Sniff -{ - - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_IF, - T_ELSEIF, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $token = $tokens[$stackPtr]; - - // Skip if statement without body. - if (isset($token['parenthesis_opener'], $token['parenthesis_closer']) === false) { - return; - } - - $next = ++$token['parenthesis_opener']; - $end = --$token['parenthesis_closer']; - - $goodCondition = false; - for (; $next <= $end; ++$next) { - $code = $tokens[$next]['code']; - - if (isset(Tokens::$emptyTokens[$code]) === true || $code === T_NS_SEPARATOR) { - continue; - } else if ($code !== T_TRUE && $code !== T_FALSE) { - $goodCondition = true; - } - } - - if ($goodCondition === false) { - $error = 'Avoid IF statements that are always true or false'; - $phpcsFile->addWarning($error, $stackPtr, 'Found'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/UnnecessaryFinalModifierSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/UnnecessaryFinalModifierSniff.php deleted file mode 100644 index 370c360..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/UnnecessaryFinalModifierSniff.php +++ /dev/null @@ -1,88 +0,0 @@ - - * final class Foo - * { - * public final function bar() - * { - * } - * } - * - * - * @author Manuel Pichler - * @copyright 2007-2014 Manuel Pichler. All rights reserved. - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\CodeAnalysis; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class UnnecessaryFinalModifierSniff implements Sniff -{ - - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @return array - */ - public function register() - { - return [T_CLASS]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $token = $tokens[$stackPtr]; - - // Skip for statements without body. - if (isset($token['scope_opener']) === false) { - return; - } - - if ($phpcsFile->getClassProperties($stackPtr)['is_final'] === false) { - // This class is not final so we don't need to check it. - return; - } - - $next = ++$token['scope_opener']; - $end = --$token['scope_closer']; - - for (; $next <= $end; ++$next) { - if ($tokens[$next]['code'] === T_FINAL) { - $error = 'Unnecessary FINAL modifier in FINAL class'; - $phpcsFile->addWarning($error, $next, 'Found'); - } - - // Skip over the contents of functions as those can't contain the `final` keyword anyway. - if ($tokens[$next]['code'] === T_FUNCTION - && isset($tokens[$next]['scope_closer']) === true - ) { - $next = $tokens[$next]['scope_closer']; - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/UnusedFunctionParameterSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/UnusedFunctionParameterSniff.php deleted file mode 100644 index cca3f9f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/UnusedFunctionParameterSniff.php +++ /dev/null @@ -1,307 +0,0 @@ - - * @author Greg Sherwood - * @copyright 2007-2014 Manuel Pichler. All rights reserved. - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\CodeAnalysis; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class UnusedFunctionParameterSniff implements Sniff -{ - - /** - * The list of class type hints which will be ignored. - * - * @var array - */ - public $ignoreTypeHints = []; - - /** - * A list of all PHP magic methods with fixed method signatures. - * - * Note: `__construct()` and `__invoke()` are excluded on purpose - * as their method signature is not fixed. - * - * @var array - */ - private $magicMethods = [ - '__destruct' => true, - '__call' => true, - '__callstatic' => true, - '__get' => true, - '__set' => true, - '__isset' => true, - '__unset' => true, - '__sleep' => true, - '__wakeup' => true, - '__serialize' => true, - '__unserialize' => true, - '__tostring' => true, - '__set_state' => true, - '__clone' => true, - '__debuginfo' => true, - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_FUNCTION, - T_CLOSURE, - T_FN, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $token = $tokens[$stackPtr]; - - // Skip broken function declarations. - if (isset($token['scope_opener']) === false || isset($token['parenthesis_opener']) === false) { - return; - } - - $errorCode = 'Found'; - $implements = false; - - if ($token['code'] === T_FUNCTION) { - $classPtr = $phpcsFile->getCondition($stackPtr, T_CLASS); - if ($classPtr !== false) { - // Check for magic methods and ignore these as the method signature cannot be changed. - $methodName = $phpcsFile->getDeclarationName($stackPtr); - if (empty($methodName) === false) { - $methodNameLc = strtolower($methodName); - if (isset($this->magicMethods[$methodNameLc]) === true) { - return; - } - } - - // Check for extends/implements and adjust the error code when found. - $implements = $phpcsFile->findImplementedInterfaceNames($classPtr); - $extends = $phpcsFile->findExtendedClassName($classPtr); - if ($extends !== false) { - $errorCode .= 'InExtendedClass'; - } else if ($implements !== false) { - $errorCode .= 'InImplementedInterface'; - } - } - }//end if - - $params = []; - $methodParams = $phpcsFile->getMethodParameters($stackPtr); - - // Skip when no parameters found. - $methodParamsCount = count($methodParams); - if ($methodParamsCount === 0) { - return; - } - - foreach ($methodParams as $param) { - if (isset($param['property_visibility']) === true) { - // Ignore constructor property promotion. - continue; - } - - $params[$param['name']] = $stackPtr; - } - - $next = ++$token['scope_opener']; - $end = --$token['scope_closer']; - - // Check the end token for arrow functions as - // they can end at a content token due to not having - // a clearly defined closing token. - if ($token['code'] === T_FN) { - ++$end; - } - - $foundContent = false; - $validTokens = [ - T_HEREDOC => T_HEREDOC, - T_NOWDOC => T_NOWDOC, - T_END_HEREDOC => T_END_HEREDOC, - T_END_NOWDOC => T_END_NOWDOC, - T_DOUBLE_QUOTED_STRING => T_DOUBLE_QUOTED_STRING, - ]; - $validTokens += Tokens::$emptyTokens; - - for (; $next <= $end; ++$next) { - $token = $tokens[$next]; - $code = $token['code']; - - // Ignorable tokens. - if (isset(Tokens::$emptyTokens[$code]) === true) { - continue; - } - - if ($foundContent === false) { - // A throw statement as the first content indicates an interface method. - if ($code === T_THROW && $implements !== false) { - return; - } - - // A return statement as the first content indicates an interface method. - if ($code === T_RETURN) { - $firstNonEmptyTokenAfterReturn = $phpcsFile->findNext(Tokens::$emptyTokens, ($next + 1), null, true); - if ($tokens[$firstNonEmptyTokenAfterReturn]['code'] === T_SEMICOLON && $implements !== false) { - return; - } - - $secondNonEmptyTokenAfterReturn = $phpcsFile->findNext( - Tokens::$emptyTokens, - ($firstNonEmptyTokenAfterReturn + 1), - null, - true - ); - - if ($secondNonEmptyTokenAfterReturn !== false - && $tokens[$secondNonEmptyTokenAfterReturn]['code'] === T_SEMICOLON - && $implements !== false - ) { - // There is a return . - return; - } - }//end if - }//end if - - $foundContent = true; - - if ($code === T_VARIABLE && isset($params[$token['content']]) === true) { - unset($params[$token['content']]); - } else if ($code === T_DOLLAR) { - $nextToken = $phpcsFile->findNext(T_WHITESPACE, ($next + 1), null, true); - if ($tokens[$nextToken]['code'] === T_OPEN_CURLY_BRACKET) { - $nextToken = $phpcsFile->findNext(T_WHITESPACE, ($nextToken + 1), null, true); - if ($tokens[$nextToken]['code'] === T_STRING) { - $varContent = '$'.$tokens[$nextToken]['content']; - if (isset($params[$varContent]) === true) { - unset($params[$varContent]); - } - } - } - } else if ($code === T_DOUBLE_QUOTED_STRING - || $code === T_START_HEREDOC - || $code === T_START_NOWDOC - ) { - // Tokenize strings that can contain variables. - // Make sure the string is re-joined if it occurs over multiple lines. - $content = $token['content']; - for ($i = ($next + 1); $i <= $end; $i++) { - if (isset($validTokens[$tokens[$i]['code']]) === true) { - $content .= $tokens[$i]['content']; - $next++; - } else { - break; - } - } - - $stringTokens = token_get_all(sprintf('', $content)); - foreach ($stringTokens as $stringPtr => $stringToken) { - if (is_array($stringToken) === false) { - continue; - } - - $varContent = ''; - if ($stringToken[0] === T_DOLLAR_OPEN_CURLY_BRACES) { - $varContent = '$'.$stringTokens[($stringPtr + 1)][1]; - } else if ($stringToken[0] === T_VARIABLE) { - $varContent = $stringToken[1]; - } - - if ($varContent !== '' && isset($params[$varContent]) === true) { - unset($params[$varContent]); - } - } - }//end if - }//end for - - if ($foundContent === true && count($params) > 0) { - $error = 'The method parameter %s is never used'; - - // If there is only one parameter and it is unused, no need for additional errorcode toggling logic. - if ($methodParamsCount === 1) { - foreach ($params as $paramName => $position) { - if (in_array($methodParams[0]['type_hint'], $this->ignoreTypeHints, true) === true) { - continue; - } - - $data = [$paramName]; - $phpcsFile->addWarning($error, $position, $errorCode, $data); - } - - return; - } - - $foundLastUsed = false; - $lastIndex = ($methodParamsCount - 1); - $errorInfo = []; - for ($i = $lastIndex; $i >= 0; --$i) { - if ($foundLastUsed !== false) { - if (isset($params[$methodParams[$i]['name']]) === true) { - $errorInfo[$methodParams[$i]['name']] = [ - 'position' => $params[$methodParams[$i]['name']], - 'errorcode' => $errorCode.'BeforeLastUsed', - 'typehint' => $methodParams[$i]['type_hint'], - ]; - } - } else { - if (isset($params[$methodParams[$i]['name']]) === false) { - $foundLastUsed = true; - } else { - $errorInfo[$methodParams[$i]['name']] = [ - 'position' => $params[$methodParams[$i]['name']], - 'errorcode' => $errorCode.'AfterLastUsed', - 'typehint' => $methodParams[$i]['type_hint'], - ]; - } - } - }//end for - - if (count($errorInfo) > 0) { - $errorInfo = array_reverse($errorInfo); - foreach ($errorInfo as $paramName => $info) { - if (in_array($info['typehint'], $this->ignoreTypeHints, true) === true) { - continue; - } - - $data = [$paramName]; - $phpcsFile->addWarning($error, $info['position'], $info['errorcode'], $data); - } - } - }//end if - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/UselessOverridingMethodSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/UselessOverridingMethodSniff.php deleted file mode 100644 index ce9e8df..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/CodeAnalysis/UselessOverridingMethodSniff.php +++ /dev/null @@ -1,184 +0,0 @@ - - * class FooBar { - * public function __construct($a, $b) { - * parent::__construct($a, $b); - * } - * } - * - * - * @author Manuel Pichler - * @copyright 2007-2014 Manuel Pichler. All rights reserved. - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\CodeAnalysis; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class UselessOverridingMethodSniff implements Sniff -{ - - /** - * Object-Oriented scopes in which a call to parent::method() can exist. - * - * @var array Keys are the token constants, value is irrelevant. - */ - private $validOOScopes = [ - T_CLASS => true, - T_ANON_CLASS => true, - T_TRAIT => true, - ]; - - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @return array - */ - public function register() - { - return [T_FUNCTION]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $token = $tokens[$stackPtr]; - - // Skip function without body. - if (isset($token['scope_opener'], $token['scope_closer']) === false) { - return; - } - - $conditions = $token['conditions']; - $lastCondition = end($conditions); - - // Skip functions that are not a method part of a class, anon class or trait. - if (isset($this->validOOScopes[$lastCondition]) === false) { - return; - } - - // Get function name. - $methodName = $phpcsFile->getDeclarationName($stackPtr); - - // Get all parameters from method signature. - $signature = []; - foreach ($phpcsFile->getMethodParameters($stackPtr) as $param) { - $signature[] = $param['name']; - } - - $next = ++$token['scope_opener']; - $end = --$token['scope_closer']; - - for (; $next <= $end; ++$next) { - $code = $tokens[$next]['code']; - - if (isset(Tokens::$emptyTokens[$code]) === true) { - continue; - } else if ($code === T_RETURN) { - continue; - } - - break; - } - - // Any token except 'parent' indicates correct code. - if ($tokens[$next]['code'] !== T_PARENT) { - return; - } - - // Find next non empty token index, should be double colon. - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($next + 1), null, true); - - // Skip for invalid code. - if ($tokens[$next]['code'] !== T_DOUBLE_COLON) { - return; - } - - // Find next non empty token index, should be the name of the method being called. - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($next + 1), null, true); - - // Skip for invalid code or other method. - if (strcasecmp($tokens[$next]['content'], $methodName) !== 0) { - return; - } - - // Find next non empty token index, should be the open parenthesis. - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($next + 1), null, true); - - // Skip for invalid code. - if ($tokens[$next]['code'] !== T_OPEN_PARENTHESIS || isset($tokens[$next]['parenthesis_closer']) === false) { - return; - } - - $parameters = ['']; - $parenthesisCount = 1; - for (++$next; $next < $phpcsFile->numTokens; ++$next) { - $code = $tokens[$next]['code']; - - if ($code === T_OPEN_PARENTHESIS) { - ++$parenthesisCount; - } else if ($code === T_CLOSE_PARENTHESIS) { - --$parenthesisCount; - } else if ($parenthesisCount === 1 && $code === T_COMMA) { - $parameters[] = ''; - } else if (isset(Tokens::$emptyTokens[$code]) === false) { - $parameters[(count($parameters) - 1)] .= $tokens[$next]['content']; - } - - if ($parenthesisCount === 0) { - break; - } - }//end for - - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($next + 1), null, true); - if ($tokens[$next]['code'] !== T_SEMICOLON && $tokens[$next]['code'] !== T_CLOSE_TAG) { - return; - } - - // This list deliberately does not include the `T_OPEN_TAG_WITH_ECHO` as that token implicitly is an echo statement, i.e. content. - $nonContent = Tokens::$emptyTokens; - $nonContent[T_OPEN_TAG] = T_OPEN_TAG; - $nonContent[T_CLOSE_TAG] = T_CLOSE_TAG; - - // Check rest of the scope. - for (++$next; $next <= $end; ++$next) { - $code = $tokens[$next]['code']; - // Skip for any other content. - if (isset($nonContent[$code]) === false) { - return; - } - } - - $parameters = array_map('trim', $parameters); - $parameters = array_filter($parameters); - - if (count($parameters) === count($signature) && $parameters === $signature) { - $phpcsFile->addWarning('Possible useless method overriding detected', $stackPtr, 'Found'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Commenting/DocCommentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Commenting/DocCommentSniff.php deleted file mode 100644 index c04e40b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Commenting/DocCommentSniff.php +++ /dev/null @@ -1,357 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Commenting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class DocCommentSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_DOC_COMMENT_OPEN_TAG]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['comment_closer']) === false - || ($tokens[$tokens[$stackPtr]['comment_closer']]['content'] === '' - && $tokens[$stackPtr]['comment_closer'] === ($phpcsFile->numTokens - 1)) - ) { - // Don't process an unfinished comment during live coding. - return; - } - - $commentStart = $stackPtr; - $commentEnd = $tokens[$stackPtr]['comment_closer']; - - $empty = [ - T_DOC_COMMENT_WHITESPACE, - T_DOC_COMMENT_STAR, - ]; - - $short = $phpcsFile->findNext($empty, ($stackPtr + 1), $commentEnd, true); - if ($short === false) { - // No content at all. - $error = 'Doc comment is empty'; - $phpcsFile->addError($error, $stackPtr, 'Empty'); - return; - } - - // The first line of the comment should just be the /** code. - if ($tokens[$short]['line'] === $tokens[$stackPtr]['line']) { - $error = 'The open comment tag must be the only content on the line'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'ContentAfterOpen'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->addNewline($stackPtr); - $phpcsFile->fixer->addContentBefore($short, '* '); - $phpcsFile->fixer->endChangeset(); - } - } - - // The last line of the comment should just be the */ code. - $prev = $phpcsFile->findPrevious($empty, ($commentEnd - 1), $stackPtr, true); - if ($tokens[$prev]['line'] === $tokens[$commentEnd]['line']) { - $error = 'The close comment tag must be the only content on the line'; - $fix = $phpcsFile->addFixableError($error, $commentEnd, 'ContentBeforeClose'); - if ($fix === true) { - $phpcsFile->fixer->addNewlineBefore($commentEnd); - } - } - - // Check for additional blank lines at the end of the comment. - if ($tokens[$prev]['line'] < ($tokens[$commentEnd]['line'] - 1)) { - $error = 'Additional blank lines found at end of doc comment'; - $fix = $phpcsFile->addFixableError($error, $commentEnd, 'SpacingAfter'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($prev + 1); $i < $commentEnd; $i++) { - if ($tokens[($i + 1)]['line'] === $tokens[$commentEnd]['line']) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - - // Check for a comment description. - if ($tokens[$short]['code'] !== T_DOC_COMMENT_STRING) { - $error = 'Missing short description in doc comment'; - $phpcsFile->addError($error, $stackPtr, 'MissingShort'); - } else { - // No extra newline before short description. - if ($tokens[$short]['line'] !== ($tokens[$stackPtr]['line'] + 1)) { - $error = 'Doc comment short description must be on the first line'; - $fix = $phpcsFile->addFixableError($error, $short, 'SpacingBeforeShort'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = $stackPtr; $i < $short; $i++) { - if ($tokens[$i]['line'] === $tokens[$stackPtr]['line']) { - continue; - } else if ($tokens[$i]['line'] === $tokens[$short]['line']) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - - // Account for the fact that a short description might cover - // multiple lines. - $shortContent = $tokens[$short]['content']; - $shortEnd = $short; - for ($i = ($short + 1); $i < $commentEnd; $i++) { - if ($tokens[$i]['code'] === T_DOC_COMMENT_STRING) { - if ($tokens[$i]['line'] === ($tokens[$shortEnd]['line'] + 1)) { - $shortContent .= $tokens[$i]['content']; - $shortEnd = $i; - } else { - break; - } - } - } - - if (preg_match('/^\p{Ll}/u', $shortContent) === 1) { - $error = 'Doc comment short description must start with a capital letter'; - $phpcsFile->addError($error, $short, 'ShortNotCapital'); - } - - $long = $phpcsFile->findNext($empty, ($shortEnd + 1), ($commentEnd - 1), true); - if ($long !== false && $tokens[$long]['code'] === T_DOC_COMMENT_STRING) { - if ($tokens[$long]['line'] !== ($tokens[$shortEnd]['line'] + 2)) { - $error = 'There must be exactly one blank line between descriptions in a doc comment'; - $fix = $phpcsFile->addFixableError($error, $long, 'SpacingBetween'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($shortEnd + 1); $i < $long; $i++) { - if ($tokens[$i]['line'] === $tokens[$shortEnd]['line']) { - continue; - } else if ($tokens[$i]['line'] === ($tokens[$long]['line'] - 1)) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - - if (preg_match('/^\p{Ll}/u', $tokens[$long]['content']) === 1) { - $error = 'Doc comment long description must start with a capital letter'; - $phpcsFile->addError($error, $long, 'LongNotCapital'); - } - }//end if - }//end if - - if (empty($tokens[$commentStart]['comment_tags']) === true) { - // No tags in the comment. - return; - } - - $firstTag = $tokens[$commentStart]['comment_tags'][0]; - $prev = $phpcsFile->findPrevious($empty, ($firstTag - 1), $stackPtr, true); - if ($tokens[$firstTag]['line'] !== ($tokens[$prev]['line'] + 2) - && $tokens[$prev]['code'] !== T_DOC_COMMENT_OPEN_TAG - ) { - $error = 'There must be exactly one blank line before the tags in a doc comment'; - $fix = $phpcsFile->addFixableError($error, $firstTag, 'SpacingBeforeTags'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($prev + 1); $i < $firstTag; $i++) { - if ($tokens[$i]['line'] === $tokens[$firstTag]['line']) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $indent = str_repeat(' ', $tokens[$stackPtr]['column']); - $phpcsFile->fixer->addContent($prev, $phpcsFile->eolChar.$indent.'*'.$phpcsFile->eolChar); - $phpcsFile->fixer->endChangeset(); - } - } - - // Break out the tags into groups and check alignment within each. - // A tag group is one where there are no blank lines between tags. - // The param tag group is special as it requires all @param tags to be inside. - $tagGroups = []; - $groupid = 0; - $paramGroupid = null; - foreach ($tokens[$commentStart]['comment_tags'] as $pos => $tag) { - if ($pos > 0) { - $prev = $phpcsFile->findPrevious( - T_DOC_COMMENT_STRING, - ($tag - 1), - $tokens[$commentStart]['comment_tags'][($pos - 1)] - ); - - if ($prev === false) { - $prev = $tokens[$commentStart]['comment_tags'][($pos - 1)]; - } - - if ($tokens[$prev]['line'] !== ($tokens[$tag]['line'] - 1)) { - $groupid++; - } - } - - if ($tokens[$tag]['content'] === '@param') { - if ($paramGroupid !== null - && $paramGroupid !== $groupid - ) { - $error = 'Parameter tags must be grouped together in a doc comment'; - $phpcsFile->addError($error, $tag, 'ParamGroup'); - } - - if ($paramGroupid === null) { - $paramGroupid = $groupid; - } - }//end if - - $tagGroups[$groupid][] = $tag; - }//end foreach - - foreach ($tagGroups as $groupid => $group) { - $maxLength = 0; - $paddings = []; - foreach ($group as $pos => $tag) { - if ($paramGroupid === $groupid - && $tokens[$tag]['content'] !== '@param' - ) { - $error = 'Tag %s cannot be grouped with parameter tags in a doc comment'; - $data = [$tokens[$tag]['content']]; - $phpcsFile->addError($error, $tag, 'NonParamGroup', $data); - } - - $tagLength = $tokens[$tag]['length']; - if ($tagLength > $maxLength) { - $maxLength = $tagLength; - } - - // Check for a value. No value means no padding needed. - $string = $phpcsFile->findNext(T_DOC_COMMENT_STRING, $tag, $commentEnd); - if ($string !== false && $tokens[$string]['line'] === $tokens[$tag]['line']) { - $paddings[$tag] = $tokens[($tag + 1)]['length']; - } - } - - // Check that there was single blank line after the tag block - // but account for multi-line tag comments. - $find = Tokens::$phpcsCommentTokens; - $find[T_DOC_COMMENT_TAG] = T_DOC_COMMENT_TAG; - - $lastTag = $group[$pos]; - $next = $phpcsFile->findNext($find, ($lastTag + 3), $commentEnd); - if ($next !== false) { - $prev = $phpcsFile->findPrevious([T_DOC_COMMENT_TAG, T_DOC_COMMENT_STRING], ($next - 1), $commentStart); - if ($tokens[$next]['line'] !== ($tokens[$prev]['line'] + 2)) { - $error = 'There must be a single blank line after a tag group'; - $fix = $phpcsFile->addFixableError($error, $lastTag, 'SpacingAfterTagGroup'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($prev + 1); $i < $next; $i++) { - if ($tokens[$i]['line'] === $tokens[$next]['line']) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $indent = str_repeat(' ', $tokens[$stackPtr]['column']); - $phpcsFile->fixer->addContent($prev, $phpcsFile->eolChar.$indent.'*'.$phpcsFile->eolChar); - $phpcsFile->fixer->endChangeset(); - } - } - }//end if - - // Now check paddings. - foreach ($paddings as $tag => $padding) { - $required = ($maxLength - $tokens[$tag]['length'] + 1); - - if ($padding !== $required) { - $error = 'Tag value for %s tag indented incorrectly; expected %s spaces but found %s'; - $data = [ - $tokens[$tag]['content'], - $required, - $padding, - ]; - - $fix = $phpcsFile->addFixableError($error, ($tag + 1), 'TagValueIndent', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($tag + 1), str_repeat(' ', $required)); - } - } - } - }//end foreach - - // If there is a param group, it needs to be first. - if ($paramGroupid !== null && $paramGroupid !== 0) { - $error = 'Parameter tags must be defined first in a doc comment'; - $phpcsFile->addError($error, $tagGroups[$paramGroupid][0], 'ParamNotFirst'); - } - - $foundTags = []; - foreach ($tokens[$stackPtr]['comment_tags'] as $pos => $tag) { - $tagName = $tokens[$tag]['content']; - if (isset($foundTags[$tagName]) === true) { - $lastTag = $tokens[$stackPtr]['comment_tags'][($pos - 1)]; - if ($tokens[$lastTag]['content'] !== $tagName) { - $error = 'Tags must be grouped together in a doc comment'; - $phpcsFile->addError($error, $tag, 'TagsNotGrouped'); - } - - continue; - } - - $foundTags[$tagName] = true; - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Commenting/FixmeSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Commenting/FixmeSniff.php deleted file mode 100644 index 13c83aa..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Commenting/FixmeSniff.php +++ /dev/null @@ -1,78 +0,0 @@ - - * @author Sam Graham - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Commenting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class FixmeSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return array_diff(Tokens::$commentTokens, Tokens::$phpcsCommentTokens); - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $content = $tokens[$stackPtr]['content']; - $matches = []; - preg_match('/(?:\A|[^\p{L}]+)fixme([^\p{L}]+(.*)|\Z)/ui', $content, $matches); - if (empty($matches) === false) { - // Clear whitespace and some common characters not required at - // the end of a fixme message to make the error more informative. - $type = 'CommentFound'; - $fixmeMessage = trim($matches[1]); - $fixmeMessage = trim($fixmeMessage, '-:[](). '); - $error = 'Comment refers to a FIXME task'; - $data = [$fixmeMessage]; - if ($fixmeMessage !== '') { - $type = 'TaskFound'; - $error .= ' "%s"'; - } - - $phpcsFile->addError($error, $stackPtr, $type, $data); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Commenting/TodoSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Commenting/TodoSniff.php deleted file mode 100644 index da9bbb5..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Commenting/TodoSniff.php +++ /dev/null @@ -1,77 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Commenting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class TodoSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return array_diff(Tokens::$commentTokens, Tokens::$phpcsCommentTokens); - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $content = $tokens[$stackPtr]['content']; - $matches = []; - preg_match('/(?:\A|[^\p{L}]+)todo([^\p{L}]+(.*)|\Z)/ui', $content, $matches); - if (empty($matches) === false) { - // Clear whitespace and some common characters not required at - // the end of a to-do message to make the warning more informative. - $type = 'CommentFound'; - $todoMessage = trim($matches[1]); - $todoMessage = trim($todoMessage, '-:[](). '); - $error = 'Comment refers to a TODO task'; - $data = [$todoMessage]; - if ($todoMessage !== '') { - $type = 'TaskFound'; - $error .= ' "%s"'; - } - - $phpcsFile->addWarning($error, $stackPtr, $type, $data); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/ControlStructures/DisallowYodaConditionsSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/ControlStructures/DisallowYodaConditionsSniff.php deleted file mode 100644 index 7092df9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/ControlStructures/DisallowYodaConditionsSniff.php +++ /dev/null @@ -1,185 +0,0 @@ - - * @author Mark Scherer - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\ControlStructures; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class DisallowYodaConditionsSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - $tokens = Tokens::$comparisonTokens; - unset($tokens[T_COALESCE]); - - return $tokens; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $previousIndex = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - $relevantTokens = [ - T_CLOSE_SHORT_ARRAY, - T_CLOSE_PARENTHESIS, - T_TRUE, - T_FALSE, - T_NULL, - T_LNUMBER, - T_DNUMBER, - T_CONSTANT_ENCAPSED_STRING, - ]; - - if (in_array($tokens[$previousIndex]['code'], $relevantTokens, true) === false) { - return; - } - - if ($tokens[$previousIndex]['code'] === T_CLOSE_SHORT_ARRAY) { - $previousIndex = $tokens[$previousIndex]['bracket_opener']; - if ($this->isArrayStatic($phpcsFile, $previousIndex) === false) { - return; - } - } - - $prevIndex = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($previousIndex - 1), null, true); - - if (in_array($tokens[$prevIndex]['code'], Tokens::$arithmeticTokens, true) === true) { - return; - } - - if ($tokens[$prevIndex]['code'] === T_STRING_CONCAT) { - return; - } - - // Is it a parenthesis. - if ($tokens[$previousIndex]['code'] === T_CLOSE_PARENTHESIS) { - $beforeOpeningParenthesisIndex = $phpcsFile->findPrevious( - Tokens::$emptyTokens, - ($tokens[$previousIndex]['parenthesis_opener'] - 1), - null, - true - ); - - if ($beforeOpeningParenthesisIndex === false || $tokens[$beforeOpeningParenthesisIndex]['code'] !== T_ARRAY) { - if ($tokens[$beforeOpeningParenthesisIndex]['code'] === T_STRING) { - return; - } - - // If it is not an array, check what is inside. - $found = $phpcsFile->findPrevious( - T_VARIABLE, - ($previousIndex - 1), - $tokens[$previousIndex]['parenthesis_opener'] - ); - - // If a variable exists, it is not Yoda. - if ($found !== false) { - return; - } - - // If there is nothing inside the parenthesis, it is not a Yoda condition. - $opener = $tokens[$previousIndex]['parenthesis_opener']; - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($previousIndex - 1), ($opener + 1), true); - if ($prev === false) { - return; - } - } else if ($this->isArrayStatic($phpcsFile, $beforeOpeningParenthesisIndex) === false) { - return; - }//end if - }//end if - - $phpcsFile->addError( - 'Usage of Yoda conditions is not allowed; switch the expression order', - $stackPtr, - 'Found' - ); - - }//end process() - - - /** - * Determines if an array is a static definition. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $arrayToken The position of the array token. - * - * @return bool - */ - public function isArrayStatic(File $phpcsFile, $arrayToken) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$arrayToken]['code'] === T_OPEN_SHORT_ARRAY) { - $start = $arrayToken; - $end = $tokens[$arrayToken]['bracket_closer']; - } else if ($tokens[$arrayToken]['code'] === T_ARRAY) { - $start = $tokens[$arrayToken]['parenthesis_opener']; - $end = $tokens[$arrayToken]['parenthesis_closer']; - } else { - // Shouldn't be possible but may happen if external sniffs are using this method. - return true; // @codeCoverageIgnore - } - - $staticTokens = Tokens::$emptyTokens; - $staticTokens += Tokens::$textStringTokens; - $staticTokens += Tokens::$assignmentTokens; - $staticTokens += Tokens::$equalityTokens; - $staticTokens += Tokens::$comparisonTokens; - $staticTokens += Tokens::$arithmeticTokens; - $staticTokens += Tokens::$operators; - $staticTokens += Tokens::$booleanOperators; - $staticTokens += Tokens::$castTokens; - $staticTokens += Tokens::$bracketTokens; - $staticTokens += [ - T_DOUBLE_ARROW => T_DOUBLE_ARROW, - T_COMMA => T_COMMA, - T_TRUE => T_TRUE, - T_FALSE => T_FALSE, - T_NULL => T_NULL, - T_NS_SEPARATOR => T_NS_SEPARATOR, - ]; - - for ($i = ($start + 1); $i < $end; $i++) { - if (isset($tokens[$i]['scope_closer']) === true) { - $i = $tokens[$i]['scope_closer']; - continue; - } - - if (isset($staticTokens[$tokens[$i]['code']]) === false) { - return false; - } - } - - return true; - - }//end isArrayStatic() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/ControlStructures/InlineControlStructureSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/ControlStructures/InlineControlStructureSniff.php deleted file mode 100644 index c4640af..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/ControlStructures/InlineControlStructureSniff.php +++ /dev/null @@ -1,365 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\ControlStructures; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class InlineControlStructureSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - /** - * If true, an error will be thrown; otherwise a warning. - * - * @var boolean - */ - public $error = true; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_IF, - T_ELSE, - T_ELSEIF, - T_FOREACH, - T_WHILE, - T_DO, - T_FOR, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void|int - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['scope_opener']) === true) { - $phpcsFile->recordMetric($stackPtr, 'Control structure defined inline', 'no'); - return; - } - - // Ignore the ELSE in ELSE IF. We'll process the IF part later. - if ($tokens[$stackPtr]['code'] === T_ELSE) { - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($tokens[$next]['code'] === T_IF) { - return; - } - } - - if ($tokens[$stackPtr]['code'] === T_WHILE || $tokens[$stackPtr]['code'] === T_FOR) { - // This could be from a DO WHILE, which doesn't have an opening brace or a while/for without body. - if (isset($tokens[$stackPtr]['parenthesis_closer']) === true) { - $afterParensCloser = $phpcsFile->findNext(Tokens::$emptyTokens, ($tokens[$stackPtr]['parenthesis_closer'] + 1), null, true); - if ($afterParensCloser === false) { - // Live coding. - return; - } - - if ($tokens[$afterParensCloser]['code'] === T_SEMICOLON) { - $phpcsFile->recordMetric($stackPtr, 'Control structure defined inline', 'no'); - return; - } - } - }//end if - - if (isset($tokens[$stackPtr]['parenthesis_opener'], $tokens[$stackPtr]['parenthesis_closer']) === false - && $tokens[$stackPtr]['code'] !== T_ELSE - ) { - if ($tokens[$stackPtr]['code'] !== T_DO) { - // Live coding or parse error. - return; - } - - $nextWhile = $phpcsFile->findNext(T_WHILE, ($stackPtr + 1)); - if ($nextWhile !== false - && isset($tokens[$nextWhile]['parenthesis_opener'], $tokens[$nextWhile]['parenthesis_closer']) === false - ) { - // Live coding or parse error. - return; - } - - unset($nextWhile); - } - - $start = $stackPtr; - if (isset($tokens[$stackPtr]['parenthesis_closer']) === true) { - $start = $tokens[$stackPtr]['parenthesis_closer']; - } - - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($start + 1), null, true); - if ($nextNonEmpty === false) { - // Live coding or parse error. - return; - } - - if ($tokens[$nextNonEmpty]['code'] === T_OPEN_CURLY_BRACKET - || $tokens[$nextNonEmpty]['code'] === T_COLON - ) { - // T_CLOSE_CURLY_BRACKET missing, or alternative control structure with - // T_END... missing. Either live coding, parse error or end - // tag in short open tags and scan run with short_open_tag=Off. - // Bow out completely as any further detection will be unreliable - // and create incorrect fixes or cause fixer conflicts. - return $phpcsFile->numTokens; - } - - unset($nextNonEmpty, $start); - - // This is a control structure without an opening brace, - // so it is an inline statement. - if ($this->error === true) { - $fix = $phpcsFile->addFixableError('Inline control structures are not allowed', $stackPtr, 'NotAllowed'); - } else { - $fix = $phpcsFile->addFixableWarning('Inline control structures are discouraged', $stackPtr, 'Discouraged'); - } - - $phpcsFile->recordMetric($stackPtr, 'Control structure defined inline', 'yes'); - - // Stop here if we are not fixing the error. - if ($fix !== true) { - return; - } - - $phpcsFile->fixer->beginChangeset(); - if (isset($tokens[$stackPtr]['parenthesis_closer']) === true) { - $closer = $tokens[$stackPtr]['parenthesis_closer']; - } else { - $closer = $stackPtr; - } - - if ($tokens[($closer + 1)]['code'] === T_WHITESPACE - || $tokens[($closer + 1)]['code'] === T_SEMICOLON - ) { - $phpcsFile->fixer->addContent($closer, ' {'); - } else { - $phpcsFile->fixer->addContent($closer, ' { '); - } - - $fixableScopeOpeners = $this->register(); - - $lastNonEmpty = $closer; - for ($end = ($closer + 1); $end < $phpcsFile->numTokens; $end++) { - if ($tokens[$end]['code'] === T_SEMICOLON) { - break; - } - - if ($tokens[$end]['code'] === T_CLOSE_TAG) { - $end = $lastNonEmpty; - break; - } - - if (in_array($tokens[$end]['code'], $fixableScopeOpeners, true) === true - && isset($tokens[$end]['scope_opener']) === false - ) { - // The best way to fix nested inline scopes is middle-out. - // So skip this one. It will be detected and fixed on a future loop. - $phpcsFile->fixer->rollbackChangeset(); - return; - } - - if (isset($tokens[$end]['scope_opener']) === true) { - $type = $tokens[$end]['code']; - $end = $tokens[$end]['scope_closer']; - if ($type === T_DO - || $type === T_IF || $type === T_ELSEIF - || $type === T_TRY || $type === T_CATCH || $type === T_FINALLY - ) { - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($end + 1), null, true); - if ($next === false) { - break; - } - - $nextType = $tokens[$next]['code']; - - // Let additional conditions loop and find their ending. - if (($type === T_IF - || $type === T_ELSEIF) - && ($nextType === T_ELSEIF - || $nextType === T_ELSE) - ) { - continue; - } - - // Account for TRY... CATCH/FINALLY statements. - if (($type === T_TRY - || $type === T_CATCH - || $type === T_FINALLY) - && ($nextType === T_CATCH - || $nextType === T_FINALLY) - ) { - continue; - } - - // Account for DO... WHILE conditions. - if ($type === T_DO && $nextType === T_WHILE) { - $end = $phpcsFile->findNext(T_SEMICOLON, ($next + 1)); - } - } else if ($type === T_CLOSURE) { - // There should be a semicolon after the closing brace. - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($end + 1), null, true); - if ($next !== false && $tokens[$next]['code'] === T_SEMICOLON) { - $end = $next; - } - }//end if - - if ($tokens[$end]['code'] !== T_END_HEREDOC - && $tokens[$end]['code'] !== T_END_NOWDOC - ) { - break; - } - }//end if - - if (isset($tokens[$end]['parenthesis_closer']) === true) { - $end = $tokens[$end]['parenthesis_closer']; - $lastNonEmpty = $end; - continue; - } - - if ($tokens[$end]['code'] !== T_WHITESPACE) { - $lastNonEmpty = $end; - } - }//end for - - if ($end === $phpcsFile->numTokens) { - $end = $lastNonEmpty; - } - - $nextContent = $phpcsFile->findNext(Tokens::$emptyTokens, ($end + 1), null, true); - if ($nextContent === false || $tokens[$nextContent]['line'] !== $tokens[$end]['line']) { - // Looks for completely empty statements. - $next = $phpcsFile->findNext(T_WHITESPACE, ($closer + 1), ($end + 1), true); - } else { - $next = ($end + 1); - $endLine = $end; - } - - if ($next !== $end) { - if ($nextContent === false || $tokens[$nextContent]['line'] !== $tokens[$end]['line']) { - // Account for a comment on the end of the line. - for ($endLine = $end; $endLine < $phpcsFile->numTokens; $endLine++) { - if (isset($tokens[($endLine + 1)]) === false - || $tokens[$endLine]['line'] !== $tokens[($endLine + 1)]['line'] - ) { - break; - } - } - - if (isset(Tokens::$commentTokens[$tokens[$endLine]['code']]) === false - && ($tokens[$endLine]['code'] !== T_WHITESPACE - || isset(Tokens::$commentTokens[$tokens[($endLine - 1)]['code']]) === false) - ) { - $endLine = $end; - } - } - - if ($endLine !== $end) { - $endToken = $endLine; - $addedContent = ''; - } else { - $endToken = $end; - $addedContent = $phpcsFile->eolChar; - - if ($tokens[$end]['code'] !== T_SEMICOLON - && $tokens[$end]['code'] !== T_CLOSE_CURLY_BRACKET - ) { - $phpcsFile->fixer->addContent($end, '; '); - } - } - - $next = $phpcsFile->findNext(T_WHITESPACE, ($endToken + 1), null, true); - if ($next !== false - && ($tokens[$next]['code'] === T_ELSE - || $tokens[$next]['code'] === T_ELSEIF) - ) { - $phpcsFile->fixer->addContentBefore($next, '} '); - } else { - $indent = ''; - for ($first = $stackPtr; $first > 0; $first--) { - if ($tokens[$first]['column'] === 1) { - break; - } - } - - if ($tokens[$first]['code'] === T_WHITESPACE) { - $indent = $tokens[$first]['content']; - } else if ($tokens[$first]['code'] === T_INLINE_HTML - || $tokens[$first]['code'] === T_OPEN_TAG - ) { - $addedContent = ''; - } - - $addedContent .= $indent.'}'; - if ($next !== false && $tokens[$endToken]['code'] === T_COMMENT) { - $addedContent .= $phpcsFile->eolChar; - } - - $phpcsFile->fixer->addContent($endToken, $addedContent); - }//end if - } else { - if ($nextContent === false || $tokens[$nextContent]['line'] !== $tokens[$end]['line']) { - // Account for a comment on the end of the line. - for ($endLine = $end; $endLine < $phpcsFile->numTokens; $endLine++) { - if (isset($tokens[($endLine + 1)]) === false - || $tokens[$endLine]['line'] !== $tokens[($endLine + 1)]['line'] - ) { - break; - } - } - - if ($tokens[$endLine]['code'] !== T_COMMENT - && ($tokens[$endLine]['code'] !== T_WHITESPACE - || $tokens[($endLine - 1)]['code'] !== T_COMMENT) - ) { - $endLine = $end; - } - } - - if ($endLine !== $end) { - $phpcsFile->fixer->replaceToken($end, ''); - $phpcsFile->fixer->addNewlineBefore($endLine); - $phpcsFile->fixer->addContent($endLine, '}'); - } else { - $phpcsFile->fixer->replaceToken($end, '}'); - } - }//end if - - $phpcsFile->fixer->endChangeset(); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Debug/CSSLintSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Debug/CSSLintSniff.php deleted file mode 100644 index f5ad0e9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Debug/CSSLintSniff.php +++ /dev/null @@ -1,135 +0,0 @@ - - * @copyright 2013-2014 Roman Levishchenko - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Debug; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Common; - -class CSSLintSniff implements Sniff, DeprecatedSniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['CSS']; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return array - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return int - */ - public function process(File $phpcsFile, $stackPtr) - { - $csslintPath = Config::getExecutablePath('csslint'); - if ($csslintPath === null) { - return $phpcsFile->numTokens; - } - - $fileName = $phpcsFile->getFilename(); - - $cmd = Common::escapeshellcmd($csslintPath).' '.escapeshellarg($fileName).' 2>&1'; - exec($cmd, $output, $retval); - - if (is_array($output) === false) { - return $phpcsFile->numTokens; - } - - $count = count($output); - - for ($i = 0; $i < $count; $i++) { - $matches = []; - $numMatches = preg_match( - '/(error|warning) at line (\d+)/', - $output[$i], - $matches - ); - - if ($numMatches === 0) { - continue; - } - - $line = (int) $matches[2]; - $message = 'csslint says: '.$output[($i + 1)]; - // First line is message with error line and error code. - // Second is error message. - // Third is wrong line in file. - // Fourth is empty line. - $i += 4; - - $phpcsFile->addWarningOnLine($message, $line, 'ExternalTool'); - }//end for - - // Ignore the rest of the file. - return $phpcsFile->numTokens; - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'Support for scanning CSS files will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Debug/ClosureLinterSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Debug/ClosureLinterSniff.php deleted file mode 100644 index d9c53e3..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Debug/ClosureLinterSniff.php +++ /dev/null @@ -1,156 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Debug; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Common; - -class ClosureLinterSniff implements Sniff, DeprecatedSniff -{ - - /** - * A list of error codes that should show errors. - * - * All other error codes will show warnings. - * - * @var array - */ - public $errorCodes = []; - - /** - * A list of error codes to ignore. - * - * @var array - */ - public $ignoreCodes = []; - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['JS']; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return array - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return int - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If jslint.js could not be run. - */ - public function process(File $phpcsFile, $stackPtr) - { - $lintPath = Config::getExecutablePath('gjslint'); - if ($lintPath === null) { - return $phpcsFile->numTokens; - } - - $fileName = $phpcsFile->getFilename(); - - $lintPath = Common::escapeshellcmd($lintPath); - $cmd = $lintPath.' --nosummary --notime --unix_mode '.escapeshellarg($fileName); - exec($cmd, $output, $retval); - - if (is_array($output) === false) { - return $phpcsFile->numTokens; - } - - foreach ($output as $finding) { - $matches = []; - $numMatches = preg_match('/^(.*):([0-9]+):\(.*?([0-9]+)\)(.*)$/', $finding, $matches); - if ($numMatches === 0) { - continue; - } - - // Skip error codes we are ignoring. - $code = $matches[3]; - if (in_array($code, $this->ignoreCodes) === true) { - continue; - } - - $line = (int) $matches[2]; - $error = trim($matches[4]); - - $message = 'gjslint says: (%s) %s'; - $data = [ - $code, - $error, - ]; - if (in_array($code, $this->errorCodes) === true) { - $phpcsFile->addErrorOnLine($message, $line, 'ExternalToolError', $data); - } else { - $phpcsFile->addWarningOnLine($message, $line, 'ExternalTool', $data); - } - }//end foreach - - // Ignore the rest of the file. - return $phpcsFile->numTokens; - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'Support for scanning JavaScript files will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Debug/ESLintSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Debug/ESLintSniff.php deleted file mode 100644 index eb22dd0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Debug/ESLintSniff.php +++ /dev/null @@ -1,152 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Debug; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Common; - -class ESLintSniff implements Sniff, DeprecatedSniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['JS']; - - /** - * ESLint configuration file path. - * - * @var string|null Path to eslintrc. Null to autodetect. - */ - public $configFile = null; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return array - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return int - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If jshint.js could not be run. - */ - public function process(File $phpcsFile, $stackPtr) - { - $eslintPath = Config::getExecutablePath('eslint'); - if ($eslintPath === null) { - return $phpcsFile->numTokens; - } - - $filename = $phpcsFile->getFilename(); - - $configFile = $this->configFile; - if (empty($configFile) === true) { - // Attempt to autodetect. - $candidates = glob('.eslintrc{.js,.yaml,.yml,.json}', GLOB_BRACE); - if (empty($candidates) === false) { - $configFile = $candidates[0]; - } - } - - $eslintOptions = ['--format json']; - if (empty($configFile) === false) { - $eslintOptions[] = '--config '.escapeshellarg($configFile); - } - - $cmd = Common::escapeshellcmd(escapeshellarg($eslintPath).' '.implode(' ', $eslintOptions).' '.escapeshellarg($filename)); - - // Execute! - exec($cmd, $stdout, $code); - - if ($code <= 0) { - // No errors, continue. - return $phpcsFile->numTokens; - } - - $data = json_decode(implode("\n", $stdout)); - if (json_last_error() !== JSON_ERROR_NONE) { - // Ignore any errors. - return $phpcsFile->numTokens; - } - - // Data is a list of files, but we only pass a single one. - $messages = $data[0]->messages; - foreach ($messages as $error) { - $message = 'eslint says: '.$error->message; - if (empty($error->fatal) === false || $error->severity === 2) { - $phpcsFile->addErrorOnLine($message, $error->line, 'ExternalTool'); - } else { - $phpcsFile->addWarningOnLine($message, $error->line, 'ExternalTool'); - } - } - - // Ignore the rest of the file. - return $phpcsFile->numTokens; - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'Support for scanning JavaScript files will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Debug/JSHintSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Debug/JSHintSniff.php deleted file mode 100644 index f790ea4..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Debug/JSHintSniff.php +++ /dev/null @@ -1,134 +0,0 @@ - - * @author Alexander Wei§ - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Debug; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Common; - -class JSHintSniff implements Sniff, DeprecatedSniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['JS']; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return array - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return int - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If jshint.js could not be run. - */ - public function process(File $phpcsFile, $stackPtr) - { - $rhinoPath = Config::getExecutablePath('rhino'); - $jshintPath = Config::getExecutablePath('jshint'); - if ($jshintPath === null) { - return $phpcsFile->numTokens; - } - - $fileName = $phpcsFile->getFilename(); - $jshintPath = Common::escapeshellcmd($jshintPath); - - if ($rhinoPath !== null) { - $rhinoPath = Common::escapeshellcmd($rhinoPath); - $cmd = "$rhinoPath \"$jshintPath\" ".escapeshellarg($fileName); - exec($cmd, $output, $retval); - - $regex = '`^(?P.+)\(.+:(?P[0-9]+).*:[0-9]+\)$`'; - } else { - $cmd = "$jshintPath ".escapeshellarg($fileName); - exec($cmd, $output, $retval); - - $regex = '`^(.+?): line (?P[0-9]+), col [0-9]+, (?P.+)$`'; - } - - if (is_array($output) === true) { - foreach ($output as $finding) { - $matches = []; - $numMatches = preg_match($regex, $finding, $matches); - if ($numMatches === 0) { - continue; - } - - $line = (int) $matches['line']; - $message = 'jshint says: '.trim($matches['error']); - $phpcsFile->addWarningOnLine($message, $line, 'ExternalTool'); - } - } - - // Ignore the rest of the file. - return $phpcsFile->numTokens; - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'Support for scanning JavaScript files will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/ByteOrderMarkSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/ByteOrderMarkSniff.php deleted file mode 100644 index 4e06fb7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/ByteOrderMarkSniff.php +++ /dev/null @@ -1,82 +0,0 @@ - - * @author Greg Sherwood - * @copyright 2010-2014 mediaSELF Sp. z o.o. - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ByteOrderMarkSniff implements Sniff -{ - - /** - * List of supported BOM definitions. - * - * Use encoding names as keys and hex BOM representations as values. - * - * @var array - */ - protected $bomDefinitions = [ - 'UTF-8' => 'efbbbf', - 'UTF-16 (BE)' => 'feff', - 'UTF-16 (LE)' => 'fffe', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_INLINE_HTML]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return int - */ - public function process(File $phpcsFile, $stackPtr) - { - // The BOM will be the very first token in the file. - if ($stackPtr !== 0) { - return $phpcsFile->numTokens; - } - - $tokens = $phpcsFile->getTokens(); - - foreach ($this->bomDefinitions as $bomName => $expectedBomHex) { - $bomByteLength = (strlen($expectedBomHex) / 2); - $htmlBomHex = bin2hex(substr($tokens[$stackPtr]['content'], 0, $bomByteLength)); - if ($htmlBomHex === $expectedBomHex) { - $errorData = [$bomName]; - $error = 'File contains %s byte order mark, which may corrupt your application'; - $phpcsFile->addError($error, $stackPtr, 'Found', $errorData); - $phpcsFile->recordMetric($stackPtr, 'Using byte order mark', 'yes'); - return $phpcsFile->numTokens; - } - } - - $phpcsFile->recordMetric($stackPtr, 'Using byte order mark', 'no'); - - return $phpcsFile->numTokens; - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/EndFileNewlineSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/EndFileNewlineSniff.php deleted file mode 100644 index a1557ab..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/EndFileNewlineSniff.php +++ /dev/null @@ -1,84 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class EndFileNewlineSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - 'CSS', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_OPEN_TAG, - T_OPEN_TAG_WITH_ECHO, - ]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return int - */ - public function process(File $phpcsFile, $stackPtr) - { - // Skip to the end of the file. - $tokens = $phpcsFile->getTokens(); - $stackPtr = ($phpcsFile->numTokens - 1); - - if ($tokens[$stackPtr]['content'] === '') { - $stackPtr--; - } - - $eolCharLen = strlen($phpcsFile->eolChar); - $lastChars = substr($tokens[$stackPtr]['content'], ($eolCharLen * -1)); - if ($lastChars !== $phpcsFile->eolChar) { - $phpcsFile->recordMetric($stackPtr, 'Newline at EOF', 'no'); - - $error = 'File must end with a newline character'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NotFound'); - if ($fix === true) { - $phpcsFile->fixer->addNewline($stackPtr); - } - } else { - $phpcsFile->recordMetric($stackPtr, 'Newline at EOF', 'yes'); - } - - // Ignore the rest of the file. - return $phpcsFile->numTokens; - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/EndFileNoNewlineSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/EndFileNoNewlineSniff.php deleted file mode 100644 index d49a5a2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/EndFileNoNewlineSniff.php +++ /dev/null @@ -1,91 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class EndFileNoNewlineSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - 'CSS', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_OPEN_TAG, - T_OPEN_TAG_WITH_ECHO, - ]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return int - */ - public function process(File $phpcsFile, $stackPtr) - { - // Skip to the end of the file. - $tokens = $phpcsFile->getTokens(); - $stackPtr = ($phpcsFile->numTokens - 1); - - if ($tokens[$stackPtr]['content'] === '') { - --$stackPtr; - } - - $eolCharLen = strlen($phpcsFile->eolChar); - $lastChars = substr($tokens[$stackPtr]['content'], ($eolCharLen * -1)); - if ($lastChars === $phpcsFile->eolChar) { - $error = 'File must not end with a newline character'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Found'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - for ($i = $stackPtr; $i > 0; $i--) { - $newContent = rtrim($tokens[$i]['content'], $phpcsFile->eolChar); - $phpcsFile->fixer->replaceToken($i, $newContent); - - if ($newContent !== '') { - break; - } - } - - $phpcsFile->fixer->endChangeset(); - } - } - - // Ignore the rest of the file. - return $phpcsFile->numTokens; - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/ExecutableFileSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/ExecutableFileSniff.php deleted file mode 100644 index 37e3fe6..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/ExecutableFileSniff.php +++ /dev/null @@ -1,62 +0,0 @@ - - * @copyright 2019 Matthew Peveler - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ExecutableFileSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_OPEN_TAG, - T_OPEN_TAG_WITH_ECHO, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return int - */ - public function process(File $phpcsFile, $stackPtr) - { - $filename = $phpcsFile->getFilename(); - - if ($filename !== 'STDIN') { - $perms = fileperms($phpcsFile->getFilename()); - if (($perms & 0x0040) !== 0 || ($perms & 0x0008) !== 0 || ($perms & 0x0001) !== 0) { - $error = 'A PHP file should not be executable; found file permissions set to %s'; - $data = [substr(sprintf('%o', $perms), -4)]; - $phpcsFile->addError($error, 0, 'Executable', $data); - } - } - - // Ignore the rest of the file. - return $phpcsFile->numTokens; - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/InlineHTMLSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/InlineHTMLSniff.php deleted file mode 100644 index 19ea007..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/InlineHTMLSniff.php +++ /dev/null @@ -1,79 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class InlineHTMLSniff implements Sniff -{ - - /** - * List of supported BOM definitions. - * - * Use encoding names as keys and hex BOM representations as values. - * - * @var array - */ - protected $bomDefinitions = [ - 'UTF-8' => 'efbbbf', - 'UTF-16 (BE)' => 'feff', - 'UTF-16 (LE)' => 'fffe', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_INLINE_HTML]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return int|void - */ - public function process(File $phpcsFile, $stackPtr) - { - // Allow a byte-order mark. - $tokens = $phpcsFile->getTokens(); - foreach ($this->bomDefinitions as $expectedBomHex) { - $bomByteLength = (strlen($expectedBomHex) / 2); - $htmlBomHex = bin2hex(substr($tokens[0]['content'], 0, $bomByteLength)); - if ($htmlBomHex === $expectedBomHex && strlen($tokens[0]['content']) === $bomByteLength) { - return; - } - } - - // Ignore shebang lines. - $tokens = $phpcsFile->getTokens(); - if (substr($tokens[$stackPtr]['content'], 0, 2) === '#!') { - return; - } - - $error = 'PHP files must only contain PHP code'; - $phpcsFile->addError($error, $stackPtr, 'Found'); - - return $phpcsFile->numTokens; - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/LineEndingsSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/LineEndingsSniff.php deleted file mode 100644 index 6d77413..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/LineEndingsSniff.php +++ /dev/null @@ -1,148 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class LineEndingsSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - 'CSS', - ]; - - /** - * The valid EOL character. - * - * @var string - */ - public $eolChar = '\n'; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_OPEN_TAG, - T_OPEN_TAG_WITH_ECHO, - ]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return int - */ - public function process(File $phpcsFile, $stackPtr) - { - $found = $phpcsFile->eolChar; - $found = str_replace("\n", '\n', $found); - $found = str_replace("\r", '\r', $found); - - $phpcsFile->recordMetric($stackPtr, 'EOL char', $found); - - if ($found === $this->eolChar) { - // Ignore the rest of the file. - return $phpcsFile->numTokens; - } - - // Check for single line files without an EOL. This is a very special - // case and the EOL char is set to \n when this happens. - if ($found === '\n') { - $tokens = $phpcsFile->getTokens(); - $lastToken = ($phpcsFile->numTokens - 1); - if ($tokens[$lastToken]['line'] === 1 - && $tokens[$lastToken]['content'] !== "\n" - ) { - return $phpcsFile->numTokens; - } - } - - $error = 'End of line character is invalid; expected "%s" but found "%s"'; - $expected = $this->eolChar; - $expected = str_replace("\n", '\n', $expected); - $expected = str_replace("\r", '\r', $expected); - $data = [ - $expected, - $found, - ]; - - // Errors are always reported on line 1, no matter where the first PHP tag is. - $fix = $phpcsFile->addFixableError($error, 0, 'InvalidEOLChar', $data); - - if ($fix === true) { - $tokens = $phpcsFile->getTokens(); - switch ($this->eolChar) { - case '\n': - $eolChar = "\n"; - break; - case '\r': - $eolChar = "\r"; - break; - case '\r\n': - $eolChar = "\r\n"; - break; - default: - $eolChar = $this->eolChar; - break; - } - - for ($i = 0; $i < $phpcsFile->numTokens; $i++) { - if (isset($tokens[($i + 1)]) === true - && $tokens[($i + 1)]['line'] <= $tokens[$i]['line'] - ) { - continue; - } - - // Token is the last on a line. - if (isset($tokens[$i]['orig_content']) === true) { - $tokenContent = $tokens[$i]['orig_content']; - } else { - $tokenContent = $tokens[$i]['content']; - } - - if ($tokenContent === '') { - // Special case for JS/CSS close tag. - continue; - } - - $newContent = rtrim($tokenContent, "\r\n"); - $newContent .= $eolChar; - if ($tokenContent !== $newContent) { - $phpcsFile->fixer->replaceToken($i, $newContent); - } - }//end for - }//end if - - // Ignore the rest of the file. - return $phpcsFile->numTokens; - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/LineLengthSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/LineLengthSniff.php deleted file mode 100644 index f5d4cd2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/LineLengthSniff.php +++ /dev/null @@ -1,201 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class LineLengthSniff implements Sniff -{ - - /** - * The limit that the length of a line should not exceed. - * - * @var integer - */ - public $lineLimit = 80; - - /** - * The limit that the length of a line must not exceed. - * - * Set to zero (0) to disable. - * - * @var integer - */ - public $absoluteLineLimit = 100; - - /** - * Whether or not to ignore trailing comments. - * - * This has the effect of also ignoring all lines - * that only contain comments. - * - * @var boolean - */ - public $ignoreComments = false; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return int - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - for ($i = 1; $i < $phpcsFile->numTokens; $i++) { - if ($tokens[$i]['column'] === 1) { - $this->checkLineLength($phpcsFile, $tokens, $i); - } - } - - $this->checkLineLength($phpcsFile, $tokens, $i); - - // Ignore the rest of the file. - return $phpcsFile->numTokens; - - }//end process() - - - /** - * Checks if a line is too long. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param array $tokens The token stack. - * @param int $stackPtr The first token on the next line. - * - * @return void - */ - protected function checkLineLength($phpcsFile, $tokens, $stackPtr) - { - // The passed token is the first on the line. - $stackPtr--; - - if ($tokens[$stackPtr]['column'] === 1 - && $tokens[$stackPtr]['length'] === 0 - ) { - // Blank line. - return; - } - - if ($tokens[$stackPtr]['column'] !== 1 - && $tokens[$stackPtr]['content'] === $phpcsFile->eolChar - ) { - $stackPtr--; - } - - $onlyComment = false; - if (isset(Tokens::$commentTokens[$tokens[$stackPtr]['code']]) === true) { - $prevNonWhiteSpace = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($tokens[$stackPtr]['line'] !== $tokens[$prevNonWhiteSpace]['line']) { - $onlyComment = true; - } - } - - if ($onlyComment === true - && isset(Tokens::$phpcsCommentTokens[$tokens[$stackPtr]['code']]) === true - ) { - // Ignore PHPCS annotation comments that are on a line by themselves. - return; - } - - $lineLength = ($tokens[$stackPtr]['column'] + $tokens[$stackPtr]['length'] - 1); - - if ($this->ignoreComments === true - && isset(Tokens::$commentTokens[$tokens[$stackPtr]['code']]) === true - ) { - // Trailing comments are being ignored in line length calculations. - if ($onlyComment === true) { - // The comment is the only thing on the line, so no need to check length. - return; - } - - $lineLength -= $tokens[$stackPtr]['length']; - } - - // Record metrics for common line length groupings. - if ($lineLength <= 80) { - $phpcsFile->recordMetric($stackPtr, 'Line length', '80 or less'); - } else if ($lineLength <= 120) { - $phpcsFile->recordMetric($stackPtr, 'Line length', '81-120'); - } else if ($lineLength <= 150) { - $phpcsFile->recordMetric($stackPtr, 'Line length', '121-150'); - } else { - $phpcsFile->recordMetric($stackPtr, 'Line length', '151 or more'); - } - - if ($onlyComment === true) { - // If this is a long comment, check if it can be broken up onto multiple lines. - // Some comments contain unbreakable strings like URLs and so it makes sense - // to ignore the line length in these cases if the URL would be longer than the max - // line length once you indent it to the correct level. - if ($lineLength > $this->lineLimit) { - $oldLength = strlen($tokens[$stackPtr]['content']); - $newLength = strlen(ltrim($tokens[$stackPtr]['content'], "/#\t ")); - $indent = (($tokens[$stackPtr]['column'] - 1) + ($oldLength - $newLength)); - - $nonBreakingLength = $tokens[$stackPtr]['length']; - - $space = strrpos($tokens[$stackPtr]['content'], ' '); - if ($space !== false) { - $nonBreakingLength -= ($space + 1); - } - - if (($nonBreakingLength + $indent) > $this->lineLimit) { - return; - } - } - }//end if - - if ($this->absoluteLineLimit > 0 - && $lineLength > $this->absoluteLineLimit - ) { - $data = [ - $this->absoluteLineLimit, - $lineLength, - ]; - - $error = 'Line exceeds maximum limit of %s characters; contains %s characters'; - $phpcsFile->addError($error, $stackPtr, 'MaxExceeded', $data); - } else if ($lineLength > $this->lineLimit) { - $data = [ - $this->lineLimit, - $lineLength, - ]; - - $warning = 'Line exceeds %s characters; contains %s characters'; - $phpcsFile->addWarning($warning, $stackPtr, 'TooLong', $data); - } - - }//end checkLineLength() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/LowercasedFilenameSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/LowercasedFilenameSniff.php deleted file mode 100644 index e0d6983..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/LowercasedFilenameSniff.php +++ /dev/null @@ -1,70 +0,0 @@ - - * @copyright 2010-2014 Andy Grunwald - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class LowercasedFilenameSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_OPEN_TAG, - T_OPEN_TAG_WITH_ECHO, - ]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return int - */ - public function process(File $phpcsFile, $stackPtr) - { - $filename = $phpcsFile->getFilename(); - if ($filename === 'STDIN') { - return $phpcsFile->numTokens; - } - - $filename = basename($filename); - $lowercaseFilename = strtolower($filename); - if ($filename !== $lowercaseFilename) { - $data = [ - $filename, - $lowercaseFilename, - ]; - $error = 'Filename "%s" doesn\'t match the expected filename "%s"'; - $phpcsFile->addError($error, $stackPtr, 'NotFound', $data); - $phpcsFile->recordMetric($stackPtr, 'Lowercase filename', 'no'); - } else { - $phpcsFile->recordMetric($stackPtr, 'Lowercase filename', 'yes'); - } - - // Ignore the rest of the file. - return $phpcsFile->numTokens; - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/OneClassPerFileSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/OneClassPerFileSniff.php deleted file mode 100644 index 3d3eef4..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/OneClassPerFileSniff.php +++ /dev/null @@ -1,57 +0,0 @@ - - * @copyright 2010-2014 Andy Grunwald - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class OneClassPerFileSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_CLASS]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $start = ($stackPtr + 1); - if (isset($tokens[$stackPtr]['scope_closer']) === true) { - $start = ($tokens[$stackPtr]['scope_closer'] + 1); - } - - $nextClass = $phpcsFile->findNext($this->register(), $start); - if ($nextClass !== false) { - $error = 'Only one class is allowed in a file'; - $phpcsFile->addError($error, $nextClass, 'MultipleFound'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/OneInterfacePerFileSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/OneInterfacePerFileSniff.php deleted file mode 100644 index 8487227..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/OneInterfacePerFileSniff.php +++ /dev/null @@ -1,57 +0,0 @@ - - * @copyright 2010-2014 Andy Grunwald - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class OneInterfacePerFileSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_INTERFACE]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $start = ($stackPtr + 1); - if (isset($tokens[$stackPtr]['scope_closer']) === true) { - $start = ($tokens[$stackPtr]['scope_closer'] + 1); - } - - $nextInterface = $phpcsFile->findNext($this->register(), $start); - if ($nextInterface !== false) { - $error = 'Only one interface is allowed in a file'; - $phpcsFile->addError($error, $nextInterface, 'MultipleFound'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/OneObjectStructurePerFileSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/OneObjectStructurePerFileSniff.php deleted file mode 100644 index c59e438..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/OneObjectStructurePerFileSniff.php +++ /dev/null @@ -1,62 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class OneObjectStructurePerFileSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_CLASS, - T_INTERFACE, - T_TRAIT, - T_ENUM, - ]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $start = ($stackPtr + 1); - if (isset($tokens[$stackPtr]['scope_closer']) === true) { - $start = ($tokens[$stackPtr]['scope_closer'] + 1); - } - - $nextClass = $phpcsFile->findNext($this->register(), $start); - if ($nextClass !== false) { - $error = 'Only one object structure is allowed in a file'; - $phpcsFile->addError($error, $nextClass, 'MultipleFound'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/OneTraitPerFileSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/OneTraitPerFileSniff.php deleted file mode 100644 index 2a54d2b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Files/OneTraitPerFileSniff.php +++ /dev/null @@ -1,57 +0,0 @@ - - * @copyright 2010-2014 Alexander Obuhovich - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class OneTraitPerFileSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_TRAIT]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $start = ($stackPtr + 1); - if (isset($tokens[$stackPtr]['scope_closer']) === true) { - $start = ($tokens[$stackPtr]['scope_closer'] + 1); - } - - $nextClass = $phpcsFile->findNext($this->register(), $start); - if ($nextClass !== false) { - $error = 'Only one trait is allowed in a file'; - $phpcsFile->addError($error, $nextClass, 'MultipleFound'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/DisallowMultipleStatementsSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/DisallowMultipleStatementsSniff.php deleted file mode 100644 index cf9f80f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/DisallowMultipleStatementsSniff.php +++ /dev/null @@ -1,105 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Formatting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class DisallowMultipleStatementsSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_SEMICOLON]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $fixable = true; - $prev = $stackPtr; - - do { - $prev = $phpcsFile->findPrevious([T_SEMICOLON, T_OPEN_TAG, T_OPEN_TAG_WITH_ECHO, T_PHPCS_IGNORE], ($prev - 1)); - if ($prev === false - || $tokens[$prev]['code'] === T_OPEN_TAG - || $tokens[$prev]['code'] === T_OPEN_TAG_WITH_ECHO - ) { - $phpcsFile->recordMetric($stackPtr, 'Multiple statements on same line', 'no'); - return; - } - - if ($tokens[$prev]['code'] === T_PHPCS_IGNORE) { - $fixable = false; - } - } while ($tokens[$prev]['code'] === T_PHPCS_IGNORE); - - // Ignore multiple statements in a FOR condition. - foreach ([$stackPtr, $prev] as $checkToken) { - if (isset($tokens[$checkToken]['nested_parenthesis']) === true) { - foreach ($tokens[$checkToken]['nested_parenthesis'] as $bracket) { - if (isset($tokens[$bracket]['parenthesis_owner']) === false) { - // Probably a closure sitting inside a function call. - continue; - } - - $owner = $tokens[$bracket]['parenthesis_owner']; - if ($tokens[$owner]['code'] === T_FOR) { - return; - } - } - } - } - - if ($tokens[$prev]['line'] === $tokens[$stackPtr]['line']) { - $phpcsFile->recordMetric($stackPtr, 'Multiple statements on same line', 'yes'); - - $error = 'Each PHP statement must be on a line by itself'; - $code = 'SameLine'; - if ($fixable === false) { - $phpcsFile->addError($error, $stackPtr, $code); - return; - } - - $fix = $phpcsFile->addFixableError($error, $stackPtr, $code); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->addNewline($prev); - if ($tokens[($prev + 1)]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->replaceToken(($prev + 1), ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } else { - $phpcsFile->recordMetric($stackPtr, 'Multiple statements on same line', 'no'); - }//end if - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/MultipleStatementAlignmentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/MultipleStatementAlignmentSniff.php deleted file mode 100644 index 6ffdbba..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/MultipleStatementAlignmentSniff.php +++ /dev/null @@ -1,426 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Formatting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class MultipleStatementAlignmentSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - /** - * If true, an error will be thrown; otherwise a warning. - * - * @var boolean - */ - public $error = false; - - /** - * The maximum amount of padding before the alignment is ignored. - * - * If the amount of padding required to align this assignment with the - * surrounding assignments exceeds this number, the assignment will be - * ignored and no errors or warnings will be thrown. - * - * @var integer - */ - public $maxPadding = 1000; - - /** - * Controls which side of the assignment token is used for alignment. - * - * @var boolean - */ - public $alignAtEnd = true; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - $tokens = Tokens::$assignmentTokens; - unset($tokens[T_DOUBLE_ARROW]); - return $tokens; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return int - */ - public function process(File $phpcsFile, $stackPtr) - { - $lastAssign = $this->checkAlignment($phpcsFile, $stackPtr); - return ($lastAssign + 1); - - }//end process() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int|null $end The token where checking should end. - * If NULL, the entire file will be checked. - * - * @return int - */ - public function checkAlignment($phpcsFile, $stackPtr, $end=null) - { - $tokens = $phpcsFile->getTokens(); - - // Ignore assignments used in a condition, like an IF or FOR or closure param defaults. - if (isset($tokens[$stackPtr]['nested_parenthesis']) === true) { - // If the parenthesis is on the same line as the assignment, - // then it should be ignored as it is specifically being grouped. - $parens = $tokens[$stackPtr]['nested_parenthesis']; - $lastParen = array_pop($parens); - if ($tokens[$lastParen]['line'] === $tokens[$stackPtr]['line']) { - return $stackPtr; - } - - foreach ($tokens[$stackPtr]['nested_parenthesis'] as $start => $end) { - if (isset($tokens[$start]['parenthesis_owner']) === true) { - return $stackPtr; - } - } - } - - $assignments = []; - $prevAssign = null; - $lastLine = $tokens[$stackPtr]['line']; - $maxPadding = null; - $stopped = null; - $lastCode = $stackPtr; - $lastSemi = null; - $arrayEnd = null; - - if ($end === null) { - $end = $phpcsFile->numTokens; - } - - $find = Tokens::$assignmentTokens; - unset($find[T_DOUBLE_ARROW]); - - $scopes = Tokens::$scopeOpeners; - unset($scopes[T_CLOSURE]); - unset($scopes[T_ANON_CLASS]); - unset($scopes[T_OBJECT]); - - for ($assign = $stackPtr; $assign < $end; $assign++) { - if ($tokens[$assign]['level'] < $tokens[$stackPtr]['level']) { - // Statement is in a different context, so the block is over. - break; - } - - if (isset($tokens[$assign]['scope_opener']) === true - && $tokens[$assign]['level'] === $tokens[$stackPtr]['level'] - ) { - if (isset($scopes[$tokens[$assign]['code']]) === true) { - // This type of scope indicates that the assignment block is over. - break; - } - - // Skip over the scope block because it is seen as part of the assignment block, - // but also process any assignment blocks that are inside as well. - $nextAssign = $phpcsFile->findNext($find, ($assign + 1), ($tokens[$assign]['scope_closer'] - 1)); - if ($nextAssign !== false) { - $assign = $this->checkAlignment($phpcsFile, $nextAssign); - } else { - $assign = $tokens[$assign]['scope_closer']; - } - - $lastCode = $assign; - continue; - } - - if ($assign === $arrayEnd) { - $arrayEnd = null; - } - - if (isset($find[$tokens[$assign]['code']]) === false) { - // A blank line indicates that the assignment block has ended. - if (isset(Tokens::$emptyTokens[$tokens[$assign]['code']]) === false - && ($tokens[$assign]['line'] - $tokens[$lastCode]['line']) > 1 - && $tokens[$assign]['level'] === $tokens[$stackPtr]['level'] - && $arrayEnd === null - ) { - break; - } - - if ($tokens[$assign]['code'] === T_CLOSE_TAG) { - // Breaking out of PHP ends the assignment block. - break; - } - - if ($tokens[$assign]['code'] === T_OPEN_SHORT_ARRAY - && isset($tokens[$assign]['bracket_closer']) === true - ) { - $arrayEnd = $tokens[$assign]['bracket_closer']; - } - - if ($tokens[$assign]['code'] === T_ARRAY - && isset($tokens[$assign]['parenthesis_opener']) === true - && isset($tokens[$tokens[$assign]['parenthesis_opener']]['parenthesis_closer']) === true - ) { - $arrayEnd = $tokens[$tokens[$assign]['parenthesis_opener']]['parenthesis_closer']; - } - - if (isset(Tokens::$emptyTokens[$tokens[$assign]['code']]) === false) { - $lastCode = $assign; - - if ($tokens[$assign]['code'] === T_SEMICOLON) { - if ($tokens[$assign]['conditions'] === $tokens[$stackPtr]['conditions']) { - if ($lastSemi !== null && $prevAssign !== null && $lastSemi > $prevAssign) { - // This statement did not have an assignment operator in it. - break; - } else { - $lastSemi = $assign; - } - } else if ($tokens[$assign]['level'] < $tokens[$stackPtr]['level']) { - // Statement is in a different context, so the block is over. - break; - } - } - }//end if - - continue; - } else if ($assign !== $stackPtr && $tokens[$assign]['line'] === $lastLine) { - // Skip multiple assignments on the same line. We only need to - // try and align the first assignment. - continue; - }//end if - - if ($assign !== $stackPtr) { - if ($tokens[$assign]['level'] > $tokens[$stackPtr]['level']) { - // Has to be nested inside the same conditions as the first assignment. - // We've gone one level down, so process this new block. - $assign = $this->checkAlignment($phpcsFile, $assign); - $lastCode = $assign; - continue; - } else if ($tokens[$assign]['level'] < $tokens[$stackPtr]['level']) { - // We've gone one level up, so the block we are processing is done. - break; - } else if ($arrayEnd !== null) { - // Assignments inside arrays are not part of - // the original block, so process this new block. - $assign = ($this->checkAlignment($phpcsFile, $assign, $arrayEnd) - 1); - $arrayEnd = null; - $lastCode = $assign; - continue; - } - - // Make sure it is not assigned inside a condition (eg. IF, FOR). - if (isset($tokens[$assign]['nested_parenthesis']) === true) { - // If the parenthesis is on the same line as the assignment, - // then it should be ignored as it is specifically being grouped. - $parens = $tokens[$assign]['nested_parenthesis']; - $lastParen = array_pop($parens); - if ($tokens[$lastParen]['line'] === $tokens[$assign]['line']) { - break; - } - - foreach ($tokens[$assign]['nested_parenthesis'] as $start => $end) { - if (isset($tokens[$start]['parenthesis_owner']) === true) { - break(2); - } - } - } - }//end if - - $var = $phpcsFile->findPrevious( - Tokens::$emptyTokens, - ($assign - 1), - null, - true - ); - - // Make sure we wouldn't break our max padding length if we - // aligned with this statement, or they wouldn't break the max - // padding length if they aligned with us. - $varEnd = $tokens[($var + 1)]['column']; - $assignLen = $tokens[$assign]['length']; - if ($this->alignAtEnd !== true) { - $assignLen = 1; - } - - if ($assign !== $stackPtr) { - if ($prevAssign === null) { - // Processing an inner block but no assignments found. - break; - } - - if (($varEnd + 1) > $assignments[$prevAssign]['assign_col']) { - $padding = 1; - $assignColumn = ($varEnd + 1); - } else { - $padding = ($assignments[$prevAssign]['assign_col'] - $varEnd + $assignments[$prevAssign]['assign_len'] - $assignLen); - if ($padding <= 0) { - $padding = 1; - } - - if ($padding > $this->maxPadding) { - $stopped = $assign; - break; - } - - $assignColumn = ($varEnd + $padding); - }//end if - - if (($assignColumn + $assignLen) > ($assignments[$maxPadding]['assign_col'] + $assignments[$maxPadding]['assign_len'])) { - $newPadding = ($varEnd - $assignments[$maxPadding]['var_end'] + $assignLen - $assignments[$maxPadding]['assign_len'] + 1); - if ($newPadding > $this->maxPadding) { - $stopped = $assign; - break; - } else { - // New alignment settings for previous assignments. - foreach ($assignments as $i => $data) { - if ($i === $assign) { - break; - } - - $newPadding = ($varEnd - $data['var_end'] + $assignLen - $data['assign_len'] + 1); - $assignments[$i]['expected'] = $newPadding; - $assignments[$i]['assign_col'] = ($data['var_end'] + $newPadding); - } - - $padding = 1; - $assignColumn = ($varEnd + 1); - } - } else if ($padding > $assignments[$maxPadding]['expected']) { - $maxPadding = $assign; - }//end if - } else { - $padding = 1; - $assignColumn = ($varEnd + 1); - $maxPadding = $assign; - }//end if - - $found = 0; - if ($tokens[($var + 1)]['code'] === T_WHITESPACE) { - $found = $tokens[($var + 1)]['length']; - if ($found === 0) { - // This means a newline was found. - $found = 1; - } - } - - $assignments[$assign] = [ - 'var_end' => $varEnd, - 'assign_len' => $assignLen, - 'assign_col' => $assignColumn, - 'expected' => $padding, - 'found' => $found, - ]; - - $lastLine = $tokens[$assign]['line']; - $prevAssign = $assign; - }//end for - - if (empty($assignments) === true) { - return $stackPtr; - } - - $numAssignments = count($assignments); - - $errorGenerated = false; - foreach ($assignments as $assignment => $data) { - if ($data['found'] === $data['expected']) { - continue; - } - - $expectedText = $data['expected'].' space'; - if ($data['expected'] !== 1) { - $expectedText .= 's'; - } - - if ($data['found'] === null) { - $foundText = 'a new line'; - } else { - $foundText = $data['found'].' space'; - if ($data['found'] !== 1) { - $foundText .= 's'; - } - } - - if ($numAssignments === 1) { - $type = 'Incorrect'; - $error = 'Equals sign not aligned correctly; expected %s but found %s'; - } else { - $type = 'NotSame'; - $error = 'Equals sign not aligned with surrounding assignments; expected %s but found %s'; - } - - $errorData = [ - $expectedText, - $foundText, - ]; - - if ($this->error === true) { - $fix = $phpcsFile->addFixableError($error, $assignment, $type, $errorData); - } else { - $fix = $phpcsFile->addFixableWarning($error, $assignment, $type.'Warning', $errorData); - } - - $errorGenerated = true; - - if ($fix === true && $data['found'] !== null) { - $newContent = str_repeat(' ', $data['expected']); - if ($data['found'] === 0) { - $phpcsFile->fixer->addContentBefore($assignment, $newContent); - } else { - $phpcsFile->fixer->replaceToken(($assignment - 1), $newContent); - } - } - }//end foreach - - if ($numAssignments > 1) { - if ($errorGenerated === true) { - $phpcsFile->recordMetric($stackPtr, 'Adjacent assignments aligned', 'no'); - } else { - $phpcsFile->recordMetric($stackPtr, 'Adjacent assignments aligned', 'yes'); - } - } - - if ($stopped !== null) { - return $this->checkAlignment($phpcsFile, $stopped); - } else { - return $assign; - } - - }//end checkAlignment() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/NoSpaceAfterCastSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/NoSpaceAfterCastSniff.php deleted file mode 100644 index 351481b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/NoSpaceAfterCastSniff.php +++ /dev/null @@ -1,98 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.4.0 Use the Generic.Formatting.SpaceAfterCast sniff with - * the $spacing property set to 0 instead. - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Formatting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class NoSpaceAfterCastSniff implements Sniff, DeprecatedSniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return Tokens::$castTokens; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) { - return; - } - - $error = 'A cast statement must not be followed by a space'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceFound'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ''); - } - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.4.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'Use the Generic.Formatting.SpaceAfterCast sniff with the $spacing property set to 0 instead.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/SpaceAfterCastSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/SpaceAfterCastSniff.php deleted file mode 100644 index dd55c77..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/SpaceAfterCastSniff.php +++ /dev/null @@ -1,161 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Formatting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class SpaceAfterCastSniff implements Sniff -{ - - /** - * The number of spaces desired after a cast token. - * - * @var integer - */ - public $spacing = 1; - - /** - * Allow newlines instead of spaces. - * - * @var boolean - */ - public $ignoreNewlines = false; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return Tokens::$castTokens; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $this->spacing = (int) $this->spacing; - $pluralizeSpace = 's'; - if ($this->spacing === 1) { - $pluralizeSpace = ''; - } - - if ($tokens[$stackPtr]['code'] === T_BINARY_CAST - && $tokens[$stackPtr]['content'] === 'b' - ) { - // You can't replace a space after this type of binary casting. - return; - } - - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($nextNonEmpty === false) { - return; - } - - if ($this->ignoreNewlines === true - && $tokens[$stackPtr]['line'] !== $tokens[$nextNonEmpty]['line'] - ) { - $phpcsFile->recordMetric($stackPtr, 'Spacing after cast statement', 'newline'); - return; - } - - if ($this->spacing === 0 && $nextNonEmpty === ($stackPtr + 1)) { - $phpcsFile->recordMetric($stackPtr, 'Spacing after cast statement', 0); - return; - } - - $nextNonWhitespace = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($nextNonEmpty !== $nextNonWhitespace) { - $error = 'Expected %s space%s after cast statement; comment found'; - $data = [ - $this->spacing, - $pluralizeSpace, - ]; - $phpcsFile->addError($error, $stackPtr, 'CommentFound', $data); - - if ($tokens[($stackPtr + 1)]['code'] === T_WHITESPACE) { - $phpcsFile->recordMetric($stackPtr, 'Spacing after cast statement', $tokens[($stackPtr + 1)]['length']); - } else { - $phpcsFile->recordMetric($stackPtr, 'Spacing after cast statement', 0); - } - - return; - } - - $found = 0; - if ($tokens[$stackPtr]['line'] !== $tokens[$nextNonEmpty]['line']) { - $found = 'newline'; - } else if ($tokens[($stackPtr + 1)]['code'] === T_WHITESPACE) { - $found = $tokens[($stackPtr + 1)]['length']; - } - - $phpcsFile->recordMetric($stackPtr, 'Spacing after cast statement', $found); - - if ($found === $this->spacing) { - return; - } - - $error = 'Expected %s space%s after cast statement; %s found'; - $data = [ - $this->spacing, - $pluralizeSpace, - $found, - ]; - - $errorCode = 'TooMuchSpace'; - if ($this->spacing !== 0) { - if ($found === 0) { - $errorCode = 'NoSpace'; - } else if ($found !== 'newline' && $found < $this->spacing) { - $errorCode = 'TooLittleSpace'; - } - } - - $fix = $phpcsFile->addFixableError($error, $stackPtr, $errorCode, $data); - - if ($fix === true) { - $padding = str_repeat(' ', $this->spacing); - if ($found === 0) { - $phpcsFile->fixer->addContent($stackPtr, $padding); - } else { - $phpcsFile->fixer->beginChangeset(); - $start = ($stackPtr + 1); - - if ($this->spacing > 0) { - $phpcsFile->fixer->replaceToken($start, $padding); - ++$start; - } - - for ($i = $start; $i < $nextNonWhitespace; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/SpaceAfterNotSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/SpaceAfterNotSniff.php deleted file mode 100644 index 1a6af16..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/SpaceAfterNotSniff.php +++ /dev/null @@ -1,143 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Formatting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class SpaceAfterNotSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - /** - * The number of spaces desired after the NOT operator. - * - * @var integer - */ - public $spacing = 1; - - /** - * Allow newlines instead of spaces. - * - * @var boolean - */ - public $ignoreNewlines = false; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_BOOLEAN_NOT]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $this->spacing = (int) $this->spacing; - $pluralizeSpace = 's'; - if ($this->spacing === 1) { - $pluralizeSpace = ''; - } - - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($nextNonEmpty === false) { - return; - } - - if ($this->ignoreNewlines === true - && $tokens[$stackPtr]['line'] !== $tokens[$nextNonEmpty]['line'] - ) { - return; - } - - if ($this->spacing === 0 && $nextNonEmpty === ($stackPtr + 1)) { - return; - } - - $nextNonWhitespace = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($nextNonEmpty !== $nextNonWhitespace) { - $error = 'Expected %s space%s after NOT operator; comment found'; - $data = [ - $this->spacing, - $pluralizeSpace, - ]; - $phpcsFile->addError($error, $stackPtr, 'CommentFound', $data); - return; - } - - $found = 0; - if ($tokens[$stackPtr]['line'] !== $tokens[$nextNonEmpty]['line']) { - $found = 'newline'; - } else if ($tokens[($stackPtr + 1)]['code'] === T_WHITESPACE) { - $found = $tokens[($stackPtr + 1)]['length']; - } - - if ($found === $this->spacing) { - return; - } - - $error = 'Expected %s space%s after NOT operator; %s found'; - $data = [ - $this->spacing, - $pluralizeSpace, - $found, - ]; - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Incorrect', $data); - if ($fix === true) { - $padding = str_repeat(' ', $this->spacing); - if ($found === 0) { - $phpcsFile->fixer->addContent($stackPtr, $padding); - } else { - $phpcsFile->fixer->beginChangeset(); - $start = ($stackPtr + 1); - - if ($this->spacing > 0) { - $phpcsFile->fixer->replaceToken($start, $padding); - ++$start; - } - - for ($i = $start; $i < $nextNonWhitespace; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/SpaceBeforeCastSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/SpaceBeforeCastSniff.php deleted file mode 100644 index 322ad40..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Formatting/SpaceBeforeCastSniff.php +++ /dev/null @@ -1,73 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Formatting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class SpaceBeforeCastSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return Tokens::$castTokens; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['column'] === 1) { - return; - } - - if ($tokens[($stackPtr - 1)]['code'] !== T_WHITESPACE) { - $error = 'A cast statement must be preceded by a single space'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoSpace'); - if ($fix === true) { - $phpcsFile->fixer->addContentBefore($stackPtr, ' '); - } - - $phpcsFile->recordMetric($stackPtr, 'Spacing before cast statement', 0); - return; - } - - $phpcsFile->recordMetric($stackPtr, 'Spacing before cast statement', $tokens[($stackPtr - 1)]['length']); - - if ($tokens[($stackPtr - 1)]['column'] !== 1 && $tokens[($stackPtr - 1)]['length'] !== 1) { - $error = 'A cast statement must be preceded by a single space'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'TooMuchSpace'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr - 1), ' '); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Functions/CallTimePassByReferenceSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Functions/CallTimePassByReferenceSniff.php deleted file mode 100644 index e407867..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Functions/CallTimePassByReferenceSniff.php +++ /dev/null @@ -1,180 +0,0 @@ - - * @copyright 2009-2014 Florian Grandel - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.12.1 - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Functions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class CallTimePassByReferenceSniff implements Sniff, DeprecatedSniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_STRING, - T_VARIABLE, - T_ANON_CLASS, - T_PARENT, - T_SELF, - T_STATIC, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $findTokens = Tokens::$emptyTokens; - $findTokens[] = T_BITWISE_AND; - - $prev = $phpcsFile->findPrevious($findTokens, ($stackPtr - 1), null, true); - - // Skip tokens that are the names of functions - // within their definitions. For example: function myFunction... - // "myFunction" is T_STRING but we should skip because it is not a - // function or method *call*. - $prevCode = $tokens[$prev]['code']; - if ($prevCode === T_FUNCTION) { - return; - } - - // If the next non-whitespace token after the function or method call - // is not an opening parenthesis then it cant really be a *call*. - $functionName = $stackPtr; - $openBracket = $phpcsFile->findNext( - Tokens::$emptyTokens, - ($functionName + 1), - null, - true - ); - - if ($openBracket === false || $tokens[$openBracket]['code'] !== T_OPEN_PARENTHESIS) { - return; - } - - if (isset($tokens[$openBracket]['parenthesis_closer']) === false) { - return; - } - - $closeBracket = $tokens[$openBracket]['parenthesis_closer']; - - $nextSeparator = $openBracket; - $find = [ - T_VARIABLE, - T_OPEN_SHORT_ARRAY, - ]; - - while (($nextSeparator = $phpcsFile->findNext($find, ($nextSeparator + 1), $closeBracket)) !== false) { - if ($tokens[$nextSeparator]['code'] === T_OPEN_SHORT_ARRAY) { - $nextSeparator = $tokens[$nextSeparator]['bracket_closer']; - continue; - } - - // Make sure the variable belongs directly to this function call - // and is not inside a nested function call or array. - $brackets = $tokens[$nextSeparator]['nested_parenthesis']; - $lastBracket = array_pop($brackets); - if ($lastBracket !== $closeBracket) { - continue; - } - - $tokenBefore = $phpcsFile->findPrevious( - Tokens::$emptyTokens, - ($nextSeparator - 1), - null, - true - ); - - if ($tokens[$tokenBefore]['code'] === T_BITWISE_AND) { - if ($phpcsFile->isReference($tokenBefore) === false) { - continue; - } - - // We also want to ignore references used in assignment - // operations passed as function arguments, but isReference() - // sees them as valid references (which they are). - $tokenBefore = $phpcsFile->findPrevious( - Tokens::$emptyTokens, - ($tokenBefore - 1), - null, - true - ); - - if (isset(Tokens::$assignmentTokens[$tokens[$tokenBefore]['code']]) === true) { - continue; - } - - // T_BITWISE_AND represents a pass-by-reference. - $error = 'Call-time pass-by-reference calls are prohibited'; - $phpcsFile->addError($error, $tokenBefore, 'NotAllowed'); - }//end if - }//end while - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.12.1'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return ''; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Functions/FunctionCallArgumentSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Functions/FunctionCallArgumentSpacingSniff.php deleted file mode 100644 index d55f7a4..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Functions/FunctionCallArgumentSpacingSniff.php +++ /dev/null @@ -1,197 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Functions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class FunctionCallArgumentSpacingSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return[ - T_STRING, - T_ISSET, - T_UNSET, - T_SELF, - T_STATIC, - T_PARENT, - T_VARIABLE, - T_CLOSE_CURLY_BRACKET, - T_CLOSE_PARENTHESIS, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Skip tokens that are the names of functions or classes - // within their definitions. For example: - // function myFunction... - // "myFunction" is T_STRING but we should skip because it is not a - // function or method *call*. - $functionName = $stackPtr; - $ignoreTokens = Tokens::$emptyTokens; - $ignoreTokens[] = T_BITWISE_AND; - $functionKeyword = $phpcsFile->findPrevious($ignoreTokens, ($stackPtr - 1), null, true); - if ($tokens[$functionKeyword]['code'] === T_FUNCTION || $tokens[$functionKeyword]['code'] === T_CLASS) { - return; - } - - if ($tokens[$stackPtr]['code'] === T_CLOSE_CURLY_BRACKET - && isset($tokens[$stackPtr]['scope_condition']) === true - ) { - // Not a function call. - return; - } - - // If the next non-whitespace token after the function or method call - // is not an opening parenthesis then it can't really be a *call*. - $openBracket = $phpcsFile->findNext(Tokens::$emptyTokens, ($functionName + 1), null, true); - if ($tokens[$openBracket]['code'] !== T_OPEN_PARENTHESIS) { - return; - } - - if (isset($tokens[$openBracket]['parenthesis_closer']) === false) { - return; - } - - $this->checkSpacing($phpcsFile, $stackPtr, $openBracket); - - }//end process() - - - /** - * Checks the spacing around commas. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * @param int $openBracket The position of the opening bracket - * in the stack passed in $tokens. - * - * @return void - */ - public function checkSpacing(File $phpcsFile, $stackPtr, $openBracket) - { - $tokens = $phpcsFile->getTokens(); - - $closeBracket = $tokens[$openBracket]['parenthesis_closer']; - $nextSeparator = $openBracket; - - $find = [ - T_COMMA, - T_CLOSURE, - T_FN, - T_ANON_CLASS, - T_OPEN_SHORT_ARRAY, - T_MATCH, - ]; - - while (($nextSeparator = $phpcsFile->findNext($find, ($nextSeparator + 1), $closeBracket)) !== false) { - if ($tokens[$nextSeparator]['code'] === T_CLOSURE - || $tokens[$nextSeparator]['code'] === T_ANON_CLASS - || $tokens[$nextSeparator]['code'] === T_MATCH - ) { - // Skip closures, anon class declarations and match control structures. - $nextSeparator = $tokens[$nextSeparator]['scope_closer']; - continue; - } else if ($tokens[$nextSeparator]['code'] === T_FN) { - // Skip arrow functions, but don't skip the arrow function closer as it is likely to - // be the comma separating it from the next function call argument (or the parenthesis closer). - $nextSeparator = ($tokens[$nextSeparator]['scope_closer'] - 1); - continue; - } else if ($tokens[$nextSeparator]['code'] === T_OPEN_SHORT_ARRAY) { - // Skips arrays using short notation. - $nextSeparator = $tokens[$nextSeparator]['bracket_closer']; - continue; - } - - // Make sure the comma or variable belongs directly to this function call, - // and is not inside a nested function call or array. - $brackets = $tokens[$nextSeparator]['nested_parenthesis']; - $lastBracket = array_pop($brackets); - if ($lastBracket !== $closeBracket) { - continue; - } - - if ($tokens[$nextSeparator]['code'] === T_COMMA) { - if ($tokens[($nextSeparator - 1)]['code'] === T_WHITESPACE) { - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($nextSeparator - 2), null, true); - if (isset(Tokens::$heredocTokens[$tokens[$prev]['code']]) === false) { - $error = 'Space found before comma in argument list'; - $fix = $phpcsFile->addFixableError($error, $nextSeparator, 'SpaceBeforeComma'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - if ($tokens[$prev]['line'] !== $tokens[$nextSeparator]['line']) { - $phpcsFile->fixer->addContent($prev, ','); - $phpcsFile->fixer->replaceToken($nextSeparator, ''); - } else { - $phpcsFile->fixer->replaceToken(($nextSeparator - 1), ''); - } - - $phpcsFile->fixer->endChangeset(); - } - }//end if - }//end if - - if ($tokens[($nextSeparator + 1)]['code'] !== T_WHITESPACE) { - // Ignore trailing comma's after last argument as that's outside the scope of this sniff. - if (($nextSeparator + 1) !== $closeBracket) { - $error = 'No space found after comma in argument list'; - $fix = $phpcsFile->addFixableError($error, $nextSeparator, 'NoSpaceAfterComma'); - if ($fix === true) { - $phpcsFile->fixer->addContent($nextSeparator, ' '); - } - } - } else { - // If there is a newline in the space, then they must be formatting - // each argument on a newline, which is valid, so ignore it. - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($nextSeparator + 1), null, true); - if ($tokens[$next]['line'] === $tokens[$nextSeparator]['line']) { - $space = $tokens[($nextSeparator + 1)]['length']; - if ($space > 1) { - $error = 'Expected 1 space after comma in argument list; %s found'; - $data = [$space]; - $fix = $phpcsFile->addFixableError($error, $nextSeparator, 'TooMuchSpaceAfterComma', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($nextSeparator + 1), ' '); - } - } - } - }//end if - }//end if - }//end while - - }//end checkSpacing() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Functions/OpeningFunctionBraceBsdAllmanSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Functions/OpeningFunctionBraceBsdAllmanSniff.php deleted file mode 100644 index a3b26d9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Functions/OpeningFunctionBraceBsdAllmanSniff.php +++ /dev/null @@ -1,225 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Functions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class OpeningFunctionBraceBsdAllmanSniff implements Sniff -{ - - /** - * Should this sniff check function braces? - * - * @var boolean - */ - public $checkFunctions = true; - - /** - * Should this sniff check closure braces? - * - * @var boolean - */ - public $checkClosures = false; - - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_FUNCTION, - T_CLOSURE, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['scope_opener']) === false) { - return; - } - - if (($tokens[$stackPtr]['code'] === T_FUNCTION - && (bool) $this->checkFunctions === false) - || ($tokens[$stackPtr]['code'] === T_CLOSURE - && (bool) $this->checkClosures === false) - ) { - return; - } - - $openingBrace = $tokens[$stackPtr]['scope_opener']; - $closeBracket = $tokens[$stackPtr]['parenthesis_closer']; - if ($tokens[$stackPtr]['code'] === T_CLOSURE) { - $use = $phpcsFile->findNext(T_USE, ($closeBracket + 1), $tokens[$stackPtr]['scope_opener']); - if ($use !== false) { - $openBracket = $phpcsFile->findNext(T_OPEN_PARENTHESIS, ($use + 1)); - $closeBracket = $tokens[$openBracket]['parenthesis_closer']; - } - } - - // Find the end of the function declaration. - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($openingBrace - 1), $closeBracket, true); - - $functionLine = $tokens[$prev]['line']; - $braceLine = $tokens[$openingBrace]['line']; - - $lineDifference = ($braceLine - $functionLine); - - $metricType = 'Function'; - if ($tokens[$stackPtr]['code'] === T_CLOSURE) { - $metricType = 'Closure'; - } - - if ($lineDifference === 0) { - $error = 'Opening brace should be on a new line'; - $fix = $phpcsFile->addFixableError($error, $openingBrace, 'BraceOnSameLine'); - if ($fix === true) { - $hasTrailingAnnotation = false; - for ($nextLine = ($openingBrace + 1); $nextLine < $phpcsFile->numTokens; $nextLine++) { - if ($tokens[$openingBrace]['line'] !== $tokens[$nextLine]['line']) { - break; - } - - if (isset(Tokens::$phpcsCommentTokens[$tokens[$nextLine]['code']]) === true) { - $hasTrailingAnnotation = true; - } - } - - $phpcsFile->fixer->beginChangeset(); - $indent = $phpcsFile->findFirstOnLine([], $openingBrace); - - if ($hasTrailingAnnotation === false || $nextLine === false) { - if ($tokens[$indent]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->addContentBefore($openingBrace, $tokens[$indent]['content']); - } - - if ($tokens[($openingBrace - 1)]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->replaceToken(($openingBrace - 1), ''); - } - - $phpcsFile->fixer->addNewlineBefore($openingBrace); - } else { - $phpcsFile->fixer->replaceToken($openingBrace, ''); - $phpcsFile->fixer->addNewlineBefore($nextLine); - $phpcsFile->fixer->addContentBefore($nextLine, '{'); - - if ($tokens[$indent]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->addContentBefore($nextLine, $tokens[$indent]['content']); - } - } - - $phpcsFile->fixer->endChangeset(); - }//end if - - $phpcsFile->recordMetric($stackPtr, "$metricType opening brace placement", 'same line'); - } else if ($lineDifference > 1) { - $error = 'Opening brace should be on the line after the declaration; found %s blank line(s)'; - $data = [($lineDifference - 1)]; - - $prevNonWs = $phpcsFile->findPrevious(T_WHITESPACE, ($openingBrace - 1), $closeBracket, true); - if ($prevNonWs !== $prev) { - // There must be a comment between the end of the function declaration and the open brace. - // Report, but don't fix. - $phpcsFile->addError($error, $openingBrace, 'BraceSpacing', $data); - } else { - $fix = $phpcsFile->addFixableError($error, $openingBrace, 'BraceSpacing', $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = $openingBrace; $i > $prev; $i--) { - if ($tokens[$i]['line'] === $tokens[$openingBrace]['line']) { - if ($tokens[$i]['column'] === 1) { - $phpcsFile->fixer->addNewlineBefore($i); - } - - continue; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - }//end if - }//end if - - $ignore = Tokens::$phpcsCommentTokens; - $ignore[] = T_WHITESPACE; - $next = $phpcsFile->findNext($ignore, ($openingBrace + 1), null, true); - if ($tokens[$next]['line'] === $tokens[$openingBrace]['line']) { - // Only throw this error when this is not an empty function. - if ($next !== $tokens[$stackPtr]['scope_closer']) { - $error = 'Opening brace must be the last content on the line'; - $fix = $phpcsFile->addFixableError($error, $openingBrace, 'ContentAfterBrace'); - if ($fix === true) { - $phpcsFile->fixer->addNewline($openingBrace); - } - } - } - - // Only continue checking if the opening brace looks good. - if ($lineDifference !== 1) { - return; - } - - // We need to actually find the first piece of content on this line, - // as if this is a method with tokens before it (public, static etc) - // or an if with an else before it, then we need to start the scope - // checking from there, rather than the current token. - $lineStart = $phpcsFile->findFirstOnLine(T_WHITESPACE, $stackPtr, true); - - // The opening brace is on the correct line, now it needs to be - // checked to be correctly indented. - $startColumn = $tokens[$lineStart]['column']; - $braceIndent = $tokens[$openingBrace]['column']; - - if ($braceIndent !== $startColumn) { - $expected = ($startColumn - 1); - $found = ($braceIndent - 1); - - $error = 'Opening brace indented incorrectly; expected %s spaces, found %s'; - $data = [ - $expected, - $found, - ]; - - $fix = $phpcsFile->addFixableError($error, $openingBrace, 'BraceIndent', $data); - if ($fix === true) { - $indent = str_repeat(' ', $expected); - if ($found === 0) { - $phpcsFile->fixer->addContentBefore($openingBrace, $indent); - } else { - $phpcsFile->fixer->replaceToken(($openingBrace - 1), $indent); - } - } - }//end if - - $phpcsFile->recordMetric($stackPtr, "$metricType opening brace placement", 'new line'); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Functions/OpeningFunctionBraceKernighanRitchieSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Functions/OpeningFunctionBraceKernighanRitchieSniff.php deleted file mode 100644 index 569e243..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Functions/OpeningFunctionBraceKernighanRitchieSniff.php +++ /dev/null @@ -1,177 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Functions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class OpeningFunctionBraceKernighanRitchieSniff implements Sniff -{ - - /** - * Should this sniff check function braces? - * - * @var boolean - */ - public $checkFunctions = true; - - /** - * Should this sniff check closure braces? - * - * @var boolean - */ - public $checkClosures = false; - - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_FUNCTION, - T_CLOSURE, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['scope_opener']) === false) { - return; - } - - if (($tokens[$stackPtr]['code'] === T_FUNCTION - && (bool) $this->checkFunctions === false) - || ($tokens[$stackPtr]['code'] === T_CLOSURE - && (bool) $this->checkClosures === false) - ) { - return; - } - - $openingBrace = $tokens[$stackPtr]['scope_opener']; - - // Find the end of the function declaration. - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($openingBrace - 1), null, true); - - $functionLine = $tokens[$prev]['line']; - $braceLine = $tokens[$openingBrace]['line']; - - $lineDifference = ($braceLine - $functionLine); - - $metricType = 'Function'; - if ($tokens[$stackPtr]['code'] === T_CLOSURE) { - $metricType = 'Closure'; - } - - if ($lineDifference > 0) { - $phpcsFile->recordMetric($stackPtr, "$metricType opening brace placement", 'new line'); - $error = 'Opening brace should be on the same line as the declaration'; - $fix = $phpcsFile->addFixableError($error, $openingBrace, 'BraceOnNewLine'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->addContent($prev, ' {'); - $phpcsFile->fixer->replaceToken($openingBrace, ''); - if ($tokens[($openingBrace + 1)]['code'] === T_WHITESPACE - && $tokens[($openingBrace + 2)]['line'] > $tokens[$openingBrace]['line'] - ) { - // Brace is followed by a new line, so remove it to ensure we don't - // leave behind a blank line at the top of the block. - $phpcsFile->fixer->replaceToken(($openingBrace + 1), ''); - - if ($tokens[($openingBrace - 1)]['code'] === T_WHITESPACE - && $tokens[($openingBrace - 1)]['line'] === $tokens[$openingBrace]['line'] - && $tokens[($openingBrace - 2)]['line'] < $tokens[$openingBrace]['line'] - ) { - // Brace is preceded by indent, so remove it to ensure we don't - // leave behind more indent than is required for the first line. - $phpcsFile->fixer->replaceToken(($openingBrace - 1), ''); - } - } - - $phpcsFile->fixer->endChangeset(); - }//end if - } else { - $phpcsFile->recordMetric($stackPtr, "$metricType opening brace placement", 'same line'); - }//end if - - $ignore = Tokens::$phpcsCommentTokens; - $ignore[] = T_WHITESPACE; - $next = $phpcsFile->findNext($ignore, ($openingBrace + 1), null, true); - if ($tokens[$next]['line'] === $tokens[$openingBrace]['line']) { - // Only throw this error when this is not an empty function. - if ($next !== $tokens[$stackPtr]['scope_closer'] - && $tokens[$next]['code'] !== T_CLOSE_TAG - ) { - $error = 'Opening brace must be the last content on the line'; - $fix = $phpcsFile->addFixableError($error, $openingBrace, 'ContentAfterBrace'); - if ($fix === true) { - $phpcsFile->fixer->addNewline($openingBrace); - } - } - } - - // Only continue checking if the opening brace looks good. - if ($lineDifference > 0) { - return; - } - - // Enforce a single space. Tabs not allowed. - $spacing = $tokens[($openingBrace - 1)]['content']; - if ($tokens[($openingBrace - 1)]['code'] !== T_WHITESPACE) { - $length = 0; - } else if ($spacing === "\t") { - // Tab without tab-width set, so no tab replacement has taken place. - $length = '\t'; - } else { - $length = strlen($spacing); - } - - // If tab replacement is on, avoid confusing the user with a "expected 1 space, found 1" - // message when the "1" found is actually a tab, not a space. - if ($length === 1 - && isset($tokens[($openingBrace - 1)]['orig_content']) === true - && $tokens[($openingBrace - 1)]['orig_content'] === "\t" - ) { - $length = '\t'; - } - - if ($length !== 1) { - $error = 'Expected 1 space before opening brace; found %s'; - $data = [$length]; - $fix = $phpcsFile->addFixableError($error, $openingBrace, 'SpaceBeforeBrace', $data); - if ($fix === true) { - if ($length === 0) { - $phpcsFile->fixer->addContentBefore($openingBrace, ' '); - } else { - $phpcsFile->fixer->replaceToken(($openingBrace - 1), ' '); - } - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Metrics/CyclomaticComplexitySniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Metrics/CyclomaticComplexitySniff.php deleted file mode 100644 index 218c5a2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Metrics/CyclomaticComplexitySniff.php +++ /dev/null @@ -1,117 +0,0 @@ - - * @author Greg Sherwood - * @copyright 2007-2014 Mayflower GmbH - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Metrics; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class CyclomaticComplexitySniff implements Sniff -{ - - /** - * A complexity higher than this value will throw a warning. - * - * @var integer - */ - public $complexity = 10; - - /** - * A complexity higher than this value will throw an error. - * - * @var integer - */ - public $absoluteComplexity = 20; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_FUNCTION]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Ignore abstract and interface methods. Bail early when live coding. - if (isset($tokens[$stackPtr]['scope_opener'], $tokens[$stackPtr]['scope_closer']) === false) { - return; - } - - // Detect start and end of this function definition. - $start = $tokens[$stackPtr]['scope_opener']; - $end = $tokens[$stackPtr]['scope_closer']; - - // Predicate nodes for PHP. - $find = [ - T_CASE => true, - T_DEFAULT => true, - T_CATCH => true, - T_IF => true, - T_FOR => true, - T_FOREACH => true, - T_WHILE => true, - T_ELSEIF => true, - T_INLINE_THEN => true, - T_COALESCE => true, - T_COALESCE_EQUAL => true, - T_MATCH_ARROW => true, - T_NULLSAFE_OBJECT_OPERATOR => true, - ]; - - $complexity = 1; - - // Iterate from start to end and count predicate nodes. - for ($i = ($start + 1); $i < $end; $i++) { - if (isset($find[$tokens[$i]['code']]) === true) { - $complexity++; - } - } - - if ($complexity > $this->absoluteComplexity) { - $error = 'Function\'s cyclomatic complexity (%s) exceeds allowed maximum of %s'; - $data = [ - $complexity, - $this->absoluteComplexity, - ]; - $phpcsFile->addError($error, $stackPtr, 'MaxExceeded', $data); - } else if ($complexity > $this->complexity) { - $warning = 'Function\'s cyclomatic complexity (%s) exceeds %s; consider refactoring the function'; - $data = [ - $complexity, - $this->complexity, - ]; - $phpcsFile->addWarning($warning, $stackPtr, 'TooHigh', $data); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Metrics/NestingLevelSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Metrics/NestingLevelSniff.php deleted file mode 100644 index 9c57b2a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/Metrics/NestingLevelSniff.php +++ /dev/null @@ -1,100 +0,0 @@ - - * @author Greg Sherwood - * @copyright 2007-2014 Mayflower GmbH - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Metrics; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class NestingLevelSniff implements Sniff -{ - - /** - * A nesting level higher than this value will throw a warning. - * - * @var integer - */ - public $nestingLevel = 5; - - /** - * A nesting level higher than this value will throw an error. - * - * @var integer - */ - public $absoluteNestingLevel = 10; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_FUNCTION]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Ignore abstract and interface methods. Bail early when live coding. - if (isset($tokens[$stackPtr]['scope_opener'], $tokens[$stackPtr]['scope_closer']) === false) { - return; - } - - // Detect start and end of this function definition. - $start = $tokens[$stackPtr]['scope_opener']; - $end = $tokens[$stackPtr]['scope_closer']; - - $nestingLevel = 0; - - // Find the maximum nesting level of any token in the function. - for ($i = ($start + 1); $i < $end; $i++) { - $level = $tokens[$i]['level']; - if ($nestingLevel < $level) { - $nestingLevel = $level; - } - } - - // We subtract the nesting level of the function itself. - $nestingLevel = ($nestingLevel - $tokens[$stackPtr]['level'] - 1); - - if ($nestingLevel > $this->absoluteNestingLevel) { - $error = 'Function\'s nesting level (%s) exceeds allowed maximum of %s'; - $data = [ - $nestingLevel, - $this->absoluteNestingLevel, - ]; - $phpcsFile->addError($error, $stackPtr, 'MaxExceeded', $data); - } else if ($nestingLevel > $this->nestingLevel) { - $warning = 'Function\'s nesting level (%s) exceeds %s; consider refactoring the function'; - $data = [ - $nestingLevel, - $this->nestingLevel, - ]; - $phpcsFile->addWarning($warning, $stackPtr, 'TooHigh', $data); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/NamingConventions/AbstractClassNamePrefixSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/NamingConventions/AbstractClassNamePrefixSniff.php deleted file mode 100644 index 0876e68..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/NamingConventions/AbstractClassNamePrefixSniff.php +++ /dev/null @@ -1,60 +0,0 @@ - - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\NamingConventions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class AbstractClassNamePrefixSniff implements Sniff -{ - - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @return array - */ - public function register() - { - return [T_CLASS]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($phpcsFile->getClassProperties($stackPtr)['is_abstract'] === false) { - // This class is not abstract so we don't need to check it. - return; - } - - $className = $phpcsFile->getDeclarationName($stackPtr); - if ($className === null) { - // Live coding or parse error. - return; - } - - $prefix = substr($className, 0, 8); - if (strtolower($prefix) !== 'abstract') { - $phpcsFile->addError('Abstract class names must be prefixed with "Abstract"; found "%s"', $stackPtr, 'Missing', [$className]); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/NamingConventions/CamelCapsFunctionNameSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/NamingConventions/CamelCapsFunctionNameSniff.php deleted file mode 100644 index fa59afa..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/NamingConventions/CamelCapsFunctionNameSniff.php +++ /dev/null @@ -1,222 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\NamingConventions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\AbstractScopeSniff; -use PHP_CodeSniffer\Util\Common; -use PHP_CodeSniffer\Util\Tokens; - -class CamelCapsFunctionNameSniff extends AbstractScopeSniff -{ - - /** - * A list of all PHP magic methods. - * - * @var array - */ - protected $magicMethods = [ - 'construct' => true, - 'destruct' => true, - 'call' => true, - 'callstatic' => true, - 'get' => true, - 'set' => true, - 'isset' => true, - 'unset' => true, - 'sleep' => true, - 'wakeup' => true, - 'serialize' => true, - 'unserialize' => true, - 'tostring' => true, - 'invoke' => true, - 'set_state' => true, - 'clone' => true, - 'debuginfo' => true, - ]; - - /** - * A list of all PHP non-magic methods starting with a double underscore. - * - * These come from PHP modules such as SOAPClient. - * - * @var array - */ - protected $methodsDoubleUnderscore = [ - 'dorequest' => true, - 'getcookies' => true, - 'getfunctions' => true, - 'getlastrequest' => true, - 'getlastrequestheaders' => true, - 'getlastresponse' => true, - 'getlastresponseheaders' => true, - 'gettypes' => true, - 'setcookie' => true, - 'setlocation' => true, - 'setsoapheaders' => true, - 'soapcall' => true, - ]; - - /** - * A list of all PHP magic functions. - * - * @var array - */ - protected $magicFunctions = ['autoload' => true]; - - /** - * If TRUE, the string must not have two capital letters next to each other. - * - * @var boolean - */ - public $strict = true; - - - /** - * Constructs a Generic_Sniffs_NamingConventions_CamelCapsFunctionNameSniff. - */ - public function __construct() - { - parent::__construct(Tokens::$ooScopeTokens, [T_FUNCTION], true); - - }//end __construct() - - - /** - * Processes the tokens within the scope. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being processed. - * @param int $stackPtr The position where this token was - * found. - * @param int $currScope The position of the current scope. - * - * @return void - */ - protected function processTokenWithinScope(File $phpcsFile, $stackPtr, $currScope) - { - $tokens = $phpcsFile->getTokens(); - - // Determine if this is a function which needs to be examined. - $conditions = $tokens[$stackPtr]['conditions']; - end($conditions); - $deepestScope = key($conditions); - if ($deepestScope !== $currScope) { - return; - } - - $methodName = $phpcsFile->getDeclarationName($stackPtr); - if ($methodName === null) { - // Live coding or parse error. Bow out. - return; - } - - $className = $phpcsFile->getDeclarationName($currScope); - if (isset($className) === false) { - $className = '[Anonymous Class]'; - } - - $errorData = [$className.'::'.$methodName]; - - $methodNameLc = strtolower($methodName); - $classNameLc = strtolower($className); - - // Is this a magic method. i.e., is prefixed with "__" ? - if (preg_match('|^__[^_]|', $methodName) !== 0) { - $magicPart = substr($methodNameLc, 2); - if (isset($this->magicMethods[$magicPart]) === true - || isset($this->methodsDoubleUnderscore[$magicPart]) === true - ) { - return; - } - - $error = 'Method name "%s" is invalid; only PHP magic methods should be prefixed with a double underscore'; - $phpcsFile->addError($error, $stackPtr, 'MethodDoubleUnderscore', $errorData); - } - - // PHP4 constructors are allowed to break our rules. - if ($methodNameLc === $classNameLc) { - return; - } - - // PHP4 destructors are allowed to break our rules. - if ($methodNameLc === '_'.$classNameLc) { - return; - } - - // Ignore leading underscores in the method name. - $methodName = ltrim($methodName, '_'); - - $methodProps = $phpcsFile->getMethodProperties($stackPtr); - if (Common::isCamelCaps($methodName, false, true, $this->strict) === false) { - if ($methodProps['scope_specified'] === true) { - $error = '%s method name "%s" is not in camel caps format'; - $data = [ - ucfirst($methodProps['scope']), - $errorData[0], - ]; - $phpcsFile->addError($error, $stackPtr, 'ScopeNotCamelCaps', $data); - } else { - $error = 'Method name "%s" is not in camel caps format'; - $phpcsFile->addError($error, $stackPtr, 'NotCamelCaps', $errorData); - } - - $phpcsFile->recordMetric($stackPtr, 'CamelCase method name', 'no'); - } else { - $phpcsFile->recordMetric($stackPtr, 'CamelCase method name', 'yes'); - } - - }//end processTokenWithinScope() - - - /** - * Processes the tokens outside the scope. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being processed. - * @param int $stackPtr The position where this token was - * found. - * - * @return void - */ - protected function processTokenOutsideScope(File $phpcsFile, $stackPtr) - { - $functionName = $phpcsFile->getDeclarationName($stackPtr); - if ($functionName === null) { - // Live coding or parse error. Bow out. - return; - } - - $errorData = [$functionName]; - - // Is this a magic function. i.e., it is prefixed with "__". - if (preg_match('|^__[^_]|', $functionName) !== 0) { - $magicPart = strtolower(substr($functionName, 2)); - if (isset($this->magicFunctions[$magicPart]) === true) { - return; - } - - $error = 'Function name "%s" is invalid; only PHP magic methods should be prefixed with a double underscore'; - $phpcsFile->addError($error, $stackPtr, 'FunctionDoubleUnderscore', $errorData); - } - - // Ignore leading underscores in the method name. - $functionName = ltrim($functionName, '_'); - - if (Common::isCamelCaps($functionName, false, true, $this->strict) === false) { - $error = 'Function name "%s" is not in camel caps format'; - $phpcsFile->addError($error, $stackPtr, 'NotCamelCaps', $errorData); - $phpcsFile->recordMetric($stackPtr, 'CamelCase function name', 'no'); - } else { - $phpcsFile->recordMetric($stackPtr, 'CamelCase method name', 'yes'); - } - - }//end processTokenOutsideScope() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/NamingConventions/ConstructorNameSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/NamingConventions/ConstructorNameSniff.php deleted file mode 100644 index 5fd8b5f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/NamingConventions/ConstructorNameSniff.php +++ /dev/null @@ -1,189 +0,0 @@ - - * @author Leif Wickland - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\NamingConventions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\AbstractScopeSniff; -use PHP_CodeSniffer\Util\Tokens; - -class ConstructorNameSniff extends AbstractScopeSniff -{ - - /** - * The name of the class we are currently checking. - * - * @var string - */ - private $currentClass = ''; - - /** - * A list of functions in the current class. - * - * @var string[] - */ - private $functionList = []; - - - /** - * Constructs the test with the tokens it wishes to listen for. - */ - public function __construct() - { - parent::__construct([T_CLASS, T_ANON_CLASS], [T_FUNCTION], true); - - }//end __construct() - - - /** - * Processes this test when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $currScope A pointer to the start of the scope. - * - * @return void - */ - protected function processTokenWithinScope(File $phpcsFile, $stackPtr, $currScope) - { - $tokens = $phpcsFile->getTokens(); - - // Determine if this is a function which needs to be examined. - $conditions = $tokens[$stackPtr]['conditions']; - end($conditions); - $deepestScope = key($conditions); - if ($deepestScope !== $currScope) { - return; - } - - $className = $phpcsFile->getDeclarationName($currScope); - if (empty($className) === false) { - // Not an anonymous class. - $className = strtolower($className); - } - - if ($className !== $this->currentClass) { - $this->loadFunctionNamesInScope($phpcsFile, $currScope); - $this->currentClass = $className; - } - - $methodName = $phpcsFile->getDeclarationName($stackPtr); - if ($methodName === null) { - // Live coding or parse error. Bow out. - return; - } - - $methodName = strtolower($methodName); - if ($methodName === $className) { - if (in_array('__construct', $this->functionList, true) === false) { - $error = 'PHP4 style constructors are not allowed; use "__construct()" instead'; - $phpcsFile->addError($error, $stackPtr, 'OldStyle'); - } - } else if ($methodName !== '__construct') { - // Not a constructor. - return; - } - - // Stop if the constructor doesn't have a body, like when it is abstract. - if (isset($tokens[$stackPtr]['scope_opener'], $tokens[$stackPtr]['scope_closer']) === false) { - return; - } - - $parentClassName = $phpcsFile->findExtendedClassName($currScope); - if ($parentClassName === false) { - return; - } - - $parentClassNameLc = strtolower($parentClassName); - - $endFunctionIndex = $tokens[$stackPtr]['scope_closer']; - $startIndex = $tokens[$stackPtr]['scope_opener']; - while (($doubleColonIndex = $phpcsFile->findNext(T_DOUBLE_COLON, ($startIndex + 1), $endFunctionIndex)) !== false) { - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($doubleColonIndex + 1), null, true); - if ($tokens[$nextNonEmpty]['code'] !== T_STRING - || strtolower($tokens[$nextNonEmpty]['content']) !== $parentClassNameLc - ) { - $startIndex = $nextNonEmpty; - continue; - } - - $prevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($doubleColonIndex - 1), null, true); - if ($tokens[$prevNonEmpty]['code'] === T_PARENT - || $tokens[$prevNonEmpty]['code'] === T_SELF - || $tokens[$prevNonEmpty]['code'] === T_STATIC - || ($tokens[$prevNonEmpty]['code'] === T_STRING - && strtolower($tokens[$prevNonEmpty]['content']) === $parentClassNameLc) - ) { - $error = 'PHP4 style calls to parent constructors are not allowed; use "parent::__construct()" instead'; - $phpcsFile->addError($error, $nextNonEmpty, 'OldStyleCall'); - } - - $startIndex = $nextNonEmpty; - }//end while - - }//end processTokenWithinScope() - - - /** - * Processes a token that is found within the scope that this test is - * listening to. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position in the stack where this - * token was found. - * - * @return void - */ - protected function processTokenOutsideScope(File $phpcsFile, $stackPtr) - { - - }//end processTokenOutsideScope() - - - /** - * Extracts all the function names found in the given scope. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being scanned. - * @param int $currScope A pointer to the start of the scope. - * - * @return void - */ - protected function loadFunctionNamesInScope(File $phpcsFile, $currScope) - { - $this->functionList = []; - $tokens = $phpcsFile->getTokens(); - - for ($i = ($tokens[$currScope]['scope_opener'] + 1); $i < $tokens[$currScope]['scope_closer']; $i++) { - if ($tokens[$i]['code'] !== T_FUNCTION) { - continue; - } - - $methodName = $phpcsFile->getDeclarationName($i); - if ($methodName === null) { - // Live coding or parse error. Ignore. - continue; - } - - $this->functionList[] = trim(strtolower($methodName)); - - if (isset($tokens[$i]['scope_closer']) !== false) { - // Skip past nested functions and such. - $i = $tokens[$i]['scope_closer']; - } - } - - }//end loadFunctionNamesInScope() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/NamingConventions/InterfaceNameSuffixSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/NamingConventions/InterfaceNameSuffixSniff.php deleted file mode 100644 index 362e8a9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/NamingConventions/InterfaceNameSuffixSniff.php +++ /dev/null @@ -1,55 +0,0 @@ - - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\NamingConventions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class InterfaceNameSuffixSniff implements Sniff -{ - - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @return array - */ - public function register() - { - return [T_INTERFACE]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $interfaceName = $phpcsFile->getDeclarationName($stackPtr); - if ($interfaceName === null) { - // Live coding or parse error. Bow out. - return; - } - - $suffix = substr($interfaceName, -9); - if (strtolower($suffix) !== 'interface') { - $phpcsFile->addError('Interface names must be suffixed with "Interface"; found "%s"', $stackPtr, 'Missing', [$interfaceName]); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/NamingConventions/TraitNameSuffixSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/NamingConventions/TraitNameSuffixSniff.php deleted file mode 100644 index a2fc5fc..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/NamingConventions/TraitNameSuffixSniff.php +++ /dev/null @@ -1,55 +0,0 @@ - - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\NamingConventions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class TraitNameSuffixSniff implements Sniff -{ - - - /** - * Registers the tokens that this sniff wants to listen for. - * - * @return array - */ - public function register() - { - return [T_TRAIT]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $traitName = $phpcsFile->getDeclarationName($stackPtr); - if ($traitName === null) { - // Live coding or parse error. Bow out. - return; - } - - $suffix = substr($traitName, -5); - if (strtolower($suffix) !== 'trait') { - $phpcsFile->addError('Trait names must be suffixed with "Trait"; found "%s"', $stackPtr, 'Missing', [$traitName]); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/NamingConventions/UpperCaseConstantNameSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/NamingConventions/UpperCaseConstantNameSniff.php deleted file mode 100644 index 770bee9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/NamingConventions/UpperCaseConstantNameSniff.php +++ /dev/null @@ -1,151 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\NamingConventions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class UpperCaseConstantNameSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_STRING, - T_CONST, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['code'] === T_CONST) { - // This is a constant declared with the "const" keyword. - // This may be an OO constant, in which case it could be typed, so we need to - // jump over a potential type to get to the name. - $assignmentOperator = $phpcsFile->findNext([T_EQUAL, T_SEMICOLON], ($stackPtr + 1)); - if ($assignmentOperator === false || $tokens[$assignmentOperator]['code'] !== T_EQUAL) { - // Parse error/live coding. Nothing to do. Rest of loop is moot. - return; - } - - $constant = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($assignmentOperator - 1), ($stackPtr + 1), true); - if ($constant === false) { - return; - } - - $constName = $tokens[$constant]['content']; - - if (strtoupper($constName) !== $constName) { - if (strtolower($constName) === $constName) { - $phpcsFile->recordMetric($constant, 'Constant name case', 'lower'); - } else { - $phpcsFile->recordMetric($constant, 'Constant name case', 'mixed'); - } - - $error = 'Class constants must be uppercase; expected %s but found %s'; - $data = [ - strtoupper($constName), - $constName, - ]; - $phpcsFile->addError($error, $constant, 'ClassConstantNotUpperCase', $data); - } else { - $phpcsFile->recordMetric($constant, 'Constant name case', 'upper'); - } - - return; - }//end if - - // Only interested in define statements now. - if (strtolower($tokens[$stackPtr]['content']) !== 'define') { - return; - } - - // Make sure this is not a method call or class instantiation. - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($tokens[$prev]['code'] === T_OBJECT_OPERATOR - || $tokens[$prev]['code'] === T_DOUBLE_COLON - || $tokens[$prev]['code'] === T_NULLSAFE_OBJECT_OPERATOR - || $tokens[$prev]['code'] === T_NEW - ) { - return; - } - - // Make sure this is not an attribute. - if (empty($tokens[$stackPtr]['nested_attributes']) === false) { - return; - } - - // If the next non-whitespace token after this token - // is not an opening parenthesis then it is not a function call. - $openBracket = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($openBracket === false || $tokens[$openBracket]['code'] !== T_OPEN_PARENTHESIS) { - return; - } - - // Bow out if next non-empty token after the opening parenthesis is not a string (the - // constant name). This could happen when live coding, if the constant is a variable or an - // expression, or if handling a first-class callable or a function definition outside the - // global scope. - $constPtr = $phpcsFile->findNext(Tokens::$emptyTokens, ($openBracket + 1), null, true); - if ($constPtr === false || $tokens[$constPtr]['code'] !== T_CONSTANT_ENCAPSED_STRING) { - return; - } - - $constName = $tokens[$constPtr]['content']; - $prefix = ''; - - // Strip namespace from constant like \foo\bar\CONSTANT. - $splitPos = strrpos($constName, '\\'); - if ($splitPos !== false) { - $prefix = substr($constName, 0, ($splitPos + 1)); - $constName = substr($constName, ($splitPos + 1)); - } - - if (strtoupper($constName) !== $constName) { - if (strtolower($constName) === $constName) { - $phpcsFile->recordMetric($constPtr, 'Constant name case', 'lower'); - } else { - $phpcsFile->recordMetric($constPtr, 'Constant name case', 'mixed'); - } - - $error = 'Constants must be uppercase; expected %s but found %s'; - $data = [ - $prefix.strtoupper($constName), - $prefix.$constName, - ]; - $phpcsFile->addError($error, $constPtr, 'ConstantNotUpperCase', $data); - } else { - $phpcsFile->recordMetric($constPtr, 'Constant name case', 'upper'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/BacktickOperatorSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/BacktickOperatorSniff.php deleted file mode 100644 index a3d4555..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/BacktickOperatorSniff.php +++ /dev/null @@ -1,48 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\PHP; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class BacktickOperatorSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_BACKTICK]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $error = 'Use of the backtick operator is forbidden'; - $phpcsFile->addError($error, $stackPtr, 'Found'); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/CharacterBeforePHPOpeningTagSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/CharacterBeforePHPOpeningTagSniff.php deleted file mode 100644 index 8de7a77..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/CharacterBeforePHPOpeningTagSniff.php +++ /dev/null @@ -1,86 +0,0 @@ - - * @copyright 2010-2014 Andy Grunwald - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\PHP; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class CharacterBeforePHPOpeningTagSniff implements Sniff -{ - - /** - * List of supported BOM definitions. - * - * Use encoding names as keys and hex BOM representations as values. - * - * @var array - */ - protected $bomDefinitions = [ - 'UTF-8' => 'efbbbf', - 'UTF-16 (BE)' => 'feff', - 'UTF-16 (LE)' => 'fffe', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return int - */ - public function process(File $phpcsFile, $stackPtr) - { - $expected = 0; - if ($stackPtr > 0) { - // Allow a byte-order mark. - $tokens = $phpcsFile->getTokens(); - foreach ($this->bomDefinitions as $expectedBomHex) { - $bomByteLength = (strlen($expectedBomHex) / 2); - $htmlBomHex = bin2hex(substr($tokens[0]['content'], 0, $bomByteLength)); - if ($htmlBomHex === $expectedBomHex) { - $expected++; - break; - } - } - - // Allow a shebang line. - if (substr($tokens[0]['content'], 0, 2) === '#!') { - $expected++; - } - } - - if ($stackPtr !== $expected) { - $error = 'The opening PHP tag must be the first content in the file'; - $phpcsFile->addError($error, $stackPtr, 'Found'); - } - - // Skip the rest of the file so we don't pick up additional - // open tags, typically embedded in HTML. - return $phpcsFile->numTokens; - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/ClosingPHPTagSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/ClosingPHPTagSniff.php deleted file mode 100644 index 314f0e6..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/ClosingPHPTagSniff.php +++ /dev/null @@ -1,54 +0,0 @@ - - * @copyright 2010-2014 Stefano Kowalke - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\PHP; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ClosingPHPTagSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_OPEN_TAG, - T_OPEN_TAG_WITH_ECHO, - ]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $closeTag = $phpcsFile->findNext(T_CLOSE_TAG, $stackPtr); - if ($closeTag === false) { - $error = 'The PHP open tag does not have a corresponding PHP close tag'; - $phpcsFile->addError($error, $stackPtr, 'NotFound'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/DeprecatedFunctionsSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/DeprecatedFunctionsSniff.php deleted file mode 100644 index 61c30d5..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/DeprecatedFunctionsSniff.php +++ /dev/null @@ -1,75 +0,0 @@ - - * @author Greg Sherwood - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\PHP; - -use ReflectionFunction; - -class DeprecatedFunctionsSniff extends ForbiddenFunctionsSniff -{ - - /** - * A list of forbidden functions with their alternatives. - * - * The value is NULL if no alternative exists. IE, the - * function should just not be used. - * - * @var array - */ - public $forbiddenFunctions = []; - - - /** - * Constructor. - * - * Uses the Reflection API to get a list of deprecated functions. - */ - public function __construct() - { - $functions = get_defined_functions(); - - foreach ($functions['internal'] as $functionName) { - $function = new ReflectionFunction($functionName); - - if ($function->isDeprecated() === true) { - $this->forbiddenFunctions[$functionName] = null; - } - } - - }//end __construct() - - - /** - * Generates the error or warning for this sniff. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the forbidden function - * in the token array. - * @param string $function The name of the forbidden function. - * @param string|null $pattern The pattern used for the match. - * - * @return void - */ - protected function addError($phpcsFile, $stackPtr, $function, $pattern=null) - { - $data = [$function]; - $error = 'Function %s() has been deprecated'; - $type = 'Deprecated'; - - if ($this->error === true) { - $phpcsFile->addError($error, $stackPtr, $type, $data); - } else { - $phpcsFile->addWarning($error, $stackPtr, $type, $data); - } - - }//end addError() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/DisallowAlternativePHPTagsSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/DisallowAlternativePHPTagsSniff.php deleted file mode 100644 index 385778f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Sniffs/PHP/DisallowAlternativePHPTagsSniff.php +++ /dev/null @@ -1,253 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Sniffs\PHP; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class DisallowAlternativePHPTagsSniff implements Sniff -{ - - /** - * Whether ASP tags are enabled or not. - * - * @var boolean - */ - private $aspTags = false; - - /** - * The current PHP version. - * - * @var integer|string|null - */ - private $phpVersion = null; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - if ($this->phpVersion === null) { - $this->phpVersion = Config::getConfigData('php_version'); - if ($this->phpVersion === null) { - $this->phpVersion = PHP_VERSION_ID; - } - } - - if ($this->phpVersion < 70000) { - $this->aspTags = (bool) ini_get('asp_tags'); - } - - return [ - T_OPEN_TAG, - T_OPEN_TAG_WITH_ECHO, - T_INLINE_HTML, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $openTag = $tokens[$stackPtr]; - $content = $openTag['content']; - - if (trim($content) === '') { - return; - } - - if ($openTag['code'] === T_OPEN_TAG) { - if ($content === '<%') { - $error = 'ASP style opening tag used; expected "findClosingTag($phpcsFile, $tokens, $stackPtr, '%>'); - $errorCode = 'ASPOpenTagFound'; - } else if (strpos($content, ''); - $errorCode = 'ScriptOpenTagFound'; - } - - if (isset($error, $closer, $errorCode) === true) { - $data = [$content]; - - if ($closer === false) { - $phpcsFile->addError($error, $stackPtr, $errorCode, $data); - } else { - $fix = $phpcsFile->addFixableError($error, $stackPtr, $errorCode, $data); - if ($fix === true) { - $this->addChangeset($phpcsFile, $tokens, $stackPtr, $closer); - } - } - } - - return; - }//end if - - if ($openTag['code'] === T_OPEN_TAG_WITH_ECHO && $content === '<%=') { - $error = 'ASP style opening tag used with echo; expected "findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - $snippet = $this->getSnippet($tokens[$nextVar]['content']); - $data = [ - $snippet, - $content, - $snippet, - ]; - - $closer = $this->findClosingTag($phpcsFile, $tokens, $stackPtr, '%>'); - - if ($closer === false) { - $phpcsFile->addError($error, $stackPtr, 'ASPShortOpenTagFound', $data); - } else { - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'ASPShortOpenTagFound', $data); - if ($fix === true) { - $this->addChangeset($phpcsFile, $tokens, $stackPtr, $closer, true); - } - } - - return; - }//end if - - // Account for incorrect script open tags. - if ($openTag['code'] === T_INLINE_HTML - && preg_match('`( - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.1.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.1.inc.fixed deleted file mode 100644 index 2a695c8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.1.inc.fixed +++ /dev/null @@ -1,14 +0,0 @@ -
    - -Some content here. - - - - -
    diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.2.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.2.inc deleted file mode 100644 index cd5a662..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.2.inc +++ /dev/null @@ -1,6 +0,0 @@ -
    -<% echo $var; %> -

    Some text <% echo $var; %> and some more text

    -<%= $var . ' and some more text to make sure the snippet works'; %> -

    Some text <%= $var %> and some more text

    -
    diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.2.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.2.inc.fixed deleted file mode 100644 index 6eafb42..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.2.inc.fixed +++ /dev/null @@ -1,6 +0,0 @@ -
    - -

    Some text and some more text

    - -

    Some text and some more text

    -
    diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.3.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.3.inc deleted file mode 100644 index ba86345..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.3.inc +++ /dev/null @@ -1,7 +0,0 @@ - -
    -<% echo $var; %> -

    Some text <% echo $var; %> and some more text

    -<%= $var . ' and some more text to make sure the snippet works'; %> -

    Some text <%= $var %> and some more text

    -
    diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.php deleted file mode 100644 index 5e3ace4..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowAlternativePHPTagsUnitTest.php +++ /dev/null @@ -1,110 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the DisallowAlternativePHPTags sniff. - * - * @covers \PHP_CodeSniffer\Standards\Generic\Sniffs\PHP\DisallowAlternativePHPTagsSniff - */ -final class DisallowAlternativePHPTagsUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Get a list of all test files to check. - * - * @param string $testFileBase The base path that the unit tests files will have. - * - * @return string[] - */ - protected function getTestFiles($testFileBase) - { - $testFiles = [$testFileBase.'1.inc']; - - $aspTags = false; - if (PHP_VERSION_ID < 70000) { - $aspTags = (bool) ini_get('asp_tags'); - } - - if ($aspTags === true) { - $testFiles[] = $testFileBase.'2.inc'; - } else { - $testFiles[] = $testFileBase.'3.inc'; - } - - return $testFiles; - - }//end getTestFiles() - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'DisallowAlternativePHPTagsUnitTest.1.inc': - return [ - 4 => 1, - 7 => 1, - 8 => 1, - 11 => 1, - ]; - case 'DisallowAlternativePHPTagsUnitTest.2.inc': - return [ - 2 => 1, - 3 => 1, - 4 => 1, - 5 => 1, - ]; - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getWarningList($testFile='') - { - if ($testFile === 'DisallowAlternativePHPTagsUnitTest.3.inc') { - return [ - 3 => 1, - 4 => 1, - 5 => 1, - 6 => 1, - ]; - } - - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowRequestSuperglobalUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowRequestSuperglobalUnitTest.inc deleted file mode 100644 index 974e45c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowRequestSuperglobalUnitTest.inc +++ /dev/null @@ -1,16 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowRequestSuperglobalUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowRequestSuperglobalUnitTest.php deleted file mode 100644 index 52b3085..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowRequestSuperglobalUnitTest.php +++ /dev/null @@ -1,56 +0,0 @@ - - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ -namespace PHP_CodeSniffer\Standards\Generic\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the DisallowRequestSuperglobal sniff. - * - * @covers \PHP_CodeSniffer\Standards\Generic\Sniffs\PHP\DisallowRequestSuperglobalSniff - */ -final class DisallowRequestSuperglobalUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - protected function getErrorList() - { - return [ - 2 => 1, - 12 => 1, - 13 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - protected function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.1.inc deleted file mode 100644 index 040e62d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.1.inc +++ /dev/null @@ -1,11 +0,0 @@ -
    - -Some content here. - - -Some content Some more content - - -
    diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.1.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.1.inc.fixed deleted file mode 100644 index 1ea281a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.1.inc.fixed +++ /dev/null @@ -1,11 +0,0 @@ -
    - -Some content here. - - -Some content Some more content - - -
    diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.2.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.2.inc deleted file mode 100644 index 85617de..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.2.inc +++ /dev/null @@ -1,8 +0,0 @@ -
    - -Some content Some more content - - -
    diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.2.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.2.inc.fixed deleted file mode 100644 index afe5d8f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.2.inc.fixed +++ /dev/null @@ -1,8 +0,0 @@ -
    - -Some content Some more content - - -
    diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.3.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.3.inc deleted file mode 100644 index 6c4f83d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.3.inc +++ /dev/null @@ -1,20 +0,0 @@ -// Test warning for when short_open_tag is off. - -Some content Some more content - -// Test multi-line. -Some content Some more content - -// Make sure skipping works. -Some content Some more content - -// Test snippet clipping with a line that has more than 40 characters after the PHP open tag. -Some content Some longer content to trigger snippet clipping - -// Only recognize closing tag after opener. -// The test below must be the last test in the file because there must be no PHP close tag after it. -Some?> content diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.php deleted file mode 100644 index 0a78d6e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DisallowShortOpenTagUnitTest.php +++ /dev/null @@ -1,110 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the DisallowShortOpenTag sniff. - * - * @covers \PHP_CodeSniffer\Standards\Generic\Sniffs\PHP\DisallowShortOpenTagSniff - */ -final class DisallowShortOpenTagUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Get a list of all test files to check. - * - * @param string $testFileBase The base path that the unit tests files will have. - * - * @return string[] - */ - protected function getTestFiles($testFileBase) - { - $testFiles = [$testFileBase.'1.inc']; - - $option = (bool) ini_get('short_open_tag'); - if ($option === true) { - $testFiles[] = $testFileBase.'2.inc'; - } else { - $testFiles[] = $testFileBase.'3.inc'; - $testFiles[] = $testFileBase.'4.inc'; - } - - return $testFiles; - - }//end getTestFiles() - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'DisallowShortOpenTagUnitTest.1.inc': - return [ - 5 => 1, - 6 => 1, - 7 => 1, - 10 => 1, - ]; - case 'DisallowShortOpenTagUnitTest.2.inc': - return [ - 2 => 1, - 3 => 1, - 4 => 1, - 7 => 1, - ]; - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getWarningList($testFile='') - { - switch ($testFile) { - case 'DisallowShortOpenTagUnitTest.1.inc': - return []; - case 'DisallowShortOpenTagUnitTest.3.inc': - return [ - 3 => 1, - 6 => 1, - 11 => 1, - 16 => 1, - ]; - default: - return []; - }//end switch - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DiscourageGotoUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DiscourageGotoUnitTest.inc deleted file mode 100644 index f564215..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/DiscourageGotoUnitTest.inc +++ /dev/null @@ -1,18 +0,0 @@ - - * @copyright 2006-2017 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the DiscourageGoto sniff. - * - * @covers \PHP_CodeSniffer\Standards\Generic\Sniffs\PHP\DiscourageGotoSniff - */ -final class DiscourageGotoUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return []; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [ - 3 => 1, - 6 => 1, - 11 => 1, - 16 => 1, - ]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/ForbiddenFunctionsUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/ForbiddenFunctionsUnitTest.inc deleted file mode 100644 index 06509d8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/ForbiddenFunctionsUnitTest.inc +++ /dev/null @@ -1,62 +0,0 @@ -sizeof($array); -$size = $class->count($array); -$class->delete($filepath); -$class->unset($filepath); - -function delete() {} -function unset() {} -function sizeof() {} -function count() {} - -trait DelProvider { - public function delete() { - //irrelevant - } -} - -class LeftSideTest { - use DelProvider { - delete as protected unsetter; - } -} - -class RightSideTest { - use DelProvider { - delete as delete; - } -} - -class RightSideVisTest { - use DelProvider { - delete as protected delete; - DelProvider::delete insteadof delete; - } -} - -namespace Something\sizeof; -$var = new /*comment*/ Sizeof(); -class SizeOf implements Something {} - -function mymodule_form_callback(SizeOf $sizeof) { -} - -$size = $class?->sizeof($array); - -#[SizeOf(10)] -function doSomething() {} - -$size = sizeof /*comment*/ ($array); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/ForbiddenFunctionsUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/ForbiddenFunctionsUnitTest.php deleted file mode 100644 index 3504d8e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/ForbiddenFunctionsUnitTest.php +++ /dev/null @@ -1,60 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ForbiddenFunctions sniff. - * - * @covers \PHP_CodeSniffer\Standards\Generic\Sniffs\PHP\ForbiddenFunctionsSniff - */ -final class ForbiddenFunctionsUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - $errors = [ - 2 => 1, - 4 => 1, - 6 => 1, - 62 => 1, - ]; - - return $errors; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseConstantUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseConstantUnitTest.1.inc deleted file mode 100644 index 699c615..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseConstantUnitTest.1.inc +++ /dev/null @@ -1,183 +0,0 @@ -NULL = 7; - -use Zend\Log\Writer\NULL as NullWriter; -new \Zend\Log\Writer\NULL(); - -namespace False; - -class True extends Null implements False {} - -use True\Something; -use Something\True; -class MyClass -{ - public function myFunction() - { - $var = array('foo' => new True()); - } -} - -$x = $f?FALSE:true; -$x = $f? FALSE:true; - -class MyClass -{ - // Spice things up a little. - const TRUE = false; -} - -var_dump(MyClass::TRUE); - -function tRUE() {} - -$input->getFilterChain()->attachByName('Null', ['type' => Null::TYPE_STRING]); - -// Issue #3332 - ignore type declarations, but not default values. -class TypedThings { - const MYCONST = FALSE; - - public int|FALSE $int = FALSE; - public Type|NULL $int = new MyObj(NULL); - - private function typed(int|FALSE $param = NULL, Type|NULL $obj = new MyObj(FALSE)) : string|FALSE|NULL - { - if (TRUE === FALSE) { - return NULL; - } - } -} - -$cl = function (int|FALSE $param = NULL, Type|NULL $obj = new MyObj(FALSE)) : string|FALSE|NULL {}; - -// Adding some extra tests to safeguard that function declarations which don't create scope are handled correctly. -interface InterfaceMethodsWithReturnTypeNoScopeOpener { - private function typed($param = TRUE) : string|FALSE|NULL; -} - -abstract class ClassMethodsWithReturnTypeNoScopeOpener { - abstract public function typed($param = FALSE) : TRUE; -} - -// Additional tests to safeguard improved property type skip logic. -readonly class Properties { - use SomeTrait { - sayHello as private myPrivateHello; - } - - public Type|FALSE|NULL $propertyA = array( - 'itemA' => TRUE, - 'itemB' => FALSE, - 'itemC' => NULL, - ), $propertyB = FALSE; - - protected \FullyQualified&Partially\Qualified&namespace\Relative $propertyC; - var ?TRUE $propertyD; - static array|callable|FALSE|self|parent $propertyE = TRUE; - private - // phpcs:ignore Stnd.Cat.Sniff -- for reasons. - TRUE /*comment*/ - $propertyF = TRUE; - - public function __construct( - public FALSE|NULL $promotedPropA, - readonly callable|TRUE $promotedPropB, - ) { - static $var; - echo static::class; - static::foo(); - $var = $var instanceof static; - $obj = new static(); - } - - public static function foo(): static|self|FALSE { - $callable = static function() {}; - } -} - -// PHP 8.3 introduces typed constants. -class TypedConstants { - const MyClass|NULL|TRUE|FALSE MYCONST = FALSE; -} - -// Global constants can not be typed. -const MYCONST = TRUE; - -class SkipOverPHP82DNFTypes { - protected (\FullyQualified&Partially\Qualified)|TRUE $propertyC; -} - -class SkipOverPHP84FinalProperties { - final MyType|FALSE $propA; - private static final NULL|MyClass $propB; -} - -// PHP 8.4 asymmetric visibility -class WithAsym { - - private(set) NULL|TRUE $asym1 = TRUE; - - public private(set) ?bool $asym2 = FALSE; - - protected(set) FALSE|string|null $asym3 = NULL; - - public protected(set) Type|NULL|bool $asym4 = TRUE; -} - -abstract class SkipOverPHP84AbstractProperties { - abstract MyType|TRUE $propA {get;} - protected abstract NULL|MyClass $propB {set;} -} - -$a = \NULL; -$a = \falSe; -$a = \True; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseConstantUnitTest.1.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseConstantUnitTest.1.inc.fixed deleted file mode 100644 index 883daf8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseConstantUnitTest.1.inc.fixed +++ /dev/null @@ -1,183 +0,0 @@ -NULL = 7; - -use Zend\Log\Writer\NULL as NullWriter; -new \Zend\Log\Writer\NULL(); - -namespace False; - -class True extends Null implements False {} - -use True\Something; -use Something\True; -class MyClass -{ - public function myFunction() - { - $var = array('foo' => new True()); - } -} - -$x = $f?false:true; -$x = $f? false:true; - -class MyClass -{ - // Spice things up a little. - const TRUE = false; -} - -var_dump(MyClass::TRUE); - -function tRUE() {} - -$input->getFilterChain()->attachByName('Null', ['type' => Null::TYPE_STRING]); - -// Issue #3332 - ignore type declarations, but not default values. -class TypedThings { - const MYCONST = false; - - public int|FALSE $int = false; - public Type|NULL $int = new MyObj(null); - - private function typed(int|FALSE $param = null, Type|NULL $obj = new MyObj(false)) : string|FALSE|NULL - { - if (true === false) { - return null; - } - } -} - -$cl = function (int|FALSE $param = null, Type|NULL $obj = new MyObj(false)) : string|FALSE|NULL {}; - -// Adding some extra tests to safeguard that function declarations which don't create scope are handled correctly. -interface InterfaceMethodsWithReturnTypeNoScopeOpener { - private function typed($param = true) : string|FALSE|NULL; -} - -abstract class ClassMethodsWithReturnTypeNoScopeOpener { - abstract public function typed($param = false) : TRUE; -} - -// Additional tests to safeguard improved property type skip logic. -readonly class Properties { - use SomeTrait { - sayHello as private myPrivateHello; - } - - public Type|FALSE|NULL $propertyA = array( - 'itemA' => true, - 'itemB' => false, - 'itemC' => null, - ), $propertyB = false; - - protected \FullyQualified&Partially\Qualified&namespace\Relative $propertyC; - var ?TRUE $propertyD; - static array|callable|FALSE|self|parent $propertyE = true; - private - // phpcs:ignore Stnd.Cat.Sniff -- for reasons. - TRUE /*comment*/ - $propertyF = true; - - public function __construct( - public FALSE|NULL $promotedPropA, - readonly callable|TRUE $promotedPropB, - ) { - static $var; - echo static::class; - static::foo(); - $var = $var instanceof static; - $obj = new static(); - } - - public static function foo(): static|self|FALSE { - $callable = static function() {}; - } -} - -// PHP 8.3 introduces typed constants. -class TypedConstants { - const MyClass|NULL|TRUE|FALSE MYCONST = false; -} - -// Global constants can not be typed. -const MYCONST = true; - -class SkipOverPHP82DNFTypes { - protected (\FullyQualified&Partially\Qualified)|TRUE $propertyC; -} - -class SkipOverPHP84FinalProperties { - final MyType|FALSE $propA; - private static final NULL|MyClass $propB; -} - -// PHP 8.4 asymmetric visibility -class WithAsym { - - private(set) NULL|TRUE $asym1 = true; - - public private(set) ?bool $asym2 = false; - - protected(set) FALSE|string|null $asym3 = null; - - public protected(set) Type|NULL|bool $asym4 = true; -} - -abstract class SkipOverPHP84AbstractProperties { - abstract MyType|TRUE $propA {get;} - protected abstract NULL|MyClass $propB {set;} -} - -$a = \null; -$a = \false; -$a = \true; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseConstantUnitTest.2.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseConstantUnitTest.2.inc deleted file mode 100644 index c61a0a5..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseConstantUnitTest.2.inc +++ /dev/null @@ -1,4 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the LowerCaseConstant sniff. - * - * @covers \PHP_CodeSniffer\Standards\Generic\Sniffs\PHP\LowerCaseConstantSniff - */ -final class LowerCaseConstantUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'LowerCaseConstantUnitTest.1.inc': - return [ - 7 => 1, - 10 => 1, - 15 => 1, - 16 => 1, - 23 => 1, - 26 => 1, - 31 => 1, - 32 => 1, - 39 => 1, - 42 => 1, - 47 => 1, - 48 => 1, - 70 => 1, - 71 => 1, - 87 => 1, - 89 => 1, - 90 => 1, - 92 => 2, - 94 => 2, - 95 => 1, - 100 => 2, - 104 => 1, - 108 => 1, - 118 => 1, - 119 => 1, - 120 => 1, - 121 => 1, - 125 => 1, - 129 => 1, - 149 => 1, - 153 => 1, - 167 => 1, - 169 => 1, - 171 => 1, - 173 => 1, - 181 => 1, - 182 => 1, - 183 => 1, - ]; - - case 'LowerCaseConstantUnitTest.js': - return [ - 2 => 1, - 3 => 1, - 4 => 1, - 7 => 1, - 8 => 1, - 12 => 1, - 13 => 1, - 14 => 1, - ]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseKeywordUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseKeywordUnitTest.inc deleted file mode 100644 index c39a8d2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseKeywordUnitTest.inc +++ /dev/null @@ -1,76 +0,0 @@ - $x; -$r = Match ($x) { - 1 => 1, - 2 => 2, - DEFAULT, => 3, -}; - -class Reading { - Public READOnly int $var; -} - -EnuM ENUM: string -{ - Case HEARTS; -} - -new Class {}; -new clasS extends stdClass {}; -new class {}; - -if (isset($a) && !empty($a)) { unset($a); } -if (ISSET($a) && !Empty($a)) { UnSeT($a); } -eval('foo'); -eVaL('foo'); - -$c = function() { - Yield /*comment*/ From fun(); - YIELD - /*comment*/ - FROM fun(); -} - -class AsymmetricVisibility { - public(set) int $correctPublicSet; - protected(set) int $correctProtectedSet; - private(set) int $correctPrivateSet; - - PubliC(SeT) int $wrongCasePublic; - PROTECTED(set) array $wrongCaseProtected; - protected(sEt) int $wrongCaseProtectedSet; - Private(set) int $wrongCasePrivate; - private(SET) readonly ?string $wrongCasePrivateSet; -} - -__HALT_COMPILER(); // An exception due to phar support. -function diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseKeywordUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseKeywordUnitTest.inc.fixed deleted file mode 100644 index ebb05d1..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseKeywordUnitTest.inc.fixed +++ /dev/null @@ -1,76 +0,0 @@ - $x; -$r = match ($x) { - 1 => 1, - 2 => 2, - default, => 3, -}; - -class Reading { - public readonly int $var; -} - -enum ENUM: string -{ - case HEARTS; -} - -new class {}; -new class extends stdClass {}; -new class {}; - -if (isset($a) && !empty($a)) { unset($a); } -if (isset($a) && !empty($a)) { unset($a); } -eval('foo'); -eval('foo'); - -$c = function() { - yield /*comment*/ from fun(); - yield - /*comment*/ - from fun(); -} - -class AsymmetricVisibility { - public(set) int $correctPublicSet; - protected(set) int $correctProtectedSet; - private(set) int $correctPrivateSet; - - public(set) int $wrongCasePublic; - protected(set) array $wrongCaseProtected; - protected(set) int $wrongCaseProtectedSet; - private(set) int $wrongCasePrivate; - private(set) readonly ?string $wrongCasePrivateSet; -} - -__HALT_COMPILER(); // An exception due to phar support. -function diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseKeywordUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseKeywordUnitTest.php deleted file mode 100644 index 6948751..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseKeywordUnitTest.php +++ /dev/null @@ -1,83 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the LowerCaseKeyword sniff. - * - * @covers \PHP_CodeSniffer\Standards\Generic\Sniffs\PHP\LowerCaseKeywordSniff - */ -final class LowerCaseKeywordUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 10 => 3, - 11 => 4, - 12 => 1, - 13 => 3, - 14 => 7, - 15 => 1, - 19 => 1, - 20 => 1, - 21 => 1, - 25 => 1, - 28 => 1, - 31 => 1, - 32 => 1, - 35 => 1, - 39 => 2, - 42 => 1, - 44 => 1, - 47 => 1, - 48 => 1, - 52 => 3, - 54 => 1, - 57 => 2, - 58 => 1, - 60 => 1, - 68 => 1, - 69 => 1, - 70 => 1, - 71 => 1, - 72 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseTypeUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseTypeUnitTest.inc deleted file mode 100644 index 7474310..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseTypeUnitTest.inc +++ /dev/null @@ -1,145 +0,0 @@ - $a * $b; -$arrow = fn (Int $a, String $b, BOOL $c, Array $d, Foo\Bar $e) : Float => $a * $b; - -$cl = function (False $a, TRUE $b, Null $c): ?True {}; - -class TypedClassConstants -{ - const UNTYPED = null; - const FLOAT = 'Reserved keyword as name is valid and should not be changed'; - const OBJECT = 'Reserved keyword as name is valid and should not be changed'; - - const ClassName FIRST = null; - public const Int SECOND = 0; - private const ?BOOL THIRD = false; - public const Self FOURTH = null; -} -interface TypedInterfaceConstants -{ - protected const PaRenT FIRST = null; - private const ARRAY SECOND = []; - public const Float THIRD = 2.5; - final const ?STRING FOURTH = 'fourth'; -} -trait TypedTraitConstants { - const IterablE FIRST = null; - const Object SECOND = null; - const Mixed THIRD = 'third'; -} -enum TypedEnumConstants { - public const Iterable|FALSE|NULL FIRST = null; - protected const SELF|Parent /* comment */ |\Fully\Qualified\ClassName|UnQualifiedClass SECOND = null; - private const ClassName|/*comment*/Float|STRING|False THIRD = 'third'; - public const sTRing | aRRaY | FaLSe FOURTH = 'fourth'; -} - -class DNFTypes { - const (Parent&Something)|Float CONST_NAME = 1.5; - - public readonly TRUE|(\A&B) $prop; - - function DNFParamTypes ( - null|(\Package\ClassName&\Package\Other_Class)|INT $DNFinMiddle, - (\Package\ClassName&\Package\Other_Class)|ARRAY $parensAtStart, - False|(\Package\ClassName&\Package\Other_Class) $parentAtEnd, - ) {} - - function DNFReturnTypes ($var): object|(Self&\Package\Other_Class)|sTRINg|false {} -} - -// Intentional error, should be ignored by the sniff. -interface PropertiesNotAllowed { - public $notAllowed; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseTypeUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseTypeUnitTest.inc.fixed deleted file mode 100644 index 4814ea8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseTypeUnitTest.inc.fixed +++ /dev/null @@ -1,145 +0,0 @@ - $a * $b; -$arrow = fn (int $a, string $b, bool $c, array $d, Foo\Bar $e) : float => $a * $b; - -$cl = function (false $a, true $b, null $c): ?true {}; - -class TypedClassConstants -{ - const UNTYPED = null; - const FLOAT = 'Reserved keyword as name is valid and should not be changed'; - const OBJECT = 'Reserved keyword as name is valid and should not be changed'; - - const ClassName FIRST = null; - public const int SECOND = 0; - private const ?bool THIRD = false; - public const self FOURTH = null; -} -interface TypedInterfaceConstants -{ - protected const parent FIRST = null; - private const array SECOND = []; - public const float THIRD = 2.5; - final const ?string FOURTH = 'fourth'; -} -trait TypedTraitConstants { - const iterable FIRST = null; - const object SECOND = null; - const mixed THIRD = 'third'; -} -enum TypedEnumConstants { - public const iterable|false|null FIRST = null; - protected const self|parent /* comment */ |\Fully\Qualified\ClassName|UnQualifiedClass SECOND = null; - private const ClassName|/*comment*/float|string|false THIRD = 'third'; - public const string | array | false FOURTH = 'fourth'; -} - -class DNFTypes { - const (parent&Something)|float CONST_NAME = 1.5; - - public readonly true|(\A&B) $prop; - - function DNFParamTypes ( - null|(\Package\ClassName&\Package\Other_Class)|int $DNFinMiddle, - (\Package\ClassName&\Package\Other_Class)|array $parensAtStart, - false|(\Package\ClassName&\Package\Other_Class) $parentAtEnd, - ) {} - - function DNFReturnTypes ($var): object|(self&\Package\Other_Class)|string|false {} -} - -// Intentional error, should be ignored by the sniff. -interface PropertiesNotAllowed { - public $notAllowed; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseTypeUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseTypeUnitTest.php deleted file mode 100644 index 919cf4d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/LowerCaseTypeUnitTest.php +++ /dev/null @@ -1,117 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the LowerCaseType sniff. - * - * @covers \PHP_CodeSniffer\Standards\Generic\Sniffs\PHP\LowerCaseTypeSniff - */ -final class LowerCaseTypeUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 14 => 1, - 15 => 1, - 16 => 1, - 17 => 1, - 18 => 1, - 21 => 4, - 22 => 3, - 23 => 3, - 25 => 1, - 26 => 2, - 27 => 2, - 32 => 4, - 36 => 1, - 37 => 1, - 38 => 1, - 39 => 1, - 43 => 2, - 44 => 1, - 46 => 1, - 49 => 1, - 51 => 2, - 53 => 1, - 55 => 2, - 60 => 1, - 61 => 1, - 62 => 1, - 63 => 1, - 64 => 1, - 65 => 1, - 66 => 1, - 67 => 1, - 68 => 1, - 69 => 1, - 71 => 3, - 72 => 2, - 73 => 3, - 74 => 3, - 78 => 3, - 82 => 2, - 85 => 1, - 94 => 5, - 96 => 4, - 105 => 1, - 106 => 1, - 107 => 1, - 111 => 1, - 112 => 1, - 113 => 1, - 114 => 1, - 117 => 1, - 118 => 1, - 119 => 1, - 122 => 3, - 123 => 2, - 124 => 3, - 125 => 3, - 129 => 2, - 131 => 1, - 134 => 1, - 135 => 1, - 136 => 1, - 139 => 2, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - // Warning from getMemberProperties() about parse error. - return [144 => 1]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/NoSilencedErrorsUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/NoSilencedErrorsUnitTest.inc deleted file mode 100644 index 98159b4..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/NoSilencedErrorsUnitTest.inc +++ /dev/null @@ -1,16 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the NoSilencedErrors sniff. - * - * @covers \PHP_CodeSniffer\Standards\Generic\Sniffs\PHP\NoSilencedErrorsSniff - */ -final class NoSilencedErrorsUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [13 => 1]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [ - 5 => 1, - 10 => 1, - 16 => 1, - ]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/RequireStrictTypesUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/RequireStrictTypesUnitTest.1.inc deleted file mode 100644 index 387cec2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/RequireStrictTypesUnitTest.1.inc +++ /dev/null @@ -1,8 +0,0 @@ - - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the RequireStrictType sniff. - * - * @covers \PHP_CodeSniffer\Standards\Generic\Sniffs\PHP\RequireStrictTypesSniff - */ -final class RequireStrictTypesUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'RequireStrictTypesUnitTest.2.inc': - case 'RequireStrictTypesUnitTest.5.inc': - case 'RequireStrictTypesUnitTest.6.inc': - case 'RequireStrictTypesUnitTest.10.inc': - return [1 => 1]; - - default: - return []; - } - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getWarningList($testFile='') - { - switch ($testFile) { - case 'RequireStrictTypesUnitTest.11.inc': - case 'RequireStrictTypesUnitTest.12.inc': - case 'RequireStrictTypesUnitTest.14.inc': - case 'RequireStrictTypesUnitTest.15.inc': - return [3 => 1]; - - default: - return []; - } - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/SAPIUsageUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/SAPIUsageUnitTest.inc deleted file mode 100644 index f0f350f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/SAPIUsageUnitTest.inc +++ /dev/null @@ -1,5 +0,0 @@ -php_sapi_name() === true) {} -if ($object?->php_sapi_name() === true) {} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/SAPIUsageUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/SAPIUsageUnitTest.php deleted file mode 100644 index afdc020..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/SAPIUsageUnitTest.php +++ /dev/null @@ -1,53 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the SAPIUsage sniff. - * - * @covers \PHP_CodeSniffer\Standards\Generic\Sniffs\PHP\SAPIUsageSniff - */ -final class SAPIUsageUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [2 => 1]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/SyntaxUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/SyntaxUnitTest.1.inc deleted file mode 100644 index 4f0d9d8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/SyntaxUnitTest.1.inc +++ /dev/null @@ -1,4 +0,0 @@ - -
    text
    - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/SyntaxUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/SyntaxUnitTest.php deleted file mode 100644 index e6fd908..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/SyntaxUnitTest.php +++ /dev/null @@ -1,170 +0,0 @@ - - * @author Blaine Schmeisser - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\PHP; - -use PHP_CodeSniffer\Files\DummyFile; -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Tests\ConfigDouble; -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the Syntax sniff. - * - * @covers \PHP_CodeSniffer\Standards\Generic\Sniffs\PHP\SyntaxSniff - */ -final class SyntaxUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'SyntaxUnitTest.1.inc': - case 'SyntaxUnitTest.2.inc': - return [3 => 1]; - - default: - return []; - } - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - - /** - * Test the sniff checks syntax when file contents are passed via STDIN. - * - * Note: this test doesn't run on Windows as PHPCS currently doesn't support STDIN on this OS. - * - * @param string $content The content to test. - * @param int $errorCount The expected number of errors. - * @param array $expectedErrors The expected errors. - * - * @dataProvider dataStdIn - * @requires OS ^(?!WIN).* - * - * @return void - */ - public function testStdIn($content, $errorCount, $expectedErrors) - { - $config = new ConfigDouble(); - $config->standards = ['Generic']; - $config->sniffs = ['Generic.PHP.Syntax']; - - $ruleset = new Ruleset($config); - - $file = new DummyFile($content, $ruleset, $config); - $file->process(); - - $this->assertSame( - $errorCount, - $file->getErrorCount(), - 'Error count does not match expected value' - ); - $this->assertSame( - 0, - $file->getWarningCount(), - 'Warning count does not match expected value' - ); - $this->assertSame( - $expectedErrors, - $file->getErrors(), - 'Error list does not match expected errors' - ); - - }//end testStdIn() - - - /** - * Data provider for testStdIn(). - * - * @return array> - */ - public function dataStdIn() - { - // The error message changed in PHP 8+. - if (PHP_VERSION_ID >= 80000) { - $errorMessage = 'PHP syntax error: syntax error, unexpected token ";", expecting "]"'; - } else { - $errorMessage = 'PHP syntax error: syntax error, unexpected \';\', expecting \']\''; - } - - return [ - 'No syntax errors' => [ - ' [ - ' [ - 1 => [ - 0 => [ - 'message' => $errorMessage, - 'source' => 'Generic.PHP.Syntax.PHPSyntax', - 'listener' => 'PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\PHP\\SyntaxSniff', - 'severity' => 5, - 'fixable' => false, - ], - ], - ], - ], - ], - 'Single error reported even when there is more than one syntax error in the file' => [ - ' [ - 1 => [ - 0 => [ - 'message' => $errorMessage, - 'source' => 'Generic.PHP.Syntax.PHPSyntax', - 'listener' => 'PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\PHP\\SyntaxSniff', - 'severity' => 5, - 'fixable' => false, - ], - ], - ], - ], - ], - ]; - - }//end dataStdIn() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/UpperCaseConstantUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/UpperCaseConstantUnitTest.inc deleted file mode 100644 index 02b56d6..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/UpperCaseConstantUnitTest.inc +++ /dev/null @@ -1,124 +0,0 @@ -null = 7; - -use Zend\Log\Writer\Null as NullWriter; -new \Zend\Log\Writer\Null(); - -namespace False; - -class True extends Null implements False {} - -use True\Something; -use Something\True; -class MyClass -{ - public function myFunction() - { - $var = array('foo' => new True()); - } -} - -$x = $f?false:TRUE; -$x = $f? false:TRUE; - -class MyClass -{ - // Spice things up a little. - const true = FALSE; -} - -var_dump(MyClass::true); - -function true() {} - -// Issue #3332 - ignore type declarations, but not default values. -class TypedThings { - const MYCONST = false; - - public int|false $int = false; - public Type|null $int = new MyObj(null); - - private function typed(int|false $param = null, Type|null $obj = new MyObj(false)) : string|false|null - { - if (true === false) { - return null; - } - } -} - -$cl = function (int|false $param = null, Type|null $obj = new MyObj(false)) : string|false|null {}; - -class SkipOverPHP82DNFTypes { - protected (\FullyQualified&Partially\Qualified)|false $propertyC; -} - -class SkipOverPHP84FinalProperties { - final MyType|false $propA; - private static final null|MyClass $propB; -} - -// PHP 8.4 asymmetric visibility -class WithAsym { - private(set) null|true $asym1 = TRUE; - public private(set) ?bool $asym2 = false; - protected(set) false|string|null $asym3 = null; - public protected(set) Type|null|bool $asym4 = true; -} - -abstract class SkipOverPHP84AbstractProperties { - abstract MyType|true $propA {get;} - protected abstract null|MyClass $propB {set;} -} - -$a = \null; -$a = \falSe; -$a = \True; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/UpperCaseConstantUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/UpperCaseConstantUnitTest.inc.fixed deleted file mode 100644 index 146e8a0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/UpperCaseConstantUnitTest.inc.fixed +++ /dev/null @@ -1,124 +0,0 @@ -null = 7; - -use Zend\Log\Writer\Null as NullWriter; -new \Zend\Log\Writer\Null(); - -namespace False; - -class True extends Null implements False {} - -use True\Something; -use Something\True; -class MyClass -{ - public function myFunction() - { - $var = array('foo' => new True()); - } -} - -$x = $f?FALSE:TRUE; -$x = $f? FALSE:TRUE; - -class MyClass -{ - // Spice things up a little. - const true = FALSE; -} - -var_dump(MyClass::true); - -function true() {} - -// Issue #3332 - ignore type declarations, but not default values. -class TypedThings { - const MYCONST = FALSE; - - public int|false $int = FALSE; - public Type|null $int = new MyObj(NULL); - - private function typed(int|false $param = NULL, Type|null $obj = new MyObj(FALSE)) : string|false|null - { - if (TRUE === FALSE) { - return NULL; - } - } -} - -$cl = function (int|false $param = NULL, Type|null $obj = new MyObj(FALSE)) : string|false|null {}; - -class SkipOverPHP82DNFTypes { - protected (\FullyQualified&Partially\Qualified)|false $propertyC; -} - -class SkipOverPHP84FinalProperties { - final MyType|false $propA; - private static final null|MyClass $propB; -} - -// PHP 8.4 asymmetric visibility -class WithAsym { - private(set) null|true $asym1 = TRUE; - public private(set) ?bool $asym2 = FALSE; - protected(set) false|string|null $asym3 = NULL; - public protected(set) Type|null|bool $asym4 = TRUE; -} - -abstract class SkipOverPHP84AbstractProperties { - abstract MyType|true $propA {get;} - protected abstract null|MyClass $propB {set;} -} - -$a = \NULL; -$a = \FALSE; -$a = \TRUE; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/UpperCaseConstantUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/UpperCaseConstantUnitTest.php deleted file mode 100644 index 82d23ed..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/PHP/UpperCaseConstantUnitTest.php +++ /dev/null @@ -1,81 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the UpperCaseConstant sniff. - * - * @covers \PHP_CodeSniffer\Standards\Generic\Sniffs\PHP\UpperCaseConstantSniff - */ -final class UpperCaseConstantUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 7 => 1, - 10 => 1, - 15 => 1, - 16 => 1, - 23 => 1, - 26 => 1, - 31 => 1, - 32 => 1, - 39 => 1, - 42 => 1, - 47 => 1, - 48 => 1, - 70 => 1, - 71 => 1, - 85 => 1, - 87 => 1, - 88 => 1, - 90 => 2, - 92 => 2, - 93 => 1, - 98 => 2, - 112 => 1, - 113 => 1, - 114 => 1, - 122 => 1, - 123 => 1, - 124 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Strings/UnnecessaryHeredocUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Strings/UnnecessaryHeredocUnitTest.1.inc deleted file mode 100644 index 428b4b8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Strings/UnnecessaryHeredocUnitTest.1.inc +++ /dev/null @@ -1,122 +0,0 @@ -bar} -END; - -$heredoc = <<< "END" -some ${beers::softdrink} -END; - -$heredoc = <<< END -{${$object->getName()}} text -END; - -$heredoc = <<<"END" -some {${getName()}} -END; - -$heredoc = <<baz()()} -END; - -$heredoc = <<values[3]->name} text -END; - -$heredoc = <<<"END" -some ${$bar} -END; - -$heredoc = <<bar} text -END; - -$heredoc = <<<"END" -${foo["${bar}"]} text -END; - -$heredoc = <<{${'a'}}} text -END; - -$heredoc = <<{$baz[1]}} -END; - -$heredoc = <<john's wife greeted $people->robert. -END; - -$heredoc = <<bar} -END; - -$heredoc = <<< "END" -some ${beers::softdrink} -END; - -$heredoc = <<< END -{${$object->getName()}} text -END; - -$heredoc = <<<"END" -some {${getName()}} -END; - -$heredoc = <<baz()()} -END; - -$heredoc = <<values[3]->name} text -END; - -$heredoc = <<<"END" -some ${$bar} -END; - -$heredoc = <<bar} text -END; - -$heredoc = <<<"END" -${foo["${bar}"]} text -END; - -$heredoc = <<{${'a'}}} text -END; - -$heredoc = <<{$baz[1]}} -END; - -$heredoc = <<john's wife greeted $people->robert. -END; - -$heredoc = <<bar} - END; - -$heredoc = <<< "END" - some ${beers::softdrink} - END; - -$heredoc = <<< END - {${$object->getName()}} text - END; - -$heredoc = <<<"END" - some {${getName()}} - END; - -$heredoc = <<baz()()} - END; - -$heredoc = <<values[3]->name} text - END; - -$heredoc = <<<"END" - some ${$bar} - END; - -$heredoc = <<bar} text - END; - -$heredoc = <<<"END" - ${foo["${bar}"]} text - END; - -$heredoc = <<{${'a'}}} text - END; - -$heredoc = <<{$baz[1]}} - END; - -$heredoc = <<john's wife greeted $people->robert. - END; - -$heredoc = <<bar} - END; - -$heredoc = <<< "END" - some ${beers::softdrink} - END; - -$heredoc = <<< END - {${$object->getName()}} text - END; - -$heredoc = <<<"END" - some {${getName()}} - END; - -$heredoc = <<baz()()} - END; - -$heredoc = <<values[3]->name} text - END; - -$heredoc = <<<"END" - some ${$bar} - END; - -$heredoc = <<bar} text - END; - -$heredoc = <<<"END" - ${foo["${bar}"]} text - END; - -$heredoc = <<{${'a'}}} text - END; - -$heredoc = <<{$baz[1]}} - END; - -$heredoc = <<john's wife greeted $people->robert. - END; - -$heredoc = << - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\Strings; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the UnnecessaryHeredoc sniff. - * - * @covers \PHP_CodeSniffer\Standards\Generic\Sniffs\Strings\UnnecessaryHeredocSniff - */ -final class UnnecessaryHeredocUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return []; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getWarningList($testFile='') - { - $warnings = [ - 100 => 1, - 104 => 1, - ]; - - switch ($testFile) { - case 'UnnecessaryHeredocUnitTest.1.inc': - return $warnings; - - case 'UnnecessaryHeredocUnitTest.2.inc': - if (PHP_VERSION_ID >= 70300) { - return $warnings; - } - - // PHP 7.2 or lower: PHP version which doesn't support flexible heredocs/nowdocs yet. - return []; - - default: - return []; - } - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Strings/UnnecessaryStringConcatUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Strings/UnnecessaryStringConcatUnitTest.1.inc deleted file mode 100644 index d2ac790..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Strings/UnnecessaryStringConcatUnitTest.1.inc +++ /dev/null @@ -1,34 +0,0 @@ -'; -$code = '<'.'?php '; - -$string = 'This is a really long string. ' - . 'It is being used for errors. ' - . 'The message is not translated.'; - -$shouldBail = 1 + 1; - -$shouldNotTrigger = 'My' . /* comment */ 'string'; -$shouldNotTrigger = 'My' /* comment */ . 'string'; - -// phpcs:set Generic.Strings.UnnecessaryStringConcat allowMultiline true -$string = 'Multiline strings are allowed ' - . 'when setting is enabled.'; -// phpcs:set Generic.Strings.UnnecessaryStringConcat allowMultiline false - -// phpcs:set Generic.Strings.UnnecessaryStringConcat error false -$throwWarning = 'My' . 'string'; -// phpcs:set Generic.Strings.UnnecessaryStringConcat error true diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Strings/UnnecessaryStringConcatUnitTest.2.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Strings/UnnecessaryStringConcatUnitTest.2.inc deleted file mode 100644 index 6a5fcba..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/Strings/UnnecessaryStringConcatUnitTest.2.inc +++ /dev/null @@ -1,7 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\Strings; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the UnnecessaryStringConcat sniff. - * - * @covers \PHP_CodeSniffer\Standards\Generic\Sniffs\Strings\UnnecessaryStringConcatSniff - */ -final class UnnecessaryStringConcatUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'UnnecessaryStringConcatUnitTest.1.inc': - return [ - 2 => 1, - 6 => 1, - 9 => 1, - 12 => 1, - 19 => 1, - 20 => 1, - ]; - - case 'UnnecessaryStringConcatUnitTest.js': - return [ - 1 => 1, - 8 => 1, - 11 => 1, - 14 => 1, - 15 => 1, - ]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getWarningList($testFile='') - { - switch ($testFile) { - case 'UnnecessaryStringConcatUnitTest.1.inc': - return [ - 33 => 1, - ]; - - default: - return []; - } - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.1.css b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.1.css deleted file mode 100644 index de84a94..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.1.css +++ /dev/null @@ -1,35 +0,0 @@ -/* - * This is a CSS comment. -<<<<<<< HEAD - * This is a merge conflict... -======= - * which should be detected. ->>>>>>> ref/heads/feature-branch - */ - -.SettingsTabPaneWidgetType-tab-mid { - background: transparent url(tab_inact_mid.png) repeat-x; -<<<<<<< HEAD - line-height: -25px; -======= - line-height: -20px; ->>>>>>> ref/heads/feature-branch - cursor: pointer; - -moz-user-select: none; -} - -/* - * The above tests are based on "normal" tokens. - * The below test checks that once the tokenizer breaks down because of - * unexpected merge conflict boundaries, subsequent boundaries will still - * be detected correctly. - */ - -/* - * This is a CSS comment. -<<<<<<< HEAD - * This is a merge conflict... -======= - * which should be detected. ->>>>>>> ref/heads/feature-branch - */ diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.1.inc deleted file mode 100644 index 470c3b8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.1.inc +++ /dev/null @@ -1,61 +0,0 @@ -> -1); -var_dump( -1 -<< --1 -); - -$string = -<< 'a' -<<<<<<< HEAD - 'b' => 'b' -======= - 'c' => 'c' ->>>>>>> master - ); - } - -/* - * The above tests are based on "normal" tokens. - * The below test checks that once the tokenizer breaks down because of - * unexpected merge conflict boundaries - i.e. after the first merge conflict - * opener in non-comment, non-heredoc/nowdoc, non-inline HTML code -, subsequent - * merge conflict boundaries will still be detected correctly. - */ - -/* - * Testing detecting subsequent merge conflicts. - * -<<<<<<< HEAD - * @var string $bar - */ -public function foo($bar){ } - -/** -============ -The above is not the boundary, the below is. -======= - * @var string $bar ->>>>>>> f19f8a5... Commit message -*/ - -// Test that stray boundaries, i.e. an opener without closer and such, are detected. -<<<<<<< HEAD -$a = 1; -======= diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.2.css b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.2.css deleted file mode 100644 index 6caa78d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.2.css +++ /dev/null @@ -1,32 +0,0 @@ -/* - * This is a CSS comment. -<<<<<<< HEAD - * This is a merge conflict started in a comment, ending in a CSS block. - */ -.SettingsTabPaneWidgetType-tab-mid { - background: transparent url(tab_inact_mid.png) repeat-x; -======= - * which should be detected. - **/ -.SettingsTabPaneWidgetType-tab-start { - line-height: -25px; ->>>>>>> ref/heads/feature-branch - cursor: pointer; - -moz-user-select: none; -} - -/* - * The above tests are based on "normal" tokens. - * The below test checks that once the tokenizer breaks down because of - * unexpected merge conflict boundaries, subsequent boundaries will still - * be detected correctly. - */ - -/* - * This is a CSS comment. -<<<<<<< HEAD - * This is a merge conflict... -======= - * which should be detected. ->>>>>>> ref/heads/feature-branch - */ diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.2.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.2.inc deleted file mode 100644 index 809b17d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.2.inc +++ /dev/null @@ -1,31 +0,0 @@ ->>>>>> master - */ - -/* - * Testing detecting merge conflicts using different comment styles. - * -<<<<<<< HEAD - * @var string $bar - */ -public function foo($bar){ } - -/* -======= - * @var string $bar ->>>>>>> master -*/ - -// Comment -<<<<<<< HEAD -// Second comment line. NOTE: The above opener breaks the tokenizer. -======= -// New second comment line ->>>>>>> master -// Third comment line diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.3.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.3.inc deleted file mode 100644 index ce70941..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.3.inc +++ /dev/null @@ -1,43 +0,0 @@ - -
    -<<<<<<< HEAD -

    Testing a merge conflict.

    -======= -

    Another text string.

    ->>>>>>> ref/heads/feature-branch -
    - - -
    -<<<<<<< HEAD -

    -======= -

    ->>>>>>> ref/heads/feature-branch -
    - ->>>>>> master - -/* - * The above tests are based on "normal" tokens. - * The below test checks that once the tokenizer breaks down because of - * unexpected merge conflict boundaries - i.e. after the first merge conflict - * opener in non-comment, non-heredoc/nowdoc, non-inline HTML code -, subsequent - * merge conflict boundaries will still be detected correctly. - */ -?> - -
    -<<<<<<< HEAD -

    Testing a merge conflict.

    -======= -

    Another text string.

    ->>>>>>> ref/heads/feature-branch -
    diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.4.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.4.inc deleted file mode 100644 index 99c0b99..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.4.inc +++ /dev/null @@ -1,71 +0,0 @@ ->>>>>> ref/heads/other-branchname -And now they are. -EOD; - -// Heredoc with a merge conflict starter, the closer is outside the heredoc. -$string = -<<>>>>>> ref/heads/other-branchname - -// Merge conflict starter outside with a closer inside of the heredoc. -// This breaks the tokenizer. -<<<<<<< HEAD -$string = -<<>>>>>> ref/heads/other-branchname -EOD; - -/* - * The above tests are based on "normal" tokens. - * The below test checks that once the tokenizer breaks down because of - * unexpected merge conflict boundaries - i.e. after the first merge conflict - * opener in non-comment, non-heredoc/nowdoc, non-inline HTML code -, subsequent - * merge conflict boundaries will still be detected correctly. - */ - -$string = -<<>>>>>> ref/heads/other-branchname -And now they are. -EOD; - -$string = -<<>>>>>> ref/heads/other-branchname diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.5.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.5.inc deleted file mode 100644 index 7d55f6d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.5.inc +++ /dev/null @@ -1,34 +0,0 @@ ->>>>>> ref/heads/other-branchname -And now they are. -EOD; - -// Break the tokenizer. -<<<<<<< HEAD - -/* - * The above tests are based on "normal" tokens. - * The below test checks that once the tokenizer breaks down because of - * unexpected merge conflict boundaries - i.e. after the first merge conflict - * opener in non-comment, non-heredoc/nowdoc, non-inline HTML code -, subsequent - * merge conflict boundaries will still be detected correctly. - */ - -$string = -<<<'EOD' -can be problematic. -<<<<<<< HEAD -were previously not detected. -======= -should also be detected. ->>>>>>> ref/heads/other-branchname -And now they are. -EOD; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.6.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.6.inc deleted file mode 100644 index aaea324..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.6.inc +++ /dev/null @@ -1,34 +0,0 @@ ->>>>>> ref/heads/other-branchname - And now they are. - EOD; - -// Break the tokenizer. ->>>>>>> master - -/* - * The above tests are based on "normal" tokens. - * The below test checks that once the tokenizer breaks down because of - * unexpected merge conflict boundaries - i.e. after the first merge conflict - * opener in non-comment, non-heredoc/nowdoc, non-inline HTML code -, subsequent - * merge conflict boundaries will still be detected correctly. - */ - -$string = - <<<"EOD" - Merge conflicts in PHP 7.3 indented heredocs -<<<<<<< HEAD - can be problematic. -======= - should also be detected. ->>>>>>> ref/heads/other-branchname - And now they are. - EOD; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.7.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.7.inc deleted file mode 100644 index 85cae1f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.7.inc +++ /dev/null @@ -1,19 +0,0 @@ - -
    -<<<<<<< HEAD -

    Testing a merge conflict.

    -======= -

    Another text string.

    ->>>>>>> ref/heads/feature-branch -
    - - -
    -<<<<<<< HEAD -

    -======= -

    ->>>>>>> ref/heads/feature-branch -
    - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.js deleted file mode 100644 index cd7bc76..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.js +++ /dev/null @@ -1,33 +0,0 @@ - -result = x?y:z; -result = x ? y : z; - -<<<<<<< HEAD -if (something === true -======= -if (something === false ->>>>>>> develop - ^ somethingElse === true -) { -<<<<<<< HEAD - return true; -======= - return false; ->>>>>>> develop -} - -y = 1 - + 2 - - 3; - -/* -<<<<<<< HEAD - * @var string $bar - */ -if (something === true - -/** -======= - * @var string $foo ->>>>>>> master - */ diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.php deleted file mode 100644 index 21864b7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/GitMergeConflictUnitTest.php +++ /dev/null @@ -1,175 +0,0 @@ - - * @copyright 2017 Juliette Reinders Folmer. All rights reserved. - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\VersionControl; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the GitMergeConflict sniff. - * - * @covers \PHP_CodeSniffer\Standards\Generic\Sniffs\VersionControl\GitMergeConflictSniff - */ -final class GitMergeConflictUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'GitMergeConflictUnitTest.1.inc': - return [ - 26 => 1, - 28 => 1, - 30 => 1, - 45 => 1, - 53 => 1, - 55 => 1, - 59 => 1, - 61 => 1, - ]; - - case 'GitMergeConflictUnitTest.2.inc': - return [ - 4 => 1, - 6 => 1, - 8 => 1, - 14 => 1, - 20 => 1, - 22 => 1, - 26 => 1, - 28 => 1, - 30 => 1, - ]; - - case 'GitMergeConflictUnitTest.3.inc': - return [ - 3 => 1, - 5 => 1, - 7 => 1, - 12 => 1, - 14 => 1, - 16 => 1, - 22 => 1, - 24 => 1, - 26 => 1, - 38 => 1, - 40 => 1, - 42 => 1, - ]; - - case 'GitMergeConflictUnitTest.4.inc': - return [ - 6 => 1, - 8 => 1, - 10 => 1, - 18 => 1, - 22 => 1, - 25 => 1, - 29 => 1, - 34 => 1, - 39 => 1, - 53 => 1, - 55 => 1, - 57 => 1, - 64 => 1, - 68 => 1, - 71 => 1, - ]; - case 'GitMergeConflictUnitTest.5.inc': - case 'GitMergeConflictUnitTest.6.inc': - return [ - 6 => 1, - 8 => 1, - 10 => 1, - 15 => 1, - 28 => 1, - 30 => 1, - 32 => 1, - ]; - - case 'GitMergeConflictUnitTest.7.inc': - return [ - 3 => 1, - 5 => 1, - 7 => 1, - 12 => 1, - 14 => 1, - 16 => 1, - ]; - - case 'GitMergeConflictUnitTest.1.css': - return [ - 3 => 1, - 5 => 1, - 7 => 1, - 12 => 1, - 14 => 1, - 16 => 1, - 30 => 1, - 32 => 1, - 34 => 1, - ]; - - case 'GitMergeConflictUnitTest.2.css': - return [ - 3 => 1, - 8 => 1, - 13 => 1, - 27 => 1, - 29 => 1, - 31 => 1, - ]; - - case 'GitMergeConflictUnitTest.js': - return [ - 5 => 1, - 7 => 1, - 9 => 1, - 12 => 1, - 14 => 1, - 16 => 1, - 24 => 1, - 30 => 1, - 32 => 1, - ]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/SubversionPropertiesUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/SubversionPropertiesUnitTest.inc deleted file mode 100644 index e4110de..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/VersionControl/SubversionPropertiesUnitTest.inc +++ /dev/null @@ -1,3 +0,0 @@ - - * @copyright 2019 Juliette Reinders Folmer. All rights reserved. - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\VersionControl; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the SubversionProperties sniff. - * - * @covers \PHP_CodeSniffer\Standards\Generic\Sniffs\VersionControl\SubversionPropertiesSniff - */ -final class SubversionPropertiesUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Should this test be skipped for some reason. - * - * @return bool - */ - protected function shouldSkipTest() - { - // This sniff cannot be tested as no SVN version control directory is available. - return true; - - }//end shouldSkipTest() - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return []; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ArbitraryParenthesesSpacingUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ArbitraryParenthesesSpacingUnitTest.1.inc deleted file mode 100644 index 4ce0508..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ArbitraryParenthesesSpacingUnitTest.1.inc +++ /dev/null @@ -1,192 +0,0 @@ -{$var}( $foo,$bar ); - -$bar(function( $a, $b ) { - return function( $c, $d ) use ( $a, $b ) { - echo $a, $b, $c, $d; - }; -})( 'a','b' )( 'c','d' ); - -$closure( $foo,$bar ); -$var = $closure() + $closure( $foo,$bar ) + self::$closure( $foo,$bar ); - -class Test { - public static function baz( $foo, $bar ) { - $a = new self( $foo,$bar ); - $b = new static( $foo,$bar ); - } -} - -/* - * Test warning for empty parentheses. - */ -$a = 4 + (); // Warning. -$a = 4 + ( ); // Warning. -$a = 4 + (/* Not empty */); - -/* - * Test the actual sniff. - */ -if ((null !== $extra) && ($row->extra !== $extra)) {} - -if (( null !== $extra ) && ( $row->extra !== $extra )) {} // Bad x 4. - -if (( null !== $extra // Bad x 1. - && is_int($extra)) - && ( $row->extra !== $extra // Bad x 1. - || $something ) // Bad x 1. -) {} - -if (( null !== $extra ) // Bad x 2. - && ( $row->extra !== $extra ) // Bad x 2. -) {} - -$a = (null !== $extra); -$a = ( null !== $extra ); // Bad x 2. - -$sx = $vert ? ($w - 1) : 0; - -$this->is_overloaded = ( ( ini_get("mbstring.func_overload") & 2 ) != 0 ) && function_exists('mb_substr'); // Bad x 4. - -$image->flip( ($operation->axis & 1) != 0, ($operation->axis & 2) != 0 ); - -if ( $success && ('nothumb' == $target || 'all' == $target) ) {} - -$directory = ('/' == $file[ strlen($file)-1 ]); - -// phpcs:set Generic.WhiteSpace.ArbitraryParenthesesSpacing spacing 1 -if ((null !== $extra) && ($row->extra !== $extra)) {} // Bad x 4. - -if (( null !== $extra ) && ( $row->extra !== $extra )) {} - -if (( null !== $extra // Bad x 1. - && is_int($extra)) // Bad x 1. - && ( $row->extra !== $extra - || $something ) // Bad x 1. -) {} - -if ((null !== $extra) // Bad x 2. - && ($row->extra !== $extra) // Bad x 2. -) {} - -$a = (null !== $extra); // Bad x 2. -$a = ( null !== $extra ); - -$sx = $vert ? ($w - 1) : 0; // Bad x 2. - -$this->is_overloaded = ((ini_get("mbstring.func_overload") & 2) != 0) && function_exists('mb_substr'); // Bad x 4. - -$image->flip( ($operation->axis & 1) != 0, ($operation->axis & 2) != 0 ); // Bad x 4. - -if ( $success && ('nothumb' == $target || 'all' == $target) ) {} // Bad x 2. - -$directory = ('/' == $file[ strlen($file)-1 ]); // Bad x 2. - -// phpcs:set Generic.WhiteSpace.ArbitraryParenthesesSpacing spacing 0 - -/* - * Test handling of ignoreNewlines. - */ -if ( - ( - null !== $extra - ) && ( - $row->extra !== $extra - ) -) {} // Bad x 4, 1 x line 123, 2 x line 125, 1 x line 127. - - -$a = ( - null !== $extra -); // Bad x 2, 1 x line 131, 1 x line 133. - -// phpcs:set Generic.WhiteSpace.ArbitraryParenthesesSpacing spacing 1 -if ( - ( - null !== $extra - ) && ( - $row->extra !== $extra - ) -) {} // Bad x 4, 1 x line 137, 2 x line 139, 1 x line 141. - -$a = ( - null !== $extra -); // Bad x 2, 1 x line 144, 1 x line 146. -// phpcs:set Generic.WhiteSpace.ArbitraryParenthesesSpacing spacing 0 - -// phpcs:set Generic.WhiteSpace.ArbitraryParenthesesSpacing ignoreNewlines true -if ( - ( - null !== $extra - ) && ( - $row->extra !== $extra - ) -) {} - -$a = ( - null !== $extra -); -// phpcs:set Generic.WhiteSpace.ArbitraryParenthesesSpacing ignoreNewlines false - -if (true) {} ( 1+2) === 3 ? $a = 1 : $a = 2; -class A {} ( 1+2) === 3 ? $a = 1 : $a = 2; -function foo() {} ( 1+2) === 3 ? $a = 1 : $a = 2; - -// Issue #3618. -class NonArbitraryParenthesesWithKeywords { - public static function baz( $foo, $bar ) { - $a = new self(); - $b = new parent(); - $c = new static(); - - // self/static are already tested above, round line 45. - $d = new parent( $foo,$bar ); - } -} - -// Test that the match expression does not trigger the sniff. -$b = match ( $a ) { - 1 => true, -}; - -// Parentheses after die/exit in a switch case should be ignored. -switch ( $type ) { - case A: - exit( 1 ); - case B: - die(); - default: - break; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ArbitraryParenthesesSpacingUnitTest.1.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ArbitraryParenthesesSpacingUnitTest.1.inc.fixed deleted file mode 100644 index a002280..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ArbitraryParenthesesSpacingUnitTest.1.inc.fixed +++ /dev/null @@ -1,180 +0,0 @@ -{$var}( $foo,$bar ); - -$bar(function( $a, $b ) { - return function( $c, $d ) use ( $a, $b ) { - echo $a, $b, $c, $d; - }; -})( 'a','b' )( 'c','d' ); - -$closure( $foo,$bar ); -$var = $closure() + $closure( $foo,$bar ) + self::$closure( $foo,$bar ); - -class Test { - public static function baz( $foo, $bar ) { - $a = new self( $foo,$bar ); - $b = new static( $foo,$bar ); - } -} - -/* - * Test warning for empty parentheses. - */ -$a = 4 + (); // Warning. -$a = 4 + ( ); // Warning. -$a = 4 + (/* Not empty */); - -/* - * Test the actual sniff. - */ -if ((null !== $extra) && ($row->extra !== $extra)) {} - -if ((null !== $extra) && ($row->extra !== $extra)) {} // Bad x 4. - -if ((null !== $extra // Bad x 1. - && is_int($extra)) - && ($row->extra !== $extra // Bad x 1. - || $something) // Bad x 1. -) {} - -if ((null !== $extra) // Bad x 2. - && ($row->extra !== $extra) // Bad x 2. -) {} - -$a = (null !== $extra); -$a = (null !== $extra); // Bad x 2. - -$sx = $vert ? ($w - 1) : 0; - -$this->is_overloaded = ((ini_get("mbstring.func_overload") & 2) != 0) && function_exists('mb_substr'); // Bad x 4. - -$image->flip( ($operation->axis & 1) != 0, ($operation->axis & 2) != 0 ); - -if ( $success && ('nothumb' == $target || 'all' == $target) ) {} - -$directory = ('/' == $file[ strlen($file)-1 ]); - -// phpcs:set Generic.WhiteSpace.ArbitraryParenthesesSpacing spacing 1 -if (( null !== $extra ) && ( $row->extra !== $extra )) {} // Bad x 4. - -if (( null !== $extra ) && ( $row->extra !== $extra )) {} - -if (( null !== $extra // Bad x 1. - && is_int($extra) ) // Bad x 1. - && ( $row->extra !== $extra - || $something ) // Bad x 1. -) {} - -if (( null !== $extra ) // Bad x 2. - && ( $row->extra !== $extra ) // Bad x 2. -) {} - -$a = ( null !== $extra ); // Bad x 2. -$a = ( null !== $extra ); - -$sx = $vert ? ( $w - 1 ) : 0; // Bad x 2. - -$this->is_overloaded = ( ( ini_get("mbstring.func_overload") & 2 ) != 0 ) && function_exists('mb_substr'); // Bad x 4. - -$image->flip( ( $operation->axis & 1 ) != 0, ( $operation->axis & 2 ) != 0 ); // Bad x 4. - -if ( $success && ( 'nothumb' == $target || 'all' == $target ) ) {} // Bad x 2. - -$directory = ( '/' == $file[ strlen($file)-1 ] ); // Bad x 2. - -// phpcs:set Generic.WhiteSpace.ArbitraryParenthesesSpacing spacing 0 - -/* - * Test handling of ignoreNewlines. - */ -if ( - (null !== $extra) && ($row->extra !== $extra) -) {} // Bad x 4, 1 x line 123, 2 x line 125, 1 x line 127. - - -$a = (null !== $extra); // Bad x 2, 1 x line 131, 1 x line 133. - -// phpcs:set Generic.WhiteSpace.ArbitraryParenthesesSpacing spacing 1 -if ( - ( null !== $extra ) && ( $row->extra !== $extra ) -) {} // Bad x 4, 1 x line 137, 2 x line 139, 1 x line 141. - -$a = ( null !== $extra ); // Bad x 2, 1 x line 144, 1 x line 146. -// phpcs:set Generic.WhiteSpace.ArbitraryParenthesesSpacing spacing 0 - -// phpcs:set Generic.WhiteSpace.ArbitraryParenthesesSpacing ignoreNewlines true -if ( - ( - null !== $extra - ) && ( - $row->extra !== $extra - ) -) {} - -$a = ( - null !== $extra -); -// phpcs:set Generic.WhiteSpace.ArbitraryParenthesesSpacing ignoreNewlines false - -if (true) {} (1+2) === 3 ? $a = 1 : $a = 2; -class A {} (1+2) === 3 ? $a = 1 : $a = 2; -function foo() {} (1+2) === 3 ? $a = 1 : $a = 2; - -// Issue #3618. -class NonArbitraryParenthesesWithKeywords { - public static function baz( $foo, $bar ) { - $a = new self(); - $b = new parent(); - $c = new static(); - - // self/static are already tested above, round line 45. - $d = new parent( $foo,$bar ); - } -} - -// Test that the match expression does not trigger the sniff. -$b = match ( $a ) { - 1 => true, -}; - -// Parentheses after die/exit in a switch case should be ignored. -switch ( $type ) { - case A: - exit( 1 ); - case B: - die(); - default: - break; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ArbitraryParenthesesSpacingUnitTest.2.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ArbitraryParenthesesSpacingUnitTest.2.inc deleted file mode 100644 index 3d5bcd0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ArbitraryParenthesesSpacingUnitTest.2.inc +++ /dev/null @@ -1,4 +0,0 @@ - - * @copyright 2006-2017 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ArbitraryParenthesesSpacing sniff. - * - * @covers \PHP_CodeSniffer\Standards\Generic\Sniffs\WhiteSpace\ArbitraryParenthesesSpacingSniff - */ -final class ArbitraryParenthesesSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'ArbitraryParenthesesSpacingUnitTest.1.inc': - return [ - 64 => 4, - 66 => 1, - 68 => 1, - 69 => 1, - 72 => 2, - 73 => 2, - 77 => 2, - 81 => 4, - 90 => 4, - 94 => 1, - 95 => 1, - 97 => 1, - 100 => 2, - 101 => 2, - 104 => 2, - 107 => 2, - 109 => 4, - 111 => 4, - 113 => 2, - 115 => 2, - 123 => 1, - 125 => 2, - 127 => 1, - 131 => 1, - 133 => 1, - 137 => 1, - 139 => 2, - 141 => 1, - 144 => 1, - 146 => 1, - 163 => 1, - 164 => 1, - 165 => 1, - ]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getWarningList($testFile='') - { - switch ($testFile) { - case 'ArbitraryParenthesesSpacingUnitTest.1.inc': - return [ - 55 => 1, - 56 => 1, - ]; - - default: - return []; - }//end switch - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowSpaceIndentUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowSpaceIndentUnitTest.1.inc deleted file mode 100644 index b19a58d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowSpaceIndentUnitTest.1.inc +++ /dev/null @@ -1,125 +0,0 @@ -"; - return "<$name$xmlns$type_str $atts xsi:nil=\"true\"/>"; -// [space][space][space][tab]return "<$name$xmlns$type_str $atts xsi:nil=\"true\"/>"; - return "<$name$xmlns$type_str $atts xsi:nil=\"true\"/>"; -// Doc comments are indent with tabs and one space -//[tab]/** -//[tab][space]* - /** - * CVS revision for HTTP headers. - * - * @var string - * @access private - */ - /** - * - */ - -$str = 'hello - there'; - -/** - * This PHP DocBlock should be fine, even though there is a single space at the beginning. - * - * @var int $x - */ -$x = 1; - -?> - - - Foo - - -
    -
    -
    -
    -
    -
    - - - -"; - return "<$name$xmlns$type_str $atts xsi:nil=\"true\"/>"; -// [space][space][space][tab]return "<$name$xmlns$type_str $atts xsi:nil=\"true\"/>"; - return "<$name$xmlns$type_str $atts xsi:nil=\"true\"/>"; -// Doc comments are indent with tabs and one space -//[tab]/** -//[tab][space]* - /** - * CVS revision for HTTP headers. - * - * @var string - * @access private - */ - /** - * - */ - -$str = 'hello - there'; - -/** - * This PHP DocBlock should be fine, even though there is a single space at the beginning. - * - * @var int $x - */ -$x = 1; - -?> - - - Foo - - -
    -
    -
    -
    -
    -
    - - - -"; - return "<$name$xmlns$type_str $atts xsi:nil=\"true\"/>"; -// [space][space][space][tab]return "<$name$xmlns$type_str $atts xsi:nil=\"true\"/>"; - return "<$name$xmlns$type_str $atts xsi:nil=\"true\"/>"; -// Doc comments are indent with tabs and one space -//[tab]/** -//[tab][space]* - /** - * CVS revision for HTTP headers. - * - * @var string - * @access private - */ - /** - * - */ - -$str = 'hello - there'; - -/** - * This PHP DocBlock should be fine, even though there is a single space at the beginning. - * - * @var int $x - */ -$x = 1; - -?> - - - Foo - - -
    -
    -
    -
    -
    -
    - - - -"; - return "<$name$xmlns$type_str $atts xsi:nil=\"true\"/>"; -// [space][space][space][tab]return "<$name$xmlns$type_str $atts xsi:nil=\"true\"/>"; - return "<$name$xmlns$type_str $atts xsi:nil=\"true\"/>"; -// Doc comments are indent with tabs and one space -//[tab]/** -//[tab][space]* - /** - * CVS revision for HTTP headers. - * - * @var string - * @access private - */ - /** - * - */ - -$str = 'hello - there'; - -/** - * This PHP DocBlock should be fine, even though there is a single space at the beginning. - * - * @var int $x - */ -$x = 1; - -?> - - - Foo - - -
    -
    -
    -
    -
    -
    - - - - - - - Foo - - -
    -
    -
    -
    -
    -
    - - - - - - - Foo - - -
    -
    -
    -
    -
    -
    - - - - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the DisallowSpaceIndent sniff. - * - * @covers \PHP_CodeSniffer\Standards\Generic\Sniffs\WhiteSpace\DisallowSpaceIndentSniff - */ -final class DisallowSpaceIndentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Get a list of CLI values to set before the file is tested. - * - * @param string $testFile The name of the file being tested. - * @param \PHP_CodeSniffer\Config $config The config data for the test run. - * - * @return void - */ - public function setCliValues($testFile, $config) - { - if ($testFile === 'DisallowSpaceIndentUnitTest.2.inc') { - return; - } - - $config->tabWidth = 4; - - }//end setCliValues() - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'DisallowSpaceIndentUnitTest.1.inc': - case 'DisallowSpaceIndentUnitTest.2.inc': - return [ - 5 => 1, - 9 => 1, - 15 => 1, - 22 => 1, - 24 => 1, - 30 => 1, - 35 => 1, - 50 => 1, - 55 => 1, - 57 => 1, - 58 => 1, - 59 => 1, - 60 => 1, - 65 => 1, - 66 => 1, - 67 => 1, - 68 => 1, - 69 => 1, - 70 => 1, - 73 => 1, - 77 => 1, - 81 => 1, - 104 => 1, - 105 => 1, - 106 => 1, - 107 => 1, - 108 => 1, - 110 => 1, - 111 => 1, - 112 => 1, - 114 => 1, - 115 => 1, - 117 => 1, - 118 => 1, - 123 => 1, - ]; - - case 'DisallowSpaceIndentUnitTest.3.inc': - return [ - 2 => 1, - 5 => 1, - 10 => 1, - 12 => 1, - 13 => 1, - 14 => 1, - 15 => 1, - ]; - - case 'DisallowSpaceIndentUnitTest.4.inc': - if (PHP_VERSION_ID >= 70300) { - return [ - 7 => 1, - 13 => 1, - ]; - } - - // PHP 7.2 or lower: PHP version which doesn't support flexible heredocs/nowdocs yet. - return []; - - case 'DisallowSpaceIndentUnitTest.js': - return [3 => 1]; - - case 'DisallowSpaceIndentUnitTest.css': - return [2 => 1]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowTabIndentUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowTabIndentUnitTest.1.inc deleted file mode 100644 index 74fa505..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/DisallowTabIndentUnitTest.1.inc +++ /dev/null @@ -1,102 +0,0 @@ - 'Czech republic', - 'România' => 'Romania', - 'Magyarország' => 'Hungary', -); - -$var = "$hello $there"; - -?> - - - Foo - - -
    -
    -
    -
    -
    -
    - - - - 'Czech republic', - 'România' => 'Romania', - 'Magyarország' => 'Hungary', -); - -$var = "$hello $there"; - -?> - - - Foo - - -
    -
    -
    -
    -
    -
    - - - - - - - Foo - - -
    -
    -
    -
    -
    -
    - - - - - - - Foo - - -
    -
    -
    -
    -
    -
    - - - - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the DisallowTabIndent sniff. - * - * @covers \PHP_CodeSniffer\Standards\Generic\Sniffs\WhiteSpace\DisallowTabIndentSniff - */ -final class DisallowTabIndentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Get a list of CLI values to set before the file is tested. - * - * @param string $testFile The name of the file being tested. - * @param \PHP_CodeSniffer\Config $config The config data for the test run. - * - * @return void - */ - public function setCliValues($testFile, $config) - { - $config->tabWidth = 4; - - }//end setCliValues() - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'DisallowTabIndentUnitTest.1.inc': - return [ - 5 => 2, - 9 => 1, - 15 => 1, - 20 => 2, - 21 => 1, - 22 => 2, - 23 => 1, - 24 => 2, - 31 => 1, - 32 => 2, - 33 => 2, - 41 => 1, - 42 => 1, - 43 => 1, - 44 => 1, - 45 => 1, - 46 => 1, - 47 => 1, - 48 => 1, - 54 => 1, - 55 => 1, - 56 => 1, - 57 => 1, - 58 => 1, - 59 => 1, - 79 => 1, - 80 => 1, - 81 => 1, - 82 => 1, - 83 => 1, - 85 => 1, - 86 => 1, - 87 => 1, - 89 => 1, - 90 => 1, - 92 => 1, - 93 => 1, - 97 => 1, - 100 => 1, - ]; - - case 'DisallowTabIndentUnitTest.2.inc': - return [ - 6 => 1, - 7 => 1, - 8 => 1, - 9 => 1, - 10 => 1, - 11 => 1, - 12 => 1, - 13 => 1, - 19 => 1, - ]; - - case 'DisallowTabIndentUnitTest.3.inc': - if (PHP_VERSION_ID >= 70300) { - return [ - 7 => 1, - 13 => 1, - ]; - } - - // PHP 7.2 or lower: PHP version which doesn't support flexible heredocs/nowdocs yet. - return []; - - case 'DisallowTabIndentUnitTest.js': - return [ - 3 => 1, - 5 => 1, - 6 => 1, - ]; - - case 'DisallowTabIndentUnitTest.css': - return [ - 1 => 1, - 2 => 1, - ]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/HereNowdocIdentifierSpacingUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/HereNowdocIdentifierSpacingUnitTest.inc deleted file mode 100644 index 0121118..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/HereNowdocIdentifierSpacingUnitTest.inc +++ /dev/null @@ -1,25 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the HereNowdocIdentifierSpacing sniff. - * - * @covers \PHP_CodeSniffer\Standards\Generic\Sniffs\WhiteSpace\HereNowdocIdentifierSpacingSniff - */ -final class HereNowdocIdentifierSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 11 => 1, - 15 => 1, - 19 => 1, - 23 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.inc deleted file mode 100644 index 535053b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.inc +++ /dev/null @@ -1,43 +0,0 @@ -prop++; -$obj->prop ++; -$obj?->prop ++; - -$obj->obj->prop++; -$obj->obj->prop ++; -$obj?->obj->prop ++; - -$obj->prop['key']++; -$obj->prop['key'] ++; - ---ClassName::$prop; --- ClassName::$prop; - -getObject()->count -++; -getObject()->count++; -++ getObject()->count; -++getObject()->count; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.inc.fixed deleted file mode 100644 index c30332b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.inc.fixed +++ /dev/null @@ -1,41 +0,0 @@ -prop++; -$obj->prop++; -$obj?->prop++; - -$obj->obj->prop++; -$obj->obj->prop++; -$obj?->obj->prop++; - -$obj->prop['key']++; -$obj->prop['key']++; - ---ClassName::$prop; ---ClassName::$prop; - -getObject()->count++; -getObject()->count++; -++getObject()->count; -++getObject()->count; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.js deleted file mode 100644 index b7b1c2f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.js +++ /dev/null @@ -1,17 +0,0 @@ -var i; - -i = 10; ---i; --- i; --- /*comment*/ i; -++i; -++ - i; -++/*comment*/i; - -i--; -i --; -i /*comment*/ --; -i++; -i ++; -i /*comment*/ ++; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.js.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.js.fixed deleted file mode 100644 index 5d8b33a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.js.fixed +++ /dev/null @@ -1,16 +0,0 @@ -var i; - -i = 10; ---i; ---i; --- /*comment*/ i; -++i; -++i; -++/*comment*/i; - -i--; -i--; -i /*comment*/ --; -i++; -i++; -i /*comment*/ ++; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.php deleted file mode 100644 index 1a703c9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.php +++ /dev/null @@ -1,86 +0,0 @@ - - * @copyright 2018 Juliette Reinders Folmer. All rights reserved. - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the IncrementDecrementSpacing sniff. - * - * @covers \PHP_CodeSniffer\Standards\Generic\Sniffs\WhiteSpace\IncrementDecrementSpacingSniff - */ -final class IncrementDecrementSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - $errors = [ - 5 => 1, - 6 => 1, - 8 => 1, - 10 => 1, - 13 => 1, - 14 => 1, - 16 => 1, - 17 => 1, - ]; - - switch ($testFile) { - case 'IncrementDecrementSpacingUnitTest.inc': - $errors[21] = 1; - $errors[23] = 1; - $errors[26] = 1; - $errors[27] = 1; - $errors[30] = 1; - $errors[31] = 1; - $errors[34] = 1; - $errors[37] = 1; - $errors[40] = 1; - $errors[42] = 1; - - return $errors; - - case 'IncrementDecrementSpacingUnitTest.js': - return $errors; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/LanguageConstructSpacingUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/LanguageConstructSpacingUnitTest.1.inc deleted file mode 100644 index 571c5e1..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/LanguageConstructSpacingUnitTest.1.inc +++ /dev/null @@ -1,107 +0,0 @@ - - * @copyright 2006-2017 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the LanguageConstructSpacing sniff. - * - * @covers \PHP_CodeSniffer\Standards\Generic\Sniffs\WhiteSpace\LanguageConstructSpacingSniff - */ -final class LanguageConstructSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'LanguageConstructSpacingUnitTest.1.inc': - return [ - 3 => 1, - 5 => 1, - 8 => 1, - 10 => 1, - 13 => 1, - 15 => 1, - 18 => 1, - 20 => 1, - 23 => 1, - 25 => 1, - 28 => 1, - 30 => 1, - 33 => 1, - 36 => 1, - 39 => 1, - 40 => 1, - 43 => 1, - 44 => 1, - 45 => 1, - 46 => 1, - 48 => 1, - 52 => 1, - 55 => 1, - 56 => 1, - 57 => 2, - 60 => 1, - 63 => 1, - 65 => 1, - 73 => 1, - 75 => 1, - 77 => 1, - 81 => 1, - 83 => 1, - 85 => 1, - 86 => 1, - 90 => 1, - 94 => 1, - 95 => 1, - 98 => 1, - 107 => 1, - ]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.1.inc deleted file mode 100644 index 74c5c07..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.1.inc +++ /dev/null @@ -1,1659 +0,0 @@ -phpcs:set Generic.WhiteSpace.ScopeIndent tabIndent false - -hello(); - } - - function hello() - { - echo 'hello'; -}//end hello() - - function hello2() - { - if (TRUE) { - echo 'hello'; // no error here as its more than 4 spaces. - } else { - echo 'bye'; - } - - while (TRUE) { - echo 'hello'; - } - - do { - echo 'hello'; - } while (TRUE); - } - - function hello3() - { - switch ($hello) { - case 'hello': - break; - } - } - -} - -?> -
    -
    -
    -validate()) {
    -    $safe = $form->getSubmitValues();
    -}
    -?>
    -
    -open(); // error here - } - - public function open() - { - // Some inline stuff that shouldn't error - if (TRUE) echo 'hello'; - foreach ($tokens as $token) echo $token; - } - - /** - * This is a comment 1. - * This is a comment 2. - * This is a comment 3. - * This is a comment 4. - */ - public function close() - { - // All ok. - if (TRUE) { - if (TRUE) { - } else if (FALSE) { - foreach ($tokens as $token) { - switch ($token) { - case '1': - case '2': - if (true) { - if (false) { - if (false) { - if (false) { - echo 'hello'; - } - } - } - } - break; - case '5': - break; - } - do { - while (true) { - foreach ($tokens as $token) { - for ($i = 0; $i < $token; $i++) { - echo 'hello'; - } - } - } - } while (true); - } - } - } - } - - /* - This is another c style comment 1. - This is another c style comment 2. - This is another c style comment 3. - This is another c style comment 4. - This is another c style comment 5. - */ - - /* This is a T_COMMENT - * - * - * - */ - - /** This is a T_DOC_COMMENT - */ - - /* - This T_COMMENT has a newline in it. - - */ - - public function read() - { - echo 'hello'; - - // no errors below. - $array = array( - 'this', - 'that' => array( - 'hello', - 'hello again' => array( - 'hello', - ), - ), - ); - } -} - -abstract class Test3 -{ - public function parse() - { - - foreach ($t as $ndx => $token) { - if (is_array($token)) { - echo 'here'; - } else { - $ts[] = array("token" => $token, "value" => ''); - - $last = count($ts) - 1; - - switch ($token) { - case '(': - - if ($last >= 3 && - $ts[0]['token'] != T_CLASS && - $ts[$last - 2]['token'] == T_OBJECT_OPERATOR && - $ts[$last - 3]['token'] == T_VARIABLE ) { - - - if (true) { - echo 'hello'; - } - } - array_push($braces, $token); - break; - } - } - } - } -} - -function test() -{ - $o = << - - - - doSomething( - function () { - echo 123; - } - ); - } -} - -some_function( - function() { - $a = 403; - if ($a === 404) { - $a = 403; - } - } -); - -some_function( - function() { - $a = 403; - if ($a === 404) { - $a = 403; - } - } -); - -$myFunction = function() { - $a = 403; - if ($a === 404) { - $a = 403; - } -}; - -class Whatever -{ - protected $_protectedArray = array( - 'normalString' => 'That email address is already in use!', - 'offendingString' => <<<'STRING' -Each line of this string is always said to be at column 0, - no matter how many spaces are placed - at the beginning of each line -and the ending STRING on the next line is reported as having to be indented. -STRING - ); -} - -class MyClass -{ - public static function myFunction() - { - if (empty($keywords) === FALSE) { - $keywords = 'foo'; - $existing = 'foo'; - } - - return $keywords; - - }//end myFunction() - -}//end class - -$var = call_user_func( - $new_var = function () use (&$a) { - if ($a > 0) { - return $a++; - } else { - return $a--; - } - } -); - -class AnonymousFn -{ - public function getAnonFn() - { - return array( - 'functions' => Array( - 'function1' => function ($a, $b, $c) { - $a = $b + $c; - $b = $c / 2; - return Array($a, $b, $c); - }, - ), - ); - } -} -?> - -
    - -
    -
    - -
    -
    - -
    - - "") { - $test = true; - } else { - $test = true; - } - } - ?> - - - -
    -
    -
    - -
    -
    -
    - - -

    some text

    - function ($a) { - if ($a === true) { - echo 'hi'; - } - } -]; - -$list = [ - 'fn' => function ($a) { - if ($a === true) { - echo 'hi'; - } - } -]; - -if ($foo) { - foreach ($bar as $baz) { - if ($baz) { - ?> -
    -
    -
    - 1) { - echo '1'; - } - ?> -
    - 1) { - echo '1'; - } - ?> -
    - 1) { - echo '1'; - } - ?> -
    - -<?= CHtml::encode($this->pageTitle); ?> - -expects($this->at(2)) - ->with($this->callback( - function ($subject) - { - } - ) - ); - -/** @var Database $mockedDatabase */ -/** @var Container $mockedContainer */ - -echo $string->append('foo') - ->appaend('bar') - ->appaend('baz') - ->outputUsing( - function () - { - } - ); - -echo PHP_EOL; - -switch ($arg) { - case 1: - break; - case 2: - if ($arg2 == 'foo') { - } - case 3: - default: - echo 'default'; -} - -if ($tokens[$stackPtr]['content']{0} === '#') { -} else if ($tokens[$stackPtr]['content']{0} === '/' - && $tokens[$stackPtr]['content']{1} === '/' -) { -} - -$var = call_user_func( - function() { - if ($foo) { - $new_var = function() { - if ($a > 0) { - return $a++; - } else { - return $a--; - } - }; - } - } -); - -a( - function() { - $a = function() { - $b = false; - }; - true; - } -); - -$var = [ - [ - '1' => - function () { - return true; - }, - ], - [ - '1' => - function () { - return true; - }, - '2' => true, - ] -]; - -if ($foo) { - ?> -

    - self::_replaceKeywords($failingComment, $result), - 'screenshot' => Test::getScreenshotPath( - $projectid, - $result['class_name'], - ), - ); - -} - -$this->mockedDatabase - ->with( - $this->callback( - function () { - return; - } - ) - ); - -$this->subject->recordLogin(); - -function a() -{ - if (true) { - static::$a[$b] = - static::where($c) - ->where($c) - ->where( - function ($d) { - $d->whereNull(); - $d->orWhere(); - } - ) - ->first(); - - if (static::$a[$b] === null) { - static::$a[$b] = new static( - array( - 'a' => $a->id, - 'a' => $a->id, - ) - ); - } - } - - return static::$a[$b]; -} - -$foo->load( - array( - 'bar' => function ($baz) { - $baz->call(); - } - ) -); - -hello(); - -$foo = array_unique( - array_map( - function ($entry) { - return $entry * 2; - }, - array() - ) -); -bar($foo); - -class PHP_CodeSniffer_Tokenizers_JS -{ - - public $scopeOpeners = array( - T_CASE => array( - 'end' => array( - T_BREAK => T_BREAK, - T_RETURN => T_RETURN, - ), - 'strict' => true, - ), - ); -} - -echo $string-> - append('foo')-> - appaend('bar')-> - appaend('baz')-> - outputUsing( - function () - { - } - ); - -$str = 'the items I want to show are: ' . - implode( - ', ', - array('a', 'b', 'c') - ); - -echo $str; - -$str = 'foo' - . '1' - . '2'; - -echo $str; - -bar([ - 'foo' => foo(function () { - return 'foo'; - }) -]); - -$domains = array_unique( - array_map( - function ($url) { - $urlObject = new \Purl\Url($url); - return $urlObject->registerableDomain; - }, - $sites - ) -); - -return $domains; - -if ($a == 5) : - echo "a equals 5"; - echo "..."; -elseif ($a == 6) : - echo "a equals 6"; - echo "!!!"; -else : - echo "a is neither 5 nor 6"; -endif; - -if ($foo): -if ($bar) $foo = 1; -elseif ($baz) $foo = 2; -endif; - -$this - ->method(array( - 'foo' => 'bar', - ), 'arg', array( - 'foo' => 'bar', - )); - -class Foo -{ - use Bar { - myMethod as renamedMethod; - } -} - -class Foo -{ - use Bar { - myMethod as renamedMethod; - } -} - -foo(); - -array( - 'key1' => function ($bar) { - return $bar; - }, - 'key2' => function ($foo) { - return $foo; - }, -); - -?> - - 1, - ]; -$c = 2; - -class foo -{ - public function get() - { - $foo = ['b' => 'c', - 'd' => [ - ['e' => 'f'] - ]]; - echo '42'; - - $foo = array('b' => 'c', - 'd' => array( - array('e' => 'f') - )); - echo '42'; - } -} - -switch ($foo) { - case 1: - return array(); - case 2: - return ''; - case 3: - return $function(); - case 4: - return $functionCall($param[0]); - case 5: - return array() + array(); // Array Merge - case 6: - // String connect - return $functionReturningString('') . $functionReturningString(array()); - case 7: - return functionCall( - $withMultiLineParam[0], - array(), - $functionReturningString( - $withMultiLineParam[1] - ) - ); - case 8: - return $param[0][0]; -} - -class Test { - - public - $foo - ,$bar - ,$baz = [ ] - ; - - public function wtfindent() { - } -} - -switch ($x) { - case 1: - return [1]; - default: - return [2]; -} - -switch ($foo) { - case self::FOO: - return $this->bar($gfoo, function ($id) { - return FOO::bar($id); - }, $values); - case self::BAR: - $values = $this->bar($foo, $values); - break; -} - -$var = array( - 'long description' => - array(0, 'something'), - 'another long description' => - array(1, "something else") -); - -$services = array( - 'service 1' => - Mockery::mock('class 1') - ->shouldReceive('setFilter')->once() - ->shouldReceive('getNbResults')->atLeast()->once() - ->shouldReceive('getSlice')->once()->andReturn(array()) - ->getMock(), - 'service 2' => - Mockery::mock('class 2') - ->shouldReceive('__invoke')->once() - ->getMock() -); - -class Foo -{ - public function setUp() - { - $this->foo = new class { - public $name = 'Some value'; - }; - } -} - -try { - foo(); -} catch (\Exception $e) { - $foo = function() { - return 'foo'; - }; - - if (true) { - } -} - -if ($foo) { - foo(); -} else if ($e) { - $foo = function() { - return 'foo'; - }; - - if (true) { - } -} else { - $foo = function() { - return 'foo'; - }; - - if (true) { - } -} - -switch ($parameter) { - case null: - return [ - 'foo' => in_array( - 'foo', - [] - ), - ]; - - default: - return []; -} - -class SomeClass -{ - public function someFunc() - { - a(function () { - echo "a"; - })->b(function () { - echo "b"; - }); - - if (true) { - echo "c"; - } - echo "d"; - } -} - -$params = self::validate_parameters(self::read_competency_framework_parameters(), - array( - 'id' => $id, - )); - -$framework = api::read_framework($params['id']); -self::validate_context($framework->get_context()); -$output = $PAGE->get_renderer('tool_lp'); - -class Test123 -{ - protected static - $prop1 = [ - 'testA' => 123, - ], - $prop2 = [ - 'testB' => 456, - ]; - - protected static - $prop3 = array( - 'testA' => 123, - ), - $prop4 = array( - 'testB' => 456, - ); - - protected static $prop5; -} - -$foo = foo( - function () { - $foo->debug( - $a, - $b - ); - - if ($a) { - $b = $a; - } - } -); - -if (somethingIsTrue()) { - ?> -
    - -
    - bar(foo(function () { - }), foo(function () { - })); - -echo 'foo'; - -class Test { - - public function a() { - ?>adebug( - $a, - $b - ); - - if ($a) { - $b = $a; - } - } -); - -function test() -{ - $array = []; - foreach ($array as $data) { - [ - 'key1' => $var1, - 'key2' => $var2, - ] = $data; - foreach ($var1 as $method) { - echo $method . $var2; - } - } -} - -switch ($a) { - case 0: - $a = function () { - }; - case 1: - break; -} - -class Test -{ - public function __construct() - { -if (false) { -echo 0; - } - } -} - -return [ - 'veryLongKeySoIWantToMakeALineBreak' - => 'veryLonValueSoIWantToMakeALineBreak', - - 'someOtherKey' => [ - 'someValue' - ], - - 'arrayWithArraysInThere' => [ - ['Value1', 'Value1'] - ], -]; - -switch ($sContext) { - case 'SOMETHING': - case 'CONSTANT': - do_something(); - break; - case 'GLOBAL': - case 'GLOBAL1': - do_something(); - // Fall through - default: - { - do_something(); - } -} - -array_map( - static function ( $item ) { - echo $item; - }, - $some_array -); - -/** - * Comment. - */ -$a(function () use ($app) { - echo 'hi'; -})(); - -$app->run(); - -function foo() -{ - $foo('some - long description', function () { - }); - - $foo('some - long - description', function () { - }); - - $foo( -'some long description', function () { - }); -} - -switch ( $a ) { -case 'a': - $b = 2; - /** - * A comment. - */ - apply_filter( 'something', $b ); - break; - -case 'aa': - $b = 2; - /* - * A comment. - */ - apply_filter( 'something', $b ); - break; - -case 'b': - $b = 3; -?> - - - - - -
    - -
    - -
    - -
    - - -
    - - - -
    - [ - ], - 'b' => <<<'FOO' -foo; -FOO - ], - $a, -]; - -$query = Model::query() - ->when($a, function () { - static $b = ''; - }); - -$result = array_map( - static fn(int $number) : int => $number + 1, - $numbers -); - -$a = $a === true ? [ - 'a' => 1, - ] : [ - 'a' => 100, -]; - -return [ - Url::make('View Song', fn($song) => $song->url()) - ->onlyOnDetail(), - - new Panel('Information', [ - Text::make('Title') - ]), -]; - -echo $string?->append('foo') - ?->outputUsing(); - -// phpcs:set Generic.WhiteSpace.ScopeIndent exact true -echo $string?->append('foo') - ?->outputUsing(); -// phpcs:set Generic.WhiteSpace.ScopeIndent exact false - -if (true) { - ?> null, - false => false, - 1, 2, 3 => true, - default => $value, -}; - -$value = match ($value) { - '' => null, -false => false, - 1, 2, 3 => true, - default => $value, -}; - -$value = match ( - $value - ) { - '' => null, - false - => false, - 1, - 2, - 3 => true, - default => -$value, -}; - -function toString(): string -{ - return sprintf( - '%s', - match ($type) { - 'foo' => 'bar', - }, - ); -} - -$list = [ - 'fn' => function ($a) { - if ($a === true) { - echo 'hi'; - } - }, - 'fn' => function ($a) { - if ($a === true) { - echo 'hi'; - $list2 = [ - 'fn' => function ($a) { - if ($a === true) { - echo 'hi'; - } - } - ]; - } - } -]; - -$foo = match ($type) { - 'a' => [ - 'aa' => 'DESC', - 'ab' => 'DESC', - ], - 'b' => [ - 'ba' => 'DESC', - 'bb' => 'DESC', - ], - default => [ - 'da' => 'DESC', - ], -}; - -$a = [ - 'a' => [ - 'a' => fn () => foo() - ], - 'a' => [ - 'a' => 'a', - ] -]; - -switch ($foo) { - case 'a': - $foo = match ($foo) { - 'bar' => 'custom_1', - default => 'a' - }; - return $foo; - case 'b': - return match ($foo) { - 'bar' => 'custom_1', - default => 'b' - }; - default: - return 'default'; -} - -foo(function ($foo) { - return [ - match ($foo) { - } - ]; -}); - -// Issue #110. -echo match (1) { - 0 => match (2) { - 2 => match (3) { - 3 => 3, - default => -1, - }, - }, - 1 => match (2) { - 1 => match (3) { - 3 => 3, - default => -1, - }, - 2 => match (3) { - 3 => 3, - default => -1, - }, - }, -}; - -// Issue #437. -match (true) { - default => [ - 'unrelated' => '', - 'example' => array_filter( - array_map( - function () { - return null; - }, - [] - ) - ) - ] -}; - -// Issue squizlabs/PHP_CodeSniffer#3808 -function test() { - yield - from [ 3, 4 ]; -} - -/* ADD NEW TESTS ABOVE THIS LINE AND MAKE SURE THAT THE 1 (space-based) AND 2 (tab-based) FILES ARE IN SYNC! */ -?> - - - - - - - <<<'INTRO' - lorem ipsum - INTRO, - 'em' => [ - [ - '', - ], - ], - 'abc' => [ - 'a' => 'wop wop', - 'b' => 'ola ola.', - ], -]; - -echo "" diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.1.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.1.inc.fixed deleted file mode 100644 index 414ea6f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.1.inc.fixed +++ /dev/null @@ -1,1659 +0,0 @@ -phpcs:set Generic.WhiteSpace.ScopeIndent tabIndent false - -hello(); - } - - function hello() - { - echo 'hello'; - }//end hello() - - function hello2() - { - if (TRUE) { - echo 'hello'; // no error here as its more than 4 spaces. - } else { - echo 'bye'; - } - - while (TRUE) { - echo 'hello'; - } - - do { - echo 'hello'; - } while (TRUE); - } - - function hello3() - { - switch ($hello) { - case 'hello': - break; - } - } - -} - -?> -
    -
    -
    -validate()) {
    -    $safe = $form->getSubmitValues();
    -}
    -?>
    -
    -open(); // error here - } - - public function open() - { - // Some inline stuff that shouldn't error - if (TRUE) echo 'hello'; - foreach ($tokens as $token) echo $token; - } - - /** - * This is a comment 1. - * This is a comment 2. - * This is a comment 3. - * This is a comment 4. - */ - public function close() - { - // All ok. - if (TRUE) { - if (TRUE) { - } else if (FALSE) { - foreach ($tokens as $token) { - switch ($token) { - case '1': - case '2': - if (true) { - if (false) { - if (false) { - if (false) { - echo 'hello'; - } - } - } - } - break; - case '5': - break; - } - do { - while (true) { - foreach ($tokens as $token) { - for ($i = 0; $i < $token; $i++) { - echo 'hello'; - } - } - } - } while (true); - } - } - } - } - - /* - This is another c style comment 1. - This is another c style comment 2. - This is another c style comment 3. - This is another c style comment 4. - This is another c style comment 5. - */ - - /* This is a T_COMMENT - * - * - * - */ - - /** This is a T_DOC_COMMENT - */ - - /* - This T_COMMENT has a newline in it. - - */ - - public function read() - { - echo 'hello'; - - // no errors below. - $array = array( - 'this', - 'that' => array( - 'hello', - 'hello again' => array( - 'hello', - ), - ), - ); - } -} - -abstract class Test3 -{ - public function parse() - { - - foreach ($t as $ndx => $token) { - if (is_array($token)) { - echo 'here'; - } else { - $ts[] = array("token" => $token, "value" => ''); - - $last = count($ts) - 1; - - switch ($token) { - case '(': - - if ($last >= 3 && - $ts[0]['token'] != T_CLASS && - $ts[$last - 2]['token'] == T_OBJECT_OPERATOR && - $ts[$last - 3]['token'] == T_VARIABLE ) { - - - if (true) { - echo 'hello'; - } - } - array_push($braces, $token); - break; - } - } - } - } -} - -function test() -{ - $o = << - - - - doSomething( - function () { - echo 123; - } - ); - } -} - -some_function( - function() { - $a = 403; - if ($a === 404) { - $a = 403; - } - } -); - -some_function( - function() { - $a = 403; - if ($a === 404) { - $a = 403; - } - } -); - -$myFunction = function() { - $a = 403; - if ($a === 404) { - $a = 403; - } -}; - -class Whatever -{ - protected $_protectedArray = array( - 'normalString' => 'That email address is already in use!', - 'offendingString' => <<<'STRING' -Each line of this string is always said to be at column 0, - no matter how many spaces are placed - at the beginning of each line -and the ending STRING on the next line is reported as having to be indented. -STRING - ); -} - -class MyClass -{ - public static function myFunction() - { - if (empty($keywords) === FALSE) { - $keywords = 'foo'; - $existing = 'foo'; - } - - return $keywords; - - }//end myFunction() - -}//end class - -$var = call_user_func( - $new_var = function () use (&$a) { - if ($a > 0) { - return $a++; - } else { - return $a--; - } - } -); - -class AnonymousFn -{ - public function getAnonFn() - { - return array( - 'functions' => Array( - 'function1' => function ($a, $b, $c) { - $a = $b + $c; - $b = $c / 2; - return Array($a, $b, $c); - }, - ), - ); - } -} -?> - -
    - -
    -
    - -
    -
    - -
    - - "") { - $test = true; - } else { - $test = true; - } - } - ?> - - - -
    -
    -
    - -
    -
    -
    - - -

    some text

    - function ($a) { - if ($a === true) { - echo 'hi'; - } - } -]; - -$list = [ - 'fn' => function ($a) { - if ($a === true) { - echo 'hi'; - } - } -]; - -if ($foo) { - foreach ($bar as $baz) { - if ($baz) { - ?> -
    -
    -
    - 1) { - echo '1'; - } - ?> -
    - 1) { - echo '1'; - } - ?> -
    - 1) { - echo '1'; - } - ?> -
    - -<?= CHtml::encode($this->pageTitle); ?> - -expects($this->at(2)) - ->with($this->callback( - function ($subject) - { - } - ) - ); - -/** @var Database $mockedDatabase */ -/** @var Container $mockedContainer */ - -echo $string->append('foo') - ->appaend('bar') - ->appaend('baz') - ->outputUsing( - function () - { - } - ); - -echo PHP_EOL; - -switch ($arg) { - case 1: - break; - case 2: - if ($arg2 == 'foo') { - } - case 3: - default: - echo 'default'; -} - -if ($tokens[$stackPtr]['content']{0} === '#') { -} else if ($tokens[$stackPtr]['content']{0} === '/' - && $tokens[$stackPtr]['content']{1} === '/' -) { -} - -$var = call_user_func( - function() { - if ($foo) { - $new_var = function() { - if ($a > 0) { - return $a++; - } else { - return $a--; - } - }; - } - } -); - -a( - function() { - $a = function() { - $b = false; - }; - true; - } -); - -$var = [ - [ - '1' => - function () { - return true; - }, - ], - [ - '1' => - function () { - return true; - }, - '2' => true, - ] -]; - -if ($foo) { - ?> -

    - self::_replaceKeywords($failingComment, $result), - 'screenshot' => Test::getScreenshotPath( - $projectid, - $result['class_name'], - ), - ); - -} - -$this->mockedDatabase - ->with( - $this->callback( - function () { - return; - } - ) - ); - -$this->subject->recordLogin(); - -function a() -{ - if (true) { - static::$a[$b] = - static::where($c) - ->where($c) - ->where( - function ($d) { - $d->whereNull(); - $d->orWhere(); - } - ) - ->first(); - - if (static::$a[$b] === null) { - static::$a[$b] = new static( - array( - 'a' => $a->id, - 'a' => $a->id, - ) - ); - } - } - - return static::$a[$b]; -} - -$foo->load( - array( - 'bar' => function ($baz) { - $baz->call(); - } - ) -); - -hello(); - -$foo = array_unique( - array_map( - function ($entry) { - return $entry * 2; - }, - array() - ) -); -bar($foo); - -class PHP_CodeSniffer_Tokenizers_JS -{ - - public $scopeOpeners = array( - T_CASE => array( - 'end' => array( - T_BREAK => T_BREAK, - T_RETURN => T_RETURN, - ), - 'strict' => true, - ), - ); -} - -echo $string-> - append('foo')-> - appaend('bar')-> - appaend('baz')-> - outputUsing( - function () - { - } - ); - -$str = 'the items I want to show are: ' . - implode( - ', ', - array('a', 'b', 'c') - ); - -echo $str; - -$str = 'foo' - . '1' - . '2'; - -echo $str; - -bar([ - 'foo' => foo(function () { - return 'foo'; - }) -]); - -$domains = array_unique( - array_map( - function ($url) { - $urlObject = new \Purl\Url($url); - return $urlObject->registerableDomain; - }, - $sites - ) -); - -return $domains; - -if ($a == 5) : - echo "a equals 5"; - echo "..."; -elseif ($a == 6) : - echo "a equals 6"; - echo "!!!"; -else : - echo "a is neither 5 nor 6"; -endif; - -if ($foo): - if ($bar) $foo = 1; - elseif ($baz) $foo = 2; -endif; - -$this - ->method(array( - 'foo' => 'bar', - ), 'arg', array( - 'foo' => 'bar', - )); - -class Foo -{ - use Bar { - myMethod as renamedMethod; - } -} - -class Foo -{ - use Bar { - myMethod as renamedMethod; - } -} - -foo(); - -array( - 'key1' => function ($bar) { - return $bar; - }, - 'key2' => function ($foo) { - return $foo; - }, -); - -?> - - 1, - ]; -$c = 2; - -class foo -{ - public function get() - { - $foo = ['b' => 'c', - 'd' => [ - ['e' => 'f'] - ]]; - echo '42'; - - $foo = array('b' => 'c', - 'd' => array( - array('e' => 'f') - )); - echo '42'; - } -} - -switch ($foo) { - case 1: - return array(); - case 2: - return ''; - case 3: - return $function(); - case 4: - return $functionCall($param[0]); - case 5: - return array() + array(); // Array Merge - case 6: - // String connect - return $functionReturningString('') . $functionReturningString(array()); - case 7: - return functionCall( - $withMultiLineParam[0], - array(), - $functionReturningString( - $withMultiLineParam[1] - ) - ); - case 8: - return $param[0][0]; -} - -class Test { - - public - $foo - ,$bar - ,$baz = [ ] - ; - - public function wtfindent() { - } -} - -switch ($x) { - case 1: - return [1]; - default: - return [2]; -} - -switch ($foo) { - case self::FOO: - return $this->bar($gfoo, function ($id) { - return FOO::bar($id); - }, $values); - case self::BAR: - $values = $this->bar($foo, $values); - break; -} - -$var = array( - 'long description' => - array(0, 'something'), - 'another long description' => - array(1, "something else") -); - -$services = array( - 'service 1' => - Mockery::mock('class 1') - ->shouldReceive('setFilter')->once() - ->shouldReceive('getNbResults')->atLeast()->once() - ->shouldReceive('getSlice')->once()->andReturn(array()) - ->getMock(), - 'service 2' => - Mockery::mock('class 2') - ->shouldReceive('__invoke')->once() - ->getMock() -); - -class Foo -{ - public function setUp() - { - $this->foo = new class { - public $name = 'Some value'; - }; - } -} - -try { - foo(); -} catch (\Exception $e) { - $foo = function() { - return 'foo'; - }; - - if (true) { - } -} - -if ($foo) { - foo(); -} else if ($e) { - $foo = function() { - return 'foo'; - }; - - if (true) { - } -} else { - $foo = function() { - return 'foo'; - }; - - if (true) { - } -} - -switch ($parameter) { - case null: - return [ - 'foo' => in_array( - 'foo', - [] - ), - ]; - - default: - return []; -} - -class SomeClass -{ - public function someFunc() - { - a(function () { - echo "a"; - })->b(function () { - echo "b"; - }); - - if (true) { - echo "c"; - } - echo "d"; - } -} - -$params = self::validate_parameters(self::read_competency_framework_parameters(), - array( - 'id' => $id, - )); - -$framework = api::read_framework($params['id']); -self::validate_context($framework->get_context()); -$output = $PAGE->get_renderer('tool_lp'); - -class Test123 -{ - protected static - $prop1 = [ - 'testA' => 123, - ], - $prop2 = [ - 'testB' => 456, - ]; - - protected static - $prop3 = array( - 'testA' => 123, - ), - $prop4 = array( - 'testB' => 456, - ); - - protected static $prop5; -} - -$foo = foo( - function () { - $foo->debug( - $a, - $b - ); - - if ($a) { - $b = $a; - } - } -); - -if (somethingIsTrue()) { - ?> -
    - -
    - bar(foo(function () { - }), foo(function () { - })); - -echo 'foo'; - -class Test { - - public function a() { - ?>adebug( - $a, - $b - ); - - if ($a) { - $b = $a; - } - } -); - -function test() -{ - $array = []; - foreach ($array as $data) { - [ - 'key1' => $var1, - 'key2' => $var2, - ] = $data; - foreach ($var1 as $method) { - echo $method . $var2; - } - } -} - -switch ($a) { - case 0: - $a = function () { - }; - case 1: - break; -} - -class Test -{ - public function __construct() - { - if (false) { - echo 0; - } - } -} - -return [ - 'veryLongKeySoIWantToMakeALineBreak' - => 'veryLonValueSoIWantToMakeALineBreak', - - 'someOtherKey' => [ - 'someValue' - ], - - 'arrayWithArraysInThere' => [ - ['Value1', 'Value1'] - ], -]; - -switch ($sContext) { - case 'SOMETHING': - case 'CONSTANT': - do_something(); - break; - case 'GLOBAL': - case 'GLOBAL1': - do_something(); - // Fall through - default: - { - do_something(); - } -} - -array_map( - static function ( $item ) { - echo $item; - }, - $some_array -); - -/** - * Comment. - */ -$a(function () use ($app) { - echo 'hi'; -})(); - -$app->run(); - -function foo() -{ - $foo('some - long description', function () { - }); - - $foo('some - long - description', function () { - }); - - $foo( - 'some long description', function () { - }); -} - -switch ( $a ) { - case 'a': - $b = 2; - /** - * A comment. - */ - apply_filter( 'something', $b ); - break; - - case 'aa': - $b = 2; - /* - * A comment. - */ - apply_filter( 'something', $b ); - break; - - case 'b': - $b = 3; - ?> - - - - - -
    - -
    - -
    - -
    - - -
    - - - -
    - [ - ], - 'b' => <<<'FOO' -foo; -FOO - ], - $a, -]; - -$query = Model::query() - ->when($a, function () { - static $b = ''; - }); - -$result = array_map( - static fn(int $number) : int => $number + 1, - $numbers -); - -$a = $a === true ? [ - 'a' => 1, - ] : [ - 'a' => 100, -]; - -return [ - Url::make('View Song', fn($song) => $song->url()) - ->onlyOnDetail(), - - new Panel('Information', [ - Text::make('Title') - ]), -]; - -echo $string?->append('foo') - ?->outputUsing(); - -// phpcs:set Generic.WhiteSpace.ScopeIndent exact true -echo $string?->append('foo') - ?->outputUsing(); -// phpcs:set Generic.WhiteSpace.ScopeIndent exact false - -if (true) { - ?> null, - false => false, - 1, 2, 3 => true, - default => $value, -}; - -$value = match ($value) { - '' => null, - false => false, - 1, 2, 3 => true, - default => $value, -}; - -$value = match ( - $value - ) { - '' => null, - false - => false, - 1, - 2, - 3 => true, - default => - $value, -}; - -function toString(): string -{ - return sprintf( - '%s', - match ($type) { - 'foo' => 'bar', - }, - ); -} - -$list = [ - 'fn' => function ($a) { - if ($a === true) { - echo 'hi'; - } - }, - 'fn' => function ($a) { - if ($a === true) { - echo 'hi'; - $list2 = [ - 'fn' => function ($a) { - if ($a === true) { - echo 'hi'; - } - } - ]; - } - } -]; - -$foo = match ($type) { - 'a' => [ - 'aa' => 'DESC', - 'ab' => 'DESC', - ], - 'b' => [ - 'ba' => 'DESC', - 'bb' => 'DESC', - ], - default => [ - 'da' => 'DESC', - ], -}; - -$a = [ - 'a' => [ - 'a' => fn () => foo() - ], - 'a' => [ - 'a' => 'a', - ] -]; - -switch ($foo) { - case 'a': - $foo = match ($foo) { - 'bar' => 'custom_1', - default => 'a' - }; - return $foo; - case 'b': - return match ($foo) { - 'bar' => 'custom_1', - default => 'b' - }; - default: - return 'default'; -} - -foo(function ($foo) { - return [ - match ($foo) { - } - ]; -}); - -// Issue #110. -echo match (1) { - 0 => match (2) { - 2 => match (3) { - 3 => 3, - default => -1, - }, - }, - 1 => match (2) { - 1 => match (3) { - 3 => 3, - default => -1, - }, - 2 => match (3) { - 3 => 3, - default => -1, - }, - }, -}; - -// Issue #437. -match (true) { - default => [ - 'unrelated' => '', - 'example' => array_filter( - array_map( - function () { - return null; - }, - [] - ) - ) - ] -}; - -// Issue squizlabs/PHP_CodeSniffer#3808 -function test() { - yield - from [ 3, 4 ]; -} - -/* ADD NEW TESTS ABOVE THIS LINE AND MAKE SURE THAT THE 1 (space-based) AND 2 (tab-based) FILES ARE IN SYNC! */ -?> - - - - - - - <<<'INTRO' - lorem ipsum - INTRO, - 'em' => [ - [ - '', - ], - ], - 'abc' => [ - 'a' => 'wop wop', - 'b' => 'ola ola.', - ], -]; - -echo "" diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.1.js b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.1.js deleted file mode 100644 index 2195bfb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.1.js +++ /dev/null @@ -1,239 +0,0 @@ -phpcs:set Generic.WhiteSpace.ScopeIndent tabIndent false -var script = document.createElement('script'); -script.onload = function() -{ - clearTimeout(t); - script456.onload = null; - script.onreadystatechange = null; - callback.call(this); - -}; - -this.callbacks[type] = { - namespaces: {}, -others: [] -}; - -blah = function() -{ - print something; - - } - -test(blah, function() { - print something; -}); - -var test = [{x: 10}]; -var test = [{ - x: 10, - y: { - b14h: 12, - 'b14h': 12 - }, - z: 23 -}]; - -Viper.prototype = { - - _removeEvents: function(elem) - { - if (!elem) { - elem = this.element; - } - - ViperUtil.removeEvent(elem, '.' + this.getEventNamespace()); - - } - -}; - -this.init = function(data) { - if (_pageListWdgt) { - GUI.getWidget('changedPagesList').addItemClickedCallback( - function(itemid, target) { - draftChangeTypeClicked( - itemid, - target, - { - reviewData: _reviewData, - pageid: itemid - } - ); - } - ); - }//end if - -}; - -a( - function() { - var _a = function() { - b = false; - - }; - true - } -); - -(function() { - a = function() { - a(function() { - if (true) { - a = true; - } - }); - - a( - function() { - if (true) { - if (true) { - a = true; - } - } - } - ); - - a( - function() { - if (true) { - a = true; - } - } - ); - - }; - -})(); - -a.prototype = { - - a: function() - { - var currentSize = null; - ViperUtil.addEvent( - header, - 'safedblclick', - function() {}, - ); - - if (topContent) { - ViperUtil.addClass(topContent, 'Viper-popup-top'); - main.appendChild(topContent); - } - - ViperUtil.addClass(midContent, 'Viper-popup-content'); - main.appendChild(midContent); - } - -}; - -a.prototype = { - - a: function() - { - ViperUtil.addClass(midContent, 'Viper-popup-content'); - main.appendChild(midContent); - - var mouseUpAction = function() {}; - var preventMouseUp = false; - var self = this; - if (clickAction) { - } - } - -}; - -a.prototype = { - - a: function() - { - var a = function() { - var a = 'foo'; - }; - - if (true) { - } - - }, - - b: function() - { - ViperUtil.addEvent( - function() { - if (fullScreen !== true) { - currentSize = { - }; - - showfullScreen(); - } - } - ); - - }, - - c: function() - { - this.a( - { - a: function() { - form.onsubmit = function() { - return false; - }; - - var a = true; - } - } - ); - - } - -}; - -a.prototype = { - init: function() - {}, - - _b: function() - { - } - -}; - -for (var i = 0; i < 10; i++) { - var foo = {foo:{'a':'b', - 'c':'d'}}; -} - -class TestOk -{ - destroy() - { - setTimeout(a, 1000); - - if (typeof self.callbackOnClose === "function") { - self.callbackOnClose(); - } - } -} - -class TestBad -{ - destroy() - { - setTimeout(function () { - return; - }, 1000); - - if (typeof self.callbackOnClose === "function") { - self.callbackOnClose(); - } - } -} - -( function( $ ) { - foo(function( value ) { - value.bind( function( newval ) { - $( '#bar' ).html( newval ); - } ); - } )( jQuery ); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.1.js.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.1.js.fixed deleted file mode 100644 index d4bf409..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.1.js.fixed +++ /dev/null @@ -1,239 +0,0 @@ -phpcs:set Generic.WhiteSpace.ScopeIndent tabIndent false -var script = document.createElement('script'); -script.onload = function() -{ - clearTimeout(t); - script456.onload = null; - script.onreadystatechange = null; - callback.call(this); - -}; - -this.callbacks[type] = { - namespaces: {}, - others: [] -}; - -blah = function() -{ - print something; - -} - -test(blah, function() { - print something; -}); - -var test = [{x: 10}]; -var test = [{ - x: 10, - y: { - b14h: 12, - 'b14h': 12 - }, - z: 23 -}]; - -Viper.prototype = { - - _removeEvents: function(elem) - { - if (!elem) { - elem = this.element; - } - - ViperUtil.removeEvent(elem, '.' + this.getEventNamespace()); - - } - -}; - -this.init = function(data) { - if (_pageListWdgt) { - GUI.getWidget('changedPagesList').addItemClickedCallback( - function(itemid, target) { - draftChangeTypeClicked( - itemid, - target, - { - reviewData: _reviewData, - pageid: itemid - } - ); - } - ); - }//end if - -}; - -a( - function() { - var _a = function() { - b = false; - - }; - true - } -); - -(function() { - a = function() { - a(function() { - if (true) { - a = true; - } - }); - - a( - function() { - if (true) { - if (true) { - a = true; - } - } - } - ); - - a( - function() { - if (true) { - a = true; - } - } - ); - - }; - -})(); - -a.prototype = { - - a: function() - { - var currentSize = null; - ViperUtil.addEvent( - header, - 'safedblclick', - function() {}, - ); - - if (topContent) { - ViperUtil.addClass(topContent, 'Viper-popup-top'); - main.appendChild(topContent); - } - - ViperUtil.addClass(midContent, 'Viper-popup-content'); - main.appendChild(midContent); - } - -}; - -a.prototype = { - - a: function() - { - ViperUtil.addClass(midContent, 'Viper-popup-content'); - main.appendChild(midContent); - - var mouseUpAction = function() {}; - var preventMouseUp = false; - var self = this; - if (clickAction) { - } - } - -}; - -a.prototype = { - - a: function() - { - var a = function() { - var a = 'foo'; - }; - - if (true) { - } - - }, - - b: function() - { - ViperUtil.addEvent( - function() { - if (fullScreen !== true) { - currentSize = { - }; - - showfullScreen(); - } - } - ); - - }, - - c: function() - { - this.a( - { - a: function() { - form.onsubmit = function() { - return false; - }; - - var a = true; - } - } - ); - - } - -}; - -a.prototype = { - init: function() - {}, - - _b: function() - { - } - -}; - -for (var i = 0; i < 10; i++) { - var foo = {foo:{'a':'b', - 'c':'d'}}; -} - -class TestOk -{ - destroy() - { - setTimeout(a, 1000); - - if (typeof self.callbackOnClose === "function") { - self.callbackOnClose(); - } - } -} - -class TestBad -{ - destroy() - { - setTimeout(function () { - return; - }, 1000); - - if (typeof self.callbackOnClose === "function") { - self.callbackOnClose(); - } - } -} - -( function( $ ) { - foo(function( value ) { - value.bind( function( newval ) { - $( '#bar' ).html( newval ); - } ); - } )( jQuery ); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.2.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.2.inc deleted file mode 100644 index c30e5b8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.2.inc +++ /dev/null @@ -1,1659 +0,0 @@ -phpcs:set Generic.WhiteSpace.ScopeIndent tabIndent true - -hello(); - } - - function hello() - { - echo 'hello'; -}//end hello() - - function hello2() - { - if (TRUE) { - echo 'hello'; // no error here as its more than 4 spaces. - } else { - echo 'bye'; - } - - while (TRUE) { - echo 'hello'; - } - - do { - echo 'hello'; - } while (TRUE); - } - - function hello3() - { - switch ($hello) { - case 'hello': - break; - } - } - -} - -?> -
    -
    -
    -validate()) {
    -	$safe = $form->getSubmitValues();
    -}
    -?>
    -
    -open(); // error here - } - - public function open() - { - // Some inline stuff that shouldn't error - if (TRUE) echo 'hello'; - foreach ($tokens as $token) echo $token; - } - - /** - * This is a comment 1. - * This is a comment 2. - * This is a comment 3. - * This is a comment 4. - */ - public function close() - { - // All ok. - if (TRUE) { - if (TRUE) { - } else if (FALSE) { - foreach ($tokens as $token) { - switch ($token) { - case '1': - case '2': - if (true) { - if (false) { - if (false) { - if (false) { - echo 'hello'; - } - } - } - } - break; - case '5': - break; - } - do { - while (true) { - foreach ($tokens as $token) { - for ($i = 0; $i < $token; $i++) { - echo 'hello'; - } - } - } - } while (true); - } - } - } - } - - /* - This is another c style comment 1. - This is another c style comment 2. - This is another c style comment 3. - This is another c style comment 4. - This is another c style comment 5. - */ - - /* This is a T_COMMENT - * - * - * - */ - - /** This is a T_DOC_COMMENT - */ - - /* - This T_COMMENT has a newline in it. - - */ - - public function read() - { - echo 'hello'; - - // no errors below. - $array = array( - 'this', - 'that' => array( - 'hello', - 'hello again' => array( - 'hello', - ), - ), - ); - } -} - -abstract class Test3 -{ - public function parse() - { - - foreach ($t as $ndx => $token) { - if (is_array($token)) { - echo 'here'; - } else { - $ts[] = array("token" => $token, "value" => ''); - - $last = count($ts) - 1; - - switch ($token) { - case '(': - - if ($last >= 3 && - $ts[0]['token'] != T_CLASS && - $ts[$last - 2]['token'] == T_OBJECT_OPERATOR && - $ts[$last - 3]['token'] == T_VARIABLE ) { - - - if (true) { - echo 'hello'; - } - } - array_push($braces, $token); - break; - } - } - } - } -} - -function test() -{ - $o = << - - - - doSomething( - function () { - echo 123; - } - ); - } -} - -some_function( - function() { - $a = 403; - if ($a === 404) { - $a = 403; - } - } -); - -some_function( - function() { - $a = 403; - if ($a === 404) { - $a = 403; - } - } -); - -$myFunction = function() { - $a = 403; - if ($a === 404) { - $a = 403; - } -}; - -class Whatever -{ - protected $_protectedArray = array( - 'normalString' => 'That email address is already in use!', - 'offendingString' => <<<'STRING' -Each line of this string is always said to be at column 0, - no matter how many spaces are placed - at the beginning of each line -and the ending STRING on the next line is reported as having to be indented. -STRING - ); -} - -class MyClass -{ - public static function myFunction() - { - if (empty($keywords) === FALSE) { - $keywords = 'foo'; - $existing = 'foo'; - } - - return $keywords; - - }//end myFunction() - -}//end class - -$var = call_user_func( - $new_var = function () use (&$a) { - if ($a > 0) { - return $a++; - } else { - return $a--; - } - } -); - -class AnonymousFn -{ - public function getAnonFn() - { - return array( - 'functions' => Array( - 'function1' => function ($a, $b, $c) { - $a = $b + $c; - $b = $c / 2; - return Array($a, $b, $c); - }, - ), - ); - } -} -?> - -
    - -
    -
    - -
    -
    - -
    - - "") { - $test = true; - } else { - $test = true; - } - } - ?> - - - -
    -
    -
    - -
    -
    -
    - - -

    some text

    - function ($a) { - if ($a === true) { - echo 'hi'; - } - } -]; - -$list = [ - 'fn' => function ($a) { - if ($a === true) { - echo 'hi'; - } - } -]; - -if ($foo) { - foreach ($bar as $baz) { - if ($baz) { - ?> -
    -
    -
    - 1) { - echo '1'; - } - ?> -
    - 1) { - echo '1'; - } - ?> -
    - 1) { - echo '1'; - } - ?> -
    - -<?= CHtml::encode($this->pageTitle); ?> - -expects($this->at(2)) - ->with($this->callback( - function ($subject) - { - } - ) - ); - -/** @var Database $mockedDatabase */ -/** @var Container $mockedContainer */ - -echo $string->append('foo') - ->appaend('bar') - ->appaend('baz') - ->outputUsing( - function () - { - } - ); - -echo PHP_EOL; - -switch ($arg) { - case 1: - break; - case 2: - if ($arg2 == 'foo') { - } - case 3: - default: - echo 'default'; -} - -if ($tokens[$stackPtr]['content']{0} === '#') { -} else if ($tokens[$stackPtr]['content']{0} === '/' - && $tokens[$stackPtr]['content']{1} === '/' -) { -} - -$var = call_user_func( - function() { - if ($foo) { - $new_var = function() { - if ($a > 0) { - return $a++; - } else { - return $a--; - } - }; - } - } -); - -a( - function() { - $a = function() { - $b = false; - }; - true; - } -); - -$var = [ - [ - '1' => - function () { - return true; - }, - ], - [ - '1' => - function () { - return true; - }, - '2' => true, - ] -]; - -if ($foo) { - ?> -

    - self::_replaceKeywords($failingComment, $result), - 'screenshot' => Test::getScreenshotPath( - $projectid, - $result['class_name'], - ), - ); - -} - -$this->mockedDatabase - ->with( - $this->callback( - function () { - return; - } - ) - ); - -$this->subject->recordLogin(); - -function a() -{ - if (true) { - static::$a[$b] = - static::where($c) - ->where($c) - ->where( - function ($d) { - $d->whereNull(); - $d->orWhere(); - } - ) - ->first(); - - if (static::$a[$b] === null) { - static::$a[$b] = new static( - array( - 'a' => $a->id, - 'a' => $a->id, - ) - ); - } - } - - return static::$a[$b]; -} - -$foo->load( - array( - 'bar' => function ($baz) { - $baz->call(); - } - ) -); - -hello(); - -$foo = array_unique( - array_map( - function ($entry) { - return $entry * 2; - }, - array() - ) -); -bar($foo); - -class PHP_CodeSniffer_Tokenizers_JS -{ - - public $scopeOpeners = array( - T_CASE => array( - 'end' => array( - T_BREAK => T_BREAK, - T_RETURN => T_RETURN, - ), - 'strict' => true, - ), - ); -} - -echo $string-> - append('foo')-> - appaend('bar')-> - appaend('baz')-> - outputUsing( - function () - { - } - ); - -$str = 'the items I want to show are: ' . - implode( - ', ', - array('a', 'b', 'c') - ); - -echo $str; - -$str = 'foo' - . '1' - . '2'; - -echo $str; - -bar([ - 'foo' => foo(function () { - return 'foo'; - }) -]); - -$domains = array_unique( - array_map( - function ($url) { - $urlObject = new \Purl\Url($url); - return $urlObject->registerableDomain; - }, - $sites - ) -); - -return $domains; - -if ($a == 5) : - echo "a equals 5"; - echo "..."; -elseif ($a == 6) : - echo "a equals 6"; - echo "!!!"; -else : - echo "a is neither 5 nor 6"; -endif; - -if ($foo): -if ($bar) $foo = 1; -elseif ($baz) $foo = 2; -endif; - -$this - ->method(array( - 'foo' => 'bar', - ), 'arg', array( - 'foo' => 'bar', - )); - -class Foo -{ - use Bar { - myMethod as renamedMethod; - } -} - -class Foo -{ - use Bar { - myMethod as renamedMethod; - } -} - -foo(); - -array( - 'key1' => function ($bar) { - return $bar; - }, - 'key2' => function ($foo) { - return $foo; - }, -); - -?> - - 1, - ]; -$c = 2; - -class foo -{ - public function get() - { - $foo = ['b' => 'c', - 'd' => [ - ['e' => 'f'] - ]]; - echo '42'; - - $foo = array('b' => 'c', - 'd' => array( - array('e' => 'f') - )); - echo '42'; - } -} - -switch ($foo) { - case 1: - return array(); - case 2: - return ''; - case 3: - return $function(); - case 4: - return $functionCall($param[0]); - case 5: - return array() + array(); // Array Merge - case 6: - // String connect - return $functionReturningString('') . $functionReturningString(array()); - case 7: - return functionCall( - $withMultiLineParam[0], - array(), - $functionReturningString( - $withMultiLineParam[1] - ) - ); - case 8: - return $param[0][0]; -} - -class Test { - - public - $foo - ,$bar - ,$baz = [ ] - ; - - public function wtfindent() { - } -} - -switch ($x) { - case 1: - return [1]; - default: - return [2]; -} - -switch ($foo) { - case self::FOO: - return $this->bar($gfoo, function ($id) { - return FOO::bar($id); - }, $values); - case self::BAR: - $values = $this->bar($foo, $values); - break; -} - -$var = array( - 'long description' => - array(0, 'something'), - 'another long description' => - array(1, "something else") -); - -$services = array( - 'service 1' => - Mockery::mock('class 1') - ->shouldReceive('setFilter')->once() - ->shouldReceive('getNbResults')->atLeast()->once() - ->shouldReceive('getSlice')->once()->andReturn(array()) - ->getMock(), - 'service 2' => - Mockery::mock('class 2') - ->shouldReceive('__invoke')->once() - ->getMock() -); - -class Foo -{ - public function setUp() - { - $this->foo = new class { - public $name = 'Some value'; - }; - } -} - -try { - foo(); -} catch (\Exception $e) { - $foo = function() { - return 'foo'; - }; - - if (true) { - } -} - -if ($foo) { - foo(); -} else if ($e) { - $foo = function() { - return 'foo'; - }; - - if (true) { - } -} else { - $foo = function() { - return 'foo'; - }; - - if (true) { - } -} - -switch ($parameter) { - case null: - return [ - 'foo' => in_array( - 'foo', - [] - ), - ]; - - default: - return []; -} - -class SomeClass -{ - public function someFunc() - { - a(function () { - echo "a"; - })->b(function () { - echo "b"; - }); - - if (true) { - echo "c"; - } - echo "d"; - } -} - -$params = self::validate_parameters(self::read_competency_framework_parameters(), - array( - 'id' => $id, - )); - -$framework = api::read_framework($params['id']); -self::validate_context($framework->get_context()); -$output = $PAGE->get_renderer('tool_lp'); - -class Test123 -{ - protected static - $prop1 = [ - 'testA' => 123, - ], - $prop2 = [ - 'testB' => 456, - ]; - - protected static - $prop3 = array( - 'testA' => 123, - ), - $prop4 = array( - 'testB' => 456, - ); - - protected static $prop5; -} - -$foo = foo( - function () { - $foo->debug( - $a, - $b - ); - - if ($a) { - $b = $a; - } - } -); - -if (somethingIsTrue()) { - ?> -
    - -
    - bar(foo(function () { - }), foo(function () { - })); - -echo 'foo'; - -class Test { - - public function a() { - ?>adebug( - $a, - $b - ); - - if ($a) { - $b = $a; - } - } -); - -function test() -{ - $array = []; - foreach ($array as $data) { - [ - 'key1' => $var1, - 'key2' => $var2, - ] = $data; - foreach ($var1 as $method) { - echo $method . $var2; - } - } -} - -switch ($a) { - case 0: - $a = function () { - }; - case 1: - break; -} - -class Test -{ - public function __construct() - { -if (false) { -echo 0; - } - } -} - -return [ - 'veryLongKeySoIWantToMakeALineBreak' - => 'veryLonValueSoIWantToMakeALineBreak', - - 'someOtherKey' => [ - 'someValue' - ], - - 'arrayWithArraysInThere' => [ - ['Value1', 'Value1'] - ], -]; - -switch ($sContext) { - case 'SOMETHING': - case 'CONSTANT': - do_something(); - break; - case 'GLOBAL': - case 'GLOBAL1': - do_something(); - // Fall through - default: - { - do_something(); - } -} - -array_map( - static function ( $item ) { - echo $item; - }, - $some_array -); - -/** - * Comment. - */ -$a(function () use ($app) { - echo 'hi'; -})(); - -$app->run(); - -function foo() -{ - $foo('some - long description', function () { - }); - - $foo('some - long - description', function () { - }); - - $foo( -'some long description', function () { - }); -} - -switch ( $a ) { -case 'a': - $b = 2; - /** - * A comment. - */ - apply_filter( 'something', $b ); - break; - -case 'aa': - $b = 2; - /* - * A comment. - */ - apply_filter( 'something', $b ); - break; - -case 'b': - $b = 3; -?> - - - - - -
    - -
    - -
    - -
    - - -
    - - - -
    - [ - ], - 'b' => <<<'FOO' -foo; -FOO - ], - $a, -]; - -$query = Model::query() - ->when($a, function () { - static $b = ''; - }); - -$result = array_map( - static fn(int $number) : int => $number + 1, - $numbers -); - -$a = $a === true ? [ - 'a' => 1, - ] : [ - 'a' => 100, -]; - -return [ - Url::make('View Song', fn($song) => $song->url()) - ->onlyOnDetail(), - - new Panel('Information', [ - Text::make('Title') - ]), -]; - -echo $string?->append('foo') - ?->outputUsing(); - -// phpcs:set Generic.WhiteSpace.ScopeIndent exact true -echo $string?->append('foo') - ?->outputUsing(); -// phpcs:set Generic.WhiteSpace.ScopeIndent exact false - -if (true) { - ?> null, - false => false, - 1, 2, 3 => true, - default => $value, -}; - -$value = match ($value) { - '' => null, -false => false, - 1, 2, 3 => true, - default => $value, -}; - -$value = match ( - $value - ) { - '' => null, - false - => false, - 1, - 2, - 3 => true, - default => -$value, -}; - -function toString(): string -{ - return sprintf( - '%s', - match ($type) { - 'foo' => 'bar', - }, - ); -} - -$list = [ - 'fn' => function ($a) { - if ($a === true) { - echo 'hi'; - } - }, - 'fn' => function ($a) { - if ($a === true) { - echo 'hi'; - $list2 = [ - 'fn' => function ($a) { - if ($a === true) { - echo 'hi'; - } - } - ]; - } - } -]; - -$foo = match ($type) { - 'a' => [ - 'aa' => 'DESC', - 'ab' => 'DESC', - ], - 'b' => [ - 'ba' => 'DESC', - 'bb' => 'DESC', - ], - default => [ - 'da' => 'DESC', - ], -}; - -$a = [ - 'a' => [ - 'a' => fn () => foo() - ], - 'a' => [ - 'a' => 'a', - ] -]; - -switch ($foo) { - case 'a': - $foo = match ($foo) { - 'bar' => 'custom_1', - default => 'a' - }; - return $foo; - case 'b': - return match ($foo) { - 'bar' => 'custom_1', - default => 'b' - }; - default: - return 'default'; -} - -foo(function ($foo) { - return [ - match ($foo) { - } - ]; -}); - -// Issue #110. -echo match (1) { - 0 => match (2) { - 2 => match (3) { - 3 => 3, - default => -1, - }, - }, - 1 => match (2) { - 1 => match (3) { - 3 => 3, - default => -1, - }, - 2 => match (3) { - 3 => 3, - default => -1, - }, - }, -}; - -// Issue #437. -match (true) { - default => [ - 'unrelated' => '', - 'example' => array_filter( - array_map( - function () { - return null; - }, - [] - ) - ) - ] -}; - -// Issue squizlabs/PHP_CodeSniffer#3808 -function test() { - yield - from [ 3, 4 ]; -} - -/* ADD NEW TESTS ABOVE THIS LINE AND MAKE SURE THAT THE 1 (space-based) AND 2 (tab-based) FILES ARE IN SYNC! */ -?> - - - - - - - <<<'INTRO' - lorem ipsum - INTRO, - 'em' => [ - [ - '', - ], - ], - 'abc' => [ - 'a' => 'wop wop', - 'b' => 'ola ola.', - ], -]; - -echo "" diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.2.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.2.inc.fixed deleted file mode 100644 index 4660f75..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.2.inc.fixed +++ /dev/null @@ -1,1659 +0,0 @@ -phpcs:set Generic.WhiteSpace.ScopeIndent tabIndent true - -hello(); - } - - function hello() - { - echo 'hello'; - }//end hello() - - function hello2() - { - if (TRUE) { - echo 'hello'; // no error here as its more than 4 spaces. - } else { - echo 'bye'; - } - - while (TRUE) { - echo 'hello'; - } - - do { - echo 'hello'; - } while (TRUE); - } - - function hello3() - { - switch ($hello) { - case 'hello': - break; - } - } - -} - -?> -
    -
    -
    -validate()) {
    -	$safe = $form->getSubmitValues();
    -}
    -?>
    -
    -open(); // error here - } - - public function open() - { - // Some inline stuff that shouldn't error - if (TRUE) echo 'hello'; - foreach ($tokens as $token) echo $token; - } - - /** - * This is a comment 1. - * This is a comment 2. - * This is a comment 3. - * This is a comment 4. - */ - public function close() - { - // All ok. - if (TRUE) { - if (TRUE) { - } else if (FALSE) { - foreach ($tokens as $token) { - switch ($token) { - case '1': - case '2': - if (true) { - if (false) { - if (false) { - if (false) { - echo 'hello'; - } - } - } - } - break; - case '5': - break; - } - do { - while (true) { - foreach ($tokens as $token) { - for ($i = 0; $i < $token; $i++) { - echo 'hello'; - } - } - } - } while (true); - } - } - } - } - - /* - This is another c style comment 1. - This is another c style comment 2. - This is another c style comment 3. - This is another c style comment 4. - This is another c style comment 5. - */ - - /* This is a T_COMMENT - * - * - * - */ - - /** This is a T_DOC_COMMENT - */ - - /* - This T_COMMENT has a newline in it. - - */ - - public function read() - { - echo 'hello'; - - // no errors below. - $array = array( - 'this', - 'that' => array( - 'hello', - 'hello again' => array( - 'hello', - ), - ), - ); - } -} - -abstract class Test3 -{ - public function parse() - { - - foreach ($t as $ndx => $token) { - if (is_array($token)) { - echo 'here'; - } else { - $ts[] = array("token" => $token, "value" => ''); - - $last = count($ts) - 1; - - switch ($token) { - case '(': - - if ($last >= 3 && - $ts[0]['token'] != T_CLASS && - $ts[$last - 2]['token'] == T_OBJECT_OPERATOR && - $ts[$last - 3]['token'] == T_VARIABLE ) { - - - if (true) { - echo 'hello'; - } - } - array_push($braces, $token); - break; - } - } - } - } -} - -function test() -{ - $o = << - - - - doSomething( - function () { - echo 123; - } - ); - } -} - -some_function( - function() { - $a = 403; - if ($a === 404) { - $a = 403; - } - } -); - -some_function( - function() { - $a = 403; - if ($a === 404) { - $a = 403; - } - } -); - -$myFunction = function() { - $a = 403; - if ($a === 404) { - $a = 403; - } -}; - -class Whatever -{ - protected $_protectedArray = array( - 'normalString' => 'That email address is already in use!', - 'offendingString' => <<<'STRING' -Each line of this string is always said to be at column 0, - no matter how many spaces are placed - at the beginning of each line -and the ending STRING on the next line is reported as having to be indented. -STRING - ); -} - -class MyClass -{ - public static function myFunction() - { - if (empty($keywords) === FALSE) { - $keywords = 'foo'; - $existing = 'foo'; - } - - return $keywords; - - }//end myFunction() - -}//end class - -$var = call_user_func( - $new_var = function () use (&$a) { - if ($a > 0) { - return $a++; - } else { - return $a--; - } - } -); - -class AnonymousFn -{ - public function getAnonFn() - { - return array( - 'functions' => Array( - 'function1' => function ($a, $b, $c) { - $a = $b + $c; - $b = $c / 2; - return Array($a, $b, $c); - }, - ), - ); - } -} -?> - -
    - -
    -
    - -
    -
    - -
    - - "") { - $test = true; - } else { - $test = true; - } - } - ?> - - - -
    -
    -
    - -
    -
    -
    - - -

    some text

    - function ($a) { - if ($a === true) { - echo 'hi'; - } - } -]; - -$list = [ - 'fn' => function ($a) { - if ($a === true) { - echo 'hi'; - } - } -]; - -if ($foo) { - foreach ($bar as $baz) { - if ($baz) { - ?> -
    -
    -
    - 1) { - echo '1'; - } - ?> -
    - 1) { - echo '1'; - } - ?> -
    - 1) { - echo '1'; - } - ?> -
    - -<?= CHtml::encode($this->pageTitle); ?> - -expects($this->at(2)) - ->with($this->callback( - function ($subject) - { - } - ) - ); - -/** @var Database $mockedDatabase */ -/** @var Container $mockedContainer */ - -echo $string->append('foo') - ->appaend('bar') - ->appaend('baz') - ->outputUsing( - function () - { - } - ); - -echo PHP_EOL; - -switch ($arg) { - case 1: - break; - case 2: - if ($arg2 == 'foo') { - } - case 3: - default: - echo 'default'; -} - -if ($tokens[$stackPtr]['content']{0} === '#') { -} else if ($tokens[$stackPtr]['content']{0} === '/' - && $tokens[$stackPtr]['content']{1} === '/' -) { -} - -$var = call_user_func( - function() { - if ($foo) { - $new_var = function() { - if ($a > 0) { - return $a++; - } else { - return $a--; - } - }; - } - } -); - -a( - function() { - $a = function() { - $b = false; - }; - true; - } -); - -$var = [ - [ - '1' => - function () { - return true; - }, - ], - [ - '1' => - function () { - return true; - }, - '2' => true, - ] -]; - -if ($foo) { - ?> -

    - self::_replaceKeywords($failingComment, $result), - 'screenshot' => Test::getScreenshotPath( - $projectid, - $result['class_name'], - ), - ); - -} - -$this->mockedDatabase - ->with( - $this->callback( - function () { - return; - } - ) - ); - -$this->subject->recordLogin(); - -function a() -{ - if (true) { - static::$a[$b] = - static::where($c) - ->where($c) - ->where( - function ($d) { - $d->whereNull(); - $d->orWhere(); - } - ) - ->first(); - - if (static::$a[$b] === null) { - static::$a[$b] = new static( - array( - 'a' => $a->id, - 'a' => $a->id, - ) - ); - } - } - - return static::$a[$b]; -} - -$foo->load( - array( - 'bar' => function ($baz) { - $baz->call(); - } - ) -); - -hello(); - -$foo = array_unique( - array_map( - function ($entry) { - return $entry * 2; - }, - array() - ) -); -bar($foo); - -class PHP_CodeSniffer_Tokenizers_JS -{ - - public $scopeOpeners = array( - T_CASE => array( - 'end' => array( - T_BREAK => T_BREAK, - T_RETURN => T_RETURN, - ), - 'strict' => true, - ), - ); -} - -echo $string-> - append('foo')-> - appaend('bar')-> - appaend('baz')-> - outputUsing( - function () - { - } - ); - -$str = 'the items I want to show are: ' . - implode( - ', ', - array('a', 'b', 'c') - ); - -echo $str; - -$str = 'foo' - . '1' - . '2'; - -echo $str; - -bar([ - 'foo' => foo(function () { - return 'foo'; - }) -]); - -$domains = array_unique( - array_map( - function ($url) { - $urlObject = new \Purl\Url($url); - return $urlObject->registerableDomain; - }, - $sites - ) -); - -return $domains; - -if ($a == 5) : - echo "a equals 5"; - echo "..."; -elseif ($a == 6) : - echo "a equals 6"; - echo "!!!"; -else : - echo "a is neither 5 nor 6"; -endif; - -if ($foo): - if ($bar) $foo = 1; - elseif ($baz) $foo = 2; -endif; - -$this - ->method(array( - 'foo' => 'bar', - ), 'arg', array( - 'foo' => 'bar', - )); - -class Foo -{ - use Bar { - myMethod as renamedMethod; - } -} - -class Foo -{ - use Bar { - myMethod as renamedMethod; - } -} - -foo(); - -array( - 'key1' => function ($bar) { - return $bar; - }, - 'key2' => function ($foo) { - return $foo; - }, -); - -?> - - 1, - ]; -$c = 2; - -class foo -{ - public function get() - { - $foo = ['b' => 'c', - 'd' => [ - ['e' => 'f'] - ]]; - echo '42'; - - $foo = array('b' => 'c', - 'd' => array( - array('e' => 'f') - )); - echo '42'; - } -} - -switch ($foo) { - case 1: - return array(); - case 2: - return ''; - case 3: - return $function(); - case 4: - return $functionCall($param[0]); - case 5: - return array() + array(); // Array Merge - case 6: - // String connect - return $functionReturningString('') . $functionReturningString(array()); - case 7: - return functionCall( - $withMultiLineParam[0], - array(), - $functionReturningString( - $withMultiLineParam[1] - ) - ); - case 8: - return $param[0][0]; -} - -class Test { - - public - $foo - ,$bar - ,$baz = [ ] - ; - - public function wtfindent() { - } -} - -switch ($x) { - case 1: - return [1]; - default: - return [2]; -} - -switch ($foo) { - case self::FOO: - return $this->bar($gfoo, function ($id) { - return FOO::bar($id); - }, $values); - case self::BAR: - $values = $this->bar($foo, $values); - break; -} - -$var = array( - 'long description' => - array(0, 'something'), - 'another long description' => - array(1, "something else") -); - -$services = array( - 'service 1' => - Mockery::mock('class 1') - ->shouldReceive('setFilter')->once() - ->shouldReceive('getNbResults')->atLeast()->once() - ->shouldReceive('getSlice')->once()->andReturn(array()) - ->getMock(), - 'service 2' => - Mockery::mock('class 2') - ->shouldReceive('__invoke')->once() - ->getMock() -); - -class Foo -{ - public function setUp() - { - $this->foo = new class { - public $name = 'Some value'; - }; - } -} - -try { - foo(); -} catch (\Exception $e) { - $foo = function() { - return 'foo'; - }; - - if (true) { - } -} - -if ($foo) { - foo(); -} else if ($e) { - $foo = function() { - return 'foo'; - }; - - if (true) { - } -} else { - $foo = function() { - return 'foo'; - }; - - if (true) { - } -} - -switch ($parameter) { - case null: - return [ - 'foo' => in_array( - 'foo', - [] - ), - ]; - - default: - return []; -} - -class SomeClass -{ - public function someFunc() - { - a(function () { - echo "a"; - })->b(function () { - echo "b"; - }); - - if (true) { - echo "c"; - } - echo "d"; - } -} - -$params = self::validate_parameters(self::read_competency_framework_parameters(), - array( - 'id' => $id, - )); - -$framework = api::read_framework($params['id']); -self::validate_context($framework->get_context()); -$output = $PAGE->get_renderer('tool_lp'); - -class Test123 -{ - protected static - $prop1 = [ - 'testA' => 123, - ], - $prop2 = [ - 'testB' => 456, - ]; - - protected static - $prop3 = array( - 'testA' => 123, - ), - $prop4 = array( - 'testB' => 456, - ); - - protected static $prop5; -} - -$foo = foo( - function () { - $foo->debug( - $a, - $b - ); - - if ($a) { - $b = $a; - } - } -); - -if (somethingIsTrue()) { - ?> -
    - -
    - bar(foo(function () { - }), foo(function () { - })); - -echo 'foo'; - -class Test { - - public function a() { - ?>adebug( - $a, - $b - ); - - if ($a) { - $b = $a; - } - } -); - -function test() -{ - $array = []; - foreach ($array as $data) { - [ - 'key1' => $var1, - 'key2' => $var2, - ] = $data; - foreach ($var1 as $method) { - echo $method . $var2; - } - } -} - -switch ($a) { - case 0: - $a = function () { - }; - case 1: - break; -} - -class Test -{ - public function __construct() - { - if (false) { - echo 0; - } - } -} - -return [ - 'veryLongKeySoIWantToMakeALineBreak' - => 'veryLonValueSoIWantToMakeALineBreak', - - 'someOtherKey' => [ - 'someValue' - ], - - 'arrayWithArraysInThere' => [ - ['Value1', 'Value1'] - ], -]; - -switch ($sContext) { - case 'SOMETHING': - case 'CONSTANT': - do_something(); - break; - case 'GLOBAL': - case 'GLOBAL1': - do_something(); - // Fall through - default: - { - do_something(); - } -} - -array_map( - static function ( $item ) { - echo $item; - }, - $some_array -); - -/** - * Comment. - */ -$a(function () use ($app) { - echo 'hi'; -})(); - -$app->run(); - -function foo() -{ - $foo('some - long description', function () { - }); - - $foo('some - long - description', function () { - }); - - $foo( - 'some long description', function () { - }); -} - -switch ( $a ) { - case 'a': - $b = 2; - /** - * A comment. - */ - apply_filter( 'something', $b ); - break; - - case 'aa': - $b = 2; - /* - * A comment. - */ - apply_filter( 'something', $b ); - break; - - case 'b': - $b = 3; - ?> - - - - - -
    - -
    - -
    - -
    - - -
    - - - -
    - [ - ], - 'b' => <<<'FOO' -foo; -FOO - ], - $a, -]; - -$query = Model::query() - ->when($a, function () { - static $b = ''; - }); - -$result = array_map( - static fn(int $number) : int => $number + 1, - $numbers -); - -$a = $a === true ? [ - 'a' => 1, - ] : [ - 'a' => 100, -]; - -return [ - Url::make('View Song', fn($song) => $song->url()) - ->onlyOnDetail(), - - new Panel('Information', [ - Text::make('Title') - ]), -]; - -echo $string?->append('foo') - ?->outputUsing(); - -// phpcs:set Generic.WhiteSpace.ScopeIndent exact true -echo $string?->append('foo') - ?->outputUsing(); -// phpcs:set Generic.WhiteSpace.ScopeIndent exact false - -if (true) { - ?> null, - false => false, - 1, 2, 3 => true, - default => $value, -}; - -$value = match ($value) { - '' => null, - false => false, - 1, 2, 3 => true, - default => $value, -}; - -$value = match ( - $value - ) { - '' => null, - false - => false, - 1, - 2, - 3 => true, - default => - $value, -}; - -function toString(): string -{ - return sprintf( - '%s', - match ($type) { - 'foo' => 'bar', - }, - ); -} - -$list = [ - 'fn' => function ($a) { - if ($a === true) { - echo 'hi'; - } - }, - 'fn' => function ($a) { - if ($a === true) { - echo 'hi'; - $list2 = [ - 'fn' => function ($a) { - if ($a === true) { - echo 'hi'; - } - } - ]; - } - } -]; - -$foo = match ($type) { - 'a' => [ - 'aa' => 'DESC', - 'ab' => 'DESC', - ], - 'b' => [ - 'ba' => 'DESC', - 'bb' => 'DESC', - ], - default => [ - 'da' => 'DESC', - ], -}; - -$a = [ - 'a' => [ - 'a' => fn () => foo() - ], - 'a' => [ - 'a' => 'a', - ] -]; - -switch ($foo) { - case 'a': - $foo = match ($foo) { - 'bar' => 'custom_1', - default => 'a' - }; - return $foo; - case 'b': - return match ($foo) { - 'bar' => 'custom_1', - default => 'b' - }; - default: - return 'default'; -} - -foo(function ($foo) { - return [ - match ($foo) { - } - ]; -}); - -// Issue #110. -echo match (1) { - 0 => match (2) { - 2 => match (3) { - 3 => 3, - default => -1, - }, - }, - 1 => match (2) { - 1 => match (3) { - 3 => 3, - default => -1, - }, - 2 => match (3) { - 3 => 3, - default => -1, - }, - }, -}; - -// Issue #437. -match (true) { - default => [ - 'unrelated' => '', - 'example' => array_filter( - array_map( - function () { - return null; - }, - [] - ) - ) - ] -}; - -// Issue squizlabs/PHP_CodeSniffer#3808 -function test() { - yield - from [ 3, 4 ]; -} - -/* ADD NEW TESTS ABOVE THIS LINE AND MAKE SURE THAT THE 1 (space-based) AND 2 (tab-based) FILES ARE IN SYNC! */ -?> - - - - - - - <<<'INTRO' - lorem ipsum - INTRO, - 'em' => [ - [ - '', - ], - ], - 'abc' => [ - 'a' => 'wop wop', - 'b' => 'ola ola.', - ], -]; - -echo "" diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.3.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.3.inc deleted file mode 100644 index dd09561..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.3.inc +++ /dev/null @@ -1,34 +0,0 @@ - $enabled, - 'compression' => $compression, - ] = $options; -} - -$this->foo() - ->bar() - ->baz(); - -// Issue squizlabs/PHP_CodeSniffer#3808 -function test() { - yield - from [ 3, 4 ]; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.3.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.3.inc.fixed deleted file mode 100644 index aaa0b1c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.3.inc.fixed +++ /dev/null @@ -1,34 +0,0 @@ - $enabled, - 'compression' => $compression, - ] = $options; -} - -$this->foo() - ->bar() - ->baz(); - -// Issue squizlabs/PHP_CodeSniffer#3808 -function test() { - yield - from [ 3, 4 ]; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.4.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.4.inc deleted file mode 100644 index e58dc4d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/ScopeIndentUnitTest.4.inc +++ /dev/null @@ -1,6 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ScopeIndent sniff. - * - * @covers \PHP_CodeSniffer\Standards\Generic\Sniffs\WhiteSpace\ScopeIndentSniff - */ -final class ScopeIndentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Get a list of CLI values to set before the file is tested. - * - * @param string $testFile The name of the file being tested. - * @param \PHP_CodeSniffer\Config $config The config data for the test run. - * - * @return void - */ - public function setCliValues($testFile, $config) - { - $config->setConfigData('scope_indent_debug', '0', true); - - // Tab width setting is only needed for the tabbed file. - if ($testFile === 'ScopeIndentUnitTest.2.inc') { - $config->tabWidth = 4; - } else { - $config->tabWidth = 0; - } - - }//end setCliValues() - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - if ($testFile === 'ScopeIndentUnitTest.1.js') { - return [ - 6 => 1, - 14 => 1, - 21 => 1, - 30 => 1, - 32 => 1, - 33 => 1, - 34 => 1, - 39 => 1, - 42 => 1, - 59 => 1, - 60 => 1, - 75 => 1, - 120 => 1, - 121 => 1, - 122 => 1, - 123 => 1, - 141 => 1, - 142 => 1, - 155 => 1, - 156 => 1, - 168 => 1, - 184 => 1, - ]; - }//end if - - if ($testFile === 'ScopeIndentUnitTest.3.inc') { - return [ - 6 => 1, - 7 => 1, - 10 => 1, - 33 => 1, - ]; - } - - if ($testFile === 'ScopeIndentUnitTest.4.inc') { - return []; - } - - return [ - 7 => 1, - 10 => 1, - 13 => 1, - 17 => 1, - 20 => 1, - 24 => 1, - 25 => 1, - 27 => 1, - 28 => 1, - 29 => 1, - 30 => 1, - 58 => 1, - 123 => 1, - 224 => 1, - 225 => 1, - 279 => 1, - 280 => 1, - 281 => 1, - 282 => 1, - 283 => 1, - 284 => 1, - 285 => 1, - 286 => 1, - 336 => 1, - 349 => 1, - 380 => 1, - 386 => 1, - 387 => 1, - 388 => 1, - 389 => 1, - 390 => 1, - 397 => 1, - 419 => 1, - 420 => 1, - 465 => 1, - 467 => 1, - 472 => 1, - 473 => 1, - 474 => 1, - 496 => 1, - 498 => 1, - 500 => 1, - 524 => 1, - 526 => 1, - 544 => 1, - 545 => 1, - 546 => 1, - 639 => 1, - 660 => 1, - 662 => 1, - 802 => 1, - 803 => 1, - 823 => 1, - 858 => 1, - 879 => 1, - 1163 => 1, - 1197 => 1, - 1198 => 1, - 1259 => 1, - 1264 => 1, - 1265 => 1, - 1266 => 1, - 1269 => 1, - 1272 => 1, - 1273 => 1, - 1274 => 1, - 1275 => 1, - 1276 => 1, - 1277 => 1, - 1280 => 1, - 1281 => 1, - 1282 => 1, - 1284 => 1, - 1285 => 1, - 1288 => 1, - 1289 => 1, - 1290 => 1, - 1292 => 1, - 1293 => 1, - 1310 => 1, - 1312 => 1, - 1327 => 1, - 1328 => 1, - 1329 => 1, - 1330 => 1, - 1331 => 1, - 1332 => 1, - 1335 => 1, - 1340 => 1, - 1342 => 1, - 1345 => 1, - 1488 => 1, - 1489 => 1, - 1500 => 1, - 1503 => 1, - 1518 => 1, - 1520 => 1, - 1527 => 1, - 1529 => 1, - 1530 => 1, - 1631 => 1, - 1632 => 1, - 1633 => 1, - 1634 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/SpreadOperatorSpacingAfterUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/SpreadOperatorSpacingAfterUnitTest.1.inc deleted file mode 100644 index 6c86ac0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/Tests/WhiteSpace/SpreadOperatorSpacingAfterUnitTest.1.inc +++ /dev/null @@ -1,78 +0,0 @@ - - * @copyright 2019 Juliette Reinders Folmer. All rights reserved. - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Generic\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the SpreadOperatorSpacingAfter sniff. - * - * @covers \PHP_CodeSniffer\Standards\Generic\Sniffs\WhiteSpace\SpreadOperatorSpacingAfterSniff - */ -final class SpreadOperatorSpacingAfterUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'SpreadOperatorSpacingAfterUnitTest.1.inc': - return [ - 12 => 1, - 13 => 1, - 20 => 2, - 40 => 1, - 41 => 1, - 46 => 2, - 60 => 1, - 61 => 1, - 66 => 2, - 78 => 1, - ]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/ruleset.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Generic/ruleset.xml deleted file mode 100644 index 728426e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Generic/ruleset.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - A collection of generic sniffs. This standard is not designed to be used to check code. - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/CSS/BrowserSpecificStylesSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/CSS/BrowserSpecificStylesSniff.php deleted file mode 100644 index 203c638..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/CSS/BrowserSpecificStylesSniff.php +++ /dev/null @@ -1,126 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\MySource\Sniffs\CSS; - -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Files\File; - -class BrowserSpecificStylesSniff implements Sniff, DeprecatedSniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['CSS']; - - /** - * A list of specific stylesheet suffixes we allow. - * - * These stylesheets contain browser specific styles - * so this sniff ignore them files in the form: - * *_moz.css and *_ie7.css etc. - * - * @var array - */ - protected $specificStylesheets = [ - 'moz' => true, - 'ie' => true, - 'ie7' => true, - 'ie8' => true, - 'webkit' => true, - ]; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return array - */ - public function register() - { - return [T_STYLE]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - // Ignore files with browser-specific suffixes. - $filename = $phpcsFile->getFilename(); - $breakChar = strrpos($filename, '_'); - if ($breakChar !== false && substr($filename, -4) === '.css') { - $specific = substr($filename, ($breakChar + 1), -4); - if (isset($this->specificStylesheets[$specific]) === true) { - return; - } - } - - $tokens = $phpcsFile->getTokens(); - $content = $tokens[$stackPtr]['content']; - - if ($content[0] === '-') { - $error = 'Browser-specific styles are not allowed'; - $phpcsFile->addError($error, $stackPtr, 'ForbiddenStyle'); - } - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'The MySource standard will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Channels/DisallowSelfActionsSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Channels/DisallowSelfActionsSniff.php deleted file mode 100644 index 38e90cb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Channels/DisallowSelfActionsSniff.php +++ /dev/null @@ -1,164 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\MySource\Sniffs\Channels; - -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; - -class DisallowSelfActionsSniff implements Sniff, DeprecatedSniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_CLASS]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // We are not interested in abstract classes. - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - if ($prev !== false && $tokens[$prev]['code'] === T_ABSTRACT) { - return; - } - - // We are only interested in Action classes. - $classNameToken = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - $className = $tokens[$classNameToken]['content']; - if (substr($className, -7) !== 'Actions') { - return; - } - - $foundFunctions = []; - $foundCalls = []; - - // Find all static method calls in the form self::method() in the class. - $classEnd = $tokens[$stackPtr]['scope_closer']; - for ($i = ($classNameToken + 1); $i < $classEnd; $i++) { - if ($tokens[$i]['code'] !== T_DOUBLE_COLON) { - if ($tokens[$i]['code'] === T_FUNCTION) { - // Cache the function information. - $funcName = $phpcsFile->findNext(T_STRING, ($i + 1)); - $funcScope = $phpcsFile->findPrevious(Tokens::$scopeModifiers, ($i - 1)); - - $foundFunctions[$tokens[$funcName]['content']] = strtolower($tokens[$funcScope]['content']); - } - - continue; - } - - $prevToken = $phpcsFile->findPrevious(T_WHITESPACE, ($i - 1), null, true); - if ($tokens[$prevToken]['content'] !== 'self' - && $tokens[$prevToken]['content'] !== 'static' - ) { - continue; - } - - $funcNameToken = $phpcsFile->findNext(T_WHITESPACE, ($i + 1), null, true); - if ($tokens[$funcNameToken]['code'] === T_VARIABLE) { - // We are only interested in function calls. - continue; - } - - $funcName = $tokens[$funcNameToken]['content']; - - // We've found the function, now we need to find it and see if it is - // public, private or protected. If it starts with an underscore we - // can assume it is private. - if ($funcName[0] === '_') { - continue; - } - - $foundCalls[$i] = [ - 'name' => $funcName, - 'type' => strtolower($tokens[$prevToken]['content']), - ]; - }//end for - - $errorClassName = substr($className, 0, -7); - - foreach ($foundCalls as $token => $funcData) { - if (isset($foundFunctions[$funcData['name']]) === false) { - // Function was not in this class, might have come from the parent. - // Either way, we can't really check this. - continue; - } else if ($foundFunctions[$funcData['name']] === 'public') { - $type = $funcData['type']; - $error = "Static calls to public methods in Action classes must not use the $type keyword; use %s::%s() instead"; - $data = [ - $errorClassName, - $funcName, - ]; - $phpcsFile->addError($error, $token, 'Found'.ucfirst($funcData['type']), $data); - } - } - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'The MySource standard will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Channels/IncludeOwnSystemSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Channels/IncludeOwnSystemSniff.php deleted file mode 100644 index 0efa543..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Channels/IncludeOwnSystemSniff.php +++ /dev/null @@ -1,137 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\MySource\Sniffs\Channels; - -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Files\File; - -class IncludeOwnSystemSniff implements Sniff, DeprecatedSniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_DOUBLE_COLON]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $fileName = $phpcsFile->getFilename(); - $matches = []; - if (preg_match('|/systems/(.*)/([^/]+)?actions.inc$|i', $fileName, $matches) === 0) { - // Not an actions file. - return; - } - - $ownClass = $matches[2]; - $tokens = $phpcsFile->getTokens(); - - $typeName = $phpcsFile->findNext(T_CONSTANT_ENCAPSED_STRING, ($stackPtr + 2), null, false, true); - $typeName = trim($tokens[$typeName]['content'], " '"); - switch (strtolower($tokens[($stackPtr + 1)]['content'])) { - case 'includesystem' : - $included = strtolower($typeName); - break; - case 'includeasset' : - $included = strtolower($typeName).'assettype'; - break; - case 'includewidget' : - $included = strtolower($typeName).'widgettype'; - break; - default: - return; - } - - if ($included === strtolower($ownClass)) { - $error = "You do not need to include \"%s\" from within the system's own actions file"; - $data = [$ownClass]; - $phpcsFile->addError($error, $stackPtr, 'NotRequired', $data); - } - - }//end process() - - - /** - * Determines the included class name from given token. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param array $tokens The array of file tokens. - * @param int $stackPtr The position in the tokens array of the - * potentially included class. - * - * @return bool - */ - protected function getIncludedClassFromToken( - $phpcsFile, - array $tokens, - $stackPtr - ) { - - return false; - - }//end getIncludedClassFromToken() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'The MySource standard will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Channels/IncludeSystemSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Channels/IncludeSystemSniff.php deleted file mode 100644 index cb6a279..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Channels/IncludeSystemSniff.php +++ /dev/null @@ -1,353 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\MySource\Sniffs\Channels; - -use PHP_CodeSniffer\Sniffs\AbstractScopeSniff; -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; - -class IncludeSystemSniff extends AbstractScopeSniff implements DeprecatedSniff -{ - - /** - * A list of classes that don't need to be included. - * - * @var array - */ - private $ignore = [ - 'self' => true, - 'static' => true, - 'parent' => true, - 'channels' => true, - 'basesystem' => true, - 'dal' => true, - 'init' => true, - 'pdo' => true, - 'util' => true, - 'ziparchive' => true, - 'phpunit_framework_assert' => true, - 'abstractmysourceunittest' => true, - 'abstractdatacleanunittest' => true, - 'exception' => true, - 'abstractwidgetwidgettype' => true, - 'domdocument' => true, - ]; - - - /** - * Constructs an AbstractScopeSniff. - */ - public function __construct() - { - parent::__construct([T_FUNCTION], [T_DOUBLE_COLON, T_EXTENDS], true); - - }//end __construct() - - - /** - * Processes the function tokens within the class. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param integer $stackPtr The position where the token was found. - * @param integer $currScope The current scope opener token. - * - * @return void - */ - protected function processTokenWithinScope(File $phpcsFile, $stackPtr, $currScope) - { - $tokens = $phpcsFile->getTokens(); - - // Determine the name of the class that the static function - // is being called on. - $classNameToken = $phpcsFile->findPrevious( - T_WHITESPACE, - ($stackPtr - 1), - null, - true - ); - - // Don't process class names represented by variables as this can be - // an inexact science. - if ($tokens[$classNameToken]['code'] === T_VARIABLE) { - return; - } - - $className = $tokens[$classNameToken]['content']; - if (isset($this->ignore[strtolower($className)]) === true) { - return; - } - - $includedClasses = []; - - $fileName = strtolower($phpcsFile->getFilename()); - $matches = []; - if (preg_match('|/systems/(.*)/([^/]+)?actions.inc$|', $fileName, $matches) !== 0) { - // This is an actions file, which means we don't - // have to include the system in which it exists. - $includedClasses[$matches[2]] = true; - - // Or a system it implements. - $class = $phpcsFile->getCondition($stackPtr, T_CLASS); - $implements = $phpcsFile->findNext(T_IMPLEMENTS, $class, ($class + 10)); - if ($implements !== false) { - $implementsClass = $phpcsFile->findNext(T_STRING, $implements); - $implementsClassName = strtolower($tokens[$implementsClass]['content']); - if (substr($implementsClassName, -7) === 'actions') { - $includedClasses[substr($implementsClassName, 0, -7)] = true; - } - } - } - - // Go searching for includeSystem and includeAsset calls within this - // function, or the inclusion of .inc files, which - // would be library files. - for ($i = ($currScope + 1); $i < $stackPtr; $i++) { - $name = $this->getIncludedClassFromToken($phpcsFile, $tokens, $i); - if ($name !== false) { - $includedClasses[$name] = true; - // Special case for Widgets cause they are, well, special. - } else if (strtolower($tokens[$i]['content']) === 'includewidget') { - $typeName = $phpcsFile->findNext(T_CONSTANT_ENCAPSED_STRING, ($i + 1)); - $typeName = trim($tokens[$typeName]['content'], " '"); - $includedClasses[strtolower($typeName).'widgettype'] = true; - } - } - - // Now go searching for includeSystem, includeAsset or require/include - // calls outside our scope. If we are in a class, look outside the - // class. If we are not, look outside the function. - $condPtr = $currScope; - if ($phpcsFile->hasCondition($stackPtr, T_CLASS) === true) { - foreach ($tokens[$stackPtr]['conditions'] as $condPtr => $condType) { - if ($condType === T_CLASS) { - break; - } - } - } - - for ($i = 0; $i < $condPtr; $i++) { - // Skip other scopes. - if (isset($tokens[$i]['scope_closer']) === true) { - $i = $tokens[$i]['scope_closer']; - continue; - } - - $name = $this->getIncludedClassFromToken($phpcsFile, $tokens, $i); - if ($name !== false) { - $includedClasses[$name] = true; - } - } - - // If we are in a testing class, we might have also included - // some systems and classes in our setUp() method. - $setupFunction = null; - if ($phpcsFile->hasCondition($stackPtr, T_CLASS) === true) { - foreach ($tokens[$stackPtr]['conditions'] as $condPtr => $condType) { - if ($condType === T_CLASS) { - // Is this is a testing class? - $name = $phpcsFile->findNext(T_STRING, $condPtr); - $name = $tokens[$name]['content']; - if (substr($name, -8) === 'UnitTest') { - // Look for a method called setUp(). - $end = $tokens[$condPtr]['scope_closer']; - $function = $phpcsFile->findNext(T_FUNCTION, ($condPtr + 1), $end); - while ($function !== false) { - $name = $phpcsFile->findNext(T_STRING, $function); - if ($tokens[$name]['content'] === 'setUp') { - $setupFunction = $function; - break; - } - - $function = $phpcsFile->findNext(T_FUNCTION, ($function + 1), $end); - } - } - } - }//end foreach - }//end if - - if ($setupFunction !== null) { - $start = ($tokens[$setupFunction]['scope_opener'] + 1); - $end = $tokens[$setupFunction]['scope_closer']; - for ($i = $start; $i < $end; $i++) { - $name = $this->getIncludedClassFromToken($phpcsFile, $tokens, $i); - if ($name !== false) { - $includedClasses[$name] = true; - } - } - }//end if - - if (isset($includedClasses[strtolower($className)]) === false) { - $error = 'Static method called on non-included class or system "%s"; include system with Channels::includeSystem() or include class with require_once'; - $data = [$className]; - $phpcsFile->addError($error, $stackPtr, 'NotIncludedCall', $data); - } - - }//end processTokenWithinScope() - - - /** - * Processes a token within the scope that this test is listening to. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * this token was found. - * - * @return void - */ - protected function processTokenOutsideScope(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['code'] === T_EXTENDS) { - // Find the class name. - $classNameToken = $phpcsFile->findNext(T_STRING, ($stackPtr + 1)); - $className = $tokens[$classNameToken]['content']; - } else { - // Determine the name of the class that the static function - // is being called on. But don't process class names represented by - // variables as this can be an inexact science. - $classNameToken = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - if ($tokens[$classNameToken]['code'] === T_VARIABLE) { - return; - } - - $className = $tokens[$classNameToken]['content']; - } - - // Some systems are always available. - if (isset($this->ignore[strtolower($className)]) === true) { - return; - } - - $includedClasses = []; - - $fileName = strtolower($phpcsFile->getFilename()); - $matches = []; - if (preg_match('|/systems/([^/]+)/([^/]+)?actions.inc$|', $fileName, $matches) !== 0) { - // This is an actions file, which means we don't - // have to include the system in which it exists - // We know the system from the path. - $includedClasses[$matches[1]] = true; - } - - // Go searching for includeSystem, includeAsset or require/include - // calls outside our scope. - for ($i = 0; $i < $stackPtr; $i++) { - // Skip classes and functions as will we never get - // into their scopes when including this file, although - // we have a chance of getting into IF, WHILE etc. - if (($tokens[$i]['code'] === T_CLASS - || $tokens[$i]['code'] === T_INTERFACE - || $tokens[$i]['code'] === T_FUNCTION) - && isset($tokens[$i]['scope_closer']) === true - ) { - $i = $tokens[$i]['scope_closer']; - continue; - } - - $name = $this->getIncludedClassFromToken($phpcsFile, $tokens, $i); - if ($name !== false) { - $includedClasses[$name] = true; - // Special case for Widgets cause they are, well, special. - } else if (strtolower($tokens[$i]['content']) === 'includewidget') { - $typeName = $phpcsFile->findNext(T_CONSTANT_ENCAPSED_STRING, ($i + 1)); - $typeName = trim($tokens[$typeName]['content'], " '"); - $includedClasses[strtolower($typeName).'widgettype'] = true; - } - }//end for - - if (isset($includedClasses[strtolower($className)]) === false) { - if ($tokens[$stackPtr]['code'] === T_EXTENDS) { - $error = 'Class extends non-included class or system "%s"; include system with Channels::includeSystem() or include class with require_once'; - $data = [$className]; - $phpcsFile->addError($error, $stackPtr, 'NotIncludedExtends', $data); - } else { - $error = 'Static method called on non-included class or system "%s"; include system with Channels::includeSystem() or include class with require_once'; - $data = [$className]; - $phpcsFile->addError($error, $stackPtr, 'NotIncludedCall', $data); - } - } - - }//end processTokenOutsideScope() - - - /** - * Determines the included class name from given token. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param array $tokens The array of file tokens. - * @param int $stackPtr The position in the tokens array of the - * potentially included class. - * - * @return string|false - */ - protected function getIncludedClassFromToken(File $phpcsFile, array $tokens, $stackPtr) - { - if (strtolower($tokens[$stackPtr]['content']) === 'includesystem') { - $systemName = $phpcsFile->findNext(T_CONSTANT_ENCAPSED_STRING, ($stackPtr + 1)); - $systemName = trim($tokens[$systemName]['content'], " '"); - return strtolower($systemName); - } else if (strtolower($tokens[$stackPtr]['content']) === 'includeasset') { - $typeName = $phpcsFile->findNext(T_CONSTANT_ENCAPSED_STRING, ($stackPtr + 1)); - $typeName = trim($tokens[$typeName]['content'], " '"); - return strtolower($typeName).'assettype'; - } else if (isset(Tokens::$includeTokens[$tokens[$stackPtr]['code']]) === true) { - $filePath = $phpcsFile->findNext(T_CONSTANT_ENCAPSED_STRING, ($stackPtr + 1)); - $filePath = $tokens[$filePath]['content']; - $filePath = trim($filePath, " '"); - $filePath = basename($filePath, '.inc'); - return strtolower($filePath); - } - - return false; - - }//end getIncludedClassFromToken() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'The MySource standard will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Channels/UnusedSystemSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Channels/UnusedSystemSniff.php deleted file mode 100644 index 7e82b0f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Channels/UnusedSystemSniff.php +++ /dev/null @@ -1,180 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\MySource\Sniffs\Channels; - -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Files\File; - -class UnusedSystemSniff implements Sniff, DeprecatedSniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_DOUBLE_COLON]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Check if this is a call to includeSystem, includeAsset or includeWidget. - $methodName = strtolower($tokens[($stackPtr + 1)]['content']); - if ($methodName === 'includesystem' - || $methodName === 'includeasset' - || $methodName === 'includewidget' - ) { - $systemName = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 3), null, true); - if ($systemName === false || $tokens[$systemName]['code'] !== T_CONSTANT_ENCAPSED_STRING) { - // Must be using a variable instead of a specific system name. - // We can't accurately check that. - return; - } - - $systemName = trim($tokens[$systemName]['content'], " '"); - } else { - return; - } - - if ($methodName === 'includeasset') { - $systemName .= 'assettype'; - } else if ($methodName === 'includewidget') { - $systemName .= 'widgettype'; - } - - $systemName = strtolower($systemName); - - // Now check if this system is used anywhere in this scope. - $level = $tokens[$stackPtr]['level']; - for ($i = ($stackPtr + 1); $i < $phpcsFile->numTokens; $i++) { - if ($tokens[$i]['level'] < $level) { - // We have gone out of scope. - // If the original include was inside an IF statement that - // is checking if the system exists, check the outer scope - // as well. - if ($tokens[$stackPtr]['level'] === $level) { - // We are still in the base level, so this is the first - // time we have got here. - $conditions = array_keys($tokens[$stackPtr]['conditions']); - if (empty($conditions) === false) { - $cond = array_pop($conditions); - if ($tokens[$cond]['code'] === T_IF) { - $i = $tokens[$cond]['scope_closer']; - $level--; - continue; - } - } - } - - break; - }//end if - - if ($tokens[$i]['code'] !== T_DOUBLE_COLON - && $tokens[$i]['code'] !== T_EXTENDS - && $tokens[$i]['code'] !== T_IMPLEMENTS - ) { - continue; - } - - switch ($tokens[$i]['code']) { - case T_DOUBLE_COLON: - $usedName = strtolower($tokens[($i - 1)]['content']); - if ($usedName === $systemName) { - // The included system was used, so it is fine. - return; - } - break; - case T_EXTENDS: - $classNameToken = $phpcsFile->findNext(T_STRING, ($i + 1)); - $className = strtolower($tokens[$classNameToken]['content']); - if ($className === $systemName) { - // The included system was used, so it is fine. - return; - } - break; - case T_IMPLEMENTS: - $endImplements = $phpcsFile->findNext([T_EXTENDS, T_OPEN_CURLY_BRACKET], ($i + 1)); - for ($x = ($i + 1); $x < $endImplements; $x++) { - if ($tokens[$x]['code'] === T_STRING) { - $className = strtolower($tokens[$x]['content']); - if ($className === $systemName) { - // The included system was used, so it is fine. - return; - } - } - } - break; - }//end switch - }//end for - - // If we get to here, the system was not use. - $error = 'Included system "%s" is never used'; - $data = [$systemName]; - $phpcsFile->addError($error, $stackPtr, 'Found', $data); - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'The MySource standard will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Commenting/FunctionCommentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Commenting/FunctionCommentSniff.php deleted file mode 100644 index f5e380d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Commenting/FunctionCommentSniff.php +++ /dev/null @@ -1,123 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\MySource\Sniffs\Commenting; - -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting\FunctionCommentSniff as SquizFunctionCommentSniff; -use PHP_CodeSniffer\Util\Tokens; -use PHP_CodeSniffer\Files\File; - -class FunctionCommentSniff extends SquizFunctionCommentSniff implements DeprecatedSniff -{ - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - parent::process($phpcsFile, $stackPtr); - - $tokens = $phpcsFile->getTokens(); - $find = Tokens::$methodPrefixes; - $find[] = T_WHITESPACE; - - $commentEnd = $phpcsFile->findPrevious($find, ($stackPtr - 1), null, true); - if ($tokens[$commentEnd]['code'] !== T_DOC_COMMENT_CLOSE_TAG) { - return; - } - - $commentStart = $tokens[$commentEnd]['comment_opener']; - $hasApiTag = false; - foreach ($tokens[$commentStart]['comment_tags'] as $tag) { - if ($tokens[$tag]['content'] === '@api') { - if ($hasApiTag === true) { - // We've come across an API tag already, which means - // we were not the first tag in the API list. - $error = 'The @api tag must come first in the @api tag list in a function comment'; - $phpcsFile->addError($error, $tag, 'ApiNotFirst'); - } - - $hasApiTag = true; - - // There needs to be a blank line before the @api tag. - $prev = $phpcsFile->findPrevious([T_DOC_COMMENT_STRING, T_DOC_COMMENT_TAG], ($tag - 1)); - if ($tokens[$prev]['line'] !== ($tokens[$tag]['line'] - 2)) { - $error = 'There must be one blank line before the @api tag in a function comment'; - $phpcsFile->addError($error, $tag, 'ApiSpacing'); - } - } else if (substr($tokens[$tag]['content'], 0, 5) === '@api-') { - $hasApiTag = true; - - $prev = $phpcsFile->findPrevious([T_DOC_COMMENT_STRING, T_DOC_COMMENT_TAG], ($tag - 1)); - if ($tokens[$prev]['line'] !== ($tokens[$tag]['line'] - 1)) { - $error = 'There must be no blank line before the @%s tag in a function comment'; - $data = [$tokens[$tag]['content']]; - $phpcsFile->addError($error, $tag, 'ApiTagSpacing', $data); - } - }//end if - }//end foreach - - if ($hasApiTag === true && substr($tokens[$tag]['content'], 0, 4) !== '@api') { - // API tags must be the last tags in a function comment. - $error = 'The @api tags must be the last tags in a function comment'; - $phpcsFile->addError($error, $commentEnd, 'ApiNotLast'); - } - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'The MySource standard will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Debug/DebugCodeSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Debug/DebugCodeSniff.php deleted file mode 100644 index c13adf1..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Debug/DebugCodeSniff.php +++ /dev/null @@ -1,94 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\MySource\Sniffs\Debug; - -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Files\File; - -class DebugCodeSniff implements Sniff, DeprecatedSniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_DOUBLE_COLON]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $className = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - if (strtolower($tokens[$className]['content']) === 'debug') { - $method = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - $error = 'Call to debug function Debug::%s() must be removed'; - $data = [$tokens[$method]['content']]; - $phpcsFile->addError($error, $stackPtr, 'Found', $data); - } - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'The MySource standard will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Debug/FirebugConsoleSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Debug/FirebugConsoleSniff.php deleted file mode 100644 index 97eae67..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Debug/FirebugConsoleSniff.php +++ /dev/null @@ -1,103 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\MySource\Sniffs\Debug; - -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Files\File; - -class FirebugConsoleSniff implements Sniff, DeprecatedSniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['JS']; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_STRING, - T_PROPERTY, - T_LABEL, - T_OBJECT, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (strtolower($tokens[$stackPtr]['content']) === 'console') { - $error = 'Variables, functions and labels must not be named "console"; name may conflict with Firebug internal variable'; - $phpcsFile->addError($error, $stackPtr, 'ConflictFound'); - } - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'The MySource standard will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Objects/AssignThisSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Objects/AssignThisSniff.php deleted file mode 100644 index 4b2ee49..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Objects/AssignThisSniff.php +++ /dev/null @@ -1,120 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\MySource\Sniffs\Objects; - -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Files\File; - -class AssignThisSniff implements Sniff, DeprecatedSniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['JS']; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_THIS]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Ignore this.something and other uses of "this" that are not - // direct assignments. - $next = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($tokens[$next]['code'] !== T_SEMICOLON) { - if ($tokens[$next]['line'] === $tokens[$stackPtr]['line']) { - return; - } - } - - // Something must be assigned to "this". - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - if ($tokens[$prev]['code'] !== T_EQUAL) { - return; - } - - // A variable needs to be assigned to "this". - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($prev - 1), null, true); - if ($tokens[$prev]['code'] !== T_STRING) { - return; - } - - // We can only assign "this" to a var called "self". - if ($tokens[$prev]['content'] !== 'self' && $tokens[$prev]['content'] !== '_self') { - $error = 'Keyword "this" can only be assigned to a variable called "self" or "_self"'; - $phpcsFile->addError($error, $prev, 'NotSelf'); - } - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'The MySource standard will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Objects/CreateWidgetTypeCallbackSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Objects/CreateWidgetTypeCallbackSniff.php deleted file mode 100644 index 2a15116..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Objects/CreateWidgetTypeCallbackSniff.php +++ /dev/null @@ -1,257 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\MySource\Sniffs\Objects; - -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; - -class CreateWidgetTypeCallbackSniff implements Sniff, DeprecatedSniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['JS']; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_OBJECT]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $className = $phpcsFile->findPrevious(T_STRING, ($stackPtr - 1)); - if (substr(strtolower($tokens[$className]['content']), -10) !== 'widgettype') { - return; - } - - // Search for a create method. - $create = $phpcsFile->findNext(T_PROPERTY, $stackPtr, $tokens[$stackPtr]['bracket_closer'], null, 'create'); - if ($create === false) { - return; - } - - $function = $phpcsFile->findNext([T_WHITESPACE, T_COLON], ($create + 1), null, true); - if ($tokens[$function]['code'] !== T_FUNCTION - && $tokens[$function]['code'] !== T_CLOSURE - ) { - return; - } - - $start = ($tokens[$function]['scope_opener'] + 1); - $end = ($tokens[$function]['scope_closer'] - 1); - - // Check that the first argument is called "callback". - $arg = $phpcsFile->findNext(T_WHITESPACE, ($tokens[$function]['parenthesis_opener'] + 1), null, true); - if ($tokens[$arg]['content'] !== 'callback') { - $error = 'The first argument of the create() method of a widget type must be called "callback"'; - $phpcsFile->addError($error, $arg, 'FirstArgNotCallback'); - } - - /* - Look for return statements within the function. They cannot return - anything and must be preceded by the callback.call() line. The - callback itself must contain "self" or "this" as the first argument - and there needs to be a call to the callback function somewhere - in the create method. All calls to the callback function must be - followed by a return statement or the end of the method. - */ - - $foundCallback = false; - $passedCallback = false; - $nestedFunction = null; - for ($i = $start; $i <= $end; $i++) { - // Keep track of nested functions. - if ($nestedFunction !== null) { - if ($i === $nestedFunction) { - $nestedFunction = null; - continue; - } - } else if (($tokens[$i]['code'] === T_FUNCTION - || $tokens[$i]['code'] === T_CLOSURE) - && isset($tokens[$i]['scope_closer']) === true - ) { - $nestedFunction = $tokens[$i]['scope_closer']; - continue; - } - - if ($nestedFunction === null && $tokens[$i]['code'] === T_RETURN) { - // Make sure return statements are not returning anything. - if ($tokens[($i + 1)]['code'] !== T_SEMICOLON) { - $error = 'The create() method of a widget type must not return a value'; - $phpcsFile->addError($error, $i, 'ReturnValue'); - } - - continue; - } else if ($tokens[$i]['code'] !== T_STRING - || $tokens[$i]['content'] !== 'callback' - ) { - continue; - } - - // If this is the form "callback.call(" then it is a call - // to the callback function. - if ($tokens[($i + 1)]['code'] !== T_OBJECT_OPERATOR - || $tokens[($i + 2)]['content'] !== 'call' - || $tokens[($i + 3)]['code'] !== T_OPEN_PARENTHESIS - ) { - // One last chance; this might be the callback function - // being passed to another function, like this - // "this.init(something, callback, something)". - if (isset($tokens[$i]['nested_parenthesis']) === false) { - continue; - } - - // Just make sure those brackets don't belong to anyone, - // like an IF or FOR statement. - foreach ($tokens[$i]['nested_parenthesis'] as $bracket) { - if (isset($tokens[$bracket]['parenthesis_owner']) === true) { - continue(2); - } - } - - // Note that we use this endBracket down further when checking - // for a RETURN statement. - $nestedParens = $tokens[$i]['nested_parenthesis']; - $endBracket = end($nestedParens); - $bracket = key($nestedParens); - - $prev = $phpcsFile->findPrevious( - Tokens::$emptyTokens, - ($bracket - 1), - null, - true - ); - - if ($tokens[$prev]['code'] !== T_STRING) { - // This is not a function passing the callback. - continue; - } - - $passedCallback = true; - }//end if - - $foundCallback = true; - - if ($passedCallback === false) { - // The first argument must be "this" or "self". - $arg = $phpcsFile->findNext(T_WHITESPACE, ($i + 4), null, true); - if ($tokens[$arg]['content'] !== 'this' - && $tokens[$arg]['content'] !== 'self' - ) { - $error = 'The first argument passed to the callback function must be "this" or "self"'; - $phpcsFile->addError($error, $arg, 'FirstArgNotSelf'); - } - } - - // Now it must be followed by a return statement or the end of the function. - if ($passedCallback === false) { - $endBracket = $tokens[($i + 3)]['parenthesis_closer']; - } - - for ($next = $endBracket; $next <= $end; $next++) { - // Skip whitespace so we find the next content after the call. - if (isset(Tokens::$emptyTokens[$tokens[$next]['code']]) === true) { - continue; - } - - // Skip closing braces like END IF because it is not executable code. - if ($tokens[$next]['code'] === T_CLOSE_CURLY_BRACKET) { - continue; - } - - // We don't care about anything on the current line, like a - // semicolon. It doesn't matter if there are other statements on the - // line because another sniff will check for those. - if ($tokens[$next]['line'] === $tokens[$endBracket]['line']) { - continue; - } - - break; - } - - if ($next !== $tokens[$function]['scope_closer'] - && $tokens[$next]['code'] !== T_RETURN - ) { - $error = 'The call to the callback function must be followed by a return statement if it is not the last statement in the create() method'; - $phpcsFile->addError($error, $i, 'NoReturn'); - } - }//end for - - if ($foundCallback === false) { - $error = 'The create() method of a widget type must call the callback function'; - $phpcsFile->addError($error, $create, 'CallbackNotCalled'); - } - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'The MySource standard will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Objects/DisallowNewWidgetSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Objects/DisallowNewWidgetSniff.php deleted file mode 100644 index a191083..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Objects/DisallowNewWidgetSniff.php +++ /dev/null @@ -1,98 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\MySource\Sniffs\Objects; - -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Files\File; - -class DisallowNewWidgetSniff implements Sniff, DeprecatedSniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_NEW]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $className = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($tokens[$className]['code'] !== T_STRING) { - return; - } - - if (substr(strtolower($tokens[$className]['content']), -10) === 'widgettype') { - $widgetType = substr($tokens[$className]['content'], 0, -10); - $error = 'Manual creation of widget objects is banned; use Widget::getWidget(\'%s\'); instead'; - $data = [$widgetType]; - $phpcsFile->addError($error, $stackPtr, 'Found', $data); - } - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'The MySource standard will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/PHP/AjaxNullComparisonSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/PHP/AjaxNullComparisonSniff.php deleted file mode 100644 index cfd0756..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/PHP/AjaxNullComparisonSniff.php +++ /dev/null @@ -1,142 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\MySource\Sniffs\PHP; - -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Files\File; - -class AjaxNullComparisonSniff implements Sniff, DeprecatedSniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_FUNCTION]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Make sure it is an API function. We know this by the doc comment. - $commentEnd = $phpcsFile->findPrevious(T_DOC_COMMENT_CLOSE_TAG, $stackPtr); - $commentStart = $phpcsFile->findPrevious(T_DOC_COMMENT_OPEN_TAG, ($commentEnd - 1)); - // If function doesn't contain any doc comments - skip it. - if ($commentEnd === false || $commentStart === false) { - return; - } - - $comment = $phpcsFile->getTokensAsString($commentStart, ($commentEnd - $commentStart)); - if (strpos($comment, '* @api') === false) { - return; - } - - // Find all the vars passed in as we are only interested in comparisons - // to NULL for these specific variables. - $foundVars = []; - $open = $tokens[$stackPtr]['parenthesis_opener']; - $close = $tokens[$stackPtr]['parenthesis_closer']; - for ($i = ($open + 1); $i < $close; $i++) { - if ($tokens[$i]['code'] === T_VARIABLE) { - $foundVars[$tokens[$i]['content']] = true; - } - } - - if (empty($foundVars) === true) { - return; - } - - $start = $tokens[$stackPtr]['scope_opener']; - $end = $tokens[$stackPtr]['scope_closer']; - for ($i = ($start + 1); $i < $end; $i++) { - if ($tokens[$i]['code'] !== T_VARIABLE - || isset($foundVars[$tokens[$i]['content']]) === false - ) { - continue; - } - - $operator = $phpcsFile->findNext(T_WHITESPACE, ($i + 1), null, true); - if ($tokens[$operator]['code'] !== T_IS_IDENTICAL - && $tokens[$operator]['code'] !== T_IS_NOT_IDENTICAL - ) { - continue; - } - - $nullValue = $phpcsFile->findNext(T_WHITESPACE, ($operator + 1), null, true); - if ($tokens[$nullValue]['code'] !== T_NULL) { - continue; - } - - $error = 'Values submitted via Ajax requests should not be compared directly to NULL; use empty() instead'; - $phpcsFile->addWarning($error, $nullValue, 'Found'); - }//end for - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'The MySource standard will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/PHP/EvalObjectFactorySniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/PHP/EvalObjectFactorySniff.php deleted file mode 100644 index ac6e131..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/PHP/EvalObjectFactorySniff.php +++ /dev/null @@ -1,153 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\MySource\Sniffs\PHP; - -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; - -class EvalObjectFactorySniff implements Sniff, DeprecatedSniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_EVAL]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - /* - We need to find all strings that will be in the eval - to determine if the "new" keyword is being used. - */ - - $openBracket = $phpcsFile->findNext(T_OPEN_PARENTHESIS, ($stackPtr + 1)); - $closeBracket = $tokens[$openBracket]['parenthesis_closer']; - - $strings = []; - $vars = []; - - for ($i = ($openBracket + 1); $i < $closeBracket; $i++) { - if (isset(Tokens::$stringTokens[$tokens[$i]['code']]) === true) { - $strings[$i] = $tokens[$i]['content']; - } else if ($tokens[$i]['code'] === T_VARIABLE) { - $vars[$i] = $tokens[$i]['content']; - } - } - - /* - We now have some variables that we need to expand into - the strings that were assigned to them, if any. - */ - - foreach ($vars as $varPtr => $varName) { - while (($prev = $phpcsFile->findPrevious(T_VARIABLE, ($varPtr - 1))) !== false) { - // Make sure this is an assignment of the variable. That means - // it will be the first thing on the line. - $prevContent = $phpcsFile->findPrevious(T_WHITESPACE, ($prev - 1), null, true); - if ($tokens[$prevContent]['line'] === $tokens[$prev]['line']) { - $varPtr = $prevContent; - continue; - } - - if ($tokens[$prev]['content'] !== $varName) { - // This variable has a different name. - $varPtr = $prevContent; - continue; - } - - // We found one. - break; - }//end while - - if ($prev !== false) { - // Find all strings on the line. - $lineEnd = $phpcsFile->findNext(T_SEMICOLON, ($prev + 1)); - for ($i = ($prev + 1); $i < $lineEnd; $i++) { - if (isset(Tokens::$stringTokens[$tokens[$i]['code']]) === true) { - $strings[$i] = $tokens[$i]['content']; - } - } - } - }//end foreach - - foreach ($strings as $string) { - // If the string has "new" in it, it is not allowed. - // We don't bother checking if the word "new" is printed to screen - // because that is unlikely to happen. We assume the use - // of "new" is for object instantiation. - if (strstr($string, ' new ') !== false) { - $error = 'Do not use eval() to create objects dynamically; use reflection instead'; - $phpcsFile->addWarning($error, $stackPtr, 'Found'); - } - } - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'The MySource standard will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/PHP/GetRequestDataSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/PHP/GetRequestDataSniff.php deleted file mode 100644 index 44b733d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/PHP/GetRequestDataSniff.php +++ /dev/null @@ -1,145 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\MySource\Sniffs\PHP; - -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Files\File; - -class GetRequestDataSniff implements Sniff, DeprecatedSniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_VARIABLE]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $varName = $tokens[$stackPtr]['content']; - if ($varName !== '$_REQUEST' - && $varName !== '$_GET' - && $varName !== '$_POST' - && $varName !== '$_FILES' - ) { - return; - } - - // The only place these super globals can be accessed directly is - // in the getRequestData() method of the Security class. - $inClass = false; - foreach ($tokens[$stackPtr]['conditions'] as $i => $type) { - if ($tokens[$i]['code'] === T_CLASS) { - $className = $phpcsFile->findNext(T_STRING, $i); - $className = $tokens[$className]['content']; - if (strtolower($className) === 'security') { - $inClass = true; - } else { - // We don't have nested classes. - break; - } - } else if ($inClass === true && $tokens[$i]['code'] === T_FUNCTION) { - $funcName = $phpcsFile->findNext(T_STRING, $i); - $funcName = $tokens[$funcName]['content']; - if (strtolower($funcName) === 'getrequestdata') { - // This is valid. - return; - } else { - // We don't have nested functions. - break; - } - }//end if - }//end foreach - - // If we get to here, the super global was used incorrectly. - // First find out how it is being used. - $globalName = strtolower(substr($varName, 2)); - $usedVar = ''; - - $openBracket = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($tokens[$openBracket]['code'] === T_OPEN_SQUARE_BRACKET) { - $closeBracket = $tokens[$openBracket]['bracket_closer']; - $usedVar = $phpcsFile->getTokensAsString(($openBracket + 1), ($closeBracket - $openBracket - 1)); - } - - $type = 'SuperglobalAccessed'; - $error = 'The %s super global must not be accessed directly; use Security::getRequestData('; - $data = [$varName]; - if ($usedVar !== '') { - $type .= 'WithVar'; - $error .= '%s, \'%s\''; - $data[] = $usedVar; - $data[] = $globalName; - } - - $error .= ') instead'; - $phpcsFile->addError($error, $stackPtr, $type, $data); - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'The MySource standard will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/PHP/ReturnFunctionValueSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/PHP/ReturnFunctionValueSniff.php deleted file mode 100644 index 7a7adde..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/PHP/ReturnFunctionValueSniff.php +++ /dev/null @@ -1,102 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\MySource\Sniffs\PHP; - -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Files\File; - -class ReturnFunctionValueSniff implements Sniff, DeprecatedSniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_RETURN]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $functionName = $phpcsFile->findNext(T_STRING, ($stackPtr + 1), null, false, null, true); - - while ($functionName !== false) { - // Check if this is really a function. - $bracket = $phpcsFile->findNext(T_WHITESPACE, ($functionName + 1), null, true); - if ($tokens[$bracket]['code'] !== T_OPEN_PARENTHESIS) { - // Not a function call. - $functionName = $phpcsFile->findNext(T_STRING, ($functionName + 1), null, false, null, true); - continue; - } - - $error = 'The result of a function call should be assigned to a variable before being returned'; - $phpcsFile->addWarning($error, $stackPtr, 'NotAssigned'); - break; - } - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'The MySource standard will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Strings/JoinStringsSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Strings/JoinStringsSniff.php deleted file mode 100644 index 04d89bb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Sniffs/Strings/JoinStringsSniff.php +++ /dev/null @@ -1,115 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\MySource\Sniffs\Strings; - -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; - -class JoinStringsSniff implements Sniff, DeprecatedSniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['JS']; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_STRING]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param integer $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['content'] !== 'join') { - return; - } - - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($tokens[$prev]['code'] !== T_OBJECT_OPERATOR) { - return; - } - - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($prev - 1), null, true); - if ($tokens[$prev]['code'] === T_CLOSE_SQUARE_BRACKET) { - $opener = $tokens[$prev]['bracket_opener']; - if ($tokens[($opener - 1)]['code'] !== T_STRING) { - // This means the array is declared inline, like x = [a,b,c].join() - // and not elsewhere, like x = y[a].join() - // The first is not allowed while the second is. - $error = 'Joining strings using inline arrays is not allowed; use the + operator instead'; - $phpcsFile->addError($error, $stackPtr, 'ArrayNotAllowed'); - } - } - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'The MySource standard will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/CSS/BrowserSpecificStylesUnitTest.css b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/CSS/BrowserSpecificStylesUnitTest.css deleted file mode 100644 index 339ee15..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/CSS/BrowserSpecificStylesUnitTest.css +++ /dev/null @@ -1,13 +0,0 @@ -.SettingsTabPaneWidgetType-tab-mid { - background: transparent url(tab_inact_mid.png) repeat-x; - line-height: -25px; - cursor: pointer; - -moz-user-select: none; -} - -.AssetLineageWidgetType-item { - float: left; - list-style: none; - height: 22px; - cursor: pointer; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/CSS/BrowserSpecificStylesUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/CSS/BrowserSpecificStylesUnitTest.php deleted file mode 100644 index dadc15a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/CSS/BrowserSpecificStylesUnitTest.php +++ /dev/null @@ -1,53 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Tests\CSS; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the BrowserSpecificStyles sniff. - * - * @covers PHP_CodeSniffer\Standards\MySource\Sniffs\CSS\BrowserSpecificStylesSniff - */ -final class BrowserSpecificStylesUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [5 => 1]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/DisallowSelfActionsUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/DisallowSelfActionsUnitTest.inc deleted file mode 100644 index 95fd04b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/DisallowSelfActionsUnitTest.inc +++ /dev/null @@ -1,51 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/DisallowSelfActionsUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/DisallowSelfActionsUnitTest.php deleted file mode 100644 index 6885ec1..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/DisallowSelfActionsUnitTest.php +++ /dev/null @@ -1,58 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Tests\Channels; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the DisallowSelfActions sniff. - * - * @covers PHP_CodeSniffer\Standards\MySource\Sniffs\Channels\DisallowSelfActionsSniff - */ -final class DisallowSelfActionsUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 12 => 1, - 13 => 1, - 28 => 1, - 29 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/IncludeSystemUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/IncludeSystemUnitTest.inc deleted file mode 100644 index ccb0273..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/IncludeSystemUnitTest.inc +++ /dev/null @@ -1,112 +0,0 @@ -fetch(PDO::FETCH_NUM) -BaseSystem::getDataDir(); -Util::getArrayIndex(array(), ''); - - -Channels::includeSystem('Widget'); -Widget::includeWidget('AbstractContainer'); -class MyWidget extends AbstractContainerWidgetType {} -class MyOtherWidget extends BookWidgetType {} - -$zip = new ZipArchive(); -$res = $zip->open($path, ZipArchive::CREATE); - -class AssetListingUnitTest extends AbstractMySourceUnitTest -{ - function setUp() { - parent::setUp(); - Channels::includeSystem('MySystem2'); - include_once 'Libs/FileSystem.inc'; - } - - function two() { - $siteid = MySystem2::getCurrentSiteId(); - $parserFiles = FileSystem::listDirectory(); - } - - function three() { - $siteid = MySystem3::getCurrentSiteId(); - $parserFiles = FileSystem::listDirectory(); - } -} - -if (Channels::systemExists('Log') === TRUE) { - Channels::includeSystem('Log'); -} else { - return; -} - -Log::addProjectLog('metadata.field.update', $msg); - -function two() { - Widget::includeWidget('CacheAdminScreen'); - $barChart = CacheAdminScreenWidgetType::constructBarchart($data); -} - -$adjustDialog->setOrientation(AbstractWidgetWidgetType::CENTER); - -$className = 'SquizPerspective'.ucfirst($property['type']).'PropertyType'; -Channels::includeSystem($className); -$className::setValue($assetid, $propertyid, $perspectives, $value, (array) $property['settings']); -?> diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/IncludeSystemUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/IncludeSystemUnitTest.php deleted file mode 100644 index c396a44..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/IncludeSystemUnitTest.php +++ /dev/null @@ -1,65 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Tests\Channels; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the IncludeSystem sniff. - * - * @covers PHP_CodeSniffer\Standards\MySource\Sniffs\Channels\IncludeSystemSniff - */ -final class IncludeSystemUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 9 => 1, - 14 => 1, - 24 => 1, - 27 => 1, - 28 => 1, - 31 => 1, - 36 => 1, - 41 => 1, - 61 => 1, - 70 => 1, - 89 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/UnusedSystemUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/UnusedSystemUnitTest.inc deleted file mode 100644 index c7bd473..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/UnusedSystemUnitTest.inc +++ /dev/null @@ -1,67 +0,0 @@ - \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/UnusedSystemUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/UnusedSystemUnitTest.php deleted file mode 100644 index bd8694b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Channels/UnusedSystemUnitTest.php +++ /dev/null @@ -1,60 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Tests\Channels; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the UnusedSystem sniff. - * - * @covers PHP_CodeSniffer\Standards\MySource\Sniffs\Channels\UnusedSystemSniff - */ -final class UnusedSystemUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 2 => 1, - 5 => 1, - 8 => 1, - 24 => 1, - 34 => 1, - 54 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Commenting/FunctionCommentUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Commenting/FunctionCommentUnitTest.inc deleted file mode 100644 index 19d5c5d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Commenting/FunctionCommentUnitTest.inc +++ /dev/null @@ -1,101 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Commenting/FunctionCommentUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Commenting/FunctionCommentUnitTest.php deleted file mode 100644 index c8cbda8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Commenting/FunctionCommentUnitTest.php +++ /dev/null @@ -1,59 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Tests\Commenting; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the FunctionComment sniff. - * - * @covers PHP_CodeSniffer\Standards\MySource\Sniffs\Commenting\FunctionCommentSniff - */ -final class FunctionCommentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 28 => 1, - 36 => 1, - 37 => 2, - 49 => 1, - 58 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Debug/DebugCodeUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Debug/DebugCodeUnitTest.inc deleted file mode 100644 index 3490161..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Debug/DebugCodeUnitTest.inc +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Debug/DebugCodeUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Debug/DebugCodeUnitTest.php deleted file mode 100644 index 42adcf0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Debug/DebugCodeUnitTest.php +++ /dev/null @@ -1,56 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Tests\Debug; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the DebugCode sniff. - * - * @covers PHP_CodeSniffer\Standards\MySource\Sniffs\Debug\DebugCodeSniff - */ -final class DebugCodeUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 2 => 1, - 3 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Debug/FirebugConsoleUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Debug/FirebugConsoleUnitTest.js deleted file mode 100644 index d5e3df5..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Debug/FirebugConsoleUnitTest.js +++ /dev/null @@ -1,8 +0,0 @@ -console.info(); -console.warn(); -console.test(); -con.sole(); -var console = { - console: 'string'; -}; -function console() {} \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Debug/FirebugConsoleUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Debug/FirebugConsoleUnitTest.php deleted file mode 100644 index 055467a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Debug/FirebugConsoleUnitTest.php +++ /dev/null @@ -1,66 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Tests\Debug; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the FirebugConsole sniff. - * - * @covers PHP_CodeSniffer\Standards\MySource\Sniffs\Debug\FirebugConsoleSniff - */ -final class FirebugConsoleUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - if ($testFile !== 'FirebugConsoleUnitTest.js') { - return []; - } - - return [ - 1 => 1, - 2 => 1, - 3 => 1, - 5 => 1, - 6 => 1, - 8 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/AssignThisUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/AssignThisUnitTest.js deleted file mode 100644 index 747a100..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/AssignThisUnitTest.js +++ /dev/null @@ -1,20 +0,0 @@ -var self = this; -buttonWidget.addClickEvent(function() { - self.addDynamicSouce(); -}); - -var x = self; -var y = this; - -var test = ''; -if (true) { - test = this -} - -var itemid = this.items[i].getAttribute('itemid'); - -for (var x = this; y < 10; y++) { - var x = this + 1; -} - -var _self = this; \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/AssignThisUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/AssignThisUnitTest.php deleted file mode 100644 index a8da14a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/AssignThisUnitTest.php +++ /dev/null @@ -1,63 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Tests\Objects; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the AssignThis sniff. - * - * @covers PHP_CodeSniffer\Standards\MySource\Sniffs\Objects\AssignThisSniff - */ -final class AssignThisUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - if ($testFile !== 'AssignThisUnitTest.js') { - return []; - } - - return [ - 7 => 1, - 11 => 1, - 16 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/CreateWidgetTypeCallbackUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/CreateWidgetTypeCallbackUnitTest.js deleted file mode 100644 index 22822d3..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/CreateWidgetTypeCallbackUnitTest.js +++ /dev/null @@ -1,186 +0,0 @@ -SampleWidgetType.prototype = { - - create: function(callback) - { - if (x === 1) { - return; - } - - if (y === 1) { - callback.call(this); - // A comment here to explain the return is okay. - return; - } - - if (a === 1) { - // Cant return value even after calling callback. - callback.call(this); - return something; - } - - if (a === 1) { - // Need to pass self or this to callback function. - callback.call(a); - } - - callback.call(self); - - var self = this; - this.createChildren(null, function() { - callback.call(self, div); - }); - - // Never good to return a value. - return something; - - callback.call(self); - } - -}; - -AnotherSampleWidgetType.prototype = { - - create: function(input) - { - return; - } - - getSomething: function(input) - { - return 1; - } - -}; - - -NoCreateWidgetType.prototype = { - - getSomething: function(input) - { - return; - } - -}; - - -SomeRandom.prototype = { - - create: function(input) - { - return; - } - -}; - -SampleWidgetType.prototype = { - - create: function(callback) - { - if (a === 1) { - // This is ok because it is the last statement, - // even though it is conditional. - callback.call(self); - } - - } - -}; - -SampleWidgetType.prototype = { - - create: function(callback) - { - var something = callback; - - } - -}; - -SampleWidgetType.prototype = { - - create: function(callback) - { - // Also valid because we are passing the callback to - // someone else to call. - if (y === 1) { - this.something(callback); - return; - } - - this.init(callback); - - } - -}; - -SampleWidgetType.prototype = { - - create: function(callback) - { - // Also valid because we are passing the callback to - // someone else to call. - if (y === 1) { - this.something(callback); - } - - this.init(callback); - - } - -}; - -SampleWidgetType.prototype = { - - create: function(callback) - { - if (a === 1) { - // This is ok because it is the last statement, - // even though it is conditional. - this.something(callback); - } - - } - -}; - - -SampleWidgetType.prototype = { - - create: function(callback) - { - if (dfx.isFn(callback) === true) { - callback.call(this, cont); - return; - } - } - -}; - - -SampleWidgetType.prototype = { - - create: function(callback) - { - dfx.foreach(items, function(item) { - return true; - }); - - if (dfx.isFn(callback) === true) { - callback.call(this); - } - } - -}; - -SampleWidgetType.prototype = { - - create: function(callback) - { - var self = this; - this.createChildren(null, function() { - callback.call(self, div); - return; - }); - } - -}; \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/CreateWidgetTypeCallbackUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/CreateWidgetTypeCallbackUnitTest.php deleted file mode 100644 index 3aed80c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/CreateWidgetTypeCallbackUnitTest.php +++ /dev/null @@ -1,62 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Tests\Objects; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the CreateWidgetTypeCallback sniff. - * - * @covers PHP_CodeSniffer\Standards\MySource\Sniffs\Objects\CreateWidgetTypeCallbackSniff - */ -final class CreateWidgetTypeCallbackUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 18 => 1, - 23 => 2, - 26 => 1, - 30 => 1, - 34 => 1, - 43 => 2, - 91 => 1, - 123 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/DisallowNewWidgetUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/DisallowNewWidgetUnitTest.inc deleted file mode 100644 index acf9baf..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/DisallowNewWidgetUnitTest.inc +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/DisallowNewWidgetUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/DisallowNewWidgetUnitTest.php deleted file mode 100644 index 10a858b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Objects/DisallowNewWidgetUnitTest.php +++ /dev/null @@ -1,53 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Tests\Objects; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the DisallowNewWidget sniff. - * - * @covers PHP_CodeSniffer\Standards\MySource\Sniffs\Objects\DisallowNewWidgetSniff - */ -final class DisallowNewWidgetUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [4 => 1]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/AjaxNullComparisonUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/AjaxNullComparisonUnitTest.inc deleted file mode 100644 index 337914a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/AjaxNullComparisonUnitTest.inc +++ /dev/null @@ -1,182 +0,0 @@ -getMessage()); - }//end try - - if ($something === NULL) { - if ($bar !== NULL) { - } - } - - return $issueid; - -}//end addIssue() - -/** - * Adds a new issue. - * - * Returns the new issue id. - * - * @param string $title Title of the new issue. - * @param string $description The description of the issue. - * @param string $reporter Asset id of the reporter. - * @param integer $projectid Id of the project that the issue belongs to. - * @param array $tags Array of tags. - * @param string $status The status of the issue. - * @param string $assignedTo The asset id of the user that the issue is - * assigned to. - * @param string $reportedDate If set then this date will be used instead of the - * current date and time. - * @param integer $reportedMilestone Reported milestone. - * - * @return integer - * @throws ChannelException If there is an error. - * - */ -public static function addIssue( - $title, - $description, - $reporter=NULL, - $projectid=NULL, - array $tags=array(), - $status=NULL, - $assignedTo=NULL, - $reportedDate=NULL, - $reportedMilestone=NULL -) { - // Get current projectid if not specified. - if ($projectid === NULL) { - Channels::includeSystem('Project'); - $projectid = Project::getCurrentProjectId(); - Channels::modifyBasket('project', $projectid); - } - -}//end addIssue() diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/AjaxNullComparisonUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/AjaxNullComparisonUnitTest.php deleted file mode 100644 index d6cec05..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/AjaxNullComparisonUnitTest.php +++ /dev/null @@ -1,60 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the AjaxNullComparison sniff. - * - * @covers PHP_CodeSniffer\Standards\MySource\Sniffs\PHP\AjaxNullComparisonSniff - */ -final class AjaxNullComparisonUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return []; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [ - 41 => 1, - 53 => 1, - 64 => 1, - 77 => 1, - 92 => 1, - 122 => 1, - ]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/EvalObjectFactoryUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/EvalObjectFactoryUnitTest.inc deleted file mode 100644 index 992a7dc..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/EvalObjectFactoryUnitTest.inc +++ /dev/null @@ -1,26 +0,0 @@ - \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/EvalObjectFactoryUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/EvalObjectFactoryUnitTest.php deleted file mode 100644 index 9cd1f09..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/EvalObjectFactoryUnitTest.php +++ /dev/null @@ -1,57 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the EvalObjectFactory sniff. - * - * @covers PHP_CodeSniffer\Standards\MySource\Sniffs\PHP\EvalObjectFactorySniff - */ -final class EvalObjectFactoryUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return []; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [ - 4 => 1, - 12 => 1, - 21 => 1, - ]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/GetRequestDataUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/GetRequestDataUnitTest.inc deleted file mode 100644 index 7999763..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/GetRequestDataUnitTest.inc +++ /dev/null @@ -1,30 +0,0 @@ - \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/GetRequestDataUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/GetRequestDataUnitTest.php deleted file mode 100644 index c3d6136..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/GetRequestDataUnitTest.php +++ /dev/null @@ -1,61 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the GetRequestData sniff. - * - * @covers PHP_CodeSniffer\Standards\MySource\Sniffs\PHP\GetRequestDataSniff - */ -final class GetRequestDataUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 2 => 1, - 5 => 1, - 8 => 1, - 21 => 1, - 26 => 1, - 27 => 1, - 28 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/ReturnFunctionValueUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/ReturnFunctionValueUnitTest.inc deleted file mode 100644 index f9148a7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/ReturnFunctionValueUnitTest.inc +++ /dev/null @@ -1,9 +0,0 @@ -myFunction(); -return $obj->variable; -return MyClass::VARIABLE; -return $variable; -return ($var + 1); -?> \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/ReturnFunctionValueUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/ReturnFunctionValueUnitTest.php deleted file mode 100644 index c0f62ee..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/PHP/ReturnFunctionValueUnitTest.php +++ /dev/null @@ -1,57 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ReturnFunctionValue sniff. - * - * @covers PHP_CodeSniffer\Standards\MySource\Sniffs\PHP\ReturnFunctionValueSniff - */ -final class ReturnFunctionValueUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return []; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [ - 2 => 1, - 3 => 1, - 4 => 1, - ]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Strings/JoinStringsUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Strings/JoinStringsUnitTest.js deleted file mode 100644 index 46d90cf..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Strings/JoinStringsUnitTest.js +++ /dev/null @@ -1,18 +0,0 @@ -one = (1 + 2); -two = (one + 2); -two = (one + one); -three = ('1' + 2); - -four = ['1', two].join(); -four = ['1', two].join(''); -four = ['1', [one, two].join(',')].join(' '); -four = ['1', [one, two].join()].join(' '); -four = ['1', [one, two].join()].join(); - -five = 'string' + ['1', [one, two].join()].join() + 'string'; - -six = myArray.join(' '); -six = [arrayOne, arrayTwo].join(); - -// This is fine because the array is not created inline. -var x = 'x' + test[x].join('p') + 't'; \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Strings/JoinStringsUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Strings/JoinStringsUnitTest.php deleted file mode 100644 index c2f798d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/Tests/Strings/JoinStringsUnitTest.php +++ /dev/null @@ -1,67 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\MySource\Tests\Strings; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the JoinStrings sniff. - * - * @covers PHP_CodeSniffer\Standards\MySource\Sniffs\Strings\JoinStringsSniff - */ -final class JoinStringsUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - if ($testFile !== 'JoinStringsUnitTest.js') { - return []; - } - - return [ - 6 => 1, - 7 => 1, - 8 => 2, - 9 => 2, - 10 => 2, - 12 => 2, - 15 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/ruleset.xml b/vendor/squizlabs/php_codesniffer/src/Standards/MySource/ruleset.xml deleted file mode 100644 index 9240795..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/MySource/ruleset.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - The MySource coding standard builds on the Squiz coding standard. Currently used for MySource Mini development. - - */Tests/* - */Oven/* - */data/* - */jquery.js - */jquery.*.js - */viper/* - DALConf.inc - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Classes/ClassDeclarationStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Classes/ClassDeclarationStandard.xml deleted file mode 100644 index c6de4fe..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Classes/ClassDeclarationStandard.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - { -} - ]]> - - - { -} - -class BlankLineBetween - -{ -} - ]]> - - - - - { -} - ]]> - - - public function __construct() {} -} - ]]> - - - - - - - - { - } -} - -class NotIndented -{ -} - ]]> - - - { -} -} - -class NotIndented - { - } - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Commenting/ClassCommentStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Commenting/ClassCommentStandard.xml deleted file mode 100644 index fe81620..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Commenting/ClassCommentStandard.xml +++ /dev/null @@ -1,177 +0,0 @@ - - - - - - - /** - * The Foo class. - */ -class Foo -{ -} - ]]> - - - - - - - - /** - * The Foo class. - */ -class Foo -{ -} - ]]> - - - - - - - - /** - * The Foo class. - */ -class Foo -{ -} - ]]> - - - /** - * The Foo class. - */ - -class Foo -{ -} - ]]> - - - - - The Foo class. - */ -class Foo -{ -} - ]]> - - - The Foo class. - */ -class Foo -{ -} - ]]> - - - - - - * A helper for the Bar class. - * - * @see Bar - */ -class Foo -{ -} - ]]> - - - - * - * A helper for the Bar class. - * - * - * @see Bar - */ -class Foo -{ -} - ]]> - - - - - - * @see Bar - */ -class Foo -{ -} - ]]> - - - - * - * @see Bar - */ -class Foo -{ -} - ]]> - - - - - Release: 1.0 - */ -class Foo -{ -} - ]]> - - - 1.0 - */ -class Foo -{ -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Commenting/FileCommentStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Commenting/FileCommentStandard.xml deleted file mode 100644 index 190670f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Commenting/FileCommentStandard.xml +++ /dev/null @@ -1,293 +0,0 @@ - - - - - - - /** - * Short description here. - * - * PHP version 5 - * - * @category Foo - * @package Foo_Helpers - * @author Marty McFly - * @copyright 2013-2014 Foo Inc. - * @license MIT License - * @link http://example.com - */ - ]]> - - - - ]]> - - - - - Short description here. - * - * PHP version 5 - * - * @category Foo - * @package Foo_Helpers - * @author Marty McFly - * @copyright 2013-2014 Foo Inc. - * @license MIT License - * @link http://example.com - */ - ]]> - - - - * Short description here. - * - * PHP version 5 - * - * @category Foo - * @package Foo_Helpers - * @author Marty McFly - * @copyright 2013-2014 Foo Inc. - * @license MIT License - * @link http://example.com - */ - ]]> - - - - - - * PHP version 5 - * - * @category Foo - * @package Foo_Helpers - * @author Marty McFly - * @copyright 2013-2014 Foo Inc. - * @license MIT License - * @link http://example.com - */ - ]]> - - - - * - * PHP version 5 - * - * - * @category Foo - * @package Foo_Helpers - * @author Marty McFly - * @copyright 2013-2014 Foo Inc. - * @license MIT License - * @link http://example.com - */ - ]]> - - - - - - * @category Foo - * @package Foo_Helpers - * @author Marty McFly - * @copyright 2013-2014 Foo Inc. - * @license MIT License - * @link http://example.com - */ - ]]> - - - - * - * @category Foo - * @package Foo_Helpers - * @author Marty McFly - * @copyright 2013-2014 Foo Inc. - * @license MIT License - * @link http://example.com - */ - ]]> - - - - - @category Foo - * @package Foo_Helpers - * @author Marty McFly - * @copyright 2013-2014 Foo Inc. - * @license MIT License - * @link http://example.com - */ - ]]> - - - - - - - - @category Foo - * @package Foo_Helpers - * @author Marty McFly - * @copyright 2013-2014 Foo Inc. - * @license MIT License - * @link http://example.com - */ - ]]> - - - @category Foo - * @category Bar - * @package Foo_Helpers - * @author Marty McFly - * @copyright 2013-2014 Foo Inc. - * @license MIT License - * @link http://example.com - */ - ]]> - - - - - PHP version 5 - * - * @category Foo - * @package Foo_Helpers - * @author Marty McFly - * @copyright 2013-2014 Foo Inc. - * @license MIT License - * @link http://example.com - */ - ]]> - - - - * @copyright 2013-2014 Foo Inc. - * @license MIT License - * @link http://example.com - */ - ]]> - - - - - - * @copyright 2013-2014 Foo Inc. - * @license MIT License - * @link http://example.com - */ - ]]> - - - @package Foo_Helpers - * @category Foo - * @author Marty McFly - * @copyright 2013-2014 Foo Inc. - * @license MIT License - * @link http://example.com - */ - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Commenting/FunctionCommentStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Commenting/FunctionCommentStandard.xml deleted file mode 100644 index 621649f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Commenting/FunctionCommentStandard.xml +++ /dev/null @@ -1,230 +0,0 @@ - - - - - - - /** - * Short description here. - * - * @return void - */ - function foo() - { - } - ]]> - - - - - - - - Short description here. - * - * @return void - */ - function foo() - { - } - ]]> - - - - * Short description here. - * - * @return void - */ - function foo() - { - } - ]]> - - - - - - * Long description here. - * - * @return void - */ - function foo() - { - } - ]]> - - - - * - * Long description here. - * - * - * @return void - */ - function foo() - { - } - ]]> - - - - - - * @return void - */ - function foo() - { - } - ]]> - - - - * - * @return void - */ - function foo() - { - } - ]]> - - - - - FooException - */ - function foo() - { - } - ]]> - - - @throws - */ - function foo() - { - } - ]]> - - - - - @return void - */ - function foo() - { - } - ]]> - - - - - - - - $foo Foo parameter - * @param string $bar Bar parameter - * @return void - */ - function foo($foo, $bar) - { - } - ]]> - - - $qux Bar parameter - * @return void - */ - function foo($foo, $bar) - { - } - ]]> - - - - - $foo Foo parameter - * @param string $bar Bar parameter - * @return void - */ - function foo($foo, $bar) - { - } - ]]> - - - $bar Bar parameter - * @param string $foo Foo parameter - * @return void - */ - function foo($foo, $bar) - { - } - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Commenting/InlineCommentStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Commenting/InlineCommentStandard.xml deleted file mode 100644 index 53056e2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Commenting/InlineCommentStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - // A comment. - ]]> - - - # A comment. - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/ControlStructures/ControlSignatureStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/ControlStructures/ControlSignatureStandard.xml deleted file mode 100644 index ce430fb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/ControlStructures/ControlSignatureStandard.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - ($foo) { -} - ]]> - - - ($foo){ -} - ]]> - - - - - { -} - ]]> - - - { -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/ControlStructures/MultiLineConditionStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/ControlStructures/MultiLineConditionStandard.xml deleted file mode 100644 index 96d451d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/ControlStructures/MultiLineConditionStandard.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - && $bar -) { -} - ]]> - - - && $bar -) { -} - ]]> - - - - - && $bar -) { -} - ]]> - - - && - $bar -) { -} - ]]> - - - - - ) { -} - ]]> - - - ) { -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Files/IncludingFileStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Files/IncludingFileStandard.xml deleted file mode 100644 index 912fa5e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Files/IncludingFileStandard.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - require_once. Anywhere you are conditionally including a class file (for example, factory methods), use include_once. Either of these will ensure that class files are included only once. They share the same file list, so you don't need to worry about mixing them - a file included with require_once will not be included again by include_once. - ]]> - - - include_once and require_once are statements, not functions. Parentheses should not surround the subject filename. - ]]> - - - - - - - ('PHP/CodeSniffer.php'); - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Formatting/MultiLineAssignmentStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Formatting/MultiLineAssignmentStandard.xml deleted file mode 100644 index e825c55..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Formatting/MultiLineAssignmentStandard.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - = $bar; - ]]> - - - = - $bar; - ]]> - - - - - = $bar; - ]]> - - - = $bar; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Functions/FunctionCallSignatureStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Functions/FunctionCallSignatureStandard.xml deleted file mode 100644 index 2f539c9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Functions/FunctionCallSignatureStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - ( $bar, $baz, $quux ) ; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Functions/FunctionDeclarationStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Functions/FunctionDeclarationStandard.xml deleted file mode 100644 index ced9ae2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Functions/FunctionDeclarationStandard.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - () use ($bar) { -}; - ]]> - - - ()use($bar){ -}; - ]]> - - - - - $bar, - $baz -) { -}; - ]]> - - - $bar, -$baz) -{ -}; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Functions/ValidDefaultValueStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Functions/ValidDefaultValueStandard.xml deleted file mode 100644 index ef9bc32..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/Functions/ValidDefaultValueStandard.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - $persistent = false) -{ - ... -} - ]]> - - - $persistent = false, $dsn) -{ - ... -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/NamingConventions/ValidClassNameStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/NamingConventions/ValidClassNameStandard.xml deleted file mode 100644 index 052fb2b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/NamingConventions/ValidClassNameStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/NamingConventions/ValidFunctionNameStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/NamingConventions/ValidFunctionNameStandard.xml deleted file mode 100644 index 5dcff71..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/NamingConventions/ValidFunctionNameStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/NamingConventions/ValidVariableNameStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/NamingConventions/ValidVariableNameStandard.xml deleted file mode 100644 index 1f8e6d2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/NamingConventions/ValidVariableNameStandard.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - publicVar; - protected $protectedVar; - private $_privateVar; -} - ]]> - - - _publicVar; - protected $_protectedVar; - private $privateVar; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/WhiteSpace/ObjectOperatorIndentStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/WhiteSpace/ObjectOperatorIndentStandard.xml deleted file mode 100644 index 9dee905..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/WhiteSpace/ObjectOperatorIndentStandard.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - ->bar() - ->baz(); - ]]> - - - -> - bar()-> - baz(); - ]]> - - - - - ->bar() - ->baz(); - ]]> - - - ->bar() -->baz(); - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/WhiteSpace/ScopeClosingBraceStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/WhiteSpace/ScopeClosingBraceStandard.xml deleted file mode 100644 index c8d6e27..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/WhiteSpace/ScopeClosingBraceStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - } - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/WhiteSpace/ScopeIndentStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/WhiteSpace/ScopeIndentStandard.xml deleted file mode 100644 index fafa07a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Docs/WhiteSpace/ScopeIndentStandard.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - if ($test) { - $var = 1; - } -} - ]]> - - - if ($test) { -$var = 1; -} -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Classes/ClassDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Classes/ClassDeclarationSniff.php deleted file mode 100644 index b29b493..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Classes/ClassDeclarationSniff.php +++ /dev/null @@ -1,150 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Sniffs\Classes; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ClassDeclarationSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_CLASS, - T_INTERFACE, - T_TRAIT, - T_ENUM, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param integer $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $errorData = [strtolower($tokens[$stackPtr]['content'])]; - - if (isset($tokens[$stackPtr]['scope_opener']) === false) { - $error = 'Possible parse error: %s missing opening or closing brace'; - $phpcsFile->addWarning($error, $stackPtr, 'MissingBrace', $errorData); - return; - } - - $curlyBrace = $tokens[$stackPtr]['scope_opener']; - $lastContent = $phpcsFile->findPrevious(T_WHITESPACE, ($curlyBrace - 1), $stackPtr, true); - $classLine = $tokens[$lastContent]['line']; - $braceLine = $tokens[$curlyBrace]['line']; - if ($braceLine === $classLine) { - $phpcsFile->recordMetric($stackPtr, 'Class opening brace placement', 'same line'); - $error = 'Opening brace of a %s must be on the line after the definition'; - $fix = $phpcsFile->addFixableError($error, $curlyBrace, 'OpenBraceNewLine', $errorData); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - if ($tokens[($curlyBrace - 1)]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->replaceToken(($curlyBrace - 1), ''); - } - - $phpcsFile->fixer->addNewlineBefore($curlyBrace); - $phpcsFile->fixer->endChangeset(); - } - - return; - } else { - $phpcsFile->recordMetric($stackPtr, 'Class opening brace placement', 'new line'); - - if ($braceLine > ($classLine + 1)) { - $error = 'Opening brace of a %s must be on the line following the %s declaration; found %s line(s)'; - $data = [ - $tokens[$stackPtr]['content'], - $tokens[$stackPtr]['content'], - ($braceLine - $classLine - 1), - ]; - $fix = $phpcsFile->addFixableError($error, $curlyBrace, 'OpenBraceWrongLine', $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($curlyBrace - 1); $i > $lastContent; $i--) { - if ($tokens[$i]['line'] === ($tokens[$curlyBrace]['line'] + 1)) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - - return; - }//end if - }//end if - - if ($tokens[($curlyBrace + 1)]['content'] !== $phpcsFile->eolChar) { - $error = 'Opening %s brace must be on a line by itself'; - - $nextNonWhitespace = $phpcsFile->findNext(T_WHITESPACE, ($curlyBrace + 1), null, true); - if ($tokens[$nextNonWhitespace]['code'] === T_PHPCS_IGNORE) { - // Don't auto-fix if the next thing is a PHPCS ignore annotation. - $phpcsFile->addError($error, $curlyBrace, 'OpenBraceNotAlone', $errorData); - } else { - $fix = $phpcsFile->addFixableError($error, $curlyBrace, 'OpenBraceNotAlone', $errorData); - if ($fix === true) { - $phpcsFile->fixer->addNewline($curlyBrace); - } - } - } - - if ($tokens[($curlyBrace - 1)]['code'] === T_WHITESPACE) { - $prevContent = $tokens[($curlyBrace - 1)]['content']; - if ($prevContent === $phpcsFile->eolChar) { - $spaces = 0; - } else { - $spaces = $tokens[($curlyBrace - 1)]['length']; - } - - $first = $phpcsFile->findFirstOnLine(T_WHITESPACE, $stackPtr, true); - $expected = ($tokens[$first]['column'] - 1); - if ($spaces !== $expected) { - $error = 'Expected %s spaces before opening brace; %s found'; - $data = [ - $expected, - $spaces, - ]; - - $fix = $phpcsFile->addFixableError($error, $curlyBrace, 'SpaceBeforeBrace', $data); - if ($fix === true) { - $indent = str_repeat(' ', $expected); - if ($spaces === 0) { - $phpcsFile->fixer->addContentBefore($curlyBrace, $indent); - } else { - $phpcsFile->fixer->replaceToken(($curlyBrace - 1), $indent); - } - } - } - }//end if - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Commenting/ClassCommentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Commenting/ClassCommentSniff.php deleted file mode 100644 index 885a845..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Commenting/ClassCommentSniff.php +++ /dev/null @@ -1,122 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Sniffs\Commenting; - -use PHP_CodeSniffer\Files\File; - -class ClassCommentSniff extends FileCommentSniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_CLASS, - T_INTERFACE, - T_TRAIT, - T_ENUM, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $type = strtolower($tokens[$stackPtr]['content']); - $errorData = [$type]; - - $find = [ - T_ABSTRACT => T_ABSTRACT, - T_FINAL => T_FINAL, - T_READONLY => T_READONLY, - T_WHITESPACE => T_WHITESPACE, - ]; - - for ($commentEnd = ($stackPtr - 1); $commentEnd >= 0; $commentEnd--) { - if (isset($find[$tokens[$commentEnd]['code']]) === true) { - continue; - } - - if ($tokens[$commentEnd]['code'] === T_ATTRIBUTE_END - && isset($tokens[$commentEnd]['attribute_opener']) === true - ) { - $commentEnd = $tokens[$commentEnd]['attribute_opener']; - continue; - } - - break; - } - - if ($tokens[$commentEnd]['code'] !== T_DOC_COMMENT_CLOSE_TAG - && $tokens[$commentEnd]['code'] !== T_COMMENT - ) { - $errorData[] = $phpcsFile->getDeclarationName($stackPtr); - $phpcsFile->addError('Missing doc comment for %s %s', $stackPtr, 'Missing', $errorData); - $phpcsFile->recordMetric($stackPtr, 'Class has doc comment', 'no'); - return; - } - - $phpcsFile->recordMetric($stackPtr, 'Class has doc comment', 'yes'); - - if ($tokens[$commentEnd]['code'] === T_COMMENT) { - $phpcsFile->addError('You must use "/**" style comments for a %s comment', $stackPtr, 'WrongStyle', $errorData); - return; - } - - // Check each tag. - $this->processTags($phpcsFile, $stackPtr, $tokens[$commentEnd]['comment_opener']); - - }//end process() - - - /** - * Process the version tag. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param array $tags The tokens for these tags. - * - * @return void - */ - protected function processVersion($phpcsFile, array $tags) - { - $tokens = $phpcsFile->getTokens(); - foreach ($tags as $tag) { - if ($tokens[($tag + 2)]['code'] !== T_DOC_COMMENT_STRING) { - // No content. - continue; - } - - $content = $tokens[($tag + 2)]['content']; - if ((strstr($content, 'Release:') === false)) { - $error = 'Invalid version "%s" in doc comment; consider "Release: " instead'; - $data = [$content]; - $phpcsFile->addWarning($error, $tag, 'InvalidVersion', $data); - } - } - - }//end processVersion() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Commenting/FileCommentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Commenting/FileCommentSniff.php deleted file mode 100644 index 2a99459..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Commenting/FileCommentSniff.php +++ /dev/null @@ -1,583 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Sniffs\Commenting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Common; - -class FileCommentSniff implements Sniff -{ - - /** - * Tags in correct order and related info. - * - * @var array - */ - protected $tags = [ - '@category' => [ - 'required' => true, - 'allow_multiple' => false, - ], - '@package' => [ - 'required' => true, - 'allow_multiple' => false, - ], - '@subpackage' => [ - 'required' => false, - 'allow_multiple' => false, - ], - '@author' => [ - 'required' => true, - 'allow_multiple' => true, - ], - '@copyright' => [ - 'required' => false, - 'allow_multiple' => true, - ], - '@license' => [ - 'required' => true, - 'allow_multiple' => false, - ], - '@version' => [ - 'required' => false, - 'allow_multiple' => false, - ], - '@link' => [ - 'required' => true, - 'allow_multiple' => true, - ], - '@see' => [ - 'required' => false, - 'allow_multiple' => true, - ], - '@since' => [ - 'required' => false, - 'allow_multiple' => false, - ], - '@deprecated' => [ - 'required' => false, - 'allow_multiple' => false, - ], - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return int|void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Find the next non whitespace token. - $commentStart = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - - // Allow declare() statements at the top of the file. - if ($tokens[$commentStart]['code'] === T_DECLARE) { - $semicolon = $phpcsFile->findNext(T_SEMICOLON, ($commentStart + 1)); - $commentStart = $phpcsFile->findNext(T_WHITESPACE, ($semicolon + 1), null, true); - } - - // Ignore vim header. - if ($tokens[$commentStart]['code'] === T_COMMENT) { - if (strstr($tokens[$commentStart]['content'], 'vim:') !== false) { - $commentStart = $phpcsFile->findNext( - T_WHITESPACE, - ($commentStart + 1), - null, - true - ); - } - } - - $errorToken = ($stackPtr + 1); - if (isset($tokens[$errorToken]) === false) { - $errorToken--; - } - - if ($tokens[$commentStart]['code'] === T_CLOSE_TAG) { - // We are only interested if this is the first open tag. - return $phpcsFile->numTokens; - } else if ($tokens[$commentStart]['code'] === T_COMMENT) { - $error = 'You must use "/**" style comments for a file comment'; - $phpcsFile->addError($error, $errorToken, 'WrongStyle'); - $phpcsFile->recordMetric($stackPtr, 'File has doc comment', 'yes'); - return $phpcsFile->numTokens; - } else if ($commentStart === false - || $tokens[$commentStart]['code'] !== T_DOC_COMMENT_OPEN_TAG - ) { - $phpcsFile->addError('Missing file doc comment', $errorToken, 'Missing'); - $phpcsFile->recordMetric($stackPtr, 'File has doc comment', 'no'); - return $phpcsFile->numTokens; - } - - $commentEnd = $tokens[$commentStart]['comment_closer']; - - for ($nextToken = ($commentEnd + 1); $nextToken < $phpcsFile->numTokens; $nextToken++) { - if ($tokens[$nextToken]['code'] === T_WHITESPACE) { - continue; - } - - if ($tokens[$nextToken]['code'] === T_ATTRIBUTE - && isset($tokens[$nextToken]['attribute_closer']) === true - ) { - $nextToken = $tokens[$nextToken]['attribute_closer']; - continue; - } - - break; - } - - if ($nextToken === $phpcsFile->numTokens) { - $nextToken--; - } - - $ignore = [ - T_CLASS, - T_INTERFACE, - T_TRAIT, - T_ENUM, - T_FUNCTION, - T_CLOSURE, - T_PUBLIC, - T_PRIVATE, - T_PROTECTED, - T_FINAL, - T_STATIC, - T_ABSTRACT, - T_READONLY, - T_CONST, - T_PROPERTY, - ]; - - if (in_array($tokens[$nextToken]['code'], $ignore, true) === true) { - $phpcsFile->addError('Missing file doc comment', $stackPtr, 'Missing'); - $phpcsFile->recordMetric($stackPtr, 'File has doc comment', 'no'); - return $phpcsFile->numTokens; - } - - $phpcsFile->recordMetric($stackPtr, 'File has doc comment', 'yes'); - - // Check the PHP Version, which should be in some text before the first tag. - $found = false; - for ($i = ($commentStart + 1); $i < $commentEnd; $i++) { - if ($tokens[$i]['code'] === T_DOC_COMMENT_TAG) { - break; - } else if ($tokens[$i]['code'] === T_DOC_COMMENT_STRING - && strstr(strtolower($tokens[$i]['content']), 'php version') !== false - ) { - $found = true; - break; - } - } - - if ($found === false) { - $error = 'PHP version not specified'; - $phpcsFile->addWarning($error, $commentEnd, 'MissingVersion'); - } - - // Check each tag. - $this->processTags($phpcsFile, $stackPtr, $commentStart); - - // Ignore the rest of the file. - return $phpcsFile->numTokens; - - }//end process() - - - /** - * Processes each required or optional tag. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $commentStart Position in the stack where the comment started. - * - * @return void - */ - protected function processTags($phpcsFile, $stackPtr, $commentStart) - { - $tokens = $phpcsFile->getTokens(); - - if (get_class($this) === 'PHP_CodeSniffer\Standards\PEAR\Sniffs\Commenting\FileCommentSniff') { - $docBlock = 'file'; - } else { - $docBlock = 'class'; - } - - $commentEnd = $tokens[$commentStart]['comment_closer']; - - $foundTags = []; - $tagTokens = []; - foreach ($tokens[$commentStart]['comment_tags'] as $tag) { - $name = $tokens[$tag]['content']; - if (isset($this->tags[$name]) === false) { - continue; - } - - if ($this->tags[$name]['allow_multiple'] === false && isset($tagTokens[$name]) === true) { - $error = 'Only one %s tag is allowed in a %s comment'; - $data = [ - $name, - $docBlock, - ]; - $phpcsFile->addError($error, $tag, 'Duplicate'.ucfirst(substr($name, 1)).'Tag', $data); - } - - $foundTags[] = $name; - $tagTokens[$name][] = $tag; - - $string = $phpcsFile->findNext(T_DOC_COMMENT_STRING, $tag, $commentEnd); - if ($string === false || $tokens[$string]['line'] !== $tokens[$tag]['line']) { - $error = 'Content missing for %s tag in %s comment'; - $data = [ - $name, - $docBlock, - ]; - $phpcsFile->addError($error, $tag, 'Empty'.ucfirst(substr($name, 1)).'Tag', $data); - continue; - } - }//end foreach - - // Check if the tags are in the correct position. - $pos = 0; - foreach ($this->tags as $tag => $tagData) { - if (isset($tagTokens[$tag]) === false) { - if ($tagData['required'] === true) { - $error = 'Missing %s tag in %s comment'; - $data = [ - $tag, - $docBlock, - ]; - $phpcsFile->addError($error, $commentEnd, 'Missing'.ucfirst(substr($tag, 1)).'Tag', $data); - } - - continue; - } else { - $method = 'process'.substr($tag, 1); - if (method_exists($this, $method) === true) { - // Process each tag if a method is defined. - call_user_func([$this, $method], $phpcsFile, $tagTokens[$tag]); - } - } - - if (isset($foundTags[$pos]) === false) { - break; - } - - if ($foundTags[$pos] !== $tag) { - $error = 'The tag in position %s should be the %s tag'; - $data = [ - ($pos + 1), - $tag, - ]; - $phpcsFile->addError($error, $tokens[$commentStart]['comment_tags'][$pos], ucfirst(substr($tag, 1)).'TagOrder', $data); - } - - // Account for multiple tags. - $pos++; - while (isset($foundTags[$pos]) === true && $foundTags[$pos] === $tag) { - $pos++; - } - }//end foreach - - }//end processTags() - - - /** - * Process the category tag. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param array $tags The tokens for these tags. - * - * @return void - */ - protected function processCategory($phpcsFile, array $tags) - { - $tokens = $phpcsFile->getTokens(); - foreach ($tags as $tag) { - if ($tokens[($tag + 2)]['code'] !== T_DOC_COMMENT_STRING) { - // No content. - continue; - } - - $content = $tokens[($tag + 2)]['content']; - if (Common::isUnderscoreName($content) !== true) { - $newContent = str_replace(' ', '_', $content); - $nameBits = explode('_', $newContent); - $firstBit = array_shift($nameBits); - $newName = ucfirst($firstBit).'_'; - foreach ($nameBits as $bit) { - if ($bit !== '') { - $newName .= ucfirst($bit).'_'; - } - } - - $error = 'Category name "%s" is not valid; consider "%s" instead'; - $validName = trim($newName, '_'); - $data = [ - $content, - $validName, - ]; - $phpcsFile->addError($error, $tag, 'InvalidCategory', $data); - } - }//end foreach - - }//end processCategory() - - - /** - * Process the package tag. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param array $tags The tokens for these tags. - * - * @return void - */ - protected function processPackage($phpcsFile, array $tags) - { - $tokens = $phpcsFile->getTokens(); - foreach ($tags as $tag) { - if ($tokens[($tag + 2)]['code'] !== T_DOC_COMMENT_STRING) { - // No content. - continue; - } - - $content = $tokens[($tag + 2)]['content']; - if (Common::isUnderscoreName($content) === true) { - continue; - } - - $newContent = str_replace(' ', '_', $content); - $newContent = trim($newContent, '_'); - $newContent = preg_replace('/[^A-Za-z_]/', '', $newContent); - - if ($newContent === '') { - $error = 'Package name "%s" is not valid'; - $data = [$content]; - $phpcsFile->addError($error, $tag, 'InvalidPackageValue', $data); - } else { - $nameBits = explode('_', $newContent); - $firstBit = array_shift($nameBits); - $newName = strtoupper($firstBit[0]).substr($firstBit, 1).'_'; - foreach ($nameBits as $bit) { - if ($bit !== '') { - $newName .= strtoupper($bit[0]).substr($bit, 1).'_'; - } - } - - $error = 'Package name "%s" is not valid; consider "%s" instead'; - $validName = trim($newName, '_'); - $data = [ - $content, - $validName, - ]; - $phpcsFile->addError($error, $tag, 'InvalidPackage', $data); - }//end if - }//end foreach - - }//end processPackage() - - - /** - * Process the subpackage tag. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param array $tags The tokens for these tags. - * - * @return void - */ - protected function processSubpackage($phpcsFile, array $tags) - { - $tokens = $phpcsFile->getTokens(); - foreach ($tags as $tag) { - if ($tokens[($tag + 2)]['code'] !== T_DOC_COMMENT_STRING) { - // No content. - continue; - } - - $content = $tokens[($tag + 2)]['content']; - if (Common::isUnderscoreName($content) === true) { - continue; - } - - $newContent = str_replace(' ', '_', $content); - $nameBits = explode('_', $newContent); - $firstBit = array_shift($nameBits); - $newName = strtoupper($firstBit[0]).substr($firstBit, 1).'_'; - foreach ($nameBits as $bit) { - if ($bit !== '') { - $newName .= strtoupper($bit[0]).substr($bit, 1).'_'; - } - } - - $error = 'Subpackage name "%s" is not valid; consider "%s" instead'; - $validName = trim($newName, '_'); - $data = [ - $content, - $validName, - ]; - $phpcsFile->addError($error, $tag, 'InvalidSubpackage', $data); - }//end foreach - - }//end processSubpackage() - - - /** - * Process the author tag(s) that this header comment has. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param array $tags The tokens for these tags. - * - * @return void - */ - protected function processAuthor($phpcsFile, array $tags) - { - $tokens = $phpcsFile->getTokens(); - foreach ($tags as $tag) { - if ($tokens[($tag + 2)]['code'] !== T_DOC_COMMENT_STRING) { - // No content. - continue; - } - - $content = $tokens[($tag + 2)]['content']; - $local = '\da-zA-Z-_+'; - // Dot character cannot be the first or last character in the local-part. - $localMiddle = $local.'.\w'; - if (preg_match('/^([^<]*)\s+<(['.$local.'](['.$localMiddle.']*['.$local.'])*@[\da-zA-Z][-.\w]*[\da-zA-Z]\.[a-zA-Z]{2,})>$/', $content) === 0) { - $error = 'Content of the @author tag must be in the form "Display Name "'; - $phpcsFile->addError($error, $tag, 'InvalidAuthors'); - } - } - - }//end processAuthor() - - - /** - * Process the copyright tags. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param array $tags The tokens for these tags. - * - * @return void - */ - protected function processCopyright($phpcsFile, array $tags) - { - $tokens = $phpcsFile->getTokens(); - foreach ($tags as $tag) { - if ($tokens[($tag + 2)]['code'] !== T_DOC_COMMENT_STRING) { - // No content. - continue; - } - - $content = $tokens[($tag + 2)]['content']; - $matches = []; - if (preg_match('/^([0-9]{4})((.{1})([0-9]{4}))? (.+)$/', $content, $matches) !== 0) { - // Check earliest-latest year order. - if ($matches[3] !== '' && $matches[3] !== null) { - if ($matches[3] !== '-') { - $error = 'A hyphen must be used between the earliest and latest year'; - $phpcsFile->addError($error, $tag, 'CopyrightHyphen'); - } - - if ($matches[4] !== '' && $matches[4] !== null && $matches[4] < $matches[1]) { - $error = "Invalid year span \"$matches[1]$matches[3]$matches[4]\" found; consider \"$matches[4]-$matches[1]\" instead"; - $phpcsFile->addWarning($error, $tag, 'InvalidCopyright'); - } - } - } else { - $error = '@copyright tag must contain a year and the name of the copyright holder'; - $phpcsFile->addError($error, $tag, 'IncompleteCopyright'); - } - }//end foreach - - }//end processCopyright() - - - /** - * Process the license tag. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param array $tags The tokens for these tags. - * - * @return void - */ - protected function processLicense($phpcsFile, array $tags) - { - $tokens = $phpcsFile->getTokens(); - foreach ($tags as $tag) { - if ($tokens[($tag + 2)]['code'] !== T_DOC_COMMENT_STRING) { - // No content. - continue; - } - - $content = $tokens[($tag + 2)]['content']; - $matches = []; - preg_match('/^([^\s]+)\s+(.*)/', $content, $matches); - if (count($matches) !== 3) { - $error = '@license tag must contain a URL and a license name'; - $phpcsFile->addError($error, $tag, 'IncompleteLicense'); - } - } - - }//end processLicense() - - - /** - * Process the version tag. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param array $tags The tokens for these tags. - * - * @return void - */ - protected function processVersion($phpcsFile, array $tags) - { - $tokens = $phpcsFile->getTokens(); - foreach ($tags as $tag) { - if ($tokens[($tag + 2)]['code'] !== T_DOC_COMMENT_STRING) { - // No content. - continue; - } - - $content = $tokens[($tag + 2)]['content']; - if (strstr($content, 'CVS:') === false - && strstr($content, 'SVN:') === false - && strstr($content, 'GIT:') === false - && strstr($content, 'HG:') === false - ) { - $error = 'Invalid version "%s" in file comment; consider "CVS: " or "SVN: " or "GIT: " or "HG: " instead'; - $data = [$content]; - $phpcsFile->addWarning($error, $tag, 'InvalidVersion', $data); - } - } - - }//end processVersion() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Commenting/FunctionCommentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Commenting/FunctionCommentSniff.php deleted file mode 100644 index 8580e7a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Commenting/FunctionCommentSniff.php +++ /dev/null @@ -1,550 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Sniffs\Commenting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class FunctionCommentSniff implements Sniff -{ - - /** - * Disable the check for functions with a lower visibility than the value given. - * - * Allowed values are public, protected, and private. - * - * @var string - */ - public $minimumVisibility = 'private'; - - /** - * Array of methods which do not require a return type. - * - * @var array - */ - public $specialMethods = [ - '__construct', - '__destruct', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_FUNCTION]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $scopeModifier = $phpcsFile->getMethodProperties($stackPtr)['scope']; - if (($scopeModifier === 'protected' - && $this->minimumVisibility === 'public') - || ($scopeModifier === 'private' - && ($this->minimumVisibility === 'public' || $this->minimumVisibility === 'protected')) - ) { - return; - } - - $tokens = $phpcsFile->getTokens(); - $ignore = Tokens::$methodPrefixes; - $ignore[T_WHITESPACE] = T_WHITESPACE; - - for ($commentEnd = ($stackPtr - 1); $commentEnd >= 0; $commentEnd--) { - if (isset($ignore[$tokens[$commentEnd]['code']]) === true) { - continue; - } - - if ($tokens[$commentEnd]['code'] === T_ATTRIBUTE_END - && isset($tokens[$commentEnd]['attribute_opener']) === true - ) { - $commentEnd = $tokens[$commentEnd]['attribute_opener']; - continue; - } - - break; - } - - if ($tokens[$commentEnd]['code'] === T_COMMENT) { - // Inline comments might just be closing comments for - // control structures or functions instead of function comments - // using the wrong comment type. If there is other code on the line, - // assume they relate to that code. - $prev = $phpcsFile->findPrevious($ignore, ($commentEnd - 1), null, true); - if ($prev !== false && $tokens[$prev]['line'] === $tokens[$commentEnd]['line']) { - $commentEnd = $prev; - } - } - - if ($tokens[$commentEnd]['code'] !== T_DOC_COMMENT_CLOSE_TAG - && $tokens[$commentEnd]['code'] !== T_COMMENT - ) { - $function = $phpcsFile->getDeclarationName($stackPtr); - $phpcsFile->addError( - 'Missing doc comment for function %s()', - $stackPtr, - 'Missing', - [$function] - ); - $phpcsFile->recordMetric($stackPtr, 'Function has doc comment', 'no'); - return; - } else { - $phpcsFile->recordMetric($stackPtr, 'Function has doc comment', 'yes'); - } - - if ($tokens[$commentEnd]['code'] === T_COMMENT) { - $phpcsFile->addError('You must use "/**" style comments for a function comment', $stackPtr, 'WrongStyle'); - return; - } - - // Check there are no blank lines in the preamble for the property, - // but ignore blank lines _within_ attributes as that's not the concern of this sniff. - if ($tokens[$commentEnd]['line'] !== ($tokens[$stackPtr]['line'] - 1)) { - for ($i = ($commentEnd + 1); $i < $stackPtr; $i++) { - // Skip over the contents of attributes. - if (isset($tokens[$i]['attribute_closer']) === true) { - $i = $tokens[$i]['attribute_closer']; - continue; - } - - if ($tokens[$i]['column'] !== 1 - || $tokens[$i]['code'] !== T_WHITESPACE - || $tokens[$i]['line'] === $tokens[($i + 1)]['line'] - // Do not report blank lines after a PHPCS annotation as removing the blank lines could change the meaning. - || isset(Tokens::$phpcsCommentTokens[$tokens[($i - 1)]['code']]) === true - ) { - continue; - } - - $nextNonWhitespace = $phpcsFile->findNext(T_WHITESPACE, ($i + 1), null, true); - $error = 'There must be no blank lines between the function comment and the declaration'; - $fix = $phpcsFile->addFixableError($error, $i, 'SpacingAfter'); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - for ($j = $i; $j < $nextNonWhitespace; $j++) { - if ($tokens[$j]['line'] === $tokens[$nextNonWhitespace]['line']) { - break; - } - - $phpcsFile->fixer->replaceToken($j, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - - $i = $nextNonWhitespace; - }//end for - }//end if - - $commentStart = $tokens[$commentEnd]['comment_opener']; - foreach ($tokens[$commentStart]['comment_tags'] as $tag) { - if ($tokens[$tag]['content'] === '@see') { - // Make sure the tag isn't empty. - $string = $phpcsFile->findNext(T_DOC_COMMENT_STRING, $tag, $commentEnd); - if ($string === false || $tokens[$string]['line'] !== $tokens[$tag]['line']) { - $error = 'Content missing for @see tag in function comment'; - $phpcsFile->addError($error, $tag, 'EmptySees'); - } - } - } - - $this->processReturn($phpcsFile, $stackPtr, $commentStart); - $this->processThrows($phpcsFile, $stackPtr, $commentStart); - $this->processParams($phpcsFile, $stackPtr, $commentStart); - - }//end process() - - - /** - * Process the return comment of this function comment. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $commentStart The position in the stack where the comment started. - * - * @return void - */ - protected function processReturn(File $phpcsFile, $stackPtr, $commentStart) - { - $tokens = $phpcsFile->getTokens(); - - // Skip constructor and destructor. - $methodName = $phpcsFile->getDeclarationName($stackPtr); - $isSpecialMethod = in_array($methodName, $this->specialMethods, true); - - $return = null; - foreach ($tokens[$commentStart]['comment_tags'] as $tag) { - if ($tokens[$tag]['content'] === '@return') { - if ($return !== null) { - $error = 'Only 1 @return tag is allowed in a function comment'; - $phpcsFile->addError($error, $tag, 'DuplicateReturn'); - return; - } - - $return = $tag; - } - } - - if ($return !== null) { - $content = $tokens[($return + 2)]['content']; - if (empty($content) === true || $tokens[($return + 2)]['code'] !== T_DOC_COMMENT_STRING) { - $error = 'Return type missing for @return tag in function comment'; - $phpcsFile->addError($error, $return, 'MissingReturnType'); - } - } else { - if ($isSpecialMethod === true) { - return; - } - - $error = 'Missing @return tag in function comment'; - $phpcsFile->addError($error, $tokens[$commentStart]['comment_closer'], 'MissingReturn'); - }//end if - - }//end processReturn() - - - /** - * Process any throw tags that this function comment has. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $commentStart The position in the stack where the comment started. - * - * @return void - */ - protected function processThrows(File $phpcsFile, $stackPtr, $commentStart) - { - $tokens = $phpcsFile->getTokens(); - - foreach ($tokens[$commentStart]['comment_tags'] as $tag) { - if ($tokens[$tag]['content'] !== '@throws') { - continue; - } - - $exception = null; - if ($tokens[($tag + 2)]['code'] === T_DOC_COMMENT_STRING) { - $matches = []; - preg_match('/([^\s]+)(?:\s+(.*))?/', $tokens[($tag + 2)]['content'], $matches); - $exception = $matches[1]; - } - - if ($exception === null) { - $error = 'Exception type missing for @throws tag in function comment'; - $phpcsFile->addError($error, $tag, 'InvalidThrows'); - } - }//end foreach - - }//end processThrows() - - - /** - * Process the function parameter comments. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $commentStart The position in the stack where the comment started. - * - * @return void - */ - protected function processParams(File $phpcsFile, $stackPtr, $commentStart) - { - $tokens = $phpcsFile->getTokens(); - - $params = []; - $maxType = 0; - $maxVar = 0; - foreach ($tokens[$commentStart]['comment_tags'] as $pos => $tag) { - if ($tokens[$tag]['content'] !== '@param') { - continue; - } - - $type = ''; - $typeSpace = 0; - $var = ''; - $varSpace = 0; - $comment = ''; - $commentEnd = 0; - $commentTokens = []; - - if ($tokens[($tag + 2)]['code'] === T_DOC_COMMENT_STRING) { - $matches = []; - preg_match('/((?:(?![$.]|&(?=\$)).)*)(?:((?:\.\.\.)?(?:\$|&)[^\s]+)(?:(\s+)(.*))?)?/', $tokens[($tag + 2)]['content'], $matches); - - if (empty($matches) === false) { - $typeLen = strlen($matches[1]); - $type = trim($matches[1]); - $typeSpace = ($typeLen - strlen($type)); - $typeLen = strlen($type); - if ($typeLen > $maxType) { - $maxType = $typeLen; - } - } - - if (isset($matches[2]) === true) { - $var = $matches[2]; - $varLen = strlen($var); - if ($varLen > $maxVar) { - $maxVar = $varLen; - } - - if (isset($matches[4]) === true) { - $varSpace = strlen($matches[3]); - $comment = $matches[4]; - - // Any strings until the next tag belong to this comment. - if (isset($tokens[$commentStart]['comment_tags'][($pos + 1)]) === true) { - $end = $tokens[$commentStart]['comment_tags'][($pos + 1)]; - } else { - $end = $tokens[$commentStart]['comment_closer']; - } - - for ($i = ($tag + 3); $i < $end; $i++) { - if ($tokens[$i]['code'] === T_DOC_COMMENT_STRING) { - $comment .= ' '.$tokens[$i]['content']; - $commentEnd = $i; - $commentTokens[] = $i; - } - } - } else { - $error = 'Missing parameter comment'; - $phpcsFile->addError($error, $tag, 'MissingParamComment'); - }//end if - } else { - $error = 'Missing parameter name'; - $phpcsFile->addError($error, $tag, 'MissingParamName'); - }//end if - } else { - $error = 'Missing parameter type'; - $phpcsFile->addError($error, $tag, 'MissingParamType'); - }//end if - - $params[] = [ - 'tag' => $tag, - 'type' => $type, - 'var' => $var, - 'comment' => $comment, - 'comment_end' => $commentEnd, - 'comment_tokens' => $commentTokens, - 'type_space' => $typeSpace, - 'var_space' => $varSpace, - ]; - }//end foreach - - $realParams = $phpcsFile->getMethodParameters($stackPtr); - $foundParams = []; - - // We want to use ... for all variable length arguments, so add - // this prefix to the variable name so comparisons are easier. - foreach ($realParams as $pos => $param) { - if ($param['variable_length'] === true) { - $realParams[$pos]['name'] = '...'.$realParams[$pos]['name']; - } - } - - foreach ($params as $pos => $param) { - if ($param['var'] === '') { - continue; - } - - $foundParams[] = $param['var']; - - if (trim($param['type']) !== '') { - // Check number of spaces after the type. - $spaces = ($maxType - strlen($param['type']) + 1); - if ($param['type_space'] !== $spaces) { - $error = 'Expected %s spaces after parameter type; %s found'; - $data = [ - $spaces, - $param['type_space'], - ]; - - $fix = $phpcsFile->addFixableError($error, $param['tag'], 'SpacingAfterParamType', $data); - if ($fix === true) { - $commentToken = ($param['tag'] + 2); - - $content = $param['type']; - $content .= str_repeat(' ', $spaces); - $content .= $param['var']; - $content .= str_repeat(' ', $param['var_space']); - - $wrapLength = ($tokens[$commentToken]['length'] - $param['type_space'] - $param['var_space'] - strlen($param['type']) - strlen($param['var'])); - - $star = $phpcsFile->findPrevious(T_DOC_COMMENT_STAR, $param['tag']); - $spaceLength = (strlen($content) + $tokens[($commentToken - 1)]['length'] + $tokens[($commentToken - 2)]['length']); - - $padding = str_repeat(' ', ($tokens[$star]['column'] - 1)); - $padding .= '* '; - $padding .= str_repeat(' ', $spaceLength); - - $content .= wordwrap( - $param['comment'], - $wrapLength, - $phpcsFile->eolChar.$padding - ); - - $phpcsFile->fixer->replaceToken($commentToken, $content); - for ($i = ($commentToken + 1); $i <= $param['comment_end']; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - }//end if - }//end if - }//end if - - // Make sure the param name is correct. - if (isset($realParams[$pos]) === true) { - $realName = $realParams[$pos]['name']; - if ($realName !== $param['var']) { - $code = 'ParamNameNoMatch'; - $data = [ - $param['var'], - $realName, - ]; - - $error = 'Doc comment for parameter %s does not match '; - if (strtolower($param['var']) === strtolower($realName)) { - $error .= 'case of '; - $code = 'ParamNameNoCaseMatch'; - } - - $error .= 'actual variable name %s'; - - $phpcsFile->addError($error, $param['tag'], $code, $data); - } - } else if (substr($param['var'], -4) !== ',...') { - // We must have an extra parameter comment. - $error = 'Superfluous parameter comment'; - $phpcsFile->addError($error, $param['tag'], 'ExtraParamComment'); - }//end if - - if ($param['comment'] === '') { - continue; - } - - // Check number of spaces after the param name. - $spaces = ($maxVar - strlen($param['var']) + 1); - if ($param['var_space'] !== $spaces) { - $error = 'Expected %s spaces after parameter name; %s found'; - $data = [ - $spaces, - $param['var_space'], - ]; - - $fix = $phpcsFile->addFixableError($error, $param['tag'], 'SpacingAfterParamName', $data); - if ($fix === true) { - $commentToken = ($param['tag'] + 2); - - $content = $param['type']; - $content .= str_repeat(' ', $param['type_space']); - $content .= $param['var']; - $content .= str_repeat(' ', $spaces); - - $wrapLength = ($tokens[$commentToken]['length'] - $param['type_space'] - $param['var_space'] - strlen($param['type']) - strlen($param['var'])); - - $star = $phpcsFile->findPrevious(T_DOC_COMMENT_STAR, $param['tag']); - $spaceLength = (strlen($content) + $tokens[($commentToken - 1)]['length'] + $tokens[($commentToken - 2)]['length']); - - $padding = str_repeat(' ', ($tokens[$star]['column'] - 1)); - $padding .= '* '; - $padding .= str_repeat(' ', $spaceLength); - - $content .= wordwrap( - $param['comment'], - $wrapLength, - $phpcsFile->eolChar.$padding - ); - - $phpcsFile->fixer->replaceToken($commentToken, $content); - for ($i = ($commentToken + 1); $i <= $param['comment_end']; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - }//end if - }//end if - - // Check the alignment of multi-line param comments. - if ($param['tag'] !== $param['comment_end']) { - $wrapLength = ($tokens[($param['tag'] + 2)]['length'] - $param['type_space'] - $param['var_space'] - strlen($param['type']) - strlen($param['var'])); - - $startColumn = ($tokens[($param['tag'] + 2)]['column'] + $tokens[($param['tag'] + 2)]['length'] - $wrapLength); - - $star = $phpcsFile->findPrevious(T_DOC_COMMENT_STAR, $param['tag']); - $expected = ($startColumn - $tokens[$star]['column'] - 1); - - foreach ($param['comment_tokens'] as $commentToken) { - if ($tokens[$commentToken]['column'] === $startColumn) { - continue; - } - - $found = 0; - if ($tokens[($commentToken - 1)]['code'] === T_DOC_COMMENT_WHITESPACE) { - $found = $tokens[($commentToken - 1)]['length']; - } - - $error = 'Parameter comment not aligned correctly; expected %s spaces but found %s'; - $data = [ - $expected, - $found, - ]; - - if ($found < $expected) { - $code = 'ParamCommentAlignment'; - } else { - $code = 'ParamCommentAlignmentExceeded'; - } - - $fix = $phpcsFile->addFixableError($error, $commentToken, $code, $data); - if ($fix === true) { - $padding = str_repeat(' ', $expected); - if ($tokens[($commentToken - 1)]['code'] === T_DOC_COMMENT_WHITESPACE) { - $phpcsFile->fixer->replaceToken(($commentToken - 1), $padding); - } else { - $phpcsFile->fixer->addContentBefore($commentToken, $padding); - } - } - }//end foreach - }//end if - }//end foreach - - $realNames = []; - foreach ($realParams as $realParam) { - $realNames[] = $realParam['name']; - } - - // Report missing comments. - $diff = array_diff($realNames, $foundParams); - foreach ($diff as $neededParam) { - $error = 'Doc comment for parameter "%s" missing'; - $data = [$neededParam]; - $phpcsFile->addError($error, $commentStart, 'MissingParamTag', $data); - } - - }//end processParams() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Commenting/InlineCommentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Commenting/InlineCommentSniff.php deleted file mode 100644 index 0725d82..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Commenting/InlineCommentSniff.php +++ /dev/null @@ -1,68 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Sniffs\Commenting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class InlineCommentSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_COMMENT]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['content'][0] === '#') { - $phpcsFile->recordMetric($stackPtr, 'Inline comment style', '# ...'); - - $error = 'Perl-style comments are not allowed. Use "// Comment."'; - $error .= ' or "/* comment */" instead.'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'WrongStyle'); - if ($fix === true) { - $newComment = ltrim($tokens[$stackPtr]['content'], '# '); - $newComment = '// '.$newComment; - $phpcsFile->fixer->replaceToken($stackPtr, $newComment); - } - } else if ($tokens[$stackPtr]['content'][0] === '/' - && $tokens[$stackPtr]['content'][1] === '/' - ) { - $phpcsFile->recordMetric($stackPtr, 'Inline comment style', '// ...'); - } else if ($tokens[$stackPtr]['content'][0] === '/' - && $tokens[$stackPtr]['content'][1] === '*' - ) { - $phpcsFile->recordMetric($stackPtr, 'Inline comment style', '/* ... */'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/ControlStructures/ControlSignatureSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/ControlStructures/ControlSignatureSniff.php deleted file mode 100644 index 21aecac..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/ControlStructures/ControlSignatureSniff.php +++ /dev/null @@ -1,48 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Sniffs\ControlStructures; - -use PHP_CodeSniffer\Sniffs\AbstractPatternSniff; - -class ControlSignatureSniff extends AbstractPatternSniff -{ - - /** - * If true, comments will be ignored if they are found in the code. - * - * @var boolean - */ - public $ignoreComments = true; - - - /** - * Returns the patterns that this test wishes to verify. - * - * @return string[] - */ - protected function getPatterns() - { - return [ - 'do {EOL...} while (...);EOL', - 'while (...) {EOL', - 'for (...) {EOL', - 'if (...) {EOL', - 'foreach (...) {EOL', - '} else if (...) {EOL', - '} elseif (...) {EOL', - '} else {EOL', - 'do {EOL', - 'match (...) {EOL', - ]; - - }//end getPatterns() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/ControlStructures/MultiLineConditionSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/ControlStructures/MultiLineConditionSniff.php deleted file mode 100644 index c341b8f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/ControlStructures/MultiLineConditionSniff.php +++ /dev/null @@ -1,283 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Sniffs\ControlStructures; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class MultiLineConditionSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - /** - * The number of spaces code should be indented. - * - * @var integer - */ - public $indent = 4; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_IF, - T_ELSEIF, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['parenthesis_opener']) === false) { - return; - } - - $openBracket = $tokens[$stackPtr]['parenthesis_opener']; - $closeBracket = $tokens[$stackPtr]['parenthesis_closer']; - $spaceAfterOpen = 0; - if ($tokens[($openBracket + 1)]['code'] === T_WHITESPACE) { - if (strpos($tokens[($openBracket + 1)]['content'], $phpcsFile->eolChar) !== false) { - $spaceAfterOpen = 'newline'; - } else { - $spaceAfterOpen = $tokens[($openBracket + 1)]['length']; - } - } - - if ($spaceAfterOpen !== 0) { - $error = 'First condition of a multi-line IF statement must directly follow the opening parenthesis'; - $fix = $phpcsFile->addFixableError($error, ($openBracket + 1), 'SpacingAfterOpenBrace'); - if ($fix === true) { - if ($spaceAfterOpen === 'newline') { - $phpcsFile->fixer->replaceToken(($openBracket + 1), ''); - } else { - $phpcsFile->fixer->replaceToken(($openBracket + 1), ''); - } - } - } - - // We need to work out how far indented the if statement - // itself is, so we can work out how far to indent conditions. - $statementIndent = 0; - for ($i = ($stackPtr - 1); $i >= 0; $i--) { - if ($tokens[$i]['line'] !== $tokens[$stackPtr]['line']) { - $i++; - break; - } - } - - if ($i >= 0 && $tokens[$i]['code'] === T_WHITESPACE) { - $statementIndent = $tokens[$i]['length']; - } - - // Each line between the parenthesis should be indented 4 spaces - // and start with an operator, unless the line is inside a - // function call, in which case it is ignored. - $prevLine = $tokens[$openBracket]['line']; - for ($i = ($openBracket + 1); $i <= $closeBracket; $i++) { - if ($i === $closeBracket && $tokens[$openBracket]['line'] !== $tokens[$i]['line']) { - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($i - 1), null, true); - if ($tokens[$prev]['line'] === $tokens[$i]['line']) { - // Closing bracket is on the same line as a condition. - $error = 'Closing parenthesis of a multi-line IF statement must be on a new line'; - $fix = $phpcsFile->addFixableError($error, $closeBracket, 'CloseBracketNewLine'); - if ($fix === true) { - // Account for a comment at the end of the line. - $next = $phpcsFile->findNext(T_WHITESPACE, ($closeBracket + 1), null, true); - if ($tokens[$next]['code'] !== T_COMMENT - && isset(Tokens::$phpcsCommentTokens[$tokens[$next]['code']]) === false - ) { - $phpcsFile->fixer->addNewlineBefore($closeBracket); - } else { - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($next + 1), null, true); - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($closeBracket, ''); - $phpcsFile->fixer->addContentBefore($next, ')'); - $phpcsFile->fixer->endChangeset(); - } - } - } - }//end if - - if ($tokens[$i]['line'] !== $prevLine) { - if ($tokens[$i]['line'] === $tokens[$closeBracket]['line']) { - $next = $phpcsFile->findNext(T_WHITESPACE, $i, null, true); - if ($next !== $closeBracket) { - $expectedIndent = ($statementIndent + $this->indent); - } else { - // Closing brace needs to be indented to the same level - // as the statement. - $expectedIndent = $statementIndent; - }//end if - } else { - $expectedIndent = ($statementIndent + $this->indent); - }//end if - - if ($tokens[$i]['code'] === T_COMMENT - || isset(Tokens::$phpcsCommentTokens[$tokens[$i]['code']]) === true - ) { - $prevLine = $tokens[$i]['line']; - continue; - } - - // We changed lines, so this should be a whitespace indent token. - if ($tokens[$i]['code'] !== T_WHITESPACE) { - $foundIndent = 0; - } else { - $foundIndent = $tokens[$i]['length']; - } - - if ($expectedIndent !== $foundIndent) { - $error = 'Multi-line IF statement not indented correctly; expected %s spaces but found %s'; - $data = [ - $expectedIndent, - $foundIndent, - ]; - - $fix = $phpcsFile->addFixableError($error, $i, 'Alignment', $data); - if ($fix === true) { - $spaces = str_repeat(' ', $expectedIndent); - if ($foundIndent === 0) { - $phpcsFile->fixer->addContentBefore($i, $spaces); - } else { - $phpcsFile->fixer->replaceToken($i, $spaces); - } - } - } - - $next = $phpcsFile->findNext(Tokens::$emptyTokens, $i, null, true); - if ($next !== $closeBracket && $tokens[$next]['line'] === $tokens[$i]['line']) { - if (isset(Tokens::$booleanOperators[$tokens[$next]['code']]) === false) { - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($i - 1), $openBracket, true); - $fixable = true; - if (isset(Tokens::$booleanOperators[$tokens[$prev]['code']]) === false - && $phpcsFile->findNext(T_WHITESPACE, ($prev + 1), $next, true) !== false - ) { - // Condition spread over multi-lines interspersed with comments. - $fixable = false; - } - - $error = 'Each line in a multi-line IF statement must begin with a boolean operator'; - if ($fixable === false) { - $phpcsFile->addError($error, $next, 'StartWithBoolean'); - } else { - $fix = $phpcsFile->addFixableError($error, $next, 'StartWithBoolean'); - if ($fix === true) { - if (isset(Tokens::$booleanOperators[$tokens[$prev]['code']]) === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($prev, ''); - $phpcsFile->fixer->addContentBefore($next, $tokens[$prev]['content'].' '); - $phpcsFile->fixer->endChangeset(); - } else { - for ($x = ($prev + 1); $x < $next; $x++) { - $phpcsFile->fixer->replaceToken($x, ''); - } - } - } - } - }//end if - }//end if - - $prevLine = $tokens[$i]['line']; - }//end if - - if ($tokens[$i]['code'] === T_STRING) { - $next = $phpcsFile->findNext(T_WHITESPACE, ($i + 1), null, true); - if ($tokens[$next]['code'] === T_OPEN_PARENTHESIS) { - // This is a function call, so skip to the end as they - // have their own indentation rules. - $i = $tokens[$next]['parenthesis_closer']; - $prevLine = $tokens[$i]['line']; - continue; - } - } - }//end for - - // From here on, we are checking the spacing of the opening and closing - // braces. If this IF statement does not use braces, we end here. - if (isset($tokens[$stackPtr]['scope_opener']) === false) { - return; - } - - // The opening brace needs to be one space away from the closing parenthesis. - $openBrace = $tokens[$stackPtr]['scope_opener']; - $next = $phpcsFile->findNext(T_WHITESPACE, ($closeBracket + 1), $openBrace, true); - if ($next !== false) { - // Probably comments in between tokens, so don't check. - return; - } - - if ($tokens[$openBrace]['line'] > $tokens[$closeBracket]['line']) { - $length = -1; - } else if ($openBrace === ($closeBracket + 1)) { - $length = 0; - } else if ($openBrace === ($closeBracket + 2) - && $tokens[($closeBracket + 1)]['code'] === T_WHITESPACE - ) { - $length = $tokens[($closeBracket + 1)]['length']; - } else { - // Confused, so don't check. - $length = 1; - } - - if ($length === 1) { - return; - } - - $data = [$length]; - $code = 'SpaceBeforeOpenBrace'; - - $error = 'There must be a single space between the closing parenthesis and the opening brace of a multi-line IF statement; found '; - if ($length === -1) { - $error .= 'newline'; - $code = 'NewlineBeforeOpenBrace'; - } else { - $error .= '%s spaces'; - } - - $fix = $phpcsFile->addFixableError($error, ($closeBracket + 1), $code, $data); - if ($fix === true) { - if ($length === 0) { - $phpcsFile->fixer->addContent($closeBracket, ' '); - } else { - $phpcsFile->fixer->replaceToken(($closeBracket + 1), ' '); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Files/IncludingFileSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Files/IncludingFileSniff.php deleted file mode 100644 index fb656cb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Files/IncludingFileSniff.php +++ /dev/null @@ -1,136 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class IncludingFileSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_INCLUDE_ONCE, - T_REQUIRE_ONCE, - T_REQUIRE, - T_INCLUDE, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $nextToken = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($tokens[$nextToken]['code'] === T_OPEN_PARENTHESIS) { - $error = '"%s" is a statement not a function; no parentheses are required'; - $data = [$tokens[$stackPtr]['content']]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'BracketsNotRequired', $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($tokens[$nextToken]['parenthesis_closer'], ''); - if ($tokens[($nextToken - 1)]['code'] !== T_WHITESPACE) { - $phpcsFile->fixer->replaceToken($nextToken, ' '); - } else { - $phpcsFile->fixer->replaceToken($nextToken, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - - if (count($tokens[$stackPtr]['conditions']) !== 0) { - $inCondition = true; - } else { - $inCondition = false; - } - - // Check to see if this including statement is within the parenthesis - // of a condition. If that's the case then we need to process it as being - // within a condition, as they are checking the return value. - if (isset($tokens[$stackPtr]['nested_parenthesis']) === true) { - foreach ($tokens[$stackPtr]['nested_parenthesis'] as $left => $right) { - if (isset($tokens[$left]['parenthesis_owner']) === true) { - $inCondition = true; - } - } - } - - // Check to see if they are assigning the return value of this - // including call. If they are then they are probably checking it, so - // it's conditional. - $previous = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if (isset(Tokens::$assignmentTokens[$tokens[$previous]['code']]) === true) { - // The have assigned the return value to it, so its conditional. - $inCondition = true; - } - - $tokenCode = $tokens[$stackPtr]['code']; - if ($inCondition === true) { - // We are inside a conditional statement. We need an include_once. - if ($tokenCode === T_REQUIRE_ONCE) { - $error = 'File is being conditionally included; '; - $error .= 'use "include_once" instead'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'UseIncludeOnce'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, 'include_once'); - } - } else if ($tokenCode === T_REQUIRE) { - $error = 'File is being conditionally included; '; - $error .= 'use "include" instead'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'UseInclude'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, 'include'); - } - } - } else { - // We are unconditionally including, we need a require_once. - if ($tokenCode === T_INCLUDE_ONCE) { - $error = 'File is being unconditionally included; '; - $error .= 'use "require_once" instead'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'UseRequireOnce'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, 'require_once'); - } - } else if ($tokenCode === T_INCLUDE) { - $error = 'File is being unconditionally included; '; - $error .= 'use "require" instead'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'UseRequire'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, 'require'); - } - } - }//end if - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Formatting/MultiLineAssignmentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Formatting/MultiLineAssignmentSniff.php deleted file mode 100644 index 8fbb6af..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Formatting/MultiLineAssignmentSniff.php +++ /dev/null @@ -1,106 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Sniffs\Formatting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class MultiLineAssignmentSniff implements Sniff -{ - - /** - * The number of spaces code should be indented. - * - * @var integer - */ - public $indent = 4; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_EQUAL]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Equal sign can't be the last thing on the line. - $next = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($next === false) { - // Bad assignment. - return; - } - - if ($tokens[$next]['line'] !== $tokens[$stackPtr]['line']) { - $error = 'Multi-line assignments must have the equal sign on the second line'; - $phpcsFile->addError($error, $stackPtr, 'EqualSignLine'); - return; - } - - // Make sure it is the first thing on the line, otherwise we ignore it. - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - if ($prev === false) { - // Bad assignment. - return; - } - - if ($tokens[$prev]['line'] === $tokens[$stackPtr]['line']) { - return; - } - - // Find the required indent based on the ident of the previous line. - $assignmentIndent = 0; - $prevLine = $tokens[$prev]['line']; - for ($i = ($prev - 1); $i >= 0; $i--) { - if ($tokens[$i]['line'] !== $prevLine) { - $i++; - break; - } - } - - if ($tokens[$i]['code'] === T_WHITESPACE) { - $assignmentIndent = $tokens[$i]['length']; - } - - // Find the actual indent. - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1)); - - $expectedIndent = ($assignmentIndent + $this->indent); - $foundIndent = $tokens[$prev]['length']; - if ($foundIndent !== $expectedIndent) { - $error = 'Multi-line assignment not indented correctly; expected %s spaces but found %s'; - $data = [ - $expectedIndent, - $foundIndent, - ]; - $phpcsFile->addError($error, $stackPtr, 'Indent', $data); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Functions/FunctionCallSignatureSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Functions/FunctionCallSignatureSniff.php deleted file mode 100644 index d280ee9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Functions/FunctionCallSignatureSniff.php +++ /dev/null @@ -1,634 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Sniffs\Functions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class FunctionCallSignatureSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - /** - * The number of spaces code should be indented. - * - * @var integer - */ - public $indent = 4; - - /** - * If TRUE, multiple arguments can be defined per line in a multi-line call. - * - * @var boolean - */ - public $allowMultipleArguments = true; - - /** - * How many spaces should follow the opening bracket. - * - * @var integer - */ - public $requiredSpacesAfterOpen = 0; - - /** - * How many spaces should precede the closing bracket. - * - * @var integer - */ - public $requiredSpacesBeforeClose = 0; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - $tokens = Tokens::$functionNameTokens; - - $tokens[] = T_VARIABLE; - $tokens[] = T_CLOSE_CURLY_BRACKET; - $tokens[] = T_CLOSE_SQUARE_BRACKET; - $tokens[] = T_CLOSE_PARENTHESIS; - - return $tokens; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $this->requiredSpacesAfterOpen = (int) $this->requiredSpacesAfterOpen; - $this->requiredSpacesBeforeClose = (int) $this->requiredSpacesBeforeClose; - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['code'] === T_CLOSE_CURLY_BRACKET - && isset($tokens[$stackPtr]['scope_condition']) === true - ) { - // Not a function call. - return; - } - - // Find the next non-empty token. - $openBracket = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - - if ($tokens[$openBracket]['code'] !== T_OPEN_PARENTHESIS) { - // Not a function call. - return; - } - - if (isset($tokens[$openBracket]['parenthesis_closer']) === false) { - // Not a function call. - return; - } - - // Find the previous non-empty token. - $search = Tokens::$emptyTokens; - $search[] = T_BITWISE_AND; - $previous = $phpcsFile->findPrevious($search, ($stackPtr - 1), null, true); - if ($tokens[$previous]['code'] === T_FUNCTION) { - // It's a function definition, not a function call. - return; - } - - $closeBracket = $tokens[$openBracket]['parenthesis_closer']; - - if (($stackPtr + 1) !== $openBracket) { - // Checking this: $value = my_function[*](...). - $error = 'Space before opening parenthesis of function call prohibited'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceBeforeOpenBracket'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($stackPtr + 1); $i < $openBracket; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - // Modify the bracket as well to ensure a conflict if the bracket - // has been changed in some way by another sniff. - $phpcsFile->fixer->replaceToken($openBracket, '('); - $phpcsFile->fixer->endChangeset(); - } - } - - $next = $phpcsFile->findNext(T_WHITESPACE, ($closeBracket + 1), null, true); - if ($tokens[$next]['code'] === T_SEMICOLON) { - if (isset(Tokens::$emptyTokens[$tokens[($closeBracket + 1)]['code']]) === true) { - $error = 'Space after closing parenthesis of function call prohibited'; - $fix = $phpcsFile->addFixableError($error, $closeBracket, 'SpaceAfterCloseBracket'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($closeBracket + 1); $i < $next; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - // Modify the bracket as well to ensure a conflict if the bracket - // has been changed in some way by another sniff. - $phpcsFile->fixer->replaceToken($closeBracket, ')'); - $phpcsFile->fixer->endChangeset(); - } - } - } - - // Check if this is a single line or multi-line function call. - if ($this->isMultiLineCall($phpcsFile, $stackPtr, $openBracket, $tokens) === true) { - $this->processMultiLineCall($phpcsFile, $stackPtr, $openBracket, $tokens); - } else { - $this->processSingleLineCall($phpcsFile, $stackPtr, $openBracket, $tokens); - } - - }//end process() - - - /** - * Determine if this is a multi-line function call. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $openBracket The position of the opening bracket - * in the stack passed in $tokens. - * @param array $tokens The stack of tokens that make up - * the file. - * - * @return bool - */ - public function isMultiLineCall(File $phpcsFile, $stackPtr, $openBracket, $tokens) - { - $closeBracket = $tokens[$openBracket]['parenthesis_closer']; - if ($tokens[$openBracket]['line'] !== $tokens[$closeBracket]['line']) { - return true; - } - - return false; - - }//end isMultiLineCall() - - - /** - * Processes single-line calls. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $openBracket The position of the opening bracket - * in the stack passed in $tokens. - * @param array $tokens The stack of tokens that make up - * the file. - * - * @return void - */ - public function processSingleLineCall(File $phpcsFile, $stackPtr, $openBracket, $tokens) - { - $closer = $tokens[$openBracket]['parenthesis_closer']; - if ($openBracket === ($closer - 1)) { - return; - } - - // If the function call has no arguments or comments, enforce 0 spaces. - $next = $phpcsFile->findNext(T_WHITESPACE, ($openBracket + 1), $closer, true); - if ($next === false) { - $requiredSpacesAfterOpen = 0; - $requiredSpacesBeforeClose = 0; - } else { - $requiredSpacesAfterOpen = $this->requiredSpacesAfterOpen; - $requiredSpacesBeforeClose = $this->requiredSpacesBeforeClose; - } - - if ($requiredSpacesAfterOpen === 0 && $tokens[($openBracket + 1)]['code'] === T_WHITESPACE) { - // Checking this: $value = my_function([*]...). - $error = 'Space after opening parenthesis of function call prohibited'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceAfterOpenBracket'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($openBracket + 1), ''); - } - } else if ($requiredSpacesAfterOpen > 0) { - $spaceAfterOpen = 0; - if ($tokens[($openBracket + 1)]['code'] === T_WHITESPACE) { - $spaceAfterOpen = $tokens[($openBracket + 1)]['length']; - } - - if ($spaceAfterOpen !== $requiredSpacesAfterOpen) { - $error = 'Expected %s spaces after opening parenthesis; %s found'; - $data = [ - $requiredSpacesAfterOpen, - $spaceAfterOpen, - ]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceAfterOpenBracket', $data); - if ($fix === true) { - $padding = str_repeat(' ', $requiredSpacesAfterOpen); - if ($spaceAfterOpen === 0) { - $phpcsFile->fixer->addContent($openBracket, $padding); - } else { - $phpcsFile->fixer->replaceToken(($openBracket + 1), $padding); - } - } - } - }//end if - - // Checking this: $value = my_function(...[*]). - $spaceBeforeClose = 0; - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($closer - 1), $openBracket, true); - if ($tokens[$prev]['code'] === T_END_HEREDOC || $tokens[$prev]['code'] === T_END_NOWDOC) { - // Need a newline after these tokens, so ignore this rule. - return; - } - - if ($tokens[$prev]['line'] !== $tokens[$closer]['line']) { - $spaceBeforeClose = 'newline'; - } else if ($tokens[($closer - 1)]['code'] === T_WHITESPACE) { - $spaceBeforeClose = $tokens[($closer - 1)]['length']; - } - - if ($spaceBeforeClose !== $requiredSpacesBeforeClose) { - $error = 'Expected %s spaces before closing parenthesis; %s found'; - $data = [ - $requiredSpacesBeforeClose, - $spaceBeforeClose, - ]; - $fix = $phpcsFile->addFixableError($error, $closer, 'SpaceBeforeCloseBracket', $data); - if ($fix === true) { - $padding = str_repeat(' ', $requiredSpacesBeforeClose); - - if ($spaceBeforeClose === 0) { - $phpcsFile->fixer->addContentBefore($closer, $padding); - } else if ($spaceBeforeClose === 'newline') { - $phpcsFile->fixer->beginChangeset(); - - $closingContent = ')'; - - $next = $phpcsFile->findNext(T_WHITESPACE, ($closer + 1), null, true); - if ($tokens[$next]['code'] === T_SEMICOLON) { - $closingContent .= ';'; - for ($i = ($closer + 1); $i <= $next; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - } - - // We want to jump over any whitespace or inline comment and - // move the closing parenthesis after any other token. - $prev = ($closer - 1); - while (isset(Tokens::$emptyTokens[$tokens[$prev]['code']]) === true) { - if (($tokens[$prev]['code'] === T_COMMENT) - && (strpos($tokens[$prev]['content'], '*/') !== false) - ) { - break; - } - - $prev--; - } - - $phpcsFile->fixer->addContent($prev, $padding.$closingContent); - - $prevNonWhitespace = $phpcsFile->findPrevious(T_WHITESPACE, ($closer - 1), null, true); - for ($i = ($prevNonWhitespace + 1); $i <= $closer; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } else { - $phpcsFile->fixer->replaceToken(($closer - 1), $padding); - }//end if - }//end if - }//end if - - }//end processSingleLineCall() - - - /** - * Processes multi-line calls. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $openBracket The position of the opening bracket - * in the stack passed in $tokens. - * @param array $tokens The stack of tokens that make up - * the file. - * - * @return void - */ - public function processMultiLineCall(File $phpcsFile, $stackPtr, $openBracket, $tokens) - { - // We need to work out how far indented the function - // call itself is, so we can work out how far to - // indent the arguments. - $first = $phpcsFile->findFirstOnLine(T_WHITESPACE, $stackPtr, true); - if ($first !== false - && $tokens[$first]['code'] === T_CONSTANT_ENCAPSED_STRING - && $tokens[($first - 1)]['code'] === T_CONSTANT_ENCAPSED_STRING - ) { - // We are in a multi-line string, so find the start and use - // the indent from there. - $prev = $phpcsFile->findPrevious(T_CONSTANT_ENCAPSED_STRING, ($first - 2), null, true); - $first = $phpcsFile->findFirstOnLine(Tokens::$emptyTokens, $prev, true); - if ($first === false) { - $first = ($prev + 1); - } - } - - $foundFunctionIndent = 0; - if ($first !== false) { - if ($tokens[$first]['code'] === T_INLINE_HTML - || ($tokens[$first]['code'] === T_CONSTANT_ENCAPSED_STRING - && $tokens[($first - 1)]['code'] === T_CONSTANT_ENCAPSED_STRING) - ) { - $trimmed = ltrim($tokens[$first]['content']); - if ($trimmed === '') { - $foundFunctionIndent = strlen($tokens[$first]['content']); - } else { - $foundFunctionIndent = (strlen($tokens[$first]['content']) - strlen($trimmed)); - } - } else { - $foundFunctionIndent = ($tokens[$first]['column'] - 1); - } - } - - // Make sure the function indent is divisible by the indent size. - // We round down here because this accounts for times when the - // surrounding code is indented a little too far in, and not correctly - // at a tab stop. Without this, the function will be indented a further - // $indent spaces to the right. - $functionIndent = (int) (floor($foundFunctionIndent / $this->indent) * $this->indent); - $adjustment = 0; - - if ($foundFunctionIndent !== $functionIndent) { - $error = 'Opening statement of multi-line function call not indented correctly; expected %s spaces but found %s'; - $data = [ - $functionIndent, - $foundFunctionIndent, - ]; - - $fix = $phpcsFile->addFixableError($error, $first, 'OpeningIndent', $data); - if ($fix === true) { - // Set adjustment for use later to determine whether argument indentation is correct when fixing. - $adjustment = ($functionIndent - $foundFunctionIndent); - - $padding = str_repeat(' ', $functionIndent); - if ($foundFunctionIndent === 0) { - $phpcsFile->fixer->addContentBefore($first, $padding); - } else if ($tokens[$first]['code'] === T_INLINE_HTML) { - $newContent = $padding.ltrim($tokens[$first]['content']); - $phpcsFile->fixer->replaceToken($first, $newContent); - } else { - $phpcsFile->fixer->replaceToken(($first - 1), $padding); - } - } - }//end if - - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($openBracket + 1), null, true); - if ($tokens[$next]['line'] === $tokens[$openBracket]['line']) { - $error = 'Opening parenthesis of a multi-line function call must be the last content on the line'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'ContentAfterOpenBracket'); - if ($fix === true) { - $phpcsFile->fixer->addContent( - $openBracket, - $phpcsFile->eolChar.str_repeat(' ', ($foundFunctionIndent + $this->indent)) - ); - } - } - - $closeBracket = $tokens[$openBracket]['parenthesis_closer']; - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($closeBracket - 1), null, true); - if ($tokens[$prev]['line'] === $tokens[$closeBracket]['line']) { - $error = 'Closing parenthesis of a multi-line function call must be on a line by itself'; - $fix = $phpcsFile->addFixableError($error, $closeBracket, 'CloseBracketLine'); - if ($fix === true) { - $phpcsFile->fixer->addContentBefore( - $closeBracket, - $phpcsFile->eolChar.str_repeat(' ', ($foundFunctionIndent + $this->indent)) - ); - } - } - - // Each line between the parenthesis should be indented n spaces. - $lastLine = ($tokens[$openBracket]['line'] - 1); - $argStart = null; - $argEnd = null; - - // Start processing at the first argument. - $i = $phpcsFile->findNext(T_WHITESPACE, ($openBracket + 1), null, true); - - if ($tokens[$i]['line'] > ($tokens[$openBracket]['line'] + 1)) { - $error = 'The first argument in a multi-line function call must be on the line after the opening parenthesis'; - $fix = $phpcsFile->addFixableError($error, $i, 'FirstArgumentPosition'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($x = ($openBracket + 1); $x < $i; $x++) { - if ($tokens[$x]['line'] === $tokens[$openBracket]['line']) { - continue; - } - - if ($tokens[$x]['line'] === $tokens[$i]['line']) { - break; - } - - $phpcsFile->fixer->replaceToken($x, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - }//end if - - $i = $phpcsFile->findNext(Tokens::$emptyTokens, ($openBracket + 1), null, true); - - if ($tokens[($i - 1)]['code'] === T_WHITESPACE - && $tokens[($i - 1)]['line'] === $tokens[$i]['line'] - ) { - // Make sure we check the indent. - $i--; - } - - for ($i; $i < $closeBracket; $i++) { - if ($i > $argStart && $i < $argEnd) { - $inArg = true; - } else { - $inArg = false; - } - - if ($tokens[$i]['line'] !== $lastLine) { - $lastLine = $tokens[$i]['line']; - - // Ignore heredoc indentation. - if (isset(Tokens::$heredocTokens[$tokens[$i]['code']]) === true) { - continue; - } - - // Ignore multi-line string indentation. - if (isset(Tokens::$stringTokens[$tokens[$i]['code']]) === true - && $tokens[$i]['code'] === $tokens[($i - 1)]['code'] - ) { - continue; - } - - // Ignore inline HTML. - if ($tokens[$i]['code'] === T_INLINE_HTML) { - continue; - } - - if ($tokens[$i]['line'] !== $tokens[$openBracket]['line']) { - // We changed lines, so this should be a whitespace indent token, but first make - // sure it isn't a blank line because we don't need to check indent unless there - // is actually some code to indent. - if ($tokens[$i]['code'] === T_WHITESPACE) { - $nextCode = $phpcsFile->findNext(T_WHITESPACE, ($i + 1), ($closeBracket + 1), true); - if ($tokens[$nextCode]['line'] !== $lastLine) { - if ($inArg === false) { - $error = 'Empty lines are not allowed in multi-line function calls'; - $fix = $phpcsFile->addFixableError($error, $i, 'EmptyLine'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($i, ''); - } - } - - continue; - } - } else { - $nextCode = $i; - } - - if ($tokens[$nextCode]['line'] === $tokens[$closeBracket]['line']) { - // Closing brace needs to be indented to the same level - // as the function call. - $inArg = false; - $expectedIndent = ($foundFunctionIndent + $adjustment); - } else { - $expectedIndent = ($foundFunctionIndent + $this->indent + $adjustment); - } - - if ($tokens[$i]['code'] !== T_WHITESPACE - && $tokens[$i]['code'] !== T_DOC_COMMENT_WHITESPACE - ) { - // Just check if it is a multi-line block comment. If so, we can - // calculate the indent from the whitespace before the content. - if ($tokens[$i]['code'] === T_COMMENT - && $tokens[($i - 1)]['code'] === T_COMMENT - ) { - $trimmedLength = strlen(ltrim($tokens[$i]['content'])); - if ($trimmedLength === 0) { - // This is a blank comment line, so indenting it is - // pointless. - continue; - } - - $foundIndent = (strlen($tokens[$i]['content']) - $trimmedLength); - } else { - $foundIndent = 0; - } - } else { - $foundIndent = $tokens[$i]['length']; - } - - if ($foundIndent < $expectedIndent - || ($inArg === false - && $expectedIndent !== $foundIndent) - ) { - $error = 'Multi-line function call not indented correctly; expected %s spaces but found %s'; - $data = [ - $expectedIndent, - $foundIndent, - ]; - - $fix = $phpcsFile->addFixableError($error, $i, 'Indent', $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - $padding = str_repeat(' ', $expectedIndent); - if ($foundIndent === 0) { - $phpcsFile->fixer->addContentBefore($i, $padding); - if (isset($tokens[$i]['scope_opener']) === true) { - $phpcsFile->fixer->changeCodeBlockIndent($i, $tokens[$i]['scope_closer'], $expectedIndent); - } - } else { - if ($tokens[$i]['code'] === T_COMMENT) { - $comment = $padding.ltrim($tokens[$i]['content']); - $phpcsFile->fixer->replaceToken($i, $comment); - } else { - $phpcsFile->fixer->replaceToken($i, $padding); - } - - if (isset($tokens[($i + 1)]['scope_opener']) === true) { - $phpcsFile->fixer->changeCodeBlockIndent(($i + 1), $tokens[($i + 1)]['scope_closer'], ($expectedIndent - $foundIndent)); - } - } - - $phpcsFile->fixer->endChangeset(); - }//end if - }//end if - } else { - $nextCode = $i; - }//end if - - if ($inArg === false) { - $argStart = $nextCode; - $argEnd = $phpcsFile->findEndOfStatement($nextCode, [T_COLON]); - } - }//end if - - // If we are within an argument we should be ignoring commas - // as these are not signalling the end of an argument. - if ($inArg === false && $tokens[$i]['code'] === T_COMMA) { - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($i + 1), $closeBracket, true); - if ($next === false) { - continue; - } - - if ($this->allowMultipleArguments === false) { - // Comma has to be the last token on the line. - if ($tokens[$i]['line'] === $tokens[$next]['line']) { - $error = 'Only one argument is allowed per line in a multi-line function call'; - $fix = $phpcsFile->addFixableError($error, $next, 'MultipleArguments'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($x = ($next - 1); $x > $i; $x--) { - if ($tokens[$x]['code'] !== T_WHITESPACE) { - break; - } - - $phpcsFile->fixer->replaceToken($x, ''); - } - - $phpcsFile->fixer->addContentBefore( - $next, - $phpcsFile->eolChar.str_repeat(' ', ($foundFunctionIndent + $this->indent)) - ); - $phpcsFile->fixer->endChangeset(); - } - } - }//end if - - $argStart = $next; - $argEnd = $phpcsFile->findEndOfStatement($next, [T_COLON]); - }//end if - }//end for - - }//end processMultiLineCall() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Functions/FunctionDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Functions/FunctionDeclarationSniff.php deleted file mode 100644 index 94d19de..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Functions/FunctionDeclarationSniff.php +++ /dev/null @@ -1,546 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Sniffs\Functions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Standards\Generic\Sniffs\Functions\OpeningFunctionBraceBsdAllmanSniff; -use PHP_CodeSniffer\Standards\Generic\Sniffs\Functions\OpeningFunctionBraceKernighanRitchieSniff; -use PHP_CodeSniffer\Util\Tokens; - -class FunctionDeclarationSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - /** - * The number of spaces code should be indented. - * - * @var integer - */ - public $indent = 4; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_FUNCTION, - T_CLOSURE, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['parenthesis_opener']) === false - || isset($tokens[$stackPtr]['parenthesis_closer']) === false - ) { - return; - } - - $openBracket = $tokens[$stackPtr]['parenthesis_opener']; - $closeBracket = $tokens[$stackPtr]['parenthesis_closer']; - - if (strtolower($tokens[$stackPtr]['content']) === 'function') { - // Must be one space after the FUNCTION keyword. - if ($tokens[($stackPtr + 1)]['content'] === $phpcsFile->eolChar) { - $spaces = 'newline'; - } else if ($tokens[($stackPtr + 1)]['code'] === T_WHITESPACE) { - $spaces = $tokens[($stackPtr + 1)]['length']; - } else { - $spaces = 0; - } - - if ($spaces !== 1) { - $error = 'Expected 1 space after FUNCTION keyword; %s found'; - $data = [$spaces]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceAfterFunction', $data); - if ($fix === true) { - if ($spaces === 0) { - $phpcsFile->fixer->addContent($stackPtr, ' '); - } else { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ' '); - } - } - } - }//end if - - // Must be no space before the opening parenthesis. For closures, this is - // enforced by the previous check because there is no content between the keywords - // and the opening parenthesis. - // Unfinished closures are tokenized as T_FUNCTION however, and can be excluded - // by checking if the function has a name. - $methodProps = $phpcsFile->getMethodProperties($stackPtr); - $methodName = $phpcsFile->getDeclarationName($stackPtr); - if ($tokens[$stackPtr]['code'] === T_FUNCTION && $methodName !== null) { - if ($tokens[($openBracket - 1)]['content'] === $phpcsFile->eolChar) { - $spaces = 'newline'; - } else if ($tokens[($openBracket - 1)]['code'] === T_WHITESPACE) { - $spaces = $tokens[($openBracket - 1)]['length']; - } else { - $spaces = 0; - } - - if ($spaces !== 0) { - $error = 'Expected 0 spaces before opening parenthesis; %s found'; - $data = [$spaces]; - $fix = $phpcsFile->addFixableError($error, $openBracket, 'SpaceBeforeOpenParen', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($openBracket - 1), ''); - } - } - - // Must be no space before semicolon in abstract/interface methods. - if ($methodProps['has_body'] === false) { - $end = $phpcsFile->findNext(T_SEMICOLON, $closeBracket); - if ($end !== false) { - if ($tokens[($end - 1)]['content'] === $phpcsFile->eolChar) { - $spaces = 'newline'; - } else if ($tokens[($end - 1)]['code'] === T_WHITESPACE) { - $spaces = $tokens[($end - 1)]['length']; - } else { - $spaces = 0; - } - - if ($spaces !== 0) { - $error = 'Expected 0 spaces before semicolon; %s found'; - $data = [$spaces]; - $fix = $phpcsFile->addFixableError($error, $end, 'SpaceBeforeSemicolon', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($end - 1), ''); - } - } - } - }//end if - }//end if - - // Must be one space before and after USE keyword for closures. - if ($tokens[$stackPtr]['code'] === T_CLOSURE) { - $use = $phpcsFile->findNext(T_USE, ($closeBracket + 1), $tokens[$stackPtr]['scope_opener']); - if ($use !== false) { - if ($tokens[($use + 1)]['code'] !== T_WHITESPACE) { - $length = 0; - } else if ($tokens[($use + 1)]['content'] === "\t") { - $length = '\t'; - } else { - $length = $tokens[($use + 1)]['length']; - } - - if ($length !== 1) { - $error = 'Expected 1 space after USE keyword; found %s'; - $data = [$length]; - $fix = $phpcsFile->addFixableError($error, $use, 'SpaceAfterUse', $data); - if ($fix === true) { - if ($length === 0) { - $phpcsFile->fixer->addContent($use, ' '); - } else { - $phpcsFile->fixer->replaceToken(($use + 1), ' '); - } - } - } - - if ($tokens[($use - 1)]['code'] !== T_WHITESPACE) { - $length = 0; - } else if ($tokens[($use - 1)]['content'] === "\t") { - $length = '\t'; - } else { - $length = $tokens[($use - 1)]['length']; - } - - if ($length !== 1) { - $error = 'Expected 1 space before USE keyword; found %s'; - $data = [$length]; - $fix = $phpcsFile->addFixableError($error, $use, 'SpaceBeforeUse', $data); - if ($fix === true) { - if ($length === 0) { - $phpcsFile->fixer->addContentBefore($use, ' '); - } else { - $phpcsFile->fixer->replaceToken(($use - 1), ' '); - } - } - } - }//end if - }//end if - - if ($this->isMultiLineDeclaration($phpcsFile, $stackPtr, $openBracket, $tokens) === true) { - $this->processMultiLineDeclaration($phpcsFile, $stackPtr, $tokens); - } else { - $this->processSingleLineDeclaration($phpcsFile, $stackPtr, $tokens); - } - - }//end process() - - - /** - * Determine if this is a multi-line function declaration. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $openBracket The position of the opening bracket - * in the stack passed in $tokens. - * @param array $tokens The stack of tokens that make up - * the file. - * - * @return bool - */ - public function isMultiLineDeclaration($phpcsFile, $stackPtr, $openBracket, $tokens) - { - $closeBracket = $tokens[$openBracket]['parenthesis_closer']; - if ($tokens[$openBracket]['line'] !== $tokens[$closeBracket]['line']) { - return true; - } - - // Closures may use the USE keyword and so be multi-line in this way. - if ($tokens[$stackPtr]['code'] === T_CLOSURE) { - $use = $phpcsFile->findNext(T_USE, ($closeBracket + 1), $tokens[$stackPtr]['scope_opener']); - if ($use !== false) { - // If the opening and closing parenthesis of the use statement - // are also on the same line, this is a single line declaration. - $open = $phpcsFile->findNext(T_OPEN_PARENTHESIS, ($use + 1)); - $close = $tokens[$open]['parenthesis_closer']; - if ($tokens[$open]['line'] !== $tokens[$close]['line']) { - return true; - } - } - } - - return false; - - }//end isMultiLineDeclaration() - - - /** - * Processes single-line declarations. - * - * Just uses the Generic BSD-Allman brace sniff. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param array $tokens The stack of tokens that make up - * the file. - * - * @return void - */ - public function processSingleLineDeclaration($phpcsFile, $stackPtr, $tokens) - { - if ($tokens[$stackPtr]['code'] === T_CLOSURE) { - $sniff = new OpeningFunctionBraceKernighanRitchieSniff(); - } else { - $sniff = new OpeningFunctionBraceBsdAllmanSniff(); - } - - $sniff->checkClosures = true; - $sniff->process($phpcsFile, $stackPtr); - - }//end processSingleLineDeclaration() - - - /** - * Processes multi-line declarations. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param array $tokens The stack of tokens that make up - * the file. - * - * @return void - */ - public function processMultiLineDeclaration($phpcsFile, $stackPtr, $tokens) - { - $this->processArgumentList($phpcsFile, $stackPtr, $this->indent); - - $closeBracket = $tokens[$stackPtr]['parenthesis_closer']; - if ($tokens[$stackPtr]['code'] === T_CLOSURE) { - $use = $phpcsFile->findNext(T_USE, ($closeBracket + 1), $tokens[$stackPtr]['scope_opener']); - if ($use !== false) { - $open = $phpcsFile->findNext(T_OPEN_PARENTHESIS, ($use + 1)); - $closeBracket = $tokens[$open]['parenthesis_closer']; - } - } - - if (isset($tokens[$stackPtr]['scope_opener']) === false) { - return; - } - - // The opening brace needs to be on the same line as the closing parenthesis. - // There should only be one space between the closing parenthesis - or the end of the - // return type - and the opening brace. - $opener = $tokens[$stackPtr]['scope_opener']; - if ($tokens[$opener]['line'] !== $tokens[$closeBracket]['line']) { - $error = 'The closing parenthesis and the opening brace of a multi-line function declaration must be on the same line'; - $code = 'NewlineBeforeOpenBrace'; - - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($opener - 1), $closeBracket, true); - if ($tokens[$prev]['line'] === $tokens[$opener]['line']) { - // End of the return type is not on the same line as the close parenthesis. - $phpcsFile->addError($error, $opener, $code); - } else { - $fix = $phpcsFile->addFixableError($error, $opener, $code); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->addContent($prev, ' {'); - - // If the opener is on a line by itself, removing it will create - // an empty line, so remove the entire line instead. - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($opener - 1), $closeBracket, true); - $next = $phpcsFile->findNext(T_WHITESPACE, ($opener + 1), null, true); - - if ($tokens[$prev]['line'] < $tokens[$opener]['line'] - && $tokens[$next]['line'] > $tokens[$opener]['line'] - ) { - // Clear the whole line. - for ($i = ($prev + 1); $i < $next; $i++) { - if ($tokens[$i]['line'] === $tokens[$opener]['line']) { - $phpcsFile->fixer->replaceToken($i, ''); - } - } - } else { - // Just remove the opener. - $phpcsFile->fixer->replaceToken($opener, ''); - if ($tokens[$next]['line'] === $tokens[$opener]['line'] - && ($opener + 1) !== $next - ) { - $phpcsFile->fixer->replaceToken(($opener + 1), ''); - } - } - - $phpcsFile->fixer->endChangeset(); - }//end if - - return; - }//end if - }//end if - - $prev = $tokens[($opener - 1)]; - if ($prev['code'] !== T_WHITESPACE) { - $length = 0; - } else { - $length = strlen($prev['content']); - } - - if ($length !== 1) { - $error = 'There must be a single space between the closing parenthesis/return type and the opening brace of a multi-line function declaration; found %s spaces'; - $fix = $phpcsFile->addFixableError($error, ($opener - 1), 'SpaceBeforeOpenBrace', [$length]); - if ($fix === true) { - if ($length === 0) { - $phpcsFile->fixer->addContentBefore($opener, ' '); - } else { - $phpcsFile->fixer->replaceToken(($opener - 1), ' '); - } - } - } - - }//end processMultiLineDeclaration() - - - /** - * Processes multi-line argument list declarations. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $indent The number of spaces code should be indented. - * @param string $type The type of the token the brackets - * belong to. - * - * @return void - */ - public function processArgumentList($phpcsFile, $stackPtr, $indent, $type='function') - { - $tokens = $phpcsFile->getTokens(); - - // We need to work out how far indented the function - // declaration itself is, so we can work out how far to - // indent parameters. - $functionIndent = 0; - for ($i = ($stackPtr - 1); $i >= 0; $i--) { - if ($tokens[$i]['line'] !== $tokens[$stackPtr]['line']) { - break; - } - } - - // Move $i back to the line the function is or to 0. - $i++; - - if ($tokens[$i]['code'] === T_WHITESPACE) { - $functionIndent = $tokens[$i]['length']; - } - - // The closing parenthesis must be on a new line, even - // when checking abstract function definitions. - $closeBracket = $tokens[$stackPtr]['parenthesis_closer']; - $prev = $phpcsFile->findPrevious( - T_WHITESPACE, - ($closeBracket - 1), - null, - true - ); - - if ($tokens[$closeBracket]['line'] !== $tokens[$tokens[$closeBracket]['parenthesis_opener']]['line'] - && $tokens[$prev]['line'] === $tokens[$closeBracket]['line'] - ) { - $error = 'The closing parenthesis of a multi-line '.$type.' declaration must be on a new line'; - $fix = $phpcsFile->addFixableError($error, $closeBracket, 'CloseBracketLine'); - if ($fix === true) { - $phpcsFile->fixer->addNewlineBefore($closeBracket); - } - } - - // If this is a closure and is using a USE statement, the closing - // parenthesis we need to look at from now on is the closing parenthesis - // of the USE statement. - if ($tokens[$stackPtr]['code'] === T_CLOSURE) { - $use = $phpcsFile->findNext(T_USE, ($closeBracket + 1), $tokens[$stackPtr]['scope_opener']); - if ($use !== false) { - $open = $phpcsFile->findNext(T_OPEN_PARENTHESIS, ($use + 1)); - $closeBracket = $tokens[$open]['parenthesis_closer']; - - $prev = $phpcsFile->findPrevious( - T_WHITESPACE, - ($closeBracket - 1), - null, - true - ); - - if ($tokens[$closeBracket]['line'] !== $tokens[$tokens[$closeBracket]['parenthesis_opener']]['line'] - && $tokens[$prev]['line'] === $tokens[$closeBracket]['line'] - ) { - $error = 'The closing parenthesis of a multi-line use declaration must be on a new line'; - $fix = $phpcsFile->addFixableError($error, $closeBracket, 'UseCloseBracketLine'); - if ($fix === true) { - $phpcsFile->fixer->addNewlineBefore($closeBracket); - } - } - }//end if - }//end if - - // Each line between the parenthesis should be indented 4 spaces. - $openBracket = $tokens[$stackPtr]['parenthesis_opener']; - $lastLine = $tokens[$openBracket]['line']; - for ($i = ($openBracket + 1); $i < $closeBracket; $i++) { - if ($tokens[$i]['line'] !== $lastLine) { - if ($i === $tokens[$stackPtr]['parenthesis_closer'] - || ($tokens[$i]['code'] === T_WHITESPACE - && (($i + 1) === $closeBracket - || ($i + 1) === $tokens[$stackPtr]['parenthesis_closer'])) - ) { - // Closing braces need to be indented to the same level - // as the function. - $expectedIndent = $functionIndent; - } else { - $expectedIndent = ($functionIndent + $indent); - } - - // We changed lines, so this should be a whitespace indent token. - $foundIndent = 0; - if ($tokens[$i]['code'] === T_WHITESPACE - && $tokens[$i]['line'] !== $tokens[($i + 1)]['line'] - ) { - $error = 'Blank lines are not allowed in a multi-line '.$type.' declaration'; - $fix = $phpcsFile->addFixableError($error, $i, 'EmptyLine'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - // This is an empty line, so don't check the indent. - continue; - } else if ($tokens[$i]['code'] === T_WHITESPACE) { - $foundIndent = $tokens[$i]['length']; - } else if ($tokens[$i]['code'] === T_DOC_COMMENT_WHITESPACE) { - $foundIndent = $tokens[$i]['length']; - ++$expectedIndent; - } - - if ($expectedIndent !== $foundIndent) { - $error = 'Multi-line '.$type.' declaration not indented correctly; expected %s spaces but found %s'; - $data = [ - $expectedIndent, - $foundIndent, - ]; - - $fix = $phpcsFile->addFixableError($error, $i, 'Indent', $data); - if ($fix === true) { - $spaces = str_repeat(' ', $expectedIndent); - if ($foundIndent === 0) { - $phpcsFile->fixer->addContentBefore($i, $spaces); - } else { - $phpcsFile->fixer->replaceToken($i, $spaces); - } - } - } - - $lastLine = $tokens[$i]['line']; - }//end if - - if ($tokens[$i]['code'] === T_OPEN_PARENTHESIS - && isset($tokens[$i]['parenthesis_closer']) === true - ) { - $prevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($i - 1), null, true); - if ($tokens[$prevNonEmpty]['code'] !== T_USE) { - // Since PHP 8.1, a default value can contain a class instantiation. - // Skip over these "function calls" as they have their own indentation rules. - $i = $tokens[$i]['parenthesis_closer']; - $lastLine = $tokens[$i]['line']; - continue; - } - } - - if ($tokens[$i]['code'] === T_ARRAY || $tokens[$i]['code'] === T_OPEN_SHORT_ARRAY) { - // Skip arrays as they have their own indentation rules. - if ($tokens[$i]['code'] === T_OPEN_SHORT_ARRAY) { - $i = $tokens[$i]['bracket_closer']; - } else { - $i = $tokens[$i]['parenthesis_closer']; - } - - $lastLine = $tokens[$i]['line']; - continue; - } - - if ($tokens[$i]['code'] === T_ATTRIBUTE) { - // Skip attributes as they have their own indentation rules. - $i = $tokens[$i]['attribute_closer']; - $lastLine = $tokens[$i]['line']; - continue; - } - }//end for - - }//end processArgumentList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Functions/ValidDefaultValueSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Functions/ValidDefaultValueSniff.php deleted file mode 100644 index 808a0df..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/Functions/ValidDefaultValueSniff.php +++ /dev/null @@ -1,81 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Sniffs\Functions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ValidDefaultValueSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_FUNCTION, - T_CLOSURE, - T_FN, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - // Flag for when we have found a default in our arg list. - // If there is a value without a default after this, it is an error. - $defaultFound = false; - - $params = $phpcsFile->getMethodParameters($stackPtr); - foreach ($params as $param) { - if ($param['variable_length'] === true) { - continue; - } - - if (array_key_exists('default', $param) === true) { - $defaultFound = true; - $defaultValueLc = strtolower($param['default']); - // Check if the arg is type hinted and using NULL for the default. - // This does not make the argument optional - it just allows NULL - // to be passed in. - if ($param['type_hint'] !== '' - && ($defaultValueLc === 'null' || $defaultValueLc === '\null') - ) { - $defaultFound = false; - } - - continue; - } - - if ($defaultFound === true) { - $error = 'Arguments with default values must be at the end of the argument list'; - $phpcsFile->addError($error, $param['token'], 'NotAtEnd'); - return; - } - }//end foreach - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/NamingConventions/ValidClassNameSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/NamingConventions/ValidClassNameSniff.php deleted file mode 100644 index f40e72b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/NamingConventions/ValidClassNameSniff.php +++ /dev/null @@ -1,98 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Sniffs\NamingConventions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ValidClassNameSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_CLASS, - T_INTERFACE, - T_TRAIT, - T_ENUM, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being processed. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $className = $phpcsFile->findNext(T_STRING, $stackPtr); - $name = trim($tokens[$className]['content']); - $errorData = [ucfirst($tokens[$stackPtr]['content'])]; - - // Make sure the first letter is a capital. - if (preg_match('|^[A-Z]|', $name) === 0) { - $error = '%s name must begin with a capital letter'; - $phpcsFile->addError($error, $stackPtr, 'StartWithCapital', $errorData); - } - - // Check that each new word starts with a capital as well, but don't - // check the first word, as it is checked above. - $validName = true; - $nameBits = explode('_', $name); - $firstBit = array_shift($nameBits); - foreach ($nameBits as $bit) { - if ($bit === '' || $bit[0] !== strtoupper($bit[0])) { - $validName = false; - break; - } - } - - if ($validName === false) { - // Strip underscores because they cause the suggested name - // to be incorrect. - $nameBits = explode('_', trim($name, '_')); - $firstBit = array_shift($nameBits); - if ($firstBit === '') { - $error = '%s name is not valid'; - $phpcsFile->addError($error, $stackPtr, 'Invalid', $errorData); - } else { - $newName = strtoupper($firstBit[0]).substr($firstBit, 1).'_'; - foreach ($nameBits as $bit) { - if ($bit !== '') { - $newName .= strtoupper($bit[0]).substr($bit, 1).'_'; - } - } - - $newName = rtrim($newName, '_'); - $error = '%s name is not valid; consider %s instead'; - $data = $errorData; - $data[] = $newName; - $phpcsFile->addError($error, $stackPtr, 'Invalid', $data); - } - }//end if - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/NamingConventions/ValidFunctionNameSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/NamingConventions/ValidFunctionNameSniff.php deleted file mode 100644 index 922e6f4..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/NamingConventions/ValidFunctionNameSniff.php +++ /dev/null @@ -1,284 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Sniffs\NamingConventions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\AbstractScopeSniff; -use PHP_CodeSniffer\Util\Common; -use PHP_CodeSniffer\Util\Tokens; - -class ValidFunctionNameSniff extends AbstractScopeSniff -{ - - /** - * A list of all PHP magic methods. - * - * @var array - */ - protected $magicMethods = [ - 'construct' => true, - 'destruct' => true, - 'call' => true, - 'callstatic' => true, - 'get' => true, - 'set' => true, - 'isset' => true, - 'unset' => true, - 'sleep' => true, - 'wakeup' => true, - 'serialize' => true, - 'unserialize' => true, - 'tostring' => true, - 'invoke' => true, - 'set_state' => true, - 'clone' => true, - 'debuginfo' => true, - ]; - - /** - * A list of all PHP magic functions. - * - * @var array - */ - protected $magicFunctions = ['autoload' => true]; - - - /** - * Constructs a PEAR_Sniffs_NamingConventions_ValidFunctionNameSniff. - */ - public function __construct() - { - parent::__construct(Tokens::$ooScopeTokens, [T_FUNCTION], true); - - }//end __construct() - - - /** - * Processes the tokens within the scope. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being processed. - * @param int $stackPtr The position where this token was - * found. - * @param int $currScope The position of the current scope. - * - * @return void - */ - protected function processTokenWithinScope(File $phpcsFile, $stackPtr, $currScope) - { - $tokens = $phpcsFile->getTokens(); - - // Determine if this is a function which needs to be examined. - $conditions = $tokens[$stackPtr]['conditions']; - end($conditions); - $deepestScope = key($conditions); - if ($deepestScope !== $currScope) { - return; - } - - $methodName = $phpcsFile->getDeclarationName($stackPtr); - if ($methodName === null) { - // Ignore closures. - return; - } - - $className = $phpcsFile->getDeclarationName($currScope); - if (isset($className) === false) { - $className = '[Anonymous Class]'; - } - - $errorData = [$className.'::'.$methodName]; - - $methodNameLc = strtolower($methodName); - $classNameLc = strtolower($className); - - // Is this a magic method. i.e., is prefixed with "__" ? - if (preg_match('|^__[^_]|', $methodName) !== 0) { - $magicPart = substr($methodNameLc, 2); - if (isset($this->magicMethods[$magicPart]) === true) { - return; - } - - $error = 'Method name "%s" is invalid; only PHP magic methods should be prefixed with a double underscore'; - $phpcsFile->addError($error, $stackPtr, 'MethodDoubleUnderscore', $errorData); - } - - // PHP4 constructors are allowed to break our rules. - if ($methodNameLc === $classNameLc) { - return; - } - - // PHP4 destructors are allowed to break our rules. - if ($methodNameLc === '_'.$classNameLc) { - return; - } - - $methodProps = $phpcsFile->getMethodProperties($stackPtr); - $scope = $methodProps['scope']; - $scopeSpecified = $methodProps['scope_specified']; - - if ($methodProps['scope'] === 'private') { - $isPublic = false; - } else { - $isPublic = true; - } - - // If it's a private method, it must have an underscore on the front. - if ($isPublic === false) { - if ($methodName[0] !== '_') { - $error = 'Private method name "%s" must be prefixed with an underscore'; - $phpcsFile->addError($error, $stackPtr, 'PrivateNoUnderscore', $errorData); - $phpcsFile->recordMetric($stackPtr, 'Private method prefixed with underscore', 'no'); - } else { - $phpcsFile->recordMetric($stackPtr, 'Private method prefixed with underscore', 'yes'); - } - } - - // If it's not a private method, it must not have an underscore on the front. - if ($isPublic === true && $scopeSpecified === true && $methodName[0] === '_') { - $error = '%s method name "%s" must not be prefixed with an underscore'; - $data = [ - ucfirst($scope), - $errorData[0], - ]; - $phpcsFile->addError($error, $stackPtr, 'PublicUnderscore', $data); - } - - $testMethodName = ltrim($methodName, '_'); - - if (Common::isCamelCaps($testMethodName, false, true, false) === false) { - if ($scopeSpecified === true) { - $error = '%s method name "%s" is not in camel caps format'; - $data = [ - ucfirst($scope), - $errorData[0], - ]; - $phpcsFile->addError($error, $stackPtr, 'ScopeNotCamelCaps', $data); - } else { - $error = 'Method name "%s" is not in camel caps format'; - $phpcsFile->addError($error, $stackPtr, 'NotCamelCaps', $errorData); - } - } - - }//end processTokenWithinScope() - - - /** - * Processes the tokens outside the scope. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being processed. - * @param int $stackPtr The position where this token was - * found. - * - * @return void - */ - protected function processTokenOutsideScope(File $phpcsFile, $stackPtr) - { - $functionName = $phpcsFile->getDeclarationName($stackPtr); - if ($functionName === null) { - // Ignore closures. - return; - } - - if (ltrim($functionName, '_') === '') { - // Ignore special functions. - return; - } - - $errorData = [$functionName]; - - // Is this a magic function. i.e., it is prefixed with "__". - if (preg_match('|^__[^_]|', $functionName) !== 0) { - $magicPart = strtolower(substr($functionName, 2)); - if (isset($this->magicFunctions[$magicPart]) === true) { - return; - } - - $error = 'Function name "%s" is invalid; only PHP magic methods should be prefixed with a double underscore'; - $phpcsFile->addError($error, $stackPtr, 'FunctionDoubleUnderscore', $errorData); - } - - // Function names can be in two parts; the package name and - // the function name. - $packagePart = ''; - $underscorePos = strrpos($functionName, '_'); - if ($underscorePos === false) { - $camelCapsPart = $functionName; - } else { - $packagePart = substr($functionName, 0, $underscorePos); - $camelCapsPart = substr($functionName, ($underscorePos + 1)); - - // We don't care about _'s on the front. - $packagePart = ltrim($packagePart, '_'); - } - - // If it has a package part, make sure the first letter is a capital. - if ($packagePart !== '') { - if ($functionName[0] === '_') { - $error = 'Function name "%s" is invalid; only private methods should be prefixed with an underscore'; - $phpcsFile->addError($error, $stackPtr, 'FunctionUnderscore', $errorData); - } - - if ($functionName[0] !== strtoupper($functionName[0])) { - $error = 'Function name "%s" is prefixed with a package name but does not begin with a capital letter'; - $phpcsFile->addError($error, $stackPtr, 'FunctionNoCapital', $errorData); - } - } - - // If it doesn't have a camel caps part, it's not valid. - if (trim($camelCapsPart) === '') { - $error = 'Function name "%s" is not valid; name appears incomplete'; - $phpcsFile->addError($error, $stackPtr, 'FunctionInvalid', $errorData); - return; - } - - $validName = true; - $newPackagePart = $packagePart; - $newCamelCapsPart = $camelCapsPart; - - // Every function must have a camel caps part, so check that first. - if (Common::isCamelCaps($camelCapsPart, false, true, false) === false) { - $validName = false; - $newCamelCapsPart = strtolower($camelCapsPart[0]).substr($camelCapsPart, 1); - } - - if ($packagePart !== '') { - // Check that each new word starts with a capital. - $nameBits = explode('_', $packagePart); - $nameBits = array_filter($nameBits); - foreach ($nameBits as $bit) { - if ($bit[0] !== strtoupper($bit[0])) { - $newPackagePart = ''; - foreach ($nameBits as $bit) { - $newPackagePart .= strtoupper($bit[0]).substr($bit, 1).'_'; - } - - $validName = false; - break; - } - } - } - - if ($validName === false) { - if ($newPackagePart === '') { - $newName = $newCamelCapsPart; - } else { - $newName = rtrim($newPackagePart, '_').'_'.$newCamelCapsPart; - } - - $error = 'Function name "%s" is invalid; consider "%s" instead'; - $data = $errorData; - $data[] = $newName; - $phpcsFile->addError($error, $stackPtr, 'FunctionNameInvalid', $data); - } - - }//end processTokenOutsideScope() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/NamingConventions/ValidVariableNameSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/NamingConventions/ValidVariableNameSniff.php deleted file mode 100644 index 5657949..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/NamingConventions/ValidVariableNameSniff.php +++ /dev/null @@ -1,107 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Sniffs\NamingConventions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\AbstractVariableSniff; - -class ValidVariableNameSniff extends AbstractVariableSniff -{ - - - /** - * Processes class member variables. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - protected function processMemberVar(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $memberProps = $phpcsFile->getMemberProperties($stackPtr); - if (empty($memberProps) === true) { - return; - } - - $memberName = ltrim($tokens[$stackPtr]['content'], '$'); - $scope = $memberProps['scope']; - $scopeSpecified = $memberProps['scope_specified']; - if ($scopeSpecified === false && $memberProps['set_scope'] !== false) { - // Implicit `public` visibility for property with asymmetric visibility. - $scopeSpecified = true; - } - - if ($memberProps['scope'] === 'private') { - $isPublic = false; - } else { - $isPublic = true; - } - - // If it's a private member, it must have an underscore on the front. - if ($isPublic === false && $memberName[0] !== '_') { - $error = 'Private member variable "%s" must be prefixed with an underscore'; - $data = [$memberName]; - $phpcsFile->addError($error, $stackPtr, 'PrivateNoUnderscore', $data); - return; - } - - // If it's not a private member, it must not have an underscore on the front. - if ($isPublic === true && $scopeSpecified === true && $memberName[0] === '_') { - $error = '%s member variable "%s" must not be prefixed with an underscore'; - $data = [ - ucfirst($scope), - $memberName, - ]; - $phpcsFile->addError($error, $stackPtr, 'PublicUnderscore', $data); - return; - } - - }//end processMemberVar() - - - /** - * Processes normal variables. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position where the token was found. - * - * @return void - */ - protected function processVariable(File $phpcsFile, $stackPtr) - { - /* - We don't care about normal variables. - */ - - }//end processVariable() - - - /** - * Processes variables in double quoted strings. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position where the token was found. - * - * @return void - */ - protected function processVariableInString(File $phpcsFile, $stackPtr) - { - /* - We don't care about normal variables. - */ - - }//end processVariableInString() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/WhiteSpace/ObjectOperatorIndentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/WhiteSpace/ObjectOperatorIndentSniff.php deleted file mode 100644 index 8dfe380..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/WhiteSpace/ObjectOperatorIndentSniff.php +++ /dev/null @@ -1,201 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ObjectOperatorIndentSniff implements Sniff -{ - - /** - * The number of spaces code should be indented. - * - * @var integer - */ - public $indent = 4; - - /** - * Indicates whether multilevel indenting is allowed. - * - * @var boolean - */ - public $multilevel = false; - - /** - * Tokens to listen for. - * - * @var array - */ - private $targets = [ - T_OBJECT_OPERATOR, - T_NULLSAFE_OBJECT_OPERATOR, - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return $this->targets; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile All the tokens found in the document. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Make sure this is the first object operator in a chain of them. - $start = $phpcsFile->findStartOfStatement($stackPtr); - $prev = $phpcsFile->findPrevious($this->targets, ($stackPtr - 1), $start); - if ($prev !== false) { - return; - } - - // Make sure this is a chained call. - $end = $phpcsFile->findEndOfStatement($stackPtr); - $next = $phpcsFile->findNext($this->targets, ($stackPtr + 1), $end); - if ($next === false) { - // Not a chained call. - return; - } - - // Determine correct indent. - for ($i = ($start - 1); $i >= 0; $i--) { - if ($tokens[$i]['line'] !== $tokens[$start]['line']) { - $i++; - break; - } - } - - $baseIndent = 0; - if ($i >= 0 && $tokens[$i]['code'] === T_WHITESPACE) { - $baseIndent = $tokens[$i]['length']; - } - - $baseIndent += $this->indent; - - // Determine the scope of the original object operator. - $origBrackets = null; - if (isset($tokens[$stackPtr]['nested_parenthesis']) === true) { - $origBrackets = $tokens[$stackPtr]['nested_parenthesis']; - } - - $origConditions = null; - if (isset($tokens[$stackPtr]['conditions']) === true) { - $origConditions = $tokens[$stackPtr]['conditions']; - } - - // Check indentation of each object operator in the chain. - // If the first object operator is on a different line than - // the variable, make sure we check its indentation too. - if ($tokens[$stackPtr]['line'] > $tokens[$start]['line']) { - $next = $stackPtr; - } - - $previousIndent = $baseIndent; - - while ($next !== false) { - // Make sure it is in the same scope, otherwise don't check indent. - $brackets = null; - if (isset($tokens[$next]['nested_parenthesis']) === true) { - $brackets = $tokens[$next]['nested_parenthesis']; - } - - $conditions = null; - if (isset($tokens[$next]['conditions']) === true) { - $conditions = $tokens[$next]['conditions']; - } - - if ($origBrackets === $brackets && $origConditions === $conditions) { - // Make sure it starts a line, otherwise don't check indent. - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($next - 1), $stackPtr, true); - $indent = $tokens[($next - 1)]; - if ($tokens[$prev]['line'] !== $tokens[$next]['line'] - && $indent['code'] === T_WHITESPACE - ) { - if ($indent['line'] === $tokens[$next]['line']) { - $foundIndent = strlen($indent['content']); - } else { - $foundIndent = 0; - } - - $minIndent = $previousIndent; - $maxIndent = $previousIndent; - $expectedIndent = $previousIndent; - - if ($this->multilevel === true) { - $minIndent = max(($previousIndent - $this->indent), $baseIndent); - $maxIndent = ($previousIndent + $this->indent); - $expectedIndent = min(max($foundIndent, $minIndent), $maxIndent); - } - - if ($foundIndent < $minIndent || $foundIndent > $maxIndent) { - $error = 'Object operator not indented correctly; expected %s spaces but found %s'; - $data = [ - $expectedIndent, - $foundIndent, - ]; - - $fix = $phpcsFile->addFixableError($error, $next, 'Incorrect', $data); - if ($fix === true) { - $spaces = str_repeat(' ', $expectedIndent); - if ($foundIndent === 0) { - $phpcsFile->fixer->addContentBefore($next, $spaces); - } else { - $phpcsFile->fixer->replaceToken(($next - 1), $spaces); - } - } - } - - $previousIndent = $expectedIndent; - }//end if - - // It cant be the last thing on the line either. - $content = $phpcsFile->findNext(T_WHITESPACE, ($next + 1), null, true); - if ($tokens[$content]['line'] !== $tokens[$next]['line']) { - $error = 'Object operator must be at the start of the line, not the end'; - $fix = $phpcsFile->addFixableError($error, $next, 'StartOfLine'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($x = ($next + 1); $x < $content; $x++) { - $phpcsFile->fixer->replaceToken($x, ''); - } - - $phpcsFile->fixer->addNewlineBefore($next); - $phpcsFile->fixer->endChangeset(); - } - } - }//end if - - $next = $phpcsFile->findNext( - $this->targets, - ($next + 1), - $end - ); - }//end while - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/WhiteSpace/ScopeClosingBraceSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/WhiteSpace/ScopeClosingBraceSniff.php deleted file mode 100644 index 7ec0842..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/WhiteSpace/ScopeClosingBraceSniff.php +++ /dev/null @@ -1,182 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ScopeClosingBraceSniff implements Sniff -{ - - /** - * The number of spaces code should be indented. - * - * @var integer - */ - public $indent = 4; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return Tokens::$scopeOpeners; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile All the tokens found in the document. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // If this is an inline condition (ie. there is no scope opener), then - // return, as this is not a new scope. - if (isset($tokens[$stackPtr]['scope_closer']) === false) { - return; - } - - $scopeStart = $tokens[$stackPtr]['scope_opener']; - $scopeEnd = $tokens[$stackPtr]['scope_closer']; - - // If the scope closer doesn't think it belongs to this scope opener - // then the opener is sharing its closer with other tokens. We only - // want to process the closer once, so skip this one. - if (isset($tokens[$scopeEnd]['scope_condition']) === false - || $tokens[$scopeEnd]['scope_condition'] !== $stackPtr - ) { - return; - } - - // We need to actually find the first piece of content on this line, - // because if this is a method with tokens before it (public, static etc) - // or an if with an else before it, then we need to start the scope - // checking from there, rather than the current token. - $lineStart = ($stackPtr - 1); - for ($lineStart; $lineStart > 0; $lineStart--) { - if (strpos($tokens[$lineStart]['content'], $phpcsFile->eolChar) !== false) { - break; - } - } - - $lineStart++; - - $startColumn = 1; - if ($tokens[$lineStart]['code'] === T_WHITESPACE) { - $startColumn = $tokens[($lineStart + 1)]['column']; - } else if ($tokens[$lineStart]['code'] === T_INLINE_HTML) { - $trimmed = ltrim($tokens[$lineStart]['content']); - if ($trimmed === '') { - $startColumn = $tokens[($lineStart + 1)]['column']; - } else { - $startColumn = (strlen($tokens[$lineStart]['content']) - strlen($trimmed)); - } - } - - // Check that the closing brace is on it's own line. - for ($lastContent = ($scopeEnd - 1); $lastContent > $scopeStart; $lastContent--) { - if ($tokens[$lastContent]['code'] === T_WHITESPACE || $tokens[$lastContent]['code'] === T_OPEN_TAG) { - continue; - } - - if ($tokens[$lastContent]['code'] === T_INLINE_HTML - && ltrim($tokens[$lastContent]['content']) === '' - ) { - continue; - } - - break; - } - - if ($tokens[$lastContent]['line'] === $tokens[$scopeEnd]['line']) { - $error = 'Closing brace must be on a line by itself'; - $fix = $phpcsFile->addFixableError($error, $scopeEnd, 'Line'); - if ($fix === true) { - $phpcsFile->fixer->addNewlineBefore($scopeEnd); - } - - return; - } - - // Check now that the closing brace is lined up correctly. - $lineStart = ($scopeEnd - 1); - for ($lineStart; $lineStart > 0; $lineStart--) { - if (strpos($tokens[$lineStart]['content'], $phpcsFile->eolChar) !== false) { - break; - } - } - - $lineStart++; - - $braceIndent = 0; - if ($tokens[$lineStart]['code'] === T_WHITESPACE) { - $braceIndent = ($tokens[($lineStart + 1)]['column'] - 1); - } else if ($tokens[$lineStart]['code'] === T_INLINE_HTML) { - $trimmed = ltrim($tokens[$lineStart]['content']); - if ($trimmed === '') { - $braceIndent = ($tokens[($lineStart + 1)]['column'] - 1); - } else { - $braceIndent = (strlen($tokens[$lineStart]['content']) - strlen($trimmed) - 1); - } - } - - $fix = false; - if ($tokens[$stackPtr]['code'] === T_CASE - || $tokens[$stackPtr]['code'] === T_DEFAULT - ) { - // BREAK statements should be indented n spaces from the - // CASE or DEFAULT statement. - $expectedIndent = ($startColumn + $this->indent - 1); - if ($braceIndent !== $expectedIndent) { - $error = 'Case breaking statement indented incorrectly; expected %s spaces, found %s'; - $data = [ - $expectedIndent, - $braceIndent, - ]; - $fix = $phpcsFile->addFixableError($error, $scopeEnd, 'BreakIndent', $data); - } - } else { - $expectedIndent = max(0, ($startColumn - 1)); - if ($braceIndent !== $expectedIndent) { - $error = 'Closing brace indented incorrectly; expected %s spaces, found %s'; - $data = [ - $expectedIndent, - $braceIndent, - ]; - $fix = $phpcsFile->addFixableError($error, $scopeEnd, 'Indent', $data); - } - }//end if - - if ($fix === true) { - $spaces = str_repeat(' ', $expectedIndent); - if ($braceIndent === 0) { - $phpcsFile->fixer->addContentBefore($lineStart, $spaces); - } else { - $phpcsFile->fixer->replaceToken($lineStart, ltrim($tokens[$lineStart]['content'])); - $phpcsFile->fixer->addContentBefore($lineStart, $spaces); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/WhiteSpace/ScopeIndentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/WhiteSpace/ScopeIndentSniff.php deleted file mode 100644 index 29586a9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Sniffs/WhiteSpace/ScopeIndentSniff.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Standards\Generic\Sniffs\WhiteSpace\ScopeIndentSniff as GenericScopeIndentSniff; - -class ScopeIndentSniff extends GenericScopeIndentSniff -{ - - /** - * Any scope openers that should not cause an indent. - * - * @var int[] - */ - protected $nonIndentingScopes = [T_SWITCH]; - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Classes/ClassDeclarationUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Classes/ClassDeclarationUnitTest.1.inc deleted file mode 100644 index 6942944..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Classes/ClassDeclarationUnitTest.1.inc +++ /dev/null @@ -1,114 +0,0 @@ -setLogger(new class {}); - -var_dump(new class(10) extends SomeClass implements SomeInterface { - private $num; - - public function __construct($num) - { - $this->num = $num; - } - - use SomeTrait; -}); - -class IncorrectClassDeclarationWithCommentAtEnd extends correctClassDeclaration /* Comment */ { -} - -class CorrectClassDeclarationWithCommentAtEnd extends correctClassDeclaration -/* Comment */ -{ -} - -// Don't move phpcs:ignore comments. -class PHPCSIgnoreAnnotationAfterOpeningBrace -{ // phpcs:ignore Standard.Cat.Sniff -- for reasons. -} - -// Moving any of the other trailing phpcs: comments is ok. -class PHPCSAnnotationAfterOpeningBrace -{ // phpcs:disable Standard.Cat.Sniff -- for reasons. -} - -if (!class_exists('ClassOpeningBraceShouldBeIndented')) { - abstract class ClassOpeningBraceShouldBeIndented -{ -} -} - -if (!class_exists('ClassOpeningBraceTooMuchIndentation')) { - final class ClassOpeningBraceTooMuchIndentation - { - } -} - -enum IncorrectBracePlacement {} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Classes/ClassDeclarationUnitTest.1.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Classes/ClassDeclarationUnitTest.1.inc.fixed deleted file mode 100644 index 26688b1..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Classes/ClassDeclarationUnitTest.1.inc.fixed +++ /dev/null @@ -1,125 +0,0 @@ -setLogger(new class {}); - -var_dump(new class(10) extends SomeClass implements SomeInterface { - private $num; - - public function __construct($num) - { - $this->num = $num; - } - - use SomeTrait; -}); - -class IncorrectClassDeclarationWithCommentAtEnd extends correctClassDeclaration /* Comment */ -{ -} - -class CorrectClassDeclarationWithCommentAtEnd extends correctClassDeclaration -/* Comment */ -{ -} - -// Don't move phpcs:ignore comments. -class PHPCSIgnoreAnnotationAfterOpeningBrace -{ // phpcs:ignore Standard.Cat.Sniff -- for reasons. -} - -// Moving any of the other trailing phpcs: comments is ok. -class PHPCSAnnotationAfterOpeningBrace -{ - // phpcs:disable Standard.Cat.Sniff -- for reasons. -} - -if (!class_exists('ClassOpeningBraceShouldBeIndented')) { - abstract class ClassOpeningBraceShouldBeIndented - { -} -} - -if (!class_exists('ClassOpeningBraceTooMuchIndentation')) { - final class ClassOpeningBraceTooMuchIndentation - { - } -} - -enum IncorrectBracePlacement -{ -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Classes/ClassDeclarationUnitTest.2.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Classes/ClassDeclarationUnitTest.2.inc deleted file mode 100644 index ac71fc9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Classes/ClassDeclarationUnitTest.2.inc +++ /dev/null @@ -1,11 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Tests\Classes; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ClassDeclaration sniff. - * - * @covers \PHP_CodeSniffer\Standards\PEAR\Sniffs\Classes\ClassDeclarationSniff - */ -final class ClassDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Get a list of CLI values to set before the file is tested. - * - * @param string $testFile The name of the file being tested. - * @param \PHP_CodeSniffer\Config $config The config data for the test run. - * - * @return void - */ - public function setCliValues($testFile, $config) - { - if ($testFile === 'ClassDeclarationUnitTest.1.inc') { - return; - } - - $config->tabWidth = 4; - - }//end setCliValues() - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'ClassDeclarationUnitTest.1.inc': - return [ - 21 => 1, - 22 => 1, - 23 => 1, - 27 => 1, - 33 => 1, - 38 => 1, - 49 => 1, - 84 => 1, - 94 => 1, - 99 => 1, - 104 => 1, - 110 => 1, - 114 => 1, - ]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getWarningList($testFile='') - { - if ($testFile === 'ClassDeclarationUnitTest.2.inc') { - return [11 => 1]; - } - - return[]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/ClassCommentUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/ClassCommentUnitTest.inc deleted file mode 100644 index bd7d061..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/ClassCommentUnitTest.inc +++ /dev/null @@ -1,163 +0,0 @@ - - * @copyright 2006-2014 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - * @version Release: 1.0 - * @link http://pear.php.net/package/PHP_CodeSniffer - */ -class Extra_Description_Newlines -{ - -}//end class - - -/** - * Sample class comment - * @category PHP - * @package PHP_CodeSniffer - * @author Greg Sherwood - * @copyright 2006-2014 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - * @version - * @link http://pear.php.net/package/PHP_CodeSniffer - */ -class Missing_Newlines_Before_Tags -{ - -}//end class - - -/** - * Simple class comment - * - * @category _wrong_category - * @package PHP_CodeSniffer - * @package ADDITIONAL PACKAGE TAG - * @subpackage SUBPACKAGE TAG - * @author Original Author - * @author Greg Sherwood gsherwood@squiz.net - * @author Mr T - * @author - * @copyright 1997~1994 The PHP Group - * @license http://www.php.net/license/3_0.txt - * @version INVALID VERSION CONTENT - * @see - * @see - * @link sdfsdf - * @see Net_Sample::Net_Sample() - * @see Net_Other - * @deprecated asd - * @unknown Unknown tag - * @since Class available since Release 1.2.0 - */ -class Checking_Tags -{ - class Sub_Class { - - }//end class - - -}//end class - - -/** - * - * - */ -class Empty_Class_Doc -{ - -}//end class - - -/** - * - * - */ -interface Empty_Interface_Doc -{ - -}//end interface - - -/** - * - * - */ -trait Empty_Trait_Doc -{ - -}//end trait - - -/** - * - * - */ -enum Empty_Enum_Doc -{ - -}//end enum - - -/** - * Sample class comment - * - * @category PHP - * @package PHP_CodeSniffer - * @author Greg Sherwood - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - * @link http://pear.php.net/package/PHP_CodeSniffer - */ -#[Authenticate('admin_logged_in')] -class TodoController extends AbstractController implements MustBeLoggedInInterface -{ -} - -/** - * Docblock - * - * @category PHP - * @package PHP_CodeSniffer - * @author Greg Sherwood - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - * @link http://pear.php.net/package/PHP_CodeSniffer - */ -abstract readonly class AbstractReadonlyWithDocblock {} - -/* - * Docblock - */ -readonly class ReadonlyWrongStyle {} - -readonly final class ReadonlyFinalWithoutDocblock {} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/ClassCommentUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/ClassCommentUnitTest.php deleted file mode 100644 index 4113309..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/ClassCommentUnitTest.php +++ /dev/null @@ -1,78 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Tests\Commenting; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ClassComment sniff. - * - * @covers \PHP_CodeSniffer\Standards\PEAR\Sniffs\Commenting\ClassCommentSniff - */ -final class ClassCommentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 4 => 1, - 15 => 1, - 51 => 1, - 63 => 1, - 65 => 2, - 66 => 1, - 68 => 1, - 70 => 1, - 71 => 1, - 72 => 1, - 74 => 2, - 75 => 1, - 76 => 1, - 77 => 1, - 85 => 1, - 96 => 5, - 106 => 5, - 116 => 5, - 126 => 5, - 161 => 1, - 163 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [ - 71 => 1, - 73 => 1, - ]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FileCommentUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FileCommentUnitTest.1.inc deleted file mode 100644 index 0b18fa3..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FileCommentUnitTest.1.inc +++ /dev/null @@ -1,53 +0,0 @@ - -* @author Greg Sherwood gsherwood@squiz.net -* @author Mr T -* @author -* @copyright 1997~1994 The PHP Group -* @copyright 1997~1994 The PHP Group -* @license http://www.php.net/license/3_0.txt -* @see -* @see -* @version INVALID VERSION CONTENT -* @see Net_Sample::Net_Sample() -* @see Net_Other -* @deprecated asd -* @since Class available since Release 1.2.0 -* @summary An unknown summary tag -* @package '' -* @subpackage !! -* @author Code AUthor -*/ -require_once '/some/path.php'; -?> - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FileCommentUnitTest.2.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FileCommentUnitTest.2.inc deleted file mode 100644 index 8845eb1..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FileCommentUnitTest.2.inc +++ /dev/null @@ -1,9 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Tests\Commenting; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the FileComment sniff. - * - * @covers \PHP_CodeSniffer\Standards\PEAR\Sniffs\Commenting\FileCommentSniff - */ -final class FileCommentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'FileCommentUnitTest.1.inc': - return [ - 21 => 1, - 23 => 2, - 24 => 1, - 26 => 1, - 28 => 1, - 29 => 1, - 30 => 1, - 31 => 1, - 32 => 2, - 33 => 1, - 34 => 1, - 35 => 1, - 40 => 2, - 41 => 2, - 43 => 1, - ]; - - case 'FileCommentUnitTest.2.inc': - case 'FileCommentUnitTest.3.inc': - case 'FileCommentUnitTest.4.inc': - return [1 => 1]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getWarningList($testFile='') - { - switch ($testFile) { - case 'FileCommentUnitTest.1.inc': - return [ - 29 => 1, - 30 => 1, - 34 => 1, - 43 => 1, - ]; - - default: - return []; - }//end switch - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FunctionCommentUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FunctionCommentUnitTest.inc deleted file mode 100644 index 9c1fc01..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FunctionCommentUnitTest.inc +++ /dev/null @@ -1,550 +0,0 @@ - line numbers for each token. - * - * @param array $tokens The array of tokens to process. - * @param object $tokenizer The tokenizer being used to process this file. - * @param string $eolChar The EOL character to use for splitting strings. - * - * @return void - */ -function foo(&$tokens, $tokenizer, $eolChar) -{ - -}//end foo() - -/** - * Gettext. - * - */ -function _() { - return $foo; -} - -class Baz { - /** - * The PHP5 constructor - * - * No return tag - */ - public function __construct() { - - } -} - -/** - * Complete a step. - * - * @param string $status Status of step to complete. - * @param array $array Array. - * @param string $note Optional note. - * - * @return void - */ -function completeStep($status, array $array = [Class1::class, 'test'], $note = '') { - echo 'foo'; -} - -/** - * Variadic function. - * - * @param string $name1 Comment. - * @param string ...$name2 Comment. - * - * @return void - */ -function myFunction(string $name1, string ...$name2) { -} - - -/** - * Variadic function. - * - * @param string $name1 Comment. - * @param string $name2 Comment. - * - * @return void - */ -function myFunction(string $name1, string ...$name2) { -} - -/** - * Completely invalid format, but should not cause PHP notices. - * - * @param $bar - * Comment here. - * @param ... - * Additional arguments here. - * - * @return - * Return value - * - */ -function foo($bar) { -} - -/** - * Processes the test. - * - * @param PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where the - * token occurred. - * @param int $stackPtr The position in the tokens stack - * where the listening token type - * was found. - * - * @return void - * @see register() - */ -function process(File $phpcsFile, $stackPtr) -{ - -}//end process() - -/** - * Processes the test. - * - * @param int $phpcsFile The PHP_CodeSniffer - * file where the - * token occurred. - * @param int $stackPtr The position in the tokens stack - * where the listening token type - * was found. - * - * @return void - * @see register() - */ -function process(File $phpcsFile, $stackPtr) -{ - -}//end process() - -/** - * @param (Foo&Bar)|null $a Comment. - * @param string $b Comment. - * - * @return void - */ -public function setTranslator($a, &$b): void -{ - $this->translator = $translator; -} - -// phpcs:set PEAR.Commenting.FunctionComment minimumVisibility protected -private function setTranslator2($a, &$b): void -{ - $this->translator = $translator; -} - -// phpcs:set PEAR.Commenting.FunctionComment minimumVisibility public -protected function setTranslator3($a, &$b): void -{ - $this->translator = $translator; -} - -private function setTranslator4($a, &$b): void -{ - $this->translator = $translator; -} - -class Bar { - /** - * The PHP5 constructor - * - * @return - */ - public function __construct() { - - } -} - -// phpcs:set PEAR.Commenting.FunctionComment specialMethods[] -class Bar { - /** - * The PHP5 constructor - */ - public function __construct() { - - } -} - -// phpcs:set PEAR.Commenting.FunctionComment specialMethods[] ignored -/** - * Should be ok - */ -public function ignored() { - -} - -// phpcs:set PEAR.Commenting.FunctionComment specialMethods[] __construct,__destruct - -class Something implements JsonSerializable { - /** - * Single attribute. - * - * @return mixed - */ - #[ReturnTypeWillChange] - public function jsonSerialize() {} - - /** - * Multiple attributes. - * - * @return Something - */ - #[AttributeA] - #[AttributeB] - public function methodName() {} - - /** - * Blank line between docblock and attribute. - * - * @return mixed - */ - - #[ReturnTypeWillChange] - public function blankLineDetectionA() {} - - /** - * Blank line between attribute and function declaration. - * - * @return mixed - */ - #[ReturnTypeWillChange] - - public function blankLineDetectionB() {} - - /** - * Blank line between both docblock and attribute and attribute and function declaration. - * - * @return mixed - */ - - #[ReturnTypeWillChange] - - public function blankLineDetectionC() {} -} - -class SpacingAfter { - /** - * There are multiple blank lines between this comment and the next function. - * - * @return void - */ - - - - - - - - - public function multipleBlankLines() {} - - /** - * There are multiple blank lines, and some "empty" lines with only - * spaces/tabs between this comment and the next function. - * - * @return void - */ - - - - - - - - - - public function multipleLinesSomeEmpty() {} -} - -class HandleBlankLinesBetweenDocblockAndDeclarationWithAttributes -{ - /** - * Blank line between docblock and attribute. - * - * @return mixed - */ - - #[ReturnTypeWillChange] - - - - - - #[ - - AnotherAttribute - - ]#[AndAThirdAsWell] - - public function blankLineDetectionA() - { - - }//end blankLineDetectionA() - - /** - * Blank line between attribute and function declaration. - * - * @return mixed - */ - #[ReturnTypeWillChange] - - public function blankLineDetectionB() - { - - }//end blankLineDetectionB() -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FunctionCommentUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FunctionCommentUnitTest.inc.fixed deleted file mode 100644 index f273634..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FunctionCommentUnitTest.inc.fixed +++ /dev/null @@ -1,521 +0,0 @@ - line numbers for each token. - * - * @param array $tokens The array of tokens to process. - * @param object $tokenizer The tokenizer being used to process this file. - * @param string $eolChar The EOL character to use for splitting strings. - * - * @return void - */ -function foo(&$tokens, $tokenizer, $eolChar) -{ - -}//end foo() - -/** - * Gettext. - * - */ -function _() { - return $foo; -} - -class Baz { - /** - * The PHP5 constructor - * - * No return tag - */ - public function __construct() { - - } -} - -/** - * Complete a step. - * - * @param string $status Status of step to complete. - * @param array $array Array. - * @param string $note Optional note. - * - * @return void - */ -function completeStep($status, array $array = [Class1::class, 'test'], $note = '') { - echo 'foo'; -} - -/** - * Variadic function. - * - * @param string $name1 Comment. - * @param string ...$name2 Comment. - * - * @return void - */ -function myFunction(string $name1, string ...$name2) { -} - - -/** - * Variadic function. - * - * @param string $name1 Comment. - * @param string $name2 Comment. - * - * @return void - */ -function myFunction(string $name1, string ...$name2) { -} - -/** - * Completely invalid format, but should not cause PHP notices. - * - * @param $bar - * Comment here. - * @param ... - * Additional arguments here. - * - * @return - * Return value - * - */ -function foo($bar) { -} - -/** - * Processes the test. - * - * @param PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where the - * token occurred. - * @param int $stackPtr The position in the tokens stack - * where the listening token type - * was found. - * - * @return void - * @see register() - */ -function process(File $phpcsFile, $stackPtr) -{ - -}//end process() - -/** - * Processes the test. - * - * @param int $phpcsFile The PHP_CodeSniffer - * file where the - * token occurred. - * @param int $stackPtr The position in the tokens stack - * where the listening token type - * was found. - * - * @return void - * @see register() - */ -function process(File $phpcsFile, $stackPtr) -{ - -}//end process() - -/** - * @param (Foo&Bar)|null $a Comment. - * @param string $b Comment. - * - * @return void - */ -public function setTranslator($a, &$b): void -{ - $this->translator = $translator; -} - -// phpcs:set PEAR.Commenting.FunctionComment minimumVisibility protected -private function setTranslator2($a, &$b): void -{ - $this->translator = $translator; -} - -// phpcs:set PEAR.Commenting.FunctionComment minimumVisibility public -protected function setTranslator3($a, &$b): void -{ - $this->translator = $translator; -} - -private function setTranslator4($a, &$b): void -{ - $this->translator = $translator; -} - -class Bar { - /** - * The PHP5 constructor - * - * @return - */ - public function __construct() { - - } -} - -// phpcs:set PEAR.Commenting.FunctionComment specialMethods[] -class Bar { - /** - * The PHP5 constructor - */ - public function __construct() { - - } -} - -// phpcs:set PEAR.Commenting.FunctionComment specialMethods[] ignored -/** - * Should be ok - */ -public function ignored() { - -} - -// phpcs:set PEAR.Commenting.FunctionComment specialMethods[] __construct,__destruct - -class Something implements JsonSerializable { - /** - * Single attribute. - * - * @return mixed - */ - #[ReturnTypeWillChange] - public function jsonSerialize() {} - - /** - * Multiple attributes. - * - * @return Something - */ - #[AttributeA] - #[AttributeB] - public function methodName() {} - - /** - * Blank line between docblock and attribute. - * - * @return mixed - */ - #[ReturnTypeWillChange] - public function blankLineDetectionA() {} - - /** - * Blank line between attribute and function declaration. - * - * @return mixed - */ - #[ReturnTypeWillChange] - public function blankLineDetectionB() {} - - /** - * Blank line between both docblock and attribute and attribute and function declaration. - * - * @return mixed - */ - #[ReturnTypeWillChange] - public function blankLineDetectionC() {} -} - -class SpacingAfter { - /** - * There are multiple blank lines between this comment and the next function. - * - * @return void - */ - public function multipleBlankLines() {} - - /** - * There are multiple blank lines, and some "empty" lines with only - * spaces/tabs between this comment and the next function. - * - * @return void - */ - public function multipleLinesSomeEmpty() {} -} - -class HandleBlankLinesBetweenDocblockAndDeclarationWithAttributes -{ - /** - * Blank line between docblock and attribute. - * - * @return mixed - */ - #[ReturnTypeWillChange] - #[ - - AnotherAttribute - - ]#[AndAThirdAsWell] - public function blankLineDetectionA() - { - - }//end blankLineDetectionA() - - /** - * Blank line between attribute and function declaration. - * - * @return mixed - */ - #[ReturnTypeWillChange] - public function blankLineDetectionB() - { - - }//end blankLineDetectionB() -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FunctionCommentUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FunctionCommentUnitTest.php deleted file mode 100644 index 3b47684..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/FunctionCommentUnitTest.php +++ /dev/null @@ -1,108 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Tests\Commenting; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the FunctionComment sniff. - * - * @covers \PHP_CodeSniffer\Standards\PEAR\Sniffs\Commenting\FunctionCommentSniff - */ -final class FunctionCommentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 5 => 1, - 10 => 1, - 12 => 1, - 13 => 1, - 14 => 1, - 15 => 1, - 28 => 1, - 76 => 1, - 87 => 1, - 103 => 1, - 109 => 1, - 112 => 1, - 122 => 1, - 123 => 2, - 124 => 2, - 125 => 1, - 126 => 1, - 137 => 1, - 138 => 1, - 139 => 1, - 152 => 1, - 155 => 1, - 165 => 1, - 172 => 1, - 183 => 1, - 190 => 2, - 206 => 1, - 234 => 1, - 272 => 1, - 313 => 1, - 317 => 1, - 327 => 1, - 329 => 1, - 332 => 1, - 344 => 1, - 343 => 1, - 345 => 1, - 346 => 1, - 360 => 1, - 361 => 1, - 363 => 1, - 364 => 1, - 406 => 1, - 417 => 1, - 456 => 1, - 466 => 1, - 474 => 1, - 476 => 1, - 486 => 1, - 502 => 1, - 521 => 1, - 523 => 1, - 533 => 1, - 545 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/InlineCommentUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/InlineCommentUnitTest.inc deleted file mode 100644 index 092fbfd..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Commenting/InlineCommentUnitTest.inc +++ /dev/null @@ -1,31 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Tests\Commenting; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the InlineComment sniff. - * - * @covers \PHP_CodeSniffer\Standards\PEAR\Sniffs\Commenting\InlineCommentSniff - */ -final class InlineCommentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 15 => 1, - 24 => 1, - 25 => 1, - 27 => 1, - 28 => 1, - 29 => 1, - 31 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/ControlSignatureUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/ControlSignatureUnitTest.inc deleted file mode 100644 index cc9903a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/ControlSignatureUnitTest.inc +++ /dev/null @@ -1,165 +0,0 @@ - 0); - -do -{ - echo $i; -} while ($i > 0); - -do -{ - echo $i; -} -while ($i > 0); - -do { echo $i; } while ($i > 0); - -do{ - echo $i; -}while($i > 0); - - -// while -while ($i < 1) { - echo $i; -} - -while($i < 1){ - echo $i; -} - -while ($i < 1) { echo $i; } - - -// for -for ($i = 1; $i < 1; $i++) { - echo $i; -} - -for($i = 1; $i < 1; $i++){ - echo $i; -} - -for ($i = 1; $i < 1; $i++) { echo $i; } - - -// foreach -foreach ($items as $item) { - echo $item; -} - -foreach($items as $item){ - echo $item; -} - -foreach ($items as $item) { echo $item; } - - -// if -if ($i == 0) { - $i = 1; -} - -if($i == 0){ - $i = 1; -} - -if ($i == 0) { $i = 1; } - - -// else -if ($i == 0) { - $i = 1; -} else { - $i = 0; -} - -if ($i == 0) { - $i = 1; -}else{ - $i = 0; -} - -if ($i == 0) { $i = 1; } else { $i = 0; } - - -// else -if ($i == 0) { - $i = 1; -} else { - $i = 0; -} - -if ($i == 0) { - $i = 1; -}else{ - $i = 0; -} - -if ($i == 0) { $i = 1; } else { $i = 0; } - - -// else if -if ($i == 0) { - $i = 1; -} else if ($i == 2) { - $i = 0; -} - -if ($i == 0) { - $i = 1; -} elseif ($i == 2) { - $i = 0; -} - -if ($i == 0) { - $i = 1; -}else if($i == 2){ - $i = 0; -} - -if ($i == 0) { - $i = 1; -}elseif($i == 2){ - $i = 0; -} - -if ($i == 0) { $i = 1; } else if ($i == 2) { $i = 0; } -if ($i == 0) { $i = 1; } elseif ($i == 2) { $i = 0; } - -if ($i == 0) { // this is ok because comments are allowed - $i = 1; -} - -if ($i == 0) {// this is ok because comments are allowed - $i = 1; -} - -if ($i == 0) { /* this is ok because comments are allowed*/ - $i = 1; -} - -if ($i == 0) -{ // this is not ok - $i = 1; -} - -if ($i == 0) /* this is ok */ { -} - -if ($i == 0) { -} -else { -} - -// match -$r = match ($x) { - 1 => 1, -}; - -$r = match( $x ){ 1 => 1 }; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/ControlSignatureUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/ControlSignatureUnitTest.php deleted file mode 100644 index a889628..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/ControlSignatureUnitTest.php +++ /dev/null @@ -1,77 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Tests\ControlStructures; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ControlSignature sniff. - * - * @covers \PHP_CodeSniffer\Standards\PEAR\Sniffs\ControlStructures\ControlSignatureSniff - */ -final class ControlSignatureUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 9 => 1, - 14 => 1, - 20 => 1, - 22 => 1, - 32 => 1, - 36 => 1, - 44 => 1, - 48 => 1, - 56 => 1, - 60 => 1, - 68 => 1, - 72 => 1, - 84 => 1, - 88 => 2, - 100 => 1, - 104 => 2, - 122 => 2, - 128 => 1, - 132 => 3, - 133 => 2, - 147 => 1, - 157 => 1, - 165 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.inc deleted file mode 100644 index a7a3c69..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.inc +++ /dev/null @@ -1,251 +0,0 @@ - -

    some text

    -errorCode() == 401 || // comment - $IPP->errorCode() == 3200) /* long comment - here - */ -{ - return false; -} - -if ($IPP->errorCode() == 401 || // comment - $IPP->errorCode() == 3200) // long comment here -{ - return false; -} - -if ($IPP->errorCode() == 401 - // Comment explaining the next condition here. - || $IPP->errorCode() == 3200 -) { - return false; -} - -function bar() { - if ($a - && $b -) { - return false; - } -} - -if ($a - && foo( - 'a', - 'b' - )) { - return false; -} - -?> - - - - - -errorCode() == 401 || // phpcs:ignore Standard.Category.Sniff -- for reasons. - $IPP->errorCode() == 3200) /* - phpcs:ignore Standard.Category.Sniff -- for reasons. - */ -{ - return false; -} - -if ($IPP->errorCode() == 401 || // phpcs:disable Standard.Category.Sniff -- for reasons. - $IPP->errorCode() == 3200) // phpcs:enable -{ - return false; -} - -if ($IPP->errorCode() == 401 - // phpcs:ignore Standard.Category.Sniff -- for reasons. - || $IPP->errorCode() == 3200 -) { - return false; -} - - if ($IPP->errorCode() == 401 || - /* - * phpcs:disable Standard.Category.Sniff -- for reasons. - */ - $IPP->errorCode() == 3200 - ) { - return false; - } - -if ($IPP->errorCode() == 401 - || $IPP->errorCode() == 3200 - // phpcs:ignore Standard.Category.Sniff -- for reasons. -) { - return false; -} - -if ($IPP->errorCode() == 401 - || $IPP->errorCode() - === 'someverylongexpectedoutput' -) { - return false; -} - -if ($IPP->errorCode() == 401 - || $IPP->errorCode() - // A comment. - === 'someverylongexpectedoutput' -) { - return false; -} - -if ($IPP->errorCode() == 401 - || $IPP->errorCode() - // phpcs:ignore Standard.Category.Sniff -- for reasons. - === 'someverylongexpectedoutput' -) { - return false; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.inc.fixed deleted file mode 100644 index 7d56c46..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.inc.fixed +++ /dev/null @@ -1,247 +0,0 @@ - -

    some text

    -errorCode() == 401 // comment - || $IPP->errorCode() == 3200 /* long comment - here - */ -) { - return false; -} - -if ($IPP->errorCode() == 401 // comment - || $IPP->errorCode() == 3200 // long comment here -) { - return false; -} - -if ($IPP->errorCode() == 401 - // Comment explaining the next condition here. - || $IPP->errorCode() == 3200 -) { - return false; -} - -function bar() { - if ($a - && $b - ) { - return false; - } -} - -if ($a - && foo( - 'a', - 'b' - ) -) { - return false; -} - -?> - - - - - -errorCode() == 401 // phpcs:ignore Standard.Category.Sniff -- for reasons. - || $IPP->errorCode() == 3200 /* - phpcs:ignore Standard.Category.Sniff -- for reasons. - */ -) { - return false; -} - -if ($IPP->errorCode() == 401 // phpcs:disable Standard.Category.Sniff -- for reasons. - || $IPP->errorCode() == 3200 // phpcs:enable -) { - return false; -} - -if ($IPP->errorCode() == 401 - // phpcs:ignore Standard.Category.Sniff -- for reasons. - || $IPP->errorCode() == 3200 -) { - return false; -} - - if ($IPP->errorCode() == 401 - /* - * phpcs:disable Standard.Category.Sniff -- for reasons. - */ - || $IPP->errorCode() == 3200 - ) { - return false; - } - -if ($IPP->errorCode() == 401 - || $IPP->errorCode() == 3200 - // phpcs:ignore Standard.Category.Sniff -- for reasons. -) { - return false; -} - -if ($IPP->errorCode() == 401 - || $IPP->errorCode() === 'someverylongexpectedoutput' -) { - return false; -} - -if ($IPP->errorCode() == 401 - || $IPP->errorCode() - // A comment. - === 'someverylongexpectedoutput' -) { - return false; -} - -if ($IPP->errorCode() == 401 - || $IPP->errorCode() - // phpcs:ignore Standard.Category.Sniff -- for reasons. - === 'someverylongexpectedoutput' -) { - return false; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.js deleted file mode 100644 index 064d7ff..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.js +++ /dev/null @@ -1,251 +0,0 @@ -if (blah(param)) { - -} - -if ((condition1 - || condition2) - && condition3 - && condition4 - && condition5 -) { -} - -if ((condition1 || condition2) && condition3 && condition4 && condition5) { -} - -if ((condition1 || condition2) - && condition3 -) { -} - -if ( - (condition1 || condition2) - && condition3 -) { -} - -if ((condition1 - || condition2) -) { -} - -if ((condition1 - || condition2) - && condition3 && - condition4 -) { -} - -if ((condition1 - || condition2) - && condition3 - && condition4 - && condition5 -) { -} - -if (($condition1 - || $condition2) -) { -} - -if ((condition1 - || condition2) - ) { -} - -if ( - ( - condition1 - || condition2 - ) - && condition3 -) { -} - - -if ( condition1 - || condition2 - || condition3 -) { -} - -if (condition1 - || condition2 - || condition3 -) { -} else if (condition1 - || condition2 - || condition3 -) { -} - -if (condition1 - || condition2 - || condition3 -) { -} else if ( - condition1 - || condition2 && - condition3 -) { -} - -if (condition1 - || condition2 -|| condition3) { -} - -if (condition1 - || condition2 || condition3 -){ -} - -if (condition1) - console.info('bar'); - -if (condition1 - || condition2 -|| condition3) - console.info('bar'); - - -if (condition1 - || condition2 || condition3 -) - console.info('bar'); - -if (!a(post) - && (!a(context.header) - ^ a(context.header, 'Content-Type')) -) { -// ... -} - -if (foo) -{ - console.info('bar'); -} - -// Should be no errors even though lines are -// not exactly aligned together. Multi-line function -// call takes precedence. -if (array_key_exists(key, value) - && foo.bar.baz( - key, value2 - ) -) { -} - -if (true) { - foo = true; -}; - -if (foo == 401 || // comment - bar == 3200) /* long comment - here - */ -{ - return false; -} - -if (foo == 401 || // comment - bar == 3200) // long comment here -{ - return false; -} - -if (IPP.errorCode() == 401 - // Comment explaining the next condition here. - || IPP.errorCode() == 3200 -) { - return false; -} - -function bar() { - if (a - && b -) { - return false; - } -} - -if (a - && foo( - 'a', - 'b' - )) { - return false; -} - - - - - - - - - - - - - -if (foo == 401 || // phpcs:ignore Standard.Category.Sniff -- for reasons. - bar == 3200) /* - phpcs:ignore Standard.Category.Sniff -- for reasons. - */ -{ - return false; -} - -if (foo == 401 || // phpcs:disable Standard.Category.Sniff -- for reasons. - bar == 3200) // phpcs:enable -{ - return false; -} - -if (IPP.errorCode() == 401 - // phpcs:ignore Standard.Category.Sniff -- for reasons. - || IPP.errorCode() == 3200 -) { - return false; -} - - if (foo == 401 || - /* - * phpcs:disable Standard.Category.Sniff -- for reasons. - */ - bar == 3200 - ) { - return false; - } - -if (IPP.errorCode() == 401 - || IPP.errorCode() == 3200 - // phpcs:ignore Standard.Category.Sniff -- for reasons. -) { - return false; -} - -if (foo == 401 - || bar - == 'someverylongexpectedoutput' -) { - return false; -} - -if (IPP.errorCode() == 401 - || bar - // A comment. - == 'someverylongexpectedoutput' -) { - return false; -} - -if (foo == 401 - || IPP.errorCode() - // phpcs:ignore Standard.Category.Sniff -- for reasons. - == 'someverylongexpectedoutput' -) { - return false; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.js.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.js.fixed deleted file mode 100644 index cfde75d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.js.fixed +++ /dev/null @@ -1,247 +0,0 @@ -if (blah(param)) { - -} - -if ((condition1 - || condition2) - && condition3 - && condition4 - && condition5 -) { -} - -if ((condition1 || condition2) && condition3 && condition4 && condition5) { -} - -if ((condition1 || condition2) - && condition3 -) { -} - -if ((condition1 || condition2) - && condition3 -) { -} - -if ((condition1 - || condition2) -) { -} - -if ((condition1 - || condition2) - && condition3 - && condition4 -) { -} - -if ((condition1 - || condition2) - && condition3 - && condition4 - && condition5 -) { -} - -if (($condition1 - || $condition2) -) { -} - -if ((condition1 - || condition2) -) { -} - -if ((condition1 - || condition2) - && condition3 -) { -} - - -if (condition1 - || condition2 - || condition3 -) { -} - -if (condition1 - || condition2 - || condition3 -) { -} else if (condition1 - || condition2 - || condition3 -) { -} - -if (condition1 - || condition2 - || condition3 -) { -} else if (condition1 - || condition2 - && condition3 -) { -} - -if (condition1 - || condition2 - || condition3 -) { -} - -if (condition1 - || condition2 || condition3 -) { -} - -if (condition1) - console.info('bar'); - -if (condition1 - || condition2 - || condition3 -) - console.info('bar'); - - -if (condition1 - || condition2 || condition3 -) - console.info('bar'); - -if (!a(post) - && (!a(context.header) - ^ a(context.header, 'Content-Type')) -) { -// ... -} - -if (foo) { - console.info('bar'); -} - -// Should be no errors even though lines are -// not exactly aligned together. Multi-line function -// call takes precedence. -if (array_key_exists(key, value) - && foo.bar.baz( - key, value2 - ) -) { -} - -if (true) { - foo = true; -}; - -if (foo == 401 // comment - || bar == 3200 /* long comment - here - */ -) { - return false; -} - -if (foo == 401 // comment - || bar == 3200 // long comment here -) { - return false; -} - -if (IPP.errorCode() == 401 - // Comment explaining the next condition here. - || IPP.errorCode() == 3200 -) { - return false; -} - -function bar() { - if (a - && b - ) { - return false; - } -} - -if (a - && foo( - 'a', - 'b' - ) -) { - return false; -} - - - - - - - - - - - - - -if (foo == 401 // phpcs:ignore Standard.Category.Sniff -- for reasons. - || bar == 3200 /* - phpcs:ignore Standard.Category.Sniff -- for reasons. - */ -) { - return false; -} - -if (foo == 401 // phpcs:disable Standard.Category.Sniff -- for reasons. - || bar == 3200 // phpcs:enable -) { - return false; -} - -if (IPP.errorCode() == 401 - // phpcs:ignore Standard.Category.Sniff -- for reasons. - || IPP.errorCode() == 3200 -) { - return false; -} - - if (foo == 401 - /* - * phpcs:disable Standard.Category.Sniff -- for reasons. - */ - || bar == 3200 - ) { - return false; - } - -if (IPP.errorCode() == 401 - || IPP.errorCode() == 3200 - // phpcs:ignore Standard.Category.Sniff -- for reasons. -) { - return false; -} - -if (foo == 401 - || bar == 'someverylongexpectedoutput' -) { - return false; -} - -if (IPP.errorCode() == 401 - || bar - // A comment. - == 'someverylongexpectedoutput' -) { - return false; -} - -if (foo == 401 - || IPP.errorCode() - // phpcs:ignore Standard.Category.Sniff -- for reasons. - == 'someverylongexpectedoutput' -) { - return false; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.php deleted file mode 100644 index 539b879..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/ControlStructures/MultiLineConditionUnitTest.php +++ /dev/null @@ -1,96 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Tests\ControlStructures; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the MultiLineCondition sniff. - * - * @covers \PHP_CodeSniffer\Standards\PEAR\Sniffs\ControlStructures\MultiLineConditionSniff - */ -final class MultiLineConditionUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - $errors = [ - 21 => 1, - 22 => 1, - 35 => 1, - 40 => 1, - 41 => 1, - 42 => 1, - 43 => 1, - 49 => 1, - 54 => 1, - 57 => 1, - 58 => 1, - 59 => 1, - 61 => 1, - 67 => 1, - 87 => 1, - 88 => 1, - 89 => 1, - 90 => 1, - 96 => 2, - 101 => 1, - 109 => 2, - 125 => 1, - 145 => 2, - 153 => 2, - 168 => 1, - 177 => 1, - 194 => 2, - 202 => 2, - 215 => 1, - 218 => 2, - 232 => 2, - 239 => 1, - 240 => 2, - 248 => 2, - ]; - - if ($testFile === 'MultiLineConditionUnitTest.inc') { - $errors[183] = 1; - } - - return $errors; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Files/IncludingFileUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Files/IncludingFileUnitTest.inc deleted file mode 100644 index dadfe92..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Files/IncludingFileUnitTest.inc +++ /dev/null @@ -1,99 +0,0 @@ - -
    -Some content goes here.
    -
    -
    - -
    -    Some content goes here.
    -    
    -    
    - -
    -Some content goes here.
    -
    -
    - -
    -    Some content goes here.
    -    
    -    
    - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Tests\Files; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the IncludingFile sniff. - * - * @covers \PHP_CodeSniffer\Standards\PEAR\Sniffs\Files\IncludingFileSniff - */ -final class IncludingFileUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 4 => 1, - 5 => 1, - 11 => 1, - 12 => 1, - 16 => 1, - 17 => 1, - 33 => 1, - 34 => 1, - 47 => 1, - 48 => 1, - 64 => 1, - 65 => 1, - 73 => 1, - 74 => 1, - 85 => 1, - 86 => 1, - 98 => 1, - 99 => 2, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Formatting/MultiLineAssignmentUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Formatting/MultiLineAssignmentUnitTest.inc deleted file mode 100644 index fc6aea0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Formatting/MultiLineAssignmentUnitTest.inc +++ /dev/null @@ -1,22 +0,0 @@ -additionalHeaderData[$this->strApplicationName] - = $this->xajax->getJavascript(t3lib_extMgm::siteRelPath('nr_xajax')); - -$GLOBALS['TSFE']->additionalHeaderData[$this->strApplicationName] - = $this->xajax->getJavascript(t3lib_extMgm::siteRelPath('nr_xajax')); - -$GLOBALS['TSFE']->additionalHeaderData[$this->strApplicationName] = - $this->xajax->getJavascript(t3lib_extMgm::siteRelPath('nr_xajax')); - -$GLOBALS['TSFE']->additionalHeaderData[$this->strApplicationName] - = $this->xajax->getJavascript(t3lib_extMgm::siteRelPath('nr_xajax')); -$GLOBALS['TSFE']->additionalHeaderData[$this->strApplicationName] = 'boo'; - -$var='string'; - -function getInstalledStandards( - $includeGeneric=false, - $standardsDir='' -) { -} -?> diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Formatting/MultiLineAssignmentUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Formatting/MultiLineAssignmentUnitTest.php deleted file mode 100644 index 67b8a62..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Formatting/MultiLineAssignmentUnitTest.php +++ /dev/null @@ -1,57 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Tests\Formatting; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the MultiLineAssignment sniff. - * - * @covers \PHP_CodeSniffer\Standards\PEAR\Sniffs\Formatting\MultiLineAssignmentSniff - */ -final class MultiLineAssignmentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 3 => 1, - 6 => 1, - 8 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.inc deleted file mode 100644 index fddd3cb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.inc +++ /dev/null @@ -1,576 +0,0 @@ -getFoo() - ->doBar( - $this->getX() // no comma here - ->doY() // this is still the first method argument - ->doZ() // this is still the first method argument - ); -} - -$var = myFunction( -$foo, -$bar -); - -// phpcs:set PEAR.Functions.FunctionCallSignature allowMultipleArguments false - -fputs( - STDOUT, - "Examples: - $ {$app} , --all - $ {$app} --all", $something -); - -$array = array(); -array_map( - function($x) - { - return trim($x, $y); - }, $foo, - $array -); - -$bar = new stdClass( - 4, /* thanks */ 5, /* PSR-2 */ 6 -); - -function doSomething() -{ - return $this->getFoo() - ->doBar( - $this->getX() // no comma here - ->doY() // this is still the first method argument - ->doZ() // this is still the first method argument - ); -} - -doError( - 404, // status code - 'Not Found', // error name - 'Check your id' // fix -); - -// phpcs:set PEAR.Functions.FunctionCallSignature allowMultipleArguments true - -// Don't report errors for closing braces. Leave that to other sniffs. -foo( - [ - 'this', - 'is', - 'an', - 'array' - ], -[ - 'this', - 'is', - 'an', - 'array' - ], - array( - 'this', - 'is', -'an', -'array' - ), - array( - 'this', - 'is', - 'an', - 'array' - ), - function($x) - { - echo 'wee'; - - return trim($x); - } -); - -function foo() -{ - myFunction( - 'string'. - // comment - // comment - 'string'. - /* comment - * comment - */ - 'string' - ); -} - -// phpcs:set PEAR.Functions.FunctionCallSignature requiredSpacesAfterOpen 1 -// phpcs:set PEAR.Functions.FunctionCallSignature requiredSpacesBeforeClose 1 -test($arg, $arg2); -test( $arg, $arg2 ); -test( $arg, $arg2 ); -test(); -test( ); -test( ); -// phpcs:set PEAR.Functions.FunctionCallSignature requiredSpacesAfterOpen 0 -// phpcs:set PEAR.Functions.FunctionCallSignature requiredSpacesBeforeClose 0 - -?> - - - -
  • - log(// ... - 'error', - sprintf( - 'Message: %s', - isset($e->getData()['object']['evidence_details']) - ? $e->getData()['object']['evidence_details']['due_by'] - : '' - ), - array($e->getData()['object']) -); - -?> -
    - $class - ] - ); ?> -
    - - function ($x) { - return true; - }, - 'baz' => false - ) -); -$qux = array_filter( - $quux, function ($x) { - return $x; - } -); - -array_filter( - [1, 2], - function ($i) : bool { - return $i === 0; - } -); - -foo(array( - 'callback' => function () { - $foo = 'foo'; - return; - }, -)); - -foo( - $a, - /* - $c, - - $d, - */ - $e -); - -test( - 1,2,3,4 - ); - -class Test -{ - public function getInstance() - { - return new static( - 'arg', - 'foo' - ); - } - - public function getSelf() - { - return new self( - 'a','b', 'c' - ); - } -} - -$x = $var('y', -'x'); - -$obj->{$x}(1, - 2); - -return (function ($a, $b) { - return function ($c, $d) use ($a, $b) { - echo $a, $b, $c, $d; - }; -})( - 'a','b' -)('c', - 'd'); - -class Foo -{ - public function bar($a, $b) - { - if (!$a || !$b) { - return; - } - - (new stdClass())->a = $a; - } -} - -return (function ($a, $b) { - return function ($c, $d) use ($a, $b) { - echo $a, $b, $c, $d; - }; -})('a','b')('c','d'); - -function foo() -{ - Bar( - function () { - } - ); -} - -$deprecated_functions = [ - 'the_category_ID' - => function_call( // 7 spaces, not 8. This is the problem line. - $a, - $b - ), -]; - -$deprecated_functions = [ - 'the_category_ID' - => function_call( // 9 spaces, not 8. This is the problem line. - $a, - $b - ), -]; - -// phpcs:set PEAR.Functions.FunctionCallSignature allowMultipleArguments false - -printf( - '', - $obj->getName(), // Trailing comment. - $obj->getID(), // phpcs:ignore Standard.Category.SniffName -- for reasons. - $option -); - -// Handling of PHP 7.3 trailing comma's. -functionCall($args, $foo,); -functionCall( - $args, $foo, -); -functionCall( - $args, - $foo, -); - -// phpcs:set PEAR.Functions.FunctionCallSignature allowMultipleArguments true - -$this->foo( - - ['a','b'], - true - -); - -$this->foo( - - // Comment - ['a','b'], - true - -); - -function m() -{ - $t = ' - ' . (empty(true) ? ' - ' . f( - '1', - '2', - ) . ' - ' : ''); -} - -class C -{ - - public function m() - { - $a = []; - $t = - "SELECT * FROM t -WHERE f IN(" . implode( - ",", - $a - ) . ")"; - } -} - -$notices = array( - 'index' => sprintf( - translation_function('a text string with %s placeholder'), - 'replacement' - ), -); - -$componentType = $this->componentTypeRepository->findByType($this->identifier) ?: - $this->componentTypeFactory->createForType( - $this->identifier, - $this->className, - true, - $this->isPrototypal - ); - -return [ - 'export-path' => 'exports/database/' - . env( - 'APP_CUSTOMER', - 'not-configured' - ) - . '/' . env( - 'APP_IDENTIFIER', - 'not-configured' - ), -]; - -$methods .= - str_replace( - array_keys($replacements), - array_values($replacements), - $methodTemplate - ) - . PHP_EOL . PHP_EOL . str_repeat(' ', 4); - -$rangeValues['min'] = - $this->adjustLowerThreshold( - $this->normalizeRatingForFilter($rangeValues['min']) - ); - -$salesOrderThresholdTransfer->fromArray($salesOrderThresholdEntity->toArray(), true) - ->setSalesOrderThresholdValue( - $this->mapSalesOrderThresholdValueTransfer($salesOrderThresholdTransfer, $salesOrderThresholdEntity) - )->setCurrency( - (new CurrencyTransfer())->fromArray($salesOrderThresholdEntity->getCurrency()->toArray(), true) - )->setStore( - (new StoreTransfer())->fromArray($salesOrderThresholdEntity->getStore()->toArray(), true) - ); - -return trim(preg_replace_callback( - // sprintf replaces IGNORED_CHARS multiple times: for %s as well as %1$s (argument numbering) - // /[%s]*([^%1$s]+)/ results in /[IGNORED_CHARS]*([^IGNORED_CHARS]+)/ - sprintf('/[%s]*([^%1$s]+)/', self::IGNORED_CHARS), - function (array $term) use ($mode): string { - // query pieces have to bigger than one char, otherwise they are too expensive for the search - if (mb_strlen($term[1], 'UTF-8') > 1) { - // in boolean search mode '' (empty) means OR, '-' means NOT - return sprintf('%s%s ', $mode === 'AND' ? '+' : '', self::extractUmlauts($term[1])); - } - - return ''; - }, - $search - )); - -$a = ['a' => function ($b) { return $b; }]; -$a['a']( 1 ); - -// PHP 8.0 named parameters. -array_fill_keys( - keys: range( - 1, - 12, - ), - value: true, -); - -array_fill_keys( - keys: range( 1, - 12, - ), value: true, -); - -// phpcs:set PEAR.Functions.FunctionCallSignature allowMultipleArguments false -array_fill_keys( - keys: range( 1, - 12, - ), value: true, -); -// phpcs:set PEAR.Functions.FunctionCallSignature allowMultipleArguments true - -?> -
    -

    -
    -
    -

    -
    - -content -

    - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.inc.fixed deleted file mode 100644 index 1c52523..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.inc.fixed +++ /dev/null @@ -1,591 +0,0 @@ -getFoo() - ->doBar( - $this->getX() // no comma here - ->doY() // this is still the first method argument - ->doZ() // this is still the first method argument - ); -} - -$var = myFunction( - $foo, - $bar -); - -// phpcs:set PEAR.Functions.FunctionCallSignature allowMultipleArguments false - -fputs( - STDOUT, - "Examples: - $ {$app} , --all - $ {$app} --all", - $something -); - -$array = array(); -array_map( - function($x) - { - return trim($x, $y); - }, - $foo, - $array -); - -$bar = new stdClass( - 4, /* thanks */ - 5, /* PSR-2 */ - 6 -); - -function doSomething() -{ - return $this->getFoo() - ->doBar( - $this->getX() // no comma here - ->doY() // this is still the first method argument - ->doZ() // this is still the first method argument - ); -} - -doError( - 404, // status code - 'Not Found', // error name - 'Check your id' // fix -); - -// phpcs:set PEAR.Functions.FunctionCallSignature allowMultipleArguments true - -// Don't report errors for closing braces. Leave that to other sniffs. -foo( - [ - 'this', - 'is', - 'an', - 'array' - ], - [ - 'this', - 'is', - 'an', - 'array' - ], - array( - 'this', - 'is', - 'an', - 'array' - ), - array( - 'this', - 'is', - 'an', - 'array' - ), - function($x) - { - echo 'wee'; - - return trim($x); - } -); - -function foo() -{ - myFunction( - 'string'. - // comment - // comment - 'string'. - /* comment - * comment - */ - 'string' - ); -} - -// phpcs:set PEAR.Functions.FunctionCallSignature requiredSpacesAfterOpen 1 -// phpcs:set PEAR.Functions.FunctionCallSignature requiredSpacesBeforeClose 1 -test( $arg, $arg2 ); -test( $arg, $arg2 ); -test( $arg, $arg2 ); -test(); -test(); -test(); -// phpcs:set PEAR.Functions.FunctionCallSignature requiredSpacesAfterOpen 0 -// phpcs:set PEAR.Functions.FunctionCallSignature requiredSpacesBeforeClose 0 - -?> - - - -
  • - log(// ... - 'error', - sprintf( - 'Message: %s', - isset($e->getData()['object']['evidence_details']) - ? $e->getData()['object']['evidence_details']['due_by'] - : '' - ), - array($e->getData()['object']) -); - -?> -
    - $class - ] - ); ?> -
    - - function ($x) { - return true; - }, - 'baz' => false - ) -); -$qux = array_filter( - $quux, function ($x) { - return $x; - } -); - -array_filter( - [1, 2], - function ($i) : bool { - return $i === 0; - } -); - -foo( - array( - 'callback' => function () { - $foo = 'foo'; - return; - }, - ) -); - -foo( - $a, - /* - $c, - - $d, - */ - $e -); - -test( - 1,2,3,4 -); - -class Test -{ - public function getInstance() - { - return new static( - 'arg', - 'foo' - ); - } - - public function getSelf() - { - return new self( - 'a','b', 'c' - ); - } -} - -$x = $var( - 'y', - 'x' -); - -$obj->{$x}( - 1, - 2 -); - -return (function ($a, $b) { - return function ($c, $d) use ($a, $b) { - echo $a, $b, $c, $d; - }; -})( - 'a','b' -)( - 'c', - 'd' -); - -class Foo -{ - public function bar($a, $b) - { - if (!$a || !$b) { - return; - } - - (new stdClass())->a = $a; - } -} - -return (function ($a, $b) { - return function ($c, $d) use ($a, $b) { - echo $a, $b, $c, $d; - }; -})('a','b')('c','d'); - -function foo() -{ - Bar( - function () { - } - ); -} - -$deprecated_functions = [ - 'the_category_ID' - => function_call( // 7 spaces, not 8. This is the problem line. - $a, - $b - ), -]; - -$deprecated_functions = [ - 'the_category_ID' - => function_call( // 9 spaces, not 8. This is the problem line. - $a, - $b - ), -]; - -// phpcs:set PEAR.Functions.FunctionCallSignature allowMultipleArguments false - -printf( - '', - $obj->getName(), // Trailing comment. - $obj->getID(), // phpcs:ignore Standard.Category.SniffName -- for reasons. - $option -); - -// Handling of PHP 7.3 trailing comma's. -functionCall($args, $foo,); -functionCall( - $args, - $foo, -); -functionCall( - $args, - $foo, -); - -// phpcs:set PEAR.Functions.FunctionCallSignature allowMultipleArguments true - -$this->foo( - ['a','b'], - true -); - -$this->foo( - // Comment - ['a','b'], - true -); - -function m() -{ - $t = ' - ' . (empty(true) ? ' - ' . f( - '1', - '2', - ) . ' - ' : ''); -} - -class C -{ - - public function m() - { - $a = []; - $t = - "SELECT * FROM t -WHERE f IN(" . implode( - ",", - $a - ) . ")"; - } -} - -$notices = array( - 'index' => sprintf( - translation_function('a text string with %s placeholder'), - 'replacement' - ), -); - -$componentType = $this->componentTypeRepository->findByType($this->identifier) ?: - $this->componentTypeFactory->createForType( - $this->identifier, - $this->className, - true, - $this->isPrototypal - ); - -return [ - 'export-path' => 'exports/database/' - . env( - 'APP_CUSTOMER', - 'not-configured' - ) - . '/' . env( - 'APP_IDENTIFIER', - 'not-configured' - ), -]; - -$methods .= - str_replace( - array_keys($replacements), - array_values($replacements), - $methodTemplate - ) - . PHP_EOL . PHP_EOL . str_repeat(' ', 4); - -$rangeValues['min'] = - $this->adjustLowerThreshold( - $this->normalizeRatingForFilter($rangeValues['min']) - ); - -$salesOrderThresholdTransfer->fromArray($salesOrderThresholdEntity->toArray(), true) - ->setSalesOrderThresholdValue( - $this->mapSalesOrderThresholdValueTransfer($salesOrderThresholdTransfer, $salesOrderThresholdEntity) - )->setCurrency( - (new CurrencyTransfer())->fromArray($salesOrderThresholdEntity->getCurrency()->toArray(), true) - )->setStore( - (new StoreTransfer())->fromArray($salesOrderThresholdEntity->getStore()->toArray(), true) - ); - -return trim( - preg_replace_callback( - // sprintf replaces IGNORED_CHARS multiple times: for %s as well as %1$s (argument numbering) - // /[%s]*([^%1$s]+)/ results in /[IGNORED_CHARS]*([^IGNORED_CHARS]+)/ - sprintf('/[%s]*([^%1$s]+)/', self::IGNORED_CHARS), - function (array $term) use ($mode): string { - // query pieces have to bigger than one char, otherwise they are too expensive for the search - if (mb_strlen($term[1], 'UTF-8') > 1) { - // in boolean search mode '' (empty) means OR, '-' means NOT - return sprintf('%s%s ', $mode === 'AND' ? '+' : '', self::extractUmlauts($term[1])); - } - - return ''; - }, - $search - ) -); - -$a = ['a' => function ($b) { return $b; }]; -$a['a'](1); - -// PHP 8.0 named parameters. -array_fill_keys( - keys: range( - 1, - 12, - ), - value: true, -); - -array_fill_keys( - keys: range( - 1, - 12, - ), value: true, -); - -// phpcs:set PEAR.Functions.FunctionCallSignature allowMultipleArguments false -array_fill_keys( - keys: range( - 1, - 12, - ), - value: true, -); -// phpcs:set PEAR.Functions.FunctionCallSignature allowMultipleArguments true - -?> -
    -

    -
    -
    -

    -
    - -content -

    - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.js deleted file mode 100644 index 5e77e57..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.js +++ /dev/null @@ -1,80 +0,0 @@ -test( -); -test(); -test(arg, arg2); -test (); -test( ); -test() ; -test( arg); -test( arg ); -test ( arg ); - -if (foo(arg) === true) { - -} - -var something = get(arg1, arg2); -var something = get(arg1, arg2) ; -var something = get(arg1, arg2) ; - -make_foo(string/*the string*/, true/*test*/); -make_foo(string/*the string*/, true/*test*/ ); -make_foo(string /*the string*/, true /*test*/); -make_foo(/*the string*/string, /*test*/true); -make_foo( /*the string*/string, /*test*/true); - -// phpcs:set PEAR.Functions.FunctionCallSignature requiredSpacesAfterOpen 1 -// phpcs:set PEAR.Functions.FunctionCallSignature requiredSpacesBeforeClose 1 -test(arg, arg2); -test( arg, arg2 ); -test( arg, arg2 ); -// phpcs:set PEAR.Functions.FunctionCallSignature requiredSpacesAfterOpen 0 -// phpcs:set PEAR.Functions.FunctionCallSignature requiredSpacesBeforeClose 0 - -this.init = function(data) { - a.b('').a(function(itemid, target) { - b( - itemid, - target, - { - reviewData: _reviewData, - pageid: itemid - }, - '', - function() { - var _showAspectItems = function(itemid) { - a.a(a.c(''), ''); - a.b(a.c('-' + itemid), ''); - }; - a.foo(function(itemid, target) { - _foo(itemid); - }); - } - ); - }); -}; - -a.prototype = { - - a: function() - { - this.addItem( - { - /** - * @return void - */ - a: function() - { - - }, - /** - * @return void - */ - a: function() - { - - }, - } - ); - } -}; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.js.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.js.fixed deleted file mode 100644 index 7855ac6..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.js.fixed +++ /dev/null @@ -1,84 +0,0 @@ -test( -); -test(); -test(arg, arg2); -test(); -test(); -test(); -test(arg); -test(arg); -test(arg); - -if (foo(arg) === true) { - -} - -var something = get(arg1, arg2); -var something = get(arg1, arg2); -var something = get(arg1, arg2); - -make_foo(string/*the string*/, true/*test*/); -make_foo(string/*the string*/, true/*test*/); -make_foo(string /*the string*/, true /*test*/); -make_foo(/*the string*/string, /*test*/true); -make_foo(/*the string*/string, /*test*/true); - -// phpcs:set PEAR.Functions.FunctionCallSignature requiredSpacesAfterOpen 1 -// phpcs:set PEAR.Functions.FunctionCallSignature requiredSpacesBeforeClose 1 -test( arg, arg2 ); -test( arg, arg2 ); -test( arg, arg2 ); -// phpcs:set PEAR.Functions.FunctionCallSignature requiredSpacesAfterOpen 0 -// phpcs:set PEAR.Functions.FunctionCallSignature requiredSpacesBeforeClose 0 - -this.init = function(data) { - a.b('').a( - function(itemid, target) { - b( - itemid, - target, - { - reviewData: _reviewData, - pageid: itemid - }, - '', - function() { - var _showAspectItems = function(itemid) { - a.a(a.c(''), ''); - a.b(a.c('-' + itemid), ''); - }; - a.foo( - function(itemid, target) { - _foo(itemid); - } - ); - } - ); - } - ); -}; - -a.prototype = { - - a: function() - { - this.addItem( - { - /** - * @return void - */ - a: function() - { - - }, - /** - * @return void - */ - a: function() - { - - }, - } - ); - } -}; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.php deleted file mode 100644 index b635812..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionCallSignatureUnitTest.php +++ /dev/null @@ -1,164 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Tests\Functions; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the FunctionCallSignature sniff. - * - * @covers \PHP_CodeSniffer\Standards\PEAR\Sniffs\Functions\FunctionCallSignatureSniff - */ -final class FunctionCallSignatureUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - if ($testFile === 'FunctionCallSignatureUnitTest.js') { - return [ - 5 => 1, - 6 => 2, - 7 => 1, - 8 => 1, - 9 => 2, - 10 => 3, - 17 => 1, - 18 => 1, - 21 => 1, - 24 => 1, - 28 => 2, - 30 => 2, - 35 => 1, - 49 => 1, - 51 => 1, - 54 => 1, - 70 => 1, - 71 => 1, - ]; - }//end if - - return [ - 5 => 1, - 6 => 2, - 7 => 1, - 8 => 1, - 9 => 2, - 10 => 3, - 17 => 1, - 18 => 1, - 31 => 1, - 34 => 1, - 43 => 2, - 57 => 1, - 59 => 1, - 63 => 1, - 64 => 1, - 82 => 1, - 93 => 1, - 100 => 1, - 106 => 2, - 119 => 1, - 120 => 1, - 129 => 1, - 137 => 1, - 142 => 2, - 171 => 1, - 180 => 1, - 181 => 1, - 194 => 1, - 213 => 2, - 215 => 2, - 217 => 2, - 218 => 2, - 277 => 1, - 278 => 1, - 303 => 1, - 308 => 1, - 321 => 1, - 322 => 1, - 329 => 1, - 330 => 1, - 337 => 1, - 342 => 1, - 343 => 1, - 345 => 1, - 346 => 2, - 353 => 1, - 354 => 1, - 355 => 2, - 377 => 1, - 378 => 1, - 379 => 1, - 380 => 1, - 385 => 1, - 386 => 1, - 387 => 1, - 388 => 1, - 393 => 1, - 394 => 1, - 395 => 1, - 396 => 1, - 411 => 1, - 422 => 1, - 424 => 1, - 429 => 1, - 432 => 1, - 440 => 1, - 441 => 1, - 442 => 1, - 464 => 1, - 510 => 1, - 513 => 1, - 514 => 1, - 523 => 1, - 524 => 3, - 527 => 2, - 539 => 1, - 540 => 1, - 546 => 1, - 547 => 1, - 548 => 1, - 559 => 1, - 567 => 1, - 568 => 1, - 573 => 1, - 574 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionDeclarationUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionDeclarationUnitTest.1.inc deleted file mode 100644 index 6ba3bd9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/FunctionDeclarationUnitTest.1.inc +++ /dev/null @@ -1,490 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Tests\Functions; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the FunctionDeclaration sniff. - * - * @covers \PHP_CodeSniffer\Standards\PEAR\Sniffs\Functions\FunctionDeclarationSniff - */ -final class FunctionDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'FunctionDeclarationUnitTest.1.inc': - return [ - 3 => 1, - 4 => 1, - 5 => 1, - 9 => 1, - 10 => 1, - 11 => 1, - 14 => 1, - 17 => 1, - 44 => 1, - 52 => 1, - 61 => 2, - 98 => 1, - 110 => 2, - 120 => 3, - 121 => 1, - 140 => 1, - 145 => 1, - 161 => 2, - 162 => 2, - 164 => 2, - 167 => 2, - 171 => 1, - 173 => 1, - 201 => 1, - 206 => 1, - 208 => 1, - 216 => 1, - 223 => 1, - 230 => 1, - 237 => 1, - 243 => 1, - 247 => 1, - 251 => 2, - 253 => 2, - 257 => 2, - 259 => 1, - 263 => 1, - 265 => 1, - 269 => 1, - 273 => 1, - 277 => 1, - 278 => 1, - 283 => 1, - 287 => 2, - 289 => 2, - 293 => 2, - 295 => 1, - 299 => 1, - 301 => 1, - 305 => 1, - 309 => 1, - 313 => 1, - 314 => 1, - 350 => 1, - 351 => 1, - 352 => 1, - 353 => 1, - 361 => 1, - 362 => 1, - 363 => 1, - 364 => 1, - 365 => 1, - 366 => 1, - 367 => 1, - 368 => 1, - 369 => 1, - 370 => 1, - 371 => 1, - 402 => 1, - 406 => 1, - 475 => 1, - 483 => 1, - 490 => 2, - ]; - - case 'FunctionDeclarationUnitTest.js': - return [ - 3 => 1, - 4 => 1, - 5 => 1, - 9 => 1, - 10 => 1, - 11 => 1, - 14 => 1, - 17 => 1, - 41 => 1, - 48 => 1, - ]; - - case 'FunctionDeclarationUnitTest.4.inc': - return [ - 7 => 1, - ]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/ValidDefaultValueUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/ValidDefaultValueUnitTest.1.inc deleted file mode 100644 index 587e70c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/ValidDefaultValueUnitTest.1.inc +++ /dev/null @@ -1,120 +0,0 @@ - $a[] = $b; - -class OnlyConstructorPropertyPromotion { - public function __construct( - public string $name = '', - protected $bar - ) {} -} - -class ConstructorPropertyPromotionMixedWithNormalParams { - public function __construct( - public(set) string $name = '', - ?int $optionalParam = 0, - mixed $requiredParam, - ) {} -} - -// Safeguard correct handling of FQN null as default value. -function foo(Foo $foo = \null, $bar) {} -function foo(Foo $foo = \null, Foz $foz = \NULL, $bar = true, $baz) {} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/ValidDefaultValueUnitTest.2.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/ValidDefaultValueUnitTest.2.inc deleted file mode 100644 index 3cfece7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/Functions/ValidDefaultValueUnitTest.2.inc +++ /dev/null @@ -1,7 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Tests\Functions; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ValidDefaultValue sniff. - * - * @covers \PHP_CodeSniffer\Standards\PEAR\Sniffs\Functions\ValidDefaultValueSniff - */ -final class ValidDefaultValueUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'ValidDefaultValueUnitTest.1.inc': - return [ - 29 => 1, - 34 => 1, - 39 => 1, - 71 => 1, - 76 => 1, - 81 => 1, - 91 => 1, - 99 => 1, - 101 => 1, - 106 => 1, - 114 => 1, - 120 => 1, - ]; - - default: - return []; - } - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/NamingConventions/ValidClassNameUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/NamingConventions/ValidClassNameUnitTest.inc deleted file mode 100644 index 053a4fe..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/NamingConventions/ValidClassNameUnitTest.inc +++ /dev/null @@ -1,90 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Tests\NamingConventions; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ValidClassName sniff. - * - * @covers \PHP_CodeSniffer\Standards\PEAR\Sniffs\NamingConventions\ValidClassNameSniff - */ -final class ValidClassNameUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 5 => 1, - 7 => 2, - 9 => 1, - 19 => 1, - 24 => 1, - 26 => 2, - 28 => 1, - 38 => 1, - 40 => 2, - 42 => 2, - 44 => 1, - 46 => 1, - 50 => 1, - 52 => 2, - 54 => 1, - 64 => 1, - 66 => 2, - 68 => 1, - 72 => 1, - 74 => 2, - 76 => 1, - 86 => 1, - 88 => 2, - 90 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/NamingConventions/ValidFunctionNameUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/NamingConventions/ValidFunctionNameUnitTest.inc deleted file mode 100644 index 18b1a48..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/NamingConventions/ValidFunctionNameUnitTest.inc +++ /dev/null @@ -1,243 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Tests\NamingConventions; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ValidFunctionName sniff. - * - * @covers \PHP_CodeSniffer\Standards\PEAR\Sniffs\NamingConventions\ValidFunctionNameSniff - */ -final class ValidFunctionNameUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 11 => 1, - 12 => 1, - 13 => 1, - 14 => 1, - 15 => 1, - 16 => 1, - 17 => 2, - 18 => 2, - 19 => 2, - 20 => 2, - 24 => 1, - 25 => 1, - 26 => 1, - 27 => 1, - 28 => 1, - 29 => 1, - 30 => 2, - 31 => 2, - 32 => 2, - 33 => 2, - 35 => 1, - 36 => 1, - 37 => 2, - 38 => 2, - 39 => 2, - 40 => 2, - 43 => 1, - 44 => 1, - 45 => 1, - 46 => 1, - 50 => 1, - 51 => 1, - 52 => 1, - 53 => 1, - 56 => 1, - 57 => 1, - 58 => 1, - 59 => 1, - 67 => 1, - 68 => 1, - 69 => 1, - 70 => 1, - 71 => 1, - 72 => 1, - 73 => 2, - 74 => 2, - 75 => 2, - 76 => 2, - 80 => 1, - 81 => 1, - 82 => 1, - 83 => 1, - 86 => 1, - 87 => 1, - 88 => 1, - 89 => 1, - 95 => 1, - 96 => 1, - 97 => 1, - 98 => 1, - 99 => 1, - 100 => 1, - 101 => 2, - 102 => 2, - 103 => 2, - 104 => 2, - 123 => 1, - 125 => 1, - 126 => 2, - 129 => 1, - 130 => 1, - 131 => 1, - 132 => 1, - 133 => 1, - 134 => 1, - 135 => 1, - 136 => 1, - 137 => 1, - 138 => 1, - 139 => 1, - 140 => 3, - 141 => 1, - 143 => 1, - 144 => 1, - 145 => 3, - 147 => 2, - 148 => 1, - 149 => 1, - 181 => 1, - 201 => 1, - 203 => 1, - 204 => 2, - 207 => 2, - 212 => 1, - 213 => 1, - 214 => 1, - 235 => 1, - 236 => 2, - 239 => 1, - 242 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/NamingConventions/ValidVariableNameUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/NamingConventions/ValidVariableNameUnitTest.inc deleted file mode 100644 index e99dda1..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/NamingConventions/ValidVariableNameUnitTest.inc +++ /dev/null @@ -1,115 +0,0 @@ -def["POP_{$cc}_A"]}' - and POP_{$cc}_B = -'{$this->def["POP_{$cc}_B"]}')"; - } -} - -class mpgResponse{ - var $term_id; - var $currentTag; - function characterHandler($parser,$data){ - switch($this->currentTag) - { - case "term_id": { - $this->term_id=$data; - break; - } - } - }//end characterHandler -}//end class mpgResponse - -class foo -{ - const bar = <<setLogger( - new class { - private $varName = 'hello'; - private $_varName = 'hello'; -}); - -class AsymVisibility { - // The read scope is public, but not specified. Enforce the naming conventions anyway. - private(set) $asymPublicImplied = 'hello'; - private(set) $_asymPublicImplied = 'hello'; - - // The read scope is private, so these properties should be handled as private properties. - private private(set) $asymPrivate = 'hello'; - private(set) private $_asymPrivate = 'hello'; - - // The read scope is public/protected, so these properties should be handled as public properties. - public private(set) $asymPublicPrivate = 'hello'; - private(set) protected $_asymPrivateProtected = 'hello'; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/NamingConventions/ValidVariableNameUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/NamingConventions/ValidVariableNameUnitTest.php deleted file mode 100644 index 8b6c1a7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/NamingConventions/ValidVariableNameUnitTest.php +++ /dev/null @@ -1,64 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Tests\NamingConventions; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ValidVariableName sniff. - * - * @covers \PHP_CodeSniffer\Standards\PEAR\Sniffs\NamingConventions\ValidVariableNameSniff - */ -final class ValidVariableNameUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 12 => 1, - 17 => 1, - 22 => 1, - 92 => 1, - 93 => 1, - 94 => 1, - 99 => 1, - 106 => 1, - 109 => 1, - 114 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ObjectOperatorIndentUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ObjectOperatorIndentUnitTest.inc deleted file mode 100644 index c5ced0a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ObjectOperatorIndentUnitTest.inc +++ /dev/null @@ -1,153 +0,0 @@ -someFunction("some", "parameter") -->someOtherFunc(23, 42)-> - someOtherFunc2($one, $two) - - ->someOtherFunc3(23, 42) - ->andAThirdFunction(); - - $someObject->someFunction("some", "parameter") - ->someOtherFunc(23, 42); - -$someObject->someFunction("some", "parameter")->someOtherFunc(23, 42); - -$someObject->someFunction("some", "parameter") - ->someOtherFunc(23, 42); - -func( - $bar->foo() -) - ->bar(); - -func( - $bar->foo() -) - ->bar( - $bar->foo() - ->bar() - ->func() - ); - -$object - ->setBar($foo) - ->setFoo($bar); - -if ($bar) { - $object - ->setBar($foo) - ->setFoo($bar); -} - -$response -> CompletedTrackDetails -> TrackDetails -> Events; -$response - -> CompletedTrackDetails - -> TrackDetails - -> Events; - -$response - -> CompletedTrackDetails --> TrackDetails - -> Events; - -$var = get_object( - $foo->something() - ->query() -)->two() - ->three(); - -$foo->one( - $foo - ->two() -); - -get_object()->one() - ->two() - ->three(); - -someclass::one() - ->two() - ->three(); - -(new someclass())->one() - ->two() - ->three(); - -// phpcs:set PEAR.WhiteSpace.ObjectOperatorIndent multilevel true - -$someObject - ->startSomething() - ->someOtherFunc(23, 42) -->endSomething() -->doSomething(23, 42) -->endEverything(); - -$rootNode - ->one() - ->two() - ->three() - ->four() - ->five(); - -$rootNode - ->one() - ->two() - ->three() - ->four() - ->five(); - -$rootNode - ->one() - ->two() - ->three() - ->four() -->five(); - -$rootNode - ->one() - ->two() - ->three() - ->four() - ->five(); - -// phpcs:set PEAR.WhiteSpace.ObjectOperatorIndent multilevel false - -$object - ?->setBar($foo) - ?->setFoo($bar); - -$someObject?->someFunction("some", "parameter") -->someOtherFunc(23, 42)?-> - someOtherFunc2($one, $two) - -->someOtherFunc3(23, 42) - ?->andAThirdFunction(); - -// phpcs:set PEAR.WhiteSpace.ObjectOperatorIndent multilevel true -$object - ?->setBar($foo) - ?->setFoo($bar); - -$someObject?->someFunction("some", "parameter") -->someOtherFunc(23, 42) - ?->someOtherFunc2($one, $two) - -->someOtherFunc3(23, 42) - ?->andAThirdFunction(); -// phpcs:set PEAR.WhiteSpace.ObjectOperatorIndent multilevel false - -$someObject - ->startSomething(paramName: $value) - ->someOtherFunc(nameA: 23, nameB: 42) -->endSomething($value, name: $value) -->endEverything(); - -// Issue https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/1154 -$array = [ - [ - $item->one()->two(), - ], - $item->one() - ->two(), - $item->one() - ->two(), -]; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ObjectOperatorIndentUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ObjectOperatorIndentUnitTest.inc.fixed deleted file mode 100644 index 48419d9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ObjectOperatorIndentUnitTest.inc.fixed +++ /dev/null @@ -1,153 +0,0 @@ -someFunction("some", "parameter") - ->someOtherFunc(23, 42) - ->someOtherFunc2($one, $two) - - ->someOtherFunc3(23, 42) - ->andAThirdFunction(); - - $someObject->someFunction("some", "parameter") - ->someOtherFunc(23, 42); - -$someObject->someFunction("some", "parameter")->someOtherFunc(23, 42); - -$someObject->someFunction("some", "parameter") - ->someOtherFunc(23, 42); - -func( - $bar->foo() -) - ->bar(); - -func( - $bar->foo() -) - ->bar( - $bar->foo() - ->bar() - ->func() - ); - -$object - ->setBar($foo) - ->setFoo($bar); - -if ($bar) { - $object - ->setBar($foo) - ->setFoo($bar); -} - -$response -> CompletedTrackDetails -> TrackDetails -> Events; -$response - -> CompletedTrackDetails - -> TrackDetails - -> Events; - -$response - -> CompletedTrackDetails - -> TrackDetails - -> Events; - -$var = get_object( - $foo->something() - ->query() -)->two() - ->three(); - -$foo->one( - $foo - ->two() -); - -get_object()->one() - ->two() - ->three(); - -someclass::one() - ->two() - ->three(); - -(new someclass())->one() - ->two() - ->three(); - -// phpcs:set PEAR.WhiteSpace.ObjectOperatorIndent multilevel true - -$someObject - ->startSomething() - ->someOtherFunc(23, 42) - ->endSomething() - ->doSomething(23, 42) - ->endEverything(); - -$rootNode - ->one() - ->two() - ->three() - ->four() - ->five(); - -$rootNode - ->one() - ->two() - ->three() - ->four() - ->five(); - -$rootNode - ->one() - ->two() - ->three() - ->four() - ->five(); - -$rootNode - ->one() - ->two() - ->three() - ->four() - ->five(); - -// phpcs:set PEAR.WhiteSpace.ObjectOperatorIndent multilevel false - -$object - ?->setBar($foo) - ?->setFoo($bar); - -$someObject?->someFunction("some", "parameter") - ->someOtherFunc(23, 42) - ?->someOtherFunc2($one, $two) - - ->someOtherFunc3(23, 42) - ?->andAThirdFunction(); - -// phpcs:set PEAR.WhiteSpace.ObjectOperatorIndent multilevel true -$object - ?->setBar($foo) - ?->setFoo($bar); - -$someObject?->someFunction("some", "parameter") - ->someOtherFunc(23, 42) - ?->someOtherFunc2($one, $two) - - ->someOtherFunc3(23, 42) - ?->andAThirdFunction(); -// phpcs:set PEAR.WhiteSpace.ObjectOperatorIndent multilevel false - -$someObject - ->startSomething(paramName: $value) - ->someOtherFunc(nameA: 23, nameB: 42) - ->endSomething($value, name: $value) - ->endEverything(); - -// Issue https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/1154 -$array = [ - [ - $item->one()->two(), - ], - $item->one() - ->two(), - $item->one() - ->two(), -]; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ObjectOperatorIndentUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ObjectOperatorIndentUnitTest.php deleted file mode 100644 index e67c168..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ObjectOperatorIndentUnitTest.php +++ /dev/null @@ -1,80 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ObjectOperatorIndent sniff. - * - * @covers \PHP_CodeSniffer\Standards\PEAR\Sniffs\WhiteSpace\ObjectOperatorIndentSniff - */ -final class ObjectOperatorIndentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 3 => 2, - 6 => 1, - 15 => 1, - 27 => 1, - 37 => 1, - 38 => 1, - 48 => 1, - 49 => 1, - 50 => 1, - 65 => 1, - 69 => 1, - 73 => 1, - 79 => 1, - 80 => 1, - 81 => 1, - 82 => 1, - 95 => 1, - 103 => 1, - 119 => 2, - 122 => 1, - 131 => 1, - 134 => 1, - 140 => 1, - 141 => 1, - 142 => 1, - 152 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ScopeClosingBraceUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ScopeClosingBraceUnitTest.inc deleted file mode 100644 index a97aca7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ScopeClosingBraceUnitTest.inc +++ /dev/null @@ -1,170 +0,0 @@ -{$property} =& new $class_name($this->db_index); - $this->modules[$module] =& $this->{$property}; -} - -foreach ($elements as $element) { - if ($something) { - // Do IF. - } else if ($somethingElse) { - // Do ELSE. - } -} - -switch ($foo) { -case 1: - switch ($bar) { - default: - if ($something) { - echo $string{1}; - } else if ($else) { - switch ($else) { - case 1: - // Do something. - break; - default: - // Do something. - break; - } - } - } -break; -case 2: - // Do something; - break; -} - -switch ($httpResponseCode) { - case 100: - case 101: - case 102: - default: - return 'Unknown'; -} - -switch ($httpResponseCode) { - case 100: - case 101: - case 102: - return 'Processing.'; - default: - return 'Unknown'; -} - -switch($i) { -case 1: {} -} - -switch ($httpResponseCode) { - case 100: - case 101: - case 102: - exit; - default: - exit; -} - -if ($foo): - if ($bar): - $foo = 1; - elseif ($baz): - $foo = 2; - endif; -endif; - -if ($foo): -elseif ($baz): $foo = 2; -endif; - -?> -
      - -
    • - -
    -
      - -
    • - -
    -
      - -
    • - -
    - -getSummaryCount(); ?> -
    class="empty"> - - 'a', 2 => 'b' }; - -$match = match ($test) { - 1 => 'a', - 2 => 'b' - }; - -enum Enum -{ -} - -enum Suits {} - -enum Cards -{ - } - -?> - - -
    -
    {$property} =& new $class_name($this->db_index); - $this->modules[$module] =& $this->{$property}; -} - -foreach ($elements as $element) { - if ($something) { - // Do IF. - } else if ($somethingElse) { - // Do ELSE. - } -} - -switch ($foo) { -case 1: - switch ($bar) { - default: - if ($something) { - echo $string{1}; - } else if ($else) { - switch ($else) { - case 1: - // Do something. - break; - default: - // Do something. - break; - } - } - } - break; -case 2: - // Do something; - break; -} - -switch ($httpResponseCode) { - case 100: - case 101: - case 102: - default: - return 'Unknown'; -} - -switch ($httpResponseCode) { - case 100: - case 101: - case 102: - return 'Processing.'; - default: - return 'Unknown'; -} - -switch($i) { -case 1: { - } -} - -switch ($httpResponseCode) { - case 100: - case 101: - case 102: - exit; - default: - exit; -} - -if ($foo): - if ($bar): - $foo = 1; - elseif ($baz): - $foo = 2; - endif; -endif; - -if ($foo): -elseif ($baz): $foo = 2; -endif; - -?> -
      - -
    • - -
    -
      - -
    • - -
    -
      - -
    • - -
    - -getSummaryCount(); ?> -
    class="empty"> - - 'a', 2 => 'b' -}; - -$match = match ($test) { - 1 => 'a', - 2 => 'b' -}; - -enum Enum -{ -} - -enum Suits { -} - -enum Cards -{ -} - -?> - - -
    -
    - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ScopeClosingBrace sniff. - * - * @covers \PHP_CodeSniffer\Standards\PEAR\Sniffs\WhiteSpace\ScopeClosingBraceSniff - */ -final class ScopeClosingBraceUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 11 => 1, - 13 => 1, - 24 => 1, - 30 => 1, - 61 => 1, - 65 => 1, - 85 => 1, - 89 => 1, - 98 => 1, - 122 => 1, - 127 => 1, - 135 => 1, - 141 => 1, - 146 => 1, - 149 => 1, - 154 => 1, - 160 => 1, - 164 => 1, - 170 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ScopeIndentUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ScopeIndentUnitTest.inc deleted file mode 100644 index b122a14..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/Tests/WhiteSpace/ScopeIndentUnitTest.inc +++ /dev/null @@ -1,314 +0,0 @@ -hello(); // error here - } - - function hello() // error here - { // no error here as brackets can be put anywhere in the pear standard - echo 'hello'; - } - - function hello2() - { - if (TRUE) { // error here - echo 'hello'; // no error here as its more than 4 spaces. - } else { - echo 'bye'; // error here - } - - while (TRUE) { - echo 'hello'; // error here - } - - do { // error here - echo 'hello'; // error here - } while (TRUE); - } - - function hello3() - { - switch ($hello) { - case 'hello': - break; - } - } - -} - -?> -
    -
    -
    -validate()) {
    -    $safe = $form->getSubmitValues();
    -}
    -?>
    -
    -open(); // error here - } - - public function open() - { - // Some inline stuff that shouldn't error - if (TRUE) echo 'hello'; - foreach ($tokens as $token) echo $token; - } - - /** - * This is a comment 1. - * This is a comment 2. - * This is a comment 3. - * This is a comment 4. - */ - public function close() - { - // All ok. - if (TRUE) { - if (TRUE) { - } else if (FALSE) { - foreach ($tokens as $token) { - switch ($token) { - case '1': - case '2': - if (true) { - if (false) { - if (false) { - if (false) { - echo 'hello'; - } - } - } - } - break; - case '5': - break; - } - do { - while (true) { - foreach ($tokens as $token) { - for ($i = 0; $i < $token; $i++) { - echo 'hello'; - } - } - } - } while (true); - } - } - } - } - - /* - This is another c style comment 1. - This is another c style comment 2. - This is another c style comment 3. - This is another c style comment 4. - This is another c style comment 5. - */ - - /* - * - * - * - */ - - /** - */ - - /* - This comment has a newline in it. - - */ - - public function read() - { - echo 'hello'; - - // no errors below. - $array = array( - 'this', - 'that' => array( - 'hello', - 'hello again' => array( - 'hello', - ), - ), - ); - } -} - -abstract class Test3 -{ - public function parse() - { - - foreach ($t as $ndx => $token) { - if (is_array($token)) { - echo 'here'; - } else { - $ts[] = array("token" => $token, "value" => ''); - - $last = count($ts) - 1; - - switch ($token) { - case '(': - - if ($last >= 3 && - $ts[0]['token'] != T_CLASS && - $ts[$last - 2]['token'] == T_OBJECT_OPERATOR && - $ts[$last - 3]['token'] == T_VARIABLE ) { - - - if (true) { - echo 'hello'; - } - } - array_push($braces, $token); - break; - } - } - } - } -} - -function test() -{ - $o = <<hello(); // error here - } - - function hello() // error here - { // no error here as brackets can be put anywhere in the pear standard - echo 'hello'; - } - - function hello2() - { - if (TRUE) { // error here - echo 'hello'; // no error here as its more than 4 spaces. - } else { - echo 'bye'; // error here - } - - while (TRUE) { - echo 'hello'; // error here - } - - do { // error here - echo 'hello'; // error here - } while (TRUE); - } - - function hello3() - { - switch ($hello) { - case 'hello': - break; - } - } - -} - -?> -
    -
    -
    -validate()) {
    -    $safe = $form->getSubmitValues();
    -}
    -?>
    -
    -open(); // error here - } - - public function open() - { - // Some inline stuff that shouldn't error - if (TRUE) echo 'hello'; - foreach ($tokens as $token) echo $token; - } - - /** - * This is a comment 1. - * This is a comment 2. - * This is a comment 3. - * This is a comment 4. - */ - public function close() - { - // All ok. - if (TRUE) { - if (TRUE) { - } else if (FALSE) { - foreach ($tokens as $token) { - switch ($token) { - case '1': - case '2': - if (true) { - if (false) { - if (false) { - if (false) { - echo 'hello'; - } - } - } - } - break; - case '5': - break; - } - do { - while (true) { - foreach ($tokens as $token) { - for ($i = 0; $i < $token; $i++) { - echo 'hello'; - } - } - } - } while (true); - } - } - } - } - - /* - This is another c style comment 1. - This is another c style comment 2. - This is another c style comment 3. - This is another c style comment 4. - This is another c style comment 5. - */ - - /* - * - * - * - */ - - /** - */ - - /* - This comment has a newline in it. - - */ - - public function read() - { - echo 'hello'; - - // no errors below. - $array = array( - 'this', - 'that' => array( - 'hello', - 'hello again' => array( - 'hello', - ), - ), - ); - } -} - -abstract class Test3 -{ - public function parse() - { - - foreach ($t as $ndx => $token) { - if (is_array($token)) { - echo 'here'; - } else { - $ts[] = array("token" => $token, "value" => ''); - - $last = count($ts) - 1; - - switch ($token) { - case '(': - - if ($last >= 3 && - $ts[0]['token'] != T_CLASS && - $ts[$last - 2]['token'] == T_OBJECT_OPERATOR && - $ts[$last - 3]['token'] == T_VARIABLE ) { - - - if (true) { - echo 'hello'; - } - } - array_push($braces, $token); - break; - } - } - } - } -} - -function test() -{ - $o = << - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PEAR\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ScopeIndent sniff. - * - * @covers \PHP_CodeSniffer\Standards\PEAR\Sniffs\WhiteSpace\ScopeIndentSniff - */ -final class ScopeIndentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Get a list of CLI values to set before the file is tested. - * - * @param string $testFile The name of the file being tested. - * @param \PHP_CodeSniffer\Config $config The config data for the test run. - * - * @return void - */ - public function setCliValues($testFile, $config) - { - $config->setConfigData('scope_indent_debug', '0', true); - - }//end setCliValues() - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 7 => 1, - 10 => 1, - 17 => 1, - 20 => 1, - 24 => 1, - 25 => 1, - 27 => 1, - 28 => 1, - 29 => 1, - 30 => 1, - 58 => 1, - 123 => 1, - 224 => 1, - 225 => 1, - 279 => 1, - 284 => 1, - 311 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/ruleset.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/ruleset.xml deleted file mode 100644 index 1bf94ca..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PEAR/ruleset.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - The PEAR coding standard. - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Docs/Classes/ClassDeclarationStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Docs/Classes/ClassDeclarationStandard.xml deleted file mode 100644 index eaae99b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Docs/Classes/ClassDeclarationStandard.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - class Bar { -} - ]]> - - - class Bar { -} - -class Baz { -} - ]]> - - - - - namespace Foo; - -class Bar { -} - ]]> - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Docs/Files/SideEffectsStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Docs/Files/SideEffectsStandard.xml deleted file mode 100644 index e824289..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Docs/Files/SideEffectsStandard.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - echo "Class Foo loaded."; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Docs/Methods/CamelCapsMethodNameStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Docs/Methods/CamelCapsMethodNameStandard.xml deleted file mode 100644 index 66df4e1..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Docs/Methods/CamelCapsMethodNameStandard.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - doBar() - { - } -} - ]]> - - - do_bar() - { - } -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Sniffs/Classes/ClassDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Sniffs/Classes/ClassDeclarationSniff.php deleted file mode 100644 index 8296751..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Sniffs/Classes/ClassDeclarationSniff.php +++ /dev/null @@ -1,75 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR1\Sniffs\Classes; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ClassDeclarationSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_CLASS, - T_INTERFACE, - T_TRAIT, - T_ENUM, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param integer $stackPtr The position of the current token in - * the token stack. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - if (isset($tokens[$stackPtr]['scope_closer']) === false) { - return; - } - - $errorData = [strtolower($tokens[$stackPtr]['content'])]; - - $nextClass = $phpcsFile->findNext([T_CLASS, T_INTERFACE, T_TRAIT, T_ENUM], ($tokens[$stackPtr]['scope_closer'] + 1)); - if ($nextClass !== false) { - $error = 'Each %s must be in a file by itself'; - $phpcsFile->addError($error, $nextClass, 'MultipleClasses', $errorData); - $phpcsFile->recordMetric($stackPtr, 'One class per file', 'no'); - } else { - $phpcsFile->recordMetric($stackPtr, 'One class per file', 'yes'); - } - - $namespace = $phpcsFile->findNext([T_NAMESPACE, T_CLASS, T_INTERFACE, T_TRAIT, T_ENUM], 0); - if ($tokens[$namespace]['code'] !== T_NAMESPACE) { - $error = 'Each %s must be in a namespace of at least one level (a top-level vendor name)'; - $phpcsFile->addError($error, $stackPtr, 'MissingNamespace', $errorData); - $phpcsFile->recordMetric($stackPtr, 'Class defined in namespace', 'no'); - } else { - $phpcsFile->recordMetric($stackPtr, 'Class defined in namespace', 'yes'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Sniffs/Files/SideEffectsSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Sniffs/Files/SideEffectsSniff.php deleted file mode 100644 index 2bb5423..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Sniffs/Files/SideEffectsSniff.php +++ /dev/null @@ -1,303 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR1\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class SideEffectsSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the token stack. - * - * @return int - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $result = $this->searchForConflict($phpcsFile, 0, ($phpcsFile->numTokens - 1), $tokens); - - if ($result['symbol'] !== null && $result['effect'] !== null) { - $error = 'A file should declare new symbols (classes, functions, constants, etc.) and cause no other side effects, or it should execute logic with side effects, but should not do both. The first symbol is defined on line %s and the first side effect is on line %s.'; - $data = [ - $tokens[$result['symbol']]['line'], - $tokens[$result['effect']]['line'], - ]; - $phpcsFile->addWarning($error, 0, 'FoundWithSymbols', $data); - $phpcsFile->recordMetric($stackPtr, 'Declarations and side effects mixed', 'yes'); - } else { - $phpcsFile->recordMetric($stackPtr, 'Declarations and side effects mixed', 'no'); - } - - // Ignore the rest of the file. - return $phpcsFile->numTokens; - - }//end process() - - - /** - * Searches for symbol declarations and side effects. - * - * Returns the positions of both the first symbol declared and the first - * side effect in the file. A NULL value for either indicates nothing was - * found. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $start The token to start searching from. - * @param int $end The token to search to. - * @param array $tokens The stack of tokens that make up - * the file. - * - * @return array - */ - private function searchForConflict($phpcsFile, $start, $end, $tokens) - { - $symbols = [ - T_CLASS => T_CLASS, - T_INTERFACE => T_INTERFACE, - T_TRAIT => T_TRAIT, - T_ENUM => T_ENUM, - T_FUNCTION => T_FUNCTION, - ]; - - $conditions = [ - T_IF => T_IF, - T_ELSE => T_ELSE, - T_ELSEIF => T_ELSEIF, - ]; - - $checkAnnotations = $phpcsFile->config->annotations; - - $firstSymbol = null; - $firstEffect = null; - for ($i = $start; $i <= $end; $i++) { - // Respect phpcs:disable comments. - if ($checkAnnotations === true - && $tokens[$i]['code'] === T_PHPCS_DISABLE - && (empty($tokens[$i]['sniffCodes']) === true - || isset($tokens[$i]['sniffCodes']['PSR1']) === true - || isset($tokens[$i]['sniffCodes']['PSR1.Files']) === true - || isset($tokens[$i]['sniffCodes']['PSR1.Files.SideEffects']) === true - || isset($tokens[$i]['sniffCodes']['PSR1.Files.SideEffects.FoundWithSymbols']) === true) - ) { - do { - $i = $phpcsFile->findNext(T_PHPCS_ENABLE, ($i + 1)); - } while ($i !== false - && empty($tokens[$i]['sniffCodes']) === false - && isset($tokens[$i]['sniffCodes']['PSR1']) === false - && isset($tokens[$i]['sniffCodes']['PSR1.Files']) === false - && isset($tokens[$i]['sniffCodes']['PSR1.Files.SideEffects']) === false - && isset($tokens[$i]['sniffCodes']['PSR1.Files.SideEffects.FoundWithSymbols']) === false); - - if ($i === false) { - // The entire rest of the file is disabled, - // so return what we have so far. - break; - } - - continue; - } - - // Ignore whitespace and comments. - if (isset(Tokens::$emptyTokens[$tokens[$i]['code']]) === true) { - continue; - } - - // Ignore PHP tags. - if ($tokens[$i]['code'] === T_OPEN_TAG - || $tokens[$i]['code'] === T_CLOSE_TAG - ) { - continue; - } - - // Ignore shebang. - if (substr($tokens[$i]['content'], 0, 2) === '#!') { - continue; - } - - // Ignore logical operators. - if (isset(Tokens::$booleanOperators[$tokens[$i]['code']]) === true) { - continue; - } - - // Ignore entire namespace, declare, const and use statements. - if ($tokens[$i]['code'] === T_NAMESPACE - || $tokens[$i]['code'] === T_USE - || $tokens[$i]['code'] === T_DECLARE - || $tokens[$i]['code'] === T_CONST - ) { - if (isset($tokens[$i]['scope_opener']) === true) { - $i = $tokens[$i]['scope_closer']; - if ($tokens[$i]['code'] === T_ENDDECLARE) { - $semicolon = $phpcsFile->findNext(Tokens::$emptyTokens, ($i + 1), null, true); - if ($semicolon !== false && $tokens[$semicolon]['code'] === T_SEMICOLON) { - $i = $semicolon; - } - } - } else { - $semicolon = $phpcsFile->findNext(T_SEMICOLON, ($i + 1)); - if ($semicolon !== false) { - $i = $semicolon; - } - } - - continue; - } - - // Ignore function/class prefixes. - if (isset(Tokens::$methodPrefixes[$tokens[$i]['code']]) === true - || $tokens[$i]['code'] === T_READONLY - ) { - continue; - } - - // Ignore anon classes. - if ($tokens[$i]['code'] === T_ANON_CLASS) { - $i = $tokens[$i]['scope_closer']; - continue; - } - - // Ignore attributes. - if ($tokens[$i]['code'] === T_ATTRIBUTE - && isset($tokens[$i]['attribute_closer']) === true - ) { - $i = $tokens[$i]['attribute_closer']; - continue; - } - - // Detect and skip over symbols. - if (isset($symbols[$tokens[$i]['code']]) === true - && isset($tokens[$i]['scope_closer']) === true - ) { - if ($firstSymbol === null) { - $firstSymbol = $i; - } - - $i = $tokens[$i]['scope_closer']; - continue; - } else if ($tokens[$i]['code'] === T_STRING - && strtolower($tokens[$i]['content']) === 'define' - ) { - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($i - 1), null, true); - if ($tokens[$prev]['code'] !== T_OBJECT_OPERATOR - && $tokens[$prev]['code'] !== T_NULLSAFE_OBJECT_OPERATOR - && $tokens[$prev]['code'] !== T_DOUBLE_COLON - && $tokens[$prev]['code'] !== T_FUNCTION - ) { - if ($firstSymbol === null) { - $firstSymbol = $i; - } - - $semicolon = $phpcsFile->findNext(T_SEMICOLON, ($i + 1)); - if ($semicolon !== false) { - $i = $semicolon; - } - - continue; - } - }//end if - - // Special case for defined() as it can be used to see - // if a constant (a symbol) should be defined or not and - // doesn't need to use a full conditional block. - if ($tokens[$i]['code'] === T_STRING - && strtolower($tokens[$i]['content']) === 'defined' - ) { - $openBracket = $phpcsFile->findNext(Tokens::$emptyTokens, ($i + 1), null, true); - if ($openBracket !== false - && $tokens[$openBracket]['code'] === T_OPEN_PARENTHESIS - && isset($tokens[$openBracket]['parenthesis_closer']) === true - ) { - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($i - 1), null, true); - if ($tokens[$prev]['code'] !== T_OBJECT_OPERATOR - && $tokens[$prev]['code'] !== T_NULLSAFE_OBJECT_OPERATOR - && $tokens[$prev]['code'] !== T_DOUBLE_COLON - && $tokens[$prev]['code'] !== T_FUNCTION - ) { - $i = $tokens[$openBracket]['parenthesis_closer']; - continue; - } - } - }//end if - - // Conditional statements are allowed in symbol files as long as the - // contents is only a symbol definition. So don't count these as effects - // in this case. - if (isset($conditions[$tokens[$i]['code']]) === true) { - if (isset($tokens[$i]['scope_opener']) === false) { - // Probably an "else if", so just ignore. - continue; - } - - $result = $this->searchForConflict( - $phpcsFile, - ($tokens[$i]['scope_opener'] + 1), - ($tokens[$i]['scope_closer'] - 1), - $tokens - ); - - if ($result['symbol'] !== null) { - if ($firstSymbol === null) { - $firstSymbol = $result['symbol']; - } - - if ($result['effect'] !== null) { - // Found a conflict. - $firstEffect = $result['effect']; - break; - } - } - - if ($firstEffect === null) { - $firstEffect = $result['effect']; - } - - $i = $tokens[$i]['scope_closer']; - continue; - }//end if - - if ($firstEffect === null) { - $firstEffect = $i; - } - - if ($firstSymbol !== null) { - // We have a conflict we have to report, so no point continuing. - break; - } - }//end for - - return [ - 'symbol' => $firstSymbol, - 'effect' => $firstEffect, - ]; - - }//end searchForConflict() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Sniffs/Methods/CamelCapsMethodNameSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Sniffs/Methods/CamelCapsMethodNameSniff.php deleted file mode 100644 index 08028c6..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Sniffs/Methods/CamelCapsMethodNameSniff.php +++ /dev/null @@ -1,91 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR1\Sniffs\Methods; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Standards\Generic\Sniffs\NamingConventions\CamelCapsFunctionNameSniff as GenericCamelCapsFunctionNameSniff; -use PHP_CodeSniffer\Util\Common; - -class CamelCapsMethodNameSniff extends GenericCamelCapsFunctionNameSniff -{ - - - /** - * Processes the tokens within the scope. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being processed. - * @param int $stackPtr The position where this token was - * found. - * @param int $currScope The position of the current scope. - * - * @return void - */ - protected function processTokenWithinScope(File $phpcsFile, $stackPtr, $currScope) - { - $tokens = $phpcsFile->getTokens(); - - // Determine if this is a function which needs to be examined. - $conditions = $tokens[$stackPtr]['conditions']; - end($conditions); - $deepestScope = key($conditions); - if ($deepestScope !== $currScope) { - return; - } - - $methodName = $phpcsFile->getDeclarationName($stackPtr); - if ($methodName === null) { - // Ignore closures. - return; - } - - // Ignore magic methods. - if (preg_match('|^__[^_]|', $methodName) !== 0) { - $magicPart = strtolower(substr($methodName, 2)); - if (isset($this->magicMethods[$magicPart]) === true - || isset($this->methodsDoubleUnderscore[$magicPart]) === true - ) { - return; - } - } - - $testName = ltrim($methodName, '_'); - if ($testName !== '' && Common::isCamelCaps($testName, false, true, false) === false) { - $error = 'Method name "%s" is not in camel caps format'; - $className = $phpcsFile->getDeclarationName($currScope); - if (isset($className) === false) { - $className = '[Anonymous Class]'; - } - - $errorData = [$className.'::'.$methodName]; - $phpcsFile->addError($error, $stackPtr, 'NotCamelCaps', $errorData); - $phpcsFile->recordMetric($stackPtr, 'CamelCase method name', 'no'); - } else { - $phpcsFile->recordMetric($stackPtr, 'CamelCase method name', 'yes'); - } - - }//end processTokenWithinScope() - - - /** - * Processes the tokens outside the scope. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being processed. - * @param int $stackPtr The position where this token was - * found. - * - * @return void - */ - protected function processTokenOutsideScope(File $phpcsFile, $stackPtr) - { - - }//end processTokenOutsideScope() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Classes/ClassDeclarationUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Classes/ClassDeclarationUnitTest.1.inc deleted file mode 100644 index 58cb85e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Classes/ClassDeclarationUnitTest.1.inc +++ /dev/null @@ -1,3 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR1\Tests\Classes; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ClassDeclaration sniff. - * - * @covers \PHP_CodeSniffer\Standards\PSR1\Sniffs\Classes\ClassDeclarationSniff - */ -final class ClassDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - if ($testFile === 'ClassDeclarationUnitTest.2.inc') { - return []; - } - - return [ - 2 => 1, - 3 => 2, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.1.inc deleted file mode 100644 index b7e1dc9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.1.inc +++ /dev/null @@ -1,87 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.10.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.10.inc deleted file mode 100644 index 63f256d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.10.inc +++ /dev/null @@ -1,8 +0,0 @@ -define("MAXSIZE", 100); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.14.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.14.inc deleted file mode 100644 index 9499885..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.14.inc +++ /dev/null @@ -1,2 +0,0 @@ -define("MAXSIZE", 100); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.15.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.15.inc deleted file mode 100644 index 0500d10..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.15.inc +++ /dev/null @@ -1,2 +0,0 @@ -defined('MINSIZE') or define("MAXSIZE", 100); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.16.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.16.inc deleted file mode 100644 index 588ece5..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.16.inc +++ /dev/null @@ -1,2 +0,0 @@ -defined('MINSIZE') or define("MAXSIZE", 100); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.17.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.17.inc deleted file mode 100644 index ec81bfe..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.17.inc +++ /dev/null @@ -1,8 +0,0 @@ -define(); -echo $object -> define(); -Foo::define(); - -$c = new class extends Something{ - - public function someMethod() - { - // ... - } - -}; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.3.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.3.inc deleted file mode 100644 index d4ae77e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.3.inc +++ /dev/null @@ -1,6 +0,0 @@ - -'; -} - -printHead(); -?> - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.5.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.5.inc deleted file mode 100644 index 7265c63..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.5.inc +++ /dev/null @@ -1,2 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.6.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.6.inc deleted file mode 100644 index e02fed4..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Files/SideEffectsUnitTest.6.inc +++ /dev/null @@ -1,9 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR1\Tests\Files; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the SideEffects sniff. - * - * @covers \PHP_CodeSniffer\Standards\PSR1\Sniffs\Files\SideEffectsSniff - */ -final class SideEffectsUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Set CLI values before the file is tested. - * - * @param string $testFile The name of the file being tested. - * @param \PHP_CodeSniffer\Config $config The config data for the test run. - * - * @return void - */ - public function setCliValues($testFile, $config) - { - if ($testFile === 'SideEffectsUnitTest.12.inc') { - $config->annotations = false; - } - - }//end setCliValues() - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - return []; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getWarningList($testFile='') - { - switch ($testFile) { - case 'SideEffectsUnitTest.3.inc': - case 'SideEffectsUnitTest.4.inc': - case 'SideEffectsUnitTest.5.inc': - case 'SideEffectsUnitTest.10.inc': - case 'SideEffectsUnitTest.12.inc': - case 'SideEffectsUnitTest.15.inc': - case 'SideEffectsUnitTest.16.inc': - return [1 => 1]; - default: - return []; - }//end switch - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Methods/CamelCapsMethodNameUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Methods/CamelCapsMethodNameUnitTest.inc deleted file mode 100644 index 7381517..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/Tests/Methods/CamelCapsMethodNameUnitTest.inc +++ /dev/null @@ -1,81 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR1\Tests\Methods; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the CamelCapsMethodName sniff. - * - * @covers \PHP_CodeSniffer\Standards\PSR1\Sniffs\Methods\CamelCapsMethodNameSniff - */ -final class CamelCapsMethodNameUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 6 => 1, - 7 => 1, - 11 => 1, - 12 => 1, - 13 => 1, - 17 => 1, - 21 => 1, - 25 => 1, - 26 => 1, - 77 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/ruleset.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/ruleset.xml deleted file mode 100644 index 65cbe20..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR1/ruleset.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - The PSR1 coding standard. - - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Classes/ClassInstantiationStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Classes/ClassInstantiationStandard.xml deleted file mode 100644 index ae24611..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Classes/ClassInstantiationStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Classes/ClosingBraceStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Classes/ClosingBraceStandard.xml deleted file mode 100644 index b59d734..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Classes/ClosingBraceStandard.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - -function bar() -{ - // Function content. -} - ]]> - - - echo 'Hello!'; - -function bar() -{ - // Function content. -} //end bar() - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Classes/OpeningBraceSpaceStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Classes/OpeningBraceSpaceStandard.xml deleted file mode 100644 index 818bbe8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Classes/OpeningBraceSpaceStandard.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - public function bar() - { - // Method content. - } -} - ]]> - - - - public function bar() - { - // Method content. - } -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/ControlStructures/BooleanOperatorPlacementStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/ControlStructures/BooleanOperatorPlacementStandard.xml deleted file mode 100644 index 805e15c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/ControlStructures/BooleanOperatorPlacementStandard.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/ControlStructures/ControlStructureSpacingStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/ControlStructures/ControlStructureSpacingStandard.xml deleted file mode 100644 index db4fe80..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/ControlStructures/ControlStructureSpacingStandard.xml +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - ($expr) { -} - ]]> - - - ( $expr) { -} - ]]> - - - - - ($expr) { -} - ]]> - - - ) { -} - ]]> - - - - - - - - $expr1 - && $expr2 -) { -} - ]]> - - - ($expr1 - && $expr2 -) { -} - ]]> - - - - - $expr1 - && $expr2 -) { -} - ]]> - - - $expr1 - && $expr2 - && $expr3 -) { -} - ]]> - - - - - - - - ) { -} - ]]> - - - && $expr2) { -} - ]]> - - - - - ) { -} - ]]> - - - ) { -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Files/ImportStatementStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Files/ImportStatementStandard.xml deleted file mode 100644 index 66b58de..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Files/ImportStatementStandard.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - \Vendor\Package\ClassA as A; - -class FooBar extends A -{ - // Class content. -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Files/OpenTagStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Files/OpenTagStandard.xml deleted file mode 100644 index 20db18b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Files/OpenTagStandard.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - -echo 'hi'; - ]]> - - - echo 'hi'; - ]]> - - - - - - - - - - - ]]> - - - - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Functions/NullableTypeDeclarationStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Functions/NullableTypeDeclarationStandard.xml deleted file mode 100644 index 95904c9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Functions/NullableTypeDeclarationStandard.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Functions/ReturnTypeDeclarationStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Functions/ReturnTypeDeclarationStandard.xml deleted file mode 100644 index 000459c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Functions/ReturnTypeDeclarationStandard.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - string { - // Closure body. -}; - ]]> - - - string { - // Closure body. -}; - ]]> - - - - - : string { - // Function body. -}; - ]]> - - - : string { - // Function body. -}; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Keywords/ShortFormTypeKeywordsStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Keywords/ShortFormTypeKeywordsStandard.xml deleted file mode 100644 index 9bb5a8a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Keywords/ShortFormTypeKeywordsStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - (boolean) $isValid; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Namespaces/CompoundNamespaceDepthStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Namespaces/CompoundNamespaceDepthStandard.xml deleted file mode 100644 index b74e8b4..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Namespaces/CompoundNamespaceDepthStandard.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - SubnamespaceOne\AnotherNamespace\ClassA, - SubnamespaceOne\ClassB, - ClassZ, -}; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Operators/OperatorSpacingStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Operators/OperatorSpacingStandard.xml deleted file mode 100644 index 981b1d9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Operators/OperatorSpacingStandard.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - $b) { - $variable = $foo ? 'foo' : 'bar'; -} - ]]> - - - $b) { - $variable=$foo?'foo':'bar'; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Properties/ConstantVisibilityStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Properties/ConstantVisibilityStandard.xml deleted file mode 100644 index da9b60a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Docs/Properties/ConstantVisibilityStandard.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - private const BAR = 'bar'; -} - ]]> - - - const BAR = 'bar'; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Classes/AnonClassDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Classes/AnonClassDeclarationSniff.php deleted file mode 100644 index fcb5968..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Classes/AnonClassDeclarationSniff.php +++ /dev/null @@ -1,246 +0,0 @@ - - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Sniffs\Classes; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Standards\Generic\Sniffs\Functions\FunctionCallArgumentSpacingSniff; -use PHP_CodeSniffer\Standards\PSR2\Sniffs\Classes\ClassDeclarationSniff; -use PHP_CodeSniffer\Standards\Squiz\Sniffs\Functions\MultiLineFunctionDeclarationSniff; -use PHP_CodeSniffer\Util\Tokens; - -class AnonClassDeclarationSniff extends ClassDeclarationSniff -{ - - /** - * The PSR2 MultiLineFunctionDeclarations sniff. - * - * @var \PHP_CodeSniffer\Standards\Squiz\Sniffs\Functions\MultiLineFunctionDeclarationSniff - */ - private $multiLineSniff = null; - - /** - * The Generic FunctionCallArgumentSpacing sniff. - * - * @var \PHP_CodeSniffer\Standards\Generic\Sniffs\Functions\FunctionCallArgumentSpacingSniff - */ - private $functionCallSniff = null; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_ANON_CLASS]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - if (isset($tokens[$stackPtr]['scope_opener']) === false) { - return; - } - - $this->multiLineSniff = new MultiLineFunctionDeclarationSniff(); - $this->functionCallSniff = new FunctionCallArgumentSpacingSniff(); - - $this->processOpen($phpcsFile, $stackPtr); - $this->processClose($phpcsFile, $stackPtr); - - if (isset($tokens[$stackPtr]['parenthesis_opener']) === true) { - $openBracket = $tokens[$stackPtr]['parenthesis_opener']; - if ($this->multiLineSniff->isMultiLineDeclaration($phpcsFile, $stackPtr, $openBracket, $tokens) === true) { - $this->processMultiLineArgumentList($phpcsFile, $stackPtr); - } else { - $this->processSingleLineArgumentList($phpcsFile, $stackPtr); - } - - $this->functionCallSniff->checkSpacing($phpcsFile, $stackPtr, $openBracket); - } - - $opener = $tokens[$stackPtr]['scope_opener']; - if ($tokens[$opener]['line'] === $tokens[$stackPtr]['line']) { - return; - } - - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($opener - 1), $stackPtr, true); - - $implements = $phpcsFile->findPrevious(T_IMPLEMENTS, ($opener - 1), $stackPtr); - if ($implements !== false - && $tokens[$opener]['line'] !== $tokens[$implements]['line'] - && $tokens[$opener]['line'] === $tokens[$prev]['line'] - ) { - // Opening brace must be on a new line as implements list wraps. - $error = 'Opening brace must be on the line after the last implemented interface'; - $fix = $phpcsFile->addFixableError($error, $opener, 'OpenBraceSameLine'); - if ($fix === true) { - $first = $phpcsFile->findFirstOnLine(T_WHITESPACE, $stackPtr, true); - $indent = str_repeat(' ', ($tokens[$first]['column'] - 1)); - $phpcsFile->fixer->beginChangeset(); - - if ($tokens[($prev + 1)]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->replaceToken(($prev + 1), ''); - } - - $phpcsFile->fixer->addNewline($prev); - $phpcsFile->fixer->addContentBefore($opener, $indent); - $phpcsFile->fixer->endChangeset(); - } - } - - if ($tokens[$opener]['line'] > ($tokens[$prev]['line'] + 1)) { - // Opening brace is on a new line, so there must be no blank line before it. - $error = 'Opening brace must not be preceded by a blank line'; - $fix = $phpcsFile->addFixableError($error, $opener, 'OpenBraceLine'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($x = ($prev + 1); $x < $opener; $x++) { - if ($tokens[$x]['line'] === $tokens[$prev]['line']) { - // Maintain existing newline. - continue; - } - - if ($tokens[$x]['line'] === $tokens[$opener]['line']) { - // Maintain existing indent. - break; - } - - $phpcsFile->fixer->replaceToken($x, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - }//end if - - }//end process() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function processSingleLineArgumentList(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $openBracket = $tokens[$stackPtr]['parenthesis_opener']; - $closeBracket = $tokens[$openBracket]['parenthesis_closer']; - if ($openBracket === ($closeBracket - 1)) { - return; - } - - if ($tokens[($openBracket + 1)]['code'] === T_WHITESPACE) { - $error = 'Space after opening parenthesis of single-line argument list prohibited'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceAfterOpenBracket'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($openBracket + 1), ''); - } - } - - $spaceBeforeClose = 0; - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($closeBracket - 1), $openBracket, true); - if ($tokens[$prev]['code'] === T_END_HEREDOC || $tokens[$prev]['code'] === T_END_NOWDOC) { - // Need a newline after these tokens, so ignore this rule. - return; - } - - if ($tokens[$prev]['line'] !== $tokens[$closeBracket]['line']) { - $spaceBeforeClose = 'newline'; - } else if ($tokens[($closeBracket - 1)]['code'] === T_WHITESPACE) { - $spaceBeforeClose = $tokens[($closeBracket - 1)]['length']; - } - - if ($spaceBeforeClose !== 0) { - $error = 'Space before closing parenthesis of single-line argument list prohibited'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceBeforeCloseBracket'); - if ($fix === true) { - if ($spaceBeforeClose === 'newline') { - $phpcsFile->fixer->beginChangeset(); - - $closingContent = ')'; - - $next = $phpcsFile->findNext(T_WHITESPACE, ($closeBracket + 1), null, true); - if ($tokens[$next]['code'] === T_SEMICOLON) { - $closingContent .= ';'; - for ($i = ($closeBracket + 1); $i <= $next; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - } - - // We want to jump over any whitespace or inline comment and - // move the closing parenthesis after any other token. - $prev = ($closeBracket - 1); - while (isset(Tokens::$emptyTokens[$tokens[$prev]['code']]) === true) { - if (($tokens[$prev]['code'] === T_COMMENT) - && (strpos($tokens[$prev]['content'], '*/') !== false) - ) { - break; - } - - $prev--; - } - - $phpcsFile->fixer->addContent($prev, $closingContent); - - $prevNonWhitespace = $phpcsFile->findPrevious(T_WHITESPACE, ($closeBracket - 1), null, true); - for ($i = ($prevNonWhitespace + 1); $i <= $closeBracket; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } else { - $phpcsFile->fixer->replaceToken(($closeBracket - 1), ''); - }//end if - }//end if - }//end if - - }//end processSingleLineArgumentList() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function processMultiLineArgumentList(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $openBracket = $tokens[$stackPtr]['parenthesis_opener']; - - $this->multiLineSniff->processBracket($phpcsFile, $openBracket, $tokens, 'argument'); - $this->multiLineSniff->processArgumentList($phpcsFile, $stackPtr, $this->indent, 'argument'); - - }//end processMultiLineArgumentList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Classes/ClassInstantiationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Classes/ClassInstantiationSniff.php deleted file mode 100644 index 264fd43..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Classes/ClassInstantiationSniff.php +++ /dev/null @@ -1,112 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Sniffs\Classes; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ClassInstantiationSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_NEW]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Find the class name. - $allowed = [ - T_STRING => T_STRING, - T_NS_SEPARATOR => T_NS_SEPARATOR, - T_SELF => T_SELF, - T_STATIC => T_STATIC, - T_PARENT => T_PARENT, - T_VARIABLE => T_VARIABLE, - T_DOLLAR => T_DOLLAR, - T_OBJECT_OPERATOR => T_OBJECT_OPERATOR, - T_NULLSAFE_OBJECT_OPERATOR => T_NULLSAFE_OBJECT_OPERATOR, - T_DOUBLE_COLON => T_DOUBLE_COLON, - ]; - - $allowed += Tokens::$emptyTokens; - - $classNameEnd = null; - for ($i = ($stackPtr + 1); $i < $phpcsFile->numTokens; $i++) { - if (isset($allowed[$tokens[$i]['code']]) === true) { - continue; - } - - // Bow out when this is an anonymous class. - // Anonymous classes are the only situation which would allow for an attribute - // or for the readonly keyword between "new" and the class "name". - if ($tokens[$i]['code'] === T_ATTRIBUTE - || $tokens[$i]['code'] === T_READONLY - || $tokens[$i]['code'] === T_ANON_CLASS - ) { - return; - } - - if ($tokens[$i]['code'] === T_OPEN_SQUARE_BRACKET - || $tokens[$i]['code'] === T_OPEN_CURLY_BRACKET - ) { - $i = $tokens[$i]['bracket_closer']; - continue; - } - - $classNameEnd = $i; - break; - }//end for - - if ($classNameEnd === null) { - return; - } - - if ($tokens[$classNameEnd]['code'] === T_OPEN_PARENTHESIS) { - // Using parenthesis. - return; - } - - if ($classNameEnd === $stackPtr) { - // Failed to find the class name. - return; - } - - $error = 'Parentheses must be used when instantiating a new class'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'MissingParentheses'); - if ($fix === true) { - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($classNameEnd - 1), null, true); - $phpcsFile->fixer->addContent($prev, '()'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Classes/ClosingBraceSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Classes/ClosingBraceSniff.php deleted file mode 100644 index 651dccb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Classes/ClosingBraceSniff.php +++ /dev/null @@ -1,67 +0,0 @@ - - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Sniffs\Classes; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ClosingBraceSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_CLASS, - T_INTERFACE, - T_TRAIT, - T_ENUM, - T_FUNCTION, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - if (isset($tokens[$stackPtr]['scope_closer']) === false) { - return; - } - - $closer = $tokens[$stackPtr]['scope_closer']; - $next = $phpcsFile->findNext(T_WHITESPACE, ($closer + 1), null, true); - if ($next === false - || $tokens[$next]['line'] !== $tokens[$closer]['line'] - ) { - return; - } - - $error = 'Closing brace must not be followed by any comment or statement on the same line'; - $phpcsFile->addError($error, $closer, 'StatementAfter'); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Classes/OpeningBraceSpaceSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Classes/OpeningBraceSpaceSniff.php deleted file mode 100644 index 658f3d7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Classes/OpeningBraceSpaceSniff.php +++ /dev/null @@ -1,80 +0,0 @@ - - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Sniffs\Classes; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class OpeningBraceSpaceSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return Tokens::$ooScopeTokens; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - if (isset($tokens[$stackPtr]['scope_opener']) === false) { - return; - } - - $opener = $tokens[$stackPtr]['scope_opener']; - $next = $phpcsFile->findNext(T_WHITESPACE, ($opener + 1), null, true); - if ($next === false - || $tokens[$next]['line'] <= ($tokens[$opener]['line'] + 1) - ) { - return; - } - - $error = 'Opening brace must not be followed by a blank line'; - $fix = $phpcsFile->addFixableError($error, $opener, 'Found'); - if ($fix === false) { - return; - } - - $phpcsFile->fixer->beginChangeset(); - for ($i = ($opener + 1); $i < $next; $i++) { - if ($tokens[$i]['line'] === $tokens[$opener]['line']) { - continue; - } - - if ($tokens[$i]['line'] === $tokens[$next]['line']) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/ControlStructures/BooleanOperatorPlacementSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/ControlStructures/BooleanOperatorPlacementSniff.php deleted file mode 100644 index be0338a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/ControlStructures/BooleanOperatorPlacementSniff.php +++ /dev/null @@ -1,229 +0,0 @@ - - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Sniffs\ControlStructures; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class BooleanOperatorPlacementSniff implements Sniff -{ - - /** - * Used to restrict the placement of the boolean operator. - * - * Allowed value are "first" or "last". - * - * @var string|null - */ - public $allowOnly = null; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_IF, - T_WHILE, - T_SWITCH, - T_ELSEIF, - T_MATCH, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['parenthesis_opener']) === false - || isset($tokens[$stackPtr]['parenthesis_closer']) === false - ) { - return; - } - - $parenOpener = $tokens[$stackPtr]['parenthesis_opener']; - $parenCloser = $tokens[$stackPtr]['parenthesis_closer']; - - if ($tokens[$parenOpener]['line'] === $tokens[$parenCloser]['line']) { - // Conditions are all on the same line. - return; - } - - $find = [ - T_BOOLEAN_AND, - T_BOOLEAN_OR, - ]; - - if ($this->allowOnly === 'first' || $this->allowOnly === 'last') { - $position = $this->allowOnly; - } else { - $position = null; - } - - $operator = $parenOpener; - $error = false; - $operators = []; - - do { - $operator = $phpcsFile->findNext($find, ($operator + 1), $parenCloser); - if ($operator === false) { - break; - } - - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($operator - 1), $parenOpener, true); - if ($prev === false) { - // Parse error. - return; - } - - $next = $phpcsFile->findNext(T_WHITESPACE, ($operator + 1), $parenCloser, true); - if ($next === false) { - // Parse error. - return; - } - - $firstOnLine = false; - $lastOnLine = false; - - if ($tokens[$prev]['line'] < $tokens[$operator]['line']) { - // The boolean operator is the first content on the line. - $firstOnLine = true; - } - - if ($tokens[$next]['line'] > $tokens[$operator]['line']) { - // The boolean operator is the last content on the line. - $lastOnLine = true; - } - - if ($firstOnLine === true && $lastOnLine === true) { - // The operator is the only content on the line. - // Don't record it because we can't determine - // placement information from looking at it. - continue; - } - - $operators[] = $operator; - - if ($firstOnLine === false && $lastOnLine === false) { - // It's in the middle of content, so we can't determine - // placement information from looking at it, but we may - // still need to process it. - continue; - } - - if ($firstOnLine === true) { - if ($position === null) { - $position = 'first'; - } - - if ($position !== 'first') { - $error = true; - } - } else { - if ($position === null) { - $position = 'last'; - } - - if ($position !== 'last') { - $error = true; - } - } - } while ($operator !== false); - - if ($error === false) { - return; - } - - switch ($this->allowOnly) { - case 'first': - $error = 'Boolean operators between conditions must be at the beginning of the line'; - break; - case 'last': - $error = 'Boolean operators between conditions must be at the end of the line'; - break; - default: - $error = 'Boolean operators between conditions must be at the beginning or end of the line, but not both'; - } - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'FoundMixed'); - if ($fix === false) { - return; - } - - $phpcsFile->fixer->beginChangeset(); - foreach ($operators as $operator) { - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($operator - 1), $parenOpener, true); - $next = $phpcsFile->findNext(T_WHITESPACE, ($operator + 1), $parenCloser, true); - - if ($position === 'last') { - if ($tokens[$next]['line'] === $tokens[$operator]['line']) { - if ($tokens[$prev]['line'] === $tokens[$operator]['line']) { - // Move the content after the operator to the next line. - if ($tokens[($operator + 1)]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->replaceToken(($operator + 1), ''); - } - - $first = $phpcsFile->findFirstOnLine(T_WHITESPACE, $operator, true); - $padding = str_repeat(' ', ($tokens[$first]['column'] - 1)); - $phpcsFile->fixer->addContent($operator, $phpcsFile->eolChar.$padding); - } else { - // Move the operator to the end of the previous line. - if ($tokens[($operator + 1)]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->replaceToken(($operator + 1), ''); - } - - $phpcsFile->fixer->addContent($prev, ' '.$tokens[$operator]['content']); - $phpcsFile->fixer->replaceToken($operator, ''); - } - }//end if - } else { - if ($tokens[$prev]['line'] === $tokens[$operator]['line']) { - if ($tokens[$next]['line'] === $tokens[$operator]['line']) { - // Move the operator, and the rest of the expression, to the next line. - if ($tokens[($operator - 1)]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->replaceToken(($operator - 1), ''); - } - - $first = $phpcsFile->findFirstOnLine(T_WHITESPACE, $operator, true); - $padding = str_repeat(' ', ($tokens[$first]['column'] - 1)); - $phpcsFile->fixer->addContentBefore($operator, $phpcsFile->eolChar.$padding); - } else { - // Move the operator to the start of the next line. - if ($tokens[($operator - 1)]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->replaceToken(($operator - 1), ''); - } - - $phpcsFile->fixer->addContentBefore($next, $tokens[$operator]['content'].' '); - $phpcsFile->fixer->replaceToken($operator, ''); - } - }//end if - }//end if - }//end foreach - - $phpcsFile->fixer->endChangeset(); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/ControlStructures/ControlStructureSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/ControlStructures/ControlStructureSpacingSniff.php deleted file mode 100644 index d634f79..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/ControlStructures/ControlStructureSpacingSniff.php +++ /dev/null @@ -1,220 +0,0 @@ - - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Sniffs\ControlStructures; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Standards\PSR2\Sniffs\ControlStructures\ControlStructureSpacingSniff as PSR2ControlStructureSpacing; -use PHP_CodeSniffer\Util\Tokens; - -class ControlStructureSpacingSniff implements Sniff -{ - - /** - * The number of spaces code should be indented. - * - * @var integer - */ - public $indent = 4; - - /** - * Instance of the PSR2 ControlStructureSpacingSniff sniff. - * - * @var \PHP_CodeSniffer\Standards\PSR2\Sniffs\ControlStructures\ControlStructureSpacingSniff - */ - private $psr2ControlStructureSpacing; - - - /** - * Constructor. - */ - public function __construct() - { - $this->psr2ControlStructureSpacing = new PSR2ControlStructureSpacing(); - - }//end __construct() - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_IF, - T_WHILE, - T_FOREACH, - T_FOR, - T_SWITCH, - T_ELSEIF, - T_CATCH, - T_MATCH, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['parenthesis_opener']) === false - || isset($tokens[$stackPtr]['parenthesis_closer']) === false - ) { - return; - } - - $parenOpener = $tokens[$stackPtr]['parenthesis_opener']; - $parenCloser = $tokens[$stackPtr]['parenthesis_closer']; - - if ($tokens[$parenOpener]['line'] === $tokens[$parenCloser]['line']) { - // Conditions are all on the same line, so follow PSR2. - $this->psr2ControlStructureSpacing->process($phpcsFile, $stackPtr); - return; - } - - $next = $phpcsFile->findNext(T_WHITESPACE, ($parenOpener + 1), $parenCloser, true); - if ($next === false) { - // No conditions; parse error. - return; - } - - // Check the first expression. - if ($tokens[$next]['line'] !== ($tokens[$parenOpener]['line'] + 1)) { - $error = 'The first expression of a multi-line control structure must be on the line after the opening parenthesis'; - $fix = $phpcsFile->addFixableError($error, $next, 'FirstExpressionLine'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - if ($tokens[$next]['line'] > ($tokens[$parenOpener]['line'] + 1)) { - for ($i = ($parenOpener + 1); $i < $next; $i++) { - if ($tokens[$next]['line'] === $tokens[$i]['line']) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - } - - $phpcsFile->fixer->addNewline($parenOpener); - $phpcsFile->fixer->endChangeset(); - } - } - - // Check the indent of each line. - $first = $phpcsFile->findFirstOnLine(T_WHITESPACE, $stackPtr, true); - $requiredIndent = ($tokens[$first]['column'] + $this->indent - 1); - for ($i = $parenOpener; $i < $parenCloser; $i++) { - if ($tokens[$i]['column'] !== 1 - || $tokens[($i + 1)]['line'] > $tokens[$i]['line'] - || isset(Tokens::$commentTokens[$tokens[$i]['code']]) === true - ) { - continue; - } - - if (($i + 1) === $parenCloser) { - break; - } - - // Leave indentation inside multi-line strings. - if (isset(Tokens::$textStringTokens[$tokens[$i]['code']]) === true - || isset(Tokens::$heredocTokens[$tokens[$i]['code']]) === true - ) { - continue; - } - - if ($tokens[$i]['code'] !== T_WHITESPACE) { - $foundIndent = 0; - } else { - $foundIndent = $tokens[$i]['length']; - } - - if ($foundIndent < $requiredIndent) { - $error = 'Each line in a multi-line control structure must be indented at least once; expected at least %s spaces, but found %s'; - $data = [ - $requiredIndent, - $foundIndent, - ]; - $fix = $phpcsFile->addFixableError($error, $i, 'LineIndent', $data); - if ($fix === true) { - $padding = str_repeat(' ', $requiredIndent); - if ($foundIndent === 0) { - $phpcsFile->fixer->addContentBefore($i, $padding); - } else { - $phpcsFile->fixer->replaceToken($i, $padding); - } - } - } - }//end for - - // Check the closing parenthesis. - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($parenCloser - 1), $parenOpener, true); - if ($tokens[$parenCloser]['line'] !== ($tokens[$prev]['line'] + 1)) { - $error = 'The closing parenthesis of a multi-line control structure must be on the line after the last expression'; - $fix = $phpcsFile->addFixableError($error, $parenCloser, 'CloseParenthesisLine'); - if ($fix === true) { - if ($tokens[$parenCloser]['line'] === $tokens[$prev]['line']) { - $phpcsFile->fixer->addNewlineBefore($parenCloser); - } else { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($prev + 1); $i < $parenCloser; $i++) { - // Maintain existing newline. - if ($tokens[$i]['line'] === $tokens[$prev]['line']) { - continue; - } - - // Maintain existing indent. - if ($tokens[$i]['line'] === $tokens[$parenCloser]['line']) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - }//end if - }//end if - - if ($tokens[$parenCloser]['line'] !== $tokens[$prev]['line']) { - $requiredIndent = ($tokens[$first]['column'] - 1); - $foundIndent = ($tokens[$parenCloser]['column'] - 1); - if ($foundIndent !== $requiredIndent) { - $error = 'The closing parenthesis of a multi-line control structure must be indented to the same level as start of the control structure; expected %s spaces but found %s'; - $data = [ - $requiredIndent, - $foundIndent, - ]; - $fix = $phpcsFile->addFixableError($error, $parenCloser, 'CloseParenthesisIndent', $data); - if ($fix === true) { - $padding = str_repeat(' ', $requiredIndent); - if ($foundIndent === 0) { - $phpcsFile->fixer->addContentBefore($parenCloser, $padding); - } else { - $phpcsFile->fixer->replaceToken(($parenCloser - 1), $padding); - } - } - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Files/DeclareStatementSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Files/DeclareStatementSniff.php deleted file mode 100644 index 84bd559..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Files/DeclareStatementSniff.php +++ /dev/null @@ -1,262 +0,0 @@ - - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class DeclareStatementSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_DECLARE]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - // Allow a byte-order mark. - $tokens = $phpcsFile->getTokens(); - - // There should be no space between declare keyword and opening parenthesis. - $parenthesis = ($stackPtr + 1); - if ($tokens[($stackPtr + 1)]['type'] !== 'T_OPEN_PARENTHESIS') { - $parenthesis = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - $error = 'Expected no space between declare keyword and opening parenthesis in a declare statement'; - - if ($tokens[$parenthesis]['type'] === 'T_OPEN_PARENTHESIS') { - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceFoundAfterDeclare'); - - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ''); - } - } else { - $phpcsFile->addError($error, $parenthesis, 'SpaceFoundAfterDeclare'); - $parenthesis = $phpcsFile->findNext(T_OPEN_PARENTHESIS, ($parenthesis + 1)); - } - } - - // There should be no space between open parenthesis and the directive. - $string = $phpcsFile->findNext(T_WHITESPACE, ($parenthesis + 1), null, true); - if ($parenthesis !== false) { - if ($tokens[($parenthesis + 1)]['type'] !== 'T_STRING') { - $error = 'Expected no space between opening parenthesis and directive in a declare statement'; - - if ($tokens[$string]['type'] === 'T_STRING') { - $fix = $phpcsFile->addFixableError($error, $parenthesis, 'SpaceFoundBeforeDirective'); - - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($parenthesis + 1), ''); - } - } else { - $phpcsFile->addError($error, $string, 'SpaceFoundBeforeDirective'); - $string = $phpcsFile->findNext(T_STRING, ($string + 1)); - } - } - } - - // There should be no space between directive and the equal sign. - $equals = $phpcsFile->findNext(T_WHITESPACE, ($string + 1), null, true); - if ($string !== false) { - // The directive must be in lowercase. - if ($tokens[$string]['content'] !== strtolower($tokens[$string]['content'])) { - $error = 'The directive of a declare statement must be in lowercase'; - $fix = $phpcsFile->addFixableError($error, $string, 'DirectiveNotLowercase'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($string, strtolower($tokens[$string]['content'])); - } - } - - if ($tokens[($string + 1)]['type'] !== 'T_EQUAL') { - $error = 'Expected no space between directive and the equals sign in a declare statement'; - - if ($tokens[$equals]['type'] === 'T_EQUAL') { - $fix = $phpcsFile->addFixableError($error, $equals, 'SpaceFoundAfterDirective'); - - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($string + 1), ''); - } - } else { - $phpcsFile->addError($error, $equals, 'SpaceFoundAfterDirective'); - $equals = $phpcsFile->findNext(T_EQUAL, ($equals + 1)); - } - } - }//end if - - // There should be no space between equal sign and directive value. - $value = $phpcsFile->findNext(T_WHITESPACE, ($equals + 1), null, true); - - if ($value === false) { - // Live coding / parse error. - return; - } - - if ($equals !== false) { - if ($tokens[($equals + 1)]['type'] !== 'T_LNUMBER') { - $error = 'Expected no space between equal sign and the directive value in a declare statement'; - - if ($tokens[$value]['type'] === 'T_LNUMBER') { - $fix = $phpcsFile->addFixableError($error, $value, 'SpaceFoundBeforeDirectiveValue'); - - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($equals + 1), ''); - } - } else { - $phpcsFile->addError($error, $value, 'SpaceFoundBeforeDirectiveValue'); - $value = $phpcsFile->findNext(T_LNUMBER, ($value + 1)); - } - } - } - - $parenthesis = $phpcsFile->findNext(T_WHITESPACE, ($value + 1), null, true); - if ($value !== false) { - if ($tokens[($value + 1)]['type'] !== 'T_CLOSE_PARENTHESIS') { - $error = 'Expected no space between the directive value and closing parenthesis in a declare statement'; - - if ($tokens[$parenthesis]['type'] === 'T_CLOSE_PARENTHESIS') { - $fix = $phpcsFile->addFixableError($error, $parenthesis, 'SpaceFoundAfterDirectiveValue'); - - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($value + 1), ''); - } - } else { - $phpcsFile->addError($error, $parenthesis, 'SpaceFoundAfterDirectiveValue'); - $parenthesis = $phpcsFile->findNext(T_CLOSE_PARENTHESIS, ($parenthesis + 1)); - } - } - } - - // Check for semicolon. - $curlyBracket = false; - if ($tokens[($parenthesis + 1)]['type'] !== 'T_SEMICOLON') { - $token = $phpcsFile->findNext(T_WHITESPACE, ($parenthesis + 1), null, true); - - if ($tokens[$token]['type'] === 'T_OPEN_CURLY_BRACKET') { - // Block declaration. - $curlyBracket = $token; - } else if ($tokens[$token]['type'] === 'T_SEMICOLON') { - $error = 'Expected no space between the closing parenthesis and the semicolon in a declare statement'; - $fix = $phpcsFile->addFixableError($error, $parenthesis, 'SpaceFoundBeforeSemicolon'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($parenthesis + 1), ''); - } - } else if ($tokens[$token]['type'] === 'T_CLOSE_TAG') { - if ($tokens[($parenthesis)]['line'] !== $tokens[$token]['line']) { - // Close tag must be on the same line.. - $error = 'The close tag must be on the same line as the declare statement'; - $fix = $phpcsFile->addFixableError($error, $parenthesis, 'CloseTagOnNewLine'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($parenthesis + 1), ' '); - } - } - } else { - $error = 'Expected no space between the closing parenthesis and the semicolon in a declare statement'; - $phpcsFile->addError($error, $parenthesis, 'SpaceFoundBeforeSemicolon'); - - // See if there is a semicolon or curly bracket after this token. - $token = $phpcsFile->findNext([T_WHITESPACE, T_COMMENT], ($token + 1), null, true); - if ($tokens[$token]['type'] === 'T_OPEN_CURLY_BRACKET') { - $curlyBracket = $token; - } - }//end if - }//end if - - if ($curlyBracket !== false) { - $prevToken = $phpcsFile->findPrevious(T_WHITESPACE, ($curlyBracket - 1), null, true); - $error = 'Expected one space between closing parenthesis and opening curly bracket in a declare statement'; - - // The opening curly bracket must on the same line with a single space between closing bracket. - if ($tokens[$prevToken]['type'] !== 'T_CLOSE_PARENTHESIS') { - $phpcsFile->addError($error, $curlyBracket, 'ExtraSpaceFoundAfterBracket'); - } else if ($phpcsFile->getTokensAsString(($prevToken + 1), ($curlyBracket - $prevToken - 1)) !== ' ') { - $fix = $phpcsFile->addFixableError($error, $curlyBracket, 'ExtraSpaceFoundAfterBracket'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken(($prevToken + 1), ' '); - $nextToken = ($prevToken + 2); - while ($nextToken !== $curlyBracket) { - $phpcsFile->fixer->replaceToken($nextToken, ''); - $nextToken++; - } - - $phpcsFile->fixer->endChangeset(); - } - }//end if - - $closeCurlyBracket = $tokens[$curlyBracket]['bracket_closer']; - - $prevToken = $phpcsFile->findPrevious(T_WHITESPACE, ($closeCurlyBracket - 1), null, true); - $nextToken = $phpcsFile->findNext([T_WHITESPACE, T_COMMENT], ($closeCurlyBracket + 1), null, true); - $line = $tokens[$closeCurlyBracket]['line']; - - // The closing curly bracket must be on a new line. - if ($tokens[$prevToken]['line'] === $line || $tokens[$nextToken]['line'] === $line) { - if ($tokens[$prevToken]['line'] === $line) { - $error = 'The closing curly bracket of a declare statement must be on a new line'; - $fix = $phpcsFile->addFixableError($error, $prevToken, 'CurlyBracketNotOnNewLine'); - if ($fix === true) { - $phpcsFile->fixer->addNewline($prevToken); - } - } - }//end if - - // Closing curly bracket must align with the declare keyword. - if ($tokens[$stackPtr]['column'] !== $tokens[$closeCurlyBracket]['column']) { - $error = 'The closing curly bracket of a declare statements must be aligned with the declare keyword'; - - $fix = $phpcsFile->addFixableError($error, $closeCurlyBracket, 'CloseBracketNotAligned'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($closeCurlyBracket - 1), str_repeat(' ', ($tokens[$stackPtr]['column'] - 1))); - } - } - - // The open curly bracket must be the last code on the line. - $token = $phpcsFile->findNext(Tokens::$emptyTokens, ($curlyBracket + 1), null, true); - if ($tokens[$curlyBracket]['line'] === $tokens[$token]['line']) { - $error = 'The open curly bracket of a declare statement must be the last code on the line'; - $fix = $phpcsFile->addFixableError($error, $token, 'CodeFoundAfterCurlyBracket'); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $prevToken = $phpcsFile->findPrevious(T_WHITESPACE, ($token - 1), null, true); - - for ($i = ($prevToken + 1); $i < $token; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->addNewlineBefore($token); - - $phpcsFile->fixer->endChangeset(); - } - } - }//end if - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Files/FileHeaderSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Files/FileHeaderSniff.php deleted file mode 100644 index b5b79f8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Files/FileHeaderSniff.php +++ /dev/null @@ -1,429 +0,0 @@ - - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class FileHeaderSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes this sniff when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current - * token in the stack. - * - * @return int - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $possibleHeaders = []; - - $searchFor = Tokens::$ooScopeTokens; - $searchFor[T_OPEN_TAG] = T_OPEN_TAG; - - $openTag = $stackPtr; - do { - $headerLines = $this->getHeaderLines($phpcsFile, $openTag); - if (empty($headerLines) === true && $openTag === $stackPtr) { - // No content in the file. - return $phpcsFile->numTokens; - } - - $possibleHeaders[$openTag] = $headerLines; - if (count($headerLines) > 1) { - break; - } - - $next = $phpcsFile->findNext($searchFor, ($openTag + 1)); - if (isset(Tokens::$ooScopeTokens[$tokens[$next]['code']]) === true) { - // Once we find an OO token, the file content has - // definitely started. - break; - } - - $openTag = $next; - } while ($openTag !== false); - - if ($openTag === false) { - // We never found a proper file header. - // If the file has multiple PHP open tags, we know - // that it must be a mix of PHP and HTML (or similar) - // so the header rules do not apply. - if (count($possibleHeaders) > 1) { - return $phpcsFile->numTokens; - } - - // There is only one possible header. - // If it is the first content in the file, it technically - // serves as the file header, and the open tag needs to - // have a newline after it. Otherwise, ignore it. - if ($stackPtr > 0) { - return $phpcsFile->numTokens; - } - - $openTag = $stackPtr; - } else if (count($possibleHeaders) > 1) { - // There are other PHP blocks before the file header. - $error = 'The file header must be the first content in the file'; - $phpcsFile->addError($error, $openTag, 'HeaderPosition'); - } else { - // The first possible header was the file header block, - // so make sure it is the first content in the file. - if ($openTag !== 0) { - // Allow for hashbang lines. - $hashbang = false; - if ($tokens[($openTag - 1)]['code'] === T_INLINE_HTML) { - $content = trim($tokens[($openTag - 1)]['content']); - if (substr($content, 0, 2) === '#!') { - $hashbang = true; - } - } - - if ($hashbang === false) { - $error = 'The file header must be the first content in the file'; - $phpcsFile->addError($error, $openTag, 'HeaderPosition'); - } - } - }//end if - - $this->processHeaderLines($phpcsFile, $possibleHeaders[$openTag]); - - return $phpcsFile->numTokens; - - }//end process() - - - /** - * Gather information about the statements inside a possible file header. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current - * token in the stack. - * - * @return array - */ - public function getHeaderLines(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $next = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($next === false) { - return []; - } - - $headerLines = []; - $headerLines[] = [ - 'type' => 'tag', - 'start' => $stackPtr, - 'end' => $stackPtr, - ]; - - $foundDocblock = false; - - $commentOpeners = Tokens::$scopeOpeners; - unset($commentOpeners[T_NAMESPACE]); - unset($commentOpeners[T_DECLARE]); - unset($commentOpeners[T_USE]); - unset($commentOpeners[T_IF]); - unset($commentOpeners[T_WHILE]); - unset($commentOpeners[T_FOR]); - unset($commentOpeners[T_FOREACH]); - unset($commentOpeners[T_DO]); - unset($commentOpeners[T_TRY]); - - do { - switch ($tokens[$next]['code']) { - case T_DOC_COMMENT_OPEN_TAG: - if ($foundDocblock === true) { - // Found a second docblock, so start of code. - break(2); - } - - // Make sure this is not a code-level docblock. - $end = $tokens[$next]['comment_closer']; - for ($docToken = ($end + 1); $docToken < $phpcsFile->numTokens; $docToken++) { - if (isset(Tokens::$emptyTokens[$tokens[$docToken]['code']]) === true) { - continue; - } - - if ($tokens[$docToken]['code'] === T_ATTRIBUTE - && isset($tokens[$docToken]['attribute_closer']) === true - ) { - $docToken = $tokens[$docToken]['attribute_closer']; - continue; - } - - break; - } - - if ($docToken === $phpcsFile->numTokens) { - $docToken--; - } - - if (isset($commentOpeners[$tokens[$docToken]['code']]) === false - && isset(Tokens::$methodPrefixes[$tokens[$docToken]['code']]) === false - && $tokens[$docToken]['code'] !== T_READONLY - ) { - // Check for an @var annotation. - $annotation = false; - for ($i = $next; $i < $end; $i++) { - if ($tokens[$i]['code'] === T_DOC_COMMENT_TAG - && strtolower($tokens[$i]['content']) === '@var' - ) { - $annotation = true; - break; - } - } - - if ($annotation === false) { - $foundDocblock = true; - $headerLines[] = [ - 'type' => 'docblock', - 'start' => $next, - 'end' => $end, - ]; - } - }//end if - - $next = $end; - break; - case T_DECLARE: - case T_NAMESPACE: - if (isset($tokens[$next]['scope_opener']) === true) { - // If this statement is using bracketed syntax, it doesn't - // apply to the entire files and so is not part of header. - // The header has now ended and the main code block begins. - break(2); - } - - $end = $phpcsFile->findEndOfStatement($next); - - $headerLines[] = [ - 'type' => substr(strtolower($tokens[$next]['type']), 2), - 'start' => $next, - 'end' => $end, - ]; - - $next = $end; - break; - case T_USE: - $type = 'use'; - $useType = $phpcsFile->findNext(Tokens::$emptyTokens, ($next + 1), null, true); - if ($useType !== false && $tokens[$useType]['code'] === T_STRING) { - $content = strtolower($tokens[$useType]['content']); - if ($content === 'function' || $content === 'const') { - $type .= ' '.$content; - } - } - - $end = $phpcsFile->findEndOfStatement($next); - - $headerLines[] = [ - 'type' => $type, - 'start' => $next, - 'end' => $end, - ]; - - $next = $end; - break; - default: - // Skip comments as PSR-12 doesn't say if these are allowed or not. - if (isset(Tokens::$commentTokens[$tokens[$next]['code']]) === true) { - $next = $phpcsFile->findNext(Tokens::$commentTokens, ($next + 1), null, true); - if ($next === false) { - // We reached the end of the file. - break(2); - } - - $next--; - break; - } - - // We found the start of the main code block. - break(2); - }//end switch - - $next = $phpcsFile->findNext(T_WHITESPACE, ($next + 1), null, true); - } while ($next !== false); - - return $headerLines; - - }//end getHeaderLines() - - - /** - * Check the spacing and grouping of the statements inside each header block. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param array $headerLines Header information, as sourced - * from getHeaderLines(). - * - * @return void - */ - public function processHeaderLines(File $phpcsFile, $headerLines) - { - $tokens = $phpcsFile->getTokens(); - - $found = []; - - foreach ($headerLines as $i => $line) { - if (isset($headerLines[($i + 1)]) === false - || $headerLines[($i + 1)]['type'] !== $line['type'] - ) { - // We're at the end of the current header block. - // Make sure there is a single blank line after - // this block. - $next = $phpcsFile->findNext(T_WHITESPACE, ($line['end'] + 1), null, true); - if ($next !== false && $tokens[$next]['line'] !== ($tokens[$line['end']]['line'] + 2)) { - $error = 'Header blocks must be separated by a single blank line'; - $fix = $phpcsFile->addFixableError($error, $line['end'], 'SpacingAfterBlock'); - if ($fix === true) { - if ($tokens[$next]['line'] === $tokens[$line['end']]['line']) { - $phpcsFile->fixer->addContentBefore($next, $phpcsFile->eolChar.$phpcsFile->eolChar); - } else if ($tokens[$next]['line'] === ($tokens[$line['end']]['line'] + 1)) { - $phpcsFile->fixer->addNewline($line['end']); - } else { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($line['end'] + 1); $i < $next; $i++) { - if ($tokens[$i]['line'] === ($tokens[$line['end']]['line'] + 2)) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - }//end if - }//end if - - // Make sure we haven't seen this next block before. - if (isset($headerLines[($i + 1)]) === true - && isset($found[$headerLines[($i + 1)]['type']]) === true - ) { - $error = 'Similar statements must be grouped together inside header blocks; '; - $error .= 'the first "%s" statement was found on line %s'; - $data = [ - $headerLines[($i + 1)]['type'], - $tokens[$found[$headerLines[($i + 1)]['type']]['start']]['line'], - ]; - $phpcsFile->addError($error, $headerLines[($i + 1)]['start'], 'IncorrectGrouping', $data); - } - } else if ($headerLines[($i + 1)]['type'] === $line['type']) { - // Still in the same block, so make sure there is no - // blank line after this statement. - $next = $phpcsFile->findNext(T_WHITESPACE, ($line['end'] + 1), null, true); - if ($tokens[$next]['line'] > ($tokens[$line['end']]['line'] + 1)) { - $error = 'Header blocks must not contain blank lines'; - $fix = $phpcsFile->addFixableError($error, $line['end'], 'SpacingInsideBlock'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($line['end'] + 1); $i < $next; $i++) { - if ($tokens[$i]['line'] === $tokens[$line['end']]['line']) { - continue; - } - - if ($tokens[$i]['line'] === $tokens[$next]['line']) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - }//end if - - if (isset($found[$line['type']]) === false) { - $found[$line['type']] = $line; - } - }//end foreach - - /* - Next, check that the order of the header blocks - is correct: - Opening php tag. - File-level docblock. - One or more declare statements. - The namespace declaration of the file. - One or more class-based use import statements. - One or more function-based use import statements. - One or more constant-based use import statements. - */ - - $blockOrder = [ - 'tag' => 'opening PHP tag', - 'docblock' => 'file-level docblock', - 'declare' => 'declare statements', - 'namespace' => 'namespace declaration', - 'use' => 'class-based use imports', - 'use function' => 'function-based use imports', - 'use const' => 'constant-based use imports', - ]; - - foreach (array_keys($found) as $type) { - if ($type === 'tag') { - // The opening tag is always in the correct spot. - continue; - } - - do { - $orderedType = next($blockOrder); - } while ($orderedType !== false && key($blockOrder) !== $type); - - if ($orderedType === false) { - // We didn't find the block type in the rest of the - // ordered array, so it is out of place. - // Error and reset the array to the correct position - // so we can check the next block. - reset($blockOrder); - $prevValidType = 'tag'; - do { - $orderedType = next($blockOrder); - if (isset($found[key($blockOrder)]) === true - && key($blockOrder) !== $type - ) { - $prevValidType = key($blockOrder); - } - } while ($orderedType !== false && key($blockOrder) !== $type); - - $error = 'The %s must follow the %s in the file header'; - $data = [ - $blockOrder[$type], - $blockOrder[$prevValidType], - ]; - $phpcsFile->addError($error, $found[$type]['start'], 'IncorrectOrder', $data); - }//end if - }//end foreach - - }//end processHeaderLines() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Files/ImportStatementSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Files/ImportStatementSniff.php deleted file mode 100644 index 0408467..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Files/ImportStatementSniff.php +++ /dev/null @@ -1,77 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ImportStatementSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_USE]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Make sure this is not a closure USE group. - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($tokens[$next]['code'] === T_OPEN_PARENTHESIS) { - return; - } - - if ($phpcsFile->hasCondition($stackPtr, Tokens::$ooScopeTokens) === true) { - // This rule only applies to import statements. - return; - } - - if ($tokens[$next]['code'] === T_STRING - && (strtolower($tokens[$next]['content']) === 'function' - || strtolower($tokens[$next]['content']) === 'const') - ) { - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($next + 1), null, true); - } - - if ($tokens[$next]['code'] !== T_NS_SEPARATOR) { - return; - } - - $error = 'Import statements must not begin with a leading backslash'; - $fix = $phpcsFile->addFixableError($error, $next, 'LeadingSlash'); - - if ($fix === true) { - $phpcsFile->fixer->replaceToken($next, ''); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Files/OpenTagSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Files/OpenTagSniff.php deleted file mode 100644 index c2dda65..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Files/OpenTagSniff.php +++ /dev/null @@ -1,76 +0,0 @@ - - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class OpenTagSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes this sniff when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current - * token in the stack. - * - * @return int - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($stackPtr !== 0) { - // This rule only applies if the open tag is on the first line of the file. - return $phpcsFile->numTokens; - } - - $tokens = $phpcsFile->getTokens(); - $next = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($next === false) { - // Empty file. - return $phpcsFile->numTokens; - } - - if ($tokens[$next]['line'] !== $tokens[$stackPtr]['line']) { - // Tag is on a line by itself. - return $phpcsFile->numTokens; - } - - $next = $phpcsFile->findNext(T_INLINE_HTML, 0); - if ($next !== false) { - // This rule only applies to PHP-only files. - return $phpcsFile->numTokens; - } - - $error = 'Opening PHP tag must be on a line by itself'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NotAlone'); - if ($fix === true) { - $phpcsFile->fixer->addNewline($stackPtr); - } - - return $phpcsFile->numTokens; - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Functions/NullableTypeDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Functions/NullableTypeDeclarationSniff.php deleted file mode 100644 index 0a81e08..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Functions/NullableTypeDeclarationSniff.php +++ /dev/null @@ -1,94 +0,0 @@ - - * @copyright 2006-2018 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Sniffs\Functions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class NullableTypeDeclarationSniff implements Sniff -{ - - /** - * An array of valid tokens after `T_NULLABLE` occurrences. - * - * @var array - */ - private $validTokens = [ - T_STRING => true, - T_NS_SEPARATOR => true, - T_CALLABLE => true, - T_SELF => true, - T_PARENT => true, - T_STATIC => true, - T_NULL => true, - T_FALSE => true, - T_TRUE => true, - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_NULLABLE]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $nextNonEmptyPtr = $phpcsFile->findNext([T_WHITESPACE], ($stackPtr + 1), null, true); - if ($nextNonEmptyPtr === false) { - // Parse error or live coding. - return; - } - - $tokens = $phpcsFile->getTokens(); - $nextNonEmptyCode = $tokens[$nextNonEmptyPtr]['code']; - $validTokenFound = isset($this->validTokens[$nextNonEmptyCode]); - - if ($validTokenFound === true && $nextNonEmptyPtr === ($stackPtr + 1)) { - // Valid structure. - return; - } - - $error = 'There must not be a space between the question mark and the type in nullable type declarations'; - - if ($validTokenFound === true) { - // No other tokens then whitespace tokens found; fixable. - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'WhitespaceFound'); - if ($fix === true) { - for ($i = ($stackPtr + 1); $i < $nextNonEmptyPtr; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - } - - return; - } - - // Non-whitespace tokens found; trigger error but don't fix. - $phpcsFile->addError($error, $stackPtr, 'UnexpectedCharactersFound'); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Functions/ReturnTypeDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Functions/ReturnTypeDeclarationSniff.php deleted file mode 100644 index 95fd4bd..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Functions/ReturnTypeDeclarationSniff.php +++ /dev/null @@ -1,108 +0,0 @@ - - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Sniffs\Functions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ReturnTypeDeclarationSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_FUNCTION, - T_CLOSURE, - T_FN, - ]; - - }//end register() - - - /** - * Processes this test when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['parenthesis_opener']) === false - || isset($tokens[$stackPtr]['parenthesis_closer']) === false - ) { - return; - } - - $methodProperties = $phpcsFile->getMethodProperties($stackPtr); - if ($methodProperties['return_type'] === '') { - return; - } - - $returnType = $methodProperties['return_type_token']; - if ($methodProperties['nullable_return_type'] === true) { - $returnType = $phpcsFile->findPrevious(T_NULLABLE, ($returnType - 1)); - } - - if ($tokens[($returnType - 1)]['code'] !== T_WHITESPACE - || $tokens[($returnType - 1)]['content'] !== ' ' - || $tokens[($returnType - 2)]['code'] !== T_COLON - ) { - $error = 'There must be a single space between the colon and type in a return type declaration'; - if ($tokens[($returnType - 1)]['code'] === T_WHITESPACE - && $tokens[($returnType - 2)]['code'] === T_COLON - ) { - $fix = $phpcsFile->addFixableError($error, $returnType, 'SpaceBeforeReturnType'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($returnType - 1), ' '); - } - } else if ($tokens[($returnType - 1)]['code'] === T_COLON) { - $fix = $phpcsFile->addFixableError($error, $returnType, 'SpaceBeforeReturnType'); - if ($fix === true) { - $phpcsFile->fixer->addContentBefore($returnType, ' '); - } - } else { - $phpcsFile->addError($error, $returnType, 'SpaceBeforeReturnType'); - } - } - - $colon = $phpcsFile->findPrevious(T_COLON, $returnType); - if ($tokens[($colon - 1)]['code'] !== T_CLOSE_PARENTHESIS) { - $error = 'There must not be a space before the colon in a return type declaration'; - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($colon - 1), null, true); - if ($tokens[$prev]['code'] === T_CLOSE_PARENTHESIS) { - $fix = $phpcsFile->addFixableError($error, $colon, 'SpaceBeforeColon'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($x = ($prev + 1); $x < $colon; $x++) { - $phpcsFile->fixer->replaceToken($x, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } else { - $phpcsFile->addError($error, $colon, 'SpaceBeforeColon'); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Keywords/ShortFormTypeKeywordsSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Keywords/ShortFormTypeKeywordsSniff.php deleted file mode 100644 index e7c4242..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Keywords/ShortFormTypeKeywordsSniff.php +++ /dev/null @@ -1,75 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Sniffs\Keywords; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ShortFormTypeKeywordsSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_BOOL_CAST, - T_INT_CAST, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $typecast = str_replace(' ', '', $tokens[$stackPtr]['content']); - $typecast = str_replace("\t", '', $typecast); - $typecast = trim($typecast, '()'); - $typecastLc = strtolower($typecast); - - if (($tokens[$stackPtr]['code'] === T_BOOL_CAST - && $typecastLc === 'bool') - || ($tokens[$stackPtr]['code'] === T_INT_CAST - && $typecastLc === 'int') - ) { - return; - } - - $error = 'Short form type keywords must be used. Found: %s'; - $data = [$tokens[$stackPtr]['content']]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'LongFound', $data); - if ($fix === true) { - if ($tokens[$stackPtr]['code'] === T_BOOL_CAST) { - $replacement = str_replace($typecast, 'bool', $tokens[$stackPtr]['content']); - } else { - $replacement = str_replace($typecast, 'int', $tokens[$stackPtr]['content']); - } - - $phpcsFile->fixer->replaceToken($stackPtr, $replacement); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Namespaces/CompoundNamespaceDepthSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Namespaces/CompoundNamespaceDepthSniff.php deleted file mode 100644 index 23fb58d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Namespaces/CompoundNamespaceDepthSniff.php +++ /dev/null @@ -1,80 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Sniffs\Namespaces; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class CompoundNamespaceDepthSniff implements Sniff -{ - - /** - * The max depth for compound namespaces. - * - * @var integer - */ - public $maxDepth = 2; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_OPEN_USE_GROUP]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $this->maxDepth = (int) $this->maxDepth; - - $tokens = $phpcsFile->getTokens(); - - $end = $phpcsFile->findNext(T_CLOSE_USE_GROUP, ($stackPtr + 1)); - if ($end === false) { - return; - } - - $depth = 1; - for ($i = ($stackPtr + 1); $i <= $end; $i++) { - if ($tokens[$i]['code'] === T_NS_SEPARATOR) { - $depth++; - continue; - } - - if ($i === $end || $tokens[$i]['code'] === T_COMMA) { - // End of a namespace. - if ($depth > $this->maxDepth) { - $error = 'Compound namespaces cannot have a depth more than %s'; - $data = [$this->maxDepth]; - $phpcsFile->addError($error, $i, 'TooDeep', $data); - } - - $depth = 1; - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Operators/OperatorSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Operators/OperatorSpacingSniff.php deleted file mode 100644 index ccf7cbf..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Operators/OperatorSpacingSniff.php +++ /dev/null @@ -1,128 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Sniffs\Operators; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace\OperatorSpacingSniff as SquizOperatorSpacingSniff; -use PHP_CodeSniffer\Util\Tokens; - -class OperatorSpacingSniff extends SquizOperatorSpacingSniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - parent::register(); - - $targets = Tokens::$comparisonTokens; - $targets += Tokens::$operators; - $targets += Tokens::$assignmentTokens; - $targets += Tokens::$booleanOperators; - $targets[] = T_INLINE_THEN; - $targets[] = T_INLINE_ELSE; - $targets[] = T_STRING_CONCAT; - $targets[] = T_INSTANCEOF; - - // Also register the contexts we want to specifically skip over. - $targets[] = T_DECLARE; - - return $targets; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being checked. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void|int Optionally returns a stack pointer. The sniff will not be - * called again on the current file until the returned stack - * pointer is reached. Return `$phpcsFile->numTokens` to skip - * the rest of the file. - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Skip over declare statements as those should be handled by different sniffs. - if ($tokens[$stackPtr]['code'] === T_DECLARE) { - if (isset($tokens[$stackPtr]['parenthesis_closer']) === false) { - // Parse error / live coding. - return $phpcsFile->numTokens; - } - - return $tokens[$stackPtr]['parenthesis_closer']; - } - - if ($this->isOperator($phpcsFile, $stackPtr) === false) { - return; - } - - $operator = $tokens[$stackPtr]['content']; - - $checkBefore = true; - $checkAfter = true; - - // Skip short ternary. - if ($tokens[($stackPtr)]['code'] === T_INLINE_ELSE - && $tokens[($stackPtr - 1)]['code'] === T_INLINE_THEN - ) { - $checkBefore = false; - } - - // Skip operator with comment on previous line. - if ($tokens[($stackPtr - 1)]['code'] === T_COMMENT - && $tokens[($stackPtr - 1)]['line'] < $tokens[$stackPtr]['line'] - ) { - $checkBefore = false; - } - - if (isset($tokens[($stackPtr + 1)]) === true) { - // Skip short ternary. - if ($tokens[$stackPtr]['code'] === T_INLINE_THEN - && $tokens[($stackPtr + 1)]['code'] === T_INLINE_ELSE - ) { - $checkAfter = false; - } - } else { - // Skip partial files. - $checkAfter = false; - } - - if ($checkBefore === true && $tokens[($stackPtr - 1)]['code'] !== T_WHITESPACE) { - $error = 'Expected at least 1 space before "%s"; 0 found'; - $data = [$operator]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoSpaceBefore', $data); - if ($fix === true) { - $phpcsFile->fixer->addContentBefore($stackPtr, ' '); - } - } - - if ($checkAfter === true && $tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) { - $error = 'Expected at least 1 space after "%s"; 0 found'; - $data = [$operator]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoSpaceAfter', $data); - if ($fix === true) { - $phpcsFile->fixer->addContent($stackPtr, ' '); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Properties/ConstantVisibilitySniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Properties/ConstantVisibilitySniff.php deleted file mode 100644 index 75c543d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Properties/ConstantVisibilitySniff.php +++ /dev/null @@ -1,70 +0,0 @@ - - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Sniffs\Properties; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ConstantVisibilitySniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_CONST]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Make sure this is a class constant. - if ($phpcsFile->hasCondition($stackPtr, Tokens::$ooScopeTokens) === false) { - return; - } - - $ignore = Tokens::$emptyTokens; - $ignore[] = T_FINAL; - - $validVisibility = [ - T_PRIVATE => T_PRIVATE, - T_PUBLIC => T_PUBLIC, - T_PROTECTED => T_PROTECTED, - ]; - - $prev = $phpcsFile->findPrevious($ignore, ($stackPtr - 1), null, true); - if (isset($validVisibility[$tokens[$prev]['code']]) === true) { - return; - } - - $error = 'Visibility must be declared on all constants if your project supports PHP 7.1 or later'; - $phpcsFile->addWarning($error, $stackPtr, 'NotFound'); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Traits/UseDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Traits/UseDeclarationSniff.php deleted file mode 100644 index ce22f85..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Sniffs/Traits/UseDeclarationSniff.php +++ /dev/null @@ -1,700 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Sniffs\Traits; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class UseDeclarationSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_USE]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void|int - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Needs to be a use statement directly inside a class. - $conditions = $tokens[$stackPtr]['conditions']; - end($conditions); - if (isset(Tokens::$ooScopeTokens[current($conditions)]) === false) { - return; - } - - $ooToken = key($conditions); - $opener = $tokens[$ooToken]['scope_opener']; - - // Figure out where all the use statements are. - $useTokens = [$stackPtr]; - for ($i = ($stackPtr + 1); $i < $tokens[$ooToken]['scope_closer']; $i++) { - if ($tokens[$i]['code'] === T_USE) { - $useTokens[] = $i; - } - - if (isset($tokens[$i]['scope_closer']) === true) { - $i = $tokens[$i]['scope_closer']; - } - } - - $numUseTokens = count($useTokens); - foreach ($useTokens as $usePos => $useToken) { - if ($usePos === 0) { - /* - This is the first use statement. - */ - - // The first non-comment line must be the use line. - $lastValidContent = $useToken; - for ($i = ($useToken - 1); $i > $opener; $i--) { - if ($tokens[$i]['code'] === T_WHITESPACE - && ($tokens[($i - 1)]['line'] === $tokens[$i]['line'] - || $tokens[($i + 1)]['line'] === $tokens[$i]['line']) - ) { - continue; - } - - if (isset(Tokens::$commentTokens[$tokens[$i]['code']]) === true) { - if ($tokens[$i]['code'] === T_DOC_COMMENT_CLOSE_TAG) { - // Skip past the comment. - $i = $tokens[$i]['comment_opener']; - } - - $lastValidContent = $i; - - continue; - } - - break; - }//end for - - if ($tokens[$lastValidContent]['line'] !== ($tokens[$opener]['line'] + 1)) { - $error = 'The first trait import statement must be declared on the first non-comment line after the %s opening brace'; - $data = [strtolower($tokens[$ooToken]['content'])]; - - // Figure out if we can fix this error. - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($useToken - 1), ($opener - 1), true); - if ($tokens[$prev]['line'] === $tokens[$opener]['line']) { - $fix = $phpcsFile->addFixableError($error, $useToken, 'UseAfterBrace', $data); - if ($fix === true) { - // We know that the USE statements is the first non-comment content - // in the class, so we just need to remove blank lines. - $phpcsFile->fixer->beginChangeset(); - for ($i = ($useToken - 1); $i > $opener; $i--) { - if ($tokens[$i]['line'] === $tokens[$opener]['line']) { - break; - } - - if ($tokens[$i]['line'] === $tokens[$useToken]['line']) { - continue; - } - - if ($tokens[$i]['code'] === T_WHITESPACE - && $tokens[($i - 1)]['line'] !== $tokens[$i]['line'] - && $tokens[($i + 1)]['line'] !== $tokens[$i]['line'] - ) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - if (isset(Tokens::$commentTokens[$tokens[$i]['code']]) === true) { - if ($tokens[$i]['code'] === T_DOC_COMMENT_CLOSE_TAG) { - // Skip past the comment. - $i = $tokens[$i]['comment_opener']; - } - - $lastValidContent = $i; - } - }//end for - - $phpcsFile->fixer->endChangeset(); - }//end if - } else { - $phpcsFile->addError($error, $useToken, 'UseAfterBrace', $data); - }//end if - }//end if - } else { - // Make sure this use statement is not on the same line as the previous one. - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($useToken - 1), null, true); - if ($prev !== false && $tokens[$prev]['line'] === $tokens[$useToken]['line']) { - $error = 'Each imported trait must be on its own line'; - $prevNonWs = $phpcsFile->findPrevious(T_WHITESPACE, ($useToken - 1), null, true); - if ($prevNonWs !== $prev) { - $phpcsFile->addError($error, $useToken, 'SpacingBeforeImport'); - } else { - $fix = $phpcsFile->addFixableError($error, $useToken, 'SpacingBeforeImport'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($x = ($useToken - 1); $x > $prev; $x--) { - if ($tokens[$x]['line'] === $tokens[$useToken]['line'] - ) { - // Preserve indent. - continue; - } - - $phpcsFile->fixer->replaceToken($x, ''); - } - - $phpcsFile->fixer->addNewline($prev); - if ($tokens[$prev]['line'] === $tokens[$useToken]['line']) { - if ($tokens[($useToken - 1)]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->replaceToken(($useToken - 1), ''); - } - - $padding = str_repeat(' ', ($tokens[$useTokens[0]]['column'] - 1)); - $phpcsFile->fixer->addContent($prev, $padding); - } - - $phpcsFile->fixer->endChangeset(); - }//end if - }//end if - }//end if - }//end if - - $error = 'Expected 1 space after USE in trait import statement; %s found'; - if ($tokens[($useToken + 1)]['code'] !== T_WHITESPACE) { - $data = ['0']; - $fix = $phpcsFile->addFixableError($error, $useToken, 'SpaceAfterUse', $data); - if ($fix === true) { - $phpcsFile->fixer->addContent($useToken, ' '); - } - } else if ($tokens[($useToken + 1)]['content'] !== ' ') { - $next = $phpcsFile->findNext(T_WHITESPACE, ($useToken + 1), null, true); - if ($tokens[$next]['line'] !== $tokens[$useToken]['line']) { - $found = 'newline'; - } else { - $found = $tokens[($useToken + 1)]['length']; - } - - $data = [$found]; - $fix = $phpcsFile->addFixableError($error, $useToken, 'SpaceAfterUse', $data); - if ($fix === true) { - if ($found === 'newline') { - $phpcsFile->fixer->beginChangeset(); - for ($x = ($useToken + 1); $x < $next; $x++) { - $phpcsFile->fixer->replaceToken($x, ''); - } - - $phpcsFile->fixer->addContent($useToken, ' '); - $phpcsFile->fixer->endChangeset(); - } else { - $phpcsFile->fixer->replaceToken(($useToken + 1), ' '); - } - } - }//end if - - // Check the formatting of the statement. - if (isset($tokens[$useToken]['scope_opener']) === true) { - $this->processUseGroup($phpcsFile, $useToken); - $end = $tokens[$useToken]['scope_closer']; - } else { - $this->processUseStatement($phpcsFile, $useToken); - $end = $phpcsFile->findNext(T_SEMICOLON, ($useToken + 1)); - if ($end === false) { - // Syntax error. - return; - } - } - - if ($usePos === ($numUseTokens - 1)) { - /* - This is the last use statement. - */ - - $next = $phpcsFile->findNext(T_WHITESPACE, ($end + 1), null, true); - if ($next === $tokens[$ooToken]['scope_closer']) { - // Last content in the class. - $closer = $tokens[$ooToken]['scope_closer']; - if ($tokens[$closer]['line'] > ($tokens[$end]['line'] + 1)) { - $error = 'There must be no blank line after the last trait import statement at the bottom of a %s'; - $data = [strtolower($tokens[$ooToken]['content'])]; - $fix = $phpcsFile->addFixableError($error, $end, 'BlankLineAfterLastUse', $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($end + 1); $i < $closer; $i++) { - if ($tokens[$i]['line'] === $tokens[$end]['line']) { - continue; - } - - if ($tokens[$i]['line'] === $tokens[$closer]['line']) { - // Don't remove indents. - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - }//end if - } else if ($tokens[$next]['code'] !== T_USE) { - // Comments are allowed on the same line as the use statement, so make sure - // we don't error for those. - for ($next = ($end + 1); $next < $tokens[$ooToken]['scope_closer']; $next++) { - if ($tokens[$next]['code'] === T_WHITESPACE) { - continue; - } - - if (isset(Tokens::$commentTokens[$tokens[$next]['code']]) === true - && $tokens[$next]['line'] === $tokens[$end]['line'] - ) { - continue; - } - - break; - } - - if ($tokens[$next]['line'] <= ($tokens[$end]['line'] + 1)) { - $error = 'There must be a blank line following the last trait import statement'; - $fix = $phpcsFile->addFixableError($error, $end, 'NoBlankLineAfterUse'); - if ($fix === true) { - if ($tokens[$next]['line'] === $tokens[$useToken]['line']) { - $phpcsFile->fixer->addContentBefore($next, $phpcsFile->eolChar.$phpcsFile->eolChar); - } else { - for ($i = ($next - 1); $i > $end; $i--) { - if ($tokens[$i]['line'] !== $tokens[$next]['line']) { - break; - } - } - - $phpcsFile->fixer->addNewlineBefore(($i + 1)); - } - } - } - }//end if - } else { - // Ensure use statements are grouped. - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($end + 1), null, true); - if ($next !== $useTokens[($usePos + 1)]) { - $error = 'Imported traits must be grouped together'; - $phpcsFile->addError($error, $useTokens[($usePos + 1)], 'NotGrouped'); - } - }//end if - }//end foreach - - return $tokens[$ooToken]['scope_closer']; - - }//end process() - - - /** - * Processes a group use statement. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - protected function processUseGroup(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $opener = $tokens[$stackPtr]['scope_opener']; - $closer = $tokens[$stackPtr]['scope_closer']; - - if ($tokens[$opener]['line'] !== $tokens[$stackPtr]['line']) { - $error = 'The opening brace of a trait import statement must be on the same line as the USE keyword'; - // Figure out if we can fix this error. - $canFix = true; - for ($i = ($stackPtr + 1); $i < $opener; $i++) { - if ($tokens[$i]['line'] !== $tokens[($i + 1)]['line'] - && $tokens[$i]['code'] !== T_WHITESPACE - ) { - $canFix = false; - break; - } - } - - if ($canFix === true) { - $fix = $phpcsFile->addFixableError($error, $opener, 'OpenBraceNewLine'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($stackPtr + 1); $i < $opener; $i++) { - if ($tokens[$i]['line'] !== $tokens[($i + 1)]['line']) { - // Everything should have a single space around it. - $phpcsFile->fixer->replaceToken($i, ' '); - } - } - - $phpcsFile->fixer->endChangeset(); - } - } else { - $phpcsFile->addError($error, $opener, 'OpenBraceNewLine'); - } - }//end if - - $error = 'Expected 1 space before opening brace in trait import statement; %s found'; - if ($tokens[($opener - 1)]['code'] !== T_WHITESPACE) { - $data = ['0']; - $fix = $phpcsFile->addFixableError($error, $opener, 'SpaceBeforeOpeningBrace', $data); - if ($fix === true) { - $phpcsFile->fixer->addContentBefore($opener, ' '); - } - } else if ($tokens[($opener - 1)]['content'] !== ' ') { - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($opener - 1), null, true); - if ($tokens[$prev]['line'] !== $tokens[$opener]['line']) { - $found = 'newline'; - } else { - $found = $tokens[($opener - 1)]['length']; - } - - $data = [$found]; - $fix = $phpcsFile->addFixableError($error, $opener, 'SpaceBeforeOpeningBrace', $data); - if ($fix === true) { - if ($found === 'newline') { - $phpcsFile->fixer->beginChangeset(); - for ($x = ($opener - 1); $x > $prev; $x--) { - $phpcsFile->fixer->replaceToken($x, ''); - } - - $phpcsFile->fixer->addContentBefore($opener, ' '); - $phpcsFile->fixer->endChangeset(); - } else { - $phpcsFile->fixer->replaceToken(($opener - 1), ' '); - } - } - }//end if - - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($opener + 1), ($closer - 1), true); - if ($next !== false && $tokens[$next]['line'] !== ($tokens[$opener]['line'] + 1)) { - $error = 'First trait conflict resolution statement must be on the line after the opening brace'; - $nextNonWs = $phpcsFile->findNext(T_WHITESPACE, ($opener + 1), ($closer - 1), true); - if ($nextNonWs !== $next) { - $phpcsFile->addError($error, $opener, 'SpaceAfterOpeningBrace'); - } else { - $fix = $phpcsFile->addFixableError($error, $opener, 'SpaceAfterOpeningBrace'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($x = ($opener + 1); $x < $next; $x++) { - if ($tokens[$x]['line'] === $tokens[$next]['line']) { - // Preserve indent. - break; - } - - $phpcsFile->fixer->replaceToken($x, ''); - } - - $phpcsFile->fixer->addNewline($opener); - $phpcsFile->fixer->endChangeset(); - } - } - }//end if - - for ($i = ($stackPtr + 1); $i < $opener; $i++) { - if ($tokens[$i]['code'] !== T_COMMA) { - continue; - } - - if ($tokens[($i - 1)]['code'] === T_WHITESPACE) { - $error = 'Expected no space before comma in trait import statement; %s found'; - $data = [$tokens[($i - 1)]['length']]; - $fix = $phpcsFile->addFixableError($error, $i, 'SpaceBeforeComma', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($i - 1), ''); - } - } - - $error = 'Expected 1 space after comma in trait import statement; %s found'; - if ($tokens[($i + 1)]['code'] !== T_WHITESPACE) { - $data = ['0']; - $fix = $phpcsFile->addFixableError($error, $i, 'SpaceAfterComma', $data); - if ($fix === true) { - $phpcsFile->fixer->addContent($i, ' '); - } - } else if ($tokens[($i + 1)]['content'] !== ' ') { - $next = $phpcsFile->findNext(T_WHITESPACE, ($i + 1), $opener, true); - if ($tokens[$next]['line'] !== $tokens[$i]['line']) { - $found = 'newline'; - } else { - $found = $tokens[($i + 1)]['length']; - } - - $data = [$found]; - $fix = $phpcsFile->addFixableError($error, $i, 'SpaceAfterComma', $data); - if ($fix === true) { - if ($found === 'newline') { - $phpcsFile->fixer->beginChangeset(); - for ($x = ($i + 1); $x < $next; $x++) { - $phpcsFile->fixer->replaceToken($x, ''); - } - - $phpcsFile->fixer->addContent($i, ' '); - $phpcsFile->fixer->endChangeset(); - } else { - $phpcsFile->fixer->replaceToken(($i + 1), ' '); - } - } - }//end if - }//end for - - for ($i = ($opener + 1); $i < $closer; $i++) { - if ($tokens[$i]['code'] === T_INSTEADOF) { - $error = 'Expected 1 space before INSTEADOF in trait import statement; %s found'; - if ($tokens[($i - 1)]['code'] !== T_WHITESPACE) { - $data = ['0']; - $fix = $phpcsFile->addFixableError($error, $i, 'SpaceBeforeInsteadof', $data); - if ($fix === true) { - $phpcsFile->fixer->addContentBefore($i, ' '); - } - } else if ($tokens[($i - 1)]['content'] !== ' ') { - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($i - 1), $opener, true); - if ($tokens[$prev]['line'] !== $tokens[$i]['line']) { - $found = 'newline'; - } else { - $found = $tokens[($i - 1)]['length']; - } - - $data = [$found]; - - $prevNonWs = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($i - 1), $opener, true); - if ($prevNonWs !== $prev) { - $phpcsFile->addError($error, $i, 'SpaceBeforeInsteadof', $data); - } else { - $fix = $phpcsFile->addFixableError($error, $i, 'SpaceBeforeInsteadof', $data); - if ($fix === true) { - if ($found === 'newline') { - $phpcsFile->fixer->beginChangeset(); - for ($x = ($i - 1); $x > $prev; $x--) { - $phpcsFile->fixer->replaceToken($x, ''); - } - - $phpcsFile->fixer->addContentBefore($i, ' '); - $phpcsFile->fixer->endChangeset(); - } else { - $phpcsFile->fixer->replaceToken(($i - 1), ' '); - } - } - } - }//end if - - $error = 'Expected 1 space after INSTEADOF in trait import statement; %s found'; - if ($tokens[($i + 1)]['code'] !== T_WHITESPACE) { - $data = ['0']; - $fix = $phpcsFile->addFixableError($error, $i, 'SpaceAfterInsteadof', $data); - if ($fix === true) { - $phpcsFile->fixer->addContent($i, ' '); - } - } else if ($tokens[($i + 1)]['content'] !== ' ') { - $next = $phpcsFile->findNext(T_WHITESPACE, ($i + 1), $closer, true); - if ($tokens[$next]['line'] !== $tokens[$i]['line']) { - $found = 'newline'; - } else { - $found = $tokens[($i + 1)]['length']; - } - - $data = [$found]; - - $nextNonWs = $phpcsFile->findNext(Tokens::$emptyTokens, ($i + 1), $closer, true); - if ($nextNonWs !== $next) { - $phpcsFile->addError($error, $i, 'SpaceAfterInsteadof', $data); - } else { - $fix = $phpcsFile->addFixableError($error, $i, 'SpaceAfterInsteadof', $data); - if ($fix === true) { - if ($found === 'newline') { - $phpcsFile->fixer->beginChangeset(); - for ($x = ($i + 1); $x < $next; $x++) { - $phpcsFile->fixer->replaceToken($x, ''); - } - - $phpcsFile->fixer->addContent($i, ' '); - $phpcsFile->fixer->endChangeset(); - } else { - $phpcsFile->fixer->replaceToken(($i + 1), ' '); - } - } - } - }//end if - }//end if - - if ($tokens[$i]['code'] === T_AS) { - $error = 'Expected 1 space before AS in trait import statement; %s found'; - if ($tokens[($i - 1)]['code'] !== T_WHITESPACE) { - $data = ['0']; - $fix = $phpcsFile->addFixableError($error, $i, 'SpaceBeforeAs', $data); - if ($fix === true) { - $phpcsFile->fixer->addContentBefore($i, ' '); - } - } else if ($tokens[($i - 1)]['content'] !== ' ') { - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($i - 1), $opener, true); - if ($tokens[$prev]['line'] !== $tokens[$i]['line']) { - $found = 'newline'; - } else { - $found = $tokens[($i - 1)]['length']; - } - - $data = [$found]; - - $prevNonWs = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($i - 1), $opener, true); - if ($prevNonWs !== $prev) { - $phpcsFile->addError($error, $i, 'SpaceBeforeAs', $data); - } else { - $fix = $phpcsFile->addFixableError($error, $i, 'SpaceBeforeAs', $data); - if ($fix === true) { - if ($found === 'newline') { - $phpcsFile->fixer->beginChangeset(); - for ($x = ($i - 1); $x > $prev; $x--) { - $phpcsFile->fixer->replaceToken($x, ''); - } - - $phpcsFile->fixer->addContentBefore($i, ' '); - $phpcsFile->fixer->endChangeset(); - } else { - $phpcsFile->fixer->replaceToken(($i - 1), ' '); - } - } - } - }//end if - - $error = 'Expected 1 space after AS in trait import statement; %s found'; - if ($tokens[($i + 1)]['code'] !== T_WHITESPACE) { - $data = ['0']; - $fix = $phpcsFile->addFixableError($error, $i, 'SpaceAfterAs', $data); - if ($fix === true) { - $phpcsFile->fixer->addContent($i, ' '); - } - } else if ($tokens[($i + 1)]['content'] !== ' ') { - $next = $phpcsFile->findNext(T_WHITESPACE, ($i + 1), $closer, true); - if ($tokens[$next]['line'] !== $tokens[$i]['line']) { - $found = 'newline'; - } else { - $found = $tokens[($i + 1)]['length']; - } - - $data = [$found]; - - $nextNonWs = $phpcsFile->findNext(Tokens::$emptyTokens, ($i + 1), $closer, true); - if ($nextNonWs !== $next) { - $phpcsFile->addError($error, $i, 'SpaceAfterAs', $data); - } else { - $fix = $phpcsFile->addFixableError($error, $i, 'SpaceAfterAs', $data); - if ($fix === true) { - if ($found === 'newline') { - $phpcsFile->fixer->beginChangeset(); - for ($x = ($i + 1); $x < $next; $x++) { - $phpcsFile->fixer->replaceToken($x, ''); - } - - $phpcsFile->fixer->addContent($i, ' '); - $phpcsFile->fixer->endChangeset(); - } else { - $phpcsFile->fixer->replaceToken(($i + 1), ' '); - } - } - } - }//end if - }//end if - - if ($tokens[$i]['code'] === T_SEMICOLON) { - if ($tokens[($i - 1)]['code'] === T_WHITESPACE) { - $error = 'Expected no space before semicolon in trait import statement; %s found'; - $data = [$tokens[($i - 1)]['length']]; - $fix = $phpcsFile->addFixableError($error, $i, 'SpaceBeforeSemicolon', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($i - 1), ''); - } - } - - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($i + 1), ($closer - 1), true); - if ($next !== false && $tokens[$next]['line'] === $tokens[$i]['line']) { - $error = 'Each trait conflict resolution statement must be on a line by itself'; - $nextNonWs = $phpcsFile->findNext(T_WHITESPACE, ($i + 1), ($closer - 1), true); - if ($nextNonWs !== $next) { - $phpcsFile->addError($error, $i, 'ConflictSameLine'); - } else { - $fix = $phpcsFile->addFixableError($error, $i, 'ConflictSameLine'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - if ($tokens[($i + 1)]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->replaceToken(($i + 1), ''); - } - - $phpcsFile->fixer->addNewline($i); - $phpcsFile->fixer->endChangeset(); - } - } - } - }//end if - }//end for - - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($closer - 1), ($opener + 1), true); - if ($prev !== false && $tokens[$prev]['line'] !== ($tokens[$closer]['line'] - 1)) { - $error = 'Closing brace must be on the line after the last trait conflict resolution statement'; - $prevNonWs = $phpcsFile->findPrevious(T_WHITESPACE, ($closer - 1), ($opener + 1), true); - if ($prevNonWs !== $prev) { - $phpcsFile->addError($error, $closer, 'SpaceBeforeClosingBrace'); - } else { - $fix = $phpcsFile->addFixableError($error, $closer, 'SpaceBeforeClosingBrace'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($x = ($closer - 1); $x > $prev; $x--) { - if ($tokens[$x]['line'] === $tokens[$closer]['line']) { - // Preserve indent. - continue; - } - - $phpcsFile->fixer->replaceToken($x, ''); - } - - $phpcsFile->fixer->addNewline($prev); - $phpcsFile->fixer->endChangeset(); - } - } - }//end if - - }//end processUseGroup() - - - /** - * Processes a single use statement. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - protected function processUseStatement(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $next = $phpcsFile->findNext([T_COMMA, T_SEMICOLON], ($stackPtr + 1)); - if ($next !== false && $tokens[$next]['code'] === T_COMMA) { - $error = 'Each imported trait must have its own "use" import statement'; - $fix = $phpcsFile->addFixableError($error, $next, 'MultipleImport'); - if ($fix === true) { - $padding = str_repeat(' ', ($tokens[$stackPtr]['column'] - 1)); - $phpcsFile->fixer->replaceToken($next, ';'.$phpcsFile->eolChar.$padding.'use '); - } - } - - }//end processUseStatement() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/AnonClassDeclarationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/AnonClassDeclarationUnitTest.inc deleted file mode 100644 index 386b12c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/AnonClassDeclarationUnitTest.inc +++ /dev/null @@ -1,96 +0,0 @@ -bar( - new class implements Bar { - // ... - }, -); - -foo(new class { -}); - -// Issue #3790: OpenBraceSameLine fixer should not remove open brace. -$instance = new class() extends SomeClass implements - SomeInterface{ - public function __construct() {} -}; - -// PHP 8.3 readonly anonymous classes. -$anon = new readonly class {}; -$anon = new readonly class {}; -$anon = new readonly - class {}; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/AnonClassDeclarationUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/AnonClassDeclarationUnitTest.inc.fixed deleted file mode 100644 index 28b38f7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/AnonClassDeclarationUnitTest.inc.fixed +++ /dev/null @@ -1,98 +0,0 @@ -bar( - new class implements Bar { - // ... - }, -); - -foo(new class { -}); - -// Issue #3790: OpenBraceSameLine fixer should not remove open brace. -$instance = new class () extends SomeClass implements - SomeInterface -{ - public function __construct() {} -}; - -// PHP 8.3 readonly anonymous classes. -$anon = new readonly class {}; -$anon = new readonly class {}; -$anon = new readonly class {}; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/AnonClassDeclarationUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/AnonClassDeclarationUnitTest.php deleted file mode 100644 index 6184b24..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/AnonClassDeclarationUnitTest.php +++ /dev/null @@ -1,80 +0,0 @@ - - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Tests\Classes; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the AnonClassDeclaration sniff. - * - * @covers \PHP_CodeSniffer\Standards\PSR12\Sniffs\Classes\AnonClassDeclarationSniff - */ -final class AnonClassDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 28 => 3, - 30 => 1, - 31 => 4, - 32 => 1, - 33 => 1, - 34 => 1, - 35 => 1, - 36 => 1, - 37 => 3, - 39 => 1, - 40 => 1, - 43 => 3, - 44 => 4, - 45 => 1, - 48 => 1, - 52 => 3, - 53 => 1, - 54 => 1, - 55 => 1, - 56 => 2, - 63 => 1, - 75 => 1, - 87 => 1, - 88 => 1, - 94 => 1, - 96 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClassInstantiationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClassInstantiationUnitTest.inc deleted file mode 100644 index 2641167..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClassInstantiationUnitTest.inc +++ /dev/null @@ -1,51 +0,0 @@ -bar(); -echo (new Foo)->bar(); -echo (new Foo((new Bar)->getBaz()))->bar(); -$foo = (new Foo)::$bar; - -echo (new Foo((new Bar//comment -)->getBaz(new Baz /* comment */)))->bar(); - -$foo = new $bar['a'](); -$foo = new $bar['a']['b'](); -$foo = new $bar['a'][$baz['a']['b']]['b'](); -$foo = new $bar['a'] [$baz['a']/* comment */ ['b']]['b']; - -$a = new self::$transport[$cap_string]; -$renderer = new $this->inline_diff_renderer; -$a = new ${$varHoldingClassName}; - -$class = new $obj?->classname(); -$class = new $obj?->classname; -$class = new ${$obj?->classname}; - -// Issue 3456. -// Anon classes should be skipped, even when there is an attribute between the new and the class keywords. -$anonWithAttribute = new #[SomeAttribute('summary')] class { - public const SOME_STUFF = 'foo'; -}; - -$foo = new parent(); -$foo = new parent; - -// PHP 8.3: safeguard that the sniff ignores anonymous classes, even when declared as readonly. -$anon = new readonly class {}; -$anon = new #[MyAttribute] readonly class {}; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClassInstantiationUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClassInstantiationUnitTest.inc.fixed deleted file mode 100644 index 1e580f4..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClassInstantiationUnitTest.inc.fixed +++ /dev/null @@ -1,51 +0,0 @@ -bar(); -echo (new Foo())->bar(); -echo (new Foo((new Bar())->getBaz()))->bar(); -$foo = (new Foo())::$bar; - -echo (new Foo((new Bar()//comment -)->getBaz(new Baz() /* comment */)))->bar(); - -$foo = new $bar['a'](); -$foo = new $bar['a']['b'](); -$foo = new $bar['a'][$baz['a']['b']]['b'](); -$foo = new $bar['a'] [$baz['a']/* comment */ ['b']]['b'](); - -$a = new self::$transport[$cap_string](); -$renderer = new $this->inline_diff_renderer(); -$a = new ${$varHoldingClassName}(); - -$class = new $obj?->classname(); -$class = new $obj?->classname(); -$class = new ${$obj?->classname}(); - -// Issue 3456. -// Anon classes should be skipped, even when there is an attribute between the new and the class keywords. -$anonWithAttribute = new #[SomeAttribute('summary')] class { - public const SOME_STUFF = 'foo'; -}; - -$foo = new parent(); -$foo = new parent(); - -// PHP 8.3: safeguard that the sniff ignores anonymous classes, even when declared as readonly. -$anon = new readonly class {}; -$anon = new #[MyAttribute] readonly class {}; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClassInstantiationUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClassInstantiationUnitTest.php deleted file mode 100644 index b99cc8a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClassInstantiationUnitTest.php +++ /dev/null @@ -1,72 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Tests\Classes; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ClassInstantiation sniff. - * - * @covers \PHP_CodeSniffer\Standards\PSR12\Sniffs\Classes\ClassInstantiationSniff - */ -final class ClassInstantiationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 3 => 1, - 4 => 1, - 9 => 1, - 11 => 1, - 14 => 1, - 16 => 1, - 20 => 1, - 21 => 1, - 22 => 1, - 24 => 1, - 25 => 1, - 30 => 1, - 32 => 1, - 33 => 1, - 34 => 1, - 37 => 1, - 38 => 1, - 47 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClosingBraceUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClosingBraceUnitTest.inc deleted file mode 100644 index 2562d26..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClosingBraceUnitTest.inc +++ /dev/null @@ -1,52 +0,0 @@ -bar( - $arg1, - function ($arg2) use ($var1) { - // body - }, - $arg3 -); - -$instance = new class extends \Foo implements \HandleableInterface { - // Class content -}; - -$app->get('/hello/{name}', function ($name) use ($app) { - return 'Hello ' . $app->escape($name); -}); - -enum Foo4 -{ - -}//end diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClosingBraceUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClosingBraceUnitTest.php deleted file mode 100644 index 219f8ac..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/ClosingBraceUnitTest.php +++ /dev/null @@ -1,60 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Tests\Classes; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ClosingBrace sniff. - * - * @covers \PHP_CodeSniffer\Standards\PSR12\Sniffs\Classes\ClosingBraceSniff - */ -final class ClosingBraceUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 13 => 1, - 14 => 1, - 19 => 1, - 24 => 1, - 31 => 1, - 52 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/OpeningBraceSpaceUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/OpeningBraceSpaceUnitTest.inc deleted file mode 100644 index 2c41bde..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Classes/OpeningBraceSpaceUnitTest.inc +++ /dev/null @@ -1,57 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Tests\Classes; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the OpeningBraceSpace sniff. - * - * @covers \PHP_CodeSniffer\Standards\PSR12\Sniffs\Classes\OpeningBraceSpaceSniff - */ -final class OpeningBraceSpaceUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 10 => 1, - 18 => 1, - 24 => 1, - 34 => 1, - 41 => 1, - 55 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/BooleanOperatorPlacementUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/BooleanOperatorPlacementUnitTest.inc deleted file mode 100644 index 4bc2ece..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/BooleanOperatorPlacementUnitTest.inc +++ /dev/null @@ -1,131 +0,0 @@ - 0 && $n < 10) - || ($n > 10 && $n < 20) - || ($n > 20 && $n < 30) -) { - return $n; -} - -if ( - ( - $expr1 - && $expr2 - && $expr3 - && $expr4 - && $expr5 - && $expr6 - ) - || ($n > 100 && $n < 200) - || ($n > 200 && $n < 300) -) { - return $n; -} - -// phpcs:set PSR12.ControlStructures.BooleanOperatorPlacement allowOnly first -if ( - $expr1 - && $expr2 - && ($expr3 - || $expr4) - && $expr5 -) { - // if body -} elseif ( - $expr1 && - ($expr3 || $expr4) - && $expr5 -) { - // elseif body -} elseif ( - $expr1 - && ($expr3 || $expr4) && - $expr5 -) { - // elseif body -} - -// phpcs:set PSR12.ControlStructures.BooleanOperatorPlacement allowOnly last -if ( - $expr1 - && $expr2 - && ($expr3 - || $expr4) - && $expr5 -) { - // if body -} elseif ( - $expr1 && - ($expr3 || $expr4) - && $expr5 -) { - // elseif body -} elseif ( - $expr1 - && ($expr3 || $expr4) && - $expr5 -) { - // elseif body -} - -if ( - ($value == 1 || - $value == 2) - && - ($value == 3 || - $value == 4) -) { - return 5; -} - -// Reset to default. -// phpcs:set PSR12.ControlStructures.BooleanOperatorPlacement allowOnly - -match ( - $expr1 - && $expr2 && - $expr3 -) { - // structure body -}; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/BooleanOperatorPlacementUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/BooleanOperatorPlacementUnitTest.inc.fixed deleted file mode 100644 index 5f4d223..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/BooleanOperatorPlacementUnitTest.inc.fixed +++ /dev/null @@ -1,141 +0,0 @@ - 0 && $n < 10) - || ($n > 10 && $n < 20) - || ($n > 20 && $n < 30) -) { - return $n; -} - -if ( - ( - $expr1 - && $expr2 - && $expr3 - && $expr4 - && $expr5 - && $expr6 - ) - || ($n > 100 && $n < 200) - || ($n > 200 && $n < 300) -) { - return $n; -} - -// phpcs:set PSR12.ControlStructures.BooleanOperatorPlacement allowOnly first -if ( - $expr1 - && $expr2 - && ($expr3 - || $expr4) - && $expr5 -) { - // if body -} elseif ( - $expr1 - && ($expr3 - || $expr4) - && $expr5 -) { - // elseif body -} elseif ( - $expr1 - && ($expr3 - || $expr4) - && $expr5 -) { - // elseif body -} - -// phpcs:set PSR12.ControlStructures.BooleanOperatorPlacement allowOnly last -if ( - $expr1 && - $expr2 && - ($expr3 || - $expr4) && - $expr5 -) { - // if body -} elseif ( - $expr1 && - ($expr3 || - $expr4) && - $expr5 -) { - // elseif body -} elseif ( - $expr1 && - ($expr3 || - $expr4) && - $expr5 -) { - // elseif body -} - -if ( - ($value == 1 || - $value == 2) - && - ($value == 3 || - $value == 4) -) { - return 5; -} - -// Reset to default. -// phpcs:set PSR12.ControlStructures.BooleanOperatorPlacement allowOnly - -match ( - $expr1 - && $expr2 - && $expr3 -) { - // structure body -}; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/BooleanOperatorPlacementUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/BooleanOperatorPlacementUnitTest.php deleted file mode 100644 index 70127a8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/BooleanOperatorPlacementUnitTest.php +++ /dev/null @@ -1,64 +0,0 @@ - - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Tests\ControlStructures; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the BooleanOperatorPlacement sniff. - * - * @covers \PHP_CodeSniffer\Standards\PSR12\Sniffs\ControlStructures\BooleanOperatorPlacementSniff - */ -final class BooleanOperatorPlacementUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 10 => 1, - 16 => 1, - 28 => 1, - 34 => 1, - 75 => 1, - 81 => 1, - 90 => 1, - 98 => 1, - 104 => 1, - 125 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/ControlStructureSpacingUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/ControlStructureSpacingUnitTest.inc deleted file mode 100644 index f370696..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/ControlStructureSpacingUnitTest.inc +++ /dev/null @@ -1,133 +0,0 @@ - $foo - /* - * A multi-line comment. - */ - && $foo === true - ) { - break; - } - -match ( - $expr1 && - $expr2 && - $expr3 - ) { - // structure body -}; - -match ($expr1 && -$expr2 && - $expr3) { - // structure body -}; - -// Ensure the sniff handles too many newlines (not just too few). -for ( - - - $i = 0; - $i < 10; - $i++ - - -) {} - -// Ensure the sniff does not remove indentation whitespace when comments are involved. -for ( - - - // comment. - $i = 0; - $i < 10; - $i++ -) {} - -// The sniff treats a comment (ie non-whitespace) as content, but only at the -// start / end of the control structure. So the inner-whitespace here is -// intentionally ignored by this sniff. Additionally, the comment is not indented -// by this sniff when fixing. -for (// comment. - - - $i = 0; - $i < 10; - $i++ -) {} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/ControlStructureSpacingUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/ControlStructureSpacingUnitTest.inc.fixed deleted file mode 100644 index d6c3f48..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/ControlStructureSpacingUnitTest.inc.fixed +++ /dev/null @@ -1,131 +0,0 @@ - $foo - /* - * A multi-line comment. - */ - && $foo === true - ) { - break; - } - -match ( - $expr1 && - $expr2 && - $expr3 -) { - // structure body -}; - -match ( - $expr1 && - $expr2 && - $expr3 -) { - // structure body -}; - -// Ensure the sniff handles too many newlines (not just too few). -for ( - $i = 0; - $i < 10; - $i++ -) {} - -// Ensure the sniff does not remove indentation whitespace when comments are involved. -for ( - // comment. - $i = 0; - $i < 10; - $i++ -) {} - -// The sniff treats a comment (ie non-whitespace) as content, but only at the -// start / end of the control structure. So the inner-whitespace here is -// intentionally ignored by this sniff. Additionally, the comment is not indented -// by this sniff when fixing. -for ( -// comment. - - - $i = 0; - $i < 10; - $i++ -) {} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/ControlStructureSpacingUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/ControlStructureSpacingUnitTest.php deleted file mode 100644 index 45d1aa5..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/ControlStructures/ControlStructureSpacingUnitTest.php +++ /dev/null @@ -1,77 +0,0 @@ - - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Tests\ControlStructures; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ControlStructureSpacing sniff. - * - * @covers \PHP_CodeSniffer\Standards\PSR12\Sniffs\ControlStructures\ControlStructureSpacingSniff - */ -final class ControlStructureSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 2 => 2, - 16 => 1, - 17 => 1, - 18 => 1, - 22 => 1, - 23 => 1, - 32 => 1, - 33 => 1, - 34 => 1, - 37 => 1, - 38 => 1, - 39 => 1, - 48 => 2, - 58 => 1, - 59 => 1, - 92 => 1, - 96 => 1, - 97 => 1, - 98 => 2, - 106 => 1, - 111 => 1, - 117 => 1, - 127 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/DeclareStatementUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/DeclareStatementUnitTest.1.inc deleted file mode 100644 index f21daaf..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/DeclareStatementUnitTest.1.inc +++ /dev/null @@ -1,50 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Tests\Files; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the DeclareStatement sniff. - * - * @covers \PHP_CodeSniffer\Standards\PSR12\Sniffs\Files\DeclareStatementSniff - */ -final class DeclareStatementUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'DeclareStatementUnitTest.1.inc': - return [ - 2 => 1, - 3 => 1, - 4 => 1, - 5 => 2, - 6 => 1, - 7 => 1, - 9 => 2, - 10 => 1, - 11 => 3, - 12 => 2, - 13 => 1, - 14 => 2, - 16 => 3, - 19 => 3, - 22 => 1, - 24 => 1, - 26 => 3, - 28 => 3, - 34 => 2, - 43 => 1, - 46 => 1, - 47 => 1, - 49 => 1, - ]; - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.1.inc deleted file mode 100644 index 1298ed7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.1.inc +++ /dev/null @@ -1,29 +0,0 @@ - - -

    - - - -

    - - - - -

    Demo

    - - -
  • My page
  • -
  • Write
  • -
  • Sign out
  • - -
  • Sign in
  • - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.15.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.15.inc deleted file mode 100644 index 11102be..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.15.inc +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.16.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.16.inc deleted file mode 100644 index 5c3df1f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.16.inc +++ /dev/null @@ -1,13 +0,0 @@ - - - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Tests\Files; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the FileHeader sniff. - * - * @covers \PHP_CodeSniffer\Standards\PSR12\Sniffs\Files\FileHeaderSniff - */ -final class FileHeaderUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'FileHeaderUnitTest.2.inc': - return [ - 1 => 1, - 6 => 1, - 7 => 1, - 18 => 1, - 20 => 1, - 24 => 1, - ]; - case 'FileHeaderUnitTest.3.inc': - return [ - 9 => 1, - 18 => 1, - ]; - case 'FileHeaderUnitTest.4.inc': - return [ - 1 => 1, - 2 => 1, - 3 => 1, - 7 => 1, - ]; - case 'FileHeaderUnitTest.5.inc': - return [4 => 1]; - case 'FileHeaderUnitTest.7.inc': - case 'FileHeaderUnitTest.10.inc': - case 'FileHeaderUnitTest.11.inc': - return [1 => 1]; - case 'FileHeaderUnitTest.12.inc': - return [4 => 2]; - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/ImportStatementUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/ImportStatementUnitTest.inc deleted file mode 100644 index beb692b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/ImportStatementUnitTest.inc +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Tests\Files; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ImportStatement sniff. - * - * @covers \PHP_CodeSniffer\Standards\PSR12\Sniffs\Files\ImportStatementSniff - */ -final class ImportStatementUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 2 => 1, - 4 => 1, - 7 => 1, - 10 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/OpenTagUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/OpenTagUnitTest.1.inc deleted file mode 100644 index 0dbdf01..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/OpenTagUnitTest.1.inc +++ /dev/null @@ -1,3 +0,0 @@ - -hi diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/OpenTagUnitTest.4.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/OpenTagUnitTest.4.inc deleted file mode 100644 index 09be8fb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Files/OpenTagUnitTest.4.inc +++ /dev/null @@ -1,2 +0,0 @@ - - - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Tests\Files; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the OpenTag sniff. - * - * @covers \PHP_CodeSniffer\Standards\PSR12\Sniffs\Files\OpenTagSniff - */ -final class OpenTagUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'OpenTagUnitTest.2.inc': - return [1 => 1]; - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Functions/NullableTypeDeclarationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Functions/NullableTypeDeclarationUnitTest.inc deleted file mode 100644 index 056d74c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Functions/NullableTypeDeclarationUnitTest.inc +++ /dev/null @@ -1,95 +0,0 @@ - - * @copyright 2006-2018 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Tests\Functions; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the NullableWhitespace sniff. - * - * @covers \PHP_CodeSniffer\Standards\PSR12\Sniffs\Functions\NullableTypeDeclarationSniff - */ -final class NullableTypeDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - protected function getErrorList() - { - return [ - 23 => 1, - 24 => 1, - 25 => 1, - 30 => 1, - 31 => 1, - 32 => 1, - 43 => 2, - 48 => 1, - 50 => 1, - 51 => 1, - 53 => 1, - 57 => 2, - 58 => 2, - 59 => 2, - 87 => 1, - 90 => 1, - 91 => 1, - 95 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - protected function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Functions/ReturnTypeDeclarationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Functions/ReturnTypeDeclarationUnitTest.inc deleted file mode 100644 index 59ab1aa..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Functions/ReturnTypeDeclarationUnitTest.inc +++ /dev/null @@ -1,66 +0,0 @@ - $arg; - -return (!$a ? [ new class { public function b(): c {} } ] : []); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Functions/ReturnTypeDeclarationUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Functions/ReturnTypeDeclarationUnitTest.inc.fixed deleted file mode 100644 index cd79f78..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Functions/ReturnTypeDeclarationUnitTest.inc.fixed +++ /dev/null @@ -1,62 +0,0 @@ - $arg; - -return (!$a ? [ new class { public function b(): c {} } ] : []); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Functions/ReturnTypeDeclarationUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Functions/ReturnTypeDeclarationUnitTest.php deleted file mode 100644 index d2e9903..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Functions/ReturnTypeDeclarationUnitTest.php +++ /dev/null @@ -1,66 +0,0 @@ - - * @copyright 2006-2018 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Tests\Functions; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ReturnTypeDeclaration sniff. - * - * @covers \PHP_CodeSniffer\Standards\PSR12\Sniffs\Functions\ReturnTypeDeclarationSniff - */ -final class ReturnTypeDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - protected function getErrorList() - { - return [ - 27 => 1, - 28 => 1, - 35 => 2, - 41 => 2, - 48 => 2, - 52 => 1, - 55 => 1, - 56 => 1, - 59 => 1, - 60 => 1, - 62 => 1, - 64 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - protected function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Keywords/ShortFormTypeKeywordsUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Keywords/ShortFormTypeKeywordsUnitTest.inc deleted file mode 100644 index 6ce930d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Keywords/ShortFormTypeKeywordsUnitTest.inc +++ /dev/null @@ -1,14 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Tests\Keywords; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ShortFormTypeKeywords sniff. - * - * @covers \PHP_CodeSniffer\Standards\PSR12\Sniffs\Keywords\ShortFormTypeKeywordsSniff - */ -final class ShortFormTypeKeywordsUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 3 => 1, - 5 => 1, - 7 => 1, - 13 => 1, - 14 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Namespaces/CompoundNamespaceDepthUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Namespaces/CompoundNamespaceDepthUnitTest.inc deleted file mode 100644 index 454f7fc..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Namespaces/CompoundNamespaceDepthUnitTest.inc +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Tests\Namespaces; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the CompoundNamespaceDepth sniff. - * - * @covers \PHP_CodeSniffer\Standards\PSR12\Sniffs\Namespaces\CompoundNamespaceDepthSniff - */ -final class CompoundNamespaceDepthUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 10 => 1, - 18 => 1, - 21 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Operators/OperatorSpacingUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Operators/OperatorSpacingUnitTest.1.inc deleted file mode 100644 index 14cf8e9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Operators/OperatorSpacingUnitTest.1.inc +++ /dev/null @@ -1,79 +0,0 @@ - $b) { - $variable =$foo ? 'foo' :'bar'; - $variable.='text'.'text'; -} - -$foo+= $a&$b; -$foo = $a|$b; -$foo =$a^$b; -$foo = ~$a; -$foo *=$a<<$b; -$foo = $a>>$b; - -function foo(&$a,& $b) {} - -$foo = $a and$b; -$foo = $a or $b; -$foo = $a xor$b; -$foo = !$a; -$foo = $a&&$b; -$foo = $a||$b; - -$foo = $a instanceof Foo; -$foo = $a instanceof$b; - -$foo .= 'hi' - .= 'there'; - -$foo .= 'hi' -.= 'there'; - -$foo .= 'hi' // comment -.= 'there'; - -$foo/*comment*/=/*comment*/$a/*comment*/and/*comment*/$b; - -$foo .=//comment -'string' .=/*comment*/ -'string'; - -$foo = $foo ?: 'bar'; -$foo = $foo?:'bar'; - -try { -} catch (ExceptionType1|ExceptionType2 $e) { -} - -if (strpos($tokenContent, 'b"') === 0 && substr($tokenContent, -1) === '"') {} - -$oldConstructorPos = +1; -return -$content; - -function name($a = -1) {} - -$a =& $ref; -$a = [ 'a' => &$something ]; - -$fn = fn(array &$one) => 1; -$fn = fn(array & $one) => 1; - -$fn = static fn(DateTime $a, DateTime $b): int => -($a->getTimestamp() <=> $b->getTimestamp()); - -function issue3267(string|int ...$values) {} - -function setDefault(#[ImportValue( - constraints: [ - [ - Assert\Type::class, - ['type' => 'bool'], - ], - ] - )] ?bool $value = null): void - { - // Do something - } - -declare(strict_types=1); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Operators/OperatorSpacingUnitTest.1.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Operators/OperatorSpacingUnitTest.1.inc.fixed deleted file mode 100644 index 0f52f1c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Operators/OperatorSpacingUnitTest.1.inc.fixed +++ /dev/null @@ -1,79 +0,0 @@ - $b) { - $variable = $foo ? 'foo' : 'bar'; - $variable .= 'text' . 'text'; -} - -$foo += $a & $b; -$foo = $a | $b; -$foo = $a ^ $b; -$foo = ~$a; -$foo *= $a << $b; -$foo = $a >> $b; - -function foo(&$a,& $b) {} - -$foo = $a and $b; -$foo = $a or $b; -$foo = $a xor $b; -$foo = !$a; -$foo = $a && $b; -$foo = $a || $b; - -$foo = $a instanceof Foo; -$foo = $a instanceof $b; - -$foo .= 'hi' - .= 'there'; - -$foo .= 'hi' -.= 'there'; - -$foo .= 'hi' // comment -.= 'there'; - -$foo/*comment*/ = /*comment*/$a/*comment*/ and /*comment*/$b; - -$foo .= //comment -'string' .= /*comment*/ -'string'; - -$foo = $foo ?: 'bar'; -$foo = $foo ?: 'bar'; - -try { -} catch (ExceptionType1 | ExceptionType2 $e) { -} - -if (strpos($tokenContent, 'b"') === 0 && substr($tokenContent, -1) === '"') {} - -$oldConstructorPos = +1; -return -$content; - -function name($a = -1) {} - -$a =& $ref; -$a = [ 'a' => &$something ]; - -$fn = fn(array &$one) => 1; -$fn = fn(array & $one) => 1; - -$fn = static fn(DateTime $a, DateTime $b): int => -($a->getTimestamp() <=> $b->getTimestamp()); - -function issue3267(string|int ...$values) {} - -function setDefault(#[ImportValue( - constraints: [ - [ - Assert\Type::class, - ['type' => 'bool'], - ], - ] - )] ?bool $value = null): void - { - // Do something - } - -declare(strict_types=1); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Operators/OperatorSpacingUnitTest.2.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Operators/OperatorSpacingUnitTest.2.inc deleted file mode 100644 index 3a0dbac..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Operators/OperatorSpacingUnitTest.2.inc +++ /dev/null @@ -1,3 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Tests\Operators; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the OperatorSpacing sniff. - * - * @covers \PHP_CodeSniffer\Standards\PSR12\Sniffs\Operators\OperatorSpacingSniff - */ -final class OperatorSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'OperatorSpacingUnitTest.1.inc': - return [ - 2 => 1, - 3 => 2, - 4 => 1, - 5 => 2, - 6 => 4, - 9 => 3, - 10 => 2, - 11 => 3, - 13 => 3, - 14 => 2, - 18 => 1, - 20 => 1, - 22 => 2, - 23 => 2, - 26 => 1, - 37 => 4, - 39 => 1, - 40 => 1, - 44 => 2, - 47 => 2, - ]; - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Properties/ConstantVisibilityUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Properties/ConstantVisibilityUnitTest.1.inc deleted file mode 100644 index 84ea24b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Properties/ConstantVisibilityUnitTest.1.inc +++ /dev/null @@ -1,22 +0,0 @@ - - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Tests\Properties; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ConstantVisibility sniff. - * - * @covers \PHP_CodeSniffer\Standards\PSR12\Sniffs\Properties\ConstantVisibilitySniff - */ -final class ConstantVisibilityUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return []; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getWarningList($testFile='') - { - switch ($testFile) { - case 'ConstantVisibilityUnitTest.1.inc': - return [ - 4 => 1, - 12 => 1, - 21 => 1, - ]; - - case 'ConstantVisibilityUnitTest.2.inc': - return [ - 6 => 1, - ]; - - default: - return []; - } - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Traits/UseDeclarationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Traits/UseDeclarationUnitTest.inc deleted file mode 100644 index 152121c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/Tests/Traits/UseDeclarationUnitTest.inc +++ /dev/null @@ -1,221 +0,0 @@ - - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR12\Tests\Traits; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the UseDeclaration sniff. - * - * @covers \PHP_CodeSniffer\Standards\PSR12\Sniffs\Traits\UseDeclarationSniff - */ -final class UseDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 15 => 1, - 29 => 2, - 30 => 1, - 42 => 1, - 57 => 4, - 59 => 3, - 61 => 1, - 63 => 5, - 65 => 1, - 71 => 1, - 73 => 2, - 76 => 1, - 86 => 2, - 103 => 1, - 112 => 1, - 122 => 1, - 132 => 1, - 157 => 1, - 165 => 1, - 170 => 1, - 208 => 1, - 219 => 3, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/ruleset.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/ruleset.xml deleted file mode 100644 index 2f9ae0a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR12/ruleset.xml +++ /dev/null @@ -1,348 +0,0 @@ - - - The PSR-12 coding standard. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - 0 - - - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - error - Method name "%s" must not be prefixed with an underscore to indicate visibility - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - 0 - - - - - - - - - - - - - - - - - 0 - - - 0 - - - - - - - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Classes/ClassDeclarationStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Classes/ClassDeclarationStandard.xml deleted file mode 100644 index 4e56bc0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Classes/ClassDeclarationStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - class Foo -{ -} - ]]> - - - class Foo -{ -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Classes/PropertyDeclarationStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Classes/PropertyDeclarationStandard.xml deleted file mode 100644 index 042c0c6..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Classes/PropertyDeclarationStandard.xml +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - bar; -} - ]]> - - - _bar; -} - ]]> - - - - - private $bar; -} - ]]> - - - var $bar; -} - ]]> - - - - - - - - $bar, $baz; -} - ]]> - - - - - static $bar; - private $baz; -} - ]]> - - - static protected $bar; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/ControlStructures/ControlStructureSpacingStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/ControlStructures/ControlStructureSpacingStandard.xml deleted file mode 100644 index dcbe98f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/ControlStructures/ControlStructureSpacingStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - $foo) { - $var = 1; -} - ]]> - - - $foo ) { - $var = 1; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/ControlStructures/ElseIfDeclarationStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/ControlStructures/ElseIfDeclarationStandard.xml deleted file mode 100644 index a22dd17..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/ControlStructures/ElseIfDeclarationStandard.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - elseif ($bar) { - $var = 2; -} - ]]> - - - else if ($bar) { - $var = 2; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/ControlStructures/SwitchDeclarationStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/ControlStructures/SwitchDeclarationStandard.xml deleted file mode 100644 index fe4fe3b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/ControlStructures/SwitchDeclarationStandard.xml +++ /dev/null @@ -1,204 +0,0 @@ - - - - - - - case 'bar': - break; - default: - break; -} - ]]> - - - CASE 'bar': - break; - Default: - break; -} - ]]> - - - - - - - - 'bar': - break; -} - ]]> - - - 'bar': - break; -} - ]]> - - - - - - - - : - break; - default: - break; -} - ]]> - - - : - break; - default : - break; -} - ]]> - - - - - - - - break; -} - ]]> - - - break; -} - ]]> - - - - - - - - return; -} - ]]> - - - echo $foo; return; -} - ]]> - - - - - - - - break; -} - ]]> - - - break; -} - ]]> - - - - - - - - : - break; - default: - break; -} - ]]> - - - ; - break; - default: { - break; - } -} - ]]> - - - - - - - - // no break - default: - break; -} - ]]> - - - - default: - break; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Files/ClosingTagStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Files/ClosingTagStandard.xml deleted file mode 100644 index 60d5e7f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Files/ClosingTagStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - ]]> - - - ?> - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Files/EndFileNewlineStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Files/EndFileNewlineStandard.xml deleted file mode 100644 index d6d3aad..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Files/EndFileNewlineStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Methods/FunctionCallSignatureStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Methods/FunctionCallSignatureStandard.xml deleted file mode 100644 index 257bcab..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Methods/FunctionCallSignatureStandard.xml +++ /dev/null @@ -1,107 +0,0 @@ - - - - - - - ($bar, $baz); - ]]> - - - ( $bar, $baz ); - ]]> - - - - - $bar, - $baz -); - ]]> - - - $bar, - $baz -); - ]]> - - - - - ); - ]]> - - - ); - ]]> - - - - - $bar, - $baz -); - ]]> - - - $bar, - $baz -); - ]]> - - - - - $baz -); - ]]> - - - $baz -); - ]]> - - - - - - - - - $baz -); - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Methods/FunctionClosingBraceStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Methods/FunctionClosingBraceStandard.xml deleted file mode 100644 index 3b1b655..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Methods/FunctionClosingBraceStandard.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - } - ]]> - - - -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Methods/MethodDeclarationStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Methods/MethodDeclarationStandard.xml deleted file mode 100644 index 91ff8c2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Methods/MethodDeclarationStandard.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - bar() - { - } -} - ]]> - - - _bar() - { - } -} - ]]> - - - - - final public static function bar() - { - } -} - ]]> - - - static public final function bar() - { - } -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Namespaces/NamespaceDeclarationStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Namespaces/NamespaceDeclarationStandard.xml deleted file mode 100644 index 8754e23..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Namespaces/NamespaceDeclarationStandard.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - -use \Baz; - ]]> - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Namespaces/UseDeclarationStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Namespaces/UseDeclarationStandard.xml deleted file mode 100644 index 4082603..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Docs/Namespaces/UseDeclarationStandard.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - \Foo, \Bar; - ]]> - - - - - - - - - - - - - -class Baz -{ -} - ]]> - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Classes/ClassDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Classes/ClassDeclarationSniff.php deleted file mode 100644 index 5bc2143..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Classes/ClassDeclarationSniff.php +++ /dev/null @@ -1,540 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Sniffs\Classes; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Standards\PEAR\Sniffs\Classes\ClassDeclarationSniff as PEARClassDeclarationSniff; -use PHP_CodeSniffer\Util\Tokens; - -class ClassDeclarationSniff extends PEARClassDeclarationSniff -{ - - /** - * The number of spaces code should be indented. - * - * @var integer - */ - public $indent = 4; - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - // We want all the errors from the PEAR standard, plus some of our own. - parent::process($phpcsFile, $stackPtr); - - // Just in case. - $tokens = $phpcsFile->getTokens(); - if (isset($tokens[$stackPtr]['scope_opener']) === false) { - return; - } - - $this->processOpen($phpcsFile, $stackPtr); - $this->processClose($phpcsFile, $stackPtr); - - }//end process() - - - /** - * Processes the opening section of a class declaration. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function processOpen(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $stackPtrType = strtolower($tokens[$stackPtr]['content']); - - // Check alignment of the keyword and braces. - $classModifiers = [ - T_ABSTRACT => T_ABSTRACT, - T_FINAL => T_FINAL, - T_READONLY => T_READONLY, - ]; - - $prevNonSpace = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - $prevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - - if (isset($classModifiers[$tokens[$prevNonEmpty]['code']]) === true) { - $spaces = 0; - $errorCode = 'SpaceBeforeKeyword'; - if ($tokens[$prevNonEmpty]['line'] !== $tokens[$stackPtr]['line']) { - $spaces = 'newline'; - $errorCode = 'NewlineBeforeKeyword'; - } else if ($tokens[($stackPtr - 1)]['code'] === T_WHITESPACE) { - $spaces = $tokens[($stackPtr - 1)]['length']; - } - - if ($spaces !== 1) { - $error = 'Expected 1 space between %s and %s keywords; %s found'; - $data = [ - strtolower($tokens[$prevNonEmpty]['content']), - $stackPtrType, - $spaces, - ]; - - if ($prevNonSpace !== $prevNonEmpty) { - // Comment found between modifier and class keyword. Do not auto-fix. - $phpcsFile->addError($error, $stackPtr, $errorCode, $data); - } else { - $fix = $phpcsFile->addFixableError($error, $stackPtr, $errorCode, $data); - if ($fix === true) { - if ($spaces === 0) { - $phpcsFile->fixer->addContentBefore($stackPtr, ' '); - } else { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken(($stackPtr - 1), ' '); - for ($i = ($stackPtr - 2); $i > $prevNonSpace; $i--) { - $phpcsFile->fixer->replaceToken($i, ' '); - } - - $phpcsFile->fixer->endChangeset(); - } - } - } - }//end if - }//end if - - // We'll need the indent of the class/interface declaration for later. - $classIndent = 0; - for ($i = ($stackPtr - 1); $i > 0; $i--) { - if ($tokens[$i]['line'] === $tokens[$stackPtr]['line']) { - continue; - } - - // We changed lines. - if ($tokens[($i + 1)]['code'] === T_WHITESPACE) { - $classIndent = $tokens[($i + 1)]['length']; - } - - break; - } - - $className = null; - $checkSpacing = true; - - if ($tokens[$stackPtr]['code'] !== T_ANON_CLASS) { - $className = $phpcsFile->findNext(T_STRING, $stackPtr); - } else { - // Ignore the spacing check if this is a simple anon class. - $next = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($next === $tokens[$stackPtr]['scope_opener'] - && $tokens[$next]['line'] > $tokens[$stackPtr]['line'] - ) { - $checkSpacing = false; - } - } - - if ($checkSpacing === true) { - // Spacing of the keyword. - if ($tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) { - $gap = 0; - } else if ($tokens[($stackPtr + 2)]['line'] !== $tokens[$stackPtr]['line']) { - $gap = 'newline'; - } else { - $gap = $tokens[($stackPtr + 1)]['length']; - } - - if ($gap !== 1) { - $error = 'Expected 1 space after %s keyword; %s found'; - $data = [ - $stackPtrType, - $gap, - ]; - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceAfterKeyword', $data); - if ($fix === true) { - if ($gap === 0) { - $phpcsFile->fixer->addContent($stackPtr, ' '); - } else { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ' '); - } - } - } - }//end if - - // Check after the class/interface name. - if ($className !== null - && $tokens[($className + 2)]['line'] === $tokens[$className]['line'] - ) { - $gap = $tokens[($className + 1)]['content']; - if (strlen($gap) !== 1) { - $found = strlen($gap); - $error = 'Expected 1 space after %s name; %s found'; - $data = [ - $stackPtrType, - $found, - ]; - - $fix = $phpcsFile->addFixableError($error, $className, 'SpaceAfterName', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($className + 1), ' '); - } - } - } - - $openingBrace = $tokens[$stackPtr]['scope_opener']; - - // Check positions of the extends and implements keywords. - $compareToken = $stackPtr; - $compareType = 'name'; - if ($tokens[$stackPtr]['code'] === T_ANON_CLASS) { - if (isset($tokens[$stackPtr]['parenthesis_opener']) === true) { - $compareToken = $tokens[$stackPtr]['parenthesis_closer']; - $compareType = 'closing parenthesis'; - } else { - $compareType = 'keyword'; - } - } - - foreach (['extends', 'implements'] as $keywordType) { - $keyword = $phpcsFile->findNext(constant('T_'.strtoupper($keywordType)), ($compareToken + 1), $openingBrace); - if ($keyword !== false) { - if ($tokens[$keyword]['line'] !== $tokens[$compareToken]['line']) { - $error = 'The '.$keywordType.' keyword must be on the same line as the %s '.$compareType; - $data = [$stackPtrType]; - $fix = $phpcsFile->addFixableError($error, $keyword, ucfirst($keywordType).'Line', $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $comments = []; - - for ($i = ($compareToken + 1); $i < $keyword; ++$i) { - if ($tokens[$i]['code'] === T_COMMENT) { - $comments[] = trim($tokens[$i]['content']); - } - - if ($tokens[$i]['code'] === T_WHITESPACE - || $tokens[$i]['code'] === T_COMMENT - ) { - $phpcsFile->fixer->replaceToken($i, ' '); - } - } - - $phpcsFile->fixer->addContent($compareToken, ' '); - if (empty($comments) === false) { - $i = $keyword; - while ($tokens[($i + 1)]['line'] === $tokens[$keyword]['line']) { - ++$i; - } - - $phpcsFile->fixer->addContentBefore($i, ' '.implode(' ', $comments)); - } - - $phpcsFile->fixer->endChangeset(); - }//end if - } else { - // Check the whitespace before. Whitespace after is checked - // later by looking at the whitespace before the first class name - // in the list. - $gap = $tokens[($keyword - 1)]['length']; - if ($gap !== 1) { - $error = 'Expected 1 space before '.$keywordType.' keyword; %s found'; - $data = [$gap]; - $fix = $phpcsFile->addFixableError($error, $keyword, 'SpaceBefore'.ucfirst($keywordType), $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($keyword - 1), ' '); - } - } - }//end if - }//end if - }//end foreach - - // Check each of the extends/implements class names. If the extends/implements - // keyword is the last content on the line, it means we need to check for - // the multi-line format, so we do not include the class names - // from the extends/implements list in the following check. - // Note that classes can only extend one other class, so they can't use a - // multi-line extends format, whereas an interface can extend multiple - // other interfaces, and so uses a multi-line extends format. - if ($tokens[$stackPtr]['code'] === T_INTERFACE) { - $keywordTokenType = T_EXTENDS; - } else { - $keywordTokenType = T_IMPLEMENTS; - } - - $implements = $phpcsFile->findNext($keywordTokenType, ($stackPtr + 1), $openingBrace); - $multiLineImplements = false; - if ($implements !== false) { - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($openingBrace - 1), $implements, true); - if ($tokens[$prev]['line'] !== $tokens[$implements]['line']) { - $multiLineImplements = true; - } - } - - $find = [ - T_STRING, - $keywordTokenType, - ]; - - if ($className !== null) { - $start = $className; - } else if (isset($tokens[$stackPtr]['parenthesis_closer']) === true) { - $start = $tokens[$stackPtr]['parenthesis_closer']; - } else { - $start = $stackPtr; - } - - $classNames = []; - $nextClass = $phpcsFile->findNext($find, ($start + 2), ($openingBrace - 1)); - while ($nextClass !== false) { - $classNames[] = $nextClass; - $nextClass = $phpcsFile->findNext($find, ($nextClass + 1), ($openingBrace - 1)); - } - - $classCount = count($classNames); - $checkingImplements = false; - $implementsToken = null; - foreach ($classNames as $n => $className) { - if ($tokens[$className]['code'] === $keywordTokenType) { - $checkingImplements = true; - $implementsToken = $className; - - continue; - } - - if ($checkingImplements === true - && $multiLineImplements === true - && ($tokens[($className - 1)]['code'] !== T_NS_SEPARATOR - || ($tokens[($className - 2)]['code'] !== T_STRING - && $tokens[($className - 2)]['code'] !== T_NAMESPACE)) - ) { - $prev = $phpcsFile->findPrevious( - [ - T_NS_SEPARATOR, - T_WHITESPACE, - ], - ($className - 1), - $implements, - true - ); - - if ($prev === $implementsToken && $tokens[$className]['line'] !== ($tokens[$prev]['line'] + 1)) { - if ($keywordTokenType === T_EXTENDS) { - $error = 'The first item in a multi-line extends list must be on the line following the extends keyword'; - $fix = $phpcsFile->addFixableError($error, $className, 'FirstExtendsInterfaceSameLine'); - } else { - $error = 'The first item in a multi-line implements list must be on the line following the implements keyword'; - $fix = $phpcsFile->addFixableError($error, $className, 'FirstInterfaceSameLine'); - } - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($prev + 1); $i < $className; $i++) { - if ($tokens[$i]['code'] !== T_WHITESPACE) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->addNewline($prev); - $phpcsFile->fixer->endChangeset(); - } - } else if ((isset(Tokens::$commentTokens[$tokens[$prev]['code']]) === false - && $tokens[$prev]['line'] !== ($tokens[$className]['line'] - 1)) - || $tokens[$prev]['line'] === $tokens[$className]['line'] - ) { - if ($keywordTokenType === T_EXTENDS) { - $error = 'Only one interface may be specified per line in a multi-line extends declaration'; - $fix = $phpcsFile->addFixableError($error, $className, 'ExtendsInterfaceSameLine'); - } else { - $error = 'Only one interface may be specified per line in a multi-line implements declaration'; - $fix = $phpcsFile->addFixableError($error, $className, 'InterfaceSameLine'); - } - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($prev + 1); $i < $className; $i++) { - if ($tokens[$i]['code'] !== T_WHITESPACE) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->addNewline($prev); - $phpcsFile->fixer->endChangeset(); - } - } else { - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($className - 1), $implements); - if ($tokens[$prev]['line'] !== $tokens[$className]['line']) { - $found = 0; - } else { - $found = $tokens[$prev]['length']; - } - - $expected = ($classIndent + $this->indent); - if ($found !== $expected) { - $error = 'Expected %s spaces before interface name; %s found'; - $data = [ - $expected, - $found, - ]; - $fix = $phpcsFile->addFixableError($error, $className, 'InterfaceWrongIndent', $data); - if ($fix === true) { - $padding = str_repeat(' ', $expected); - if ($found === 0) { - $phpcsFile->fixer->addContent($prev, $padding); - } else { - $phpcsFile->fixer->replaceToken($prev, $padding); - } - } - } - }//end if - } else if ($tokens[($className - 1)]['code'] !== T_NS_SEPARATOR - || ($tokens[($className - 2)]['code'] !== T_STRING - && $tokens[($className - 2)]['code'] !== T_NAMESPACE) - ) { - // Not part of a longer fully qualified or namespace relative class name. - if ($tokens[($className - 1)]['code'] === T_COMMA - || ($tokens[($className - 1)]['code'] === T_NS_SEPARATOR - && $tokens[($className - 2)]['code'] === T_COMMA) - ) { - $error = 'Expected 1 space before "%s"; 0 found'; - $data = [$tokens[$className]['content']]; - $fix = $phpcsFile->addFixableError($error, ($nextComma + 1), 'NoSpaceBeforeName', $data); - if ($fix === true) { - $phpcsFile->fixer->addContentBefore(($nextComma + 1), ' '); - } - } else { - if ($tokens[($className - 1)]['code'] === T_NS_SEPARATOR) { - $prev = ($className - 2); - } else { - $prev = ($className - 1); - } - - $last = $phpcsFile->findPrevious(T_WHITESPACE, $prev, null, true); - $content = $phpcsFile->getTokensAsString(($last + 1), ($prev - $last)); - if ($content !== ' ') { - $found = strlen($content); - - $error = 'Expected 1 space before "%s"; %s found'; - $data = [ - $tokens[$className]['content'], - $found, - ]; - - $fix = $phpcsFile->addFixableError($error, $className, 'SpaceBeforeName', $data); - if ($fix === true) { - if ($tokens[$prev]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($prev, ' '); - while ($tokens[--$prev]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->replaceToken($prev, ' '); - } - - $phpcsFile->fixer->endChangeset(); - } else { - $phpcsFile->fixer->addContent($prev, ' '); - } - } - }//end if - }//end if - }//end if - - if ($checkingImplements === true - && $tokens[($className + 1)]['code'] !== T_NS_SEPARATOR - && $tokens[($className + 1)]['code'] !== T_COMMA - ) { - if ($n !== ($classCount - 1)) { - // This is not the last class name, and the comma - // is not where we expect it to be. - if ($tokens[($className + 2)]['code'] !== $keywordTokenType) { - $error = 'Expected 0 spaces between "%s" and comma; %s found'; - $data = [ - $tokens[$className]['content'], - $tokens[($className + 1)]['length'], - ]; - - $fix = $phpcsFile->addFixableError($error, $className, 'SpaceBeforeComma', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($className + 1), ''); - } - } - } - - $nextComma = $phpcsFile->findNext(T_COMMA, $className); - } else { - $nextComma = ($className + 1); - }//end if - }//end foreach - - }//end processOpen() - - - /** - * Processes the closing section of a class declaration. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function processClose(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Check that the closing brace comes right after the code body. - $closeBrace = $tokens[$stackPtr]['scope_closer']; - $prevContent = $phpcsFile->findPrevious(T_WHITESPACE, ($closeBrace - 1), null, true); - if ($prevContent !== $tokens[$stackPtr]['scope_opener'] - && $tokens[$prevContent]['line'] !== ($tokens[$closeBrace]['line'] - 1) - ) { - $error = 'The closing brace for the %s must go on the next line after the body'; - $data = [$tokens[$stackPtr]['content']]; - $fix = $phpcsFile->addFixableError($error, $closeBrace, 'CloseBraceAfterBody', $data); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($prevContent + 1); $tokens[$i]['line'] !== $tokens[$closeBrace]['line']; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - if (strpos($tokens[$prevContent]['content'], $phpcsFile->eolChar) === false) { - $phpcsFile->fixer->addNewline($prevContent); - } - - $phpcsFile->fixer->endChangeset(); - } - }//end if - - if ($tokens[$stackPtr]['code'] !== T_ANON_CLASS) { - // Check the closing brace is on it's own line, but allow - // for comments like "//end class". - $ignoreTokens = Tokens::$phpcsCommentTokens; - $ignoreTokens[] = T_WHITESPACE; - $ignoreTokens[] = T_COMMENT; - $ignoreTokens[] = T_SEMICOLON; - $nextContent = $phpcsFile->findNext($ignoreTokens, ($closeBrace + 1), null, true); - if ($tokens[$nextContent]['line'] === $tokens[$closeBrace]['line']) { - $type = strtolower($tokens[$stackPtr]['content']); - $error = 'Closing %s brace must be on a line by itself'; - $data = [$type]; - $phpcsFile->addError($error, $closeBrace, 'CloseBraceSameLine', $data); - } - } - - }//end processClose() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Classes/PropertyDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Classes/PropertyDeclarationSniff.php deleted file mode 100644 index 473aff6..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Classes/PropertyDeclarationSniff.php +++ /dev/null @@ -1,311 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Sniffs\Classes; - -use Exception; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\AbstractVariableSniff; -use PHP_CodeSniffer\Util\Tokens; - -class PropertyDeclarationSniff extends AbstractVariableSniff -{ - - - /** - * Processes the function tokens within the class. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position where the token was found. - * - * @return void - */ - protected function processMemberVar(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['content'][1] === '_') { - $error = 'Property name "%s" should not be prefixed with an underscore to indicate visibility'; - $data = [$tokens[$stackPtr]['content']]; - $phpcsFile->addWarning($error, $stackPtr, 'Underscore', $data); - } - - // Detect multiple properties defined at the same time. Throw an error - // for this, but also only process the first property in the list so we don't - // repeat errors. - $find = Tokens::$scopeModifiers; - $find[] = T_VARIABLE; - $find[] = T_VAR; - $find[] = T_READONLY; - $find[] = T_FINAL; - $find[] = T_ABSTRACT; - $find[] = T_SEMICOLON; - $find[] = T_OPEN_CURLY_BRACKET; - - $prev = $phpcsFile->findPrevious($find, ($stackPtr - 1)); - if ($tokens[$prev]['code'] === T_VARIABLE) { - return; - } - - if ($tokens[$prev]['code'] === T_VAR) { - $error = 'The var keyword must not be used to declare a property'; - $phpcsFile->addError($error, $stackPtr, 'VarUsed'); - } - - $next = $phpcsFile->findNext([T_VARIABLE, T_SEMICOLON], ($stackPtr + 1)); - if ($next !== false && $tokens[$next]['code'] === T_VARIABLE) { - $error = 'There must not be more than one property declared per statement'; - $phpcsFile->addError($error, $stackPtr, 'Multiple'); - } - - try { - $propertyInfo = $phpcsFile->getMemberProperties($stackPtr); - if (empty($propertyInfo) === true) { - return; - } - } catch (Exception $e) { - // Turns out not to be a property after all. - return; - } - - if ($propertyInfo['type'] !== '') { - $typeToken = $propertyInfo['type_end_token']; - $error = 'There must be 1 space after the property type declaration; %s found'; - if ($tokens[($typeToken + 1)]['code'] !== T_WHITESPACE) { - $data = ['0']; - $fix = $phpcsFile->addFixableError($error, $typeToken, 'SpacingAfterType', $data); - if ($fix === true) { - $phpcsFile->fixer->addContent($typeToken, ' '); - } - } else if ($tokens[($typeToken + 1)]['content'] !== ' ') { - $next = $phpcsFile->findNext(T_WHITESPACE, ($typeToken + 1), null, true); - if ($tokens[$next]['line'] !== $tokens[$typeToken]['line']) { - $found = 'newline'; - } else { - $found = $tokens[($typeToken + 1)]['length']; - } - - $data = [$found]; - - $nextNonWs = $phpcsFile->findNext(Tokens::$emptyTokens, ($typeToken + 1), null, true); - if ($nextNonWs !== $next) { - $phpcsFile->addError($error, $typeToken, 'SpacingAfterType', $data); - } else { - $fix = $phpcsFile->addFixableError($error, $typeToken, 'SpacingAfterType', $data); - if ($fix === true) { - if ($found === 'newline') { - $phpcsFile->fixer->beginChangeset(); - for ($x = ($typeToken + 1); $x < $next; $x++) { - $phpcsFile->fixer->replaceToken($x, ''); - } - - $phpcsFile->fixer->addContent($typeToken, ' '); - $phpcsFile->fixer->endChangeset(); - } else { - $phpcsFile->fixer->replaceToken(($typeToken + 1), ' '); - } - } - } - }//end if - }//end if - - if ($propertyInfo['scope_specified'] === false && $propertyInfo['set_scope'] === false) { - $error = 'Visibility must be declared on property "%s"'; - $data = [$tokens[$stackPtr]['content']]; - $phpcsFile->addError($error, $stackPtr, 'ScopeMissing', $data); - } - - /* - * Note: per PSR-PER section 4.6 v 2.1/3.0, the order should be: - * - Inheritance modifier: `abstract` or `final`. - * - Visibility modifier: `public`, `protected`, or `private`. - * - Set-visibility modifier: `public(set)`, `protected(set)`, or `private(set)` - * - Scope modifier: `static`. - * - Mutation modifier: `readonly`. - * - Type declaration. - * - Name. - * - * Ref: - * - https://www.php-fig.org/per/coding-style/#46-modifier-keywords - * - https://github.com/php-fig/per-coding-style/pull/99 - * - * The `static` and `readonly` modifiers are mutually exclusive and cannot be used together. - * - * Based on that, the below modifier keyword order checks are sufficient (for now). - */ - - $hasVisibilityModifier = ($propertyInfo['scope_specified'] === true || $propertyInfo['set_scope'] !== false); - $lastVisibilityModifier = $phpcsFile->findPrevious(Tokens::$scopeModifiers, ($stackPtr - 1)); - $firstVisibilityModifier = $lastVisibilityModifier; - - if ($propertyInfo['scope_specified'] === true && $propertyInfo['set_scope'] !== false) { - $scopePtr = $phpcsFile->findPrevious([T_PUBLIC, T_PROTECTED, T_PRIVATE], ($stackPtr - 1)); - $setScopePtr = $phpcsFile->findPrevious([T_PUBLIC_SET, T_PROTECTED_SET, T_PRIVATE_SET], ($stackPtr - 1)); - if ($scopePtr > $setScopePtr) { - $error = 'The "read"-visibility must come before the "write"-visibility'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'AvizKeywordOrder'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - for ($i = ($scopePtr + 1); $scopePtr < $stackPtr; $i++) { - if ($tokens[$i]['code'] !== T_WHITESPACE) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->replaceToken($scopePtr, ''); - $phpcsFile->fixer->addContentBefore($setScopePtr, $tokens[$scopePtr]['content'].' '); - - $phpcsFile->fixer->endChangeset(); - } - } - - $firstVisibilityModifier = min($scopePtr, $setScopePtr); - }//end if - - if ($hasVisibilityModifier === true && $propertyInfo['is_final'] === true) { - $scopePtr = $firstVisibilityModifier; - $finalPtr = $phpcsFile->findPrevious(T_FINAL, ($stackPtr - 1)); - if ($finalPtr > $scopePtr) { - $error = 'The final declaration must come before the visibility declaration'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'FinalAfterVisibility'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - for ($i = ($finalPtr + 1); $finalPtr < $stackPtr; $i++) { - if ($tokens[$i]['code'] !== T_WHITESPACE) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->replaceToken($finalPtr, ''); - $phpcsFile->fixer->addContentBefore($scopePtr, $tokens[$finalPtr]['content'].' '); - - $phpcsFile->fixer->endChangeset(); - } - } - }//end if - - if ($hasVisibilityModifier === true && $propertyInfo['is_abstract'] === true) { - $scopePtr = $firstVisibilityModifier; - $abstractPtr = $phpcsFile->findPrevious(T_ABSTRACT, ($stackPtr - 1)); - if ($abstractPtr > $scopePtr) { - $error = 'The abstract declaration must come before the visibility declaration'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'AbstractAfterVisibility'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - for ($i = ($abstractPtr + 1); $abstractPtr < $stackPtr; $i++) { - if ($tokens[$i]['code'] !== T_WHITESPACE) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->replaceToken($abstractPtr, ''); - $phpcsFile->fixer->addContentBefore($scopePtr, $tokens[$abstractPtr]['content'].' '); - - $phpcsFile->fixer->endChangeset(); - } - } - }//end if - - if ($hasVisibilityModifier === true && $propertyInfo['is_static'] === true) { - $scopePtr = $lastVisibilityModifier; - $staticPtr = $phpcsFile->findPrevious(T_STATIC, ($stackPtr - 1)); - if ($scopePtr > $staticPtr) { - $error = 'The static declaration must come after the visibility declaration'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'StaticBeforeVisibility'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - for ($i = ($staticPtr + 1); $staticPtr < $stackPtr; $i++) { - if ($tokens[$i]['code'] !== T_WHITESPACE) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->replaceToken($staticPtr, ''); - $phpcsFile->fixer->addContent($scopePtr, ' '.$tokens[$staticPtr]['content']); - - $phpcsFile->fixer->endChangeset(); - } - } - }//end if - - if ($hasVisibilityModifier === true && $propertyInfo['is_readonly'] === true) { - $scopePtr = $lastVisibilityModifier; - $readonlyPtr = $phpcsFile->findPrevious(T_READONLY, ($stackPtr - 1)); - if ($scopePtr > $readonlyPtr) { - $error = 'The readonly declaration must come after the visibility declaration'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'ReadonlyBeforeVisibility'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - for ($i = ($readonlyPtr + 1); $readonlyPtr < $stackPtr; $i++) { - if ($tokens[$i]['code'] !== T_WHITESPACE) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->replaceToken($readonlyPtr, ''); - $phpcsFile->fixer->addContent($scopePtr, ' '.$tokens[$readonlyPtr]['content']); - - $phpcsFile->fixer->endChangeset(); - } - } - }//end if - - }//end processMemberVar() - - - /** - * Processes normal variables. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position where the token was found. - * - * @return void - */ - protected function processVariable(File $phpcsFile, $stackPtr) - { - /* - We don't care about normal variables. - */ - - }//end processVariable() - - - /** - * Processes variables in double quoted strings. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position where the token was found. - * - * @return void - */ - protected function processVariableInString(File $phpcsFile, $stackPtr) - { - /* - We don't care about normal variables. - */ - - }//end processVariableInString() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/ControlStructures/ControlStructureSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/ControlStructures/ControlStructureSpacingSniff.php deleted file mode 100644 index 6cbb364..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/ControlStructures/ControlStructureSpacingSniff.php +++ /dev/null @@ -1,141 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Sniffs\ControlStructures; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ControlStructureSpacingSniff implements Sniff -{ - - /** - * How many spaces should follow the opening bracket. - * - * @var integer - */ - public $requiredSpacesAfterOpen = 0; - - /** - * How many spaces should precede the closing bracket. - * - * @var integer - */ - public $requiredSpacesBeforeClose = 0; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_IF, - T_WHILE, - T_FOREACH, - T_FOR, - T_SWITCH, - T_ELSEIF, - T_CATCH, - T_MATCH, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $this->requiredSpacesAfterOpen = (int) $this->requiredSpacesAfterOpen; - $this->requiredSpacesBeforeClose = (int) $this->requiredSpacesBeforeClose; - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['parenthesis_opener']) === false - || isset($tokens[$stackPtr]['parenthesis_closer']) === false - ) { - return; - } - - $parenOpener = $tokens[$stackPtr]['parenthesis_opener']; - $parenCloser = $tokens[$stackPtr]['parenthesis_closer']; - $nextContent = $phpcsFile->findNext(T_WHITESPACE, ($parenOpener + 1), null, true); - if (in_array($tokens[$nextContent]['code'], Tokens::$commentTokens, true) === false) { - $spaceAfterOpen = 0; - if ($tokens[($parenOpener + 1)]['code'] === T_WHITESPACE) { - if (strpos($tokens[($parenOpener + 1)]['content'], $phpcsFile->eolChar) !== false) { - $spaceAfterOpen = 'newline'; - } else { - $spaceAfterOpen = $tokens[($parenOpener + 1)]['length']; - } - } - - $phpcsFile->recordMetric($stackPtr, 'Spaces after control structure open parenthesis', $spaceAfterOpen); - - if ($spaceAfterOpen !== $this->requiredSpacesAfterOpen) { - $error = 'Expected %s spaces after opening bracket; %s found'; - $data = [ - $this->requiredSpacesAfterOpen, - $spaceAfterOpen, - ]; - $fix = $phpcsFile->addFixableError($error, ($parenOpener + 1), 'SpacingAfterOpenBrace', $data); - if ($fix === true) { - $padding = str_repeat(' ', $this->requiredSpacesAfterOpen); - if ($spaceAfterOpen === 0) { - $phpcsFile->fixer->addContent($parenOpener, $padding); - } else if ($spaceAfterOpen === 'newline') { - $phpcsFile->fixer->replaceToken(($parenOpener + 1), ''); - } else { - $phpcsFile->fixer->replaceToken(($parenOpener + 1), $padding); - } - } - } - }//end if - - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($parenCloser - 1), $parenOpener, true); - if ($tokens[$prev]['line'] === $tokens[$parenCloser]['line']) { - $spaceBeforeClose = 0; - if ($tokens[($parenCloser - 1)]['code'] === T_WHITESPACE) { - $spaceBeforeClose = strlen(ltrim($tokens[($parenCloser - 1)]['content'], $phpcsFile->eolChar)); - } - - $phpcsFile->recordMetric($stackPtr, 'Spaces before control structure close parenthesis', $spaceBeforeClose); - - if ($spaceBeforeClose !== $this->requiredSpacesBeforeClose) { - $error = 'Expected %s spaces before closing bracket; %s found'; - $data = [ - $this->requiredSpacesBeforeClose, - $spaceBeforeClose, - ]; - $fix = $phpcsFile->addFixableError($error, ($parenCloser - 1), 'SpaceBeforeCloseBrace', $data); - if ($fix === true) { - $padding = str_repeat(' ', $this->requiredSpacesBeforeClose); - if ($spaceBeforeClose === 0) { - $phpcsFile->fixer->addContentBefore($parenCloser, $padding); - } else { - $phpcsFile->fixer->replaceToken(($parenCloser - 1), $padding); - } - } - } - }//end if - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/ControlStructures/ElseIfDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/ControlStructures/ElseIfDeclarationSniff.php deleted file mode 100644 index 89b2000..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/ControlStructures/ElseIfDeclarationSniff.php +++ /dev/null @@ -1,72 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Sniffs\ControlStructures; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ElseIfDeclarationSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_ELSE, - T_ELSEIF, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['code'] === T_ELSEIF) { - $phpcsFile->recordMetric($stackPtr, 'Use of ELSE IF or ELSEIF', 'elseif'); - return; - } - - $next = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($tokens[$next]['code'] === T_IF) { - $phpcsFile->recordMetric($stackPtr, 'Use of ELSE IF or ELSEIF', 'else if'); - $error = 'Usage of ELSE IF is discouraged; use ELSEIF instead'; - $fix = $phpcsFile->addFixableWarning($error, $stackPtr, 'NotAllowed'); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($stackPtr, 'elseif'); - for ($i = ($stackPtr + 1); $i <= $next; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php deleted file mode 100644 index 4fe286b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php +++ /dev/null @@ -1,405 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Sniffs\ControlStructures; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class SwitchDeclarationSniff implements Sniff -{ - - /** - * The number of spaces code should be indented. - * - * @var integer - */ - public $indent = 4; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_SWITCH]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // We can't process SWITCH statements unless we know where they start and end. - if (isset($tokens[$stackPtr]['scope_opener']) === false - || isset($tokens[$stackPtr]['scope_closer']) === false - ) { - return; - } - - $switch = $tokens[$stackPtr]; - $nextCase = $stackPtr; - $caseAlignment = ($switch['column'] + $this->indent); - - while (($nextCase = $this->findNextCase($phpcsFile, ($nextCase + 1), $switch['scope_closer'])) !== false) { - if ($tokens[$nextCase]['code'] === T_DEFAULT) { - $type = 'default'; - } else { - $type = 'case'; - } - - if ($tokens[$nextCase]['content'] !== strtolower($tokens[$nextCase]['content'])) { - $expected = strtolower($tokens[$nextCase]['content']); - $error = strtoupper($type).' keyword must be lowercase; expected "%s" but found "%s"'; - $data = [ - $expected, - $tokens[$nextCase]['content'], - ]; - - $fix = $phpcsFile->addFixableError($error, $nextCase, $type.'NotLower', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($nextCase, $expected); - } - } - - if ($type === 'case' - && ($tokens[($nextCase + 1)]['code'] !== T_WHITESPACE - || $tokens[($nextCase + 1)]['content'] !== ' ') - ) { - $error = 'CASE keyword must be followed by a single space'; - $fix = $phpcsFile->addFixableError($error, $nextCase, 'SpacingAfterCase'); - if ($fix === true) { - if ($tokens[($nextCase + 1)]['code'] !== T_WHITESPACE) { - $phpcsFile->fixer->addContent($nextCase, ' '); - } else { - $phpcsFile->fixer->replaceToken(($nextCase + 1), ' '); - } - } - } - - $opener = $tokens[$nextCase]['scope_opener']; - $nextCloser = $tokens[$nextCase]['scope_closer']; - if ($tokens[$opener]['code'] === T_COLON) { - if ($tokens[($opener - 1)]['code'] === T_WHITESPACE) { - $error = 'There must be no space before the colon in a '.strtoupper($type).' statement'; - $fix = $phpcsFile->addFixableError($error, $nextCase, 'SpaceBeforeColon'.strtoupper($type)); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($opener - 1), ''); - } - } - - for ($next = ($opener + 1); $next < $nextCloser; $next++) { - if (isset(Tokens::$emptyTokens[$tokens[$next]['code']]) === false - || (isset(Tokens::$commentTokens[$tokens[$next]['code']]) === true - && $tokens[$next]['line'] !== $tokens[$opener]['line']) - ) { - break; - } - } - - if ($tokens[$next]['line'] !== ($tokens[$opener]['line'] + 1)) { - $error = 'The '.strtoupper($type).' body must start on the line following the statement'; - $fix = $phpcsFile->addFixableError($error, $nextCase, 'BodyOnNextLine'.strtoupper($type)); - if ($fix === true) { - if ($tokens[$next]['line'] === $tokens[$opener]['line']) { - $padding = str_repeat(' ', ($caseAlignment + $this->indent - 1)); - $phpcsFile->fixer->addContentBefore($next, $phpcsFile->eolChar.$padding); - } else { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($opener + 1); $i < $next; $i++) { - if ($tokens[$i]['line'] === $tokens[$opener]['line']) { - // Ignore trailing comments. - continue; - } - - if ($tokens[$i]['line'] === $tokens[$next]['line']) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - }//end if - }//end if - - if ($tokens[$nextCloser]['scope_condition'] === $nextCase) { - // Only need to check some things once, even if the - // closer is shared between multiple case statements, or even - // the default case. - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($nextCloser - 1), $nextCase, true); - if ($tokens[$prev]['line'] === $tokens[$nextCloser]['line']) { - $error = 'Terminating statement must be on a line by itself'; - $fix = $phpcsFile->addFixableError($error, $nextCloser, 'BreakNotNewLine'); - if ($fix === true) { - $phpcsFile->fixer->addNewline($prev); - $phpcsFile->fixer->replaceToken($nextCloser, trim($tokens[$nextCloser]['content'])); - } - } else { - $diff = ($tokens[$nextCase]['column'] + $this->indent - $tokens[$nextCloser]['column']); - if ($diff !== 0) { - $error = 'Terminating statement must be indented to the same level as the CASE body'; - $fix = $phpcsFile->addFixableError($error, $nextCloser, 'BreakIndent'); - if ($fix === true) { - if ($diff > 0) { - $phpcsFile->fixer->addContentBefore($nextCloser, str_repeat(' ', $diff)); - } else { - $phpcsFile->fixer->substrToken(($nextCloser - 1), 0, $diff); - } - } - } - }//end if - }//end if - } else { - $error = strtoupper($type).' statements must be defined using a colon'; - if ($tokens[$opener]['code'] === T_SEMICOLON) { - $fix = $phpcsFile->addFixableError($error, $nextCase, 'WrongOpener'.$type); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($opener, ':'); - } - } else { - // Probably a case/default statement with colon + curly braces. - $phpcsFile->addError($error, $nextCase, 'WrongOpener'.$type); - } - }//end if - - // We only want cases from here on in. - if ($type !== 'case') { - continue; - } - - $nextCode = $phpcsFile->findNext(T_WHITESPACE, ($opener + 1), $nextCloser, true); - - if ($tokens[$nextCode]['code'] !== T_CASE && $tokens[$nextCode]['code'] !== T_DEFAULT) { - // This case statement has content. If the next case or default comes - // before the closer, it means we don't have an obvious terminating - // statement and need to make some more effort to find one. If we - // don't, we do need a comment. - $nextCode = $this->findNextCase($phpcsFile, ($opener + 1), $nextCloser); - if ($nextCode !== false) { - $prevCode = $phpcsFile->findPrevious(T_WHITESPACE, ($nextCode - 1), $nextCase, true); - if (isset(Tokens::$commentTokens[$tokens[$prevCode]['code']]) === false - && $this->findNestedTerminator($phpcsFile, ($opener + 1), $nextCode) === false - ) { - $error = 'There must be a comment when fall-through is intentional in a non-empty case body'; - $phpcsFile->addError($error, $nextCase, 'TerminatingComment'); - } - } - } - }//end while - - }//end process() - - - /** - * Find the next CASE or DEFAULT statement from a point in the file. - * - * Note that nested switches are ignored. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position to start looking at. - * @param int $end The position to stop looking at. - * - * @return int|false - */ - private function findNextCase($phpcsFile, $stackPtr, $end) - { - $tokens = $phpcsFile->getTokens(); - while (($stackPtr = $phpcsFile->findNext([T_CASE, T_DEFAULT, T_SWITCH], $stackPtr, $end)) !== false) { - // Skip nested SWITCH statements; they are handled on their own. - if ($tokens[$stackPtr]['code'] === T_SWITCH) { - $stackPtr = $tokens[$stackPtr]['scope_closer']; - continue; - } - - break; - } - - return $stackPtr; - - }//end findNextCase() - - - /** - * Returns the position of the nested terminating statement. - * - * Returns false if no terminating statement was found. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position to start looking at. - * @param int $end The position to stop looking at. - * - * @return int|bool - */ - private function findNestedTerminator($phpcsFile, $stackPtr, $end) - { - $tokens = $phpcsFile->getTokens(); - - $lastToken = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($end - 1), $stackPtr, true); - if ($lastToken === false) { - return false; - } - - if ($tokens[$lastToken]['code'] === T_CLOSE_CURLY_BRACKET) { - // We found a closing curly bracket and want to check if its block - // belongs to a SWITCH, IF, ELSEIF or ELSE, TRY, CATCH OR FINALLY clause. - // If yes, we continue searching for a terminating statement within that - // block. Note that we have to make sure that every block of - // the entire if/else/switch statement has a terminating statement. - // For a try/catch/finally statement, either the finally block has - // to have a terminating statement or every try/catch block has to have one. - $currentCloser = $lastToken; - $hasElseBlock = false; - $hasCatchWithoutTerminator = false; - do { - $scopeOpener = $tokens[$currentCloser]['scope_opener']; - $scopeCloser = $tokens[$currentCloser]['scope_closer']; - - $prevToken = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($scopeOpener - 1), $stackPtr, true); - if ($prevToken === false) { - return false; - } - - // SWITCH, IF, ELSEIF, CATCH clauses possess a condition we have to account for. - if ($tokens[$prevToken]['code'] === T_CLOSE_PARENTHESIS) { - $prevToken = $tokens[$prevToken]['parenthesis_owner']; - } - - if ($tokens[$prevToken]['code'] === T_IF) { - // If we have not encountered an ELSE clause by now, we cannot - // be sure that the whole statement terminates in every case. - if ($hasElseBlock === false) { - return false; - } - - return $this->findNestedTerminator($phpcsFile, ($scopeOpener + 1), $scopeCloser); - } else if ($tokens[$prevToken]['code'] === T_ELSEIF - || $tokens[$prevToken]['code'] === T_ELSE - ) { - // If we find a terminating statement within this block, - // we continue with the previous ELSEIF or IF clause. - $hasTerminator = $this->findNestedTerminator($phpcsFile, ($scopeOpener + 1), $scopeCloser); - if ($hasTerminator === false) { - return false; - } - - $currentCloser = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($prevToken - 1), $stackPtr, true); - if ($tokens[$prevToken]['code'] === T_ELSE) { - $hasElseBlock = true; - } - } else if ($tokens[$prevToken]['code'] === T_FINALLY) { - // If we find a terminating statement within this block, - // the whole try/catch/finally statement is covered. - $hasTerminator = $this->findNestedTerminator($phpcsFile, ($scopeOpener + 1), $scopeCloser); - if ($hasTerminator !== false) { - return $hasTerminator; - } - - // Otherwise, we continue with the previous TRY or CATCH clause. - $currentCloser = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($prevToken - 1), $stackPtr, true); - } else if ($tokens[$prevToken]['code'] === T_TRY) { - // If we've seen CATCH blocks without terminator statement and - // have not seen a FINALLY *with* a terminator statement, we - // don't even need to bother checking the TRY. - if ($hasCatchWithoutTerminator === true) { - return false; - } - - return $this->findNestedTerminator($phpcsFile, ($scopeOpener + 1), $scopeCloser); - } else if ($tokens[$prevToken]['code'] === T_CATCH) { - // Keep track of seen catch statements without terminating statement, - // but don't bow out yet as there may still be a FINALLY clause - // with a terminating statement before the CATCH. - $hasTerminator = $this->findNestedTerminator($phpcsFile, ($scopeOpener + 1), $scopeCloser); - if ($hasTerminator === false) { - $hasCatchWithoutTerminator = true; - } - - $currentCloser = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($prevToken - 1), $stackPtr, true); - } else if ($tokens[$prevToken]['code'] === T_SWITCH) { - $hasDefaultBlock = false; - $endOfSwitch = $tokens[$prevToken]['scope_closer']; - $nextCase = $prevToken; - - // We look for a terminating statement within every blocks. - while (($nextCase = $this->findNextCase($phpcsFile, ($nextCase + 1), $endOfSwitch)) !== false) { - if ($tokens[$nextCase]['code'] === T_DEFAULT) { - $hasDefaultBlock = true; - } - - $opener = $tokens[$nextCase]['scope_opener']; - - $nextCode = $phpcsFile->findNext(Tokens::$emptyTokens, ($opener + 1), $endOfSwitch, true); - if ($tokens[$nextCode]['code'] === T_CASE || $tokens[$nextCode]['code'] === T_DEFAULT) { - // This case statement has no content, so skip it. - continue; - } - - $endOfCase = $this->findNextCase($phpcsFile, ($opener + 1), $endOfSwitch); - if ($endOfCase === false) { - $endOfCase = $endOfSwitch; - } - - $hasTerminator = $this->findNestedTerminator($phpcsFile, ($opener + 1), $endOfCase); - if ($hasTerminator === false) { - return false; - } - }//end while - - // If we have not encountered a DEFAULT block by now, we cannot - // be sure that the whole statement terminates in every case. - if ($hasDefaultBlock === false) { - return false; - } - - return $hasTerminator; - } else { - return false; - }//end if - } while ($currentCloser !== false && $tokens[$currentCloser]['code'] === T_CLOSE_CURLY_BRACKET); - - return true; - } else if ($tokens[$lastToken]['code'] === T_SEMICOLON) { - // We found the last statement of the CASE. Now we want to - // check whether it is a terminating one. - $terminators = [ - T_RETURN => T_RETURN, - T_BREAK => T_BREAK, - T_CONTINUE => T_CONTINUE, - T_THROW => T_THROW, - T_EXIT => T_EXIT, - T_GOTO => T_GOTO, - ]; - - $terminator = $phpcsFile->findStartOfStatement(($lastToken - 1)); - if (isset($terminators[$tokens[$terminator]['code']]) === true) { - return $terminator; - } - }//end if - - return false; - - }//end findNestedTerminator() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Files/ClosingTagSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Files/ClosingTagSniff.php deleted file mode 100644 index 5b2ecfa..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Files/ClosingTagSniff.php +++ /dev/null @@ -1,89 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ClosingTagSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return int - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Make sure this file only contains PHP code. - for ($i = 0; $i < $phpcsFile->numTokens; $i++) { - if ($tokens[$i]['code'] === T_INLINE_HTML - && trim($tokens[$i]['content']) !== '' - ) { - return $phpcsFile->numTokens; - } - } - - // Find the last non-empty token. - for ($last = ($phpcsFile->numTokens - 1); $last > 0; $last--) { - if (trim($tokens[$last]['content']) !== '') { - break; - } - } - - if ($tokens[$last]['code'] === T_CLOSE_TAG) { - $error = 'A closing tag is not permitted at the end of a PHP file'; - $fix = $phpcsFile->addFixableError($error, $last, 'NotAllowed'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($last, $phpcsFile->eolChar); - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($last - 1), null, true); - if ($tokens[$prev]['code'] !== T_SEMICOLON - && $tokens[$prev]['code'] !== T_CLOSE_CURLY_BRACKET - && $tokens[$prev]['code'] !== T_OPEN_TAG - ) { - $phpcsFile->fixer->addContent($prev, ';'); - } - - $phpcsFile->fixer->endChangeset(); - } - - $phpcsFile->recordMetric($stackPtr, 'PHP closing tag at end of PHP-only file', 'yes'); - } else { - $phpcsFile->recordMetric($stackPtr, 'PHP closing tag at end of PHP-only file', 'no'); - }//end if - - // Ignore the rest of the file. - return $phpcsFile->numTokens; - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Files/EndFileNewlineSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Files/EndFileNewlineSniff.php deleted file mode 100644 index bcea5c4..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Files/EndFileNewlineSniff.php +++ /dev/null @@ -1,107 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class EndFileNewlineSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_OPEN_TAG, - T_OPEN_TAG_WITH_ECHO, - ]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return int - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($phpcsFile->findNext(T_INLINE_HTML, ($stackPtr + 1)) !== false) { - return $phpcsFile->numTokens; - } - - // Skip to the end of the file. - $tokens = $phpcsFile->getTokens(); - $lastToken = ($phpcsFile->numTokens - 1); - - if ($tokens[$lastToken]['content'] === '') { - $lastToken--; - } - - // Hard-coding the expected \n in this sniff as it is PSR-2 specific and - // PSR-2 enforces the use of unix style newlines. - if (substr($tokens[$lastToken]['content'], -1) !== "\n") { - $error = 'Expected 1 newline at end of file; 0 found'; - $fix = $phpcsFile->addFixableError($error, $lastToken, 'NoneFound'); - if ($fix === true) { - $phpcsFile->fixer->addNewline($lastToken); - } - - $phpcsFile->recordMetric($stackPtr, 'Number of newlines at EOF', '0'); - return $phpcsFile->numTokens; - } - - // Go looking for the last non-empty line. - $lastLine = $tokens[$lastToken]['line']; - if ($tokens[$lastToken]['code'] === T_WHITESPACE - || $tokens[$lastToken]['code'] === T_DOC_COMMENT_WHITESPACE - ) { - $lastCode = $phpcsFile->findPrevious([T_WHITESPACE, T_DOC_COMMENT_WHITESPACE], ($lastToken - 1), null, true); - } else { - $lastCode = $lastToken; - } - - $lastCodeLine = $tokens[$lastCode]['line']; - $blankLines = ($lastLine - $lastCodeLine + 1); - $phpcsFile->recordMetric($stackPtr, 'Number of newlines at EOF', $blankLines); - - if ($blankLines > 1) { - $error = 'Expected 1 blank line at end of file; %s found'; - $data = [$blankLines]; - $fix = $phpcsFile->addFixableError($error, $lastCode, 'TooMany', $data); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($lastCode, rtrim($tokens[$lastCode]['content'])); - for ($i = ($lastCode + 1); $i < $lastToken; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->replaceToken($lastToken, $phpcsFile->eolChar); - $phpcsFile->fixer->endChangeset(); - } - } - - // Skip the rest of the file. - return $phpcsFile->numTokens; - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Methods/FunctionCallSignatureSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Methods/FunctionCallSignatureSniff.php deleted file mode 100644 index b171ed8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Methods/FunctionCallSignatureSniff.php +++ /dev/null @@ -1,79 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Sniffs\Methods; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Standards\PEAR\Sniffs\Functions\FunctionCallSignatureSniff as PEARFunctionCallSignatureSniff; -use PHP_CodeSniffer\Util\Tokens; - -class FunctionCallSignatureSniff extends PEARFunctionCallSignatureSniff -{ - - /** - * If TRUE, multiple arguments can be defined per line in a multi-line call. - * - * @var boolean - */ - public $allowMultipleArguments = false; - - - /** - * Processes single-line calls. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $openBracket The position of the opening bracket - * in the stack passed in $tokens. - * @param array $tokens The stack of tokens that make up - * the file. - * - * @return bool - */ - public function isMultiLineCall(File $phpcsFile, $stackPtr, $openBracket, $tokens) - { - // If the first argument is on a new line, this is a multi-line - // function call, even if there is only one argument. - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($openBracket + 1), null, true); - if ($tokens[$next]['line'] !== $tokens[$stackPtr]['line']) { - return true; - } - - $closeBracket = $tokens[$openBracket]['parenthesis_closer']; - - $end = $phpcsFile->findEndOfStatement(($openBracket + 1), [T_COLON]); - while ($tokens[$end]['code'] === T_COMMA) { - // If the next bit of code is not on the same line, this is a - // multi-line function call. - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($end + 1), $closeBracket, true); - if ($next === false) { - return false; - } - - if ($tokens[$next]['line'] !== $tokens[$end]['line']) { - return true; - } - - $end = $phpcsFile->findEndOfStatement($next, [T_COLON]); - } - - // We've reached the last argument, so see if the next content - // (should be the close bracket) is also on the same line. - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($end + 1), $closeBracket, true); - if ($next !== false && $tokens[$next]['line'] !== $tokens[$end]['line']) { - return true; - } - - return false; - - }//end isMultiLineCall() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Methods/FunctionClosingBraceSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Methods/FunctionClosingBraceSniff.php deleted file mode 100644 index fca901d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Methods/FunctionClosingBraceSniff.php +++ /dev/null @@ -1,91 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Sniffs\Methods; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class FunctionClosingBraceSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_FUNCTION, - T_CLOSURE, - ]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['scope_closer']) === false) { - // Probably an interface method. - return; - } - - $closeBrace = $tokens[$stackPtr]['scope_closer']; - $prevContent = $phpcsFile->findPrevious(T_WHITESPACE, ($closeBrace - 1), null, true); - $found = ($tokens[$closeBrace]['line'] - $tokens[$prevContent]['line'] - 1); - - if ($found < 0) { - // Brace isn't on a new line, so not handled by us. - return; - } - - if ($found === 0) { - // All is good. - return; - } - - $error = 'Function closing brace must go on the next line following the body; found %s blank lines before brace'; - $data = [$found]; - $fix = $phpcsFile->addFixableError($error, $closeBrace, 'SpacingBeforeClose', $data); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($prevContent + 1); $i < $closeBrace; $i++) { - if ($tokens[$i]['line'] === $tokens[$prevContent]['line']) { - continue; - } - - // Don't remove any indentation before the brace. - if ($tokens[$i]['line'] === $tokens[$closeBrace]['line']) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Methods/MethodDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Methods/MethodDeclarationSniff.php deleted file mode 100644 index 78cd75e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Methods/MethodDeclarationSniff.php +++ /dev/null @@ -1,162 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Sniffs\Methods; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\AbstractScopeSniff; -use PHP_CodeSniffer\Util\Tokens; - -class MethodDeclarationSniff extends AbstractScopeSniff -{ - - - /** - * Constructs a Squiz_Sniffs_Scope_MethodScopeSniff. - */ - public function __construct() - { - parent::__construct(Tokens::$ooScopeTokens, [T_FUNCTION]); - - }//end __construct() - - - /** - * Processes the function tokens within the class. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position where the token was found. - * @param int $currScope The current scope opener token. - * - * @return void - */ - protected function processTokenWithinScope(File $phpcsFile, $stackPtr, $currScope) - { - $tokens = $phpcsFile->getTokens(); - - // Determine if this is a function which needs to be examined. - $conditions = $tokens[$stackPtr]['conditions']; - end($conditions); - $deepestScope = key($conditions); - if ($deepestScope !== $currScope) { - return; - } - - $methodName = $phpcsFile->getDeclarationName($stackPtr); - if ($methodName === null) { - // Ignore closures. - return; - } - - if ($methodName[0] === '_' && isset($methodName[1]) === true && $methodName[1] !== '_') { - $error = 'Method name "%s" should not be prefixed with an underscore to indicate visibility'; - $data = [$methodName]; - $phpcsFile->addWarning($error, $stackPtr, 'Underscore', $data); - } - - $visibility = 0; - $static = 0; - $abstract = 0; - $final = 0; - - $find = (Tokens::$methodPrefixes + Tokens::$emptyTokens); - $prev = $phpcsFile->findPrevious($find, ($stackPtr - 1), null, true); - - $prefix = $stackPtr; - while (($prefix = $phpcsFile->findPrevious(Tokens::$methodPrefixes, ($prefix - 1), $prev)) !== false) { - switch ($tokens[$prefix]['code']) { - case T_STATIC: - $static = $prefix; - break; - case T_ABSTRACT: - $abstract = $prefix; - break; - case T_FINAL: - $final = $prefix; - break; - default: - $visibility = $prefix; - break; - } - } - - $fixes = []; - - if ($visibility !== 0 && $final > $visibility) { - $error = 'The final declaration must precede the visibility declaration'; - $fix = $phpcsFile->addFixableError($error, $final, 'FinalAfterVisibility'); - if ($fix === true) { - $fixes[$final] = ''; - $fixes[($final + 1)] = ''; - if (isset($fixes[$visibility]) === true) { - $fixes[$visibility] = 'final '.$fixes[$visibility]; - } else { - $fixes[$visibility] = 'final '.$tokens[$visibility]['content']; - } - } - } - - if ($visibility !== 0 && $abstract > $visibility) { - $error = 'The abstract declaration must precede the visibility declaration'; - $fix = $phpcsFile->addFixableError($error, $abstract, 'AbstractAfterVisibility'); - if ($fix === true) { - $fixes[$abstract] = ''; - $fixes[($abstract + 1)] = ''; - if (isset($fixes[$visibility]) === true) { - $fixes[$visibility] = 'abstract '.$fixes[$visibility]; - } else { - $fixes[$visibility] = 'abstract '.$tokens[$visibility]['content']; - } - } - } - - if ($static !== 0 && $static < $visibility) { - $error = 'The static declaration must come after the visibility declaration'; - $fix = $phpcsFile->addFixableError($error, $static, 'StaticBeforeVisibility'); - if ($fix === true) { - $fixes[$static] = ''; - $fixes[($static + 1)] = ''; - if (isset($fixes[$visibility]) === true) { - $fixes[$visibility] .= ' static'; - } else { - $fixes[$visibility] = $tokens[$visibility]['content'].' static'; - } - } - } - - // Batch all the fixes together to reduce the possibility of conflicts. - if (empty($fixes) === false) { - $phpcsFile->fixer->beginChangeset(); - foreach ($fixes as $stackPtr => $content) { - $phpcsFile->fixer->replaceToken($stackPtr, $content); - } - - $phpcsFile->fixer->endChangeset(); - } - - }//end processTokenWithinScope() - - - /** - * Processes a token that is found within the scope that this test is - * listening to. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position in the stack where this - * token was found. - * - * @return void - */ - protected function processTokenOutsideScope(File $phpcsFile, $stackPtr) - { - - }//end processTokenOutsideScope() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Namespaces/NamespaceDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Namespaces/NamespaceDeclarationSniff.php deleted file mode 100644 index 9ba6892..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Namespaces/NamespaceDeclarationSniff.php +++ /dev/null @@ -1,100 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Sniffs\Namespaces; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class NamespaceDeclarationSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_NAMESPACE]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($tokens[$nextNonEmpty]['code'] === T_NS_SEPARATOR) { - // Namespace keyword as operator. Not a declaration. - return; - } - - $end = $phpcsFile->findEndOfStatement($stackPtr); - for ($i = ($end + 1); $i < ($phpcsFile->numTokens - 1); $i++) { - if ($tokens[$i]['line'] === $tokens[$end]['line']) { - continue; - } - - break; - } - - // The $i var now points to the first token on the line after the - // namespace declaration, which must be a blank line. - $next = $phpcsFile->findNext(T_WHITESPACE, $i, $phpcsFile->numTokens, true); - if ($next === false) { - return; - } - - $diff = ($tokens[$next]['line'] - $tokens[$i]['line']); - if ($diff === 1) { - return; - } - - if ($diff < 0) { - $diff = 0; - } - - $error = 'There must be one blank line after the namespace declaration'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'BlankLineAfter'); - - if ($fix === true) { - if ($diff === 0) { - $phpcsFile->fixer->addNewlineBefore($i); - } else { - $phpcsFile->fixer->beginChangeset(); - for ($x = $i; $x < $next; $x++) { - if ($tokens[$x]['line'] === $tokens[$next]['line']) { - break; - } - - $phpcsFile->fixer->replaceToken($x, ''); - } - - $phpcsFile->fixer->addNewline($i); - $phpcsFile->fixer->endChangeset(); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Namespaces/UseDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Namespaces/UseDeclarationSniff.php deleted file mode 100644 index dcb67a2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Sniffs/Namespaces/UseDeclarationSniff.php +++ /dev/null @@ -1,297 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Sniffs\Namespaces; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class UseDeclarationSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_USE]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->shouldIgnoreUse($phpcsFile, $stackPtr) === true) { - return; - } - - $tokens = $phpcsFile->getTokens(); - - // One space after the use keyword. - if ($tokens[($stackPtr + 1)]['content'] !== ' ') { - $error = 'There must be a single space after the USE keyword'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceAfterUse'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ' '); - } - } - - // Only one USE declaration allowed per statement. - $next = $phpcsFile->findNext([T_COMMA, T_SEMICOLON, T_OPEN_USE_GROUP, T_CLOSE_TAG], ($stackPtr + 1)); - if ($next !== false - && $tokens[$next]['code'] !== T_SEMICOLON - && $tokens[$next]['code'] !== T_CLOSE_TAG - ) { - $error = 'There must be one USE keyword per declaration'; - - if ($tokens[$next]['code'] === T_COMMA) { - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'MultipleDeclarations'); - if ($fix === true) { - switch ($tokens[($stackPtr + 2)]['content']) { - case 'const': - $baseUse = 'use const'; - break; - case 'function': - $baseUse = 'use function'; - break; - default: - $baseUse = 'use'; - } - - if ($tokens[($next + 1)]['code'] !== T_WHITESPACE) { - $baseUse .= ' '; - } - - $phpcsFile->fixer->replaceToken($next, ';'.$phpcsFile->eolChar.$baseUse); - } - } else { - $closingCurly = $phpcsFile->findNext(T_CLOSE_USE_GROUP, ($next + 1)); - if ($closingCurly === false) { - // Parse error or live coding. Not auto-fixable. - $phpcsFile->addError($error, $stackPtr, 'MultipleDeclarations'); - } else { - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'MultipleDeclarations'); - if ($fix === true) { - $baseUse = rtrim($phpcsFile->getTokensAsString($stackPtr, ($next - $stackPtr))); - $lastNonWhitespace = $phpcsFile->findPrevious(T_WHITESPACE, ($closingCurly - 1), null, true); - - $phpcsFile->fixer->beginChangeset(); - - // Remove base use statement. - for ($i = $stackPtr; $i <= $next; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - if (preg_match('`^[\r\n]+$`', $tokens[($next + 1)]['content']) === 1) { - $phpcsFile->fixer->replaceToken(($next + 1), ''); - } - - // Convert grouped use statements into full use statements. - do { - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($next + 1), $closingCurly, true); - if ($next === false) { - // Group use statement with trailing comma after last item. - break; - } - - $nonWhitespace = $phpcsFile->findPrevious(T_WHITESPACE, ($next - 1), null, true); - for ($i = ($nonWhitespace + 1); $i < $next; $i++) { - if (preg_match('`^[\r\n]+$`', $tokens[$i]['content']) === 1) { - // Preserve new lines. - continue; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - if ($tokens[$next]['content'] === 'const' || $tokens[$next]['content'] === 'function') { - $phpcsFile->fixer->addContentBefore($next, 'use '); - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($next + 1), $closingCurly, true); - $phpcsFile->fixer->addContentBefore($next, str_replace('use ', '', $baseUse)); - } else { - $phpcsFile->fixer->addContentBefore($next, $baseUse); - } - - $next = $phpcsFile->findNext(T_COMMA, ($next + 1), $closingCurly); - if ($next !== false) { - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($next + 1), $closingCurly, true); - if ($nextNonEmpty !== false && $tokens[$nextNonEmpty]['line'] === $tokens[$next]['line']) { - $prevNonWhitespace = $phpcsFile->findPrevious(T_WHITESPACE, ($nextNonEmpty - 1), $next, true); - if ($prevNonWhitespace === $next) { - $phpcsFile->fixer->replaceToken($next, ';'.$phpcsFile->eolChar); - } else { - $phpcsFile->fixer->replaceToken($next, ';'); - $phpcsFile->fixer->addNewline($prevNonWhitespace); - } - } else { - // Last item with trailing comma or next item already on new line. - $phpcsFile->fixer->replaceToken($next, ';'); - } - } else { - // Last item without trailing comma. - $phpcsFile->fixer->addContent($lastNonWhitespace, ';'); - } - } while ($next !== false); - - // Remove closing curly, semicolon and any whitespace between last child and closing curly. - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($closingCurly + 1), null, true); - if ($next === false || $tokens[$next]['code'] !== T_SEMICOLON) { - // Parse error, forgotten semicolon. - $next = $closingCurly; - } - - for ($i = ($lastNonWhitespace + 1); $i <= $next; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - }//end if - }//end if - }//end if - }//end if - - // Make sure this USE comes after the first namespace declaration. - $prev = $phpcsFile->findPrevious(T_NAMESPACE, ($stackPtr - 1)); - if ($prev === false) { - $next = $phpcsFile->findNext(T_NAMESPACE, ($stackPtr + 1)); - if ($next !== false) { - $error = 'USE declarations must go after the namespace declaration'; - $phpcsFile->addError($error, $stackPtr, 'UseBeforeNamespace'); - } - } - - // Only interested in the last USE statement from here onwards. - $nextUse = $phpcsFile->findNext(T_USE, ($stackPtr + 1)); - while ($this->shouldIgnoreUse($phpcsFile, $nextUse) === true) { - $nextUse = $phpcsFile->findNext(T_USE, ($nextUse + 1)); - if ($nextUse === false) { - break; - } - } - - if ($nextUse !== false) { - return; - } - - $end = $phpcsFile->findNext([T_SEMICOLON, T_CLOSE_USE_GROUP, T_CLOSE_TAG], ($stackPtr + 1)); - if ($end === false) { - return; - } - - if ($tokens[$end]['code'] === T_CLOSE_USE_GROUP) { - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($end + 1), null, true); - if ($tokens[$nextNonEmpty]['code'] === T_SEMICOLON) { - $end = $nextNonEmpty; - } - } - - // Find either the start of the next line or the beginning of the next statement, - // whichever comes first. - for ($end = ++$end; $end < $phpcsFile->numTokens; $end++) { - if (isset(Tokens::$emptyTokens[$tokens[$end]['code']]) === false) { - break; - } - - if ($tokens[$end]['column'] === 1) { - // Reached the next line. - break; - } - } - - --$end; - - if (($tokens[$end]['code'] === T_COMMENT - || isset(Tokens::$phpcsCommentTokens[$tokens[$end]['code']]) === true) - && substr($tokens[$end]['content'], 0, 2) === '/*' - && substr($tokens[$end]['content'], -2) !== '*/' - ) { - // Multi-line block comments are not allowed as trailing comment after a use statement. - --$end; - } - - $next = $phpcsFile->findNext(T_WHITESPACE, ($end + 1), null, true); - - if ($next === false || $tokens[$next]['code'] === T_CLOSE_TAG) { - return; - } - - $diff = ($tokens[$next]['line'] - $tokens[$end]['line'] - 1); - if ($diff !== 1) { - if ($diff < 0) { - $diff = 0; - } - - $error = 'There must be one blank line after the last USE statement; %s found;'; - $data = [$diff]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceAfterLastUse', $data); - if ($fix === true) { - if ($diff === 0) { - $phpcsFile->fixer->addNewline($end); - } else { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($end + 1); $i < $next; $i++) { - if ($tokens[$i]['line'] === $tokens[$next]['line']) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->addNewline($end); - $phpcsFile->fixer->endChangeset(); - } - } - }//end if - - }//end process() - - - /** - * Check if this use statement is part of the namespace block. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return bool - */ - private function shouldIgnoreUse($phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Ignore USE keywords inside closures and during live coding. - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($next === false || $tokens[$next]['code'] === T_OPEN_PARENTHESIS) { - return true; - } - - // Ignore USE keywords for traits. - if ($phpcsFile->hasCondition($stackPtr, [T_CLASS, T_TRAIT, T_ENUM]) === true) { - return true; - } - - return false; - - }//end shouldIgnoreUse() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Classes/ClassDeclarationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Classes/ClassDeclarationUnitTest.inc deleted file mode 100644 index 1df40d5..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Classes/ClassDeclarationUnitTest.inc +++ /dev/null @@ -1,346 +0,0 @@ -anonymous = new class extends ArrayObject - { - public function __construct() - { - parent::__construct(['a' => 1, 'b' => 2]); - } - }; - } -} - -class A extends B - implements C -{ -} - -class C2 -{ - -} // phpcs:ignore Standard.Category.Sniff - -interface I1 extends - Foo -{ -} - -interface I2 extends - Bar -{ -} - -interface I3 extends - Foo, - Bar -{ -} - -class C1 extends - Foo -{ -} - -class C2 extends - Bar -{ -} - -class C3 extends Foo implements - Bar -{ -} - -class C4 extends Foo implements - Bar -{ -} - -class C5 extends Foo implements - Bar, - Baz -{ -} - -class C6 extends \Foo\Bar implements - \Baz\Bar -{ -} - -interface I4 extends - \Baz - \Bar -{ -} - -interface I5 extends /* comment */ - \Foo\Bar -{ -} - -interface I6 extends // comment - \Foo\Bar -{ -} - -class C7 extends // comment - \Foo\Bar implements \Baz\Bar -{ -} - -class -C8 -{ -} - -foo(new class { -}); - -readonly -class Test -{ -} - -readonly class Test -{ -} - -if (!class_exists('IndentedDeclaration')) { - class IndentedDeclaration - { - function foo() {} - - - } -} - -// Space between modifier and class keyword would not be flagged nor fixed if newline + indentation. -final - class FinalClassWithIndentation - { - } - -readonly - class ReadonlyClassWithIndentation - { - } - -// And would also not be flagged if there was a comment between (not auto-fixable). -final/*comment*/class FinalClassWithComment -{ -} -abstract /*comment*/ class AbstractClassWithComment -{ -} - -readonly - // comment - class ReadonlyClassWithComment - { - } - -// Safeguard against fixer conflict when there are namespace relative interface names in extends. -interface FooBar extends namespace\BarFoo -{ -} - -// Safeguard against fixer conflict when there are namespace relative interface names in a multi-line implements. -class BarFoo implements - namespace\BarFoo -{ -} - -// Safeguard that the sniff ignores comments between interface names in a multiline implements. -class ClassWithMultiLineImplementsAndIgnoreAnnotation implements - SomeInterface, - // phpcs:disable Stnd.Cat.Sniff -- For reasons. - - \AnotherInterface -{ -} - -class ClassWithMultiLineImplementsAndComment implements - SomeInterface, - // Comment. - -AnotherInterface -{ -} - -class ClassWithMultiLineImplementsAndCommentOnSameLineAsInterfaceName implements - SomeInterface, - /* Comment. */ AnotherInterface -{ -} - -// Verify the `CloseBraceSameLine` error code is thrown when expected. -class ClassBraceNotOnLineByItselfError -{ - public $prop; -} $foo = new ClassBraceNotOnLineByItselfError; - -interface ClassBraceNotOnLineByItselfTrailingCommentIsAllowed -{ - public function myMethod(); -} //end interface -- this comment is allowed. - -trait ClassBraceNotOnLineByItselfTrailingAnnotationIsAllowed -{ -} // phpcs:ignore Stnd.Cat.Sniff -- this comment is also allowed. - -// Issue squizlabs/PHP_CodeSniffer#2621 - fix was superseded by fix for #2678. -$foo->bar( - new class implements Bar { - // ... - }, -); - -enum BraceNotOnLineByItselfCloseTagError -{ -} ?> - -anonymous = new class extends ArrayObject - { - public function __construct() - { - parent::__construct(['a' => 1, 'b' => 2]); - } - }; - } -} - -class A extends B implements C -{ -} - -class C2 -{ - -} // phpcs:ignore Standard.Category.Sniff - -interface I1 extends - Foo -{ -} - -interface I2 extends - Bar -{ -} - -interface I3 extends - Foo, - Bar -{ -} - -class C1 extends Foo -{ -} - -class C2 extends Bar -{ -} - -class C3 extends Foo implements - Bar -{ -} - -class C4 extends Foo implements - Bar -{ -} - -class C5 extends Foo implements - Bar, - Baz -{ -} - -class C6 extends \Foo\Bar implements - \Baz\Bar -{ -} - -interface I4 extends - \Baz\Bar -{ -} - -interface I5 extends /* comment */ - \Foo\Bar -{ -} - -interface I6 extends // comment - \Foo\Bar -{ -} - -class C7 extends \Foo\Bar implements \Baz\Bar // comment -{ -} - -class C8 -{ -} - -foo(new class { -}); - -readonly class Test -{ -} - -readonly class Test -{ -} - -if (!class_exists('IndentedDeclaration')) { - class IndentedDeclaration - { - function foo() {} - } -} - -// Space between modifier and class keyword would not be flagged nor fixed if newline + indentation. -final class FinalClassWithIndentation -{ - } - -readonly class ReadonlyClassWithIndentation -{ - } - -// And would also not be flagged if there was a comment between (not auto-fixable). -final/*comment*/class FinalClassWithComment -{ -} -abstract /*comment*/ class AbstractClassWithComment -{ -} - -readonly - // comment - class ReadonlyClassWithComment - { - } - -// Safeguard against fixer conflict when there are namespace relative interface names in extends. -interface FooBar extends namespace\BarFoo -{ -} - -// Safeguard against fixer conflict when there are namespace relative interface names in a multi-line implements. -class BarFoo implements - namespace\BarFoo -{ -} - -// Safeguard that the sniff ignores comments between interface names in a multiline implements. -class ClassWithMultiLineImplementsAndIgnoreAnnotation implements - SomeInterface, - // phpcs:disable Stnd.Cat.Sniff -- For reasons. - - \AnotherInterface -{ -} - -class ClassWithMultiLineImplementsAndComment implements - SomeInterface, - // Comment. - - AnotherInterface -{ -} - -class ClassWithMultiLineImplementsAndCommentOnSameLineAsInterfaceName implements - SomeInterface, - /* Comment. */ - AnotherInterface -{ -} - -// Verify the `CloseBraceSameLine` error code is thrown when expected. -class ClassBraceNotOnLineByItselfError -{ - public $prop; -} $foo = new ClassBraceNotOnLineByItselfError; - -interface ClassBraceNotOnLineByItselfTrailingCommentIsAllowed -{ - public function myMethod(); -} //end interface -- this comment is allowed. - -trait ClassBraceNotOnLineByItselfTrailingAnnotationIsAllowed -{ -} // phpcs:ignore Stnd.Cat.Sniff -- this comment is also allowed. - -// Issue squizlabs/PHP_CodeSniffer#2621 - fix was superseded by fix for #2678. -$foo->bar( - new class implements Bar { - // ... - }, -); - -enum BraceNotOnLineByItselfCloseTagError -{ -} ?> - - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Tests\Classes; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ClassDeclaration sniff. - * - * @covers \PHP_CodeSniffer\Standards\PSR2\Sniffs\Classes\ClassDeclarationSniff - */ -final class ClassDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 2 => 1, - 7 => 3, - 12 => 1, - 13 => 1, - 17 => 1, - 19 => 2, - 20 => 1, - 21 => 1, - 22 => 1, - 25 => 1, - 27 => 2, - 34 => 1, - 35 => 2, - 44 => 1, - 45 => 1, - 63 => 1, - 95 => 1, - 116 => 1, - 118 => 1, - 119 => 1, - 124 => 1, - 130 => 2, - 131 => 1, - 158 => 1, - 168 => 1, - 178 => 1, - 179 => 1, - 184 => 1, - 189 => 1, - 194 => 1, - 204 => 1, - 205 => 1, - 210 => 1, - 215 => 2, - 216 => 1, - 231 => 2, - 235 => 1, - 244 => 1, - 248 => 1, - 258 => 1, - 263 => 1, - 268 => 1, - 273 => 1, - 276 => 1, - 282 => 1, - 310 => 1, - 316 => 1, - 324 => 1, - 344 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Classes/PropertyDeclarationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Classes/PropertyDeclarationUnitTest.inc deleted file mode 100644 index 15b1bbc..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Classes/PropertyDeclarationUnitTest.inc +++ /dev/null @@ -1,136 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Tests\Classes; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the PropertyDeclaration sniff. - * - * @covers \PHP_CodeSniffer\Standards\PSR2\Sniffs\Classes\PropertyDeclarationSniff - */ -final class PropertyDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 7 => 1, - 9 => 2, - 10 => 1, - 11 => 1, - 17 => 1, - 18 => 1, - 23 => 1, - 38 => 1, - 41 => 1, - 42 => 1, - 50 => 2, - 51 => 1, - 55 => 1, - 56 => 1, - 61 => 1, - 62 => 1, - 68 => 1, - 69 => 1, - 71 => 1, - 72 => 1, - 76 => 1, - 80 => 1, - 82 => 1, - 84 => 1, - 86 => 1, - 90 => 1, - 94 => 1, - 95 => 1, - 96 => 1, - 97 => 2, - 101 => 1, - 105 => 1, - 109 => 1, - 111 => 1, - 115 => 3, - 116 => 3, - 117 => 2, - 118 => 3, - 120 => 1, - 121 => 1, - 122 => 2, - 123 => 2, - 125 => 1, - 126 => 1, - 127 => 2, - 132 => 1, - 133 => 1, - 134 => 1, - 135 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [ - 13 => 1, - 14 => 1, - 15 => 1, - 53 => 1, - ]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ControlStructureSpacingUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ControlStructureSpacingUnitTest.inc deleted file mode 100644 index 542ab3c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ControlStructureSpacingUnitTest.inc +++ /dev/null @@ -1,81 +0,0 @@ - $that) {} -foreach ( $something as $blah => $that ) {} -foreach ( $something as $blah => $that ) {} -// phpcs:set PSR2.ControlStructures.ControlStructureSpacing requiredSpacesAfterOpen 0 -// phpcs:set PSR2.ControlStructures.ControlStructureSpacing requiredSpacesBeforeClose 0 - -$binary = b"binary string"; - -if ($expr1 - && $expr2 ) { -} - -if ($expr1 - && $expr2 /* comment */ ) { -} - -if ($expr1 - && $expr2 - /* comment */ ) { -} - -$r = match ($x) {}; -$r = match ( $x ) {}; - -// phpcs:set PSR2.ControlStructures.ControlStructureSpacing requiredSpacesAfterOpen 1 -// phpcs:set PSR2.ControlStructures.ControlStructureSpacing requiredSpacesBeforeClose 1 -$r = match ($x) {}; -$r = match ( $x ) {}; -$r = match ( $x ) {}; -// phpcs:set PSR2.ControlStructures.ControlStructureSpacing requiredSpacesAfterOpen 0 -// phpcs:set PSR2.ControlStructures.ControlStructureSpacing requiredSpacesBeforeClose 0 diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ControlStructureSpacingUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ControlStructureSpacingUnitTest.inc.fixed deleted file mode 100644 index a29534b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ControlStructureSpacingUnitTest.inc.fixed +++ /dev/null @@ -1,80 +0,0 @@ - $that ) {} -foreach ( $something as $blah => $that ) {} -foreach ( $something as $blah => $that ) {} -// phpcs:set PSR2.ControlStructures.ControlStructureSpacing requiredSpacesAfterOpen 0 -// phpcs:set PSR2.ControlStructures.ControlStructureSpacing requiredSpacesBeforeClose 0 - -$binary = b"binary string"; - -if ($expr1 - && $expr2) { -} - -if ($expr1 - && $expr2 /* comment */) { -} - -if ($expr1 - && $expr2 - /* comment */) { -} - -$r = match ($x) {}; -$r = match ($x) {}; - -// phpcs:set PSR2.ControlStructures.ControlStructureSpacing requiredSpacesAfterOpen 1 -// phpcs:set PSR2.ControlStructures.ControlStructureSpacing requiredSpacesBeforeClose 1 -$r = match ( $x ) {}; -$r = match ( $x ) {}; -$r = match ( $x ) {}; -// phpcs:set PSR2.ControlStructures.ControlStructureSpacing requiredSpacesAfterOpen 0 -// phpcs:set PSR2.ControlStructures.ControlStructureSpacing requiredSpacesBeforeClose 0 diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ControlStructureSpacingUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ControlStructureSpacingUnitTest.php deleted file mode 100644 index 82de680..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ControlStructureSpacingUnitTest.php +++ /dev/null @@ -1,67 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Tests\ControlStructures; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the FunctionSpacing sniff. - * - * @covers \PHP_CodeSniffer\Standards\PSR2\Sniffs\ControlStructures\ControlStructureSpacingSniff - */ -final class ControlStructureSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 4 => 1, - 14 => 2, - 26 => 2, - 27 => 2, - 31 => 1, - 51 => 2, - 53 => 2, - 60 => 1, - 64 => 1, - 69 => 1, - 73 => 2, - 77 => 2, - 79 => 2, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ElseIfDeclarationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ElseIfDeclarationUnitTest.inc deleted file mode 100644 index 778659c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ElseIfDeclarationUnitTest.inc +++ /dev/null @@ -1,17 +0,0 @@ - \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ElseIfDeclarationUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ElseIfDeclarationUnitTest.inc.fixed deleted file mode 100644 index 4a7bfdc..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ElseIfDeclarationUnitTest.inc.fixed +++ /dev/null @@ -1,17 +0,0 @@ - \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ElseIfDeclarationUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ElseIfDeclarationUnitTest.php deleted file mode 100644 index 1214a8e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/ElseIfDeclarationUnitTest.php +++ /dev/null @@ -1,56 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Tests\ControlStructures; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ElseIfDeclaration sniff. - * - * @covers \PHP_CodeSniffer\Standards\PSR2\Sniffs\ControlStructures\ElseIfDeclarationSniff - */ -final class ElseIfDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return []; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [ - 4 => 1, - 12 => 1, - ]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/SwitchDeclarationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/SwitchDeclarationUnitTest.inc deleted file mode 100644 index 7db00c2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/SwitchDeclarationUnitTest.inc +++ /dev/null @@ -1,624 +0,0 @@ - 0) { - return 0; - } else { - return 1; - } - case 2: - return 2; -} - -// ERROR: No else clause -switch ($foo) { - case 1: - if ($bar > 0) { - return 0; - } elseif ($bar < 0) { - return 1; - } - case 2: - return 2; -} - -// OK: No fall-through present -switch ($foo) { - case 1: - if ($bar > 0) { - return 0; - } elseif ($bar < 0) { - return 1; - } -} - -// ERROR: No else clause (nested) -switch ($foo) { - case 1: - if ($bar > 0) { - return 0; - } else { - if ($foo > $bar) { - continue; - } - } - case 2: - return 2; -} - -// OK: Every clause terminates -switch ($foo) { - case 1: - if ($bar > 0) { - return 0; - } else { - if ($foo > $bar) { - continue; - } else { - break; - } - } - case 2: - return 2; -} - -// ERROR: Non-termination IF clause -switch ($foo) { - case 1: - if ($bar > 0) { - $offset = 0; - } else { - break; - } - case 2: - return 2; -} - -// ERROR: Non-termination IF clause (nested) -switch ($foo) { - case 1: - if ($bar > 0) { - continue; - } else { - if ($foo > $bar) { - $offset = 0; - } else { - break; - } - } - case 2: - return 2; -} - -switch ($sContext) -{ - case 'SOMETHING': - case 'CONSTANT': - do_something(); - break; - case 'GLOBAL': - case 'GLOBAL1': - do_something(); - // Fall through - default: - { - do_something(); - } -} - -$foo = $foo ? - function () { - switch ($a) { - case 'a': - break; - } - } : - null; - -switch ($foo) { -case Foo::INTERFACE: - echo '1'; - return self::INTERFACE; -case Foo::TRAIT: -case Foo::ARRAY: - echo '1'; - return self::VALUE; -} - -// OK: Every clause terminates -switch ($foo) { - case 1: - switch ($bar) { - case 1: - return 1; - default: - return 3; - } - case 2: - return 2; -} - -// KO: Not every clause terminates -switch ($foo) { - case 1: - switch ($bar) { - case 1: - return; - } - case 2: - return 2; -} - -// KO: Not every clause terminates -switch ($foo) { - case 1: - switch ($bar) { - case 1: - return; - default: - $a = 1; - } - case 2: - return 2; -} - -// OK: Every clause terminates -switch ($foo) { - case 1: - switch ($bar) { - case 1: - return 1; - default: - throw new \Exception(); - } - case 2: - return 2; -} - -switch ($foo) { - case 1: - // phpcs:ignore - case 2: - return 1; - case 3: - return 2; -} - -// Issue 3352. -switch ( $test ) { - case 2: // comment followed by empty line - - break; - - case 3: /* phpcs:ignore Stnd.Cat.SniffName -- Verify correct handling of ignore comments. */ - - - - break; - - case 4: /** inline docblock */ - - - - break; - - case 5: /* checking how it handles */ /* two trailing comments */ - - break; - - case 6: - // Comment as first content of the body. - - break; - - case 7: - /* phpcs:ignore Stnd.Cat.SniffName -- Verify correct handling of ignore comments at start of body. */ - - break; - - case 8: - /** inline docblock */ - - break; -} - -// Handle comments correctly. -switch ($foo) { - case 1: - if ($bar > 0) { - doSomething(); - } - // Comment - else { - return 1; - } - case 2: - return 2; -} - -switch ($foo) { - case 1: - if ($bar > 0) /*comment*/ { - return doSomething(); - } - else { - return 1; - } - case 2: - return 2; -} - -// Issue #3297. -// Okay - finally will always be executed, so all branches are covered by the `return` in finally. -switch ( $a ) { - case 1: - try { - doSomething(); - } catch (Exception $e) { - doSomething(); - } catch (AnotherException $e) { - doSomething(); - } finally { - return true; - } - default: - $other = $code; - break; -} - -// Okay - all - non-finally - branches have a terminating statement. -switch ( $a ) { - case 1: - try { - return false; - } catch (Exception $e) /*comment*/ { - return true; - } - // Comment - catch (AnotherException $e) { - return true; - } finally { - doSomething(); - } - default: - $other = $code; - break; -} - -// Okay - finally will always be executed, so all branches are covered by the `return` in finally. -// Non-standard structure order. -switch ( $a ) { - case 1: - try { - doSomething(); - } catch (Exception $e) { - doSomething(); - } finally { - return true; - } catch (AnotherException $e) { - doSomething(); - } - default: - $other = $code; - break; -} - -// Okay - all - non-finally - branches have a terminating statement. -// Non-standard structure order. -switch ( $a ) { - case 1: - try { - return false; - } finally { - doSomething(); - } catch (MyException $e) { - return true; - } catch (AnotherException $e) { - return true; - } - default: - $other = $code; - break; -} - -// All okay, no finally. Any exception still uncaught will terminate the case anyhow, so we're good. -switch ( $a ) { - case 1: - try { - return false; - } catch (MyException $e) { - return true; - } catch (AnotherException $e) { - return true; - } - default: - $other = $code; - break; -} - -// All okay, no catch -switch ( $a ) { - case 1: - try { - return true; - } finally { - doSomething(); - } - case 2: - $other = $code; - break; -} - -// All okay, try-catch nested in if. -switch ( $a ) { - case 1: - if ($a) { - try { - return true; // Comment. - } catch (MyException $e) { - throw new Exception($e->getMessage()); - } - } else { - return true; - } - case 2: - $other = $code; - break; -} - -// Missing fall-through comment. -switch ( $a ) { - case 1: - try { - doSomething(); - } finally { - doSomething(); - } - case 2: - $other = $code; - break; -} - -// Missing fall-through comment. One of the catches does not have a terminating statement. -switch ( $a ) { - case 1: - try { - return false; - } catch (Exception $e) { - doSomething(); - } catch (AnotherException $e) { - return true; - } finally { - doSomething(); - } - default: - $other = $code; - break; -} - -// Missing fall-through comment. Try does not have a terminating statement. -switch ( $a ) { - case 1: - try { - doSomething(); - } finally { - doSomething(); - } catch (Exception $e) { - return true; - } catch (AnotherException $e) { - return true; - } - default: - $other = $code; - break; -} - -// Missing fall-through comment. One of the catches does not have a terminating statement. -switch ( $a ) { - case 1: - try { - return false; - } catch (Exception $e) { - doSomething(); - } catch (AnotherException $e) { - return true; - } - default: - $other = $code; - break; -} - -// Issue 3550 - comment after terminating statement. -switch (rand()) { - case 1: - if (rand() === 1) { - break; - } else { - break; // comment - } - default: - break; -} - -// Fix: goto should be recognized as terminating statement. -switch ( $a ) { - case 1: - doSomething(); - goto jumpOut; - default: - $other = $code; - break; -} - -jumpOut: -doSomething(); - -// Fixable semicolon as case/default scope opener. -switch ($value) { - case 'foo'; - case 'bar' /*comment*/ ; - case 'baz' ; - echo 'foo, bar, or baz'; - break; - default; - echo 'Other'; - default ; - echo 'Other'; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/SwitchDeclarationUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/SwitchDeclarationUnitTest.inc.fixed deleted file mode 100644 index c84f389..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/SwitchDeclarationUnitTest.inc.fixed +++ /dev/null @@ -1,619 +0,0 @@ - 0) { - return 0; - } else { - return 1; - } - case 2: - return 2; -} - -// ERROR: No else clause -switch ($foo) { - case 1: - if ($bar > 0) { - return 0; - } elseif ($bar < 0) { - return 1; - } - case 2: - return 2; -} - -// OK: No fall-through present -switch ($foo) { - case 1: - if ($bar > 0) { - return 0; - } elseif ($bar < 0) { - return 1; - } -} - -// ERROR: No else clause (nested) -switch ($foo) { - case 1: - if ($bar > 0) { - return 0; - } else { - if ($foo > $bar) { - continue; - } - } - case 2: - return 2; -} - -// OK: Every clause terminates -switch ($foo) { - case 1: - if ($bar > 0) { - return 0; - } else { - if ($foo > $bar) { - continue; - } else { - break; - } - } - case 2: - return 2; -} - -// ERROR: Non-termination IF clause -switch ($foo) { - case 1: - if ($bar > 0) { - $offset = 0; - } else { - break; - } - case 2: - return 2; -} - -// ERROR: Non-termination IF clause (nested) -switch ($foo) { - case 1: - if ($bar > 0) { - continue; - } else { - if ($foo > $bar) { - $offset = 0; - } else { - break; - } - } - case 2: - return 2; -} - -switch ($sContext) -{ - case 'SOMETHING': - case 'CONSTANT': - do_something(); - break; - case 'GLOBAL': - case 'GLOBAL1': - do_something(); - // Fall through - default: - { - do_something(); - } -} - -$foo = $foo ? - function () { - switch ($a) { - case 'a': - break; - } - } : - null; - -switch ($foo) { -case Foo::INTERFACE: - echo '1'; - return self::INTERFACE; -case Foo::TRAIT: -case Foo::ARRAY: - echo '1'; - return self::VALUE; -} - -// OK: Every clause terminates -switch ($foo) { - case 1: - switch ($bar) { - case 1: - return 1; - default: - return 3; - } - case 2: - return 2; -} - -// KO: Not every clause terminates -switch ($foo) { - case 1: - switch ($bar) { - case 1: - return; - } - case 2: - return 2; -} - -// KO: Not every clause terminates -switch ($foo) { - case 1: - switch ($bar) { - case 1: - return; - default: - $a = 1; - } - case 2: - return 2; -} - -// OK: Every clause terminates -switch ($foo) { - case 1: - switch ($bar) { - case 1: - return 1; - default: - throw new \Exception(); - } - case 2: - return 2; -} - -switch ($foo) { - case 1: - // phpcs:ignore - case 2: - return 1; - case 3: - return 2; -} - -// Issue 3352. -switch ( $test ) { - case 2: // comment followed by empty line - break; - - case 3: /* phpcs:ignore Stnd.Cat.SniffName -- Verify correct handling of ignore comments. */ - break; - - case 4: /** inline docblock */ - break; - - case 5: /* checking how it handles */ /* two trailing comments */ - break; - - case 6: - // Comment as first content of the body. - - break; - - case 7: - /* phpcs:ignore Stnd.Cat.SniffName -- Verify correct handling of ignore comments at start of body. */ - - break; - - case 8: - /** inline docblock */ - - break; -} - -// Handle comments correctly. -switch ($foo) { - case 1: - if ($bar > 0) { - doSomething(); - } - // Comment - else { - return 1; - } - case 2: - return 2; -} - -switch ($foo) { - case 1: - if ($bar > 0) /*comment*/ { - return doSomething(); - } - else { - return 1; - } - case 2: - return 2; -} - -// Issue #3297. -// Okay - finally will always be executed, so all branches are covered by the `return` in finally. -switch ( $a ) { - case 1: - try { - doSomething(); - } catch (Exception $e) { - doSomething(); - } catch (AnotherException $e) { - doSomething(); - } finally { - return true; - } - default: - $other = $code; - break; -} - -// Okay - all - non-finally - branches have a terminating statement. -switch ( $a ) { - case 1: - try { - return false; - } catch (Exception $e) /*comment*/ { - return true; - } - // Comment - catch (AnotherException $e) { - return true; - } finally { - doSomething(); - } - default: - $other = $code; - break; -} - -// Okay - finally will always be executed, so all branches are covered by the `return` in finally. -// Non-standard structure order. -switch ( $a ) { - case 1: - try { - doSomething(); - } catch (Exception $e) { - doSomething(); - } finally { - return true; - } catch (AnotherException $e) { - doSomething(); - } - default: - $other = $code; - break; -} - -// Okay - all - non-finally - branches have a terminating statement. -// Non-standard structure order. -switch ( $a ) { - case 1: - try { - return false; - } finally { - doSomething(); - } catch (MyException $e) { - return true; - } catch (AnotherException $e) { - return true; - } - default: - $other = $code; - break; -} - -// All okay, no finally. Any exception still uncaught will terminate the case anyhow, so we're good. -switch ( $a ) { - case 1: - try { - return false; - } catch (MyException $e) { - return true; - } catch (AnotherException $e) { - return true; - } - default: - $other = $code; - break; -} - -// All okay, no catch -switch ( $a ) { - case 1: - try { - return true; - } finally { - doSomething(); - } - case 2: - $other = $code; - break; -} - -// All okay, try-catch nested in if. -switch ( $a ) { - case 1: - if ($a) { - try { - return true; // Comment. - } catch (MyException $e) { - throw new Exception($e->getMessage()); - } - } else { - return true; - } - case 2: - $other = $code; - break; -} - -// Missing fall-through comment. -switch ( $a ) { - case 1: - try { - doSomething(); - } finally { - doSomething(); - } - case 2: - $other = $code; - break; -} - -// Missing fall-through comment. One of the catches does not have a terminating statement. -switch ( $a ) { - case 1: - try { - return false; - } catch (Exception $e) { - doSomething(); - } catch (AnotherException $e) { - return true; - } finally { - doSomething(); - } - default: - $other = $code; - break; -} - -// Missing fall-through comment. Try does not have a terminating statement. -switch ( $a ) { - case 1: - try { - doSomething(); - } finally { - doSomething(); - } catch (Exception $e) { - return true; - } catch (AnotherException $e) { - return true; - } - default: - $other = $code; - break; -} - -// Missing fall-through comment. One of the catches does not have a terminating statement. -switch ( $a ) { - case 1: - try { - return false; - } catch (Exception $e) { - doSomething(); - } catch (AnotherException $e) { - return true; - } - default: - $other = $code; - break; -} - -// Issue 3550 - comment after terminating statement. -switch (rand()) { - case 1: - if (rand() === 1) { - break; - } else { - break; // comment - } - default: - break; -} - -// Fix: goto should be recognized as terminating statement. -switch ( $a ) { - case 1: - doSomething(); - goto jumpOut; - default: - $other = $code; - break; -} - -jumpOut: -doSomething(); - -// Fixable semicolon as case/default scope opener. -switch ($value) { - case 'foo': - case 'bar' /*comment*/: - case 'baz': - echo 'foo, bar, or baz'; - break; - default: - echo 'Other'; - default: - echo 'Other'; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/SwitchDeclarationUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/SwitchDeclarationUnitTest.php deleted file mode 100644 index f96a5ff..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/ControlStructures/SwitchDeclarationUnitTest.php +++ /dev/null @@ -1,91 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Tests\ControlStructures; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the SwitchDeclaration sniff. - * - * @covers \PHP_CodeSniffer\Standards\PSR2\Sniffs\ControlStructures\SwitchDeclarationSniff - */ -final class SwitchDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 10 => 1, - 11 => 1, - 14 => 1, - 16 => 1, - 20 => 1, - 23 => 1, - 29 => 1, - 33 => 1, - 37 => 2, - 108 => 2, - 109 => 1, - 111 => 1, - 113 => 2, - 114 => 1, - 128 => 1, - 141 => 1, - 172 => 1, - 194 => 1, - 224 => 1, - 236 => 1, - 260 => 1, - 300 => 1, - 311 => 1, - 346 => 1, - 350 => 1, - 356 => 1, - 362 => 1, - 384 => 1, - 528 => 1, - 541 => 1, - 558 => 1, - 575 => 1, - 615 => 1, - 616 => 1, - 617 => 1, - 620 => 1, - 622 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.1.inc deleted file mode 100644 index 738e70e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.1.inc +++ /dev/null @@ -1,12 +0,0 @@ - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.1.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.1.inc.fixed deleted file mode 100644 index f70b9eb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.1.inc.fixed +++ /dev/null @@ -1,12 +0,0 @@ - - -
    - -
    \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.3.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.3.inc deleted file mode 100644 index d6a8617..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.3.inc +++ /dev/null @@ -1,7 +0,0 @@ - - -A: -B: -C: \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.4.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.4.inc deleted file mode 100644 index dd103cd..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.4.inc +++ /dev/null @@ -1 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.4.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.4.inc.fixed deleted file mode 100644 index 1058f1f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.4.inc.fixed +++ /dev/null @@ -1 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.5.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.5.inc.fixed deleted file mode 100644 index 93d55fb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.5.inc.fixed +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.6.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.6.inc.fixed deleted file mode 100644 index 534574d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.6.inc.fixed +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.7.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.7.inc.fixed deleted file mode 100644 index 68e7d8c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/ClosingTagUnitTest.7.inc.fixed +++ /dev/null @@ -1,5 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Tests\Files; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ClosingTag sniff. - * - * @covers \PHP_CodeSniffer\Standards\PSR2\Sniffs\Files\ClosingTagSniff - */ -final class ClosingTagUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'ClosingTagUnitTest.1.inc': - return [11 => 1]; - - case 'ClosingTagUnitTest.4.inc': - case 'ClosingTagUnitTest.5.inc': - return [1 => 1]; - - case 'ClosingTagUnitTest.6.inc': - case 'ClosingTagUnitTest.7.inc': - return [5 => 1]; - - default: - return []; - } - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.1.inc deleted file mode 100644 index ca2a749..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.1.inc +++ /dev/null @@ -1,3 +0,0 @@ - \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.12.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.12.inc.fixed deleted file mode 100644 index d3c19fe..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.12.inc.fixed +++ /dev/null @@ -1 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.13.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.13.inc deleted file mode 100644 index fa2f476..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.13.inc +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.2.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.2.inc deleted file mode 100644 index 1254e4a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.2.inc +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.5.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.5.inc deleted file mode 100644 index c3a59b6..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Files/EndFileNewlineUnitTest.5.inc +++ /dev/null @@ -1,6 +0,0 @@ - - - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Tests\Files; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the EndFileNewline sniff. - * - * @covers \PHP_CodeSniffer\Standards\PSR2\Sniffs\Files\EndFileNewlineSniff - */ -final class EndFileNewlineUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'EndFileNewlineUnitTest.1.inc': - case 'EndFileNewlineUnitTest.3.inc': - case 'EndFileNewlineUnitTest.6.inc': - case 'EndFileNewlineUnitTest.7.inc': - case 'EndFileNewlineUnitTest.9.inc': - case 'EndFileNewlineUnitTest.10.inc': - return [2 => 1]; - case 'EndFileNewlineUnitTest.11.inc': - case 'EndFileNewlineUnitTest.12.inc': - case 'EndFileNewlineUnitTest.13.inc': - return [1 => 1]; - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getWarningList($testFile='') - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/FunctionCallSignatureUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/FunctionCallSignatureUnitTest.inc deleted file mode 100644 index 1ca477d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/FunctionCallSignatureUnitTest.inc +++ /dev/null @@ -1,267 +0,0 @@ -get('/hello/{name}', function ($name) use ($app) { - return 'Hello '.$app->escape($name); -}, array( - '1', - '2', - '3', -)); - -// error -somefunction2($foo, $bar, [ - // ... - ], -$baz); - -// ok -somefunction3(// ... - $foo, - $bar, - [ - // ... - ], - $baz -); - -// ok -somefunction4(' - this should not - give an error - because it\'s actually - one line call - with multi-line string -'); - -// ok -somefunction5("hey, -multi-line string with some -extra args", $foo, 12); - -// error -somefunction6(' - but args in a new line - are not ok… - ', - $foo -); - -$this->setFoo(true - ? 1 - : 2, false, array( - 'value', - 'more')); - -$this->setFoo('some' - . 'long' - . 'text', 'string'); - -foo(bar(), $a); -foo();bar(); - -foo( - true -); - -myFunction(<< function ($x) { - return true; - }, - 'baz' => false - ) -); -$qux = array_filter( - $quux, function ($x) { - return $x; - } -); - -$this->listeners[] = $events->getSharedManager()->attach( - 'Zend\Mvc\Application', MvcEvent::EVENT_DISPATCH, [$this, 'selectLayout'], 100 -); - -// phpcs:set PSR2.Methods.FunctionCallSignature requiredSpacesBeforeClose 1 -foo('Testing - multiline text' - ); - -foo('Testing - multiline text: ' // . $text - ); - -foo('Testing - multiline text: ' /* . $text */ - ); - -foo('Testing - multiline text: ' /* . $text */ - // . $other_text - ); - -foo('Testing - multiline text: ' /* - . $text -// . $text2 - */ - ); -// phpcs:set PSR2.Methods.FunctionCallSignature requiredSpacesBeforeClose 0 - -foo('Testing - multiline text' -); - -foo('Testing - multiline text' - ); - -foo('Testing - multiline text' // hello -); - -foo('Testing - multiline text' /* hello */ -); - -foo('Testing - multiline text' - // hello -); - -foo('Testing - multiline text' - /* hello */ -); - -$var = foo('Testing - multiline' - // hi - ) + foo('Testing - multiline' - // hi - ) -; - -class Test -{ - public function getInstance() - { - return new static( - 'arg', - 'foo' - ); - } - - public function getSelf() - { - return new self( - 'a', 'b', 'c' - ); - } -} - -$x = $var('y', - 'x'); - -$obj->{$x}(1, -2); - -(function ($a, $b) { - return function ($c, $d) use ($a, $b) { - echo $a, $b, $c, $d; - }; -})( - 'a','b' -)('c', - 'd'); - -return trim(preg_replace_callback( - // sprintf replaces IGNORED_CHARS multiple times: for %s as well as %1$s (argument numbering) - // /[%s]*([^%1$s]+)/ results in /[IGNORED_CHARS]*([^IGNORED_CHARS]+)/ - sprintf('/[%s]*([^%1$s]+)/', self::IGNORED_CHARS), - function (array $term) use ($mode): string { - // query pieces have to bigger than one char, otherwise they are too expensive for the search - if (mb_strlen($term[1], 'UTF-8') > 1) { - // in boolean search mode '' (empty) means OR, '-' means NOT - return sprintf('%s%s ', $mode === 'AND' ? '+' : '', self::extractUmlauts($term[1])); - } - - return ''; - }, - $search - )); - -return trim(preg_replace_callback( -// sprintf replaces IGNORED_CHARS multiple times: for %s as well as %1$s (argument numbering) -// /[%s]*([^%1$s]+)/ results in /[IGNORED_CHARS]*([^IGNORED_CHARS]+)/ -sprintf('/[%s]*([^%1$s]+)/', self::IGNORED_CHARS), -function (array $term) use ($mode): string { - // query pieces have to bigger than one char, otherwise they are too expensive for the search - if (mb_strlen($term[1], 'UTF-8') > 1) { - // in boolean search mode '' (empty) means OR, '-' means NOT - return sprintf('%s%s ', $mode === 'AND' ? '+' : '', self::extractUmlauts($term[1])); - } - - return ''; -}, -$search -)); - -// PHP 8.0 named parameters. -array_fill_keys( - keys: range( - 1, - 12, - ), - value: true, -); - -array_fill_keys( - keys: range( 1, - 12, - ), value: true, -); - -// phpcs:set PSR2.Methods.FunctionCallSignature allowMultipleArguments true -array_fill_keys( - keys: range( 1, - 12, - ), value: true, -); -// phpcs:set PSR2.Methods.FunctionCallSignature allowMultipleArguments false diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/FunctionCallSignatureUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/FunctionCallSignatureUnitTest.inc.fixed deleted file mode 100644 index dc383ed..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/FunctionCallSignatureUnitTest.inc.fixed +++ /dev/null @@ -1,283 +0,0 @@ -get('/hello/{name}', function ($name) use ($app) { - return 'Hello '.$app->escape($name); -}, array( - '1', - '2', - '3', -)); - -// error -somefunction2( - $foo, - $bar, - [ - // ... - ], - $baz -); - -// ok -somefunction3(// ... - $foo, - $bar, - [ - // ... - ], - $baz -); - -// ok -somefunction4(' - this should not - give an error - because it\'s actually - one line call - with multi-line string -'); - -// ok -somefunction5("hey, -multi-line string with some -extra args", $foo, 12); - -// error -somefunction6( - ' - but args in a new line - are not ok… - ', - $foo -); - -$this->setFoo(true - ? 1 - : 2, false, array( - 'value', - 'more')); - -$this->setFoo('some' - . 'long' - . 'text', 'string'); - -foo(bar(), $a); -foo();bar(); - -foo( - true -); - -myFunction(<< function ($x) { - return true; - }, - 'baz' => false - ) -); -$qux = array_filter( - $quux, - function ($x) { - return $x; - } -); - -$this->listeners[] = $events->getSharedManager()->attach( - 'Zend\Mvc\Application', - MvcEvent::EVENT_DISPATCH, - [$this, 'selectLayout'], - 100 -); - -// phpcs:set PSR2.Methods.FunctionCallSignature requiredSpacesBeforeClose 1 -foo('Testing - multiline text' ); - -foo('Testing - multiline text: ' ); // . $text - - -foo('Testing - multiline text: ' /* . $text */ ); - -foo('Testing - multiline text: ' /* . $text */ ); - // . $other_text - - -foo('Testing - multiline text: ' /* - . $text -// . $text2 - */ ); -// phpcs:set PSR2.Methods.FunctionCallSignature requiredSpacesBeforeClose 0 - -foo('Testing - multiline text'); - -foo('Testing - multiline text'); - -foo('Testing - multiline text'); // hello - - -foo('Testing - multiline text' /* hello */); - -foo('Testing - multiline text'); - // hello - - -foo('Testing - multiline text' - /* hello */); - -$var = foo('Testing - multiline') - // hi - + foo('Testing - multiline'); - // hi - - -class Test -{ - public function getInstance() - { - return new static( - 'arg', - 'foo' - ); - } - - public function getSelf() - { - return new self( - 'a', - 'b', - 'c' - ); - } -} - -$x = $var( - 'y', - 'x' -); - -$obj->{$x}( - 1, - 2 -); - -(function ($a, $b) { - return function ($c, $d) use ($a, $b) { - echo $a, $b, $c, $d; - }; -})( - 'a', - 'b' -)( - 'c', - 'd' -); - -return trim(preg_replace_callback( - // sprintf replaces IGNORED_CHARS multiple times: for %s as well as %1$s (argument numbering) - // /[%s]*([^%1$s]+)/ results in /[IGNORED_CHARS]*([^IGNORED_CHARS]+)/ - sprintf('/[%s]*([^%1$s]+)/', self::IGNORED_CHARS), - function (array $term) use ($mode): string { - // query pieces have to bigger than one char, otherwise they are too expensive for the search - if (mb_strlen($term[1], 'UTF-8') > 1) { - // in boolean search mode '' (empty) means OR, '-' means NOT - return sprintf('%s%s ', $mode === 'AND' ? '+' : '', self::extractUmlauts($term[1])); - } - - return ''; - }, - $search -)); - -return trim(preg_replace_callback( -// sprintf replaces IGNORED_CHARS multiple times: for %s as well as %1$s (argument numbering) -// /[%s]*([^%1$s]+)/ results in /[IGNORED_CHARS]*([^IGNORED_CHARS]+)/ - sprintf('/[%s]*([^%1$s]+)/', self::IGNORED_CHARS), - function (array $term) use ($mode): string { - // query pieces have to bigger than one char, otherwise they are too expensive for the search - if (mb_strlen($term[1], 'UTF-8') > 1) { - // in boolean search mode '' (empty) means OR, '-' means NOT - return sprintf('%s%s ', $mode === 'AND' ? '+' : '', self::extractUmlauts($term[1])); - } - - return ''; - }, - $search -)); - -// PHP 8.0 named parameters. -array_fill_keys( - keys: range( - 1, - 12, - ), - value: true, -); - -array_fill_keys( - keys: range( - 1, - 12, - ), - value: true, -); - -// phpcs:set PSR2.Methods.FunctionCallSignature allowMultipleArguments true -array_fill_keys( - keys: range( - 1, - 12, - ), value: true, -); -// phpcs:set PSR2.Methods.FunctionCallSignature allowMultipleArguments false diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/FunctionCallSignatureUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/FunctionCallSignatureUnitTest.php deleted file mode 100644 index 3863792..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/FunctionCallSignatureUnitTest.php +++ /dev/null @@ -1,99 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Tests\Methods; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the FunctionCallSignature sniff. - * - * @covers \PHP_CodeSniffer\Standards\PSR2\Sniffs\Methods\FunctionCallSignatureSniff - */ -final class FunctionCallSignatureUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 18 => 3, - 21 => 1, - 48 => 1, - 87 => 1, - 90 => 1, - 91 => 1, - 103 => 1, - 111 => 1, - 117 => 4, - 123 => 1, - 127 => 1, - 131 => 1, - 136 => 1, - 143 => 1, - 148 => 1, - 152 => 1, - 156 => 1, - 160 => 1, - 165 => 1, - 170 => 1, - 175 => 1, - 178 => 2, - 186 => 1, - 187 => 1, - 194 => 3, - 199 => 1, - 200 => 2, - 202 => 1, - 203 => 1, - 210 => 2, - 211 => 1, - 212 => 2, - 217 => 1, - 218 => 1, - 227 => 1, - 228 => 1, - 233 => 1, - 234 => 1, - 242 => 1, - 243 => 1, - 256 => 1, - 257 => 1, - 258 => 1, - 263 => 1, - 264 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/FunctionClosingBraceUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/FunctionClosingBraceUnitTest.inc deleted file mode 100644 index 7bf667e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/FunctionClosingBraceUnitTest.inc +++ /dev/null @@ -1,70 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Tests\Methods; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the FunctionClosingBrace sniff. - * - * @covers \PHP_CodeSniffer\Standards\PSR2\Sniffs\Methods\FunctionClosingBraceSniff - */ -final class FunctionClosingBraceUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 16 => 1, - 23 => 1, - 40 => 1, - 47 => 1, - 63 => 1, - 70 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/MethodDeclarationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/MethodDeclarationUnitTest.inc deleted file mode 100644 index 096b44b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Methods/MethodDeclarationUnitTest.inc +++ /dev/null @@ -1,75 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Tests\Methods; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the MethodDeclaration sniff. - * - * @covers \PHP_CodeSniffer\Standards\PSR2\Sniffs\Methods\MethodDeclarationSniff - */ -final class MethodDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 9 => 1, - 11 => 1, - 13 => 1, - 15 => 3, - 24 => 1, - 34 => 1, - 36 => 1, - 38 => 1, - 40 => 3, - 50 => 1, - 52 => 1, - 54 => 1, - 56 => 3, - 63 => 2, - 73 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [ - 5 => 1, - 21 => 1, - 30 => 1, - 46 => 1, - 63 => 1, - 70 => 1, - ]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/NamespaceDeclarationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/NamespaceDeclarationUnitTest.inc deleted file mode 100644 index 7033933..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/NamespaceDeclarationUnitTest.inc +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Tests\Namespaces; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the NamespaceDeclaration sniff. - * - * @covers \PHP_CodeSniffer\Standards\PSR2\Sniffs\Namespaces\NamespaceDeclarationSniff - */ -final class NamespaceDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 6 => 1, - 9 => 1, - 17 => 1, - 19 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.1.inc deleted file mode 100644 index 977a7fb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.1.inc +++ /dev/null @@ -1,40 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.2.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.2.inc.fixed deleted file mode 100644 index 6579613..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.2.inc.fixed +++ /dev/null @@ -1,27 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.3.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.3.inc deleted file mode 100644 index 8b29095..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.3.inc +++ /dev/null @@ -1,16 +0,0 @@ - -

    diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.5.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.5.inc deleted file mode 100644 index 1fdaccd..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.5.inc +++ /dev/null @@ -1,47 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.7.inc b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.7.inc deleted file mode 100644 index dee5686..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.7.inc +++ /dev/null @@ -1 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\PSR2\Tests\Namespaces; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the UseDeclaration sniff. - * - * @covers \PHP_CodeSniffer\Standards\PSR2\Sniffs\Namespaces\UseDeclarationSniff - */ -final class UseDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'UseDeclarationUnitTest.2.inc': - return [ - 4 => 1, - 5 => 1, - 6 => 1, - 7 => 1, - 9 => 1, - 10 => 1, - 11 => 1, - 16 => 1, - ]; - case 'UseDeclarationUnitTest.3.inc': - return [ - 4 => 1, - 6 => 1, - ]; - case 'UseDeclarationUnitTest.5.inc': - return [ - 5 => 1, - 6 => 1, - 8 => 1, - 14 => 1, - 17 => 1, - 18 => 1, - 19 => 1, - 21 => 1, - 28 => 1, - 30 => 1, - 35 => 1, - ]; - case 'UseDeclarationUnitTest.10.inc': - case 'UseDeclarationUnitTest.11.inc': - case 'UseDeclarationUnitTest.12.inc': - case 'UseDeclarationUnitTest.13.inc': - case 'UseDeclarationUnitTest.14.inc': - case 'UseDeclarationUnitTest.16.inc': - case 'UseDeclarationUnitTest.17.inc': - return [2 => 1]; - case 'UseDeclarationUnitTest.15.inc': - return [ - 3 => 1, - 4 => 1, - 5 => 1, - ]; - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/ruleset.xml b/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/ruleset.xml deleted file mode 100644 index ba5bd4e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/PSR2/ruleset.xml +++ /dev/null @@ -1,218 +0,0 @@ - - - The PSR-2 coding standard. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - 0 - - - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - - 0 - - - 0 - - - - - - - - - - - - - 0 - - - 0 - - - - - - - 0 - - - - - 0 - - - 0 - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Arrays/ArrayBracketSpacingStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Arrays/ArrayBracketSpacingStandard.xml deleted file mode 100644 index d91fec9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Arrays/ArrayBracketSpacingStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - ['bar']; - ]]> - - - [ 'bar' ]; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Arrays/ArrayDeclarationStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Arrays/ArrayDeclarationStandard.xml deleted file mode 100644 index 568fac3..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Arrays/ArrayDeclarationStandard.xml +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - array keyword must be lowercase. - ]]> - - - - - - - - - - - array keyword. - ]]> - - - - 'value1', - 'key2' => 'value2', - ); - ]]> - - - 'value1', - 'key2' => 'value2', - ); - ]]> - - - - array keyword. The closing parenthesis must be aligned with the start of the array keyword. - ]]> - - - - 'key1' => 'value1', - 'key2' => 'value2', - ); - ]]> - - - 'key1' => 'value1', - 'key2' => 'value2', -); - ]]> - - - - - - - - => 'ValueTen', - 'keyTwenty' => 'ValueTwenty', - ); - ]]> - - - => 'ValueTen', - 'keyTwenty' => 'ValueTwenty', - ); - ]]> - - - - - - - - 'value1', - 'key2' => 'value2', - 'key3' => 'value3', - ); - ]]> - - - 'value1', - 'key2' => 'value2', - 'key3' => 'value3' - ); - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Classes/ClassFileNameStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Classes/ClassFileNameStandard.xml deleted file mode 100644 index b252969..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Classes/ClassFileNameStandard.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - Foo.php contents: */ - -class Foo -{ -} - ]]> - - - Foo.php contents: */ - -class MyFoo -{ -} - ]]> - - - - - MyFoo.php contents: */ - -class MyFoo -{ -} - ]]> - - - myFoo.php contents: */ - -class MyFoo -{ -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Classes/LowercaseClassKeywordsStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Classes/LowercaseClassKeywordsStandard.xml deleted file mode 100644 index 610edf6..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Classes/LowercaseClassKeywordsStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - final class Foo extends Bar -{ -} - ]]> - - - Final Class Foo Extends Bar -{ -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Classes/SelfMemberReferenceStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Classes/SelfMemberReferenceStandard.xml deleted file mode 100644 index c4e2e52..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Classes/SelfMemberReferenceStandard.xml +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - self::foo(); - } -} - ]]> - - - SELF::foo(); - } -} - ]]> - - - - - - - - ::foo(); - } -} - ]]> - - - :: foo(); - } -} - ]]> - - - - - - - - self::bar(); - } -} - ]]> - - - Foo { - public function bar() {} - - public function baz() { - Foo::bar(); - } -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Classes/ValidClassNameStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Classes/ValidClassNameStandard.xml deleted file mode 100644 index cc1a4e9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Classes/ValidClassNameStandard.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - PascalCaseStandard -{ -} - ]]> - - - notPascalCaseStandard -{ -} - ]]> - - - - - PSR7Response -{ -} - ]]> - - - PSR7_Response -{ -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Commenting/BlockCommentStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Commenting/BlockCommentStandard.xml deleted file mode 100644 index 0e6a6b8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Commenting/BlockCommentStandard.xml +++ /dev/null @@ -1,280 +0,0 @@ - - - - - - - /* - A block comment. -*/ - ]]> - - - /** - A block comment. -**/ - ]]> - - - - - /* - * A block comment - * with multiple lines. - */ - ]]> - - - // A block comment -// with multiple lines. - -# A block comment -# with multiple lines. - ]]> - - - - - - - - /* - A block comment. -*/ - ]]> - - - /* A block comment. */ - ]]> - - - - - - - - A block comment. -*/ - ]]> - - - -*/ - ]]> - - - - - - - - A block comment. -*/ - ]]> - - - A block comment. -*/ - ]]> - - - - - - - - A block comment - with multiple lines. - And a second paragraph. -*/ - ]]> - - - A block comment - with - multiple lines. -*/ - ]]> - - - - - - - - * - * A block comment - * with - * multiple lines. - */ - ]]> - - - * with - * multiple lines. -*/ - ]]> - - - - - - - - A block comment. -*/ - ]]> - - - a block comment. -*/ - ]]> - - - - - - - - */ - ]]> - - - */ - ]]> - - - - If asterisks are used, the closer's asterisk should be aligned with these. Otherwise, the closer's asterisk should be aligned with the opener's slash. - - - - * - * A block comment - */ - ]]> - - - */ - ]]> - - - - - /* - A block comment. -*/ - ]]> - - - */ - ]]> - - - - - - - - -echo 'Content'; - ]]> - - - echo 'Content'; - ]]> - - - - - - - - /* - * A block comment - * with - * multiple lines. - */ - ]]> - - - -/* - * A block comment - * with - * multiple lines. - */ - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Commenting/DocCommentAlignmentStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Commenting/DocCommentAlignmentStandard.xml deleted file mode 100644 index 17fed42..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Commenting/DocCommentAlignmentStandard.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - * @see foo() - */ - ]]> - - - * @see foo() -*/ - ]]> - - - - - @see foo() - */ - ]]> - - - @see foo() - */ - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Commenting/FunctionCommentThrowTagStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Commenting/FunctionCommentThrowTagStandard.xml deleted file mode 100644 index e3638a4..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Commenting/FunctionCommentThrowTagStandard.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - @throws Exception all the time - * @return void - */ -function foo() -{ - throw new Exception('Danger!'); -} - ]]> - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/ControlStructures/ForEachLoopDeclarationStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/ControlStructures/ForEachLoopDeclarationStandard.xml deleted file mode 100644 index 42fa6f4..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/ControlStructures/ForEachLoopDeclarationStandard.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - $foo as $bar => $baz) { - echo $baz; -} - ]]> - - - $foo as $bar=>$baz ) { - echo $baz; -} - ]]> - - - - - as $bar => $baz) { - echo $baz; -} - ]]> - - - AS $bar => $baz) { - echo $baz; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/ControlStructures/ForLoopDeclarationStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/ControlStructures/ForLoopDeclarationStandard.xml deleted file mode 100644 index 37caade..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/ControlStructures/ForLoopDeclarationStandard.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - $i = 0; $i < 10; $i++) { - echo $i; -} - ]]> - - - $i = 0; $i < 10; $i++ ) { - echo $i; -} - ]]> - - - - - ; $i < 10; $i++) { - echo $i; -} - ]]> - - - ; $i < 10 ; $i++) { - echo $i; -} - ]]> - - - - - $i < 10; $i++) { - echo $i; -} - ]]> - - - $i < 10;$i++) { - echo $i; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/ControlStructures/LowercaseDeclarationStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/ControlStructures/LowercaseDeclarationStandard.xml deleted file mode 100644 index d281400..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/ControlStructures/LowercaseDeclarationStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - if ($foo) { - $bar = true; -} - ]]> - - - IF ($foo) { - $bar = true; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Functions/LowercaseFunctionKeywordsStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Functions/LowercaseFunctionKeywordsStandard.xml deleted file mode 100644 index fb2ef44..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Functions/LowercaseFunctionKeywordsStandard.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - function foo() -{ - return true; -} - ]]> - - - FUNCTION foo() -{ - return true; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/PHP/HeredocStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/PHP/HeredocStandard.xml deleted file mode 100644 index b2a63be..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/PHP/HeredocStandard.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - -some text - - - - <<; - -echo <<<'EOD' -some text -EOD; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Scope/StaticThisUsageStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Scope/StaticThisUsageStandard.xml deleted file mode 100644 index 0145657..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Scope/StaticThisUsageStandard.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - static function bar() - { - return self::$staticMember; - } -} - ]]> - - - static function bar() - { - return $this->$staticMember; - } -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Strings/EchoedStringsStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Strings/EchoedStringsStandard.xml deleted file mode 100644 index 2bc536e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/Strings/EchoedStringsStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - "Hello"; - ]]> - - - ("Hello"); - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/CastSpacingStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/CastSpacingStandard.xml deleted file mode 100644 index 9529b1f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/CastSpacingStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - int)'42'; - ]]> - - - int )'42'; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/FunctionClosingBraceSpaceStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/FunctionClosingBraceSpaceStandard.xml deleted file mode 100644 index ccbdfa2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/FunctionClosingBraceSpaceStandard.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - { - -} -]]> - - - {} -]]> - - - - - - - - - { - } - -} -]]> - - - {} - -} -]]> - - - - - - - - - { - } - -} -]]> - - - { - - } - -} -]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/FunctionOpeningBraceSpaceStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/FunctionOpeningBraceSpaceStandard.xml deleted file mode 100644 index c0663c2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/FunctionOpeningBraceSpaceStandard.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - return 42; -} - ]]> - - - - return 42; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/LanguageConstructSpacingStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/LanguageConstructSpacingStandard.xml deleted file mode 100644 index 85838ec..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/LanguageConstructSpacingStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - "hi"; - ]]> - - - "hi"; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/MemberVarSpacingStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/MemberVarSpacingStandard.xml deleted file mode 100644 index a551af8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/MemberVarSpacingStandard.xml +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - protected $var1 = 'value'; -} - ]]> - - - - protected $var1 = 'value'; -} - ]]> - - - - - - - - - - public $var2 = 'value2'; - - public $var3 = 'value3'; -} - ]]> - - - - - - public $var2 = 'value2'; - public $var3 = 'value3'; -} - ]]> - - - - - - - - - public $actions = array(); -}; - ]]> - - - - - public $actions = array(); -}; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/ObjectOperatorSpacingStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/ObjectOperatorSpacingStandard.xml deleted file mode 100644 index 44edc7b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/ObjectOperatorSpacingStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - ) should not have any space around it. - ]]> - - - - ->bar(); - ]]> - - - -> bar(); - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/ScopeClosingBraceStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/ScopeClosingBraceStandard.xml deleted file mode 100644 index 3284df9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/ScopeClosingBraceStandard.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - } - -if (!class_exists('Foo')) { - class Foo { - } -} - - - some output - ?> - ]]> - - - } - -if (!class_exists('Foo')) { - class Foo { -} - } - - - some output - ?> - ]]> - - - - - - - - } - ]]> - - - } - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/ScopeKeywordSpacingStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/ScopeKeywordSpacingStandard.xml deleted file mode 100644 index f226a12..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/ScopeKeywordSpacingStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - static function foo() -{ -} - ]]> - - - static function foo() -{ -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/SemicolonSpacingStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/SemicolonSpacingStandard.xml deleted file mode 100644 index bb9bf8f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/SemicolonSpacingStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - ; - ]]> - - - ; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/SuperfluousWhitespaceStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/SuperfluousWhitespaceStandard.xml deleted file mode 100644 index b4ad03d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Docs/WhiteSpace/SuperfluousWhitespaceStandard.xml +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - ]]> - - - - - - - - - - - - - echo 'code here'; -} - ]]> - - - - - - - - - - ]]> - - - - - - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Arrays/ArrayBracketSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Arrays/ArrayBracketSpacingSniff.php deleted file mode 100644 index 2b5af81..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Arrays/ArrayBracketSpacingSniff.php +++ /dev/null @@ -1,95 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Arrays; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ArrayBracketSpacingSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_OPEN_SQUARE_BRACKET, - T_CLOSE_SQUARE_BRACKET, - ]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being checked. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (($tokens[$stackPtr]['code'] === T_OPEN_SQUARE_BRACKET - && isset($tokens[$stackPtr]['bracket_closer']) === false) - || ($tokens[$stackPtr]['code'] === T_CLOSE_SQUARE_BRACKET - && isset($tokens[$stackPtr]['bracket_opener']) === false) - ) { - // Bow out for parse error/during live coding. - return; - } - - // Square brackets can not have a space before them. - $prevType = $tokens[($stackPtr - 1)]['code']; - if ($prevType === T_WHITESPACE) { - $nonSpace = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 2), null, true); - $expected = $tokens[$nonSpace]['content'].$tokens[$stackPtr]['content']; - $found = $phpcsFile->getTokensAsString($nonSpace, ($stackPtr - $nonSpace)).$tokens[$stackPtr]['content']; - $error = 'Space found before square bracket; expected "%s" but found "%s"'; - $data = [ - $expected, - $found, - ]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceBeforeBracket', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr - 1), ''); - } - } - - // Open square brackets can't ever have spaces after them. - if ($tokens[$stackPtr]['code'] === T_OPEN_SQUARE_BRACKET) { - $nextType = $tokens[($stackPtr + 1)]['code']; - if ($nextType === T_WHITESPACE) { - $nonSpace = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 2), null, true); - $expected = $tokens[$stackPtr]['content'].$tokens[$nonSpace]['content']; - $found = $phpcsFile->getTokensAsString($stackPtr, ($nonSpace - $stackPtr + 1)); - $error = 'Space found after square bracket; expected "%s" but found "%s"'; - $data = [ - $expected, - $found, - ]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceAfterBracket', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ''); - } - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Arrays/ArrayDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Arrays/ArrayDeclarationSniff.php deleted file mode 100644 index 795438e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Arrays/ArrayDeclarationSniff.php +++ /dev/null @@ -1,962 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Arrays; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ArrayDeclarationSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_ARRAY, - T_OPEN_SHORT_ARRAY, - ]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being checked. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Prevent acting on short lists inside a foreach (see - // https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/527). - if ($tokens[$stackPtr]['code'] === T_OPEN_SHORT_ARRAY - && isset($tokens[$stackPtr]['nested_parenthesis']) === true - ) { - $nestedParens = $tokens[$stackPtr]['nested_parenthesis']; - $lastParenthesisCloser = end($nestedParens); - $lastParenthesisOpener = key($nestedParens); - - if (isset($tokens[$lastParenthesisCloser]['parenthesis_owner']) === true - && $tokens[$tokens[$lastParenthesisCloser]['parenthesis_owner']]['code'] === T_FOREACH - ) { - $asKeyword = $phpcsFile->findNext(T_AS, ($lastParenthesisOpener + 1), $lastParenthesisCloser); - - if ($asKeyword !== false && $asKeyword < $stackPtr) { - return; - } - } - } - - if ($tokens[$stackPtr]['code'] === T_ARRAY) { - $phpcsFile->recordMetric($stackPtr, 'Short array syntax used', 'no'); - - // Array keyword should be lower case. - if ($tokens[$stackPtr]['content'] !== strtolower($tokens[$stackPtr]['content'])) { - if ($tokens[$stackPtr]['content'] === strtoupper($tokens[$stackPtr]['content'])) { - $phpcsFile->recordMetric($stackPtr, 'Array keyword case', 'upper'); - } else { - $phpcsFile->recordMetric($stackPtr, 'Array keyword case', 'mixed'); - } - - $error = 'Array keyword should be lower case; expected "array" but found "%s"'; - $data = [$tokens[$stackPtr]['content']]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NotLowerCase', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, 'array'); - } - } else { - $phpcsFile->recordMetric($stackPtr, 'Array keyword case', 'lower'); - } - - $arrayStart = $tokens[$stackPtr]['parenthesis_opener']; - if (isset($tokens[$arrayStart]['parenthesis_closer']) === false) { - return; - } - - $arrayEnd = $tokens[$arrayStart]['parenthesis_closer']; - - if ($arrayStart !== ($stackPtr + 1)) { - $error = 'There must be no space between the "array" keyword and the opening parenthesis'; - - $next = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), $arrayStart, true); - if (isset(Tokens::$commentTokens[$tokens[$next]['code']]) === true) { - // We don't have anywhere to put the comment, so don't attempt to fix it. - $phpcsFile->addError($error, $stackPtr, 'SpaceAfterKeyword'); - } else { - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceAfterKeyword'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($stackPtr + 1); $i < $arrayStart; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - } - } else { - $phpcsFile->recordMetric($stackPtr, 'Short array syntax used', 'yes'); - $arrayStart = $stackPtr; - $arrayEnd = $tokens[$stackPtr]['bracket_closer']; - }//end if - - // Check for empty arrays. - $content = $phpcsFile->findNext(T_WHITESPACE, ($arrayStart + 1), ($arrayEnd + 1), true); - if ($content === $arrayEnd) { - // Empty array, but if the brackets aren't together, there's a problem. - if (($arrayEnd - $arrayStart) !== 1) { - $error = 'Empty array declaration must have no space between the parentheses'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceInEmptyArray'); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($arrayStart + 1); $i < $arrayEnd; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - - // We can return here because there is nothing else to check. All code - // below can assume that the array is not empty. - return; - } - - if ($tokens[$arrayStart]['line'] === $tokens[$arrayEnd]['line']) { - $this->processSingleLineArray($phpcsFile, $stackPtr, $arrayStart, $arrayEnd); - } else { - $this->processMultiLineArray($phpcsFile, $stackPtr, $arrayStart, $arrayEnd); - } - - }//end process() - - - /** - * Processes a single-line array definition. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being checked. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $arrayStart The token that starts the array definition. - * @param int $arrayEnd The token that ends the array definition. - * - * @return void - */ - public function processSingleLineArray($phpcsFile, $stackPtr, $arrayStart, $arrayEnd) - { - $tokens = $phpcsFile->getTokens(); - - // Check if there are multiple values. If so, then it has to be multiple lines - // unless it is contained inside a function call or condition. - $valueCount = 0; - $commas = []; - for ($i = ($arrayStart + 1); $i < $arrayEnd; $i++) { - // Skip bracketed statements, like function calls. - if ($tokens[$i]['code'] === T_OPEN_PARENTHESIS) { - $i = $tokens[$i]['parenthesis_closer']; - continue; - } - - if ($tokens[$i]['code'] === T_COMMA) { - // Before counting this comma, make sure we are not - // at the end of the array. - $next = $phpcsFile->findNext(T_WHITESPACE, ($i + 1), $arrayEnd, true); - if ($next !== false) { - $valueCount++; - $commas[] = $i; - } else { - // There is a comma at the end of a single line array. - $error = 'Comma not allowed after last value in single-line array declaration'; - $fix = $phpcsFile->addFixableError($error, $i, 'CommaAfterLast'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($i, ''); - } - } - } - }//end for - - // Now check each of the double arrows (if any). - $nextArrow = $arrayStart; - while (($nextArrow = $phpcsFile->findNext(T_DOUBLE_ARROW, ($nextArrow + 1), $arrayEnd)) !== false) { - if ($tokens[($nextArrow - 1)]['code'] !== T_WHITESPACE) { - $content = $tokens[($nextArrow - 1)]['content']; - $error = 'Expected 1 space between "%s" and double arrow; 0 found'; - $data = [$content]; - $fix = $phpcsFile->addFixableError($error, $nextArrow, 'NoSpaceBeforeDoubleArrow', $data); - if ($fix === true) { - $phpcsFile->fixer->addContentBefore($nextArrow, ' '); - } - } else { - $spaceLength = $tokens[($nextArrow - 1)]['length']; - if ($spaceLength !== 1) { - $content = $tokens[($nextArrow - 2)]['content']; - $error = 'Expected 1 space between "%s" and double arrow; %s found'; - $data = [ - $content, - $spaceLength, - ]; - - $fix = $phpcsFile->addFixableError($error, $nextArrow, 'SpaceBeforeDoubleArrow', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($nextArrow - 1), ' '); - } - } - }//end if - - if ($tokens[($nextArrow + 1)]['code'] !== T_WHITESPACE) { - $content = $tokens[($nextArrow + 1)]['content']; - $error = 'Expected 1 space between double arrow and "%s"; 0 found'; - $data = [$content]; - $fix = $phpcsFile->addFixableError($error, $nextArrow, 'NoSpaceAfterDoubleArrow', $data); - if ($fix === true) { - $phpcsFile->fixer->addContent($nextArrow, ' '); - } - } else { - $spaceLength = $tokens[($nextArrow + 1)]['length']; - if ($spaceLength !== 1) { - $content = $tokens[($nextArrow + 2)]['content']; - $error = 'Expected 1 space between double arrow and "%s"; %s found'; - $data = [ - $content, - $spaceLength, - ]; - - $fix = $phpcsFile->addFixableError($error, $nextArrow, 'SpaceAfterDoubleArrow', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($nextArrow + 1), ' '); - } - } - }//end if - }//end while - - if ($valueCount > 0) { - $nestedParenthesis = false; - if (isset($tokens[$stackPtr]['nested_parenthesis']) === true) { - $nested = $tokens[$stackPtr]['nested_parenthesis']; - $nestedParenthesis = array_pop($nested); - } - - if ($nestedParenthesis === false - || $tokens[$nestedParenthesis]['line'] !== $tokens[$stackPtr]['line'] - ) { - $error = 'Array with multiple values cannot be declared on a single line'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SingleLineNotAllowed'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->addNewline($arrayStart); - - if ($tokens[($arrayEnd - 1)]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->replaceToken(($arrayEnd - 1), $phpcsFile->eolChar); - } else { - $phpcsFile->fixer->addNewlineBefore($arrayEnd); - } - - $phpcsFile->fixer->endChangeset(); - } - - return; - } - - // We have a multiple value array that is inside a condition or - // function. Check its spacing is correct. - foreach ($commas as $comma) { - if ($tokens[($comma + 1)]['code'] !== T_WHITESPACE) { - $content = $tokens[($comma + 1)]['content']; - $error = 'Expected 1 space between comma and "%s"; 0 found'; - $data = [$content]; - $fix = $phpcsFile->addFixableError($error, $comma, 'NoSpaceAfterComma', $data); - if ($fix === true) { - $phpcsFile->fixer->addContent($comma, ' '); - } - } else { - $spaceLength = $tokens[($comma + 1)]['length']; - if ($spaceLength !== 1) { - $content = $tokens[($comma + 2)]['content']; - $error = 'Expected 1 space between comma and "%s"; %s found'; - $data = [ - $content, - $spaceLength, - ]; - - $fix = $phpcsFile->addFixableError($error, $comma, 'SpaceAfterComma', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($comma + 1), ' '); - } - } - }//end if - - if ($tokens[($comma - 1)]['code'] === T_WHITESPACE) { - $content = $tokens[($comma - 2)]['content']; - $spaceLength = $tokens[($comma - 1)]['length']; - $error = 'Expected 0 spaces between "%s" and comma; %s found'; - $data = [ - $content, - $spaceLength, - ]; - - $fix = $phpcsFile->addFixableError($error, $comma, 'SpaceBeforeComma', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($comma - 1), ''); - } - } - }//end foreach - }//end if - - }//end processSingleLineArray() - - - /** - * Processes a multi-line array definition. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being checked. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $arrayStart The token that starts the array definition. - * @param int $arrayEnd The token that ends the array definition. - * - * @return void - */ - public function processMultiLineArray($phpcsFile, $stackPtr, $arrayStart, $arrayEnd) - { - $tokens = $phpcsFile->getTokens(); - $keywordStart = $tokens[$stackPtr]['column']; - - // Check the closing bracket is on a new line. - $lastContent = $phpcsFile->findPrevious(T_WHITESPACE, ($arrayEnd - 1), $arrayStart, true); - if ($tokens[$lastContent]['line'] === $tokens[$arrayEnd]['line']) { - $error = 'Closing parenthesis of array declaration must be on a new line'; - $fix = $phpcsFile->addFixableError($error, $arrayEnd, 'CloseBraceNewLine'); - if ($fix === true) { - $phpcsFile->fixer->addNewlineBefore($arrayEnd); - } - } else if ($tokens[$arrayEnd]['column'] !== $keywordStart) { - // Check the closing bracket is lined up under the "a" in array. - $expected = ($keywordStart - 1); - $found = ($tokens[$arrayEnd]['column'] - 1); - $pluralizeSpace = 's'; - if ($expected === 1) { - $pluralizeSpace = ''; - } - - $error = 'Closing parenthesis not aligned correctly; expected %s space%s but found %s'; - $data = [ - $expected, - $pluralizeSpace, - $found, - ]; - - $fix = $phpcsFile->addFixableError($error, $arrayEnd, 'CloseBraceNotAligned', $data); - if ($fix === true) { - if ($found === 0) { - $phpcsFile->fixer->addContent(($arrayEnd - 1), str_repeat(' ', $expected)); - } else { - $phpcsFile->fixer->replaceToken(($arrayEnd - 1), str_repeat(' ', $expected)); - } - } - }//end if - - $keyUsed = false; - $singleUsed = false; - $indices = []; - $maxLength = 0; - - if ($tokens[$stackPtr]['code'] === T_ARRAY) { - $lastToken = $tokens[$stackPtr]['parenthesis_opener']; - } else { - $lastToken = $stackPtr; - } - - // Find all the double arrows that reside in this scope. - for ($nextToken = ($stackPtr + 1); $nextToken < $arrayEnd; $nextToken++) { - // Skip bracketed statements, like function calls. - if ($tokens[$nextToken]['code'] === T_OPEN_PARENTHESIS - && (isset($tokens[$nextToken]['parenthesis_owner']) === false - || $tokens[$nextToken]['parenthesis_owner'] !== $stackPtr) - ) { - $nextToken = $tokens[$nextToken]['parenthesis_closer']; - continue; - } - - if ($tokens[$nextToken]['code'] === T_ARRAY - || $tokens[$nextToken]['code'] === T_OPEN_SHORT_ARRAY - || $tokens[$nextToken]['code'] === T_CLOSURE - || $tokens[$nextToken]['code'] === T_FN - || $tokens[$nextToken]['code'] === T_MATCH - ) { - // Let subsequent calls of this test handle nested arrays. - if ($tokens[$lastToken]['code'] !== T_DOUBLE_ARROW) { - $indices[] = ['value' => $nextToken]; - $lastToken = $nextToken; - } - - if ($tokens[$nextToken]['code'] === T_ARRAY) { - $nextToken = $tokens[$tokens[$nextToken]['parenthesis_opener']]['parenthesis_closer']; - } else if ($tokens[$nextToken]['code'] === T_OPEN_SHORT_ARRAY) { - $nextToken = $tokens[$nextToken]['bracket_closer']; - } else { - // T_CLOSURE. - $nextToken = $tokens[$nextToken]['scope_closer']; - } - - $nextToken = $phpcsFile->findNext(T_WHITESPACE, ($nextToken + 1), null, true); - if ($tokens[$nextToken]['code'] !== T_COMMA) { - $nextToken--; - } else { - $lastToken = $nextToken; - } - - continue; - }//end if - - if ($tokens[$nextToken]['code'] !== T_DOUBLE_ARROW && $tokens[$nextToken]['code'] !== T_COMMA) { - continue; - } - - $currentEntry = []; - - if ($tokens[$nextToken]['code'] === T_COMMA) { - $stackPtrCount = 0; - if (isset($tokens[$stackPtr]['nested_parenthesis']) === true) { - $stackPtrCount = count($tokens[$stackPtr]['nested_parenthesis']); - } - - $commaCount = 0; - if (isset($tokens[$nextToken]['nested_parenthesis']) === true) { - $commaCount = count($tokens[$nextToken]['nested_parenthesis']); - if ($tokens[$stackPtr]['code'] === T_ARRAY) { - // Remove parenthesis that are used to define the array. - $commaCount--; - } - } - - if ($commaCount > $stackPtrCount) { - // This comma is inside more parenthesis than the ARRAY keyword, - // then there it is actually a comma used to separate arguments - // in a function call. - continue; - } - - if ($keyUsed === true && $tokens[$lastToken]['code'] === T_COMMA) { - $nextToken = $phpcsFile->findNext(Tokens::$emptyTokens, ($lastToken + 1), null, true); - // Allow for PHP 7.4+ array unpacking within an array declaration. - if ($tokens[$nextToken]['code'] !== T_ELLIPSIS) { - $error = 'No key specified for array entry; first entry specifies key'; - $phpcsFile->addError($error, $nextToken, 'NoKeySpecified'); - return; - } - } - - if ($keyUsed === false) { - if ($tokens[($nextToken - 1)]['code'] === T_WHITESPACE) { - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($nextToken - 1), null, true); - if (($tokens[$prev]['code'] !== T_END_HEREDOC - && $tokens[$prev]['code'] !== T_END_NOWDOC) - || $tokens[($nextToken - 1)]['line'] === $tokens[$nextToken]['line'] - ) { - if ($tokens[($nextToken - 1)]['content'] === $phpcsFile->eolChar) { - $spaceLength = 'newline'; - } else { - $spaceLength = $tokens[($nextToken - 1)]['length']; - } - - $error = 'Expected 0 spaces before comma; %s found'; - $data = [$spaceLength]; - - // The error is only fixable if there is only whitespace between the tokens. - if ($prev === $phpcsFile->findPrevious(T_WHITESPACE, ($nextToken - 1), null, true)) { - $fix = $phpcsFile->addFixableError($error, $nextToken, 'SpaceBeforeComma', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($nextToken - 1), ''); - } - } else { - $phpcsFile->addError($error, $nextToken, 'SpaceBeforeComma', $data); - } - } - }//end if - - $valueContent = $phpcsFile->findNext( - Tokens::$emptyTokens, - ($lastToken + 1), - $nextToken, - true - ); - - $indices[] = ['value' => $valueContent]; - $usesArrayUnpacking = $phpcsFile->findPrevious( - Tokens::$emptyTokens, - ($nextToken - 2), - null, - true - ); - if ($tokens[$usesArrayUnpacking]['code'] !== T_ELLIPSIS) { - // Don't decide if an array is key => value indexed or not when PHP 7.4+ array unpacking is used. - $singleUsed = true; - } - }//end if - - $lastToken = $nextToken; - continue; - }//end if - - if ($tokens[$nextToken]['code'] === T_DOUBLE_ARROW) { - if ($singleUsed === true) { - $error = 'Key specified for array entry; first entry has no key'; - $phpcsFile->addError($error, $nextToken, 'KeySpecified'); - return; - } - - $currentEntry['arrow'] = $nextToken; - $keyUsed = true; - - // Find the start of index that uses this double arrow. - $indexEnd = $phpcsFile->findPrevious(T_WHITESPACE, ($nextToken - 1), $arrayStart, true); - $indexStart = $phpcsFile->findStartOfStatement($indexEnd); - - if ($indexStart === $indexEnd) { - $currentEntry['index'] = $indexEnd; - $currentEntry['index_content'] = $tokens[$indexEnd]['content']; - $currentEntry['index_length'] = $tokens[$indexEnd]['length']; - } else { - $currentEntry['index'] = $indexStart; - $currentEntry['index_content'] = ''; - $currentEntry['index_length'] = 0; - for ($i = $indexStart; $i <= $indexEnd; $i++) { - $currentEntry['index_content'] .= $tokens[$i]['content']; - $currentEntry['index_length'] += $tokens[$i]['length']; - } - } - - if ($maxLength < $currentEntry['index_length']) { - $maxLength = $currentEntry['index_length']; - } - - // Find the value of this index. - $nextContent = $phpcsFile->findNext( - Tokens::$emptyTokens, - ($nextToken + 1), - $arrayEnd, - true - ); - - $currentEntry['value'] = $nextContent; - $indices[] = $currentEntry; - $lastToken = $nextToken; - }//end if - }//end for - - // Check for multi-line arrays that should be single-line. - $singleValue = false; - - if (empty($indices) === true) { - $singleValue = true; - } else if (count($indices) === 1 && $tokens[$lastToken]['code'] === T_COMMA) { - // There may be another array value without a comma. - $exclude = Tokens::$emptyTokens; - $exclude[] = T_COMMA; - $nextContent = $phpcsFile->findNext($exclude, ($indices[0]['value'] + 1), $arrayEnd, true); - if ($nextContent === false) { - $singleValue = true; - } - } - - if ($singleValue === true) { - // Before we complain, make sure the single value isn't a here/nowdoc. - $next = $phpcsFile->findNext(Tokens::$heredocTokens, ($arrayStart + 1), ($arrayEnd - 1)); - if ($next === false) { - // Array cannot be empty, so this is a multi-line array with - // a single value. It should be defined on single line. - $error = 'Multi-line array contains a single value; use single-line array instead'; - $errorCode = 'MultiLineNotAllowed'; - - $find = Tokens::$phpcsCommentTokens; - $find[] = T_COMMENT; - $comment = $phpcsFile->findNext($find, ($arrayStart + 1), $arrayEnd); - if ($comment === false) { - $fix = $phpcsFile->addFixableError($error, $stackPtr, $errorCode); - } else { - $fix = false; - $phpcsFile->addError($error, $stackPtr, $errorCode); - } - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($arrayStart + 1); $i < $arrayEnd; $i++) { - if ($tokens[$i]['code'] !== T_WHITESPACE) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - for ($i = ($arrayEnd - 1); $i > $arrayStart; $i--) { - if ($tokens[$i]['code'] !== T_WHITESPACE) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - - return; - }//end if - }//end if - - /* - This section checks for arrays that don't specify keys. - - Arrays such as: - array( - 'aaa', - 'bbb', - 'd', - ); - */ - - if ($keyUsed === false && empty($indices) === false) { - $count = count($indices); - $lastIndex = $indices[($count - 1)]['value']; - - $trailingContent = $phpcsFile->findPrevious( - Tokens::$emptyTokens, - ($arrayEnd - 1), - $lastIndex, - true - ); - - if ($tokens[$trailingContent]['code'] !== T_COMMA) { - $phpcsFile->recordMetric($stackPtr, 'Array end comma', 'no'); - $error = 'Comma required after last value in array declaration'; - $fix = $phpcsFile->addFixableError($error, $trailingContent, 'NoCommaAfterLast'); - if ($fix === true) { - $phpcsFile->fixer->addContent($trailingContent, ','); - } - } else { - $phpcsFile->recordMetric($stackPtr, 'Array end comma', 'yes'); - } - - foreach ($indices as $valuePosition => $value) { - if (empty($value['value']) === true) { - // Array was malformed and we couldn't figure out - // the array value correctly, so we have to ignore it. - // Other parts of this sniff will correct the error. - continue; - } - - $valuePointer = $value['value']; - - $ignoreTokens = [ - T_WHITESPACE => T_WHITESPACE, - T_COMMA => T_COMMA, - ]; - $ignoreTokens += Tokens::$castTokens; - - if ($tokens[$valuePointer]['code'] === T_CLOSURE - || $tokens[$valuePointer]['code'] === T_FN - ) { - // Check if the closure is static, if it is, override the value pointer as indices before skip static. - $staticPointer = $phpcsFile->findPrevious($ignoreTokens, ($valuePointer - 1), ($arrayStart + 1), true); - if ($staticPointer !== false && $tokens[$staticPointer]['code'] === T_STATIC) { - $valuePointer = $staticPointer; - } - } - - $previous = $phpcsFile->findPrevious($ignoreTokens, ($valuePointer - 1), ($arrayStart + 1), true); - if ($previous === false) { - $previous = $stackPtr; - } - - $previousIsWhitespace = $tokens[($valuePointer - 1)]['code'] === T_WHITESPACE; - if ($tokens[$previous]['line'] === $tokens[$valuePointer]['line']) { - $error = 'Each value in a multi-line array must be on a new line'; - if ($valuePosition === 0) { - $error = 'The first value in a multi-value array must be on a new line'; - } - - $fix = $phpcsFile->addFixableError($error, $valuePointer, 'ValueNoNewline'); - if ($fix === true) { - if ($previousIsWhitespace === true) { - $phpcsFile->fixer->replaceToken(($valuePointer - 1), $phpcsFile->eolChar); - } else { - $phpcsFile->fixer->addNewlineBefore($valuePointer); - } - } - } else if ($previousIsWhitespace === true) { - $expected = $keywordStart; - - $first = $phpcsFile->findFirstOnLine(T_WHITESPACE, $valuePointer, true); - $found = ($tokens[$first]['column'] - 1); - $pluralizeSpace = 's'; - if ($expected === 1) { - $pluralizeSpace = ''; - } - - if ($found !== $expected) { - $error = 'Array value not aligned correctly; expected %s space%s but found %s'; - $data = [ - $expected, - $pluralizeSpace, - $found, - ]; - - $fix = $phpcsFile->addFixableError($error, $first, 'ValueNotAligned', $data); - if ($fix === true) { - if ($found === 0) { - $phpcsFile->fixer->addContent(($first - 1), str_repeat(' ', $expected)); - } else { - $phpcsFile->fixer->replaceToken(($first - 1), str_repeat(' ', $expected)); - } - } - } - }//end if - }//end foreach - }//end if - - /* - Below the actual indentation of the array is checked. - Errors will be thrown when a key is not aligned, when - a double arrow is not aligned, and when a value is not - aligned correctly. - If an error is found in one of the above areas, then errors - are not reported for the rest of the line to avoid reporting - spaces and columns incorrectly. Often fixing the first - problem will fix the other 2 anyway. - - For example: - - $a = array( - 'index' => '2', - ); - - or - - $a = [ - 'index' => '2', - ]; - - In this array, the double arrow is indented too far, but this - will also cause an error in the value's alignment. If the arrow were - to be moved back one space however, then both errors would be fixed. - */ - - $indicesStart = ($keywordStart + 1); - foreach ($indices as $valuePosition => $index) { - $valuePointer = $index['value']; - if ($valuePointer === false) { - // Syntax error or live coding. - continue; - } - - if (isset($index['index']) === false) { - // Array value only. - continue; - } - - $indexPointer = $index['index']; - $indexLine = $tokens[$indexPointer]['line']; - - $previous = $phpcsFile->findPrevious([T_WHITESPACE, T_COMMA], ($indexPointer - 1), ($arrayStart + 1), true); - if ($previous === false) { - $previous = $stackPtr; - } - - if ($tokens[$previous]['line'] === $indexLine) { - $error = 'Each index in a multi-line array must be on a new line'; - if ($valuePosition === 0) { - $error = 'The first index in a multi-value array must be on a new line'; - } - - $fix = $phpcsFile->addFixableError($error, $indexPointer, 'IndexNoNewline'); - if ($fix === true) { - if ($tokens[($indexPointer - 1)]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->replaceToken(($indexPointer - 1), $phpcsFile->eolChar); - } else { - $phpcsFile->fixer->addNewlineBefore($indexPointer); - } - } - - continue; - } - - if ($tokens[$indexPointer]['column'] !== $indicesStart && ($indexPointer - 1) !== $arrayStart) { - $expected = ($indicesStart - 1); - $found = ($tokens[$indexPointer]['column'] - 1); - $pluralizeSpace = 's'; - if ($expected === 1) { - $pluralizeSpace = ''; - } - - $error = 'Array key not aligned correctly; expected %s space%s but found %s'; - $data = [ - $expected, - $pluralizeSpace, - $found, - ]; - - $fix = $phpcsFile->addFixableError($error, $indexPointer, 'KeyNotAligned', $data); - if ($fix === true) { - if ($found === 0 || $tokens[($indexPointer - 1)]['code'] !== T_WHITESPACE) { - $phpcsFile->fixer->addContent(($indexPointer - 1), str_repeat(' ', $expected)); - } else { - $phpcsFile->fixer->replaceToken(($indexPointer - 1), str_repeat(' ', $expected)); - } - } - }//end if - - $arrowStart = ($tokens[$indexPointer]['column'] + $maxLength + 1); - if ($tokens[$index['arrow']]['column'] !== $arrowStart) { - $expected = ($arrowStart - ($index['index_length'] + $tokens[$indexPointer]['column'])); - $found = ($tokens[$index['arrow']]['column'] - ($index['index_length'] + $tokens[$indexPointer]['column'])); - $pluralizeSpace = 's'; - if ($expected === 1) { - $pluralizeSpace = ''; - } - - $error = 'Array double arrow not aligned correctly; expected %s space%s but found %s'; - $data = [ - $expected, - $pluralizeSpace, - $found, - ]; - - $fix = $phpcsFile->addFixableError($error, $index['arrow'], 'DoubleArrowNotAligned', $data); - if ($fix === true) { - if ($found === 0) { - $phpcsFile->fixer->addContent(($index['arrow'] - 1), str_repeat(' ', $expected)); - } else { - $phpcsFile->fixer->replaceToken(($index['arrow'] - 1), str_repeat(' ', $expected)); - } - } - - continue; - }//end if - - $valueStart = ($arrowStart + 3); - if ($tokens[$valuePointer]['column'] !== $valueStart) { - $expected = ($valueStart - ($tokens[$index['arrow']]['length'] + $tokens[$index['arrow']]['column'])); - $found = ($tokens[$valuePointer]['column'] - ($tokens[$index['arrow']]['length'] + $tokens[$index['arrow']]['column'])); - if ($found < 0) { - $found = 'newline'; - } - - $pluralizeSpace = 's'; - if ($expected === 1) { - $pluralizeSpace = ''; - } - - $error = 'Array value not aligned correctly; expected %s space%s but found %s'; - $data = [ - $expected, - $pluralizeSpace, - $found, - ]; - - $fix = $phpcsFile->addFixableError($error, $index['arrow'], 'ValueNotAligned', $data); - if ($fix === true) { - if ($found === 'newline') { - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($valuePointer - 1), null, true); - $phpcsFile->fixer->beginChangeset(); - for ($i = ($prev + 1); $i < $valuePointer; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->replaceToken(($valuePointer - 1), str_repeat(' ', $expected)); - $phpcsFile->fixer->endChangeset(); - } else if ($found === 0) { - $phpcsFile->fixer->addContent(($valuePointer - 1), str_repeat(' ', $expected)); - } else { - $phpcsFile->fixer->replaceToken(($valuePointer - 1), str_repeat(' ', $expected)); - } - } - }//end if - - // Check each line ends in a comma. - $valueStart = $valuePointer; - $nextComma = false; - - $end = $phpcsFile->findEndOfStatement($valueStart); - if ($end === false) { - $valueEnd = $valueStart; - } else if ($tokens[$end]['code'] === T_COMMA) { - $valueEnd = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($end - 1), $valueStart, true); - $nextComma = $end; - } else { - $valueEnd = $end; - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($end + 1), $arrayEnd, true); - if ($next !== false && $tokens[$next]['code'] === T_COMMA) { - $nextComma = $next; - } - } - - $valueLine = $tokens[$valueEnd]['line']; - if ($tokens[$valueEnd]['code'] === T_END_HEREDOC || $tokens[$valueEnd]['code'] === T_END_NOWDOC) { - $valueLine++; - } - - if ($nextComma === false || ($tokens[$nextComma]['line'] !== $valueLine)) { - $error = 'Each line in an array declaration must end in a comma'; - $fix = $phpcsFile->addFixableError($error, $valuePointer, 'NoComma'); - - if ($fix === true) { - // Find the end of the line and put a comma there. - for ($i = ($valuePointer + 1); $i <= $arrayEnd; $i++) { - if ($tokens[$i]['line'] > $valueLine) { - break; - } - } - - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->addContentBefore(($i - 1), ','); - if ($nextComma !== false) { - $phpcsFile->fixer->replaceToken($nextComma, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - }//end if - - // Check that there is no space before the comma. - if ($nextComma !== false && $tokens[($nextComma - 1)]['code'] === T_WHITESPACE) { - // Here/nowdoc closing tags must have the comma on the next line. - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($nextComma - 1), null, true); - if ($tokens[$prev]['code'] !== T_END_HEREDOC && $tokens[$prev]['code'] !== T_END_NOWDOC) { - $content = $tokens[($nextComma - 2)]['content']; - $spaceLength = $tokens[($nextComma - 1)]['length']; - $error = 'Expected 0 spaces between "%s" and comma; %s found'; - $data = [ - $content, - $spaceLength, - ]; - - $fix = $phpcsFile->addFixableError($error, $nextComma, 'SpaceBeforeComma', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($nextComma - 1), ''); - } - } - } - }//end foreach - - }//end processMultiLineArray() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ClassDefinitionClosingBraceSpaceSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ClassDefinitionClosingBraceSpaceSniff.php deleted file mode 100644 index 7d2587f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ClassDefinitionClosingBraceSpaceSniff.php +++ /dev/null @@ -1,173 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ClassDefinitionClosingBraceSpaceSniff implements Sniff, DeprecatedSniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['CSS']; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return array - */ - public function register() - { - return [T_CLOSE_CURLY_BRACKET]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $next = $stackPtr; - while (true) { - $next = $phpcsFile->findNext(T_WHITESPACE, ($next + 1), null, true); - if ($next === false) { - return; - } - - if (isset(Tokens::$emptyTokens[$tokens[$next]['code']]) === true - && $tokens[$next]['line'] === $tokens[$stackPtr]['line'] - ) { - // Trailing comment. - continue; - } - - break; - } - - if ($tokens[$next]['code'] !== T_CLOSE_TAG) { - $found = (($tokens[$next]['line'] - $tokens[$stackPtr]['line']) - 1); - if ($found !== 1) { - $error = 'Expected one blank line after closing brace of class definition; %s found'; - $data = [max(0, $found)]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpacingAfterClose', $data); - - if ($fix === true) { - $firstOnLine = $next; - while ($tokens[$firstOnLine]['column'] !== 1) { - --$firstOnLine; - } - - if ($found < 0) { - // Next statement on same line as the closing brace. - $phpcsFile->fixer->addContentBefore($next, $phpcsFile->eolChar.$phpcsFile->eolChar); - } else if ($found === 0) { - // Next statement on next line, no blank line. - $phpcsFile->fixer->addContentBefore($firstOnLine, $phpcsFile->eolChar); - } else { - // Too many blank lines. - $phpcsFile->fixer->beginChangeset(); - for ($i = ($firstOnLine - 1); $i > $stackPtr; $i--) { - if ($tokens[$i]['code'] !== T_WHITESPACE) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->addContentBefore($firstOnLine, $phpcsFile->eolChar.$phpcsFile->eolChar); - $phpcsFile->fixer->endChangeset(); - } - }//end if - }//end if - }//end if - - // Ignore nested style definitions from here on. The spacing before the closing brace - // (a single blank line) will be enforced by the above check, which ensures there is a - // blank line after the last nested class. - $found = $phpcsFile->findPrevious( - T_CLOSE_CURLY_BRACKET, - ($stackPtr - 1), - $tokens[$stackPtr]['bracket_opener'] - ); - - if ($found !== false) { - return; - } - - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($prev === false) { - return; - } - - if ($tokens[$prev]['line'] === $tokens[$stackPtr]['line']) { - $error = 'Closing brace of class definition must be on new line'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'ContentBeforeClose'); - if ($fix === true) { - $phpcsFile->fixer->addNewlineBefore($stackPtr); - } - } - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'Support for scanning CSS files will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ClassDefinitionNameSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ClassDefinitionNameSpacingSniff.php deleted file mode 100644 index 7d1424b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ClassDefinitionNameSpacingSniff.php +++ /dev/null @@ -1,150 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ClassDefinitionNameSpacingSniff implements Sniff, DeprecatedSniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['CSS']; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return array - */ - public function register() - { - return [T_OPEN_CURLY_BRACKET]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['bracket_closer']) === false) { - // Syntax error or live coding, bow out. - return; - } - - // Do not check nested style definitions as, for example, in @media style rules. - $nested = $phpcsFile->findNext(T_OPEN_CURLY_BRACKET, ($stackPtr + 1), $tokens[$stackPtr]['bracket_closer']); - if ($nested !== false) { - return; - } - - // Find the first blank line before this opening brace, unless we get - // to another style definition, comment or the start of the file. - $endTokens = [ - T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET, - T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET, - T_OPEN_TAG => T_OPEN_TAG, - ]; - $endTokens += Tokens::$commentTokens; - - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - - $foundContent = false; - $currentLine = $tokens[$prev]['line']; - for ($i = ($stackPtr - 1); $i >= 0; $i--) { - if (isset($endTokens[$tokens[$i]['code']]) === true) { - break; - } - - if ($tokens[$i]['line'] === $currentLine) { - if ($tokens[$i]['code'] !== T_WHITESPACE) { - $foundContent = true; - } - - continue; - } - - // We changed lines. - if ($foundContent === false) { - // Before we throw an error, make sure we are not looking - // at a gap before the style definition. - $prev = $phpcsFile->findPrevious(T_WHITESPACE, $i, null, true); - if ($prev !== false - && isset($endTokens[$tokens[$prev]['code']]) === false - ) { - $error = 'Blank lines are not allowed between class names'; - $phpcsFile->addError($error, ($i + 1), 'BlankLinesFound'); - } - - break; - } - - $foundContent = false; - $currentLine = $tokens[$i]['line']; - }//end for - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'Support for scanning CSS files will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ClassDefinitionOpeningBraceSpaceSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ClassDefinitionOpeningBraceSpaceSniff.php deleted file mode 100644 index 05a5e5b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ClassDefinitionOpeningBraceSpaceSniff.php +++ /dev/null @@ -1,215 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ClassDefinitionOpeningBraceSpaceSniff implements Sniff, DeprecatedSniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['CSS']; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return array - */ - public function register() - { - return [T_OPEN_CURLY_BRACKET]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $prevNonWhitespace = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - - if ($prevNonWhitespace !== false) { - $length = 0; - if ($tokens[$stackPtr]['line'] !== $tokens[$prevNonWhitespace]['line']) { - $length = 'newline'; - } else if ($tokens[($stackPtr - 1)]['code'] === T_WHITESPACE) { - if (strpos($tokens[($stackPtr - 1)]['content'], "\t") !== false) { - $length = 'tab'; - } else { - $length = $tokens[($stackPtr - 1)]['length']; - } - } - - if ($length === 0) { - $error = 'Expected 1 space before opening brace of class definition; 0 found'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoneBefore'); - if ($fix === true) { - $phpcsFile->fixer->addContentBefore($stackPtr, ' '); - } - } else if ($length !== 1) { - $error = 'Expected 1 space before opening brace of class definition; %s found'; - $data = [$length]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Before', $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - for ($i = ($stackPtr - 1); $i > $prevNonWhitespace; $i--) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->addContentBefore($stackPtr, ' '); - $phpcsFile->fixer->endChangeset(); - } - }//end if - }//end if - - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($nextNonEmpty === false) { - return; - } - - if ($tokens[$nextNonEmpty]['line'] === $tokens[$stackPtr]['line']) { - $error = 'Opening brace should be the last content on the line'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'ContentBefore'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->addNewline($stackPtr); - - // Remove potentially left over trailing whitespace. - if ($tokens[($stackPtr + 1)]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } else { - if (isset($tokens[$stackPtr]['bracket_closer']) === false) { - // Syntax error or live coding, bow out. - return; - } - - // Check for nested class definitions. - $found = $phpcsFile->findNext( - T_OPEN_CURLY_BRACKET, - ($stackPtr + 1), - $tokens[$stackPtr]['bracket_closer'] - ); - - if ($found === false) { - // Not nested. - return; - } - - $lastOnLine = $stackPtr; - for ($lastOnLine; $lastOnLine < $tokens[$stackPtr]['bracket_closer']; $lastOnLine++) { - if ($tokens[$lastOnLine]['line'] !== $tokens[($lastOnLine + 1)]['line']) { - break; - } - } - - $nextNonWhiteSpace = $phpcsFile->findNext(T_WHITESPACE, ($lastOnLine + 1), null, true); - if ($nextNonWhiteSpace === false) { - return; - } - - $foundLines = ($tokens[$nextNonWhiteSpace]['line'] - $tokens[$stackPtr]['line'] - 1); - if ($foundLines !== 1) { - $error = 'Expected 1 blank line after opening brace of nesting class definition; %s found'; - $data = [max(0, $foundLines)]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'AfterNesting', $data); - - if ($fix === true) { - $firstOnNextLine = $nextNonWhiteSpace; - while ($tokens[$firstOnNextLine]['column'] !== 1) { - --$firstOnNextLine; - } - - if ($found < 0) { - // First statement on same line as the opening brace. - $phpcsFile->fixer->addContentBefore($nextNonWhiteSpace, $phpcsFile->eolChar.$phpcsFile->eolChar); - } else if ($found === 0) { - // Next statement on next line, no blank line. - $phpcsFile->fixer->addNewlineBefore($firstOnNextLine); - } else { - // Too many blank lines. - $phpcsFile->fixer->beginChangeset(); - for ($i = ($firstOnNextLine - 1); $i > $stackPtr; $i--) { - if ($tokens[$i]['code'] !== T_WHITESPACE) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->addContentBefore($firstOnNextLine, $phpcsFile->eolChar.$phpcsFile->eolChar); - $phpcsFile->fixer->endChangeset(); - } - }//end if - }//end if - }//end if - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'Support for scanning CSS files will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ColonSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ColonSpacingSniff.php deleted file mode 100644 index 4beb0f0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ColonSpacingSniff.php +++ /dev/null @@ -1,146 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ColonSpacingSniff implements Sniff, DeprecatedSniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['CSS']; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return array - */ - public function register() - { - return [T_COLON]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($tokens[$prev]['code'] !== T_STYLE) { - // The colon is not part of a style definition. - return; - } - - if ($tokens[$prev]['content'] === 'progid') { - // Special case for IE filters. - return; - } - - if ($tokens[($stackPtr - 1)]['code'] === T_WHITESPACE) { - $error = 'There must be no space before a colon in a style definition'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Before'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr - 1), ''); - } - } - - $next = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($tokens[$next]['code'] === T_SEMICOLON || $tokens[$next]['code'] === T_STYLE) { - // Empty style definition, ignore it. - return; - } - - if ($tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) { - $error = 'Expected 1 space after colon in style definition; 0 found'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoneAfter'); - if ($fix === true) { - $phpcsFile->fixer->addContent($stackPtr, ' '); - } - } else { - $content = $tokens[($stackPtr + 1)]['content']; - if (strpos($content, $phpcsFile->eolChar) === false) { - $length = strlen($content); - if ($length !== 1) { - $error = 'Expected 1 space after colon in style definition; %s found'; - $data = [$length]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'After', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ' '); - } - } - } else { - $error = 'Expected 1 space after colon in style definition; newline found'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'AfterNewline'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ' '); - } - } - }//end if - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'Support for scanning CSS files will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ColourDefinitionSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ColourDefinitionSniff.php deleted file mode 100644 index 39517ed..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ColourDefinitionSniff.php +++ /dev/null @@ -1,127 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ColourDefinitionSniff implements Sniff, DeprecatedSniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['CSS']; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return array - */ - public function register() - { - return [T_COLOUR]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $colour = $tokens[$stackPtr]['content']; - - $expected = strtoupper($colour); - if ($colour !== $expected) { - $error = 'CSS colours must be defined in uppercase; expected %s but found %s'; - $data = [ - $expected, - $colour, - ]; - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NotUpper', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, $expected); - } - } - - // Now check if shorthand can be used. - if (strlen($colour) !== 7) { - return; - } - - if ($colour[1] === $colour[2] && $colour[3] === $colour[4] && $colour[5] === $colour[6]) { - $expected = '#'.$colour[1].$colour[3].$colour[5]; - $error = 'CSS colours must use shorthand if available; expected %s but found %s'; - $data = [ - $expected, - $colour, - ]; - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Shorthand', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, $expected); - } - } - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'Support for scanning CSS files will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/DisallowMultipleStyleDefinitionsSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/DisallowMultipleStyleDefinitionsSniff.php deleted file mode 100644 index 09cfe6e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/DisallowMultipleStyleDefinitionsSniff.php +++ /dev/null @@ -1,110 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; - -class DisallowMultipleStyleDefinitionsSniff implements Sniff, DeprecatedSniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var string[] - */ - public $supportedTokenizers = ['CSS']; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return array - */ - public function register() - { - return [T_STYLE]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $next = $phpcsFile->findNext(T_STYLE, ($stackPtr + 1)); - if ($next === false) { - return; - } - - if ($tokens[$next]['content'] === 'progid') { - // Special case for IE filters. - return; - } - - if ($tokens[$next]['line'] === $tokens[$stackPtr]['line']) { - $error = 'Each style definition must be on a line by itself'; - $fix = $phpcsFile->addFixableError($error, $next, 'Found'); - if ($fix === true) { - $phpcsFile->fixer->addNewlineBefore($next); - } - } - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'Support for scanning CSS files will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/DuplicateClassDefinitionSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/DuplicateClassDefinitionSniff.php deleted file mode 100644 index 88da909..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/DuplicateClassDefinitionSniff.php +++ /dev/null @@ -1,155 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class DuplicateClassDefinitionSniff implements Sniff, DeprecatedSniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['CSS']; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return array - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Find the content of each class definition name. - $classNames = []; - $next = $phpcsFile->findNext(T_OPEN_CURLY_BRACKET, ($stackPtr + 1)); - if ($next === false) { - // No class definitions in the file. - return; - } - - // Save the class names in a "scope", - // to prevent false positives with @media blocks. - $scope = 'main'; - - $find = [ - T_CLOSE_CURLY_BRACKET, - T_OPEN_CURLY_BRACKET, - T_OPEN_TAG, - ]; - - while ($next !== false) { - $prev = $phpcsFile->findPrevious($find, ($next - 1)); - - // Check if an inner block was closed. - $beforePrev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($prev - 1), null, true); - if ($beforePrev !== false - && $tokens[$beforePrev]['code'] === T_CLOSE_CURLY_BRACKET - ) { - $scope = 'main'; - } - - // Create a sorted name for the class so we can compare classes - // even when the individual names are all over the place. - $name = ''; - for ($i = ($prev + 1); $i < $next; $i++) { - $name .= $tokens[$i]['content']; - } - - $name = trim($name); - $name = str_replace("\n", ' ', $name); - $name = preg_replace('|[\s]+|', ' ', $name); - $name = preg_replace('|\s*/\*.*\*/\s*|', '', $name); - $name = str_replace(', ', ',', $name); - - $names = explode(',', $name); - sort($names); - $name = implode(',', $names); - - if ($name[0] === '@') { - // Media block has its own "scope". - $scope = $name; - } else if (isset($classNames[$scope][$name]) === true) { - $first = $classNames[$scope][$name]; - $error = 'Duplicate class definition found; first defined on line %s'; - $data = [$tokens[$first]['line']]; - $phpcsFile->addError($error, $next, 'Found', $data); - } else { - $classNames[$scope][$name] = $next; - } - - $next = $phpcsFile->findNext(T_OPEN_CURLY_BRACKET, ($next + 1)); - }//end while - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'Support for scanning CSS files will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/DuplicateStyleDefinitionSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/DuplicateStyleDefinitionSniff.php deleted file mode 100644 index a891441..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/DuplicateStyleDefinitionSniff.php +++ /dev/null @@ -1,127 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; - -class DuplicateStyleDefinitionSniff implements Sniff, DeprecatedSniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['CSS']; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return array - */ - public function register() - { - return [T_OPEN_CURLY_BRACKET]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['bracket_closer']) === false) { - // Syntax error or live coding, bow out. - return; - } - - // Find the content of each style definition name. - $styleNames = []; - - $next = $stackPtr; - $end = $tokens[$stackPtr]['bracket_closer']; - - do { - $next = $phpcsFile->findNext([T_STYLE, T_OPEN_CURLY_BRACKET], ($next + 1), $end); - if ($next === false) { - // Class definition is empty. - break; - } - - if ($tokens[$next]['code'] === T_OPEN_CURLY_BRACKET) { - $next = $tokens[$next]['bracket_closer']; - continue; - } - - $name = $tokens[$next]['content']; - if (isset($styleNames[$name]) === true) { - $first = $styleNames[$name]; - $error = 'Duplicate style definition found; first defined on line %s'; - $data = [$tokens[$first]['line']]; - $phpcsFile->addError($error, $next, 'Found', $data); - } else { - $styleNames[$name] = $next; - } - } while ($next !== false); - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'Support for scanning CSS files will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/EmptyClassDefinitionSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/EmptyClassDefinitionSniff.php deleted file mode 100644 index ff97846..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/EmptyClassDefinitionSniff.php +++ /dev/null @@ -1,100 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class EmptyClassDefinitionSniff implements Sniff, DeprecatedSniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['CSS']; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return array - */ - public function register() - { - return [T_OPEN_CURLY_BRACKET]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - - if ($next === false || $tokens[$next]['code'] === T_CLOSE_CURLY_BRACKET) { - $error = 'Class definition is empty'; - $phpcsFile->addError($error, $stackPtr, 'Found'); - } - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'Support for scanning CSS files will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/EmptyStyleDefinitionSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/EmptyStyleDefinitionSniff.php deleted file mode 100644 index c578968..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/EmptyStyleDefinitionSniff.php +++ /dev/null @@ -1,103 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class EmptyStyleDefinitionSniff implements Sniff, DeprecatedSniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['CSS']; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return array - */ - public function register() - { - return [T_STYLE]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $ignore = Tokens::$emptyTokens; - $ignore[] = T_COLON; - - $next = $phpcsFile->findNext($ignore, ($stackPtr + 1), null, true); - if ($next === false || $tokens[$next]['code'] === T_SEMICOLON || $tokens[$next]['line'] !== $tokens[$stackPtr]['line']) { - $error = 'Style definition is empty'; - $phpcsFile->addError($error, $stackPtr, 'Found'); - } - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'Support for scanning CSS files will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ForbiddenStylesSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ForbiddenStylesSniff.php deleted file mode 100644 index 8663f94..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ForbiddenStylesSniff.php +++ /dev/null @@ -1,216 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ForbiddenStylesSniff implements Sniff, DeprecatedSniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['CSS']; - - /** - * A list of forbidden styles with their alternatives. - * - * The value is NULL if no alternative exists. i.e., the - * style should just not be used. - * - * @var array - */ - protected $forbiddenStyles = [ - '-moz-border-radius' => 'border-radius', - '-webkit-border-radius' => 'border-radius', - '-moz-border-radius-topleft' => 'border-top-left-radius', - '-moz-border-radius-topright' => 'border-top-right-radius', - '-moz-border-radius-bottomright' => 'border-bottom-right-radius', - '-moz-border-radius-bottomleft' => 'border-bottom-left-radius', - '-moz-box-shadow' => 'box-shadow', - '-webkit-box-shadow' => 'box-shadow', - ]; - - /** - * A cache of forbidden style names, for faster lookups. - * - * @var string[] - */ - protected $forbiddenStyleNames = []; - - /** - * If true, forbidden styles will be considered regular expressions. - * - * @var boolean - */ - protected $patternMatch = false; - - /** - * If true, an error will be thrown; otherwise a warning. - * - * @var boolean - */ - public $error = true; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - $this->forbiddenStyleNames = array_keys($this->forbiddenStyles); - - if ($this->patternMatch === true) { - foreach ($this->forbiddenStyleNames as $i => $name) { - $this->forbiddenStyleNames[$i] = '/'.$name.'/i'; - } - } - - return [T_STYLE]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $style = strtolower($tokens[$stackPtr]['content']); - $pattern = null; - - if ($this->patternMatch === true) { - $count = 0; - $pattern = preg_replace( - $this->forbiddenStyleNames, - $this->forbiddenStyleNames, - $style, - 1, - $count - ); - - if ($count === 0) { - return; - } - - // Remove the pattern delimiters and modifier. - $pattern = substr($pattern, 1, -2); - } else { - if (in_array($style, $this->forbiddenStyleNames, true) === false) { - return; - } - }//end if - - $this->addError($phpcsFile, $stackPtr, $style, $pattern); - - }//end process() - - - /** - * Generates the error or warning for this sniff. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the forbidden style - * in the token array. - * @param string $style The name of the forbidden style. - * @param string $pattern The pattern used for the match. - * - * @return void - */ - protected function addError($phpcsFile, $stackPtr, $style, $pattern=null) - { - $data = [$style]; - $error = 'The use of style %s is '; - if ($this->error === true) { - $type = 'Found'; - $error .= 'forbidden'; - } else { - $type = 'Discouraged'; - $error .= 'discouraged'; - } - - if ($pattern === null) { - $pattern = $style; - } - - if ($this->forbiddenStyles[$pattern] !== null) { - $data[] = $this->forbiddenStyles[$pattern]; - if ($this->error === true) { - $fix = $phpcsFile->addFixableError($error.'; use %s instead', $stackPtr, $type.'WithAlternative', $data); - } else { - $fix = $phpcsFile->addFixableWarning($error.'; use %s instead', $stackPtr, $type.'WithAlternative', $data); - } - - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, $this->forbiddenStyles[$pattern]); - } - } else { - if ($this->error === true) { - $phpcsFile->addError($error, $stackPtr, $type, $data); - } else { - $phpcsFile->addWarning($error, $stackPtr, $type, $data); - } - } - - }//end addError() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'Support for scanning CSS files will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/IndentationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/IndentationSniff.php deleted file mode 100644 index 6615078..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/IndentationSniff.php +++ /dev/null @@ -1,189 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class IndentationSniff implements Sniff, DeprecatedSniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['CSS']; - - /** - * The number of spaces code should be indented. - * - * @var integer - */ - public $indent = 4; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return array - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $numTokens = (count($tokens) - 2); - $indentLevel = 0; - $nestingLevel = 0; - for ($i = 1; $i < $numTokens; $i++) { - if ($tokens[$i]['code'] === T_COMMENT - || isset(Tokens::$phpcsCommentTokens[$tokens[$i]['code']]) === true - ) { - // Don't check the indent of comments. - continue; - } - - if ($tokens[$i]['code'] === T_OPEN_CURLY_BRACKET) { - $indentLevel++; - - if (isset($tokens[$i]['bracket_closer']) === false) { - // Syntax error or live coding. - // Anything after this would receive incorrect fixes, so bow out. - return; - } - - // Check for nested class definitions. - $found = $phpcsFile->findNext( - T_OPEN_CURLY_BRACKET, - ($i + 1), - $tokens[$i]['bracket_closer'] - ); - - if ($found !== false) { - $nestingLevel = $indentLevel; - } - } - - if (($tokens[$i]['code'] === T_CLOSE_CURLY_BRACKET - && $tokens[$i]['line'] !== $tokens[($i - 1)]['line']) - || ($tokens[($i + 1)]['code'] === T_CLOSE_CURLY_BRACKET - && $tokens[$i]['line'] === $tokens[($i + 1)]['line']) - ) { - $indentLevel--; - if ($indentLevel === 0) { - $nestingLevel = 0; - } - } - - if ($tokens[$i]['column'] !== 1 - || $tokens[$i]['code'] === T_OPEN_CURLY_BRACKET - || $tokens[$i]['code'] === T_CLOSE_CURLY_BRACKET - ) { - continue; - } - - // We started a new line, so check indent. - if ($tokens[$i]['code'] === T_WHITESPACE) { - $content = str_replace($phpcsFile->eolChar, '', $tokens[$i]['content']); - $foundIndent = strlen($content); - } else { - $foundIndent = 0; - } - - $expectedIndent = ($indentLevel * $this->indent); - if ($expectedIndent > 0 - && strpos($tokens[$i]['content'], $phpcsFile->eolChar) !== false - ) { - if ($nestingLevel !== $indentLevel) { - $error = 'Blank lines are not allowed in class definitions'; - $fix = $phpcsFile->addFixableError($error, $i, 'BlankLine'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($i, ''); - } - } - } else if ($foundIndent !== $expectedIndent) { - $error = 'Line indented incorrectly; expected %s spaces, found %s'; - $data = [ - $expectedIndent, - $foundIndent, - ]; - - $fix = $phpcsFile->addFixableError($error, $i, 'Incorrect', $data); - if ($fix === true) { - $indent = str_repeat(' ', $expectedIndent); - if ($foundIndent === 0) { - $phpcsFile->fixer->addContentBefore($i, $indent); - } else { - $phpcsFile->fixer->replaceToken($i, $indent); - } - } - }//end if - }//end for - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'Support for scanning CSS files will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/LowercaseStyleDefinitionSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/LowercaseStyleDefinitionSniff.php deleted file mode 100644 index 7be7416..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/LowercaseStyleDefinitionSniff.php +++ /dev/null @@ -1,136 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; - -class LowercaseStyleDefinitionSniff implements Sniff, DeprecatedSniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['CSS']; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return array - */ - public function register() - { - return [T_OPEN_CURLY_BRACKET]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $start = ($stackPtr + 1); - $end = ($tokens[$stackPtr]['bracket_closer'] - 1); - $inStyle = null; - - for ($i = $start; $i <= $end; $i++) { - // Skip nested definitions as they are checked individually. - if ($tokens[$i]['code'] === T_OPEN_CURLY_BRACKET) { - $i = $tokens[$i]['bracket_closer']; - continue; - } - - if ($tokens[$i]['code'] === T_STYLE) { - $inStyle = $tokens[$i]['content']; - } - - if ($tokens[$i]['code'] === T_SEMICOLON) { - $inStyle = null; - } - - if ($inStyle === 'progid') { - // Special case for IE filters. - continue; - } - - if ($tokens[$i]['code'] === T_STYLE - || ($inStyle !== null - && $tokens[$i]['code'] === T_STRING) - ) { - $expected = strtolower($tokens[$i]['content']); - if ($expected !== $tokens[$i]['content']) { - $error = 'Style definitions must be lowercase; expected %s but found %s'; - $data = [ - $expected, - $tokens[$i]['content'], - ]; - - $fix = $phpcsFile->addFixableError($error, $i, 'FoundUpper', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($i, $expected); - } - } - } - }//end for - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'Support for scanning CSS files will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/MissingColonSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/MissingColonSniff.php deleted file mode 100644 index 2b4ebd7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/MissingColonSniff.php +++ /dev/null @@ -1,130 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; - -class MissingColonSniff implements Sniff, DeprecatedSniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['CSS']; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return array - */ - public function register() - { - return [T_OPEN_CURLY_BRACKET]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['bracket_closer']) === false) { - // Syntax error or live coding, bow out. - return; - } - - $lastLine = $tokens[$stackPtr]['line']; - $end = $tokens[$stackPtr]['bracket_closer']; - - // Do not check nested style definitions as, for example, in @media style rules. - $nested = $phpcsFile->findNext(T_OPEN_CURLY_BRACKET, ($stackPtr + 1), $end); - if ($nested !== false) { - return; - } - - $foundColon = false; - $foundString = false; - for ($i = ($stackPtr + 1); $i <= $end; $i++) { - if ($tokens[$i]['line'] !== $lastLine) { - // We changed lines. - if ($foundColon === false && $foundString !== false) { - // We didn't find a colon on the previous line. - $error = 'No style definition found on line; check for missing colon'; - $phpcsFile->addError($error, $foundString, 'Found'); - } - - $foundColon = false; - $foundString = false; - $lastLine = $tokens[$i]['line']; - } - - if ($tokens[$i]['code'] === T_STRING) { - $foundString = $i; - } else if ($tokens[$i]['code'] === T_COLON) { - $foundColon = $i; - } - }//end for - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'Support for scanning CSS files will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/NamedColoursSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/NamedColoursSniff.php deleted file mode 100644 index a06109c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/NamedColoursSniff.php +++ /dev/null @@ -1,132 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; - -class NamedColoursSniff implements Sniff, DeprecatedSniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['CSS']; - - /** - * A list of named colours. - * - * This is the list of standard colours defined in the CSS specification. - * - * @var array - */ - protected $colourNames = [ - 'aqua' => 'aqua', - 'black' => 'black', - 'blue' => 'blue', - 'fuchsia' => 'fuchsia', - 'gray' => 'gray', - 'green' => 'green', - 'lime' => 'lime', - 'maroon' => 'maroon', - 'navy' => 'navy', - 'olive' => 'olive', - 'orange' => 'orange', - 'purple' => 'purple', - 'red' => 'red', - 'silver' => 'silver', - 'teal' => 'teal', - 'white' => 'white', - 'yellow' => 'yellow', - ]; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return array - */ - public function register() - { - return [T_STRING]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[($stackPtr - 1)]['code'] === T_HASH - || $tokens[($stackPtr - 1)]['code'] === T_STRING_CONCAT - ) { - // Class name. - return; - } - - if (isset($this->colourNames[strtolower($tokens[$stackPtr]['content'])]) === true) { - $error = 'Named colours are forbidden; use hex, rgb, or rgba values instead'; - $phpcsFile->addError($error, $stackPtr, 'Forbidden'); - } - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'Support for scanning CSS files will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/OpacitySniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/OpacitySniff.php deleted file mode 100644 index c7cc7fa..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/OpacitySniff.php +++ /dev/null @@ -1,140 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class OpacitySniff implements Sniff, DeprecatedSniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['CSS']; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return array - */ - public function register() - { - return [T_STYLE]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['content'] !== 'opacity') { - return; - } - - $ignore = Tokens::$emptyTokens; - $ignore[] = T_COLON; - - $next = $phpcsFile->findNext($ignore, ($stackPtr + 1), null, true); - - if ($next === false - || ($tokens[$next]['code'] !== T_DNUMBER - && $tokens[$next]['code'] !== T_LNUMBER) - ) { - return; - } - - $value = $tokens[$next]['content']; - if ($tokens[$next]['code'] === T_LNUMBER) { - if ($value !== '0' && $value !== '1') { - $error = 'Opacity values must be between 0 and 1'; - $phpcsFile->addError($error, $next, 'Invalid'); - } - } else { - if (strlen($value) > 3) { - $error = 'Opacity values must have a single value after the decimal point'; - $phpcsFile->addError($error, $next, 'DecimalPrecision'); - } else if ($value === '0.0' || $value === '1.0') { - $error = 'Opacity value does not require decimal point; use %s instead'; - $data = [$value[0]]; - $fix = $phpcsFile->addFixableError($error, $next, 'PointNotRequired', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($next, $value[0]); - } - } else if ($value[0] === '.') { - $error = 'Opacity values must not start with a decimal point; use 0%s instead'; - $data = [$value]; - $fix = $phpcsFile->addFixableError($error, $next, 'StartWithPoint', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($next, '0'.$value); - } - } else if ($value[0] !== '0') { - $error = 'Opacity values must be between 0 and 1'; - $phpcsFile->addError($error, $next, 'Invalid'); - }//end if - }//end if - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'Support for scanning CSS files will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/SemicolonSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/SemicolonSpacingSniff.php deleted file mode 100644 index 86150fe..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/SemicolonSpacingSniff.php +++ /dev/null @@ -1,142 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class SemicolonSpacingSniff implements Sniff, DeprecatedSniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['CSS']; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return array - */ - public function register() - { - return [T_STYLE]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $nextStatement = $phpcsFile->findNext([T_STYLE, T_CLOSE_CURLY_BRACKET], ($stackPtr + 1)); - if ($nextStatement === false) { - return; - } - - $ignore = Tokens::$emptyTokens; - if ($tokens[$nextStatement]['code'] === T_STYLE) { - // Allow for star-prefix hack. - $ignore[] = T_MULTIPLY; - } - - $endOfThisStatement = $phpcsFile->findPrevious($ignore, ($nextStatement - 1), null, true); - if ($tokens[$endOfThisStatement]['code'] !== T_SEMICOLON) { - $error = 'Style definitions must end with a semicolon'; - $phpcsFile->addError($error, $endOfThisStatement, 'NotAtEnd'); - return; - } - - if ($tokens[($endOfThisStatement - 1)]['code'] !== T_WHITESPACE) { - return; - } - - // There is a semicolon, so now find the last token in the statement. - $prevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($endOfThisStatement - 1), null, true); - $found = $tokens[($endOfThisStatement - 1)]['length']; - if ($tokens[$prevNonEmpty]['line'] !== $tokens[$endOfThisStatement]['line']) { - $found = 'newline'; - } - - $error = 'Expected 0 spaces before semicolon in style definition; %s found'; - $data = [$found]; - $fix = $phpcsFile->addFixableError($error, $prevNonEmpty, 'SpaceFound', $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->addContent($prevNonEmpty, ';'); - $phpcsFile->fixer->replaceToken($endOfThisStatement, ''); - - for ($i = ($endOfThisStatement - 1); $i > $prevNonEmpty; $i--) { - if ($tokens[$i]['code'] !== T_WHITESPACE) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'Support for scanning CSS files will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ShorthandSizeSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ShorthandSizeSniff.php deleted file mode 100644 index d98f7a7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/CSS/ShorthandSizeSniff.php +++ /dev/null @@ -1,220 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ShorthandSizeSniff implements Sniff, DeprecatedSniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['CSS']; - - /** - * A list of styles that we shouldn't check. - * - * These have values that looks like sizes, but are not. - * - * @var array - */ - protected $excludeStyles = [ - 'background-position' => 'background-position', - 'box-shadow' => 'box-shadow', - 'transform-origin' => 'transform-origin', - '-webkit-transform-origin' => '-webkit-transform-origin', - '-ms-transform-origin' => '-ms-transform-origin', - ]; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return array - */ - public function register() - { - return [T_STYLE]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Some styles look like shorthand but are not actually a set of 4 sizes. - $style = strtolower($tokens[$stackPtr]['content']); - if (isset($this->excludeStyles[$style]) === true) { - return; - } - - $end = $phpcsFile->findNext(T_SEMICOLON, ($stackPtr + 1)); - if ($end === false) { - // Live coding or parse error. - return; - } - - // Get the whole style content. - $origContent = $phpcsFile->getTokensAsString(($stackPtr + 1), ($end - $stackPtr - 1)); - $origContent = trim($origContent, ':'); - $origContent = trim($origContent); - - // Account for a !important annotation. - $content = $origContent; - if (substr($content, -10) === '!important') { - $content = substr($content, 0, -10); - $content = trim($content); - } - - // Check if this style value is a set of numbers with optional prefixes. - $content = preg_replace('/\s+/', ' ', $content); - $values = []; - $num = preg_match_all( - '/(?:[0-9]+)(?:[a-zA-Z]{2}\s+|%\s+|\s+)/', - $content.' ', - $values, - PREG_SET_ORDER - ); - - // Only interested in styles that have multiple sizes defined. - if ($num < 2) { - return; - } - - // Rebuild the content we matched to ensure we got everything. - $matched = ''; - foreach ($values as $value) { - $matched .= $value[0]; - } - - if ($content !== trim($matched)) { - return; - } - - if ($num === 3) { - $expected = trim($content.' '.$values[1][0]); - $error = 'Shorthand syntax not allowed here; use %s instead'; - $data = [$expected]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NotAllowed', $data); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - if (substr($origContent, -10) === '!important') { - $expected .= ' !important'; - } - - $next = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 2), null, true); - $phpcsFile->fixer->replaceToken($next, $expected); - for ($next++; $next < $end; $next++) { - $phpcsFile->fixer->replaceToken($next, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - - return; - }//end if - - if ($num === 2) { - if ($values[0][0] !== $values[1][0]) { - // Both values are different, so it is already shorthand. - return; - } - } else if ($values[0][0] !== $values[2][0] || $values[1][0] !== $values[3][0]) { - // Can't shorthand this. - return; - } - - if ($values[0][0] === $values[1][0]) { - // All values are the same. - $expected = trim($values[0][0]); - } else { - $expected = trim($values[0][0]).' '.trim($values[1][0]); - } - - $error = 'Size definitions must use shorthand if available; expected "%s" but found "%s"'; - $data = [ - $expected, - $content, - ]; - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NotUsed', $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - if (substr($origContent, -10) === '!important') { - $expected .= ' !important'; - } - - $next = $phpcsFile->findNext(T_COLON, ($stackPtr + 1)); - $phpcsFile->fixer->addContent($next, ' '.$expected); - for ($next++; $next < $end; $next++) { - $phpcsFile->fixer->replaceToken($next, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'Support for scanning CSS files will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/ClassDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/ClassDeclarationSniff.php deleted file mode 100644 index 9d91def..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/ClassDeclarationSniff.php +++ /dev/null @@ -1,224 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Classes; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Standards\PSR2\Sniffs\Classes\ClassDeclarationSniff as PSR2ClassDeclarationSniff; -use PHP_CodeSniffer\Util\Tokens; - -class ClassDeclarationSniff extends PSR2ClassDeclarationSniff -{ - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - // We want all the errors from the PSR2 standard, plus some of our own. - parent::process($phpcsFile, $stackPtr); - - // Check that this is the only class or interface in the file. - $nextClass = $phpcsFile->findNext([T_CLASS, T_INTERFACE], ($stackPtr + 1)); - if ($nextClass !== false) { - // We have another, so an error is thrown. - $error = 'Only one interface or class is allowed in a file'; - $phpcsFile->addError($error, $nextClass, 'MultipleClasses'); - } - - }//end process() - - - /** - * Processes the opening section of a class declaration. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function processOpen(File $phpcsFile, $stackPtr) - { - parent::processOpen($phpcsFile, $stackPtr); - - $tokens = $phpcsFile->getTokens(); - - if ($tokens[($stackPtr - 1)]['code'] === T_WHITESPACE) { - $prevContent = $tokens[($stackPtr - 1)]['content']; - if ($prevContent !== $phpcsFile->eolChar) { - $blankSpace = substr($prevContent, strpos($prevContent, $phpcsFile->eolChar)); - $spaces = strlen($blankSpace); - - if ($tokens[($stackPtr - 2)]['code'] !== T_ABSTRACT - && $tokens[($stackPtr - 2)]['code'] !== T_FINAL - && $tokens[($stackPtr - 2)]['code'] !== T_READONLY - ) { - if ($spaces !== 0) { - $type = strtolower($tokens[$stackPtr]['content']); - $error = 'Expected 0 spaces before %s keyword; %s found'; - $data = [ - $type, - $spaces, - ]; - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceBeforeKeyword', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr - 1), ''); - } - } - } - }//end if - }//end if - - }//end processOpen() - - - /** - * Processes the closing section of a class declaration. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function processClose(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - if (isset($tokens[$stackPtr]['scope_closer']) === false) { - return; - } - - $closeBrace = $tokens[$stackPtr]['scope_closer']; - - // Check that the closing brace has one blank line after it. - for ($nextContent = ($closeBrace + 1); $nextContent < $phpcsFile->numTokens; $nextContent++) { - // Ignore comments on the same line as the brace. - if ($tokens[$nextContent]['line'] === $tokens[$closeBrace]['line'] - && ($tokens[$nextContent]['code'] === T_WHITESPACE - || $tokens[$nextContent]['code'] === T_COMMENT - || isset(Tokens::$phpcsCommentTokens[$tokens[$nextContent]['code']]) === true) - ) { - continue; - } - - if ($tokens[$nextContent]['code'] !== T_WHITESPACE) { - break; - } - } - - if ($nextContent === $phpcsFile->numTokens) { - // Ignore the line check as this is the very end of the file. - $difference = 1; - } else { - $difference = ($tokens[$nextContent]['line'] - $tokens[$closeBrace]['line'] - 1); - } - - $lastContent = $phpcsFile->findPrevious(T_WHITESPACE, ($closeBrace - 1), $stackPtr, true); - - if ($difference === -1 - || $tokens[$lastContent]['line'] === $tokens[$closeBrace]['line'] - ) { - $error = 'Closing %s brace must be on a line by itself'; - $data = [$tokens[$stackPtr]['content']]; - $fix = $phpcsFile->addFixableError($error, $closeBrace, 'CloseBraceSameLine', $data); - if ($fix === true) { - if ($difference === -1) { - $phpcsFile->fixer->addNewlineBefore($nextContent); - } - - if ($tokens[$lastContent]['line'] === $tokens[$closeBrace]['line']) { - $phpcsFile->fixer->addNewlineBefore($closeBrace); - } - } - } else if ($tokens[($closeBrace - 1)]['code'] === T_WHITESPACE) { - $prevContent = $tokens[($closeBrace - 1)]['content']; - if ($prevContent !== $phpcsFile->eolChar) { - $blankSpace = substr($prevContent, strpos($prevContent, $phpcsFile->eolChar)); - $spaces = strlen($blankSpace); - if ($spaces !== 0) { - if ($tokens[($closeBrace - 1)]['line'] !== $tokens[$closeBrace]['line']) { - $error = 'Expected 0 spaces before closing brace; newline found'; - $phpcsFile->addError($error, $closeBrace, 'NewLineBeforeCloseBrace'); - } else { - $error = 'Expected 0 spaces before closing brace; %s found'; - $data = [$spaces]; - $fix = $phpcsFile->addFixableError($error, $closeBrace, 'SpaceBeforeCloseBrace', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($closeBrace - 1), ''); - } - } - } - } - }//end if - - if ($difference !== -1 && $difference !== 1) { - for ($nextSignificant = $nextContent; $nextSignificant < $phpcsFile->numTokens; $nextSignificant++) { - if ($tokens[$nextSignificant]['code'] === T_WHITESPACE) { - continue; - } - - if ($tokens[$nextSignificant]['code'] === T_DOC_COMMENT_OPEN_TAG) { - $nextSignificant = $tokens[$nextSignificant]['comment_closer']; - continue; - } - - if ($tokens[$nextSignificant]['code'] === T_ATTRIBUTE - && isset($tokens[$nextSignificant]['attribute_closer']) === true - ) { - $nextSignificant = $tokens[$nextSignificant]['attribute_closer']; - continue; - } - - break; - } - - if ($tokens[$nextSignificant]['code'] === T_FUNCTION) { - return; - } - - $error = 'Closing brace of a %s must be followed by a single blank line; found %s'; - $data = [ - $tokens[$stackPtr]['content'], - $difference, - ]; - $fix = $phpcsFile->addFixableError($error, $closeBrace, 'NewlinesAfterCloseBrace', $data); - if ($fix === true) { - if ($difference === 0) { - $first = $phpcsFile->findFirstOnLine([], $nextContent, true); - $phpcsFile->fixer->addNewlineBefore($first); - } else { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($closeBrace + 1); $i < $nextContent; $i++) { - if ($tokens[$i]['line'] <= ($tokens[$closeBrace]['line'] + 1)) { - continue; - } else if ($tokens[$i]['line'] === $tokens[$nextContent]['line']) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - }//end if - - }//end processClose() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/ClassFileNameSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/ClassFileNameSniff.php deleted file mode 100644 index 8030858..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/ClassFileNameSniff.php +++ /dev/null @@ -1,75 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Classes; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ClassFileNameSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - $targets = Tokens::$ooScopeTokens; - unset($targets[T_ANON_CLASS]); - - return $targets; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function process(File $phpcsFile, $stackPtr) - { - $fullPath = $phpcsFile->getFilename(); - if ($fullPath === 'STDIN') { - return $phpcsFile->numTokens; - } - - $fileName = basename($fullPath); - $fileNoExt = substr($fileName, 0, strrpos($fileName, '.')); - $extension = substr($fileName, (strrpos($fileName, '.') + 1)); - - $tokens = $phpcsFile->getTokens(); - $ooName = $phpcsFile->getDeclarationName($stackPtr); - if ($ooName === null) { - // Probably parse error/live coding. - return; - } - - if ($ooName !== $fileNoExt) { - $error = 'Filename doesn\'t match %s name; expected file name "%s"'; - $data = [ - $tokens[$stackPtr]['content'], - $ooName.'.'.$extension, - ]; - $phpcsFile->addError($error, $stackPtr, 'NoMatch', $data); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/DuplicatePropertySniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/DuplicatePropertySniff.php deleted file mode 100644 index 0422688..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/DuplicatePropertySniff.php +++ /dev/null @@ -1,121 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Classes; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; - -class DuplicatePropertySniff implements Sniff, DeprecatedSniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['JS']; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_OBJECT]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being processed. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $properties = []; - $wantedTokens = [ - T_PROPERTY, - T_OBJECT, - ]; - - $next = $phpcsFile->findNext($wantedTokens, ($stackPtr + 1), $tokens[$stackPtr]['bracket_closer']); - while ($next !== false && $next < $tokens[$stackPtr]['bracket_closer']) { - if ($tokens[$next]['code'] === T_OBJECT) { - // Skip nested objects. - $next = $tokens[$next]['bracket_closer']; - } else { - $propName = $tokens[$next]['content']; - if (isset($properties[$propName]) === true) { - $error = 'Duplicate property definition found for "%s"; previously defined on line %s'; - $data = [ - $propName, - $tokens[$properties[$propName]]['line'], - ]; - $phpcsFile->addError($error, $next, 'Found', $data); - } - - $properties[$propName] = $next; - }//end if - - $next = $phpcsFile->findNext($wantedTokens, ($next + 1), $tokens[$stackPtr]['bracket_closer']); - }//end while - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'Support for scanning JavaScript files will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/LowercaseClassKeywordsSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/LowercaseClassKeywordsSniff.php deleted file mode 100644 index 5acbbba..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/LowercaseClassKeywordsSniff.php +++ /dev/null @@ -1,73 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Classes; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class LowercaseClassKeywordsSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - $targets = Tokens::$ooScopeTokens; - $targets[] = T_EXTENDS; - $targets[] = T_IMPLEMENTS; - $targets[] = T_ABSTRACT; - $targets[] = T_FINAL; - $targets[] = T_READONLY; - $targets[] = T_VAR; - $targets[] = T_CONST; - - return $targets; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $content = $tokens[$stackPtr]['content']; - $contentLc = strtolower($content); - if ($content !== $contentLc) { - $error = '%s keyword must be lowercase; expected "%s" but found "%s"'; - $data = [ - strtoupper($content), - $contentLc, - $content, - ]; - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'FoundUppercase', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, $contentLc); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/SelfMemberReferenceSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/SelfMemberReferenceSniff.php deleted file mode 100644 index 11f4080..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/SelfMemberReferenceSniff.php +++ /dev/null @@ -1,248 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Classes; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\AbstractScopeSniff; -use PHP_CodeSniffer\Util\Tokens; - -class SelfMemberReferenceSniff extends AbstractScopeSniff -{ - - - /** - * Constructs a Squiz_Sniffs_Classes_SelfMemberReferenceSniff. - */ - public function __construct() - { - parent::__construct([T_CLASS], [T_DOUBLE_COLON]); - - }//end __construct() - - - /** - * Processes the function tokens within the class. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position where the token was found. - * @param int $currScope The current scope opener token. - * - * @return void - */ - protected function processTokenWithinScope(File $phpcsFile, $stackPtr, $currScope) - { - $tokens = $phpcsFile->getTokens(); - - // Determine if this is a double colon which needs to be examined. - $conditions = $tokens[$stackPtr]['conditions']; - $conditions = array_reverse($conditions, true); - foreach ($conditions as $conditionToken => $tokenCode) { - if ($tokenCode === T_CLASS || $tokenCode === T_ANON_CLASS || $tokenCode === T_CLOSURE) { - break; - } - } - - if ($conditionToken !== $currScope) { - return; - } - - $calledClassName = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($calledClassName === false) { - // Parse error. - return; - } - - if ($tokens[$calledClassName]['code'] === T_SELF) { - if ($tokens[$calledClassName]['content'] !== 'self') { - $error = 'Must use "self::" for local static member reference; found "%s::"'; - $data = [$tokens[$calledClassName]['content']]; - $fix = $phpcsFile->addFixableError($error, $calledClassName, 'IncorrectCase', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($calledClassName, 'self'); - } - - return; - } - } else if ($tokens[$calledClassName]['code'] === T_STRING) { - // If the class is called with a namespace prefix, build fully qualified - // namespace calls for both current scope class and requested class. - $prevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($calledClassName - 1), null, true); - if ($prevNonEmpty !== false && $tokens[$prevNonEmpty]['code'] === T_NS_SEPARATOR) { - $declarationName = $this->getDeclarationNameWithNamespace($tokens, $calledClassName); - $declarationName = ltrim($declarationName, '\\'); - $fullQualifiedClassName = $this->getNamespaceOfScope($phpcsFile, $currScope); - if ($fullQualifiedClassName === '\\') { - $fullQualifiedClassName = ''; - } else { - $fullQualifiedClassName .= '\\'; - } - - $fullQualifiedClassName .= $phpcsFile->getDeclarationName($currScope); - } else { - $declarationName = $phpcsFile->getDeclarationName($currScope); - $fullQualifiedClassName = $tokens[$calledClassName]['content']; - } - - if ($declarationName === $fullQualifiedClassName) { - // Class name is the same as the current class, which is not allowed. - $error = 'Must use "self::" for local static member reference'; - $fix = $phpcsFile->addFixableError($error, $calledClassName, 'NotUsed'); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - $currentPointer = ($stackPtr - 1); - while ($tokens[$currentPointer]['code'] === T_NS_SEPARATOR - || $tokens[$currentPointer]['code'] === T_STRING - || isset(Tokens::$emptyTokens[$tokens[$currentPointer]['code']]) === true - ) { - if (isset(Tokens::$emptyTokens[$tokens[$currentPointer]['code']]) === true) { - --$currentPointer; - continue; - } - - $phpcsFile->fixer->replaceToken($currentPointer, ''); - --$currentPointer; - } - - $phpcsFile->fixer->replaceToken($stackPtr, 'self::'); - $phpcsFile->fixer->endChangeset(); - - // Fix potential whitespace issues in the next loop. - return; - }//end if - }//end if - }//end if - - if ($tokens[($stackPtr - 1)]['code'] === T_WHITESPACE) { - $found = $tokens[($stackPtr - 1)]['length']; - $error = 'Expected 0 spaces before double colon; %s found'; - $data = [$found]; - $fix = $phpcsFile->addFixableError($error, ($stackPtr - 1), 'SpaceBefore', $data); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - for ($i = ($stackPtr - 1); $tokens[$i]['code'] === T_WHITESPACE; $i--) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - - if ($tokens[($stackPtr + 1)]['code'] === T_WHITESPACE) { - $found = $tokens[($stackPtr + 1)]['length']; - $error = 'Expected 0 spaces after double colon; %s found'; - $data = [$found]; - $fix = $phpcsFile->addFixableError($error, ($stackPtr - 1), 'SpaceAfter', $data); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - for ($i = ($stackPtr + 1); $tokens[$i]['code'] === T_WHITESPACE; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - - }//end processTokenWithinScope() - - - /** - * Processes a token that is found within the scope that this test is - * listening to. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position in the stack where this - * token was found. - * - * @return void - */ - protected function processTokenOutsideScope(File $phpcsFile, $stackPtr) - { - - }//end processTokenOutsideScope() - - - /** - * Returns the declaration names for classes/interfaces/functions with a namespace. - * - * @param array $tokens Token stack for this file. - * @param int $stackPtr The position where the namespace building will start. - * - * @return string - */ - protected function getDeclarationNameWithNamespace(array $tokens, $stackPtr) - { - $nameParts = []; - $currentPointer = $stackPtr; - while ($tokens[$currentPointer]['code'] === T_NS_SEPARATOR - || $tokens[$currentPointer]['code'] === T_STRING - || isset(Tokens::$emptyTokens[$tokens[$currentPointer]['code']]) === true - ) { - if (isset(Tokens::$emptyTokens[$tokens[$currentPointer]['code']]) === true) { - --$currentPointer; - continue; - } - - $nameParts[] = $tokens[$currentPointer]['content']; - --$currentPointer; - } - - $nameParts = array_reverse($nameParts); - return implode('', $nameParts); - - }//end getDeclarationNameWithNamespace() - - - /** - * Returns the namespace declaration of a file. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position where the search for the - * namespace declaration will start. - * - * @return string - */ - protected function getNamespaceOfScope(File $phpcsFile, $stackPtr) - { - $namespace = '\\'; - $tokens = $phpcsFile->getTokens(); - - while (($namespaceDeclaration = $phpcsFile->findPrevious(T_NAMESPACE, $stackPtr)) !== false) { - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($namespaceDeclaration + 1), null, true); - if ($tokens[$nextNonEmpty]['code'] === T_NS_SEPARATOR) { - // Namespace operator. Ignore. - $stackPtr = ($namespaceDeclaration - 1); - continue; - } - - $endOfNamespaceDeclaration = $phpcsFile->findNext([T_SEMICOLON, T_OPEN_CURLY_BRACKET, T_CLOSE_TAG], $namespaceDeclaration); - $namespace = $this->getDeclarationNameWithNamespace( - $phpcsFile->getTokens(), - ($endOfNamespaceDeclaration - 1) - ); - break; - } - - return $namespace; - - }//end getNamespaceOfScope() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/ValidClassNameSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/ValidClassNameSniff.php deleted file mode 100644 index 58b486a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Classes/ValidClassNameSniff.php +++ /dev/null @@ -1,88 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Classes; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Common; -use PHP_CodeSniffer\Util\Tokens; - -class ValidClassNameSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_CLASS, - T_INTERFACE, - T_TRAIT, - T_ENUM, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being processed. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['scope_opener']) === false) { - $error = 'Possible parse error: %s missing opening or closing brace'; - $data = [$tokens[$stackPtr]['content']]; - $phpcsFile->addWarning($error, $stackPtr, 'MissingBrace', $data); - return; - } - - // Determine the name of the class or interface. Note that we cannot - // simply look for the first T_STRING because a class name - // starting with the number will be multiple tokens. - $opener = $tokens[$stackPtr]['scope_opener']; - $nameStart = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), $opener, true); - $nameEnd = $phpcsFile->findNext((Tokens::$emptyTokens + [T_COLON => T_COLON]), $nameStart, $opener); - if ($nameEnd === false) { - $name = $tokens[$nameStart]['content']; - } else { - $name = trim($phpcsFile->getTokensAsString($nameStart, ($nameEnd - $nameStart))); - } - - // Check for PascalCase format. - $valid = Common::isCamelCaps($name, true, true, false); - if ($valid === false) { - $type = ucfirst($tokens[$stackPtr]['content']); - $error = '%s name "%s" is not in PascalCase format'; - $data = [ - $type, - $name, - ]; - $phpcsFile->addError($error, $nameStart, 'NotCamelCaps', $data); - $phpcsFile->recordMetric($stackPtr, 'PascalCase class name', 'no'); - } else { - $phpcsFile->recordMetric($stackPtr, 'PascalCase class name', 'yes'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/BlockCommentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/BlockCommentSniff.php deleted file mode 100644 index 77daded..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/BlockCommentSniff.php +++ /dev/null @@ -1,399 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class BlockCommentSniff implements Sniff -{ - - /** - * The --tab-width CLI value that is being used. - * - * @var integer - */ - private $tabWidth = null; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_COMMENT, - T_DOC_COMMENT_OPEN_TAG, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - if ($this->tabWidth === null) { - if (isset($phpcsFile->config->tabWidth) === false || $phpcsFile->config->tabWidth === 0) { - // We have no idea how wide tabs are, so assume 4 spaces for fixing. - $this->tabWidth = 4; - } else { - $this->tabWidth = $phpcsFile->config->tabWidth; - } - } - - $tokens = $phpcsFile->getTokens(); - - // If it's an inline comment, return. - if (substr($tokens[$stackPtr]['content'], 0, 2) !== '/*') { - return; - } - - // If this is a function/class/interface/enum/property/const doc block comment, skip it. - // We are only interested in inline doc block comments. - if ($tokens[$stackPtr]['code'] === T_DOC_COMMENT_OPEN_TAG) { - $nextToken = $stackPtr; - do { - $nextToken = $phpcsFile->findNext(Tokens::$emptyTokens, ($nextToken + 1), null, true); - if ($tokens[$nextToken]['code'] === T_ATTRIBUTE) { - $nextToken = $tokens[$nextToken]['attribute_closer']; - continue; - } - - break; - } while (true); - - $ignore = Tokens::$scopeModifiers; - $ignore += [ - T_CLASS => true, - T_INTERFACE => true, - T_TRAIT => true, - T_ENUM => true, - T_FUNCTION => true, - T_FINAL => true, - T_STATIC => true, - T_ABSTRACT => true, - T_CONST => true, - T_VAR => true, - T_READONLY => true, - ]; - if (isset($ignore[$tokens[$nextToken]['code']]) === true) { - return; - } - - $prevToken = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($tokens[$prevToken]['code'] === T_OPEN_TAG) { - return; - } - - $error = 'Block comments must be started with /*'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'WrongStart'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, '/*'); - } - - $end = $tokens[$stackPtr]['comment_closer']; - if ($tokens[$end]['content'] !== '*/') { - $error = 'Block comments must be ended with */'; - $fix = $phpcsFile->addFixableError($error, $end, 'WrongEnd'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($end, '*/'); - } - } - - return; - }//end if - - $commentLines = [$stackPtr]; - $nextComment = $stackPtr; - $lastLine = $tokens[$stackPtr]['line']; - $commentString = $tokens[$stackPtr]['content']; - - // Construct the comment into an array. - while (($nextComment = $phpcsFile->findNext(T_WHITESPACE, ($nextComment + 1), null, true)) !== false) { - if ($tokens[$nextComment]['code'] !== $tokens[$stackPtr]['code'] - && isset(Tokens::$phpcsCommentTokens[$tokens[$nextComment]['code']]) === false - ) { - // Found the next bit of code. - break; - } - - if (($tokens[$nextComment]['line'] - 1) !== $lastLine) { - // Not part of the block. - break; - } - - $lastLine = $tokens[$nextComment]['line']; - $commentLines[] = $nextComment; - $commentString .= $tokens[$nextComment]['content']; - if ($tokens[$nextComment]['code'] === T_DOC_COMMENT_CLOSE_TAG - || substr($tokens[$nextComment]['content'], -2) === '*/' - ) { - break; - } - }//end while - - $commentText = str_replace($phpcsFile->eolChar, '', $commentString); - $commentText = trim($commentText, "/* \t"); - if ($commentText === '') { - $error = 'Empty block comment not allowed'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Empty'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($stackPtr, ''); - $lastToken = array_pop($commentLines); - for ($i = ($stackPtr + 1); $i <= $lastToken; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - - return; - } - - if (count($commentLines) === 1) { - $error = 'Single line block comment not allowed; use inline ("// text") comment instead'; - - // Only fix comments when they are the last token on a line. - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($tokens[$stackPtr]['line'] !== $tokens[$nextNonEmpty]['line']) { - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SingleLine'); - if ($fix === true) { - $comment = '// '.$commentText.$phpcsFile->eolChar; - $phpcsFile->fixer->replaceToken($stackPtr, $comment); - } - } else { - $phpcsFile->addError($error, $stackPtr, 'SingleLine'); - } - - return; - } - - $content = trim($tokens[$stackPtr]['content']); - if ($content !== '/*' && $content !== '/**') { - $error = 'Block comment text must start on a new line'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoNewLine'); - if ($fix === true) { - $indent = ''; - if ($tokens[($stackPtr - 1)]['code'] === T_WHITESPACE) { - if (isset($tokens[($stackPtr - 1)]['orig_content']) === true) { - $indent = $tokens[($stackPtr - 1)]['orig_content']; - } else { - $indent = $tokens[($stackPtr - 1)]['content']; - } - } - - $comment = preg_replace( - '/^(\s*\/\*\*?)/', - '$1'.$phpcsFile->eolChar.$indent, - $tokens[$stackPtr]['content'], - 1 - ); - $phpcsFile->fixer->replaceToken($stackPtr, $comment); - } - - return; - }//end if - - $starColumn = $tokens[$stackPtr]['column']; - $hasStars = false; - - // Make sure first line isn't blank. - if (trim($tokens[$commentLines[1]]['content']) === '') { - $error = 'Empty line not allowed at start of comment'; - $fix = $phpcsFile->addFixableError($error, $commentLines[1], 'HasEmptyLine'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($commentLines[1], ''); - } - } else { - // Check indentation of first line. - $content = $tokens[$commentLines[1]]['content']; - $commentText = ltrim($content); - $leadingSpace = (strlen($content) - strlen($commentText)); - - $expected = ($starColumn + 3); - if ($commentText[0] === '*') { - $expected = $starColumn; - $hasStars = true; - } - - if ($leadingSpace !== $expected) { - $expectedTxt = $expected.' space'; - if ($expected !== 1) { - $expectedTxt .= 's'; - } - - $data = [ - $expectedTxt, - $leadingSpace, - ]; - - $error = 'First line of comment not aligned correctly; expected %s but found %s'; - $fix = $phpcsFile->addFixableError($error, $commentLines[1], 'FirstLineIndent', $data); - if ($fix === true) { - if (isset($tokens[$commentLines[1]]['orig_content']) === true - && $tokens[$commentLines[1]]['orig_content'][0] === "\t" - ) { - // Line is indented using tabs. - $padding = str_repeat("\t", floor($expected / $this->tabWidth)); - $padding .= str_repeat(' ', ($expected % $this->tabWidth)); - } else { - $padding = str_repeat(' ', $expected); - } - - $phpcsFile->fixer->replaceToken($commentLines[1], $padding.$commentText); - } - }//end if - - if (preg_match('/^\p{Ll}/u', $commentText) === 1) { - $error = 'Block comments must start with a capital letter'; - $phpcsFile->addError($error, $commentLines[1], 'NoCapital'); - } - }//end if - - // Check that each line of the comment is indented past the star. - foreach ($commentLines as $line) { - // First and last lines (comment opener and closer) are handled separately. - if ($line === $commentLines[(count($commentLines) - 1)] || $line === $commentLines[0]) { - continue; - } - - // First comment line was handled above. - if ($line === $commentLines[1]) { - continue; - } - - // If it's empty, continue. - if (trim($tokens[$line]['content']) === '') { - continue; - } - - $commentText = ltrim($tokens[$line]['content']); - $leadingSpace = (strlen($tokens[$line]['content']) - strlen($commentText)); - - $expected = ($starColumn + 3); - if ($commentText[0] === '*') { - $expected = $starColumn; - $hasStars = true; - } - - if ($leadingSpace < $expected) { - $expectedTxt = $expected.' space'; - if ($expected !== 1) { - $expectedTxt .= 's'; - } - - $data = [ - $expectedTxt, - $leadingSpace, - ]; - - $error = 'Comment line indented incorrectly; expected at least %s but found %s'; - $fix = $phpcsFile->addFixableError($error, $line, 'LineIndent', $data); - if ($fix === true) { - if (isset($tokens[$line]['orig_content']) === true - && $tokens[$line]['orig_content'][0] === "\t" - ) { - // Line is indented using tabs. - $padding = str_repeat("\t", floor($expected / $this->tabWidth)); - $padding .= str_repeat(' ', ($expected % $this->tabWidth)); - } else { - $padding = str_repeat(' ', $expected); - } - - $phpcsFile->fixer->replaceToken($line, $padding.$commentText); - } - }//end if - }//end foreach - - // Finally, test the last line is correct. - $lastIndex = (count($commentLines) - 1); - $content = $tokens[$commentLines[$lastIndex]]['content']; - $commentText = ltrim($content); - if ($commentText !== '*/' && $commentText !== '**/') { - $error = 'Comment closer must be on a new line'; - $phpcsFile->addError($error, $commentLines[$lastIndex], 'CloserSameLine'); - } else { - $leadingSpace = (strlen($content) - strlen($commentText)); - - $expected = ($starColumn - 1); - if ($hasStars === true) { - $expected = $starColumn; - } - - if ($leadingSpace !== $expected) { - $expectedTxt = $expected.' space'; - if ($expected !== 1) { - $expectedTxt .= 's'; - } - - $data = [ - $expectedTxt, - $leadingSpace, - ]; - - $error = 'Last line of comment aligned incorrectly; expected %s but found %s'; - $fix = $phpcsFile->addFixableError($error, $commentLines[$lastIndex], 'LastLineIndent', $data); - if ($fix === true) { - if (isset($tokens[$line]['orig_content']) === true - && $tokens[$line]['orig_content'][0] === "\t" - ) { - // Line is indented using tabs. - $padding = str_repeat("\t", floor($expected / $this->tabWidth)); - $padding .= str_repeat(' ', ($expected % $this->tabWidth)); - } else { - $padding = str_repeat(' ', $expected); - } - - $phpcsFile->fixer->replaceToken($commentLines[$lastIndex], $padding.$commentText); - } - }//end if - }//end if - - // Check that the lines before and after this comment are blank. - $contentBefore = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - if ((isset($tokens[$contentBefore]['scope_closer']) === true - && $tokens[$contentBefore]['scope_opener'] === $contentBefore) - || $tokens[$contentBefore]['code'] === T_OPEN_TAG - || $tokens[$contentBefore]['code'] === T_OPEN_TAG_WITH_ECHO - ) { - if (($tokens[$stackPtr]['line'] - $tokens[$contentBefore]['line']) !== 1) { - $error = 'Empty line not required before block comment'; - $phpcsFile->addError($error, $stackPtr, 'HasEmptyLineBefore'); - } - } else { - if (($tokens[$stackPtr]['line'] - $tokens[$contentBefore]['line']) < 2) { - $error = 'Empty line required before block comment'; - $phpcsFile->addError($error, $stackPtr, 'NoEmptyLineBefore'); - } - } - - $commentCloser = $commentLines[$lastIndex]; - $contentAfter = $phpcsFile->findNext(T_WHITESPACE, ($commentCloser + 1), null, true); - if ($contentAfter !== false && ($tokens[$contentAfter]['line'] - $tokens[$commentCloser]['line']) < 2) { - $error = 'Empty line required after block comment'; - $phpcsFile->addError($error, $commentCloser, 'NoEmptyLineAfter'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/ClassCommentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/ClassCommentSniff.php deleted file mode 100644 index 8a02d3c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/ClassCommentSniff.php +++ /dev/null @@ -1,109 +0,0 @@ - - *
  • A class doc comment exists.
  • - *
  • The comment uses the correct docblock style.
  • - *
  • There are no blank lines after the class comment.
  • - *
  • No tags are used in the docblock.
  • - * - * - * @author Greg Sherwood - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ClassCommentSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_CLASS]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $find = [ - T_ABSTRACT => T_ABSTRACT, - T_FINAL => T_FINAL, - T_READONLY => T_READONLY, - T_WHITESPACE => T_WHITESPACE, - ]; - - $previousContent = null; - for ($commentEnd = ($stackPtr - 1); $commentEnd >= 0; $commentEnd--) { - if (isset($find[$tokens[$commentEnd]['code']]) === true) { - continue; - } - - if ($previousContent === null) { - $previousContent = $commentEnd; - } - - if ($tokens[$commentEnd]['code'] === T_ATTRIBUTE_END - && isset($tokens[$commentEnd]['attribute_opener']) === true - ) { - $commentEnd = $tokens[$commentEnd]['attribute_opener']; - continue; - } - - break; - } - - if ($tokens[$commentEnd]['code'] !== T_DOC_COMMENT_CLOSE_TAG - && $tokens[$commentEnd]['code'] !== T_COMMENT - ) { - $class = $phpcsFile->getDeclarationName($stackPtr); - $phpcsFile->addError('Missing doc comment for class %s', $stackPtr, 'Missing', [$class]); - $phpcsFile->recordMetric($stackPtr, 'Class has doc comment', 'no'); - return; - } - - $phpcsFile->recordMetric($stackPtr, 'Class has doc comment', 'yes'); - - if ($tokens[$commentEnd]['code'] === T_COMMENT) { - $phpcsFile->addError('You must use "/**" style comments for a class comment', $stackPtr, 'WrongStyle'); - return; - } - - if ($tokens[$previousContent]['line'] !== ($tokens[$stackPtr]['line'] - 1)) { - $error = 'There must be no blank lines after the class comment'; - $phpcsFile->addError($error, $commentEnd, 'SpacingAfter'); - } - - $commentStart = $tokens[$commentEnd]['comment_opener']; - foreach ($tokens[$commentStart]['comment_tags'] as $tag) { - $error = '%s tag is not allowed in class comment'; - $data = [$tokens[$tag]['content']]; - $phpcsFile->addWarning($error, $tag, 'TagNotAllowed', $data); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/ClosingDeclarationCommentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/ClosingDeclarationCommentSniff.php deleted file mode 100644 index 57cf72d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/ClosingDeclarationCommentSniff.php +++ /dev/null @@ -1,130 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ClosingDeclarationCommentSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_CLASS, - T_ENUM, - T_FUNCTION, - T_INTERFACE, - T_TRAIT, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens.. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['code'] === T_FUNCTION) { - $methodProps = $phpcsFile->getMethodProperties($stackPtr); - - // Abstract methods do not require a closing comment. - if ($methodProps['is_abstract'] === true) { - return; - } - - // If this function is in an interface then we don't require - // a closing comment. - if ($phpcsFile->hasCondition($stackPtr, T_INTERFACE) === true) { - return; - } - - if (isset($tokens[$stackPtr]['scope_closer']) === false) { - $error = 'Possible parse error: non-abstract method defined as abstract'; - $phpcsFile->addWarning($error, $stackPtr, 'Abstract'); - return; - } - - $decName = $phpcsFile->getDeclarationName($stackPtr); - $comment = '//end '.$decName.'()'; - } else if ($tokens[$stackPtr]['code'] === T_CLASS) { - $comment = '//end class'; - } else if ($tokens[$stackPtr]['code'] === T_INTERFACE) { - $comment = '//end interface'; - } else if ($tokens[$stackPtr]['code'] === T_TRAIT) { - $comment = '//end trait'; - } else { - $comment = '//end enum'; - }//end if - - if (isset($tokens[$stackPtr]['scope_closer']) === false) { - $error = 'Possible parse error: %s missing opening or closing brace'; - $data = [$tokens[$stackPtr]['content']]; - $phpcsFile->addWarning($error, $stackPtr, 'MissingBrace', $data); - return; - } - - $closingBracket = $tokens[$stackPtr]['scope_closer']; - - $data = [$comment]; - if (isset($tokens[($closingBracket + 1)]) === false || $tokens[($closingBracket + 1)]['code'] !== T_COMMENT) { - $next = $phpcsFile->findNext(T_WHITESPACE, ($closingBracket + 1), null, true); - if ($next !== false && rtrim($tokens[$next]['content']) === $comment) { - // The comment isn't really missing; it is just in the wrong place. - $fix = $phpcsFile->addFixableError('Expected %s directly after closing brace', $closingBracket, 'Misplaced', $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($closingBracket + 1); $i < $next; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - // Just in case, because indentation fixes can add indents onto - // these comments and cause us to be unable to fix them. - $phpcsFile->fixer->replaceToken($next, $comment.$phpcsFile->eolChar); - $phpcsFile->fixer->endChangeset(); - } - } else { - $fix = $phpcsFile->addFixableError('Expected %s', $closingBracket, 'Missing', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($closingBracket, '}'.$comment); - } - } - - return; - }//end if - - if (rtrim($tokens[($closingBracket + 1)]['content']) !== $comment) { - $fix = $phpcsFile->addFixableError('Expected %s', $closingBracket, 'Incorrect', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($closingBracket + 1), $comment.$phpcsFile->eolChar); - } - - return; - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/DocCommentAlignmentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/DocCommentAlignmentSniff.php deleted file mode 100644 index 465c5aa..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/DocCommentAlignmentSniff.php +++ /dev/null @@ -1,167 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class DocCommentAlignmentSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_DOC_COMMENT_OPEN_TAG]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // We are only interested in function/class/interface/enum/property/const doc block comments. - $ignore = Tokens::$emptyTokens; - if ($phpcsFile->tokenizerType === 'JS') { - $ignore[] = T_EQUAL; - $ignore[] = T_STRING; - $ignore[] = T_OBJECT_OPERATOR; - } - - $nextToken = $phpcsFile->findNext($ignore, ($stackPtr + 1), null, true); - - $ignore = Tokens::$scopeModifiers; - $ignore += [ - T_CLASS => true, - T_INTERFACE => true, - T_ENUM => true, - T_ENUM_CASE => true, - T_FUNCTION => true, - T_STATIC => true, - T_ABSTRACT => true, - T_FINAL => true, - T_PROPERTY => true, - T_OBJECT => true, - T_PROTOTYPE => true, - T_VAR => true, - T_READONLY => true, - ]; - - if ($nextToken === false || isset($ignore[$tokens[$nextToken]['code']]) === false) { - // Could be a file comment. - $prevToken = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($tokens[$prevToken]['code'] !== T_OPEN_TAG) { - return; - } - } - - // There must be one space after each star (unless it is an empty comment line) - // and all the stars must be aligned correctly. - $requiredColumn = ($tokens[$stackPtr]['column'] + 1); - $endComment = $tokens[$stackPtr]['comment_closer']; - for ($i = ($stackPtr + 1); $i <= $endComment; $i++) { - if ($tokens[$i]['code'] !== T_DOC_COMMENT_STAR - && $tokens[$i]['code'] !== T_DOC_COMMENT_CLOSE_TAG - ) { - continue; - } - - if ($tokens[$i]['code'] === T_DOC_COMMENT_CLOSE_TAG) { - if (trim($tokens[$i]['content']) === '') { - // Don't process an unfinished docblock close tag during live coding. - continue; - } - - // Can't process the close tag if it is not the first thing on the line. - $prev = $phpcsFile->findPrevious(T_DOC_COMMENT_WHITESPACE, ($i - 1), $stackPtr, true); - if ($tokens[$prev]['line'] === $tokens[$i]['line']) { - continue; - } - } - - if ($tokens[$i]['column'] !== $requiredColumn) { - $pluralizeSpace = 's'; - if (($requiredColumn - 1) === 1) { - $pluralizeSpace = ''; - } - - $error = 'Expected %s space%s before asterisk; %s found'; - $data = [ - ($requiredColumn - 1), - $pluralizeSpace, - ($tokens[$i]['column'] - 1), - ]; - $fix = $phpcsFile->addFixableError($error, $i, 'SpaceBeforeStar', $data); - if ($fix === true) { - $padding = str_repeat(' ', ($requiredColumn - 1)); - if ($tokens[$i]['column'] === 1) { - $phpcsFile->fixer->addContentBefore($i, $padding); - } else { - $phpcsFile->fixer->replaceToken(($i - 1), $padding); - } - } - }//end if - - if ($tokens[$i]['code'] !== T_DOC_COMMENT_STAR) { - continue; - } - - if ($tokens[($i + 2)]['line'] !== $tokens[$i]['line']) { - // Line is empty. - continue; - } - - if ($tokens[($i + 1)]['code'] !== T_DOC_COMMENT_WHITESPACE) { - $error = 'Expected 1 space after asterisk; 0 found'; - $fix = $phpcsFile->addFixableError($error, $i, 'NoSpaceAfterStar'); - if ($fix === true) { - $phpcsFile->fixer->addContent($i, ' '); - } - } else if ($tokens[($i + 2)]['code'] === T_DOC_COMMENT_TAG - && $tokens[($i + 1)]['content'] !== ' ' - ) { - $error = 'Expected 1 space after asterisk; %s found'; - $data = [$tokens[($i + 1)]['length']]; - $fix = $phpcsFile->addFixableError($error, $i, 'SpaceAfterStar', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($i + 1), ' '); - } - } - }//end for - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/EmptyCatchCommentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/EmptyCatchCommentSniff.php deleted file mode 100644 index 16c261c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/EmptyCatchCommentSniff.php +++ /dev/null @@ -1,55 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class EmptyCatchCommentSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_CATCH]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile All the tokens found in the document. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $scopeStart = $tokens[$stackPtr]['scope_opener']; - $firstContent = $phpcsFile->findNext(T_WHITESPACE, ($scopeStart + 1), $tokens[$stackPtr]['scope_closer'], true); - - if ($firstContent === false) { - $error = 'Empty CATCH statement must have a comment to explain why the exception is not handled'; - $phpcsFile->addError($error, $scopeStart, 'Missing'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/FileCommentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/FileCommentSniff.php deleted file mode 100644 index 5d6d173..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/FileCommentSniff.php +++ /dev/null @@ -1,228 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class FileCommentSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return int - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $commentStart = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - - if ($tokens[$commentStart]['code'] === T_COMMENT) { - $phpcsFile->addError('You must use "/**" style comments for a file comment', $commentStart, 'WrongStyle'); - $phpcsFile->recordMetric($stackPtr, 'File has doc comment', 'yes'); - return $phpcsFile->numTokens; - } else if ($commentStart === false || $tokens[$commentStart]['code'] !== T_DOC_COMMENT_OPEN_TAG) { - $phpcsFile->addError('Missing file doc comment', $stackPtr, 'Missing'); - $phpcsFile->recordMetric($stackPtr, 'File has doc comment', 'no'); - return $phpcsFile->numTokens; - } - - if (isset($tokens[$commentStart]['comment_closer']) === false - || ($tokens[$tokens[$commentStart]['comment_closer']]['content'] === '' - && $tokens[$commentStart]['comment_closer'] === ($phpcsFile->numTokens - 1)) - ) { - // Don't process an unfinished file comment during live coding. - return $phpcsFile->numTokens; - } - - $commentEnd = $tokens[$commentStart]['comment_closer']; - - for ($nextToken = ($commentEnd + 1); $nextToken < $phpcsFile->numTokens; $nextToken++) { - if ($tokens[$nextToken]['code'] === T_WHITESPACE) { - continue; - } - - if ($tokens[$nextToken]['code'] === T_ATTRIBUTE - && isset($tokens[$nextToken]['attribute_closer']) === true - ) { - $nextToken = $tokens[$nextToken]['attribute_closer']; - continue; - } - - break; - } - - if ($nextToken === $phpcsFile->numTokens) { - $nextToken--; - } - - $ignore = [ - T_CLASS, - T_INTERFACE, - T_TRAIT, - T_ENUM, - T_FUNCTION, - T_CLOSURE, - T_PUBLIC, - T_PRIVATE, - T_PROTECTED, - T_FINAL, - T_STATIC, - T_ABSTRACT, - T_READONLY, - T_CONST, - T_PROPERTY, - T_INCLUDE, - T_INCLUDE_ONCE, - T_REQUIRE, - T_REQUIRE_ONCE, - ]; - - if (in_array($tokens[$nextToken]['code'], $ignore, true) === true) { - $phpcsFile->addError('Missing file doc comment', $stackPtr, 'Missing'); - $phpcsFile->recordMetric($stackPtr, 'File has doc comment', 'no'); - return $phpcsFile->numTokens; - } - - $phpcsFile->recordMetric($stackPtr, 'File has doc comment', 'yes'); - - // No blank line between the open tag and the file comment. - if ($tokens[$commentStart]['line'] > ($tokens[$stackPtr]['line'] + 1)) { - $error = 'There must be no blank lines before the file comment'; - $phpcsFile->addError($error, $stackPtr, 'SpacingAfterOpen'); - } - - // Exactly one blank line after the file comment. - $next = $phpcsFile->findNext(T_WHITESPACE, ($commentEnd + 1), null, true); - if ($next !== false && $tokens[$next]['line'] !== ($tokens[$commentEnd]['line'] + 2)) { - $error = 'There must be exactly one blank line after the file comment'; - $phpcsFile->addError($error, $commentEnd, 'SpacingAfterComment'); - } - - // Required tags in correct order. - $required = [ - '@package' => true, - '@subpackage' => true, - '@author' => true, - '@copyright' => true, - ]; - - $foundTags = []; - foreach ($tokens[$commentStart]['comment_tags'] as $tag) { - $name = $tokens[$tag]['content']; - $isRequired = isset($required[$name]); - - if ($isRequired === true && in_array($name, $foundTags, true) === true) { - $error = 'Only one %s tag is allowed in a file comment'; - $data = [$name]; - $phpcsFile->addError($error, $tag, 'Duplicate'.ucfirst(substr($name, 1)).'Tag', $data); - } - - $foundTags[] = $name; - - if ($isRequired === false) { - continue; - } - - $string = $phpcsFile->findNext(T_DOC_COMMENT_STRING, $tag, $commentEnd); - if ($string === false || $tokens[$string]['line'] !== $tokens[$tag]['line']) { - $error = 'Content missing for %s tag in file comment'; - $data = [$name]; - $phpcsFile->addError($error, $tag, 'Empty'.ucfirst(substr($name, 1)).'Tag', $data); - continue; - } - - if ($name === '@author') { - if ($tokens[$string]['content'] !== 'Squiz Pty Ltd ') { - $error = 'Expected "Squiz Pty Ltd " for author tag'; - $fix = $phpcsFile->addFixableError($error, $tag, 'IncorrectAuthor'); - if ($fix === true) { - $expected = 'Squiz Pty Ltd '; - $phpcsFile->fixer->replaceToken($string, $expected); - } - } - } else if ($name === '@copyright') { - if (preg_match('/^([0-9]{4})(-[0-9]{4})? (Squiz Pty Ltd \(ABN 77 084 670 600\))$/', $tokens[$string]['content']) === 0) { - $error = 'Expected "xxxx-xxxx Squiz Pty Ltd (ABN 77 084 670 600)" for copyright declaration'; - $fix = $phpcsFile->addFixableError($error, $tag, 'IncorrectCopyright'); - if ($fix === true) { - $matches = []; - preg_match('/^(([0-9]{4})(-[0-9]{4})?)?.*$/', $tokens[$string]['content'], $matches); - if (isset($matches[1]) === false) { - $matches[1] = date('Y'); - } - - $expected = $matches[1].' Squiz Pty Ltd (ABN 77 084 670 600)'; - $phpcsFile->fixer->replaceToken($string, $expected); - } - } - }//end if - }//end foreach - - // Check if the tags are in the correct position. - $pos = 0; - foreach ($required as $tag => $true) { - if (in_array($tag, $foundTags, true) === false) { - $error = 'Missing %s tag in file comment'; - $data = [$tag]; - $phpcsFile->addError($error, $commentEnd, 'Missing'.ucfirst(substr($tag, 1)).'Tag', $data); - } - - if (isset($foundTags[$pos]) === false) { - break; - } - - if ($foundTags[$pos] !== $tag) { - $error = 'The tag in position %s should be the %s tag'; - $data = [ - ($pos + 1), - $tag, - ]; - $phpcsFile->addError($error, $tokens[$commentStart]['comment_tags'][$pos], ucfirst(substr($tag, 1)).'TagOrder', $data); - } - - $pos++; - }//end foreach - - // Ignore the rest of the file. - return $phpcsFile->numTokens; - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/FunctionCommentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/FunctionCommentSniff.php deleted file mode 100644 index 71afd95..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/FunctionCommentSniff.php +++ /dev/null @@ -1,800 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Standards\PEAR\Sniffs\Commenting\FunctionCommentSniff as PEARFunctionCommentSniff; -use PHP_CodeSniffer\Util\Common; - -class FunctionCommentSniff extends PEARFunctionCommentSniff -{ - - /** - * Whether to skip inheritdoc comments. - * - * @var boolean - */ - public $skipIfInheritdoc = false; - - /** - * The current PHP version. - * - * @var integer|string|null - */ - private $phpVersion = null; - - - /** - * Process the return comment of this function comment. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $commentStart The position in the stack where the comment started. - * - * @return void - */ - protected function processReturn(File $phpcsFile, $stackPtr, $commentStart) - { - $tokens = $phpcsFile->getTokens(); - $return = null; - - if ($this->skipIfInheritdoc === true) { - if ($this->checkInheritdoc($phpcsFile, $stackPtr, $commentStart) === true) { - return; - } - } - - foreach ($tokens[$commentStart]['comment_tags'] as $tag) { - if ($tokens[$tag]['content'] === '@return') { - if ($return !== null) { - $error = 'Only 1 @return tag is allowed in a function comment'; - $phpcsFile->addError($error, $tag, 'DuplicateReturn'); - return; - } - - $return = $tag; - } - } - - // Skip constructor and destructor. - $methodName = $phpcsFile->getDeclarationName($stackPtr); - $isSpecialMethod = in_array($methodName, $this->specialMethods, true); - - if ($return !== null) { - $content = $tokens[($return + 2)]['content']; - if (empty($content) === true || $tokens[($return + 2)]['code'] !== T_DOC_COMMENT_STRING) { - $error = 'Return type missing for @return tag in function comment'; - $phpcsFile->addError($error, $return, 'MissingReturnType'); - } else { - // Support both a return type and a description. - preg_match('`^((?:\|?(?:array\([^\)]*\)|[\\\\a-z0-9_\[\]]+))*)( .*)?`i', $content, $returnParts); - if (isset($returnParts[1]) === false) { - return; - } - - $returnType = $returnParts[1]; - - // Check return type (can be multiple, separated by '|'). - $typeNames = explode('|', $returnType); - $suggestedNames = []; - foreach ($typeNames as $typeName) { - $suggestedName = Common::suggestType($typeName); - if (in_array($suggestedName, $suggestedNames, true) === false) { - $suggestedNames[] = $suggestedName; - } - } - - $suggestedType = implode('|', $suggestedNames); - if ($returnType !== $suggestedType) { - $error = 'Expected "%s" but found "%s" for function return type'; - $data = [ - $suggestedType, - $returnType, - ]; - $fix = $phpcsFile->addFixableError($error, $return, 'InvalidReturn', $data); - if ($fix === true) { - $replacement = $suggestedType; - if (empty($returnParts[2]) === false) { - $replacement .= $returnParts[2]; - } - - $phpcsFile->fixer->replaceToken(($return + 2), $replacement); - unset($replacement); - } - } - - // If the return type is void, make sure there is - // no return statement in the function. - if ($returnType === 'void') { - if (isset($tokens[$stackPtr]['scope_closer']) === true) { - $endToken = $tokens[$stackPtr]['scope_closer']; - for ($returnToken = $stackPtr; $returnToken < $endToken; $returnToken++) { - if ($tokens[$returnToken]['code'] === T_CLOSURE - || $tokens[$returnToken]['code'] === T_ANON_CLASS - ) { - $returnToken = $tokens[$returnToken]['scope_closer']; - continue; - } - - if ($tokens[$returnToken]['code'] === T_RETURN - || $tokens[$returnToken]['code'] === T_YIELD - || $tokens[$returnToken]['code'] === T_YIELD_FROM - ) { - break; - } - } - - if ($returnToken !== $endToken) { - // If the function is not returning anything, just - // exiting, then there is no problem. - $semicolon = $phpcsFile->findNext(T_WHITESPACE, ($returnToken + 1), null, true); - if ($tokens[$semicolon]['code'] !== T_SEMICOLON) { - $error = 'Function return type is void, but function contains return statement'; - $phpcsFile->addError($error, $return, 'InvalidReturnVoid'); - } - } - }//end if - } else if ($returnType !== 'mixed' - && $returnType !== 'never' - && in_array('void', $typeNames, true) === false - ) { - // If return type is not void, never, or mixed, there needs to be a - // return statement somewhere in the function that returns something. - if (isset($tokens[$stackPtr]['scope_closer']) === true) { - $endToken = $tokens[$stackPtr]['scope_closer']; - for ($returnToken = $stackPtr; $returnToken < $endToken; $returnToken++) { - if ($tokens[$returnToken]['code'] === T_CLOSURE - || $tokens[$returnToken]['code'] === T_ANON_CLASS - ) { - $returnToken = $tokens[$returnToken]['scope_closer']; - continue; - } - - if ($tokens[$returnToken]['code'] === T_RETURN - || $tokens[$returnToken]['code'] === T_YIELD - || $tokens[$returnToken]['code'] === T_YIELD_FROM - ) { - break; - } - } - - if ($returnToken === $endToken) { - $error = 'Function return type is not void, but function has no return statement'; - $phpcsFile->addError($error, $return, 'InvalidNoReturn'); - } else { - $semicolon = $phpcsFile->findNext(T_WHITESPACE, ($returnToken + 1), null, true); - if ($tokens[$semicolon]['code'] === T_SEMICOLON) { - $error = 'Function return type is not void, but function is returning void here'; - $phpcsFile->addError($error, $returnToken, 'InvalidReturnNotVoid'); - } - } - }//end if - }//end if - }//end if - } else { - if ($isSpecialMethod === true) { - return; - } - - $error = 'Missing @return tag in function comment'; - $phpcsFile->addError($error, $tokens[$commentStart]['comment_closer'], 'MissingReturn'); - }//end if - - }//end processReturn() - - - /** - * Process any throw tags that this function comment has. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $commentStart The position in the stack where the comment started. - * - * @return void - */ - protected function processThrows(File $phpcsFile, $stackPtr, $commentStart) - { - $tokens = $phpcsFile->getTokens(); - - if ($this->skipIfInheritdoc === true) { - if ($this->checkInheritdoc($phpcsFile, $stackPtr, $commentStart) === true) { - return; - } - } - - foreach ($tokens[$commentStart]['comment_tags'] as $pos => $tag) { - if ($tokens[$tag]['content'] !== '@throws') { - continue; - } - - $exception = null; - $comment = null; - if ($tokens[($tag + 2)]['code'] === T_DOC_COMMENT_STRING) { - $matches = []; - preg_match('/([^\s]+)(?:\s+(.*))?/', $tokens[($tag + 2)]['content'], $matches); - $exception = $matches[1]; - if (isset($matches[2]) === true && trim($matches[2]) !== '') { - $comment = $matches[2]; - } - } - - if ($exception === null) { - $error = 'Exception type and comment missing for @throws tag in function comment'; - $phpcsFile->addError($error, $tag, 'InvalidThrows'); - } else if ($comment === null) { - $error = 'Comment missing for @throws tag in function comment'; - $phpcsFile->addError($error, $tag, 'EmptyThrows'); - } else { - // Any strings until the next tag belong to this comment. - if (isset($tokens[$commentStart]['comment_tags'][($pos + 1)]) === true) { - $end = $tokens[$commentStart]['comment_tags'][($pos + 1)]; - } else { - $end = $tokens[$commentStart]['comment_closer']; - } - - for ($i = ($tag + 3); $i < $end; $i++) { - if ($tokens[$i]['code'] === T_DOC_COMMENT_STRING) { - $comment .= ' '.$tokens[$i]['content']; - } - } - - $comment = trim($comment); - - // Starts with a capital letter and ends with a fullstop. - $firstChar = $comment[0]; - if (strtoupper($firstChar) !== $firstChar) { - $error = '@throws tag comment must start with a capital letter'; - $phpcsFile->addError($error, ($tag + 2), 'ThrowsNotCapital'); - } - - $lastChar = substr($comment, -1); - if ($lastChar !== '.') { - $error = '@throws tag comment must end with a full stop'; - $phpcsFile->addError($error, ($tag + 2), 'ThrowsNoFullStop'); - } - }//end if - }//end foreach - - }//end processThrows() - - - /** - * Process the function parameter comments. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $commentStart The position in the stack where the comment started. - * - * @return void - */ - protected function processParams(File $phpcsFile, $stackPtr, $commentStart) - { - if ($this->phpVersion === null) { - $this->phpVersion = Config::getConfigData('php_version'); - if ($this->phpVersion === null) { - $this->phpVersion = PHP_VERSION_ID; - } - } - - $tokens = $phpcsFile->getTokens(); - - if ($this->skipIfInheritdoc === true) { - if ($this->checkInheritdoc($phpcsFile, $stackPtr, $commentStart) === true) { - return; - } - } - - $params = []; - $maxType = 0; - $maxVar = 0; - foreach ($tokens[$commentStart]['comment_tags'] as $pos => $tag) { - if ($tokens[$tag]['content'] !== '@param') { - continue; - } - - $type = ''; - $typeSpace = 0; - $var = ''; - $varSpace = 0; - $comment = ''; - $commentLines = []; - if ($tokens[($tag + 2)]['code'] === T_DOC_COMMENT_STRING) { - $matches = []; - preg_match('/((?:(?![$.]|&(?=\$)).)*)(?:((?:\.\.\.)?(?:\$|&)[^\s]+)(?:(\s+)(.*))?)?/', $tokens[($tag + 2)]['content'], $matches); - - if (empty($matches) === false) { - $typeLen = strlen($matches[1]); - $type = trim($matches[1]); - $typeSpace = ($typeLen - strlen($type)); - $typeLen = strlen($type); - if ($typeLen > $maxType) { - $maxType = $typeLen; - } - } - - if ($tokens[($tag + 2)]['content'][0] === '$') { - $error = 'Missing parameter type'; - $phpcsFile->addError($error, $tag, 'MissingParamType'); - } else if (isset($matches[2]) === true) { - $var = $matches[2]; - $varLen = strlen($var); - if ($varLen > $maxVar) { - $maxVar = $varLen; - } - - if (isset($matches[4]) === true) { - $varSpace = strlen($matches[3]); - $comment = $matches[4]; - $commentLines[] = [ - 'comment' => $comment, - 'token' => ($tag + 2), - 'indent' => $varSpace, - ]; - - // Any strings until the next tag belong to this comment. - if (isset($tokens[$commentStart]['comment_tags'][($pos + 1)]) === true) { - $end = $tokens[$commentStart]['comment_tags'][($pos + 1)]; - } else { - $end = $tokens[$commentStart]['comment_closer']; - } - - for ($i = ($tag + 3); $i < $end; $i++) { - if ($tokens[$i]['code'] === T_DOC_COMMENT_STRING) { - $indent = 0; - if ($tokens[($i - 1)]['code'] === T_DOC_COMMENT_WHITESPACE) { - $indent = $tokens[($i - 1)]['length']; - } - - $comment .= ' '.$tokens[$i]['content']; - $commentLines[] = [ - 'comment' => $tokens[$i]['content'], - 'token' => $i, - 'indent' => $indent, - ]; - } - } - } else { - $error = 'Missing parameter comment'; - $phpcsFile->addError($error, $tag, 'MissingParamComment'); - $commentLines[] = ['comment' => '']; - }//end if - } else { - $error = 'Missing parameter name'; - $phpcsFile->addError($error, $tag, 'MissingParamName'); - }//end if - } else { - $error = 'Missing parameter type'; - $phpcsFile->addError($error, $tag, 'MissingParamType'); - }//end if - - $params[] = [ - 'tag' => $tag, - 'type' => $type, - 'var' => $var, - 'comment' => $comment, - 'commentLines' => $commentLines, - 'type_space' => $typeSpace, - 'var_space' => $varSpace, - ]; - }//end foreach - - $realParams = $phpcsFile->getMethodParameters($stackPtr); - $foundParams = []; - - // We want to use ... for all variable length arguments, so added - // this prefix to the variable name so comparisons are easier. - foreach ($realParams as $pos => $param) { - if ($param['variable_length'] === true) { - $realParams[$pos]['name'] = '...'.$realParams[$pos]['name']; - } - } - - foreach ($params as $pos => $param) { - // If the type is empty, the whole line is empty. - if ($param['type'] === '') { - continue; - } - - // Check the param type value. - $typeNames = explode('|', $param['type']); - $suggestedTypeNames = []; - - foreach ($typeNames as $typeName) { - if ($typeName === '') { - continue; - } - - // Strip nullable operator. - if ($typeName[0] === '?') { - $typeName = substr($typeName, 1); - } - - $suggestedName = Common::suggestType($typeName); - $suggestedTypeNames[] = $suggestedName; - - if (count($typeNames) > 1) { - continue; - } - - // Check type hint for array and custom type. - $suggestedTypeHint = ''; - if (strpos($suggestedName, 'array') !== false || substr($suggestedName, -2) === '[]') { - $suggestedTypeHint = 'array'; - } else if (strpos($suggestedName, 'callable') !== false) { - $suggestedTypeHint = 'callable'; - } else if (strpos($suggestedName, 'callback') !== false) { - $suggestedTypeHint = 'callable'; - } else if (in_array($suggestedName, Common::$allowedTypes, true) === false) { - $suggestedTypeHint = $suggestedName; - } - - if ($this->phpVersion >= 70000) { - if ($suggestedName === 'string') { - $suggestedTypeHint = 'string'; - } else if ($suggestedName === 'int' || $suggestedName === 'integer') { - $suggestedTypeHint = 'int'; - } else if ($suggestedName === 'float') { - $suggestedTypeHint = 'float'; - } else if ($suggestedName === 'bool' || $suggestedName === 'boolean') { - $suggestedTypeHint = 'bool'; - } - } - - if ($this->phpVersion >= 70200) { - if ($suggestedName === 'object') { - $suggestedTypeHint = 'object'; - } - } - - if ($this->phpVersion >= 80000) { - if ($suggestedName === 'mixed') { - $suggestedTypeHint = 'mixed'; - } - } - - if ($suggestedTypeHint !== '' && isset($realParams[$pos]) === true && $param['var'] !== '') { - $typeHint = $realParams[$pos]['type_hint']; - - // Remove namespace prefixes when comparing. - $compareTypeHint = substr($suggestedTypeHint, (strlen($typeHint) * -1)); - - if ($typeHint === '') { - $error = 'Type hint "%s" missing for %s'; - $data = [ - $suggestedTypeHint, - $param['var'], - ]; - - $errorCode = 'TypeHintMissing'; - if ($suggestedTypeHint === 'string' - || $suggestedTypeHint === 'int' - || $suggestedTypeHint === 'float' - || $suggestedTypeHint === 'bool' - ) { - $errorCode = 'Scalar'.$errorCode; - } - - $phpcsFile->addError($error, $stackPtr, $errorCode, $data); - } else if ($typeHint !== $compareTypeHint && $typeHint !== '?'.$compareTypeHint) { - $error = 'Expected type hint "%s"; found "%s" for %s'; - $data = [ - $suggestedTypeHint, - $typeHint, - $param['var'], - ]; - $phpcsFile->addError($error, $stackPtr, 'IncorrectTypeHint', $data); - }//end if - } else if ($suggestedTypeHint === '' && isset($realParams[$pos]) === true) { - $typeHint = $realParams[$pos]['type_hint']; - if ($typeHint !== '') { - $error = 'Unknown type hint "%s" found for %s'; - $data = [ - $typeHint, - $param['var'], - ]; - $phpcsFile->addError($error, $stackPtr, 'InvalidTypeHint', $data); - } - }//end if - }//end foreach - - $suggestedType = implode('|', $suggestedTypeNames); - if ($param['type'] !== $suggestedType) { - $error = 'Expected "%s" but found "%s" for parameter type'; - $data = [ - $suggestedType, - $param['type'], - ]; - - $fix = $phpcsFile->addFixableError($error, $param['tag'], 'IncorrectParamVarName', $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - $content = $suggestedType; - $content .= str_repeat(' ', $param['type_space']); - $content .= $param['var']; - $content .= str_repeat(' ', $param['var_space']); - if (isset($param['commentLines'][0]) === true) { - $content .= $param['commentLines'][0]['comment']; - } - - $phpcsFile->fixer->replaceToken(($param['tag'] + 2), $content); - - // Fix up the indent of additional comment lines. - foreach ($param['commentLines'] as $lineNum => $line) { - if ($lineNum === 0 - || $param['commentLines'][$lineNum]['indent'] === 0 - ) { - continue; - } - - $diff = (strlen($param['type']) - strlen($suggestedType)); - $newIndent = ($param['commentLines'][$lineNum]['indent'] - $diff); - $phpcsFile->fixer->replaceToken( - ($param['commentLines'][$lineNum]['token'] - 1), - str_repeat(' ', $newIndent) - ); - } - - $phpcsFile->fixer->endChangeset(); - }//end if - }//end if - - if ($param['var'] === '') { - continue; - } - - $foundParams[] = $param['var']; - - // Check number of spaces after the type. - $this->checkSpacingAfterParamType($phpcsFile, $param, $maxType); - - // Make sure the param name is correct. - if (isset($realParams[$pos]) === true) { - $realName = $realParams[$pos]['name']; - $paramVarName = $param['var']; - - if ($param['var'][0] === '&') { - // Even when passed by reference, the variable name in $realParams does not have - // a leading '&'. This sniff will accept both '&$var' and '$var' in these cases. - $paramVarName = substr($param['var'], 1); - - // This makes sure that the 'MissingParamTag' check won't throw a false positive. - $foundParams[(count($foundParams) - 1)] = $paramVarName; - - if ($realParams[$pos]['pass_by_reference'] !== true && $realName === $paramVarName) { - // Don't complain about this unless the param name is otherwise correct. - $error = 'Doc comment for parameter %s is prefixed with "&" but parameter is not passed by reference'; - $code = 'ParamNameUnexpectedAmpersandPrefix'; - $data = [$paramVarName]; - - // We're not offering an auto-fix here because we can't tell if the docblock - // is wrong, or the parameter should be passed by reference. - $phpcsFile->addError($error, $param['tag'], $code, $data); - } - } - - if ($realName !== $paramVarName) { - $code = 'ParamNameNoMatch'; - $data = [ - $paramVarName, - $realName, - ]; - - $error = 'Doc comment for parameter %s does not match '; - if (strtolower($paramVarName) === strtolower($realName)) { - $error .= 'case of '; - $code = 'ParamNameNoCaseMatch'; - } - - $error .= 'actual variable name %s'; - - $phpcsFile->addError($error, $param['tag'], $code, $data); - }//end if - } else if (substr($param['var'], -4) !== ',...') { - // We must have an extra parameter comment. - $error = 'Superfluous parameter comment'; - $phpcsFile->addError($error, $param['tag'], 'ExtraParamComment'); - }//end if - - if ($param['comment'] === '') { - continue; - } - - // Check number of spaces after the var name. - $this->checkSpacingAfterParamName($phpcsFile, $param, $maxVar); - - // Param comments must start with a capital letter and end with a full stop. - if (preg_match('/^(\p{Ll}|\P{L})/u', $param['comment']) === 1) { - $error = 'Parameter comment must start with a capital letter'; - $phpcsFile->addError($error, $param['tag'], 'ParamCommentNotCapital'); - } - - $lastChar = substr($param['comment'], -1); - if ($lastChar !== '.') { - $error = 'Parameter comment must end with a full stop'; - $phpcsFile->addError($error, $param['tag'], 'ParamCommentFullStop'); - } - }//end foreach - - $realNames = []; - foreach ($realParams as $realParam) { - $realNames[] = $realParam['name']; - } - - // Report missing comments. - $diff = array_diff($realNames, $foundParams); - foreach ($diff as $neededParam) { - $error = 'Doc comment for parameter "%s" missing'; - $data = [$neededParam]; - $phpcsFile->addError($error, $commentStart, 'MissingParamTag', $data); - } - - }//end processParams() - - - /** - * Check the spacing after the type of a parameter. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param array $param The parameter to be checked. - * @param int $maxType The maxlength of the longest parameter type. - * @param int $spacing The number of spaces to add after the type. - * - * @return void - */ - protected function checkSpacingAfterParamType(File $phpcsFile, $param, $maxType, $spacing=1) - { - // Check number of spaces after the type. - $spaces = ($maxType - strlen($param['type']) + $spacing); - if ($param['type_space'] !== $spaces) { - $error = 'Expected %s spaces after parameter type; %s found'; - $data = [ - $spaces, - $param['type_space'], - ]; - - $fix = $phpcsFile->addFixableError($error, $param['tag'], 'SpacingAfterParamType', $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - $content = $param['type']; - $content .= str_repeat(' ', $spaces); - $content .= $param['var']; - $content .= str_repeat(' ', $param['var_space']); - $content .= $param['commentLines'][0]['comment']; - $phpcsFile->fixer->replaceToken(($param['tag'] + 2), $content); - - // Fix up the indent of additional comment lines. - $diff = ($param['type_space'] - $spaces); - foreach ($param['commentLines'] as $lineNum => $line) { - if ($lineNum === 0 - || $param['commentLines'][$lineNum]['indent'] === 0 - ) { - continue; - } - - $newIndent = ($param['commentLines'][$lineNum]['indent'] - $diff); - if ($newIndent <= 0) { - continue; - } - - $phpcsFile->fixer->replaceToken( - ($param['commentLines'][$lineNum]['token'] - 1), - str_repeat(' ', $newIndent) - ); - } - - $phpcsFile->fixer->endChangeset(); - }//end if - }//end if - - }//end checkSpacingAfterParamType() - - - /** - * Check the spacing after the name of a parameter. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param array $param The parameter to be checked. - * @param int $maxVar The maxlength of the longest parameter name. - * @param int $spacing The number of spaces to add after the type. - * - * @return void - */ - protected function checkSpacingAfterParamName(File $phpcsFile, $param, $maxVar, $spacing=1) - { - // Check number of spaces after the var name. - $spaces = ($maxVar - strlen($param['var']) + $spacing); - if ($param['var_space'] !== $spaces) { - $error = 'Expected %s spaces after parameter name; %s found'; - $data = [ - $spaces, - $param['var_space'], - ]; - - $fix = $phpcsFile->addFixableError($error, $param['tag'], 'SpacingAfterParamName', $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - $content = $param['type']; - $content .= str_repeat(' ', $param['type_space']); - $content .= $param['var']; - $content .= str_repeat(' ', $spaces); - $content .= $param['commentLines'][0]['comment']; - $phpcsFile->fixer->replaceToken(($param['tag'] + 2), $content); - - // Fix up the indent of additional comment lines. - foreach ($param['commentLines'] as $lineNum => $line) { - if ($lineNum === 0 - || $param['commentLines'][$lineNum]['indent'] === 0 - ) { - continue; - } - - $diff = ($param['var_space'] - $spaces); - $newIndent = ($param['commentLines'][$lineNum]['indent'] - $diff); - if ($newIndent <= 0) { - continue; - } - - $phpcsFile->fixer->replaceToken( - ($param['commentLines'][$lineNum]['token'] - 1), - str_repeat(' ', $newIndent) - ); - } - - $phpcsFile->fixer->endChangeset(); - }//end if - }//end if - - }//end checkSpacingAfterParamName() - - - /** - * Determines whether the whole comment is an inheritdoc comment. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $commentStart The position in the stack where the comment started. - * - * @return boolean TRUE if the docblock contains only {@inheritdoc} (case-insensitive). - */ - protected function checkInheritdoc(File $phpcsFile, $stackPtr, $commentStart) - { - $tokens = $phpcsFile->getTokens(); - - $allowedTokens = [ - T_DOC_COMMENT_OPEN_TAG, - T_DOC_COMMENT_WHITESPACE, - T_DOC_COMMENT_STAR, - ]; - for ($i = $commentStart; $i <= $tokens[$commentStart]['comment_closer']; $i++) { - if (in_array($tokens[$i]['code'], $allowedTokens, true) === false) { - $trimmedContent = strtolower(trim($tokens[$i]['content'])); - - if ($trimmedContent === '{@inheritdoc}') { - return true; - } else { - return false; - } - } - } - - return false; - - }//end checkInheritdoc() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/FunctionCommentThrowTagSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/FunctionCommentThrowTagSniff.php deleted file mode 100644 index 49b9f3c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/FunctionCommentThrowTagSniff.php +++ /dev/null @@ -1,247 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class FunctionCommentThrowTagSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_FUNCTION]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['scope_closer']) === false) { - // Abstract or incomplete. - return; - } - - $ignore = Tokens::$methodPrefixes; - $ignore[T_WHITESPACE] = T_WHITESPACE; - - for ($commentEnd = ($stackPtr - 1); $commentEnd >= 0; $commentEnd--) { - if (isset($ignore[$tokens[$commentEnd]['code']]) === true) { - continue; - } - - if ($tokens[$commentEnd]['code'] === T_ATTRIBUTE_END - && isset($tokens[$commentEnd]['attribute_opener']) === true - ) { - $commentEnd = $tokens[$commentEnd]['attribute_opener']; - continue; - } - - break; - } - - if ($tokens[$commentEnd]['code'] !== T_DOC_COMMENT_CLOSE_TAG) { - // Function doesn't have a doc comment or is using the wrong type of comment. - return; - } - - $stackPtrEnd = $tokens[$stackPtr]['scope_closer']; - - // Find all the exception type tokens within the current scope. - $thrownExceptions = []; - $currPos = $stackPtr; - $foundThrows = false; - $unknownCount = 0; - do { - $currPos = $phpcsFile->findNext([T_THROW, T_ANON_CLASS, T_CLOSURE], ($currPos + 1), $stackPtrEnd); - if ($currPos === false) { - break; - } - - if ($tokens[$currPos]['code'] !== T_THROW) { - $currPos = $tokens[$currPos]['scope_closer']; - continue; - } - - $foundThrows = true; - - /* - If we can't find a NEW, we are probably throwing - a variable or calling a method. - - If we're throwing a variable, and it's the same variable as the - exception container from the nearest 'catch' block, we take that exception - as it is likely to be a re-throw. - - If we can't find a matching catch block, or the variable name - is different, it's probably a different variable, so we ignore it, - but they still need to provide at least one @throws tag, even through we - don't know the exception class. - */ - - $nextToken = $phpcsFile->findNext(Tokens::$emptyTokens, ($currPos + 1), null, true); - if ($tokens[$nextToken]['code'] === T_NEW - || $tokens[$nextToken]['code'] === T_NS_SEPARATOR - || $tokens[$nextToken]['code'] === T_STRING - ) { - if ($tokens[$nextToken]['code'] === T_NEW) { - $currException = $phpcsFile->findNext( - [ - T_NS_SEPARATOR, - T_STRING, - ], - $currPos, - $stackPtrEnd, - false, - null, - true - ); - } else { - $currException = $nextToken; - } - - if ($currException !== false) { - $endException = $phpcsFile->findNext( - [ - T_NS_SEPARATOR, - T_STRING, - ], - ($currException + 1), - $stackPtrEnd, - true, - null, - true - ); - - if ($endException === false) { - $thrownExceptions[] = $tokens[$currException]['content']; - } else { - $thrownExceptions[] = $phpcsFile->getTokensAsString($currException, ($endException - $currException)); - } - }//end if - } else if ($tokens[$nextToken]['code'] === T_VARIABLE) { - // Find the nearest catch block in this scope and, if the caught var - // matches our re-thrown var, use the exception types being caught as - // exception types that are being thrown as well. - $catch = $phpcsFile->findPrevious( - T_CATCH, - $currPos, - $tokens[$stackPtr]['scope_opener'], - false, - null, - false - ); - - if ($catch !== false) { - $thrownVar = $phpcsFile->findPrevious( - T_VARIABLE, - ($tokens[$catch]['parenthesis_closer'] - 1), - $tokens[$catch]['parenthesis_opener'] - ); - - if ($tokens[$thrownVar]['content'] === $tokens[$nextToken]['content']) { - $exceptions = explode('|', $phpcsFile->getTokensAsString(($tokens[$catch]['parenthesis_opener'] + 1), ($thrownVar - $tokens[$catch]['parenthesis_opener'] - 1))); - foreach ($exceptions as $exception) { - $thrownExceptions[] = trim($exception); - } - } - } - } else { - ++$unknownCount; - }//end if - } while ($currPos < $stackPtrEnd && $currPos !== false); - - if ($foundThrows === false) { - return; - } - - // Only need one @throws tag for each type of exception thrown. - $thrownExceptions = array_unique($thrownExceptions); - - $throwTags = []; - $commentStart = $tokens[$commentEnd]['comment_opener']; - foreach ($tokens[$commentStart]['comment_tags'] as $tag) { - if ($tokens[$tag]['content'] !== '@throws') { - continue; - } - - if ($tokens[($tag + 2)]['code'] === T_DOC_COMMENT_STRING) { - $exception = $tokens[($tag + 2)]['content']; - $space = strpos($exception, ' '); - if ($space !== false) { - $exception = substr($exception, 0, $space); - } - - $throwTags[$exception] = true; - } - } - - if (empty($throwTags) === true) { - $error = 'Missing @throws tag in function comment'; - $phpcsFile->addError($error, $commentEnd, 'Missing'); - return; - } else if (empty($thrownExceptions) === true) { - // If token count is zero, it means that only variables are being - // thrown, so we need at least one @throws tag (checked above). - // Nothing more to do. - return; - } - - // Make sure @throws tag count matches thrown count. - $thrownCount = (count($thrownExceptions) + $unknownCount); - $tagCount = count($throwTags); - if ($thrownCount !== $tagCount) { - $error = 'Expected %s @throws tag(s) in function comment; %s found'; - $data = [ - $thrownCount, - $tagCount, - ]; - $phpcsFile->addError($error, $commentEnd, 'WrongNumber', $data); - return; - } - - foreach ($thrownExceptions as $throw) { - if (isset($throwTags[$throw]) === true) { - continue; - } - - foreach ($throwTags as $tag => $ignore) { - if (strrpos($tag, $throw) === (strlen($tag) - strlen($throw))) { - continue 2; - } - } - - $error = 'Missing @throws tag for "%s" exception'; - $data = [$throw]; - $phpcsFile->addError($error, $commentEnd, 'Missing', $data); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/InlineCommentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/InlineCommentSniff.php deleted file mode 100644 index ebec97c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/InlineCommentSniff.php +++ /dev/null @@ -1,349 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class InlineCommentSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_COMMENT, - T_DOC_COMMENT_OPEN_TAG, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void|int - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // If this is a function/class/interface doc block comment, skip it. - // We are only interested in inline doc block comments, which are - // not allowed. - if ($tokens[$stackPtr]['code'] === T_DOC_COMMENT_OPEN_TAG) { - $nextToken = $stackPtr; - do { - $nextToken = $phpcsFile->findNext(Tokens::$emptyTokens, ($nextToken + 1), null, true); - if ($tokens[$nextToken]['code'] === T_ATTRIBUTE) { - $nextToken = $tokens[$nextToken]['attribute_closer']; - continue; - } - - break; - } while (true); - - $ignore = [ - T_CLASS, - T_INTERFACE, - T_TRAIT, - T_ENUM, - T_FUNCTION, - T_CLOSURE, - T_PUBLIC, - T_PRIVATE, - T_PROTECTED, - T_FINAL, - T_STATIC, - T_ABSTRACT, - T_READONLY, - T_CONST, - T_PROPERTY, - T_INCLUDE, - T_INCLUDE_ONCE, - T_REQUIRE, - T_REQUIRE_ONCE, - ]; - - if (in_array($tokens[$nextToken]['code'], $ignore, true) === true) { - return; - } - - if ($phpcsFile->tokenizerType === 'JS') { - // We allow block comments if a function or object - // is being assigned to a variable. - $ignore = Tokens::$emptyTokens; - $ignore[] = T_EQUAL; - $ignore[] = T_STRING; - $ignore[] = T_OBJECT_OPERATOR; - $nextToken = $phpcsFile->findNext($ignore, ($nextToken + 1), null, true); - if ($tokens[$nextToken]['code'] === T_FUNCTION - || $tokens[$nextToken]['code'] === T_CLOSURE - || $tokens[$nextToken]['code'] === T_OBJECT - || $tokens[$nextToken]['code'] === T_PROTOTYPE - ) { - return; - } - } - - $prevToken = $phpcsFile->findPrevious( - Tokens::$emptyTokens, - ($stackPtr - 1), - null, - true - ); - - if ($tokens[$prevToken]['code'] === T_OPEN_TAG) { - return; - } - - if ($tokens[$stackPtr]['content'] === '/**') { - $error = 'Inline doc block comments are not allowed; use "/* Comment */" or "// Comment" instead'; - $phpcsFile->addError($error, $stackPtr, 'DocBlock'); - } - }//end if - - if ($tokens[$stackPtr]['content'][0] === '#') { - $error = 'Perl-style comments are not allowed; use "// Comment" instead'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'WrongStyle'); - if ($fix === true) { - $comment = ltrim($tokens[$stackPtr]['content'], "# \t"); - $phpcsFile->fixer->replaceToken($stackPtr, "// $comment"); - } - } - - // We don't want end of block comments. Check if the last token before the - // comment is a closing curly brace. - $previousContent = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - if ($tokens[$previousContent]['line'] === $tokens[$stackPtr]['line']) { - if ($tokens[$previousContent]['code'] === T_CLOSE_CURLY_BRACKET) { - return; - } - - // Special case for JS files. - if ($tokens[$previousContent]['code'] === T_COMMA - || $tokens[$previousContent]['code'] === T_SEMICOLON - ) { - $lastContent = $phpcsFile->findPrevious(T_WHITESPACE, ($previousContent - 1), null, true); - if ($tokens[$lastContent]['code'] === T_CLOSE_CURLY_BRACKET) { - return; - } - } - } - - // Only want inline comments. - if (substr($tokens[$stackPtr]['content'], 0, 2) !== '//') { - return; - } - - $commentTokens = [$stackPtr]; - - $nextComment = $stackPtr; - $lastComment = $stackPtr; - while (($nextComment = $phpcsFile->findNext(T_COMMENT, ($nextComment + 1), null, false)) !== false) { - if ($tokens[$nextComment]['line'] !== ($tokens[$lastComment]['line'] + 1)) { - break; - } - - // Only want inline comments. - if (substr($tokens[$nextComment]['content'], 0, 2) !== '//') { - break; - } - - // There is a comment on the very next line. If there is - // no code between the comments, they are part of the same - // comment block. - $prevNonWhitespace = $phpcsFile->findPrevious(T_WHITESPACE, ($nextComment - 1), $lastComment, true); - if ($prevNonWhitespace !== $lastComment) { - break; - } - - $commentTokens[] = $nextComment; - $lastComment = $nextComment; - }//end while - - $commentText = ''; - foreach ($commentTokens as $lastCommentToken) { - $comment = rtrim($tokens[$lastCommentToken]['content']); - - if (trim(substr($comment, 2)) === '') { - continue; - } - - $spaceCount = 0; - $tabFound = false; - - $commentLength = strlen($comment); - for ($i = 2; $i < $commentLength; $i++) { - if ($comment[$i] === "\t") { - $tabFound = true; - break; - } - - if ($comment[$i] !== ' ') { - break; - } - - $spaceCount++; - } - - $fix = false; - if ($tabFound === true) { - $error = 'Tab found before comment text; expected "// %s" but found "%s"'; - $data = [ - ltrim(substr($comment, 2)), - $comment, - ]; - $fix = $phpcsFile->addFixableError($error, $lastCommentToken, 'TabBefore', $data); - } else if ($spaceCount === 0) { - $error = 'No space found before comment text; expected "// %s" but found "%s"'; - $data = [ - substr($comment, 2), - $comment, - ]; - $fix = $phpcsFile->addFixableError($error, $lastCommentToken, 'NoSpaceBefore', $data); - } else if ($spaceCount > 1) { - $error = 'Expected 1 space before comment text but found %s; use block comment if you need indentation'; - $data = [ - $spaceCount, - substr($comment, (2 + $spaceCount)), - $comment, - ]; - $fix = $phpcsFile->addFixableError($error, $lastCommentToken, 'SpacingBefore', $data); - }//end if - - if ($fix === true) { - $newComment = '// '.ltrim($tokens[$lastCommentToken]['content'], "/\t "); - $phpcsFile->fixer->replaceToken($lastCommentToken, $newComment); - } - - $commentText .= trim(substr($tokens[$lastCommentToken]['content'], 2)); - }//end foreach - - if ($commentText === '') { - $error = 'Blank comments are not allowed'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Empty'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, ''); - } - - return ($lastCommentToken + 1); - } - - if (preg_match('/^\p{Ll}/u', $commentText) === 1) { - $error = 'Inline comments must start with a capital letter'; - $phpcsFile->addError($error, $stackPtr, 'NotCapital'); - } - - // Only check the end of comment character if the start of the comment - // is a letter, indicating that the comment is just standard text. - if (preg_match('/^\p{L}/u', $commentText) === 1) { - $commentCloser = $commentText[(strlen($commentText) - 1)]; - $acceptedClosers = [ - 'full-stops' => '.', - 'exclamation marks' => '!', - 'or question marks' => '?', - ]; - - if (in_array($commentCloser, $acceptedClosers, true) === false) { - $error = 'Inline comments must end in %s'; - $ender = ''; - foreach ($acceptedClosers as $closerName => $symbol) { - $ender .= ' '.$closerName.','; - } - - $ender = trim($ender, ' ,'); - $data = [$ender]; - $phpcsFile->addError($error, $lastCommentToken, 'InvalidEndChar', $data); - } - } - - // Finally, the line below the last comment cannot be empty if this inline - // comment is on a line by itself. - if ($tokens[$previousContent]['line'] < $tokens[$stackPtr]['line']) { - $next = $phpcsFile->findNext(T_WHITESPACE, ($lastCommentToken + 1), null, true); - if ($next === false) { - // Ignore if the comment is the last non-whitespace token in a file. - return ($lastCommentToken + 1); - } - - if ($tokens[$next]['code'] === T_DOC_COMMENT_OPEN_TAG) { - // If this inline comment is followed by a docblock, - // ignore spacing as docblock/function etc spacing rules - // are likely to conflict with our rules. - return ($lastCommentToken + 1); - } - - $errorCode = 'SpacingAfter'; - - if (isset($tokens[$stackPtr]['conditions']) === true) { - $conditions = $tokens[$stackPtr]['conditions']; - $type = end($conditions); - $conditionPtr = key($conditions); - - if (($type === T_FUNCTION || $type === T_CLOSURE) - && $tokens[$conditionPtr]['scope_closer'] === $next - ) { - $errorCode = 'SpacingAfterAtFunctionEnd'; - } - } - - for ($i = ($lastCommentToken + 1); $i < $phpcsFile->numTokens; $i++) { - if ($tokens[$i]['line'] === ($tokens[$lastCommentToken]['line'] + 1)) { - if ($tokens[$i]['code'] !== T_WHITESPACE) { - return ($lastCommentToken + 1); - } - } else if ($tokens[$i]['line'] > ($tokens[$lastCommentToken]['line'] + 1)) { - break; - } - } - - $error = 'There must be no blank line following an inline comment'; - $fix = $phpcsFile->addFixableError($error, $lastCommentToken, $errorCode); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($lastCommentToken + 1); $i < $next; $i++) { - if ($tokens[$i]['line'] === $tokens[$next]['line']) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - }//end if - - return ($lastCommentToken + 1); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/LongConditionClosingCommentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/LongConditionClosingCommentSniff.php deleted file mode 100644 index 78a04b2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/LongConditionClosingCommentSniff.php +++ /dev/null @@ -1,218 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class LongConditionClosingCommentSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - /** - * The openers that we are interested in. - * - * @var array - */ - private static $openers = [ - T_SWITCH, - T_IF, - T_FOR, - T_FOREACH, - T_WHILE, - T_TRY, - T_CASE, - T_MATCH, - ]; - - /** - * The length that a code block must be before - * requiring a closing comment. - * - * @var integer - */ - public $lineLimit = 20; - - /** - * The format the end comment should be in. - * - * The placeholder %s will be replaced with the type of condition opener. - * - * @var string - */ - public $commentFormat = '//end %s'; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_CLOSE_CURLY_BRACKET]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['scope_condition']) === false) { - // No scope condition. It is a function closer. - return; - } - - $startCondition = $tokens[$tokens[$stackPtr]['scope_condition']]; - $startBrace = $tokens[$tokens[$stackPtr]['scope_opener']]; - $endBrace = $tokens[$stackPtr]; - - // We are only interested in some code blocks. - if (in_array($startCondition['code'], self::$openers, true) === false) { - return; - } - - if ($startCondition['code'] === T_IF) { - // If this is actually an ELSE IF, skip it as the brace - // will be checked by the original IF. - $else = $phpcsFile->findPrevious(T_WHITESPACE, ($tokens[$stackPtr]['scope_condition'] - 1), null, true); - if ($tokens[$else]['code'] === T_ELSE) { - return; - } - - // IF statements that have an ELSE block need to use - // "end if" rather than "end else" or "end elseif". - do { - $nextToken = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($tokens[$nextToken]['code'] === T_ELSE || $tokens[$nextToken]['code'] === T_ELSEIF) { - // Check for ELSE IF (2 tokens) as opposed to ELSEIF (1 token). - if ($tokens[$nextToken]['code'] === T_ELSE - && isset($tokens[$nextToken]['scope_closer']) === false - ) { - $nextToken = $phpcsFile->findNext(T_WHITESPACE, ($nextToken + 1), null, true); - if ($tokens[$nextToken]['code'] !== T_IF - || isset($tokens[$nextToken]['scope_closer']) === false - ) { - // Not an ELSE IF or is an inline ELSE IF. - break; - } - } - - if (isset($tokens[$nextToken]['scope_closer']) === false) { - // There isn't going to be anywhere to print the "end if" comment - // because there is no closer. - return; - } - - // The end brace becomes the ELSE's end brace. - $stackPtr = $tokens[$nextToken]['scope_closer']; - $endBrace = $tokens[$stackPtr]; - } else { - break; - }//end if - } while (isset($tokens[$nextToken]['scope_closer']) === true); - }//end if - - if ($startCondition['code'] === T_TRY) { - // TRY statements need to check until the end of all CATCH statements. - do { - $nextToken = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($tokens[$nextToken]['code'] === T_CATCH - || $tokens[$nextToken]['code'] === T_FINALLY - ) { - // The end brace becomes the CATCH end brace. - $stackPtr = $tokens[$nextToken]['scope_closer']; - $endBrace = $tokens[$stackPtr]; - } else { - break; - } - } while (isset($tokens[$nextToken]['scope_closer']) === true); - } - - if ($startCondition['code'] === T_MATCH) { - // Move the stackPtr to after the semicolon/comma if there is one. - $nextToken = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($nextToken !== false - && ($tokens[$nextToken]['code'] === T_SEMICOLON - || $tokens[$nextToken]['code'] === T_COMMA) - ) { - $stackPtr = $nextToken; - } - } - - $lineDifference = ($endBrace['line'] - $startBrace['line']); - - $expected = sprintf($this->commentFormat, $startCondition['content']); - $comment = $phpcsFile->findNext([T_COMMENT], $stackPtr, null, false); - - if (($comment === false) || ($tokens[$comment]['line'] !== $endBrace['line'])) { - if ($lineDifference >= $this->lineLimit) { - $error = 'End comment for long condition not found; expected "%s"'; - $data = [$expected]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Missing', $data); - - if ($fix === true) { - $next = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($next !== false && $tokens[$next]['line'] === $tokens[$stackPtr]['line']) { - $expected .= $phpcsFile->eolChar; - } - - $phpcsFile->fixer->addContent($stackPtr, $expected); - } - } - - return; - } - - if (($comment - $stackPtr) !== 1) { - $error = 'Space found before closing comment; expected "%s"'; - $data = [$expected]; - $phpcsFile->addError($error, $stackPtr, 'SpacingBefore', $data); - } - - if (trim($tokens[$comment]['content']) !== $expected) { - $found = trim($tokens[$comment]['content']); - $error = 'Incorrect closing comment; expected "%s" but found "%s"'; - $data = [ - $expected, - $found, - ]; - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Invalid', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($comment, $expected.$phpcsFile->eolChar); - } - - return; - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/PostStatementCommentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/PostStatementCommentSniff.php deleted file mode 100644 index 3771376..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/PostStatementCommentSniff.php +++ /dev/null @@ -1,129 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class PostStatementCommentSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - /** - * Exceptions to the rule. - * - * If post statement comments are found within the condition - * parenthesis of these structures, leave them alone. - * - * @var array - */ - private $controlStructureExceptions = [ - T_IF => true, - T_ELSEIF => true, - T_SWITCH => true, - T_WHILE => true, - T_FOR => true, - T_FOREACH => true, - T_MATCH => true, - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_COMMENT]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (substr($tokens[$stackPtr]['content'], 0, 2) !== '//') { - return; - } - - $commentLine = $tokens[$stackPtr]['line']; - $lastContent = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - - if ($lastContent === false - || $tokens[$lastContent]['line'] !== $commentLine - || $tokens[$stackPtr]['column'] === 1 - ) { - return; - } - - if ($tokens[$lastContent]['code'] === T_CLOSE_CURLY_BRACKET) { - return; - } - - // Special case for JS files and PHP closures. - if ($tokens[$lastContent]['code'] === T_COMMA - || $tokens[$lastContent]['code'] === T_SEMICOLON - ) { - $lastContent = $phpcsFile->findPrevious(T_WHITESPACE, ($lastContent - 1), null, true); - if ($lastContent === false || $tokens[$lastContent]['code'] === T_CLOSE_CURLY_BRACKET) { - return; - } - } - - // Special case for (trailing) comments within multi-line control structures. - if (isset($tokens[$stackPtr]['nested_parenthesis']) === true) { - $nestedParens = $tokens[$stackPtr]['nested_parenthesis']; - foreach ($nestedParens as $open => $close) { - if (isset($tokens[$open]['parenthesis_owner']) === true - && isset($this->controlStructureExceptions[$tokens[$tokens[$open]['parenthesis_owner']]['code']]) === true - ) { - return; - } - } - } - - if ($phpcsFile->tokenizerType === 'PHP' - && preg_match('|^//[ \t]*@[^\s]+|', $tokens[$stackPtr]['content']) === 1 - ) { - $error = 'Annotations may not appear after statements'; - $phpcsFile->addError($error, $stackPtr, 'AnnotationFound'); - return; - } - - $error = 'Comments may not appear after statements'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Found'); - if ($fix === true) { - $phpcsFile->fixer->addNewlineBefore($stackPtr); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/VariableCommentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/VariableCommentSniff.php deleted file mode 100644 index 214e064..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Commenting/VariableCommentSniff.php +++ /dev/null @@ -1,203 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\AbstractVariableSniff; -use PHP_CodeSniffer\Util\Common; -use PHP_CodeSniffer\Util\Tokens; - -class VariableCommentSniff extends AbstractVariableSniff -{ - - - /** - * Called to process class member vars. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function processMemberVar(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $ignore = Tokens::$scopeModifiers; - $ignore += [ - T_VAR => T_VAR, - T_STATIC => T_STATIC, - T_READONLY => T_READONLY, - T_FINAL => T_FINAL, - T_ABSTRACT => T_ABSTRACT, - T_WHITESPACE => T_WHITESPACE, - T_STRING => T_STRING, - T_NS_SEPARATOR => T_NS_SEPARATOR, - T_NAMESPACE => T_NAMESPACE, - T_NULLABLE => T_NULLABLE, - T_TYPE_UNION => T_TYPE_UNION, - T_TYPE_INTERSECTION => T_TYPE_INTERSECTION, - T_TYPE_OPEN_PARENTHESIS => T_TYPE_OPEN_PARENTHESIS, - T_TYPE_CLOSE_PARENTHESIS => T_TYPE_CLOSE_PARENTHESIS, - T_NULL => T_NULL, - T_TRUE => T_TRUE, - T_FALSE => T_FALSE, - T_SELF => T_SELF, - T_PARENT => T_PARENT, - ]; - - for ($commentEnd = ($stackPtr - 1); $commentEnd >= 0; $commentEnd--) { - if (isset($ignore[$tokens[$commentEnd]['code']]) === true) { - continue; - } - - if ($tokens[$commentEnd]['code'] === T_ATTRIBUTE_END - && isset($tokens[$commentEnd]['attribute_opener']) === true - ) { - $commentEnd = $tokens[$commentEnd]['attribute_opener']; - continue; - } - - break; - } - - if ($tokens[$commentEnd]['code'] !== T_DOC_COMMENT_CLOSE_TAG - && $tokens[$commentEnd]['code'] !== T_COMMENT - ) { - $phpcsFile->addError('Missing member variable doc comment', $stackPtr, 'Missing'); - return; - } - - if ($tokens[$commentEnd]['code'] === T_COMMENT) { - $phpcsFile->addError('You must use "/**" style comments for a member variable comment', $stackPtr, 'WrongStyle'); - return; - } - - $commentStart = $tokens[$commentEnd]['comment_opener']; - - $foundVar = null; - foreach ($tokens[$commentStart]['comment_tags'] as $tag) { - if ($tokens[$tag]['content'] === '@var') { - if ($foundVar !== null) { - $error = 'Only one @var tag is allowed in a member variable comment'; - $phpcsFile->addError($error, $tag, 'DuplicateVar'); - } else { - $foundVar = $tag; - } - } else if ($tokens[$tag]['content'] === '@see') { - // Make sure the tag isn't empty. - $string = $phpcsFile->findNext(T_DOC_COMMENT_STRING, $tag, $commentEnd); - if ($string === false || $tokens[$string]['line'] !== $tokens[$tag]['line']) { - $error = 'Content missing for @see tag in member variable comment'; - $phpcsFile->addError($error, $tag, 'EmptySees'); - } - } else { - $error = '%s tag is not allowed in member variable comment'; - $data = [$tokens[$tag]['content']]; - $phpcsFile->addWarning($error, $tag, 'TagNotAllowed', $data); - }//end if - }//end foreach - - // The @var tag is the only one we require. - if ($foundVar === null) { - $error = 'Missing @var tag in member variable comment'; - $phpcsFile->addError($error, $commentEnd, 'MissingVar'); - return; - } - - $firstTag = $tokens[$commentStart]['comment_tags'][0]; - if ($foundVar !== null && $tokens[$firstTag]['content'] !== '@var') { - $error = 'The @var tag must be the first tag in a member variable comment'; - $phpcsFile->addError($error, $foundVar, 'VarOrder'); - } - - // Make sure the tag isn't empty and has the correct padding. - $string = $phpcsFile->findNext(T_DOC_COMMENT_STRING, $foundVar, $commentEnd); - if ($string === false || $tokens[$string]['line'] !== $tokens[$foundVar]['line']) { - $error = 'Content missing for @var tag in member variable comment'; - $phpcsFile->addError($error, $foundVar, 'EmptyVar'); - return; - } - - // Support both a var type and a description. - preg_match('`^((?:\|?(?:array\([^\)]*\)|[\\\\a-z0-9\[\]]+))*)( .*)?`i', $tokens[($foundVar + 2)]['content'], $varParts); - if (isset($varParts[1]) === false) { - return; - } - - $varType = $varParts[1]; - - // Check var type (can be multiple, separated by '|'). - $typeNames = explode('|', $varType); - $suggestedNames = []; - foreach ($typeNames as $typeName) { - $suggestedName = Common::suggestType($typeName); - if (in_array($suggestedName, $suggestedNames, true) === false) { - $suggestedNames[] = $suggestedName; - } - } - - $suggestedType = implode('|', $suggestedNames); - if ($varType !== $suggestedType) { - $error = 'Expected "%s" but found "%s" for @var tag in member variable comment'; - $data = [ - $suggestedType, - $varType, - ]; - $fix = $phpcsFile->addFixableError($error, $foundVar, 'IncorrectVarType', $data); - if ($fix === true) { - $replacement = $suggestedType; - if (empty($varParts[2]) === false) { - $replacement .= $varParts[2]; - } - - $phpcsFile->fixer->replaceToken(($foundVar + 2), $replacement); - unset($replacement); - } - } - - }//end processMemberVar() - - - /** - * Called to process a normal variable. - * - * Not required for this sniff. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where this token was found. - * @param int $stackPtr The position where the double quoted - * string was found. - * - * @return void - */ - protected function processVariable(File $phpcsFile, $stackPtr) - { - - }//end processVariable() - - - /** - * Called to process variables found in double quoted strings. - * - * Not required for this sniff. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The PHP_CodeSniffer file where this token was found. - * @param int $stackPtr The position where the double quoted - * string was found. - * - * @return void - */ - protected function processVariableInString(File $phpcsFile, $stackPtr) - { - - }//end processVariableInString() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/ControlSignatureSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/ControlSignatureSniff.php deleted file mode 100644 index 4e1a2bb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/ControlSignatureSniff.php +++ /dev/null @@ -1,337 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\ControlStructures; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ControlSignatureSniff implements Sniff -{ - - /** - * How many spaces should precede the colon if using alternative syntax. - * - * @var integer - */ - public $requiredSpacesBeforeColon = 1; - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_TRY, - T_CATCH, - T_FINALLY, - T_DO, - T_WHILE, - T_FOR, - T_IF, - T_FOREACH, - T_ELSE, - T_ELSEIF, - T_SWITCH, - T_MATCH, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($nextNonEmpty === false) { - return; - } - - $isAlternative = false; - if (isset($tokens[$stackPtr]['scope_opener']) === true - && $tokens[$tokens[$stackPtr]['scope_opener']]['code'] === T_COLON - ) { - $isAlternative = true; - } - - // Single space after the keyword. - $expected = 1; - if (isset($tokens[$stackPtr]['parenthesis_closer']) === false && $isAlternative === true) { - // Catching cases like: - // if (condition) : ... else: ... endif - // where there is no condition. - $expected = (int) $this->requiredSpacesBeforeColon; - } - - $found = 1; - if ($tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) { - $found = 0; - } else if ($tokens[($stackPtr + 1)]['content'] !== ' ') { - if (strpos($tokens[($stackPtr + 1)]['content'], $phpcsFile->eolChar) !== false) { - $found = 'newline'; - } else { - $found = $tokens[($stackPtr + 1)]['length']; - } - } - - if ($found !== $expected) { - $pluralizeSpace = 's'; - if ($expected === 1) { - $pluralizeSpace = ''; - } - - $error = 'Expected %s space%s after %s keyword; %s found'; - $data = [ - $expected, - $pluralizeSpace, - strtoupper($tokens[$stackPtr]['content']), - $found, - ]; - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceAfterKeyword', $data); - if ($fix === true) { - if ($found === 0) { - $phpcsFile->fixer->addContent($stackPtr, str_repeat(' ', $expected)); - } else { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), str_repeat(' ', $expected)); - } - } - }//end if - - // Single space after closing parenthesis. - if (isset($tokens[$stackPtr]['parenthesis_closer']) === true - && isset($tokens[$stackPtr]['scope_opener']) === true - ) { - $expected = 1; - if ($isAlternative === true) { - $expected = (int) $this->requiredSpacesBeforeColon; - } - - $closer = $tokens[$stackPtr]['parenthesis_closer']; - $opener = $tokens[$stackPtr]['scope_opener']; - $content = $phpcsFile->getTokensAsString(($closer + 1), ($opener - $closer - 1)); - - if (trim($content) === '') { - if (strpos($content, $phpcsFile->eolChar) !== false) { - $found = 'newline'; - } else { - $found = strlen($content); - } - } else { - $found = '"'.str_replace($phpcsFile->eolChar, '\n', $content).'"'; - } - - if ($found !== $expected) { - $pluralizeSpace = 's'; - if ($expected === 1) { - $pluralizeSpace = ''; - } - - $error = 'Expected %s space%s after closing parenthesis; found %s'; - $data = [ - $expected, - $pluralizeSpace, - $found, - ]; - - $fix = $phpcsFile->addFixableError($error, $closer, 'SpaceAfterCloseParenthesis', $data); - if ($fix === true) { - $padding = str_repeat(' ', $expected); - if ($closer === ($opener - 1)) { - $phpcsFile->fixer->addContent($closer, $padding); - } else { - $phpcsFile->fixer->beginChangeset(); - if (trim($content) === '') { - $phpcsFile->fixer->addContent($closer, $padding); - if ($found !== 0) { - for ($i = ($closer + 1); $i < $opener; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - } - } else { - $phpcsFile->fixer->addContent($closer, $padding.$tokens[$opener]['content']); - $phpcsFile->fixer->replaceToken($opener, ''); - - if ($tokens[$opener]['line'] !== $tokens[$closer]['line']) { - $next = $phpcsFile->findNext(T_WHITESPACE, ($opener + 1), null, true); - if ($tokens[$next]['line'] !== $tokens[$opener]['line']) { - for ($i = ($opener + 1); $i < $next; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - } - } - } - - $phpcsFile->fixer->endChangeset(); - }//end if - }//end if - }//end if - }//end if - - // Single newline after opening brace. - if (isset($tokens[$stackPtr]['scope_opener']) === true) { - $opener = $tokens[$stackPtr]['scope_opener']; - for ($next = ($opener + 1); $next < $phpcsFile->numTokens; $next++) { - $code = $tokens[$next]['code']; - - if ($code === T_WHITESPACE - || ($code === T_INLINE_HTML - && trim($tokens[$next]['content']) === '') - ) { - continue; - } - - // Skip all empty tokens on the same line as the opener. - if ($tokens[$next]['line'] === $tokens[$opener]['line'] - && (isset(Tokens::$emptyTokens[$code]) === true - || $code === T_CLOSE_TAG) - ) { - continue; - } - - // We found the first bit of a code, or a comment on the - // following line. - break; - }//end for - - if ($tokens[$next]['line'] === $tokens[$opener]['line']) { - $error = 'Newline required after opening brace'; - $fix = $phpcsFile->addFixableError($error, $opener, 'NewlineAfterOpenBrace'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($opener + 1); $i < $next; $i++) { - if (trim($tokens[$i]['content']) !== '') { - break; - } - - // Remove whitespace. - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->addContent($opener, $phpcsFile->eolChar); - $phpcsFile->fixer->endChangeset(); - } - }//end if - } else if ($tokens[$stackPtr]['code'] === T_WHILE) { - // Zero spaces after parenthesis closer, but only if followed by a semicolon. - $closer = $tokens[$stackPtr]['parenthesis_closer']; - $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($closer + 1), null, true); - if ($nextNonEmpty !== false && $tokens[$nextNonEmpty]['code'] === T_SEMICOLON) { - $found = 0; - if ($tokens[($closer + 1)]['code'] === T_WHITESPACE) { - if (strpos($tokens[($closer + 1)]['content'], $phpcsFile->eolChar) !== false) { - $found = 'newline'; - } else { - $found = $tokens[($closer + 1)]['length']; - } - } - - if ($found !== 0) { - $error = 'Expected 0 spaces before semicolon; %s found'; - $data = [$found]; - $fix = $phpcsFile->addFixableError($error, $closer, 'SpaceBeforeSemicolon', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($closer + 1), ''); - } - } - } - }//end if - - // Only want to check multi-keyword structures from here on. - if ($tokens[$stackPtr]['code'] === T_WHILE) { - if (isset($tokens[$stackPtr]['scope_closer']) !== false) { - return; - } - - $closer = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($closer === false - || $tokens[$closer]['code'] !== T_CLOSE_CURLY_BRACKET - || $tokens[$tokens[$closer]['scope_condition']]['code'] !== T_DO - ) { - return; - } - } else if ($tokens[$stackPtr]['code'] === T_ELSE - || $tokens[$stackPtr]['code'] === T_ELSEIF - || $tokens[$stackPtr]['code'] === T_CATCH - || $tokens[$stackPtr]['code'] === T_FINALLY - ) { - if (isset($tokens[$stackPtr]['scope_opener']) === true - && $tokens[$tokens[$stackPtr]['scope_opener']]['code'] === T_COLON - ) { - // Special case for alternate syntax, where this token is actually - // the closer for the previous block, so there is no spacing to check. - return; - } - - $closer = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($closer === false || $tokens[$closer]['code'] !== T_CLOSE_CURLY_BRACKET) { - return; - } - } else { - return; - }//end if - - // Single space after closing brace. - $found = 1; - if ($tokens[($closer + 1)]['code'] !== T_WHITESPACE) { - $found = 0; - } else if ($tokens[$closer]['line'] !== $tokens[$stackPtr]['line']) { - $found = 'newline'; - } else if ($tokens[($closer + 1)]['content'] !== ' ') { - $found = $tokens[($closer + 1)]['length']; - } - - if ($found !== 1) { - $error = 'Expected 1 space after closing brace; %s found'; - $data = [$found]; - - if ($phpcsFile->findNext(Tokens::$commentTokens, ($closer + 1), $stackPtr) !== false) { - // Comment found between closing brace and keyword, don't auto-fix. - $phpcsFile->addError($error, $closer, 'SpaceAfterCloseBrace', $data); - return; - } - - $fix = $phpcsFile->addFixableError($error, $closer, 'SpaceAfterCloseBrace', $data); - if ($fix === true) { - if ($found === 0) { - $phpcsFile->fixer->addContent($closer, ' '); - } else { - $phpcsFile->fixer->replaceToken(($closer + 1), ' '); - } - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/ElseIfDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/ElseIfDeclarationSniff.php deleted file mode 100644 index 1c87f89..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/ElseIfDeclarationSniff.php +++ /dev/null @@ -1,51 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\ControlStructures; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ElseIfDeclarationSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_ELSEIF]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $error = 'Usage of ELSEIF not allowed; use ELSE IF instead'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NotAllowed'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, 'else if'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/ForEachLoopDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/ForEachLoopDeclarationSniff.php deleted file mode 100644 index cf9ea92..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/ForEachLoopDeclarationSniff.php +++ /dev/null @@ -1,236 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\ControlStructures; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ForEachLoopDeclarationSniff implements Sniff -{ - - /** - * How many spaces should follow the opening bracket. - * - * @var integer - */ - public $requiredSpacesAfterOpen = 0; - - /** - * How many spaces should precede the closing bracket. - * - * @var integer - */ - public $requiredSpacesBeforeClose = 0; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_FOREACH]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $this->requiredSpacesAfterOpen = (int) $this->requiredSpacesAfterOpen; - $this->requiredSpacesBeforeClose = (int) $this->requiredSpacesBeforeClose; - $tokens = $phpcsFile->getTokens(); - - $openingBracket = $phpcsFile->findNext(T_OPEN_PARENTHESIS, $stackPtr); - if ($openingBracket === false) { - $error = 'Possible parse error: FOREACH has no opening parenthesis'; - $phpcsFile->addWarning($error, $stackPtr, 'MissingOpenParenthesis'); - return; - } - - if (isset($tokens[$openingBracket]['parenthesis_closer']) === false) { - $error = 'Possible parse error: FOREACH has no closing parenthesis'; - $phpcsFile->addWarning($error, $stackPtr, 'MissingCloseParenthesis'); - return; - } - - $closingBracket = $tokens[$openingBracket]['parenthesis_closer']; - - if ($this->requiredSpacesAfterOpen === 0 && $tokens[($openingBracket + 1)]['code'] === T_WHITESPACE) { - $error = 'Space found after opening bracket of FOREACH loop'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceAfterOpen'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($openingBracket + 1), ''); - } - } else if ($this->requiredSpacesAfterOpen > 0) { - $spaceAfterOpen = 0; - if ($tokens[($openingBracket + 1)]['code'] === T_WHITESPACE) { - $spaceAfterOpen = $tokens[($openingBracket + 1)]['length']; - } - - if ($spaceAfterOpen !== $this->requiredSpacesAfterOpen) { - $error = 'Expected %s spaces after opening bracket; %s found'; - $data = [ - $this->requiredSpacesAfterOpen, - $spaceAfterOpen, - ]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceAfterOpen', $data); - if ($fix === true) { - $padding = str_repeat(' ', $this->requiredSpacesAfterOpen); - if ($spaceAfterOpen === 0) { - $phpcsFile->fixer->addContent($openingBracket, $padding); - } else { - $phpcsFile->fixer->replaceToken(($openingBracket + 1), $padding); - } - } - } - }//end if - - if ($this->requiredSpacesBeforeClose === 0 && $tokens[($closingBracket - 1)]['code'] === T_WHITESPACE) { - $error = 'Space found before closing bracket of FOREACH loop'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceBeforeClose'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($closingBracket - 1), ''); - } - } else if ($this->requiredSpacesBeforeClose > 0) { - $spaceBeforeClose = 0; - if ($tokens[($closingBracket - 1)]['code'] === T_WHITESPACE) { - $spaceBeforeClose = $tokens[($closingBracket - 1)]['length']; - } - - if ($spaceBeforeClose !== $this->requiredSpacesBeforeClose) { - $error = 'Expected %s spaces before closing bracket; %s found'; - $data = [ - $this->requiredSpacesBeforeClose, - $spaceBeforeClose, - ]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceBeforeClose', $data); - if ($fix === true) { - $padding = str_repeat(' ', $this->requiredSpacesBeforeClose); - if ($spaceBeforeClose === 0) { - $phpcsFile->fixer->addContentBefore($closingBracket, $padding); - } else { - $phpcsFile->fixer->replaceToken(($closingBracket - 1), $padding); - } - } - } - }//end if - - $asToken = $phpcsFile->findNext(T_AS, $openingBracket); - if ($asToken === false) { - $error = 'Possible parse error: FOREACH has no AS statement'; - $phpcsFile->addWarning($error, $stackPtr, 'MissingAs'); - return; - } - - $content = $tokens[$asToken]['content']; - if ($content !== strtolower($content)) { - $expected = strtolower($content); - $error = 'AS keyword must be lowercase; expected "%s" but found "%s"'; - $data = [ - $expected, - $content, - ]; - - $fix = $phpcsFile->addFixableError($error, $asToken, 'AsNotLower', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($asToken, $expected); - } - } - - $doubleArrow = $phpcsFile->findNext(T_DOUBLE_ARROW, $asToken, $closingBracket); - - if ($doubleArrow !== false) { - if ($tokens[($doubleArrow - 1)]['code'] !== T_WHITESPACE) { - $error = 'Expected 1 space before "=>"; 0 found'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoSpaceBeforeArrow'); - if ($fix === true) { - $phpcsFile->fixer->addContentBefore($doubleArrow, ' '); - } - } else { - if ($tokens[($doubleArrow - 1)]['length'] !== 1) { - $spaces = $tokens[($doubleArrow - 1)]['length']; - $error = 'Expected 1 space before "=>"; %s found'; - $data = [$spaces]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpacingBeforeArrow', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($doubleArrow - 1), ' '); - } - } - } - - if ($tokens[($doubleArrow + 1)]['code'] !== T_WHITESPACE) { - $error = 'Expected 1 space after "=>"; 0 found'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoSpaceAfterArrow'); - if ($fix === true) { - $phpcsFile->fixer->addContent($doubleArrow, ' '); - } - } else { - if ($tokens[($doubleArrow + 1)]['length'] !== 1) { - $spaces = $tokens[($doubleArrow + 1)]['length']; - $error = 'Expected 1 space after "=>"; %s found'; - $data = [$spaces]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpacingAfterArrow', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($doubleArrow + 1), ' '); - } - } - } - }//end if - - if ($tokens[($asToken - 1)]['code'] !== T_WHITESPACE) { - $error = 'Expected 1 space before "as"; 0 found'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoSpaceBeforeAs'); - if ($fix === true) { - $phpcsFile->fixer->addContentBefore($asToken, ' '); - } - } else { - if ($tokens[($asToken - 1)]['length'] !== 1) { - $spaces = $tokens[($asToken - 1)]['length']; - $error = 'Expected 1 space before "as"; %s found'; - $data = [$spaces]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpacingBeforeAs', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($asToken - 1), ' '); - } - } - } - - if ($tokens[($asToken + 1)]['code'] !== T_WHITESPACE) { - $error = 'Expected 1 space after "as"; 0 found'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoSpaceAfterAs'); - if ($fix === true) { - $phpcsFile->fixer->addContent($asToken, ' '); - } - } else { - if ($tokens[($asToken + 1)]['length'] !== 1) { - $spaces = $tokens[($asToken + 1)]['length']; - $error = 'Expected 1 space after "as"; %s found'; - $data = [$spaces]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpacingAfterAs', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($asToken + 1), ' '); - } - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/ForLoopDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/ForLoopDeclarationSniff.php deleted file mode 100644 index bbf6f1b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/ForLoopDeclarationSniff.php +++ /dev/null @@ -1,316 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\ControlStructures; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ForLoopDeclarationSniff implements Sniff -{ - - /** - * How many spaces should follow the opening bracket. - * - * @var integer - */ - public $requiredSpacesAfterOpen = 0; - - /** - * How many spaces should precede the closing bracket. - * - * @var integer - */ - public $requiredSpacesBeforeClose = 0; - - /** - * Allow newlines instead of spaces. - * - * @var boolean - */ - public $ignoreNewlines = false; - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_FOR]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $this->requiredSpacesAfterOpen = (int) $this->requiredSpacesAfterOpen; - $this->requiredSpacesBeforeClose = (int) $this->requiredSpacesBeforeClose; - $tokens = $phpcsFile->getTokens(); - - $openingBracket = $phpcsFile->findNext(T_OPEN_PARENTHESIS, $stackPtr); - if ($openingBracket === false || isset($tokens[$openingBracket]['parenthesis_closer']) === false) { - $error = 'Possible parse error: no opening/closing parenthesis for FOR keyword'; - $phpcsFile->addWarning($error, $stackPtr, 'NoOpenBracket'); - return; - } - - $closingBracket = $tokens[$openingBracket]['parenthesis_closer']; - - if ($this->requiredSpacesAfterOpen === 0 - && $tokens[($openingBracket + 1)]['code'] === T_WHITESPACE - ) { - $nextNonWhiteSpace = $phpcsFile->findNext(T_WHITESPACE, ($openingBracket + 1), $closingBracket, true); - if ($this->ignoreNewlines === false - || $tokens[$nextNonWhiteSpace]['line'] === $tokens[$openingBracket]['line'] - ) { - $error = 'Whitespace found after opening bracket of FOR loop'; - $fix = $phpcsFile->addFixableError($error, $openingBracket, 'SpacingAfterOpen'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($openingBracket + 1); $i < $closingBracket; $i++) { - if ($tokens[$i]['code'] !== T_WHITESPACE) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - } else if ($this->requiredSpacesAfterOpen > 0) { - $nextNonWhiteSpace = $phpcsFile->findNext(T_WHITESPACE, ($openingBracket + 1), $closingBracket, true); - $spaceAfterOpen = 0; - if ($tokens[$openingBracket]['line'] !== $tokens[$nextNonWhiteSpace]['line']) { - $spaceAfterOpen = 'newline'; - } else if ($tokens[($openingBracket + 1)]['code'] === T_WHITESPACE) { - $spaceAfterOpen = $tokens[($openingBracket + 1)]['length']; - } - - if ($spaceAfterOpen !== $this->requiredSpacesAfterOpen - && ($this->ignoreNewlines === false - || $spaceAfterOpen !== 'newline') - ) { - $error = 'Expected %s spaces after opening bracket; %s found'; - $data = [ - $this->requiredSpacesAfterOpen, - $spaceAfterOpen, - ]; - $fix = $phpcsFile->addFixableError($error, $openingBracket, 'SpacingAfterOpen', $data); - if ($fix === true) { - $padding = str_repeat(' ', $this->requiredSpacesAfterOpen); - if ($spaceAfterOpen === 0) { - $phpcsFile->fixer->addContent($openingBracket, $padding); - } else { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken(($openingBracket + 1), $padding); - for ($i = ($openingBracket + 2); $i < $nextNonWhiteSpace; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - }//end if - }//end if - - $prevNonWhiteSpace = $phpcsFile->findPrevious(T_WHITESPACE, ($closingBracket - 1), $openingBracket, true); - $beforeClosefixable = true; - if ($tokens[$prevNonWhiteSpace]['line'] !== $tokens[$closingBracket]['line'] - && isset(Tokens::$emptyTokens[$tokens[$prevNonWhiteSpace]['code']]) === true - ) { - $beforeClosefixable = false; - } - - if ($this->requiredSpacesBeforeClose === 0 - && $tokens[($closingBracket - 1)]['code'] === T_WHITESPACE - && ($this->ignoreNewlines === false - || $tokens[$prevNonWhiteSpace]['line'] === $tokens[$closingBracket]['line']) - ) { - $error = 'Whitespace found before closing bracket of FOR loop'; - - if ($beforeClosefixable === false) { - $phpcsFile->addError($error, $closingBracket, 'SpacingBeforeClose'); - } else { - $fix = $phpcsFile->addFixableError($error, $closingBracket, 'SpacingBeforeClose'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($closingBracket - 1); $i > $openingBracket; $i--) { - if ($tokens[$i]['code'] !== T_WHITESPACE) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - } else if ($this->requiredSpacesBeforeClose > 0) { - $spaceBeforeClose = 0; - if ($tokens[$closingBracket]['line'] !== $tokens[$prevNonWhiteSpace]['line']) { - $spaceBeforeClose = 'newline'; - } else if ($tokens[($closingBracket - 1)]['code'] === T_WHITESPACE) { - $spaceBeforeClose = $tokens[($closingBracket - 1)]['length']; - } - - if ($this->requiredSpacesBeforeClose !== $spaceBeforeClose - && ($this->ignoreNewlines === false - || $spaceBeforeClose !== 'newline') - ) { - $error = 'Expected %s spaces before closing bracket; %s found'; - $data = [ - $this->requiredSpacesBeforeClose, - $spaceBeforeClose, - ]; - - if ($beforeClosefixable === false) { - $phpcsFile->addError($error, $closingBracket, 'SpacingBeforeClose', $data); - } else { - $fix = $phpcsFile->addFixableError($error, $closingBracket, 'SpacingBeforeClose', $data); - if ($fix === true) { - $padding = str_repeat(' ', $this->requiredSpacesBeforeClose); - if ($spaceBeforeClose === 0) { - $phpcsFile->fixer->addContentBefore($closingBracket, $padding); - } else { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken(($closingBracket - 1), $padding); - for ($i = ($closingBracket - 2); $i > $prevNonWhiteSpace; $i--) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - } - }//end if - }//end if - - /* - * Check whitespace around each of the semicolon tokens. - */ - - $semicolonCount = 0; - $semicolon = $openingBracket; - $targetNestinglevel = 0; - if (isset($tokens[$openingBracket]['conditions']) === true) { - $targetNestinglevel = count($tokens[$openingBracket]['conditions']); - } - - do { - $semicolon = $phpcsFile->findNext(T_SEMICOLON, ($semicolon + 1), $closingBracket); - if ($semicolon === false) { - break; - } - - if (isset($tokens[$semicolon]['conditions']) === true - && count($tokens[$semicolon]['conditions']) > $targetNestinglevel - ) { - // Semicolon doesn't belong to the for(). - continue; - } - - ++$semicolonCount; - - $humanReadableCount = 'first'; - if ($semicolonCount !== 1) { - $humanReadableCount = 'second'; - } - - $humanReadableCode = ucfirst($humanReadableCount); - $data = [$humanReadableCount]; - - // Only examine the space before the first semicolon if the first expression is not empty. - // If it *is* empty, leave it up to the `SpacingAfterOpen` logic. - $prevNonWhiteSpace = $phpcsFile->findPrevious(T_WHITESPACE, ($semicolon - 1), $openingBracket, true); - if ($semicolonCount !== 1 || $prevNonWhiteSpace !== $openingBracket) { - if ($tokens[($semicolon - 1)]['code'] === T_WHITESPACE) { - $error = 'Whitespace found before %s semicolon of FOR loop'; - $errorCode = 'SpacingBefore'.$humanReadableCode; - $fix = $phpcsFile->addFixableError($error, $semicolon, $errorCode, $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($semicolon - 1); $i > $prevNonWhiteSpace; $i--) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - } - - // Only examine the space after the second semicolon if the last expression is not empty. - // If it *is* empty, leave it up to the `SpacingBeforeClose` logic. - $nextNonWhiteSpace = $phpcsFile->findNext(T_WHITESPACE, ($semicolon + 1), ($closingBracket + 1), true); - if ($semicolonCount !== 2 || $nextNonWhiteSpace !== $closingBracket) { - if ($tokens[($semicolon + 1)]['code'] !== T_WHITESPACE - && $tokens[($semicolon + 1)]['code'] !== T_SEMICOLON - ) { - $error = 'Expected 1 space after %s semicolon of FOR loop; 0 found'; - $errorCode = 'NoSpaceAfter'.$humanReadableCode; - $fix = $phpcsFile->addFixableError($error, $semicolon, $errorCode, $data); - if ($fix === true) { - $phpcsFile->fixer->addContent($semicolon, ' '); - } - } else if ($tokens[($semicolon + 1)]['code'] === T_WHITESPACE - && $tokens[$nextNonWhiteSpace]['code'] !== T_SEMICOLON - ) { - $spaces = $tokens[($semicolon + 1)]['length']; - if ($tokens[$semicolon]['line'] !== $tokens[$nextNonWhiteSpace]['line']) { - $spaces = 'newline'; - } - - if ($spaces !== 1 - && ($this->ignoreNewlines === false - || $spaces !== 'newline') - ) { - $error = 'Expected 1 space after %s semicolon of FOR loop; %s found'; - $errorCode = 'SpacingAfter'.$humanReadableCode; - $data[] = $spaces; - $fix = $phpcsFile->addFixableError($error, $semicolon, $errorCode, $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken(($semicolon + 1), ' '); - for ($i = ($semicolon + 2); $i < $nextNonWhiteSpace; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - }//end if - }//end if - } while ($semicolonCount < 2); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/InlineIfDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/InlineIfDeclarationSniff.php deleted file mode 100644 index 87901ef..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/InlineIfDeclarationSniff.php +++ /dev/null @@ -1,155 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\ControlStructures; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class InlineIfDeclarationSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_INLINE_THEN]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $openBracket = null; - $closeBracket = null; - if (isset($tokens[$stackPtr]['nested_parenthesis']) === true) { - $parens = $tokens[$stackPtr]['nested_parenthesis']; - $openBracket = array_pop($parens); - $closeBracket = $tokens[$openBracket]['parenthesis_closer']; - } - - // Find the beginning of the statement. If we don't find a - // semicolon (end of statement) or comma (end of array value) - // then assume the content before the closing parenthesis is the end. - $else = $phpcsFile->findNext(T_INLINE_ELSE, ($stackPtr + 1)); - $statementEnd = $phpcsFile->findNext([T_SEMICOLON, T_COMMA], ($else + 1), $closeBracket); - if ($statementEnd === false) { - $statementEnd = $phpcsFile->findPrevious(T_WHITESPACE, ($closeBracket - 1), null, true); - } - - // Make sure it's all on the same line. - if ($tokens[$statementEnd]['line'] !== $tokens[$stackPtr]['line']) { - $error = 'Inline shorthand IF statement must be declared on a single line'; - $phpcsFile->addError($error, $stackPtr, 'NotSingleLine'); - return; - } - - // Make sure there are spaces around the question mark. - $contentBefore = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - $contentAfter = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($tokens[$contentBefore]['code'] !== T_CLOSE_PARENTHESIS) { - $error = 'Inline shorthand IF statement requires brackets around comparison'; - $phpcsFile->addError($error, $stackPtr, 'NoBrackets'); - } - - $spaceBefore = ($tokens[$stackPtr]['column'] - ($tokens[$contentBefore]['column'] + $tokens[$contentBefore]['length'])); - if ($spaceBefore !== 1) { - $error = 'Inline shorthand IF statement requires 1 space before THEN; %s found'; - $data = [$spaceBefore]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpacingBeforeThen', $data); - if ($fix === true) { - if ($spaceBefore === 0) { - $phpcsFile->fixer->addContentBefore($stackPtr, ' '); - } else { - $phpcsFile->fixer->replaceToken(($stackPtr - 1), ' '); - } - } - } - - // If there is no content between the ? and the : operators, then they are - // trying to replicate an elvis operator, even though PHP doesn't have one. - // In this case, we want no spaces between the two operators so ?: looks like - // an operator itself. - $next = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($tokens[$next]['code'] === T_INLINE_ELSE) { - $inlineElse = $next; - if ($inlineElse !== ($stackPtr + 1)) { - $error = 'Inline shorthand IF statement without THEN statement requires 0 spaces between THEN and ELSE'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'ElvisSpacing'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ''); - } - } - } else { - $spaceAfter = (($tokens[$contentAfter]['column']) - ($tokens[$stackPtr]['column'] + 1)); - if ($spaceAfter !== 1) { - $error = 'Inline shorthand IF statement requires 1 space after THEN; %s found'; - $data = [$spaceAfter]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpacingAfterThen', $data); - if ($fix === true) { - if ($spaceAfter === 0) { - $phpcsFile->fixer->addContent($stackPtr, ' '); - } else { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ' '); - } - } - } - - // Make sure the ELSE has the correct spacing. - $inlineElse = $phpcsFile->findNext(T_INLINE_ELSE, ($stackPtr + 1), $statementEnd, false); - $contentBefore = $phpcsFile->findPrevious(T_WHITESPACE, ($inlineElse - 1), null, true); - $spaceBefore = ($tokens[$inlineElse]['column'] - ($tokens[$contentBefore]['column'] + $tokens[$contentBefore]['length'])); - if ($spaceBefore !== 1) { - $error = 'Inline shorthand IF statement requires 1 space before ELSE; %s found'; - $data = [$spaceBefore]; - $fix = $phpcsFile->addFixableError($error, $inlineElse, 'SpacingBeforeElse', $data); - if ($fix === true) { - if ($spaceBefore === 0) { - $phpcsFile->fixer->addContentBefore($inlineElse, ' '); - } else { - $phpcsFile->fixer->replaceToken(($inlineElse - 1), ' '); - } - } - } - }//end if - - $contentAfter = $phpcsFile->findNext(T_WHITESPACE, ($inlineElse + 1), null, true); - $spaceAfter = (($tokens[$contentAfter]['column']) - ($tokens[$inlineElse]['column'] + 1)); - if ($spaceAfter !== 1) { - $error = 'Inline shorthand IF statement requires 1 space after ELSE; %s found'; - $data = [$spaceAfter]; - $fix = $phpcsFile->addFixableError($error, $inlineElse, 'SpacingAfterElse', $data); - if ($fix === true) { - if ($spaceAfter === 0) { - $phpcsFile->fixer->addContent($inlineElse, ' '); - } else { - $phpcsFile->fixer->replaceToken(($inlineElse + 1), ' '); - } - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/LowercaseDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/LowercaseDeclarationSniff.php deleted file mode 100644 index 9306437..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/LowercaseDeclarationSniff.php +++ /dev/null @@ -1,75 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\ControlStructures; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class LowercaseDeclarationSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_IF, - T_ELSE, - T_ELSEIF, - T_FOREACH, - T_FOR, - T_DO, - T_SWITCH, - T_WHILE, - T_TRY, - T_CATCH, - T_MATCH, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $content = $tokens[$stackPtr]['content']; - $contentLc = strtolower($content); - if ($content !== $contentLc) { - $error = '%s keyword must be lowercase; expected "%s" but found "%s"'; - $data = [ - strtoupper($content), - $contentLc, - $content, - ]; - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'FoundUppercase', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, $contentLc); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/SwitchDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/SwitchDeclarationSniff.php deleted file mode 100644 index d442685..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/ControlStructures/SwitchDeclarationSniff.php +++ /dev/null @@ -1,305 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\ControlStructures; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class SwitchDeclarationSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - /** - * The number of spaces code should be indented. - * - * @var integer - */ - public $indent = 4; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_SWITCH]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // We can't process SWITCH statements unless we know where they start and end. - if (isset($tokens[$stackPtr]['scope_opener']) === false - || isset($tokens[$stackPtr]['scope_closer']) === false - ) { - return; - } - - $switch = $tokens[$stackPtr]; - $nextCase = $stackPtr; - $caseAlignment = ($switch['column'] + $this->indent); - $caseCount = 0; - $foundDefault = false; - - while (($nextCase = $phpcsFile->findNext([T_CASE, T_DEFAULT, T_SWITCH], ($nextCase + 1), $switch['scope_closer'])) !== false) { - // Skip nested SWITCH statements; they are handled on their own. - if ($tokens[$nextCase]['code'] === T_SWITCH) { - $nextCase = $tokens[$nextCase]['scope_closer']; - continue; - } - - if ($tokens[$nextCase]['code'] === T_DEFAULT) { - $type = 'Default'; - $foundDefault = true; - } else { - $type = 'Case'; - $caseCount++; - } - - if ($tokens[$nextCase]['content'] !== strtolower($tokens[$nextCase]['content'])) { - $expected = strtolower($tokens[$nextCase]['content']); - $error = strtoupper($type).' keyword must be lowercase; expected "%s" but found "%s"'; - $data = [ - $expected, - $tokens[$nextCase]['content'], - ]; - - $fix = $phpcsFile->addFixableError($error, $nextCase, $type.'NotLower', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($nextCase, $expected); - } - } - - if ($tokens[$nextCase]['column'] !== $caseAlignment) { - $error = strtoupper($type).' keyword must be indented '.$this->indent.' spaces from SWITCH keyword'; - $fix = $phpcsFile->addFixableError($error, $nextCase, $type.'Indent'); - - if ($fix === true) { - $padding = str_repeat(' ', ($caseAlignment - 1)); - if ($tokens[$nextCase]['column'] === 1 - || $tokens[($nextCase - 1)]['code'] !== T_WHITESPACE - ) { - $phpcsFile->fixer->addContentBefore($nextCase, $padding); - } else { - $phpcsFile->fixer->replaceToken(($nextCase - 1), $padding); - } - } - } - - if ($type === 'Case' - && ($tokens[($nextCase + 1)]['type'] !== 'T_WHITESPACE' - || $tokens[($nextCase + 1)]['content'] !== ' ') - ) { - $error = 'CASE keyword must be followed by a single space'; - $fix = $phpcsFile->addFixableError($error, $nextCase, 'SpacingAfterCase'); - if ($fix === true) { - if ($tokens[($nextCase + 1)]['type'] !== 'T_WHITESPACE') { - $phpcsFile->fixer->addContent($nextCase, ' '); - } else { - $phpcsFile->fixer->replaceToken(($nextCase + 1), ' '); - } - } - } - - if (isset($tokens[$nextCase]['scope_opener']) === false) { - $error = 'Possible parse error: CASE missing opening colon'; - $phpcsFile->addWarning($error, $nextCase, 'MissingColon'); - continue; - } - - $opener = $tokens[$nextCase]['scope_opener']; - if ($tokens[($opener - 1)]['type'] === 'T_WHITESPACE') { - $error = 'There must be no space before the colon in a '.strtoupper($type).' statement'; - $fix = $phpcsFile->addFixableError($error, $nextCase, 'SpaceBeforeColon'.$type); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($opener - 1), ''); - } - } - - $nextBreak = $tokens[$nextCase]['scope_closer']; - if ($tokens[$nextBreak]['code'] === T_BREAK - || $tokens[$nextBreak]['code'] === T_RETURN - || $tokens[$nextBreak]['code'] === T_CONTINUE - || $tokens[$nextBreak]['code'] === T_THROW - || $tokens[$nextBreak]['code'] === T_EXIT - || $tokens[$nextBreak]['code'] === T_GOTO - ) { - if ($tokens[$nextBreak]['scope_condition'] === $nextCase) { - // Only need to check a couple of things once, even if the - // break is shared between multiple case statements, or even - // the default case. - if ($tokens[$nextBreak]['column'] !== $caseAlignment) { - $error = 'Case breaking statement must be indented '.$this->indent.' spaces from SWITCH keyword'; - $fix = $phpcsFile->addFixableError($error, $nextBreak, 'BreakIndent'); - - if ($fix === true) { - $padding = str_repeat(' ', ($caseAlignment - 1)); - if ($tokens[$nextBreak]['column'] === 1 - || $tokens[($nextBreak - 1)]['code'] !== T_WHITESPACE - ) { - $phpcsFile->fixer->addContentBefore($nextBreak, $padding); - } else { - $phpcsFile->fixer->replaceToken(($nextBreak - 1), $padding); - } - } - } - - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($nextBreak - 1), $stackPtr, true); - if ($tokens[$prev]['line'] !== ($tokens[$nextBreak]['line'] - 1)) { - $error = 'Blank lines are not allowed before case breaking statements'; - $phpcsFile->addError($error, $nextBreak, 'SpacingBeforeBreak'); - } - - $nextLine = $tokens[$tokens[$stackPtr]['scope_closer']]['line']; - $semicolon = $phpcsFile->findEndOfStatement($nextBreak); - for ($i = ($semicolon + 1); $i < $tokens[$stackPtr]['scope_closer']; $i++) { - if ($tokens[$i]['type'] !== 'T_WHITESPACE') { - $nextLine = $tokens[$i]['line']; - break; - } - } - - if ($type === 'Case') { - // Ensure the BREAK statement is followed by - // a single blank line, or the end switch brace. - if ($nextLine !== ($tokens[$semicolon]['line'] + 2) && $i !== $tokens[$stackPtr]['scope_closer']) { - $error = 'Case breaking statements must be followed by a single blank line'; - $fix = $phpcsFile->addFixableError($error, $nextBreak, 'SpacingAfterBreak'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($semicolon + 1); $i <= $tokens[$stackPtr]['scope_closer']; $i++) { - if ($tokens[$i]['line'] === $nextLine) { - $phpcsFile->fixer->addNewlineBefore($i); - break; - } - - if ($tokens[$i]['line'] === $tokens[$semicolon]['line']) { - continue; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - }//end if - } else { - // Ensure the BREAK statement is not followed by a blank line. - if ($nextLine !== ($tokens[$semicolon]['line'] + 1)) { - $error = 'Blank lines are not allowed after the DEFAULT case\'s breaking statement'; - $phpcsFile->addError($error, $nextBreak, 'SpacingAfterDefaultBreak'); - } - }//end if - - $caseLine = $tokens[$nextCase]['line']; - $nextLine = $tokens[$nextBreak]['line']; - for ($i = ($opener + 1); $i < $nextBreak; $i++) { - if ($tokens[$i]['type'] !== 'T_WHITESPACE') { - $nextLine = $tokens[$i]['line']; - break; - } - } - - if ($nextLine !== ($caseLine + 1)) { - $error = 'Blank lines are not allowed after '.strtoupper($type).' statements'; - $phpcsFile->addError($error, $nextCase, 'SpacingAfter'.$type); - } - }//end if - - if ($tokens[$nextBreak]['code'] === T_BREAK) { - if ($type === 'Case') { - // Ensure empty CASE statements are not allowed. - // They must have some code content in them. A comment is not enough. - // But count RETURN statements as valid content if they also - // happen to close the CASE statement. - $foundContent = false; - for ($i = ($tokens[$nextCase]['scope_opener'] + 1); $i < $nextBreak; $i++) { - if ($tokens[$i]['code'] === T_CASE) { - $i = $tokens[$i]['scope_opener']; - continue; - } - - if (isset(Tokens::$emptyTokens[$tokens[$i]['code']]) === false) { - $foundContent = true; - break; - } - } - - if ($foundContent === false) { - $error = 'Empty CASE statements are not allowed'; - $phpcsFile->addError($error, $nextCase, 'EmptyCase'); - } - } else { - // Ensure empty DEFAULT statements are not allowed. - // They must (at least) have a comment describing why - // the default case is being ignored. - $foundContent = false; - for ($i = ($tokens[$nextCase]['scope_opener'] + 1); $i < $nextBreak; $i++) { - if ($tokens[$i]['type'] !== 'T_WHITESPACE') { - $foundContent = true; - break; - } - } - - if ($foundContent === false) { - $error = 'Comment required for empty DEFAULT case'; - $phpcsFile->addError($error, $nextCase, 'EmptyDefault'); - } - }//end if - }//end if - } else if ($type === 'Default') { - $error = 'DEFAULT case must have a breaking statement'; - $phpcsFile->addError($error, $nextCase, 'DefaultNoBreak'); - }//end if - }//end while - - if ($foundDefault === false) { - $error = 'All SWITCH statements must contain a DEFAULT case'; - $phpcsFile->addError($error, $stackPtr, 'MissingDefault'); - } - - if ($tokens[$switch['scope_closer']]['column'] !== $switch['column']) { - $error = 'Closing brace of SWITCH statement must be aligned with SWITCH keyword'; - $phpcsFile->addError($error, $switch['scope_closer'], 'CloseBraceAlign'); - } - - if ($caseCount === 0) { - $error = 'SWITCH statements must contain at least one CASE statement'; - $phpcsFile->addError($error, $stackPtr, 'MissingCase'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Debug/JSLintSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Debug/JSLintSniff.php deleted file mode 100644 index 4fe8895..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Debug/JSLintSniff.php +++ /dev/null @@ -1,125 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Debug; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Common; - -class JSLintSniff implements Sniff, DeprecatedSniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['JS']; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return array - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return int - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If jslint.js could not be run. - */ - public function process(File $phpcsFile, $stackPtr) - { - $rhinoPath = Config::getExecutablePath('rhino'); - $jslintPath = Config::getExecutablePath('jslint'); - if ($rhinoPath === null || $jslintPath === null) { - return $phpcsFile->numTokens; - } - - $fileName = $phpcsFile->getFilename(); - - $rhinoPath = Common::escapeshellcmd($rhinoPath); - $jslintPath = Common::escapeshellcmd($jslintPath); - - $cmd = "$rhinoPath \"$jslintPath\" ".escapeshellarg($fileName); - exec($cmd, $output, $retval); - - if (is_array($output) === true) { - foreach ($output as $finding) { - $matches = []; - $numMatches = preg_match('/Lint at line ([0-9]+).*:(.*)$/', $finding, $matches); - if ($numMatches === 0) { - continue; - } - - $line = (int) $matches[1]; - $message = 'jslint says: '.trim($matches[2]); - $phpcsFile->addWarningOnLine($message, $line, 'ExternalTool'); - } - } - - // Ignore the rest of the file. - return $phpcsFile->numTokens; - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'Support for scanning JavaScript files will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Debug/JavaScriptLintSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Debug/JavaScriptLintSniff.php deleted file mode 100644 index 7d29fcb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Debug/JavaScriptLintSniff.php +++ /dev/null @@ -1,128 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Debug; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Exceptions\RuntimeException; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Common; - -class JavaScriptLintSniff implements Sniff, DeprecatedSniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['JS']; - - - /** - * Returns the token types that this sniff is interested in. - * - * @return array - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return int - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If Javascript Lint ran into trouble. - */ - public function process(File $phpcsFile, $stackPtr) - { - $jslPath = Config::getExecutablePath('jsl'); - if ($jslPath === null) { - return $phpcsFile->numTokens; - } - - $fileName = $phpcsFile->getFilename(); - - $cmd = '"'.Common::escapeshellcmd($jslPath).'" -nologo -nofilelisting -nocontext -nosummary -output-format __LINE__:__ERROR__ -process '.escapeshellarg($fileName); - $msg = exec($cmd, $output, $retval); - - // Variable $exitCode is the last line of $output if no error occurs, on - // error it is numeric. Try to handle various error conditions and - // provide useful error reporting. - if ($retval === 2 || $retval === 4) { - if (is_array($output) === true) { - $msg = implode('\n', $output); - } - - throw new RuntimeException("Failed invoking JavaScript Lint, retval was [$retval], output was [$msg]"); - } - - if (is_array($output) === true) { - foreach ($output as $finding) { - $split = strpos($finding, ':'); - $line = substr($finding, 0, $split); - $message = substr($finding, ($split + 1)); - $phpcsFile->addWarningOnLine(trim($message), $line, 'ExternalTool'); - } - } - - // Ignore the rest of the file. - return $phpcsFile->numTokens; - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'Support for scanning JavaScript files will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Files/FileExtensionSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Files/FileExtensionSniff.php deleted file mode 100644 index 5d84e4b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Files/FileExtensionSniff.php +++ /dev/null @@ -1,68 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class FileExtensionSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return int - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $fileName = $phpcsFile->getFilename(); - $extension = substr($fileName, strrpos($fileName, '.')); - $nextClass = $phpcsFile->findNext([T_CLASS, T_INTERFACE, T_TRAIT, T_ENUM], $stackPtr); - - if ($nextClass !== false) { - $phpcsFile->recordMetric($stackPtr, 'File extension for class files', $extension); - if ($extension === '.php') { - $error = '%s found in ".php" file; use ".inc" extension instead'; - $data = [ucfirst($tokens[$nextClass]['content'])]; - $phpcsFile->addError($error, $stackPtr, 'ClassFound', $data); - } - } else { - $phpcsFile->recordMetric($stackPtr, 'File extension for non-class files', $extension); - if ($extension === '.inc') { - $error = 'No interface or class found in ".inc" file; use ".php" extension instead'; - $phpcsFile->addError($error, $stackPtr, 'NoClass'); - } - } - - // Ignore the rest of the file. - return $phpcsFile->numTokens; - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Formatting/OperatorBracketSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Formatting/OperatorBracketSniff.php deleted file mode 100644 index 3872210..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Formatting/OperatorBracketSniff.php +++ /dev/null @@ -1,400 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Formatting; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class OperatorBracketSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return Tokens::$operators; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($phpcsFile->tokenizerType === 'JS' && $tokens[$stackPtr]['code'] === T_PLUS) { - // JavaScript uses the plus operator for string concatenation as well - // so we cannot accurately determine if it is a string concat or addition. - // So just ignore it. - return; - } - - // If the & is a reference, then we don't want to check for brackets. - if ($tokens[$stackPtr]['code'] === T_BITWISE_AND && $phpcsFile->isReference($stackPtr) === true) { - return; - } - - // There is one instance where brackets aren't needed, which involves - // the minus sign being used to assign a negative number to a variable. - if ($tokens[$stackPtr]['code'] === T_MINUS) { - // Check to see if we are trying to return -n. - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($tokens[$prev]['code'] === T_RETURN) { - return; - } - - $number = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($tokens[$number]['code'] === T_LNUMBER || $tokens[$number]['code'] === T_DNUMBER) { - $previous = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - if ($previous !== false) { - $isAssignment = isset(Tokens::$assignmentTokens[$tokens[$previous]['code']]); - $isEquality = isset(Tokens::$equalityTokens[$tokens[$previous]['code']]); - $isComparison = isset(Tokens::$comparisonTokens[$tokens[$previous]['code']]); - $isUnary = isset(Tokens::$operators[$tokens[$previous]['code']]); - if ($isAssignment === true || $isEquality === true || $isComparison === true || $isUnary === true) { - // This is a negative assignment or comparison. - // We need to check that the minus and the number are - // adjacent. - if (($number - $stackPtr) !== 1) { - $error = 'No space allowed between minus sign and number'; - $phpcsFile->addError($error, $stackPtr, 'SpacingAfterMinus'); - } - - return; - } - } - } - }//end if - - $previousToken = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true, null, true); - if ($previousToken !== false) { - // A list of tokens that indicate that the token is not - // part of an arithmetic operation. - $invalidTokens = [ - T_COMMA => true, - T_COLON => true, - T_OPEN_PARENTHESIS => true, - T_OPEN_SQUARE_BRACKET => true, - T_OPEN_CURLY_BRACKET => true, - T_OPEN_SHORT_ARRAY => true, - T_CASE => true, - T_EXIT => true, - T_MATCH_ARROW => true, - ]; - - if (isset($invalidTokens[$tokens[$previousToken]['code']]) === true) { - return; - } - } - - if ($tokens[$stackPtr]['code'] === T_BITWISE_OR - && isset($tokens[$stackPtr]['nested_parenthesis']) === true - ) { - $brackets = $tokens[$stackPtr]['nested_parenthesis']; - $lastBracket = array_pop($brackets); - if (isset($tokens[$lastBracket]['parenthesis_owner']) === true - && $tokens[$tokens[$lastBracket]['parenthesis_owner']]['code'] === T_CATCH - ) { - // This is a pipe character inside a catch statement, so it is acting - // as an exception type separator and not an arithmetic operation. - return; - } - } - - // Tokens that are allowed inside a bracketed operation. - $allowed = [ - T_VARIABLE => T_VARIABLE, - T_LNUMBER => T_LNUMBER, - T_DNUMBER => T_DNUMBER, - T_STRING => T_STRING, - T_WHITESPACE => T_WHITESPACE, - T_NS_SEPARATOR => T_NS_SEPARATOR, - T_THIS => T_THIS, - T_SELF => T_SELF, - T_STATIC => T_STATIC, - T_PARENT => T_PARENT, - T_OBJECT_OPERATOR => T_OBJECT_OPERATOR, - T_NULLSAFE_OBJECT_OPERATOR => T_NULLSAFE_OBJECT_OPERATOR, - T_DOUBLE_COLON => T_DOUBLE_COLON, - T_OPEN_SQUARE_BRACKET => T_OPEN_SQUARE_BRACKET, - T_CLOSE_SQUARE_BRACKET => T_CLOSE_SQUARE_BRACKET, - T_NONE => T_NONE, - T_BITWISE_NOT => T_BITWISE_NOT, - ]; - - $allowed += Tokens::$operators; - - $lastBracket = false; - if (isset($tokens[$stackPtr]['nested_parenthesis']) === true) { - $parenthesis = array_reverse($tokens[$stackPtr]['nested_parenthesis'], true); - foreach ($parenthesis as $bracket => $endBracket) { - $prevToken = $phpcsFile->findPrevious(T_WHITESPACE, ($bracket - 1), null, true); - $prevCode = $tokens[$prevToken]['code']; - - if ($prevCode === T_ISSET) { - // This operation is inside an isset() call, but has - // no bracket of it's own. - break; - } - - if ($prevCode === T_STRING || $prevCode === T_SWITCH || $prevCode === T_MATCH) { - // We allow simple operations to not be bracketed. - // For example, ceil($one / $two). - for ($prev = ($stackPtr - 1); $prev > $bracket; $prev--) { - if (isset($allowed[$tokens[$prev]['code']]) === true) { - continue; - } - - if ($tokens[$prev]['code'] === T_CLOSE_PARENTHESIS) { - $prev = $tokens[$prev]['parenthesis_opener']; - } else { - break; - } - } - - if ($prev !== $bracket) { - break; - } - - for ($next = ($stackPtr + 1); $next < $endBracket; $next++) { - if (isset($allowed[$tokens[$next]['code']]) === true) { - continue; - } - - if ($tokens[$next]['code'] === T_OPEN_PARENTHESIS) { - $next = $tokens[$next]['parenthesis_closer']; - } else { - break; - } - } - - if ($next !== $endBracket) { - break; - } - }//end if - - if (in_array($prevCode, Tokens::$scopeOpeners, true) === true) { - // This operation is inside a control structure like FOREACH - // or IF, but has no bracket of it's own. - // The only control structures allowed to do this are SWITCH and MATCH. - if ($prevCode !== T_SWITCH && $prevCode !== T_MATCH) { - break; - } - } - - if ($prevCode === T_OPEN_PARENTHESIS) { - // These are two open parenthesis in a row. If the current - // one doesn't enclose the operator, go to the previous one. - if ($endBracket < $stackPtr) { - continue; - } - } - - $lastBracket = $bracket; - break; - }//end foreach - }//end if - - if ($lastBracket === false) { - // It is not in a bracketed statement at all. - $this->addMissingBracketsError($phpcsFile, $stackPtr); - return; - } else if ($tokens[$lastBracket]['parenthesis_closer'] < $stackPtr) { - // There are a set of brackets in front of it that don't include it. - $this->addMissingBracketsError($phpcsFile, $stackPtr); - return; - } else { - // We are enclosed in a set of bracket, so the last thing to - // check is that we are not also enclosed in square brackets - // like this: ($array[$index + 1]), which is invalid. - $brackets = [ - T_OPEN_SQUARE_BRACKET, - T_CLOSE_SQUARE_BRACKET, - ]; - - $squareBracket = $phpcsFile->findPrevious($brackets, ($stackPtr - 1), $lastBracket); - if ($squareBracket !== false && $tokens[$squareBracket]['code'] === T_OPEN_SQUARE_BRACKET) { - $closeSquareBracket = $phpcsFile->findNext($brackets, ($stackPtr + 1)); - if ($closeSquareBracket !== false && $tokens[$closeSquareBracket]['code'] === T_CLOSE_SQUARE_BRACKET) { - $this->addMissingBracketsError($phpcsFile, $stackPtr); - } - } - - return; - }//end if - - $lastAssignment = $phpcsFile->findPrevious(Tokens::$assignmentTokens, $stackPtr, null, false, null, true); - if ($lastAssignment !== false && $lastAssignment > $lastBracket) { - $this->addMissingBracketsError($phpcsFile, $stackPtr); - } - - }//end process() - - - /** - * Add and fix the missing brackets error. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function addMissingBracketsError($phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $allowed = [ - T_VARIABLE => true, - T_LNUMBER => true, - T_DNUMBER => true, - T_STRING => true, - T_CONSTANT_ENCAPSED_STRING => true, - T_DOUBLE_QUOTED_STRING => true, - T_WHITESPACE => true, - T_NS_SEPARATOR => true, - T_THIS => true, - T_SELF => true, - T_STATIC => true, - T_OBJECT_OPERATOR => true, - T_NULLSAFE_OBJECT_OPERATOR => true, - T_DOUBLE_COLON => true, - T_ISSET => true, - T_ARRAY => true, - T_NONE => true, - T_BITWISE_NOT => true, - ]; - - // Find the first token in the expression. - for ($before = ($stackPtr - 1); $before > 0; $before--) { - // Special case for plus operators because we can't tell if they are used - // for addition or string contact. So assume string concat to be safe. - if ($phpcsFile->tokenizerType === 'JS' && $tokens[$before]['code'] === T_PLUS) { - break; - } - - if (isset(Tokens::$emptyTokens[$tokens[$before]['code']]) === true - || isset(Tokens::$operators[$tokens[$before]['code']]) === true - || isset(Tokens::$castTokens[$tokens[$before]['code']]) === true - || isset($allowed[$tokens[$before]['code']]) === true - ) { - continue; - } - - if ($tokens[$before]['code'] === T_CLOSE_PARENTHESIS) { - $before = $tokens[$before]['parenthesis_opener']; - continue; - } - - if ($tokens[$before]['code'] === T_CLOSE_SQUARE_BRACKET) { - $before = $tokens[$before]['bracket_opener']; - continue; - } - - if ($tokens[$before]['code'] === T_CLOSE_SHORT_ARRAY) { - $before = $tokens[$before]['bracket_opener']; - continue; - } - - break; - }//end for - - $before = $phpcsFile->findNext(Tokens::$emptyTokens, ($before + 1), null, true); - - // A few extra tokens are allowed to be on the right side of the expression. - $allowed[T_EQUAL] = true; - $allowed[T_NEW] = true; - - // Find the last token in the expression. - for ($after = ($stackPtr + 1); $after < $phpcsFile->numTokens; $after++) { - // Special case for plus operators because we can't tell if they are used - // for addition or string concat. So assume string concat to be safe. - if ($phpcsFile->tokenizerType === 'JS' && $tokens[$after]['code'] === T_PLUS) { - break; - } - - if (isset(Tokens::$emptyTokens[$tokens[$after]['code']]) === true - || isset(Tokens::$operators[$tokens[$after]['code']]) === true - || isset(Tokens::$castTokens[$tokens[$after]['code']]) === true - || isset($allowed[$tokens[$after]['code']]) === true - ) { - continue; - } - - if ($tokens[$after]['code'] === T_OPEN_PARENTHESIS) { - if (isset($tokens[$after]['parenthesis_closer']) === false) { - // Live coding/parse error. Ignore. - return; - } - - $after = $tokens[$after]['parenthesis_closer']; - continue; - } - - if (($tokens[$after]['code'] === T_OPEN_SQUARE_BRACKET - || $tokens[$after]['code'] === T_OPEN_SHORT_ARRAY) - ) { - if (isset($tokens[$after]['bracket_closer']) === false) { - // Live coding/parse error. Ignore. - return; - } - - $after = $tokens[$after]['bracket_closer']; - continue; - } - - break; - }//end for - - $after = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($after - 1), null, true); - - $error = 'Operation must be bracketed'; - if ($before === $after || $before === $stackPtr || $after === $stackPtr) { - $phpcsFile->addError($error, $stackPtr, 'MissingBrackets'); - return; - } - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'MissingBrackets'); - if ($fix === true) { - // Can only fix this error if both tokens are available for fixing. - // Adding one bracket without the other will create parse errors. - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($before, '('.$tokens[$before]['content']); - $phpcsFile->fixer->replaceToken($after, $tokens[$after]['content'].')'); - $phpcsFile->fixer->endChangeset(); - } - - }//end addMissingBracketsError() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/FunctionDeclarationArgumentSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/FunctionDeclarationArgumentSpacingSniff.php deleted file mode 100644 index 2a10bf6..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/FunctionDeclarationArgumentSpacingSniff.php +++ /dev/null @@ -1,572 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Functions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Common; -use PHP_CodeSniffer\Util\Tokens; - -class FunctionDeclarationArgumentSpacingSniff implements Sniff -{ - - /** - * How many spaces should surround the equals signs. - * - * @var integer - */ - public $equalsSpacing = 0; - - /** - * How many spaces should follow the opening bracket. - * - * @var integer - */ - public $requiredSpacesAfterOpen = 0; - - /** - * How many spaces should precede the closing bracket. - * - * @var integer - */ - public $requiredSpacesBeforeClose = 0; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_FUNCTION, - T_CLOSURE, - T_FN, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['parenthesis_opener']) === false - || isset($tokens[$stackPtr]['parenthesis_closer']) === false - ) { - return; - } - - $this->equalsSpacing = (int) $this->equalsSpacing; - $this->requiredSpacesAfterOpen = (int) $this->requiredSpacesAfterOpen; - $this->requiredSpacesBeforeClose = (int) $this->requiredSpacesBeforeClose; - - $this->processBracket($phpcsFile, $tokens[$stackPtr]['parenthesis_opener']); - - if ($tokens[$stackPtr]['code'] === T_CLOSURE) { - $use = $phpcsFile->findNext(T_USE, ($tokens[$stackPtr]['parenthesis_closer'] + 1), $tokens[$stackPtr]['scope_opener']); - if ($use !== false) { - $openBracket = $phpcsFile->findNext(T_OPEN_PARENTHESIS, ($use + 1), null); - $this->processBracket($phpcsFile, $openBracket); - } - } - - }//end process() - - - /** - * Processes the contents of a single set of brackets. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $openBracket The position of the open bracket - * in the stack. - * - * @return void - */ - public function processBracket($phpcsFile, $openBracket) - { - $tokens = $phpcsFile->getTokens(); - $closeBracket = $tokens[$openBracket]['parenthesis_closer']; - $multiLine = ($tokens[$openBracket]['line'] !== $tokens[$closeBracket]['line']); - - if (isset($tokens[$openBracket]['parenthesis_owner']) === true) { - $stackPtr = $tokens[$openBracket]['parenthesis_owner']; - } else { - $stackPtr = $phpcsFile->findPrevious(T_USE, ($openBracket - 1)); - } - - $params = $phpcsFile->getMethodParameters($stackPtr); - - if (empty($params) === true) { - // Check spacing around parenthesis. - $next = $phpcsFile->findNext(T_WHITESPACE, ($openBracket + 1), $closeBracket, true); - if ($next === false) { - if (($closeBracket - $openBracket) !== 1) { - if ($tokens[$openBracket]['line'] !== $tokens[$closeBracket]['line']) { - $found = 'newline'; - } else { - $found = $tokens[($openBracket + 1)]['length']; - } - - $error = 'Expected 0 spaces between parenthesis of function declaration; %s found'; - $data = [$found]; - $fix = $phpcsFile->addFixableError($error, $openBracket, 'SpacingBetween', $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($openBracket + 1); $tokens[$i]['code'] === T_WHITESPACE; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - - // No params, so we don't check normal spacing rules. - return; - }//end if - }//end if - - foreach ($params as $paramNumber => $param) { - if ($param['pass_by_reference'] === true) { - $refToken = $param['reference_token']; - - if ($tokens[($refToken + 1)]['code'] === T_WHITESPACE) { - $gap = $tokens[($refToken + 1)]['length']; - if ($tokens[$refToken]['line'] !== $tokens[($refToken + 2)]['line']) { - $gap = 'newline'; - } - - $error = 'Expected 0 spaces after reference operator for argument "%s"; %s found'; - $data = [ - $param['name'], - $gap, - ]; - $fix = $phpcsFile->addFixableError($error, $refToken, 'SpacingAfterReference', $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($refToken + 1); $tokens[$i]['code'] === T_WHITESPACE; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - }//end if - }//end if - - if ($param['variable_length'] === true) { - $variadicToken = $param['variadic_token']; - - if ($tokens[($variadicToken + 1)]['code'] === T_WHITESPACE) { - $gap = $tokens[($variadicToken + 1)]['length']; - if ($tokens[$variadicToken]['line'] !== $tokens[($variadicToken + 2)]['line']) { - $gap = 'newline'; - } - - $error = 'Expected 0 spaces after variadic operator for argument "%s"; %s found'; - $data = [ - $param['name'], - $gap, - ]; - $fix = $phpcsFile->addFixableError($error, $variadicToken, 'SpacingAfterVariadic', $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($variadicToken + 1); $tokens[$i]['code'] === T_WHITESPACE; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - }//end if - }//end if - - if (isset($param['default_equal_token']) === true) { - $equalToken = $param['default_equal_token']; - - $spacesBefore = 0; - if ($tokens[$param['token']]['line'] !== $tokens[$equalToken]['line']) { - $spacesBefore = 'newline'; - } else if ($tokens[($param['token'] + 1)]['code'] === T_WHITESPACE) { - $spacesBefore = $tokens[($param['token'] + 1)]['length']; - } - - if ($spacesBefore !== $this->equalsSpacing) { - $error = 'Incorrect spacing between argument "%s" and equals sign; expected '.$this->equalsSpacing.' but found %s'; - $data = [ - $param['name'], - $spacesBefore, - ]; - - $nextNonWhitespace = $phpcsFile->findNext(T_WHITESPACE, ($param['token'] + 1), $equalToken, true); - if ($nextNonWhitespace !== false) { - $phpcsFile->addError($error, $equalToken, 'SpaceBeforeEquals', $data); - } else { - $fix = $phpcsFile->addFixableError($error, $equalToken, 'SpaceBeforeEquals', $data); - if ($fix === true) { - $padding = str_repeat(' ', $this->equalsSpacing); - - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->addContent($param['token'], $padding); - - for ($i = ($param['token'] + 1); $tokens[$i]['code'] === T_WHITESPACE; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - }//end if - - $spacesAfter = 0; - if ($tokens[$equalToken]['line'] !== $tokens[$param['default_token']]['line']) { - $spacesAfter = 'newline'; - } else if ($tokens[($equalToken + 1)]['code'] === T_WHITESPACE) { - $spacesAfter = $tokens[($equalToken + 1)]['length']; - } - - if ($spacesAfter !== $this->equalsSpacing) { - $error = 'Incorrect spacing between default value and equals sign for argument "%s"; expected '.$this->equalsSpacing.' but found %s'; - $data = [ - $param['name'], - $spacesAfter, - ]; - - $nextNonWhitespace = $phpcsFile->findNext(T_WHITESPACE, ($equalToken + 1), $param['default_token'], true); - if ($nextNonWhitespace !== false) { - $phpcsFile->addError($error, $equalToken, 'SpaceAfterEquals', $data); - } else { - $fix = $phpcsFile->addFixableError($error, $equalToken, 'SpaceAfterEquals', $data); - if ($fix === true) { - $padding = str_repeat(' ', $this->equalsSpacing); - - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->addContent($equalToken, $padding); - - for ($i = ($equalToken + 1); $tokens[$i]['code'] === T_WHITESPACE; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - }//end if - }//end if - - if ($param['type_hint_token'] !== false) { - $typeHintToken = $param['type_hint_end_token']; - - $gap = ''; - $i = $typeHintToken; - while ($tokens[++$i]['code'] === T_WHITESPACE) { - $gap .= $tokens[$i]['content']; - } - - if ($gap !== ' ') { - $error = 'Expected 1 space between type hint and argument "%s"; %s found'; - $data = [ - $param['name'], - ]; - if (trim($gap, ' ') === '') { - // Gap contains only space characters: report the number of spaces. - $data[] = strlen($gap); - } else { - // Gap contains more than just spaces: render these for better clarity. - $data[] = '"'.Common::prepareForOutput($gap).'"'; - } - - $fix = $phpcsFile->addFixableError($error, $typeHintToken, 'SpacingAfterHint', $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->addContent($typeHintToken, ' '); - - for ($i = ($typeHintToken + 1); $tokens[$i]['code'] === T_WHITESPACE; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - }//end if - }//end if - - if (isset($param['visibility_token']) === true && $param['visibility_token'] !== false) { - $visibilityToken = $param['visibility_token']; - $afterVisibilityToken = $phpcsFile->findNext(T_WHITESPACE, ($visibilityToken + 1), $param['token'], true); - - $spacesAfter = 0; - if ($afterVisibilityToken !== false - && $tokens[$visibilityToken]['line'] !== $tokens[$afterVisibilityToken]['line'] - ) { - $spacesAfter = 'newline'; - } else if ($tokens[($visibilityToken + 1)]['code'] === T_WHITESPACE) { - $spacesAfter = $tokens[($visibilityToken + 1)]['length']; - } - - if ($spacesAfter !== 1) { - $error = 'Expected 1 space after visibility modifier "%s"; %s found'; - $data = [ - $tokens[$visibilityToken]['content'], - $spacesAfter, - ]; - - $fix = $phpcsFile->addFixableError($error, $visibilityToken, 'SpacingAfterVisbility', $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->addContent($visibilityToken, ' '); - - for ($i = ($visibilityToken + 1); $tokens[$i]['code'] === T_WHITESPACE; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - }//end if - }//end if - - if (isset($param['set_visibility_token']) === true && $param['set_visibility_token'] !== false) { - $visibilityToken = $param['set_visibility_token']; - $afterVisibilityToken = $phpcsFile->findNext(T_WHITESPACE, ($visibilityToken + 1), $param['token'], true); - - $spacesAfter = 0; - if ($afterVisibilityToken !== false - && $tokens[$visibilityToken]['line'] !== $tokens[$afterVisibilityToken]['line'] - ) { - $spacesAfter = 'newline'; - } else if ($tokens[($visibilityToken + 1)]['code'] === T_WHITESPACE) { - $spacesAfter = $tokens[($visibilityToken + 1)]['length']; - } - - if ($spacesAfter !== 1) { - $error = 'Expected 1 space after set-visibility modifier "%s"; %s found'; - $data = [ - $tokens[$visibilityToken]['content'], - $spacesAfter, - ]; - - $fix = $phpcsFile->addFixableError($error, $visibilityToken, 'SpacingAfterSetVisibility', $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->addContent($visibilityToken, ' '); - - for ($i = ($visibilityToken + 1); $tokens[$i]['code'] === T_WHITESPACE; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - }//end if - }//end if - - if (isset($param['readonly_token']) === true) { - $readonlyToken = $param['readonly_token']; - $afterReadonlyToken = $phpcsFile->findNext(T_WHITESPACE, ($readonlyToken + 1), $param['token'], true); - - $spacesAfter = 0; - if ($afterReadonlyToken !== false - && $tokens[$readonlyToken]['line'] !== $tokens[$afterReadonlyToken]['line'] - ) { - $spacesAfter = 'newline'; - } else if ($tokens[($readonlyToken + 1)]['code'] === T_WHITESPACE) { - $spacesAfter = $tokens[($readonlyToken + 1)]['length']; - } - - if ($spacesAfter !== 1) { - $error = 'Expected 1 space after readonly modifier; %s found'; - $data = [$spacesAfter]; - - $fix = $phpcsFile->addFixableError($error, $readonlyToken, 'SpacingAfterReadonly', $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->addContent($readonlyToken, ' '); - - for ($i = ($readonlyToken + 1); $tokens[$i]['code'] === T_WHITESPACE; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - }//end if - }//end if - - $commaToken = false; - if ($paramNumber > 0 && $params[($paramNumber - 1)]['comma_token'] !== false) { - $commaToken = $params[($paramNumber - 1)]['comma_token']; - } - - if ($commaToken !== false) { - $endOfPreviousParam = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($commaToken - 1), null, true); - - $spaceBeforeComma = 0; - if ($tokens[$endOfPreviousParam]['line'] !== $tokens[$commaToken]['line']) { - $spaceBeforeComma = 'newline'; - } else if ($tokens[($commaToken - 1)]['code'] === T_WHITESPACE) { - $spaceBeforeComma = $tokens[($commaToken - 1)]['length']; - } - - if ($spaceBeforeComma !== 0) { - $error = 'Expected 0 spaces between argument "%s" and comma; %s found'; - $data = [ - $params[($paramNumber - 1)]['name'], - $spaceBeforeComma, - ]; - - $fix = $phpcsFile->addFixableError($error, $commaToken, 'SpaceBeforeComma', $data); - if ($fix === true) { - $startOfCurrentParam = $phpcsFile->findNext(Tokens::$emptyTokens, ($commaToken + 1), null, true); - - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->addContent($endOfPreviousParam, ','); - $phpcsFile->fixer->replaceToken($commaToken, ''); - - if ($tokens[$commaToken]['line'] === $tokens[$startOfCurrentParam]['line']) { - for ($i = ($commaToken + 1); $tokens[$i]['code'] === T_WHITESPACE; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - } else { - for ($i = ($commaToken - 1); - $tokens[$i]['code'] === T_WHITESPACE && $tokens[$endOfPreviousParam]['line'] !== $tokens[$i]['line']; - $i-- - ) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - for ($i = ($commaToken + 1); - $tokens[$i]['code'] === T_WHITESPACE && $tokens[$commaToken]['line'] === $tokens[$i]['line']; - $i++ - ) { - $phpcsFile->fixer->replaceToken($i, ''); - } - } - - $phpcsFile->fixer->endChangeset(); - }//end if - }//end if - - // Don't check spacing after the comma if it is the last content on the line. - $checkComma = true; - if ($multiLine === true) { - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($commaToken + 1), $closeBracket, true); - if ($tokens[$next]['line'] !== $tokens[$commaToken]['line']) { - $checkComma = false; - } - } - - if ($checkComma === true) { - $typeOfNext = 'argument'; - $typeOfNextShort = 'Arg'; - $contentOfNext = $param['name']; - - if (isset($param['property_visibility']) === true) { - $typeOfNext = 'property modifier'; - $typeOfNextShort = 'PropertyModifier'; - $modifier = $phpcsFile->findNext(Tokens::$emptyTokens, ($commaToken + 1), $param['token'], true); - $contentOfNext = $tokens[$modifier]['content']; - } else if ($param['type_hint_token'] !== false) { - $typeOfNext = 'type hint'; - $typeOfNextShort = 'Hint'; - $contentOfNext = $param['type_hint']; - } - - $spacesAfter = 0; - if ($tokens[($commaToken + 1)]['code'] === T_WHITESPACE) { - $spacesAfter = $tokens[($commaToken + 1)]['length']; - } - - if ($spacesAfter === 0) { - $error = 'Expected 1 space between comma and %s "%s"; 0 found'; - $errorCode = 'NoSpaceBefore'.$typeOfNextShort; - $data = [ - $typeOfNext, - $contentOfNext, - ]; - - $fix = $phpcsFile->addFixableError($error, $commaToken, $errorCode, $data); - if ($fix === true) { - $phpcsFile->fixer->addContent($commaToken, ' '); - } - } else if ($spacesAfter !== 1) { - $error = 'Expected 1 space between comma and %s "%s"; %s found'; - $errorCode = 'SpacingBefore'.$typeOfNextShort; - $data = [ - $typeOfNext, - $contentOfNext, - $spacesAfter, - ]; - - $fix = $phpcsFile->addFixableError($error, $commaToken, $errorCode, $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($commaToken + 1), ' '); - } - }//end if - }//end if - }//end if - }//end foreach - - // Only check spacing around parenthesis for single line definitions. - if ($multiLine === true) { - return; - } - - $gap = 0; - if ($tokens[($closeBracket - 1)]['code'] === T_WHITESPACE) { - $gap = $tokens[($closeBracket - 1)]['length']; - } - - if ($gap !== $this->requiredSpacesBeforeClose) { - $error = 'Expected %s spaces before closing parenthesis; %s found'; - $data = [ - $this->requiredSpacesBeforeClose, - $gap, - ]; - $fix = $phpcsFile->addFixableError($error, $closeBracket, 'SpacingBeforeClose', $data); - if ($fix === true) { - $padding = str_repeat(' ', $this->requiredSpacesBeforeClose); - if ($gap === 0) { - $phpcsFile->fixer->addContentBefore($closeBracket, $padding); - } else { - $phpcsFile->fixer->replaceToken(($closeBracket - 1), $padding); - } - } - } - - $gap = 0; - if ($tokens[($openBracket + 1)]['code'] === T_WHITESPACE) { - $gap = $tokens[($openBracket + 1)]['length']; - } - - if ($gap !== $this->requiredSpacesAfterOpen) { - $error = 'Expected %s spaces after opening parenthesis; %s found'; - $data = [ - $this->requiredSpacesAfterOpen, - $gap, - ]; - $fix = $phpcsFile->addFixableError($error, $openBracket, 'SpacingAfterOpen', $data); - if ($fix === true) { - $padding = str_repeat(' ', $this->requiredSpacesAfterOpen); - if ($gap === 0) { - $phpcsFile->fixer->addContent($openBracket, $padding); - } else { - $phpcsFile->fixer->replaceToken(($openBracket + 1), $padding); - } - } - } - - }//end processBracket() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/FunctionDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/FunctionDeclarationSniff.php deleted file mode 100644 index dec03e9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/FunctionDeclarationSniff.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Functions; - -use PHP_CodeSniffer\Sniffs\AbstractPatternSniff; - -class FunctionDeclarationSniff extends AbstractPatternSniff -{ - - - /** - * Returns an array of patterns to check are correct. - * - * @return array - */ - protected function getPatterns() - { - return [ - 'function abc(...);', - 'function abc(...)', - 'abstract function abc(...);', - ]; - - }//end getPatterns() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/FunctionDuplicateArgumentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/FunctionDuplicateArgumentSniff.php deleted file mode 100644 index 917e02d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/FunctionDuplicateArgumentSniff.php +++ /dev/null @@ -1,64 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Functions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class FunctionDuplicateArgumentSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_FUNCTION]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $openBracket = $tokens[$stackPtr]['parenthesis_opener']; - $closeBracket = $tokens[$stackPtr]['parenthesis_closer']; - - $foundVariables = []; - for ($i = ($openBracket + 1); $i < $closeBracket; $i++) { - if ($tokens[$i]['code'] === T_VARIABLE) { - $variable = $tokens[$i]['content']; - if (in_array($variable, $foundVariables, true) === true) { - $error = 'Variable "%s" appears more than once in function declaration'; - $data = [$variable]; - $phpcsFile->addError($error, $i, 'Found', $data); - } else { - $foundVariables[] = $variable; - } - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/GlobalFunctionSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/GlobalFunctionSniff.php deleted file mode 100644 index d1ac9db..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/GlobalFunctionSniff.php +++ /dev/null @@ -1,61 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Functions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class GlobalFunctionSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_FUNCTION]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (empty($tokens[$stackPtr]['conditions']) === true) { - $functionName = $phpcsFile->getDeclarationName($stackPtr); - if ($functionName === null) { - return; - } - - // Special exception for __autoload as it needs to be global. - if ($functionName !== '__autoload') { - $error = 'Consider putting global function "%s" in a static class'; - $data = [$functionName]; - $phpcsFile->addWarning($error, $stackPtr, 'Found', $data); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/LowercaseFunctionKeywordsSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/LowercaseFunctionKeywordsSniff.php deleted file mode 100644 index cf8e649..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/LowercaseFunctionKeywordsSniff.php +++ /dev/null @@ -1,69 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Functions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class LowercaseFunctionKeywordsSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - $tokens = Tokens::$methodPrefixes; - $tokens[] = T_FUNCTION; - $tokens[] = T_CLOSURE; - $tokens[] = T_FN; - - return $tokens; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $content = $tokens[$stackPtr]['content']; - $contentLc = strtolower($content); - if ($content !== $contentLc) { - $error = '%s keyword must be lowercase; expected "%s" but found "%s"'; - $data = [ - strtoupper($content), - $contentLc, - $content, - ]; - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'FoundUppercase', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, $contentLc); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/MultiLineFunctionDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/MultiLineFunctionDeclarationSniff.php deleted file mode 100644 index 0777eef..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Functions/MultiLineFunctionDeclarationSniff.php +++ /dev/null @@ -1,262 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Functions; - -use PHP_CodeSniffer\Standards\PEAR\Sniffs\Functions\FunctionDeclarationSniff as PEARFunctionDeclarationSniff; -use PHP_CodeSniffer\Util\Tokens; - -class MultiLineFunctionDeclarationSniff extends PEARFunctionDeclarationSniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - - /** - * Determine if this is a multi-line function declaration. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $openBracket The position of the opening bracket - * in the stack passed in $tokens. - * @param array $tokens The stack of tokens that make up - * the file. - * - * @return bool - */ - public function isMultiLineDeclaration($phpcsFile, $stackPtr, $openBracket, $tokens) - { - $bracketsToCheck = [$stackPtr => $openBracket]; - - // Closures may use the USE keyword and so be multi-line in this way. - if ($tokens[$stackPtr]['code'] === T_CLOSURE) { - $use = $phpcsFile->findNext(T_USE, ($tokens[$openBracket]['parenthesis_closer'] + 1), $tokens[$stackPtr]['scope_opener']); - if ($use !== false) { - $open = $phpcsFile->findNext(T_OPEN_PARENTHESIS, ($use + 1)); - if ($open !== false) { - $bracketsToCheck[$use] = $open; - } - } - } - - foreach ($bracketsToCheck as $stackPtr => $openBracket) { - // If the first argument is on a new line, this is a multi-line - // function declaration, even if there is only one argument. - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($openBracket + 1), null, true); - if ($tokens[$next]['line'] !== $tokens[$stackPtr]['line']) { - return true; - } - - $closeBracket = $tokens[$openBracket]['parenthesis_closer']; - - $end = $phpcsFile->findEndOfStatement($openBracket + 1); - while ($tokens[$end]['code'] === T_COMMA) { - // If the next bit of code is not on the same line, this is a - // multi-line function declaration. - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($end + 1), $closeBracket, true); - if ($next === false) { - continue(2); - } - - if ($tokens[$next]['line'] !== $tokens[$end]['line']) { - return true; - } - - $end = $phpcsFile->findEndOfStatement($next); - } - - // We've reached the last argument, so see if the next content - // (should be the close bracket) is also on the same line. - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($end + 1), $closeBracket, true); - if ($next !== false && $tokens[$next]['line'] !== $tokens[$end]['line']) { - return true; - } - }//end foreach - - return false; - - }//end isMultiLineDeclaration() - - - /** - * Processes single-line declarations. - * - * Just uses the Generic BSD-Allman brace sniff. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param array $tokens The stack of tokens that make up - * the file. - * - * @return void - */ - public function processSingleLineDeclaration($phpcsFile, $stackPtr, $tokens) - { - // We do everything the parent sniff does, and a bit more because we - // define multi-line declarations a bit differently. - parent::processSingleLineDeclaration($phpcsFile, $stackPtr, $tokens); - - $openingBracket = $tokens[$stackPtr]['parenthesis_opener']; - $closingBracket = $tokens[$stackPtr]['parenthesis_closer']; - - $prevNonWhiteSpace = $phpcsFile->findPrevious(T_WHITESPACE, ($closingBracket - 1), $openingBracket, true); - if ($tokens[$prevNonWhiteSpace]['line'] !== $tokens[$closingBracket]['line']) { - $error = 'There must not be a newline before the closing parenthesis of a single-line function declaration'; - - if (isset(Tokens::$emptyTokens[$tokens[$prevNonWhiteSpace]['code']]) === true) { - $phpcsFile->addError($error, $closingBracket, 'CloseBracketNewLine'); - } else { - $fix = $phpcsFile->addFixableError($error, $closingBracket, 'CloseBracketNewLine'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($closingBracket - 1); $i > $openingBracket; $i--) { - if ($tokens[$i]['code'] !== T_WHITESPACE) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - }//end if - - }//end processSingleLineDeclaration() - - - /** - * Processes multi-line declarations. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param array $tokens The stack of tokens that make up - * the file. - * - * @return void - */ - public function processMultiLineDeclaration($phpcsFile, $stackPtr, $tokens) - { - // We do everything the parent sniff does, and a bit more. - parent::processMultiLineDeclaration($phpcsFile, $stackPtr, $tokens); - - $openBracket = $tokens[$stackPtr]['parenthesis_opener']; - $this->processBracket($phpcsFile, $openBracket, $tokens, 'function'); - - if ($tokens[$stackPtr]['code'] !== T_CLOSURE) { - return; - } - - $use = $phpcsFile->findNext(T_USE, ($tokens[$stackPtr]['parenthesis_closer'] + 1), $tokens[$stackPtr]['scope_opener']); - if ($use === false) { - return; - } - - $openBracket = $phpcsFile->findNext(T_OPEN_PARENTHESIS, ($use + 1), null); - $this->processBracket($phpcsFile, $openBracket, $tokens, 'use'); - - }//end processMultiLineDeclaration() - - - /** - * Processes the contents of a single set of brackets. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $openBracket The position of the open bracket - * in the stack passed in $tokens. - * @param array $tokens The stack of tokens that make up - * the file. - * @param string $type The type of the token the brackets - * belong to (function or use). - * - * @return void - */ - public function processBracket($phpcsFile, $openBracket, $tokens, $type='function') - { - $errorPrefix = ''; - if ($type === 'use') { - $errorPrefix = 'Use'; - } - - $closeBracket = $tokens[$openBracket]['parenthesis_closer']; - - // The open bracket should be the last thing on the line. - if ($tokens[$openBracket]['line'] !== $tokens[$closeBracket]['line']) { - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($openBracket + 1), null, true); - if ($tokens[$next]['line'] === $tokens[$openBracket]['line']) { - $error = 'The first parameter of a multi-line '.$type.' declaration must be on the line after the opening bracket'; - $fix = $phpcsFile->addFixableError($error, $next, $errorPrefix.'FirstParamSpacing'); - if ($fix === true) { - if ($tokens[$next]['line'] === $tokens[$openBracket]['line']) { - $phpcsFile->fixer->addNewline($openBracket); - } else { - $phpcsFile->fixer->beginChangeset(); - for ($x = $openBracket; $x < $next; $x++) { - if ($tokens[$x]['line'] === $tokens[$openBracket]['line']) { - continue; - } - - if ($tokens[$x]['line'] === $tokens[$next]['line']) { - break; - } - } - - $phpcsFile->fixer->endChangeset(); - } - } - }//end if - }//end if - - // Each line between the brackets should contain a single parameter. - for ($i = ($openBracket + 1); $i < $closeBracket; $i++) { - // Skip brackets, like arrays, as they can contain commas. - if (isset($tokens[$i]['bracket_closer']) === true) { - $i = $tokens[$i]['bracket_closer']; - continue; - } - - if (isset($tokens[$i]['parenthesis_closer']) === true) { - $i = $tokens[$i]['parenthesis_closer']; - continue; - } - - if (isset($tokens[$i]['attribute_closer']) === true) { - $i = $tokens[$i]['attribute_closer']; - continue; - } - - if ($tokens[$i]['code'] !== T_COMMA) { - continue; - } - - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($i + 1), null, true); - if ($tokens[$next]['line'] === $tokens[$i]['line']) { - $error = 'Multi-line '.$type.' declarations must define one parameter per line'; - $fix = $phpcsFile->addFixableError($error, $next, $errorPrefix.'OneParamPerLine'); - if ($fix === true) { - $phpcsFile->fixer->addNewline($i); - } - } - }//end for - - }//end processBracket() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/NamingConventions/ValidFunctionNameSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/NamingConventions/ValidFunctionNameSniff.php deleted file mode 100644 index 5aa2d75..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/NamingConventions/ValidFunctionNameSniff.php +++ /dev/null @@ -1,54 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\NamingConventions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Standards\PEAR\Sniffs\NamingConventions\ValidFunctionNameSniff as PEARValidFunctionNameSniff; -use PHP_CodeSniffer\Util\Common; - -class ValidFunctionNameSniff extends PEARValidFunctionNameSniff -{ - - - /** - * Processes the tokens outside the scope. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being processed. - * @param int $stackPtr The position where this token was - * found. - * - * @return void - */ - protected function processTokenOutsideScope(File $phpcsFile, $stackPtr) - { - $functionName = $phpcsFile->getDeclarationName($stackPtr); - if ($functionName === null) { - return; - } - - $errorData = [$functionName]; - - // Does this function claim to be magical? - if (preg_match('|^__[^_]|', $functionName) !== 0) { - $error = 'Function name "%s" is invalid; only PHP magic methods should be prefixed with a double underscore'; - $phpcsFile->addError($error, $stackPtr, 'DoubleUnderscore', $errorData); - - $functionName = ltrim($functionName, '_'); - } - - if (Common::isCamelCaps($functionName, false, true, false) === false) { - $error = 'Function name "%s" is not in camel caps format'; - $phpcsFile->addError($error, $stackPtr, 'NotCamelCaps', $errorData); - } - - }//end processTokenOutsideScope() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/NamingConventions/ValidVariableNameSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/NamingConventions/ValidVariableNameSniff.php deleted file mode 100644 index 47e052d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/NamingConventions/ValidVariableNameSniff.php +++ /dev/null @@ -1,190 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\NamingConventions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\AbstractVariableSniff; -use PHP_CodeSniffer\Util\Common; -use PHP_CodeSniffer\Util\Tokens; - -class ValidVariableNameSniff extends AbstractVariableSniff -{ - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - protected function processVariable(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $varName = ltrim($tokens[$stackPtr]['content'], '$'); - - // If it's a php reserved var, then its ok. - if (isset($this->phpReservedVars[$varName]) === true) { - return; - } - - $objOperator = $phpcsFile->findNext([T_WHITESPACE], ($stackPtr + 1), null, true); - if ($tokens[$objOperator]['code'] === T_OBJECT_OPERATOR - || $tokens[$objOperator]['code'] === T_NULLSAFE_OBJECT_OPERATOR - ) { - // Check to see if we are using a variable from an object. - $var = $phpcsFile->findNext([T_WHITESPACE], ($objOperator + 1), null, true); - if ($tokens[$var]['code'] === T_STRING) { - $bracket = $phpcsFile->findNext([T_WHITESPACE], ($var + 1), null, true); - if ($tokens[$bracket]['code'] !== T_OPEN_PARENTHESIS) { - $objVarName = $tokens[$var]['content']; - - // There is no way for us to know if the var is public or - // private, so we have to ignore a leading underscore if there is - // one and just check the main part of the variable name. - $originalVarName = $objVarName; - if (substr($objVarName, 0, 1) === '_') { - $objVarName = substr($objVarName, 1); - } - - if (Common::isCamelCaps($objVarName, false, true, false) === false) { - $error = 'Member variable "%s" is not in valid camel caps format'; - $data = [$originalVarName]; - $phpcsFile->addError($error, $var, 'MemberNotCamelCaps', $data); - } - }//end if - }//end if - }//end if - - $objOperator = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - if ($tokens[$objOperator]['code'] === T_DOUBLE_COLON) { - // The variable lives within a class, and is referenced like - // this: MyClass::$_variable, so we don't know its scope. - $objVarName = $varName; - if (substr($objVarName, 0, 1) === '_') { - $objVarName = substr($objVarName, 1); - } - - if (Common::isCamelCaps($objVarName, false, true, false) === false) { - $error = 'Member variable "%s" is not in valid camel caps format'; - $data = [$tokens[$stackPtr]['content']]; - $phpcsFile->addError($error, $stackPtr, 'MemberNotCamelCaps', $data); - } - - return; - } - - // There is no way for us to know if the var is public or private, - // so we have to ignore a leading underscore if there is one and just - // check the main part of the variable name. - $originalVarName = $varName; - if (substr($varName, 0, 1) === '_') { - $inClass = $phpcsFile->hasCondition($stackPtr, Tokens::$ooScopeTokens); - if ($inClass === true) { - $varName = substr($varName, 1); - } - } - - if (Common::isCamelCaps($varName, false, true, false) === false) { - $error = 'Variable "%s" is not in valid camel caps format'; - $data = [$originalVarName]; - $phpcsFile->addError($error, $stackPtr, 'NotCamelCaps', $data); - } - - }//end processVariable() - - - /** - * Processes class member variables. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - protected function processMemberVar(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $varName = ltrim($tokens[$stackPtr]['content'], '$'); - $memberProps = $phpcsFile->getMemberProperties($stackPtr); - if (empty($memberProps) === true) { - // Couldn't get any info about this variable, which - // generally means it is invalid or possibly has a parse - // error. Any errors will be reported by the core, so - // we can ignore it. - return; - } - - $public = ($memberProps['scope'] !== 'private'); - $errorData = [$varName]; - - if ($public === true) { - if (substr($varName, 0, 1) === '_') { - $error = '%s member variable "%s" must not contain a leading underscore'; - $data = [ - ucfirst($memberProps['scope']), - $errorData[0], - ]; - $phpcsFile->addError($error, $stackPtr, 'PublicHasUnderscore', $data); - } - } else { - if (substr($varName, 0, 1) !== '_') { - $error = 'Private member variable "%s" must contain a leading underscore'; - $phpcsFile->addError($error, $stackPtr, 'PrivateNoUnderscore', $errorData); - } - } - - // Remove a potential underscore prefix for testing CamelCaps. - $varName = ltrim($varName, '_'); - - if (Common::isCamelCaps($varName, false, true, false) === false) { - $error = 'Member variable "%s" is not in valid camel caps format'; - $phpcsFile->addError($error, $stackPtr, 'MemberNotCamelCaps', $errorData); - } - - }//end processMemberVar() - - - /** - * Processes the variable found within a double quoted string. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the double quoted - * string. - * - * @return void - */ - protected function processVariableInString(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (preg_match_all('|[^\\\]\${?([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)|', $tokens[$stackPtr]['content'], $matches) !== 0) { - foreach ($matches[1] as $varName) { - // If it's a php reserved var, then its ok. - if (isset($this->phpReservedVars[$varName]) === true) { - continue; - } - - if (Common::isCamelCaps($varName, false, true, false) === false) { - $error = 'Variable "%s" is not in valid camel caps format'; - $data = [$varName]; - $phpcsFile->addError($error, $stackPtr, 'StringNotCamelCaps', $data); - } - } - } - - }//end processVariableInString() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Objects/DisallowObjectStringIndexSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Objects/DisallowObjectStringIndexSniff.php deleted file mode 100644 index 87fde75..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Objects/DisallowObjectStringIndexSniff.php +++ /dev/null @@ -1,124 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Objects; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; - -class DisallowObjectStringIndexSniff implements Sniff, DeprecatedSniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['JS']; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_OPEN_SQUARE_BRACKET]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Check if the next non whitespace token is a string. - $index = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($tokens[$index]['code'] !== T_CONSTANT_ENCAPSED_STRING) { - return; - } - - // Make sure it is the only thing in the square brackets. - $next = $phpcsFile->findNext(T_WHITESPACE, ($index + 1), null, true); - if ($tokens[$next]['code'] !== T_CLOSE_SQUARE_BRACKET) { - return; - } - - // Allow indexes that have dots in them because we can't write - // them in dot notation. - $content = trim($tokens[$index]['content'], '"\' '); - if (strpos($content, '.') !== false) { - return; - } - - // Also ignore reserved words. - if ($content === 'super') { - return; - } - - // Token before the opening square bracket cannot be a var name. - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - if ($tokens[$prev]['code'] === T_STRING) { - $error = 'Object indexes must be written in dot notation'; - $phpcsFile->addError($error, $prev, 'Found'); - } - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'Support for scanning JavaScript files will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Objects/ObjectInstantiationSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Objects/ObjectInstantiationSniff.php deleted file mode 100644 index 701fd16..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Objects/ObjectInstantiationSniff.php +++ /dev/null @@ -1,85 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Objects; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ObjectInstantiationSniff implements Sniff -{ - - - /** - * Registers the token types that this sniff wishes to listen to. - * - * @return array - */ - public function register() - { - return [T_NEW]; - - }//end register() - - - /** - * Process the tokens that this sniff is listening for. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $allowedTokens = Tokens::$emptyTokens; - $allowedTokens[] = T_BITWISE_AND; - - $prev = $phpcsFile->findPrevious($allowedTokens, ($stackPtr - 1), null, true); - - $allowedTokens = [ - T_EQUAL => T_EQUAL, - T_COALESCE_EQUAL => T_COALESCE_EQUAL, - T_DOUBLE_ARROW => T_DOUBLE_ARROW, - T_FN_ARROW => T_FN_ARROW, - T_MATCH_ARROW => T_MATCH_ARROW, - T_THROW => T_THROW, - T_RETURN => T_RETURN, - ]; - - if (isset($allowedTokens[$tokens[$prev]['code']]) === true) { - return; - } - - $ternaryLikeTokens = [ - T_COALESCE => true, - T_INLINE_THEN => true, - T_INLINE_ELSE => true, - ]; - - // For ternary like tokens, walk a little further back to see if it is preceded by - // one of the allowed tokens (within the same statement). - if (isset($ternaryLikeTokens[$tokens[$prev]['code']]) === true) { - $hasAllowedBefore = $phpcsFile->findPrevious($allowedTokens, ($prev - 1), null, false, null, true); - if ($hasAllowedBefore !== false) { - return; - } - } - - $error = 'New objects must be assigned to a variable'; - $phpcsFile->addError($error, $stackPtr, 'NotAssigned'); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Objects/ObjectMemberCommaSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Objects/ObjectMemberCommaSniff.php deleted file mode 100644 index 63c8fbd..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Objects/ObjectMemberCommaSniff.php +++ /dev/null @@ -1,103 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Objects; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ObjectMemberCommaSniff implements Sniff, DeprecatedSniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['JS']; - - - /** - * Registers the token types that this sniff wishes to listen to. - * - * @return array - */ - public function register() - { - return [T_CLOSE_OBJECT]; - - }//end register() - - - /** - * Process the tokens that this sniff is listening for. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($tokens[$prev]['code'] === T_COMMA) { - $error = 'Last member of object must not be followed by a comma'; - $fix = $phpcsFile->addFixableError($error, $prev, 'Found'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($prev, ''); - } - } - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'Support for scanning JavaScript files will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Operators/ComparisonOperatorUsageSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Operators/ComparisonOperatorUsageSniff.php deleted file mode 100644 index 38f0760..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Operators/ComparisonOperatorUsageSniff.php +++ /dev/null @@ -1,235 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Operators; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ComparisonOperatorUsageSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - /** - * A list of valid comparison operators. - * - * @var array - */ - private static $validOps = [ - T_IS_IDENTICAL => true, - T_IS_NOT_IDENTICAL => true, - T_LESS_THAN => true, - T_GREATER_THAN => true, - T_IS_GREATER_OR_EQUAL => true, - T_IS_SMALLER_OR_EQUAL => true, - T_INSTANCEOF => true, - ]; - - /** - * A list of invalid operators with their alternatives. - * - * @var array> - */ - private static $invalidOps = [ - 'PHP' => [ - T_IS_EQUAL => '===', - T_IS_NOT_EQUAL => '!==', - T_BOOLEAN_NOT => '=== FALSE', - ], - 'JS' => [ - T_IS_EQUAL => '===', - T_IS_NOT_EQUAL => '!==', - ], - ]; - - - /** - * Registers the token types that this sniff wishes to listen to. - * - * @return array - */ - public function register() - { - return [ - T_IF, - T_ELSEIF, - T_INLINE_THEN, - T_WHILE, - T_FOR, - ]; - - }//end register() - - - /** - * Process the tokens that this sniff is listening for. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where the token - * was found. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $tokenizer = $phpcsFile->tokenizerType; - - if ($tokens[$stackPtr]['code'] === T_INLINE_THEN) { - $end = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($tokens[$end]['code'] !== T_CLOSE_PARENTHESIS) { - // This inline IF statement does not have its condition - // bracketed, so we need to guess where it starts. - for ($i = ($end - 1); $i >= 0; $i--) { - if ($tokens[$i]['code'] === T_SEMICOLON) { - // Stop here as we assume it is the end - // of the previous statement. - break; - } else if ($tokens[$i]['code'] === T_OPEN_TAG) { - // Stop here as this is the start of the file. - break; - } else if ($tokens[$i]['code'] === T_CLOSE_CURLY_BRACKET) { - // Stop if this is the closing brace of - // a code block. - if (isset($tokens[$i]['scope_opener']) === true) { - break; - } - } else if ($tokens[$i]['code'] === T_OPEN_CURLY_BRACKET) { - // Stop if this is the opening brace of - // a code block. - if (isset($tokens[$i]['scope_closer']) === true) { - break; - } - } else if ($tokens[$i]['code'] === T_OPEN_PARENTHESIS) { - // Stop if this is the start of a pair of - // parentheses that surrounds the inline - // IF statement. - if (isset($tokens[$i]['parenthesis_closer']) === true - && $tokens[$i]['parenthesis_closer'] >= $stackPtr - ) { - break; - } - }//end if - }//end for - - $start = $phpcsFile->findNext(Tokens::$emptyTokens, ($i + 1), null, true); - } else { - if (isset($tokens[$end]['parenthesis_opener']) === false) { - return; - } - - $start = $tokens[$end]['parenthesis_opener']; - }//end if - } else if ($tokens[$stackPtr]['code'] === T_FOR) { - if (isset($tokens[$stackPtr]['parenthesis_opener']) === false) { - return; - } - - $openingBracket = $tokens[$stackPtr]['parenthesis_opener']; - $closingBracket = $tokens[$stackPtr]['parenthesis_closer']; - - $start = $phpcsFile->findNext(T_SEMICOLON, $openingBracket, $closingBracket); - $end = $phpcsFile->findNext(T_SEMICOLON, ($start + 1), $closingBracket); - if ($start === false || $end === false) { - return; - } - } else { - if (isset($tokens[$stackPtr]['parenthesis_opener']) === false) { - return; - } - - $start = $tokens[$stackPtr]['parenthesis_opener']; - $end = $tokens[$stackPtr]['parenthesis_closer']; - }//end if - - $requiredOps = 0; - $foundOps = 0; - $foundBooleans = 0; - - $lastNonEmpty = $start; - - for ($i = $start; $i <= $end; $i++) { - $type = $tokens[$i]['code']; - if (isset(self::$invalidOps[$tokenizer][$type]) === true) { - $error = 'Operator %s prohibited; use %s instead'; - $data = [ - $tokens[$i]['content'], - self::$invalidOps[$tokenizer][$type], - ]; - $phpcsFile->addError($error, $i, 'NotAllowed', $data); - $foundOps++; - } else if (isset(self::$validOps[$type]) === true) { - $foundOps++; - } - - if ($type === T_OPEN_PARENTHESIS - && isset($tokens[$i]['parenthesis_closer']) === true - && isset(Tokens::$functionNameTokens[$tokens[$lastNonEmpty]['code']]) === true - ) { - $i = $tokens[$i]['parenthesis_closer']; - $lastNonEmpty = $i; - continue; - } - - if ($tokens[$i]['code'] === T_TRUE || $tokens[$i]['code'] === T_FALSE) { - $foundBooleans++; - } - - if ($phpcsFile->tokenizerType !== 'JS' - && ($tokens[$i]['code'] === T_BOOLEAN_AND - || $tokens[$i]['code'] === T_BOOLEAN_OR) - ) { - $requiredOps++; - - // When the instanceof operator is used with another operator - // like ===, you can get more ops than are required. - if ($foundOps > $requiredOps) { - $foundOps = $requiredOps; - } - - // If we get to here and we have not found the right number of - // comparison operators, then we must have had an implicit - // true operation i.e., if ($a) instead of the required - // if ($a === true), so let's add an error. - if ($requiredOps !== $foundOps) { - $error = 'Implicit true comparisons prohibited; use === TRUE instead'; - $phpcsFile->addError($error, $stackPtr, 'ImplicitTrue'); - $foundOps++; - } - } - - if (isset(Tokens::$emptyTokens[$type]) === false) { - $lastNonEmpty = $i; - } - }//end for - - $requiredOps++; - - if ($phpcsFile->tokenizerType !== 'JS' - && $foundOps < $requiredOps - && ($requiredOps !== $foundBooleans) - ) { - $error = 'Implicit true comparisons prohibited; use === TRUE instead'; - $phpcsFile->addError($error, $stackPtr, 'ImplicitTrue'); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Operators/IncrementDecrementUsageSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Operators/IncrementDecrementUsageSniff.php deleted file mode 100644 index bbd0841..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Operators/IncrementDecrementUsageSniff.php +++ /dev/null @@ -1,231 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Operators; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class IncrementDecrementUsageSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_EQUAL, - T_PLUS_EQUAL, - T_MINUS_EQUAL, - T_INC, - T_DEC, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['code'] === T_INC || $tokens[$stackPtr]['code'] === T_DEC) { - $this->processIncDec($phpcsFile, $stackPtr); - } else { - $this->processAssignment($phpcsFile, $stackPtr); - } - - }//end process() - - - /** - * Checks to ensure increment and decrement operators are not confusing. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - protected function processIncDec($phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Work out where the variable is so we know where to - // start looking for other operators. - if ($tokens[($stackPtr - 1)]['code'] === T_VARIABLE - || ($tokens[($stackPtr - 1)]['code'] === T_STRING - && ($tokens[($stackPtr - 2)]['code'] === T_OBJECT_OPERATOR - || $tokens[($stackPtr - 2)]['code'] === T_NULLSAFE_OBJECT_OPERATOR)) - ) { - $start = ($stackPtr + 1); - } else { - $start = ($stackPtr + 2); - } - - $next = $phpcsFile->findNext(Tokens::$emptyTokens, $start, null, true); - if ($next === false) { - return; - } - - if (isset(Tokens::$arithmeticTokens[$tokens[$next]['code']]) === true) { - $error = 'Increment and decrement operators cannot be used in an arithmetic operation'; - $phpcsFile->addError($error, $stackPtr, 'NotAllowed'); - return; - } - - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($start - 3), null, true); - if ($prev === false) { - return; - } - - // Check if this is in a string concat. - if ($tokens[$next]['code'] === T_STRING_CONCAT || $tokens[$prev]['code'] === T_STRING_CONCAT) { - $error = 'Increment and decrement operators must be bracketed when used in string concatenation'; - $phpcsFile->addError($error, $stackPtr, 'NoBrackets'); - } - - }//end processIncDec() - - - /** - * Checks to ensure increment and decrement operators are used. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - protected function processAssignment($phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $assignedVar = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - // Not an assignment, return. - if ($tokens[$assignedVar]['code'] !== T_VARIABLE) { - return; - } - - $statementEnd = $phpcsFile->findNext([T_SEMICOLON, T_CLOSE_PARENTHESIS, T_CLOSE_SQUARE_BRACKET, T_CLOSE_CURLY_BRACKET], $stackPtr); - - // If there is anything other than variables, numbers, spaces or operators we need to return. - $find = Tokens::$emptyTokens; - $find[] = T_LNUMBER; - $find[] = T_VARIABLE; - $find[] = T_PLUS; - $find[] = T_MINUS; - $find[] = T_OPEN_PARENTHESIS; - - $noiseTokens = $phpcsFile->findNext($find, ($stackPtr + 1), $statementEnd, true); - if ($noiseTokens !== false) { - return; - } - - // If we are already using += or -=, we need to ignore - // the statement if a variable is being used. - if ($tokens[$stackPtr]['code'] !== T_EQUAL) { - $nextVar = $phpcsFile->findNext(T_VARIABLE, ($stackPtr + 1), $statementEnd); - if ($nextVar !== false) { - return; - } - } - - if ($tokens[$stackPtr]['code'] === T_EQUAL) { - $nextVar = $stackPtr; - $previousVariable = $stackPtr; - $variableCount = 0; - while (($nextVar = $phpcsFile->findNext(T_VARIABLE, ($nextVar + 1), $statementEnd)) !== false) { - $previousVariable = $nextVar; - $variableCount++; - } - - if ($variableCount !== 1) { - return; - } - - $nextVar = $previousVariable; - if ($tokens[$nextVar]['content'] !== $tokens[$assignedVar]['content']) { - return; - } - } - - // We have only one variable, and it's the same as what is being assigned, - // so we need to check what is being added or subtracted. - $nextNumber = $stackPtr; - $previousNumber = $stackPtr; - $numberCount = 0; - while (($nextNumber = $phpcsFile->findNext([T_LNUMBER], ($nextNumber + 1), $statementEnd, false)) !== false) { - $previousNumber = $nextNumber; - $numberCount++; - } - - if ($numberCount !== 1) { - return; - } - - $nextNumber = $previousNumber; - if ($tokens[$nextNumber]['content'] === '1') { - if ($tokens[$stackPtr]['code'] === T_EQUAL) { - $opToken = $phpcsFile->findNext([T_PLUS, T_MINUS], ($nextVar + 1), $statementEnd); - if ($opToken === false) { - // Operator was before the variable, like: - // $var = 1 + $var; - // So we ignore it. - return; - } - - $operator = $tokens[$opToken]['content']; - } else { - $operator = substr($tokens[$stackPtr]['content'], 0, 1); - } - - // If we are adding or subtracting negative value, the operator - // needs to be reversed. - if ($tokens[$stackPtr]['code'] !== T_EQUAL) { - $negative = $phpcsFile->findPrevious(T_MINUS, ($nextNumber - 1), $stackPtr); - if ($negative !== false) { - if ($operator === '+') { - $operator = '-'; - } else { - $operator = '+'; - } - } - } - - $expected = $operator.$operator.$tokens[$assignedVar]['content']; - $found = $phpcsFile->getTokensAsString($assignedVar, ($statementEnd - $assignedVar + 1)); - - if ($operator === '+') { - $error = 'Increment'; - } else { - $error = 'Decrement'; - } - - $error .= " operators should be used where possible; found \"$found\" but expected \"$expected\""; - $phpcsFile->addError($error, $stackPtr, 'Found'); - }//end if - - }//end processAssignment() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Operators/ValidLogicalOperatorsSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Operators/ValidLogicalOperatorsSniff.php deleted file mode 100644 index e976f21..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Operators/ValidLogicalOperatorsSniff.php +++ /dev/null @@ -1,67 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Operators; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ValidLogicalOperatorsSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_LOGICAL_AND, - T_LOGICAL_OR, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $replacements = [ - 'and' => '&&', - 'or' => '||', - ]; - - $operator = strtolower($tokens[$stackPtr]['content']); - if (isset($replacements[$operator]) === false) { - return; - } - - $error = 'Logical operator "%s" is prohibited; use "%s" instead'; - $data = [ - $operator, - $replacements[$operator], - ]; - $phpcsFile->addError($error, $stackPtr, 'NotAllowed', $data); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/CommentedOutCodeSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/CommentedOutCodeSniff.php deleted file mode 100644 index b7d3fdb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/CommentedOutCodeSniff.php +++ /dev/null @@ -1,283 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP; - -use PHP_CodeSniffer\Exceptions\TokenizerException; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class CommentedOutCodeSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'CSS', - ]; - - /** - * If a comment is more than $maxPercentage% code, a warning will be shown. - * - * @var integer - */ - public $maxPercentage = 35; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_COMMENT]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Ignore comments at the end of code blocks. - if (substr($tokens[$stackPtr]['content'], 0, 6) === '//end ') { - return; - } - - $content = ''; - $lastLineSeen = $tokens[$stackPtr]['line']; - $commentStyle = 'line'; - if (strpos($tokens[$stackPtr]['content'], '/*') === 0) { - $commentStyle = 'block'; - } - - $lastCommentBlockToken = $stackPtr; - for ($i = $stackPtr; $i < $phpcsFile->numTokens; $i++) { - if (isset(Tokens::$emptyTokens[$tokens[$i]['code']]) === false) { - break; - } - - if ($tokens[$i]['code'] === T_WHITESPACE) { - continue; - } - - if (isset(Tokens::$phpcsCommentTokens[$tokens[$i]['code']]) === true) { - $lastLineSeen = $tokens[$i]['line']; - continue; - } - - if ($commentStyle === 'line' - && ($lastLineSeen + 1) <= $tokens[$i]['line'] - && strpos($tokens[$i]['content'], '/*') === 0 - ) { - // First non-whitespace token on a new line is start of a different style comment. - break; - } - - if ($commentStyle === 'line' - && ($lastLineSeen + 1) < $tokens[$i]['line'] - ) { - // Blank line breaks a '//' style comment block. - break; - } - - /* - Trim as much off the comment as possible so we don't - have additional whitespace tokens or comment tokens - */ - - $tokenContent = trim($tokens[$i]['content']); - $break = false; - - if ($commentStyle === 'line') { - if (substr($tokenContent, 0, 2) === '//') { - $tokenContent = substr($tokenContent, 2); - } - - if (substr($tokenContent, 0, 1) === '#') { - $tokenContent = substr($tokenContent, 1); - } - } else { - if (substr($tokenContent, 0, 3) === '/**') { - $tokenContent = substr($tokenContent, 3); - } - - if (substr($tokenContent, 0, 2) === '/*') { - $tokenContent = substr($tokenContent, 2); - } - - if (substr($tokenContent, -2) === '*/') { - $tokenContent = substr($tokenContent, 0, -2); - $break = true; - } - - if (substr($tokenContent, 0, 1) === '*') { - $tokenContent = substr($tokenContent, 1); - } - }//end if - - $content .= $tokenContent.$phpcsFile->eolChar; - $lastLineSeen = $tokens[$i]['line']; - - $lastCommentBlockToken = $i; - - if ($break === true) { - // Closer of a block comment found. - break; - } - }//end for - - // Ignore typical warning suppression annotations from other tools. - if (preg_match('`^\s*@[A-Za-z()\._-]+\s*$`', $content) === 1) { - return ($lastCommentBlockToken + 1); - } - - // Quite a few comments use multiple dashes, equals signs etc - // to frame comments and licence headers. - $content = preg_replace('/[-=#*]{2,}/', '-', $content); - - // Random numbers sitting inside the content can throw parse errors - // for invalid literals in PHP7+, so strip those. - $content = preg_replace('/\d+/', '', $content); - - $content = trim($content); - - if ($content === '') { - return ($lastCommentBlockToken + 1); - } - - if ($phpcsFile->tokenizerType === 'PHP') { - $content = ''; - } - - // Because we are not really parsing code, the tokenizer can throw all sorts - // of errors that don't mean anything, so ignore them. - $oldErrors = ini_get('error_reporting'); - ini_set('error_reporting', 0); - try { - $tokenizerClass = get_class($phpcsFile->tokenizer); - $tokenizer = new $tokenizerClass($content, $phpcsFile->config, $phpcsFile->eolChar); - $stringTokens = $tokenizer->getTokens(); - } catch (TokenizerException $e) { - // We couldn't check the comment, so ignore it. - ini_set('error_reporting', $oldErrors); - return ($lastCommentBlockToken + 1); - } - - ini_set('error_reporting', $oldErrors); - - $numTokens = count($stringTokens); - - /* - We know what the first two and last two tokens should be - (because we put them there) so ignore this comment if those - tokens were not parsed correctly. It obviously means this is not - valid code. - */ - - // First token is always the opening tag. - if ($stringTokens[0]['code'] !== T_OPEN_TAG) { - return ($lastCommentBlockToken + 1); - } else { - array_shift($stringTokens); - --$numTokens; - } - - // Last token is always the closing tag, unless something went wrong. - if (isset($stringTokens[($numTokens - 1)]) === false - || $stringTokens[($numTokens - 1)]['code'] !== T_CLOSE_TAG - ) { - return ($lastCommentBlockToken + 1); - } else { - array_pop($stringTokens); - --$numTokens; - } - - // Second last token is always whitespace or a comment, depending - // on the code inside the comment. - if ($phpcsFile->tokenizerType === 'PHP') { - if (isset(Tokens::$emptyTokens[$stringTokens[($numTokens - 1)]['code']]) === false) { - return ($lastCommentBlockToken + 1); - } - - if ($stringTokens[($numTokens - 1)]['code'] === T_WHITESPACE) { - array_pop($stringTokens); - --$numTokens; - } - } - - $emptyTokens = [ - T_WHITESPACE => true, - T_STRING => true, - T_STRING_CONCAT => true, - T_ENCAPSED_AND_WHITESPACE => true, - T_NONE => true, - T_COMMENT => true, - ]; - $emptyTokens += Tokens::$phpcsCommentTokens; - - $numCode = 0; - $numNonWhitespace = 0; - - for ($i = 0; $i < $numTokens; $i++) { - // Do not count comments. - if (isset($emptyTokens[$stringTokens[$i]['code']]) === false - // Commented out HTML/XML and other docs contain a lot of these - // characters, so it is best to not use them directly. - && isset(Tokens::$comparisonTokens[$stringTokens[$i]['code']]) === false - && isset(Tokens::$arithmeticTokens[$stringTokens[$i]['code']]) === false - && $stringTokens[$i]['code'] !== T_GOTO_LABEL - ) { - // Looks like code. - $numCode++; - } - - if ($stringTokens[$i]['code'] !== T_WHITESPACE) { - ++$numNonWhitespace; - } - } - - // Ignore comments with only two or less non-whitespace tokens. - // Sample size too small for a reliably determination. - if ($numNonWhitespace <= 2) { - return ($lastCommentBlockToken + 1); - } - - $percentCode = ceil((($numCode / $numTokens) * 100)); - if ($percentCode > $this->maxPercentage) { - // Just in case. - $percentCode = min(100, $percentCode); - - $error = 'This comment is %s%% valid code; is this commented out code?'; - $data = [$percentCode]; - $phpcsFile->addWarning($error, $stackPtr, 'Found', $data); - } - - return ($lastCommentBlockToken + 1); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowBooleanStatementSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowBooleanStatementSniff.php deleted file mode 100644 index 7ba25ad..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowBooleanStatementSniff.php +++ /dev/null @@ -1,59 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class DisallowBooleanStatementSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return Tokens::$booleanOperators; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - if (isset($tokens[$stackPtr]['nested_parenthesis']) === true) { - foreach ($tokens[$stackPtr]['nested_parenthesis'] as $open => $close) { - if (isset($tokens[$open]['parenthesis_owner']) === true) { - // Any owner means we are not just a simple statement. - return; - } - } - } - - $error = 'Boolean operators are not allowed outside of control structure conditions'; - $phpcsFile->addError($error, $stackPtr, 'Found'); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowComparisonAssignmentSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowComparisonAssignmentSniff.php deleted file mode 100644 index bb07456..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowComparisonAssignmentSniff.php +++ /dev/null @@ -1,112 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class DisallowComparisonAssignmentSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_EQUAL]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Ignore default value assignments in function definitions. - $function = $phpcsFile->findPrevious(T_FUNCTION, ($stackPtr - 1), null, false, null, true); - if ($function !== false) { - $opener = $tokens[$function]['parenthesis_opener']; - $closer = $tokens[$function]['parenthesis_closer']; - if ($opener < $stackPtr && $closer > $stackPtr) { - return; - } - } - - // Ignore values in array definitions or match structures. - $nextNonEmpty = $phpcsFile->findNext( - Tokens::$emptyTokens, - ($stackPtr + 1), - null, - true - ); - - if ($nextNonEmpty !== false - && ($tokens[$nextNonEmpty]['code'] === T_ARRAY - || $tokens[$nextNonEmpty]['code'] === T_MATCH) - ) { - return; - } - - // Ignore function calls. - $ignore = [ - T_NULLSAFE_OBJECT_OPERATOR, - T_OBJECT_OPERATOR, - T_STRING, - T_VARIABLE, - T_WHITESPACE, - ]; - - $next = $phpcsFile->findNext($ignore, ($stackPtr + 1), null, true); - if ($tokens[$next]['code'] === T_CLOSURE - || ($tokens[$next]['code'] === T_OPEN_PARENTHESIS - && $tokens[($next - 1)]['code'] === T_STRING) - ) { - // Code will look like: $var = myFunction( - // and will be ignored. - return; - } - - $endStatement = $phpcsFile->findEndOfStatement($stackPtr); - for ($i = ($stackPtr + 1); $i < $endStatement; $i++) { - if ((isset(Tokens::$comparisonTokens[$tokens[$i]['code']]) === true - && $tokens[$i]['code'] !== T_COALESCE) - || $tokens[$i]['code'] === T_INLINE_THEN - ) { - $error = 'The value of a comparison must not be assigned to a variable'; - $phpcsFile->addError($error, $stackPtr, 'AssignedComparison'); - break; - } - - if (isset(Tokens::$booleanOperators[$tokens[$i]['code']]) === true - || $tokens[$i]['code'] === T_BOOLEAN_NOT - ) { - $error = 'The value of a boolean operation must not be assigned to a variable'; - $phpcsFile->addError($error, $stackPtr, 'AssignedBool'); - break; - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowInlineIfSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowInlineIfSniff.php deleted file mode 100644 index caa3e61..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowInlineIfSniff.php +++ /dev/null @@ -1,57 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class DisallowInlineIfSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_INLINE_THEN]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $phpcsFile->addError('Inline IF statements are not allowed', $stackPtr, 'Found'); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowMultipleAssignmentsSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowMultipleAssignmentsSniff.php deleted file mode 100644 index 7a3d3b9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowMultipleAssignmentsSniff.php +++ /dev/null @@ -1,196 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class DisallowMultipleAssignmentsSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_EQUAL]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Ignore default value assignments in function definitions. - $function = $phpcsFile->findPrevious([T_FUNCTION, T_CLOSURE, T_FN], ($stackPtr - 1), null, false, null, true); - if ($function !== false) { - if (isset($tokens[$function]['parenthesis_closer']) === false) { - // Live coding/parse error. Bow out. - return; - } - - $opener = $tokens[$function]['parenthesis_opener']; - $closer = $tokens[$function]['parenthesis_closer']; - if ($opener < $stackPtr && $closer > $stackPtr) { - return; - } - } - - // Ignore assignments in WHILE loop conditions. - if (isset($tokens[$stackPtr]['nested_parenthesis']) === true) { - $nested = $tokens[$stackPtr]['nested_parenthesis']; - foreach ($nested as $opener => $closer) { - if (isset($tokens[$opener]['parenthesis_owner']) === true - && $tokens[$tokens[$opener]['parenthesis_owner']]['code'] === T_WHILE - ) { - return; - } - } - } - - // Ignore member var definitions. - if (empty($tokens[$stackPtr]['conditions']) === false) { - $conditions = $tokens[$stackPtr]['conditions']; - end($conditions); - $deepestScope = key($conditions); - if (isset(Tokens::$ooScopeTokens[$tokens[$deepestScope]['code']]) === true) { - return; - } - } - - /* - The general rule is: - Find an equal sign and go backwards along the line. If you hit an - end bracket, skip to the opening bracket. When you find a variable, - stop. That variable must be the first non-empty token on the line - or in the statement. If not, throw an error. - */ - - for ($varToken = ($stackPtr - 1); $varToken >= 0; $varToken--) { - if (in_array($tokens[$varToken]['code'], [T_SEMICOLON, T_OPEN_CURLY_BRACKET, T_CLOSE_TAG], true) === true) { - // We've reached the previous statement, so we didn't find a variable. - return; - } - - // Skip brackets. - if (isset($tokens[$varToken]['parenthesis_opener']) === true && $tokens[$varToken]['parenthesis_opener'] < $varToken) { - $varToken = $tokens[$varToken]['parenthesis_opener']; - continue; - } - - if (isset($tokens[$varToken]['bracket_opener']) === true) { - $varToken = $tokens[$varToken]['bracket_opener']; - continue; - } - - if ($tokens[$varToken]['code'] === T_VARIABLE) { - $prevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($varToken - 1), null, true); - if ($tokens[$prevNonEmpty]['code'] === T_OBJECT_OPERATOR) { - // Dynamic property access, the real "start" variable still needs to be found. - $varToken = $prevNonEmpty; - continue; - } - - // We found our variable. - break; - } - }//end for - - if ($varToken <= 0) { - // Didn't find a variable. - return; - } - - $start = $phpcsFile->findStartOfStatement($varToken); - - $allowed = Tokens::$emptyTokens; - - $allowed[T_STRING] = T_STRING; - $allowed[T_NS_SEPARATOR] = T_NS_SEPARATOR; - $allowed[T_DOUBLE_COLON] = T_DOUBLE_COLON; - $allowed[T_ASPERAND] = T_ASPERAND; - $allowed[T_DOLLAR] = T_DOLLAR; - $allowed[T_SELF] = T_SELF; - $allowed[T_PARENT] = T_PARENT; - $allowed[T_STATIC] = T_STATIC; - - $varToken = $phpcsFile->findPrevious($allowed, ($varToken - 1), null, true); - - if ($varToken < $start - && $tokens[$varToken]['code'] !== T_OPEN_PARENTHESIS - && $tokens[$varToken]['code'] !== T_OPEN_SQUARE_BRACKET - ) { - $varToken = $start; - } - - // Ignore the first part of FOR loops as we are allowed to - // assign variables there even though the variable is not the - // first thing on the line. - if ($tokens[$varToken]['code'] === T_OPEN_PARENTHESIS && isset($tokens[$varToken]['parenthesis_owner']) === true) { - $owner = $tokens[$varToken]['parenthesis_owner']; - if ($tokens[$owner]['code'] === T_FOR) { - return; - } - } - - if ($tokens[$varToken]['code'] === T_VARIABLE - || $tokens[$varToken]['code'] === T_OPEN_TAG - || $tokens[$varToken]['code'] === T_GOTO_LABEL - || $tokens[$varToken]['code'] === T_INLINE_THEN - || $tokens[$varToken]['code'] === T_INLINE_ELSE - || $tokens[$varToken]['code'] === T_SEMICOLON - || $tokens[$varToken]['code'] === T_CLOSE_PARENTHESIS - || isset($allowed[$tokens[$varToken]['code']]) === true - ) { - return; - } - - $error = 'Assignments must be the first block of code on a line'; - $errorCode = 'Found'; - - if (isset($nested) === true) { - $controlStructures = [ - T_IF => T_IF, - T_ELSEIF => T_ELSEIF, - T_SWITCH => T_SWITCH, - T_CASE => T_CASE, - T_FOR => T_FOR, - T_MATCH => T_MATCH, - ]; - foreach ($nested as $opener => $closer) { - if (isset($tokens[$opener]['parenthesis_owner']) === true - && isset($controlStructures[$tokens[$tokens[$opener]['parenthesis_owner']]['code']]) === true - ) { - $errorCode .= 'InControlStructure'; - break; - } - } - } - - $phpcsFile->addError($error, $stackPtr, $errorCode); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowSizeFunctionsInLoopsSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowSizeFunctionsInLoopsSniff.php deleted file mode 100644 index f343f3c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DisallowSizeFunctionsInLoopsSniff.php +++ /dev/null @@ -1,116 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class DisallowSizeFunctionsInLoopsSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - /** - * An array of functions we don't want in the condition of loops. - * - * @var array - */ - protected $forbiddenFunctions = [ - 'PHP' => [ - 'sizeof' => true, - 'strlen' => true, - 'count' => true, - ], - 'JS' => ['length' => true], - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_WHILE, - T_FOR, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $tokenizer = $phpcsFile->tokenizerType; - $openBracket = $tokens[$stackPtr]['parenthesis_opener']; - $closeBracket = $tokens[$stackPtr]['parenthesis_closer']; - - if ($tokens[$stackPtr]['code'] === T_FOR) { - // We only want to check the condition in FOR loops. - $start = $phpcsFile->findNext(T_SEMICOLON, ($openBracket + 1)); - $end = $phpcsFile->findPrevious(T_SEMICOLON, ($closeBracket - 1)); - } else { - $start = $openBracket; - $end = $closeBracket; - } - - for ($i = ($start + 1); $i < $end; $i++) { - if ($tokens[$i]['code'] === T_STRING - && isset($this->forbiddenFunctions[$tokenizer][$tokens[$i]['content']]) === true - ) { - $functionName = $tokens[$i]['content']; - if ($tokenizer === 'JS') { - // Needs to be in the form object.function to be valid. - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($i - 1), null, true); - if ($prev === false || $tokens[$prev]['code'] !== T_OBJECT_OPERATOR) { - continue; - } - - $functionName = 'object.'.$functionName; - } else { - // Make sure it isn't a member var. - if ($tokens[($i - 1)]['code'] === T_OBJECT_OPERATOR - || $tokens[($i - 1)]['code'] === T_NULLSAFE_OBJECT_OPERATOR - ) { - continue; - } - - $functionName .= '()'; - } - - $error = 'The use of %s inside a loop condition is not allowed; assign the return value to a variable and use the variable in the loop condition instead'; - $data = [$functionName]; - $phpcsFile->addError($error, $i, 'Found', $data); - }//end if - }//end for - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DiscouragedFunctionsSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DiscouragedFunctionsSniff.php deleted file mode 100644 index b1c856f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/DiscouragedFunctionsSniff.php +++ /dev/null @@ -1,38 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP; - -use PHP_CodeSniffer\Standards\Generic\Sniffs\PHP\ForbiddenFunctionsSniff as GenericForbiddenFunctionsSniff; - -class DiscouragedFunctionsSniff extends GenericForbiddenFunctionsSniff -{ - - /** - * A list of forbidden functions with their alternatives. - * - * The value is NULL if no alternative exists. IE, the - * function should just not be used. - * - * @var array - */ - public $forbiddenFunctions = [ - 'error_log' => null, - 'print_r' => null, - 'var_dump' => null, - ]; - - /** - * If true, an error will be thrown; otherwise a warning. - * - * @var boolean - */ - public $error = false; - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/EmbeddedPhpSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/EmbeddedPhpSniff.php deleted file mode 100644 index 8bde284..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/EmbeddedPhpSniff.php +++ /dev/null @@ -1,524 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class EmbeddedPhpSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_OPEN_TAG, - T_OPEN_TAG_WITH_ECHO, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // If the close php tag is on the same line as the opening - // then we have an inline embedded PHP block. - $closeTag = $phpcsFile->findNext(T_CLOSE_TAG, $stackPtr); - if ($closeTag === false || $tokens[$stackPtr]['line'] !== $tokens[$closeTag]['line']) { - $this->validateMultilineEmbeddedPhp($phpcsFile, $stackPtr, $closeTag); - } else { - $this->validateInlineEmbeddedPhp($phpcsFile, $stackPtr, $closeTag); - } - - }//end process() - - - /** - * Validates embedded PHP that exists on multiple lines. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * @param int|false $closingTag The position of the PHP close tag in the - * stack passed in $tokens. - * - * @return void - */ - private function validateMultilineEmbeddedPhp($phpcsFile, $stackPtr, $closingTag) - { - $tokens = $phpcsFile->getTokens(); - - $prevTag = $phpcsFile->findPrevious($this->register(), ($stackPtr - 1)); - if ($prevTag === false) { - // This is the first open tag. - return; - } - - $firstContent = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($firstContent === false) { - // Unclosed PHP open tag at the end of a file. Nothing to do. - return; - } - - if ($closingTag !== false) { - $firstContentAfterBlock = $phpcsFile->findNext(T_WHITESPACE, ($closingTag + 1), $phpcsFile->numTokens, true); - if ($firstContentAfterBlock === false) { - // Final closing tag. It will be handled elsewhere. - return; - } - - // We have an opening and a closing tag, that lie within other content. - if ($firstContent === $closingTag) { - $this->reportEmptyTagSet($phpcsFile, $stackPtr, $closingTag); - return; - } - }//end if - - if ($tokens[$firstContent]['line'] === $tokens[$stackPtr]['line']) { - $error = 'Opening PHP tag must be on a line by itself'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'ContentAfterOpen'); - if ($fix === true) { - $padding = $this->calculateLineIndent($phpcsFile, $stackPtr); - - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($stackPtr, rtrim($tokens[$stackPtr]['content'])); - $phpcsFile->fixer->addNewline($stackPtr); - $phpcsFile->fixer->addContent($stackPtr, str_repeat(' ', $padding)); - - if ($tokens[($stackPtr + 1)]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } else { - // Check the indent of the first line, except if it is a scope closer. - if (isset($tokens[$firstContent]['scope_closer']) === false - || $tokens[$firstContent]['scope_closer'] !== $firstContent - ) { - // Check for a blank line at the top. - if ($tokens[$firstContent]['line'] > ($tokens[$stackPtr]['line'] + 1)) { - // Find a token on the blank line to throw the error on. - $i = $stackPtr; - do { - $i++; - } while ($tokens[$i]['line'] !== ($tokens[$stackPtr]['line'] + 1)); - - $error = 'Blank line found at start of embedded PHP content'; - $fix = $phpcsFile->addFixableError($error, $i, 'SpacingBefore'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($stackPtr + 1); $i < $firstContent; $i++) { - if ($tokens[$i]['line'] === $tokens[$firstContent]['line'] - || $tokens[$i]['line'] === $tokens[$stackPtr]['line'] - ) { - continue; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - }//end if - - $indent = $this->calculateLineIndent($phpcsFile, $stackPtr); - $contentColumn = ($tokens[$firstContent]['column'] - 1); - if ($contentColumn !== $indent) { - $error = 'First line of embedded PHP code must be indented %s spaces; %s found'; - $data = [ - $indent, - $contentColumn, - ]; - $fix = $phpcsFile->addFixableError($error, $firstContent, 'Indent', $data); - if ($fix === true) { - $padding = str_repeat(' ', $indent); - if ($contentColumn === 0) { - $phpcsFile->fixer->addContentBefore($firstContent, $padding); - } else { - $phpcsFile->fixer->replaceToken(($firstContent - 1), $padding); - } - } - } - }//end if - }//end if - - $lastContentBeforeBlock = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - if ($tokens[$lastContentBeforeBlock]['line'] === $tokens[$stackPtr]['line'] - && (($tokens[$lastContentBeforeBlock]['code'] === T_INLINE_HTML - && trim($tokens[$lastContentBeforeBlock]['content']) !== '') - || ($tokens[($lastContentBeforeBlock - 1)]['code'] !== T_INLINE_HTML - && $tokens[($lastContentBeforeBlock - 1)]['line'] === $tokens[$stackPtr]['line'])) - ) { - $error = 'Opening PHP tag must be on a line by itself'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'ContentBeforeOpen'); - if ($fix === true) { - $padding = $this->calculateLineIndent($phpcsFile, $lastContentBeforeBlock); - - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->addContentBefore($stackPtr, $phpcsFile->eolChar.str_repeat(' ', $padding)); - - // Make sure we don't leave trailing whitespace behind. - if ($tokens[($stackPtr - 1)]['code'] === T_INLINE_HTML - && trim($tokens[($stackPtr - 1)]['content']) === '' - ) { - $phpcsFile->fixer->replaceToken(($stackPtr - 1), ''); - } - - $phpcsFile->fixer->endChangeset(); - }//end if - } else { - // Find the first token on the first non-empty line we find. - for ($first = ($lastContentBeforeBlock - 1); $first > 0; $first--) { - if ($tokens[$first]['line'] === $tokens[$stackPtr]['line']) { - continue; - } else if (trim($tokens[$first]['content']) !== '') { - $first = $phpcsFile->findFirstOnLine([], $first, true); - break; - } - } - - $expected = $this->calculateLineIndent($phpcsFile, $first); - $expected += 4; - $found = ($tokens[$stackPtr]['column'] - 1); - if ($found > $expected) { - $error = 'Opening PHP tag indent incorrect; expected no more than %s spaces but found %s'; - $data = [ - $expected, - $found, - ]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'OpenTagIndent', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr - 1), str_repeat(' ', $expected)); - } - } - }//end if - - if ($closingTag === false) { - return; - } - - $lastContent = $phpcsFile->findPrevious(T_WHITESPACE, ($closingTag - 1), ($stackPtr + 1), true); - $firstContentAfterBlock = $phpcsFile->findNext(T_WHITESPACE, ($closingTag + 1), null, true); - - if ($tokens[$lastContent]['line'] === $tokens[$closingTag]['line']) { - $error = 'Closing PHP tag must be on a line by itself'; - $fix = $phpcsFile->addFixableError($error, $closingTag, 'ContentBeforeEnd'); - if ($fix === true) { - // Calculate the indent for the close tag. - // If the close tag is on the same line as the first content, re-use the indent - // calculated for the first content line to prevent the indent being based on an - // "old" indent, not the _new_ (fixed) indent. - if ($tokens[$firstContent]['line'] === $tokens[$lastContent]['line'] - && isset($indent) === true - ) { - $closerIndent = $indent; - } else { - $closerIndent = $this->calculateLineIndent($phpcsFile, $closingTag); - } - - $phpcsFile->fixer->beginChangeset(); - - if ($tokens[($closingTag - 1)]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->replaceToken(($closingTag - 1), ''); - } - - $phpcsFile->fixer->addContentBefore($closingTag, str_repeat(' ', $closerIndent)); - $phpcsFile->fixer->addNewlineBefore($closingTag); - $phpcsFile->fixer->endChangeset(); - }//end if - } else if ($firstContentAfterBlock !== false - && $tokens[$firstContentAfterBlock]['line'] === $tokens[$closingTag]['line'] - ) { - $error = 'Closing PHP tag must be on a line by itself'; - $fix = $phpcsFile->addFixableError($error, $closingTag, 'ContentAfterEnd'); - if ($fix === true) { - $indent = $this->calculateLineIndent($phpcsFile, $closingTag); - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->addNewline($closingTag); - $phpcsFile->fixer->addContent($closingTag, str_repeat(' ', $indent)); - - if ($tokens[$firstContentAfterBlock]['code'] === T_INLINE_HTML) { - $trimmedHtmlContent = ltrim($tokens[$firstContentAfterBlock]['content']); - if ($trimmedHtmlContent === '') { - // HTML token contains only whitespace and the next token after is PHP, not HTML, so remove the whitespace. - $phpcsFile->fixer->replaceToken($firstContentAfterBlock, ''); - } else { - // The HTML token has content, so remove leading whitespace in favour of the indent. - $phpcsFile->fixer->replaceToken($firstContentAfterBlock, $trimmedHtmlContent); - } - } - - if ($tokens[$firstContentAfterBlock]['code'] === T_OPEN_TAG - || $tokens[$firstContentAfterBlock]['code'] === T_OPEN_TAG_WITH_ECHO - ) { - // Next token is a PHP open tag which will also have thrown an error. - // Prevent both fixers running in the same loop by making sure the token is "touched" during this loop. - // This prevents a stray new line being added between the close and open tags. - $phpcsFile->fixer->replaceToken($firstContentAfterBlock, $tokens[$firstContentAfterBlock]['content']); - } - - $phpcsFile->fixer->endChangeset(); - }//end if - }//end if - - $next = $phpcsFile->findNext($this->register(), ($closingTag + 1)); - if ($next === false) { - return; - } - - // Check for a blank line at the bottom. - $lastNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($closingTag - 1), ($stackPtr + 1), true); - if ((isset($tokens[$lastNonEmpty]['scope_closer']) === false - || $tokens[$lastNonEmpty]['scope_closer'] !== $lastNonEmpty) - && $tokens[$lastContent]['line'] < ($tokens[$closingTag]['line'] - 1) - ) { - // Find a token on the blank line to throw the error on. - $i = $closingTag; - do { - $i--; - } while ($tokens[$i]['line'] !== ($tokens[$closingTag]['line'] - 1)); - - $error = 'Blank line found at end of embedded PHP content'; - $fix = $phpcsFile->addFixableError($error, $i, 'SpacingAfter'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($lastContent + 1); $i < $closingTag; $i++) { - if ($tokens[$i]['line'] === $tokens[$lastContent]['line'] - || $tokens[$i]['line'] === $tokens[$closingTag]['line'] - ) { - continue; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - }//end if - - }//end validateMultilineEmbeddedPhp() - - - /** - * Validates embedded PHP that exists on one line. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * @param int $closeTag The position of the PHP close tag in the - * stack passed in $tokens. - * - * @return void - */ - private function validateInlineEmbeddedPhp($phpcsFile, $stackPtr, $closeTag) - { - $tokens = $phpcsFile->getTokens(); - - $firstContent = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), $closeTag, true); - - if ($firstContent === false) { - $this->reportEmptyTagSet($phpcsFile, $stackPtr, $closeTag); - return; - } - - // Check that there is one, and only one space at the start of the statement. - $leadingSpace = 0; - $isLongOpenTag = false; - if ($tokens[$stackPtr]['code'] === T_OPEN_TAG - && stripos($tokens[$stackPtr]['content'], 'addFixableError($error, $stackPtr, 'SpacingAfterOpen', $data); - if ($fix === true) { - if ($isLongOpenTag === true) { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ''); - } else if ($tokens[($stackPtr + 1)]['code'] === T_WHITESPACE) { - // Short open tag with too much whitespace. - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ' '); - } else { - // Short open tag without whitespace. - $phpcsFile->fixer->addContent($stackPtr, ' '); - } - } - } - - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($closeTag - 1), $stackPtr, true); - if ($prev !== $stackPtr) { - if ((isset($tokens[$prev]['scope_opener']) === false - || $tokens[$prev]['scope_opener'] !== $prev) - && (isset($tokens[$prev]['scope_closer']) === false - || $tokens[$prev]['scope_closer'] !== $prev) - && $tokens[$prev]['code'] !== T_SEMICOLON - ) { - $error = 'Inline PHP statement must end with a semicolon'; - $code = 'NoSemicolon'; - if ($tokens[$stackPtr]['code'] === T_OPEN_TAG_WITH_ECHO) { - $code = 'ShortOpenEchoNoSemicolon'; - } - - $fix = $phpcsFile->addFixableError($error, $stackPtr, $code); - if ($fix === true) { - $phpcsFile->fixer->addContent($prev, ';'); - } - } else if ($tokens[$prev]['code'] === T_SEMICOLON) { - $statementCount = 1; - for ($i = ($stackPtr + 1); $i < $prev; $i++) { - if ($tokens[$i]['code'] === T_SEMICOLON) { - $statementCount++; - } - } - - if ($statementCount > 1) { - $error = 'Inline PHP statement must contain a single statement; %s found'; - $data = [$statementCount]; - $phpcsFile->addError($error, $stackPtr, 'MultipleStatements', $data); - } - }//end if - }//end if - - $trailingSpace = 0; - if ($tokens[($closeTag - 1)]['code'] === T_WHITESPACE) { - $trailingSpace = $tokens[($closeTag - 1)]['length']; - } else if (($tokens[($closeTag - 1)]['code'] === T_COMMENT - || isset(Tokens::$phpcsCommentTokens[$tokens[($closeTag - 1)]['code']]) === true) - && substr($tokens[($closeTag - 1)]['content'], -1) === ' ' - ) { - $trailingSpace = (strlen($tokens[($closeTag - 1)]['content']) - strlen(rtrim($tokens[($closeTag - 1)]['content']))); - } - - if ($trailingSpace !== 1) { - $error = 'Expected 1 space before closing PHP tag; %s found'; - $data = [$trailingSpace]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpacingBeforeClose', $data); - if ($fix === true) { - if ($trailingSpace === 0) { - $phpcsFile->fixer->addContentBefore($closeTag, ' '); - } else if ($tokens[($closeTag - 1)]['code'] === T_COMMENT - || isset(Tokens::$phpcsCommentTokens[$tokens[($closeTag - 1)]['code']]) === true - ) { - $phpcsFile->fixer->replaceToken(($closeTag - 1), rtrim($tokens[($closeTag - 1)]['content']).' '); - } else { - $phpcsFile->fixer->replaceToken(($closeTag - 1), ' '); - } - } - } - - }//end validateInlineEmbeddedPhp() - - - /** - * Report and fix a set of empty PHP tags. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * @param int $closeTag The position of the PHP close tag in the - * stack passed in $tokens. - * - * @return void - */ - private function reportEmptyTagSet(File $phpcsFile, $stackPtr, $closeTag) - { - $tokens = $phpcsFile->getTokens(); - $error = 'Empty embedded PHP tag found'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Empty'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = $stackPtr; $i <= $closeTag; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - // Prevent leaving indentation whitespace behind when the empty tag set is the only thing on the affected lines. - if (isset($tokens[($closeTag + 1)]) === true - && $tokens[($closeTag + 1)]['line'] !== $tokens[$closeTag]['line'] - && $tokens[($stackPtr - 1)]['code'] === T_INLINE_HTML - && $tokens[($stackPtr - 1)]['line'] === $tokens[$stackPtr]['line'] - && $tokens[($stackPtr - 1)]['column'] === 1 - && trim($tokens[($stackPtr - 1)]['content']) === '' - ) { - $phpcsFile->fixer->replaceToken(($stackPtr - 1), ''); - } - - $phpcsFile->fixer->endChangeset(); - } - - }//end reportEmptyTagSet() - - - /** - * Calculate the indent of the line containing the stackPtr. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return int - */ - private function calculateLineIndent(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - for ($firstOnLine = $stackPtr; $tokens[$firstOnLine]['column'] !== 1; $firstOnLine--); - - // Check if this is a subsequent line in a star-slash comment containing leading indent. - // In that case, we'll need the first line of the comment to correctly determine the indent. - while ($tokens[$firstOnLine]['code'] === T_COMMENT - && $tokens[$firstOnLine]['content'] !== ltrim($tokens[$firstOnLine]['content']) - ) { - for (--$firstOnLine; $tokens[$firstOnLine]['column'] !== 1; $firstOnLine--); - } - - $indent = 0; - if ($tokens[$firstOnLine]['code'] === T_WHITESPACE) { - $indent = ($tokens[($firstOnLine + 1)]['column'] - 1); - } else if ($tokens[$firstOnLine]['code'] === T_INLINE_HTML - || $tokens[$firstOnLine]['code'] === T_END_HEREDOC - || $tokens[$firstOnLine]['code'] === T_END_NOWDOC - ) { - $indent = (strlen($tokens[$firstOnLine]['content']) - strlen(ltrim($tokens[$firstOnLine]['content']))); - } else if ($tokens[$firstOnLine]['code'] === T_DOC_COMMENT_WHITESPACE) { - $indent = (strlen($tokens[$firstOnLine]['content']) - strlen(ltrim($tokens[$firstOnLine]['content'])) - 1); - } - - return $indent; - - }//end calculateLineIndent() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/EvalSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/EvalSniff.php deleted file mode 100644 index 6a90ac8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/EvalSniff.php +++ /dev/null @@ -1,48 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class EvalSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_EVAL]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $error = 'Use of eval() is discouraged'; - $phpcsFile->addWarning($error, $stackPtr, 'Discouraged'); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/GlobalKeywordSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/GlobalKeywordSniff.php deleted file mode 100644 index 6a3c8bb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/GlobalKeywordSniff.php +++ /dev/null @@ -1,53 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class GlobalKeywordSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_GLOBAL]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $nextVar = $tokens[$phpcsFile->findNext([T_VARIABLE], $stackPtr)]; - $varName = str_replace('$', '', $nextVar['content']); - $error = 'Use of the "global" keyword is forbidden; use "$GLOBALS[\'%s\']" instead'; - $data = [$varName]; - $phpcsFile->addError($error, $stackPtr, 'NotAllowed', $data); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/HeredocSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/HeredocSniff.php deleted file mode 100644 index 525d0a2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/HeredocSniff.php +++ /dev/null @@ -1,51 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class HeredocSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_START_HEREDOC, - T_START_NOWDOC, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $error = 'Use of heredoc and nowdoc syntax ("<<<") is not allowed; use standard strings or inline HTML instead'; - $phpcsFile->addError($error, $stackPtr, 'NotAllowed'); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/InnerFunctionsSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/InnerFunctionsSniff.php deleted file mode 100644 index a5f467d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/InnerFunctionsSniff.php +++ /dev/null @@ -1,76 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class InnerFunctionsSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_FUNCTION]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['conditions']) === false) { - return; - } - - $conditions = $tokens[$stackPtr]['conditions']; - $reversedConditions = array_reverse($conditions, true); - - $outerFuncToken = null; - foreach ($reversedConditions as $condToken => $condition) { - if ($condition === T_FUNCTION || $condition === T_CLOSURE) { - $outerFuncToken = $condToken; - break; - } - - if (array_key_exists($condition, Tokens::$ooScopeTokens) === true) { - // Ignore methods in OOP structures defined within functions. - return; - } - } - - if ($outerFuncToken === null) { - // Not a nested function. - return; - } - - $error = 'The use of inner functions is forbidden'; - $phpcsFile->addError($error, $stackPtr, 'NotAllowed'); - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/LowercasePHPFunctionsSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/LowercasePHPFunctionsSniff.php deleted file mode 100644 index 6d770e7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/LowercasePHPFunctionsSniff.php +++ /dev/null @@ -1,167 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class LowercasePHPFunctionsSniff implements Sniff -{ - - /** - * Hash map of all php built in function names - * - * @var array - */ - private $builtInFunctions; - - - /** - * Construct the LowercasePHPFunctionSniff - */ - public function __construct() - { - - $allFunctions = get_defined_functions(); - $this->builtInFunctions = array_flip($allFunctions['internal']); - - }//end __construct() - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_STRING]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $content = $tokens[$stackPtr]['content']; - $contentLc = strtolower($content); - if ($content === $contentLc) { - return; - } - - // Make sure it is an inbuilt PHP function. - // PHP_CodeSniffer can possibly include user defined functions - // through the use of vendor/autoload.php. - if (isset($this->builtInFunctions[$contentLc]) === false) { - return; - } - - // Make sure this is a function call or a use statement. - if (empty($tokens[$stackPtr]['nested_attributes']) === false) { - // Class instantiation in attribute, not function call. - return; - } - - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($next === false) { - // Not a function call. - return; - } - - $ignore = Tokens::$emptyTokens; - $ignore[] = T_BITWISE_AND; - $prev = $phpcsFile->findPrevious($ignore, ($stackPtr - 1), null, true); - $prevPrev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($prev - 1), null, true); - - if ($tokens[$next]['code'] !== T_OPEN_PARENTHESIS) { - // Is this a use statement importing a PHP native function ? - if ($tokens[$next]['code'] !== T_NS_SEPARATOR - && $tokens[$prev]['code'] === T_STRING - && $tokens[$prev]['content'] === 'function' - && $prevPrev !== false - && $tokens[$prevPrev]['code'] === T_USE - ) { - $error = 'Use statements for PHP native functions must be lowercase; expected "%s" but found "%s"'; - $data = [ - $contentLc, - $content, - ]; - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'UseStatementUppercase', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, $contentLc); - } - } - - // No open parenthesis; not a "use function" statement nor a function call. - return; - }//end if - - if ($tokens[$prev]['code'] === T_FUNCTION) { - // Function declaration, not a function call. - return; - } - - if ($tokens[$prev]['code'] === T_NS_SEPARATOR) { - if ($prevPrev !== false - && ($tokens[$prevPrev]['code'] === T_STRING - || $tokens[$prevPrev]['code'] === T_NAMESPACE - || $tokens[$prevPrev]['code'] === T_NEW) - ) { - // Namespaced class/function, not an inbuilt function. - // Could potentially give false negatives for non-namespaced files - // when namespace\functionName() is encountered. - return; - } - } - - if ($tokens[$prev]['code'] === T_NEW) { - // Object creation, not an inbuilt function. - return; - } - - if ($tokens[$prev]['code'] === T_OBJECT_OPERATOR - || $tokens[$prev]['code'] === T_NULLSAFE_OBJECT_OPERATOR - ) { - // Not an inbuilt function. - return; - } - - if ($tokens[$prev]['code'] === T_DOUBLE_COLON) { - // Not an inbuilt function. - return; - } - - $error = 'Calls to PHP native functions must be lowercase; expected "%s" but found "%s"'; - $data = [ - $contentLc, - $content, - ]; - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'CallUppercase', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, $contentLc); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/NonExecutableCodeSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/NonExecutableCodeSniff.php deleted file mode 100644 index b52a388..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/PHP/NonExecutableCodeSniff.php +++ /dev/null @@ -1,308 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class NonExecutableCodeSniff implements Sniff -{ - - /** - * Tokens for terminating expressions, which can be used inline. - * - * This is in contrast to terminating statements, which cannot be used inline - * and would result in a parse error (which is not the concern of this sniff). - * - * `throw` can be used as an expression since PHP 8.0. - * {@link https://wiki.php.net/rfc/throw_expression} - * - * @var array - */ - private $expressionTokens = [ - T_EXIT => T_EXIT, - T_THROW => T_THROW, - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_BREAK, - T_CONTINUE, - T_RETURN, - T_THROW, - T_EXIT, - T_GOTO, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - - // Allow for PHP 8.4+ fully qualified use of exit/die. - if ($tokens[$stackPtr]['code'] === T_EXIT && $tokens[$prev]['code'] === T_NS_SEPARATOR) { - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($prev - 1), null, true); - } - - // Tokens which can be used in inline expressions need special handling. - if (isset($this->expressionTokens[$tokens[$stackPtr]['code']]) === true) { - // If this token is preceded by a logical operator, it only relates to one line - // and should be ignored. For example: fopen() or die(). - // Note: There is one exception: throw expressions can not be used with xor. - if (isset(Tokens::$booleanOperators[$tokens[$prev]['code']]) === true - && ($tokens[$stackPtr]['code'] === T_THROW && $tokens[$prev]['code'] === T_LOGICAL_XOR) === false - ) { - return; - } - - // Expressions are allowed in the `else` clause of ternaries. - if ($tokens[$prev]['code'] === T_INLINE_THEN || $tokens[$prev]['code'] === T_INLINE_ELSE) { - return; - } - - // Expressions are allowed with PHP 7.0+ null coalesce and PHP 7.4+ null coalesce equals. - if ($tokens[$prev]['code'] === T_COALESCE || $tokens[$prev]['code'] === T_COALESCE_EQUAL) { - return; - } - - // Expressions are allowed in arrow functions. - if ($tokens[$prev]['code'] === T_FN_ARROW) { - return; - } - }//end if - - // This token may be part of an inline condition. - // If we find a closing parenthesis that belongs to a condition, - // or an "else", we should ignore this token. - if ($tokens[$prev]['code'] === T_ELSE - || (isset($tokens[$prev]['parenthesis_owner']) === true - && ($tokens[$tokens[$prev]['parenthesis_owner']]['code'] === T_IF - || $tokens[$tokens[$prev]['parenthesis_owner']]['code'] === T_ELSEIF)) - ) { - return; - } - - if ($tokens[$stackPtr]['code'] === T_RETURN) { - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($tokens[$next]['code'] === T_SEMICOLON) { - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($next + 1), null, true); - if ($tokens[$next]['code'] === T_CLOSE_CURLY_BRACKET) { - // If this is the closing brace of a function - // then this return statement doesn't return anything - // and is not required anyway. - $owner = $tokens[$next]['scope_condition']; - if ($tokens[$owner]['code'] === T_FUNCTION - || $tokens[$owner]['code'] === T_CLOSURE - ) { - $warning = 'Empty return statement not required here'; - $phpcsFile->addWarning($warning, $stackPtr, 'ReturnNotRequired'); - return; - } - } - } - } - - if (isset($tokens[$stackPtr]['scope_opener']) === true) { - $owner = $tokens[$stackPtr]['scope_condition']; - if ($tokens[$owner]['code'] === T_CASE || $tokens[$owner]['code'] === T_DEFAULT) { - // This token closes the scope of a CASE or DEFAULT statement - // so any code between this statement and the next CASE, DEFAULT or - // end of SWITCH token will not be executable. - $end = $phpcsFile->findEndOfStatement($stackPtr); - $next = $phpcsFile->findNext( - [ - T_CASE, - T_DEFAULT, - T_CLOSE_CURLY_BRACKET, - T_ENDSWITCH, - ], - ($end + 1) - ); - - if ($next !== false) { - $lastLine = $tokens[$end]['line']; - for ($i = ($stackPtr + 1); $i < $next; $i++) { - if (isset(Tokens::$emptyTokens[$tokens[$i]['code']]) === true) { - continue; - } - - $line = $tokens[$i]['line']; - if ($line > $lastLine) { - $type = substr($tokens[$stackPtr]['type'], 2); - $warning = 'Code after the %s statement on line %s cannot be executed'; - $data = [ - $type, - $tokens[$stackPtr]['line'], - ]; - $phpcsFile->addWarning($warning, $i, 'Unreachable', $data); - $lastLine = $line; - } - } - }//end if - - // That's all we have to check for these types of statements. - return; - }//end if - }//end if - - $ourConditions = array_keys($tokens[$stackPtr]['conditions']); - - if (empty($ourConditions) === false) { - $condition = array_pop($ourConditions); - - if (isset($tokens[$condition]['scope_closer']) === false) { - return; - } - - // Special case for BREAK statements sitting directly inside SWITCH - // statements. If we get to this point, we know the BREAK is not being - // used to close a CASE statement, so it is most likely non-executable - // code itself (as is the case when you put return; break; at the end of - // a case). So we need to ignore this token. - if ($tokens[$condition]['code'] === T_SWITCH - && $tokens[$stackPtr]['code'] === T_BREAK - ) { - return; - } - - $closer = $tokens[$condition]['scope_closer']; - - // If the closer for our condition is shared with other openers, - // we will need to throw errors from this token to the next - // shared opener (if there is one), not to the scope closer. - $nextOpener = null; - for ($i = ($stackPtr + 1); $i < $closer; $i++) { - if (isset($tokens[$i]['scope_closer']) === true) { - if ($tokens[$i]['scope_closer'] === $closer) { - // We found an opener that shares the same - // closing token as us. - $nextOpener = $i; - break; - } - } - }//end for - - if ($nextOpener === null) { - $end = $closer; - } else { - $end = ($nextOpener - 1); - } - } else { - // This token is in the global scope. - if ($tokens[$stackPtr]['code'] === T_BREAK) { - return; - } - - // Throw an error for all lines until the end of the file. - $end = ($phpcsFile->numTokens - 1); - }//end if - - // Find the semicolon or closing PHP tag that ends this statement, - // skipping nested statements like FOR loops and closures. - for ($start = ($stackPtr + 1); $start < $phpcsFile->numTokens; $start++) { - if ($start === $end) { - break; - } - - if (isset($tokens[$start]['parenthesis_closer']) === true - && $tokens[$start]['code'] === T_OPEN_PARENTHESIS - ) { - $start = $tokens[$start]['parenthesis_closer']; - continue; - } - - if (isset($tokens[$start]['bracket_closer']) === true - && $tokens[$start]['code'] === T_OPEN_CURLY_BRACKET - ) { - $start = $tokens[$start]['bracket_closer']; - continue; - } - - if ($tokens[$start]['code'] === T_SEMICOLON || $tokens[$start]['code'] === T_CLOSE_TAG) { - break; - } - }//end for - - if (isset($tokens[$start]) === false) { - return; - } - - $lastLine = $tokens[$start]['line']; - for ($i = ($start + 1); $i < $end; $i++) { - if (isset(Tokens::$emptyTokens[$tokens[$i]['code']]) === true - || isset(Tokens::$bracketTokens[$tokens[$i]['code']]) === true - || $tokens[$i]['code'] === T_SEMICOLON - ) { - continue; - } - - // Skip whole functions and classes/interfaces because they are not - // technically executed code, but rather declarations that may be used. - if (isset(Tokens::$ooScopeTokens[$tokens[$i]['code']]) === true - || $tokens[$i]['code'] === T_FUNCTION - || $tokens[$i]['code'] === T_CLOSURE - ) { - if (isset($tokens[$i]['scope_closer']) === false) { - // Parse error/Live coding. - return; - } - - $i = $tokens[$i]['scope_closer']; - continue; - } - - // Skip HTML whitespace. - if ($tokens[$i]['code'] === T_INLINE_HTML && trim($tokens[$i]['content']) === '') { - continue; - } - - // Skip PHP re-open tag (eg, after inline HTML). - if ($tokens[$i]['code'] === T_OPEN_TAG) { - continue; - } - - $line = $tokens[$i]['line']; - if ($line > $lastLine) { - $type = substr($tokens[$stackPtr]['type'], 2); - $warning = 'Code after the %s statement on line %s cannot be executed'; - $data = [ - $type, - $tokens[$stackPtr]['line'], - ]; - $phpcsFile->addWarning($warning, $i, 'Unreachable', $data); - $lastLine = $line; - } - }//end for - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Scope/MemberVarScopeSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Scope/MemberVarScopeSniff.php deleted file mode 100644 index acb5f80..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Scope/MemberVarScopeSniff.php +++ /dev/null @@ -1,83 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Scope; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\AbstractVariableSniff; - -class MemberVarScopeSniff extends AbstractVariableSniff -{ - - - /** - * Processes the function tokens within the class. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position where the token was found. - * - * @return void - */ - protected function processMemberVar(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $properties = $phpcsFile->getMemberProperties($stackPtr); - - if ($properties === [] || $properties['scope_specified'] !== false) { - return; - } - - if ($properties['set_scope'] === false) { - $error = 'Scope modifier not specified for member variable "%s"'; - $data = [$tokens[$stackPtr]['content']]; - $phpcsFile->addError($error, $stackPtr, 'Missing', $data); - } else { - $error = 'Read scope modifier not specified for member variable "%s"'; - $data = [$tokens[$stackPtr]['content']]; - $phpcsFile->addError($error, $stackPtr, 'AsymReadMissing', $data); - } - - }//end processMemberVar() - - - /** - * Processes normal variables. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position where the token was found. - * - * @return void - */ - protected function processVariable(File $phpcsFile, $stackPtr) - { - /* - We don't care about normal variables. - */ - - }//end processVariable() - - - /** - * Processes variables in double quoted strings. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position where the token was found. - * - * @return void - */ - protected function processVariableInString(File $phpcsFile, $stackPtr) - { - /* - We don't care about normal variables. - */ - - }//end processVariableInString() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Scope/MethodScopeSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Scope/MethodScopeSniff.php deleted file mode 100644 index a26c38b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Scope/MethodScopeSniff.php +++ /dev/null @@ -1,83 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Scope; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\AbstractScopeSniff; -use PHP_CodeSniffer\Util\Tokens; - -class MethodScopeSniff extends AbstractScopeSniff -{ - - - /** - * Constructs a Squiz_Sniffs_Scope_MethodScopeSniff. - */ - public function __construct() - { - parent::__construct(Tokens::$ooScopeTokens, [T_FUNCTION]); - - }//end __construct() - - - /** - * Processes the function tokens within the class. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position where the token was found. - * @param int $currScope The current scope opener token. - * - * @return void - */ - protected function processTokenWithinScope(File $phpcsFile, $stackPtr, $currScope) - { - $tokens = $phpcsFile->getTokens(); - - // Determine if this is a function which needs to be examined. - $conditions = $tokens[$stackPtr]['conditions']; - end($conditions); - $deepestScope = key($conditions); - if ($deepestScope !== $currScope) { - return; - } - - $methodName = $phpcsFile->getDeclarationName($stackPtr); - if ($methodName === null) { - // Ignore closures. - return; - } - - $properties = $phpcsFile->getMethodProperties($stackPtr); - if ($properties['scope_specified'] === false) { - $error = 'Visibility must be declared on method "%s"'; - $data = [$methodName]; - $phpcsFile->addError($error, $stackPtr, 'Missing', $data); - } - - }//end processTokenWithinScope() - - - /** - * Processes a token that is found within the scope that this test is - * listening to. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position in the stack where this - * token was found. - * - * @return void - */ - protected function processTokenOutsideScope(File $phpcsFile, $stackPtr) - { - - }//end processTokenOutsideScope() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Scope/StaticThisUsageSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Scope/StaticThisUsageSniff.php deleted file mode 100644 index 8c50345..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Scope/StaticThisUsageSniff.php +++ /dev/null @@ -1,128 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Scope; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\AbstractScopeSniff; -use PHP_CodeSniffer\Util\Tokens; - -class StaticThisUsageSniff extends AbstractScopeSniff -{ - - - /** - * Constructs the test with the tokens it wishes to listen for. - */ - public function __construct() - { - parent::__construct([T_CLASS, T_TRAIT, T_ENUM, T_ANON_CLASS], [T_FUNCTION]); - - }//end __construct() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * @param int $currScope A pointer to the start of the scope. - * - * @return void - */ - public function processTokenWithinScope(File $phpcsFile, $stackPtr, $currScope) - { - $tokens = $phpcsFile->getTokens(); - - // Determine if this is a function which needs to be examined. - $conditions = $tokens[$stackPtr]['conditions']; - end($conditions); - $deepestScope = key($conditions); - if ($deepestScope !== $currScope) { - return; - } - - // Ignore abstract functions. - if (isset($tokens[$stackPtr]['scope_closer']) === false) { - return; - } - - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if ($next === false || $tokens[$next]['code'] !== T_STRING) { - // Not a function declaration, or incomplete. - return; - } - - $methodProps = $phpcsFile->getMethodProperties($stackPtr); - if ($methodProps['is_static'] === false) { - return; - } - - $next = $stackPtr; - $end = $tokens[$stackPtr]['scope_closer']; - - $this->checkThisUsage($phpcsFile, $next, $end); - - }//end processTokenWithinScope() - - - /** - * Check for $this variable usage between $next and $end tokens. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being scanned. - * @param int $next The position of the next token to check. - * @param int $end The position of the last token to check. - * - * @return void - */ - private function checkThisUsage(File $phpcsFile, $next, $end) - { - $tokens = $phpcsFile->getTokens(); - - do { - $next = $phpcsFile->findNext([T_VARIABLE, T_ANON_CLASS], ($next + 1), $end); - if ($next === false) { - continue; - } - - if ($tokens[$next]['code'] === T_ANON_CLASS) { - $this->checkThisUsage($phpcsFile, $next, $tokens[$next]['scope_opener']); - $next = $tokens[$next]['scope_closer']; - continue; - } - - if ($tokens[$next]['content'] !== '$this') { - continue; - } - - $error = 'Usage of "$this" in static methods will cause runtime errors'; - $phpcsFile->addError($error, $next, 'Found'); - } while ($next !== false); - - }//end checkThisUsage() - - - /** - * Processes a token that is found within the scope that this test is - * listening to. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position in the stack where this - * token was found. - * - * @return void - */ - protected function processTokenOutsideScope(File $phpcsFile, $stackPtr) - { - - }//end processTokenOutsideScope() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Strings/ConcatenationSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Strings/ConcatenationSpacingSniff.php deleted file mode 100644 index a8ac70b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Strings/ConcatenationSpacingSniff.php +++ /dev/null @@ -1,164 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Strings; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ConcatenationSpacingSniff implements Sniff -{ - - /** - * The number of spaces before and after a string concat. - * - * @var integer - */ - public $spacing = 0; - - /** - * Allow newlines instead of spaces. - * - * @var boolean - */ - public $ignoreNewlines = false; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_STRING_CONCAT]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - if (isset($tokens[($stackPtr + 2)]) === false) { - // Syntax error or live coding, bow out. - return; - } - - $ignoreBefore = false; - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($tokens[$prev]['code'] === T_END_HEREDOC || $tokens[$prev]['code'] === T_END_NOWDOC) { - // Spacing before must be preserved due to the here/nowdoc closing tag. - $ignoreBefore = true; - } - - $this->spacing = (int) $this->spacing; - - if ($ignoreBefore === false) { - if ($tokens[($stackPtr - 1)]['code'] !== T_WHITESPACE) { - $before = 0; - } else { - if ($tokens[($stackPtr - 2)]['line'] !== $tokens[$stackPtr]['line']) { - $before = 'newline'; - } else { - $before = $tokens[($stackPtr - 1)]['length']; - } - } - - $phpcsFile->recordMetric($stackPtr, 'Spacing before string concat', $before); - } - - if ($tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) { - $after = 0; - } else { - if ($tokens[($stackPtr + 2)]['line'] !== $tokens[$stackPtr]['line']) { - $after = 'newline'; - } else { - $after = $tokens[($stackPtr + 1)]['length']; - } - } - - $phpcsFile->recordMetric($stackPtr, 'Spacing after string concat', $after); - - if (($ignoreBefore === true - || $before === $this->spacing - || ($before === 'newline' - && $this->ignoreNewlines === true)) - && ($after === $this->spacing - || ($after === 'newline' - && $this->ignoreNewlines === true)) - ) { - return; - } - - if ($this->spacing === 0) { - $message = 'Concat operator must not be surrounded by spaces'; - $data = []; - } else { - if ($this->spacing > 1) { - $message = 'Concat operator must be surrounded by %s spaces'; - } else { - $message = 'Concat operator must be surrounded by a single space'; - } - - $data = [$this->spacing]; - } - - $fix = $phpcsFile->addFixableError($message, $stackPtr, 'PaddingFound', $data); - - if ($fix === true) { - $padding = str_repeat(' ', $this->spacing); - if ($ignoreBefore === false && ($before !== 'newline' || $this->ignoreNewlines === false)) { - if ($tokens[($stackPtr - 1)]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken(($stackPtr - 1), $padding); - if ($this->spacing === 0 - && ($tokens[($stackPtr - 2)]['code'] === T_LNUMBER - || $tokens[($stackPtr - 2)]['code'] === T_DNUMBER) - ) { - $phpcsFile->fixer->replaceToken(($stackPtr - 2), '('.$tokens[($stackPtr - 2)]['content'].')'); - } - - $phpcsFile->fixer->endChangeset(); - } else if ($this->spacing > 0) { - $phpcsFile->fixer->addContent(($stackPtr - 1), $padding); - } - } - - if ($after !== 'newline' || $this->ignoreNewlines === false) { - if ($tokens[($stackPtr + 1)]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken(($stackPtr + 1), $padding); - if ($this->spacing === 0 - && ($tokens[($stackPtr + 2)]['code'] === T_LNUMBER - || $tokens[($stackPtr + 2)]['code'] === T_DNUMBER) - ) { - $phpcsFile->fixer->replaceToken(($stackPtr + 2), '('.$tokens[($stackPtr + 2)]['content'].')'); - } - - $phpcsFile->fixer->endChangeset(); - } else if ($this->spacing > 0) { - $phpcsFile->fixer->addContent($stackPtr, $padding); - } - } - }//end if - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Strings/DoubleQuoteUsageSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Strings/DoubleQuoteUsageSniff.php deleted file mode 100644 index 869c8c5..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Strings/DoubleQuoteUsageSniff.php +++ /dev/null @@ -1,144 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Strings; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class DoubleQuoteUsageSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_CONSTANT_ENCAPSED_STRING, - T_DOUBLE_QUOTED_STRING, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return int - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // If tabs are being converted to spaces by the tokeniser, the - // original content should be used instead of the converted content. - if (isset($tokens[$stackPtr]['orig_content']) === true) { - $workingString = $tokens[$stackPtr]['orig_content']; - } else { - $workingString = $tokens[$stackPtr]['content']; - } - - $lastStringToken = $stackPtr; - - $i = ($stackPtr + 1); - if (isset($tokens[$i]) === true) { - while ($i < $phpcsFile->numTokens - && $tokens[$i]['code'] === $tokens[$stackPtr]['code'] - ) { - if (isset($tokens[$i]['orig_content']) === true) { - $workingString .= $tokens[$i]['orig_content']; - } else { - $workingString .= $tokens[$i]['content']; - } - - $lastStringToken = $i; - $i++; - } - } - - $skipTo = ($lastStringToken + 1); - - // Check if it's a double quoted string. - if ($workingString[0] !== '"' || substr($workingString, -1) !== '"') { - return $skipTo; - } - - // The use of variables in double quoted strings is not allowed. - if ($tokens[$stackPtr]['code'] === T_DOUBLE_QUOTED_STRING) { - $stringTokens = token_get_all('addError($error, $stackPtr, 'ContainsVar', $data); - } - } - - return $skipTo; - }//end if - - $allowedChars = [ - '\0', - '\1', - '\2', - '\3', - '\4', - '\5', - '\6', - '\7', - '\n', - '\r', - '\f', - '\t', - '\v', - '\x', - '\b', - '\e', - '\u', - '\'', - ]; - - foreach ($allowedChars as $testChar) { - if (strpos($workingString, $testChar) !== false) { - return $skipTo; - } - } - - $error = 'String %s does not require double quotes; use single quotes instead'; - $data = [str_replace(["\r", "\n"], ['\r', '\n'], $workingString)]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NotRequired', $data); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $innerContent = substr($workingString, 1, -1); - $innerContent = str_replace('\"', '"', $innerContent); - $innerContent = str_replace('\\$', '$', $innerContent); - $phpcsFile->fixer->replaceToken($stackPtr, "'$innerContent'"); - while ($lastStringToken !== $stackPtr) { - $phpcsFile->fixer->replaceToken($lastStringToken, ''); - $lastStringToken--; - } - - $phpcsFile->fixer->endChangeset(); - } - - return $skipTo; - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Strings/EchoedStringsSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Strings/EchoedStringsSniff.php deleted file mode 100644 index ffb3fb8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/Strings/EchoedStringsSniff.php +++ /dev/null @@ -1,88 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\Strings; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class EchoedStringsSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_ECHO]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $firstContent = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - // If the first non-whitespace token is not an opening parenthesis, then we are not concerned. - if ($tokens[$firstContent]['code'] !== T_OPEN_PARENTHESIS) { - $phpcsFile->recordMetric($stackPtr, 'Brackets around echoed strings', 'no'); - return; - } - - $end = $phpcsFile->findNext([T_SEMICOLON, T_CLOSE_TAG], $stackPtr, null, false); - - // If the token before the semicolon is not a closing parenthesis, then we are not concerned. - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($end - 1), null, true); - if ($tokens[$prev]['code'] !== T_CLOSE_PARENTHESIS) { - $phpcsFile->recordMetric($stackPtr, 'Brackets around echoed strings', 'no'); - return; - } - - // If the parenthesis don't match, then we are not concerned. - if ($tokens[$firstContent]['parenthesis_closer'] !== $prev) { - $phpcsFile->recordMetric($stackPtr, 'Brackets around echoed strings', 'no'); - return; - } - - $phpcsFile->recordMetric($stackPtr, 'Brackets around echoed strings', 'yes'); - - if (($phpcsFile->findNext(Tokens::$operators, $stackPtr, $end, false)) === false) { - // There are no arithmetic operators in this. - $error = 'Echoed strings should not be bracketed'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'HasBracket'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($firstContent, ''); - if ($tokens[($firstContent - 1)]['code'] !== T_WHITESPACE) { - $phpcsFile->fixer->addContent(($firstContent - 1), ' '); - } - - $phpcsFile->fixer->replaceToken($prev, ''); - $phpcsFile->fixer->endChangeset(); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/CastSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/CastSpacingSniff.php deleted file mode 100644 index 535fffc..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/CastSpacingSniff.php +++ /dev/null @@ -1,65 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class CastSpacingSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return Tokens::$castTokens; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $content = $tokens[$stackPtr]['content']; - $expected = str_replace(' ', '', $content); - $expected = str_replace("\t", '', $expected); - - if ($content !== $expected) { - $error = 'Cast statements must not contain whitespace; expected "%s" but found "%s"'; - $data = [ - $expected, - $content, - ]; - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'ContainsWhiteSpace', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, $expected); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/ControlStructureSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/ControlStructureSpacingSniff.php deleted file mode 100644 index 91f1f47..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/ControlStructureSpacingSniff.php +++ /dev/null @@ -1,359 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ControlStructureSpacingSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_IF, - T_WHILE, - T_FOREACH, - T_FOR, - T_SWITCH, - T_DO, - T_ELSE, - T_ELSEIF, - T_TRY, - T_CATCH, - T_FINALLY, - T_MATCH, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['parenthesis_opener']) === true - && isset($tokens[$stackPtr]['parenthesis_closer']) === true - ) { - $parenOpener = $tokens[$stackPtr]['parenthesis_opener']; - $parenCloser = $tokens[$stackPtr]['parenthesis_closer']; - if ($tokens[($parenOpener + 1)]['code'] === T_WHITESPACE) { - $gap = $tokens[($parenOpener + 1)]['length']; - - if ($gap === 0) { - $phpcsFile->recordMetric($stackPtr, 'Spaces after control structure open parenthesis', 'newline'); - $gap = 'newline'; - } else { - $phpcsFile->recordMetric($stackPtr, 'Spaces after control structure open parenthesis', $gap); - } - - $error = 'Expected 0 spaces after opening bracket; %s found'; - $data = [$gap]; - $fix = $phpcsFile->addFixableError($error, ($parenOpener + 1), 'SpacingAfterOpenBrace', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($parenOpener + 1), ''); - } - } else { - $phpcsFile->recordMetric($stackPtr, 'Spaces after control structure open parenthesis', 0); - } - - if ($tokens[$parenOpener]['line'] === $tokens[$parenCloser]['line'] - && $tokens[($parenCloser - 1)]['code'] === T_WHITESPACE - ) { - $gap = $tokens[($parenCloser - 1)]['length']; - $error = 'Expected 0 spaces before closing bracket; %s found'; - $data = [$gap]; - $fix = $phpcsFile->addFixableError($error, ($parenCloser - 1), 'SpaceBeforeCloseBrace', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($parenCloser - 1), ''); - } - - if ($gap === 0) { - $phpcsFile->recordMetric($stackPtr, 'Spaces before control structure close parenthesis', 'newline'); - } else { - $phpcsFile->recordMetric($stackPtr, 'Spaces before control structure close parenthesis', $gap); - } - } else { - $phpcsFile->recordMetric($stackPtr, 'Spaces before control structure close parenthesis', 0); - } - }//end if - - if (isset($tokens[$stackPtr]['scope_closer']) === false) { - return; - } - - $scopeOpener = $tokens[$stackPtr]['scope_opener']; - $scopeCloser = $tokens[$stackPtr]['scope_closer']; - - for ($firstContent = ($scopeOpener + 1); $firstContent < $phpcsFile->numTokens; $firstContent++) { - $code = $tokens[$firstContent]['code']; - - if ($code === T_WHITESPACE - || ($code === T_INLINE_HTML - && trim($tokens[$firstContent]['content']) === '') - ) { - continue; - } - - // Skip all empty tokens on the same line as the opener. - if ($tokens[$firstContent]['line'] === $tokens[$scopeOpener]['line'] - && (isset(Tokens::$emptyTokens[$code]) === true - || $code === T_CLOSE_TAG) - ) { - continue; - } - - break; - } - - // We ignore spacing for some structures that tend to have their own rules. - $ignore = [ - T_FUNCTION => true, - T_CLASS => true, - T_INTERFACE => true, - T_TRAIT => true, - T_ENUM => true, - T_DOC_COMMENT_OPEN_TAG => true, - ]; - - if (isset($ignore[$tokens[$firstContent]['code']]) === false - && $tokens[$firstContent]['line'] >= ($tokens[$scopeOpener]['line'] + 2) - ) { - $gap = ($tokens[$firstContent]['line'] - $tokens[$scopeOpener]['line'] - 1); - $phpcsFile->recordMetric($stackPtr, 'Blank lines at start of control structure', $gap); - - $error = 'Blank line found at start of control structure'; - $fix = $phpcsFile->addFixableError($error, $scopeOpener, 'SpacingAfterOpen'); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $i = ($scopeOpener + 1); - while ($tokens[$i]['line'] !== $tokens[$firstContent]['line']) { - // Start removing content from the line after the opener. - if ($tokens[$i]['line'] !== $tokens[$scopeOpener]['line']) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $i++; - } - - $phpcsFile->fixer->endChangeset(); - } - } else { - $phpcsFile->recordMetric($stackPtr, 'Blank lines at start of control structure', 0); - }//end if - - if ($firstContent !== $scopeCloser) { - $lastContent = $phpcsFile->findPrevious( - T_WHITESPACE, - ($scopeCloser - 1), - null, - true - ); - - $lastNonEmptyContent = $phpcsFile->findPrevious( - Tokens::$emptyTokens, - ($scopeCloser - 1), - null, - true - ); - - $checkToken = $lastContent; - if (isset($tokens[$lastNonEmptyContent]['scope_condition']) === true) { - $checkToken = $tokens[$lastNonEmptyContent]['scope_condition']; - } - - if (isset($ignore[$tokens[$checkToken]['code']]) === false - && $tokens[$lastContent]['line'] <= ($tokens[$scopeCloser]['line'] - 2) - ) { - $errorToken = $scopeCloser; - for ($i = ($scopeCloser - 1); $i > $lastContent; $i--) { - if ($tokens[$i]['line'] < $tokens[$scopeCloser]['line']) { - $errorToken = $i; - break; - } - } - - $gap = ($tokens[$scopeCloser]['line'] - $tokens[$lastContent]['line'] - 1); - $phpcsFile->recordMetric($stackPtr, 'Blank lines at end of control structure', $gap); - - $error = 'Blank line found at end of control structure'; - $fix = $phpcsFile->addFixableError($error, $errorToken, 'SpacingBeforeClose'); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($scopeCloser - 1); $i > $lastContent; $i--) { - if ($tokens[$i]['line'] === $tokens[$scopeCloser]['line']) { - continue; - } - - if ($tokens[$i]['line'] === $tokens[$lastContent]['line']) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } else { - $phpcsFile->recordMetric($stackPtr, 'Blank lines at end of control structure', 0); - }//end if - }//end if - - if ($tokens[$stackPtr]['code'] === T_MATCH) { - // Move the scope closer to the semicolon/comma. - $next = $phpcsFile->findNext(Tokens::$emptyTokens, ($scopeCloser + 1), null, true); - if ($next !== false - && ($tokens[$next]['code'] === T_SEMICOLON || $tokens[$next]['code'] === T_COMMA) - ) { - $scopeCloser = $next; - } - } - - $trailingContent = $phpcsFile->findNext( - T_WHITESPACE, - ($scopeCloser + 1), - null, - true - ); - - if ($tokens[$trailingContent]['code'] === T_COMMENT - || isset(Tokens::$phpcsCommentTokens[$tokens[$trailingContent]['code']]) === true - ) { - // Special exception for code where the comment about - // an ELSE or ELSEIF is written between the control structures. - $nextCode = $phpcsFile->findNext( - Tokens::$emptyTokens, - ($scopeCloser + 1), - null, - true - ); - - if ($tokens[$nextCode]['code'] === T_ELSE - || $tokens[$nextCode]['code'] === T_ELSEIF - || $tokens[$trailingContent]['line'] === $tokens[$scopeCloser]['line'] - ) { - $trailingContent = $nextCode; - } - }//end if - - if ($tokens[$trailingContent]['code'] === T_ELSE) { - if ($tokens[$stackPtr]['code'] === T_IF) { - // IF with ELSE. - return; - } - } - - if ($tokens[$trailingContent]['code'] === T_WHILE - && $tokens[$stackPtr]['code'] === T_DO - ) { - // DO with WHILE. - return; - } - - if ($tokens[$trailingContent]['code'] === T_CLOSE_TAG) { - // At the end of the script or embedded code. - return; - } - - if (isset($tokens[$trailingContent]['scope_condition']) === true - && $tokens[$trailingContent]['scope_condition'] !== $trailingContent - && isset($tokens[$trailingContent]['scope_opener']) === true - && $tokens[$trailingContent]['scope_opener'] !== $trailingContent - ) { - // Another control structure's closing brace. - $owner = $tokens[$trailingContent]['scope_condition']; - if ($tokens[$owner]['code'] === T_FUNCTION) { - // The next content is the closing brace of a function - // so normal function rules apply and we can ignore it. - return; - } - - if ($tokens[$owner]['code'] === T_CLOSURE - && ($phpcsFile->hasCondition($stackPtr, [T_FUNCTION, T_CLOSURE]) === true - || isset($tokens[$stackPtr]['nested_parenthesis']) === true) - ) { - return; - } - - if ($tokens[$trailingContent]['line'] !== ($tokens[$scopeCloser]['line'] + 1)) { - $error = 'Blank line found after control structure'; - $fix = $phpcsFile->addFixableError($error, $scopeCloser, 'LineAfterClose'); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $i = ($scopeCloser + 1); - while ($tokens[$i]['line'] !== $tokens[$trailingContent]['line']) { - $phpcsFile->fixer->replaceToken($i, ''); - $i++; - } - - $phpcsFile->fixer->addNewline($scopeCloser); - $phpcsFile->fixer->endChangeset(); - } - } - } else if ($tokens[$trailingContent]['code'] !== T_ELSE - && $tokens[$trailingContent]['code'] !== T_ELSEIF - && $tokens[$trailingContent]['code'] !== T_CATCH - && $tokens[$trailingContent]['code'] !== T_FINALLY - && $tokens[$trailingContent]['line'] === ($tokens[$scopeCloser]['line'] + 1) - ) { - $error = 'No blank line found after control structure'; - $fix = $phpcsFile->addFixableError($error, $scopeCloser, 'NoLineAfterClose'); - if ($fix === true) { - $trailingContent = $phpcsFile->findNext( - T_WHITESPACE, - ($scopeCloser + 1), - null, - true - ); - - if (($tokens[$trailingContent]['code'] === T_COMMENT - || isset(Tokens::$phpcsCommentTokens[$tokens[$trailingContent]['code']]) === true) - && $tokens[$trailingContent]['line'] === $tokens[$scopeCloser]['line'] - ) { - $phpcsFile->fixer->addNewline($trailingContent); - } else { - $phpcsFile->fixer->addNewline($scopeCloser); - } - } - }//end if - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/FunctionClosingBraceSpaceSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/FunctionClosingBraceSpaceSniff.php deleted file mode 100644 index 66d8da3..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/FunctionClosingBraceSpaceSniff.php +++ /dev/null @@ -1,164 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class FunctionClosingBraceSpaceSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_FUNCTION, - T_CLOSURE, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['scope_closer']) === false) { - // Probably an interface method. - return; - } - - $closeBrace = $tokens[$stackPtr]['scope_closer']; - $prevContent = $phpcsFile->findPrevious(T_WHITESPACE, ($closeBrace - 1), null, true); - - // Special case for empty JS functions. - if ($phpcsFile->tokenizerType === 'JS' && $prevContent === $tokens[$stackPtr]['scope_opener']) { - // In this case, the opening and closing brace must be - // right next to each other. - if ($tokens[$stackPtr]['scope_closer'] !== ($tokens[$stackPtr]['scope_opener'] + 1)) { - $error = 'The opening and closing braces of empty functions must be directly next to each other; e.g., function () {}'; - $fix = $phpcsFile->addFixableError($error, $closeBrace, 'SpacingBetween'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($tokens[$stackPtr]['scope_opener'] + 1); $i < $closeBrace; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } - - return; - } - - $nestedFunction = false; - if ($phpcsFile->hasCondition($stackPtr, [T_FUNCTION, T_CLOSURE]) === true - || isset($tokens[$stackPtr]['nested_parenthesis']) === true - ) { - $nestedFunction = true; - } - - $braceLine = $tokens[$closeBrace]['line']; - $prevLine = $tokens[$prevContent]['line']; - $found = ($braceLine - $prevLine - 1); - - if ($nestedFunction === true) { - if ($found < 0) { - $error = 'Closing brace of nested function must be on a new line'; - $fix = $phpcsFile->addFixableError($error, $closeBrace, 'ContentBeforeClose'); - if ($fix === true) { - $phpcsFile->fixer->addNewlineBefore($closeBrace); - } - } else if ($found > 0) { - $error = 'Expected 0 blank lines before closing brace of nested function; %s found'; - $data = [$found]; - $fix = $phpcsFile->addFixableError($error, $closeBrace, 'SpacingBeforeNestedClose', $data); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $changeMade = false; - for ($i = ($prevContent + 1); $i < $closeBrace; $i++) { - // Try and maintain indentation. - if ($tokens[$i]['line'] === ($braceLine - 1)) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - $changeMade = true; - } - - // Special case for when the last content contains the newline - // token as well, like with a comment. - if ($changeMade === false) { - $phpcsFile->fixer->replaceToken(($prevContent + 1), ''); - } - - $phpcsFile->fixer->endChangeset(); - }//end if - }//end if - } else { - if ($found !== 1) { - if ($found < 0) { - $found = 0; - } - - $error = 'Expected 1 blank line before closing function brace; %s found'; - $data = [$found]; - $fix = $phpcsFile->addFixableError($error, $closeBrace, 'SpacingBeforeClose', $data); - - if ($fix === true) { - if ($found > 1) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($prevContent + 1); $i < ($closeBrace - 1); $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->replaceToken($i, $phpcsFile->eolChar); - $phpcsFile->fixer->endChangeset(); - } else { - // Try and maintain indentation. - if ($tokens[($closeBrace - 1)]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->addNewlineBefore($closeBrace - 1); - } else { - $phpcsFile->fixer->addNewlineBefore($closeBrace); - } - } - } - }//end if - }//end if - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/FunctionOpeningBraceSpaceSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/FunctionOpeningBraceSpaceSniff.php deleted file mode 100644 index bde9686..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/FunctionOpeningBraceSpaceSniff.php +++ /dev/null @@ -1,98 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class FunctionOpeningBraceSpaceSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_FUNCTION, - T_CLOSURE, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[$stackPtr]['scope_opener']) === false) { - // Probably an interface or abstract method. - return; - } - - $openBrace = $tokens[$stackPtr]['scope_opener']; - $nextContent = $phpcsFile->findNext(T_WHITESPACE, ($openBrace + 1), null, true); - - if ($nextContent === $tokens[$stackPtr]['scope_closer']) { - // The next bit of content is the closing brace, so this - // is an empty function and should have a blank line - // between the opening and closing braces. - return; - } - - $braceLine = $tokens[$openBrace]['line']; - $nextLine = $tokens[$nextContent]['line']; - - $found = ($nextLine - $braceLine - 1); - if ($found > 0) { - $error = 'Expected 0 blank lines after opening function brace; %s found'; - $data = [$found]; - $fix = $phpcsFile->addFixableError($error, $openBrace, 'SpacingAfter', $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($openBrace + 1); $i < $nextContent; $i++) { - if ($tokens[$i]['line'] === $nextLine) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->addNewline($openBrace); - $phpcsFile->fixer->endChangeset(); - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/FunctionSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/FunctionSpacingSniff.php deleted file mode 100644 index 5cb1d6b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/FunctionSpacingSniff.php +++ /dev/null @@ -1,376 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class FunctionSpacingSniff implements Sniff -{ - - /** - * The number of blank lines between functions. - * - * @var integer - */ - public $spacing = 2; - - /** - * The number of blank lines before the first function in a class. - * - * @var integer - */ - public $spacingBeforeFirst = 2; - - /** - * The number of blank lines after the last function in a class. - * - * @var integer - */ - public $spacingAfterLast = 2; - - /** - * Original properties as set in a custom ruleset (if any). - * - * @var array|null - */ - private $rulesetProperties = null; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_FUNCTION]; - - }//end register() - - - /** - * Processes this sniff when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $previousNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($previousNonEmpty !== false - && $tokens[$previousNonEmpty]['code'] === T_OPEN_TAG - && $tokens[$previousNonEmpty]['line'] !== 1 - ) { - // Ignore functions at the start of an embedded PHP block. - return; - } - - // If the ruleset has only overridden the spacing property, use - // that value for all spacing rules. - if ($this->rulesetProperties === null) { - $this->rulesetProperties = []; - if (isset($phpcsFile->ruleset->ruleset['Squiz.WhiteSpace.FunctionSpacing']) === true - && isset($phpcsFile->ruleset->ruleset['Squiz.WhiteSpace.FunctionSpacing']['properties']) === true - ) { - $this->rulesetProperties = $phpcsFile->ruleset->ruleset['Squiz.WhiteSpace.FunctionSpacing']['properties']; - if (isset($this->rulesetProperties['spacing']) === true) { - if (isset($this->rulesetProperties['spacingBeforeFirst']) === false) { - $this->spacingBeforeFirst = $this->spacing; - } - - if (isset($this->rulesetProperties['spacingAfterLast']) === false) { - $this->spacingAfterLast = $this->spacing; - } - } - } - } - - $this->spacing = (int) $this->spacing; - $this->spacingBeforeFirst = (int) $this->spacingBeforeFirst; - $this->spacingAfterLast = (int) $this->spacingAfterLast; - - if (isset($tokens[$stackPtr]['scope_closer']) === false) { - // Must be an interface method, so the closer is the semicolon. - $closer = $phpcsFile->findNext(T_SEMICOLON, $stackPtr); - } else { - $closer = $tokens[$stackPtr]['scope_closer']; - } - - $isFirst = false; - $isLast = false; - - $ignore = ([T_WHITESPACE => T_WHITESPACE] + Tokens::$methodPrefixes); - - $prev = $phpcsFile->findPrevious($ignore, ($stackPtr - 1), null, true); - - $startOfDeclarationLine = $phpcsFile->findNext(T_WHITESPACE, ($prev + 1), null, true); - for ($i = $startOfDeclarationLine; $i >= 0; $i--) { - if ($tokens[$i]['line'] === $tokens[$startOfDeclarationLine]['line']) { - $startOfDeclarationLine = $i; - continue; - } - - break; - } - - // Skip past function docblocks and attributes. - // Only the first docblock is a function docblock. Other docblocks should be disregarded. - $prev = $startOfDeclarationLine; - $seenDocblock = false; - if ($startOfDeclarationLine > 0) { - for ($prev = ($startOfDeclarationLine - 1); $prev > 0; $prev--) { - if ($tokens[$prev]['code'] === T_WHITESPACE) { - continue; - } - - if ($seenDocblock === false && $tokens[$prev]['code'] === T_DOC_COMMENT_CLOSE_TAG) { - $prev = $tokens[$prev]['comment_opener']; - $seenDocblock = true; - continue; - } - - if ($tokens[$prev]['code'] === T_ATTRIBUTE_END) { - $prev = $tokens[$prev]['attribute_opener']; - continue; - } - - break; - } - } - - if ($tokens[$prev]['code'] === T_OPEN_CURLY_BRACKET) { - $isFirst = true; - } - - $next = $phpcsFile->findNext($ignore, ($closer + 1), null, true); - if (isset(Tokens::$emptyTokens[$tokens[$next]['code']]) === true - && $tokens[$next]['line'] === $tokens[$closer]['line'] - ) { - // Skip past "end" comments. - $next = $phpcsFile->findNext($ignore, ($next + 1), null, true); - } - - if ($tokens[$next]['code'] === T_CLOSE_CURLY_BRACKET) { - $isLast = true; - } - - /* - Check the number of blank lines - after the function. - */ - - // Allow for comments on the same line as the closer. - for ($nextLineToken = ($closer + 1); $nextLineToken < $phpcsFile->numTokens; $nextLineToken++) { - // A doc comment belongs to the next statement and must not be on - // this line. - if ($tokens[$nextLineToken]['code'] === T_DOC_COMMENT_OPEN_TAG) { - break; - } - - if ($tokens[$nextLineToken]['line'] !== $tokens[$closer]['line']) { - break; - } - } - - $requiredSpacing = $this->spacing; - $errorCode = 'After'; - if ($isLast === true) { - $requiredSpacing = $this->spacingAfterLast; - $errorCode = 'AfterLast'; - } - - $foundLines = 0; - if ($nextLineToken === ($phpcsFile->numTokens - 1)) { - // We are at the end of the file. - // Don't check spacing after the function because this - // should be done by an EOF sniff. - $foundLines = $requiredSpacing; - } else { - $nextContent = $phpcsFile->findNext(T_WHITESPACE, $nextLineToken, null, true); - if ($nextContent === false) { - // We are at the end of the file. - // Don't check spacing after the function because this - // should be done by an EOF sniff. - $foundLines = $requiredSpacing; - } else { - $foundLines = ($tokens[$nextContent]['line'] - $tokens[$nextLineToken]['line']); - } - } - - if ($isLast === true) { - $phpcsFile->recordMetric($stackPtr, 'Function spacing after last', $foundLines); - } else { - $phpcsFile->recordMetric($stackPtr, 'Function spacing after', $foundLines); - } - - if ($foundLines !== $requiredSpacing) { - $error = 'Expected %s blank line'; - if ($requiredSpacing !== 1) { - $error .= 's'; - } - - $error .= ' after function; %s found'; - $data = [ - $requiredSpacing, - $foundLines, - ]; - - $fix = $phpcsFile->addFixableError($error, $closer, $errorCode, $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = $nextLineToken; $i <= $nextContent; $i++) { - if ($tokens[$i]['line'] === $tokens[$nextContent]['line']) { - $phpcsFile->fixer->addContentBefore($i, str_repeat($phpcsFile->eolChar, $requiredSpacing)); - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - }//end if - }//end if - - /* - Check the number of blank lines - before the function. - */ - - $startOfPreamble = $phpcsFile->findNext(T_WHITESPACE, ($prev + 1), null, true); - - $prevLineToken = null; - for ($i = $startOfPreamble; $i >= 0; $i--) { - if ($tokens[$i]['line'] === $tokens[$startOfPreamble]['line']) { - continue; - } - - $prevLineToken = $i; - break; - } - - if ($prevLineToken === null) { - // Never found the previous line, which means - // there are 0 blank lines before the function. - $foundLines = 0; - $prevContent = 0; - $prevLineToken = 0; - } else { - $firstBefore = $phpcsFile->findPrevious(T_WHITESPACE, ($startOfDeclarationLine - 1), null, true); - if ($tokens[$firstBefore]['code'] === T_COMMENT - || isset(Tokens::$phpcsCommentTokens[$tokens[$firstBefore]['code']]) === true - ) { - // Ignore comments as they can have different spacing rules, and this - // isn't a proper function comment anyway. - return; - } - - // Before we throw an error, check that we are not throwing an error - // for another function. We don't want to error for no blank lines after - // the previous function and no blank lines before this one as well. - $stopAt = 0; - if (isset($tokens[$prevLineToken]['conditions']) === true) { - $conditions = $tokens[$prevLineToken]['conditions']; - $conditions = array_keys($conditions); - $stopAt = array_pop($conditions); - } - - $currentLine = $tokens[$startOfPreamble]['line']; - $prevContent = $prev; - $prevLine = ($tokens[$prevContent]['line'] - 1); - $foundLines = ($currentLine - $tokens[$prevContent]['line'] - 1); - - for ($i = $prevContent; $i > $stopAt; $i--) { - if ($tokens[$i]['code'] === T_CLOSE_CURLY_BRACKET) { - if (isset($tokens[$i]['scope_condition']) === true - && $tokens[$tokens[$i]['scope_condition']]['code'] === T_FUNCTION - ) { - // Found a previous function. - return; - } else { - break; - } - } - - if ($tokens[$i]['code'] === T_FUNCTION) { - // Found another interface or abstract function. - return; - } - - $currentLine = $tokens[$i]['line']; - if ($currentLine === $prevLine) { - break; - } - }//end for - }//end if - - $requiredSpacing = $this->spacing; - $errorCode = 'Before'; - if ($isFirst === true) { - $requiredSpacing = $this->spacingBeforeFirst; - $errorCode = 'BeforeFirst'; - - $phpcsFile->recordMetric($stackPtr, 'Function spacing before first', $foundLines); - } else { - $phpcsFile->recordMetric($stackPtr, 'Function spacing before', $foundLines); - } - - if ($foundLines !== $requiredSpacing) { - $error = 'Expected %s blank line'; - if ($requiredSpacing !== 1) { - $error .= 's'; - } - - $error .= ' before function; %s found'; - $data = [ - $requiredSpacing, - $foundLines, - ]; - - $fix = $phpcsFile->addFixableError($error, $stackPtr, $errorCode, $data); - if ($fix === true) { - $nextSpace = $phpcsFile->findNext(T_WHITESPACE, ($prevContent + 1), $stackPtr); - if ($nextSpace === false) { - $nextSpace = ($stackPtr - 1); - } - - if ($foundLines < $requiredSpacing) { - $padding = str_repeat($phpcsFile->eolChar, ($requiredSpacing - $foundLines)); - $phpcsFile->fixer->addContent($prevLineToken, $padding); - } else { - $nextContent = $phpcsFile->findNext(T_WHITESPACE, ($nextSpace + 1), null, true); - $phpcsFile->fixer->beginChangeset(); - for ($i = $nextSpace; $i < $nextContent; $i++) { - if ($tokens[$i]['line'] === $tokens[$prevContent]['line']) { - continue; - } - - if ($tokens[$i]['line'] === $tokens[$nextContent]['line']) { - $phpcsFile->fixer->addContentBefore($i, str_repeat($phpcsFile->eolChar, $requiredSpacing)); - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - }//end if - }//end if - }//end if - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/LanguageConstructSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/LanguageConstructSpacingSniff.php deleted file mode 100644 index 3d1e695..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/LanguageConstructSpacingSniff.php +++ /dev/null @@ -1,128 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.3.0 Use the Generic.WhiteSpace.LanguageConstructSpacing sniff instead. - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util; - -class LanguageConstructSpacingSniff implements Sniff, DeprecatedSniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_ECHO, - T_PRINT, - T_RETURN, - T_INCLUDE, - T_INCLUDE_ONCE, - T_REQUIRE, - T_REQUIRE_ONCE, - T_NEW, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (isset($tokens[($stackPtr + 1)]) === false) { - // Skip if there is no next token. - return; - } - - if ($tokens[($stackPtr + 1)]['code'] === T_SEMICOLON) { - // No content for this language construct. - return; - } - - if ($tokens[($stackPtr + 1)]['code'] === T_WHITESPACE) { - $content = $tokens[($stackPtr + 1)]['content']; - if ($content !== ' ') { - $error = 'Language constructs must be followed by a single space; expected 1 space but found "%s"'; - $data = [Util\Common::prepareForOutput($content)]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'IncorrectSingle', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ' '); - } - } - } else if ($tokens[($stackPtr + 1)]['code'] !== T_OPEN_PARENTHESIS) { - $error = 'Language constructs must be followed by a single space; expected "%s" but found "%s"'; - $data = [ - $tokens[$stackPtr]['content'].' '.$tokens[($stackPtr + 1)]['content'], - $tokens[$stackPtr]['content'].$tokens[($stackPtr + 1)]['content'], - ]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Incorrect', $data); - if ($fix === true) { - $phpcsFile->fixer->addContent($stackPtr, ' '); - } - }//end if - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.3.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'Use the Generic.WhiteSpace.LanguageConstructSpacing sniff instead.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/LogicalOperatorSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/LogicalOperatorSpacingSniff.php deleted file mode 100644 index f727d7b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/LogicalOperatorSpacingSniff.php +++ /dev/null @@ -1,102 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class LogicalOperatorSpacingSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return Tokens::$booleanOperators; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being checked. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Check there is one space before the operator. - if ($tokens[($stackPtr - 1)]['code'] !== T_WHITESPACE) { - $error = 'Expected 1 space before logical operator; 0 found'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoSpaceBefore'); - if ($fix === true) { - $phpcsFile->fixer->addContentBefore($stackPtr, ' '); - } - } else { - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - if ($tokens[$stackPtr]['line'] === $tokens[$prev]['line'] - && $tokens[($stackPtr - 1)]['length'] !== 1 - ) { - $found = $tokens[($stackPtr - 1)]['length']; - $error = 'Expected 1 space before logical operator; %s found'; - $data = [$found]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'TooMuchSpaceBefore', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr - 1), ' '); - } - } - } - - // Check there is one space after the operator. - if ($tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) { - $error = 'Expected 1 space after logical operator; 0 found'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoSpaceAfter'); - if ($fix === true) { - $phpcsFile->fixer->addContent($stackPtr, ' '); - } - } else { - $next = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($tokens[$stackPtr]['line'] === $tokens[$next]['line'] - && $tokens[($stackPtr + 1)]['length'] !== 1 - ) { - $found = $tokens[($stackPtr + 1)]['length']; - $error = 'Expected 1 space after logical operator; %s found'; - $data = [$found]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'TooMuchSpaceAfter', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ' '); - } - } - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/MemberVarSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/MemberVarSpacingSniff.php deleted file mode 100644 index 4c6a108..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/MemberVarSpacingSniff.php +++ /dev/null @@ -1,258 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\AbstractVariableSniff; -use PHP_CodeSniffer\Util\Tokens; - -class MemberVarSpacingSniff extends AbstractVariableSniff -{ - - /** - * The number of blank lines between member vars. - * - * @var integer - */ - public $spacing = 1; - - /** - * The number of blank lines before the first member var. - * - * @var integer - */ - public $spacingBeforeFirst = 1; - - - /** - * Processes the function tokens within the class. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position where the token was found. - * - * @return void|int Optionally returns a stack pointer. The sniff will not be - * called again on the current file until the returned stack - * pointer is reached. - */ - protected function processMemberVar(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $stopPoints = [ - T_SEMICOLON, - T_OPEN_CURLY_BRACKET, - T_CLOSE_CURLY_BRACKET, - ]; - - $endOfPreviousStatement = $phpcsFile->findPrevious($stopPoints, ($stackPtr - 1), null, false, null, true); - - $validPrefixes = Tokens::$scopeModifiers; - $validPrefixes[] = T_STATIC; - $validPrefixes[] = T_FINAL; - $validPrefixes[] = T_VAR; - $validPrefixes[] = T_READONLY; - $validPrefixes[] = T_ABSTRACT; - - $startOfStatement = $phpcsFile->findNext($validPrefixes, ($endOfPreviousStatement + 1), $stackPtr, false, null, true); - if ($startOfStatement === false) { - // Parse error/live coding - property without modifier. Bow out. - return; - } - - $endOfStatement = $phpcsFile->findNext(T_SEMICOLON, ($stackPtr + 1), null, false, null, true); - - $start = $startOfStatement; - for ($prev = ($startOfStatement - 1); $prev >= 0; $prev--) { - if ($tokens[$prev]['code'] === T_WHITESPACE) { - continue; - } - - if ($tokens[$prev]['code'] === T_ATTRIBUTE_END - && isset($tokens[$prev]['attribute_opener']) === true - ) { - $prev = $tokens[$prev]['attribute_opener']; - $start = $prev; - continue; - } - - break; - } - - if ($tokens[$prev]['code'] === T_DOC_COMMENT_CLOSE_TAG) { - $start = $prev; - } else if (isset(Tokens::$commentTokens[$tokens[$prev]['code']]) === true) { - // Assume the comment belongs to the member var if it is on a line by itself. - $prevContent = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($prev - 1), null, true); - if ($tokens[$prevContent]['line'] !== $tokens[$prev]['line']) { - $start = $prev; - } - } - - // Check for blank lines between the docblock/comment and the property declaration. - for ($i = ($start + 1); $i < $startOfStatement; $i++) { - if (isset($tokens[$i]['attribute_closer']) === true) { - $i = $tokens[$i]['attribute_closer']; - continue; - } - - if ($tokens[$i]['column'] !== 1 - || $tokens[$i]['code'] !== T_WHITESPACE - || $tokens[$i]['line'] === $tokens[($i + 1)]['line'] - // Do not report blank lines after a PHPCS annotation as removing the blank lines could change the meaning. - || isset(Tokens::$phpcsCommentTokens[$tokens[($i - 1)]['code']]) === true - ) { - continue; - } - - // We found a blank line which should be reported. - $nextNonWhitespace = $phpcsFile->findNext(T_WHITESPACE, ($i + 1), null, true); - $foundLines = ($tokens[$nextNonWhitespace]['line'] - $tokens[$i]['line']); - - $error = 'Expected no blank lines between the member var comment and the declaration; %s found'; - $data = [$foundLines]; - $fix = $phpcsFile->addFixableError($error, $i, 'AfterComment', $data); - - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - for ($j = $i; $j < $nextNonWhitespace; $j++) { - if ($tokens[$j]['line'] === $tokens[$nextNonWhitespace]['line']) { - break; - } - - $phpcsFile->fixer->replaceToken($j, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - - $i = $nextNonWhitespace; - }//end for - - // There needs to be n blank lines before the var, not counting comments. - if ($start === $startOfStatement) { - // No comment found. - $first = $phpcsFile->findFirstOnLine(Tokens::$emptyTokens, $start, true); - if ($first === false) { - $first = $start; - } - } else if ($tokens[$start]['code'] === T_DOC_COMMENT_CLOSE_TAG) { - $first = $tokens[$start]['comment_opener']; - } else { - $first = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($start - 1), null, true); - $first = $phpcsFile->findNext(array_merge(Tokens::$commentTokens, [T_ATTRIBUTE]), ($first + 1)); - } - - // Determine if this is the first member var. - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($first - 1), null, true); - if ($tokens[$prev]['code'] === T_CLOSE_CURLY_BRACKET - && isset($tokens[$prev]['scope_condition']) === true - && $tokens[$tokens[$prev]['scope_condition']]['code'] === T_FUNCTION - ) { - return; - } - - if ($tokens[$prev]['code'] === T_OPEN_CURLY_BRACKET - && isset(Tokens::$ooScopeTokens[$tokens[$tokens[$prev]['scope_condition']]['code']]) === true - ) { - $errorMsg = 'Expected %s blank line(s) before first member var; %s found'; - $errorCode = 'FirstIncorrect'; - $spacing = (int) $this->spacingBeforeFirst; - } else { - $errorMsg = 'Expected %s blank line(s) before member var; %s found'; - $errorCode = 'Incorrect'; - $spacing = (int) $this->spacing; - } - - $foundLines = ($tokens[$first]['line'] - $tokens[$prev]['line'] - 1); - - if ($errorCode === 'FirstIncorrect') { - $phpcsFile->recordMetric($stackPtr, 'Member var spacing before first', $foundLines); - } else { - $phpcsFile->recordMetric($stackPtr, 'Member var spacing before', $foundLines); - } - - if ($foundLines === $spacing) { - if ($endOfStatement !== false) { - return $endOfStatement; - } - - return; - } - - $data = [ - $spacing, - $foundLines, - ]; - - $fix = $phpcsFile->addFixableError($errorMsg, $startOfStatement, $errorCode, $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = ($prev + 1); $i < $first; $i++) { - if ($tokens[$i]['line'] === $tokens[$prev]['line']) { - continue; - } - - if ($tokens[$i]['line'] === $tokens[$first]['line']) { - for ($x = 1; $x <= $spacing; $x++) { - $phpcsFile->fixer->addNewlineBefore($i); - } - - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - }//end if - - if ($endOfStatement !== false) { - return $endOfStatement; - } - - }//end processMemberVar() - - - /** - * Processes normal variables. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position where the token was found. - * - * @return void - */ - protected function processVariable(File $phpcsFile, $stackPtr) - { - /* - We don't care about normal variables. - */ - - }//end processVariable() - - - /** - * Processes variables in double quoted strings. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position where the token was found. - * - * @return void - */ - protected function processVariableInString(File $phpcsFile, $stackPtr) - { - /* - We don't care about normal variables. - */ - - }//end processVariableInString() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/ObjectOperatorSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/ObjectOperatorSpacingSniff.php deleted file mode 100644 index bee33e8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/ObjectOperatorSpacingSniff.php +++ /dev/null @@ -1,167 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class ObjectOperatorSpacingSniff implements Sniff -{ - - /** - * Allow newlines instead of spaces. - * - * @var boolean - */ - public $ignoreNewlines = false; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_OBJECT_OPERATOR, - T_DOUBLE_COLON, - T_NULLSAFE_OBJECT_OPERATOR, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - if ($tokens[($stackPtr - 1)]['code'] !== T_WHITESPACE) { - $before = 0; - } else { - if ($tokens[($stackPtr - 2)]['line'] !== $tokens[$stackPtr]['line']) { - $before = 'newline'; - } else { - $before = $tokens[($stackPtr - 1)]['length']; - } - } - - $phpcsFile->recordMetric($stackPtr, 'Spacing before object operator', $before); - $this->checkSpacingBeforeOperator($phpcsFile, $stackPtr, $before); - - if (isset($tokens[($stackPtr + 1)]) === false - || isset($tokens[($stackPtr + 2)]) === false - ) { - return; - } - - if ($tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) { - $after = 0; - } else { - if ($tokens[($stackPtr + 2)]['line'] !== $tokens[$stackPtr]['line']) { - $after = 'newline'; - } else { - $after = $tokens[($stackPtr + 1)]['length']; - } - } - - $phpcsFile->recordMetric($stackPtr, 'Spacing after object operator', $after); - $this->checkSpacingAfterOperator($phpcsFile, $stackPtr, $after); - - }//end process() - - - /** - * Check the spacing before the operator. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param mixed $before The number of spaces found before the - * operator or the string 'newline'. - * - * @return boolean true if there was no error, false otherwise. - */ - protected function checkSpacingBeforeOperator(File $phpcsFile, $stackPtr, $before) - { - if ($before !== 0 - && ($before !== 'newline' || $this->ignoreNewlines === false) - ) { - $error = 'Space found before object operator'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Before'); - if ($fix === true) { - $tokens = $phpcsFile->getTokens(); - $curPos = ($stackPtr - 1); - - $phpcsFile->fixer->beginChangeset(); - while ($tokens[$curPos]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->replaceToken($curPos, ''); - --$curPos; - } - - $phpcsFile->fixer->endChangeset(); - } - - return false; - } - - return true; - - }//end checkSpacingBeforeOperator() - - - /** - * Check the spacing after the operator. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param mixed $after The number of spaces found after the - * operator or the string 'newline'. - * - * @return boolean true if there was no error, false otherwise. - */ - protected function checkSpacingAfterOperator(File $phpcsFile, $stackPtr, $after) - { - if ($after !== 0 - && ($after !== 'newline' || $this->ignoreNewlines === false) - ) { - $error = 'Space found after object operator'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'After'); - if ($fix === true) { - $tokens = $phpcsFile->getTokens(); - $curPos = ($stackPtr + 1); - - $phpcsFile->fixer->beginChangeset(); - while ($tokens[$curPos]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->replaceToken($curPos, ''); - ++$curPos; - } - - $phpcsFile->fixer->endChangeset(); - } - - return false; - } - - return true; - - }//end checkSpacingAfterOperator() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/OperatorSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/OperatorSpacingSniff.php deleted file mode 100644 index 0a1d41b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/OperatorSpacingSniff.php +++ /dev/null @@ -1,409 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class OperatorSpacingSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - /** - * Allow newlines instead of spaces. - * - * @var boolean - */ - public $ignoreNewlines = false; - - /** - * Don't check spacing for assignment operators. - * - * This allows multiple assignment statements to be aligned. - * - * @var boolean - */ - public $ignoreSpacingBeforeAssignments = true; - - /** - * A list of tokens that aren't considered as operands. - * - * @var array - */ - private $nonOperandTokens = []; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - /* - First we setup an array of all the tokens that can come before - a T_MINUS or T_PLUS token to indicate that the token is not being - used as an operator. - */ - - // Trying to operate on a negative value; eg. ($var * -1). - $this->nonOperandTokens = Tokens::$operators; - - // Trying to compare a negative value; eg. ($var === -1). - $this->nonOperandTokens += Tokens::$comparisonTokens; - - // Trying to compare a negative value; eg. ($var || -1 === $b). - $this->nonOperandTokens += Tokens::$booleanOperators; - - // Trying to assign a negative value; eg. ($var = -1). - $this->nonOperandTokens += Tokens::$assignmentTokens; - - // Returning/printing a negative value; eg. (return -1). - $this->nonOperandTokens += [ - T_RETURN => T_RETURN, - T_ECHO => T_ECHO, - T_EXIT => T_EXIT, - T_PRINT => T_PRINT, - T_YIELD => T_YIELD, - T_FN_ARROW => T_FN_ARROW, - T_MATCH_ARROW => T_MATCH_ARROW, - ]; - - // Trying to use a negative value; eg. myFunction($var, -2). - $this->nonOperandTokens += [ - T_CASE => T_CASE, - T_COLON => T_COLON, - T_COMMA => T_COMMA, - T_INLINE_ELSE => T_INLINE_ELSE, - T_INLINE_THEN => T_INLINE_THEN, - T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET, - T_OPEN_PARENTHESIS => T_OPEN_PARENTHESIS, - T_OPEN_SHORT_ARRAY => T_OPEN_SHORT_ARRAY, - T_OPEN_SQUARE_BRACKET => T_OPEN_SQUARE_BRACKET, - T_STRING_CONCAT => T_STRING_CONCAT, - ]; - - // Casting a negative value; eg. (array) -$a. - $this->nonOperandTokens += Tokens::$castTokens; - - /* - These are the tokens the sniff is looking for. - */ - - $targets = Tokens::$comparisonTokens; - $targets += Tokens::$operators; - $targets += Tokens::$assignmentTokens; - $targets[] = T_INLINE_THEN; - $targets[] = T_INLINE_ELSE; - $targets[] = T_INSTANCEOF; - - // Also register the contexts we want to specifically skip over. - $targets[] = T_DECLARE; - - return $targets; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being checked. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return void|int Optionally returns a stack pointer. The sniff will not be - * called again on the current file until the returned stack - * pointer is reached. Return `$phpcsFile->numTokens` to skip - * the rest of the file. - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // Skip over declare statements as those should be handled by different sniffs. - if ($tokens[$stackPtr]['code'] === T_DECLARE) { - if (isset($tokens[$stackPtr]['parenthesis_closer']) === false) { - // Parse error / live coding. - return $phpcsFile->numTokens; - } - - return $tokens[$stackPtr]['parenthesis_closer']; - } - - if ($this->isOperator($phpcsFile, $stackPtr) === false) { - return; - } - - if ($tokens[$stackPtr]['code'] === T_BITWISE_AND) { - // Check there is one space before the & operator. - if ($tokens[($stackPtr - 1)]['code'] !== T_WHITESPACE) { - $error = 'Expected 1 space before "&" operator; 0 found'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoSpaceBeforeAmp'); - if ($fix === true) { - $phpcsFile->fixer->addContentBefore($stackPtr, ' '); - } - - $phpcsFile->recordMetric($stackPtr, 'Space before operator', 0); - } else { - if ($tokens[($stackPtr - 2)]['line'] !== $tokens[$stackPtr]['line']) { - $found = 'newline'; - } else { - $found = $tokens[($stackPtr - 1)]['length']; - } - - $phpcsFile->recordMetric($stackPtr, 'Space before operator', $found); - if ($found !== 1 - && ($found !== 'newline' || $this->ignoreNewlines === false) - ) { - $error = 'Expected 1 space before "&" operator; %s found'; - $data = [$found]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpacingBeforeAmp', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr - 1), ' '); - } - } - }//end if - - $hasNext = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($hasNext === false) { - // Live coding/parse error at end of file. - return; - } - - // Check there is one space after the & operator. - if ($tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) { - $error = 'Expected 1 space after "&" operator; 0 found'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoSpaceAfterAmp'); - if ($fix === true) { - $phpcsFile->fixer->addContent($stackPtr, ' '); - } - - $phpcsFile->recordMetric($stackPtr, 'Space after operator', 0); - } else { - if ($tokens[($stackPtr + 2)]['line'] !== $tokens[$stackPtr]['line']) { - $found = 'newline'; - } else { - $found = $tokens[($stackPtr + 1)]['length']; - } - - $phpcsFile->recordMetric($stackPtr, 'Space after operator', $found); - if ($found !== 1 - && ($found !== 'newline' || $this->ignoreNewlines === false) - ) { - $error = 'Expected 1 space after "&" operator; %s found'; - $data = [$found]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpacingAfterAmp', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ' '); - } - } - }//end if - - return; - }//end if - - $operator = $tokens[$stackPtr]['content']; - - if ($tokens[($stackPtr - 1)]['code'] !== T_WHITESPACE - && (($tokens[($stackPtr - 1)]['code'] === T_INLINE_THEN - && $tokens[($stackPtr)]['code'] === T_INLINE_ELSE) === false) - ) { - $error = "Expected 1 space before \"$operator\"; 0 found"; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoSpaceBefore'); - if ($fix === true) { - $phpcsFile->fixer->addContentBefore($stackPtr, ' '); - } - - $phpcsFile->recordMetric($stackPtr, 'Space before operator', 0); - } else if (isset(Tokens::$assignmentTokens[$tokens[$stackPtr]['code']]) === false - || $this->ignoreSpacingBeforeAssignments === false - ) { - // Throw an error for assignments only if enabled using the sniff property - // because other standards allow multiple spaces to align assignments. - $prevNonWhitespace = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - if ($tokens[$prevNonWhitespace]['line'] !== $tokens[$stackPtr]['line']) { - $found = 'newline'; - } else { - $found = $tokens[($stackPtr - 1)]['length']; - } - - $phpcsFile->recordMetric($stackPtr, 'Space before operator', $found); - if ($found !== 1 - && ($found !== 'newline' || $this->ignoreNewlines === false) - ) { - $error = 'Expected 1 space before "%s"; %s found'; - $data = [ - $operator, - $found, - ]; - - if (isset(Tokens::$commentTokens[$tokens[$prevNonWhitespace]['code']]) === true) { - // Throw a non-fixable error if the token on the previous line is a comment token, - // as in that case it's not for the sniff to decide where the comment should be moved to - // and it would get us into unfixable situations as the new line char is included - // in the contents of the comment token. - $phpcsFile->addError($error, $stackPtr, 'SpacingBefore', $data); - } else { - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpacingBefore', $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - if ($found === 'newline') { - $i = ($stackPtr - 2); - while ($tokens[$i]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->replaceToken($i, ''); - $i--; - } - } - - $phpcsFile->fixer->replaceToken(($stackPtr - 1), ' '); - $phpcsFile->fixer->endChangeset(); - } - }//end if - }//end if - }//end if - - $hasNext = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($hasNext === false) { - // Live coding/parse error at end of file. - return; - } - - if ($tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) { - // Skip short ternary such as: "$foo = $bar ?: true;". - if (($tokens[$stackPtr]['code'] === T_INLINE_THEN - && $tokens[($stackPtr + 1)]['code'] === T_INLINE_ELSE) - ) { - return; - } - - $error = "Expected 1 space after \"$operator\"; 0 found"; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoSpaceAfter'); - if ($fix === true) { - $phpcsFile->fixer->addContent($stackPtr, ' '); - } - - $phpcsFile->recordMetric($stackPtr, 'Space after operator', 0); - } else { - if (isset($tokens[($stackPtr + 2)]) === true - && $tokens[($stackPtr + 2)]['line'] !== $tokens[$stackPtr]['line'] - ) { - $found = 'newline'; - } else { - $found = $tokens[($stackPtr + 1)]['length']; - } - - $phpcsFile->recordMetric($stackPtr, 'Space after operator', $found); - if ($found !== 1 - && ($found !== 'newline' || $this->ignoreNewlines === false) - ) { - $error = 'Expected 1 space after "%s"; %s found'; - $data = [ - $operator, - $found, - ]; - - $nextNonWhitespace = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($nextNonWhitespace !== false - && isset(Tokens::$commentTokens[$tokens[$nextNonWhitespace]['code']]) === true - && $found === 'newline' - ) { - // Don't auto-fix when it's a comment or PHPCS annotation on a new line as - // it causes fixer conflicts and can cause the meaning of annotations to change. - $phpcsFile->addError($error, $stackPtr, 'SpacingAfter', $data); - } else { - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpacingAfter', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ' '); - } - } - }//end if - }//end if - - }//end process() - - - /** - * Checks if an operator is actually a different type of token in the current context. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being checked. - * @param int $stackPtr The position of the operator in - * the stack. - * - * @return boolean - */ - protected function isOperator(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['code'] === T_DECLARE) { - return false; - } - - // Skip default values in function declarations. - // Skip declare statements. - if ($tokens[$stackPtr]['code'] === T_EQUAL) { - if (isset($tokens[$stackPtr]['nested_parenthesis']) === true) { - $parenthesis = array_keys($tokens[$stackPtr]['nested_parenthesis']); - $bracket = array_pop($parenthesis); - if (isset($tokens[$bracket]['parenthesis_owner']) === true) { - $function = $tokens[$bracket]['parenthesis_owner']; - if ($tokens[$function]['code'] === T_FUNCTION - || $tokens[$function]['code'] === T_CLOSURE - || $tokens[$function]['code'] === T_FN - ) { - return false; - } - } - } - } - - if ($tokens[$stackPtr]['code'] === T_EQUAL) { - // Skip for '=&' case. - if (isset($tokens[($stackPtr + 1)]) === true - && $tokens[($stackPtr + 1)]['code'] === T_BITWISE_AND - ) { - return false; - } - } - - if ($tokens[$stackPtr]['code'] === T_BITWISE_AND) { - // If it's not a reference, then we expect one space either side of the - // bitwise operator. - if ($phpcsFile->isReference($stackPtr) === true) { - return false; - } - } - - if ($tokens[$stackPtr]['code'] === T_MINUS || $tokens[$stackPtr]['code'] === T_PLUS) { - // Check minus spacing, but make sure we aren't just assigning - // a minus value or returning one. - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if (isset($this->nonOperandTokens[$tokens[$prev]['code']]) === true) { - return false; - } - }//end if - - return true; - - }//end isOperator() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/PropertyLabelSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/PropertyLabelSpacingSniff.php deleted file mode 100644 index d0bfa6f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/PropertyLabelSpacingSniff.php +++ /dev/null @@ -1,118 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; - -class PropertyLabelSpacingSniff implements Sniff, DeprecatedSniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = ['JS']; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_PROPERTY, - T_LABEL, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $colon = $phpcsFile->findNext(T_COLON, ($stackPtr + 1)); - - if ($colon !== ($stackPtr + 1)) { - $error = 'There must be no space before the colon in a property/label declaration'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Before'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ''); - } - } - - if ($tokens[($colon + 1)]['code'] !== T_WHITESPACE || $tokens[($colon + 1)]['content'] !== ' ') { - $error = 'There must be a single space after the colon in a property/label declaration'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'After'); - if ($fix === true) { - if ($tokens[($colon + 1)]['code'] === T_WHITESPACE) { - $phpcsFile->fixer->replaceToken(($colon + 1), ' '); - } else { - $phpcsFile->fixer->addContent($colon, ' '); - } - } - } - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return 'Support for scanning JavaScript files will be removed completely in v4.0.0.'; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/ScopeClosingBraceSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/ScopeClosingBraceSniff.php deleted file mode 100644 index 69e7b0f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/ScopeClosingBraceSniff.php +++ /dev/null @@ -1,114 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ScopeClosingBraceSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return Tokens::$scopeOpeners; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile All the tokens found in the document. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - // If this is an inline condition (ie. there is no scope opener), then - // return, as this is not a new scope. - if (isset($tokens[$stackPtr]['scope_closer']) === false) { - return; - } - - // We need to actually find the first piece of content on this line, - // as if this is a method with tokens before it (public, static etc) - // or an if with an else before it, then we need to start the scope - // checking from there, rather than the current token. - $lineStart = $phpcsFile->findFirstOnLine([T_WHITESPACE, T_INLINE_HTML], $stackPtr, true); - while ($tokens[$lineStart]['code'] === T_CONSTANT_ENCAPSED_STRING - && $tokens[($lineStart - 1)]['code'] === T_CONSTANT_ENCAPSED_STRING - ) { - $lineStart = $phpcsFile->findFirstOnLine([T_WHITESPACE, T_INLINE_HTML], ($lineStart - 1), true); - } - - $startColumn = $tokens[$lineStart]['column']; - $scopeStart = $tokens[$stackPtr]['scope_opener']; - $scopeEnd = $tokens[$stackPtr]['scope_closer']; - - // Check that the closing brace is on it's own line. - $lastContent = $phpcsFile->findPrevious([T_INLINE_HTML, T_WHITESPACE, T_OPEN_TAG], ($scopeEnd - 1), $scopeStart, true); - for ($lineStart = $scopeEnd; $tokens[$lineStart]['column'] > 1; $lineStart--); - - if ($tokens[$lastContent]['line'] === $tokens[$scopeEnd]['line'] - || ($tokens[$lineStart]['code'] === T_INLINE_HTML - && trim($tokens[$lineStart]['content']) !== '') - ) { - $error = 'Closing brace must be on a line by itself'; - $fix = $phpcsFile->addFixableError($error, $scopeEnd, 'ContentBefore'); - if ($fix === true) { - if ($tokens[$lastContent]['line'] === $tokens[$scopeEnd]['line']) { - $phpcsFile->fixer->addNewlineBefore($scopeEnd); - } else { - $phpcsFile->fixer->addNewlineBefore(($lineStart + 1)); - } - } - - return; - } - - // Check now that the closing brace is lined up correctly. - $lineStart = $phpcsFile->findFirstOnLine([T_WHITESPACE, T_INLINE_HTML], $scopeEnd, true); - $braceIndent = $tokens[$lineStart]['column']; - if ($tokens[$stackPtr]['code'] !== T_DEFAULT - && $tokens[$stackPtr]['code'] !== T_CASE - && $braceIndent !== $startColumn - ) { - $error = 'Closing brace indented incorrectly; expected %s spaces, found %s'; - $data = [ - ($startColumn - 1), - ($braceIndent - 1), - ]; - - $fix = $phpcsFile->addFixableError($error, $scopeEnd, 'Indent', $data); - if ($fix === true) { - $diff = ($startColumn - $braceIndent); - if ($diff > 0) { - $phpcsFile->fixer->addContentBefore($lineStart, str_repeat(' ', $diff)); - } else { - $phpcsFile->fixer->substrToken(($lineStart - 1), 0, $diff); - } - } - }//end if - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/ScopeKeywordSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/ScopeKeywordSpacingSniff.php deleted file mode 100644 index 4d7f7b3..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/ScopeKeywordSpacingSniff.php +++ /dev/null @@ -1,171 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ScopeKeywordSpacingSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - $register = Tokens::$methodPrefixes; - $register += Tokens::$scopeModifiers; - $register[T_READONLY] = T_READONLY; - return $register; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $nextNonWhitespace = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if ($nextNonWhitespace === false) { - // Parse error/live coding. Bow out. - return; - } - - $prevToken = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); - $nextToken = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - - if ($tokens[$stackPtr]['code'] === T_STATIC) { - if (($nextToken === false || $tokens[$nextToken]['code'] === T_DOUBLE_COLON) - || $tokens[$prevToken]['code'] === T_NEW - ) { - // Late static binding, e.g., static:: OR new static() usage or live coding. - return; - } - - if ($prevToken !== false - && $tokens[$prevToken]['code'] === T_TYPE_UNION - ) { - // Not a scope keyword, but a union return type. - return; - } - - if ($prevToken !== false - && $tokens[$prevToken]['code'] === T_NULLABLE - ) { - // Not a scope keyword, but a return type. - return; - } - - if ($prevToken !== false - && $tokens[$prevToken]['code'] === T_COLON - ) { - $prevPrevToken = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($prevToken - 1), null, true); - if ($prevPrevToken !== false - && $tokens[$prevPrevToken]['code'] === T_CLOSE_PARENTHESIS - ) { - // Not a scope keyword, but a return type. - return; - } - } - }//end if - - if ($tokens[$prevToken]['code'] === T_AS) { - // Trait visibility change, e.g., "use HelloWorld { sayHello as private; }". - return; - } - - $isInFunctionDeclaration = false; - if (empty($tokens[$stackPtr]['nested_parenthesis']) === false) { - // Check if this is PHP 8.0 constructor property promotion. - // In that case, we can't have multi-property definitions. - $nestedParens = $tokens[$stackPtr]['nested_parenthesis']; - $lastCloseParens = end($nestedParens); - if (isset($tokens[$lastCloseParens]['parenthesis_owner']) === true - && $tokens[$tokens[$lastCloseParens]['parenthesis_owner']]['code'] === T_FUNCTION - ) { - $isInFunctionDeclaration = true; - } - } - - if ($nextToken !== false - && $tokens[$nextToken]['code'] === T_VARIABLE - && $isInFunctionDeclaration === false - ) { - $endOfStatement = $phpcsFile->findNext(T_SEMICOLON, ($nextToken + 1)); - if ($endOfStatement === false) { - // Live coding. - return; - } - - $multiProperty = $phpcsFile->findNext(T_VARIABLE, ($nextToken + 1), $endOfStatement); - if ($multiProperty !== false - && $tokens[$stackPtr]['line'] !== $tokens[$nextToken]['line'] - && $tokens[$nextToken]['line'] !== $tokens[$endOfStatement]['line'] - ) { - // Allow for multiple properties definitions to each be on their own line. - return; - } - } - - if ($tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) { - $spacing = 0; - } else { - if ($tokens[($stackPtr + 2)]['line'] !== $tokens[$stackPtr]['line']) { - $spacing = 'newline'; - } else { - $spacing = $tokens[($stackPtr + 1)]['length']; - } - } - - if ($spacing !== 1) { - $error = 'Scope keyword "%s" must be followed by a single space; found %s'; - $data = [ - $tokens[$stackPtr]['content'], - $spacing, - ]; - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Incorrect', $data); - if ($fix === true) { - if ($spacing === 0) { - $phpcsFile->fixer->addContent($stackPtr, ' '); - } else { - $phpcsFile->fixer->beginChangeset(); - - for ($i = ($stackPtr + 2); $i < $phpcsFile->numTokens; $i++) { - if (isset($tokens[$i]) === false || $tokens[$i]['code'] !== T_WHITESPACE) { - break; - } - - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->replaceToken(($stackPtr + 1), ' '); - $phpcsFile->fixer->endChangeset(); - } - }//end if - }//end if - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/SemicolonSpacingSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/SemicolonSpacingSniff.php deleted file mode 100644 index 314af44..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/SemicolonSpacingSniff.php +++ /dev/null @@ -1,116 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class SemicolonSpacingSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - ]; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_SEMICOLON]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $prevType = $tokens[($stackPtr - 1)]['code']; - if (isset(Tokens::$emptyTokens[$prevType]) === false) { - return; - } - - $nonSpace = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 2), null, true); - - // Detect whether this is a semicolon for a condition in a `for()` control structure. - $forCondition = false; - if (isset($tokens[$stackPtr]['nested_parenthesis']) === true) { - $nestedParens = $tokens[$stackPtr]['nested_parenthesis']; - $closeParenthesis = end($nestedParens); - - if (isset($tokens[$closeParenthesis]['parenthesis_owner']) === true) { - $owner = $tokens[$closeParenthesis]['parenthesis_owner']; - - if ($tokens[$owner]['code'] === T_FOR) { - $forCondition = true; - $nonSpace = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 2), null, true); - } - } - } - - if ($tokens[$nonSpace]['code'] === T_SEMICOLON - || ($forCondition === true && $nonSpace === $tokens[$owner]['parenthesis_opener']) - || (isset($tokens[$nonSpace]['scope_opener']) === true - && $tokens[$nonSpace]['scope_opener'] === $nonSpace) - ) { - // Empty statement. - return; - } - - $expected = $tokens[$nonSpace]['content'].';'; - $found = $phpcsFile->getTokensAsString($nonSpace, ($stackPtr - $nonSpace)).';'; - $found = str_replace("\n", '\n', $found); - $found = str_replace("\r", '\r', $found); - $found = str_replace("\t", '\t', $found); - $error = 'Space found before semicolon; expected "%s" but found "%s"'; - $data = [ - $expected, - $found, - ]; - - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Incorrect', $data); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $i = ($stackPtr - 1); - while (($tokens[$i]['code'] === T_WHITESPACE) && ($i > $nonSpace)) { - $phpcsFile->fixer->replaceToken($i, ''); - $i--; - } - - $phpcsFile->fixer->addContent($nonSpace, ';'); - $phpcsFile->fixer->replaceToken($stackPtr, ''); - - $phpcsFile->fixer->endChangeset(); - } - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/SuperfluousWhitespaceSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/SuperfluousWhitespaceSniff.php deleted file mode 100644 index 08ed3e7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Sniffs/WhiteSpace/SuperfluousWhitespaceSniff.php +++ /dev/null @@ -1,265 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; - -class SuperfluousWhitespaceSniff implements Sniff -{ - - /** - * A list of tokenizers this sniff supports. - * - * @var array - */ - public $supportedTokenizers = [ - 'PHP', - 'JS', - 'CSS', - ]; - - /** - * If TRUE, whitespace rules are not checked for blank lines. - * - * Blank lines are those that contain only whitespace. - * - * @var boolean - */ - public $ignoreBlankLines = false; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [ - T_OPEN_TAG, - T_OPEN_TAG_WITH_ECHO, - T_CLOSE_TAG, - T_WHITESPACE, - T_COMMENT, - T_DOC_COMMENT_WHITESPACE, - T_CLOSURE, - ]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$stackPtr]['code'] === T_OPEN_TAG) { - /* - Check for start of file whitespace. - */ - - if ($phpcsFile->tokenizerType !== 'PHP') { - // The first token is always the open tag inserted when tokenized - // and the second token is always the first piece of content in - // the file. If the second token is whitespace, there was - // whitespace at the start of the file. - if ($tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) { - return; - } - - if ($phpcsFile->fixer->enabled === true) { - $stackPtr = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - } - } else { - // If it's the first token, then there is no space. - if ($stackPtr === 0) { - return; - } - - $beforeOpen = ''; - - for ($i = ($stackPtr - 1); $i >= 0; $i--) { - // If we find something that isn't inline html then there is something previous in the file. - if ($tokens[$i]['type'] !== 'T_INLINE_HTML') { - return; - } - - $beforeOpen .= $tokens[$i]['content']; - } - - // If we have ended up with inline html make sure it isn't just whitespace. - if (preg_match('`^[\pZ\s]+$`u', $beforeOpen) !== 1) { - return; - } - }//end if - - $fix = $phpcsFile->addFixableError('Additional whitespace found at start of file', $stackPtr, 'StartFile'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - for ($i = 0; $i < $stackPtr; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } else if ($tokens[$stackPtr]['code'] === T_CLOSE_TAG) { - /* - Check for end of file whitespace. - */ - - if ($phpcsFile->tokenizerType === 'PHP') { - if (isset($tokens[($stackPtr + 1)]) === false) { - // The close PHP token is the last in the file. - return; - } - - $afterClose = ''; - - for ($i = ($stackPtr + 1); $i < $phpcsFile->numTokens; $i++) { - // If we find something that isn't inline HTML then there - // is more to the file. - if ($tokens[$i]['type'] !== 'T_INLINE_HTML') { - return; - } - - $afterClose .= $tokens[$i]['content']; - } - - // If we have ended up with inline html make sure it isn't just whitespace. - if (preg_match('`^[\pZ\s]+$`u', $afterClose) !== 1) { - return; - } - } else { - // The last token is always the close tag inserted when tokenized - // and the second last token is always the last piece of content in - // the file. If the second last token is whitespace, there was - // whitespace at the end of the file. - $stackPtr--; - - // The pointer is now looking at the last content in the file and - // not the fake PHP end tag the tokenizer inserted. - if ($tokens[$stackPtr]['code'] !== T_WHITESPACE) { - return; - } - - // Allow a single newline at the end of the last line in the file. - if ($tokens[($stackPtr - 1)]['code'] !== T_WHITESPACE - && $tokens[$stackPtr]['content'] === $phpcsFile->eolChar - ) { - return; - } - }//end if - - $fix = $phpcsFile->addFixableError('Additional whitespace found at end of file', $stackPtr, 'EndFile'); - if ($fix === true) { - if ($phpcsFile->tokenizerType !== 'PHP') { - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - $stackPtr = ($prev + 1); - } - - $phpcsFile->fixer->beginChangeset(); - for ($i = ($stackPtr + 1); $i < $phpcsFile->numTokens; $i++) { - $phpcsFile->fixer->replaceToken($i, ''); - } - - $phpcsFile->fixer->endChangeset(); - } - } else { - /* - Check for end of line whitespace. - */ - - // Ignore whitespace that is not at the end of a line. - if (isset($tokens[($stackPtr + 1)]['line']) === true - && $tokens[($stackPtr + 1)]['line'] === $tokens[$stackPtr]['line'] - ) { - return; - } - - // Ignore blank lines if required. - if ($this->ignoreBlankLines === true - && $tokens[$stackPtr]['code'] === T_WHITESPACE - && $tokens[($stackPtr - 1)]['line'] !== $tokens[$stackPtr]['line'] - ) { - return; - } - - $tokenContent = rtrim($tokens[$stackPtr]['content'], $phpcsFile->eolChar); - if (empty($tokenContent) === false) { - if ($tokenContent !== rtrim($tokenContent)) { - $fix = $phpcsFile->addFixableError('Whitespace found at end of line', $stackPtr, 'EndLine'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($stackPtr, rtrim($tokenContent).$phpcsFile->eolChar); - } - } - } else if ($tokens[($stackPtr - 1)]['content'] !== rtrim($tokens[($stackPtr - 1)]['content']) - && $tokens[($stackPtr - 1)]['line'] === $tokens[$stackPtr]['line'] - ) { - $fix = $phpcsFile->addFixableError('Whitespace found at end of line', ($stackPtr - 1), 'EndLine'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr - 1), rtrim($tokens[($stackPtr - 1)]['content'])); - } - } - - /* - Check for multiple blank lines in a function. - */ - - if (($phpcsFile->hasCondition($stackPtr, [T_FUNCTION, T_CLOSURE]) === true) - && $tokens[($stackPtr - 1)]['line'] < $tokens[$stackPtr]['line'] - && $tokens[($stackPtr - 2)]['line'] === $tokens[($stackPtr - 1)]['line'] - ) { - // Properties and functions in nested classes have their own rules for spacing. - $conditions = $tokens[$stackPtr]['conditions']; - $deepestScope = end($conditions); - if ($deepestScope === T_ANON_CLASS) { - return; - } - - // This is an empty line and the line before this one is not - // empty, so this could be the start of a multiple empty - // line block. - $next = $phpcsFile->findNext(T_WHITESPACE, $stackPtr, null, true); - $lines = ($tokens[$next]['line'] - $tokens[$stackPtr]['line']); - if ($lines > 1) { - $error = 'Functions must not contain multiple empty lines in a row; found %s empty lines'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'EmptyLines', [$lines]); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $i = $stackPtr; - while ($tokens[$i]['line'] !== $tokens[$next]['line']) { - $phpcsFile->fixer->replaceToken($i, ''); - $i++; - } - - $phpcsFile->fixer->addNewlineBefore($i); - $phpcsFile->fixer->endChangeset(); - } - } - }//end if - }//end if - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayBracketSpacingUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayBracketSpacingUnitTest.inc deleted file mode 100644 index 8ffc868..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayBracketSpacingUnitTest.inc +++ /dev/null @@ -1,31 +0,0 @@ - 'bar', - 'bar' => 'foo', -]; - -if ($foo) {} -[$a, $b] = $c; - -echo foo()[ 1 ]; - -echo $this->addedCustomFunctions['nonce']; -echo $this->deprecated_functions[ $function_name ]['version']; - -echo [ 1,2,3 ][0]; -echo [ 1,2,3 ][ 0 ]; -echo 'PHP'[ 0 ]; - -$array = []; -$var = $var[$var[$var]]]; // Syntax error -$var = $var[$var[$var]; // Syntax error - -$myArray[ /* key start */'key'] = $value; -$myArray[ /* key start */'key'/* key end */ ] = $value; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayBracketSpacingUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayBracketSpacingUnitTest.inc.fixed deleted file mode 100644 index 41d6640..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayBracketSpacingUnitTest.inc.fixed +++ /dev/null @@ -1,31 +0,0 @@ - 'bar', - 'bar' => 'foo', -]; - -if ($foo) {} -[$a, $b] = $c; - -echo foo()[1]; - -echo $this->addedCustomFunctions['nonce']; -echo $this->deprecated_functions[$function_name]['version']; - -echo [ 1,2,3 ][0]; -echo [ 1,2,3 ][0]; -echo 'PHP'[0]; - -$array = []; -$var = $var[$var[$var]]]; // Syntax error -$var = $var[$var[$var]; // Syntax error - -$myArray[/* key start */'key'] = $value; -$myArray[/* key start */'key'/* key end */] = $value; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayBracketSpacingUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayBracketSpacingUnitTest.php deleted file mode 100644 index f696eca..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayBracketSpacingUnitTest.php +++ /dev/null @@ -1,62 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Arrays; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ArrayBracketSpacing sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Arrays\ArrayBracketSpacingSniff - */ -final class ArrayBracketSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 5 => 3, - 7 => 3, - 17 => 2, - 20 => 2, - 23 => 2, - 24 => 2, - 30 => 1, - 31 => 2, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.1.inc deleted file mode 100644 index 6a25ab9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.1.inc +++ /dev/null @@ -1,560 +0,0 @@ - 1, - ); -} - -class TestClass -{ - public $good = array( - 'width' => '', - 'height' => '', - ); - - private $_bad = ARRAY( - 'width' => '', - 'height' => '' - ); - - - public function test() - { - $truck = array( - 'width' => '', - 'height' => '', - ); - - $plane = Array( - 'width' => '', - 'height' => '', - ); - - $car = array( - 'width' => '', - 'height' => '', - ); - - $bus = array( - 'width' => '', - 'height' => '' - ); - - $train = array ( - TRUE, - FALSE, - 'aaa' - ); - - $inline = array('aaa', 'bbb', 'ccc'); - $inline = array('aaa'); - $inline = Array('aaa'); - - $bigone = array( - 'name' => 'bigone', - 'children' => Array( - '1a' => 'child', - '11b' => 'child', - '111c' => 'child', - 'children' => Array( - 'child' => 'aaa', - ), - ), - 'short_name' => 'big' - ); - } - -}//end class - -$value = array ( ); -$value = array( ); -$value = array('1'=>$one, '2' => $two, '3'=> $three, '4' =>$four); -$value = array('1'=>$one); - -if (in_array('1', array('1','2','3')) === TRUE) { - $value = in_array('1', array('1' , '2', '3','4')); -} - -$value = array( - '1'=> TRUE, - FALSE, - '3' => 'aaa',); - -$value = array( - '1'=> TRUE, - FALSE, - ); - -$value = array( - TRUE, - '1' => FALSE, - ); - -$value = array(1, - 2 , - 3 , - ); - -$value = array(1 => $one, - 2 => $two , - 3 => $three , - ); - -$value = array( - 'tag' => $tag, - 'space' => $this->_getIndentation($tag, $tagElement), - ); - -$expected = array( - array( - '1' => 1, - '1' => 2, - ), - ); - -$expected = array( - array( - '1' => 1, - '1' => 2 - ) - ); - -// Space in second arg. -$args = array( - '"'.$this->id.'"', - (int) $hasSessions, - ); - -// No errors. -$paths = array( - Init::ROOT_DIR.'/Systems' => 'Systems', - Init::ROOT_DIR.'/Installer' => 'Systems', - ); - -$x = array( - ); - -$x = array('test' - ); -$x = array('test', - ); -$x = array('name' => 'test', - ); - -$x = array( - $x, - ); - -$func = array( - $x, - 'get'.$x.'Replacement' - ); - -$array = array( - 'input_one' => 'one', - 'inputTwo' => 'two', - 'input_3' => 3, - ); - -$array = array( - 'input_one', - 'inputTwo', - 'input_3', - ); - -// Malformed -$foo = array(1 -, 2); - -$listItems[$aliasPath] = array('itemContent' => implode('
    ', $aliases)); - -$listItems[$aliasPath] = array( - 'itemContent' => implode('
    ', $aliases) - ); - -$x = array - ( - $x, - $y, - ); - -$x = array -( - $x, - $y, - ); - -$x = array( - - $x, - $y, - ); - -$test = array( - 'test' => TestFunction::blah( - $value1, - $value2 - ), - ); - -$c = array('a' => 1,); - -function b() -{ - $a = array( - 'a' => a('a'), - - ); - -} - -$foo = Array('[',']',':',"\n","\r"); -$bar = Array('[',']',':',' ',' '); - -function foo() -{ - return array($a, $b->screen); -} - -$array = array( - 'name' => 'contactSubject', - 'required' => TRUE, - 'validators' => array( - new \Zend\Validator\InArray(array('haystack' => array_keys($aSubjects))), - ), - ); - -$var = array( - 'ViewHelper', - array('Foo'), - 'Errors', - ); - -$data = array( - 'first', - 'second', - 'third', - // Add more here - ); - -$data = array( - 'first', - 'second', - //'third', - ); - -$data = array( - 'first', - 'second' - //'third', - ); - -$foo = array( - $this->getViewName() . '.id' => 'value', - $this->getViewName() . '.title' => 'value', - ); - -$foo = array( - $this->getViewName() . '.id', - $this->getViewName() . '.title', - ); - -$weightings = array( - T_CLOSURE => 100, - - /* - Conditions. - */ - - T_WHILE => 50, - - /* - Operators and arithmetic. - */ - - T_BITWISE_AND => 8, - - T_BOOLEAN_AND => 5, - - /* - Equality. - */ - - T_IS_GREATER_OR_EQUAL => 5, - ); - -foreach (array( - 'foo' => 'bar', - 'foobaz' => 'bazzy', - ) as $key => $value) { -} - -$ids = array( - '1', // Foo. - '13', // Bar. - ); - -array( - 'key1' => function($bar) { - return $bar; - }, - 'key2' => function($foo) { - return $foo; - }, - 'key3' => function($bar) { - return $bar; - } -); - -array( - 'key1' => array( - '1', - '2', - ) -); - -$var = array( - 'tab_template' => ' -
  • %s
  • ', - 'panel_template' => ' -
    - %s -
    ', - ); - -function test() : array -{ - return []; -} - -$fields = array( - 'id' => array('type' => 'INT'), - 'value' => array('type' => 'VARCHAR')); - -get_current_screen()->add_help_tab( array( - 'id' => << false); - -$x = array( - 'xxxx' => array('aaaaaaaaaa' => 'ccccccccccc', - 'bbbbbbbb' => false), -); - -$foo = array - ('foo' => array - ('bar1' => 1 - ,'bar2' => 1 - ,'bar3' => 1 - ,'bar4' => 1 - ,'bar5' => 1 - ) - ); - -$foo = array( - '1' => $row['status'] === 'rejected' - ? self::REJECTED_CODE - : self::VERIFIED_CODE, - '2' => in_array($row['status'], array('notverified', 'unverified'), true) - ? self::STATUS_PENDING - : self::STATUS_VERIFIED, - '3' => strtotime($row['date']), - ); - -$foo = foo( - array( - // comment - ) -); - -$foo = array( - << lorem( - 1 - ), 2 => 2, -); - -$foo = array( - 'тип' => 'авто', - 'цвет' => 'синий', - ); - -$paths = array( - Init::ROOT_DIR.'/тип' => 'авто', - Init::ROOT_DIR.'/цвет' => 'синий', - ); - -$foo = array(<< fn() => return 1, - 'bb' => fn() => return 2, - 'ccc' => ( true ) ? - fn() => return 1 : - fn() => return 2, - ); - -$array = array( - 1 => '1', - 2 => fn ($x) => yield 'a' => $x, - 3 => '3', - ); - -$foo = array( - $this->fn => 'value', - $foo->fn => 'value', - ); - -array($a, $b, -$c); - -array('a' => $a, 'b' => $b, -'c' => $c); - -array( - static function() { - return null; - }, - (array) array(), - (bool) array(), - (double) array(), - (int) array(), - (object) array(), - (string) array(), - (unset) array(), -); - -array( - 'foo', - 'bar' - // This is a non-fixable error. - , -); - -yield array( - static fn () : string => '', -); - -yield array( - static fn () : string => '', - ); - -$foo = array( - 'foo' => match ($anything) { - 'foo' => 'bar', - default => null, - }, - ); - -// Intentional syntax error. -$a = array( - 'a' => - ); - -// Safeguard correct errors for key/no key when PHP 7.4+ array unpacking is encountered. -$x = array( - ...$a, - 'foo' => 'bar', - ); - -$x = array( - 'foo' => 'bar', - ...$a, - ); - -$x = array( - 'foo' => 'bar', - ...$a, - 'baz' => 'bar', - ); - -$x = array( - ...$a, - 'foo' => 'bar', // OK. - 'bar', // NoKeySpecified Error (based on second entry). - ); - -$x = array( - ...$a, - 'bar', // OK. - 'foo' => 'bar', // KeySpecified Error (based on second entry). - ); - -$x = array( - 'foo' => 'bar', - ...$a, - 'baz' => 'bar', - 'bar', // NoKeySpecified Error (based on first entry). - ); - -$x = array( - 'bar', - ...$a, - 'bar', - 'baz' => 'bar', // KeySpecified (based on first entry). - ); - - $x = - array( - 'a', - 'b', - ); - -$x = array( - 1, static fn (float $item): float => match ($item) { - 2.0 => 3.0, - default => $item - }, - ); - -$x = array( - 1, static::helloWorld(), $class instanceof static, - 2, - ); - -$noSpaceBeforeDoubleArrow = array( - 'width'=> '', - 'height' => '', - ); - -$newlineAfterDoubleArrow = array( - 'width' => - '', - 'height' => '', - ); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.1.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.1.inc.fixed deleted file mode 100644 index 048f898..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.1.inc.fixed +++ /dev/null @@ -1,598 +0,0 @@ - 1); -} - -class TestClass -{ - public $good = array( - 'width' => '', - 'height' => '', - ); - - private $_bad = array( - 'width' => '', - 'height' => '', - ); - - - public function test() - { - $truck = array( - 'width' => '', - 'height' => '', - ); - - $plane = array( - 'width' => '', - 'height' => '', - ); - - $car = array( - 'width' => '', - 'height' => '', - ); - - $bus = array( - 'width' => '', - 'height' => '', - ); - - $train = array( - TRUE, - FALSE, - 'aaa', - ); - - $inline = array( - 'aaa', - 'bbb', - 'ccc', - ); - $inline = array('aaa'); - $inline = array('aaa'); - - $bigone = array( - 'name' => 'bigone', - 'children' => array( - '1a' => 'child', - '11b' => 'child', - '111c' => 'child', - 'children' => array('child' => 'aaa'), - ), - 'short_name' => 'big', - ); - } - -}//end class - -$value = array(); -$value = array(); -$value = array( - '1' => $one, - '2' => $two, - '3' => $three, - '4' => $four, - ); -$value = array('1' => $one); - -if (in_array('1', array('1', '2', '3')) === TRUE) { - $value = in_array('1', array('1', '2', '3', '4')); -} - -$value = array( - '1'=> TRUE, - FALSE, - '3' => 'aaa', - ); - -$value = array( - '1'=> TRUE, - FALSE, - ); - -$value = array( - TRUE, - '1' => FALSE, - ); - -$value = array( - 1, - 2, - 3, - ); - -$value = array( - 1 => $one, - 2 => $two, - 3 => $three, - ); - -$value = array( - 'tag' => $tag, - 'space' => $this->_getIndentation($tag, $tagElement), - ); - -$expected = array( - array( - '1' => 1, - '1' => 2, - ), - ); - -$expected = array( - array( - '1' => 1, - '1' => 2, - ), - ); - -// Space in second arg. -$args = array( - '"'.$this->id.'"', - (int) $hasSessions, - ); - -// No errors. -$paths = array( - Init::ROOT_DIR.'/Systems' => 'Systems', - Init::ROOT_DIR.'/Installer' => 'Systems', - ); - -$x = array(); - -$x = array('test'); -$x = array('test'); -$x = array('name' => 'test'); - -$x = array($x); - -$func = array( - $x, - 'get'.$x.'Replacement', - ); - -$array = array( - 'input_one' => 'one', - 'inputTwo' => 'two', - 'input_3' => 3, - ); - -$array = array( - 'input_one', - 'inputTwo', - 'input_3', - ); - -// Malformed -$foo = array( - 1, - 2, - ); - -$listItems[$aliasPath] = array('itemContent' => implode('
    ', $aliases)); - -$listItems[$aliasPath] = array( - 'itemContent' => implode('
    ', $aliases), - ); - -$x = array( - $x, - $y, - ); - -$x = array( - $x, - $y, - ); - -$x = array( - - $x, - $y, - ); - -$test = array( - 'test' => TestFunction::blah( - $value1, - $value2 - ), - ); - -$c = array('a' => 1); - -function b() -{ - $a = array( - 'a' => a('a'), - - ); - -} - -$foo = array( - '[', - ']', - ':', - "\n", - "\r", - ); -$bar = array( - '[', - ']', - ':', - ' ', - ' ', - ); - -function foo() -{ - return array( - $a, - $b->screen, - ); -} - -$array = array( - 'name' => 'contactSubject', - 'required' => TRUE, - 'validators' => array( - new \Zend\Validator\InArray(array('haystack' => array_keys($aSubjects))), - ), - ); - -$var = array( - 'ViewHelper', - array('Foo'), - 'Errors', - ); - -$data = array( - 'first', - 'second', - 'third', - // Add more here - ); - -$data = array( - 'first', - 'second', - //'third', - ); - -$data = array( - 'first', - 'second', - //'third', - ); - -$foo = array( - $this->getViewName() . '.id' => 'value', - $this->getViewName() . '.title' => 'value', - ); - -$foo = array( - $this->getViewName() . '.id', - $this->getViewName() . '.title', - ); - -$weightings = array( - T_CLOSURE => 100, - - /* - Conditions. - */ - - T_WHILE => 50, - - /* - Operators and arithmetic. - */ - - T_BITWISE_AND => 8, - - T_BOOLEAN_AND => 5, - - /* - Equality. - */ - - T_IS_GREATER_OR_EQUAL => 5, - ); - -foreach (array( - 'foo' => 'bar', - 'foobaz' => 'bazzy', - ) as $key => $value) { -} - -$ids = array( - '1', // Foo. - '13', // Bar. - ); - -array( - 'key1' => function($bar) { - return $bar; - }, - 'key2' => function($foo) { - return $foo; - }, - 'key3' => function($bar) { - return $bar; - }, -); - -array( - 'key1' => array( - '1', - '2', - ), -); - -$var = array( - 'tab_template' => ' -
  • %s
  • ', - 'panel_template' => ' -
    - %s -
    ', - ); - -function test() : array -{ - return []; -} - -$fields = array( - 'id' => array('type' => 'INT'), - 'value' => array('type' => 'VARCHAR'), - ); - -get_current_screen()->add_help_tab( array( - 'id' => << false); - -$x = array( - 'xxxx' => array( - 'aaaaaaaaaa' => 'ccccccccccc', - 'bbbbbbbb' => false, - ), - ); - -$foo = array( - 'foo' => array( - 'bar1' => 1, - 'bar2' => 1, - 'bar3' => 1, - 'bar4' => 1, - 'bar5' => 1, - ), - ); - -$foo = array( - '1' => $row['status'] === 'rejected' - ? self::REJECTED_CODE - : self::VERIFIED_CODE, - '2' => in_array($row['status'], array('notverified', 'unverified'), true) - ? self::STATUS_PENDING - : self::STATUS_VERIFIED, - '3' => strtotime($row['date']), - ); - -$foo = foo( - array( - // comment - ) -); - -$foo = array( - << lorem( - 1 - ), - 2 => 2, -); - -$foo = array( - 'тип' => 'авто', - 'цвет' => 'синий', - ); - -$paths = array( - Init::ROOT_DIR.'/тип' => 'авто', - Init::ROOT_DIR.'/цвет' => 'синий', - ); - -$foo = array(<< fn() => return 1, - 'bb' => fn() => return 2, - 'ccc' => ( true ) ? - fn() => return 1 : - fn() => return 2, - ); - -$array = array( - 1 => '1', - 2 => fn ($x) => yield 'a' => $x, - 3 => '3', - ); - -$foo = array( - $this->fn => 'value', - $foo->fn => 'value', - ); - -array( - $a, - $b, - $c, -); - -array( - 'a' => $a, - 'b' => $b, - 'c' => $c, -); - -array( - static function() { - return null; - }, - (array) array(), - (bool) array(), - (double) array(), - (int) array(), - (object) array(), - (string) array(), - (unset) array(), -); - -array( - 'foo', - 'bar' - // This is a non-fixable error. - , -); - -yield array( - static fn () : string => '', - ); - -yield array( - static fn () : string => '', - ); - -$foo = array( - 'foo' => match ($anything) { - 'foo' => 'bar', - default => null, - }, - ); - -// Intentional syntax error. -$a = array( - 'a' => - ); - -// Safeguard correct errors for key/no key when PHP 7.4+ array unpacking is encountered. -$x = array( - ...$a, - 'foo' => 'bar', - ); - -$x = array( - 'foo' => 'bar', - ...$a, - ); - -$x = array( - 'foo' => 'bar', - ...$a, - 'baz' => 'bar', - ); - -$x = array( - ...$a, - 'foo' => 'bar', // OK. - 'bar', // NoKeySpecified Error (based on second entry). - ); - -$x = array( - ...$a, - 'bar', // OK. - 'foo' => 'bar', // KeySpecified Error (based on second entry). - ); - -$x = array( - 'foo' => 'bar', - ...$a, - 'baz' => 'bar', - 'bar', // NoKeySpecified Error (based on first entry). - ); - -$x = array( - 'bar', - ...$a, - 'bar', - 'baz' => 'bar', // KeySpecified (based on first entry). - ); - - $x = - array( - 'a', - 'b', - ); - -$x = array( - 1, - static fn (float $item): float => match ($item) { - 2.0 => 3.0, - default => $item - }, - ); - -$x = array( - 1, - static::helloWorld(), - $class instanceof static, - 2, - ); - -$noSpaceBeforeDoubleArrow = array( - 'width' => '', - 'height' => '', - ); - -$newlineAfterDoubleArrow = array( - 'width' => '', - 'height' => '', - ); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.2.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.2.inc deleted file mode 100644 index 415042d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.2.inc +++ /dev/null @@ -1,555 +0,0 @@ - 1, - ]; -} - -class TestClass -{ - public $good = [ - 'width' => '', - 'height' => '', - ]; - - private $_bad = [ - 'width' => '', - 'height' => '' - ]; - - - public function test() - { - $truck = [ - 'width' => '', - 'height' => '', - ]; - - $plane = [ - 'width' => '', - 'height' => '', - ]; - - $car = [ - 'width' => '', - 'height' => '', - ]; - - $bus = [ - 'width' => '', - 'height' => '' - ]; - - $train = [ - TRUE, - FALSE, - 'aaa' - ]; - - $inline = ['aaa', 'bbb', 'ccc']; - $inline = ['aaa']; - $inline = ['aaa']; - - $bigone = [ - 'name' => 'bigone', - 'children' => [ - '1a' => 'child', - '11b' => 'child', - '111c' => 'child', - 'children' => [ - 'child' => 'aaa', - ], - ], - 'short_name' => 'big' - ]; - } - -}//end class - -$value = [ ]; -$value = [ ]; -$value = ['1'=>$one, '2' => $two, '3'=> $three, '4' =>$four]; -$value = ['1'=>$one]; - -if (in_array('1', ['1','2','3']) === TRUE) { - $value = in_array('1', ['1' , '2', '3','4']); -} - -$value = [ - '1'=> TRUE, - FALSE, - '3' => 'aaa',]; - -$value = [ - '1'=> TRUE, - FALSE, - ]; - -$value = [ - TRUE, - '1' => FALSE, - ]; - -$value = [1, - 2 , - 3 , - ]; - -$value = [1 => $one, - 2 => $two , - 3 => $three , - ]; - -$value = [ - 'tag' => $tag, - 'space' => $this->_getIndentation($tag, $tagElement), - ]; - -$expected = [ - [ - '1' => 1, - '1' => 2, - ], - ]; - -$expected = [ - [ - '1' => 1, - '1' => 2 - ] - ]; - -// Space in second arg. -$args = [ - '"'.$this->id.'"', - (int) $hasSessions, - ]; - -// No errors. -$paths = [ - Init::ROOT_DIR.'/Systems' => 'Systems', - Init::ROOT_DIR.'/Installer' => 'Systems', - ]; - -$x = [ - ]; - -$x = ['test' - ]; -$x = ['test', - ]; -$x = ['name' => 'test', - ]; - -$x = [ - $x, - ]; - -$func = [ - $x, - 'get'.$x.'Replacement' - ]; - -$array = [ - 'input_one' => 'one', - 'inputTwo' => 'two', - 'input_3' => 3, - ]; - -$array = [ - 'input_one', - 'inputTwo', - 'input_3', - ]; - -// Malformed -$foo = [1 -, 2]; - -$listItems[$aliasPath] = ['itemContent' => implode('
    ', $aliases)]; - -$listItems[$aliasPath] = [ - 'itemContent' => implode('
    ', $aliases) - ]; - -$x = - [ - $x, - $y, - ]; - -$x = -[ - $x, - $y, - ]; - -$x = [ - - $x, - $y, - ]; - -$test = [ - 'test' => TestFunction::blah( - $value1, - $value2 - ), - ]; - -$c = ['a' => 1,]; -$c->{$var}[ ] = 2; - -$foo = ['[',']',':',"\n","\r"]; -$bar = ['[',']',':',' ',' ']; - -function foo() -{ - return [$a, $b->screen]; -} - -$array = [ - 'name' => 'contactSubject', - 'required' => TRUE, - 'validators' => [ - new \Zend\Validator\InArray(['haystack' => array_keys($aSubjects)]), - ], - ]; - -$var = [ - 'ViewHelper', - ['Foo'], - 'Errors', - ]; - -$data = [ - 'first', - 'second', - 'third', - // Add more here - ]; - -$data = [ - 'first', - 'second', - //'third', - ]; - -$data = [ - 'first', - 'second' - //'third', - ]; - -$foo = [ - $this->getViewName() . '.id' => 'value', - $this->getViewName() . '.title' => 'value', - ]; - -$foo = [ - $this->getViewName() . '.id', - $this->getViewName() . '.title', - ]; - -$weightings = [ - T_CLOSURE => 100, - - /* - Conditions. - */ - - T_WHILE => 50, - - /* - Operators and arithmetic. - */ - - T_BITWISE_AND => 8, - - T_BOOLEAN_AND => 5, - - /* - Equality. - */ - - T_IS_GREATER_OR_EQUAL => 5, - ]; - -foreach ([ - 'foo' => 'bar', - 'foobaz' => 'bazzy', - ] as $key => $value) { -} - -$ids = [ - '1', // Foo. - '13', // Bar. - ]; - -[ - 'key1' => function($bar) { - return $bar; - }, - 'key2' => function($foo) { - return $foo; - }, - 'key3' => function($bar) { - return $bar; - } -]; - -[ - 'key1' => [ - '1', - '2', - ] -]; - -$var = [ - 'tab_template' => ' -
  • %s
  • ', - 'panel_template' => ' -
    - %s -
    ', - ]; - -function test() : array -{ - return []; -} - -$fields = [ - 'id' => ['type' => 'INT'], - 'value' => ['type' => 'VARCHAR']]; - -get_current_screen()->add_help_tab( [ - 'id' => << false]; - -$x = [ - 'xxxx' => ['aaaaaaaaaa' => 'ccccccccccc', - 'bbbbbbbb' => false], -]; - -$foo = ['foo' => ['bar1' => 1 - ,'bar2' => 1 - ,'bar3' => 1 - ,'bar4' => 1 - ,'bar5' => 1 - ] - ]; - -$foo = [ - '1' => $row['status'] === 'rejected' - ? self::REJECTED_CODE - : self::VERIFIED_CODE, - '2' => in_array($row['status'], ['notverified', 'unverified'], true) - ? self::STATUS_PENDING - : self::STATUS_VERIFIED, - '3' => strtotime($row['date']), - ]; - - -$foo = foo( - [ - // comment - ] -); - -$foo = [ - << lorem( - 1 - ), 2 => 2, -]; - -$foo = [ - 'тип' => 'авто', - 'цвет' => 'синий', - ]; - -$paths = [ - Init::ROOT_DIR.'/тип' => 'авто', - Init::ROOT_DIR.'/цвет' => 'синий', - ]; - -$foo = [<< fn() => return 1, - 'bb' => fn() => return 2, - 'ccc' => ( true ) ? - fn() => return 1 : - fn() => return 2, - ]; - -$array = [ - 1 => '1', - 2 => fn ($x) => yield 'a' => $x, - 3 => '3', - ]; - -$foo = [ - $this->fn => 'value', - $foo->fn => 'value', - ]; - -[$a, $b, -$c]; - -['a' => $a, 'b' => $b, -'c' => $c]; - -[ - static function() { - return null; - }, - (array) [], - (bool) [], - (double) [], - (int) [], - (object) [], - (string) [], - (unset) [], -]; - -[ - 'foo', - 'bar' - // This is a non-fixable error. - , -]; - -yield [ - static fn () : string => '', -]; - -yield [ - static fn () : string => '', - ]; - -$foo = [ - 'foo' => match ($anything) { - 'foo' => 'bar', - default => null, - }, - ]; - -// Intentional syntax error. -$a = [ - 'a' => - ]; - -// Safeguard correct errors for key/no key when PHP 7.4+ array unpacking is encountered. -$x = [ - ...$a, - 'foo' => 'bar', - ]; - -$x = [ - 'foo' => 'bar', - ...$a, - ]; - -$x = [ - 'foo' => 'bar', - ...$a, - 'baz' => 'bar', - ]; - -$x = [ - ...$a, - 'foo' => 'bar', // OK. - 'bar', // NoKeySpecified Error (based on second entry). - ]; - -$x = [ - ...$a, - 'bar', // OK. - 'foo' => 'bar', // KeySpecified Error (based on second entry). - ]; - -$x = [ - 'foo' => 'bar', - ...$a, - 'baz' => 'bar', - 'bar', // NoKeySpecified Error (based on first entry). - ]; - -$x = [ - 'bar', - ...$a, - 'bar', - 'baz' => 'bar', // KeySpecified (based on first entry). - ]; - - $x = - [ - 'a', - 'b', - ]; - -$x = [ - 1, static fn (float $item): float => match ($item) { - 2.0 => 3.0, - default => $item - }, - ]; - -$x = [ - 1, static::helloWorld(), $class instanceof static, - 2, - ]; - -$noSpaceBeforeDoubleArrow = [ - 'width'=> '', - 'height' => '', - ]; - -$newlineAfterDoubleArrow = [ - 'width' => - '', - 'height' => '', - ]; - -// Sniff should ignore short lists when inside a foreach. -// https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/527 -foreach ($data as [, , $value]) {} -foreach ($array as $k => [$v1, , $v3]) {} -foreach ([$a ,$b] as $c) {} // Not a short list. Sniff should handle it. diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.2.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.2.inc.fixed deleted file mode 100644 index d835064..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.2.inc.fixed +++ /dev/null @@ -1,591 +0,0 @@ - 1]; -} - -class TestClass -{ - public $good = [ - 'width' => '', - 'height' => '', - ]; - - private $_bad = [ - 'width' => '', - 'height' => '', - ]; - - - public function test() - { - $truck = [ - 'width' => '', - 'height' => '', - ]; - - $plane = [ - 'width' => '', - 'height' => '', - ]; - - $car = [ - 'width' => '', - 'height' => '', - ]; - - $bus = [ - 'width' => '', - 'height' => '', - ]; - - $train = [ - TRUE, - FALSE, - 'aaa', - ]; - - $inline = [ - 'aaa', - 'bbb', - 'ccc', - ]; - $inline = ['aaa']; - $inline = ['aaa']; - - $bigone = [ - 'name' => 'bigone', - 'children' => [ - '1a' => 'child', - '11b' => 'child', - '111c' => 'child', - 'children' => ['child' => 'aaa'], - ], - 'short_name' => 'big', - ]; - } - -}//end class - -$value = []; -$value = []; -$value = [ - '1' => $one, - '2' => $two, - '3' => $three, - '4' => $four, - ]; -$value = ['1' => $one]; - -if (in_array('1', ['1', '2', '3']) === TRUE) { - $value = in_array('1', ['1', '2', '3', '4']); -} - -$value = [ - '1'=> TRUE, - FALSE, - '3' => 'aaa', - ]; - -$value = [ - '1'=> TRUE, - FALSE, - ]; - -$value = [ - TRUE, - '1' => FALSE, - ]; - -$value = [ - 1, - 2, - 3, - ]; - -$value = [ - 1 => $one, - 2 => $two, - 3 => $three, - ]; - -$value = [ - 'tag' => $tag, - 'space' => $this->_getIndentation($tag, $tagElement), - ]; - -$expected = [ - [ - '1' => 1, - '1' => 2, - ], - ]; - -$expected = [ - [ - '1' => 1, - '1' => 2, - ], - ]; - -// Space in second arg. -$args = [ - '"'.$this->id.'"', - (int) $hasSessions, - ]; - -// No errors. -$paths = [ - Init::ROOT_DIR.'/Systems' => 'Systems', - Init::ROOT_DIR.'/Installer' => 'Systems', - ]; - -$x = []; - -$x = ['test']; -$x = ['test']; -$x = ['name' => 'test']; - -$x = [$x]; - -$func = [ - $x, - 'get'.$x.'Replacement', - ]; - -$array = [ - 'input_one' => 'one', - 'inputTwo' => 'two', - 'input_3' => 3, - ]; - -$array = [ - 'input_one', - 'inputTwo', - 'input_3', - ]; - -// Malformed -$foo = [ - 1, - 2, - ]; - -$listItems[$aliasPath] = ['itemContent' => implode('
    ', $aliases)]; - -$listItems[$aliasPath] = [ - 'itemContent' => implode('
    ', $aliases), - ]; - -$x = - [ - $x, - $y, - ]; - -$x = -[ - $x, - $y, -]; - -$x = [ - - $x, - $y, - ]; - -$test = [ - 'test' => TestFunction::blah( - $value1, - $value2 - ), - ]; - -$c = ['a' => 1]; -$c->{$var}[ ] = 2; - -$foo = [ - '[', - ']', - ':', - "\n", - "\r", - ]; -$bar = [ - '[', - ']', - ':', - ' ', - ' ', - ]; - -function foo() -{ - return [ - $a, - $b->screen, - ]; -} - -$array = [ - 'name' => 'contactSubject', - 'required' => TRUE, - 'validators' => [ - new \Zend\Validator\InArray(['haystack' => array_keys($aSubjects)]), - ], - ]; - -$var = [ - 'ViewHelper', - ['Foo'], - 'Errors', - ]; - -$data = [ - 'first', - 'second', - 'third', - // Add more here - ]; - -$data = [ - 'first', - 'second', - //'third', - ]; - -$data = [ - 'first', - 'second', - //'third', - ]; - -$foo = [ - $this->getViewName() . '.id' => 'value', - $this->getViewName() . '.title' => 'value', - ]; - -$foo = [ - $this->getViewName() . '.id', - $this->getViewName() . '.title', - ]; - -$weightings = [ - T_CLOSURE => 100, - - /* - Conditions. - */ - - T_WHILE => 50, - - /* - Operators and arithmetic. - */ - - T_BITWISE_AND => 8, - - T_BOOLEAN_AND => 5, - - /* - Equality. - */ - - T_IS_GREATER_OR_EQUAL => 5, - ]; - -foreach ([ - 'foo' => 'bar', - 'foobaz' => 'bazzy', - ] as $key => $value) { -} - -$ids = [ - '1', // Foo. - '13', // Bar. - ]; - -[ - 'key1' => function($bar) { - return $bar; - }, - 'key2' => function($foo) { - return $foo; - }, - 'key3' => function($bar) { - return $bar; - }, -]; - -[ - 'key1' => [ - '1', - '2', - ], -]; - -$var = [ - 'tab_template' => ' -
  • %s
  • ', - 'panel_template' => ' -
    - %s -
    ', - ]; - -function test() : array -{ - return []; -} - -$fields = [ - 'id' => ['type' => 'INT'], - 'value' => ['type' => 'VARCHAR'], - ]; - -get_current_screen()->add_help_tab( [ - 'id' => << false]; - -$x = [ - 'xxxx' => [ - 'aaaaaaaaaa' => 'ccccccccccc', - 'bbbbbbbb' => false, - ], - ]; - -$foo = [ - 'foo' => [ - 'bar1' => 1, - 'bar2' => 1, - 'bar3' => 1, - 'bar4' => 1, - 'bar5' => 1, - ], - ]; - -$foo = [ - '1' => $row['status'] === 'rejected' - ? self::REJECTED_CODE - : self::VERIFIED_CODE, - '2' => in_array($row['status'], ['notverified', 'unverified'], true) - ? self::STATUS_PENDING - : self::STATUS_VERIFIED, - '3' => strtotime($row['date']), - ]; - - -$foo = foo( - [ - // comment - ] -); - -$foo = [ - << lorem( - 1 - ), - 2 => 2, -]; - -$foo = [ - 'тип' => 'авто', - 'цвет' => 'синий', - ]; - -$paths = [ - Init::ROOT_DIR.'/тип' => 'авто', - Init::ROOT_DIR.'/цвет' => 'синий', - ]; - -$foo = [<< fn() => return 1, - 'bb' => fn() => return 2, - 'ccc' => ( true ) ? - fn() => return 1 : - fn() => return 2, - ]; - -$array = [ - 1 => '1', - 2 => fn ($x) => yield 'a' => $x, - 3 => '3', - ]; - -$foo = [ - $this->fn => 'value', - $foo->fn => 'value', - ]; - -[ - $a, - $b, - $c, -]; - -[ - 'a' => $a, - 'b' => $b, - 'c' => $c, -]; - -[ - static function() { - return null; - }, - (array) [], - (bool) [], - (double) [], - (int) [], - (object) [], - (string) [], - (unset) [], -]; - -[ - 'foo', - 'bar' - // This is a non-fixable error. - , -]; - -yield [ - static fn () : string => '', - ]; - -yield [ - static fn () : string => '', - ]; - -$foo = [ - 'foo' => match ($anything) { - 'foo' => 'bar', - default => null, - }, - ]; - -// Intentional syntax error. -$a = [ - 'a' => - ]; - -// Safeguard correct errors for key/no key when PHP 7.4+ array unpacking is encountered. -$x = [ - ...$a, - 'foo' => 'bar', - ]; - -$x = [ - 'foo' => 'bar', - ...$a, - ]; - -$x = [ - 'foo' => 'bar', - ...$a, - 'baz' => 'bar', - ]; - -$x = [ - ...$a, - 'foo' => 'bar', // OK. - 'bar', // NoKeySpecified Error (based on second entry). - ]; - -$x = [ - ...$a, - 'bar', // OK. - 'foo' => 'bar', // KeySpecified Error (based on second entry). - ]; - -$x = [ - 'foo' => 'bar', - ...$a, - 'baz' => 'bar', - 'bar', // NoKeySpecified Error (based on first entry). - ]; - -$x = [ - 'bar', - ...$a, - 'bar', - 'baz' => 'bar', // KeySpecified (based on first entry). - ]; - - $x = - [ - 'a', - 'b', - ]; - -$x = [ - 1, - static fn (float $item): float => match ($item) { - 2.0 => 3.0, - default => $item - }, - ]; - -$x = [ - 1, - static::helloWorld(), - $class instanceof static, - 2, - ]; - -$noSpaceBeforeDoubleArrow = [ - 'width' => '', - 'height' => '', - ]; - -$newlineAfterDoubleArrow = [ - 'width' => '', - 'height' => '', - ]; - -// Sniff should ignore short lists when inside a foreach. -// https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/527 -foreach ($data as [, , $value]) {} -foreach ($array as $k => [$v1, , $v3]) {} -foreach ([$a, $b] as $c) {} // Not a short list. Sniff should handle it. diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.3.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.3.inc deleted file mode 100644 index beb5ae1..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Arrays/ArrayDeclarationUnitTest.3.inc +++ /dev/null @@ -1,7 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Arrays; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ArrayDeclaration sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Arrays\ArrayDeclarationSniff - */ -final class ArrayDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'ArrayDeclarationUnitTest.1.inc': - return [ - 2 => 1, - 8 => 2, - 10 => 2, - 22 => 1, - 23 => 2, - 24 => 2, - 25 => 1, - 31 => 2, - 35 => 1, - 36 => 2, - 41 => 1, - 46 => 1, - 47 => 1, - 50 => 1, - 51 => 1, - 53 => 1, - 56 => 1, - 58 => 1, - 61 => 1, - 62 => 1, - 63 => 1, - 64 => 1, - 65 => 1, - 66 => 3, - 70 => 1, - 76 => 2, - 77 => 1, - 78 => 7, - 79 => 2, - 81 => 2, - 82 => 4, - 87 => 1, - 88 => 1, - 92 => 1, - 97 => 1, - 100 => 1, - 101 => 1, - 102 => 1, - 105 => 1, - 106 => 1, - 107 => 1, - 125 => 1, - 126 => 1, - 141 => 1, - 144 => 1, - 146 => 1, - 148 => 1, - 151 => 1, - 157 => 1, - 173 => 1, - 174 => 3, - 179 => 1, - 182 => 1, - 188 => 1, - 207 => 1, - 212 => 2, - 214 => 1, - 218 => 2, - 219 => 2, - 223 => 1, - 255 => 1, - 294 => 1, - 295 => 1, - 296 => 1, - 311 => 1, - 317 => 1, - 339 => 2, - 348 => 2, - 352 => 2, - 355 => 3, - 358 => 3, - 359 => 2, - 360 => 1, - 362 => 1, - 363 => 2, - 364 => 1, - 365 => 2, - 366 => 2, - 367 => 2, - 368 => 2, - 369 => 1, - 370 => 1, - 383 => 1, - 394 => 1, - 400 => 1, - 406 => 1, - 441 => 1, - 444 => 2, - 445 => 2, - 447 => 2, - 448 => 3, - 467 => 1, - 471 => 1, - 472 => 1, - 510 => 1, - 516 => 1, - 523 => 1, - 530 => 1, - 537 => 1, - 540 => 1, - 547 => 2, - 552 => 1, - 557 => 1, - ]; - case 'ArrayDeclarationUnitTest.2.inc': - return [ - 2 => 1, - 10 => 1, - 23 => 2, - 24 => 2, - 25 => 1, - 31 => 2, - 36 => 2, - 41 => 1, - 46 => 1, - 47 => 1, - 51 => 1, - 53 => 1, - 56 => 1, - 61 => 1, - 63 => 1, - 64 => 1, - 65 => 1, - 66 => 2, - 70 => 1, - 76 => 1, - 77 => 1, - 78 => 7, - 79 => 2, - 81 => 2, - 82 => 4, - 87 => 1, - 88 => 1, - 92 => 1, - 97 => 1, - 100 => 1, - 101 => 1, - 102 => 1, - 105 => 1, - 106 => 1, - 107 => 1, - 125 => 1, - 126 => 1, - 141 => 1, - 144 => 1, - 146 => 1, - 148 => 1, - 151 => 1, - 157 => 1, - 173 => 1, - 174 => 3, - 179 => 1, - 190 => 1, - 191 => 1, - 192 => 1, - 207 => 1, - 210 => 1, - 211 => 1, - 215 => 1, - 247 => 1, - 286 => 1, - 287 => 1, - 288 => 1, - 303 => 1, - 309 => 1, - 331 => 2, - 345 => 3, - 348 => 3, - 349 => 2, - 350 => 1, - 352 => 2, - 353 => 2, - 354 => 2, - 355 => 2, - 356 => 2, - 357 => 1, - 358 => 1, - 372 => 1, - 383 => 1, - 389 => 1, - 395 => 1, - 430 => 1, - 433 => 2, - 434 => 2, - 436 => 2, - 437 => 3, - 456 => 1, - 460 => 1, - 461 => 1, - 499 => 1, - 505 => 1, - 512 => 1, - 519 => 1, - 526 => 1, - 529 => 1, - 536 => 2, - 541 => 1, - 546 => 1, - 555 => 2, - ]; - case 'ArrayDeclarationUnitTest.4.inc': - return [8 => 1]; - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionClosingBraceSpaceUnitTest.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionClosingBraceSpaceUnitTest.css deleted file mode 100644 index 39abce2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionClosingBraceSpaceUnitTest.css +++ /dev/null @@ -1,81 +0,0 @@ -.my-style { -} - - -.my-style { -} - -/* Comment */ - -.my-style { -} - - -/* Comment */ - -.my-style { - float: left; - -} - -.AssetLineageWidgetType-item { - color: #CCC; -} - -/*.AssetLineageWidgetType-item2 .selected, -.AssetLineageWidgetType-item .selected { -}*/ - -.AssetLineageWidgetType-item.selected { -} - -@media screen and (max-device-width: 769px) { - - header #logo img { - max-width: 100%; - } - -} - -@media screen and (max-device-width: 769px) { - - header #logo img { - max-width: 100%; - } -} - -.GUITextBox.container:after {} - -@media screen and (max-device-width: 769px) { - .no-blank-line-after { - } - .no-blank-line-after-second-def { - } .my-style { - } - - .no-blank-line-and-trailing-comment { - } /* end long class */ - .too-many-blank-lines-and-trailing-comment-extra-whitespace-after-brace { - } /* end long class */ - - - - .has-blank-line-and-trailing-comment { - } /* end long class */ - - .no-blank-line-and-annotation { - } /* phpcs:ignore Standard.Cat.SniffName -- for reasons */ - .too-many-blank-lines-annotation { - } /* phpcs:ignore Standard.Cat.SniffName -- for reasons */ - - - - .has-blank-line-and-annotation { - } /* phpcs:ignore Standard.Cat.SniffName -- for reasons */ - -} - -@media screen and (max-device-width: 769px) { - - header #logo img { - max-width: 100%;}} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionClosingBraceSpaceUnitTest.css.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionClosingBraceSpaceUnitTest.css.fixed deleted file mode 100644 index ca77e83..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionClosingBraceSpaceUnitTest.css.fixed +++ /dev/null @@ -1,85 +0,0 @@ -.my-style { -} - -.my-style { -} - -/* Comment */ - -.my-style { -} - -/* Comment */ - -.my-style { - float: left; - -} - -.AssetLineageWidgetType-item { - color: #CCC; -} - -/*.AssetLineageWidgetType-item2 .selected, -.AssetLineageWidgetType-item .selected { -}*/ - -.AssetLineageWidgetType-item.selected { -} - -@media screen and (max-device-width: 769px) { - - header #logo img { - max-width: 100%; - } - -} - -@media screen and (max-device-width: 769px) { - - header #logo img { - max-width: 100%; - } - -} - -.GUITextBox.container:after { -} - -@media screen and (max-device-width: 769px) { - .no-blank-line-after { - } - - .no-blank-line-after-second-def { - } - -.my-style { - } - - .no-blank-line-and-trailing-comment { - } /* end long class */ - - .too-many-blank-lines-and-trailing-comment-extra-whitespace-after-brace { - } /* end long class */ - - .has-blank-line-and-trailing-comment { - } /* end long class */ - - .no-blank-line-and-annotation { - } /* phpcs:ignore Standard.Cat.SniffName -- for reasons */ - - .too-many-blank-lines-annotation { - } /* phpcs:ignore Standard.Cat.SniffName -- for reasons */ - - .has-blank-line-and-annotation { - } /* phpcs:ignore Standard.Cat.SniffName -- for reasons */ - -} - -@media screen and (max-device-width: 769px) { - - header #logo img { - max-width: 100%; -} - -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionClosingBraceSpaceUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionClosingBraceSpaceUnitTest.php deleted file mode 100644 index ec9a7f0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionClosingBraceSpaceUnitTest.php +++ /dev/null @@ -1,65 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\CSS; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ClassDefinitionClosingBraceSpace sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS\ClassDefinitionClosingBraceSpaceSniff - */ -final class ClassDefinitionClosingBraceSpaceUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 2 => 1, - 11 => 1, - 44 => 1, - 47 => 1, - 51 => 1, - 53 => 1, - 57 => 1, - 59 => 1, - 67 => 1, - 69 => 1, - 81 => 2, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionNameSpacingUnitTest.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionNameSpacingUnitTest.css deleted file mode 100644 index 6496cb8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionNameSpacingUnitTest.css +++ /dev/null @@ -1,66 +0,0 @@ -.AssetListingEditWidgetType-BottomPanel select, -#EditEditingModeWidgetType-assetEditor-filters-assetTypes-addNew { - float: left; -} - -.AssetListingEditWidgetType-BottomPanel select, - -#EditEditingModeWidgetType-assetEditor-filters-assetTypes-addNew { - float: left; -} - -.AssetListingEditWidgetType-BottomPanel select, -/*.AssetListingEditWidgetType-BottomPanel ul,*/ -#EditEditingModeWidgetType-assetEditor-filters-assetTypes-addNew { - float: left; -} - -.AssetListingEditWidgetType-BottomPanel select, - -.AssetListingEditWidgetType-BottomPanel ul, -#EditEditingModeWidgetType-assetEditor-filters-assetTypes-addNew { - float: left; -} - -#SuperUsersSystemConfigScreen-table { - display: block; - left: 50%; - margin-left: -500px; - margin-top: 180px; - position: relative; - width: 1000px; -} - -/** - * More styles below here. - */ - -td.TableWidgetType-header.TableWidgetType-header-lastLogin, -td.TableWidgetType-header.TableWidgetType-header-remove, -td.TableWidgetType-header.TableWidgetType-header-email, -td.TableWidgetType-header.TableWidgetType-header-userName { - background: url(images/ScreenImages/table_header_bg.png) repeat-x; - border-top: 1px solid #D4D4D4; - color: #787878; - height: 33px; - padding-left: 12px; - width: 150px; -} - -@media screen and (max-device-width: 769px) { - - header #logo img { - max-width: 100%; - padding: 20px; - margin: 40px; - } -} - -.foo -{ - border: none; -} - -/* Live coding. Has to be the last test in the file. */ -.intentional-parse-error { - float: left diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionNameSpacingUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionNameSpacingUnitTest.php deleted file mode 100644 index e8f0b4a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionNameSpacingUnitTest.php +++ /dev/null @@ -1,56 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\CSS; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ClassDefinitionNameSpacing sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS\ClassDefinitionNameSpacingSniff - */ -final class ClassDefinitionNameSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 7 => 1, - 19 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionOpeningBraceSpaceUnitTest.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionOpeningBraceSpaceUnitTest.css deleted file mode 100644 index 98c8fa5..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionOpeningBraceSpaceUnitTest.css +++ /dev/null @@ -1,108 +0,0 @@ -.HelpWidgetType-new-bug-title { - float: left; -} -.HelpWidgetType-new-bug-title { - float: left; -} -.HelpWidgetType-new-bug-title { - float: left; -} -.HelpWidgetType-new-bug-title{ - float: left; -} -.HelpWidgetType-new-bug-title { - - float: left; -} - -@media screen and (max-device-width: 769px) { - - header #logo img { - max-width: 100%; - } - -} - -@media screen and (max-device-width: 769px) { - header #logo img { - max-width: 100%; - } - -} - -@media screen and (max-device-width: 769px) { - - - - header #logo img { - max-width: 100%; - } - -} - -.GUITextBox.container:after {} - -.single-line {float: left;} - -#opening-brace-on-different-line - - -{ - color: #FFFFFF; -} - -#opening-brace-on-different-line-and-inline-style - - -{color: #FFFFFF;} - -@media screen and (max-device-width: 769px) { .everything-on-one-line { float: left; } } - -/* Document handling of comments in various places */ -.no-space-before-opening-with-comment /* comment*/{ - float: left; -} - -.space-before-opening-with-comment-on-next-line -/* comment*/ { - float: left; -} - -#opening-brace-on-different-line-with-comment-between -/*comment*/ -{ - padding: 0; -} - -.single-line-with-comment { /* comment*/ float: left; } - -.multi-line-with-trailing-comment { /* comment*/ - float: left; -} - - -@media screen and (max-device-width: 769px) { - /*comment*/ - .comment-line-after-nesting-class-opening { - } -} - -@media screen and (max-device-width: 769px) { - - /*comment*/ - .blank-line-and-comment-line-after-nesting-class-opening { - } -} - -@media screen and (max-device-width: 769px) { - - - - /* phpcs:ignore Standard.Category.Sniffname -- for reasons */ - .blank-line-and-annotation-after-nesting-class-opening { - } -} - -/* Live coding. Has to be the last test in the file. */ -.intentional-parse-error { - float: left diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionOpeningBraceSpaceUnitTest.css.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionOpeningBraceSpaceUnitTest.css.fixed deleted file mode 100644 index b3f48a5..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionOpeningBraceSpaceUnitTest.css.fixed +++ /dev/null @@ -1,106 +0,0 @@ -.HelpWidgetType-new-bug-title { - float: left; -} -.HelpWidgetType-new-bug-title { - float: left; -} -.HelpWidgetType-new-bug-title { - float: left; -} -.HelpWidgetType-new-bug-title { - float: left; -} -.HelpWidgetType-new-bug-title { - - float: left; -} - -@media screen and (max-device-width: 769px) { - - header #logo img { - max-width: 100%; - } - -} - -@media screen and (max-device-width: 769px) { - - header #logo img { - max-width: 100%; - } - -} - -@media screen and (max-device-width: 769px) { - - header #logo img { - max-width: 100%; - } - -} - -.GUITextBox.container:after { -} - -.single-line { -float: left;} - -#opening-brace-on-different-line { - color: #FFFFFF; -} - -#opening-brace-on-different-line-and-inline-style { -color: #FFFFFF;} - -@media screen and (max-device-width: 769px) { - -.everything-on-one-line { -float: left; } } - -/* Document handling of comments in various places */ -.no-space-before-opening-with-comment /* comment*/ { - float: left; -} - -.space-before-opening-with-comment-on-next-line -/* comment*/ { - float: left; -} - -#opening-brace-on-different-line-with-comment-between -/*comment*/ { - padding: 0; -} - -.single-line-with-comment { -/* comment*/ float: left; } - -.multi-line-with-trailing-comment { /* comment*/ - float: left; -} - - -@media screen and (max-device-width: 769px) { - - /*comment*/ - .comment-line-after-nesting-class-opening { - } -} - -@media screen and (max-device-width: 769px) { - - /*comment*/ - .blank-line-and-comment-line-after-nesting-class-opening { - } -} - -@media screen and (max-device-width: 769px) { - - /* phpcs:ignore Standard.Category.Sniffname -- for reasons */ - .blank-line-and-annotation-after-nesting-class-opening { - } -} - -/* Live coding. Has to be the last test in the file. */ -.intentional-parse-error { - float: left diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionOpeningBraceSpaceUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionOpeningBraceSpaceUnitTest.php deleted file mode 100644 index 9f75512..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ClassDefinitionOpeningBraceSpaceUnitTest.php +++ /dev/null @@ -1,69 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\CSS; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ClassDefinitionOpeningBraceSpace sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS\ClassDefinitionOpeningBraceSpaceSniff - */ -final class ClassDefinitionOpeningBraceSpaceUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 4 => 1, - 7 => 1, - 10 => 1, - 26 => 1, - 33 => 1, - 43 => 1, - 45 => 1, - 50 => 1, - 57 => 2, - 59 => 2, - 62 => 1, - 73 => 1, - 77 => 1, - 84 => 1, - 97 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColonSpacingUnitTest.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColonSpacingUnitTest.css deleted file mode 100644 index 391bc85..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColonSpacingUnitTest.css +++ /dev/null @@ -1,42 +0,0 @@ -body { -font-family: Arial, Helvetica, sans-serif; -margin : 40px 0 0 0; -padding : 0; -background: #8FB7DB url(diag_lines_bg.gif) top left; -margin-top: -10px; -margin-bottom: -0px; -} - -.TableWidgetType .recover:hover { - background-color: #FFF; -} - -#clearCache-settings:rootNodes-list_0 { - border-top: none; -} - -.LookupEditScreenWidgetType-urls a, .LookupEditScreenWidgetType-urls a:visited { - text-decoration: none; - color: #444; -} - -/* checking embedded PHP */ -li { - background:url(/images//bullet.gif) left px no-repeat; - margin:0px; - padding-left:10px; - margin-bottom:px; - margin-top: px; - line-height:13px; - filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr=#2e62a8, endColorstr=#123363); -} - -/* Empty style defs. */ -.p { - margin:; - margin-right: - margin-left: 10px; - float:/* Some comment. */ ; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColonSpacingUnitTest.css.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColonSpacingUnitTest.css.fixed deleted file mode 100644 index e68bddc..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColonSpacingUnitTest.css.fixed +++ /dev/null @@ -1,40 +0,0 @@ -body { -font-family: Arial, Helvetica, sans-serif; -margin: 40px 0 0 0; -padding: 0; -background: #8FB7DB url(diag_lines_bg.gif) top left; -margin-top: 10px; -margin-bottom: 0px; -} - -.TableWidgetType .recover:hover { - background-color: #FFF; -} - -#clearCache-settings:rootNodes-list_0 { - border-top: none; -} - -.LookupEditScreenWidgetType-urls a, .LookupEditScreenWidgetType-urls a:visited { - text-decoration: none; - color: #444; -} - -/* checking embedded PHP */ -li { - background: url(/images//bullet.gif) left px no-repeat; - margin: 0px; - padding-left: 10px; - margin-bottom: px; - margin-top: px; - line-height: 13px; - filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr=#2e62a8, endColorstr=#123363); -} - -/* Empty style defs. */ -.p { - margin:; - margin-right: - margin-left: 10px; - float: /* Some comment. */ ; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColonSpacingUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColonSpacingUnitTest.php deleted file mode 100644 index 6bae60b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColonSpacingUnitTest.php +++ /dev/null @@ -1,65 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\CSS; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ColonSpacing sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS\ColonSpacingSniff - */ -final class ColonSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 3 => 1, - 4 => 2, - 5 => 1, - 6 => 1, - 8 => 1, - 27 => 1, - 28 => 1, - 29 => 1, - 30 => 1, - 32 => 1, - 41 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColourDefinitionUnitTest.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColourDefinitionUnitTest.css deleted file mode 100644 index 2dfd22a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColourDefinitionUnitTest.css +++ /dev/null @@ -1,16 +0,0 @@ -#title-bar-bottom-right { - background-color: #333333; - padding: 10px; - border-bottom: 1px dotted #F0F0F0; - border-top: 1px dotted #FF00FF; - background: #08f7db url(diag_lines_bg.gif) top left; - - /* The sniff only deals with HEX colours. */ - color: DarkSlateGray; - background-color: rgb(255, 0, 0); - background-color: rgba(0, 0, 255, 0.3); - background-color: hsl(120, 100%, 50%); -} - -#add-new-comment { -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColourDefinitionUnitTest.css.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColourDefinitionUnitTest.css.fixed deleted file mode 100644 index 039209d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColourDefinitionUnitTest.css.fixed +++ /dev/null @@ -1,16 +0,0 @@ -#title-bar-bottom-right { - background-color: #333; - padding: 10px; - border-bottom: 1px dotted #F0F0F0; - border-top: 1px dotted #F0F; - background: #08F7DB url(diag_lines_bg.gif) top left; - - /* The sniff only deals with HEX colours. */ - color: DarkSlateGray; - background-color: rgb(255, 0, 0); - background-color: rgba(0, 0, 255, 0.3); - background-color: hsl(120, 100%, 50%); -} - -#add-new-comment { -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColourDefinitionUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColourDefinitionUnitTest.php deleted file mode 100644 index 29118f9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ColourDefinitionUnitTest.php +++ /dev/null @@ -1,57 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\CSS; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ColourDefinition sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS\ColourDefinitionSniff - */ -final class ColourDefinitionUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 2 => 1, - 5 => 1, - 6 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DisallowMultipleStyleDefinitionsUnitTest.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DisallowMultipleStyleDefinitionsUnitTest.css deleted file mode 100644 index 4c11bea..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DisallowMultipleStyleDefinitionsUnitTest.css +++ /dev/null @@ -1,17 +0,0 @@ -.SettingsTabPaneWidgetType-tab-mid { - background: transparent url(tab_inact_mid.png) repeat-x; - height: 100%;float: left; - line-height: -25px; - cursor: pointer; margin: 10px; float: right; -} - -/* testing embedded PHP */ -li { - background:url(/images//bullet.gif) left px no-repeat; margin:0px; padding-left:10px; margin-bottom:px; line-height:13px; - filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr=#2e62a8, endColorstr=#123363); -} - -/* Document handling of comments and annotations. */ -div#annotations {-webkit-tap-highlight-color:transparent;/* phpcs:disable Standard.Cat.SniffName */-webkit-touch-callout:none;/*phpcs:enable*/-webkit-user-select:none;} - -div#comments {height:100%;/*comment*/width:100%;} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DisallowMultipleStyleDefinitionsUnitTest.css.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DisallowMultipleStyleDefinitionsUnitTest.css.fixed deleted file mode 100644 index 93a7815..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DisallowMultipleStyleDefinitionsUnitTest.css.fixed +++ /dev/null @@ -1,27 +0,0 @@ -.SettingsTabPaneWidgetType-tab-mid { - background: transparent url(tab_inact_mid.png) repeat-x; - height: 100%; -float: left; - line-height: -25px; - cursor: pointer; -margin: 10px; -float: right; -} - -/* testing embedded PHP */ -li { - background:url(/images//bullet.gif) left px no-repeat; -margin:0px; -padding-left:10px; -margin-bottom:px; -line-height:13px; - filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr=#2e62a8, endColorstr=#123363); -} - -/* Document handling of comments and annotations. */ -div#annotations {-webkit-tap-highlight-color:transparent;/* phpcs:disable Standard.Cat.SniffName */ --webkit-touch-callout:none;/*phpcs:enable*/ --webkit-user-select:none;} - -div#comments {height:100%;/*comment*/ -width:100%;} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DisallowMultipleStyleDefinitionsUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DisallowMultipleStyleDefinitionsUnitTest.php deleted file mode 100644 index c2e7598..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DisallowMultipleStyleDefinitionsUnitTest.php +++ /dev/null @@ -1,59 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\CSS; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the DisallowMultipleStyleDefinitions sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS\DisallowMultipleStyleDefinitionsSniff - */ -final class DisallowMultipleStyleDefinitionsUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 3 => 1, - 5 => 2, - 10 => 4, - 15 => 2, - 17 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DuplicateClassDefinitionUnitTest.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DuplicateClassDefinitionUnitTest.css deleted file mode 100644 index 8ac9501..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DuplicateClassDefinitionUnitTest.css +++ /dev/null @@ -1,103 +0,0 @@ -.AssetLineageWidgetType-item { - color: #FFF; -} - -.AssetLineageWidgetType-title { - color: #CCC; -} - -.AssetLineageWidgetType-item { - color: #CCC; -} - -.AssetLineageWidgetType-item .selected { -} - -.AssetLineageWidgetType-item.selected { -} - -#Blah .AssetLineageWidgetType-item { -} - -#X.selected, -.AssetLineageWidgetType-item { -} - -.MyClass, .YourClass { -} - -.YourClass, .MyClass { -} - -.YourClass, .MyClass, .OurClass { -} - - -.ClassAtTopOfMediaBlock { -} - -@media print { - .ClassAtTopOfMediaBlock { - } - - .ClassInMultipleMediaBlocks { - } -} - -.ClassNotAtTopOfMediaBlock { -} - -@media handheld { - .SameClassInMediaBlock { - } - - .ClassNotAtTopOfMediaBlock { - } - - .SameClassInMediaBlock { - } -} - -@media braille { - .PlaceholderClass { - } - - .ClassNotAtTopOfMediaBlock { - } - - .ClassInMultipleMediaBlocks { - } -} - -.foo /* any comment */ -{ color: red; } - -/* print comment */ -@media print { - /* comment1 */ - td { - } - - /* comment2 */ - img { - } - - /* comment3 */ - td { - } -} - -@media handheld /* handheld comment */ -{ - td /* comment1 */ - { - } - - img /* comment2 */ - { - } - - td /* comment3 */ - { - } -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DuplicateClassDefinitionUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DuplicateClassDefinitionUnitTest.php deleted file mode 100644 index 51b673b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DuplicateClassDefinitionUnitTest.php +++ /dev/null @@ -1,59 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\CSS; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the DuplicateClassDefinition sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS\DuplicateClassDefinitionSniff - */ -final class DuplicateClassDefinitionUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 9 => 1, - 29 => 1, - 57 => 1, - 86 => 1, - 101 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DuplicateStyleDefinitionUnitTest.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DuplicateStyleDefinitionUnitTest.css deleted file mode 100644 index c9c849f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DuplicateStyleDefinitionUnitTest.css +++ /dev/null @@ -1,27 +0,0 @@ -.ViperSubToolbar-wrapper { - height: 34px; - left: 0; - position: fixed; - top: 60px; - z-index: 997; - left: 50%; -} - -.expandable { - -moz-transition-property: margin-left, margin-right; - -moz-transition-duration: 0.2s; - -moz-transition-timing-function: ease; - -webkit-transition-property: margin-left, margin-right; - -webkit-transition-duration: 0.2s; - -webkit-transition-timing-function: ease; - z-index: 2; -} - -@media only screen and (max-width: 480px) { - header nav.meta a { display: none; } - header nav.meta a.search { display: block; } -} - -/* Live coding. Has to be the last test in the file. */ -.intentional-parse-error { - float: left diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DuplicateStyleDefinitionUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DuplicateStyleDefinitionUnitTest.php deleted file mode 100644 index 4a582b3..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/DuplicateStyleDefinitionUnitTest.php +++ /dev/null @@ -1,53 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\CSS; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the DuplicateStyleDefinition sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS\DuplicateStyleDefinitionSniff - */ -final class DuplicateStyleDefinitionUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [7 => 1]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/EmptyClassDefinitionUnitTest.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/EmptyClassDefinitionUnitTest.css deleted file mode 100644 index 801dcda..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/EmptyClassDefinitionUnitTest.css +++ /dev/null @@ -1,15 +0,0 @@ -.HelpWidgetType-new-bug-title {} -.HelpWidgetType-new-bug-title { -} -.HelpWidgetType-new-bug-title { - -} -.HelpWidgetType-new-bug-title { - -} -.HelpWidgetType-new-bug-title { - /* Nothing to see here */ -} -.HelpWidgetType-new-bug-title { - float: left; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/EmptyClassDefinitionUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/EmptyClassDefinitionUnitTest.php deleted file mode 100644 index 581cdca..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/EmptyClassDefinitionUnitTest.php +++ /dev/null @@ -1,59 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\CSS; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the EmptyClassDefinition sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS\EmptyClassDefinitionSniff - */ -final class EmptyClassDefinitionUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 1 => 1, - 2 => 1, - 4 => 1, - 7 => 1, - 10 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/EmptyStyleDefinitionUnitTest.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/EmptyStyleDefinitionUnitTest.css deleted file mode 100644 index 24910b7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/EmptyStyleDefinitionUnitTest.css +++ /dev/null @@ -1,11 +0,0 @@ -#MetadataAdminScreen-addField-fieldType { - margin-left: 10px; - margin-right: - float: ; -} - -#MetadataAdminScreen-addField-fieldType li { - margin-right: /* @todo */ - margin-left: 10px; - float: /* Some comment. */ ; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/EmptyStyleDefinitionUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/EmptyStyleDefinitionUnitTest.php deleted file mode 100644 index f07ac24..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/EmptyStyleDefinitionUnitTest.php +++ /dev/null @@ -1,58 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\CSS; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the EmptyStyleDefinition sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS\EmptyStyleDefinitionSniff - */ -final class EmptyStyleDefinitionUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 3 => 1, - 4 => 1, - 8 => 1, - 10 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ForbiddenStylesUnitTest.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ForbiddenStylesUnitTest.css deleted file mode 100644 index dbd5487..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ForbiddenStylesUnitTest.css +++ /dev/null @@ -1,18 +0,0 @@ -#add-new-comment { - -moz-border-radius: 1px; - -webkit-border-radius: 1px; - border-radius: 1px; - - -moz-border-radius-topleft: 1px; - -moz-border-radius-topright: 1px; - -moz-border-radius-bottomright: 1px; - -moz-border-radius-bottomleft: 1px; - border-top-left-radius: 1px; - border-top-right-radius: 1px; - border-bottom-right-radius: 1px; - border-bottom-left-radius: 1px; - - -moz-box-shadow: 1px; - -webkit-box-shadow: 1px; - box-shadow: 1px; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ForbiddenStylesUnitTest.css.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ForbiddenStylesUnitTest.css.fixed deleted file mode 100644 index a8ea270..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ForbiddenStylesUnitTest.css.fixed +++ /dev/null @@ -1,18 +0,0 @@ -#add-new-comment { - border-radius: 1px; - border-radius: 1px; - border-radius: 1px; - - border-top-left-radius: 1px; - border-top-right-radius: 1px; - border-bottom-right-radius: 1px; - border-bottom-left-radius: 1px; - border-top-left-radius: 1px; - border-top-right-radius: 1px; - border-bottom-right-radius: 1px; - border-bottom-left-radius: 1px; - - box-shadow: 1px; - box-shadow: 1px; - box-shadow: 1px; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ForbiddenStylesUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ForbiddenStylesUnitTest.php deleted file mode 100644 index 1d68b0e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ForbiddenStylesUnitTest.php +++ /dev/null @@ -1,62 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\CSS; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ForbiddenStyles sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS\ForbiddenStylesSniff - */ -final class ForbiddenStylesUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 2 => 1, - 3 => 1, - 6 => 1, - 7 => 1, - 8 => 1, - 9 => 1, - 15 => 1, - 16 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/IndentationUnitTest.1.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/IndentationUnitTest.1.css deleted file mode 100644 index 216f00e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/IndentationUnitTest.1.css +++ /dev/null @@ -1,79 +0,0 @@ -body { - - font-family: Arial, Helvetica, sans-serif; - margin: 40px 0 0 0; -padding: 0; - background: #8FB7DB url(diag_lines_bg.gif) top left; - -} - -td { - margin: 40px; - - padding: 20px; -} - -/* -#AdminScreenModeWidgetType-tab_pane-containers .TabPaneWidgetType-tab-selected-left { - background: transparent url(images/ScreenImages/tab_on_left.png) no-repeat; -} -#AdminScreenModeWidgetType-tab_pane-containers .TabPaneWidgetType-tab-selected-right { - background: transparent url(images/ScreenImages/tab_on_right.png) no-repeat; -} -*/ - -.GUITextBox.container:after {} - -@media screen and (max-device-width: 769px) { - - header #logo img { - max-width: 100%; - padding: 20px; - margin: 40px; - } -} - -@media screen and (max-device-width: 769px) { - - header #logo img { - max-width: 100%; - } - - header #logo img { - min-width: 100%; - } - -} - -td { - margin: 40px; - - padding: 20px; - - -} - -.GUIFileUpload { -/* opacity: 0.25; */ -} - -.foo -{ - border: none; -} - -.mortgage-calculator h2 { - background: #072237; - color: #fff; - font-weight: normal; - height: 50px; - line-height: 50px; - padding: 0 0 0 30px; - } - -.WhitelistCommentIndentationShouldBeIgnored { -/* phpcs:disable Standard.Category.Sniff -- for reasons. */ -} - -/* syntax error */ ---------------------------------------------- */ diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/IndentationUnitTest.1.css.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/IndentationUnitTest.1.css.fixed deleted file mode 100644 index 1fd128a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/IndentationUnitTest.1.css.fixed +++ /dev/null @@ -1,73 +0,0 @@ -body { - font-family: Arial, Helvetica, sans-serif; - margin: 40px 0 0 0; - padding: 0; - background: #8FB7DB url(diag_lines_bg.gif) top left; -} - -td { - margin: 40px; - padding: 20px; -} - -/* -#AdminScreenModeWidgetType-tab_pane-containers .TabPaneWidgetType-tab-selected-left { - background: transparent url(images/ScreenImages/tab_on_left.png) no-repeat; -} -#AdminScreenModeWidgetType-tab_pane-containers .TabPaneWidgetType-tab-selected-right { - background: transparent url(images/ScreenImages/tab_on_right.png) no-repeat; -} -*/ - -.GUITextBox.container:after {} - -@media screen and (max-device-width: 769px) { - - header #logo img { - max-width: 100%; - padding: 20px; - margin: 40px; - } -} - -@media screen and (max-device-width: 769px) { - - header #logo img { - max-width: 100%; - } - - header #logo img { - min-width: 100%; - } - -} - -td { - margin: 40px; - padding: 20px; -} - -.GUIFileUpload { -/* opacity: 0.25; */ -} - -.foo -{ - border: none; -} - -.mortgage-calculator h2 { - background: #072237; - color: #fff; - font-weight: normal; - height: 50px; - line-height: 50px; - padding: 0 0 0 30px; -} - -.WhitelistCommentIndentationShouldBeIgnored { -/* phpcs:disable Standard.Category.Sniff -- for reasons. */ -} - -/* syntax error */ ---------------------------------------------- */ diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/IndentationUnitTest.2.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/IndentationUnitTest.2.css deleted file mode 100644 index 48b22f6..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/IndentationUnitTest.2.css +++ /dev/null @@ -1,3 +0,0 @@ -/* Live coding. Has to be the last (only) test in the file. */ -.intentional-parse-error { - float: left diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/IndentationUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/IndentationUnitTest.php deleted file mode 100644 index 0eacde4..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/IndentationUnitTest.php +++ /dev/null @@ -1,80 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\CSS; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the Indentation sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS\IndentationSniff - */ -final class IndentationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'IndentationUnitTest.1.css': - return [ - 2 => 1, - 3 => 1, - 5 => 1, - 6 => 1, - 7 => 1, - 12 => 1, - 30 => 1, - 32 => 1, - 50 => 1, - 52 => 1, - 53 => 1, - 66 => 1, - 67 => 1, - 68 => 1, - 69 => 1, - 70 => 1, - 71 => 1, - 72 => 1, - ]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/LowercaseStyleDefinitionUnitTest.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/LowercaseStyleDefinitionUnitTest.css deleted file mode 100644 index d0f2982..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/LowercaseStyleDefinitionUnitTest.css +++ /dev/null @@ -1,14 +0,0 @@ -.SettingsTabPaneWidgetType-tab-mid { - font-family: Arial; - Font-Family: arial; - background-color: #DA9393; - BACKGROUND-IMAGE: URL(Warning_Close.png); -} - -@media screen and (max-device-width: 769px) { - - .SettingsTabPaneWidgetType-tab-mid { - Font-Family: arial; - filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr=#2e62a8, endColorstr=#123363); - } -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/LowercaseStyleDefinitionUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/LowercaseStyleDefinitionUnitTest.php deleted file mode 100644 index 3b10eb0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/LowercaseStyleDefinitionUnitTest.php +++ /dev/null @@ -1,58 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\CSS; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the LowercaseStyleDefinition sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS\LowercaseStyleDefinitionSniff - */ -final class LowercaseStyleDefinitionUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 2 => 1, - 3 => 1, - 5 => 2, - 11 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/MissingColonUnitTest.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/MissingColonUnitTest.css deleted file mode 100644 index 6c947e5..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/MissingColonUnitTest.css +++ /dev/null @@ -1,21 +0,0 @@ -.my-style { - margin-right 15px; - float: left; - margin-left 15px; - margin-top: 15px; - margin-bottom 15px; -} - -@media screen and (max-device-width: 769px) { - header #logo img { - max-width: 100%; - margin-bottom 15px; - } -} - -#foo { background-color: #FF0000; -} - -/* Live coding. Has to be the last test in the file. */ -.intentional-parse-error { - float diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/MissingColonUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/MissingColonUnitTest.php deleted file mode 100644 index 693decd..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/MissingColonUnitTest.php +++ /dev/null @@ -1,58 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\CSS; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the MissingColon sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS\MissingColonSniff - */ -final class MissingColonUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 2 => 1, - 4 => 1, - 6 => 1, - 12 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/NamedColoursUnitTest.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/NamedColoursUnitTest.css deleted file mode 100644 index 05637a6..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/NamedColoursUnitTest.css +++ /dev/null @@ -1,25 +0,0 @@ -#red { - background-color: red; -} - -.red { - border-bottom: 1px dotted black; - border-top: 1px dotted gray; -} - -#red.yellow { - background: yellow url(diag_lines_bg.gif) top left; - text-shadow: 0 1px 0 white; -} - -.something--white { - border: 0; -} - -.something--------------white { - border: 0; -} - -.-white { - border: 0; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/NamedColoursUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/NamedColoursUnitTest.php deleted file mode 100644 index 7718411..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/NamedColoursUnitTest.php +++ /dev/null @@ -1,59 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\CSS; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the NamedColours sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS\NamedColoursSniff - */ -final class NamedColoursUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 2 => 1, - 6 => 1, - 7 => 1, - 11 => 1, - 12 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/OpacityUnitTest.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/OpacityUnitTest.css deleted file mode 100644 index c656c78..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/OpacityUnitTest.css +++ /dev/null @@ -1,35 +0,0 @@ -.my-style { - opacity: 0; - opacity: 0.0; - opacity: 1; - opacity: 1.0; - opacity: 1.5; - opacity: .5; - opacity: 0.5; - opacity: 2; - opacity: -1; - opacity: 0.55; -} - -div { - font-size: 1.2em; - background: linear-gradient(to bottom, #00F, #0F0) repeat scroll 50% 50% #EEE; - min-width: 250px; - max-width: 100%; - padding-bottom: 50px; - box-shadow: 2px -3px 3px rgba(100, 100, 100, 0.33); - border-left: 1px solid #000; - border-right: 1px solid #000; - border-top: 1px solid #000; - border-bottom: 1px dotted #000; - background: url(../1/2/3/4-5-6_7_100x100.png) repeat scroll 50% 50% #EEE; - opacity: -1; -} - -.my-commented-style { - opacity: /*comment*/ 0; - opacity: /* phpcs:ignore Standard.Cat.Sniff -- for reasons */ - 0.0; - opacity: /*comment*/ 1.0; - opacity: /*comment*/ .5; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/OpacityUnitTest.css.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/OpacityUnitTest.css.fixed deleted file mode 100644 index 257e41a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/OpacityUnitTest.css.fixed +++ /dev/null @@ -1,35 +0,0 @@ -.my-style { - opacity: 0; - opacity: 0; - opacity: 1; - opacity: 1; - opacity: 1.5; - opacity: 0.5; - opacity: 0.5; - opacity: 2; - opacity: -1; - opacity: 0.55; -} - -div { - font-size: 1.2em; - background: linear-gradient(to bottom, #00F, #0F0) repeat scroll 50% 50% #EEE; - min-width: 250px; - max-width: 100%; - padding-bottom: 50px; - box-shadow: 2px -3px 3px rgba(100, 100, 100, 0.33); - border-left: 1px solid #000; - border-right: 1px solid #000; - border-top: 1px solid #000; - border-bottom: 1px dotted #000; - background: url(../1/2/3/4-5-6_7_100x100.png) repeat scroll 50% 50% #EEE; - opacity: -1; -} - -.my-commented-style { - opacity: /*comment*/ 0; - opacity: /* phpcs:ignore Standard.Cat.Sniff -- for reasons */ - 0; - opacity: /*comment*/ 1; - opacity: /*comment*/ 0.5; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/OpacityUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/OpacityUnitTest.php deleted file mode 100644 index c1ced42..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/OpacityUnitTest.php +++ /dev/null @@ -1,65 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\CSS; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the Opacity sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS\OpacitySniff - */ -final class OpacityUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 3 => 1, - 5 => 1, - 6 => 1, - 7 => 1, - 9 => 1, - 10 => 1, - 11 => 1, - 26 => 1, - 32 => 1, - 33 => 1, - 34 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/SemicolonSpacingUnitTest.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/SemicolonSpacingUnitTest.css deleted file mode 100644 index 3ccb162..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/SemicolonSpacingUnitTest.css +++ /dev/null @@ -1,61 +0,0 @@ -.HelpWidgetType-new-bug-title { - width: 308px - float: left; -} - -#MetadataAdminScreen-addField-add { - float: left ; -} - -.TableWidgetType .recover:hover { - background-color: #FFF; -} - -#clearCache-settings:rootNodes-list_0 { - border-top: none; -} - -.HelpWidgetType-list { - list-style-image: url(); -} - -@media (min-width: 320px) and (max-width: 961px) { - .tooltipsrt:hover span.tltp, - .tooltipstp:hover span.tltp { - visibility: hidden; - } -} - -#single-line-multi-statement-no-semicolon { - padding: 0 border: 20; -} - -#multi-line-style-no-semicolon { - padding: 0 /* phpcs:ignore Standard.Cat.Sniff -- for reasons */ - border: - 20 - margin: - 0px /* top */ - 10px /* right + left */ -} - -#multi-line-style-whitespace { - padding: 0 /* phpcs:ignore Standard.Cat.Sniff -- for reasons */ ; - border: - 20 ; - margin: - 10px /* top */ - 0px /* right + left */ - - - ; -} - -.allow-for-star-hack { - cursor: pointer; - *cursor: hand; -} - -/* Live coding. Has to be the last test in the file. */ -.intentional-parse-error { - float: left diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/SemicolonSpacingUnitTest.css.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/SemicolonSpacingUnitTest.css.fixed deleted file mode 100644 index 7efef58..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/SemicolonSpacingUnitTest.css.fixed +++ /dev/null @@ -1,58 +0,0 @@ -.HelpWidgetType-new-bug-title { - width: 308px - float: left; -} - -#MetadataAdminScreen-addField-add { - float: left; -} - -.TableWidgetType .recover:hover { - background-color: #FFF; -} - -#clearCache-settings:rootNodes-list_0 { - border-top: none; -} - -.HelpWidgetType-list { - list-style-image: url(); -} - -@media (min-width: 320px) and (max-width: 961px) { - .tooltipsrt:hover span.tltp, - .tooltipstp:hover span.tltp { - visibility: hidden; - } -} - -#single-line-multi-statement-no-semicolon { - padding: 0 border: 20; -} - -#multi-line-style-no-semicolon { - padding: 0 /* phpcs:ignore Standard.Cat.Sniff -- for reasons */ - border: - 20 - margin: - 0px /* top */ - 10px /* right + left */ -} - -#multi-line-style-whitespace { - padding: 0; /* phpcs:ignore Standard.Cat.Sniff -- for reasons */ - border: - 20; - margin: - 10px /* top */ - 0px; /* right + left */ -} - -.allow-for-star-hack { - cursor: pointer; - *cursor: hand; -} - -/* Live coding. Has to be the last test in the file. */ -.intentional-parse-error { - float: left diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/SemicolonSpacingUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/SemicolonSpacingUnitTest.php deleted file mode 100644 index 47427a4..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/SemicolonSpacingUnitTest.php +++ /dev/null @@ -1,63 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\CSS; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the SemicolonSpacing sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS\SemicolonSpacingSniff - */ -final class SemicolonSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 2 => 1, - 7 => 1, - 30 => 1, - 34 => 1, - 36 => 1, - 39 => 1, - 43 => 1, - 45 => 1, - 48 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ShorthandSizeUnitTest.1.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ShorthandSizeUnitTest.1.css deleted file mode 100644 index c3d07ef..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ShorthandSizeUnitTest.1.css +++ /dev/null @@ -1,41 +0,0 @@ -#add-new-comment { - background-color: #333333; - padding: 10px; - border-bottom: 1px dotted #F0F0F0; - border-top: 1px dotted #FF00FF; - background: #8fb7db url(diag_lines_bg.gif) top left; - tab-size: 1; - margin: 8px 8px 8px 8px; - margin: 8px 8px; - margin: 0 0 0 0; - margin: 0 8px 0 8px; - margin: 8px 4px 8px 4px; - margin: 8px 4% 8px 4%; - margin: 6px 2px 9px 2px; - margin: 6px 2px 9px; - border-radius: 2px 2px 2px 2px !important; - border-width: 2px 2px 2px 2px; - border-width: 1px 2px 2px 4px; - margin: 97px auto 0 auto; - text-shadow: 0 1px 0 #fff; - border-width: - 2px - 4px - 2px - 4px; - - /* These are style names excluded from this rule. */ - background-position: 0 0; - box-shadow: 2px 2px 2px 2px; - transform-origin: 0 110% 0; - - /* Sizes with comments between them will be ignored for the purposes of this sniff. */ - margin: 8px /*top*/ 8px /*right*/ 8px /*bottom*/ 8px /*left*/; - - /* Same with PHPCS annotations. */ - border-width: - 2px /* phpcs:ignore Standard.Category.SniffName -- for reasons */ - 4px - 2px /* phpcs:disable Standard.Category.SniffName -- for reasons */ - 4px; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ShorthandSizeUnitTest.1.css.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ShorthandSizeUnitTest.1.css.fixed deleted file mode 100644 index 36297dd..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ShorthandSizeUnitTest.1.css.fixed +++ /dev/null @@ -1,37 +0,0 @@ -#add-new-comment { - background-color: #333333; - padding: 10px; - border-bottom: 1px dotted #F0F0F0; - border-top: 1px dotted #FF00FF; - background: #8fb7db url(diag_lines_bg.gif) top left; - tab-size: 1; - margin: 8px; - margin: 8px; - margin: 0; - margin: 0 8px; - margin: 8px 4px; - margin: 8px 4%; - margin: 6px 2px 9px 2px; - margin: 6px 2px 9px 2px; - border-radius: 2px !important; - border-width: 2px; - border-width: 1px 2px 2px 4px; - margin: 97px auto 0 auto; - text-shadow: 0 1px 0 #fff; - border-width: 2px 4px; - - /* These are style names excluded from this rule. */ - background-position: 0 0; - box-shadow: 2px 2px 2px 2px; - transform-origin: 0 110% 0; - - /* Sizes with comments between them will be ignored for the purposes of this sniff. */ - margin: 8px /*top*/ 8px /*right*/ 8px /*bottom*/ 8px /*left*/; - - /* Same with PHPCS annotations. */ - border-width: - 2px /* phpcs:ignore Standard.Category.SniffName -- for reasons */ - 4px - 2px /* phpcs:disable Standard.Category.SniffName -- for reasons */ - 4px; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ShorthandSizeUnitTest.2.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ShorthandSizeUnitTest.2.css deleted file mode 100644 index 2a91cf7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ShorthandSizeUnitTest.2.css +++ /dev/null @@ -1,3 +0,0 @@ -/* Intentional parse error. Live coding resilience. */ -#live-coding { - margin: 8px 8px 8px 8px diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ShorthandSizeUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ShorthandSizeUnitTest.php deleted file mode 100644 index e9ce494..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/CSS/ShorthandSizeUnitTest.php +++ /dev/null @@ -1,72 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\CSS; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ShorthandSize sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\CSS\ShorthandSizeSniff - */ -final class ShorthandSizeUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'ShorthandSizeUnitTest.1.css': - return [ - 8 => 1, - 9 => 1, - 10 => 1, - 11 => 1, - 12 => 1, - 13 => 1, - 15 => 1, - 16 => 1, - 17 => 1, - 21 => 1, - ]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ClassDeclarationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ClassDeclarationUnitTest.inc deleted file mode 100644 index 25d8d30..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ClassDeclarationUnitTest.inc +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Classes; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ClassDeclaration sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Classes\ClassDeclarationSniff - */ -final class ClassDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 5 => 1, - 6 => 1, - 10 => 1, - 15 => 2, - 18 => 1, - 22 => 4, - 23 => 4, - 24 => 4, - 27 => 2, - 30 => 2, - 34 => 1, - 35 => 1, - 39 => 1, - 42 => 1, - 45 => 1, - 48 => 1, - 50 => 2, - 51 => 1, - 55 => 1, - 59 => 4, - 63 => 1, - 65 => 1, - 69 => 3, - 74 => 2, - 77 => 1, - 80 => 1, - 85 => 3, - 89 => 1, - 92 => 1, - 97 => 1, - 108 => 1, - 114 => 1, - 116 => 1, - 118 => 1, - 121 => 1, - 124 => 2, - 128 => 2, - 132 => 1, - 141 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ClassFileName Spaces In FilenameUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ClassFileName Spaces In FilenameUnitTest.inc deleted file mode 100644 index a89e3d0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ClassFileName Spaces In FilenameUnitTest.inc +++ /dev/null @@ -1,7 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Classes; - -use DirectoryIterator; -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ClassFileName sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Classes\ClassFileNameSniff - */ -final class ClassFileNameUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Get a list of all test files to check. - * - * These will have the same base as the sniff name but different extensions. - * We ignore the .php file as it is the class. - * - * @param string $testFileBase The base path that the unit tests files will have. - * - * @return string[] - */ - protected function getTestFiles($testFileBase) - { - $testFiles = []; - - $dir = substr($testFileBase, 0, strrpos($testFileBase, DIRECTORY_SEPARATOR)); - $di = new DirectoryIterator($dir); - - // Strip off the path and the "UnitTest." suffix from the $testFileBase to allow - // for some less conventionally named test case files. - $fileBase = str_replace($dir, '', $testFileBase); - $fileBase = substr($fileBase, 1, -9); - - foreach ($di as $file) { - $fileName = $file->getBasename('UnitTest.inc'); - $extension = $file->getExtension(); - if (substr($fileName, 0, strlen($fileBase)) === $fileBase - && $extension === 'inc' - ) { - $testFiles[] = $file->getPathname(); - } - } - - // Put them in order. - sort($testFiles, SORT_NATURAL); - - return $testFiles; - - }//end getTestFiles() - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'ClassFileNameUnitTest.inc': - return [ - 12 => 1, - 13 => 1, - 14 => 1, - 15 => 1, - 16 => 1, - 17 => 1, - 18 => 1, - 19 => 1, - 20 => 1, - 21 => 1, - 22 => 1, - 23 => 1, - 27 => 1, - 28 => 1, - 29 => 1, - 30 => 1, - 31 => 1, - 32 => 1, - 33 => 1, - 34 => 1, - 35 => 1, - 36 => 1, - 37 => 1, - 38 => 1, - 39 => 1, - 40 => 1, - 41 => 1, - 42 => 1, - ]; - - case 'ClassFileNameLiveCodingFailUnitTest.inc': - return [ - 6 => 1, - ]; - - case 'ClassFileName Spaces In FilenameUnitTest.inc': - return [ - 7 => 1, - ]; - - case 'ClassFileName-Dashes-In-FilenameUnitTest.inc': - return [ - 7 => 1, - ]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/DuplicatePropertyUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/DuplicatePropertyUnitTest.js deleted file mode 100644 index 04126f8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/DuplicatePropertyUnitTest.js +++ /dev/null @@ -1,45 +0,0 @@ -var x = { - abc: 1, - zyz: 2, - abc: 5, - mno: { - abc: 4 - }, - abc: 5 - - this.request({ - action: 'getSubmissions' - }); - - this.request({ - action: 'deleteSubmission' - }); -} - - -LinkingEditScreenWidgetType.prototype = { - - _addDeleteButtonEvent: function(parentid) - { - var params = { - screen: 'LinkingEditScreenWidget', - assetid: self.assetid, - parentid: parentid, - assetid: parentid, - op: 'deleteLink' - }; - - }, - - saveDesignEdit: function() - { - var params = { - screen: [this.id, 'Widget'].join(''), - assetid: this.assetid, - changes: dfx.jsonEncode(this.currnetLinksWdgt.getChanges()), - op: 'saveLinkEdit' - }; - - } - -}; \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/DuplicatePropertyUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/DuplicatePropertyUnitTest.php deleted file mode 100644 index b377246..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/DuplicatePropertyUnitTest.php +++ /dev/null @@ -1,57 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Classes; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the DuplicateProperty sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Classes\DuplicatePropertySniff - */ -final class DuplicatePropertyUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 4 => 1, - 8 => 1, - 28 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/LowercaseClassKeywordsUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/LowercaseClassKeywordsUnitTest.inc deleted file mode 100644 index cd69bf5..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/LowercaseClassKeywordsUnitTest.inc +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Classes; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the LowercaseClassKeywords sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Classes\LowercaseClassKeywordsSniff - */ -final class LowercaseClassKeywordsUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - $errors = [ - 2 => 3, - 3 => 3, - 4 => 1, - 5 => 1, - 6 => 2, - 8 => 1, - 10 => 1, - 11 => 1, - 14 => 1, - 16 => 1, - 19 => 1, - 22 => 1, - 23 => 1, - ]; - - return $errors; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/SelfMemberReferenceUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/SelfMemberReferenceUnitTest.inc deleted file mode 100644 index 4f17813..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/SelfMemberReferenceUnitTest.inc +++ /dev/null @@ -1,199 +0,0 @@ -testResults; - - - // Correct call to self. - $testResults[] = self::selfMemberReferenceUnitTestFunction(); - $testResults[] = parent::selfMemberReferenceUnitTestFunction(); - - // Incorrect case. - $testResults[] = Self::selfMemberReferenceUnitTestFunction(); - $testResults[] = SELF::selfMemberReferenceUnitTestFunction(); - $testResults[] = SelfMemberReferenceUnitTestExample::selfMemberReferenceUnitTestFunction(); - - - // Incorrect spacing. - $testResults[] = self ::selfMemberReferenceUnitTestFunction(); - $testResults[] = self:: selfMemberReferenceUnitTestFunction(); - $testResults[] = self :: selfMemberReferenceUnitTestFunction(); - - // Remove ALL the newlines - $testResults[] = self - - - - - :: - - - - - selfMemberReferenceUnitTestFunction(); - - } - - - function selfMemberReferenceUnitTestFunction() - { - $this->testCount = $this->testCount + 1; - return $this->testCount; - - } - - -} - - -class MyClass { - - public static function test($value) { - echo "$value\n"; - } - - public static function walk() { - $callback = function($value, $key) { - // This is valid because you can't use self:: in a closure. - MyClass::test($value); - }; - - $array = array(1,2,3); - array_walk($array, $callback); - } -} - -MyClass::walk(); - -class Controller -{ - public function Action() - { - Doctrine\Common\Util\Debug::dump(); - } -} - -class Foo -{ - public static function bar() - { - \Foo::baz(); - } -} - -namespace TYPO3\CMS\Reports; - -class Status { - const NOTICE = -2; - const INFO = -1; - const OK = 0; - const WARNING = 1; - const ERROR = 2; -} - -namespace TYPO3\CMS\Reports\Report\Status; - -class Status implements \TYPO3\CMS\Reports\ReportInterface { - public function getHighestSeverity(array $statusCollection) { - $highestSeverity = \TYPO3\CMS\Reports\Status::NOTICE; - } -} - -namespace Foo; - -class Bar { - - function myFunction() - { - \Foo\Whatever::something(); - \Foo\Bar::something(); - } -} - -namespace Foo\Bar; - -class Baz { - - function myFunction() - { - \Foo\Bar\Whatever::something(); - \Foo\Bar\Baz::something(); - } -} - -class Nested_Anon_Class { - public function getAnonymousClass() { - // Spacing/comments should not cause false negatives for the NotUsed error. - Nested_Anon_Class :: $prop; - Nested_Anon_Class - /* some comment */ - - :: - - // phpcs:ignore Standard.Category.SniffName -- for reasons. - Bar(); - - // Anonymous class is a different scope. - return new class() { - public function nested_function() { - Nested_Anon_Class::$prop; - Nested_Anon_Class::BAR; - } - }; - } -} - -// Test dealing with scoped namespaces. -namespace Foo\Baz { - class BarFoo { - public function foo() { - echo Foo\Baz\BarFoo::$prop; - } - } -} - -// Prevent false negative when namespace has whitespace/comments. -namespace Foo /*comment*/ \ Bah { - class BarFoo { - public function foo() { - echo Foo \ /*comment*/ Bah\BarFoo::$prop; - } - } -} - -namespace EndsIn\CloseTag ?> -testResults; - - - // Correct call to self. - $testResults[] = self::selfMemberReferenceUnitTestFunction(); - $testResults[] = parent::selfMemberReferenceUnitTestFunction(); - - // Incorrect case. - $testResults[] = self::selfMemberReferenceUnitTestFunction(); - $testResults[] = self::selfMemberReferenceUnitTestFunction(); - $testResults[] = self::selfMemberReferenceUnitTestFunction(); - - - // Incorrect spacing. - $testResults[] = self::selfMemberReferenceUnitTestFunction(); - $testResults[] = self::selfMemberReferenceUnitTestFunction(); - $testResults[] = self::selfMemberReferenceUnitTestFunction(); - - // Remove ALL the newlines - $testResults[] = self::selfMemberReferenceUnitTestFunction(); - - } - - - function selfMemberReferenceUnitTestFunction() - { - $this->testCount = $this->testCount + 1; - return $this->testCount; - - } - - -} - - -class MyClass { - - public static function test($value) { - echo "$value\n"; - } - - public static function walk() { - $callback = function($value, $key) { - // This is valid because you can't use self:: in a closure. - MyClass::test($value); - }; - - $array = array(1,2,3); - array_walk($array, $callback); - } -} - -MyClass::walk(); - -class Controller -{ - public function Action() - { - Doctrine\Common\Util\Debug::dump(); - } -} - -class Foo -{ - public static function bar() - { - self::baz(); - } -} - -namespace TYPO3\CMS\Reports; - -class Status { - const NOTICE = -2; - const INFO = -1; - const OK = 0; - const WARNING = 1; - const ERROR = 2; -} - -namespace TYPO3\CMS\Reports\Report\Status; - -class Status implements \TYPO3\CMS\Reports\ReportInterface { - public function getHighestSeverity(array $statusCollection) { - $highestSeverity = \TYPO3\CMS\Reports\Status::NOTICE; - } -} - -namespace Foo; - -class Bar { - - function myFunction() - { - \Foo\Whatever::something(); - self::something(); - } -} - -namespace Foo\Bar; - -class Baz { - - function myFunction() - { - \Foo\Bar\Whatever::something(); - self::something(); - } -} - -class Nested_Anon_Class { - public function getAnonymousClass() { - // Spacing/comments should not cause false negatives for the NotUsed error. - self::$prop; - - /* some comment */ - - self::// phpcs:ignore Standard.Category.SniffName -- for reasons. - Bar(); - - // Anonymous class is a different scope. - return new class() { - public function nested_function() { - Nested_Anon_Class::$prop; - Nested_Anon_Class::BAR; - } - }; - } -} - -// Test dealing with scoped namespaces. -namespace Foo\Baz { - class BarFoo { - public function foo() { - echo self::$prop; - } - } -} - -// Prevent false negative when namespace has whitespace/comments. -namespace Foo /*comment*/ \ Bah { - class BarFoo { - public function foo() { - echo /*comment*/ self::$prop; - } - } -} - -namespace EndsIn\CloseTag ?> - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Classes; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the SelfMemberReference sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Classes\SelfMemberReferenceSniff - */ -final class SelfMemberReferenceUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 24 => 1, - 25 => 1, - 26 => 1, - 30 => 1, - 31 => 1, - 32 => 2, - 40 => 2, - 92 => 1, - 121 => 1, - 132 => 1, - 139 => 3, - 140 => 1, - 143 => 2, - 162 => 1, - 171 => 1, - 183 => 1, - 197 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ValidClassNameUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ValidClassNameUnitTest.inc deleted file mode 100644 index 7ec0065..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ValidClassNameUnitTest.inc +++ /dev/null @@ -1,201 +0,0 @@ -anonymous = new class extends ArrayObject - { - public function __construct() - { - parent::__construct(['a' => 1, 'b' => 2]); - } - }; - } -} - -// Valid interface name. -interface ValidCamelCaseClass extends MyClass {} - - -// Incorrect usage of camel case. -interface invalidCamelCaseClass extends MyClass {} -interface Invalid_Camel_Case_Class_With_Underscores implements MyClass {} - - -// All lowercase. -interface invalidlowercaseclass extends MyClass {} -interface invalid_lowercase_class_with_underscores extends MyClass {} - - -// All uppercase. -interface VALIDUPPERCASECLASS extends MyClass {} -interface INVALID_UPPERCASE_CLASS_WITH_UNDERSCORES extends MyClass {} - - -// Mix camel case with uppercase. -interface ValidCamelCaseClassWithUPPERCASE extends MyClass {} - - -// Usage of numeric characters. -interface ValidCamelCaseClassWith1Number extends MyClass {} -interface ValidCamelCaseClassWith12345Numbers extends MyClass {} -interface 5InvalidCamelCaseClassStartingWithNumber extends MyClass {} -interface ValidCamelCaseClassEndingWithNumber5 extends MyClass {} -interface 12345 extends MyClass {} - -interface Testing{} - -interface Base -{ - protected $anonymous; - - public function __construct(); -} - - -// Valid trait name. -trait ValidCamelCaseClass extends MyClass {} - - -// Incorrect usage of camel case. -trait invalidCamelCaseClass extends MyClass {} -trait Invalid_Camel_Case_Class_With_Underscores implements MyClass {} - - -// All lowercase. -trait invalidlowercaseclass extends MyClass {} -trait invalid_lowercase_class_with_underscores extends MyClass {} - - -// All uppercase. -trait VALIDUPPERCASECLASS extends MyClass {} -trait INVALID_UPPERCASE_CLASS_WITH_UNDERSCORES extends MyClass {} - - -// Mix camel case with uppercase. -trait ValidCamelCaseClassWithUPPERCASE extends MyClass {} - - -// Usage of numeric characters. -trait ValidCamelCaseClassWith1Number extends MyClass {} -trait ValidCamelCaseClassWith12345Numbers extends MyClass {} -trait 5InvalidCamelCaseClassStartingWithNumber extends MyClass {} -trait ValidCamelCaseClassEndingWithNumber5 extends MyClass {} -trait 12345 extends MyClass {} - -trait Testing{} - -trait Base -{ - protected $anonymous; - - public function __construct() - { - $this->anonymous = new class extends ArrayObject - { - public function __construct() - { - parent::__construct(['a' => 1, 'b' => 2]); - } - }; - } -} - -// Valid enum name. -enum ValidCamelCaseClass: string {} - - -// Incorrect usage of camel case. -enum invalidCamelCaseClass {} -enum Invalid_Camel_Case_Class_With_Underscores {} - - -// All lowercase. -enum invalidlowercaseclass: INT {} -enum invalid_lowercase_class_with_underscores {} - - -// All uppercase. -enum VALIDUPPERCASECLASS: int {} -enum INVALID_UPPERCASE_CLASS_WITH_UNDERSCORES {} - - -// Mix camel case with uppercase. -enum ValidCamelCaseClassWithUPPERCASE : string {} - - -// Usage of numeric characters. -enum ValidCamelCaseClassWith1Number {} -enum ValidCamelCaseClassWith12345Numbers : string {} -enum ValidCamelCaseClassEndingWithNumber5 {} - -enum Testing{} - -enum Base -{ - public function __construct() - { - $this->anonymous = new class extends ArrayObject - { - public function __construct() - { - parent::__construct(['a' => 1, 'b' => 2]); - } - }; - } -} - -if ( class_exists( Test :: class ) ) {} -if ( class_exists( Test2 ::class ) ) {} - -$foo = new class( - new class implements Countable { - } -) extends DateTime { -}; - -class /*comment*/ CommentsShouldBeIgnoredValidName {} -trait //comment - commentsshouldbeignoredInvalidName {} -interface // phpcs:ignore Stnd.Cat.SniffName -- just testing - annotationshouldbeignored_InvalidName {} - -class CommentsShouldBeIgnoredValid/*comment*/ {} -interface annotations_should_be_ignored_InvalidName// phpcs:ignore Stnd.Cat.SniffName -- just testing -{} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ValidClassNameUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ValidClassNameUnitTest.php deleted file mode 100644 index f73b38e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Classes/ValidClassNameUnitTest.php +++ /dev/null @@ -1,83 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Classes; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ValidClassName sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Classes\ValidClassNameSniff - */ -final class ValidClassNameUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 9 => 1, - 10 => 1, - 14 => 1, - 15 => 1, - 20 => 1, - 30 => 1, - 32 => 1, - 57 => 1, - 58 => 1, - 62 => 1, - 63 => 1, - 68 => 1, - 78 => 1, - 80 => 1, - 97 => 1, - 98 => 1, - 102 => 1, - 103 => 1, - 108 => 1, - 118 => 1, - 120 => 1, - 145 => 1, - 146 => 1, - 150 => 1, - 151 => 1, - 156 => 1, - 195 => 1, - 197 => 1, - 200 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/BlockCommentUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/BlockCommentUnitTest.inc deleted file mode 100644 index 4e3f18d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/BlockCommentUnitTest.inc +++ /dev/null @@ -1,340 +0,0 @@ - - - - - - - - - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Commenting; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the BlockComment sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting\BlockCommentSniff - */ -final class BlockCommentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Get a list of CLI values to set before the file is tested. - * - * @param string $testFile The name of the file being tested. - * @param \PHP_CodeSniffer\Config $config The config data for the test run. - * - * @return void - */ - public function setCliValues($testFile, $config) - { - $config->tabWidth = 4; - - }//end setCliValues() - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - $errors = [ - 3 => 1, - 8 => 1, - 20 => 1, - 24 => 1, - 30 => 1, - 31 => 1, - 34 => 1, - 40 => 1, - 45 => 1, - 49 => 1, - 51 => 1, - 53 => 1, - 57 => 1, - 60 => 1, - 61 => 1, - 63 => 1, - 65 => 1, - 68 => 1, - 70 => 1, - 72 => 1, - 75 => 1, - 84 => 1, - 87 => 1, - 89 => 1, - 92 => 1, - 111 => 1, - 159 => 1, - 181 => 1, - 188 => 1, - 208 => 1, - 214 => 1, - 226 => 1, - 227 => 1, - 232 => 1, - 233 => 1, - 256 => 1, - 271 => 1, - 273 => 1, - ]; - - return $errors; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/ClassCommentUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/ClassCommentUnitTest.inc deleted file mode 100644 index 8de3d0a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/ClassCommentUnitTest.inc +++ /dev/null @@ -1,145 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Commenting; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ClassComment sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting\ClassCommentSniff - */ -final class ClassCommentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 2 => 1, - 15 => 1, - 31 => 1, - 54 => 1, - 143 => 1, - 145 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [ - 29 => 1, - 30 => 1, - 50 => 1, - 66 => 1, - 67 => 1, - ]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/ClosingDeclarationCommentUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/ClosingDeclarationCommentUnitTest.1.inc deleted file mode 100644 index 560370b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/ClosingDeclarationCommentUnitTest.1.inc +++ /dev/null @@ -1,124 +0,0 @@ - $a; - -trait TestTrait { -}//end trait - -trait TestTrait { -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/ClosingDeclarationCommentUnitTest.1.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/ClosingDeclarationCommentUnitTest.1.inc.fixed deleted file mode 100644 index 8c69014..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/ClosingDeclarationCommentUnitTest.1.inc.fixed +++ /dev/null @@ -1,117 +0,0 @@ - $a; - -trait TestTrait { -}//end trait - -trait TestTrait { -}//end trait diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/ClosingDeclarationCommentUnitTest.2.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/ClosingDeclarationCommentUnitTest.2.inc deleted file mode 100644 index 25913dd..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/ClosingDeclarationCommentUnitTest.2.inc +++ /dev/null @@ -1,7 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Commenting; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ClosingDeclarationComment sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting\ClosingDeclarationCommentSniff - */ -final class ClosingDeclarationCommentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the test file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'ClosingDeclarationCommentUnitTest.1.inc': - return [ - 13 => 1, - 17 => 1, - 31 => 1, - 41 => 1, - 59 => 1, - 63 => 1, - 67 => 1, - 79 => 1, - 83 => 1, - 89 => 1, - 92 => 1, - 98 => 1, - 101 => 1, - 106 => 1, - 110 => 1, - 124 => 1, - ]; - - case 'ClosingDeclarationCommentUnitTest.4.inc': - return [8 => 1]; - - case 'ClosingDeclarationCommentUnitTest.5.inc': - return [11 => 1]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @param string $testFile The name of the test file being tested. - * - * @return array - */ - public function getWarningList($testFile='') - { - switch ($testFile) { - case 'ClosingDeclarationCommentUnitTest.1.inc': - return [71 => 1]; - - case 'ClosingDeclarationCommentUnitTest.2.inc': - case 'ClosingDeclarationCommentUnitTest.3.inc': - return [7 => 1]; - - default: - return []; - } - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.inc deleted file mode 100644 index 1b2eddb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.inc +++ /dev/null @@ -1,146 +0,0 @@ - line numbers for each token. - * - * Long description with some points: - * - one - * - two - * - three - * - * @param array &$tokens The array of tokens to process. - * @param object $tokenizer The tokenizer being used to - * process this file. - * @param string $eolChar The EOL character to use for splitting strings. - * - * @return void - */ -function myFunction() {} - -class MyClass2 -{ - /** - * Some info about the variable here. - */ - var $x; -} - -abstract class MyClass -{ - /** -* Property comment - */ - readonly public string $prop; -} - -/** - * Some info about the enum here - * -*/ -enum Suits: string -{ - /** - * Some info about the case here. - */ - case HEARTS; -} - -/** ************************************************************************ - * Example with no errors. - **************************************************************************/ -function example() {} - -/** - * Some info about the class here. - */ -final class FinalClassWithFinalProp -{ - /** - *Some info about the property here. - * - * @var int - */ - final $property = 10; -} - -class AsymVisibility { - /** - * Stars should be aligned. - */ - public(set) int $prop = 1; - - /** - * Stars should be aligned. - */ - protected(set) int $prop = 1; - - /** - * Stars should be aligned. - */ - private(set) int $prop = 1; -} - -/** - * Some info about the class here. - */ -abstract class AbstractClassWithAbstractProp -{ - /** - *Some info about the property here. - * - * @var int - */ - abstract $property {get;} -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.inc.fixed deleted file mode 100644 index 0b50530..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.inc.fixed +++ /dev/null @@ -1,146 +0,0 @@ - line numbers for each token. - * - * Long description with some points: - * - one - * - two - * - three - * - * @param array &$tokens The array of tokens to process. - * @param object $tokenizer The tokenizer being used to - * process this file. - * @param string $eolChar The EOL character to use for splitting strings. - * - * @return void - */ -function myFunction() {} - -class MyClass2 -{ - /** - * Some info about the variable here. - */ - var $x; -} - -abstract class MyClass -{ - /** - * Property comment - */ - readonly public string $prop; -} - -/** - * Some info about the enum here - * - */ -enum Suits: string -{ - /** - * Some info about the case here. - */ - case HEARTS; -} - -/** ************************************************************************ - * Example with no errors. - **************************************************************************/ -function example() {} - -/** - * Some info about the class here. - */ -final class FinalClassWithFinalProp -{ - /** - * Some info about the property here. - * - * @var int - */ - final $property = 10; -} - -class AsymVisibility { - /** - * Stars should be aligned. - */ - public(set) int $prop = 1; - - /** - * Stars should be aligned. - */ - protected(set) int $prop = 1; - - /** - * Stars should be aligned. - */ - private(set) int $prop = 1; -} - -/** - * Some info about the class here. - */ -abstract class AbstractClassWithAbstractProp -{ - /** - * Some info about the property here. - * - * @var int - */ - abstract $property {get;} -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.js deleted file mode 100644 index 6e1a878..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.js +++ /dev/null @@ -1,76 +0,0 @@ - -/** -* Some info about the class here - * - */ -foo.prototype = { - - /** - * Some info about the function here. - * - *@return void - */ - bar: function() {} -} - -/** - * Some info about the class here - * - */ -foo.prototype = { - - /** - *Some info about the function here. - * - * @return void - */ - bar: function() {} -} - -/** - * Some info about the class here - * -*/ -foo.prototype = { - - /** - * Some info about the function here. - * - * @return void - */ - bar: function() {} -} - -/** @var Database $mockedDatabase */ -/** @var Container $mockedContainer */ - -function myFunction() -{ - console.info('hi'); - /** - Comment here. - */ -} - -/** - * Creates a map of tokens => line numbers for each token. - * - * Long description with some points: - * - one - * - two - * - three - * - * @param array &$tokens The array of tokens to process. - * @param object $tokenizer The tokenizer being used to - * process this file. - * @param string $eolChar The EOL character to use for splitting strings. - * - * @return void - */ -function myFunction() {} - -$.extend(Datepicker.prototype, { - _widgetDatepicker: function() { - }, - /* Action for selecting a new month/year. */ -}); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.js.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.js.fixed deleted file mode 100644 index 9edb4cc..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.js.fixed +++ /dev/null @@ -1,76 +0,0 @@ - -/** - * Some info about the class here - * - */ -foo.prototype = { - - /** - * Some info about the function here. - * - * @return void - */ - bar: function() {} -} - -/** - * Some info about the class here - * - */ -foo.prototype = { - - /** - * Some info about the function here. - * - * @return void - */ - bar: function() {} -} - -/** - * Some info about the class here - * - */ -foo.prototype = { - - /** - * Some info about the function here. - * - * @return void - */ - bar: function() {} -} - -/** @var Database $mockedDatabase */ -/** @var Container $mockedContainer */ - -function myFunction() -{ - console.info('hi'); - /** - Comment here. - */ -} - -/** - * Creates a map of tokens => line numbers for each token. - * - * Long description with some points: - * - one - * - two - * - three - * - * @param array &$tokens The array of tokens to process. - * @param object $tokenizer The tokenizer being used to - * process this file. - * @param string $eolChar The EOL character to use for splitting strings. - * - * @return void - */ -function myFunction() {} - -$.extend(Datepicker.prototype, { - _widgetDatepicker: function() { - }, - /* Action for selecting a new month/year. */ -}); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.php deleted file mode 100644 index 883bb46..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/DocCommentAlignmentUnitTest.php +++ /dev/null @@ -1,100 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Commenting; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the DocCommentAlignment sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting\DocCommentAlignmentSniff - */ -final class DocCommentAlignmentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - $errors = [ - 3 => 1, - 11 => 1, - 17 => 1, - 18 => 1, - 19 => 1, - 23 => 2, - 24 => 1, - 25 => 2, - 26 => 1, - 32 => 1, - 33 => 1, - 38 => 1, - 39 => 1, - ]; - - if ($testFile === 'DocCommentAlignmentUnitTest.inc') { - $errors[75] = 1; - $errors[83] = 1; - $errors[84] = 1; - $errors[90] = 1; - $errors[91] = 1; - $errors[95] = 1; - $errors[96] = 1; - - $errors[106] = 1; - $errors[107] = 1; - $errors[111] = 2; - $errors[112] = 1; - $errors[113] = 1; - $errors[114] = 1; - - $errors[120] = 1; - $errors[121] = 1; - $errors[125] = 1; - $errors[126] = 1; - - $errors[136] = 1; - $errors[137] = 1; - $errors[141] = 2; - $errors[142] = 1; - $errors[143] = 1; - $errors[144] = 1; - }//end if - - return $errors; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/EmptyCatchCommentUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/EmptyCatchCommentUnitTest.inc deleted file mode 100644 index cde6e46..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/EmptyCatchCommentUnitTest.inc +++ /dev/null @@ -1,55 +0,0 @@ - \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/EmptyCatchCommentUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/EmptyCatchCommentUnitTest.php deleted file mode 100644 index de4163b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/EmptyCatchCommentUnitTest.php +++ /dev/null @@ -1,60 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Commenting; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the EmptyCatchComment sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting\EmptyCatchCommentSniff - */ -final class EmptyCatchCommentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 13 => 1, - 33 => 1, - 49 => 1, - 50 => 1, - 51 => 1, - 52 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.1.inc deleted file mode 100644 index 1db2861..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.1.inc +++ /dev/null @@ -1,43 +0,0 @@ - -* @author -* @copyright 1997~1994 The PHP Group -* @copyright 1994-1997 The PHP Group -* @copyright The PHP Group -* @license http://www.php.net/license/3_0.txt -* @summary An unknown summary tag -* -*/ - - -?> - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.1.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.1.inc.fixed deleted file mode 100644 index dbf8865..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.1.inc.fixed +++ /dev/null @@ -1,43 +0,0 @@ - -* @author -* @copyright 1997 Squiz Pty Ltd (ABN 77 084 670 600) -* @copyright 1994-1997 Squiz Pty Ltd (ABN 77 084 670 600) -* @copyright 2025 Squiz Pty Ltd (ABN 77 084 670 600) -* @license http://www.php.net/license/3_0.txt -* @summary An unknown summary tag -* -*/ - - -?> - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.1.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.1.js deleted file mode 100644 index 57d8d37..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.1.js +++ /dev/null @@ -1,40 +0,0 @@ - - - - -/** -* -* 0Multi-line short description without full stop -* -* -* asdasd -* long description for file (if any) -* asdasdadada -* -* PHP versio -* -* LICENSE: This source file is subject to version 3.0 of the PHP license -* that is available through the world-wide-web at the following URI: -* http://www.php.net/license/3_0.txt. If you did not receive a copy of -* the PHP License and are unable to obtain it through the web, please -* send a note to license@php.net so we can mail you a copy immediately. -* @package SquizCMS -* @package ADDITIONAL PACKAGE TAG -* @subpkg not_camelcased -* @author Antônio Carlos Venâncio Júnior -* @author -* @copyright 1997~1994 The PHP Group -* @copyright 1994-1997 The PHP Group -* @copyright The PHP Group -* @license http://www.php.net/license/3_0.txt -* @summary An unknown summary tag -* -*/ - - -/** -* This bit here is not qualified as file comment -* -* as it is not the first comment in the file -* -*/ diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.1.js.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.1.js.fixed deleted file mode 100644 index 44ff449..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.1.js.fixed +++ /dev/null @@ -1,40 +0,0 @@ - - - - -/** -* -* 0Multi-line short description without full stop -* -* -* asdasd -* long description for file (if any) -* asdasdadada -* -* PHP versio -* -* LICENSE: This source file is subject to version 3.0 of the PHP license -* that is available through the world-wide-web at the following URI: -* http://www.php.net/license/3_0.txt. If you did not receive a copy of -* the PHP License and are unable to obtain it through the web, please -* send a note to license@php.net so we can mail you a copy immediately. -* @package SquizCMS -* @package ADDITIONAL PACKAGE TAG -* @subpkg not_camelcased -* @author Squiz Pty Ltd -* @author -* @copyright 1997 Squiz Pty Ltd (ABN 77 084 670 600) -* @copyright 1994-1997 Squiz Pty Ltd (ABN 77 084 670 600) -* @copyright 2025 Squiz Pty Ltd (ABN 77 084 670 600) -* @license http://www.php.net/license/3_0.txt -* @summary An unknown summary tag -* -*/ - - -/** -* This bit here is not qualified as file comment -* -* as it is not the first comment in the file -* -*/ diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.10.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.10.inc deleted file mode 100644 index 1f82abf..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.10.inc +++ /dev/null @@ -1,12 +0,0 @@ - - * @copyright 2010-2014 Squiz Pty Ltd (ABN 77 084 670 600) - */ - -readonly class Foo { -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.2.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.2.inc deleted file mode 100644 index 520d349..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.2.inc +++ /dev/null @@ -1,11 +0,0 @@ - - * @copyright 2010-2014 Squiz Pty Ltd (ABN 77 084 670 600) - */ - -echo 'hi'; \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.2.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.2.js deleted file mode 100644 index 4bb4d50..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.2.js +++ /dev/null @@ -1,10 +0,0 @@ -/** - * File comment. - * - * @package Package - * @subpackage Subpackage - * @author Squiz Pty Ltd - * @copyright 2010-2014 Squiz Pty Ltd (ABN 77 084 670 600) - */ - -print 'hi'; \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.3.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.3.inc deleted file mode 100644 index b47603f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.3.inc +++ /dev/null @@ -1,9 +0,0 @@ - - * @copyright 2010-2014 Squiz Pty Ltd (ABN 77 084 670 600) - * diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.4.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.4.inc deleted file mode 100644 index 2fdeeba..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.4.inc +++ /dev/null @@ -1,3 +0,0 @@ - - * @copyright 2010-2014 Squiz Pty Ltd (ABN 77 084 670 600) - */ - -class Foo { -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.7.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.7.inc deleted file mode 100644 index 7074dac..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.7.inc +++ /dev/null @@ -1,12 +0,0 @@ - - * @copyright 2010-2014 Squiz Pty Ltd (ABN 77 084 670 600) - */ -#[Attribute] -class Foo { -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.8.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.8.inc deleted file mode 100644 index 5ef90f2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.8.inc +++ /dev/null @@ -1,9 +0,0 @@ - - * @copyright 2010-2014 Squiz Pty Ltd (ABN 77 084 670 600) - */ diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.9.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.9.inc deleted file mode 100644 index f6c9d99..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.9.inc +++ /dev/null @@ -1,12 +0,0 @@ - - * @copyright 2010-2014 Squiz Pty Ltd (ABN 77 084 670 600) - */ - -enum Foo { -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.php deleted file mode 100644 index 0252945..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FileCommentUnitTest.php +++ /dev/null @@ -1,82 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Commenting; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the FileComment sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting\FileCommentSniff - */ -final class FileCommentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'FileCommentUnitTest.1.inc': - case 'FileCommentUnitTest.1.js': - return [ - 1 => 1, - 22 => 2, - 23 => 1, - 24 => 2, - 25 => 2, - 26 => 1, - 27 => 2, - 28 => 2, - 32 => 2, - ]; - - case 'FileCommentUnitTest.4.inc': - case 'FileCommentUnitTest.6.inc': - case 'FileCommentUnitTest.7.inc': - case 'FileCommentUnitTest.9.inc': - case 'FileCommentUnitTest.10.inc': - return [1 => 1]; - - case 'FileCommentUnitTest.5.inc': - return [2 => 1]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentThrowTagUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentThrowTagUnitTest.inc deleted file mode 100644 index 25da502..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentThrowTagUnitTest.inc +++ /dev/null @@ -1,533 +0,0 @@ -callSomeFunction(); - - }//end okFunction() - - - /** - * Comment inside function. - * - * @throws Exception - */ - function okFunction() - { - /** - * @var FooClass - */ - $foo = FooFactory::factory(); - throw new Exception; - - }//end okFunction - - /** - * Needs at throws tag for rethrown exception, - * even though we have one throws tag. - * - * @throws PHP_Exception1 - */ - public function notOkVariableRethrown() - { - throw new PHP_Exception1('Error'); - - try { - // Do something. - } catch (PHP_Exception2 $e) { - logError(); - throw $e; - } - - }//end notOkVariableRethrown() - - /** - * Needs at throws tag for rethrown exception, - * even though we have one throws tag. - * - * @throws PHP_Exception1 - */ - public function notOkVariableRethrown() - { - throw new PHP_Exception1('Error'); - - try { - // Do something. - } catch (PHP_Exception1 | PHP_Exception2 $e) { - logError(); - throw $e; - } - - }//end notOkVariableRethrown() - - /** - * Has correct throws tags for all exceptions - * - * @throws PHP_Exception1 - * @throws PHP_Exception2 - */ - public function okVariableRethrown() - { - throw new PHP_Exception1('Error'); - - try { - // Do something. - } catch (PHP_Exception2 $e) { - logError(); - throw $e; - } - - }//end okVariableRethrown() - - /** - * Has correct throws tags for all exceptions - * - * @throws PHP_Exception1 - * @throws PHP_Exception2 - */ - public function okVariableMultiRethrown() - { - try { - // Do something. - } catch (PHP_Exception1 | PHP_Exception2 $e) { - logError(); - throw $e; - } - - }//end okVariableMultiRethrown() -}//end class - -class NamespacedException { - /** - * @throws \Exception - */ - public function foo() { - throw new \Exception(); - } - - /** - * @throws \Foo\Bar\FooBarException - */ - public function fooBar2() { - throw new \Foo\Bar\FooBarException(); - } - - /** - * @throws FooBarException - */ - public function fooBar2() { - throw new \Foo\Bar\FooBarException(); - } -} - -class Foo { - /** - * Comment - */ - public function foo() { - }//end foo() - - public function bar() { - throw new Exception(); - } - - /** - * Returns information for a test. - * - * This info includes parameters, their valid values. - * - * @param integer $projectid Id of the project. - * - * @return array - * @throws ChannelException If the project is invalid. - */ - public static function getTestInfo($projectid=NULL) - { - try { - DAL::beginTransaction(); - DAL::commit(); - } catch (DALException $e) { - DAL::rollBack(); - throw new ChannelException($e); - } - } -} - -class Test -{ - /** - * Folder name. - * - * @var string - */ - protected $folderName; - - protected function setUp() - { - parent::setUp(); - - if ( !strlen($this->folderName) ) { - throw new \RuntimeException('The $this->folderName must be specified before proceeding.'); - } - } - - /* - * - */ - protected function foo() - { - } - - /** - * @return Closure - */ - public function getStuff() - { - return function () { - throw new RuntimeException("bam!"); - }; - } -} - -/** - * Class comment. - */ -class A -{ - /** - * Function B. - */ - public function b() - { - return new class { - public function c() - { - throw new \Exception(); - } - } - } -} - -/** - * Class comment. - */ -class A -{ - /** - * Function B. - */ - public function b() - { - return new class { - /** - * Tag and token number mismatch. - * - * @throws PHP_Exception1 - * @throws PHP_Exception2 - */ - public function oneLessThrowsTagNeeded() - { - throw new PHP_Exception1('Error'); - - }//end oneLessThrowsTagNeeded() - } - } -} - -abstract class SomeClass { - /** - * Comment here. - */ - abstract public function getGroups(); -} - -class SomeClass { - /** - * Validates something. - * - * @param string $method The set method parameter. - * - * @return string The validated method. - * - * @throws Prefix_Invalid_Argument_Exception The invalid argument exception. - * @throws InvalidArgumentException The invalid argument exception. - */ - protected function validate_something( $something ) { - if ( ! Prefix_Validator::is_string( $something ) ) { - throw Prefix_Invalid_Argument_Exception::invalid_string_parameter( $something, 'something' ); - } - - if ( ! in_array( $something, $this->valid_http_something, true ) ) { - throw new InvalidArgumentException( sprintf( '%s is not a valid HTTP something', $something ) ); - } - - return $something; - } - - /** - * Comment - * - * @throws Exception1 Comment. - * @throws Exception2 Comment. - * @throws Exception3 Comment. - */ - public function foo() { - switch ($foo) { - case 1: - throw Exception1::a(); - case 2: - throw Exception1::b(); - case 3: - throw Exception1::c(); - case 4: - throw Exception2::a(); - case 5: - throw Exception2::b(); - default: - throw new Exception3; - - } - } -} - -namespace Test\Admin { - class NameSpacedClass { - /** - * @throws \ExceptionFromGlobalNamespace - */ - public function ExceptionInGlobalNamespace() { - throw new \ExceptionFromGlobalNamespace(); - } - - /** - * @throws ExceptionFromSameNamespace - */ - public function ExceptionInSameNamespace() { - throw new ExceptionFromSameNamespace(); - } - - /** - * @throws \Test\Admin\ExceptionFromSameNamespace - */ - public function ExceptionInSameNamespaceToo() { - throw new ExceptionFromSameNamespace(); - } - - /** - * @throws \Different\NameSpaceName\ExceptionFromDifferentNamespace - */ - public function ExceptionInSameNamespaceToo() { - throw new \Different\NameSpaceName\ExceptionFromDifferentNamespace(); - } - } -} - -namespace { - class GlobalNameSpaceClass { - /** - * @throws SomeGlobalException - */ - public function ThrowGlobalException() { - throw new SomeGlobalException(); - } - - /** - * @throws \SomeGlobalException - */ - public function ThrowGlobalExceptionToo() { - throw new SomeGlobalException(); - } - } -} - -$anon = new class { - /** - * Tag and token number mismatch. - * - * @throws PHP_Exception1 - * @throws PHP_Exception2 - */ - #[AnAttribute] - #[AnotherAttribute] - public function JumpOverAttributesToFindDocblock() { - throw new PHP_Exception1('Error'); - } -}; - - -/** - * @throws Wrong_Exception - */ -public function ImproveCommentTolerance() { - throw /*comment*/ new /*comment*/ Right_Exception('Error'); -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentThrowTagUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentThrowTagUnitTest.php deleted file mode 100644 index 72f35ec..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentThrowTagUnitTest.php +++ /dev/null @@ -1,67 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Commenting; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the FunctionCommentThrowTag sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting\FunctionCommentThrowTagSniff - */ -final class FunctionCommentThrowTagUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 9 => 1, - 21 => 1, - 35 => 1, - 47 => 1, - 61 => 2, - 106 => 1, - 123 => 1, - 200 => 1, - 219 => 1, - 287 => 1, - 397 => 1, - 519 => 1, - 530 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentUnitTest.inc deleted file mode 100644 index f5312c6..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentUnitTest.inc +++ /dev/null @@ -1,1196 +0,0 @@ -MyClass) - */ -public function caseSensitive($a1, $a2, $a3, arRay $a4, $a5, $a6, myclas $a7) -{ - -}//end caseSensitive() - - -/** - * More type hint check for custom type and array. - * - * @param array $a1 Comment here. - * @param array $a2 Comment here. - * @param MyClass $a3 Comment here. - * @param MyClass $a4 Comment here. - * - * @return array(int => MyClass) - */ -public function typeHint(MyClass $a1, $a2, myclass $a3, $a4) -{ - return (3 => 'myclass obj'); - -}//end typeHint() - - -/** - * Mixed variable type separated by a '|'. - * - * @param array|string $a1 Comment here. - * @param mixed $a2 Comment here. - * @param string|array $a3 Comment here. - * @param MyClass|int $a4 Comment here. - * - * @return bool - */ -public function mixedType($a1, $a2, $a3, $a4) -{ - return true; - -}//end mixedType() - - -/** - * Array type. - * - * @param array(MyClass) $a1 OK. - * @param array() $a2 Invalid type. - * @param array( $a3 Typo. - * @param array(int) $a4 Use 'array(integer)' instead. - * @param array(int => integer) $a5 Use 'array(integer => integer)' instead. - * @param array(integer => bool) $a6 Use 'array(integer => boolean)' instead. - * @param aRRay $a7 Use 'array' instead. - * @param string $a8 String with unknown type hint. - * - * @return int - */ -public function mixedArrayType($a1, $a2, array $a3, $a4, $a5, $a6, $a7, unknownTypeHint $a8) -{ - return 1; - -}//end mixedArrayType() - - -/** - */ -function empty1() -{ -}//end empty1() - - -/** - * - */ -function empty2() -{ -}//end empty2() - - -/** - * - * - * - */ -function empty3() -{ -}//end empty3 - - -/** - * @return boolean - */ -public function missingShortDescriptionInFunctionComment() -{ - return true; - -}//end missingShortDescriptionInFunctionComment() - - -class Another_Class -{ - - /** - * Destructor should not include a return tag. - * - * @return void - */ - function __destruct() - { - return; - } - - /** - * Constructor should not include a return tag. - * - * @return void - */ - function __construct() - { - return; - } - -}//end class - - -/** - * Comment param alignment test. - * - * @param string $varrr1 Comment1.. - * @param string $vr2 Comment2. - * @param string $var3 Comment3.. - * - * @return void - */ -public static function paramAlign($varrr1, $vr2, $var3) -{ - -}//end paramAlign() - - -/** - * Comment. - * - * @param string $id Comment. - * @param array $design Comment. - * - * @return void - */ -public static function paint($id, array $design) -{ - -}//end paint() - - -/** - * Adds specified class name to class attribute of this widget. - * - * @since 4.0.0 - * @return string - */ -public function myFunction() -{ - if ($condition === FALSE) { - echo 'hi'; - } - -}//end myFunction() - - -/** - * Adds specified class name to class attribute of this widget. - * - * @return string - */ -public function myFunction() -{ - if ($condition === FALSE) { - echo 'hi'; - return; - } - - return 'blah'; - -}//end myFunction() - - -/** - * Adds specified class name to class attribute of this widget. - * - * @return string - */ -public function myFunction() -{ - if ($condition === FALSE) { - echo 'hi'; - } - - return 'blah'; - -}//end myFunction() - -/** - * Test function. - * - * @param string $arg1 An argument - * - * @access public - * @return bool - */ - -echo $blah; - -function myFunction($arg1) {} - -class MyClass() { - /** - * An abstract function. - * - * @return string[] - */ - abstract final protected function myFunction(); -} - -/** - * Comment. - * - * @param mixed $test An argument. - * - * @return mixed - */ -function test($test) -{ - if ($test === TRUE) { - return; - } - - return $test; - -}//end test() - - -/** Comment. - * - * @return mixed - * - */ -function test() -{ - -}//end test() - -/** - * Comment. - * - * @param \other\ns\item $test An argument. - * - * @return mixed - */ -function test(\other\ns\item $test) -{ - return $test; - -}//end test() - -/** - * Comment. - * - * @param item $test An argument. - * - * @return mixed - */ -function test(\other\ns\item $test) -{ - return $test; - -}//end test() - -/** - * Comment. - * - * @param \first\ns\item $test An argument. - * - * @return mixed - */ -function test(\first\ns\item $test = \second\ns::CONSTANT) -{ - return $test; - -}//end test() - -/** - * Comment. - * - * @param \first\item $test An argument. - * - * @return mixed - */ -function test(\first\ns\item $test = \second\ns::CONSTANT) -{ - return $test; - -}//end test() - -// Closures should be ignored. -preg_replace_callback( - '~-([a-z])~', - function ($match) { - return strtoupper($match[1]); - }, - 'hello-world' -); - -$callback = function ($bar) use ($foo) - { - $bar += $foo; - }; - -/** - * Comment should end with '*', not '**' before the slash. - **/ -function test123() { - -} - -/** - * Cant use resource for type hint. - * - * @param resource $test An argument. - * - * @return mixed - */ -function test($test) -{ - return $test; - -}//end test() - -/** - * Variable number of args. - * - * @param string $a1 Comment here. - * @param string $a2 Comment here. - * @param string $a2,... Comment here. - * - * @return boolean - */ -public function variableArgs($a1, $a2) -{ - return true; - -}//end variableArgs() - -/** - * Contains closure. - * - * @return void - */ -public function containsClosure() -{ - function ($e) { - return new Event($e); - }, - -}//end containsClosure() - -/** - * 这是一条测试评论. - * - * @return void - */ -public function test() -{ - -}//end variableArgs() - -/** - * Uses callable. - * - * @param callable $cb Test parameter. - * - * @return void - */ -public function usesCallable(callable $cb) { - $cb(); -}//end usesCallable() - -/** - * Creates a map of tokens => line numbers for each token. - * - * @param array $tokens The array of tokens to process. - * @param object $tokenizer The tokenizer being used to process this file. - * @param string $eolChar The EOL character - * to use for splitting strings. - * - * @return void - * @throws Exception If something really bad - * happens while doing foo. - */ -public function foo(array &$tokens, $tokenizer, $eolChar) -{ - -}//end foo() - -/** - * Some description. - * - * @param \Vendor\Package\SomeClass $someclass Some class. - * @param \OtherVendor\Package\SomeClass2 $someclass2 Some class. - * @param \OtherVendor\Package\SomeClass2 $someclass3 Some class. - * - * @return void - */ -public function foo(SomeClass $someclass, \OtherVendor\Package\SomeClass2 $someclass2, SomeClass3 $someclass3) -{ -} - -/** - * Gettext. - * - * @return string - */ -public function _() { - return $foo; -} - -class Baz { - /** - * The PHP5 constructor - * - * No return tag - */ - public function __construct() { - - } -} - -/** - * Test - * - * @return void - * @throws E - */ -function myFunction() {} - -/** - * Yield test - * - * @return integer - */ -function yieldTest() -{ - for ($i = 0; $i < 5; $i++) { - yield $i; - } -} - -/** - * Yield test - * - * @return void - */ -function yieldTest() -{ - for ($i = 0; $i < 5; $i++) { - yield $i; - } -} - -/** - * Using "array" as a type hint should satisfy a specified array parameter type. - * - * @param MyClass[] $values An array of MyClass objects. - * - * @return void - */ -public function specifiedArray(array $values) { - -}// end specifiedArray() - -/** - * Using "callable" as a type hint should satisfy a "callback" parameter type. - * - * @param callback $cb A callback. - * - * @return void - */ -public function callableCallback(callable $cb) { - -}// end callableCallback() - -/** - * PHP7 type hints. - * - * @param string $name1 Comment. - * @param integer $name2 Comment. - * @param float $name3 Comment. - * @param boolean $name4 Comment. - * - * @return void - */ -public function myFunction (string $name1, int $name2, float $name3, bool $name4) { -} - -/** - * Variadic function. - * - * @param string $name1 Comment. - * @param string ...$name2 Comment. - * - * @return void - */ -public function myFunction(string $name1, string ...$name2) { -} - - -/** - * Variadic function. - * - * @param string $name1 Comment. - * @param string $name2 Comment. - * - * @return void - */ -public function myFunction(string $name1, string ...$name2) { -} - -/** - * Return description function + correct type. - * - * @return integer This is a description. - */ -public function myFunction() { - return 5; -} - -/** - * Return description function + incorrect type. - * - * @return int This is a description. - */ -public function myFunction() { - return 5; -} - -/** - * Return description function + no return. - * - * @return void This is a description. - */ -public function myFunction() { -} - -/** - * Return description function + mixed return. - * - * @return mixed This is a description. - */ -public function myFunction() { -} - -/** - * Function comment. - * - * @param $bar - * Comment here. - * @param ... - * Additional arguments here. - * - * @return - * Return value - * - */ -function foo($bar) { -} - -/** - * Do something. - * - * @return void - */ -public function someFunc(): void -{ - $class = new class - { - /** - * Do something. - * - * @return string - */ - public function getString(): string - { - return 'some string'; - } - }; -} - -/** - * Return description function + mixed return types. - * - * @return bool|int This is a description. - */ -function returnTypeWithDescriptionA() -{ - return 5; - -}//end returnTypeWithDescriptionA() - - -/** - * Return description function + mixed return types. - * - * @return real|bool This is a description. - */ -function returnTypeWithDescriptionB() -{ - return 5; - -}//end returnTypeWithDescriptionB() - - -/** - * Return description function + lots of different mixed return types. - * - * @return int|object|string[]|real|double|float|bool|array(int=>MyClass)|callable And here we have a description - */ -function returnTypeWithDescriptionC() -{ - return 5; - -}//end returnTypeWithDescriptionC() - - -/** - * Return description function + lots of different mixed return types. - * - * @return array(int=>bool)|\OtherVendor\Package\SomeClass2|MyClass[]|void And here we have a description - */ -function returnTypeWithDescriptionD() -{ - -}//end returnTypeWithDescriptionD() - -/** - * Yield from test - * - * @return int[] - */ -function yieldFromTest() -{ - yield from foo(); -} - -/** - * Audio - * - * Generates an audio element to embed sounds - * - * @param mixed $src Either a source string or - * an array of sources. - * @param mixed $unsupportedMessage The message to display - * if the media tag is not supported by the browser. - * @param mixed $attributes HTML attributes. - * @return string - */ -function audio( - $src, - $unsupportedMessage = '', - $attributes = '', -) -{ - return 'test'; -} - -/** - * Test function - * - * @return array - */ -function returnArrayWithClosure() -{ - function () { - return; - }; - - return []; -} - -/** - * Test function - * - * @return array - */ -function returnArrayWithAnonymousClass() -{ - new class { - /** - * @return void - */ - public function test() { - return; - } - }; - - return []; -} - -/** - * @return void - */ -function returnVoidWithClosure() -{ - function () { - return 1; - }; -} - -/** - * @return void - */ -function returnVoidWithAnonymousClass() -{ - new class { - /** - * @return integer - */ - public function test() - { - return 1; - } - }; -} - -class TestReturnVoid -{ - /** - * @return void - */ - public function test() - { - function () { - return 4; - }; - } -} - -/** - * Comment here. - * - * @param integer $a This is A. - * @param ?array $b This is B. - * - * @return void - */ -public static function foo(?int $a, ?array $b) {} - -/** - * Comment here. - * - * @param object $a This is A. - * @param object $b This is B. - * - * @return void - */ -public function foo(object $a, ?object $b) {} - -/** - * Prepares given PHP class method for later code building. - * - * @param integer $foo Comment. - * - Additional comment. - * - * @return void - */ -function foo($foo) {} - -/** - * {@inheritDoc} - */ -public function foo($a, $b) {} - -// phpcs:set Squiz.Commenting.FunctionComment skipIfInheritdoc true - -/** - * {@inheritDoc} - */ -public function foo($a, $b) {} - -/** - * Foo. - * - * @param mixed $a Comment. - * - * @return mixed - */ -public function foo(mixed $a): mixed {} - -// phpcs:set Squiz.Commenting.FunctionComment specialMethods[] -class Bar { - /** - * The PHP5 constructor - */ - public function __construct() { - - } -} - -// phpcs:set Squiz.Commenting.FunctionComment specialMethods[] ignored -/** - * Should be ok - */ -public function ignored() { - -} - -// phpcs:set Squiz.Commenting.FunctionComment specialMethods[] __construct,__destruct - -/** - * @return void - * @throws Exception If any other error occurs. */ -function throwCommentOneLine() {} - -/** - * When two adjacent pipe symbols are used (by mistake), the sniff should not throw a PHP Fatal error - * - * @param stdClass||null $object While invalid, this should not throw a PHP Fatal error. - * @return void - */ -function doublePipeFatalError(?stdClass $object) {} - -/** - * Test for passing variables by reference - * - * This sniff treats the '&' as optional for parameters passed by reference, but - * forbidden for parameters which are not passed by reference. - * - * Because mismatches may be in either direction, we cannot auto-fix these. - * - * @param string $foo A string passed in by reference. - * @param string &$bar A string passed in by reference. - * @param string $baz A string NOT passed in by reference. - * @param string &$qux A string NOT passed in by reference. - * @param string &$case1 A string passed in by reference with a case mismatch. - * @param string &$CASE2 A string NOT passed in by reference, also with a case mismatch. - * - * @return void - */ -public function variablesPassedByReference(&$foo, &$bar, $baz, $qux, &$CASE1, $case2) -{ - return; -} - -/** - * Test for param tag containing ref, but param in declaration not being by ref. - * - * @param string &$foo This should be flagged as (only) ParamNameUnexpectedAmpersandPrefix. - * @param string &$bar This should be flagged as (only) ParamNameNoMatch. - * @param string &$baz This should be flagged as (only) ParamNameNoCaseMatch. - * - * @return void - */ -function passedByRefMismatch($foo, $bra, $BAZ) { - return; -} - -/** - * Test variable case - * - * @param string $foo This parameter is lowercase. - * @param string $BAR This parameter is UPPERCASE. - * @param string $BazQux This parameter is TitleCase. - * @param string $corgeGrault This parameter is camelCase. - * @param string $GARPLY This parameter should be in lowercase. - * @param string $waldo This parameter should be in TitleCase. - * @param string $freD This parameter should be in UPPERCASE. - * @param string $PLUGH This parameter should be in TitleCase. - * - * @return void - */ -public function variableCaseTest( - $foo, - $BAR, - $BazQux, - $corgeGrault, - $garply, - $Waldo, - $FRED, - $PluGh -) { - return; -} - -/** - * Test variable order mismatch - * - * @param string $foo This is the third parameter. - * @param string $bar This is the first parameter. - * @param string $baz This is the second parameter. - * - * @return void - */ -public function variableOrderMismatch($bar, $baz, $foo) { - return; -} - -/** - * @return never - */ -function foo() {} - -/** - * @param $noTypeNoComment - * @return void - */ -function paramVariation1($noTypeNoComment): void {} - -/** - * @param $noTypeWithComment This parameter has no type specified. - * @return void - */ -function paramVariation2($noTypeWithComment): void {} - -/** - * @param integer $hasTypeNoComment - * @return void - */ -function paramVariation3($hasTypeNoComment): void {} - -/** - * @param integer $hasTypehasComment This parameter has type. - * @return void - */ -function paramVariation4($hasTypehasComment): void {} - -/** - * @param (Foo&Bar)|null $a Comment. - * @return void - */ -public function setTranslator($a): void -{ - $this->translator = $translator; -} - -/** - * Issue PHPCSStandards/PHP_CodeSniffer#1197. - * - * @return int|WP_Error - */ -function doNotTruncateClassNamesContainingUnderscoresAtEndOfType() { - return 0; -} - -/** - * Issue PHPCSStandards/PHP_CodeSniffer#1197. - * - * @return WP_Error|int - */ -function doNotTruncateClassNamesContainingUnderscoresAtStartOfType() { - return 0; -} - -/** - * Issue PHPCSStandards/PHP_CodeSniffer#1197. - * - * @return int|WP_Error|false - */ -function doNotTruncateClassNamesContainingUnderscoresInTheMiddelOfType() { - return 0; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentUnitTest.inc.fixed deleted file mode 100644 index b0d9fa0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentUnitTest.inc.fixed +++ /dev/null @@ -1,1196 +0,0 @@ - MyClass) - */ -public function caseSensitive($a1, $a2, $a3, arRay $a4, $a5, $a6, myclas $a7) -{ - -}//end caseSensitive() - - -/** - * More type hint check for custom type and array. - * - * @param array $a1 Comment here. - * @param array $a2 Comment here. - * @param MyClass $a3 Comment here. - * @param MyClass $a4 Comment here. - * - * @return array(integer => MyClass) - */ -public function typeHint(MyClass $a1, $a2, myclass $a3, $a4) -{ - return (3 => 'myclass obj'); - -}//end typeHint() - - -/** - * Mixed variable type separated by a '|'. - * - * @param array|string $a1 Comment here. - * @param mixed $a2 Comment here. - * @param string|array $a3 Comment here. - * @param MyClass|integer $a4 Comment here. - * - * @return boolean - */ -public function mixedType($a1, $a2, $a3, $a4) -{ - return true; - -}//end mixedType() - - -/** - * Array type. - * - * @param array(MyClass) $a1 OK. - * @param array $a2 Invalid type. - * @param array $a3 Typo. - * @param array(integer) $a4 Use 'array(integer)' instead. - * @param array(integer => integer) $a5 Use 'array(integer => integer)' instead. - * @param array(integer => boolean) $a6 Use 'array(integer => boolean)' instead. - * @param array $a7 Use 'array' instead. - * @param string $a8 String with unknown type hint. - * - * @return integer - */ -public function mixedArrayType($a1, $a2, array $a3, $a4, $a5, $a6, $a7, unknownTypeHint $a8) -{ - return 1; - -}//end mixedArrayType() - - -/** - */ -function empty1() -{ -}//end empty1() - - -/** - * - */ -function empty2() -{ -}//end empty2() - - -/** - * - * - * - */ -function empty3() -{ -}//end empty3 - - -/** - * @return boolean - */ -public function missingShortDescriptionInFunctionComment() -{ - return true; - -}//end missingShortDescriptionInFunctionComment() - - -class Another_Class -{ - - /** - * Destructor should not include a return tag. - * - * @return void - */ - function __destruct() - { - return; - } - - /** - * Constructor should not include a return tag. - * - * @return void - */ - function __construct() - { - return; - } - -}//end class - - -/** - * Comment param alignment test. - * - * @param string $varrr1 Comment1.. - * @param string $vr2 Comment2. - * @param string $var3 Comment3.. - * - * @return void - */ -public static function paramAlign($varrr1, $vr2, $var3) -{ - -}//end paramAlign() - - -/** - * Comment. - * - * @param string $id Comment. - * @param array $design Comment. - * - * @return void - */ -public static function paint($id, array $design) -{ - -}//end paint() - - -/** - * Adds specified class name to class attribute of this widget. - * - * @since 4.0.0 - * @return string - */ -public function myFunction() -{ - if ($condition === FALSE) { - echo 'hi'; - } - -}//end myFunction() - - -/** - * Adds specified class name to class attribute of this widget. - * - * @return string - */ -public function myFunction() -{ - if ($condition === FALSE) { - echo 'hi'; - return; - } - - return 'blah'; - -}//end myFunction() - - -/** - * Adds specified class name to class attribute of this widget. - * - * @return string - */ -public function myFunction() -{ - if ($condition === FALSE) { - echo 'hi'; - } - - return 'blah'; - -}//end myFunction() - -/** - * Test function. - * - * @param string $arg1 An argument - * - * @access public - * @return bool - */ - -echo $blah; - -function myFunction($arg1) {} - -class MyClass() { - /** - * An abstract function. - * - * @return string[] - */ - abstract final protected function myFunction(); -} - -/** - * Comment. - * - * @param mixed $test An argument. - * - * @return mixed - */ -function test($test) -{ - if ($test === TRUE) { - return; - } - - return $test; - -}//end test() - - -/** Comment. - * - * @return mixed - * - */ -function test() -{ - -}//end test() - -/** - * Comment. - * - * @param \other\ns\item $test An argument. - * - * @return mixed - */ -function test(\other\ns\item $test) -{ - return $test; - -}//end test() - -/** - * Comment. - * - * @param item $test An argument. - * - * @return mixed - */ -function test(\other\ns\item $test) -{ - return $test; - -}//end test() - -/** - * Comment. - * - * @param \first\ns\item $test An argument. - * - * @return mixed - */ -function test(\first\ns\item $test = \second\ns::CONSTANT) -{ - return $test; - -}//end test() - -/** - * Comment. - * - * @param \first\item $test An argument. - * - * @return mixed - */ -function test(\first\ns\item $test = \second\ns::CONSTANT) -{ - return $test; - -}//end test() - -// Closures should be ignored. -preg_replace_callback( - '~-([a-z])~', - function ($match) { - return strtoupper($match[1]); - }, - 'hello-world' -); - -$callback = function ($bar) use ($foo) - { - $bar += $foo; - }; - -/** - * Comment should end with '*', not '**' before the slash. - **/ -function test123() { - -} - -/** - * Cant use resource for type hint. - * - * @param resource $test An argument. - * - * @return mixed - */ -function test($test) -{ - return $test; - -}//end test() - -/** - * Variable number of args. - * - * @param string $a1 Comment here. - * @param string $a2 Comment here. - * @param string $a2,... Comment here. - * - * @return boolean - */ -public function variableArgs($a1, $a2) -{ - return true; - -}//end variableArgs() - -/** - * Contains closure. - * - * @return void - */ -public function containsClosure() -{ - function ($e) { - return new Event($e); - }, - -}//end containsClosure() - -/** - * 这是一条测试评论. - * - * @return void - */ -public function test() -{ - -}//end variableArgs() - -/** - * Uses callable. - * - * @param callable $cb Test parameter. - * - * @return void - */ -public function usesCallable(callable $cb) { - $cb(); -}//end usesCallable() - -/** - * Creates a map of tokens => line numbers for each token. - * - * @param array $tokens The array of tokens to process. - * @param object $tokenizer The tokenizer being used to process this file. - * @param string $eolChar The EOL character - * to use for splitting strings. - * - * @return void - * @throws Exception If something really bad - * happens while doing foo. - */ -public function foo(array &$tokens, $tokenizer, $eolChar) -{ - -}//end foo() - -/** - * Some description. - * - * @param \Vendor\Package\SomeClass $someclass Some class. - * @param \OtherVendor\Package\SomeClass2 $someclass2 Some class. - * @param \OtherVendor\Package\SomeClass2 $someclass3 Some class. - * - * @return void - */ -public function foo(SomeClass $someclass, \OtherVendor\Package\SomeClass2 $someclass2, SomeClass3 $someclass3) -{ -} - -/** - * Gettext. - * - * @return string - */ -public function _() { - return $foo; -} - -class Baz { - /** - * The PHP5 constructor - * - * No return tag - */ - public function __construct() { - - } -} - -/** - * Test - * - * @return void - * @throws E - */ -function myFunction() {} - -/** - * Yield test - * - * @return integer - */ -function yieldTest() -{ - for ($i = 0; $i < 5; $i++) { - yield $i; - } -} - -/** - * Yield test - * - * @return void - */ -function yieldTest() -{ - for ($i = 0; $i < 5; $i++) { - yield $i; - } -} - -/** - * Using "array" as a type hint should satisfy a specified array parameter type. - * - * @param MyClass[] $values An array of MyClass objects. - * - * @return void - */ -public function specifiedArray(array $values) { - -}// end specifiedArray() - -/** - * Using "callable" as a type hint should satisfy a "callback" parameter type. - * - * @param callback $cb A callback. - * - * @return void - */ -public function callableCallback(callable $cb) { - -}// end callableCallback() - -/** - * PHP7 type hints. - * - * @param string $name1 Comment. - * @param integer $name2 Comment. - * @param float $name3 Comment. - * @param boolean $name4 Comment. - * - * @return void - */ -public function myFunction (string $name1, int $name2, float $name3, bool $name4) { -} - -/** - * Variadic function. - * - * @param string $name1 Comment. - * @param string ...$name2 Comment. - * - * @return void - */ -public function myFunction(string $name1, string ...$name2) { -} - - -/** - * Variadic function. - * - * @param string $name1 Comment. - * @param string $name2 Comment. - * - * @return void - */ -public function myFunction(string $name1, string ...$name2) { -} - -/** - * Return description function + correct type. - * - * @return integer This is a description. - */ -public function myFunction() { - return 5; -} - -/** - * Return description function + incorrect type. - * - * @return integer This is a description. - */ -public function myFunction() { - return 5; -} - -/** - * Return description function + no return. - * - * @return void This is a description. - */ -public function myFunction() { -} - -/** - * Return description function + mixed return. - * - * @return mixed This is a description. - */ -public function myFunction() { -} - -/** - * Function comment. - * - * @param $bar - * Comment here. - * @param ... - * Additional arguments here. - * - * @return - * Return value - * - */ -function foo($bar) { -} - -/** - * Do something. - * - * @return void - */ -public function someFunc(): void -{ - $class = new class - { - /** - * Do something. - * - * @return string - */ - public function getString(): string - { - return 'some string'; - } - }; -} - -/** - * Return description function + mixed return types. - * - * @return boolean|integer This is a description. - */ -function returnTypeWithDescriptionA() -{ - return 5; - -}//end returnTypeWithDescriptionA() - - -/** - * Return description function + mixed return types. - * - * @return float|boolean This is a description. - */ -function returnTypeWithDescriptionB() -{ - return 5; - -}//end returnTypeWithDescriptionB() - - -/** - * Return description function + lots of different mixed return types. - * - * @return integer|object|string[]|float|boolean|array(integer => MyClass)|callable And here we have a description - */ -function returnTypeWithDescriptionC() -{ - return 5; - -}//end returnTypeWithDescriptionC() - - -/** - * Return description function + lots of different mixed return types. - * - * @return array(integer => boolean)|\OtherVendor\Package\SomeClass2|MyClass[]|void And here we have a description - */ -function returnTypeWithDescriptionD() -{ - -}//end returnTypeWithDescriptionD() - -/** - * Yield from test - * - * @return int[] - */ -function yieldFromTest() -{ - yield from foo(); -} - -/** - * Audio - * - * Generates an audio element to embed sounds - * - * @param mixed $src Either a source string or - * an array of sources. - * @param mixed $unsupportedMessage The message to display - * if the media tag is not supported by the browser. - * @param mixed $attributes HTML attributes. - * @return string - */ -function audio( - $src, - $unsupportedMessage = '', - $attributes = '', -) -{ - return 'test'; -} - -/** - * Test function - * - * @return array - */ -function returnArrayWithClosure() -{ - function () { - return; - }; - - return []; -} - -/** - * Test function - * - * @return array - */ -function returnArrayWithAnonymousClass() -{ - new class { - /** - * @return void - */ - public function test() { - return; - } - }; - - return []; -} - -/** - * @return void - */ -function returnVoidWithClosure() -{ - function () { - return 1; - }; -} - -/** - * @return void - */ -function returnVoidWithAnonymousClass() -{ - new class { - /** - * @return integer - */ - public function test() - { - return 1; - } - }; -} - -class TestReturnVoid -{ - /** - * @return void - */ - public function test() - { - function () { - return 4; - }; - } -} - -/** - * Comment here. - * - * @param integer $a This is A. - * @param array $b This is B. - * - * @return void - */ -public static function foo(?int $a, ?array $b) {} - -/** - * Comment here. - * - * @param object $a This is A. - * @param object $b This is B. - * - * @return void - */ -public function foo(object $a, ?object $b) {} - -/** - * Prepares given PHP class method for later code building. - * - * @param integer $foo Comment. - * - Additional comment. - * - * @return void - */ -function foo($foo) {} - -/** - * {@inheritDoc} - */ -public function foo($a, $b) {} - -// phpcs:set Squiz.Commenting.FunctionComment skipIfInheritdoc true - -/** - * {@inheritDoc} - */ -public function foo($a, $b) {} - -/** - * Foo. - * - * @param mixed $a Comment. - * - * @return mixed - */ -public function foo(mixed $a): mixed {} - -// phpcs:set Squiz.Commenting.FunctionComment specialMethods[] -class Bar { - /** - * The PHP5 constructor - */ - public function __construct() { - - } -} - -// phpcs:set Squiz.Commenting.FunctionComment specialMethods[] ignored -/** - * Should be ok - */ -public function ignored() { - -} - -// phpcs:set Squiz.Commenting.FunctionComment specialMethods[] __construct,__destruct - -/** - * @return void - * @throws Exception If any other error occurs. */ -function throwCommentOneLine() {} - -/** - * When two adjacent pipe symbols are used (by mistake), the sniff should not throw a PHP Fatal error - * - * @param stdClass|null $object While invalid, this should not throw a PHP Fatal error. - * @return void - */ -function doublePipeFatalError(?stdClass $object) {} - -/** - * Test for passing variables by reference - * - * This sniff treats the '&' as optional for parameters passed by reference, but - * forbidden for parameters which are not passed by reference. - * - * Because mismatches may be in either direction, we cannot auto-fix these. - * - * @param string $foo A string passed in by reference. - * @param string &$bar A string passed in by reference. - * @param string $baz A string NOT passed in by reference. - * @param string &$qux A string NOT passed in by reference. - * @param string &$case1 A string passed in by reference with a case mismatch. - * @param string &$CASE2 A string NOT passed in by reference, also with a case mismatch. - * - * @return void - */ -public function variablesPassedByReference(&$foo, &$bar, $baz, $qux, &$CASE1, $case2) -{ - return; -} - -/** - * Test for param tag containing ref, but param in declaration not being by ref. - * - * @param string &$foo This should be flagged as (only) ParamNameUnexpectedAmpersandPrefix. - * @param string &$bar This should be flagged as (only) ParamNameNoMatch. - * @param string &$baz This should be flagged as (only) ParamNameNoCaseMatch. - * - * @return void - */ -function passedByRefMismatch($foo, $bra, $BAZ) { - return; -} - -/** - * Test variable case - * - * @param string $foo This parameter is lowercase. - * @param string $BAR This parameter is UPPERCASE. - * @param string $BazQux This parameter is TitleCase. - * @param string $corgeGrault This parameter is camelCase. - * @param string $GARPLY This parameter should be in lowercase. - * @param string $waldo This parameter should be in TitleCase. - * @param string $freD This parameter should be in UPPERCASE. - * @param string $PLUGH This parameter should be in TitleCase. - * - * @return void - */ -public function variableCaseTest( - $foo, - $BAR, - $BazQux, - $corgeGrault, - $garply, - $Waldo, - $FRED, - $PluGh -) { - return; -} - -/** - * Test variable order mismatch - * - * @param string $foo This is the third parameter. - * @param string $bar This is the first parameter. - * @param string $baz This is the second parameter. - * - * @return void - */ -public function variableOrderMismatch($bar, $baz, $foo) { - return; -} - -/** - * @return never - */ -function foo() {} - -/** - * @param $noTypeNoComment - * @return void - */ -function paramVariation1($noTypeNoComment): void {} - -/** - * @param $noTypeWithComment This parameter has no type specified. - * @return void - */ -function paramVariation2($noTypeWithComment): void {} - -/** - * @param integer $hasTypeNoComment - * @return void - */ -function paramVariation3($hasTypeNoComment): void {} - -/** - * @param integer $hasTypehasComment This parameter has type. - * @return void - */ -function paramVariation4($hasTypehasComment): void {} - -/** - * @param (Foo&Bar)|null $a Comment. - * @return void - */ -public function setTranslator($a): void -{ - $this->translator = $translator; -} - -/** - * Issue PHPCSStandards/PHP_CodeSniffer#1197. - * - * @return integer|WP_Error - */ -function doNotTruncateClassNamesContainingUnderscoresAtEndOfType() { - return 0; -} - -/** - * Issue PHPCSStandards/PHP_CodeSniffer#1197. - * - * @return WP_Error|integer - */ -function doNotTruncateClassNamesContainingUnderscoresAtStartOfType() { - return 0; -} - -/** - * Issue PHPCSStandards/PHP_CodeSniffer#1197. - * - * @return integer|WP_Error|false - */ -function doNotTruncateClassNamesContainingUnderscoresInTheMiddelOfType() { - return 0; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentUnitTest.php deleted file mode 100644 index e3d86e3..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/FunctionCommentUnitTest.php +++ /dev/null @@ -1,211 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Commenting; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the FunctionComment sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting\FunctionCommentSniff - */ -final class FunctionCommentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - $errors = [ - 5 => 1, - 10 => 3, - 12 => 2, - 13 => 2, - 14 => 1, - 15 => 1, - 28 => 1, - 43 => 1, - 76 => 1, - 87 => 1, - 103 => 1, - 109 => 1, - 112 => 1, - 122 => 1, - 123 => 3, - 124 => 2, - 125 => 1, - 126 => 1, - 137 => 4, - 138 => 4, - 139 => 4, - 143 => 2, - 155 => 1, - 159 => 1, - 166 => 1, - 173 => 1, - 183 => 1, - 190 => 2, - 193 => 2, - 196 => 1, - 199 => 2, - 210 => 1, - 211 => 1, - 222 => 1, - 223 => 1, - 224 => 1, - 225 => 1, - 226 => 1, - 227 => 1, - 230 => 2, - 232 => 2, - 246 => 1, - 248 => 4, - 261 => 1, - 263 => 1, - 276 => 1, - 277 => 1, - 278 => 1, - 279 => 1, - 280 => 1, - 281 => 1, - 284 => 1, - 286 => 7, - 294 => 1, - 302 => 1, - 312 => 1, - 358 => 1, - 359 => 2, - 372 => 1, - 373 => 1, - 387 => 1, - 407 => 1, - 441 => 1, - 500 => 1, - 526 => 1, - 548 => 1, - 641 => 1, - 669 => 1, - 688 => 1, - 744 => 1, - 748 => 1, - 767 => 1, - 789 => 1, - 792 => 1, - 794 => 1, - 797 => 1, - 828 => 1, - 840 => 1, - 852 => 1, - 864 => 1, - 886 => 1, - 888 => 1, - 890 => 1, - 978 => 1, - 997 => 1, - 1004 => 2, - 1006 => 1, - 1029 => 1, - 1053 => 1, - 1058 => 2, - 1069 => 1, - 1070 => 1, - 1071 => 1, - 1080 => 2, - 1083 => 1, - 1084 => 1, - 1085 => 1, - 1093 => 4, - 1100 => 1, - 1101 => 1, - 1102 => 1, - 1103 => 1, - 1123 => 1, - 1124 => 1, - 1125 => 1, - 1138 => 1, - 1139 => 1, - 1144 => 1, - 1145 => 1, - 1151 => 1, - 1174 => 1, - 1183 => 1, - 1192 => 1, - ]; - - // Scalar type hints only work from PHP 7 onwards. - if (PHP_VERSION_ID >= 70000) { - $errors[17] = 3; - $errors[128] = 1; - $errors[143] = 3; - $errors[161] = 2; - $errors[201] = 1; - $errors[232] = 7; - $errors[363] = 3; - $errors[377] = 1; - $errors[575] = 2; - $errors[627] = 1; - $errors[1002] = 1; - $errors[1075] = 6; - $errors[1089] = 3; - $errors[1107] = 8; - $errors[1129] = 3; - $errors[1154] = 1; - $errors[1160] = 1; - } else { - $errors[729] = 4; - $errors[740] = 2; - $errors[752] = 2; - $errors[982] = 1; - }//end if - - // Object type hints only work from PHP 7.2 onwards. - if (PHP_VERSION_ID >= 70200) { - $errors[627] = 2; - } else { - $errors[992] = 2; - } - - // Mixed type hints only work from PHP 8.0 onwards. - if (PHP_VERSION_ID >= 80000) { - $errors[265] = 1; - $errors[459] = 1; - $errors[893] = 3; - } else { - $errors[1023] = 1; - } - - return $errors; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.inc deleted file mode 100644 index 220b916..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.inc +++ /dev/null @@ -1,199 +0,0 @@ - One -// -> One.One -// -> Two - -/* - Here is some inline example code: - -> One - -> One.One - -> Two -*/ - -/** - * Comment should be ignored in PHP 5.4. - * - */ -trait MyTrait { - -} - -$foo = 'foo'; // Var set to foo. - -echo $foo; - -// Comment here. -echo $foo; - -/** - * Comments about the include - */ -include_once($blah); - -// some comment without capital or full stop -echo $foo; // An unrelated comment. - -// An unrelated comment. -echo $foo; // some comment without capital or full stop - -class Foo -{ - // This is fine. - - /** - * Spacing is ignored above. - */ - function bar(){} -} - -if ($foo) { -}//end if -// Another comment here. -$foo++; - -if ($foo) { -}//end if -// another comment here. -$foo++; - -/** - * Comment should be ignored, even though there is an attribute between the docblock and the class declaration. - */ - -#[AttributeA] - -final class MyClass -{ - /** - * Comment should be ignored, even though there is an attribute between the docblock and the function declaration - */ - #[AttributeA] - #[AttributeB] - final public function test() {} -} - -/** - * Comment should be ignored. - * - */ -enum MyEnum { - -} - -/** - * Comment should be ignored. - * - */ -readonly class MyClass -{ - /** - * Comment should be ignored. - * - */ - readonly $property = 10; -} - -#️⃣ Apparently the emoji keycap number sign (hash) also works and turns this into a comment. -echo 'hello!'; - -/* - * N.B.: The below test line must be the last test in the file. - * Testing that a new line after an inline comment when it's the last non-whitespace - * token in a file, does *not* throw an error as this would conflict with the common - * "new line required at end of file" rule. - */ - -// For this test line having an empty line below it, is fine. diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.inc.fixed deleted file mode 100644 index 2cc700c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.inc.fixed +++ /dev/null @@ -1,192 +0,0 @@ - One -// -> One.One -// -> Two -/* - Here is some inline example code: - -> One - -> One.One - -> Two -*/ - -/** - * Comment should be ignored in PHP 5.4. - * - */ -trait MyTrait { - -} - -$foo = 'foo'; // Var set to foo. - -echo $foo; - -// Comment here. -echo $foo; - -/** - * Comments about the include - */ -include_once($blah); - -// some comment without capital or full stop -echo $foo; // An unrelated comment. - -// An unrelated comment. -echo $foo; // some comment without capital or full stop - -class Foo -{ - // This is fine. - - /** - * Spacing is ignored above. - */ - function bar(){} -} - -if ($foo) { -}//end if -// Another comment here. -$foo++; - -if ($foo) { -}//end if -// another comment here. -$foo++; - -/** - * Comment should be ignored, even though there is an attribute between the docblock and the class declaration. - */ - -#[AttributeA] - -final class MyClass -{ - /** - * Comment should be ignored, even though there is an attribute between the docblock and the function declaration - */ - #[AttributeA] - #[AttributeB] - final public function test() {} -} - -/** - * Comment should be ignored. - * - */ -enum MyEnum { - -} - -/** - * Comment should be ignored. - * - */ -readonly class MyClass -{ - /** - * Comment should be ignored. - * - */ - readonly $property = 10; -} - -// ️⃣ Apparently the emoji keycap number sign (hash) also works and turns this into a comment. -echo 'hello!'; - -/* - * N.B.: The below test line must be the last test in the file. - * Testing that a new line after an inline comment when it's the last non-whitespace - * token in a file, does *not* throw an error as this would conflict with the common - * "new line required at end of file" rule. - */ - -// For this test line having an empty line below it, is fine. diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.js deleted file mode 100644 index 6b1093e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.js +++ /dev/null @@ -1,129 +0,0 @@ -// Some content here. -var code = 'hello'; - -// This comment contains # multiple -// hash signs (#). -code = 'hello'; - -/** - * This is the first line of a function comment. - * This is the second line. - */ -function testFunction() -{ - // Callback methods which are added by external objects. - this.callbacks = {}; - -}//end testFunction() - -/** - * This is the first line of a class comment. - * This is the second line. - */ -myClass.prototype = { - - /** - * This is the first line of a method comment. - * This is the second line. - */ - load: function(url, callback) - { - // Some code here. - - } -}; - -// some code goes here! - -/* - A longer comment goes here. - It spans multiple lines!! - Or does it? -*/ - -// 0This is a simple multi-line -// comment! -code = 'hello'; - -//This is not valid. -code = 'hello'; - -// Neither is this! -code = 'hello'; - -// -code = 'hello'; - -/** Neither is this! **/ -code = 'hello'; - -/** - * This is the first line of a function comment. - * This is the second line. - */ -var myFunction = function() { -} - -/** - * This is the first line of a function comment. - * This is the second line. - */ -myFunction = function() { -} - -/** - * This is the first line of a function comment. - * This is the second line. - */ -myClass.myFunction = function() { -} - -dfx.getIframeDocument = function(iframe) -{ - return doc; - -};//end dfx.getIframeDocument() - -mig.Gallery.prototype = { - - init: function(cb) - { - - },//end init() - - imageClicked: function(id) - { - - }//end imageClicked() - -}; - -// Here is some inline example code: -// -> One -// -> One.One -// -> Two - -/* - Here is some inline example code: - -> One - -> One.One - -> Two -*/ - - -var foo = 'foo'; // Var set to foo. - -console.info(foo); - -// Comment here. -console.info(foo); - -//** -* invalid comment -*/ - -// some comment without capital or full stop -console.log(foo); // An unrelated comment. - -// An unrelated comment. -console.log(foo); // some comment without capital or full stop diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.js.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.js.fixed deleted file mode 100644 index 20e5041..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.js.fixed +++ /dev/null @@ -1,125 +0,0 @@ -// Some content here. -var code = 'hello'; - -// This comment contains # multiple -// hash signs (#). -code = 'hello'; - -/** - * This is the first line of a function comment. - * This is the second line. - */ -function testFunction() -{ - // Callback methods which are added by external objects. - this.callbacks = {}; - -}//end testFunction() - -/** - * This is the first line of a class comment. - * This is the second line. - */ -myClass.prototype = { - - /** - * This is the first line of a method comment. - * This is the second line. - */ - load: function(url, callback) - { - // Some code here. - } -}; - -// some code goes here! -/* - A longer comment goes here. - It spans multiple lines!! - Or does it? -*/ - -// 0This is a simple multi-line -// comment! -code = 'hello'; - -// This is not valid. -code = 'hello'; - -// Neither is this! -code = 'hello'; - -code = 'hello'; - -/** Neither is this! **/ -code = 'hello'; - -/** - * This is the first line of a function comment. - * This is the second line. - */ -var myFunction = function() { -} - -/** - * This is the first line of a function comment. - * This is the second line. - */ -myFunction = function() { -} - -/** - * This is the first line of a function comment. - * This is the second line. - */ -myClass.myFunction = function() { -} - -dfx.getIframeDocument = function(iframe) -{ - return doc; - -};//end dfx.getIframeDocument() - -mig.Gallery.prototype = { - - init: function(cb) - { - - },//end init() - - imageClicked: function(id) - { - - }//end imageClicked() - -}; - -// Here is some inline example code: -// -> One -// -> One.One -// -> Two -/* - Here is some inline example code: - -> One - -> One.One - -> Two -*/ - - -var foo = 'foo'; // Var set to foo. - -console.info(foo); - -// Comment here. -console.info(foo); - -// ** -* invalid comment -*/ - -// some comment without capital or full stop -console.log(foo); // An unrelated comment. - -// An unrelated comment. -console.log(foo); // some comment without capital or full stop diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.php deleted file mode 100644 index 7ab73a3..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/InlineCommentUnitTest.php +++ /dev/null @@ -1,97 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Commenting; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the InlineComment sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting\InlineCommentSniff - */ -final class InlineCommentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'InlineCommentUnitTest.inc': - $errors = [ - 17 => 1, - 27 => 1, - 28 => 1, - 32 => 2, - 36 => 1, - 44 => 2, - 58 => 1, - 61 => 1, - 64 => 1, - 67 => 1, - 95 => 1, - 96 => 1, - 97 => 3, - 118 => 1, - 126 => 2, - 130 => 2, - 149 => 1, - 189 => 1, - ]; - - return $errors; - case 'InlineCommentUnitTest.js': - return [ - 31 => 1, - 36 => 2, - 48 => 1, - 51 => 1, - 54 => 1, - 57 => 1, - 102 => 1, - 103 => 1, - 104 => 3, - 118 => 1, - 121 => 1, - 125 => 2, - 129 => 2, - ]; - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/LongConditionClosingCommentUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/LongConditionClosingCommentUnitTest.inc deleted file mode 100644 index d6c4cf6..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/LongConditionClosingCommentUnitTest.inc +++ /dev/null @@ -1,1033 +0,0 @@ - match ($foo) { - // Line 1 - // Line 2 - // Line 3 - // Line 4 - // Line 5 - // Line 6 - // Line 7 - // Line 8 - // Line 9 - // Line 10 - // Line 11 - // Line 12 - // Line 13 - // Line 14 - // Line 15 - // Line 16 - // Line 17 - // Line 18 - // Line 19 - // Line 20 - }, -]; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/LongConditionClosingCommentUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/LongConditionClosingCommentUnitTest.inc.fixed deleted file mode 100644 index 176cfe2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/LongConditionClosingCommentUnitTest.inc.fixed +++ /dev/null @@ -1,1033 +0,0 @@ - match ($foo) { - // Line 1 - // Line 2 - // Line 3 - // Line 4 - // Line 5 - // Line 6 - // Line 7 - // Line 8 - // Line 9 - // Line 10 - // Line 11 - // Line 12 - // Line 13 - // Line 14 - // Line 15 - // Line 16 - // Line 17 - // Line 18 - // Line 19 - // Line 20 - },//end match -]; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/LongConditionClosingCommentUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/LongConditionClosingCommentUnitTest.js deleted file mode 100644 index c0cf282..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/LongConditionClosingCommentUnitTest.js +++ /dev/null @@ -1,444 +0,0 @@ -function long_function() -{ - if (longFunction) { - // This is a long - // IF statement - // that does - // not have - // an ELSE - // block on it - variable = 'hello'; - - if (variable === 'hello') { - // This is a short - // IF statement - } - - if (variable === 'hello') { - // This is a short - // IF statement - } else { - // This is a short ELSE - // statement - } - }//end if - - if (longFunction) { - // This is a long - // IF statement - // that does - // not have - // an ELSE - // block on it - variable = 'hello'; - - if (variable === 'hello') { - // This is a short - // IF statement - } - - if (variable === 'hello') { - // This is a short - // IF statement - } else { - // This is a short ELSE - // statement - } - } - - if (longFunction) { - // This is a long - // IF statement - // that does - // not have - // an ELSE - // block on it - variable = 'hello'; - - if (variable === 'hello') { - // This is a short - // IF statement - } - - if (variable === 'hello') { - // This is a short - // IF statement - } else { - // This is a short ELSE - // statement - } - } else { - // Short ELSE - }//end if - - if (longFunction) { - // This is a long - // IF statement - // that does - // not have - // an ELSE - // block on it - variable = 'hello'; - - if (variable === 'hello') { - // This is a short - // IF statement - } - - if (variable === 'hello') { - // This is a short - // IF statement - } else { - // This is a short ELSE - // statement - } - } else { - // Short ELSE - } -} - -for (variable=1; variable < 20; variable++) { - // Line 1 - // Line 2 - // Line 3 - // Line 4 - // Line 5 - // Line 6 - // Line 7 - // Line 8 - // Line 9 - // Line 10 - // Line 11 - // Line 12 - // Line 13 - // Line 14 - // Line 15 - // Line 16 - // Line 17 - // Line 18 - // Line 19 - // Line 20 -}//end for - -for (variable=1; variable < 20; variable++) { - // Line 1 - // Line 2 - // Line 3 - // Line 4 - // Line 5 - // Line 6 - // Line 7 - // Line 8 - // Line 9 - for (val =1; val < 20; val++) { - // Short for. - } - // Line 13 - // Line 14 - // Line 15 - // Line 16 - // Line 17 - // Line 18 - // Line 19 - // Line 20 -} - -while (variable < 20) { - // Line 1 - // Line 2 - // Line 3 - // Line 4 - // Line 5 - // Line 6 - // Line 7 - // Line 8 - // Line 9 - // Line 10 - // Line 11 - // Line 12 - // Line 13 - // Line 14 - // Line 15 - // Line 16 - // Line 17 - // Line 18 - // Line 19 - // Line 20 -}//end while - -while (variable < 20) { - // Line 1 - // Line 2 - // Line 3 - // Line 4 - // Line 5 - // Line 6 - // Line 7 - // Line 8 - // Line 9 - while (something) { - // Short while. - } - // Line 13 - // Line 14 - // Line 15 - // Line 16 - // Line 17 - // Line 18 - // Line 19 - // Line 20 -} - -if (longFunction) { - // This is a long - // IF statement - // that does - // not have - // an ELSE - // block on it - variable = 'hello'; - - if (variable === 'hello') { - // This is a short - // IF statement - } - - if (variable === 'hello') { - // This is a short - // IF statement - } else { - // This is a short ELSE - // statement - } -} //end if - -if (longFunction) { - // This is a long - // IF statement - // that does - // not have - // an ELSE - // block on it - variable = 'hello'; - - if (variable === 'hello') { - // This is a short - // IF statement - } - - if (variable === 'hello') { - // This is a short - // IF statement - } else { - // This is a short ELSE - // statement - } -} else { - // Short ELSE -} //end if - -for (variable=1; variable < 20; variable++) { - // Line 1 - // Line 2 - // Line 3 - // Line 4 - // Line 5 - // Line 6 - // Line 7 - // Line 8 - // Line 9 - // Line 10 - // Line 11 - // Line 12 - // Line 13 - // Line 14 - // Line 15 - // Line 16 - // Line 17 - // Line 18 - // Line 19 - // Line 20 -} //end for - -while (variable < 20) { - // Line 1 - // Line 2 - // Line 3 - // Line 4 - // Line 5 - // Line 6 - // Line 7 - // Line 8 - // Line 9 - // Line 10 - // Line 11 - // Line 12 - // Line 13 - // Line 14 - // Line 15 - // Line 16 - // Line 17 - // Line 18 - // Line 19 - // Line 20 -} //end while - -while (variable < 20) { - // Line 1 - // Line 2 - // Line 3 - // Line 4 - // Line 5 - // Line 6 - // Line 7 - // Line 8 - // Line 9 - // Line 10 - // Line 11 - // Line 12 - // Line 13 - // Line 14 - // Line 15 - // Line 16 - // Line 17 - // Line 18 - // Line 19 - // Line 20 -}//end for - -if (true) { - // Line 1 - // Line 2 - // Line 3 - // Line 4 - // Line 5 - // Line 6 - // Line 7 - // Line 8 - // Line 9 - // Line 10 - // Line 11 - // Line 12 - // Line 13 - // Line 14 - // Line 15 - // Line 16 - // Line 17 - // Line 18 - // Line 19 - // Line 20 -} else if (condition) { - // Line 1 - // Line 2 - // Line 3 - // Line 4 - // Line 5 - // Line 6 - // Line 7 - // Line 8 - // Line 9 - // Line 10 - // Line 11 - // Line 12 - // Line 13 - // Line 14 - // Line 15 - // Line 16 - // Line 17 - // Line 18 - // Line 19 - // Line 20 -} else { - // Line 1 - // Line 2 - // Line 3 - // Line 4 - // Line 5 - // Line 6 - // Line 7 - // Line 8 - // Line 9 - // Line 10 - // Line 11 - // Line 12 - // Line 13 - // Line 14 - // Line 15 - // Line 16 - // Line 17 - // Line 18 - // Line 19 - // Line 20 -}//end if - -if (something) { - // Line 1 - // Line 2 -} else if (somethingElse) { - // Line 1 - // Line 2 -} else { - // Line 1 - // Line 2 - // Line 3 - // Line 4 - // Line 5 - // Line 6 - // Line 7 - // Line 8 - // Line 9 - // Line 10 - // Line 11 - // Line 12 - // Line 13 - // Line 14 - // Line 15 - // Line 16 - // Line 17 - // Line 18 - // Line 19 - // Line 20 -} - -switch (something) { - case '1': - // Line 1 - // Line 2 - // Line 3 - // Line 4 - // Line 5 - break; - case '2': - // Line 1 - // Line 2 - // Line 3 - // Line 4 - // Line 5 - break; - case '3': - // Line 1 - // Line 2 - // Line 3 - // Line 4 - // Line 5 - break; - case '4': - // Line 1 - // Line 2 - // Line 3 - // Line 4 - // Line 5 - break; - case '5': - // Line 1 - // Line 2 - // Line 3 - // Line 4 - // Line 5 - break; -} - -// Wrong comment -if (condition) { - condition = true; -}//end foreach diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/LongConditionClosingCommentUnitTest.js.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/LongConditionClosingCommentUnitTest.js.fixed deleted file mode 100644 index 231b51c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/LongConditionClosingCommentUnitTest.js.fixed +++ /dev/null @@ -1,444 +0,0 @@ -function long_function() -{ - if (longFunction) { - // This is a long - // IF statement - // that does - // not have - // an ELSE - // block on it - variable = 'hello'; - - if (variable === 'hello') { - // This is a short - // IF statement - } - - if (variable === 'hello') { - // This is a short - // IF statement - } else { - // This is a short ELSE - // statement - } - }//end if - - if (longFunction) { - // This is a long - // IF statement - // that does - // not have - // an ELSE - // block on it - variable = 'hello'; - - if (variable === 'hello') { - // This is a short - // IF statement - } - - if (variable === 'hello') { - // This is a short - // IF statement - } else { - // This is a short ELSE - // statement - } - }//end if - - if (longFunction) { - // This is a long - // IF statement - // that does - // not have - // an ELSE - // block on it - variable = 'hello'; - - if (variable === 'hello') { - // This is a short - // IF statement - } - - if (variable === 'hello') { - // This is a short - // IF statement - } else { - // This is a short ELSE - // statement - } - } else { - // Short ELSE - }//end if - - if (longFunction) { - // This is a long - // IF statement - // that does - // not have - // an ELSE - // block on it - variable = 'hello'; - - if (variable === 'hello') { - // This is a short - // IF statement - } - - if (variable === 'hello') { - // This is a short - // IF statement - } else { - // This is a short ELSE - // statement - } - } else { - // Short ELSE - }//end if -} - -for (variable=1; variable < 20; variable++) { - // Line 1 - // Line 2 - // Line 3 - // Line 4 - // Line 5 - // Line 6 - // Line 7 - // Line 8 - // Line 9 - // Line 10 - // Line 11 - // Line 12 - // Line 13 - // Line 14 - // Line 15 - // Line 16 - // Line 17 - // Line 18 - // Line 19 - // Line 20 -}//end for - -for (variable=1; variable < 20; variable++) { - // Line 1 - // Line 2 - // Line 3 - // Line 4 - // Line 5 - // Line 6 - // Line 7 - // Line 8 - // Line 9 - for (val =1; val < 20; val++) { - // Short for. - } - // Line 13 - // Line 14 - // Line 15 - // Line 16 - // Line 17 - // Line 18 - // Line 19 - // Line 20 -}//end for - -while (variable < 20) { - // Line 1 - // Line 2 - // Line 3 - // Line 4 - // Line 5 - // Line 6 - // Line 7 - // Line 8 - // Line 9 - // Line 10 - // Line 11 - // Line 12 - // Line 13 - // Line 14 - // Line 15 - // Line 16 - // Line 17 - // Line 18 - // Line 19 - // Line 20 -}//end while - -while (variable < 20) { - // Line 1 - // Line 2 - // Line 3 - // Line 4 - // Line 5 - // Line 6 - // Line 7 - // Line 8 - // Line 9 - while (something) { - // Short while. - } - // Line 13 - // Line 14 - // Line 15 - // Line 16 - // Line 17 - // Line 18 - // Line 19 - // Line 20 -}//end while - -if (longFunction) { - // This is a long - // IF statement - // that does - // not have - // an ELSE - // block on it - variable = 'hello'; - - if (variable === 'hello') { - // This is a short - // IF statement - } - - if (variable === 'hello') { - // This is a short - // IF statement - } else { - // This is a short ELSE - // statement - } -} //end if - -if (longFunction) { - // This is a long - // IF statement - // that does - // not have - // an ELSE - // block on it - variable = 'hello'; - - if (variable === 'hello') { - // This is a short - // IF statement - } - - if (variable === 'hello') { - // This is a short - // IF statement - } else { - // This is a short ELSE - // statement - } -} else { - // Short ELSE -} //end if - -for (variable=1; variable < 20; variable++) { - // Line 1 - // Line 2 - // Line 3 - // Line 4 - // Line 5 - // Line 6 - // Line 7 - // Line 8 - // Line 9 - // Line 10 - // Line 11 - // Line 12 - // Line 13 - // Line 14 - // Line 15 - // Line 16 - // Line 17 - // Line 18 - // Line 19 - // Line 20 -} //end for - -while (variable < 20) { - // Line 1 - // Line 2 - // Line 3 - // Line 4 - // Line 5 - // Line 6 - // Line 7 - // Line 8 - // Line 9 - // Line 10 - // Line 11 - // Line 12 - // Line 13 - // Line 14 - // Line 15 - // Line 16 - // Line 17 - // Line 18 - // Line 19 - // Line 20 -} //end while - -while (variable < 20) { - // Line 1 - // Line 2 - // Line 3 - // Line 4 - // Line 5 - // Line 6 - // Line 7 - // Line 8 - // Line 9 - // Line 10 - // Line 11 - // Line 12 - // Line 13 - // Line 14 - // Line 15 - // Line 16 - // Line 17 - // Line 18 - // Line 19 - // Line 20 -}//end while - -if (true) { - // Line 1 - // Line 2 - // Line 3 - // Line 4 - // Line 5 - // Line 6 - // Line 7 - // Line 8 - // Line 9 - // Line 10 - // Line 11 - // Line 12 - // Line 13 - // Line 14 - // Line 15 - // Line 16 - // Line 17 - // Line 18 - // Line 19 - // Line 20 -} else if (condition) { - // Line 1 - // Line 2 - // Line 3 - // Line 4 - // Line 5 - // Line 6 - // Line 7 - // Line 8 - // Line 9 - // Line 10 - // Line 11 - // Line 12 - // Line 13 - // Line 14 - // Line 15 - // Line 16 - // Line 17 - // Line 18 - // Line 19 - // Line 20 -} else { - // Line 1 - // Line 2 - // Line 3 - // Line 4 - // Line 5 - // Line 6 - // Line 7 - // Line 8 - // Line 9 - // Line 10 - // Line 11 - // Line 12 - // Line 13 - // Line 14 - // Line 15 - // Line 16 - // Line 17 - // Line 18 - // Line 19 - // Line 20 -}//end if - -if (something) { - // Line 1 - // Line 2 -} else if (somethingElse) { - // Line 1 - // Line 2 -} else { - // Line 1 - // Line 2 - // Line 3 - // Line 4 - // Line 5 - // Line 6 - // Line 7 - // Line 8 - // Line 9 - // Line 10 - // Line 11 - // Line 12 - // Line 13 - // Line 14 - // Line 15 - // Line 16 - // Line 17 - // Line 18 - // Line 19 - // Line 20 -}//end if - -switch (something) { - case '1': - // Line 1 - // Line 2 - // Line 3 - // Line 4 - // Line 5 - break; - case '2': - // Line 1 - // Line 2 - // Line 3 - // Line 4 - // Line 5 - break; - case '3': - // Line 1 - // Line 2 - // Line 3 - // Line 4 - // Line 5 - break; - case '4': - // Line 1 - // Line 2 - // Line 3 - // Line 4 - // Line 5 - break; - case '5': - // Line 1 - // Line 2 - // Line 3 - // Line 4 - // Line 5 - break; -}//end switch - -// Wrong comment -if (condition) { - condition = true; -}//end if diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/LongConditionClosingCommentUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/LongConditionClosingCommentUnitTest.php deleted file mode 100644 index 0660fbf..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/LongConditionClosingCommentUnitTest.php +++ /dev/null @@ -1,107 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Commenting; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the LongConditionClosingComment sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting\LongConditionClosingCommentSniff - */ -final class LongConditionClosingCommentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'LongConditionClosingCommentUnitTest.inc': - return [ - 49 => 1, - 99 => 1, - 146 => 1, - 192 => 1, - 215 => 1, - 238 => 1, - 261 => 1, - 286 => 1, - 309 => 1, - 332 => 1, - 355 => 1, - 378 => 1, - 493 => 1, - 531 => 1, - 536 => 1, - 540 => 1, - 562 => 1, - 601 => 1, - 629 => 1, - 663 => 1, - 765 => 1, - 798 => 1, - 811 => 1, - 897 => 1, - 931 => 1, - 962 => 1, - 985 => 2, - 1008 => 1, - 1032 => 1, - ]; - - case 'LongConditionClosingCommentUnitTest.js': - return [ - 47 => 1, - 97 => 1, - 144 => 1, - 190 => 1, - 213 => 1, - 238 => 1, - 261 => 1, - 284 => 1, - 307 => 1, - 401 => 1, - 439 => 1, - 444 => 1, - ]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.1.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.1.js deleted file mode 100644 index 6de6421..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.1.js +++ /dev/null @@ -1,36 +0,0 @@ -function test(id, buttons) // cool function -{ - alert('hello'); - alert('hello again'); // And again. - // Valid comment. - -}//end test() - -var good = true; // Indeed. - -mig.Gallery.prototype = { - - init: function(cb) - { - - },//end init() - - imageClicked: function(id) - { - - }//end imageClicked() - -}; - -dfx.getIframeDocument = function(iframe) -{ - - return doc; - -};//end dfx.getIframeDocument() - -// Verify that multi-line control structure with comments and annotations are left alone. -if (condition // comment - && anotherCondition) { - condition = true; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.1.js.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.1.js.fixed deleted file mode 100644 index 1953760..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.1.js.fixed +++ /dev/null @@ -1,39 +0,0 @@ -function test(id, buttons) -// cool function -{ - alert('hello'); - alert('hello again'); -// And again. - // Valid comment. - -}//end test() - -var good = true; -// Indeed. - -mig.Gallery.prototype = { - - init: function(cb) - { - - },//end init() - - imageClicked: function(id) - { - - }//end imageClicked() - -}; - -dfx.getIframeDocument = function(iframe) -{ - - return doc; - -};//end dfx.getIframeDocument() - -// Verify that multi-line control structure with comments and annotations are left alone. -if (condition // comment - && anotherCondition) { - condition = true; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.2.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.2.js deleted file mode 100644 index 88d0e7d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.2.js +++ /dev/null @@ -1,2 +0,0 @@ -// Comment as first thing in a JS file. -var i = 100; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.inc deleted file mode 100644 index 3374c47..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.inc +++ /dev/null @@ -1,64 +0,0 @@ - function($b) { - }, // comment. - 'key' => 'value', // phpcs:ignore Standard.Category.SniffName -- for reasons. - 'key' => 'value', // comment. -]; - -// Verify that multi-line control structure with comments and annotations are left alone. -for ( - $i = 0; /* Start */ - $i < 10; /* phpcs:ignore Standard.Category.SniffName -- for reasons. */ - $i++ // comment - -) {} - -if ( $condition === true // comment - && $anotherCondition === false -) {} - -$match = match($foo // comment - && $bar -) { - 1 => 1, // comment -}; - -// Issue #560: Annotations should be reported separately and be non-auto-fixable as their meaning may change when moved. -$a = 1; //@codeCoverageIgnore -$b = 2; // @phpstan-ignore variable.undefined -$c = 3; // @phpstan-ignore variable.undefined -$d = 4; // @tabInsteadOfSpace - -// Comments that include `@`, but are not recognized as annotations by this sniff. -$a = 1; // @ = add tag. -$b = 2; // Some comment. // @username diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.inc.fixed deleted file mode 100644 index bd6b171..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.inc.fixed +++ /dev/null @@ -1,71 +0,0 @@ - function($b) { - }, // comment. - 'key' => 'value', // phpcs:ignore Standard.Category.SniffName -- for reasons. - 'key' => 'value', -// comment. -]; - -// Verify that multi-line control structure with comments and annotations are left alone. -for ( - $i = 0; /* Start */ - $i < 10; /* phpcs:ignore Standard.Category.SniffName -- for reasons. */ - $i++ // comment - -) {} - -if ( $condition === true // comment - && $anotherCondition === false -) {} - -$match = match($foo // comment - && $bar -) { - 1 => 1, -// comment -}; - -// Issue #560: Annotations should be reported separately and be non-auto-fixable as their meaning may change when moved. -$a = 1; //@codeCoverageIgnore -$b = 2; // @phpstan-ignore variable.undefined -$c = 3; // @phpstan-ignore variable.undefined -$d = 4; // @tabInsteadOfSpace - -// Comments that include `@`, but are not recognized as annotations by this sniff. -$a = 1; -// @ = add tag. -$b = 2; -// Some comment. // @username diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.php deleted file mode 100644 index 8541cf8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/PostStatementCommentUnitTest.php +++ /dev/null @@ -1,80 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Commenting; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the PostStatementComment sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting\PostStatementCommentSniff - */ -final class PostStatementCommentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'PostStatementCommentUnitTest.inc': - return [ - 6 => 1, - 10 => 1, - 18 => 1, - 35 => 1, - 53 => 1, - 57 => 1, - 58 => 1, - 59 => 1, - 60 => 1, - 63 => 1, - 64 => 1, - ]; - - case 'PostStatementCommentUnitTest.1.js': - return [ - 1 => 1, - 4 => 1, - 9 => 1, - ]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/VariableCommentUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/VariableCommentUnitTest.inc deleted file mode 100644 index 87f8b56..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/VariableCommentUnitTest.inc +++ /dev/null @@ -1,495 +0,0 @@ - $content) { - echo $content; - } - - return $var1; - - }//end checkVariable() - - - /** - * - * - */ - $emptyVarDoc = ''; - - /** - * Var type checking (int v.s. integer). - * - * @var int - */ - private $_varSimpleTypeCheck; - - - /** - * Var type checking (array(int => string) v.s. array(int => string)). - * - * @var array(int => string) - */ - private $_varArrayTypeCheck; - - - /** - * Boolean @var tag Capitalized - * - * @var Boolean - */ - public $CapBoolTag = true; - - - /** - * Boolean @var tag Capitalized - * - * @var BOOLEAN - */ - public $CapBoolTag2 = true; - - - /** - * Double @var tag Capitalized - * - * @var Double - */ - public $CapDoubleTag = 1; - - - /** - * Double @var tag Capitalized - * - * @var DOUBLE - */ - public $CapDoubleTag2 = 1; - - - /** - * Real @var tag Capitalized - * - * @var Real - */ - public $CapRealTag = 1; - - - /** - * Real @var tag Capitalized - * - * @var REAL - */ - public $CapRealTag2 = 1; - - - /** - * Float @var tag Capitalized - * - * @var Float - */ - public $CapFloatTag = 1; - - - /** - * Float @var tag Capitalized - * - * @var FLOAT - */ - public $CapFloatTag2 = 1; - - - /** - * Int @var tag Capitalized - * - * @var Int - */ - public $CapIntTag = 1; - - - /** - * Int @var tag Capitalized - * - * @var INT - */ - public $CapIntTag2 = 1; - - - /** - * Integer @var tag Capitalized - * - * @var Integer - */ - public $CapIntTag3 = 1; - - - /** - * Integer @var tag Capitalized - * - * @var INTEGER - */ - public $CapIntTag4 = 1; - - - /** - * Array @var tag Capitalized - * - * @var Array - */ - public $CapVarTag = []; - - - /** - * Array @var tag All Caps - * - * @var ARRAY - */ - public $CapVarTag2 = []; - - - /** - * Array @var tag Capitalized - * - * @var Array() - */ - public $CapVarTag3 = []; - - - /** - * Array @var tag All Caps - * - * @var ARRAY() - */ - public $CapVarTag4 = []; - - - /** - * Var type checking (STRING v.s. string). - * - * @var STRING - */ - private $_varCaseTypeCheck; - - - /** - * @var integer - */ - private $_varWithNoShortComment; - - protected $noComment2 = ''; - - - /** - * @var int Var type checking (int v.s. integer) with single-line comment. - */ - private $_varSimpleTypeCheckSingleLine; - - -}//end class - - -/** - * VariableCommentUnitTest2. - * - * Long description goes here. - * - */ -class VariableCommentUnitTest2 -{ - - public $hello; - - /** Comment starts here. - * - * @var string - * - */ - private $_varCaseTypeCheck; - - /** - * 这是一条测试评论. - * - * @var string - */ - public $foo; - -}//end class - - -/* - * Class comment - */ -class Foo -{ - - protected $bar; - - /** - * Short description of the member variable. - * - * @var array - */ - public static array $variableName = array(); - -} - -class Foo -{ - - /** - * Short description of the member variable. - * - * @var array - */ - public array $variableName = array(); - - - // Not "/**" style comment. - // - // @var string - private ?Folder\ClassName $_incorrectCommentStyle = null; - - - var int $noComment = 1; - } - -class HasAttributes -{ - /** - * Short description of the member variable. - * - * @var array - */ - #[ORM\Id]#[ORM\Column("integer")] - private $id; - - /** - * Short description of the member variable. - * - * @var array - */ - #[ORM\GeneratedValue] - #[ORM\Column(ORM\Column::T_INTEGER)] - protected $height; -} - -class ReadOnlyProps -{ - /** - * Short description of the member variable. - * - * @var array - */ - public readonly array $variableName = array(); - - /** - * Short description of the member variable. - * - * @var - */ - readonly protected ?int $variableName = 10; - - private readonly string $variable; -} - -class UnionTypes -{ - /** - * @var array|boolean - */ - private array|bool $variableName = array(); -} - -class IntersectionTypes -{ - /** - * @var \Iterator|\Countable - */ - private \Iterator&\Countable $variableName; -} - -class StandaloneNullTrueFalseTypes -{ - /** - * @var null - */ - public null $variableName = null; - - /** - * @var true - */ - protected true $variableName = true; - - /** - * @var false - */ - private false $variableName = false; -} - -class MoreMissingButSupportedTypes -{ - /** - * @var parent - */ - public parent $variableName; - - /** - * @var self - */ - protected self $variableName; - - /** - * @var SomeClass - */ - private namespace\SomeClass $variableName; -} - -class DNFTypes -{ - /** - * @var mixed - */ - private (\Iterator&namespace\Countable)|false|null $variableName; -} - -class PHP84FinalProperties { - /** - * @var integer - */ - final int $hasDocblock; -} - -class AsymVisibility { - /** - * @var integer - */ - public(set) int $hasDocblockA; - - /** - * @var integer - */ - public protected(set) int $hasDocblockB; - - /** - * @var integer - */ - private(set) protected int $hasDocblockC; -} - -abstract class PHP84AbstractProperties { - /** - * @var Type - */ - abstract Type $hasDocblock {get;} -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/VariableCommentUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/VariableCommentUnitTest.inc.fixed deleted file mode 100644 index 5c9e263..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/VariableCommentUnitTest.inc.fixed +++ /dev/null @@ -1,495 +0,0 @@ - $content) { - echo $content; - } - - return $var1; - - }//end checkVariable() - - - /** - * - * - */ - $emptyVarDoc = ''; - - /** - * Var type checking (int v.s. integer). - * - * @var integer - */ - private $_varSimpleTypeCheck; - - - /** - * Var type checking (array(int => string) v.s. array(int => string)). - * - * @var array(integer => string) - */ - private $_varArrayTypeCheck; - - - /** - * Boolean @var tag Capitalized - * - * @var boolean - */ - public $CapBoolTag = true; - - - /** - * Boolean @var tag Capitalized - * - * @var boolean - */ - public $CapBoolTag2 = true; - - - /** - * Double @var tag Capitalized - * - * @var float - */ - public $CapDoubleTag = 1; - - - /** - * Double @var tag Capitalized - * - * @var float - */ - public $CapDoubleTag2 = 1; - - - /** - * Real @var tag Capitalized - * - * @var float - */ - public $CapRealTag = 1; - - - /** - * Real @var tag Capitalized - * - * @var float - */ - public $CapRealTag2 = 1; - - - /** - * Float @var tag Capitalized - * - * @var float - */ - public $CapFloatTag = 1; - - - /** - * Float @var tag Capitalized - * - * @var float - */ - public $CapFloatTag2 = 1; - - - /** - * Int @var tag Capitalized - * - * @var integer - */ - public $CapIntTag = 1; - - - /** - * Int @var tag Capitalized - * - * @var integer - */ - public $CapIntTag2 = 1; - - - /** - * Integer @var tag Capitalized - * - * @var integer - */ - public $CapIntTag3 = 1; - - - /** - * Integer @var tag Capitalized - * - * @var integer - */ - public $CapIntTag4 = 1; - - - /** - * Array @var tag Capitalized - * - * @var array - */ - public $CapVarTag = []; - - - /** - * Array @var tag All Caps - * - * @var array - */ - public $CapVarTag2 = []; - - - /** - * Array @var tag Capitalized - * - * @var array - */ - public $CapVarTag3 = []; - - - /** - * Array @var tag All Caps - * - * @var array - */ - public $CapVarTag4 = []; - - - /** - * Var type checking (STRING v.s. string). - * - * @var string - */ - private $_varCaseTypeCheck; - - - /** - * @var integer - */ - private $_varWithNoShortComment; - - protected $noComment2 = ''; - - - /** - * @var integer Var type checking (int v.s. integer) with single-line comment. - */ - private $_varSimpleTypeCheckSingleLine; - - -}//end class - - -/** - * VariableCommentUnitTest2. - * - * Long description goes here. - * - */ -class VariableCommentUnitTest2 -{ - - public $hello; - - /** Comment starts here. - * - * @var string - * - */ - private $_varCaseTypeCheck; - - /** - * 这是一条测试评论. - * - * @var string - */ - public $foo; - -}//end class - - -/* - * Class comment - */ -class Foo -{ - - protected $bar; - - /** - * Short description of the member variable. - * - * @var array - */ - public static array $variableName = array(); - -} - -class Foo -{ - - /** - * Short description of the member variable. - * - * @var array - */ - public array $variableName = array(); - - - // Not "/**" style comment. - // - // @var string - private ?Folder\ClassName $_incorrectCommentStyle = null; - - - var int $noComment = 1; - } - -class HasAttributes -{ - /** - * Short description of the member variable. - * - * @var array - */ - #[ORM\Id]#[ORM\Column("integer")] - private $id; - - /** - * Short description of the member variable. - * - * @var array - */ - #[ORM\GeneratedValue] - #[ORM\Column(ORM\Column::T_INTEGER)] - protected $height; -} - -class ReadOnlyProps -{ - /** - * Short description of the member variable. - * - * @var array - */ - public readonly array $variableName = array(); - - /** - * Short description of the member variable. - * - * @var - */ - readonly protected ?int $variableName = 10; - - private readonly string $variable; -} - -class UnionTypes -{ - /** - * @var array|boolean - */ - private array|bool $variableName = array(); -} - -class IntersectionTypes -{ - /** - * @var \Iterator|\Countable - */ - private \Iterator&\Countable $variableName; -} - -class StandaloneNullTrueFalseTypes -{ - /** - * @var null - */ - public null $variableName = null; - - /** - * @var true - */ - protected true $variableName = true; - - /** - * @var false - */ - private false $variableName = false; -} - -class MoreMissingButSupportedTypes -{ - /** - * @var parent - */ - public parent $variableName; - - /** - * @var self - */ - protected self $variableName; - - /** - * @var SomeClass - */ - private namespace\SomeClass $variableName; -} - -class DNFTypes -{ - /** - * @var mixed - */ - private (\Iterator&namespace\Countable)|false|null $variableName; -} - -class PHP84FinalProperties { - /** - * @var integer - */ - final int $hasDocblock; -} - -class AsymVisibility { - /** - * @var integer - */ - public(set) int $hasDocblockA; - - /** - * @var integer - */ - public protected(set) int $hasDocblockB; - - /** - * @var integer - */ - private(set) protected int $hasDocblockC; -} - -abstract class PHP84AbstractProperties { - /** - * @var Type - */ - abstract Type $hasDocblock {get;} -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/VariableCommentUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/VariableCommentUnitTest.php deleted file mode 100644 index 34e1c9d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Commenting/VariableCommentUnitTest.php +++ /dev/null @@ -1,88 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Commenting; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the VariableComment sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Commenting\VariableCommentSniff - */ -final class VariableCommentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 21 => 1, - 24 => 1, - 56 => 1, - 64 => 1, - 73 => 1, - 84 => 1, - 130 => 1, - 136 => 1, - 144 => 1, - 152 => 1, - 160 => 1, - 168 => 1, - 176 => 1, - 184 => 1, - 192 => 1, - 200 => 1, - 208 => 1, - 216 => 1, - 224 => 1, - 232 => 1, - 240 => 1, - 248 => 1, - 256 => 1, - 264 => 1, - 272 => 1, - 280 => 1, - 290 => 1, - 294 => 1, - 311 => 1, - 336 => 1, - 361 => 1, - 364 => 1, - 399 => 1, - 403 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [93 => 1]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ControlSignatureUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ControlSignatureUnitTest.1.inc deleted file mode 100644 index de0235c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ControlSignatureUnitTest.1.inc +++ /dev/null @@ -1,320 +0,0 @@ - 0); - -do -{ - echo $i; -} while ($i > 0); - -do -{ - echo $i; -} -while ($i > 0); - -do { echo $i; } while ($i > 0); - -do{ - echo $i; -}while($i > 0); - -while ($i < 1) { - echo $i; -} - -while($i < 1){ - echo $i; -} - -while ($i < 1) { echo $i; } - -for ($i = 1; $i < 1; $i++) { - echo $i; -} - -for($i = 1; $i < 1; $i++){ - echo $i; -} - -for ($i = 1; $i < 1; $i++) { echo $i; } - -if ($i == 0) { - $i = 1; -} - -if($i == 0){ - $i = 1; -} - -if ($i == 0) { $i = 1; } - -if ($i == 0) { - $i = 1; -} else { - $i = 0; -} - -if ($i == 0) { - $i = 1; -}else{ - $i = 0; -} - -if ($i == 0) { $i = 1; } else { $i = 0; } - -if ($i == 0) { - $i = 1; -} else if ($i == 2) { - $i = 0; -} - -if ($i == 0) { - $i = 1; -}else if($i == 2){ - $i = 0; -} - -if ($i == 0) { $i = 1; } else if ($i == 2) { $i = 0; } - -if ($i == 0) { // comments are allowed - $i = 1; -} - -if ($i == 0) {// comments are allowed - $i = 1; -} - -if ($i == 0) { /* comments are allowed*/ - $i = 1; -} - -if ($i == 0) -{ // this is ok - $i = 1; -} - -if ($i == 0) /* this is ok */ { -} - -try { - $code = 'this'; -} catch (Exception $e) { - // Caught! -} - -try { $code = 'this'; } catch (Exception $e) { - // Caught! -} - -do { echo $i; -} while ($i > 0); - -if ($i === 0) { - - $i = 1 -} - -if ($a) { - -} -elseif ($b) { -} - -foreach ($items as $item) { - echo $item; -} - -foreach($items as $item){ - echo $item; -} - -if ($a && $b) // && $c) -{ -} - -if ($a == 5) : - echo "a equals 5"; - echo "..."; -elseif ($a == 6) : - echo "a equals 6"; - echo "!!!"; -else : - echo "a is neither 5 nor 6"; -endif; - -try { - // try body -} -catch (FirstExceptionType $e) { - // catch body -} -catch (OtherExceptionType $e) { - // catch body -} - -switch($foo) { - - case 'bar': - break; - -} - -if ($foo) : -endif; - -?> - -getRow()): ?> -

    - - - -
    - -
    - - - - - - - hello - - - - hello - - - - -getRow()) : ?> -

    - - - - - - - - hello - - - - hello - - 1, -}; - -$r = match($x){1 => 1}; - -// phpcs:set Squiz.ControlStructures.ControlSignature requiredSpacesBeforeColon 2 -if ($a == 5): - echo "a equals 5"; - echo "..."; -elseif ($a == 6) : - echo "a equals 6"; - echo "!!!"; -else : - echo "a is neither 5 nor 6"; -endif; - -// Reset property. -// phpcs:set Squiz.ControlStructures.ControlSignature requiredSpacesBeforeColon 1 diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ControlSignatureUnitTest.1.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ControlSignatureUnitTest.1.inc.fixed deleted file mode 100644 index 03e6bf2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ControlSignatureUnitTest.1.inc.fixed +++ /dev/null @@ -1,324 +0,0 @@ - 0); - -do { - echo $i; -} while ($i > 0); - -do { - echo $i; -} while ($i > 0); - -do { -echo $i; } while ($i > 0); - -do { - echo $i; -} while ($i > 0); - -while ($i < 1) { - echo $i; -} - -while ($i < 1) { - echo $i; -} - -while ($i < 1) { -echo $i; } - -for ($i = 1; $i < 1; $i++) { - echo $i; -} - -for ($i = 1; $i < 1; $i++) { - echo $i; -} - -for ($i = 1; $i < 1; $i++) { -echo $i; } - -if ($i == 0) { - $i = 1; -} - -if ($i == 0) { - $i = 1; -} - -if ($i == 0) { -$i = 1; } - -if ($i == 0) { - $i = 1; -} else { - $i = 0; -} - -if ($i == 0) { - $i = 1; -} else { - $i = 0; -} - -if ($i == 0) { -$i = 1; } else { -$i = 0; } - -if ($i == 0) { - $i = 1; -} else if ($i == 2) { - $i = 0; -} - -if ($i == 0) { - $i = 1; -} else if ($i == 2) { - $i = 0; -} - -if ($i == 0) { -$i = 1; } else if ($i == 2) { -$i = 0; } - -if ($i == 0) { // comments are allowed - $i = 1; -} - -if ($i == 0) {// comments are allowed - $i = 1; -} - -if ($i == 0) { /* comments are allowed*/ - $i = 1; -} - -if ($i == 0) { // this is ok - $i = 1; -} - -if ($i == 0) { /* this is ok */ -} - -try { - $code = 'this'; -} catch (Exception $e) { - // Caught! -} - -try { -$code = 'this'; } catch (Exception $e) { - // Caught! -} - -do { -echo $i; -} while ($i > 0); - -if ($i === 0) { - - $i = 1 -} - -if ($a) { - -} elseif ($b) { -} - -foreach ($items as $item) { - echo $item; -} - -foreach ($items as $item) { - echo $item; -} - -if ($a && $b) { // && $c) -} - -if ($a == 5) : - echo "a equals 5"; - echo "..."; -elseif ($a == 6) : - echo "a equals 6"; - echo "!!!"; -else : - echo "a is neither 5 nor 6"; -endif; - -try { - // try body -} catch (FirstExceptionType $e) { - // catch body -} catch (OtherExceptionType $e) { - // catch body -} - -switch ($foo) { - - case 'bar': - break; - -} - -if ($foo) : -endif; - -?> - -getRow()) : ?> -

    - - - -
    - -
    - - - - - - - hello - - - - hello - - - - -getRow()): ?> -

    - - - - - - - - hello - - - - hello - - 1, -}; - -$r = match ($x) { -1 => 1}; - -// phpcs:set Squiz.ControlStructures.ControlSignature requiredSpacesBeforeColon 2 -if ($a == 5) : - echo "a equals 5"; - echo "..."; -elseif ($a == 6) : - echo "a equals 6"; - echo "!!!"; -else : - echo "a is neither 5 nor 6"; -endif; - -// Reset property. -// phpcs:set Squiz.ControlStructures.ControlSignature requiredSpacesBeforeColon 1 diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ControlSignatureUnitTest.2.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ControlSignatureUnitTest.2.inc deleted file mode 100644 index ef99b1a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ControlSignatureUnitTest.2.inc +++ /dev/null @@ -1,5 +0,0 @@ - 0); - -do -{ - i = 0; -} while (i > 0); - -do -{ - i = 0; -} -while (i > 0); - -do { i = 0; } while (i > 0); - -do{ - i = 0; -}while(i > 0); - -while (i < 1) { - i = 0; -} - -while(i < 1){ - i = 0; -} - -while (i < 1) { i = 0; } - -for (i = 1; i < 1; i++) { - i = 0; -} - -for(i = 1; i < 1; i++){ - i = 0; -} - -for (i = 1; i < 1; i++) { i = 0; } - -if (i == 0) { - i = 1; -} - -if(i == 0){ - i = 1; -} - -if (i == 0) { i = 1; } - -if (i == 0) { - i = 1; -} else { - i = 0; -} - -if (i == 0) { - i = 1; -}else{ - i = 0; -} - -if (i == 0) { i = 1; } else { i = 0; } - -if (i == 0) { - i = 1; -} else if (i == 2) { - i = 0; -} - -if (i == 0) { - i = 1; -}else if(i == 2){ - i = 0; -} - -if (i == 0) { i = 1; } else if (i == 2) { i = 0; } - -if (i == 0) { // comments are allowed - i = 1; -} - -if (i == 0) {// comments are allowed - i = 1; -} - -if (i == 0) { /* comments are allowed*/ - i = 1; -} - -if (i == 0) -{ // this is ok - i = 1; -} - -if (i == 0) /* this is ok */ { -} - -try { - code = 'this'; -} catch (e) { - // Caught! -} - -try { code = 'this'; } catch (e) { - // Caught! -} - -do { i = 0; -} while (i > 0); - -if (i === 0) { - - i = 1 -} - -if (window.jQuery)(function($) { - $.fn.reset = function() { - return this.each(function() { - try { - this.reset(); - } catch (e) { - } - }); - }; -})(jQuery); - -if ($("#myid").rotationDegrees()=='90') - $('.modal').css({'transform': 'rotate(90deg)'}); - -if ($("#myid").rotationDegrees()=='90') - $foo = {'transform': 'rotate(90deg)'}; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ControlSignatureUnitTest.js.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ControlSignatureUnitTest.js.fixed deleted file mode 100644 index e3ed6de..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ControlSignatureUnitTest.js.fixed +++ /dev/null @@ -1,141 +0,0 @@ - -i = 0; -do { - i = 0; -} while (i > 0); - -do { - i = 0; -} while (i > 0); - -do { - i = 0; -} while (i > 0); - -do { -i = 0; } while (i > 0); - -do { - i = 0; -} while (i > 0); - -while (i < 1) { - i = 0; -} - -while (i < 1) { - i = 0; -} - -while (i < 1) { -i = 0; } - -for (i = 1; i < 1; i++) { - i = 0; -} - -for (i = 1; i < 1; i++) { - i = 0; -} - -for (i = 1; i < 1; i++) { -i = 0; } - -if (i == 0) { - i = 1; -} - -if (i == 0) { - i = 1; -} - -if (i == 0) { -i = 1; } - -if (i == 0) { - i = 1; -} else { - i = 0; -} - -if (i == 0) { - i = 1; -} else { - i = 0; -} - -if (i == 0) { -i = 1; } else { -i = 0; } - -if (i == 0) { - i = 1; -} else if (i == 2) { - i = 0; -} - -if (i == 0) { - i = 1; -} else if (i == 2) { - i = 0; -} - -if (i == 0) { -i = 1; } else if (i == 2) { -i = 0; } - -if (i == 0) { // comments are allowed - i = 1; -} - -if (i == 0) {// comments are allowed - i = 1; -} - -if (i == 0) { /* comments are allowed*/ - i = 1; -} - -if (i == 0) { // this is ok - i = 1; -} - -if (i == 0) { /* this is ok */ -} - -try { - code = 'this'; -} catch (e) { - // Caught! -} - -try { -code = 'this'; } catch (e) { - // Caught! -} - -do { -i = 0; -} while (i > 0); - -if (i === 0) { - - i = 1 -} - -if (window.jQuery)(function($) { - $.fn.reset = function() { - return this.each(function() { - try { - this.reset(); - } catch (e) { - } - }); - }; -})(jQuery); - -if ($("#myid").rotationDegrees()=='90') - $('.modal').css({'transform': 'rotate(90deg)'}); - -if ($("#myid").rotationDegrees()=='90') - $foo = {'transform': 'rotate(90deg)'}; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ControlSignatureUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ControlSignatureUnitTest.php deleted file mode 100644 index c01ddf8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ControlSignatureUnitTest.php +++ /dev/null @@ -1,115 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\ControlStructures; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ControlSignature sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\ControlStructures\ControlSignatureSniff - */ -final class ControlSignatureUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - $errors = [ - 7 => 1, - 12 => 1, - 15 => 1, - 18 => 1, - 20 => 1, - 22 => 2, - 28 => 2, - 32 => 1, - 38 => 2, - 42 => 1, - 48 => 2, - 52 => 1, - 62 => 2, - 66 => 2, - 76 => 4, - 80 => 2, - 94 => 1, - 99 => 1, - 108 => 1, - 112 => 1, - ]; - - switch ($testFile) { - case 'ControlSignatureUnitTest.1.inc': - $errors[122] = 1; - $errors[130] = 2; - $errors[134] = 1; - $errors[150] = 1; - $errors[153] = 1; - $errors[158] = 1; - $errors[165] = 1; - $errors[170] = 2; - $errors[185] = 1; - $errors[190] = 2; - $errors[191] = 2; - $errors[195] = 1; - $errors[227] = 1; - $errors[234] = 1; - $errors[239] = 2; - $errors[243] = 2; - $errors[244] = 2; - $errors[248] = 1; - $errors[259] = 1; - $errors[262] = 1; - $errors[267] = 1; - $errors[269] = 1; - $errors[276] = 1; - $errors[279] = 1; - $errors[283] = 1; - $errors[306] = 3; - $errors[309] = 1; - $errors[315] = 1; - return $errors; - - case 'ControlSignatureUnitTest.js': - return $errors; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ElseIfDeclarationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ElseIfDeclarationUnitTest.inc deleted file mode 100644 index 91d0a23..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ElseIfDeclarationUnitTest.inc +++ /dev/null @@ -1,14 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\ControlStructures; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ElseIfDeclaration sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\ControlStructures\ElseIfDeclarationSniff - */ -final class ElseIfDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 8 => 1, - 13 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForEachLoopDeclarationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForEachLoopDeclarationUnitTest.inc deleted file mode 100644 index 4709923..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForEachLoopDeclarationUnitTest.inc +++ /dev/null @@ -1,36 +0,0 @@ - $that) { -} - -// Invalid. -foreach ( $something as $blah => $that ) { -} - -foreach ($something as $blah => $that) { -} - -foreach ($something as $blah => $that) { -} - -foreach (${something}AS$blah=>$that) { -} - -// The works. -foreach ( $something aS $blah => $that ) { -} - -// phpcs:set Squiz.ControlStructures.ForEachLoopDeclaration requiredSpacesAfterOpen 1 -// phpcs:set Squiz.ControlStructures.ForEachLoopDeclaration requiredSpacesBeforeClose 1 -foreach ($something as $blah => $that) {} -foreach ( $something as $blah => $that ) {} -foreach ( $something as $blah => $that ) {} -// phpcs:set Squiz.ControlStructures.ForEachLoopDeclaration requiredSpacesAfterOpen 0 -// phpcs:set Squiz.ControlStructures.ForEachLoopDeclaration requiredSpacesBeforeClose 0 - -foreach ([ - 'foo' => 'bar', - 'foobaz' => 'bazzy', - ] as $key => $value) { -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForEachLoopDeclarationUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForEachLoopDeclarationUnitTest.inc.fixed deleted file mode 100644 index b0de6eb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForEachLoopDeclarationUnitTest.inc.fixed +++ /dev/null @@ -1,36 +0,0 @@ - $that) { -} - -// Invalid. -foreach ($something as $blah => $that) { -} - -foreach ($something as $blah => $that) { -} - -foreach ($something as $blah => $that) { -} - -foreach (${something} as $blah => $that) { -} - -// The works. -foreach ($something as $blah => $that) { -} - -// phpcs:set Squiz.ControlStructures.ForEachLoopDeclaration requiredSpacesAfterOpen 1 -// phpcs:set Squiz.ControlStructures.ForEachLoopDeclaration requiredSpacesBeforeClose 1 -foreach ( $something as $blah => $that ) {} -foreach ( $something as $blah => $that ) {} -foreach ( $something as $blah => $that ) {} -// phpcs:set Squiz.ControlStructures.ForEachLoopDeclaration requiredSpacesAfterOpen 0 -// phpcs:set Squiz.ControlStructures.ForEachLoopDeclaration requiredSpacesBeforeClose 0 - -foreach ([ - 'foo' => 'bar', - 'foobaz' => 'bazzy', - ] as $key => $value) { -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForEachLoopDeclarationUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForEachLoopDeclarationUnitTest.php deleted file mode 100644 index ca7ebb1..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForEachLoopDeclarationUnitTest.php +++ /dev/null @@ -1,61 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\ControlStructures; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ForEachLoopDeclaration sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\ControlStructures\ForEachLoopDeclarationSniff - */ -final class ForEachLoopDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 8 => 2, - 11 => 2, - 14 => 2, - 17 => 5, - 21 => 7, - 26 => 2, - 28 => 2, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.1.inc deleted file mode 100644 index d10bd98..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.1.inc +++ /dev/null @@ -1,126 +0,0 @@ -i ; }; $i < function() { return $this->max; }; $i++) {} -for ($i = function() { return $this->i; }; $i < function() { return $this->max; } ; $i++) {} - -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration ignoreNewlines true -for ( - $i = 0; - $i < 5; - $i++ -) { - // body here -} -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration ignoreNewlines false diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.1.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.1.inc.fixed deleted file mode 100644 index 85214c0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.1.inc.fixed +++ /dev/null @@ -1,92 +0,0 @@ -i ; }; $i < function() { return $this->max; }; $i++) {} -for ($i = function() { return $this->i; }; $i < function() { return $this->max; }; $i++) {} - -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration ignoreNewlines true -for ( - $i = 0; - $i < 5; - $i++ -) { - // body here -} -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration ignoreNewlines false diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.1.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.1.js deleted file mode 100644 index 94e1f74..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.1.js +++ /dev/null @@ -1,122 +0,0 @@ -// Valid. -for (var i = 0; i < 10; i++) { -} - -// Invalid. -for ( i = 0; i < 10; i++ ) { -} - -for (i = 0; i < 10; i++) { -} - -for (var i = 0 ; i < 10 ; i++) { -} - -for (i = 0;i < 10;i++) { -} - -// The works. -for ( var i = 0 ; i < 10 ; i++ ) { -} - -this.formats = {}; -dfx.inherits('ContentFormat', 'Widget'); - -for (var widgetid in this.loadedContents) { - if (dfx.isset(widget) === true) { - widget.loadAutoSaveCWidgetStore.setData('activeScreen', null);widget.getContents(this.loadedContents[widgetid], function() {self.widgetLoaded(widget.id);}); - } -} - -for (var i = 0; i < 10;) { -} -for (var i = 0; i < 10; ) { -} - -for (var i = 0; ; i++) { -} -for (var i = 0;; i++) { -} - -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesAfterOpen 1 -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesBeforeClose 1 -for (var i = 0; i < 10; i++) {} -for ( var i = 0; i < 10; i++ ) {} -for ( var i = 0; i < 10; i++ ) {} -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesAfterOpen 0 -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesBeforeClose 0 - -for ( ; i < 10; i++) {} -for (; i < 10; i++) {} - -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesAfterOpen 1 -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesBeforeClose 1 -for ( ; i < 10; i++ ) {} -for ( ; i < 10; i++ ) {} -for (; i < 10; i++ ) {} - -for ( i = 0; i < 10; ) {} -for ( i = 0; i < 10;) {} -for ( i = 0; i < 10; ) {} -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesAfterOpen 0 -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesBeforeClose 0 - -// Test handling of comments and inline annotations. -for ( /*phpcs:enable*/ i = 0 /*start*/ ; /*end*/i < 10/*comment*/; i++ /*comment*/ ) {} - -// Test multi-line FOR control structure. -for ( - i = 0; - i < 10; - i++ -) {} - -// Test multi-line FOR control structure with comments and annotations. -for ( - i = 0; /* Start */ - i < 10; /* phpcs:ignore Standard.Category.SniffName -- for reasons. */ - i++ // comment - -) {} - -// Test fixing each error in one go. Note: lines 84 + 88 contain trailing whitespace on purpose. -for ( - - - i = 0 - - ; - - i < 10 - - ; - - i++ - - -) {} - -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesAfterOpen 1 -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesBeforeClose 1 -for ( - - - - i = 0 - - ; - - i < 10 - - ; - - i++ - - -) {} -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesAfterOpen 0 -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesBeforeClose 0 - -// Test with semicolon not belonging to for. -for (i = function() {self.widgetLoaded(widget.id) ; }; i < function() {self.widgetLoaded(widget.id);}; i++) {} -for (i = function() {self.widgetLoaded(widget.id);}; i < function() {self.widgetLoaded(widget.id);} ; i++) {} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.1.js.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.1.js.fixed deleted file mode 100644 index fbf9b60..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.1.js.fixed +++ /dev/null @@ -1,88 +0,0 @@ -// Valid. -for (var i = 0; i < 10; i++) { -} - -// Invalid. -for (i = 0; i < 10; i++) { -} - -for (i = 0; i < 10; i++) { -} - -for (var i = 0; i < 10; i++) { -} - -for (i = 0; i < 10; i++) { -} - -// The works. -for (var i = 0; i < 10; i++) { -} - -this.formats = {}; -dfx.inherits('ContentFormat', 'Widget'); - -for (var widgetid in this.loadedContents) { - if (dfx.isset(widget) === true) { - widget.loadAutoSaveCWidgetStore.setData('activeScreen', null);widget.getContents(this.loadedContents[widgetid], function() {self.widgetLoaded(widget.id);}); - } -} - -for (var i = 0; i < 10;) { -} -for (var i = 0; i < 10;) { -} - -for (var i = 0;; i++) { -} -for (var i = 0;; i++) { -} - -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesAfterOpen 1 -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesBeforeClose 1 -for ( var i = 0; i < 10; i++ ) {} -for ( var i = 0; i < 10; i++ ) {} -for ( var i = 0; i < 10; i++ ) {} -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesAfterOpen 0 -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesBeforeClose 0 - -for (; i < 10; i++) {} -for (; i < 10; i++) {} - -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesAfterOpen 1 -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesBeforeClose 1 -for ( ; i < 10; i++ ) {} -for ( ; i < 10; i++ ) {} -for ( ; i < 10; i++ ) {} - -for ( i = 0; i < 10; ) {} -for ( i = 0; i < 10; ) {} -for ( i = 0; i < 10; ) {} -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesAfterOpen 0 -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesBeforeClose 0 - -// Test handling of comments and inline annotations. -for (/*phpcs:enable*/ i = 0 /*start*/; /*end*/i < 10/*comment*/; i++ /*comment*/) {} - -// Test multi-line FOR control structure. -for (i = 0; i < 10; i++) {} - -// Test multi-line FOR control structure with comments and annotations. -for (i = 0; /* Start */ - i < 10; /* phpcs:ignore Standard.Category.SniffName -- for reasons. */ - i++ // comment - -) {} - -// Test fixing each error in one go. Note: lines 84 + 88 contain trailing whitespace on purpose. -for (i = 0; i < 10; i++) {} - -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesAfterOpen 1 -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesBeforeClose 1 -for ( i = 0; i < 10; i++ ) {} -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesAfterOpen 0 -// phpcs:set Squiz.ControlStructures.ForLoopDeclaration requiredSpacesBeforeClose 0 - -// Test with semicolon not belonging to for. -for (i = function() {self.widgetLoaded(widget.id) ; }; i < function() {self.widgetLoaded(widget.id);}; i++) {} -for (i = function() {self.widgetLoaded(widget.id);}; i < function() {self.widgetLoaded(widget.id);}; i++) {} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.2.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.2.inc deleted file mode 100644 index a327cce..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/ForLoopDeclarationUnitTest.2.inc +++ /dev/null @@ -1,6 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\ControlStructures; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ForLoopDeclaration sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\ControlStructures\ForLoopDeclarationSniff - */ -final class ForLoopDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'ForLoopDeclarationUnitTest.1.inc': - return [ - 8 => 2, - 11 => 2, - 14 => 2, - 17 => 2, - 21 => 6, - 27 => 1, - 30 => 1, - 37 => 2, - 39 => 2, - 43 => 1, - 49 => 1, - 50 => 1, - 53 => 1, - 54 => 1, - 59 => 4, - 62 => 1, - 63 => 1, - 64 => 1, - 66 => 1, - 69 => 1, - 74 => 1, - 77 => 1, - 82 => 2, - 86 => 2, - 91 => 1, - 95 => 1, - 101 => 2, - 105 => 2, - 110 => 1, - 116 => 2, - ]; - - case 'ForLoopDeclarationUnitTest.1.js': - return [ - 6 => 2, - 9 => 2, - 12 => 2, - 15 => 2, - 19 => 6, - 33 => 1, - 36 => 1, - 43 => 2, - 45 => 2, - 49 => 1, - 55 => 1, - 56 => 1, - 59 => 1, - 60 => 1, - 65 => 4, - 68 => 1, - 69 => 1, - 70 => 1, - 72 => 1, - 75 => 1, - 80 => 1, - 83 => 1, - 88 => 2, - 92 => 2, - 97 => 1, - 101 => 1, - 107 => 2, - 111 => 2, - 116 => 1, - 122 => 2, - ]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getWarningList($testFile='') - { - switch ($testFile) { - case 'ForLoopDeclarationUnitTest.2.inc': - case 'ForLoopDeclarationUnitTest.3.inc': - return [6 => 1]; - - case 'ForLoopDeclarationUnitTest.2.js': - return [2 => 1]; - - default: - return []; - }//end switch - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/InlineIfDeclarationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/InlineIfDeclarationUnitTest.inc deleted file mode 100644 index f54ed8a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/InlineIfDeclarationUnitTest.inc +++ /dev/null @@ -1,48 +0,0 @@ -id.'"', - '"'.$this->stepInfo['title'].'"', - '"'.((isset($this->stepInfo['description']) === TRUE) ? $this->stepInfo['description'] : '').'"', - '"'.(isset($this->stepInfo['description']) === TRUE ? $this->stepInfo['description'] : '').'"', - '"'.$this->stepInfo['title'].'"', - ); - -echo (TRUE)?'Hello':'Bye'; - -$array = array( - 'one' => ($test == 1) ? true : false, - 'two' => (($test == 1) ? true : false), - 'three' => (($test == 1) ? true : false) -); -$var = ($test == 1) ? true : false; -$var = (myFunc(1,2,3) == 1) ? true : false; - -set('config', function() { - $foo = ($bar === "on") ? "1" : "2"; -}); - -$config = function() { - $foo = ($bar === "on") ? "1" : "2"; -}; - -rand(0, 1) ? 'ěščřžýáí' : NULL; - -$c = ($argv[1]) ? : ""; -$filepath = realpath($argv[1]) ?: $argv[1]; -$c = ($argv[1]) ? /* comment */ : ""; -$c = ($argv[1]) ? -: ""; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/InlineIfDeclarationUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/InlineIfDeclarationUnitTest.inc.fixed deleted file mode 100644 index f7aa1d6..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/InlineIfDeclarationUnitTest.inc.fixed +++ /dev/null @@ -1,48 +0,0 @@ -id.'"', - '"'.$this->stepInfo['title'].'"', - '"'.((isset($this->stepInfo['description']) === TRUE) ? $this->stepInfo['description'] : '').'"', - '"'.(isset($this->stepInfo['description']) === TRUE ? $this->stepInfo['description'] : '').'"', - '"'.$this->stepInfo['title'].'"', - ); - -echo (TRUE) ? 'Hello' : 'Bye'; - -$array = array( - 'one' => ($test == 1) ? true : false, - 'two' => (($test == 1) ? true : false), - 'three' => (($test == 1) ? true : false) -); -$var = ($test == 1) ? true : false; -$var = (myFunc(1,2,3) == 1) ? true : false; - -set('config', function() { - $foo = ($bar === "on") ? "1" : "2"; -}); - -$config = function() { - $foo = ($bar === "on") ? "1" : "2"; -}; - -rand(0, 1) ? 'ěščřžýáí' : NULL; - -$c = ($argv[1]) ?: ""; -$filepath = realpath($argv[1]) ?: $argv[1]; -$c = ($argv[1]) ? /* comment */ : ""; -$c = ($argv[1]) ? -: ""; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/InlineIfDeclarationUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/InlineIfDeclarationUnitTest.php deleted file mode 100644 index 87d2d3d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/InlineIfDeclarationUnitTest.php +++ /dev/null @@ -1,80 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\ControlStructures; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the InlineIfDeclaration sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\ControlStructures\InlineIfDeclarationSniff - */ -final class InlineIfDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Get a list of CLI values to set before the file is tested. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getCliValues($testFile) - { - return ['--encoding=utf-8']; - - }//end getCliValues() - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 4 => 1, - 5 => 1, - 6 => 1, - 7 => 1, - 8 => 1, - 9 => 1, - 10 => 1, - 13 => 1, - 20 => 1, - 24 => 4, - 44 => 1, - 47 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/LowercaseDeclarationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/LowercaseDeclarationUnitTest.inc deleted file mode 100644 index 1acf3ea..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/LowercaseDeclarationUnitTest.inc +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\ControlStructures; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the LowercaseDeclaration sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\ControlStructures\LowercaseDeclarationSniff - */ -final class LowercaseDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 3 => 1, - 5 => 1, - 7 => 1, - 9 => 1, - 10 => 1, - 12 => 1, - 14 => 1, - 15 => 1, - 16 => 1, - 20 => 1, - 21 => 1, - 24 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/SwitchDeclarationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/SwitchDeclarationUnitTest.inc deleted file mode 100644 index 8f48451..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/ControlStructures/SwitchDeclarationUnitTest.inc +++ /dev/null @@ -1,346 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\ControlStructures; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the SwitchDeclaration sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\ControlStructures\SwitchDeclarationSniff - */ -final class SwitchDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'SwitchDeclarationUnitTest.inc': - return [ - 27 => 1, - 29 => 1, - 34 => 1, - 36 => 1, - 44 => 1, - 48 => 1, - 52 => 1, - 54 => 1, - 55 => 1, - 56 => 1, - 58 => 1, - 59 => 1, - 61 => 1, - 62 => 1, - 79 => 1, - 85 => 2, - 88 => 2, - 89 => 2, - 92 => 1, - 95 => 3, - 99 => 1, - 116 => 1, - 122 => 1, - 127 => 2, - 134 => 2, - 135 => 1, - 138 => 1, - 143 => 1, - 144 => 1, - 147 => 1, - 165 => 1, - 172 => 1, - 176 => 2, - 180 => 1, - 192 => 2, - 196 => 1, - 223 => 1, - 266 => 1, - 282 => 1, - 284 => 2, - 322 => 1, - 323 => 1, - 327 => 1, - 329 => 1, - 330 => 1, - 339 => 2, - 342 => 1, - ]; - - case 'SwitchDeclarationUnitTest.js': - return [ - 27 => 1, - 29 => 1, - 34 => 1, - 36 => 1, - 44 => 1, - 48 => 1, - 52 => 1, - 54 => 1, - 55 => 1, - 56 => 1, - 58 => 1, - 59 => 1, - 61 => 1, - 62 => 1, - 79 => 1, - 85 => 2, - 88 => 2, - 89 => 2, - 92 => 1, - 95 => 3, - 99 => 1, - 116 => 1, - 122 => 1, - 127 => 2, - 134 => 2, - 135 => 1, - 138 => 1, - 143 => 1, - 144 => 1, - 147 => 1, - 165 => 1, - 172 => 1, - 176 => 2, - 180 => 1, - 192 => 2, - 196 => 1, - 223 => 1, - 266 => 1, - 282 => 1, - 284 => 2, - ]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getWarningList($testFile='') - { - if ($testFile === 'SwitchDeclarationUnitTest.js') { - return [273 => 1]; - } - - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Debug/JSLintUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Debug/JSLintUnitTest.js deleted file mode 100644 index 797e0ee..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Debug/JSLintUnitTest.js +++ /dev/null @@ -1,2 +0,0 @@ -alert('hi') -alert('hi'); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Debug/JSLintUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Debug/JSLintUnitTest.php deleted file mode 100644 index 5d77d8c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Debug/JSLintUnitTest.php +++ /dev/null @@ -1,74 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Debug; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; -use PHP_CodeSniffer\Config; - -/** - * Unit test class for the JSLint sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Debug\JSLintSniff - */ -final class JSLintUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Should this test be skipped for some reason. - * - * @return bool - */ - protected function shouldSkipTest() - { - $jslPath = Config::getExecutablePath('jslint'); - if ($jslPath === null) { - return true; - } - - return false; - - }//end shouldSkipTest() - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return []; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [ - 1 => 2, - 2 => 1, - ]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Debug/JavaScriptLintUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Debug/JavaScriptLintUnitTest.js deleted file mode 100644 index 797e0ee..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Debug/JavaScriptLintUnitTest.js +++ /dev/null @@ -1,2 +0,0 @@ -alert('hi') -alert('hi'); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Debug/JavaScriptLintUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Debug/JavaScriptLintUnitTest.php deleted file mode 100644 index 438ea3b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Debug/JavaScriptLintUnitTest.php +++ /dev/null @@ -1,71 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Debug; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; -use PHP_CodeSniffer\Config; - -/** - * Unit test class for the JavaScriptLint sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Debug\JavaScriptLintSniff - */ -final class JavaScriptLintUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Should this test be skipped for some reason. - * - * @return bool - */ - protected function shouldSkipTest() - { - $jslPath = Config::getExecutablePath('jsl'); - if ($jslPath === null) { - return true; - } - - return false; - - }//end shouldSkipTest() - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return []; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [2 => 1]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.1.inc deleted file mode 100644 index 3279edb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.1.inc +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.2.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.2.inc deleted file mode 100644 index 05be633..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.2.inc +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.3.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.3.inc deleted file mode 100644 index ec1b023..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.3.inc +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.4.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.4.inc deleted file mode 100644 index ed04564..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.4.inc +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.5.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.5.inc deleted file mode 100644 index d777aff..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.5.inc +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.php deleted file mode 100644 index 9bea7f9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Files/FileExtensionUnitTest.php +++ /dev/null @@ -1,60 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Files; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the FileExtension sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Files\FileExtensionSniff - */ -final class FileExtensionUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'FileExtensionUnitTest.1.inc': - return [1 => 1]; - default: - return []; - } - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.1.inc deleted file mode 100644 index 8e62896..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.1.inc +++ /dev/null @@ -1,203 +0,0 @@ -words[$wordPos-1]) || $this->words[$wordPos-1] !== ' ') { -} else if ($this->tokens[$pos + 1] === "\n") { -} - -if ($pos === count($this->tokens) - 1) { - $file = '...'.substr($file, (($padding * -1) + 3)); -} - -if (substr($basename, -5) !== 'Sniff') { - $i = ($this->_tokens[$i]['parenthesis_closer'] + 1); -} - -$pos = $this->_getShortCommentEndPos(); -if ($pos === -1) { - $stackPtr = ($tokens[$next][$to] - 1); - $stackPtr = ($tokens[$next][$pattern[$i]['to']] + 1); - $var = (($var1 + $var2) + $var3 + $var4) -} - -$commentStart = ($phpcsFile->findPrevious(T_DOC_COMMENT, ($commentEnd - 1), null, true) + 1); -$commentEnd = ($this->_phpcsFile->findNext(T_DOC_COMMENT, ($commentStart + 1), null, true) - 1); -$expected .= '...'.substr($tokens[($stackPtr - 2)]['content'], -5).$tokens[$stackPtr]['content']; - -if (($tokens[$nextToken - 1]['code']) !== T_WHITESPACE) { - $errorPos = ($params[(count($params) - 1)]->getLine() + $commentStart); -} - -while (($nextSpace = $phpcsFile->findNext(T_WHITESPACE, $nextSpace + 1, $nextBreak)) !== false) { -} - -foreach ($attributes as $id => &$attribute) { -} - -class MyClass -{ - - - public function &myFunction(array &$one, array &$two) - { - - }//end myFunction() - - -}//end class - -if ($index < -1) $index = 0; -if ($index < - 1) $index = 0; - -$three = ceil($one / $two); -$three = ceil(($one / $two) / $four); -$three = ceil($one / ($two / $four)); - -$four = -0.25; - -$three = ceil($one[1] / $two); - -switch ($number % 10) { - case -1: - $suffix = 'st'; - break; -} - -$expectedPermission = array( - 'granted' => 4, - 'denied' => 1, - 'cascade' => TRUE, - 'blockergranted' => 2, - 'blockerdenied' => - 3, - 'effective' => TRUE, - ); - -$value = (int) isset($blah) + 2; -$value = (int) isset($blah) + (int) isset($foo) + (int) isset($bar); - -doSomething(getValue($var, 2)) - $y; - -$codeFiles = array($global => $codeFiles[$global]) + $codeFiles; - -$var = array(-1); -$var = [-1]; -$var = [0, -1, -2]; - -$cntPages = ceil(count($items) / self::ON_PAGE); - -error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING); -error_reporting(E_ALL & ~E_NOTICE | ~E_WARNING); -$results = $stmt->fetchAll(\PDO::FETCH_ASSOC | \PDO::FETCH_GROUP | \PDO::FETCH_UNIQUE); -$di = new \RecursiveDirectoryIterator($path, \RecursiveDirectoryIterator::SKIP_DOTS | \FilesystemIterator::FOLLOW_SYMLINKS); -foo(1 + 2 + 3); - -if (empty($foo[-1]) === true) { - $foo[-1] = 'foo'; -} - -try { -} catch (AException | BException $e) { -} - -$var = $foo['blah'] + []; - -$a = 2 * ${x} - ${minus}; - -$foo = $bar ?? $baz ?? ''; - -$foo = $myString{-1}; - -$value = (binary) $blah + b"binary $foo"; - -$test = (1 * static::TEST); -$test = myfunc(1 * static::TEST); - -$errorPos = $params[$x]?->getLine() + $commentStart; - -$foo = $this->gmail ?? $this->gmail = new Google_Service_Gmail($this->google); - -exit -1; - -$expr = match ($number - 10) { - -1 => 0, -}; - -$expr = match ($number % 10) { - 1 => 2 * $num, -}; - -$expr = match (true) { - $num * 100 > 500 => 'expression in key', -}; - -// PHP 8.0 named parameters. -if ($pos === count(value: $this->tokens) - 1) { - $file = '...'.substr(string: $file, offset: $padding * -1 + 3); -} - -match ($a) { - 'a' => -1, - 'b', 'c', 'd' => -2, - default => -3, -}; - -$cntPages = ceil(count($items) / parent::ON_PAGE); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.1.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.1.inc.fixed deleted file mode 100644 index 9fa0216..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.1.inc.fixed +++ /dev/null @@ -1,203 +0,0 @@ -words[($wordPos-1)]) || $this->words[($wordPos-1)] !== ' ') { -} else if ($this->tokens[($pos + 1)] === "\n") { -} - -if ($pos === (count($this->tokens) - 1)) { - $file = '...'.substr($file, (($padding * -1) + 3)); -} - -if (substr($basename, -5) !== 'Sniff') { - $i = ($this->_tokens[$i]['parenthesis_closer'] + 1); -} - -$pos = $this->_getShortCommentEndPos(); -if ($pos === -1) { - $stackPtr = ($tokens[$next][$to] - 1); - $stackPtr = ($tokens[$next][$pattern[$i]['to']] + 1); - $var = (($var1 + $var2) + $var3 + $var4) -} - -$commentStart = ($phpcsFile->findPrevious(T_DOC_COMMENT, ($commentEnd - 1), null, true) + 1); -$commentEnd = ($this->_phpcsFile->findNext(T_DOC_COMMENT, ($commentStart + 1), null, true) - 1); -$expected .= '...'.substr($tokens[($stackPtr - 2)]['content'], -5).$tokens[$stackPtr]['content']; - -if (($tokens[($nextToken - 1)]['code']) !== T_WHITESPACE) { - $errorPos = ($params[(count($params) - 1)]->getLine() + $commentStart); -} - -while (($nextSpace = $phpcsFile->findNext(T_WHITESPACE, ($nextSpace + 1), $nextBreak)) !== false) { -} - -foreach ($attributes as $id => &$attribute) { -} - -class MyClass -{ - - - public function &myFunction(array &$one, array &$two) - { - - }//end myFunction() - - -}//end class - -if ($index < -1) $index = 0; -if ($index < - 1) $index = 0; - -$three = ceil($one / $two); -$three = ceil(($one / $two) / $four); -$three = ceil($one / ($two / $four)); - -$four = -0.25; - -$three = ceil($one[1] / $two); - -switch ($number % 10) { - case -1: - $suffix = 'st'; - break; -} - -$expectedPermission = array( - 'granted' => 4, - 'denied' => 1, - 'cascade' => TRUE, - 'blockergranted' => 2, - 'blockerdenied' => - 3, - 'effective' => TRUE, - ); - -$value = ((int) isset($blah) + 2); -$value = ((int) isset($blah) + (int) isset($foo) + (int) isset($bar)); - -(doSomething(getValue($var, 2)) - $y); - -$codeFiles = (array($global => $codeFiles[$global]) + $codeFiles); - -$var = array(-1); -$var = [-1]; -$var = [0, -1, -2]; - -$cntPages = ceil(count($items) / self::ON_PAGE); - -error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING); -error_reporting(E_ALL & ~E_NOTICE | ~E_WARNING); -$results = $stmt->fetchAll(\PDO::FETCH_ASSOC | \PDO::FETCH_GROUP | \PDO::FETCH_UNIQUE); -$di = new \RecursiveDirectoryIterator($path, (\RecursiveDirectoryIterator::SKIP_DOTS | \FilesystemIterator::FOLLOW_SYMLINKS)); -foo(1 + 2 + 3); - -if (empty($foo[-1]) === true) { - $foo[-1] = 'foo'; -} - -try { -} catch (AException | BException $e) { -} - -$var = ($foo['blah'] + []); - -$a = 2 * ${x} - ${minus}; - -$foo = ($bar ?? $baz ?? ''); - -$foo = $myString{-1}; - -$value = ((binary) $blah + b"binary $foo"); - -$test = (1 * static::TEST); -$test = myfunc(1 * static::TEST); - -$errorPos = ($params[$x]?->getLine() + $commentStart); - -$foo = ($this->gmail ?? $this->gmail = new Google_Service_Gmail($this->google)); - -exit -1; - -$expr = match ($number - 10) { - -1 => 0, -}; - -$expr = match ($number % 10) { - 1 => (2 * $num), -}; - -$expr = match (true) { - ($num * 100) > 500 => 'expression in key', -}; - -// PHP 8.0 named parameters. -if ($pos === (count(value: $this->tokens) - 1)) { - $file = '...'.substr(string: $file, offset: ($padding * -1 + 3)); -} - -match ($a) { - 'a' => -1, - 'b', 'c', 'd' => -2, - default => -3, -}; - -$cntPages = ceil(count($items) / parent::ON_PAGE); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.2.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.2.inc deleted file mode 100644 index 1284f12..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.2.inc +++ /dev/null @@ -1,7 +0,0 @@ -\s]+))?)+\s*|\s*)\/?>/gim); - -var options = { - minVal: -1, - maxVal: -1 -}; - -stepWidth = Math.round(this.width / 5); - -date.setMonth(d[2] - 1); - -switch (number % 10) { - case -1: - suffix = 'st'; - break; -} - -var pathSplit = ipt.value.split(/\/|\\/); - -if (pairs[i].search(/=/) !== -1) { -} - -if (urlValue.search(/[a-zA-z]+:\/\//) !== 0) { -} - -if (urlValue.search(/[a-zA-z]+:\/\/*/) !== 0) { -} - -if (!value || /^\s*$/.test(value)) { - return true; -} - -parseInt(dfx.attr(selectors[idx], 'elemOffsetTop'), 10) - scrollCoords.y + 'px' - -if (something === true - ^ somethingElse === true -) { - return false; -} - -if (true === /^\d*\.?\d*$/.test(input)) return true; - -if ( ! /^(?:a|select)$/i.test( element.tagName ) ) return true; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.js.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.js.fixed deleted file mode 100644 index 04e35d9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.js.fixed +++ /dev/null @@ -1,118 +0,0 @@ -value = (one + two); -value = one + two; - -value = (one - two); -value = (one - two); - -value = (one * two); -value = (one * two); - -value = (one / two); -value = (one / two); - -value = (one % two); -value = (one % two); - -value = (one + two + three); -value = one + two + three; -value = (one + (two + three)); -value = one + (two + three); - -value++; -value--; -value = -1; -value = - 1; - -value = (1 + 2); -value = 1 + 2; - -value = (1 - 2); -value = (1 - 2); - -value = (1 * 2); -value = (1 * 2); - -value = (1 / 2); -value = (1 / 2); - -value = (1 % 2); -value = (1 % 2); - -value = (1 + 2 + 3); -value = 1 + 2 + 3; -value = (1 + (2 + 3)); -value = 1 + (2 + 3); - -value = one + 2 + (3 - (four * five * (6 + 7))) + nine + 2; -value = myFunction(tokens[(stackPtr - 1)]); - -for (i = 1 + 2; i < 4 + 5; i++) { -} - -function myFunction() -{ - value = (one + 1) + (two + 2) + (myFunction() + 2); - value = myFunction() + 2; - value = (myFunction(mvar) + myFunction2(mvar)); - return -1; -} - -params['mode'] = id.replace(/WidgetType/, ''); - -if (index < -1) index = 0; -if (index < - 1) index = 0; - -var classN = prvId.replace(/\./g, '-'); - -three = myFunction(one / two); -three = myFunction((one / two) / four); -three = myFunction(one / (two / four)); - -four = -0.25; - -id = id.replace(/row\/:/gi, ''); -return /MSIE/.test(navigator.userAgent); - -var re = new RegExp(/<\/?(\w+)((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)\/?>/gim); - -var options = { - minVal: -1, - maxVal: -1 -}; - -stepWidth = Math.round(this.width / 5); - -date.setMonth(d[2] - 1); - -switch (number % 10) { - case -1: - suffix = 'st'; - break; -} - -var pathSplit = ipt.value.split(/\/|\\/); - -if (pairs[i].search(/=/) !== -1) { -} - -if (urlValue.search(/[a-zA-z]+:\/\//) !== 0) { -} - -if (urlValue.search(/[a-zA-z]+:\/\/*/) !== 0) { -} - -if (!value || /^\s*$/.test(value)) { - return true; -} - -(parseInt(dfx.attr(selectors[idx], 'elemOffsetTop'), 10) - scrollCoords.y) + 'px' - -if (something === true - ^ somethingElse === true -) { - return false; -} - -if (true === /^\d*\.?\d*$/.test(input)) return true; - -if ( ! /^(?:a|select)$/i.test( element.tagName ) ) return true; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.php deleted file mode 100644 index 7ec1a21..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Formatting/OperatorBracketUnitTest.php +++ /dev/null @@ -1,121 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Formatting; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the OperatorBracket sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Formatting\OperatorBracketSniff - */ -final class OperatorBracketUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'OperatorBracketUnitTest.1.inc': - return [ - 3 => 1, - 6 => 1, - 9 => 1, - 12 => 1, - 15 => 1, - 18 => 2, - 20 => 1, - 25 => 1, - 28 => 1, - 31 => 1, - 34 => 1, - 37 => 1, - 40 => 1, - 43 => 2, - 45 => 1, - 47 => 5, - 48 => 1, - 50 => 2, - 55 => 2, - 56 => 1, - 63 => 2, - 64 => 1, - 67 => 1, - 86 => 1, - 90 => 1, - 109 => 1, - 130 => 1, - 134 => 1, - 135 => 2, - 137 => 1, - 139 => 1, - 150 => 1, - 161 => 1, - 163 => 2, - 165 => 2, - 169 => 1, - 174 => 1, - 176 => 1, - 185 => 1, - 189 => 1, - 193 => 1, - 194 => 2, - ]; - - case 'OperatorBracketUnitTest.js': - return [ - 5 => 1, - 8 => 1, - 11 => 1, - 14 => 1, - 24 => 1, - 30 => 1, - 33 => 1, - 36 => 1, - 39 => 1, - 46 => 1, - 47 => 1, - 63 => 1, - 108 => 1, - ]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationArgumentSpacingUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationArgumentSpacingUnitTest.1.inc deleted file mode 100644 index af872e7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationArgumentSpacingUnitTest.1.inc +++ /dev/null @@ -1,227 +0,0 @@ - $a($b); - -function multipleWhitespaceTokensAfterType(int - - $number) {} - -function spacingBetweenParenthesesShouldBeFixedInOneGo( - - - ) {} - -function newlineAfterReferenceShouldBeFlaggedAndFixed( - & - - $param -) {} - -function newlineAfterReferenceFixerRespectsComment( - & - // comment - $param -) {} - -function newlineAfterVariadicShouldBeFlaggedAndFixed( - ... - - $param -) {} - -function newlineAfterVariadicFixerRespectsComment( - ... - //comment - $param -) {} - -function newlineBeforeAndAfterEqualsSignShouldBeFixedForSpacing0( - $param - - = - - true -) {} - -function commentBeforeOrAfterEqualsSignShouldBeFlaggedNotFixed( - $param /*comment*/ = /*comment*/ true -) {} - -function newlineAndCommentBeforeAndAfterEqualsSignShouldBeFlaggedNotFixed( - $param - - //comment - - = - - //comment - - true -) {} - -// phpcs:set Squiz.Functions.FunctionDeclarationArgumentSpacing equalsSpacing 1 -function newlineBeforeAndAfterEqualsSignShouldBeFixedForSpacing1( - $param - - = - - true -) {} -// phpcs:set Squiz.Functions.FunctionDeclarationArgumentSpacing equalsSpacing 0 - -function newlineBeforeCommaShouldBeFixedInOneGo( - $paramA -, - $paramB - - , - $paramC -) {} - -function newlineBeforeCommaFixerRespectsComments( - $paramA // comment - , - $paramB=10 /* comment */ -, - $paramC=20 # comment - , $paramC=30 - , string $paramC='foo' -) {} - -class PropertyPromotionSpacingAfterComma { - public function __construct(private string|int $propA, protected bool $correctSpace, public MyClass $tooMuchSpace,readonly string $noSpace) {} -} - -class PropertyPromotionSpacingAfterModifier { - public function __construct( - private$noSpace, - public MyClass $tooMuchSpace, - protected readonly string $tooMuchSpaceX2, - readonly - public - string $tooMuchSpaceNewLines, - ) {} -} - -class AsymVisibilityPropertyPromotionSpacingAfterComma { - public function __construct(private(set) string|int $propA, protected(set) bool $correctSpace, public(set) MyClass $tooMuchSpace,public(set) string $noSpace) {} -} - -class AsymVisibilityPropertyPromotionSpacingAfterModifier { - public function __construct( - private(set)$noSpace, - public(set) MyClass $tooMuchSpace, - protected(set) public string $tooMuchSpaceX2, - private - public(set) - string $tooMuchSpaceNewLines, - ) {} -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationArgumentSpacingUnitTest.1.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationArgumentSpacingUnitTest.1.inc.fixed deleted file mode 100644 index 356b374..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationArgumentSpacingUnitTest.1.inc.fixed +++ /dev/null @@ -1,199 +0,0 @@ - $a($b); - -function multipleWhitespaceTokensAfterType(int $number) {} - -function spacingBetweenParenthesesShouldBeFixedInOneGo() {} - -function newlineAfterReferenceShouldBeFlaggedAndFixed( - &$param -) {} - -function newlineAfterReferenceFixerRespectsComment( - &// comment - $param -) {} - -function newlineAfterVariadicShouldBeFlaggedAndFixed( - ...$param -) {} - -function newlineAfterVariadicFixerRespectsComment( - ...//comment - $param -) {} - -function newlineBeforeAndAfterEqualsSignShouldBeFixedForSpacing0( - $param=true -) {} - -function commentBeforeOrAfterEqualsSignShouldBeFlaggedNotFixed( - $param /*comment*/ = /*comment*/ true -) {} - -function newlineAndCommentBeforeAndAfterEqualsSignShouldBeFlaggedNotFixed( - $param - - //comment - - = - - //comment - - true -) {} - -// phpcs:set Squiz.Functions.FunctionDeclarationArgumentSpacing equalsSpacing 1 -function newlineBeforeAndAfterEqualsSignShouldBeFixedForSpacing1( - $param = true -) {} -// phpcs:set Squiz.Functions.FunctionDeclarationArgumentSpacing equalsSpacing 0 - -function newlineBeforeCommaShouldBeFixedInOneGo( - $paramA, - $paramB, - $paramC -) {} - -function newlineBeforeCommaFixerRespectsComments( - $paramA, // comment - $paramB=10, /* comment */ - $paramC=20, # comment - $paramC=30, - string $paramC='foo' -) {} - -class PropertyPromotionSpacingAfterComma { - public function __construct(private string|int $propA, protected bool $correctSpace, public MyClass $tooMuchSpace, readonly string $noSpace) {} -} - -class PropertyPromotionSpacingAfterModifier { - public function __construct( - private $noSpace, - public MyClass $tooMuchSpace, - protected readonly string $tooMuchSpaceX2, - readonly public string $tooMuchSpaceNewLines, - ) {} -} - -class AsymVisibilityPropertyPromotionSpacingAfterComma { - public function __construct(private(set) string|int $propA, protected(set) bool $correctSpace, public(set) MyClass $tooMuchSpace, public(set) string $noSpace) {} -} - -class AsymVisibilityPropertyPromotionSpacingAfterModifier { - public function __construct( - private(set) $noSpace, - public(set) MyClass $tooMuchSpace, - protected(set) public string $tooMuchSpaceX2, - private public(set) string $tooMuchSpaceNewLines, - ) {} -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationArgumentSpacingUnitTest.2.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationArgumentSpacingUnitTest.2.inc deleted file mode 100644 index 1b57233..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationArgumentSpacingUnitTest.2.inc +++ /dev/null @@ -1,6 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Functions; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the FunctionDeclarationArgumentSpacing sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Functions\FunctionDeclarationArgumentSpacingSniff - */ -final class FunctionDeclarationArgumentSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'FunctionDeclarationArgumentSpacingUnitTest.1.inc': - return [ - 3 => 1, - 5 => 2, - 7 => 2, - 8 => 2, - 9 => 2, - 11 => 2, - 13 => 7, - 14 => 2, - 15 => 2, - 16 => 4, - 18 => 2, - 35 => 2, - 36 => 2, - 44 => 2, - 45 => 1, - 46 => 1, - 51 => 2, - 53 => 2, - 55 => 1, - 56 => 1, - 58 => 1, - 73 => 7, - 76 => 1, - 77 => 1, - 81 => 1, - 89 => 2, - 92 => 1, - 93 => 1, - 94 => 1, - 95 => 1, - 99 => 11, - 100 => 2, - 101 => 2, - 102 => 2, - 103 => 1, - 106 => 1, - 107 => 2, - 111 => 3, - 113 => 1, - 117 => 1, - 123 => 1, - 129 => 1, - 135 => 1, - 141 => 1, - 149 => 2, - 155 => 2, - 163 => 2, - 174 => 2, - 182 => 1, - 185 => 1, - 191 => 1, - 193 => 1, - 195 => 1, - 196 => 1, - 200 => 2, - 205 => 1, - 206 => 1, - 207 => 2, - 208 => 1, - 209 => 1, - 215 => 2, - 220 => 1, - 221 => 1, - 222 => 2, - 223 => 1, - 224 => 1, - ]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationUnitTest.1.inc deleted file mode 100644 index 0cde113..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDeclarationUnitTest.1.inc +++ /dev/null @@ -1,75 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Functions; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the FunctionDeclaration sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Functions\FunctionDeclarationSniff - */ -final class FunctionDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'FunctionDeclarationUnitTest.1.inc': - return [ - 55 => 1, - 68 => 1, - ]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDuplicateArgumentUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDuplicateArgumentUnitTest.inc deleted file mode 100644 index 27102d0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDuplicateArgumentUnitTest.inc +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDuplicateArgumentUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDuplicateArgumentUnitTest.php deleted file mode 100644 index 8cfd9dd..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/FunctionDuplicateArgumentUnitTest.php +++ /dev/null @@ -1,57 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Functions; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the FunctionDuplicateArgument sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Functions\FunctionDuplicateArgumentSniff - */ -final class FunctionDuplicateArgumentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 2 => 1, - 4 => 2, - 5 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/GlobalFunctionUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/GlobalFunctionUnitTest.inc deleted file mode 100644 index b7b7f20..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/GlobalFunctionUnitTest.inc +++ /dev/null @@ -1,17 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/GlobalFunctionUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/GlobalFunctionUnitTest.php deleted file mode 100644 index 01492e6..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/GlobalFunctionUnitTest.php +++ /dev/null @@ -1,53 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Functions; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the GlobalFunction sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Functions\GlobalFunctionSniff - */ -final class GlobalFunctionUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return []; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [2 => 1]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/LowercaseFunctionKeywordsUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/LowercaseFunctionKeywordsUnitTest.inc deleted file mode 100644 index 4e86833..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/LowercaseFunctionKeywordsUnitTest.inc +++ /dev/null @@ -1,28 +0,0 @@ - $x; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/LowercaseFunctionKeywordsUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/LowercaseFunctionKeywordsUnitTest.inc.fixed deleted file mode 100644 index 48c9977..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/LowercaseFunctionKeywordsUnitTest.inc.fixed +++ /dev/null @@ -1,28 +0,0 @@ - $x; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/LowercaseFunctionKeywordsUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/LowercaseFunctionKeywordsUnitTest.php deleted file mode 100644 index 209d1dd..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/LowercaseFunctionKeywordsUnitTest.php +++ /dev/null @@ -1,63 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Functions; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the LowercaseFunctionKeywords sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Functions\LowercaseFunctionKeywordsSniff - */ -final class LowercaseFunctionKeywordsUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 16 => 1, - 17 => 1, - 20 => 1, - 21 => 1, - 22 => 1, - 23 => 1, - 24 => 3, - 25 => 4, - 28 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/MultiLineFunctionDeclarationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/MultiLineFunctionDeclarationUnitTest.inc deleted file mode 100644 index e9f019e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Functions/MultiLineFunctionDeclarationUnitTest.inc +++ /dev/null @@ -1,356 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Functions; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the MultiLineFunctionDeclaration sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Functions\MultiLineFunctionDeclarationSniff - */ -final class MultiLineFunctionDeclarationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - if ($testFile === 'MultiLineFunctionDeclarationUnitTest.inc') { - $errors = [ - 2 => 1, - 3 => 1, - 4 => 2, - 5 => 1, - 7 => 1, - 11 => 1, - 12 => 1, - 13 => 1, - 16 => 1, - 36 => 1, - 43 => 2, - 48 => 1, - 81 => 1, - 82 => 2, - 88 => 1, - 102 => 2, - 137 => 1, - 141 => 2, - 142 => 1, - 158 => 1, - 160 => 1, - 182 => 2, - 186 => 2, - 190 => 2, - 194 => 1, - 195 => 1, - 233 => 1, - 234 => 1, - 235 => 1, - 236 => 1, - 244 => 1, - 245 => 1, - 246 => 1, - 247 => 1, - 248 => 1, - 249 => 1, - 250 => 1, - 251 => 1, - 252 => 1, - 253 => 1, - 254 => 1, - 318 => 1, - 323 => 1, - ]; - } else { - $errors = [ - 2 => 1, - 3 => 1, - 4 => 2, - 5 => 1, - 7 => 1, - 11 => 1, - 12 => 1, - 13 => 1, - 16 => 1, - 26 => 1, - 36 => 1, - 43 => 2, - 48 => 1, - 65 => 1, - ]; - }//end if - - return $errors; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/NamingConventions/ValidFunctionNameUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/NamingConventions/ValidFunctionNameUnitTest.inc deleted file mode 100644 index aacef34..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/NamingConventions/ValidFunctionNameUnitTest.inc +++ /dev/null @@ -1,27 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/NamingConventions/ValidFunctionNameUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/NamingConventions/ValidFunctionNameUnitTest.php deleted file mode 100644 index c9e3299..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/NamingConventions/ValidFunctionNameUnitTest.php +++ /dev/null @@ -1,64 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\NamingConventions; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ValidFunctionName sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\NamingConventions\ValidFunctionNameSniff - */ -final class ValidFunctionNameUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 4 => 1, - 5 => 1, - 6 => 1, - 7 => 1, - 8 => 1, - 9 => 1, - 11 => 1, - 12 => 1, - 13 => 1, - 14 => 2, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/NamingConventions/ValidVariableNameUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/NamingConventions/ValidVariableNameUnitTest.inc deleted file mode 100644 index 361cc91..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/NamingConventions/ValidVariableNameUnitTest.inc +++ /dev/null @@ -1,171 +0,0 @@ -varName2; -echo $this->var_name2; -echo $this->varname2; -echo $this->_varName2; -echo $object->varName2; -echo $object->var_name2; -echo $object_name->varname2; -echo $object_name->_varName2; - -echo $this->myFunction($one, $two); -echo $object->myFunction($one_two); - -$error = "format is \$GLOBALS['$varName']"; - -echo $_SESSION['var_name']; -echo $_FILES['var_name']; -echo $_ENV['var_name']; -echo $_COOKIE['var_name']; - -$XML = 'hello'; -$myXML = 'hello'; -$XMLParser = 'hello'; -$xmlParser = 'hello'; - -echo "{$_SERVER['HOSTNAME']} $var_name"; - -// Need to be the last thing in this test file. -$obj->$classVar = $prefix.'-'.$type; - -class foo -{ - const bar = <<varName; -echo $obj?->var_name; -echo $obj?->varname; -echo $obj?->_varName; - -enum SomeEnum -{ - public function foo($foo, $_foo, $foo_bar) { - $bar = 1; - $_bar = 2; - $bar_foo = 3; - } -} - -class AsymVisibility { - // The read scope is public, but not specified. Enforce the naming conventions anyway. - private(set) $asymPublicImplied = 'hello'; - private(set) $_asymPublicImplied = 'hello'; - - // The read scope is private, so these properties should be handled as private properties. - private private(set) $asymPrivate = 'hello'; - private(set) private $_asymPrivate = 'hello'; - - // The read scope is public/protected, so these properties should be handled as public properties. - public private(set) $asymPublicPrivate = 'hello'; - private(set) protected $_asymPrivateProtected = 'hello'; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/NamingConventions/ValidVariableNameUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/NamingConventions/ValidVariableNameUnitTest.php deleted file mode 100644 index 861f43b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/NamingConventions/ValidVariableNameUnitTest.php +++ /dev/null @@ -1,96 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\NamingConventions; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ValidVariableName sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\NamingConventions\ValidVariableNameSniff - */ -final class ValidVariableNameUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - $errors = [ - 3 => 1, - 5 => 1, - 10 => 1, - 12 => 1, - 15 => 1, - 17 => 1, - 20 => 1, - 22 => 1, - 25 => 1, - 27 => 1, - 31 => 1, - 33 => 1, - 36 => 1, - 37 => 1, - 39 => 1, - 42 => 1, - 44 => 1, - 53 => 1, - 58 => 1, - 62 => 1, - 63 => 1, - 64 => 1, - 67 => 1, - 81 => 1, - 106 => 1, - 107 => 2, - 108 => 1, - 111 => 1, - 112 => 1, - 113 => 1, - 114 => 1, - 123 => 1, - 138 => 1, - 141 => 1, - 146 => 1, - 152 => 1, - 155 => 1, - 162 => 1, - 165 => 1, - 170 => 1, - ]; - - return $errors; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/DisallowObjectStringIndexUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/DisallowObjectStringIndexUnitTest.js deleted file mode 100644 index 1c61fbf..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/DisallowObjectStringIndexUnitTest.js +++ /dev/null @@ -1,37 +0,0 @@ -function test(id) -{ - - this.id = id; - -} -/**/ -test.prototype = { - init: function() - { - var x = {}; - x.name = 'test'; - x['phone'] = 123124324; - var t = ['test', 'this'].join(''); - var y = ['test'].join(''); - var a = x[0]; - var z = x[x['name']]; - var p = x[x.name]; - } - -}; - -function test() { - this.errors['step_' + step] = errors; - this.errors['test'] = x; - this.errors['test' + 10] = x; - this.errors['test' + y] = x; - this.errors['test' + 'blah'] = x; - this.errors[y] = x; - this.errors[y + z] = x; - this.permissions['workflow.cancel'] = x; -} - -if (child.prototype) { - above.prototype['constructor'] = parent; - child.prototype['super'] = new above(); -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/DisallowObjectStringIndexUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/DisallowObjectStringIndexUnitTest.php deleted file mode 100644 index 451dcb8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/DisallowObjectStringIndexUnitTest.php +++ /dev/null @@ -1,64 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Objects; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the DisallowObjectStringIndex sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Objects\DisallowObjectStringIndexSniff - */ -final class DisallowObjectStringIndexUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - if ($testFile !== 'DisallowObjectStringIndexUnitTest.js') { - return []; - } - - return [ - 13 => 1, - 17 => 1, - 25 => 1, - 35 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectInstantiationUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectInstantiationUnitTest.inc deleted file mode 100644 index b6df38c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectInstantiationUnitTest.inc +++ /dev/null @@ -1,49 +0,0 @@ - new MyClass()); -$object->myFunction(new MyClass()); - -throw new MyException($msg); - -function foo() { return new MyClass(); } - -$doodad = $x ? new Foo : new Bar; - -function returnFn() { - $fn = fn($x) => new MyClass(); -} - -function returnMatch() { - $match = match($x) { - 0 => new MyClass() - } -} - -// Issue 3333. -$time2 ??= new \DateTime(); -$time3 = $time1 ?? new \DateTime(); -$time3 = $time1 ?? $time2 ?? new \DateTime(); - -function_call($time1 ?? new \DateTime()); -$return = function_call($time1 ?? new \DateTime()); // False negative depending on interpretation of the sniff. - -function returnViaTernary() { - return ($y == false ) ? ($x === true ? new Foo : new Bar) : new FooBar; -} - -function nonAssignmentTernary() { - if (($x ? new Foo() : new Bar) instanceof FooBar) { - // Do something. - } -} - -// Test for tokenizer issue #3789. -$a = $b !== null - ? match ($c) { - default => 5, - } - : new Foo; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectInstantiationUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectInstantiationUnitTest.php deleted file mode 100644 index 61a311a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectInstantiationUnitTest.php +++ /dev/null @@ -1,58 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Objects; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ObjectInstantiation sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Objects\ObjectInstantiationSniff - */ -final class ObjectInstantiationUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 5 => 1, - 8 => 1, - 31 => 1, - 39 => 2, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectMemberCommaUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectMemberCommaUnitTest.js deleted file mode 100644 index 28bf85a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectMemberCommaUnitTest.js +++ /dev/null @@ -1,47 +0,0 @@ -this.request({ action: 'getTypeFormatContents', }); - -addTypeFormatButton.addClickEvent(function() { - self.addNewTypeFormat(); -}); - -var x = {}; - -var y = { - VarOne : 'If you ask me, thats if you ask', - VarTwo : ['Alonzo played you', 'for a fool', 'esse'], - VarThree: function(arg) { - console.info(1); - } -}; - -var z = { - VarOne : 'If you ask me, thats if you ask', - VarTwo : ['Alonzo played you', 'for a fool', 'esse'], - VarThree: function(arg) { - console.info(1); - }, -}; - -var x = function() { - console.info(2); -}; - -AssetListingEditWidgetType.prototype = { - init: function(data, assetid, editables) - { - } -}; - -AssetListingEditWidgetType.prototype = { - init: function(data, assetid, editables) - { - }, -}; - -AssetListingEditWidgetType.prototype = { - // phpcs: disable Standard.Cat.SniffName -- testing annotation between closing brace and comma - init: function(data, assetid, editables) - { - }, - // phpcs:enable -}; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectMemberCommaUnitTest.js.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectMemberCommaUnitTest.js.fixed deleted file mode 100644 index df548c7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectMemberCommaUnitTest.js.fixed +++ /dev/null @@ -1,47 +0,0 @@ -this.request({ action: 'getTypeFormatContents' }); - -addTypeFormatButton.addClickEvent(function() { - self.addNewTypeFormat(); -}); - -var x = {}; - -var y = { - VarOne : 'If you ask me, thats if you ask', - VarTwo : ['Alonzo played you', 'for a fool', 'esse'], - VarThree: function(arg) { - console.info(1); - } -}; - -var z = { - VarOne : 'If you ask me, thats if you ask', - VarTwo : ['Alonzo played you', 'for a fool', 'esse'], - VarThree: function(arg) { - console.info(1); - } -}; - -var x = function() { - console.info(2); -}; - -AssetListingEditWidgetType.prototype = { - init: function(data, assetid, editables) - { - } -}; - -AssetListingEditWidgetType.prototype = { - init: function(data, assetid, editables) - { - } -}; - -AssetListingEditWidgetType.prototype = { - // phpcs: disable Standard.Cat.SniffName -- testing annotation between closing brace and comma - init: function(data, assetid, editables) - { - } - // phpcs:enable -}; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectMemberCommaUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectMemberCommaUnitTest.php deleted file mode 100644 index 8d5d2bc..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Objects/ObjectMemberCommaUnitTest.php +++ /dev/null @@ -1,58 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Objects; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ObjectMemberComma sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Objects\ObjectMemberCommaSniff - */ -final class ObjectMemberCommaUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 1 => 1, - 22 => 1, - 38 => 1, - 45 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ComparisonOperatorUsageUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ComparisonOperatorUsageUnitTest.inc deleted file mode 100644 index 60d426e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ComparisonOperatorUsageUnitTest.inc +++ /dev/null @@ -1,144 +0,0 @@ - - 0)) { -} - -myFunction($var1 === true ? "" : "foobar"); - -// Verify that FQN true/false are handled the same as unqualified. -if (true) {} -if (\true) {} -for ($var1 = 10; FALSE; $var1--) {} -for ($var1 = 10; \FALSE; $var1--) {} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ComparisonOperatorUsageUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ComparisonOperatorUsageUnitTest.js deleted file mode 100644 index 048223b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ComparisonOperatorUsageUnitTest.js +++ /dev/null @@ -1,71 +0,0 @@ -if (value === TRUE) { -} else if (value === FALSE) { -} - -if (value == TRUE) { -} else if (value == FALSE) { -} - -if (value) { -} else if (!value) { -} - -if (value.isSomething === TRUE) { -} else if (myFunction(value) === FALSE) { -} - -if (value.isSomething == TRUE) { -} else if (myFunction(value) == FALSE) { -} - -if (value.isSomething) { -} else if (!myFunction(value)) { -} - -if (value === TRUE || other === FALSE) { -} - -if (value == TRUE || other == FALSE) { -} - -if (value || !other) { -} - -if (one === TRUE || two === TRUE || three === FALSE || four === TRUE) { -} - -if (one || two || !three || four) { -} - -while (one == true) { -} - -while (one === true) { -} - -do { -} while (one == true); - -do { -} while (one === true); - -for (one = 10; one != 0; one--) { -} - -for (one = 10; one !== 0; one--) { -} - -for (type in types) { -} - -variable = (variable2 === true) ? variable1 : "foobar"; - -variable = (variable2 == true) ? variable1 : "foobar"; - -variable = (variable2 === false) ? variable1 : "foobar"; - -variable = (variable2 == false) ? variable1 : "foobar"; - -variable = (variable2 === 0) ? variable1 : "foobar"; - -variable = (variable2 == 0) ? variable1 : "foobar"; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ComparisonOperatorUsageUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ComparisonOperatorUsageUnitTest.php deleted file mode 100644 index 2712ebd..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ComparisonOperatorUsageUnitTest.php +++ /dev/null @@ -1,105 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Operators; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ComparisonOperatorUsage sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Operators\ComparisonOperatorUsageSniff - */ -final class ComparisonOperatorUsageUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'ComparisonOperatorUsageUnitTest.inc': - return [ - 6 => 1, - 7 => 1, - 10 => 1, - 11 => 1, - 18 => 1, - 19 => 1, - 22 => 1, - 23 => 1, - 29 => 2, - 32 => 2, - 38 => 4, - 47 => 2, - 69 => 1, - 72 => 1, - 75 => 1, - 78 => 1, - 80 => 1, - 82 => 1, - 83 => 1, - 89 => 1, - 92 => 1, - 100 => 1, - 106 => 1, - 112 => 1, - 123 => 1, - 127 => 1, - 131 => 1, - 135 => 1, - ]; - - case 'ComparisonOperatorUsageUnitTest.js': - return [ - 5 => 1, - 6 => 1, - 17 => 1, - 18 => 1, - 28 => 2, - 40 => 1, - 47 => 1, - 52 => 1, - 63 => 1, - 67 => 1, - 71 => 1, - ]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/IncrementDecrementUsageUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/IncrementDecrementUsageUnitTest.inc deleted file mode 100644 index 2666959..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/IncrementDecrementUsageUnitTest.inc +++ /dev/null @@ -1,56 +0,0 @@ -i++).$id; -$id = $obj?->i++.$id; -$id = $obj?->i++*10; - -$var+=1; -$var-=1; - -$var=$var+1; -$var=$var-1; - -$var /*comment*/ +=1; -$var - // phpcs:ignore Something - -=1; - -$var += /*comment*/ 1; -$var = ( $var /*comment*/ - 1 /*comment*/); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/IncrementDecrementUsageUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/IncrementDecrementUsageUnitTest.php deleted file mode 100644 index 8525dc9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/IncrementDecrementUsageUnitTest.php +++ /dev/null @@ -1,73 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Operators; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the IncrementDecrementUsage sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Operators\IncrementDecrementUsageSniff - */ -final class IncrementDecrementUsageUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 2 => 1, - 6 => 1, - 12 => 1, - 16 => 1, - 25 => 1, - 26 => 1, - 27 => 1, - 29 => 1, - 31 => 1, - 41 => 1, - 42 => 1, - 44 => 1, - 45 => 1, - 47 => 1, - 48 => 1, - 50 => 1, - 53 => 1, - 55 => 1, - 56 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ValidLogicalOperatorsUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ValidLogicalOperatorsUnitTest.inc deleted file mode 100644 index 328ccc5..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ValidLogicalOperatorsUnitTest.inc +++ /dev/null @@ -1,28 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ValidLogicalOperatorsUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ValidLogicalOperatorsUnitTest.php deleted file mode 100644 index 87944da..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Operators/ValidLogicalOperatorsUnitTest.php +++ /dev/null @@ -1,57 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Operators; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ValidLogicalOperators sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Operators\ValidLogicalOperatorsSniff - */ -final class ValidLogicalOperatorsUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 5 => 1, - 11 => 1, - 17 => 2, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/CommentedOutCodeUnitTest.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/CommentedOutCodeUnitTest.css deleted file mode 100644 index 94cc8f2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/CommentedOutCodeUnitTest.css +++ /dev/null @@ -1,23 +0,0 @@ -/* CSS Document */ - -body { -font-family: Arial, Helvetica, sans-serif; -margin : 40px 0 0 0; -padding : 0; -/*background: #8FB7DB url(login_glow_bg.jpg) no-repeat 30% 0;*/ -background: #8FB7DB url(diag_lines_bg.gif) top left; -} - -#login-container { - margin-left: -225px; - margin-top: -161px; - position:absolute; - top :50%; - /*left :50%;*/ - width:450px; -} - -#cacheConfig-dayLabel, #cacheConfig-hourLabel, #cacheConfig-minuteLabel { - float: left; - padding-right: 8px; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/CommentedOutCodeUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/CommentedOutCodeUnitTest.inc deleted file mode 100644 index 121240a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/CommentedOutCodeUnitTest.inc +++ /dev/null @@ -1,158 +0,0 @@ - - * - * Title - * Contents - * - * ... - * - * - * - * - * @return void - */ - -/* - [^\'"] -*/ - -// http://www.google.com - -// Base config function. - -// function () - -// T_STRING is not a function call or not listed in _getFunctionListWithCallableArgument(). - - // function myFunction( $param ) - // { - // do_something(); - // }//end myFunction() - // - -/* -function myFunction( $param ) -{ - // phpcs:disable Standard.Category.Sniff -- for reasons. - if ( preg_match( '`[abc]`', $param ) > 0 ) { - do_something(); - } - // phpcs:enable Standard.Category.Sniff -- for reasons. - -}//end myFunction() -*/ - - /* - * function myFunction( $param ) // @phpcs:ignore Standard.Category.Sniff -- for reasons. - * { - * - * }//end myFunction() - */ - - /* - * function myFunction( $param ) - * { - * // phpcs:disable Standard.Category.Sniff -- for reasons. - * if ( preg_match( '`[abc]`', $param ) > 0 ) { - * do_something(); - * } - * // phpcs:enable Standard.Category.Sniff -- for reasons. - * - * }//end myFunction() - */ - - // function myFunction( $param ) - // { - // phpcs:disable Standard.Category.Sniff -- for reasons. - // do_something(); - // phpcs:enable Standard.Category.Sniff -- for reasons. - // }//end myFunction() - // - -echo 'something'; // @codeCoverageIgnore -echo 'something'; // @codeCoverageIgnoreStart -echo 'something'; // @SuppressWarnings(PHPMD.UnusedLocalVariable) - -// Ok! - -/* Go! */ - -// ISO-639-3 - - // But override with a different text if any. - /* - $id = intval( str_replace( 'hook_name', '', $order_method['method_id'] ) ); - if ( ! empty( $id ) ) { - $info_text = get_post_meta( $location_id, 'meta_name' ); - - if ( ! empty( $info_text ) ) { - $text = $info_text; - } - - } - */ - // function() { $a = $b; }; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/CommentedOutCodeUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/CommentedOutCodeUnitTest.php deleted file mode 100644 index a1f0b95..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/CommentedOutCodeUnitTest.php +++ /dev/null @@ -1,80 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the CommentedOutCode sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP\CommentedOutCodeSniff - */ -final class CommentedOutCodeUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return []; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getWarningList($testFile='') - { - switch ($testFile) { - case 'CommentedOutCodeUnitTest.inc': - return [ - 6 => 1, - 8 => 1, - 15 => 1, - 19 => 1, - 87 => 1, - 91 => 1, - 97 => 1, - 109 => 1, - 116 => 1, - 128 => 1, - 147 => 1, - 158 => 1, - ]; - - case 'CommentedOutCodeUnitTest.css': - return [ - 7 => 1, - 16 => 1, - ]; - - default: - return []; - }//end switch - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowBooleanStatementUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowBooleanStatementUnitTest.inc deleted file mode 100644 index 4701c23..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowBooleanStatementUnitTest.inc +++ /dev/null @@ -1,27 +0,0 @@ - \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowBooleanStatementUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowBooleanStatementUnitTest.php deleted file mode 100644 index e19c9dd..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowBooleanStatementUnitTest.php +++ /dev/null @@ -1,58 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the DisallowBooleanStatement sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP\DisallowBooleanStatementSniff - */ -final class DisallowBooleanStatementUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 3 => 1, - 8 => 1, - 13 => 1, - 15 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowComparisonAssignmentUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowComparisonAssignmentUnitTest.inc deleted file mode 100644 index a07047b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowComparisonAssignmentUnitTest.inc +++ /dev/null @@ -1,83 +0,0 @@ -nextSibling; $node; $node = $node->nextSibling) { - if ($node->nodeType !== XML_ELEMENT_NODE) { - continue; - } - - for ($node = $fields->nextSibling; $node; $node = $node->nextSibling) { - if ($node->nodeType !== XML_ELEMENT_NODE) { - continue; - } - } -} - -$a = $b ? $c : $d; -$a = $b === true ? $c : $d; - -$this->_args = $this->_getArgs(($_SERVER['argv'] ?? [])); -$args = ($_SERVER['argv'] ?? []); - -$a = [ - 'a' => ($foo) ? $foo : $bar, -]; - -$a = [ - 'a' => ($foo) ? fn() => return 1 : fn() => return 2, -]; - -$var = $foo->something(!$var); -$var = $foo?->something(!$var); - -$callback = function ($value) { - if ($value > 10) { - return false; - } -}; - -function issue3616() { - $food = 'cake'; - - $returnValue = match (true) { - $food === 'apple' => 'This food is an apple', - $food === 'bar' => 'This food is a bar', - $food === 'cake' => 'This food is a cake', - }; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowComparisonAssignmentUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowComparisonAssignmentUnitTest.php deleted file mode 100644 index 8a051d2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowComparisonAssignmentUnitTest.php +++ /dev/null @@ -1,64 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the DisallowComparisonAssignment sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP\DisallowComparisonAssignmentSniff - */ -final class DisallowComparisonAssignmentUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 3 => 1, - 5 => 1, - 6 => 1, - 7 => 1, - 8 => 1, - 10 => 1, - 52 => 1, - 53 => 1, - 58 => 1, - 62 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowInlineIfUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowInlineIfUnitTest.inc deleted file mode 100644 index f57e071..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowInlineIfUnitTest.inc +++ /dev/null @@ -1,18 +0,0 @@ - $x; - -$b = fn ($b) => $b ? true : false; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowInlineIfUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowInlineIfUnitTest.js deleted file mode 100644 index 56387c0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowInlineIfUnitTest.js +++ /dev/null @@ -1,2 +0,0 @@ -x = (x?a:x); -id = id.replace(/row\/:/gi, ''); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowInlineIfUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowInlineIfUnitTest.php deleted file mode 100644 index d921420..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowInlineIfUnitTest.php +++ /dev/null @@ -1,67 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the DisallowObEndFlush sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP\DisallowInlineIfSniff - */ -final class DisallowInlineIfUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'DisallowInlineIfUnitTest.inc': - return [ - 8 => 1, - 18 => 1, - ]; - - case 'DisallowInlineIfUnitTest.js': - return [1 => 1]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowMultipleAssignmentsUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowMultipleAssignmentsUnitTest.1.inc deleted file mode 100644 index 960f907..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowMultipleAssignmentsUnitTest.1.inc +++ /dev/null @@ -1,150 +0,0 @@ -fetch(PDO::FETCH_NUM)) { - $result[$row[0]] = array(); - $result[$row[0]][] = $current; - - self::$_inTransaction = TRUE; - parent::$_inTransaction = TRUE; - static::$_inTransaction = TRUE; - $$varName = $varValue; - } - -}//end getVar() - -class myClass -{ - private static $_dbh = NULL; - public $dbh = NULL; - protected $dbh = NULL; - var $dbh = NULL; // Old PHP4 compatible code. -} - -A::$a = 'b'; -\A::$a = 'c'; -\A\B\C::$d = 'd'; -B\C::$d = 'e'; - -@$a = 1; - -$a = []; -foreach ($a as $b) - $c = 'd'; - -$var = $var2; -list ($a, $b) = explode(',', $c); -$var1 ? $var2 = 0 : $var2 = 1; - -$obj->$classVar = $prefix.'-'.$type; - -$closureWithDefaultParamter = function(array $testArray=array()) {}; -?> - - - 10, - false => 0 - }, -]; - -$arrow_function = fn ($a = null) => $a; - -function ($html) { - $regEx = '/regexp/'; - - return preg_replace_callback($regEx, function ($matches) { - [$all] = $matches; - return $all; - }, $html); -}; - - -function () { - $a = false; - - some_label: - - $b = getB(); -}; - -?> - - -// Issue PHPCSStandards/PHP_CodeSniffer#537. - - - - - - - - - - - - -field = $result; -$filtered_results->$field = $result; -$filtered_results->$row->field = $result; -$filtered_results->$row->$field = $result; - -$filtered_results[ $i ]->field = $result; -$filtered_results[ $i ]->$field = $result; -$filtered_results[ $i ]->$row->field = $result; -$filtered_results[ $i ]->$row->$field = $result; -$filtered_results[ $i ]->$row[0]->field = $result; -$filtered_results[ $i ]->$row[$j]->$field = $result; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowMultipleAssignmentsUnitTest.2.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowMultipleAssignmentsUnitTest.2.inc deleted file mode 100644 index 3befd50..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowMultipleAssignmentsUnitTest.2.inc +++ /dev/null @@ -1,7 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the DisallowMultipleAssignments sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP\DisallowMultipleAssignmentsSniff - */ -final class DisallowMultipleAssignmentsUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the test file to process. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'DisallowMultipleAssignmentsUnitTest.1.inc': - return [ - 4 => 1, - 5 => 2, - 7 => 1, - 9 => 1, - 12 => 1, - 14 => 1, - 15 => 1, - 79 => 1, - 85 => 1, - ]; - - default: - return []; - } - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowSizeFunctionsInLoopsUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowSizeFunctionsInLoopsUnitTest.inc deleted file mode 100644 index 56802e3..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowSizeFunctionsInLoopsUnitTest.inc +++ /dev/null @@ -1,58 +0,0 @@ -children); $i++) { -} - - - -for ($i = 0; $i < sizeof($array); $i++) { -} - -$num = sizeof($array); - -while ($i < sizeof($array)) { -} - -do { -} while ($i < sizeof($array)); - -for ($i = 0; $i < sizeof($this->children); $i++) { -} - - - - -for ($i = 0; $i < strlen($string); $i++) { -} - -$num = strlen($string); - -while ($i < strlen($string)) { -} - -do { -} while ($i < strlen($string)); - -for ($i = 0; $i < strlen($this->string); $i++) { -} - -for ($i = sizeof($array); $i > 0; $i--) { -} - -do { - echo $a->count; - $a->count--; -} while($a->count); - -for ($i = 0; $i < $a->count; $i++) {} -for ($i = 0; $i < $a?->count; $i++) {} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowSizeFunctionsInLoopsUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowSizeFunctionsInLoopsUnitTest.js deleted file mode 100644 index 8f7f7b9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowSizeFunctionsInLoopsUnitTest.js +++ /dev/null @@ -1,13 +0,0 @@ -for (var i = 0; i < permissions.length; i++) { - // Code here. -} - -var permLen = permissions.length; -for (var length = 0; i < permLen; i++) { - // Code here. -} - -var myArray = [1, 2, 3, 4]; -for (var i = myArray.length; i >= 0; i--) { - var x = i; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowSizeFunctionsInLoopsUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowSizeFunctionsInLoopsUnitTest.php deleted file mode 100644 index 91d1b29..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DisallowSizeFunctionsInLoopsUnitTest.php +++ /dev/null @@ -1,77 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the DisallowSizeFunctionsInLoops sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP\DisallowSizeFunctionsInLoopsSniff - */ -final class DisallowSizeFunctionsInLoopsUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'DisallowSizeFunctionsInLoopsUnitTest.inc': - return [ - 2 => 1, - 7 => 1, - 11 => 1, - 13 => 1, - 18 => 1, - 23 => 1, - 27 => 1, - 29 => 1, - 35 => 1, - 40 => 1, - 44 => 1, - 46 => 1, - ]; - - case 'DisallowSizeFunctionsInLoopsUnitTest.js': - return [1 => 1]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DiscouragedFunctionsUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DiscouragedFunctionsUnitTest.inc deleted file mode 100644 index 3c875d0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/DiscouragedFunctionsUnitTest.inc +++ /dev/null @@ -1,7 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the DiscouragedFunctions sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP\DiscouragedFunctionsSniff - */ -final class DiscouragedFunctionsUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return []; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [ - 2 => 1, - 3 => 1, - 4 => 1, - ]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.1.inc deleted file mode 100644 index b4f481d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.1.inc +++ /dev/null @@ -1,296 +0,0 @@ - - - -<?php echo $title ?> - - - - - hello - - - - - - - - - - - - - - - - - - - - - -section as $section) { - ?> - - - - - - section as $section) { - ?> -
    - - - - - - - - -?> - - - - - - - - - - - - - - - - - - - -
    - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - -
    - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -<?php echo $title; ?> - - - - - hello - - - - - - - - - - - - - - - - - - - -section as $section) { - ?> -
    - - - - - section as $section) { - ?> -
    - - - - - - - - - - - - -?> - - - - - - - - - - - - - - - - - - - -
    - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - -
    - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.15.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.15.inc deleted file mode 100644 index d8f0512..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.15.inc +++ /dev/null @@ -1,9 +0,0 @@ - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.16.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.16.inc deleted file mode 100644 index 754c241..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.16.inc +++ /dev/null @@ -1,8 +0,0 @@ - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.17.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.17.inc deleted file mode 100644 index 71de17b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.17.inc +++ /dev/null @@ -1,8 +0,0 @@ - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.18.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.18.inc deleted file mode 100644 index 3d61d48..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.18.inc +++ /dev/null @@ -1,15 +0,0 @@ - - -
    - - -
    -

    Some more content after the last PHP tag block.

    diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.18.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.18.inc.fixed deleted file mode 100644 index 8c906d4..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.18.inc.fixed +++ /dev/null @@ -1,13 +0,0 @@ - - -
    - -
    -

    Some more content after the last PHP tag block.

    diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.19.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.19.inc deleted file mode 100644 index 34db64d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.19.inc +++ /dev/null @@ -1,17 +0,0 @@ - - -
    - - -
    -

    Some more content after the last PHP tag block.

    diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.19.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.19.inc.fixed deleted file mode 100644 index b1738db..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.19.inc.fixed +++ /dev/null @@ -1,15 +0,0 @@ - - -
    - -
    -

    Some more content after the last PHP tag block.

    diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.2.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.2.inc deleted file mode 100644 index 755fd35..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.2.inc +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.2.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.2.inc.fixed deleted file mode 100644 index e9073da..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.2.inc.fixed +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.20.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.20.inc deleted file mode 100644 index 28cdbda..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.20.inc +++ /dev/null @@ -1,15 +0,0 @@ - - -
    - - -
    -

    Some more content after the last PHP tag block.

    diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.20.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.20.inc.fixed deleted file mode 100644 index fcc24a2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.20.inc.fixed +++ /dev/null @@ -1,16 +0,0 @@ - - -
    - - -
    -

    Some more content after the last PHP tag block.

    diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.21.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.21.inc deleted file mode 100644 index 1da67a2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.21.inc +++ /dev/null @@ -1,15 +0,0 @@ - - -
    - - -
    -

    Some more content after the last PHP tag block.

    diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.21.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.21.inc.fixed deleted file mode 100644 index d7487b5..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.21.inc.fixed +++ /dev/null @@ -1,16 +0,0 @@ - - -
    - - -
    -

    Some more content after the last PHP tag block.

    diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.22.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.22.inc deleted file mode 100644 index 5196a3b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.22.inc +++ /dev/null @@ -1,30 +0,0 @@ -
    Inline HTML with indent to demonstrate the bug in the indent calculation.
    - - - - - - - - -Inline HTML with indent to demonstrate the bug in the indent calculation.
    - - - - - - - - - - - -
    - - -
    -

    Some more content after the last PHP tag block.

    diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.24.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.24.inc deleted file mode 100644 index dc1749c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.24.inc +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<?= $title ?> - - - - - hello - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - -// Safeguard fixing when there is no whitespace between the close tag and the contents. - - - - - - - - - -<?= $title; ?> - - - - - hello - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// Safeguard fixing when there is no whitespace between the close tag and the contents. - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.4.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.4.inc.fixed deleted file mode 100644 index b7985cc..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.4.inc.fixed +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.5.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.5.inc deleted file mode 100644 index f4d8d8a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EmbeddedPhpUnitTest.5.inc +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - -
    - - - - - - - -
    - - - - - - - - - - - - -
    - - - - - - -
    - - - - - - - - - - - - - - - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the EmbeddedPhp sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP\EmbeddedPhpSniff - */ -final class EmbeddedPhpUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'EmbeddedPhpUnitTest.1.inc': - return [ - 7 => 1, - 12 => 1, - 18 => 1, - 19 => 2, - 20 => 1, - 21 => 1, - 22 => 3, - 24 => 1, - 26 => 1, - 29 => 1, - 30 => 1, - 31 => 1, - 34 => 1, - 36 => 1, - 40 => 1, - 41 => 1, - 44 => 1, - 45 => 1, - 49 => 1, - 59 => 1, - 63 => 1, - 93 => 1, - 94 => 2, - 100 => 1, - 102 => 1, - 112 => 1, - 113 => 1, - 116 => 1, - 117 => 1, - 120 => 1, - 121 => 1, - 128 => 1, - 129 => 1, - 132 => 1, - 134 => 1, - 136 => 1, - 138 => 1, - 142 => 1, - 145 => 1, - 151 => 1, - 158 => 1, - 165 => 1, - 169 => 1, - 175 => 1, - 176 => 2, - 178 => 2, - 179 => 1, - 180 => 2, - 181 => 1, - 189 => 1, - 212 => 1, - 214 => 2, - 219 => 1, - 223 => 1, - 225 => 1, - 226 => 1, - 227 => 2, - 228 => 1, - 235 => 1, - 241 => 1, - 248 => 1, - 253 => 1, - 258 => 1, - 263 => 1, - 264 => 1, - 270 => 1, - 272 => 1, - 276 => 1, - 279 => 2, - 282 => 2, - ]; - - case 'EmbeddedPhpUnitTest.2.inc': - case 'EmbeddedPhpUnitTest.4.inc': - return [ - 5 => 2, - 6 => 2, - 7 => 2, - ]; - - case 'EmbeddedPhpUnitTest.3.inc': - return [ - 10 => 1, - 15 => 1, - 21 => 1, - 22 => 2, - 23 => 1, - 24 => 1, - 25 => 3, - 28 => 1, - 29 => 1, - 30 => 1, - 33 => 1, - 35 => 1, - 39 => 1, - 40 => 1, - 43 => 1, - 44 => 1, - 48 => 1, - 53 => 1, - 55 => 1, - 61 => 1, - 62 => 1, - 65 => 2, - 66 => 2, - 69 => 1, - 70 => 1, - 75 => 1, - 82 => 1, - 89 => 1, - 93 => 1, - 98 => 2, - 99 => 1, - 103 => 2, - 105 => 1, - 111 => 1, - 112 => 2, - 114 => 2, - 115 => 1, - 116 => 2, - 117 => 1, - ]; - - case 'EmbeddedPhpUnitTest.5.inc': - return [ - 16 => 1, - 18 => 1, - 25 => 1, - 26 => 1, - 29 => 1, - 31 => 1, - 33 => 1, - 35 => 1, - 39 => 1, - 42 => 1, - ]; - - case 'EmbeddedPhpUnitTest.12.inc': - case 'EmbeddedPhpUnitTest.13.inc': - return [ - 10 => 1, - 12 => 1, - ]; - - case 'EmbeddedPhpUnitTest.18.inc': - return [11 => 1]; - - case 'EmbeddedPhpUnitTest.19.inc': - return [13 => 1]; - - case 'EmbeddedPhpUnitTest.20.inc': - case 'EmbeddedPhpUnitTest.21.inc': - return [12 => 2]; - - case 'EmbeddedPhpUnitTest.22.inc': - return [ - 14 => 1, - 22 => 1, - ]; - - case 'EmbeddedPhpUnitTest.24.inc': - $shortOpenTagDirective = (bool) ini_get('short_open_tag'); - if ($shortOpenTagDirective === true) { - return [ - 18 => 1, - 20 => 1, - ]; - } - return []; - - case 'EmbeddedPhpUnitTest.25.inc': - if (PHP_VERSION_ID >= 70300) { - return [ - 12 => 2, - 14 => 2, - ]; - } - - // PHP 7.2 or lower: PHP version which doesn't support flexible heredocs/nowdocs yet. - return []; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EvalUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EvalUnitTest.inc deleted file mode 100644 index ee4c73e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EvalUnitTest.inc +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EvalUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EvalUnitTest.php deleted file mode 100644 index 632c63f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/EvalUnitTest.php +++ /dev/null @@ -1,56 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the Eval sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP\EvalSniff - */ -final class EvalUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return []; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [ - 2 => 1, - 4 => 1, - ]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/GlobalKeywordUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/GlobalKeywordUnitTest.inc deleted file mode 100644 index 4b2a210..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/GlobalKeywordUnitTest.inc +++ /dev/null @@ -1,13 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/GlobalKeywordUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/GlobalKeywordUnitTest.php deleted file mode 100644 index 3f1f891..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/GlobalKeywordUnitTest.php +++ /dev/null @@ -1,56 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the GlobalKeyword sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP\GlobalKeywordSniff - */ -final class GlobalKeywordUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 8 => 1, - 9 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/HeredocUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/HeredocUnitTest.1.inc deleted file mode 100644 index d1863c0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/HeredocUnitTest.1.inc +++ /dev/null @@ -1,12 +0,0 @@ -foo. -Now, I am printing some {$foo->bar[1]}. -This should not print a capital 'A': \x41 -EOT; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/HeredocUnitTest.2.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/HeredocUnitTest.2.inc deleted file mode 100644 index eb0062f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/HeredocUnitTest.2.inc +++ /dev/null @@ -1,17 +0,0 @@ - 'a' -<<<<<<< HEAD - 'b' => 'b' -======= - 'c' => 'c' ->>>>>>> master - ); - } diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/HeredocUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/HeredocUnitTest.php deleted file mode 100644 index a9dd145..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/HeredocUnitTest.php +++ /dev/null @@ -1,64 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the Heredoc sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP\HeredocSniff - */ -final class HeredocUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'HeredocUnitTest.1.inc': - return [ - 2 => 1, - 8 => 1, - ]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/InnerFunctionsUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/InnerFunctionsUnitTest.inc deleted file mode 100644 index d16c7f2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/InnerFunctionsUnitTest.inc +++ /dev/null @@ -1,87 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the InnerFunctions sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP\InnerFunctionsSniff - */ -final class InnerFunctionsUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 5 => 1, - 46 => 1, - 55 => 1, - 83 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/LowercasePHPFunctionsUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/LowercasePHPFunctionsUnitTest.inc deleted file mode 100644 index 702b13d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/LowercasePHPFunctionsUnitTest.inc +++ /dev/null @@ -1,50 +0,0 @@ -Count(); -$count = $object::Count(); -$count = $object->count(); -$count = $object::count(); -class MyClass { - public function Count() {} -} - -function &Sort() { - -} - -$connection = new Db\Adapter\Pdo\Mysql($config); - -namespace Strtolower\Silly; - -use function strToUpper as somethingElse; -use function MyClass\WordsToUpper as UCWords; // Intentional redeclared function error. -use function strToUpper\NotTheFunction; - -class ArrayUnique {} - -$sillyComments = strToLower /*comment*/ ($string); - -$callToGlobalFunction = \STR_REPEAT($a, 2); -$callToGlobalFunction = \ /*comment*/ str_Repeat($a, 2); - -$callToNamespacedFunction = MyNamespace /* phpcs:ignore Standard */ \STR_REPEAT($a, 2); -$callToNamespacedFunction = namespace\STR_REPEAT($a, 2); // Could potentially be false negative. - -$filePath = new \File($path); - -$count = $object?->Count(); - -class AttributesShouldBeIgnored -{ - #[Putenv('FOO', 'foo')] - public function foo(): void - {} -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/LowercasePHPFunctionsUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/LowercasePHPFunctionsUnitTest.inc.fixed deleted file mode 100644 index 281425c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/LowercasePHPFunctionsUnitTest.inc.fixed +++ /dev/null @@ -1,50 +0,0 @@ -Count(); -$count = $object::Count(); -$count = $object->count(); -$count = $object::count(); -class MyClass { - public function Count() {} -} - -function &Sort() { - -} - -$connection = new Db\Adapter\Pdo\Mysql($config); - -namespace Strtolower\Silly; - -use function strtoupper as somethingElse; -use function MyClass\WordsToUpper as UCWords; // Intentional redeclared function error. -use function strToUpper\NotTheFunction; - -class ArrayUnique {} - -$sillyComments = strtolower /*comment*/ ($string); - -$callToGlobalFunction = \str_repeat($a, 2); -$callToGlobalFunction = \ /*comment*/ str_repeat($a, 2); - -$callToNamespacedFunction = MyNamespace /* phpcs:ignore Standard */ \STR_REPEAT($a, 2); -$callToNamespacedFunction = namespace\STR_REPEAT($a, 2); // Could potentially be false negative. - -$filePath = new \File($path); - -$count = $object?->Count(); - -class AttributesShouldBeIgnored -{ - #[Putenv('FOO', 'foo')] - public function foo(): void - {} -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/LowercasePHPFunctionsUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/LowercasePHPFunctionsUnitTest.php deleted file mode 100644 index 037f3fb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/LowercasePHPFunctionsUnitTest.php +++ /dev/null @@ -1,60 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the LowercasePHPFunctions sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP\LowercasePHPFunctionsSniff - */ -final class LowercasePHPFunctionsUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 2 => 1, - 4 => 1, - 27 => 1, - 33 => 1, - 35 => 1, - 36 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/NonExecutableCodeUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/NonExecutableCodeUnitTest.1.inc deleted file mode 100644 index 87a1409..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/NonExecutableCodeUnitTest.1.inc +++ /dev/null @@ -1,434 +0,0 @@ -{$action . 'JsonAction'}(); -} - -switch (true) { - case 1: - return foo( - function () { - $foo = $bar; // when this is removed it works ok - return false; // from here on it reports unreachable - } - ); -} - -for($i=0,$j=50; $i<100; $i++) { - while($j--) { - if($j==17) { - goto end; - echo 'unreachable'; - } - } -} - -switch ($var) { - case '1': - goto end; - echo 'hi'; - - case '2': - case '3': - if ($something === true) { - goto end; - echo 'hi'; - } - break; - default: - goto end; - - if ($something === true) { - goto end; - echo 'hi'; - } -} - -end: -echo 'j hit 17'; - -// Issue 2512. -class TestAlternativeControlStructures { - - public function alternative_switch_in_function( $var ) { - - switch ( $var ) : - case 'value1': - do_something(); - break; - - default: - case 'value2': - do_something_else(); - break; - endswitch; - } - - public function various_alternative_control_structures() { - $_while = 1; - - for ( $a = 0; $a++ < 1; ) : - foreach ( [ 1 ] as $b ) : - while ( $_while-- ) : - if ( 1 ) : - switch ( 1 ) : - default: - echo 'yay, we made it!'; - break; - endswitch; - endif; - endwhile; - endforeach; - endfor; - } -} - -$var_after_class_in_global_space = 1; -do_something_else(); - -// These are parse errors, but that's not the concern of the sniff. -function parseError1() { - defined('FOO') or return 'foo'; - echo 'unreachable'; -} - -function parseError2() { - defined('FOO') || continue; - echo 'unreachable'; -} - -// All logical operators are allowed with inline expressions (but this was not correctly handled by the sniff). -function exitExpressionsWithLogicalOperators() { - $condition = false; - $condition || \exit(); - $condition or die(); - - $condition = true; - $condition && die(); - $condition and exit; - - $condition xor die(); - - echo 'still executable as exit, in all of the above cases, is used as part of an expression'; -} - -// Inline expressions are allowed in ternaries. -function exitExpressionsInTernary() { - $value = $myValue ? $myValue : exit(); - $value = $myValue ?: exit(); - $value = $var == 'foo' ? 'bar' : \die( 'world' ); - - $value = (!$myValue ) ? exit() : $myValue; - $value = $var != 'foo' ? die( 'world' ) : 'bar'; - - echo 'still executable'; -} - -// Inline expressions are allowed with null coalesce and null coalesce equals. -function exitExpressionsWithNullCoalesce() { - $value = $nullableValue ?? exit(); - $value ??= die(); - echo 'still executable'; -} - -// Inline expressions are allowed in arrow functions. -function exitExpressionsInArrowFunction() { - $callable = fn() => die(); - echo 'still executable'; -} - -// PHP 8.0+: throw expressions which don't stop execution. -function nonStoppingThrowExpressions() { - $callable = fn() => throw new Exception(); - - $value = $myValue ? 'something' : throw new Exception(); - $value = $myValue ?: throw new Exception(); - $value = $myValue ? throw new Exception() : 'something'; - - $value = $nullableValue ?? throw new Exception(); - $value ??= throw new Exception(); - - $condition && throw new Exception(); - $condition || throw new Exception(); - $condition and throw new Exception(); - $condition or throw new Exception(); - - echo 'still executable as throw, in all of the above cases, is used as part of an expression'; - - throw new Exception(); - echo 'non-executable'; -} - -// PHP 8.0+: throw expressions which do stop execution. -function executionStoppingThrowExpressionsA() { - $condition xor throw new Exception(); - echo 'non-executable'; -} - -function executionStoppingThrowExpressionsB() { - throw $userIsAuthorized ? new ForbiddenException() : new UnauthorizedException(); - echo 'non-executable'; -} - -function executionStoppingThrowExpressionsC() { - throw $condition1 && $condition2 ? new Exception1() : new Exception2(); - echo 'non-executable'; -} - -function executionStoppingThrowExpressionsD() { - throw $exception ??= new Exception(); - echo 'non-executable'; -} - -function executionStoppingThrowExpressionsE() { - throw $maybeNullException ?? new Exception(); - echo 'non-executable'; -} - -function returnNotRequiredIgnoreCommentsA() -{ - if ($something === TRUE) { - return /*comment*/; - } - - echo 'foo'; - return /*comment*/; -} - -function returnNotRequiredIgnoreCommentsB() -{ - echo 'foo'; - return; - /*comment*/ -} - -$closure = function () -{ - echo 'foo'; - return; // This return should be flagged as not required. -}; - -function fqnExitWithCodeAfter() { - do_something(); - exit(); - do_something_else(); -} - -function fqnExitInControlStructureWithCodeAfter() { - if(do_something()) { - die(); - do_something_else(); - } - do_something_else(); -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/NonExecutableCodeUnitTest.2.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/NonExecutableCodeUnitTest.2.inc deleted file mode 100644 index 9b7a22b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/NonExecutableCodeUnitTest.2.inc +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - -
    non-executable
    - - - - - - - - -
    non-executable
    - - - - - - - - -
    non-executable
    - - - - - - - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/NonExecutableCodeUnitTest.4.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/NonExecutableCodeUnitTest.4.inc deleted file mode 100644 index 189466b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/PHP/NonExecutableCodeUnitTest.4.inc +++ /dev/null @@ -1,6 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\PHP; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the NonExecutableCode sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP\NonExecutableCodeSniff - */ -final class NonExecutableCodeUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return []; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getWarningList($testFile='') - { - switch ($testFile) { - case 'NonExecutableCodeUnitTest.1.inc': - return [ - 5 => 1, - 11 => 1, - 17 => 1, - 18 => 1, - 19 => 2, - 28 => 1, - 32 => 1, - 33 => 2, - 34 => 2, - 42 => 1, - 45 => 1, - 54 => 1, - 58 => 1, - 73 => 1, - 83 => 1, - 95 => 1, - 105 => 1, - 123 => 1, - 147 => 1, - 150 => 1, - 153 => 1, - 166 => 1, - 180 => 1, - 232 => 1, - 240 => 1, - 246 => 1, - 252 => 1, - 253 => 1, - 254 => 2, - 303 => 1, - 308 => 1, - 370 => 1, - 376 => 1, - 381 => 1, - 386 => 1, - 391 => 1, - 396 => 1, - 406 => 1, - 412 => 1, - 419 => 1, - 425 => 1, - 431 => 1, - ]; - - case 'NonExecutableCodeUnitTest.2.inc': - return [ - 7 => 1, - 8 => 1, - 9 => 1, - 10 => 2, - 14 => 1, - 54 => 2, - 65 => 2, - 69 => 2, - 70 => 2, - 71 => 2, - ]; - - case 'NonExecutableCodeUnitTest.3.inc': - return [ - 27 => 1, - 36 => 1, - 45 => 1, - 54 => 1, - 62 => 1, - ]; - default: - return []; - }//end switch - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Scope/MemberVarScopeUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Scope/MemberVarScopeUnitTest.inc deleted file mode 100644 index e14477f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Scope/MemberVarScopeUnitTest.inc +++ /dev/null @@ -1,91 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Scope; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the MemberVarScope sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Scope\MemberVarScopeSniff - */ -final class MemberVarScopeUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 7 => 1, - 25 => 1, - 29 => 1, - 33 => 1, - 39 => 1, - 41 => 1, - 66 => 2, - 67 => 1, - 75 => 1, - 80 => 1, - 81 => 1, - 82 => 1, - 90 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - // Warning from getMemberProperties() about parse error. - return [71 => 1]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Scope/MethodScopeUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Scope/MethodScopeUnitTest.inc deleted file mode 100644 index 3cc617d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Scope/MethodScopeUnitTest.inc +++ /dev/null @@ -1,57 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Scope; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the MethodScope sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Scope\MethodScopeSniff - */ -final class MethodScopeUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 6 => 1, - 30 => 1, - 39 => 1, - 46 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Scope/StaticThisUsageUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Scope/StaticThisUsageUnitTest.inc deleted file mode 100644 index dd6530e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Scope/StaticThisUsageUnitTest.inc +++ /dev/null @@ -1,127 +0,0 @@ -func2()); - $result = $this->getValue($value); - return $this->setValue($result); - } - - public static function /* */ func1() - { - return $this->setValue($result); - } - - public static function - func1() - { - return $this->setValue($result); - } - - public function func1() - { - $value = 'hello'; - $newValue = array($this->func2()); - $result = $this->getValue($value); - return $this->setValue($result); - } - - function func1() - { - $value = 'hello'; - $newValue = array($this->func2()); - $result = $this->getValue($value); - return $this->setValue($result); - } - - public static function func1() { - return function() { - echo $this->name; - }; - } - - private static function func1(array $data) - { - return new class() - { - private $data; - - public function __construct(array $data) - { - $this->data = $data; - } - }; - } - - public function getAnonymousClass() { - return new class() { - public static function something() { - $this->doSomething(); - } - }; - } -} - -trait MyTrait { - public static function myFunc() { - $this->doSomething(); - } -} - -$b = new class() -{ - public static function myFunc() { - $this->doSomething(); - } - - public static function other() { - return fn () => $this->name; - } - - public static function anonClassUseThis() { - return new class($this) { - public function __construct($class) { - } - }; - } - - public static function anonClassAnotherThis() { - return new class() { - public function __construct() { - $this->id = 1; - } - }; - } - - public static function anonClassNestedUseThis() { - return new class(new class($this) {}) { - }; - } - - public static function anonClassNestedAnotherThis() { - return new class(new class() { - public function __construct() { - $this->id = 1; - } - }) { - }; - } - - public static function thisMustBeLowercase() { - $This = 'hey'; - - return $This; - } -} - -enum MyEnum { - private function notStatic () { - $this->doSomething(); - } - - public static function myFunc() { - $this->doSomething(); - } -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Scope/StaticThisUsageUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Scope/StaticThisUsageUnitTest.php deleted file mode 100644 index c9e77a5..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Scope/StaticThisUsageUnitTest.php +++ /dev/null @@ -1,67 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Scope; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the StaticThisUsage sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Scope\StaticThisUsageSniff - */ -final class StaticThisUsageUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 7 => 1, - 8 => 1, - 9 => 1, - 14 => 1, - 20 => 1, - 41 => 1, - 61 => 1, - 69 => 1, - 76 => 1, - 80 => 1, - 84 => 1, - 99 => 1, - 125 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/ConcatenationSpacingUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/ConcatenationSpacingUnitTest.inc deleted file mode 100644 index 3bf4186..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/ConcatenationSpacingUnitTest.inc +++ /dev/null @@ -1,49 +0,0 @@ -add_help_tab( array( -'id' => <<', -) ); - -// phpcs:set Squiz.Strings.ConcatenationSpacing spacing 1 - -$string = 'Hello'.$there.'. How are'.$you.$going. "today $okay"; -$string = 'Hello' . $there . '. How are' . $you . $going . "today $okay"; -$string = 'Hello'.$there; -$string = 'Hello'. $there; -$string = 'Hello' .$there; - -// phpcs:set Squiz.Strings.ConcatenationSpacing ignoreNewlines true -$y = '1' - . '2' - . '3'; - -$y = '1' . - '2' . - '3'; - -$y = '1' -. '2' -. '3'; - -$y = '1' - .'2'. - '3' - . '4'; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/ConcatenationSpacingUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/ConcatenationSpacingUnitTest.inc.fixed deleted file mode 100644 index b45f1a4..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/ConcatenationSpacingUnitTest.inc.fixed +++ /dev/null @@ -1,47 +0,0 @@ -add_help_tab( array( -'id' => <<', -) ); - -// phpcs:set Squiz.Strings.ConcatenationSpacing spacing 1 - -$string = 'Hello' . $there . '. How are' . $you . $going . "today $okay"; -$string = 'Hello' . $there . '. How are' . $you . $going . "today $okay"; -$string = 'Hello' . $there; -$string = 'Hello' . $there; -$string = 'Hello' . $there; - -// phpcs:set Squiz.Strings.ConcatenationSpacing ignoreNewlines true -$y = '1' - . '2' - . '3'; - -$y = '1' . - '2' . - '3'; - -$y = '1' -. '2' -. '3'; - -$y = '1' - . '2' . - '3' - . '4'; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/ConcatenationSpacingUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/ConcatenationSpacingUnitTest.php deleted file mode 100644 index da4a8d1..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/ConcatenationSpacingUnitTest.php +++ /dev/null @@ -1,71 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Strings; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ConcatenationSpacing sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Strings\ConcatenationSpacingSniff - */ -final class ConcatenationSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 3 => 5, - 5 => 1, - 6 => 1, - 9 => 1, - 10 => 1, - 12 => 1, - 13 => 1, - 14 => 1, - 15 => 1, - 16 => 5, - 22 => 1, - 27 => 5, - 29 => 1, - 30 => 1, - 31 => 1, - 47 => 2, - 49 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/DoubleQuoteUsageUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/DoubleQuoteUsageUnitTest.inc deleted file mode 100644 index c8cc638..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/DoubleQuoteUsageUnitTest.inc +++ /dev/null @@ -1,37 +0,0 @@ -"; -$string = "Value: $var[test]"; -$string = "\0"; -$string = "\$var"; - -$x = "bar = '$z', -baz = '" . $a . "'...$x"; - -$string = "Hello -there"; -$string = 'Hello -there'; - -$string = "\123 \234"."\u123"."\e"; - -echo "window.location = \"".$url."\";\n"; -echo "" - -$string = "Hello - there"; - -function test() { - echo "It Worked'; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/DoubleQuoteUsageUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/DoubleQuoteUsageUnitTest.inc.fixed deleted file mode 100644 index 9730919..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/DoubleQuoteUsageUnitTest.inc.fixed +++ /dev/null @@ -1,37 +0,0 @@ -"; -$string = "Value: $var[test]"; -$string = "\0"; -$string = '$var'; - -$x = "bar = '$z', -baz = '" . $a . "'...$x"; - -$string = 'Hello -there'; -$string = 'Hello -there'; - -$string = "\123 \234"."\u123"."\e"; - -echo 'window.location = "'.$url."\";\n"; -echo '' - -$string = 'Hello - there'; - -function test() { - echo "It Worked'; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/DoubleQuoteUsageUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/DoubleQuoteUsageUnitTest.php deleted file mode 100644 index fc34098..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/DoubleQuoteUsageUnitTest.php +++ /dev/null @@ -1,67 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Strings; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the DoubleQuoteUsage sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Strings\DoubleQuoteUsageSniff - */ -final class DoubleQuoteUsageUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 4 => 1, - 5 => 1, - 6 => 1, - 8 => 2, - 14 => 1, - 15 => 1, - 17 => 1, - 19 => 1, - 20 => 1, - 22 => 1, - 29 => 1, - 30 => 1, - 32 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/EchoedStringsUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/EchoedStringsUnitTest.inc deleted file mode 100644 index 9e0391d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/EchoedStringsUnitTest.inc +++ /dev/null @@ -1,13 +0,0 @@ -returndate == 0) ? 'Not returned' : date('d/m/Y', $loan_device->returndate); -?> -

    -

    diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/EchoedStringsUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/EchoedStringsUnitTest.inc.fixed deleted file mode 100644 index 37c7d24..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/EchoedStringsUnitTest.inc.fixed +++ /dev/null @@ -1,13 +0,0 @@ -returndate == 0) ? 'Not returned' : date('d/m/Y', $loan_device->returndate); -?> -

    -

    diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/EchoedStringsUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/EchoedStringsUnitTest.php deleted file mode 100644 index ea61e12..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/Strings/EchoedStringsUnitTest.php +++ /dev/null @@ -1,60 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\Strings; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the EchoedStrings sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\Strings\EchoedStringsSniff - */ -final class EchoedStringsUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 5 => 1, - 6 => 1, - 7 => 1, - 8 => 1, - 9 => 1, - 13 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/CastSpacingUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/CastSpacingUnitTest.inc deleted file mode 100644 index fa65112..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/CastSpacingUnitTest.inc +++ /dev/null @@ -1,9 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the CastSpacing sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace\CastSpacingSniff - */ -final class CastSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 3 => 1, - 4 => 1, - 5 => 1, - 6 => 1, - 9 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.inc deleted file mode 100644 index 70abae4..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.inc +++ /dev/null @@ -1,269 +0,0 @@ - -
    - - - -
    - children as $child) { - // There should be no error after this - // foreach, because it is followed by a - // close PHP tag. - } - ?> -
    -children as $child) { - echo $child; - -} - -if ($defaultPageDesign === 0 - && $defaultCascade === TRUE - && $defaultChildDesign === 0 -) { - $settingsUpdated = FALSE; -} - -foreach ( $blah as $var ) { - if ( $blah ) { - } -} - -if ( - $defaultPageDesign === 0 - && $defaultCascade === TRUE - && $defaultChildDesign === 0 -) { - $settingsUpdated = FALSE; -} - -$moo = 'blar'; -switch ($moo) -{ - case 'blar': - if ($moo === 'blar2') { - $moo = 'blar' - } - return $moo; - - default: - $moo = 'moo'; - break; -} - -do { -} -while (true); - -try { - // Something -} catch (Exception $e) { - // Something -} - -try { - - // Something - -} catch (Exception $e) { - - // Something - -} - -if ($one) { -} -elseif ($two) { -} -// else if something -else if ($three) { -} // else do something -else { -} - -if ($one) { - -} - -do { - echo 'hi'; -} while ( $blah ); - -if ($one) { -} -// No blank line here. -if ($two) { -} - -switch ($moo) -{ - case 'blar': - if ($moo === 'blar2') { - $moo = 'blar' - } - - return $moo; -} - -try { - // Something -} -catch (Exception $e) { - // Something -} -finally { - // Something -} - -if ($foo) { - - - /** - * Comment - */ - function foo() { - // Code here - } - - - /** - * Comment - */ - class bar() { - - }//end class - - -} - -if (true) { // some comment goes here - - echo 'foo'; -} - -if (true) { echo 'foo'; - - echo 'foo'; -} - -if ($true) { - echo 'hi 2'; -}//end if -echo 'hi'; - -if ($true) { - echo 'hi 2'; -} // phpcs:enable Standard.Category.Sniff -- for reasons. -echo 'hi'; - -?> - - - - - - - 1, - 2 => 2, - -}; -echo $expr; - -if($true) { - - enum SomeEnum {} - -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.inc.fixed deleted file mode 100644 index c64de25..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.inc.fixed +++ /dev/null @@ -1,261 +0,0 @@ - - - - - -
    - children as $child) { - // There should be no error after this - // foreach, because it is followed by a - // close PHP tag. - } - ?> -
    -children as $child) { - echo $child; -} - -if ($defaultPageDesign === 0 - && $defaultCascade === TRUE - && $defaultChildDesign === 0 -) { - $settingsUpdated = FALSE; -} - -foreach ($blah as $var) { - if ($blah) { - } -} - -if ($defaultPageDesign === 0 - && $defaultCascade === TRUE - && $defaultChildDesign === 0 -) { - $settingsUpdated = FALSE; -} - -$moo = 'blar'; -switch ($moo) -{ - case 'blar': - if ($moo === 'blar2') { - $moo = 'blar' - } - return $moo; - - default: - $moo = 'moo'; - break; -} - -do { -} -while (true); - -try { - // Something -} catch (Exception $e) { - // Something -} - -try { - // Something -} catch (Exception $e) { - // Something -} - -if ($one) { -} -elseif ($two) { -} -// else if something -else if ($three) { -} // else do something -else { -} - -if ($one) { -} - -do { - echo 'hi'; -} while ($blah); - -if ($one) { -} - -// No blank line here. -if ($two) { -} - -switch ($moo) -{ - case 'blar': - if ($moo === 'blar2') { - $moo = 'blar' - } - return $moo; -} - -try { - // Something -} -catch (Exception $e) { - // Something -} -finally { - // Something -} - -if ($foo) { - - - /** - * Comment - */ - function foo() { - // Code here - } - - - /** - * Comment - */ - class bar() { - - }//end class - - -} - -if (true) { // some comment goes here - echo 'foo'; -} - -if (true) { echo 'foo'; - - echo 'foo'; -} - -if ($true) { - echo 'hi 2'; -}//end if - -echo 'hi'; - -if ($true) { - echo 'hi 2'; -} // phpcs:enable Standard.Category.Sniff -- for reasons. - -echo 'hi'; - -?> - - - - - - 1, - 2 => 2, -}; - -echo $expr; - -if($true) { - - enum SomeEnum {} - -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.js deleted file mode 100644 index 1c889a1..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.js +++ /dev/null @@ -1,93 +0,0 @@ - -if (something) { -} -for (i = 0; i < 10; i++) { -} - -while (true) { - for (i = 0; i < 10; i++) { - } - if (something) { - } - - do { - } while (true); - -} - -if (one) { -} else (two) { -} else if (three) { -} -if (one) { -} else (two) { -} else if (three) { -} - -switch (blah) { - case 'one': - if (blah) { - // There are no spaces before break. - } - break; - - default: - if (blah) { - // There are no spaces before break. - } - break; -} - -switch (blah) { - case 'one': - if (blah) { - // There are no spaces before break. - } - break; - - default: - if (blah) { - // Code here. - } -} - -for (i = 0; i < 10; i++) { - if (blah) { - } - break; -} - -while (true) { - for (i = 0; i < 10; i++) { - - if (something) { - } - - } - - do { - - alert(i); - } while (true); -} - -for ( i = 0; i < 10; i++ ) { - if ( blah ) { - } -} - -var x = { - a: function () { - if (blah) { - } - - }, -}; - -if (one) { -} -// else if something -else if (two) { -} // else do something -else { -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.js.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.js.fixed deleted file mode 100644 index bb979bc..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.js.fixed +++ /dev/null @@ -1,93 +0,0 @@ - -if (something) { -} - -for (i = 0; i < 10; i++) { -} - -while (true) { - for (i = 0; i < 10; i++) { - } - - if (something) { - } - - do { - } while (true); -} - -if (one) { -} else (two) { -} else if (three) { -} - -if (one) { -} else (two) { -} else if (three) { -} - -switch (blah) { - case 'one': - if (blah) { - // There are no spaces before break. - } - break; - - default: - if (blah) { - // There are no spaces before break. - } - break; -} - -switch (blah) { - case 'one': - if (blah) { - // There are no spaces before break. - } - break; - - default: - if (blah) { - // Code here. - } -} - -for (i = 0; i < 10; i++) { - if (blah) { - } - - break; -} - -while (true) { - for (i = 0; i < 10; i++) { - if (something) { - } - } - - do { - alert(i); - } while (true); -} - -for (i = 0; i < 10; i++) { - if (blah) { - } -} - -var x = { - a: function () { - if (blah) { - } - - }, -}; - -if (one) { -} -// else if something -else if (two) { -} // else do something -else { -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.php deleted file mode 100644 index 71a0702..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ControlStructureSpacingUnitTest.php +++ /dev/null @@ -1,107 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ControlStructureSpacing sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace\ControlStructureSpacingSniff - */ -final class ControlStructureSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'ControlStructureSpacingUnitTest.inc': - return [ - 3 => 1, - 5 => 1, - 8 => 1, - 15 => 1, - 23 => 1, - 74 => 1, - 79 => 1, - 82 => 1, - 83 => 1, - 87 => 1, - 103 => 1, - 113 => 2, - 114 => 2, - 118 => 1, - 150 => 1, - 153 => 1, - 154 => 1, - 157 => 1, - 170 => 1, - 176 => 2, - 179 => 1, - 189 => 1, - 225 => 1, - 237 => 1, - 242 => 1, - 246 => 1, - 248 => 1, - 257 => 3, - 261 => 1, - 262 => 1, - ]; - - case 'ControlStructureSpacingUnitTest.js': - return [ - 3 => 1, - 9 => 1, - 15 => 1, - 21 => 1, - 56 => 1, - 61 => 1, - 64 => 1, - 65 => 1, - 68 => 1, - 74 => 2, - 75 => 2, - ]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionClosingBraceSpaceUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionClosingBraceSpaceUnitTest.inc deleted file mode 100644 index 8c8daf1..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionClosingBraceSpaceUnitTest.inc +++ /dev/null @@ -1,90 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the FunctionClosingBraceSpace sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace\FunctionClosingBraceSpaceSniff - */ -final class FunctionClosingBraceSpaceUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'FunctionClosingBraceSpaceUnitTest.inc': - return [ - 10 => 1, - 21 => 1, - 28 => 1, - 29 => 1, - 31 => 1, - 39 => 1, - 66 => 1, - 72 => 1, - 81 => 1, - 88 => 1, - ]; - - case 'FunctionClosingBraceSpaceUnitTest.js': - return [ - 13 => 1, - 25 => 1, - 32 => 1, - 53 => 1, - 59 => 1, - 67 => 1, - 84 => 1, - 128 => 1, - ]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionOpeningBraceSpaceUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionOpeningBraceSpaceUnitTest.inc deleted file mode 100644 index fe2c903..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionOpeningBraceSpaceUnitTest.inc +++ /dev/null @@ -1,54 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the FunctionOpeningBraceSpace sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace\FunctionOpeningBraceSpaceSniff - */ -final class FunctionOpeningBraceSpaceUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'FunctionOpeningBraceSpaceUnitTest.inc': - return [ - 10 => 1, - 25 => 1, - 49 => 1, - ]; - - case 'FunctionOpeningBraceSpaceUnitTest.js': - return [ - 11 => 1, - 31 => 1, - 38 => 1, - 88 => 1, - ]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionSpacingUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionSpacingUnitTest.1.inc deleted file mode 100644 index 83600e8..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/FunctionSpacingUnitTest.1.inc +++ /dev/null @@ -1,752 +0,0 @@ -setLogger(new class { - public function a(){} - private function b(){} - protected function c(){} -}); - -?> - -setLogger(new class { - - public function a(){} - - private function b(){} - - protected function c(){} - -}); - -?> - - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the FunctionSpacing sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace\FunctionSpacingSniff - */ -final class FunctionSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'FunctionSpacingUnitTest.1.inc': - return [ - 26 => 1, - 35 => 1, - 44 => 1, - 51 => 1, - 55 => 1, - 61 => 1, - 64 => 1, - 66 => 1, - 81 => 1, - 100 => 1, - 111 => 1, - 113 => 1, - 119 => 2, - 141 => 1, - 160 => 1, - 173 => 2, - 190 => 1, - 224 => 2, - 281 => 1, - 282 => 1, - 295 => 1, - 297 => 1, - 303 => 1, - 327 => 1, - 329 => 1, - 338 => 1, - 344 => 1, - 345 => 1, - 354 => 2, - 355 => 1, - 356 => 1, - 360 => 2, - 361 => 1, - 362 => 1, - 385 => 1, - 399 => 1, - 411 => 2, - 418 => 2, - 426 => 2, - 432 => 1, - 437 => 1, - 438 => 1, - 442 => 2, - 444 => 1, - 449 => 1, - 458 => 2, - 459 => 1, - 460 => 1, - 465 => 2, - 466 => 1, - 467 => 1, - 471 => 1, - 473 => 2, - 475 => 1, - 478 => 2, - 479 => 1, - 483 => 2, - 495 => 1, - 529 => 1, - 539 => 1, - 547 => 2, - 551 => 1, - 553 => 1, - 560 => 1, - 566 => 1, - 580 => 2, - 583 => 4, - 591 => 1, - 627 => 1, - 641 => 1, - 672 => 1, - 686 => 1, - 714 => 1, - 717 => 1, - 727 => 1, - 749 => 1, - ]; - - case 'FunctionSpacingUnitTest.2.inc': - return [2 => 1]; - - case 'FunctionSpacingUnitTest.3.inc': - return [7 => 1]; - - case 'FunctionSpacingUnitTest.5.inc': - return [5 => 1]; - - case 'FunctionSpacingUnitTest.6.inc': - return [10 => 1]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/LanguageConstructSpacingUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/LanguageConstructSpacingUnitTest.inc deleted file mode 100644 index e8f2eda..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/LanguageConstructSpacingUnitTest.inc +++ /dev/null @@ -1,43 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the LanguageConstructSpacing sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace\LanguageConstructSpacingSniff - */ -final class LanguageConstructSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 3 => 1, - 7 => 1, - 11 => 1, - 15 => 1, - 19 => 1, - 23 => 1, - 27 => 1, - 31 => 1, - 34 => 1, - 35 => 1, - 39 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/LogicalOperatorSpacingUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/LogicalOperatorSpacingUnitTest.inc deleted file mode 100644 index c2f4ec7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/LogicalOperatorSpacingUnitTest.inc +++ /dev/null @@ -1,19 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the LogicalOperatorSpacing sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace\LogicalOperatorSpacingSniff - */ -final class LogicalOperatorSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 4 => 2, - 5 => 3, - 6 => 3, - 15 => 1, - 17 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/MemberVarSpacingUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/MemberVarSpacingUnitTest.1.inc deleted file mode 100644 index af4bfb3..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/MemberVarSpacingUnitTest.1.inc +++ /dev/null @@ -1,474 +0,0 @@ - 'a', 'b' => 'b' ), - $varQ = 'string', - $varR = 123; -} - -// Make sure the determination of whether a property is the first property or not is done correctly. -class ClassUsingSimpleTraits -{ - use HelloWorld; - - - /* comment */ - public $firstVar = array( 'a', 'b' ); - protected $secondVar = true; -} - -class ClassUsingComplexTraits -{ - use A, B { - B::smallTalk insteadof A; - A::bigTalk insteadof B; - } - - - - public $firstVar = array( 'a', 'b' ); - - - /* comment */ - protected $secondVar = true; -} - -class Foo -{ - - - private function foo() - { - } - - - /* no error here because after function */ - private $bar = false; -} - -class CommentedOutCodeAtStartOfClass { - - /** - * Description. - * - * @var bool - */ - //public $commented_out_property = true; - - /** - * Description. - * - * @var bool - */ - public $property = true; -} - -class CommentedOutCodeAtStartOfClassNoBlankLine { - - // phpcs:disable Stnd.Cat.Sniff -- For reasons. - /** - * Description. - * - * @var bool - */ - public $property = true; -} - -class HasAttributes -{ - /** - * Short description of the member variable. - * - * @var array - */ - - #[ORM\Id]#[ORM\Column("integer")] - - private $id; - - - /** - * Short description of the member variable. - * - * @var array - */ - #[ORM\GeneratedValue] - - #[ORM\Column(ORM\Column::T_INTEGER)] - protected $height; - - #[SingleAttribute] - protected $propertySingle; - - #[FirstAttribute] - #[SecondAttribute] - protected $propertyDouble; - #[ThirdAttribute] - protected $propertyWithoutSpacing; -} - -enum SomeEnum -{ - // Enum cannot have properties - - case ONE = 'one'; -} - -class SupportReadonlyProperties { - readonly int $readonlyA; - public readonly string $publicReadonly; - readonly bool $readonlyB; - readonly private bool $readonlyPrivate; -} - -class NoPreambleMultilineDeclaration { - public - static - int $prop = 1; -} - -class MultipleBlankLinesInPreAmble { - - /** - * Docblock. - */ - - #[MyAttribute] - - - #[ - - BlankLinesWithinAnAttributeShouldBeLeftAlone - - ] - - public $prop; -} - -final class BlankLinesBetweenVsAttributesWithoutCommentIssueSquiz3594 -{ - - // PHPCS can fix blank lines for the first property, but not for the second. (fixed now) - #[SingleAttribute] - - public $property1; - #[SingleAttribute] - - public $property2; -} - -class PHP84FinalProperties { - final int $finalA; - - /** - * Docblock - */ - public final string $publicfinal; - #[AnAttribute] - final bool $finalB; - - final private bool $finalPrivate; -} - -class MultilineCommentShouldNotBeSplitUp { - // This is the first line - // of a multi-line comment - // which should be recognized as belonging - // with the property. - public $prop; - - - /* This is the first line - of a multi-line comment - which should be recognized as belonging - with the property. - */ - public $prop; -} - -class AsymVisibility { - protected private(set) int $asymProtectedPrivate; - - /** - * Docblock - */ - protected(set) final string $asymProtected; - #[AnAttribute] - - public(set) string|bool $asymPublic; - - - private(set) private bool $asymPrivate; -} - -abstract class PHP84AbstractProperties { - abstract int $abstractA {get;} - - /** - * Docblock - */ - public abstract string $publicAbstract { set; } - #[AnAttribute] - abstract bool $abstractB {get;} - - abstract protected bool $abstractProtected { set; } -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/MemberVarSpacingUnitTest.1.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/MemberVarSpacingUnitTest.1.inc.fixed deleted file mode 100644 index 40bae3f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/MemberVarSpacingUnitTest.1.inc.fixed +++ /dev/null @@ -1,463 +0,0 @@ - 'a', 'b' => 'b' ), - $varQ = 'string', - $varR = 123; -} - -// Make sure the determination of whether a property is the first property or not is done correctly. -class ClassUsingSimpleTraits -{ - use HelloWorld; - - /* comment */ - public $firstVar = array( 'a', 'b' ); - - protected $secondVar = true; -} - -class ClassUsingComplexTraits -{ - use A, B { - B::smallTalk insteadof A; - A::bigTalk insteadof B; - } - - public $firstVar = array( 'a', 'b' ); - - /* comment */ - protected $secondVar = true; -} - -class Foo -{ - - - private function foo() - { - } - - - /* no error here because after function */ - private $bar = false; -} - -class CommentedOutCodeAtStartOfClass { - - /** - * Description. - * - * @var bool - */ - //public $commented_out_property = true; - - /** - * Description. - * - * @var bool - */ - public $property = true; -} - -class CommentedOutCodeAtStartOfClassNoBlankLine { - - // phpcs:disable Stnd.Cat.Sniff -- For reasons. - - /** - * Description. - * - * @var bool - */ - public $property = true; -} - -class HasAttributes -{ - - /** - * Short description of the member variable. - * - * @var array - */ - #[ORM\Id]#[ORM\Column("integer")] - private $id; - - /** - * Short description of the member variable. - * - * @var array - */ - #[ORM\GeneratedValue] - #[ORM\Column(ORM\Column::T_INTEGER)] - protected $height; - - #[SingleAttribute] - protected $propertySingle; - - #[FirstAttribute] - #[SecondAttribute] - protected $propertyDouble; - - #[ThirdAttribute] - protected $propertyWithoutSpacing; -} - -enum SomeEnum -{ - // Enum cannot have properties - - case ONE = 'one'; -} - -class SupportReadonlyProperties { - - readonly int $readonlyA; - - public readonly string $publicReadonly; - - readonly bool $readonlyB; - - readonly private bool $readonlyPrivate; -} - -class NoPreambleMultilineDeclaration { - - public - static - int $prop = 1; -} - -class MultipleBlankLinesInPreAmble { - - /** - * Docblock. - */ - #[MyAttribute] - #[ - - BlankLinesWithinAnAttributeShouldBeLeftAlone - - ] - public $prop; -} - -final class BlankLinesBetweenVsAttributesWithoutCommentIssueSquiz3594 -{ - - // PHPCS can fix blank lines for the first property, but not for the second. (fixed now) - #[SingleAttribute] - public $property1; - - #[SingleAttribute] - public $property2; -} - -class PHP84FinalProperties { - - final int $finalA; - - /** - * Docblock - */ - public final string $publicfinal; - - #[AnAttribute] - final bool $finalB; - - final private bool $finalPrivate; -} - -class MultilineCommentShouldNotBeSplitUp { - - // This is the first line - // of a multi-line comment - // which should be recognized as belonging - // with the property. - public $prop; - - /* This is the first line - of a multi-line comment - which should be recognized as belonging - with the property. - */ - public $prop; -} - -class AsymVisibility { - - protected private(set) int $asymProtectedPrivate; - - /** - * Docblock - */ - protected(set) final string $asymProtected; - - #[AnAttribute] - public(set) string|bool $asymPublic; - - private(set) private bool $asymPrivate; -} - -abstract class PHP84AbstractProperties { - - abstract int $abstractA {get;} - - /** - * Docblock - */ - public abstract string $publicAbstract { set; } - - #[AnAttribute] - abstract bool $abstractB {get;} - - abstract protected bool $abstractProtected { set; } -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/MemberVarSpacingUnitTest.2.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/MemberVarSpacingUnitTest.2.inc deleted file mode 100644 index 2aab7c0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/MemberVarSpacingUnitTest.2.inc +++ /dev/null @@ -1,10 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the MemberVarSpacing sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace\MemberVarSpacingSniff - */ -final class MemberVarSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'MemberVarSpacingUnitTest.1.inc': - return [ - 4 => 1, - 7 => 1, - 20 => 1, - 30 => 1, - 35 => 1, - 44 => 1, - 50 => 1, - 73 => 1, - 86 => 1, - 107 => 1, - 115 => 1, - 151 => 1, - 160 => 1, - 165 => 1, - 177 => 1, - 186 => 1, - 200 => 1, - 209 => 1, - 211 => 1, - 224 => 1, - 229 => 1, - 241 => 1, - 246 => 1, - 252 => 1, - 254 => 1, - 261 => 1, - 275 => 1, - 276 => 1, - 288 => 1, - 292 => 1, - 333 => 1, - 343 => 1, - 345 => 1, - 346 => 1, - 355 => 1, - 357 => 1, - 366 => 1, - 377 => 1, - 378 => 1, - 379 => 1, - 380 => 1, - 384 => 1, - 394 => 1, - 396 => 1, - 403 => 1, - 412 => 1, - 415 => 1, - 416 => 1, - 420 => 1, - 427 => 1, - 437 => 1, - 445 => 1, - 449 => 1, - 456 => 1, - 457 => 1, - 460 => 1, - 464 => 1, - 471 => 1, - ]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ObjectOperatorSpacingUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ObjectOperatorSpacingUnitTest.inc deleted file mode 100644 index 67f8ee1..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ObjectOperatorSpacingUnitTest.inc +++ /dev/null @@ -1,52 +0,0 @@ -testThis(); -$this-> testThis(); -$this -> testThis(); -$this-> /* comment here */testThis(); -$this/* comment here */ -> testThis(); -$this - ->testThis(); -$this-> - testThis(); - -// phpcs:set Squiz.WhiteSpace.ObjectOperatorSpacing ignoreNewlines true - -$this->testThis(); -$this-> testThis(); -$this -> testThis(); -$this->/* comment here */testThis(); -$this/* comment here */ -> testThis(); -$this - ->testThis(); -$this-> - testThis(); - -// phpcs:set Squiz.WhiteSpace.ObjectOperatorSpacing ignoreNewlines false - -thisObject::testThis(); -thisObject:: testThis(); -thisObject :: testThis(); -thisObject::/* comment here */testThis(); -thisObject/* comment here */ :: testThis(); -thisObject - ::testThis(); -thisObject:: - testThis(); - -// phpcs:set Squiz.WhiteSpace.ObjectOperatorSpacing ignoreNewlines true - -thisObject::testThis(); -thisObject:: testThis(); -thisObject :: testThis(); -thisObject::/* comment here */testThis(); -thisObject/* comment here */ :: testThis(); -thisObject - ::testThis(); -thisObject:: - testThis(); - -// phpcs:set Squiz.WhiteSpace.ObjectOperatorSpacing ignoreNewlines false - -$this?->testThis(); -$this?-> testThis(); -$this ?-> testThis(); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ObjectOperatorSpacingUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ObjectOperatorSpacingUnitTest.inc.fixed deleted file mode 100644 index 730b8e4..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ObjectOperatorSpacingUnitTest.inc.fixed +++ /dev/null @@ -1,48 +0,0 @@ -testThis(); -$this->testThis(); -$this->testThis(); -$this->/* comment here */testThis(); -$this/* comment here */->testThis(); -$this->testThis(); -$this->testThis(); - -// phpcs:set Squiz.WhiteSpace.ObjectOperatorSpacing ignoreNewlines true - -$this->testThis(); -$this->testThis(); -$this->testThis(); -$this->/* comment here */testThis(); -$this/* comment here */->testThis(); -$this - ->testThis(); -$this-> - testThis(); - -// phpcs:set Squiz.WhiteSpace.ObjectOperatorSpacing ignoreNewlines false - -thisObject::testThis(); -thisObject::testThis(); -thisObject::testThis(); -thisObject::/* comment here */testThis(); -thisObject/* comment here */::testThis(); -thisObject::testThis(); -thisObject::testThis(); - -// phpcs:set Squiz.WhiteSpace.ObjectOperatorSpacing ignoreNewlines true - -thisObject::testThis(); -thisObject::testThis(); -thisObject::testThis(); -thisObject::/* comment here */testThis(); -thisObject/* comment here */::testThis(); -thisObject - ::testThis(); -thisObject:: - testThis(); - -// phpcs:set Squiz.WhiteSpace.ObjectOperatorSpacing ignoreNewlines false - -$this?->testThis(); -$this?->testThis(); -$this?->testThis(); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ObjectOperatorSpacingUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ObjectOperatorSpacingUnitTest.php deleted file mode 100644 index 80ed0d0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ObjectOperatorSpacingUnitTest.php +++ /dev/null @@ -1,73 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ObjectOperatorSpacing sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace\ObjectOperatorSpacingSniff - */ -final class ObjectOperatorSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 3 => 1, - 4 => 2, - 5 => 1, - 6 => 2, - 8 => 1, - 9 => 1, - 15 => 1, - 16 => 2, - 18 => 2, - 27 => 1, - 28 => 2, - 30 => 2, - 32 => 1, - 33 => 1, - 39 => 1, - 40 => 2, - 42 => 2, - 51 => 1, - 52 => 2, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.1.inc deleted file mode 100644 index 29acf30..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.1.inc +++ /dev/null @@ -1,510 +0,0 @@ - $j && $k< $l && $m>= $n && $o<= $p && $q<> $r; - -$a ==$b && $c !=$d && $e ===$f && $g !==$h; -$i >$j && $k <$l && $m >=$n && $o <=$p && $q <>$r; - -function myFunction($variable=0, $var2='string') {} - -if (index > -1) { -} - -array_walk_recursive($array, function(&$item) use (&$something) { -}); - -$var = saveFile(&$model, &$foo); - -// This is all valid. -$boo = -$foo; -function foo($boo = -1) {} -$foo = array('boo' => -1); -$x = $test ? -1 : 1; -$y = $test ? 1 : -1; -$z = $test ?: false; - -$closureWithDefaultParameter = function (array $testArray=array()) {}; - -switch ($foo) { - case -1: - break; -} - -$y = 1 * -1; -$y = -1 * 1; -$y = -1 * $var; -$y = 10 / -2; -$y = -10 / 2; -$y = (-10 / 2); -$y = (-10 / $var); -$y = 10 + -2; -$y = -10 + 2; - -$a = $x?$y:$z; -$a = $x ? $y : $z; - -$y = 1 - + 2 - - 3; - -$y = 1 + - 2 - - 3; - -$y = 1 -+ 2 -- 3; - -// phpcs:set Squiz.WhiteSpace.OperatorSpacing ignoreNewlines true -$y = 1 - + 2 - - 3; - -$y = 1 + - 2 - - 3; - -$y = 1 -+ 2 -- 3; -// phpcs:set Squiz.WhiteSpace.OperatorSpacing ignoreNewlines false - -if (true || -1 == $b) { -} - -$var = array(-1); -$var = [-1]; -$var = [0, -1, -2]; - -$y = array(&$x); -$y = [&$x]; -$y = array(&$a, &$b, &$c); -$y = [&$a, &$b, &$c]; -$y = array(&$a => 1, 2 => &$b, &$c); -$y = [&$a => 1, 2 => &$b, &$c]; - -if ($a <=> $b) { -} - -if ($a <=>$b) { -} - -$a |= $b; -$a **= $b; -$a ??= $b; - -$a = +1; - -function bar($boo = +1) {} - -$username = $_GET['user']??'nobody'; - -function foo(string $bar, array $baz, ?MyClass $object) : MyClass {} - -declare(strict_types=1); - -function foo($c = ((BAR)?10:100)) {} - -$res = $a ?: $b; -$res = $a ?: $b; -$res = $a ?: $b; -$res = $a ?: $b; - -$res = $a ? : $b; -$res = $a ? : $b; -$res = $a ? : $b; -$res = $a ? : $b; - -function foo(string $a = '', ?string $b = ''): ?string {} - -// Issue #1605. -$text = preg_replace_callback( - self::CHAR_REFS_REGEX, - [ 'Sanitizer', 'decodeCharReferencesCallback' ], - $text, /* limit */ -1, $count ); - -if (true || /* test */ -1 == $b) {} -$y = 10 + /* test */ -2; - -// Issue #1604. -Hooks::run( 'ParserOptionsRegister', [ - &self::$defaults, - &self::$inCacheKey, - &self::$lazyOptions, -] ); - -$x = $foo ? function (): int { - return 1; -} : $bar; - -$x = $foo ? function ($foo) - // comment - : int { - return 1; -} : $bar; - -$x = $foo ? function ($foo) use /* comment */ ($bar): int { - return 1; -} : $bar; - -$x = !$foo ? $bar : function (): int { - return 1; -}; - -$a = - // Comment. - [ - 'a', - 'b', - ]; - -$a = -// phpcs:ignore Standard.Category.Sniff -- for reasons. -[ - 'a', - 'b', -]; - -$foo = is_array($bar) ? array_map( - function () {}, - $bar - ) : $bar; - -function bar(): array {} - -if ($line{-1} === ':') { - $line = substr($line, 0, -1); -} - -$a = $a instanceof $b; -$a = $a instanceof $b; -$a = ($a)instanceof$b; - -fn&($x) => $x; - -// phpcs:set Squiz.WhiteSpace.OperatorSpacing ignoreSpacingBeforeAssignments false -$a = 3; -// phpcs:set Squiz.WhiteSpace.OperatorSpacing ignoreSpacingBeforeAssignments true -yield -1; -echo -1; -$a = -1; -func(-1); -$a = [-1]; -return -1; -print -1; -$a &= -1; -switch ($a) { - case -1: -} -$a = $a ?? -1; -$a .= -1; -$a /= -1; -$a = [1 => -1]; -$a = $a == -1; -$a = $a >= -1; -$a = $a === -1; -$a = $a != -1; -$a = $a !== -1; -$a = $a <= -1; -$a = $a <=> -1; -$a = $a and -1; -$a = $a or -1; -$a = $a xor -1; -$a -= -1; -$a %= -1; -$a *= -1; -$a |= -1; -$a += -1; -$a = $a ** -1; -$a **= -1; -$a = $a << -1; -$a <<= -1; -$a = $a >> -1; -$a >>= -1; -$a = (string) -1; -$a = (array) -1; -$a = (bool) -1; -$a = (object) -1; -$a = (unset) -1; -$a = (float) -1; -$a = (int) -1; -$a ^= -1; -$a = [$a, -1]; -$a = $a[-1]; -$a = $a ? -1 : -1; - -yield - 1; -echo - 1; -$a = - 1; -func(- 1); -$a = [- 1]; -return - 1; -print - 1; -$a &= - 1; -switch ($a) { - case - 1: -} -$a = $a ?? - 1; -$a .= - 1; -$a /= - 1; -$a = [1 => - 1]; -$a = $a == - 1; -$a = $a >= - 1; -$a = $a === - 1; -$a = $a != - 1; -$a = $a !== - 1; -$a = $a <= - 1; -$a = $a <=> - 1; -$a = $a and - 1; -$a = $a or - 1; -$a = $a xor - 1; -$a -= - 1; -$a %= - 1; -$a *= - 1; -$a |= - 1; -$a += - 1; -$a = $a ** - 1; -$a **= - 1; -$a = $a << - 1; -$a <<= - 1; -$a = $a >> - 1; -$a >>= - 1; -$a = (string) - 1; -$a = (array) - 1; -$a = (bool) - 1; -$a = (object) - 1; -$a = (unset) - 1; -$a = (float) - 1; -$a = (int) - 1; -$a ^= - 1; -$a = [$a, - 1]; -$a = $a[- 1]; -$a = $a ? - 1 : - 1; - - -yield -$b; -echo -$b; -$a = -$b; -func(-$b); -$a = [-$b]; -return -$b; -print -$b; -$a &= -$b; -switch ($a) { - case -$b: -} -$a = $a ?? -$b; -$a .= -$b; -$a /= -$b; -$a = [1 => -$b]; -$a = $a == -$b; -$a = $a >= -$b; -$a = $a === -$b; -$a = $a != -$b; -$a = $a !== -$b; -$a = $a <= -$b; -$a = $a <=> -$b; -$a = $a and -$b; -$a = $a or -$b; -$a = $a xor -$b; -$a -= -$b; -$a %= -$b; -$a *= -$b; -$a |= -$b; -$a += -$b; -$a = $a ** -$b; -$a **= -$b; -$a = $a << -$b; -$a <<= -$b; -$a = $a >> -$b; -$a >>= -$b; -$a = (string) -$b; -$a = (array) -$b; -$a = (bool) -$b; -$a = (object) -$b; -$a = (unset) -$b; -$a = (float) -$b; -$a = (int) -$b; -$a ^= -$b; -$a = [$a, -$b]; -$a = $a[-$b]; -$a = $a ? -$b : -$b; - -yield - $b; -echo - $b; -$a = - $b; -func(- $b); -$a = [- $b]; -return - $b; -print - $b; -$a &= - $b; -switch ($a) { - case - $b: -} -$a = $a ?? - $b; -$a .= - $b; -$a /= - $b; -$a = [1 => - $b]; -$a = $a == - $b; -$a = $a >= - $b; -$a = $a === - $b; -$a = $a != - $b; -$a = $a !== - $b; -$a = $a <= - $b; -$a = $a <=> - $b; -$a = $a and - $b; -$a = $a or - $b; -$a = $a xor - $b; -$a -= - $b; -$a %= - $b; -$a *= - $b; -$a |= - $b; -$a += - $b; -$a = $a ** - $b; -$a **= - $b; -$a = $a << - $b; -$a <<= - $b; -$a = $a >> - $b; -$a >>= - $b; -$a = (string) - $b; -$a = (array) - $b; -$a = (bool) - $b; -$a = (object) - $b; -$a = (unset) - $b; -$a = (float) - $b; -$a = (int) - $b; -$a ^= - $b; -$a = [$a, - $b]; -$a = $a[- $b]; -$a = $a ? - $b : - $b; - -exit -1; - -$cl = function ($boo =-1) {}; -$cl = function ($boo =+1) {}; -$fn = fn ($boo =-1) => $boo; -$fn = fn ($boo =+1) => $boo; - -$fn = static fn(DateTime $a, DateTime $b): int => -($a->getTimestamp() <=> $b->getTimestamp()); - -$a = 'a '.-MY_CONSTANT; -$a = 'a '.-$b; -$a = 'a '.- MY_CONSTANT; -$a = 'a '.- $b; - -match ($a) { - 'a' => -1, - 'b', 'c', 'd' => -2, - default => -3, -}; - -$foo = $var - ? 10 - : true; - -// Safeguard that a non-fixable error is thrown when there is a new line before the operator, -// but the last non-whitespace token before the operator is a comment token. -$foo = $var // Comment - ? false /* Comment */ - : true; - -$foo = $var // phpcs: ignore Stnd.Cat.Sniff -- for reasons. - - - ? $something /** - * Don't ask, but someone might have a docblock between the lines. It's valid PHP after all. - */ - - - : true; - -// phpcs:set Squiz.WhiteSpace.OperatorSpacing ignoreNewlines true -$foo = $var // Comment - ? false // Comment - : true; -// phpcs:set Squiz.WhiteSpace.OperatorSpacing ignoreNewlines false diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.1.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.1.inc.fixed deleted file mode 100644 index 5c94e36..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.1.inc.fixed +++ /dev/null @@ -1,502 +0,0 @@ - $j && $k < $l && $m >= $n && $o <= $p && $q <> $r; - -$a == $b && $c != $d && $e === $f && $g !== $h; -$i > $j && $k < $l && $m >= $n && $o <= $p && $q <> $r; - -function myFunction($variable=0, $var2='string') {} - -if (index > -1) { -} - -array_walk_recursive($array, function(&$item) use (&$something) { -}); - -$var = saveFile(&$model, &$foo); - -// This is all valid. -$boo = -$foo; -function foo($boo = -1) {} -$foo = array('boo' => -1); -$x = $test ? -1 : 1; -$y = $test ? 1 : -1; -$z = $test ?: false; - -$closureWithDefaultParameter = function (array $testArray=array()) {}; - -switch ($foo) { - case -1: - break; -} - -$y = 1 * -1; -$y = -1 * 1; -$y = -1 * $var; -$y = 10 / -2; -$y = -10 / 2; -$y = (-10 / 2); -$y = (-10 / $var); -$y = 10 + -2; -$y = -10 + 2; - -$a = $x ? $y : $z; -$a = $x ? $y : $z; - -$y = 1 + 2 - 3; - -$y = 1 + 2 - 3; - -$y = 1 + 2 - 3; - -// phpcs:set Squiz.WhiteSpace.OperatorSpacing ignoreNewlines true -$y = 1 - + 2 - - 3; - -$y = 1 + - 2 - - 3; - -$y = 1 -+ 2 -- 3; -// phpcs:set Squiz.WhiteSpace.OperatorSpacing ignoreNewlines false - -if (true || -1 == $b) { -} - -$var = array(-1); -$var = [-1]; -$var = [0, -1, -2]; - -$y = array(&$x); -$y = [&$x]; -$y = array(&$a, &$b, &$c); -$y = [&$a, &$b, &$c]; -$y = array(&$a => 1, 2 => &$b, &$c); -$y = [&$a => 1, 2 => &$b, &$c]; - -if ($a <=> $b) { -} - -if ($a <=> $b) { -} - -$a |= $b; -$a **= $b; -$a ??= $b; - -$a = +1; - -function bar($boo = +1) {} - -$username = $_GET['user'] ?? 'nobody'; - -function foo(string $bar, array $baz, ?MyClass $object) : MyClass {} - -declare(strict_types=1); - -function foo($c = ((BAR) ? 10 : 100)) {} - -$res = $a ?: $b; -$res = $a ?: $b; -$res = $a ?: $b; -$res = $a ?: $b; - -$res = $a ? : $b; -$res = $a ? : $b; -$res = $a ? : $b; -$res = $a ? : $b; - -function foo(string $a = '', ?string $b = ''): ?string {} - -// Issue #1605. -$text = preg_replace_callback( - self::CHAR_REFS_REGEX, - [ 'Sanitizer', 'decodeCharReferencesCallback' ], - $text, /* limit */ -1, $count ); - -if (true || /* test */ -1 == $b) {} -$y = 10 + /* test */ -2; - -// Issue #1604. -Hooks::run( 'ParserOptionsRegister', [ - &self::$defaults, - &self::$inCacheKey, - &self::$lazyOptions, -] ); - -$x = $foo ? function (): int { - return 1; -} : $bar; - -$x = $foo ? function ($foo) - // comment - : int { - return 1; -} : $bar; - -$x = $foo ? function ($foo) use /* comment */ ($bar): int { - return 1; -} : $bar; - -$x = !$foo ? $bar : function (): int { - return 1; -}; - -$a = - // Comment. - [ - 'a', - 'b', - ]; - -$a = -// phpcs:ignore Standard.Category.Sniff -- for reasons. -[ - 'a', - 'b', -]; - -$foo = is_array($bar) ? array_map( - function () {}, - $bar - ) : $bar; - -function bar(): array {} - -if ($line{-1} === ':') { - $line = substr($line, 0, -1); -} - -$a = $a instanceof $b; -$a = $a instanceof $b; -$a = ($a) instanceof $b; - -fn&($x) => $x; - -// phpcs:set Squiz.WhiteSpace.OperatorSpacing ignoreSpacingBeforeAssignments false -$a = 3; -// phpcs:set Squiz.WhiteSpace.OperatorSpacing ignoreSpacingBeforeAssignments true -yield -1; -echo -1; -$a = -1; -func(-1); -$a = [-1]; -return -1; -print -1; -$a &= -1; -switch ($a) { - case -1: -} -$a = $a ?? -1; -$a .= -1; -$a /= -1; -$a = [1 => -1]; -$a = $a == -1; -$a = $a >= -1; -$a = $a === -1; -$a = $a != -1; -$a = $a !== -1; -$a = $a <= -1; -$a = $a <=> -1; -$a = $a and -1; -$a = $a or -1; -$a = $a xor -1; -$a -= -1; -$a %= -1; -$a *= -1; -$a |= -1; -$a += -1; -$a = $a ** -1; -$a **= -1; -$a = $a << -1; -$a <<= -1; -$a = $a >> -1; -$a >>= -1; -$a = (string) -1; -$a = (array) -1; -$a = (bool) -1; -$a = (object) -1; -$a = (unset) -1; -$a = (float) -1; -$a = (int) -1; -$a ^= -1; -$a = [$a, -1]; -$a = $a[-1]; -$a = $a ? -1 : -1; - -yield - 1; -echo - 1; -$a = - 1; -func(- 1); -$a = [- 1]; -return - 1; -print - 1; -$a &= - 1; -switch ($a) { - case - 1: -} -$a = $a ?? - 1; -$a .= - 1; -$a /= - 1; -$a = [1 => - 1]; -$a = $a == - 1; -$a = $a >= - 1; -$a = $a === - 1; -$a = $a != - 1; -$a = $a !== - 1; -$a = $a <= - 1; -$a = $a <=> - 1; -$a = $a and - 1; -$a = $a or - 1; -$a = $a xor - 1; -$a -= - 1; -$a %= - 1; -$a *= - 1; -$a |= - 1; -$a += - 1; -$a = $a ** - 1; -$a **= - 1; -$a = $a << - 1; -$a <<= - 1; -$a = $a >> - 1; -$a >>= - 1; -$a = (string) - 1; -$a = (array) - 1; -$a = (bool) - 1; -$a = (object) - 1; -$a = (unset) - 1; -$a = (float) - 1; -$a = (int) - 1; -$a ^= - 1; -$a = [$a, - 1]; -$a = $a[- 1]; -$a = $a ? - 1 : - 1; - - -yield -$b; -echo -$b; -$a = -$b; -func(-$b); -$a = [-$b]; -return -$b; -print -$b; -$a &= -$b; -switch ($a) { - case -$b: -} -$a = $a ?? -$b; -$a .= -$b; -$a /= -$b; -$a = [1 => -$b]; -$a = $a == -$b; -$a = $a >= -$b; -$a = $a === -$b; -$a = $a != -$b; -$a = $a !== -$b; -$a = $a <= -$b; -$a = $a <=> -$b; -$a = $a and -$b; -$a = $a or -$b; -$a = $a xor -$b; -$a -= -$b; -$a %= -$b; -$a *= -$b; -$a |= -$b; -$a += -$b; -$a = $a ** -$b; -$a **= -$b; -$a = $a << -$b; -$a <<= -$b; -$a = $a >> -$b; -$a >>= -$b; -$a = (string) -$b; -$a = (array) -$b; -$a = (bool) -$b; -$a = (object) -$b; -$a = (unset) -$b; -$a = (float) -$b; -$a = (int) -$b; -$a ^= -$b; -$a = [$a, -$b]; -$a = $a[-$b]; -$a = $a ? -$b : -$b; - -yield - $b; -echo - $b; -$a = - $b; -func(- $b); -$a = [- $b]; -return - $b; -print - $b; -$a &= - $b; -switch ($a) { - case - $b: -} -$a = $a ?? - $b; -$a .= - $b; -$a /= - $b; -$a = [1 => - $b]; -$a = $a == - $b; -$a = $a >= - $b; -$a = $a === - $b; -$a = $a != - $b; -$a = $a !== - $b; -$a = $a <= - $b; -$a = $a <=> - $b; -$a = $a and - $b; -$a = $a or - $b; -$a = $a xor - $b; -$a -= - $b; -$a %= - $b; -$a *= - $b; -$a |= - $b; -$a += - $b; -$a = $a ** - $b; -$a **= - $b; -$a = $a << - $b; -$a <<= - $b; -$a = $a >> - $b; -$a >>= - $b; -$a = (string) - $b; -$a = (array) - $b; -$a = (bool) - $b; -$a = (object) - $b; -$a = (unset) - $b; -$a = (float) - $b; -$a = (int) - $b; -$a ^= - $b; -$a = [$a, - $b]; -$a = $a[- $b]; -$a = $a ? - $b : - $b; - -exit -1; - -$cl = function ($boo =-1) {}; -$cl = function ($boo =+1) {}; -$fn = fn ($boo =-1) => $boo; -$fn = fn ($boo =+1) => $boo; - -$fn = static fn(DateTime $a, DateTime $b): int => -($a->getTimestamp() <=> $b->getTimestamp()); - -$a = 'a '.-MY_CONSTANT; -$a = 'a '.-$b; -$a = 'a '.- MY_CONSTANT; -$a = 'a '.- $b; - -match ($a) { - 'a' => -1, - 'b', 'c', 'd' => -2, - default => -3, -}; - -$foo = $var ? 10 : true; - -// Safeguard that a non-fixable error is thrown when there is a new line before the operator, -// but the last non-whitespace token before the operator is a comment token. -$foo = $var // Comment - ? false /* Comment */ - : true; - -$foo = $var // phpcs: ignore Stnd.Cat.Sniff -- for reasons. - - - ? $something /** - * Don't ask, but someone might have a docblock between the lines. It's valid PHP after all. - */ - - - : true; - -// phpcs:set Squiz.WhiteSpace.OperatorSpacing ignoreNewlines true -$foo = $var // Comment - ? false // Comment - : true; -// phpcs:set Squiz.WhiteSpace.OperatorSpacing ignoreNewlines false diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.2.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.2.inc deleted file mode 100644 index 3a0dbac..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.2.inc +++ /dev/null @@ -1,3 +0,0 @@ -> y; -x >>= y; -x = x >>> y; -x >>>= y; - -var foo = bar.map(baz=> baz.length); - -// phpcs:set Squiz.WhiteSpace.OperatorSpacing ignoreSpacingBeforeAssignments false -a = 3; -// phpcs:set Squiz.WhiteSpace.OperatorSpacing ignoreSpacingBeforeAssignments true diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.js.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.js.fixed deleted file mode 100644 index 47c8930..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.js.fixed +++ /dev/null @@ -1,98 +0,0 @@ - - -result = 1 + 2; -result = 1 + 2; -result = 1 + 2; -result = 1 + 2; -result = 1 + 2; -result = 1 + 2; - -result = 1 - 2; -result = 1 - 2; -result = 1 - 2; -result = 1 - 2; -result = 1 - 2; -result = 1 - 2; - -result = 1 * 2; -result = 1 * 2; -result = 1 * 2; -result = 1 * 2; -result = 1 * 2; -result = 1 * 2; - -result = 1 / 2; -result = 1 / 2; -result = 1 / 2; -result = 1 / 2; -result = 1 / 2; -result = 1 / 2; - -result = 1 % 2; -result = 1 % 2; -result = 1 % 2; -result = 1 % 2; -result = 1 % 2; -result = 1 % 2; -result = '100%'; - -result += 4; -result += 4; -result -= 4; -result -= 4; -result /= 4; -result /= 4; -result *= 4; -result *= 4; - -$.localScroll({offset: {top: -32}}); - -switch (result) { - case -1: - break; -} - -result = x ? y : z; -result = x ? y : z; - -if (something === true - ^ somethingElse === true -) { - return false; -} - -y = 1 + 2 - 3; - -y = 1 + 2 - 3; - -y = 1 + 2 - 3; - -// phpcs:set Squiz.WhiteSpace.OperatorSpacing ignoreNewlines true -y = 1 - + 2 - - 3; - -y = 1 + - 2 - - 3; - -y = 1 -+ 2 -- 3; -// phpcs:set Squiz.WhiteSpace.OperatorSpacing ignoreNewlines false - -if (true || -1 == b) { -} - -x = x << y; -x <<= y; -x = x >> y; -x >>= y; -x = x >>> y; -x >>>= y; - -var foo = bar.map(baz => baz.length); - -// phpcs:set Squiz.WhiteSpace.OperatorSpacing ignoreSpacingBeforeAssignments false -a = 3; -// phpcs:set Squiz.WhiteSpace.OperatorSpacing ignoreSpacingBeforeAssignments true diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.php deleted file mode 100644 index 0920573..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.php +++ /dev/null @@ -1,180 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the OperatorSpacing sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace\OperatorSpacingSniff - */ -final class OperatorSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'OperatorSpacingUnitTest.1.inc': - return [ - 4 => 1, - 5 => 2, - 6 => 1, - 7 => 1, - 8 => 2, - 11 => 1, - 12 => 2, - 13 => 1, - 14 => 1, - 15 => 2, - 18 => 1, - 19 => 2, - 20 => 1, - 21 => 1, - 22 => 2, - 25 => 1, - 26 => 2, - 27 => 1, - 28 => 1, - 29 => 2, - 32 => 1, - 33 => 2, - 34 => 1, - 35 => 1, - 36 => 2, - 40 => 2, - 42 => 2, - 44 => 2, - 45 => 1, - 46 => 2, - 53 => 4, - 54 => 3, - 59 => 10, - 64 => 1, - 77 => 4, - 78 => 1, - 79 => 1, - 80 => 2, - 81 => 1, - 84 => 6, - 85 => 6, - 87 => 4, - 88 => 5, - 90 => 4, - 91 => 5, - 128 => 4, - 132 => 1, - 133 => 1, - 135 => 1, - 136 => 1, - 140 => 1, - 141 => 1, - 174 => 1, - 177 => 1, - 178 => 1, - 179 => 1, - 185 => 2, - 191 => 4, - 194 => 1, - 195 => 1, - 196 => 2, - 199 => 1, - 200 => 1, - 201 => 2, - 239 => 1, - 246 => 1, - 265 => 2, - 266 => 2, - 271 => 2, - 487 => 1, - 488 => 1, - 493 => 1, - 494 => 1, - 499 => 1, - 504 => 1, - ]; - - case 'OperatorSpacingUnitTest.js': - return [ - 4 => 1, - 5 => 2, - 6 => 1, - 7 => 1, - 8 => 2, - 11 => 1, - 12 => 2, - 13 => 1, - 14 => 1, - 15 => 2, - 18 => 1, - 19 => 2, - 20 => 1, - 21 => 1, - 22 => 2, - 25 => 1, - 26 => 2, - 27 => 1, - 28 => 1, - 29 => 2, - 32 => 1, - 33 => 2, - 34 => 1, - 35 => 1, - 36 => 2, - 40 => 2, - 42 => 2, - 44 => 2, - 45 => 1, - 46 => 2, - 55 => 4, - 65 => 1, - 66 => 1, - 68 => 1, - 69 => 1, - 73 => 1, - 74 => 1, - 100 => 1, - 103 => 2, - ]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/PropertyLabelSpacingUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/PropertyLabelSpacingUnitTest.js deleted file mode 100644 index 15890b9..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/PropertyLabelSpacingUnitTest.js +++ /dev/null @@ -1,40 +0,0 @@ -var x = { - b: 'x', - xasd: x, - abc:x, - a: function () { - alert('thats right'); - x = (x?a:x); - }, - casdasd : 123123, - omgwtfbbq: { - a: 1, - b: 2 - } -}; - -id = id.replace(/row\/:/gi, ''); - -outer_loop: -for (i=0; i<3; i++) { - for (j=0; j<5; j++) { - if (j==x) - break outer_loop; - } -} -alert('hi'); - -even_number: if ((i % 2) == 0) { - if (i == 12) - break even_number; -} - -switch (blah) { - case dfx.DOM_VK_LEFT: - this.caretLeft(shiftKey); - break; - default: - if (blah) { - } - break; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/PropertyLabelSpacingUnitTest.js.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/PropertyLabelSpacingUnitTest.js.fixed deleted file mode 100644 index f332878..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/PropertyLabelSpacingUnitTest.js.fixed +++ /dev/null @@ -1,39 +0,0 @@ -var x = { - b: 'x', - xasd: x, - abc: x, - a: function () { - alert('thats right'); - x = (x?a:x); - }, - casdasd: 123123, - omgwtfbbq: { - a: 1, - b: 2 - } -}; - -id = id.replace(/row\/:/gi, ''); - -outer_loop: for (i=0; i<3; i++) { - for (j=0; j<5; j++) { - if (j==x) - break outer_loop; - } -} -alert('hi'); - -even_number: if ((i % 2) == 0) { - if (i == 12) - break even_number; -} - -switch (blah) { - case dfx.DOM_VK_LEFT: - this.caretLeft(shiftKey); - break; - default: - if (blah) { - } - break; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/PropertyLabelSpacingUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/PropertyLabelSpacingUnitTest.php deleted file mode 100644 index 405d6dd..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/PropertyLabelSpacingUnitTest.php +++ /dev/null @@ -1,60 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the PropertyLabel sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace\PropertyLabelSpacingSniff - */ -final class PropertyLabelSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 2 => 1, - 4 => 1, - 9 => 2, - 10 => 1, - 12 => 1, - 18 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeClosingBraceUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeClosingBraceUnitTest.inc deleted file mode 100644 index ecae5c6..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeClosingBraceUnitTest.inc +++ /dev/null @@ -1,134 +0,0 @@ -{$property} =& new $class_name($this->db_index); - $this->modules[$module] =& $this->{$property}; -} - -foreach ($elements as $element) { - if ($something) { - // Do IF. - } else if ($somethingElse) { - // Do ELSE. - } -} - -if ($token['code'] === T_COMMENT - && $multiLineComment === false - && (substr($token['content'], 0, 2) === '//' - || $token['content']{0} === '#') -) { -} - -switch ($blah) { - case 'one': - echo 'one'; - break; - default: - echo 'another'; -} - -?> - -getRow()): ?> -

    - - - -
    - -

    o hai!

    - -
    - - - - - - - - - - - - $x + $y; - -$match = match ($test) { 1 => 'a', 2 => 'b' }; - -$match = match ($test) { - 1 => 'a', - 2 => 'b' - }; - -?> - -
    - -
    - -{$property} =& new $class_name($this->db_index); - $this->modules[$module] =& $this->{$property}; -} - -foreach ($elements as $element) { - if ($something) { - // Do IF. - } else if ($somethingElse) { - // Do ELSE. - } -} - -if ($token['code'] === T_COMMENT - && $multiLineComment === false - && (substr($token['content'], 0, 2) === '//' - || $token['content']{0} === '#') -) { -} - -switch ($blah) { - case 'one': - echo 'one'; - break; - default: - echo 'another'; -} - -?> - -getRow()): ?> -

    - - - -
    - -

    o hai!

    - -
    - - - - - - - - - - - - $x + $y; - -$match = match ($test) { 1 => 'a', 2 => 'b' -}; - -$match = match ($test) { - 1 => 'a', - 2 => 'b' -}; - -?> - -
    - -
    - - - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ScopeClosingBrace sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace\ScopeClosingBraceSniff - */ -final class ScopeClosingBraceUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 11 => 1, - 13 => 1, - 24 => 1, - 80 => 1, - 102 => 1, - 111 => 1, - 116 => 1, - 122 => 1, - 130 => 1, - 134 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc deleted file mode 100644 index 921901f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc +++ /dev/null @@ -1,209 +0,0 @@ - 'a', 'b' => 'b' ), - $varQ = 'string', - $varR = 123; - - public - $varS, - $varT, - $varU; - - // Issue #3188 - static as return type. - public static function staticAsReturnType($attributes = []): static - { - return static::factory()->create($attributes); - } - - public static function nullableStaticReturnType($attributes = []): ?static - { - return static::factory()->create($attributes); - } - - // Also account for static used within union types. - public function staticLast($attributes = []): object|static {} - public function staticMiddle(): string|static|object {} - public function staticFirst(): static|object {} -} - -// Ensure that static as a scope keyword when preceeded by a colon which is not for a type declaration is still handled. -$callback = $cond ? get_fn_name() : static function ($a) { return $a * 10; }; - -class TypedProperties { - public - int $var; - - protected string $stringA, $stringB; - - private bool - $boolA, - $boolB; -} - -// PHP 8.0 constructor property promotion. -class ConstructorPropertyPromotionTest { - public function __construct( - public $x = 0.0, - protected $y = '', - private $z = null, - $normalParam, - ) {} -} - -class ConstructorPropertyPromotionWithTypesTest { - public function __construct(protected float|int $x, public?string &$y = 'test', private mixed $z) {} -} - -// PHP 8.1 readonly keywords. -class ReadonlyTest { - public readonly int $publicReadonlyProperty; - - protected readonly int $protectedReadonlyProperty; - - readonly protected int $protectedReadonlyProperty; - - readonly private int $privateReadonlyProperty; - - public function __construct(readonly protected float|int $x, public readonly?string &$y = 'test') {} -} - -// PHP 8.2 readonly classes. -readonly class ReadonlyClassTest {} -readonly class ReadonlyClassTest {} - -// PHP 8.3 readonly anonymous classes. -$anon = new readonly class {}; -$anon = new readonly class {}; - -class FinalTest { - final public static function create(ContainerInterface $container) {} -} - -final class FinalTest2 { -} - -final - readonly class FinalTest3 {} - -class FinalTest4 { - final const X = "foo"; - final public const Y = "bar"; -} - -abstract class AbstractTest { - abstract public function foo(); -} - -final class FinalSpacingCorrect { - public final const SPACING_CORRECT = true; -} - -abstract class AbstractSpacingCorrect { - public abstract function spacingCorrect() {} -} - -$closure = static function() { return 'spacing correct'; }; -$closure = static function() { return 'spacing incorrect'; }; - -class ConstantVisibility { - public const PUBLIC_SPACING_CORRECT = true; - protected const PROTECTED_SPACING_CORRECT = true; - private const PRIVATE_SPACING_CORRECT = true; - - public const PUBLIC_SPACING_INCORRECT = true; - protected const PROTECTED_SPACING_INCORRECT = true; - private const PRIVATE_SPACING_INCORRECT = true; -} - -class FinalProperties { - final readonly public ?MyType $spacing_correct; - protected final $spacing_incorrect = 'foo'; -} - -class AsymVisibility { - public(set) string $asymPublic = 'hello'; - public protected(set) final $asymProtected = 'hello'; - private(set) public string|false $asymPrivate = 'hello'; - - public public(set) $asymPublicPublic = 'hello'; - protected(set) public $asymPublicProtected = 'hello'; - protected private(set) $asymProtectedPrivate = 'hello'; -} - -abstract class AbstractProperties { - abstract public ?MyType $spacing_correct {get;} - protected abstract $spacing_incorrect { set; } -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc.fixed deleted file mode 100644 index c0ee0c0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc.fixed +++ /dev/null @@ -1,202 +0,0 @@ - 'a', 'b' => 'b' ), - $varQ = 'string', - $varR = 123; - - public - $varS, - $varT, - $varU; - - // Issue #3188 - static as return type. - public static function staticAsReturnType($attributes = []): static - { - return static::factory()->create($attributes); - } - - public static function nullableStaticReturnType($attributes = []): ?static - { - return static::factory()->create($attributes); - } - - // Also account for static used within union types. - public function staticLast($attributes = []): object|static {} - public function staticMiddle(): string|static|object {} - public function staticFirst(): static|object {} -} - -// Ensure that static as a scope keyword when preceeded by a colon which is not for a type declaration is still handled. -$callback = $cond ? get_fn_name() : static function ($a) { return $a * 10; }; - -class TypedProperties { - public int $var; - - protected string $stringA, $stringB; - - private bool - $boolA, - $boolB; -} - -// PHP 8.0 constructor property promotion. -class ConstructorPropertyPromotionTest { - public function __construct( - public $x = 0.0, - protected $y = '', - private $z = null, - $normalParam, - ) {} -} - -class ConstructorPropertyPromotionWithTypesTest { - public function __construct(protected float|int $x, public ?string &$y = 'test', private mixed $z) {} -} - -// PHP 8.1 readonly keywords. -class ReadonlyTest { - public readonly int $publicReadonlyProperty; - - protected readonly int $protectedReadonlyProperty; - - readonly protected int $protectedReadonlyProperty; - - readonly private int $privateReadonlyProperty; - - public function __construct(readonly protected float|int $x, public readonly ?string &$y = 'test') {} -} - -// PHP 8.2 readonly classes. -readonly class ReadonlyClassTest {} -readonly class ReadonlyClassTest {} - -// PHP 8.3 readonly anonymous classes. -$anon = new readonly class {}; -$anon = new readonly class {}; - -class FinalTest { - final public static function create(ContainerInterface $container) {} -} - -final class FinalTest2 { -} - -final readonly class FinalTest3 {} - -class FinalTest4 { - final const X = "foo"; - final public const Y = "bar"; -} - -abstract class AbstractTest { - abstract public function foo(); -} - -final class FinalSpacingCorrect { - public final const SPACING_CORRECT = true; -} - -abstract class AbstractSpacingCorrect { - public abstract function spacingCorrect() {} -} - -$closure = static function() { return 'spacing correct'; }; -$closure = static function() { return 'spacing incorrect'; }; - -class ConstantVisibility { - public const PUBLIC_SPACING_CORRECT = true; - protected const PROTECTED_SPACING_CORRECT = true; - private const PRIVATE_SPACING_CORRECT = true; - - public const PUBLIC_SPACING_INCORRECT = true; - protected const PROTECTED_SPACING_INCORRECT = true; - private const PRIVATE_SPACING_INCORRECT = true; -} - -class FinalProperties { - final readonly public ?MyType $spacing_correct; - protected final $spacing_incorrect = 'foo'; -} - -class AsymVisibility { - public(set) string $asymPublic = 'hello'; - public protected(set) final $asymProtected = 'hello'; - private(set) public string|false $asymPrivate = 'hello'; - - public public(set) $asymPublicPublic = 'hello'; - protected(set) public $asymPublicProtected = 'hello'; - protected private(set) $asymProtectedPrivate = 'hello'; -} - -abstract class AbstractProperties { - abstract public ?MyType $spacing_correct {get;} - protected abstract $spacing_incorrect { set; } -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.2.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.2.inc deleted file mode 100644 index 45cfb53..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.2.inc +++ /dev/null @@ -1,6 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ScopeKeywordSpacing sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace\ScopeKeywordSpacingSniff - */ -final class ScopeKeywordSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'ScopeKeywordSpacingUnitTest.1.inc': - return [ - 7 => 2, - 8 => 1, - 13 => 1, - 14 => 1, - 15 => 1, - 17 => 2, - 26 => 1, - 28 => 1, - 29 => 1, - 64 => 1, - 67 => 1, - 71 => 1, - 103 => 1, - 106 => 1, - 111 => 1, - 119 => 1, - 121 => 1, - 127 => 2, - 134 => 2, - 138 => 2, - 140 => 3, - 145 => 1, - 149 => 1, - 152 => 1, - 155 => 1, - 158 => 1, - 162 => 1, - 163 => 1, - 166 => 1, - 167 => 1, - 179 => 1, - 186 => 1, - 187 => 1, - 188 => 1, - 193 => 2, - 197 => 1, - 198 => 3, - 199 => 2, - 208 => 2, - ]; - - case 'ScopeKeywordSpacingUnitTest.3.inc': - return [6 => 1]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.inc deleted file mode 100644 index 60f87e5..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.inc +++ /dev/null @@ -1,42 +0,0 @@ -testThis(); -$test = $this->testThis() ; -$test = $this->testThis() ; -for ($var = 1 ; $var < 10 ; $var++) { - echo $var ; -} -$test = $this->testThis() /* comment here */; -$test = $this->testThis() /* comment here */ ; - -$hello ='foo'; -; - -$sum = $a /* + $b */; -$sum = $a // + $b -; -$sum = $a /* + $b - + $c */ ; - -/* - * Test that the sniff does *not* throw incorrect errors for semicolons in - * "empty" parts of a `for` control structure. - */ -for ($i = 1; ; $i++) {} -for ( ; $ptr >= 0; $ptr-- ) {} -for ( ; ; ) {} - -// But it should when the semicolon in a `for` follows a comment (but shouldn't move the semicolon). -for ( /* Deliberately left empty. */ ; $ptr >= 0; $ptr-- ) {} -for ( $i = 1 ; /* Deliberately left empty. */ ; $i++ ) {} - -switch ($foo) { - case 'foo': - ; - break - ; -} - -// This is an empty statement and should be ignored. -if ($foo) { -; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.inc.fixed deleted file mode 100644 index b4dc0f1..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.inc.fixed +++ /dev/null @@ -1,41 +0,0 @@ -testThis(); -$test = $this->testThis(); -$test = $this->testThis(); -for ($var = 1; $var < 10; $var++) { - echo $var; -} -$test = $this->testThis(); /* comment here */ -$test = $this->testThis(); /* comment here */ - -$hello ='foo'; -; - -$sum = $a; /* + $b */ -$sum = $a; // + $b - -$sum = $a; /* + $b - + $c */ - -/* - * Test that the sniff does *not* throw incorrect errors for semicolons in - * "empty" parts of a `for` control structure. - */ -for ($i = 1; ; $i++) {} -for ( ; $ptr >= 0; $ptr-- ) {} -for ( ; ; ) {} - -// But it should when the semicolon in a `for` follows a comment (but shouldn't move the semicolon). -for ( /* Deliberately left empty. */; $ptr >= 0; $ptr-- ) {} -for ( $i = 1; /* Deliberately left empty. */; $i++ ) {} - -switch ($foo) { - case 'foo': - ; - break; -} - -// This is an empty statement and should be ignored. -if ($foo) { -; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.js deleted file mode 100644 index 3aafd6d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.js +++ /dev/null @@ -1,25 +0,0 @@ -var x = { - a: function () { - alert('thats right') ; - x = (x?a:x) ; - }, -} ; - -id = id.replace(/row\/:;/gi, ''); - -for (i=0 ; i<3 ; i++) { - for (j=0; j<5 ; j++) { - if (j==x) - break ; - } -} -alert('hi'); -; - -var sum = a /* + b */; - -var sum = a // +b -; - -var sum = a /* +b - + c */ ; diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.js.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.js.fixed deleted file mode 100644 index a547144..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.js.fixed +++ /dev/null @@ -1,25 +0,0 @@ -var x = { - a: function () { - alert('thats right'); - x = (x?a:x); - }, -}; - -id = id.replace(/row\/:;/gi, ''); - -for (i=0; i<3; i++) { - for (j=0; j<5; j++) { - if (j==x) - break; - } -} -alert('hi'); -; - -var sum = a; /* + b */ - -var sum = a; // +b - - -var sum = a; /* +b - + c */ diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.php deleted file mode 100644 index f670f7c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SemicolonSpacingUnitTest.php +++ /dev/null @@ -1,87 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the SemicolonSpacing sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace\SemicolonSpacingSniff - */ -final class SemicolonSpacingUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'SemicolonSpacingUnitTest.inc': - return [ - 3 => 1, - 4 => 1, - 5 => 2, - 6 => 1, - 8 => 1, - 9 => 1, - 14 => 1, - 16 => 1, - 18 => 1, - 29 => 1, - 30 => 2, - 36 => 1, - ]; - - case 'SemicolonSpacingUnitTest.js': - return [ - 3 => 1, - 4 => 1, - 6 => 1, - 10 => 2, - 11 => 1, - 13 => 1, - 19 => 1, - 22 => 1, - 25 => 1, - ]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.css deleted file mode 100644 index e3f3f02..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.css +++ /dev/null @@ -1,32 +0,0 @@ - -.HelpWidgetType-new-bug-title { - float: left; -} -.HelpWidgetType-new-bug-title { - float: left; -} -.HelpWidgetType-new-bug-title { - float: left; -} - -.HelpWidgetType-new-bug-title{ - float: left; -} - -/* phpcs:set Squiz.WhiteSpace.SuperfluousWhitespace ignoreBlankLines true */ -.HelpWidgetType-new-bug-title{ - float: left; -} - -.HelpWidgetType-new-bug-title{ - float: left; -} -/* phpcs:set Squiz.WhiteSpace.SuperfluousWhitespace ignoreBlankLines false */ - -// /** -// * This text is in two types of comment: each line is commented out -// * individually, and the whole block is in what looks like a -// * docblock-comment. This sniff should ignore all this text as there -// * is no superfluous white-space here. -// */ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.css.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.css.fixed deleted file mode 100644 index 11be21d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.css.fixed +++ /dev/null @@ -1,30 +0,0 @@ -.HelpWidgetType-new-bug-title { - float: left; -} -.HelpWidgetType-new-bug-title { - float: left; -} -.HelpWidgetType-new-bug-title { - float: left; -} - -.HelpWidgetType-new-bug-title{ - float: left; -} - -/* phpcs:set Squiz.WhiteSpace.SuperfluousWhitespace ignoreBlankLines true */ -.HelpWidgetType-new-bug-title{ - float: left; -} - -.HelpWidgetType-new-bug-title{ - float: left; -} -/* phpcs:set Squiz.WhiteSpace.SuperfluousWhitespace ignoreBlankLines false */ - -// /** -// * This text is in two types of comment: each line is commented out -// * individually, and the whole block is in what looks like a -// * docblock-comment. This sniff should ignore all this text as there -// * is no superfluous white-space here. -// */ diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.inc deleted file mode 100644 index f9dca29..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.inc +++ /dev/null @@ -1,74 +0,0 @@ - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.inc.fixed deleted file mode 100644 index 1d764eb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.inc.fixed +++ /dev/null @@ -1,68 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.js deleted file mode 100644 index be542e7..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.js +++ /dev/null @@ -1,56 +0,0 @@ - -alert('hi'); -alert('hello'); - -if (something) { - -} - - -function myFunction() -{ - alert('code here'); - - alert('code here'); - - - // Hello. - - /* - HI - */ - - -} - -function myFunction2() -{ - alert('code here'); - - - alert('code here'); - -} - -MyFunction = function() -{ - alert('code here'); - - - alert('code here'); - -}; - -// phpcs:set Squiz.WhiteSpace.SuperfluousWhitespace ignoreBlankLines true - -function myFunction2() -{ - alert('code here'); - - alert('code here'); - -} - -// phpcs:set Squiz.WhiteSpace.SuperfluousWhitespace ignoreBlankLines false - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.js.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.js.fixed deleted file mode 100644 index 960111a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.1.js.fixed +++ /dev/null @@ -1,50 +0,0 @@ -alert('hi'); -alert('hello'); - -if (something) { - -} - - -function myFunction() -{ - alert('code here'); - - alert('code here'); - - // Hello. - - /* - HI - */ - -} - -function myFunction2() -{ - alert('code here'); - - alert('code here'); - -} - -MyFunction = function() -{ - alert('code here'); - - alert('code here'); - -}; - -// phpcs:set Squiz.WhiteSpace.SuperfluousWhitespace ignoreBlankLines true - -function myFunction2() -{ - alert('code here'); - - alert('code here'); - -} - -// phpcs:set Squiz.WhiteSpace.SuperfluousWhitespace ignoreBlankLines false - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.css deleted file mode 100644 index 2025eeb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.css +++ /dev/null @@ -1,3 +0,0 @@ -.HelpWidgetType-new-bug-title { - float: left; -} \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.css.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.css.fixed deleted file mode 100644 index 2025eeb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.css.fixed +++ /dev/null @@ -1,3 +0,0 @@ -.HelpWidgetType-new-bug-title { - float: left; -} \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.inc deleted file mode 100644 index a6e2b8a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.inc +++ /dev/null @@ -1,9 +0,0 @@ - - -

    - -

    - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.inc.fixed deleted file mode 100644 index 78c4525..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.inc.fixed +++ /dev/null @@ -1,7 +0,0 @@ - -

    - -

    diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.js deleted file mode 100644 index 7b0c8ea..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.js +++ /dev/null @@ -1 +0,0 @@ -alert('hi'); \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.js.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.js.fixed deleted file mode 100644 index 7b0c8ea..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.2.js.fixed +++ /dev/null @@ -1 +0,0 @@ -alert('hi'); \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.css b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.css deleted file mode 100644 index 9f794a0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.css +++ /dev/null @@ -1,3 +0,0 @@ -.HelpWidgetType-new-bug-title { - float: left; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.css.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.css.fixed deleted file mode 100644 index 2025eeb..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.css.fixed +++ /dev/null @@ -1,3 +0,0 @@ -.HelpWidgetType-new-bug-title { - float: left; -} \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.inc deleted file mode 100644 index 661ebda..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.inc +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.inc.fixed deleted file mode 100644 index 0cb9748..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.inc.fixed +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.js b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.js deleted file mode 100644 index 70f6719..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.js +++ /dev/null @@ -1 +0,0 @@ -alert('hi'); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.js.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.js.fixed deleted file mode 100644 index 70f6719..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.3.js.fixed +++ /dev/null @@ -1 +0,0 @@ -alert('hi'); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.4.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.4.inc deleted file mode 100644 index 96860ff..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.4.inc +++ /dev/null @@ -1,4 +0,0 @@ - \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.4.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.4.inc.fixed deleted file mode 100644 index b26b5b2..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.4.inc.fixed +++ /dev/null @@ -1,4 +0,0 @@ - \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.5.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.5.inc deleted file mode 100644 index 4d6f06b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.5.inc +++ /dev/null @@ -1,5 +0,0 @@ -   -  \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.5.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.5.inc.fixed deleted file mode 100644 index 8ec5f30..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.5.inc.fixed +++ /dev/null @@ -1,4 +0,0 @@ - \ No newline at end of file diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.php deleted file mode 100644 index 36dc9be..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/Tests/WhiteSpace/SuperfluousWhitespaceUnitTest.php +++ /dev/null @@ -1,117 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Squiz\Tests\WhiteSpace; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the SuperfluousWhitespace sniff. - * - * @covers \PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace\SuperfluousWhitespaceSniff - */ -final class SuperfluousWhitespaceUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'SuperfluousWhitespaceUnitTest.1.inc': - return [ - 2 => 1, - 4 => 1, - 5 => 1, - 6 => 1, - 7 => 1, - 16 => 1, - 23 => 1, - 28 => 1, - 33 => 1, - 49 => 1, - 62 => 1, - 65 => 1, - 73 => 1, - ]; - - case 'SuperfluousWhitespaceUnitTest.2.inc': - return [ - 2 => 1, - 8 => 1, - ]; - - case 'SuperfluousWhitespaceUnitTest.3.inc': - return [ - 6 => 1, - 10 => 1, - ]; - - case 'SuperfluousWhitespaceUnitTest.4.inc': - case 'SuperfluousWhitespaceUnitTest.5.inc': - return [ - 1 => 1, - 4 => 1, - ]; - - case 'SuperfluousWhitespaceUnitTest.1.js': - return [ - 1 => 1, - 3 => 1, - 4 => 1, - 5 => 1, - 6 => 1, - 15 => 1, - 22 => 1, - 29 => 1, - 38 => 1, - 56 => 1, - ]; - - case 'SuperfluousWhitespaceUnitTest.1.css': - return [ - 1 => 1, - 8 => 1, - 9 => 1, - 11 => 1, - 32 => 1, - ]; - - default: - return []; - }//end switch - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/ruleset.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/ruleset.xml deleted file mode 100644 index 82f5270..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Squiz/ruleset.xml +++ /dev/null @@ -1,138 +0,0 @@ - - - The Squiz coding standard. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - - - - - - - - - - - - - - - %2$s - - - - - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - 0 - - - - - - - - - - 0 - - - error - - - - - 0 - - - error - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Docs/Debug/CodeAnalyzerStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Docs/Debug/CodeAnalyzerStandard.xml deleted file mode 100644 index c462b4f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Docs/Debug/CodeAnalyzerStandard.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - $bar + $baz; -} - ]]> - - - $bar + 2; -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Docs/Files/ClosingTagStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Docs/Files/ClosingTagStandard.xml deleted file mode 100644 index f1dca3c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Docs/Files/ClosingTagStandard.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - ?> - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Docs/NamingConventions/ValidVariableNameStandard.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Docs/NamingConventions/ValidVariableNameStandard.xml deleted file mode 100644 index 5bcde4b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Docs/NamingConventions/ValidVariableNameStandard.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - $testNumber = 1; - ]]> - - - $Test_Number = 1; - ]]> - - - - - _bar; -} - ]]> - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Sniffs/Debug/CodeAnalyzerSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Sniffs/Debug/CodeAnalyzerSniff.php deleted file mode 100644 index ca399d0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Sniffs/Debug/CodeAnalyzerSniff.php +++ /dev/null @@ -1,137 +0,0 @@ - - * @author Greg Sherwood - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - * - * @deprecated 3.9.0 - */ - -namespace PHP_CodeSniffer\Standards\Zend\Sniffs\Debug; - -use PHP_CodeSniffer\Sniffs\DeprecatedSniff; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Exceptions\RuntimeException; -use PHP_CodeSniffer\Util\Common; - -class CodeAnalyzerSniff implements Sniff, DeprecatedSniff -{ - - - /** - * Returns the token types that this sniff is interested in. - * - * @return array - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes the tokens that this sniff is interested in. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where the token was found. - * @param int $stackPtr The position in the stack where - * the token was found. - * - * @return int - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException If ZendCodeAnalyzer could not be run. - */ - public function process(File $phpcsFile, $stackPtr) - { - $analyzerPath = Config::getExecutablePath('zend_ca'); - if ($analyzerPath === null) { - return $phpcsFile->numTokens; - } - - $fileName = $phpcsFile->getFilename(); - - // In the command, 2>&1 is important because the code analyzer sends its - // findings to stderr. $output normally contains only stdout, so using 2>&1 - // will pipe even stderr to stdout. - $cmd = Common::escapeshellcmd($analyzerPath).' '.escapeshellarg($fileName).' 2>&1'; - - // There is the possibility to pass "--ide" as an option to the analyzer. - // This would result in an output format which would be easier to parse. - // The problem here is that no cleartext error messages are returned; only - // error-code-labels. So for a start we go for cleartext output. - $exitCode = exec($cmd, $output, $retval); - - // Variable $exitCode is the last line of $output if no error occurs, on - // error it is numeric. Try to handle various error conditions and - // provide useful error reporting. - if (is_numeric($exitCode) === true && $exitCode > 0) { - if (is_array($output) === true) { - $msg = implode('\n', $output); - } - - throw new RuntimeException("Failed invoking ZendCodeAnalyzer, exitcode was [$exitCode], retval was [$retval], output was [$msg]"); - } - - if (is_array($output) === true) { - foreach ($output as $finding) { - // The first two lines of analyzer output contain - // something like this: - // > Zend Code Analyzer 1.2.2 - // > Analyzing ... - // So skip these... - $res = preg_match("/^.+\(line ([0-9]+)\):(.+)$/", $finding, $regs); - if (empty($regs) === true || $res === false) { - continue; - } - - $phpcsFile->addWarningOnLine(trim($regs[2]), $regs[1], 'ExternalTool'); - } - } - - // Ignore the rest of the file. - return $phpcsFile->numTokens; - - }//end process() - - - /** - * Provide the version number in which the sniff was deprecated. - * - * @return string - */ - public function getDeprecationVersion() - { - return 'v3.9.0'; - - }//end getDeprecationVersion() - - - /** - * Provide the version number in which the sniff will be removed. - * - * @return string - */ - public function getRemovalVersion() - { - return 'v4.0.0'; - - }//end getRemovalVersion() - - - /** - * Provide a custom message to display with the deprecation. - * - * @return string - */ - public function getDeprecationMessage() - { - return ''; - - }//end getDeprecationMessage() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Sniffs/Files/ClosingTagSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Sniffs/Files/ClosingTagSniff.php deleted file mode 100644 index f3f257e..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Sniffs/Files/ClosingTagSniff.php +++ /dev/null @@ -1,79 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Zend\Sniffs\Files; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; - -class ClosingTagSniff implements Sniff -{ - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() - { - return [T_OPEN_TAG]; - - }//end register() - - - /** - * Processes this sniff, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in - * the stack passed in $tokens. - * - * @return int - */ - public function process(File $phpcsFile, $stackPtr) - { - // Find the last non-empty token. - $tokens = $phpcsFile->getTokens(); - for ($last = ($phpcsFile->numTokens - 1); $last > 0; $last--) { - if (trim($tokens[$last]['content']) !== '') { - break; - } - } - - if ($tokens[$last]['code'] === T_CLOSE_TAG) { - $error = 'A closing tag is not permitted at the end of a PHP file'; - $fix = $phpcsFile->addFixableError($error, $last, 'NotAllowed'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($last, $phpcsFile->eolChar); - $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($last - 1), null, true); - if ($tokens[$prev]['code'] !== T_SEMICOLON - && $tokens[$prev]['code'] !== T_CLOSE_CURLY_BRACKET - && $tokens[$prev]['code'] !== T_OPEN_TAG - ) { - $phpcsFile->fixer->addContent($prev, ';'); - } - - $phpcsFile->fixer->endChangeset(); - } - - $phpcsFile->recordMetric($stackPtr, 'PHP closing tag at EOF', 'yes'); - } else { - $phpcsFile->recordMetric($stackPtr, 'PHP closing tag at EOF', 'no'); - }//end if - - // Ignore the rest of the file. - return $phpcsFile->numTokens; - - }//end process() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Sniffs/NamingConventions/ValidVariableNameSniff.php b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Sniffs/NamingConventions/ValidVariableNameSniff.php deleted file mode 100644 index 06d6bfd..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Sniffs/NamingConventions/ValidVariableNameSniff.php +++ /dev/null @@ -1,196 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Zend\Sniffs\NamingConventions; - -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Sniffs\AbstractVariableSniff; -use PHP_CodeSniffer\Util\Common; -use PHP_CodeSniffer\Util\Tokens; - -class ValidVariableNameSniff extends AbstractVariableSniff -{ - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - protected function processVariable(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $varName = ltrim($tokens[$stackPtr]['content'], '$'); - - // If it's a php reserved var, then its ok. - if (isset($this->phpReservedVars[$varName]) === true) { - return; - } - - $objOperator = $phpcsFile->findNext([T_WHITESPACE], ($stackPtr + 1), null, true); - if ($tokens[$objOperator]['code'] === T_OBJECT_OPERATOR - || $tokens[$objOperator]['code'] === T_NULLSAFE_OBJECT_OPERATOR - ) { - // Check to see if we are using a variable from an object. - $var = $phpcsFile->findNext([T_WHITESPACE], ($objOperator + 1), null, true); - if ($tokens[$var]['code'] === T_STRING) { - // Either a var name or a function call, so check for bracket. - $bracket = $phpcsFile->findNext([T_WHITESPACE], ($var + 1), null, true); - - if ($tokens[$bracket]['code'] !== T_OPEN_PARENTHESIS) { - $objVarName = $tokens[$var]['content']; - - // There is no way for us to know if the var is public or private, - // so we have to ignore a leading underscore if there is one and just - // check the main part of the variable name. - $originalVarName = $objVarName; - if (substr($objVarName, 0, 1) === '_') { - $objVarName = substr($objVarName, 1); - } - - if (Common::isCamelCaps($objVarName, false, true, false) === false) { - $error = 'Variable "%s" is not in valid camel caps format'; - $data = [$originalVarName]; - $phpcsFile->addError($error, $var, 'NotCamelCaps', $data); - } else if (preg_match('|\d|', $objVarName) === 1) { - $warning = 'Variable "%s" contains numbers but this is discouraged'; - $data = [$originalVarName]; - $phpcsFile->addWarning($warning, $stackPtr, 'ContainsNumbers', $data); - } - }//end if - }//end if - }//end if - - // There is no way for us to know if the var is public or private, - // so we have to ignore a leading underscore if there is one and just - // check the main part of the variable name. - $originalVarName = $varName; - if (substr($varName, 0, 1) === '_') { - $objOperator = $phpcsFile->findPrevious([T_WHITESPACE], ($stackPtr - 1), null, true); - if ($tokens[$objOperator]['code'] === T_DOUBLE_COLON) { - // The variable lives within a class, and is referenced like - // this: MyClass::$_variable, so we don't know its scope. - $inClass = true; - } else { - $inClass = $phpcsFile->hasCondition($stackPtr, Tokens::$ooScopeTokens); - } - - if ($inClass === true) { - $varName = substr($varName, 1); - } - } - - if (Common::isCamelCaps($varName, false, true, false) === false) { - $error = 'Variable "%s" is not in valid camel caps format'; - $data = [$originalVarName]; - $phpcsFile->addError($error, $stackPtr, 'NotCamelCaps', $data); - } else if (preg_match('|\d|', $varName) === 1) { - $warning = 'Variable "%s" contains numbers but this is discouraged'; - $data = [$originalVarName]; - $phpcsFile->addWarning($warning, $stackPtr, 'ContainsNumbers', $data); - } - - }//end processVariable() - - - /** - * Processes class member variables. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - protected function processMemberVar(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - $varName = ltrim($tokens[$stackPtr]['content'], '$'); - $memberProps = $phpcsFile->getMemberProperties($stackPtr); - if (empty($memberProps) === true) { - // Exception encountered. - return; - } - - $public = ($memberProps['scope'] === 'public'); - - if ($public === true) { - if (substr($varName, 0, 1) === '_') { - $error = 'Public member variable "%s" must not contain a leading underscore'; - $data = [$varName]; - $phpcsFile->addError($error, $stackPtr, 'PublicHasUnderscore', $data); - } - } else { - if (substr($varName, 0, 1) !== '_') { - $scope = ucfirst($memberProps['scope']); - $error = '%s member variable "%s" must contain a leading underscore'; - $data = [ - $scope, - $varName, - ]; - $phpcsFile->addError($error, $stackPtr, 'PrivateNoUnderscore', $data); - } - } - - // Remove a potential underscore prefix for testing CamelCaps. - $varName = ltrim($varName, '_'); - - if (Common::isCamelCaps($varName, false, true, false) === false) { - $error = 'Member variable "%s" is not in valid camel caps format'; - $data = [$varName]; - $phpcsFile->addError($error, $stackPtr, 'MemberVarNotCamelCaps', $data); - } else if (preg_match('|\d|', $varName) === 1) { - $warning = 'Member variable "%s" contains numbers but this is discouraged'; - $data = [$varName]; - $phpcsFile->addWarning($warning, $stackPtr, 'MemberVarContainsNumbers', $data); - } - - }//end processMemberVar() - - - /** - * Processes the variable found within a double quoted string. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the double quoted - * string. - * - * @return void - */ - protected function processVariableInString(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - if (preg_match_all('|[^\\\]\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)|', $tokens[$stackPtr]['content'], $matches) !== 0) { - foreach ($matches[1] as $varName) { - // If it's a php reserved var, then its ok. - if (isset($this->phpReservedVars[$varName]) === true) { - continue; - } - - if (Common::isCamelCaps($varName, false, true, false) === false) { - $error = 'Variable "%s" is not in valid camel caps format'; - $data = [$varName]; - $phpcsFile->addError($error, $stackPtr, 'StringVarNotCamelCaps', $data); - } else if (preg_match('|\d|', $varName) === 1) { - $warning = 'Variable "%s" contains numbers but this is discouraged'; - $data = [$varName]; - $phpcsFile->addWarning($warning, $stackPtr, 'StringVarContainsNumbers', $data); - } - }//end foreach - }//end if - - }//end processVariableInString() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Debug/CodeAnalyzerUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Debug/CodeAnalyzerUnitTest.inc deleted file mode 100644 index c8d0499..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Debug/CodeAnalyzerUnitTest.inc +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Debug/CodeAnalyzerUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Debug/CodeAnalyzerUnitTest.php deleted file mode 100644 index 1c71e7b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Debug/CodeAnalyzerUnitTest.php +++ /dev/null @@ -1,71 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Zend\Tests\Debug; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; -use PHP_CodeSniffer\Config; - -/** - * Unit test class for the CodeAnalyzer sniff. - * - * @covers \PHP_CodeSniffer\Standards\Zend\Sniffs\Debug\CodeAnalyzerSniff - */ -final class CodeAnalyzerUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Should this test be skipped for some reason. - * - * @return bool - */ - protected function shouldSkipTest() - { - $analyzerPath = Config::getExecutablePath('zend_ca'); - if ($analyzerPath === null) { - return true; - } - - return false; - - }//end shouldSkipTest() - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return []; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [2 => 1]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.1.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.1.inc deleted file mode 100644 index 7e7089d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.1.inc +++ /dev/null @@ -1,12 +0,0 @@ - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.1.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.1.inc.fixed deleted file mode 100644 index caf3b38..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.1.inc.fixed +++ /dev/null @@ -1,12 +0,0 @@ - - -

    - -
    diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.3.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.3.inc deleted file mode 100644 index 63df04d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.3.inc +++ /dev/null @@ -1 +0,0 @@ -add('arg'))?> diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.3.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.3.inc.fixed deleted file mode 100644 index b4c4621..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.3.inc.fixed +++ /dev/null @@ -1 +0,0 @@ -add('arg')); diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.4.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.4.inc deleted file mode 100644 index 539365d..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.4.inc +++ /dev/null @@ -1 +0,0 @@ -add('arg')) /* comment */ ?> diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.4.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.4.inc.fixed deleted file mode 100644 index 4cc31a5..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.4.inc.fixed +++ /dev/null @@ -1 +0,0 @@ -add('arg')); /* comment */ diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.5.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.5.inc deleted file mode 100644 index 09e4844..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.5.inc +++ /dev/null @@ -1 +0,0 @@ -add('arg')); } ?> diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.5.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.5.inc.fixed deleted file mode 100644 index 9ff112a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.5.inc.fixed +++ /dev/null @@ -1 +0,0 @@ -add('arg')); } diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.6.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.6.inc deleted file mode 100644 index 48de7e0..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.6.inc +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.6.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.6.inc.fixed deleted file mode 100644 index 796727a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.6.inc.fixed +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.7.inc.fixed b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.7.inc.fixed deleted file mode 100644 index dc84e23..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/Files/ClosingTagUnitTest.7.inc.fixed +++ /dev/null @@ -1 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Zend\Tests\Files; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ClosingTag sniff. - * - * @covers \PHP_CodeSniffer\Standards\Zend\Sniffs\Files\ClosingTagSniff - */ -final class ClosingTagUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @param string $testFile The name of the file being tested. - * - * @return array - */ - public function getErrorList($testFile='') - { - switch ($testFile) { - case 'ClosingTagUnitTest.1.inc': - return [11 => 1]; - - case 'ClosingTagUnitTest.3.inc': - case 'ClosingTagUnitTest.4.inc': - case 'ClosingTagUnitTest.5.inc': - case 'ClosingTagUnitTest.7.inc': - return [1 => 1]; - - case 'ClosingTagUnitTest.6.inc': - return [3 => 1]; - - default: - return []; - } - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return []; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/NamingConventions/ValidVariableNameUnitTest.inc b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/NamingConventions/ValidVariableNameUnitTest.inc deleted file mode 100644 index f3ea469..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/NamingConventions/ValidVariableNameUnitTest.inc +++ /dev/null @@ -1,145 +0,0 @@ -varName; -echo $this->var_name; -echo $this->varname; -echo $this->_varName; -echo $this->varName2; -echo $object->varName; -echo $object->var_name; -echo $object->varName2; -echo $object_name->varname; -echo $object_name->_varName; -echo $object_name->varName2; - -echo $this->myFunction($one, $two); -echo $object->myFunction($one_two, $var2); - -$error = "format is \$GLOBALS['$varName']"; -$error = "format is \$GLOBALS['$varName2']"; - -echo $_SESSION['var_name']; -echo $_FILES['var_name']; -echo $_ENV['var_name']; -echo $_COOKIE['var_name']; -echo $_COOKIE['var_name2']; - -$XML = 'hello'; -$myXML = 'hello'; -$XMLParser = 'hello'; -$xmlParser = 'hello'; -$xmlParser2 = 'hello'; - -echo "{$_SERVER['HOSTNAME']} $var_name"; - -$someObject->{$name}; -$someObject->my_function($var_name); - -var_dump($http_response_header); -var_dump($HTTP_RAW_POST_DATA); -var_dump($php_errormsg); - -interface Base -{ - protected $anonymous; - - public function __construct(); -} - -$anonClass = new class() { - public function foo($foo, $_foo, $foo_bar) { - $bar = 1; - $_bar = 2; - $bar_foo = 3; - } -}; - -echo $obj?->varName; -echo $obj?->var_name; -echo $obj?->varName; - -enum SomeEnum -{ - public function foo($foo, $_foo, $foo_bar) { - $bar = 1; - $_bar = 2; - $bar_foo = 3; - } -} - -class AsymVisibility { - // The read scope is public, but not specified. Enforce the naming conventions anyway. - private(set) $asymPublicImplied = 'hello'; - private(set) $_asymPublicImplied = 'hello'; - - // The read scope is private, so these properties should be handled as private properties. - private private(set) $asymPrivate = 'hello'; - private(set) private $_asymPrivate = 'hello'; - - // The read scope is public/protected, so these properties should be handled as public properties. - protected private(set) $asymProtectedPrivate = 'hello'; - private(set) public $_asymPrivatePublic = 'hello'; -} diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/NamingConventions/ValidVariableNameUnitTest.php b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/NamingConventions/ValidVariableNameUnitTest.php deleted file mode 100644 index 5cc2abc..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/Tests/NamingConventions/ValidVariableNameUnitTest.php +++ /dev/null @@ -1,106 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Standards\Zend\Tests\NamingConventions; - -use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; - -/** - * Unit test class for the ValidVariableName sniff. - * - * @covers \PHP_CodeSniffer\Standards\Zend\Sniffs\NamingConventions\ValidVariableNameSniff - */ -final class ValidVariableNameUnitTest extends AbstractSniffUnitTest -{ - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - public function getErrorList() - { - return [ - 3 => 1, - 5 => 1, - 11 => 1, - 13 => 1, - 17 => 1, - 19 => 1, - 23 => 1, - 25 => 1, - 29 => 1, - 31 => 1, - 36 => 1, - 38 => 1, - 42 => 1, - 44 => 1, - 48 => 1, - 50 => 1, - 61 => 1, - 67 => 1, - 72 => 1, - 74 => 1, - 75 => 1, - 76 => 1, - 79 => 1, - 96 => 1, - 99 => 1, - 113 => 1, - 116 => 1, - 121 => 1, - 126 => 1, - 129 => 1, - 136 => 1, - 139 => 1, - 143 => 1, - 144 => 1, - ]; - - }//end getErrorList() - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - public function getWarningList() - { - return [ - 6 => 1, - 14 => 1, - 20 => 1, - 26 => 1, - 32 => 1, - 39 => 1, - 45 => 1, - 51 => 1, - 64 => 1, - 70 => 1, - 73 => 1, - 76 => 1, - 79 => 1, - 82 => 1, - 94 => 1, - // Warning from getMemberProperties() about parse error. - 107 => 1, - ]; - - }//end getWarningList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/ruleset.xml b/vendor/squizlabs/php_codesniffer/src/Standards/Zend/ruleset.xml deleted file mode 100644 index d10b103..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Standards/Zend/ruleset.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - A coding standard based on an early Zend Framework coding standard. Note that this standard is out of date. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/src/Tokenizers/CSS.php b/vendor/squizlabs/php_codesniffer/src/Tokenizers/CSS.php deleted file mode 100644 index c3053ee..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Tokenizers/CSS.php +++ /dev/null @@ -1,541 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tokenizers; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Exceptions\TokenizerException; -use PHP_CodeSniffer\Util; - -class CSS extends PHP -{ - - - /** - * Initialise the tokenizer. - * - * Pre-checks the content to see if it looks minified. - * - * @param string $content The content to tokenize. - * @param \PHP_CodeSniffer\Config $config The config data for the run. - * @param string $eolChar The EOL char used in the content. - * - * @return void - * @throws \PHP_CodeSniffer\Exceptions\TokenizerException If the file appears to be minified. - */ - public function __construct($content, Config $config, $eolChar='\n') - { - if ($this->isMinifiedContent($content, $eolChar) === true) { - throw new TokenizerException('File appears to be minified and cannot be processed'); - } - - parent::__construct($content, $config, $eolChar); - - }//end __construct() - - - /** - * Creates an array of tokens when given some CSS code. - * - * Uses the PHP tokenizer to do all the tricky work - * - * @param string $string The string to tokenize. - * - * @return array - */ - public function tokenize($string) - { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t*** START CSS TOKENIZING 1ST PASS ***".PHP_EOL; - } - - // If the content doesn't have an EOL char on the end, add one so - // the open and close tags we add are parsed correctly. - $eolAdded = false; - if (substr($string, (strlen($this->eolChar) * -1)) !== $this->eolChar) { - $string .= $this->eolChar; - $eolAdded = true; - } - - $string = str_replace('', '^PHPCS_CSS_T_CLOSE_TAG^', $string); - $tokens = parent::tokenize(''); - - $finalTokens = []; - $finalTokens[0] = [ - 'code' => T_OPEN_TAG, - 'type' => 'T_OPEN_TAG', - 'content' => '', - ]; - - $newStackPtr = 1; - $numTokens = count($tokens); - $multiLineComment = false; - for ($stackPtr = 1; $stackPtr < $numTokens; $stackPtr++) { - $token = $tokens[$stackPtr]; - - // CSS files don't have lists, breaks etc, so convert these to - // standard strings early so they can be converted into T_STYLE - // tokens and joined with other strings if needed. - if ($token['code'] === T_BREAK - || $token['code'] === T_LIST - || $token['code'] === T_DEFAULT - || $token['code'] === T_SWITCH - || $token['code'] === T_FOR - || $token['code'] === T_FOREACH - || $token['code'] === T_WHILE - || $token['code'] === T_DEC - || $token['code'] === T_NEW - ) { - $token['type'] = 'T_STRING'; - $token['code'] = T_STRING; - } - - $token['content'] = str_replace('^PHPCS_CSS_T_OPEN_TAG^', '', $token['content']); - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $token['type']; - $content = Util\Common::prepareForOutput($token['content']); - echo "\tProcess token $stackPtr: $type => $content".PHP_EOL; - } - - if ($token['code'] === T_BITWISE_XOR - && $tokens[($stackPtr + 1)]['content'] === 'PHPCS_CSS_T_OPEN_TAG' - ) { - $content = ''; - $stackPtr += 2; - break; - } else { - $content .= $tokens[$stackPtr]['content']; - } - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t=> Found embedded PHP code: "; - $cleanContent = Util\Common::prepareForOutput($content); - echo $cleanContent.PHP_EOL; - } - - $finalTokens[$newStackPtr] = [ - 'type' => 'T_EMBEDDED_PHP', - 'code' => T_EMBEDDED_PHP, - 'content' => $content, - ]; - - $newStackPtr++; - continue; - }//end if - - if ($token['code'] === T_GOTO_LABEL) { - // Convert these back to T_STRING followed by T_COLON so we can - // more easily process style definitions. - $finalTokens[$newStackPtr] = [ - 'type' => 'T_STRING', - 'code' => T_STRING, - 'content' => substr($token['content'], 0, -1), - ]; - $newStackPtr++; - $finalTokens[$newStackPtr] = [ - 'type' => 'T_COLON', - 'code' => T_COLON, - 'content' => ':', - ]; - $newStackPtr++; - continue; - } - - if ($token['code'] === T_FUNCTION) { - // There are no functions in CSS, so convert this to a string. - $finalTokens[$newStackPtr] = [ - 'type' => 'T_STRING', - 'code' => T_STRING, - 'content' => $token['content'], - ]; - - $newStackPtr++; - continue; - } - - if ($token['code'] === T_COMMENT - && substr($token['content'], 0, 2) === '/*' - ) { - // Multi-line comment. Record it so we can ignore other - // comment tags until we get out of this one. - $multiLineComment = true; - } - - if ($token['code'] === T_COMMENT - && $multiLineComment === false - && (substr($token['content'], 0, 2) === '//' - || $token['content'][0] === '#') - ) { - $content = ltrim($token['content'], '#/'); - - // Guard against PHP7+ syntax errors by stripping - // leading zeros so the content doesn't look like an invalid int. - $leadingZero = false; - if ($content[0] === '0') { - $content = '1'.$content; - $leadingZero = true; - } - - $commentTokens = parent::tokenize(''); - - // The first and last tokens are the open/close tags. - array_shift($commentTokens); - $closeTag = array_pop($commentTokens); - - while ($closeTag['content'] !== '?'.'>') { - $closeTag = array_pop($commentTokens); - } - - if ($leadingZero === true) { - $commentTokens[0]['content'] = substr($commentTokens[0]['content'], 1); - $content = substr($content, 1); - } - - if ($token['content'][0] === '#') { - // The # character is not a comment in CSS files, so - // determine what it means in this context. - $firstContent = $commentTokens[0]['content']; - - // If the first content is just a number, it is probably a - // colour like 8FB7DB, which PHP splits into 8 and FB7DB. - if (($commentTokens[0]['code'] === T_LNUMBER - || $commentTokens[0]['code'] === T_DNUMBER) - && $commentTokens[1]['code'] === T_STRING - ) { - $firstContent .= $commentTokens[1]['content']; - array_shift($commentTokens); - } - - // If the first content looks like a colour and not a class - // definition, join the tokens together. - if (preg_match('/^[ABCDEF0-9]+$/i', $firstContent) === 1 - && $commentTokens[1]['content'] !== '-' - ) { - array_shift($commentTokens); - // Work out what we trimmed off above and remember to re-add it. - $trimmed = substr($token['content'], 0, (strlen($token['content']) - strlen($content))); - $finalTokens[$newStackPtr] = [ - 'type' => 'T_COLOUR', - 'code' => T_COLOUR, - 'content' => $trimmed.$firstContent, - ]; - } else { - $finalTokens[$newStackPtr] = [ - 'type' => 'T_HASH', - 'code' => T_HASH, - 'content' => '#', - ]; - } - } else { - $finalTokens[$newStackPtr] = [ - 'type' => 'T_STRING', - 'code' => T_STRING, - 'content' => '//', - ]; - }//end if - - $newStackPtr++; - - array_splice($tokens, $stackPtr, 1, $commentTokens); - $numTokens = count($tokens); - $stackPtr--; - continue; - }//end if - - if ($token['code'] === T_COMMENT - && substr($token['content'], -2) === '*/' - ) { - // Multi-line comment is done. - $multiLineComment = false; - } - - $finalTokens[$newStackPtr] = $token; - $newStackPtr++; - }//end for - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t*** END CSS TOKENIZING 1ST PASS ***".PHP_EOL; - echo "\t*** START CSS TOKENIZING 2ND PASS ***".PHP_EOL; - } - - // A flag to indicate if we are inside a style definition, - // which is defined using curly braces. - $inStyleDef = false; - - // A flag to indicate if an At-rule like "@media" is used, which will result - // in nested curly brackets. - $asperandStart = false; - - $numTokens = count($finalTokens); - for ($stackPtr = 0; $stackPtr < $numTokens; $stackPtr++) { - $token = $finalTokens[$stackPtr]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $token['type']; - $content = Util\Common::prepareForOutput($token['content']); - echo "\tProcess token $stackPtr: $type => $content".PHP_EOL; - } - - switch ($token['code']) { - case T_OPEN_CURLY_BRACKET: - // Opening curly brackets for an At-rule do not start a style - // definition. We also reset the asperand flag here because the next - // opening curly bracket could be indeed the start of a style - // definition. - if ($asperandStart === true) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - if ($inStyleDef === true) { - echo "\t\t* style definition closed *".PHP_EOL; - } - - if ($asperandStart === true) { - echo "\t\t* at-rule definition closed *".PHP_EOL; - } - } - - $inStyleDef = false; - $asperandStart = false; - } else { - $inStyleDef = true; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* style definition opened *".PHP_EOL; - } - } - break; - case T_CLOSE_CURLY_BRACKET: - if (PHP_CODESNIFFER_VERBOSITY > 1) { - if ($inStyleDef === true) { - echo "\t\t* style definition closed *".PHP_EOL; - } - - if ($asperandStart === true) { - echo "\t\t* at-rule definition closed *".PHP_EOL; - } - } - - $inStyleDef = false; - $asperandStart = false; - break; - case T_MINUS: - // Minus signs are often used instead of spaces inside - // class names, IDs and styles. - if ($finalTokens[($stackPtr + 1)]['code'] === T_STRING) { - if ($finalTokens[($stackPtr - 1)]['code'] === T_STRING) { - $newContent = $finalTokens[($stackPtr - 1)]['content'].'-'.$finalTokens[($stackPtr + 1)]['content']; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token is a string joiner; ignoring this and previous token".PHP_EOL; - $old = Util\Common::prepareForOutput($finalTokens[($stackPtr + 1)]['content']); - $new = Util\Common::prepareForOutput($newContent); - echo "\t\t=> token ".($stackPtr + 1)." content changed from \"$old\" to \"$new\"".PHP_EOL; - } - - $finalTokens[($stackPtr + 1)]['content'] = $newContent; - unset($finalTokens[$stackPtr]); - unset($finalTokens[($stackPtr - 1)]); - } else { - $newContent = '-'.$finalTokens[($stackPtr + 1)]['content']; - - $finalTokens[($stackPtr + 1)]['content'] = $newContent; - unset($finalTokens[$stackPtr]); - } - } else if ($finalTokens[($stackPtr + 1)]['code'] === T_LNUMBER) { - // They can also be used to provide negative numbers. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token is part of a negative number; adding content to next token and ignoring *".PHP_EOL; - $content = Util\Common::prepareForOutput($finalTokens[($stackPtr + 1)]['content']); - echo "\t\t=> token ".($stackPtr + 1)." content changed from \"$content\" to \"-$content\"".PHP_EOL; - } - - $finalTokens[($stackPtr + 1)]['content'] = '-'.$finalTokens[($stackPtr + 1)]['content']; - unset($finalTokens[$stackPtr]); - }//end if - break; - case T_COLON: - // Only interested in colons that are defining styles. - if ($inStyleDef === false) { - break; - } - - for ($x = ($stackPtr - 1); $x >= 0; $x--) { - if (isset(Util\Tokens::$emptyTokens[$finalTokens[$x]['code']]) === false) { - break; - } - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $finalTokens[$x]['type']; - echo "\t\t=> token $x changed from $type to T_STYLE".PHP_EOL; - } - - $finalTokens[$x]['type'] = 'T_STYLE'; - $finalTokens[$x]['code'] = T_STYLE; - break; - case T_STRING: - if (strtolower($token['content']) === 'url') { - // Find the next content. - for ($x = ($stackPtr + 1); $x < $numTokens; $x++) { - if (isset(Util\Tokens::$emptyTokens[$finalTokens[$x]['code']]) === false) { - break; - } - } - - // Needs to be in the format "url(" for it to be a URL. - if ($finalTokens[$x]['code'] !== T_OPEN_PARENTHESIS) { - continue 2; - } - - // Make sure the content isn't empty. - for ($y = ($x + 1); $y < $numTokens; $y++) { - if (isset(Util\Tokens::$emptyTokens[$finalTokens[$y]['code']]) === false) { - break; - } - } - - if ($finalTokens[$y]['code'] === T_CLOSE_PARENTHESIS) { - continue 2; - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - for ($i = ($stackPtr + 1); $i <= $y; $i++) { - $type = $finalTokens[$i]['type']; - $content = Util\Common::prepareForOutput($finalTokens[$i]['content']); - echo "\tProcess token $i: $type => $content".PHP_EOL; - } - - echo "\t\t* token starts a URL *".PHP_EOL; - } - - // Join all the content together inside the url() statement. - $newContent = ''; - for ($i = ($x + 2); $i < $numTokens; $i++) { - if ($finalTokens[$i]['code'] === T_CLOSE_PARENTHESIS) { - break; - } - - $newContent .= $finalTokens[$i]['content']; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $content = Util\Common::prepareForOutput($finalTokens[$i]['content']); - echo "\t\t=> token $i added to URL string and ignored: $content".PHP_EOL; - } - - unset($finalTokens[$i]); - } - - $stackPtr = $i; - - // If the content inside the "url()" is in double quotes - // there will only be one token and so we don't have to do - // anything except change its type. If it is not empty, - // we need to do some token merging. - $finalTokens[($x + 1)]['type'] = 'T_URL'; - $finalTokens[($x + 1)]['code'] = T_URL; - - if ($newContent !== '') { - $finalTokens[($x + 1)]['content'] .= $newContent; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $content = Util\Common::prepareForOutput($finalTokens[($x + 1)]['content']); - echo "\t\t=> token content changed to: $content".PHP_EOL; - } - } - } else if ($finalTokens[$stackPtr]['content'][0] === '-' - && $finalTokens[($stackPtr + 1)]['code'] === T_STRING - ) { - if (isset($finalTokens[($stackPtr - 1)]) === true - && $finalTokens[($stackPtr - 1)]['code'] === T_STRING - ) { - $newContent = $finalTokens[($stackPtr - 1)]['content'].$finalTokens[$stackPtr]['content'].$finalTokens[($stackPtr + 1)]['content']; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token is a string joiner; ignoring this and previous token".PHP_EOL; - $old = Util\Common::prepareForOutput($finalTokens[($stackPtr + 1)]['content']); - $new = Util\Common::prepareForOutput($newContent); - echo "\t\t=> token ".($stackPtr + 1)." content changed from \"$old\" to \"$new\"".PHP_EOL; - } - - $finalTokens[($stackPtr + 1)]['content'] = $newContent; - unset($finalTokens[$stackPtr]); - unset($finalTokens[($stackPtr - 1)]); - } else { - $newContent = $finalTokens[$stackPtr]['content'].$finalTokens[($stackPtr + 1)]['content']; - - $finalTokens[($stackPtr + 1)]['content'] = $newContent; - unset($finalTokens[$stackPtr]); - } - }//end if - break; - case T_ASPERAND: - $asperandStart = true; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* at-rule definition opened *".PHP_EOL; - } - break; - default: - // Nothing special to be done with this token. - break; - }//end switch - }//end for - - // Reset the array keys to avoid gaps. - $finalTokens = array_values($finalTokens); - $numTokens = count($finalTokens); - - // Blank out the content of the end tag. - $finalTokens[($numTokens - 1)]['content'] = ''; - - if ($eolAdded === true) { - // Strip off the extra EOL char we added for tokenizing. - $finalTokens[($numTokens - 2)]['content'] = substr( - $finalTokens[($numTokens - 2)]['content'], - 0, - (strlen($this->eolChar) * -1) - ); - - if ($finalTokens[($numTokens - 2)]['content'] === '') { - unset($finalTokens[($numTokens - 2)]); - $finalTokens = array_values($finalTokens); - $numTokens = count($finalTokens); - } - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t*** END CSS TOKENIZING 2ND PASS ***".PHP_EOL; - } - - return $finalTokens; - - }//end tokenize() - - - /** - * Performs additional processing after main tokenizing. - * - * @return void - */ - public function processAdditional() - { - /* - We override this method because we don't want the PHP version to - run during CSS processing because it is wasted processing time. - */ - - }//end processAdditional() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Tokenizers/Comment.php b/vendor/squizlabs/php_codesniffer/src/Tokenizers/Comment.php deleted file mode 100644 index 4c3d82c..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Tokenizers/Comment.php +++ /dev/null @@ -1,280 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tokenizers; - -use PHP_CodeSniffer\Util\Common; - -class Comment -{ - - - /** - * Splits a single doc block comment token up into something that can be easily iterated over. - * - * @param string $string The doc block comment string to parse. - * @param string $eolChar The EOL character to use for splitting strings. - * @param int $stackPtr The position of the token in the "new"/final token stream. - * - * @return array>> - */ - public function tokenizeString($string, $eolChar, $stackPtr) - { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t*** START COMMENT TOKENIZING ***".PHP_EOL; - } - - $tokens = []; - $numChars = strlen($string); - - /* - Doc block comments start with /*, but typically contain an - extra star when they are used for function and class comments. - */ - - $char = ($numChars - strlen(ltrim($string, '/*'))); - $lastChars = substr($string, -2); - if ($char === $numChars && $lastChars === '*/') { - // Edge case: docblock without whitespace or contents. - $openTag = substr($string, 0, -2); - $string = $lastChars; - } else { - $openTag = substr($string, 0, $char); - $string = ltrim($string, '/*'); - } - - $tokens[$stackPtr] = [ - 'content' => $openTag, - 'code' => T_DOC_COMMENT_OPEN_TAG, - 'type' => 'T_DOC_COMMENT_OPEN_TAG', - 'comment_tags' => [], - ]; - - $openPtr = $stackPtr; - $stackPtr++; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $content = Common::prepareForOutput($openTag); - echo "\t\tCreate comment token: T_DOC_COMMENT_OPEN_TAG => $content".PHP_EOL; - } - - /* - Strip off the close tag so it doesn't interfere with any - of our comment line processing. The token will be added to the - stack just before we return it. - */ - - $closeTag = [ - 'content' => substr($string, strlen(rtrim($string, '/*'))), - 'code' => T_DOC_COMMENT_CLOSE_TAG, - 'type' => 'T_DOC_COMMENT_CLOSE_TAG', - 'comment_opener' => $openPtr, - ]; - - if ($closeTag['content'] === false) { - // In PHP < 8.0 substr() can return `false` instead of always returning a string. - $closeTag['content'] = ''; - } - - $string = rtrim($string, '/*'); - - /* - Process each line of the comment. - */ - - $lines = explode($eolChar, $string); - $numLines = count($lines); - foreach ($lines as $lineNum => $string) { - if ($lineNum !== ($numLines - 1)) { - $string .= $eolChar; - } - - $char = 0; - $numChars = strlen($string); - - // We've started a new line, so process the indent. - $space = $this->collectWhitespace($string, $char, $numChars); - if ($space !== null) { - $tokens[$stackPtr] = $space; - $stackPtr++; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $content = Common::prepareForOutput($space['content']); - echo "\t\tCreate comment token: T_DOC_COMMENT_WHITESPACE => $content".PHP_EOL; - } - - $char += strlen($space['content']); - if ($char === $numChars) { - break; - } - } - - if ($string === '') { - continue; - } - - if ($lineNum > 0 && $string[$char] === '*') { - // This is a function or class doc block line. - $char++; - $tokens[$stackPtr] = [ - 'content' => '*', - 'code' => T_DOC_COMMENT_STAR, - 'type' => 'T_DOC_COMMENT_STAR', - ]; - - $stackPtr++; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\tCreate comment token: T_DOC_COMMENT_STAR => *".PHP_EOL; - } - } - - // Now we are ready to process the actual content of the line. - $lineTokens = $this->processLine($string, $eolChar, $char, $numChars); - foreach ($lineTokens as $lineToken) { - $tokens[$stackPtr] = $lineToken; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $content = Common::prepareForOutput($lineToken['content']); - $type = $lineToken['type']; - echo "\t\tCreate comment token: $type => $content".PHP_EOL; - } - - if ($lineToken['code'] === T_DOC_COMMENT_TAG) { - $tokens[$openPtr]['comment_tags'][] = $stackPtr; - } - - $stackPtr++; - } - }//end foreach - - $tokens[$stackPtr] = $closeTag; - $tokens[$openPtr]['comment_closer'] = $stackPtr; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $content = Common::prepareForOutput($closeTag['content']); - echo "\t\tCreate comment token: T_DOC_COMMENT_CLOSE_TAG => $content".PHP_EOL; - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t*** END COMMENT TOKENIZING ***".PHP_EOL; - } - - return $tokens; - - }//end tokenizeString() - - - /** - * Process a single line of a comment. - * - * @param string $string The comment string being tokenized. - * @param string $eolChar The EOL character to use for splitting strings. - * @param int $start The position in the string to start processing. - * @param int $end The position in the string to end processing. - * - * @return array> - */ - private function processLine($string, $eolChar, $start, $end) - { - $tokens = []; - - // Collect content padding. - $space = $this->collectWhitespace($string, $start, $end); - if ($space !== null) { - $tokens[] = $space; - $start += strlen($space['content']); - } - - if (isset($string[$start]) === false) { - return $tokens; - } - - if ($string[$start] === '@') { - // The content up until the first whitespace is the tag name. - $matches = []; - preg_match('/@[^\s]+/', $string, $matches, 0, $start); - if (isset($matches[0]) === true - && substr(strtolower($matches[0]), 0, 7) !== '@phpcs:' - ) { - $tagName = $matches[0]; - $start += strlen($tagName); - $tokens[] = [ - 'content' => $tagName, - 'code' => T_DOC_COMMENT_TAG, - 'type' => 'T_DOC_COMMENT_TAG', - ]; - - // Then there will be some whitespace. - $space = $this->collectWhitespace($string, $start, $end); - if ($space !== null) { - $tokens[] = $space; - $start += strlen($space['content']); - } - } - }//end if - - // Process the rest of the line. - $eol = strpos($string, $eolChar, $start); - if ($eol === false) { - $eol = $end; - } - - if ($eol > $start) { - $tokens[] = [ - 'content' => substr($string, $start, ($eol - $start)), - 'code' => T_DOC_COMMENT_STRING, - 'type' => 'T_DOC_COMMENT_STRING', - ]; - } - - if ($eol !== $end) { - $tokens[] = [ - 'content' => substr($string, $eol, strlen($eolChar)), - 'code' => T_DOC_COMMENT_WHITESPACE, - 'type' => 'T_DOC_COMMENT_WHITESPACE', - ]; - } - - return $tokens; - - }//end processLine() - - - /** - * Collect consecutive whitespace into a single token. - * - * @param string $string The comment string being tokenized. - * @param int $start The position in the string to start processing. - * @param int $end The position in the string to end processing. - * - * @return array|null - */ - private function collectWhitespace($string, $start, $end) - { - $space = ''; - for ($start; $start < $end; $start++) { - if ($string[$start] !== ' ' && $string[$start] !== "\t") { - break; - } - - $space .= $string[$start]; - } - - if ($space === '') { - return null; - } - - return [ - 'content' => $space, - 'code' => T_DOC_COMMENT_WHITESPACE, - 'type' => 'T_DOC_COMMENT_WHITESPACE', - ]; - - }//end collectWhitespace() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Tokenizers/JS.php b/vendor/squizlabs/php_codesniffer/src/Tokenizers/JS.php deleted file mode 100644 index 778597a..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Tokenizers/JS.php +++ /dev/null @@ -1,1256 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tokenizers; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Exceptions\TokenizerException; -use PHP_CodeSniffer\Util; - -class JS extends Tokenizer -{ - - /** - * A list of tokens that are allowed to open a scope. - * - * This array also contains information about what kind of token the scope - * opener uses to open and close the scope, if the token strictly requires - * an opener, if the token can share a scope closer, and who it can be shared - * with. An example of a token that shares a scope closer is a CASE scope. - * - * @var array - */ - public $scopeOpeners = [ - T_IF => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => false, - 'shared' => false, - 'with' => [], - ], - T_TRY => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => true, - 'shared' => false, - 'with' => [], - ], - T_CATCH => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => true, - 'shared' => false, - 'with' => [], - ], - T_ELSE => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => false, - 'shared' => false, - 'with' => [], - ], - T_FOR => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => false, - 'shared' => false, - 'with' => [], - ], - T_CLASS => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => true, - 'shared' => false, - 'with' => [], - ], - T_FUNCTION => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => false, - 'shared' => false, - 'with' => [], - ], - T_WHILE => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => false, - 'shared' => false, - 'with' => [], - ], - T_DO => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => true, - 'shared' => false, - 'with' => [], - ], - T_SWITCH => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => true, - 'shared' => false, - 'with' => [], - ], - T_CASE => [ - 'start' => [T_COLON => T_COLON], - 'end' => [ - T_BREAK => T_BREAK, - T_RETURN => T_RETURN, - T_CONTINUE => T_CONTINUE, - T_THROW => T_THROW, - ], - 'strict' => true, - 'shared' => true, - 'with' => [ - T_DEFAULT => T_DEFAULT, - T_CASE => T_CASE, - T_SWITCH => T_SWITCH, - ], - ], - T_DEFAULT => [ - 'start' => [T_COLON => T_COLON], - 'end' => [ - T_BREAK => T_BREAK, - T_RETURN => T_RETURN, - T_CONTINUE => T_CONTINUE, - T_THROW => T_THROW, - ], - 'strict' => true, - 'shared' => true, - 'with' => [ - T_CASE => T_CASE, - T_SWITCH => T_SWITCH, - ], - ], - ]; - - /** - * A list of tokens that end the scope. - * - * This array is just a unique collection of the end tokens - * from the _scopeOpeners array. The data is duplicated here to - * save time during parsing of the file. - * - * @var array - */ - public $endScopeTokens = [ - T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET, - T_BREAK => T_BREAK, - ]; - - /** - * A list of special JS tokens and their types. - * - * @var array - */ - protected $tokenValues = [ - 'class' => 'T_CLASS', - 'function' => 'T_FUNCTION', - 'prototype' => 'T_PROTOTYPE', - 'try' => 'T_TRY', - 'catch' => 'T_CATCH', - 'return' => 'T_RETURN', - 'throw' => 'T_THROW', - 'break' => 'T_BREAK', - 'switch' => 'T_SWITCH', - 'continue' => 'T_CONTINUE', - 'if' => 'T_IF', - 'else' => 'T_ELSE', - 'do' => 'T_DO', - 'while' => 'T_WHILE', - 'for' => 'T_FOR', - 'var' => 'T_VAR', - 'case' => 'T_CASE', - 'default' => 'T_DEFAULT', - 'true' => 'T_TRUE', - 'false' => 'T_FALSE', - 'null' => 'T_NULL', - 'this' => 'T_THIS', - 'typeof' => 'T_TYPEOF', - '(' => 'T_OPEN_PARENTHESIS', - ')' => 'T_CLOSE_PARENTHESIS', - '{' => 'T_OPEN_CURLY_BRACKET', - '}' => 'T_CLOSE_CURLY_BRACKET', - '[' => 'T_OPEN_SQUARE_BRACKET', - ']' => 'T_CLOSE_SQUARE_BRACKET', - '?' => 'T_INLINE_THEN', - '.' => 'T_OBJECT_OPERATOR', - '+' => 'T_PLUS', - '-' => 'T_MINUS', - '*' => 'T_MULTIPLY', - '%' => 'T_MODULUS', - '/' => 'T_DIVIDE', - '^' => 'T_LOGICAL_XOR', - ',' => 'T_COMMA', - ';' => 'T_SEMICOLON', - ':' => 'T_COLON', - '<' => 'T_LESS_THAN', - '>' => 'T_GREATER_THAN', - '<<' => 'T_SL', - '>>' => 'T_SR', - '>>>' => 'T_ZSR', - '<<=' => 'T_SL_EQUAL', - '>>=' => 'T_SR_EQUAL', - '>>>=' => 'T_ZSR_EQUAL', - '<=' => 'T_IS_SMALLER_OR_EQUAL', - '>=' => 'T_IS_GREATER_OR_EQUAL', - '=>' => 'T_DOUBLE_ARROW', - '!' => 'T_BOOLEAN_NOT', - '||' => 'T_BOOLEAN_OR', - '&&' => 'T_BOOLEAN_AND', - '|' => 'T_BITWISE_OR', - '&' => 'T_BITWISE_AND', - '!=' => 'T_IS_NOT_EQUAL', - '!==' => 'T_IS_NOT_IDENTICAL', - '=' => 'T_EQUAL', - '==' => 'T_IS_EQUAL', - '===' => 'T_IS_IDENTICAL', - '-=' => 'T_MINUS_EQUAL', - '+=' => 'T_PLUS_EQUAL', - '*=' => 'T_MUL_EQUAL', - '/=' => 'T_DIV_EQUAL', - '%=' => 'T_MOD_EQUAL', - '++' => 'T_INC', - '--' => 'T_DEC', - '//' => 'T_COMMENT', - '/*' => 'T_COMMENT', - '/**' => 'T_DOC_COMMENT', - '*/' => 'T_COMMENT', - ]; - - /** - * A list string delimiters. - * - * @var array - */ - protected $stringTokens = [ - '\'' => '\'', - '"' => '"', - ]; - - /** - * A list tokens that start and end comments. - * - * @var array - */ - protected $commentTokens = [ - '//' => null, - '/*' => '*/', - '/**' => '*/', - ]; - - - /** - * Initialise the tokenizer. - * - * Pre-checks the content to see if it looks minified. - * - * @param string $content The content to tokenize. - * @param \PHP_CodeSniffer\Config $config The config data for the run. - * @param string $eolChar The EOL char used in the content. - * - * @return void - * @throws \PHP_CodeSniffer\Exceptions\TokenizerException If the file appears to be minified. - */ - public function __construct($content, Config $config, $eolChar='\n') - { - if ($this->isMinifiedContent($content, $eolChar) === true) { - throw new TokenizerException('File appears to be minified and cannot be processed'); - } - - parent::__construct($content, $config, $eolChar); - - }//end __construct() - - - /** - * Creates an array of tokens when given some JS code. - * - * @param string $string The string to tokenize. - * - * @return array - */ - public function tokenize($string) - { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t*** START JS TOKENIZING ***".PHP_EOL; - } - - $maxTokenLength = 0; - foreach ($this->tokenValues as $token => $values) { - if (strlen($token) > $maxTokenLength) { - $maxTokenLength = strlen($token); - } - } - - $tokens = []; - $inString = ''; - $stringChar = null; - $inComment = ''; - $buffer = ''; - $preStringBuffer = ''; - $cleanBuffer = false; - - $commentTokenizer = new Comment(); - - $tokens[] = [ - 'code' => T_OPEN_TAG, - 'type' => 'T_OPEN_TAG', - 'content' => '', - ]; - - // Convert newlines to single characters for ease of - // processing. We will change them back later. - $string = str_replace($this->eolChar, "\n", $string); - - $chars = str_split($string); - $numChars = count($chars); - for ($i = 0; $i < $numChars; $i++) { - $char = $chars[$i]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $content = Util\Common::prepareForOutput($char); - $bufferContent = Util\Common::prepareForOutput($buffer); - - if ($inString !== '') { - echo "\t"; - } - - if ($inComment !== '') { - echo "\t"; - } - - echo "\tProcess char $i => $content (buffer: $bufferContent)".PHP_EOL; - }//end if - - if ($inString === '' && $inComment === '' && $buffer !== '') { - // If the buffer only has whitespace and we are about to - // add a character, store the whitespace first. - if (trim($char) !== '' && trim($buffer) === '') { - $tokens[] = [ - 'code' => T_WHITESPACE, - 'type' => 'T_WHITESPACE', - 'content' => str_replace("\n", $this->eolChar, $buffer), - ]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $content = Util\Common::prepareForOutput($buffer); - echo "\t=> Added token T_WHITESPACE ($content)".PHP_EOL; - } - - $buffer = ''; - } - - // If the buffer is not whitespace and we are about to - // add a whitespace character, store the content first. - if ($inString === '' - && $inComment === '' - && trim($char) === '' - && trim($buffer) !== '' - ) { - $tokens[] = [ - 'code' => T_STRING, - 'type' => 'T_STRING', - 'content' => str_replace("\n", $this->eolChar, $buffer), - ]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $content = Util\Common::prepareForOutput($buffer); - echo "\t=> Added token T_STRING ($content)".PHP_EOL; - } - - $buffer = ''; - } - }//end if - - // Process strings. - if ($inComment === '' && isset($this->stringTokens[$char]) === true) { - if ($inString === $char) { - // This could be the end of the string, but make sure it - // is not escaped first. - $escapes = 0; - for ($x = ($i - 1); $x >= 0; $x--) { - if ($chars[$x] !== '\\') { - break; - } - - $escapes++; - } - - if ($escapes === 0 || ($escapes % 2) === 0) { - // There is an even number escape chars, - // so this is not escaped, it is the end of the string. - $tokens[] = [ - 'code' => T_CONSTANT_ENCAPSED_STRING, - 'type' => 'T_CONSTANT_ENCAPSED_STRING', - 'content' => str_replace("\n", $this->eolChar, $buffer).$char, - ]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* found end of string *".PHP_EOL; - $content = Util\Common::prepareForOutput($buffer.$char); - echo "\t=> Added token T_CONSTANT_ENCAPSED_STRING ($content)".PHP_EOL; - } - - $buffer = ''; - $preStringBuffer = ''; - $inString = ''; - $stringChar = null; - continue; - }//end if - } else if ($inString === '') { - $inString = $char; - $stringChar = $i; - $preStringBuffer = $buffer; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* looking for string closer *".PHP_EOL; - } - }//end if - }//end if - - if ($inString !== '' && $char === "\n") { - // Unless this newline character is escaped, the string did not - // end before the end of the line, which means it probably - // wasn't a string at all (maybe a regex). - if ($chars[($i - 1)] !== '\\') { - $i = $stringChar; - $buffer = $preStringBuffer; - $preStringBuffer = ''; - $inString = ''; - $stringChar = null; - $char = $chars[$i]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* found newline before end of string, bailing *".PHP_EOL; - } - } - } - - $buffer .= $char; - - // We don't look for special tokens inside strings, - // so if we are in a string, we can continue here now - // that the current char is in the buffer. - if ($inString !== '') { - continue; - } - - // Special case for T_DIVIDE which can actually be - // the start of a regular expression. - if ($buffer === $char && $char === '/' && $chars[($i + 1)] !== '*') { - $regex = $this->getRegexToken($i, $string, $chars, $tokens); - if ($regex !== null) { - $tokens[] = [ - 'code' => T_REGULAR_EXPRESSION, - 'type' => 'T_REGULAR_EXPRESSION', - 'content' => $regex['content'], - ]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $content = Util\Common::prepareForOutput($regex['content']); - echo "\t=> Added token T_REGULAR_EXPRESSION ($content)".PHP_EOL; - } - - $i = $regex['end']; - $buffer = ''; - $cleanBuffer = false; - continue; - }//end if - }//end if - - // Check for known tokens, but ignore tokens found that are not at - // the end of a string, like FOR and this.FORmat. - if (isset($this->tokenValues[strtolower($buffer)]) === true - && (preg_match('|[a-zA-z0-9_]|', $char) === 0 - || isset($chars[($i + 1)]) === false - || preg_match('|[a-zA-z0-9_]|', $chars[($i + 1)]) === 0) - ) { - $matchedToken = false; - $lookAheadLength = ($maxTokenLength - strlen($buffer)); - - if ($lookAheadLength > 0) { - // The buffer contains a token type, but we need - // to look ahead at the next chars to see if this is - // actually part of a larger token. For example, - // FOR and FOREACH. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* buffer possibly contains token, looking ahead $lookAheadLength chars *".PHP_EOL; - } - - $charBuffer = $buffer; - for ($x = 1; $x <= $lookAheadLength; $x++) { - if (isset($chars[($i + $x)]) === false) { - break; - } - - $charBuffer .= $chars[($i + $x)]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $content = Util\Common::prepareForOutput($charBuffer); - echo "\t\t=> Looking ahead $x chars => $content".PHP_EOL; - } - - if (isset($this->tokenValues[strtolower($charBuffer)]) === true) { - // We've found something larger that matches - // so we can ignore this char. Except for 1 very specific - // case where a comment like /**/ needs to tokenize as - // T_COMMENT and not T_DOC_COMMENT. - $oldType = $this->tokenValues[strtolower($buffer)]; - $newType = $this->tokenValues[strtolower($charBuffer)]; - if ($oldType === 'T_COMMENT' - && $newType === 'T_DOC_COMMENT' - && $chars[($i + $x + 1)] === '/' - ) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* look ahead ignored T_DOC_COMMENT, continuing *".PHP_EOL; - } - } else { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* look ahead found more specific token ($newType), ignoring $i *".PHP_EOL; - } - - $matchedToken = true; - break; - } - }//end if - }//end for - }//end if - - if ($matchedToken === false) { - if (PHP_CODESNIFFER_VERBOSITY > 1 && $lookAheadLength > 0) { - echo "\t\t* look ahead found nothing *".PHP_EOL; - } - - $value = $this->tokenValues[strtolower($buffer)]; - - if ($value === 'T_FUNCTION' && $buffer !== 'function') { - // The function keyword needs to be all lowercase or else - // it is just a function called "Function". - $value = 'T_STRING'; - } - - $tokens[] = [ - 'code' => constant($value), - 'type' => $value, - 'content' => $buffer, - ]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $content = Util\Common::prepareForOutput($buffer); - echo "\t=> Added token $value ($content)".PHP_EOL; - } - - $cleanBuffer = true; - }//end if - } else if (isset($this->tokenValues[strtolower($char)]) === true) { - // No matter what token we end up using, we don't - // need the content in the buffer any more because we have - // found a valid token. - $newContent = substr(str_replace("\n", $this->eolChar, $buffer), 0, -1); - if ($newContent !== '') { - $tokens[] = [ - 'code' => T_STRING, - 'type' => 'T_STRING', - 'content' => $newContent, - ]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $content = Util\Common::prepareForOutput(substr($buffer, 0, -1)); - echo "\t=> Added token T_STRING ($content)".PHP_EOL; - } - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* char is token, looking ahead ".($maxTokenLength - 1).' chars *'.PHP_EOL; - } - - // The char is a token type, but we need to look ahead at the - // next chars to see if this is actually part of a larger token. - // For example, = and ===. - $charBuffer = $char; - $matchedToken = false; - for ($x = 1; $x <= $maxTokenLength; $x++) { - if (isset($chars[($i + $x)]) === false) { - break; - } - - $charBuffer .= $chars[($i + $x)]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $content = Util\Common::prepareForOutput($charBuffer); - echo "\t\t=> Looking ahead $x chars => $content".PHP_EOL; - } - - if (isset($this->tokenValues[strtolower($charBuffer)]) === true) { - // We've found something larger that matches - // so we can ignore this char. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokenValues[strtolower($charBuffer)]; - echo "\t\t* look ahead found more specific token ($type), ignoring $i *".PHP_EOL; - } - - $matchedToken = true; - break; - } - }//end for - - if ($matchedToken === false) { - $value = $this->tokenValues[strtolower($char)]; - $tokens[] = [ - 'code' => constant($value), - 'type' => $value, - 'content' => $char, - ]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* look ahead found nothing *".PHP_EOL; - $content = Util\Common::prepareForOutput($char); - echo "\t=> Added token $value ($content)".PHP_EOL; - } - - $cleanBuffer = true; - } else { - $buffer = $char; - }//end if - }//end if - - // Keep track of content inside comments. - if ($inComment === '' - && array_key_exists($buffer, $this->commentTokens) === true - ) { - // This is not really a comment if the content - // looks like \// (i.e., it is escaped). - if (isset($chars[($i - 2)]) === true && $chars[($i - 2)] === '\\') { - $lastToken = array_pop($tokens); - $lastContent = $lastToken['content']; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $value = $this->tokenValues[strtolower($lastContent)]; - $content = Util\Common::prepareForOutput($lastContent); - echo "\t=> Removed token $value ($content)".PHP_EOL; - } - - $lastChars = str_split($lastContent); - $lastNumChars = count($lastChars); - for ($x = 0; $x < $lastNumChars; $x++) { - $lastChar = $lastChars[$x]; - $value = $this->tokenValues[strtolower($lastChar)]; - $tokens[] = [ - 'code' => constant($value), - 'type' => $value, - 'content' => $lastChar, - ]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $content = Util\Common::prepareForOutput($lastChar); - echo "\t=> Added token $value ($content)".PHP_EOL; - } - } - } else { - // We have started a comment. - $inComment = $buffer; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* looking for end of comment *".PHP_EOL; - } - }//end if - } else if ($inComment !== '') { - if ($this->commentTokens[$inComment] === null) { - // Comment ends at the next newline. - if (strpos($buffer, "\n") !== false) { - $inComment = ''; - } - } else { - if ($this->commentTokens[$inComment] === $buffer) { - $inComment = ''; - } - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - if ($inComment === '') { - echo "\t\t* found end of comment *".PHP_EOL; - } - } - - if ($inComment === '' && $cleanBuffer === false) { - $tokens[] = [ - 'code' => T_STRING, - 'type' => 'T_STRING', - 'content' => str_replace("\n", $this->eolChar, $buffer), - ]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $content = Util\Common::prepareForOutput($buffer); - echo "\t=> Added token T_STRING ($content)".PHP_EOL; - } - - $buffer = ''; - } - }//end if - - if ($cleanBuffer === true) { - $buffer = ''; - $cleanBuffer = false; - } - }//end for - - if (empty($buffer) === false) { - if ($inString !== '') { - // The string did not end before the end of the file, - // which means there was probably a syntax error somewhere. - $tokens[] = [ - 'code' => T_STRING, - 'type' => 'T_STRING', - 'content' => str_replace("\n", $this->eolChar, $buffer), - ]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $content = Util\Common::prepareForOutput($buffer); - echo "\t=> Added token T_STRING ($content)".PHP_EOL; - } - } else { - // Buffer contains whitespace from the end of the file. - $tokens[] = [ - 'code' => T_WHITESPACE, - 'type' => 'T_WHITESPACE', - 'content' => str_replace("\n", $this->eolChar, $buffer), - ]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $content = Util\Common::prepareForOutput($buffer); - echo "\t=> Added token T_WHITESPACE ($content)".PHP_EOL; - } - }//end if - }//end if - - $tokens[] = [ - 'code' => T_CLOSE_TAG, - 'type' => 'T_CLOSE_TAG', - 'content' => '', - ]; - - /* - Now that we have done some basic tokenizing, we need to - modify the tokens to join some together and split some apart - so they match what the PHP tokenizer does. - */ - - $finalTokens = []; - $newStackPtr = 0; - $numTokens = count($tokens); - for ($stackPtr = 0; $stackPtr < $numTokens; $stackPtr++) { - $token = $tokens[$stackPtr]; - - /* - Look for comments and join the tokens together. - */ - - if ($token['code'] === T_COMMENT || $token['code'] === T_DOC_COMMENT) { - $newContent = ''; - $tokenContent = $token['content']; - - $endContent = null; - if (isset($this->commentTokens[$tokenContent]) === true) { - $endContent = $this->commentTokens[$tokenContent]; - } - - while ($tokenContent !== $endContent) { - if ($endContent === null - && strpos($tokenContent, $this->eolChar) !== false - ) { - // A null end token means the comment ends at the end of - // the line so we look for newlines and split the token. - $tokens[$stackPtr]['content'] = substr( - $tokenContent, - (strpos($tokenContent, $this->eolChar) + strlen($this->eolChar)) - ); - - $tokenContent = substr( - $tokenContent, - 0, - (strpos($tokenContent, $this->eolChar) + strlen($this->eolChar)) - ); - - // If the substr failed, skip the token as the content - // will now be blank. - if ($tokens[$stackPtr]['content'] !== false - && $tokens[$stackPtr]['content'] !== '' - ) { - $stackPtr--; - } - - break; - }//end if - - $stackPtr++; - $newContent .= $tokenContent; - if (isset($tokens[$stackPtr]) === false) { - break; - } - - $tokenContent = $tokens[$stackPtr]['content']; - }//end while - - if ($token['code'] === T_DOC_COMMENT) { - $commentTokens = $commentTokenizer->tokenizeString($newContent.$tokenContent, $this->eolChar, $newStackPtr); - foreach ($commentTokens as $commentToken) { - $finalTokens[$newStackPtr] = $commentToken; - $newStackPtr++; - } - - continue; - } else { - // Save the new content in the current token so - // the code below can chop it up on newlines. - $token['content'] = $newContent.$tokenContent; - } - }//end if - - /* - If this token has newlines in its content, split each line up - and create a new token for each line. We do this so it's easier - to ascertain where errors occur on a line. - Note that $token[1] is the token's content. - */ - - if (strpos($token['content'], $this->eolChar) !== false) { - $tokenLines = explode($this->eolChar, $token['content']); - $numLines = count($tokenLines); - - for ($i = 0; $i < $numLines; $i++) { - $newToken = ['content' => $tokenLines[$i]]; - if ($i === ($numLines - 1)) { - if ($tokenLines[$i] === '') { - break; - } - } else { - $newToken['content'] .= $this->eolChar; - } - - $newToken['type'] = $token['type']; - $newToken['code'] = $token['code']; - $finalTokens[$newStackPtr] = $newToken; - $newStackPtr++; - } - } else { - $finalTokens[$newStackPtr] = $token; - $newStackPtr++; - }//end if - - // Convert numbers, including decimals. - if ($token['code'] === T_STRING - || $token['code'] === T_OBJECT_OPERATOR - ) { - $newContent = ''; - $oldStackPtr = $stackPtr; - while (preg_match('|^[0-9\.]+$|', $tokens[$stackPtr]['content']) !== 0) { - $newContent .= $tokens[$stackPtr]['content']; - $stackPtr++; - } - - if ($newContent !== '' && $newContent !== '.') { - $finalTokens[($newStackPtr - 1)]['content'] = $newContent; - if (ctype_digit($newContent) === true) { - $finalTokens[($newStackPtr - 1)]['code'] = constant('T_LNUMBER'); - $finalTokens[($newStackPtr - 1)]['type'] = 'T_LNUMBER'; - } else { - $finalTokens[($newStackPtr - 1)]['code'] = constant('T_DNUMBER'); - $finalTokens[($newStackPtr - 1)]['type'] = 'T_DNUMBER'; - } - - $stackPtr--; - continue; - } else { - $stackPtr = $oldStackPtr; - } - }//end if - - // Convert the token after an object operator into a string, in most cases. - if ($token['code'] === T_OBJECT_OPERATOR) { - for ($i = ($stackPtr + 1); $i < $numTokens; $i++) { - if (isset(Util\Tokens::$emptyTokens[$tokens[$i]['code']]) === true) { - continue; - } - - if ($tokens[$i]['code'] !== T_PROTOTYPE - && $tokens[$i]['code'] !== T_LNUMBER - && $tokens[$i]['code'] !== T_DNUMBER - ) { - $tokens[$i]['code'] = T_STRING; - $tokens[$i]['type'] = 'T_STRING'; - } - - break; - } - } - }//end for - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t*** END TOKENIZING ***".PHP_EOL; - } - - return $finalTokens; - - }//end tokenize() - - - /** - * Tokenizes a regular expression if one is found. - * - * If a regular expression is not found, NULL is returned. - * - * @param int $char The index of the possible regex start character. - * @param string $string The complete content of the string being tokenized. - * @param array $chars An array of characters being tokenized. - * @param array $tokens The current array of tokens found in the string. - * - * @return array|null - */ - public function getRegexToken($char, $string, $chars, $tokens) - { - $beforeTokens = [ - T_EQUAL => true, - T_IS_NOT_EQUAL => true, - T_IS_IDENTICAL => true, - T_IS_NOT_IDENTICAL => true, - T_OPEN_PARENTHESIS => true, - T_OPEN_SQUARE_BRACKET => true, - T_RETURN => true, - T_BOOLEAN_OR => true, - T_BOOLEAN_AND => true, - T_BOOLEAN_NOT => true, - T_BITWISE_OR => true, - T_BITWISE_AND => true, - T_COMMA => true, - T_COLON => true, - T_TYPEOF => true, - T_INLINE_THEN => true, - T_INLINE_ELSE => true, - ]; - - $afterTokens = [ - ',' => true, - ')' => true, - ']' => true, - ';' => true, - ' ' => true, - '.' => true, - ':' => true, - $this->eolChar => true, - ]; - - // Find the last non-whitespace token that was added - // to the tokens array. - $numTokens = count($tokens); - for ($prev = ($numTokens - 1); $prev >= 0; $prev--) { - if (isset(Util\Tokens::$emptyTokens[$tokens[$prev]['code']]) === false) { - break; - } - } - - if (isset($beforeTokens[$tokens[$prev]['code']]) === false) { - return null; - } - - // This is probably a regular expression, so look for the end of it. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t* token possibly starts a regular expression *".PHP_EOL; - } - - $numChars = count($chars); - for ($next = ($char + 1); $next < $numChars; $next++) { - if ($chars[$next] === '/') { - // Just make sure this is not escaped first. - if ($chars[($next - 1)] !== '\\') { - // In the simple form: /.../ so we found the end. - break; - } else if ($chars[($next - 2)] === '\\') { - // In the form: /...\\/ so we found the end. - break; - } - } else { - $possibleEolChar = substr($string, $next, strlen($this->eolChar)); - if ($possibleEolChar === $this->eolChar) { - // This is the last token on the line and regular - // expressions need to be defined on a single line, - // so this is not a regular expression. - break; - } - } - } - - if ($chars[$next] !== '/') { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t* could not find end of regular expression *".PHP_EOL; - } - - return null; - } - - while (preg_match('|[a-zA-Z]|', $chars[($next + 1)]) !== 0) { - // The token directly after the end of the regex can - // be modifiers like global and case insensitive - // (.e.g, /pattern/gi). - $next++; - } - - $regexEnd = $next; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t* found end of regular expression at token $regexEnd *".PHP_EOL; - } - - for ($next += 1; $next < $numChars; $next++) { - if ($chars[$next] !== ' ') { - break; - } else { - $possibleEolChar = substr($string, $next, strlen($this->eolChar)); - if ($possibleEolChar === $this->eolChar) { - // This is the last token on the line. - break; - } - } - } - - if (isset($afterTokens[$chars[$next]]) === false) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t* tokens after regular expression do not look correct *".PHP_EOL; - } - - return null; - } - - // This is a regular expression, so join all the tokens together. - $content = ''; - for ($x = $char; $x <= $regexEnd; $x++) { - $content .= $chars[$x]; - } - - $token = [ - 'start' => $char, - 'end' => $regexEnd, - 'content' => $content, - ]; - - return $token; - - }//end getRegexToken() - - - /** - * Performs additional processing after main tokenizing. - * - * This additional processing looks for properties, closures, labels and objects. - * - * @return void - */ - public function processAdditional() - { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t*** START ADDITIONAL JS PROCESSING ***".PHP_EOL; - } - - $numTokens = count($this->tokens); - $classStack = []; - - for ($i = 0; $i < $numTokens; $i++) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$i]['type']; - $content = Util\Common::prepareForOutput($this->tokens[$i]['content']); - - echo str_repeat("\t", count($classStack)); - echo "\tProcess token $i: $type => $content".PHP_EOL; - } - - // Looking for functions that are actually closures. - if ($this->tokens[$i]['code'] === T_FUNCTION && isset($this->tokens[$i]['scope_opener']) === true) { - for ($x = ($i + 1); $x < $numTokens; $x++) { - if (isset(Util\Tokens::$emptyTokens[$this->tokens[$x]['code']]) === false) { - break; - } - } - - if ($this->tokens[$x]['code'] === T_OPEN_PARENTHESIS) { - $this->tokens[$i]['code'] = T_CLOSURE; - $this->tokens[$i]['type'] = 'T_CLOSURE'; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $line = $this->tokens[$i]['line']; - echo str_repeat("\t", count($classStack)); - echo "\t* token $i on line $line changed from T_FUNCTION to T_CLOSURE *".PHP_EOL; - } - - for ($x = ($this->tokens[$i]['scope_opener'] + 1); $x < $this->tokens[$i]['scope_closer']; $x++) { - if (isset($this->tokens[$x]['conditions'][$i]) === false) { - continue; - } - - $this->tokens[$x]['conditions'][$i] = T_CLOSURE; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$x]['type']; - echo str_repeat("\t", count($classStack)); - echo "\t\t* cleaned $x ($type) *".PHP_EOL; - } - } - }//end if - - continue; - } else if ($this->tokens[$i]['code'] === T_OPEN_CURLY_BRACKET - && isset($this->tokens[$i]['scope_condition']) === false - && isset($this->tokens[$i]['bracket_closer']) === true - ) { - $condition = $this->tokens[$i]['conditions']; - $condition = end($condition); - if ($condition === T_CLASS) { - // Possibly an ES6 method. To be classified as one, the previous - // non-empty tokens need to be a set of parenthesis, and then a string - // (the method name). - for ($parenCloser = ($i - 1); $parenCloser > 0; $parenCloser--) { - if (isset(Util\Tokens::$emptyTokens[$this->tokens[$parenCloser]['code']]) === false) { - break; - } - } - - if ($this->tokens[$parenCloser]['code'] === T_CLOSE_PARENTHESIS) { - $parenOpener = $this->tokens[$parenCloser]['parenthesis_opener']; - for ($name = ($parenOpener - 1); $name > 0; $name--) { - if (isset(Util\Tokens::$emptyTokens[$this->tokens[$name]['code']]) === false) { - break; - } - } - - if ($this->tokens[$name]['code'] === T_STRING) { - // We found a method name. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $line = $this->tokens[$name]['line']; - echo str_repeat("\t", count($classStack)); - echo "\t* token $name on line $line changed from T_STRING to T_FUNCTION *".PHP_EOL; - } - - $closer = $this->tokens[$i]['bracket_closer']; - - $this->tokens[$name]['code'] = T_FUNCTION; - $this->tokens[$name]['type'] = 'T_FUNCTION'; - - foreach ([$name, $i, $closer] as $token) { - $this->tokens[$token]['scope_condition'] = $name; - $this->tokens[$token]['scope_opener'] = $i; - $this->tokens[$token]['scope_closer'] = $closer; - $this->tokens[$token]['parenthesis_opener'] = $parenOpener; - $this->tokens[$token]['parenthesis_closer'] = $parenCloser; - $this->tokens[$token]['parenthesis_owner'] = $name; - } - - $this->tokens[$parenOpener]['parenthesis_owner'] = $name; - $this->tokens[$parenCloser]['parenthesis_owner'] = $name; - - for ($x = ($i + 1); $x < $closer; $x++) { - $this->tokens[$x]['conditions'][$name] = T_FUNCTION; - ksort($this->tokens[$x]['conditions'], SORT_NUMERIC); - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$x]['type']; - echo str_repeat("\t", count($classStack)); - echo "\t\t* added T_FUNCTION condition to $x ($type) *".PHP_EOL; - } - } - - continue; - }//end if - }//end if - }//end if - - $classStack[] = $i; - - $closer = $this->tokens[$i]['bracket_closer']; - $this->tokens[$i]['code'] = T_OBJECT; - $this->tokens[$i]['type'] = 'T_OBJECT'; - $this->tokens[$closer]['code'] = T_CLOSE_OBJECT; - $this->tokens[$closer]['type'] = 'T_CLOSE_OBJECT'; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", count($classStack)); - echo "\t* token $i converted from T_OPEN_CURLY_BRACKET to T_OBJECT *".PHP_EOL; - echo str_repeat("\t", count($classStack)); - echo "\t* token $closer converted from T_CLOSE_CURLY_BRACKET to T_CLOSE_OBJECT *".PHP_EOL; - } - - for ($x = ($i + 1); $x < $closer; $x++) { - $this->tokens[$x]['conditions'][$i] = T_OBJECT; - ksort($this->tokens[$x]['conditions'], SORT_NUMERIC); - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$x]['type']; - echo str_repeat("\t", count($classStack)); - echo "\t\t* added T_OBJECT condition to $x ($type) *".PHP_EOL; - } - } - } else if ($this->tokens[$i]['code'] === T_CLOSE_OBJECT) { - array_pop($classStack); - } else if ($this->tokens[$i]['code'] === T_COLON) { - // If it is a scope opener, it belongs to a - // DEFAULT or CASE statement. - if (isset($this->tokens[$i]['scope_condition']) === true) { - continue; - } - - // Make sure this is not part of an inline IF statement. - for ($x = ($i - 1); $x >= 0; $x--) { - if ($this->tokens[$x]['code'] === T_INLINE_THEN) { - $this->tokens[$i]['code'] = T_INLINE_ELSE; - $this->tokens[$i]['type'] = 'T_INLINE_ELSE'; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", count($classStack)); - echo "\t* token $i converted from T_COLON to T_INLINE_THEN *".PHP_EOL; - } - - continue(2); - } else if ($this->tokens[$x]['line'] < $this->tokens[$i]['line']) { - break; - } - } - - // The string to the left of the colon is either a property or label. - for ($label = ($i - 1); $label >= 0; $label--) { - if (isset(Util\Tokens::$emptyTokens[$this->tokens[$label]['code']]) === false) { - break; - } - } - - if ($this->tokens[$label]['code'] !== T_STRING - && $this->tokens[$label]['code'] !== T_CONSTANT_ENCAPSED_STRING - ) { - continue; - } - - if (empty($classStack) === false) { - $this->tokens[$label]['code'] = T_PROPERTY; - $this->tokens[$label]['type'] = 'T_PROPERTY'; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", count($classStack)); - echo "\t* token $label converted from T_STRING to T_PROPERTY *".PHP_EOL; - } - } else { - $this->tokens[$label]['code'] = T_LABEL; - $this->tokens[$label]['type'] = 'T_LABEL'; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", count($classStack)); - echo "\t* token $label converted from T_STRING to T_LABEL *".PHP_EOL; - } - }//end if - }//end if - }//end for - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t*** END ADDITIONAL JS PROCESSING ***".PHP_EOL; - } - - }//end processAdditional() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Tokenizers/PHP.php b/vendor/squizlabs/php_codesniffer/src/Tokenizers/PHP.php deleted file mode 100644 index 5a88de3..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Tokenizers/PHP.php +++ /dev/null @@ -1,4222 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tokenizers; - -use PHP_CodeSniffer\Util\Common; -use PHP_CodeSniffer\Util\Tokens; - -class PHP extends Tokenizer -{ - - /** - * A list of tokens that are allowed to open a scope. - * - * This array also contains information about what kind of token the scope - * opener uses to open and close the scope, if the token strictly requires - * an opener, if the token can share a scope closer, and who it can be shared - * with. An example of a token that shares a scope closer is a CASE scope. - * - * @var array - */ - public $scopeOpeners = [ - T_IF => [ - 'start' => [ - T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET, - T_COLON => T_COLON, - ], - 'end' => [ - T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET, - T_ENDIF => T_ENDIF, - T_ELSE => T_ELSE, - T_ELSEIF => T_ELSEIF, - ], - 'strict' => false, - 'shared' => false, - 'with' => [ - T_ELSE => T_ELSE, - T_ELSEIF => T_ELSEIF, - ], - ], - T_TRY => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => true, - 'shared' => false, - 'with' => [], - ], - T_CATCH => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => true, - 'shared' => false, - 'with' => [], - ], - T_FINALLY => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => true, - 'shared' => false, - 'with' => [], - ], - T_ELSE => [ - 'start' => [ - T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET, - T_COLON => T_COLON, - ], - 'end' => [ - T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET, - T_ENDIF => T_ENDIF, - ], - 'strict' => false, - 'shared' => false, - 'with' => [ - T_IF => T_IF, - T_ELSEIF => T_ELSEIF, - ], - ], - T_ELSEIF => [ - 'start' => [ - T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET, - T_COLON => T_COLON, - ], - 'end' => [ - T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET, - T_ENDIF => T_ENDIF, - T_ELSE => T_ELSE, - T_ELSEIF => T_ELSEIF, - ], - 'strict' => false, - 'shared' => false, - 'with' => [ - T_IF => T_IF, - T_ELSE => T_ELSE, - ], - ], - T_FOR => [ - 'start' => [ - T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET, - T_COLON => T_COLON, - ], - 'end' => [ - T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET, - T_ENDFOR => T_ENDFOR, - ], - 'strict' => false, - 'shared' => false, - 'with' => [], - ], - T_FOREACH => [ - 'start' => [ - T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET, - T_COLON => T_COLON, - ], - 'end' => [ - T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET, - T_ENDFOREACH => T_ENDFOREACH, - ], - 'strict' => false, - 'shared' => false, - 'with' => [], - ], - T_INTERFACE => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => true, - 'shared' => false, - 'with' => [], - ], - T_FUNCTION => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => true, - 'shared' => false, - 'with' => [], - ], - T_CLASS => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => true, - 'shared' => false, - 'with' => [], - ], - T_TRAIT => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => true, - 'shared' => false, - 'with' => [], - ], - T_ENUM => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => true, - 'shared' => false, - 'with' => [], - ], - T_USE => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => false, - 'shared' => false, - 'with' => [], - ], - T_DECLARE => [ - 'start' => [ - T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET, - T_COLON => T_COLON, - ], - 'end' => [ - T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET, - T_ENDDECLARE => T_ENDDECLARE, - ], - 'strict' => false, - 'shared' => false, - 'with' => [], - ], - T_NAMESPACE => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => false, - 'shared' => false, - 'with' => [], - ], - T_WHILE => [ - 'start' => [ - T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET, - T_COLON => T_COLON, - ], - 'end' => [ - T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET, - T_ENDWHILE => T_ENDWHILE, - ], - 'strict' => false, - 'shared' => false, - 'with' => [], - ], - T_DO => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => true, - 'shared' => false, - 'with' => [], - ], - T_SWITCH => [ - 'start' => [ - T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET, - T_COLON => T_COLON, - ], - 'end' => [ - T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET, - T_ENDSWITCH => T_ENDSWITCH, - ], - 'strict' => true, - 'shared' => false, - 'with' => [], - ], - T_CASE => [ - 'start' => [ - T_COLON => T_COLON, - T_SEMICOLON => T_SEMICOLON, - ], - 'end' => [ - T_BREAK => T_BREAK, - T_RETURN => T_RETURN, - T_CONTINUE => T_CONTINUE, - T_THROW => T_THROW, - T_EXIT => T_EXIT, - T_GOTO => T_GOTO, - ], - 'strict' => true, - 'shared' => true, - 'with' => [ - T_DEFAULT => T_DEFAULT, - T_CASE => T_CASE, - T_SWITCH => T_SWITCH, - ], - ], - T_DEFAULT => [ - 'start' => [ - T_COLON => T_COLON, - T_SEMICOLON => T_SEMICOLON, - ], - 'end' => [ - T_BREAK => T_BREAK, - T_RETURN => T_RETURN, - T_CONTINUE => T_CONTINUE, - T_THROW => T_THROW, - T_EXIT => T_EXIT, - T_GOTO => T_GOTO, - ], - 'strict' => true, - 'shared' => true, - 'with' => [ - T_CASE => T_CASE, - T_SWITCH => T_SWITCH, - ], - ], - T_MATCH => [ - 'start' => [T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET], - 'end' => [T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET], - 'strict' => true, - 'shared' => false, - 'with' => [], - ], - T_START_HEREDOC => [ - 'start' => [T_START_HEREDOC => T_START_HEREDOC], - 'end' => [T_END_HEREDOC => T_END_HEREDOC], - 'strict' => true, - 'shared' => false, - 'with' => [], - ], - T_START_NOWDOC => [ - 'start' => [T_START_NOWDOC => T_START_NOWDOC], - 'end' => [T_END_NOWDOC => T_END_NOWDOC], - 'strict' => true, - 'shared' => false, - 'with' => [], - ], - ]; - - /** - * A list of tokens that end the scope. - * - * This array is just a unique collection of the end tokens - * from the scopeOpeners array. The data is duplicated here to - * save time during parsing of the file. - * - * @var array - */ - public $endScopeTokens = [ - T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET, - T_ENDIF => T_ENDIF, - T_ENDFOR => T_ENDFOR, - T_ENDFOREACH => T_ENDFOREACH, - T_ENDWHILE => T_ENDWHILE, - T_ENDSWITCH => T_ENDSWITCH, - T_ENDDECLARE => T_ENDDECLARE, - T_BREAK => T_BREAK, - T_END_HEREDOC => T_END_HEREDOC, - T_END_NOWDOC => T_END_NOWDOC, - ]; - - /** - * Known lengths of tokens. - * - * @var array - */ - public $knownLengths = [ - T_ABSTRACT => 8, - T_AND_EQUAL => 2, - T_ARRAY => 5, - T_AS => 2, - T_BOOLEAN_AND => 2, - T_BOOLEAN_OR => 2, - T_BREAK => 5, - T_CALLABLE => 8, - T_CASE => 4, - T_CATCH => 5, - T_CLASS => 5, - T_CLASS_C => 9, - T_CLONE => 5, - T_CONCAT_EQUAL => 2, - T_CONST => 5, - T_CONTINUE => 8, - T_CURLY_OPEN => 2, - T_DEC => 2, - T_DECLARE => 7, - T_DEFAULT => 7, - T_DIR => 7, - T_DIV_EQUAL => 2, - T_DO => 2, - T_DOLLAR_OPEN_CURLY_BRACES => 2, - T_DOUBLE_ARROW => 2, - T_DOUBLE_COLON => 2, - T_ECHO => 4, - T_ELLIPSIS => 3, - T_ELSE => 4, - T_ELSEIF => 6, - T_EMPTY => 5, - T_ENDDECLARE => 10, - T_ENDFOR => 6, - T_ENDFOREACH => 10, - T_ENDIF => 5, - T_ENDSWITCH => 9, - T_ENDWHILE => 8, - T_ENUM => 4, - T_ENUM_CASE => 4, - T_EVAL => 4, - T_EXTENDS => 7, - T_FILE => 8, - T_FINAL => 5, - T_FINALLY => 7, - T_FN => 2, - T_FOR => 3, - T_FOREACH => 7, - T_FUNCTION => 8, - T_FUNC_C => 12, - T_GLOBAL => 6, - T_GOTO => 4, - T_HALT_COMPILER => 15, - T_IF => 2, - T_IMPLEMENTS => 10, - T_INC => 2, - T_INCLUDE => 7, - T_INCLUDE_ONCE => 12, - T_INSTANCEOF => 10, - T_INSTEADOF => 9, - T_INTERFACE => 9, - T_ISSET => 5, - T_IS_EQUAL => 2, - T_IS_GREATER_OR_EQUAL => 2, - T_IS_IDENTICAL => 3, - T_IS_NOT_EQUAL => 2, - T_IS_NOT_IDENTICAL => 3, - T_IS_SMALLER_OR_EQUAL => 2, - T_LINE => 8, - T_LIST => 4, - T_LOGICAL_AND => 3, - T_LOGICAL_OR => 2, - T_LOGICAL_XOR => 3, - T_MATCH => 5, - T_MATCH_ARROW => 2, - T_MATCH_DEFAULT => 7, - T_METHOD_C => 10, - T_MINUS_EQUAL => 2, - T_POW_EQUAL => 3, - T_MOD_EQUAL => 2, - T_MUL_EQUAL => 2, - T_NAMESPACE => 9, - T_NS_C => 13, - T_NS_SEPARATOR => 1, - T_NEW => 3, - T_NULLSAFE_OBJECT_OPERATOR => 3, - T_OBJECT_OPERATOR => 2, - T_OPEN_TAG_WITH_ECHO => 3, - T_OR_EQUAL => 2, - T_PLUS_EQUAL => 2, - T_PRINT => 5, - T_PRIVATE => 7, - T_PRIVATE_SET => 12, - T_PUBLIC => 6, - T_PUBLIC_SET => 11, - T_PROTECTED => 9, - T_PROTECTED_SET => 14, - T_READONLY => 8, - T_REQUIRE => 7, - T_REQUIRE_ONCE => 12, - T_RETURN => 6, - T_STATIC => 6, - T_SWITCH => 6, - T_THROW => 5, - T_TRAIT => 5, - T_TRAIT_C => 9, - T_TRY => 3, - T_UNSET => 5, - T_USE => 3, - T_VAR => 3, - T_WHILE => 5, - T_XOR_EQUAL => 2, - T_YIELD => 5, - T_OPEN_CURLY_BRACKET => 1, - T_CLOSE_CURLY_BRACKET => 1, - T_OPEN_SQUARE_BRACKET => 1, - T_CLOSE_SQUARE_BRACKET => 1, - T_OPEN_PARENTHESIS => 1, - T_CLOSE_PARENTHESIS => 1, - T_COLON => 1, - T_STRING_CONCAT => 1, - T_INLINE_THEN => 1, - T_INLINE_ELSE => 1, - T_NULLABLE => 1, - T_NULL => 4, - T_FALSE => 5, - T_TRUE => 4, - T_SEMICOLON => 1, - T_EQUAL => 1, - T_MULTIPLY => 1, - T_DIVIDE => 1, - T_PLUS => 1, - T_MINUS => 1, - T_MODULUS => 1, - T_POW => 2, - T_SPACESHIP => 3, - T_COALESCE => 2, - T_COALESCE_EQUAL => 3, - T_BITWISE_AND => 1, - T_BITWISE_OR => 1, - T_BITWISE_XOR => 1, - T_SL => 2, - T_SR => 2, - T_SL_EQUAL => 3, - T_SR_EQUAL => 3, - T_GREATER_THAN => 1, - T_LESS_THAN => 1, - T_BOOLEAN_NOT => 1, - T_SELF => 4, - T_PARENT => 6, - T_COMMA => 1, - T_THIS => 4, - T_CLOSURE => 8, - T_BACKTICK => 1, - T_OPEN_SHORT_ARRAY => 1, - T_CLOSE_SHORT_ARRAY => 1, - T_TYPE_UNION => 1, - T_TYPE_INTERSECTION => 1, - T_TYPE_OPEN_PARENTHESIS => 1, - T_TYPE_CLOSE_PARENTHESIS => 1, - ]; - - /** - * Contexts in which keywords should always be tokenized as T_STRING. - * - * @var array - */ - protected $tstringContexts = [ - T_OBJECT_OPERATOR => true, - T_NULLSAFE_OBJECT_OPERATOR => true, - T_FUNCTION => true, - T_CLASS => true, - T_INTERFACE => true, - T_TRAIT => true, - T_ENUM => true, - T_ENUM_CASE => true, - T_EXTENDS => true, - T_IMPLEMENTS => true, - T_ATTRIBUTE => true, - T_NEW => true, - T_CONST => true, - T_NS_SEPARATOR => true, - T_USE => true, - T_NAMESPACE => true, - T_PAAMAYIM_NEKUDOTAYIM => true, - ]; - - /** - * A cache of different token types, resolved into arrays. - * - * @var array - * @see standardiseToken() - */ - private static $resolveTokenCache = []; - - - /** - * Creates an array of tokens when given some PHP code. - * - * Starts by using token_get_all() but does a lot of extra processing - * to insert information about the context of the token. - * - * @param string $string The string to tokenize. - * - * @return array - */ - protected function tokenize($string) - { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t*** START PHP TOKENIZING ***".PHP_EOL; - $isWin = false; - if (stripos(PHP_OS, 'WIN') === 0) { - $isWin = true; - } - } - - $tokens = @token_get_all($string); - $finalTokens = []; - - $newStackPtr = 0; - $numTokens = count($tokens); - $lastNotEmptyToken = 0; - - $insideInlineIf = []; - $insideUseGroup = false; - $insideConstDeclaration = false; - - $commentTokenizer = new Comment(); - - for ($stackPtr = 0; $stackPtr < $numTokens; $stackPtr++) { - // Special case for tokens we have needed to blank out. - if ($tokens[$stackPtr] === null) { - continue; - } - - $token = (array) $tokens[$stackPtr]; - $tokenIsArray = isset($token[1]); - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - if ($tokenIsArray === true) { - $type = Tokens::tokenName($token[0]); - $content = Common::prepareForOutput($token[1]); - } else { - $newToken = self::resolveSimpleToken($token[0]); - $type = $newToken['type']; - $content = Common::prepareForOutput($token[0]); - } - - echo "\tProcess token "; - if ($tokenIsArray === true) { - echo "[$stackPtr]"; - } else { - echo " $stackPtr "; - } - - echo ": $type => $content"; - }//end if - - if ($newStackPtr > 0 - && isset(Tokens::$emptyTokens[$finalTokens[($newStackPtr - 1)]['code']]) === false - ) { - $lastNotEmptyToken = ($newStackPtr - 1); - } - - /* - If we are using \r\n newline characters, the \r and \n are sometimes - split over two tokens. This normally occurs after comments. We need - to merge these two characters together so that our line endings are - consistent for all lines. - */ - - if ($tokenIsArray === true && substr($token[1], -1) === "\r") { - if (isset($tokens[($stackPtr + 1)]) === true - && is_array($tokens[($stackPtr + 1)]) === true - && $tokens[($stackPtr + 1)][1][0] === "\n" - ) { - $token[1] .= "\n"; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - if ($isWin === true) { - echo '\n'; - } else { - echo "\033[30;1m\\n\033[0m"; - } - } - - if ($tokens[($stackPtr + 1)][1] === "\n") { - // This token's content has been merged into the previous, - // so we can skip it. - $tokens[($stackPtr + 1)] = ''; - } else { - $tokens[($stackPtr + 1)][1] = substr($tokens[($stackPtr + 1)][1], 1); - } - } - }//end if - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo PHP_EOL; - } - - /* - Before PHP 5.5, the yield keyword was tokenized as - T_STRING. So look for and change this token in - earlier versions. - */ - - if (PHP_VERSION_ID < 50500 - && $tokenIsArray === true - && $token[0] === T_STRING - && strtolower($token[1]) === 'yield' - && isset($this->tstringContexts[$finalTokens[$lastNotEmptyToken]['code']]) === false - ) { - // Could still be a context sensitive keyword or "yield from" and potentially multi-line, - // so adjust the token stack in place. - $token[0] = T_YIELD; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token $stackPtr changed from T_STRING to T_YIELD".PHP_EOL; - } - } - - /* - Tokenize context sensitive keyword as string when it should be string. - */ - - if ($tokenIsArray === true - && isset(Tokens::$contextSensitiveKeywords[$token[0]]) === true - && (isset($this->tstringContexts[$finalTokens[$lastNotEmptyToken]['code']]) === true - || $finalTokens[$lastNotEmptyToken]['content'] === '&' - || $insideConstDeclaration === true) - ) { - if (isset($this->tstringContexts[$finalTokens[$lastNotEmptyToken]['code']]) === true) { - $preserveKeyword = false; - - // `new class`, and `new static` should be preserved. - if ($finalTokens[$lastNotEmptyToken]['code'] === T_NEW - && ($token[0] === T_CLASS - || $token[0] === T_STATIC) - ) { - $preserveKeyword = true; - } - - // `new readonly class` should be preserved. - if ($finalTokens[$lastNotEmptyToken]['code'] === T_NEW - && strtolower($token[1]) === 'readonly' - ) { - for ($i = ($stackPtr + 1); $i < $numTokens; $i++) { - if (is_array($tokens[$i]) === false - || isset(Tokens::$emptyTokens[$tokens[$i][0]]) === false - ) { - break; - } - } - - if (is_array($tokens[$i]) === true && $tokens[$i][0] === T_CLASS) { - $preserveKeyword = true; - } - } - - // `new class extends` `new class implements` should be preserved - if (($token[0] === T_EXTENDS || $token[0] === T_IMPLEMENTS) - && $finalTokens[$lastNotEmptyToken]['code'] === T_CLASS - ) { - $preserveKeyword = true; - } - - // `namespace\` should be preserved - if ($token[0] === T_NAMESPACE) { - for ($i = ($stackPtr + 1); $i < $numTokens; $i++) { - if (is_array($tokens[$i]) === false) { - break; - } - - if (isset(Tokens::$emptyTokens[$tokens[$i][0]]) === true) { - continue; - } - - if ($tokens[$i][0] === T_NS_SEPARATOR) { - $preserveKeyword = true; - } - - break; - } - } - - // Fully Qualified `\exit`/`\die` should be preserved. - if ($token[0] === T_EXIT - && $finalTokens[$lastNotEmptyToken]['code'] === T_NS_SEPARATOR - ) { - for ($i = ($lastNotEmptyToken - 1); $i >= 0; $i--) { - if (isset(Tokens::$emptyTokens[$finalTokens[$i]['code']]) === true) { - continue; - } - - if ($finalTokens[$i]['code'] !== T_STRING - && $finalTokens[$i]['code'] !== T_NAMESPACE - ) { - $preserveKeyword = true; - } - - break; - } - } - }//end if - - // Types in typed constants should not be touched, but the constant name should be. - if ((isset($this->tstringContexts[$finalTokens[$lastNotEmptyToken]['code']]) === true - && $finalTokens[$lastNotEmptyToken]['code'] === T_CONST) - || $insideConstDeclaration === true - ) { - $preserveKeyword = true; - - // Find the next non-empty token. - for ($i = ($stackPtr + 1); $i < $numTokens; $i++) { - if (is_array($tokens[$i]) === true - && isset(Tokens::$emptyTokens[$tokens[$i][0]]) === true - ) { - continue; - } - - break; - } - - if ($tokens[$i] === '=' || $tokens[$i] === ';') { - $preserveKeyword = false; - $insideConstDeclaration = false; - } - }//end if - - if ($finalTokens[$lastNotEmptyToken]['content'] === '&') { - $preserveKeyword = true; - - for ($i = ($lastNotEmptyToken - 1); $i >= 0; $i--) { - if (isset(Tokens::$emptyTokens[$finalTokens[$i]['code']]) === true) { - continue; - } - - if ($finalTokens[$i]['code'] === T_FUNCTION) { - $preserveKeyword = false; - } - - break; - } - } - - if ($preserveKeyword === false) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = Tokens::tokenName($token[0]); - echo "\t\t* token $stackPtr changed from $type to T_STRING".PHP_EOL; - } - - $finalTokens[$newStackPtr] = [ - 'code' => T_STRING, - 'type' => 'T_STRING', - 'content' => $token[1], - ]; - - $newStackPtr++; - continue; - } - }//end if - - /* - Mark the start of a constant declaration to allow for handling keyword to T_STRING - convertion for constant names using reserved keywords. - */ - - if ($tokenIsArray === true && $token[0] === T_CONST) { - $insideConstDeclaration = true; - } - - /* - Close an open "inside constant declaration" marker when no keyword conversion was needed. - */ - - if ($insideConstDeclaration === true - && $tokenIsArray === false - && ($token[0] === '=' || $token[0] === ';') - ) { - $insideConstDeclaration = false; - } - - /* - Special case for `static` used as a function name, i.e. `static()`. - - Note: this may incorrectly change the static keyword directly before a DNF property type. - If so, this will be caught and corrected for in the additional processing. - */ - - if ($tokenIsArray === true - && $token[0] === T_STATIC - && $finalTokens[$lastNotEmptyToken]['code'] !== T_NEW - ) { - for ($i = ($stackPtr + 1); $i < $numTokens; $i++) { - if (is_array($tokens[$i]) === true - && isset(Tokens::$emptyTokens[$tokens[$i][0]]) === true - ) { - continue; - } - - if ($tokens[$i][0] === '(') { - $finalTokens[$newStackPtr] = [ - 'code' => T_STRING, - 'type' => 'T_STRING', - 'content' => $token[1], - ]; - - $newStackPtr++; - continue 2; - } - - break; - } - }//end if - - /* - Prior to PHP 7.4, PHP didn't support stand-alone PHP open tags at the end of a file - (without a new line), so we need to make sure that the tokenization in PHPCS is consistent - cross-version PHP by retokenizing to T_OPEN_TAG. - */ - - if (PHP_VERSION_ID < 70400 - && $tokenIsArray === true - // PHP < 7.4 with short open tags off. - && (($stackPtr === ($numTokens - 1) - && $token[0] === T_INLINE_HTML - && stripos($token[1], ' T_OPEN_TAG, - 'type' => 'T_OPEN_TAG', - 'content' => $token[1], - ]; - } else { - $finalTokens[$newStackPtr] = [ - 'code' => T_OPEN_TAG, - 'type' => 'T_OPEN_TAG', - 'content' => $token[1].$tokens[($stackPtr + 1)][1], - ]; - - $stackPtr++; - } - - $newStackPtr++; - continue; - }//end if - - /* - Parse doc blocks into something that can be easily iterated over. - */ - - if ($tokenIsArray === true - && ($token[0] === T_DOC_COMMENT - || ($token[0] === T_COMMENT && strpos($token[1], '/**') === 0 && $token[1] !== '/**/')) - ) { - $commentTokens = $commentTokenizer->tokenizeString($token[1], $this->eolChar, $newStackPtr); - foreach ($commentTokens as $commentToken) { - $finalTokens[$newStackPtr] = $commentToken; - $newStackPtr++; - } - - continue; - } - - /* - PHP 8 tokenizes a new line after a slash and hash comment to the next whitespace token. - */ - - if (PHP_VERSION_ID >= 80000 - && $tokenIsArray === true - && ($token[0] === T_COMMENT && (strpos($token[1], '//') === 0 || strpos($token[1], '#') === 0)) - && isset($tokens[($stackPtr + 1)]) === true - && is_array($tokens[($stackPtr + 1)]) === true - && $tokens[($stackPtr + 1)][0] === T_WHITESPACE - ) { - $nextToken = $tokens[($stackPtr + 1)]; - - // If the next token is a single new line, merge it into the comment token - // and set to it up to be skipped. - if ($nextToken[1] === "\n" || $nextToken[1] === "\r\n" || $nextToken[1] === "\n\r") { - $token[1] .= $nextToken[1]; - $tokens[($stackPtr + 1)] = null; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* merged newline after comment into comment token $stackPtr".PHP_EOL; - } - } else { - // This may be a whitespace token consisting of multiple new lines. - if (strpos($nextToken[1], "\r\n") === 0) { - $token[1] .= "\r\n"; - $tokens[($stackPtr + 1)][1] = substr($nextToken[1], 2); - } else if (strpos($nextToken[1], "\n\r") === 0) { - $token[1] .= "\n\r"; - $tokens[($stackPtr + 1)][1] = substr($nextToken[1], 2); - } else if (strpos($nextToken[1], "\n") === 0) { - $token[1] .= "\n"; - $tokens[($stackPtr + 1)][1] = substr($nextToken[1], 1); - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* stripped first newline after comment and added it to comment token $stackPtr".PHP_EOL; - } - }//end if - }//end if - - /* - For Explicit Octal Notation prior to PHP 8.1 we need to combine the - T_LNUMBER and T_STRING token values into a single token value, and - then ignore the T_STRING token. - */ - - if (PHP_VERSION_ID < 80100 - && $tokenIsArray === true && $token[1] === '0' - && (isset($tokens[($stackPtr + 1)]) === true - && is_array($tokens[($stackPtr + 1)]) === true - && $tokens[($stackPtr + 1)][0] === T_STRING - && isset($tokens[($stackPtr + 1)][1][0], $tokens[($stackPtr + 1)][1][1]) === true - && strtolower($tokens[($stackPtr + 1)][1][0]) === 'o' - && $tokens[($stackPtr + 1)][1][1] !== '_') - && preg_match('`^(o[0-7]+(?:_[0-7]+)?)([0-9_]*)$`i', $tokens[($stackPtr + 1)][1], $matches) === 1 - ) { - $finalTokens[$newStackPtr] = [ - 'code' => T_LNUMBER, - 'type' => 'T_LNUMBER', - 'content' => $token[1] .= $matches[1], - ]; - $newStackPtr++; - - if (isset($matches[2]) === true && $matches[2] !== '') { - $type = 'T_LNUMBER'; - if ($matches[2][0] === '_') { - $type = 'T_STRING'; - } - - $finalTokens[$newStackPtr] = [ - 'code' => constant($type), - 'type' => $type, - 'content' => $matches[2], - ]; - $newStackPtr++; - } - - $stackPtr++; - continue; - }//end if - - /* - PHP 8.1 introduced two dedicated tokens for the & character. - Retokenizing both of these to T_BITWISE_AND, which is the - token PHPCS already tokenized them as. - */ - - if ($tokenIsArray === true - && ($token[0] === T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG - || $token[0] === T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG) - ) { - $finalTokens[$newStackPtr] = [ - 'code' => T_BITWISE_AND, - 'type' => 'T_BITWISE_AND', - 'content' => $token[1], - ]; - $newStackPtr++; - continue; - } - - /* - If this is a double quoted string, PHP will tokenize the whole - thing which causes problems with the scope map when braces are - within the string. So we need to merge the tokens together to - provide a single string. - */ - - if ($tokenIsArray === false && ($token[0] === '"' || $token[0] === 'b"')) { - // Binary casts need a special token. - if ($token[0] === 'b"') { - $finalTokens[$newStackPtr] = [ - 'code' => T_BINARY_CAST, - 'type' => 'T_BINARY_CAST', - 'content' => 'b', - ]; - $newStackPtr++; - } - - $tokenContent = '"'; - $nestedVars = []; - for ($i = ($stackPtr + 1); $i < $numTokens; $i++) { - $subToken = (array) $tokens[$i]; - $subTokenIsArray = isset($subToken[1]); - - if ($subTokenIsArray === true) { - $tokenContent .= $subToken[1]; - if (($subToken[1] === '{' - || $subToken[1] === '${') - && $subToken[0] !== T_ENCAPSED_AND_WHITESPACE - ) { - $nestedVars[] = $i; - } - } else { - $tokenContent .= $subToken[0]; - if ($subToken[0] === '}') { - array_pop($nestedVars); - } - } - - if ($subTokenIsArray === false - && $subToken[0] === '"' - && empty($nestedVars) === true - ) { - // We found the other end of the double quoted string. - break; - } - }//end for - - $stackPtr = $i; - - // Convert each line within the double quoted string to a - // new token, so it conforms with other multiple line tokens. - $tokenLines = explode($this->eolChar, $tokenContent); - $numLines = count($tokenLines); - $newToken = []; - - for ($j = 0; $j < $numLines; $j++) { - $newToken['content'] = $tokenLines[$j]; - if ($j === ($numLines - 1)) { - if ($tokenLines[$j] === '') { - break; - } - } else { - $newToken['content'] .= $this->eolChar; - } - - $newToken['code'] = T_DOUBLE_QUOTED_STRING; - $newToken['type'] = 'T_DOUBLE_QUOTED_STRING'; - $finalTokens[$newStackPtr] = $newToken; - $newStackPtr++; - } - - // Continue, as we're done with this token. - continue; - }//end if - - /* - Detect binary casting and assign the casts their own token. - */ - - if ($tokenIsArray === true - && $token[0] === T_CONSTANT_ENCAPSED_STRING - && (substr($token[1], 0, 2) === 'b"' - || substr($token[1], 0, 2) === "b'") - ) { - $finalTokens[$newStackPtr] = [ - 'code' => T_BINARY_CAST, - 'type' => 'T_BINARY_CAST', - 'content' => 'b', - ]; - $newStackPtr++; - $token[1] = substr($token[1], 1); - } - - if ($tokenIsArray === true - && $token[0] === T_STRING_CAST - && preg_match('`^\(\s*binary\s*\)$`i', $token[1]) === 1 - ) { - $finalTokens[$newStackPtr] = [ - 'code' => T_BINARY_CAST, - 'type' => 'T_BINARY_CAST', - 'content' => $token[1], - ]; - $newStackPtr++; - continue; - } - - /* - If this is a heredoc, PHP will tokenize the whole - thing which causes problems when heredocs don't - contain real PHP code, which is almost never. - We want to leave the start and end heredoc tokens - alone though. - */ - - if ($tokenIsArray === true && $token[0] === T_START_HEREDOC) { - // Add the start heredoc token to the final array. - $finalTokens[$newStackPtr] = self::standardiseToken($token); - - // Check if this is actually a nowdoc and use a different token - // to help the sniffs. - $nowdoc = false; - if (strpos($token[1], "'") !== false) { - $finalTokens[$newStackPtr]['code'] = T_START_NOWDOC; - $finalTokens[$newStackPtr]['type'] = 'T_START_NOWDOC'; - $nowdoc = true; - } - - $tokenContent = ''; - for ($i = ($stackPtr + 1); $i < $numTokens; $i++) { - $subTokenIsArray = is_array($tokens[$i]); - if ($subTokenIsArray === true - && $tokens[$i][0] === T_END_HEREDOC - ) { - // We found the other end of the heredoc. - break; - } - - if ($subTokenIsArray === true) { - $tokenContent .= $tokens[$i][1]; - } else { - $tokenContent .= $tokens[$i]; - } - } - - if ($i === $numTokens) { - // We got to the end of the file and never - // found the closing token, so this probably wasn't - // a heredoc. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $finalTokens[$newStackPtr]['type']; - echo "\t\t* failed to find the end of the here/nowdoc".PHP_EOL; - echo "\t\t* token $stackPtr changed from $type to T_STRING".PHP_EOL; - } - - $finalTokens[$newStackPtr]['code'] = T_STRING; - $finalTokens[$newStackPtr]['type'] = 'T_STRING'; - $newStackPtr++; - continue; - } - - $stackPtr = $i; - $newStackPtr++; - - // Convert each line within the heredoc to a - // new token, so it conforms with other multiple line tokens. - $tokenLines = explode($this->eolChar, $tokenContent); - $numLines = count($tokenLines); - $newToken = []; - - for ($j = 0; $j < $numLines; $j++) { - $newToken['content'] = $tokenLines[$j]; - if ($j === ($numLines - 1)) { - if ($tokenLines[$j] === '') { - break; - } - } else { - $newToken['content'] .= $this->eolChar; - } - - if ($nowdoc === true) { - $newToken['code'] = T_NOWDOC; - $newToken['type'] = 'T_NOWDOC'; - } else { - $newToken['code'] = T_HEREDOC; - $newToken['type'] = 'T_HEREDOC'; - } - - $finalTokens[$newStackPtr] = $newToken; - $newStackPtr++; - }//end for - - // Add the end heredoc token to the final array. - $finalTokens[$newStackPtr] = self::standardiseToken($tokens[$stackPtr]); - - if ($nowdoc === true) { - $finalTokens[$newStackPtr]['code'] = T_END_NOWDOC; - $finalTokens[$newStackPtr]['type'] = 'T_END_NOWDOC'; - } - - $newStackPtr++; - - // Continue, as we're done with this token. - continue; - }//end if - - /* - Enum keyword for PHP < 8.1 - */ - - if ($tokenIsArray === true - && $token[0] === T_STRING - && strtolower($token[1]) === 'enum' - ) { - // Get the next non-empty token. - for ($i = ($stackPtr + 1); $i < $numTokens; $i++) { - if (is_array($tokens[$i]) === false - || isset(Tokens::$emptyTokens[$tokens[$i][0]]) === false - ) { - break; - } - } - - if (isset($tokens[$i]) === true - && is_array($tokens[$i]) === true - && $tokens[$i][0] === T_STRING - ) { - // Modify $tokens directly so we can use it later when converting enum "case". - $tokens[$stackPtr][0] = T_ENUM; - - $newToken = []; - $newToken['code'] = T_ENUM; - $newToken['type'] = 'T_ENUM'; - $newToken['content'] = $token[1]; - $finalTokens[$newStackPtr] = $newToken; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token $stackPtr changed from T_STRING to T_ENUM".PHP_EOL; - } - - $newStackPtr++; - continue; - } - }//end if - - /* - Convert enum "case" to T_ENUM_CASE - */ - - if ($tokenIsArray === true - && $token[0] === T_CASE - && isset($this->tstringContexts[$finalTokens[$lastNotEmptyToken]['code']]) === false - ) { - $isEnumCase = false; - $scope = 1; - - for ($i = ($stackPtr - 1); $i > 0; $i--) { - if ($tokens[$i] === '}') { - $scope++; - continue; - } - - if ($tokens[$i] === '{') { - $scope--; - continue; - } - - if (is_array($tokens[$i]) === false) { - continue; - } - - if ($scope !== 0) { - continue; - } - - if ($tokens[$i][0] === T_SWITCH) { - break; - } - - if ($tokens[$i][0] === T_ENUM || $tokens[$i][0] === T_ENUM_CASE) { - $isEnumCase = true; - break; - } - }//end for - - if ($isEnumCase === true) { - // Modify $tokens directly so we can use it as optimisation for other enum "case". - $tokens[$stackPtr][0] = T_ENUM_CASE; - - $newToken = []; - $newToken['code'] = T_ENUM_CASE; - $newToken['type'] = 'T_ENUM_CASE'; - $newToken['content'] = $token[1]; - $finalTokens[$newStackPtr] = $newToken; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token $stackPtr changed from T_CASE to T_ENUM_CASE".PHP_EOL; - } - - $newStackPtr++; - continue; - } - }//end if - - /* - Asymmetric visibility for PHP < 8.4 - */ - - if ($tokenIsArray === true - && in_array($token[0], [T_PUBLIC, T_PROTECTED, T_PRIVATE], true) === true - && ($stackPtr + 3) < $numTokens - && $tokens[($stackPtr + 1)] === '(' - && is_array($tokens[($stackPtr + 2)]) === true - && $tokens[($stackPtr + 2)][0] === T_STRING - && strtolower($tokens[($stackPtr + 2)][1]) === 'set' - && $tokens[($stackPtr + 3)] === ')' - ) { - $newToken = []; - if ($token[0] === T_PUBLIC) { - $oldCode = 'T_PUBLIC'; - $newToken['code'] = T_PUBLIC_SET; - $newToken['type'] = 'T_PUBLIC_SET'; - } else if ($token[0] === T_PROTECTED) { - $oldCode = 'T_PROTECTED'; - $newToken['code'] = T_PROTECTED_SET; - $newToken['type'] = 'T_PROTECTED_SET'; - } else { - $oldCode = 'T_PRIVATE'; - $newToken['code'] = T_PRIVATE_SET; - $newToken['type'] = 'T_PRIVATE_SET'; - } - - $newToken['content'] = $token[1].'('.$tokens[($stackPtr + 2)][1].')'; - $finalTokens[$newStackPtr] = $newToken; - $newStackPtr++; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $newCode = $newToken['type']; - echo "\t\t* tokens from $stackPtr changed from $oldCode to $newCode".PHP_EOL; - } - - // We processed an extra 3 tokens, for `(`, `set`, and `)`. - $stackPtr += 3; - - continue; - }//end if - - /* - As of PHP 8.0 fully qualified, partially qualified and namespace relative - identifier names are tokenized differently. - This "undoes" the new tokenization so the tokenization will be the same in - in PHP 5, 7 and 8. - */ - - if (PHP_VERSION_ID >= 80000 - && $tokenIsArray === true - && ($token[0] === T_NAME_QUALIFIED - || $token[0] === T_NAME_FULLY_QUALIFIED - || $token[0] === T_NAME_RELATIVE) - ) { - $name = $token[1]; - - if ($token[0] === T_NAME_FULLY_QUALIFIED) { - $newToken = []; - $newToken['code'] = T_NS_SEPARATOR; - $newToken['type'] = 'T_NS_SEPARATOR'; - $newToken['content'] = '\\'; - $finalTokens[$newStackPtr] = $newToken; - ++$newStackPtr; - - $name = ltrim($name, '\\'); - } - - if ($token[0] === T_NAME_RELATIVE) { - $newToken = []; - $newToken['code'] = T_NAMESPACE; - $newToken['type'] = 'T_NAMESPACE'; - $newToken['content'] = substr($name, 0, 9); - $finalTokens[$newStackPtr] = $newToken; - ++$newStackPtr; - - $newToken = []; - $newToken['code'] = T_NS_SEPARATOR; - $newToken['type'] = 'T_NS_SEPARATOR'; - $newToken['content'] = '\\'; - $finalTokens[$newStackPtr] = $newToken; - ++$newStackPtr; - - $name = substr($name, 10); - } - - // Special case keywords which can be used in fully qualified form. - if ($token[0] === T_NAME_FULLY_QUALIFIED) { - $specialCasedType = null; - $nameLc = strtolower($name); - if ($nameLc === 'exit' || $nameLc === 'die') { - $specialCasedType = 'T_EXIT'; - } else if ($nameLc === 'true') { - $specialCasedType = 'T_TRUE'; - } else if ($nameLc === 'false') { - $specialCasedType = 'T_FALSE'; - } else if ($nameLc === 'null') { - $specialCasedType = 'T_NULL'; - } - - if ($specialCasedType !== null) { - $newToken = []; - $newToken['code'] = constant($specialCasedType); - $newToken['type'] = $specialCasedType; - $newToken['content'] = $name; - $finalTokens[$newStackPtr] = $newToken; - ++$newStackPtr; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = Tokens::tokenName($token[0]); - $content = Common::prepareForOutput($token[1]); - echo "\t\t* token $stackPtr split into individual tokens T_NS_SEPARATOR + $specialCasedType".PHP_EOL; - } - - continue; - } - }//end if - - $parts = explode('\\', $name); - $partCount = count($parts); - $lastPart = ($partCount - 1); - - foreach ($parts as $i => $part) { - $newToken = []; - $newToken['code'] = T_STRING; - $newToken['type'] = 'T_STRING'; - $newToken['content'] = $part; - $finalTokens[$newStackPtr] = $newToken; - ++$newStackPtr; - - if ($i !== $lastPart) { - $newToken = []; - $newToken['code'] = T_NS_SEPARATOR; - $newToken['type'] = 'T_NS_SEPARATOR'; - $newToken['content'] = '\\'; - $finalTokens[$newStackPtr] = $newToken; - ++$newStackPtr; - } - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = Tokens::tokenName($token[0]); - $content = Common::prepareForOutput($token[1]); - echo "\t\t* token $stackPtr split into individual tokens; was: $type => $content".PHP_EOL; - } - - continue; - }//end if - - /* - PHP 8.0 Attributes - */ - - if (PHP_VERSION_ID < 80000 - && $token[0] === T_COMMENT - && strpos($token[1], '#[') === 0 - ) { - $subTokens = $this->parsePhpAttribute($tokens, $stackPtr); - array_splice($tokens, $stackPtr, 1, $subTokens); - $numTokens = count($tokens); - - $tokenIsArray = true; - $token = $tokens[$stackPtr]; - } - - if ($tokenIsArray === true - && $token[0] === T_ATTRIBUTE - ) { - // Go looking for the close bracket. - $bracketCloser = $this->findCloser($tokens, ($stackPtr + 1), ['[', '#['], ']'); - - $newToken = []; - $newToken['code'] = T_ATTRIBUTE; - $newToken['type'] = 'T_ATTRIBUTE'; - $newToken['content'] = '#['; - $finalTokens[$newStackPtr] = $newToken; - $newStackPtr++; - - if ($bracketCloser !== null) { - $tokens[$bracketCloser] = []; - $tokens[$bracketCloser][0] = T_ATTRIBUTE_END; - $tokens[$bracketCloser][1] = ']'; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token $bracketCloser changed from T_CLOSE_SQUARE_BRACKET to T_ATTRIBUTE_END".PHP_EOL; - } - } - - continue; - }//end if - - /* - Tokenize the parameter labels for PHP 8.0 named parameters as a special T_PARAM_NAME - token and ensures that the colon after it is always T_COLON. - */ - - if ($tokenIsArray === true - && ($token[0] === T_STRING - || preg_match('`^[a-zA-Z_\x80-\xff]`', $token[1]) === 1) - ) { - // Get the next non-empty token. - for ($i = ($stackPtr + 1); $i < $numTokens; $i++) { - if (is_array($tokens[$i]) === false - || isset(Tokens::$emptyTokens[$tokens[$i][0]]) === false - ) { - break; - } - } - - if (isset($tokens[$i]) === true - && is_array($tokens[$i]) === false - && $tokens[$i] === ':' - ) { - // Get the previous non-empty token. - for ($j = ($stackPtr - 1); $j > 0; $j--) { - if (is_array($tokens[$j]) === false - || isset(Tokens::$emptyTokens[$tokens[$j][0]]) === false - ) { - break; - } - } - - if (is_array($tokens[$j]) === false - && ($tokens[$j] === '(' - || $tokens[$j] === ',') - ) { - $newToken = []; - $newToken['code'] = T_PARAM_NAME; - $newToken['type'] = 'T_PARAM_NAME'; - $newToken['content'] = $token[1]; - $finalTokens[$newStackPtr] = $newToken; - - $newStackPtr++; - - // Modify the original token stack so that future checks, like - // determining T_COLON vs T_INLINE_ELSE can handle this correctly. - $tokens[$stackPtr][0] = T_PARAM_NAME; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = Tokens::tokenName($token[0]); - echo "\t\t* token $stackPtr changed from $type to T_PARAM_NAME".PHP_EOL; - } - - continue; - } - }//end if - }//end if - - /* - "readonly" keyword for PHP < 8.1 - */ - - if ($tokenIsArray === true - && strtolower($token[1]) === 'readonly' - && (isset($this->tstringContexts[$finalTokens[$lastNotEmptyToken]['code']]) === false - || $finalTokens[$lastNotEmptyToken]['code'] === T_NEW) - ) { - // Get the next non-whitespace token. - for ($i = ($stackPtr + 1); $i < $numTokens; $i++) { - if (is_array($tokens[$i]) === false - || isset(Tokens::$emptyTokens[$tokens[$i][0]]) === false - ) { - break; - } - } - - $isReadonlyKeyword = false; - - if (isset($tokens[$i]) === false - || $tokens[$i] !== '(' - ) { - $isReadonlyKeyword = true; - } else if ($tokens[$i] === '(') { - /* - * Skip over tokens which can be used in type declarations. - * At this point, the only token types which need to be taken into consideration - * as potential type declarations are identifier names, T_ARRAY, T_CALLABLE and T_NS_SEPARATOR - * and the union/intersection/dnf parentheses. - */ - - $foundDNFParens = 1; - $foundDNFPipe = 0; - - for (++$i; $i < $numTokens; $i++) { - if (is_array($tokens[$i]) === true) { - $tokenType = $tokens[$i][0]; - } else { - $tokenType = $tokens[$i]; - } - - if (isset(Tokens::$emptyTokens[$tokenType]) === true) { - continue; - } - - if ($tokenType === '|') { - ++$foundDNFPipe; - continue; - } - - if ($tokenType === ')') { - ++$foundDNFParens; - continue; - } - - if ($tokenType === '(') { - ++$foundDNFParens; - continue; - } - - if ($tokenType === T_STRING - || $tokenType === T_NAME_FULLY_QUALIFIED - || $tokenType === T_NAME_RELATIVE - || $tokenType === T_NAME_QUALIFIED - || $tokenType === T_ARRAY - || $tokenType === T_NAMESPACE - || $tokenType === T_NS_SEPARATOR - || $tokenType === T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG // PHP 8.0+. - || $tokenType === '&' // PHP < 8.0. - ) { - continue; - } - - // Reached the next token after. - if (($foundDNFParens % 2) === 0 - && $foundDNFPipe >= 1 - && ($tokenType === T_VARIABLE - || $tokenType === T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG) - ) { - $isReadonlyKeyword = true; - } - - break; - }//end for - }//end if - - if ($isReadonlyKeyword === true) { - $finalTokens[$newStackPtr] = [ - 'code' => T_READONLY, - 'type' => 'T_READONLY', - 'content' => $token[1], - ]; - $newStackPtr++; - - // Also modify the original token stack so that - // future checks (like looking for T_NULLABLE) can - // detect the T_READONLY token more easily. - $tokens[$stackPtr][0] = T_READONLY; - $token[0] = T_READONLY; - - if (PHP_CODESNIFFER_VERBOSITY > 1 && $type !== T_READONLY) { - echo "\t\t* token $stackPtr changed from $type to T_READONLY".PHP_EOL; - } - } else { - $finalTokens[$newStackPtr] = [ - 'code' => T_STRING, - 'type' => 'T_STRING', - 'content' => $token[1], - ]; - $newStackPtr++; - - if (PHP_CODESNIFFER_VERBOSITY > 1 && $type !== T_STRING) { - echo "\t\t* token $stackPtr changed from $type to T_STRING".PHP_EOL; - } - }//end if - - continue; - }//end if - - /* - Before PHP 7.0, "yield from" was tokenized as - T_YIELD, T_WHITESPACE and T_STRING. So look for - and change this token in earlier versions. - */ - - if (PHP_VERSION_ID < 70000 - && $tokenIsArray === true - && $token[0] === T_YIELD - && isset($tokens[($stackPtr + 1)]) === true - && isset($tokens[($stackPtr + 2)]) === true - && $tokens[($stackPtr + 1)][0] === T_WHITESPACE - && strpos($tokens[($stackPtr + 1)][1], $this->eolChar) === false - && $tokens[($stackPtr + 2)][0] === T_STRING - && strtolower($tokens[($stackPtr + 2)][1]) === 'from' - ) { - // Single-line "yield from" with only whitespace between. - $finalTokens[$newStackPtr] = [ - 'code' => T_YIELD_FROM, - 'type' => 'T_YIELD_FROM', - 'content' => $token[1].$tokens[($stackPtr + 1)][1].$tokens[($stackPtr + 2)][1], - ]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - for ($i = ($stackPtr + 1); $i <= ($stackPtr + 2); $i++) { - $type = Tokens::tokenName($tokens[$i][0]); - $content = Common::prepareForOutput($tokens[$i][1]); - echo "\t\t* token $i merged into T_YIELD_FROM; was: $type => $content".PHP_EOL; - } - } - - $newStackPtr++; - $stackPtr += 2; - - continue; - } else if (PHP_VERSION_ID < 80300 - && $tokenIsArray === true - && $token[0] === T_STRING - && strtolower($token[1]) === 'from' - && $finalTokens[$lastNotEmptyToken]['code'] === T_YIELD - ) { - /* - Before PHP 8.3, if there was a comment between the "yield" and "from" keywords, - it was tokenized as T_YIELD, T_WHITESPACE, T_COMMENT... and T_STRING. - We want to keep the tokenization of the tokens between, but need to change the - `T_YIELD` and `T_STRING` (from) keywords to `T_YIELD_FROM. - */ - - $finalTokens[$lastNotEmptyToken]['code'] = T_YIELD_FROM; - $finalTokens[$lastNotEmptyToken]['type'] = 'T_YIELD_FROM'; - - $finalTokens[$newStackPtr] = [ - 'code' => T_YIELD_FROM, - 'type' => 'T_YIELD_FROM', - 'content' => $token[1], - ]; - $newStackPtr++; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token $lastNotEmptyToken (new stack) changed into T_YIELD_FROM; was: T_YIELD".PHP_EOL; - echo "\t\t* token $stackPtr changed into T_YIELD_FROM; was: T_STRING".PHP_EOL; - } - - continue; - } else if (PHP_VERSION_ID >= 70000 - && $tokenIsArray === true - && $token[0] === T_YIELD_FROM - && strpos($token[1], $this->eolChar) !== false - && preg_match('`^yield\s+from$`i', $token[1]) === 1 - ) { - /* - In PHP 7.0+, a multi-line "yield from" (without comment) tokenizes as a single - T_YIELD_FROM token, but we want to split it and tokenize the whitespace - separately for consistency. - */ - - $finalTokens[$newStackPtr] = [ - 'code' => T_YIELD_FROM, - 'type' => 'T_YIELD_FROM', - 'content' => substr($token[1], 0, 5), - ]; - $newStackPtr++; - - $tokenLines = explode($this->eolChar, substr($token[1], 5, -4)); - $numLines = count($tokenLines); - $newToken = [ - 'type' => 'T_WHITESPACE', - 'code' => T_WHITESPACE, - 'content' => '', - ]; - - foreach ($tokenLines as $i => $line) { - $newToken['content'] = $line; - if ($i === ($numLines - 1)) { - if ($line === '') { - break; - } - } else { - $newToken['content'] .= $this->eolChar; - } - - $finalTokens[$newStackPtr] = $newToken; - $newStackPtr++; - } - - $finalTokens[$newStackPtr] = [ - 'code' => T_YIELD_FROM, - 'type' => 'T_YIELD_FROM', - 'content' => substr($token[1], -4), - ]; - $newStackPtr++; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token $stackPtr split into 'yield', one or more whitespace tokens and 'from'".PHP_EOL; - } - - continue; - } else if (PHP_VERSION_ID >= 80300 - && $tokenIsArray === true - && $token[0] === T_YIELD_FROM - && preg_match('`^yield[ \t]+from$`i', $token[1]) !== 1 - && stripos($token[1], 'yield') === 0 - ) { - /* - Since PHP 8.3, "yield from" allows for comments and will - swallow the comment in the `T_YIELD_FROM` token. - We need to split this up to allow for sniffs handling comments. - */ - - $finalTokens[$newStackPtr] = [ - 'code' => T_YIELD_FROM, - 'type' => 'T_YIELD_FROM', - 'content' => substr($token[1], 0, 5), - ]; - $newStackPtr++; - - $yieldFromSubtokens = @token_get_all(" T_YIELD_FROM, - 1 => substr($token[1], -4), - ]; - - // Inject the new tokens into the token stack. - array_splice($tokens, ($stackPtr + 1), 0, $yieldFromSubtokens); - $numTokens = count($tokens); - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token $stackPtr split into parts (yield from with comment)".PHP_EOL; - } - - unset($yieldFromSubtokens); - continue; - }//end if - - /* - Before PHP 5.6, the ... operator was tokenized as three - T_STRING_CONCAT tokens in a row. So look for and combine - these tokens in earlier versions. - */ - - if ($tokenIsArray === false - && $token[0] === '.' - && isset($tokens[($stackPtr + 1)]) === true - && isset($tokens[($stackPtr + 2)]) === true - && $tokens[($stackPtr + 1)] === '.' - && $tokens[($stackPtr + 2)] === '.' - ) { - $newToken = []; - $newToken['code'] = T_ELLIPSIS; - $newToken['type'] = 'T_ELLIPSIS'; - $newToken['content'] = '...'; - $finalTokens[$newStackPtr] = $newToken; - - $newStackPtr++; - $stackPtr += 2; - continue; - } - - /* - Before PHP 5.6, the ** operator was tokenized as two - T_MULTIPLY tokens in a row. So look for and combine - these tokens in earlier versions. - */ - - if ($tokenIsArray === false - && $token[0] === '*' - && isset($tokens[($stackPtr + 1)]) === true - && $tokens[($stackPtr + 1)] === '*' - ) { - $newToken = []; - $newToken['code'] = T_POW; - $newToken['type'] = 'T_POW'; - $newToken['content'] = '**'; - $finalTokens[$newStackPtr] = $newToken; - - $newStackPtr++; - $stackPtr++; - continue; - } - - /* - Before PHP 5.6, the **= operator was tokenized as - T_MULTIPLY followed by T_MUL_EQUAL. So look for and combine - these tokens in earlier versions. - */ - - if ($tokenIsArray === false - && $token[0] === '*' - && isset($tokens[($stackPtr + 1)]) === true - && is_array($tokens[($stackPtr + 1)]) === true - && $tokens[($stackPtr + 1)][1] === '*=' - ) { - $newToken = []; - $newToken['code'] = T_POW_EQUAL; - $newToken['type'] = 'T_POW_EQUAL'; - $newToken['content'] = '**='; - $finalTokens[$newStackPtr] = $newToken; - - $newStackPtr++; - $stackPtr++; - continue; - } - - /* - Before PHP 7, the ??= operator was tokenized as - T_INLINE_THEN, T_INLINE_THEN, T_EQUAL. - Between PHP 7.0 and 7.3, the ??= operator was tokenized as - T_COALESCE, T_EQUAL. - So look for and combine these tokens in earlier versions. - */ - - if (($tokenIsArray === false - && $token[0] === '?' - && isset($tokens[($stackPtr + 1)]) === true - && $tokens[($stackPtr + 1)][0] === '?' - && isset($tokens[($stackPtr + 2)]) === true - && $tokens[($stackPtr + 2)][0] === '=') - || ($tokenIsArray === true - && $token[0] === T_COALESCE - && isset($tokens[($stackPtr + 1)]) === true - && $tokens[($stackPtr + 1)][0] === '=') - ) { - $newToken = []; - $newToken['code'] = T_COALESCE_EQUAL; - $newToken['type'] = 'T_COALESCE_EQUAL'; - $newToken['content'] = '??='; - $finalTokens[$newStackPtr] = $newToken; - - $newStackPtr++; - $stackPtr++; - - if ($tokenIsArray === false) { - // Pre PHP 7. - $stackPtr++; - } - - continue; - } - - /* - Before PHP 7, the ?? operator was tokenized as - T_INLINE_THEN followed by T_INLINE_THEN. - So look for and combine these tokens in earlier versions. - */ - - if ($tokenIsArray === false - && $token[0] === '?' - && isset($tokens[($stackPtr + 1)]) === true - && $tokens[($stackPtr + 1)][0] === '?' - ) { - $newToken = []; - $newToken['code'] = T_COALESCE; - $newToken['type'] = 'T_COALESCE'; - $newToken['content'] = '??'; - $finalTokens[$newStackPtr] = $newToken; - - $newStackPtr++; - $stackPtr++; - continue; - } - - /* - Before PHP 8, the ?-> operator was tokenized as - T_INLINE_THEN followed by T_OBJECT_OPERATOR. - So look for and combine these tokens in earlier versions. - */ - - if ($tokenIsArray === false - && $token[0] === '?' - && isset($tokens[($stackPtr + 1)]) === true - && is_array($tokens[($stackPtr + 1)]) === true - && $tokens[($stackPtr + 1)][0] === T_OBJECT_OPERATOR - ) { - $newToken = []; - $newToken['code'] = T_NULLSAFE_OBJECT_OPERATOR; - $newToken['type'] = 'T_NULLSAFE_OBJECT_OPERATOR'; - $newToken['content'] = '?->'; - $finalTokens[$newStackPtr] = $newToken; - - $newStackPtr++; - $stackPtr++; - continue; - } - - /* - Before PHP 7.4, underscores inside T_LNUMBER and T_DNUMBER - tokens split the token with a T_STRING. So look for - and change these tokens in earlier versions. - */ - - if (PHP_VERSION_ID < 70400 - && ($tokenIsArray === true - && ($token[0] === T_LNUMBER - || $token[0] === T_DNUMBER) - && isset($tokens[($stackPtr + 1)]) === true - && is_array($tokens[($stackPtr + 1)]) === true - && $tokens[($stackPtr + 1)][0] === T_STRING - && $tokens[($stackPtr + 1)][1][0] === '_') - ) { - $newContent = $token[1]; - $newType = $token[0]; - for ($i = ($stackPtr + 1); $i < $numTokens; $i++) { - if (is_array($tokens[$i]) === false) { - break; - } - - if ($tokens[$i][0] === T_LNUMBER - || $tokens[$i][0] === T_DNUMBER - ) { - $newContent .= $tokens[$i][1]; - continue; - } - - if ($tokens[$i][0] === T_STRING - && $tokens[$i][1][0] === '_' - && ((strpos($newContent, '0x') === 0 - && preg_match('`^((? PHP_INT_MAX) - || (stripos($newContent, '0b') === 0 && bindec(str_replace('_', '', $newContent)) > PHP_INT_MAX) - || (stripos($newContent, '0o') === 0 && octdec(str_replace('_', '', $newContent)) > PHP_INT_MAX) - || (stripos($newContent, '0x') !== 0 - && (stripos($newContent, 'e') !== false || strpos($newContent, '.') !== false)) - || (strpos($newContent, '0') === 0 && stripos($newContent, '0x') !== 0 - && stripos($newContent, '0b') !== 0 && octdec(str_replace('_', '', $newContent)) > PHP_INT_MAX) - || (strpos($newContent, '0') !== 0 && str_replace('_', '', $newContent) > PHP_INT_MAX)) - ) { - $newType = T_DNUMBER; - } - - $newToken = []; - $newToken['code'] = $newType; - $newToken['type'] = Tokens::tokenName($newType); - $newToken['content'] = $newContent; - $finalTokens[$newStackPtr] = $newToken; - - $newStackPtr++; - $stackPtr = ($i - 1); - continue; - }//end if - - /* - Backfill the T_MATCH token for PHP versions < 8.0 and - do initial correction for non-match expression T_MATCH tokens - to T_STRING for PHP >= 8.0. - A final check for non-match expression T_MATCH tokens is done - in PHP::processAdditional(). - */ - - if ($tokenIsArray === true - && (($token[0] === T_STRING - && strtolower($token[1]) === 'match') - || $token[0] === T_MATCH) - ) { - $isMatch = false; - for ($x = ($stackPtr + 1); $x < $numTokens; $x++) { - if (isset($tokens[$x][0], Tokens::$emptyTokens[$tokens[$x][0]]) === true) { - continue; - } - - if ($tokens[$x] !== '(') { - // This is not a match expression. - break; - } - - if (isset($this->tstringContexts[$finalTokens[$lastNotEmptyToken]['code']]) === true) { - // Also not a match expression. - break; - } - - $isMatch = true; - break; - }//end for - - if ($isMatch === true && $token[0] === T_STRING) { - $newToken = []; - $newToken['code'] = T_MATCH; - $newToken['type'] = 'T_MATCH'; - $newToken['content'] = $token[1]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token $stackPtr changed from T_STRING to T_MATCH".PHP_EOL; - } - - $finalTokens[$newStackPtr] = $newToken; - $newStackPtr++; - continue; - } else if ($isMatch === false && $token[0] === T_MATCH) { - // PHP 8.0, match keyword, but not a match expression. - $newToken = []; - $newToken['code'] = T_STRING; - $newToken['type'] = 'T_STRING'; - $newToken['content'] = $token[1]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token $stackPtr changed from T_MATCH to T_STRING".PHP_EOL; - } - - $finalTokens[$newStackPtr] = $newToken; - $newStackPtr++; - continue; - }//end if - }//end if - - /* - Retokenize the T_DEFAULT in match control structures as T_MATCH_DEFAULT - to prevent scope being set and the scope for switch default statements - breaking. - */ - - if ($tokenIsArray === true - && $token[0] === T_DEFAULT - && isset($this->tstringContexts[$finalTokens[$lastNotEmptyToken]['code']]) === false - ) { - for ($x = ($stackPtr + 1); $x < $numTokens; $x++) { - if ($tokens[$x] === ',') { - // Skip over potential trailing comma (supported in PHP). - continue; - } - - if (is_array($tokens[$x]) === false - || isset(Tokens::$emptyTokens[$tokens[$x][0]]) === false - ) { - // Non-empty, non-comma content. - break; - } - } - - if (isset($tokens[$x]) === true - && is_array($tokens[$x]) === true - && $tokens[$x][0] === T_DOUBLE_ARROW - ) { - // Modify the original token stack for the double arrow so that - // future checks can disregard the double arrow token more easily. - // For match expression "case" statements, this is handled - // in PHP::processAdditional(). - $tokens[$x][0] = T_MATCH_ARROW; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token $x changed from T_DOUBLE_ARROW to T_MATCH_ARROW".PHP_EOL; - } - - $newToken = []; - $newToken['code'] = T_MATCH_DEFAULT; - $newToken['type'] = 'T_MATCH_DEFAULT'; - $newToken['content'] = $token[1]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token $stackPtr changed from T_DEFAULT to T_MATCH_DEFAULT".PHP_EOL; - } - - $finalTokens[$newStackPtr] = $newToken; - $newStackPtr++; - continue; - }//end if - }//end if - - /* - Convert ? to T_NULLABLE OR T_INLINE_THEN - */ - - if ($tokenIsArray === false && $token[0] === '?') { - $newToken = []; - $newToken['content'] = '?'; - - // For typed constants, we only need to check the token before the ? to be sure. - if ($finalTokens[$lastNotEmptyToken]['code'] === T_CONST) { - $newToken['code'] = T_NULLABLE; - $newToken['type'] = 'T_NULLABLE'; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token $stackPtr changed from ? to T_NULLABLE".PHP_EOL; - } - - $finalTokens[$newStackPtr] = $newToken; - $newStackPtr++; - continue; - } - - /* - * Check if the next non-empty token is one of the tokens which can be used - * in type declarations. If not, it's definitely a ternary. - * At this point, the only token types which need to be taken into consideration - * as potential type declarations are identifier names, T_ARRAY, T_CALLABLE and T_NS_SEPARATOR. - */ - - $lastRelevantNonEmpty = null; - - for ($i = ($stackPtr + 1); $i < $numTokens; $i++) { - if (is_array($tokens[$i]) === true) { - $tokenType = $tokens[$i][0]; - } else { - $tokenType = $tokens[$i]; - } - - if (isset(Tokens::$emptyTokens[$tokenType]) === true) { - continue; - } - - if ($tokenType === T_STRING - || $tokenType === T_NAME_FULLY_QUALIFIED - || $tokenType === T_NAME_RELATIVE - || $tokenType === T_NAME_QUALIFIED - || $tokenType === T_ARRAY - || $tokenType === T_NAMESPACE - || $tokenType === T_NS_SEPARATOR - ) { - $lastRelevantNonEmpty = $tokenType; - continue; - } - - if (($tokenType !== T_CALLABLE - && isset($lastRelevantNonEmpty) === false) - || ($lastRelevantNonEmpty === T_ARRAY - && $tokenType === '(') - || (($lastRelevantNonEmpty === T_STRING - || $lastRelevantNonEmpty === T_NAME_FULLY_QUALIFIED - || $lastRelevantNonEmpty === T_NAME_RELATIVE - || $lastRelevantNonEmpty === T_NAME_QUALIFIED) - && ($tokenType === T_DOUBLE_COLON - || $tokenType === '(' - || $tokenType === ':')) - ) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token $stackPtr changed from ? to T_INLINE_THEN".PHP_EOL; - } - - $newToken['code'] = T_INLINE_THEN; - $newToken['type'] = 'T_INLINE_THEN'; - - $insideInlineIf[] = $stackPtr; - - $finalTokens[$newStackPtr] = $newToken; - $newStackPtr++; - continue 2; - } - - break; - }//end for - - // Handle live coding/parse errors elegantly. - // If the "?" is the last non-empty token in the file, we cannot draw a definitive conclusion, - // so tokenize as T_INLINE_THEN. - if ($i === $numTokens) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token $stackPtr at end of file changed from ? to T_INLINE_THEN".PHP_EOL; - } - - $newToken['code'] = T_INLINE_THEN; - $newToken['type'] = 'T_INLINE_THEN'; - - $insideInlineIf[] = $stackPtr; - - $finalTokens[$newStackPtr] = $newToken; - $newStackPtr++; - continue; - } - - /* - * This can still be a nullable type or a ternary. - * Do additional checking. - */ - - $prevNonEmpty = null; - $lastSeenNonEmpty = null; - - for ($i = ($stackPtr - 1); $i >= 0; $i--) { - if (isset($tokens[$i]) === false) { - // Ignore skipped tokens (related to PHP 8+ slash/hash comment vs new line retokenization). - continue; - } - - if (is_array($tokens[$i]) === true) { - $tokenType = $tokens[$i][0]; - } else { - $tokenType = $tokens[$i]; - } - - if ($tokenType === T_STATIC - && ($lastSeenNonEmpty === T_DOUBLE_COLON - || $lastSeenNonEmpty === '(') - ) { - $lastSeenNonEmpty = $tokenType; - continue; - } - - if ($prevNonEmpty === null - && isset(Tokens::$emptyTokens[$tokenType]) === false - ) { - // Found the previous non-empty token. - if ($tokenType === ':' || $tokenType === ',' || $tokenType === T_ATTRIBUTE_END) { - $newToken['code'] = T_NULLABLE; - $newToken['type'] = 'T_NULLABLE'; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token $stackPtr changed from ? to T_NULLABLE".PHP_EOL; - } - - break; - } - - $prevNonEmpty = $tokenType; - } - - if ($tokenType === T_FUNCTION - || $tokenType === T_FN - || isset(Tokens::$methodPrefixes[$tokenType]) === true - || isset(Tokens::$scopeModifiers[$tokenType]) === true - || $tokenType === T_VAR - || $tokenType === T_READONLY - ) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token $stackPtr changed from ? to T_NULLABLE".PHP_EOL; - } - - $newToken['code'] = T_NULLABLE; - $newToken['type'] = 'T_NULLABLE'; - break; - } else if (in_array($tokenType, [T_DOUBLE_ARROW, T_OPEN_TAG, T_OPEN_TAG_WITH_ECHO, '=', '{', ';'], true) === true) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token $stackPtr changed from ? to T_INLINE_THEN".PHP_EOL; - } - - $newToken['code'] = T_INLINE_THEN; - $newToken['type'] = 'T_INLINE_THEN'; - - $insideInlineIf[] = $stackPtr; - break; - } - - if (isset(Tokens::$emptyTokens[$tokenType]) === false) { - $lastSeenNonEmpty = $tokenType; - } - }//end for - - $finalTokens[$newStackPtr] = $newToken; - $newStackPtr++; - continue; - }//end if - - /* - Tokens after a double colon may look like scope openers, - such as when writing code like Foo::NAMESPACE, but they are - only ever variables or strings. - */ - - if ($stackPtr > 1 - && (is_array($tokens[($stackPtr - 1)]) === true - && $tokens[($stackPtr - 1)][0] === T_PAAMAYIM_NEKUDOTAYIM) - && $tokenIsArray === true - && $token[0] !== T_STRING - && $token[0] !== T_VARIABLE - && $token[0] !== T_DOLLAR - && isset(Tokens::$emptyTokens[$token[0]]) === false - ) { - $newToken = []; - $newToken['code'] = T_STRING; - $newToken['type'] = 'T_STRING'; - $newToken['content'] = $token[1]; - $finalTokens[$newStackPtr] = $newToken; - - $newStackPtr++; - continue; - } - - /* - Backfill the T_FN token for PHP versions < 7.4. - */ - - if ($tokenIsArray === true - && $token[0] === T_STRING - && strtolower($token[1]) === 'fn' - ) { - // Modify the original token stack so that - // future checks (like looking for T_NULLABLE) can - // detect the T_FN token more easily. - $tokens[$stackPtr][0] = T_FN; - $token[0] = T_FN; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token $stackPtr changed from T_STRING to T_FN".PHP_EOL; - } - } - - /* - This is a special condition for T_ARRAY tokens used for - function return types. We want to keep the parenthesis map clean, - so let's tag these tokens as T_STRING. - */ - - if ($tokenIsArray === true - && ($token[0] === T_FUNCTION - || $token[0] === T_FN) - && $finalTokens[$lastNotEmptyToken]['code'] !== T_USE - ) { - // Go looking for the colon to start the return type hint. - // Start by finding the closing parenthesis of the function. - $parenthesisStack = []; - $parenthesisCloser = false; - for ($x = ($stackPtr + 1); $x < $numTokens; $x++) { - if (is_array($tokens[$x]) === false && $tokens[$x] === '(') { - $parenthesisStack[] = $x; - } else if (is_array($tokens[$x]) === false && $tokens[$x] === ')') { - array_pop($parenthesisStack); - if (empty($parenthesisStack) === true) { - $parenthesisCloser = $x; - break; - } - } - } - - if ($parenthesisCloser !== false) { - for ($x = ($parenthesisCloser + 1); $x < $numTokens; $x++) { - if (is_array($tokens[$x]) === false - || isset(Tokens::$emptyTokens[$tokens[$x][0]]) === false - ) { - // Non-empty content. - if (is_array($tokens[$x]) === true && $tokens[$x][0] === T_USE) { - // Found a use statement, so search ahead for the closing parenthesis. - for ($x += 1; $x < $numTokens; $x++) { - if (is_array($tokens[$x]) === false && $tokens[$x] === ')') { - continue(2); - } - } - } - - break; - } - } - - if (isset($tokens[$x]) === true - && is_array($tokens[$x]) === false - && $tokens[$x] === ':' - ) { - // Find the start of the return type. - for ($x += 1; $x < $numTokens; $x++) { - if (is_array($tokens[$x]) === true - && isset(Tokens::$emptyTokens[$tokens[$x][0]]) === true - ) { - // Whitespace or comments before the return type. - continue; - } - - if (is_array($tokens[$x]) === false && $tokens[$x] === '?') { - // Found a nullable operator, so skip it. - // But also convert the token to save the tokenizer - // a bit of time later on. - $tokens[$x] = [ - T_NULLABLE, - '?', - ]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token $x changed from ? to T_NULLABLE".PHP_EOL; - } - - continue; - } - - break; - }//end for - }//end if - }//end if - }//end if - - /* - Before PHP 7, the <=> operator was tokenized as - T_IS_SMALLER_OR_EQUAL followed by T_GREATER_THAN. - So look for and combine these tokens in earlier versions. - */ - - if ($tokenIsArray === true - && $token[0] === T_IS_SMALLER_OR_EQUAL - && isset($tokens[($stackPtr + 1)]) === true - && $tokens[($stackPtr + 1)][0] === '>' - ) { - $newToken = []; - $newToken['code'] = T_SPACESHIP; - $newToken['type'] = 'T_SPACESHIP'; - $newToken['content'] = '<=>'; - $finalTokens[$newStackPtr] = $newToken; - - $newStackPtr++; - $stackPtr++; - continue; - } - - /* - PHP doesn't assign a token to goto labels, so we have to. - These are just string tokens with a single colon after them. Double - colons are already tokenized and so don't interfere with this check. - But we do have to account for CASE statements, that look just like - goto labels. - */ - - if ($tokenIsArray === true - && $token[0] === T_STRING - && isset($tokens[($stackPtr + 1)]) === true - && $tokens[($stackPtr + 1)] === ':' - && (is_array($tokens[($stackPtr - 1)]) === false - || $tokens[($stackPtr - 1)][0] !== T_PAAMAYIM_NEKUDOTAYIM) - ) { - $stopTokens = [ - T_CASE => true, - T_SEMICOLON => true, - T_OPEN_TAG => true, - T_OPEN_CURLY_BRACKET => true, - T_INLINE_THEN => true, - T_ENUM => true, - ]; - - for ($x = ($newStackPtr - 1); $x > 0; $x--) { - if (isset($stopTokens[$finalTokens[$x]['code']]) === true) { - break; - } - } - - if ($finalTokens[$x]['code'] !== T_CASE - && $finalTokens[$x]['code'] !== T_INLINE_THEN - && $finalTokens[$x]['code'] !== T_ENUM - ) { - $finalTokens[$newStackPtr] = [ - 'content' => $token[1].':', - 'code' => T_GOTO_LABEL, - 'type' => 'T_GOTO_LABEL', - ]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token $stackPtr changed from T_STRING to T_GOTO_LABEL".PHP_EOL; - echo "\t\t* skipping T_COLON token ".($stackPtr + 1).PHP_EOL; - } - - $newStackPtr++; - $stackPtr++; - continue; - } - }//end if - - /* - If this token has newlines in its content, split each line up - and create a new token for each line. We do this so it's easier - to ascertain where errors occur on a line. - Note that $token[1] is the token's content. - */ - - if ($tokenIsArray === true && strpos($token[1], $this->eolChar) !== false) { - $tokenLines = explode($this->eolChar, $token[1]); - $numLines = count($tokenLines); - $newToken = [ - 'type' => Tokens::tokenName($token[0]), - 'code' => $token[0], - 'content' => '', - ]; - - for ($i = 0; $i < $numLines; $i++) { - $newToken['content'] = $tokenLines[$i]; - if ($i === ($numLines - 1)) { - if ($tokenLines[$i] === '') { - break; - } - } else { - $newToken['content'] .= $this->eolChar; - } - - $finalTokens[$newStackPtr] = $newToken; - $newStackPtr++; - } - } else { - // Some T_STRING tokens should remain that way due to their context. - if ($tokenIsArray === true && $token[0] === T_STRING) { - $preserveTstring = false; - - // True/false/parent/self/static in typed constants should be fixed to their own token, - // but the constant name should not be. - if ((isset($this->tstringContexts[$finalTokens[$lastNotEmptyToken]['code']]) === true - && $finalTokens[$lastNotEmptyToken]['code'] === T_CONST) - || $insideConstDeclaration === true - ) { - // Find the next non-empty token. - for ($i = ($stackPtr + 1); $i < $numTokens; $i++) { - if (is_array($tokens[$i]) === true - && isset(Tokens::$emptyTokens[$tokens[$i][0]]) === true - ) { - continue; - } - - break; - } - - if ($tokens[$i] === '=') { - $preserveTstring = true; - $insideConstDeclaration = false; - } - } else if (isset($this->tstringContexts[$finalTokens[$lastNotEmptyToken]['code']]) === true - && $finalTokens[$lastNotEmptyToken]['code'] !== T_CONST - ) { - $preserveTstring = true; - $tokenContentLower = strtolower($token[1]); - - // Special case for syntax like: return new self/new parent - // where self/parent should not be a string. - if ($finalTokens[$lastNotEmptyToken]['code'] === T_NEW - && ($tokenContentLower === 'self' || $tokenContentLower === 'parent') - ) { - $preserveTstring = false; - } - - // Special case for fully qualified \true, \false and \null - // where true/false/null should not be a string. - // Note: if this is the _start_ of a longer namespaced name, this will undone again later. - if ($finalTokens[$lastNotEmptyToken]['code'] === T_NS_SEPARATOR - && ($tokenContentLower === 'true' || $tokenContentLower === 'false' || $tokenContentLower === 'null') - ) { - for ($i = ($lastNotEmptyToken - 1); $i >= 0; $i--) { - if (isset(Tokens::$emptyTokens[$finalTokens[$i]['code']]) === true) { - continue; - } - - if ($finalTokens[$i]['code'] !== T_STRING - && $finalTokens[$i]['code'] !== T_NAMESPACE - ) { - $preserveTstring = false; - } - - break; - } - } - } else if ($finalTokens[$lastNotEmptyToken]['content'] === '&') { - // Function names for functions declared to return by reference. - for ($i = ($lastNotEmptyToken - 1); $i >= 0; $i--) { - if (isset(Tokens::$emptyTokens[$finalTokens[$i]['code']]) === true) { - continue; - } - - if ($finalTokens[$i]['code'] === T_FUNCTION) { - $preserveTstring = true; - } - - break; - } - } else { - // Keywords with special PHPCS token when used as a function call. - for ($i = ($stackPtr + 1); $i < $numTokens; $i++) { - if (is_array($tokens[$i]) === true - && isset(Tokens::$emptyTokens[$tokens[$i][0]]) === true - ) { - continue; - } - - if ($tokens[$i][0] === '(') { - $preserveTstring = true; - } - - break; - } - }//end if - - if ($preserveTstring === true) { - $finalTokens[$newStackPtr] = [ - 'code' => T_STRING, - 'type' => 'T_STRING', - 'content' => $token[1], - ]; - - $newStackPtr++; - continue; - } - }//end if - - $newToken = null; - if ($tokenIsArray === false) { - if (isset(self::$resolveTokenCache[$token[0]]) === true) { - $newToken = self::$resolveTokenCache[$token[0]]; - } - } else { - $cacheKey = null; - if ($token[0] === T_STRING) { - $cacheKey = strtolower($token[1]); - } else if ($token[0] !== T_CURLY_OPEN) { - $cacheKey = $token[0]; - } - - if ($cacheKey !== null && isset(self::$resolveTokenCache[$cacheKey]) === true) { - $newToken = self::$resolveTokenCache[$cacheKey]; - $newToken['content'] = $token[1]; - } - } - - if ($newToken === null) { - $newToken = self::standardiseToken($token); - } - - // Convert colons that are actually the ELSE component of an - // inline IF statement. - if (empty($insideInlineIf) === false && $newToken['code'] === T_COLON) { - $isInlineIf = true; - - // Make sure this isn't a named parameter label. - // Get the previous non-empty token. - for ($i = ($stackPtr - 1); $i > 0; $i--) { - if (is_array($tokens[$i]) === false - || isset(Tokens::$emptyTokens[$tokens[$i][0]]) === false - ) { - break; - } - } - - if ($tokens[$i][0] === T_PARAM_NAME) { - $isInlineIf = false; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token is parameter label, not T_INLINE_ELSE".PHP_EOL; - } - } - - if ($isInlineIf === true) { - // Make sure this isn't a return type separator. - for ($i = ($stackPtr - 1); $i > 0; $i--) { - if (is_array($tokens[$i]) === false - || ($tokens[$i][0] !== T_DOC_COMMENT - && $tokens[$i][0] !== T_COMMENT - && $tokens[$i][0] !== T_WHITESPACE) - ) { - break; - } - } - - if ($tokens[$i] === ')') { - $parenCount = 1; - for ($i--; $i > 0; $i--) { - if ($tokens[$i] === '(') { - $parenCount--; - if ($parenCount === 0) { - break; - } - } else if ($tokens[$i] === ')') { - $parenCount++; - } - } - - // We've found the open parenthesis, so if the previous - // non-empty token is FUNCTION or USE, this is a return type. - // Note that we need to skip T_STRING tokens here as these - // can be function names. - for ($i--; $i > 0; $i--) { - if (is_array($tokens[$i]) === false - || ($tokens[$i][0] !== T_DOC_COMMENT - && $tokens[$i][0] !== T_COMMENT - && $tokens[$i][0] !== T_WHITESPACE - && $tokens[$i][0] !== T_STRING) - ) { - break; - } - } - - if ($tokens[$i][0] === T_FUNCTION || $tokens[$i][0] === T_FN || $tokens[$i][0] === T_USE) { - $isInlineIf = false; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token is return type, not T_INLINE_ELSE".PHP_EOL; - } - } - }//end if - }//end if - - // Check to see if this is a CASE or DEFAULT opener. - if ($isInlineIf === true) { - $inlineIfToken = $insideInlineIf[(count($insideInlineIf) - 1)]; - for ($i = $stackPtr; $i > $inlineIfToken; $i--) { - if (is_array($tokens[$i]) === true - && ($tokens[$i][0] === T_CASE - || $tokens[$i][0] === T_DEFAULT) - ) { - $isInlineIf = false; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token is T_CASE or T_DEFAULT opener, not T_INLINE_ELSE".PHP_EOL; - } - - break; - } - - if (is_array($tokens[$i]) === false - && ($tokens[$i] === ';' - || $tokens[$i] === '{' - || $tokens[$i] === '}') - ) { - break; - } - }//end for - }//end if - - if ($isInlineIf === true) { - array_pop($insideInlineIf); - $newToken['code'] = T_INLINE_ELSE; - $newToken['type'] = 'T_INLINE_ELSE'; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token changed from T_COLON to T_INLINE_ELSE".PHP_EOL; - } - } - }//end if - - // This is a special condition for T_ARRAY tokens used for anything else - // but array declarations, like type hinting function arguments as - // being arrays. - // We want to keep the parenthesis map clean, so let's tag these tokens as - // T_STRING. - if ($newToken['code'] === T_ARRAY) { - for ($i = ($stackPtr + 1); $i < $numTokens; $i++) { - if (is_array($tokens[$i]) === false - || isset(Tokens::$emptyTokens[$tokens[$i][0]]) === false - ) { - // Non-empty content. - break; - } - } - - if ($i !== $numTokens && $tokens[$i] !== '(') { - $newToken['code'] = T_STRING; - $newToken['type'] = 'T_STRING'; - } - } - - // This is a special case when checking PHP 5.5+ code in PHP < 5.5 - // where "finally" should be T_FINALLY instead of T_STRING. - if ($newToken['code'] === T_STRING - && strtolower($newToken['content']) === 'finally' - && $finalTokens[$lastNotEmptyToken]['code'] === T_CLOSE_CURLY_BRACKET - ) { - $newToken['code'] = T_FINALLY; - $newToken['type'] = 'T_FINALLY'; - } - - // This is a special case for PHP 5.6 use function and use const - // where "function" and "const" should be T_STRING instead of T_FUNCTION - // and T_CONST. - if (($newToken['code'] === T_FUNCTION - || $newToken['code'] === T_CONST) - && ($finalTokens[$lastNotEmptyToken]['code'] === T_USE || $insideUseGroup === true) - ) { - $newToken['code'] = T_STRING; - $newToken['type'] = 'T_STRING'; - } - - // This is a special case for use groups in PHP 7+ where leaving - // the curly braces as their normal tokens would confuse - // the scope map and sniffs. - if ($newToken['code'] === T_OPEN_CURLY_BRACKET - && $finalTokens[$lastNotEmptyToken]['code'] === T_NS_SEPARATOR - ) { - $newToken['code'] = T_OPEN_USE_GROUP; - $newToken['type'] = 'T_OPEN_USE_GROUP'; - $insideUseGroup = true; - } - - if ($insideUseGroup === true && $newToken['code'] === T_CLOSE_CURLY_BRACKET) { - $newToken['code'] = T_CLOSE_USE_GROUP; - $newToken['type'] = 'T_CLOSE_USE_GROUP'; - $insideUseGroup = false; - } - - $finalTokens[$newStackPtr] = $newToken; - $newStackPtr++; - }//end if - }//end for - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t*** END PHP TOKENIZING ***".PHP_EOL; - } - - return $finalTokens; - - }//end tokenize() - - - /** - * Performs additional processing after main tokenizing. - * - * This additional processing checks for CASE statements that are using curly - * braces for scope openers and closers. It also turns some T_FUNCTION tokens - * into T_CLOSURE when they are not standard function definitions. It also - * detects short array syntax and converts those square brackets into new tokens. - * It also corrects some usage of the static and class keywords. It also - * assigns tokens to function return types. - * - * @return void - */ - protected function processAdditional() - { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t*** START ADDITIONAL PHP PROCESSING ***".PHP_EOL; - } - - $this->createAttributesNestingMap(); - - $numTokens = count($this->tokens); - $lastSeenTypeToken = $numTokens; - - for ($i = ($numTokens - 1); $i >= 0; $i--) { - // Check for any unset scope conditions due to alternate IF/ENDIF syntax. - if (isset($this->tokens[$i]['scope_opener']) === true - && isset($this->tokens[$i]['scope_condition']) === false - ) { - $this->tokens[$i]['scope_condition'] = $this->tokens[$this->tokens[$i]['scope_opener']]['scope_condition']; - } - - if ($this->tokens[$i]['code'] === T_FUNCTION) { - /* - Detect functions that are actually closures and - assign them a different token. - */ - - if (isset($this->tokens[$i]['scope_opener']) === true) { - for ($x = ($i + 1); $x < $numTokens; $x++) { - if (isset(Tokens::$emptyTokens[$this->tokens[$x]['code']]) === false - && $this->tokens[$x]['code'] !== T_BITWISE_AND - ) { - break; - } - } - - if ($this->tokens[$x]['code'] === T_OPEN_PARENTHESIS) { - $this->tokens[$i]['code'] = T_CLOSURE; - $this->tokens[$i]['type'] = 'T_CLOSURE'; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $line = $this->tokens[$i]['line']; - echo "\t* token $i on line $line changed from T_FUNCTION to T_CLOSURE".PHP_EOL; - } - - for ($x = ($this->tokens[$i]['scope_opener'] + 1); $x < $this->tokens[$i]['scope_closer']; $x++) { - if (isset($this->tokens[$x]['conditions'][$i]) === false) { - continue; - } - - $this->tokens[$x]['conditions'][$i] = T_CLOSURE; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$x]['type']; - echo "\t\t* cleaned $x ($type) *".PHP_EOL; - } - } - } - }//end if - - continue; - } else if ($this->tokens[$i]['code'] === T_CLASS && isset($this->tokens[$i]['scope_opener']) === true) { - /* - Detect anonymous classes and assign them a different token. - */ - - for ($x = ($i + 1); $x < $numTokens; $x++) { - if (isset(Tokens::$emptyTokens[$this->tokens[$x]['code']]) === false) { - break; - } - } - - if ($this->tokens[$x]['code'] === T_OPEN_PARENTHESIS - || $this->tokens[$x]['code'] === T_OPEN_CURLY_BRACKET - || $this->tokens[$x]['code'] === T_EXTENDS - || $this->tokens[$x]['code'] === T_IMPLEMENTS - ) { - $this->tokens[$i]['code'] = T_ANON_CLASS; - $this->tokens[$i]['type'] = 'T_ANON_CLASS'; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $line = $this->tokens[$i]['line']; - echo "\t* token $i on line $line changed from T_CLASS to T_ANON_CLASS".PHP_EOL; - } - - if ($this->tokens[$x]['code'] === T_OPEN_PARENTHESIS - && isset($this->tokens[$x]['parenthesis_closer']) === true - ) { - $closer = $this->tokens[$x]['parenthesis_closer']; - - $this->tokens[$i]['parenthesis_opener'] = $x; - $this->tokens[$i]['parenthesis_closer'] = $closer; - $this->tokens[$i]['parenthesis_owner'] = $i; - $this->tokens[$x]['parenthesis_owner'] = $i; - $this->tokens[$closer]['parenthesis_owner'] = $i; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $line = $this->tokens[$i]['line']; - echo "\t\t* added parenthesis keys to T_ANON_CLASS token $i on line $line".PHP_EOL; - } - } - - for ($x = ($this->tokens[$i]['scope_opener'] + 1); $x < $this->tokens[$i]['scope_closer']; $x++) { - if (isset($this->tokens[$x]['conditions'][$i]) === false) { - continue; - } - - $this->tokens[$x]['conditions'][$i] = T_ANON_CLASS; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$x]['type']; - echo "\t\t* cleaned $x ($type) *".PHP_EOL; - } - } - }//end if - - continue; - } else if ($this->tokens[$i]['code'] === T_FN && isset($this->tokens[($i + 1)]) === true) { - // Possible arrow function. - for ($x = ($i + 1); $x < $numTokens; $x++) { - if (isset(Tokens::$emptyTokens[$this->tokens[$x]['code']]) === false - && $this->tokens[$x]['code'] !== T_BITWISE_AND - ) { - // Non-whitespace content. - break; - } - } - - if (isset($this->tokens[$x]) === true - && $this->tokens[$x]['code'] === T_OPEN_PARENTHESIS - && isset($this->tokens[$x]['parenthesis_closer']) === true - ) { - $ignore = Tokens::$emptyTokens; - $ignore += [ - T_ARRAY => T_ARRAY, - T_CALLABLE => T_CALLABLE, - T_COLON => T_COLON, - T_NAMESPACE => T_NAMESPACE, - T_NS_SEPARATOR => T_NS_SEPARATOR, - T_NULL => T_NULL, - T_TRUE => T_TRUE, - T_FALSE => T_FALSE, - T_NULLABLE => T_NULLABLE, - T_PARENT => T_PARENT, - T_SELF => T_SELF, - T_STATIC => T_STATIC, - T_STRING => T_STRING, - T_TYPE_UNION => T_TYPE_UNION, - T_TYPE_INTERSECTION => T_TYPE_INTERSECTION, - T_TYPE_OPEN_PARENTHESIS => T_TYPE_OPEN_PARENTHESIS, - T_TYPE_CLOSE_PARENTHESIS => T_TYPE_CLOSE_PARENTHESIS, - ]; - - $closer = $this->tokens[$x]['parenthesis_closer']; - for ($arrow = ($closer + 1); $arrow < $numTokens; $arrow++) { - if (isset($ignore[$this->tokens[$arrow]['code']]) === false) { - break; - } - } - - if ($this->tokens[$arrow]['code'] === T_DOUBLE_ARROW) { - $endTokens = [ - T_COLON => true, - T_COMMA => true, - T_SEMICOLON => true, - T_CLOSE_PARENTHESIS => true, - T_CLOSE_SQUARE_BRACKET => true, - T_CLOSE_CURLY_BRACKET => true, - T_CLOSE_SHORT_ARRAY => true, - T_OPEN_TAG => true, - T_CLOSE_TAG => true, - ]; - - $inTernary = false; - $lastEndToken = null; - - for ($scopeCloser = ($arrow + 1); $scopeCloser < $numTokens; $scopeCloser++) { - // Arrow function closer should never be shared with the closer of a match - // control structure. - if (isset($this->tokens[$scopeCloser]['scope_closer'], $this->tokens[$scopeCloser]['scope_condition']) === true - && $scopeCloser === $this->tokens[$scopeCloser]['scope_closer'] - && $this->tokens[$this->tokens[$scopeCloser]['scope_condition']]['code'] === T_MATCH - ) { - if ($arrow < $this->tokens[$scopeCloser]['scope_condition']) { - // Match in return value of arrow function. Move on to the next token. - continue; - } - - // Arrow function as return value for the last match case without trailing comma. - if ($lastEndToken !== null) { - $scopeCloser = $lastEndToken; - break; - } - - for ($lastNonEmpty = ($scopeCloser - 1); $lastNonEmpty > $arrow; $lastNonEmpty--) { - if (isset(Tokens::$emptyTokens[$this->tokens[$lastNonEmpty]['code']]) === false) { - $scopeCloser = $lastNonEmpty; - break 2; - } - } - } - - if (isset($endTokens[$this->tokens[$scopeCloser]['code']]) === true) { - if ($lastEndToken !== null - && ((isset($this->tokens[$scopeCloser]['parenthesis_opener']) === true - && $this->tokens[$scopeCloser]['parenthesis_opener'] < $arrow) - || (isset($this->tokens[$scopeCloser]['bracket_opener']) === true - && $this->tokens[$scopeCloser]['bracket_opener'] < $arrow)) - ) { - for ($lastNonEmpty = ($scopeCloser - 1); $lastNonEmpty > $arrow; $lastNonEmpty--) { - if (isset(Tokens::$emptyTokens[$this->tokens[$lastNonEmpty]['code']]) === false) { - $scopeCloser = $lastNonEmpty; - break; - } - } - } - - break; - } - - if ($inTernary === false - && isset($this->tokens[$scopeCloser]['scope_closer'], $this->tokens[$scopeCloser]['scope_condition']) === true - && $scopeCloser === $this->tokens[$scopeCloser]['scope_closer'] - && $this->tokens[$this->tokens[$scopeCloser]['scope_condition']]['code'] === T_FN - ) { - // Found a nested arrow function that already has the closer set and is in - // the same scope as us, so we can use its closer. - break; - } - - if (isset($this->tokens[$scopeCloser]['scope_closer']) === true - && $this->tokens[$scopeCloser]['code'] !== T_INLINE_ELSE - && $this->tokens[$scopeCloser]['code'] !== T_END_HEREDOC - && $this->tokens[$scopeCloser]['code'] !== T_END_NOWDOC - ) { - // We minus 1 here in case the closer can be shared with us. - $scopeCloser = ($this->tokens[$scopeCloser]['scope_closer'] - 1); - continue; - } - - if (isset($this->tokens[$scopeCloser]['parenthesis_closer']) === true) { - $scopeCloser = $this->tokens[$scopeCloser]['parenthesis_closer']; - $lastEndToken = $scopeCloser; - continue; - } - - if (isset($this->tokens[$scopeCloser]['bracket_closer']) === true) { - $scopeCloser = $this->tokens[$scopeCloser]['bracket_closer']; - $lastEndToken = $scopeCloser; - continue; - } - - if ($this->tokens[$scopeCloser]['code'] === T_INLINE_THEN) { - $inTernary = true; - continue; - } - - if ($this->tokens[$scopeCloser]['code'] === T_INLINE_ELSE) { - if ($inTernary === false) { - break; - } - - $inTernary = false; - continue; - } - }//end for - - if ($scopeCloser !== $numTokens) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $line = $this->tokens[$i]['line']; - echo "\t=> token $i on line $line processed as arrow function".PHP_EOL; - echo "\t\t* scope opener set to $arrow *".PHP_EOL; - echo "\t\t* scope closer set to $scopeCloser *".PHP_EOL; - echo "\t\t* parenthesis opener set to $x *".PHP_EOL; - echo "\t\t* parenthesis closer set to $closer *".PHP_EOL; - } - - $this->tokens[$i]['code'] = T_FN; - $this->tokens[$i]['type'] = 'T_FN'; - $this->tokens[$i]['scope_condition'] = $i; - $this->tokens[$i]['scope_opener'] = $arrow; - $this->tokens[$i]['scope_closer'] = $scopeCloser; - $this->tokens[$i]['parenthesis_owner'] = $i; - $this->tokens[$i]['parenthesis_opener'] = $x; - $this->tokens[$i]['parenthesis_closer'] = $closer; - - $this->tokens[$arrow]['code'] = T_FN_ARROW; - $this->tokens[$arrow]['type'] = 'T_FN_ARROW'; - - $this->tokens[$arrow]['scope_condition'] = $i; - $this->tokens[$arrow]['scope_opener'] = $arrow; - $this->tokens[$arrow]['scope_closer'] = $scopeCloser; - $this->tokens[$scopeCloser]['scope_condition'] = $i; - $this->tokens[$scopeCloser]['scope_opener'] = $arrow; - $this->tokens[$scopeCloser]['scope_closer'] = $scopeCloser; - - $opener = $this->tokens[$i]['parenthesis_opener']; - $closer = $this->tokens[$i]['parenthesis_closer']; - $this->tokens[$opener]['parenthesis_owner'] = $i; - $this->tokens[$closer]['parenthesis_owner'] = $i; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $line = $this->tokens[$arrow]['line']; - echo "\t\t* token $arrow on line $line changed from T_DOUBLE_ARROW to T_FN_ARROW".PHP_EOL; - } - }//end if - }//end if - }//end if - - // If after all that, the extra tokens are not set, this is not a (valid) arrow function. - if (isset($this->tokens[$i]['scope_closer']) === false) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $line = $this->tokens[$i]['line']; - echo "\t=> token $i on line $line is not an arrow function".PHP_EOL; - echo "\t\t* token changed from T_FN to T_STRING".PHP_EOL; - } - - $this->tokens[$i]['code'] = T_STRING; - $this->tokens[$i]['type'] = 'T_STRING'; - } - } else if ($this->tokens[$i]['code'] === T_OPEN_SQUARE_BRACKET) { - if (isset($this->tokens[$i]['bracket_closer']) === false) { - continue; - } - - // Unless there is a variable or a bracket before this token, - // it is the start of an array being defined using the short syntax. - $isShortArray = false; - $allowed = [ - T_CLOSE_SQUARE_BRACKET => T_CLOSE_SQUARE_BRACKET, - T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET, - T_CLOSE_PARENTHESIS => T_CLOSE_PARENTHESIS, - T_VARIABLE => T_VARIABLE, - T_OBJECT_OPERATOR => T_OBJECT_OPERATOR, - T_NULLSAFE_OBJECT_OPERATOR => T_NULLSAFE_OBJECT_OPERATOR, - T_STRING => T_STRING, - T_CONSTANT_ENCAPSED_STRING => T_CONSTANT_ENCAPSED_STRING, - T_DOUBLE_QUOTED_STRING => T_DOUBLE_QUOTED_STRING, - ]; - $allowed += Tokens::$magicConstants; - - for ($x = ($i - 1); $x >= 0; $x--) { - // Allow for PHP 8.4 anon class dereferencing without wrapping parentheses. - // Note: the T_CLASS token has not yet been retokenized to T_ANON_CLASS! - if ($this->tokens[$x]['code'] === T_CLOSE_CURLY_BRACKET - && isset($this->tokens[$x]['scope_condition']) === true - && $this->tokens[$this->tokens[$x]['scope_condition']]['code'] === T_CLASS - ) { - // Now, make sure it is an anonymous class and not a normal class. - for ($y = ($this->tokens[$x]['scope_condition'] + 1); $y < $numTokens; $y++) { - if (isset(Tokens::$emptyTokens[$this->tokens[$y]['code']]) === false) { - break; - } - } - - // Use the same check as used for the anon class retokenization. - if ($this->tokens[$y]['code'] === T_OPEN_PARENTHESIS - || $this->tokens[$y]['code'] === T_OPEN_CURLY_BRACKET - || $this->tokens[$y]['code'] === T_EXTENDS - || $this->tokens[$y]['code'] === T_IMPLEMENTS - ) { - break; - } - } - - // If we hit a scope opener, the statement has ended - // without finding anything, so it's probably an array - // using PHP 7.1 short list syntax. - if (isset($this->tokens[$x]['scope_opener']) === true) { - $isShortArray = true; - break; - } - - if (isset(Tokens::$emptyTokens[$this->tokens[$x]['code']]) === false) { - // Allow for control structures without braces. - if (($this->tokens[$x]['code'] === T_CLOSE_PARENTHESIS - && isset($this->tokens[$x]['parenthesis_owner']) === true - && isset(Tokens::$scopeOpeners[$this->tokens[$this->tokens[$x]['parenthesis_owner']]['code']]) === true) - || isset($allowed[$this->tokens[$x]['code']]) === false - ) { - $isShortArray = true; - } - - break; - } - }//end for - - if ($isShortArray === true) { - $this->tokens[$i]['code'] = T_OPEN_SHORT_ARRAY; - $this->tokens[$i]['type'] = 'T_OPEN_SHORT_ARRAY'; - - $closer = $this->tokens[$i]['bracket_closer']; - $this->tokens[$closer]['code'] = T_CLOSE_SHORT_ARRAY; - $this->tokens[$closer]['type'] = 'T_CLOSE_SHORT_ARRAY'; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $line = $this->tokens[$i]['line']; - echo "\t* token $i on line $line changed from T_OPEN_SQUARE_BRACKET to T_OPEN_SHORT_ARRAY".PHP_EOL; - $line = $this->tokens[$closer]['line']; - echo "\t* token $closer on line $line changed from T_CLOSE_SQUARE_BRACKET to T_CLOSE_SHORT_ARRAY".PHP_EOL; - } - } - - continue; - } else if ($this->tokens[$i]['code'] === T_MATCH) { - if (isset($this->tokens[$i]['scope_opener'], $this->tokens[$i]['scope_closer']) === false) { - // Not a match expression after all. - $this->tokens[$i]['code'] = T_STRING; - $this->tokens[$i]['type'] = 'T_STRING'; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token $i changed from T_MATCH to T_STRING".PHP_EOL; - } - - if (isset($this->tokens[$i]['parenthesis_opener'], $this->tokens[$i]['parenthesis_closer']) === true) { - $opener = $this->tokens[$i]['parenthesis_opener']; - $closer = $this->tokens[$i]['parenthesis_closer']; - unset( - $this->tokens[$opener]['parenthesis_owner'], - $this->tokens[$closer]['parenthesis_owner'] - ); - unset( - $this->tokens[$i]['parenthesis_opener'], - $this->tokens[$i]['parenthesis_closer'], - $this->tokens[$i]['parenthesis_owner'] - ); - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* cleaned parenthesis of token $i *".PHP_EOL; - } - } - } else { - // Retokenize the double arrows for match expression cases to `T_MATCH_ARROW`. - $searchFor = [ - T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET, - T_OPEN_SQUARE_BRACKET => T_OPEN_SQUARE_BRACKET, - T_OPEN_PARENTHESIS => T_OPEN_PARENTHESIS, - T_OPEN_SHORT_ARRAY => T_OPEN_SHORT_ARRAY, - T_DOUBLE_ARROW => T_DOUBLE_ARROW, - ]; - $searchFor += Tokens::$scopeOpeners; - - for ($x = ($this->tokens[$i]['scope_opener'] + 1); $x < $this->tokens[$i]['scope_closer']; $x++) { - if (isset($searchFor[$this->tokens[$x]['code']]) === false) { - continue; - } - - if (isset($this->tokens[$x]['scope_closer']) === true) { - $x = $this->tokens[$x]['scope_closer']; - continue; - } - - if (isset($this->tokens[$x]['parenthesis_closer']) === true) { - $x = $this->tokens[$x]['parenthesis_closer']; - continue; - } - - if (isset($this->tokens[$x]['bracket_closer']) === true) { - $x = $this->tokens[$x]['bracket_closer']; - continue; - } - - // This must be a double arrow, but make sure anyhow. - if ($this->tokens[$x]['code'] === T_DOUBLE_ARROW) { - $this->tokens[$x]['code'] = T_MATCH_ARROW; - $this->tokens[$x]['type'] = 'T_MATCH_ARROW'; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t* token $x changed from T_DOUBLE_ARROW to T_MATCH_ARROW".PHP_EOL; - } - } - }//end for - }//end if - - continue; - } else if ($this->tokens[$i]['code'] === T_BITWISE_OR - || $this->tokens[$i]['code'] === T_BITWISE_AND - || $this->tokens[$i]['code'] === T_CLOSE_PARENTHESIS - ) { - if ($lastSeenTypeToken < $i) { - // We've already examined this code to check if it is a type declaration and concluded it wasn't. - // No need to do it again. - continue; - } - - /* - Convert "|" to T_TYPE_UNION or leave as T_BITWISE_OR. - Convert "&" to T_TYPE_INTERSECTION or leave as T_BITWISE_AND. - Convert "(" and ")" to T_TYPE_(OPEN|CLOSE)_PARENTHESIS or leave as T_(OPEN|CLOSE)_PARENTHESIS. - - All type related tokens will be converted in one go as soon as this section is hit. - */ - - $allowed = [ - T_STRING => T_STRING, - T_CALLABLE => T_CALLABLE, - T_SELF => T_SELF, - T_PARENT => T_PARENT, - T_STATIC => T_STATIC, - T_FALSE => T_FALSE, - T_TRUE => T_TRUE, - T_NULL => T_NULL, - T_NAMESPACE => T_NAMESPACE, - T_NS_SEPARATOR => T_NS_SEPARATOR, - ]; - - $suspectedType = null; - $typeTokenCountAfter = 0; - - for ($x = ($i + 1); $x < $numTokens; $x++) { - if (isset(Tokens::$emptyTokens[$this->tokens[$x]['code']]) === true) { - continue; - } - - if (isset($allowed[$this->tokens[$x]['code']]) === true) { - ++$typeTokenCountAfter; - continue; - } - - if (($typeTokenCountAfter > 0 - || ($this->tokens[$i]['code'] === T_CLOSE_PARENTHESIS - && isset($this->tokens[$i]['parenthesis_owner']) === false)) - && ($this->tokens[$x]['code'] === T_BITWISE_AND - || $this->tokens[$x]['code'] === T_ELLIPSIS) - ) { - // Skip past reference and variadic indicators for parameter types. - continue; - } - - if ($this->tokens[$x]['code'] === T_VARIABLE) { - // Parameter/Property defaults can not contain variables, so this could be a type. - $suspectedType = 'property or parameter'; - break; - } - - if ($this->tokens[$x]['code'] === T_DOUBLE_ARROW) { - // Possible arrow function. - $suspectedType = 'return'; - break; - } - - if ($this->tokens[$x]['code'] === T_SEMICOLON) { - // Possible abstract method or interface method. - $suspectedType = 'return'; - break; - } - - if ($this->tokens[$x]['code'] === T_OPEN_CURLY_BRACKET - && isset($this->tokens[$x]['scope_condition']) === true - && $this->tokens[$this->tokens[$x]['scope_condition']]['code'] === T_FUNCTION - ) { - $suspectedType = 'return'; - break; - } - - if ($this->tokens[$x]['code'] === T_EQUAL) { - // Possible constant declaration, the `T_STRING` name will have been skipped over already. - $suspectedType = 'constant'; - break; - } - - break; - }//end for - - if (($typeTokenCountAfter === 0 - && ($this->tokens[$i]['code'] !== T_CLOSE_PARENTHESIS - || isset($this->tokens[$i]['parenthesis_owner']) === true)) - || isset($suspectedType) === false - ) { - // Definitely not a union, intersection or DNF type, move on. - continue; - } - - if ($suspectedType === 'property or parameter') { - unset($allowed[T_STATIC]); - } - - $typeTokenCountBefore = 0; - $typeOperators = [$i]; - $parenthesesCount = 0; - $confirmed = false; - $maybeNullable = null; - - if ($this->tokens[$i]['code'] === T_OPEN_PARENTHESIS || $this->tokens[$i]['code'] === T_CLOSE_PARENTHESIS) { - ++$parenthesesCount; - } - - for ($x = ($i - 1); $x >= 0; $x--) { - if (isset(Tokens::$emptyTokens[$this->tokens[$x]['code']]) === true) { - continue; - } - - if ($suspectedType === 'property or parameter' - && $this->tokens[$x]['code'] === T_STRING - && strtolower($this->tokens[$x]['content']) === 'static' - ) { - // Static keyword followed directly by an open parenthesis for a DNF type. - // This token should be T_STATIC and was incorrectly identified as a function call before. - $this->tokens[$x]['code'] = T_STATIC; - $this->tokens[$x]['type'] = 'T_STATIC'; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $line = $this->tokens[$x]['line']; - echo "\t* token $x on line $line changed back from T_STRING to T_STATIC".PHP_EOL; - } - } - - if ($suspectedType === 'property or parameter' - && $this->tokens[$x]['code'] === T_OPEN_PARENTHESIS - ) { - // We need to prevent the open parenthesis for a function/fn declaration from being retokenized - // to T_TYPE_OPEN_PARENTHESIS if this is the first parameter in the declaration. - if (isset($this->tokens[$x]['parenthesis_owner']) === true - && $this->tokens[$this->tokens[$x]['parenthesis_owner']]['code'] === T_FUNCTION - ) { - $confirmed = true; - break; - } else { - // This may still be an arrow function which hasn't been handled yet. - for ($y = ($x - 1); $y > 0; $y--) { - if (isset(Tokens::$emptyTokens[$this->tokens[$y]['code']]) === false - && $this->tokens[$y]['code'] !== T_BITWISE_AND - ) { - // Non-whitespace content. - break; - } - } - - if ($this->tokens[$y]['code'] === T_FN) { - $confirmed = true; - break; - } - } - }//end if - - if (isset($allowed[$this->tokens[$x]['code']]) === true) { - ++$typeTokenCountBefore; - continue; - } - - // Union, intersection and DNF types can't use the nullable operator, but be tolerant to parse errors. - if (($typeTokenCountBefore > 0 - || ($this->tokens[$x]['code'] === T_OPEN_PARENTHESIS && isset($this->tokens[$x]['parenthesis_owner']) === false)) - && ($this->tokens[$x]['code'] === T_NULLABLE - || $this->tokens[$x]['code'] === T_INLINE_THEN) - ) { - if ($this->tokens[$x]['code'] === T_INLINE_THEN) { - $maybeNullable = $x; - } - - continue; - } - - if ($this->tokens[$x]['code'] === T_BITWISE_OR || $this->tokens[$x]['code'] === T_BITWISE_AND) { - $typeOperators[] = $x; - continue; - } - - if ($this->tokens[$x]['code'] === T_OPEN_PARENTHESIS || $this->tokens[$x]['code'] === T_CLOSE_PARENTHESIS) { - ++$parenthesesCount; - $typeOperators[] = $x; - continue; - } - - if ($suspectedType === 'return' && $this->tokens[$x]['code'] === T_COLON) { - // Make sure this is the colon for a return type. - for ($y = ($x - 1); $y > 0; $y--) { - if (isset(Tokens::$emptyTokens[$this->tokens[$y]['code']]) === false) { - break; - } - } - - if ($this->tokens[$y]['code'] !== T_CLOSE_PARENTHESIS) { - // Definitely not a union, intersection or DNF return type, move on. - continue 2; - } - - if (isset($this->tokens[$y]['parenthesis_owner']) === true) { - if ($this->tokens[$this->tokens[$y]['parenthesis_owner']]['code'] === T_FUNCTION - || $this->tokens[$this->tokens[$y]['parenthesis_owner']]['code'] === T_CLOSURE - || $this->tokens[$this->tokens[$y]['parenthesis_owner']]['code'] === T_FN - ) { - $confirmed = true; - } - - break; - } - - // Arrow functions may not have the parenthesis_owner set correctly yet. - // Closure use tokens won't be parentheses owners until PHPCS 4.0. - if (isset($this->tokens[$y]['parenthesis_opener']) === true) { - for ($z = ($this->tokens[$y]['parenthesis_opener'] - 1); $z > 0; $z--) { - if (isset(Tokens::$emptyTokens[$this->tokens[$z]['code']]) === false) { - break; - } - } - - if ($this->tokens[$z]['code'] === T_FN || $this->tokens[$z]['code'] === T_USE) { - $confirmed = true; - } - } - - break; - }//end if - - if ($suspectedType === 'constant' && $this->tokens[$x]['code'] === T_CONST) { - $confirmed = true; - break; - } - - if ($suspectedType === 'property or parameter' - && (isset(Tokens::$scopeModifiers[$this->tokens[$x]['code']]) === true - || $this->tokens[$x]['code'] === T_VAR - || $this->tokens[$x]['code'] === T_STATIC - || $this->tokens[$x]['code'] === T_READONLY - || $this->tokens[$x]['code'] === T_FINAL - || $this->tokens[$x]['code'] === T_ABSTRACT) - ) { - // This will also confirm constructor property promotion parameters, but that's fine. - $confirmed = true; - } - - break; - }//end for - - // Remember the last token we examined as part of the (non-)"type declaration". - $lastSeenTypeToken = $x; - - if ($confirmed === false - && $suspectedType === 'property or parameter' - && isset($this->tokens[$i]['nested_parenthesis']) === true - ) { - $parens = $this->tokens[$i]['nested_parenthesis']; - $last = end($parens); - - if (isset($this->tokens[$last]['parenthesis_owner']) === true - && $this->tokens[$this->tokens[$last]['parenthesis_owner']]['code'] === T_FUNCTION - ) { - $confirmed = true; - } else { - // No parenthesis owner set, this may be an arrow function which has not yet - // had additional processing done. - if (isset($this->tokens[$last]['parenthesis_opener']) === true) { - for ($x = ($this->tokens[$last]['parenthesis_opener'] - 1); $x >= 0; $x--) { - if (isset(Tokens::$emptyTokens[$this->tokens[$x]['code']]) === true) { - continue; - } - - break; - } - - if ($this->tokens[$x]['code'] === T_FN) { - for (--$x; $x >= 0; $x--) { - if (isset(Tokens::$emptyTokens[$this->tokens[$x]['code']]) === true - || $this->tokens[$x]['code'] === T_BITWISE_AND - ) { - continue; - } - - break; - } - - if ($this->tokens[$x]['code'] !== T_FUNCTION) { - $confirmed = true; - } - } - }//end if - }//end if - - unset($parens, $last); - }//end if - - if ($confirmed === false || ($parenthesesCount % 2) !== 0) { - // Not a (valid) union, intersection or DNF type after all, move on. - continue; - } - - foreach ($typeOperators as $x) { - if ($this->tokens[$x]['code'] === T_BITWISE_OR) { - $this->tokens[$x]['code'] = T_TYPE_UNION; - $this->tokens[$x]['type'] = 'T_TYPE_UNION'; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $line = $this->tokens[$x]['line']; - echo "\t* token $x on line $line changed from T_BITWISE_OR to T_TYPE_UNION".PHP_EOL; - } - } else if ($this->tokens[$x]['code'] === T_BITWISE_AND) { - $this->tokens[$x]['code'] = T_TYPE_INTERSECTION; - $this->tokens[$x]['type'] = 'T_TYPE_INTERSECTION'; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $line = $this->tokens[$x]['line']; - echo "\t* token $x on line $line changed from T_BITWISE_AND to T_TYPE_INTERSECTION".PHP_EOL; - } - } else if ($this->tokens[$x]['code'] === T_OPEN_PARENTHESIS) { - $this->tokens[$x]['code'] = T_TYPE_OPEN_PARENTHESIS; - $this->tokens[$x]['type'] = 'T_TYPE_OPEN_PARENTHESIS'; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $line = $this->tokens[$x]['line']; - echo "\t* token $x on line $line changed from T_OPEN_PARENTHESIS to T_TYPE_OPEN_PARENTHESIS".PHP_EOL; - } - } else if ($this->tokens[$x]['code'] === T_CLOSE_PARENTHESIS) { - $this->tokens[$x]['code'] = T_TYPE_CLOSE_PARENTHESIS; - $this->tokens[$x]['type'] = 'T_TYPE_CLOSE_PARENTHESIS'; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $line = $this->tokens[$x]['line']; - echo "\t* token $x on line $line changed from T_CLOSE_PARENTHESIS to T_TYPE_CLOSE_PARENTHESIS".PHP_EOL; - } - }//end if - }//end foreach - - if (isset($maybeNullable) === true) { - $this->tokens[$maybeNullable]['code'] = T_NULLABLE; - $this->tokens[$maybeNullable]['type'] = 'T_NULLABLE'; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $line = $this->tokens[$maybeNullable]['line']; - echo "\t* token $maybeNullable on line $line changed from T_INLINE_THEN to T_NULLABLE".PHP_EOL; - } - } - - continue; - } else if ($this->tokens[$i]['code'] === T_STATIC) { - for ($x = ($i - 1); $x > 0; $x--) { - if (isset(Tokens::$emptyTokens[$this->tokens[$x]['code']]) === false) { - break; - } - } - - if ($this->tokens[$x]['code'] === T_INSTANCEOF) { - $this->tokens[$i]['code'] = T_STRING; - $this->tokens[$i]['type'] = 'T_STRING'; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $line = $this->tokens[$i]['line']; - echo "\t* token $i on line $line changed from T_STATIC to T_STRING".PHP_EOL; - } - } - - continue; - } else if ($this->tokens[$i]['code'] === T_TRUE - || $this->tokens[$i]['code'] === T_FALSE - || $this->tokens[$i]['code'] === T_NULL - || $this->tokens[$i]['code'] === T_EXIT - ) { - for ($x = ($i + 1); $x < $numTokens; $x++) { - if (isset(Tokens::$emptyTokens[$this->tokens[$x]['code']]) === false) { - // Non-whitespace content. - break; - } - } - - if ($x !== $numTokens - && isset($this->tstringContexts[$this->tokens[$x]['code']]) === true - ) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $line = $this->tokens[$i]['line']; - $type = $this->tokens[$i]['type']; - echo "\t* token $i on line $line changed from $type to T_STRING".PHP_EOL; - } - - $this->tokens[$i]['code'] = T_STRING; - $this->tokens[$i]['type'] = 'T_STRING'; - } - }//end if - - if (($this->tokens[$i]['code'] !== T_CASE - && $this->tokens[$i]['code'] !== T_DEFAULT) - || isset($this->tokens[$i]['scope_opener']) === false - ) { - // Only interested in CASE and DEFAULT statements from here on in. - continue; - } - - $scopeOpener = $this->tokens[$i]['scope_opener']; - $scopeCloser = $this->tokens[$i]['scope_closer']; - - // If the first char after the opener is a curly brace - // and that brace has been ignored, it is actually - // opening this case statement and the opener and closer are - // probably set incorrectly. - for ($x = ($scopeOpener + 1); $x < $numTokens; $x++) { - if (isset(Tokens::$emptyTokens[$this->tokens[$x]['code']]) === false) { - // Non-whitespace content. - break; - } - } - - if ($this->tokens[$x]['code'] === T_CASE || $this->tokens[$x]['code'] === T_DEFAULT) { - // Special case for multiple CASE statements that share the same - // closer. Because we are going backwards through the file, this next - // CASE statement is already fixed, so just use its closer and don't - // worry about fixing anything. - $newCloser = $this->tokens[$x]['scope_closer']; - $this->tokens[$i]['scope_closer'] = $newCloser; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $oldType = $this->tokens[$scopeCloser]['type']; - $newType = $this->tokens[$newCloser]['type']; - $line = $this->tokens[$i]['line']; - echo "\t* token $i (T_CASE) on line $line closer changed from $scopeCloser ($oldType) to $newCloser ($newType)".PHP_EOL; - } - - continue; - } - - if ($this->tokens[$x]['code'] !== T_OPEN_CURLY_BRACKET - || isset($this->tokens[$x]['scope_condition']) === true - ) { - // Not a CASE/DEFAULT with a curly brace opener. - continue; - } - - // The closer for this CASE/DEFAULT should be the closing curly brace and - // not whatever it already is. The opener needs to be the opening curly - // brace so everything matches up. - $newCloser = $this->tokens[$x]['bracket_closer']; - foreach ([$i, $x, $newCloser] as $index) { - $this->tokens[$index]['scope_condition'] = $i; - $this->tokens[$index]['scope_opener'] = $x; - $this->tokens[$index]['scope_closer'] = $newCloser; - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $line = $this->tokens[$i]['line']; - $tokenType = $this->tokens[$i]['type']; - - $oldType = $this->tokens[$scopeOpener]['type']; - $newType = $this->tokens[$x]['type']; - echo "\t* token $i ($tokenType) on line $line opener changed from $scopeOpener ($oldType) to $x ($newType)".PHP_EOL; - - $oldType = $this->tokens[$scopeCloser]['type']; - $newType = $this->tokens[$newCloser]['type']; - echo "\t* token $i ($tokenType) on line $line closer changed from $scopeCloser ($oldType) to $newCloser ($newType)".PHP_EOL; - } - - if ($this->tokens[$scopeOpener]['scope_condition'] === $i) { - unset($this->tokens[$scopeOpener]['scope_condition']); - unset($this->tokens[$scopeOpener]['scope_opener']); - unset($this->tokens[$scopeOpener]['scope_closer']); - } - - if ($this->tokens[$scopeCloser]['scope_condition'] === $i) { - unset($this->tokens[$scopeCloser]['scope_condition']); - unset($this->tokens[$scopeCloser]['scope_opener']); - unset($this->tokens[$scopeCloser]['scope_closer']); - } else { - // We were using a shared closer. All tokens that were - // sharing this closer with us, except for the scope condition - // and it's opener, need to now point to the new closer. - $condition = $this->tokens[$scopeCloser]['scope_condition']; - $start = ($this->tokens[$condition]['scope_opener'] + 1); - for ($y = $start; $y < $scopeCloser; $y++) { - if (isset($this->tokens[$y]['scope_closer']) === true - && $this->tokens[$y]['scope_closer'] === $scopeCloser - ) { - $this->tokens[$y]['scope_closer'] = $newCloser; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $line = $this->tokens[$y]['line']; - $tokenType = $this->tokens[$y]['type']; - $oldType = $this->tokens[$scopeCloser]['type']; - $newType = $this->tokens[$newCloser]['type']; - echo "\t\t* token $y ($tokenType) on line $line closer changed from $scopeCloser ($oldType) to $newCloser ($newType)".PHP_EOL; - } - } - } - }//end if - - unset($this->tokens[$x]['bracket_opener']); - unset($this->tokens[$x]['bracket_closer']); - unset($this->tokens[$newCloser]['bracket_opener']); - unset($this->tokens[$newCloser]['bracket_closer']); - $this->tokens[$scopeCloser]['conditions'][] = $i; - - // Now fix up all the tokens that think they are - // inside the CASE/DEFAULT statement when they are really outside. - for ($x = $newCloser; $x < $scopeCloser; $x++) { - foreach ($this->tokens[$x]['conditions'] as $num => $oldCond) { - if ($oldCond === $this->tokens[$i]['code']) { - $oldConditions = $this->tokens[$x]['conditions']; - unset($this->tokens[$x]['conditions'][$num]); - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$x]['type']; - $oldConds = ''; - foreach ($oldConditions as $condition) { - $oldConds .= Tokens::tokenName($condition).','; - } - - $oldConds = rtrim($oldConds, ','); - - $newConds = ''; - foreach ($this->tokens[$x]['conditions'] as $condition) { - $newConds .= Tokens::tokenName($condition).','; - } - - $newConds = rtrim($newConds, ','); - - echo "\t\t* cleaned $x ($type) *".PHP_EOL; - echo "\t\t\t=> conditions changed from $oldConds to $newConds".PHP_EOL; - } - - break; - }//end if - }//end foreach - }//end for - }//end for - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t*** END ADDITIONAL PHP PROCESSING ***".PHP_EOL; - } - - }//end processAdditional() - - - /** - * Takes a token produced from token_get_all() and produces a - * more uniform token. - * - * @param string|array $token The token to convert. - * - * @return array The new token. - */ - public static function standardiseToken($token) - { - if (isset($token[1]) === false) { - if (isset(self::$resolveTokenCache[$token[0]]) === true) { - return self::$resolveTokenCache[$token[0]]; - } - } else { - $cacheKey = null; - if ($token[0] === T_STRING) { - $cacheKey = strtolower($token[1]); - } else if ($token[0] !== T_CURLY_OPEN) { - $cacheKey = $token[0]; - } - - if ($cacheKey !== null && isset(self::$resolveTokenCache[$cacheKey]) === true) { - $newToken = self::$resolveTokenCache[$cacheKey]; - $newToken['content'] = $token[1]; - return $newToken; - } - } - - if (isset($token[1]) === false) { - return self::resolveSimpleToken($token[0]); - } - - if ($token[0] === T_STRING) { - switch ($cacheKey) { - case 'false': - $newToken['type'] = 'T_FALSE'; - break; - case 'true': - $newToken['type'] = 'T_TRUE'; - break; - case 'null': - $newToken['type'] = 'T_NULL'; - break; - case 'self': - $newToken['type'] = 'T_SELF'; - break; - case 'parent': - $newToken['type'] = 'T_PARENT'; - break; - default: - $newToken['type'] = 'T_STRING'; - break; - } - - $newToken['code'] = constant($newToken['type']); - - self::$resolveTokenCache[$cacheKey] = $newToken; - } else if ($token[0] === T_CURLY_OPEN) { - $newToken = [ - 'code' => T_OPEN_CURLY_BRACKET, - 'type' => 'T_OPEN_CURLY_BRACKET', - ]; - } else { - $newToken = [ - 'code' => $token[0], - 'type' => Tokens::tokenName($token[0]), - ]; - - self::$resolveTokenCache[$token[0]] = $newToken; - }//end if - - $newToken['content'] = $token[1]; - return $newToken; - - }//end standardiseToken() - - - /** - * Converts simple tokens into a format that conforms to complex tokens - * produced by token_get_all(). - * - * Simple tokens are tokens that are not in array form when produced from - * token_get_all(). - * - * @param string $token The simple token to convert. - * - * @return array The new token in array format. - */ - public static function resolveSimpleToken($token) - { - $newToken = []; - - switch ($token) { - case '{': - $newToken['type'] = 'T_OPEN_CURLY_BRACKET'; - break; - case '}': - $newToken['type'] = 'T_CLOSE_CURLY_BRACKET'; - break; - case '[': - $newToken['type'] = 'T_OPEN_SQUARE_BRACKET'; - break; - case ']': - $newToken['type'] = 'T_CLOSE_SQUARE_BRACKET'; - break; - case '(': - $newToken['type'] = 'T_OPEN_PARENTHESIS'; - break; - case ')': - $newToken['type'] = 'T_CLOSE_PARENTHESIS'; - break; - case ':': - $newToken['type'] = 'T_COLON'; - break; - case '.': - $newToken['type'] = 'T_STRING_CONCAT'; - break; - case ';': - $newToken['type'] = 'T_SEMICOLON'; - break; - case '=': - $newToken['type'] = 'T_EQUAL'; - break; - case '*': - $newToken['type'] = 'T_MULTIPLY'; - break; - case '/': - $newToken['type'] = 'T_DIVIDE'; - break; - case '+': - $newToken['type'] = 'T_PLUS'; - break; - case '-': - $newToken['type'] = 'T_MINUS'; - break; - case '%': - $newToken['type'] = 'T_MODULUS'; - break; - case '^': - $newToken['type'] = 'T_BITWISE_XOR'; - break; - case '&': - $newToken['type'] = 'T_BITWISE_AND'; - break; - case '|': - $newToken['type'] = 'T_BITWISE_OR'; - break; - case '~': - $newToken['type'] = 'T_BITWISE_NOT'; - break; - case '<': - $newToken['type'] = 'T_LESS_THAN'; - break; - case '>': - $newToken['type'] = 'T_GREATER_THAN'; - break; - case '!': - $newToken['type'] = 'T_BOOLEAN_NOT'; - break; - case ',': - $newToken['type'] = 'T_COMMA'; - break; - case '@': - $newToken['type'] = 'T_ASPERAND'; - break; - case '$': - $newToken['type'] = 'T_DOLLAR'; - break; - case '`': - $newToken['type'] = 'T_BACKTICK'; - break; - default: - $newToken['type'] = 'T_NONE'; - break; - }//end switch - - $newToken['code'] = constant($newToken['type']); - $newToken['content'] = $token; - - self::$resolveTokenCache[$token] = $newToken; - return $newToken; - - }//end resolveSimpleToken() - - - /** - * Finds a "closer" token (closing parenthesis or square bracket for example) - * Handle parenthesis balancing while searching for closing token - * - * @param array $tokens The list of tokens to iterate searching the closing token (as returned by token_get_all). - * @param int $start The starting position. - * @param string|string[] $openerTokens The opening character. - * @param string $closerChar The closing character. - * - * @return int|null The position of the closing token, if found. NULL otherwise. - */ - private function findCloser(array &$tokens, $start, $openerTokens, $closerChar) - { - $numTokens = count($tokens); - $stack = [0]; - $closer = null; - $openerTokens = (array) $openerTokens; - - for ($x = $start; $x < $numTokens; $x++) { - if (in_array($tokens[$x], $openerTokens, true) === true - || (is_array($tokens[$x]) === true && in_array($tokens[$x][1], $openerTokens, true) === true) - ) { - $stack[] = $x; - } else if ($tokens[$x] === $closerChar) { - array_pop($stack); - if (empty($stack) === true) { - $closer = $x; - break; - } - } - } - - return $closer; - - }//end findCloser() - - - /** - * PHP 8 attributes parser for PHP < 8 - * Handles single-line and multiline attributes. - * - * @param array $tokens The original array of tokens (as returned by token_get_all). - * @param int $stackPtr The current position in token array. - * - * @return array The array of parsed attribute tokens - */ - private function parsePhpAttribute(array &$tokens, $stackPtr) - { - $token = $tokens[$stackPtr]; - - $commentBody = substr($token[1], 2); - $subTokens = @token_get_all(' $subToken) { - if (is_array($subToken) === true - && $subToken[0] === T_COMMENT - && strpos($subToken[1], '#[') === 0 - ) { - $reparsed = $this->parsePhpAttribute($subTokens, $i); - array_splice($subTokens, $i, 1, $reparsed); - } - } - - array_splice($subTokens, 0, 1, [[T_ATTRIBUTE, '#[']]); - - // Go looking for the close bracket. - $bracketCloser = $this->findCloser($subTokens, 1, '[', ']'); - - /* - * No closer bracket found, this might be a multi-line attribute, - * but it could also be an unfinished attribute (parse error). - * - * If it is a multi-line attribute, we need to grab a larger part of the code. - * If it is a parse error, we need to stick with only handling the line - * containing the attribute opener. - */ - - if (PHP_VERSION_ID < 80000 && $bracketCloser === null) { - foreach (array_slice($tokens, ($stackPtr + 1)) as $token) { - if (is_array($token) === true) { - $commentBody .= $token[1]; - } else { - $commentBody .= $token; - } - } - - $newSubTokens = @token_get_all('findCloser($newSubTokens, 1, '[', ']'); - if ($bracketCloser !== null) { - // We found the closer, overwrite the original $subTokens array. - array_splice($tokens, ($stackPtr + 1), count($tokens), array_slice($newSubTokens, ($bracketCloser + 1))); - $subTokens = array_slice($newSubTokens, 0, ($bracketCloser + 1)); - } - } - - return $subTokens; - - }//end parsePhpAttribute() - - - /** - * Creates a map for the attributes tokens that surround other tokens. - * - * @return void - */ - private function createAttributesNestingMap() - { - $map = []; - for ($i = 0; $i < $this->numTokens; $i++) { - if (isset($this->tokens[$i]['attribute_opener']) === true - && $i === $this->tokens[$i]['attribute_opener'] - ) { - if (empty($map) === false) { - $this->tokens[$i]['nested_attributes'] = $map; - } - - if (isset($this->tokens[$i]['attribute_closer']) === true) { - $map[$this->tokens[$i]['attribute_opener']] - = $this->tokens[$i]['attribute_closer']; - } - } else if (isset($this->tokens[$i]['attribute_closer']) === true - && $i === $this->tokens[$i]['attribute_closer'] - ) { - array_pop($map); - if (empty($map) === false) { - $this->tokens[$i]['nested_attributes'] = $map; - } - } else { - if (empty($map) === false) { - $this->tokens[$i]['nested_attributes'] = $map; - } - }//end if - }//end for - - }//end createAttributesNestingMap() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Tokenizers/Tokenizer.php b/vendor/squizlabs/php_codesniffer/src/Tokenizers/Tokenizer.php deleted file mode 100644 index aef2d7f..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Tokenizers/Tokenizer.php +++ /dev/null @@ -1,1738 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tokenizers; - -use PHP_CodeSniffer\Exceptions\TokenizerException; -use PHP_CodeSniffer\Util\Common; -use PHP_CodeSniffer\Util\Tokens; - -abstract class Tokenizer -{ - - /** - * The config data for the run. - * - * @var \PHP_CodeSniffer\Config - */ - protected $config = null; - - /** - * The EOL char used in the content. - * - * @var string - */ - protected $eolChar = ''; - - /** - * A token-based representation of the content. - * - * @var array - */ - protected $tokens = []; - - /** - * The number of tokens in the tokens array. - * - * @var integer - */ - protected $numTokens = 0; - - /** - * A list of tokens that are allowed to open a scope. - * - * @var array - */ - public $scopeOpeners = []; - - /** - * A list of tokens that end the scope. - * - * @var array - */ - public $endScopeTokens = []; - - /** - * Known lengths of tokens. - * - * @var array - */ - public $knownLengths = []; - - /** - * A list of lines being ignored due to error suppression comments. - * - * @var array - */ - public $ignoredLines = []; - - - /** - * Initialise and run the tokenizer. - * - * @param string $content The content to tokenize. - * @param \PHP_CodeSniffer\Config|null $config The config data for the run. - * @param string $eolChar The EOL char used in the content. - * - * @return void - * @throws \PHP_CodeSniffer\Exceptions\TokenizerException If the file appears to be minified. - */ - public function __construct($content, $config, $eolChar='\n') - { - $this->eolChar = $eolChar; - - $this->config = $config; - $this->tokens = $this->tokenize($content); - - if ($config === null) { - return; - } - - $this->createPositionMap(); - $this->createTokenMap(); - $this->createParenthesisNestingMap(); - $this->createScopeMap(); - $this->createLevelMap(); - - // Allow the tokenizer to do additional processing if required. - $this->processAdditional(); - - }//end __construct() - - - /** - * Checks the content to see if it looks minified. - * - * @param string $content The content to tokenize. - * @param string $eolChar The EOL char used in the content. - * - * @return boolean - */ - protected function isMinifiedContent($content, $eolChar='\n') - { - // Minified files often have a very large number of characters per line - // and cause issues when tokenizing. - $numChars = strlen($content); - $numLines = (substr_count($content, $eolChar) + 1); - $average = ($numChars / $numLines); - if ($average > 100) { - return true; - } - - return false; - - }//end isMinifiedContent() - - - /** - * Gets the array of tokens. - * - * @return array - */ - public function getTokens() - { - return $this->tokens; - - }//end getTokens() - - - /** - * Creates an array of tokens when given some content. - * - * @param string $string The string to tokenize. - * - * @return array - */ - abstract protected function tokenize($string); - - - /** - * Performs additional processing after main tokenizing. - * - * @return void - */ - abstract protected function processAdditional(); - - - /** - * Sets token position information. - * - * Can also convert tabs into spaces. Each tab can represent between - * 1 and $width spaces, so this cannot be a straight string replace. - * - * @return void - */ - private function createPositionMap() - { - $currColumn = 1; - $lineNumber = 1; - $eolLen = strlen($this->eolChar); - $ignoring = null; - $inTests = defined('PHP_CODESNIFFER_IN_TESTS'); - - $checkEncoding = false; - if (function_exists('iconv_strlen') === true) { - $checkEncoding = true; - } - - $checkAnnotations = $this->config->annotations; - $encoding = $this->config->encoding; - $tabWidth = $this->config->tabWidth; - - $tokensWithTabs = [ - T_WHITESPACE => true, - T_COMMENT => true, - T_DOC_COMMENT => true, - T_DOC_COMMENT_WHITESPACE => true, - T_DOC_COMMENT_STRING => true, - T_CONSTANT_ENCAPSED_STRING => true, - T_DOUBLE_QUOTED_STRING => true, - T_START_HEREDOC => true, - T_START_NOWDOC => true, - T_HEREDOC => true, - T_NOWDOC => true, - T_END_HEREDOC => true, - T_END_NOWDOC => true, - T_INLINE_HTML => true, - T_YIELD_FROM => true, - ]; - - $this->numTokens = count($this->tokens); - for ($i = 0; $i < $this->numTokens; $i++) { - $this->tokens[$i]['line'] = $lineNumber; - $this->tokens[$i]['column'] = $currColumn; - - if (isset($this->knownLengths[$this->tokens[$i]['code']]) === true) { - // There are no tabs in the tokens we know the length of. - $length = $this->knownLengths[$this->tokens[$i]['code']]; - $currColumn += $length; - } else if ($tabWidth === 0 - || isset($tokensWithTabs[$this->tokens[$i]['code']]) === false - || strpos($this->tokens[$i]['content'], "\t") === false - ) { - // There are no tabs in this content, or we aren't replacing them. - if ($checkEncoding === true) { - // Not using the default encoding, so take a bit more care. - $oldLevel = error_reporting(); - error_reporting(0); - $length = iconv_strlen($this->tokens[$i]['content'], $encoding); - error_reporting($oldLevel); - - if ($length === false) { - // String contained invalid characters, so revert to default. - $length = strlen($this->tokens[$i]['content']); - } - } else { - $length = strlen($this->tokens[$i]['content']); - } - - $currColumn += $length; - } else { - $this->replaceTabsInToken($this->tokens[$i]); - $length = $this->tokens[$i]['length']; - $currColumn += $length; - }//end if - - $this->tokens[$i]['length'] = $length; - - if (isset($this->knownLengths[$this->tokens[$i]['code']]) === false - && strpos($this->tokens[$i]['content'], $this->eolChar) !== false - ) { - $lineNumber++; - $currColumn = 1; - - // Newline chars are not counted in the token length. - $this->tokens[$i]['length'] -= $eolLen; - } - - if ($this->tokens[$i]['code'] === T_COMMENT - || $this->tokens[$i]['code'] === T_DOC_COMMENT_STRING - || $this->tokens[$i]['code'] === T_DOC_COMMENT_TAG - || ($inTests === true && $this->tokens[$i]['code'] === T_INLINE_HTML) - ) { - $commentText = ltrim($this->tokens[$i]['content'], " \t/*#"); - $commentText = rtrim($commentText, " */\t\r\n"); - $commentTextLower = strtolower($commentText); - if (strpos($commentText, '@codingStandards') !== false) { - // If this comment is the only thing on the line, it tells us - // to ignore the following line. If the line contains other content - // then we are just ignoring this one single line. - $ownLine = false; - if ($i > 0) { - for ($prev = ($i - 1); $prev >= 0; $prev--) { - if ($this->tokens[$prev]['code'] === T_WHITESPACE) { - continue; - } - - break; - } - - if ($this->tokens[$prev]['line'] !== $this->tokens[$i]['line']) { - $ownLine = true; - } - } - - if ($ignoring === null - && strpos($commentText, '@codingStandardsIgnoreStart') !== false - ) { - $ignoring = ['.all' => true]; - if ($ownLine === true) { - $this->ignoredLines[$this->tokens[$i]['line']] = $ignoring; - } - } else if ($ignoring !== null - && strpos($commentText, '@codingStandardsIgnoreEnd') !== false - ) { - if ($ownLine === true) { - $this->ignoredLines[$this->tokens[$i]['line']] = ['.all' => true]; - } else { - $this->ignoredLines[$this->tokens[$i]['line']] = $ignoring; - } - - $ignoring = null; - } else if ($ignoring === null - && strpos($commentText, '@codingStandardsIgnoreLine') !== false - ) { - $ignoring = ['.all' => true]; - if ($ownLine === true) { - $this->ignoredLines[$this->tokens[$i]['line']] = $ignoring; - $this->ignoredLines[($this->tokens[$i]['line'] + 1)] = $ignoring; - } else { - $this->ignoredLines[$this->tokens[$i]['line']] = $ignoring; - } - - $ignoring = null; - }//end if - } else if (substr($commentTextLower, 0, 6) === 'phpcs:' - || substr($commentTextLower, 0, 7) === '@phpcs:' - ) { - // If the @phpcs: syntax is being used, strip the @ to make - // comparisons easier. - if ($commentText[0] === '@') { - $commentText = substr($commentText, 1); - $commentTextLower = strtolower($commentText); - } - - // If there is a comment on the end, strip it off. - $commentStart = strpos($commentTextLower, ' --'); - if ($commentStart !== false) { - $commentText = substr($commentText, 0, $commentStart); - $commentTextLower = strtolower($commentText); - } - - // If this comment is the only thing on the line, it tells us - // to ignore the following line. If the line contains other content - // then we are just ignoring this one single line. - $lineHasOtherContent = false; - $lineHasOtherTokens = false; - if ($i > 0) { - for ($prev = ($i - 1); $prev > 0; $prev--) { - if ($this->tokens[$prev]['line'] !== $this->tokens[$i]['line']) { - // Changed lines. - break; - } - - if ($this->tokens[$prev]['code'] === T_WHITESPACE - || $this->tokens[$prev]['code'] === T_DOC_COMMENT_WHITESPACE - || ($this->tokens[$prev]['code'] === T_INLINE_HTML - && trim($this->tokens[$prev]['content']) === '') - ) { - continue; - } - - $lineHasOtherTokens = true; - - if ($this->tokens[$prev]['code'] === T_OPEN_TAG - || $this->tokens[$prev]['code'] === T_DOC_COMMENT_STAR - ) { - continue; - } - - $lineHasOtherContent = true; - break; - }//end for - - $changedLines = false; - for ($next = $i; $next < $this->numTokens; $next++) { - if ($changedLines === true) { - // Changed lines. - break; - } - - if (isset($this->knownLengths[$this->tokens[$next]['code']]) === false - && strpos($this->tokens[$next]['content'], $this->eolChar) !== false - ) { - // Last token on the current line. - $changedLines = true; - } - - if ($next === $i) { - continue; - } - - if ($this->tokens[$next]['code'] === T_WHITESPACE - || $this->tokens[$next]['code'] === T_DOC_COMMENT_WHITESPACE - || ($this->tokens[$next]['code'] === T_INLINE_HTML - && trim($this->tokens[$next]['content']) === '') - ) { - continue; - } - - $lineHasOtherTokens = true; - - if ($this->tokens[$next]['code'] === T_CLOSE_TAG) { - continue; - } - - $lineHasOtherContent = true; - break; - }//end for - }//end if - - if (substr($commentTextLower, 0, 9) === 'phpcs:set') { - // Ignore standards for complete lines that change sniff settings. - if ($lineHasOtherTokens === false) { - $this->ignoredLines[$this->tokens[$i]['line']] = ['.all' => true]; - } - - // Need to maintain case here, to get the correct sniff code. - $parts = explode(' ', substr($commentText, 10)); - if (count($parts) >= 2) { - $sniffParts = explode('.', $parts[0]); - if (count($sniffParts) >= 3) { - $this->tokens[$i]['sniffCode'] = array_shift($parts); - $this->tokens[$i]['sniffProperty'] = array_shift($parts); - $this->tokens[$i]['sniffPropertyValue'] = rtrim(implode(' ', $parts), " */\r\n"); - } - } - - $this->tokens[$i]['code'] = T_PHPCS_SET; - $this->tokens[$i]['type'] = 'T_PHPCS_SET'; - } else if (substr($commentTextLower, 0, 16) === 'phpcs:ignorefile') { - // The whole file will be ignored, but at least set the correct token. - $this->tokens[$i]['code'] = T_PHPCS_IGNORE_FILE; - $this->tokens[$i]['type'] = 'T_PHPCS_IGNORE_FILE'; - } else if (substr($commentTextLower, 0, 13) === 'phpcs:disable') { - if ($lineHasOtherContent === false) { - // Completely ignore the comment line. - $this->ignoredLines[$this->tokens[$i]['line']] = ['.all' => true]; - } - - if ($ignoring === null) { - $ignoring = []; - } - - $disabledSniffs = []; - - $additionalText = substr($commentText, 14); - if (empty($additionalText) === true) { - $ignoring = ['.all' => true]; - } else { - $parts = explode(',', $additionalText); - foreach ($parts as $sniffCode) { - $sniffCode = trim($sniffCode); - $disabledSniffs[$sniffCode] = true; - $ignoring[$sniffCode] = true; - - // This newly disabled sniff might be disabling an existing - // enabled exception that we are tracking. - if (isset($ignoring['.except']) === true) { - foreach (array_keys($ignoring['.except']) as $ignoredSniffCode) { - if ($ignoredSniffCode === $sniffCode - || strpos($ignoredSniffCode, $sniffCode.'.') === 0 - ) { - unset($ignoring['.except'][$ignoredSniffCode]); - } - } - - if (empty($ignoring['.except']) === true) { - unset($ignoring['.except']); - } - } - }//end foreach - }//end if - - $this->tokens[$i]['code'] = T_PHPCS_DISABLE; - $this->tokens[$i]['type'] = 'T_PHPCS_DISABLE'; - $this->tokens[$i]['sniffCodes'] = $disabledSniffs; - } else if (substr($commentTextLower, 0, 12) === 'phpcs:enable') { - if ($ignoring !== null) { - $enabledSniffs = []; - - $additionalText = substr($commentText, 13); - if (empty($additionalText) === true) { - $ignoring = null; - } else { - $parts = explode(',', $additionalText); - foreach ($parts as $sniffCode) { - $sniffCode = trim($sniffCode); - $enabledSniffs[$sniffCode] = true; - - // This new enabled sniff might remove previously disabled - // sniffs if it is actually a standard or category of sniffs. - foreach (array_keys($ignoring) as $ignoredSniffCode) { - if ($ignoredSniffCode === $sniffCode - || strpos($ignoredSniffCode, $sniffCode.'.') === 0 - ) { - unset($ignoring[$ignoredSniffCode]); - } - } - - // This new enabled sniff might be able to clear up - // previously enabled sniffs if it is actually a standard or - // category of sniffs. - if (isset($ignoring['.except']) === true) { - foreach (array_keys($ignoring['.except']) as $ignoredSniffCode) { - if ($ignoredSniffCode === $sniffCode - || strpos($ignoredSniffCode, $sniffCode.'.') === 0 - ) { - unset($ignoring['.except'][$ignoredSniffCode]); - } - } - } - }//end foreach - - if (empty($ignoring) === true) { - $ignoring = null; - } else { - if (isset($ignoring['.except']) === true) { - $ignoring['.except'] += $enabledSniffs; - } else { - $ignoring['.except'] = $enabledSniffs; - } - } - }//end if - - if ($lineHasOtherContent === false) { - // Completely ignore the comment line. - $this->ignoredLines[$this->tokens[$i]['line']] = ['.all' => true]; - } else { - // The comment is on the same line as the code it is ignoring, - // so respect the new ignore rules. - $this->ignoredLines[$this->tokens[$i]['line']] = $ignoring; - } - - $this->tokens[$i]['sniffCodes'] = $enabledSniffs; - }//end if - - $this->tokens[$i]['code'] = T_PHPCS_ENABLE; - $this->tokens[$i]['type'] = 'T_PHPCS_ENABLE'; - } else if (substr($commentTextLower, 0, 12) === 'phpcs:ignore') { - $ignoreRules = []; - - $additionalText = substr($commentText, 13); - if (empty($additionalText) === true) { - $ignoreRules = ['.all' => true]; - } else { - $parts = explode(',', $additionalText); - foreach ($parts as $sniffCode) { - $ignoreRules[trim($sniffCode)] = true; - } - } - - $this->tokens[$i]['code'] = T_PHPCS_IGNORE; - $this->tokens[$i]['type'] = 'T_PHPCS_IGNORE'; - $this->tokens[$i]['sniffCodes'] = $ignoreRules; - - if ($ignoring !== null) { - $ignoreRules += $ignoring; - } - - if ($lineHasOtherContent === false) { - // Completely ignore the comment line, and set the following - // line to include the ignore rules we've set. - $this->ignoredLines[$this->tokens[$i]['line']] = ['.all' => true]; - $this->ignoredLines[($this->tokens[$i]['line'] + 1)] = $ignoreRules; - } else { - // The comment is on the same line as the code it is ignoring, - // so respect the ignore rules it set. - $this->ignoredLines[$this->tokens[$i]['line']] = $ignoreRules; - } - }//end if - }//end if - }//end if - - if ($ignoring !== null && isset($this->ignoredLines[$this->tokens[$i]['line']]) === false) { - $this->ignoredLines[$this->tokens[$i]['line']] = $ignoring; - } - }//end for - - // If annotations are being ignored, we clear out all the ignore rules - // but leave the annotations tokenized as normal. - if ($checkAnnotations === false) { - $this->ignoredLines = []; - } - - }//end createPositionMap() - - - /** - * Replaces tabs in original token content with spaces. - * - * Each tab can represent between 1 and $config->tabWidth spaces, - * so this cannot be a straight string replace. The original content - * is placed into an orig_content index and the new token length is also - * set in the length index. - * - * @param array $token The token to replace tabs inside. - * @param string $prefix The character to use to represent the start of a tab. - * @param string $padding The character to use to represent the end of a tab. - * @param int|null $tabWidth The number of spaces each tab represents. - * - * @return void - */ - public function replaceTabsInToken(&$token, $prefix=' ', $padding=' ', $tabWidth=null) - { - $checkEncoding = false; - if (function_exists('iconv_strlen') === true) { - $checkEncoding = true; - } - - $currColumn = $token['column']; - if ($tabWidth === null) { - $tabWidth = $this->config->tabWidth; - if ($tabWidth === 0) { - $tabWidth = 1; - } - } - - if (rtrim($token['content'], "\t") === '') { - // String only contains tabs, so we can shortcut the process. - $numTabs = strlen($token['content']); - - $firstTabSize = ($tabWidth - (($currColumn - 1) % $tabWidth)); - $length = ($firstTabSize + ($tabWidth * ($numTabs - 1))); - $newContent = $prefix.str_repeat($padding, ($length - 1)); - } else { - // We need to determine the length of each tab. - $tabs = explode("\t", $token['content']); - - $numTabs = (count($tabs) - 1); - $tabNum = 0; - $newContent = ''; - $length = 0; - - foreach ($tabs as $content) { - if ($content !== '') { - $newContent .= $content; - if ($checkEncoding === true) { - // Not using ASCII encoding, so take a bit more care. - $oldLevel = error_reporting(); - error_reporting(0); - $contentLength = iconv_strlen($content, $this->config->encoding); - error_reporting($oldLevel); - if ($contentLength === false) { - // String contained invalid characters, so revert to default. - $contentLength = strlen($content); - } - } else { - $contentLength = strlen($content); - } - - $currColumn += $contentLength; - $length += $contentLength; - } - - // The last piece of content does not have a tab after it. - if ($tabNum === $numTabs) { - break; - } - - // Process the tab that comes after the content. - $tabNum++; - - // Move the pointer to the next tab stop. - $pad = ($tabWidth - ($currColumn + $tabWidth - 1) % $tabWidth); - $currColumn += $pad; - $length += $pad; - $newContent .= $prefix.str_repeat($padding, ($pad - 1)); - }//end foreach - }//end if - - $token['orig_content'] = $token['content']; - $token['content'] = $newContent; - $token['length'] = $length; - - }//end replaceTabsInToken() - - - /** - * Creates a map of brackets positions. - * - * @return void - */ - private function createTokenMap() - { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t*** START TOKEN MAP ***".PHP_EOL; - } - - $squareOpeners = []; - $curlyOpeners = []; - $this->numTokens = count($this->tokens); - - $openers = []; - $openOwner = null; - - for ($i = 0; $i < $this->numTokens; $i++) { - /* - Parenthesis mapping. - */ - - if (isset(Tokens::$parenthesisOpeners[$this->tokens[$i]['code']]) === true) { - $this->tokens[$i]['parenthesis_opener'] = null; - $this->tokens[$i]['parenthesis_closer'] = null; - $this->tokens[$i]['parenthesis_owner'] = $i; - $openOwner = $i; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", (count($openers) + 1)); - echo "=> Found parenthesis owner at $i".PHP_EOL; - } - } else if ($this->tokens[$i]['code'] === T_OPEN_PARENTHESIS) { - $openers[] = $i; - $this->tokens[$i]['parenthesis_opener'] = $i; - if ($openOwner !== null) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", count($openers)); - echo "=> Found parenthesis opener at $i for $openOwner".PHP_EOL; - } - - $this->tokens[$openOwner]['parenthesis_opener'] = $i; - $this->tokens[$i]['parenthesis_owner'] = $openOwner; - $openOwner = null; - } else if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", count($openers)); - echo "=> Found unowned parenthesis opener at $i".PHP_EOL; - } - } else if ($this->tokens[$i]['code'] === T_CLOSE_PARENTHESIS) { - // Did we set an owner for this set of parenthesis? - $numOpeners = count($openers); - if ($numOpeners !== 0) { - $opener = array_pop($openers); - if (isset($this->tokens[$opener]['parenthesis_owner']) === true) { - $owner = $this->tokens[$opener]['parenthesis_owner']; - - $this->tokens[$owner]['parenthesis_closer'] = $i; - $this->tokens[$i]['parenthesis_owner'] = $owner; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", (count($openers) + 1)); - echo "=> Found parenthesis closer at $i for $owner".PHP_EOL; - } - } else if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", (count($openers) + 1)); - echo "=> Found unowned parenthesis closer at $i for $opener".PHP_EOL; - } - - $this->tokens[$i]['parenthesis_opener'] = $opener; - $this->tokens[$i]['parenthesis_closer'] = $i; - $this->tokens[$opener]['parenthesis_closer'] = $i; - }//end if - } else if ($this->tokens[$i]['code'] === T_ATTRIBUTE) { - $openers[] = $i; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", count($openers)); - echo "=> Found attribute opener at $i".PHP_EOL; - } - - $this->tokens[$i]['attribute_opener'] = $i; - $this->tokens[$i]['attribute_closer'] = null; - } else if ($this->tokens[$i]['code'] === T_ATTRIBUTE_END) { - $numOpeners = count($openers); - if ($numOpeners !== 0) { - $opener = array_pop($openers); - if (isset($this->tokens[$opener]['attribute_opener']) === true) { - $this->tokens[$opener]['attribute_closer'] = $i; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", (count($openers) + 1)); - echo "=> Found attribute closer at $i for $opener".PHP_EOL; - } - - for ($x = ($opener + 1); $x <= $i; ++$x) { - if (isset($this->tokens[$x]['attribute_closer']) === true) { - continue; - } - - $this->tokens[$x]['attribute_opener'] = $opener; - $this->tokens[$x]['attribute_closer'] = $i; - } - } else if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", (count($openers) + 1)); - echo "=> Found unowned attribute closer at $i for $opener".PHP_EOL; - } - }//end if - }//end if - - /* - Bracket mapping. - */ - - switch ($this->tokens[$i]['code']) { - case T_OPEN_SQUARE_BRACKET: - $squareOpeners[] = $i; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", count($squareOpeners)); - echo str_repeat("\t", count($curlyOpeners)); - echo "=> Found square bracket opener at $i".PHP_EOL; - } - break; - case T_OPEN_CURLY_BRACKET: - if (isset($this->tokens[$i]['scope_closer']) === false) { - $curlyOpeners[] = $i; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", count($squareOpeners)); - echo str_repeat("\t", count($curlyOpeners)); - echo "=> Found curly bracket opener at $i".PHP_EOL; - } - } - break; - case T_CLOSE_SQUARE_BRACKET: - if (empty($squareOpeners) === false) { - $opener = array_pop($squareOpeners); - $this->tokens[$i]['bracket_opener'] = $opener; - $this->tokens[$i]['bracket_closer'] = $i; - $this->tokens[$opener]['bracket_opener'] = $opener; - $this->tokens[$opener]['bracket_closer'] = $i; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", count($squareOpeners)); - echo str_repeat("\t", count($curlyOpeners)); - echo "\t=> Found square bracket closer at $i for $opener".PHP_EOL; - } - } - break; - case T_CLOSE_CURLY_BRACKET: - if (empty($curlyOpeners) === false - && isset($this->tokens[$i]['scope_opener']) === false - ) { - $opener = array_pop($curlyOpeners); - $this->tokens[$i]['bracket_opener'] = $opener; - $this->tokens[$i]['bracket_closer'] = $i; - $this->tokens[$opener]['bracket_opener'] = $opener; - $this->tokens[$opener]['bracket_closer'] = $i; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", count($squareOpeners)); - echo str_repeat("\t", count($curlyOpeners)); - echo "\t=> Found curly bracket closer at $i for $opener".PHP_EOL; - } - } - break; - default: - continue 2; - }//end switch - }//end for - - // Cleanup for any openers that we didn't find closers for. - // This typically means there was a syntax error breaking things. - foreach ($openers as $opener) { - unset($this->tokens[$opener]['parenthesis_opener']); - unset($this->tokens[$opener]['parenthesis_owner']); - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t*** END TOKEN MAP ***".PHP_EOL; - } - - }//end createTokenMap() - - - /** - * Creates a map for the parenthesis tokens that surround other tokens. - * - * @return void - */ - private function createParenthesisNestingMap() - { - $map = []; - for ($i = 0; $i < $this->numTokens; $i++) { - if (isset($this->tokens[$i]['parenthesis_opener']) === true - && $i === $this->tokens[$i]['parenthesis_opener'] - ) { - if (empty($map) === false) { - $this->tokens[$i]['nested_parenthesis'] = $map; - } - - if (isset($this->tokens[$i]['parenthesis_closer']) === true) { - $map[$this->tokens[$i]['parenthesis_opener']] - = $this->tokens[$i]['parenthesis_closer']; - } - } else if (isset($this->tokens[$i]['parenthesis_closer']) === true - && $i === $this->tokens[$i]['parenthesis_closer'] - ) { - array_pop($map); - if (empty($map) === false) { - $this->tokens[$i]['nested_parenthesis'] = $map; - } - } else { - if (empty($map) === false) { - $this->tokens[$i]['nested_parenthesis'] = $map; - } - }//end if - }//end for - - }//end createParenthesisNestingMap() - - - /** - * Creates a scope map of tokens that open scopes. - * - * @return void - * @see recurseScopeMap() - */ - private function createScopeMap() - { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t*** START SCOPE MAP ***".PHP_EOL; - } - - for ($i = 0; $i < $this->numTokens; $i++) { - // Check to see if the current token starts a new scope. - if (isset($this->scopeOpeners[$this->tokens[$i]['code']]) === true) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$i]['type']; - $content = Common::prepareForOutput($this->tokens[$i]['content']); - echo "\tStart scope map at $i:$type => $content".PHP_EOL; - } - - if (isset($this->tokens[$i]['scope_condition']) === true) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t* already processed, skipping *".PHP_EOL; - } - - continue; - } - - $i = $this->recurseScopeMap($i); - }//end if - }//end for - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t*** END SCOPE MAP ***".PHP_EOL; - } - - }//end createScopeMap() - - - /** - * Recurses though the scope openers to build a scope map. - * - * @param int $stackPtr The position in the stack of the token that - * opened the scope (eg. an IF token or FOR token). - * @param int $depth How many scope levels down we are. - * @param int $ignore How many curly braces we are ignoring. - * - * @return int The position in the stack that closed the scope. - * @throws \PHP_CodeSniffer\Exceptions\TokenizerException If the nesting level gets too deep. - */ - private function recurseScopeMap($stackPtr, $depth=1, &$ignore=0) - { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "=> Begin scope map recursion at token $stackPtr with depth $depth".PHP_EOL; - } - - $opener = null; - $currType = $this->tokens[$stackPtr]['code']; - $startLine = $this->tokens[$stackPtr]['line']; - - // We will need this to restore the value if we end up - // returning a token ID that causes our calling function to go back - // over already ignored braces. - $originalIgnore = $ignore; - - // If the start token for this scope opener is the same as - // the scope token, we have already found our opener. - if (isset($this->scopeOpeners[$currType]['start'][$currType]) === true) { - $opener = $stackPtr; - } - - for ($i = ($stackPtr + 1); $i < $this->numTokens; $i++) { - $tokenType = $this->tokens[$i]['code']; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$i]['type']; - $line = $this->tokens[$i]['line']; - $content = Common::prepareForOutput($this->tokens[$i]['content']); - - echo str_repeat("\t", $depth); - echo "Process token $i on line $line ["; - if ($opener !== null) { - echo "opener:$opener;"; - } - - if ($ignore > 0) { - echo "ignore=$ignore;"; - } - - echo "]: $type => $content".PHP_EOL; - }//end if - - // Very special case for IF statements in PHP that can be defined without - // scope tokens. E.g., if (1) 1; 1 ? (1 ? 1 : 1) : 1; - // If an IF statement below this one has an opener but no - // keyword, the opener will be incorrectly assigned to this IF statement. - // The same case also applies to USE statements, which don't have to have - // openers, so a following USE statement can cause an incorrect brace match. - if (($currType === T_IF || $currType === T_ELSE || $currType === T_USE) - && $opener === null - && ($this->tokens[$i]['code'] === T_SEMICOLON - || $this->tokens[$i]['code'] === T_CLOSE_TAG) - ) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$stackPtr]['type']; - echo str_repeat("\t", $depth); - if ($this->tokens[$i]['code'] === T_SEMICOLON) { - $closerType = 'semicolon'; - } else { - $closerType = 'close tag'; - } - - echo "=> Found $closerType before scope opener for $stackPtr:$type, bailing".PHP_EOL; - } - - return $i; - } - - // Special case for PHP control structures that have no braces. - // If we find a curly brace closer before we find the opener, - // we're not going to find an opener. That closer probably belongs to - // a control structure higher up. - if ($opener === null - && $ignore === 0 - && $tokenType === T_CLOSE_CURLY_BRACKET - && isset($this->scopeOpeners[$currType]['end'][$tokenType]) === true - ) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$stackPtr]['type']; - echo str_repeat("\t", $depth); - echo "=> Found curly brace closer before scope opener for $stackPtr:$type, bailing".PHP_EOL; - } - - return ($i - 1); - } - - if ($opener !== null - && (isset($this->tokens[$i]['scope_opener']) === false - || $this->scopeOpeners[$this->tokens[$stackPtr]['code']]['shared'] === true) - && isset($this->scopeOpeners[$currType]['end'][$tokenType]) === true - ) { - if ($ignore > 0 && $tokenType === T_CLOSE_CURLY_BRACKET) { - // The last opening bracket must have been for a string - // offset or alike, so let's ignore it. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo '* finished ignoring curly brace *'.PHP_EOL; - } - - $ignore--; - continue; - } else if ($this->tokens[$opener]['code'] === T_OPEN_CURLY_BRACKET - && $tokenType !== T_CLOSE_CURLY_BRACKET - ) { - // The opener is a curly bracket so the closer must be a curly bracket as well. - // We ignore this closer to handle cases such as T_ELSE or T_ELSEIF being considered - // a closer of T_IF when it should not. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$stackPtr]['type']; - echo str_repeat("\t", $depth); - echo "=> Ignoring non-curly scope closer for $stackPtr:$type".PHP_EOL; - } - } else { - $scopeCloser = $i; - $todo = [ - $stackPtr, - $opener, - ]; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$stackPtr]['type']; - $closerType = $this->tokens[$scopeCloser]['type']; - echo str_repeat("\t", $depth); - echo "=> Found scope closer ($scopeCloser:$closerType) for $stackPtr:$type".PHP_EOL; - } - - $validCloser = true; - if (($this->tokens[$stackPtr]['code'] === T_IF || $this->tokens[$stackPtr]['code'] === T_ELSEIF) - && ($tokenType === T_ELSE || $tokenType === T_ELSEIF) - ) { - // To be a closer, this token must have an opener. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "* closer needs to be tested *".PHP_EOL; - } - - $i = self::recurseScopeMap($i, ($depth + 1), $ignore); - - if (isset($this->tokens[$scopeCloser]['scope_opener']) === false) { - $validCloser = false; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "* closer is not valid (no opener found) *".PHP_EOL; - } - } else if ($this->tokens[$this->tokens[$scopeCloser]['scope_opener']]['code'] !== $this->tokens[$opener]['code']) { - $validCloser = false; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - $type = $this->tokens[$this->tokens[$scopeCloser]['scope_opener']]['type']; - $openerType = $this->tokens[$opener]['type']; - echo "* closer is not valid (mismatched opener type; $type != $openerType) *".PHP_EOL; - } - } else if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "* closer was valid *".PHP_EOL; - } - } else { - // The closer was not processed, so we need to - // complete that token as well. - $todo[] = $scopeCloser; - }//end if - - if ($validCloser === true) { - foreach ($todo as $token) { - $this->tokens[$token]['scope_condition'] = $stackPtr; - $this->tokens[$token]['scope_opener'] = $opener; - $this->tokens[$token]['scope_closer'] = $scopeCloser; - } - - if ($this->scopeOpeners[$this->tokens[$stackPtr]['code']]['shared'] === true) { - // As we are going back to where we started originally, restore - // the ignore value back to its original value. - $ignore = $originalIgnore; - return $opener; - } else if ($scopeCloser === $i - && isset($this->scopeOpeners[$tokenType]) === true - ) { - // Unset scope_condition here or else the token will appear to have - // already been processed, and it will be skipped. Normally we want that, - // but in this case, the token is both a closer and an opener, so - // it needs to act like an opener. This is also why we return the - // token before this one; so the closer has a chance to be processed - // a second time, but as an opener. - unset($this->tokens[$scopeCloser]['scope_condition']); - return ($i - 1); - } else { - return $i; - } - } else { - continue; - }//end if - }//end if - }//end if - - // Is this an opening condition ? - if (isset($this->scopeOpeners[$tokenType]) === true) { - if ($opener === null) { - if ($tokenType === T_USE) { - // PHP use keywords are special because they can be - // used as blocks but also inline in function definitions. - // So if we find them nested inside another opener, just skip them. - continue; - } - - if ($tokenType === T_NAMESPACE) { - // PHP namespace keywords are special because they can be - // used as blocks but also inline as operators. - // So if we find them nested inside another opener, just skip them. - continue; - } - - if ($tokenType === T_FUNCTION - && $this->tokens[$stackPtr]['code'] !== T_FUNCTION - ) { - // Probably a closure, so process it manually. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$stackPtr]['type']; - echo str_repeat("\t", $depth); - echo "=> Found function before scope opener for $stackPtr:$type, processing manually".PHP_EOL; - } - - if (isset($this->tokens[$i]['scope_closer']) === true) { - // We've already processed this closure. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo '* already processed, skipping *'.PHP_EOL; - } - - $i = $this->tokens[$i]['scope_closer']; - continue; - } - - $i = self::recurseScopeMap($i, ($depth + 1), $ignore); - continue; - }//end if - - if ($tokenType === T_CLASS) { - // Probably an anonymous class inside another anonymous class, - // so process it manually. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$stackPtr]['type']; - echo str_repeat("\t", $depth); - echo "=> Found class before scope opener for $stackPtr:$type, processing manually".PHP_EOL; - } - - if (isset($this->tokens[$i]['scope_closer']) === true) { - // We've already processed this anon class. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo '* already processed, skipping *'.PHP_EOL; - } - - $i = $this->tokens[$i]['scope_closer']; - continue; - } - - $i = self::recurseScopeMap($i, ($depth + 1), $ignore); - continue; - }//end if - - // Found another opening condition but still haven't - // found our opener, so we are never going to find one. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$stackPtr]['type']; - echo str_repeat("\t", $depth); - echo "=> Found new opening condition before scope opener for $stackPtr:$type, "; - } - - if (($this->tokens[$stackPtr]['code'] === T_IF - || $this->tokens[$stackPtr]['code'] === T_ELSEIF - || $this->tokens[$stackPtr]['code'] === T_ELSE) - && ($this->tokens[$i]['code'] === T_ELSE - || $this->tokens[$i]['code'] === T_ELSEIF) - ) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "continuing".PHP_EOL; - } - - return ($i - 1); - } else { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "backtracking".PHP_EOL; - } - - return $stackPtr; - } - }//end if - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo '* token is an opening condition *'.PHP_EOL; - } - - $isShared = ($this->scopeOpeners[$tokenType]['shared'] === true); - - if (isset($this->tokens[$i]['scope_condition']) === true) { - // We've been here before. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo '* already processed, skipping *'.PHP_EOL; - } - - if ($isShared === false - && isset($this->tokens[$i]['scope_closer']) === true - ) { - $i = $this->tokens[$i]['scope_closer']; - } - - continue; - } else if ($currType === $tokenType - && $isShared === false - && $opener === null - ) { - // We haven't yet found our opener, but we have found another - // scope opener which is the same type as us, and we don't - // share openers, so we will never find one. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo '* it was another token\'s opener, bailing *'.PHP_EOL; - } - - return $stackPtr; - } else { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo '* searching for opener *'.PHP_EOL; - } - - if (isset($this->scopeOpeners[$tokenType]['end'][T_CLOSE_CURLY_BRACKET]) === true) { - $oldIgnore = $ignore; - $ignore = 0; - } - - // PHP has a max nesting level for functions. Stop before we hit that limit - // because too many loops means we've run into trouble anyway. - if ($depth > 50) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo '* reached maximum nesting level; aborting *'.PHP_EOL; - } - - throw new TokenizerException('Maximum nesting level reached; file could not be processed'); - } - - $oldDepth = $depth; - if ($isShared === true - && isset($this->scopeOpeners[$tokenType]['with'][$currType]) === true - ) { - // Don't allow the depth to increment because this is - // possibly not a true nesting if we are sharing our closer. - // This can happen, for example, when a SWITCH has a large - // number of CASE statements with the same shared BREAK. - $depth--; - } - - $i = self::recurseScopeMap($i, ($depth + 1), $ignore); - $depth = $oldDepth; - - if (isset($this->scopeOpeners[$tokenType]['end'][T_CLOSE_CURLY_BRACKET]) === true) { - $ignore = $oldIgnore; - } - }//end if - }//end if - - if (isset($this->scopeOpeners[$currType]['start'][$tokenType]) === true - && $opener === null - ) { - if ($tokenType === T_OPEN_CURLY_BRACKET) { - if (isset($this->tokens[$stackPtr]['parenthesis_closer']) === true - && $i < $this->tokens[$stackPtr]['parenthesis_closer'] - ) { - // We found a curly brace inside the condition of the - // current scope opener, so it must be a string offset. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo '* ignoring curly brace inside condition *'.PHP_EOL; - } - - $ignore++; - } else { - // Make sure this is actually an opener and not a - // string offset (e.g., $var{0}). - for ($x = ($i - 1); $x > 0; $x--) { - if (isset(Tokens::$emptyTokens[$this->tokens[$x]['code']]) === true) { - continue; - } else { - // If the first non-whitespace/comment token looks like this - // brace is a string offset, or this brace is mid-way through - // a new statement, it isn't a scope opener. - $disallowed = Tokens::$assignmentTokens; - $disallowed += [ - T_DOLLAR => true, - T_VARIABLE => true, - T_OBJECT_OPERATOR => true, - T_NULLSAFE_OBJECT_OPERATOR => true, - T_COMMA => true, - T_OPEN_PARENTHESIS => true, - ]; - - if (isset($disallowed[$this->tokens[$x]['code']]) === true) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo '* ignoring curly brace *'.PHP_EOL; - } - - $ignore++; - } - - break; - }//end if - }//end for - }//end if - }//end if - - if ($ignore === 0 || $tokenType !== T_OPEN_CURLY_BRACKET) { - $openerNested = isset($this->tokens[$i]['nested_parenthesis']); - $ownerNested = isset($this->tokens[$stackPtr]['nested_parenthesis']); - - if (($openerNested === true && $ownerNested === false) - || ($openerNested === false && $ownerNested === true) - || ($openerNested === true - && $this->tokens[$i]['nested_parenthesis'] !== $this->tokens[$stackPtr]['nested_parenthesis']) - ) { - // We found the a token that looks like the opener, but it's nested differently. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$i]['type']; - echo str_repeat("\t", $depth); - echo "* ignoring possible opener $i:$type as nested parenthesis don't match *".PHP_EOL; - } - } else { - // We found the opening scope token for $currType. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$stackPtr]['type']; - echo str_repeat("\t", $depth); - echo "=> Found scope opener for $stackPtr:$type".PHP_EOL; - } - - $opener = $i; - } - }//end if - } else if ($tokenType === T_SEMICOLON - && $opener === null - && (isset($this->tokens[$stackPtr]['parenthesis_closer']) === false - || $i > $this->tokens[$stackPtr]['parenthesis_closer']) - ) { - // Found the end of a statement but still haven't - // found our opener, so we are never going to find one. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$stackPtr]['type']; - echo str_repeat("\t", $depth); - echo "=> Found end of statement before scope opener for $stackPtr:$type, continuing".PHP_EOL; - } - - return ($i - 1); - } else if ($tokenType === T_OPEN_PARENTHESIS) { - if (isset($this->tokens[$i]['parenthesis_owner']) === true) { - $owner = $this->tokens[$i]['parenthesis_owner']; - if (isset(Tokens::$scopeOpeners[$this->tokens[$owner]['code']]) === true - && isset($this->tokens[$i]['parenthesis_closer']) === true - ) { - // If we get into here, then we opened a parenthesis for - // a scope (eg. an if or else if) so we need to update the - // start of the line so that when we check to see - // if the closing parenthesis is more than n lines away from - // the statement, we check from the closing parenthesis. - $startLine = $this->tokens[$this->tokens[$i]['parenthesis_closer']]['line']; - } - } - } else if ($tokenType === T_OPEN_CURLY_BRACKET && $opener !== null) { - // We opened something that we don't have a scope opener for. - // Examples of this are curly brackets for string offsets etc. - // We want to ignore this so that we don't have an invalid scope - // map. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo '* ignoring curly brace *'.PHP_EOL; - } - - $ignore++; - } else if ($tokenType === T_CLOSE_CURLY_BRACKET && $ignore > 0) { - // We found the end token for the opener we were ignoring. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo '* finished ignoring curly brace *'.PHP_EOL; - } - - $ignore--; - } else if ($opener === null - && isset($this->scopeOpeners[$currType]) === true - ) { - // If we still haven't found the opener after 30 lines, - // we're not going to find it, unless we know it requires - // an opener (in which case we better keep looking) or the last - // token was empty (in which case we'll just confirm there is - // more code in this file and not just a big comment). - if ($this->tokens[$i]['line'] >= ($startLine + 30) - && isset(Tokens::$emptyTokens[$this->tokens[($i - 1)]['code']]) === false - ) { - if ($this->scopeOpeners[$currType]['strict'] === true) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$stackPtr]['type']; - $lines = ($this->tokens[$i]['line'] - $startLine); - echo str_repeat("\t", $depth); - echo "=> Still looking for $stackPtr:$type scope opener after $lines lines".PHP_EOL; - } - } else { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$stackPtr]['type']; - echo str_repeat("\t", $depth); - echo "=> Couldn't find scope opener for $stackPtr:$type, bailing".PHP_EOL; - } - - return $stackPtr; - } - } - } else if ($opener !== null - && $tokenType !== T_BREAK - && isset($this->endScopeTokens[$tokenType]) === true - ) { - if (isset($this->tokens[$i]['scope_condition']) === false) { - if ($ignore > 0) { - // We found the end token for the opener we were ignoring. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo '* finished ignoring curly brace *'.PHP_EOL; - } - - $ignore--; - } else { - // We found a token that closes the scope but it doesn't - // have a condition, so it belongs to another token and - // our token doesn't have a closer, so pretend this is - // the closer. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$stackPtr]['type']; - echo str_repeat("\t", $depth); - echo "=> Found (unexpected) scope closer for $stackPtr:$type".PHP_EOL; - } - - foreach ([$stackPtr, $opener] as $token) { - $this->tokens[$token]['scope_condition'] = $stackPtr; - $this->tokens[$token]['scope_opener'] = $opener; - $this->tokens[$token]['scope_closer'] = $i; - } - - return ($i - 1); - }//end if - }//end if - }//end if - }//end for - - return $stackPtr; - - }//end recurseScopeMap() - - - /** - * Constructs the level map. - * - * The level map adds a 'level' index to each token which indicates the - * depth that a token within a set of scope blocks. It also adds a - * 'conditions' index which is an array of the scope conditions that opened - * each of the scopes - position 0 being the first scope opener. - * - * @return void - */ - private function createLevelMap() - { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t*** START LEVEL MAP ***".PHP_EOL; - } - - $this->numTokens = count($this->tokens); - $level = 0; - $conditions = []; - $lastOpener = null; - $openers = []; - - for ($i = 0; $i < $this->numTokens; $i++) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$i]['type']; - $line = $this->tokens[$i]['line']; - $len = $this->tokens[$i]['length']; - $col = $this->tokens[$i]['column']; - - $content = Common::prepareForOutput($this->tokens[$i]['content']); - - echo str_repeat("\t", ($level + 1)); - echo "Process token $i on line $line [col:$col;len:$len;lvl:$level;"; - if (empty($conditions) !== true) { - $conditionString = 'conds;'; - foreach ($conditions as $condition) { - $conditionString .= Tokens::tokenName($condition).','; - } - - echo rtrim($conditionString, ',').';'; - } - - echo "]: $type => $content".PHP_EOL; - }//end if - - $this->tokens[$i]['level'] = $level; - $this->tokens[$i]['conditions'] = $conditions; - - if (isset($this->tokens[$i]['scope_condition']) === true) { - // Check to see if this token opened the scope. - if ($this->tokens[$i]['scope_opener'] === $i) { - $stackPtr = $this->tokens[$i]['scope_condition']; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$stackPtr]['type']; - echo str_repeat("\t", ($level + 1)); - echo "=> Found scope opener for $stackPtr:$type".PHP_EOL; - } - - $stackPtr = $this->tokens[$i]['scope_condition']; - - // If we find a scope opener that has a shared closer, - // then we need to go back over the condition map that we - // just created and fix ourselves as we just added some - // conditions where there was none. This happens for T_CASE - // statements that are using the same break statement. - if ($lastOpener !== null && $this->tokens[$lastOpener]['scope_closer'] === $this->tokens[$i]['scope_closer']) { - // This opener shares its closer with the previous opener, - // but we still need to check if the two openers share their - // closer with each other directly (like CASE and DEFAULT) - // or if they are just sharing because one doesn't have a - // closer (like CASE with no BREAK using a SWITCHes closer). - $thisType = $this->tokens[$this->tokens[$i]['scope_condition']]['code']; - $opener = $this->tokens[$lastOpener]['scope_condition']; - - $isShared = isset($this->scopeOpeners[$thisType]['with'][$this->tokens[$opener]['code']]); - - reset($this->scopeOpeners[$thisType]['end']); - reset($this->scopeOpeners[$this->tokens[$opener]['code']]['end']); - $sameEnd = (current($this->scopeOpeners[$thisType]['end']) === current($this->scopeOpeners[$this->tokens[$opener]['code']]['end'])); - - if ($isShared === true && $sameEnd === true) { - $badToken = $opener; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$badToken]['type']; - echo str_repeat("\t", ($level + 1)); - echo "* shared closer, cleaning up $badToken:$type *".PHP_EOL; - } - - for ($x = $this->tokens[$i]['scope_condition']; $x <= $i; $x++) { - $oldConditions = $this->tokens[$x]['conditions']; - $oldLevel = $this->tokens[$x]['level']; - $this->tokens[$x]['level']--; - unset($this->tokens[$x]['conditions'][$badToken]); - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$x]['type']; - $oldConds = ''; - foreach ($oldConditions as $condition) { - $oldConds .= Tokens::tokenName($condition).','; - } - - $oldConds = rtrim($oldConds, ','); - - $newConds = ''; - foreach ($this->tokens[$x]['conditions'] as $condition) { - $newConds .= Tokens::tokenName($condition).','; - } - - $newConds = rtrim($newConds, ','); - - $newLevel = $this->tokens[$x]['level']; - echo str_repeat("\t", ($level + 1)); - echo "* cleaned $x:$type *".PHP_EOL; - echo str_repeat("\t", ($level + 2)); - echo "=> level changed from $oldLevel to $newLevel".PHP_EOL; - echo str_repeat("\t", ($level + 2)); - echo "=> conditions changed from $oldConds to $newConds".PHP_EOL; - }//end if - }//end for - - unset($conditions[$badToken]); - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$badToken]['type']; - echo str_repeat("\t", ($level + 1)); - echo "* token $badToken:$type removed from conditions array *".PHP_EOL; - } - - unset($openers[$lastOpener]); - - $level--; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", ($level + 2)); - echo '* level decreased *'.PHP_EOL; - } - }//end if - }//end if - - $level++; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", ($level + 1)); - echo '* level increased *'.PHP_EOL; - } - - $conditions[$stackPtr] = $this->tokens[$stackPtr]['code']; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$stackPtr]['type']; - echo str_repeat("\t", ($level + 1)); - echo "* token $stackPtr:$type added to conditions array *".PHP_EOL; - } - - $lastOpener = $this->tokens[$i]['scope_opener']; - if ($lastOpener !== null) { - $openers[$lastOpener] = $lastOpener; - } - } else if ($lastOpener !== null && $this->tokens[$lastOpener]['scope_closer'] === $i) { - foreach (array_reverse($openers) as $opener) { - if ($this->tokens[$opener]['scope_closer'] === $i) { - $oldOpener = array_pop($openers); - if (empty($openers) === false) { - $lastOpener = array_pop($openers); - $openers[$lastOpener] = $lastOpener; - } else { - $lastOpener = null; - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$oldOpener]['type']; - echo str_repeat("\t", ($level + 1)); - echo "=> Found scope closer for $oldOpener:$type".PHP_EOL; - } - - $oldCondition = array_pop($conditions); - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", ($level + 1)); - echo '* token '.Tokens::tokenName($oldCondition).' removed from conditions array *'.PHP_EOL; - } - - // Make sure this closer actually belongs to us. - // Either the condition also has to think this is the - // closer, or it has to allow sharing with us. - $condition = $this->tokens[$this->tokens[$i]['scope_condition']]['code']; - if ($condition !== $oldCondition) { - if (isset($this->scopeOpeners[$oldCondition]['with'][$condition]) === false) { - $badToken = $this->tokens[$oldOpener]['scope_condition']; - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = Tokens::tokenName($oldCondition); - echo str_repeat("\t", ($level + 1)); - echo "* scope closer was bad, cleaning up $badToken:$type *".PHP_EOL; - } - - for ($x = ($oldOpener + 1); $x <= $i; $x++) { - $oldConditions = $this->tokens[$x]['conditions']; - $oldLevel = $this->tokens[$x]['level']; - $this->tokens[$x]['level']--; - unset($this->tokens[$x]['conditions'][$badToken]); - if (PHP_CODESNIFFER_VERBOSITY > 1) { - $type = $this->tokens[$x]['type']; - $oldConds = ''; - foreach ($oldConditions as $condition) { - $oldConds .= Tokens::tokenName($condition).','; - } - - $oldConds = rtrim($oldConds, ','); - - $newConds = ''; - foreach ($this->tokens[$x]['conditions'] as $condition) { - $newConds .= Tokens::tokenName($condition).','; - } - - $newConds = rtrim($newConds, ','); - - $newLevel = $this->tokens[$x]['level']; - echo str_repeat("\t", ($level + 1)); - echo "* cleaned $x:$type *".PHP_EOL; - echo str_repeat("\t", ($level + 2)); - echo "=> level changed from $oldLevel to $newLevel".PHP_EOL; - echo str_repeat("\t", ($level + 2)); - echo "=> conditions changed from $oldConds to $newConds".PHP_EOL; - }//end if - }//end for - }//end if - }//end if - - $level--; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", ($level + 2)); - echo '* level decreased *'.PHP_EOL; - } - - $this->tokens[$i]['level'] = $level; - $this->tokens[$i]['conditions'] = $conditions; - }//end if - }//end foreach - }//end if - }//end if - }//end for - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t*** END LEVEL MAP ***".PHP_EOL; - } - - }//end createLevelMap() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Util/Cache.php b/vendor/squizlabs/php_codesniffer/src/Util/Cache.php deleted file mode 100644 index c556f55..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Util/Cache.php +++ /dev/null @@ -1,355 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Util; - -use FilesystemIterator; -use PHP_CodeSniffer\Autoload; -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Ruleset; -use RecursiveCallbackFilterIterator; -use RecursiveDirectoryIterator; -use RecursiveIteratorIterator; - -class Cache -{ - - /** - * The filesystem location of the cache file. - * - * @var string - */ - private static $path = ''; - - /** - * The cached data. - * - * @var array - */ - private static $cache = []; - - - /** - * Loads existing cache data for the run, if any. - * - * @param \PHP_CodeSniffer\Ruleset $ruleset The ruleset used for the run. - * @param \PHP_CodeSniffer\Config $config The config data for the run. - * - * @return void - */ - public static function load(Ruleset $ruleset, Config $config) - { - // Look at every loaded sniff class so far and use their file contents - // to generate a hash for the code used during the run. - // At this point, the loaded class list contains the core PHPCS code - // and all sniffs that have been loaded as part of the run. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo PHP_EOL."\tGenerating loaded file list for code hash".PHP_EOL; - } - - $codeHashFiles = []; - - $classes = array_keys(Autoload::getLoadedClasses()); - sort($classes); - - $installDir = dirname(__DIR__); - $installDirLen = strlen($installDir); - $standardDir = $installDir.DIRECTORY_SEPARATOR.'Standards'; - $standardDirLen = strlen($standardDir); - foreach ($classes as $file) { - if (substr($file, 0, $standardDirLen) !== $standardDir) { - if (substr($file, 0, $installDirLen) === $installDir) { - // We are only interested in sniffs here. - continue; - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t=> external file: $file".PHP_EOL; - } - } else if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t=> internal sniff: $file".PHP_EOL; - } - - $codeHashFiles[] = $file; - } - - // Add the content of the used rulesets to the hash so that sniff setting - // changes in the ruleset invalidate the cache. - $rulesets = $ruleset->paths; - sort($rulesets); - foreach ($rulesets as $file) { - if (substr($file, 0, $standardDirLen) !== $standardDir) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t=> external ruleset: $file".PHP_EOL; - } - } else if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t=> internal ruleset: $file".PHP_EOL; - } - - $codeHashFiles[] = $file; - } - - // Go through the core PHPCS code and add those files to the file - // hash. This ensures that core PHPCS changes will also invalidate the cache. - // Note that we ignore sniffs here, and any files that don't affect - // the outcome of the run. - $di = new RecursiveDirectoryIterator( - $installDir, - (FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS) - ); - $filter = new RecursiveCallbackFilterIterator( - $di, - static function ($file, $key, $iterator) { - // Skip non-php files. - $filename = $file->getFilename(); - if ($file->isFile() === true && substr($filename, -4) !== '.php') { - return false; - } - - $filePath = Common::realpath($key); - if ($filePath === false) { - return false; - } - - if ($iterator->hasChildren() === true - && ($filename === 'Standards' - || $filename === 'Exceptions' - || $filename === 'Reports' - || $filename === 'Generators') - ) { - return false; - } - - return true; - } - ); - - $iterator = new RecursiveIteratorIterator($filter); - foreach ($iterator as $file) { - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t=> core file: $file".PHP_EOL; - } - - $codeHashFiles[] = $file->getPathname(); - } - - $codeHash = ''; - sort($codeHashFiles); - foreach ($codeHashFiles as $file) { - $codeHash .= md5_file($file); - } - - $codeHash = md5($codeHash); - - // Along with the code hash, use various settings that can affect - // the results of a run to create a new hash. This hash will be used - // in the cache file name. - $rulesetHash = md5(var_export($ruleset->ignorePatterns, true).var_export($ruleset->includePatterns, true)); - $phpExtensionsHash = md5(var_export(get_loaded_extensions(), true)); - $configData = [ - 'phpVersion' => PHP_VERSION_ID, - 'phpExtensions' => $phpExtensionsHash, - 'tabWidth' => $config->tabWidth, - 'encoding' => $config->encoding, - 'recordErrors' => $config->recordErrors, - 'annotations' => $config->annotations, - 'configData' => Config::getAllConfigData(), - 'codeHash' => $codeHash, - 'rulesetHash' => $rulesetHash, - ]; - - $configString = var_export($configData, true); - $cacheHash = substr(sha1($configString), 0, 12); - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\tGenerating cache key data".PHP_EOL; - foreach ($configData as $key => $value) { - if (is_array($value) === true) { - echo "\t\t=> $key:".PHP_EOL; - foreach ($value as $subKey => $subValue) { - echo "\t\t\t=> $subKey: $subValue".PHP_EOL; - } - - continue; - } - - if ($value === true || $value === false) { - $value = (int) $value; - } - - echo "\t\t=> $key: $value".PHP_EOL; - } - - echo "\t\t=> cacheHash: $cacheHash".PHP_EOL; - }//end if - - if ($config->cacheFile !== null) { - $cacheFile = $config->cacheFile; - } else { - // Determine the common paths for all files being checked. - // We can use this to locate an existing cache file, or to - // determine where to create a new one. - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\tChecking possible cache file paths".PHP_EOL; - } - - $paths = []; - foreach ($config->files as $file) { - $file = Common::realpath($file); - while ($file !== DIRECTORY_SEPARATOR) { - if (isset($paths[$file]) === false) { - $paths[$file] = 1; - } else { - $paths[$file]++; - } - - $lastFile = $file; - $file = dirname($file); - if ($file === $lastFile) { - // Just in case something went wrong, - // we don't want to end up in an infinite loop. - break; - } - } - } - - ksort($paths); - $paths = array_reverse($paths); - - $numFiles = count($config->files); - - $cacheFile = null; - $cacheDir = getenv('XDG_CACHE_HOME'); - if ($cacheDir === false || is_dir($cacheDir) === false) { - $cacheDir = sys_get_temp_dir(); - } - - foreach ($paths as $file => $count) { - if ($count !== $numFiles) { - unset($paths[$file]); - continue; - } - - $fileHash = substr(sha1($file), 0, 12); - $testFile = $cacheDir.DIRECTORY_SEPARATOR."phpcs.$fileHash.$cacheHash.cache"; - if ($cacheFile === null) { - // This will be our default location if we can't find - // an existing file. - $cacheFile = $testFile; - } - - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t\t=> $testFile".PHP_EOL; - echo "\t\t\t * based on shared location: $file *".PHP_EOL; - } - - if (file_exists($testFile) === true) { - $cacheFile = $testFile; - break; - } - }//end foreach - - if ($cacheFile === null) { - // Unlikely, but just in case $paths is empty for some reason. - $cacheFile = $cacheDir.DIRECTORY_SEPARATOR."phpcs.$cacheHash.cache"; - } - }//end if - - self::$path = $cacheFile; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t=> Using cache file: ".self::$path.PHP_EOL; - } - - if (file_exists(self::$path) === true) { - self::$cache = json_decode(file_get_contents(self::$path), true); - - // Verify the contents of the cache file. - if (self::$cache['config'] !== $configData) { - self::$cache = []; - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t* cache was invalid and has been cleared *".PHP_EOL; - } - } - } else if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo "\t* cache file does not exist *".PHP_EOL; - } - - self::$cache['config'] = $configData; - - }//end load() - - - /** - * Saves the current cache to the filesystem. - * - * @return void - */ - public static function save() - { - file_put_contents(self::$path, json_encode(self::$cache)); - - }//end save() - - - /** - * Retrieves a single entry from the cache. - * - * @param string|null $key The key of the data to get. If NULL, - * everything in the cache is returned. - * - * @return mixed - */ - public static function get($key=null) - { - if ($key === null) { - return self::$cache; - } - - if (isset(self::$cache[$key]) === true) { - return self::$cache[$key]; - } - - return false; - - }//end get() - - - /** - * Retrieves a single entry from the cache. - * - * @param string|null $key The key of the data to set. If NULL, - * sets the entire cache. - * @param mixed $value The value to set. - * - * @return void - */ - public static function set($key, $value) - { - if ($key === null) { - self::$cache = $value; - } else { - self::$cache[$key] = $value; - } - - }//end set() - - - /** - * Retrieves the number of cache entries. - * - * @return int - */ - public static function getSize() - { - return (count(self::$cache) - 1); - - }//end getSize() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Util/Common.php b/vendor/squizlabs/php_codesniffer/src/Util/Common.php deleted file mode 100644 index 69d25bf..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Util/Common.php +++ /dev/null @@ -1,605 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Util; - -use InvalidArgumentException; -use Phar; - -class Common -{ - - /** - * An array of variable types for param/var we will check. - * - * @var string[] - */ - public static $allowedTypes = [ - 'array', - 'boolean', - 'float', - 'integer', - 'mixed', - 'object', - 'string', - 'resource', - 'callable', - ]; - - - /** - * Return TRUE if the path is a PHAR file. - * - * @param string $path The path to use. - * - * @return bool - */ - public static function isPharFile($path) - { - if (strpos($path, 'phar://') === 0) { - return true; - } - - return false; - - }//end isPharFile() - - - /** - * Checks if a file is readable. - * - * Addresses PHP bug related to reading files from network drives on Windows. - * e.g. when using WSL2. - * - * @param string $path The path to the file. - * - * @return boolean - */ - public static function isReadable($path) - { - if (@is_readable($path) === true) { - return true; - } - - if (@file_exists($path) === true && @is_file($path) === true) { - $f = @fopen($path, 'rb'); - if (fclose($f) === true) { - return true; - } - } - - return false; - - }//end isReadable() - - - /** - * CodeSniffer alternative for realpath. - * - * Allows for PHAR support. - * - * @param string $path The path to use. - * - * @return string|false - */ - public static function realpath($path) - { - // Support the path replacement of ~ with the user's home directory. - if (substr($path, 0, 2) === '~/') { - $homeDir = getenv('HOME'); - if ($homeDir !== false) { - $path = $homeDir.substr($path, 1); - } - } - - // Check for process substitution. - if (strpos($path, '/dev/fd') === 0) { - return str_replace('/dev/fd', 'php://fd', $path); - } - - // No extra work needed if this is not a phar file. - if (self::isPharFile($path) === false) { - return realpath($path); - } - - // Before trying to break down the file path, - // check if it exists first because it will mostly not - // change after running the below code. - if (file_exists($path) === true) { - return $path; - } - - $phar = Phar::running(false); - $extra = str_replace('phar://'.$phar, '', $path); - $path = realpath($phar); - if ($path === false) { - return false; - } - - $path = 'phar://'.$path.$extra; - if (file_exists($path) === true) { - return $path; - } - - return false; - - }//end realpath() - - - /** - * Removes a base path from the front of a file path. - * - * @param string $path The path of the file. - * @param string|null $basepath The base path to remove. This should not end - * with a directory separator. - * - * @return string - */ - public static function stripBasepath($path, $basepath) - { - if (empty($basepath) === true) { - return $path; - } - - $basepathLen = strlen($basepath); - if (substr($path, 0, $basepathLen) === $basepath) { - $path = substr($path, $basepathLen); - } - - $path = ltrim($path, DIRECTORY_SEPARATOR); - if ($path === '') { - $path = '.'; - } - - return $path; - - }//end stripBasepath() - - - /** - * Detects the EOL character being used in a string. - * - * @param string $contents The contents to check. - * - * @return string - */ - public static function detectLineEndings($contents) - { - if (preg_match("/\r\n?|\n/", $contents, $matches) !== 1) { - // Assume there are no newlines. - $eolChar = "\n"; - } else { - $eolChar = $matches[0]; - } - - return $eolChar; - - }//end detectLineEndings() - - - /** - * Check if STDIN is a TTY. - * - * @return boolean - */ - public static function isStdinATTY() - { - // The check is slow (especially calling `tty`) so we static - // cache the result. - static $isTTY = null; - - if ($isTTY !== null) { - return $isTTY; - } - - if (defined('STDIN') === false) { - return false; - } - - // If PHP has the POSIX extensions we will use them. - if (function_exists('posix_isatty') === true) { - $isTTY = (posix_isatty(STDIN) === true); - return $isTTY; - } - - // Next try is detecting whether we have `tty` installed and use that. - if (defined('PHP_WINDOWS_VERSION_PLATFORM') === true) { - $devnull = 'NUL'; - $which = 'where'; - } else { - $devnull = '/dev/null'; - $which = 'which'; - } - - $tty = trim(shell_exec("$which tty 2> $devnull")); - if (empty($tty) === false) { - exec("tty -s 2> $devnull", $output, $returnValue); - $isTTY = ($returnValue === 0); - return $isTTY; - } - - // Finally we will use fstat. The solution borrowed from - // https://stackoverflow.com/questions/11327367/detect-if-a-php-script-is-being-run-interactively-or-not - // This doesn't work on Mingw/Cygwin/... using Mintty but they - // have `tty` installed. - $type = [ - 'S_IFMT' => 0170000, - 'S_IFIFO' => 0010000, - ]; - - $stat = fstat(STDIN); - $mode = ($stat['mode'] & $type['S_IFMT']); - $isTTY = ($mode !== $type['S_IFIFO']); - - return $isTTY; - - }//end isStdinATTY() - - - /** - * Escape a path to a system command. - * - * @param string $cmd The path to the system command. - * - * @return string - */ - public static function escapeshellcmd($cmd) - { - $cmd = escapeshellcmd($cmd); - - if (stripos(PHP_OS, 'WIN') === 0) { - // Spaces are not escaped by escapeshellcmd on Windows, but need to be - // for the command to be able to execute. - $cmd = preg_replace('`(? 0) { - return false; - } - - if ($strict === true) { - // Check that there are not two capital letters next to each other. - $length = strlen($string); - $lastCharWasCaps = $classFormat; - - for ($i = 1; $i < $length; $i++) { - $ascii = ord($string[$i]); - if ($ascii >= 48 && $ascii <= 57) { - // The character is a number, so it can't be a capital. - $isCaps = false; - } else { - if (strtoupper($string[$i]) === $string[$i]) { - $isCaps = true; - } else { - $isCaps = false; - } - } - - if ($isCaps === true && $lastCharWasCaps === true) { - return false; - } - - $lastCharWasCaps = $isCaps; - } - }//end if - - return true; - - }//end isCamelCaps() - - - /** - * Returns true if the specified string is in the underscore caps format. - * - * @param string $string The string to verify. - * - * @return boolean - */ - public static function isUnderscoreName($string) - { - // If there is whitespace in the name, it can't be valid. - if (strpos($string, ' ') !== false) { - return false; - } - - $validName = true; - $nameBits = explode('_', $string); - - if (preg_match('|^[A-Z]|', $string) === 0) { - // Name does not begin with a capital letter. - $validName = false; - } else { - foreach ($nameBits as $bit) { - if ($bit === '') { - continue; - } - - if ($bit[0] !== strtoupper($bit[0])) { - $validName = false; - break; - } - } - } - - return $validName; - - }//end isUnderscoreName() - - - /** - * Returns a valid variable type for param/var tags. - * - * If type is not one of the standard types, it must be a custom type. - * Returns the correct type name suggestion if type name is invalid. - * - * @param string $varType The variable type to process. - * - * @return string - */ - public static function suggestType($varType) - { - if ($varType === '') { - return ''; - } - - if (in_array($varType, self::$allowedTypes, true) === true) { - return $varType; - } else { - $lowerVarType = strtolower($varType); - switch ($lowerVarType) { - case 'bool': - case 'boolean': - return 'boolean'; - case 'double': - case 'real': - case 'float': - return 'float'; - case 'int': - case 'integer': - return 'integer'; - case 'array()': - case 'array': - return 'array'; - }//end switch - - if (strpos($lowerVarType, 'array(') !== false) { - // Valid array declaration: - // array, array(type), array(type1 => type2). - $matches = []; - $pattern = '/^array\(\s*([^\s^=^>]*)(\s*=>\s*(.*))?\s*\)/i'; - if (preg_match($pattern, $varType, $matches) !== 0) { - $type1 = ''; - if (isset($matches[1]) === true) { - $type1 = $matches[1]; - } - - $type2 = ''; - if (isset($matches[3]) === true) { - $type2 = $matches[3]; - } - - $type1 = self::suggestType($type1); - $type2 = self::suggestType($type2); - if ($type2 !== '') { - $type2 = ' => '.$type2; - } - - return "array($type1$type2)"; - } else { - return 'array'; - }//end if - } else if (in_array($lowerVarType, self::$allowedTypes, true) === true) { - // A valid type, but not lower cased. - return $lowerVarType; - } else { - // Must be a custom type name. - return $varType; - }//end if - }//end if - - }//end suggestType() - - - /** - * Given a sniff class name, returns the code for the sniff. - * - * @param string $sniffClass The fully qualified sniff class name. - * - * @return string - * - * @throws \InvalidArgumentException When $sniffClass is not a non-empty string. - * @throws \InvalidArgumentException When $sniffClass is not a FQN for a sniff(test) class. - */ - public static function getSniffCode($sniffClass) - { - if (is_string($sniffClass) === false || $sniffClass === '') { - throw new InvalidArgumentException('The $sniffClass parameter must be a non-empty string'); - } - - $parts = explode('\\', $sniffClass); - $partsCount = count($parts); - $sniff = $parts[($partsCount - 1)]; - - if (substr($sniff, -5) === 'Sniff') { - // Sniff class name. - $sniff = substr($sniff, 0, -5); - } else if (substr($sniff, -8) === 'UnitTest') { - // Unit test class name. - $sniff = substr($sniff, 0, -8); - } else { - throw new InvalidArgumentException( - 'The $sniffClass parameter was not passed a fully qualified sniff(test) class name. Received: '.$sniffClass - ); - } - - $standard = ''; - if (isset($parts[($partsCount - 4)]) === true) { - $standard = $parts[($partsCount - 4)]; - } - - $category = ''; - if (isset($parts[($partsCount - 2)]) === true) { - $category = $parts[($partsCount - 2)]; - } - - return $standard.'.'.$category.'.'.$sniff; - - }//end getSniffCode() - - - /** - * Removes project-specific information from a sniff class name. - * - * @param string $sniffClass The fully qualified sniff class name. - * - * @return string - */ - public static function cleanSniffClass($sniffClass) - { - $newName = strtolower($sniffClass); - - $sniffPos = strrpos($newName, '\sniffs\\'); - if ($sniffPos === false) { - // Nothing we can do as it isn't in a known format. - return $newName; - } - - $end = (strlen($newName) - $sniffPos + 1); - $start = strrpos($newName, '\\', ($end * -1)); - - if ($start === false) { - // Nothing needs to be cleaned. - return $newName; - } - - $newName = substr($newName, ($start + 1)); - return $newName; - - }//end cleanSniffClass() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Util/Help.php b/vendor/squizlabs/php_codesniffer/src/Util/Help.php deleted file mode 100644 index f90aa78..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Util/Help.php +++ /dev/null @@ -1,626 +0,0 @@ - - * @copyright 2024 Juliette Reinders Folmer. All rights reserved. - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Util; - -use InvalidArgumentException; -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Util\Common; - -final class Help -{ - - - /** - * Short options which are available for both the `phpcs` as well as the `phpcbf` command. - * - * @var string - */ - const DEFAULT_SHORT_OPTIONS = '-hilnpqvw'; - - /** - * Long options which are available for both the `phpcs` as well as the `phpcbf` command. - * - * {@internal This should be a constant array, but those aren't supported until PHP 5.6.} - * - * @var string Comma-separated list of the option names. - */ - const DEFAULT_LONG_OPTIONS = 'basepath,bootstrap,colors,encoding,error-severity,exclude,extensions,file,file-list,filter,ignore,ignore-annotations,no-colors,parallel,php-ini,report-width,runtime-set,severity,sniffs,standard,stdin-path,tab-width,version,vv,vvv,warning-severity'; - - /** - * Minimum screen width. - * - * The help info needs room to display, so this is the minimum acceptable width. - * - * @var integer - */ - const MIN_WIDTH = 60; - - /** - * Indent option lines. - * - * @var string - */ - const INDENT = ' '; - - /** - * Gutter spacing for between the option argument info and the option description. - * - * @var string - */ - const GUTTER = ' '; - - /** - * The current PHPCS Configuration. - * - * @var \PHP_CodeSniffer\Config - */ - private $config; - - /** - * The options which should be shown for this help screen. - * - * @var array - */ - private $requestedOptions = []; - - /** - * Active options per category (after filtering). - * - * @var array>> - */ - private $activeOptions = []; - - /** - * Width of the indent for option lines. - * - * @var integer - */ - private $indentWidth = 0; - - /** - * Width of the gutter spacing. - * - * @var integer - */ - private $gutterWidth = 0; - - /** - * Width of longest option argument info entry. - * - * @var integer - */ - private $maxOptionNameLength = 0; - - - /** - * Constructor. - * - * @param \PHP_CodeSniffer\Config $config Configuration object. - * @param array $longOptions The long options which should be shown. - * @param string $shortOptions The short options which should be shown. - * - * @throws \InvalidArgumentException When $shortOptions is not a string. - */ - public function __construct(Config $config, array $longOptions, $shortOptions='') - { - if (is_string($shortOptions) === false) { - throw new InvalidArgumentException('The $shortOptions parameter must be a string'); - } - - $this->config = $config; - $this->requestedOptions = array_merge($longOptions, str_split($shortOptions)); - - $this->filterOptions(); - - $this->indentWidth = strlen(self::INDENT); - $this->gutterWidth = strlen(self::GUTTER); - - $this->setMaxOptionNameLength(); - - }//end __construct() - - - /** - * Display the help info. - * - * @return void - */ - public function display() - { - $this->printUsage(); - $this->printCategories(); - - }//end display() - - - /** - * Filter the available options based on the requested options. - * - * @return void - */ - private function filterOptions() - { - $filteredOptions = $this->getAllOptions(); - - foreach ($filteredOptions as $category => $options) { - // Initial state set to "true" to prevent a spacer at the start of an array. - $lastWasSpacer = true; - $spacerCount = 0; - - foreach ($options as $name => $option) { - if ($lastWasSpacer !== true && strpos($name, 'blank-line') === 0) { - ++$spacerCount; - $lastWasSpacer = true; - continue; - } - - if (in_array($name, $this->requestedOptions, true) === false) { - unset($filteredOptions[$category][$name]); - continue; - } - - $lastWasSpacer = false; - } - - // Make sure the final array doesn't contain a spacer at the end. - if (empty($filteredOptions[$category]) === false) { - end($filteredOptions[$category]); - $key = key($filteredOptions[$category]); - if (strpos($key, 'blank-line') === 0) { - unset($filteredOptions[$category][$key]); - --$spacerCount; - } - } - - // Remove categories now left empty. - if (empty($filteredOptions[$category]) === true || count($filteredOptions[$category]) === $spacerCount) { - unset($filteredOptions[$category]); - } - }//end foreach - - $this->activeOptions = $filteredOptions; - - }//end filterOptions() - - - /** - * Determine the length of the longest option argument and store it. - * - * @return void - */ - private function setMaxOptionNameLength() - { - $lengths = []; - foreach ($this->activeOptions as $category => $options) { - foreach ($options as $option) { - if (isset($option['argument']) === false) { - continue; - } - - $lengths[] = strlen($option['argument']); - } - } - - if (empty($lengths) === false) { - $this->maxOptionNameLength = max($lengths); - } - - }//end setMaxOptionNameLength() - - - /** - * Get the maximum width which can be used to display the help info. - * - * Independently of user preference/auto-determined width of the current screen, - * a minimum width is needed to display information, so don't allow this to get too low. - * - * @return int - */ - private function getMaxWidth() - { - return max(self::MIN_WIDTH, $this->config->reportWidth); - - }//end getMaxWidth() - - - /** - * Get the maximum width for the text in the option description column. - * - * @return int - */ - private function getDescriptionColumnWidth() - { - return ($this->getMaxWidth() - $this->maxOptionNameLength - $this->indentWidth - $this->gutterWidth); - - }//end getDescriptionColumnWidth() - - - /** - * Get the length of the indentation needed for follow up lines when the description does not fit on one line. - * - * @return int - */ - private function getDescriptionFollowupLineIndentLength() - { - return ($this->maxOptionNameLength + $this->indentWidth + $this->gutterWidth); - - }//end getDescriptionFollowupLineIndentLength() - - - /** - * Print basic usage information to the screen. - * - * @return void - */ - private function printUsage() - { - $command = 'phpcs'; - if (defined('PHP_CODESNIFFER_CBF') === true && PHP_CODESNIFFER_CBF === true) { - $command = 'phpcbf'; - } - - $this->printCategoryHeader('Usage'); - - echo self::INDENT.$command.' [options] '.PHP_EOL; - - }//end printUsage() - - - /** - * Print details of all the requested options to the screen, sorted by category. - * - * @return void - */ - private function printCategories() - { - foreach ($this->activeOptions as $category => $options) { - $this->printCategoryHeader($category); - $this->printCategoryOptions($options); - } - - }//end printCategories() - - - /** - * Print a category header. - * - * @param string $header The header text. - * - * @return void - */ - private function printCategoryHeader($header) - { - $header .= ':'; - if ($this->config->colors === true) { - $header = "\033[33m{$header}\033[0m"; - } - - echo PHP_EOL.$header.PHP_EOL; - - }//end printCategoryHeader() - - - /** - * Print the options for a category. - * - * @param array> $options The options to display. - * - * @return void - */ - private function printCategoryOptions(array $options) - { - $maxDescriptionWidth = $this->getDescriptionColumnWidth(); - $maxTextWidth = ($this->getMaxWidth() - $this->indentWidth); - $secondLineIndent = str_repeat(' ', $this->getDescriptionFollowupLineIndentLength()); - - $output = ''; - foreach ($options as $option) { - if (isset($option['spacer']) === true) { - $output .= PHP_EOL; - } - - if (isset($option['text']) === true) { - $text = wordwrap($option['text'], $maxTextWidth, "\n"); - $output .= self::INDENT.implode(PHP_EOL.self::INDENT, explode("\n", $text)).PHP_EOL; - } - - if (isset($option['argument'], $option['description']) === true) { - $argument = str_pad($option['argument'], $this->maxOptionNameLength); - $argument = $this->colorizeVariableInput($argument); - $output .= self::INDENT."\033[32m{$argument}\033[0m"; - $output .= self::GUTTER; - - $description = wordwrap($option['description'], $maxDescriptionWidth, "\n"); - $output .= implode(PHP_EOL.$secondLineIndent, explode("\n", $description)).PHP_EOL; - } - } - - if ($this->config->colors === false) { - $output = Common::stripColors($output); - } - - echo $output; - - }//end printCategoryOptions() - - - /** - * Colorize "variable" input in the option argument info. - * - * For the purposes of this method, "variable" input is text between <> brackets. - * The regex allows for multiple tags and nested tags. - * - * @param string $text The text to process. - * - * @return string - */ - private function colorizeVariableInput($text) - { - return preg_replace('`(<(?:(?>[^<>]+)|(?R))*>)`', "\033[36m".'$1'."\033[32m", $text); - - }//end colorizeVariableInput() - - - /** - * Retrieve the help details for all supported CLI arguments per category. - * - * @return array>> - */ - private function getAllOptions() - { - $options = []; - - // phpcs:disable Squiz.Strings.ConcatenationSpacing.PaddingFound -- Readability is more important. - $options['Scan targets'] = [ - 'file' => [ - 'argument' => '', - 'description' => 'One or more files and/or directories to check, space separated.', - ], - '-' => [ - 'argument' => '-', - 'description' => 'Check STDIN instead of local files and directories.', - ], - 'stdin-path' => [ - 'argument' => '--stdin-path=', - 'description' => 'If processing STDIN, the file path that STDIN will be processed as.', - ], - 'file-list' => [ - 'argument' => '--file-list=', - 'description' => 'Check the files and/or directories which are defined in the file to which the path is provided (one per line).', - ], - 'filter' => [ - 'argument' => '--filter=', - 'description' => 'Check based on a predefined file filter. Use either the "GitModified" or "GitStaged" filter, or specify the path to a custom filter class.', - ], - 'ignore' => [ - 'argument' => '--ignore=', - 'description' => 'Ignore files based on a comma-separated list of patterns matching files and/or directories.', - ], - 'extensions' => [ - 'argument' => '--extensions=', - 'description' => 'Check files with the specified file extensions (comma-separated list). Defaults to php,inc/php,js,css.'."\n" - .'The type of the file can be specified using: ext/type; e.g. module/php,es/js.', - ], - 'l' => [ - 'argument' => '-l', - 'description' => 'Check local directory only, no recursion.', - ], - ]; - - $options['Rule Selection Options'] = [ - 'standard' => [ - 'argument' => '--standard=', - 'description' => 'The name of, or the path to, the coding standard to use. Can be a comma-separated list specifying multiple standards. If no standard is specified, PHP_CodeSniffer will look for a [.]phpcs.xml[.dist] custom ruleset file in the current directory and those above it.', - ], - 'sniffs' => [ - 'argument' => '--sniffs=', - 'description' => 'A comma-separated list of sniff codes to limit the scan to. All sniffs must be part of the standard in use.', - ], - 'exclude' => [ - 'argument' => '--exclude=', - 'description' => 'A comma-separated list of sniff codes to exclude from the scan. All sniffs must be part of the standard in use.', - ], - 'blank-line' => ['spacer' => ''], - - 'i' => [ - 'argument' => '-i', - 'description' => 'Show a list of installed coding standards.', - ], - 'e' => [ - 'argument' => '-e', - 'description' => 'Explain a standard by showing the names of all the sniffs it includes.', - ], - 'generator' => [ - 'argument' => '--generator=', - 'description' => 'Show documentation for a standard. Use either the "HTML", "Markdown" or "Text" generator.', - ], - ]; - - $options['Run Options'] = [ - 'a' => [ - 'argument' => '-a', - 'description' => 'Run in interactive mode, pausing after each file.', - ], - 'bootstrap' => [ - 'argument' => '--bootstrap=', - 'description' => 'Run the specified file(s) before processing begins. A list of files can be provided, separated by commas.', - ], - 'cache' => [ - 'argument' => '--cache[=]', - 'description' => 'Cache results between runs. Optionally, can be provided to use a specific file for caching. Otherwise, a temporary file is used.', - ], - 'no-cache' => [ - 'argument' => '--no-cache', - 'description' => 'Do not cache results between runs (default).', - ], - 'parallel' => [ - 'argument' => '--parallel=', - 'description' => 'The number of files to be checked simultaneously. Defaults to 1 (no parallel processing).'."\n" - .'If enabled, this option only takes effect if the PHP PCNTL (Process Control) extension is available.', - ], - 'suffix' => [ - 'argument' => '--suffix=', - 'description' => 'Write modified files to a filename using this suffix ("diff" and "patch" are not used in this mode).', - ], - 'blank-line' => ['spacer' => ''], - - 'php-ini' => [ - 'argument' => '-d ', - 'description' => 'Set the [key] php.ini value to [value] or set to [true] if value is omitted.'."\n" - .'Note: only php.ini settings which can be changed at runtime are supported.', - ], - ]; - - $options['Reporting Options'] = [ - 'report' => [ - 'argument' => '--report=', - 'description' => 'A comma-separated list of reports to print. Available reports: "full", "xml", "checkstyle", "csv", "json", "junit", "emacs", "source", "summary", "diff", "svnblame", "gitblame", "hgblame", "notifysend" or "performance".'."\n" - .'Or specify the path to a custom report class. By default, the "full" report is displayed.', - ], - 'report-file' => [ - 'argument' => '--report-file=', - 'description' => 'Write the report to the specified file path.', - ], - 'report-report' => [ - 'argument' => '--report-=', - 'description' => 'Write the report specified in to the specified file path.', - ], - 'report-width' => [ - 'argument' => '--report-width=', - 'description' => 'How many columns wide screen reports should be. Set to "auto" to use current screen width, where supported.', - ], - 'basepath' => [ - 'argument' => '--basepath=', - 'description' => 'Strip a path from the front of file paths inside reports.', - ], - 'blank-line-1' => ['spacer' => ''], - - 'w' => [ - 'argument' => '-w', - 'description' => 'Include both warnings and errors (default).', - ], - 'n' => [ - 'argument' => '-n', - 'description' => 'Do not include warnings. Shortcut for "--warning-severity=0".', - ], - 'severity' => [ - 'argument' => '--severity=', - 'description' => 'The minimum severity required to display an error or warning. Defaults to 5.', - ], - 'error-severity' => [ - 'argument' => '--error-severity=', - 'description' => 'The minimum severity required to display an error. Defaults to 5.', - ], - 'warning-severity' => [ - 'argument' => '--warning-severity=', - 'description' => 'The minimum severity required to display a warning. Defaults to 5.', - ], - 'blank-line-2' => ['spacer' => ''], - - 's' => [ - 'argument' => '-s', - 'description' => 'Show sniff error codes in all reports.', - ], - 'ignore-annotations' => [ - 'argument' => '--ignore-annotations', - 'description' => 'Ignore all "phpcs:..." annotations in code comments.', - ], - 'colors' => [ - 'argument' => '--colors', - 'description' => 'Use colors in screen output.', - ], - 'no-colors' => [ - 'argument' => '--no-colors', - 'description' => 'Do not use colors in screen output (default).', - ], - 'p' => [ - 'argument' => '-p', - 'description' => 'Show progress of the run.', - ], - 'q' => [ - 'argument' => '-q', - 'description' => 'Quiet mode; disables progress and verbose output.', - ], - 'm' => [ - 'argument' => '-m', - 'description' => 'Stop error messages from being recorded. This saves a lot of memory but stops many reports from being used.', - ], - ]; - - $options['Configuration Options'] = [ - 'encoding' => [ - 'argument' => '--encoding=', - 'description' => 'The encoding of the files being checked. Defaults to "utf-8".', - ], - 'tab-width' => [ - 'argument' => '--tab-width=', - 'description' => 'The number of spaces each tab represents.', - ], - 'blank-line' => ['spacer' => ''], - - 'config-explain' => [ - 'text' => 'Default values for a selection of options can be stored in a user-specific CodeSniffer.conf configuration file.'."\n" - .'This applies to the following options: "default_standard", "report_format", "tab_width", "encoding", "severity", "error_severity", "warning_severity", "show_warnings", "report_width", "show_progress", "quiet", "colors", "cache", "parallel", "installed_paths", "php_version", "ignore_errors_on_exit", "ignore_warnings_on_exit".', - ], - 'config-show' => [ - 'argument' => '--config-show', - 'description' => 'Show the configuration options which are currently stored in the applicable CodeSniffer.conf file.', - ], - 'config-set' => [ - 'argument' => '--config-set ', - 'description' => 'Save a configuration option to the CodeSniffer.conf file.', - ], - 'config-delete' => [ - 'argument' => '--config-delete ', - 'description' => 'Delete a configuration option from the CodeSniffer.conf file.', - ], - 'runtime-set' => [ - 'argument' => '--runtime-set ', - 'description' => 'Set a configuration option to be applied to the current scan run only.', - ], - ]; - - $options['Miscellaneous Options'] = [ - 'h' => [ - 'argument' => '-h, -?, --help', - 'description' => 'Print this help message.', - ], - 'version' => [ - 'argument' => '--version', - 'description' => 'Print version information.', - ], - 'v' => [ - 'argument' => '-v', - 'description' => 'Verbose output: Print processed files.', - ], - 'vv' => [ - 'argument' => '-vv', - 'description' => 'Verbose output: Print ruleset and token output.', - ], - 'vvv' => [ - 'argument' => '-vvv', - 'description' => 'Verbose output: Print sniff processing information.', - ], - ]; - // phpcs:enable - - return $options; - - }//end getAllOptions() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Util/MessageCollector.php b/vendor/squizlabs/php_codesniffer/src/Util/MessageCollector.php deleted file mode 100644 index 655cd6b..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Util/MessageCollector.php +++ /dev/null @@ -1,310 +0,0 @@ - - * @copyright 2025 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Util; - -use InvalidArgumentException; -use PHP_CodeSniffer\Exceptions\RuntimeException; - -final class MessageCollector -{ - - /** - * Indicator for a (blocking) error. - * - * @var int - */ - const ERROR = 1; - - /** - * Indicator for a warning. - * - * @var int - */ - const WARNING = 2; - - /** - * Indicator for a notice. - * - * @var int - */ - const NOTICE = 4; - - /** - * Indicator for a deprecation notice. - * - * @var int - */ - const DEPRECATED = 8; - - /** - * Indicator for ordering the messages based on severity first, order received second. - * - * @var string - */ - const ORDERBY_SEVERITY = 'severity'; - - /** - * Indicator for ordering the messages based on the order in which they were received. - * - * @var string - */ - const ORDERBY_RECEIVED = 'received'; - - /** - * Collected messages. - * - * @var array> The value for each array entry is an associative array - * which holds two keys: - * - 'message' string The message text. - * - 'type' int The type of the message based on the - * above declared error level constants. - */ - private $cache = []; - - - /** - * Add a new message. - * - * @param string $message The message text. - * @param int $type The type of message. Should be one of the following constants: - * MessageCollector::ERROR, MessageCollector::WARNING, MessageCollector::NOTICE - * or MessageCollector::DEPRECATED. - * Defaults to MessageCollector::NOTICE. - * - * @return void - * - * @throws \InvalidArgumentException If the message text is not a string. - * @throws \InvalidArgumentException If the message type is not one of the accepted types. - */ - public function add($message, $type=self::NOTICE) - { - if (is_string($message) === false) { - throw new InvalidArgumentException('The $message should be of type string. Received: '.gettype($message).'.'); - } - - if ($type !== self::ERROR - && $type !== self::WARNING - && $type !== self::NOTICE - && $type !== self::DEPRECATED - ) { - throw new InvalidArgumentException('The message $type should be one of the predefined MessageCollector constants. Received: '.$type.'.'); - } - - $this->cache[] = [ - 'message' => $message, - 'type' => $type, - ]; - - }//end add() - - - /** - * Determine whether or not the currently cached errors include blocking errors. - * - * @return bool - */ - public function containsBlockingErrors() - { - $seenTypes = $this->arrayColumn($this->cache, 'type'); - $typeFrequency = array_count_values($seenTypes); - return isset($typeFrequency[self::ERROR]); - - }//end containsBlockingErrors() - - - /** - * Display the cached messages. - * - * Displaying the messages will also clear the message cache. - * - * @param string $order Optional. The order in which to display the messages. - * Should be one of the following constants: MessageCollector::ORDERBY_SEVERITY, - * MessageCollector::ORDERBY_RECEIVED. - * Defaults to MessageCollector::ORDERBY_SEVERITY. - * - * @return void - * - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException When there are blocking errors. - */ - public function display($order=self::ORDERBY_SEVERITY) - { - if ($this->cache === []) { - return; - } - - $blocking = $this->containsBlockingErrors(); - $messageInfo = $this->prefixAll($this->cache); - $this->clearCache(); - - if ($order === self::ORDERBY_RECEIVED) { - $messages = $this->arrayColumn($messageInfo, 'message'); - } else { - $messages = $this->sortBySeverity($messageInfo); - } - - $allMessages = implode(PHP_EOL, $messages).PHP_EOL.PHP_EOL; - - if ($blocking === true) { - throw new RuntimeException($allMessages); - } else { - echo $allMessages; - } - - }//end display() - - - /** - * Label all messages based on their type. - * - * @param array> $messages A multi-dimensional array of messages with their severity. - * - * @return array> - */ - private function prefixAll(array $messages) - { - foreach ($messages as $i => $details) { - $messages[$i]['message'] = $this->prefix($details['message'], $details['type']); - } - - return $messages; - - }//end prefixAll() - - - /** - * Add a message type prefix to a message. - * - * @param string $message The message text. - * @param int $type The type of message. - * - * @return string - */ - private function prefix($message, $type) - { - switch ($type) { - case self::ERROR: - $message = 'ERROR: '.$message; - break; - - case self::WARNING: - $message = 'WARNING: '.$message; - break; - - case self::DEPRECATED: - $message = 'DEPRECATED: '.$message; - break; - - default: - $message = 'NOTICE: '.$message; - break; - } - - return $message; - - }//end prefix() - - - /** - * Sort an array of messages by severity. - * - * @param array> $messages A multi-dimensional array of messages with their severity. - * - * @return array A single dimensional array of only messages, sorted by severity. - */ - private function sortBySeverity(array $messages) - { - if (count($messages) === 1) { - return [$messages[0]['message']]; - } - - $errors = []; - $warnings = []; - $notices = []; - $deprecations = []; - - foreach ($messages as $details) { - switch ($details['type']) { - case self::ERROR: - $errors[] = $details['message']; - break; - - case self::WARNING: - $warnings[] = $details['message']; - break; - - case self::DEPRECATED: - $deprecations[] = $details['message']; - break; - - default: - $notices[] = $details['message']; - break; - } - } - - return array_merge($errors, $warnings, $notices, $deprecations); - - }//end sortBySeverity() - - - /** - * Clear the message cache. - * - * @return void - */ - private function clearCache() - { - $this->cache = []; - - }//end clearCache() - - - /** - * Return the values from a single column in the input array. - * - * Polyfill for the PHP 5.5+ native array_column() function (for the functionality needed here). - * - * @param array> $input A multi-dimensional array from which to pull a column of values. - * @param string $columnKey The name of the column of values to return. - * - * @link https://www.php.net/function.array-column - * - * @return array - */ - private function arrayColumn(array $input, $columnKey) - { - if (function_exists('array_column') === true) { - // PHP 5.5+. - return array_column($input, $columnKey); - } - - // PHP 5.4. - $callback = static function ($row) use ($columnKey) { - return $row[$columnKey]; - }; - - return array_map($callback, $input); - - }//end arrayColumn() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Util/Standards.php b/vendor/squizlabs/php_codesniffer/src/Util/Standards.php deleted file mode 100644 index c9968bc..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Util/Standards.php +++ /dev/null @@ -1,340 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Util; - -use DirectoryIterator; -use PHP_CodeSniffer\Config; - -class Standards -{ - - - /** - * Get a list of paths where standards are installed. - * - * Unresolvable relative paths will be excluded from the results. - * - * @return array - */ - public static function getInstalledStandardPaths() - { - $ds = DIRECTORY_SEPARATOR; - - $installedPaths = [dirname(dirname(__DIR__)).$ds.'src'.$ds.'Standards']; - $configPaths = Config::getConfigData('installed_paths'); - if ($configPaths !== null) { - $installedPaths = array_merge($installedPaths, explode(',', $configPaths)); - } - - $resolvedInstalledPaths = []; - foreach ($installedPaths as $installedPath) { - if (substr($installedPath, 0, 1) === '.') { - $installedPath = Common::realpath(__DIR__.$ds.'..'.$ds.'..'.$ds.$installedPath); - if ($installedPath === false) { - continue; - } - } - - $resolvedInstalledPaths[] = $installedPath; - } - - return $resolvedInstalledPaths; - - }//end getInstalledStandardPaths() - - - /** - * Get the details of all coding standards installed. - * - * Coding standards are directories located in the - * CodeSniffer/Standards directory. Valid coding standards - * include a Sniffs subdirectory. - * - * The details returned for each standard are: - * - path: the path to the coding standard's main directory - * - name: the name of the coding standard, as sourced from the ruleset.xml file - * - namespace: the namespace used by the coding standard, as sourced from the ruleset.xml file - * - * If you only need the paths to the installed standards, - * use getInstalledStandardPaths() instead as it performs less work to - * retrieve coding standard names. - * - * @param boolean $includeGeneric If true, the special "Generic" - * coding standard will be included - * if installed. - * @param string $standardsDir A specific directory to look for standards - * in. If not specified, PHP_CodeSniffer will - * look in its default locations. - * - * @return array - * @see getInstalledStandardPaths() - */ - public static function getInstalledStandardDetails( - $includeGeneric=false, - $standardsDir='' - ) { - $rulesets = []; - - if ($standardsDir === '') { - $installedPaths = self::getInstalledStandardPaths(); - } else { - $installedPaths = [$standardsDir]; - } - - foreach ($installedPaths as $standardsDir) { - // Check if the installed dir is actually a standard itself. - $csFile = $standardsDir.'/ruleset.xml'; - if (is_file($csFile) === true) { - $rulesets[] = $csFile; - continue; - } - - if (is_dir($standardsDir) === false) { - continue; - } - - $di = new DirectoryIterator($standardsDir); - foreach ($di as $file) { - if ($file->isDir() === true && $file->isDot() === false) { - $filename = $file->getFilename(); - - // Ignore the special "Generic" standard. - if ($includeGeneric === false && $filename === 'Generic') { - continue; - } - - // Valid coding standard dirs include a ruleset. - $csFile = $file->getPathname().'/ruleset.xml'; - if (is_file($csFile) === true) { - $rulesets[] = $csFile; - } - } - } - }//end foreach - - $installedStandards = []; - - foreach ($rulesets as $rulesetPath) { - $ruleset = @simplexml_load_string(file_get_contents($rulesetPath)); - if ($ruleset === false) { - continue; - } - - $standardName = (string) $ruleset['name']; - $dirname = basename(dirname($rulesetPath)); - - if (isset($ruleset['namespace']) === true) { - $namespace = (string) $ruleset['namespace']; - } else { - $namespace = $dirname; - } - - $installedStandards[$dirname] = [ - 'path' => dirname($rulesetPath), - 'name' => $standardName, - 'namespace' => $namespace, - ]; - }//end foreach - - return $installedStandards; - - }//end getInstalledStandardDetails() - - - /** - * Get a list of all coding standards installed. - * - * Coding standards are directories located in the - * CodeSniffer/Standards directory. Valid coding standards - * include a Sniffs subdirectory. - * - * @param boolean $includeGeneric If true, the special "Generic" - * coding standard will be included - * if installed. - * @param string $standardsDir A specific directory to look for standards - * in. If not specified, PHP_CodeSniffer will - * look in its default locations. - * - * @return array - * @see isInstalledStandard() - */ - public static function getInstalledStandards( - $includeGeneric=false, - $standardsDir='' - ) { - $installedStandards = []; - - if ($standardsDir === '') { - $installedPaths = self::getInstalledStandardPaths(); - } else { - $installedPaths = [$standardsDir]; - } - - foreach ($installedPaths as $standardsDir) { - // Check if the installed dir is actually a standard itself. - $csFile = $standardsDir.'/ruleset.xml'; - if (is_file($csFile) === true) { - $basename = basename($standardsDir); - $installedStandards[$basename] = $basename; - continue; - } - - if (is_dir($standardsDir) === false) { - // Doesn't exist. - continue; - } - - $di = new DirectoryIterator($standardsDir); - $standardsInDir = []; - foreach ($di as $file) { - if ($file->isDir() === true && $file->isDot() === false) { - $filename = $file->getFilename(); - - // Ignore the special "Generic" standard. - if ($includeGeneric === false && $filename === 'Generic') { - continue; - } - - // Valid coding standard dirs include a ruleset. - $csFile = $file->getPathname().'/ruleset.xml'; - if (is_file($csFile) === true) { - $standardsInDir[$filename] = $filename; - } - } - } - - natsort($standardsInDir); - $installedStandards += $standardsInDir; - }//end foreach - - return $installedStandards; - - }//end getInstalledStandards() - - - /** - * Determine if a standard is installed. - * - * Coding standards are directories located in the - * CodeSniffer/Standards directory. Valid coding standards - * include a ruleset.xml file. - * - * @param string $standard The name of the coding standard. - * - * @return boolean - * @see getInstalledStandards() - */ - public static function isInstalledStandard($standard) - { - $path = self::getInstalledStandardPath($standard); - if ($path !== null && strpos($path, 'ruleset.xml') !== false) { - return true; - } else { - // This could be a custom standard, installed outside our - // standards directory. - $standard = Common::realpath($standard); - if ($standard === false) { - return false; - } - - // Might be an actual ruleset file itUtil. - // If it has an XML extension, let's at least try it. - if (is_file($standard) === true - && (substr(strtolower($standard), -4) === '.xml' - || substr(strtolower($standard), -9) === '.xml.dist') - ) { - return true; - } - - // If it is a directory with a ruleset.xml file in it, - // it is a standard. - $ruleset = rtrim($standard, ' /\\').DIRECTORY_SEPARATOR.'ruleset.xml'; - if (is_file($ruleset) === true) { - return true; - } - }//end if - - return false; - - }//end isInstalledStandard() - - - /** - * Return the path of an installed coding standard. - * - * Coding standards are directories located in the - * CodeSniffer/Standards directory. Valid coding standards - * include a ruleset.xml file. - * - * @param string $standard The name of the coding standard. - * - * @return string|null - */ - public static function getInstalledStandardPath($standard) - { - if (strpos($standard, '.') !== false) { - return null; - } - - $installedPaths = self::getInstalledStandardPaths(); - foreach ($installedPaths as $installedPath) { - $standardPath = $installedPath.DIRECTORY_SEPARATOR.$standard; - if (file_exists($standardPath) === false) { - if (basename($installedPath) !== $standard) { - continue; - } - - $standardPath = $installedPath; - } - - $path = Common::realpath($standardPath.DIRECTORY_SEPARATOR.'ruleset.xml'); - - if ($path !== false && is_file($path) === true) { - return $path; - } else if (Common::isPharFile($standardPath) === true) { - $path = Common::realpath($standardPath); - if ($path !== false) { - return $path; - } - } - }//end foreach - - return null; - - }//end getInstalledStandardPath() - - - /** - * Prints out a list of installed coding standards. - * - * @return void - */ - public static function printInstalledStandards() - { - $installedStandards = self::getInstalledStandards(); - $numStandards = count($installedStandards); - - if ($numStandards === 0) { - echo 'No coding standards are installed.'.PHP_EOL; - } else { - $lastStandard = array_pop($installedStandards); - if ($numStandards === 1) { - echo "The only coding standard installed is $lastStandard".PHP_EOL; - } else { - $standardList = implode(', ', $installedStandards); - $standardList .= ' and '.$lastStandard; - echo 'The installed coding standards are '.$standardList.PHP_EOL; - } - } - - }//end printInstalledStandards() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Util/Timing.php b/vendor/squizlabs/php_codesniffer/src/Util/Timing.php deleted file mode 100644 index 5c1e998..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Util/Timing.php +++ /dev/null @@ -1,133 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Util; - -class Timing -{ - - /** - * Number of milliseconds in a minute. - * - * @var int - */ - const MINUTE_IN_MS = 60000; - - /** - * Number of milliseconds in a second. - * - * @var int - */ - const SECOND_IN_MS = 1000; - - /** - * The start time of the run in microseconds. - * - * @var float - */ - private static $startTime; - - /** - * Used to make sure we only print the run time once per run. - * - * @var boolean - */ - private static $printed = false; - - - /** - * Start recording time for the run. - * - * @return void - */ - public static function startTiming() - { - - self::$startTime = microtime(true); - - }//end startTiming() - - - /** - * Get the duration of the run up to "now". - * - * @return float Duration in milliseconds. - */ - public static function getDuration() - { - if (self::$startTime === null) { - // Timing was never started. - return 0; - } - - return ((microtime(true) - self::$startTime) * 1000); - - }//end getDuration() - - - /** - * Convert a duration in milliseconds to a human readable duration string. - * - * @param float $duration Duration in milliseconds. - * - * @return string - */ - public static function getHumanReadableDuration($duration) - { - $timeString = ''; - if ($duration >= self::MINUTE_IN_MS) { - $mins = floor($duration / self::MINUTE_IN_MS); - $secs = round((fmod($duration, self::MINUTE_IN_MS) / self::SECOND_IN_MS), 2); - $timeString = $mins.' mins'; - if ($secs >= 0.01) { - $timeString .= ", $secs secs"; - } - } else if ($duration >= self::SECOND_IN_MS) { - $timeString = round(($duration / self::SECOND_IN_MS), 2).' secs'; - } else { - $timeString = round($duration).'ms'; - } - - return $timeString; - - }//end getHumanReadableDuration() - - - /** - * Print information about the run. - * - * @param boolean $force If TRUE, prints the output even if it has - * already been printed during the run. - * - * @return void - */ - public static function printRunTime($force=false) - { - if ($force === false && self::$printed === true) { - // A double call. - return; - } - - if (self::$startTime === null) { - // Timing was never started. - return; - } - - $duration = self::getDuration(); - $duration = self::getHumanReadableDuration($duration); - - $mem = round((memory_get_peak_usage(true) / (1024 * 1024)), 2).'MB'; - echo "Time: $duration; Memory: $mem".PHP_EOL.PHP_EOL; - - self::$printed = true; - - }//end printRunTime() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/src/Util/Tokens.php b/vendor/squizlabs/php_codesniffer/src/Util/Tokens.php deleted file mode 100644 index 5682fca..0000000 --- a/vendor/squizlabs/php_codesniffer/src/Util/Tokens.php +++ /dev/null @@ -1,835 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Util; - -define('T_NONE', 'PHPCS_T_NONE'); -define('T_OPEN_CURLY_BRACKET', 'PHPCS_T_OPEN_CURLY_BRACKET'); -define('T_CLOSE_CURLY_BRACKET', 'PHPCS_T_CLOSE_CURLY_BRACKET'); -define('T_OPEN_SQUARE_BRACKET', 'PHPCS_T_OPEN_SQUARE_BRACKET'); -define('T_CLOSE_SQUARE_BRACKET', 'PHPCS_T_CLOSE_SQUARE_BRACKET'); -define('T_OPEN_PARENTHESIS', 'PHPCS_T_OPEN_PARENTHESIS'); -define('T_CLOSE_PARENTHESIS', 'PHPCS_T_CLOSE_PARENTHESIS'); -define('T_COLON', 'PHPCS_T_COLON'); -define('T_NULLABLE', 'PHPCS_T_NULLABLE'); -define('T_STRING_CONCAT', 'PHPCS_T_STRING_CONCAT'); -define('T_INLINE_THEN', 'PHPCS_T_INLINE_THEN'); -define('T_INLINE_ELSE', 'PHPCS_T_INLINE_ELSE'); -define('T_NULL', 'PHPCS_T_NULL'); -define('T_FALSE', 'PHPCS_T_FALSE'); -define('T_TRUE', 'PHPCS_T_TRUE'); -define('T_SEMICOLON', 'PHPCS_T_SEMICOLON'); -define('T_EQUAL', 'PHPCS_T_EQUAL'); -define('T_MULTIPLY', 'PHPCS_T_MULTIPLY'); -define('T_DIVIDE', 'PHPCS_T_DIVIDE'); -define('T_PLUS', 'PHPCS_T_PLUS'); -define('T_MINUS', 'PHPCS_T_MINUS'); -define('T_MODULUS', 'PHPCS_T_MODULUS'); -define('T_BITWISE_AND', 'PHPCS_T_BITWISE_AND'); -define('T_BITWISE_OR', 'PHPCS_T_BITWISE_OR'); -define('T_BITWISE_XOR', 'PHPCS_T_BITWISE_XOR'); -define('T_BITWISE_NOT', 'PHPCS_T_BITWISE_NOT'); -define('T_ARRAY_HINT', 'PHPCS_T_ARRAY_HINT'); -define('T_GREATER_THAN', 'PHPCS_T_GREATER_THAN'); -define('T_LESS_THAN', 'PHPCS_T_LESS_THAN'); -define('T_BOOLEAN_NOT', 'PHPCS_T_BOOLEAN_NOT'); -define('T_SELF', 'PHPCS_T_SELF'); -define('T_PARENT', 'PHPCS_T_PARENT'); -define('T_DOUBLE_QUOTED_STRING', 'PHPCS_T_DOUBLE_QUOTED_STRING'); -define('T_COMMA', 'PHPCS_T_COMMA'); -define('T_HEREDOC', 'PHPCS_T_HEREDOC'); -define('T_PROTOTYPE', 'PHPCS_T_PROTOTYPE'); -define('T_THIS', 'PHPCS_T_THIS'); -define('T_REGULAR_EXPRESSION', 'PHPCS_T_REGULAR_EXPRESSION'); -define('T_PROPERTY', 'PHPCS_T_PROPERTY'); -define('T_LABEL', 'PHPCS_T_LABEL'); -define('T_OBJECT', 'PHPCS_T_OBJECT'); -define('T_CLOSE_OBJECT', 'PHPCS_T_CLOSE_OBJECT'); -define('T_COLOUR', 'PHPCS_T_COLOUR'); -define('T_HASH', 'PHPCS_T_HASH'); -define('T_URL', 'PHPCS_T_URL'); -define('T_STYLE', 'PHPCS_T_STYLE'); -define('T_ASPERAND', 'PHPCS_T_ASPERAND'); -define('T_DOLLAR', 'PHPCS_T_DOLLAR'); -define('T_TYPEOF', 'PHPCS_T_TYPEOF'); -define('T_CLOSURE', 'PHPCS_T_CLOSURE'); -define('T_ANON_CLASS', 'PHPCS_T_ANON_CLASS'); -define('T_BACKTICK', 'PHPCS_T_BACKTICK'); -define('T_START_NOWDOC', 'PHPCS_T_START_NOWDOC'); -define('T_NOWDOC', 'PHPCS_T_NOWDOC'); -define('T_END_NOWDOC', 'PHPCS_T_END_NOWDOC'); -define('T_OPEN_SHORT_ARRAY', 'PHPCS_T_OPEN_SHORT_ARRAY'); -define('T_CLOSE_SHORT_ARRAY', 'PHPCS_T_CLOSE_SHORT_ARRAY'); -define('T_GOTO_LABEL', 'PHPCS_T_GOTO_LABEL'); -define('T_BINARY_CAST', 'PHPCS_T_BINARY_CAST'); -define('T_EMBEDDED_PHP', 'PHPCS_T_EMBEDDED_PHP'); -define('T_RETURN_TYPE', 'PHPCS_T_RETURN_TYPE'); -define('T_OPEN_USE_GROUP', 'PHPCS_T_OPEN_USE_GROUP'); -define('T_CLOSE_USE_GROUP', 'PHPCS_T_CLOSE_USE_GROUP'); -define('T_ZSR', 'PHPCS_T_ZSR'); -define('T_ZSR_EQUAL', 'PHPCS_T_ZSR_EQUAL'); -define('T_FN_ARROW', 'PHPCS_T_FN_ARROW'); -define('T_TYPE_UNION', 'PHPCS_T_TYPE_UNION'); -define('T_PARAM_NAME', 'PHPCS_T_PARAM_NAME'); -define('T_MATCH_ARROW', 'PHPCS_T_MATCH_ARROW'); -define('T_MATCH_DEFAULT', 'PHPCS_T_MATCH_DEFAULT'); -define('T_ATTRIBUTE_END', 'PHPCS_T_ATTRIBUTE_END'); -define('T_ENUM_CASE', 'PHPCS_T_ENUM_CASE'); -define('T_TYPE_INTERSECTION', 'PHPCS_T_TYPE_INTERSECTION'); -define('T_TYPE_OPEN_PARENTHESIS', 'PHPCS_T_TYPE_OPEN_PARENTHESIS'); -define('T_TYPE_CLOSE_PARENTHESIS', 'PHPCS_T_TYPE_CLOSE_PARENTHESIS'); - -/* - * {@internal IMPORTANT: all PHP native polyfilled tokens MUST be added to the - * `PHP_CodeSniffer\Tests\Core\Util\Tokens\TokenNameTest::dataPolyfilledPHPNativeTokens()` test method!} - */ - -// Some PHP 5.5 tokens, replicated for lower versions. -if (defined('T_FINALLY') === false) { - define('T_FINALLY', 'PHPCS_T_FINALLY'); -} - -if (defined('T_YIELD') === false) { - define('T_YIELD', 'PHPCS_T_YIELD'); -} - -// Some PHP 5.6 tokens, replicated for lower versions. -if (defined('T_ELLIPSIS') === false) { - define('T_ELLIPSIS', 'PHPCS_T_ELLIPSIS'); -} - -if (defined('T_POW') === false) { - define('T_POW', 'PHPCS_T_POW'); -} - -if (defined('T_POW_EQUAL') === false) { - define('T_POW_EQUAL', 'PHPCS_T_POW_EQUAL'); -} - -// Some PHP 7 tokens, replicated for lower versions. -if (defined('T_SPACESHIP') === false) { - define('T_SPACESHIP', 'PHPCS_T_SPACESHIP'); -} - -if (defined('T_COALESCE') === false) { - define('T_COALESCE', 'PHPCS_T_COALESCE'); -} - -if (defined('T_COALESCE_EQUAL') === false) { - define('T_COALESCE_EQUAL', 'PHPCS_T_COALESCE_EQUAL'); -} - -if (defined('T_YIELD_FROM') === false) { - define('T_YIELD_FROM', 'PHPCS_T_YIELD_FROM'); -} - -// Some PHP 7.4 tokens, replicated for lower versions. -if (defined('T_BAD_CHARACTER') === false) { - define('T_BAD_CHARACTER', 'PHPCS_T_BAD_CHARACTER'); -} - -if (defined('T_FN') === false) { - define('T_FN', 'PHPCS_T_FN'); -} - -// Some PHP 8.0 tokens, replicated for lower versions. -if (defined('T_NULLSAFE_OBJECT_OPERATOR') === false) { - define('T_NULLSAFE_OBJECT_OPERATOR', 'PHPCS_T_NULLSAFE_OBJECT_OPERATOR'); -} - -if (defined('T_NAME_QUALIFIED') === false) { - define('T_NAME_QUALIFIED', 'PHPCS_T_NAME_QUALIFIED'); -} - -if (defined('T_NAME_FULLY_QUALIFIED') === false) { - define('T_NAME_FULLY_QUALIFIED', 'PHPCS_T_NAME_FULLY_QUALIFIED'); -} - -if (defined('T_NAME_RELATIVE') === false) { - define('T_NAME_RELATIVE', 'PHPCS_T_NAME_RELATIVE'); -} - -if (defined('T_MATCH') === false) { - define('T_MATCH', 'PHPCS_T_MATCH'); -} - -if (defined('T_ATTRIBUTE') === false) { - define('T_ATTRIBUTE', 'PHPCS_T_ATTRIBUTE'); -} - -// Some PHP 8.1 tokens, replicated for lower versions. -if (defined('T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG') === false) { - define('T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG', 'PHPCS_T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG'); -} - -if (defined('T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG') === false) { - define('T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG', 'PHPCS_T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG'); -} - -if (defined('T_READONLY') === false) { - define('T_READONLY', 'PHPCS_T_READONLY'); -} - -if (defined('T_ENUM') === false) { - define('T_ENUM', 'PHPCS_T_ENUM'); -} - -// Some PHP 8.4 tokens, replicated for lower versions. -if (defined('T_PUBLIC_SET') === false) { - define('T_PUBLIC_SET', 'PHPCS_T_PUBLIC_SET'); -} - -if (defined('T_PROTECTED_SET') === false) { - define('T_PROTECTED_SET', 'PHPCS_T_PROTECTED_SET'); -} - -if (defined('T_PRIVATE_SET') === false) { - define('T_PRIVATE_SET', 'PHPCS_T_PRIVATE_SET'); -} - -// Tokens used for parsing doc blocks. -define('T_DOC_COMMENT_STAR', 'PHPCS_T_DOC_COMMENT_STAR'); -define('T_DOC_COMMENT_WHITESPACE', 'PHPCS_T_DOC_COMMENT_WHITESPACE'); -define('T_DOC_COMMENT_TAG', 'PHPCS_T_DOC_COMMENT_TAG'); -define('T_DOC_COMMENT_OPEN_TAG', 'PHPCS_T_DOC_COMMENT_OPEN_TAG'); -define('T_DOC_COMMENT_CLOSE_TAG', 'PHPCS_T_DOC_COMMENT_CLOSE_TAG'); -define('T_DOC_COMMENT_STRING', 'PHPCS_T_DOC_COMMENT_STRING'); - -// Tokens used for PHPCS instruction comments. -define('T_PHPCS_ENABLE', 'PHPCS_T_PHPCS_ENABLE'); -define('T_PHPCS_DISABLE', 'PHPCS_T_PHPCS_DISABLE'); -define('T_PHPCS_SET', 'PHPCS_T_PHPCS_SET'); -define('T_PHPCS_IGNORE', 'PHPCS_T_PHPCS_IGNORE'); -define('T_PHPCS_IGNORE_FILE', 'PHPCS_T_PHPCS_IGNORE_FILE'); - -final class Tokens -{ - - /** - * The token weightings. - * - * @var array - */ - public static $weightings = [ - T_CLASS => 1000, - T_INTERFACE => 1000, - T_TRAIT => 1000, - T_ENUM => 1000, - T_NAMESPACE => 1000, - T_FUNCTION => 100, - T_CLOSURE => 100, - - /* - * Conditions. - */ - - T_WHILE => 50, - T_FOR => 50, - T_FOREACH => 50, - T_IF => 50, - T_ELSE => 50, - T_ELSEIF => 50, - T_DO => 50, - T_TRY => 50, - T_CATCH => 50, - T_FINALLY => 50, - T_SWITCH => 50, - T_MATCH => 50, - - T_SELF => 25, - T_PARENT => 25, - - /* - * Operators and arithmetic. - */ - - T_BITWISE_AND => 8, - T_BITWISE_OR => 8, - T_BITWISE_XOR => 8, - - T_MULTIPLY => 5, - T_DIVIDE => 5, - T_PLUS => 5, - T_MINUS => 5, - T_MODULUS => 5, - T_POW => 5, - T_SPACESHIP => 5, - T_COALESCE => 5, - T_COALESCE_EQUAL => 5, - - T_SL => 5, - T_SR => 5, - T_SL_EQUAL => 5, - T_SR_EQUAL => 5, - - T_EQUAL => 5, - T_AND_EQUAL => 5, - T_CONCAT_EQUAL => 5, - T_DIV_EQUAL => 5, - T_MINUS_EQUAL => 5, - T_MOD_EQUAL => 5, - T_MUL_EQUAL => 5, - T_OR_EQUAL => 5, - T_PLUS_EQUAL => 5, - T_XOR_EQUAL => 5, - - T_BOOLEAN_AND => 5, - T_BOOLEAN_OR => 5, - - /* - * Equality. - */ - - T_IS_EQUAL => 5, - T_IS_NOT_EQUAL => 5, - T_IS_IDENTICAL => 5, - T_IS_NOT_IDENTICAL => 5, - T_IS_SMALLER_OR_EQUAL => 5, - T_IS_GREATER_OR_EQUAL => 5, - ]; - - /** - * Tokens that represent assignments. - * - * @var array - */ - public static $assignmentTokens = [ - T_EQUAL => T_EQUAL, - T_AND_EQUAL => T_AND_EQUAL, - T_OR_EQUAL => T_OR_EQUAL, - T_CONCAT_EQUAL => T_CONCAT_EQUAL, - T_DIV_EQUAL => T_DIV_EQUAL, - T_MINUS_EQUAL => T_MINUS_EQUAL, - T_POW_EQUAL => T_POW_EQUAL, - T_MOD_EQUAL => T_MOD_EQUAL, - T_MUL_EQUAL => T_MUL_EQUAL, - T_PLUS_EQUAL => T_PLUS_EQUAL, - T_XOR_EQUAL => T_XOR_EQUAL, - T_DOUBLE_ARROW => T_DOUBLE_ARROW, - T_SL_EQUAL => T_SL_EQUAL, - T_SR_EQUAL => T_SR_EQUAL, - T_COALESCE_EQUAL => T_COALESCE_EQUAL, - T_ZSR_EQUAL => T_ZSR_EQUAL, - ]; - - /** - * Tokens that represent equality comparisons. - * - * @var array - */ - public static $equalityTokens = [ - T_IS_EQUAL => T_IS_EQUAL, - T_IS_NOT_EQUAL => T_IS_NOT_EQUAL, - T_IS_IDENTICAL => T_IS_IDENTICAL, - T_IS_NOT_IDENTICAL => T_IS_NOT_IDENTICAL, - T_IS_SMALLER_OR_EQUAL => T_IS_SMALLER_OR_EQUAL, - T_IS_GREATER_OR_EQUAL => T_IS_GREATER_OR_EQUAL, - ]; - - /** - * Tokens that represent comparison operator. - * - * @var array - */ - public static $comparisonTokens = [ - T_IS_EQUAL => T_IS_EQUAL, - T_IS_IDENTICAL => T_IS_IDENTICAL, - T_IS_NOT_EQUAL => T_IS_NOT_EQUAL, - T_IS_NOT_IDENTICAL => T_IS_NOT_IDENTICAL, - T_LESS_THAN => T_LESS_THAN, - T_GREATER_THAN => T_GREATER_THAN, - T_IS_SMALLER_OR_EQUAL => T_IS_SMALLER_OR_EQUAL, - T_IS_GREATER_OR_EQUAL => T_IS_GREATER_OR_EQUAL, - T_SPACESHIP => T_SPACESHIP, - T_COALESCE => T_COALESCE, - ]; - - /** - * Tokens that represent arithmetic operators. - * - * @var array - */ - public static $arithmeticTokens = [ - T_PLUS => T_PLUS, - T_MINUS => T_MINUS, - T_MULTIPLY => T_MULTIPLY, - T_DIVIDE => T_DIVIDE, - T_MODULUS => T_MODULUS, - T_POW => T_POW, - ]; - - /** - * Tokens that perform operations. - * - * @var array - */ - public static $operators = [ - T_MINUS => T_MINUS, - T_PLUS => T_PLUS, - T_MULTIPLY => T_MULTIPLY, - T_DIVIDE => T_DIVIDE, - T_MODULUS => T_MODULUS, - T_POW => T_POW, - T_SPACESHIP => T_SPACESHIP, - T_COALESCE => T_COALESCE, - T_BITWISE_AND => T_BITWISE_AND, - T_BITWISE_OR => T_BITWISE_OR, - T_BITWISE_XOR => T_BITWISE_XOR, - T_SL => T_SL, - T_SR => T_SR, - ]; - - /** - * Tokens that perform boolean operations. - * - * @var array - */ - public static $booleanOperators = [ - T_BOOLEAN_AND => T_BOOLEAN_AND, - T_BOOLEAN_OR => T_BOOLEAN_OR, - T_LOGICAL_AND => T_LOGICAL_AND, - T_LOGICAL_OR => T_LOGICAL_OR, - T_LOGICAL_XOR => T_LOGICAL_XOR, - ]; - - /** - * Tokens that represent casting. - * - * @var array - */ - public static $castTokens = [ - T_INT_CAST => T_INT_CAST, - T_STRING_CAST => T_STRING_CAST, - T_DOUBLE_CAST => T_DOUBLE_CAST, - T_ARRAY_CAST => T_ARRAY_CAST, - T_BOOL_CAST => T_BOOL_CAST, - T_OBJECT_CAST => T_OBJECT_CAST, - T_UNSET_CAST => T_UNSET_CAST, - T_BINARY_CAST => T_BINARY_CAST, - ]; - - /** - * Token types that open parenthesis. - * - * @var array - */ - public static $parenthesisOpeners = [ - T_ARRAY => T_ARRAY, - T_LIST => T_LIST, - T_FUNCTION => T_FUNCTION, - T_CLOSURE => T_CLOSURE, - T_ANON_CLASS => T_ANON_CLASS, - T_WHILE => T_WHILE, - T_FOR => T_FOR, - T_FOREACH => T_FOREACH, - T_SWITCH => T_SWITCH, - T_IF => T_IF, - T_ELSEIF => T_ELSEIF, - T_CATCH => T_CATCH, - T_DECLARE => T_DECLARE, - T_MATCH => T_MATCH, - ]; - - /** - * Tokens that are allowed to open scopes. - * - * @var array - */ - public static $scopeOpeners = [ - T_CLASS => T_CLASS, - T_ANON_CLASS => T_ANON_CLASS, - T_INTERFACE => T_INTERFACE, - T_TRAIT => T_TRAIT, - T_ENUM => T_ENUM, - T_NAMESPACE => T_NAMESPACE, - T_FUNCTION => T_FUNCTION, - T_CLOSURE => T_CLOSURE, - T_IF => T_IF, - T_SWITCH => T_SWITCH, - T_CASE => T_CASE, - T_DECLARE => T_DECLARE, - T_DEFAULT => T_DEFAULT, - T_WHILE => T_WHILE, - T_ELSE => T_ELSE, - T_ELSEIF => T_ELSEIF, - T_FOR => T_FOR, - T_FOREACH => T_FOREACH, - T_DO => T_DO, - T_TRY => T_TRY, - T_CATCH => T_CATCH, - T_FINALLY => T_FINALLY, - T_PROPERTY => T_PROPERTY, - T_OBJECT => T_OBJECT, - T_USE => T_USE, - T_MATCH => T_MATCH, - ]; - - /** - * Tokens that represent scope modifiers. - * - * @var array - */ - public static $scopeModifiers = [ - T_PRIVATE => T_PRIVATE, - T_PUBLIC => T_PUBLIC, - T_PROTECTED => T_PROTECTED, - T_PUBLIC_SET => T_PUBLIC_SET, - T_PROTECTED_SET => T_PROTECTED_SET, - T_PRIVATE_SET => T_PRIVATE_SET, - ]; - - /** - * Tokens that can prefix a method name - * - * @var array - */ - public static $methodPrefixes = [ - T_PRIVATE => T_PRIVATE, - T_PUBLIC => T_PUBLIC, - T_PROTECTED => T_PROTECTED, - T_ABSTRACT => T_ABSTRACT, - T_STATIC => T_STATIC, - T_FINAL => T_FINAL, - ]; - - /** - * Tokens that open code blocks. - * - * @var array - */ - public static $blockOpeners = [ - T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET, - T_OPEN_SQUARE_BRACKET => T_OPEN_SQUARE_BRACKET, - T_OPEN_PARENTHESIS => T_OPEN_PARENTHESIS, - T_OBJECT => T_OBJECT, - ]; - - /** - * Tokens that don't represent code. - * - * @var array - */ - public static $emptyTokens = [ - T_WHITESPACE => T_WHITESPACE, - T_COMMENT => T_COMMENT, - T_DOC_COMMENT => T_DOC_COMMENT, - T_DOC_COMMENT_STAR => T_DOC_COMMENT_STAR, - T_DOC_COMMENT_WHITESPACE => T_DOC_COMMENT_WHITESPACE, - T_DOC_COMMENT_TAG => T_DOC_COMMENT_TAG, - T_DOC_COMMENT_OPEN_TAG => T_DOC_COMMENT_OPEN_TAG, - T_DOC_COMMENT_CLOSE_TAG => T_DOC_COMMENT_CLOSE_TAG, - T_DOC_COMMENT_STRING => T_DOC_COMMENT_STRING, - T_PHPCS_ENABLE => T_PHPCS_ENABLE, - T_PHPCS_DISABLE => T_PHPCS_DISABLE, - T_PHPCS_SET => T_PHPCS_SET, - T_PHPCS_IGNORE => T_PHPCS_IGNORE, - T_PHPCS_IGNORE_FILE => T_PHPCS_IGNORE_FILE, - ]; - - /** - * Tokens that are comments. - * - * @var array - */ - public static $commentTokens = [ - T_COMMENT => T_COMMENT, - T_DOC_COMMENT => T_DOC_COMMENT, - T_DOC_COMMENT_STAR => T_DOC_COMMENT_STAR, - T_DOC_COMMENT_WHITESPACE => T_DOC_COMMENT_WHITESPACE, - T_DOC_COMMENT_TAG => T_DOC_COMMENT_TAG, - T_DOC_COMMENT_OPEN_TAG => T_DOC_COMMENT_OPEN_TAG, - T_DOC_COMMENT_CLOSE_TAG => T_DOC_COMMENT_CLOSE_TAG, - T_DOC_COMMENT_STRING => T_DOC_COMMENT_STRING, - T_PHPCS_ENABLE => T_PHPCS_ENABLE, - T_PHPCS_DISABLE => T_PHPCS_DISABLE, - T_PHPCS_SET => T_PHPCS_SET, - T_PHPCS_IGNORE => T_PHPCS_IGNORE, - T_PHPCS_IGNORE_FILE => T_PHPCS_IGNORE_FILE, - ]; - - /** - * Tokens that are comments containing PHPCS instructions. - * - * @var array - */ - public static $phpcsCommentTokens = [ - T_PHPCS_ENABLE => T_PHPCS_ENABLE, - T_PHPCS_DISABLE => T_PHPCS_DISABLE, - T_PHPCS_SET => T_PHPCS_SET, - T_PHPCS_IGNORE => T_PHPCS_IGNORE, - T_PHPCS_IGNORE_FILE => T_PHPCS_IGNORE_FILE, - ]; - - /** - * Tokens that represent strings. - * - * Note that T_STRINGS are NOT represented in this list. - * - * @var array - */ - public static $stringTokens = [ - T_CONSTANT_ENCAPSED_STRING => T_CONSTANT_ENCAPSED_STRING, - T_DOUBLE_QUOTED_STRING => T_DOUBLE_QUOTED_STRING, - ]; - - /** - * Tokens that represent text strings. - * - * @var array - */ - public static $textStringTokens = [ - T_CONSTANT_ENCAPSED_STRING => T_CONSTANT_ENCAPSED_STRING, - T_DOUBLE_QUOTED_STRING => T_DOUBLE_QUOTED_STRING, - T_INLINE_HTML => T_INLINE_HTML, - T_HEREDOC => T_HEREDOC, - T_NOWDOC => T_NOWDOC, - ]; - - /** - * Tokens that represent brackets and parenthesis. - * - * @var array - */ - public static $bracketTokens = [ - T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET, - T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET, - T_OPEN_SQUARE_BRACKET => T_OPEN_SQUARE_BRACKET, - T_CLOSE_SQUARE_BRACKET => T_CLOSE_SQUARE_BRACKET, - T_OPEN_PARENTHESIS => T_OPEN_PARENTHESIS, - T_CLOSE_PARENTHESIS => T_CLOSE_PARENTHESIS, - ]; - - /** - * Tokens that include files. - * - * @var array - */ - public static $includeTokens = [ - T_REQUIRE_ONCE => T_REQUIRE_ONCE, - T_REQUIRE => T_REQUIRE, - T_INCLUDE_ONCE => T_INCLUDE_ONCE, - T_INCLUDE => T_INCLUDE, - ]; - - /** - * Tokens that make up a heredoc string. - * - * @var array - */ - public static $heredocTokens = [ - T_START_HEREDOC => T_START_HEREDOC, - T_END_HEREDOC => T_END_HEREDOC, - T_HEREDOC => T_HEREDOC, - T_START_NOWDOC => T_START_NOWDOC, - T_END_NOWDOC => T_END_NOWDOC, - T_NOWDOC => T_NOWDOC, - ]; - - /** - * Tokens that represent the names of called functions. - * - * Mostly, these are just strings. But PHP tokenizes some language - * constructs and functions using their own tokens. - * - * @var array - */ - public static $functionNameTokens = [ - T_STRING => T_STRING, - T_EVAL => T_EVAL, - T_EXIT => T_EXIT, - T_INCLUDE => T_INCLUDE, - T_INCLUDE_ONCE => T_INCLUDE_ONCE, - T_REQUIRE => T_REQUIRE, - T_REQUIRE_ONCE => T_REQUIRE_ONCE, - T_ISSET => T_ISSET, - T_UNSET => T_UNSET, - T_EMPTY => T_EMPTY, - T_SELF => T_SELF, - T_PARENT => T_PARENT, - T_STATIC => T_STATIC, - ]; - - /** - * Tokens that open class and object scopes. - * - * @var array - */ - public static $ooScopeTokens = [ - T_CLASS => T_CLASS, - T_ANON_CLASS => T_ANON_CLASS, - T_INTERFACE => T_INTERFACE, - T_TRAIT => T_TRAIT, - T_ENUM => T_ENUM, - ]; - - /** - * Tokens representing PHP magic constants. - * - * @var array => - * - * @link https://www.php.net/language.constants.predefined PHP Manual on magic constants - */ - public static $magicConstants = [ - T_CLASS_C => T_CLASS_C, - T_DIR => T_DIR, - T_FILE => T_FILE, - T_FUNC_C => T_FUNC_C, - T_LINE => T_LINE, - T_METHOD_C => T_METHOD_C, - T_NS_C => T_NS_C, - T_TRAIT_C => T_TRAIT_C, - ]; - - /** - * Tokens representing context sensitive keywords in PHP. - * - * @var array - * - * https://wiki.php.net/rfc/context_sensitive_lexer - */ - public static $contextSensitiveKeywords = [ - T_ABSTRACT => T_ABSTRACT, - T_ARRAY => T_ARRAY, - T_AS => T_AS, - T_BREAK => T_BREAK, - T_CALLABLE => T_CALLABLE, - T_CASE => T_CASE, - T_CATCH => T_CATCH, - T_CLASS => T_CLASS, - T_CLONE => T_CLONE, - T_CONST => T_CONST, - T_CONTINUE => T_CONTINUE, - T_DECLARE => T_DECLARE, - T_DEFAULT => T_DEFAULT, - T_DO => T_DO, - T_ECHO => T_ECHO, - T_ELSE => T_ELSE, - T_ELSEIF => T_ELSEIF, - T_EMPTY => T_EMPTY, - T_ENDDECLARE => T_ENDDECLARE, - T_ENDFOR => T_ENDFOR, - T_ENDFOREACH => T_ENDFOREACH, - T_ENDIF => T_ENDIF, - T_ENDSWITCH => T_ENDSWITCH, - T_ENDWHILE => T_ENDWHILE, - T_ENUM => T_ENUM, - T_EVAL => T_EVAL, - T_EXIT => T_EXIT, - T_EXTENDS => T_EXTENDS, - T_FINAL => T_FINAL, - T_FINALLY => T_FINALLY, - T_FN => T_FN, - T_FOR => T_FOR, - T_FOREACH => T_FOREACH, - T_FUNCTION => T_FUNCTION, - T_GLOBAL => T_GLOBAL, - T_GOTO => T_GOTO, - T_IF => T_IF, - T_IMPLEMENTS => T_IMPLEMENTS, - T_INCLUDE => T_INCLUDE, - T_INCLUDE_ONCE => T_INCLUDE_ONCE, - T_INSTANCEOF => T_INSTANCEOF, - T_INSTEADOF => T_INSTEADOF, - T_INTERFACE => T_INTERFACE, - T_ISSET => T_ISSET, - T_LIST => T_LIST, - T_LOGICAL_AND => T_LOGICAL_AND, - T_LOGICAL_OR => T_LOGICAL_OR, - T_LOGICAL_XOR => T_LOGICAL_XOR, - T_MATCH => T_MATCH, - T_NAMESPACE => T_NAMESPACE, - T_NEW => T_NEW, - T_PRINT => T_PRINT, - T_PRIVATE => T_PRIVATE, - T_PROTECTED => T_PROTECTED, - T_PUBLIC => T_PUBLIC, - T_READONLY => T_READONLY, - T_REQUIRE => T_REQUIRE, - T_REQUIRE_ONCE => T_REQUIRE_ONCE, - T_RETURN => T_RETURN, - T_STATIC => T_STATIC, - T_SWITCH => T_SWITCH, - T_THROW => T_THROW, - T_TRAIT => T_TRAIT, - T_TRY => T_TRY, - T_UNSET => T_UNSET, - T_USE => T_USE, - T_VAR => T_VAR, - T_WHILE => T_WHILE, - T_YIELD => T_YIELD, - T_YIELD_FROM => T_YIELD_FROM, - ]; - - - /** - * Given a token constant, returns the name of the token. - * - * If passed an integer, the token name is sourced from PHP's token_name() - * function. If passed a string, it is assumed to be a PHPCS-supplied token - * that begins with PHPCS_T_, so the name is sourced from the token value itself. - * - * @param int|string $token The token constant to get the name for. - * - * @return string - */ - public static function tokenName($token) - { - if (is_string($token) === false) { - // PHP-supplied token name. - return token_name($token); - } - - return substr($token, 6); - - }//end tokenName() - - - /** - * Returns the highest weighted token type. - * - * Tokens are weighted by their approximate frequency of appearance in code - * - the less frequently they appear in the code, the higher the weighting. - * For example T_CLASS tokens appear very infrequently in a file, and - * therefore have a high weighting. - * - * If there are no weightings for any of the specified tokens, the first token - * seen in the passed array will be returned. - * - * @param array $tokens The token types to get the highest weighted - * type for. - * - * @return int|string The highest weighted token. - * On equal "weight", returns the first token of that particular weight. - */ - public static function getHighestWeightedToken(array $tokens) - { - $highest = -1; - $highestType = false; - - $weights = self::$weightings; - - foreach ($tokens as $token) { - if (isset($weights[$token]) === true) { - $weight = $weights[$token]; - } else { - $weight = 0; - } - - if ($weight > $highest) { - $highest = $weight; - $highestType = $token; - } - } - - return $highestType; - - }//end getHighestWeightedToken() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/AllTests.php b/vendor/squizlabs/php_codesniffer/tests/AllTests.php deleted file mode 100644 index 581c64b..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/AllTests.php +++ /dev/null @@ -1,58 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests; - -require_once 'Core/AllTests.php'; -require_once 'Standards/AllSniffs.php'; - -// PHPUnit 7 made the TestSuite run() method incompatible with -// older PHPUnit versions due to return type hints, so maintain -// two different suite objects. -$phpunit7 = false; -if (class_exists('\PHPUnit\Runner\Version') === true) { - $version = \PHPUnit\Runner\Version::id(); - if (version_compare($version, '7.0', '>=') === true) { - $phpunit7 = true; - } -} - -if ($phpunit7 === true) { - include_once 'TestSuite7.php'; -} else { - include_once 'TestSuite.php'; -} - -class PHP_CodeSniffer_AllTests -{ - - - /** - * Add all PHP_CodeSniffer test suites into a single test suite. - * - * @return \PHPUnit\Framework\TestSuite - */ - public static function suite() - { - $GLOBALS['PHP_CODESNIFFER_STANDARD_DIRS'] = []; - $GLOBALS['PHP_CODESNIFFER_TEST_DIRS'] = []; - - // Use a special PHP_CodeSniffer test suite so that we can - // unset our autoload function after the run. - $suite = new TestSuite('PHP CodeSniffer'); - - $suite->addTest(Core\AllTests::suite()); - $suite->addTest(Standards\AllSniffs::suite()); - - return $suite; - - }//end suite() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/ConfigDouble.php b/vendor/squizlabs/php_codesniffer/tests/ConfigDouble.php deleted file mode 100644 index 0b915dc..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/ConfigDouble.php +++ /dev/null @@ -1,213 +0,0 @@ - - * @copyright 2024 Juliette Reinders Folmer. All rights reserved. - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests; - -use PHP_CodeSniffer\Config; -use ReflectionProperty; - -final class ConfigDouble extends Config -{ - - /** - * Whether or not the setting of a standard should be skipped. - * - * @var boolean - */ - private $skipSettingStandard = false; - - - /** - * Creates a clean Config object and populates it with command line values. - * - * @param array $cliArgs An array of values gathered from CLI args. - * @param bool $skipSettingStandard Whether to skip setting a standard to prevent - * the Config class trying to auto-discover a ruleset file. - * Should only be set to `true` for tests which actually test - * the ruleset auto-discovery. - * Note: there is no need to set this to `true` when a standard - * is being passed via the `$cliArgs`. Those settings will always - * be respected. - * Defaults to `false`. Will result in the standard being set - * to "PSR1" if not provided via `$cliArgs`. - * @param bool $skipSettingReportWidth Whether to skip setting a report-width to prevent - * the Config class trying to auto-discover the screen width. - * Should only be set to `true` for tests which actually test - * the screen width auto-discovery. - * Note: there is no need to set this to `true` when a report-width - * is being passed via the `$cliArgs`. Those settings will always - * respected. - * Defaults to `false`. Will result in the reportWidth being set - * to "80" if not provided via `$cliArgs`. - * - * @return void - */ - public function __construct(array $cliArgs=[], $skipSettingStandard=false, $skipSettingReportWidth=false) - { - $this->skipSettingStandard = $skipSettingStandard; - - $this->resetSelectProperties(); - $this->preventReadingCodeSnifferConfFile(); - - parent::__construct($cliArgs); - - if ($skipSettingReportWidth !== true) { - $this->preventAutoDiscoveryScreenWidth(); - } - - }//end __construct() - - - /** - * Ensures the static properties in the Config class are reset to their default values - * when the ConfigDouble is no longer used. - * - * @return void - */ - public function __destruct() - { - $this->setStaticConfigProperty('overriddenDefaults', []); - $this->setStaticConfigProperty('executablePaths', []); - $this->setStaticConfigProperty('configData', null); - $this->setStaticConfigProperty('configDataFile', null); - - }//end __destruct() - - - /** - * Sets the command line values and optionally prevents a file system search for a custom ruleset. - * - * @param array $args An array of command line arguments to set. - * - * @return void - */ - public function setCommandLineValues($args) - { - parent::setCommandLineValues($args); - - if ($this->skipSettingStandard !== true) { - $this->preventSearchingForRuleset(); - } - - }//end setCommandLineValues() - - - /** - * Reset a few properties on the Config class to their default values. - * - * @return void - */ - private function resetSelectProperties() - { - $this->setStaticConfigProperty('overriddenDefaults', []); - $this->setStaticConfigProperty('executablePaths', []); - - }//end resetSelectProperties() - - - /** - * Prevent the values in a potentially available user-specific `CodeSniffer.conf` file - * from influencing the tests. - * - * This also prevents some file system calls which can influence the test runtime. - * - * @return void - */ - private function preventReadingCodeSnifferConfFile() - { - $this->setStaticConfigProperty('configData', []); - $this->setStaticConfigProperty('configDataFile', ''); - - }//end preventReadingCodeSnifferConfFile() - - - /** - * Prevent searching for a custom ruleset by setting a standard, but only if the test - * being run doesn't set a standard itself. - * - * This also prevents some file system calls which can influence the test runtime. - * - * The standard being set is the smallest one available so the ruleset initialization - * will be the fastest possible. - * - * @return void - */ - private function preventSearchingForRuleset() - { - $overriddenDefaults = $this->getStaticConfigProperty('overriddenDefaults'); - if (isset($overriddenDefaults['standards']) === false) { - $this->standards = ['PSR1']; - $overriddenDefaults['standards'] = true; - } - - self::setStaticConfigProperty('overriddenDefaults', $overriddenDefaults); - - }//end preventSearchingForRuleset() - - - /** - * Prevent a call to stty to figure out the screen width, but only if the test being run - * doesn't set a report width itself. - * - * @return void - */ - private function preventAutoDiscoveryScreenWidth() - { - $settings = $this->getSettings(); - if ($settings['reportWidth'] === 'auto') { - $this->reportWidth = self::DEFAULT_REPORT_WIDTH; - } - - }//end preventAutoDiscoveryScreenWidth() - - - /** - * Helper function to retrieve the value of a private static property on the Config class. - * - * @param string $name The name of the property to retrieve. - * - * @return mixed - */ - private function getStaticConfigProperty($name) - { - $property = new ReflectionProperty('PHP_CodeSniffer\Config', $name); - (PHP_VERSION_ID < 80100) && $property->setAccessible(true); - - return $property->getValue(); - - }//end getStaticConfigProperty() - - - /** - * Helper function to set the value of a private static property on the Config class. - * - * @param string $name The name of the property to set. - * @param mixed $value The value to set the property to. - * - * @return void - */ - private function setStaticConfigProperty($name, $value) - { - $property = new ReflectionProperty('PHP_CodeSniffer\Config', $name); - (PHP_VERSION_ID < 80100) && $property->setAccessible(true); - $property->setValue(null, $value); - (PHP_VERSION_ID < 80100) && $property->setAccessible(false); - - }//end setStaticConfigProperty() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/AbstractMethodUnitTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/AbstractMethodUnitTest.php deleted file mode 100644 index e66970d..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/AbstractMethodUnitTest.php +++ /dev/null @@ -1,274 +0,0 @@ - - * @copyright 2018-2019 Juliette Reinders Folmer. All rights reserved. - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core; - -use Exception; -use PHP_CodeSniffer\Files\DummyFile; -use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Tests\ConfigDouble; -use PHPUnit\Framework\TestCase; - -abstract class AbstractMethodUnitTest extends TestCase -{ - - /** - * The file extension of the test case file (without leading dot). - * - * This allows child classes to overrule the default `inc` with, for instance, - * `js` or `css` when applicable. - * - * @var string - */ - protected static $fileExtension = 'inc'; - - /** - * The tab width setting to use when tokenizing the file. - * - * This allows for test case files to use a different tab width than the default. - * - * @var integer - */ - protected static $tabWidth = 4; - - /** - * The \PHP_CodeSniffer\Files\File object containing the parsed contents of the test case file. - * - * @var \PHP_CodeSniffer\Files\File - */ - protected static $phpcsFile; - - - /** - * Initialize & tokenize \PHP_CodeSniffer\Files\File with code from the test case file. - * - * The test case file for a unit test class has to be in the same directory - * directory and use the same file name as the test class, using the .inc extension. - * - * @beforeClass - * - * @return void - */ - public static function initializeFile() - { - $_SERVER['argv'] = []; - $config = new ConfigDouble(); - // Also set a tab-width to enable testing tab-replaced vs `orig_content`. - $config->tabWidth = static::$tabWidth; - - $ruleset = new Ruleset($config); - - // Default to a file with the same name as the test class. Extension is property based. - $relativeCN = str_replace(__NAMESPACE__, '', get_called_class()); - $relativePath = str_replace('\\', DIRECTORY_SEPARATOR, $relativeCN); - $pathToTestFile = realpath(__DIR__).$relativePath.'.'.static::$fileExtension; - - // Make sure the file gets parsed correctly based on the file type. - $contents = 'phpcs_input_file: '.$pathToTestFile.PHP_EOL; - $contents .= file_get_contents($pathToTestFile); - - self::$phpcsFile = new DummyFile($contents, $ruleset, $config); - self::$phpcsFile->parse(); - - }//end initializeFile() - - - /** - * Clean up after finished test by resetting all static properties on the class to their default values. - * - * Note: This is a PHPUnit cross-version compatible {@see \PHPUnit\Framework\TestCase::tearDownAfterClass()} - * method. - * - * @afterClass - * - * @return void - */ - public static function reset() - { - // Explicitly trigger __destruct() on the ConfigDouble to reset the Config statics. - // The explicit method call prevents potential stray test-local references to the $config object - // preventing the destructor from running the clean up (which without stray references would be - // automagically triggered when `self::$phpcsFile` is reset, but we can't definitively rely on that). - if (isset(self::$phpcsFile) === true) { - self::$phpcsFile->config->__destruct(); - } - - self::$fileExtension = 'inc'; - self::$tabWidth = 4; - self::$phpcsFile = null; - - }//end reset() - - - /** - * Test QA: verify that a test case file does not contain any duplicate test markers. - * - * When a test case file contains a lot of test cases, it is easy to overlook that a test marker name - * is already in use. - * A test wouldn't necessarily fail on this, but would not be testing what is intended to be tested as - * it would be verifying token properties for the wrong token. - * - * This test safeguards against this. - * - * @coversNothing - * - * @return void - */ - public function testTestMarkersAreUnique() - { - $this->assertTestMarkersAreUnique(self::$phpcsFile); - - }//end testTestMarkersAreUnique() - - - /** - * Assertion to verify that a test case file does not contain any duplicate test markers. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file to validate. - * - * @return void - */ - public static function assertTestMarkersAreUnique(File $phpcsFile) - { - $tokens = $phpcsFile->getTokens(); - - // Collect all marker comments in the file. - $seenComments = []; - for ($i = 0; $i < $phpcsFile->numTokens; $i++) { - if ($tokens[$i]['code'] !== T_COMMENT) { - continue; - } - - if (stripos($tokens[$i]['content'], '/* test') !== 0) { - continue; - } - - $seenComments[] = $tokens[$i]['content']; - } - - self::assertSame(array_unique($seenComments), $seenComments, 'Duplicate test markers found.'); - - }//end assertTestMarkersAreUnique() - - - /** - * Get the token pointer for a target token based on a specific comment found on the line before. - * - * Note: the test delimiter comment MUST start with "/* test" to allow this function to - * distinguish between comments used *in* a test and test delimiters. - * - * @param string $commentString The delimiter comment to look for. - * @param int|string|array $tokenType The type of token(s) to look for. - * @param string $tokenContent Optional. The token content for the target token. - * - * @return int - */ - public function getTargetToken($commentString, $tokenType, $tokenContent=null) - { - return self::getTargetTokenFromFile(self::$phpcsFile, $commentString, $tokenType, $tokenContent); - - }//end getTargetToken() - - - /** - * Get the token pointer for a target token based on a specific comment found on the line before. - * - * Note: the test delimiter comment MUST start with "/* test" to allow this function to - * distinguish between comments used *in* a test and test delimiters. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file to find the token in. - * @param string $commentString The delimiter comment to look for. - * @param int|string|array $tokenType The type of token(s) to look for. - * @param string $tokenContent Optional. The token content for the target token. - * - * @return int - * - * @throws \Exception When the test delimiter comment is not found. - * @throws \Exception When the test target token is not found. - */ - public static function getTargetTokenFromFile(File $phpcsFile, $commentString, $tokenType, $tokenContent=null) - { - $start = ($phpcsFile->numTokens - 1); - $comment = $phpcsFile->findPrevious( - T_COMMENT, - $start, - null, - false, - $commentString - ); - - if ($comment === false) { - throw new Exception( - sprintf('Failed to find the test marker: %s in test case file %s', $commentString, $phpcsFile->getFilename()) - ); - } - - $tokens = $phpcsFile->getTokens(); - $end = ($start + 1); - - // Limit the token finding to between this and the next delimiter comment. - for ($i = ($comment + 1); $i < $end; $i++) { - if ($tokens[$i]['code'] !== T_COMMENT) { - continue; - } - - if (stripos($tokens[$i]['content'], '/* test') === 0) { - $end = $i; - break; - } - } - - $target = $phpcsFile->findNext( - $tokenType, - ($comment + 1), - $end, - false, - $tokenContent - ); - - if ($target === false) { - $msg = 'Failed to find test target token for comment string: '.$commentString; - if ($tokenContent !== null) { - $msg .= ' with token content: '.$tokenContent; - } - - throw new Exception($msg); - } - - return $target; - - }//end getTargetTokenFromFile() - - - /** - * Helper method to tell PHPUnit to expect a PHPCS RuntimeException in a PHPUnit cross-version - * compatible manner. - * - * @param string $message The expected exception message. - * - * @return void - */ - public function expectRunTimeException($message) - { - $exception = 'PHP_CodeSniffer\Exceptions\RuntimeException'; - - if (method_exists($this, 'expectException') === true) { - // PHPUnit 5+. - $this->expectException($exception); - $this->expectExceptionMessage($message); - } else { - // PHPUnit 4. - $this->setExpectedException($exception, $message); - } - - }//end expectRunTimeException() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/AllTests.php b/vendor/squizlabs/php_codesniffer/tests/Core/AllTests.php deleted file mode 100644 index e14e572..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/AllTests.php +++ /dev/null @@ -1,63 +0,0 @@ - - * @author Juliette Reinders Folmer - * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core; - -use PHP_CodeSniffer\Tests\FileList; -use PHPUnit\Framework\TestSuite; -use PHPUnit\TextUI\TestRunner; - -class AllTests -{ - - - /** - * Prepare the test runner. - * - * @return void - */ - public static function main() - { - TestRunner::run(self::suite()); - - }//end main() - - - /** - * Add all core unit tests into a test suite. - * - * @return \PHPUnit\Framework\TestSuite - */ - public static function suite() - { - $suite = new TestSuite('PHP CodeSniffer Core'); - - $testFileIterator = new FileList(__DIR__, '', '`Test\.php$`Di'); - foreach ($testFileIterator->fileIterator as $file) { - if (strpos($file, 'AbstractMethodUnitTest.php') !== false) { - continue; - } - - include_once $file; - - $class = str_replace(__DIR__, '', $file); - $class = str_replace('.php', '', $class); - $class = str_replace('/', '\\', $class); - $class = 'PHP_CodeSniffer\Tests\Core'.$class; - - $suite->addTestSuite($class); - } - - return $suite; - - }//end suite() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Autoloader/DetermineLoadedClassTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Autoloader/DetermineLoadedClassTest.php deleted file mode 100644 index a9608a8..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Autoloader/DetermineLoadedClassTest.php +++ /dev/null @@ -1,126 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Autoloader; - -use PHP_CodeSniffer\Autoload; -use PHPUnit\Framework\TestCase; - -/** - * Tests for the \PHP_CodeSniffer\Autoload::determineLoadedClass method. - * - * @covers \PHP_CodeSniffer\Autoload::determineLoadedClass - */ -final class DetermineLoadedClassTest extends TestCase -{ - - - /** - * Load the test files. - * - * @beforeClass - * - * @return void - */ - public static function includeFixture() - { - include __DIR__.'/TestFiles/Sub/C.inc'; - - }//end includeFixture() - - - /** - * Test for when class list is ordered. - * - * @return void - */ - public function testOrdered() - { - $classesBeforeLoad = [ - 'classes' => [], - 'interfaces' => [], - 'traits' => [], - ]; - - $classesAfterLoad = [ - 'classes' => [ - 'PHP_CodeSniffer\Tests\Core\Autoloader\A', - 'PHP_CodeSniffer\Tests\Core\Autoloader\B', - 'PHP_CodeSniffer\Tests\Core\Autoloader\C', - 'PHP_CodeSniffer\Tests\Core\Autoloader\Sub\C', - ], - 'interfaces' => [], - 'traits' => [], - ]; - - $className = Autoload::determineLoadedClass($classesBeforeLoad, $classesAfterLoad); - $this->assertSame('PHP_CodeSniffer\Tests\Core\Autoloader\Sub\C', $className); - - }//end testOrdered() - - - /** - * Test for when class list is out of order. - * - * @return void - */ - public function testUnordered() - { - $classesBeforeLoad = [ - 'classes' => [], - 'interfaces' => [], - 'traits' => [], - ]; - - $classesAfterLoad = [ - 'classes' => [ - 'PHP_CodeSniffer\Tests\Core\Autoloader\A', - 'PHP_CodeSniffer\Tests\Core\Autoloader\Sub\C', - 'PHP_CodeSniffer\Tests\Core\Autoloader\C', - 'PHP_CodeSniffer\Tests\Core\Autoloader\B', - ], - 'interfaces' => [], - 'traits' => [], - ]; - - $className = Autoload::determineLoadedClass($classesBeforeLoad, $classesAfterLoad); - $this->assertSame('PHP_CodeSniffer\Tests\Core\Autoloader\Sub\C', $className); - - $classesAfterLoad = [ - 'classes' => [ - 'PHP_CodeSniffer\Tests\Core\Autoloader\A', - 'PHP_CodeSniffer\Tests\Core\Autoloader\C', - 'PHP_CodeSniffer\Tests\Core\Autoloader\Sub\C', - 'PHP_CodeSniffer\Tests\Core\Autoloader\B', - ], - 'interfaces' => [], - 'traits' => [], - ]; - - $className = Autoload::determineLoadedClass($classesBeforeLoad, $classesAfterLoad); - $this->assertSame('PHP_CodeSniffer\Tests\Core\Autoloader\Sub\C', $className); - - $classesAfterLoad = [ - 'classes' => [ - 'PHP_CodeSniffer\Tests\Core\Autoloader\Sub\C', - 'PHP_CodeSniffer\Tests\Core\Autoloader\A', - 'PHP_CodeSniffer\Tests\Core\Autoloader\C', - 'PHP_CodeSniffer\Tests\Core\Autoloader\B', - ], - 'interfaces' => [], - 'traits' => [], - ]; - - $className = Autoload::determineLoadedClass($classesBeforeLoad, $classesAfterLoad); - $this->assertSame('PHP_CodeSniffer\Tests\Core\Autoloader\Sub\C', $className); - - }//end testUnordered() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Autoloader/TestFiles/A.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Autoloader/TestFiles/A.inc deleted file mode 100644 index c143371..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Autoloader/TestFiles/A.inc +++ /dev/null @@ -1,3 +0,0 @@ -setAccessible(true); - $property->setValue(null, $value); - (PHP_VERSION_ID < 80100) && $property->setAccessible(false); - - }//end setStaticConfigProperty() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Config/ExtensionsArgTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Config/ExtensionsArgTest.php deleted file mode 100644 index 82f5c45..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Config/ExtensionsArgTest.php +++ /dev/null @@ -1,128 +0,0 @@ -assertSame($expected, $config->extensions); - - }//end testValidExtensions() - - - /** - * Data provider. - * - * @see self::testValidExtensions() - * - * @return array>> - */ - public static function dataValidExtensions() - { - return [ - // Passing an empty extensions list is not useful, as it will result in no files being scanned, - // but that's the responsibility of the user. - 'Empty extensions list' => [ - 'passedValue' => '', - 'expected' => [], - ], - 'Single extension passed: php' => [ - 'passedValue' => 'php', - 'expected' => [ - 'php' => 'PHP', - ], - ], - // This would cause PHPCS to scan python files as PHP, which will probably cause very weird scan results, - // but that's the responsibility of the user. - 'Single extension passed: py' => [ - 'passedValue' => 'py', - 'expected' => [ - 'py' => 'PHP', - ], - ], - // This would likely result in a problem when PHPCS can't find a "PY" tokenizer class, - // but that's not our concern at this moment. Support for non-PHP tokenizers is being dropped soon anyway. - 'Single extension passed with language: py/py' => [ - 'passedValue' => 'py/py', - 'expected' => [ - 'py' => 'PY', - ], - ], - 'Multiple extensions passed: php,js,css' => [ - 'passedValue' => 'php,js,css', - 'expected' => [ - 'php' => 'PHP', - 'js' => 'JS', - 'css' => 'CSS', - ], - ], - 'Multiple extensions passed, some with language: php,inc/php,phpt/php,js' => [ - 'passedValue' => 'php,inc/php,phpt/php,js', - 'expected' => [ - 'php' => 'PHP', - 'inc' => 'PHP', - 'phpt' => 'PHP', - 'js' => 'JS', - ], - ], - 'File extensions are set case sensitively (and filtering is case sensitive too)' => [ - 'passedValue' => 'PHP,php', - 'expected' => [ - 'PHP' => 'PHP', - 'php' => 'PHP', - ], - ], - ]; - - }//end dataValidExtensions() - - - /** - * Ensure that only the first argument is processed and others are ignored. - * - * @return void - */ - public function testOnlySetOnce() - { - $config = new ConfigDouble( - [ - '--extensions=php', - '--extensions=inc,module', - ] - ); - - $this->assertSame(['php' => 'PHP'], $config->extensions); - - }//end testOnlySetOnce() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Config/GeneratorArgTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Config/GeneratorArgTest.php deleted file mode 100644 index 1e64413..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Config/GeneratorArgTest.php +++ /dev/null @@ -1,163 +0,0 @@ -markTestSkipped('The `--generator` CLI flag is only supported for the `phpcs` command'); - } - - }//end maybeSkipTests() - - - /** - * Ensure that the generator property is set when the parameter is passed a valid value. - * - * @param string $argumentValue Generator name passed on the command line. - * @param string $expectedPropertyValue Expected value of the generator property. - * - * @dataProvider dataValidGeneratorNames - * - * @return void - */ - public function testValidGenerators($argumentValue, $expectedPropertyValue) - { - $config = new ConfigDouble(["--generator=$argumentValue"]); - - $this->assertSame($expectedPropertyValue, $config->generator); - - }//end testValidGenerators() - - - /** - * Data provider for testValidGenerators(). - * - * @see self::testValidGenerators() - * - * @return array> - */ - public static function dataValidGeneratorNames() - { - return [ - 'Text generator passed' => [ - 'argumentValue' => 'Text', - 'expectedPropertyValue' => 'Text', - ], - 'HTML generator passed' => [ - 'argumentValue' => 'HTML', - 'expectedPropertyValue' => 'HTML', - ], - 'Markdown generator passed' => [ - 'argumentValue' => 'Markdown', - 'expectedPropertyValue' => 'Markdown', - ], - 'Uppercase Text generator passed' => [ - 'argumentValue' => 'TEXT', - 'expectedPropertyValue' => 'Text', - ], - 'Mixed case Text generator passed' => [ - 'argumentValue' => 'tEXt', - 'expectedPropertyValue' => 'Text', - ], - 'Lowercase HTML generator passed' => [ - 'argumentValue' => 'html', - 'expectedPropertyValue' => 'HTML', - ], - ]; - - }//end dataValidGeneratorNames() - - - /** - * Ensure that only the first argument is processed and others are ignored. - * - * @return void - */ - public function testOnlySetOnce() - { - $config = new ConfigDouble( - [ - '--generator=Text', - '--generator=HTML', - '--generator=InvalidGenerator', - ] - ); - - $this->assertSame('Text', $config->generator); - - }//end testOnlySetOnce() - - - /** - * Ensure that an exception is thrown for an invalid generator. - * - * @param string $generatorName Generator name. - * - * @dataProvider dataInvalidGeneratorNames - * - * @return void - */ - public function testInvalidGenerator($generatorName) - { - $exception = 'PHP_CodeSniffer\Exceptions\DeepExitException'; - $message = 'ERROR: "'.$generatorName.'" is not a valid generator. The following generators are supported: Text, HTML and Markdown.'; - - if (method_exists($this, 'expectException') === true) { - // PHPUnit 5+. - $this->expectException($exception); - $this->expectExceptionMessage($message); - } else { - // PHPUnit 4. - $this->setExpectedException($exception, $message); - } - - new ConfigDouble(["--generator={$generatorName}"]); - - }//end testInvalidGenerator() - - - /** - * Data provider for testInvalidGenerator(). - * - * @see self::testInvalidGenerator() - * - * @return array> - */ - public static function dataInvalidGeneratorNames() - { - return [ - ['InvalidGenerator'], - ['Text,HTML'], - [''], - ]; - - }//end dataInvalidGeneratorNames() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Config/ReportArgsTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Config/ReportArgsTest.php deleted file mode 100644 index 7640301..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Config/ReportArgsTest.php +++ /dev/null @@ -1,64 +0,0 @@ -markTestSkipped('This test needs CS mode to run'); - } - - $config = new ConfigDouble(['--report-file='.__DIR__.'/report.txt']); - - $this->assertTrue(is_string($config->reportFile)); - $this->assertStringEndsWith('/report.txt', $config->reportFile); - $this->assertSame(['full' => null], $config->reports); - - }//end testReportFileDoesNotSetReportsCs() - - - /** - * [CBF mode] Verify that passing `--report-file` does not influence *which* reports get activated. - * - * @group CBF - * - * @return void - */ - public function testReportFileDoesNotSetReportsCbf() - { - if (PHP_CODESNIFFER_CBF === false) { - $this->markTestSkipped('This test needs CBF mode to run'); - } - - $config = new ConfigDouble(['--report-file='.__DIR__.'/report.txt']); - - $this->assertNull($config->reportFile); - $this->assertSame(['full' => null], $config->reports); - - }//end testReportFileDoesNotSetReportsCbf() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Config/ReportWidthTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Config/ReportWidthTest.php deleted file mode 100644 index 74dbce3..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Config/ReportWidthTest.php +++ /dev/null @@ -1,260 +0,0 @@ - - * @copyright 2006-2023 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Config; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Tests\Core\Config\AbstractRealConfigTestCase; - -/** - * Tests for the \PHP_CodeSniffer\Config reportWidth value. - * - * @covers \PHP_CodeSniffer\Config::__get - */ -final class ReportWidthTest extends AbstractRealConfigTestCase -{ - - - /** - * Test that report width without overrules will always be set to a non-0 positive integer. - * - * @covers \PHP_CodeSniffer\Config::__set - * @covers \PHP_CodeSniffer\Config::restoreDefaults - * - * @return void - */ - public function testReportWidthDefault() - { - $config = new Config(['--standard=PSR1']); - - // Can't test the exact value as "auto" will resolve differently depending on the machine running the tests. - $this->assertTrue(is_int($config->reportWidth), 'Report width is not an integer'); - $this->assertGreaterThan(0, $config->reportWidth, 'Report width is not greater than 0'); - - }//end testReportWidthDefault() - - - /** - * Test that the report width will be set to a non-0 positive integer when not found in the CodeSniffer.conf file. - * - * @covers \PHP_CodeSniffer\Config::__set - * @covers \PHP_CodeSniffer\Config::restoreDefaults - * - * @return void - */ - public function testReportWidthWillBeSetFromAutoWhenNotFoundInConfFile() - { - $phpCodeSnifferConfig = [ - 'default_standard' => 'PSR2', - 'show_warnings' => '0', - ]; - - $this->setStaticConfigProperty('configData', $phpCodeSnifferConfig); - - $config = new Config(['--standard=PSR1']); - - // Can't test the exact value as "auto" will resolve differently depending on the machine running the tests. - $this->assertTrue(is_int($config->reportWidth), 'Report width is not an integer'); - $this->assertGreaterThan(0, $config->reportWidth, 'Report width is not greater than 0'); - - }//end testReportWidthWillBeSetFromAutoWhenNotFoundInConfFile() - - - /** - * Test that the report width will be set correctly when found in the CodeSniffer.conf file. - * - * @covers \PHP_CodeSniffer\Config::__set - * @covers \PHP_CodeSniffer\Config::getConfigData - * @covers \PHP_CodeSniffer\Config::restoreDefaults - * - * @return void - */ - public function testReportWidthCanBeSetFromConfFile() - { - $phpCodeSnifferConfig = [ - 'default_standard' => 'PSR2', - 'report_width' => '120', - ]; - - $this->setStaticConfigProperty('configData', $phpCodeSnifferConfig); - - $config = new Config(['--standard=PSR1']); - $this->assertSame(120, $config->reportWidth); - - }//end testReportWidthCanBeSetFromConfFile() - - - /** - * Test that the report width will be set correctly when passed as a CLI argument. - * - * @covers \PHP_CodeSniffer\Config::__set - * @covers \PHP_CodeSniffer\Config::processLongArgument - * - * @return void - */ - public function testReportWidthCanBeSetFromCLI() - { - $_SERVER['argv'] = [ - 'phpcs', - '--standard=PSR1', - '--report-width=100', - ]; - - $config = new Config(); - $this->assertSame(100, $config->reportWidth); - - }//end testReportWidthCanBeSetFromCLI() - - - /** - * Test that the report width will be set correctly when multiple report widths are passed on the CLI. - * - * @covers \PHP_CodeSniffer\Config::__set - * @covers \PHP_CodeSniffer\Config::processLongArgument - * - * @return void - */ - public function testReportWidthWhenSetFromCLIFirstValuePrevails() - { - $_SERVER['argv'] = [ - 'phpcs', - '--standard=PSR1', - '--report-width=100', - '--report-width=200', - ]; - - $config = new Config(); - $this->assertSame(100, $config->reportWidth); - - }//end testReportWidthWhenSetFromCLIFirstValuePrevails() - - - /** - * Test that a report width passed as a CLI argument will overrule a report width set in a CodeSniffer.conf file. - * - * @covers \PHP_CodeSniffer\Config::__set - * @covers \PHP_CodeSniffer\Config::processLongArgument - * @covers \PHP_CodeSniffer\Config::getConfigData - * - * @return void - */ - public function testReportWidthSetFromCLIOverrulesConfFile() - { - $phpCodeSnifferConfig = [ - 'default_standard' => 'PSR2', - 'report_format' => 'summary', - 'show_warnings' => '0', - 'show_progress' => '1', - 'report_width' => '120', - ]; - - $this->setStaticConfigProperty('configData', $phpCodeSnifferConfig); - - $cliArgs = [ - 'phpcs', - '--standard=PSR1', - '--report-width=180', - ]; - - $config = new Config($cliArgs); - $this->assertSame(180, $config->reportWidth); - - }//end testReportWidthSetFromCLIOverrulesConfFile() - - - /** - * Test that the report width will be set to a non-0 positive integer when set to "auto". - * - * @covers \PHP_CodeSniffer\Config::__set - * - * @return void - */ - public function testReportWidthInputHandlingForAuto() - { - $config = new Config(['--standard=PSR1']); - $config->reportWidth = 'auto'; - - // Can't test the exact value as "auto" will resolve differently depending on the machine running the tests. - $this->assertTrue(is_int($config->reportWidth), 'Report width is not an integer'); - $this->assertGreaterThan(0, $config->reportWidth, 'Report width is not greater than 0'); - - }//end testReportWidthInputHandlingForAuto() - - - /** - * Test that the report width will be set correctly for various types of input. - * - * @param mixed $value Input value received. - * @param int $expected Expected report width. - * - * @dataProvider dataReportWidthInputHandling - * @covers \PHP_CodeSniffer\Config::__set - * - * @return void - */ - public function testReportWidthInputHandling($value, $expected) - { - $config = new Config(['--standard=PSR1']); - $config->reportWidth = $value; - - $this->assertSame($expected, $config->reportWidth); - - }//end testReportWidthInputHandling() - - - /** - * Data provider. - * - * @return array> - */ - public static function dataReportWidthInputHandling() - { - return [ - 'No value (empty string)' => [ - 'value' => '', - 'expected' => Config::DEFAULT_REPORT_WIDTH, - ], - 'Value: invalid input type null' => [ - 'value' => null, - 'expected' => Config::DEFAULT_REPORT_WIDTH, - ], - 'Value: invalid input type false' => [ - 'value' => false, - 'expected' => Config::DEFAULT_REPORT_WIDTH, - ], - 'Value: invalid input type float' => [ - 'value' => 100.50, - 'expected' => Config::DEFAULT_REPORT_WIDTH, - ], - 'Value: invalid string value "invalid"' => [ - 'value' => 'invalid', - 'expected' => Config::DEFAULT_REPORT_WIDTH, - ], - 'Value: invalid string value, non-integer string "50.25"' => [ - 'value' => '50.25', - 'expected' => Config::DEFAULT_REPORT_WIDTH, - ], - 'Value: valid numeric string value' => [ - 'value' => '250', - 'expected' => 250, - ], - 'Value: valid int value' => [ - 'value' => 220, - 'expected' => 220, - ], - 'Value: negative int value becomes positive int' => [ - 'value' => -180, - 'expected' => 180, - ], - ]; - - }//end dataReportWidthInputHandling() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Config/SniffsExcludeArgsTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Config/SniffsExcludeArgsTest.php deleted file mode 100644 index b7e71e0..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Config/SniffsExcludeArgsTest.php +++ /dev/null @@ -1,327 +0,0 @@ - - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Config; - -use PHP_CodeSniffer\Tests\ConfigDouble; -use PHPUnit\Framework\TestCase; - -/** - * Tests for the \PHP_CodeSniffer\Config --sniffs and --exclude arguments. - * - * @covers \PHP_CodeSniffer\Config::parseSniffCodes - * @covers \PHP_CodeSniffer\Config::processLongArgument - */ -final class SniffsExcludeArgsTest extends TestCase -{ - - - /** - * Ensure that the expected error message is returned for invalid arguments. - * - * @param string $argument Either 'sniffs' or 'exclude'. - * @param string $value List of sniffs to include / exclude. - * @param array $errors Sniff code and associated help text. - * @param string|null $suggestion Help text shown to end user with correct syntax for argument. - * - * @return void - * @dataProvider dataInvalid - */ - public function testInvalid($argument, $value, $errors, $suggestion) - { - $cmd = 'phpcs'; - if (PHP_CODESNIFFER_CBF === true) { - $cmd = 'phpcbf'; - } - - $exception = 'PHP_CodeSniffer\Exceptions\DeepExitException'; - $message = 'ERROR: The --'.$argument.' option only supports sniff codes.'.PHP_EOL; - $message .= 'Sniff codes are in the form "Standard.Category.Sniff".'.PHP_EOL; - $message .= PHP_EOL; - $message .= 'The following problems were detected:'.PHP_EOL; - $message .= '* '.implode(PHP_EOL.'* ', $errors).PHP_EOL; - - if ($suggestion !== null) { - $message .= PHP_EOL; - $message .= "Perhaps try --$argument=\"$suggestion\" instead.".PHP_EOL; - } - - $message .= PHP_EOL; - $message .= "Run \"{$cmd} --help\" for usage information".PHP_EOL; - $message .= PHP_EOL; - - if (method_exists($this, 'expectException') === true) { - // PHPUnit 5+. - $this->expectException($exception); - $this->expectExceptionMessage($message); - } else { - // PHPUnit 4. - $this->setExpectedException($exception, $message); - } - - new ConfigDouble(["--$argument=$value"]); - - }//end testInvalid() - - - /** - * Data provider for testInvalid(). - * - * @see self::testInvalid() - * @return array|string|null>> - */ - public static function dataInvalid() - { - $arguments = [ - 'sniffs', - 'exclude', - ]; - $data = []; - - foreach ($arguments as $argument) { - // Empty values are errors. - $data[$argument.'; empty string'] = [ - 'argument' => $argument, - 'value' => '', - 'errors' => [ - 'No codes specified / empty argument', - ], - 'suggestion' => null, - ]; - $data[$argument.'; one comma alone'] = [ - 'argument' => $argument, - 'value' => ',', - 'errors' => [ - 'No codes specified / empty argument', - ], - 'suggestion' => null, - ]; - $data[$argument.'; two commas alone'] = [ - 'argument' => $argument, - 'value' => ',,', - 'errors' => [ - 'No codes specified / empty argument', - ], - 'suggestion' => null, - ]; - - // A standard is not a valid sniff. - $data[$argument.'; standard'] = [ - 'argument' => $argument, - 'value' => 'Standard', - 'errors' => [ - 'Standard codes are not supported: Standard', - ], - 'suggestion' => null, - ]; - - // A category is not a valid sniff. - $data[$argument.'; category'] = [ - 'argument' => $argument, - 'value' => 'Standard.Category', - 'errors' => [ - 'Category codes are not supported: Standard.Category', - ], - 'suggestion' => null, - ]; - - // An error-code is not a valid sniff. - $data[$argument.'; error-code'] = [ - 'argument' => $argument, - 'value' => 'Standard.Category.Sniff.Code', - 'errors' => [ - 'Message codes are not supported: Standard.Category.Sniff.Code', - ], - 'suggestion' => 'Standard.Category.Sniff', - ]; - - // Too many dots. - $data[$argument.'; too many dots'] = [ - 'argument' => $argument, - 'value' => 'Standard.Category.Sniff.Code.Extra', - 'errors' => [ - 'Too many parts: Standard.Category.Sniff.Code.Extra', - ], - 'suggestion' => 'Standard.Category.Sniff', - ]; - - // All errors are reported in one go. - $data[$argument.'; two errors'] = [ - 'argument' => $argument, - 'value' => 'StandardOne,StandardTwo', - 'errors' => [ - 'Standard codes are not supported: StandardOne', - 'Standard codes are not supported: StandardTwo', - ], - 'suggestion' => null, - ]; - - // Order of valid/invalid does not impact error reporting. - $data[$argument.'; valid followed by invalid'] = [ - 'argument' => $argument, - 'value' => 'StandardOne.Category.Sniff,StandardTwo.Category', - 'errors' => [ - 'Category codes are not supported: StandardTwo.Category', - ], - 'suggestion' => 'StandardOne.Category.Sniff', - ]; - $data[$argument.'; invalid followed by valid'] = [ - 'argument' => $argument, - 'value' => 'StandardOne.Category,StandardTwo.Category.Sniff', - 'errors' => [ - 'Category codes are not supported: StandardOne.Category', - ], - 'suggestion' => 'StandardTwo.Category.Sniff', - ]; - - // Different cases are reported individually (in duplicate), but suggestions are reduced. - $data[$argument.'; case mismatch - different errors'] = [ - 'argument' => $argument, - 'value' => 'Standard.Category.Sniff.Code,sTANDARD.cATEGORY.sNIFF.cODE.eXTRA', - 'errors' => [ - 'Message codes are not supported: Standard.Category.Sniff.Code', - 'Too many parts: sTANDARD.cATEGORY.sNIFF.cODE.eXTRA', - ], - 'suggestion' => 'Standard.Category.Sniff', - ]; - $data[$argument.'; case mismatch - same error'] = [ - 'argument' => $argument, - 'value' => 'sTANDARD.cATEGORY.sNIFF.cODE,Standard.Category.Sniff.Code', - 'errors' => [ - 'Message codes are not supported: sTANDARD.cATEGORY.sNIFF.cODE', - 'Message codes are not supported: Standard.Category.Sniff.Code', - ], - 'suggestion' => 'sTANDARD.cATEGORY.sNIFF', - ]; - }//end foreach - - return $data; - - }//end dataInvalid() - - - /** - * Ensure that the valid data does not throw an exception, and the value is stored. - * - * @param string $argument Either 'sniffs' or 'exclude'. - * @param string $value List of sniffs to include or exclude. - * @param array $result Expected sniffs to be set on the Config object. - * - * @return void - * @dataProvider dataValid - */ - public function testValid($argument, $value, $result) - { - $config = new ConfigDouble(["--$argument=$value"]); - - $this->assertSame($result, $config->$argument); - - }//end testValid() - - - /** - * Data provider for testValid(). - * - * @see self::testValid() - * @return array|string>> - */ - public static function dataValid() - { - $arguments = [ - 'sniffs', - 'exclude', - ]; - $data = []; - - foreach ($arguments as $argument) { - $data[$argument.'; one valid sniff'] = [ - 'argument' => $argument, - 'value' => 'Standard.Category.Sniff', - 'result' => ['Standard.Category.Sniff'], - ]; - $data[$argument.'; two valid sniffs'] = [ - 'argument' => $argument, - 'value' => 'StandardOne.Category.Sniff,StandardTwo.Category.Sniff', - 'result' => [ - 'StandardOne.Category.Sniff', - 'StandardTwo.Category.Sniff', - ], - ]; - - // Rogue commas are quietly ignored. - $data[$argument.'; trailing comma'] = [ - 'argument' => $argument, - 'value' => 'Standard.Category.Sniff,', - 'result' => ['Standard.Category.Sniff'], - ]; - $data[$argument.'; double comma between sniffs'] = [ - 'argument' => $argument, - 'value' => 'StandardOne.Category.Sniff,,StandardTwo.Category.Sniff', - 'result' => [ - 'StandardOne.Category.Sniff', - 'StandardTwo.Category.Sniff', - ], - ]; - - // Duplicates are reduced silently. - $data[$argument.'; one valid sniff twice'] = [ - 'argument' => $argument, - 'value' => 'Standard.Category.Sniff,Standard.Category.Sniff', - 'result' => ['Standard.Category.Sniff'], - ]; - $data[$argument.'; one valid sniff in different cases'] = [ - 'argument' => $argument, - 'value' => 'Standard.Category.Sniff, standard.category.sniff, STANDARD.CATEGORY.SNIFF', - 'result' => ['Standard.Category.Sniff'], - ]; - }//end foreach - - return $data; - - }//end dataValid() - - - /** - * Ensure that only the first argument is processed and others are ignored. - * - * @param string $argument Either 'sniffs' or 'exclude'. - * - * @return void - * @dataProvider dataOnlySetOnce - */ - public function testOnlySetOnce($argument) - { - $config = new ConfigDouble( - [ - "--$argument=StandardOne.Category.Sniff", - "--$argument=StandardTwo.Category.Sniff", - "--$argument=Standard.AnotherCategory.Sniff", - ] - ); - - $this->assertSame(['StandardOne.Category.Sniff'], $config->$argument); - - }//end testOnlySetOnce() - - - /** - * Data provider for testOnlySetOnce(). - * - * @return array> - */ - public static function dataOnlySetOnce() - { - return [ - 'sniffs' => ['sniffs'], - 'exclude' => ['exclude'], - ]; - - }//end dataOnlySetOnce() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/ErrorSuppressionTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/ErrorSuppressionTest.php deleted file mode 100644 index aa5aa95..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/ErrorSuppressionTest.php +++ /dev/null @@ -1,1277 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core; - -use PHP_CodeSniffer\Files\DummyFile; -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Tests\ConfigDouble; -use PHPUnit\Framework\TestCase; - -/** - * Tests for PHP_CodeSniffer error suppression tags. - * - * @covers PHP_CodeSniffer\Files\File::addMessage - * @covers PHP_CodeSniffer\Tokenizers\Tokenizer::createPositionMap - */ -final class ErrorSuppressionTest extends TestCase -{ - - - /** - * Test suppressing a single error. - * - * @param string $before Annotation to place before the code. - * @param string $after Annotation to place after the code. - * @param int $expectedErrors Optional. Number of errors expected. - * Defaults to 0. - * - * @dataProvider dataSuppressError - * - * @return void - */ - public function testSuppressError($before, $after, $expectedErrors=0) - { - static $config, $ruleset; - - if (isset($config, $ruleset) === false) { - $config = new ConfigDouble(); - $config->standards = ['Generic']; - $config->sniffs = ['Generic.PHP.LowerCaseConstant']; - - $ruleset = new Ruleset($config); - } - - $content = 'process(); - - $this->assertSame($expectedErrors, $file->getErrorCount()); - $this->assertCount($expectedErrors, $file->getErrors()); - - }//end testSuppressError() - - - /** - * Data provider. - * - * @see testSuppressError() - * - * @return array> - */ - public static function dataSuppressError() - { - return [ - 'no suppression' => [ - 'before' => '', - 'after' => '', - 'expectedErrors' => 1, - ], - - // Inline slash comments. - 'disable/enable: slash comment' => [ - 'before' => '// phpcs:disable'.PHP_EOL, - 'after' => '// phpcs:enable', - ], - 'disable/enable: multi-line slash comment, tab indented' => [ - 'before' => "\t".'// For reasons'.PHP_EOL."\t".'// phpcs:disable'.PHP_EOL."\t", - 'after' => "\t".'// phpcs:enable', - ], - 'disable/enable: slash comment, with @' => [ - 'before' => '// @phpcs:disable'.PHP_EOL, - 'after' => '// @phpcs:enable', - ], - 'disable/enable: slash comment, mixed case' => [ - 'before' => '// PHPCS:Disable'.PHP_EOL, - 'after' => '// pHPcs:enabLE', - ], - - // Inline hash comments. - 'disable/enable: hash comment' => [ - 'before' => '# phpcs:disable'.PHP_EOL, - 'after' => '# phpcs:enable', - ], - 'disable/enable: multi-line hash comment, tab indented' => [ - 'before' => "\t".'# For reasons'.PHP_EOL."\t".'# phpcs:disable'.PHP_EOL."\t", - 'after' => "\t".'# phpcs:enable', - ], - 'disable/enable: hash comment, with @' => [ - 'before' => '# @phpcs:disable'.PHP_EOL, - 'after' => '# @phpcs:enable', - ], - 'disable/enable: hash comment, mixed case' => [ - 'before' => '# PHPCS:Disable'.PHP_EOL, - 'after' => '# pHPcs:enabLE', - ], - - // Inline star (block) comments. - 'disable/enable: star comment' => [ - 'before' => '/* phpcs:disable */'.PHP_EOL, - 'after' => '/* phpcs:enable */', - ], - 'disable/enable: multi-line star comment' => [ - 'before' => '/*'.PHP_EOL.' phpcs:disable'.PHP_EOL.' */'.PHP_EOL, - 'after' => '/*'.PHP_EOL.' phpcs:enable'.PHP_EOL.' */', - ], - 'disable/enable: multi-line star comment, each line starred' => [ - 'before' => '/*'.PHP_EOL.' * phpcs:disable'.PHP_EOL.' */'.PHP_EOL, - 'after' => '/*'.PHP_EOL.' * phpcs:enable'.PHP_EOL.' */', - ], - 'disable/enable: multi-line star comment, each line starred, tab indented' => [ - 'before' => "\t".'/*'.PHP_EOL."\t".' * phpcs:disable'.PHP_EOL."\t".' */'.PHP_EOL."\t", - 'after' => "\t".'/*'.PHP_EOL.' * phpcs:enable'.PHP_EOL.' */', - ], - - // Docblock comments. - 'disable/enable: single line docblock comment' => [ - 'before' => '/** phpcs:disable */'.PHP_EOL, - 'after' => '/** phpcs:enable */', - ], - - // Deprecated syntax. - 'old style: slash comment' => [ - 'before' => '// @codingStandardsIgnoreStart'.PHP_EOL, - 'after' => '// @codingStandardsIgnoreEnd', - ], - 'old style: star comment' => [ - 'before' => '/* @codingStandardsIgnoreStart */'.PHP_EOL, - 'after' => '/* @codingStandardsIgnoreEnd */', - ], - 'old style: multi-line star comment' => [ - 'before' => '/*'.PHP_EOL.' @codingStandardsIgnoreStart'.PHP_EOL.' */'.PHP_EOL, - 'after' => '/*'.PHP_EOL.' @codingStandardsIgnoreEnd'.PHP_EOL.' */', - ], - 'old style: single line docblock comment' => [ - 'before' => '/** @codingStandardsIgnoreStart */'.PHP_EOL, - 'after' => '/** @codingStandardsIgnoreEnd */', - ], - ]; - - }//end dataSuppressError() - - - /** - * Test suppressing 1 out of 2 errors. - * - * @param string $before Annotation to place before the code. - * @param string $between Annotation to place between the code. - * @param int $expectedErrors Optional. Number of errors expected. - * Defaults to 1. - * - * @dataProvider dataSuppressSomeErrors - * - * @return void - */ - public function testSuppressSomeErrors($before, $between, $expectedErrors=1) - { - static $config, $ruleset; - - if (isset($config, $ruleset) === false) { - $config = new ConfigDouble(); - $config->standards = ['Generic']; - $config->sniffs = ['Generic.PHP.LowerCaseConstant']; - - $ruleset = new Ruleset($config); - } - - $content = <<process(); - - $this->assertSame($expectedErrors, $file->getErrorCount()); - $this->assertCount($expectedErrors, $file->getErrors()); - - }//end testSuppressSomeErrors() - - - /** - * Data provider. - * - * @see testSuppressSomeErrors() - * - * @return array> - */ - public static function dataSuppressSomeErrors() - { - return [ - 'no suppression' => [ - 'before' => '', - 'between' => '', - 'expectedErrors' => 2, - ], - - // With suppression. - 'disable/enable: slash comment' => [ - 'before' => '// phpcs:disable', - 'between' => '// phpcs:enable', - ], - 'disable/enable: slash comment, with @' => [ - 'before' => '// @phpcs:disable', - 'between' => '// @phpcs:enable', - ], - 'disable/enable: hash comment' => [ - 'before' => '# phpcs:disable', - 'between' => '# phpcs:enable', - ], - 'disable/enable: hash comment, with @' => [ - 'before' => '# @phpcs:disable', - 'between' => '# @phpcs:enable', - ], - 'disable/enable: single line docblock comment' => [ - 'before' => '/** phpcs:disable */', - 'between' => '/** phpcs:enable */', - ], - - // Deprecated syntax. - 'old style: slash comment' => [ - 'before' => '// @codingStandardsIgnoreStart', - 'between' => '// @codingStandardsIgnoreEnd', - ], - 'old style: single line docblock comment' => [ - 'before' => '/** @codingStandardsIgnoreStart */', - 'between' => '/** @codingStandardsIgnoreEnd */', - ], - ]; - - }//end dataSuppressSomeErrors() - - - /** - * Test suppressing a single warning. - * - * @param string $before Annotation to place before the code. - * @param string $after Annotation to place after the code. - * @param int $expectedWarnings Optional. Number of warnings expected. - * Defaults to 0. - * - * @dataProvider dataSuppressWarning - * - * @return void - */ - public function testSuppressWarning($before, $after, $expectedWarnings=0) - { - static $config, $ruleset; - - if (isset($config, $ruleset) === false) { - $config = new ConfigDouble(); - $config->standards = ['Generic']; - $config->sniffs = ['Generic.Commenting.Todo']; - - $ruleset = new Ruleset($config); - } - - $content = <<process(); - - $this->assertSame($expectedWarnings, $file->getWarningCount()); - $this->assertCount($expectedWarnings, $file->getWarnings()); - - }//end testSuppressWarning() - - - /** - * Data provider. - * - * @see testSuppressWarning() - * - * @return array> - */ - public static function dataSuppressWarning() - { - return [ - 'no suppression' => [ - 'before' => '', - 'after' => '', - 'expectedWarnings' => 1, - ], - - // With suppression. - 'disable/enable: slash comment' => [ - 'before' => '// phpcs:disable', - 'after' => '// phpcs:enable', - ], - 'disable/enable: slash comment, with @' => [ - 'before' => '// @phpcs:disable', - 'after' => '// @phpcs:enable', - ], - 'disable/enable: single line docblock comment' => [ - 'before' => '/** phpcs:disable */', - 'after' => '/** phpcs:enable */', - ], - - // Deprecated syntax. - 'old style: slash comment' => [ - 'before' => '// @codingStandardsIgnoreStart', - 'after' => '// @codingStandardsIgnoreEnd', - ], - 'old style: single line docblock comment' => [ - 'before' => '/** @codingStandardsIgnoreStart */', - 'after' => '/** @codingStandardsIgnoreEnd */', - ], - ]; - - }//end dataSuppressWarning() - - - /** - * Test suppressing a single error using a single line ignore. - * - * @param string $before Annotation to place before the code. - * @param string $after Optional. Annotation to place after the code. - * Defaults to an empty string. - * @param int $expectedErrors Optional. Number of errors expected. - * Defaults to 1. - * - * @dataProvider dataSuppressLine - * - * @return void - */ - public function testSuppressLine($before, $after='', $expectedErrors=1) - { - static $config, $ruleset; - - if (isset($config, $ruleset) === false) { - $config = new ConfigDouble(); - $config->standards = ['Generic']; - $config->sniffs = ['Generic.PHP.LowerCaseConstant']; - - $ruleset = new Ruleset($config); - } - - $content = <<process(); - - $this->assertSame($expectedErrors, $file->getErrorCount()); - $this->assertCount($expectedErrors, $file->getErrors()); - - }//end testSuppressLine() - - - /** - * Data provider. - * - * @see testSuppressLine() - * - * @return array> - */ - public static function dataSuppressLine() - { - return [ - 'no suppression' => [ - 'before' => '', - 'after' => '', - 'expectedErrors' => 2, - ], - - // With suppression on line before. - 'ignore: line before, slash comment' => [ - 'before' => '// phpcs:ignore', - ], - 'ignore: line before, slash comment, with @' => [ - 'before' => '// @phpcs:ignore', - ], - 'ignore: line before, hash comment' => [ - 'before' => '# phpcs:ignore', - ], - 'ignore: line before, hash comment, with @' => [ - 'before' => '# @phpcs:ignore', - ], - 'ignore: line before, star comment' => [ - 'before' => '/* phpcs:ignore */', - ], - 'ignore: line before, star comment, with @' => [ - 'before' => '/* @phpcs:ignore */', - ], - - // With suppression as trailing comment on code line. - 'ignore: end of line, slash comment' => [ - 'before' => '', - 'after' => ' // phpcs:ignore', - ], - 'ignore: end of line, slash comment, with @' => [ - 'before' => '', - 'after' => ' // @phpcs:ignore', - ], - 'ignore: end of line, hash comment' => [ - 'before' => '', - 'after' => ' # phpcs:ignore', - ], - 'ignore: end of line, hash comment, with @' => [ - 'before' => '', - 'after' => ' # @phpcs:ignore', - ], - - // Deprecated syntax. - 'old style: line before, slash comment' => [ - 'before' => '// @codingStandardsIgnoreLine', - ], - 'old style: end of line, slash comment' => [ - 'before' => '', - 'after' => ' // @codingStandardsIgnoreLine', - ], - ]; - - }//end dataSuppressLine() - - - /** - * Test suppressing a single error using a single line ignore in the middle of a line. - * - * @return void - */ - public function testSuppressLineMidLine() - { - $config = new ConfigDouble(); - $config->standards = ['Generic']; - $config->sniffs = ['Generic.PHP.LowerCaseConstant']; - - $ruleset = new Ruleset($config); - - $content = 'process(); - - $this->assertSame(0, $file->getErrorCount()); - $this->assertCount(0, $file->getErrors()); - - }//end testSuppressLineMidLine() - - - /** - * Test suppressing a single error using a single line ignore within a docblock. - * - * @return void - */ - public function testSuppressLineWithinDocblock() - { - $config = new ConfigDouble(); - $config->standards = ['Generic']; - $config->sniffs = ['Generic.Files.LineLength']; - - $ruleset = new Ruleset($config); - - // Process with @ suppression on line before inside docblock. - $comment = str_repeat('a ', 50); - $content = <<process(); - - $this->assertSame(0, $file->getErrorCount()); - $this->assertCount(0, $file->getErrors()); - - }//end testSuppressLineWithinDocblock() - - - /** - * Test that using a single line ignore does not interfere with other suppressions. - * - * @param string $before Annotation to place before the code. - * @param string $after Annotation to place after the code. - * - * @dataProvider dataNestedSuppressLine - * - * @return void - */ - public function testNestedSuppressLine($before, $after) - { - static $config, $ruleset; - - if (isset($config, $ruleset) === false) { - $config = new ConfigDouble(); - $config->standards = ['Generic']; - $config->sniffs = ['Generic.PHP.LowerCaseConstant']; - - $ruleset = new Ruleset($config); - } - - $content = <<process(); - - $this->assertSame(0, $file->getErrorCount()); - $this->assertCount(0, $file->getErrors()); - - }//end testNestedSuppressLine() - - - /** - * Data provider. - * - * @see testNestedSuppressLine() - * - * @return array> - */ - public static function dataNestedSuppressLine() - { - return [ - // Process with disable/enable suppression and no single line suppression. - 'disable/enable: slash comment, no single line suppression' => [ - 'before' => '// phpcs:disable', - 'after' => '// phpcs:enable', - ], - 'disable/enable: slash comment, with @, no single line suppression' => [ - 'before' => '// @phpcs:disable', - 'after' => '// @phpcs:enable', - ], - 'disable/enable: hash comment, no single line suppression' => [ - 'before' => '# phpcs:disable', - 'after' => '# phpcs:enable', - ], - 'old style: slash comment, no single line suppression' => [ - 'before' => '// @codingStandardsIgnoreStart', - 'after' => '// @codingStandardsIgnoreEnd', - ], - - // Process with line suppression nested within disable/enable suppression. - 'disable/enable: slash comment, next line nested single line suppression' => [ - 'before' => '// phpcs:disable'.PHP_EOL.'// phpcs:ignore', - 'after' => '// phpcs:enable', - ], - 'disable/enable: slash comment, with @, next line nested single line suppression' => [ - 'before' => '// @phpcs:disable'.PHP_EOL.'// @phpcs:ignore', - 'after' => '// @phpcs:enable', - ], - 'disable/enable: hash comment, next line nested single line suppression' => [ - 'before' => '# @phpcs:disable'.PHP_EOL.'# @phpcs:ignore', - 'after' => '# @phpcs:enable', - ], - 'old style: slash comment, next line nested single line suppression' => [ - 'before' => '// @codingStandardsIgnoreStart'.PHP_EOL.'// @codingStandardsIgnoreLine', - 'after' => '// @codingStandardsIgnoreEnd', - ], - ]; - - }//end dataNestedSuppressLine() - - - /** - * Test suppressing a scope opener. - * - * @param string $before Annotation to place before the scope opener. - * @param string $after Annotation to place after the scope opener. - * @param int $expectedErrors Optional. Number of errors expected. - * Defaults to 0. - * - * @dataProvider dataSuppressScope - * - * @return void - */ - public function testSuppressScope($before, $after, $expectedErrors=0) - { - static $config, $ruleset; - - if (isset($config, $ruleset) === false) { - $config = new ConfigDouble(); - $config->standards = ['PEAR']; - $config->sniffs = ['PEAR.Functions.FunctionDeclaration']; - - $ruleset = new Ruleset($config); - } - - $content = <<foo(); - } -} -EOD; - $file = new DummyFile($content, $ruleset, $config); - $file->process(); - - $this->assertSame($expectedErrors, $file->getErrorCount()); - $this->assertCount($expectedErrors, $file->getErrors()); - - }//end testSuppressScope() - - - /** - * Data provider. - * - * @see testSuppressScope() - * - * @return array> - */ - public static function dataSuppressScope() - { - return [ - 'no suppression' => [ - 'before' => '', - 'after' => '', - 'expectedErrors' => 1, - ], - - // Process with suppression. - 'disable/enable: slash comment' => [ - 'before' => '//phpcs:disable', - 'after' => '//phpcs:enable', - ], - 'disable/enable: slash comment, with @' => [ - 'before' => '//@phpcs:disable', - 'after' => '//@phpcs:enable', - ], - 'disable/enable: hash comment' => [ - 'before' => '#phpcs:disable', - 'after' => '#phpcs:enable', - ], - 'disable/enable: single line docblock comment' => [ - 'before' => '/** phpcs:disable */', - 'after' => '/** phpcs:enable */', - ], - 'disable/enable: single line docblock comment, with @' => [ - 'before' => '/** @phpcs:disable */', - 'after' => '/** @phpcs:enable */', - ], - - // Deprecated syntax. - 'old style: start/end, slash comment' => [ - 'before' => '//@codingStandardsIgnoreStart', - 'after' => '//@codingStandardsIgnoreEnd', - ], - 'old style: start/end, single line docblock comment' => [ - 'before' => '/** @codingStandardsIgnoreStart */', - 'after' => '/** @codingStandardsIgnoreEnd */', - ], - ]; - - }//end dataSuppressScope() - - - /** - * Test suppressing a whole file. - * - * @param string $before Annotation to place before the code. - * @param string $after Optional. Annotation to place after the code. - * Defaults to an empty string. - * @param int $expectedWarnings Optional. Number of warnings expected. - * Defaults to 0. - * - * @dataProvider dataSuppressFile - * - * @return void - */ - public function testSuppressFile($before, $after='', $expectedWarnings=0) - { - static $config, $ruleset; - - if (isset($config, $ruleset) === false) { - $config = new ConfigDouble(); - $config->standards = ['Generic']; - $config->sniffs = ['Generic.Commenting.Todo']; - - $ruleset = new Ruleset($config); - } - - $content = <<process(); - - $this->assertSame($expectedWarnings, $file->getWarningCount()); - $this->assertCount($expectedWarnings, $file->getWarnings()); - - }//end testSuppressFile() - - - /** - * Data provider. - * - * @see testSuppressFile() - * - * @return array> - */ - public static function dataSuppressFile() - { - return [ - 'no suppression' => [ - 'before' => '', - 'after' => '', - 'expectedWarnings' => 1, - ], - - // Process with suppression. - 'ignoreFile: start of file, slash comment' => [ - 'before' => '// phpcs:ignoreFile', - ], - 'ignoreFile: start of file, slash comment, with @' => [ - 'before' => '// @phpcs:ignoreFile', - ], - 'ignoreFile: start of file, slash comment, mixed case' => [ - 'before' => '// PHPCS:Ignorefile', - ], - 'ignoreFile: start of file, hash comment' => [ - 'before' => '# phpcs:ignoreFile', - ], - 'ignoreFile: start of file, hash comment, with @' => [ - 'before' => '# @phpcs:ignoreFile', - ], - 'ignoreFile: start of file, single-line star comment' => [ - 'before' => '/* phpcs:ignoreFile */', - ], - 'ignoreFile: start of file, multi-line star comment' => [ - 'before' => '/*'.PHP_EOL.' phpcs:ignoreFile'.PHP_EOL.' */', - ], - 'ignoreFile: start of file, single-line docblock comment' => [ - 'before' => '/** phpcs:ignoreFile */', - ], - - // Process late comment. - 'ignoreFile: late comment, slash comment' => [ - 'before' => '', - 'after' => '// phpcs:ignoreFile', - ], - - // Deprecated syntax. - 'old style: start of file, slash comment' => [ - 'before' => '// @codingStandardsIgnoreFile', - ], - 'old style: start of file, single-line star comment' => [ - 'before' => '/* @codingStandardsIgnoreFile */', - ], - 'old style: start of file, multi-line star comment' => [ - 'before' => '/*'.PHP_EOL.' @codingStandardsIgnoreFile'.PHP_EOL.' */', - ], - 'old style: start of file, single-line docblock comment' => [ - 'before' => '/** @codingStandardsIgnoreFile */', - ], - - // Deprecated syntax, late comment. - 'old style: late comment, slash comment' => [ - 'before' => '', - 'after' => '// @codingStandardsIgnoreFile', - ], - ]; - - }//end dataSuppressFile() - - - /** - * Test disabling specific sniffs. - * - * @param string $before Annotation to place before the code. - * @param int $expectedErrors Optional. Number of errors expected. - * Defaults to 0. - * @param int $expectedWarnings Optional. Number of warnings expected. - * Defaults to 0. - * - * @dataProvider dataDisableSelected - * - * @return void - */ - public function testDisableSelected($before, $expectedErrors=0, $expectedWarnings=0) - { - static $config, $ruleset; - - if (isset($config, $ruleset) === false) { - $config = new ConfigDouble(); - $config->standards = ['Generic']; - $config->sniffs = [ - 'Generic.PHP.LowerCaseConstant', - 'Generic.Commenting.Todo', - ]; - - $ruleset = new Ruleset($config); - } - - $content = <<process(); - - $this->assertSame($expectedErrors, $file->getErrorCount()); - $this->assertCount($expectedErrors, $file->getErrors()); - - $this->assertSame($expectedWarnings, $file->getWarningCount()); - $this->assertCount($expectedWarnings, $file->getWarnings()); - - }//end testDisableSelected() - - - /** - * Data provider. - * - * @see testDisableSelected() - * - * @return array> - */ - public static function dataDisableSelected() - { - return [ - // Single sniff. - 'disable: single sniff' => [ - 'before' => '// phpcs:disable Generic.Commenting.Todo', - 'expectedErrors' => 1, - ], - 'disable: single sniff with reason' => [ - 'before' => '# phpcs:disable Generic.Commenting.Todo -- for reasons', - 'expectedErrors' => 1, - ], - 'disable: single sniff, docblock' => [ - 'before' => '/**'.PHP_EOL.' * phpcs:disable Generic.Commenting.Todo'.PHP_EOL.' */ ', - 'expectedErrors' => 1, - ], - 'disable: single sniff, docblock, with @' => [ - 'before' => '/**'.PHP_EOL.' * @phpcs:disable Generic.Commenting.Todo'.PHP_EOL.' */ ', - 'expectedErrors' => 1, - ], - - // Multiple sniffs. - 'disable: multiple sniffs in one comment' => [ - 'before' => '// phpcs:disable Generic.Commenting.Todo,Generic.PHP.LowerCaseConstant', - ], - 'disable: multiple sniff in multiple comments' => [ - 'before' => '// phpcs:disable Generic.Commenting.Todo'.PHP_EOL.'// phpcs:disable Generic.PHP.LowerCaseConstant', - ], - - // Selectiveness variations. - 'disable: complete category' => [ - 'before' => '// phpcs:disable Generic.Commenting', - 'expectedErrors' => 1, - ], - 'disable: whole standard' => [ - 'before' => '// phpcs:disable Generic', - ], - 'disable: single errorcode' => [ - 'before' => '# @phpcs:disable Generic.Commenting.Todo.TaskFound', - 'expectedErrors' => 1, - ], - 'disable: single errorcode and a category' => [ - 'before' => '// phpcs:disable Generic.PHP.LowerCaseConstant.Found,Generic.Commenting', - ], - - // Wrong category/sniff/code. - 'disable: wrong error code and category' => [ - 'before' => '/**'.PHP_EOL.' * phpcs:disable Generic.PHP.LowerCaseConstant.Upper,Generic.Comments'.PHP_EOL.' */ ', - 'expectedErrors' => 1, - 'expectedWarnings' => 1, - ], - 'disable: wrong category, docblock' => [ - 'before' => '/**'.PHP_EOL.' * phpcs:disable Generic.Files'.PHP_EOL.' */ ', - 'expectedErrors' => 1, - 'expectedWarnings' => 1, - ], - 'disable: wrong category, docblock, with @' => [ - 'before' => '/**'.PHP_EOL.' * @phpcs:disable Generic.Files'.PHP_EOL.' */ ', - 'expectedErrors' => 1, - 'expectedWarnings' => 1, - ], - ]; - - }//end dataDisableSelected() - - - /** - * Test re-enabling specific sniffs that have been disabled. - * - * @param string $code Code pattern to check. - * @param int $expectedErrors Number of errors expected. - * @param int $expectedWarnings Number of warnings expected. - * - * @dataProvider dataEnableSelected - * - * @return void - */ - public function testEnableSelected($code, $expectedErrors, $expectedWarnings) - { - static $config, $ruleset; - - if (isset($config, $ruleset) === false) { - $config = new ConfigDouble(); - $config->standards = ['Generic']; - $config->sniffs = [ - 'Generic.PHP.LowerCaseConstant', - 'Generic.Commenting.Todo', - ]; - - $ruleset = new Ruleset($config); - } - - $content = 'process(); - - $this->assertSame($expectedErrors, $file->getErrorCount()); - $this->assertCount($expectedErrors, $file->getErrors()); - - $this->assertSame($expectedWarnings, $file->getWarningCount()); - $this->assertCount($expectedWarnings, $file->getWarnings()); - - }//end testEnableSelected() - - - /** - * Data provider. - * - * @see testEnableSelected() - * - * @return array> - */ - public static function dataEnableSelected() - { - return [ - 'disable/enable: a single sniff' => [ - 'code' => ' - // phpcs:disable Generic.Commenting.Todo - $var = FALSE; - //TODO: write some code - // phpcs:enable Generic.Commenting.Todo - //TODO: write some code', - 'expectedErrors' => 1, - 'expectedWarnings' => 1, - ], - 'disable/enable: multiple sniffs' => [ - 'code' => ' - // phpcs:disable Generic.Commenting.Todo,Generic.PHP.LowerCaseConstant - $var = FALSE; - //TODO: write some code - // phpcs:enable Generic.Commenting.Todo,Generic.PHP.LowerCaseConstant - //TODO: write some code - $var = FALSE;', - 'expectedErrors' => 1, - 'expectedWarnings' => 1, - ], - 'disable: multiple sniffs; enable: one' => [ - 'code' => ' - # phpcs:disable Generic.Commenting.Todo,Generic.PHP.LowerCaseConstant - $var = FALSE; - //TODO: write some code - # phpcs:enable Generic.Commenting.Todo - //TODO: write some code - $var = FALSE;', - 'expectedErrors' => 0, - 'expectedWarnings' => 1, - ], - 'disable/enable: complete category' => [ - 'code' => ' - // phpcs:disable Generic.Commenting - $var = FALSE; - //TODO: write some code - // phpcs:enable Generic.Commenting - //TODO: write some code', - 'expectedErrors' => 1, - 'expectedWarnings' => 1, - ], - 'disable/enable: whole standard' => [ - 'code' => ' - // phpcs:disable Generic - $var = FALSE; - //TODO: write some code - // phpcs:enable Generic - //TODO: write some code', - 'expectedErrors' => 0, - 'expectedWarnings' => 1, - ], - 'disable: whole standard; enable: category from the standard' => [ - 'code' => ' - // phpcs:disable Generic - $var = FALSE; - //TODO: write some code - // phpcs:enable Generic.Commenting - //TODO: write some code', - 'expectedErrors' => 0, - 'expectedWarnings' => 1, - ], - 'disable: a category; enable: the whole standard containing the category' => [ - 'code' => ' - # phpcs:disable Generic.Commenting - $var = FALSE; - //TODO: write some code - # phpcs:enable Generic - //TODO: write some code', - 'expectedErrors' => 1, - 'expectedWarnings' => 1, - ], - 'disable: single sniff; enable: the category containing the sniff' => [ - 'code' => ' - // phpcs:disable Generic.Commenting.Todo - $var = FALSE; - //TODO: write some code - // phpcs:enable Generic.Commenting - //TODO: write some code', - 'expectedErrors' => 1, - 'expectedWarnings' => 1, - ], - 'disable: whole standard; enable: single sniff from the standard' => [ - 'code' => ' - // phpcs:disable Generic - $var = FALSE; - //TODO: write some code - // phpcs:enable Generic.Commenting.Todo - //TODO: write some code', - 'expectedErrors' => 0, - 'expectedWarnings' => 1, - ], - 'disable: whole standard; enable: single sniff from the standard; disable: that same sniff; enable: everything' => [ - 'code' => ' - // phpcs:disable Generic - $var = FALSE; - //TODO: write some code - // phpcs:enable Generic.Commenting.Todo - //TODO: write some code - // phpcs:disable Generic.Commenting.Todo - //TODO: write some code - // phpcs:enable - //TODO: write some code', - 'expectedErrors' => 0, - 'expectedWarnings' => 2, - ], - 'disable: whole standard; enable: single sniff from the standard; enable: other sniff from the standard' => [ - 'code' => ' - // phpcs:disable Generic - $var = FALSE; - //TODO: write some code - // phpcs:enable Generic.Commenting.Todo - //TODO: write some code - $var = FALSE; - // phpcs:enable Generic.PHP.LowerCaseConstant - //TODO: write some code - $var = FALSE;', - 'expectedErrors' => 1, - 'expectedWarnings' => 2, - ], - ]; - - }//end dataEnableSelected() - - - /** - * Test ignoring specific sniffs. - * - * @param string $before Annotation to place before the code. - * @param int $expectedErrors Number of errors expected. - * @param int $expectedWarnings Number of warnings expected. - * - * @dataProvider dataIgnoreSelected - * - * @return void - */ - public function testIgnoreSelected($before, $expectedErrors, $expectedWarnings) - { - static $config, $ruleset; - - if (isset($config, $ruleset) === false) { - $config = new ConfigDouble(); - $config->standards = ['Generic']; - $config->sniffs = [ - 'Generic.PHP.LowerCaseConstant', - 'Generic.Commenting.Todo', - ]; - - $ruleset = new Ruleset($config); - } - - $content = <<process(); - - $this->assertSame($expectedErrors, $file->getErrorCount()); - $this->assertCount($expectedErrors, $file->getErrors()); - - $this->assertSame($expectedWarnings, $file->getWarningCount()); - $this->assertCount($expectedWarnings, $file->getWarnings()); - - }//end testIgnoreSelected() - - - /** - * Data provider. - * - * @see testIgnoreSelected() - * - * @return array> - */ - public static function dataIgnoreSelected() - { - return [ - 'no suppression' => [ - 'before' => '', - 'expectedErrors' => 2, - 'expectedWarnings' => 2, - ], - - // With suppression. - 'ignore: single sniff' => [ - 'before' => '// phpcs:ignore Generic.Commenting.Todo', - 'expectedErrors' => 2, - 'expectedWarnings' => 1, - ], - 'ignore: multiple sniffs' => [ - 'before' => '// phpcs:ignore Generic.Commenting.Todo,Generic.PHP.LowerCaseConstant', - 'expectedErrors' => 1, - 'expectedWarnings' => 1, - ], - 'disable: single sniff; ignore: single sniff' => [ - 'before' => '// phpcs:disable Generic.Commenting.Todo'.PHP_EOL.'// phpcs:ignore Generic.PHP.LowerCaseConstant', - 'expectedErrors' => 1, - 'expectedWarnings' => 0, - ], - 'ignore: category of sniffs' => [ - 'before' => '# phpcs:ignore Generic.Commenting', - 'expectedErrors' => 2, - 'expectedWarnings' => 1, - ], - 'ignore: whole standard' => [ - 'before' => '// phpcs:ignore Generic', - 'expectedErrors' => 1, - 'expectedWarnings' => 1, - ], - ]; - - }//end dataIgnoreSelected() - - - /** - * Test ignoring specific sniffs. - * - * @param string $code Code pattern to check. - * @param int $expectedErrors Number of errors expected. - * @param int $expectedWarnings Number of warnings expected. - * - * @dataProvider dataCommenting - * - * @return void - */ - public function testCommenting($code, $expectedErrors, $expectedWarnings) - { - static $config, $ruleset; - - if (isset($config, $ruleset) === false) { - $config = new ConfigDouble(); - $config->standards = ['Generic']; - $config->sniffs = [ - 'Generic.PHP.LowerCaseConstant', - 'Generic.Commenting.Todo', - ]; - - $ruleset = new Ruleset($config); - } - - $content = 'process(); - - $this->assertSame($expectedErrors, $file->getErrorCount()); - $this->assertCount($expectedErrors, $file->getErrors()); - - $this->assertSame($expectedWarnings, $file->getWarningCount()); - $this->assertCount($expectedWarnings, $file->getWarnings()); - - }//end testCommenting() - - - /** - * Data provider. - * - * @see testCommenting() - * - * @return array> - */ - public static function dataCommenting() - { - return [ - 'ignore: single sniff' => [ - 'code' => ' - // phpcs:ignore Generic.Commenting.Todo -- Because reasons - $var = FALSE; //TODO: write some code - $var = FALSE; //TODO: write some code', - 'expectedErrors' => 2, - 'expectedWarnings' => 1, - ], - 'disable: single sniff; enable: same sniff - test whitespace handling around reason delimiter' => [ - 'code' => ' - // phpcs:disable Generic.Commenting.Todo --Because reasons - $var = FALSE; - //TODO: write some code - // phpcs:enable Generic.Commenting.Todo -- Because reasons - //TODO: write some code', - 'expectedErrors' => 1, - 'expectedWarnings' => 1, - ], - 'disable: single sniff, multi-line comment' => [ - 'code' => ' - /* - Disable some checks - phpcs:disable Generic.Commenting.Todo - */ - $var = FALSE; - //TODO: write some code', - 'expectedErrors' => 1, - 'expectedWarnings' => 0, - ], - 'ignore: single sniff, multi-line slash comment' => [ - 'code' => ' - // Turn off a check for the next line of code. - // phpcs:ignore Generic.Commenting.Todo - $var = FALSE; //TODO: write some code - $var = FALSE; //TODO: write some code', - 'expectedErrors' => 2, - 'expectedWarnings' => 1, - ], - 'enable before disable, sniff not in standard' => [ - 'code' => ' - // phpcs:enable Generic.PHP.NoSilencedErrors -- Because reasons - $var = @delete( $filename ); - ', - 'expectedErrors' => 0, - 'expectedWarnings' => 0, - ], - ]; - - }//end dataCommenting() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/FindEndOfStatementTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/FindEndOfStatementTest.inc deleted file mode 100644 index 8351679..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/FindEndOfStatementTest.inc +++ /dev/null @@ -1,105 +0,0 @@ - fn() => return 1, - 'b' => fn() => return 1, -]; - -/* testStaticArrowFunction */ -static fn ($a) => $a; - -return 0; - -/* testArrowFunctionReturnValue */ -fn(): array => [a($a, $b)]; - -/* testArrowFunctionAsArgument */ -$foo = foo( - fn() => bar() -); - -/* testArrowFunctionWithArrayAsArgument */ -$foo = foo( - fn() => [$row[0], $row[3]] -); - -$match = match ($a) { - /* testMatchCase */ - 1 => 'foo', - /* testMatchDefault */ - default => 'bar' -}; - -$match = match ($a) { - /* testMatchMultipleCase */ - 1, 2, => $a * $b, - /* testMatchDefaultComma */ - default, => 'something' -}; - -match ($pressedKey) { - /* testMatchFunctionCall */ - Key::RETURN_ => save($value, $user) -}; - -$result = match (true) { - /* testMatchFunctionCallArm */ - str_contains($text, 'Welcome') || str_contains($text, 'Hello') => 'en', - str_contains($text, 'Bienvenue') || str_contains($text, 'Bonjour') => 'fr', - default => 'pl' -}; - -/* testMatchClosure */ -$result = match ($key) { - 1 => function($a, $b) {}, - 2 => function($b, $c) {}, -}; - -/* testMatchArray */ -$result = match ($key) { - 1 => [1,2,3], - 2 => [1 => one(), 2 => two()], -}; - -/* testNestedMatch */ -$result = match ($key) { - 1 => match ($key) { - 1 => 'one', - 2 => 'two', - }, - 2 => match ($key) { - 1 => 'two', - 2 => 'one', - }, -}; diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/FindEndOfStatementTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/FindEndOfStatementTest.php deleted file mode 100644 index 35e361e..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/FindEndOfStatementTest.php +++ /dev/null @@ -1,457 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Files\File; - -use PHP_CodeSniffer\Tests\Core\AbstractMethodUnitTest; -use PHP_CodeSniffer\Util\Tokens; - -/** - * Tests for the \PHP_CodeSniffer\Files\File::findEndOfStatement method. - * - * @covers \PHP_CodeSniffer\Files\File::findEndOfStatement - */ -final class FindEndOfStatementTest extends AbstractMethodUnitTest -{ - - - /** - * Test that end of statement is NEVER before the "current" token. - * - * @return void - */ - public function testEndIsNeverLessThanCurrentToken() - { - $tokens = self::$phpcsFile->getTokens(); - $errors = []; - - for ($i = 0; $i < self::$phpcsFile->numTokens; $i++) { - if (isset(Tokens::$emptyTokens[$tokens[$i]['code']]) === true) { - continue; - } - - $end = self::$phpcsFile->findEndOfStatement($i); - - // Collect all the errors. - if ($end < $i) { - $errors[] = sprintf( - 'End of statement for token %1$d (%2$s: %3$s) on line %4$d is %5$d (%6$s), which is less than %1$d', - $i, - $tokens[$i]['type'], - $tokens[$i]['content'], - $tokens[$i]['line'], - $end, - $tokens[$end]['type'] - ); - } - } - - $this->assertSame([], $errors); - - }//end testEndIsNeverLessThanCurrentToken() - - - /** - * Test a simple assignment. - * - * @return void - */ - public function testSimpleAssignment() - { - $start = $this->getTargetToken('/* testSimpleAssignment */', T_VARIABLE); - $found = self::$phpcsFile->findEndOfStatement($start); - - $this->assertSame(($start + 5), $found); - - }//end testSimpleAssignment() - - - /** - * Test a direct call to a control structure. - * - * @return void - */ - public function testControlStructure() - { - $start = $this->getTargetToken('/* testControlStructure */', T_WHILE); - $found = self::$phpcsFile->findEndOfStatement($start); - - $this->assertSame(($start + 6), $found); - - }//end testControlStructure() - - - /** - * Test the assignment of a closure. - * - * @return void - */ - public function testClosureAssignment() - { - $start = $this->getTargetToken('/* testClosureAssignment */', T_VARIABLE, '$a'); - $found = self::$phpcsFile->findEndOfStatement($start); - - $this->assertSame(($start + 13), $found); - - }//end testClosureAssignment() - - - /** - * Test using a heredoc in a function argument. - * - * @return void - */ - public function testHeredocFunctionArg() - { - // Find the end of the function. - $start = $this->getTargetToken('/* testHeredocFunctionArg */', T_STRING, 'myFunction'); - $found = self::$phpcsFile->findEndOfStatement($start); - - $this->assertSame(($start + 10), $found); - - // Find the end of the heredoc. - $start += 2; - $found = self::$phpcsFile->findEndOfStatement($start); - - $this->assertSame(($start + 4), $found); - - // Find the end of the last arg. - $start = ($found + 2); - $found = self::$phpcsFile->findEndOfStatement($start); - - $this->assertSame($start, $found); - - }//end testHeredocFunctionArg() - - - /** - * Test parts of a switch statement. - * - * @return void - */ - public function testSwitch() - { - // Find the end of the switch. - $start = $this->getTargetToken('/* testSwitch */', T_SWITCH); - $found = self::$phpcsFile->findEndOfStatement($start); - - $this->assertSame(($start + 28), $found); - - // Find the end of the case. - $start += 9; - $found = self::$phpcsFile->findEndOfStatement($start); - - $this->assertSame(($start + 8), $found); - - // Find the end of default case. - $start += 11; - $found = self::$phpcsFile->findEndOfStatement($start); - - $this->assertSame(($start + 6), $found); - - }//end testSwitch() - - - /** - * Test statements that are array values. - * - * @return void - */ - public function testStatementAsArrayValue() - { - // Test short array syntax. - $start = $this->getTargetToken('/* testStatementAsArrayValue */', T_NEW); - $found = self::$phpcsFile->findEndOfStatement($start); - - $this->assertSame(($start + 2), $found); - - // Test long array syntax. - $start += 12; - $found = self::$phpcsFile->findEndOfStatement($start); - - $this->assertSame(($start + 2), $found); - - // Test same statement outside of array. - $start += 10; - $found = self::$phpcsFile->findEndOfStatement($start); - - $this->assertSame(($start + 3), $found); - - }//end testStatementAsArrayValue() - - - /** - * Test a use group. - * - * @return void - */ - public function testUseGroup() - { - $start = $this->getTargetToken('/* testUseGroup */', T_USE); - $found = self::$phpcsFile->findEndOfStatement($start); - - $this->assertSame(($start + 23), $found); - - }//end testUseGroup() - - - /** - * Test arrow function as array value. - * - * @return void - */ - public function testArrowFunctionArrayValue() - { - $start = $this->getTargetToken('/* testArrowFunctionArrayValue */', T_FN); - $found = self::$phpcsFile->findEndOfStatement($start); - - $this->assertSame(($start + 9), $found); - - }//end testArrowFunctionArrayValue() - - - /** - * Test static arrow function. - * - * @return void - */ - public function testStaticArrowFunction() - { - $static = $this->getTargetToken('/* testStaticArrowFunction */', T_STATIC); - $fn = $this->getTargetToken('/* testStaticArrowFunction */', T_FN); - - $endOfStatementStatic = self::$phpcsFile->findEndOfStatement($static); - $endOfStatementFn = self::$phpcsFile->findEndOfStatement($fn); - - $this->assertSame($endOfStatementFn, $endOfStatementStatic); - - }//end testStaticArrowFunction() - - - /** - * Test arrow function with return value. - * - * @return void - */ - public function testArrowFunctionReturnValue() - { - $start = $this->getTargetToken('/* testArrowFunctionReturnValue */', T_FN); - $found = self::$phpcsFile->findEndOfStatement($start); - - $this->assertSame(($start + 18), $found); - - }//end testArrowFunctionReturnValue() - - - /** - * Test arrow function used as a function argument. - * - * @return void - */ - public function testArrowFunctionAsArgument() - { - $start = $this->getTargetToken('/* testArrowFunctionAsArgument */', T_FN); - $found = self::$phpcsFile->findEndOfStatement($start); - - $this->assertSame(($start + 8), $found); - - }//end testArrowFunctionAsArgument() - - - /** - * Test arrow function with arrays used as a function argument. - * - * @return void - */ - public function testArrowFunctionWithArrayAsArgument() - { - $start = $this->getTargetToken('/* testArrowFunctionWithArrayAsArgument */', T_FN); - $found = self::$phpcsFile->findEndOfStatement($start); - - $this->assertSame(($start + 17), $found); - - }//end testArrowFunctionWithArrayAsArgument() - - - /** - * Test simple match expression case. - * - * @return void - */ - public function testMatchCase() - { - $start = $this->getTargetToken('/* testMatchCase */', T_LNUMBER); - $found = self::$phpcsFile->findEndOfStatement($start); - - $this->assertSame(($start + 5), $found); - - $start = $this->getTargetToken('/* testMatchCase */', T_CONSTANT_ENCAPSED_STRING); - $found = self::$phpcsFile->findEndOfStatement($start); - - $this->assertSame(($start + 1), $found); - - }//end testMatchCase() - - - /** - * Test simple match expression default case. - * - * @return void - */ - public function testMatchDefault() - { - $start = $this->getTargetToken('/* testMatchDefault */', T_MATCH_DEFAULT); - $found = self::$phpcsFile->findEndOfStatement($start); - - $this->assertSame(($start + 4), $found); - - $start = $this->getTargetToken('/* testMatchDefault */', T_CONSTANT_ENCAPSED_STRING); - $found = self::$phpcsFile->findEndOfStatement($start); - - $this->assertSame($start, $found); - - }//end testMatchDefault() - - - /** - * Test multiple comma-separated match expression case values. - * - * @return void - */ - public function testMatchMultipleCase() - { - $start = $this->getTargetToken('/* testMatchMultipleCase */', T_LNUMBER); - $found = self::$phpcsFile->findEndOfStatement($start); - $this->assertSame(($start + 13), $found); - - $start += 6; - $found = self::$phpcsFile->findEndOfStatement($start); - $this->assertSame(($start + 7), $found); - - }//end testMatchMultipleCase() - - - /** - * Test match expression default case with trailing comma. - * - * @return void - */ - public function testMatchDefaultComma() - { - $start = $this->getTargetToken('/* testMatchDefaultComma */', T_MATCH_DEFAULT); - $found = self::$phpcsFile->findEndOfStatement($start); - - $this->assertSame(($start + 5), $found); - - }//end testMatchDefaultComma() - - - /** - * Test match expression with function call. - * - * @return void - */ - public function testMatchFunctionCall() - { - $start = $this->getTargetToken('/* testMatchFunctionCall */', T_STRING); - $found = self::$phpcsFile->findEndOfStatement($start); - - $this->assertSame(($start + 12), $found); - - $start += 8; - $found = self::$phpcsFile->findEndOfStatement($start); - - $this->assertSame(($start + 1), $found); - - }//end testMatchFunctionCall() - - - /** - * Test match expression with function call in the arm. - * - * @return void - */ - public function testMatchFunctionCallArm() - { - // Check the first case. - $start = $this->getTargetToken('/* testMatchFunctionCallArm */', T_STRING); - $found = self::$phpcsFile->findEndOfStatement($start); - - $this->assertSame(($start + 21), $found); - - // Check the second case. - $start += 24; - $found = self::$phpcsFile->findEndOfStatement($start); - - $this->assertSame(($start + 21), $found); - - }//end testMatchFunctionCallArm() - - - /** - * Test match expression with closure. - * - * @return void - */ - public function testMatchClosure() - { - $start = $this->getTargetToken('/* testMatchClosure */', T_LNUMBER); - $found = self::$phpcsFile->findEndOfStatement($start); - - $this->assertSame(($start + 14), $found); - - $start += 17; - $found = self::$phpcsFile->findEndOfStatement($start); - - $this->assertSame(($start + 14), $found); - - }//end testMatchClosure() - - - /** - * Test match expression with array declaration. - * - * @return void - */ - public function testMatchArray() - { - $start = $this->getTargetToken('/* testMatchArray */', T_LNUMBER); - $found = self::$phpcsFile->findEndOfStatement($start); - - $this->assertSame(($start + 11), $found); - - $start += 14; - $found = self::$phpcsFile->findEndOfStatement($start); - - $this->assertSame(($start + 22), $found); - - }//end testMatchArray() - - - /** - * Test nested match expressions. - * - * @return void - */ - public function testNestedMatch() - { - $start = $this->getTargetToken('/* testNestedMatch */', T_LNUMBER); - $found = self::$phpcsFile->findEndOfStatement($start); - - $this->assertSame(($start + 30), $found); - - $start += 21; - $found = self::$phpcsFile->findEndOfStatement($start); - - $this->assertSame(($start + 5), $found); - - }//end testNestedMatch() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/FindExtendedClassNameTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/FindExtendedClassNameTest.inc deleted file mode 100644 index 218ebc7..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/FindExtendedClassNameTest.inc +++ /dev/null @@ -1,58 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Files\File; - -use PHP_CodeSniffer\Tests\Core\AbstractMethodUnitTest; - -/** - * Tests for the \PHP_CodeSniffer\Files\File::findExtendedClassName method. - * - * @covers \PHP_CodeSniffer\Files\File::findExtendedClassName - */ -final class FindExtendedClassNameTest extends AbstractMethodUnitTest -{ - - - /** - * Test getting a `false` result when a non-existent token is passed. - * - * @return void - */ - public function testNonExistentToken() - { - $result = self::$phpcsFile->findExtendedClassName(100000); - $this->assertFalse($result); - - }//end testNonExistentToken() - - - /** - * Test getting a `false` result when a token other than one of the supported tokens is passed. - * - * @return void - */ - public function testNotAClass() - { - $token = $this->getTargetToken('/* testNotAClass */', [T_FUNCTION]); - $result = self::$phpcsFile->findExtendedClassName($token); - $this->assertFalse($result); - - }//end testNotAClass() - - - /** - * Test retrieving the name of the class being extended by another class - * (or interface). - * - * @param string $identifier Comment which precedes the test case. - * @param string|false $expected Expected function output. - * - * @dataProvider dataExtendedClass - * - * @return void - */ - public function testFindExtendedClassName($identifier, $expected) - { - $OOToken = $this->getTargetToken($identifier, [T_CLASS, T_ANON_CLASS, T_INTERFACE]); - $result = self::$phpcsFile->findExtendedClassName($OOToken); - $this->assertSame($expected, $result); - - }//end testFindExtendedClassName() - - - /** - * Data provider for the FindExtendedClassName test. - * - * @see testFindExtendedClassName() - * - * @return array> - */ - public static function dataExtendedClass() - { - return [ - 'class does not extend' => [ - 'identifier' => '/* testNonExtendedClass */', - 'expected' => false, - ], - 'class extends unqualified class' => [ - 'identifier' => '/* testExtendsUnqualifiedClass */', - 'expected' => 'testFECNClass', - ], - 'class extends fully qualified class' => [ - 'identifier' => '/* testExtendsFullyQualifiedClass */', - 'expected' => '\PHP_CodeSniffer\Tests\Core\File\testFECNClass', - ], - 'class extends partially qualified class' => [ - 'identifier' => '/* testExtendsPartiallyQualifiedClass */', - 'expected' => 'Core\File\RelativeClass', - ], - 'interface does not extend' => [ - 'identifier' => '/* testNonExtendedInterface */', - 'expected' => false, - ], - 'interface extends unqualified interface' => [ - 'identifier' => '/* testInterfaceExtendsUnqualifiedInterface */', - 'expected' => 'testFECNInterface', - ], - 'interface extends fully qualified interface' => [ - 'identifier' => '/* testInterfaceExtendsFullyQualifiedInterface */', - 'expected' => '\PHP_CodeSniffer\Tests\Core\File\testFECNInterface', - ], - 'anon class extends unqualified class' => [ - 'identifier' => '/* testExtendedAnonClass */', - 'expected' => 'testFECNExtendedAnonClass', - ], - 'class does not extend but contains anon class which extends' => [ - 'identifier' => '/* testNestedExtendedClass */', - 'expected' => false, - ], - 'anon class extends, nested in non-extended class' => [ - 'identifier' => '/* testNestedExtendedAnonClass */', - 'expected' => 'testFECNAnonClass', - ], - 'class extends and implements' => [ - 'identifier' => '/* testClassThatExtendsAndImplements */', - 'expected' => 'testFECNClass', - ], - 'class implements and extends' => [ - 'identifier' => '/* testClassThatImplementsAndExtends */', - 'expected' => 'testFECNClass', - ], - 'interface extends multiple interfaces (not supported)' => [ - 'identifier' => '/* testInterfaceMultiExtends */', - 'expected' => '\Package\FooInterface', - ], - 'readonly anon class extends fully qualified class' => [ - 'identifier' => '/* testExtendedReadonlyAnonClass */', - 'expected' => '\Fully\Qualified\MyClass', - ], - 'anon class with attribute extends partially qualified class' => [ - 'identifier' => '/* testExtendedAnonClassWithAttributes */', - 'expected' => 'Partially\Qualified\MyClass', - ], - 'parse error - extends keyword, but no class name' => [ - 'identifier' => '/* testMissingExtendsName */', - 'expected' => false, - ], - 'parse error - live coding - no curly braces' => [ - 'identifier' => '/* testParseError */', - 'expected' => false, - ], - ]; - - }//end dataExtendedClass() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/FindImplementedInterfaceNamesTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/FindImplementedInterfaceNamesTest.inc deleted file mode 100644 index 3246efa..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/FindImplementedInterfaceNamesTest.inc +++ /dev/null @@ -1,47 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Files\File; - -use PHP_CodeSniffer\Tests\Core\AbstractMethodUnitTest; - -/** - * Tests for the \PHP_CodeSniffer\Files\File::findImplementedInterfaceNames method. - * - * @covers \PHP_CodeSniffer\Files\File::findImplementedInterfaceNames - */ -final class FindImplementedInterfaceNamesTest extends AbstractMethodUnitTest -{ - - - /** - * Test getting a `false` result when a non-existent token is passed. - * - * @return void - */ - public function testNonExistentToken() - { - $result = self::$phpcsFile->findImplementedInterfaceNames(100000); - $this->assertFalse($result); - - }//end testNonExistentToken() - - - /** - * Test getting a `false` result when a token other than one of the supported tokens is passed. - * - * @return void - */ - public function testNotAClass() - { - $token = $this->getTargetToken('/* testNotAClass */', [T_FUNCTION]); - $result = self::$phpcsFile->findImplementedInterfaceNames($token); - $this->assertFalse($result); - - }//end testNotAClass() - - - /** - * Test retrieving the name(s) of the interfaces being implemented by a class. - * - * @param string $identifier Comment which precedes the test case. - * @param array|false $expected Expected function output. - * - * @dataProvider dataImplementedInterface - * - * @return void - */ - public function testFindImplementedInterfaceNames($identifier, $expected) - { - $OOToken = $this->getTargetToken($identifier, [T_CLASS, T_ANON_CLASS, T_INTERFACE, T_ENUM]); - $result = self::$phpcsFile->findImplementedInterfaceNames($OOToken); - $this->assertSame($expected, $result); - - }//end testFindImplementedInterfaceNames() - - - /** - * Data provider for the FindImplementedInterfaceNames test. - * - * @see testFindImplementedInterfaceNames() - * - * @return array|false>> - */ - public static function dataImplementedInterface() - { - return [ - 'interface declaration, no implements' => [ - 'identifier' => '/* testPlainInterface */', - 'expected' => false, - ], - 'class does not implement' => [ - 'identifier' => '/* testNonImplementedClass */', - 'expected' => false, - ], - 'class implements single interface, unqualified' => [ - 'identifier' => '/* testClassImplementsSingle */', - 'expected' => [ - 'testFIINInterface', - ], - ], - 'class implements multiple interfaces' => [ - 'identifier' => '/* testClassImplementsMultiple */', - 'expected' => [ - 'testFIINInterface', - 'testFIINInterface2', - ], - ], - 'class implements single interface, fully qualified' => [ - 'identifier' => '/* testImplementsFullyQualified */', - 'expected' => [ - '\PHP_CodeSniffer\Tests\Core\File\testFIINInterface', - ], - ], - 'class implements single interface, partially qualified' => [ - 'identifier' => '/* testImplementsPartiallyQualified */', - 'expected' => [ - 'Core\File\RelativeInterface', - ], - ], - 'class extends and implements' => [ - 'identifier' => '/* testClassThatExtendsAndImplements */', - 'expected' => [ - 'InterfaceA', - '\NameSpaced\Cat\InterfaceB', - ], - ], - 'class implements and extends' => [ - 'identifier' => '/* testClassThatImplementsAndExtends */', - 'expected' => [ - '\InterfaceA', - 'InterfaceB', - ], - ], - 'enum does not implement' => [ - 'identifier' => '/* testBackedEnumWithoutImplements */', - 'expected' => false, - ], - 'enum implements single interface, unqualified' => [ - 'identifier' => '/* testEnumImplementsSingle */', - 'expected' => [ - 'Colorful', - ], - ], - 'enum implements multiple interfaces, unqualified + fully qualified' => [ - 'identifier' => '/* testBackedEnumImplementsMulti */', - 'expected' => [ - 'Colorful', - '\Deck', - ], - ], - 'anon class implements single interface, unqualified' => [ - 'identifier' => '/* testAnonClassImplementsSingle */', - 'expected' => [ - 'testFIINInterface', - ], - ], - 'parse error - implements keyword, but no interface name' => [ - 'identifier' => '/* testMissingImplementsName */', - 'expected' => false, - ], - 'parse error - live coding - no curly braces' => [ - 'identifier' => '/* testParseError */', - 'expected' => false, - ], - ]; - - }//end dataImplementedInterface() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/FindStartOfStatementTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/FindStartOfStatementTest.inc deleted file mode 100644 index 681289e..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/FindStartOfStatementTest.inc +++ /dev/null @@ -1,212 +0,0 @@ - $foo + $bar, 'b' => true]; - -/* testUseGroup */ -use Vendor\Package\{ClassA as A, ClassB, ClassC as C}; - -$a = [ - /* testArrowFunctionArrayValue */ - 'a' => fn() => 1, - 'b' => fn() => 1, -]; - -/* testStaticArrowFunction */ -static fn ($a) => $a; - -/* testArrowFunctionReturnValue */ -fn(): array => [a($a, $b)]; - -/* testArrowFunctionAsArgument */ -$foo = foo( - fn() => bar() -); - -/* testArrowFunctionWithArrayAsArgument */ -$foo = foo( - fn() => [$row[0], $row[3]] -); - -$match = match ($a) { - /* testMatchCase */ - 1 => 'foo', - /* testMatchDefault */ - default => 'bar' -}; - -$match = match ($a) { - /* testMatchMultipleCase */ - 1, 2, => $a * $b, - /* testMatchDefaultComma */ - default, => 'something' -}; - -match ($pressedKey) { - /* testMatchFunctionCall */ - Key::RETURN_ => save($value, $user) -}; - -$result = match (true) { - /* testMatchFunctionCallArm */ - str_contains($text, 'Welcome') || str_contains($text, 'Hello') => 'en', - str_contains($text, 'Bienvenue') || str_contains($text, 'Bonjour') => 'fr', - default => 'pl' -}; - -/* testMatchClosure */ -$result = match ($key) { - 1 => function($a, $b) {}, - 2 => function($b, $c) {}, -}; - -/* testMatchArray */ -$result = match ($key) { - 1 => [1,2,3], - 2 => [1 => one($a, $b), 2 => two($b, $c)], - 3 => [], -}; - -/* testNestedMatch */ -$result = match ($key) { - 1 => match ($key) { - 1 => 'one', - 2 => 'two', - }, - 2 => match ($key) { - 1 => 'two', - 2 => 'one', - }, -}; - -return 0; - -/* testOpenTag */ -?> -

    Test

    -', foo(), ''; - -/* testOpenTagWithEcho */ -?> -

    Test

    -', foo(), ''; - -$value = [ - /* testPrecededByArrowFunctionInArray - Expected */ - Url::make('View Song', fn($song) => $song->url()) - /* testPrecededByArrowFunctionInArray */ - ->onlyOnDetail(), - - new Panel('Information', [ - Text::make('Title') - ]), -]; - -switch ($foo) { - /* testCaseStatement */ - case 1: - /* testInsideCaseStatement */ - $var = doSomething(); - /* testInsideCaseBreakStatement */ - break 1; - - case 2: - /* testInsideCaseContinueStatement */ - continue 1; - - case 3: - /* testInsideCaseReturnStatement */ - return false; - - case 4: - /* testInsideCaseExitStatement */ - exit(1); - - case 5: - /* testInsideCaseThrowStatement */ - throw new Exception(); - - case 6: - $var = doSomething(); - /* testInsideCaseGotoStatement */ - goto myLabel; - - case 7: - /* testInsideCaseFullyQualifiedDieStatement */ - \die(1); - - /* testDefaultStatement */ - default: - /* testInsideDefaultContinueStatement */ - continue $var; -} - -myLabel: -do_something(); - -match ($var) { - true => - /* test437ClosureDeclaration */ - function ($var) { - /* test437EchoNestedWithinClosureWithinMatch */ - echo $var, 'text', PHP_EOL; - }, - default => false -}; - -match ($var) { - /* test437NestedLongArrayWithinMatch */ - 'a' => array( 1, 2.5, $var), - /* test437NestedFunctionCallWithinMatch */ - 'b' => functionCall( 11, $var, 50.50), - /* test437NestedArrowFunctionWithinMatch */ - 'c' => fn($p1, /* test437FnSecondParamWithinMatch */ $p2) => $p1 + $p2, - default => false -}; - -callMe($paramA, match ($var) { - /* test437NestedLongArrayWithinNestedMatch */ - 'a' => array( 1, 2.5, $var), - /* test437NestedFunctionCallWithinNestedMatch */ - 'b' => functionCall( 11, $var, 50.50), - /* test437NestedArrowFunctionWithinNestedMatch */ - 'c' => fn($p1, /* test437FnSecondParamWithinNestedMatch */ $p2) => $p1 + $p2, - default => false -}); - -match ($var) { - /* test437NestedShortArrayWithinMatch */ - 'a' => [ 1, 2.5, $var], - default => false -}; diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/FindStartOfStatementTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/FindStartOfStatementTest.php deleted file mode 100644 index f4d0caf..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/FindStartOfStatementTest.php +++ /dev/null @@ -1,989 +0,0 @@ - - * @author Juliette Reinders Folmer - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @copyright 2019 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Files\File; - -use PHP_CodeSniffer\Tests\Core\AbstractMethodUnitTest; -use PHP_CodeSniffer\Util\Tokens; - -/** - * Tests for the \PHP_CodeSniffer\Files\File::findStartOfStatement method. - * - * @covers \PHP_CodeSniffer\Files\File::findStartOfStatement - */ -final class FindStartOfStatementTest extends AbstractMethodUnitTest -{ - - - /** - * Test that start of statement is NEVER beyond the "current" token. - * - * @return void - */ - public function testStartIsNeverMoreThanCurrentToken() - { - $tokens = self::$phpcsFile->getTokens(); - $errors = []; - - for ($i = 0; $i < self::$phpcsFile->numTokens; $i++) { - if (isset(Tokens::$emptyTokens[$tokens[$i]['code']]) === true) { - continue; - } - - $start = self::$phpcsFile->findStartOfStatement($i); - - // Collect all the errors. - if ($start > $i) { - $errors[] = sprintf( - 'Start of statement for token %1$d (%2$s: %3$s) on line %4$d is %5$d (%6$s), which is more than %1$d', - $i, - $tokens[$i]['type'], - $tokens[$i]['content'], - $tokens[$i]['line'], - $start, - $tokens[$start]['type'] - ); - } - } - - $this->assertSame([], $errors); - - }//end testStartIsNeverMoreThanCurrentToken() - - - /** - * Test a simple assignment. - * - * @return void - */ - public function testSimpleAssignment() - { - $start = $this->getTargetToken('/* testSimpleAssignment */', T_SEMICOLON); - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame(($start - 5), $found); - - }//end testSimpleAssignment() - - - /** - * Test a function call. - * - * @return void - */ - public function testFunctionCall() - { - $start = $this->getTargetToken('/* testFunctionCall */', T_CLOSE_PARENTHESIS); - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame(($start - 6), $found); - - }//end testFunctionCall() - - - /** - * Test a function call. - * - * @return void - */ - public function testFunctionCallArgument() - { - $start = $this->getTargetToken('/* testFunctionCallArgument */', T_VARIABLE, '$b'); - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame($start, $found); - - }//end testFunctionCallArgument() - - - /** - * Test a direct call to a control structure. - * - * @return void - */ - public function testControlStructure() - { - $start = $this->getTargetToken('/* testControlStructure */', T_CLOSE_CURLY_BRACKET); - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame(($start - 6), $found); - - }//end testControlStructure() - - - /** - * Test the assignment of a closure. - * - * @return void - */ - public function testClosureAssignment() - { - $start = $this->getTargetToken('/* testClosureAssignment */', T_CLOSE_CURLY_BRACKET); - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame(($start - 11), $found); - - }//end testClosureAssignment() - - - /** - * Test using a heredoc in a function argument. - * - * @return void - */ - public function testHeredocFunctionArg() - { - // Find the start of the function. - $start = $this->getTargetToken('/* testHeredocFunctionArg */', T_SEMICOLON); - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame(($start - 10), $found); - - // Find the start of the heredoc. - $start -= 4; - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame(($start - 4), $found); - - // Find the start of the last arg. - $start += 2; - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame($start, $found); - - }//end testHeredocFunctionArg() - - - /** - * Test parts of a switch statement. - * - * @return void - */ - public function testSwitch() - { - // Find the start of the switch. - $start = $this->getTargetToken('/* testSwitch */', T_CLOSE_CURLY_BRACKET); - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame(($start - 47), $found); - - // Find the start of default case. - $start -= 5; - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame(($start - 6), $found); - - // Find the start of the second case. - $start -= 12; - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame(($start - 5), $found); - - // Find the start of the first case. - $start -= 13; - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame(($start - 8), $found); - - // Test inside the first case. - $start--; - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame(($start - 1), $found); - - }//end testSwitch() - - - /** - * Test statements that are array values. - * - * @return void - */ - public function testStatementAsArrayValue() - { - // Test short array syntax. - $start = $this->getTargetToken('/* testStatementAsArrayValue */', T_STRING, 'Datetime'); - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame(($start - 2), $found); - - // Test long array syntax. - $start += 12; - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame(($start - 2), $found); - - // Test same statement outside of array. - $start++; - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame(($start - 9), $found); - - // Test with an array index. - $start += 17; - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame(($start - 5), $found); - - }//end testStatementAsArrayValue() - - - /** - * Test a use group. - * - * @return void - */ - public function testUseGroup() - { - $start = $this->getTargetToken('/* testUseGroup */', T_SEMICOLON); - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame(($start - 23), $found); - - }//end testUseGroup() - - - /** - * Test arrow function as array value. - * - * @return void - */ - public function testArrowFunctionArrayValue() - { - $start = $this->getTargetToken('/* testArrowFunctionArrayValue */', T_COMMA); - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame(($start - 7), $found); - - }//end testArrowFunctionArrayValue() - - - /** - * Test static arrow function. - * - * @return void - */ - public function testStaticArrowFunction() - { - $start = $this->getTargetToken('/* testStaticArrowFunction */', T_SEMICOLON); - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame(($start - 11), $found); - - }//end testStaticArrowFunction() - - - /** - * Test arrow function with return value. - * - * @return void - */ - public function testArrowFunctionReturnValue() - { - $start = $this->getTargetToken('/* testArrowFunctionReturnValue */', T_SEMICOLON); - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame(($start - 18), $found); - - }//end testArrowFunctionReturnValue() - - - /** - * Test arrow function used as a function argument. - * - * @return void - */ - public function testArrowFunctionAsArgument() - { - $start = $this->getTargetToken('/* testArrowFunctionAsArgument */', T_FN); - $start += 8; - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame(($start - 8), $found); - - }//end testArrowFunctionAsArgument() - - - /** - * Test arrow function with arrays used as a function argument. - * - * @return void - */ - public function testArrowFunctionWithArrayAsArgument() - { - $start = $this->getTargetToken('/* testArrowFunctionWithArrayAsArgument */', T_FN); - $start += 17; - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame(($start - 17), $found); - - }//end testArrowFunctionWithArrayAsArgument() - - - /** - * Test simple match expression case. - * - * @return void - */ - public function testMatchCase() - { - $start = $this->getTargetToken('/* testMatchCase */', T_COMMA); - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame(($start - 1), $found); - - }//end testMatchCase() - - - /** - * Test simple match expression default case. - * - * @return void - */ - public function testMatchDefault() - { - $start = $this->getTargetToken('/* testMatchDefault */', T_CONSTANT_ENCAPSED_STRING, "'bar'"); - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame($start, $found); - - }//end testMatchDefault() - - - /** - * Test multiple comma-separated match expression case values. - * - * @return void - */ - public function testMatchMultipleCase() - { - $start = $this->getTargetToken('/* testMatchMultipleCase */', T_MATCH_ARROW); - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame(($start - 6), $found); - - $start += 6; - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame(($start - 4), $found); - - }//end testMatchMultipleCase() - - - /** - * Test match expression default case with trailing comma. - * - * @return void - */ - public function testMatchDefaultComma() - { - $start = $this->getTargetToken('/* testMatchDefaultComma */', T_MATCH_ARROW); - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame(($start - 3), $found); - - $start += 2; - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame($start, $found); - - }//end testMatchDefaultComma() - - - /** - * Test match expression with function call. - * - * @return void - */ - public function testMatchFunctionCall() - { - $start = $this->getTargetToken('/* testMatchFunctionCall */', T_CLOSE_PARENTHESIS); - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame(($start - 6), $found); - - }//end testMatchFunctionCall() - - - /** - * Test match expression with function call in the arm. - * - * @return void - */ - public function testMatchFunctionCallArm() - { - // Check the first case. - $start = $this->getTargetToken('/* testMatchFunctionCallArm */', T_MATCH_ARROW); - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame(($start - 18), $found); - - // Check the second case. - $start += 24; - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame(($start - 18), $found); - - }//end testMatchFunctionCallArm() - - - /** - * Test match expression with closure. - * - * @return void - */ - public function testMatchClosure() - { - $start = $this->getTargetToken('/* testMatchClosure */', T_LNUMBER); - $start += 14; - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame(($start - 10), $found); - - $start += 17; - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame(($start - 10), $found); - - }//end testMatchClosure() - - - /** - * Test match expression with array declaration. - * - * @return void - */ - public function testMatchArray() - { - // Start of first case statement. - $start = $this->getTargetToken('/* testMatchArray */', T_LNUMBER); - $found = self::$phpcsFile->findStartOfStatement($start); - $this->assertSame($start, $found); - - // Comma after first statement. - $start += 11; - $found = self::$phpcsFile->findStartOfStatement($start); - $this->assertSame(($start - 7), $found); - - // Start of second case statement. - $start += 3; - $found = self::$phpcsFile->findStartOfStatement($start); - $this->assertSame($start, $found); - - // Comma after first statement. - $start += 30; - $found = self::$phpcsFile->findStartOfStatement($start); - $this->assertSame(($start - 26), $found); - - }//end testMatchArray() - - - /** - * Test nested match expressions. - * - * @return void - */ - public function testNestedMatch() - { - $start = $this->getTargetToken('/* testNestedMatch */', T_LNUMBER); - $start += 30; - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame(($start - 26), $found); - - $start -= 4; - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame(($start - 1), $found); - - $start -= 3; - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame(($start - 2), $found); - - }//end testNestedMatch() - - - /** - * Test PHP open tag. - * - * @return void - */ - public function testOpenTag() - { - $start = $this->getTargetToken('/* testOpenTag */', T_OPEN_TAG); - $start += 2; - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame(($start - 1), $found); - - }//end testOpenTag() - - - /** - * Test PHP short open echo tag. - * - * @return void - */ - public function testOpenTagWithEcho() - { - $start = $this->getTargetToken('/* testOpenTagWithEcho */', T_OPEN_TAG_WITH_ECHO); - $start += 3; - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame(($start - 1), $found); - - }//end testOpenTagWithEcho() - - - /** - * Test object call on result of static function call with arrow function as parameter and wrapped within an array. - * - * @link https://github.com/squizlabs/PHP_CodeSniffer/issues/2849 - * @link https://github.com/squizlabs/PHP_CodeSniffer/commit/fbf67efc3fc0c2a355f5585d49f4f6fe160ff2f9 - * - * @return void - */ - public function testObjectCallPrecededByArrowFunctionAsFunctionCallParameterInArray() - { - $expected = $this->getTargetToken('/* testPrecededByArrowFunctionInArray - Expected */', T_STRING, 'Url'); - - $start = $this->getTargetToken('/* testPrecededByArrowFunctionInArray */', T_STRING, 'onlyOnDetail'); - $found = self::$phpcsFile->findStartOfStatement($start); - - $this->assertSame($expected, $found); - - }//end testObjectCallPrecededByArrowFunctionAsFunctionCallParameterInArray() - - - /** - * Test finding the start of a statement inside a switch control structure case/default statement. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * @param int|string $targets The token to search for after the test marker. - * @param string|int $expectedTarget Token code of the expected start of statement stack pointer. - * - * @link https://github.com/squizlabs/php_codesniffer/issues/3192 - * @link https://github.com/squizlabs/PHP_CodeSniffer/pull/3186/commits/18a0e54735bb9b3850fec266e5f4c50dacf618ea - * - * @dataProvider dataFindStartInsideSwitchCaseDefaultStatements - * - * @return void - */ - public function testFindStartInsideSwitchCaseDefaultStatements($testMarker, $targets, $expectedTarget) - { - $testToken = $this->getTargetToken($testMarker, $targets); - $expected = $this->getTargetToken($testMarker, $expectedTarget); - - $found = self::$phpcsFile->findStartOfStatement($testToken); - - $this->assertSame($expected, $found); - - }//end testFindStartInsideSwitchCaseDefaultStatements() - - - /** - * Data provider. - * - * @return array> - */ - public static function dataFindStartInsideSwitchCaseDefaultStatements() - { - return [ - 'Case keyword should be start of case statement - case itself' => [ - 'testMarker' => '/* testCaseStatement */', - 'targets' => T_CASE, - 'expectedTarget' => T_CASE, - ], - 'Case keyword should be start of case statement - number (what\'s being compared)' => [ - 'testMarker' => '/* testCaseStatement */', - 'targets' => T_LNUMBER, - 'expectedTarget' => T_CASE, - ], - 'Variable should be start of arbitrary assignment statement - variable itself' => [ - 'testMarker' => '/* testInsideCaseStatement */', - 'targets' => T_VARIABLE, - 'expectedTarget' => T_VARIABLE, - ], - 'Variable should be start of arbitrary assignment statement - equal sign' => [ - 'testMarker' => '/* testInsideCaseStatement */', - 'targets' => T_EQUAL, - 'expectedTarget' => T_VARIABLE, - ], - 'Variable should be start of arbitrary assignment statement - function call' => [ - 'testMarker' => '/* testInsideCaseStatement */', - 'targets' => T_STRING, - 'expectedTarget' => T_VARIABLE, - ], - 'Break should be start for contents of the break statement - contents' => [ - 'testMarker' => '/* testInsideCaseBreakStatement */', - 'targets' => T_LNUMBER, - 'expectedTarget' => T_BREAK, - ], - 'Continue should be start for contents of the continue statement - contents' => [ - 'testMarker' => '/* testInsideCaseContinueStatement */', - 'targets' => T_LNUMBER, - 'expectedTarget' => T_CONTINUE, - ], - 'Return should be start for contents of the return statement - contents' => [ - 'testMarker' => '/* testInsideCaseReturnStatement */', - 'targets' => T_FALSE, - 'expectedTarget' => T_RETURN, - ], - 'Exit should be start for contents of the exit statement - close parenthesis' => [ - // Note: not sure if this is actually correct - should this be the open parenthesis ? - 'testMarker' => '/* testInsideCaseExitStatement */', - 'targets' => T_CLOSE_PARENTHESIS, - 'expectedTarget' => T_EXIT, - ], - 'Throw should be start for contents of the throw statement - new keyword' => [ - 'testMarker' => '/* testInsideCaseThrowStatement */', - 'targets' => T_NEW, - 'expectedTarget' => T_THROW, - ], - 'Throw should be start for contents of the throw statement - exception name' => [ - 'testMarker' => '/* testInsideCaseThrowStatement */', - 'targets' => T_STRING, - 'expectedTarget' => T_THROW, - ], - 'Throw should be start for contents of the throw statement - close parenthesis' => [ - 'testMarker' => '/* testInsideCaseThrowStatement */', - 'targets' => T_CLOSE_PARENTHESIS, - 'expectedTarget' => T_THROW, - ], - 'Goto should be start for contents of the goto statement - goto label' => [ - 'testMarker' => '/* testInsideCaseGotoStatement */', - 'targets' => T_STRING, - 'expectedTarget' => T_GOTO, - ], - 'Goto should be start for contents of the goto statement - semicolon' => [ - 'testMarker' => '/* testInsideCaseGotoStatement */', - 'targets' => T_SEMICOLON, - 'expectedTarget' => T_GOTO, - ], - 'Namespace separator for "die" should be start for contents - close parenthesis' => [ - // Note: not sure if this is actually correct - should this be the open parenthesis ? - 'testMarker' => '/* testInsideCaseFullyQualifiedDieStatement */', - 'targets' => T_CLOSE_PARENTHESIS, - 'expectedTarget' => T_NS_SEPARATOR, - ], - 'Default keyword should be start of default statement - default itself' => [ - 'testMarker' => '/* testDefaultStatement */', - 'targets' => T_DEFAULT, - 'expectedTarget' => T_DEFAULT, - ], - 'Return should be start for contents of the return statement (inside default) - variable' => [ - 'testMarker' => '/* testInsideDefaultContinueStatement */', - 'targets' => T_VARIABLE, - 'expectedTarget' => T_CONTINUE, - ], - ]; - - }//end dataFindStartInsideSwitchCaseDefaultStatements() - - - /** - * Test finding the start of a statement inside a closed scope nested within a match expressions. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * @param int|string $target The token to search for after the test marker. - * @param int|string $expectedTarget Token code of the expected start of statement stack pointer. - * - * @link https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/437 - * - * @dataProvider dataFindStartInsideClosedScopeNestedWithinMatch - * - * @return void - */ - public function testFindStartInsideClosedScopeNestedWithinMatch($testMarker, $target, $expectedTarget) - { - $testToken = $this->getTargetToken($testMarker, $target); - $expected = $this->getTargetToken($testMarker, $expectedTarget); - - $found = self::$phpcsFile->findStartOfStatement($testToken); - - $this->assertSame($expected, $found); - - }//end testFindStartInsideClosedScopeNestedWithinMatch() - - - /** - * Data provider. - * - * @return array> - */ - public static function dataFindStartInsideClosedScopeNestedWithinMatch() - { - return [ - // These were already working correctly. - 'Closure function keyword should be start of closure - closure keyword' => [ - 'testMarker' => '/* test437ClosureDeclaration */', - 'target' => T_CLOSURE, - 'expectedTarget' => T_CLOSURE, - ], - 'Open curly is a statement/expression opener - open curly' => [ - 'testMarker' => '/* test437ClosureDeclaration */', - 'target' => T_OPEN_CURLY_BRACKET, - 'expectedTarget' => T_OPEN_CURLY_BRACKET, - ], - - 'Echo should be start for expression - echo keyword' => [ - 'testMarker' => '/* test437EchoNestedWithinClosureWithinMatch */', - 'target' => T_ECHO, - 'expectedTarget' => T_ECHO, - ], - 'Echo should be start for expression - variable' => [ - 'testMarker' => '/* test437EchoNestedWithinClosureWithinMatch */', - 'target' => T_VARIABLE, - 'expectedTarget' => T_ECHO, - ], - 'Echo should be start for expression - comma' => [ - 'testMarker' => '/* test437EchoNestedWithinClosureWithinMatch */', - 'target' => T_COMMA, - 'expectedTarget' => T_ECHO, - ], - - // These were not working correctly and would previously return the close curly of the match expression. - 'First token after comma in echo expression should be start for expression - text string' => [ - 'testMarker' => '/* test437EchoNestedWithinClosureWithinMatch */', - 'target' => T_CONSTANT_ENCAPSED_STRING, - 'expectedTarget' => T_CONSTANT_ENCAPSED_STRING, - ], - 'First token after comma in echo expression - PHP_EOL constant' => [ - 'testMarker' => '/* test437EchoNestedWithinClosureWithinMatch */', - 'target' => T_STRING, - 'expectedTarget' => T_STRING, - ], - 'First token after comma in echo expression - semicolon' => [ - 'testMarker' => '/* test437EchoNestedWithinClosureWithinMatch */', - 'target' => T_SEMICOLON, - 'expectedTarget' => T_STRING, - ], - ]; - - }//end dataFindStartInsideClosedScopeNestedWithinMatch() - - - /** - * Test finding the start of a statement for a token within a set of parentheses within a match expressions. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * @param int|string $target The token to search for after the test marker. - * @param int|string $expectedTarget Token code of the expected start of statement stack pointer. - * - * @link https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/437 - * - * @dataProvider dataFindStartInsideParenthesesNestedWithinMatch - * - * @return void - */ - public function testFindStartInsideParenthesesNestedWithinMatch($testMarker, $target, $expectedTarget) - { - $testToken = $this->getTargetToken($testMarker, $target); - $expected = $this->getTargetToken($testMarker, $expectedTarget); - - $found = self::$phpcsFile->findStartOfStatement($testToken); - - $this->assertSame($expected, $found); - - }//end testFindStartInsideParenthesesNestedWithinMatch() - - - /** - * Data provider. - * - * @return array> - */ - public static function dataFindStartInsideParenthesesNestedWithinMatch() - { - return [ - 'Array item itself should be start for first array item' => [ - 'testMarker' => '/* test437NestedLongArrayWithinMatch */', - 'target' => T_LNUMBER, - 'expectedTarget' => T_LNUMBER, - ], - 'Array item itself should be start for second array item' => [ - 'testMarker' => '/* test437NestedLongArrayWithinMatch */', - 'target' => T_DNUMBER, - 'expectedTarget' => T_DNUMBER, - ], - 'Array item itself should be start for third array item' => [ - 'testMarker' => '/* test437NestedLongArrayWithinMatch */', - 'target' => T_VARIABLE, - 'expectedTarget' => T_VARIABLE, - ], - - 'Parameter itself should be start for first param passed to function call' => [ - 'testMarker' => '/* test437NestedFunctionCallWithinMatch */', - 'target' => T_LNUMBER, - 'expectedTarget' => T_LNUMBER, - ], - 'Parameter itself should be start for second param passed to function call' => [ - 'testMarker' => '/* test437NestedFunctionCallWithinMatch */', - 'target' => T_VARIABLE, - 'expectedTarget' => T_VARIABLE, - ], - 'Parameter itself should be start for third param passed to function call' => [ - 'testMarker' => '/* test437NestedFunctionCallWithinMatch */', - 'target' => T_DNUMBER, - 'expectedTarget' => T_DNUMBER, - ], - - 'Parameter itself should be start for first param declared in arrow function' => [ - 'testMarker' => '/* test437NestedArrowFunctionWithinMatch */', - 'target' => T_VARIABLE, - 'expectedTarget' => T_VARIABLE, - ], - 'Parameter itself should be start for second param declared in arrow function' => [ - 'testMarker' => '/* test437FnSecondParamWithinMatch */', - 'target' => T_VARIABLE, - 'expectedTarget' => T_VARIABLE, - ], - ]; - - }//end dataFindStartInsideParenthesesNestedWithinMatch() - - - /** - * Test finding the start of a statement for a token within a set of parentheses within a match expressions, - * which itself is nested within parentheses. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * @param int|string $target The token to search for after the test marker. - * @param int|string $expectedTarget Token code of the expected start of statement stack pointer. - * - * @link https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/437 - * - * @dataProvider dataFindStartInsideParenthesesNestedWithinNestedMatch - * - * @return void - */ - public function testFindStartInsideParenthesesNestedWithinNestedMatch($testMarker, $target, $expectedTarget) - { - $testToken = $this->getTargetToken($testMarker, $target); - $expected = $this->getTargetToken($testMarker, $expectedTarget); - - $found = self::$phpcsFile->findStartOfStatement($testToken); - - $this->assertSame($expected, $found); - - }//end testFindStartInsideParenthesesNestedWithinNestedMatch() - - - /** - * Data provider. - * - * @return array> - */ - public static function dataFindStartInsideParenthesesNestedWithinNestedMatch() - { - return [ - 'Array item itself should be start for first array item' => [ - 'testMarker' => '/* test437NestedLongArrayWithinNestedMatch */', - 'target' => T_LNUMBER, - 'expectedTarget' => T_LNUMBER, - ], - 'Array item itself should be start for second array item' => [ - 'testMarker' => '/* test437NestedLongArrayWithinNestedMatch */', - 'target' => T_DNUMBER, - 'expectedTarget' => T_DNUMBER, - ], - 'Array item itself should be start for third array item' => [ - 'testMarker' => '/* test437NestedLongArrayWithinNestedMatch */', - 'target' => T_VARIABLE, - 'expectedTarget' => T_VARIABLE, - ], - - 'Parameter itself should be start for first param passed to function call' => [ - 'testMarker' => '/* test437NestedFunctionCallWithinNestedMatch */', - 'target' => T_LNUMBER, - 'expectedTarget' => T_LNUMBER, - ], - 'Parameter itself should be start for second param passed to function call' => [ - 'testMarker' => '/* test437NestedFunctionCallWithinNestedMatch */', - 'target' => T_VARIABLE, - 'expectedTarget' => T_VARIABLE, - ], - 'Parameter itself should be start for third param passed to function call' => [ - 'testMarker' => '/* test437NestedFunctionCallWithinNestedMatch */', - 'target' => T_DNUMBER, - 'expectedTarget' => T_DNUMBER, - ], - - 'Parameter itself should be start for first param declared in arrow function' => [ - 'testMarker' => '/* test437NestedArrowFunctionWithinNestedMatch */', - 'target' => T_VARIABLE, - 'expectedTarget' => T_VARIABLE, - ], - 'Parameter itself should be start for second param declared in arrow function' => [ - 'testMarker' => '/* test437FnSecondParamWithinNestedMatch */', - 'target' => T_VARIABLE, - 'expectedTarget' => T_VARIABLE, - ], - ]; - - }//end dataFindStartInsideParenthesesNestedWithinNestedMatch() - - - /** - * Test finding the start of a statement for a token within a short array within a match expressions. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * @param int|string $target The token to search for after the test marker. - * @param int|string $expectedTarget Token code of the expected start of statement stack pointer. - * - * @link https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/437 - * - * @dataProvider dataFindStartInsideShortArrayNestedWithinMatch - * - * @return void - */ - public function testFindStartInsideShortArrayNestedWithinMatch($testMarker, $target, $expectedTarget) - { - $testToken = $this->getTargetToken($testMarker, $target); - $expected = $this->getTargetToken($testMarker, $expectedTarget); - - $found = self::$phpcsFile->findStartOfStatement($testToken); - - $this->assertSame($expected, $found); - - }//end testFindStartInsideShortArrayNestedWithinMatch() - - - /** - * Data provider. - * - * @return array> - */ - public static function dataFindStartInsideShortArrayNestedWithinMatch() - { - return [ - 'Array item itself should be start for first array item' => [ - 'testMarker' => '/* test437NestedShortArrayWithinMatch */', - 'target' => T_LNUMBER, - 'expectedTarget' => T_LNUMBER, - ], - 'Array item itself should be start for second array item' => [ - 'testMarker' => '/* test437NestedShortArrayWithinMatch */', - 'target' => T_DNUMBER, - 'expectedTarget' => T_DNUMBER, - ], - 'Array item itself should be start for third array item' => [ - 'testMarker' => '/* test437NestedShortArrayWithinMatch */', - 'target' => T_VARIABLE, - 'expectedTarget' => T_VARIABLE, - ], - ]; - - }//end dataFindStartInsideShortArrayNestedWithinMatch() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetClassPropertiesTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetClassPropertiesTest.inc deleted file mode 100644 index 2490a09..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetClassPropertiesTest.inc +++ /dev/null @@ -1,58 +0,0 @@ - - * @copyright 2022 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Files\File; - -use PHP_CodeSniffer\Tests\Core\AbstractMethodUnitTest; - -/** - * Tests for the \PHP_CodeSniffer\Files\File:getClassProperties method. - * - * @covers \PHP_CodeSniffer\Files\File::getClassProperties - */ -final class GetClassPropertiesTest extends AbstractMethodUnitTest -{ - - - /** - * Test receiving an expected exception when a non class token is passed. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * @param int|string $tokenType The type of token to look for after the marker. - * - * @dataProvider dataNotAClassException - * - * @return void - */ - public function testNotAClassException($testMarker, $tokenType) - { - $this->expectRunTimeException('$stackPtr must be of type T_CLASS'); - - $target = $this->getTargetToken($testMarker, $tokenType); - self::$phpcsFile->getClassProperties($target); - - }//end testNotAClassException() - - - /** - * Data provider. - * - * @see testNotAClassException() For the array format. - * - * @return array> - */ - public static function dataNotAClassException() - { - return [ - 'interface' => [ - 'testMarker' => '/* testNotAClass */', - 'tokenType' => T_INTERFACE, - ], - 'anon-class' => [ - 'testMarker' => '/* testAnonClass */', - 'tokenType' => T_ANON_CLASS, - ], - 'enum' => [ - 'testMarker' => '/* testEnum */', - 'tokenType' => T_ENUM, - ], - ]; - - }//end dataNotAClassException() - - - /** - * Test retrieving the properties for a class declaration. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * @param array $expected Expected function output. - * - * @dataProvider dataGetClassProperties - * - * @return void - */ - public function testGetClassProperties($testMarker, $expected) - { - $class = $this->getTargetToken($testMarker, T_CLASS); - $result = self::$phpcsFile->getClassProperties($class); - $this->assertSame($expected, $result); - - }//end testGetClassProperties() - - - /** - * Data provider. - * - * @see testGetClassProperties() For the array format. - * - * @return array>> - */ - public static function dataGetClassProperties() - { - return [ - 'no-properties' => [ - 'testMarker' => '/* testClassWithoutProperties */', - 'expected' => [ - 'is_abstract' => false, - 'is_final' => false, - 'is_readonly' => false, - ], - ], - 'abstract' => [ - 'testMarker' => '/* testAbstractClass */', - 'expected' => [ - 'is_abstract' => true, - 'is_final' => false, - 'is_readonly' => false, - ], - ], - 'final' => [ - 'testMarker' => '/* testFinalClass */', - 'expected' => [ - 'is_abstract' => false, - 'is_final' => true, - 'is_readonly' => false, - ], - ], - 'readonly' => [ - 'testMarker' => '/* testReadonlyClass */', - 'expected' => [ - 'is_abstract' => false, - 'is_final' => false, - 'is_readonly' => true, - ], - ], - 'final-readonly' => [ - 'testMarker' => '/* testFinalReadonlyClass */', - 'expected' => [ - 'is_abstract' => false, - 'is_final' => true, - 'is_readonly' => true, - ], - ], - 'readonly-final' => [ - 'testMarker' => '/* testReadonlyFinalClass */', - 'expected' => [ - 'is_abstract' => false, - 'is_final' => true, - 'is_readonly' => true, - ], - ], - 'abstract-readonly' => [ - 'testMarker' => '/* testAbstractReadonlyClass */', - 'expected' => [ - 'is_abstract' => true, - 'is_final' => false, - 'is_readonly' => true, - ], - ], - 'readonly-abstract' => [ - 'testMarker' => '/* testReadonlyAbstractClass */', - 'expected' => [ - 'is_abstract' => true, - 'is_final' => false, - 'is_readonly' => true, - ], - ], - 'comments-and-new-lines' => [ - 'testMarker' => '/* testWithCommentsAndNewLines */', - 'expected' => [ - 'is_abstract' => true, - 'is_final' => false, - 'is_readonly' => false, - ], - ], - 'no-properties-with-docblock' => [ - 'testMarker' => '/* testWithDocblockWithoutProperties */', - 'expected' => [ - 'is_abstract' => false, - 'is_final' => false, - 'is_readonly' => false, - ], - ], - 'abstract-final-parse-error' => [ - 'testMarker' => '/* testParseErrorAbstractFinal */', - 'expected' => [ - 'is_abstract' => true, - 'is_final' => true, - 'is_readonly' => false, - ], - ], - ]; - - }//end dataGetClassProperties() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetConditionTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetConditionTest.inc deleted file mode 100644 index e7684da..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetConditionTest.inc +++ /dev/null @@ -1,91 +0,0 @@ - $v) { - - /* condition 11-2: try */ - try { - --$k; - - /* condition 11-3: catch */ - } catch (Exception $e) { - /* testInException */ - echo 'oh darn'; - /* condition 11-4: finally */ - } finally { - return true; - } - } - - $a++; - } - break; - - /* condition 8b: default */ - default: - /* testInDefault */ - $return = 'nada'; - return $return; - } - } - } - } - } - } - } -} diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetConditionTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetConditionTest.php deleted file mode 100644 index d63b413..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetConditionTest.php +++ /dev/null @@ -1,494 +0,0 @@ - - * @copyright 2022 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Files\File; - -use PHP_CodeSniffer\Tests\Core\AbstractMethodUnitTest; -use PHP_CodeSniffer\Util\Tokens; - -/** - * Tests for the \PHP_CodeSniffer\Files\File:getCondition and \PHP_CodeSniffer\Files\File:hasCondition methods. - * - * @covers \PHP_CodeSniffer\Files\File::getCondition - * @covers \PHP_CodeSniffer\Files\File::hasCondition - */ -final class GetConditionTest extends AbstractMethodUnitTest -{ - - /** - * List of all the test markers with their target token in the test case file. - * - * - The startPoint token is left out as it is tested separately. - * - The key is the type of token to look for after the test marker. - * - * @var array - */ - protected static $testTargets = [ - T_VARIABLE => '/* testSeriouslyNestedMethod */', - T_RETURN => '/* testDeepestNested */', - T_ECHO => '/* testInException */', - T_CONSTANT_ENCAPSED_STRING => '/* testInDefault */', - ]; - - /** - * List of all the condition markers in the test case file. - * - * @var array - */ - protected $conditionMarkers = [ - '/* condition 0: namespace */', - '/* condition 1: if */', - '/* condition 2: function */', - '/* condition 3-1: if */', - '/* condition 3-2: else */', - '/* condition 4: if */', - '/* condition 5: nested class */', - '/* condition 6: class method */', - '/* condition 7: switch */', - '/* condition 8a: case */', - '/* condition 9: while */', - '/* condition 10-1: if */', - '/* condition 11-1: nested anonymous class */', - '/* condition 12: nested anonymous class method */', - '/* condition 13: closure */', - '/* condition 10-2: elseif */', - '/* condition 10-3: foreach */', - '/* condition 11-2: try */', - '/* condition 11-3: catch */', - '/* condition 11-4: finally */', - '/* condition 8b: default */', - ]; - - /** - * Base array with all the scope opening tokens. - * - * This array is merged with expected result arrays for various unit tests - * to make sure all possible conditions are tested. - * - * This array should be kept in sync with the Tokens::$scopeOpeners array. - * This array isn't auto-generated based on the array in Tokens as for these - * tests we want to have access to the token constant names, not just their values. - * - * @var array - */ - protected $conditionDefaults = [ - 'T_CLASS' => false, - 'T_ANON_CLASS' => false, - 'T_INTERFACE' => false, - 'T_TRAIT' => false, - 'T_NAMESPACE' => false, - 'T_FUNCTION' => false, - 'T_CLOSURE' => false, - 'T_IF' => false, - 'T_SWITCH' => false, - 'T_CASE' => false, - 'T_DECLARE' => false, - 'T_DEFAULT' => false, - 'T_WHILE' => false, - 'T_ELSE' => false, - 'T_ELSEIF' => false, - 'T_FOR' => false, - 'T_FOREACH' => false, - 'T_DO' => false, - 'T_TRY' => false, - 'T_CATCH' => false, - 'T_FINALLY' => false, - 'T_PROPERTY' => false, - 'T_OBJECT' => false, - 'T_USE' => false, - ]; - - /** - * Cache for the test token stack pointers. - * - * @var array - */ - protected static $testTokens = []; - - /** - * Cache for the marker token stack pointers. - * - * @var array - */ - protected static $markerTokens = []; - - - /** - * Set up the token position caches for the tests. - * - * Retrieves the test tokens and marker token stack pointer positions - * only once and caches them as they won't change between the tests anyway. - * - * @before - * - * @return void - */ - protected function setUpCaches() - { - if (empty(self::$testTokens) === true) { - foreach (self::$testTargets as $targetToken => $marker) { - self::$testTokens[$marker] = $this->getTargetToken($marker, $targetToken); - } - } - - if (empty(self::$markerTokens) === true) { - foreach ($this->conditionMarkers as $marker) { - self::$markerTokens[$marker] = $this->getTargetToken($marker, Tokens::$scopeOpeners); - } - } - - }//end setUpCaches() - - - /** - * Test passing a non-existent token pointer. - * - * @return void - */ - public function testNonExistentToken() - { - $result = self::$phpcsFile->getCondition(100000, T_CLASS); - $this->assertFalse($result); - - $result = self::$phpcsFile->hasCondition(100000, T_IF); - $this->assertFalse($result); - - }//end testNonExistentToken() - - - /** - * Test passing a non conditional token. - * - * @return void - */ - public function testNonConditionalToken() - { - $targetType = T_STRING; - $stackPtr = $this->getTargetToken('/* testStartPoint */', $targetType); - - $result = self::$phpcsFile->getCondition($stackPtr, T_IF); - $this->assertFalse($result); - - $result = self::$phpcsFile->hasCondition($stackPtr, Tokens::$ooScopeTokens); - $this->assertFalse($result); - - }//end testNonConditionalToken() - - - /** - * Test retrieving a specific condition from a tokens "conditions" array. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * @param array $expectedResults Array with the condition token type to search for as key - * and the marker for the expected stack pointer result as a value. - * - * @dataProvider dataGetCondition - * - * @return void - */ - public function testGetCondition($testMarker, $expectedResults) - { - $stackPtr = self::$testTokens[$testMarker]; - - // Add expected results for all test markers not listed in the data provider. - $expectedResults += $this->conditionDefaults; - - foreach ($expectedResults as $conditionType => $expected) { - if (is_string($expected) === true) { - $expected = self::$markerTokens[$expected]; - } - - $result = self::$phpcsFile->getCondition($stackPtr, constant($conditionType)); - $this->assertSame( - $expected, - $result, - "Assertion failed for test marker '{$testMarker}' with condition {$conditionType}" - ); - } - - }//end testGetCondition() - - - /** - * Data provider. - * - * Only the conditions which are expected to be *found* need to be listed here. - * All other potential conditions will automatically also be tested and will expect - * `false` as a result. - * - * @see testGetCondition() For the array format. - * - * @return array>> - */ - public static function dataGetCondition() - { - return [ - 'testSeriouslyNestedMethod' => [ - 'testMarker' => '/* testSeriouslyNestedMethod */', - 'expectedResults' => [ - 'T_CLASS' => '/* condition 5: nested class */', - 'T_NAMESPACE' => '/* condition 0: namespace */', - 'T_FUNCTION' => '/* condition 2: function */', - 'T_IF' => '/* condition 1: if */', - 'T_ELSE' => '/* condition 3-2: else */', - ], - ], - 'testDeepestNested' => [ - 'testMarker' => '/* testDeepestNested */', - 'expectedResults' => [ - 'T_CLASS' => '/* condition 5: nested class */', - 'T_ANON_CLASS' => '/* condition 11-1: nested anonymous class */', - 'T_NAMESPACE' => '/* condition 0: namespace */', - 'T_FUNCTION' => '/* condition 2: function */', - 'T_CLOSURE' => '/* condition 13: closure */', - 'T_IF' => '/* condition 1: if */', - 'T_SWITCH' => '/* condition 7: switch */', - 'T_CASE' => '/* condition 8a: case */', - 'T_WHILE' => '/* condition 9: while */', - 'T_ELSE' => '/* condition 3-2: else */', - ], - ], - 'testInException' => [ - 'testMarker' => '/* testInException */', - 'expectedResults' => [ - 'T_CLASS' => '/* condition 5: nested class */', - 'T_NAMESPACE' => '/* condition 0: namespace */', - 'T_FUNCTION' => '/* condition 2: function */', - 'T_IF' => '/* condition 1: if */', - 'T_SWITCH' => '/* condition 7: switch */', - 'T_CASE' => '/* condition 8a: case */', - 'T_WHILE' => '/* condition 9: while */', - 'T_ELSE' => '/* condition 3-2: else */', - 'T_FOREACH' => '/* condition 10-3: foreach */', - 'T_CATCH' => '/* condition 11-3: catch */', - ], - ], - 'testInDefault' => [ - 'testMarker' => '/* testInDefault */', - 'expectedResults' => [ - 'T_CLASS' => '/* condition 5: nested class */', - 'T_NAMESPACE' => '/* condition 0: namespace */', - 'T_FUNCTION' => '/* condition 2: function */', - 'T_IF' => '/* condition 1: if */', - 'T_SWITCH' => '/* condition 7: switch */', - 'T_DEFAULT' => '/* condition 8b: default */', - 'T_ELSE' => '/* condition 3-2: else */', - ], - ], - ]; - - }//end dataGetCondition() - - - /** - * Test retrieving a specific condition from a tokens "conditions" array. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * @param array $expectedResults Array with the condition token type to search for as key - * and the marker for the expected stack pointer result as a value. - * - * @dataProvider dataGetConditionReversed - * - * @return void - */ - public function testGetConditionReversed($testMarker, $expectedResults) - { - $stackPtr = self::$testTokens[$testMarker]; - - // Add expected results for all test markers not listed in the data provider. - $expectedResults += $this->conditionDefaults; - - foreach ($expectedResults as $conditionType => $expected) { - if (is_string($expected) === true) { - $expected = self::$markerTokens[$expected]; - } - - $result = self::$phpcsFile->getCondition($stackPtr, constant($conditionType), false); - $this->assertSame( - $expected, - $result, - "Assertion failed for test marker '{$testMarker}' with condition {$conditionType} (reversed)" - ); - } - - }//end testGetConditionReversed() - - - /** - * Data provider. - * - * Only the conditions which are expected to be *found* need to be listed here. - * All other potential conditions will automatically also be tested and will expect - * `false` as a result. - * - * @see testGetConditionReversed() For the array format. - * - * @return array>> - */ - public static function dataGetConditionReversed() - { - $data = self::dataGetCondition(); - - // Set up the data for the reversed results. - $data['testSeriouslyNestedMethod']['expectedResults']['T_IF'] = '/* condition 4: if */'; - - $data['testDeepestNested']['expectedResults']['T_FUNCTION'] = '/* condition 12: nested anonymous class method */'; - $data['testDeepestNested']['expectedResults']['T_IF'] = '/* condition 10-1: if */'; - - $data['testInException']['expectedResults']['T_FUNCTION'] = '/* condition 6: class method */'; - $data['testInException']['expectedResults']['T_IF'] = '/* condition 4: if */'; - - $data['testInDefault']['expectedResults']['T_FUNCTION'] = '/* condition 6: class method */'; - $data['testInDefault']['expectedResults']['T_IF'] = '/* condition 4: if */'; - - return $data; - - }//end dataGetConditionReversed() - - - /** - * Test whether a token has a condition of a certain type. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * @param array $expectedResults Array with the condition token type to search for as key - * and the expected result as a value. - * - * @dataProvider dataHasCondition - * - * @return void - */ - public function testHasCondition($testMarker, $expectedResults) - { - $stackPtr = self::$testTokens[$testMarker]; - - // Add expected results for all test markers not listed in the data provider. - $expectedResults += $this->conditionDefaults; - - foreach ($expectedResults as $conditionType => $expected) { - $result = self::$phpcsFile->hasCondition($stackPtr, constant($conditionType)); - $this->assertSame( - $expected, - $result, - "Assertion failed for test marker '{$testMarker}' with condition {$conditionType}" - ); - } - - }//end testHasCondition() - - - /** - * Data Provider. - * - * Only list the "true" conditions in the $results array. - * All other potential conditions will automatically also be tested - * and will expect "false" as a result. - * - * @see testHasCondition() For the array format. - * - * @return array>> - */ - public static function dataHasCondition() - { - return [ - 'testSeriouslyNestedMethod' => [ - 'testMarker' => '/* testSeriouslyNestedMethod */', - 'expectedResults' => [ - 'T_CLASS' => true, - 'T_NAMESPACE' => true, - 'T_FUNCTION' => true, - 'T_IF' => true, - 'T_ELSE' => true, - ], - ], - 'testDeepestNested' => [ - 'testMarker' => '/* testDeepestNested */', - 'expectedResults' => [ - 'T_CLASS' => true, - 'T_ANON_CLASS' => true, - 'T_NAMESPACE' => true, - 'T_FUNCTION' => true, - 'T_CLOSURE' => true, - 'T_IF' => true, - 'T_SWITCH' => true, - 'T_CASE' => true, - 'T_WHILE' => true, - 'T_ELSE' => true, - ], - ], - 'testInException' => [ - 'testMarker' => '/* testInException */', - 'expectedResults' => [ - 'T_CLASS' => true, - 'T_NAMESPACE' => true, - 'T_FUNCTION' => true, - 'T_IF' => true, - 'T_SWITCH' => true, - 'T_CASE' => true, - 'T_WHILE' => true, - 'T_ELSE' => true, - 'T_FOREACH' => true, - 'T_CATCH' => true, - ], - ], - 'testInDefault' => [ - 'testMarker' => '/* testInDefault */', - 'expectedResults' => [ - 'T_CLASS' => true, - 'T_NAMESPACE' => true, - 'T_FUNCTION' => true, - 'T_IF' => true, - 'T_SWITCH' => true, - 'T_DEFAULT' => true, - 'T_ELSE' => true, - ], - ], - ]; - - }//end dataHasCondition() - - - /** - * Test whether a token has a condition of a certain type, with multiple allowed possibilities. - * - * @return void - */ - public function testHasConditionMultipleTypes() - { - $stackPtr = self::$testTokens['/* testInException */']; - - $result = self::$phpcsFile->hasCondition($stackPtr, [T_TRY, T_FINALLY]); - $this->assertFalse( - $result, - 'Failed asserting that "testInException" does not have a "try" nor a "finally" condition' - ); - - $result = self::$phpcsFile->hasCondition($stackPtr, [T_TRY, T_CATCH, T_FINALLY]); - $this->assertTrue( - $result, - 'Failed asserting that "testInException" has a "try", "catch" or "finally" condition' - ); - - $stackPtr = self::$testTokens['/* testSeriouslyNestedMethod */']; - - $result = self::$phpcsFile->hasCondition($stackPtr, [T_ANON_CLASS, T_CLOSURE]); - $this->assertFalse( - $result, - 'Failed asserting that "testSeriouslyNestedMethod" does not have an anonymous class nor a closure condition' - ); - - $result = self::$phpcsFile->hasCondition($stackPtr, Tokens::$ooScopeTokens); - $this->assertTrue( - $result, - 'Failed asserting that "testSeriouslyNestedMethod" has an OO Scope token condition' - ); - - }//end testHasConditionMultipleTypes() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetDeclarationNameJSTest.js b/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetDeclarationNameJSTest.js deleted file mode 100644 index ee0a76a..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetDeclarationNameJSTest.js +++ /dev/null @@ -1,23 +0,0 @@ -/* testInvalidTokenPassed */ -print something; - -var object = -{ - /* testClosure */ - propertyName: function () {} -} - -/* testFunction */ -function functionName() {} - -/* testClass */ -class ClassName -{ - /* testMethod */ - methodName() { - return false; - } -} - -/* testFunctionUnicode */ -function π() {} diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetDeclarationNameJSTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetDeclarationNameJSTest.php deleted file mode 100644 index b31b449..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetDeclarationNameJSTest.php +++ /dev/null @@ -1,158 +0,0 @@ - - * @copyright 2022 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Files\File; - -use PHP_CodeSniffer\Tests\Core\AbstractMethodUnitTest; - -/** - * Tests for the \PHP_CodeSniffer\Files\File:getDeclarationName method. - * - * @covers \PHP_CodeSniffer\Files\File::getDeclarationName - */ -final class GetDeclarationNameJSTest extends AbstractMethodUnitTest -{ - - /** - * The file extension of the test case file (without leading dot). - * - * @var string - */ - protected static $fileExtension = 'js'; - - - /** - * Test receiving an expected exception when a non-supported token is passed. - * - * @return void - */ - public function testInvalidTokenPassed() - { - $this->expectRunTimeException('Token type "T_STRING" is not T_FUNCTION, T_CLASS, T_INTERFACE, T_TRAIT or T_ENUM'); - - $target = $this->getTargetToken('/* testInvalidTokenPassed */', T_STRING); - self::$phpcsFile->getDeclarationName($target); - - }//end testInvalidTokenPassed() - - - /** - * Test receiving "null" when passed an anonymous construct or in case of a parse error. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * @param int|string $targetType Token type of the token to get as stackPtr. - * - * @dataProvider dataGetDeclarationNameNull - * - * @return void - */ - public function testGetDeclarationNameNull($testMarker, $targetType) - { - $target = $this->getTargetToken($testMarker, $targetType); - $result = self::$phpcsFile->getDeclarationName($target); - $this->assertNull($result); - - }//end testGetDeclarationNameNull() - - - /** - * Data provider. - * - * @see GetDeclarationNameTest::testGetDeclarationNameNull() - * - * @return array> - */ - public static function dataGetDeclarationNameNull() - { - return [ - 'closure' => [ - 'testMarker' => '/* testClosure */', - 'targetType' => T_CLOSURE, - ], - ]; - - }//end dataGetDeclarationNameNull() - - - /** - * Test retrieving the name of a function or OO structure. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * @param string $expected Expected function output. - * @param array|null $targetType Token type of the token to get as stackPtr. - * - * @dataProvider dataGetDeclarationName - * - * @return void - */ - public function testGetDeclarationName($testMarker, $expected, $targetType=null) - { - if (isset($targetType) === false) { - $targetType = [ - T_CLASS, - T_INTERFACE, - T_TRAIT, - T_ENUM, - T_FUNCTION, - ]; - } - - $target = $this->getTargetToken($testMarker, $targetType); - $result = self::$phpcsFile->getDeclarationName($target); - $this->assertSame($expected, $result); - - }//end testGetDeclarationName() - - - /** - * Data provider. - * - * @see GetDeclarationNameTest::testGetDeclarationName() - * - * @return array>> - */ - public static function dataGetDeclarationName() - { - return [ - 'function' => [ - 'testMarker' => '/* testFunction */', - 'expected' => 'functionName', - ], - 'class' => [ - 'testMarker' => '/* testClass */', - 'expected' => 'ClassName', - 'targetType' => [ - T_CLASS, - T_STRING, - ], - ], - 'function-unicode-name' => [ - 'testMarker' => '/* testFunctionUnicode */', - 'expected' => 'π', - ], - ]; - - }//end dataGetDeclarationName() - - - /** - * Test retrieving the name of JS ES6 class method. - * - * @return void - */ - public function testGetDeclarationNameES6Method() - { - $target = $this->getTargetToken('/* testMethod */', [T_CLASS, T_INTERFACE, T_TRAIT, T_FUNCTION]); - $result = self::$phpcsFile->getDeclarationName($target); - $this->assertSame('methodName', $result); - - }//end testGetDeclarationNameES6Method() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetDeclarationNameParseError1Test.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetDeclarationNameParseError1Test.inc deleted file mode 100644 index 451d4df..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetDeclarationNameParseError1Test.inc +++ /dev/null @@ -1,5 +0,0 @@ - - * @copyright 2025 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Files\File; - -use PHP_CodeSniffer\Tests\Core\AbstractMethodUnitTest; - -/** - * Tests for the \PHP_CodeSniffer\Files\File:getDeclarationName method. - * - * @covers \PHP_CodeSniffer\Files\File::getDeclarationName - */ -final class GetDeclarationNameParseError1Test extends AbstractMethodUnitTest -{ - - - /** - * Test receiving "null" in case of a parse error. - * - * @return void - */ - public function testGetDeclarationNameNull() - { - $target = $this->getTargetToken('/* testLiveCoding */', T_FUNCTION); - $result = self::$phpcsFile->getDeclarationName($target); - $this->assertNull($result); - - }//end testGetDeclarationNameNull() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetDeclarationNameParseError2Test.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetDeclarationNameParseError2Test.inc deleted file mode 100644 index e9a61cf..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetDeclarationNameParseError2Test.inc +++ /dev/null @@ -1,6 +0,0 @@ - - * @copyright 2025 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Files\File; - -use PHP_CodeSniffer\Tests\Core\AbstractMethodUnitTest; - -/** - * Tests for the \PHP_CodeSniffer\Files\File:getDeclarationName method. - * - * @covers \PHP_CodeSniffer\Files\File::getDeclarationName - */ -final class GetDeclarationNameParseError2Test extends AbstractMethodUnitTest -{ - - - /** - * Test receiving "null" in case of a parse error. - * - * @return void - */ - public function testGetDeclarationNameNull() - { - $target = $this->getTargetToken('/* testLiveCoding */', T_FUNCTION); - $result = self::$phpcsFile->getDeclarationName($target); - $this->assertNull($result); - - }//end testGetDeclarationNameNull() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetDeclarationNameTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetDeclarationNameTest.inc deleted file mode 100644 index a7a53c9..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetDeclarationNameTest.inc +++ /dev/null @@ -1,98 +0,0 @@ - - * @copyright 2022 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Files\File; - -use PHP_CodeSniffer\Tests\Core\AbstractMethodUnitTest; - -/** - * Tests for the \PHP_CodeSniffer\Files\File:getDeclarationName method. - * - * @covers \PHP_CodeSniffer\Files\File::getDeclarationName - */ -final class GetDeclarationNameTest extends AbstractMethodUnitTest -{ - - - /** - * Test receiving an expected exception when a non-supported token is passed. - * - * @return void - */ - public function testInvalidTokenPassed() - { - $this->expectRunTimeException('Token type "T_STRING" is not T_FUNCTION, T_CLASS, T_INTERFACE, T_TRAIT or T_ENUM'); - - $target = $this->getTargetToken('/* testInvalidTokenPassed */', T_STRING); - self::$phpcsFile->getDeclarationName($target); - - }//end testInvalidTokenPassed() - - - /** - * Test receiving "null" when passed an anonymous construct or in case of a parse error. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * @param int|string $targetType Token type of the token to get as stackPtr. - * - * @dataProvider dataGetDeclarationNameNull - * - * @return void - */ - public function testGetDeclarationNameNull($testMarker, $targetType) - { - $target = $this->getTargetToken($testMarker, $targetType); - $result = self::$phpcsFile->getDeclarationName($target); - $this->assertNull($result); - - }//end testGetDeclarationNameNull() - - - /** - * Data provider. - * - * @see testGetDeclarationNameNull() For the array format. - * - * @return array> - */ - public static function dataGetDeclarationNameNull() - { - return [ - 'closure' => [ - 'testMarker' => '/* testClosure */', - 'targetType' => T_CLOSURE, - ], - 'anon-class-with-parentheses' => [ - 'testMarker' => '/* testAnonClassWithParens */', - 'targetType' => T_ANON_CLASS, - ], - 'anon-class-with-parentheses-2' => [ - 'testMarker' => '/* testAnonClassWithParens2 */', - 'targetType' => T_ANON_CLASS, - ], - 'anon-class-without-parentheses' => [ - 'testMarker' => '/* testAnonClassWithoutParens */', - 'targetType' => T_ANON_CLASS, - ], - 'anon-class-extends-without-parentheses' => [ - 'testMarker' => '/* testAnonClassExtendsWithoutParens */', - 'targetType' => T_ANON_CLASS, - ], - ]; - - }//end dataGetDeclarationNameNull() - - - /** - * Test retrieving the name of a function or OO structure. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * @param string $expected Expected function output. - * @param int|string|null $targetType Token type of the token to get as stackPtr. - * - * @dataProvider dataGetDeclarationName - * - * @return void - */ - public function testGetDeclarationName($testMarker, $expected, $targetType=null) - { - if (isset($targetType) === false) { - $targetType = [ - T_CLASS, - T_INTERFACE, - T_TRAIT, - T_ENUM, - T_FUNCTION, - ]; - } - - $target = $this->getTargetToken($testMarker, $targetType); - $result = self::$phpcsFile->getDeclarationName($target); - $this->assertSame($expected, $result); - - }//end testGetDeclarationName() - - - /** - * Data provider. - * - * @see testGetDeclarationName() For the array format. - * - * @return array> - */ - public static function dataGetDeclarationName() - { - return [ - 'function' => [ - 'testMarker' => '/* testFunction */', - 'expected' => 'functionName', - ], - 'function-return-by-reference' => [ - 'testMarker' => '/* testFunctionReturnByRef */', - 'expected' => 'functionNameByRef', - ], - 'class' => [ - 'testMarker' => '/* testClass */', - 'expected' => 'ClassName', - ], - 'method' => [ - 'testMarker' => '/* testMethod */', - 'expected' => 'methodName', - ], - 'abstract-method' => [ - 'testMarker' => '/* testAbstractMethod */', - 'expected' => 'abstractMethodName', - ], - 'method-return-by-reference' => [ - 'testMarker' => '/* testMethodReturnByRef */', - 'expected' => 'MethodNameByRef', - ], - 'extended-class' => [ - 'testMarker' => '/* testExtendedClass */', - 'expected' => 'ExtendedClass', - ], - 'interface' => [ - 'testMarker' => '/* testInterface */', - 'expected' => 'InterfaceName', - ], - 'trait' => [ - 'testMarker' => '/* testTrait */', - 'expected' => 'TraitName', - ], - 'function-name-ends-with-number' => [ - 'testMarker' => '/* testFunctionEndingWithNumber */', - 'expected' => 'ValidNameEndingWithNumber5', - ], - 'class-with-numbers-in-name' => [ - 'testMarker' => '/* testClassWithNumber */', - 'expected' => 'ClassWith1Number', - ], - 'interface-with-numbers-in-name' => [ - 'testMarker' => '/* testInterfaceWithNumbers */', - 'expected' => 'InterfaceWith12345Numbers', - ], - 'class-with-comments-and-new-lines' => [ - 'testMarker' => '/* testClassWithCommentsAndNewLines */', - 'expected' => 'ClassWithCommentsAndNewLines', - ], - 'function-named-fn' => [ - 'testMarker' => '/* testFunctionFn */', - 'expected' => 'fn', - ], - 'enum-pure' => [ - 'testMarker' => '/* testPureEnum */', - 'expected' => 'Foo', - ], - 'enum-backed-space-between-name-and-colon' => [ - 'testMarker' => '/* testBackedEnumSpaceBetweenNameAndColon */', - 'expected' => 'Hoo', - ], - 'enum-backed-no-space-between-name-and-colon' => [ - 'testMarker' => '/* testBackedEnumNoSpaceBetweenNameAndColon */', - 'expected' => 'Suit', - ], - 'function-return-by-reference-with-reserved-keyword-each' => [ - 'testMarker' => '/* testFunctionReturnByRefWithReservedKeywordEach */', - 'expected' => 'each', - ], - 'function-return-by-reference-with-reserved-keyword-parent' => [ - 'testMarker' => '/* testFunctionReturnByRefWithReservedKeywordParent */', - 'expected' => 'parent', - ], - 'function-return-by-reference-with-reserved-keyword-self' => [ - 'testMarker' => '/* testFunctionReturnByRefWithReservedKeywordSelf */', - 'expected' => 'self', - ], - 'function-return-by-reference-with-reserved-keyword-static' => [ - 'testMarker' => '/* testFunctionReturnByRefWithReservedKeywordStatic */', - 'expected' => 'static', - ], - ]; - - }//end dataGetDeclarationName() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetMemberPropertiesTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetMemberPropertiesTest.inc deleted file mode 100644 index 2f3699e..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetMemberPropertiesTest.inc +++ /dev/null @@ -1,427 +0,0 @@ - 'a', 'b' => 'b' ), - /* testGroupPrivate 3 */ - $varQ = 'string', - /* testGroupPrivate 4 */ - $varR = 123, - /* testGroupPrivate 5 */ - $varS = ONE / self::THREE, - /* testGroupPrivate 6 */ - $varT = [ - 'a' => 'a', - 'b' => 'b' - ], - /* testGroupPrivate 7 */ - $varU = __DIR__ . "/base"; - - - /* testMethodParam */ - public function methodName($param) { - /* testImportedGlobal */ - global $importedGlobal = true; - - /* testLocalVariable */ - $localVariable = true; - } - - /* testPropertyAfterMethod */ - private static $varV = true; - - /* testMessyNullableType */ - public /* comment - */ ? //comment - array $foo = []; - - /* testNamespaceType */ - public \MyNamespace\MyClass $foo; - - /* testNullableNamespaceType 1 */ - private ?ClassName $nullableClassType; - - /* testNullableNamespaceType 2 */ - protected ?Folder\ClassName $nullableClassType2; - - /* testMultilineNamespaceType */ - public \MyNamespace /** comment *\/ comment */ - \MyClass /* comment */ - \Foo $foo; - -} - -interface Base -{ - /* testInterfaceProperty */ - protected $anonymous; -} - -/* testGlobalVariable */ -$globalVariable = true; - -/* testNotAVariable */ -return; - -$a = ( $foo == $bar ? new stdClass() : - new class() { - /* testNestedProperty 1 */ - public $var = true; - - /* testNestedMethodParam 1 */ - public function something($var = false) {} - } -); - -function_call( 'param', new class { - /* testNestedProperty 2 */ - public $year = 2017; - - /* testNestedMethodParam 2 */ - public function __construct( $open, $post_id ) {} -}, 10, 2 ); - -class PHP8Mixed { - /* testPHP8MixedTypeHint */ - public static miXed $mixed; - - /* testPHP8MixedTypeHintNullable */ - // Intentional fatal error - nullability is not allowed with mixed, but that's not the concern of the method. - private ?mixed $nullableMixed; -} - -class NSOperatorInType { - /* testNamespaceOperatorTypeHint */ - public ?namespace\Name $prop; -} - -$anon = class() { - /* testPHP8UnionTypesSimple */ - public int|float $unionTypeSimple; - - /* testPHP8UnionTypesTwoClasses */ - private MyClassA|\Package\MyClassB $unionTypesTwoClasses; - - /* testPHP8UnionTypesAllBaseTypes */ - protected array|bool|int|float|NULL|object|string $unionTypesAllBaseTypes; - - /* testPHP8UnionTypesAllPseudoTypes */ - // Intentional fatal error - mixing types which cannot be combined, but that's not the concern of the method. - var false|mixed|self|parent|iterable|Resource $unionTypesAllPseudoTypes; - - /* testPHP8UnionTypesIllegalTypes */ - // Intentional fatal error - types which are not allowed for properties, but that's not the concern of the method. - // Note: static is also not allowed as a type, but using static for a property type is not supported by the tokenizer. - public callable|void $unionTypesIllegalTypes; - - /* testPHP8UnionTypesNullable */ - // Intentional fatal error - nullability is not allowed with union types, but that's not the concern of the method. - public ?int|float $unionTypesNullable; - - /* testPHP8PseudoTypeNull */ - // PHP 8.0 - 8.1: Intentional fatal error - null pseudotype is only allowed in union types, but that's not the concern of the method. - public null $pseudoTypeNull; - - /* testPHP8PseudoTypeFalse */ - // PHP 8.0 - 8.1: Intentional fatal error - false pseudotype is only allowed in union types, but that's not the concern of the method. - public false $pseudoTypeFalse; - - /* testPHP8PseudoTypeFalseAndBool */ - // Intentional fatal error - false pseudotype is not allowed in combination with bool, but that's not the concern of the method. - public bool|FALSE $pseudoTypeFalseAndBool; - - /* testPHP8ObjectAndClass */ - // Intentional fatal error - object is not allowed in combination with class name, but that's not the concern of the method. - public object|ClassName $objectAndClass; - - /* testPHP8PseudoTypeIterableAndArray */ - // Intentional fatal error - iterable pseudotype is not allowed in combination with array or Traversable, but that's not the concern of the method. - public iterable|array|Traversable $pseudoTypeIterableAndArray; - - /* testPHP8DuplicateTypeInUnionWhitespaceAndComment */ - // Intentional fatal error - duplicate types are not allowed in union types, but that's not the concern of the method. - public int |string| /*comment*/ INT $duplicateTypeInUnion; - - /* testPHP81Readonly */ - public readonly int $readonly; - - /* testPHP81ReadonlyWithNullableType */ - public readonly ?array $readonlyWithNullableType; - - /* testPHP81ReadonlyWithUnionType */ - public readonly string|int $readonlyWithUnionType; - - /* testPHP81ReadonlyWithUnionTypeWithNull */ - protected ReadOnly string|null $readonlyWithUnionTypeWithNull; - - /* testPHP81OnlyReadonlyWithUnionType */ - readonly string|int $onlyReadonly; - - /* testPHP81OnlyReadonlyWithUnionTypeMultiple */ - readonly \InterfaceA|\Sub\InterfaceB|false - $onlyReadonly; - - /* testPHP81ReadonlyAndStatic */ - readonly private static ?string $readonlyAndStatic; - - /* testPHP81ReadonlyMixedCase */ - public ReadONLY static $readonlyMixedCase; -}; - -$anon = class { - /* testPHP8PropertySingleAttribute */ - #[PropertyWithAttribute] - public string $foo; - - /* testPHP8PropertyMultipleAttributes */ - #[PropertyWithAttribute(foo: 'bar'), MyAttribute] - protected ?int|float $bar; - - /* testPHP8PropertyMultilineAttribute */ - #[ - PropertyWithAttribute(/* comment */ 'baz') - ] - private mixed $baz; -}; - -enum Suit -{ - /* testEnumProperty */ - protected $anonymous; -} - -enum Direction implements ArrayAccess -{ - case Up; - case Down; - - /* testEnumMethodParamNotProperty */ - public function offsetGet($val) { ... } -} - -$anon = class() { - /* testPHP81IntersectionTypes */ - public Foo&Bar $intersectionType; - - /* testPHP81MoreIntersectionTypes */ - public Foo&Bar&Baz $moreIntersectionTypes; - - /* testPHP81IllegalIntersectionTypes */ - // Intentional fatal error - types which are not allowed for intersection type, but that's not the concern of the method. - public int&string $illegalIntersectionType; - - /* testPHP81NullableIntersectionType */ - // Intentional fatal error - nullability is not allowed with intersection type, but that's not the concern of the method. - public ?Foo&Bar $nullableIntersectionType; -}; - -$anon = class() { - /* testPHP82PseudoTypeTrue */ - public true $pseudoTypeTrue; - - /* testPHP82NullablePseudoTypeTrue */ - static protected ?true $pseudoTypeNullableTrue; - - /* testPHP82PseudoTypeTrueInUnion */ - private int|string|true $pseudoTypeTrueInUnion; - - /* testPHP82PseudoTypeFalseAndTrue */ - // Intentional fatal error - Type contains both true and false, bool should be used instead, but that's not the concern of the method. - readonly true|FALSE $pseudoTypeFalseAndTrue; -}; - -class WhitespaceAndCommentsInTypes { - /* testUnionTypeWithWhitespaceAndComment */ - public int | /*comment*/ string $hasWhitespaceAndComment; - - /* testIntersectionTypeWithWhitespaceAndComment */ - public \Foo /*comment*/ & Bar $hasWhitespaceAndComment; -} - -trait DNFTypes { - /* testPHP82DNFTypeStatic */ - public static (Foo&\Bar)|bool $propA; - - /* testPHP82DNFTypeReadonlyA */ - protected readonly float|(Partially\Qualified&Traversable) $propB; - - /* testPHP82DNFTypeReadonlyB */ - private readonly (namespace\Foo&Bar)|string $propC; - - /* testPHP82DNFTypeIllegalNullable */ - // Intentional fatal error - nullable operator cannot be combined with DNF. - var ?(A&\Pck\B)|bool $propD; -} - -class WithFinalProperties { - /* testPHP84FinalPublicTypedProp */ - final public string $val1; - /* testPHP84FinalProtectedTypedProp */ - final protected string $val2; - /* testPHP84FinalMiddleTypedProp */ - public final string $val3; - /* testPHP84FinalMiddleStaticTypedProp */ - public final static string $val4; - /* testPHP84FinalLastTypedProp */ - public readonly final string $val5; - /* testPHP84FinalImplicitVisibilityTypedProp */ - final string $val6; - /* testPHP84FinalImplicitVisibilityProp */ - final $val7; - /* testPHP84FinalNullableTypedProp */ - final public ?string $val8; - /* testPHP84FinalComplexTypedProp */ - final public (Foo&\Bar)|bool $val9; -} - -class AsymVisibility { - /* testPHP84AsymPublicSetProperty */ - public(set) mixed $prop1; - /* testPHP84AsymPublicPublicSetProperty */ - public public(set) (A&B)|null $prop2; - /* testPHP84AsymPublicSetPublicProperty */ - public(set) public bool $prop3; - - /* testPHP84AsymProtectedSetProperty */ - protected(set) readonly mixed $prop4; - /* testPHP84AsymPublicProtectedSetProperty */ - public protected(set) string $prop5; - /* testPHP84AsymProtectedSetPublicProperty */ - protected(set) public ?float $prop6; - - /* testPHP84AsymPrivateSetProperty */ - private(set) string|int $prop7; - /* testPHP84AsymProtectedPrivateSetProperty */ - final protected private(set) $prop8; - /* testPHP84AsymPrivateSetPublicProperty */ - private(set) public mixed $prop9; - - /* testPHP84IllegalAsymPublicProtectedSetStaticProperty */ - public protected(set) static mixed $prop10; -} - -abstract class WithAbstractProperties { - /* testPHP84AbstractPublicTypedProp */ - abstract public string $val1 { get; } - /* testPHP84AbstractProtectedTypedProp */ - abstract protected Union|Type $val2 { set; } - /* testPHP84AbstractMiddleTypedProp */ - public abstract Intersection&Type $val3 { get; } - /* testPHP84AbstractImplicitVisibilityTypedProp */ - abstract int $val4 { set; } - /* testPHP84AbstractImplicitVisibilityProp */ - abstract $val5 { get; } - /* testPHP84AbstractNullableTypedProp */ - abstract public ?string $val6 { set; } - /* testPHP84AbstractComplexTypedProp */ - abstract protected (Foo&\Bar)|false $val7 { get; } - - /* testPHP84IllegalAbstractPrivateProp */ - private abstract string $val8 { get; } - /* testPHP84IllegalAbstractReadonlyProp */ - public readonly abstract string $val9 { get; } - /* testPHP84IllegalAbstractStaticProp */ - public abstract static string $val10 { get; } -} diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetMemberPropertiesTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetMemberPropertiesTest.php deleted file mode 100644 index 22dc1cc..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetMemberPropertiesTest.php +++ /dev/null @@ -1,1899 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Files\File; - -use PHP_CodeSniffer\Tests\Core\AbstractMethodUnitTest; - -/** - * Tests for the \PHP_CodeSniffer\Files\File::getMemberProperties method. - * - * @covers \PHP_CodeSniffer\Files\File::getMemberProperties - */ -final class GetMemberPropertiesTest extends AbstractMethodUnitTest -{ - - - /** - * Test the getMemberProperties() method. - * - * @param string $identifier Comment which precedes the test case. - * @param array $expected Expected function output. - * - * @dataProvider dataGetMemberProperties - * - * @return void - */ - public function testGetMemberProperties($identifier, $expected) - { - $variable = $this->getTargetToken($identifier, T_VARIABLE); - $result = self::$phpcsFile->getMemberProperties($variable); - - // Convert offsets to absolute positions in the token stream. - if (isset($expected['type_token']) === true && is_int($expected['type_token']) === true) { - $expected['type_token'] += $variable; - } - - if (isset($expected['type_end_token']) === true && is_int($expected['type_end_token']) === true) { - $expected['type_end_token'] += $variable; - } - - $this->assertSame($expected, $result); - - }//end testGetMemberProperties() - - - /** - * Data provider for the GetMemberProperties test. - * - * Note: the `expected - type_token` and `expected - type_end_token` indexes should - * contain either `false` (no type) or the _offset_ of the type start/end token in - * relation to the `T_VARIABLE` token which is passed to the getMemberProperties() method. - * - * @see testGetMemberProperties() - * - * @return array>> - */ - public static function dataGetMemberProperties() - { - return [ - 'var-modifier' => [ - 'identifier' => '/* testVar */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => false, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '', - 'type_token' => false, - 'type_end_token' => false, - 'nullable_type' => false, - ], - ], - 'var-modifier-and-type' => [ - 'identifier' => '/* testVarType */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => false, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '?int', - 'type_token' => -2, - 'type_end_token' => -2, - 'nullable_type' => true, - ], - ], - 'public-modifier' => [ - 'identifier' => '/* testPublic */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '', - 'type_token' => false, - 'type_end_token' => false, - 'nullable_type' => false, - ], - ], - 'public-modifier-and-type' => [ - 'identifier' => '/* testPublicType */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => 'string', - 'type_token' => -2, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'protected-modifier' => [ - 'identifier' => '/* testProtected */', - 'expected' => [ - 'scope' => 'protected', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '', - 'type_token' => false, - 'type_end_token' => false, - 'nullable_type' => false, - ], - ], - 'protected-modifier-and-type' => [ - 'identifier' => '/* testProtectedType */', - 'expected' => [ - 'scope' => 'protected', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => 'bool', - 'type_token' => -2, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'private-modifier' => [ - 'identifier' => '/* testPrivate */', - 'expected' => [ - 'scope' => 'private', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '', - 'type_token' => false, - 'type_end_token' => false, - 'nullable_type' => false, - ], - ], - 'private-modifier-and-type' => [ - 'identifier' => '/* testPrivateType */', - 'expected' => [ - 'scope' => 'private', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => 'array', - 'type_token' => -2, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'static-modifier' => [ - 'identifier' => '/* testStatic */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => false, - 'set_scope' => false, - 'is_static' => true, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '', - 'type_token' => false, - 'type_end_token' => false, - 'nullable_type' => false, - ], - ], - 'static-modifier-and-type' => [ - 'identifier' => '/* testStaticType */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => false, - 'set_scope' => false, - 'is_static' => true, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '?string', - 'type_token' => -2, - 'type_end_token' => -2, - 'nullable_type' => true, - ], - ], - 'static-and-var-modifier' => [ - 'identifier' => '/* testStaticVar */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => false, - 'set_scope' => false, - 'is_static' => true, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '', - 'type_token' => false, - 'type_end_token' => false, - 'nullable_type' => false, - ], - ], - 'var-and-static-modifier' => [ - 'identifier' => '/* testVarStatic */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => false, - 'set_scope' => false, - 'is_static' => true, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '', - 'type_token' => false, - 'type_end_token' => false, - 'nullable_type' => false, - ], - ], - 'public-static-modifiers' => [ - 'identifier' => '/* testPublicStatic */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => true, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '', - 'type_token' => false, - 'type_end_token' => false, - 'nullable_type' => false, - ], - ], - 'protected-static-modifiers' => [ - 'identifier' => '/* testProtectedStatic */', - 'expected' => [ - 'scope' => 'protected', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => true, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '', - 'type_token' => false, - 'type_end_token' => false, - 'nullable_type' => false, - ], - ], - 'private-static-modifiers' => [ - 'identifier' => '/* testPrivateStatic */', - 'expected' => [ - 'scope' => 'private', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => true, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '', - 'type_token' => false, - 'type_end_token' => false, - 'nullable_type' => false, - ], - ], - 'no-modifier' => [ - 'identifier' => '/* testNoPrefix */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => false, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '', - 'type_token' => false, - 'type_end_token' => false, - 'nullable_type' => false, - ], - ], - 'public-and-static-modifier-with-docblock' => [ - 'identifier' => '/* testPublicStaticWithDocblock */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => true, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '', - 'type_token' => false, - 'type_end_token' => false, - 'nullable_type' => false, - ], - ], - 'protected-and-static-modifier-with-docblock' => [ - 'identifier' => '/* testProtectedStaticWithDocblock */', - 'expected' => [ - 'scope' => 'protected', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => true, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '', - 'type_token' => false, - 'type_end_token' => false, - 'nullable_type' => false, - ], - ], - 'private-and-static-modifier-with-docblock' => [ - 'identifier' => '/* testPrivateStaticWithDocblock */', - 'expected' => [ - 'scope' => 'private', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => true, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '', - 'type_token' => false, - 'type_end_token' => false, - 'nullable_type' => false, - ], - ], - 'property-group-simple-type-prop-1' => [ - 'identifier' => '/* testGroupType 1 */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => 'float', - 'type_token' => -6, - 'type_end_token' => -6, - 'nullable_type' => false, - ], - ], - 'property-group-simple-type-prop-2' => [ - 'identifier' => '/* testGroupType 2 */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => 'float', - 'type_token' => -13, - 'type_end_token' => -13, - 'nullable_type' => false, - ], - ], - 'property-group-nullable-type-prop-1' => [ - 'identifier' => '/* testGroupNullableType 1 */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => true, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '?string', - 'type_token' => -6, - 'type_end_token' => -6, - 'nullable_type' => true, - ], - ], - 'property-group-nullable-type-prop-2' => [ - 'identifier' => '/* testGroupNullableType 2 */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => true, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '?string', - 'type_token' => -17, - 'type_end_token' => -17, - 'nullable_type' => true, - ], - ], - 'property-group-protected-static-prop-1' => [ - 'identifier' => '/* testGroupProtectedStatic 1 */', - 'expected' => [ - 'scope' => 'protected', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => true, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '', - 'type_token' => false, - 'type_end_token' => false, - 'nullable_type' => false, - ], - ], - 'property-group-protected-static-prop-2' => [ - 'identifier' => '/* testGroupProtectedStatic 2 */', - 'expected' => [ - 'scope' => 'protected', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => true, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '', - 'type_token' => false, - 'type_end_token' => false, - 'nullable_type' => false, - ], - ], - 'property-group-protected-static-prop-3' => [ - 'identifier' => '/* testGroupProtectedStatic 3 */', - 'expected' => [ - 'scope' => 'protected', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => true, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '', - 'type_token' => false, - 'type_end_token' => false, - 'nullable_type' => false, - ], - ], - 'property-group-private-prop-1' => [ - 'identifier' => '/* testGroupPrivate 1 */', - 'expected' => [ - 'scope' => 'private', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '', - 'type_token' => false, - 'type_end_token' => false, - 'nullable_type' => false, - ], - ], - 'property-group-private-prop-2' => [ - 'identifier' => '/* testGroupPrivate 2 */', - 'expected' => [ - 'scope' => 'private', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '', - 'type_token' => false, - 'type_end_token' => false, - 'nullable_type' => false, - ], - ], - 'property-group-private-prop-3' => [ - 'identifier' => '/* testGroupPrivate 3 */', - 'expected' => [ - 'scope' => 'private', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '', - 'type_token' => false, - 'type_end_token' => false, - 'nullable_type' => false, - ], - ], - 'property-group-private-prop-4' => [ - 'identifier' => '/* testGroupPrivate 4 */', - 'expected' => [ - 'scope' => 'private', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '', - 'type_token' => false, - 'type_end_token' => false, - 'nullable_type' => false, - ], - ], - 'property-group-private-prop-5' => [ - 'identifier' => '/* testGroupPrivate 5 */', - 'expected' => [ - 'scope' => 'private', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '', - 'type_token' => false, - 'type_end_token' => false, - 'nullable_type' => false, - ], - ], - 'property-group-private-prop-6' => [ - 'identifier' => '/* testGroupPrivate 6 */', - 'expected' => [ - 'scope' => 'private', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '', - 'type_token' => false, - 'type_end_token' => false, - 'nullable_type' => false, - ], - ], - 'property-group-private-prop-7' => [ - 'identifier' => '/* testGroupPrivate 7 */', - 'expected' => [ - 'scope' => 'private', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '', - 'type_token' => false, - 'type_end_token' => false, - 'nullable_type' => false, - ], - ], - 'messy-nullable-type' => [ - 'identifier' => '/* testMessyNullableType */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '?array', - 'type_token' => -2, - 'type_end_token' => -2, - 'nullable_type' => true, - ], - ], - 'fqn-type' => [ - 'identifier' => '/* testNamespaceType */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '\MyNamespace\MyClass', - 'type_token' => -5, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'nullable-classname-type' => [ - 'identifier' => '/* testNullableNamespaceType 1 */', - 'expected' => [ - 'scope' => 'private', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '?ClassName', - 'type_token' => -2, - 'type_end_token' => -2, - 'nullable_type' => true, - ], - ], - 'nullable-namespace-relative-class-type' => [ - 'identifier' => '/* testNullableNamespaceType 2 */', - 'expected' => [ - 'scope' => 'protected', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '?Folder\ClassName', - 'type_token' => -4, - 'type_end_token' => -2, - 'nullable_type' => true, - ], - ], - 'multiline-namespaced-type' => [ - 'identifier' => '/* testMultilineNamespaceType */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '\MyNamespace\MyClass\Foo', - 'type_token' => -18, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'property-after-method' => [ - 'identifier' => '/* testPropertyAfterMethod */', - 'expected' => [ - 'scope' => 'private', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => true, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '', - 'type_token' => false, - 'type_end_token' => false, - 'nullable_type' => false, - ], - ], - 'invalid-property-in-interface' => [ - 'identifier' => '/* testInterfaceProperty */', - 'expected' => [], - ], - 'property-in-nested-class-1' => [ - 'identifier' => '/* testNestedProperty 1 */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '', - 'type_token' => false, - 'type_end_token' => false, - 'nullable_type' => false, - ], - ], - 'property-in-nested-class-2' => [ - 'identifier' => '/* testNestedProperty 2 */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '', - 'type_token' => false, - 'type_end_token' => false, - 'nullable_type' => false, - ], - ], - 'php8-mixed-type' => [ - 'identifier' => '/* testPHP8MixedTypeHint */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => true, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => 'miXed', - 'type_token' => -2, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8-nullable-mixed-type' => [ - 'identifier' => '/* testPHP8MixedTypeHintNullable */', - 'expected' => [ - 'scope' => 'private', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '?mixed', - 'type_token' => -2, - 'type_end_token' => -2, - 'nullable_type' => true, - ], - ], - 'namespace-operator-type-declaration' => [ - 'identifier' => '/* testNamespaceOperatorTypeHint */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '?namespace\Name', - 'type_token' => -4, - 'type_end_token' => -2, - 'nullable_type' => true, - ], - ], - 'php8-union-types-simple' => [ - 'identifier' => '/* testPHP8UnionTypesSimple */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => 'int|float', - 'type_token' => -4, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8-union-types-two-classes' => [ - 'identifier' => '/* testPHP8UnionTypesTwoClasses */', - 'expected' => [ - 'scope' => 'private', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => 'MyClassA|\Package\MyClassB', - 'type_token' => -7, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8-union-types-all-base-types' => [ - 'identifier' => '/* testPHP8UnionTypesAllBaseTypes */', - 'expected' => [ - 'scope' => 'protected', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => 'array|bool|int|float|NULL|object|string', - 'type_token' => -14, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8-union-types-all-pseudo-types' => [ - 'identifier' => '/* testPHP8UnionTypesAllPseudoTypes */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => false, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => 'false|mixed|self|parent|iterable|Resource', - 'type_token' => -12, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8-union-types-illegal-types' => [ - 'identifier' => '/* testPHP8UnionTypesIllegalTypes */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - // Missing static, but that's OK as not an allowed syntax. - 'type' => 'callable|void', - 'type_token' => -4, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8-union-types-nullable' => [ - 'identifier' => '/* testPHP8UnionTypesNullable */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '?int|float', - 'type_token' => -4, - 'type_end_token' => -2, - 'nullable_type' => true, - ], - ], - 'php8-union-types-pseudo-type-null' => [ - 'identifier' => '/* testPHP8PseudoTypeNull */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => 'null', - 'type_token' => -2, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8-union-types-pseudo-type-false' => [ - 'identifier' => '/* testPHP8PseudoTypeFalse */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => 'false', - 'type_token' => -2, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8-union-types-pseudo-type-false-and-bool' => [ - 'identifier' => '/* testPHP8PseudoTypeFalseAndBool */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => 'bool|FALSE', - 'type_token' => -4, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8-union-types-object-and-class' => [ - 'identifier' => '/* testPHP8ObjectAndClass */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => 'object|ClassName', - 'type_token' => -4, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8-union-types-pseudo-type-iterable-and-array' => [ - 'identifier' => '/* testPHP8PseudoTypeIterableAndArray */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => 'iterable|array|Traversable', - 'type_token' => -6, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8-union-types-duplicate-type-with-whitespace-and-comments' => [ - 'identifier' => '/* testPHP8DuplicateTypeInUnionWhitespaceAndComment */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => 'int|string|INT', - 'type_token' => -10, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8.1-readonly-property' => [ - 'identifier' => '/* testPHP81Readonly */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => true, - 'is_final' => false, - 'is_abstract' => false, - 'type' => 'int', - 'type_token' => -2, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8.1-readonly-property-with-nullable-type' => [ - 'identifier' => '/* testPHP81ReadonlyWithNullableType */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => true, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '?array', - 'type_token' => -2, - 'type_end_token' => -2, - 'nullable_type' => true, - ], - ], - 'php8.1-readonly-property-with-union-type' => [ - 'identifier' => '/* testPHP81ReadonlyWithUnionType */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => true, - 'is_final' => false, - 'is_abstract' => false, - 'type' => 'string|int', - 'type_token' => -4, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8.1-readonly-property-with-union-type-with-null' => [ - 'identifier' => '/* testPHP81ReadonlyWithUnionTypeWithNull */', - 'expected' => [ - 'scope' => 'protected', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => true, - 'is_final' => false, - 'is_abstract' => false, - 'type' => 'string|null', - 'type_token' => -4, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8.1-readonly-property-with-union-type-no-visibility' => [ - 'identifier' => '/* testPHP81OnlyReadonlyWithUnionType */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => false, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => true, - 'is_final' => false, - 'is_abstract' => false, - 'type' => 'string|int', - 'type_token' => -4, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8.1-readonly-property-with-multi-union-type-no-visibility' => [ - 'identifier' => '/* testPHP81OnlyReadonlyWithUnionTypeMultiple */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => false, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => true, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '\InterfaceA|\Sub\InterfaceB|false', - 'type_token' => -11, - 'type_end_token' => -3, - 'nullable_type' => false, - ], - ], - 'php8.1-readonly-and-static-property' => [ - 'identifier' => '/* testPHP81ReadonlyAndStatic */', - 'expected' => [ - 'scope' => 'private', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => true, - 'is_readonly' => true, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '?string', - 'type_token' => -2, - 'type_end_token' => -2, - 'nullable_type' => true, - ], - ], - 'php8.1-readonly-mixed-case-keyword' => [ - 'identifier' => '/* testPHP81ReadonlyMixedCase */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => true, - 'is_readonly' => true, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '', - 'type_token' => false, - 'type_end_token' => false, - 'nullable_type' => false, - ], - ], - 'php8-property-with-single-attribute' => [ - 'identifier' => '/* testPHP8PropertySingleAttribute */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => 'string', - 'type_token' => -2, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8-property-with-multiple-attributes' => [ - 'identifier' => '/* testPHP8PropertyMultipleAttributes */', - 'expected' => [ - 'scope' => 'protected', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '?int|float', - 'type_token' => -4, - 'type_end_token' => -2, - 'nullable_type' => true, - ], - ], - 'php8-property-with-multiline-attribute' => [ - 'identifier' => '/* testPHP8PropertyMultilineAttribute */', - 'expected' => [ - 'scope' => 'private', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => 'mixed', - 'type_token' => -2, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'invalid-property-in-enum' => [ - 'identifier' => '/* testEnumProperty */', - 'expected' => [], - ], - 'php8.1-single-intersection-type' => [ - 'identifier' => '/* testPHP81IntersectionTypes */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => 'Foo&Bar', - 'type_token' => -4, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8.1-multi-intersection-type' => [ - 'identifier' => '/* testPHP81MoreIntersectionTypes */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => 'Foo&Bar&Baz', - 'type_token' => -6, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8.1-illegal-intersection-type' => [ - 'identifier' => '/* testPHP81IllegalIntersectionTypes */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => 'int&string', - 'type_token' => -4, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8.1-nullable-intersection-type' => [ - 'identifier' => '/* testPHP81NullableIntersectionType */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '?Foo&Bar', - 'type_token' => -4, - 'type_end_token' => -2, - 'nullable_type' => true, - ], - ], - - 'php8.0-union-type-with-whitespace-and-comment' => [ - 'identifier' => '/* testUnionTypeWithWhitespaceAndComment */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => 'int|string', - 'type_token' => -8, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8.1-intersection-type-with-whitespace-and-comment' => [ - 'identifier' => '/* testIntersectionTypeWithWhitespaceAndComment */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '\Foo&Bar', - 'type_token' => -9, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8.2-pseudo-type-true' => [ - 'identifier' => '/* testPHP82PseudoTypeTrue */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => 'true', - 'type_token' => -2, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8.2-pseudo-type-true-nullable' => [ - 'identifier' => '/* testPHP82NullablePseudoTypeTrue */', - 'expected' => [ - 'scope' => 'protected', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => true, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '?true', - 'type_token' => -2, - 'type_end_token' => -2, - 'nullable_type' => true, - ], - ], - 'php8.2-pseudo-type-true-in-union' => [ - 'identifier' => '/* testPHP82PseudoTypeTrueInUnion */', - 'expected' => [ - 'scope' => 'private', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => 'int|string|true', - 'type_token' => -6, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8.2-pseudo-type-invalid-true-false-union' => [ - 'identifier' => '/* testPHP82PseudoTypeFalseAndTrue */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => false, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => true, - 'is_final' => false, - 'is_abstract' => false, - 'type' => 'true|FALSE', - 'type_token' => -4, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - - 'php8.2-dnf-with-static' => [ - 'identifier' => '/* testPHP82DNFTypeStatic */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => true, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '(Foo&\Bar)|bool', - 'type_token' => -9, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8.2-dnf-with-readonly-1' => [ - 'identifier' => '/* testPHP82DNFTypeReadonlyA */', - 'expected' => [ - 'scope' => 'protected', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => true, - 'is_final' => false, - 'is_abstract' => false, - 'type' => 'float|(Partially\Qualified&Traversable)', - 'type_token' => -10, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8.2-dnf-with-readonly-2' => [ - 'identifier' => '/* testPHP82DNFTypeReadonlyB */', - 'expected' => [ - 'scope' => 'private', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => true, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '(namespace\Foo&Bar)|string', - 'type_token' => -10, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8.2-dnf-with-illegal-nullable' => [ - 'identifier' => '/* testPHP82DNFTypeIllegalNullable */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => false, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '?(A&\Pck\B)|bool', - 'type_token' => -11, - 'type_end_token' => -2, - 'nullable_type' => true, - ], - ], - 'php8.4-final-public-property' => [ - 'identifier' => '/* testPHP84FinalPublicTypedProp */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => true, - 'is_abstract' => false, - 'type' => 'string', - 'type_token' => -2, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8.4-final-protected-property' => [ - 'identifier' => '/* testPHP84FinalProtectedTypedProp */', - 'expected' => [ - 'scope' => 'protected', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => true, - 'is_abstract' => false, - 'type' => 'string', - 'type_token' => -2, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8.4-final-middle-keyword-property' => [ - 'identifier' => '/* testPHP84FinalMiddleTypedProp */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => true, - 'is_abstract' => false, - 'type' => 'string', - 'type_token' => -2, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8.4-final-middle-keyword-static-property' => [ - 'identifier' => '/* testPHP84FinalMiddleStaticTypedProp */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => true, - 'is_readonly' => false, - 'is_final' => true, - 'is_abstract' => false, - 'type' => 'string', - 'type_token' => -2, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8.4-final-last-keyword-property' => [ - 'identifier' => '/* testPHP84FinalLastTypedProp */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => true, - 'is_final' => true, - 'is_abstract' => false, - 'type' => 'string', - 'type_token' => -2, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8.4-final-implicit-public-typed-property' => [ - 'identifier' => '/* testPHP84FinalImplicitVisibilityTypedProp */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => false, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => true, - 'is_abstract' => false, - 'type' => 'string', - 'type_token' => -2, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8.4-final-implicit-public-untyped-property' => [ - 'identifier' => '/* testPHP84FinalImplicitVisibilityProp */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => false, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => true, - 'is_abstract' => false, - 'type' => '', - 'type_token' => false, - 'type_end_token' => false, - 'nullable_type' => false, - ], - ], - 'php8.4-final-public-nullable-typed-property' => [ - 'identifier' => '/* testPHP84FinalNullableTypedProp */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => true, - 'is_abstract' => false, - 'type' => '?string', - 'type_token' => -2, - 'type_end_token' => -2, - 'nullable_type' => true, - ], - ], - 'php8.4-final-public-complex-type-property' => [ - 'identifier' => '/* testPHP84FinalComplexTypedProp */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => true, - 'is_abstract' => false, - 'type' => '(Foo&\Bar)|bool', - 'type_token' => -9, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - - 'php8.4-asym-public-set' => [ - 'identifier' => '/* testPHP84AsymPublicSetProperty */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => false, - 'set_scope' => 'public', - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => 'mixed', - 'type_token' => -2, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8.4-asym-public-public-set-dnf-type' => [ - 'identifier' => '/* testPHP84AsymPublicPublicSetProperty */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => 'public', - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '(A&B)|null', - 'type_token' => -8, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8.4-asym-public-set-public' => [ - 'identifier' => '/* testPHP84AsymPublicSetPublicProperty */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => 'public', - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => 'bool', - 'type_token' => -2, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8.4-asym-protected-set-readonly' => [ - 'identifier' => '/* testPHP84AsymProtectedSetProperty */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => false, - 'set_scope' => 'protected', - 'is_static' => false, - 'is_readonly' => true, - 'is_final' => false, - 'is_abstract' => false, - 'type' => 'mixed', - 'type_token' => -2, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8.4-asym-public-protected-set' => [ - 'identifier' => '/* testPHP84AsymPublicProtectedSetProperty */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => 'protected', - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => 'string', - 'type_token' => -2, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8.4-asym-protected-set-public-nullable-type' => [ - 'identifier' => '/* testPHP84AsymProtectedSetPublicProperty */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => 'protected', - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => '?float', - 'type_token' => -2, - 'type_end_token' => -2, - 'nullable_type' => true, - ], - ], - 'php8.4-asym-private-set-union-type' => [ - 'identifier' => '/* testPHP84AsymPrivateSetProperty */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => false, - 'set_scope' => 'private', - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => 'string|int', - 'type_token' => -4, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8.4-asym-final-protected-private-set' => [ - 'identifier' => '/* testPHP84AsymProtectedPrivateSetProperty */', - 'expected' => [ - 'scope' => 'protected', - 'scope_specified' => true, - 'set_scope' => 'private', - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => true, - 'is_abstract' => false, - 'type' => '', - 'type_token' => false, - 'type_end_token' => false, - 'nullable_type' => false, - ], - ], - 'php8.4-asym-private-set-public' => [ - 'identifier' => '/* testPHP84AsymPrivateSetPublicProperty */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => 'private', - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => 'mixed', - 'type_token' => -2, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8.4-illegal-asym-public-protected-set-static' => [ - 'identifier' => '/* testPHP84IllegalAsymPublicProtectedSetStaticProperty */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => 'protected', - 'is_static' => true, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => false, - 'type' => 'mixed', - 'type_token' => -2, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8.4-abstract-public-property' => [ - 'identifier' => '/* testPHP84AbstractPublicTypedProp */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => true, - 'type' => 'string', - 'type_token' => -2, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8.4-abstract-protected-property' => [ - 'identifier' => '/* testPHP84AbstractProtectedTypedProp */', - 'expected' => [ - 'scope' => 'protected', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => true, - 'type' => 'Union|Type', - 'type_token' => -4, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8.4-abstract-middle-keyword-property' => [ - 'identifier' => '/* testPHP84AbstractMiddleTypedProp */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => true, - 'type' => 'Intersection&Type', - 'type_token' => -4, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8.4-abstract-implicit-public-typed-property' => [ - 'identifier' => '/* testPHP84AbstractImplicitVisibilityTypedProp */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => false, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => true, - 'type' => 'int', - 'type_token' => -2, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8.4-abstract-implicit-public-untyped-property' => [ - 'identifier' => '/* testPHP84AbstractImplicitVisibilityProp */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => false, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => true, - 'type' => '', - 'type_token' => false, - 'type_end_token' => false, - 'nullable_type' => false, - ], - ], - 'php8.4-abstract-public-nullable-typed-property' => [ - 'identifier' => '/* testPHP84AbstractNullableTypedProp */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => true, - 'type' => '?string', - 'type_token' => -2, - 'type_end_token' => -2, - 'nullable_type' => true, - ], - ], - 'php8.4-abstract-protected-complex-type-property' => [ - 'identifier' => '/* testPHP84AbstractComplexTypedProp */', - 'expected' => [ - 'scope' => 'protected', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => true, - 'type' => '(Foo&\Bar)|false', - 'type_token' => -9, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8.4-illegal-abstract-private-property' => [ - 'identifier' => '/* testPHP84IllegalAbstractPrivateProp */', - 'expected' => [ - 'scope' => 'private', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => true, - 'type' => 'string', - 'type_token' => -2, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8.4-illegal-abstract-readonly-property' => [ - 'identifier' => '/* testPHP84IllegalAbstractReadonlyProp */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => false, - 'is_readonly' => true, - 'is_final' => false, - 'is_abstract' => true, - 'type' => 'string', - 'type_token' => -2, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - 'php8.4-illegal-abstract-static-property' => [ - 'identifier' => '/* testPHP84IllegalAbstractStaticProp */', - 'expected' => [ - 'scope' => 'public', - 'scope_specified' => true, - 'set_scope' => false, - 'is_static' => true, - 'is_readonly' => false, - 'is_final' => false, - 'is_abstract' => true, - 'type' => 'string', - 'type_token' => -2, - 'type_end_token' => -2, - 'nullable_type' => false, - ], - ], - ]; - - }//end dataGetMemberProperties() - - - /** - * Test receiving an expected exception when a non property is passed. - * - * @param string $identifier Comment which precedes the test case. - * - * @dataProvider dataNotClassProperty - * - * @return void - */ - public function testNotClassPropertyException($identifier) - { - $this->expectRunTimeException('$stackPtr is not a class member var'); - - $variable = $this->getTargetToken($identifier, T_VARIABLE); - self::$phpcsFile->getMemberProperties($variable); - - }//end testNotClassPropertyException() - - - /** - * Data provider for the NotClassPropertyException test. - * - * @see testNotClassPropertyException() - * - * @return array> - */ - public static function dataNotClassProperty() - { - return [ - 'method parameter' => ['/* testMethodParam */'], - 'variable import using global keyword' => ['/* testImportedGlobal */'], - 'function local variable' => ['/* testLocalVariable */'], - 'global variable' => ['/* testGlobalVariable */'], - 'method parameter in anon class nested in ternary' => ['/* testNestedMethodParam 1 */'], - 'method parameter in anon class nested in function call' => ['/* testNestedMethodParam 2 */'], - 'method parameter in enum' => ['/* testEnumMethodParamNotProperty */'], - ]; - - }//end dataNotClassProperty() - - - /** - * Test receiving an expected exception when a non variable is passed. - * - * @return void - */ - public function testNotAVariableException() - { - $this->expectRunTimeException('$stackPtr must be of type T_VARIABLE'); - - $next = $this->getTargetToken('/* testNotAVariable */', T_RETURN); - self::$phpcsFile->getMemberProperties($next); - - }//end testNotAVariableException() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetMethodParametersParseError1Test.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetMethodParametersParseError1Test.inc deleted file mode 100644 index 465679e..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetMethodParametersParseError1Test.inc +++ /dev/null @@ -1,4 +0,0 @@ - - * @copyright 2019 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Files\File; - -use PHP_CodeSniffer\Tests\Core\AbstractMethodUnitTest; - -/** - * Tests for the \PHP_CodeSniffer\Files\File::getMethodParameters method. - * - * @covers \PHP_CodeSniffer\Files\File::getMethodParameters - */ -final class GetMethodParametersParseError1Test extends AbstractMethodUnitTest -{ - - - /** - * Test receiving an empty array when encountering a specific parse error. - * - * @return void - */ - public function testParseError() - { - $target = $this->getTargetToken('/* testParseError */', [T_FUNCTION, T_CLOSURE, T_FN]); - $result = self::$phpcsFile->getMethodParameters($target); - - $this->assertSame([], $result); - - }//end testParseError() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetMethodParametersParseError2Test.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetMethodParametersParseError2Test.inc deleted file mode 100644 index 667cb5e..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetMethodParametersParseError2Test.inc +++ /dev/null @@ -1,4 +0,0 @@ - - * @copyright 2019 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Files\File; - -use PHP_CodeSniffer\Tests\Core\AbstractMethodUnitTest; - -/** - * Tests for the \PHP_CodeSniffer\Files\File::getMethodParameters method. - * - * @covers \PHP_CodeSniffer\Files\File::getMethodParameters - */ -final class GetMethodParametersParseError2Test extends AbstractMethodUnitTest -{ - - - /** - * Test receiving an empty array when encountering a specific parse error. - * - * @return void - */ - public function testParseError() - { - $target = $this->getTargetToken('/* testParseError */', [T_FUNCTION, T_CLOSURE, T_FN]); - $result = self::$phpcsFile->getMethodParameters($target); - - $this->assertSame([], $result); - - }//end testParseError() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetMethodParametersTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetMethodParametersTest.inc deleted file mode 100644 index 3a12ade..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetMethodParametersTest.inc +++ /dev/null @@ -1,352 +0,0 @@ - $b; - -/* testArrowFunctionReturnByRef */ -fn&(?string $a) => $b; - -/* testArrayDefaultValues */ -function arrayDefaultValues($var1 = [], $var2 = array(1, 2, 3) ) {} - -/* testConstantDefaultValueSecondParam */ -function constantDefaultValueSecondParam($var1, $var2 = M_PI) {} - -/* testScalarTernaryExpressionInDefault */ -function ternayInDefault( $a = FOO ? 'bar' : 10, ? bool $b ) {} - -/* testVariadicFunction */ -function variadicFunction( int ... $a ) {} - -/* testVariadicByRefFunction */ -function variadicByRefFunction( &...$a ) {} - -/* testVariadicFunctionClassType */ -function variableLengthArgument($unit, DateInterval ...$intervals) {} - -/* testNameSpacedTypeDeclaration */ -function namespacedClassType( \Package\Sub\ClassName $a, ?Sub\AnotherClass $b ) {} - -/* testWithAllTypes */ -class testAllTypes { - function allTypes( - ?ClassName $a, - self $b, - parent $c, - object $d, - ?int $e, - string &$f, - iterable $g, - bool $h = true, - callable $i = 'is_null', - float $j = 1.1, - array ...$k - ) {} -} - -/* testArrowFunctionWithAllTypes */ -$fn = fn( - ?ClassName $a, - self $b, - parent $c, - object $d, - ?int $e, - string &$f, - iterable $g, - bool $h = true, - callable $i = 'is_null', - float $j = 1.1, - array ...$k -) => $something; - -/* testMessyDeclaration */ -function messyDeclaration( - // comment - ?\MyNS /* comment */ - \ SubCat // phpcs:ignore Standard.Cat.Sniff -- for reasons. - \ MyClass $a, - $b /* comment */ = /* comment */ 'default' /* comment*/, - // phpcs:ignore Stnd.Cat.Sniff -- For reasons. - ? /*comment*/ - bool // phpcs:disable Stnd.Cat.Sniff -- For reasons. - & /*test*/ ... /* phpcs:ignore */ $c -) {} - -/* testPHP8MixedTypeHint */ -function mixedTypeHint(mixed &...$var1) {} - -/* testPHP8MixedTypeHintNullable */ -// Intentional fatal error - nullability is not allowed with mixed, but that's not the concern of the method. -function mixedTypeHintNullable(?Mixed $var1) {} - -/* testNamespaceOperatorTypeHint */ -function namespaceOperatorTypeHint(?namespace\Name $var1) {} - -/* testPHP8UnionTypesSimple */ -function unionTypeSimple(int|float $number, self|parent &...$obj) {} - -/* testPHP8UnionTypesWithSpreadOperatorAndReference */ -function globalFunctionWithSpreadAndReference(float|null &$paramA, string|int ...$paramB ) {} - -/* testPHP8UnionTypesSimpleWithBitwiseOrInDefault */ -$fn = fn(int|float $var = CONSTANT_A | CONSTANT_B) => $var; - -/* testPHP8UnionTypesTwoClasses */ -function unionTypesTwoClasses(MyClassA|\Package\MyClassB $var) {} - -/* testPHP8UnionTypesAllBaseTypes */ -function unionTypesAllBaseTypes(array|bool|callable|int|float|null|object|string $var) {} - -/* testPHP8UnionTypesAllPseudoTypes */ -// Intentional fatal error - mixing types which cannot be combined, but that's not the concern of the method. -function unionTypesAllPseudoTypes(false|mixed|self|parent|iterable|Resource $var) {} - -/* testPHP8UnionTypesNullable */ -// Intentional fatal error - nullability is not allowed with union types, but that's not the concern of the method. -$closure = function (?int|float $number) {}; - -/* testPHP8PseudoTypeNull */ -// PHP 8.0 - 8.1: Intentional fatal error - null pseudotype is only allowed in union types, but that's not the concern of the method. -function pseudoTypeNull(null $var = null) {} - -/* testPHP8PseudoTypeFalse */ -// PHP 8.0 - 8.1: Intentional fatal error - false pseudotype is only allowed in union types, but that's not the concern of the method. -function pseudoTypeFalse(false $var = false) {} - -/* testPHP8PseudoTypeFalseAndBool */ -// Intentional fatal error - false pseudotype is not allowed in combination with bool, but that's not the concern of the method. -function pseudoTypeFalseAndBool(bool|false $var = false) {} - -/* testPHP8ObjectAndClass */ -// Intentional fatal error - object is not allowed in combination with class name, but that's not the concern of the method. -function objectAndClass(object|ClassName $var) {} - -/* testPHP8PseudoTypeIterableAndArray */ -// Intentional fatal error - iterable pseudotype is not allowed in combination with array or Traversable, but that's not the concern of the method. -function pseudoTypeIterableAndArray(iterable|array|Traversable $var) {} - -/* testPHP8DuplicateTypeInUnionWhitespaceAndComment */ -// Intentional fatal error - duplicate types are not allowed in union types, but that's not the concern of the method. -function duplicateTypeInUnion( int | string /*comment*/ | INT $var) {} - -class ConstructorPropertyPromotionNoTypes { - /* testPHP8ConstructorPropertyPromotionNoTypes */ - public function __construct( - public $x = 0.0, - protected $y = '', - private $z = null, - ) {} -} - -class ConstructorPropertyPromotionWithTypes { - /* testPHP8ConstructorPropertyPromotionWithTypes */ - public function __construct(protected float|int $x, public ?string &$y = 'test', private mixed $z) {} -} - -class ConstructorPropertyPromotionAndNormalParams { - /* testPHP8ConstructorPropertyPromotionAndNormalParam */ - public function __construct(public int $promotedProp, ?int $normalArg) {} -} - -class ConstructorPropertyPromotionWithReadOnly { - /* testPHP81ConstructorPropertyPromotionWithReadOnly */ - public function __construct(public readonly ?int $promotedProp, ReadOnly private string|bool &$promotedToo) {} -} - -class ConstructorPropertyPromotionWithReadOnlyNoTypeDeclaration { - /* testPHP81ConstructorPropertyPromotionWithReadOnlyNoTypeDeclaration */ - // Intentional fatal error. Readonly properties MUST be typed. - public function __construct(public readonly $promotedProp, ReadOnly private &$promotedToo) {} -} - -class ConstructorPropertyPromotionWithOnlyReadOnly { - /* testPHP81ConstructorPropertyPromotionWithOnlyReadOnly */ - public function __construct(readonly Foo&Bar $promotedProp, readonly ?bool $promotedToo,) {} -} - -class ConstructorPropertyPromotionWithAsymVisibility { - /* testPHP84ConstructorPropertyPromotionWithAsymVisibility */ - public function __construct( - protected(set) string|Book $book, - public private(set) ?Publisher $publisher, - Private(set) PROTECTED Author $author, - readonly public(set) int $pubYear, - protected(set) $illegalMissingType, - ) {} -} - -/* testPHP8ConstructorPropertyPromotionGlobalFunction */ -// Intentional fatal error. Property promotion not allowed in non-constructor, but that's not the concern of this method. -function globalFunction(private $x) {} - -abstract class ConstructorPropertyPromotionAbstractMethod { - /* testPHP8ConstructorPropertyPromotionAbstractMethod */ - // Intentional fatal error. - // 1. Property promotion not allowed in abstract method, but that's not the concern of this method. - // 2. Variadic arguments not allowed in property promotion, but that's not the concern of this method. - // 3. The callable type is not supported for properties, but that's not the concern of this method. - abstract public function __construct(public callable $y, private ...$x); -} - -/* testCommentsInParameter */ -function commentsInParams( - // Leading comment. - ?MyClass /*-*/ & /*-*/.../*-*/ $param /*-*/ = /*-*/ 'default value' . /*-*/ 'second part' // Trailing comment. -) {} - -/* testParameterAttributesInFunctionDeclaration */ -class ParametersWithAttributes( - public function __construct( - #[\MyExample\MyAttribute] private string $constructorPropPromTypedParamSingleAttribute, - #[MyAttr([1, 2])] - Type|false - $typedParamSingleAttribute, - #[MyAttribute(1234), MyAttribute(5678)] ?int $nullableTypedParamMultiAttribute, - #[WithoutArgument] #[SingleArgument(0)] $nonTypedParamTwoAttributes, - #[MyAttribute(array("key" => "value"))] - &...$otherParam, - ) {} -} - -/* testPHP8IntersectionTypes */ -function intersectionTypes(Foo&Bar $obj1, Boo&Bar $obj2) {} - -/* testPHP81IntersectionTypesWithSpreadOperatorAndReference */ -function globalFunctionWithSpreadAndReference(Boo&Bar &$paramA, Foo&Bar ...$paramB) {} - -/* testPHP81MoreIntersectionTypes */ -function moreIntersectionTypes(MyClassA&\Package\MyClassB&\Package\MyClassC $var) {} - -/* testPHP81IllegalIntersectionTypes */ -// Intentional fatal error - simple types are not allowed with intersection types, but that's not the concern of the method. -$closure = function (string&int $numeric_string) {}; - -/* testPHP81NullableIntersectionTypes */ -// Intentional fatal error - nullability is not allowed with intersection types, but that's not the concern of the method. -$closure = function (?Foo&Bar $object) {}; - -/* testPHP82PseudoTypeTrue */ -function pseudoTypeTrue(?true $var = true) {} - -/* testPHP82PseudoTypeFalseAndTrue */ -// Intentional fatal error - Type contains both true and false, bool should be used instead, but that's not the concern of the method. -function pseudoTypeFalseAndTrue(true|false $var = true) {} - -/* testPHP81NewInInitializers */ -function newInInitializers( - TypeA $new = new TypeA(self::CONST_VALUE), - \Package\TypeB $newToo = new \Package\TypeB(10, 'string'), -) {} - -/* testPHP82DNFTypes */ -function dnfTypes( - #[MyAttribute] - false|(Foo&Bar)|true $obj1, - (\Boo&\Pck\Bar)|(Boo&Baz) $obj2 = new Boo() -) {} - -/* testPHP82DNFTypesWithSpreadOperatorAndReference */ -function dnfInGlobalFunctionWithSpreadAndReference((Countable&MeMe)|iterable &$paramA, true|(Foo&Bar) ...$paramB) {} - -/* testPHP82DNFTypesIllegalNullable */ -// Intentional fatal error - nullable operator cannot be combined with DNF. -$dnf_closure = function (? ( MyClassA & /*comment*/ \Package\MyClassB & \Package\MyClassC ) $var): void {}; - -/* testPHP82DNFTypesInArrow */ -$dnf_arrow = fn((Hi&Ho)|FALSE &...$range): string => $a; - -/* testFunctionCallFnPHPCS353-354 */ -$value = $obj->fn(true); - -/* testClosureNoParams */ -function() {}; - -/* testClosure */ -function( $a = 'test' ) {}; - -/* testClosureUseNoParams */ -function() use() {}; - -/* testClosureUse */ -function() use( $foo, $bar ) {}; - -/* testClosureUseWithReference */ -$cl = function() use (&$foo, &$bar) {}; - -/* testFunctionParamListWithTrailingComma */ -function trailingComma( - ?string $foo /*comment*/ , - $bar = 0, -) {} - -/* testClosureParamListWithTrailingComma */ -function( - $foo, - $bar, -) {}; - -/* testArrowFunctionParamListWithTrailingComma */ -$fn = fn( ?int $a , ...$b, ) => $b; - -/* testClosureUseWithTrailingComma */ -function() use( - $foo /*comment*/ , - $bar, -) {}; - -/* testArrowFunctionLiveCoding */ -// Intentional parse error. This has to be the last test in the file. -$fn = fn diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetMethodParametersTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetMethodParametersTest.php deleted file mode 100644 index 11d25eb..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetMethodParametersTest.php +++ /dev/null @@ -1,3347 +0,0 @@ - - * @author Juliette Reinders Folmer - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @copyright 2019 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Files\File; - -use PHP_CodeSniffer\Tests\Core\AbstractMethodUnitTest; - -/** - * Tests for the \PHP_CodeSniffer\Files\File::getMethodParameters method. - * - * @covers \PHP_CodeSniffer\Files\File::getMethodParameters - */ -final class GetMethodParametersTest extends AbstractMethodUnitTest -{ - - - /** - * Test receiving an expected exception when a non function/use token is passed. - * - * @param string $commentString The comment which preceeds the test. - * @param int|string|array $targetTokenType The token type to search for after $commentString. - * - * @dataProvider dataUnexpectedTokenException - * - * @return void - */ - public function testUnexpectedTokenException($commentString, $targetTokenType) - { - $this->expectRunTimeException('$stackPtr must be of type T_FUNCTION or T_CLOSURE or T_USE or T_FN'); - - $target = $this->getTargetToken($commentString, $targetTokenType); - self::$phpcsFile->getMethodParameters($target); - - }//end testUnexpectedTokenException() - - - /** - * Data Provider. - * - * @see testUnexpectedTokenException() For the array format. - * - * @return array>> - */ - public static function dataUnexpectedTokenException() - { - return [ - 'interface' => [ - 'commentString' => '/* testNotAFunction */', - 'targetTokenType' => T_INTERFACE, - ], - 'function-call-fn-phpcs-3.5.3-3.5.4' => [ - 'commentString' => '/* testFunctionCallFnPHPCS353-354 */', - 'targetTokenType' => [ - T_FN, - T_STRING, - ], - ], - 'fn-live-coding' => [ - 'commentString' => '/* testArrowFunctionLiveCoding */', - 'targetTokenType' => [ - T_FN, - T_STRING, - ], - ], - ]; - - }//end dataUnexpectedTokenException() - - - /** - * Test receiving an expected exception when a non-closure use token is passed. - * - * @param string $identifier The comment which preceeds the test. - * - * @dataProvider dataInvalidUse - * - * @return void - */ - public function testInvalidUse($identifier) - { - $this->expectRunTimeException('$stackPtr was not a valid T_USE'); - - $use = $this->getTargetToken($identifier, [T_USE]); - self::$phpcsFile->getMethodParameters($use); - - }//end testInvalidUse() - - - /** - * Data Provider. - * - * @see testInvalidUse() For the array format. - * - * @return array> - */ - public static function dataInvalidUse() - { - return [ - 'ImportUse' => ['/* testImportUse */'], - 'ImportGroupUse' => ['/* testImportGroupUse */'], - 'TraitUse' => ['/* testTraitUse */'], - ]; - - }//end dataInvalidUse() - - - /** - * Test receiving an empty array when there are no parameters. - * - * @param string $commentString The comment which preceeds the test. - * @param int|string|array $targetTokenType Optional. The token type to search for after $commentString. - * Defaults to the function/closure/arrow tokens. - * - * @dataProvider dataNoParams - * - * @return void - */ - public function testNoParams($commentString, $targetTokenType=[T_FUNCTION, T_CLOSURE, T_FN]) - { - $target = $this->getTargetToken($commentString, $targetTokenType); - $result = self::$phpcsFile->getMethodParameters($target); - - $this->assertSame([], $result); - - }//end testNoParams() - - - /** - * Data Provider. - * - * @see testNoParams() For the array format. - * - * @return array>> - */ - public static function dataNoParams() - { - return [ - 'FunctionNoParams' => [ - 'commentString' => '/* testFunctionNoParams */', - ], - 'ClosureNoParams' => [ - 'commentString' => '/* testClosureNoParams */', - ], - 'ClosureUseNoParams' => [ - 'commentString' => '/* testClosureUseNoParams */', - 'targetTokenType' => T_USE, - ], - ]; - - }//end dataNoParams() - - - /** - * Verify pass-by-reference parsing. - * - * @return void - */ - public function testPassByReference() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 5, - 'name' => '$var', - 'content' => '&$var', - 'has_attributes' => false, - 'pass_by_reference' => true, - 'reference_token' => 4, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '', - 'type_hint_token' => false, - 'type_hint_end_token' => false, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPassByReference() - - - /** - * Verify array hint parsing. - * - * @return void - */ - public function testArrayHint() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 6, - 'name' => '$var', - 'content' => 'array $var', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'array', - 'type_hint_token' => 4, - 'type_hint_end_token' => 4, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testArrayHint() - - - /** - * Verify variable. - * - * @return void - */ - public function testVariable() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 4, - 'name' => '$var', - 'content' => '$var', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '', - 'type_hint_token' => false, - 'type_hint_end_token' => false, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testVariable() - - - /** - * Verify default value parsing with a single function param. - * - * @return void - */ - public function testSingleDefaultValue() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 4, - 'name' => '$var1', - 'content' => '$var1=self::CONSTANT', - 'default' => 'self::CONSTANT', - 'default_token' => 6, - 'default_equal_token' => 5, - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '', - 'type_hint_token' => false, - 'type_hint_end_token' => false, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testSingleDefaultValue() - - - /** - * Verify default value parsing. - * - * @return void - */ - public function testDefaultValues() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 4, - 'name' => '$var1', - 'content' => '$var1=1', - 'default' => '1', - 'default_token' => 6, - 'default_equal_token' => 5, - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '', - 'type_hint_token' => false, - 'type_hint_end_token' => false, - 'nullable_type' => false, - 'comma_token' => 7, - ]; - $expected[1] = [ - 'token' => 9, - 'name' => '$var2', - 'content' => "\$var2='value'", - 'default' => "'value'", - 'default_token' => 11, - 'default_equal_token' => 10, - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '', - 'type_hint_token' => false, - 'type_hint_end_token' => false, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testDefaultValues() - - - /** - * Verify type hint parsing. - * - * @return void - */ - public function testTypeHint() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 6, - 'name' => '$var1', - 'content' => 'foo $var1', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'foo', - 'type_hint_token' => 4, - 'type_hint_end_token' => 4, - 'nullable_type' => false, - 'comma_token' => 7, - ]; - - $expected[1] = [ - 'token' => 11, - 'name' => '$var2', - 'content' => 'bar $var2', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'bar', - 'type_hint_token' => 9, - 'type_hint_end_token' => 9, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testTypeHint() - - - /** - * Verify self type hint parsing. - * - * @return void - */ - public function testSelfTypeHint() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 6, - 'name' => '$var', - 'content' => 'self $var', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'self', - 'type_hint_token' => 4, - 'type_hint_end_token' => 4, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testSelfTypeHint() - - - /** - * Verify nullable type hint parsing. - * - * @return void - */ - public function testNullableTypeHint() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 7, - 'name' => '$var1', - 'content' => '?int $var1', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '?int', - 'type_hint_token' => 5, - 'type_hint_end_token' => 5, - 'nullable_type' => true, - 'comma_token' => 8, - ]; - - $expected[1] = [ - 'token' => 14, - 'name' => '$var2', - 'content' => '?\bar $var2', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '?\bar', - 'type_hint_token' => 11, - 'type_hint_end_token' => 12, - 'nullable_type' => true, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testNullableTypeHint() - - - /** - * Verify "bitwise and" in default value !== pass-by-reference. - * - * @return void - */ - public function testBitwiseAndConstantExpressionDefaultValue() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 4, - 'name' => '$a', - 'content' => '$a = 10 & 20', - 'default' => '10 & 20', - 'default_token' => 8, - 'default_equal_token' => 6, - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '', - 'type_hint_token' => false, - 'type_hint_end_token' => false, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testBitwiseAndConstantExpressionDefaultValue() - - - /** - * Verify that arrow functions are supported. - * - * @return void - */ - public function testArrowFunction() - { - // Offsets are relative to the T_FN token. - $expected = []; - $expected[0] = [ - 'token' => 4, - 'name' => '$a', - 'content' => 'int $a', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'int', - 'type_hint_token' => 2, - 'type_hint_end_token' => 2, - 'nullable_type' => false, - 'comma_token' => 5, - ]; - - $expected[1] = [ - 'token' => 8, - 'name' => '$b', - 'content' => '...$b', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => true, - 'variadic_token' => 7, - 'type_hint' => '', - 'type_hint_token' => false, - 'type_hint_end_token' => false, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testArrowFunction() - - - /** - * Verify that arrow functions are supported. - * - * @return void - */ - public function testArrowFunctionReturnByRef() - { - // Offsets are relative to the T_FN token. - $expected = []; - $expected[0] = [ - 'token' => 6, - 'name' => '$a', - 'content' => '?string $a', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '?string', - 'type_hint_token' => 4, - 'type_hint_end_token' => 4, - 'nullable_type' => true, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testArrowFunctionReturnByRef() - - - /** - * Verify default value parsing with array values. - * - * @return void - */ - public function testArrayDefaultValues() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 4, - 'name' => '$var1', - 'content' => '$var1 = []', - 'default' => '[]', - 'default_token' => 8, - 'default_equal_token' => 6, - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '', - 'type_hint_token' => false, - 'type_hint_end_token' => false, - 'nullable_type' => false, - 'comma_token' => 10, - ]; - $expected[1] = [ - 'token' => 12, - 'name' => '$var2', - 'content' => '$var2 = array(1, 2, 3)', - 'default' => 'array(1, 2, 3)', - 'default_token' => 16, - 'default_equal_token' => 14, - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '', - 'type_hint_token' => false, - 'type_hint_end_token' => false, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testArrayDefaultValues() - - - /** - * Verify having a T_STRING constant as a default value for the second parameter. - * - * @return void - */ - public function testConstantDefaultValueSecondParam() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 4, - 'name' => '$var1', - 'content' => '$var1', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '', - 'type_hint_token' => false, - 'type_hint_end_token' => false, - 'nullable_type' => false, - 'comma_token' => 5, - ]; - $expected[1] = [ - 'token' => 7, - 'name' => '$var2', - 'content' => '$var2 = M_PI', - 'default' => 'M_PI', - 'default_token' => 11, - 'default_equal_token' => 9, - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '', - 'type_hint_token' => false, - 'type_hint_end_token' => false, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testConstantDefaultValueSecondParam() - - - /** - * Verify distinquishing between a nullable type and a ternary within a default expression. - * - * @return void - */ - public function testScalarTernaryExpressionInDefault() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 5, - 'name' => '$a', - 'content' => '$a = FOO ? \'bar\' : 10', - 'default' => 'FOO ? \'bar\' : 10', - 'default_token' => 9, - 'default_equal_token' => 7, - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '', - 'type_hint_token' => false, - 'type_hint_end_token' => false, - 'nullable_type' => false, - 'comma_token' => 18, - ]; - $expected[1] = [ - 'token' => 24, - 'name' => '$b', - 'content' => '? bool $b', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '?bool', - 'type_hint_token' => 22, - 'type_hint_end_token' => 22, - 'nullable_type' => true, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testScalarTernaryExpressionInDefault() - - - /** - * Verify a variadic parameter being recognized correctly. - * - * @return void - */ - public function testVariadicFunction() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 9, - 'name' => '$a', - 'content' => 'int ... $a', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => true, - 'variadic_token' => 7, - 'type_hint' => 'int', - 'type_hint_token' => 5, - 'type_hint_end_token' => 5, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testVariadicFunction() - - - /** - * Verify a variadic parameter passed by reference being recognized correctly. - * - * @return void - */ - public function testVariadicByRefFunction() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 7, - 'name' => '$a', - 'content' => '&...$a', - 'has_attributes' => false, - 'pass_by_reference' => true, - 'reference_token' => 5, - 'variable_length' => true, - 'variadic_token' => 6, - 'type_hint' => '', - 'type_hint_token' => false, - 'type_hint_end_token' => false, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testVariadicByRefFunction() - - - /** - * Verify handling of a variadic parameter with a class based type declaration. - * - * @return void - */ - public function testVariadicFunctionClassType() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 4, - 'name' => '$unit', - 'content' => '$unit', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '', - 'type_hint_token' => false, - 'type_hint_end_token' => false, - 'nullable_type' => false, - 'comma_token' => 5, - ]; - $expected[1] = [ - 'token' => 10, - 'name' => '$intervals', - 'content' => 'DateInterval ...$intervals', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => true, - 'variadic_token' => 9, - 'type_hint' => 'DateInterval', - 'type_hint_token' => 7, - 'type_hint_end_token' => 7, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testVariadicFunctionClassType() - - - /** - * Verify distinquishing between a nullable type and a ternary within a default expression. - * - * @return void - */ - public function testNameSpacedTypeDeclaration() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 12, - 'name' => '$a', - 'content' => '\Package\Sub\ClassName $a', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '\Package\Sub\ClassName', - 'type_hint_token' => 5, - 'type_hint_end_token' => 10, - 'nullable_type' => false, - 'comma_token' => 13, - ]; - $expected[1] = [ - 'token' => 20, - 'name' => '$b', - 'content' => '?Sub\AnotherClass $b', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '?Sub\AnotherClass', - 'type_hint_token' => 16, - 'type_hint_end_token' => 18, - 'nullable_type' => true, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testNameSpacedTypeDeclaration() - - - /** - * Verify correctly recognizing all type declarations supported by PHP. - * - * @return void - */ - public function testWithAllTypes() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 9, - 'name' => '$a', - 'content' => '?ClassName $a', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '?ClassName', - 'type_hint_token' => 7, - 'type_hint_end_token' => 7, - 'nullable_type' => true, - 'comma_token' => 10, - ]; - $expected[1] = [ - 'token' => 15, - 'name' => '$b', - 'content' => 'self $b', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'self', - 'type_hint_token' => 13, - 'type_hint_end_token' => 13, - 'nullable_type' => false, - 'comma_token' => 16, - ]; - $expected[2] = [ - 'token' => 21, - 'name' => '$c', - 'content' => 'parent $c', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'parent', - 'type_hint_token' => 19, - 'type_hint_end_token' => 19, - 'nullable_type' => false, - 'comma_token' => 22, - ]; - $expected[3] = [ - 'token' => 27, - 'name' => '$d', - 'content' => 'object $d', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'object', - 'type_hint_token' => 25, - 'type_hint_end_token' => 25, - 'nullable_type' => false, - 'comma_token' => 28, - ]; - $expected[4] = [ - 'token' => 34, - 'name' => '$e', - 'content' => '?int $e', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '?int', - 'type_hint_token' => 32, - 'type_hint_end_token' => 32, - 'nullable_type' => true, - 'comma_token' => 35, - ]; - $expected[5] = [ - 'token' => 41, - 'name' => '$f', - 'content' => 'string &$f', - 'has_attributes' => false, - 'pass_by_reference' => true, - 'reference_token' => 40, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'string', - 'type_hint_token' => 38, - 'type_hint_end_token' => 38, - 'nullable_type' => false, - 'comma_token' => 42, - ]; - $expected[6] = [ - 'token' => 47, - 'name' => '$g', - 'content' => 'iterable $g', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'iterable', - 'type_hint_token' => 45, - 'type_hint_end_token' => 45, - 'nullable_type' => false, - 'comma_token' => 48, - ]; - $expected[7] = [ - 'token' => 53, - 'name' => '$h', - 'content' => 'bool $h = true', - 'default' => 'true', - 'default_token' => 57, - 'default_equal_token' => 55, - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'bool', - 'type_hint_token' => 51, - 'type_hint_end_token' => 51, - 'nullable_type' => false, - 'comma_token' => 58, - ]; - $expected[8] = [ - 'token' => 63, - 'name' => '$i', - 'content' => 'callable $i = \'is_null\'', - 'default' => "'is_null'", - 'default_token' => 67, - 'default_equal_token' => 65, - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'callable', - 'type_hint_token' => 61, - 'type_hint_end_token' => 61, - 'nullable_type' => false, - 'comma_token' => 68, - ]; - $expected[9] = [ - 'token' => 73, - 'name' => '$j', - 'content' => 'float $j = 1.1', - 'default' => '1.1', - 'default_token' => 77, - 'default_equal_token' => 75, - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'float', - 'type_hint_token' => 71, - 'type_hint_end_token' => 71, - 'nullable_type' => false, - 'comma_token' => 78, - ]; - $expected[10] = [ - 'token' => 84, - 'name' => '$k', - 'content' => 'array ...$k', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => true, - 'variadic_token' => 83, - 'type_hint' => 'array', - 'type_hint_token' => 81, - 'type_hint_end_token' => 81, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testWithAllTypes() - - - /** - * Verify correctly recognizing all type declarations supported by PHP when used with an arrow function. - * - * @return void - */ - public function testArrowFunctionWithAllTypes() - { - // Offsets are relative to the T_FN token. - $expected = []; - $expected[0] = [ - 'token' => 7, - 'name' => '$a', - 'content' => '?ClassName $a', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '?ClassName', - 'type_hint_token' => 5, - 'type_hint_end_token' => 5, - 'nullable_type' => true, - 'comma_token' => 8, - ]; - $expected[1] = [ - 'token' => 13, - 'name' => '$b', - 'content' => 'self $b', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'self', - 'type_hint_token' => 11, - 'type_hint_end_token' => 11, - 'nullable_type' => false, - 'comma_token' => 14, - ]; - $expected[2] = [ - 'token' => 19, - 'name' => '$c', - 'content' => 'parent $c', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'parent', - 'type_hint_token' => 17, - 'type_hint_end_token' => 17, - 'nullable_type' => false, - 'comma_token' => 20, - ]; - $expected[3] = [ - 'token' => 25, - 'name' => '$d', - 'content' => 'object $d', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'object', - 'type_hint_token' => 23, - 'type_hint_end_token' => 23, - 'nullable_type' => false, - 'comma_token' => 26, - ]; - $expected[4] = [ - 'token' => 32, - 'name' => '$e', - 'content' => '?int $e', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '?int', - 'type_hint_token' => 30, - 'type_hint_end_token' => 30, - 'nullable_type' => true, - 'comma_token' => 33, - ]; - $expected[5] = [ - 'token' => 39, - 'name' => '$f', - 'content' => 'string &$f', - 'has_attributes' => false, - 'pass_by_reference' => true, - 'reference_token' => 38, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'string', - 'type_hint_token' => 36, - 'type_hint_end_token' => 36, - 'nullable_type' => false, - 'comma_token' => 40, - ]; - $expected[6] = [ - 'token' => 45, - 'name' => '$g', - 'content' => 'iterable $g', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'iterable', - 'type_hint_token' => 43, - 'type_hint_end_token' => 43, - 'nullable_type' => false, - 'comma_token' => 46, - ]; - $expected[7] = [ - 'token' => 51, - 'name' => '$h', - 'content' => 'bool $h = true', - 'default' => 'true', - 'default_token' => 55, - 'default_equal_token' => 53, - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'bool', - 'type_hint_token' => 49, - 'type_hint_end_token' => 49, - 'nullable_type' => false, - 'comma_token' => 56, - ]; - $expected[8] = [ - 'token' => 61, - 'name' => '$i', - 'content' => 'callable $i = \'is_null\'', - 'default' => "'is_null'", - 'default_token' => 65, - 'default_equal_token' => 63, - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'callable', - 'type_hint_token' => 59, - 'type_hint_end_token' => 59, - 'nullable_type' => false, - 'comma_token' => 66, - ]; - $expected[9] = [ - 'token' => 71, - 'name' => '$j', - 'content' => 'float $j = 1.1', - 'default' => '1.1', - 'default_token' => 75, - 'default_equal_token' => 73, - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'float', - 'type_hint_token' => 69, - 'type_hint_end_token' => 69, - 'nullable_type' => false, - 'comma_token' => 76, - ]; - $expected[10] = [ - 'token' => 82, - 'name' => '$k', - 'content' => 'array ...$k', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => true, - 'variadic_token' => 81, - 'type_hint' => 'array', - 'type_hint_token' => 79, - 'type_hint_end_token' => 79, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testArrowFunctionWithAllTypes() - - - /** - * Verify handling of a declaration interlaced with whitespace and comments. - * - * @return void - */ - public function testMessyDeclaration() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 25, - 'name' => '$a', - 'content' => '// comment - ?\MyNS /* comment */ - \ SubCat // phpcs:ignore Standard.Cat.Sniff -- for reasons. - \ MyClass $a', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '?\MyNS\SubCat\MyClass', - 'type_hint_token' => 9, - 'type_hint_end_token' => 23, - 'nullable_type' => true, - 'comma_token' => 26, - ]; - $expected[1] = [ - 'token' => 29, - 'name' => '$b', - 'content' => "\$b /* comment */ = /* comment */ 'default' /* comment*/", - 'default' => "'default' /* comment*/", - 'default_token' => 37, - 'default_equal_token' => 33, - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '', - 'type_hint_token' => false, - 'type_hint_end_token' => false, - 'nullable_type' => false, - 'comma_token' => 40, - ]; - $expected[2] = [ - 'token' => 62, - 'name' => '$c', - 'content' => '// phpcs:ignore Stnd.Cat.Sniff -- For reasons. - ? /*comment*/ - bool // phpcs:disable Stnd.Cat.Sniff -- For reasons. - & /*test*/ ... /* phpcs:ignore */ $c', - 'has_attributes' => false, - 'pass_by_reference' => true, - 'reference_token' => 54, - 'variable_length' => true, - 'variadic_token' => 58, - 'type_hint' => '?bool', - 'type_hint_token' => 50, - 'type_hint_end_token' => 50, - 'nullable_type' => true, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testMessyDeclaration() - - - /** - * Verify recognition of PHP8 mixed type declaration. - * - * @return void - */ - public function testPHP8MixedTypeHint() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 8, - 'name' => '$var1', - 'content' => 'mixed &...$var1', - 'has_attributes' => false, - 'pass_by_reference' => true, - 'reference_token' => 6, - 'variable_length' => true, - 'variadic_token' => 7, - 'type_hint' => 'mixed', - 'type_hint_token' => 4, - 'type_hint_end_token' => 4, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP8MixedTypeHint() - - - /** - * Verify recognition of PHP8 mixed type declaration with nullability. - * - * @return void - */ - public function testPHP8MixedTypeHintNullable() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 7, - 'name' => '$var1', - 'content' => '?Mixed $var1', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '?Mixed', - 'type_hint_token' => 5, - 'type_hint_end_token' => 5, - 'nullable_type' => true, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP8MixedTypeHintNullable() - - - /** - * Verify recognition of type declarations using the namespace operator. - * - * @return void - */ - public function testNamespaceOperatorTypeHint() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 9, - 'name' => '$var1', - 'content' => '?namespace\Name $var1', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '?namespace\Name', - 'type_hint_token' => 5, - 'type_hint_end_token' => 7, - 'nullable_type' => true, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testNamespaceOperatorTypeHint() - - - /** - * Verify recognition of PHP8 union type declaration. - * - * @return void - */ - public function testPHP8UnionTypesSimple() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 8, - 'name' => '$number', - 'content' => 'int|float $number', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'int|float', - 'type_hint_token' => 4, - 'type_hint_end_token' => 6, - 'nullable_type' => false, - 'comma_token' => 9, - ]; - $expected[1] = [ - 'token' => 17, - 'name' => '$obj', - 'content' => 'self|parent &...$obj', - 'has_attributes' => false, - 'pass_by_reference' => true, - 'reference_token' => 15, - 'variable_length' => true, - 'variadic_token' => 16, - 'type_hint' => 'self|parent', - 'type_hint_token' => 11, - 'type_hint_end_token' => 13, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP8UnionTypesSimple() - - - /** - * Verify recognition of PHP8 union type declaration when the variable has either a spread operator or a reference. - * - * @return void - */ - public function testPHP8UnionTypesWithSpreadOperatorAndReference() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 9, - 'name' => '$paramA', - 'content' => 'float|null &$paramA', - 'has_attributes' => false, - 'pass_by_reference' => true, - 'reference_token' => 8, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'float|null', - 'type_hint_token' => 4, - 'type_hint_end_token' => 6, - 'nullable_type' => false, - 'comma_token' => 10, - ]; - $expected[1] = [ - 'token' => 17, - 'name' => '$paramB', - 'content' => 'string|int ...$paramB', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => true, - 'variadic_token' => 16, - 'type_hint' => 'string|int', - 'type_hint_token' => 12, - 'type_hint_end_token' => 14, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP8UnionTypesWithSpreadOperatorAndReference() - - - /** - * Verify recognition of PHP8 union type declaration with a bitwise or in the default value. - * - * @return void - */ - public function testPHP8UnionTypesSimpleWithBitwiseOrInDefault() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 6, - 'name' => '$var', - 'content' => 'int|float $var = CONSTANT_A | CONSTANT_B', - 'default' => 'CONSTANT_A | CONSTANT_B', - 'default_token' => 10, - 'default_equal_token' => 8, - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'int|float', - 'type_hint_token' => 2, - 'type_hint_end_token' => 4, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP8UnionTypesSimpleWithBitwiseOrInDefault() - - - /** - * Verify recognition of PHP8 union type declaration with two classes. - * - * @return void - */ - public function testPHP8UnionTypesTwoClasses() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 11, - 'name' => '$var', - 'content' => 'MyClassA|\Package\MyClassB $var', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'MyClassA|\Package\MyClassB', - 'type_hint_token' => 4, - 'type_hint_end_token' => 9, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP8UnionTypesTwoClasses() - - - /** - * Verify recognition of PHP8 union type declaration with all base types. - * - * @return void - */ - public function testPHP8UnionTypesAllBaseTypes() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 20, - 'name' => '$var', - 'content' => 'array|bool|callable|int|float|null|object|string $var', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'array|bool|callable|int|float|null|object|string', - 'type_hint_token' => 4, - 'type_hint_end_token' => 18, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP8UnionTypesAllBaseTypes() - - - /** - * Verify recognition of PHP8 union type declaration with all pseudo types. - * - * Note: "Resource" is not a type, but seen as a class name. - * - * @return void - */ - public function testPHP8UnionTypesAllPseudoTypes() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 16, - 'name' => '$var', - 'content' => 'false|mixed|self|parent|iterable|Resource $var', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'false|mixed|self|parent|iterable|Resource', - 'type_hint_token' => 4, - 'type_hint_end_token' => 14, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP8UnionTypesAllPseudoTypes() - - - /** - * Verify recognition of PHP8 union type declaration with (illegal) nullability. - * - * @return void - */ - public function testPHP8UnionTypesNullable() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 8, - 'name' => '$number', - 'content' => '?int|float $number', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '?int|float', - 'type_hint_token' => 4, - 'type_hint_end_token' => 6, - 'nullable_type' => true, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP8UnionTypesNullable() - - - /** - * Verify recognition of PHP8 type declaration with (illegal) single type null. - * - * @return void - */ - public function testPHP8PseudoTypeNull() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 6, - 'name' => '$var', - 'content' => 'null $var = null', - 'default' => 'null', - 'default_token' => 10, - 'default_equal_token' => 8, - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'null', - 'type_hint_token' => 4, - 'type_hint_end_token' => 4, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP8PseudoTypeNull() - - - /** - * Verify recognition of PHP8 type declaration with (illegal) single type false. - * - * @return void - */ - public function testPHP8PseudoTypeFalse() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 6, - 'name' => '$var', - 'content' => 'false $var = false', - 'default' => 'false', - 'default_token' => 10, - 'default_equal_token' => 8, - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'false', - 'type_hint_token' => 4, - 'type_hint_end_token' => 4, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP8PseudoTypeFalse() - - - /** - * Verify recognition of PHP8 type declaration with (illegal) type false combined with type bool. - * - * @return void - */ - public function testPHP8PseudoTypeFalseAndBool() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 8, - 'name' => '$var', - 'content' => 'bool|false $var = false', - 'default' => 'false', - 'default_token' => 12, - 'default_equal_token' => 10, - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'bool|false', - 'type_hint_token' => 4, - 'type_hint_end_token' => 6, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP8PseudoTypeFalseAndBool() - - - /** - * Verify recognition of PHP8 type declaration with (illegal) type object combined with a class name. - * - * @return void - */ - public function testPHP8ObjectAndClass() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 8, - 'name' => '$var', - 'content' => 'object|ClassName $var', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'object|ClassName', - 'type_hint_token' => 4, - 'type_hint_end_token' => 6, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP8ObjectAndClass() - - - /** - * Verify recognition of PHP8 type declaration with (illegal) type iterable combined with array/Traversable. - * - * @return void - */ - public function testPHP8PseudoTypeIterableAndArray() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 10, - 'name' => '$var', - 'content' => 'iterable|array|Traversable $var', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'iterable|array|Traversable', - 'type_hint_token' => 4, - 'type_hint_end_token' => 8, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP8PseudoTypeIterableAndArray() - - - /** - * Verify recognition of PHP8 type declaration with (illegal) duplicate types. - * - * @return void - */ - public function testPHP8DuplicateTypeInUnionWhitespaceAndComment() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 17, - 'name' => '$var', - 'content' => 'int | string /*comment*/ | INT $var', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'int|string|INT', - 'type_hint_token' => 5, - 'type_hint_end_token' => 15, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP8DuplicateTypeInUnionWhitespaceAndComment() - - - /** - * Verify recognition of PHP8 constructor property promotion without type declaration, with defaults. - * - * @return void - */ - public function testPHP8ConstructorPropertyPromotionNoTypes() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 8, - 'name' => '$x', - 'content' => 'public $x = 0.0', - 'default' => '0.0', - 'default_token' => 12, - 'default_equal_token' => 10, - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '', - 'type_hint_token' => false, - 'type_hint_end_token' => false, - 'nullable_type' => false, - 'property_visibility' => 'public', - 'visibility_token' => 6, - 'property_readonly' => false, - 'comma_token' => 13, - ]; - $expected[1] = [ - 'token' => 18, - 'name' => '$y', - 'content' => 'protected $y = \'\'', - 'default' => "''", - 'default_token' => 22, - 'default_equal_token' => 20, - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '', - 'type_hint_token' => false, - 'type_hint_end_token' => false, - 'nullable_type' => false, - 'property_visibility' => 'protected', - 'visibility_token' => 16, - 'property_readonly' => false, - 'comma_token' => 23, - ]; - $expected[2] = [ - 'token' => 28, - 'name' => '$z', - 'content' => 'private $z = null', - 'default' => 'null', - 'default_token' => 32, - 'default_equal_token' => 30, - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '', - 'type_hint_token' => false, - 'type_hint_end_token' => false, - 'nullable_type' => false, - 'property_visibility' => 'private', - 'visibility_token' => 26, - 'property_readonly' => false, - 'comma_token' => 33, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP8ConstructorPropertyPromotionNoTypes() - - - /** - * Verify recognition of PHP8 constructor property promotion with type declarations. - * - * @return void - */ - public function testPHP8ConstructorPropertyPromotionWithTypes() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 10, - 'name' => '$x', - 'content' => 'protected float|int $x', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'float|int', - 'type_hint_token' => 6, - 'type_hint_end_token' => 8, - 'nullable_type' => false, - 'property_visibility' => 'protected', - 'visibility_token' => 4, - 'property_readonly' => false, - 'comma_token' => 11, - ]; - $expected[1] = [ - 'token' => 19, - 'name' => '$y', - 'content' => 'public ?string &$y = \'test\'', - 'default' => "'test'", - 'default_token' => 23, - 'default_equal_token' => 21, - 'has_attributes' => false, - 'pass_by_reference' => true, - 'reference_token' => 18, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '?string', - 'type_hint_token' => 16, - 'type_hint_end_token' => 16, - 'nullable_type' => true, - 'property_visibility' => 'public', - 'visibility_token' => 13, - 'property_readonly' => false, - 'comma_token' => 24, - ]; - $expected[2] = [ - 'token' => 30, - 'name' => '$z', - 'content' => 'private mixed $z', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'mixed', - 'type_hint_token' => 28, - 'type_hint_end_token' => 28, - 'nullable_type' => false, - 'property_visibility' => 'private', - 'visibility_token' => 26, - 'property_readonly' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP8ConstructorPropertyPromotionWithTypes() - - - /** - * Verify recognition of PHP8 constructor with both property promotion as well as normal parameters. - * - * @return void - */ - public function testPHP8ConstructorPropertyPromotionAndNormalParam() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 8, - 'name' => '$promotedProp', - 'content' => 'public int $promotedProp', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'int', - 'type_hint_token' => 6, - 'type_hint_end_token' => 6, - 'nullable_type' => false, - 'property_visibility' => 'public', - 'visibility_token' => 4, - 'property_readonly' => false, - 'comma_token' => 9, - ]; - $expected[1] = [ - 'token' => 14, - 'name' => '$normalArg', - 'content' => '?int $normalArg', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '?int', - 'type_hint_token' => 12, - 'type_hint_end_token' => 12, - 'nullable_type' => true, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP8ConstructorPropertyPromotionAndNormalParam() - - - /** - * Verify recognition of PHP8 constructor with property promotion using PHP 8.1 readonly keyword. - * - * @return void - */ - public function testPHP81ConstructorPropertyPromotionWithReadOnly() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 11, - 'name' => '$promotedProp', - 'content' => 'public readonly ?int $promotedProp', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '?int', - 'type_hint_token' => 9, - 'type_hint_end_token' => 9, - 'nullable_type' => true, - 'property_visibility' => 'public', - 'visibility_token' => 4, - 'property_readonly' => true, - 'readonly_token' => 6, - 'comma_token' => 12, - ]; - $expected[1] = [ - 'token' => 23, - 'name' => '$promotedToo', - 'content' => 'ReadOnly private string|bool &$promotedToo', - 'has_attributes' => false, - 'pass_by_reference' => true, - 'reference_token' => 22, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'string|bool', - 'type_hint_token' => 18, - 'type_hint_end_token' => 20, - 'nullable_type' => false, - 'property_visibility' => 'private', - 'visibility_token' => 16, - 'property_readonly' => true, - 'readonly_token' => 14, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP81ConstructorPropertyPromotionWithReadOnly() - - - /** - * Verify recognition of PHP8 constructor with property promotion using PHP 8.1 readonly keyword - * without a property type. - * - * @return void - */ - public function testPHP81ConstructorPropertyPromotionWithReadOnlyNoTypeDeclaration() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 8, - 'name' => '$promotedProp', - 'content' => 'public readonly $promotedProp', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '', - 'type_hint_token' => false, - 'type_hint_end_token' => false, - 'nullable_type' => false, - 'property_visibility' => 'public', - 'visibility_token' => 4, - 'property_readonly' => true, - 'readonly_token' => 6, - 'comma_token' => 9, - ]; - $expected[1] = [ - 'token' => 16, - 'name' => '$promotedToo', - 'content' => 'ReadOnly private &$promotedToo', - 'has_attributes' => false, - 'pass_by_reference' => true, - 'reference_token' => 15, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '', - 'type_hint_token' => false, - 'type_hint_end_token' => false, - 'nullable_type' => false, - 'property_visibility' => 'private', - 'visibility_token' => 13, - 'property_readonly' => true, - 'readonly_token' => 11, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP81ConstructorPropertyPromotionWithReadOnlyNoTypeDeclaration() - - - /** - * Verify recognition of PHP8 constructor with property promotion using PHP 8.1 readonly - * keyword without explicit visibility. - * - * @return void - */ - public function testPHP81ConstructorPropertyPromotionWithOnlyReadOnly() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 10, - 'name' => '$promotedProp', - 'content' => 'readonly Foo&Bar $promotedProp', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'Foo&Bar', - 'type_hint_token' => 6, - 'type_hint_end_token' => 8, - 'nullable_type' => false, - 'property_visibility' => 'public', - 'visibility_token' => false, - 'property_readonly' => true, - 'readonly_token' => 4, - 'comma_token' => 11, - ]; - $expected[1] = [ - 'token' => 18, - 'name' => '$promotedToo', - 'content' => 'readonly ?bool $promotedToo', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '?bool', - 'type_hint_token' => 16, - 'type_hint_end_token' => 16, - 'nullable_type' => true, - 'property_visibility' => 'public', - 'visibility_token' => false, - 'property_readonly' => true, - 'readonly_token' => 13, - 'comma_token' => 19, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP81ConstructorPropertyPromotionWithOnlyReadOnly() - - - /** - * Verify recognition of PHP8 constructor with property promotion using PHP 8.4 asymmetric visibility. - * - * @return void - */ - public function testPHP84ConstructorPropertyPromotionWithAsymVisibility() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 12, - 'name' => '$book', - 'content' => 'protected(set) string|Book $book', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'string|Book', - 'type_hint_token' => 8, - 'type_hint_end_token' => 10, - 'nullable_type' => false, - 'property_visibility' => 'public', - 'visibility_token' => false, - 'set_visibility' => 'protected(set)', - 'set_visibility_token' => 6, - 'property_readonly' => false, - 'comma_token' => 13, - ]; - $expected[1] = [ - 'token' => 23, - 'name' => '$publisher', - 'content' => 'public private(set) ?Publisher $publisher', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '?Publisher', - 'type_hint_token' => 21, - 'type_hint_end_token' => 21, - 'nullable_type' => true, - 'property_visibility' => 'public', - 'visibility_token' => 16, - 'set_visibility' => 'private(set)', - 'set_visibility_token' => 18, - 'property_readonly' => false, - 'comma_token' => 24, - ]; - $expected[2] = [ - 'token' => 33, - 'name' => '$author', - 'content' => 'Private(set) PROTECTED Author $author', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'Author', - 'type_hint_token' => 31, - 'type_hint_end_token' => 31, - 'nullable_type' => false, - 'property_visibility' => 'PROTECTED', - 'visibility_token' => 29, - 'set_visibility' => 'Private(set)', - 'set_visibility_token' => 27, - 'property_readonly' => false, - 'comma_token' => 34, - ]; - $expected[3] = [ - 'token' => 43, - 'name' => '$pubYear', - 'content' => 'readonly public(set) int $pubYear', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'int', - 'type_hint_token' => 41, - 'type_hint_end_token' => 41, - 'nullable_type' => false, - 'property_visibility' => 'public', - 'visibility_token' => false, - 'set_visibility' => 'public(set)', - 'set_visibility_token' => 39, - 'property_readonly' => true, - 'readonly_token' => 37, - 'comma_token' => 44, - ]; - $expected[4] = [ - 'token' => 49, - 'name' => '$illegalMissingType', - 'content' => 'protected(set) $illegalMissingType', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '', - 'type_hint_token' => false, - 'type_hint_end_token' => false, - 'nullable_type' => false, - 'property_visibility' => 'public', - 'visibility_token' => false, - 'set_visibility' => 'protected(set)', - 'set_visibility_token' => 47, - 'property_readonly' => false, - 'comma_token' => 50, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP84ConstructorPropertyPromotionWithAsymVisibility() - - - /** - * Verify behaviour when a non-constructor function uses PHP 8 property promotion syntax. - * - * @return void - */ - public function testPHP8ConstructorPropertyPromotionGlobalFunction() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 6, - 'name' => '$x', - 'content' => 'private $x', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '', - 'type_hint_token' => false, - 'type_hint_end_token' => false, - 'nullable_type' => false, - 'property_visibility' => 'private', - 'visibility_token' => 4, - 'property_readonly' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP8ConstructorPropertyPromotionGlobalFunction() - - - /** - * Verify behaviour when an abstract constructor uses PHP 8 property promotion syntax. - * - * @return void - */ - public function testPHP8ConstructorPropertyPromotionAbstractMethod() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 8, - 'name' => '$y', - 'content' => 'public callable $y', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'callable', - 'type_hint_token' => 6, - 'type_hint_end_token' => 6, - 'nullable_type' => false, - 'property_visibility' => 'public', - 'visibility_token' => 4, - 'property_readonly' => false, - 'comma_token' => 9, - ]; - $expected[1] = [ - 'token' => 14, - 'name' => '$x', - 'content' => 'private ...$x', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => true, - 'variadic_token' => 13, - 'type_hint' => '', - 'type_hint_token' => false, - 'type_hint_end_token' => false, - 'nullable_type' => false, - 'property_visibility' => 'private', - 'visibility_token' => 11, - 'property_readonly' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP8ConstructorPropertyPromotionAbstractMethod() - - - /** - * Verify and document behaviour when there are comments within a parameter declaration. - * - * @return void - */ - public function testCommentsInParameter() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 19, - 'name' => '$param', - 'content' => '// Leading comment. - ?MyClass /*-*/ & /*-*/.../*-*/ $param /*-*/ = /*-*/ \'default value\' . /*-*/ \'second part\' // Trailing comment.', - 'default' => '\'default value\' . /*-*/ \'second part\' // Trailing comment.', - 'default_token' => 27, - 'default_equal_token' => 23, - 'has_attributes' => false, - 'pass_by_reference' => true, - 'reference_token' => 13, - 'variable_length' => true, - 'variadic_token' => 16, - 'type_hint' => '?MyClass', - 'type_hint_token' => 9, - 'type_hint_end_token' => 9, - 'nullable_type' => true, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testCommentsInParameter() - - - /** - * Verify behaviour when parameters have attributes attached. - * - * @return void - */ - public function testParameterAttributesInFunctionDeclaration() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 17, - 'name' => '$constructorPropPromTypedParamSingleAttribute', - 'content' => '#[\MyExample\MyAttribute] private string $constructorPropPromTypedParamSingleAttribute', - 'has_attributes' => true, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'string', - 'type_hint_token' => 15, - 'type_hint_end_token' => 15, - 'nullable_type' => false, - 'property_visibility' => 'private', - 'visibility_token' => 13, - 'property_readonly' => false, - 'comma_token' => 18, - ]; - $expected[1] = [ - 'token' => 39, - 'name' => '$typedParamSingleAttribute', - 'content' => '#[MyAttr([1, 2])] - Type|false - $typedParamSingleAttribute', - 'has_attributes' => true, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'Type|false', - 'type_hint_token' => 34, - 'type_hint_end_token' => 36, - 'nullable_type' => false, - 'comma_token' => 40, - ]; - $expected[2] = [ - 'token' => 59, - 'name' => '$nullableTypedParamMultiAttribute', - 'content' => '#[MyAttribute(1234), MyAttribute(5678)] ?int $nullableTypedParamMultiAttribute', - 'has_attributes' => true, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '?int', - 'type_hint_token' => 57, - 'type_hint_end_token' => 57, - 'nullable_type' => true, - 'comma_token' => 60, - ]; - $expected[3] = [ - 'token' => 74, - 'name' => '$nonTypedParamTwoAttributes', - 'content' => '#[WithoutArgument] #[SingleArgument(0)] $nonTypedParamTwoAttributes', - 'has_attributes' => true, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '', - 'type_hint_token' => false, - 'type_hint_end_token' => false, - 'nullable_type' => false, - 'comma_token' => 75, - ]; - $expected[4] = [ - 'token' => 95, - 'name' => '$otherParam', - 'content' => '#[MyAttribute(array("key" => "value"))] - &...$otherParam', - 'has_attributes' => true, - 'pass_by_reference' => true, - 'reference_token' => 93, - 'variable_length' => true, - 'variadic_token' => 94, - 'type_hint' => '', - 'type_hint_token' => false, - 'type_hint_end_token' => false, - 'nullable_type' => false, - 'comma_token' => 96, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testParameterAttributesInFunctionDeclaration() - - - /** - * Verify recognition of PHP8.1 intersection type declaration. - * - * @return void - */ - public function testPHP8IntersectionTypes() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 8, - 'name' => '$obj1', - 'content' => 'Foo&Bar $obj1', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'Foo&Bar', - 'type_hint_token' => 4, - 'type_hint_end_token' => 6, - 'nullable_type' => false, - 'comma_token' => 9, - ]; - $expected[1] = [ - 'token' => 15, - 'name' => '$obj2', - 'content' => 'Boo&Bar $obj2', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'Boo&Bar', - 'type_hint_token' => 11, - 'type_hint_end_token' => 13, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP8IntersectionTypes() - - - /** - * Verify recognition of PHP8.1 intersection type declaration when the variable - * has either a spread operator or a reference. - * - * @return void - */ - public function testPHP81IntersectionTypesWithSpreadOperatorAndReference() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 9, - 'name' => '$paramA', - 'content' => 'Boo&Bar &$paramA', - 'has_attributes' => false, - 'pass_by_reference' => true, - 'reference_token' => 8, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'Boo&Bar', - 'type_hint_token' => 4, - 'type_hint_end_token' => 6, - 'nullable_type' => false, - 'comma_token' => 10, - ]; - $expected[1] = [ - 'token' => 17, - 'name' => '$paramB', - 'content' => 'Foo&Bar ...$paramB', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => true, - 'variadic_token' => 16, - 'type_hint' => 'Foo&Bar', - 'type_hint_token' => 12, - 'type_hint_end_token' => 14, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP81IntersectionTypesWithSpreadOperatorAndReference() - - - /** - * Verify recognition of PHP8.1 intersection type declaration with more types. - * - * @return void - */ - public function testPHP81MoreIntersectionTypes() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 16, - 'name' => '$var', - 'content' => 'MyClassA&\Package\MyClassB&\Package\MyClassC $var', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'MyClassA&\Package\MyClassB&\Package\MyClassC', - 'type_hint_token' => 4, - 'type_hint_end_token' => 14, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP81MoreIntersectionTypes() - - - /** - * Verify recognition of PHP8.1 intersection type declaration with illegal simple types. - * - * @return void - */ - public function testPHP81IllegalIntersectionTypes() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 7, - 'name' => '$numeric_string', - 'content' => 'string&int $numeric_string', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'string&int', - 'type_hint_token' => 3, - 'type_hint_end_token' => 5, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP81IllegalIntersectionTypes() - - - /** - * Verify recognition of PHP8.1 intersection type declaration with (illegal) nullability. - * - * @return void - */ - public function testPHP81NullableIntersectionTypes() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 8, - 'name' => '$object', - 'content' => '?Foo&Bar $object', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '?Foo&Bar', - 'type_hint_token' => 4, - 'type_hint_end_token' => 6, - 'nullable_type' => true, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP81NullableIntersectionTypes() - - - /** - * Verify recognition of PHP 8.2 stand-alone `true` type. - * - * @return void - */ - public function testPHP82PseudoTypeTrue() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 7, - 'name' => '$var', - 'content' => '?true $var = true', - 'default' => 'true', - 'default_token' => 11, - 'default_equal_token' => 9, - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '?true', - 'type_hint_token' => 5, - 'type_hint_end_token' => 5, - 'nullable_type' => true, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP82PseudoTypeTrue() - - - /** - * Verify recognition of PHP 8.2 type declaration with (illegal) type false combined with type true. - * - * @return void - */ - public function testPHP82PseudoTypeFalseAndTrue() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 8, - 'name' => '$var', - 'content' => 'true|false $var = true', - 'default' => 'true', - 'default_token' => 12, - 'default_equal_token' => 10, - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'true|false', - 'type_hint_token' => 4, - 'type_hint_end_token' => 6, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP82PseudoTypeFalseAndTrue() - - - /** - * Verify behaviour when the default value uses the "new" keyword, as is allowed per PHP 8.1. - * - * @return void - */ - public function testPHP81NewInInitializers() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 8, - 'name' => '$new', - 'content' => 'TypeA $new = new TypeA(self::CONST_VALUE)', - 'default' => 'new TypeA(self::CONST_VALUE)', - 'default_token' => 12, - 'default_equal_token' => 10, - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'TypeA', - 'type_hint_token' => 6, - 'type_hint_end_token' => 6, - 'nullable_type' => false, - 'comma_token' => 20, - ]; - $expected[1] = [ - 'token' => 28, - 'name' => '$newToo', - 'content' => '\Package\TypeB $newToo = new \Package\TypeB(10, \'string\')', - 'default' => "new \Package\TypeB(10, 'string')", - 'default_token' => 32, - 'default_equal_token' => 30, - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '\Package\TypeB', - 'type_hint_token' => 23, - 'type_hint_end_token' => 26, - 'nullable_type' => false, - 'comma_token' => 44, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP81NewInInitializers() - - - /** - * Verify recognition of 8.2 DNF parameter type declarations. - * - * @return void - */ - public function testPHP82DNFTypes() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 21, - 'name' => '$obj1', - 'content' => '#[MyAttribute] - false|(Foo&Bar)|true $obj1', - 'has_attributes' => true, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => 'false|(Foo&Bar)|true', - 'type_hint_token' => 11, - 'type_hint_end_token' => 19, - 'nullable_type' => false, - 'comma_token' => 22, - ]; - $expected[1] = [ - 'token' => 41, - 'name' => '$obj2', - 'content' => '(\Boo&\Pck\Bar)|(Boo&Baz) $obj2 = new Boo()', - 'default' => 'new Boo()', - 'default_token' => 45, - 'default_equal_token' => 43, - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '(\Boo&\Pck\Bar)|(Boo&Baz)', - 'type_hint_token' => 25, - 'type_hint_end_token' => 39, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP82DNFTypes() - - - /** - * Verify recognition of PHP 8.2 DNF parameter type declarations when the variable - * has either a spread operator or a reference. - * - * @return void - */ - public function testPHP82DNFTypesWithSpreadOperatorAndReference() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 13, - 'name' => '$paramA', - 'content' => '(Countable&MeMe)|iterable &$paramA', - 'has_attributes' => false, - 'pass_by_reference' => true, - 'reference_token' => 12, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '(Countable&MeMe)|iterable', - 'type_hint_token' => 4, - 'type_hint_end_token' => 10, - 'nullable_type' => false, - 'comma_token' => 14, - ]; - $expected[1] = [ - 'token' => 25, - 'name' => '$paramB', - 'content' => 'true|(Foo&Bar) ...$paramB', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => true, - 'variadic_token' => 24, - 'type_hint' => 'true|(Foo&Bar)', - 'type_hint_token' => 16, - 'type_hint_end_token' => 22, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP82DNFTypesWithSpreadOperatorAndReference() - - - /** - * Verify recognition of PHP 8.2 DNF parameter type declarations using the nullability operator (not allowed). - * - * @return void - */ - public function testPHP82DNFTypesIllegalNullable() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 27, - 'name' => '$var', - 'content' => '? ( MyClassA & /*comment*/ \Package\MyClassB & \Package\MyClassC ) $var', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '?(MyClassA&\Package\MyClassB&\Package\MyClassC)', - 'type_hint_token' => 5, - 'type_hint_end_token' => 25, - 'nullable_type' => true, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP82DNFTypesIllegalNullable() - - - /** - * Verify recognition of PHP 8.2 DNF parameter type declarations in an arrow function. - * - * @return void - */ - public function testPHP82DNFTypesInArrow() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 12, - 'name' => '$range', - 'content' => '(Hi&Ho)|FALSE &...$range', - 'has_attributes' => false, - 'pass_by_reference' => true, - 'reference_token' => 10, - 'variable_length' => true, - 'variadic_token' => 11, - 'type_hint' => '(Hi&Ho)|FALSE', - 'type_hint_token' => 2, - 'type_hint_end_token' => 8, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP82DNFTypesInArrow() - - - /** - * Verify handling of a closure. - * - * @return void - */ - public function testClosure() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 3, - 'name' => '$a', - 'content' => '$a = \'test\'', - 'default' => "'test'", - 'default_token' => 7, - 'default_equal_token' => 5, - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '', - 'type_hint_token' => false, - 'type_hint_end_token' => false, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testClosure() - - - /** - * Verify handling of a closure T_USE token correctly. - * - * @return void - */ - public function testClosureUse() - { - // Offsets are relative to the T_USE token. - $expected = []; - $expected[0] = [ - 'token' => 3, - 'name' => '$foo', - 'content' => '$foo', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '', - 'type_hint_token' => false, - 'type_hint_end_token' => false, - 'nullable_type' => false, - 'comma_token' => 4, - ]; - $expected[1] = [ - 'token' => 6, - 'name' => '$bar', - 'content' => '$bar', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '', - 'type_hint_token' => false, - 'type_hint_end_token' => false, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected, [T_USE]); - - }//end testClosureUse() - - - /** - * Verify handling of a closure T_USE token with variables imported by reference. - * - * @return void - */ - public function testClosureUseWithReference() - { - // Offsets are relative to the T_USE token. - $expected = []; - $expected[0] = [ - 'token' => 4, - 'name' => '$foo', - 'content' => '&$foo', - 'has_attributes' => false, - 'pass_by_reference' => true, - 'reference_token' => 3, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '', - 'type_hint_token' => false, - 'type_hint_end_token' => false, - 'nullable_type' => false, - 'comma_token' => 5, - ]; - $expected[1] = [ - 'token' => 8, - 'name' => '$bar', - 'content' => '&$bar', - 'has_attributes' => false, - 'pass_by_reference' => true, - 'reference_token' => 7, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '', - 'type_hint_token' => false, - 'type_hint_end_token' => false, - 'nullable_type' => false, - 'comma_token' => false, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected, [T_USE]); - - }//end testClosureUseWithReference() - - - /** - * Verify function declarations with trailing commas are handled correctly. - * - * @return void - */ - public function testFunctionParamListWithTrailingComma() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 9, - 'name' => '$foo', - 'content' => '?string $foo /*comment*/', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '?string', - 'type_hint_token' => 7, - 'type_hint_end_token' => 7, - 'nullable_type' => true, - 'comma_token' => 13, - ]; - $expected[1] = [ - 'token' => 16, - 'name' => '$bar', - 'content' => '$bar = 0', - 'default' => '0', - 'default_token' => 20, - 'default_equal_token' => 18, - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '', - 'type_hint_token' => false, - 'type_hint_end_token' => false, - 'nullable_type' => false, - 'comma_token' => 21, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testFunctionParamListWithTrailingComma() - - - /** - * Verify closure declarations with trailing commas are handled correctly. - * - * @return void - */ - public function testClosureParamListWithTrailingComma() - { - // Offsets are relative to the T_FUNCTION token. - $expected = []; - $expected[0] = [ - 'token' => 4, - 'name' => '$foo', - 'content' => '$foo', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '', - 'type_hint_token' => false, - 'type_hint_end_token' => false, - 'nullable_type' => false, - 'comma_token' => 5, - ]; - $expected[1] = [ - 'token' => 8, - 'name' => '$bar', - 'content' => '$bar', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '', - 'type_hint_token' => false, - 'type_hint_end_token' => false, - 'nullable_type' => false, - 'comma_token' => 9, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testClosureParamListWithTrailingComma() - - - /** - * Verify arrow function declarations with trailing commas are handled correctly. - * - * @return void - */ - public function testArrowFunctionParamListWithTrailingComma() - { - // Offsets are relative to the T_FN token. - $expected = []; - $expected[0] = [ - 'token' => 6, - 'name' => '$a', - 'content' => '?int $a', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '?int', - 'type_hint_token' => 4, - 'type_hint_end_token' => 4, - 'nullable_type' => true, - 'comma_token' => 8, - ]; - $expected[1] = [ - 'token' => 11, - 'name' => '$b', - 'content' => '...$b', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => true, - 'variadic_token' => 10, - 'type_hint' => '', - 'type_hint_token' => false, - 'type_hint_end_token' => false, - 'nullable_type' => false, - 'comma_token' => 12, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testArrowFunctionParamListWithTrailingComma() - - - /** - * Verify closure T_USE statements with trailing commas are handled correctly. - * - * @return void - */ - public function testClosureUseWithTrailingComma() - { - // Offsets are relative to the T_USE token. - $expected = []; - $expected[0] = [ - 'token' => 4, - 'name' => '$foo', - 'content' => '$foo /*comment*/', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '', - 'type_hint_token' => false, - 'type_hint_end_token' => false, - 'nullable_type' => false, - 'comma_token' => 8, - ]; - $expected[1] = [ - 'token' => 11, - 'name' => '$bar', - 'content' => '$bar', - 'has_attributes' => false, - 'pass_by_reference' => false, - 'reference_token' => false, - 'variable_length' => false, - 'variadic_token' => false, - 'type_hint' => '', - 'type_hint_token' => false, - 'type_hint_end_token' => false, - 'nullable_type' => false, - 'comma_token' => 12, - ]; - - $this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected, [T_USE]); - - }//end testClosureUseWithTrailingComma() - - - /** - * Test helper. - * - * @param string $commentString The comment which preceeds the test. - * @param array> $expected The expected function output. - * @param int|string|array $targetType Optional. The token type to search for after $marker. - * Defaults to the function/closure/arrow tokens. - * - * @return void - */ - private function getMethodParametersTestHelper($commentString, $expected, $targetType=[T_FUNCTION, T_CLOSURE, T_FN]) - { - $target = $this->getTargetToken($commentString, $targetType); - $found = self::$phpcsFile->getMethodParameters($target); - - // Convert offsets to absolute positions in the token stream. - foreach ($expected as $key => $param) { - $expected[$key]['token'] += $target; - - if (is_int($param['reference_token']) === true) { - $expected[$key]['reference_token'] += $target; - } - - if (is_int($param['variadic_token']) === true) { - $expected[$key]['variadic_token'] += $target; - } - - if (is_int($param['type_hint_token']) === true) { - $expected[$key]['type_hint_token'] += $target; - } - - if (is_int($param['type_hint_end_token']) === true) { - $expected[$key]['type_hint_end_token'] += $target; - } - - if (is_int($param['comma_token']) === true) { - $expected[$key]['comma_token'] += $target; - } - - if (isset($param['default_token']) === true) { - $expected[$key]['default_token'] += $target; - } - - if (isset($param['default_equal_token']) === true) { - $expected[$key]['default_equal_token'] += $target; - } - - if (isset($param['visibility_token']) === true && is_int($param['visibility_token']) === true) { - $expected[$key]['visibility_token'] += $target; - } - - if (isset($param['set_visibility_token']) === true && is_int($param['set_visibility_token']) === true) { - $expected[$key]['set_visibility_token'] += $target; - } - - if (isset($param['readonly_token']) === true) { - $expected[$key]['readonly_token'] += $target; - } - }//end foreach - - $this->assertSame($expected, $found); - - }//end getMethodParametersTestHelper() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetMethodPropertiesTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetMethodPropertiesTest.inc deleted file mode 100644 index 7f572f6..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetMethodPropertiesTest.inc +++ /dev/null @@ -1,226 +0,0 @@ - $number + 1, - $numbers -); - -class ReturnMe { - /* testReturnTypeStatic */ - private function myFunction(): static { - return $this; - } - - /* testReturnTypeNullableStatic */ - function myNullableFunction(): ?static { - return $this; - } -} - -/* testPHP8MixedTypeHint */ -function mixedTypeHint() :mixed {} - -/* testPHP8MixedTypeHintNullable */ -// Intentional fatal error - nullability is not allowed with mixed, but that's not the concern of the method. -function mixedTypeHintNullable(): ?mixed {} - -/* testNamespaceOperatorTypeHint */ -function namespaceOperatorTypeHint() : ?namespace\Name {} - -/* testPHP8UnionTypesSimple */ -function unionTypeSimple($number) : int|float {} - -/* testPHP8UnionTypesTwoClasses */ -$fn = fn($var): MyClassA|\Package\MyClassB => $var; - -/* testPHP8UnionTypesAllBaseTypes */ -function unionTypesAllBaseTypes() : array|bool|callable|int|float|null|Object|string {} - -/* testPHP8UnionTypesAllPseudoTypes */ -// Intentional fatal error - mixing types which cannot be combined, but that's not the concern of the method. -function unionTypesAllPseudoTypes($var) : false|MIXED|self|parent|static|iterable|Resource|void {} - -/* testPHP8UnionTypesNullable */ -// Intentional fatal error - nullability is not allowed with union types, but that's not the concern of the method. -$closure = function () use($a) :?int|float {}; - -/* testPHP8PseudoTypeNull */ -// PHP 8.0 - 8.1: Intentional fatal error - null pseudotype is only allowed in union types, but that's not the concern of the method. -function pseudoTypeNull(): null {} - -/* testPHP8PseudoTypeFalse */ -// PHP 8.0 - 8.1: Intentional fatal error - false pseudotype is only allowed in union types, but that's not the concern of the method. -function pseudoTypeFalse(): false {} - -/* testPHP8PseudoTypeFalseAndBool */ -// Intentional fatal error - false pseudotype is not allowed in combination with bool, but that's not the concern of the method. -function pseudoTypeFalseAndBool(): bool|false {} - -/* testPHP8ObjectAndClass */ -// Intentional fatal error - object is not allowed in combination with class name, but that's not the concern of the method. -function objectAndClass(): object|ClassName {} - -/* testPHP8PseudoTypeIterableAndArray */ -// Intentional fatal error - iterable pseudotype is not allowed in combination with array or Traversable, but that's not the concern of the method. -interface FooBar { - public function pseudoTypeIterableAndArray(): iterable|array|Traversable; -} - -/* testPHP8DuplicateTypeInUnionWhitespaceAndComment */ -// Intentional fatal error - duplicate types are not allowed in union types, but that's not the concern of the method. -function duplicateTypeInUnion(): int | /*comment*/ string | INT {} - -/* testPHP81NeverType */ -function never(): never {} - -/* testPHP81NullableNeverType */ -// Intentional fatal error - nullability is not allowed with never, but that's not the concern of the method. -function nullableNever(): ?never {} - -/* testPHP8IntersectionTypes */ -function intersectionTypes(): Foo&Bar {} - -/* testPHP81MoreIntersectionTypes */ -function moreIntersectionTypes(): MyClassA&\Package\MyClassB&\Package\MyClassC {} - -/* testPHP81IntersectionArrowFunction */ -$fn = fn($var): MyClassA&\Package\MyClassB => $var; - -/* testPHP81IllegalIntersectionTypes */ -// Intentional fatal error - simple types are not allowed with intersection types, but that's not the concern of the method. -$closure = function (): string&int {}; - -/* testPHP81NullableIntersectionTypes */ -// Intentional fatal error - nullability is not allowed with intersection types, but that's not the concern of the method. -$closure = function (): ?Foo&Bar {}; - -/* testPHP82PseudoTypeTrue */ -function pseudoTypeTrue(): ?true {} - -/* testPHP82PseudoTypeFalseAndTrue */ -// Intentional fatal error - Type contains both true and false, bool should be used instead, but that's not the concern of the method. -function pseudoTypeFalseAndTrue(): true|false {} - -/* testPHP82DNFType */ -function hasDNFType() : bool|(Foo&Bar)|string {} - -abstract class AbstractClass { - /* testPHP82DNFTypeAbstractMethod */ - abstract protected function abstractMethodDNFType() : float|(Foo&Bar); -} - -/* testPHP82DNFTypeIllegalNullable */ -// Intentional fatal error - nullable operator cannot be combined with DNF. -function illegalNullableDNF(): ?(A&\Pck\B)|bool {} - -/* testPHP82DNFTypeClosure */ -$closure = function() : object|(namespace\Foo&Countable) {}; - -/* testPHP82DNFTypeFn */ -// Intentional fatal error - void type cannot be combined with DNF. -$arrow = fn() : null|(Partially\Qualified&Traversable)|void => do_something(); - -/* testNotAFunction */ -return true; - -/* testPhpcsIssue1264 */ -function foo() : array { - echo $foo; -} - -/* testArrowFunctionArrayReturnValue */ -$fn = fn(): array => [a($a, $b)]; - -/* testArrowFunctionReturnByRef */ -fn&(?string $a) : ?string => $b; - -/* testFunctionCallFnPHPCS353-354 */ -$value = $obj->fn(true); - -/* testFunctionDeclarationNestedInTernaryPHPCS2975 */ -return (!$a ? [ new class { public function b(): c {} } ] : []); - -/* testClosureWithUseNoReturnType */ -$closure = function () use($a) /*comment*/ {}; - -/* testClosureWithUseNoReturnTypeIllegalUseProp */ -$closure = function () use ($this->prop){}; - -/* testClosureWithUseWithReturnType */ -$closure = function () use /*comment*/ ($a): Type {}; - -/* testClosureWithUseMultiParamWithReturnType */ -$closure = function () use ($a, &$b, $c, $d, $e, $f, $g): ?array {}; - -/* testArrowFunctionLiveCoding */ -// Intentional parse error. This has to be the last test in the file. -$fn = fn diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetMethodPropertiesTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetMethodPropertiesTest.php deleted file mode 100644 index f55ec8a..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetMethodPropertiesTest.php +++ /dev/null @@ -1,1562 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Files\File; - -use PHP_CodeSniffer\Tests\Core\AbstractMethodUnitTest; - -/** - * Tests for the \PHP_CodeSniffer\Files\File::getMethodProperties method. - * - * @covers \PHP_CodeSniffer\Files\File::getMethodProperties - */ -final class GetMethodPropertiesTest extends AbstractMethodUnitTest -{ - - - /** - * Test receiving an expected exception when a non function token is passed. - * - * @param string $commentString The comment which preceeds the test. - * @param string|int|array $targetTokenType The token type to search for after $commentString. - * - * @dataProvider dataNotAFunctionException - * - * @return void - */ - public function testNotAFunctionException($commentString, $targetTokenType) - { - $this->expectRunTimeException('$stackPtr must be of type T_FUNCTION or T_CLOSURE or T_FN'); - - $next = $this->getTargetToken($commentString, $targetTokenType); - self::$phpcsFile->getMethodProperties($next); - - }//end testNotAFunctionException() - - - /** - * Data Provider. - * - * @see testNotAFunctionException() For the array format. - * - * @return array>> - */ - public static function dataNotAFunctionException() - { - return [ - 'return' => [ - 'commentString' => '/* testNotAFunction */', - 'targetTokenType' => T_RETURN, - ], - 'function-call-fn-phpcs-3.5.3-3.5.4' => [ - 'commentString' => '/* testFunctionCallFnPHPCS353-354 */', - 'targetTokenType' => [ - T_FN, - T_STRING, - ], - ], - 'fn-live-coding' => [ - 'commentString' => '/* testArrowFunctionLiveCoding */', - 'targetTokenType' => [ - T_FN, - T_STRING, - ], - ], - ]; - - }//end dataNotAFunctionException() - - - /** - * Test a basic function. - * - * @return void - */ - public function testBasicFunction() - { - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => '', - 'return_type_token' => false, - 'return_type_end_token' => false, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testBasicFunction() - - - /** - * Test a function with a return type. - * - * @return void - */ - public function testReturnFunction() - { - // Offsets are relative to the T_FUNCTION token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => 'array', - 'return_type_token' => 11, - 'return_type_end_token' => 11, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testReturnFunction() - - - /** - * Test a closure used as a function argument. - * - * @return void - */ - public function testNestedClosure() - { - // Offsets are relative to the T_FUNCTION token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => 'int', - 'return_type_token' => 8, - 'return_type_end_token' => 8, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testNestedClosure() - - - /** - * Test a basic method. - * - * @return void - */ - public function testBasicMethod() - { - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => '', - 'return_type_token' => false, - 'return_type_end_token' => false, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testBasicMethod() - - - /** - * Test a private static method. - * - * @return void - */ - public function testPrivateStaticMethod() - { - $expected = [ - 'scope' => 'private', - 'scope_specified' => true, - 'return_type' => '', - 'return_type_token' => false, - 'return_type_end_token' => false, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => true, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPrivateStaticMethod() - - - /** - * Test a basic final method. - * - * @return void - */ - public function testFinalMethod() - { - $expected = [ - 'scope' => 'public', - 'scope_specified' => true, - 'return_type' => '', - 'return_type_token' => false, - 'return_type_end_token' => false, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => true, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testFinalMethod() - - - /** - * Test a protected method with a return type. - * - * @return void - */ - public function testProtectedReturnMethod() - { - // Offsets are relative to the T_FUNCTION token. - $expected = [ - 'scope' => 'protected', - 'scope_specified' => true, - 'return_type' => 'int', - 'return_type_token' => 8, - 'return_type_end_token' => 8, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testProtectedReturnMethod() - - - /** - * Test a public method with a return type. - * - * @return void - */ - public function testPublicReturnMethod() - { - // Offsets are relative to the T_FUNCTION token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => true, - 'return_type' => 'array', - 'return_type_token' => 7, - 'return_type_end_token' => 7, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPublicReturnMethod() - - - /** - * Test a public method with a nullable return type. - * - * @return void - */ - public function testNullableReturnMethod() - { - // Offsets are relative to the T_FUNCTION token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => true, - 'return_type' => '?array', - 'return_type_token' => 8, - 'return_type_end_token' => 8, - 'nullable_return_type' => true, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testNullableReturnMethod() - - - /** - * Test a public method with a nullable return type. - * - * @return void - */ - public function testMessyNullableReturnMethod() - { - // Offsets are relative to the T_FUNCTION token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => true, - 'return_type' => '?array', - 'return_type_token' => 18, - 'return_type_end_token' => 18, - 'nullable_return_type' => true, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testMessyNullableReturnMethod() - - - /** - * Test a method with a namespaced return type. - * - * @return void - */ - public function testReturnNamespace() - { - // Offsets are relative to the T_FUNCTION token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => '\MyNamespace\MyClass', - 'return_type_token' => 7, - 'return_type_end_token' => 10, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testReturnNamespace() - - - /** - * Test a method with a messy namespaced return type. - * - * @return void - */ - public function testReturnMultilineNamespace() - { - // Offsets are relative to the T_FUNCTION token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => '\MyNamespace\MyClass\Foo', - 'return_type_token' => 7, - 'return_type_end_token' => 23, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testReturnMultilineNamespace() - - - /** - * Test a method with an unqualified named return type. - * - * @return void - */ - public function testReturnUnqualifiedName() - { - // Offsets are relative to the T_FUNCTION token. - $expected = [ - 'scope' => 'private', - 'scope_specified' => true, - 'return_type' => '?MyClass', - 'return_type_token' => 8, - 'return_type_end_token' => 8, - 'nullable_return_type' => true, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testReturnUnqualifiedName() - - - /** - * Test a method with a partially qualified namespaced return type. - * - * @return void - */ - public function testReturnPartiallyQualifiedName() - { - // Offsets are relative to the T_FUNCTION token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => 'Sub\Level\MyClass', - 'return_type_token' => 7, - 'return_type_end_token' => 11, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testReturnPartiallyQualifiedName() - - - /** - * Test a basic abstract method. - * - * @return void - */ - public function testAbstractMethod() - { - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => '', - 'return_type_token' => false, - 'return_type_end_token' => false, - 'nullable_return_type' => false, - 'is_abstract' => true, - 'is_final' => false, - 'is_static' => false, - 'has_body' => false, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testAbstractMethod() - - - /** - * Test an abstract method with a return type. - * - * @return void - */ - public function testAbstractReturnMethod() - { - // Offsets are relative to the T_FUNCTION token. - $expected = [ - 'scope' => 'protected', - 'scope_specified' => true, - 'return_type' => 'bool', - 'return_type_token' => 7, - 'return_type_end_token' => 7, - 'nullable_return_type' => false, - 'is_abstract' => true, - 'is_final' => false, - 'is_static' => false, - 'has_body' => false, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testAbstractReturnMethod() - - - /** - * Test a basic interface method. - * - * @return void - */ - public function testInterfaceMethod() - { - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => '', - 'return_type_token' => false, - 'return_type_end_token' => false, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => false, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testInterfaceMethod() - - - /** - * Test a static arrow function. - * - * @return void - */ - public function testArrowFunction() - { - // Offsets are relative to the T_FN token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => 'int', - 'return_type_token' => 9, - 'return_type_end_token' => 9, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => true, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testArrowFunction() - - - /** - * Test a function with return type "static". - * - * @return void - */ - public function testReturnTypeStatic() - { - // Offsets are relative to the T_FUNCTION token. - $expected = [ - 'scope' => 'private', - 'scope_specified' => true, - 'return_type' => 'static', - 'return_type_token' => 7, - 'return_type_end_token' => 7, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testReturnTypeStatic() - - - /** - * Test a function with return type "?static". - * - * @return void - */ - public function testReturnTypeNullableStatic() - { - // Offsets are relative to the T_FUNCTION token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => '?static', - 'return_type_token' => 8, - 'return_type_end_token' => 8, - 'nullable_return_type' => true, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testReturnTypeNullableStatic() - - - /** - * Test a function with return type "mixed". - * - * @return void - */ - public function testPHP8MixedTypeHint() - { - // Offsets are relative to the T_FUNCTION token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => 'mixed', - 'return_type_token' => 7, - 'return_type_end_token' => 7, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP8MixedTypeHint() - - - /** - * Test a function with return type "mixed" and nullability. - * - * @return void - */ - public function testPHP8MixedTypeHintNullable() - { - // Offsets are relative to the T_FUNCTION token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => '?mixed', - 'return_type_token' => 8, - 'return_type_end_token' => 8, - 'nullable_return_type' => true, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP8MixedTypeHintNullable() - - - /** - * Test a function with return type using the namespace operator. - * - * @return void - */ - public function testNamespaceOperatorTypeHint() - { - // Offsets are relative to the T_FUNCTION token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => '?namespace\Name', - 'return_type_token' => 9, - 'return_type_end_token' => 11, - 'nullable_return_type' => true, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testNamespaceOperatorTypeHint() - - - /** - * Verify recognition of PHP8 union type declaration. - * - * @return void - */ - public function testPHP8UnionTypesSimple() - { - // Offsets are relative to the T_FUNCTION token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => 'int|float', - 'return_type_token' => 9, - 'return_type_end_token' => 11, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP8UnionTypesSimple() - - - /** - * Verify recognition of PHP8 union type declaration with two classes. - * - * @return void - */ - public function testPHP8UnionTypesTwoClasses() - { - // Offsets are relative to the T_FUNCTION token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => 'MyClassA|\Package\MyClassB', - 'return_type_token' => 6, - 'return_type_end_token' => 11, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP8UnionTypesTwoClasses() - - - /** - * Verify recognition of PHP8 union type declaration with all base types. - * - * @return void - */ - public function testPHP8UnionTypesAllBaseTypes() - { - // Offsets are relative to the T_FUNCTION token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => 'array|bool|callable|int|float|null|Object|string', - 'return_type_token' => 8, - 'return_type_end_token' => 22, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP8UnionTypesAllBaseTypes() - - - /** - * Verify recognition of PHP8 union type declaration with all pseudo types. - * - * Note: "Resource" is not a type, but seen as a class name. - * - * @return void - */ - public function testPHP8UnionTypesAllPseudoTypes() - { - // Offsets are relative to the T_FUNCTION token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => 'false|MIXED|self|parent|static|iterable|Resource|void', - 'return_type_token' => 9, - 'return_type_end_token' => 23, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP8UnionTypesAllPseudoTypes() - - - /** - * Verify recognition of PHP8 union type declaration with (illegal) nullability. - * - * @return void - */ - public function testPHP8UnionTypesNullable() - { - // Offsets are relative to the T_CLOSURE token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => '?int|float', - 'return_type_token' => 12, - 'return_type_end_token' => 14, - 'nullable_return_type' => true, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP8UnionTypesNullable() - - - /** - * Verify recognition of PHP8 type declaration with (illegal) single type null. - * - * @return void - */ - public function testPHP8PseudoTypeNull() - { - // Offsets are relative to the T_FUNCTION token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => 'null', - 'return_type_token' => 7, - 'return_type_end_token' => 7, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP8PseudoTypeNull() - - - /** - * Verify recognition of PHP8 type declaration with (illegal) single type false. - * - * @return void - */ - public function testPHP8PseudoTypeFalse() - { - // Offsets are relative to the T_FUNCTION token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => 'false', - 'return_type_token' => 7, - 'return_type_end_token' => 7, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP8PseudoTypeFalse() - - - /** - * Verify recognition of PHP8 type declaration with (illegal) type false combined with type bool. - * - * @return void - */ - public function testPHP8PseudoTypeFalseAndBool() - { - // Offsets are relative to the T_FUNCTION token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => 'bool|false', - 'return_type_token' => 7, - 'return_type_end_token' => 9, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP8PseudoTypeFalseAndBool() - - - /** - * Verify recognition of PHP8 type declaration with (illegal) type object combined with a class name. - * - * @return void - */ - public function testPHP8ObjectAndClass() - { - // Offsets are relative to the T_FUNCTION token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => 'object|ClassName', - 'return_type_token' => 7, - 'return_type_end_token' => 9, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP8ObjectAndClass() - - - /** - * Verify recognition of PHP8 type declaration with (illegal) type iterable combined with array/Traversable. - * - * @return void - */ - public function testPHP8PseudoTypeIterableAndArray() - { - // Offsets are relative to the T_FUNCTION token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => true, - 'return_type' => 'iterable|array|Traversable', - 'return_type_token' => 7, - 'return_type_end_token' => 11, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => false, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP8PseudoTypeIterableAndArray() - - - /** - * Verify recognition of PHP8 type declaration with (illegal) duplicate types. - * - * @return void - */ - public function testPHP8DuplicateTypeInUnionWhitespaceAndComment() - { - // Offsets are relative to the T_FUNCTION token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => 'int|string|INT', - 'return_type_token' => 7, - 'return_type_end_token' => 17, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP8DuplicateTypeInUnionWhitespaceAndComment() - - - /** - * Verify recognition of PHP8.1 type "never". - * - * @return void - */ - public function testPHP81NeverType() - { - // Offsets are relative to the T_FUNCTION token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => 'never', - 'return_type_token' => 7, - 'return_type_end_token' => 7, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP81NeverType() - - - /** - * Verify recognition of PHP8.1 type "never" with (illegal) nullability. - * - * @return void - */ - public function testPHP81NullableNeverType() - { - // Offsets are relative to the T_FUNCTION token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => '?never', - 'return_type_token' => 8, - 'return_type_end_token' => 8, - 'nullable_return_type' => true, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP81NullableNeverType() - - - /** - * Verify recognition of PHP8.1 intersection type declaration. - * - * @return void - */ - public function testPHP8IntersectionTypes() - { - // Offsets are relative to the T_FUNCTION token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => 'Foo&Bar', - 'return_type_token' => 7, - 'return_type_end_token' => 9, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP8IntersectionTypes() - - - /** - * Verify recognition of PHP8.1 intersection type declaration with more types. - * - * @return void - */ - public function testPHP81MoreIntersectionTypes() - { - // Offsets are relative to the T_FUNCTION token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => 'MyClassA&\Package\MyClassB&\Package\MyClassC', - 'return_type_token' => 7, - 'return_type_end_token' => 17, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP81MoreIntersectionTypes() - - - /** - * Verify recognition of PHP8.1 intersection type declaration in arrow function. - * - * @return void - */ - public function testPHP81IntersectionArrowFunction() - { - // Offsets are relative to the T_FN token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => 'MyClassA&\Package\MyClassB', - 'return_type_token' => 6, - 'return_type_end_token' => 11, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP81IntersectionArrowFunction() - - - /** - * Verify recognition of PHP8.1 intersection type declaration with illegal simple types. - * - * @return void - */ - public function testPHP81IllegalIntersectionTypes() - { - // Offsets are relative to the T_FUNCTION token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => 'string&int', - 'return_type_token' => 6, - 'return_type_end_token' => 8, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP81IllegalIntersectionTypes() - - - /** - * Verify recognition of PHP8.1 intersection type declaration with (illegal) nullability. - * - * @return void - */ - public function testPHP81NullableIntersectionTypes() - { - // Offsets are relative to the T_FUNCTION token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => '?Foo&Bar', - 'return_type_token' => 7, - 'return_type_end_token' => 9, - 'nullable_return_type' => true, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP81NullableIntersectionTypes() - - - /** - * Verify recognition of PHP 8.2 stand-alone `true` type. - * - * @return void - */ - public function testPHP82PseudoTypeTrue() - { - // Offsets are relative to the T_FUNCTION token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => '?true', - 'return_type_token' => 8, - 'return_type_end_token' => 8, - 'nullable_return_type' => true, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP82PseudoTypeTrue() - - - /** - * Verify recognition of PHP 8.2 type declaration with (illegal) type false combined with type true. - * - * @return void - */ - public function testPHP82PseudoTypeFalseAndTrue() - { - // Offsets are relative to the T_FUNCTION token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => 'true|false', - 'return_type_token' => 7, - 'return_type_end_token' => 9, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP82PseudoTypeFalseAndTrue() - - - /** - * Verify recognition of PHP 8.2 DNF return type declaration. - * - * @return void - */ - public function testPHP82DNFType() - { - // Offsets are relative to the T_FUNCTION token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => 'bool|(Foo&Bar)|string', - 'return_type_token' => 8, - 'return_type_end_token' => 16, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP82DNFType() - - - /** - * Verify recognition of PHP 8.2 DNF return type declaration on an abstract method. - * - * @return void - */ - public function testPHP82DNFTypeAbstractMethod() - { - // Offsets are relative to the T_FUNCTION token. - $expected = [ - 'scope' => 'protected', - 'scope_specified' => true, - 'return_type' => 'float|(Foo&Bar)', - 'return_type_token' => 8, - 'return_type_end_token' => 14, - 'nullable_return_type' => false, - 'is_abstract' => true, - 'is_final' => false, - 'is_static' => false, - 'has_body' => false, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP82DNFTypeAbstractMethod() - - - /** - * Verify recognition of PHP 8.2 DNF return type declaration with illegal nullability. - * - * @return void - */ - public function testPHP82DNFTypeIllegalNullable() - { - // Offsets are relative to the T_FUNCTION token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => '?(A&\Pck\B)|bool', - 'return_type_token' => 8, - 'return_type_end_token' => 17, - 'nullable_return_type' => true, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP82DNFTypeIllegalNullable() - - - /** - * Verify recognition of PHP 8.2 DNF return type declaration on a closure. - * - * @return void - */ - public function testPHP82DNFTypeClosure() - { - // Offsets are relative to the T_CLOSURE token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => 'object|(namespace\Foo&Countable)', - 'return_type_token' => 6, - 'return_type_end_token' => 14, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP82DNFTypeClosure() - - - /** - * Verify recognition of PHP 8.2 DNF return type declaration on an arrow function. - * - * @return void - */ - public function testPHP82DNFTypeFn() - { - // Offsets are relative to the T_FN token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => 'null|(Partially\Qualified&Traversable)|void', - 'return_type_token' => 6, - 'return_type_end_token' => 16, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPHP82DNFTypeFn() - - - /** - * Test for incorrect tokenization of array return type declarations in PHPCS < 2.8.0. - * - * @link https://github.com/squizlabs/PHP_CodeSniffer/pull/1264 - * - * @return void - */ - public function testPhpcsIssue1264() - { - // Offsets are relative to the T_FUNCTION token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => 'array', - 'return_type_token' => 8, - 'return_type_end_token' => 8, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testPhpcsIssue1264() - - - /** - * Test handling of incorrect tokenization of array return type declarations for arrow functions - * in a very specific code sample in PHPCS < 3.5.4. - * - * @link https://github.com/squizlabs/PHP_CodeSniffer/issues/2773 - * - * @return void - */ - public function testArrowFunctionArrayReturnValue() - { - // Offsets are relative to the T_FN token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => 'array', - 'return_type_token' => 5, - 'return_type_end_token' => 5, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testArrowFunctionArrayReturnValue() - - - /** - * Test handling of an arrow function returning by reference. - * - * @return void - */ - public function testArrowFunctionReturnByRef() - { - // Offsets are relative to the T_FN token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => '?string', - 'return_type_token' => 12, - 'return_type_end_token' => 12, - 'nullable_return_type' => true, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testArrowFunctionReturnByRef() - - - /** - * Test handling of function declaration nested in a ternary, where the colon for the - * return type was incorrectly tokenized as T_INLINE_ELSE prior to PHPCS 3.5.7. - * - * @return void - */ - public function testFunctionDeclarationNestedInTernaryPHPCS2975() - { - // Offsets are relative to the T_FN token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => true, - 'return_type' => 'c', - 'return_type_token' => 7, - 'return_type_end_token' => 7, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testFunctionDeclarationNestedInTernaryPHPCS2975() - - - /** - * Test handling of closure declarations with a use variable import without a return type declaration. - * - * @return void - */ - public function testClosureWithUseNoReturnType() - { - // Offsets are relative to the T_CLOSURE token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => '', - 'return_type_token' => false, - 'return_type_end_token' => false, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testClosureWithUseNoReturnType() - - - /** - * Test handling of closure declarations with an illegal use variable for a property import (not allowed in PHP) - * without a return type declaration. - * - * @return void - */ - public function testClosureWithUseNoReturnTypeIllegalUseProp() - { - // Offsets are relative to the T_CLOSURE token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => '', - 'return_type_token' => false, - 'return_type_end_token' => false, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testClosureWithUseNoReturnTypeIllegalUseProp() - - - /** - * Test handling of closure declarations with a use variable import with a return type declaration. - * - * @return void - */ - public function testClosureWithUseWithReturnType() - { - // Offsets are relative to the T_CLOSURE token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => 'Type', - 'return_type_token' => 14, - 'return_type_end_token' => 14, - 'nullable_return_type' => false, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testClosureWithUseWithReturnType() - - - /** - * Test handling of closure declarations with a use variable import with a return type declaration. - * - * @return void - */ - public function testClosureWithUseMultiParamWithReturnType() - { - // Offsets are relative to the T_CLOSURE token. - $expected = [ - 'scope' => 'public', - 'scope_specified' => false, - 'return_type' => '?array', - 'return_type_token' => 32, - 'return_type_end_token' => 32, - 'nullable_return_type' => true, - 'is_abstract' => false, - 'is_final' => false, - 'is_static' => false, - 'has_body' => true, - ]; - - $this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected); - - }//end testClosureWithUseMultiParamWithReturnType() - - - /** - * Test helper. - * - * @param string $commentString The comment which preceeds the test. - * @param array $expected The expected function output. - * - * @return void - */ - private function getMethodPropertiesTestHelper($commentString, $expected) - { - $function = $this->getTargetToken($commentString, [T_FUNCTION, T_CLOSURE, T_FN]); - $found = self::$phpcsFile->getMethodProperties($function); - - // Convert offsets to absolute positions in the token stream. - if (is_int($expected['return_type_token']) === true) { - $expected['return_type_token'] += $function; - } - - if (is_int($expected['return_type_end_token']) === true) { - $expected['return_type_end_token'] += $function; - } - - $this->assertSame($expected, $found); - - }//end getMethodPropertiesTestHelper() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetTokensAsStringTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetTokensAsStringTest.inc deleted file mode 100644 index ace5a9b..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetTokensAsStringTest.inc +++ /dev/null @@ -1,25 +0,0 @@ - 20; -} - -/* testEchoWithTabs */ -echo 'foo', - 'bar' , - 'baz'; - -/* testEndOfFile */ -echo $foo; diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetTokensAsStringTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetTokensAsStringTest.php deleted file mode 100644 index 20a7402..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/GetTokensAsStringTest.php +++ /dev/null @@ -1,334 +0,0 @@ - - * @copyright 2022 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Files\File; - -use PHP_CodeSniffer\Tests\Core\AbstractMethodUnitTest; - -/** - * Tests for the \PHP_CodeSniffer\Files\File:getTokensAsString method. - * - * @covers \PHP_CodeSniffer\Files\File::getTokensAsString - */ -final class GetTokensAsStringTest extends AbstractMethodUnitTest -{ - - - /** - * Test passing a non-existent token pointer. - * - * @return void - */ - public function testNonExistentToken() - { - $this->expectRunTimeException('The $start position for getTokensAsString() must exist in the token stack'); - - self::$phpcsFile->getTokensAsString(100000, 10); - - }//end testNonExistentToken() - - - /** - * Test passing a non integer `$start`, like the result of a failed $phpcsFile->findNext(). - * - * @return void - */ - public function testNonIntegerStart() - { - $this->expectRunTimeException('The $start position for getTokensAsString() must exist in the token stack'); - - self::$phpcsFile->getTokensAsString(false, 10); - - }//end testNonIntegerStart() - - - /** - * Test passing a non integer `$length`. - * - * @return void - */ - public function testNonIntegerLength() - { - $result = self::$phpcsFile->getTokensAsString(10, false); - $this->assertSame('', $result); - - $result = self::$phpcsFile->getTokensAsString(10, 1.5); - $this->assertSame('', $result); - - }//end testNonIntegerLength() - - - /** - * Test passing a zero or negative `$length`. - * - * @return void - */ - public function testLengthEqualToOrLessThanZero() - { - $result = self::$phpcsFile->getTokensAsString(10, -10); - $this->assertSame('', $result); - - $result = self::$phpcsFile->getTokensAsString(10, 0); - $this->assertSame('', $result); - - }//end testLengthEqualToOrLessThanZero() - - - /** - * Test passing a `$length` beyond the end of the file. - * - * @return void - */ - public function testLengthBeyondEndOfFile() - { - $semicolon = $this->getTargetToken('/* testEndOfFile */', T_SEMICOLON); - $result = self::$phpcsFile->getTokensAsString($semicolon, 20); - $this->assertSame( - '; -', - $result - ); - - }//end testLengthBeyondEndOfFile() - - - /** - * Test getting a token set as a string. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * @param int|string $startTokenType The type of token(s) to look for for the start of the string. - * @param int $length Token length to get. - * @param string $expected The expected function return value. - * - * @dataProvider dataGetTokensAsString - * - * @return void - */ - public function testGetTokensAsString($testMarker, $startTokenType, $length, $expected) - { - $start = $this->getTargetToken($testMarker, $startTokenType); - $result = self::$phpcsFile->getTokensAsString($start, $length); - $this->assertSame($expected, $result); - - }//end testGetTokensAsString() - - - /** - * Data provider. - * - * @see testGetTokensAsString() For the array format. - * - * @return array> - */ - public static function dataGetTokensAsString() - { - return [ - 'length-0' => [ - 'testMarker' => '/* testCalculation */', - 'startTokenType' => T_LNUMBER, - 'length' => 0, - 'expected' => '', - ], - 'length-1' => [ - 'testMarker' => '/* testCalculation */', - 'startTokenType' => T_LNUMBER, - 'length' => 1, - 'expected' => '1', - ], - 'length-2' => [ - 'testMarker' => '/* testCalculation */', - 'startTokenType' => T_LNUMBER, - 'length' => 2, - 'expected' => '1 ', - ], - 'length-3' => [ - 'testMarker' => '/* testCalculation */', - 'startTokenType' => T_LNUMBER, - 'length' => 3, - 'expected' => '1 +', - ], - 'length-4' => [ - 'testMarker' => '/* testCalculation */', - 'startTokenType' => T_LNUMBER, - 'length' => 4, - 'expected' => '1 + ', - ], - 'length-5' => [ - 'testMarker' => '/* testCalculation */', - 'startTokenType' => T_LNUMBER, - 'length' => 5, - 'expected' => '1 + 2', - ], - 'length-6' => [ - 'testMarker' => '/* testCalculation */', - 'startTokenType' => T_LNUMBER, - 'length' => 6, - 'expected' => '1 + 2 ', - ], - 'length-7' => [ - 'testMarker' => '/* testCalculation */', - 'startTokenType' => T_LNUMBER, - 'length' => 7, - 'expected' => '1 + 2 +', - ], - 'length-8' => [ - 'testMarker' => '/* testCalculation */', - 'startTokenType' => T_LNUMBER, - 'length' => 8, - 'expected' => '1 + 2 + -', - ], - 'length-9' => [ - 'testMarker' => '/* testCalculation */', - 'startTokenType' => T_LNUMBER, - 'length' => 9, - 'expected' => '1 + 2 + - ', - ], - 'length-10' => [ - 'testMarker' => '/* testCalculation */', - 'startTokenType' => T_LNUMBER, - 'length' => 10, - 'expected' => '1 + 2 + - // Comment. -', - ], - 'length-11' => [ - 'testMarker' => '/* testCalculation */', - 'startTokenType' => T_LNUMBER, - 'length' => 11, - 'expected' => '1 + 2 + - // Comment. - ', - ], - 'length-12' => [ - 'testMarker' => '/* testCalculation */', - 'startTokenType' => T_LNUMBER, - 'length' => 12, - 'expected' => '1 + 2 + - // Comment. - 3', - ], - 'length-13' => [ - 'testMarker' => '/* testCalculation */', - 'startTokenType' => T_LNUMBER, - 'length' => 13, - 'expected' => '1 + 2 + - // Comment. - 3 ', - ], - 'length-14' => [ - 'testMarker' => '/* testCalculation */', - 'startTokenType' => T_LNUMBER, - 'length' => 14, - 'expected' => '1 + 2 + - // Comment. - 3 +', - ], - 'length-34' => [ - 'testMarker' => '/* testCalculation */', - 'startTokenType' => T_LNUMBER, - 'length' => 34, - 'expected' => '1 + 2 + - // Comment. - 3 + 4 - + 5 + 6 + 7 > 20;', - ], - 'namespace' => [ - 'testMarker' => '/* testNamespace */', - 'startTokenType' => T_NAMESPACE, - 'length' => 8, - 'expected' => 'namespace Foo\Bar\Baz;', - ], - 'use-with-comments' => [ - 'testMarker' => '/* testUseWithComments */', - 'startTokenType' => T_USE, - 'length' => 17, - 'expected' => 'use Foo /*comment*/ \ Bar - // phpcs:ignore Stnd.Cat.Sniff -- For reasons. - \ Bah;', - ], - 'echo-with-tabs' => [ - 'testMarker' => '/* testEchoWithTabs */', - 'startTokenType' => T_ECHO, - 'length' => 13, - 'expected' => 'echo \'foo\', - \'bar\' , - \'baz\';', - ], - 'end-of-file' => [ - 'testMarker' => '/* testEndOfFile */', - 'startTokenType' => T_ECHO, - 'length' => 4, - 'expected' => 'echo $foo;', - ], - ]; - - }//end dataGetTokensAsString() - - - /** - * Test getting a token set as a string with the original, non tab-replaced content. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * @param int|string $startTokenType The type of token(s) to look for for the start of the string. - * @param int $length Token length to get. - * @param string $expected The expected function return value. - * - * @dataProvider dataGetOrigContent - * - * @return void - */ - public function testGetOrigContent($testMarker, $startTokenType, $length, $expected) - { - $start = $this->getTargetToken($testMarker, $startTokenType); - $result = self::$phpcsFile->getTokensAsString($start, $length, true); - $this->assertSame($expected, $result); - - }//end testGetOrigContent() - - - /** - * Data provider. - * - * @see testGetOrigContent() For the array format. - * - * @return array> - */ - public static function dataGetOrigContent() - { - return [ - 'use-with-comments' => [ - 'testMarker' => '/* testUseWithComments */', - 'startTokenType' => T_USE, - 'length' => 17, - 'expected' => 'use Foo /*comment*/ \ Bar - // phpcs:ignore Stnd.Cat.Sniff -- For reasons. - \ Bah;', - ], - 'echo-with-tabs' => [ - 'testMarker' => '/* testEchoWithTabs */', - 'startTokenType' => T_ECHO, - 'length' => 13, - 'expected' => 'echo \'foo\', - \'bar\' , - \'baz\';', - ], - 'end-of-file' => [ - 'testMarker' => '/* testEndOfFile */', - 'startTokenType' => T_ECHO, - 'length' => 4, - 'expected' => 'echo $foo;', - ], - ]; - - }//end dataGetOrigContent() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/IsReferenceTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/IsReferenceTest.inc deleted file mode 100644 index 05af839..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/IsReferenceTest.inc +++ /dev/null @@ -1,216 +0,0 @@ - $first, 'b' => $something & $somethingElse ]; - -/* testBitwiseAndF */ -$a = array( 'a' => $first, 'b' => $something & \MyClass::$somethingElse ); - -/* testBitwiseAndG */ -$a = $something & $somethingElse; - -/* testBitwiseAndH */ -function myFunction($a = 10 & 20) {} - -/* testBitwiseAndI */ -$closure = function ($a = MY_CONSTANT & parent::OTHER_CONSTANT) {}; - -/* testFunctionReturnByReference */ -function &myFunction() {} - -/* testFunctionPassByReferenceA */ -function myFunction( &$a ) {} - -/* testFunctionPassByReferenceB */ -function myFunction( $a, &$b ) {} - -/* testFunctionPassByReferenceC */ -$closure = function ( &$a ) {}; - -/* testFunctionPassByReferenceD */ -$closure = function ( $a, &$b ) {}; - -/* testFunctionPassByReferenceE */ -function myFunction(array &$one) {} - -/* testFunctionPassByReferenceF */ -$closure = function (\MyClass &$one) {}; - -/* testFunctionPassByReferenceG */ -$closure = function ($param, &...$moreParams) {}; - -/* testForeachValueByReference */ -foreach( $array as $key => &$value ) {} - -/* testForeachKeyByReference */ -foreach( $array as &$key => $value ) {} - -/* testArrayValueByReferenceA */ -$a = [ 'a' => &$something ]; - -/* testArrayValueByReferenceB */ -$a = [ 'a' => $something, 'b' => &$somethingElse ]; - -/* testArrayValueByReferenceC */ -$a = [ &$something ]; - -/* testArrayValueByReferenceD */ -$a = [ $something, &$somethingElse ]; - -/* testArrayValueByReferenceE */ -$a = array( 'a' => &$something ); - -/* testArrayValueByReferenceF */ -$a = array( 'a' => $something, 'b' => &$somethingElse ); - -/* testArrayValueByReferenceG */ -$a = array( &$something ); - -/* testArrayValueByReferenceH */ -$a = array( $something, &$somethingElse ); - -/* testAssignByReferenceA */ -$b = &$something; - -/* testAssignByReferenceB */ -$b =& $something; - -/* testAssignByReferenceC */ -$b .= &$something; - -/* testAssignByReferenceD */ -$myValue = &$obj->getValue(); - -/* testAssignByReferenceE */ -$collection = &collector(); - -/* testAssignByReferenceF */ -$collection ??= &collector(); - -/* testShortListAssignByReferenceNoKeyA */ -[ - &$a, - /* testShortListAssignByReferenceNoKeyB */ - &$b, - /* testNestedShortListAssignByReferenceNoKey */ - [$c, &$d] -] = $array; - -/* testLongListAssignByReferenceNoKeyA */ -list($a, &$b, list(/* testLongListAssignByReferenceNoKeyB */ &$c, /* testLongListAssignByReferenceNoKeyC */ &$d)) = $array; - -[ - /* testNestedShortListAssignByReferenceWithKeyA */ - 'a' => [&$a, $b], - /* testNestedShortListAssignByReferenceWithKeyB */ - 'b' => [$c, &$d] -] = $array; - - -/* testLongListAssignByReferenceWithKeyA */ -list(get_key()[1] => &$e) = [1, 2, 3]; - -/* testPassByReferenceA */ -functionCall(&$something, $somethingElse); - -/* testPassByReferenceB */ -functionCall($something, &$somethingElse); - -/* testPassByReferenceC */ -functionCall($something, &$this->somethingElse); - -/* testPassByReferenceD */ -functionCall($something, &self::$somethingElse); - -/* testPassByReferenceE */ -functionCall($something, &parent::$somethingElse); - -/* testPassByReferenceF */ -functionCall($something, &static::$somethingElse); - -/* testPassByReferenceG */ -functionCall($something, &SomeClass::$somethingElse); - -/* testPassByReferenceH */ -functionCall(&\SomeClass::$somethingElse); - -/* testPassByReferenceI */ -functionCall($something, &\SomeNS\SomeClass::$somethingElse); - -/* testPassByReferenceJ */ -functionCall($something, &namespace\SomeClass::$somethingElse); - -/* testPassByReferencePartiallyQualifiedName */ -functionCall($something, &Sub\Level\SomeClass::$somethingElse); - -/* testNewByReferenceA */ -$foobar2 = &new Foobar(); - -/* testNewByReferenceB */ -functionCall( $something , &new Foobar() ); - -/* testUseByReference */ -$closure = function() use (&$var){}; - -/* testUseByReferenceWithCommentFirstParam */ -$closure = function() use /*comment*/ (&$value){}; - -/* testUseByReferenceWithCommentSecondParam */ -$closure = function() use /*comment*/ ($varA, &$varB){}; - -/* testArrowFunctionReturnByReference */ -fn&($x) => $x; - -$closure = function ( - /* testBitwiseAndExactParameterA */ - $a = MY_CONSTANT & parent::OTHER_CONSTANT, - /* testPassByReferenceExactParameterB */ - &$b, - /* testPassByReferenceExactParameterC */ - &...$c, - /* testBitwiseAndExactParameterD */ - $d = E_NOTICE & E_STRICT, -) {}; - -// Issue PHPCS#3049. -/* testArrowFunctionPassByReferenceA */ -$fn = fn(array &$one) => 1; - -/* testArrowFunctionPassByReferenceB */ -$fn = fn($param, &...$moreParams) => 1; - -/* testClosureReturnByReference */ -$closure = function &($param) use ($value) {}; - -/* testBitwiseAndArrowFunctionInDefault */ -$fn = fn( $one = E_NOTICE & E_STRICT) => 1; - -/* testIntersectionIsNotReference */ -function intersect(Foo&Bar $param) {} - -/* testDNFTypeIsNotReference */ -$fn = fn((Foo&\Bar)|null /* testParamPassByReference */ &$param) => $param; - -/* testTokenizerIssue1284PHPCSlt280A */ -if ($foo) {} -[&$a, /* testTokenizerIssue1284PHPCSlt280B */ &$b] = $c; - -/* testTokenizerIssue1284PHPCSlt280C */ -if ($foo) {} -[&$a, $b]; diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/IsReferenceTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/IsReferenceTest.php deleted file mode 100644 index 0d7a570..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Files/File/IsReferenceTest.php +++ /dev/null @@ -1,396 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Files\File; - -use PHP_CodeSniffer\Tests\Core\AbstractMethodUnitTest; - -/** - * Tests for the \PHP_CodeSniffer\Files\File::isReference method. - * - * @covers \PHP_CodeSniffer\Files\File::isReference - */ -final class IsReferenceTest extends AbstractMethodUnitTest -{ - - - /** - * Test that false is returned when a non-"bitwise and" token is passed. - * - * @param string $testMarker Comment which precedes the test case. - * @param array $targetTokens Type of tokens to look for. - * - * @dataProvider dataNotBitwiseAndToken - * - * @return void - */ - public function testNotBitwiseAndToken($testMarker, $targetTokens) - { - $targetTokens[] = T_BITWISE_AND; - - $target = $this->getTargetToken($testMarker, $targetTokens); - $this->assertFalse(self::$phpcsFile->isReference($target)); - - }//end testNotBitwiseAndToken() - - - /** - * Data provider. - * - * @see testNotBitwiseAndToken() - * - * @return array>> - */ - public static function dataNotBitwiseAndToken() - { - return [ - 'Not ampersand token at all' => [ - 'testMarker' => '/* testBitwiseAndA */', - 'targetTokens' => [T_STRING], - ], - 'ampersand in intersection type' => [ - 'testMarker' => '/* testIntersectionIsNotReference */', - 'targetTokens' => [T_TYPE_INTERSECTION], - ], - 'ampersand in DNF type' => [ - 'testMarker' => '/* testDNFTypeIsNotReference */', - 'targetTokens' => [T_TYPE_INTERSECTION], - ], - ]; - - }//end dataNotBitwiseAndToken() - - - /** - * Test correctly identifying whether a "bitwise and" token is a reference or not. - * - * @param string $testMarker Comment which precedes the test case. - * @param bool $expected Expected function output. - * - * @dataProvider dataIsReference - * - * @return void - */ - public function testIsReference($testMarker, $expected) - { - $bitwiseAnd = $this->getTargetToken($testMarker, T_BITWISE_AND); - $result = self::$phpcsFile->isReference($bitwiseAnd); - $this->assertSame($expected, $result); - - }//end testIsReference() - - - /** - * Data provider for the IsReference test. - * - * @see testIsReference() - * - * @return array> - */ - public static function dataIsReference() - { - return [ - 'issue-1971-list-first-in-file' => [ - 'testMarker' => '/* testTokenizerIssue1971PHPCSlt330gt271A */', - 'expected' => true, - ], - 'issue-1971-list-first-in-file-nested' => [ - 'testMarker' => '/* testTokenizerIssue1971PHPCSlt330gt271B */', - 'expected' => true, - ], - 'bitwise and: param in function call' => [ - 'testMarker' => '/* testBitwiseAndA */', - 'expected' => false, - ], - 'bitwise and: in unkeyed short array, first value' => [ - 'testMarker' => '/* testBitwiseAndB */', - 'expected' => false, - ], - 'bitwise and: in unkeyed short array, last value' => [ - 'testMarker' => '/* testBitwiseAndC */', - 'expected' => false, - ], - 'bitwise and: in unkeyed long array, last value' => [ - 'testMarker' => '/* testBitwiseAndD */', - 'expected' => false, - ], - 'bitwise and: in keyed short array, last value' => [ - 'testMarker' => '/* testBitwiseAndE */', - 'expected' => false, - ], - 'bitwise and: in keyed long array, last value' => [ - 'testMarker' => '/* testBitwiseAndF */', - 'expected' => false, - ], - 'bitwise and: in assignment' => [ - 'testMarker' => '/* testBitwiseAndG */', - 'expected' => false, - ], - 'bitwise and: in param default value in function declaration' => [ - 'testMarker' => '/* testBitwiseAndH */', - 'expected' => false, - ], - 'bitwise and: in param default value in closure declaration' => [ - 'testMarker' => '/* testBitwiseAndI */', - 'expected' => false, - ], - 'reference: function declared to return by reference' => [ - 'testMarker' => '/* testFunctionReturnByReference */', - 'expected' => true, - ], - 'reference: only param in function declaration, pass by reference' => [ - 'testMarker' => '/* testFunctionPassByReferenceA */', - 'expected' => true, - ], - 'reference: last param in function declaration, pass by reference' => [ - 'testMarker' => '/* testFunctionPassByReferenceB */', - 'expected' => true, - ], - 'reference: only param in closure declaration, pass by reference' => [ - 'testMarker' => '/* testFunctionPassByReferenceC */', - 'expected' => true, - ], - 'reference: last param in closure declaration, pass by reference' => [ - 'testMarker' => '/* testFunctionPassByReferenceD */', - 'expected' => true, - ], - 'reference: typed param in function declaration, pass by reference' => [ - 'testMarker' => '/* testFunctionPassByReferenceE */', - 'expected' => true, - ], - 'reference: typed param in closure declaration, pass by reference' => [ - 'testMarker' => '/* testFunctionPassByReferenceF */', - 'expected' => true, - ], - 'reference: variadic param in function declaration, pass by reference' => [ - 'testMarker' => '/* testFunctionPassByReferenceG */', - 'expected' => true, - ], - 'reference: foreach value' => [ - 'testMarker' => '/* testForeachValueByReference */', - 'expected' => true, - ], - 'reference: foreach key' => [ - 'testMarker' => '/* testForeachKeyByReference */', - 'expected' => true, - ], - 'reference: keyed short array, first value, value by reference' => [ - 'testMarker' => '/* testArrayValueByReferenceA */', - 'expected' => true, - ], - 'reference: keyed short array, last value, value by reference' => [ - 'testMarker' => '/* testArrayValueByReferenceB */', - 'expected' => true, - ], - 'reference: unkeyed short array, only value, value by reference' => [ - 'testMarker' => '/* testArrayValueByReferenceC */', - 'expected' => true, - ], - 'reference: unkeyed short array, last value, value by reference' => [ - 'testMarker' => '/* testArrayValueByReferenceD */', - 'expected' => true, - ], - 'reference: keyed long array, first value, value by reference' => [ - 'testMarker' => '/* testArrayValueByReferenceE */', - 'expected' => true, - ], - 'reference: keyed long array, last value, value by reference' => [ - 'testMarker' => '/* testArrayValueByReferenceF */', - 'expected' => true, - ], - 'reference: unkeyed long array, only value, value by reference' => [ - 'testMarker' => '/* testArrayValueByReferenceG */', - 'expected' => true, - ], - 'reference: unkeyed long array, last value, value by reference' => [ - 'testMarker' => '/* testArrayValueByReferenceH */', - 'expected' => true, - ], - 'reference: variable, assign by reference' => [ - 'testMarker' => '/* testAssignByReferenceA */', - 'expected' => true, - ], - 'reference: variable, assign by reference, spacing variation' => [ - 'testMarker' => '/* testAssignByReferenceB */', - 'expected' => true, - ], - 'reference: variable, assign by reference, concat assign' => [ - 'testMarker' => '/* testAssignByReferenceC */', - 'expected' => true, - ], - 'reference: property, assign by reference' => [ - 'testMarker' => '/* testAssignByReferenceD */', - 'expected' => true, - ], - 'reference: function return value, assign by reference' => [ - 'testMarker' => '/* testAssignByReferenceE */', - 'expected' => true, - ], - 'reference: function return value, assign by reference, null coalesce assign' => [ - 'testMarker' => '/* testAssignByReferenceF */', - 'expected' => true, - ], - 'reference: unkeyed short list, first var, assign by reference' => [ - 'testMarker' => '/* testShortListAssignByReferenceNoKeyA */', - 'expected' => true, - ], - 'reference: unkeyed short list, second var, assign by reference' => [ - 'testMarker' => '/* testShortListAssignByReferenceNoKeyB */', - 'expected' => true, - ], - 'reference: unkeyed short list, nested var, assign by reference' => [ - 'testMarker' => '/* testNestedShortListAssignByReferenceNoKey */', - 'expected' => true, - ], - 'reference: unkeyed long list, second var, assign by reference' => [ - 'testMarker' => '/* testLongListAssignByReferenceNoKeyA */', - 'expected' => true, - ], - 'reference: unkeyed long list, first nested var, assign by reference' => [ - 'testMarker' => '/* testLongListAssignByReferenceNoKeyB */', - 'expected' => true, - ], - 'reference: unkeyed long list, last nested var, assign by reference' => [ - 'testMarker' => '/* testLongListAssignByReferenceNoKeyC */', - 'expected' => true, - ], - 'reference: keyed short list, first nested var, assign by reference' => [ - 'testMarker' => '/* testNestedShortListAssignByReferenceWithKeyA */', - 'expected' => true, - ], - 'reference: keyed short list, last nested var, assign by reference' => [ - 'testMarker' => '/* testNestedShortListAssignByReferenceWithKeyB */', - 'expected' => true, - ], - 'reference: keyed long list, only var, assign by reference' => [ - 'testMarker' => '/* testLongListAssignByReferenceWithKeyA */', - 'expected' => true, - ], - 'reference: first param in function call, pass by reference' => [ - 'testMarker' => '/* testPassByReferenceA */', - 'expected' => true, - ], - 'reference: last param in function call, pass by reference' => [ - 'testMarker' => '/* testPassByReferenceB */', - 'expected' => true, - ], - 'reference: property in function call, pass by reference' => [ - 'testMarker' => '/* testPassByReferenceC */', - 'expected' => true, - ], - 'reference: hierarchical self property in function call, pass by reference' => [ - 'testMarker' => '/* testPassByReferenceD */', - 'expected' => true, - ], - 'reference: hierarchical parent property in function call, pass by reference' => [ - 'testMarker' => '/* testPassByReferenceE */', - 'expected' => true, - ], - 'reference: hierarchical static property in function call, pass by reference' => [ - 'testMarker' => '/* testPassByReferenceF */', - 'expected' => true, - ], - 'reference: static property in function call, pass by reference' => [ - 'testMarker' => '/* testPassByReferenceG */', - 'expected' => true, - ], - 'reference: static property in function call, first with FQN, pass by reference' => [ - 'testMarker' => '/* testPassByReferenceH */', - 'expected' => true, - ], - 'reference: static property in function call, last with FQN, pass by reference' => [ - 'testMarker' => '/* testPassByReferenceI */', - 'expected' => true, - ], - 'reference: static property in function call, last with namespace relative name, pass by reference' => [ - 'testMarker' => '/* testPassByReferenceJ */', - 'expected' => true, - ], - 'reference: static property in function call, last with PQN, pass by reference' => [ - 'testMarker' => '/* testPassByReferencePartiallyQualifiedName */', - 'expected' => true, - ], - 'reference: new by reference' => [ - 'testMarker' => '/* testNewByReferenceA */', - 'expected' => true, - ], - 'reference: new by reference as function call param' => [ - 'testMarker' => '/* testNewByReferenceB */', - 'expected' => true, - ], - 'reference: closure use by reference' => [ - 'testMarker' => '/* testUseByReference */', - 'expected' => true, - ], - 'reference: closure use by reference, first param, with comment' => [ - 'testMarker' => '/* testUseByReferenceWithCommentFirstParam */', - 'expected' => true, - ], - 'reference: closure use by reference, last param, with comment' => [ - 'testMarker' => '/* testUseByReferenceWithCommentSecondParam */', - 'expected' => true, - ], - 'reference: arrow fn declared to return by reference' => [ - 'testMarker' => '/* testArrowFunctionReturnByReference */', - 'expected' => true, - ], - 'bitwise and: first param default value in closure declaration' => [ - 'testMarker' => '/* testBitwiseAndExactParameterA */', - 'expected' => false, - ], - 'reference: param in closure declaration, pass by reference' => [ - 'testMarker' => '/* testPassByReferenceExactParameterB */', - 'expected' => true, - ], - 'reference: variadic param in closure declaration, pass by reference' => [ - 'testMarker' => '/* testPassByReferenceExactParameterC */', - 'expected' => true, - ], - 'bitwise and: last param default value in closure declaration' => [ - 'testMarker' => '/* testBitwiseAndExactParameterD */', - 'expected' => false, - ], - 'reference: typed param in arrow fn declaration, pass by reference' => [ - 'testMarker' => '/* testArrowFunctionPassByReferenceA */', - 'expected' => true, - ], - 'reference: variadic param in arrow fn declaration, pass by reference' => [ - 'testMarker' => '/* testArrowFunctionPassByReferenceB */', - 'expected' => true, - ], - 'reference: closure declared to return by reference' => [ - 'testMarker' => '/* testClosureReturnByReference */', - 'expected' => true, - ], - 'bitwise and: param default value in arrow fn declaration' => [ - 'testMarker' => '/* testBitwiseAndArrowFunctionInDefault */', - 'expected' => false, - ], - 'reference: param pass by ref in arrow function' => [ - 'testMarker' => '/* testParamPassByReference */', - 'expected' => true, - ], - 'issue-1284-short-list-directly-after-close-curly-control-structure' => [ - 'testMarker' => '/* testTokenizerIssue1284PHPCSlt280A */', - 'expected' => true, - ], - 'issue-1284-short-list-directly-after-close-curly-control-structure-second-item' => [ - 'testMarker' => '/* testTokenizerIssue1284PHPCSlt280B */', - 'expected' => true, - ], - 'issue-1284-short-array-directly-after-close-curly-control-structure' => [ - 'testMarker' => '/* testTokenizerIssue1284PHPCSlt280C */', - 'expected' => true, - ], - ]; - - }//end dataIsReference() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Files/FileList/AbstractFileListTestCase.php b/vendor/squizlabs/php_codesniffer/tests/Core/Files/FileList/AbstractFileListTestCase.php deleted file mode 100644 index 9736f4f..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Files/FileList/AbstractFileListTestCase.php +++ /dev/null @@ -1,55 +0,0 @@ -filter = __DIR__.'/FilterDouble.php'; - self::$ruleset = new Ruleset(self::$config); - } - - }//end initializeConfigAndRuleset() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Files/FileList/AddFileTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Files/FileList/AddFileTest.php deleted file mode 100644 index 96642d4..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Files/FileList/AddFileTest.php +++ /dev/null @@ -1,142 +0,0 @@ -files = []; - $this->fileList = new FileList(self::$config, self::$ruleset); - - }//end initializeFileList() - - - /** - * Test adding a file to the list. - * - * @param string $fileName The name of the file to add. - * @param bool $passFileObject Whether to pass a File object to addFile() or not. - * - * @dataProvider dataAddFile - * - * @return void - */ - public function testAddFile($fileName, $passFileObject=false) - { - $fileObject = null; - - if ($passFileObject === true) { - $fileObject = new File($fileName, self::$ruleset, self::$config); - } - - $this->assertCount(0, $this->fileList); - - $this->fileList->addFile($fileName, $fileObject); - - $fileListArray = iterator_to_array($this->fileList); - - $this->assertCount(1, $this->fileList, 'File count mismatch'); - $this->assertArrayHasKey($fileName, $fileListArray, 'File not found in list'); - - if ($fileObject instanceof File) { - $this->assertSame($fileObject, $fileListArray[$fileName], 'File object mismatch'); - } else { - $this->assertInstanceOf( - 'PHP_CodeSniffer\Files\File', - $fileListArray[$fileName], - 'File object not found in list' - ); - } - - }//end testAddFile() - - - /** - * Data provider for testAddFile. - * - * @return array> - */ - public static function dataAddFile() - { - return [ - 'Regular file' => [ - 'fileName' => 'test1.php', - ], - 'STDIN' => [ - 'fileName' => 'STDIN', - ], - 'Regular file with file object' => [ - 'fileName' => 'test1.php', - 'passFileObject' => true, - ], - ]; - - }//end dataAddFile() - - - /** - * Test that it is not possible to add the same file twice. - * - * @return void - */ - public function testAddFileShouldNotAddTheSameFileTwice() - { - $file1 = 'test1.php'; - $file2 = 'test2.php'; - $expectedFiles = [ - $file1, - $file2, - ]; - - // Add $file1 once. - $this->fileList->addFile($file1); - $this->assertCount(1, $this->fileList); - $this->assertSame([$file1], array_keys(iterator_to_array($this->fileList))); - - // Try to add $file1 again. Should be ignored. - $this->fileList->addFile($file1); - $this->assertCount(1, $this->fileList); - $this->assertSame([$file1], array_keys(iterator_to_array($this->fileList))); - - // Add $file2. Should be added. - $this->fileList->addFile($file2); - $this->assertCount(2, $this->fileList); - $this->assertSame($expectedFiles, array_keys(iterator_to_array($this->fileList))); - - }//end testAddFileShouldNotAddTheSameFileTwice() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Files/FileList/ConstructTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Files/FileList/ConstructTest.php deleted file mode 100644 index a10a69f..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Files/FileList/ConstructTest.php +++ /dev/null @@ -1,122 +0,0 @@ - $files List of file paths in the Config class. - * @param array $expectedFiles List of expected file paths in the FileList. - * - * @dataProvider dataConstruct - * - * @return void - */ - public function testConstruct($files, $expectedFiles) - { - self::$config->files = $files; - - $fileList = new FileList(self::$config, self::$ruleset); - - $this->assertSame(self::$config, $fileList->config, 'Config object mismatch'); - $this->assertSame(self::$ruleset, $fileList->ruleset, 'Ruleset object mismatch'); - - $this->assertCount(count($expectedFiles), $fileList, 'File count mismatch'); - - $i = 0; - - // Sort the values to make the tests stable as different OSes will read directories - // in a different order and the order is not relevant for these tests. Just the values. - $fileListArray = iterator_to_array($fileList); - ksort($fileListArray); - - foreach ($fileListArray as $filePath => $fileObject) { - $this->assertSame( - $expectedFiles[$i], - $filePath, - sprintf('File path mismatch: expected "%s", got "%s"', $expectedFiles[$i], $filePath) - ); - $this->assertInstanceOf( - 'PHP_CodeSniffer\Files\File', - $fileObject, - sprintf('File object for "%s" is not an instance of PHP_CodeSniffer\Files\File', $filePath) - ); - $i++; - } - - }//end testConstruct() - - - /** - * Data provider for testConstruct. - * - * @return array>> - */ - public static function dataConstruct() - { - $fixturesDir = __DIR__.DIRECTORY_SEPARATOR.'Fixtures'.DIRECTORY_SEPARATOR; - - return [ - 'No files' => [ - 'files' => [], - 'expectedFiles' => [], - ], - 'Two files' => [ - 'files' => [ - 'file1.php', - 'file2.php', - ], - 'expectedFiles' => [ - 'file1.php', - 'file2.php', - ], - ], - 'A directory' => [ - 'files' => [$fixturesDir], - 'expectedFiles' => [ - $fixturesDir.'file1.php', - $fixturesDir.'file2.php', - ], - ], - 'Same file twice' => [ - 'files' => [ - 'file1.php', - 'file1.php', - ], - 'expectedFiles' => [ - 'file1.php', - ], - ], - 'File and then directory containing that file' => [ - 'files' => [ - $fixturesDir.'file1.php', - $fixturesDir, - ], - 'expectedFiles' => [ - $fixturesDir.'file1.php', - $fixturesDir.'file2.php', - ], - ], - ]; - - }//end dataConstruct() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Files/FileList/FilterDouble.php b/vendor/squizlabs/php_codesniffer/tests/Core/Files/FileList/FilterDouble.php deleted file mode 100644 index 86df147..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Files/FileList/FilterDouble.php +++ /dev/null @@ -1,31 +0,0 @@ - - * @copyright 2023 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Filters; - -use PHP_CodeSniffer\Filters\Filter; -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Tests\ConfigDouble; -use PHPUnit\Framework\TestCase; -use RecursiveIteratorIterator; - -/** - * Base functionality and utilities for testing Filter classes. - */ -abstract class AbstractFilterTestCase extends TestCase -{ - - /** - * The Config object. - * - * @var \PHP_CodeSniffer\Config - */ - protected static $config; - - /** - * The Ruleset object. - * - * @var \PHP_CodeSniffer\Ruleset - */ - protected static $ruleset; - - - /** - * Initialize the config and ruleset objects. - * - * @beforeClass - * - * @return void - */ - public static function initializeConfigAndRuleset() - { - self::$config = new ConfigDouble(['--extensions=php,inc/php,js,css']); - self::$ruleset = new Ruleset(self::$config); - - }//end initializeConfigAndRuleset() - - - /** - * Clean up after finished test by resetting all static properties on the Config class to their default values. - * - * Note: This is a PHPUnit cross-version compatible {@see \PHPUnit\Framework\TestCase::tearDownAfterClass()} - * method. - * - * @afterClass - * - * @return void - */ - public static function reset() - { - // Explicitly trigger __destruct() on the ConfigDouble to reset the Config statics. - // The explicit method call prevents potential stray test-local references to the $config object - // preventing the destructor from running the clean up (which without stray references would be - // automagically triggered when `self::$phpcsFile` is reset, but we can't definitively rely on that). - if (isset(self::$config) === true) { - self::$config->__destruct(); - } - - }//end reset() - - - /** - * Helper method to retrieve a mock object for a Filter class. - * - * The `setMethods()` method was silently deprecated in PHPUnit 9 and removed in PHPUnit 10. - * - * Note: direct access to the `getMockBuilder()` method is soft deprecated as of PHPUnit 10, - * and expected to be hard deprecated in PHPUnit 11 and removed in PHPUnit 12. - * Dealing with that is something for a later iteration of the test suite. - * - * @param string $className Fully qualified name of the class under test. - * @param array $constructorArgs Optional. Array of parameters to pass to the class constructor. - * @param array|null $methodsToMock Optional. The methods to mock in the class under test. - * Needed for PHPUnit cross-version support as PHPUnit 4.x does - * not have a `setMethodsExcept()` method yet. - * If not passed, no methods will be replaced. - * - * @return \PHPUnit\Framework\MockObject\MockObject - */ - protected function getMockedClass($className, array $constructorArgs=[], $methodsToMock=null) - { - $mockedObj = $this->getMockBuilder($className); - - if (method_exists($mockedObj, 'onlyMethods') === true) { - // PHPUnit 8+. - if (is_array($methodsToMock) === true) { - return $mockedObj - ->setConstructorArgs($constructorArgs) - ->onlyMethods($methodsToMock) - ->getMock(); - } - - return $mockedObj->getMock() - ->setConstructorArgs($constructorArgs); - } - - // PHPUnit < 8. - return $mockedObj - ->setConstructorArgs($constructorArgs) - ->setMethods($methodsToMock) - ->getMock(); - - }//end getMockedClass() - - - /** - * Retrieve an array of files which were accepted by a filter. - * - * @param \PHP_CodeSniffer\Filters\Filter $filter The Filter object under test. - * - * @return array - */ - protected function getFilteredResultsAsArray(Filter $filter) - { - $iterator = new RecursiveIteratorIterator($filter); - $files = []; - foreach ($iterator as $file) { - $files[] = $file; - } - - return $files; - - }//end getFilteredResultsAsArray() - - - /** - * Retrieve the basedir to use for tests using the `getFakeFileList()` method. - * - * @return string - */ - protected static function getBaseDir() - { - return dirname(dirname(dirname(__DIR__))); - - }//end getBaseDir() - - - /** - * Retrieve a file list containing a range of paths for testing purposes. - * - * This list **must** contain files which exist in this project (well, except for some which don't exist - * purely for testing purposes), as `realpath()` is used in the logic under test and `realpath()` will - * return `false` for any non-existent files, which will automatically filter them out before - * we get to the code under test. - * - * Note this list does not include `.` and `..` as \PHP_CodeSniffer\Files\FileList uses `SKIP_DOTS`. - * - * @return array - */ - protected static function getFakeFileList() - { - $basedir = self::getBaseDir(); - return [ - $basedir.'/.gitignore', - $basedir.'/.yamllint.yml', - $basedir.'/phpcs.xml', - $basedir.'/phpcs.xml.dist', - $basedir.'/autoload.php', - $basedir.'/bin', - $basedir.'/bin/phpcs', - $basedir.'/bin/phpcs.bat', - $basedir.'/scripts', - $basedir.'/scripts/build-phar.php', - $basedir.'/src', - $basedir.'/src/WillNotExist.php', - $basedir.'/src/WillNotExist.bak', - $basedir.'/src/WillNotExist.orig', - $basedir.'/src/Ruleset.php', - $basedir.'/src/Generators', - $basedir.'/src/Generators/Markdown.php', - $basedir.'/src/Standards', - $basedir.'/src/Standards/Generic', - $basedir.'/src/Standards/Generic/Docs', - $basedir.'/src/Standards/Generic/Docs/Classes', - $basedir.'/src/Standards/Generic/Docs/Classes/DuplicateClassNameStandard.xml', - $basedir.'/src/Standards/Generic/Sniffs', - $basedir.'/src/Standards/Generic/Sniffs/Classes', - $basedir.'/src/Standards/Generic/Sniffs/Classes/DuplicateClassNameSniff.php', - $basedir.'/src/Standards/Generic/Tests', - $basedir.'/src/Standards/Generic/Tests/Classes', - $basedir.'/src/Standards/Generic/Tests/Classes/DuplicateClassNameUnitTest.1.inc', - // Will rarely exist when running the tests. - $basedir.'/src/Standards/Generic/Tests/Classes/DuplicateClassNameUnitTest.1.inc.bak', - $basedir.'/src/Standards/Generic/Tests/Classes/DuplicateClassNameUnitTest.2.inc', - $basedir.'/src/Standards/Generic/Tests/Classes/DuplicateClassNameUnitTest.php', - $basedir.'/src/Standards/Squiz', - $basedir.'/src/Standards/Squiz/Docs', - $basedir.'/src/Standards/Squiz/Docs/WhiteSpace', - $basedir.'/src/Standards/Squiz/Docs/WhiteSpace/SemicolonSpacingStandard.xml', - $basedir.'/src/Standards/Squiz/Sniffs', - $basedir.'/src/Standards/Squiz/Sniffs/WhiteSpace', - $basedir.'/src/Standards/Squiz/Sniffs/WhiteSpace/OperatorSpacingSniff.php', - $basedir.'/src/Standards/Squiz/Tests', - $basedir.'/src/Standards/Squiz/Tests/WhiteSpace', - $basedir.'/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.1.inc', - $basedir.'/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.1.inc.fixed', - $basedir.'/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.js', - $basedir.'/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.js.fixed', - $basedir.'/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.php', - ]; - - }//end getFakeFileList() - - - /** - * Translate Linux paths to Windows paths, when necessary. - * - * These type of tests should be able to run and pass on both *nix as well as Windows - * based dev systems. This method is a helper to allow for this. - * - * @param array> $paths A single or multi-dimensional array containing - * file paths. - * - * @return array> - */ - protected static function mapPathsToRuntimeOs(array $paths) - { - if (DIRECTORY_SEPARATOR !== '\\') { - return $paths; - } - - foreach ($paths as $key => $value) { - if (is_string($value) === true) { - $paths[$key] = strtr($value, '/', '\\\\'); - } else if (is_array($value) === true) { - $paths[$key] = self::mapPathsToRuntimeOs($value); - } - } - - return $paths; - - }//end mapPathsToRuntimeOs() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Filters/Filter/AcceptTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Filters/Filter/AcceptTest.php deleted file mode 100644 index ab33464..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Filters/Filter/AcceptTest.php +++ /dev/null @@ -1,110 +0,0 @@ - - * @author Juliette Reinders Folmer - * @copyright 2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Filters\Filter; - -use PHP_CodeSniffer\Filters\Filter; -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Tests\ConfigDouble; -use PHP_CodeSniffer\Tests\Core\Filters\AbstractFilterTestCase; -use RecursiveArrayIterator; - -/** - * Tests for the \PHP_CodeSniffer\Filters\Filter::accept method. - * - * @covers \PHP_CodeSniffer\Filters\Filter - */ -final class AcceptTest extends AbstractFilterTestCase -{ - - - /** - * Initialize the config and ruleset objects based on the `AcceptTest.xml` ruleset file. - * - * @beforeClass - * - * @return void - */ - public static function initializeConfigAndRuleset() - { - $standard = __DIR__.'/'.basename(__FILE__, '.php').'.xml'; - self::$config = new ConfigDouble(["--standard=$standard", '--ignore=*/somethingelse/*']); - self::$ruleset = new Ruleset(self::$config); - - }//end initializeConfigAndRuleset() - - - /** - * Test filtering a file list for excluded paths. - * - * @param array $inputPaths List of file paths to be filtered. - * @param array $expectedOutput Expected filtering result. - * - * @dataProvider dataExcludePatterns - * - * @return void - */ - public function testExcludePatterns($inputPaths, $expectedOutput) - { - $fakeDI = new RecursiveArrayIterator($inputPaths); - $filter = new Filter($fakeDI, '/', self::$config, self::$ruleset); - - $this->assertSame($expectedOutput, $this->getFilteredResultsAsArray($filter)); - - }//end testExcludePatterns() - - - /** - * Data provider. - * - * @see testExcludePatterns - * - * @return array>> - */ - public static function dataExcludePatterns() - { - $testCases = [ - // Test top-level exclude patterns. - 'Non-sniff specific path based excludes from ruleset and command line are respected and don\'t filter out too much' => [ - 'inputPaths' => [ - '/path/to/src/Main.php', - '/path/to/src/Something/Main.php', - '/path/to/src/Somethingelse/Main.php', - '/path/to/src/SomethingelseEvenLonger/Main.php', - '/path/to/src/Other/Main.php', - ], - 'expectedOutput' => [ - '/path/to/src/Main.php', - '/path/to/src/SomethingelseEvenLonger/Main.php', - ], - ], - - // Test ignoring standard/sniff specific exclude patterns. - 'Filter should not act on standard/sniff specific exclude patterns' => [ - 'inputPaths' => [ - '/path/to/src/generic-project/Main.php', - '/path/to/src/generic/Main.php', - '/path/to/src/anything-generic/Main.php', - ], - 'expectedOutput' => [ - '/path/to/src/generic-project/Main.php', - '/path/to/src/generic/Main.php', - '/path/to/src/anything-generic/Main.php', - ], - ], - ]; - - // Allow these tests to work on Windows as well. - return self::mapPathsToRuntimeOs($testCases); - - }//end dataExcludePatterns() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Filters/Filter/AcceptTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Filters/Filter/AcceptTest.xml deleted file mode 100644 index 2800298..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Filters/Filter/AcceptTest.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - Ruleset to test the filtering based on exclude patterns. - - - */something/* - - */Other/Main\.php$ - - - - - - /anything/* - - /YetAnother/Main\.php - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Filters/GitModifiedTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Filters/GitModifiedTest.php deleted file mode 100644 index e13025f..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Filters/GitModifiedTest.php +++ /dev/null @@ -1,273 +0,0 @@ - - * @copyright 2023 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Filters; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Filters\GitModified; -use PHP_CodeSniffer\Tests\Core\Filters\AbstractFilterTestCase; -use RecursiveArrayIterator; -use ReflectionMethod; - -/** - * Tests for the \PHP_CodeSniffer\Filters\GitModified class. - * - * @covers \PHP_CodeSniffer\Filters\GitModified - */ -final class GitModifiedTest extends AbstractFilterTestCase -{ - - - /** - * Test filtering a file list for excluded paths. - * - * @return void - */ - public function testFileNamePassesAsBasePathWillTranslateToDirname() - { - $rootFile = self::getBaseDir().'/autoload.php'; - - $fakeDI = new RecursiveArrayIterator(self::getFakeFileList()); - $constructorArgs = [ - $fakeDI, - $rootFile, - self::$config, - self::$ruleset, - ]; - $mockObj = $this->getMockedClass('PHP_CodeSniffer\Filters\GitModified', $constructorArgs, ['exec']); - - $mockObj->expects($this->once()) - ->method('exec') - ->willReturn(['autoload.php']); - - $this->assertSame([$rootFile], $this->getFilteredResultsAsArray($mockObj)); - - }//end testFileNamePassesAsBasePathWillTranslateToDirname() - - - /** - * Test filtering a file list for excluded paths. - * - * @param array $inputPaths List of file paths to be filtered. - * @param array $outputGitModified Simulated "git modified" output. - * @param array $expectedOutput Expected filtering result. - * - * @dataProvider dataAcceptOnlyGitModified - * - * @return void - */ - public function testAcceptOnlyGitModified($inputPaths, $outputGitModified, $expectedOutput) - { - $fakeDI = new RecursiveArrayIterator($inputPaths); - $constructorArgs = [ - $fakeDI, - self::getBaseDir(), - self::$config, - self::$ruleset, - ]; - $mockObj = $this->getMockedClass('PHP_CodeSniffer\Filters\GitModified', $constructorArgs, ['exec']); - - $mockObj->expects($this->once()) - ->method('exec') - ->willReturn($outputGitModified); - - $this->assertSame($expectedOutput, $this->getFilteredResultsAsArray($mockObj)); - - }//end testAcceptOnlyGitModified() - - - /** - * Data provider. - * - * @see testAcceptOnlyGitModified - * - * @return array>> - */ - public static function dataAcceptOnlyGitModified() - { - $basedir = self::getBaseDir(); - $fakeFileList = self::getFakeFileList(); - - $testCases = [ - 'no files marked as git modified' => [ - 'inputPaths' => $fakeFileList, - 'outputGitModified' => [], - 'expectedOutput' => [], - ], - - 'files marked as git modified which don\'t actually exist' => [ - 'inputPaths' => $fakeFileList, - 'outputGitModified' => [ - 'src/WillNotExist.php', - 'src/WillNotExist.bak', - 'src/WillNotExist.orig', - ], - 'expectedOutput' => [], - ], - - 'single file marked as git modified - file in root dir' => [ - 'inputPaths' => $fakeFileList, - 'outputGitModified' => [ - 'autoload.php', - ], - 'expectedOutput' => [ - $basedir.'/autoload.php', - ], - ], - 'single file marked as git modified - file in sub dir' => [ - 'inputPaths' => $fakeFileList, - 'outputGitModified' => [ - 'src/Standards/Generic/Sniffs/Classes/DuplicateClassNameSniff.php', - ], - 'expectedOutput' => [ - $basedir.'/src', - $basedir.'/src/Standards', - $basedir.'/src/Standards/Generic', - $basedir.'/src/Standards/Generic/Sniffs', - $basedir.'/src/Standards/Generic/Sniffs/Classes', - $basedir.'/src/Standards/Generic/Sniffs/Classes/DuplicateClassNameSniff.php', - ], - ], - - 'multiple files marked as git modified, none valid for scan' => [ - 'inputPaths' => $fakeFileList, - 'outputGitModified' => [ - '.gitignore', - 'phpcs.xml.dist', - 'src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.js.fixed', - ], - 'expectedOutput' => [ - $basedir.'/src', - $basedir.'/src/Standards', - $basedir.'/src/Standards/Squiz', - $basedir.'/src/Standards/Squiz/Tests', - $basedir.'/src/Standards/Squiz/Tests/WhiteSpace', - ], - ], - - 'multiple files marked as git modified, only one file valid for scan' => [ - 'inputPaths' => $fakeFileList, - 'outputGitModified' => [ - '.gitignore', - 'src/Standards/Generic/Docs/Classes/DuplicateClassNameStandard.xml', - 'src/Standards/Generic/Sniffs/Classes/DuplicateClassNameSniff.php', - ], - 'expectedOutput' => [ - $basedir.'/src', - $basedir.'/src/Standards', - $basedir.'/src/Standards/Generic', - $basedir.'/src/Standards/Generic/Docs', - $basedir.'/src/Standards/Generic/Docs/Classes', - $basedir.'/src/Standards/Generic/Sniffs', - $basedir.'/src/Standards/Generic/Sniffs/Classes', - $basedir.'/src/Standards/Generic/Sniffs/Classes/DuplicateClassNameSniff.php', - ], - ], - - 'multiple files marked as git modified, multiple files valid for scan' => [ - 'inputPaths' => $fakeFileList, - 'outputGitModified' => [ - '.yamllint.yml', - 'autoload.php', - 'src/Standards/Squiz/Sniffs/WhiteSpace/OperatorSpacingSniff.php', - 'src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.1.inc', - 'src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.1.inc.fixed', - 'src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.js', - 'src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.js.fixed', - 'src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.php', - ], - 'expectedOutput' => [ - $basedir.'/autoload.php', - $basedir.'/src', - $basedir.'/src/Standards', - $basedir.'/src/Standards/Squiz', - $basedir.'/src/Standards/Squiz/Sniffs', - $basedir.'/src/Standards/Squiz/Sniffs/WhiteSpace', - $basedir.'/src/Standards/Squiz/Sniffs/WhiteSpace/OperatorSpacingSniff.php', - $basedir.'/src/Standards/Squiz/Tests', - $basedir.'/src/Standards/Squiz/Tests/WhiteSpace', - $basedir.'/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.1.inc', - $basedir.'/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.js', - $basedir.'/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.php', - ], - ], - ]; - - return $testCases; - - }//end dataAcceptOnlyGitModified() - - - /** - * Test filtering a file list for excluded paths. - * - * @param string $cmd Command to run. - * @param array $expected Expected return value. - * - * @dataProvider dataExecAlwaysReturnsArray - * - * @return void - */ - public function testExecAlwaysReturnsArray($cmd, $expected) - { - if (is_dir(__DIR__.'/../../../.git') === false) { - $this->markTestSkipped('Not a git repository'); - } - - if (Config::getExecutablePath('git') === null) { - $this->markTestSkipped('git command not available'); - } - - $fakeDI = new RecursiveArrayIterator(self::getFakeFileList()); - $filter = new GitModified($fakeDI, '/', self::$config, self::$ruleset); - - $reflMethod = new ReflectionMethod($filter, 'exec'); - (PHP_VERSION_ID < 80100) && $reflMethod->setAccessible(true); - $result = $reflMethod->invoke($filter, $cmd); - - $this->assertSame($expected, $result); - - }//end testExecAlwaysReturnsArray() - - - /** - * Data provider. - * - * @see testExecAlwaysReturnsArray - * - * {@internal Missing: test with a command which yields a `false` return value. - * JRF: I've not managed to find a command which does so, let alone one, which then - * doesn't have side-effects of uncatchable output while running the tests.} - * - * @return array>> - */ - public static function dataExecAlwaysReturnsArray() - { - return [ - 'valid command which won\'t have any output unless files in the bin dir have been modified' => [ - // Largely using the command used in the filter, but only checking the bin dir. - // This should prevent the test unexpectedly failing during local development (in most cases). - 'cmd' => 'git ls-files -o -m --exclude-standard -- '.escapeshellarg(self::getBaseDir().'/bin'), - 'expected' => [], - ], - 'valid command which will have output' => [ - 'cmd' => 'git ls-files --exclude-standard -- '.escapeshellarg(self::getBaseDir().'/bin'), - 'expected' => [ - 'bin/phpcbf', - 'bin/phpcbf.bat', - 'bin/phpcs', - 'bin/phpcs.bat', - ], - ], - ]; - - }//end dataExecAlwaysReturnsArray() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Filters/GitStagedTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Filters/GitStagedTest.php deleted file mode 100644 index b4b5110..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Filters/GitStagedTest.php +++ /dev/null @@ -1,273 +0,0 @@ - - * @copyright 2023 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Filters; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Filters\GitStaged; -use PHP_CodeSniffer\Tests\Core\Filters\AbstractFilterTestCase; -use RecursiveArrayIterator; -use ReflectionMethod; - -/** - * Tests for the \PHP_CodeSniffer\Filters\GitStaged class. - * - * @covers \PHP_CodeSniffer\Filters\GitStaged - */ -final class GitStagedTest extends AbstractFilterTestCase -{ - - - /** - * Test filtering a file list for excluded paths. - * - * @return void - */ - public function testFileNamePassesAsBasePathWillTranslateToDirname() - { - $rootFile = self::getBaseDir().'/autoload.php'; - - $fakeDI = new RecursiveArrayIterator(self::getFakeFileList()); - $constructorArgs = [ - $fakeDI, - $rootFile, - self::$config, - self::$ruleset, - ]; - $mockObj = $this->getMockedClass('PHP_CodeSniffer\Filters\GitStaged', $constructorArgs, ['exec']); - - $mockObj->expects($this->once()) - ->method('exec') - ->willReturn(['autoload.php']); - - $this->assertSame([$rootFile], $this->getFilteredResultsAsArray($mockObj)); - - }//end testFileNamePassesAsBasePathWillTranslateToDirname() - - - /** - * Test filtering a file list for excluded paths. - * - * @param array $inputPaths List of file paths to be filtered. - * @param array $outputGitStaged Simulated "git staged" output. - * @param array $expectedOutput Expected filtering result. - * - * @dataProvider dataAcceptOnlyGitStaged - * - * @return void - */ - public function testAcceptOnlyGitStaged($inputPaths, $outputGitStaged, $expectedOutput) - { - $fakeDI = new RecursiveArrayIterator($inputPaths); - $constructorArgs = [ - $fakeDI, - self::getBaseDir(), - self::$config, - self::$ruleset, - ]; - $mockObj = $this->getMockedClass('PHP_CodeSniffer\Filters\GitStaged', $constructorArgs, ['exec']); - - $mockObj->expects($this->once()) - ->method('exec') - ->willReturn($outputGitStaged); - - $this->assertSame($expectedOutput, $this->getFilteredResultsAsArray($mockObj)); - - }//end testAcceptOnlyGitStaged() - - - /** - * Data provider. - * - * @see testAcceptOnlyGitStaged - * - * @return array>> - */ - public static function dataAcceptOnlyGitStaged() - { - $basedir = self::getBaseDir(); - $fakeFileList = self::getFakeFileList(); - - $testCases = [ - 'no files marked as git modified' => [ - 'inputPaths' => $fakeFileList, - 'outputGitStaged' => [], - 'expectedOutput' => [], - ], - - 'files marked as git modified which don\'t actually exist' => [ - 'inputPaths' => $fakeFileList, - 'outputGitStaged' => [ - 'src/WillNotExist.php', - 'src/WillNotExist.bak', - 'src/WillNotExist.orig', - ], - 'expectedOutput' => [], - ], - - 'single file marked as git modified - file in root dir' => [ - 'inputPaths' => $fakeFileList, - 'outputGitStaged' => [ - 'autoload.php', - ], - 'expectedOutput' => [ - $basedir.'/autoload.php', - ], - ], - 'single file marked as git modified - file in sub dir' => [ - 'inputPaths' => $fakeFileList, - 'outputGitStaged' => [ - 'src/Standards/Generic/Sniffs/Classes/DuplicateClassNameSniff.php', - ], - 'expectedOutput' => [ - $basedir.'/src', - $basedir.'/src/Standards', - $basedir.'/src/Standards/Generic', - $basedir.'/src/Standards/Generic/Sniffs', - $basedir.'/src/Standards/Generic/Sniffs/Classes', - $basedir.'/src/Standards/Generic/Sniffs/Classes/DuplicateClassNameSniff.php', - ], - ], - - 'multiple files marked as git modified, none valid for scan' => [ - 'inputPaths' => $fakeFileList, - 'outputGitStaged' => [ - '.gitignore', - 'phpcs.xml.dist', - 'src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.js.fixed', - ], - 'expectedOutput' => [ - $basedir.'/src', - $basedir.'/src/Standards', - $basedir.'/src/Standards/Squiz', - $basedir.'/src/Standards/Squiz/Tests', - $basedir.'/src/Standards/Squiz/Tests/WhiteSpace', - ], - ], - - 'multiple files marked as git modified, only one file valid for scan' => [ - 'inputPaths' => $fakeFileList, - 'outputGitStaged' => [ - '.gitignore', - 'src/Standards/Generic/Docs/Classes/DuplicateClassNameStandard.xml', - 'src/Standards/Generic/Sniffs/Classes/DuplicateClassNameSniff.php', - ], - 'expectedOutput' => [ - $basedir.'/src', - $basedir.'/src/Standards', - $basedir.'/src/Standards/Generic', - $basedir.'/src/Standards/Generic/Docs', - $basedir.'/src/Standards/Generic/Docs/Classes', - $basedir.'/src/Standards/Generic/Sniffs', - $basedir.'/src/Standards/Generic/Sniffs/Classes', - $basedir.'/src/Standards/Generic/Sniffs/Classes/DuplicateClassNameSniff.php', - ], - ], - - 'multiple files marked as git modified, multiple files valid for scan' => [ - 'inputPaths' => $fakeFileList, - 'outputGitStaged' => [ - '.yamllint.yml', - 'autoload.php', - 'src/Standards/Squiz/Sniffs/WhiteSpace/OperatorSpacingSniff.php', - 'src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.1.inc', - 'src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.1.inc.fixed', - 'src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.js', - 'src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.js.fixed', - 'src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.php', - ], - 'expectedOutput' => [ - $basedir.'/autoload.php', - $basedir.'/src', - $basedir.'/src/Standards', - $basedir.'/src/Standards/Squiz', - $basedir.'/src/Standards/Squiz/Sniffs', - $basedir.'/src/Standards/Squiz/Sniffs/WhiteSpace', - $basedir.'/src/Standards/Squiz/Sniffs/WhiteSpace/OperatorSpacingSniff.php', - $basedir.'/src/Standards/Squiz/Tests', - $basedir.'/src/Standards/Squiz/Tests/WhiteSpace', - $basedir.'/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.1.inc', - $basedir.'/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.js', - $basedir.'/src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.php', - ], - ], - ]; - - return $testCases; - - }//end dataAcceptOnlyGitStaged() - - - /** - * Test filtering a file list for excluded paths. - * - * @param string $cmd Command to run. - * @param array $expected Expected return value. - * - * @dataProvider dataExecAlwaysReturnsArray - * - * @return void - */ - public function testExecAlwaysReturnsArray($cmd, $expected) - { - if (is_dir(__DIR__.'/../../../.git') === false) { - $this->markTestSkipped('Not a git repository'); - } - - if (Config::getExecutablePath('git') === null) { - $this->markTestSkipped('git command not available'); - } - - $fakeDI = new RecursiveArrayIterator(self::getFakeFileList()); - $filter = new GitStaged($fakeDI, '/', self::$config, self::$ruleset); - - $reflMethod = new ReflectionMethod($filter, 'exec'); - (PHP_VERSION_ID < 80100) && $reflMethod->setAccessible(true); - $result = $reflMethod->invoke($filter, $cmd); - - $this->assertSame($expected, $result); - - }//end testExecAlwaysReturnsArray() - - - /** - * Data provider. - * - * @see testExecAlwaysReturnsArray - * - * {@internal Missing: test with a command which yields a `false` return value. - * JRF: I've not managed to find a command which does so, let alone one, which then - * doesn't have side-effects of uncatchable output while running the tests.} - * - * @return array>> - */ - public static function dataExecAlwaysReturnsArray() - { - return [ - 'valid command which won\'t have any output unless files in the bin dir have been modified & staged' => [ - // Largely using the command used in the filter, but only checking the bin dir. - // This should prevent the test unexpectedly failing during local development (in most cases). - 'cmd' => 'git diff --cached --name-only -- '.escapeshellarg(self::getBaseDir().'/bin'), - 'expected' => [], - ], - 'valid command which will have output' => [ - 'cmd' => 'git ls-files --exclude-standard -- '.escapeshellarg(self::getBaseDir().'/bin'), - 'expected' => [ - 'bin/phpcbf', - 'bin/phpcbf.bat', - 'bin/phpcs', - 'bin/phpcs.bat', - ], - ], - ]; - - }//end dataExecAlwaysReturnsArray() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Fixer/FixFileReturnValueAllGoodTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Fixer/FixFileReturnValueAllGoodTest.xml deleted file mode 100644 index f71fd56..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Fixer/FixFileReturnValueAllGoodTest.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Fixer/FixFileReturnValueConflictTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Fixer/FixFileReturnValueConflictTest.xml deleted file mode 100644 index 732cfc5..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Fixer/FixFileReturnValueConflictTest.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Fixer/FixFileReturnValueNotEnoughLoopsTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Fixer/FixFileReturnValueNotEnoughLoopsTest.xml deleted file mode 100644 index 9072dd7..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Fixer/FixFileReturnValueNotEnoughLoopsTest.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Fixer/FixFileReturnValueTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Fixer/FixFileReturnValueTest.php deleted file mode 100644 index e005814..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Fixer/FixFileReturnValueTest.php +++ /dev/null @@ -1,89 +0,0 @@ -process(); - $fixed = $phpcsFile->fixer->fixFile(); - - $this->assertTrue($fixed); - - }//end testReturnValueIsTrueWhenFileWasFixed() - - - /** - * Test that the return value of the fixFile() method is false when the file failed to make all fixes. - * - * @param string $standard The ruleset file to use for the test. - * - * @dataProvider dataReturnValueIsFalse - * - * @return void - */ - public function testReturnValueIsFalse($standard) - { - $config = new ConfigDouble(["--standard=$standard"]); - $ruleset = new Ruleset($config); - - $testCaseFile = __DIR__.'/Fixtures/test.inc'; - $phpcsFile = new LocalFile($testCaseFile, $ruleset, $config); - $phpcsFile->process(); - $fixed = $phpcsFile->fixer->fixFile(); - - $this->assertFalse($fixed); - - }//end testReturnValueIsFalse() - - - /** - * Data provider. - * - * @return array> - */ - public static function dataReturnValueIsFalse() - { - return [ - 'when there is a fixer conflict' => [ - 'standard' => __DIR__.'/FixFileReturnValueConflictTest.xml', - ], - 'when the fixer ran out of loops before all fixes could be applied' => [ - 'standard' => __DIR__.'/FixFileReturnValueNotEnoughLoopsTest.xml', - ], - ]; - - }//end dataReturnValueIsFalse() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/GenerateDiffTest-BlankLinesAtEnd.diff b/vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/GenerateDiffTest-BlankLinesAtEnd.diff deleted file mode 100644 index b9a217e..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/GenerateDiffTest-BlankLinesAtEnd.diff +++ /dev/null @@ -1,10 +0,0 @@ ---- tests/Core/Fixer/Fixtures/GenerateDiffTest-BlankLinesAtEnd.inc -+++ PHP_CodeSniffer -@@ -5,7 +5,3 @@ - if ($var) { - echo 'This line is tab indented'; - } -- -- -- -- diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/GenerateDiffTest-BlankLinesAtEnd.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/GenerateDiffTest-BlankLinesAtEnd.inc deleted file mode 100644 index 2e65b2b..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/GenerateDiffTest-BlankLinesAtEnd.inc +++ /dev/null @@ -1,11 +0,0 @@ -getTokens(); - - if ($tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE - || $tokens[($stackPtr + 1)]['length'] > 51 - ) { - return; - } - - $error = 'There should be 52 spaces after an ECHO keyword'; - $fix = $phpcsFile->addFixableError($error, ($stackPtr + 1), 'ShortSpace'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($stackPtr + 1), str_repeat(' ', 52)); - } - } -} diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/TestStandard/Sniffs/FixFileReturnValue/ConflictSniff.php b/vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/TestStandard/Sniffs/FixFileReturnValue/ConflictSniff.php deleted file mode 100644 index ca7afb9..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/TestStandard/Sniffs/FixFileReturnValue/ConflictSniff.php +++ /dev/null @@ -1,101 +0,0 @@ -getTokens(); - - // Demand a blank line after the PHP open tag. - // This error is here to ensure something will be fixed in the file. - $nextNonWhitespace = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - - if (($tokens[$nextNonWhitespace]['line'] - $tokens[$stackPtr]['line']) !== 2) { - $error = 'There must be a single blank line after the PHP open tag'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'BlankLineAfterOpen'); - if ($fix === true) { - $phpcsFile->fixer->addNewline($stackPtr); - - // This return is here deliberately to force a new loop. - // This should ensure that loop 50 does *NOT* apply any fixes. - return; - } - } - - // Skip to the end of the file. - $stackPtr = ($phpcsFile->numTokens - 1); - - $eolCharLen = strlen($phpcsFile->eolChar); - $lastChars = substr($tokens[$stackPtr]['content'], ($eolCharLen * -1)); - - // Demand a newline at the end of a file. - if ($lastChars !== $phpcsFile->eolChar) { - $error = 'File must end with a newline character'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoNewlineEOF'); - if ($fix === true) { - $phpcsFile->fixer->addNewline($stackPtr); - } - } - - // Demand NO newline at the end of a file. - if ($lastChars === $phpcsFile->eolChar) { - $error = 'File must not end with a newline character'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NewlineEOF'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - - for ($i = $stackPtr; $i > 0; $i--) { - $newContent = rtrim($tokens[$i]['content'], $phpcsFile->eolChar); - $phpcsFile->fixer->replaceToken($i, $newContent); - - if ($newContent !== '') { - break; - } - } - - $phpcsFile->fixer->endChangeset(); - } - } - - // Ignore the rest of the file. - return $phpcsFile->numTokens; - } -} diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/TestStandard/Sniffs/FixFileReturnValue/NotEnoughLoopsSniff.php b/vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/TestStandard/Sniffs/FixFileReturnValue/NotEnoughLoopsSniff.php deleted file mode 100644 index e42d3fd..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/TestStandard/Sniffs/FixFileReturnValue/NotEnoughLoopsSniff.php +++ /dev/null @@ -1,40 +0,0 @@ -getTokens(); - - if ($tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE - || $tokens[($stackPtr + 1)]['length'] > 60 - ) { - return; - } - - $error = 'There should be 60 spaces after an ECHO keyword'; - $fix = $phpcsFile->addFixableError($error, ($stackPtr + 1), 'ShortSpace'); - if ($fix === true) { - // The fixer deliberately only adds one space in each loop to ensure it runs out of loops before the file complies. - $phpcsFile->fixer->addContent($stackPtr, ' '); - } - } -} diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/TestStandard/ruleset.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/TestStandard/ruleset.xml deleted file mode 100644 index 6a202de..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/TestStandard/ruleset.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/test.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/test.inc deleted file mode 100644 index 76195b0..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Fixer/Fixtures/test.inc +++ /dev/null @@ -1,2 +0,0 @@ - - * @copyright 2024 Juliette Reinders Folmer. All rights reserved. - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Fixer; - -use PHP_CodeSniffer\Files\LocalFile; -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Tests\ConfigDouble; -use PHPUnit\Framework\TestCase; - -/** - * Tests for diff generation. - * - * Note: these tests are specifically about the Fixer::generateDiff() method and do not - * test running the fixer itself, nor generating a diff based on a fixer run. - * - * @covers PHP_CodeSniffer\Fixer::generateDiff - * @group Windows - */ -final class GenerateDiffTest extends TestCase -{ - - /** - * A \PHP_CodeSniffer\Files\File object to compare the files against. - * - * @var \PHP_CodeSniffer\Files\LocalFile - */ - private static $phpcsFile; - - - /** - * Initialize an \PHP_CodeSniffer\Files\File object with code. - * - * Things to take note of in the code snippet used for these tests: - * - Line endings are \n. - * - Tab indent. - * - Trailing whitespace. - * - * Also note that the Config object is deliberately created without a `tabWidth` setting to - * prevent doing tab replacement when parsing the file. This is to allow for testing a - * diff with tabs vs spaces (which wouldn't yield a diff if tabs had already been replaced). - * - * @beforeClass - * - * @return void - */ - public static function initializeFile() - { - $config = new ConfigDouble(); - $ruleset = new Ruleset($config); - - self::$phpcsFile = new LocalFile(__DIR__.'/Fixtures/GenerateDiffTest.inc', $ruleset, $config); - self::$phpcsFile->parse(); - self::$phpcsFile->fixer->startFile(self::$phpcsFile); - - }//end initializeFile() - - - /** - * Test generating a diff on the file object itself. - * - * @return void - */ - public function testGenerateDiffNoFile() - { - $diff = self::$phpcsFile->fixer->generateDiff(null, false); - - $this->assertSame('', $diff); - - }//end testGenerateDiffNoFile() - - - /** - * Test generating a diff between a PHPCS File object and a file on disk. - * - * @param string $filePath The path to the file to compare the File object against. - * - * @dataProvider dataGenerateDiff - * - * @return void - */ - public function testGenerateDiff($filePath) - { - $diff = self::$phpcsFile->fixer->generateDiff($filePath, false); - - // Allow for the tests to pass on Windows too. - $diff = str_replace('--- tests\Core\Fixer/', '--- tests/Core/Fixer/', $diff); - - $expectedDiffFile = str_replace('.inc', '.diff', $filePath); - - $this->assertStringEqualsFile($expectedDiffFile, $diff); - - }//end testGenerateDiff() - - - /** - * Data provider. - * - * @see testGenerateDiff() - * - * @return array> - */ - public static function dataGenerateDiff() - { - return [ - 'no difference' => [ - 'filePath' => __DIR__.'/Fixtures/GenerateDiffTest-NoDiff.inc', - ], - 'line removed' => [ - 'filePath' => __DIR__.'/Fixtures/GenerateDiffTest-LineRemoved.inc', - ], - 'line added' => [ - 'filePath' => __DIR__.'/Fixtures/GenerateDiffTest-LineAdded.inc', - ], - 'var name changed' => [ - 'filePath' => __DIR__.'/Fixtures/GenerateDiffTest-VarNameChanged.inc', - ], - 'trailing whitespace removed' => [ - 'filePath' => __DIR__.'/Fixtures/GenerateDiffTest-NoTrailingWhitespace.inc', - ], - 'tab replaced with spaces' => [ - 'filePath' => __DIR__.'/Fixtures/GenerateDiffTest-TabsToSpaces.inc', - ], - 'blank lines at start of file' => [ - 'filePath' => __DIR__.'/Fixtures/GenerateDiffTest-BlankLinesAtStart.inc', - ], - 'whitespace diff at start of file' => [ - 'filePath' => __DIR__.'/Fixtures/GenerateDiffTest-WhiteSpaceAtStart.inc', - ], - 'blank lines at end of file' => [ - 'filePath' => __DIR__.'/Fixtures/GenerateDiffTest-BlankLinesAtEnd.inc', - ], - 'whitespace diff at end of file' => [ - 'filePath' => __DIR__.'/Fixtures/GenerateDiffTest-WhiteSpaceAtEnd.inc', - ], - ]; - - }//end dataGenerateDiff() - - - /** - * Test generating a diff between a PHPCS File object and a file on disk and colourizing the output. - * - * @return void - */ - public function testGenerateDiffColoured() - { - $expected = "\033[31m--- tests/Core/Fixer/Fixtures/GenerateDiffTest-VarNameChanged.inc\033[0m".PHP_EOL; - $expected .= "\033[32m+++ PHP_CodeSniffer\033[0m".PHP_EOL; - $expected .= '@@ -1,7 +1,7 @@'.PHP_EOL; - $expected .= ' fixer->generateDiff($filePath); - - // Allow for the tests to pass on Windows too. - $diff = str_replace('--- tests\Core\Fixer/', '--- tests/Core/Fixer/', $diff); - - $this->assertSame($expected, $diff); - - }//end testGenerateDiffColoured() - - - /** - * Test generating a diff between a PHPCS File object using *nix line endings and a file on disk - * using Windows line endings. - * - * The point of this test is to verify that all lines are marked as having a difference. - * The actual lines endings used in the diff shown to the end-user are not relevant for this - * test. - * As the "diff" command is finicky with what type of line endings are used when the only - * difference on a line is the line ending, the test normalizes the line endings of the - * received diff before testing it. - * - * @return void - */ - public function testGenerateDiffDifferentLineEndings() - { - // By the looks of it, if the only diff between two files is line endings, the - // diff generated by the *nix "diff" command will always contain *nix line endings. - $expected = '--- tests/Core/Fixer/Fixtures/GenerateDiffTest-WindowsLineEndings.inc'."\n"; - $expected .= '+++ PHP_CodeSniffer'."\n"; - $expected .= '@@ -1,7 +1,7 @@'."\n"; - $expected .= '-fixer->generateDiff($filePath, false); - - // Allow for the tests to pass on Windows too. - $diff = str_replace('--- tests\Core\Fixer/', '--- tests/Core/Fixer/', $diff); - - // Normalize line endings of the diff. - $diff = preg_replace('`\R`', "\n", $diff); - - $this->assertSame($expected, $diff); - - }//end testGenerateDiffDifferentLineEndings() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/AllValidDocsTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/AllValidDocsTest.xml deleted file mode 100644 index 3bf637e..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/AllValidDocsTest.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/AnchorLinksTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/AnchorLinksTest.xml deleted file mode 100644 index 17fb0ce..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/AnchorLinksTest.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonBlankLines.html b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonBlankLines.html deleted file mode 100644 index a51ad92..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonBlankLines.html +++ /dev/null @@ -1,105 +0,0 @@ - - - GeneratorTest Coding Standards - - - -

    GeneratorTest Coding Standards

    -

    Code Comparison, blank lines §

    -

    This is a standard block.

    - - - - - - - - - -
    Valid: Checking handling of blank lines.Invalid: Checking handling of blank lines.
    // First line of the code sample is
    // deliberately empty.

    // We also have a blank line in the middle.

    // And a blank line at the end.
    // First line of the code sample is
    // deliberately empty.

    // We also have a blank line in the middle.

    // And a blank line at the end.
    -
    Documentation generated on #REDACTED# by PHP_CodeSniffer #VERSION#
    - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonBlankLines.md b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonBlankLines.md deleted file mode 100644 index ef25f89..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonBlankLines.md +++ /dev/null @@ -1,35 +0,0 @@ -# GeneratorTest Coding Standard - -## Code Comparison, blank lines - -This is a standard block. - - - - - - - - - -
    Valid: Checking handling of blank lines.Invalid: Checking handling of blank lines.
    - - // First line of the code sample is - // deliberately empty. - - // We also have a blank line in the middle. - - // And a blank line at the end. - - - - // First line of the code sample is - // deliberately empty. - - // We also have a blank line in the middle. - - // And a blank line at the end. - -
    - -Documentation generated on *REDACTED* by [PHP_CodeSniffer *VERSION*](https://github.com/PHPCSStandards/PHP_CodeSniffer) diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonBlankLines.txt b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonBlankLines.txt deleted file mode 100644 index a7fd41d..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonBlankLines.txt +++ /dev/null @@ -1,18 +0,0 @@ - ---------------------------------------------------------------- -| GENERATORTEST CODING STANDARD: CODE COMPARISON, BLANK LINES | ---------------------------------------------------------------- - -This is a standard block. - ------------------------------------------ CODE COMPARISON ------------------------------------------ -| Valid: Checking handling of blank lines. | Invalid: Checking handling of blank lines. | ----------------------------------------------------------------------------------------------------- -| // First line of the code sample is | // First line of the code sample is | -| // deliberately empty. | // deliberately empty. | -| | | -| // We also have a blank line in the middle. | // We also have a blank line in the middle. | -| | | -| // And a blank line at the end. | // And a blank line at the end. | ----------------------------------------------------------------------------------------------------- - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonBlockLength.html b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonBlockLength.html deleted file mode 100644 index 881bac3..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonBlockLength.html +++ /dev/null @@ -1,115 +0,0 @@ - - - GeneratorTest Coding Standards - - - -

    GeneratorTest Coding Standards

    -

    Code Comparison, block length §

    -

    This is a standard block.

    - - - - - - - - - -
    Valid: code sample A has more lines than B.Invalid: shorter.
    // This code sample has more lines
    // than the "invalid" one.
    $one = 10;
    $a = 10;
    - - - - - - - - - -
    Valid: shorter.Invalid: code sample B has more lines than A.
    echo $foo;// This code sample has more lines
    // than the "valid" one.
    print $foo;
    -
    Documentation generated on #REDACTED# by PHP_CodeSniffer #VERSION#
    - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonBlockLength.md b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonBlockLength.md deleted file mode 100644 index 526f110..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonBlockLength.md +++ /dev/null @@ -1,47 +0,0 @@ -# GeneratorTest Coding Standard - -## Code Comparison, block length - -This is a standard block. - - - - - - - - - -
    Valid: code sample A has more lines than B.Invalid: shorter.
    - - // This code sample has more lines - // than the "invalid" one. - $one = 10; - - - - $a = 10; - -
    - - - - - - - - - -
    Valid: shorter.Invalid: code sample B has more lines than A.
    - - echo $foo; - - - - // This code sample has more lines - // than the "valid" one. - print $foo; - -
    - -Documentation generated on *REDACTED* by [PHP_CodeSniffer *VERSION*](https://github.com/PHPCSStandards/PHP_CodeSniffer) diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonBlockLength.txt b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonBlockLength.txt deleted file mode 100644 index c2fb737..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonBlockLength.txt +++ /dev/null @@ -1,23 +0,0 @@ - ----------------------------------------------------------------- -| GENERATORTEST CODING STANDARD: CODE COMPARISON, BLOCK LENGTH | ----------------------------------------------------------------- - -This is a standard block. - ------------------------------------------ CODE COMPARISON ------------------------------------------ -| Valid: code sample A has more lines than B. | Invalid: shorter. | ----------------------------------------------------------------------------------------------------- -| // This code sample has more lines | $a = 10; | -| // than the "invalid" one. | | -| $one = 10; | | ----------------------------------------------------------------------------------------------------- - ------------------------------------------ CODE COMPARISON ------------------------------------------ -| Valid: shorter. | Invalid: code sample B has more lines than A. | ----------------------------------------------------------------------------------------------------- -| echo $foo; | // This code sample has more lines | -| | // than the "valid" one. | -| | print $foo; | ----------------------------------------------------------------------------------------------------- - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonEncoding.html b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonEncoding.html deleted file mode 100644 index a325def..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonEncoding.html +++ /dev/null @@ -1,105 +0,0 @@ - - - GeneratorTest Coding Standards - - - -

    GeneratorTest Coding Standards

    -

    Code Comparison, char encoding §

    -

    This is a standard block.

    - - - - - - - - - -
    Valid: Vestibulum et orci condimentum.Invalid: Donec in nisl ut tortor convallis interdum.
    <?php

    // The above PHP tag is specifically testing
    // handling of that in generated HTML doc.

    // Now let's also check the handling of
    // comparison operators in code samples...
    $a = $b < $c;
    $d = $e > $f;
    $g = $h <= $i;
    $j = $k >= $l;
    $m = $n <=> $o;
    <?php

    // The above PHP tag is specifically testing
    // handling of that in generated HTML doc.

    // Now let's also check the handling of
    // comparison operators in code samples
    // in combination with "em" tags.
    $a = $b < $c;
    $d = $e > $f;
    $g = $h <= $i;
    $j = $k >= $l;
    $m = $n <=> $o;
    -
    Documentation generated on #REDACTED# by PHP_CodeSniffer #VERSION#
    - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonEncoding.md b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonEncoding.md deleted file mode 100644 index 052d3cb..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonEncoding.md +++ /dev/null @@ -1,48 +0,0 @@ -# GeneratorTest Coding Standard - -## Code Comparison, char encoding - -This is a standard block. - - - - - - - - - -
    Valid: Vestibulum et orci condimentum.Invalid: Donec in nisl ut tortor convallis interdum.
    - - $f; - $g = $h <= $i; - $j = $k >= $l; - $m = $n <=> $o; - - - - $f; - $g = $h <= $i; - $j = $k >= $l; - $m = $n <=> $o; - -
    - -Documentation generated on *REDACTED* by [PHP_CodeSniffer *VERSION*](https://github.com/PHPCSStandards/PHP_CodeSniffer) diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonEncoding.txt b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonEncoding.txt deleted file mode 100644 index 7ffcf4d..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonEncoding.txt +++ /dev/null @@ -1,26 +0,0 @@ - ------------------------------------------------------------------ -| GENERATORTEST CODING STANDARD: CODE COMPARISON, CHAR ENCODING | ------------------------------------------------------------------ - -This is a standard block. - ------------------------------------------ CODE COMPARISON ------------------------------------------ -| Valid: Vestibulum et orci condimentum. | Invalid: Donec in nisl ut tortor convallis | -| | interdum. | ----------------------------------------------------------------------------------------------------- -| $f; | $a = $b < $c; | -| $g = $h <= $i; | $d = $e > $f; | -| $j = $k >= $l; | $g = $h <= $i; | -| $m = $n <=> $o; | $j = $k >= $l; | -| | $m = $n <=> $o; | ----------------------------------------------------------------------------------------------------- - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonLineLength.html b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonLineLength.html deleted file mode 100644 index b1e83a4..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonLineLength.html +++ /dev/null @@ -1,106 +0,0 @@ - - - GeneratorTest Coding Standards - - - -

    GeneratorTest Coding Standards

    -

    Code Comparison, line length §

    -

    Ensure there is no PHP "Warning: str_repeat(): Second argument has to be greater than or equal to 0".
    -Ref: squizlabs/PHP_CodeSniffer#2522

    - - - - - - - - - -
    Valid: contains line which is too long.Invalid: contains line which is too long.
    class Foo extends Bar implements Countable, Serializable
    {
    }
    class Foo extends Bar
    {
        public static function foobar($param1, $param2) {}
    }
    -
    Documentation generated on #REDACTED# by PHP_CodeSniffer #VERSION#
    - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonLineLength.md b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonLineLength.md deleted file mode 100644 index 8dbf564..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonLineLength.md +++ /dev/null @@ -1,31 +0,0 @@ -# GeneratorTest Coding Standard - -## Code Comparison, line length - -Ensure there is no PHP "Warning: str_repeat(): Second argument has to be greater than or equal to 0". -Ref: squizlabs/PHP_CodeSniffer#2522 - - - - - - - - - -
    Valid: contains line which is too long.Invalid: contains line which is too long.
    - - class Foo extends Bar implements Countable, Serializable - { - } - - - - class Foo extends Bar - { - public static function foobar($param1, $param2) {} - } - -
    - -Documentation generated on *REDACTED* by [PHP_CodeSniffer *VERSION*](https://github.com/PHPCSStandards/PHP_CodeSniffer) diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonLineLength.txt b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonLineLength.txt deleted file mode 100644 index e8a665c..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeComparisonLineLength.txt +++ /dev/null @@ -1,18 +0,0 @@ - ---------------------------------------------------------------- -| GENERATORTEST CODING STANDARD: CODE COMPARISON, LINE LENGTH | ---------------------------------------------------------------- - -Ensure there is no PHP "Warning: str_repeat(): Second argument has to be greater than or equal to -0". -Ref: squizlabs/PHP_CodeSniffer#2522 - ------------------------------------------ CODE COMPARISON ------------------------------------------ -| Valid: contains line which is too long. | Invalid: contains line which is too long. | ----------------------------------------------------------------------------------------------------- -| class Foo extends Bar implements Countable, Serializable| class Foo extends Bar | -| { | { | -| } | public static function foobar($param1, $param2) {}| -| | } | ----------------------------------------------------------------------------------------------------- - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeTitleLineWrapping.html b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeTitleLineWrapping.html deleted file mode 100644 index dbe9966..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeTitleLineWrapping.html +++ /dev/null @@ -1,135 +0,0 @@ - - - GeneratorTest Coding Standards - - - -

    GeneratorTest Coding Standards

    -

    Code Title, line wrapping §

    -

    This is a standard block.

    - - - - - - - - - -
    Valid: exactly 45 character long description.Invalid: exactly 45 char long description---.
    // Dummy.// Dummy.
    - - - - - - - - - -
    Valid: exactly 46 character long description-.Invalid: exactly 46 character long description
    // Dummy.// Dummy.
    - - - - - - - - - -
    Valid: exactly 47 character long description--.Invalid: exactly 47 character long description.
    // Dummy.// Dummy.
    - - - - - - - - - -
    Valid: this description is longer than 46 characters and will wrap.Invalid: this description is longer than 46 characters and will wrap.
    // Dummy.// Dummy.
    -
    Documentation generated on #REDACTED# by PHP_CodeSniffer #VERSION#
    - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeTitleLineWrapping.md b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeTitleLineWrapping.md deleted file mode 100644 index a0d6a8e..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeTitleLineWrapping.md +++ /dev/null @@ -1,79 +0,0 @@ -# GeneratorTest Coding Standard - -## Code Title, line wrapping - -This is a standard block. - - - - - - - - - -
    Valid: exactly 45 character long description.Invalid: exactly 45 char long description---.
    - - // Dummy. - - - - // Dummy. - -
    - - - - - - - - - -
    Valid: exactly 46 character long description-.Invalid: exactly 46 character long description
    - - // Dummy. - - - - // Dummy. - -
    - - - - - - - - - -
    Valid: exactly 47 character long description--.Invalid: exactly 47 character long description.
    - - // Dummy. - - - - // Dummy. - -
    - - - - - - - - - -
    Valid: this description is longer than 46 characters and will wrap.Invalid: this description is longer than 46 characters and will wrap.
    - - // Dummy. - - - - // Dummy. - -
    - -Documentation generated on *REDACTED* by [PHP_CodeSniffer *VERSION*](https://github.com/PHPCSStandards/PHP_CodeSniffer) diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeTitleLineWrapping.txt b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeTitleLineWrapping.txt deleted file mode 100644 index 11925c4..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeTitleLineWrapping.txt +++ /dev/null @@ -1,33 +0,0 @@ - ------------------------------------------------------------- -| GENERATORTEST CODING STANDARD: CODE TITLE, LINE WRAPPING | ------------------------------------------------------------- - -This is a standard block. - ------------------------------------------ CODE COMPARISON ------------------------------------------ -| Valid: exactly 45 character long description. | Invalid: exactly 45 char long description---. | ----------------------------------------------------------------------------------------------------- -| // Dummy. | // Dummy. | ----------------------------------------------------------------------------------------------------- - ------------------------------------------ CODE COMPARISON ------------------------------------------ -| Valid: exactly 46 character long description-. | Invalid: exactly 46 character long description | ----------------------------------------------------------------------------------------------------- -| // Dummy. | // Dummy. | ----------------------------------------------------------------------------------------------------- - ------------------------------------------ CODE COMPARISON ------------------------------------------ -| Valid: exactly 47 character long | Invalid: exactly 47 character long | -| description--. | description. | ----------------------------------------------------------------------------------------------------- -| // Dummy. | // Dummy. | ----------------------------------------------------------------------------------------------------- - ------------------------------------------ CODE COMPARISON ------------------------------------------ -| Valid: this description is longer than 46 | Invalid: this description is longer than 46 | -| characters and will wrap. | characters and will wrap. | ----------------------------------------------------------------------------------------------------- -| // Dummy. | // Dummy. | ----------------------------------------------------------------------------------------------------- - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeTitleWhitespace.html b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeTitleWhitespace.html deleted file mode 100644 index 65a5a25..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeTitleWhitespace.html +++ /dev/null @@ -1,115 +0,0 @@ - - - GeneratorTest Coding Standards - - - -

    GeneratorTest Coding Standards

    -

    Code Title, whitespace handling §

    -

    This is a standard block.

    - - - - - - - - - -
    Valid: spaces at start of description.Invalid: spaces at end making line > 46 chars.
    // Dummy.// Dummy.
    - - - - - - - - - -
    Valid: spaces at start + end of description.Invalid: spaces '     ' in description.
    // Note: description above without the
    // trailing whitespace fits in 46 chars.
    // Dummy.
    -
    Documentation generated on #REDACTED# by PHP_CodeSniffer #VERSION#
    - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeTitleWhitespace.md b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeTitleWhitespace.md deleted file mode 100644 index e623ba9..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeTitleWhitespace.md +++ /dev/null @@ -1,44 +0,0 @@ -# GeneratorTest Coding Standard - -## Code Title, whitespace handling - -This is a standard block. - - - - - - - - - -
    Valid: spaces at start of description.Invalid: spaces at end making line > 46 chars.
    - - // Dummy. - - - - // Dummy. - -
    - - - - - - - - - -
    Valid: spaces at start + end of description.Invalid: spaces '     ' in description.
    - - // Note: description above without the - // trailing whitespace fits in 46 chars. - - - - // Dummy. - -
    - -Documentation generated on *REDACTED* by [PHP_CodeSniffer *VERSION*](https://github.com/PHPCSStandards/PHP_CodeSniffer) diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeTitleWhitespace.txt b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeTitleWhitespace.txt deleted file mode 100644 index 0db5a7d..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputCodeTitleWhitespace.txt +++ /dev/null @@ -1,20 +0,0 @@ - ------------------------------------------------------------------- -| GENERATORTEST CODING STANDARD: CODE TITLE, WHITESPACE HANDLING | ------------------------------------------------------------------- - -This is a standard block. - ------------------------------------------ CODE COMPARISON ------------------------------------------ -| Valid: spaces at start of description. | Invalid: spaces at end making line > 46 chars. | ----------------------------------------------------------------------------------------------------- -| // Dummy. | // Dummy. | ----------------------------------------------------------------------------------------------------- - ------------------------------------------ CODE COMPARISON ------------------------------------------ -| Valid: spaces at start + end of description. | Invalid: spaces ' ' in description. | ----------------------------------------------------------------------------------------------------- -| // Note: description above without the | // Dummy. | -| // trailing whitespace fits in 46 chars. | | ----------------------------------------------------------------------------------------------------- - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitleCase.html b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitleCase.html deleted file mode 100644 index e722651..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitleCase.html +++ /dev/null @@ -1,95 +0,0 @@ - - - GeneratorTest Coding Standards - - - -

    GeneratorTest Coding Standards

    -

    lowercase title §

    -

    This is a standard block.

    -
    Documentation generated on #REDACTED# by PHP_CodeSniffer #VERSION#
    - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitleCase.md b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitleCase.md deleted file mode 100644 index 0d63b04..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitleCase.md +++ /dev/null @@ -1,7 +0,0 @@ -# GeneratorTest Coding Standard - -## lowercase title - -This is a standard block. - -Documentation generated on *REDACTED* by [PHP_CodeSniffer *VERSION*](https://github.com/PHPCSStandards/PHP_CodeSniffer) diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitleCase.txt b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitleCase.txt deleted file mode 100644 index c762a01..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitleCase.txt +++ /dev/null @@ -1,7 +0,0 @@ - --------------------------------------------------- -| GENERATORTEST CODING STANDARD: LOWERCASE TITLE | --------------------------------------------------- - -This is a standard block. - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitleLength.html b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitleLength.html deleted file mode 100644 index 2640a6b..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitleLength.html +++ /dev/null @@ -1,95 +0,0 @@ - - - GeneratorTest Coding Standards - - - -

    GeneratorTest Coding Standards

    -

    This is a very very very very very very very very very very very long title §

    -

    This is a standard block.

    -
    Documentation generated on #REDACTED# by PHP_CodeSniffer #VERSION#
    - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitleLength.md b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitleLength.md deleted file mode 100644 index 252f5fc..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitleLength.md +++ /dev/null @@ -1,7 +0,0 @@ -# GeneratorTest Coding Standard - -## This is a very very very very very very very very very very very long title - -This is a standard block. - -Documentation generated on *REDACTED* by [PHP_CodeSniffer *VERSION*](https://github.com/PHPCSStandards/PHP_CodeSniffer) diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitleLength.txt b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitleLength.txt deleted file mode 100644 index 2787b8c..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitleLength.txt +++ /dev/null @@ -1,7 +0,0 @@ - --------------------------------------------------------------------------------------------------------------- -| GENERATORTEST CODING STANDARD: THIS IS A VERY VERY VERY VERY VERY VERY VERY VERY VERY VERY VERY LONG TITLE | --------------------------------------------------------------------------------------------------------------- - -This is a standard block. - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitlePCREFallback.html b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitlePCREFallback.html deleted file mode 100644 index b83b5e6..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitlePCREFallback.html +++ /dev/null @@ -1,96 +0,0 @@ - - - GeneratorTest Coding Standards - - - -

    GeneratorTest Coding Standards

    -

    Documentation Title PCRE Fallback §

    -

    Testing the document title can get determined from the sniff name if missing.

    -

    This file name contains an acronym on purpose to test the word splitting.

    -
    Documentation generated on #REDACTED# by PHP_CodeSniffer #VERSION#
    - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitlePCREFallback.md b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitlePCREFallback.md deleted file mode 100644 index 844f4fb..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitlePCREFallback.md +++ /dev/null @@ -1,9 +0,0 @@ -# GeneratorTest Coding Standard - -## Documentation Title PCRE Fallback - -Testing the document title can get determined from the sniff name if missing. - -This file name contains an acronym on purpose to test the word splitting. - -Documentation generated on *REDACTED* by [PHP_CodeSniffer *VERSION*](https://github.com/PHPCSStandards/PHP_CodeSniffer) diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitlePCREFallback.txt b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitlePCREFallback.txt deleted file mode 100644 index 342cdfd..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitlePCREFallback.txt +++ /dev/null @@ -1,9 +0,0 @@ - --------------------------------------------------------------------- -| GENERATORTEST CODING STANDARD: DOCUMENTATION TITLE PCRE FALLBACK | --------------------------------------------------------------------- - -Testing the document title can get determined from the sniff name if missing. - -This file name contains an acronym on purpose to test the word splitting. - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitleToAnchorSlug.html b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitleToAnchorSlug.html deleted file mode 100644 index 1d99239..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputDocumentationTitleToAnchorSlug.html +++ /dev/null @@ -1,107 +0,0 @@ - - - GeneratorTest Coding Standards - - - -

    GeneratorTest Coding Standards

    -

    Table of Contents

    - -

    URL enc@de non-àscíï chars §

    -

    The documentation title has non-ascii characters, which will be slugified for use in an HTML anchor link.

    -

    URL enc@de non-àscíï chars §

    -

    The documentation title has non-ascii characters, which will be slugified for use in an HTML anchor link.
    -A duplicate anchor link will get a numeric suffix.

    -

    URL enc@de non-àscíï chars §

    -

    The documentation title has non-ascii characters, which will be slugified for use in an HTML anchor link.
    -A duplicate anchor link will get a numeric suffix.

    -
    Documentation generated on #REDACTED# by PHP_CodeSniffer #VERSION#
    - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputEmpty.txt b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputEmpty.txt deleted file mode 100644 index e69de29..0000000 diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonMismatchedCodeElms.html b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonMismatchedCodeElms.html deleted file mode 100644 index 59fcc7e..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonMismatchedCodeElms.html +++ /dev/null @@ -1,105 +0,0 @@ - - - GeneratorTest Coding Standards - - - -

    GeneratorTest Coding Standards

    -

    Code Comparison, mismatched code blocks §

    -

    This doc has two code elements, one only has a title, one has actual code. Unbalanced

    - - - - - - - - - -
    Code title
    $a = 'Example code';
    -
    Documentation generated on #REDACTED# by PHP_CodeSniffer #VERSION#
    - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonMismatchedCodeElms.md b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonMismatchedCodeElms.md deleted file mode 100644 index bbd1f31..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonMismatchedCodeElms.md +++ /dev/null @@ -1,25 +0,0 @@ -# GeneratorTest Coding Standard - -## Code Comparison, mismatched code blocks - -This doc has two code elements, one only has a title, one has actual code. Unbalanced - - - - - - - - - -
    Code title
    - - - - - - $a = 'Example code'; - -
    - -Documentation generated on *REDACTED* by [PHP_CodeSniffer *VERSION*](https://github.com/PHPCSStandards/PHP_CodeSniffer) diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonMismatchedCodeElms.txt b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonMismatchedCodeElms.txt deleted file mode 100644 index 85b3f31..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonMismatchedCodeElms.txt +++ /dev/null @@ -1,13 +0,0 @@ - --------------------------------------------------------------------------- -| GENERATORTEST CODING STANDARD: CODE COMPARISON, MISMATCHED CODE BLOCKS | --------------------------------------------------------------------------- - -This doc has two code elements, one only has a title, one has actual code. Unbalanced - ------------------------------------------ CODE COMPARISON ------------------------------------------ -| Code title | | ----------------------------------------------------------------------------------------------------- -| | $a = 'Example code'; | ----------------------------------------------------------------------------------------------------- - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonMissingCodeElm.html b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonMissingCodeElm.html deleted file mode 100644 index 9f29d6a..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonMissingCodeElm.html +++ /dev/null @@ -1,95 +0,0 @@ - - - GeneratorTest Coding Standards - - - -

    GeneratorTest Coding Standards

    -

    Code Comparison, missing code element §

    -

    This is a standard block.

    -
    Documentation generated on #REDACTED# by PHP_CodeSniffer #VERSION#
    - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonMissingCodeElm.md b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonMissingCodeElm.md deleted file mode 100644 index 4cd4b41..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonMissingCodeElm.md +++ /dev/null @@ -1,7 +0,0 @@ -# GeneratorTest Coding Standard - -## Code Comparison, missing code element - -This is a standard block. - -Documentation generated on *REDACTED* by [PHP_CodeSniffer *VERSION*](https://github.com/PHPCSStandards/PHP_CodeSniffer) diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonMissingCodeElm.txt b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonMissingCodeElm.txt deleted file mode 100644 index 0c3c6d1..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonMissingCodeElm.txt +++ /dev/null @@ -1,7 +0,0 @@ - ------------------------------------------------------------------------- -| GENERATORTEST CODING STANDARD: CODE COMPARISON, MISSING CODE ELEMENT | ------------------------------------------------------------------------- - -This is a standard block. - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonNoCode.html b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonNoCode.html deleted file mode 100644 index 35d9144..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonNoCode.html +++ /dev/null @@ -1,101 +0,0 @@ - - - GeneratorTest Coding Standards - - - -

    GeneratorTest Coding Standards

    -

    Code Comparison, no code §

    -

    This is a standard block.

    - - - - - -
    Valid: no code.Invalid: no code.
    -
    Documentation generated on #REDACTED# by PHP_CodeSniffer #VERSION#
    - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonNoCode.md b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonNoCode.md deleted file mode 100644 index afbf106..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonNoCode.md +++ /dev/null @@ -1,13 +0,0 @@ -# GeneratorTest Coding Standard - -## Code Comparison, no code - -This is a standard block. - - - - - -
    Valid: no code.Invalid: no code.
    - -Documentation generated on *REDACTED* by [PHP_CodeSniffer *VERSION*](https://github.com/PHPCSStandards/PHP_CodeSniffer) diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonNoCode.txt b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonNoCode.txt deleted file mode 100644 index f6091ca..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonNoCode.txt +++ /dev/null @@ -1,10 +0,0 @@ - ------------------------------------------------------------ -| GENERATORTEST CODING STANDARD: CODE COMPARISON, NO CODE | ------------------------------------------------------------ - -This is a standard block. - ------------------------------------------ CODE COMPARISON ------------------------------------------ -| Valid: no code. | Invalid: no code. | ----------------------------------------------------------------------------------------------------- diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonNoContent.html b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonNoContent.html deleted file mode 100644 index b09f3cc..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonNoContent.html +++ /dev/null @@ -1,95 +0,0 @@ - - - GeneratorTest Coding Standards - - - -

    GeneratorTest Coding Standards

    -

    Code Comparison, no content §

    -

    This is a standard block.

    -
    Documentation generated on #REDACTED# by PHP_CodeSniffer #VERSION#
    - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonNoContent.md b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonNoContent.md deleted file mode 100644 index 1cea477..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonNoContent.md +++ /dev/null @@ -1,7 +0,0 @@ -# GeneratorTest Coding Standard - -## Code Comparison, no content - -This is a standard block. - -Documentation generated on *REDACTED* by [PHP_CodeSniffer *VERSION*](https://github.com/PHPCSStandards/PHP_CodeSniffer) diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonNoContent.txt b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonNoContent.txt deleted file mode 100644 index 0227cdc..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonNoContent.txt +++ /dev/null @@ -1,7 +0,0 @@ - --------------------------------------------------------------- -| GENERATORTEST CODING STANDARD: CODE COMPARISON, NO CONTENT | --------------------------------------------------------------- - -This is a standard block. - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonOneEmptyCodeElm.html b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonOneEmptyCodeElm.html deleted file mode 100644 index 7ee4bee..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonOneEmptyCodeElm.html +++ /dev/null @@ -1,105 +0,0 @@ - - - GeneratorTest Coding Standards - - - -

    GeneratorTest Coding Standards

    -

    Code Comparison, one empty code element §

    -

    This doc has two code elements, but only one of them has a title and actual code.

    - - - - - - - - - -
    Code title
    $a = 'Example code';
    -
    Documentation generated on #REDACTED# by PHP_CodeSniffer #VERSION#
    - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonOneEmptyCodeElm.md b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonOneEmptyCodeElm.md deleted file mode 100644 index 829f136..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonOneEmptyCodeElm.md +++ /dev/null @@ -1,25 +0,0 @@ -# GeneratorTest Coding Standard - -## Code Comparison, one empty code element - -This doc has two code elements, but only one of them has a title and actual code. - - - - - - - - - -
    Code title
    - - $a = 'Example code'; - - - - - -
    - -Documentation generated on *REDACTED* by [PHP_CodeSniffer *VERSION*](https://github.com/PHPCSStandards/PHP_CodeSniffer) diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonOneEmptyCodeElm.txt b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonOneEmptyCodeElm.txt deleted file mode 100644 index 7e93705..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonOneEmptyCodeElm.txt +++ /dev/null @@ -1,13 +0,0 @@ - --------------------------------------------------------------------------- -| GENERATORTEST CODING STANDARD: CODE COMPARISON, ONE EMPTY CODE ELEMENT | --------------------------------------------------------------------------- - -This doc has two code elements, but only one of them has a title and actual code. - ------------------------------------------ CODE COMPARISON ------------------------------------------ -| Code title | | ----------------------------------------------------------------------------------------------------- -| $a = 'Example code'; | | ----------------------------------------------------------------------------------------------------- - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonTwoEmptyCodeElms.html b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonTwoEmptyCodeElms.html deleted file mode 100644 index 4cc553d..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonTwoEmptyCodeElms.html +++ /dev/null @@ -1,95 +0,0 @@ - - - GeneratorTest Coding Standards - - - -

    GeneratorTest Coding Standards

    -

    Code Comparison, two empty code elements §

    -

    This doc has two code elements, but neither of them contain any information.

    -
    Documentation generated on #REDACTED# by PHP_CodeSniffer #VERSION#
    - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonTwoEmptyCodeElms.md b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonTwoEmptyCodeElms.md deleted file mode 100644 index 7d13876..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonTwoEmptyCodeElms.md +++ /dev/null @@ -1,7 +0,0 @@ -# GeneratorTest Coding Standard - -## Code Comparison, two empty code elements - -This doc has two code elements, but neither of them contain any information. - -Documentation generated on *REDACTED* by [PHP_CodeSniffer *VERSION*](https://github.com/PHPCSStandards/PHP_CodeSniffer) diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonTwoEmptyCodeElms.txt b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonTwoEmptyCodeElms.txt deleted file mode 100644 index 775e7ce..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeComparisonTwoEmptyCodeElms.txt +++ /dev/null @@ -1,7 +0,0 @@ - ---------------------------------------------------------------------------- -| GENERATORTEST CODING STANDARD: CODE COMPARISON, TWO EMPTY CODE ELEMENTS | ---------------------------------------------------------------------------- - -This doc has two code elements, but neither of them contain any information. - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeTitleEmpty.html b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeTitleEmpty.html deleted file mode 100644 index 0efa057..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeTitleEmpty.html +++ /dev/null @@ -1,101 +0,0 @@ - - - GeneratorTest Coding Standards - - - -

    GeneratorTest Coding Standards

    -

    Code Title, empty §

    -

    This is a standard block.

    - - - - - -
    // Dummy.// Dummy.
    -
    Documentation generated on #REDACTED# by PHP_CodeSniffer #VERSION#
    - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeTitleEmpty.md b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeTitleEmpty.md deleted file mode 100644 index 728ccc0..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeTitleEmpty.md +++ /dev/null @@ -1,21 +0,0 @@ -# GeneratorTest Coding Standard - -## Code Title, empty - -This is a standard block. - - - - - -
    - - // Dummy. - - - - // Dummy. - -
    - -Documentation generated on *REDACTED* by [PHP_CodeSniffer *VERSION*](https://github.com/PHPCSStandards/PHP_CodeSniffer) diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeTitleEmpty.txt b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeTitleEmpty.txt deleted file mode 100644 index d3ac256..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeTitleEmpty.txt +++ /dev/null @@ -1,11 +0,0 @@ - ----------------------------------------------------- -| GENERATORTEST CODING STANDARD: CODE TITLE, EMPTY | ----------------------------------------------------- - -This is a standard block. - ------------------------------------------ CODE COMPARISON ------------------------------------------ -| // Dummy. | // Dummy. | ----------------------------------------------------------------------------------------------------- - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeTitleMissing.html b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeTitleMissing.html deleted file mode 100644 index 755f5a1..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeTitleMissing.html +++ /dev/null @@ -1,101 +0,0 @@ - - - GeneratorTest Coding Standards - - - -

    GeneratorTest Coding Standards

    -

    Code Title, missing §

    -

    This is a standard block.

    - - - - - -
    // Dummy.// Dummy.
    -
    Documentation generated on #REDACTED# by PHP_CodeSniffer #VERSION#
    - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeTitleMissing.md b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeTitleMissing.md deleted file mode 100644 index 98e5822..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeTitleMissing.md +++ /dev/null @@ -1,21 +0,0 @@ -# GeneratorTest Coding Standard - -## Code Title, missing - -This is a standard block. - - - - - -
    - - // Dummy. - - - - // Dummy. - -
    - -Documentation generated on *REDACTED* by [PHP_CodeSniffer *VERSION*](https://github.com/PHPCSStandards/PHP_CodeSniffer) diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeTitleMissing.txt b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeTitleMissing.txt deleted file mode 100644 index 3de51f0..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidCodeTitleMissing.txt +++ /dev/null @@ -1,11 +0,0 @@ - ------------------------------------------------------- -| GENERATORTEST CODING STANDARD: CODE TITLE, MISSING | ------------------------------------------------------- - -This is a standard block. - ------------------------------------------ CODE COMPARISON ------------------------------------------ -| // Dummy. | // Dummy. | ----------------------------------------------------------------------------------------------------- - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidDocumentationTitleEmpty.html b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidDocumentationTitleEmpty.html deleted file mode 100644 index 7d0d9aa..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidDocumentationTitleEmpty.html +++ /dev/null @@ -1,105 +0,0 @@ - - - GeneratorTest Coding Standards - - - -

    GeneratorTest Coding Standards

    -

    Documentation Title Empty §

    -

    The above "documentation" element has an empty title attribute.

    - - - - - - - - - -
    Valid: Lorem ipsum dolor sit amet.Invalid: Maecenas non rutrum dolor.
    class Code {}class Comparison {}
    -
    Documentation generated on #REDACTED# by PHP_CodeSniffer #VERSION#
    - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidDocumentationTitleEmpty.md b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidDocumentationTitleEmpty.md deleted file mode 100644 index db8b2e4..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidDocumentationTitleEmpty.md +++ /dev/null @@ -1,25 +0,0 @@ -# GeneratorTest Coding Standard - -## Documentation Title Empty - -The above "documentation" element has an empty title attribute. - - - - - - - - - -
    Valid: Lorem ipsum dolor sit amet.Invalid: Maecenas non rutrum dolor.
    - - class Code {} - - - - class Comparison {} - -
    - -Documentation generated on *REDACTED* by [PHP_CodeSniffer *VERSION*](https://github.com/PHPCSStandards/PHP_CodeSniffer) diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidDocumentationTitleEmpty.txt b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidDocumentationTitleEmpty.txt deleted file mode 100644 index 85fe377..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidDocumentationTitleEmpty.txt +++ /dev/null @@ -1,13 +0,0 @@ - ------------------------------------------------------------- -| GENERATORTEST CODING STANDARD: DOCUMENTATION TITLE EMPTY | ------------------------------------------------------------- - -The above "documentation" element has an empty title attribute. - ------------------------------------------ CODE COMPARISON ------------------------------------------ -| Valid: Lorem ipsum dolor sit amet. | Invalid: Maecenas non rutrum dolor. | ----------------------------------------------------------------------------------------------------- -| class Code {} | class Comparison {} | ----------------------------------------------------------------------------------------------------- - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidDocumentationTitleMissing.html b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidDocumentationTitleMissing.html deleted file mode 100644 index 2f51fd4..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidDocumentationTitleMissing.html +++ /dev/null @@ -1,105 +0,0 @@ - - - GeneratorTest Coding Standards - - - -

    GeneratorTest Coding Standards

    -

    Documentation Title Missing §

    -

    The above "documentation" element is missing the title attribute.

    - - - - - - - - - -
    Valid: Lorem ipsum dolor sit amet.Invalid: Maecenas non rutrum dolor.
    class Code {}class Comparison {}
    -
    Documentation generated on #REDACTED# by PHP_CodeSniffer #VERSION#
    - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidDocumentationTitleMissing.md b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidDocumentationTitleMissing.md deleted file mode 100644 index bd9ebfd..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidDocumentationTitleMissing.md +++ /dev/null @@ -1,25 +0,0 @@ -# GeneratorTest Coding Standard - -## Documentation Title Missing - -The above "documentation" element is missing the title attribute. - - - - - - - - - -
    Valid: Lorem ipsum dolor sit amet.Invalid: Maecenas non rutrum dolor.
    - - class Code {} - - - - class Comparison {} - -
    - -Documentation generated on *REDACTED* by [PHP_CodeSniffer *VERSION*](https://github.com/PHPCSStandards/PHP_CodeSniffer) diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidDocumentationTitleMissing.txt b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidDocumentationTitleMissing.txt deleted file mode 100644 index d495203..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidDocumentationTitleMissing.txt +++ /dev/null @@ -1,13 +0,0 @@ - --------------------------------------------------------------- -| GENERATORTEST CODING STANDARD: DOCUMENTATION TITLE MISSING | --------------------------------------------------------------- - -The above "documentation" element is missing the title attribute. - ------------------------------------------ CODE COMPARISON ------------------------------------------ -| Valid: Lorem ipsum dolor sit amet. | Invalid: Maecenas non rutrum dolor. | ----------------------------------------------------------------------------------------------------- -| class Code {} | class Comparison {} | ----------------------------------------------------------------------------------------------------- - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidStandardNoContent.html b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidStandardNoContent.html deleted file mode 100644 index 2eecc8a..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidStandardNoContent.html +++ /dev/null @@ -1,104 +0,0 @@ - - - GeneratorTest Coding Standards - - - -

    GeneratorTest Coding Standards

    -

    Standard Element, no content §

    - - - - - - - - - -
    Valid: Lorem ipsum dolor sit amet.Invalid: Maecenas non rutrum dolor.
    class Code {}class Comparison {}
    -
    Documentation generated on #REDACTED# by PHP_CodeSniffer #VERSION#
    - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidStandardNoContent.md b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidStandardNoContent.md deleted file mode 100644 index 8d5dbc2..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidStandardNoContent.md +++ /dev/null @@ -1,24 +0,0 @@ -# GeneratorTest Coding Standard - -## Standard Element, no content - - - - - - - - - - -
    Valid: Lorem ipsum dolor sit amet.Invalid: Maecenas non rutrum dolor.
    - - class Code {} - - - - class Comparison {} - -
    - -Documentation generated on *REDACTED* by [PHP_CodeSniffer *VERSION*](https://github.com/PHPCSStandards/PHP_CodeSniffer) diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidStandardNoContent.txt b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidStandardNoContent.txt deleted file mode 100644 index c0b96c7..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputInvalidStandardNoContent.txt +++ /dev/null @@ -1,11 +0,0 @@ - ---------------------------------------------------------------- -| GENERATORTEST CODING STANDARD: STANDARD ELEMENT, NO CONTENT | ---------------------------------------------------------------- - ------------------------------------------ CODE COMPARISON ------------------------------------------ -| Valid: Lorem ipsum dolor sit amet. | Invalid: Maecenas non rutrum dolor. | ----------------------------------------------------------------------------------------------------- -| class Code {} | class Comparison {} | ----------------------------------------------------------------------------------------------------- - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputOneDoc.html b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputOneDoc.html deleted file mode 100644 index 798ae63..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputOneDoc.html +++ /dev/null @@ -1,95 +0,0 @@ - - - GeneratorTest Coding Standards - - - -

    GeneratorTest Coding Standards

    -

    One Standard Block, No Code §

    -

    Documentation contains one standard block and no code comparison.

    -
    Documentation generated on #REDACTED# by PHP_CodeSniffer #VERSION#
    - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputOneDoc.md b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputOneDoc.md deleted file mode 100644 index f613073..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputOneDoc.md +++ /dev/null @@ -1,7 +0,0 @@ -# GeneratorTest Coding Standard - -## One Standard Block, No Code - -Documentation contains one standard block and no code comparison. - -Documentation generated on *REDACTED* by [PHP_CodeSniffer *VERSION*](https://github.com/PHPCSStandards/PHP_CodeSniffer) diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputOneDoc.txt b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputOneDoc.txt deleted file mode 100644 index 75bbdcb..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputOneDoc.txt +++ /dev/null @@ -1,7 +0,0 @@ - --------------------------------------------------------------- -| GENERATORTEST CODING STANDARD: ONE STANDARD BLOCK, NO CODE | --------------------------------------------------------------- - -Documentation contains one standard block and no code comparison. - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardBlankLines.html b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardBlankLines.html deleted file mode 100644 index ceaab32..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardBlankLines.html +++ /dev/null @@ -1,97 +0,0 @@ - - - GeneratorTest Coding Standards - - - -

    GeneratorTest Coding Standards

    -

    Standard Element, blank line handling §

    -

    There is a blank line at the start of this standard.

    -

    And the above blank line is also deliberate to test part of the logic.

    -

    Let's also end on a blank line to test that too.

    -
    Documentation generated on #REDACTED# by PHP_CodeSniffer #VERSION#
    - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardBlankLines.md b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardBlankLines.md deleted file mode 100644 index f8663f1..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardBlankLines.md +++ /dev/null @@ -1,11 +0,0 @@ -# GeneratorTest Coding Standard - -## Standard Element, blank line handling - -There is a blank line at the start of this standard. - -And the above blank line is also deliberate to test part of the logic. - -Let's also end on a blank line to test that too. - -Documentation generated on *REDACTED* by [PHP_CodeSniffer *VERSION*](https://github.com/PHPCSStandards/PHP_CodeSniffer) diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardBlankLines.txt b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardBlankLines.txt deleted file mode 100644 index 1cdad0b..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardBlankLines.txt +++ /dev/null @@ -1,11 +0,0 @@ - ------------------------------------------------------------------------- -| GENERATORTEST CODING STANDARD: STANDARD ELEMENT, BLANK LINE HANDLING | ------------------------------------------------------------------------- - -There is a blank line at the start of this standard. - -And the above blank line is also deliberate to test part of the logic. - -Let's also end on a blank line to test that too. - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardEncoding.html b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardEncoding.html deleted file mode 100644 index 93a77d4..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardEncoding.html +++ /dev/null @@ -1,96 +0,0 @@ - - - GeneratorTest Coding Standards - - - -

    GeneratorTest Coding Standards

    -

    Standard Element, handling of HTML tags §

    -

    The use of tags in standard descriptions is allowed and their handling should be safeguarded.
    -Other tags, like <a href="example.com">link</a>, <b>bold</bold>, <script></script> are not allowed and will be encoded for display when the HTML or Markdown report is used.

    -
    Documentation generated on #REDACTED# by PHP_CodeSniffer #VERSION#
    - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardEncoding.md b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardEncoding.md deleted file mode 100644 index 6183dc0..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardEncoding.md +++ /dev/null @@ -1,8 +0,0 @@ -# GeneratorTest Coding Standard - -## Standard Element, handling of HTML tags - -The use of *tags* in standard descriptions is allowed and their handling should be *safeguarded*. -Other tags, like <a href="example.com">link</a>, <b>bold</bold>, <script></script> are not allowed and will be encoded for display when the HTML or Markdown report is used. - -Documentation generated on *REDACTED* by [PHP_CodeSniffer *VERSION*](https://github.com/PHPCSStandards/PHP_CodeSniffer) diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardEncoding.txt b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardEncoding.txt deleted file mode 100644 index a464b86..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardEncoding.txt +++ /dev/null @@ -1,9 +0,0 @@ - --------------------------------------------------------------------------- -| GENERATORTEST CODING STANDARD: STANDARD ELEMENT, HANDLING OF HTML TAGS | --------------------------------------------------------------------------- - -The use of *tags* in standard descriptions is allowed and their handling should be *safeguarded*. -Other tags, like link, bold, are not allowed -and will be encoded for display when the HTML or Markdown report is used. - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardIndent.html b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardIndent.html deleted file mode 100644 index 8cf7c34..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardIndent.html +++ /dev/null @@ -1,98 +0,0 @@ - - - GeneratorTest Coding Standards - - - -

    GeneratorTest Coding Standards

    -

    Standard Element, indentation should be ignored §

    -

    This line has no indentation.
    -This line has 4 spaces indentation.
    -This line has 8 spaces indentation.
    -This line has 4 spaces indentation.

    -
    Documentation generated on #REDACTED# by PHP_CodeSniffer #VERSION#
    - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardIndent.md b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardIndent.md deleted file mode 100644 index 46bea4c..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardIndent.md +++ /dev/null @@ -1,10 +0,0 @@ -# GeneratorTest Coding Standard - -## Standard Element, indentation should be ignored - -This line has no indentation. -This line has 4 spaces indentation. -This line has 8 spaces indentation. -This line has 4 spaces indentation. - -Documentation generated on *REDACTED* by [PHP_CodeSniffer *VERSION*](https://github.com/PHPCSStandards/PHP_CodeSniffer) diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardIndent.txt b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardIndent.txt deleted file mode 100644 index fef00b9..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardIndent.txt +++ /dev/null @@ -1,10 +0,0 @@ - ----------------------------------------------------------------------------------- -| GENERATORTEST CODING STANDARD: STANDARD ELEMENT, INDENTATION SHOULD BE IGNORED | ----------------------------------------------------------------------------------- - -This line has no indentation. -This line has 4 spaces indentation. -This line has 8 spaces indentation. -This line has 4 spaces indentation. - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardLineWrapping.html b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardLineWrapping.html deleted file mode 100644 index b9f4038..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardLineWrapping.html +++ /dev/null @@ -1,97 +0,0 @@ - - - GeneratorTest Coding Standards - - - -

    GeneratorTest Coding Standards

    -

    Standard Element, line wrapping handling §

    -

    This line has to be exactly 99 chars to test part of the logic.------------------------------------
    -And this line has to be exactly 100 chars.----------------------------------------------------------
    -And here we have a line which should start wrapping as it is longer than 100 chars. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean pellentesque iaculis enim quis hendrerit. Morbi ultrices in odio pharetra commodo.

    -
    Documentation generated on #REDACTED# by PHP_CodeSniffer #VERSION#
    - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardLineWrapping.md b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardLineWrapping.md deleted file mode 100644 index c94bed4..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardLineWrapping.md +++ /dev/null @@ -1,9 +0,0 @@ -# GeneratorTest Coding Standard - -## Standard Element, line wrapping handling - -This line has to be exactly 99 chars to test part of the logic.------------------------------------ -And this line has to be exactly 100 chars.---------------------------------------------------------- -And here we have a line which should start wrapping as it is longer than 100 chars. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean pellentesque iaculis enim quis hendrerit. Morbi ultrices in odio pharetra commodo. - -Documentation generated on *REDACTED* by [PHP_CodeSniffer *VERSION*](https://github.com/PHPCSStandards/PHP_CodeSniffer) diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardLineWrapping.txt b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardLineWrapping.txt deleted file mode 100644 index 6f09fbe..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStandardLineWrapping.txt +++ /dev/null @@ -1,11 +0,0 @@ - ---------------------------------------------------------------------------- -| GENERATORTEST CODING STANDARD: STANDARD ELEMENT, LINE WRAPPING HANDLING | ---------------------------------------------------------------------------- - -This line has to be exactly 99 chars to test part of the logic.------------------------------------ -And this line has to be exactly 100 chars.---------------------------------------------------------- -And here we have a line which should start wrapping as it is longer than 100 chars. Lorem ipsum -dolor sit amet, consectetur adipiscing elit. Aenean pellentesque iaculis enim quis hendrerit. Morbi -ultrices in odio pharetra commodo. - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStructureDocs.html b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStructureDocs.html deleted file mode 100644 index 9aa1d62..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStructureDocs.html +++ /dev/null @@ -1,200 +0,0 @@ - - - GeneratorTest Coding Standards - - - -

    GeneratorTest Coding Standards

    -

    Table of Contents

    - -

    Code Comparison Only, Missing Standard Block §

    - - - - - - - - - -
    Valid: Lorem ipsum dolor sit amet.Invalid: Maecenas non rutrum dolor.
    class Code {}class Comparison {}
    -

    One Standard Block, Code Comparison §

    -

    Documentation contains one standard block and one code comparison.

    - - - - - - - - - -
    Valid: Lorem ipsum dolor sit amet.Invalid: Maecenas non rutrum dolor.
    class Code {}class Comparison {}
    -

    One Standard Block, No Code §

    -

    Documentation contains one standard block and no code comparison.

    -

    One Standard Block, Two Code Comparisons §

    -

    Documentation contains one standard block and two code comparisons.

    - - - - - - - - - -
    Valid: Etiam commodo magna at vestibulum blandit.Invalid: Vivamus lacinia ante velit.
    class Code {}class Comparison {}
    - - - - - - - - - -
    Valid: Pellentesque nisi neque.Invalid: Mauris dictum metus quis maximus pharetra.
    $one = 10;$a = 10;
    -

    Two Standard Blocks, No Code §

    -

    This is standard block one.

    -

    This is standard block two.

    -

    Two Standard Blocks, One Code Comparison §

    -

    This is standard block one.

    - - - - - - - - - -
    Valid: Vestibulum et orci condimentum.Invalid: Donec in nisl ut tortor convallis interdum.
    class Code {}class Comparison {}
    -

    This is standard block two.

    -

    Two Standard Blocks, Three Code Comparisons §

    -

    This is standard block one.

    - - - - - - - - - -
    Valid: Vestibulum et orci condimentum.Invalid: Donec in nisl ut tortor convallis interdum.
    class Code {}class Comparison {}
    -

    This is standard block two.

    - - - - - - - - - -
    Valid: Pellentesque nisi neque.Invalid: Mauris dictum metus quis maximus pharetra.
    $one = 10;$a = 10;
    - - - - - - - - - -
    Valid: Quisque sagittis nisi vitae.Invalid: Morbi ac libero vitae lorem.
    echo $foo;print $foo;
    -
    Documentation generated on #REDACTED# by PHP_CodeSniffer #VERSION#
    - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStructureDocs.md b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStructureDocs.md deleted file mode 100644 index fcbfcef..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStructureDocs.md +++ /dev/null @@ -1,177 +0,0 @@ -# GeneratorTest Coding Standard - -## Code Comparison Only, Missing Standard Block - - - - - - - - - - -
    Valid: Lorem ipsum dolor sit amet.Invalid: Maecenas non rutrum dolor.
    - - class Code {} - - - - class Comparison {} - -
    - -## One Standard Block, Code Comparison - -Documentation contains one standard block and one code comparison. - - - - - - - - - -
    Valid: Lorem ipsum dolor sit amet.Invalid: Maecenas non rutrum dolor.
    - - class Code {} - - - - class Comparison {} - -
    - -## One Standard Block, No Code - -Documentation contains one standard block and no code comparison. - -## One Standard Block, Two Code Comparisons - -Documentation contains one standard block and two code comparisons. - - - - - - - - - -
    Valid: Etiam commodo magna at vestibulum blandit.Invalid: Vivamus lacinia ante velit.
    - - class Code {} - - - - class Comparison {} - -
    - - - - - - - - - -
    Valid: Pellentesque nisi neque.Invalid: Mauris dictum metus quis maximus pharetra.
    - - $one = 10; - - - - $a = 10; - -
    - -## Two Standard Blocks, No Code - -This is standard block one. -This is standard block two. - -## Two Standard Blocks, One Code Comparison - -This is standard block one. - - - - - - - - - -
    Valid: Vestibulum et orci condimentum.Invalid: Donec in nisl ut tortor convallis interdum.
    - - class Code {} - - - - class Comparison {} - -
    -This is standard block two. - -## Two Standard Blocks, Three Code Comparisons - -This is standard block one. - - - - - - - - - -
    Valid: Vestibulum et orci condimentum.Invalid: Donec in nisl ut tortor convallis interdum.
    - - class Code {} - - - - class Comparison {} - -
    -This is standard block two. - - - - - - - - - -
    Valid: Pellentesque nisi neque.Invalid: Mauris dictum metus quis maximus pharetra.
    - - $one = 10; - - - - $a = 10; - -
    - - - - - - - - - -
    Valid: Quisque sagittis nisi vitae.Invalid: Morbi ac libero vitae lorem.
    - - echo $foo; - - - - print $foo; - -
    - -Documentation generated on *REDACTED* by [PHP_CodeSniffer *VERSION*](https://github.com/PHPCSStandards/PHP_CodeSniffer) diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStructureDocs.txt b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStructureDocs.txt deleted file mode 100644 index 4ca1dbc..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputStructureDocs.txt +++ /dev/null @@ -1,106 +0,0 @@ - -------------------------------------------------------------------------------- -| GENERATORTEST CODING STANDARD: CODE COMPARISON ONLY, MISSING STANDARD BLOCK | -------------------------------------------------------------------------------- - ------------------------------------------ CODE COMPARISON ------------------------------------------ -| Valid: Lorem ipsum dolor sit amet. | Invalid: Maecenas non rutrum dolor. | ----------------------------------------------------------------------------------------------------- -| class Code {} | class Comparison {} | ----------------------------------------------------------------------------------------------------- - - ----------------------------------------------------------------------- -| GENERATORTEST CODING STANDARD: ONE STANDARD BLOCK, CODE COMPARISON | ----------------------------------------------------------------------- - -Documentation contains one standard block and one code comparison. - ------------------------------------------ CODE COMPARISON ------------------------------------------ -| Valid: Lorem ipsum dolor sit amet. | Invalid: Maecenas non rutrum dolor. | ----------------------------------------------------------------------------------------------------- -| class Code {} | class Comparison {} | ----------------------------------------------------------------------------------------------------- - - --------------------------------------------------------------- -| GENERATORTEST CODING STANDARD: ONE STANDARD BLOCK, NO CODE | --------------------------------------------------------------- - -Documentation contains one standard block and no code comparison. - - ---------------------------------------------------------------------------- -| GENERATORTEST CODING STANDARD: ONE STANDARD BLOCK, TWO CODE COMPARISONS | ---------------------------------------------------------------------------- - -Documentation contains one standard block and two code comparisons. - ------------------------------------------ CODE COMPARISON ------------------------------------------ -| Valid: Etiam commodo magna at vestibulum | Invalid: Vivamus lacinia ante velit. | -| blandit. | | ----------------------------------------------------------------------------------------------------- -| class Code {} | class Comparison {} | ----------------------------------------------------------------------------------------------------- - ------------------------------------------ CODE COMPARISON ------------------------------------------ -| Valid: Pellentesque nisi neque. | Invalid: Mauris dictum metus quis maximus | -| | pharetra. | ----------------------------------------------------------------------------------------------------- -| $one = 10; | $a = 10; | ----------------------------------------------------------------------------------------------------- - - ---------------------------------------------------------------- -| GENERATORTEST CODING STANDARD: TWO STANDARD BLOCKS, NO CODE | ---------------------------------------------------------------- - -This is standard block one. - -This is standard block two. - - ---------------------------------------------------------------------------- -| GENERATORTEST CODING STANDARD: TWO STANDARD BLOCKS, ONE CODE COMPARISON | ---------------------------------------------------------------------------- - -This is standard block one. - ------------------------------------------ CODE COMPARISON ------------------------------------------ -| Valid: Vestibulum et orci condimentum. | Invalid: Donec in nisl ut tortor convallis | -| | interdum. | ----------------------------------------------------------------------------------------------------- -| class Code {} | class Comparison {} | ----------------------------------------------------------------------------------------------------- - -This is standard block two. - - ------------------------------------------------------------------------------- -| GENERATORTEST CODING STANDARD: TWO STANDARD BLOCKS, THREE CODE COMPARISONS | ------------------------------------------------------------------------------- - -This is standard block one. - ------------------------------------------ CODE COMPARISON ------------------------------------------ -| Valid: Vestibulum et orci condimentum. | Invalid: Donec in nisl ut tortor convallis | -| | interdum. | ----------------------------------------------------------------------------------------------------- -| class Code {} | class Comparison {} | ----------------------------------------------------------------------------------------------------- - -This is standard block two. - ------------------------------------------ CODE COMPARISON ------------------------------------------ -| Valid: Pellentesque nisi neque. | Invalid: Mauris dictum metus quis maximus | -| | pharetra. | ----------------------------------------------------------------------------------------------------- -| $one = 10; | $a = 10; | ----------------------------------------------------------------------------------------------------- - ------------------------------------------ CODE COMPARISON ------------------------------------------ -| Valid: Quisque sagittis nisi vitae. | Invalid: Morbi ac libero vitae lorem. | ----------------------------------------------------------------------------------------------------- -| echo $foo; | print $foo; | ----------------------------------------------------------------------------------------------------- - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputUnsupportedOneElmAtWrongLevel.html b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputUnsupportedOneElmAtWrongLevel.html deleted file mode 100644 index 82fe750..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputUnsupportedOneElmAtWrongLevel.html +++ /dev/null @@ -1,95 +0,0 @@ - - - GeneratorTest Coding Standards - - - -

    GeneratorTest Coding Standards

    -

    One element correct, one element wrong level §

    -

    This is a standard block at the correct level.

    -
    Documentation generated on #REDACTED# by PHP_CodeSniffer #VERSION#
    - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputUnsupportedOneElmAtWrongLevel.md b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputUnsupportedOneElmAtWrongLevel.md deleted file mode 100644 index aa9cc47..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputUnsupportedOneElmAtWrongLevel.md +++ /dev/null @@ -1,7 +0,0 @@ -# GeneratorTest Coding Standard - -## One element correct, one element wrong level - -This is a standard block at the correct level. - -Documentation generated on *REDACTED* by [PHP_CodeSniffer *VERSION*](https://github.com/PHPCSStandards/PHP_CodeSniffer) diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputUnsupportedOneElmAtWrongLevel.txt b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputUnsupportedOneElmAtWrongLevel.txt deleted file mode 100644 index 4d1aaea..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputUnsupportedOneElmAtWrongLevel.txt +++ /dev/null @@ -1,7 +0,0 @@ - -------------------------------------------------------------------------------- -| GENERATORTEST CODING STANDARD: ONE ELEMENT CORRECT, ONE ELEMENT WRONG LEVEL | -------------------------------------------------------------------------------- - -This is a standard block at the correct level. - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputUnsupportedSuperfluousCodeElement.html b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputUnsupportedSuperfluousCodeElement.html deleted file mode 100644 index de06568..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputUnsupportedSuperfluousCodeElement.html +++ /dev/null @@ -1,105 +0,0 @@ - - - GeneratorTest Coding Standards - - - -

    GeneratorTest Coding Standards

    -

    Superfluous code element §

    -

    This is a standard block.

    - - - - - - - - - -
    Valid: Checking handling of blank lines.Invalid: Checking handling of blank lines.
    $valid = true;$invalid = true;
    -
    Documentation generated on #REDACTED# by PHP_CodeSniffer #VERSION#
    - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputUnsupportedSuperfluousCodeElement.md b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputUnsupportedSuperfluousCodeElement.md deleted file mode 100644 index f6cdad9..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputUnsupportedSuperfluousCodeElement.md +++ /dev/null @@ -1,25 +0,0 @@ -# GeneratorTest Coding Standard - -## Superfluous code element - -This is a standard block. - - - - - - - - - -
    Valid: Checking handling of blank lines.Invalid: Checking handling of blank lines.
    - - $valid = true; - - - - $invalid = true; - -
    - -Documentation generated on *REDACTED* by [PHP_CodeSniffer *VERSION*](https://github.com/PHPCSStandards/PHP_CodeSniffer) diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputUnsupportedSuperfluousCodeElement.txt b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputUnsupportedSuperfluousCodeElement.txt deleted file mode 100644 index 1307eeb..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Expectations/ExpectedOutputUnsupportedSuperfluousCodeElement.txt +++ /dev/null @@ -1,13 +0,0 @@ - ------------------------------------------------------------ -| GENERATORTEST CODING STANDARD: SUPERFLUOUS CODE ELEMENT | ------------------------------------------------------------ - -This is a standard block. - ------------------------------------------ CODE COMPARISON ------------------------------------------ -| Valid: Checking handling of blank lines. | Invalid: Checking handling of blank lines. | ----------------------------------------------------------------------------------------------------- -| $valid = true; | $invalid = true; | ----------------------------------------------------------------------------------------------------- - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/HTMLDouble.php b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/HTMLDouble.php deleted file mode 100644 index 2cc8f20..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/HTMLDouble.php +++ /dev/null @@ -1,70 +0,0 @@ -Documentation generated on #REDACTED# by PHP_CodeSniffer #VERSION#
    - -'; - - // Use the correct line endings based on the OS. - return str_replace("\n", PHP_EOL, $output).PHP_EOL; - } - - /** - * Retrieve the _real_ footer of the HTML page. - * - * @return string - */ - public function getRealFooter() - { - return parent::getFormattedFooter(); - } - - /** - * [VISIBILITY WIDENING ONLY] Print the header of the HTML page. - * - * @return void - */ - public function printHeader() - { - parent::printHeader(); - } - - /** - * [VISIBILITY WIDENING ONLY] Print the table of contents for the standard. - * - * @return void - */ - public function printToc() - { - parent::printToc(); - } - - /** - * [VISIBILITY WIDENING ONLY] Print the footer of the HTML page. - * - * @return void - */ - public function printFooter() - { - parent::printFooter(); - } -} diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/MarkdownDouble.php b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/MarkdownDouble.php deleted file mode 100644 index 3b4d769..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/MarkdownDouble.php +++ /dev/null @@ -1,68 +0,0 @@ -getTitle($doc), PHP_EOL; - } -} diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/CodeComparisonBlankLinesStandard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/CodeComparisonBlankLinesStandard.xml deleted file mode 100644 index bcaf82b..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/CodeComparisonBlankLinesStandard.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/CodeComparisonBlockLengthStandard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/CodeComparisonBlockLengthStandard.xml deleted file mode 100644 index c479a7f..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/CodeComparisonBlockLengthStandard.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - $one = 10; - ]]> - - - $a = 10; - ]]> - - - - - echo $foo; - ]]> - - - print $foo; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/CodeComparisonEncodingStandard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/CodeComparisonEncodingStandard.xml deleted file mode 100644 index c366553..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/CodeComparisonEncodingStandard.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - $f; -$g = $h <= $i; -$j = $k >= $l; -$m = $n <=> $o; - ]]> - - - - -// The above PHP tag is specifically testing -// handling of that in generated HTML doc. - -// Now let's also check the handling of -// comparison operators in code samples -// in combination with "em" tags. -$a = $b < $c; -$d = $e > $f; -$g = $h <= $i; -$j = $k >= $l; -$m = $n <=> $o; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/CodeComparisonLineLengthStandard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/CodeComparisonLineLengthStandard.xml deleted file mode 100644 index b4431ea..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/CodeComparisonLineLengthStandard.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - Countable, Serializable -{ -} - ]]> - - - foobar($param1, $param2) {} -} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/CodeTitleLineWrappingStandard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/CodeTitleLineWrappingStandard.xml deleted file mode 100644 index b773f7a..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/CodeTitleLineWrappingStandard.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/CodeTitleWhitespaceStandard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/CodeTitleWhitespaceStandard.xml deleted file mode 100644 index 2829720..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/CodeTitleWhitespaceStandard.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/DocumentationTitleCaseStandard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/DocumentationTitleCaseStandard.xml deleted file mode 100644 index a4078e3..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/DocumentationTitleCaseStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/DocumentationTitleLengthStandard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/DocumentationTitleLengthStandard.xml deleted file mode 100644 index 2448927..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/DocumentationTitleLengthStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/DocumentationTitlePCREFallbackStandard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/DocumentationTitlePCREFallbackStandard.xml deleted file mode 100644 index 1aa3849..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/DocumentationTitlePCREFallbackStandard.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/DocumentationTitleToAnchorSlug1Standard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/DocumentationTitleToAnchorSlug1Standard.xml deleted file mode 100644 index 4edae69..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/DocumentationTitleToAnchorSlug1Standard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/DocumentationTitleToAnchorSlug2Standard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/DocumentationTitleToAnchorSlug2Standard.xml deleted file mode 100644 index 43956e3..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/DocumentationTitleToAnchorSlug2Standard.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/DocumentationTitleToAnchorSlug3Standard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/DocumentationTitleToAnchorSlug3Standard.xml deleted file mode 100644 index 43956e3..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/DocumentationTitleToAnchorSlug3Standard.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/StandardBlankLinesStandard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/StandardBlankLinesStandard.xml deleted file mode 100644 index 10c47bf..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/StandardBlankLinesStandard.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/StandardEncodingStandard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/StandardEncodingStandard.xml deleted file mode 100644 index 3e34c3f..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/StandardEncodingStandard.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - tags in standard descriptions is allowed and their handling should be safeguarded. - Other tags, like link, bold, are not allowed and will be encoded for display when the HTML or Markdown report is used. - ]]> - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/StandardIndentStandard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/StandardIndentStandard.xml deleted file mode 100644 index b2ec6c5..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/StandardIndentStandard.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/StandardLineWrappingStandard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/StandardLineWrappingStandard.xml deleted file mode 100644 index 66bbb96..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Content/StandardLineWrappingStandard.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/CodeComparisonMismatchedCodeElmsStandard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/CodeComparisonMismatchedCodeElmsStandard.xml deleted file mode 100644 index d0cfff4..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/CodeComparisonMismatchedCodeElmsStandard.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/CodeComparisonMissingCodeElmStandard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/CodeComparisonMissingCodeElmStandard.xml deleted file mode 100644 index 999901e..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/CodeComparisonMissingCodeElmStandard.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/CodeComparisonNoCodeStandard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/CodeComparisonNoCodeStandard.xml deleted file mode 100644 index 54b50ff..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/CodeComparisonNoCodeStandard.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/CodeComparisonNoContentStandard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/CodeComparisonNoContentStandard.xml deleted file mode 100644 index 0dfb12f..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/CodeComparisonNoContentStandard.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/CodeComparisonOneEmptyCodeElmStandard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/CodeComparisonOneEmptyCodeElmStandard.xml deleted file mode 100644 index b406744..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/CodeComparisonOneEmptyCodeElmStandard.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/CodeComparisonTwoEmptyCodeElmsStandard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/CodeComparisonTwoEmptyCodeElmsStandard.xml deleted file mode 100644 index e6cb071..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/CodeComparisonTwoEmptyCodeElmsStandard.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/CodeTitleEmptyStandard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/CodeTitleEmptyStandard.xml deleted file mode 100644 index 034bdf2..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/CodeTitleEmptyStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/CodeTitleMissingStandard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/CodeTitleMissingStandard.xml deleted file mode 100644 index 89599dd..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/CodeTitleMissingStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/DocumentationTitleEmptyStandard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/DocumentationTitleEmptyStandard.xml deleted file mode 100644 index c3ab071..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/DocumentationTitleEmptyStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - class Code {} - ]]> - - - class Comparison {} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/DocumentationTitleMissingStandard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/DocumentationTitleMissingStandard.xml deleted file mode 100644 index 974071d..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/DocumentationTitleMissingStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - class Code {} - ]]> - - - class Comparison {} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/StandardNoContentStandard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/StandardNoContentStandard.xml deleted file mode 100644 index e693470..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Invalid/StandardNoContentStandard.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - class Code {} - ]]> - - - class Comparison {} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Structure/NoContentStandard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Structure/NoContentStandard.xml deleted file mode 100644 index 83afee8..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Structure/NoContentStandard.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Structure/NoDocumentationElementStandard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Structure/NoDocumentationElementStandard.xml deleted file mode 100644 index ca8290f..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Structure/NoDocumentationElementStandard.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Structure/OneCodeComparisonNoStandardStandard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Structure/OneCodeComparisonNoStandardStandard.xml deleted file mode 100644 index c2af909..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Structure/OneCodeComparisonNoStandardStandard.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - class Code {} - ]]> - - - class Comparison {} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Structure/OneStandardBlockCodeComparisonStandard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Structure/OneStandardBlockCodeComparisonStandard.xml deleted file mode 100644 index c3ce35c..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Structure/OneStandardBlockCodeComparisonStandard.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - class Code {} - ]]> - - - class Comparison {} - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Structure/OneStandardBlockNoCodeStandard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Structure/OneStandardBlockNoCodeStandard.xml deleted file mode 100644 index fc01494..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Structure/OneStandardBlockNoCodeStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Structure/OneStandardBlockTwoCodeComparisonsStandard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Structure/OneStandardBlockTwoCodeComparisonsStandard.xml deleted file mode 100644 index 19559e6..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Structure/OneStandardBlockTwoCodeComparisonsStandard.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - class Code {} - ]]> - - - class Comparison {} - ]]> - - - - - $one = 10; - ]]> - - - $a = 10; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Structure/TwoStandardBlocksNoCodeStandard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Structure/TwoStandardBlocksNoCodeStandard.xml deleted file mode 100644 index f5f621e..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Structure/TwoStandardBlocksNoCodeStandard.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Structure/TwoStandardBlocksOneCodeComparisonStandard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Structure/TwoStandardBlocksOneCodeComparisonStandard.xml deleted file mode 100644 index a5b3a32..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Structure/TwoStandardBlocksOneCodeComparisonStandard.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - Code {} - ]]> - - - Comparison {} - ]]> - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Structure/TwoStandardBlocksThreeCodeComparisonsStandard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Structure/TwoStandardBlocksThreeCodeComparisonsStandard.xml deleted file mode 100644 index 540ac7e..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Structure/TwoStandardBlocksThreeCodeComparisonsStandard.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - class Code {} - ]]> - - - class Comparison {} - ]]> - - - - - - - - $one = 10; - ]]> - - - $a = 10; - ]]> - - - - - echo $foo; - ]]> - - - print $foo; - ]]> - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Unsupported/ElementAtWrongLevelStandard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Unsupported/ElementAtWrongLevelStandard.xml deleted file mode 100644 index 68519dd..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Unsupported/ElementAtWrongLevelStandard.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Unsupported/OneElmAtWrongLevelStandard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Unsupported/OneElmAtWrongLevelStandard.xml deleted file mode 100644 index 6c1dd16..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Unsupported/OneElmAtWrongLevelStandard.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Unsupported/SuperfluousCodeElementStandard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Unsupported/SuperfluousCodeElementStandard.xml deleted file mode 100644 index 333786a..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Unsupported/SuperfluousCodeElementStandard.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Unsupported/UnknownElementStandard.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Unsupported/UnknownElementStandard.xml deleted file mode 100644 index c9ec322..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Docs/Unsupported/UnknownElementStandard.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Content/CodeComparisonBlankLinesSniff.php b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Content/CodeComparisonBlankLinesSniff.php deleted file mode 100644 index 1e56bf9..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/Fixtures/StandardWithDocs/Sniffs/Content/CodeComparisonBlankLinesSniff.php +++ /dev/null @@ -1,12 +0,0 @@ - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/GeneratorTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/GeneratorTest.php deleted file mode 100644 index 8e85c19..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/GeneratorTest.php +++ /dev/null @@ -1,227 +0,0 @@ - $expected The expected list of found docs. - * - * @dataProvider dataConstructor - * - * @return void - */ - public function testConstructor($standard, array $expected) - { - // Set up the ruleset. - $config = new ConfigDouble(["--standard=$standard"]); - $ruleset = new Ruleset($config); - - $generator = new MockGenerator($ruleset); - $this->assertSame($expected, $generator->docFiles); - - }//end testConstructor() - - - /** - * Data provider. - * - * @return array>> - */ - public static function dataConstructor() - { - $pathToDocsInFixture = __DIR__.DIRECTORY_SEPARATOR.'Fixtures'; - $pathToDocsInFixture .= DIRECTORY_SEPARATOR.'StandardWithDocs'; - $pathToDocsInFixture .= DIRECTORY_SEPARATOR.'Docs'.DIRECTORY_SEPARATOR; - - return [ - 'Standard without docs' => [ - 'standard' => __DIR__.'/NoDocsTest.xml', - 'expected' => [], - ], - 'Standard with an invalid doc file' => [ - 'standard' => __DIR__.'/NoValidDocsTest.xml', - 'expected' => [ - $pathToDocsInFixture.'Structure'.DIRECTORY_SEPARATOR.'NoDocumentationElementStandard.xml', - ], - ], - 'Standard with one doc file' => [ - 'standard' => __DIR__.'/OneDocTest.xml', - 'expected' => [ - $pathToDocsInFixture.'Structure'.DIRECTORY_SEPARATOR.'OneStandardBlockNoCodeStandard.xml', - ], - ], - 'Standard with multiple doc files' => [ - 'standard' => __DIR__.'/StructureDocsTest.xml', - 'expected' => [ - $pathToDocsInFixture.'Structure'.DIRECTORY_SEPARATOR.'NoContentStandard.xml', - $pathToDocsInFixture.'Structure'.DIRECTORY_SEPARATOR.'OneCodeComparisonNoStandardStandard.xml', - $pathToDocsInFixture.'Structure'.DIRECTORY_SEPARATOR.'OneStandardBlockCodeComparisonStandard.xml', - $pathToDocsInFixture.'Structure'.DIRECTORY_SEPARATOR.'OneStandardBlockNoCodeStandard.xml', - $pathToDocsInFixture.'Structure'.DIRECTORY_SEPARATOR.'OneStandardBlockTwoCodeComparisonsStandard.xml', - $pathToDocsInFixture.'Structure'.DIRECTORY_SEPARATOR.'TwoStandardBlocksNoCodeStandard.xml', - $pathToDocsInFixture.'Structure'.DIRECTORY_SEPARATOR.'TwoStandardBlocksOneCodeComparisonStandard.xml', - $pathToDocsInFixture.'Structure'.DIRECTORY_SEPARATOR.'TwoStandardBlocksThreeCodeComparisonsStandard.xml', - ], - ], - ]; - - }//end dataConstructor() - - - /** - * Verify that an XML doc which isn't valid documentation yields an Exception to warn devs. - * - * This should not be hidden via defensive coding! - * - * @return void - */ - public function testGeneratingInvalidDocsResultsInException() - { - // Set up the ruleset. - $standard = __DIR__.'/NoValidDocsTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - $ruleset = new Ruleset($config); - - if (PHP_VERSION_ID >= 80000) { - $exception = 'TypeError'; - $message = 'processSniff(): Argument #1 ($doc) must be of type DOMNode, null given'; - } else if (PHP_VERSION_ID >= 70000) { - $exception = 'TypeError'; - $message = 'processSniff() must be an instance of DOMNode, null given'; - } else { - $exception = 'PHPUnit_Framework_Error'; - $message = 'processSniff() must be an instance of DOMNode, null given'; - } - - if (method_exists($this, 'expectExceptionMessage') === true) { - // PHPUnit 5.2.0+. - $this->expectException($exception); - $this->expectExceptionMessage($message); - } else { - // Ancient PHPUnit. - $this->setExpectedException($exception, $message); - } - - $generator = new MockGenerator($ruleset); - $generator->generate(); - - }//end testGeneratingInvalidDocsResultsInException() - - - /** - * Verify the wiring for the generate() function. - * - * @param string $standard The standard to use for the test. - * @param string $expected The expected function output. - * - * @dataProvider dataGeneratingDocs - * - * @return void - */ - public function testGeneratingDocs($standard, $expected) - { - // Set up the ruleset. - $config = new ConfigDouble(["--standard=$standard"]); - $ruleset = new Ruleset($config); - - $this->expectOutputString($expected); - - $generator = new MockGenerator($ruleset); - $generator->generate(); - - }//end testGeneratingDocs() - - - /** - * Data provider. - * - * @return array> - */ - public static function dataGeneratingDocs() - { - $multidocExpected = []; - $multidocExpected[] = 'No Content'; - $multidocExpected[] = 'Code Comparison Only, Missing Standard Block'; - $multidocExpected[] = 'One Standard Block, Code Comparison'; - $multidocExpected[] = 'One Standard Block, No Code'; - $multidocExpected[] = 'One Standard Block, Two Code Comparisons'; - $multidocExpected[] = 'Two Standard Blocks, No Code'; - $multidocExpected[] = 'Two Standard Blocks, One Code Comparison'; - $multidocExpected[] = 'Two Standard Blocks, Three Code Comparisons'; - $multidocExpected = implode(PHP_EOL, $multidocExpected).PHP_EOL; - - return [ - 'Standard without docs' => [ - 'standard' => __DIR__.'/NoDocsTest.xml', - 'expected' => '', - ], - 'Standard with one doc file' => [ - 'standard' => __DIR__.'/OneDocTest.xml', - 'expected' => 'One Standard Block, No Code'.PHP_EOL, - ], - 'Standard with multiple doc files' => [ - 'standard' => __DIR__.'/StructureDocsTest.xml', - 'expected' => $multidocExpected, - ], - ]; - - }//end dataGeneratingDocs() - - - /** - * Verify that if the `` title is missing, it will fallback to the file name - * and split the CamelCaps name correctly. - * - * @return void - */ - public function testGetTitleFallbackToFilename() - { - // Set up the ruleset. - $standard = __DIR__.'/AllValidDocsTest.xml'; - $sniffs = 'StandardWithDocs.Content.DocumentationTitlePCREFallback'; - $config = new ConfigDouble(["--standard=$standard", "--sniffs=$sniffs"]); - $ruleset = new Ruleset($config); - - // In tests, the `--sniffs` setting doesn't work out of the box. - $sniffParts = explode('.', $sniffs); - $sniffFile = __DIR__.DIRECTORY_SEPARATOR.'Fixtures'.DIRECTORY_SEPARATOR.$sniffParts[0].DIRECTORY_SEPARATOR; - $sniffFile .= 'Sniffs'.DIRECTORY_SEPARATOR.$sniffParts[1].DIRECTORY_SEPARATOR.$sniffParts[2].'Sniff.php'; - - $sniffParts = array_map('strtolower', $sniffParts); - $sniffName = $sniffParts[0].'\sniffs\\'.$sniffParts[1].'\\'.$sniffParts[2].'sniff'; - $restrictions = [$sniffName => true]; - $ruleset->registerSniffs([$sniffFile], $restrictions, []); - - // Make the test OS independent. - $this->expectOutputString('Documentation Title PCRE Fallback'.PHP_EOL); - - $generator = new MockGenerator($ruleset); - $generator->generate(); - - }//end testGetTitleFallbackToFilename() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/HTMLTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/HTMLTest.php deleted file mode 100644 index 39b3cc2..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/HTMLTest.php +++ /dev/null @@ -1,426 +0,0 @@ -assertNotFalse($expected, 'Output expectation file could not be found'); - - // Make the test OS independent. - $expected = str_replace("\n", PHP_EOL, $expected); - $this->expectOutputString($expected); - - $generator = new HTMLDouble($ruleset); - $generator->generate(); - - }//end testDocs() - - - /** - * Data provider. - * - * @return array> - */ - public static function dataDocs() - { - return [ - 'Standard without docs' => [ - 'standard' => __DIR__.'/NoDocsTest.xml', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputEmpty.txt', - ], - 'Standard with one doc file' => [ - 'standard' => __DIR__.'/OneDocTest.xml', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputOneDoc.html', - ], - 'Standard with multiple doc files' => [ - 'standard' => __DIR__.'/StructureDocsTest.xml', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputStructureDocs.html', - ], - ]; - - }//end dataDocs() - - - /** - * Test the generated docs for the handling of specific parts of the documentation. - * - * @param string $sniffs The specific fixture sniffs to verify the docs for. - * @param string $pathToExpected Path to a file containing the expected function output. - * - * @dataProvider dataDocSpecifics - * - * @return void - */ - public function testDocSpecifics($sniffs, $pathToExpected) - { - // Set up the ruleset. - $standard = __DIR__.'/AllValidDocsTest.xml'; - $config = new ConfigDouble(["--standard=$standard", "--sniffs=$sniffs"]); - $ruleset = new Ruleset($config); - - // In tests, the `--sniffs` setting doesn't work out of the box. - $sniffParts = explode('.', $sniffs); - $sniffFile = __DIR__.DIRECTORY_SEPARATOR.'Fixtures'.DIRECTORY_SEPARATOR.$sniffParts[0].DIRECTORY_SEPARATOR; - $sniffFile .= 'Sniffs'.DIRECTORY_SEPARATOR.$sniffParts[1].DIRECTORY_SEPARATOR.$sniffParts[2].'Sniff.php'; - - $sniffParts = array_map('strtolower', $sniffParts); - $sniffName = $sniffParts[0].'\sniffs\\'.$sniffParts[1].'\\'.$sniffParts[2].'sniff'; - $restrictions = [$sniffName => true]; - $ruleset->registerSniffs([$sniffFile], $restrictions, []); - - $expected = file_get_contents($pathToExpected); - $this->assertNotFalse($expected, 'Output expectation file could not be found'); - - // Make the test OS independent. - $expected = str_replace("\n", PHP_EOL, $expected); - $this->expectOutputString($expected); - - $generator = new HTMLDouble($ruleset); - $generator->generate(); - - }//end testDocSpecifics() - - - /** - * Data provider. - * - * @return array> - */ - public static function dataDocSpecifics() - { - return [ - 'Documentation title: case' => [ - 'sniffs' => 'StandardWithDocs.Content.DocumentationTitleCase', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputDocumentationTitleCase.html', - ], - 'Documentation title: length' => [ - 'sniffs' => 'StandardWithDocs.Content.DocumentationTitleLength', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputDocumentationTitleLength.html', - ], - 'Documentation title: fallback to file name' => [ - 'sniffs' => 'StandardWithDocs.Content.DocumentationTitlePCREFallback', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputDocumentationTitlePCREFallback.html', - ], - 'Standard Element: blank line handling' => [ - 'sniffs' => 'StandardWithDocs.Content.StandardBlankLines', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputStandardBlankLines.html', - ], - 'Standard Element: encoding of special characters' => [ - 'sniffs' => 'StandardWithDocs.Content.StandardEncoding', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputStandardEncoding.html', - ], - 'Standard Element: indent handling' => [ - 'sniffs' => 'StandardWithDocs.Content.StandardIndent', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputStandardIndent.html', - ], - 'Standard Element: line wrapping' => [ - 'sniffs' => 'StandardWithDocs.Content.StandardLineWrapping', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputStandardLineWrapping.html', - ], - 'Code Title: line wrapping' => [ - 'sniffs' => 'StandardWithDocs.Content.CodeTitleLineWrapping', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputCodeTitleLineWrapping.html', - ], - 'Code Title: whitespace handling' => [ - 'sniffs' => 'StandardWithDocs.Content.CodeTitleWhitespace', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputCodeTitleWhitespace.html', - ], - 'Code Comparison: blank line handling' => [ - 'sniffs' => 'StandardWithDocs.Content.CodeComparisonBlankLines', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputCodeComparisonBlankLines.html', - ], - 'Code Comparison: different block lengths' => [ - 'sniffs' => 'StandardWithDocs.Content.CodeComparisonBlockLength', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputCodeComparisonBlockLength.html', - ], - 'Code Comparison: encoding of special characters' => [ - 'sniffs' => 'StandardWithDocs.Content.CodeComparisonEncoding', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputCodeComparisonEncoding.html', - ], - 'Code Comparison: line length handling' => [ - 'sniffs' => 'StandardWithDocs.Content.CodeComparisonLineLength', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputCodeComparisonLineLength.html', - ], - 'Unsupported: element at the wrong level' => [ - 'sniffs' => 'StandardWithDocs.Unsupported.ElementAtWrongLevel', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputEmpty.txt', - ], - 'Unsupported: one correct elm, one at wrong level' => [ - 'sniffs' => 'StandardWithDocs.Unsupported.OneElmAtWrongLevel', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputUnsupportedOneElmAtWrongLevel.html', - ], - 'Unsupported: superfluous code element' => [ - 'sniffs' => 'StandardWithDocs.Unsupported.SuperfluousCodeElement', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputUnsupportedSuperfluousCodeElement.html', - ], - 'Unsupported: unknown element' => [ - 'sniffs' => 'StandardWithDocs.Unsupported.UnknownElement', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputEmpty.txt', - ], - 'Invalid: code comparison mismatched code elms' => [ - 'sniffs' => 'StandardWithDocs.Invalid.CodeComparisonMismatchedCodeElms', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidCodeComparisonMismatchedCodeElms.html', - ], - 'Invalid: code comparison only has one code elm' => [ - 'sniffs' => 'StandardWithDocs.Invalid.CodeComparisonMissingCodeElm', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidCodeComparisonMissingCodeElm.html', - ], - 'Invalid: code elements have no content' => [ - 'sniffs' => 'StandardWithDocs.Invalid.CodeComparisonNoCode', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidCodeComparisonNoCode.html', - ], - 'Invalid: code comparison element has no content' => [ - 'sniffs' => 'StandardWithDocs.Invalid.CodeComparisonNoContent', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidCodeComparisonNoContent.html', - ], - 'Invalid: code comparison two code elms, one empty' => [ - 'sniffs' => 'StandardWithDocs.Invalid.CodeComparisonOneEmptyCodeElm', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidCodeComparisonOneEmptyCodeElm.html', - ], - 'Invalid: code comparison two empty code elms' => [ - 'sniffs' => 'StandardWithDocs.Invalid.CodeComparisonTwoEmptyCodeElms', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidCodeComparisonTwoEmptyCodeElms.html', - ], - 'Invalid: code title attributes are empty' => [ - 'sniffs' => 'StandardWithDocs.Invalid.CodeTitleEmpty', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidCodeTitleEmpty.html', - ], - 'Invalid: code title attributes missing' => [ - 'sniffs' => 'StandardWithDocs.Invalid.CodeTitleMissing', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidCodeTitleMissing.html', - ], - 'Invalid: documentation title attribute is empty' => [ - 'sniffs' => 'StandardWithDocs.Invalid.DocumentationTitleEmpty', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidDocumentationTitleEmpty.html', - ], - 'Invalid: documentation title attribute missing' => [ - 'sniffs' => 'StandardWithDocs.Invalid.DocumentationTitleMissing', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidDocumentationTitleMissing.html', - ], - 'Invalid: standard element has no content' => [ - 'sniffs' => 'StandardWithDocs.Invalid.StandardNoContent', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidStandardNoContent.html', - ], - ]; - - }//end dataDocSpecifics() - - - /** - * Test anchor links in the generated docs are slugified and unique. - * - * @return void - */ - public function testAnchorLinks() - { - // Set up the ruleset. - $standard = __DIR__.'/AnchorLinksTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - $ruleset = new Ruleset($config); - - $pathToExpected = __DIR__.'/Expectations/ExpectedOutputDocumentationTitleToAnchorSlug.html'; - $expected = file_get_contents($pathToExpected); - $this->assertNotFalse($expected, 'Output expectation file could not be found'); - - // Make the test OS independent. - $expected = str_replace("\n", PHP_EOL, $expected); - $this->expectOutputString($expected); - - $generator = new HTMLDouble($ruleset); - $generator->generate(); - - }//end testAnchorLinks() - - - /** - * Test the generated footer. - * - * @return void - */ - public function testFooter() - { - // Set up the ruleset. - $standard = __DIR__.'/OneDocTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - $ruleset = new Ruleset($config); - - $regex = '`^
    '; - $regex .= 'Documentation generated on [A-Z][a-z]{2}, [0-9]{2} [A-Z][a-z]{2} 20[0-9]{2} [0-2][0-9](?::[0-5][0-9]){2} [+-][0-9]{4}'; - $regex .= ' by PHP_CodeSniffer [3-9]\.[0-9]+.[0-9]+'; - $regex .= '
    \R \R\R$`'; - - $generator = new HTMLDouble($ruleset); - $footer = $generator->getRealFooter(); - - if (method_exists($this, 'assertMatchesRegularExpression') === true) { - $this->assertMatchesRegularExpression($regex, $footer); - } else { - // PHPUnit < 9.1.0. - $this->assertRegExp($regex, $footer); - } - - }//end testFooter() - - - /** - * Safeguard that the footer logic doesn't permanently change the error level. - * - * @runInSeparateProcess - * @preserveGlobalState disabled - * - * @return void - */ - public function testFooterResetsErrorReportingToOriginalSetting() - { - $expected = error_reporting(); - - // Set up the ruleset. - $standard = __DIR__.'/OneDocTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - $ruleset = new Ruleset($config); - - $generator = new HTMLDouble($ruleset); - $generator->getRealFooter(); - - $this->assertSame($expected, error_reporting()); - - }//end testFooterResetsErrorReportingToOriginalSetting() - - - /** - * Safeguard that users won't see a PHP warning about the timezone not being set when calling date(). - * - * The warning we don't want to see is: - * "date(): It is not safe to rely on the system's timezone settings. You are *required* to use - * the date.timezone setting or the date_default_timezone_set() function. In case you used any of - * those methods and you are still getting this warning, you most likely misspelled the timezone - * identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select - * your timezone." - * - * JRF: Based on my tests, the warning only occurs on PHP < 7.0, but never a bad thing to safeguard this - * on a wider range of PHP versions. - * - * Note: as of PHP 8.2, PHP no longer accepts an empty string as timezone and will use `UTC` instead, - * so the warning on calling date() in the code itself would not display anyway. - * - * @requires PHP < 8.2 - * - * @doesNotPerformAssertions - * - * @return void - */ - public function testFooterDoesntThrowWarningOnMissingTimezone() - { - $originalIni = @ini_set('date.timezone', ''); - - // Set up the ruleset. - $standard = __DIR__.'/OneDocTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - $ruleset = new Ruleset($config); - - $generator = new HTMLDouble($ruleset); - $generator->getRealFooter(); - - // Reset the timezone to its original state. - ini_set('date.timezone', $originalIni); - - }//end testFooterDoesntThrowWarningOnMissingTimezone() - - - /** - * Perfunctory test to verify that extenders which call deprecated methods will see a deprecation notice. - * - * Note: not all deprecated methods are tested as some need arguments. - * - * @param string $methodName Name of the deprecated method to test. - * - * @dataProvider dataCallingDeprecatedMethodThrowsDeprecationNotice - * - * @return void - */ - public function testCallingDeprecatedMethodThrowsDeprecationNotice($methodName) - { - $exceptionClass = 'PHPUnit\Framework\Error\Deprecated'; - if (class_exists($exceptionClass) === false) { - $exceptionClass = 'PHPUnit_Framework_Error_Deprecated'; - } - - $regex = '`^The PHP_CodeSniffer\\\\Generators\\\\HTML::%s\(\) method is deprecated\. Use "echo [^\s]+::%s\(\)" instead\.$`'; - $regex = sprintf($regex, preg_quote($methodName, '`'), str_replace('print', 'getFormatted', $methodName)); - - if (method_exists($this, 'expectExceptionMessageMatches') === true) { - $this->expectException($exceptionClass); - $this->expectExceptionMessageMatches($regex); - } else if (method_exists($this, 'expectExceptionMessageRegExp') === true) { - // PHPUnit < 8.4.0. - $this->expectException($exceptionClass); - $this->expectExceptionMessageRegExp($regex); - } else { - // PHPUnit < 5.2.0. - $this->setExpectedExceptionRegExp($exceptionClass, $regex); - } - - // Set up the ruleset. - $standard = __DIR__.'/OneDocTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - $ruleset = new Ruleset($config); - - $generator = new HTMLDouble($ruleset); - $generator->$methodName(); - - }//end testCallingDeprecatedMethodThrowsDeprecationNotice() - - - /** - * Data provider. - * - * @return array> - */ - public static function dataCallingDeprecatedMethodThrowsDeprecationNotice() - { - return [ - 'printHeader()' => ['printHeader'], - 'printToc()' => ['printToc'], - 'printFooter()' => ['printFooter'], - ]; - - }//end dataCallingDeprecatedMethodThrowsDeprecationNotice() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/MarkdownTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/MarkdownTest.php deleted file mode 100644 index 082b2a0..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/MarkdownTest.php +++ /dev/null @@ -1,397 +0,0 @@ -assertNotFalse($expected, 'Output expectation file could not be found'); - - // Make the test OS independent. - $expected = str_replace("\n", PHP_EOL, $expected); - $this->expectOutputString($expected); - - $generator = new MarkdownDouble($ruleset); - $generator->generate(); - - }//end testDocs() - - - /** - * Data provider. - * - * @return array> - */ - public static function dataDocs() - { - return [ - 'Standard without docs' => [ - 'standard' => __DIR__.'/NoDocsTest.xml', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputEmpty.txt', - ], - 'Standard with one doc file' => [ - 'standard' => __DIR__.'/OneDocTest.xml', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputOneDoc.md', - ], - 'Standard with multiple doc files' => [ - 'standard' => __DIR__.'/StructureDocsTest.xml', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputStructureDocs.md', - ], - ]; - - }//end dataDocs() - - - /** - * Test the generated docs for the handling of specific parts of the documentation. - * - * @param string $sniffs The specific fixture sniffs to verify the docs for. - * @param string $pathToExpected Path to a file containing the expected function output. - * - * @dataProvider dataDocSpecifics - * - * @return void - */ - public function testDocSpecifics($sniffs, $pathToExpected) - { - // Set up the ruleset. - $standard = __DIR__.'/AllValidDocsTest.xml'; - $config = new ConfigDouble(["--standard=$standard", "--sniffs=$sniffs"]); - $ruleset = new Ruleset($config); - - // In tests, the `--sniffs` setting doesn't work out of the box. - $sniffParts = explode('.', $sniffs); - $sniffFile = __DIR__.DIRECTORY_SEPARATOR.'Fixtures'.DIRECTORY_SEPARATOR.$sniffParts[0].DIRECTORY_SEPARATOR; - $sniffFile .= 'Sniffs'.DIRECTORY_SEPARATOR.$sniffParts[1].DIRECTORY_SEPARATOR.$sniffParts[2].'Sniff.php'; - - $sniffParts = array_map('strtolower', $sniffParts); - $sniffName = $sniffParts[0].'\sniffs\\'.$sniffParts[1].'\\'.$sniffParts[2].'sniff'; - $restrictions = [$sniffName => true]; - $ruleset->registerSniffs([$sniffFile], $restrictions, []); - - $expected = file_get_contents($pathToExpected); - $this->assertNotFalse($expected, 'Output expectation file could not be found'); - - // Make the test OS independent. - $expected = str_replace("\n", PHP_EOL, $expected); - $this->expectOutputString($expected); - - $generator = new MarkdownDouble($ruleset); - $generator->generate(); - - }//end testDocSpecifics() - - - /** - * Data provider. - * - * @return array> - */ - public static function dataDocSpecifics() - { - return [ - 'Documentation title: case' => [ - 'sniffs' => 'StandardWithDocs.Content.DocumentationTitleCase', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputDocumentationTitleCase.md', - ], - 'Documentation title: length' => [ - 'sniffs' => 'StandardWithDocs.Content.DocumentationTitleLength', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputDocumentationTitleLength.md', - ], - 'Documentation title: fallback to file name' => [ - 'sniffs' => 'StandardWithDocs.Content.DocumentationTitlePCREFallback', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputDocumentationTitlePCREFallback.md', - ], - 'Standard Element: blank line handling' => [ - 'sniffs' => 'StandardWithDocs.Content.StandardBlankLines', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputStandardBlankLines.md', - ], - 'Standard Element: encoding of special characters' => [ - 'sniffs' => 'StandardWithDocs.Content.StandardEncoding', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputStandardEncoding.md', - ], - 'Standard Element: indent handling' => [ - 'sniffs' => 'StandardWithDocs.Content.StandardIndent', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputStandardIndent.md', - ], - 'Standard Element: line wrapping' => [ - 'sniffs' => 'StandardWithDocs.Content.StandardLineWrapping', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputStandardLineWrapping.md', - ], - 'Code Title: line wrapping' => [ - 'sniffs' => 'StandardWithDocs.Content.CodeTitleLineWrapping', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputCodeTitleLineWrapping.md', - ], - 'Code Title: whitespace handling' => [ - 'sniffs' => 'StandardWithDocs.Content.CodeTitleWhitespace', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputCodeTitleWhitespace.md', - ], - 'Code Comparison: blank line handling' => [ - 'sniffs' => 'StandardWithDocs.Content.CodeComparisonBlankLines', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputCodeComparisonBlankLines.md', - ], - 'Code Comparison: different block lengths' => [ - 'sniffs' => 'StandardWithDocs.Content.CodeComparisonBlockLength', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputCodeComparisonBlockLength.md', - ], - 'Code Comparison: encoding of special characters' => [ - 'sniffs' => 'StandardWithDocs.Content.CodeComparisonEncoding', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputCodeComparisonEncoding.md', - ], - 'Code Comparison: line length handling' => [ - 'sniffs' => 'StandardWithDocs.Content.CodeComparisonLineLength', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputCodeComparisonLineLength.md', - ], - 'Unsupported: element at the wrong level' => [ - 'sniffs' => 'StandardWithDocs.Unsupported.ElementAtWrongLevel', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputEmpty.txt', - ], - 'Unsupported: one correct elm, one at wrong level' => [ - 'sniffs' => 'StandardWithDocs.Unsupported.OneElmAtWrongLevel', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputUnsupportedOneElmAtWrongLevel.md', - ], - 'Unsupported: superfluous code element' => [ - 'sniffs' => 'StandardWithDocs.Unsupported.SuperfluousCodeElement', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputUnsupportedSuperfluousCodeElement.md', - ], - 'Unsupported: unknown element' => [ - 'sniffs' => 'StandardWithDocs.Unsupported.UnknownElement', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputEmpty.txt', - ], - 'Invalid: code comparison mismatched code elms' => [ - 'sniffs' => 'StandardWithDocs.Invalid.CodeComparisonMismatchedCodeElms', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidCodeComparisonMismatchedCodeElms.md', - ], - 'Invalid: code comparison only has one code elm' => [ - 'sniffs' => 'StandardWithDocs.Invalid.CodeComparisonMissingCodeElm', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidCodeComparisonMissingCodeElm.md', - ], - 'Invalid: code elements have no content' => [ - 'sniffs' => 'StandardWithDocs.Invalid.CodeComparisonNoCode', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidCodeComparisonNoCode.md', - ], - 'Invalid: code comparison element has no content' => [ - 'sniffs' => 'StandardWithDocs.Invalid.CodeComparisonNoContent', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidCodeComparisonNoContent.md', - ], - 'Invalid: code comparison two code elms, one empty' => [ - 'sniffs' => 'StandardWithDocs.Invalid.CodeComparisonOneEmptyCodeElm', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidCodeComparisonOneEmptyCodeElm.md', - ], - 'Invalid: code comparison two empty code elms' => [ - 'sniffs' => 'StandardWithDocs.Invalid.CodeComparisonTwoEmptyCodeElms', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidCodeComparisonTwoEmptyCodeElms.md', - ], - 'Invalid: code title attributes are empty' => [ - 'sniffs' => 'StandardWithDocs.Invalid.CodeTitleEmpty', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidCodeTitleEmpty.md', - ], - 'Invalid: code title attributes missing' => [ - 'sniffs' => 'StandardWithDocs.Invalid.CodeTitleMissing', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidCodeTitleMissing.md', - ], - 'Invalid: documentation title attribute is empty' => [ - 'sniffs' => 'StandardWithDocs.Invalid.DocumentationTitleEmpty', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidDocumentationTitleEmpty.md', - ], - 'Invalid: documentation title attribute missing' => [ - 'sniffs' => 'StandardWithDocs.Invalid.DocumentationTitleMissing', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidDocumentationTitleMissing.md', - ], - 'Invalid: standard element has no content' => [ - 'sniffs' => 'StandardWithDocs.Invalid.StandardNoContent', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidStandardNoContent.md', - ], - ]; - - }//end dataDocSpecifics() - - - /** - * Test the generated footer. - * - * @return void - */ - public function testFooter() - { - // Set up the ruleset. - $standard = __DIR__.'/OneDocTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - $ruleset = new Ruleset($config); - - $regex = '`^\RDocumentation generated on [A-Z][a-z]{2}, [0-9]{2} [A-Z][a-z]{2} 20[0-9]{2} [0-2][0-9](?::[0-5][0-9]){2} [+-][0-9]{4}'; - $regex .= ' by \[PHP_CodeSniffer [3-9]\.[0-9]+.[0-9]+\]\(https://github\.com/PHPCSStandards/PHP_CodeSniffer\)\R$`'; - - $generator = new MarkdownDouble($ruleset); - $footer = $generator->getRealFooter(); - - if (method_exists($this, 'assertMatchesRegularExpression') === true) { - $this->assertMatchesRegularExpression($regex, $footer); - } else { - // PHPUnit < 9.1.0. - $this->assertRegExp($regex, $footer); - } - - }//end testFooter() - - - /** - * Safeguard that the footer logic doesn't permanently change the error level. - * - * @runInSeparateProcess - * @preserveGlobalState disabled - * - * @return void - */ - public function testFooterResetsErrorReportingToOriginalSetting() - { - $expected = error_reporting(); - - // Set up the ruleset. - $standard = __DIR__.'/OneDocTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - $ruleset = new Ruleset($config); - - $generator = new MarkdownDouble($ruleset); - $generator->getRealFooter(); - - $this->assertSame($expected, error_reporting()); - - }//end testFooterResetsErrorReportingToOriginalSetting() - - - /** - * Safeguard that users won't see a PHP warning about the timezone not being set when calling date(). - * - * The warning we don't want to see is: - * "date(): It is not safe to rely on the system's timezone settings. You are *required* to use - * the date.timezone setting or the date_default_timezone_set() function. In case you used any of - * those methods and you are still getting this warning, you most likely misspelled the timezone - * identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select - * your timezone." - * - * JRF: Based on my tests, the warning only occurs on PHP < 7.0, but never a bad thing to safeguard this - * on a wider range of PHP versions. - * - * Note: as of PHP 8.2, PHP no longer accepts an empty string as timezone and will use `UTC` instead, - * so the warning on calling date() in the code itself would not display anyway. - * - * @requires PHP < 8.2 - * - * @doesNotPerformAssertions - * - * @return void - */ - public function testFooterDoesntThrowWarningOnMissingTimezone() - { - $originalIni = @ini_set('date.timezone', ''); - - // Set up the ruleset. - $standard = __DIR__.'/OneDocTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - $ruleset = new Ruleset($config); - - $generator = new MarkdownDouble($ruleset); - $generator->getRealFooter(); - - // Reset the timezone to its original state. - ini_set('date.timezone', $originalIni); - - }//end testFooterDoesntThrowWarningOnMissingTimezone() - - - /** - * Perfunctory test to verify that extenders which call deprecated methods will see a deprecation notice. - * - * Note: not all deprecated methods are tested as some need arguments. - * - * @param string $methodName Name of the deprecated method to test. - * - * @dataProvider dataCallingDeprecatedMethodThrowsDeprecationNotice - * - * @return void - */ - public function testCallingDeprecatedMethodThrowsDeprecationNotice($methodName) - { - $exceptionClass = 'PHPUnit\Framework\Error\Deprecated'; - if (class_exists($exceptionClass) === false) { - $exceptionClass = 'PHPUnit_Framework_Error_Deprecated'; - } - - $regex = '`^The PHP_CodeSniffer\\\\Generators\\\\Markdown::%s\(\) method is deprecated\. Use "echo [^\s]+::%s\(\)" instead\.$`'; - $regex = sprintf($regex, preg_quote($methodName, '`'), str_replace('print', 'getFormatted', $methodName)); - - if (method_exists($this, 'expectExceptionMessageMatches') === true) { - $this->expectException($exceptionClass); - $this->expectExceptionMessageMatches($regex); - } else if (method_exists($this, 'expectExceptionMessageRegExp') === true) { - // PHPUnit < 8.4.0. - $this->expectException($exceptionClass); - $this->expectExceptionMessageRegExp($regex); - } else { - // PHPUnit < 5.2.0. - $this->setExpectedExceptionRegExp($exceptionClass, $regex); - } - - // Set up the ruleset. - $standard = __DIR__.'/OneDocTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - $ruleset = new Ruleset($config); - - $generator = new MarkdownDouble($ruleset); - $generator->$methodName(); - - }//end testCallingDeprecatedMethodThrowsDeprecationNotice() - - - /** - * Data provider. - * - * @return array> - */ - public static function dataCallingDeprecatedMethodThrowsDeprecationNotice() - { - return [ - 'printHeader()' => ['printHeader'], - 'printFooter()' => ['printFooter'], - ]; - - }//end dataCallingDeprecatedMethodThrowsDeprecationNotice() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/NoDocsTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/NoDocsTest.xml deleted file mode 100644 index efb2999..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/NoDocsTest.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/NoValidDocsTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/NoValidDocsTest.xml deleted file mode 100644 index 9f5c9c4..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/NoValidDocsTest.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/OneDocTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/OneDocTest.xml deleted file mode 100644 index 50e64a8..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/OneDocTest.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/StructureDocsTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/StructureDocsTest.xml deleted file mode 100644 index 6199e28..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/StructureDocsTest.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/TextTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Generators/TextTest.php deleted file mode 100644 index ec00904..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Generators/TextTest.php +++ /dev/null @@ -1,245 +0,0 @@ -assertNotFalse($expected, 'Output expectation file could not be found'); - - // Make the test OS independent. - $expected = str_replace("\n", PHP_EOL, $expected); - $this->expectOutputString($expected); - - $generator = new Text($ruleset); - $generator->generate(); - - }//end testDocs() - - - /** - * Data provider. - * - * @return array> - */ - public static function dataDocs() - { - return [ - 'Standard without docs' => [ - 'standard' => __DIR__.'/NoDocsTest.xml', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputEmpty.txt', - ], - 'Standard with one doc file' => [ - 'standard' => __DIR__.'/OneDocTest.xml', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputOneDoc.txt', - ], - 'Standard with multiple doc files' => [ - 'standard' => __DIR__.'/StructureDocsTest.xml', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputStructureDocs.txt', - ], - ]; - - }//end dataDocs() - - - /** - * Test the generated docs for the handling of specific parts of the documentation. - * - * @param string $sniffs The specific fixture sniffs to verify the docs for. - * @param string $pathToExpected Path to a file containing the expected function output. - * - * @dataProvider dataDocSpecifics - * - * @return void - */ - public function testDocSpecifics($sniffs, $pathToExpected) - { - // Set up the ruleset. - $standard = __DIR__.'/AllValidDocsTest.xml'; - $config = new ConfigDouble(["--standard=$standard", "--sniffs=$sniffs"]); - $ruleset = new Ruleset($config); - - // In tests, the `--sniffs` setting doesn't work out of the box. - $sniffParts = explode('.', $sniffs); - $sniffFile = __DIR__.DIRECTORY_SEPARATOR.'Fixtures'.DIRECTORY_SEPARATOR.$sniffParts[0].DIRECTORY_SEPARATOR; - $sniffFile .= 'Sniffs'.DIRECTORY_SEPARATOR.$sniffParts[1].DIRECTORY_SEPARATOR.$sniffParts[2].'Sniff.php'; - - $sniffParts = array_map('strtolower', $sniffParts); - $sniffName = $sniffParts[0].'\sniffs\\'.$sniffParts[1].'\\'.$sniffParts[2].'sniff'; - $restrictions = [$sniffName => true]; - $ruleset->registerSniffs([$sniffFile], $restrictions, []); - - $expected = file_get_contents($pathToExpected); - $this->assertNotFalse($expected, 'Output expectation file could not be found'); - - // Make the test OS independent. - $expected = str_replace("\n", PHP_EOL, $expected); - $this->expectOutputString($expected); - - $generator = new Text($ruleset); - $generator->generate(); - - }//end testDocSpecifics() - - - /** - * Data provider. - * - * @return array> - */ - public static function dataDocSpecifics() - { - return [ - 'Documentation title: case' => [ - 'sniffs' => 'StandardWithDocs.Content.DocumentationTitleCase', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputDocumentationTitleCase.txt', - ], - 'Documentation title: length' => [ - 'sniffs' => 'StandardWithDocs.Content.DocumentationTitleLength', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputDocumentationTitleLength.txt', - ], - 'Documentation title: fallback to file name' => [ - 'sniffs' => 'StandardWithDocs.Content.DocumentationTitlePCREFallback', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputDocumentationTitlePCREFallback.txt', - ], - 'Standard Element: blank line handling' => [ - 'sniffs' => 'StandardWithDocs.Content.StandardBlankLines', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputStandardBlankLines.txt', - ], - 'Standard Element: encoding of special characters' => [ - 'sniffs' => 'StandardWithDocs.Content.StandardEncoding', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputStandardEncoding.txt', - ], - 'Standard Element: indent handling' => [ - 'sniffs' => 'StandardWithDocs.Content.StandardIndent', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputStandardIndent.txt', - ], - 'Standard Element: line wrapping' => [ - 'sniffs' => 'StandardWithDocs.Content.StandardLineWrapping', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputStandardLineWrapping.txt', - ], - 'Code Title: line wrapping' => [ - 'sniffs' => 'StandardWithDocs.Content.CodeTitleLineWrapping', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputCodeTitleLineWrapping.txt', - ], - 'Code Title: whitespace handling' => [ - 'sniffs' => 'StandardWithDocs.Content.CodeTitleWhitespace', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputCodeTitleWhitespace.txt', - ], - 'Code Comparison: blank line handling' => [ - 'sniffs' => 'StandardWithDocs.Content.CodeComparisonBlankLines', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputCodeComparisonBlankLines.txt', - ], - 'Code Comparison: different block lengths' => [ - 'sniffs' => 'StandardWithDocs.Content.CodeComparisonBlockLength', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputCodeComparisonBlockLength.txt', - ], - 'Code Comparison: encoding of special characters' => [ - 'sniffs' => 'StandardWithDocs.Content.CodeComparisonEncoding', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputCodeComparisonEncoding.txt', - ], - 'Code Comparison: line length handling' => [ - 'sniffs' => 'StandardWithDocs.Content.CodeComparisonLineLength', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputCodeComparisonLineLength.txt', - ], - 'Unsupported: element at the wrong level' => [ - 'sniffs' => 'StandardWithDocs.Unsupported.ElementAtWrongLevel', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputEmpty.txt', - ], - 'Unsupported: one correct elm, one at wrong level' => [ - 'sniffs' => 'StandardWithDocs.Unsupported.OneElmAtWrongLevel', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputUnsupportedOneElmAtWrongLevel.txt', - ], - 'Unsupported: superfluous code element' => [ - 'sniffs' => 'StandardWithDocs.Unsupported.SuperfluousCodeElement', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputUnsupportedSuperfluousCodeElement.txt', - ], - 'Unsupported: unknown element' => [ - 'sniffs' => 'StandardWithDocs.Unsupported.UnknownElement', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputEmpty.txt', - ], - 'Invalid: code comparison mismatched code elms' => [ - 'sniffs' => 'StandardWithDocs.Invalid.CodeComparisonMismatchedCodeElms', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidCodeComparisonMismatchedCodeElms.txt', - ], - 'Invalid: code comparison only has one code elm' => [ - 'sniffs' => 'StandardWithDocs.Invalid.CodeComparisonMissingCodeElm', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidCodeComparisonMissingCodeElm.txt', - ], - 'Invalid: code elements have no content' => [ - 'sniffs' => 'StandardWithDocs.Invalid.CodeComparisonNoCode', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidCodeComparisonNoCode.txt', - ], - 'Invalid: code comparison element has no content' => [ - 'sniffs' => 'StandardWithDocs.Invalid.CodeComparisonNoContent', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidCodeComparisonNoContent.txt', - ], - 'Invalid: code comparison two code elms, one empty' => [ - 'sniffs' => 'StandardWithDocs.Invalid.CodeComparisonOneEmptyCodeElm', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidCodeComparisonOneEmptyCodeElm.txt', - ], - 'Invalid: code comparison two empty code elms' => [ - 'sniffs' => 'StandardWithDocs.Invalid.CodeComparisonTwoEmptyCodeElms', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidCodeComparisonTwoEmptyCodeElms.txt', - ], - 'Invalid: code title attributes are empty' => [ - 'sniffs' => 'StandardWithDocs.Invalid.CodeTitleEmpty', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidCodeTitleEmpty.txt', - ], - 'Invalid: code title attributes missing' => [ - 'sniffs' => 'StandardWithDocs.Invalid.CodeTitleMissing', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidCodeTitleMissing.txt', - ], - 'Invalid: documentation title attribute is empty' => [ - 'sniffs' => 'StandardWithDocs.Invalid.DocumentationTitleEmpty', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidDocumentationTitleEmpty.txt', - ], - 'Invalid: documentation title attribute missing' => [ - 'sniffs' => 'StandardWithDocs.Invalid.DocumentationTitleMissing', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidDocumentationTitleMissing.txt', - ], - 'Invalid: standard element has no content' => [ - 'sniffs' => 'StandardWithDocs.Invalid.StandardNoContent', - 'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidStandardNoContent.txt', - ], - ]; - - }//end dataDocSpecifics() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/AbstractRulesetTestCase.php b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/AbstractRulesetTestCase.php deleted file mode 100644 index fb45c41..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/AbstractRulesetTestCase.php +++ /dev/null @@ -1,115 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Ruleset; - -use PHPUnit\Framework\TestCase; - -abstract class AbstractRulesetTestCase extends TestCase -{ - - /** - * The fully qualified name of the PHPCS runtime exception class. - * - * @var string - */ - const RUNTIME_EXCEPTION = 'PHP_CodeSniffer\Exceptions\RuntimeException'; - - - /** - * Asserts that an object has a specified property in a PHPUnit cross-version compatible manner. - * - * @param string $propertyName The name of the property. - * @param object $object The object on which to check whether the property exists. - * @param string $message Optional failure message to display. - * - * @return void - */ - protected function assertXObjectHasProperty($propertyName, $object, $message='') - { - if (method_exists($this, 'assertObjectHasProperty') === true) { - $this->assertObjectHasProperty($propertyName, $object, $message); - } else { - // PHPUnit < 9.6.11. - $this->assertObjectHasAttribute($propertyName, $object, $message); - } - - }//end assertXObjectHasProperty() - - - /** - * Asserts that an object does not have a specified property - * in a PHPUnit cross-version compatible manner. - * - * @param string $propertyName The name of the property. - * @param object $object The object on which to check whether the property exists. - * @param string $message Optional failure message to display. - * - * @return void - */ - protected function assertXObjectNotHasProperty($propertyName, $object, $message='') - { - if (method_exists($this, 'assertObjectNotHasProperty') === true) { - $this->assertObjectNotHasProperty($propertyName, $object, $message); - } else { - // PHPUnit < 9.6.11. - $this->assertObjectNotHasAttribute($propertyName, $object, $message); - } - - }//end assertXObjectNotHasProperty() - - - /** - * Helper method to tell PHPUnit to expect a PHPCS RuntimeException with a certain message - * in a PHPUnit cross-version compatible manner. - * - * @param string $message The expected exception message. - * - * @return void - */ - protected function expectRuntimeExceptionMessage($message) - { - if (method_exists($this, 'expectException') === true) { - // PHPUnit 5+. - $this->expectException(self::RUNTIME_EXCEPTION); - $this->expectExceptionMessage($message); - } else { - // PHPUnit 4. - $this->setExpectedException(self::RUNTIME_EXCEPTION, $message); - } - - }//end expectRuntimeExceptionMessage() - - - /** - * Helper method to tell PHPUnit to expect a PHPCS RuntimeException which matches a regex patten - * in a PHPUnit cross-version compatible manner. - * - * @param string $regex The regex which should match. - * - * @return void - */ - protected function expectRuntimeExceptionRegex($regex) - { - if (method_exists($this, 'expectExceptionMessageMatches') === true) { - $this->expectException(self::RUNTIME_EXCEPTION); - $this->expectExceptionMessageMatches($regex); - } else if (method_exists($this, 'expectExceptionMessageRegExp') === true) { - // PHPUnit < 8.4.0. - $this->expectException(self::RUNTIME_EXCEPTION); - $this->expectExceptionMessageRegExp($regex); - } else { - // PHPUnit < 5.2.0. - $this->setExpectedExceptionRegExp(self::RUNTIME_EXCEPTION, $regex); - } - - }//end expectRuntimeExceptionRegex() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ConstructorNoSniffsTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ConstructorNoSniffsTest.xml deleted file mode 100644 index cc61e3c..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ConstructorNoSniffsTest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - . - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ConstructorTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ConstructorTest.php deleted file mode 100644 index c98f072..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ConstructorTest.php +++ /dev/null @@ -1,293 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Ruleset; - -use PHP_CodeSniffer\Autoload; -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Tests\ConfigDouble; -use PHP_CodeSniffer\Tests\Core\Ruleset\AbstractRulesetTestCase; - -/** - * Test various aspects of the Ruleset::__construct() method not covered via other tests. - * - * @covers \PHP_CodeSniffer\Ruleset::__construct - */ -final class ConstructorTest extends AbstractRulesetTestCase -{ - - - /** - * Test setting the ruleset name. - * - * @param array $cliArgs The CLI args to pass to the Config. - * @param string $expected The expected set ruleset name. - * - * @dataProvider dataHandlingStandardsPassedViaCLI - * - * @return void - */ - public function testHandlingStandardsPassedViaCLI($cliArgs, $expected) - { - $config = new ConfigDouble($cliArgs); - $ruleset = new Ruleset($config); - - $this->assertSame($expected, $ruleset->name); - - }//end testHandlingStandardsPassedViaCLI() - - - /** - * Data provider. - * - * @see testHandlingStandardsPassedViaCLI() - * - * @return array>> - */ - public static function dataHandlingStandardsPassedViaCLI() - { - return [ - 'Single standard passed' => [ - 'cliArgs' => ['--standard=PSR1'], - 'expected' => 'PSR1', - ], - 'Multiple standards passed' => [ - 'cliArgs' => ['--standard=PSR1,Zend'], - 'expected' => 'PSR1, Zend', - ], - 'Absolute path to standard directory passed' => [ - 'cliArgs' => [ - '--standard='.__DIR__.DIRECTORY_SEPARATOR.'Fixtures'.DIRECTORY_SEPARATOR.'TestStandard', - // Limit this to a valid sniff to prevent running into error messages unrelated to what - // is being tested here. - '--sniffs=TestStandard.ValidSniffs.RegisterEmptyArray', - ], - 'expected' => 'TestStandard', - ], - ]; - - }//end dataHandlingStandardsPassedViaCLI() - - - /** - * Verify that standards are registered with the Autoloader. - * - * @param array $cliArgs The CLI args to pass to the Config. - * @param array $expected Minimum set of standards expected to be registered with the autoloader. - * - * @dataProvider dataStandardsAreRegisteredWithAutoloader - * - * @return void - */ - public function testStandardsAreRegisteredWithAutoloader($cliArgs, $expected) - { - $config = new ConfigDouble($cliArgs); - new Ruleset($config); - - $autoloadPaths = Autoload::getSearchPaths(); - - // Note: doing a full comparison of the Autoloader registered standards would make this test unstable - // as the `CodeSniffer.conf` of the user running the tests could interfer if they have additional - // external standards registered. - // Also note that `--runtime-set` is being used to set `installed_paths` to prevent making any changes to - // the `CodeSniffer.conf` file of the user running the tests. - foreach ($expected as $path => $namespacedStandardName) { - $this->assertArrayHasKey($path, $autoloadPaths, "Path $path has not been registered with the autoloader"); - $this->assertSame($namespacedStandardName, $autoloadPaths[$path], 'Expected (namespaced) standard name does not match'); - } - - }//end testStandardsAreRegisteredWithAutoloader() - - - /** - * Data provider. - * - * @see testStandardsAreRegisteredWithAutoloader() - * - * @return array>> - */ - public static function dataStandardsAreRegisteredWithAutoloader() - { - $basePath = dirname(dirname(dirname(__DIR__))).DIRECTORY_SEPARATOR.'src'.DIRECTORY_SEPARATOR.'Standards'.DIRECTORY_SEPARATOR; - $defaultPaths = [ - $basePath.'MySource' => 'MySource', - $basePath.'PEAR' => 'PEAR', - $basePath.'PSR1' => 'PSR1', - $basePath.'PSR12' => 'PSR12', - $basePath.'PSR2' => 'PSR2', - $basePath.'Squiz' => 'Squiz', - $basePath.'Zend' => 'Zend', - ]; - - $data = [ - 'Default standards' => [ - 'cliArgs' => [ - '--standard=PSR1', - '--runtime-set installed_paths .', - ], - 'expected' => $defaultPaths, - ], - ]; - - $extraInstalledPath = __DIR__.DIRECTORY_SEPARATOR.'Fixtures'.DIRECTORY_SEPARATOR.'DirectoryExpansion'; - $extraInstalledPath .= DIRECTORY_SEPARATOR.'.hiddenAbove'.DIRECTORY_SEPARATOR.'src'.DIRECTORY_SEPARATOR.'MyStandard'; - $data['Additional non-namespaced standard'] = [ - 'cliArgs' => [ - '--standard=MyStandard', - '--runtime-set', - 'installed_paths', - $extraInstalledPath, - ], - 'expected' => ($defaultPaths + [$extraInstalledPath => 'MyStandard']), - ]; - - $extraInstalledPath = __DIR__.DIRECTORY_SEPARATOR.'Fixtures'.DIRECTORY_SEPARATOR.'TestStandard'; - $data['Additional namespaced standard'] = [ - 'cliArgs' => [ - '--standard=TestStandard', - '--runtime-set', - 'installed_paths', - $extraInstalledPath, - // Limit this to a valid sniff to prevent running into error messages unrelated to what - // is being tested here. - '--sniffs=TestStandard.ValidSniffs.RegisterEmptyArray', - ], - 'expected' => ($defaultPaths + [$extraInstalledPath => 'Fixtures\TestStandard']), - ]; - - return $data; - - }//end dataStandardsAreRegisteredWithAutoloader() - - - /** - * Verify handling of sniff restrictions in combination with the caching setting. - * - * @param array $cliArgs The CLI args to pass to the Config. - * @param bool $cache Whether to turn the cache on or off. - * @param array $expected Sniffs which are expected to have been registered. - * - * @dataProvider dataCachingVersusRestrictions - * - * @return void - */ - public function testCachingVersusRestrictions($cliArgs, $cache, $expected) - { - $config = new ConfigDouble($cliArgs); - - // Overrule the cache setting (which is being ignored in the Config when the tests are running). - $config->cache = $cache; - - $ruleset = new Ruleset($config); - - $actual = array_keys($ruleset->sniffs); - sort($actual); - - $this->assertSame($expected, $actual); - - }//end testCachingVersusRestrictions() - - - /** - * Data provider. - * - * Note: the test cases only use `--exclude` to restrict, - * - * @see testCachingVersusRestrictions() - * - * @return array>> - */ - public static function dataCachingVersusRestrictions() - { - $completeSet = [ - 'PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Files\\ByteOrderMarkSniff', - 'PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\NamingConventions\\UpperCaseConstantNameSniff', - 'PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\PHP\\DisallowAlternativePHPTagsSniff', - 'PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\PHP\\DisallowShortOpenTagSniff', - 'PHP_CodeSniffer\\Standards\\PSR1\\Sniffs\\Classes\\ClassDeclarationSniff', - 'PHP_CodeSniffer\\Standards\\PSR1\\Sniffs\\Files\\SideEffectsSniff', - 'PHP_CodeSniffer\\Standards\\PSR1\\Sniffs\\Methods\\CamelCapsMethodNameSniff', - 'PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Classes\\ValidClassNameSniff', - ]; - - return [ - 'No restrictions, cache off' => [ - 'cliArgs' => ['--standard=PSR1'], - 'cache' => false, - 'expected' => $completeSet, - ], - 'Has exclusions, cache off' => [ - 'cliArgs' => [ - '--standard=PSR1', - '--exclude=Generic.Files.ByteOrderMark,Generic.PHP.DisallowShortOpenTag,PSR1.Files.SideEffects,Generic.PHP.DisallowAlternativePHPTags', - ], - 'cache' => false, - 'expected' => [ - 'PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\NamingConventions\\UpperCaseConstantNameSniff', - 'PHP_CodeSniffer\\Standards\\PSR1\\Sniffs\\Classes\\ClassDeclarationSniff', - 'PHP_CodeSniffer\\Standards\\PSR1\\Sniffs\\Methods\\CamelCapsMethodNameSniff', - 'PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Classes\\ValidClassNameSniff', - ], - ], - 'Has sniff selection, cache off' => [ - 'cliArgs' => [ - '--standard=PSR1', - '--sniffs=Generic.Files.ByteOrderMark,Generic.PHP.DisallowShortOpenTag,PSR1.Files.SideEffects,Generic.PHP.DisallowAlternativePHPTags', - ], - 'cache' => false, - 'expected' => [ - 'PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Files\\ByteOrderMarkSniff', - 'PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\PHP\\DisallowAlternativePHPTagsSniff', - 'PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\PHP\\DisallowShortOpenTagSniff', - 'PHP_CodeSniffer\\Standards\\PSR1\\Sniffs\\Files\\SideEffectsSniff', - ], - ], - 'No restrictions, cache on' => [ - 'cliArgs' => ['--standard=PSR1'], - 'cache' => true, - 'expected' => $completeSet, - ], - 'Has exclusions, cache on' => [ - 'cliArgs' => [ - '--standard=PSR1', - '--exclude=Generic.Files.ByteOrderMark,Generic.PHP.DisallowAlternativePHPTags,Generic.PHP.DisallowShortOpenTag,PSR1.Files.SideEffects', - ], - 'cache' => true, - 'expected' => $completeSet, - ], - - /* - * "Has sniff selection, cache on" case cannot be tested due to the `Ruleset` class - * containing special handling of sniff selection when the tests are running. - */ - - ]; - - }//end dataCachingVersusRestrictions() - - - /** - * Test an exception is thrown when no sniffs have been registered via the ruleset. - * - * @return void - */ - public function testNoSniffsRegisteredException() - { - $standard = __DIR__.'/ConstructorNoSniffsTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - - $message = 'ERROR: No sniffs were registered.'.PHP_EOL.PHP_EOL; - $this->expectRuntimeExceptionMessage($message); - - new Ruleset($config); - - }//end testNoSniffsRegisteredException() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/DisplayCachedMessagesTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/DisplayCachedMessagesTest.php deleted file mode 100644 index 96612b2..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/DisplayCachedMessagesTest.php +++ /dev/null @@ -1,312 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Ruleset; - -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Tests\ConfigDouble; -use PHP_CodeSniffer\Tests\Core\Ruleset\AbstractRulesetTestCase; -use PHP_CodeSniffer\Util\MessageCollector; -use ReflectionMethod; -use ReflectionProperty; - -/** - * Test error handling for the Ruleset. - * - * Note: this is purely a unit test of the `displayCachedMessages()` method. - * The errors themselves are mocked. - * - * @covers \PHP_CodeSniffer\Ruleset::displayCachedMessages - */ -final class DisplayCachedMessagesTest extends AbstractRulesetTestCase -{ - - - /** - * Test that no exception nor output is generated when there are no cached messsages. - * - * @return void - */ - public function testDisplayCachedMessagesStaysSilentWithoutErrors() - { - $ruleset = $this->getPlainRuleset(); - - $this->expectOutputString(''); - - $this->invokeDisplayCachedMessages($ruleset); - - }//end testDisplayCachedMessagesStaysSilentWithoutErrors() - - - /** - * Verify that blocking errors encountered while loading the ruleset(s) result in an exception being thrown. - * - * @param array $messages The messages encountered. - * @param string $expected The expected function output to screen (via an internally handled exception). - * - * @dataProvider dataBlockingErrorsAreDisplayedViaAnException - * - * @return void - */ - public function testBlockingErrorsAreDisplayedViaAnException($messages, $expected) - { - $ruleset = $this->getPlainRuleset(); - $this->mockCachedMessages($ruleset, $messages); - - $this->expectRuntimeExceptionMessage($expected); - - $this->invokeDisplayCachedMessages($ruleset); - - }//end testBlockingErrorsAreDisplayedViaAnException() - - - /** - * Data provider. - * - * @see testBlockingErrorsAreDisplayedViaAnException() - * - * @return array>> - */ - public static function dataBlockingErrorsAreDisplayedViaAnException() - { - return [ - 'One error' => [ - 'messages' => ['This is a serious blocking issue' => MessageCollector::ERROR], - 'expected' => 'ERROR: This is a serious blocking issue'.PHP_EOL.PHP_EOL, - ], - 'Multiple blocking errors' => [ - 'messages' => [ - 'This is a serious blocking issue' => MessageCollector::ERROR, - 'And here is another one' => MessageCollector::ERROR, - 'OMG, why do you think that would work ?' => MessageCollector::ERROR, - ], - // phpcs:disable Squiz.Strings.ConcatenationSpacing.PaddingFound -- Test readability is more important. - 'expected' => 'ERROR: This is a serious blocking issue'.PHP_EOL - . 'ERROR: And here is another one'.PHP_EOL - . 'ERROR: OMG, why do you think that would work ?'.PHP_EOL.PHP_EOL, - // phpcs:enable - ], - 'Mix of blocking and non-blocking errors' => [ - 'messages' => [ - 'This is a serious blocking issue' => MessageCollector::ERROR, - 'Something something deprecated and will be removed in v x.x.x' => MessageCollector::DEPRECATED, - 'Careful, this may not be correct' => MessageCollector::NOTICE, - ], - // phpcs:disable Squiz.Strings.ConcatenationSpacing.PaddingFound -- Test readability is more important. - 'expected' => 'ERROR: This is a serious blocking issue'.PHP_EOL - . 'NOTICE: Careful, this may not be correct'.PHP_EOL - . 'DEPRECATED: Something something deprecated and will be removed in v x.x.x'.PHP_EOL.PHP_EOL, - // phpcs:enable - ], - ]; - - }//end dataBlockingErrorsAreDisplayedViaAnException() - - - /** - * Test display of non-blocking messages encountered while loading the ruleset(s). - * - * @param array $messages The messages encountered. - * @param string $expected The expected function output to screen. - * - * @dataProvider dataNonBlockingErrorsGenerateOutput - * - * @return void - */ - public function testNonBlockingErrorsGenerateOutput($messages, $expected) - { - $ruleset = $this->getPlainRuleset(); - $this->mockCachedMessages($ruleset, $messages); - - $this->expectOutputString($expected); - - $this->invokeDisplayCachedMessages($ruleset); - - }//end testNonBlockingErrorsGenerateOutput() - - - /** - * Data provider. - * - * @see testNonBlockingErrorsGenerateOutput() - * - * @return array>> - */ - public static function dataNonBlockingErrorsGenerateOutput() - { - return [ - 'One deprecation' => [ - 'messages' => ['My deprecation message' => MessageCollector::DEPRECATED], - 'expected' => 'DEPRECATED: My deprecation message'.PHP_EOL.PHP_EOL, - ], - 'One notice' => [ - 'messages' => ['My notice message' => MessageCollector::NOTICE], - 'expected' => 'NOTICE: My notice message'.PHP_EOL.PHP_EOL, - ], - 'One warning' => [ - 'messages' => ['My warning message' => MessageCollector::WARNING], - 'expected' => 'WARNING: My warning message'.PHP_EOL.PHP_EOL, - ], - 'Multiple non-blocking errors' => [ - 'messages' => [ - 'Something something deprecated and will be removed in v x.x.x' => MessageCollector::DEPRECATED, - 'Something is not supported and support may be removed' => MessageCollector::WARNING, - 'Some other deprecation notice' => MessageCollector::DEPRECATED, - 'Careful, this may not be correct' => MessageCollector::NOTICE, - ], - // phpcs:disable Squiz.Strings.ConcatenationSpacing.PaddingFound -- Test readability is more important. - 'expected' => 'WARNING: Something is not supported and support may be removed'.PHP_EOL - .'NOTICE: Careful, this may not be correct'.PHP_EOL - .'DEPRECATED: Something something deprecated and will be removed in v x.x.x'.PHP_EOL - .'DEPRECATED: Some other deprecation notice'.PHP_EOL.PHP_EOL, - // phpcs:enable - ], - ]; - - }//end dataNonBlockingErrorsGenerateOutput() - - - /** - * Test that blocking errors will always show, independently of specific command-line options being used. - * - * @param array $configArgs Arguments to pass to the Config. - * - * @dataProvider dataSelectiveDisplayOfMessages - * - * @return void - */ - public function testBlockingErrorsAlwaysShow($configArgs) - { - $config = new ConfigDouble($configArgs); - $ruleset = new Ruleset($config); - - $message = 'Some serious error'; - $errors = [$message => MessageCollector::ERROR]; - $this->mockCachedMessages($ruleset, $errors); - - $this->expectRuntimeExceptionMessage('ERROR: '.$message.PHP_EOL); - - $this->invokeDisplayCachedMessages($ruleset); - - }//end testBlockingErrorsAlwaysShow() - - - /** - * Test that non-blocking messsages will not show when specific command-line options are being used. - * - * @param array $configArgs Arguments to pass to the Config. - * - * @dataProvider dataSelectiveDisplayOfMessages - * - * @return void - */ - public function testNonBlockingErrorsDoNotShowUnderSpecificCircumstances($configArgs) - { - $config = new ConfigDouble($configArgs); - $ruleset = new Ruleset($config); - $this->mockCachedMessages($ruleset, ['Deprecation notice' => MessageCollector::DEPRECATED]); - - $this->expectOutputString(''); - - $this->invokeDisplayCachedMessages($ruleset); - - }//end testNonBlockingErrorsDoNotShowUnderSpecificCircumstances() - - - /** - * Data provider. - * - * @see testBlockingErrorsAlwaysShow() - * @see testNonBlockingErrorsDoNotShow() - * - * @return array>> - */ - public static function dataSelectiveDisplayOfMessages() - { - $data = [ - 'Explain mode' => [ - 'configArgs' => ['-e'], - ], - 'Quiet mode' => [ - 'configArgs' => ['-q'], - ], - ]; - - // Setting the `--generator` arg is only supported when running `phpcs`. - if (PHP_CODESNIFFER_CBF === false) { - $data['Documentation is requested'] = [ - 'configArgs' => ['--generator=text'], - ]; - } - - return $data; - - }//end dataSelectiveDisplayOfMessages() - - - /** - * Test Helper. - * - * @return \PHP_CodeSniffer\Ruleset - */ - private function getPlainRuleset() - { - static $ruleset; - - if (isset($ruleset) === false) { - $config = new ConfigDouble(); - $ruleset = new Ruleset($config); - } - - return $ruleset; - - }//end getPlainRuleset() - - - /** - * Add mock messages to the message cache. - * - * @param \PHP_CodeSniffer\Ruleset $ruleset The ruleset object. - * @param array $messages The messages to add to the message cache. - * - * @return void - */ - private function mockCachedMessages(Ruleset $ruleset, $messages) - { - $reflProperty = new ReflectionProperty($ruleset, 'msgCache'); - (PHP_VERSION_ID < 80100) && $reflProperty->setAccessible(true); - - $msgCache = $reflProperty->getValue($ruleset); - foreach ($messages as $msg => $type) { - $msgCache->add($msg, $type); - } - - (PHP_VERSION_ID < 80100) && $reflProperty->setAccessible(false); - - }//end mockCachedMessages() - - - /** - * Invoke the display of the cached messages. - * - * @param \PHP_CodeSniffer\Ruleset $ruleset The ruleset object. - * - * @return void - */ - private function invokeDisplayCachedMessages(Ruleset $ruleset) - { - $reflMethod = new ReflectionMethod($ruleset, 'displayCachedMessages'); - (PHP_VERSION_ID < 80100) && $reflMethod->setAccessible(true); - $reflMethod->invoke($ruleset); - (PHP_VERSION_ID < 80100) && $reflMethod->setAccessible(false); - - }//end invokeDisplayCachedMessages() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceCaseMismatch1Test.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceCaseMismatch1Test.xml deleted file mode 100644 index e72c4b9..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceCaseMismatch1Test.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceCaseMismatch2Test.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceCaseMismatch2Test.xml deleted file mode 100644 index a101374..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceCaseMismatch2Test.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceHomePathFailTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceHomePathFailTest.xml deleted file mode 100644 index 5298b54..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceHomePathFailTest.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceHomePathTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceHomePathTest.php deleted file mode 100644 index c7b5f90..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceHomePathTest.php +++ /dev/null @@ -1,121 +0,0 @@ - - * @copyright 2025 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Ruleset; - -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Tests\ConfigDouble; -use PHP_CodeSniffer\Tests\Core\Ruleset\AbstractRulesetTestCase; - -/** - * Test home path handling in the Ruleset::expandRulesetReference() method. - * - * @covers \PHP_CodeSniffer\Ruleset::expandRulesetReference - */ -final class ExpandRulesetReferenceHomePathTest extends AbstractRulesetTestCase -{ - - /** - * Original value of the user's home path environment variable. - * - * @var string|false Path or false is the `HOME` environment variable is not available. - */ - private static $homepath = false; - - - /** - * Store the user's home path. - * - * @beforeClass - * - * @return void - */ - public static function storeHomePath() - { - self::$homepath = getenv('HOME'); - - }//end storeHomePath() - - - /** - * Restore the user's home path environment variable in case the test changed it or created it. - * - * @afterClass - * - * @return void - */ - public static function restoreHomePath() - { - if (is_string(self::$homepath) === true) { - putenv('HOME='.self::$homepath); - } else { - // Remove the environment variable as it didn't exist before. - putenv('HOME'); - } - - }//end restoreHomePath() - - - /** - * Set the home path to an alternative location. - * - * @before - * - * @return void - */ - protected function setHomePath() - { - $fakeHomePath = __DIR__.DIRECTORY_SEPARATOR.'Fixtures'.DIRECTORY_SEPARATOR.'FakeHomePath'; - putenv("HOME=$fakeHomePath"); - - }//end setHomePath() - - - /** - * Verify that a sniff reference with the magic "home path" placeholder gets expanded correctly - * and finds sniffs if the path exists underneath the "home path". - * - * @return void - */ - public function testHomePathRefGetsExpandedAndFindsSniff() - { - // Set up the ruleset. - $standard = __DIR__.'/ExpandRulesetReferenceHomePathTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - $ruleset = new Ruleset($config); - - $expected = ['MyStandard.Category.Valid' => 'FakeHomePath\\MyStandard\\Sniffs\\Category\\ValidSniff']; - - $this->assertSame($expected, $ruleset->sniffCodes); - - }//end testHomePathRefGetsExpandedAndFindsSniff() - - - /** - * Verify that a sniff reference with the magic "home path" placeholder gets expanded correctly - * and still fails to find sniffs if the path doesn't exists underneath the "home path". - * - * @return void - */ - public function testHomePathRefGetsExpandedAndThrowsExceptionWhenPathIsInvalid() - { - // Set up the ruleset. - $standard = __DIR__.'/ExpandRulesetReferenceHomePathFailTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - - $exceptionMessage = 'ERROR: Referenced sniff "~/src/MyStandard/Sniffs/DoesntExist/" does not exist.'.PHP_EOL; - $exceptionMessage .= 'ERROR: No sniffs were registered.'.PHP_EOL.PHP_EOL; - $this->expectRuntimeExceptionMessage($exceptionMessage); - - new Ruleset($config); - - }//end testHomePathRefGetsExpandedAndThrowsExceptionWhenPathIsInvalid() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceHomePathTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceHomePathTest.xml deleted file mode 100644 index e21f2a6..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceHomePathTest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceInternalIgnoreTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceInternalIgnoreTest.xml deleted file mode 100644 index edd9b1e..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceInternalIgnoreTest.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - 0 - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceInternalStandardTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceInternalStandardTest.xml deleted file mode 100644 index d01c68c..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceInternalStandardTest.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceInternalTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceInternalTest.php deleted file mode 100644 index 652a82f..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceInternalTest.php +++ /dev/null @@ -1,71 +0,0 @@ - - * @copyright 2025 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Ruleset; - -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Tests\ConfigDouble; -use PHP_CodeSniffer\Tests\Core\Ruleset\AbstractRulesetTestCase; - -/** - * Test handling of "internal" references in the Ruleset::expandRulesetReference() method. - * - * @covers \PHP_CodeSniffer\Ruleset::expandRulesetReference - */ -final class ExpandRulesetReferenceInternalTest extends AbstractRulesetTestCase -{ - - - /** - * Verify that a ruleset reference starting with "Internal." (including the dot) doesn't cause any sniffs to be registered. - * - * @return void - */ - public function testInternalRefDoesNotGetExpanded() - { - // Set up the ruleset. - $standard = __DIR__.'/ExpandRulesetReferenceInternalIgnoreTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - $ruleset = new Ruleset($config); - - $expected = ['Generic.PHP.BacktickOperator' => 'PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\PHP\\BacktickOperatorSniff']; - - $this->assertSame($expected, $ruleset->sniffCodes); - - }//end testInternalRefDoesNotGetExpanded() - - - /** - * While definitely not recommended, including a standard named "Internal", _does_ allow for sniffs to be registered. - * - * Note: customizations (exclusions/property setting etc) for individual sniffs may not always be handled correctly, - * which is why naming a standard "Internal" is definitely not recommended. - * - * @return void - */ - public function testInternalStandardDoesGetExpanded() - { - $message = 'DEPRECATED: The name "Internal" is reserved for internal use. A PHP_CodeSniffer standard should not be called "Internal".'.PHP_EOL; - $message .= 'Contact the maintainer of the standard to fix this.'.PHP_EOL.PHP_EOL; - - $this->expectOutputString($message); - - // Set up the ruleset. - $standard = __DIR__.'/ExpandRulesetReferenceInternalStandardTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - $ruleset = new Ruleset($config); - - $expected = ['Internal.Valid.Valid' => 'Fixtures\\Internal\\Sniffs\\Valid\\ValidSniff']; - - $this->assertSame($expected, $ruleset->sniffCodes); - - }//end testInternalStandardDoesGetExpanded() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceInvalidErrorCode1Test.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceInvalidErrorCode1Test.xml deleted file mode 100644 index a5531bd..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceInvalidErrorCode1Test.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceInvalidErrorCode2Test.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceInvalidErrorCode2Test.xml deleted file mode 100644 index c18ba25..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceInvalidErrorCode2Test.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceInvalidErrorCode3Test.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceInvalidErrorCode3Test.xml deleted file mode 100644 index 46ac264..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceInvalidErrorCode3Test.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceInvalidHomePathRefTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceInvalidHomePathRefTest.xml deleted file mode 100644 index 349449e..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceInvalidHomePathRefTest.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceMissingFileTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceMissingFileTest.xml deleted file mode 100644 index 18e8c39..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceMissingFileTest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceTest.php deleted file mode 100644 index f517d27..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceTest.php +++ /dev/null @@ -1,134 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Ruleset; - -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Tests\ConfigDouble; -use PHP_CodeSniffer\Tests\Core\Ruleset\AbstractRulesetTestCase; - -/** - * Test various aspects of the Ruleset::expandRulesetReference() method not covered by other tests. - * - * @covers \PHP_CodeSniffer\Ruleset::expandRulesetReference - */ -final class ExpandRulesetReferenceTest extends AbstractRulesetTestCase -{ - - - /** - * Test handling of path references relative to the originally included ruleset. - * - * @return void - */ - public function testRulesetRelativePathReferences() - { - // Set up the ruleset. - $standard = __DIR__.'/ExpandRulesetReferenceTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - $ruleset = new Ruleset($config); - - $expected = [ - 'ExternalA.CheckSomething.Valid' => 'Fixtures\\ExternalA\\Sniffs\\CheckSomething\\ValidSniff', - 'TestStandard.ValidSniffs.RegisterEmptyArray' => 'Fixtures\\TestStandard\\Sniffs\\ValidSniffs\\RegisterEmptyArraySniff', - 'ExternalB.CheckMore.Valid' => 'Fixtures\\ExternalB\\Sniffs\\CheckMore\\ValidSniff', - ]; - - $this->assertSame($expected, $ruleset->sniffCodes); - - }//end testRulesetRelativePathReferences() - - - /** - * Test that an exception is thrown if a ruleset contains an unresolvable reference. - * - * @param string $standard The standard to use for the test. - * @param string $replacement The reference which will be used in the exception message. - * - * @dataProvider dataUnresolvableReferenceThrowsException - * - * @return void - */ - public function testUnresolvableReferenceThrowsException($standard, $replacement) - { - // Set up the ruleset. - $standard = __DIR__.'/'.$standard; - $config = new ConfigDouble(["--standard=$standard"]); - - $exceptionMessage = 'ERROR: Referenced sniff "%s" does not exist.'.PHP_EOL; - $exceptionMessage .= 'ERROR: No sniffs were registered.'.PHP_EOL.PHP_EOL; - $this->expectRuntimeExceptionMessage(sprintf($exceptionMessage, $replacement)); - - new Ruleset($config); - - }//end testUnresolvableReferenceThrowsException() - - - /** - * Data provider. - * - * @see testUnresolvableReferenceThrowsException() - * - * @return array> - */ - public static function dataUnresolvableReferenceThrowsException() - { - $data = [ - 'Referencing a non-existent XML file' => [ - 'standard' => 'ExpandRulesetReferenceMissingFileTest.xml', - 'replacement' => './MissingFile.xml', - ], - 'Referencing an invalid directory starting with "~"' => [ - 'standard' => 'ExpandRulesetReferenceInvalidHomePathRefTest.xml', - 'replacement' => '~/src/Standards/Squiz/Sniffs/Files/', - ], - 'Referencing an unknown standard' => [ - 'standard' => 'ExpandRulesetReferenceUnknownStandardTest.xml', - 'replacement' => 'UnknownStandard', - ], - 'Referencing a non-existent category in a known standard' => [ - 'standard' => 'ExpandRulesetReferenceUnknownCategoryTest.xml', - 'replacement' => 'TestStandard.UnknownCategory', - ], - 'Referencing a non-existent sniff in a known standard' => [ - 'standard' => 'ExpandRulesetReferenceUnknownSniffTest.xml', - 'replacement' => 'TestStandard.InvalidSniffs.UnknownRule', - ], - 'Referencing an invalid error code - no standard name' => [ - 'standard' => 'ExpandRulesetReferenceInvalidErrorCode1Test.xml', - 'replacement' => '.Invalid.Undetermined.Found', - ], - 'Referencing an invalid error code - no category name' => [ - 'standard' => 'ExpandRulesetReferenceInvalidErrorCode2Test.xml', - 'replacement' => 'Standard..Undetermined.Found', - ], - 'Referencing an invalid error code - no sniff name' => [ - 'standard' => 'ExpandRulesetReferenceInvalidErrorCode3Test.xml', - 'replacement' => 'Standard.Invalid..Found', - ], - ]; - - // Add tests which are only relevant for case-sensitive OSes. - if (stripos(PHP_OS, 'WIN') === false) { - $data['Referencing an existing sniff, but there is a case mismatch (OS-dependent) [1]'] = [ - 'standard' => 'ExpandRulesetReferenceCaseMismatch1Test.xml', - 'replacement' => 'psr12.functions.nullabletypedeclaration', - ]; - $data['Referencing an existing sniff, but there is a case mismatch (OS-dependent) [2]'] = [ - 'standard' => 'ExpandRulesetReferenceCaseMismatch2Test.xml', - 'replacement' => 'PSR12.Functions.ReturntypeDeclaration', - ]; - } - - return $data; - - }//end dataUnresolvableReferenceThrowsException() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceTest.xml deleted file mode 100644 index f3147c5..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceTest.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceUnknownCategoryTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceUnknownCategoryTest.xml deleted file mode 100644 index 17ec1a7..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceUnknownCategoryTest.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceUnknownSniffTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceUnknownSniffTest.xml deleted file mode 100644 index 8cff25e..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceUnknownSniffTest.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceUnknownStandardTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceUnknownStandardTest.xml deleted file mode 100644 index c8b56b1..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandRulesetReferenceUnknownStandardTest.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandSniffDirectoryTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandSniffDirectoryTest.php deleted file mode 100644 index ddcffb8..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandSniffDirectoryTest.php +++ /dev/null @@ -1,67 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Ruleset; - -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Tests\ConfigDouble; -use PHPUnit\Framework\TestCase; - -/** - * Test the Ruleset::expandSniffDirectory() method. - * - * @covers \PHP_CodeSniffer\Ruleset::expandSniffDirectory - */ -final class ExpandSniffDirectoryTest extends TestCase -{ - - - /** - * Test finding sniff files based on a given directory. - * - * This test verifies that: - * - Hidden (sub)directories are ignored, but the given directory is allowed to be within a hidden directory. - * - Hidden files are ignored. - * - Files without a "php" extension are ignored. - * - Files without a "Sniff" suffix in the file name are ignored. - * - * Note: the "[Another]AbstractSniff" files will be found and included in the return value - * from `Ruleset::expandSniffDirectory()`. - * Those are filtered out later in the `Ruleset::registerSniffs()` method. - * - * @return void - */ - public function testExpandSniffDirectory() - { - // Set up the ruleset. - $standard = __DIR__.'/ExpandSniffDirectoryTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - $ruleset = new Ruleset($config); - - $expectedPathToRuleset = __DIR__.'/Fixtures/DirectoryExpansion/.hiddenAbove/src/MyStandard/ruleset.xml'; - $expectedPathToRuleset = realpath($expectedPathToRuleset); - $this->assertNotFalse($expectedPathToRuleset, 'Ruleset file could not be found'); - $this->assertContains($expectedPathToRuleset, $ruleset->paths, 'Ruleset file not included in the "seen ruleset paths"'); - - $expectedSniffCodes = [ - 'MyStandard.CategoryA.FindMe' => 'MyStandard\\Sniffs\\CategoryA\\FindMeSniff', - 'MyStandard.CategoryB.FindMe' => 'MyStandard\\Sniffs\\CategoryB\\FindMeSniff', - ]; - - // Sort the value to make the tests stable as different OSes will read directories - // in a different order and the order is not relevant for these tests. Just the values. - $actual = $ruleset->sniffCodes; - ksort($actual); - - $this->assertSame($expectedSniffCodes, $actual, 'Registered sniffs do not match expectation'); - - }//end testExpandSniffDirectory() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandSniffDirectoryTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandSniffDirectoryTest.xml deleted file mode 100644 index 158805e..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExpandSniffDirectoryTest.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExplainCustomRulesetTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExplainCustomRulesetTest.xml deleted file mode 100644 index 77b6c2c..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExplainCustomRulesetTest.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExplainSingleSniffTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExplainSingleSniffTest.xml deleted file mode 100644 index d345779..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExplainSingleSniffTest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExplainTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExplainTest.php deleted file mode 100644 index 25ef18f..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ExplainTest.php +++ /dev/null @@ -1,212 +0,0 @@ - - * @copyright 2023 Juliette Reinders Folmer. All rights reserved. - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Ruleset; - -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Tests\ConfigDouble; -use PHPUnit\Framework\TestCase; - -/** - * Test the Ruleset::explain() function. - * - * @covers \PHP_CodeSniffer\Ruleset::explain - */ -final class ExplainTest extends TestCase -{ - - - /** - * Test the output of the "explain" command. - * - * @return void - */ - public function testExplain() - { - // Set up the ruleset. - $config = new ConfigDouble(['--standard=PSR1', '-e']); - $ruleset = new Ruleset($config); - - $expected = PHP_EOL; - $expected .= 'The PSR1 standard contains 8 sniffs'.PHP_EOL.PHP_EOL; - $expected .= 'Generic (4 sniffs)'.PHP_EOL; - $expected .= '------------------'.PHP_EOL; - $expected .= ' Generic.Files.ByteOrderMark'.PHP_EOL; - $expected .= ' Generic.NamingConventions.UpperCaseConstantName'.PHP_EOL; - $expected .= ' Generic.PHP.DisallowAlternativePHPTags'.PHP_EOL; - $expected .= ' Generic.PHP.DisallowShortOpenTag'.PHP_EOL.PHP_EOL; - $expected .= 'PSR1 (3 sniffs)'.PHP_EOL; - $expected .= '---------------'.PHP_EOL; - $expected .= ' PSR1.Classes.ClassDeclaration'.PHP_EOL; - $expected .= ' PSR1.Files.SideEffects'.PHP_EOL; - $expected .= ' PSR1.Methods.CamelCapsMethodName'.PHP_EOL.PHP_EOL; - $expected .= 'Squiz (1 sniff)'.PHP_EOL; - $expected .= '---------------'.PHP_EOL; - $expected .= ' Squiz.Classes.ValidClassName'.PHP_EOL; - - $this->expectOutputString($expected); - - $ruleset->explain(); - - }//end testExplain() - - - /** - * Test the output of the "explain" command is not influenced by a user set report width. - * - * @return void - */ - public function testExplainAlwaysDisplaysCompleteSniffName() - { - // Set up the ruleset. - $config = new ConfigDouble(['--standard=PSR1', '-e', '--report-width=30']); - $ruleset = new Ruleset($config); - - $expected = PHP_EOL; - $expected .= 'The PSR1 standard contains 8 sniffs'.PHP_EOL.PHP_EOL; - $expected .= 'Generic (4 sniffs)'.PHP_EOL; - $expected .= '------------------'.PHP_EOL; - $expected .= ' Generic.Files.ByteOrderMark'.PHP_EOL; - $expected .= ' Generic.NamingConventions.UpperCaseConstantName'.PHP_EOL; - $expected .= ' Generic.PHP.DisallowAlternativePHPTags'.PHP_EOL; - $expected .= ' Generic.PHP.DisallowShortOpenTag'.PHP_EOL.PHP_EOL; - $expected .= 'PSR1 (3 sniffs)'.PHP_EOL; - $expected .= '---------------'.PHP_EOL; - $expected .= ' PSR1.Classes.ClassDeclaration'.PHP_EOL; - $expected .= ' PSR1.Files.SideEffects'.PHP_EOL; - $expected .= ' PSR1.Methods.CamelCapsMethodName'.PHP_EOL.PHP_EOL; - $expected .= 'Squiz (1 sniff)'.PHP_EOL; - $expected .= '---------------'.PHP_EOL; - $expected .= ' Squiz.Classes.ValidClassName'.PHP_EOL; - - $this->expectOutputString($expected); - - $ruleset->explain(); - - }//end testExplainAlwaysDisplaysCompleteSniffName() - - - /** - * Test the output of the "explain" command when a ruleset only contains a single sniff. - * - * This is mostly about making sure that the summary line uses the correct grammar. - * - * @return void - */ - public function testExplainSingleSniff() - { - // Set up the ruleset. - $standard = __DIR__.'/ExplainSingleSniffTest.xml'; - $config = new ConfigDouble(["--standard=$standard", '-e']); - $ruleset = new Ruleset($config); - - $expected = PHP_EOL; - $expected .= 'The ExplainSingleSniffTest standard contains 1 sniff'.PHP_EOL.PHP_EOL; - $expected .= 'Squiz (1 sniff)'.PHP_EOL; - $expected .= '---------------'.PHP_EOL; - $expected .= ' Squiz.Scope.MethodScope'.PHP_EOL; - - $this->expectOutputString($expected); - - $ruleset->explain(); - - }//end testExplainSingleSniff() - - - /** - * Test that "explain" works correctly with custom rulesets. - * - * Verifies that: - * - The "standard" name is taken from the custom ruleset. - * - Any and all sniff additions and exclusions in the ruleset are taken into account correctly. - * - That the displayed list will have both the standards as well as the sniff names - * ordered alphabetically. - * - * @return void - */ - public function testExplainCustomRuleset() - { - // Set up the ruleset. - $standard = __DIR__.'/ExplainCustomRulesetTest.xml'; - $config = new ConfigDouble(["--standard=$standard", '-e']); - $ruleset = new Ruleset($config); - - $expected = PHP_EOL; - $expected .= 'The ExplainCustomRulesetTest standard contains 10 sniffs'.PHP_EOL.PHP_EOL; - $expected .= 'Generic (4 sniffs)'.PHP_EOL; - $expected .= '------------------'.PHP_EOL; - $expected .= ' Generic.Files.ByteOrderMark'.PHP_EOL; - $expected .= ' Generic.NamingConventions.UpperCaseConstantName'.PHP_EOL; - $expected .= ' Generic.PHP.DisallowAlternativePHPTags'.PHP_EOL; - $expected .= ' Generic.PHP.DisallowShortOpenTag'.PHP_EOL.PHP_EOL; - $expected .= 'PSR1 (2 sniffs)'.PHP_EOL; - $expected .= '---------------'.PHP_EOL; - $expected .= ' PSR1.Classes.ClassDeclaration'.PHP_EOL; - $expected .= ' PSR1.Methods.CamelCapsMethodName'.PHP_EOL.PHP_EOL; - $expected .= 'PSR12 (2 sniffs)'.PHP_EOL; - $expected .= '----------------'.PHP_EOL; - $expected .= ' PSR12.ControlStructures.BooleanOperatorPlacement'.PHP_EOL; - $expected .= ' PSR12.ControlStructures.ControlStructureSpacing'.PHP_EOL.PHP_EOL; - $expected .= 'Squiz (2 sniffs)'.PHP_EOL; - $expected .= '----------------'.PHP_EOL; - $expected .= ' Squiz.Classes.ValidClassName'.PHP_EOL; - $expected .= ' Squiz.Scope.MethodScope'.PHP_EOL; - - $this->expectOutputString($expected); - - $ruleset->explain(); - - }//end testExplainCustomRuleset() - - - /** - * Test the output of the "explain" command for a standard containing both deprecated - * and non-deprecated sniffs. - * - * Tests that: - * - Deprecated sniffs are marked with an asterix in the list. - * - A footnote is displayed explaining the asterix. - * - And that the "standard uses # deprecated sniffs" listing is **not** displayed. - * - * @return void - */ - public function testExplainWithDeprecatedSniffs() - { - // Set up the ruleset. - $standard = __DIR__."/ShowSniffDeprecationsTest.xml"; - $config = new ConfigDouble(["--standard=$standard", '-e']); - $ruleset = new Ruleset($config); - - $expected = PHP_EOL; - $expected .= 'The ShowSniffDeprecationsTest standard contains 11 sniffs'.PHP_EOL.PHP_EOL; - - $expected .= 'TestStandard (11 sniffs)'.PHP_EOL; - $expected .= '------------------------'.PHP_EOL; - $expected .= ' TestStandard.Deprecated.WithLongReplacement *'.PHP_EOL; - $expected .= ' TestStandard.Deprecated.WithoutReplacement *'.PHP_EOL; - $expected .= ' TestStandard.Deprecated.WithReplacement *'.PHP_EOL; - $expected .= ' TestStandard.Deprecated.WithReplacementContainingLinuxNewlines *'.PHP_EOL; - $expected .= ' TestStandard.Deprecated.WithReplacementContainingNewlines *'.PHP_EOL; - $expected .= ' TestStandard.SetProperty.AllowedAsDeclared'.PHP_EOL; - $expected .= ' TestStandard.SetProperty.AllowedViaMagicMethod'.PHP_EOL; - $expected .= ' TestStandard.SetProperty.AllowedViaStdClass'.PHP_EOL; - $expected .= ' TestStandard.SetProperty.NotAllowedViaAttribute'.PHP_EOL; - $expected .= ' TestStandard.SetProperty.PropertyTypeHandling'.PHP_EOL; - $expected .= ' TestStandard.ValidSniffs.RegisterEmptyArray'.PHP_EOL.PHP_EOL; - - $expected .= '* Sniffs marked with an asterisk are deprecated.'.PHP_EOL; - - $this->expectOutputString($expected); - - $ruleset->explain(); - - }//end testExplainWithDeprecatedSniffs() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/BrokenNamingConventions/Sniffs/Category/Sniff.php b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/BrokenNamingConventions/Sniffs/Category/Sniff.php deleted file mode 100644 index 9da190d..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/BrokenNamingConventions/Sniffs/Category/Sniff.php +++ /dev/null @@ -1,24 +0,0 @@ - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/ExternalB/Sniffs/CheckMore/ValidSniff.php b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/ExternalB/Sniffs/CheckMore/ValidSniff.php deleted file mode 100644 index 1584f70..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/ExternalB/Sniffs/CheckMore/ValidSniff.php +++ /dev/null @@ -1,25 +0,0 @@ - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/FakeHomePath/src/MyStandard/Sniffs/Category/ValidSniff.php b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/FakeHomePath/src/MyStandard/Sniffs/Category/ValidSniff.php deleted file mode 100644 index 9346df9..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/FakeHomePath/src/MyStandard/Sniffs/Category/ValidSniff.php +++ /dev/null @@ -1,25 +0,0 @@ - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/Internal/Sniffs/Valid/ValidSniff.php b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/Internal/Sniffs/Valid/ValidSniff.php deleted file mode 100644 index e7a04f4..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/Internal/Sniffs/Valid/ValidSniff.php +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/InvalidNoSniffsDir/Sniffs b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/InvalidNoSniffsDir/Sniffs deleted file mode 100644 index e69de29..0000000 diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/InvalidNoSniffsDir/ruleset.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/InvalidNoSniffsDir/ruleset.xml deleted file mode 100644 index 5b0897c..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/InvalidNoSniffsDir/ruleset.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/ProcessRulesetAutoloadLoadAlways.1.php b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/ProcessRulesetAutoloadLoadAlways.1.php deleted file mode 100644 index 2b1fada..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/ProcessRulesetAutoloadLoadAlways.1.php +++ /dev/null @@ -1,8 +0,0 @@ -string,10=>10,float=>1.5,=>,null=>null,true=>true,false=>false -// phpcs:set TestStandard.SetProperty.PropertyTypeHandling expectsEmptyArray[] - -// phpcs:set TestStandard.SetProperty.PropertyTypeHandling expectsOldSchoolArrayWithOnlyValues[] string, 10, 1.5, , null, true, false -// phpcs:set TestStandard.SetProperty.PropertyTypeHandling expectsOldSchoolArrayWithKeysAndValues[] string=>string,10=>10,float=>1.5,=>,null=>null,true=>true,false=>false -// phpcs:set TestStandard.SetProperty.PropertyTypeHandling expectsOldSchoolEmptyArray[] - -echo 'hello!'; diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/Deprecated/WithLongReplacementSniff.php b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/Deprecated/WithLongReplacementSniff.php deleted file mode 100644 index a940d8d..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/Deprecated/WithLongReplacementSniff.php +++ /dev/null @@ -1,41 +0,0 @@ -magic[$name] = $value; - } - - public function __get($name) - { - if (isset($this->magic[$name])) { - return $this->magic[$name]; - } - - return null; - } - - public function register() - { - return [T_WHITESPACE]; - } - - public function process(File $phpcsFile, $stackPtr) - { - // Do something. - } -} diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/SetProperty/AllowedViaStdClassSniff.php b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/SetProperty/AllowedViaStdClassSniff.php deleted file mode 100644 index 0f58b2e..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/SetProperty/AllowedViaStdClassSniff.php +++ /dev/null @@ -1,26 +0,0 @@ - - */ - public $expectsArrayWithOnlyValues; - - /** - * Used to verify that array properties with keys get parsed to a proper array. - * - * @var array - */ - public $expectsArrayWithKeysAndValues; - - /** - * Used to verify that array properties can get extended. - * - * @var array - */ - public $expectsArrayWithExtendedValues; - - /** - * Used to verify that array properties can get extended. - * - * @var array - */ - public $expectsArrayWithExtendedKeysAndValues; - - /** - * Used to verify that array properties allow for setting a property to an empty array. - * - * @var array - */ - public $expectsEmptyArray; - - /** - * Used to verify that array properties passed as a string get parsed to a proper array. - * - * @var array - */ - public $expectsOldSchoolArrayWithOnlyValues; - - /** - * Used to verify that array properties passed as a string with keys get parsed to a proper array. - * - * @var array - */ - public $expectsOldSchoolArrayWithKeysAndValues; - - /** - * Used to verify that array properties passed as a string can get extended. - * - * @var array - */ - public $expectsOldSchoolArrayWithExtendedValues; - - /** - * Used to verify that array properties passed as a string can get extended. - * - * @var array - */ - public $expectsOldSchoolArrayWithExtendedKeysAndValues; - - /** - * Used to verify that array properties passed as a string allow for setting a property to an empty array. - * - * @var array - */ - public $expectsOldSchoolEmptyArray; - - public function register() - { - return [T_ECHO]; - } - - public function process(File $phpcsFile, $stackPtr) - { - // Do something. - } -} diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/SupportedTokenizers/ImplementsDeprecatedInterfaceSniff.php b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/SupportedTokenizers/ImplementsDeprecatedInterfaceSniff.php deleted file mode 100644 index af09507..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/SupportedTokenizers/ImplementsDeprecatedInterfaceSniff.php +++ /dev/null @@ -1,46 +0,0 @@ - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/GetIgnorePatternsTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/GetIgnorePatternsTest.php deleted file mode 100644 index b806851..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/GetIgnorePatternsTest.php +++ /dev/null @@ -1,111 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Ruleset; - -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Tests\ConfigDouble; -use PHPUnit\Framework\TestCase; - -/** - * Test the Ruleset::getIgnorePatterns() method. - * - * @covers \PHP_CodeSniffer\Ruleset::getIgnorePatterns - */ -final class GetIgnorePatternsTest extends TestCase -{ - - /** - * The Ruleset object. - * - * @var \PHP_CodeSniffer\Ruleset - */ - private static $ruleset; - - - /** - * Initialize the config and ruleset objects for this test. - * - * @beforeClass - * - * @return void - */ - public static function initializeConfigAndRuleset() - { - // Set up the ruleset. - $standard = __DIR__."/GetIgnorePatternsTest.xml"; - $config = new ConfigDouble(["--standard=$standard"]); - self::$ruleset = new Ruleset($config); - - }//end initializeConfigAndRuleset() - - - /** - * Test retrieving ignore patterns. - * - * @param string|null $listener The listener to get patterns for or null for all patterns. - * @param array> $expected The expected function output. - * - * @dataProvider dataGetIgnorePatterns - * - * @return void - */ - public function testGetIgnorePatterns($listener, $expected) - { - $this->assertSame($expected, self::$ruleset->getIgnorePatterns($listener)); - - }//end testGetIgnorePatterns() - - - /** - * Data provider. - * - * @see self::testGetIgnorePatterns() - * - * @return array>|null>> - */ - public static function dataGetIgnorePatterns() - { - return [ - 'All ignore patterns' => [ - 'listener' => null, - 'expected' => [ - 'PSR1.Classes.ClassDeclaration' => [ - './src/*/file.php' => 'absolute', - './bin/' => 'relative', - ], - 'Generic.Formatting.SpaceAfterCast' => [ - './src/*/test\\.php$' => 'absolute', - ], - './tests/' => 'absolute', - './vendor/*' => 'absolute', - '*/node-modules/*' => 'relative', - ], - ], - 'Ignore patterns for PSR1.Classes.ClassDeclaration' => [ - 'listener' => 'PSR1.Classes.ClassDeclaration', - 'expected' => [ - './src/*/file.php' => 'absolute', - './bin/' => 'relative', - ], - ], - 'Ignore patterns for Generic.Formatting.SpaceAfterCast' => [ - 'listener' => 'Generic.Formatting.SpaceAfterCast', - 'expected' => ['./src/*/test\\.php$' => 'absolute'], - ], - 'Ignore patterns for sniff without ignore patterns' => [ - 'listener' => 'PSR1.Files.SideEffects', - 'expected' => [], - ], - ]; - - }//end dataGetIgnorePatterns() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/GetIgnorePatternsTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/GetIgnorePatternsTest.xml deleted file mode 100644 index a0496c8..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/GetIgnorePatternsTest.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - ./tests/ - ./vendor/* - */node-modules/* - - - - - ./src/*/file.php - ./bin/ - - - - ./src/*/test\.php$ - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/GetIncludePatternsTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/GetIncludePatternsTest.php deleted file mode 100644 index 104afe7..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/GetIncludePatternsTest.php +++ /dev/null @@ -1,108 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Ruleset; - -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Tests\ConfigDouble; -use PHPUnit\Framework\TestCase; - -/** - * Test the Ruleset::getIncludePatterns() method. - * - * @covers \PHP_CodeSniffer\Ruleset::getIncludePatterns - */ -final class GetIncludePatternsTest extends TestCase -{ - - /** - * The Ruleset object. - * - * @var \PHP_CodeSniffer\Ruleset - */ - private static $ruleset; - - - /** - * Initialize the config and ruleset objects for this test. - * - * @beforeClass - * - * @return void - */ - public static function initializeConfigAndRuleset() - { - // Set up the ruleset. - $standard = __DIR__."/GetIncludePatternsTest.xml"; - $config = new ConfigDouble(["--standard=$standard"]); - self::$ruleset = new Ruleset($config); - - }//end initializeConfigAndRuleset() - - - /** - * Test retrieving include patterns. - * - * @param string|null $listener The listener to get patterns for or null for all patterns. - * @param array> $expected The expected function output. - * - * @dataProvider dataGetIncludePatterns - * - * @return void - */ - public function testGetIncludePatterns($listener, $expected) - { - $this->assertSame($expected, self::$ruleset->getIncludePatterns($listener)); - - }//end testGetIncludePatterns() - - - /** - * Data provider. - * - * @see self::testGetIncludePatterns() - * - * @return array>|null>> - */ - public static function dataGetIncludePatterns() - { - return [ - 'All include patterns' => [ - 'listener' => null, - 'expected' => [ - 'PSR1.Classes.ClassDeclaration' => [ - './src/*/file.php' => 'absolute', - './bin/' => 'relative', - ], - 'Generic.Formatting.SpaceAfterCast' => [ - './src/*/test\\.php$' => 'absolute', - ], - ], - ], - 'Include patterns for PSR1.Classes.ClassDeclaration' => [ - 'listener' => 'PSR1.Classes.ClassDeclaration', - 'expected' => [ - './src/*/file.php' => 'absolute', - './bin/' => 'relative', - ], - ], - 'Include patterns for Generic.Formatting.SpaceAfterCast' => [ - 'listener' => 'Generic.Formatting.SpaceAfterCast', - 'expected' => ['./src/*/test\\.php$' => 'absolute'], - ], - 'Include patterns for sniff without include patterns' => [ - 'listener' => 'PSR1.Files.SideEffects', - 'expected' => [], - ], - ]; - - }//end dataGetIncludePatterns() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/GetIncludePatternsTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/GetIncludePatternsTest.xml deleted file mode 100644 index e59c899..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/GetIncludePatternsTest.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - ./src/*/file.php - ./bin/ - - - - ./src/*/test\.php$ - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PopulateTokenListenersNamingConventionsTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PopulateTokenListenersNamingConventionsTest.php deleted file mode 100644 index c4f8edb..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PopulateTokenListenersNamingConventionsTest.php +++ /dev/null @@ -1,82 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Ruleset; - -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Tests\ConfigDouble; -use PHPUnit\Framework\TestCase; - -/** - * Test handling of sniffs not following the PHPCS naming conventions in the Ruleset::populateTokenListeners() method. - * - * @covers \PHP_CodeSniffer\Ruleset::populateTokenListeners - */ -final class PopulateTokenListenersNamingConventionsTest extends TestCase -{ - - - /** - * Verify a warning is shown for sniffs not complying with the PHPCS naming conventions. - * - * Including sniffs which do not comply with the PHPCS naming conventions is soft deprecated since - * PHPCS 3.12.0, hard deprecated since PHPCS 3.13.0 and support will be removed in PHPCS 4.0.0. - * - * @return void - */ - public function testBrokenNamingConventions() - { - // Set up the ruleset. - $standard = __DIR__.'/PopulateTokenListenersNamingConventionsTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - $ruleset = new Ruleset($config); - - // The "Generic.PHP.BacktickOperator" sniff is the only valid sniff. - $expectedSniffCodes = [ - '..NoNamespace' => 'NoNamespaceSniff', - '.Sniffs.MissingCategoryDir' => 'BrokenNamingConventions\\Sniffs\\MissingCategoryDirSniff', - '.Sniffs.PartialNamespace' => 'Sniffs\\PartialNamespaceSniff', - 'BrokenNamingConventions.Category.' => 'BrokenNamingConventions\\Sniffs\\Category\\Sniff', - 'BrokenNamingConventions.Sniffs.CategoryCalledSniffs' => 'BrokenNamingConventions\\Sniffs\\Sniffs\\CategoryCalledSniffsSniff', - 'Generic.PHP.BacktickOperator' => 'PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\PHP\\BacktickOperatorSniff', - 'Sniffs.SubDir.TooDeeplyNested' => 'BrokenNamingConventions\\Sniffs\\Category\\SubDir\\TooDeeplyNestedSniff', - ]; - - // Sort the value to make the tests stable as different OSes will read directories - // in a different order and the order is not relevant for these tests. Just the values. - $actual = $ruleset->sniffCodes; - ksort($actual); - - $this->assertSame($expectedSniffCodes, $actual, 'Registered sniffs do not match expectation'); - - $expectedMessage = 'DEPRECATED: The sniff BrokenNamingConventions\\Sniffs\\MissingCategoryDirSniff does not comply'; - $expectedMessage .= ' with the PHP_CodeSniffer naming conventions. This will no longer be supported in PHPCS 4.0.'.PHP_EOL; - $expectedMessage .= 'Contact the sniff author to fix the sniff.'.PHP_EOL; - $expectedMessage .= 'DEPRECATED: The sniff NoNamespaceSniff does not comply with the PHP_CodeSniffer naming conventions.'; - $expectedMessage .= ' This will no longer be supported in PHPCS 4.0.'.PHP_EOL; - $expectedMessage .= 'Contact the sniff author to fix the sniff.'.PHP_EOL; - $expectedMessage .= 'DEPRECATED: The sniff Sniffs\\PartialNamespaceSniff does not comply with the PHP_CodeSniffer naming conventions.'; - $expectedMessage .= ' This will no longer be supported in PHPCS 4.0.'.PHP_EOL; - $expectedMessage .= 'Contact the sniff author to fix the sniff.'.PHP_EOL; - $expectedMessage .= 'DEPRECATED: The sniff BrokenNamingConventions\\Sniffs\\Category\\Sniff does not comply'; - $expectedMessage .= ' with the PHP_CodeSniffer naming conventions. This will no longer be supported in PHPCS 4.0.'.PHP_EOL; - $expectedMessage .= 'Contact the sniff author to fix the sniff.'.PHP_EOL; - $expectedMessage .= 'DEPRECATED: The sniff BrokenNamingConventions\\Sniffs\\Sniffs\\CategoryCalledSniffsSniff does not'; - $expectedMessage .= ' comply with the PHP_CodeSniffer naming conventions. This will no longer be supported in PHPCS 4.0.'.PHP_EOL; - $expectedMessage .= 'Contact the sniff author to fix the sniff.'.PHP_EOL; - $expectedMessage .= 'DEPRECATED: The sniff BrokenNamingConventions\\Sniffs\\Category\\SubDir\\TooDeeplyNestedSniff'; - $expectedMessage .= ' does not comply with the PHP_CodeSniffer naming conventions. This will no longer be supported in PHPCS 4.0.'.PHP_EOL; - $expectedMessage .= 'Contact the sniff author to fix the sniff.'.PHP_EOL.PHP_EOL; - - $this->expectOutputString($expectedMessage); - - }//end testBrokenNamingConventions() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PopulateTokenListenersNamingConventionsTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PopulateTokenListenersNamingConventionsTest.xml deleted file mode 100644 index 58e54a9..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PopulateTokenListenersNamingConventionsTest.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PopulateTokenListenersRegisterNoArrayTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PopulateTokenListenersRegisterNoArrayTest.xml deleted file mode 100644 index 23c59c0..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PopulateTokenListenersRegisterNoArrayTest.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PopulateTokenListenersSupportedTokenizersTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PopulateTokenListenersSupportedTokenizersTest.php deleted file mode 100644 index b930117..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PopulateTokenListenersSupportedTokenizersTest.php +++ /dev/null @@ -1,111 +0,0 @@ - - * @copyright 2025 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Ruleset; - -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Tests\ConfigDouble; -use PHP_CodeSniffer\Tests\Core\Ruleset\AbstractRulesetTestCase; - -/** - * Test the Ruleset::populateTokenListeners() method shows a deprecation notice for sniffs supporting JS and/or CSS tokenizers. - * - * @covers \PHP_CodeSniffer\Ruleset::populateTokenListeners - */ -final class PopulateTokenListenersSupportedTokenizersTest extends AbstractRulesetTestCase -{ - - /** - * The Config object. - * - * @var \PHP_CodeSniffer\Config - */ - private static $config; - - - /** - * Initialize the config and ruleset objects for this test. - * - * @beforeClass - * - * @return void - */ - public static function initializeConfig() - { - // Set up the ruleset. - $standard = __DIR__.'/PopulateTokenListenersSupportedTokenizersTest.xml'; - self::$config = new ConfigDouble(["--standard=$standard"]); - - }//end initializeConfig() - - - /** - * Verify that a deprecation notice is shown if a non-deprecated sniff supports the JS/CSS tokenizer(s). - * - * Additionally, this test verifies that: - * - No deprecation notice is thrown if the complete sniff is deprecated. - * - No deprecation notice is thrown when the sniff _also_ supports PHP. - * - No deprecation notice is thrown when no tokenizers are supported (not sure why anyone would do that, but :shrug:). - * - * {@internal The test uses a data provider to verify the messages as the _order_ of the messages depends - * on the OS on which the tests are run (order in which files are retrieved), which makes the order within the - * complete message too unpredictable to test in one go.} - * - * @param string $expected The expected message output in regex format. - * - * @dataProvider dataDeprecatedTokenizersTriggerDeprecationNotice - * - * @return void - */ - public function testDeprecatedTokenizersTriggerDeprecationNotice($expected) - { - $this->expectOutputRegex($expected); - - new Ruleset(self::$config); - - }//end testDeprecatedTokenizersTriggerDeprecationNotice() - - - /** - * Data provider. - * - * @see testDeprecatedTokenizersTriggerDeprecationNotice() - * - * @return array> - */ - public static function dataDeprecatedTokenizersTriggerDeprecationNotice() - { - $cssJsDeprecated = '`DEPRECATED: Scanning CSS/JS files is deprecated and support will be removed in PHP_CodeSniffer 4\.0\.\R'; - $cssJsDeprecated .= 'The %1$s sniff is listening for %2$s\.\R`'; - - $customTokenizer = '`DEPRECATED: Support for custom tokenizers will be removed in PHP_CodeSniffer 4\.0\.\R'; - $customTokenizer .= 'The %1$s sniff is listening for %2$s\.\R`'; - - return [ - 'Listens for CSS' => [ - 'expected' => sprintf($cssJsDeprecated, 'TestStandard.SupportedTokenizers.ListensForCSS', 'CSS'), - ], - 'Listens for JS' => [ - 'expected' => sprintf($cssJsDeprecated, 'TestStandard.SupportedTokenizers.ListensForJS', 'JS'), - ], - 'Listens for both CSS and JS' => [ - 'expected' => sprintf($cssJsDeprecated, 'TestStandard.SupportedTokenizers.ListensForCSSAndJS', 'CSS, JS'), - ], - 'Listens for CSS and something unrecognized' => [ - 'expected' => sprintf($cssJsDeprecated, 'TestStandard.SupportedTokenizers.ListensForCSSAndUnrecognized', 'CSS, Unrecognized'), - ], - 'Listens for only unrecognized tokenizers' => [ - 'expected' => sprintf($customTokenizer, 'TestStandard.SupportedTokenizers.ListensForUnrecognizedTokenizers', 'SCSS, TypeScript'), - ], - ]; - - }//end dataDeprecatedTokenizersTriggerDeprecationNotice() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PopulateTokenListenersSupportedTokenizersTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PopulateTokenListenersSupportedTokenizersTest.xml deleted file mode 100644 index 377cb2f..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PopulateTokenListenersSupportedTokenizersTest.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PopulateTokenListenersTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PopulateTokenListenersTest.php deleted file mode 100644 index 617ff29..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PopulateTokenListenersTest.php +++ /dev/null @@ -1,553 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Ruleset; - -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Tests\ConfigDouble; -use PHP_CodeSniffer\Tests\Core\Ruleset\AbstractRulesetTestCase; -use PHP_CodeSniffer\Util\Tokens; -use ReflectionObject; -use ReflectionProperty; - -/** - * Test the Ruleset::populateTokenListeners() method. - * - * @covers \PHP_CodeSniffer\Ruleset::populateTokenListeners - */ -final class PopulateTokenListenersTest extends AbstractRulesetTestCase -{ - - /** - * The Ruleset object. - * - * @var \PHP_CodeSniffer\Ruleset - */ - private static $ruleset; - - - /** - * Initialize the config and ruleset objects for this test only once (but do allow recording code coverage). - * - * @before - * - * @return void - */ - protected function initializeConfigAndRuleset() - { - if (isset(self::$ruleset) === false) { - // Set up the ruleset. - $standard = __DIR__.'/PopulateTokenListenersTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - self::$ruleset = new Ruleset($config); - } - - }//end initializeConfigAndRuleset() - - - /** - * Test an exception is thrown when the register() method of a sniff doesn't return an array. - * - * @return void - */ - public function testSniffWhereRegisterDoesNotReturnAnArrayThrowsException() - { - $standard = __DIR__.'/PopulateTokenListenersRegisterNoArrayTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - - $sniffClass = 'Fixtures\\TestStandard\\Sniffs\\InvalidSniffs\\RegisterNoArraySniff'; - $message = "ERROR: The sniff {$sniffClass}::register() method must return an array.".PHP_EOL.PHP_EOL; - $this->expectRuntimeExceptionMessage($message); - - new Ruleset($config); - - // Verify that the sniff has not been registered/has been unregistered. - // These assertions will only take effect for PHPUnit 10+. - $this->assertArrayNotHasKey($sniffClass, self::$ruleset->sniffs, "Sniff class $sniffClass is listed in registered sniffs"); - $this->assertArrayNotHasKey('TestStandard.InvalidSniffs.RegisterNoArray', self::$ruleset->sniffCodes, 'Sniff code is registered'); - - }//end testSniffWhereRegisterDoesNotReturnAnArrayThrowsException() - - - /** - * Test that a sniff not registering any tokens is not listed as a listener. - * - * @return void - */ - public function testSniffWithRegisterMethodReturningEmptyArrayIsSilentlyIgnored() - { - $target = 'Fixtures\\TestStandard\\Sniffs\\ValidSniffs\\RegisterEmptyArraySniff'; - - foreach (self::$ruleset->tokenListeners as $token => $listeners) { - $this->assertTrue(is_array($listeners), 'No listeners registered for token'.Tokens::tokenName($token)); - $this->assertArrayNotHasKey( - $target, - $listeners, - sprintf('Found the %s sniff registered for token %s', $target, Tokens::tokenName($token)) - ); - } - - }//end testSniffWithRegisterMethodReturningEmptyArrayIsSilentlyIgnored() - - - /** - * Tests that sniffs registering tokens, will end up listening to these tokens. - * - * @param string $sniffClass The FQN for the sniff class to check. - * @param int $expectedCount Expected number of tokens to which the sniff should be listening. - * - * @dataProvider dataSniffListensToTokenss - * - * @return void - */ - public function testRegistersSniffsToListenToTokens($sniffClass, $expectedCount) - { - $counter = 0; - - foreach (self::$ruleset->tokenListeners as $listeners) { - if (isset($listeners[$sniffClass]) === true) { - ++$counter; - } - } - - $this->assertSame($expectedCount, $counter); - - }//end testRegistersSniffsToListenToTokens() - - - /** - * Data provider. - * - * @see testSniffListensToTokens() - * - * @return array> - */ - public static function dataSniffListensToTokenss() - { - return [ - 'TestStandard.SupportedTokenizers.ListensForPHPAndCSSAndJS' => [ - 'sniffClass' => 'Fixtures\\TestStandard\\Sniffs\\SupportedTokenizers\\ListensForPHPAndCSSAndJSSniff', - 'expectedCount' => 2, - ], - 'Generic.NamingConventions.UpperCaseConstantName' => [ - 'sniffClass' => 'PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\NamingConventions\\UpperCaseConstantNameSniff', - 'expectedCount' => 2, - ], - 'PSR1.Files.SideEffects' => [ - 'sniffClass' => 'PHP_CodeSniffer\\Standards\\PSR1\\Sniffs\\Files\\SideEffectsSniff', - 'expectedCount' => 1, - ], - 'PSR12.ControlStructures.BooleanOperatorPlacement' => [ - 'sniffClass' => 'PHP_CodeSniffer\\Standards\\PSR12\\Sniffs\\ControlStructures\\BooleanOperatorPlacementSniff', - 'expectedCount' => 5, - ], - 'Squiz.ControlStructures.ForEachLoopDeclaration' => [ - 'sniffClass' => 'PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\ControlStructures\\ForEachLoopDeclarationSniff', - 'expectedCount' => 1, - ], - 'TestStandard.Deprecated.WithReplacement' => [ - 'sniffClass' => 'Fixtures\\TestStandard\\Sniffs\\Deprecated\\WithReplacementSniff', - 'expectedCount' => 1, - ], - 'TestStandard.ValidSniffs.RegisterEmptyArray' => [ - 'sniffClass' => 'Fixtures\\TestStandard\\Sniffs\\ValidSniffs\\RegisterEmptyArraySniff', - 'expectedCount' => 0, - ], - ]; - - }//end dataSniffListensToTokenss() - - - /** - * Test that deprecated sniffs get recognized and added to the $deprecatedSniffs list. - * - * @return void - */ - public function testRegistersWhenADeprecatedSniffIsLoaded() - { - $property = new ReflectionProperty(self::$ruleset, 'deprecatedSniffs'); - (PHP_VERSION_ID < 80100) && $property->setAccessible(true); - $actualValue = $property->getValue(self::$ruleset); - (PHP_VERSION_ID < 80100) && $property->setAccessible(false); - - // Only verify there is one deprecated sniff registered. - // There are other tests which test the deprecated sniff handling in more detail. - $this->assertTrue(is_array($actualValue)); - $this->assertCount(1, $actualValue); - - }//end testRegistersWhenADeprecatedSniffIsLoaded() - - - /** - * Verify that the setting of properties on a sniff was not triggered when there are no properties being set. - * - * @return void - */ - public function testDoesntTriggerPropertySettingForNoProperties() - { - $sniffClass = 'PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\NamingConventions\\UpperCaseConstantNameSniff'; - - // Verify that our target sniff has been registered. - $this->assertArrayHasKey($sniffClass, self::$ruleset->sniffs, "Sniff class $sniffClass not listed in registered sniffs"); - - $sniffObject = self::$ruleset->sniffs[$sniffClass]; - $reflection = new ReflectionObject($sniffObject); - - // Just making sure there are no properties on the sniff object (which doesn't have declared properties). - $this->assertSame([], $reflection->getProperties(), "Unexpected properties found on sniff class $sniffClass"); - - }//end testDoesntTriggerPropertySettingForNoProperties() - - - /** - * Verify that the setting of properties on a sniff was triggered. - * - * @param string $sniffClass The FQN for the sniff class on which the property should be set. - * @param string $propertyName The property name. - * @param string $expected The expected property value. - * - * @dataProvider dataTriggersPropertySettingWhenPropertiesProvided - * - * @return void - */ - public function testTriggersPropertySettingWhenPropertiesProvided($sniffClass, $propertyName, $expected) - { - // Verify that our target sniff has been registered. - $this->assertArrayHasKey($sniffClass, self::$ruleset->sniffs, "Sniff class $sniffClass not listed in registered sniffs"); - - $sniffObject = self::$ruleset->sniffs[$sniffClass]; - - // Verify the property has been set. - $this->assertSame($expected, $sniffObject->$propertyName, "Property on sniff class $sniffClass set to unexpected value"); - - }//end testTriggersPropertySettingWhenPropertiesProvided() - - - /** - * Data provider. - * - * @see testTriggersPropertySettingWhenPropertiesProvided() - * - * @return array> - */ - public static function dataTriggersPropertySettingWhenPropertiesProvided() - { - return [ - 'Sniff with single property being set' => [ - 'sniffClass' => 'PHP_CodeSniffer\\Standards\\PSR12\\Sniffs\\ControlStructures\\BooleanOperatorPlacementSniff', - 'propertyName' => 'allowOnly', - 'expected' => 'first', - ], - 'Sniff with multiple properties being set - first property' => [ - 'sniffClass' => 'PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\ControlStructures\\ForEachLoopDeclarationSniff', - 'propertyName' => 'requiredSpacesAfterOpen', - 'expected' => '3', - ], - 'Sniff with multiple properties being set - second property' => [ - 'sniffClass' => 'PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\ControlStructures\\ForEachLoopDeclarationSniff', - 'propertyName' => 'requiredSpacesBeforeClose', - 'expected' => '8', - ], - ]; - - }//end dataTriggersPropertySettingWhenPropertiesProvided() - - - /** - * Verifies that the "class" and "source" indexes get set. - * - * @return void - */ - public function testSetsClassAndSourceIndexes() - { - foreach (self::$ruleset->tokenListeners as $token => $listeners) { - $this->assertTrue(is_array($listeners), 'No listeners registered for token'.Tokens::tokenName($token)); - - foreach ($listeners as $className => $details) { - $this->assertArrayHasKey( - 'class', - $details, - sprintf('"tokenizers" key missing for sniff class %s for token %s', $className, Tokens::tokenName($token)) - ); - - $this->assertSame( - $className, - $details['class'], - sprintf('Unexpected value for "class" key for sniff class %s for token %s', $className, Tokens::tokenName($token)) - ); - - $this->assertArrayHasKey( - 'source', - $details, - sprintf('"source" key missing for sniff class %s for token %s', $className, Tokens::tokenName($token)) - ); - - $this->assertTrue( - is_string($details['source']), - sprintf('Value for "source" key is not a string for token %s', Tokens::tokenName($token)) - ); - - $expected = '.'.substr($className, (strrpos($className, '\\') + 1), -5); - - $this->assertStringEndsWith( - $expected, - $details['source'], - sprintf('Unexpected value for "source" key for sniff class %s for token %s', $className, Tokens::tokenName($token)) - ); - }//end foreach - }//end foreach - - }//end testSetsClassAndSourceIndexes() - - - /** - * Verifies that sniffs by default are listening for PHP files only. - * - * @return void - */ - public function testSetsSupportedTokenizersToPHPByDefault() - { - $exclude = 'Fixtures\\TestStandard\\Sniffs\\SupportedTokenizers\\ListensForPHPAndCSSAndJSSniff'; - $expected = ['PHP' => 'PHP']; - - foreach (self::$ruleset->tokenListeners as $token => $listeners) { - $this->assertTrue(is_array($listeners), 'No listeners registered for token'.Tokens::tokenName($token)); - - foreach ($listeners as $className => $details) { - if ($className === $exclude) { - // Skip this one as it is the one sniff for which things will be different. - continue; - } - - $this->assertArrayHasKey( - 'tokenizers', - $details, - sprintf('"tokenizers" key missing for sniff class %s for token %s', $className, Tokens::tokenName($token)) - ); - - $this->assertSame( - $expected, - $details['tokenizers'], - sprintf('Unexpected value for "tokenizers" key for sniff class %s for token %s', $className, Tokens::tokenName($token)) - ); - } - }//end foreach - - }//end testSetsSupportedTokenizersToPHPByDefault() - - - /** - * Test that if a sniff has the $supportedTokenizers property set, the tokenizers listed there - * will be registered in the listeners array. - * - * @param int $token The token constant for which the sniff should be registered. - * - * @dataProvider dataSetsSupportedTokenizersWhenProvidedBySniff - * - * @return void - */ - public function testSetsSupportedTokenizersWhenProvidedBySniff($token) - { - $sniffClass = 'Fixtures\\TestStandard\\Sniffs\\SupportedTokenizers\\ListensForPHPAndCSSAndJSSniff'; - $expected = [ - 'PHP' => 'PHP', - 'JS' => 'JS', - 'CSS' => 'CSS', - ]; - - $this->assertArrayHasKey( - $token, - self::$ruleset->tokenListeners, - sprintf('The token constant %s is not registered to the listeners array', Tokens::tokenName($token)) - ); - $this->assertArrayHasKey( - $sniffClass, - self::$ruleset->tokenListeners[$token], - sprintf('The sniff class %s is not registered for token %s', $sniffClass, Tokens::tokenName($token)) - ); - $this->assertArrayHasKey( - 'tokenizers', - self::$ruleset->tokenListeners[$token][$sniffClass], - sprintf('"tokenizers" key missing for sniff class %s for token %s', $sniffClass, Tokens::tokenName($token)) - ); - - $this->assertSame( - $expected, - self::$ruleset->tokenListeners[$token][$sniffClass]['tokenizers'], - sprintf('Unexpected value for "tokenizers" key for sniff class %s for token %s', $sniffClass, Tokens::tokenName($token)) - ); - - }//end testSetsSupportedTokenizersWhenProvidedBySniff() - - - /** - * Data provider. - * - * @see testSetsSupportedTokenizersWhenProvidedBySniff() - * - * @return array> - */ - public static function dataSetsSupportedTokenizersWhenProvidedBySniff() - { - return [ - 'T_OPEN_TAG' => [T_OPEN_TAG], - 'T_OPEN_TAG_WITH_ECHO' => [T_OPEN_TAG_WITH_ECHO], - ]; - - }//end dataSetsSupportedTokenizersWhenProvidedBySniff() - - - /** - * Verifies that by default no explicit include patterns are registered for sniffs. - * - * @return void - */ - public function testSetsIncludePatternsToEmptyArrayByDefault() - { - $exclude = 'PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\NamingConventions\\UpperCaseConstantNameSniff'; - - foreach (self::$ruleset->tokenListeners as $token => $listeners) { - $this->assertTrue(is_array($listeners), 'No listeners registered for token'.Tokens::tokenName($token)); - - foreach ($listeners as $className => $details) { - if ($className === $exclude) { - // Skip this one as it is the one sniff for which things will be different. - continue; - } - - $this->assertArrayHasKey( - 'include', - $details, - sprintf('"include" key missing for sniff class %s for token %s', $className, Tokens::tokenName($token)) - ); - - $this->assertSame( - [], - $details['include'], - sprintf('Unexpected value for "include" key for sniff class %s for token %s', $className, Tokens::tokenName($token)) - ); - } - }//end foreach - - }//end testSetsIncludePatternsToEmptyArrayByDefault() - - - /** - * Verifies that by default no explicit ignore patterns are registered for sniffs. - * - * @return void - */ - public function testSetsIgnorePatternsToEmptyArrayByDefault() - { - $exclude = 'PHP_CodeSniffer\\Standards\\PSR1\\Sniffs\\Files\\SideEffectsSniff'; - - foreach (self::$ruleset->tokenListeners as $token => $listeners) { - $this->assertTrue(is_array($listeners), 'No listeners registered for token'.Tokens::tokenName($token)); - - foreach ($listeners as $className => $details) { - if ($className === $exclude) { - // Skip this one as it is the one sniff for which things will be different. - continue; - } - - $this->assertArrayHasKey( - 'ignore', - $details, - sprintf('"ignore" key missing for sniff class %s for token %s', $className, Tokens::tokenName($token)) - ); - - $this->assertSame( - [], - $details['ignore'], - sprintf('Unexpected value for "ignore" key for sniff class %s for token %s', $className, Tokens::tokenName($token)) - ); - } - }//end foreach - - }//end testSetsIgnorePatternsToEmptyArrayByDefault() - - - /** - * Tests that if there are <[include|exclude]-pattern> directives set on a sniff, these are set for the relevant listeners. - * - * Includes verification that the transformation of "regex"-like patterns is handled correctly. - * - * @param int|string $token A token constant on which the sniff should be registered. - * @param string $sniffClass The FQN for the sniff class on which the patterns should be registered. - * @param string $patternType The type of patterns expected to be registered for the sniff. - * - * @dataProvider dataSetsIncludeAndIgnorePatterns - * - * @return void - */ - public function testSetsIncludeAndIgnorePatterns($token, $sniffClass, $patternType) - { - $expected = [ - '/no-transformation/', - '/simple.*transformation/.*', - '/escaped\\,comma/becomes/comma/to/allow/commas/in/filenames.css', - '/pat?tern(is|regex)\\.php$', - ]; - - $this->assertArrayHasKey( - $token, - self::$ruleset->tokenListeners, - sprintf('The token constant %s is not registered to the listeners array', Tokens::tokenName($token)) - ); - $this->assertArrayHasKey( - $sniffClass, - self::$ruleset->tokenListeners[$token], - sprintf('The sniff class %s is not registered for token %s', $sniffClass, Tokens::tokenName($token)) - ); - $this->assertArrayHasKey( - $patternType, - self::$ruleset->tokenListeners[$token][$sniffClass], - sprintf('"%s" key missing for sniff class %s for token %s', $patternType, $sniffClass, Tokens::tokenName($token)) - ); - - $this->assertSame( - $expected, - self::$ruleset->tokenListeners[$token][$sniffClass][$patternType], - sprintf('Unexpected value for "%s" key for sniff class %s for token %s', $patternType, $sniffClass, Tokens::tokenName($token)) - ); - - }//end testSetsIncludeAndIgnorePatterns() - - - /** - * Data provider. - * - * @see testSetsIncludeAndIgnorePatterns() - * - * @return array> - */ - public static function dataSetsIncludeAndIgnorePatterns() - { - return [ - 'Sniff with s in the ruleset - first token' => [ - 'token' => T_STRING, - 'sniffClass' => 'PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\NamingConventions\\UpperCaseConstantNameSniff', - 'patternType' => 'include', - ], - 'Sniff with s in the ruleset - second token' => [ - 'token' => T_CONST, - 'sniffClass' => 'PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\NamingConventions\\UpperCaseConstantNameSniff', - 'patternType' => 'include', - ], - 'Sniff with s in the ruleset' => [ - 'token' => T_OPEN_TAG, - 'sniffClass' => 'PHP_CodeSniffer\\Standards\\PSR1\\Sniffs\\Files\\SideEffectsSniff', - 'patternType' => 'ignore', - ], - ]; - - }//end dataSetsIncludeAndIgnorePatterns() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PopulateTokenListenersTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PopulateTokenListenersTest.xml deleted file mode 100644 index 1b6ed1a..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PopulateTokenListenersTest.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - /no-transformation/ - /simple*transformation/* - /escaped\\,comma/becomes/comma/to/allow/commas/in/filenames.css - /pat?tern(is|regex)\.php$ - - - - - /no-transformation/ - /simple*transformation/* - /escaped\\,comma/becomes/comma/to/allow/commas/in/filenames.css - /pat?tern(is|regex)\.php$ - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRuleInvalidTypeTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRuleInvalidTypeTest.php deleted file mode 100644 index 9214ba9..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRuleInvalidTypeTest.php +++ /dev/null @@ -1,43 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Ruleset; - -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Tests\ConfigDouble; -use PHP_CodeSniffer\Tests\Core\Ruleset\AbstractRulesetTestCase; - -/** - * Test handling of invalid type elements. - * - * @covers \PHP_CodeSniffer\Ruleset::processRule - */ -final class ProcessRuleInvalidTypeTest extends AbstractRulesetTestCase -{ - - - /** - * Test displaying an error when an invalid type is given. - * - * @return void - */ - public function testInvalidTypeHandling() - { - $standard = __DIR__.'/ProcessRuleInvalidTypeTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - - $message = 'ERROR: Message type "notice" for "Generic.Files.ByteOrderMark" is invalid; must be "error" or "warning".'.PHP_EOL.PHP_EOL; - $this->expectRuntimeExceptionMessage($message); - - new Ruleset($config); - - }//end testInvalidTypeHandling() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRuleInvalidTypeTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRuleInvalidTypeTest.xml deleted file mode 100644 index 4883e91..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRuleInvalidTypeTest.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - notice - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRuleShouldProcessElementTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRuleShouldProcessElementTest.php deleted file mode 100644 index 31a95d3..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRuleShouldProcessElementTest.php +++ /dev/null @@ -1,666 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Ruleset; - -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Tests\ConfigDouble; -use PHP_CodeSniffer\Tests\Core\Ruleset\AbstractRulesetTestCase; - -/** - * Test handling of `phpc(cs|cbf)-only` instructions at rule level. - * - * @covers \PHP_CodeSniffer\Ruleset::processRule - * @covers \PHP_CodeSniffer\Ruleset::shouldProcessElement - */ -final class ProcessRuleShouldProcessElementTest extends AbstractRulesetTestCase -{ - - /** - * The Ruleset object. - * - * @var \PHP_CodeSniffer\Ruleset - */ - private static $ruleset; - - - /** - * Initialize the config and ruleset objects for this test. - * - * @before - * - * @return void - */ - protected function initializeConfigAndRuleset() - { - if (isset(self::$ruleset) === false) { - // Set up the ruleset. - $standard = __DIR__.'/ProcessRuleShouldProcessElementTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - self::$ruleset = new Ruleset($config); - } - - }//end initializeConfigAndRuleset() - - - /** - * Verify that in CS mode, phpcs-only directives are set and phpcbf-only - * directives are ignored. - * - * @return void - */ - public function testShouldProcessSeverityCsonly() - { - if (PHP_CODESNIFFER_CBF === true) { - $this->markTestSkipped('This test needs CS mode to run'); - } - - $key = 'severity'; - - // Verify that the non-selective severity directive IS applied. - $sniffCode = 'Internal.NoCodeFound'; - $this->assertRulesetPropertySame(0, $sniffCode, $key); - - $sniffCode = 'PSR1.Files.SideEffects'; - $this->assertRulesetPropertySame(3, $sniffCode, $key); - - // Verify that the CS-only severity directive IS applied. - $sniffCode = 'Generic.Metrics.CyclomaticComplexity'; - $this->assertRulesetPropertySame(2, $sniffCode, $key); - - // Verify that the CBF-only severity directive is NOT applied. - $sniffCode = 'PSR2.Namespaces.NamespaceDeclaration'; - $this->assertNotHasRulesetDirective($sniffCode, $key); - - }//end testShouldProcessSeverityCsonly() - - - /** - * Verify that in CBF mode, phpcbf-only directives are set and phpcs-only - * directives are ignored. - * - * @group CBF - * - * @return void - */ - public function testShouldProcessSeverityCbfonly() - { - if (PHP_CODESNIFFER_CBF === false) { - $this->markTestSkipped('This test needs CBF mode to run'); - } - - $key = 'severity'; - - // Verify that the non-selective severity directive IS applied. - $sniffCode = 'PSR1.Files.SideEffects'; - $this->assertRulesetPropertySame(3, $sniffCode, $key); - - // Verify that the CS-only severity directive is NOT applied. - $sniffCode = 'Generic.Metrics.CyclomaticComplexity'; - $this->assertNotHasRulesetDirective($sniffCode, $key); - - // Verify that the CBF-only severity directive IS applied. - $sniffCode = 'PSR2.Namespaces.NamespaceDeclaration'; - $this->assertRulesetPropertySame(4, $sniffCode, $key); - - }//end testShouldProcessSeverityCbfonly() - - - /** - * Verify that in CS mode, phpcs-only directives are set and phpcbf-only - * directives are ignored. - * - * @return void - */ - public function testShouldProcessTypeCsonly() - { - if (PHP_CODESNIFFER_CBF === true) { - $this->markTestSkipped('This test needs CS mode to run'); - } - - $key = 'type'; - - // Verify that the non-selective type directive IS applied. - $sniffCode = 'PSR1.Files.SideEffects'; - $this->assertRulesetPropertySame('warning', $sniffCode, $key); - - // Verify that the CS-only type directive IS applied. - $sniffCode = 'Generic.Metrics.CyclomaticComplexity'; - $this->assertRulesetPropertySame('warning', $sniffCode, $key); - - // Verify that the CBF-only type directive is NOT applied. - $sniffCode = 'PSR2.Namespaces.NamespaceDeclaration'; - $this->assertNotHasRulesetDirective($sniffCode, $key); - - }//end testShouldProcessTypeCsonly() - - - /** - * Verify that in CBF mode, phpcbf-only directives are set and phpcs-only - * directives are ignored. - * - * @group CBF - * - * @return void - */ - public function testShouldProcessTypeCbfonly() - { - if (PHP_CODESNIFFER_CBF === false) { - $this->markTestSkipped('This test needs CBF mode to run'); - } - - $key = 'type'; - - // Verify that the non-selective type directive IS applied. - $sniffCode = 'PSR1.Files.SideEffects'; - $this->assertRulesetPropertySame('warning', $sniffCode, $key); - - // Verify that the CS-only type directive is NOT applied. - $sniffCode = 'Generic.Metrics.CyclomaticComplexity'; - $this->assertNotHasRulesetDirective($sniffCode, $key); - - // Verify that the CBF-only type directive IS applied. - $sniffCode = 'PSR2.Namespaces.NamespaceDeclaration'; - $this->assertRulesetPropertySame('error', $sniffCode, $key); - - }//end testShouldProcessTypeCbfonly() - - - /** - * Verify that in CS mode, phpcs-only directives are set and phpcbf-only - * directives are ignored. - * - * @return void - */ - public function testShouldProcessMessageCsonly() - { - if (PHP_CODESNIFFER_CBF === true) { - $this->markTestSkipped('This test needs CS mode to run'); - } - - $key = 'message'; - - // Verify that the non-selective message directive IS applied. - $sniffCode = 'PSR1.Files.SideEffects'; - $this->assertRulesetPropertySame('A different warning message', $sniffCode, $key); - - // Verify that the CS-only message directive IS applied. - $sniffCode = 'Generic.Metrics.CyclomaticComplexity'; - $this->assertRulesetPropertySame('A different warning but only for phpcs', $sniffCode, $key); - - // Verify that the CBF-only message directive is NOT applied. - $sniffCode = 'PSR2.Namespaces.NamespaceDeclaration'; - $this->assertNotHasRulesetDirective($sniffCode, $key); - - }//end testShouldProcessMessageCsonly() - - - /** - * Verify that in CBF mode, phpcbf-only directives are set and phpcs-only - * directives are ignored. - * - * @group CBF - * - * @return void - */ - public function testShouldProcessMessageCbfonly() - { - if (PHP_CODESNIFFER_CBF === false) { - $this->markTestSkipped('This test needs CBF mode to run'); - } - - $key = 'message'; - - // Verify that the non-selective message directive IS applied. - $sniffCode = 'Internal.NoCodeFound'; - $this->assertRulesetPropertySame("We don't to be notified if files don't contain code", $sniffCode, $key); - - $sniffCode = 'PSR1.Files.SideEffects'; - $this->assertRulesetPropertySame('A different warning message', $sniffCode, $key); - - // Verify that the CS-only message directive is NOT applied. - $sniffCode = 'Generic.Metrics.CyclomaticComplexity'; - $this->assertNotHasRulesetDirective($sniffCode, $key); - - // Verify that the CBF-only message directive IS applied. - $sniffCode = 'PSR2.Namespaces.NamespaceDeclaration'; - $this->assertRulesetPropertySame('A different warning but only for phpcbf', $sniffCode, $key); - - }//end testShouldProcessMessageCbfonly() - - - /** - * Verify that in CS mode, phpcs-only directives are set and phpcbf-only - * directives are ignored. - * - * @return void - */ - public function testShouldProcessIncludePatternCsonly() - { - if (PHP_CODESNIFFER_CBF === true) { - $this->markTestSkipped('This test needs CS mode to run'); - } - - $includedKey = './vendor/'; - - // Verify that the non-selective include-pattern directive IS applied. - $sniffCode = 'PSR1.Methods.CamelCapsMethodName'; - $this->assertArrayHasKey($sniffCode, self::$ruleset->includePatterns, "Sniff $sniffCode not registered"); - $this->assertArrayHasKey($includedKey, self::$ruleset->includePatterns[$sniffCode], "Include pattern for sniff $sniffCode not registered"); - - // Verify that the CS-only include-pattern directive IS applied. - $sniffCode = 'Generic.Files.LineLength'; - $this->assertArrayHasKey($sniffCode, self::$ruleset->includePatterns, "Sniff $sniffCode not registered"); - $this->assertArrayHasKey($includedKey, self::$ruleset->includePatterns[$sniffCode], "Include pattern for sniff $sniffCode not registered"); - - // Verify that the CBF-only include-pattern directive is NOT applied. - $sniffCode = 'PSR2.Files.ClosingTag'; - $this->assertArrayNotHasKey($sniffCode, self::$ruleset->includePatterns, "Sniff $sniffCode was registered"); - - }//end testShouldProcessIncludePatternCsonly() - - - /** - * Verify that in CS mode, phpcbf-only directives are set and phpcs-only - * directives are ignored. - * - * @group CBF - * - * @return void - */ - public function testShouldProcessIncludePatternCbfonly() - { - if (PHP_CODESNIFFER_CBF === false) { - $this->markTestSkipped('This test needs CBF mode to run'); - } - - $includedKey = './vendor/'; - - // Verify that the non-selective include-pattern directive IS applied. - $sniffCode = 'PSR1.Methods.CamelCapsMethodName'; - $this->assertArrayHasKey($sniffCode, self::$ruleset->includePatterns, "Sniff $sniffCode not registered"); - $this->assertArrayHasKey($includedKey, self::$ruleset->includePatterns[$sniffCode], "Include pattern for sniff $sniffCode not registered"); - - // Verify that the CS-only include-pattern directive is NOT applied. - $sniffCode = 'Generic.Files.LineLength'; - $this->assertArrayNotHasKey($sniffCode, self::$ruleset->includePatterns, "Sniff $sniffCode was registered"); - - // Verify that the CBF-only include-pattern directive is IS applied. - $sniffCode = 'PSR2.Files.ClosingTag'; - $this->assertArrayHasKey($sniffCode, self::$ruleset->includePatterns, "Sniff $sniffCode not registered"); - $this->assertArrayHasKey($includedKey, self::$ruleset->includePatterns[$sniffCode], "Include pattern for sniff $sniffCode not registered"); - - }//end testShouldProcessIncludePatternCbfonly() - - - /** - * Verify that in CS mode, phpcs-only directives are set and phpcbf-only - * directives are ignored. - * - * @return void - */ - public function testShouldProcessExcludePatternCsonly() - { - if (PHP_CODESNIFFER_CBF === true) { - $this->markTestSkipped('This test needs CS mode to run'); - } - - $excludedKey = './tests/'; - - // Verify that the non-selective exclude-pattern directive IS applied. - $sniffCode = 'PSR1.Classes.ClassDeclaration'; - $this->assertArrayHasKey($sniffCode, self::$ruleset->ignorePatterns, "Sniff $sniffCode not registered"); - $this->assertArrayHasKey($excludedKey, self::$ruleset->ignorePatterns[$sniffCode], "Ignore pattern for sniff $sniffCode not registered"); - - // Verify that the CS-only exclude-pattern directive IS applied. - $sniffCode = 'Generic.Formatting.SpaceAfterCast'; - $this->assertArrayHasKey($sniffCode, self::$ruleset->ignorePatterns, "Sniff $sniffCode not registered"); - $this->assertArrayHasKey($excludedKey, self::$ruleset->ignorePatterns[$sniffCode], "Ignore pattern for sniff $sniffCode not registered"); - - // Verify that the CBF-only exclude-pattern directive is NOT applied. - $sniffCode = 'PSR2.Methods.FunctionClosingBrace'; - $this->assertArrayNotHasKey($sniffCode, self::$ruleset->ignorePatterns, "Sniff $sniffCode was registered"); - - }//end testShouldProcessExcludePatternCsonly() - - - /** - * Verify that in CS mode, phpcbf-only directives are set and phpcs-only - * directives are ignored. - * - * @group CBF - * - * @return void - */ - public function testShouldProcessExcludePatternCbfonly() - { - if (PHP_CODESNIFFER_CBF === false) { - $this->markTestSkipped('This test needs CBF mode to run'); - } - - $excludedKey = './tests/'; - - // Verify that the non-selective exclude-pattern directive IS applied. - $sniffCode = 'PSR1.Classes.ClassDeclaration'; - $this->assertArrayHasKey($sniffCode, self::$ruleset->ignorePatterns, "Sniff $sniffCode not registered"); - $this->assertArrayHasKey($excludedKey, self::$ruleset->ignorePatterns[$sniffCode], "Ignore pattern for sniff $sniffCode not registered"); - - // Verify that the CS-only exclude-pattern directive is NOT applied. - $sniffCode = 'Generic.Formatting.SpaceAfterCast'; - $this->assertArrayNotHasKey($sniffCode, self::$ruleset->ignorePatterns, "Sniff $sniffCode was registered"); - - // Verify that the CBF-only exclude-pattern directive is IS applied. - $sniffCode = 'PSR2.Methods.FunctionClosingBrace'; - $this->assertArrayHasKey($sniffCode, self::$ruleset->ignorePatterns, "Sniff $sniffCode not registered"); - $this->assertArrayHasKey($excludedKey, self::$ruleset->ignorePatterns[$sniffCode], "Ignore pattern for sniff $sniffCode not registered"); - - }//end testShouldProcessExcludePatternCbfonly() - - - /** - * Verify that in CS mode, phpcs-only directives are set and phpcbf-only - * directives are ignored. - * - * @return void - */ - public function testShouldProcessPropertiesCsonly() - { - if (PHP_CODESNIFFER_CBF === true) { - $this->markTestSkipped('This test needs CS mode to run'); - } - - $csSniffClass = 'PHP_CodeSniffer\Standards\Generic\Sniffs\Arrays\ArrayIndentSniff'; - $cbfSniffClass = 'PHP_CodeSniffer\Standards\PSR2\Sniffs\Classes\ClassDeclarationSniff'; - - $propertyName = 'indent'; - $propertyDefault = 4; - $propertyChanged = '2'; - - // Verify that the CS-only property directive IS applied. - $this->assertArrayHasKey($csSniffClass, self::$ruleset->sniffs, "Sniff $csSniffClass not registered"); - $this->assertXObjectHasProperty($propertyName, self::$ruleset->sniffs[$csSniffClass]); - - $actualValue = self::$ruleset->sniffs[$csSniffClass]->$propertyName; - $this->assertSame($propertyChanged, $actualValue, 'cs-only property change directive not applied'); - - // Verify that the CBF-only property directive is NOT applied. - $this->assertArrayHasKey($cbfSniffClass, self::$ruleset->sniffs, "Sniff $cbfSniffClass not registered"); - $this->assertXObjectHasProperty($propertyName, self::$ruleset->sniffs[$cbfSniffClass]); - - $actualValue = self::$ruleset->sniffs[$cbfSniffClass]->$propertyName; - $this->assertSame($propertyDefault, $actualValue, 'cbf-only property change directive was applied'); - - }//end testShouldProcessPropertiesCsonly() - - - /** - * Verify that in CBF mode, phpcbf-only directives are set and phpcs-only - * directives are ignored. - * - * @group CBF - * - * @return void - */ - public function testShouldProcessPropertiesCbfonly() - { - if (PHP_CODESNIFFER_CBF === false) { - $this->markTestSkipped('This test needs CBF mode to run'); - } - - $csSniffClass = 'PHP_CodeSniffer\Standards\Generic\Sniffs\Arrays\ArrayIndentSniff'; - $cbfSniffClass = 'PHP_CodeSniffer\Standards\PSR2\Sniffs\Classes\ClassDeclarationSniff'; - - $propertyName = 'indent'; - $propertyDefault = 4; - $propertyChanged = '2'; - - // Verify that the CS-only property directive is NOT applied. - $this->assertArrayHasKey($csSniffClass, self::$ruleset->sniffs, "Sniff $csSniffClass not registered"); - $this->assertXObjectHasProperty($propertyName, self::$ruleset->sniffs[$csSniffClass]); - - $actualValue = self::$ruleset->sniffs[$csSniffClass]->$propertyName; - $this->assertSame($propertyDefault, $actualValue, 'cs-only property change directive was applied'); - - // Verify that the CBF-only property directive IS applied. - $this->assertArrayHasKey($cbfSniffClass, self::$ruleset->sniffs, "Sniff $cbfSniffClass not registered"); - $this->assertXObjectHasProperty($propertyName, self::$ruleset->sniffs[$cbfSniffClass]); - - $actualValue = self::$ruleset->sniffs[$cbfSniffClass]->$propertyName; - $this->assertSame($propertyChanged, $actualValue, 'cbf-only property change directive not applied'); - - }//end testShouldProcessPropertiesCbfonly() - - - /** - * Verify that in CS mode, phpcs-only directives are set and phpcbf-only - * directives are ignored. - * - * @return void - */ - public function testShouldProcessPropertyCsonly() - { - if (PHP_CODESNIFFER_CBF === true) { - $this->markTestSkipped('This test needs CS mode to run'); - } - - // Verify the sniff is registed. - $sniffClass = 'PHP_CodeSniffer\Standards\Generic\Sniffs\WhiteSpace\ScopeIndentSniff'; - $this->assertArrayHasKey($sniffClass, self::$ruleset->sniffs, "Sniff $sniffClass not registered"); - - $sniffObject = self::$ruleset->sniffs[$sniffClass]; - - // Verify that the non-selective property directive IS applied. - $propertyName = 'exact'; - $expected = true; - - $this->assertXObjectHasProperty($propertyName, $sniffObject); - $this->assertSame($expected, $sniffObject->$propertyName, 'Non-selective property change directive not applied'); - - // Verify that the CS-only property directive IS applied. - $propertyName = 'indent'; - $expected = '2'; - - $this->assertXObjectHasProperty($propertyName, $sniffObject); - $this->assertSame($expected, $sniffObject->$propertyName, 'cs-only property change directive not applied'); - - // Verify that the CBF-only property directive is NOT applied. - $propertyName = 'tabIndent'; - $expectedDefault = false; - - $this->assertXObjectHasProperty($propertyName, $sniffObject); - $this->assertSame($expectedDefault, $sniffObject->$propertyName, 'cbf-only property change directive was applied'); - - }//end testShouldProcessPropertyCsonly() - - - /** - * Verify that in CBF mode, phpcbf-only directives are set and phpcs-only - * directives are ignored. - * - * @group CBF - * - * @return void - */ - public function testShouldProcessPropertyCbfonly() - { - if (PHP_CODESNIFFER_CBF === false) { - $this->markTestSkipped('This test needs CBF mode to run'); - } - - // Verify the sniff is registed. - $sniffClass = 'PHP_CodeSniffer\Standards\Generic\Sniffs\WhiteSpace\ScopeIndentSniff'; - $this->assertArrayHasKey($sniffClass, self::$ruleset->sniffs, "Sniff $sniffClass not registered"); - - $sniffObject = self::$ruleset->sniffs[$sniffClass]; - - // Verify that the non-selective property directive IS applied. - $propertyName = 'exact'; - $expected = true; - - $this->assertXObjectHasProperty($propertyName, $sniffObject); - $this->assertSame($expected, $sniffObject->$propertyName, 'Non-selective property change directive not applied'); - - // Verify that the CS-only property directive is NOT applied. - $propertyName = 'indent'; - $expectedDefault = 4; - - $this->assertXObjectHasProperty($propertyName, $sniffObject); - $this->assertSame($expectedDefault, $sniffObject->$propertyName, 'cs-only property change directive was applied'); - - // Verify that the CBF-only property directive IS applied. - $propertyName = 'tabIndent'; - $expected = true; - - $this->assertXObjectHasProperty($propertyName, $sniffObject); - $this->assertSame($expected, $sniffObject->$propertyName, 'cbf-only property change directive not applied'); - - }//end testShouldProcessPropertyCbfonly() - - - /** - * Verify that in CS mode, phpcs-only directives are set and phpcbf-only - * directives are ignored. - * - * @return void - */ - public function testShouldProcessElementCsonly() - { - if (PHP_CODESNIFFER_CBF === true) { - $this->markTestSkipped('This test needs CS mode to run'); - } - - $expected = [ - // Non-selective element directive. - 'T_COMMENT', - // Phpcs-only element directive. - 'T_CLASS', - // Non-selective element directive via `extend`. - 'T_BACKTICK', - // Phpcs-only element directive via `extend`. - 'T_INTERFACE', - ]; - - $this->verifyShouldProcessElement($expected); - - }//end testShouldProcessElementCsonly() - - - /** - * Verify that in CBF mode, phpcbf-only directives are set and phpcs-only - * directives are ignored. - * - * @group CBF - * - * @return void - */ - public function testShouldProcessElementCbfonly() - { - if (PHP_CODESNIFFER_CBF === false) { - $this->markTestSkipped('This test needs CBF mode to run'); - } - - $expected = [ - // Non-selective element directive. - 'T_COMMENT', - // Phpcbf-only element directive. - 'T_ENUM', - // Non-selective element directive via `extend`. - 'T_BACKTICK', - // Phpcbf-only element directive via `extend`. - 'T_TRAIT', - ]; - - $this->verifyShouldProcessElement($expected); - - }//end testShouldProcessElementCbfonly() - - - /** - * Verify that directives are set correctly. - * - * @param array $expected Expected sniff property value. - * - * @return void - */ - private function verifyShouldProcessElement($expected) - { - // Verify the sniff is registed. - $sniffClass = 'PHP_CodeSniffer\Standards\Generic\Sniffs\WhiteSpace\ScopeIndentSniff'; - $this->assertArrayHasKey($sniffClass, self::$ruleset->sniffs, "Sniff $sniffClass not registered"); - - // Verify the target property exists. - $sniffObject = self::$ruleset->sniffs[$sniffClass]; - $propertyName = 'ignoreIndentationTokens'; - - $this->assertXObjectHasProperty($propertyName, $sniffObject); - - // Verify the value. - $actualValue = $sniffObject->$propertyName; - $this->assertSame($expected, $actualValue, 'Selective element directives not applied correctly'); - - }//end verifyShouldProcessElement() - - - /** - * Custom assertion to verify that a Ruleset `$ruleset` property has a certain directive set for a certain sniff code. - * - * @param string $sniffCode Sniff code. - * @param string $key Array key. - * - * @return void - */ - private function assertHasRulesetDirective($sniffCode, $key) - { - $this->assertArrayHasKey($sniffCode, self::$ruleset->ruleset, "Sniff $sniffCode not registered"); - $this->assertTrue(is_array(self::$ruleset->ruleset[$sniffCode]), "Sniff $sniffCode is not an array"); - $this->assertArrayHasKey($key, self::$ruleset->ruleset[$sniffCode], "Directive $key not registered for sniff $sniffCode"); - - }//end assertHasRulesetDirective() - - - /** - * Custom assertion to verify that a Ruleset `$ruleset` property does NOT have a certain directive set for a certain sniff code. - * - * @param string $sniffCode Sniff code. - * @param string $key Array key. - * - * @return void - */ - private function assertNotHasRulesetDirective($sniffCode, $key) - { - if (isset(self::$ruleset->ruleset[$sniffCode]) === true - && is_array(self::$ruleset->ruleset[$sniffCode]) === true - && isset(self::$ruleset->ruleset[$sniffCode][$key]) === true - ) { - $this->fail("Directive $key is registered for sniff $sniffCode"); - } - - }//end assertNotHasRulesetDirective() - - - /** - * Custom assertion to verify that the value of a certain directive for a certain sniff code on the ruleset is correct. - * - * @param mixed $expected Expected value. - * @param string $sniffCode Sniff code. - * @param string $key Array key. - * - * @return void - */ - private function assertRulesetPropertySame($expected, $sniffCode, $key) - { - $this->assertHasRulesetDirective($sniffCode, $key); - - $actual = self::$ruleset->ruleset[$sniffCode][$key]; - $this->assertSame($expected, $actual, "Value for $key on sniff $sniffCode does not meet expectations"); - - }//end assertRulesetPropertySame() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRuleShouldProcessElementTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRuleShouldProcessElementTest.xml deleted file mode 100644 index a8a6f4d..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRuleShouldProcessElementTest.xml +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - 0 - We don't to be notified if files don't contain code - - - - 3 - warning - A different warning message - - - - ./vendor/ - - - - ./tests/ - - - - - - - 2 - warning - A different warning but only for phpcs - - - - ./vendor/ - - - - ./tests/ - - - - - - - - - - - 4 - error - A different warning but only for phpcbf - - - - ./vendor/ - - - - ./tests/ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetAutoExpandSniffsDirectoryTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetAutoExpandSniffsDirectoryTest.xml deleted file mode 100644 index 5290782..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetAutoExpandSniffsDirectoryTest.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetAutoloadFileNotFoundTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetAutoloadFileNotFoundTest.xml deleted file mode 100644 index 6df4c63..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetAutoloadFileNotFoundTest.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - ./tests/Core/Ruleset/Fixtures/ThisFileDoesNotExist.php - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetAutoloadTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetAutoloadTest.php deleted file mode 100644 index c3fdd4d..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetAutoloadTest.php +++ /dev/null @@ -1,164 +0,0 @@ - instructions. - * - * @author Juliette Reinders Folmer - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Ruleset; - -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Tests\ConfigDouble; -use PHP_CodeSniffer\Tests\Core\Ruleset\AbstractRulesetTestCase; - -/** - * Test handling of instructions. - * - * Note: these tests need to run in separate processes as otherwise we cannot - * reliably determine whether or not the correct files were loaded as the - * underlying code uses `include_once`. - * - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * - * @covers \PHP_CodeSniffer\Ruleset::processRuleset - */ -final class ProcessRulesetAutoloadTest extends AbstractRulesetTestCase -{ - - - /** - * Verify that in CS mode, phpcs-only directives are respected and phpcbf-only - * directives are ignored. - * - * @return void - */ - public function testShouldProcessAutoloadCsonly() - { - if (PHP_CODESNIFFER_CBF === true) { - $this->markTestSkipped('This test needs CS mode to run'); - } - - $originallyIncludes = get_included_files(); - - // Set up the ruleset. - $standard = __DIR__.'/ProcessRulesetAutoloadTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - new Ruleset($config); - - $finalIncludes = get_included_files(); - $diff = array_diff($finalIncludes, $originallyIncludes); - - $this->assertContains( - __DIR__.str_replace('/', DIRECTORY_SEPARATOR, '/Fixtures/ProcessRulesetAutoloadLoadAlways.1.php'), - $diff, - 'ProcessRulesetAutoloadLoadAlways.1.php autoload file was not loaded' - ); - $this->assertContains( - __DIR__.str_replace('/', DIRECTORY_SEPARATOR, '/Fixtures/ProcessRulesetAutoloadLoadAlways.2.php'), - $diff, - 'ProcessRulesetAutoloadLoadAlways.2.php autoload file was not loaded' - ); - $this->assertContains( - __DIR__.str_replace('/', DIRECTORY_SEPARATOR, '/Fixtures/ProcessRulesetAutoloadLoadAlways.3.php'), - $diff, - 'ProcessRulesetAutoloadLoadAlways.3.php autoload file was not loaded' - ); - $this->assertContains( - __DIR__.str_replace('/', DIRECTORY_SEPARATOR, '/Fixtures/ProcessRulesetAutoloadLoadAlways.4.php'), - $diff, - 'ProcessRulesetAutoloadLoadAlways.4.php autoload file was not loaded' - ); - $this->assertContains( - __DIR__.str_replace('/', DIRECTORY_SEPARATOR, '/Fixtures/ProcessRulesetAutoloadLoadPhpcsOnly.php'), - $diff, - 'ProcessRulesetAutoloadLoadPhpcsOnly.php autoload file was not loaded' - ); - $this->assertNotContains( - __DIR__.str_replace('/', DIRECTORY_SEPARATOR, '/Fixtures/ProcessRulesetAutoloadLoadPhpcbfOnly.php'), - $diff, - 'ProcessRulesetAutoloadLoadPhpcbfOnly.php autoload file was loaded, while it shouldn\'t have been' - ); - - }//end testShouldProcessAutoloadCsonly() - - - /** - * Verify that in CBF mode, phpcbf-only directives are respected and phpcs-only - * directives are ignored. - * - * @group CBF - * - * @return void - */ - public function testShouldProcessAutoloadCbfonly() - { - if (PHP_CODESNIFFER_CBF === false) { - $this->markTestSkipped('This test needs CBF mode to run'); - } - - $originallyIncludes = get_included_files(); - - // Set up the ruleset. - $standard = __DIR__.'/ProcessRulesetAutoloadTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - new Ruleset($config); - - $finalIncludes = get_included_files(); - $diff = array_diff($finalIncludes, $originallyIncludes); - - $this->assertContains( - __DIR__.str_replace('/', DIRECTORY_SEPARATOR, '/Fixtures/ProcessRulesetAutoloadLoadAlways.1.php'), - $diff, - 'ProcessRulesetAutoloadLoadAlways.1.php autoload file was not loaded' - ); - $this->assertContains( - __DIR__.str_replace('/', DIRECTORY_SEPARATOR, '/Fixtures/ProcessRulesetAutoloadLoadAlways.2.php'), - $diff, - 'ProcessRulesetAutoloadLoadAlways.2.php autoload file was not loaded' - ); - $this->assertContains( - __DIR__.str_replace('/', DIRECTORY_SEPARATOR, '/Fixtures/ProcessRulesetAutoloadLoadAlways.3.php'), - $diff, - 'ProcessRulesetAutoloadLoadAlways.3.php autoload file was not loaded' - ); - $this->assertContains( - __DIR__.str_replace('/', DIRECTORY_SEPARATOR, '/Fixtures/ProcessRulesetAutoloadLoadAlways.4.php'), - $diff, - 'ProcessRulesetAutoloadLoadAlways.4.php autoload file was not loaded' - ); - $this->assertNotContains( - __DIR__.str_replace('/', DIRECTORY_SEPARATOR, '/Fixtures/ProcessRulesetAutoloadLoadPhpcsOnly.php'), - $diff, - 'ProcessRulesetAutoloadLoadPhpcsOnly.php autoload file was loaded, while it shouldn\'t have been' - ); - $this->assertContains( - __DIR__.str_replace('/', DIRECTORY_SEPARATOR, '/Fixtures/ProcessRulesetAutoloadLoadPhpcbfOnly.php'), - $diff, - 'ProcessRulesetAutoloadLoadPhpcbfOnly.php autoload file was not loaded' - ); - - }//end testShouldProcessAutoloadCbfonly() - - - /** - * Test an exception is thrown when the directive points to a file which doesn't exist. - * - * @return void - */ - public function testFileNotFoundException() - { - $exceptionMsg = 'ERROR: The specified autoload file "./tests/Core/Ruleset/Fixtures/ThisFileDoesNotExist.php" does not exist'; - $this->expectRuntimeExceptionMessage($exceptionMsg); - - // Set up the ruleset. - $standard = __DIR__.'/ProcessRulesetAutoloadFileNotFoundTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - new Ruleset($config); - - }//end testFileNotFoundException() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetAutoloadTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetAutoloadTest.xml deleted file mode 100644 index f886288..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetAutoloadTest.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - . - - - - ./Fixtures/ProcessRulesetAutoloadLoadAlways.1.php - Fixtures/ProcessRulesetAutoloadLoadAlways.2.php - - - ./tests/Core/Ruleset/Fixtures/ProcessRulesetAutoloadLoadAlways.3.php - tests/Core/Ruleset/Fixtures/ProcessRulesetAutoloadLoadAlways.4.php - - - ./tests/Core/Ruleset/Fixtures/ProcessRulesetAutoloadLoadPhpcsOnly.php - - - ./tests/Core/Ruleset/Fixtures/ProcessRulesetAutoloadLoadPhpcbfOnly.php - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetBrokenRulesetEmptyFileTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetBrokenRulesetEmptyFileTest.xml deleted file mode 100644 index e69de29..0000000 diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetBrokenRulesetMultiErrorTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetBrokenRulesetMultiErrorTest.xml deleted file mode 100644 index 211b568..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetBrokenRulesetMultiErrorTest.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetBrokenRulesetSingleErrorTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetBrokenRulesetSingleErrorTest.xml deleted file mode 100644 index 37aeef6..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetBrokenRulesetSingleErrorTest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetBrokenRulesetTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetBrokenRulesetTest.php deleted file mode 100644 index f56eda4..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetBrokenRulesetTest.php +++ /dev/null @@ -1,96 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Ruleset; - -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Tests\ConfigDouble; -use PHP_CodeSniffer\Tests\Core\Ruleset\AbstractRulesetTestCase; - -/** - * Test handling of broken ruleset files. - * - * Note: these tests need to run in separate processes as otherwise they run into - * some weirdness with the libxml_get_errors()/libxml_clear_errors() functions - * (duplicate error messages). - * - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * - * @group Windows - * - * @covers \PHP_CodeSniffer\Ruleset::processRuleset - */ -final class ProcessRulesetBrokenRulesetTest extends AbstractRulesetTestCase -{ - - - /** - * Test displaying an informative error message when an empty XML ruleset file is encountered. - * - * @return void - */ - public function testBrokenRulesetEmptyFile() - { - $standard = __DIR__.'/ProcessRulesetBrokenRulesetEmptyFileTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - - $regex = '`^ERROR: Ruleset \S+ProcessRulesetBrokenRulesetEmptyFileTest\.xml is not valid\R'; - $regex .= '(- On line 1, column 1: Document is empty\R)?$`'; - - $this->expectRuntimeExceptionRegex($regex); - - new Ruleset($config); - - }//end testBrokenRulesetEmptyFile() - - - /** - * Test displaying an informative error message for a broken XML ruleset with a single XML error. - * - * @return void - */ - public function testBrokenRulesetSingleError() - { - $standard = __DIR__.'/ProcessRulesetBrokenRulesetSingleErrorTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - - $regex = '`^ERROR: Ruleset \S+ProcessRulesetBrokenRulesetSingleErrorTest\.xml is not valid\R'; - $regex .= '- On line 3, column 1: (Premature end of data in tag ruleset line 2|EndTag: \'expectRuntimeExceptionRegex($regex); - - new Ruleset($config); - - }//end testBrokenRulesetSingleError() - - - /** - * Test displaying an informative error message for a broken XML ruleset with multiple XML errors. - * - * @return void - */ - public function testBrokenRulesetMultiError() - { - $standard = __DIR__.'/ProcessRulesetBrokenRulesetMultiErrorTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - - $regex = '`^ERROR: Ruleset \S+ProcessRulesetBrokenRulesetMultiErrorTest\.xml is not valid\R'; - $regex .= '- On line 8, column 12: Opening and ending tag mismatch: property line 7 and rule\R'; - $regex .= '- On line 10, column 11: Opening and ending tag mismatch: properties line [57] and ruleset\R'; - $regex .= '(- On line 11, column 1: (Premature end of data in tag rule(set)? line [24]|EndTag: \'expectRuntimeExceptionRegex($regex); - - new Ruleset($config); - - }//end testBrokenRulesetMultiError() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetExcludeSniffGroupTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetExcludeSniffGroupTest.xml deleted file mode 100644 index 5aa4aed..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetExcludeSniffGroupTest.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetInvalidNoSniffsDirTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetInvalidNoSniffsDirTest.xml deleted file mode 100644 index 5987435..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetInvalidNoSniffsDirTest.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetMiscTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetMiscTest.xml deleted file mode 100644 index 7adef22..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetMiscTest.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetShouldProcessElementTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetShouldProcessElementTest.php deleted file mode 100644 index d690a52..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetShouldProcessElementTest.php +++ /dev/null @@ -1,391 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Ruleset; - -use PHP_CodeSniffer\Config; -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Tests\ConfigDouble; -use PHPUnit\Framework\TestCase; - -/** - * Test handling of `phpc(cs|cbf)-only` instructions at ruleset level. - * - * @covers \PHP_CodeSniffer\Ruleset::processRuleset - * @covers \PHP_CodeSniffer\Ruleset::shouldProcessElement - */ -final class ProcessRulesetShouldProcessElementTest extends TestCase -{ - - /** - * Cache to store the original ini values for ini settings being changed in these tests. - * - * @var array - */ - private static $originalIniValues = [ - 'bcmath.scale' => null, - 'docref_root' => null, - 'user_agent' => null, - ]; - - /** - * The Config object. - * - * @var \PHP_CodeSniffer\Tests\ConfigDouble - */ - private static $config; - - /** - * The Ruleset object. - * - * @var \PHP_CodeSniffer\Ruleset - */ - private static $ruleset; - - - /** - * Store the original ini values to allow for restoring them after the tests. - * - * @beforeClass - * - * @return void - */ - public static function saveOriginalIniValues() - { - foreach (self::$originalIniValues as $name => $null) { - $value = ini_get($name); - if ($value !== false) { - self::$originalIniValues[$name] = $value; - } - } - - }//end saveOriginalIniValues() - - - /** - * Initialize the config and ruleset objects for this test only once (but do allow recording code coverage). - * - * @before - * - * @return void - */ - protected function initializeConfigAndRuleset() - { - if (isset(self::$ruleset) === false) { - // Set up the ruleset. - $standard = __DIR__.'/ProcessRulesetShouldProcessElementTest.xml'; - self::$config = new ConfigDouble(["--standard=$standard"]); - self::$ruleset = new Ruleset(self::$config); - } - - }//end initializeConfigAndRuleset() - - - /** - * Destroy the Config object and restore the ini values after the tests. - * - * @afterClass - * - * @return void - */ - public static function restoreOriginalValues() - { - // Explicitly trigger __destruct() on the ConfigDouble to reset the Config statics. - // The explicit method call prevents potential stray test-local references to the $config object - // preventing the destructor from running the clean up (which without stray references would be - // automagically triggered when this object is destroyed, but we can't definitively rely on that). - if (isset(self::$config) === true) { - self::$config->__destruct(); - } - - foreach (self::$originalIniValues as $name => $value) { - if ($value === null) { - continue; - } - - ini_set($name, $value); - } - - }//end restoreOriginalValues() - - - /** - * Verify that in CS mode, phpcs-only directives are respected and phpcbf-only - * directives are ignored. - * - * @return void - */ - public function testShouldProcessConfigCsonly() - { - if (PHP_CODESNIFFER_CBF === true) { - $this->markTestSkipped('This test needs CS mode to run'); - } - - $this->assertSame('true', Config::getConfigData('neither'), 'Non-selective config directive was not applied.'); - $this->assertSame('true', Config::getConfigData('csOnly'), 'CS-only config directive was not applied.'); - $this->assertSame(null, Config::getConfigData('cbfOnly'), 'CBF-only config directive was applied, while it shouldn\'t have been.'); - - }//end testShouldProcessConfigCsonly() - - - /** - * Verify that in CBF mode, phpcbf-only directives are respected and phpcs-only - * directives are ignored. - * - * @group CBF - * - * @return void - */ - public function testShouldProcessConfigCbfonly() - { - if (PHP_CODESNIFFER_CBF === false) { - $this->markTestSkipped('This test needs CBF mode to run'); - } - - $this->assertSame('true', Config::getConfigData('neither'), 'Non-selective config directive was not applied.'); - $this->assertSame(null, Config::getConfigData('csOnly'), 'CS-only config directive was applied, while it shouldn\'t have been.'); - $this->assertSame('true', Config::getConfigData('cbfOnly'), 'CBF-only config directive was not applied.'); - - }//end testShouldProcessConfigCbfonly() - - - /** - * Verify that in CS mode, phpcs-only directives are respected and phpcbf-only - * directives are ignored. - * - * @return void - */ - public function testShouldProcessArgCsonly() - { - if (PHP_CODESNIFFER_CBF === true) { - $this->markTestSkipped('This test needs CS mode to run'); - } - - $expectedExtensions = [ - 'php' => 'PHP', - 'phpt' => 'PHP', - ]; - $expectedReports = ['full' => null]; - - $this->assertSame($expectedExtensions, self::$config->extensions, 'Non-selective arg directive was not applied.'); - $this->assertTrue(self::$config->showProgress, 'Non-selective short arg directive was not applied [1].'); - $this->assertTrue(self::$config->showSources, 'Non-selective short arg directive was not applied [2].'); - $this->assertTrue(self::$config->colors, 'CS-only arg directive was not applied.'); - $this->assertSame($expectedReports, self::$config->reports, 'CBF-only arg directive was applied, while it shouldn\'t have been.'); - - }//end testShouldProcessArgCsonly() - - - /** - * Verify that in CBF mode, phpcbf-only directives are respected and phpcs-only - * directives are ignored. - * - * @group CBF - * - * @return void - */ - public function testShouldProcessArgCbfonly() - { - if (PHP_CODESNIFFER_CBF === false) { - $this->markTestSkipped('This test needs CBF mode to run'); - } - - $expectedExtensions = [ - 'php' => 'PHP', - 'phpt' => 'PHP', - ]; - $expectedReports = ['summary' => null]; - - $this->assertSame($expectedExtensions, self::$config->extensions, 'Non-selective arg directive was not applied.'); - $this->assertTrue(self::$config->showProgress, 'Non-selective short arg directive was not applied [1].'); - $this->assertTrue(self::$config->showSources, 'Non-selective short arg directive was not applied [2].'); - $this->assertFalse(self::$config->colors, 'CS-only arg directive was applied, while it shouldn\'t have been.'); - $this->assertSame($expectedReports, self::$config->reports, 'CBF-only arg directive was not applied.'); - - }//end testShouldProcessArgCbfonly() - - - /** - * Verify that in CS mode, phpcs-only directives are respected and phpcbf-only - * directives are ignored. - * - * @requires extension bcmath - * - * @return void - */ - public function testShouldProcessIniCsonly() - { - if (PHP_CODESNIFFER_CBF === true) { - $this->markTestSkipped('This test needs CS mode to run'); - } - - $this->assertSame('2', ini_get('bcmath.scale'), 'Non-selective ini directive was not applied.'); - $this->assertSame('path/to/docs/', ini_get('docref_root'), 'CS-only ini directive was not applied.'); - $this->assertSame('', ini_get('user_agent'), 'CBF-only ini directive was applied, while it shouldn\'t have been.'); - - }//end testShouldProcessIniCsonly() - - - /** - * Verify that in CBF mode, phpcbf-only directives are respected and phpcs-only - * directives are ignored. - * - * @group CBF - * @requires extension bcmath - * - * @return void - */ - public function testShouldProcessIniCbfonly() - { - if (PHP_CODESNIFFER_CBF === false) { - $this->markTestSkipped('This test needs CBF mode to run'); - } - - $this->assertSame('2', ini_get('bcmath.scale'), 'Non-selective ini directive was not applied.'); - $this->assertSame('', ini_get('docref_root'), 'CS-only ini directive was applied, while it shouldn\'t have been..'); - $this->assertSame('Never mind', ini_get('user_agent'), 'CBF-only ini directive was not applied.'); - - }//end testShouldProcessIniCbfonly() - - - /** - * Verify that in CS mode, phpcs-only directives are respected and phpcbf-only - * directives are ignored. - * - * @return void - */ - public function testShouldProcessExcludePatternCsonly() - { - if (PHP_CODESNIFFER_CBF === true) { - $this->markTestSkipped('This test needs CS mode to run'); - } - - $expected = [ - './tests/' => 'absolute', - './vendor/' => 'absolute', - ]; - - $this->assertSame($expected, self::$ruleset->ignorePatterns); - - }//end testShouldProcessExcludePatternCsonly() - - - /** - * Verify that in CBF mode, phpcbf-only directives are respected and phpcs-only - * directives are ignored. - * - * @group CBF - * - * @return void - */ - public function testShouldProcessExcludePatternCbfonly() - { - if (PHP_CODESNIFFER_CBF === false) { - $this->markTestSkipped('This test needs CBF mode to run'); - } - - $expected = [ - './tests/' => 'absolute', - './node-modules/' => 'absolute', - ]; - - $this->assertSame($expected, self::$ruleset->ignorePatterns); - - }//end testShouldProcessExcludePatternCbfonly() - - - /** - * Verify that in CS mode, phpcs-only directives are respected and phpcbf-only - * directives are ignored. - * - * @return void - */ - public function testShouldProcessRuleCsonly() - { - if (PHP_CODESNIFFER_CBF === true) { - $this->markTestSkipped('This test needs CS mode to run'); - } - - $this->assertArrayHasKey('PEAR.Formatting.MultiLineAssignment', self::$ruleset->sniffCodes); - $this->assertArrayHasKey('Generic.Arrays.ArrayIndent', self::$ruleset->sniffCodes); - $this->assertArrayNotHasKey('PSR2.Classes.ClassDeclaration', self::$ruleset->sniffCodes); - - }//end testShouldProcessRuleCsonly() - - - /** - * Verify that in CBF mode, phpcbf-only directives are respected and phpcs-only - * directives are ignored. - * - * @group CBF - * - * @return void - */ - public function testShouldProcessRuleCbfonly() - { - if (PHP_CODESNIFFER_CBF === false) { - $this->markTestSkipped('This test needs CBF mode to run'); - } - - $this->assertArrayHasKey('PEAR.Formatting.MultiLineAssignment', self::$ruleset->sniffCodes); - $this->assertArrayNotHasKey('Generic.Arrays.ArrayIndent', self::$ruleset->sniffCodes); - $this->assertArrayHasKey('PSR2.Classes.ClassDeclaration', self::$ruleset->sniffCodes); - - }//end testShouldProcessRuleCbfonly() - - - /** - * Verify that in CS mode, phpcs-only in directives are respected and phpcbf-only in - * directives are ignored. - * - * @return void - */ - public function testShouldProcessRuleExcludeCsonly() - { - if (PHP_CODESNIFFER_CBF === true) { - $this->markTestSkipped('This test needs CS mode to run'); - } - - $expected = [ - 'PEAR.Formatting.MultiLineAssignment.Indent' => [ - 'severity' => 0, - ], - ]; - - $this->assertSame($expected, self::$ruleset->ruleset); - - }//end testShouldProcessRuleExcludeCsonly() - - - /** - * Verify that in CBF mode, phpcbf-only in directives are respected and phpcs-only in - * directives are ignored. - * - * @group CBF - * - * @return void - */ - public function testShouldProcessRuleExcludeCbfonly() - { - if (PHP_CODESNIFFER_CBF === false) { - $this->markTestSkipped('This test needs CBF mode to run'); - } - - $expected = [ - 'PEAR.Formatting.MultiLineAssignment.EqualSignLine' => [ - 'severity' => 0, - ], - ]; - - $this->assertSame($expected, self::$ruleset->ruleset); - - }//end testShouldProcessRuleExcludeCbfonly() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetShouldProcessElementTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetShouldProcessElementTest.xml deleted file mode 100644 index 2a25667..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetShouldProcessElementTest.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - . - - - - - - - - ./tests/ - - - - - - - - - ./vendor/ - - - - - - - - - - - - - ./node-modules/ - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetTest.php deleted file mode 100644 index 3c39666..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ProcessRulesetTest.php +++ /dev/null @@ -1,266 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Ruleset; - -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Tests\ConfigDouble; -use PHPUnit\Framework\TestCase; - -/** - * Test various aspects of the Ruleset::processRuleset() method not covered via other tests. - * - * @covers \PHP_CodeSniffer\Ruleset::processRuleset - */ -final class ProcessRulesetTest extends TestCase -{ - - - /** - * Verify that a registered standard which doesn't have a "Sniffs" directory, but does have a file - * called "Sniffs" doesn't result in any errors being thrown. - * - * @return void - */ - public function testSniffsFileNotDirectory() - { - // Set up the ruleset. - $standard = __DIR__.'/ProcessRulesetInvalidNoSniffsDirTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - $ruleset = new Ruleset($config); - - $expected = ['Generic.PHP.BacktickOperator' => 'PHP_CodeSniffer\Standards\Generic\Sniffs\PHP\BacktickOperatorSniff']; - - $this->assertSame($expected, $ruleset->sniffCodes); - - }//end testSniffsFileNotDirectory() - - - /** - * Verify that all sniffs in a registered standard included in a ruleset automatically get added. - * - * @return void - */ - public function testAutoExpandSniffsDirectory() - { - // Set up the ruleset. - $standard = __DIR__.'/ProcessRulesetAutoExpandSniffsDirectoryTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - $ruleset = new Ruleset($config); - - $std = 'TestStandard'; - $sniffDir = 'Fixtures\TestStandard\Sniffs'; - $expected = [ - "$std.Deprecated.WithLongReplacement" => "$sniffDir\Deprecated\WithLongReplacementSniff", - "$std.Deprecated.WithReplacement" => "$sniffDir\Deprecated\WithReplacementSniff", - "$std.Deprecated.WithReplacementContainingLinuxNewlines" => "$sniffDir\Deprecated\WithReplacementContainingLinuxNewlinesSniff", - "$std.Deprecated.WithReplacementContainingNewlines" => "$sniffDir\Deprecated\WithReplacementContainingNewlinesSniff", - "$std.Deprecated.WithoutReplacement" => "$sniffDir\Deprecated\WithoutReplacementSniff", - "$std.DeprecatedInvalid.EmptyDeprecationVersion" => "$sniffDir\DeprecatedInvalid\EmptyDeprecationVersionSniff", - "$std.DeprecatedInvalid.EmptyRemovalVersion" => "$sniffDir\DeprecatedInvalid\EmptyRemovalVersionSniff", - "$std.DeprecatedInvalid.InvalidDeprecationMessage" => "$sniffDir\DeprecatedInvalid\InvalidDeprecationMessageSniff", - "$std.DeprecatedInvalid.InvalidDeprecationVersion" => "$sniffDir\DeprecatedInvalid\InvalidDeprecationVersionSniff", - "$std.DeprecatedInvalid.InvalidRemovalVersion" => "$sniffDir\DeprecatedInvalid\InvalidRemovalVersionSniff", - "$std.MissingInterface.ValidImplements" => "$sniffDir\MissingInterface\ValidImplementsSniff", - "$std.MissingInterface.ValidImplementsViaAbstract" => "$sniffDir\MissingInterface\ValidImplementsViaAbstractSniff", - "$std.SetProperty.AllowedAsDeclared" => "$sniffDir\SetProperty\AllowedAsDeclaredSniff", - "$std.SetProperty.AllowedViaMagicMethod" => "$sniffDir\SetProperty\AllowedViaMagicMethodSniff", - "$std.SetProperty.AllowedViaStdClass" => "$sniffDir\SetProperty\AllowedViaStdClassSniff", - "$std.SetProperty.NotAllowedViaAttribute" => "$sniffDir\SetProperty\NotAllowedViaAttributeSniff", - "$std.SetProperty.PropertyTypeHandling" => "$sniffDir\SetProperty\PropertyTypeHandlingSniff", - "$std.ValidSniffs.RegisterEmptyArray" => "$sniffDir\ValidSniffs\RegisterEmptyArraySniff", - ]; - - // Sort the value to make the tests stable as different OSes will read directories - // in a different order and the order is not relevant for these tests. Just the values. - $actual = $ruleset->sniffCodes; - ksort($actual); - - $this->assertSame($expected, $actual); - - }//end testAutoExpandSniffsDirectory() - - - /** - * Verify handling of exclusions of groups of sniffs after inclusion via an even larger "group". - * - * @return void - */ - public function testExcludeSniffGroup() - { - // Set up the ruleset. - $standard = __DIR__.'/ProcessRulesetExcludeSniffGroupTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - $ruleset = new Ruleset($config); - - $expected = [ - 'PSR1.Classes.ClassDeclaration' => 'PHP_CodeSniffer\Standards\PSR1\Sniffs\Classes\ClassDeclarationSniff', - 'PSR1.Methods.CamelCapsMethodName' => 'PHP_CodeSniffer\Standards\PSR1\Sniffs\Methods\CamelCapsMethodNameSniff', - ]; - - // Sort the value to make the tests stable as different OSes will read directories - // in a different order and the order is not relevant for these tests. Just the values. - $actual = $ruleset->sniffCodes; - ksort($actual); - - $this->assertSame($expected, $actual); - - }//end testExcludeSniffGroup() - - - /* - * No test for without "name" as there is nothing we can assert to verify it's being ignored. - */ - - - /** - * Test that an `` directive without a "value" attribute will be set to the ini equivalent of `true`. - * - * @return void - */ - public function testIniWithoutValue() - { - $originalValue = ini_get('user_agent'); - - // Set up the ruleset. - $this->getMiscRuleset(); - - $actualValue = ini_get('user_agent'); - // Reset the ini to its original value before the assertion to ensure it's never left in an incorrect state. - if ($originalValue !== false) { - ini_set('user_agent', $originalValue); - } - - $this->assertSame('1', $actualValue); - - }//end testIniWithoutValue() - - - /** - * Verify that inclusion of a single error code: - * - Includes the sniff, but sets "severity" for the sniff to 0; - * - Sets "severity" for the specific error code included to 5.; - * - * @return void - */ - public function testIncludeSingleErrorCode() - { - // Set up the ruleset. - $ruleset = $this->getMiscRuleset(); - - $key = 'severity'; - - $sniffCode = 'Generic.PHP.RequireStrictTypes'; - $this->assertArrayHasKey($sniffCode, $ruleset->ruleset, "Sniff $sniffCode not registered"); - $this->assertTrue(is_array($ruleset->ruleset[$sniffCode]), "Sniff $sniffCode is not an array"); - $this->assertArrayHasKey($key, $ruleset->ruleset[$sniffCode], "Directive $key not registered for sniff $sniffCode"); - $this->assertSame(0, $ruleset->ruleset[$sniffCode][$key], "$key has unexpected value for sniff $sniffCode"); - - $sniffCode = 'Generic.PHP.RequireStrictTypes.MissingDeclaration'; - $this->assertArrayHasKey($sniffCode, $ruleset->ruleset, "Sniff $sniffCode not registered"); - $this->assertTrue(is_array($ruleset->ruleset[$sniffCode]), "Sniff $sniffCode is not an array"); - $this->assertArrayHasKey($key, $ruleset->ruleset[$sniffCode], "Directive $key not registered for sniff $sniffCode"); - $this->assertSame(5, $ruleset->ruleset[$sniffCode][$key], "$key has unexpected value for sniff $sniffCode"); - - }//end testIncludeSingleErrorCode() - - - /** - * Verify that if all error codes, save one, from a sniff were previously excluded, an include for an additional - * error code from that same sniff will be respected. - * - * @return void - */ - public function testErrorCodeIncludeAfterExclude() - { - // Set up the ruleset. - $ruleset = $this->getMiscRuleset(); - - $key = 'severity'; - - $sniffCode = 'PEAR.Files.IncludingFile'; - $this->assertArrayHasKey($sniffCode, $ruleset->ruleset, "Sniff $sniffCode not registered"); - $this->assertTrue(is_array($ruleset->ruleset[$sniffCode]), "Sniff $sniffCode is not an array"); - $this->assertArrayHasKey($key, $ruleset->ruleset[$sniffCode], "Directive $key not registered for sniff $sniffCode"); - $this->assertSame(0, $ruleset->ruleset[$sniffCode][$key], "$key has unexpected value for sniff $sniffCode"); - - $sniffCode = 'PEAR.Files.IncludingFile.BracketsNotRequired'; - $this->assertArrayHasKey($sniffCode, $ruleset->ruleset, "Sniff $sniffCode not registered"); - $this->assertTrue(is_array($ruleset->ruleset[$sniffCode]), "Sniff $sniffCode is not an array"); - $this->assertArrayHasKey($key, $ruleset->ruleset[$sniffCode], "Directive $key not registered for sniff $sniffCode"); - $this->assertSame(5, $ruleset->ruleset[$sniffCode][$key], "$key has unexpected value for sniff $sniffCode"); - - $sniffCode = 'PEAR.Files.IncludingFile.UseRequire'; - $this->assertArrayHasKey($sniffCode, $ruleset->ruleset, "Sniff $sniffCode not registered"); - $this->assertTrue(is_array($ruleset->ruleset[$sniffCode]), "Sniff $sniffCode is not an array"); - $this->assertArrayHasKey($key, $ruleset->ruleset[$sniffCode], "Directive $key not registered for sniff $sniffCode"); - $this->assertSame(5, $ruleset->ruleset[$sniffCode][$key], "$key has unexpected value for sniff $sniffCode"); - - }//end testErrorCodeIncludeAfterExclude() - - - /** - * Verify that a element without a "ref" is completely ignored. - * - * @return void - */ - public function testRuleWithoutRefIsIgnored() - { - // Set up the ruleset. - $ruleset = $this->getMiscRuleset(); - - $sniffCode = 'Generic.Metrics.CyclomaticComplexity'; - $this->assertArrayNotHasKey($sniffCode, $ruleset->sniffCodes, "Sniff $sniffCode registered"); - $this->assertArrayNotHasKey($sniffCode, $ruleset->ruleset, "Sniff $sniffCode adjusted"); - - }//end testRuleWithoutRefIsIgnored() - - - /** - * Verify that no "ruleset adjustments" are registered via an `` without a "name". - * - * @return void - */ - public function testRuleExcludeWithoutNameIsIgnored() - { - // Set up the ruleset. - $ruleset = $this->getMiscRuleset(); - - $sniffCode = 'Generic.PHP.BacktickOperator'; - $this->assertArrayHasKey($sniffCode, $ruleset->sniffCodes, "Sniff $sniffCode not registered"); - $this->assertArrayNotHasKey($sniffCode, $ruleset->ruleset, "Sniff $sniffCode adjusted"); - - $sniffCode = 'Generic.PHP.BacktickOperator.Found'; - $this->assertArrayNotHasKey($sniffCode, $ruleset->ruleset, "Sniff $sniffCode adjusted"); - - }//end testRuleExcludeWithoutNameIsIgnored() - - - /** - * Test Helper. - * - * @return \PHP_CodeSniffer\Ruleset - */ - private function getMiscRuleset() - { - static $ruleset; - - if (isset($ruleset) === false) { - // Set up the ruleset. - $standard = __DIR__.'/ProcessRulesetMiscTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - $ruleset = new Ruleset($config); - } - - return $ruleset; - - }//end getMiscRuleset() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PropertyTypeHandlingInlineTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PropertyTypeHandlingInlineTest.xml deleted file mode 100644 index 8f276f8..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PropertyTypeHandlingInlineTest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PropertyTypeHandlingTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PropertyTypeHandlingTest.php deleted file mode 100644 index f43e2b3..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PropertyTypeHandlingTest.php +++ /dev/null @@ -1,335 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Ruleset; - -use PHP_CodeSniffer\Files\LocalFile; -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Tests\ConfigDouble; -use PHPUnit\Framework\TestCase; - -/** - * Test the handling of property value types for properties set via the ruleset and inline. - * - * @covers \PHP_CodeSniffer\Ruleset::processRule - * @covers \PHP_CodeSniffer\Ruleset::setSniffProperty - */ -final class PropertyTypeHandlingTest extends TestCase -{ - - /** - * Sniff code for the sniff used in these tests. - * - * @var string - */ - const SNIFF_CODE = 'TestStandard.SetProperty.PropertyTypeHandling'; - - /** - * Class name of the sniff used in these tests. - * - * @var string - */ - const SNIFF_CLASS = 'Fixtures\\TestStandard\\Sniffs\\SetProperty\\PropertyTypeHandlingSniff'; - - - /** - * Verify a deprecation notice is shown when an array property is set from the ruleset using a comma-separated string. - * - * Support for this format was (soft) deprecated in PHPCS 3.3.0. - * - * @return void - */ - public function testUsingOldSchoolArrayFormatShowsDeprecationNotice() - { - $regex = '`^('; - $regex .= 'DEPRECATED: Passing an array of values to a property using a comma-separated string\R'; - $regex .= 'was deprecated in PHP_CodeSniffer 3\.3\.0\. Support will be removed in PHPCS 4\.0\.0\.\R'; - $regex .= 'The deprecated syntax was used for property "expectsOldSchool(?:EmptyArray|ArrayWith(?:Extended|Only)?(?:KeysAnd)?Values)"\R'; - $regex .= 'for sniff "'; - $regex .= '(?:\./tests/Core/Ruleset/Fixtures/TestStandard/Sniffs/SetProperty/PropertyTypeHandlingSniff\.php|TestStandard\.SetProperty\.PropertyTypeHandling)'; - $regex .= '"\.\R'; - $regex .= 'Pass array values via nodes instead\.\R'; - $regex .= '){14}\R$`'; - - $this->expectOutputRegex($regex); - - // Set up the ruleset. - $standard = __DIR__.'/PropertyTypeHandlingTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - new Ruleset($config); - - }//end testUsingOldSchoolArrayFormatShowsDeprecationNotice() - - - /** - * Test the value type handling for properties set via a ruleset. - * - * @param string $propertyName Property name. - * @param mixed $expected Expected property value. - * - * @dataProvider dataTypeHandling - * @dataProvider dataArrayPropertyExtending - * - * @return void - */ - public function testTypeHandlingWhenSetViaRuleset($propertyName, $expected) - { - $sniffObject = $this->getSniffObjectForRuleset(); - - $this->assertSame($expected, $sniffObject->$propertyName); - - }//end testTypeHandlingWhenSetViaRuleset() - - - /** - * Test the value type handling for properties set inline in a test case file. - * - * @param string $propertyName Property name. - * @param mixed $expected Expected property value. - * - * @dataProvider dataTypeHandling - * - * @return void - */ - public function testTypeHandlingWhenSetInline($propertyName, $expected) - { - $sniffObject = $this->getSniffObjectAfterProcessingFile(); - - $this->assertSame($expected, $sniffObject->$propertyName); - - }//end testTypeHandlingWhenSetInline() - - - /** - * Data provider. - * - * @see self::testTypeHandlingWhenSetViaRuleset() - * @see self::testTypeHandlingWhenSetInline() - * - * @return array> - */ - public static function dataTypeHandling() - { - $expectedArrayOnlyValues = [ - 'string', - '10', - '1.5', - '', - 'null', - 'true', - 'false', - ]; - $expectedArrayKeysAndValues = [ - 'string' => 'string', - 10 => '10', - 'float' => '1.5', - 11 => '', - 'null' => 'null', - 'true' => 'true', - 'false' => 'false', - ]; - - return [ - 'String value (default)' => [ - 'propertyName' => 'expectsString', - 'expected' => 'arbitraryvalue', - ], - 'String value with whitespace gets trimmed' => [ - 'propertyName' => 'expectsTrimmedString', - 'expected' => 'some value', - ], - 'String with whitespace only value becomes null' => [ - 'propertyName' => 'emptyStringBecomesNull', - 'expected' => null, - ], - 'Integer value gets set as string' => [ - 'propertyName' => 'expectsIntButAcceptsString', - 'expected' => '12345', - ], - 'Float value gets set as string' => [ - 'propertyName' => 'expectsFloatButAcceptsString', - 'expected' => '12.345', - ], - 'Null value gets set as string' => [ - 'propertyName' => 'expectsNull', - 'expected' => 'null', - ], - 'Null (uppercase) value gets set as string' => [ - 'propertyName' => 'expectsNullCase', - 'expected' => 'NULL', - ], - 'True value gets set as boolean' => [ - 'propertyName' => 'expectsBooleanTrue', - 'expected' => true, - ], - 'True (mixed case) value gets set as string' => [ - 'propertyName' => 'expectsBooleanTrueCase', - 'expected' => 'True', - ], - 'True (with spaces) value gets set as boolean' => [ - 'propertyName' => 'expectsBooleanTrueTrimmed', - 'expected' => true, - ], - 'False value gets set as boolean' => [ - 'propertyName' => 'expectsBooleanFalse', - 'expected' => false, - ], - 'False (mixed case) value gets set as string' => [ - 'propertyName' => 'expectsBooleanFalseCase', - 'expected' => 'fALSe', - ], - 'False (with spaces) value gets set as boolean' => [ - 'propertyName' => 'expectsBooleanFalseTrimmed', - 'expected' => false, - ], - 'Array with only values (new style)' => [ - 'propertyName' => 'expectsArrayWithOnlyValues', - 'expected' => $expectedArrayOnlyValues, - ], - 'Array with keys and values (new style)' => [ - 'propertyName' => 'expectsArrayWithKeysAndValues', - 'expected' => $expectedArrayKeysAndValues, - ], - 'Empty array (new style)' => [ - 'propertyName' => 'expectsEmptyArray', - 'expected' => [], - ], - 'Array with only values (old style)' => [ - 'propertyName' => 'expectsOldSchoolArrayWithOnlyValues', - 'expected' => $expectedArrayOnlyValues, - ], - 'Array with keys and values (old style)' => [ - 'propertyName' => 'expectsOldSchoolArrayWithKeysAndValues', - 'expected' => $expectedArrayKeysAndValues, - ], - 'Empty array (old style)' => [ - 'propertyName' => 'expectsOldSchoolEmptyArray', - 'expected' => [], - ], - ]; - - }//end dataTypeHandling() - - - /** - * Data provider. - * - * Array property extending is a feature which is only supported from a ruleset, not for inline property setting. - * - * @see self::testTypeHandlingWhenSetViaRuleset() - * - * @return array> - */ - public static function dataArrayPropertyExtending() - { - $expectedArrayOnlyValuesExtended = [ - 'string', - '15', - 'another string', - ]; - $expectedArrayKeysAndValuesExtended = [ - 10 => '10', - 'string' => 'string', - 15 => '15', - 'another string' => 'another string', - ]; - - return [ - 'Array with only values extended (new style)' => [ - 'propertyName' => 'expectsArrayWithExtendedValues', - 'expected' => $expectedArrayOnlyValuesExtended, - ], - 'Array with keys and values extended (new style)' => [ - 'propertyName' => 'expectsArrayWithExtendedKeysAndValues', - 'expected' => $expectedArrayKeysAndValuesExtended, - ], - 'Array with only values extended (old style)' => [ - 'propertyName' => 'expectsOldSchoolArrayWithExtendedValues', - 'expected' => $expectedArrayOnlyValuesExtended, - ], - 'Array with keys and values extended (old style)' => [ - 'propertyName' => 'expectsOldSchoolArrayWithExtendedKeysAndValues', - 'expected' => $expectedArrayKeysAndValuesExtended, - ], - ]; - - }//end dataArrayPropertyExtending() - - - /** - * Test Helper. - * - * Note: the deprecations for using comma-separated string to pass an array, are silenced in this helper - * as that's not what's being tested here. - * - * @see self::testTypeHandlingWhenSetViaRuleset() - * - * @return \PHP_CodeSniffer\Sniffs\Sniff - */ - private function getSniffObjectForRuleset() - { - static $sniffObject; - - if (isset($sniffObject) === false) { - // Set up the ruleset. - $standard = __DIR__.'/PropertyTypeHandlingTest.xml'; - $config = new ConfigDouble(["--standard=$standard", '-q']); - $ruleset = new Ruleset($config); - - // Verify that our target sniff has been registered. - $this->assertArrayHasKey(self::SNIFF_CODE, $ruleset->sniffCodes, 'Target sniff not registered'); - $this->assertSame(self::SNIFF_CLASS, $ruleset->sniffCodes[self::SNIFF_CODE], 'Target sniff not registered with the correct class'); - $this->assertArrayHasKey(self::SNIFF_CLASS, $ruleset->sniffs, 'Sniff class not listed in registered sniffs'); - - $sniffObject = $ruleset->sniffs[self::SNIFF_CLASS]; - } - - return $sniffObject; - - }//end getSniffObjectForRuleset() - - - /** - * Test Helper - * - * @see self::testTypeHandlingWhenSetInline() - * - * @return \PHP_CodeSniffer\Sniffs\Sniff - */ - private function getSniffObjectAfterProcessingFile() - { - static $sniffObject; - - if (isset($sniffObject) === false) { - // Set up the ruleset. - $standard = __DIR__.'/PropertyTypeHandlingInlineTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - $ruleset = new Ruleset($config); - - // Verify that our target sniff has been registered. - $this->assertArrayHasKey(self::SNIFF_CODE, $ruleset->sniffCodes, 'Target sniff not registered'); - $this->assertSame(self::SNIFF_CLASS, $ruleset->sniffCodes[self::SNIFF_CODE], 'Target sniff not registered with the correct class'); - $this->assertArrayHasKey(self::SNIFF_CLASS, $ruleset->sniffs, 'Sniff class not listed in registered sniffs'); - - $sniffObject = $ruleset->sniffs[self::SNIFF_CLASS]; - - // Process the file with inline phpcs:set annotations. - $testFile = realpath(__DIR__.'/Fixtures/PropertyTypeHandlingInline.inc'); - $this->assertNotFalse($testFile); - - $phpcsFile = new LocalFile($testFile, $ruleset, $config); - $phpcsFile->process(); - } - - return $sniffObject; - - }//end getSniffObjectAfterProcessingFile() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PropertyTypeHandlingTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PropertyTypeHandlingTest.xml deleted file mode 100644 index eaca667..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/PropertyTypeHandlingTest.xml +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RegisterSniffsMissingInterfaceInvalidTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RegisterSniffsMissingInterfaceInvalidTest.xml deleted file mode 100644 index d3886c4..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RegisterSniffsMissingInterfaceInvalidTest.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RegisterSniffsMissingInterfaceTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RegisterSniffsMissingInterfaceTest.php deleted file mode 100644 index a396196..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RegisterSniffsMissingInterfaceTest.php +++ /dev/null @@ -1,65 +0,0 @@ - - * @copyright 2025 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Ruleset; - -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Tests\ConfigDouble; -use PHPUnit\Framework\TestCase; - -/** - * Tests deprecation of support for sniffs not implementing the PHPCS `Sniff` interface. - * - * @covers \PHP_CodeSniffer\Ruleset::registerSniffs - */ -final class RegisterSniffsMissingInterfaceTest extends TestCase -{ - - - /** - * Test that no deprecation is shown when sniffs implement the `PHP_CodeSniffer\Sniffs\Sniff` interface. - * - * @return void - */ - public function testNoNoticesForSniffsImplementingInterface() - { - // Set up the ruleset. - $standard = __DIR__.'/RegisterSniffsMissingInterfaceValidTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - - $this->expectOutputString(''); - - new Ruleset($config); - - }//end testNoNoticesForSniffsImplementingInterface() - - - /** - * Test that a deprecation notice is shown if a sniff doesn't implement the Sniff interface. - * - * @return void - */ - public function testDeprecationNoticeWhenSniffDoesntImplementInterface() - { - // Set up the ruleset. - $standard = __DIR__.'/RegisterSniffsMissingInterfaceInvalidTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - - $expected = 'DEPRECATED: All sniffs must implement the PHP_CodeSniffer\\Sniffs\\Sniff interface.'.PHP_EOL; - $expected .= 'Interface not implemented for sniff Fixtures\\TestStandard\\Sniffs\\MissingInterface\\InvalidImplementsWithoutImplementSniff.'.PHP_EOL; - $expected .= 'Contact the sniff author to fix the sniff.'.PHP_EOL.PHP_EOL; - - $this->expectOutputString($expected); - - new Ruleset($config); - - }//end testDeprecationNoticeWhenSniffDoesntImplementInterface() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RegisterSniffsMissingInterfaceValidTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RegisterSniffsMissingInterfaceValidTest.xml deleted file mode 100644 index ed5220c..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RegisterSniffsMissingInterfaceValidTest.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RegisterSniffsRejectsInvalidSniffNoImplementsNoProcessTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RegisterSniffsRejectsInvalidSniffNoImplementsNoProcessTest.xml deleted file mode 100644 index 9f4c78d..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RegisterSniffsRejectsInvalidSniffNoImplementsNoProcessTest.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RegisterSniffsRejectsInvalidSniffNoImplementsNoRegisterOrProcessTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RegisterSniffsRejectsInvalidSniffNoImplementsNoRegisterOrProcessTest.xml deleted file mode 100644 index c6f4d75..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RegisterSniffsRejectsInvalidSniffNoImplementsNoRegisterOrProcessTest.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RegisterSniffsRejectsInvalidSniffNoImplementsNoRegisterTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RegisterSniffsRejectsInvalidSniffNoImplementsNoRegisterTest.xml deleted file mode 100644 index 1077bef..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RegisterSniffsRejectsInvalidSniffNoImplementsNoRegisterTest.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RegisterSniffsRejectsInvalidSniffTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RegisterSniffsRejectsInvalidSniffTest.php deleted file mode 100644 index 9207cee..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RegisterSniffsRejectsInvalidSniffTest.php +++ /dev/null @@ -1,80 +0,0 @@ - - * @copyright 2025 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Ruleset; - -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Tests\ConfigDouble; -use PHP_CodeSniffer\Tests\Core\Ruleset\AbstractRulesetTestCase; - -/** - * Tests that invalid sniffs will be rejected with an informative error message. - * - * @covers \PHP_CodeSniffer\Ruleset::registerSniffs - */ -final class RegisterSniffsRejectsInvalidSniffTest extends AbstractRulesetTestCase -{ - - - /** - * Verify that an error is thrown if an invalid sniff class is loaded. - * - * @param string $standard The standard to use for the test. - * @param string $methodName The name of the missing method. - * - * @dataProvider dataExceptionIsThrownOnMissingInterfaceMethod - * - * @return void - */ - public function testExceptionIsThrownOnMissingInterfaceMethod($standard, $methodName) - { - // Set up the ruleset. - $standard = __DIR__.'/'.$standard; - $config = new ConfigDouble(["--standard=$standard"]); - - $regex = "`(^|\R)ERROR: Sniff class \S+Sniff is missing required method $methodName\(\)\.\R`"; - $this->expectRuntimeExceptionRegex($regex); - - new Ruleset($config); - - }//end testExceptionIsThrownOnMissingInterfaceMethod() - - - /** - * Data provider. - * - * @see testExceptionIsThrownOnMissingInterfaceMethod() - * - * @return array> - */ - public static function dataExceptionIsThrownOnMissingInterfaceMethod() - { - return [ - 'Missing register() method' => [ - 'standard' => 'RegisterSniffsRejectsInvalidSniffNoImplementsNoRegisterTest.xml', - 'methodName' => 'register', - ], - 'Missing process() method' => [ - 'standard' => 'RegisterSniffsRejectsInvalidSniffNoImplementsNoProcessTest.xml', - 'methodName' => 'process', - ], - 'Missing both, checking register() method' => [ - 'standard' => 'RegisterSniffsRejectsInvalidSniffNoImplementsNoRegisterOrProcessTest.xml', - 'methodName' => 'register', - ], - 'Missing both, checking process() method' => [ - 'standard' => 'RegisterSniffsRejectsInvalidSniffNoImplementsNoRegisterOrProcessTest.xml', - 'methodName' => 'process', - ], - ]; - - }//end dataExceptionIsThrownOnMissingInterfaceMethod() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RegisterSniffsTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RegisterSniffsTest.php deleted file mode 100644 index 7b05424..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RegisterSniffsTest.php +++ /dev/null @@ -1,293 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Ruleset; - -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Tests\ConfigDouble; -use PHPUnit\Framework\TestCase; - -/** - * Test the Ruleset::registerSniffs() method. - * - * @covers \PHP_CodeSniffer\Ruleset::registerSniffs - */ -final class RegisterSniffsTest extends TestCase -{ - - /** - * The Ruleset object. - * - * @var \PHP_CodeSniffer\Ruleset - */ - private static $ruleset; - - /** - * Original value of the $sniffs property on the Ruleset. - * - * @var array - */ - private static $originalSniffs = []; - - /** - * List of Standards dir relative sniff files loaded for the PSR1 standard. - * - * @var array - */ - private static $psr1SniffFiles = [ - 'Generic/Sniffs/Files/ByteOrderMarkSniff.php', - 'Generic/Sniffs/NamingConventions/UpperCaseConstantNameSniff.php', - 'Generic/Sniffs/PHP/DisallowAlternativePHPTagsSniff.php', - 'Generic/Sniffs/PHP/DisallowShortOpenTagSniff.php', - 'PSR1/Sniffs/Classes/ClassDeclarationSniff.php', - 'PSR1/Sniffs/Files/SideEffectsSniff.php', - 'PSR1/Sniffs/Methods/CamelCapsMethodNameSniff.php', - 'Squiz/Sniffs/Classes/ValidClassNameSniff.php', - ]; - - /** - * Absolute paths to the sniff files loaded for the PSR1 standard. - * - * @var array - */ - private static $psr1SniffAbsolutePaths = []; - - - /** - * Initialize the config and ruleset objects which will be used for some of these tests. - * - * @beforeClass - * - * @return void - */ - public static function initializeConfigAndRuleset() - { - // Set up the ruleset. - $config = new ConfigDouble(['--standard=PSR1']); - self::$ruleset = new Ruleset($config); - - // Remember the original value of the Ruleset::$sniff property as the tests adjust it. - self::$originalSniffs = self::$ruleset->sniffs; - - // Sort the value to make the tests stable as different OSes will read directories - // in a different order and the order is not relevant for these tests. Just the values. - ksort(self::$originalSniffs); - - // Update the sniff file list. - $standardsDir = dirname(dirname(dirname(__DIR__))).DIRECTORY_SEPARATOR; - $standardsDir .= 'src'.DIRECTORY_SEPARATOR.'Standards'.DIRECTORY_SEPARATOR; - - self::$psr1SniffAbsolutePaths = self::relativeToAbsoluteSniffFiles($standardsDir, self::$psr1SniffFiles); - - }//end initializeConfigAndRuleset() - - - /** - * Convert relative paths to absolute paths and ensure the paths use the correct OS-specific directory separator. - * - * @param string $baseDir Directory to which these paths are relative to. Including trailing slash. - * @param array $relativePaths Relative paths. - * - * @return array - */ - public static function relativeToAbsoluteSniffFiles($baseDir, $relativePaths) - { - $fileList = []; - foreach ($relativePaths as $sniffName) { - $sniffFile = str_replace('/', DIRECTORY_SEPARATOR, $sniffName); - $sniffFile = $baseDir.$sniffFile; - $fileList[] = $sniffFile; - } - - return $fileList; - - }//end relativeToAbsoluteSniffFiles() - - - /** - * Clear out the Ruleset::$sniffs property. - * - * @before - * - * @return void - */ - protected function clearOutSniffs() - { - // Clear out the Ruleset::$sniffs property. - self::$ruleset->sniffs = []; - - }//end clearOutSniffs() - - - /** - * Test that registering sniffs works as expected (simple base test case). - * - * @return void - */ - public function testRegisteredSniffsShouldBeTheSame() - { - self::$ruleset->registerSniffs(self::$psr1SniffAbsolutePaths, [], []); - - // Make sure the same sniff list was recreated (but without the objects having been created yet). - $this->assertSame(array_keys(self::$originalSniffs), array_keys(self::$ruleset->sniffs)); - $this->assertSame(array_keys(self::$originalSniffs), array_values(self::$ruleset->sniffs)); - - }//end testRegisteredSniffsShouldBeTheSame() - - - /** - * Test that if only specific sniffs are requested, only those are registered. - * - * {@internal Can't test this via the CLI arguments due to some code in the Ruleset class - * related to sniff tests.} - * - * @return void - */ - public function testRegisteredSniffsWithRestrictions() - { - $restrictions = [ - 'psr1\\sniffs\\classes\\classdeclarationsniff' => true, - 'psr1\\sniffs\\files\\sideeffectssniff' => true, - 'psr1\\sniffs\\methods\\camelcapsmethodnamesniff' => true, - ]; - - $expected = [ - 'PHP_CodeSniffer\\Standards\\PSR1\\Sniffs\\Classes\\ClassDeclarationSniff', - 'PHP_CodeSniffer\\Standards\\PSR1\\Sniffs\\Files\\SideEffectsSniff', - 'PHP_CodeSniffer\\Standards\\PSR1\\Sniffs\\Methods\\CamelCapsMethodNameSniff', - ]; - - self::$ruleset->registerSniffs(self::$psr1SniffAbsolutePaths, $restrictions, []); - - $this->assertSame($expected, array_keys(self::$ruleset->sniffs)); - - }//end testRegisteredSniffsWithRestrictions() - - - /** - * Test that sniffs excluded via the CLI are not registered. - * - * @return void - */ - public function testRegisteredSniffsWithExclusions() - { - // Set up the ruleset. - $args = [ - '--standard=PSR1', - '--exclude=PSR1.Classes.ClassDeclaration,PSR1.Files.SideEffects,PSR1.Methods.CamelCapsMethodName', - ]; - $config = new ConfigDouble($args); - $ruleset = new Ruleset($config); - - $expected = [ - 'PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Files\\ByteOrderMarkSniff', - 'PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\NamingConventions\\UpperCaseConstantNameSniff', - 'PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\PHP\\DisallowAlternativePHPTagsSniff', - 'PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\PHP\\DisallowShortOpenTagSniff', - 'PHP_CodeSniffer\\Standards\\Squiz\\Sniffs\\Classes\\ValidClassNameSniff', - ]; - - $actual = array_keys($ruleset->sniffs); - sort($actual); - - $this->assertSame($expected, $actual); - - }//end testRegisteredSniffsWithExclusions() - - - /** - * Test combining requesting specific sniffs and excluding a subset of those. - * - * @return void - */ - public function testRegisteredSniffsBothRestrictionsAndExclusions() - { - $restrictions = [ - 'generic\\sniffs\\namingconventions\\uppercaseconstantnamesniff' => true, - 'generic\\sniffs\\php\\disallowalternativephptagssniff' => true, - 'generic\\sniffs\\php\\disallowshortopentagsniff' => true, - 'psr1\\sniffs\\classes\\classdeclarationsniff' => true, - 'squiz\\sniffs\\classes\\validclassnamesniff' => true, - ]; - - $exclusions = [ - 'squiz\\sniffs\\classes\\validclassnamesniff' => true, - 'generic\\sniffs\\php\\disallowalternativephptagssniff' => true, - 'generic\\sniffs\\namingconventions\\uppercaseconstantnamesniff' => true, - ]; - - $expected = [ - 'PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\PHP\\DisallowShortOpenTagSniff', - 'PHP_CodeSniffer\\Standards\\PSR1\\Sniffs\\Classes\\ClassDeclarationSniff', - ]; - - self::$ruleset->registerSniffs(self::$psr1SniffAbsolutePaths, $restrictions, $exclusions); - - $this->assertSame($expected, array_keys(self::$ruleset->sniffs)); - - }//end testRegisteredSniffsBothRestrictionsAndExclusions() - - - /** - * Verify that abstract sniffs are filtered out and not registered. - * - * @return void - */ - public function testRegisterSniffsFiltersOutAbstractClasses() - { - $extraPathsBaseDir = __DIR__.DIRECTORY_SEPARATOR.'Fixtures'.DIRECTORY_SEPARATOR; - $extraPaths = [ - 'DirectoryExpansion/.hiddenAbove/src/MyStandard/Sniffs/AbstractSniff.php', - 'DirectoryExpansion/.hiddenAbove/src/MyStandard/Sniffs/CategoryB/AnotherAbstractSniff.php', - ]; - $extraPaths = self::relativeToAbsoluteSniffFiles($extraPathsBaseDir, $extraPaths); - - $fileList = self::$psr1SniffAbsolutePaths; - foreach ($extraPaths as $path) { - $fileList[] = $path; - } - - self::$ruleset->registerSniffs($fileList, [], []); - - // Make sure the same sniff list was recreated (but without the objects having been created yet). - $this->assertSame(array_keys(self::$originalSniffs), array_keys(self::$ruleset->sniffs)); - $this->assertSame(array_keys(self::$originalSniffs), array_values(self::$ruleset->sniffs)); - - }//end testRegisterSniffsFiltersOutAbstractClasses() - - - /** - * Test that sniff files not in a "/Sniffs/" directory are filtered out and not registered. - * - * @return void - */ - public function testRegisteredSniffsFiltersOutFilePathsWithoutSniffsDir() - { - $extraPathsBaseDir = __DIR__.DIRECTORY_SEPARATOR.'Fixtures'.DIRECTORY_SEPARATOR; - $extraPaths = [ - 'DirectoryExpansion/.hiddenAbove/src/MyStandard/Utils/NotInSniffsDirSniff.php', - 'DirectoryExpansion/.hiddenAbove/src/MyStandard/Utils/SubDir/NotInSniffsDirSniff.php', - ]; - $extraPaths = self::relativeToAbsoluteSniffFiles($extraPathsBaseDir, $extraPaths); - - $fileList = self::$psr1SniffAbsolutePaths; - foreach ($extraPaths as $path) { - $fileList[] = $path; - } - - self::$ruleset->registerSniffs($fileList, [], []); - - // Make sure the same sniff list was recreated (but without the objects having been created yet). - $this->assertSame(array_keys(self::$originalSniffs), array_keys(self::$ruleset->sniffs)); - $this->assertSame(array_keys(self::$originalSniffs), array_values(self::$ruleset->sniffs)); - - }//end testRegisteredSniffsFiltersOutFilePathsWithoutSniffsDir() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionAbsoluteLinuxTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionAbsoluteLinuxTest.php deleted file mode 100644 index be6dab9..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionAbsoluteLinuxTest.php +++ /dev/null @@ -1,119 +0,0 @@ - - * @copyright 2019 Juliette Reinders Folmer. All rights reserved. - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Ruleset; - -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Tests\ConfigDouble; -use PHPUnit\Framework\TestCase; - -/** - * Tests for the \PHP_CodeSniffer\Ruleset class using a Linux-style absolute path to include a sniff. - * - * @covers \PHP_CodeSniffer\Ruleset - */ -final class RuleInclusionAbsoluteLinuxTest extends TestCase -{ - - /** - * The Ruleset object. - * - * @var \PHP_CodeSniffer\Ruleset - */ - protected $ruleset; - - /** - * Path to the ruleset file. - * - * @var string - */ - private $standard = ''; - - /** - * The original content of the ruleset. - * - * @var string - */ - private $contents = ''; - - - /** - * Initialize the config and ruleset objects. - * - * @before - * - * @return void - */ - protected function initializeConfigAndRuleset() - { - $this->standard = __DIR__.'/'.basename(__FILE__, '.php').'.xml'; - $repoRootDir = dirname(dirname(dirname(__DIR__))); - - // On-the-fly adjust the ruleset test file to be able to test sniffs included with absolute paths. - $contents = file_get_contents($this->standard); - $this->contents = $contents; - - $newPath = $repoRootDir; - if (DIRECTORY_SEPARATOR === '\\') { - $newPath = str_replace('\\', '/', $repoRootDir); - } - - $adjusted = str_replace('%path_slash_forward%', $newPath, $contents); - - if (file_put_contents($this->standard, $adjusted) === false) { - $this->markTestSkipped('On the fly ruleset adjustment failed'); - } - - // Initialize the config and ruleset objects for the test. - $config = new ConfigDouble(["--standard={$this->standard}"]); - $this->ruleset = new Ruleset($config); - - }//end initializeConfigAndRuleset() - - - /** - * Reset ruleset file. - * - * @after - * - * @return void - */ - protected function resetRuleset() - { - file_put_contents($this->standard, $this->contents); - - }//end resetRuleset() - - - /** - * Test that sniffs registed with a Linux absolute path are correctly recognized and that - * properties are correctly set for them. - * - * @return void - */ - public function testLinuxStylePathRuleInclusion() - { - // Test that the sniff is correctly registered. - $this->assertCount(1, $this->ruleset->sniffCodes); - $this->assertArrayHasKey('Generic.Formatting.SpaceAfterNot', $this->ruleset->sniffCodes); - $this->assertSame( - 'PHP_CodeSniffer\Standards\Generic\Sniffs\Formatting\SpaceAfterNotSniff', - $this->ruleset->sniffCodes['Generic.Formatting.SpaceAfterNot'] - ); - - // Test that the sniff properties are correctly set. - $this->assertSame( - '10', - $this->ruleset->sniffs['PHP_CodeSniffer\Standards\Generic\Sniffs\Formatting\SpaceAfterNotSniff']->spacing - ); - - }//end testLinuxStylePathRuleInclusion() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionAbsoluteLinuxTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionAbsoluteLinuxTest.xml deleted file mode 100644 index d2cb7c3..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionAbsoluteLinuxTest.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionAbsoluteWindowsTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionAbsoluteWindowsTest.php deleted file mode 100644 index 956f0f7..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionAbsoluteWindowsTest.php +++ /dev/null @@ -1,116 +0,0 @@ - - * @copyright 2019 Juliette Reinders Folmer. All rights reserved. - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Ruleset; - -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Tests\ConfigDouble; -use PHPUnit\Framework\TestCase; - -/** - * Tests for the \PHP_CodeSniffer\Ruleset class using a Windows-style absolute path to include a sniff. - * - * @covers \PHP_CodeSniffer\Ruleset - * @requires OS ^WIN.*. - * @group Windows - */ -final class RuleInclusionAbsoluteWindowsTest extends TestCase -{ - - /** - * The Ruleset object. - * - * @var \PHP_CodeSniffer\Ruleset - */ - protected $ruleset; - - /** - * Path to the ruleset file. - * - * @var string - */ - private $standard = ''; - - /** - * The original content of the ruleset. - * - * @var string - */ - private $contents = ''; - - - /** - * Initialize the config and ruleset objects. - * - * @before - * - * @return void - */ - protected function initializeConfigAndRuleset() - { - $this->standard = __DIR__.'/'.basename(__FILE__, '.php').'.xml'; - $repoRootDir = dirname(dirname(dirname(__DIR__))); - - // On-the-fly adjust the ruleset test file to be able to test sniffs included with absolute paths. - $contents = file_get_contents($this->standard); - $this->contents = $contents; - - $adjusted = str_replace('%path_slash_back%', $repoRootDir, $contents); - - if (file_put_contents($this->standard, $adjusted) === false) { - $this->markTestSkipped('On the fly ruleset adjustment failed'); - } - - // Initialize the config and ruleset objects for the test. - $config = new ConfigDouble(["--standard={$this->standard}"]); - $this->ruleset = new Ruleset($config); - - }//end initializeConfigAndRuleset() - - - /** - * Reset ruleset file. - * - * @after - * - * @return void - */ - protected function resetRuleset() - { - file_put_contents($this->standard, $this->contents); - - }//end resetRuleset() - - - /** - * Test that sniffs registed with a Windows absolute path are correctly recognized and that - * properties are correctly set for them. - * - * @return void - */ - public function testWindowsStylePathRuleInclusion() - { - // Test that the sniff is correctly registered. - $this->assertCount(1, $this->ruleset->sniffCodes); - $this->assertArrayHasKey('Generic.Formatting.SpaceAfterCast', $this->ruleset->sniffCodes); - $this->assertSame( - 'PHP_CodeSniffer\Standards\Generic\Sniffs\Formatting\SpaceAfterCastSniff', - $this->ruleset->sniffCodes['Generic.Formatting.SpaceAfterCast'] - ); - - // Test that the sniff property is correctly set. - $this->assertSame( - '10', - $this->ruleset->sniffs['PHP_CodeSniffer\Standards\Generic\Sniffs\Formatting\SpaceAfterCastSniff']->spacing - ); - - }//end testWindowsStylePathRuleInclusion() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionAbsoluteWindowsTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionAbsoluteWindowsTest.xml deleted file mode 100644 index 8f22b14..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionAbsoluteWindowsTest.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionTest-include.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionTest-include.xml deleted file mode 100644 index e13f4b7..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionTest-include.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionTest.php deleted file mode 100644 index 7520c89..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionTest.php +++ /dev/null @@ -1,479 +0,0 @@ - - * @copyright 2019 Juliette Reinders Folmer. All rights reserved. - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Ruleset; - -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Tests\ConfigDouble; -use PHP_CodeSniffer\Tests\Core\Ruleset\AbstractRulesetTestCase; - -/** - * Tests for the \PHP_CodeSniffer\Ruleset class. - * - * @covers \PHP_CodeSniffer\Ruleset - */ -final class RuleInclusionTest extends AbstractRulesetTestCase -{ - - /** - * The Ruleset object. - * - * @var \PHP_CodeSniffer\Ruleset - */ - protected static $ruleset; - - /** - * Path to the ruleset file. - * - * @var string - */ - private static $standard = ''; - - /** - * The original content of the ruleset. - * - * @var string - */ - private static $contents = ''; - - - /** - * Initialize the config and ruleset objects based on the `RuleInclusionTest.xml` ruleset file. - * - * @before - * - * @return void - */ - protected function initializeConfigAndRuleset() - { - if (self::$standard === '') { - $standard = __DIR__.'/'.basename(__FILE__, '.php').'.xml'; - self::$standard = $standard; - - // On-the-fly adjust the ruleset test file to be able to test - // sniffs included with relative paths. - $contents = file_get_contents($standard); - self::$contents = $contents; - - $repoRootDir = basename(dirname(dirname(dirname(__DIR__)))); - - $newPath = $repoRootDir; - if (DIRECTORY_SEPARATOR === '\\') { - $newPath = str_replace('\\', '/', $repoRootDir); - } - - $adjusted = str_replace('%path_root_dir%', $newPath, $contents); - - if (file_put_contents($standard, $adjusted) === false) { - self::markTestSkipped('On the fly ruleset adjustment failed'); - } - - $config = new ConfigDouble(["--standard=$standard"]); - self::$ruleset = new Ruleset($config); - }//end if - - }//end initializeConfigAndRuleset() - - - /** - * Reset ruleset file. - * - * @after - * - * @return void - */ - public function resetRuleset() - { - file_put_contents(self::$standard, self::$contents); - - }//end resetRuleset() - - - /** - * Test that sniffs are registered. - * - * @return void - */ - public function testHasSniffCodes() - { - $this->assertCount(49, self::$ruleset->sniffCodes); - - }//end testHasSniffCodes() - - - /** - * Test that sniffs are correctly registered, independently of the syntax used to include the sniff. - * - * @param string $key Expected array key. - * @param string $value Expected array value. - * - * @dataProvider dataRegisteredSniffCodes - * - * @return void - */ - public function testRegisteredSniffCodes($key, $value) - { - $this->assertArrayHasKey($key, self::$ruleset->sniffCodes); - $this->assertSame($value, self::$ruleset->sniffCodes[$key]); - - }//end testRegisteredSniffCodes() - - - /** - * Data provider. - * - * @see self::testRegisteredSniffCodes() - * - * @return array> - */ - public static function dataRegisteredSniffCodes() - { - return [ - [ - 'PSR2.Classes.ClassDeclaration', - 'PHP_CodeSniffer\Standards\PSR2\Sniffs\Classes\ClassDeclarationSniff', - ], - [ - 'PSR2.Classes.PropertyDeclaration', - 'PHP_CodeSniffer\Standards\PSR2\Sniffs\Classes\PropertyDeclarationSniff', - ], - [ - 'PSR2.ControlStructures.ControlStructureSpacing', - 'PHP_CodeSniffer\Standards\PSR2\Sniffs\ControlStructures\ControlStructureSpacingSniff', - ], - [ - 'PSR2.ControlStructures.ElseIfDeclaration', - 'PHP_CodeSniffer\Standards\PSR2\Sniffs\ControlStructures\ElseIfDeclarationSniff', - ], - [ - 'PSR2.ControlStructures.SwitchDeclaration', - 'PHP_CodeSniffer\Standards\PSR2\Sniffs\ControlStructures\SwitchDeclarationSniff', - ], - [ - 'PSR2.Files.ClosingTag', - 'PHP_CodeSniffer\Standards\PSR2\Sniffs\Files\ClosingTagSniff', - ], - [ - 'PSR2.Files.EndFileNewline', - 'PHP_CodeSniffer\Standards\PSR2\Sniffs\Files\EndFileNewlineSniff', - ], - [ - 'PSR2.Methods.FunctionCallSignature', - 'PHP_CodeSniffer\Standards\PSR2\Sniffs\Methods\FunctionCallSignatureSniff', - ], - [ - 'PSR2.Methods.FunctionClosingBrace', - 'PHP_CodeSniffer\Standards\PSR2\Sniffs\Methods\FunctionClosingBraceSniff', - ], - [ - 'PSR2.Methods.MethodDeclaration', - 'PHP_CodeSniffer\Standards\PSR2\Sniffs\Methods\MethodDeclarationSniff', - ], - [ - 'PSR2.Namespaces.NamespaceDeclaration', - 'PHP_CodeSniffer\Standards\PSR2\Sniffs\Namespaces\NamespaceDeclarationSniff', - ], - [ - 'PSR2.Namespaces.UseDeclaration', - 'PHP_CodeSniffer\Standards\PSR2\Sniffs\Namespaces\UseDeclarationSniff', - ], - [ - 'PSR1.Classes.ClassDeclaration', - 'PHP_CodeSniffer\Standards\PSR1\Sniffs\Classes\ClassDeclarationSniff', - ], - [ - 'PSR1.Files.SideEffects', - 'PHP_CodeSniffer\Standards\PSR1\Sniffs\Files\SideEffectsSniff', - ], - [ - 'PSR1.Methods.CamelCapsMethodName', - 'PHP_CodeSniffer\Standards\PSR1\Sniffs\Methods\CamelCapsMethodNameSniff', - ], - [ - 'Generic.PHP.DisallowAlternativePHPTags', - 'PHP_CodeSniffer\Standards\Generic\Sniffs\PHP\DisallowAlternativePHPTagsSniff', - ], - [ - 'Generic.PHP.DisallowShortOpenTag', - 'PHP_CodeSniffer\Standards\Generic\Sniffs\PHP\DisallowShortOpenTagSniff', - ], - [ - 'Generic.Files.ByteOrderMark', - 'PHP_CodeSniffer\Standards\Generic\Sniffs\Files\ByteOrderMarkSniff', - ], - [ - 'Squiz.Classes.ValidClassName', - 'PHP_CodeSniffer\Standards\Squiz\Sniffs\Classes\ValidClassNameSniff', - ], - [ - 'Generic.NamingConventions.UpperCaseConstantName', - 'PHP_CodeSniffer\Standards\Generic\Sniffs\NamingConventions\UpperCaseConstantNameSniff', - ], - [ - 'Generic.Files.LineEndings', - 'PHP_CodeSniffer\Standards\Generic\Sniffs\Files\LineEndingsSniff', - ], - [ - 'Generic.Files.LineLength', - 'PHP_CodeSniffer\Standards\Generic\Sniffs\Files\LineLengthSniff', - ], - [ - 'Squiz.WhiteSpace.SuperfluousWhitespace', - 'PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace\SuperfluousWhitespaceSniff', - ], - [ - 'Generic.Formatting.DisallowMultipleStatements', - 'PHP_CodeSniffer\Standards\Generic\Sniffs\Formatting\DisallowMultipleStatementsSniff', - ], - [ - 'Generic.WhiteSpace.ScopeIndent', - 'PHP_CodeSniffer\Standards\Generic\Sniffs\WhiteSpace\ScopeIndentSniff', - ], - [ - 'Generic.WhiteSpace.DisallowTabIndent', - 'PHP_CodeSniffer\Standards\Generic\Sniffs\WhiteSpace\DisallowTabIndentSniff', - ], - [ - 'Generic.PHP.LowerCaseKeyword', - 'PHP_CodeSniffer\Standards\Generic\Sniffs\PHP\LowerCaseKeywordSniff', - ], - [ - 'Generic.PHP.LowerCaseConstant', - 'PHP_CodeSniffer\Standards\Generic\Sniffs\PHP\LowerCaseConstantSniff', - ], - [ - 'Squiz.Scope.MethodScope', - 'PHP_CodeSniffer\Standards\Squiz\Sniffs\Scope\MethodScopeSniff', - ], - [ - 'Squiz.WhiteSpace.ScopeKeywordSpacing', - 'PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace\ScopeKeywordSpacingSniff', - ], - [ - 'Squiz.Functions.FunctionDeclaration', - 'PHP_CodeSniffer\Standards\Squiz\Sniffs\Functions\FunctionDeclarationSniff', - ], - [ - 'Squiz.Functions.LowercaseFunctionKeywords', - 'PHP_CodeSniffer\Standards\Squiz\Sniffs\Functions\LowercaseFunctionKeywordsSniff', - ], - [ - 'Squiz.Functions.FunctionDeclarationArgumentSpacing', - 'PHP_CodeSniffer\Standards\Squiz\Sniffs\Functions\FunctionDeclarationArgumentSpacingSniff', - ], - [ - 'PEAR.Functions.ValidDefaultValue', - 'PHP_CodeSniffer\Standards\PEAR\Sniffs\Functions\ValidDefaultValueSniff', - ], - [ - 'Squiz.Functions.MultiLineFunctionDeclaration', - 'PHP_CodeSniffer\Standards\Squiz\Sniffs\Functions\MultiLineFunctionDeclarationSniff', - ], - [ - 'Generic.Functions.FunctionCallArgumentSpacing', - 'PHP_CodeSniffer\Standards\Generic\Sniffs\Functions\FunctionCallArgumentSpacingSniff', - ], - [ - 'Squiz.ControlStructures.ControlSignature', - 'PHP_CodeSniffer\Standards\Squiz\Sniffs\ControlStructures\ControlSignatureSniff', - ], - [ - 'Squiz.WhiteSpace.ControlStructureSpacing', - 'PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace\ControlStructureSpacingSniff', - ], - [ - 'Squiz.WhiteSpace.ScopeClosingBrace', - 'PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace\ScopeClosingBraceSniff', - ], - [ - 'Squiz.ControlStructures.ForEachLoopDeclaration', - 'PHP_CodeSniffer\Standards\Squiz\Sniffs\ControlStructures\ForEachLoopDeclarationSniff', - ], - [ - 'Squiz.ControlStructures.ForLoopDeclaration', - 'PHP_CodeSniffer\Standards\Squiz\Sniffs\ControlStructures\ForLoopDeclarationSniff', - ], - [ - 'Squiz.ControlStructures.LowercaseDeclaration', - 'PHP_CodeSniffer\Standards\Squiz\Sniffs\ControlStructures\LowercaseDeclarationSniff', - ], - [ - 'Generic.ControlStructures.InlineControlStructure', - 'PHP_CodeSniffer\Standards\Generic\Sniffs\ControlStructures\InlineControlStructureSniff', - ], - [ - 'PSR12.Operators.OperatorSpacing', - 'PHP_CodeSniffer\Standards\PSR12\Sniffs\Operators\OperatorSpacingSniff', - ], - [ - 'Generic.Arrays.ArrayIndent', - 'PHP_CodeSniffer\Standards\Generic\Sniffs\Arrays\ArrayIndentSniff', - ], - [ - 'Generic.Metrics.CyclomaticComplexity', - 'PHP_CodeSniffer\Standards\Generic\Sniffs\Metrics\CyclomaticComplexitySniff', - ], - [ - 'Squiz.Files.FileExtension', - 'PHP_CodeSniffer\Standards\Squiz\Sniffs\Files\FileExtensionSniff', - ], - [ - 'Generic.NamingConventions.CamelCapsFunctionName', - 'PHP_CodeSniffer\Standards\Generic\Sniffs\NamingConventions\CamelCapsFunctionNameSniff', - ], - [ - 'Generic.Metrics.NestingLevel', - 'PHP_CodeSniffer\Standards\Generic\Sniffs\Metrics\NestingLevelSniff', - ], - ]; - - }//end dataRegisteredSniffCodes() - - - /** - * Test that setting properties for standards, categories, sniffs works for all supported rule - * inclusion methods. - * - * @param string $sniffClass The name of the sniff class. - * @param string $propertyName The name of the changed property. - * @param string|int|bool $expectedValue The value expected for the property. - * - * @dataProvider dataSettingProperties - * - * @return void - */ - public function testSettingProperties($sniffClass, $propertyName, $expectedValue) - { - $this->assertArrayHasKey($sniffClass, self::$ruleset->sniffs); - $this->assertXObjectHasProperty($propertyName, self::$ruleset->sniffs[$sniffClass]); - - $actualValue = self::$ruleset->sniffs[$sniffClass]->$propertyName; - $this->assertSame($expectedValue, $actualValue); - - }//end testSettingProperties() - - - /** - * Data provider. - * - * @see self::testSettingProperties() - * - * @return array> - */ - public static function dataSettingProperties() - { - return [ - 'Set property for complete standard: PSR2 ClassDeclaration' => [ - 'sniffClass' => 'PHP_CodeSniffer\Standards\PSR2\Sniffs\Classes\ClassDeclarationSniff', - 'propertyName' => 'indent', - 'expectedValue' => '20', - ], - 'Set property for complete standard: PSR2 SwitchDeclaration' => [ - 'sniffClass' => 'PHP_CodeSniffer\Standards\PSR2\Sniffs\ControlStructures\SwitchDeclarationSniff', - 'propertyName' => 'indent', - 'expectedValue' => '20', - ], - 'Set property for complete standard: PSR2 FunctionCallSignature' => [ - 'sniffClass' => 'PHP_CodeSniffer\Standards\PSR2\Sniffs\Methods\FunctionCallSignatureSniff', - 'propertyName' => 'indent', - 'expectedValue' => '20', - ], - 'Set property for complete category: PSR12 OperatorSpacing' => [ - 'sniffClass' => 'PHP_CodeSniffer\Standards\PSR12\Sniffs\Operators\OperatorSpacingSniff', - 'propertyName' => 'ignoreSpacingBeforeAssignments', - 'expectedValue' => false, - ], - 'Set property for individual sniff: Generic ArrayIndent' => [ - 'sniffClass' => 'PHP_CodeSniffer\Standards\Generic\Sniffs\Arrays\ArrayIndentSniff', - 'propertyName' => 'indent', - 'expectedValue' => '2', - ], - 'Set property for individual sniff using sniff file inclusion: Generic LineLength' => [ - 'sniffClass' => 'PHP_CodeSniffer\Standards\Generic\Sniffs\Files\LineLengthSniff', - 'propertyName' => 'lineLimit', - 'expectedValue' => '10', - ], - 'Set property for individual sniff using sniff file inclusion: CamelCapsFunctionName' => [ - 'sniffClass' => 'PHP_CodeSniffer\Standards\Generic\Sniffs\NamingConventions\CamelCapsFunctionNameSniff', - 'propertyName' => 'strict', - 'expectedValue' => false, - ], - 'Set property for individual sniff via included ruleset: NestingLevel - nestingLevel' => [ - 'sniffClass' => 'PHP_CodeSniffer\Standards\Generic\Sniffs\Metrics\NestingLevelSniff', - 'propertyName' => 'nestingLevel', - 'expectedValue' => '2', - ], - 'Set property for all sniffs in an included ruleset: NestingLevel - absoluteNestingLevel' => [ - 'sniffClass' => 'PHP_CodeSniffer\Standards\Generic\Sniffs\Metrics\NestingLevelSniff', - 'propertyName' => 'absoluteNestingLevel', - 'expectedValue' => true, - ], - - // Testing that setting a property at error code level does *not* work. - 'Set property for error code will not change the sniff property value: CyclomaticComplexity' => [ - 'sniffClass' => 'PHP_CodeSniffer\Standards\Generic\Sniffs\Metrics\CyclomaticComplexitySniff', - 'propertyName' => 'complexity', - 'expectedValue' => 10, - ], - ]; - - }//end dataSettingProperties() - - - /** - * Test that setting properties for standards, categories on sniffs which don't support the property will - * silently ignore the property and not set it. - * - * @param string $sniffClass The name of the sniff class. - * @param string $propertyName The name of the property which should not be set. - * - * @dataProvider dataSettingInvalidPropertiesOnStandardsAndCategoriesSilentlyFails - * - * @return void - */ - public function testSettingInvalidPropertiesOnStandardsAndCategoriesSilentlyFails($sniffClass, $propertyName) - { - $this->assertArrayHasKey($sniffClass, self::$ruleset->sniffs, 'Sniff class '.$sniffClass.' not listed in registered sniffs'); - $this->assertXObjectNotHasProperty($propertyName, self::$ruleset->sniffs[$sniffClass]); - - }//end testSettingInvalidPropertiesOnStandardsAndCategoriesSilentlyFails() - - - /** - * Data provider. - * - * @see self::testSettingInvalidPropertiesOnStandardsAndCategoriesSilentlyFails() - * - * @return array> - */ - public static function dataSettingInvalidPropertiesOnStandardsAndCategoriesSilentlyFails() - { - return [ - 'Set property for complete standard: PSR2 ClassDeclaration' => [ - 'sniffClass' => 'PHP_CodeSniffer\Standards\PSR1\Sniffs\Classes\ClassDeclarationSniff', - 'propertyName' => 'setforallsniffs', - ], - 'Set property for complete standard: PSR2 FunctionCallSignature' => [ - 'sniffClass' => 'PHP_CodeSniffer\Standards\PSR2\Sniffs\Methods\FunctionCallSignatureSniff', - 'propertyName' => 'setforallsniffs', - ], - 'Set property for complete category: PSR12 OperatorSpacing' => [ - 'sniffClass' => 'PHP_CodeSniffer\Standards\PSR12\Sniffs\Operators\OperatorSpacingSniff', - 'propertyName' => 'setforallincategory', - ], - 'Set property for all sniffs in included category directory' => [ - 'sniffClass' => 'PHP_CodeSniffer\Standards\Squiz\Sniffs\Files\FileExtensionSniff', - 'propertyName' => 'setforsquizfilessniffs', - ], - ]; - - }//end dataSettingInvalidPropertiesOnStandardsAndCategoriesSilentlyFails() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionTest.xml deleted file mode 100644 index 0cc4044..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/RuleInclusionTest.xml +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/SetPropertyAllowedAsDeclaredTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/SetPropertyAllowedAsDeclaredTest.xml deleted file mode 100644 index 12a947d..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/SetPropertyAllowedAsDeclaredTest.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/SetPropertyAllowedViaMagicMethodTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/SetPropertyAllowedViaMagicMethodTest.xml deleted file mode 100644 index 26d5560..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/SetPropertyAllowedViaMagicMethodTest.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/SetPropertyAllowedViaStdClassTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/SetPropertyAllowedViaStdClassTest.xml deleted file mode 100644 index e5f4072..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/SetPropertyAllowedViaStdClassTest.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/SetPropertyAppliesPropertyToMultipleSniffsInCategoryTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/SetPropertyAppliesPropertyToMultipleSniffsInCategoryTest.xml deleted file mode 100644 index 4563c9c..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/SetPropertyAppliesPropertyToMultipleSniffsInCategoryTest.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/SetPropertyDoesNotThrowErrorOnInvalidPropertyWhenSetForCategoryTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/SetPropertyDoesNotThrowErrorOnInvalidPropertyWhenSetForCategoryTest.xml deleted file mode 100644 index c206a06..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/SetPropertyDoesNotThrowErrorOnInvalidPropertyWhenSetForCategoryTest.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/SetPropertyDoesNotThrowErrorOnInvalidPropertyWhenSetForStandardTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/SetPropertyDoesNotThrowErrorOnInvalidPropertyWhenSetForStandardTest.xml deleted file mode 100644 index 179cdd4..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/SetPropertyDoesNotThrowErrorOnInvalidPropertyWhenSetForStandardTest.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/SetPropertyNotAllowedViaAttributeTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/SetPropertyNotAllowedViaAttributeTest.xml deleted file mode 100644 index 5ff0fd2..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/SetPropertyNotAllowedViaAttributeTest.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/SetPropertyThrowsErrorOnInvalidPropertyTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/SetPropertyThrowsErrorOnInvalidPropertyTest.xml deleted file mode 100644 index 3646d65..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/SetPropertyThrowsErrorOnInvalidPropertyTest.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/SetSniffPropertyTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/SetSniffPropertyTest.php deleted file mode 100644 index 602a99a..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/SetSniffPropertyTest.php +++ /dev/null @@ -1,421 +0,0 @@ - - * @copyright 2022 Juliette Reinders Folmer. All rights reserved. - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Ruleset; - -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Tests\ConfigDouble; -use PHP_CodeSniffer\Tests\Core\Ruleset\AbstractRulesetTestCase; -use ReflectionObject; - -/** - * These tests specifically focus on the changes made to work around the PHP 8.2 dynamic properties deprecation. - * - * @covers \PHP_CodeSniffer\Ruleset::setSniffProperty - */ -final class SetSniffPropertyTest extends AbstractRulesetTestCase -{ - - - /** - * Test that setting a property via the ruleset works in all situations which allow for it. - * - * @param string $name Name of the test. Used for the sniff name, the ruleset file name etc. - * - * @dataProvider dataSniffPropertiesGetSetWhenAllowed - * - * @return void - */ - public function testSniffPropertiesGetSetWhenAllowed($name) - { - $sniffCode = "TestStandard.SetProperty.{$name}"; - $sniffClass = 'Fixtures\TestStandard\Sniffs\SetProperty\\'.$name.'Sniff'; - $properties = [ - 'arbitrarystring' => 'arbitraryvalue', - 'arbitraryarray' => [ - 'mykey' => 'myvalue', - 'otherkey' => 'othervalue', - ], - ]; - - // Set up the ruleset. - $standard = __DIR__."/SetProperty{$name}Test.xml"; - $config = new ConfigDouble(["--standard=$standard"]); - $ruleset = new Ruleset($config); - - // Verify that the sniff has been registered. - $this->assertGreaterThan(0, count($ruleset->sniffCodes), 'No sniff codes registered'); - - // Verify that our target sniff has been registered. - $this->assertArrayHasKey($sniffCode, $ruleset->sniffCodes, 'Target sniff not registered'); - $this->assertSame($sniffClass, $ruleset->sniffCodes[$sniffCode], 'Target sniff not registered with the correct class'); - - // Test that the property as declared in the ruleset has been set on the sniff. - $this->assertArrayHasKey($sniffClass, $ruleset->sniffs, 'Sniff class not listed in registered sniffs'); - - $sniffObject = $ruleset->sniffs[$sniffClass]; - foreach ($properties as $name => $expectedValue) { - $this->assertSame($expectedValue, $sniffObject->$name, 'Property value not set to expected value'); - } - - }//end testSniffPropertiesGetSetWhenAllowed() - - - /** - * Data provider. - * - * @see self::testSniffPropertiesGetSetWhenAllowed() - * - * @return array> - */ - public static function dataSniffPropertiesGetSetWhenAllowed() - { - return [ - 'Property allowed as explicitly declared' => ['AllowedAsDeclared'], - 'Property allowed as sniff extends stdClass' => ['AllowedViaStdClass'], - 'Property allowed as sniff has magic __set() method' => ['AllowedViaMagicMethod'], - ]; - - }//end dataSniffPropertiesGetSetWhenAllowed() - - - /** - * Test that setting a property for a category will apply it correctly to those sniffs which support the - * property, but won't apply it to sniffs which don't. - * - * Note: this test intentionally uses the `PEAR.Functions` category as two sniffs in that category - * have a public property with the same name (`indent`) and one sniff doesn't, which makes it a great - * test case for this. - * - * @return void - */ - public function testSetPropertyAppliesPropertyToMultipleSniffsInCategory() - { - $propertyName = 'indent'; - $expectedValue = '10'; - - // Set up the ruleset. - $standard = __DIR__.'/SetPropertyAppliesPropertyToMultipleSniffsInCategoryTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - $ruleset = new Ruleset($config); - - // Test that the two sniffs which support the property have received the value. - $sniffClass = 'PHP_CodeSniffer\Standards\PEAR\Sniffs\Functions\FunctionCallSignatureSniff'; - $this->assertArrayHasKey($sniffClass, $ruleset->sniffs, 'Sniff class '.$sniffClass.' not listed in registered sniffs'); - $sniffObject = $ruleset->sniffs[$sniffClass]; - $this->assertSame($expectedValue, $sniffObject->$propertyName, 'Property value not set to expected value for '.$sniffClass); - - $sniffClass = 'PHP_CodeSniffer\Standards\PEAR\Sniffs\Functions\FunctionDeclarationSniff'; - $this->assertArrayHasKey($sniffClass, $ruleset->sniffs, 'Sniff class '.$sniffClass.' not listed in registered sniffs'); - $sniffObject = $ruleset->sniffs[$sniffClass]; - $this->assertSame($expectedValue, $sniffObject->$propertyName, 'Property value not set to expected value for '.$sniffClass); - - // Test that the property doesn't get set for the one sniff which doesn't support the property. - $sniffClass = 'PHP_CodeSniffer\Standards\PEAR\Sniffs\Functions\ValidDefaultValueSniff'; - $this->assertArrayHasKey($sniffClass, $ruleset->sniffs, 'Sniff class '.$sniffClass.' not listed in registered sniffs'); - - $hasProperty = (new ReflectionObject($ruleset->sniffs[$sniffClass]))->hasProperty($propertyName); - $errorMsg = sprintf('Property %s registered for sniff %s which does not support it', $propertyName, $sniffClass); - $this->assertFalse($hasProperty, $errorMsg); - - }//end testSetPropertyAppliesPropertyToMultipleSniffsInCategory() - - - /** - * Test that attempting to set a non-existent property directly on a sniff will throw an error - * when the sniff does not explicitly declare the property, extends stdClass or has magic methods. - * - * @return void - */ - public function testSetPropertyThrowsErrorOnInvalidProperty() - { - $exceptionMsg = 'ERROR: Property "indentation" does not exist on sniff Generic.Arrays.ArrayIndent.'.PHP_EOL.PHP_EOL; - $this->expectRuntimeExceptionMessage($exceptionMsg); - - // Set up the ruleset. - $standard = __DIR__.'/SetPropertyThrowsErrorOnInvalidPropertyTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - new Ruleset($config); - - }//end testSetPropertyThrowsErrorOnInvalidProperty() - - - /** - * Test that attempting to set a non-existent property directly on a sniff will throw an error - * when the sniff does not explicitly declare the property, extends stdClass or has magic methods, - * even though the sniff has the PHP 8.2 `#[AllowDynamicProperties]` attribute set. - * - * @return void - */ - public function testSetPropertyThrowsErrorWhenPropertyOnlyAllowedViaAttribute() - { - $exceptionMsg = 'ERROR: Property "arbitrarystring" does not exist on sniff TestStandard.SetProperty.NotAllowedViaAttribute.'.PHP_EOL.PHP_EOL; - $this->expectRuntimeExceptionMessage($exceptionMsg); - - // Set up the ruleset. - $standard = __DIR__.'/SetPropertyNotAllowedViaAttributeTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - new Ruleset($config); - - }//end testSetPropertyThrowsErrorWhenPropertyOnlyAllowedViaAttribute() - - - /** - * Test that attempting to set a non-existent property on a sniff when the property directive is - * for the whole standard, does not yield an error. - * - * @doesNotPerformAssertions - * - * @return void - */ - public function testSetPropertyDoesNotThrowErrorOnInvalidPropertyWhenSetForStandard() - { - // Set up the ruleset. - $standard = __DIR__.'/SetPropertyDoesNotThrowErrorOnInvalidPropertyWhenSetForStandardTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - new Ruleset($config); - - }//end testSetPropertyDoesNotThrowErrorOnInvalidPropertyWhenSetForStandard() - - - /** - * Test that attempting to set a non-existent property on a sniff when the property directive is - * for a whole category, does not yield an error. - * - * @doesNotPerformAssertions - * - * @return void - */ - public function testSetPropertyDoesNotThrowErrorOnInvalidPropertyWhenSetForCategory() - { - // Set up the ruleset. - $standard = __DIR__.'/SetPropertyDoesNotThrowErrorOnInvalidPropertyWhenSetForCategoryTest.xml'; - $config = new ConfigDouble(["--standard=$standard"]); - new Ruleset($config); - - }//end testSetPropertyDoesNotThrowErrorOnInvalidPropertyWhenSetForCategory() - - - /** - * Test that attempting to set a property for a sniff which isn't registered will be ignored. - * - * @return void - */ - public function testDirectCallIgnoredPropertyForUnusedSniff() - { - $sniffCode = 'Generic.Formatting.SpaceAfterCast'; - $sniffClass = 'PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Formatting\\SpaceAfterCastSniff'; - - // Set up the ruleset. - $config = new ConfigDouble(['--standard=PSR1']); - $ruleset = new Ruleset($config); - - $ruleset->setSniffProperty( - $sniffClass, - 'ignoreNewlines', - [ - 'scope' => 'sniff', - 'value' => true, - ] - ); - - // Verify that there are sniffs registered. - $this->assertGreaterThan(0, count($ruleset->sniffCodes), 'No sniff codes registered'); - - // Verify that our target sniff has NOT been registered after attempting to set the property. - $this->assertArrayNotHasKey($sniffCode, $ruleset->sniffCodes, 'Unused sniff was registered in sniffCodes, but shouldn\'t have been'); - $this->assertArrayNotHasKey($sniffClass, $ruleset->sniffs, 'Unused sniff was registered in sniffs, but shouldn\'t have been'); - - }//end testDirectCallIgnoredPropertyForUnusedSniff() - - - /** - * Test that setting a property via a direct call to the Ruleset::setSniffProperty() method - * sets the property correctly when using the new $settings array format. - * - * @return void - */ - public function testDirectCallWithNewArrayFormatSetsProperty() - { - $name = 'AllowedAsDeclared'; - $sniffCode = "TestStandard.SetProperty.{$name}"; - $sniffClass = 'Fixtures\TestStandard\Sniffs\SetProperty\\'.$name.'Sniff'; - - // Set up the ruleset. - $standard = __DIR__."/SetProperty{$name}Test.xml"; - $config = new ConfigDouble(["--standard=$standard"]); - $ruleset = new Ruleset($config); - - $propertyName = 'arbitrarystring'; - $propertyValue = 'new value'; - - $ruleset->setSniffProperty( - $sniffClass, - $propertyName, - [ - 'scope' => 'sniff', - 'value' => $propertyValue, - ] - ); - - // Verify that the sniff has been registered. - $this->assertGreaterThan(0, count($ruleset->sniffCodes), 'No sniff codes registered'); - - // Verify that our target sniff has been registered. - $this->assertArrayHasKey($sniffCode, $ruleset->sniffCodes, 'Target sniff not registered'); - $this->assertSame($sniffClass, $ruleset->sniffCodes[$sniffCode], 'Target sniff not registered with the correct class'); - - // Test that the property as declared in the ruleset has been set on the sniff. - $this->assertArrayHasKey($sniffClass, $ruleset->sniffs, 'Sniff class not listed in registered sniffs'); - - $sniffObject = $ruleset->sniffs[$sniffClass]; - $this->assertSame($propertyValue, $sniffObject->$propertyName, 'Property value not set to expected value'); - - }//end testDirectCallWithNewArrayFormatSetsProperty() - - - /** - * Test that setting a property via a direct call to the Ruleset::setSniffProperty() method - * sets the property correctly when using the old $settings array format. - * - * Tested by silencing the deprecation notice as otherwise the test would fail on the deprecation notice. - * - * @param mixed $propertyValue Value for the property to set. - * - * @dataProvider dataDirectCallWithOldArrayFormatSetsProperty - * - * @return void - */ - public function testDirectCallWithOldArrayFormatSetsProperty($propertyValue) - { - $name = 'AllowedAsDeclared'; - $sniffCode = "TestStandard.SetProperty.{$name}"; - $sniffClass = 'Fixtures\TestStandard\Sniffs\SetProperty\\'.$name.'Sniff'; - - // Set up the ruleset. - $standard = __DIR__."/SetProperty{$name}Test.xml"; - $config = new ConfigDouble(["--standard=$standard"]); - $ruleset = new Ruleset($config); - - $propertyName = 'arbitrarystring'; - - @$ruleset->setSniffProperty( - $sniffClass, - $propertyName, - $propertyValue - ); - - // Verify that the sniff has been registered. - $this->assertGreaterThan(0, count($ruleset->sniffCodes), 'No sniff codes registered'); - - // Verify that our target sniff has been registered. - $this->assertArrayHasKey($sniffCode, $ruleset->sniffCodes, 'Target sniff not registered'); - $this->assertSame($sniffClass, $ruleset->sniffCodes[$sniffCode], 'Target sniff not registered with the correct class'); - - // Test that the property as declared in the ruleset has been set on the sniff. - $this->assertArrayHasKey($sniffClass, $ruleset->sniffs, 'Sniff class not listed in registered sniffs'); - - $sniffObject = $ruleset->sniffs[$sniffClass]; - $this->assertSame($propertyValue, $sniffObject->$propertyName, 'Property value not set to expected value'); - - }//end testDirectCallWithOldArrayFormatSetsProperty() - - - /** - * Data provider. - * - * @see self::testDirectCallWithOldArrayFormatSetsProperty() - * - * @return array> - */ - public static function dataDirectCallWithOldArrayFormatSetsProperty() - { - return [ - 'Property value is not an array (boolean)' => [ - 'propertyValue' => false, - ], - 'Property value is not an array (string)' => [ - 'propertyValue' => 'a string', - ], - 'Property value is an empty array' => [ - 'propertyValue' => [], - ], - 'Property value is an array without keys' => [ - 'propertyValue' => [ - 'value', - false, - ], - ], - 'Property value is an array without the "scope" or "value" keys' => [ - 'propertyValue' => [ - 'key1' => 'value', - 'key2' => false, - ], - ], - 'Property value is an array without the "scope" key' => [ - 'propertyValue' => [ - 'key1' => 'value', - 'value' => true, - ], - ], - 'Property value is an array without the "value" key' => [ - 'propertyValue' => [ - 'scope' => 'value', - 'key2' => 1234, - ], - ], - ]; - - }//end dataDirectCallWithOldArrayFormatSetsProperty() - - - /** - * Test that setting a property via a direct call to the Ruleset::setSniffProperty() method - * throws a deprecation notice when using the old $settings array format. - * - * Note: as PHPUnit stops as soon as it sees the deprecation notice, the setting of the property - * value is not tested here. - * - * @return void - */ - public function testDirectCallWithOldArrayFormatThrowsDeprecationNotice() - { - $exceptionClass = 'PHPUnit\Framework\Error\Deprecated'; - if (class_exists($exceptionClass) === false) { - $exceptionClass = 'PHPUnit_Framework_Error_Deprecated'; - } - - $exceptionMsg = 'the format of the $settings parameter has changed from (mixed) $value to array(\'scope\' => \'sniff|standard\', \'value\' => $value). Please update your integration code. See PR #3629 for more information.'; - - if (method_exists($this, 'expectException') === true) { - $this->expectException($exceptionClass); - $this->expectExceptionMessage($exceptionMsg); - } else { - // PHPUnit < 5.2.0. - $this->setExpectedException($exceptionClass, $exceptionMsg); - } - - $name = 'AllowedAsDeclared'; - $sniffClass = 'Fixtures\TestStandard\Sniffs\SetProperty\\'.$name.'Sniff'; - - // Set up the ruleset. - $standard = __DIR__."/SetProperty{$name}Test.xml"; - $config = new ConfigDouble(["--standard=$standard"]); - $ruleset = new Ruleset($config); - - $ruleset->setSniffProperty( - $sniffClass, - 'arbitrarystring', - ['key' => 'value'] - ); - - }//end testDirectCallWithOldArrayFormatThrowsDeprecationNotice() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ShowSniffDeprecationsEmptyDeprecationVersionTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ShowSniffDeprecationsEmptyDeprecationVersionTest.xml deleted file mode 100644 index 4b7b666..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ShowSniffDeprecationsEmptyDeprecationVersionTest.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ShowSniffDeprecationsEmptyRemovalVersionTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ShowSniffDeprecationsEmptyRemovalVersionTest.xml deleted file mode 100644 index d22ec24..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ShowSniffDeprecationsEmptyRemovalVersionTest.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ShowSniffDeprecationsInvalidDeprecationMessageTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ShowSniffDeprecationsInvalidDeprecationMessageTest.xml deleted file mode 100644 index fb80426..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ShowSniffDeprecationsInvalidDeprecationMessageTest.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ShowSniffDeprecationsInvalidDeprecationVersionTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ShowSniffDeprecationsInvalidDeprecationVersionTest.xml deleted file mode 100644 index 2a8aedd..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ShowSniffDeprecationsInvalidDeprecationVersionTest.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ShowSniffDeprecationsInvalidRemovalVersionTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ShowSniffDeprecationsInvalidRemovalVersionTest.xml deleted file mode 100644 index 6a16178..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ShowSniffDeprecationsInvalidRemovalVersionTest.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ShowSniffDeprecationsOrderTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ShowSniffDeprecationsOrderTest.xml deleted file mode 100644 index 9c4ce1b..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ShowSniffDeprecationsOrderTest.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ShowSniffDeprecationsReportWidthTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ShowSniffDeprecationsReportWidthTest.xml deleted file mode 100644 index c198d68..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ShowSniffDeprecationsReportWidthTest.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ShowSniffDeprecationsTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ShowSniffDeprecationsTest.php deleted file mode 100644 index 8138b79..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ShowSniffDeprecationsTest.php +++ /dev/null @@ -1,540 +0,0 @@ - - * @copyright 2024 Juliette Reinders Folmer. All rights reserved. - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Ruleset; - -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Tests\ConfigDouble; -use PHP_CodeSniffer\Tests\Core\Ruleset\AbstractRulesetTestCase; - -/** - * Tests PHPCS native handling of sniff deprecations. - * - * @covers \PHP_CodeSniffer\Ruleset::hasSniffDeprecations - * @covers \PHP_CodeSniffer\Ruleset::showSniffDeprecations - */ -final class ShowSniffDeprecationsTest extends AbstractRulesetTestCase -{ - - - /** - * Test the return value of the hasSniffDeprecations() method. - * - * @param string $standard The standard to use for the test. - * @param bool $expected The expected function return value. - * - * @dataProvider dataHasSniffDeprecations - * - * @return void - */ - public function testHasSniffDeprecations($standard, $expected) - { - $config = new ConfigDouble(['.', "--standard=$standard"]); - $ruleset = new Ruleset($config); - - $this->assertSame($expected, $ruleset->hasSniffDeprecations()); - - }//end testHasSniffDeprecations() - - - /** - * Data provider. - * - * @see testHasSniffDeprecations() - * - * @return array> - */ - public static function dataHasSniffDeprecations() - { - return [ - 'Standard not using deprecated sniffs: PSR1' => [ - 'standard' => 'PSR1', - 'expected' => false, - ], - 'Standard using deprecated sniffs: Test Fixture' => [ - 'standard' => __DIR__.'/ShowSniffDeprecationsTest.xml', - 'expected' => true, - ], - ]; - - }//end dataHasSniffDeprecations() - - - /** - * Test that the listing with deprecated sniffs will not show when specific command-line options are being used [1]. - * - * @param string $standard The standard to use for the test. - * @param array $additionalArgs Optional. Additional arguments to pass. - * - * @dataProvider dataDeprecatedSniffsListDoesNotShow - * - * @return void - */ - public function testDeprecatedSniffsListDoesNotShow($standard, $additionalArgs=[]) - { - $args = $additionalArgs; - $args[] = '.'; - $args[] = "--standard=$standard"; - - $config = new ConfigDouble($args); - $ruleset = new Ruleset($config); - - $this->expectOutputString(''); - - $ruleset->showSniffDeprecations(); - - }//end testDeprecatedSniffsListDoesNotShow() - - - /** - * Data provider. - * - * @see testDeprecatedSniffsListDoesNotShow() - * - * @return array>> - */ - public static function dataDeprecatedSniffsListDoesNotShow() - { - return [ - 'Standard not using deprecated sniffs: PSR1' => [ - 'standard' => 'PSR1', - ], - 'Standard using deprecated sniffs; explain mode' => [ - 'standard' => __DIR__.'/ShowSniffDeprecationsTest.xml', - 'additionalArgs' => ['-e'], - ], - 'Standard using deprecated sniffs; quiet mode' => [ - 'standard' => __DIR__.'/ShowSniffDeprecationsTest.xml', - 'additionalArgs' => ['-q'], - ], - ]; - - }//end dataDeprecatedSniffsListDoesNotShow() - - - /** - * Test that the listing with deprecated sniffs will not show when specific command-line options are being used [2]. - * - * {@internal Separate test method for the same thing as this test will only work in CS mode.} - * - * @param string $standard The standard to use for the test. - * @param array $additionalArgs Optional. Additional arguments to pass. - * - * @dataProvider dataDeprecatedSniffsListDoesNotShowNeedsCsMode - * - * @return void - */ - public function testDeprecatedSniffsListDoesNotShowNeedsCsMode($standard, $additionalArgs=[]) - { - if (PHP_CODESNIFFER_CBF === true) { - $this->markTestSkipped('This test needs CS mode to run'); - } - - $this->testDeprecatedSniffsListDoesNotShow($standard, $additionalArgs); - - }//end testDeprecatedSniffsListDoesNotShowNeedsCsMode() - - - /** - * Data provider. - * - * @see testDeprecatedSniffsListDoesNotShowNeedsCsMode() - * - * @return array>> - */ - public static function dataDeprecatedSniffsListDoesNotShowNeedsCsMode() - { - return [ - 'Standard using deprecated sniffs; documentation is requested' => [ - 'standard' => __DIR__.'/ShowSniffDeprecationsTest.xml', - 'additionalArgs' => ['--generator=text'], - ], - ]; - - }//end dataDeprecatedSniffsListDoesNotShowNeedsCsMode() - - - /** - * Test that the listing with deprecated sniffs will not show when using a standard containing deprecated sniffs, - * but only running select non-deprecated sniffs (using `--sniffs=...`). - * - * @return void - */ - public function testDeprecatedSniffsListDoesNotShowWhenSelectedSniffsAreNotDeprecated() - { - $standard = __DIR__.'/ShowSniffDeprecationsTest.xml'; - $config = new ConfigDouble(['.', "--standard=$standard"]); - $ruleset = new Ruleset($config); - - /* - * Apply sniff restrictions. - * For tests we need to manually trigger this if the standard is "installed", like with the fixtures these tests use. - */ - - $restrictions = []; - $sniffs = [ - 'TestStandard.SetProperty.AllowedAsDeclared', - 'TestStandard.SetProperty.AllowedViaStdClass', - ]; - foreach ($sniffs as $sniffCode) { - $parts = explode('.', strtolower($sniffCode)); - $sniffName = $parts[0].'\\sniffs\\'.$parts[1].'\\'.$parts[2].'sniff'; - $restrictions[strtolower($sniffName)] = true; - } - - $sniffFiles = []; - $allSniffs = $ruleset->sniffCodes; - foreach ($allSniffs as $sniffName) { - $sniffFile = str_replace('\\', DIRECTORY_SEPARATOR, $sniffName); - $sniffFile = __DIR__.DIRECTORY_SEPARATOR.$sniffFile.'.php'; - $sniffFiles[] = $sniffFile; - } - - $ruleset->registerSniffs($sniffFiles, $restrictions, []); - $ruleset->populateTokenListeners(); - - $this->expectOutputString(''); - - $ruleset->showSniffDeprecations(); - - }//end testDeprecatedSniffsListDoesNotShowWhenSelectedSniffsAreNotDeprecated() - - - /** - * Test that the listing with deprecated sniffs will not show when using a standard containing deprecated sniffs, - * but all deprecated sniffs have been excluded from the run (using `--exclude=...`). - * - * @return void - */ - public function testDeprecatedSniffsListDoesNotShowWhenAllDeprecatedSniffsAreExcluded() - { - $standard = __DIR__.'/ShowSniffDeprecationsTest.xml'; - $config = new ConfigDouble(['.', "--standard=$standard"]); - $ruleset = new Ruleset($config); - - /* - * Apply sniff restrictions. - * For tests we need to manually trigger this if the standard is "installed", like with the fixtures these tests use. - */ - - $exclusions = []; - $exclude = [ - 'TestStandard.Deprecated.WithLongReplacement', - 'TestStandard.Deprecated.WithoutReplacement', - 'TestStandard.Deprecated.WithReplacement', - 'TestStandard.Deprecated.WithReplacementContainingLinuxNewlines', - 'TestStandard.Deprecated.WithReplacementContainingNewlines', - ]; - foreach ($exclude as $sniffCode) { - $parts = explode('.', strtolower($sniffCode)); - $sniffName = $parts[0].'\\sniffs\\'.$parts[1].'\\'.$parts[2].'sniff'; - $exclusions[strtolower($sniffName)] = true; - } - - $sniffFiles = []; - $allSniffs = $ruleset->sniffCodes; - foreach ($allSniffs as $sniffName) { - $sniffFile = str_replace('\\', DIRECTORY_SEPARATOR, $sniffName); - $sniffFile = __DIR__.DIRECTORY_SEPARATOR.$sniffFile.'.php'; - $sniffFiles[] = $sniffFile; - } - - $ruleset->registerSniffs($sniffFiles, [], $exclusions); - $ruleset->populateTokenListeners(); - - $this->expectOutputString(''); - - $ruleset->showSniffDeprecations(); - - }//end testDeprecatedSniffsListDoesNotShowWhenAllDeprecatedSniffsAreExcluded() - - - /** - * Test various aspects of the deprecated sniffs warning. - * - * This tests a number of different aspects: - * 1. That the summary line uses the correct grammar when there is are multiple deprecated sniffs. - * 2. That there is no trailing whitespace when the sniff does not provide a custom message. - * 3. That custom messages containing new line characters (any type) are handled correctly and - * that those new line characters are converted to the OS supported new line char. - * - * @return void - */ - public function testDeprecatedSniffsWarning() - { - $standard = __DIR__.'/ShowSniffDeprecationsTest.xml'; - $config = new ConfigDouble(["--standard=$standard", '--no-colors']); - $ruleset = new Ruleset($config); - - $expected = 'WARNING: The ShowSniffDeprecationsTest standard uses 5 deprecated sniffs'.PHP_EOL; - $expected .= '--------------------------------------------------------------------------------'.PHP_EOL; - $expected .= '- TestStandard.Deprecated.WithLongReplacement'.PHP_EOL; - $expected .= ' This sniff has been deprecated since v3.8.0 and will be removed in v4.0.0.'.PHP_EOL; - $expected .= ' Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce vel'.PHP_EOL; - $expected .= ' vestibulum nunc. Sed luctus dolor tortor, eu euismod purus pretium sed.'.PHP_EOL; - $expected .= ' Fusce egestas congue massa semper cursus. Donec quis pretium tellus. In'.PHP_EOL; - $expected .= ' lacinia, augue ut ornare porttitor, diam nunc faucibus purus, et accumsan'.PHP_EOL; - $expected .= ' eros sapien at sem. Sed pulvinar aliquam malesuada. Aliquam erat volutpat.'.PHP_EOL; - $expected .= ' Mauris gravida rutrum lectus at egestas. Fusce tempus elit in tincidunt'.PHP_EOL; - $expected .= ' dictum. Suspendisse dictum egestas sapien, eget ullamcorper metus elementum'.PHP_EOL; - $expected .= ' semper. Vestibulum sem justo, consectetur ac tincidunt et, finibus eget'.PHP_EOL; - $expected .= ' libero.'.PHP_EOL; - $expected .= '- TestStandard.Deprecated.WithoutReplacement'.PHP_EOL; - $expected .= ' This sniff has been deprecated since v3.4.0 and will be removed in v4.0.0.'.PHP_EOL; - $expected .= '- TestStandard.Deprecated.WithReplacement'.PHP_EOL; - $expected .= ' This sniff has been deprecated since v3.8.0 and will be removed in v4.0.0.'.PHP_EOL; - $expected .= ' Use the Stnd.Category.OtherSniff sniff instead.'.PHP_EOL; - $expected .= '- TestStandard.Deprecated.WithReplacementContainingLinuxNewlines'.PHP_EOL; - $expected .= ' This sniff has been deprecated since v3.8.0 and will be removed in v4.0.0.'.PHP_EOL; - $expected .= ' Lorem ipsum dolor sit amet, consectetur adipiscing elit.'.PHP_EOL; - $expected .= ' Fusce vel vestibulum nunc. Sed luctus dolor tortor, eu euismod purus pretium'.PHP_EOL; - $expected .= ' sed.'.PHP_EOL; - $expected .= ' Fusce egestas congue massa semper cursus. Donec quis pretium tellus.'.PHP_EOL; - $expected .= ' In lacinia, augue ut ornare porttitor, diam nunc faucibus purus, et accumsan'.PHP_EOL; - $expected .= ' eros sapien at sem.'.PHP_EOL; - $expected .= ' Sed pulvinar aliquam malesuada. Aliquam erat volutpat. Mauris gravida rutrum'.PHP_EOL; - $expected .= ' lectus at egestas.'.PHP_EOL; - $expected .= '- TestStandard.Deprecated.WithReplacementContainingNewlines'.PHP_EOL; - $expected .= ' This sniff has been deprecated since v3.8.0 and will be removed in v4.0.0.'.PHP_EOL; - $expected .= ' Lorem ipsum dolor sit amet, consectetur adipiscing elit.'.PHP_EOL; - $expected .= ' Fusce vel vestibulum nunc. Sed luctus dolor tortor, eu euismod purus pretium'.PHP_EOL; - $expected .= ' sed.'.PHP_EOL; - $expected .= ' Fusce egestas congue massa semper cursus. Donec quis pretium tellus.'.PHP_EOL; - $expected .= ' In lacinia, augue ut ornare porttitor, diam nunc faucibus purus, et accumsan'.PHP_EOL; - $expected .= ' eros sapien at sem.'.PHP_EOL; - $expected .= ' Sed pulvinar aliquam malesuada. Aliquam erat volutpat. Mauris gravida rutrum'.PHP_EOL; - $expected .= ' lectus at egestas'.PHP_EOL.PHP_EOL; - $expected .= 'Deprecated sniffs are still run, but will stop working at some point in the'.PHP_EOL; - $expected .= 'future.'.PHP_EOL.PHP_EOL; - - $this->expectOutputString($expected); - - $ruleset->showSniffDeprecations(); - - }//end testDeprecatedSniffsWarning() - - - /** - * Test the report width is respected when displaying the deprecated sniffs warning. - * - * This tests the following aspects: - * 1. That the summary line uses the correct grammar when there is a single deprecated sniff. - * 2. That the separator line below the summary maximizes at the longest line length. - * 3. That the word wrapping respects the maximum report width. - * 4. That the sniff name is truncated if it is longer than the max report width. - * - * @param int $reportWidth Report width for the test. - * @param string $expectedOutput Expected output. - * - * @dataProvider dataReportWidthIsRespected - * - * @return void - */ - public function testReportWidthIsRespected($reportWidth, $expectedOutput) - { - // Set up the ruleset. - $standard = __DIR__.'/ShowSniffDeprecationsReportWidthTest.xml'; - $config = new ConfigDouble(['.', "--standard=$standard", "--report-width=$reportWidth", '--no-colors']); - $ruleset = new Ruleset($config); - - $this->expectOutputString($expectedOutput); - - $ruleset->showSniffDeprecations(); - - }//end testReportWidthIsRespected() - - - /** - * Data provider. - * - * @see testReportWidthIsRespected() - * - * @return array> - */ - public static function dataReportWidthIsRespected() - { - $summaryLine = 'WARNING: The ShowSniffDeprecationsTest standard uses 1 deprecated sniff'.PHP_EOL; - - // phpcs:disable Squiz.Strings.ConcatenationSpacing.PaddingFound -- Test readability is more important. - return [ - 'Report width small: 40; with truncated sniff name and wrapped header and footer lines' => [ - 'reportWidth' => 40, - 'expectedOutput' => 'WARNING: The ShowSniffDeprecationsTest'.PHP_EOL - .'standard uses 1 deprecated sniff'.PHP_EOL - .'----------------------------------------'.PHP_EOL - .'- TestStandard.Deprecated.WithLongR...'.PHP_EOL - .' This sniff has been deprecated since'.PHP_EOL - .' v3.8.0 and will be removed in'.PHP_EOL - .' v4.0.0. Lorem ipsum dolor sit amet,'.PHP_EOL - .' consectetur adipiscing elit. Fusce'.PHP_EOL - .' vel vestibulum nunc. Sed luctus'.PHP_EOL - .' dolor tortor, eu euismod purus'.PHP_EOL - .' pretium sed. Fusce egestas congue'.PHP_EOL - .' massa semper cursus. Donec quis'.PHP_EOL - .' pretium tellus. In lacinia, augue ut'.PHP_EOL - .' ornare porttitor, diam nunc faucibus'.PHP_EOL - .' purus, et accumsan eros sapien at'.PHP_EOL - .' sem. Sed pulvinar aliquam malesuada.'.PHP_EOL - .' Aliquam erat volutpat. Mauris'.PHP_EOL - .' gravida rutrum lectus at egestas.'.PHP_EOL - .' Fusce tempus elit in tincidunt'.PHP_EOL - .' dictum. Suspendisse dictum egestas'.PHP_EOL - .' sapien, eget ullamcorper metus'.PHP_EOL - .' elementum semper. Vestibulum sem'.PHP_EOL - .' justo, consectetur ac tincidunt et,'.PHP_EOL - .' finibus eget libero.'.PHP_EOL.PHP_EOL - .'Deprecated sniffs are still run, but'.PHP_EOL - .'will stop working at some point in the'.PHP_EOL - .'future.'.PHP_EOL.PHP_EOL, - ], - 'Report width default: 80' => [ - 'reportWidth' => 80, - 'expectedOutput' => $summaryLine.str_repeat('-', 80).PHP_EOL - .'- TestStandard.Deprecated.WithLongReplacement'.PHP_EOL - .' This sniff has been deprecated since v3.8.0 and will be removed in v4.0.0.'.PHP_EOL - .' Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce vel'.PHP_EOL - .' vestibulum nunc. Sed luctus dolor tortor, eu euismod purus pretium sed.'.PHP_EOL - .' Fusce egestas congue massa semper cursus. Donec quis pretium tellus. In'.PHP_EOL - .' lacinia, augue ut ornare porttitor, diam nunc faucibus purus, et accumsan'.PHP_EOL - .' eros sapien at sem. Sed pulvinar aliquam malesuada. Aliquam erat volutpat.'.PHP_EOL - .' Mauris gravida rutrum lectus at egestas. Fusce tempus elit in tincidunt'.PHP_EOL - .' dictum. Suspendisse dictum egestas sapien, eget ullamcorper metus elementum'.PHP_EOL - .' semper. Vestibulum sem justo, consectetur ac tincidunt et, finibus eget'.PHP_EOL - .' libero.'.PHP_EOL.PHP_EOL - .'Deprecated sniffs are still run, but will stop working at some point in the'.PHP_EOL - .'future.'.PHP_EOL.PHP_EOL, - ], - 'Report width matches longest line: 666; the message should not wrap' => [ - // Length = 4 padding + 75 base line + 587 custom message. - 'reportWidth' => 666, - 'expectedOutput' => $summaryLine.str_repeat('-', 666).PHP_EOL - .'- TestStandard.Deprecated.WithLongReplacement'.PHP_EOL - .' This sniff has been deprecated since v3.8.0 and will be removed in v4.0.0. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce vel vestibulum nunc. Sed luctus dolor tortor, eu euismod purus pretium sed. Fusce egestas congue massa semper cursus. Donec quis pretium tellus. In lacinia, augue ut ornare porttitor, diam nunc faucibus purus, et accumsan eros sapien at sem. Sed pulvinar aliquam malesuada. Aliquam erat volutpat. Mauris gravida rutrum lectus at egestas. Fusce tempus elit in tincidunt dictum. Suspendisse dictum egestas sapien, eget ullamcorper metus elementum semper. Vestibulum sem justo, consectetur ac tincidunt et, finibus eget libero.' - .PHP_EOL.PHP_EOL - .'Deprecated sniffs are still run, but will stop working at some point in the future.'.PHP_EOL.PHP_EOL, - ], - 'Report width wide: 1000; delimiter line length should match longest line' => [ - 'reportWidth' => 1000, - 'expectedOutput' => $summaryLine.str_repeat('-', 666).PHP_EOL - .'- TestStandard.Deprecated.WithLongReplacement'.PHP_EOL - .' This sniff has been deprecated since v3.8.0 and will be removed in v4.0.0. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce vel vestibulum nunc. Sed luctus dolor tortor, eu euismod purus pretium sed. Fusce egestas congue massa semper cursus. Donec quis pretium tellus. In lacinia, augue ut ornare porttitor, diam nunc faucibus purus, et accumsan eros sapien at sem. Sed pulvinar aliquam malesuada. Aliquam erat volutpat. Mauris gravida rutrum lectus at egestas. Fusce tempus elit in tincidunt dictum. Suspendisse dictum egestas sapien, eget ullamcorper metus elementum semper. Vestibulum sem justo, consectetur ac tincidunt et, finibus eget libero.' - .PHP_EOL.PHP_EOL - .'Deprecated sniffs are still run, but will stop working at some point in the future.'.PHP_EOL.PHP_EOL, - ], - ]; - // phpcs:enable - - }//end dataReportWidthIsRespected() - - - /** - * Test deprecated sniffs are listed alphabetically in the deprecated sniffs warning. - * - * Additionally, this test verifies that deprecated sniffs are still registered to run. - * - * @return void - */ - public function testDeprecatedSniffsAreListedAlphabetically() - { - // Set up the ruleset. - $standard = __DIR__.'/ShowSniffDeprecationsOrderTest.xml'; - $config = new ConfigDouble(["--standard=$standard", '--no-colors']); - $ruleset = new Ruleset($config); - - $expected = 'WARNING: The ShowSniffDeprecationsTest standard uses 2 deprecated sniffs'.PHP_EOL; - $expected .= '--------------------------------------------------------------------------------'.PHP_EOL; - $expected .= '- TestStandard.Deprecated.WithoutReplacement'.PHP_EOL; - $expected .= ' This sniff has been deprecated since v3.4.0 and will be removed in v4.0.0.'.PHP_EOL; - $expected .= '- TestStandard.Deprecated.WithReplacement'.PHP_EOL; - $expected .= ' This sniff has been deprecated since v3.8.0 and will be removed in v4.0.0.'.PHP_EOL; - $expected .= ' Use the Stnd.Category.OtherSniff sniff instead.'.PHP_EOL.PHP_EOL; - $expected .= 'Deprecated sniffs are still run, but will stop working at some point in the'.PHP_EOL; - $expected .= 'future.'.PHP_EOL.PHP_EOL; - - $this->expectOutputString($expected); - - $ruleset->showSniffDeprecations(); - - // Verify that the sniffs have been registered to run. - $this->assertCount(2, $ruleset->sniffCodes, 'Incorrect number of sniff codes registered'); - $this->assertArrayHasKey( - 'TestStandard.Deprecated.WithoutReplacement', - $ruleset->sniffCodes, - 'WithoutReplacement sniff not registered' - ); - $this->assertArrayHasKey( - 'TestStandard.Deprecated.WithReplacement', - $ruleset->sniffCodes, - 'WithReplacement sniff not registered' - ); - - }//end testDeprecatedSniffsAreListedAlphabetically() - - - /** - * Test that an exception is thrown when any of the interface required methods does not - * comply with the return type/value requirements. - * - * @param string $standard The standard to use for the test. - * @param string $exceptionMessage The contents of the expected exception message. - * - * @dataProvider dataExceptionIsThrownOnIncorrectlyImplementedInterface - * - * @return void - */ - public function testExceptionIsThrownOnIncorrectlyImplementedInterface($standard, $exceptionMessage) - { - $this->expectRuntimeExceptionMessage($exceptionMessage); - - // Set up the ruleset. - $standard = __DIR__.'/'.$standard; - $config = new ConfigDouble(["--standard=$standard"]); - $ruleset = new Ruleset($config); - - $ruleset->showSniffDeprecations(); - - }//end testExceptionIsThrownOnIncorrectlyImplementedInterface() - - - /** - * Data provider. - * - * @see testExceptionIsThrownOnIncorrectlyImplementedInterface() - * - * @return array> - */ - public static function dataExceptionIsThrownOnIncorrectlyImplementedInterface() - { - return [ - 'getDeprecationVersion() does not return a string' => [ - 'standard' => 'ShowSniffDeprecationsInvalidDeprecationVersionTest.xml', - 'exceptionMessage' => 'ERROR: The Fixtures\TestStandard\Sniffs\DeprecatedInvalid\InvalidDeprecationVersionSniff::getDeprecationVersion() method must return a non-empty string, received double', - ], - 'getRemovalVersion() does not return a string' => [ - 'standard' => 'ShowSniffDeprecationsInvalidRemovalVersionTest.xml', - 'exceptionMessage' => 'ERROR: The Fixtures\TestStandard\Sniffs\DeprecatedInvalid\InvalidRemovalVersionSniff::getRemovalVersion() method must return a non-empty string, received array', - ], - 'getDeprecationMessage() does not return a string' => [ - 'standard' => 'ShowSniffDeprecationsInvalidDeprecationMessageTest.xml', - 'exceptionMessage' => 'ERROR: The Fixtures\TestStandard\Sniffs\DeprecatedInvalid\InvalidDeprecationMessageSniff::getDeprecationMessage() method must return a string, received object', - ], - 'getDeprecationVersion() returns an empty string' => [ - 'standard' => 'ShowSniffDeprecationsEmptyDeprecationVersionTest.xml', - 'exceptionMessage' => 'ERROR: The Fixtures\TestStandard\Sniffs\DeprecatedInvalid\EmptyDeprecationVersionSniff::getDeprecationVersion() method must return a non-empty string, received ""', - ], - 'getRemovalVersion() returns an empty string' => [ - 'standard' => 'ShowSniffDeprecationsEmptyRemovalVersionTest.xml', - 'exceptionMessage' => 'ERROR: The Fixtures\TestStandard\Sniffs\DeprecatedInvalid\EmptyRemovalVersionSniff::getRemovalVersion() method must return a non-empty string, received ""', - ], - ]; - - }//end dataExceptionIsThrownOnIncorrectlyImplementedInterface() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ShowSniffDeprecationsTest.xml b/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ShowSniffDeprecationsTest.xml deleted file mode 100644 index 91bef96..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Ruleset/ShowSniffDeprecationsTest.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Runner/AbstractRunnerTestCase.php b/vendor/squizlabs/php_codesniffer/tests/Core/Runner/AbstractRunnerTestCase.php deleted file mode 100644 index 657b7e1..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Runner/AbstractRunnerTestCase.php +++ /dev/null @@ -1,19 +0,0 @@ -markTestSkipped('This test needs CS mode to run'); - } - - $this->checkProgressDot($colors, $code, $sniffs, $expected); - - }//end testProgressDotCs() - - - /** - * Data provider. - * - * @return array> - */ - public static function dataProgressDotCs() - { - return [ - 'No colors: Dot: no errors, no warnings' => [ - 'colors' => false, - 'code' => ' 'Generic.PHP.LowerCaseConstant', - 'expected' => '.', - ], - 'No colors: E: has error' => [ - 'colors' => false, - 'code' => ' 'Generic.CodeAnalysis.RequireExplicitBooleanOperatorPrecedence', - 'expected' => 'E', - ], - 'No colors: W: has warning' => [ - 'colors' => false, - 'code' => ' 'Generic.Commenting.Todo', - 'expected' => 'W', - ], - - 'Colors: Dot: no errors, no warnings' => [ - 'colors' => true, - 'code' => ' 'Generic.PHP.LowerCaseConstant', - 'expected' => '.', - ], - 'Colors: E: has error (red)' => [ - 'colors' => true, - 'code' => ' 'Generic.CodeAnalysis.RequireExplicitBooleanOperatorPrecedence', - 'expected' => "\033[31m".'E'."\033[0m", - ], - 'Colors: E: has fixable error (green)' => [ - 'colors' => true, - 'code' => ' 'Generic.Arrays.DisallowLongArraySyntax', - 'expected' => "\033[32m".'E'."\033[0m", - ], - 'Colors: W: has warning (yellow)' => [ - 'colors' => true, - 'code' => ' 'Generic.Commenting.Todo', - 'expected' => "\033[33m".'W'."\033[0m", - ], - 'Colors: W: has fixable warning (green)' => [ - 'colors' => true, - 'code' => ' 'Generic.CodeAnalysis.EmptyPHPStatement', - 'expected' => "\033[32m".'W'."\033[0m", - ], - ]; - - }//end dataProgressDotCs() - - - /** - * Verify the correct progress indicator is used for a file in CBF mode. - * - * @param bool $colors Whether to enable colors or not. - * @param string $code Code snippet to process. - * @param string $sniffs Comma-separated list of sniff(s) to run against the code snippet. - * @param string $expected Expected output of the progress printer. - * - * @dataProvider dataProgressDotCbf - * - * @group CBF - * - * @return void - */ - public function testProgressDotCbf($colors, $code, $sniffs, $expected) - { - if (PHP_CODESNIFFER_CBF === false) { - $this->markTestSkipped('This test needs CBF mode to run'); - } - - $this->checkProgressDot($colors, $code, $sniffs, $expected, true); - - }//end testProgressDotCbf() - - - /** - * Data provider. - * - * @return array> - */ - public static function dataProgressDotCbf() - { - return [ - 'No colors: Dot: no errors, no warnings' => [ - 'colors' => false, - 'code' => ' 'Generic.PHP.LowerCaseConstant', - 'expected' => '.', - ], - 'No colors: F: fixes made' => [ - 'colors' => false, - 'code' => ' 'Generic.Arrays.DisallowLongArraySyntax', - 'expected' => 'F', - ], - 'No colors: E: has fixer conflict' => [ - 'colors' => false, - 'code' => ' 'Generic.Arrays.DisallowLongArraySyntax,Generic.Arrays.DisallowShortArraySyntax', - 'expected' => 'E', - ], - - 'Colors: Dot: no errors, no warnings (no color)' => [ - 'colors' => true, - 'code' => ' 'Generic.PHP.LowerCaseConstant', - 'expected' => '.', - ], - 'Colors: F: fixes made (green)' => [ - 'colors' => true, - 'code' => ' 'Generic.Arrays.DisallowLongArraySyntax', - 'expected' => "\033[32m".'F'."\033[0m", - ], - 'Colors: E: has fixer conflict (red)' => [ - 'colors' => true, - 'code' => ' 'Generic.Arrays.DisallowLongArraySyntax,Generic.Arrays.DisallowShortArraySyntax', - 'expected' => "\033[31m".'E'."\033[0m", - ], - ]; - - }//end dataProgressDotCbf() - - - /** - * Verify the correct progress indicator is used for a file in CBF mode. - * - * @param bool $colors Whether to enable colors or not. - * @param string $code Code snippet to process. - * @param string $sniffs Comma-separated list of sniff(s) to run against the code snippet. - * @param string $expected Expected output of the progress printer. - * @param bool $enableFixer Whether to fix the code or not. - * - * @return void - */ - private function checkProgressDot($colors, $code, $sniffs, $expected, $enableFixer=false) - { - $this->expectOutputString($expected); - - $config = new ConfigDouble(['-p']); - $config->colors = $colors; - $config->standards = ['Generic']; - $config->sniffs = explode(',', $sniffs); - $ruleset = new Ruleset($config); - - $runner = new Runner(); - $runner->config = $config; - - $file = new DummyFile($code, $ruleset, $config); - $file->process(); - - if ($enableFixer === true) { - $file->fixer->fixFile(); - } - - $runner->printProgress($file, 2, 1); - - }//end checkProgressDot() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Runner/PrintProgressTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Runner/PrintProgressTest.php deleted file mode 100644 index 89480fb..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Runner/PrintProgressTest.php +++ /dev/null @@ -1,235 +0,0 @@ -standards = ['Generic']; - self::$config->sniffs = ['Generic.PHP.LowerCaseConstant']; - self::$ruleset = new Ruleset(self::$config); - - self::$runner = new Runner(); - self::$runner->config = self::$config; - - // Simple file which won't have any errors against the above sniff. - $content = 'process(); - - }//end initializeConfigRulesetRunner() - - - /** - * Reset some flags between tests. - * - * @after - * - * @return void - */ - protected function resetObjectFlags() - { - self::$config->showProgress = true; - self::$fileWithoutErrorsOrWarnings->ignored = false; - - }//end resetObjectFlags() - - - /** - * Destroy the Config object after the test to reset statics. - * - * @afterClass - * - * @return void - */ - public static function reset() - { - // Explicitly trigger __destruct() on the ConfigDouble to reset the Config statics. - // The explicit method call prevents potential stray test-local references to the $config object - // preventing the destructor from running the clean up (which without stray references would be - // automagically triggered when this object is destroyed, but we can't definitively rely on that). - self::$config->__destruct(); - - }//end reset() - - - /** - * Verify that if progress reporting is disabled, no progress dots will show. - * - * @return void - */ - public function testNoProgressIsShownWhenDisabled() - { - $this->expectOutputString(''); - - self::$config->showProgress = false; - - for ($i = 1; $i <= 10; $i++) { - self::$runner->printProgress(self::$fileWithoutErrorsOrWarnings, 3, $i); - } - - }//end testNoProgressIsShownWhenDisabled() - - - /** - * Verify ignored files will be marked with an "S" for "skipped". - * - * @return void - */ - public function testProgressDotSkippedFiles() - { - $nrOfFiles = 10; - $this->expectOutputString('.S.S.S.S.S 10 / 10 (100%)'.PHP_EOL); - - for ($i = 1; $i <= $nrOfFiles; $i++) { - if (($i % 2) === 0) { - self::$fileWithoutErrorsOrWarnings->ignored = true; - } else { - self::$fileWithoutErrorsOrWarnings->ignored = false; - } - - self::$runner->printProgress(self::$fileWithoutErrorsOrWarnings, $nrOfFiles, $i); - } - - }//end testProgressDotSkippedFiles() - - - /** - * Verify the handling of the summary at the end of each line. - * - * @param int $nrOfFiles The number of files in the scan. - * @param string $expected The expected progress information output. - * - * @dataProvider dataEndOfLineSummary - * - * @return void - */ - public function testEndOfLineSummary($nrOfFiles, $expected) - { - $this->expectOutputString($expected); - - for ($i = 1; $i <= $nrOfFiles; $i++) { - self::$runner->printProgress(self::$fileWithoutErrorsOrWarnings, $nrOfFiles, $i); - } - - }//end testEndOfLineSummary() - - - /** - * Data provider. - * - * @return array> - */ - public static function dataEndOfLineSummary() - { - $fullLineOfDots = str_repeat('.', 60); - - // phpcs:disable Squiz.Strings.ConcatenationSpacing.PaddingFound -- Favour test readability. - return [ - 'Less than 60 files (23)' => [ - 'nrOfFiles' => 23, - 'expected' => str_repeat('.', 23).' 23 / 23 (100%)'.PHP_EOL, - ], - 'Exactly 60 files' => [ - 'nrOfFiles' => 60, - 'expected' => $fullLineOfDots.' 60 / 60 (100%)'.PHP_EOL, - ], - 'Between 60 and 120 files (71)' => [ - 'nrOfFiles' => 71, - 'expected' => $fullLineOfDots.' 60 / 71 (85%)'.PHP_EOL - .str_repeat('.', 11).str_repeat(' ', 49).' 71 / 71 (100%)'.PHP_EOL, - ], - 'More than 120 files (162)' => [ - 'nrOfFiles' => 162, - 'expected' => $fullLineOfDots.' 60 / 162 (37%)'.PHP_EOL - .$fullLineOfDots.' 120 / 162 (74%)'.PHP_EOL - .str_repeat('.', 42).str_repeat(' ', 18).' 162 / 162 (100%)'.PHP_EOL, - ], - // More than anything, this tests that the padding of the numbers is handled correctly. - 'More than 1000 files (1234)' => [ - 'nrOfFiles' => 1234, - 'expected' => $fullLineOfDots.' 60 / 1234 (5%)'.PHP_EOL - .$fullLineOfDots.' 120 / 1234 (10%)'.PHP_EOL - .$fullLineOfDots.' 180 / 1234 (15%)'.PHP_EOL - .$fullLineOfDots.' 240 / 1234 (19%)'.PHP_EOL - .$fullLineOfDots.' 300 / 1234 (24%)'.PHP_EOL - .$fullLineOfDots.' 360 / 1234 (29%)'.PHP_EOL - .$fullLineOfDots.' 420 / 1234 (34%)'.PHP_EOL - .$fullLineOfDots.' 480 / 1234 (39%)'.PHP_EOL - .$fullLineOfDots.' 540 / 1234 (44%)'.PHP_EOL - .$fullLineOfDots.' 600 / 1234 (49%)'.PHP_EOL - .$fullLineOfDots.' 660 / 1234 (53%)'.PHP_EOL - .$fullLineOfDots.' 720 / 1234 (58%)'.PHP_EOL - .$fullLineOfDots.' 780 / 1234 (63%)'.PHP_EOL - .$fullLineOfDots.' 840 / 1234 (68%)'.PHP_EOL - .$fullLineOfDots.' 900 / 1234 (73%)'.PHP_EOL - .$fullLineOfDots.' 960 / 1234 (78%)'.PHP_EOL - .$fullLineOfDots.' 1020 / 1234 (83%)'.PHP_EOL - .$fullLineOfDots.' 1080 / 1234 (88%)'.PHP_EOL - .$fullLineOfDots.' 1140 / 1234 (92%)'.PHP_EOL - .$fullLineOfDots.' 1200 / 1234 (97%)'.PHP_EOL - .str_repeat('.', 34).str_repeat(' ', 26).' 1234 / 1234 (100%)'.PHP_EOL, - ], - ]; - // phpcs:enable - - }//end dataEndOfLineSummary() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Runner/RunPHPCSExplainTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Runner/RunPHPCSExplainTest.php deleted file mode 100644 index 64c1759..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Runner/RunPHPCSExplainTest.php +++ /dev/null @@ -1,73 +0,0 @@ - - * @copyright 2023 Juliette Reinders Folmer. All rights reserved. - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Runner; - -use PHP_CodeSniffer\Runner; -use PHP_CodeSniffer\Tests\Core\Runner\AbstractRunnerTestCase; - -/** - * Tests the wiring in of the explain functionality in the Runner class. - * - * @covers \PHP_CodeSniffer\Runner::runPHPCS - */ -final class RunPHPCSExplainTest extends AbstractRunnerTestCase -{ - - - /** - * Test that each standard passed on the command-line is explained separately. - * - * @return void - */ - public function testExplainWillExplainEachStandardSeparately() - { - if (PHP_CODESNIFFER_CBF === true) { - $this->markTestSkipped('This test needs CS mode to run'); - } - - $standard = dirname(__DIR__).'/Ruleset/ExplainSingleSniffTest.xml'; - $_SERVER['argv'] = [ - 'phpcs', - '-e', - "--standard=PSR1,$standard", - '--report-width=80', - ]; - - $expected = PHP_EOL; - $expected .= 'The PSR1 standard contains 8 sniffs'.PHP_EOL.PHP_EOL; - $expected .= 'Generic (4 sniffs)'.PHP_EOL; - $expected .= '------------------'.PHP_EOL; - $expected .= ' Generic.Files.ByteOrderMark'.PHP_EOL; - $expected .= ' Generic.NamingConventions.UpperCaseConstantName'.PHP_EOL; - $expected .= ' Generic.PHP.DisallowAlternativePHPTags'.PHP_EOL; - $expected .= ' Generic.PHP.DisallowShortOpenTag'.PHP_EOL.PHP_EOL; - $expected .= 'PSR1 (3 sniffs)'.PHP_EOL; - $expected .= '---------------'.PHP_EOL; - $expected .= ' PSR1.Classes.ClassDeclaration'.PHP_EOL; - $expected .= ' PSR1.Files.SideEffects'.PHP_EOL; - $expected .= ' PSR1.Methods.CamelCapsMethodName'.PHP_EOL.PHP_EOL; - $expected .= 'Squiz (1 sniff)'.PHP_EOL; - $expected .= '---------------'.PHP_EOL; - $expected .= ' Squiz.Classes.ValidClassName'.PHP_EOL.PHP_EOL; - - $expected .= 'The ExplainSingleSniffTest standard contains 1 sniff'.PHP_EOL.PHP_EOL; - $expected .= 'Squiz (1 sniff)'.PHP_EOL; - $expected .= '---------------'.PHP_EOL; - $expected .= ' Squiz.Scope.MethodScope'.PHP_EOL; - - $this->expectOutputString($expected); - - $runner = new Runner(); - $runner->runPHPCS(); - - }//end testExplainWillExplainEachStandardSeparately() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Runner/RunPHPCSGeneratorTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Runner/RunPHPCSGeneratorTest.php deleted file mode 100644 index 416de50..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Runner/RunPHPCSGeneratorTest.php +++ /dev/null @@ -1,72 +0,0 @@ -markTestSkipped('This test needs CS mode to run'); - } - - $standard = dirname(__DIR__).'/Generators/OneDocTest.xml'; - $_SERVER['argv'] = [ - 'phpcs', - '--generator=Text', - "--standard=$standard,PSR1", - '--report-width=80', - ]; - - $regex = '`^ - \R* # Optional blank line at the start. - (?: - (?P-++\R) # Line with dashes. - \|[ ]GENERATORTEST[ ]CODING[ ]STANDARD:[ ][^\|]+\|\R # Doc title line with prefix expected for first standard. - (?P>delimiter) # Line with dashes. - \R(?:[^\r\n]+\R)+\R{2} # Standard description. - ) # Only expect this group once. - (?: - (?P>delimiter) # Line with dashes. - \|[ ]PSR1[ ]CODING[ ]STANDARD:[ ][^\|]+\|\R # Doc title line with prefix expected for second standard. - (?P>delimiter) # Line with dashes. - \R(?:[^\r\n]+\R)+\R # Standard description. - (?: - -+[ ]CODE[ ]COMPARISON[ ]-+\R # Code Comparison starter line with dashes. - (?:(?:[^\r\n]+\R)+(?P>delimiter)){2} # Arbitrary text followed by a delimiter line. - )* # Code comparison is optional and can exist multiple times. - \R+ - ){3,} # This complete group should occur at least three times. - `x'; - - $this->expectOutputRegex($regex); - - $runner = new Runner(); - $runner->runPHPCS(); - - }//end testGeneratorWillShowEachStandardSeparately() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Sniffs/AbstractArraySniffTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Sniffs/AbstractArraySniffTest.inc deleted file mode 100644 index 4882295..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Sniffs/AbstractArraySniffTest.inc +++ /dev/null @@ -1,51 +0,0 @@ -1,'2'=>2,'3'=>3]; - -/* testMissingKeys */ -$foo = ['1'=>1,2,'3'=>3]; - -/* testMultiTokenKeys */ -$paths = array( - Init::ROOT_DIR.'/a' => 'a', - Init::ROOT_DIR.'/b' => 'b', -); - -/* testMissingKeysCoalesceTernary */ -return [ - $a => static function () { return [1,2,3]; }, - $b ?? $c, - $d ? [$e] : [$f], -]; - -/* testTernaryValues */ -$foo = [ - '1' => $row['status'] === 'rejected' - ? self::REJECTED_CODE - : self::VERIFIED_CODE, - '2' => in_array($row['status'], array('notverified', 'unverified'), true) - ? self::STATUS_PENDING - : self::STATUS_VERIFIED, - '3' => strtotime($row['date']), -]; - -/* testHeredocValues */ -$foo = array( - << '1', - 2 => fn ($x) => yield 'a' => $x, - 3 => '3', -); diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Sniffs/AbstractArraySniffTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Sniffs/AbstractArraySniffTest.php deleted file mode 100644 index a7679ff..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Sniffs/AbstractArraySniffTest.php +++ /dev/null @@ -1,297 +0,0 @@ - - * @copyright 2006-2020 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Sniffs; - -use PHP_CodeSniffer\Tests\Core\AbstractMethodUnitTest; - -/** - * Tests for the \PHP_CodeSniffer\Sniffs\AbstractArraySniff. - * - * @covers \PHP_CodeSniffer\Sniffs\AbstractArraySniff - */ -final class AbstractArraySniffTest extends AbstractMethodUnitTest -{ - - /** - * The sniff objects we are testing. - * - * This extends the \PHP_CodeSniffer\Sniffs\AbstractArraySniff class to make the - * internal workings of the sniff observable. - * - * @var \PHP_CodeSniffer\Tests\Core\Sniffs\AbstractArraySniffTestable - */ - protected static $sniff; - - - /** - * Initialize & tokenize \PHP_CodeSniffer\Files\File with code from the test case file. - * - * The test case file for a unit test class has to be in the same directory - * directory and use the same file name as the test class, using the .inc extension. - * - * @beforeClass - * - * @return void - */ - public static function initializeFile() - { - self::$sniff = new AbstractArraySniffTestable(); - parent::initializeFile(); - - }//end initializeFile() - - - /** - * Test an array of simple values only. - * - * @return void - */ - public function testSimpleValues() - { - $token = $this->getTargetToken('/* testSimpleValues */', T_OPEN_SHORT_ARRAY); - self::$sniff->process(self::$phpcsFile, $token); - - $expected = [ - 0 => ['value_start' => ($token + 1)], - 1 => ['value_start' => ($token + 3)], - 2 => ['value_start' => ($token + 5)], - ]; - - $this->assertSame($expected, self::$sniff->indicies); - - }//end testSimpleValues() - - - /** - * Test an array of simple keys and values. - * - * @return void - */ - public function testSimpleKeyValues() - { - $token = $this->getTargetToken('/* testSimpleKeyValues */', T_OPEN_SHORT_ARRAY); - self::$sniff->process(self::$phpcsFile, $token); - - $expected = [ - 0 => [ - 'index_start' => ($token + 1), - 'index_end' => ($token + 1), - 'arrow' => ($token + 2), - 'value_start' => ($token + 3), - ], - 1 => [ - 'index_start' => ($token + 5), - 'index_end' => ($token + 5), - 'arrow' => ($token + 6), - 'value_start' => ($token + 7), - ], - 2 => [ - 'index_start' => ($token + 9), - 'index_end' => ($token + 9), - 'arrow' => ($token + 10), - 'value_start' => ($token + 11), - ], - ]; - - $this->assertSame($expected, self::$sniff->indicies); - - }//end testSimpleKeyValues() - - - /** - * Test an array of simple keys and values. - * - * @return void - */ - public function testMissingKeys() - { - $token = $this->getTargetToken('/* testMissingKeys */', T_OPEN_SHORT_ARRAY); - self::$sniff->process(self::$phpcsFile, $token); - - $expected = [ - 0 => [ - 'index_start' => ($token + 1), - 'index_end' => ($token + 1), - 'arrow' => ($token + 2), - 'value_start' => ($token + 3), - ], - 1 => [ - 'value_start' => ($token + 5), - ], - 2 => [ - 'index_start' => ($token + 7), - 'index_end' => ($token + 7), - 'arrow' => ($token + 8), - 'value_start' => ($token + 9), - ], - ]; - - $this->assertSame($expected, self::$sniff->indicies); - - }//end testMissingKeys() - - - /** - * Test an array with keys that span multiple tokens. - * - * @return void - */ - public function testMultiTokenKeys() - { - $token = $this->getTargetToken('/* testMultiTokenKeys */', T_ARRAY); - self::$sniff->process(self::$phpcsFile, $token); - - $expected = [ - 0 => [ - 'index_start' => ($token + 4), - 'index_end' => ($token + 8), - 'arrow' => ($token + 10), - 'value_start' => ($token + 12), - ], - 1 => [ - 'index_start' => ($token + 16), - 'index_end' => ($token + 20), - 'arrow' => ($token + 22), - 'value_start' => ($token + 24), - ], - ]; - - $this->assertSame($expected, self::$sniff->indicies); - - }//end testMultiTokenKeys() - - - /** - * Test an array of simple keys and values. - * - * @return void - */ - public function testMissingKeysCoalesceTernary() - { - $token = $this->getTargetToken('/* testMissingKeysCoalesceTernary */', T_OPEN_SHORT_ARRAY); - self::$sniff->process(self::$phpcsFile, $token); - - $expected = [ - 0 => [ - 'index_start' => ($token + 3), - 'index_end' => ($token + 3), - 'arrow' => ($token + 5), - 'value_start' => ($token + 7), - ], - 1 => [ - 'value_start' => ($token + 31), - ], - 2 => [ - 'value_start' => ($token + 39), - ], - ]; - - $this->assertSame($expected, self::$sniff->indicies); - - }//end testMissingKeysCoalesceTernary() - - - /** - * Test an array of ternary values. - * - * @return void - */ - public function testTernaryValues() - { - $token = $this->getTargetToken('/* testTernaryValues */', T_OPEN_SHORT_ARRAY); - self::$sniff->process(self::$phpcsFile, $token); - - $expected = [ - 0 => [ - 'index_start' => ($token + 3), - 'index_end' => ($token + 3), - 'arrow' => ($token + 5), - 'value_start' => ($token + 7), - ], - 1 => [ - 'index_start' => ($token + 32), - 'index_end' => ($token + 32), - 'arrow' => ($token + 34), - 'value_start' => ($token + 36), - ], - 2 => [ - 'index_start' => ($token + 72), - 'index_end' => ($token + 72), - 'arrow' => ($token + 74), - 'value_start' => ($token + 76), - ], - ]; - - $this->assertSame($expected, self::$sniff->indicies); - - }//end testTernaryValues() - - - /** - * Test an array of heredocs. - * - * @return void - */ - public function testHeredocValues() - { - $token = $this->getTargetToken('/* testHeredocValues */', T_ARRAY); - self::$sniff->process(self::$phpcsFile, $token); - - $expected = [ - 0 => [ - 'value_start' => ($token + 4), - ], - 1 => [ - 'value_start' => ($token + 10), - ], - ]; - - $this->assertSame($expected, self::$sniff->indicies); - - }//end testHeredocValues() - - - /** - * Test an array of with an arrow function as a value. - * - * @return void - */ - public function testArrowFunctionValue() - { - $token = $this->getTargetToken('/* testArrowFunctionValue */', T_ARRAY); - self::$sniff->process(self::$phpcsFile, $token); - - $expected = [ - 0 => [ - 'index_start' => ($token + 4), - 'index_end' => ($token + 4), - 'arrow' => ($token + 6), - 'value_start' => ($token + 8), - ], - 1 => [ - 'index_start' => ($token + 12), - 'index_end' => ($token + 12), - 'arrow' => ($token + 14), - 'value_start' => ($token + 16), - ], - 2 => [ - 'index_start' => ($token + 34), - 'index_end' => ($token + 34), - 'arrow' => ($token + 36), - 'value_start' => ($token + 38), - ], - ]; - - $this->assertSame($expected, self::$sniff->indicies); - - }//end testArrowFunctionValue() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Sniffs/AbstractArraySniffTestable.php b/vendor/squizlabs/php_codesniffer/tests/Core/Sniffs/AbstractArraySniffTestable.php deleted file mode 100644 index 8a3d52a..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Sniffs/AbstractArraySniffTestable.php +++ /dev/null @@ -1,65 +0,0 @@ - - * @copyright 2006-2020 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Sniffs; - -use PHP_CodeSniffer\Sniffs\AbstractArraySniff; - -class AbstractArraySniffTestable extends AbstractArraySniff -{ - - /** - * The array indicies that were found during processing. - * - * @var array - */ - public $indicies = []; - - - /** - * Processes a single-line array definition. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being checked. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $arrayStart The token that starts the array definition. - * @param int $arrayEnd The token that ends the array definition. - * @param array $indices An array of token positions for the array keys, - * double arrows, and values. - * - * @return void - */ - public function processSingleLineArray($phpcsFile, $stackPtr, $arrayStart, $arrayEnd, $indices) - { - $this->indicies = $indices; - - }//end processSingleLineArray() - - - /** - * Processes a multi-line array definition. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being checked. - * @param int $stackPtr The position of the current token - * in the stack passed in $tokens. - * @param int $arrayStart The token that starts the array definition. - * @param int $arrayEnd The token that ends the array definition. - * @param array $indices An array of token positions for the array keys, - * double arrows, and values. - * - * @return void - */ - public function processMultiLineArray($phpcsFile, $stackPtr, $arrayStart, $arrayEnd, $indices) - { - $this->indicies = $indices; - - }//end processMultiLineArray() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Standards/StandardRulesetsQATest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Standards/StandardRulesetsQATest.php deleted file mode 100644 index 8d8c3a2..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Standards/StandardRulesetsQATest.php +++ /dev/null @@ -1,82 +0,0 @@ -assertSame('', $seenOutput); - - // Make sure sniffs were registered. - $this->assertGreaterThanOrEqual(1, count($ruleset->sniffCodes)); - - }//end testBuildInStandardsDoNotContainErrors() - - - /** - * Data provider. - * - * @see self::testBuildInStandardsDoNotContainErrors() - * - * @return array> - */ - public static function dataBuildInStandards() - { - // Get a list of all build-in, PHPCS native standards. - $sep = DIRECTORY_SEPARATOR; - $targetDir = dirname(dirname(dirname(__DIR__))).$sep.'src'.$sep.'Standards'.$sep; - $rulesetFiles = glob($targetDir.'*'.$sep.'ruleset.xml'); - - $data = []; - foreach ($rulesetFiles as $file) { - $standardName = basename(dirname($file)); - $data[$standardName] = [ - 'standard' => $standardName, - ]; - } - - return $data; - - }//end dataBuildInStandards() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/AbstractTokenizerTestCase.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/AbstractTokenizerTestCase.php deleted file mode 100644 index 1cff238..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/AbstractTokenizerTestCase.php +++ /dev/null @@ -1,147 +0,0 @@ - - * @copyright 2018-2019 Juliette Reinders Folmer. All rights reserved. - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers; - -use PHP_CodeSniffer\Files\DummyFile; -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Tests\ConfigDouble; -use PHP_CodeSniffer\Tests\Core\AbstractMethodUnitTest; -use PHPUnit\Framework\TestCase; -use ReflectionProperty; - -abstract class AbstractTokenizerTestCase extends TestCase -{ - - /** - * The file extension of the test case file (without leading dot). - * - * This allows child classes to overrule the default `inc` with, for instance, - * `js` or `css` when applicable. - * - * @var string - */ - protected $fileExtension = 'inc'; - - /** - * The tab width setting to use when tokenizing the file. - * - * This allows for test case files to use a different tab width than the default. - * - * @var integer - */ - protected $tabWidth = 4; - - /** - * The \PHP_CodeSniffer\Files\File object containing the parsed contents of the test case file. - * - * @var \PHP_CodeSniffer\Files\File - */ - protected $phpcsFile; - - - /** - * Initialize & tokenize \PHP_CodeSniffer\Files\File with code from the test case file. - * - * The test case file for a unit test class has to be in the same directory - * directory and use the same file name as the test class, using the .inc extension. - * - * @before - * - * @return void - */ - protected function initializeFile() - { - if (isset($this->phpcsFile) === false) { - $_SERVER['argv'] = []; - $config = new ConfigDouble(); - - // Also set a tab-width to enable testing tab-replaced vs `orig_content`. - $config->tabWidth = $this->tabWidth; - - $ruleset = new Ruleset($config); - - // Default to a file with the same name as the test class. Extension is property based. - $relativeCN = str_replace(__NAMESPACE__, '', get_called_class()); - $relativePath = str_replace('\\', DIRECTORY_SEPARATOR, $relativeCN); - $pathToTestFile = realpath(__DIR__).$relativePath.'.'.$this->fileExtension; - - // Make sure the file gets parsed correctly based on the file type. - $contents = 'phpcs_input_file: '.$pathToTestFile.PHP_EOL; - $contents .= file_get_contents($pathToTestFile); - - $this->phpcsFile = new DummyFile($contents, $ruleset, $config); - $this->phpcsFile->parse(); - }//end if - - }//end initializeFile() - - - /** - * Test QA: verify that a test case file does not contain any duplicate test markers. - * - * When a test case file contains a lot of test cases, it is easy to overlook that a test marker name - * is already in use. - * A test wouldn't necessarily fail on this, but would not be testing what is intended to be tested as - * it would be verifying token properties for the wrong token. - * - * This test safeguards against this. - * - * @coversNothing - * - * @return void - */ - public function testTestMarkersAreUnique() - { - AbstractMethodUnitTest::assertTestMarkersAreUnique($this->phpcsFile); - - }//end testTestMarkersAreUnique() - - - /** - * Get the token pointer for a target token based on a specific comment found on the line before. - * - * Note: the test delimiter comment MUST start with "/* test" to allow this function to - * distinguish between comments used *in* a test and test delimiters. - * - * @param string $commentString The delimiter comment to look for. - * @param int|string|array $tokenType The type of token(s) to look for. - * @param string $tokenContent Optional. The token content for the target token. - * - * @return int - */ - protected function getTargetToken($commentString, $tokenType, $tokenContent=null) - { - return AbstractMethodUnitTest::getTargetTokenFromFile($this->phpcsFile, $commentString, $tokenType, $tokenContent); - - }//end getTargetToken() - - - /** - * Clear the static "resolved tokens" cache property on the Tokenizer\PHP class. - * - * This method should be used selectively by tests to ensure the code under test is actually hit - * by the test testing the code. - * - * @return void - */ - public static function clearResolvedTokensCache() - { - $property = new ReflectionProperty('PHP_CodeSniffer\Tokenizers\PHP', 'resolveTokenCache'); - (PHP_VERSION_ID < 80100) && $property->setAccessible(true); - $property->setValue(null, []); - (PHP_VERSION_ID < 80100) && $property->setAccessible(false); - - }//end clearResolvedTokensCache() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Comment/CommentTestCase.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Comment/CommentTestCase.php deleted file mode 100644 index b0c0db5..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Comment/CommentTestCase.php +++ /dev/null @@ -1,117 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\Comment; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; -use PHP_CodeSniffer\Util\Tokens; - -/** - * Base class for testing DocBlock comment tokenization. - * - * @covers PHP_CodeSniffer\Tokenizers\Comment - */ -abstract class CommentTestCase extends AbstractTokenizerTestCase -{ - - - /** - * Test whether the docblock opener and closer have the expected extra keys. - * - * @param string $marker The comment prefacing the target token. - * @param int $closerOffset The offset of the closer from the opener. - * @param array $expectedTags The expected tags offsets array. - * - * @dataProvider dataDocblockOpenerCloser - * - * @return void - */ - public function testDocblockOpenerCloser($marker, $closerOffset, $expectedTags) - { - $tokens = $this->phpcsFile->getTokens(); - $target = $this->getTargetToken($marker, [T_DOC_COMMENT_OPEN_TAG]); - - $opener = $tokens[$target]; - - $this->assertArrayHasKey('comment_closer', $opener, 'Comment opener: comment_closer index is not set'); - $this->assertArrayHasKey('comment_tags', $opener, 'Comment opener: comment_tags index is not set'); - - $expectedCloser = ($target + $closerOffset); - $this->assertSame($expectedCloser, $opener['comment_closer'], 'Comment opener: comment_closer not set to the expected stack pointer'); - - // Update the tags expectations. - foreach ($expectedTags as $i => $ptr) { - $expectedTags[$i] += $target; - } - - $this->assertSame($expectedTags, $opener['comment_tags'], 'Comment opener: recorded tags do not match expected tags'); - - $closer = $tokens[$opener['comment_closer']]; - - $this->assertArrayHasKey('comment_opener', $closer, 'Comment closer: comment_opener index is not set'); - $this->assertSame($target, $closer['comment_opener'], 'Comment closer: comment_opener not set to the expected stack pointer'); - - }//end testDocblockOpenerCloser() - - - /** - * Data provider. - * - * @see testDocblockOpenerCloser() - * - * @return array>> - */ - abstract public static function dataDocblockOpenerCloser(); - - - /** - * Test helper. Check a token sequence complies with an expected token sequence. - * - * @param int $startPtr The position in the file to start checking from. - * @param array> $expectedSequence The consecutive token constants and their contents to expect. - * - * @return void - */ - protected function checkTokenSequence($startPtr, array $expectedSequence) - { - $tokens = $this->phpcsFile->getTokens(); - - $sequenceKey = 0; - $sequenceCount = count($expectedSequence); - - for ($i = $startPtr; $sequenceKey < $sequenceCount; $i++, $sequenceKey++) { - $currentItem = $expectedSequence[$sequenceKey]; - $expectedCode = key($currentItem); - $expectedType = Tokens::tokenName($expectedCode); - $expectedContent = current($currentItem); - $errorMsgSuffix = PHP_EOL.'(StackPtr: '.$i.' | Position in sequence: '.$sequenceKey.' | Expected: '.$expectedType.')'; - - $this->assertSame( - $expectedCode, - $tokens[$i]['code'], - 'Token tokenized as '.Tokens::tokenName($tokens[$i]['code']).', not '.$expectedType.' (code)'.$errorMsgSuffix - ); - - $this->assertSame( - $expectedType, - $tokens[$i]['type'], - 'Token tokenized as '.$tokens[$i]['type'].', not '.$expectedType.' (type)'.$errorMsgSuffix - ); - - $this->assertSame( - $expectedContent, - $tokens[$i]['content'], - 'Token content did not match expectations'.$errorMsgSuffix - ); - }//end for - - }//end checkTokenSequence() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Comment/LiveCoding1Test.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Comment/LiveCoding1Test.inc deleted file mode 100644 index a43c7d9..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Comment/LiveCoding1Test.inc +++ /dev/null @@ -1,6 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\Comment; - -/** - * Tests that unclosed docblocks during live coding are handled correctly. - * - * @covers PHP_CodeSniffer\Tokenizers\Comment - */ -final class LiveCoding1Test extends CommentTestCase -{ - - - /** - * Data provider. - * - * @see testDocblockOpenerCloser() - * - * @return array>> - */ - public static function dataDocblockOpenerCloser() - { - return [ - 'live coding: unclosed docblock, no blank line at end of file' => [ - 'marker' => '/* testLiveCoding */', - 'closerOffset' => 8, - 'expectedTags' => [], - ], - ]; - - }//end dataDocblockOpenerCloser() - - - /** - * Verify tokenization of the DocBlock. - * - * @phpcs:disable Squiz.Arrays.ArrayDeclaration.SpaceBeforeDoubleArrow -- Readability is better with alignment. - * - * @return void - */ - public function testLiveCoding() - { - $expectedSequence = [ - [T_DOC_COMMENT_OPEN_TAG => '/**'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'Unclosed docblock, live coding.... with no blank line at end of file.'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_CLOSE_TAG => '*'], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_DOC_COMMENT_OPEN_TAG); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testLiveCoding() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Comment/LiveCoding2Test.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Comment/LiveCoding2Test.inc deleted file mode 100644 index b113645..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Comment/LiveCoding2Test.inc +++ /dev/null @@ -1,5 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\Comment; - -/** - * Tests that unclosed docblocks during live coding are handled correctly. - * - * @covers PHP_CodeSniffer\Tokenizers\Comment - */ -final class LiveCoding2Test extends CommentTestCase -{ - - - /** - * Data provider. - * - * @see testDocblockOpenerCloser() - * - * @return array>> - */ - public static function dataDocblockOpenerCloser() - { - return [ - 'live coding: unclosed docblock with blank line at end of file' => [ - 'marker' => '/* testLiveCoding */', - 'closerOffset' => 7, - 'expectedTags' => [], - ], - ]; - - }//end dataDocblockOpenerCloser() - - - /** - * Verify tokenization of the DocBlock. - * - * @phpcs:disable Squiz.Arrays.ArrayDeclaration.SpaceBeforeDoubleArrow -- Readability is better with alignment. - * - * @return void - */ - public function testLiveCoding() - { - $expectedSequence = [ - [T_DOC_COMMENT_OPEN_TAG => '/**'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'Unclosed docblock, live coding.... with a blank line at end of file.'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_CLOSE_TAG => ''], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_DOC_COMMENT_OPEN_TAG); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testLiveCoding() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Comment/LiveCoding3Test.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Comment/LiveCoding3Test.inc deleted file mode 100644 index 9b81a43..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Comment/LiveCoding3Test.inc +++ /dev/null @@ -1,4 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\Comment; - -/** - * Tests that unclosed docblocks during live coding are handled correctly. - * - * @covers PHP_CodeSniffer\Tokenizers\Comment - */ -final class LiveCoding3Test extends CommentTestCase -{ - - - /** - * Data provider. - * - * @see testDocblockOpenerCloser() - * - * @return array>> - */ - public static function dataDocblockOpenerCloser() - { - return [ - 'live coding: unclosed docblock, no contents, no blank line at end of file' => [ - 'marker' => '/* testLiveCoding */', - 'closerOffset' => 1, - 'expectedTags' => [], - ], - ]; - - }//end dataDocblockOpenerCloser() - - - /** - * Verify tokenization of the DocBlock. - * - * @phpcs:disable Squiz.Arrays.ArrayDeclaration.SpaceBeforeDoubleArrow -- Readability is better with alignment. - * - * @return void - */ - public function testLiveCoding() - { - $expectedSequence = [ - [T_DOC_COMMENT_OPEN_TAG => '/**'], - [T_DOC_COMMENT_CLOSE_TAG => ''], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_DOC_COMMENT_OPEN_TAG); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testLiveCoding() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Comment/LiveCoding4Test.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Comment/LiveCoding4Test.inc deleted file mode 100644 index 1561e71..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Comment/LiveCoding4Test.inc +++ /dev/null @@ -1,7 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\Comment; - -/** - * Tests that unclosed docblocks during live coding are handled correctly. - * - * @covers PHP_CodeSniffer\Tokenizers\Comment - */ -final class LiveCoding4Test extends CommentTestCase -{ - - - /** - * Data provider. - * - * @see testDocblockOpenerCloser() - * - * @return array>> - */ - public static function dataDocblockOpenerCloser() - { - return [ - 'live coding: unclosed docblock, trailing whitespace on last line, no blank line at end of file' => [ - 'marker' => '/* testLiveCoding */', - 'closerOffset' => 15, - 'expectedTags' => [], - ], - ]; - - }//end dataDocblockOpenerCloser() - - - /** - * Verify tokenization of the DocBlock. - * - * @phpcs:disable Squiz.Arrays.ArrayDeclaration.SpaceBeforeDoubleArrow -- Readability is better with alignment. - * - * @return void - */ - public function testLiveCoding() - { - $expectedSequence = [ - [T_DOC_COMMENT_OPEN_TAG => '/**'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'The last line of this test must have trailing whitespace.'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'So, be careful when saving this file!'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_CLOSE_TAG => ''], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_DOC_COMMENT_OPEN_TAG); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testLiveCoding() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Comment/MultiLineDocBlockTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Comment/MultiLineDocBlockTest.inc deleted file mode 100644 index f33afcd..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Comment/MultiLineDocBlockTest.inc +++ /dev/null @@ -1,81 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\Comment; - -/** - * Tests that multiline docblocks are tokenized correctly. - * - * @covers PHP_CodeSniffer\Tokenizers\Comment - */ -final class MultiLineDocBlockTest extends CommentTestCase -{ - - - /** - * Data provider. - * - * @see testDocblockOpenerCloser() - * - * @return array>> - */ - public static function dataDocblockOpenerCloser() - { - return [ - 'Multi line docblock: no contents' => [ - 'marker' => '/* testEmptyDocblock */', - 'closerOffset' => 3, - 'expectedTags' => [], - ], - 'Multi line docblock: variety of text and tags' => [ - 'marker' => '/* testMultilineDocblock */', - 'closerOffset' => 95, - // phpcs:ignore Squiz.Arrays.ArrayDeclaration.SingleLineNotAllowed - 'expectedTags' => [21, 29, 36, 46, 56, 63, 73, 80, 90], - ], - 'Multi line docblock: no leading stars' => [ - 'marker' => '/* testMultilineDocblockNoStars */', - 'closerOffset' => 32, - // phpcs:ignore Squiz.Arrays.ArrayDeclaration.SingleLineNotAllowed - 'expectedTags' => [10, 16, 21, 27], - ], - 'Multi line docblock: indented' => [ - 'marker' => '/* testMultilineDocblockIndented */', - 'closerOffset' => 60, - // phpcs:ignore Squiz.Arrays.ArrayDeclaration.SingleLineNotAllowed - 'expectedTags' => [21, 28, 38, 45, 55], - ], - 'Multi line docblock: opener not on own line' => [ - 'marker' => '/* testMultilineDocblockOpenerNotOnOwnLine */', - 'closerOffset' => 10, - 'expectedTags' => [], - ], - 'Multi line docblock: closer not on own line' => [ - 'marker' => '/* testMultilineDocblockCloserNotOnOwnLine */', - 'closerOffset' => 11, - 'expectedTags' => [], - ], - 'Multi line docblock: stars not aligned' => [ - 'marker' => '/* testMultilineDocblockStarsNotAligned */', - 'closerOffset' => 26, - 'expectedTags' => [], - ], - ]; - - }//end dataDocblockOpenerCloser() - - - /** - * Verify tokenization of an empty, multi-line DocBlock. - * - * @phpcs:disable Squiz.Arrays.ArrayDeclaration.SpaceBeforeDoubleArrow -- Readability is better with alignment. - * - * @return void - */ - public function testEmptyDocblock() - { - $expectedSequence = [ - [T_DOC_COMMENT_OPEN_TAG => '/**'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_CLOSE_TAG => '*/'], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_DOC_COMMENT_OPEN_TAG); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testEmptyDocblock() - - - /** - * Verify tokenization of a multi-line DocBlock containing all possible tokens. - * - * @return void - */ - public function testMultilineDocblock() - { - $expectedSequence = [ - [T_DOC_COMMENT_OPEN_TAG => '/**'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'This is a multi-line docblock.'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'With blank lines, stars, tags, and tag descriptions.'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_TAG => '@tagWithoutDescription'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_TAG => '@since'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => '10.3'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_TAG => '@deprecated'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => '11.5'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_TAG => '@requires'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'PHP 7.1 -- PHPUnit tag.'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_TAG => '@tag-with-dashes-is-suppported'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'Description.'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_TAG => '@tag_with_underscores'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'Description.'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_TAG => '@param'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'string $p1 Description 1.'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_TAG => '@param'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'int|false $p2 Description 2.'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_TAG => '@return'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'void'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_CLOSE_TAG => '*/'], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_DOC_COMMENT_OPEN_TAG); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testMultilineDocblock() - - - /** - * Verify tokenization of a multi-line DocBlock with extra starts for the opener/closer and no stars on the lines between. - * - * @return void - */ - public function testMultilineDocblockNoStars() - { - $expectedSequence = [ - [T_DOC_COMMENT_OPEN_TAG => '/****'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'This is a multi-line docblock, but the lines are not marked with stars.'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'Then again, the opener and closer have an abundance of stars.'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_TAG => '@since'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => '10.3'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_TAG => '@param'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'string $p1 Description 1.'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_TAG => '@param'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'int|false $p2 Description 2.'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_TAG => '@return'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'void'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_CLOSE_TAG => '**/'], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_DOC_COMMENT_OPEN_TAG); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testMultilineDocblockNoStars() - - - /** - * Verify tokenization of a multi-line, indented DocBlock. - * - * @return void - */ - public function testMultilineDocblockIndented() - { - $expectedSequence = [ - [T_DOC_COMMENT_OPEN_TAG => '/**'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'This is a multi-line indented docblock.'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'With blank lines, stars, tags, and tag descriptions.'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_TAG => '@since'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => '10.3'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_TAG => '@deprecated'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => '11.5'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_TAG => '@param'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'string $p1 Description 1.'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_TAG => '@param'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'int|false $p2 Description 2.'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_TAG => '@return'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'void'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_CLOSE_TAG => '*/'], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_DOC_COMMENT_OPEN_TAG); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testMultilineDocblockIndented() - - - /** - * Verify tokenization of a multi-line DocBlock, where the opener is not on its own line. - * - * @return void - */ - public function testMultilineDocblockOpenerNotOnOwnLine() - { - $expectedSequence = [ - [T_DOC_COMMENT_OPEN_TAG => '/**'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'Start of description'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'description continued.'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_CLOSE_TAG => '*/'], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_DOC_COMMENT_OPEN_TAG); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testMultilineDocblockOpenerNotOnOwnLine() - - - /** - * Verify tokenization of a multi-line DocBlock, where the closer is not on its own line. - * - * @return void - */ - public function testMultilineDocblockCloserNotOnOwnLine() - { - $expectedSequence = [ - [T_DOC_COMMENT_OPEN_TAG => '/**'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'Start of description'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'description continued. '], - [T_DOC_COMMENT_CLOSE_TAG => '*/'], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_DOC_COMMENT_OPEN_TAG); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testMultilineDocblockCloserNotOnOwnLine() - - - /** - * Verify tokenization of a multi-line DocBlock with inconsistent indentation. - * - * @return void - */ - public function testMultilineDocblockStarsNotAligned() - { - $expectedSequence = [ - [T_DOC_COMMENT_OPEN_TAG => '/**'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'Start of description.'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'Line below this is missing a star.'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'Text'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'Star indented.'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'Closer indented.'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_CLOSE_TAG => '*/'], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_DOC_COMMENT_OPEN_TAG); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testMultilineDocblockStarsNotAligned() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Comment/PhpcsAnnotationsInDocBlockTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Comment/PhpcsAnnotationsInDocBlockTest.inc deleted file mode 100644 index d74f68d..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Comment/PhpcsAnnotationsInDocBlockTest.inc +++ /dev/null @@ -1,116 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\Comment; - -/** - * Tests that PHPCS native annotations in docblocks are tokenized correctly. - * - * @covers PHP_CodeSniffer\Tokenizers\Comment - */ -final class PhpcsAnnotationsInDocBlockTest extends CommentTestCase -{ - - - /** - * Data provider. - * - * @see testDocblockOpenerCloser() - * - * @return array>> - */ - public static function dataDocblockOpenerCloser() - { - return [ - 'Single-line: @phpcs:ignoreFile annotation' => [ - 'marker' => '/* testSingleLineDocIgnoreFileAnnotation */', - 'closerOffset' => 3, - 'expectedTags' => [], - ], - 'Single-line: @phpcs:ignore annotation' => [ - 'marker' => '/* testSingleLineDocIgnoreAnnotation */', - 'closerOffset' => 3, - 'expectedTags' => [], - ], - 'Single-line: @phpcs:disable annotation' => [ - 'marker' => '/* testSingleLineDocDisableAnnotation */', - 'closerOffset' => 3, - 'expectedTags' => [], - ], - 'Single-line: @phpcs:enable annotation; no whitespace' => [ - 'marker' => '/* testSingleLineDocEnableAnnotationNoWhitespace */', - 'closerOffset' => 2, - 'expectedTags' => [], - ], - - 'Multi-line: @phpcs:ignoreFile at the start' => [ - 'marker' => '/* testMultiLineDocIgnoreFileAnnotationAtStart */', - 'closerOffset' => 13, - 'expectedTags' => [], - ], - 'Multi-line: @phpcs:ignore at the start' => [ - 'marker' => '/* testMultiLineDocIgnoreAnnotationAtStart */', - 'closerOffset' => 13, - 'expectedTags' => [10], - ], - 'Multi-line: @phpcs:disable at the start' => [ - 'marker' => '/* testMultiLineDocDisableAnnotationAtStart */', - 'closerOffset' => 13, - 'expectedTags' => [], - ], - 'Multi-line: @phpcs:enable at the start' => [ - 'marker' => '/* testMultiLineDocEnableAnnotationAtStart */', - 'closerOffset' => 18, - 'expectedTags' => [13], - ], - - 'Multi-line: @phpcs:ignoreFile in the middle' => [ - 'marker' => '/* testMultiLineDocIgnoreFileAnnotationInMiddle */', - 'closerOffset' => 21, - 'expectedTags' => [], - ], - 'Multi-line: @phpcs:ignore in the middle' => [ - 'marker' => '/* testMultiLineDocIgnoreAnnotationInMiddle */', - 'closerOffset' => 23, - 'expectedTags' => [5], - ], - 'Multi-line: @phpcs:disable in the middle' => [ - 'marker' => '/* testMultiLineDocDisableAnnotationInMiddle */', - 'closerOffset' => 26, - 'expectedTags' => [21], - ], - 'Multi-line: @phpcs:enable in the middle' => [ - 'marker' => '/* testMultiLineDocEnableAnnotationInMiddle */', - 'closerOffset' => 24, - 'expectedTags' => [21], - ], - - 'Multi-line: @phpcs:ignoreFile at the end' => [ - 'marker' => '/* testMultiLineDocIgnoreFileAnnotationAtEnd */', - 'closerOffset' => 16, - 'expectedTags' => [5], - ], - 'Multi-line: @phpcs:ignore at the end' => [ - 'marker' => '/* testMultiLineDocIgnoreAnnotationAtEnd */', - 'closerOffset' => 16, - 'expectedTags' => [], - ], - 'Multi-line: @phpcs:disable at the end' => [ - 'marker' => '/* testMultiLineDocDisableAnnotationAtEnd */', - 'closerOffset' => 18, - 'expectedTags' => [5], - ], - 'Multi-line: @phpcs:enable at the end' => [ - 'marker' => '/* testMultiLineDocEnableAnnotationAtEnd */', - 'closerOffset' => 16, - 'expectedTags' => [], - ], - ]; - - }//end dataDocblockOpenerCloser() - - - /** - * Verify tokenization of a single line DocBlock containing a PHPCS ignoreFile annotation. - * - * @phpcs:disable Squiz.Arrays.ArrayDeclaration.SpaceBeforeDoubleArrow -- Readability is better with alignment. - * - * @return void - */ - public function testSingleLineDocIgnoreFileAnnotation() - { - $expectedSequence = [ - [T_DOC_COMMENT_OPEN_TAG => '/**'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_PHPCS_IGNORE_FILE => '@phpcs:ignoreFile '], - [T_DOC_COMMENT_CLOSE_TAG => '*/'], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_DOC_COMMENT_OPEN_TAG); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testSingleLineDocIgnoreFileAnnotation() - - - /** - * Verify tokenization of a single line DocBlock containing a PHPCS ignore annotation. - * - * @return void - */ - public function testSingleLineDocIgnoreAnnotation() - { - $expectedSequence = [ - [T_DOC_COMMENT_OPEN_TAG => '/**'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_PHPCS_IGNORE => '@phpcs:ignore Stnd.Cat.SniffName -- With reason '], - [T_DOC_COMMENT_CLOSE_TAG => '*/'], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_DOC_COMMENT_OPEN_TAG); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testSingleLineDocIgnoreAnnotation() - - - /** - * Verify tokenization of a single line DocBlock containing a PHPCS disable annotation. - * - * @return void - */ - public function testSingleLineDocDisableAnnotation() - { - $expectedSequence = [ - [T_DOC_COMMENT_OPEN_TAG => '/**'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_PHPCS_DISABLE => '@phpcs:disable Stnd.Cat.SniffName,Stnd.Other '], - [T_DOC_COMMENT_CLOSE_TAG => '*/'], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_DOC_COMMENT_OPEN_TAG); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testSingleLineDocDisableAnnotation() - - - /** - * Verify tokenization of a single line DocBlock containing a PHPCS enable annotation. - * - * @return void - */ - public function testSingleLineDocEnableAnnotationNoWhitespace() - { - $expectedSequence = [ - [T_DOC_COMMENT_OPEN_TAG => '/**'], - [T_PHPCS_ENABLE => '@phpcs:enable Stnd.Cat.SniffName'], - [T_DOC_COMMENT_CLOSE_TAG => '*/'], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_DOC_COMMENT_OPEN_TAG); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testSingleLineDocEnableAnnotationNoWhitespace() - - - /** - * Verify tokenization of a single line DocBlock containing a PHPCS ignoreFile annotation at the start. - * - * @return void - */ - public function testMultiLineDocIgnoreFileAnnotationAtStart() - { - $expectedSequence = [ - [T_DOC_COMMENT_OPEN_TAG => '/**'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_PHPCS_IGNORE_FILE => '@phpcs:ignoreFile'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'Something.'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_CLOSE_TAG => '*/'], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_DOC_COMMENT_OPEN_TAG); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testMultiLineDocIgnoreFileAnnotationAtStart() - - - /** - * Verify tokenization of a single line DocBlock containing a PHPCS ignore annotation at the start. - * - * @return void - */ - public function testMultiLineDocIgnoreAnnotationAtStart() - { - $expectedSequence = [ - [T_DOC_COMMENT_OPEN_TAG => '/**'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_PHPCS_IGNORE => '@phpcs:ignore Stnd.Cat.SniffName'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_TAG => '@tag'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_CLOSE_TAG => '*/'], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_DOC_COMMENT_OPEN_TAG); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testMultiLineDocIgnoreAnnotationAtStart() - - - /** - * Verify tokenization of a single line DocBlock containing a PHPCS disable annotation at the start. - * - * @return void - */ - public function testMultiLineDocDisableAnnotationAtStart() - { - $expectedSequence = [ - [T_DOC_COMMENT_OPEN_TAG => '/**'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_PHPCS_DISABLE => '@phpcs:disable Stnd.Cat.SniffName -- Ensure PHPCS annotations are also retokenized correctly.'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'Something.'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_CLOSE_TAG => '*/'], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_DOC_COMMENT_OPEN_TAG); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testMultiLineDocDisableAnnotationAtStart() - - - /** - * Verify tokenization of a single line DocBlock containing a PHPCS enable annotation at the start. - * - * @return void - */ - public function testMultiLineDocEnableAnnotationAtStart() - { - $expectedSequence = [ - [T_DOC_COMMENT_OPEN_TAG => '/**'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_PHPCS_ENABLE => '@phpcs:enable Stnd.Cat,Stnd.Other'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_TAG => '@tag'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'With description.'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_CLOSE_TAG => '*/'], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_DOC_COMMENT_OPEN_TAG); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testMultiLineDocEnableAnnotationAtStart() - - - /** - * Verify tokenization of a single line DocBlock containing a PHPCS ignoreFile annotation in the middle. - * - * @return void - */ - public function testMultiLineDocIgnoreFileAnnotationInMiddle() - { - $expectedSequence = [ - [T_DOC_COMMENT_OPEN_TAG => '/**'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'Check tokenization of PHPCS annotations within docblocks.'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_PHPCS_IGNORE_FILE => '@phpcs:ignoreFile'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'Something.'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_CLOSE_TAG => '*/'], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_DOC_COMMENT_OPEN_TAG); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testMultiLineDocIgnoreFileAnnotationInMiddle() - - - /** - * Verify tokenization of a single line DocBlock containing a PHPCS ignore annotation in the middle. - * - * @return void - */ - public function testMultiLineDocIgnoreAnnotationInMiddle() - { - $expectedSequence = [ - [T_DOC_COMMENT_OPEN_TAG => '/**'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_TAG => '@tagBefore'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'With Description'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_PHPCS_IGNORE => '@phpcs:ignore Stnd.Cat.SniffName'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'Something.'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_CLOSE_TAG => '*/'], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_DOC_COMMENT_OPEN_TAG); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testMultiLineDocIgnoreAnnotationInMiddle() - - - /** - * Verify tokenization of a single line DocBlock containing a PHPCS disable annotation in the middle. - * - * @return void - */ - public function testMultiLineDocDisableAnnotationInMiddle() - { - $expectedSequence = [ - [T_DOC_COMMENT_OPEN_TAG => '/**'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'Check tokenization of PHPCS annotations within docblocks.'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_PHPCS_DISABLE => '@phpcs:disable Stnd.Cat.SniffName -- Ensure PHPCS annotations are also retokenized correctly.'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_TAG => '@tagAfter'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'With Description'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_CLOSE_TAG => '*/'], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_DOC_COMMENT_OPEN_TAG); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testMultiLineDocDisableAnnotationInMiddle() - - - /** - * Verify tokenization of a single line DocBlock containing a PHPCS enable annotation in the middle. - * - * @return void - */ - public function testMultiLineDocEnableAnnotationInMiddle() - { - $expectedSequence = [ - [T_DOC_COMMENT_OPEN_TAG => '/**'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'Check tokenization of PHPCS annotations within docblocks.'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_PHPCS_ENABLE => '@phpcs:enable Stnd.Cat,Stnd.Other'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_TAG => '@tagAfter'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_CLOSE_TAG => '*/'], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_DOC_COMMENT_OPEN_TAG); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testMultiLineDocEnableAnnotationInMiddle() - - - /** - * Verify tokenization of a single line DocBlock containing a PHPCS ignoreFile annotation at the end. - * - * @return void - */ - public function testMultiLineDocIgnoreFileAnnotationAtEnd() - { - $expectedSequence = [ - [T_DOC_COMMENT_OPEN_TAG => '/**'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_TAG => '@tagBefore'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_PHPCS_IGNORE_FILE => '@phpcs:ignoreFile'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_CLOSE_TAG => '*/'], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_DOC_COMMENT_OPEN_TAG); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testMultiLineDocIgnoreFileAnnotationAtEnd() - - - /** - * Verify tokenization of a single line DocBlock containing a PHPCS ignore annotation at the end. - * - * @return void - */ - public function testMultiLineDocIgnoreAnnotationAtEnd() - { - $expectedSequence = [ - [T_DOC_COMMENT_OPEN_TAG => '/**'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'Check tokenization of PHPCS annotations within docblocks.'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_PHPCS_IGNORE => '@phpcs:ignore Stnd.Cat.SniffName'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_CLOSE_TAG => '*/'], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_DOC_COMMENT_OPEN_TAG); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testMultiLineDocIgnoreAnnotationAtEnd() - - - /** - * Verify tokenization of a single line DocBlock containing a PHPCS disable annotation at the end. - * - * @return void - */ - public function testMultiLineDocDisableAnnotationAtEnd() - { - $expectedSequence = [ - [T_DOC_COMMENT_OPEN_TAG => '/**'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_TAG => '@tagBefore'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'With Description.'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_PHPCS_DISABLE => '@phpcs:disable Stnd.Cat.SniffName -- Ensure PHPCS annotations are also retokenized correctly.'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_CLOSE_TAG => '*/'], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_DOC_COMMENT_OPEN_TAG); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testMultiLineDocDisableAnnotationAtEnd() - - - /** - * Verify tokenization of a single line DocBlock containing a PHPCS enable annotation at the end. - * - * @return void - */ - public function testMultiLineDocEnableAnnotationAtEnd() - { - $expectedSequence = [ - [T_DOC_COMMENT_OPEN_TAG => '/**'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'Check tokenization of PHPCS annotations within docblocks.'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STAR => '*'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_PHPCS_ENABLE => '@phpcs:enable Stnd.Cat,Stnd.Other'], - [T_DOC_COMMENT_WHITESPACE => "\n"], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_CLOSE_TAG => '*/'], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_DOC_COMMENT_OPEN_TAG); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testMultiLineDocEnableAnnotationAtEnd() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Comment/SingleLineDocBlockTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Comment/SingleLineDocBlockTest.inc deleted file mode 100644 index 88b05ea..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Comment/SingleLineDocBlockTest.inc +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\Comment; - -/** - * Tests that single line docblocks are tokenized correctly. - * - * @covers PHP_CodeSniffer\Tokenizers\Comment - */ -final class SingleLineDocBlockTest extends CommentTestCase -{ - - - /** - * Data provider. - * - * @see testDocblockOpenerCloser() - * - * @return array>> - */ - public static function dataDocblockOpenerCloser() - { - return [ - 'Single line docblock: empty, no whitespace' => [ - 'marker' => '/* testEmptyDocblockNoWhiteSpace */', - 'closerOffset' => 1, - 'expectedTags' => [], - ], - 'Single line docblock: only whitespace' => [ - 'marker' => '/* testEmptyDocblockWithWhiteSpace */', - 'closerOffset' => 2, - 'expectedTags' => [], - ], - 'Single line docblock: just text' => [ - 'marker' => '/* testSingleLineDocblockNoTag */', - 'closerOffset' => 3, - 'expectedTags' => [], - ], - 'Single line docblock: @var type before name' => [ - 'marker' => '/* testSingleLineDocblockWithTag1 */', - 'closerOffset' => 5, - 'expectedTags' => [2], - ], - 'Single line docblock: @var name before type' => [ - 'marker' => '/* testSingleLineDocblockWithTag2 */', - 'closerOffset' => 5, - 'expectedTags' => [2], - ], - 'Single line docblock: @see with description' => [ - 'marker' => '/* testSingleLineDocblockWithTag3 */', - 'closerOffset' => 5, - 'expectedTags' => [2], - ], - ]; - - }//end dataDocblockOpenerCloser() - - - /** - * Verify an empty block comment is tokenized as T_COMMENT, not as a docblock. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testEmptyBlockCommentNoWhiteSpace() - { - $expectedSequence = [ - [T_COMMENT => '/**/'], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', [T_COMMENT, T_DOC_COMMENT_OPEN_TAG]); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testEmptyBlockCommentNoWhiteSpace() - - - /** - * Verify tokenization of an empty, single line DocBlock without whitespace between the opener and closer. - * - * @phpcs:disable Squiz.Arrays.ArrayDeclaration.SpaceBeforeDoubleArrow -- Readability is better with alignment. - * - * @return void - */ - public function testEmptyDocblockNoWhiteSpace() - { - $expectedSequence = [ - [T_DOC_COMMENT_OPEN_TAG => '/**'], - [T_DOC_COMMENT_CLOSE_TAG => '*/'], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_DOC_COMMENT_OPEN_TAG); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testEmptyDocblockNoWhiteSpace() - - - /** - * Verify tokenization of an empty, single line DocBlock. - * - * @return void - */ - public function testEmptyDocblockWithWhiteSpace() - { - $expectedSequence = [ - [T_DOC_COMMENT_OPEN_TAG => '/**'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_CLOSE_TAG => '*/'], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_DOC_COMMENT_OPEN_TAG); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testEmptyDocblockWithWhiteSpace() - - - /** - * Verify tokenization of a single line DocBlock. - * - * @return void - */ - public function testSingleLineDocblockNoTag() - { - $expectedSequence = [ - [T_DOC_COMMENT_OPEN_TAG => '/**'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'Just some text '], - [T_DOC_COMMENT_CLOSE_TAG => '*/'], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_DOC_COMMENT_OPEN_TAG); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testSingleLineDocblockNoTag() - - - /** - * Verify tokenization of a single line DocBlock with a tag. - * - * @return void - */ - public function testSingleLineDocblockWithTag1() - { - $expectedSequence = [ - [T_DOC_COMMENT_OPEN_TAG => '/**'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_TAG => '@var'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => '\SomeClass[] $var '], - [T_DOC_COMMENT_CLOSE_TAG => '*/'], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_DOC_COMMENT_OPEN_TAG); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testSingleLineDocblockWithTag1() - - - /** - * Verify tokenization of a single line DocBlock with a tag. - * - * @return void - */ - public function testSingleLineDocblockWithTag2() - { - $expectedSequence = [ - [T_DOC_COMMENT_OPEN_TAG => '/**'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_TAG => '@var'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => '$var \SomeClass[] '], - [T_DOC_COMMENT_CLOSE_TAG => '*/'], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_DOC_COMMENT_OPEN_TAG); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testSingleLineDocblockWithTag2() - - - /** - * Verify tokenization of a single line DocBlock with a tag. - * - * @return void - */ - public function testSingleLineDocblockWithTag3() - { - $expectedSequence = [ - [T_DOC_COMMENT_OPEN_TAG => '/**'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_TAG => '@see'], - [T_DOC_COMMENT_WHITESPACE => ' '], - [T_DOC_COMMENT_STRING => 'Something::Else '], - [T_DOC_COMMENT_CLOSE_TAG => '*/'], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_DOC_COMMENT_OPEN_TAG); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testSingleLineDocblockWithTag3() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/AnonClassParenthesisOwnerTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/AnonClassParenthesisOwnerTest.inc deleted file mode 100644 index 3ee1afd..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/AnonClassParenthesisOwnerTest.inc +++ /dev/null @@ -1,29 +0,0 @@ - - * @copyright 2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\PHP; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; - -final class AnonClassParenthesisOwnerTest extends AbstractTokenizerTestCase -{ - - - /** - * Test that anonymous class tokens without parenthesis do not get assigned a parenthesis owner. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * - * @dataProvider dataAnonClassNoParentheses - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testAnonClassNoParentheses($testMarker) - { - $tokens = $this->phpcsFile->getTokens(); - - $anonClass = $this->getTargetToken($testMarker, T_ANON_CLASS); - $this->assertArrayNotHasKey('parenthesis_owner', $tokens[$anonClass]); - $this->assertArrayNotHasKey('parenthesis_opener', $tokens[$anonClass]); - $this->assertArrayNotHasKey('parenthesis_closer', $tokens[$anonClass]); - - }//end testAnonClassNoParentheses() - - - /** - * Test that the next open/close parenthesis after an anonymous class without parenthesis - * do not get assigned the anonymous class as a parenthesis owner. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * - * @dataProvider dataAnonClassNoParentheses - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testAnonClassNoParenthesesNextOpenClose($testMarker) - { - $tokens = $this->phpcsFile->getTokens(); - $function = $this->getTargetToken($testMarker, T_FUNCTION); - - $opener = $this->getTargetToken($testMarker, T_OPEN_PARENTHESIS); - $this->assertArrayHasKey('parenthesis_owner', $tokens[$opener]); - $this->assertSame($function, $tokens[$opener]['parenthesis_owner']); - - $closer = $this->getTargetToken($testMarker, T_CLOSE_PARENTHESIS); - $this->assertArrayHasKey('parenthesis_owner', $tokens[$closer]); - $this->assertSame($function, $tokens[$closer]['parenthesis_owner']); - - }//end testAnonClassNoParenthesesNextOpenClose() - - - /** - * Data provider. - * - * @see testAnonClassNoParentheses() - * @see testAnonClassNoParenthesesNextOpenClose() - * - * @return array> - */ - public static function dataAnonClassNoParentheses() - { - return [ - 'plain' => [ - 'testMarker' => '/* testNoParentheses */', - ], - 'readonly' => [ - 'testMarker' => '/* testReadonlyNoParentheses */', - ], - 'declaration contains comments and extra whitespace' => [ - 'testMarker' => '/* testNoParenthesesAndEmptyTokens */', - ], - ]; - - }//end dataAnonClassNoParentheses() - - - /** - * Test that anonymous class tokens with parenthesis get assigned a parenthesis owner, - * opener and closer; and that the opener/closer get the anonymous class assigned as owner. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * - * @dataProvider dataAnonClassWithParentheses - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testAnonClassWithParentheses($testMarker) - { - $tokens = $this->phpcsFile->getTokens(); - $anonClass = $this->getTargetToken($testMarker, T_ANON_CLASS); - $opener = $this->getTargetToken($testMarker, T_OPEN_PARENTHESIS); - $closer = $this->getTargetToken($testMarker, T_CLOSE_PARENTHESIS); - - $this->assertArrayHasKey('parenthesis_owner', $tokens[$anonClass]); - $this->assertArrayHasKey('parenthesis_opener', $tokens[$anonClass]); - $this->assertArrayHasKey('parenthesis_closer', $tokens[$anonClass]); - $this->assertSame($anonClass, $tokens[$anonClass]['parenthesis_owner']); - $this->assertSame($opener, $tokens[$anonClass]['parenthesis_opener']); - $this->assertSame($closer, $tokens[$anonClass]['parenthesis_closer']); - - $this->assertArrayHasKey('parenthesis_owner', $tokens[$opener]); - $this->assertArrayHasKey('parenthesis_opener', $tokens[$opener]); - $this->assertArrayHasKey('parenthesis_closer', $tokens[$opener]); - $this->assertSame($anonClass, $tokens[$opener]['parenthesis_owner']); - $this->assertSame($opener, $tokens[$opener]['parenthesis_opener']); - $this->assertSame($closer, $tokens[$opener]['parenthesis_closer']); - - $this->assertArrayHasKey('parenthesis_owner', $tokens[$closer]); - $this->assertArrayHasKey('parenthesis_opener', $tokens[$closer]); - $this->assertArrayHasKey('parenthesis_closer', $tokens[$closer]); - $this->assertSame($anonClass, $tokens[$closer]['parenthesis_owner']); - $this->assertSame($opener, $tokens[$closer]['parenthesis_opener']); - $this->assertSame($closer, $tokens[$closer]['parenthesis_closer']); - - }//end testAnonClassWithParentheses() - - - /** - * Data provider. - * - * @see testAnonClassWithParentheses() - * - * @return array> - */ - public static function dataAnonClassWithParentheses() - { - return [ - 'plain' => [ - 'testMarker' => '/* testWithParentheses */', - ], - 'readonly' => [ - 'testMarker' => '/* testReadonlyWithParentheses */', - ], - 'declaration contains comments and extra whitespace' => [ - 'testMarker' => '/* testWithParenthesesAndEmptyTokens */', - ], - ]; - - }//end dataAnonClassWithParentheses() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ArrayKeywordTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ArrayKeywordTest.inc deleted file mode 100644 index 6d8adfc..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ArrayKeywordTest.inc +++ /dev/null @@ -1,58 +0,0 @@ - 10); - -/* testArrayWithComment */ -$var = Array /*comment*/ (1 => 10); - -/* testNestingArray */ -$var = array( - /* testNestedArray */ - array( - 'key' => 'value', - - /* testClosureReturnType */ - 'closure' => function($a) use($global) : Array {}, - ), -); - -/* testFunctionDeclarationParamType */ -function typedParam(array $a) {} - -/* testFunctionDeclarationReturnType */ -function returnType($a) : int|array|null {} - -class Bar { - /* testClassConst */ - const ARRAY = []; - - /* testClassMethod */ - public function array() {} - - /* testOOConstType */ - const array /* testTypedOOConstName */ ARRAY = /* testOOConstDefault */ array(); - - /* testOOPropertyType */ - protected array $property; -} - -class DNFTypes { - /* testOOConstDNFType */ - const (A&B)|array|(C&D) NAME = []; - - /* testOOPropertyDNFType */ - protected (A&B)|ARRAY|null $property; - - /* testFunctionDeclarationParamDNFType */ - public function name(null|array|(A&B) $param) { - /* testClosureDeclarationParamDNFType */ - $cl = function ( array|(A&B) $param) {}; - - /* testArrowDeclarationReturnDNFType */ - $arrow = fn($a): (A&B)|Array => new $a; - } -} diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ArrayKeywordTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ArrayKeywordTest.php deleted file mode 100644 index 61941b0..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ArrayKeywordTest.php +++ /dev/null @@ -1,200 +0,0 @@ - - * @copyright 2021 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\PHP; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; - -final class ArrayKeywordTest extends AbstractTokenizerTestCase -{ - - - /** - * Test that the array keyword is correctly tokenized as `T_ARRAY`. - * - * @param string $testMarker The comment prefacing the target token. - * @param string $testContent Optional. The token content to look for. - * - * @dataProvider dataArrayKeyword - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testArrayKeyword($testMarker, $testContent='array') - { - $tokens = $this->phpcsFile->getTokens(); - - $token = $this->getTargetToken($testMarker, [T_ARRAY, T_STRING], $testContent); - $tokenArray = $tokens[$token]; - - $this->assertSame(T_ARRAY, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_ARRAY (code)'); - $this->assertSame('T_ARRAY', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_ARRAY (type)'); - - }//end testArrayKeyword() - - - /** - * Data provider. - * - * @see testArrayKeyword() - * - * @return array> - */ - public static function dataArrayKeyword() - { - return [ - 'empty array' => [ - 'testMarker' => '/* testEmptyArray */', - ], - 'array with space before parenthesis' => [ - 'testMarker' => '/* testArrayWithSpace */', - ], - 'array with comment before parenthesis' => [ - 'testMarker' => '/* testArrayWithComment */', - 'testContent' => 'Array', - ], - 'nested: outer array' => [ - 'testMarker' => '/* testNestingArray */', - ], - 'nested: inner array' => [ - 'testMarker' => '/* testNestedArray */', - ], - 'OO constant default value' => [ - 'testMarker' => '/* testOOConstDefault */', - ], - ]; - - }//end dataArrayKeyword() - - - /** - * Test that the array keyword when used in a type declaration is correctly tokenized as `T_STRING`. - * - * @param string $testMarker The comment prefacing the target token. - * @param string $testContent Optional. The token content to look for. - * - * @dataProvider dataArrayType - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testArrayType($testMarker, $testContent='array') - { - $tokens = $this->phpcsFile->getTokens(); - - $token = $this->getTargetToken($testMarker, [T_ARRAY, T_STRING], $testContent); - $tokenArray = $tokens[$token]; - - $this->assertSame(T_STRING, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_STRING (code)'); - $this->assertSame('T_STRING', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_STRING (type)'); - - }//end testArrayType() - - - /** - * Data provider. - * - * @see testArrayType() - * - * @return array> - */ - public static function dataArrayType() - { - return [ - 'closure return type' => [ - 'testMarker' => '/* testClosureReturnType */', - 'testContent' => 'Array', - ], - 'function param type' => [ - 'testMarker' => '/* testFunctionDeclarationParamType */', - ], - 'function union return type' => [ - 'testMarker' => '/* testFunctionDeclarationReturnType */', - ], - 'OO constant type' => [ - 'testMarker' => '/* testOOConstType */', - ], - 'OO property type' => [ - 'testMarker' => '/* testOOPropertyType */', - ], - - 'OO constant DNF type' => [ - 'testMarker' => '/* testOOConstDNFType */', - ], - 'OO property DNF type' => [ - 'testMarker' => '/* testOOPropertyDNFType */', - 'testContent' => 'ARRAY', - ], - 'function param DNF type' => [ - 'testMarker' => '/* testFunctionDeclarationParamDNFType */', - ], - 'closure param DNF type' => [ - 'testMarker' => '/* testClosureDeclarationParamDNFType */', - ], - 'arrow return DNF type' => [ - 'testMarker' => '/* testArrowDeclarationReturnDNFType */', - 'testContent' => 'Array', - ], - ]; - - }//end dataArrayType() - - - /** - * Verify that the retokenization of `T_ARRAY` tokens to `T_STRING` is handled correctly - * for tokens with the contents 'array' which aren't in actual fact the array keyword. - * - * @param string $testMarker The comment prefacing the target token. - * @param string $testContent The token content to look for. - * - * @dataProvider dataNotArrayKeyword - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testNotArrayKeyword($testMarker, $testContent='array') - { - $tokens = $this->phpcsFile->getTokens(); - - $token = $this->getTargetToken($testMarker, [T_ARRAY, T_STRING], $testContent); - $tokenArray = $tokens[$token]; - - $this->assertSame(T_STRING, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_STRING (code)'); - $this->assertSame('T_STRING', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_STRING (type)'); - - }//end testNotArrayKeyword() - - - /** - * Data provider. - * - * @see testNotArrayKeyword() - * - * @return array> - */ - public static function dataNotArrayKeyword() - { - return [ - 'class-constant-name' => [ - 'testMarker' => '/* testClassConst */', - 'testContent' => 'ARRAY', - ], - 'class-method-name' => [ - 'testMarker' => '/* testClassMethod */', - ], - 'class-constant-name-after-type' => [ - 'testMarker' => '/* testTypedOOConstName */', - 'testContent' => 'ARRAY', - ], - ]; - - }//end dataNotArrayKeyword() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/AttributesParseError1Test.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/AttributesParseError1Test.inc deleted file mode 100644 index 3c57b67..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/AttributesParseError1Test.inc +++ /dev/null @@ -1,8 +0,0 @@ - - * @author Juliette Reinders Folmer - * @copyright 2019-2023 Squiz Pty Ltd (ABN 77 084 670 600) - * @copyright 2023 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\PHP; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; - -final class AttributesParseError1Test extends AbstractTokenizerTestCase -{ - - - /** - * Test that invalid attribute (or comment starting with #[ and without ]) are parsed correctly - * and that tokens "within" the attribute are not removed. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * @covers PHP_CodeSniffer\Tokenizers\PHP::findCloser - * @covers PHP_CodeSniffer\Tokenizers\PHP::parsePhpAttribute - * - * @return void - */ - public function testInvalidAttribute() - { - $tokens = $this->phpcsFile->getTokens(); - - $attribute = $this->getTargetToken('/* testInvalidAttribute */', T_ATTRIBUTE); - - $this->assertArrayHasKey('attribute_closer', $tokens[$attribute]); - $this->assertNull($tokens[$attribute]['attribute_closer']); - - $expectedTokenCodes = [ - 'T_ATTRIBUTE', - 'T_STRING', - 'T_WHITESPACE', - 'T_FUNCTION', - ]; - $length = count($expectedTokenCodes); - - $map = array_map( - function ($token) { - if ($token['code'] === T_ATTRIBUTE) { - $this->assertArrayHasKey('attribute_closer', $token); - $this->assertNull($token['attribute_closer']); - } else { - $this->assertArrayNotHasKey('attribute_closer', $token); - } - - return $token['type']; - }, - array_slice($tokens, $attribute, $length) - ); - - $this->assertSame($expectedTokenCodes, $map); - - }//end testInvalidAttribute() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/AttributesParseError2Test.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/AttributesParseError2Test.inc deleted file mode 100644 index a6468d3..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/AttributesParseError2Test.inc +++ /dev/null @@ -1,8 +0,0 @@ -phpcsFile->getTokens(); - - $attribute = $this->getTargetToken('/* testLiveCoding */', T_ATTRIBUTE); - - $this->assertArrayHasKey('attribute_closer', $tokens[$attribute]); - $this->assertNull($tokens[$attribute]['attribute_closer']); - - $expectedTokenCodes = [ - 'T_ATTRIBUTE', - 'T_STRING', - 'T_OPEN_PARENTHESIS', - 'T_LNUMBER', - 'T_CLOSE_PARENTHESIS', - 'T_WHITESPACE', - 'T_FUNCTION', - ]; - - $length = count($expectedTokenCodes); - - $map = array_map( - function ($token) { - if ($token['code'] === T_ATTRIBUTE) { - $this->assertArrayHasKey('attribute_closer', $token); - $this->assertNull($token['attribute_closer']); - } else { - $this->assertArrayNotHasKey('attribute_closer', $token); - } - - return $token['type']; - }, - array_slice($tokens, $attribute, $length) - ); - - $this->assertSame($expectedTokenCodes, $map); - - }//end testInvalidAttribute() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/AttributesParseError3Test.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/AttributesParseError3Test.inc deleted file mode 100644 index 1b65a0f..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/AttributesParseError3Test.inc +++ /dev/null @@ -1,10 +0,0 @@ -phpcsFile->getTokens(); - - $attribute = $this->getTargetToken('/* testLiveCoding */', T_ATTRIBUTE); - - $this->assertArrayHasKey('attribute_closer', $tokens[$attribute]); - $this->assertNull($tokens[$attribute]['attribute_closer']); - - $expectedTokenCodes = [ - 'T_ATTRIBUTE', - 'T_STRING', - 'T_OPEN_PARENTHESIS', - 'T_LNUMBER', - 'T_CLOSE_PARENTHESIS', - 'T_COMMA', - 'T_WHITESPACE', - 'T_STRING', - 'T_OPEN_PARENTHESIS', - 'T_WHITESPACE', - 'T_WHITESPACE', - 'T_PUBLIC', - 'T_WHITESPACE', - 'T_FINAL', - 'T_WHITESPACE', - 'T_FUNCTION', - ]; - - $length = count($expectedTokenCodes); - - $map = array_map( - function ($token) { - if ($token['code'] === T_ATTRIBUTE) { - $this->assertArrayHasKey('attribute_closer', $token); - $this->assertNull($token['attribute_closer']); - } else { - $this->assertArrayNotHasKey('attribute_closer', $token); - } - - return $token['type']; - }, - array_slice($tokens, $attribute, $length) - ); - - $this->assertSame($expectedTokenCodes, $map); - - }//end testInvalidAttribute() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/AttributesParseError4Test.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/AttributesParseError4Test.inc deleted file mode 100644 index 8a5c3f1..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/AttributesParseError4Test.inc +++ /dev/null @@ -1,8 +0,0 @@ -phpcsFile->getTokens(); - - $attribute = $this->getTargetToken('/* testLiveCoding */', T_ATTRIBUTE); - - $expectedTokenCodesAttribute1 = [ - 'T_ATTRIBUTE', - 'T_STRING', - 'T_ATTRIBUTE_END', - 'T_WHITESPACE', - ]; - - $lengthAttribute1 = count($expectedTokenCodesAttribute1); - - $map = array_map( - function ($token) use ($attribute, $lengthAttribute1) { - if ($token['code'] !== T_WHITESPACE) { - $this->assertArrayHasKey('attribute_closer', $token); - $this->assertSame(($attribute + 2), $token['attribute_closer']); - } - - return $token['type']; - }, - array_slice($tokens, $attribute, $lengthAttribute1) - ); - - $this->assertSame($expectedTokenCodesAttribute1, $map); - - $expectedTokenCodesAttribute2 = [ - 'T_ATTRIBUTE', - 'T_STRING', - 'T_WHITESPACE', - 'T_FUNCTION', - ]; - - $lengthAttribute2 = count($expectedTokenCodesAttribute2); - - $map = array_map( - function ($token) { - if ($token['code'] === T_ATTRIBUTE) { - $this->assertArrayHasKey('attribute_closer', $token); - $this->assertNull($token['attribute_closer']); - } else { - $this->assertArrayNotHasKey('attribute_closer', $token); - } - - return $token['type']; - }, - array_slice($tokens, ($attribute + $lengthAttribute1), $lengthAttribute2) - ); - - $this->assertSame($expectedTokenCodesAttribute2, $map); - - }//end testInvalidAttribute() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/AttributesTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/AttributesTest.inc deleted file mode 100644 index c44c026..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/AttributesTest.inc +++ /dev/null @@ -1,86 +0,0 @@ - 'foobar'])] -function attribute_with_params_on_function_test() {} - -/* testAttributeWithShortClosureParameter */ -#[AttributeWithParams(static fn ($value) => ! $value)] -function attribute_with_short_closure_param_test() {} - -/* testTwoAttributeOnTheSameLine */ -#[CustomAttribute] #[AttributeWithParams('foo')] -function two_attribute_on_same_line_test() {} - -/* testAttributeAndCommentOnTheSameLine */ -#[CustomAttribute] // This is a comment -function attribute_and_line_comment_on_same_line_test() {} - -/* testAttributeGrouping */ -#[CustomAttribute, AttributeWithParams('foo'), AttributeWithParams('foo', bar: ['bar' => 'foobar'])] -function attribute_grouping_test() {} - -/* testAttributeMultiline */ -#[ - CustomAttribute, - AttributeWithParams('foo'), - AttributeWithParams('foo', bar: ['bar' => 'foobar']) -] -function attribute_multiline_test() {} - -/* testAttributeMultilineWithComment */ -#[ - CustomAttribute, // comment - AttributeWithParams(/* another comment */ 'foo'), - AttributeWithParams('foo', bar: ['bar' => 'foobar']) -] -function attribute_multiline_with_comment_test() {} - -/* testSingleAttributeOnParameter */ -function single_attribute_on_parameter_test(#[ParamAttribute] int $param) {} - -/* testMultipleAttributesOnParameter */ -function multiple_attributes_on_parameter_test(#[ParamAttribute, AttributeWithParams(/* another comment */ 'foo')] array $param) {} - -/* testFqcnAttribute */ -#[Boo\QualifiedName, \Foo\FullyQualifiedName('foo')] -function fqcn_attribute_test() {} - -/* testNestedAttributes */ -#[Boo\QualifiedName(fn (#[AttributeOne('boo')] $value) => (string) $value)] -function nested_attributes_test() {} - -/* testMultilineAttributesOnParameter */ -function multiline_attributes_on_parameter_test(#[ - AttributeWithParams( - 'foo' - ) - ] null $param) {} - -/* testAttributeContainingTextLookingLikeCloseTag */ -#[DeprecationReason('reason: ')] -function attribute_containing_text_looking_like_close_tag() {} - -/* testAttributeContainingMultilineTextLookingLikeCloseTag */ -#[DeprecationReason( - 'reason: ' -)] -function attribute_containing_mulitline_text_looking_like_close_tag() {} diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/AttributesTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/AttributesTest.php deleted file mode 100644 index ec42fe6..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/AttributesTest.php +++ /dev/null @@ -1,702 +0,0 @@ - - * @copyright 2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\PHP; - -use PHP_CodeSniffer\Util\Tokens; -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; - -final class AttributesTest extends AbstractTokenizerTestCase -{ - - - /** - * Test that attributes are parsed correctly. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * @param array $tokenCodes The codes of tokens inside the attributes. - * @param int|string $expectedFirstAfter The expected token code for the first token after the attribute. - * - * @dataProvider dataAttribute - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * @covers PHP_CodeSniffer\Tokenizers\PHP::findCloser - * @covers PHP_CodeSniffer\Tokenizers\PHP::parsePhpAttribute - * - * @return void - */ - public function testAttribute($testMarker, $tokenCodes, $expectedFirstAfter) - { - $tokens = $this->phpcsFile->getTokens(); - - // Calculate the number of tokens between opener and closer (excluding the opener, including the closer). - $length = (count($tokenCodes) + 1); - - $attribute = $this->getTargetToken($testMarker, T_ATTRIBUTE); - $this->assertArrayHasKey('attribute_closer', $tokens[$attribute]); - - $closer = $tokens[$attribute]['attribute_closer']; - $this->assertSame(($attribute + $length), $closer); - - $this->assertSame(T_ATTRIBUTE_END, $tokens[$closer]['code']); - - $this->assertSame($tokens[$attribute]['attribute_opener'], $tokens[$closer]['attribute_opener']); - $this->assertSame($tokens[$attribute]['attribute_closer'], $tokens[$closer]['attribute_closer']); - - $map = array_map( - function ($token) use ($attribute, $length) { - $this->assertArrayHasKey('attribute_closer', $token); - $this->assertSame(($attribute + $length), $token['attribute_closer']); - - return $token['code']; - }, - array_slice($tokens, ($attribute + 1), ($length - 1)) - ); - - $this->assertSame($tokenCodes, $map); - - $actualFirstAfter = $this->phpcsFile->findNext(Tokens::$emptyTokens, ($closer + 1), null, true); - $this->assertSame($expectedFirstAfter, $tokens[$actualFirstAfter]['code']); - - }//end testAttribute() - - - /** - * Data provider. - * - * @see testAttribute() - * - * @return array>> - */ - public static function dataAttribute() - { - return [ - 'class attribute' => [ - 'testMarker' => '/* testAttribute */', - 'tokenCodes' => [ - T_STRING, - ], - 'expectedFirstAfter' => T_CLASS, - ], - 'class attribute with param' => [ - 'testMarker' => '/* testAttributeWithParams */', - 'tokenCodes' => [ - T_STRING, - T_OPEN_PARENTHESIS, - T_STRING, - T_DOUBLE_COLON, - T_STRING, - T_CLOSE_PARENTHESIS, - ], - 'expectedFirstAfter' => T_CLASS, - ], - 'class attribute with named param' => [ - 'testMarker' => '/* testAttributeWithNamedParam */', - 'tokenCodes' => [ - T_STRING, - T_OPEN_PARENTHESIS, - T_PARAM_NAME, - T_COLON, - T_WHITESPACE, - T_STRING, - T_DOUBLE_COLON, - T_STRING, - T_CLOSE_PARENTHESIS, - ], - 'expectedFirstAfter' => T_CLASS, - ], - 'function attribute' => [ - 'testMarker' => '/* testAttributeOnFunction */', - 'tokenCodes' => [ - T_STRING, - ], - 'expectedFirstAfter' => T_FUNCTION, - ], - 'function attribute with params' => [ - 'testMarker' => '/* testAttributeOnFunctionWithParams */', - 'tokenCodes' => [ - T_STRING, - T_OPEN_PARENTHESIS, - T_CONSTANT_ENCAPSED_STRING, - T_COMMA, - T_WHITESPACE, - T_PARAM_NAME, - T_COLON, - T_WHITESPACE, - T_OPEN_SHORT_ARRAY, - T_CONSTANT_ENCAPSED_STRING, - T_WHITESPACE, - T_DOUBLE_ARROW, - T_WHITESPACE, - T_CONSTANT_ENCAPSED_STRING, - T_CLOSE_SHORT_ARRAY, - T_CLOSE_PARENTHESIS, - ], - 'expectedFirstAfter' => T_FUNCTION, - ], - 'function attribute with arrow function as param' => [ - 'testMarker' => '/* testAttributeWithShortClosureParameter */', - 'tokenCodes' => [ - T_STRING, - T_OPEN_PARENTHESIS, - T_STATIC, - T_WHITESPACE, - T_FN, - T_WHITESPACE, - T_OPEN_PARENTHESIS, - T_VARIABLE, - T_CLOSE_PARENTHESIS, - T_WHITESPACE, - T_FN_ARROW, - T_WHITESPACE, - T_BOOLEAN_NOT, - T_WHITESPACE, - T_VARIABLE, - T_CLOSE_PARENTHESIS, - ], - 'expectedFirstAfter' => T_FUNCTION, - ], - 'function attribute; multiple comma separated classes' => [ - 'testMarker' => '/* testAttributeGrouping */', - 'tokenCodes' => [ - T_STRING, - T_COMMA, - T_WHITESPACE, - T_STRING, - T_OPEN_PARENTHESIS, - T_CONSTANT_ENCAPSED_STRING, - T_CLOSE_PARENTHESIS, - T_COMMA, - T_WHITESPACE, - T_STRING, - T_OPEN_PARENTHESIS, - T_CONSTANT_ENCAPSED_STRING, - T_COMMA, - T_WHITESPACE, - T_PARAM_NAME, - T_COLON, - T_WHITESPACE, - T_OPEN_SHORT_ARRAY, - T_CONSTANT_ENCAPSED_STRING, - T_WHITESPACE, - T_DOUBLE_ARROW, - T_WHITESPACE, - T_CONSTANT_ENCAPSED_STRING, - T_CLOSE_SHORT_ARRAY, - T_CLOSE_PARENTHESIS, - ], - 'expectedFirstAfter' => T_FUNCTION, - ], - 'function attribute; multiple comma separated classes, one per line' => [ - 'testMarker' => '/* testAttributeMultiline */', - 'tokenCodes' => [ - T_WHITESPACE, - T_WHITESPACE, - T_STRING, - T_COMMA, - T_WHITESPACE, - T_WHITESPACE, - T_STRING, - T_OPEN_PARENTHESIS, - T_CONSTANT_ENCAPSED_STRING, - T_CLOSE_PARENTHESIS, - T_COMMA, - T_WHITESPACE, - T_WHITESPACE, - T_STRING, - T_OPEN_PARENTHESIS, - T_CONSTANT_ENCAPSED_STRING, - T_COMMA, - T_WHITESPACE, - T_PARAM_NAME, - T_COLON, - T_WHITESPACE, - T_OPEN_SHORT_ARRAY, - T_CONSTANT_ENCAPSED_STRING, - T_WHITESPACE, - T_DOUBLE_ARROW, - T_WHITESPACE, - T_CONSTANT_ENCAPSED_STRING, - T_CLOSE_SHORT_ARRAY, - T_CLOSE_PARENTHESIS, - T_WHITESPACE, - ], - 'expectedFirstAfter' => T_FUNCTION, - ], - 'function attribute; multiple comma separated classes, one per line, with comments' => [ - 'testMarker' => '/* testAttributeMultilineWithComment */', - 'tokenCodes' => [ - T_WHITESPACE, - T_WHITESPACE, - T_STRING, - T_COMMA, - T_WHITESPACE, - T_COMMENT, - T_WHITESPACE, - T_STRING, - T_OPEN_PARENTHESIS, - T_COMMENT, - T_WHITESPACE, - T_CONSTANT_ENCAPSED_STRING, - T_CLOSE_PARENTHESIS, - T_COMMA, - T_WHITESPACE, - T_WHITESPACE, - T_STRING, - T_OPEN_PARENTHESIS, - T_CONSTANT_ENCAPSED_STRING, - T_COMMA, - T_WHITESPACE, - T_PARAM_NAME, - T_COLON, - T_WHITESPACE, - T_OPEN_SHORT_ARRAY, - T_CONSTANT_ENCAPSED_STRING, - T_WHITESPACE, - T_DOUBLE_ARROW, - T_WHITESPACE, - T_CONSTANT_ENCAPSED_STRING, - T_CLOSE_SHORT_ARRAY, - T_CLOSE_PARENTHESIS, - T_WHITESPACE, - ], - 'expectedFirstAfter' => T_FUNCTION, - ], - 'function attribute; using partially qualified and fully qualified class names' => [ - 'testMarker' => '/* testFqcnAttribute */', - 'tokenCodes' => [ - T_STRING, - T_NS_SEPARATOR, - T_STRING, - T_COMMA, - T_WHITESPACE, - T_NS_SEPARATOR, - T_STRING, - T_NS_SEPARATOR, - T_STRING, - T_OPEN_PARENTHESIS, - T_CONSTANT_ENCAPSED_STRING, - T_CLOSE_PARENTHESIS, - ], - 'expectedFirstAfter' => T_FUNCTION, - ], - ]; - - }//end dataAttribute() - - - /** - * Test that multiple attributes on the same line are parsed correctly. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * @covers PHP_CodeSniffer\Tokenizers\PHP::findCloser - * @covers PHP_CodeSniffer\Tokenizers\PHP::parsePhpAttribute - * - * @return void - */ - public function testTwoAttributesOnTheSameLine() - { - $tokens = $this->phpcsFile->getTokens(); - - $attribute = $this->getTargetToken('/* testTwoAttributeOnTheSameLine */', T_ATTRIBUTE); - $this->assertArrayHasKey('attribute_closer', $tokens[$attribute]); - - $closer = $tokens[$attribute]['attribute_closer']; - $this->assertSame(T_WHITESPACE, $tokens[($closer + 1)]['code']); - $this->assertSame(T_ATTRIBUTE, $tokens[($closer + 2)]['code']); - $this->assertArrayHasKey('attribute_closer', $tokens[($closer + 2)]); - - }//end testTwoAttributesOnTheSameLine() - - - /** - * Test that attribute followed by a line comment is parsed correctly. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * @covers PHP_CodeSniffer\Tokenizers\PHP::findCloser - * @covers PHP_CodeSniffer\Tokenizers\PHP::parsePhpAttribute - * - * @return void - */ - public function testAttributeAndLineComment() - { - $tokens = $this->phpcsFile->getTokens(); - - $attribute = $this->getTargetToken('/* testAttributeAndCommentOnTheSameLine */', T_ATTRIBUTE); - $this->assertArrayHasKey('attribute_closer', $tokens[$attribute]); - - $closer = $tokens[$attribute]['attribute_closer']; - $this->assertSame(T_WHITESPACE, $tokens[($closer + 1)]['code']); - $this->assertSame(T_COMMENT, $tokens[($closer + 2)]['code']); - - }//end testAttributeAndLineComment() - - - /** - * Test that attributes on function declaration parameters are parsed correctly. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * @param int $position The token position (starting from T_FUNCTION) of T_ATTRIBUTE token. - * @param array $tokenCodes The codes of tokens inside the attributes. - * @param int|string $expectedFirstAfter The expected token code for the first token after the attribute. - * @param string $expectedFirstAfterContent The expected token code for the first token after the attribute. - * - * @dataProvider dataAttributeOnParameters - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * @covers PHP_CodeSniffer\Tokenizers\PHP::findCloser - * @covers PHP_CodeSniffer\Tokenizers\PHP::parsePhpAttribute - * - * @return void - */ - public function testAttributeOnParameters($testMarker, $position, array $tokenCodes, $expectedFirstAfter, $expectedFirstAfterContent) - { - $tokens = $this->phpcsFile->getTokens(); - - // Calculate the number of tokens between opener and closer (excluding the opener, including the closer). - $length = (count($tokenCodes) + 1); - - $function = $this->getTargetToken($testMarker, T_FUNCTION); - $attribute = ($function + $position); - - $this->assertSame(T_ATTRIBUTE, $tokens[$attribute]['code']); - $this->assertArrayHasKey('attribute_closer', $tokens[$attribute]); - - $this->assertSame(($attribute + $length), $tokens[$attribute]['attribute_closer']); - - $closer = $tokens[$attribute]['attribute_closer']; - $this->assertSame(T_WHITESPACE, $tokens[($closer + 1)]['code']); - $this->assertSame($expectedFirstAfter, $tokens[($closer + 2)]['code']); - $this->assertSame($expectedFirstAfterContent, $tokens[($closer + 2)]['content']); - - $this->assertSame(T_VARIABLE, $tokens[($closer + 4)]['code']); - $this->assertSame('$param', $tokens[($closer + 4)]['content']); - - $map = array_map( - function ($token) use ($attribute, $length) { - $this->assertArrayHasKey('attribute_closer', $token); - $this->assertSame(($attribute + $length), $token['attribute_closer']); - - return $token['code']; - }, - array_slice($tokens, ($attribute + 1), ($length - 1)) - ); - - $this->assertSame($tokenCodes, $map); - - }//end testAttributeOnParameters() - - - /** - * Data provider. - * - * @see testAttributeOnParameters() - * - * @return array>> - */ - public static function dataAttributeOnParameters() - { - return [ - 'parameter attribute; single, inline' => [ - 'testMarker' => '/* testSingleAttributeOnParameter */', - 'position' => 4, - 'tokenCodes' => [ - T_STRING, - ], - 'expectedFirstAfter' => T_STRING, - 'expectedFirstAfterContent' => 'int', - ], - 'parameter attribute; multiple comma separated, inline' => [ - 'testMarker' => '/* testMultipleAttributesOnParameter */', - 'position' => 4, - 'tokenCodes' => [ - T_STRING, - T_COMMA, - T_WHITESPACE, - T_STRING, - T_OPEN_PARENTHESIS, - T_COMMENT, - T_WHITESPACE, - T_CONSTANT_ENCAPSED_STRING, - T_CLOSE_PARENTHESIS, - ], - 'expectedFirstAfter' => T_STRING, - 'expectedFirstAfterContent' => 'array', - ], - 'parameter attribute; single, multiline' => [ - 'testMarker' => '/* testMultilineAttributesOnParameter */', - 'position' => 4, - 'tokenCodes' => [ - T_WHITESPACE, - T_WHITESPACE, - T_STRING, - T_OPEN_PARENTHESIS, - T_WHITESPACE, - T_WHITESPACE, - T_CONSTANT_ENCAPSED_STRING, - T_WHITESPACE, - T_WHITESPACE, - T_CLOSE_PARENTHESIS, - T_WHITESPACE, - T_WHITESPACE, - ], - 'expectedFirstAfter' => T_NULL, - 'expectedFirstAfterContent' => 'null', - ], - ]; - - }//end dataAttributeOnParameters() - - - /** - * Test that an attribute containing text which looks like a PHP close tag is tokenized correctly. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * @param array> $expectedTokensAttribute The codes of tokens inside the attributes. - * @param array $expectedTokensAfter The codes of tokens after the attributes. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::parsePhpAttribute - * - * @dataProvider dataAttributeOnTextLookingLikeCloseTag - * - * @return void - */ - public function testAttributeContainingTextLookingLikeCloseTag($testMarker, array $expectedTokensAttribute, array $expectedTokensAfter) - { - $tokens = $this->phpcsFile->getTokens(); - - // Calculate the number of tokens between opener and closer (excluding the opener, including the closer). - $length = count($expectedTokensAttribute); - - $attribute = $this->getTargetToken($testMarker, T_ATTRIBUTE); - - $this->assertSame('T_ATTRIBUTE', $tokens[$attribute]['type']); - $this->assertArrayHasKey('attribute_closer', $tokens[$attribute]); - - $closer = $tokens[$attribute]['attribute_closer']; - $this->assertSame(($attribute + $length), $closer); - $this->assertSame(T_ATTRIBUTE_END, $tokens[$closer]['code']); - $this->assertSame('T_ATTRIBUTE_END', $tokens[$closer]['type']); - - $this->assertSame($tokens[$attribute]['attribute_opener'], $tokens[$closer]['attribute_opener']); - $this->assertSame($tokens[$attribute]['attribute_closer'], $tokens[$closer]['attribute_closer']); - - $i = ($attribute + 1); - foreach ($expectedTokensAttribute as $item) { - list($expectedType, $expectedContents) = $item; - $this->assertSame($expectedType, $tokens[$i]['type']); - $this->assertSame($expectedContents, $tokens[$i]['content']); - $this->assertArrayHasKey('attribute_opener', $tokens[$i]); - $this->assertArrayHasKey('attribute_closer', $tokens[$i]); - ++$i; - } - - $i = ($closer + 1); - foreach ($expectedTokensAfter as $expectedCode) { - $this->assertSame($expectedCode, $tokens[$i]['code']); - ++$i; - } - - }//end testAttributeContainingTextLookingLikeCloseTag() - - - /** - * Data provider. - * - * @see dataAttributeOnTextLookingLikeCloseTag() - * - * @return array>|array>> - */ - public static function dataAttributeOnTextLookingLikeCloseTag() - { - return [ - 'function attribute; string param with "?>"' => [ - 'testMarker' => '/* testAttributeContainingTextLookingLikeCloseTag */', - 'expectedTokensAttribute' => [ - [ - 'T_STRING', - 'DeprecationReason', - ], - [ - 'T_OPEN_PARENTHESIS', - '(', - ], - [ - 'T_CONSTANT_ENCAPSED_STRING', - "'reason: '", - ], - [ - 'T_CLOSE_PARENTHESIS', - ')', - ], - [ - 'T_ATTRIBUTE_END', - ']', - ], - ], - 'expectedTokensAfter' => [ - T_WHITESPACE, - T_FUNCTION, - T_WHITESPACE, - T_STRING, - T_OPEN_PARENTHESIS, - T_CLOSE_PARENTHESIS, - T_WHITESPACE, - T_OPEN_CURLY_BRACKET, - T_CLOSE_CURLY_BRACKET, - ], - ], - 'function attribute; string param with "?>"; multiline' => [ - 'testMarker' => '/* testAttributeContainingMultilineTextLookingLikeCloseTag */', - 'expectedTokensAttribute' => [ - [ - 'T_STRING', - 'DeprecationReason', - ], - [ - 'T_OPEN_PARENTHESIS', - '(', - ], - [ - 'T_WHITESPACE', - "\n", - ], - [ - 'T_WHITESPACE', - " ", - ], - [ - 'T_CONSTANT_ENCAPSED_STRING', - "'reason: '", - ], - [ - 'T_WHITESPACE', - "\n", - ], - [ - 'T_CLOSE_PARENTHESIS', - ')', - ], - [ - 'T_ATTRIBUTE_END', - ']', - ], - ], - 'expectedTokensAfter' => [ - T_WHITESPACE, - T_FUNCTION, - T_WHITESPACE, - T_STRING, - T_OPEN_PARENTHESIS, - T_CLOSE_PARENTHESIS, - T_WHITESPACE, - T_OPEN_CURLY_BRACKET, - T_CLOSE_CURLY_BRACKET, - ], - ], - ]; - - }//end dataAttributeOnTextLookingLikeCloseTag() - - - /** - * Test that nested attributes are parsed correctly. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * @covers PHP_CodeSniffer\Tokenizers\PHP::findCloser - * @covers PHP_CodeSniffer\Tokenizers\PHP::parsePhpAttribute - * @covers PHP_CodeSniffer\Tokenizers\PHP::createAttributesNestingMap - * - * @return void - */ - public function testNestedAttributes() - { - $tokens = $this->phpcsFile->getTokens(); - $tokenCodes = [ - T_STRING, - T_NS_SEPARATOR, - T_STRING, - T_OPEN_PARENTHESIS, - T_FN, - T_WHITESPACE, - T_OPEN_PARENTHESIS, - T_ATTRIBUTE, - T_STRING, - T_OPEN_PARENTHESIS, - T_CONSTANT_ENCAPSED_STRING, - T_CLOSE_PARENTHESIS, - T_ATTRIBUTE_END, - T_WHITESPACE, - T_VARIABLE, - T_CLOSE_PARENTHESIS, - T_WHITESPACE, - T_FN_ARROW, - T_WHITESPACE, - T_STRING_CAST, - T_WHITESPACE, - T_VARIABLE, - T_CLOSE_PARENTHESIS, - ]; - - // Calculate the number of tokens between opener and closer (excluding the opener, including the closer). - $outerAttributeLength = (count($tokenCodes) + 1); - - $attribute = $this->getTargetToken('/* testNestedAttributes */', T_ATTRIBUTE); - $this->assertArrayHasKey('attribute_closer', $tokens[$attribute]); - - $closer = $tokens[$attribute]['attribute_closer']; - $this->assertSame(($attribute + $outerAttributeLength), $closer); - - $this->assertSame(T_ATTRIBUTE_END, $tokens[$closer]['code']); - - $this->assertSame($tokens[$attribute]['attribute_opener'], $tokens[$closer]['attribute_opener']); - $this->assertSame($tokens[$attribute]['attribute_closer'], $tokens[$closer]['attribute_closer']); - - $this->assertArrayNotHasKey('nested_attributes', $tokens[$attribute]); - $this->assertArrayHasKey('nested_attributes', $tokens[($attribute + 8)]); - $this->assertSame([$attribute => ($attribute + $outerAttributeLength)], $tokens[($attribute + 8)]['nested_attributes']); - - $test = function (array $tokens, $outerAttributeLength, $nestedMap) use ($attribute) { - foreach ($tokens as $token) { - $this->assertArrayHasKey('attribute_closer', $token); - $this->assertSame(($attribute + $outerAttributeLength), $token['attribute_closer']); - $this->assertSame($nestedMap, $token['nested_attributes']); - } - }; - - // Length here is 8 (nested attribute offset) + 5 (real length). - $innerAttributeLength = (8 + 5); - - $test(array_slice($tokens, ($attribute + 1), 7), $outerAttributeLength, [$attribute => $attribute + $outerAttributeLength]); - $test(array_slice($tokens, ($attribute + 8), 1), $innerAttributeLength, [$attribute => $attribute + $outerAttributeLength]); - - $test( - array_slice($tokens, ($attribute + 9), 4), - $innerAttributeLength, - [ - $attribute => $attribute + $outerAttributeLength, - $attribute + 8 => $attribute + 13, - ] - ); - - $test(array_slice($tokens, ($attribute + 13), 1), $innerAttributeLength, [$attribute => $attribute + $outerAttributeLength]); - $test(array_slice($tokens, ($attribute + 14), 10), $outerAttributeLength, [$attribute => $attribute + $outerAttributeLength]); - - $map = array_map( - static function ($token) { - return $token['code']; - }, - array_slice($tokens, ($attribute + 1), ($outerAttributeLength - 1)) - ); - - $this->assertSame($tokenCodes, $map); - - }//end testNestedAttributes() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillAsymmetricVisibilityTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillAsymmetricVisibilityTest.inc deleted file mode 100644 index aaf050a..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillAsymmetricVisibilityTest.inc +++ /dev/null @@ -1,60 +0,0 @@ - - * @copyright 2025 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\PHP; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; - -/** - * Tests the support of PHP 8.4 asymmetric visibility. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - */ -final class BackfillAsymmetricVisibilityTest extends AbstractTokenizerTestCase -{ - - - /** - * Test that the asymmetric visibility keywords are tokenized as such. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * @param string $testType The expected token type. - * @param string $testContent The token content to look for. - * - * @dataProvider dataAsymmetricVisibility - * - * @return void - */ - public function testAsymmetricVisibility($testMarker, $testType, $testContent) - { - $tokens = $this->phpcsFile->getTokens(); - $target = $this->getTargetToken( - $testMarker, - [ - T_PUBLIC_SET, - T_PROTECTED_SET, - T_PRIVATE_SET, - ] - ); - $tokenArray = $tokens[$target]; - - $this->assertSame( - $testType, - $tokenArray['type'], - 'Token tokenized as '.$tokenArray['type'].' (type)' - ); - $this->assertSame( - constant($testType), - $tokenArray['code'], - 'Token tokenized as '.$tokenArray['type'].' (code)' - ); - $this->assertSame( - $testContent, - $tokenArray['content'], - 'Token tokenized as '.$tokenArray['type'].' (content)' - ); - - }//end testAsymmetricVisibility() - - - /** - * Data provider. - * - * @see testAsymmetricVisibility() - * - * @return array> - */ - public static function dataAsymmetricVisibility() - { - return [ - // Normal property declarations. - 'property, public set, no read visibility, lowercase' => [ - 'testMarker' => '/* testPublicSetProperty */', - 'testType' => 'T_PUBLIC_SET', - 'testContent' => 'public(set)', - ], - 'property, public set, no read visibility, uppercase' => [ - 'testMarker' => '/* testPublicSetPropertyUC */', - 'testType' => 'T_PUBLIC_SET', - 'testContent' => 'PUBLIC(SET)', - ], - 'property, public set, has read visibility, lowercase' => [ - 'testMarker' => '/* testPublicPublicSetProperty */', - 'testType' => 'T_PUBLIC_SET', - 'testContent' => 'public(set)', - ], - 'property, public set, has read visibility, uppercase' => [ - 'testMarker' => '/* testPublicPublicSetPropertyUC */', - 'testType' => 'T_PUBLIC_SET', - 'testContent' => 'PUBLIC(SET)', - ], - 'property, protected set, no read visibility, lowercase' => [ - 'testMarker' => '/* testProtectedSetProperty */', - 'testType' => 'T_PROTECTED_SET', - 'testContent' => 'protected(set)', - ], - 'property, protected set, no read visibility, uppercase' => [ - 'testMarker' => '/* testProtectedSetPropertyUC */', - 'testType' => 'T_PROTECTED_SET', - 'testContent' => 'PROTECTED(SET)', - ], - 'property, protected set, has read visibility, lowercase' => [ - 'testMarker' => '/* testPublicProtectedSetProperty */', - 'testType' => 'T_PROTECTED_SET', - 'testContent' => 'protected(set)', - ], - 'property, protected set, has read visibility, uppercase' => [ - 'testMarker' => '/* testPublicProtectedSetPropertyUC */', - 'testType' => 'T_PROTECTED_SET', - 'testContent' => 'PROTECTED(SET)', - ], - 'property, private set, no read visibility, lowercase' => [ - 'testMarker' => '/* testPrivateSetProperty */', - 'testType' => 'T_PRIVATE_SET', - 'testContent' => 'private(set)', - ], - 'property, private set, no read visibility, uppercase' => [ - 'testMarker' => '/* testPrivateSetPropertyUC */', - 'testType' => 'T_PRIVATE_SET', - 'testContent' => 'PRIVATE(SET)', - ], - 'property, private set, has read visibility, lowercase' => [ - 'testMarker' => '/* testPublicPrivateSetProperty */', - 'testType' => 'T_PRIVATE_SET', - 'testContent' => 'private(set)', - ], - 'property, private set, has read visibility, uppercase' => [ - 'testMarker' => '/* testPublicPrivateSetPropertyUC */', - 'testType' => 'T_PRIVATE_SET', - 'testContent' => 'PRIVATE(SET)', - ], - - // Constructor property promotion. - 'promotion, public set, no read visibility, lowercase' => [ - 'testMarker' => '/* testPublicSetCPP */', - 'testType' => 'T_PUBLIC_SET', - 'testContent' => 'public(set)', - ], - 'promotion, public set, no read visibility, uppercase' => [ - 'testMarker' => '/* testPublicSetCPPUC */', - 'testType' => 'T_PUBLIC_SET', - 'testContent' => 'PUBLIC(SET)', - ], - 'promotion, public set, has read visibility, lowercase' => [ - 'testMarker' => '/* testPublicPublicSetCPP */', - 'testType' => 'T_PUBLIC_SET', - 'testContent' => 'public(set)', - ], - 'promotion, public set, has read visibility, uppercase' => [ - 'testMarker' => '/* testPublicPublicSetCPPUC */', - 'testType' => 'T_PUBLIC_SET', - 'testContent' => 'PUBLIC(SET)', - ], - 'promotion, protected set, no read visibility, lowercase' => [ - 'testMarker' => '/* testProtectedSetCPP */', - 'testType' => 'T_PROTECTED_SET', - 'testContent' => 'protected(set)', - ], - 'promotion, protected set, no read visibility, uppercase' => [ - 'testMarker' => '/* testProtectedSetCPPUC */', - 'testType' => 'T_PROTECTED_SET', - 'testContent' => 'PROTECTED(SET)', - ], - 'promotion, protected set, has read visibility, lowercase' => [ - 'testMarker' => '/* testPublicProtectedSetCPP */', - 'testType' => 'T_PROTECTED_SET', - 'testContent' => 'protected(set)', - ], - 'promotion, protected set, has read visibility, uppercase' => [ - 'testMarker' => '/* testPublicProtectedSetCPPUC */', - 'testType' => 'T_PROTECTED_SET', - 'testContent' => 'PROTECTED(SET)', - ], - 'promotion, private set, no read visibility, lowercase' => [ - 'testMarker' => '/* testPrivateSetCPP */', - 'testType' => 'T_PRIVATE_SET', - 'testContent' => 'private(set)', - ], - 'promotion, private set, no read visibility, uppercase' => [ - 'testMarker' => '/* testPrivateSetCPPUC */', - 'testType' => 'T_PRIVATE_SET', - 'testContent' => 'PRIVATE(SET)', - ], - 'promotion, private set, has read visibility, lowercase' => [ - 'testMarker' => '/* testPublicPrivateSetCPP */', - 'testType' => 'T_PRIVATE_SET', - 'testContent' => 'private(set)', - ], - 'promotion, private set, has read visibility, uppercase' => [ - 'testMarker' => '/* testPublicPrivateSetCPPUC */', - 'testType' => 'T_PRIVATE_SET', - 'testContent' => 'PRIVATE(SET)', - ], - ]; - - }//end dataAsymmetricVisibility() - - - /** - * Test that things that are not asymmetric visibility keywords are not - * tokenized as such. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * @param string $testType The expected token type. - * @param string $testContent The token content to look for. - * - * @dataProvider dataNotAsymmetricVisibility - * - * @return void - */ - public function testNotAsymmetricVisibility($testMarker, $testType, $testContent) - { - $tokens = $this->phpcsFile->getTokens(); - $target = $this->getTargetToken( - $testMarker, - [constant($testType)], - $testContent - ); - $tokenArray = $tokens[$target]; - - $this->assertSame( - $testType, - $tokenArray['type'], - 'Token tokenized as '.$tokenArray['type'].' (type)' - ); - $this->assertSame( - constant($testType), - $tokenArray['code'], - 'Token tokenized as '.$tokenArray['type'].' (code)' - ); - - }//end testNotAsymmetricVisibility() - - - /** - * Data provider. - * - * @see testNotAsymmetricVisibility() - * - * @return array> - */ - public static function dataNotAsymmetricVisibility() - { - return [ - 'property, invalid case 1' => [ - 'testMarker' => '/* testInvalidUnsetProperty */', - 'testType' => 'T_PUBLIC', - 'testContent' => 'public', - ], - 'property, invalid case 2' => [ - 'testMarker' => '/* testInvalidSpaceProperty */', - 'testType' => 'T_PUBLIC', - 'testContent' => 'public', - ], - 'property, invalid case 3' => [ - 'testMarker' => '/* testInvalidCommentProperty */', - 'testType' => 'T_PROTECTED', - 'testContent' => 'protected', - ], - 'property, invalid case 4' => [ - 'testMarker' => '/* testInvalidGetProperty */', - 'testType' => 'T_PRIVATE', - 'testContent' => 'private', - ], - 'property, invalid case 5' => [ - 'testMarker' => '/* testInvalidNoParenProperty */', - 'testType' => 'T_PRIVATE', - 'testContent' => 'private', - ], - - // Constructor property promotion. - 'promotion, invalid case 1' => [ - 'testMarker' => '/* testInvalidUnsetCPP */', - 'testType' => 'T_PUBLIC', - 'testContent' => 'public', - ], - 'promotion, invalid case 2' => [ - 'testMarker' => '/* testInvalidSpaceCPP */', - 'testType' => 'T_PUBLIC', - 'testContent' => 'public', - ], - 'promotion, invalid case 3' => [ - 'testMarker' => '/* testInvalidCommentCPP */', - 'testType' => 'T_PROTECTED', - 'testContent' => 'protected', - ], - 'promotion, invalid case 4' => [ - 'testMarker' => '/* testInvalidGetCPP */', - 'testType' => 'T_PRIVATE', - 'testContent' => 'private', - ], - 'promotion, invalid case 5' => [ - 'testMarker' => '/* testInvalidNoParenCPP */', - 'testType' => 'T_PRIVATE', - 'testContent' => 'private', - ], - - // Context sensitivitiy. - 'protected as function name' => [ - 'testMarker' => '/* testProtectedFunctionName */', - 'testType' => 'T_STRING', - 'testContent' => 'protected', - ], - 'public as function name' => [ - 'testMarker' => '/* testPublicFunctionName */', - 'testType' => 'T_STRING', - 'testContent' => 'public', - ], - 'set as parameter type' => [ - 'testMarker' => '/* testSetParameterType */', - 'testType' => 'T_STRING', - 'testContent' => 'Set', - ], - - // Live coding. - 'live coding' => [ - 'testMarker' => '/* testLiveCoding */', - 'testType' => 'T_PRIVATE', - 'testContent' => 'private', - ], - ]; - - }//end dataNotAsymmetricVisibility() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillEnumTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillEnumTest.inc deleted file mode 100644 index 16624ec..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillEnumTest.inc +++ /dev/null @@ -1,91 +0,0 @@ -enum = 'foo'; - } -} - -/* testEnumUsedAsFunctionName */ -function enum() -{ -} - -/* testDeclarationContainingComment */ -enum /* comment */ Name -{ - case SOME_CASE; -} - -/* testEnumUsedAsNamespaceName */ -namespace Enum; -/* testEnumUsedAsPartOfNamespaceName */ -namespace My\Enum\Collection; -/* testEnumUsedInObjectInitialization */ -$obj = new Enum; -/* testEnumAsFunctionCall */ -$var = enum($a, $b); -/* testEnumAsFunctionCallWithNamespace */ -var = namespace\enum(); -/* testClassConstantFetchWithEnumAsClassName */ -echo Enum::CONSTANT; -/* testClassConstantFetchWithEnumAsConstantName */ -echo ClassName::ENUM; - -/* testParseErrorMissingName */ -enum { - case SOME_CASE; -} - -/* testParseErrorLiveCoding */ -// This must be the last test in the file. -enum diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillEnumTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillEnumTest.php deleted file mode 100644 index abb7c71..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillEnumTest.php +++ /dev/null @@ -1,226 +0,0 @@ - - * @copyright 2021 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\PHP; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; - -final class BackfillEnumTest extends AbstractTokenizerTestCase -{ - - - /** - * Test that the "enum" keyword is tokenized as such. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * @param string $testContent The token content to look for. - * @param int $openerOffset Offset to find expected scope opener. - * @param int $closerOffset Offset to find expected scope closer. - * - * @dataProvider dataEnums - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testEnums($testMarker, $testContent, $openerOffset, $closerOffset) - { - $tokens = $this->phpcsFile->getTokens(); - $enum = $this->getTargetToken($testMarker, [T_ENUM, T_STRING], $testContent); - $tokenArray = $tokens[$enum]; - - $this->assertSame(T_ENUM, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_ENUM (code)'); - $this->assertSame('T_ENUM', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_ENUM (type)'); - - $this->assertArrayHasKey('scope_condition', $tokenArray); - $this->assertArrayHasKey('scope_opener', $tokenArray); - $this->assertArrayHasKey('scope_closer', $tokenArray); - - $this->assertSame($enum, $tokenArray['scope_condition']); - - $scopeOpener = $tokenArray['scope_opener']; - $scopeCloser = $tokenArray['scope_closer']; - - $expectedScopeOpener = ($enum + $openerOffset); - $expectedScopeCloser = ($enum + $closerOffset); - - $this->assertSame($expectedScopeOpener, $scopeOpener); - $this->assertArrayHasKey('scope_condition', $tokens[$scopeOpener]); - $this->assertArrayHasKey('scope_opener', $tokens[$scopeOpener]); - $this->assertArrayHasKey('scope_closer', $tokens[$scopeOpener]); - $this->assertSame($enum, $tokens[$scopeOpener]['scope_condition']); - $this->assertSame($scopeOpener, $tokens[$scopeOpener]['scope_opener']); - $this->assertSame($scopeCloser, $tokens[$scopeOpener]['scope_closer']); - - $this->assertSame($expectedScopeCloser, $scopeCloser); - $this->assertArrayHasKey('scope_condition', $tokens[$scopeCloser]); - $this->assertArrayHasKey('scope_opener', $tokens[$scopeCloser]); - $this->assertArrayHasKey('scope_closer', $tokens[$scopeCloser]); - $this->assertSame($enum, $tokens[$scopeCloser]['scope_condition']); - $this->assertSame($scopeOpener, $tokens[$scopeCloser]['scope_opener']); - $this->assertSame($scopeCloser, $tokens[$scopeCloser]['scope_closer']); - - }//end testEnums() - - - /** - * Data provider. - * - * @see testEnums() - * - * @return array> - */ - public static function dataEnums() - { - return [ - 'enum - pure' => [ - 'testMarker' => '/* testPureEnum */', - 'testContent' => 'enum', - 'openerOffset' => 4, - 'closerOffset' => 12, - ], - 'enum - backed int' => [ - 'testMarker' => '/* testBackedIntEnum */', - 'testContent' => 'enum', - 'openerOffset' => 7, - 'closerOffset' => 29, - ], - 'enum - backed string' => [ - 'testMarker' => '/* testBackedStringEnum */', - 'testContent' => 'enum', - 'openerOffset' => 8, - 'closerOffset' => 30, - ], - 'enum - backed int + implements' => [ - 'testMarker' => '/* testComplexEnum */', - 'testContent' => 'enum', - 'openerOffset' => 11, - 'closerOffset' => 72, - ], - 'enum keyword when "enum" is the name for the construct (yes, this is allowed)' => [ - 'testMarker' => '/* testEnumWithEnumAsClassName */', - 'testContent' => 'enum', - 'openerOffset' => 6, - 'closerOffset' => 7, - ], - 'enum - keyword is case insensitive' => [ - 'testMarker' => '/* testEnumIsCaseInsensitive */', - 'testContent' => 'EnUm', - 'openerOffset' => 4, - 'closerOffset' => 5, - ], - 'enum - declaration containing comment' => [ - 'testMarker' => '/* testDeclarationContainingComment */', - 'testContent' => 'enum', - 'openerOffset' => 6, - 'closerOffset' => 14, - ], - ]; - - }//end dataEnums() - - - /** - * Test that "enum" when not used as the keyword is still tokenized as `T_STRING`. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * @param string $testContent The token content to look for. - * - * @dataProvider dataNotEnums - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testNotEnums($testMarker, $testContent) - { - $tokens = $this->phpcsFile->getTokens(); - $target = $this->getTargetToken($testMarker, [T_ENUM, T_STRING], $testContent); - $tokenArray = $tokens[$target]; - - $this->assertSame(T_STRING, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_STRING (code)'); - $this->assertSame('T_STRING', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_STRING (type)'); - - }//end testNotEnums() - - - /** - * Data provider. - * - * @see testNotEnums() - * - * @return array> - */ - public static function dataNotEnums() - { - return [ - 'not enum - construct named enum' => [ - 'testMarker' => '/* testEnumAsClassNameAfterEnumKeyword */', - 'testContent' => 'Enum', - ], - 'not enum - class named enum' => [ - 'testMarker' => '/* testEnumUsedAsClassName */', - 'testContent' => 'Enum', - ], - 'not enum - class constant named enum' => [ - 'testMarker' => '/* testEnumUsedAsClassConstantName */', - 'testContent' => 'ENUM', - ], - 'not enum - method named enum' => [ - 'testMarker' => '/* testEnumUsedAsMethodName */', - 'testContent' => 'enum', - ], - 'not enum - class property named enum' => [ - 'testMarker' => '/* testEnumUsedAsPropertyName */', - 'testContent' => 'enum', - ], - 'not enum - global function named enum' => [ - 'testMarker' => '/* testEnumUsedAsFunctionName */', - 'testContent' => 'enum', - ], - 'not enum - namespace named enum' => [ - 'testMarker' => '/* testEnumUsedAsNamespaceName */', - 'testContent' => 'Enum', - ], - 'not enum - part of namespace named enum' => [ - 'testMarker' => '/* testEnumUsedAsPartOfNamespaceName */', - 'testContent' => 'Enum', - ], - 'not enum - class instantiation for class enum' => [ - 'testMarker' => '/* testEnumUsedInObjectInitialization */', - 'testContent' => 'Enum', - ], - 'not enum - function call' => [ - 'testMarker' => '/* testEnumAsFunctionCall */', - 'testContent' => 'enum', - ], - 'not enum - namespace relative function call' => [ - 'testMarker' => '/* testEnumAsFunctionCallWithNamespace */', - 'testContent' => 'enum', - ], - 'not enum - class constant fetch with enum as class name' => [ - 'testMarker' => '/* testClassConstantFetchWithEnumAsClassName */', - 'testContent' => 'Enum', - ], - 'not enum - class constant fetch with enum as constant name' => [ - 'testMarker' => '/* testClassConstantFetchWithEnumAsConstantName */', - 'testContent' => 'ENUM', - ], - 'parse error, not enum - enum declaration without name' => [ - 'testMarker' => '/* testParseErrorMissingName */', - 'testContent' => 'enum', - ], - 'parse error, not enum - enum declaration with curlies' => [ - 'testMarker' => '/* testParseErrorLiveCoding */', - 'testContent' => 'enum', - ], - ]; - - }//end dataNotEnums() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillExplicitOctalNotationTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillExplicitOctalNotationTest.inc deleted file mode 100644 index eb907ed..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillExplicitOctalNotationTest.inc +++ /dev/null @@ -1,31 +0,0 @@ - - * @copyright 2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\PHP; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; - -final class BackfillExplicitOctalNotationTest extends AbstractTokenizerTestCase -{ - - - /** - * Test that explicitly-defined octal values are tokenized as a single number and not as a number and a string. - * - * @param string $marker The comment which prefaces the target token in the test file. - * @param string $value The expected content of the token. - * @param int|string $nextToken The expected next token. - * @param string $nextContent The expected content of the next token. - * - * @dataProvider dataExplicitOctalNotation - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testExplicitOctalNotation($marker, $value, $nextToken, $nextContent) - { - $tokens = $this->phpcsFile->getTokens(); - - $number = $this->getTargetToken($marker, [T_LNUMBER]); - - $this->assertSame($value, $tokens[$number]['content'], 'Content of integer token does not match expectation'); - - $this->assertSame($nextToken, $tokens[($number + 1)]['code'], 'Next token is not the expected type, but '.$tokens[($number + 1)]['type']); - $this->assertSame($nextContent, $tokens[($number + 1)]['content'], 'Next token did not have the expected contents'); - - }//end testExplicitOctalNotation() - - - /** - * Data provider. - * - * @see testExplicitOctalNotation() - * - * @return array> - */ - public static function dataExplicitOctalNotation() - { - return [ - 'Explicit octal' => [ - 'marker' => '/* testExplicitOctal */', - 'value' => '0o137041', - 'nextToken' => T_SEMICOLON, - 'nextContent' => ';', - ], - 'Explicit octal - capitalized O' => [ - 'marker' => '/* testExplicitOctalCapitalised */', - 'value' => '0O137041', - 'nextToken' => T_SEMICOLON, - 'nextContent' => ';', - ], - 'Explicit octal - with numeric literal separator' => [ - 'marker' => '/* testExplicitOctalWithNumericSeparator */', - 'value' => '0o137_041', - 'nextToken' => T_SEMICOLON, - 'nextContent' => ';', - ], - 'Invalid explicit octal - numeric literal separator directly after "0o"' => [ - 'marker' => '/* testInvalid1 */', - 'value' => '0', - 'nextToken' => T_STRING, - 'nextContent' => 'o_137', - ], - 'Invalid explicit octal - numeric literal separator directly after "0O" (capitalized O)' => [ - 'marker' => '/* testInvalid2 */', - 'value' => '0', - 'nextToken' => T_STRING, - 'nextContent' => 'O_41', - ], - 'Invalid explicit octal - number out of octal range' => [ - 'marker' => '/* testInvalid3 */', - 'value' => '0', - 'nextToken' => T_STRING, - 'nextContent' => 'o91', - ], - 'Invalid explicit octal - part of the number out of octal range' => [ - 'marker' => '/* testInvalid4 */', - 'value' => '0O2', - 'nextToken' => T_LNUMBER, - 'nextContent' => '82', - ], - 'Invalid explicit octal - part of the number out of octal range with numeric literal separator after' => [ - 'marker' => '/* testInvalid5 */', - 'value' => '0o2', - 'nextToken' => T_LNUMBER, - 'nextContent' => '8_2', - ], - 'Invalid explicit octal - part of the number out of octal range with numeric literal separator before' => [ - 'marker' => '/* testInvalid6 */', - 'value' => '0o2', - 'nextToken' => T_STRING, - 'nextContent' => '_82', - ], - 'Invalid explicit octal - explicit notation without number' => [ - 'marker' => '/* testInvalid7 */', - 'value' => '0', - 'nextToken' => T_STRING, - 'nextContent' => 'o', - ], - ]; - - }//end dataExplicitOctalNotation() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillFnTokenParseErrorTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillFnTokenParseErrorTest.inc deleted file mode 100644 index ce247e9..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillFnTokenParseErrorTest.inc +++ /dev/null @@ -1,5 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\PHP; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; - -final class BackfillFnTokenParseErrorTest extends AbstractTokenizerTestCase -{ - - - /** - * Verify that un unfinished arrow function during live coding doesn't cause a "Undefined array key "parenthesis_closer"" error. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testUnfinishedArrowFunction() - { - $tokens = $this->phpcsFile->getTokens(); - - $token = $this->getTargetToken('/* testLiveCoding */', [T_STRING, T_FN], 'fn'); - $tokenArray = $tokens[$token]; - - $this->assertSame('T_STRING', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_STRING'); - - $this->assertArrayNotHasKey('scope_condition', $tokenArray, 'Scope condition is set'); - $this->assertArrayNotHasKey('scope_opener', $tokenArray, 'Scope opener is set'); - $this->assertArrayNotHasKey('scope_closer', $tokenArray, 'Scope closer is set'); - $this->assertArrayNotHasKey('parenthesis_owner', $tokenArray, 'Parenthesis owner is set'); - $this->assertArrayNotHasKey('parenthesis_opener', $tokenArray, 'Parenthesis opener is set'); - $this->assertArrayNotHasKey('parenthesis_closer', $tokenArray, 'Parenthesis closer is set'); - - }//end testUnfinishedArrowFunction() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillFnTokenTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillFnTokenTest.inc deleted file mode 100644 index 8930d4f..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillFnTokenTest.inc +++ /dev/null @@ -1,228 +0,0 @@ - $x + $y; - -/* testMixedCase */ -$fn1 = Fn($x) => $x + $y; - -/* testWhitespace */ -$fn1 = fn ($x) => $x + $y; - -/* testComment */ -$fn1 = fn /* comment here */ ($x) => $x + $y; - -/* testHeredoc */ -$fn1 = fn() => << /* testNestedInner */ fn($y) => $x * $y + $z; - -/* testNestedSharedCloserOuter */ -$foo = foo(fn() => /* testNestedSharedCloserInner */ fn() => bar() === true); - -/* testFunctionCall */ -$extended = fn($c) => $callable($factory($c), $c); - -/* testChainedFunctionCall */ -$result = Collection::from([1, 2]) - ->map(fn($v) => $v * 2) - ->reduce(/* testFunctionArgument */ fn($tmp, $v) => $tmp + $v, 0); - -/* testClosure */ -$extended = fn($c) => $callable(function() { - for ($x = 1; $x < 10; $x++) { - echo $x; - } - - echo 'done'; -}, $c); - -/* testArrayIndex */ -$found = in_array_cb($needle, $haystack, fn($array, $needle) => $array[2] === $needle); - -$result = array_map( - /* testReturnType */ - static fn(int $number) : int => $number + 1, - $numbers -); - -/* testReference */ -fn&($x) => $x; - -/* testGrouped */ -(fn($x) => $x) + $y; - -/* testArrayValue */ -$a = [ - 'a' => fn() => return 1, -]; - -/* testArrayValueNoTrailingComma */ -$a = [ - 'a' => fn() => foo() -]; - -/* testYield */ -$a = fn($x) => yield 'k' => $x; - -/* testNullableUnqualifiedClassName */ -$a = fn(?\DateTime $x) : ?\DateTime => $x; - -/* testNamespaceRelativeClassNameInTypes */ -$fn = fn(namespace\Foo $a) : ?namespace\Foo => $a; - -/* testSelfReturnType */ -fn(self $a) : self => $a; - -/* testParentReturnType */ -fn(parent $a) : parent => $a; - -/* testCallableReturnType */ -fn(callable $a) : callable => $a; - -/* testArrayReturnType */ -fn(array $a) : array => $a; - -/* testStaticReturnType */ -fn(array $a) : static => $a; - -/* testFalseReturnType */ -fn(array $a) : false => $a; - -/* testTrueReturnType */ -fn(array $a) : True => $a; - -/* testNullReturnType */ -fn(array $a) : null => $a; - -/* testUnionParamType */ -$arrowWithUnionParam = fn(int|float $param) : SomeClass => new SomeClass($param); - -/* testUnionReturnType */ -$arrowWithUnionReturn = fn($param) : int|float => $param | 10; - -/* testUnionReturnTypeWithTrue */ -$arrowWithUnionReturn = fn($param) : int|true => $param | 10; - -/* testUnionReturnTypeWithFalse */ -$arrowWithUnionReturn = fn($param) : string|FALSE => $param | 10; - -/* testIntersectionParamType */ -$arrowWithIntersectionParam = fn(Traversable&Countable $param) : int => (new SomeClass($param))->getValue(); - -/* testIntersectionReturnType */ -$arrowWithIntersectionReturn = fn($param) : \MyFoo&SomeInterface => new SomeClass($param); - -/* testDNFParamType */ -$arrowWithDNFParam = fn((Traversable&Countable)|null $param) : SomeClass => new SomeClass($param) ?? null; - -/* testDNFReturnType */ -$arrowWithDNFReturn = fn($param) : false|(\MyFoo&SomeInterface) => new \MyFoo($param) ?? false; - -/* testDNFParamTypeWithReturnByRef */ -$arrowWithDNFParamReturnByRef = fn &((A&B)|null $param) => $param * 10; - -/* testTernary */ -$fn = fn($a) => $a ? /* testTernaryThen */ fn() : string => 'a' : /* testTernaryElse */ fn() : string => 'b'; - -/* testTernaryWithTypes */ -$fn = fn(int|null $a) : array|null => $a ? null : []; - -function matchInArrow($x) { - /* testWithMatchValue */ - $fn = fn($x) => match(true) { - 1, 2, 3, 4, 5 => 'foo', - default => 'bar', - }; -} - -function matchInArrowAndMore($x) { - /* testWithMatchValueAndMore */ - $fn = fn($x) => match(true) { - 1, 2, 3, 4, 5 => 'foo', - default => 'bar', - } . 'suffix'; -} - -function arrowFunctionInMatchWithTrailingComma($x) { - return match ($x) { - /* testInMatchNotLastValue */ - 1 => fn($y) => callMe($y), - /* testInMatchLastValueWithTrailingComma */ - default => fn($y) => callThem($y), - }; -} - -function arrowFunctionInMatchNoTrailingComma1($x) { - return match ($x) { - 1 => fn($y) => callMe($y), - /* testInMatchLastValueNoTrailingComma1 */ - default => fn($y) => callThem($y) - }; -} - -function arrowFunctionInMatchNoTrailingComma2($x) { - return match ($x) { - /* testInMatchLastValueNoTrailingComma2 */ - default => fn($y) => 5 * $y - }; -} - -/* testConstantDeclaration */ -const FN = 'a'; - -/* testConstantDeclarationLower */ -const fn = 'a'; - -class Foo { - /* testStaticMethodName */ - public static function fn($param) { - /* testNestedInMethod */ - $fn = fn($c) => $callable($factory($c), $c); - } - - public function foo() { - /* testPropertyAssignment */ - $this->fn = 'a'; - } -} - -$anon = new class() { - /* testAnonClassMethodName */ - protected function fN($param) { - } -} - -/* testNonArrowStaticMethodCall */ -$a = Foo::fn($param); - -/* testNonArrowConstantAccess */ -$a = MyClass::FN; - -/* testNonArrowConstantAccessMixed */ -$a = MyClass::Fn; - -/* testNonArrowObjectMethodCall */ -$a = $obj->fn($param); - -/* testNonArrowObjectMethodCallUpper */ -$a = $obj->FN($param); - -/* testNonArrowNamespacedFunctionCall */ -$a = MyNS\Sub\Fn($param); - -/* testNonArrowNamespaceOperatorFunctionCall */ -$a = namespace\fn($param); - -/* testNonArrowFunctionNameWithUnionTypes */ -function fn(int|float $param) : string|null {} - -/* testLiveCoding */ -// Intentional parse error. This has to be the last test in the file. -$fn = fn diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillFnTokenTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillFnTokenTest.php deleted file mode 100644 index c056fd8..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillFnTokenTest.php +++ /dev/null @@ -1,967 +0,0 @@ - - * @copyright 2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\PHP; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; - -final class BackfillFnTokenTest extends AbstractTokenizerTestCase -{ - - - /** - * Test simple arrow functions. - * - * @param string $testMarker The comment prefacing the target token. - * - * @dataProvider dataSimple - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testSimple($testMarker) - { - $token = $this->getTargetToken($testMarker, T_FN); - $this->backfillHelper($token); - $this->scopePositionTestHelper($token, 5, 12); - - }//end testSimple() - - - /** - * Data provider. - * - * @see testSimple() - * - * @return array> - */ - public static function dataSimple() - { - return [ - 'standard' => [ - 'testMarker' => '/* testStandard */', - ], - 'mixed case' => [ - 'testMarker' => '/* testMixedCase */', - ], - ]; - - }//end dataSimple() - - - /** - * Test whitespace inside arrow function definitions. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testWhitespace() - { - $token = $this->getTargetToken('/* testWhitespace */', T_FN); - $this->backfillHelper($token); - $this->scopePositionTestHelper($token, 6, 13); - - }//end testWhitespace() - - - /** - * Test comments inside arrow function definitions. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testComment() - { - $token = $this->getTargetToken('/* testComment */', T_FN); - $this->backfillHelper($token); - $this->scopePositionTestHelper($token, 8, 15); - - }//end testComment() - - - /** - * Test heredocs inside arrow function definitions. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testHeredoc() - { - $token = $this->getTargetToken('/* testHeredoc */', T_FN); - $this->backfillHelper($token); - $this->scopePositionTestHelper($token, 4, 9); - - }//end testHeredoc() - - - /** - * Test nested arrow functions. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testNestedOuter() - { - $token = $this->getTargetToken('/* testNestedOuter */', T_FN); - $this->backfillHelper($token); - $this->scopePositionTestHelper($token, 5, 25); - - }//end testNestedOuter() - - - /** - * Test nested arrow functions. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testNestedInner() - { - $tokens = $this->phpcsFile->getTokens(); - - $token = $this->getTargetToken('/* testNestedInner */', T_FN); - $this->backfillHelper($token, true); - - $expectedScopeOpener = ($token + 5); - $expectedScopeCloser = ($token + 16); - - $this->assertSame($expectedScopeOpener, $tokens[$token]['scope_opener'], 'Scope opener is not the arrow token'); - $this->assertSame($expectedScopeCloser, $tokens[$token]['scope_closer'], 'Scope closer is not the semicolon token'); - - $opener = $tokens[$token]['scope_opener']; - $this->assertSame($expectedScopeOpener, $tokens[$opener]['scope_opener'], 'Opener scope opener is not the arrow token'); - $this->assertSame($expectedScopeCloser, $tokens[$opener]['scope_closer'], 'Opener scope closer is not the semicolon token'); - - $closer = $tokens[$token]['scope_closer']; - $this->assertSame(($token - 4), $tokens[$closer]['scope_opener'], 'Closer scope opener is not the arrow token of the "outer" arrow function (shared scope closer)'); - $this->assertSame($expectedScopeCloser, $tokens[$closer]['scope_closer'], 'Closer scope closer is not the semicolon token'); - - }//end testNestedInner() - - - /** - * Test nested arrow functions with a shared closer. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testNestedSharedCloser() - { - $tokens = $this->phpcsFile->getTokens(); - - $token = $this->getTargetToken('/* testNestedSharedCloserOuter */', T_FN); - $this->backfillHelper($token); - $this->scopePositionTestHelper($token, 4, 20); - - $token = $this->getTargetToken('/* testNestedSharedCloserInner */', T_FN); - $this->backfillHelper($token, true); - - $expectedScopeOpener = ($token + 4); - $expectedScopeCloser = ($token + 12); - - $this->assertSame($expectedScopeOpener, $tokens[$token]['scope_opener'], 'Scope opener for "inner" arrow function is not the arrow token'); - $this->assertSame($expectedScopeCloser, $tokens[$token]['scope_closer'], 'Scope closer for "inner" arrow function is not the TRUE token'); - - $opener = $tokens[$token]['scope_opener']; - $this->assertSame($expectedScopeOpener, $tokens[$opener]['scope_opener'], 'Opener scope opener for "inner" arrow function is not the arrow token'); - $this->assertSame($expectedScopeCloser, $tokens[$opener]['scope_closer'], 'Opener scope closer for "inner" arrow function is not the semicolon token'); - - $closer = $tokens[$token]['scope_closer']; - $this->assertSame(($token - 4), $tokens[$closer]['scope_opener'], 'Closer scope opener for "inner" arrow function is not the arrow token of the "outer" arrow function (shared scope closer)'); - $this->assertSame($expectedScopeCloser, $tokens[$closer]['scope_closer'], 'Closer scope closer for "inner" arrow function is not the TRUE token'); - - }//end testNestedSharedCloser() - - - /** - * Test arrow functions that call functions. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testFunctionCall() - { - $token = $this->getTargetToken('/* testFunctionCall */', T_FN); - $this->backfillHelper($token); - $this->scopePositionTestHelper($token, 5, 17); - - }//end testFunctionCall() - - - /** - * Test arrow functions that are included in chained calls. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testChainedFunctionCall() - { - $token = $this->getTargetToken('/* testChainedFunctionCall */', T_FN); - $this->backfillHelper($token); - $this->scopePositionTestHelper($token, 5, 12, 'bracket'); - - }//end testChainedFunctionCall() - - - /** - * Test arrow functions that are used as function arguments. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testFunctionArgument() - { - $token = $this->getTargetToken('/* testFunctionArgument */', T_FN); - $this->backfillHelper($token); - $this->scopePositionTestHelper($token, 8, 15, 'comma'); - - }//end testFunctionArgument() - - - /** - * Test arrow functions that use closures. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testClosure() - { - $token = $this->getTargetToken('/* testClosure */', T_FN); - $this->backfillHelper($token); - $this->scopePositionTestHelper($token, 5, 60, 'comma'); - - }//end testClosure() - - - /** - * Test arrow functions using an array index. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testArrayIndex() - { - $token = $this->getTargetToken('/* testArrayIndex */', T_FN); - $this->backfillHelper($token); - $this->scopePositionTestHelper($token, 8, 17, 'comma'); - - }//end testArrayIndex() - - - /** - * Test arrow functions with a return type. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testReturnType() - { - $token = $this->getTargetToken('/* testReturnType */', T_FN); - $this->backfillHelper($token); - $this->scopePositionTestHelper($token, 11, 18, 'comma'); - - }//end testReturnType() - - - /** - * Test arrow functions that return a reference. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testReference() - { - $token = $this->getTargetToken('/* testReference */', T_FN); - $this->backfillHelper($token); - $this->scopePositionTestHelper($token, 6, 9); - - }//end testReference() - - - /** - * Test arrow functions that are grouped by parenthesis. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testGrouped() - { - $token = $this->getTargetToken('/* testGrouped */', T_FN); - $this->backfillHelper($token); - $this->scopePositionTestHelper($token, 5, 8); - - }//end testGrouped() - - - /** - * Test arrow functions that are used as array values. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testArrayValue() - { - $token = $this->getTargetToken('/* testArrayValue */', T_FN); - $this->backfillHelper($token); - $this->scopePositionTestHelper($token, 4, 9, 'comma'); - - }//end testArrayValue() - - - /** - * Test arrow functions that are used as array values with no trailing comma. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testArrayValueNoTrailingComma() - { - $token = $this->getTargetToken('/* testArrayValueNoTrailingComma */', T_FN); - $this->backfillHelper($token); - $this->scopePositionTestHelper($token, 4, 8, 'closing parenthesis'); - - }//end testArrayValueNoTrailingComma() - - - /** - * Test arrow functions that use the yield keyword. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testYield() - { - $token = $this->getTargetToken('/* testYield */', T_FN); - $this->backfillHelper($token); - $this->scopePositionTestHelper($token, 5, 14); - - }//end testYield() - - - /** - * Test arrow functions that use nullable type with unqualified class name. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testNullableUnqualifiedClassName() - { - $token = $this->getTargetToken('/* testNullableUnqualifiedClassName */', T_FN); - $this->backfillHelper($token); - $this->scopePositionTestHelper($token, 15, 18); - - }//end testNullableUnqualifiedClassName() - - - /** - * Test arrow functions that use namespace relative class name in the return type. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testNamespaceRelativeClassNameInTypes() - { - $token = $this->getTargetToken('/* testNamespaceRelativeClassNameInTypes */', T_FN); - $this->backfillHelper($token); - $this->scopePositionTestHelper($token, 16, 19); - - }//end testNamespaceRelativeClassNameInTypes() - - - /** - * Test arrow functions that use keyword return types. - * - * @param string $testMarker The comment prefacing the target token. - * - * @dataProvider dataKeywordReturnTypes - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testKeywordReturnTypes($testMarker) - { - $token = $this->getTargetToken($testMarker, T_FN); - $this->backfillHelper($token); - $this->scopePositionTestHelper($token, 11, 14); - - }//end testKeywordReturnTypes() - - - /** - * Data provider. - * - * @see testKeywordReturnTypes() - * - * @return array> - */ - public static function dataKeywordReturnTypes() - { - return [ - 'self' => [ - 'testMarker' => '/* testSelfReturnType */', - ], - 'parent' => [ - 'testMarker' => '/* testParentReturnType */', - ], - 'callable' => [ - 'testMarker' => '/* testCallableReturnType */', - ], - 'array' => [ - 'testMarker' => '/* testArrayReturnType */', - ], - 'static' => [ - 'testMarker' => '/* testStaticReturnType */', - ], - 'false' => [ - 'testMarker' => '/* testFalseReturnType */', - ], - 'true' => [ - 'testMarker' => '/* testTrueReturnType */', - ], - 'null' => [ - 'testMarker' => '/* testNullReturnType */', - ], - ]; - - }//end dataKeywordReturnTypes() - - - /** - * Test arrow function with a union parameter type. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testUnionParamType() - { - $token = $this->getTargetToken('/* testUnionParamType */', T_FN); - $this->backfillHelper($token); - $this->scopePositionTestHelper($token, 13, 21); - - }//end testUnionParamType() - - - /** - * Test arrow function with a union return type. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testUnionReturnType() - { - $token = $this->getTargetToken('/* testUnionReturnType */', T_FN); - $this->backfillHelper($token); - $this->scopePositionTestHelper($token, 11, 18); - - }//end testUnionReturnType() - - - /** - * Test arrow function with a union return type. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testUnionReturnTypeWithTrue() - { - $token = $this->getTargetToken('/* testUnionReturnTypeWithTrue */', T_FN); - $this->backfillHelper($token); - $this->scopePositionTestHelper($token, 11, 18); - - }//end testUnionReturnTypeWithTrue() - - - /** - * Test arrow function with a union return type. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testUnionReturnTypeWithFalse() - { - $token = $this->getTargetToken('/* testUnionReturnTypeWithFalse */', T_FN); - $this->backfillHelper($token); - $this->scopePositionTestHelper($token, 11, 18); - - }//end testUnionReturnTypeWithFalse() - - - /** - * Test arrow function with an intersection parameter type. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testIntersectionParamType() - { - $token = $this->getTargetToken('/* testIntersectionParamType */', T_FN); - $this->backfillHelper($token); - $this->scopePositionTestHelper($token, 13, 27); - - }//end testIntersectionParamType() - - - /** - * Test arrow function with an intersection return type. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testIntersectionReturnType() - { - $token = $this->getTargetToken('/* testIntersectionReturnType */', T_FN); - $this->backfillHelper($token); - $this->scopePositionTestHelper($token, 12, 20); - - }//end testIntersectionReturnType() - - - /** - * Test arrow function with a DNF parameter type. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testDNFParamType() - { - $token = $this->getTargetToken('/* testDNFParamType */', T_FN); - $this->backfillHelper($token); - $this->scopePositionTestHelper($token, 17, 29); - - }//end testDNFParamType() - - - /** - * Test arrow function with a DNF return type. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testDNFReturnType() - { - $token = $this->getTargetToken('/* testDNFReturnType */', T_FN); - $this->backfillHelper($token); - $this->scopePositionTestHelper($token, 16, 29); - - }//end testDNFReturnType() - - - /** - * Test arrow function which returns by reference with a DNF parameter type. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testDNFParamTypeWithReturnByRef() - { - $token = $this->getTargetToken('/* testDNFParamTypeWithReturnByRef */', T_FN); - $this->backfillHelper($token); - $this->scopePositionTestHelper($token, 15, 22); - - }//end testDNFParamTypeWithReturnByRef() - - - /** - * Test arrow functions used in ternary operators. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testTernary() - { - $tokens = $this->phpcsFile->getTokens(); - - $token = $this->getTargetToken('/* testTernary */', T_FN); - $this->backfillHelper($token); - $this->scopePositionTestHelper($token, 5, 40); - - $token = $this->getTargetToken('/* testTernaryThen */', T_FN); - $this->backfillHelper($token); - - $expectedScopeOpener = ($token + 8); - $expectedScopeCloser = ($token + 12); - - $this->assertSame($expectedScopeOpener, $tokens[$token]['scope_opener'], 'Scope opener for THEN is not the arrow token'); - $this->assertSame($expectedScopeCloser, $tokens[$token]['scope_closer'], 'Scope closer for THEN is not the semicolon token'); - - $opener = $tokens[$token]['scope_opener']; - $this->assertSame($expectedScopeOpener, $tokens[$opener]['scope_opener'], 'Opener scope opener for THEN is not the arrow token'); - $this->assertSame($expectedScopeCloser, $tokens[$opener]['scope_closer'], 'Opener scope closer for THEN is not the semicolon token'); - - $closer = $tokens[$token]['scope_closer']; - $this->assertSame($expectedScopeOpener, $tokens[$closer]['scope_opener'], 'Closer scope opener for THEN is not the arrow token'); - $this->assertSame($expectedScopeCloser, $tokens[$closer]['scope_closer'], 'Closer scope closer for THEN is not the semicolon token'); - - $token = $this->getTargetToken('/* testTernaryElse */', T_FN); - $this->backfillHelper($token, true); - - $expectedScopeOpener = ($token + 8); - $expectedScopeCloser = ($token + 11); - - $this->assertSame($expectedScopeOpener, $tokens[$token]['scope_opener'], 'Scope opener for ELSE is not the arrow token'); - $this->assertSame($expectedScopeCloser, $tokens[$token]['scope_closer'], 'Scope closer for ELSE is not the semicolon token'); - - $opener = $tokens[$token]['scope_opener']; - $this->assertSame($expectedScopeOpener, $tokens[$opener]['scope_opener'], 'Opener scope opener for ELSE is not the arrow token'); - $this->assertSame($expectedScopeCloser, $tokens[$opener]['scope_closer'], 'Opener scope closer for ELSE is not the semicolon token'); - - $closer = $tokens[$token]['scope_closer']; - $this->assertSame(($token - 24), $tokens[$closer]['scope_opener'], 'Closer scope opener for ELSE is not the arrow token of the "outer" arrow function (shared scope closer)'); - $this->assertSame($expectedScopeCloser, $tokens[$closer]['scope_closer'], 'Closer scope closer for ELSE is not the semicolon token'); - - }//end testTernary() - - - /** - * Test typed arrow functions used in ternary operators. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testTernaryWithTypes() - { - $token = $this->getTargetToken('/* testTernaryWithTypes */', T_FN); - $this->backfillHelper($token); - $this->scopePositionTestHelper($token, 15, 27); - - }//end testTernaryWithTypes() - - - /** - * Test arrow function returning a match control structure. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testWithMatchValue() - { - $token = $this->getTargetToken('/* testWithMatchValue */', T_FN); - $this->backfillHelper($token); - $this->scopePositionTestHelper($token, 5, 44); - - }//end testWithMatchValue() - - - /** - * Test arrow function returning a match control structure with something behind it. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testWithMatchValueAndMore() - { - $token = $this->getTargetToken('/* testWithMatchValueAndMore */', T_FN); - $this->backfillHelper($token); - $this->scopePositionTestHelper($token, 5, 48); - - }//end testWithMatchValueAndMore() - - - /** - * Test match control structure returning arrow functions. - * - * @param string $testMarker The comment prefacing the target token. - * @param int $openerOffset The expected offset of the scope opener in relation to the testMarker. - * @param int $closerOffset The expected offset of the scope closer in relation to the testMarker. - * @param string $expectedCloserType The type of token expected for the scope closer. - * @param string $expectedCloserFriendlyName A friendly name for the type of token expected for the scope closer - * to be used in the error message for failing tests. - * - * @dataProvider dataInMatchValue - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testInMatchValue($testMarker, $openerOffset, $closerOffset, $expectedCloserType, $expectedCloserFriendlyName) - { - $tokens = $this->phpcsFile->getTokens(); - - $token = $this->getTargetToken($testMarker, T_FN); - $this->backfillHelper($token); - $this->scopePositionTestHelper($token, $openerOffset, $closerOffset, $expectedCloserFriendlyName); - - $this->assertSame($expectedCloserType, $tokens[($token + $closerOffset)]['type'], 'Mismatched scope closer type'); - - }//end testInMatchValue() - - - /** - * Data provider. - * - * @see testInMatchValue() - * - * @return array> - */ - public static function dataInMatchValue() - { - return [ - 'not_last_value' => [ - 'testMarker' => '/* testInMatchNotLastValue */', - 'openerOffset' => 5, - 'closerOffset' => 11, - 'expectedCloserType' => 'T_COMMA', - 'expectedCloserFriendlyName' => 'comma', - ], - 'last_value_with_trailing_comma' => [ - 'testMarker' => '/* testInMatchLastValueWithTrailingComma */', - 'openerOffset' => 5, - 'closerOffset' => 11, - 'expectedCloserType' => 'T_COMMA', - 'expectedCloserFriendlyName' => 'comma', - ], - 'last_value_without_trailing_comma_1' => [ - 'testMarker' => '/* testInMatchLastValueNoTrailingComma1 */', - 'openerOffset' => 5, - 'closerOffset' => 10, - 'expectedCloserType' => 'T_CLOSE_PARENTHESIS', - 'expectedCloserFriendlyName' => 'close parenthesis', - ], - 'last_value_without_trailing_comma_2' => [ - 'testMarker' => '/* testInMatchLastValueNoTrailingComma2 */', - 'openerOffset' => 5, - 'closerOffset' => 11, - 'expectedCloserType' => 'T_VARIABLE', - 'expectedCloserFriendlyName' => '$y variable', - ], - ]; - - }//end dataInMatchValue() - - - /** - * Test arrow function nested within a method declaration. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testNestedInMethod() - { - $token = $this->getTargetToken('/* testNestedInMethod */', T_FN); - $this->backfillHelper($token); - $this->scopePositionTestHelper($token, 5, 17); - - }//end testNestedInMethod() - - - /** - * Verify that "fn" keywords which are not arrow functions get tokenized as T_STRING and don't - * have the extra token array indexes. - * - * @param string $testMarker The comment prefacing the target token. - * @param string $testContent The token content to look for. - * - * @dataProvider dataNotAnArrowFunction - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testNotAnArrowFunction($testMarker, $testContent='fn') - { - $tokens = $this->phpcsFile->getTokens(); - - $token = $this->getTargetToken($testMarker, [T_STRING, T_FN], $testContent); - $tokenArray = $tokens[$token]; - - $this->assertSame('T_STRING', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_STRING'); - - $this->assertArrayNotHasKey('scope_condition', $tokenArray, 'Scope condition is set'); - $this->assertArrayNotHasKey('scope_opener', $tokenArray, 'Scope opener is set'); - $this->assertArrayNotHasKey('scope_closer', $tokenArray, 'Scope closer is set'); - $this->assertArrayNotHasKey('parenthesis_owner', $tokenArray, 'Parenthesis owner is set'); - $this->assertArrayNotHasKey('parenthesis_opener', $tokenArray, 'Parenthesis opener is set'); - $this->assertArrayNotHasKey('parenthesis_closer', $tokenArray, 'Parenthesis closer is set'); - - }//end testNotAnArrowFunction() - - - /** - * Data provider. - * - * @see testNotAnArrowFunction() - * - * @return array> - */ - public static function dataNotAnArrowFunction() - { - return [ - 'name of a function, context: declaration' => [ - 'testMarker' => '/* testFunctionName */', - ], - 'name of a constant, context: declaration using "const" keyword - uppercase' => [ - 'testMarker' => '/* testConstantDeclaration */', - 'testContent' => 'FN', - ], - 'name of a constant, context: declaration using "const" keyword - lowercase' => [ - 'testMarker' => '/* testConstantDeclarationLower */', - 'testContent' => 'fn', - ], - 'name of a (static) method, context: declaration' => [ - 'testMarker' => '/* testStaticMethodName */', - ], - 'name of a property, context: property access' => [ - 'testMarker' => '/* testPropertyAssignment */', - ], - 'name of a method, context: declaration in an anon class - mixed case' => [ - 'testMarker' => '/* testAnonClassMethodName */', - 'testContent' => 'fN', - ], - 'name of a method, context: static method call' => [ - 'testMarker' => '/* testNonArrowStaticMethodCall */', - ], - 'name of a constant, context: constant access - uppercase' => [ - 'testMarker' => '/* testNonArrowConstantAccess */', - 'testContent' => 'FN', - ], - 'name of a constant, context: constant access - mixed case' => [ - 'testMarker' => '/* testNonArrowConstantAccessMixed */', - 'testContent' => 'Fn', - ], - 'name of a method, context: method call on object - lowercase' => [ - 'testMarker' => '/* testNonArrowObjectMethodCall */', - ], - 'name of a method, context: method call on object - uppercase' => [ - 'testMarker' => '/* testNonArrowObjectMethodCallUpper */', - 'testContent' => 'FN', - ], - 'name of a (namespaced) function, context: partially qualified function call' => [ - 'testMarker' => '/* testNonArrowNamespacedFunctionCall */', - 'testContent' => 'Fn', - ], - 'name of a (namespaced) function, context: namespace relative function call' => [ - 'testMarker' => '/* testNonArrowNamespaceOperatorFunctionCall */', - ], - 'name of a function, context: declaration with union types for param and return' => [ - 'testMarker' => '/* testNonArrowFunctionNameWithUnionTypes */', - ], - 'unknown - live coding/parse error' => [ - 'testMarker' => '/* testLiveCoding */', - ], - ]; - - }//end dataNotAnArrowFunction() - - - /** - * Helper function to check that all token keys are correctly set for T_FN tokens. - * - * @param int $token The T_FN token to check. - * @param bool $skipScopeCloserCheck Whether to skip the scope closer check. - * This should be set to "true" when testing nested arrow functions, - * where the "inner" arrow function shares a scope closer with the - * "outer" arrow function, as the 'scope_condition' for the scope closer - * of the "inner" arrow function will point to the "outer" arrow function. - * - * @return void - */ - private function backfillHelper($token, $skipScopeCloserCheck=false) - { - $tokens = $this->phpcsFile->getTokens(); - - $this->assertArrayHasKey('scope_condition', $tokens[$token], 'Scope condition is not set'); - $this->assertArrayHasKey('scope_opener', $tokens[$token], 'Scope opener is not set'); - $this->assertArrayHasKey('scope_closer', $tokens[$token], 'Scope closer is not set'); - $this->assertSame($tokens[$token]['scope_condition'], $token, 'Scope condition is not the T_FN token'); - $this->assertArrayHasKey('parenthesis_owner', $tokens[$token], 'Parenthesis owner is not set'); - $this->assertArrayHasKey('parenthesis_opener', $tokens[$token], 'Parenthesis opener is not set'); - $this->assertArrayHasKey('parenthesis_closer', $tokens[$token], 'Parenthesis closer is not set'); - $this->assertSame($tokens[$token]['parenthesis_owner'], $token, 'Parenthesis owner is not the T_FN token'); - - $opener = $tokens[$token]['scope_opener']; - $this->assertArrayHasKey('scope_condition', $tokens[$opener], 'Opener scope condition is not set'); - $this->assertArrayHasKey('scope_opener', $tokens[$opener], 'Opener scope opener is not set'); - $this->assertArrayHasKey('scope_closer', $tokens[$opener], 'Opener scope closer is not set'); - $this->assertSame($tokens[$opener]['scope_condition'], $token, 'Opener scope condition is not the T_FN token'); - $this->assertSame(T_FN_ARROW, $tokens[$opener]['code'], 'Arrow scope opener not tokenized as T_FN_ARROW (code)'); - $this->assertSame('T_FN_ARROW', $tokens[$opener]['type'], 'Arrow scope opener not tokenized as T_FN_ARROW (type)'); - - $closer = $tokens[$token]['scope_closer']; - $this->assertArrayHasKey('scope_condition', $tokens[$closer], 'Closer scope condition is not set'); - $this->assertArrayHasKey('scope_opener', $tokens[$closer], 'Closer scope opener is not set'); - $this->assertArrayHasKey('scope_closer', $tokens[$closer], 'Closer scope closer is not set'); - if ($skipScopeCloserCheck === false) { - $this->assertSame($tokens[$closer]['scope_condition'], $token, 'Closer scope condition is not the T_FN token'); - } - - $opener = $tokens[$token]['parenthesis_opener']; - $this->assertArrayHasKey('parenthesis_owner', $tokens[$opener], 'Opening parenthesis owner is not set'); - $this->assertSame($tokens[$opener]['parenthesis_owner'], $token, 'Opening parenthesis owner is not the T_FN token'); - - $closer = $tokens[$token]['parenthesis_closer']; - $this->assertArrayHasKey('parenthesis_owner', $tokens[$closer], 'Closing parenthesis owner is not set'); - $this->assertSame($tokens[$closer]['parenthesis_owner'], $token, 'Closing parenthesis owner is not the T_FN token'); - - }//end backfillHelper() - - - /** - * Helper function to check that the scope opener/closer positions are correctly set for T_FN tokens. - * - * @param int $token The T_FN token to check. - * @param int $openerOffset The expected offset of the scope opener in relation to - * the fn keyword. - * @param int $closerOffset The expected offset of the scope closer in relation to - * the fn keyword. - * @param string $expectedCloserType Optional. The type of token expected for the scope closer. - * - * @return void - */ - private function scopePositionTestHelper($token, $openerOffset, $closerOffset, $expectedCloserType='semicolon') - { - $tokens = $this->phpcsFile->getTokens(); - $expectedScopeOpener = ($token + $openerOffset); - $expectedScopeCloser = ($token + $closerOffset); - - $this->assertSame($expectedScopeOpener, $tokens[$token]['scope_opener'], 'Scope opener is not the arrow token'); - $this->assertSame($expectedScopeCloser, $tokens[$token]['scope_closer'], 'Scope closer is not the '.$expectedCloserType.' token'); - - $opener = $tokens[$token]['scope_opener']; - $this->assertSame($expectedScopeOpener, $tokens[$opener]['scope_opener'], 'Opener scope opener is not the arrow token'); - $this->assertSame($expectedScopeCloser, $tokens[$opener]['scope_closer'], 'Opener scope closer is not the '.$expectedCloserType.' token'); - - $closer = $tokens[$token]['scope_closer']; - $this->assertSame($expectedScopeOpener, $tokens[$closer]['scope_opener'], 'Closer scope opener is not the arrow token'); - $this->assertSame($expectedScopeCloser, $tokens[$closer]['scope_closer'], 'Closer scope closer is not the '.$expectedCloserType.' token'); - - }//end scopePositionTestHelper() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillMatchTokenTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillMatchTokenTest.inc deleted file mode 100644 index 095a4d7..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillMatchTokenTest.inc +++ /dev/null @@ -1,319 +0,0 @@ - 'Zero', - 1 => 'One', - 2 => 'Two', - }; -} - -function matchNoTrailingComma($bool) { - /* testMatchNoTrailingComma */ - echo match ($bool) { - true => "true\n", - false => "false\n" - }; -} - -function matchWithDefault($i) { - /* testMatchWithDefault */ - return match ($i) { - 1 => 1, - 2 => 2, - default => 'default', - }; -} - -function matchExpressionInCondition($i) { - /* testMatchExpressionInCondition */ - return match (true) { - $i >= 50 => '50+', - $i >= 40 => '40-50', - $i >= 30 => '30-40', - $i >= 20 => '20-30', - $i >= 10 => '10-20', - default => '0-10', - }; -} - -function matchMultiCase($day) { - /* testMatchMultiCase */ - return match ($day) { - 1, 7 => false, - 2, 3, 4, 5, 6 => true, - }; -} - -function matchMultiCaseTrailingCommaInCase($bool) { - /* testMatchMultiCaseTrailingCommaInCase */ - echo match ($bool) { - false, - 0, - => "false\n", - true, - 1, - => "true\n", - default, - => "not bool\n", - }; -} - -assert((function () { - /* testMatchInClosureNotLowercase */ - Match ('foo') { - 'foo', 'bar' => false, - 'baz' => 'a', - default => 'b', - }; -})()); - -function matchInArrowFunction($x) { - /* testMatchInArrowFunction */ - $fn = fn($x) => match(true) { - 1, 2, 3, 4, 5 => 'foo', - default => 'bar', - }; -} - -function arrowFunctionInMatchNoTrailingComma($x) { - /* testArrowFunctionInMatchNoTrailingComma */ - return match ($x) { - 1 => fn($y) => callMe($y), - default => fn($y) => callThem($y) - }; -} - -/* testMatchInFunctionCallParamNotLowercase */ -var_dump(MATCH ( 'foo' ) { - 'foo' => dump_and_return('foo'), - 'bar' => dump_and_return('bar'), -}); - -/* testMatchInMethodCallParam */ -Test::usesValue(match(true) { true => $i }); - -/* testMatchDiscardResult */ -match (1) { - 1 => print "Executed\n", -}; - -/* testMatchWithDuplicateConditionsWithComments */ -echo match /*comment*/ ( $value /*comment*/ ) { - // Comment. - 2, 1 => '2, 1', - 1 => 1, - 3 => 3, - 4 => 4, - 5 => 5, -}; - -/* testNestedMatchOuter */ -$x = match ($y) { - /* testNestedMatchInner */ - default => match ($z) { 1 => 1 }, -}; - -/* testMatchInTernaryCondition */ -$x = match ($test) { 1 => 'a', 2 => 'b' } ? - /* testMatchInTernaryThen */ match ($test) { 1 => 'a', 2 => 'b' } : - /* testMatchInTernaryElse */ match ($notTest) { 3 => 'a', 4 => 'b' }; - -/* testMatchInArrayValue */ -$array = array( - match ($test) { 1 => 'a', 2 => 'b' }, -); - -/* testMatchInArrayKey */ -$array = [ - match ($test) { 1 => 'a', 2 => 'b' } => 'dynamic keys, woho!', -]; - -/* testMatchreturningArray */ -$matcher = match ($x) { - 0 => array( 0 => 1, 'a' => 2, 'b' => 3 ), - 1 => [1, 2, 3], - 2 => array( 1, [1, 2, 3], 2, 3), - 3 => [ 0 => 1, 'a' => array(1, 2, 3), 'b' => 2, 3], -}; - -/* testSwitchContainingMatch */ -switch ($something) { - /* testMatchWithDefaultNestedInSwitchCase1 */ - case 'foo': - $var = [1, 2, 3]; - $var = match ($i) { - 1 => 1, - default => 'default', - }; - continue 2; - - /* testMatchWithDefaultNestedInSwitchCase2 */ - case 'bar' ; - $i = callMe($a, $b); - return match ($i) { - 1 => 1, - default => 'default', - }; - - /* testMatchWithDefaultNestedInSwitchDefault */ - default: - echo 'something', match ($i) { - 1 => 1, - default => 'default', - }; - break; -} - -/* testMatchContainingSwitch */ -$x = match ($y) { - 5, 8 => function($z) { - /* testSwitchNestedInMatch1 */ - switch($z) { - case 'a': - $var = [1, 2, 3]; - return 'a'; - /* testSwitchDefaultNestedInMatchCase */ - default: - $i = callMe($a, $b); - return 'default1'; - } - }, - default => function($z) { - /* testSwitchNestedInMatch2 */ - switch($z) { - case 'a'; - $i = callMe($a, $b); - return 'b'; - /* testSwitchDefaultNestedInMatchDefault */ - default; - $var = [1, 2, 3]; - return 'default2'; - } - } -}; - -/* testMatchNoCases */ -// Intentional fatal error. -$x = match (true) {}; - -/* testMatchMultiDefault */ -// Intentional fatal error. -echo match (1) { - default => 'foo', - 1 => 'bar', - 2 => 'baz', - default => 'qux', -}; - -/* testNoMatchStaticMethodCall */ -$a = Foo::match($param); - -/* testNoMatchClassConstantAccess */ -$a = MyClass::MATCH; - -/* testNoMatchClassConstantArrayAccessMixedCase */ -$a = MyClass::Match[$a]; - -/* testNoMatchMethodCall */ -$a = $obj->match($param); - -/* testNoMatchMethodCallUpper */ -$a = $obj??->MATCH()->chain($param); - -/* testNoMatchPropertyAccess */ -$a = $obj->match; - -/* testNoMatchNamespacedFunctionCall */ -// Intentional fatal error. -$a = MyNS\Sub\match($param); - -/* testNoMatchNamespaceOperatorFunctionCall */ -// Intentional fatal error. -$a = namespace\match($param); - -interface MatchInterface { - /* testNoMatchInterfaceMethodDeclaration */ - public static function match($param); -} - -class MatchClass { - /* testNoMatchClassConstantDeclarationLower */ - const match = 'a'; - - /* testNoMatchClassMethodDeclaration */ - public static function match($param) { - /* testNoMatchPropertyAssignment */ - $this->match = 'a'; - } -} - -/* testNoMatchClassInstantiation */ -$obj = new Match(); - -$anon = new class() { - /* testNoMatchAnonClassMethodDeclaration */ - protected function maTCH($param) { - } -}; - -/* testNoMatchClassDeclaration */ -// Intentional fatal error. Match is now a reserved keyword. -class Match {} - -/* testNoMatchInterfaceDeclaration */ -// Intentional fatal error. Match is now a reserved keyword. -interface Match {} - -/* testNoMatchTraitDeclaration */ -// Intentional fatal error. Match is now a reserved keyword. -trait Match {} - -/* testNoMatchConstantDeclaration */ -// Intentional fatal error. Match is now a reserved keyword. -const MATCH = '1'; - -/* testNoMatchFunctionDeclaration */ -// Intentional fatal error. Match is now a reserved keyword. -function match() {} - -/* testNoMatchNamespaceDeclaration */ -// Intentional fatal error. Match is now a reserved keyword. -namespace Match {} - -/* testNoMatchExtendedClassDeclaration */ -// Intentional fatal error. Match is now a reserved keyword. -class Foo extends Match {} - -/* testNoMatchImplementedClassDeclaration */ -// Intentional fatal error. Match is now a reserved keyword. -class Bar implements Match {} - -/* testNoMatchInUseStatement */ -// Intentional fatal error in PHP < 8. Match is now a reserved keyword. -use Match\me; - -function brokenMatchNoCurlies($x) { - /* testNoMatchMissingCurlies */ - // Intentional fatal error. New control structure is not supported without curly braces. - return match ($x) - 0 => 'Zero', - 1 => 'One', - 2 => 'Two', - ; -} - -function brokenMatchAlternativeSyntax($x) { - /* testNoMatchAlternativeSyntax */ - // Intentional fatal error. Alternative syntax is not supported. - return match ($x) : - 0 => 'Zero', - 1 => 'One', - 2 => 'Two', - endmatch; -} - -/* testLiveCoding */ -// Intentional parse error. This has to be the last test in the file. -echo match diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillMatchTokenTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillMatchTokenTest.php deleted file mode 100644 index 93105be..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillMatchTokenTest.php +++ /dev/null @@ -1,555 +0,0 @@ - - * @copyright 2020-2021 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\PHP; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; -use PHP_CodeSniffer\Util\Tokens; - -final class BackfillMatchTokenTest extends AbstractTokenizerTestCase -{ - - - /** - * Test tokenization of match expressions. - * - * @param string $testMarker The comment prefacing the target token. - * @param int $openerOffset The expected offset of the scope opener in relation to the testMarker. - * @param int $closerOffset The expected offset of the scope closer in relation to the testMarker. - * @param string $testContent The token content to look for. - * - * @dataProvider dataMatchExpression - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testMatchExpression($testMarker, $openerOffset, $closerOffset, $testContent='match') - { - $tokens = $this->phpcsFile->getTokens(); - - $token = $this->getTargetToken($testMarker, [T_STRING, T_MATCH], $testContent); - $tokenArray = $tokens[$token]; - - $this->assertSame(T_MATCH, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_MATCH (code)'); - $this->assertSame('T_MATCH', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_MATCH (type)'); - - $this->scopeTestHelper($token, $openerOffset, $closerOffset); - $this->parenthesisTestHelper($token); - - }//end testMatchExpression() - - - /** - * Data provider. - * - * @see testMatchExpression() - * - * @return array> - */ - public static function dataMatchExpression() - { - return [ - 'simple_match' => [ - 'testMarker' => '/* testMatchSimple */', - 'openerOffset' => 6, - 'closerOffset' => 33, - ], - 'no_trailing_comma' => [ - 'testMarker' => '/* testMatchNoTrailingComma */', - 'openerOffset' => 6, - 'closerOffset' => 24, - ], - 'with_default_case' => [ - 'testMarker' => '/* testMatchWithDefault */', - 'openerOffset' => 6, - 'closerOffset' => 33, - ], - 'expression_in_condition' => [ - 'testMarker' => '/* testMatchExpressionInCondition */', - 'openerOffset' => 6, - 'closerOffset' => 77, - ], - 'multicase' => [ - 'testMarker' => '/* testMatchMultiCase */', - 'openerOffset' => 6, - 'closerOffset' => 40, - ], - 'multicase_trailing_comma_in_case' => [ - 'testMarker' => '/* testMatchMultiCaseTrailingCommaInCase */', - 'openerOffset' => 6, - 'closerOffset' => 47, - ], - 'in_closure_not_lowercase' => [ - 'testMarker' => '/* testMatchInClosureNotLowercase */', - 'openerOffset' => 6, - 'closerOffset' => 36, - 'testContent' => 'Match', - ], - 'in_arrow_function' => [ - 'testMarker' => '/* testMatchInArrowFunction */', - 'openerOffset' => 5, - 'closerOffset' => 36, - ], - 'arrow_function_in_match_no_trailing_comma' => [ - 'testMarker' => '/* testArrowFunctionInMatchNoTrailingComma */', - 'openerOffset' => 6, - 'closerOffset' => 44, - ], - 'in_function_call_param_not_lowercase' => [ - 'testMarker' => '/* testMatchInFunctionCallParamNotLowercase */', - 'openerOffset' => 8, - 'closerOffset' => 32, - 'testContent' => 'MATCH', - ], - 'in_method_call_param' => [ - 'testMarker' => '/* testMatchInMethodCallParam */', - 'openerOffset' => 5, - 'closerOffset' => 13, - ], - 'discard_result' => [ - 'testMarker' => '/* testMatchDiscardResult */', - 'openerOffset' => 6, - 'closerOffset' => 18, - ], - 'duplicate_conditions_and_comments' => [ - 'testMarker' => '/* testMatchWithDuplicateConditionsWithComments */', - 'openerOffset' => 12, - 'closerOffset' => 59, - ], - 'nested_match_outer' => [ - 'testMarker' => '/* testNestedMatchOuter */', - 'openerOffset' => 6, - 'closerOffset' => 33, - ], - 'nested_match_inner' => [ - 'testMarker' => '/* testNestedMatchInner */', - 'openerOffset' => 6, - 'closerOffset' => 14, - ], - 'ternary_condition' => [ - 'testMarker' => '/* testMatchInTernaryCondition */', - 'openerOffset' => 6, - 'closerOffset' => 21, - ], - 'ternary_then' => [ - 'testMarker' => '/* testMatchInTernaryThen */', - 'openerOffset' => 6, - 'closerOffset' => 21, - ], - 'ternary_else' => [ - 'testMarker' => '/* testMatchInTernaryElse */', - 'openerOffset' => 6, - 'closerOffset' => 21, - ], - 'array_value' => [ - 'testMarker' => '/* testMatchInArrayValue */', - 'openerOffset' => 6, - 'closerOffset' => 21, - ], - 'array_key' => [ - 'testMarker' => '/* testMatchInArrayKey */', - 'openerOffset' => 6, - 'closerOffset' => 21, - ], - 'returning_array' => [ - 'testMarker' => '/* testMatchreturningArray */', - 'openerOffset' => 6, - 'closerOffset' => 125, - ], - 'nested_in_switch_case_1' => [ - 'testMarker' => '/* testMatchWithDefaultNestedInSwitchCase1 */', - 'openerOffset' => 6, - 'closerOffset' => 25, - ], - 'nested_in_switch_case_2' => [ - 'testMarker' => '/* testMatchWithDefaultNestedInSwitchCase2 */', - 'openerOffset' => 6, - 'closerOffset' => 25, - ], - 'nested_in_switch_default' => [ - 'testMarker' => '/* testMatchWithDefaultNestedInSwitchDefault */', - 'openerOffset' => 6, - 'closerOffset' => 25, - ], - 'match_with_nested_switch' => [ - 'testMarker' => '/* testMatchContainingSwitch */', - 'openerOffset' => 6, - 'closerOffset' => 180, - ], - 'no_cases' => [ - 'testMarker' => '/* testMatchNoCases */', - 'openerOffset' => 6, - 'closerOffset' => 7, - ], - 'multi_default' => [ - 'testMarker' => '/* testMatchMultiDefault */', - 'openerOffset' => 6, - 'closerOffset' => 40, - ], - ]; - - }//end dataMatchExpression() - - - /** - * Verify that "match" keywords which are not match control structures get tokenized as T_STRING - * and don't have the extra token array indexes. - * - * @param string $testMarker The comment prefacing the target token. - * @param string $testContent The token content to look for. - * - * @dataProvider dataNotAMatchStructure - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testNotAMatchStructure($testMarker, $testContent='match') - { - $tokens = $this->phpcsFile->getTokens(); - - $token = $this->getTargetToken($testMarker, [T_STRING, T_MATCH], $testContent); - $tokenArray = $tokens[$token]; - - $this->assertSame(T_STRING, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_STRING (code)'); - $this->assertSame('T_STRING', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_STRING (type)'); - - $this->assertArrayNotHasKey('scope_condition', $tokenArray, 'Scope condition is set'); - $this->assertArrayNotHasKey('scope_opener', $tokenArray, 'Scope opener is set'); - $this->assertArrayNotHasKey('scope_closer', $tokenArray, 'Scope closer is set'); - $this->assertArrayNotHasKey('parenthesis_owner', $tokenArray, 'Parenthesis owner is set'); - $this->assertArrayNotHasKey('parenthesis_opener', $tokenArray, 'Parenthesis opener is set'); - $this->assertArrayNotHasKey('parenthesis_closer', $tokenArray, 'Parenthesis closer is set'); - - $next = $this->phpcsFile->findNext(Tokens::$emptyTokens, ($token + 1), null, true); - if ($next !== false && $tokens[$next]['code'] === T_OPEN_PARENTHESIS) { - $this->assertArrayNotHasKey('parenthesis_owner', $tokenArray, 'Parenthesis owner is set for opener after'); - } - - }//end testNotAMatchStructure() - - - /** - * Data provider. - * - * @see testNotAMatchStructure() - * - * @return array> - */ - public static function dataNotAMatchStructure() - { - return [ - 'static_method_call' => [ - 'testMarker' => '/* testNoMatchStaticMethodCall */', - ], - 'class_constant_access' => [ - 'testMarker' => '/* testNoMatchClassConstantAccess */', - 'testContent' => 'MATCH', - ], - 'class_constant_array_access' => [ - 'testMarker' => '/* testNoMatchClassConstantArrayAccessMixedCase */', - 'testContent' => 'Match', - ], - 'method_call' => [ - 'testMarker' => '/* testNoMatchMethodCall */', - ], - 'method_call_uppercase' => [ - 'testMarker' => '/* testNoMatchMethodCallUpper */', - 'testContent' => 'MATCH', - ], - 'property_access' => [ - 'testMarker' => '/* testNoMatchPropertyAccess */', - ], - 'namespaced_function_call' => [ - 'testMarker' => '/* testNoMatchNamespacedFunctionCall */', - ], - 'namespace_operator_function_call' => [ - 'testMarker' => '/* testNoMatchNamespaceOperatorFunctionCall */', - ], - 'interface_method_declaration' => [ - 'testMarker' => '/* testNoMatchInterfaceMethodDeclaration */', - ], - 'class_constant_declaration' => [ - 'testMarker' => '/* testNoMatchClassConstantDeclarationLower */', - ], - 'class_method_declaration' => [ - 'testMarker' => '/* testNoMatchClassMethodDeclaration */', - ], - 'property_assigment' => [ - 'testMarker' => '/* testNoMatchPropertyAssignment */', - ], - 'class_instantiation' => [ - 'testMarker' => '/* testNoMatchClassInstantiation */', - 'testContent' => 'Match', - ], - 'anon_class_method_declaration' => [ - 'testMarker' => '/* testNoMatchAnonClassMethodDeclaration */', - 'testContent' => 'maTCH', - ], - 'class_declaration' => [ - 'testMarker' => '/* testNoMatchClassDeclaration */', - 'testContent' => 'Match', - ], - 'interface_declaration' => [ - 'testMarker' => '/* testNoMatchInterfaceDeclaration */', - 'testContent' => 'Match', - ], - 'trait_declaration' => [ - 'testMarker' => '/* testNoMatchTraitDeclaration */', - 'testContent' => 'Match', - ], - 'constant_declaration' => [ - 'testMarker' => '/* testNoMatchConstantDeclaration */', - 'testContent' => 'MATCH', - ], - 'function_declaration' => [ - 'testMarker' => '/* testNoMatchFunctionDeclaration */', - ], - 'namespace_declaration' => [ - 'testMarker' => '/* testNoMatchNamespaceDeclaration */', - 'testContent' => 'Match', - ], - 'class_extends_declaration' => [ - 'testMarker' => '/* testNoMatchExtendedClassDeclaration */', - 'testContent' => 'Match', - ], - 'class_implements_declaration' => [ - 'testMarker' => '/* testNoMatchImplementedClassDeclaration */', - 'testContent' => 'Match', - ], - 'use_statement' => [ - 'testMarker' => '/* testNoMatchInUseStatement */', - 'testContent' => 'Match', - ], - 'unsupported_inline_control_structure' => [ - 'testMarker' => '/* testNoMatchMissingCurlies */', - ], - 'unsupported_alternative_syntax' => [ - 'testMarker' => '/* testNoMatchAlternativeSyntax */', - ], - 'live_coding' => [ - 'testMarker' => '/* testLiveCoding */', - ], - ]; - - }//end dataNotAMatchStructure() - - - /** - * Verify that the tokenization of switch structures is not affected by the backfill. - * - * @param string $testMarker The comment prefacing the target token. - * @param int $openerOffset The expected offset of the scope opener in relation to the testMarker. - * @param int $closerOffset The expected offset of the scope closer in relation to the testMarker. - * - * @dataProvider dataSwitchExpression - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testSwitchExpression($testMarker, $openerOffset, $closerOffset) - { - $token = $this->getTargetToken($testMarker, T_SWITCH); - - $this->scopeTestHelper($token, $openerOffset, $closerOffset); - $this->parenthesisTestHelper($token); - - }//end testSwitchExpression() - - - /** - * Data provider. - * - * @see testSwitchExpression() - * - * @return array> - */ - public static function dataSwitchExpression() - { - return [ - 'switch_containing_match' => [ - 'testMarker' => '/* testSwitchContainingMatch */', - 'openerOffset' => 6, - 'closerOffset' => 174, - ], - 'match_containing_switch_1' => [ - 'testMarker' => '/* testSwitchNestedInMatch1 */', - 'openerOffset' => 5, - 'closerOffset' => 63, - ], - 'match_containing_switch_2' => [ - 'testMarker' => '/* testSwitchNestedInMatch2 */', - 'openerOffset' => 5, - 'closerOffset' => 63, - ], - ]; - - }//end dataSwitchExpression() - - - /** - * Verify that the tokenization of a switch case/default structure containing a match structure - * or contained *in* a match structure is not affected by the backfill. - * - * @param string $testMarker The comment prefacing the target token. - * @param int $openerOffset The expected offset of the scope opener in relation to the testMarker. - * @param int $closerOffset The expected offset of the scope closer in relation to the testMarker. - * - * @dataProvider dataSwitchCaseVersusMatch - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testSwitchCaseVersusMatch($testMarker, $openerOffset, $closerOffset) - { - $token = $this->getTargetToken($testMarker, [T_CASE, T_DEFAULT]); - - $this->scopeTestHelper($token, $openerOffset, $closerOffset); - - }//end testSwitchCaseVersusMatch() - - - /** - * Data provider. - * - * @see testSwitchCaseVersusMatch() - * - * @return array> - */ - public static function dataSwitchCaseVersusMatch() - { - return [ - 'switch_with_nested_match_case_1' => [ - 'testMarker' => '/* testMatchWithDefaultNestedInSwitchCase1 */', - 'openerOffset' => 3, - 'closerOffset' => 55, - ], - 'switch_with_nested_match_case_2' => [ - 'testMarker' => '/* testMatchWithDefaultNestedInSwitchCase2 */', - 'openerOffset' => 4, - 'closerOffset' => 21, - ], - 'switch_with_nested_match_default_case' => [ - 'testMarker' => '/* testMatchWithDefaultNestedInSwitchDefault */', - 'openerOffset' => 1, - 'closerOffset' => 38, - ], - 'match_with_nested_switch_case' => [ - 'testMarker' => '/* testSwitchDefaultNestedInMatchCase */', - 'openerOffset' => 1, - 'closerOffset' => 18, - ], - 'match_with_nested_switch_default_case' => [ - 'testMarker' => '/* testSwitchDefaultNestedInMatchDefault */', - 'openerOffset' => 1, - 'closerOffset' => 20, - ], - ]; - - }//end dataSwitchCaseVersusMatch() - - - /** - * Helper function to verify that all scope related array indexes for a control structure - * are set correctly. - * - * @param int $token The control structure token to check. - * @param int $openerOffset The expected offset of the scope opener in relation to - * the control structure token. - * @param int $closerOffset The expected offset of the scope closer in relation to - * the control structure token. - * @param bool $skipScopeCloserCheck Whether to skip the scope closer check. - * This should be set to "true" when testing nested arrow functions, - * where the "inner" arrow function shares a scope closer with the - * "outer" arrow function, as the 'scope_condition' for the scope closer - * of the "inner" arrow function will point to the "outer" arrow function. - * - * @return void - */ - private function scopeTestHelper($token, $openerOffset, $closerOffset, $skipScopeCloserCheck=false) - { - $tokens = $this->phpcsFile->getTokens(); - $tokenArray = $tokens[$token]; - $tokenType = $tokenArray['type']; - $expectedScopeOpener = ($token + $openerOffset); - $expectedScopeCloser = ($token + $closerOffset); - - $this->assertArrayHasKey('scope_condition', $tokenArray, 'Scope condition is not set'); - $this->assertArrayHasKey('scope_opener', $tokenArray, 'Scope opener is not set'); - $this->assertArrayHasKey('scope_closer', $tokenArray, 'Scope closer is not set'); - $this->assertSame($token, $tokenArray['scope_condition'], 'Scope condition is not the '.$tokenType.' token'); - $this->assertSame($expectedScopeOpener, $tokenArray['scope_opener'], 'Scope opener of the '.$tokenType.' token incorrect'); - $this->assertSame($expectedScopeCloser, $tokenArray['scope_closer'], 'Scope closer of the '.$tokenType.' token incorrect'); - - $opener = $tokenArray['scope_opener']; - $this->assertArrayHasKey('scope_condition', $tokens[$opener], 'Opener scope condition is not set'); - $this->assertArrayHasKey('scope_opener', $tokens[$opener], 'Opener scope opener is not set'); - $this->assertArrayHasKey('scope_closer', $tokens[$opener], 'Opener scope closer is not set'); - $this->assertSame($token, $tokens[$opener]['scope_condition'], 'Opener scope condition is not the '.$tokenType.' token'); - $this->assertSame($expectedScopeOpener, $tokens[$opener]['scope_opener'], $tokenType.' opener scope opener token incorrect'); - $this->assertSame($expectedScopeCloser, $tokens[$opener]['scope_closer'], $tokenType.' opener scope closer token incorrect'); - - $closer = $tokenArray['scope_closer']; - $this->assertArrayHasKey('scope_condition', $tokens[$closer], 'Closer scope condition is not set'); - $this->assertArrayHasKey('scope_opener', $tokens[$closer], 'Closer scope opener is not set'); - $this->assertArrayHasKey('scope_closer', $tokens[$closer], 'Closer scope closer is not set'); - if ($skipScopeCloserCheck === false) { - $this->assertSame($token, $tokens[$closer]['scope_condition'], 'Closer scope condition is not the '.$tokenType.' token'); - } - - $this->assertSame($expectedScopeOpener, $tokens[$closer]['scope_opener'], $tokenType.' closer scope opener token incorrect'); - $this->assertSame($expectedScopeCloser, $tokens[$closer]['scope_closer'], $tokenType.' closer scope closer token incorrect'); - - if (($opener + 1) !== $closer) { - for ($i = ($opener + 1); $i < $closer; $i++) { - $this->assertArrayHasKey( - $token, - $tokens[$i]['conditions'], - $tokenType.' condition not added for token belonging to the '.$tokenType.' structure' - ); - } - } - - }//end scopeTestHelper() - - - /** - * Helper function to verify that all parenthesis related array indexes for a control structure - * token are set correctly. - * - * @param int $token The position of the control structure token. - * - * @return void - */ - private function parenthesisTestHelper($token) - { - $tokens = $this->phpcsFile->getTokens(); - $tokenArray = $tokens[$token]; - $tokenType = $tokenArray['type']; - - $this->assertArrayHasKey('parenthesis_owner', $tokenArray, 'Parenthesis owner is not set'); - $this->assertArrayHasKey('parenthesis_opener', $tokenArray, 'Parenthesis opener is not set'); - $this->assertArrayHasKey('parenthesis_closer', $tokenArray, 'Parenthesis closer is not set'); - $this->assertSame($token, $tokenArray['parenthesis_owner'], 'Parenthesis owner is not the '.$tokenType.' token'); - - $opener = $tokenArray['parenthesis_opener']; - $this->assertArrayHasKey('parenthesis_owner', $tokens[$opener], 'Opening parenthesis owner is not set'); - $this->assertSame($token, $tokens[$opener]['parenthesis_owner'], 'Opening parenthesis owner is not the '.$tokenType.' token'); - - $closer = $tokenArray['parenthesis_closer']; - $this->assertArrayHasKey('parenthesis_owner', $tokens[$closer], 'Closing parenthesis owner is not set'); - $this->assertSame($token, $tokens[$closer]['parenthesis_owner'], 'Closing parenthesis owner is not the '.$tokenType.' token'); - - }//end parenthesisTestHelper() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillNumericSeparatorTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillNumericSeparatorTest.inc deleted file mode 100644 index d855970..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillNumericSeparatorTest.inc +++ /dev/null @@ -1,94 +0,0 @@ - - * @copyright 2019 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\PHP; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; -use PHP_CodeSniffer\Util\Tokens; - -final class BackfillNumericSeparatorTest extends AbstractTokenizerTestCase -{ - - - /** - * Test that numbers using numeric separators are tokenized correctly. - * - * @param string $marker The comment which prefaces the target token in the test file. - * @param string $type The expected token type. - * @param string $value The expected token content. - * - * @dataProvider dataTestBackfill - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testBackfill($marker, $type, $value) - { - $tokens = $this->phpcsFile->getTokens(); - $number = $this->getTargetToken($marker, [T_LNUMBER, T_DNUMBER]); - $tokenArray = $tokens[$number]; - - $this->assertSame(constant($type), $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not '.$type.' (code)'); - $this->assertSame($type, $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not '.$type.' (type)'); - $this->assertSame($value, $tokenArray['content']); - - }//end testBackfill() - - - /** - * Data provider. - * - * @see testBackfill() - * - * @return array> - */ - public static function dataTestBackfill() - { - $testHexType = 'T_LNUMBER'; - if (PHP_INT_MAX < 0xCAFEF00D) { - $testHexType = 'T_DNUMBER'; - } - - $testHexMultipleType = 'T_LNUMBER'; - if (PHP_INT_MAX < 0x42726F776E) { - $testHexMultipleType = 'T_DNUMBER'; - } - - $testIntMoreThanMaxType = 'T_LNUMBER'; - if (PHP_INT_MAX < 10223372036854775807) { - $testIntMoreThanMaxType = 'T_DNUMBER'; - } - - return [ - 'decimal integer' => [ - 'marker' => '/* testSimpleLNumber */', - 'type' => 'T_LNUMBER', - 'value' => '1_000_000_000', - ], - 'float' => [ - 'marker' => '/* testSimpleDNumber */', - 'type' => 'T_DNUMBER', - 'value' => '107_925_284.88', - ], - 'float, scientific notation, negative exponent with sigh' => [ - 'marker' => '/* testFloat */', - 'type' => 'T_DNUMBER', - 'value' => '6.674_083e-11', - ], - 'float, scientific notation, positive exponent with sign' => [ - 'marker' => '/* testFloat2 */', - 'type' => 'T_DNUMBER', - 'value' => '6.674_083e+11', - ], - 'float, scientific notation, positive exponent without sign' => [ - 'marker' => '/* testFloat3 */', - 'type' => 'T_DNUMBER', - 'value' => '1_2.3_4e1_23', - ], - 'hexidecimal integer/float' => [ - 'marker' => '/* testHex */', - 'type' => $testHexType, - 'value' => '0xCAFE_F00D', - ], - 'hexidecimal integer/float with multiple underscores' => [ - 'marker' => '/* testHexMultiple */', - 'type' => $testHexMultipleType, - 'value' => '0x42_72_6F_77_6E', - ], - 'hexidecimal integer' => [ - 'marker' => '/* testHexInt */', - 'type' => 'T_LNUMBER', - 'value' => '0x42_72_6F', - ], - 'binary integer' => [ - 'marker' => '/* testBinary */', - 'type' => 'T_LNUMBER', - 'value' => '0b0101_1111', - ], - 'octal integer' => [ - 'marker' => '/* testOctal */', - 'type' => 'T_LNUMBER', - 'value' => '0137_041', - ], - 'octal integer using explicit octal notation' => [ - 'marker' => '/* testExplicitOctal */', - 'type' => 'T_LNUMBER', - 'value' => '0o137_041', - ], - 'octal integer using explicit octal notation with capital O' => [ - 'marker' => '/* testExplicitOctalCapitalised */', - 'type' => 'T_LNUMBER', - 'value' => '0O137_041', - ], - 'integer more than PHP_INT_MAX becomes a float' => [ - 'marker' => '/* testIntMoreThanMax */', - 'type' => $testIntMoreThanMaxType, - 'value' => '10_223_372_036_854_775_807', - ], - ]; - - }//end dataTestBackfill() - - - /** - * Test that numbers using numeric separators which are considered parse errors and/or - * which aren't relevant to the backfill, do not incorrectly trigger the backfill anyway. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * @param array> $expectedTokens The token type and content of the expected token sequence. - * - * @dataProvider dataNoBackfill - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testNoBackfill($testMarker, $expectedTokens) - { - $tokens = $this->phpcsFile->getTokens(); - $number = $this->getTargetToken($testMarker, [T_LNUMBER, T_DNUMBER]); - - foreach ($expectedTokens as $key => $expectedToken) { - $i = ($number + $key); - $this->assertSame( - $expectedToken['code'], - $tokens[$i]['code'], - 'Token tokenized as '.Tokens::tokenName($tokens[$i]['code']).', not '.Tokens::tokenName($expectedToken['code']) - ); - $this->assertSame($expectedToken['content'], $tokens[$i]['content']); - } - - }//end testNoBackfill() - - - /** - * Data provider. - * - * @see testBackfill() - * - * @return array>>> - */ - public static function dataNoBackfill() - { - return [ - 'invalid: trailing underscore' => [ - 'testMarker' => '/* testInvalid1 */', - 'expectedTokens' => [ - [ - 'code' => T_LNUMBER, - 'content' => '100', - ], - [ - 'code' => T_STRING, - 'content' => '_', - ], - ], - ], - 'invalid: two consecutive underscores' => [ - 'testMarker' => '/* testInvalid2 */', - 'expectedTokens' => [ - [ - 'code' => T_LNUMBER, - 'content' => '1', - ], - [ - 'code' => T_STRING, - 'content' => '__1', - ], - ], - ], - 'invalid: underscore directly before decimal point' => [ - 'testMarker' => '/* testInvalid3 */', - 'expectedTokens' => [ - [ - 'code' => T_LNUMBER, - 'content' => '1', - ], - [ - 'code' => T_STRING, - 'content' => '_', - ], - [ - 'code' => T_DNUMBER, - 'content' => '.0', - ], - ], - ], - 'invalid: underscore directly after decimal point' => [ - 'testMarker' => '/* testInvalid4 */', - 'expectedTokens' => [ - [ - 'code' => T_DNUMBER, - 'content' => '1.', - ], - [ - 'code' => T_STRING, - 'content' => '_0', - ], - ], - ], - 'invalid: hex int - underscore directly after x' => [ - 'testMarker' => '/* testInvalid5 */', - 'expectedTokens' => [ - [ - 'code' => T_LNUMBER, - 'content' => '0', - ], - [ - 'code' => T_STRING, - 'content' => 'x_123', - ], - ], - ], - 'invalid: binary int - underscore directly after b' => [ - 'testMarker' => '/* testInvalid6 */', - 'expectedTokens' => [ - [ - 'code' => T_LNUMBER, - 'content' => '0', - ], - [ - 'code' => T_STRING, - 'content' => 'b_101', - ], - ], - ], - 'invalid: scientific float - underscore directly before e' => [ - 'testMarker' => '/* testInvalid7 */', - 'expectedTokens' => [ - [ - 'code' => T_LNUMBER, - 'content' => '1', - ], - [ - 'code' => T_STRING, - 'content' => '_e2', - ], - ], - ], - 'invalid: scientific float - underscore directly after e' => [ - 'testMarker' => '/* testInvalid8 */', - 'expectedTokens' => [ - [ - 'code' => T_LNUMBER, - 'content' => '1', - ], - [ - 'code' => T_STRING, - 'content' => 'e_2', - ], - ], - ], - 'invalid: space between parts of the number' => [ - 'testMarker' => '/* testInvalid9 */', - 'expectedTokens' => [ - [ - 'code' => T_LNUMBER, - 'content' => '107_925_284', - ], - [ - 'code' => T_WHITESPACE, - 'content' => ' ', - ], - [ - 'code' => T_DNUMBER, - 'content' => '.88', - ], - ], - ], - 'invalid: comment within the number' => [ - 'testMarker' => '/* testInvalid10 */', - 'expectedTokens' => [ - [ - 'code' => T_LNUMBER, - 'content' => '107_925_284', - ], - [ - 'code' => T_COMMENT, - 'content' => '/*comment*/', - ], - [ - 'code' => T_DNUMBER, - 'content' => '.88', - ], - ], - ], - 'invalid: explicit octal int - underscore directly after o' => [ - 'testMarker' => '/* testInvalid11 */', - 'expectedTokens' => [ - [ - 'code' => T_LNUMBER, - 'content' => '0', - ], - [ - 'code' => T_STRING, - 'content' => 'o_137', - ], - ], - ], - 'invalid: explicit octal int - underscore directly after capital O' => [ - 'testMarker' => '/* testInvalid12 */', - 'expectedTokens' => [ - [ - 'code' => T_LNUMBER, - 'content' => '0', - ], - [ - 'code' => T_STRING, - 'content' => 'O_41', - ], - ], - ], - 'calculations should be untouched - int - int' => [ - 'testMarker' => '/* testCalc1 */', - 'expectedTokens' => [ - [ - 'code' => T_LNUMBER, - 'content' => '667_083', - ], - [ - 'code' => T_WHITESPACE, - 'content' => ' ', - ], - [ - 'code' => T_MINUS, - 'content' => '-', - ], - [ - 'code' => T_WHITESPACE, - 'content' => ' ', - ], - [ - 'code' => T_LNUMBER, - 'content' => '11', - ], - ], - ], - 'calculations should be untouched - scientific float + int' => [ - 'testMarker' => '/* test Calc2 */', - 'expectedTokens' => [ - [ - 'code' => T_DNUMBER, - 'content' => '6.674_08e3', - ], - [ - 'code' => T_WHITESPACE, - 'content' => ' ', - ], - [ - 'code' => T_PLUS, - 'content' => '+', - ], - [ - 'code' => T_WHITESPACE, - 'content' => ' ', - ], - [ - 'code' => T_LNUMBER, - 'content' => '11', - ], - ], - ], - ]; - - }//end dataNoBackfill() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillReadonlyTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillReadonlyTest.inc deleted file mode 100644 index eb36e38..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillReadonlyTest.inc +++ /dev/null @@ -1,156 +0,0 @@ -readonly = 'foo'; - - /* testReadonlyPropertyInTernaryOperator */ - $isReadonly = $this->readonly ? true : false; - } -} - -/* testReadonlyUsedAsFunctionName */ -function readonly() {} - -/* testReadonlyUsedAsFunctionNameWithReturnByRef */ -function &readonly() {} - -/* testReadonlyUsedAsNamespaceName */ -namespace Readonly; -/* testReadonlyUsedAsPartOfNamespaceName */ -namespace My\Readonly\Collection; -/* testReadonlyAsFunctionCall */ -$var = readonly($a, $b); -/* testReadonlyAsNamespacedFunctionCall */ -$var = My\NS\readonly($a, $b); -/* testReadonlyAsNamespaceRelativeFunctionCall */ -$var = namespace\ReadOnly($a, $b); -/* testReadonlyAsMethodCall */ -$var = $obj->readonly($a, $b); -/* testReadonlyAsNullsafeMethodCall */ -$var = $obj?->readOnly($a, $b); -/* testReadonlyAsStaticMethodCallWithSpace */ -$var = ClassName::readonly ($a, $b); -/* testClassConstantFetchWithReadonlyAsConstantName */ -echo ClassName::READONLY; - -/* testReadonlyUsedAsFunctionCallWithSpaceBetweenKeywordAndParens */ -$var = readonly /* comment */ (); - -// These test cases are inspired by -// https://github.com/php/php-src/commit/08b75395838b4b42a41e3c70684fa6c6b113eee0 -class ReadonlyWithDisjunctiveNormalForm -{ - /* testReadonlyPropertyDNFTypeUnqualified */ - readonly (B&C)|A $h; - - /* testReadonlyPropertyDNFTypeFullyQualified */ - public readonly (\Fully\Qualified\B&\Full\C)|\Foo\Bar $j; - - /* testReadonlyPropertyDNFTypePartiallyQualified */ - protected readonly (Partially\Qualified&C)|A $l; - - /* testReadonlyPropertyDNFTypeRelativeName */ - private readonly (namespace\Relative&C)|A $n; - - /* testReadonlyPropertyDNFTypeMultipleSets */ - private readonly (A&C)|(B&C)|(C&D) $m; - - /* testReadonlyPropertyDNFTypeWithArray */ - private readonly (B & C)|array $o; - - /* testReadonlyPropertyDNFTypeWithSpacesAndComments */ - private readonly ( B & C /*something*/) | A $q; - - public function __construct( - /* testReadonlyConstructorPropertyPromotionWithDNF */ - private readonly (B&C)|A $b1, - /* testReadonlyConstructorPropertyPromotionWithDNFAndReference */ - readonly (B&C)|A &$b2, - ) {} - - /* testReadonlyUsedAsMethodNameWithDNFParam */ - public function readonly (A&B $param): void {} -} - -/* testReadonlyAnonClassWithParens */ -$anon = new readonly class() {}; - -/* testReadonlyAnonClassWithoutParens */ -$anon = new Readonly class {}; - -/* testReadonlyAnonClassWithCommentsAndWhitespace */ -$anon = new -// comment -READONLY -// phpcs:ignore Stnd.Cat.Sniff -class {}; - -/* testParseErrorLiveCoding */ -// This must be the last test in the file. -readonly diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillReadonlyTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillReadonlyTest.php deleted file mode 100644 index f55191c..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BackfillReadonlyTest.php +++ /dev/null @@ -1,271 +0,0 @@ - - * @copyright 2021 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\PHP; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; - -final class BackfillReadonlyTest extends AbstractTokenizerTestCase -{ - - - /** - * Test that the "readonly" keyword is tokenized as such. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * @param string $testContent Optional. The token content to look for. - * Defaults to lowercase "readonly". - * - * @dataProvider dataReadonly - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testReadonly($testMarker, $testContent='readonly') - { - $tokens = $this->phpcsFile->getTokens(); - $target = $this->getTargetToken($testMarker, [T_READONLY, T_STRING], $testContent); - $tokenArray = $tokens[$target]; - - $this->assertSame(T_READONLY, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_READONLY (code)'); - $this->assertSame('T_READONLY', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_READONLY (type)'); - - }//end testReadonly() - - - /** - * Data provider. - * - * @see testReadonly() - * - * @return array> - */ - public static function dataReadonly() - { - return [ - 'property declaration, no visibility' => [ - 'testMarker' => '/* testReadonlyProperty */', - ], - 'property declaration, var keyword before' => [ - 'testMarker' => '/* testVarReadonlyProperty */', - ], - 'property declaration, var keyword after' => [ - 'testMarker' => '/* testReadonlyVarProperty */', - ], - 'property declaration, static before' => [ - 'testMarker' => '/* testStaticReadonlyProperty */', - ], - 'property declaration, static after' => [ - 'testMarker' => '/* testReadonlyStaticProperty */', - ], - 'constant declaration, with visibility' => [ - 'testMarker' => '/* testConstReadonlyProperty */', - ], - 'property declaration, missing type' => [ - 'testMarker' => '/* testReadonlyPropertyWithoutType */', - ], - 'property declaration, public before' => [ - 'testMarker' => '/* testPublicReadonlyProperty */', - ], - 'property declaration, protected before' => [ - 'testMarker' => '/* testProtectedReadonlyProperty */', - ], - 'property declaration, private before' => [ - 'testMarker' => '/* testPrivateReadonlyProperty */', - ], - 'property declaration, public after' => [ - 'testMarker' => '/* testPublicReadonlyPropertyWithReadonlyFirst */', - ], - 'property declaration, protected after' => [ - 'testMarker' => '/* testProtectedReadonlyPropertyWithReadonlyFirst */', - ], - 'property declaration, private after' => [ - 'testMarker' => '/* testPrivateReadonlyPropertyWithReadonlyFirst */', - ], - 'property declaration, private before, comments in declaration' => [ - 'testMarker' => '/* testReadonlyWithCommentsInDeclaration */', - ], - 'property declaration, private before, nullable type' => [ - 'testMarker' => '/* testReadonlyWithNullableProperty */', - ], - 'property declaration, private before, union type, null first' => [ - 'testMarker' => '/* testReadonlyNullablePropertyWithUnionTypeHintAndNullFirst */', - ], - 'property declaration, private before, union type, null last' => [ - 'testMarker' => '/* testReadonlyNullablePropertyWithUnionTypeHintAndNullLast */', - ], - 'property declaration, private before, array type' => [ - 'testMarker' => '/* testReadonlyPropertyWithArrayTypeHint */', - ], - 'property declaration, private before, self type' => [ - 'testMarker' => '/* testReadonlyPropertyWithSelfTypeHint */', - ], - 'property declaration, private before, parent type' => [ - 'testMarker' => '/* testReadonlyPropertyWithParentTypeHint */', - ], - 'property declaration, private before, FQN type' => [ - 'testMarker' => '/* testReadonlyPropertyWithFullyQualifiedTypeHint */', - ], - 'property declaration, public before, mixed case' => [ - 'testMarker' => '/* testReadonlyIsCaseInsensitive */', - 'testContent' => 'ReAdOnLy', - ], - 'property declaration, constructor property promotion' => [ - 'testMarker' => '/* testReadonlyConstructorPropertyPromotion */', - ], - 'property declaration, constructor property promotion with reference, mixed case' => [ - 'testMarker' => '/* testReadonlyConstructorPropertyPromotionWithReference */', - 'testContent' => 'ReadOnly', - ], - 'property declaration, in anonymous class' => [ - 'testMarker' => '/* testReadonlyPropertyInAnonymousClass */', - ], - 'property declaration, no visibility, DNF type, unqualified' => [ - 'testMarker' => '/* testReadonlyPropertyDNFTypeUnqualified */', - ], - 'property declaration, public before, DNF type, fully qualified' => [ - 'testMarker' => '/* testReadonlyPropertyDNFTypeFullyQualified */', - ], - 'property declaration, protected before, DNF type, partially qualified' => [ - 'testMarker' => '/* testReadonlyPropertyDNFTypePartiallyQualified */', - ], - 'property declaration, private before, DNF type, namespace relative name' => [ - 'testMarker' => '/* testReadonlyPropertyDNFTypeRelativeName */', - ], - 'property declaration, private before, DNF type, multiple sets' => [ - 'testMarker' => '/* testReadonlyPropertyDNFTypeMultipleSets */', - ], - 'property declaration, private before, DNF type, union with array' => [ - 'testMarker' => '/* testReadonlyPropertyDNFTypeWithArray */', - ], - 'property declaration, private before, DNF type, with spaces and comment' => [ - 'testMarker' => '/* testReadonlyPropertyDNFTypeWithSpacesAndComments */', - ], - 'property declaration, constructor property promotion, DNF type' => [ - 'testMarker' => '/* testReadonlyConstructorPropertyPromotionWithDNF */', - ], - 'property declaration, constructor property promotion, DNF type and reference' => [ - 'testMarker' => '/* testReadonlyConstructorPropertyPromotionWithDNFAndReference */', - ], - 'anon class declaration, with parentheses' => [ - 'testMarker' => '/* testReadonlyAnonClassWithParens */', - ], - 'anon class declaration, without parentheses' => [ - 'testMarker' => '/* testReadonlyAnonClassWithoutParens */', - 'testContent' => 'Readonly', - ], - 'anon class declaration, with comments and whitespace' => [ - 'testMarker' => '/* testReadonlyAnonClassWithCommentsAndWhitespace */', - 'testContent' => 'READONLY', - ], - 'live coding / parse error' => [ - 'testMarker' => '/* testParseErrorLiveCoding */', - ], - ]; - - }//end dataReadonly() - - - /** - * Test that "readonly" when not used as the keyword is still tokenized as `T_STRING`. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * @param string $testContent Optional. The token content to look for. - * Defaults to lowercase "readonly". - * - * @dataProvider dataNotReadonly - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testNotReadonly($testMarker, $testContent='readonly') - { - $tokens = $this->phpcsFile->getTokens(); - $target = $this->getTargetToken($testMarker, [T_READONLY, T_STRING], $testContent); - $tokenArray = $tokens[$target]; - - $this->assertSame(T_STRING, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_STRING (code)'); - $this->assertSame('T_STRING', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_STRING (type)'); - - }//end testNotReadonly() - - - /** - * Data provider. - * - * @see testNotReadonly() - * - * @return array> - */ - public static function dataNotReadonly() - { - return [ - 'name of a constant, context: declaration using "const" keyword, uppercase' => [ - 'testMarker' => '/* testReadonlyUsedAsClassConstantName */', - 'testContent' => 'READONLY', - ], - 'name of a method, context: declaration' => [ - 'testMarker' => '/* testReadonlyUsedAsMethodName */', - ], - 'name of a property, context: property access' => [ - 'testMarker' => '/* testReadonlyUsedAsPropertyName */', - ], - 'name of a property, context: property access in ternary' => [ - 'testMarker' => '/* testReadonlyPropertyInTernaryOperator */', - ], - 'name of a function, context: declaration' => [ - 'testMarker' => '/* testReadonlyUsedAsFunctionName */', - ], - 'name of a function, context: declaration with return by ref' => [ - 'testMarker' => '/* testReadonlyUsedAsFunctionNameWithReturnByRef */', - ], - 'name of namespace, context: declaration, mixed case' => [ - 'testMarker' => '/* testReadonlyUsedAsNamespaceName */', - 'testContent' => 'Readonly', - ], - 'partial name of namespace, context: declaration, mixed case' => [ - 'testMarker' => '/* testReadonlyUsedAsPartOfNamespaceName */', - 'testContent' => 'Readonly', - ], - 'name of a function, context: call' => [ - 'testMarker' => '/* testReadonlyAsFunctionCall */', - ], - 'name of a namespaced function, context: partially qualified call' => [ - 'testMarker' => '/* testReadonlyAsNamespacedFunctionCall */', - ], - 'name of a function, context: namespace relative call, mixed case' => [ - 'testMarker' => '/* testReadonlyAsNamespaceRelativeFunctionCall */', - 'testContent' => 'ReadOnly', - ], - 'name of a method, context: method call on object' => [ - 'testMarker' => '/* testReadonlyAsMethodCall */', - ], - 'name of a method, context: nullsafe method call on object' => [ - 'testMarker' => '/* testReadonlyAsNullsafeMethodCall */', - 'testContent' => 'readOnly', - ], - 'name of a method, context: static method call with space after' => [ - 'testMarker' => '/* testReadonlyAsStaticMethodCallWithSpace */', - ], - 'name of a constant, context: constant access - uppercase' => [ - 'testMarker' => '/* testClassConstantFetchWithReadonlyAsConstantName */', - 'testContent' => 'READONLY', - ], - 'name of a function, context: call with space and comment between keyword and parens' => [ - 'testMarker' => '/* testReadonlyUsedAsFunctionCallWithSpaceBetweenKeywordAndParens */', - ], - 'name of a method, context: declaration with DNF parameter' => [ - 'testMarker' => '/* testReadonlyUsedAsMethodNameWithDNFParam */', - ], - ]; - - }//end dataNotReadonly() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BitwiseOrTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BitwiseOrTest.inc deleted file mode 100644 index 6e7d588..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BitwiseOrTest.inc +++ /dev/null @@ -1,213 +0,0 @@ - $param | $int; - -/* testTypeUnionArrowReturnType */ -$arrowWithReturnType = fn ($param) : int|null => $param * 10; - -/* testBitwiseOrInArrayKey */ -$array = array( - A | B => /* testBitwiseOrInArrayValue */ B | C -); - -/* testBitwiseOrInShortArrayKey */ -$array = [ - A | B => /* testBitwiseOrInShortArrayValue */ B | C -]; - -/* testBitwiseOrTryCatch */ -try { -} catch ( ExceptionA | ExceptionB $e ) { -} - -/* testBitwiseOrNonArrowFnFunctionCall */ -$obj->fn($something | $else); - -/* testTypeUnionNonArrowFunctionDeclaration */ -function &fn(int|false $something) {} - -/* testTypeUnionPHP82TrueFirst */ -function trueTypeParam(true|null $param) {} - -/* testTypeUnionPHP82TrueMiddle */ -function trueTypeReturn($param): array|true|null {} - -/* testTypeUnionPHP82TrueLast */ -$closure = function ($param): array|true {} - -/* testLiveCoding */ -// Intentional parse error. This has to be the last test in the file. -return function( type| diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BitwiseOrTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BitwiseOrTest.php deleted file mode 100644 index d6cc454..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/BitwiseOrTest.php +++ /dev/null @@ -1,170 +0,0 @@ - - * @copyright 2020 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\PHP; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; - -final class BitwiseOrTest extends AbstractTokenizerTestCase -{ - - - /** - * Test that non-union type bitwise or tokens are still tokenized as bitwise or. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * - * @dataProvider dataBitwiseOr - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testBitwiseOr($testMarker) - { - $tokens = $this->phpcsFile->getTokens(); - $target = $this->getTargetToken($testMarker, [T_BITWISE_OR, T_TYPE_UNION]); - $tokenArray = $tokens[$target]; - - $this->assertSame(T_BITWISE_OR, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_BITWISE_OR (code)'); - $this->assertSame('T_BITWISE_OR', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_BITWISE_OR (type)'); - - }//end testBitwiseOr() - - - /** - * Data provider. - * - * @see testBitwiseOr() - * - * @return array> - */ - public static function dataBitwiseOr() - { - return [ - 'in simple assignment 1' => ['/* testBitwiseOr1 */'], - 'in simple assignment 2' => ['/* testBitwiseOr2 */'], - 'in OO constant default value' => ['/* testBitwiseOrOOConstDefaultValue */'], - 'in property default value' => ['/* testBitwiseOrPropertyDefaultValue */'], - 'in method parameter default value' => ['/* testBitwiseOrParamDefaultValue */'], - 'in return statement' => ['/* testBitwiseOr3 */'], - 'in closure parameter default value' => ['/* testBitwiseOrClosureParamDefault */'], - 'in OO constant default value DNF-like' => ['/* testBitwiseOrOOConstDefaultValueDNF */'], - 'in property default value DNF-like' => ['/* testBitwiseOrPropertyDefaultValueDNF */'], - 'in method parameter default value DNF-like' => ['/* testBitwiseOrParamDefaultValueDNF */'], - 'in arrow function parameter default value' => ['/* testBitwiseOrArrowParamDefault */'], - 'in arrow function return expression' => ['/* testBitwiseOrArrowExpression */'], - 'in long array key' => ['/* testBitwiseOrInArrayKey */'], - 'in long array value' => ['/* testBitwiseOrInArrayValue */'], - 'in short array key' => ['/* testBitwiseOrInShortArrayKey */'], - 'in short array value' => ['/* testBitwiseOrInShortArrayValue */'], - 'in catch condition' => ['/* testBitwiseOrTryCatch */'], - 'in parameter in function call' => ['/* testBitwiseOrNonArrowFnFunctionCall */'], - 'live coding / undetermined' => ['/* testLiveCoding */'], - ]; - - }//end dataBitwiseOr() - - - /** - * Test that bitwise or tokens when used as part of a union type are tokenized as `T_TYPE_UNION`. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * - * @dataProvider dataTypeUnion - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testTypeUnion($testMarker) - { - $tokens = $this->phpcsFile->getTokens(); - $target = $this->getTargetToken($testMarker, [T_BITWISE_OR, T_TYPE_UNION]); - $tokenArray = $tokens[$target]; - - $this->assertSame(T_TYPE_UNION, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_TYPE_UNION (code)'); - $this->assertSame('T_TYPE_UNION', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_TYPE_UNION (type)'); - - }//end testTypeUnion() - - - /** - * Data provider. - * - * @see testTypeUnion() - * - * @return array> - */ - public static function dataTypeUnion() - { - return [ - 'type for OO constant' => ['/* testTypeUnionOOConstSimple */'], - 'type for OO constant, reversed modifier order' => ['/* testTypeUnionOOConstReverseModifierOrder */'], - 'type for OO constant, first of multi-union' => ['/* testTypeUnionOOConstMulti1 */'], - 'type for OO constant, middle of multi-union + comments' => ['/* testTypeUnionOOConstMulti2 */'], - 'type for OO constant, last of multi-union' => ['/* testTypeUnionOOConstMulti3 */'], - 'type for OO constant, using namespace relative names' => ['/* testTypeUnionOOConstNamespaceRelative */'], - 'type for OO constant, using partially qualified names' => ['/* testTypeUnionOOConstPartiallyQualified */'], - 'type for OO constant, using fully qualified names' => ['/* testTypeUnionOOConstFullyQualified */'], - 'type for static property' => ['/* testTypeUnionPropertySimple */'], - 'type for static property, reversed modifier order' => ['/* testTypeUnionPropertyReverseModifierOrder */'], - 'type for property, first of multi-union' => ['/* testTypeUnionPropertyMulti1 */'], - 'type for property, middle of multi-union, also comments' => ['/* testTypeUnionPropertyMulti2 */'], - 'type for property, last of multi-union' => ['/* testTypeUnionPropertyMulti3 */'], - 'type for property using namespace relative names' => ['/* testTypeUnionPropertyNamespaceRelative */'], - 'type for property using partially qualified names' => ['/* testTypeUnionPropertyPartiallyQualified */'], - 'type for property using fully qualified names' => ['/* testTypeUnionPropertyFullyQualified */'], - 'type for readonly property' => ['/* testTypeUnionPropertyWithReadOnlyKeyword */'], - 'type for static readonly property' => ['/* testTypeUnionPropertyWithStaticAndReadOnlyKeywords */'], - 'type for readonly property using var keyword' => ['/* testTypeUnionPropertyWithVarAndReadOnlyKeywords */'], - 'type for readonly property, reversed modifier order' => ['/* testTypeUnionPropertyWithReadOnlyKeywordFirst */'], - 'type for readonly property, no visibility' => ['/* testTypeUnionPropertyWithOnlyReadOnlyKeyword */'], - 'type for static property, no visibility' => ['/* testTypeUnionPropertyWithOnlyStaticKeyword */'], - 'type for final property, no visibility' => ['/* testTypeUnionWithPHP84FinalKeyword */'], - 'type for final property, reversed modifier order' => ['/* testTypeUnionWithPHP84FinalKeywordFirst */'], - 'type for final property, no visibility, FQN type' => ['/* testTypeUnionWithPHP84FinalKeywordAndFQN */'], - 'type for private(set) property' => ['/* testTypeUnionPropertyPrivateSet */'], - 'type for public private(set) property' => ['/* testTypeUnionPropertyPublicPrivateSet */'], - 'type for protected(set) property' => ['/* testTypeUnionPropertyProtected */'], - 'type for public protected(set) property' => ['/* testTypeUnionPropertyPublicProtected */'], - 'type for abstract property, no visibility' => ['/* testTypeUnionWithPHP84AbstractKeyword */'], - 'type for abstract property, reversed modifier order' => ['/* testTypeUnionWithPHP84AbstractKeywordFirst */'], - 'type for abstract property, no visibility, FQN type' => ['/* testTypeUnionWithPHP84AbstractKeywordAndFQN */'], - 'type for method parameter' => ['/* testTypeUnionParam1 */'], - 'type for method parameter, first in multi-union' => ['/* testTypeUnionParam2 */'], - 'type for method parameter, last in multi-union' => ['/* testTypeUnionParam3 */'], - 'type for method parameter with namespace relative names' => ['/* testTypeUnionParamNamespaceRelative */'], - 'type for method parameter with partially qualified names' => ['/* testTypeUnionParamPartiallyQualified */'], - 'type for method parameter with fully qualified names' => ['/* testTypeUnionParamFullyQualified */'], - 'type for property in constructor property promotion' => ['/* testTypeUnionConstructorPropertyPromotion */'], - 'return type for method' => ['/* testTypeUnionReturnType */'], - 'return type for method, first of multi-union' => ['/* testTypeUnionAbstractMethodReturnType1 */'], - 'return type for method, last of multi-union' => ['/* testTypeUnionAbstractMethodReturnType2 */'], - 'return type for method with namespace relative names' => ['/* testTypeUnionReturnTypeNamespaceRelative */'], - 'return type for method with partially qualified names' => ['/* testTypeUnionReturnPartiallyQualified */'], - 'return type for method with fully qualified names' => ['/* testTypeUnionReturnFullyQualified */'], - 'type for function parameter with reference' => ['/* testTypeUnionWithReference */'], - 'type for function parameter with spread operator' => ['/* testTypeUnionWithSpreadOperator */'], - 'DNF type for OO constant, union before DNF' => ['/* testTypeUnionConstantTypeUnionBeforeDNF */'], - 'DNF type for property, union after DNF' => ['/* testTypeUnionPropertyTypeUnionAfterDNF */'], - 'DNF type for function param, union before and after DNF' => ['/* testTypeUnionParamUnionBeforeAndAfterDNF */'], - 'DNF type for function return, union after DNF with null' => ['/* testTypeUnionReturnTypeUnionAfterDNF */'], - 'type for closure parameter with illegal nullable' => ['/* testTypeUnionClosureParamIllegalNullable */'], - 'return type for closure' => ['/* testTypeUnionClosureReturn */'], - 'type for arrow function parameter' => ['/* testTypeUnionArrowParam */'], - 'return type for arrow function' => ['/* testTypeUnionArrowReturnType */'], - 'type for function parameter, return by ref' => ['/* testTypeUnionNonArrowFunctionDeclaration */'], - 'type for function param with true type first' => ['/* testTypeUnionPHP82TrueFirst */'], - 'return type for function with true type middle' => ['/* testTypeUnionPHP82TrueMiddle */'], - 'return type for closure with true type last' => ['/* testTypeUnionPHP82TrueLast */'], - ]; - - }//end dataTypeUnion() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ContextSensitiveKeywordsTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ContextSensitiveKeywordsTest.inc deleted file mode 100644 index 3a591f5..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ContextSensitiveKeywordsTest.inc +++ /dev/null @@ -1,253 +0,0 @@ - 'a', - 2 => 'b', - /* testMatchDefaultIsKeyword */ default => 'default', -}; - -$closure = /* testFnIsKeyword */ fn () => 'string'; - -function () { - /* testYieldIsKeyword */ yield $f; - /* testYieldFromIsKeyword */ yield from someFunction(); -}; - -/* testDeclareIsKeyword */ declare(ticks=1): -/* testEndDeclareIsKeyword */ enddeclare; - -if (true /* testAndIsKeyword */ and false /* testOrIsKeyword */ or null /* testXorIsKeyword */ xor 0) { - -} - -$anonymousClass = new /* testAnonymousClassIsKeyword */ class {}; -$anonymousClass2 = new class /* testExtendsInAnonymousClassIsKeyword */ extends SomeParent {}; -$anonymousClass3 = new class /* testImplementsInAnonymousClassIsKeyword */ implements SomeInterface {}; - -$instantiated = new /* testClassInstantiationStaticIsKeyword */ static($param); - -class Foo extends /* testNamespaceInNameIsKeyword */ namespace\Exception -{} - -function /* testKeywordAfterFunctionShouldBeString */ eval() {} -function /* testKeywordAfterFunctionByRefShouldBeString */ &switch() {} - -function /* testKeywordStaticAfterFunctionByRefShouldBeString */ &static() {} - -/* testKeywordAsFunctionCallNameShouldBeStringStatic */ static(); -$obj-> /* testKeywordAsMethodCallNameShouldBeStringStatic */ static(); - -$function = /* testStaticIsKeywordBeforeClosure */ static function(/* testStaticIsKeywordWhenParamType */ static $param) {}; -$arrow = /* testStaticIsKeywordBeforeArrow */ static fn(): /* testStaticIsKeywordWhenReturnType */ static => 10; - -/* testKeywordAsFunctionCallNameShouldBeStringStaticDNFLookaLike */ -$obj->static((CONST_A&CONST_B)|CONST_C | $var); - -class DNF { - public /* testStaticIsKeywordPropertyModifierBeforeDNF */ static (DN&F)|null $dnfProp; -} diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ContextSensitiveKeywordsTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ContextSensitiveKeywordsTest.php deleted file mode 100644 index dda5107..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ContextSensitiveKeywordsTest.php +++ /dev/null @@ -1,576 +0,0 @@ - - * @copyright 2020 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\PHP; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; -use PHP_CodeSniffer\Util\Tokens; - -final class ContextSensitiveKeywordsTest extends AbstractTokenizerTestCase -{ - - - /** - * Test that context sensitive keyword is tokenized as string when it should be string. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * - * @dataProvider dataStrings - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testStrings($testMarker) - { - $tokens = $this->phpcsFile->getTokens(); - $target = $this->getTargetToken($testMarker, (Tokens::$contextSensitiveKeywords + [T_STRING])); - $tokenArray = $tokens[$target]; - - $this->assertSame(T_STRING, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_STRING (code)'); - $this->assertSame('T_STRING', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_STRING (type)'); - - }//end testStrings() - - - /** - * Data provider. - * - * @see testStrings() - * - * @return array> - */ - public static function dataStrings() - { - return [ - 'constant declaration: abstract' => ['/* testAbstract */'], - 'constant declaration: array' => ['/* testArray */'], - 'constant declaration: as' => ['/* testAs */'], - 'constant declaration: break' => ['/* testBreak */'], - 'constant declaration: callable' => ['/* testCallable */'], - 'constant declaration: case' => ['/* testCase */'], - 'constant declaration: catch' => ['/* testCatch */'], - 'constant declaration: class' => ['/* testClass */'], - 'constant declaration: clone' => ['/* testClone */'], - 'constant declaration: const' => ['/* testConst */'], - 'constant declaration: continue' => ['/* testContinue */'], - 'constant declaration: declare' => ['/* testDeclare */'], - 'constant declaration: default' => ['/* testDefault */'], - 'constant declaration: do' => ['/* testDo */'], - 'constant declaration: echo' => ['/* testEcho */'], - 'constant declaration: else' => ['/* testElse */'], - 'constant declaration: elseif' => ['/* testElseIf */'], - 'constant declaration: empty' => ['/* testEmpty */'], - 'constant declaration: enddeclare' => ['/* testEndDeclare */'], - 'constant declaration: endfor' => ['/* testEndFor */'], - 'constant declaration: endforeach' => ['/* testEndForeach */'], - 'constant declaration: endif' => ['/* testEndIf */'], - 'constant declaration: endswitch' => ['/* testEndSwitch */'], - 'constant declaration: endwhile' => ['/* testEndWhile */'], - 'constant declaration: enum' => ['/* testEnum */'], - 'constant declaration: eval' => ['/* testEval */'], - 'constant declaration: exit' => ['/* testExit */'], - 'constant declaration: extends' => ['/* testExtends */'], - 'constant declaration: final' => ['/* testFinal */'], - 'constant declaration: finally' => ['/* testFinally */'], - 'constant declaration: fn' => ['/* testFn */'], - 'constant declaration: for' => ['/* testFor */'], - 'constant declaration: foreach' => ['/* testForeach */'], - 'constant declaration: function' => ['/* testFunction */'], - 'constant declaration: global' => ['/* testGlobal */'], - 'constant declaration: goto' => ['/* testGoto */'], - 'constant declaration: if' => ['/* testIf */'], - 'constant declaration: implements' => ['/* testImplements */'], - 'constant declaration: include' => ['/* testInclude */'], - 'constant declaration: include_once' => ['/* testIncludeOnce */'], - 'constant declaration: instanceof' => ['/* testInstanceOf */'], - 'constant declaration: insteadof' => ['/* testInsteadOf */'], - 'constant declaration: interface' => ['/* testInterface */'], - 'constant declaration: isset' => ['/* testIsset */'], - 'constant declaration: list' => ['/* testList */'], - 'constant declaration: match' => ['/* testMatch */'], - 'constant declaration: namespace' => ['/* testNamespace */'], - 'constant declaration: new' => ['/* testNew */'], - 'constant declaration: print' => ['/* testPrint */'], - 'constant declaration: private' => ['/* testPrivate */'], - 'constant declaration: protected' => ['/* testProtected */'], - 'constant declaration: public' => ['/* testPublic */'], - 'constant declaration: readonly' => ['/* testReadonly */'], - 'constant declaration: require' => ['/* testRequire */'], - 'constant declaration: require_once' => ['/* testRequireOnce */'], - 'constant declaration: return' => ['/* testReturn */'], - 'constant declaration: static' => ['/* testStatic */'], - 'constant declaration: switch' => ['/* testSwitch */'], - 'constant declaration: throws' => ['/* testThrows */'], - 'constant declaration: trait' => ['/* testTrait */'], - 'constant declaration: try' => ['/* testTry */'], - 'constant declaration: unset' => ['/* testUnset */'], - 'constant declaration: use' => ['/* testUse */'], - 'constant declaration: var' => ['/* testVar */'], - 'constant declaration: while' => ['/* testWhile */'], - 'constant declaration: yield' => ['/* testYield */'], - 'constant declaration: yield_from' => ['/* testYieldFrom */'], - 'constant declaration: and' => ['/* testAnd */'], - 'constant declaration: or' => ['/* testOr */'], - 'constant declaration: xor' => ['/* testXor */'], - - 'constant declaration: array in type' => ['/* testArrayIsTstringInConstType */'], - 'constant declaration: array, name after type' => ['/* testArrayNameForTypedConstant */'], - 'constant declaration: static, name after type' => ['/* testStaticIsNameForTypedConstant */'], - 'constant declaration: private, name after type' => ['/* testPrivateNameForUnionTypedConstant */'], - 'constant declaration: final, name after type' => ['/* testFinalNameForIntersectionTypedConstant */'], - - 'namespace declaration: class' => ['/* testKeywordAfterNamespaceShouldBeString */'], - 'namespace declaration (partial): my' => ['/* testNamespaceNameIsString1 */'], - 'namespace declaration (partial): class' => ['/* testNamespaceNameIsString2 */'], - 'namespace declaration (partial): foreach' => ['/* testNamespaceNameIsString3 */'], - - 'function declaration: eval' => ['/* testKeywordAfterFunctionShouldBeString */'], - 'function declaration with return by ref: switch' => ['/* testKeywordAfterFunctionByRefShouldBeString */'], - 'function declaration with return by ref: static' => ['/* testKeywordStaticAfterFunctionByRefShouldBeString */'], - - 'function call: static' => ['/* testKeywordAsFunctionCallNameShouldBeStringStatic */'], - 'method call: static' => ['/* testKeywordAsMethodCallNameShouldBeStringStatic */'], - 'method call: static with dnf look a like param' => ['/* testKeywordAsFunctionCallNameShouldBeStringStaticDNFLookaLike */'], - ]; - - }//end dataStrings() - - - /** - * Test that context sensitive keyword is tokenized as keyword when it should be keyword. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * @param string $expectedTokenType The expected token type. - * - * @dataProvider dataKeywords - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testKeywords($testMarker, $expectedTokenType) - { - $tokenTargets = Tokens::$contextSensitiveKeywords; - $tokenTargets[] = T_STRING; - $tokenTargets[] = T_ANON_CLASS; - $tokenTargets[] = T_MATCH_DEFAULT; - $tokenTargets[] = T_PRIVATE_SET; - $tokenTargets[] = T_PROTECTED_SET; - $tokenTargets[] = T_PUBLIC_SET; - - $tokens = $this->phpcsFile->getTokens(); - $target = $this->getTargetToken($testMarker, $tokenTargets); - $tokenArray = $tokens[$target]; - - $this->assertSame( - constant($expectedTokenType), - $tokenArray['code'], - 'Token tokenized as '.$tokenArray['type'].', not '.$expectedTokenType.' (code)' - ); - $this->assertSame( - $expectedTokenType, - $tokenArray['type'], - 'Token tokenized as '.$tokenArray['type'].', not '.$expectedTokenType.' (type)' - ); - - }//end testKeywords() - - - /** - * Data provider. - * - * @see testKeywords() - * - * @return array> - */ - public static function dataKeywords() - { - return [ - 'namespace: declaration' => [ - 'testMarker' => '/* testNamespaceIsKeyword */', - 'expectedTokenType' => 'T_NAMESPACE', - ], - 'array: default value in const decl' => [ - 'testMarker' => '/* testArrayIsKeywordInConstDefault */', - 'expectedTokenType' => 'T_ARRAY', - ], - 'static: type in constant declaration' => [ - 'testMarker' => '/* testStaticIsKeywordAsConstType */', - 'expectedTokenType' => 'T_STATIC', - ], - 'static: value in constant declaration' => [ - 'testMarker' => '/* testStaticIsKeywordAsConstDefault */', - 'expectedTokenType' => 'T_STATIC', - ], - - 'abstract: class declaration' => [ - 'testMarker' => '/* testAbstractIsKeyword */', - 'expectedTokenType' => 'T_ABSTRACT', - ], - 'class: declaration' => [ - 'testMarker' => '/* testClassIsKeyword */', - 'expectedTokenType' => 'T_CLASS', - ], - 'extends: in class declaration' => [ - 'testMarker' => '/* testExtendsIsKeyword */', - 'expectedTokenType' => 'T_EXTENDS', - ], - 'implements: in class declaration' => [ - 'testMarker' => '/* testImplementsIsKeyword */', - 'expectedTokenType' => 'T_IMPLEMENTS', - ], - 'use: in trait import' => [ - 'testMarker' => '/* testUseIsKeyword */', - 'expectedTokenType' => 'T_USE', - ], - 'insteadof: in trait import' => [ - 'testMarker' => '/* testInsteadOfIsKeyword */', - 'expectedTokenType' => 'T_INSTEADOF', - ], - 'as: in trait import' => [ - 'testMarker' => '/* testAsIsKeyword */', - 'expectedTokenType' => 'T_AS', - ], - 'const: declaration' => [ - 'testMarker' => '/* testConstIsKeyword */', - 'expectedTokenType' => 'T_CONST', - ], - 'private: property declaration' => [ - 'testMarker' => '/* testPrivateIsKeyword */', - 'expectedTokenType' => 'T_PRIVATE', - ], - 'protected: property declaration' => [ - 'testMarker' => '/* testProtectedIsKeyword */', - 'expectedTokenType' => 'T_PROTECTED', - ], - 'public: property declaration' => [ - 'testMarker' => '/* testPublicIsKeyword */', - 'expectedTokenType' => 'T_PUBLIC', - ], - 'private(set): property declaration' => [ - 'testMarker' => '/* testPrivateSetIsKeyword */', - 'expectedTokenType' => 'T_PRIVATE_SET', - ], - 'protected(set): property declaration' => [ - 'testMarker' => '/* testProtectedSetIsKeyword */', - 'expectedTokenType' => 'T_PROTECTED_SET', - ], - 'public(set): property declaration' => [ - 'testMarker' => '/* testPublicSetIsKeyword */', - 'expectedTokenType' => 'T_PUBLIC_SET', - ], - 'var: property declaration' => [ - 'testMarker' => '/* testVarIsKeyword */', - 'expectedTokenType' => 'T_VAR', - ], - 'static: property declaration' => [ - 'testMarker' => '/* testStaticIsKeyword */', - 'expectedTokenType' => 'T_STATIC', - ], - 'readonly: property declaration' => [ - 'testMarker' => '/* testReadonlyIsKeywordForProperty */', - 'expectedTokenType' => 'T_READONLY', - ], - 'final: function declaration' => [ - 'testMarker' => '/* testFinalIsKeyword */', - 'expectedTokenType' => 'T_FINAL', - ], - 'function: declaration' => [ - 'testMarker' => '/* testFunctionIsKeyword */', - 'expectedTokenType' => 'T_FUNCTION', - ], - 'callable: param type declaration' => [ - 'testMarker' => '/* testCallableIsKeyword */', - 'expectedTokenType' => 'T_CALLABLE', - ], - 'readonly: anon class declaration' => [ - 'testMarker' => '/* testReadonlyIsKeywordForAnonClass */', - 'expectedTokenType' => 'T_READONLY', - ], - 'return: statement' => [ - 'testMarker' => '/* testReturnIsKeyword */', - 'expectedTokenType' => 'T_RETURN', - ], - - 'interface: declaration' => [ - 'testMarker' => '/* testInterfaceIsKeyword */', - 'expectedTokenType' => 'T_INTERFACE', - ], - 'trait: declaration' => [ - 'testMarker' => '/* testTraitIsKeyword */', - 'expectedTokenType' => 'T_TRAIT', - ], - 'enum: declaration' => [ - 'testMarker' => '/* testEnumIsKeyword */', - 'expectedTokenType' => 'T_ENUM', - ], - - 'new: named instantiation' => [ - 'testMarker' => '/* testNewIsKeyword */', - 'expectedTokenType' => 'T_NEW', - ], - 'instanceof: comparison' => [ - 'testMarker' => '/* testInstanceOfIsKeyword */', - 'expectedTokenType' => 'T_INSTANCEOF', - ], - 'clone' => [ - 'testMarker' => '/* testCloneIsKeyword */', - 'expectedTokenType' => 'T_CLONE', - ], - - 'if' => [ - 'testMarker' => '/* testIfIsKeyword */', - 'expectedTokenType' => 'T_IF', - ], - 'empty' => [ - 'testMarker' => '/* testEmptyIsKeyword */', - 'expectedTokenType' => 'T_EMPTY', - ], - 'elseif' => [ - 'testMarker' => '/* testElseIfIsKeyword */', - 'expectedTokenType' => 'T_ELSEIF', - ], - 'else' => [ - 'testMarker' => '/* testElseIsKeyword */', - 'expectedTokenType' => 'T_ELSE', - ], - 'endif' => [ - 'testMarker' => '/* testEndIfIsKeyword */', - 'expectedTokenType' => 'T_ENDIF', - ], - - 'for' => [ - 'testMarker' => '/* testForIsKeyword */', - 'expectedTokenType' => 'T_FOR', - ], - 'endfor' => [ - 'testMarker' => '/* testEndForIsKeyword */', - 'expectedTokenType' => 'T_ENDFOR', - ], - - 'foreach' => [ - 'testMarker' => '/* testForeachIsKeyword */', - 'expectedTokenType' => 'T_FOREACH', - ], - 'endforeach' => [ - 'testMarker' => '/* testEndForeachIsKeyword */', - 'expectedTokenType' => 'T_ENDFOREACH', - ], - - 'switch' => [ - 'testMarker' => '/* testSwitchIsKeyword */', - 'expectedTokenType' => 'T_SWITCH', - ], - 'case: in switch' => [ - 'testMarker' => '/* testCaseIsKeyword */', - 'expectedTokenType' => 'T_CASE', - ], - 'default: in switch' => [ - 'testMarker' => '/* testDefaultIsKeyword */', - 'expectedTokenType' => 'T_DEFAULT', - ], - 'endswitch' => [ - 'testMarker' => '/* testEndSwitchIsKeyword */', - 'expectedTokenType' => 'T_ENDSWITCH', - ], - 'break: in switch' => [ - 'testMarker' => '/* testBreakIsKeyword */', - 'expectedTokenType' => 'T_BREAK', - ], - 'continue: in switch' => [ - 'testMarker' => '/* testContinueIsKeyword */', - 'expectedTokenType' => 'T_CONTINUE', - ], - - 'do' => [ - 'testMarker' => '/* testDoIsKeyword */', - 'expectedTokenType' => 'T_DO', - ], - 'while' => [ - 'testMarker' => '/* testWhileIsKeyword */', - 'expectedTokenType' => 'T_WHILE', - ], - 'endwhile' => [ - 'testMarker' => '/* testEndWhileIsKeyword */', - 'expectedTokenType' => 'T_ENDWHILE', - ], - - 'try' => [ - 'testMarker' => '/* testTryIsKeyword */', - 'expectedTokenType' => 'T_TRY', - ], - 'throw: statement' => [ - 'testMarker' => '/* testThrowIsKeyword */', - 'expectedTokenType' => 'T_THROW', - ], - 'catch' => [ - 'testMarker' => '/* testCatchIsKeyword */', - 'expectedTokenType' => 'T_CATCH', - ], - 'finally' => [ - 'testMarker' => '/* testFinallyIsKeyword */', - 'expectedTokenType' => 'T_FINALLY', - ], - - 'global' => [ - 'testMarker' => '/* testGlobalIsKeyword */', - 'expectedTokenType' => 'T_GLOBAL', - ], - 'echo' => [ - 'testMarker' => '/* testEchoIsKeyword */', - 'expectedTokenType' => 'T_ECHO', - ], - 'print: statement' => [ - 'testMarker' => '/* testPrintIsKeyword */', - 'expectedTokenType' => 'T_PRINT', - ], - 'die: statement' => [ - 'testMarker' => '/* testDieIsKeyword */', - 'expectedTokenType' => 'T_EXIT', - ], - 'eval' => [ - 'testMarker' => '/* testEvalIsKeyword */', - 'expectedTokenType' => 'T_EVAL', - ], - 'exit: statement' => [ - 'testMarker' => '/* testExitIsKeyword */', - 'expectedTokenType' => 'T_EXIT', - ], - 'isset' => [ - 'testMarker' => '/* testIssetIsKeyword */', - 'expectedTokenType' => 'T_ISSET', - ], - 'unset' => [ - 'testMarker' => '/* testUnsetIsKeyword */', - 'expectedTokenType' => 'T_UNSET', - ], - '\\die: statement (fully qualified)' => [ - 'testMarker' => '/* testFullyQualifiedDieIsKeyword */', - 'expectedTokenType' => 'T_EXIT', - ], - '\\exit: statement (fully qualified)' => [ - 'testMarker' => '/* testFullyQualifiedExitIsKeyword */', - 'expectedTokenType' => 'T_EXIT', - ], - - 'include' => [ - 'testMarker' => '/* testIncludeIsKeyword */', - 'expectedTokenType' => 'T_INCLUDE', - ], - 'include_once' => [ - 'testMarker' => '/* testIncludeOnceIsKeyword */', - 'expectedTokenType' => 'T_INCLUDE_ONCE', - ], - 'require' => [ - 'testMarker' => '/* testRequireIsKeyword */', - 'expectedTokenType' => 'T_REQUIRE', - ], - 'require_once' => [ - 'testMarker' => '/* testRequireOnceIsKeyword */', - 'expectedTokenType' => 'T_REQUIRE_ONCE', - ], - - 'list' => [ - 'testMarker' => '/* testListIsKeyword */', - 'expectedTokenType' => 'T_LIST', - ], - 'goto' => [ - 'testMarker' => '/* testGotoIsKeyword */', - 'expectedTokenType' => 'T_GOTO', - ], - 'match' => [ - 'testMarker' => '/* testMatchIsKeyword */', - 'expectedTokenType' => 'T_MATCH', - ], - 'default: in match expression' => [ - 'testMarker' => '/* testMatchDefaultIsKeyword */', - 'expectedTokenType' => 'T_MATCH_DEFAULT', - ], - 'fn' => [ - 'testMarker' => '/* testFnIsKeyword */', - 'expectedTokenType' => 'T_FN', - ], - - 'yield' => [ - 'testMarker' => '/* testYieldIsKeyword */', - 'expectedTokenType' => 'T_YIELD', - ], - 'yield from' => [ - 'testMarker' => '/* testYieldFromIsKeyword */', - 'expectedTokenType' => 'T_YIELD_FROM', - ], - - 'declare' => [ - 'testMarker' => '/* testDeclareIsKeyword */', - 'expectedTokenType' => 'T_DECLARE', - ], - 'enddeclare' => [ - 'testMarker' => '/* testEndDeclareIsKeyword */', - 'expectedTokenType' => 'T_ENDDECLARE', - ], - - 'and: in if' => [ - 'testMarker' => '/* testAndIsKeyword */', - 'expectedTokenType' => 'T_LOGICAL_AND', - ], - 'or: in if' => [ - 'testMarker' => '/* testOrIsKeyword */', - 'expectedTokenType' => 'T_LOGICAL_OR', - ], - 'xor: in if' => [ - 'testMarker' => '/* testXorIsKeyword */', - 'expectedTokenType' => 'T_LOGICAL_XOR', - ], - - 'class: anon class declaration' => [ - 'testMarker' => '/* testAnonymousClassIsKeyword */', - 'expectedTokenType' => 'T_ANON_CLASS', - ], - 'extends: anon class declaration' => [ - 'testMarker' => '/* testExtendsInAnonymousClassIsKeyword */', - 'expectedTokenType' => 'T_EXTENDS', - ], - 'implements: anon class declaration' => [ - 'testMarker' => '/* testImplementsInAnonymousClassIsKeyword */', - 'expectedTokenType' => 'T_IMPLEMENTS', - ], - 'static: class instantiation' => [ - 'testMarker' => '/* testClassInstantiationStaticIsKeyword */', - 'expectedTokenType' => 'T_STATIC', - ], - 'namespace: operator' => [ - 'testMarker' => '/* testNamespaceInNameIsKeyword */', - 'expectedTokenType' => 'T_NAMESPACE', - ], - - 'static: closure declaration' => [ - 'testMarker' => '/* testStaticIsKeywordBeforeClosure */', - 'expectedTokenType' => 'T_STATIC', - ], - 'static: parameter type (illegal)' => [ - 'testMarker' => '/* testStaticIsKeywordWhenParamType */', - 'expectedTokenType' => 'T_STATIC', - ], - 'static: arrow function declaration' => [ - 'testMarker' => '/* testStaticIsKeywordBeforeArrow */', - 'expectedTokenType' => 'T_STATIC', - ], - 'static: return type for arrow function' => [ - 'testMarker' => '/* testStaticIsKeywordWhenReturnType */', - 'expectedTokenType' => 'T_STATIC', - ], - 'static: property modifier before DNF' => [ - 'testMarker' => '/* testStaticIsKeywordPropertyModifierBeforeDNF */', - 'expectedTokenType' => 'T_STATIC', - ], - ]; - - }//end dataKeywords() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DNFTypesParseError1Test.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DNFTypesParseError1Test.inc deleted file mode 100644 index a6cf511..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DNFTypesParseError1Test.inc +++ /dev/null @@ -1,17 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\PHP; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; - -final class DNFTypesParseError1Test extends AbstractTokenizerTestCase -{ - - - /** - * Document handling for a DNF type / parse error where the last significant type specific token is an open parenthesis. - * - * @param string $testMarker The comment prefacing the target token. - * - * @dataProvider dataBrokenDNFTypeCantEndOnOpenParenthesis - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testBrokenDNFTypeCantEndOnOpenParenthesis($testMarker) - { - $tokens = $this->phpcsFile->getTokens(); - - $openPtr = $this->getTargetToken($testMarker, [T_OPEN_PARENTHESIS, T_TYPE_OPEN_PARENTHESIS], '('); - $token = $tokens[$openPtr]; - - // Verify that the open parenthesis is tokenized as a normal parenthesis. - $this->assertSame(T_OPEN_PARENTHESIS, $token['code'], 'Token tokenized as '.$token['type'].', not T_OPEN_PARENTHESIS (code)'); - $this->assertSame('T_OPEN_PARENTHESIS', $token['type'], 'Token tokenized as '.$token['type'].', not T_OPEN_PARENTHESIS (type)'); - - // Verify that the type union is still tokenized as T_BITWISE_OR as the type declaration - // is not recognized as a valid type declaration. - $unionPtr = $this->getTargetToken($testMarker, [T_BITWISE_OR, T_TYPE_UNION], '|'); - $token = $tokens[$unionPtr]; - - $this->assertSame(T_BITWISE_OR, $token['code'], 'Token tokenized as '.$token['type'].', not T_BITWISE_OR (code)'); - $this->assertSame('T_BITWISE_OR', $token['type'], 'Token tokenized as '.$token['type'].', not T_BITWISE_OR (type)'); - - }//end testBrokenDNFTypeCantEndOnOpenParenthesis() - - - /** - * Data provider. - * - * @see testBrokenDNFTypeCantEndOnOpenParenthesis() - * - * @return array> - */ - public static function dataBrokenDNFTypeCantEndOnOpenParenthesis() - { - return [ - 'OO const type' => ['/* testBrokenConstDNFTypeEndOnOpenParenthesis */'], - 'OO property type' => ['/* testBrokenPropertyDNFTypeEndOnOpenParenthesis */'], - 'Parameter type' => ['/* testBrokenParamDNFTypeEndOnOpenParenthesis */'], - 'Return type' => ['/* testBrokenReturnDNFTypeEndOnOpenParenthesis */'], - ]; - - }//end dataBrokenDNFTypeCantEndOnOpenParenthesis() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DNFTypesParseError2Test.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DNFTypesParseError2Test.inc deleted file mode 100644 index 7929758..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DNFTypesParseError2Test.inc +++ /dev/null @@ -1,48 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\PHP; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; -use PHP_CodeSniffer\Util\Tokens; - -final class DNFTypesParseError2Test extends AbstractTokenizerTestCase -{ - - - /** - * Document handling for a DNF type / parse error where the type declaration contains an unmatched parenthesis. - * - * @param string $testMarker The comment prefacing the target token. - * - * @dataProvider dataBrokenDNFTypeParensShouldAlwaysBeAPairMissingCloseParens - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testBrokenDNFTypeParensShouldAlwaysBeAPairMissingCloseParens($testMarker) - { - $tokens = $this->phpcsFile->getTokens(); - - // Verify that the type union is still tokenized as T_BITWISE_OR as the type declaration - // is not recognized as a valid type declaration. - $unionPtr = $this->getTargetToken($testMarker, [T_BITWISE_OR, T_TYPE_UNION], '|'); - $token = $tokens[$unionPtr]; - - $this->assertSame(T_BITWISE_OR, $token['code'], 'Token tokenized as '.$token['type'].', not T_BITWISE_OR (code)'); - $this->assertSame('T_BITWISE_OR', $token['type'], 'Token tokenized as '.$token['type'].', not T_BITWISE_OR (type)'); - - // Verify that the unmatched open parenthesis is tokenized as a normal parenthesis. - $openPtr = $this->getTargetToken($testMarker, [T_OPEN_PARENTHESIS, T_TYPE_OPEN_PARENTHESIS], '('); - $token = $tokens[$openPtr]; - - $this->assertSame(T_OPEN_PARENTHESIS, $token['code'], 'Token tokenized as '.$token['type'].', not T_OPEN_PARENTHESIS (code)'); - $this->assertSame('T_OPEN_PARENTHESIS', $token['type'], 'Token tokenized as '.$token['type'].', not T_OPEN_PARENTHESIS (type)'); - - // Verify that the type intersection is still tokenized as T_BITWISE_AND as the type declaration - // is not recognized as a valid type declaration. - $intersectPtr = $this->getTargetToken($testMarker, [T_BITWISE_AND, T_TYPE_INTERSECTION], '&'); - $token = $tokens[$intersectPtr]; - - $this->assertSame(T_BITWISE_AND, $token['code'], 'Token tokenized as '.$token['type'].', not T_BITWISE_AND (code)'); - $this->assertSame('T_BITWISE_AND', $token['type'], 'Token tokenized as '.$token['type'].', not T_BITWISE_AND (type)'); - - }//end testBrokenDNFTypeParensShouldAlwaysBeAPairMissingCloseParens() - - - /** - * Data provider. - * - * @see testBrokenDNFTypeParensShouldAlwaysBeAPairMissingCloseParens() - * - * @return array> - */ - public static function dataBrokenDNFTypeParensShouldAlwaysBeAPairMissingCloseParens() - { - return [ - 'OO const type' => ['/* testBrokenConstDNFTypeParensMissingClose */'], - 'OO property type' => ['/* testBrokenPropertyDNFTypeParensMissingClose */'], - 'Parameter type' => ['/* testBrokenParamDNFTypeParensMissingClose */'], - 'Return type' => ['/* testBrokenReturnDNFTypeParensMissingClose */'], - ]; - - }//end dataBrokenDNFTypeParensShouldAlwaysBeAPairMissingCloseParens() - - - /** - * Document handling for a DNF type / parse error where the type declaration contains an unmatched parenthesis. - * - * @param string $testMarker The comment prefacing the target token. - * - * @dataProvider dataBrokenDNFTypeParensShouldAlwaysBeAPairMissingOpenParens - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testBrokenDNFTypeParensShouldAlwaysBeAPairMissingOpenParens($testMarker) - { - $tokens = $this->phpcsFile->getTokens(); - - // Verify that the type union is still tokenized as T_BITWISE_OR as the type declaration - // is not recognized as a valid type declaration. - $unionPtr = $this->getTargetToken($testMarker, [T_BITWISE_OR, T_TYPE_UNION], '|'); - $token = $tokens[$unionPtr]; - - $this->assertSame(T_BITWISE_OR, $token['code'], 'Token tokenized as '.$token['type'].', not T_BITWISE_OR (code)'); - $this->assertSame('T_BITWISE_OR', $token['type'], 'Token tokenized as '.$token['type'].', not T_BITWISE_OR (type)'); - - // Verify that the unmatched open parenthesis is tokenized as a normal parenthesis. - $closePtr = $this->getTargetToken($testMarker, [T_CLOSE_PARENTHESIS, T_TYPE_CLOSE_PARENTHESIS], ')'); - $token = $tokens[$closePtr]; - - $this->assertSame(T_CLOSE_PARENTHESIS, $token['code'], 'Token tokenized as '.$token['type'].', not T_CLOSE_PARENTHESIS (code)'); - $this->assertSame('T_CLOSE_PARENTHESIS', $token['type'], 'Token tokenized as '.$token['type'].', not T_CLOSE_PARENTHESIS (type)'); - - // Verify that the type intersection is still tokenized as T_BITWISE_AND as the type declaration - // is not recognized as a valid type declaration. - $intersectPtr = $this->getTargetToken($testMarker, [T_BITWISE_AND, T_TYPE_INTERSECTION], '&'); - $token = $tokens[$intersectPtr]; - - $this->assertSame(T_BITWISE_AND, $token['code'], 'Token tokenized as '.$token['type'].', not T_BITWISE_AND (code)'); - $this->assertSame('T_BITWISE_AND', $token['type'], 'Token tokenized as '.$token['type'].', not T_BITWISE_AND (type)'); - - }//end testBrokenDNFTypeParensShouldAlwaysBeAPairMissingOpenParens() - - - /** - * Data provider. - * - * @see testBrokenDNFTypeParensShouldAlwaysBeAPairMissingOpenParens() - * - * @return array> - */ - public static function dataBrokenDNFTypeParensShouldAlwaysBeAPairMissingOpenParens() - { - return [ - 'OO const type' => ['/* testBrokenConstDNFTypeParensMissingOpen */'], - 'OO property type' => ['/* testBrokenPropertyDNFTypeParensMissingOpen */'], - 'Parameter type' => ['/* testBrokenParamDNFTypeParensMissingOpen */'], - 'Return type' => ['/* testBrokenReturnDNFTypeParensMissingOpen */'], - ]; - - }//end dataBrokenDNFTypeParensShouldAlwaysBeAPairMissingOpenParens() - - - /** - * Document handling for a DNF type / parse error where the type declaration contains an unmatched parenthesis, - * but also contains a set of matched parentheses. - * - * @param string $testMarker The comment prefacing the target token. - * - * @dataProvider dataBrokenDNFTypeParensShouldAlwaysBeAPairMatchedAndUnmatched - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testBrokenDNFTypeParensShouldAlwaysBeAPairMatchedAndUnmatched($testMarker) - { - $tokens = $this->phpcsFile->getTokens(); - $startPtr = $this->getTargetToken($testMarker, [T_OPEN_PARENTHESIS, T_TYPE_OPEN_PARENTHESIS], '('); - - for ($i = $startPtr; $i < $this->phpcsFile->numTokens; $i++) { - if (isset(Tokens::$emptyTokens[$tokens[$i]['code']]) === true) { - continue; - } - - if ($tokens[$i]['code'] === T_EQUAL - || $tokens[$i]['code'] === T_VARIABLE - || $tokens[$i]['code'] === T_OPEN_CURLY_BRACKET - ) { - // Reached the end of the type. - break; - } - - $errorPrefix = 'Token tokenized as '.$tokens[$i]['type']; - - // Verify that type tokens have not been retokenized to `T_TYPE_*` tokens for broken type declarations. - switch ($tokens[$i]['content']) { - case '|': - $this->assertSame(T_BITWISE_OR, $tokens[$i]['code'], $errorPrefix.', not T_BITWISE_OR (code)'); - $this->assertSame('T_BITWISE_OR', $tokens[$i]['type'], $errorPrefix.', not T_BITWISE_OR (type)'); - break; - - case '&': - $this->assertSame(T_BITWISE_AND, $tokens[$i]['code'], $errorPrefix.', not T_BITWISE_AND (code)'); - $this->assertSame('T_BITWISE_AND', $tokens[$i]['type'], $errorPrefix.', not T_BITWISE_AND (type)'); - break; - - case '(': - // Verify that the open parenthesis is tokenized as a normal parenthesis. - $this->assertSame(T_OPEN_PARENTHESIS, $tokens[$i]['code'], $errorPrefix.', not T_OPEN_PARENTHESIS (code)'); - $this->assertSame('T_OPEN_PARENTHESIS', $tokens[$i]['type'], $errorPrefix.', not T_OPEN_PARENTHESIS (type)'); - break; - - case ')': - $this->assertSame(T_CLOSE_PARENTHESIS, $tokens[$i]['code'], $errorPrefix.', not T_CLOSE_PARENTHESIS (code)'); - $this->assertSame('T_CLOSE_PARENTHESIS', $tokens[$i]['type'], $errorPrefix.', not T_CLOSE_PARENTHESIS (type)'); - break; - - default: - break; - }//end switch - }//end for - - }//end testBrokenDNFTypeParensShouldAlwaysBeAPairMatchedAndUnmatched() - - - /** - * Data provider. - * - * @see testBrokenDNFTypeParensShouldAlwaysBeAPairMatchedAndUnmatched() - * - * @return array> - */ - public static function dataBrokenDNFTypeParensShouldAlwaysBeAPairMatchedAndUnmatched() - { - return [ - 'OO const type - missing one close parenthesis' => ['/* testBrokenConstDNFTypeParensMissingOneClose */'], - 'OO property type - missing one open parenthesis' => ['/* testBrokenPropertyDNFTypeParensMissingOneOpen */'], - 'Parameter type - missing one close parenthesis' => ['/* testBrokenParamDNFTypeParensMissingOneClose */'], - 'Return type - missing one open parenthesis' => ['/* testBrokenReturnDNFTypeParensMissingOneOpen */'], - ]; - - }//end dataBrokenDNFTypeParensShouldAlwaysBeAPairMatchedAndUnmatched() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DNFTypesTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DNFTypesTest.inc deleted file mode 100644 index 877d57e..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DNFTypesTest.inc +++ /dev/null @@ -1,288 +0,0 @@ - 10 ) {} - -/* testParensOwnerFor */ -for ($i =0; $i < /* testParensNoOwnerInForCondition */ ( CONST_A & CONST_B ); $i++ ); - -/* testParensOwnerMatch */ -$match = match(CONST_A & CONST_B) { - default => $a, -}; - -/* testParensOwnerArray */ -$array = array ( - 'text', - \CONST_A & \Fully\Qualified\CONST_B, - /* testParensNoOwnerFunctionCallWithAmpersandInCallable */ - do_something($a, /* testParensOwnerArrowFn */ fn($b) => $a & $b, $c), -); - -/* testParensOwnerListWithRefVars */ -list(&$a, &$b) = $array; - -/* testParensNoOwnerFunctionCallwithDNFLookALikeParam */ -$obj->static((CONST_A&CONST_B)|CONST_C | $var); - -/* testParensNoOwnerFunctionCallWithDNFLookALikeNamedParamPlain */ -callMe(label: false); - -/* testParensNoOwnerFunctionCallWithDNFLookALikeNamedParamUnion */ -callMe(label: CONST_A | CONST_B); - -/* testParensNoOwnerFunctionCallWithDNFLookALikeNamedParamIntersect */ -callMe(label: CONST_A & CONST_B); - -\Z1\call11( - /* testParensNoOwnerFunctionCallInNamedParam */ - param1: \Z2\call12(), - /* testParensOwnerArrowFunctionInNamedParam */ - param2: fn (): /* testDNFTypeArrowFnReturnInNamedParam */ int|(\Countable&\Iterable) - /* testParensNoOwnerFunctionCallInArrowFnReturn */ - => \Z3\call13(), - /* testParensOwnerClosureInNamedParam */ - param3: function (): /* testDNFTypeClosureReturnInNamedParam */ int|(\DateTime&\ArrayObject) { - /* testParensNoOwnerFunctionCallInClosureReturn */ - return \Z4\call14(); - }, -); - -/* testSwitchControlStructureCondition */ -switch (CONST_A | CONST_B) { - /* testFunctionCallInSwitchCaseCondition */ - case get_bool(): - /* testFunctionCallInSwitchCaseBody */ - \Name\functionInSwitch(); - break; - - default: - /* testFunctionCallInSwitchDefaultBody */ - functionInSwitch(); - break; -} - -/* testIfAlternativeSyntaxCondition */ -if (true): - /* testFunctionCallInIfBody */ - \B\call(); -/* testElseIfAlternativeSyntaxCondition */ -elseif (10): - /* testFunctionCallInElseIfBody */ - C\call(); -else: - /* testFunctionCallInElseBody */ - \C\call3(); -endif; - -gotolabel: - /* testFunctionCallInGotoBody */ - \doSomething(); - -/* testWhileAlternativeSyntaxCondition */ -while ($c3): - /* testFunctionCallInWhileBody */ - \D\call4(); -endwhile; - -/* testForAlternativeSyntaxCondition */ -for ($i = 0; $i < 10; $i++): - /* testFunctionCallInForBody */ - \F\call5(); -endfor; - -/* testForEachAlternativeSyntaxCondition */ -foreach ($array as $key => $value): - /* testFunctionCallInForeachBody */ - \G\call6(); -endforeach; - -/* - * DNF parentheses. - */ - -abstract class DNFTypes { - /* testDNFTypeOOConstUnqualifiedClasses */ - public const (A&B)|D UNQUALIFIED = new Foo; - - /* testDNFTypeOOConstReverseModifierOrder */ - protected final const int|(Foo&Bar)|float MODIFIERS_REVERSED /* testParensNoOwnerOOConstDefaultValue */ = (E_WARNING & E_NOTICE) | E_DEPRECATED; - - const - /* testDNFTypeOOConstMulti1 */ - (A&B) | - /* testDNFTypeOOConstMulti2 */ - (C&D) | // phpcs:ignore Stnd.Cat.Sniff - /* testDNFTypeOOConstMulti3 */ - (Y&D) - | null MULTI_DNF = null; - - /* testDNFTypeOOConstNamespaceRelative */ - final protected const (namespace\Sub\NameA&namespace\Sub\NameB)|namespace\Sub\NameC NAMESPACE_RELATIVE = new namespace\Sub\NameB; - - /* testDNFTypeOOConstPartiallyQualified */ - const Partially\Qualified\NameC|(Partially\Qualified\NameA&Partially\Qualified\NameB) PARTIALLY_QUALIFIED = new Partially\Qualified\NameA; - - /* testDNFTypeOOConstFullyQualified */ - const (\Fully\Qualified\NameA&\Fully\Qualified\NameB)|\Fully\Qualified\NameC FULLY_QUALIFIED = new \Fully\Qualified\NameB(); - - /* testDNFTypePropertyUnqualifiedClasses */ - public static (Foo&Bar)|array $obj; - - /* testDNFTypePropertyReverseModifierOrder */ - static protected string|(A&B)|int $dnf /* testParensNoOwnerPropertyDefaultValue1 */ = ( E_WARNING & E_NOTICE ) | /* testParensNoOwnerPropertyDefaultValue2 */ (E_ALL & E_DEPRECATED); - - private - /* testDNFTypePropertyMultiNamespaceRelative */ - (namespace\Sub\NameA&namespace\Sub\NameB) | - /* testDNFTypePropertyMultiPartiallyQualified */ - (Partially\Qualified\NameA&Partially\Qualified\NameB) | // phpcs:ignore Stnd.Cat.Sniff - false - /* testDNFTypePropertyMultiFullyQualified */ - | (\Fully\Qualified\NameA&\Fully\Qualified\NameB) $multiDnf; - - /* testDNFTypePropertyWithReadOnlyKeyword1 */ - protected readonly (A&B) | /* testDNFTypePropertyWithReadOnlyKeyword2 */ (C&D) $readonly; - - /* testDNFTypePropertyWithStaticAndReadOnlyKeywords */ - static readonly (A&B&C)|array $staticReadonly; - - /* testDNFTypePropertyWithOnlyStaticKeyword */ - static (A&B&C)|true $onlyStaticModified; - - /* testDNFTypeWithPHP84FinalKeyword */ - final (className&InterfaceName)|false $finalKeywordA; - - /* testDNFTypeWithPHP84FinalKeywordAndStatic */ - final static (\className&\InterfaceName)|false $finalKeywordB; - - /* testDNFTypePropertyWithPrivateSet */ - private(set) (A&B&C)|true $asym1; - - /* testDNFTypePropertyWithPublicPrivateSet */ - public private(set) (A&B&C)|true $asym2; - - /* testDNFTypePropertyWithProtectedSet */ - protected(set) (A&B&C)|true $asym3; - - /* testDNFTypePropertyWithPublicProtectedSet */ - public protected(set) (A&B&C)|true $asym4; - - /* testDNFTypeWithPHP84AbstractKeyword */ - abstract (className&InterfaceName)|false $abstractKeywordA { set; } - - /* testDNFTypeWithPHP84AbstractKeywordAndPublic */ - abstract public (\className&\InterfaceName)|false $abstractKeywordB { get; } - - public function paramTypes( - /* testDNFTypeParam1WithAttribute */ - #[MyAttribute] - (\Foo&Bar)|int|float $paramA /* testParensNoOwnerParamDefaultValue */ = SOMETHING | (CONSTANT_A & CONSTANT_B), - - /* testDNFTypeParam2 */ - (Foo&\Bar) /* testDNFTypeParam3 */ |(Baz&Fop) &...$paramB, - ) { - /* testParensNoOwnerInReturnValue1 */ - return ( - /* testParensNoOwnerInReturnValue2 */ - ($a1 & $b1) | - /* testParensNoOwnerInReturnValue3 */ - ($a2 & $b2) - ) + $c; - } - - public function identifierNames( - /* testDNFTypeParamNamespaceRelative */ - (namespace\Sub\NameA&namespace\Sub\NameB)|false $paramA, - /* testDNFTypeParamPartiallyQualified */ - Partially\Qualified\NameC|(Partially\Qualified\NameA&Partially\Qualified\NameB) $paramB, - /* testDNFTypeParamFullyQualified */ - name|(\Fully\Qualified\NameA&\Fully\Qualified\NameB) $paramC, - ) {} - - public function __construct( - /* testDNFTypeConstructorPropertyPromotion1 */ - public (A&B)| /* testDNFTypeConstructorPropertyPromotion2 */ (A&D) $property - ) {} - - public function returnType()/* testDNFTypeReturnType1 */ : A|(B&D)|/* testDNFTypeReturnType2 */(B&W)|null {} - - abstract public function abstractMethod(): /* testDNFTypeAbstractMethodReturnType1 */ (X&Y) /* testDNFTypeAbstractMethodReturnType2 */ |(W&Z); - - public function identifierNamesReturnRelative( - ) : /* testDNFTypeReturnTypeNamespaceRelative */ (namespace\Sub\NameA&namespace\Sub\NameB)|namespace\Sub\NameC {} - - public function identifierNamesReturnPQ( - ) : /* testDNFTypeReturnPartiallyQualified */Partially\Qualified\NameA|(Partially\Qualified\NameB&Partially\Qualified\NameC) {} - - // Illegal type: segments which are strict subsets of others are disallowed, but that's not the concern of the tokenizer. - public function identifierNamesReturnFQ( - ) /* testDNFTypeReturnFullyQualified */ : (\Fully\Qualified\NameA&\Fully\Qualified\NameB)|\Fully\Qualified\NameB {} -} - -function globalFunctionWithSpreadAndReference( - /* testDNFTypeWithReference */ - float|(B&A) &$paramA, - /* testDNFTypeWithSpreadOperator */ - string|(B&D) ...$paramB -) {} - - -$closureWithParamType = function ( /* testDNFTypeClosureParamIllegalNullable */ ?(A&B)|bool $string) {}; - -/* testParensOwnerClosureAmpersandInDefaultValue */ -$closureWithReturnType = function ($string = NONSENSE & FAKE) /* testDNFTypeClosureReturn */ : (\Package\MyA&PackageB)|null {}; - -$closureWithUseAndReturnType = function ($foo) use ($a) /* testDNFTypeClosureWithUseReturn */ : null|(Foo&\Bar)|false {}; - -/* testParensOwnerArrowDNFUsedWithin */ -$arrowWithParamType = fn ( - /* testDNFTypeArrowParam */ - int|(A&B&C)|array $param, - /* testParensNoOwnerAmpersandInDefaultValue */ ?int $int = (CONSTA & CONSTB )| CONST_C -) - /* testParensNoOwnerInArrowReturnExpression */ - => ($param & $foo ) | $int; - -$arrowWithReturnType = fn ($param) : /* testDNFTypeArrowReturnType */ int|(A&B) => $param * 10; - -$arrowWithParamReturnByRef = fn &( - /* testDNFTypeArrowParamWithReturnByRef */ - (A&B)|null $param -) => $param * 10; - -function InvalidSyntaxes( - /* testDNFTypeParamIllegalUnnecessaryParens */ - (A&B) $parensNotNeeded, - - /* testDNFTypeParamIllegalIntersectUnionReversed */ - A&(B|D) $onlyIntersectAllowedWithinParensAndUnionOutside, - - /* testDNFTypeParamIllegalNestedParens */ - A|(B&(D|W)|null) $nestedParensNotAllowed, -) {} diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DNFTypesTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DNFTypesTest.php deleted file mode 100644 index 2c56d13..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DNFTypesTest.php +++ /dev/null @@ -1,557 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\PHP; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; -use PHP_CodeSniffer\Util\Tokens; - -final class DNFTypesTest extends AbstractTokenizerTestCase -{ - - - /** - * Test that parentheses when **not** used in a type declaration are correctly tokenized. - * - * @param string $testMarker The comment prefacing the target token. - * @param bool $skipCheckInside Optional. Skip checking correct token type inside the parentheses. - * Use judiciously for combined normal + DNF tests only. - * - * @dataProvider dataNormalParentheses - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testNormalParentheses($testMarker, $skipCheckInside=false) - { - $tokens = $this->phpcsFile->getTokens(); - - $openPtr = $this->getTargetToken($testMarker, [T_OPEN_PARENTHESIS, T_TYPE_OPEN_PARENTHESIS]); - $opener = $tokens[$openPtr]; - - $this->assertSame('(', $opener['content'], 'Content of type open parenthesis is not "("'); - $this->assertSame(T_OPEN_PARENTHESIS, $opener['code'], 'Token tokenized as '.$opener['type'].', not T_OPEN_PARENTHESIS (code)'); - $this->assertSame('T_OPEN_PARENTHESIS', $opener['type'], 'Token tokenized as '.$opener['type'].', not T_OPEN_PARENTHESIS (type)'); - - $closePtr = $opener['parenthesis_closer']; - $closer = $tokens[$closePtr]; - - $this->assertSame(')', $closer['content'], 'Content of type close parenthesis is not ")"'); - $this->assertSame(T_CLOSE_PARENTHESIS, $closer['code'], 'Token tokenized as '.$closer['type'].', not T_CLOSE_PARENTHESIS (code)'); - $this->assertSame('T_CLOSE_PARENTHESIS', $closer['type'], 'Token tokenized as '.$closer['type'].', not T_CLOSE_PARENTHESIS (type)'); - - if ($skipCheckInside === false) { - for ($i = ($openPtr + 1); $i < $closePtr; $i++) { - // If there are ampersands, make sure these are tokenized as bitwise and. - if ($tokens[$i]['content'] === '&') { - $this->assertSame(T_BITWISE_AND, $tokens[$i]['code'], 'Token tokenized as '.$tokens[$i]['type'].', not T_BITWISE_AND (code)'); - $this->assertSame('T_BITWISE_AND', $tokens[$i]['type'], 'Token tokenized as '.$tokens[$i]['type'].', not T_BITWISE_AND (type)'); - } - - // If there are pipes, make sure these are tokenized as bitwise or. - if ($tokens[$i]['content'] === '|') { - $this->assertSame(T_BITWISE_OR, $tokens[$i]['code'], 'Token tokenized as '.$tokens[$i]['type'].', not T_BITWISE_OR (code)'); - $this->assertSame('T_BITWISE_OR', $tokens[$i]['type'], 'Token tokenized as '.$tokens[$i]['type'].', not T_BITWISE_OR (type)'); - } - } - } - - $before = $this->phpcsFile->findPrevious(Tokens::$emptyTokens, ($openPtr - 1), null, true); - if ($before !== false && $tokens[$before]['content'] === '|') { - $this->assertSame( - T_BITWISE_OR, - $tokens[$before]['code'], - 'Token before tokenized as '.$tokens[$before]['type'].', not T_BITWISE_OR (code)' - ); - $this->assertSame( - 'T_BITWISE_OR', - $tokens[$before]['type'], - 'Token before tokenized as '.$tokens[$before]['type'].', not T_BITWISE_OR (type)' - ); - } - - $after = $this->phpcsFile->findNext(Tokens::$emptyTokens, ($closePtr + 1), null, true); - if ($after !== false && $tokens[$after]['content'] === '|') { - $this->assertSame( - T_BITWISE_OR, - $tokens[$after]['code'], - 'Token after tokenized as '.$tokens[$after]['type'].', not T_BITWISE_OR (code)' - ); - $this->assertSame( - 'T_BITWISE_OR', - $tokens[$after]['type'], - 'Token after tokenized as '.$tokens[$after]['type'].', not T_BITWISE_OR (type)' - ); - } - - }//end testNormalParentheses() - - - /** - * Data provider. - * - * @see testNormalParentheses() - * - * @return array> - */ - public static function dataNormalParentheses() - { - // "Owner" offsets are relative to the open parenthesis. - return [ - 'parens without owner' => [ - 'testMarker' => '/* testParensNoOwner */', - ], - 'parens without owner in ternary then' => [ - 'testMarker' => '/* testParensNoOwnerInTernary */', - ], - 'parens without owner in short ternary' => [ - 'testMarker' => '/* testParensNoOwnerInShortTernary */', - ], - 'parens without owner in ternary then (fn call in inline then)' => [ - 'testMarker' => '/* testFnCallParensNoOwnerInTernaryA */', - ], - 'parens without owner in ternary then (fn call in inline else)' => [ - 'testMarker' => '/* testFnCallParensNoOwnerInTernaryB */', - ], - 'parens without owner in short ternary (fn call)' => [ - 'testMarker' => '/* testPFnCallarensNoOwnerInShortTernary */', - ], - 'parens with owner: function; & in default value' => [ - 'testMarker' => '/* testParensOwnerFunctionAmpersandInDefaultValue */', - ], - 'parens with owner: closure; param declared by & ref' => [ - 'testMarker' => '/* testParensOwnerClosureAmpersandParamRef */', - ], - 'parens with owner: if' => [ - 'testMarker' => '/* testParensOwnerIf */', - ], - 'parens without owner in if condition' => [ - 'testMarker' => '/* testParensNoOwnerInIfCondition */', - ], - 'parens with owner: for' => [ - 'testMarker' => '/* testParensOwnerFor */', - ], - 'parens without owner in for condition' => [ - 'testMarker' => '/* testParensNoOwnerInForCondition */', - ], - 'parens with owner: match' => [ - 'testMarker' => '/* testParensOwnerMatch */', - ], - 'parens with owner: array' => [ - 'testMarker' => '/* testParensOwnerArray */', - ], - 'parens without owner in array; function call with & in callable' => [ - 'testMarker' => '/* testParensNoOwnerFunctionCallWithAmpersandInCallable */', - ], - 'parens with owner: fn; & in return value' => [ - 'testMarker' => '/* testParensOwnerArrowFn */', - ], - 'parens with owner: list with reference vars' => [ - 'testMarker' => '/* testParensOwnerListWithRefVars */', - ], - 'parens without owner, function call with DNF look-a-like param' => [ - 'testMarker' => '/* testParensNoOwnerFunctionCallwithDNFLookALikeParam */', - ], - 'parens without owner, function call, named param' => [ - 'testMarker' => '/* testParensNoOwnerFunctionCallWithDNFLookALikeNamedParamPlain */', - ], - 'parens without owner, function call, named param + bitwise or' => [ - 'testMarker' => '/* testParensNoOwnerFunctionCallWithDNFLookALikeNamedParamUnion */', - ], - 'parens without owner, function call, named param + bitwise and' => [ - 'testMarker' => '/* testParensNoOwnerFunctionCallWithDNFLookALikeNamedParamIntersect */', - ], - 'parens without owner, function call in named param' => [ - 'testMarker' => '/* testParensNoOwnerFunctionCallInNamedParam */', - ], - 'parens with owner: fn; in named param' => [ - 'testMarker' => '/* testParensOwnerArrowFunctionInNamedParam */', - ], - 'parens without owner, function call in named param arrow return' => [ - 'testMarker' => '/* testParensNoOwnerFunctionCallInArrowFnReturn */', - ], - 'parens with owner: closure; in named param' => [ - 'testMarker' => '/* testParensOwnerClosureInNamedParam */', - ], - 'parens without owner, function call, named param closure return' => [ - 'testMarker' => '/* testParensNoOwnerFunctionCallInClosureReturn */', - ], - 'parens with owner: switch condition' => [ - 'testMarker' => '/* testSwitchControlStructureCondition */', - ], - 'parens without owner in switch-case condition' => [ - 'testMarker' => '/* testFunctionCallInSwitchCaseCondition */', - ], - 'parens without owner in switch-case body' => [ - 'testMarker' => '/* testFunctionCallInSwitchCaseBody */', - ], - 'parens without owner in switch-default body' => [ - 'testMarker' => '/* testFunctionCallInSwitchDefaultBody */', - ], - 'parens with owner: if condition, alternative syntax' => [ - 'testMarker' => '/* testIfAlternativeSyntaxCondition */', - ], - 'parens without owner in if body, alternative syntax' => [ - 'testMarker' => '/* testFunctionCallInIfBody */', - ], - 'parens with owner: elseif condition, alternative syntax' => [ - 'testMarker' => '/* testElseIfAlternativeSyntaxCondition */', - ], - 'parens without owner in elseif body, alternative syntax' => [ - 'testMarker' => '/* testFunctionCallInElseIfBody */', - ], - 'parens without owner in else body, alternative syntax' => [ - 'testMarker' => '/* testFunctionCallInElseBody */', - ], - 'parens without owner in goto body' => [ - 'testMarker' => '/* testFunctionCallInGotoBody */', - ], - 'parens with owner: while condition, alternative syntax' => [ - 'testMarker' => '/* testWhileAlternativeSyntaxCondition */', - ], - 'parens without owner in while body, alternative syntax' => [ - 'testMarker' => '/* testFunctionCallInWhileBody */', - ], - 'parens with owner: for condition, alternative syntax' => [ - 'testMarker' => '/* testForAlternativeSyntaxCondition */', - ], - 'parens without owner in for body, alternative syntax' => [ - 'testMarker' => '/* testFunctionCallInForBody */', - ], - 'parens with owner: foreach condition, alternative syntax' => [ - 'testMarker' => '/* testForEachAlternativeSyntaxCondition */', - ], - 'parens without owner in foreach body, alternative syntax' => [ - 'testMarker' => '/* testFunctionCallInForeachBody */', - ], - - 'parens without owner in OO const default value' => [ - 'testMarker' => '/* testParensNoOwnerOOConstDefaultValue */', - ], - 'parens without owner in property default 1' => [ - 'testMarker' => '/* testParensNoOwnerPropertyDefaultValue1 */', - ], - 'parens without owner in property default 2' => [ - 'testMarker' => '/* testParensNoOwnerPropertyDefaultValue2 */', - ], - 'parens without owner in param default value' => [ - 'testMarker' => '/* testParensNoOwnerParamDefaultValue */', - ], - 'parens without owner in return statement 1' => [ - 'testMarker' => '/* testParensNoOwnerInReturnValue1 */', - ], - 'parens without owner in return statement 2' => [ - 'testMarker' => '/* testParensNoOwnerInReturnValue2 */', - ], - 'parens without owner in return statement 3' => [ - 'testMarker' => '/* testParensNoOwnerInReturnValue3 */', - ], - 'parens with owner: closure; & in default value' => [ - 'testMarker' => '/* testParensOwnerClosureAmpersandInDefaultValue */', - ], - 'parens with owner: fn; dnf used within' => [ - 'testMarker' => '/* testParensOwnerArrowDNFUsedWithin */', - 'skipCheckInside' => true, - ], - 'parens without owner: default value for param in arrow function' => [ - 'testMarker' => '/* testParensNoOwnerAmpersandInDefaultValue */', - ], - 'parens without owner in arrow function return expression' => [ - 'testMarker' => '/* testParensNoOwnerInArrowReturnExpression */', - ], - ]; - - }//end dataNormalParentheses() - - - /** - * Test that parentheses when used in a DNF type declaration are correctly tokenized. - * - * Includes verifying that: - * - the tokens between the parentheses all have a "nested_parenthesis" key. - * - all ampersands between the parentheses are tokenized as T_TYPE_INTERSECTION. - * - * @param string $testMarker The comment prefacing the target token. - * - * @dataProvider dataDNFTypeParentheses - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testDNFTypeParentheses($testMarker) - { - $tokens = $this->phpcsFile->getTokens(); - - $openPtr = $this->getTargetToken($testMarker, [T_OPEN_PARENTHESIS, T_TYPE_OPEN_PARENTHESIS]); - $opener = $tokens[$openPtr]; - - $this->assertSame('(', $opener['content'], 'Content of type open parenthesis is not "("'); - $this->assertSame(T_TYPE_OPEN_PARENTHESIS, $opener['code'], 'Token tokenized as '.$opener['type'].', not T_TYPE_OPEN_PARENTHESIS (code)'); - $this->assertSame('T_TYPE_OPEN_PARENTHESIS', $opener['type'], 'Token tokenized as '.$opener['type'].', not T_TYPE_OPEN_PARENTHESIS (type)'); - - $closePtr = $opener['parenthesis_closer']; - $closer = $tokens[$closePtr]; - - $this->assertSame(')', $closer['content'], 'Content of type close parenthesis is not ")"'); - $this->assertSame(T_TYPE_CLOSE_PARENTHESIS, $closer['code'], 'Token tokenized as '.$closer['type'].', not T_TYPE_CLOSE_PARENTHESIS (code)'); - $this->assertSame('T_TYPE_CLOSE_PARENTHESIS', $closer['type'], 'Token tokenized as '.$closer['type'].', not T_TYPE_CLOSE_PARENTHESIS (type)'); - - $intersectionCount = 0; - for ($i = ($openPtr + 1); $i < $closePtr; $i++) { - if ($tokens[$i]['content'] === '&') { - $this->assertSame( - T_TYPE_INTERSECTION, - $tokens[$i]['code'], - 'Token tokenized as '.$tokens[$i]['type'].', not T_TYPE_INTERSECTION (code)' - ); - $this->assertSame( - 'T_TYPE_INTERSECTION', - $tokens[$i]['type'], - 'Token tokenized as '.$tokens[$i]['type'].', not T_TYPE_INTERSECTION (type)' - ); - ++$intersectionCount; - } - - // Not valid, but that's irrelevant for the tokenization. - if ($tokens[$i]['content'] === '|') { - $this->assertSame(T_TYPE_UNION, $tokens[$i]['code'], 'Token tokenized as '.$tokens[$i]['type'].', not T_TYPE_UNION (code)'); - $this->assertSame('T_TYPE_UNION', $tokens[$i]['type'], 'Token tokenized as '.$tokens[$i]['type'].', not T_TYPE_UNION (type)'); - - // For the purposes of this test, presume it was intended as an intersection. - ++$intersectionCount; - } - }//end for - - $this->assertGreaterThanOrEqual(1, $intersectionCount, 'Did not find an intersection "&" between the DNF type parentheses'); - - $before = $this->phpcsFile->findPrevious(Tokens::$emptyTokens, ($openPtr - 1), null, true); - if ($before !== false && $tokens[$before]['content'] === '|') { - $this->assertSame( - T_TYPE_UNION, - $tokens[$before]['code'], - 'Token before tokenized as '.$tokens[$before]['type'].', not T_TYPE_UNION (code)' - ); - $this->assertSame( - 'T_TYPE_UNION', - $tokens[$before]['type'], - 'Token before tokenized as '.$tokens[$before]['type'].', not T_TYPE_UNION (type)' - ); - } - - // Invalid, but that's not relevant for the tokenization. - if ($before !== false && $tokens[$before]['content'] === '?') { - $this->assertSame( - T_NULLABLE, - $tokens[$before]['code'], - 'Token before tokenized as '.$tokens[$before]['type'].', not T_NULLABLE (code)' - ); - $this->assertSame( - 'T_NULLABLE', - $tokens[$before]['type'], - 'Token before tokenized as '.$tokens[$before]['type'].', not T_NULLABLE (type)' - ); - } - - $after = $this->phpcsFile->findNext(Tokens::$emptyTokens, ($closePtr + 1), null, true); - if ($after !== false && $tokens[$after]['content'] === '|') { - $this->assertSame( - T_TYPE_UNION, - $tokens[$after]['code'], - 'Token after tokenized as '.$tokens[$after]['type'].', not T_TYPE_UNION (code)' - ); - $this->assertSame( - 'T_TYPE_UNION', - $tokens[$after]['type'], - 'Token after tokenized as '.$tokens[$after]['type'].', not T_TYPE_UNION (type)' - ); - } - - }//end testDNFTypeParentheses() - - - /** - * Data provider. - * - * @see testDNFTypeParentheses() - * - * @return array> - */ - public static function dataDNFTypeParentheses() - { - return [ - 'arrow function return type: in named parameter' => [ - 'testMarker' => '/* testDNFTypeArrowFnReturnInNamedParam */', - ], - 'closure return type: in named parameter' => [ - 'testMarker' => '/* testDNFTypeClosureReturnInNamedParam */', - ], - - 'OO const type: unqualified classes' => [ - 'testMarker' => '/* testDNFTypeOOConstUnqualifiedClasses */', - ], - 'OO const type: modifiers in reverse order' => [ - 'testMarker' => '/* testDNFTypeOOConstReverseModifierOrder */', - ], - 'OO const type: multi-dnf part 1' => [ - 'testMarker' => '/* testDNFTypeOOConstMulti1 */', - ], - 'OO const type: multi-dnf part 2' => [ - 'testMarker' => '/* testDNFTypeOOConstMulti2 */', - ], - 'OO const type: multi-dnf part 3' => [ - 'testMarker' => '/* testDNFTypeOOConstMulti3 */', - ], - 'OO const type: namespace relative classes' => [ - 'testMarker' => '/* testDNFTypeOOConstNamespaceRelative */', - ], - 'OO const type: partially qualified classes' => [ - 'testMarker' => '/* testDNFTypeOOConstPartiallyQualified */', - ], - 'OO const type: fully qualified classes' => [ - 'testMarker' => '/* testDNFTypeOOConstFullyQualified */', - ], - - 'OO property type: unqualified classes' => [ - 'testMarker' => '/* testDNFTypePropertyUnqualifiedClasses */', - ], - 'OO property type: modifiers in reverse order' => [ - 'testMarker' => '/* testDNFTypePropertyReverseModifierOrder */', - ], - 'OO property type: multi-dnf namespace relative classes' => [ - 'testMarker' => '/* testDNFTypePropertyMultiNamespaceRelative */', - ], - 'OO property type: multi-dnf partially qualified classes' => [ - 'testMarker' => '/* testDNFTypePropertyMultiPartiallyQualified */', - ], - 'OO property type: multi-dnf fully qualified classes' => [ - 'testMarker' => '/* testDNFTypePropertyMultiFullyQualified */', - ], - 'OO property type: multi-dnf with readonly keyword 1' => [ - 'testMarker' => '/* testDNFTypePropertyWithReadOnlyKeyword1 */', - ], - 'OO property type: multi-dnf with readonly keyword 2' => [ - 'testMarker' => '/* testDNFTypePropertyWithReadOnlyKeyword2 */', - ], - 'OO property type: with static and readonly keywords' => [ - 'testMarker' => '/* testDNFTypePropertyWithStaticAndReadOnlyKeywords */', - ], - 'OO property type: with only static keyword' => [ - 'testMarker' => '/* testDNFTypePropertyWithOnlyStaticKeyword */', - ], - 'OO property type: with only final keyword' => [ - 'testMarker' => '/* testDNFTypeWithPHP84FinalKeyword */', - ], - 'OO property type: with final and static keyword' => [ - 'testMarker' => '/* testDNFTypeWithPHP84FinalKeywordAndStatic */', - ], - 'OO property type: asymmetric visibility, private(set)' => [ - 'testMarker' => '/* testDNFTypePropertyWithPrivateSet */', - ], - 'OO property type: asymmetric vis, public private(set)' => [ - 'testMarker' => '/* testDNFTypePropertyWithPublicPrivateSet */', - ], - 'OO property type: asymmetric visibility, protected(set)' => [ - 'testMarker' => '/* testDNFTypePropertyWithProtectedSet */', - ], - 'OO property type: asymmetric vis, public protected(set)' => [ - 'testMarker' => '/* testDNFTypePropertyWithPublicProtectedSet */', - ], - 'OO property type: with only abstract keyword' => [ - 'testMarker' => '/* testDNFTypeWithPHP84AbstractKeyword */', - ], - 'OO property type: with abstract and public keyword' => [ - 'testMarker' => '/* testDNFTypeWithPHP84AbstractKeywordAndPublic */', - ], - - 'OO method param type: first param' => [ - 'testMarker' => '/* testDNFTypeParam1WithAttribute */', - ], - 'OO method param type: second param, first DNF' => [ - 'testMarker' => '/* testDNFTypeParam2 */', - ], - 'OO method param type: second param, second DNF' => [ - 'testMarker' => '/* testDNFTypeParam3 */', - ], - 'OO method param type: namespace relative classes' => [ - 'testMarker' => '/* testDNFTypeParamNamespaceRelative */', - ], - 'OO method param type: partially qualified classes' => [ - 'testMarker' => '/* testDNFTypeParamPartiallyQualified */', - ], - 'OO method param type: fully qualified classes' => [ - 'testMarker' => '/* testDNFTypeParamFullyQualified */', - ], - 'Constructor property promotion with multi DNF 1' => [ - 'testMarker' => '/* testDNFTypeConstructorPropertyPromotion1 */', - ], - 'Constructor property promotion with multi DNF 2' => [ - 'testMarker' => '/* testDNFTypeConstructorPropertyPromotion2 */', - ], - 'OO method return type: multi DNF 1' => [ - 'testMarker' => '/* testDNFTypeReturnType1 */', - ], - 'OO method return type: multi DNF 2' => [ - 'testMarker' => '/* testDNFTypeReturnType2 */', - ], - 'OO abstract method return type: multi DNF 1' => [ - 'testMarker' => '/* testDNFTypeAbstractMethodReturnType1 */', - ], - 'OO abstract method return type: multi DNF 2' => [ - 'testMarker' => '/* testDNFTypeAbstractMethodReturnType2 */', - ], - 'OO method return type: namespace relative classes' => [ - 'testMarker' => '/* testDNFTypeReturnTypeNamespaceRelative */', - ], - 'OO method return type: partially qualified classes' => [ - 'testMarker' => '/* testDNFTypeReturnPartiallyQualified */', - ], - 'OO method return type: fully qualified classes' => [ - 'testMarker' => '/* testDNFTypeReturnFullyQualified */', - ], - 'function param type: with reference' => [ - 'testMarker' => '/* testDNFTypeWithReference */', - ], - 'function param type: with spread' => [ - 'testMarker' => '/* testDNFTypeWithSpreadOperator */', - ], - 'closure param type: with illegal nullable' => [ - 'testMarker' => '/* testDNFTypeClosureParamIllegalNullable */', - ], - 'closure return type' => [ - 'testMarker' => '/* testDNFTypeClosureReturn */', - ], - 'closure with use return type' => [ - 'testMarker' => '/* testDNFTypeClosureWithUseReturn */', - ], - - 'arrow function param type' => [ - 'testMarker' => '/* testDNFTypeArrowParam */', - ], - 'arrow function return type' => [ - 'testMarker' => '/* testDNFTypeArrowReturnType */', - ], - 'arrow function param type with return by ref' => [ - 'testMarker' => '/* testDNFTypeArrowParamWithReturnByRef */', - ], - - 'illegal syntax: unnecessary parentheses (no union)' => [ - 'testMarker' => '/* testDNFTypeParamIllegalUnnecessaryParens */', - ], - 'illegal syntax: union within parentheses, intersect outside' => [ - 'testMarker' => '/* testDNFTypeParamIllegalIntersectUnionReversed */', - ], - 'illegal syntax: nested parentheses' => [ - 'testMarker' => '/* testDNFTypeParamIllegalNestedParens */', - ], - ]; - - }//end dataDNFTypeParentheses() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DefaultKeywordTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DefaultKeywordTest.inc deleted file mode 100644 index 648149d..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DefaultKeywordTest.inc +++ /dev/null @@ -1,203 +0,0 @@ - 1, - 2 => 2, - /* testSimpleMatchDefault */ - default => 'default', - }; -} - -function switchWithDefault($i) { - switch ($i) { - case 1: - return 1; - case 2: - return 2; - /* testSimpleSwitchDefault */ - default: - return 'default'; - } -} - -function switchWithDefaultAndCurlies($i) { - switch ($i) { - case 1: - return 1; - case 2: - return 2; - /* testSimpleSwitchDefaultWithCurlies */ - default: { - return 'default'; - } - } -} - -function matchWithDefaultInSwitch() { - switch ($something) { - case 'foo': - $var = [1, 2, 3]; - $var = match ($i) { - 1 => 1, - /* testMatchDefaultNestedInSwitchCase1 */ - default => 'default', - }; - continue; - - case 'bar' : - $i = callMe($a, $b); - return match ($i) { - 1 => 1, - /* testMatchDefaultNestedInSwitchCase2 */ - default => 'default', - }; - - /* testSwitchDefault */ - default; - echo 'something', match ($i) { - 1, => 1, - /* testMatchDefaultNestedInSwitchDefault */ - default, => 'default', - }; - break; - } -} - -function switchWithDefaultInMatch() { - $x = match ($y) { - 5, 8 => function($z) { - switch($z) { - case 'a'; - $var = [1, 2, 3]; - return 'a'; - /* testSwitchDefaultNestedInMatchCase */ - default: - $var = [1, 2, 3]; - return 'default1'; - } - }, - /* testMatchDefault */ - default => function($z) { - switch($z) { - case 'a': - $i = callMe($a, $b); - return 'b'; - /* testSwitchDefaultNestedInMatchDefault */ - default: - $i = callMe($a, $b); - return 'default2'; - } - } - }; -} - -function shortArrayWithConstantKey() { - $arr = [ - /* testClassConstantAsShortArrayKey */ - SomeClass::DEFAULT => 1, - /* testClassPropertyAsShortArrayKey */ - SomeClass->DEFAULT => 1, - /* testNamespacedConstantAsShortArrayKey */ - // Intentional parse error PHP < 8.0. Reserved keyword used as namespaced constant. - SomeNamespace\DEFAULT => 1, - /* testFQNGlobalConstantAsShortArrayKey */ - // Intentional parse error in PHP < 8.0. Reserved keyword used as global constant. - \DEFAULT => 1, - ]; -} - -function longArrayWithConstantKey() { - $arr = array( - /* testClassConstantAsLongArrayKey */ - SomeClass::DEFAULT => 1, - ); -} - -function yieldWithConstantKey() { - /* testClassConstantAsYieldKey */ - yield SomeClass::DEFAULT => 1; -} - -function longArrayWithConstantKeyNestedInMatch() { - return match($x) { - /* testMatchDefaultWithNestedLongArrayWithClassConstantKey */ - DEFAULT => array( - /* testClassConstantAsLongArrayKeyNestedInMatch */ - SomeClass::DEFAULT => match($x) { - /* testMatchDefaultWithNestedLongArrayWithClassConstantKeyLevelDown */ - DEFAULT => array( - /* testClassConstantAsLongArrayKeyNestedInMatchLevelDown */ - SomeClass::DEFAULT => 1, - ), - }, - ), - }; -} - -function shortArrayWithConstantKeyNestedInMatch() { - return match($x) { - /* testMatchDefaultWithNestedShortArrayWithClassConstantKey */ - DEFAULT => [ - /* testClassConstantAsShortArrayKeyNestedInMatch */ - SomeClass::DEFAULT => match($x) { - /* testMatchDefaultWithNestedShortArrayWithClassConstantKeyLevelDown */ - DEFAULT => [ - /* testClassConstantAsShortArrayKeyNestedInMatchLevelDown */ - SomeClass::DEFAULT => 1, - ], - }, - ], - }; -} - - -function longArrayWithConstantKeyWithNestedMatch() { - return array( - /* testClassConstantAsLongArrayKeyWithNestedMatch */ - SomeClass::DEFAULT => match($x) { - /* testMatchDefaultNestedInLongArray */ - DEFAULT => 'foo' - }, - ); -} - -function shortArrayWithConstantKeyWithNestedMatch() { - return [ - /* testClassConstantAsShortArrayKeyWithNestedMatch */ - SomeClass::DEFAULT => match($x) { - /* testMatchDefaultNestedInShortArray */ - DEFAULT => 'foo' - }, - ]; -} - -function switchWithConstantNonDefault($i) { - switch ($i) { - /* testClassConstantInSwitchCase */ - case SomeClass::DEFAULT: - return 1; - - /* testClassPropertyInSwitchCase */ - case SomeClass->DEFAULT: - return 2; - - /* testNamespacedConstantInSwitchCase */ - // Intentional parse error PHP < 8.0. Reserved keyword used as constant. - case SomeNamespace\DEFAULT: - return 2; - - /* testNamespaceRelativeConstantInSwitchCase */ - // Intentional parse error PHP < 8.0. Reserved keyword used as global constant. - case namespace\DEFAULT: - return 2; - } -} - -class Foo { - /* testClassConstant */ - const DEFAULT = 'foo'; - - /* testMethodDeclaration */ - public function default() {} -} diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DefaultKeywordTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DefaultKeywordTest.php deleted file mode 100644 index cf1505a..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DefaultKeywordTest.php +++ /dev/null @@ -1,255 +0,0 @@ - - * @copyright 2020-2021 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\PHP; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; - -final class DefaultKeywordTest extends AbstractTokenizerTestCase -{ - - - /** - * Test the retokenization of the `default` keyword for match structure to `T_MATCH_DEFAULT`. - * - * Note: Cases and default structures within a match structure do *NOT* get case/default scope - * conditions, in contrast to case and default structures in switch control structures. - * - * @param string $testMarker The comment prefacing the target token. - * @param string $testContent The token content to look for. - * - * @dataProvider dataMatchDefault - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testMatchDefault($testMarker, $testContent='default') - { - $tokens = $this->phpcsFile->getTokens(); - - $token = $this->getTargetToken($testMarker, [T_MATCH_DEFAULT, T_DEFAULT, T_STRING], $testContent); - $tokenArray = $tokens[$token]; - - $this->assertSame(T_MATCH_DEFAULT, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_MATCH_DEFAULT (code)'); - $this->assertSame('T_MATCH_DEFAULT', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_MATCH_DEFAULT (type)'); - - }//end testMatchDefault() - - - /** - * Data provider. - * - * @see testMatchDefault() - * - * @return array> - */ - public static function dataMatchDefault() - { - return [ - 'simple_match_default' => [ - 'testMarker' => '/* testSimpleMatchDefault */', - ], - 'match_default_in_switch_case_1' => [ - 'testMarker' => '/* testMatchDefaultNestedInSwitchCase1 */', - ], - 'match_default_in_switch_case_2' => [ - 'testMarker' => '/* testMatchDefaultNestedInSwitchCase2 */', - ], - 'match_default_in_switch_default' => [ - 'testMarker' => '/* testMatchDefaultNestedInSwitchDefault */', - ], - 'match_default_containing_switch' => [ - 'testMarker' => '/* testMatchDefault */', - ], - - 'match_default_with_nested_long_array_and_default_key' => [ - 'testMarker' => '/* testMatchDefaultWithNestedLongArrayWithClassConstantKey */', - 'testContent' => 'DEFAULT', - ], - 'match_default_with_nested_long_array_and_default_key_2' => [ - 'testMarker' => '/* testMatchDefaultWithNestedLongArrayWithClassConstantKeyLevelDown */', - 'testContent' => 'DEFAULT', - ], - 'match_default_with_nested_short_array_and_default_key' => [ - 'testMarker' => '/* testMatchDefaultWithNestedShortArrayWithClassConstantKey */', - 'testContent' => 'DEFAULT', - ], - 'match_default_with_nested_short_array_and_default_key_2' => [ - 'testMarker' => '/* testMatchDefaultWithNestedShortArrayWithClassConstantKeyLevelDown */', - 'testContent' => 'DEFAULT', - ], - 'match_default_in_long_array' => [ - 'testMarker' => '/* testMatchDefaultNestedInLongArray */', - 'testContent' => 'DEFAULT', - ], - 'match_default_in_short_array' => [ - 'testMarker' => '/* testMatchDefaultNestedInShortArray */', - 'testContent' => 'DEFAULT', - ], - ]; - - }//end dataMatchDefault() - - - /** - * Verify that the retokenization of `T_DEFAULT` tokens in match constructs, doesn't negatively - * impact the tokenization of `T_DEFAULT` tokens in switch control structures. - * - * @param string $testMarker The comment prefacing the target token. - * @param string $testContent The token content to look for. - * - * @dataProvider dataSwitchDefault - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testSwitchDefault($testMarker, $testContent='default') - { - $tokens = $this->phpcsFile->getTokens(); - - $token = $this->getTargetToken($testMarker, [T_MATCH_DEFAULT, T_DEFAULT, T_STRING], $testContent); - $tokenArray = $tokens[$token]; - - $this->assertSame(T_DEFAULT, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_DEFAULT (code)'); - $this->assertSame('T_DEFAULT', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_DEFAULT (type)'); - - }//end testSwitchDefault() - - - /** - * Data provider. - * - * @see testSwitchDefault() - * - * @return array> - */ - public static function dataSwitchDefault() - { - return [ - 'simple_switch_default' => [ - 'testMarker' => '/* testSimpleSwitchDefault */', - ], - 'simple_switch_default_with_curlies' => [ - 'testMarker' => '/* testSimpleSwitchDefaultWithCurlies */', - ], - 'switch_default_toplevel' => [ - 'testMarker' => '/* testSwitchDefault */', - ], - 'switch_default_nested_in_match_case' => [ - 'testMarker' => '/* testSwitchDefaultNestedInMatchCase */', - ], - 'switch_default_nested_in_match_default' => [ - 'testMarker' => '/* testSwitchDefaultNestedInMatchDefault */', - ], - ]; - - }//end dataSwitchDefault() - - - /** - * Verify that the retokenization of `T_DEFAULT` tokens in match constructs, doesn't negatively - * impact the tokenization of `T_STRING` tokens with the contents 'default' which aren't in - * actual fact the default keyword. - * - * @param string $testMarker The comment prefacing the target token. - * @param string $testContent The token content to look for. - * - * @dataProvider dataNotDefaultKeyword - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testNotDefaultKeyword($testMarker, $testContent='DEFAULT') - { - $tokens = $this->phpcsFile->getTokens(); - - $token = $this->getTargetToken($testMarker, [T_MATCH_DEFAULT, T_DEFAULT, T_STRING], $testContent); - $tokenArray = $tokens[$token]; - - $this->assertSame(T_STRING, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_STRING (code)'); - $this->assertSame('T_STRING', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_STRING (type)'); - - }//end testNotDefaultKeyword() - - - /** - * Data provider. - * - * @see testNotDefaultKeyword() - * - * @return array> - */ - public static function dataNotDefaultKeyword() - { - return [ - 'class-constant-as-short-array-key' => [ - 'testMarker' => '/* testClassConstantAsShortArrayKey */', - ], - 'class-property-as-short-array-key' => [ - 'testMarker' => '/* testClassPropertyAsShortArrayKey */', - ], - 'namespaced-constant-as-short-array-key' => [ - 'testMarker' => '/* testNamespacedConstantAsShortArrayKey */', - ], - 'fqn-global-constant-as-short-array-key' => [ - 'testMarker' => '/* testFQNGlobalConstantAsShortArrayKey */', - ], - 'class-constant-as-long-array-key' => [ - 'testMarker' => '/* testClassConstantAsLongArrayKey */', - ], - 'class-constant-as-yield-key' => [ - 'testMarker' => '/* testClassConstantAsYieldKey */', - ], - - 'class-constant-as-long-array-key-nested-in-match' => [ - 'testMarker' => '/* testClassConstantAsLongArrayKeyNestedInMatch */', - ], - 'class-constant-as-long-array-key-nested-in-match-2' => [ - 'testMarker' => '/* testClassConstantAsLongArrayKeyNestedInMatchLevelDown */', - ], - 'class-constant-as-short-array-key-nested-in-match' => [ - 'testMarker' => '/* testClassConstantAsShortArrayKeyNestedInMatch */', - ], - 'class-constant-as-short-array-key-nested-in-match-2' => [ - 'testMarker' => '/* testClassConstantAsShortArrayKeyNestedInMatchLevelDown */', - ], - 'class-constant-as-long-array-key-with-nested-match' => [ - 'testMarker' => '/* testClassConstantAsLongArrayKeyWithNestedMatch */', - ], - 'class-constant-as-short-array-key-with-nested-match' => [ - 'testMarker' => '/* testClassConstantAsShortArrayKeyWithNestedMatch */', - ], - - 'class-constant-in-switch-case' => [ - 'testMarker' => '/* testClassConstantInSwitchCase */', - ], - 'class-property-in-switch-case' => [ - 'testMarker' => '/* testClassPropertyInSwitchCase */', - ], - 'namespaced-constant-in-switch-case' => [ - 'testMarker' => '/* testNamespacedConstantInSwitchCase */', - ], - 'namespace-relative-constant-in-switch-case' => [ - 'testMarker' => '/* testNamespaceRelativeConstantInSwitchCase */', - ], - - 'class-constant-declaration' => [ - 'testMarker' => '/* testClassConstant */', - ], - 'class-method-declaration' => [ - 'testMarker' => '/* testMethodDeclaration */', - 'testContent' => 'default', - ], - ]; - - }//end dataNotDefaultKeyword() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DoubleArrowTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DoubleArrowTest.inc deleted file mode 100644 index b67b066..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DoubleArrowTest.inc +++ /dev/null @@ -1,281 +0,0 @@ - 'Zero', - ); -} - -function simpleShortArray($x) { - return [ - /* testShortArrayArrowSimple */ - 0 => 'Zero', - ]; -} - -function simpleLongList($x) { - list( - /* testLongListArrowSimple */ - 0 => $a, - ) = $x; -} - -function simpleShortList($x) { - [ - /* testShortListArrowSimple */ - 0 => $a, - ] = $x; -} - -function simpleYield($x) { - $i = 0; - foreach (explode("\n", $x) as $line) { - /* testYieldArrowSimple */ - yield ++$i => $line; - } -} - -function simpleForeach($x) { - /* testForeachArrowSimple */ - foreach ($x as $k => $value) {} -} - -function simpleMatch($x) { - return match ($x) { - /* testMatchArrowSimpleSingleCase */ - 0 => 'Zero', - /* testMatchArrowSimpleMultiCase */ - 2, 4, 6 => 'Zero', - /* testMatchArrowSimpleSingleCaseWithTrailingComma */ - 1, => 'Zero', - /* testMatchArrowSimpleMultiCaseWithTrailingComma */ - 3, 5, => 'Zero', - }; -} - -function simpleArrowFunction($y) { - /* testFnArrowSimple */ - return fn ($y) => callMe($y); -} - -function matchNestedInMatch() { - $x = match ($y) { - /* testMatchArrowNestedMatchOuter */ - default, => match ($z) { - /* testMatchArrowNestedMatchInner */ - 1 => 1 - }, - }; -} - -function matchNestedInLongArrayValue() { - $array = array( - /* testLongArrayArrowWithNestedMatchValue1 */ - 'a' => match ($test) { - /* testMatchArrowInLongArrayValue1 */ - 1 => 'a', - /* testMatchArrowInLongArrayValue2 */ - 2 => 'b' - }, - /* testLongArrayArrowWithNestedMatchValue2 */ - $i => match ($test) { - /* testMatchArrowInLongArrayValue3 */ - 1 => 'a', - }, - ); -} - -function matchNestedInShortArrayValue() { - $array = [ - /* testShortArrayArrowWithNestedMatchValue1 */ - 'a' => match ($test) { - /* testMatchArrowInShortArrayValue1 */ - 1 => 'a', - /* testMatchArrowInShortArrayValue2 */ - 2 => 'b' - }, - /* testShortArrayArrowWithNestedMatchValue2 */ - $i => match ($test) { - /* testMatchArrowInShortArrayValue3 */ - 1 => 'a', - }, - ]; -} - -function matchNestedInLongArrayKey() { - $array = array( - match ($test) { /* testMatchArrowInLongArrayKey1 */ 1 => 'a', /* testMatchArrowInLongArrayKey2 */ 2 => 'b' } - /* testLongArrayArrowWithMatchKey */ - => 'dynamic keys, woho!', - ); -} - -function matchNestedInShortArrayKey() { - $array = [ - match ($test) { /* testMatchArrowInShortArrayKey1 */ 1 => 'a', /* testMatchArrowInShortArrayKey2 */ 2 => 'b' } - /* testShortArrayArrowWithMatchKey */ - => 'dynamic keys, woho!', - ]; -} - -function arraysNestedInMatch() { - $matcher = match ($x) { - /* testMatchArrowWithLongArrayBodyWithKeys */ - 0 => array( - /* testLongArrayArrowInMatchBody1 */ - 0 => 1, - /* testLongArrayArrowInMatchBody2 */ - 'a' => 2, - /* testLongArrayArrowInMatchBody3 */ - 'b' => 3 - ), - /* testMatchArrowWithShortArrayBodyWithoutKeys */ - 1 => [1, 2, 3], - /* testMatchArrowWithLongArrayBodyWithoutKeys */ - 2 => array( 1, [1, 2, 3], 2, 3), - /* testMatchArrowWithShortArrayBodyWithKeys */ - 3 => [ - /* testShortArrayArrowInMatchBody1 */ - 0 => 1, - /* testShortArrayArrowInMatchBody2 */ - 'a' => array(1, 2, 3), - /* testShortArrayArrowInMatchBody3 */ - 'b' => 2, - 3 - ], - /* testShortArrayArrowinMatchCase1 */ - [4 => 'a', /* testShortArrayArrowinMatchCase2 */ 5 => 6] - /* testMatchArrowWithShortArrayWithKeysAsCase */ - => 'match with array as case value', - /* testShortArrayArrowinMatchCase3 */ - [4 => 'a'], /* testLongArrayArrowinMatchCase4 */ array(5 => 6), - /* testMatchArrowWithMultipleArraysWithKeysAsCase */ - => 'match with multiple arrays as case value', - }; -} - -function matchNestedInArrowFunction($x) { - /* testFnArrowWithMatchInValue */ - $fn = fn($x) => match(true) { - /* testMatchArrowInFnBody1 */ - 1, 2, 3, 4, 5 => 'foo', - /* testMatchArrowInFnBody2 */ - default => 'bar', - }; -} - -function arrowFunctionsNestedInMatch($x) { - return match ($x) { - /* testMatchArrowWithFnBody1 */ - 1 => /* testFnArrowInMatchBody1 */ fn($y) => callMe($y), - /* testMatchArrowWithFnBody2 */ - default => /* testFnArrowInMatchBody2 */ fn($y) => callThem($y) - }; -} - -function matchShortArrayMismash() { - $array = [ - match ($test) { - /* testMatchArrowInComplexShortArrayKey1 */ - 1 => [ /* testShortArrayArrowInComplexMatchValueinShortArrayKey */ 1 => 'a'], - /* testMatchArrowInComplexShortArrayKey2 */ - 2 => 'b' - /* testShortArrayArrowInComplexMatchArrayMismash */ - } => match ($test) { - /* testMatchArrowInComplexShortArrayValue1 */ - 1 => [ /* testShortArrayArrowInComplexMatchValueinShortArrayValue */ 1 => 'a'], - /* testMatchArrowInComplexShortArrayValue2 */ - 2 => /* testFnArrowInComplexMatchValueInShortArrayValue */ fn($y) => callMe($y) - }, - ]; -} - - -function longListInMatch($x, $y) { - return match($x) { - /* testMatchArrowWithLongListBody */ - 1 => list('a' => $a, /* testLongListArrowInMatchBody */ 'b' => $b, 'c' => list('d' => $c)) = $y, - /* testLongListArrowInMatchCase */ - list('a' => $a, 'b' => $b) = $y /* testMatchArrowWithLongListInCase */ => 'something' - }; -} - -function shortListInMatch($x, $y) { - return match($x) { - /* testMatchArrowWithShortListBody */ - 1 => ['a' => $a, 'b' => $b, 'c' => /* testShortListArrowInMatchBody */ ['d' => $c]] = $y, - /* testShortListArrowInMatchCase */ - ['a' => $a, 'b' => $b] = $y /* testMatchArrowWithShortListInCase */ => 'something' - }; -} - -function matchInLongList() { - /* testMatchArrowInLongListKey */ - list(match($x) {1 => 1, 2 => 2} /* testLongListArrowWithMatchInKey */ => $a) = $array; -} - -function matchInShortList() { - /* testMatchArrowInShortListKey */ - [match($x) {1 => 1, 2 => 2} /* testShortListArrowWithMatchInKey */ => $a] = $array; -} - -function longArrayWithConstantKey() { - $arr = array( - /* testLongArrayArrowWithClassConstantKey */ - SomeClass::DEFAULT => 1, - ); -} - -function shortArrayWithConstantKey() { - $arr = [ - /* testShortArrayArrowWithClassConstantKey */ - SomeClass::DEFAULT => 1, - ]; -} - -function yieldWithConstantKey() { - /* testYieldArrowWithClassConstantKey */ - yield SomeClass::DEFAULT => 1; -} - -function longArrayWithConstantKeyNestedInMatch() { - return match($x) { - /* testMatchArrowWithNestedLongArrayWithClassConstantKey */ - default => array( - /* testLongArrayArrowWithClassConstantKeyNestedInMatch */ - SomeClass::DEFAULT => 1, - ), - }; -} - -function shortArrayWithConstantKeyNestedInMatch() { - return match($x) { - /* testMatchArrowWithNestedShortArrayWithClassConstantKey */ - default => [ - /* testShortArrayArrowWithClassConstantKeyNestedInMatch */ - SomeClass::DEFAULT => 1, - ], - }; -} - - -function longArrayWithConstantKeyWithNestedMatch() { - return array( - /* testLongArrayArrowWithClassConstantKeyWithNestedMatch */ - SomeClass::DEFAULT => match($x) { - /* testMatchArrowNestedInLongArrayWithClassConstantKey */ - default => 'foo' - }, - ); -} - -function shortArrayWithConstantKeyWithNestedMatch() { - return [ - /* testShortArrayArrowWithClassConstantKeyWithNestedMatch */ - SomeClass::DEFAULT => match($x) { - /* testMatchArrowNestedInShortArrayWithClassConstantKey */ - default => 'foo' - }, - ]; -} diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DoubleArrowTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DoubleArrowTest.php deleted file mode 100644 index 1e4d2ce..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DoubleArrowTest.php +++ /dev/null @@ -1,237 +0,0 @@ - - * @copyright 2020-2021 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\PHP; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; - -final class DoubleArrowTest extends AbstractTokenizerTestCase -{ - - - /** - * Test that "normal" double arrows are correctly tokenized as `T_DOUBLE_ARROW`. - * - * @param string $testMarker The comment prefacing the target token. - * - * @dataProvider dataDoubleArrow - * @coversNothing - * - * @return void - */ - public function testDoubleArrow($testMarker) - { - $tokens = $this->phpcsFile->getTokens(); - - $token = $this->getTargetToken($testMarker, [T_DOUBLE_ARROW, T_MATCH_ARROW, T_FN_ARROW]); - $tokenArray = $tokens[$token]; - - $this->assertSame(T_DOUBLE_ARROW, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_DOUBLE_ARROW (code)'); - $this->assertSame('T_DOUBLE_ARROW', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_DOUBLE_ARROW (type)'); - - }//end testDoubleArrow() - - - /** - * Data provider. - * - * @see testDoubleArrow() - * - * @return array> - */ - public static function dataDoubleArrow() - { - return [ - 'simple_long_array' => ['/* testLongArrayArrowSimple */'], - 'simple_short_array' => ['/* testShortArrayArrowSimple */'], - 'simple_long_list' => ['/* testLongListArrowSimple */'], - 'simple_short_list' => ['/* testShortListArrowSimple */'], - 'simple_yield' => ['/* testYieldArrowSimple */'], - 'simple_foreach' => ['/* testForeachArrowSimple */'], - - 'long_array_with_match_value_1' => ['/* testLongArrayArrowWithNestedMatchValue1 */'], - 'long_array_with_match_value_2' => ['/* testLongArrayArrowWithNestedMatchValue2 */'], - 'short_array_with_match_value_1' => ['/* testShortArrayArrowWithNestedMatchValue1 */'], - 'short_array_with_match_value_2' => ['/* testShortArrayArrowWithNestedMatchValue2 */'], - - 'long_array_with_match_key' => ['/* testLongArrayArrowWithMatchKey */'], - 'short_array_with_match_key' => ['/* testShortArrayArrowWithMatchKey */'], - - 'long_array_in_match_body_1' => ['/* testLongArrayArrowInMatchBody1 */'], - 'long_array_in_match_body_2' => ['/* testLongArrayArrowInMatchBody2 */'], - 'long_array_in_match_body_3' => ['/* testLongArrayArrowInMatchBody3 */'], - 'short_array_in_match_body_1' => ['/* testShortArrayArrowInMatchBody1 */'], - 'short_array_in_match_body_2' => ['/* testShortArrayArrowInMatchBody2 */'], - 'short_array_in_match_body_3' => ['/* testShortArrayArrowInMatchBody3 */'], - - 'short_array_in_match_case_1' => ['/* testShortArrayArrowinMatchCase1 */'], - 'short_array_in_match_case_2' => ['/* testShortArrayArrowinMatchCase2 */'], - 'short_array_in_match_case_3' => ['/* testShortArrayArrowinMatchCase3 */'], - 'long_array_in_match_case_4' => ['/* testLongArrayArrowinMatchCase4 */'], - - 'in_complex_short_array_key_match_value' => ['/* testShortArrayArrowInComplexMatchValueinShortArrayKey */'], - 'in_complex_short_array_toplevel' => ['/* testShortArrayArrowInComplexMatchArrayMismash */'], - 'in_complex_short_array_value_match_value' => ['/* testShortArrayArrowInComplexMatchValueinShortArrayValue */'], - - 'long_list_in_match_body' => ['/* testLongListArrowInMatchBody */'], - 'long_list_in_match_case' => ['/* testLongListArrowInMatchCase */'], - 'short_list_in_match_body' => ['/* testShortListArrowInMatchBody */'], - 'short_list_in_match_case' => ['/* testShortListArrowInMatchCase */'], - 'long_list_with_match_in_key' => ['/* testLongListArrowWithMatchInKey */'], - 'short_list_with_match_in_key' => ['/* testShortListArrowWithMatchInKey */'], - - 'long_array_with_constant_default_in_key' => ['/* testLongArrayArrowWithClassConstantKey */'], - 'short_array_with_constant_default_in_key' => ['/* testShortArrayArrowWithClassConstantKey */'], - 'yield_with_constant_default_in_key' => ['/* testYieldArrowWithClassConstantKey */'], - - 'long_array_with_default_in_key_in_match' => ['/* testLongArrayArrowWithClassConstantKeyNestedInMatch */'], - 'short_array_with_default_in_key_in_match' => ['/* testShortArrayArrowWithClassConstantKeyNestedInMatch */'], - 'long_array_with_default_in_key_with_match' => ['/* testLongArrayArrowWithClassConstantKeyWithNestedMatch */'], - 'short_array_with_default_in_key_with_match' => ['/* testShortArrayArrowWithClassConstantKeyWithNestedMatch */'], - ]; - - }//end dataDoubleArrow() - - - /** - * Test that double arrows in match expressions which are the demarkation between a case and the return value - * are correctly tokenized as `T_MATCH_ARROW`. - * - * @param string $testMarker The comment prefacing the target token. - * - * @dataProvider dataMatchArrow - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testMatchArrow($testMarker) - { - $tokens = $this->phpcsFile->getTokens(); - - $token = $this->getTargetToken($testMarker, [T_DOUBLE_ARROW, T_MATCH_ARROW, T_FN_ARROW]); - $tokenArray = $tokens[$token]; - - $this->assertSame(T_MATCH_ARROW, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_MATCH_ARROW (code)'); - $this->assertSame('T_MATCH_ARROW', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_MATCH_ARROW (type)'); - - }//end testMatchArrow() - - - /** - * Data provider. - * - * @see testMatchArrow() - * - * @return array> - */ - public static function dataMatchArrow() - { - return [ - 'single_case' => ['/* testMatchArrowSimpleSingleCase */'], - 'multi_case' => ['/* testMatchArrowSimpleMultiCase */'], - 'single_case_with_trailing_comma' => ['/* testMatchArrowSimpleSingleCaseWithTrailingComma */'], - 'multi_case_with_trailing_comma' => ['/* testMatchArrowSimpleMultiCaseWithTrailingComma */'], - 'match_nested_outer' => ['/* testMatchArrowNestedMatchOuter */'], - 'match_nested_inner' => ['/* testMatchArrowNestedMatchInner */'], - - 'in_long_array_value_1' => ['/* testMatchArrowInLongArrayValue1 */'], - 'in_long_array_value_2' => ['/* testMatchArrowInLongArrayValue2 */'], - 'in_long_array_value_3' => ['/* testMatchArrowInLongArrayValue3 */'], - 'in_short_array_value_1' => ['/* testMatchArrowInShortArrayValue1 */'], - 'in_short_array_value_2' => ['/* testMatchArrowInShortArrayValue2 */'], - 'in_short_array_value_3' => ['/* testMatchArrowInShortArrayValue3 */'], - - 'in_long_array_key_1' => ['/* testMatchArrowInLongArrayKey1 */'], - 'in_long_array_key_2' => ['/* testMatchArrowInLongArrayKey2 */'], - 'in_short_array_key_1' => ['/* testMatchArrowInShortArrayKey1 */'], - 'in_short_array_key_2' => ['/* testMatchArrowInShortArrayKey2 */'], - - 'with_long_array_value_with_keys' => ['/* testMatchArrowWithLongArrayBodyWithKeys */'], - 'with_short_array_value_without_keys' => ['/* testMatchArrowWithShortArrayBodyWithoutKeys */'], - 'with_long_array_value_without_keys' => ['/* testMatchArrowWithLongArrayBodyWithoutKeys */'], - 'with_short_array_value_with_keys' => ['/* testMatchArrowWithShortArrayBodyWithKeys */'], - - 'with_short_array_with_keys_as_case' => ['/* testMatchArrowWithShortArrayWithKeysAsCase */'], - 'with_multiple_arrays_with_keys_as_case' => ['/* testMatchArrowWithMultipleArraysWithKeysAsCase */'], - - 'in_fn_body_case' => ['/* testMatchArrowInFnBody1 */'], - 'in_fn_body_default' => ['/* testMatchArrowInFnBody2 */'], - 'with_fn_body_case' => ['/* testMatchArrowWithFnBody1 */'], - 'with_fn_body_default' => ['/* testMatchArrowWithFnBody2 */'], - - 'in_complex_short_array_key_1' => ['/* testMatchArrowInComplexShortArrayKey1 */'], - 'in_complex_short_array_key_2' => ['/* testMatchArrowInComplexShortArrayKey2 */'], - 'in_complex_short_array_value_1' => ['/* testMatchArrowInComplexShortArrayValue1 */'], - 'in_complex_short_array_value_2' => ['/* testMatchArrowInComplexShortArrayValue2 */'], - - 'with_long_list_in_body' => ['/* testMatchArrowWithLongListBody */'], - 'with_long_list_in_case' => ['/* testMatchArrowWithLongListInCase */'], - 'with_short_list_in_body' => ['/* testMatchArrowWithShortListBody */'], - 'with_short_list_in_case' => ['/* testMatchArrowWithShortListInCase */'], - 'in_long_list_key' => ['/* testMatchArrowInLongListKey */'], - 'in_short_list_key' => ['/* testMatchArrowInShortListKey */'], - - 'with_long_array_value_with_default_key' => ['/* testMatchArrowWithNestedLongArrayWithClassConstantKey */'], - 'with_short_array_value_with_default_key' => ['/* testMatchArrowWithNestedShortArrayWithClassConstantKey */'], - 'in_long_array_value_with_default_key' => ['/* testMatchArrowNestedInLongArrayWithClassConstantKey */'], - 'in_short_array_value_with_default_key' => ['/* testMatchArrowNestedInShortArrayWithClassConstantKey */'], - ]; - - }//end dataMatchArrow() - - - /** - * Test that double arrows used as the scope opener for an arrow function - * are correctly tokenized as `T_FN_ARROW`. - * - * @param string $testMarker The comment prefacing the target token. - * - * @dataProvider dataFnArrow - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testFnArrow($testMarker) - { - $tokens = $this->phpcsFile->getTokens(); - - $token = $this->getTargetToken($testMarker, [T_DOUBLE_ARROW, T_MATCH_ARROW, T_FN_ARROW]); - $tokenArray = $tokens[$token]; - - $this->assertSame(T_FN_ARROW, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_FN_ARROW (code)'); - $this->assertSame('T_FN_ARROW', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_FN_ARROW (type)'); - - }//end testFnArrow() - - - /** - * Data provider. - * - * @see testFnArrow() - * - * @return array> - */ - public static function dataFnArrow() - { - return [ - 'simple_fn' => ['/* testFnArrowSimple */'], - - 'with_match_as_value' => ['/* testFnArrowWithMatchInValue */'], - 'in_match_value_case' => ['/* testFnArrowInMatchBody1 */'], - 'in_match_value_default' => ['/* testFnArrowInMatchBody2 */'], - - 'in_complex_match_value_in_short_array' => ['/* testFnArrowInComplexMatchValueInShortArrayValue */'], - ]; - - }//end dataFnArrow() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DoubleQuotedStringTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DoubleQuotedStringTest.inc deleted file mode 100644 index 62535b1..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DoubleQuotedStringTest.inc +++ /dev/null @@ -1,52 +0,0 @@ -bar"; -/* testProperty2 */ -"{$foo->bar}"; - -/* testMethod1 */ -"{$foo->bar()}"; - -/* testClosure1 */ -"{$foo()}"; - -/* testChain1 */ -"{$foo['bar']->baz()()}"; - -/* testVariableVar1 */ -"${$bar}"; -/* testVariableVar2 */ -"${(foo)}"; -/* testVariableVar3 */ -"${foo->bar}"; - -/* testNested1 */ -"${foo["${bar}"]}"; -/* testNested2 */ -"${foo["${bar['baz']}"]}"; -/* testNested3 */ -"${foo->{$baz}}"; -/* testNested4 */ -"${foo->{${'a'}}}"; -/* testNested5 */ -"${foo->{"${'a'}"}}"; - -/* testParseError */ -"${foo["${bar diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DoubleQuotedStringTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DoubleQuotedStringTest.php deleted file mode 100644 index 2feebc0..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/DoubleQuotedStringTest.php +++ /dev/null @@ -1,144 +0,0 @@ - - * @copyright 2022 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\PHP; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; - -final class DoubleQuotedStringTest extends AbstractTokenizerTestCase -{ - - - /** - * Test that double quoted strings contain the complete string. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * @param string $expectedContent The expected content of the double quoted string. - * - * @dataProvider dataDoubleQuotedString - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testDoubleQuotedString($testMarker, $expectedContent) - { - $tokens = $this->phpcsFile->getTokens(); - - $target = $this->getTargetToken($testMarker, T_DOUBLE_QUOTED_STRING); - $this->assertSame($expectedContent, $tokens[$target]['content']); - - }//end testDoubleQuotedString() - - - /** - * Data provider. - * - * Type reference: - * 1. Directly embedded variables. - * 2. Braces outside the variable. - * 3. Braces after the dollar sign. - * 4. Variable variables and expressions. - * - * @link https://wiki.php.net/rfc/deprecate_dollar_brace_string_interpolation - * - * @see testDoubleQuotedString() - * - * @return array> - */ - public static function dataDoubleQuotedString() - { - return [ - 'Type 1: simple variable' => [ - 'testMarker' => '/* testSimple1 */', - 'expectedContent' => '"$foo"', - ], - 'Type 2: simple variable' => [ - 'testMarker' => '/* testSimple2 */', - 'expectedContent' => '"{$foo}"', - ], - 'Type 3: simple variable' => [ - 'testMarker' => '/* testSimple3 */', - 'expectedContent' => '"${foo}"', - ], - 'Type 1: array offset' => [ - 'testMarker' => '/* testDIM1 */', - 'expectedContent' => '"$foo[bar]"', - ], - 'Type 2: array offset' => [ - 'testMarker' => '/* testDIM2 */', - 'expectedContent' => '"{$foo[\'bar\']}"', - ], - 'Type 3: array offset' => [ - 'testMarker' => '/* testDIM3 */', - 'expectedContent' => '"${foo[\'bar\']}"', - ], - 'Type 1: object property' => [ - 'testMarker' => '/* testProperty1 */', - 'expectedContent' => '"$foo->bar"', - ], - 'Type 2: object property' => [ - 'testMarker' => '/* testProperty2 */', - 'expectedContent' => '"{$foo->bar}"', - ], - 'Type 2: object method call' => [ - 'testMarker' => '/* testMethod1 */', - 'expectedContent' => '"{$foo->bar()}"', - ], - 'Type 2: closure function call' => [ - 'testMarker' => '/* testClosure1 */', - 'expectedContent' => '"{$foo()}"', - ], - 'Type 2: chaining various syntaxes' => [ - 'testMarker' => '/* testChain1 */', - 'expectedContent' => '"{$foo[\'bar\']->baz()()}"', - ], - 'Type 4: variable variables' => [ - 'testMarker' => '/* testVariableVar1 */', - 'expectedContent' => '"${$bar}"', - ], - 'Type 4: variable constants' => [ - 'testMarker' => '/* testVariableVar2 */', - 'expectedContent' => '"${(foo)}"', - ], - 'Type 4: object property' => [ - 'testMarker' => '/* testVariableVar3 */', - 'expectedContent' => '"${foo->bar}"', - ], - 'Type 4: variable variable nested in array offset' => [ - 'testMarker' => '/* testNested1 */', - 'expectedContent' => '"${foo["${bar}"]}"', - ], - 'Type 4: variable array offset nested in array offset' => [ - 'testMarker' => '/* testNested2 */', - 'expectedContent' => '"${foo["${bar[\'baz\']}"]}"', - ], - 'Type 4: variable object property' => [ - 'testMarker' => '/* testNested3 */', - 'expectedContent' => '"${foo->{$baz}}"', - ], - 'Type 4: variable object property - complex with single quotes' => [ - 'testMarker' => '/* testNested4 */', - 'expectedContent' => '"${foo->{${\'a\'}}}"', - ], - 'Type 4: variable object property - complex with single and double quotes' => [ - 'testMarker' => '/* testNested5 */', - 'expectedContent' => '"${foo->{"${\'a\'}"}}"', - ], - 'Type 4: live coding/parse error' => [ - 'testMarker' => '/* testParseError */', - 'expectedContent' => '"${foo["${bar -', - ], - ]; - - }//end dataDoubleQuotedString() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/EnumCaseTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/EnumCaseTest.inc deleted file mode 100644 index adcce68..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/EnumCaseTest.inc +++ /dev/null @@ -1,97 +0,0 @@ - - * @copyright 2021 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\PHP; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; - -final class EnumCaseTest extends AbstractTokenizerTestCase -{ - - - /** - * Test that the enum "case" is converted to T_ENUM_CASE. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * - * @dataProvider dataEnumCases - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testEnumCases($testMarker) - { - $tokens = $this->phpcsFile->getTokens(); - $enumCase = $this->getTargetToken($testMarker, [T_ENUM_CASE, T_CASE]); - $tokenArray = $tokens[$enumCase]; - - $this->assertSame(T_ENUM_CASE, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_ENUM_CASE (code)'); - $this->assertSame('T_ENUM_CASE', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_ENUM_CASE (type)'); - - }//end testEnumCases() - - - /** - * Data provider. - * - * @see testEnumCases() - * - * @return array> - */ - public static function dataEnumCases() - { - return [ - 'enum case, no value' => ['/* testPureEnumCase */'], - 'enum case, integer value' => ['/* testBackingIntegerEnumCase */'], - 'enum case, string value' => ['/* testBackingStringEnumCase */'], - 'enum case, integer value in more complex enum' => ['/* testEnumCaseInComplexEnum */'], - 'enum case, keyword in mixed case' => ['/* testEnumCaseIsCaseInsensitive */'], - 'enum case, after switch statement' => ['/* testEnumCaseAfterSwitch */'], - 'enum case, after switch statement using alternative syntax' => ['/* testEnumCaseAfterSwitchWithEndSwitch */'], - ]; - - }//end dataEnumCases() - - - /** - * Test that "case" that is not enum case is still tokenized as `T_CASE`. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * - * @dataProvider dataNotEnumCases - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testNotEnumCases($testMarker) - { - $tokens = $this->phpcsFile->getTokens(); - $case = $this->getTargetToken($testMarker, [T_ENUM_CASE, T_CASE]); - $tokenArray = $tokens[$case]; - - $this->assertSame(T_CASE, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_CASE (code)'); - $this->assertSame('T_CASE', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_CASE (type)'); - - }//end testNotEnumCases() - - - /** - * Data provider. - * - * @see testNotEnumCases() - * - * @return array> - */ - public static function dataNotEnumCases() - { - return [ - 'switch case with constant, semicolon condition end' => ['/* testCaseWithSemicolonIsNotEnumCase */'], - 'switch case with constant, colon condition end' => ['/* testCaseWithConstantIsNotEnumCase */'], - 'switch case with constant, comparison' => ['/* testCaseWithConstantAndIdenticalIsNotEnumCase */'], - 'switch case with constant, assignment' => ['/* testCaseWithAssigmentToConstantIsNotEnumCase */'], - 'switch case with constant, keyword in mixed case' => ['/* testIsNotEnumCaseIsCaseInsensitive */'], - 'switch case, body in curlies declares enum' => ['/* testCaseInSwitchWhenCreatingEnumInSwitch1 */'], - 'switch case, body after semicolon declares enum' => ['/* testCaseInSwitchWhenCreatingEnumInSwitch2 */'], - ]; - - }//end dataNotEnumCases() - - - /** - * Test that "case" that is not enum case is still tokenized as `T_CASE`. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * - * @dataProvider dataKeywordAsEnumCaseNameShouldBeString - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testKeywordAsEnumCaseNameShouldBeString($testMarker) - { - $tokens = $this->phpcsFile->getTokens(); - $enumCaseName = $this->getTargetToken($testMarker, [T_STRING, T_INTERFACE, T_TRAIT, T_ENUM, T_FUNCTION, T_FALSE, T_DEFAULT, T_ARRAY]); - $tokenArray = $tokens[$enumCaseName]; - - $this->assertSame(T_STRING, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_STRING (code)'); - $this->assertSame('T_STRING', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_STRING (type)'); - - }//end testKeywordAsEnumCaseNameShouldBeString() - - - /** - * Data provider. - * - * @see testKeywordAsEnumCaseNameShouldBeString() - * - * @return array> - */ - public static function dataKeywordAsEnumCaseNameShouldBeString() - { - return [ - '"interface" as case name' => ['/* testKeywordAsEnumCaseNameShouldBeString1 */'], - '"trait" as case name' => ['/* testKeywordAsEnumCaseNameShouldBeString2 */'], - '"enum" as case name' => ['/* testKeywordAsEnumCaseNameShouldBeString3 */'], - '"function" as case name' => ['/* testKeywordAsEnumCaseNameShouldBeString4 */'], - '"false" as case name' => ['/* testKeywordAsEnumCaseNameShouldBeString5 */'], - '"default" as case name' => ['/* testKeywordAsEnumCaseNameShouldBeString6 */'], - '"array" as case name' => ['/* testKeywordAsEnumCaseNameShouldBeString7 */'], - '"exit" as case name' => ['/* testKeywordAsEnumCaseNameShouldBeString8 */'], - ]; - - }//end dataKeywordAsEnumCaseNameShouldBeString() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ExitKeywordTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ExitKeywordTest.inc deleted file mode 100644 index d3c1518..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ExitKeywordTest.inc +++ /dev/null @@ -1,106 +0,0 @@ -exit; - -/* testNotDieOOPropertyAccess */ -$obj->DIE; - -/* testNotExitOOMethodCall */ -$obj->exit(); - -/* testNotDieOOMethodCall */ -$obj->die(); - -class NotReserved { - /* testNotExitOOConstDeclaration */ - const exit = 10; - - /* testNotDieOOConstDeclaration */ - const die = 'status'; - - /* testNotExitOOMethodDeclaration */ - function Exit() {} - - /* testNotDieOOMethodDeclaration */ - function die() {} -} - -/* testNotExitParamName */ -callMe(exit: 10); - -/* testNotDieParamName */ -callMe(die: 'status'); - -/* testNotExitNamespacedName */ -use My\exit\NameA; - -/* testNotDieNamespacedName */ -use My\die\NameB; - -/* testExitAsFQConstant */ -// Intentional parse error. This is not allowed in PHP, but that's not the concern of the tokenizer. Should still be handled correctly. -\exit; - -/* testDieAsFQConstant */ -// Intentional parse error. This is not allowed in PHP, but that's not the concern of the tokenizer. Should still be handled correctly. -\die; - -/* testNotExitConstantDeclaration */ -// Intentional parse error. This is not allowed in PHP, but that's not the concern of the tokenizer. Should still be handled correctly. -const exit = 10; - -/* testNotDieConstantDeclaration */ -// Intentional parse error. This is not allowed in PHP, but that's not the concern of the tokenizer. Should still be handled correctly. -const die = 'status'; - -/* testNotExitFunctionDeclaration */ -// Intentional parse error. This is not allowed in PHP, but that's not the concern of the tokenizer. Should still be handled correctly. -function exit() {} - -/* testNotDieFunctionDeclaration */ -// Intentional parse error. This is not allowed in PHP, but that's not the concern of the tokenizer. Should still be handled correctly. -function die() {} diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ExitKeywordTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ExitKeywordTest.php deleted file mode 100644 index eaaa470..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ExitKeywordTest.php +++ /dev/null @@ -1,228 +0,0 @@ -phpcsFile->getTokens(); - - $token = $this->getTargetToken($testMarker, [T_EXIT, T_STRING], $testContent); - $tokenArray = $tokens[$token]; - - $this->assertSame(T_EXIT, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_EXIT (code)'); - $this->assertSame('T_EXIT', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_EXIT (type)'); - - }//end testExitIsKeyword() - - - /** - * Data provider. - * - * @see testExitIsKeyword() - * - * @return array> - */ - public static function dataExitIsKeyword() - { - return [ - 'exit as constant' => [ - 'testMarker' => '/* testExitAsConstant */', - 'testContent' => 'exit', - ], - 'die as constant' => [ - 'testMarker' => '/* testDieAsConstant */', - 'testContent' => 'die', - ], - 'exit as constant; mixed case' => [ - 'testMarker' => '/* testExitAsConstantMixedCase */', - 'testContent' => 'Exit', - ], - 'die as constant; uppercase' => [ - 'testMarker' => '/* testDieAsConstantUppercase */', - 'testContent' => 'DIE', - ], - 'exit as function call; no parameters' => [ - 'testMarker' => '/* testExitAsFunctionCallNoParam */', - 'testContent' => 'exit', - ], - 'die as function call; no parameters' => [ - 'testMarker' => '/* testDieAsFunctionCallNoParam */', - 'testContent' => 'die', - ], - 'exit as function call; with parameters' => [ - 'testMarker' => '/* testExitAsFunctionCallWithParam */', - 'testContent' => 'exit', - ], - 'die as function call; with parameters' => [ - 'testMarker' => '/* testDieAsFunctionCallWithParam */', - 'testContent' => 'die', - ], - 'exit as function call; uppercase' => [ - 'testMarker' => '/* testExitAsFunctionCallUppercase */', - 'testContent' => 'EXIT', - ], - 'die as function call; mixed case' => [ - 'testMarker' => '/* testDieAsFunctionCallMixedCase */', - 'testContent' => 'dIE', - ], - 'exit as fully qualified function call; with parameters' => [ - 'testMarker' => '/* testExitAsFQFunctionCallWithParam */', - 'testContent' => 'exit', - ], - 'die as fully qualified function call; no parameters' => [ - 'testMarker' => '/* testDieAsFQFunctionCallNoParam */', - 'testContent' => 'die', - ], - 'exit as fully qualified constant (illegal)' => [ - 'testMarker' => '/* testExitAsFQConstant */', - 'testContent' => 'exit', - ], - 'die as fully qualified constant (illegal)' => [ - 'testMarker' => '/* testDieAsFQConstant */', - 'testContent' => 'die', - ], - ]; - - }//end dataExitIsKeyword() - - - /** - * Verify that the retokenization of `T_EXIT` tokens doesn't negatively impact the tokenization - * of `T_STRING` tokens with the contents "exit" or "die" which aren't in actual fact the keyword. - * - * @param string $testMarker The comment prefacing the target token. - * @param string $testContent The token content to look for. - * @param string $expected The expected token type. Defaults to `T_STRING`. - * - * @dataProvider dataNotExitKeyword - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testNotExitKeyword($testMarker, $testContent, $expected='T_STRING') - { - $tokens = $this->phpcsFile->getTokens(); - $tokenCode = constant($expected); - - $token = $this->getTargetToken($testMarker, [T_EXIT, $tokenCode], $testContent); - $tokenArray = $tokens[$token]; - - $this->assertSame($tokenCode, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not '.$expected.' (code)'); - $this->assertSame($expected, $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not '.$expected.' (type)'); - - }//end testNotExitKeyword() - - - /** - * Data provider. - * - * @see testNotExitKeyword() - * - * @return array> - */ - public static function dataNotExitKeyword() - { - return [ - 'exit not keyword: OO constant use' => [ - 'testMarker' => '/* testNotExitOOConstantAccess */', - 'testContent' => 'exit', - ], - 'die not keyword: OO constant use' => [ - 'testMarker' => '/* testNotDieOOConstantAccess */', - 'testContent' => 'die', - ], - 'exit not keyword: OO property access' => [ - 'testMarker' => '/* testNotExitOOPropertyAccess */', - 'testContent' => 'exit', - ], - 'die not keyword: OO property access' => [ - 'testMarker' => '/* testNotDieOOPropertyAccess */', - 'testContent' => 'DIE', - ], - 'exit not keyword: OO method call' => [ - 'testMarker' => '/* testNotExitOOMethodCall */', - 'testContent' => 'exit', - ], - 'die not keyword: OO method call' => [ - 'testMarker' => '/* testNotDieOOMethodCall */', - 'testContent' => 'die', - ], - 'exit not keyword: OO constant declaration' => [ - 'testMarker' => '/* testNotExitOOConstDeclaration */', - 'testContent' => 'exit', - ], - 'die not keyword: OO constant declaration' => [ - 'testMarker' => '/* testNotDieOOConstDeclaration */', - 'testContent' => 'die', - ], - 'exit not keyword: OO method declaration' => [ - 'testMarker' => '/* testNotExitOOMethodDeclaration */', - 'testContent' => 'Exit', - ], - 'die not keyword: OO method declaration' => [ - 'testMarker' => '/* testNotDieOOMethodDeclaration */', - 'testContent' => 'die', - ], - 'exit not keyword: parameter label for named param' => [ - 'testMarker' => '/* testNotExitParamName */', - 'testContent' => 'exit', - 'expected' => 'T_PARAM_NAME', - ], - 'die not keyword: parameter label for named param' => [ - 'testMarker' => '/* testNotDieParamName */', - 'testContent' => 'die', - 'expected' => 'T_PARAM_NAME', - ], - 'exit not keyword: part of a namespaced name' => [ - 'testMarker' => '/* testNotExitNamespacedName */', - 'testContent' => 'exit', - ], - 'die not keyword: part of a namespaced name' => [ - 'testMarker' => '/* testNotDieNamespacedName */', - 'testContent' => 'die', - ], - 'exit not keyword: global constant declaration (illegal)' => [ - 'testMarker' => '/* testNotExitConstantDeclaration */', - 'testContent' => 'exit', - ], - 'die not keyword: global constant declaration (illegal)' => [ - 'testMarker' => '/* testNotDieConstantDeclaration */', - 'testContent' => 'die', - ], - 'exit not keyword: global function declaration (illegal)' => [ - 'testMarker' => '/* testNotExitFunctionDeclaration */', - 'testContent' => 'exit', - ], - 'die not keyword: global function declaration (illegal)' => [ - 'testMarker' => '/* testNotDieFunctionDeclaration */', - 'testContent' => 'die', - ], - ]; - - }//end dataNotExitKeyword() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/FinallyTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/FinallyTest.inc deleted file mode 100644 index e65600b..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/FinallyTest.inc +++ /dev/null @@ -1,40 +0,0 @@ -finally = 'foo'; - } -} diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/FinallyTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/FinallyTest.php deleted file mode 100644 index 1910bdf..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/FinallyTest.php +++ /dev/null @@ -1,98 +0,0 @@ - - * @copyright 2021 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\PHP; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; - -final class FinallyTest extends AbstractTokenizerTestCase -{ - - - /** - * Test that the finally keyword is tokenized as such. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * - * @dataProvider dataFinallyKeyword - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testFinallyKeyword($testMarker) - { - $tokens = $this->phpcsFile->getTokens(); - $target = $this->getTargetToken($testMarker, [T_FINALLY, T_STRING]); - $tokenArray = $tokens[$target]; - - $this->assertSame(T_FINALLY, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_FINALLY (code)'); - $this->assertSame('T_FINALLY', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_FINALLY (type)'); - - }//end testFinallyKeyword() - - - /** - * Data provider. - * - * @see testFinallyKeyword() - * - * @return array> - */ - public static function dataFinallyKeyword() - { - return [ - 'finally after try and catch' => ['/* testTryCatchFinally */'], - 'finally between try and catch' => ['/* testTryFinallyCatch */'], - 'finally after try, no catch' => ['/* testTryFinally */'], - ]; - - }//end dataFinallyKeyword() - - - /** - * Test that 'finally' when not used as the reserved keyword is tokenized as `T_STRING`. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * - * @dataProvider dataFinallyNonKeyword - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testFinallyNonKeyword($testMarker) - { - $tokens = $this->phpcsFile->getTokens(); - $target = $this->getTargetToken($testMarker, [T_FINALLY, T_STRING]); - $tokenArray = $tokens[$target]; - - $this->assertSame(T_STRING, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_STRING (code)'); - $this->assertSame('T_STRING', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_STRING (type)'); - - }//end testFinallyNonKeyword() - - - /** - * Data provider. - * - * @see testFinallyNonKeyword() - * - * @return array> - */ - public static function dataFinallyNonKeyword() - { - return [ - 'finally used as class constant name' => ['/* testFinallyUsedAsClassConstantName */'], - 'finally used as method name' => ['/* testFinallyUsedAsMethodName */'], - 'finally used as property name' => ['/* testFinallyUsedAsPropertyName */'], - ]; - - }//end dataFinallyNonKeyword() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/GotoLabelTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/GotoLabelTest.inc deleted file mode 100644 index 249064a..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/GotoLabelTest.inc +++ /dev/null @@ -1,85 +0,0 @@ - -
    - - - -
    - -
    - - property: - // Do something. - break; -} - -switch (true) { - /* testNotGotoDeclarationGlobalConstantInTernary */ - case $x === ($cond) ? CONST_A : CONST_B: - // Do something. - break; -} - -/* testNotGotoDeclarationEnumWithType */ -enum Suit: string implements Colorful, CardGame {} diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/GotoLabelTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/GotoLabelTest.php deleted file mode 100644 index 903a3f4..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/GotoLabelTest.php +++ /dev/null @@ -1,194 +0,0 @@ - - * @copyright 2020 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\PHP; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; - -/** - * Tests the tokenization of goto declarations and statements. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - */ -final class GotoLabelTest extends AbstractTokenizerTestCase -{ - - - /** - * Verify that the label in a goto statement is tokenized as T_STRING. - * - * @param string $testMarker The comment prefacing the target token. - * @param string $testContent The token content to expect. - * - * @dataProvider dataGotoStatement - * - * @return void - */ - public function testGotoStatement($testMarker, $testContent) - { - $tokens = $this->phpcsFile->getTokens(); - - $label = $this->getTargetToken($testMarker, T_STRING); - - $this->assertTrue(is_int($label)); - $this->assertSame($testContent, $tokens[$label]['content']); - - }//end testGotoStatement() - - - /** - * Data provider. - * - * @see testGotoStatement() - * - * @return array> - */ - public static function dataGotoStatement() - { - return [ - 'label for goto statement' => [ - 'testMarker' => '/* testGotoStatement */', - 'testContent' => 'marker', - ], - 'label for goto statement in loop, keyword capitalized' => [ - 'testMarker' => '/* testGotoStatementInLoop */', - 'testContent' => 'end', - ], - 'label for goto statement in switch' => [ - 'testMarker' => '/* testGotoStatementInSwitch */', - 'testContent' => 'def', - ], - 'label for goto statement within function' => [ - 'testMarker' => '/* testGotoStatementInFunction */', - 'testContent' => 'label', - ], - ]; - - }//end dataGotoStatement() - - - /** - * Verify that the label in a goto declaration is tokenized as T_GOTO_LABEL. - * - * @param string $testMarker The comment prefacing the target token. - * @param string $testContent The token content to expect. - * - * @dataProvider dataGotoDeclaration - * - * @return void - */ - public function testGotoDeclaration($testMarker, $testContent) - { - $tokens = $this->phpcsFile->getTokens(); - - $label = $this->getTargetToken($testMarker, T_GOTO_LABEL); - - $this->assertTrue(is_int($label)); - $this->assertSame($testContent, $tokens[$label]['content']); - - }//end testGotoDeclaration() - - - /** - * Data provider. - * - * @see testGotoDeclaration() - * - * @return array> - */ - public static function dataGotoDeclaration() - { - return [ - 'label in goto declaration - marker' => [ - 'testMarker' => '/* testGotoDeclaration */', - 'testContent' => 'marker:', - ], - 'label in goto declaration - end' => [ - 'testMarker' => '/* testGotoDeclarationOutsideLoop */', - 'testContent' => 'end:', - ], - 'label in goto declaration - def' => [ - 'testMarker' => '/* testGotoDeclarationInSwitch */', - 'testContent' => 'def:', - ], - 'label in goto declaration - label' => [ - 'testMarker' => '/* testGotoDeclarationInFunction */', - 'testContent' => 'label:', - ], - ]; - - }//end dataGotoDeclaration() - - - /** - * Verify that the constant used in a switch - case statement is not confused with a goto label. - * - * @param string $testMarker The comment prefacing the target token. - * @param string $testContent The token content to expect. - * - * @dataProvider dataNotAGotoDeclaration - * - * @return void - */ - public function testNotAGotoDeclaration($testMarker, $testContent) - { - $tokens = $this->phpcsFile->getTokens(); - $target = $this->getTargetToken($testMarker, [T_GOTO_LABEL, T_STRING], $testContent); - $tokenArray = $tokens[$target]; - - $this->assertSame(T_STRING, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_STRING (code)'); - $this->assertSame('T_STRING', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_STRING (type)'); - - }//end testNotAGotoDeclaration() - - - /** - * Data provider. - * - * @see testNotAGotoDeclaration() - * - * @return array> - */ - public static function dataNotAGotoDeclaration() - { - return [ - 'not goto label - global constant followed by switch-case colon' => [ - 'testMarker' => '/* testNotGotoDeclarationGlobalConstant */', - 'testContent' => 'CONSTANT', - ], - 'not goto label - namespaced constant followed by switch-case colon' => [ - 'testMarker' => '/* testNotGotoDeclarationNamespacedConstant */', - 'testContent' => 'CONSTANT', - ], - 'not goto label - class constant followed by switch-case colon' => [ - 'testMarker' => '/* testNotGotoDeclarationClassConstant */', - 'testContent' => 'CONSTANT', - ], - 'not goto label - class property use followed by switch-case colon' => [ - 'testMarker' => '/* testNotGotoDeclarationClassProperty */', - 'testContent' => 'property', - ], - 'not goto label - global constant followed by ternary else' => [ - 'testMarker' => '/* testNotGotoDeclarationGlobalConstantInTernary */', - 'testContent' => 'CONST_A', - ], - 'not goto label - global constant after ternary else' => [ - 'testMarker' => '/* testNotGotoDeclarationGlobalConstantInTernary */', - 'testContent' => 'CONST_B', - ], - 'not goto label - name of backed enum' => [ - 'testMarker' => '/* testNotGotoDeclarationEnumWithType */', - 'testContent' => 'Suit', - ], - ]; - - }//end dataNotAGotoDeclaration() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/HeredocNowdocTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/HeredocNowdocTest.inc deleted file mode 100644 index 5041dda..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/HeredocNowdocTest.inc +++ /dev/null @@ -1,39 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\PHP; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; -use PHP_CodeSniffer\Util\Tokens; - -/** - * Tests the tokenization for heredoc/nowdoc constructs. - * - * Verifies that: - * - Nowdoc opener/closers are retokenized from `T_[START_|END_]HEREDOC` to `T_[START_|END_]NOWDOC`. - * - The contents of the heredoc/nowdoc is tokenized as `T_HEREDOC`/`T_NOWDOC`. - * - Each line of the contents has its own token, which includes the new line char. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - */ -final class HeredocNowdocTest extends AbstractTokenizerTestCase -{ - - - /** - * Verify tokenization a heredoc construct. - * - * @phpcs:disable Squiz.Arrays.ArrayDeclaration.SpaceBeforeDoubleArrow -- Readability is better with alignment. - * - * @return void - */ - public function testHeredocSingleLine() - { - $expectedSequence = [ - [T_START_HEREDOC => '<< 'Some $var text'."\n"], - [T_END_HEREDOC => 'EOD'], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_START_HEREDOC); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testHeredocSingleLine() - - - /** - * Verify tokenization a nowdoc construct. - * - * @phpcs:disable Squiz.Arrays.ArrayDeclaration.SpaceBeforeDoubleArrow -- Readability is better with alignment. - * - * @return void - */ - public function testNowdocSingleLine() - { - $expectedSequence = [ - [T_START_NOWDOC => "<<<'MARKER'\n"], - [T_NOWDOC => 'Some text'."\n"], - [T_END_NOWDOC => 'MARKER'], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_START_NOWDOC); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testNowdocSingleLine() - - - /** - * Verify tokenization a multiline heredoc construct. - * - * @phpcs:disable Squiz.Arrays.ArrayDeclaration.SpaceBeforeDoubleArrow -- Readability is better with alignment. - * - * @return void - */ - public function testHeredocMultiLine() - { - $expectedSequence = [ - [T_START_HEREDOC => '<<<"😬"'."\n"], - [T_HEREDOC => 'Lorum ipsum'."\n"], - [T_HEREDOC => 'Some $var text'."\n"], - [T_HEREDOC => 'dolor sit amet'."\n"], - [T_END_HEREDOC => '😬'], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_START_HEREDOC); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testHeredocMultiLine() - - - /** - * Verify tokenization a multiline testNowdocSingleLine construct. - * - * @phpcs:disable Squiz.Arrays.ArrayDeclaration.SpaceBeforeDoubleArrow -- Readability is better with alignment. - * - * @return void - */ - public function testNowdocMultiLine() - { - $expectedSequence = [ - [T_START_NOWDOC => "<<<'multi_line'\n"], - [T_NOWDOC => 'Lorum ipsum'."\n"], - [T_NOWDOC => 'Some text'."\n"], - [T_NOWDOC => 'dolor sit amet'."\n"], - [T_END_NOWDOC => 'multi_line'], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_START_NOWDOC); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testNowdocMultiLine() - - - /** - * Verify tokenization a multiline heredoc construct. - * - * @phpcs:disable Squiz.Arrays.ArrayDeclaration.SpaceBeforeDoubleArrow -- Readability is better with alignment. - * - * @return void - */ - public function testHeredocEndsOnBlankLine() - { - $expectedSequence = [ - [T_START_HEREDOC => '<< 'Lorum ipsum'."\n"], - [T_HEREDOC => 'dolor sit amet'."\n"], - [T_HEREDOC => "\n"], - [T_END_HEREDOC => 'EOD'], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_START_HEREDOC); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testHeredocEndsOnBlankLine() - - - /** - * Verify tokenization a multiline testNowdocSingleLine construct. - * - * @phpcs:disable Squiz.Arrays.ArrayDeclaration.SpaceBeforeDoubleArrow -- Readability is better with alignment. - * - * @return void - */ - public function testNowdocEndsOnBlankLine() - { - $expectedSequence = [ - [T_START_NOWDOC => "<<<'EOD'\n"], - [T_NOWDOC => 'Lorum ipsum'."\n"], - [T_NOWDOC => 'dolor sit amet'."\n"], - [T_NOWDOC => "\n"], - [T_END_NOWDOC => 'EOD'], - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_START_NOWDOC); - - $this->checkTokenSequence($target, $expectedSequence); - - }//end testNowdocEndsOnBlankLine() - - - /** - * Test helper. Check a token sequence complies with an expected token sequence. - * - * @param int $startPtr The position in the file to start checking from. - * @param array> $expectedSequence The consecutive token constants and their contents to expect. - * - * @return void - */ - private function checkTokenSequence($startPtr, array $expectedSequence) - { - $tokens = $this->phpcsFile->getTokens(); - - $sequenceKey = 0; - $sequenceCount = count($expectedSequence); - - for ($i = $startPtr; $sequenceKey < $sequenceCount; $i++, $sequenceKey++) { - $currentItem = $expectedSequence[$sequenceKey]; - $expectedCode = key($currentItem); - $expectedType = Tokens::tokenName($expectedCode); - $expectedContent = current($currentItem); - $errorMsgSuffix = PHP_EOL.'(StackPtr: '.$i.' | Position in sequence: '.$sequenceKey.' | Expected: '.$expectedType.')'; - - $this->assertSame( - $expectedCode, - $tokens[$i]['code'], - 'Token tokenized as '.Tokens::tokenName($tokens[$i]['code']).', not '.$expectedType.' (code)'.$errorMsgSuffix - ); - - $this->assertSame( - $expectedType, - $tokens[$i]['type'], - 'Token tokenized as '.$tokens[$i]['type'].', not '.$expectedType.' (type)'.$errorMsgSuffix - ); - - $this->assertSame( - $expectedContent, - $tokens[$i]['content'], - 'Token content did not match expectations'.$errorMsgSuffix - ); - }//end for - - }//end checkTokenSequence() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/HeredocParseErrorTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/HeredocParseErrorTest.inc deleted file mode 100644 index d552b12..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/HeredocParseErrorTest.inc +++ /dev/null @@ -1,11 +0,0 @@ ->>>>>> master diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/HeredocParseErrorTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/HeredocParseErrorTest.php deleted file mode 100644 index d678d5d..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/HeredocParseErrorTest.php +++ /dev/null @@ -1,41 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\PHP; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; - -/** - * Tests the tokenization for an unclosed heredoc construct. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - */ -final class HeredocParseErrorTest extends AbstractTokenizerTestCase -{ - - - /** - * Verify that a heredoc (and nowdoc) start token is retokenized to T_STRING if no closer is found. - * - * @return void - */ - public function testMergeConflict() - { - $tokens = $this->phpcsFile->getTokens(); - - $token = $this->getTargetToken('/* testUnclosedHeredoc */', [T_START_HEREDOC, T_STRING], '<<< HEAD'."\n"); - $tokenArray = $tokens[$token]; - - $this->assertSame(T_STRING, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_START_HEREDOC (code)'); - $this->assertSame('T_STRING', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_START_HEREDOC (type)'); - - }//end testMergeConflict() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/HeredocStringTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/HeredocStringTest.inc deleted file mode 100644 index ae43e24..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/HeredocStringTest.inc +++ /dev/null @@ -1,193 +0,0 @@ -bar -EOD; - -/* testProperty2 */ -$heredoc = <<<"EOD" -{$foo->bar} -EOD; - -/* testMethod1 */ -$heredoc = <<bar()} -EOD; - -/* testClosure1 */ -$heredoc = <<<"EOD" -{$foo()} -EOD; - -/* testChain1 */ -$heredoc = <<baz()()} -EOD; - -/* testVariableVar1 */ -$heredoc = <<<"EOD" -${$bar} -EOD; - -/* testVariableVar2 */ -$heredoc = <<bar} -EOD; - -/* testNested1 */ -$heredoc = <<{$baz}} -EOD; - -/* testNested4 */ -$heredoc = <<<"EOD" -${foo->{${'a'}}} -EOD; - -/* testNested5 */ -$heredoc = <<{"${'a'}"}} -EOD; - -/* testSimple1Wrapped */ -$heredoc = <<bar Something -EOD; - -/* testProperty2Wrapped */ -$heredoc = <<<"EOD" -Do {$foo->bar} Something -EOD; - -/* testMethod1Wrapped */ -$heredoc = <<bar()} Something -EOD; - -/* testClosure1Wrapped */ -$heredoc = <<<"EOD" -Do {$foo()} Something -EOD; - -/* testChain1Wrapped */ -$heredoc = <<baz()()} Something -EOD; - -/* testVariableVar1Wrapped */ -$heredoc = <<<"EOD" -Do ${$bar} Something -EOD; - -/* testVariableVar2Wrapped */ -$heredoc = <<bar} Something -EOD; - -/* testNested1Wrapped */ -$heredoc = <<{$baz}} Something -EOD; - -/* testNested4Wrapped */ -$heredoc = <<<"EOD" -Do ${foo->{${'a'}}} Something -EOD; - -/* testNested5Wrapped */ -$heredoc = <<{"${'a'}"}} Something -EOD; diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/HeredocStringTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/HeredocStringTest.php deleted file mode 100644 index 5d9218c..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/HeredocStringTest.php +++ /dev/null @@ -1,161 +0,0 @@ - - * @copyright 2022 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\PHP; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; - -final class HeredocStringTest extends AbstractTokenizerTestCase -{ - - - /** - * Test that heredoc strings contain the complete interpolated string. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * @param string $expectedContent The expected content of the heredoc string. - * - * @dataProvider dataHeredocString - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testHeredocString($testMarker, $expectedContent) - { - $tokens = $this->phpcsFile->getTokens(); - - $target = $this->getTargetToken($testMarker, T_HEREDOC); - $this->assertSame($expectedContent."\n", $tokens[$target]['content']); - - }//end testHeredocString() - - - /** - * Test that heredoc strings contain the complete interpolated string when combined with other texts. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * @param string $expectedContent The expected content of the heredoc string. - * - * @dataProvider dataHeredocString - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testHeredocStringWrapped($testMarker, $expectedContent) - { - $tokens = $this->phpcsFile->getTokens(); - - $testMarker = substr($testMarker, 0, -3).'Wrapped */'; - $target = $this->getTargetToken($testMarker, T_HEREDOC); - $this->assertSame('Do '.$expectedContent." Something\n", $tokens[$target]['content']); - - }//end testHeredocStringWrapped() - - - /** - * Data provider. - * - * Type reference: - * 1. Directly embedded variables. - * 2. Braces outside the variable. - * 3. Braces after the dollar sign. - * 4. Variable variables and expressions. - * - * @link https://wiki.php.net/rfc/deprecate_dollar_brace_string_interpolation - * - * @see testHeredocString() - * - * @return array> - */ - public static function dataHeredocString() - { - return [ - 'Type 1: simple variable' => [ - 'testMarker' => '/* testSimple1 */', - 'expectedContent' => '$foo', - ], - 'Type 2: simple variable' => [ - 'testMarker' => '/* testSimple2 */', - 'expectedContent' => '{$foo}', - ], - 'Type 3: simple variable' => [ - 'testMarker' => '/* testSimple3 */', - 'expectedContent' => '${foo}', - ], - 'Type 1: array offset' => [ - 'testMarker' => '/* testDIM1 */', - 'expectedContent' => '$foo[bar]', - ], - 'Type 2: array offset' => [ - 'testMarker' => '/* testDIM2 */', - 'expectedContent' => '{$foo[\'bar\']}', - ], - 'Type 3: array offset' => [ - 'testMarker' => '/* testDIM3 */', - 'expectedContent' => '${foo[\'bar\']}', - ], - 'Type 1: object property' => [ - 'testMarker' => '/* testProperty1 */', - 'expectedContent' => '$foo->bar', - ], - 'Type 2: object property' => [ - 'testMarker' => '/* testProperty2 */', - 'expectedContent' => '{$foo->bar}', - ], - 'Type 2: object method call' => [ - 'testMarker' => '/* testMethod1 */', - 'expectedContent' => '{$foo->bar()}', - ], - 'Type 2: closure function call' => [ - 'testMarker' => '/* testClosure1 */', - 'expectedContent' => '{$foo()}', - ], - 'Type 2: chaining various syntaxes' => [ - 'testMarker' => '/* testChain1 */', - 'expectedContent' => '{$foo[\'bar\']->baz()()}', - ], - 'Type 4: variable variables' => [ - 'testMarker' => '/* testVariableVar1 */', - 'expectedContent' => '${$bar}', - ], - 'Type 4: variable constants' => [ - 'testMarker' => '/* testVariableVar2 */', - 'expectedContent' => '${(foo)}', - ], - 'Type 4: object property' => [ - 'testMarker' => '/* testVariableVar3 */', - 'expectedContent' => '${foo->bar}', - ], - 'Type 4: variable variable nested in array offset' => [ - 'testMarker' => '/* testNested1 */', - 'expectedContent' => '${foo["${bar}"]}', - ], - 'Type 4: variable array offset nested in array offset' => [ - 'testMarker' => '/* testNested2 */', - 'expectedContent' => '${foo["${bar[\'baz\']}"]}', - ], - 'Type 4: variable object property' => [ - 'testMarker' => '/* testNested3 */', - 'expectedContent' => '${foo->{$baz}}', - ], - 'Type 4: variable object property - complex with single quotes' => [ - 'testMarker' => '/* testNested4 */', - 'expectedContent' => '${foo->{${\'a\'}}}', - ], - 'Type 4: variable object property - complex with single and double quotes' => [ - 'testMarker' => '/* testNested5 */', - 'expectedContent' => '${foo->{"${\'a\'}"}}', - ], - ]; - - }//end dataHeredocString() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/NamedFunctionCallArgumentsTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/NamedFunctionCallArgumentsTest.inc deleted file mode 100644 index 7513ad7..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/NamedFunctionCallArgumentsTest.inc +++ /dev/null @@ -1,419 +0,0 @@ -getPos(skip: false), - count: count(array_or_countable: $array), - value: 50 -); - -array_fill( - start_index: /* testNestedFunctionCallInner1 */ $obj->getPos(skip: false), - count: /* testNestedFunctionCallInner2 */ count(array_or_countable: $array), - value: 50 -); - -/* testNamespaceRelativeFunction */ -namespace\function_name(label:$string, more: false); - -/* testPartiallyQualifiedFunction */ -Partially\Qualified\function_name(label:$string, more: false); - -/* testFullyQualifiedFunction */ -\Fully\Qualified\function_name(label: $string, more:false); - -/* testVariableFunction */ -$fn(label: $string, more:false); - -/* testVariableVariableFunction */ -${$fn}(label: $string, more:false); - -/* testMethodCall */ -$obj->methodName(label: $foo, more: $bar); - -/* testVariableMethodCall */ -$obj->{$var}(label: $foo, more: $bar); - -/* testClassInstantiation */ -$obj = new MyClass(label: $string, more:false); - -/* testClassInstantiationSelf */ -$obj = new self(label: $string, more:true); - -/* testClassInstantiationStatic */ -$obj = new static(label: $string, more:false); - -/* testAnonClass */ -$anon = new class(label: $string, more: false) { - public function __construct($label, $more) {} -}; - -function myfoo( $💩💩💩, $Пасха, $_valid) {} -/* testNonAsciiNames */ -foo(💩💩💩: [], Пасха: 'text', _valid: 123); - -/* testMixedPositionalAndNamedArgsWithTernary */ -foo( $cond ? true : false, name: $value2 ); - -/* testNamedArgWithTernary */ -foo( label: $cond ? true : false, more: $cond ? CONSTANT_A : CONSTANT_B ); - -/* testTernaryWithFunctionCallsInThenElse */ -echo $cond ? foo( label: $something ) : foo( more: $something_else ); - -/* testTernaryWithConstantsInThenElse */ -echo $cond ? CONSTANT_NAME : OTHER_CONSTANT; - -switch ($s) { - /* testSwitchCaseWithConstant */ - case MY_CONSTANT: - // Do something. - break; - - /* testSwitchCaseWithClassProperty */ - case $obj->property: - // Do something. - break; - - /* testSwitchDefault */ - default: - // Do something. - break; -} - -/* testTernaryWithClosuresAndReturnTypes */ -$closure = $cond ? function() : bool {return true;} : function() : int {return 123;}; - -/* testTernaryWithArrowFunctionsAndReturnTypes */ -$fn = $cond ? fn() : bool => true : fn() : int => 123; - -/* testPHP84Exit */ -// Exit is a language construct, not a function prior to PHP 8.4. Prior to PHP 8.4, named params were not supported, handle it anyway. -exit(status: $value); - -/* testPHP84Die */ -// Die is a language construct, not a function prior to PHP 8.4. Prior to PHP 8.4, named params were not supported, handle it anyway. -die(status: $value); - -/* testPHP84FullyQualifiedExit */ -// Exit is a language construct, not a function prior to PHP 8.4. Prior to PHP 8.4, named params were not supported, handle it anyway. -\exit(status: $value); - -/* testPHP84FullyQualifiedDie */ -// Die is a language construct, not a function prior to PHP 8.4. Prior to PHP 8.4, named params were not supported, handle it anyway. -\die(status: $value); - - -/* testCompileErrorNamedBeforePositional */ -// Not the concern of PHPCS. Should still be handled. -test(param: $bar, $foo); - -/* testDuplicateName1 */ -// Error Exception, but not the concern of PHPCS. Should still be handled. -test(param: 1, /* testDuplicateName2 */ param: 2); - -/* testIncorrectOrderWithVariadic */ -// Error Exception, but not the concern of PHPCS. Should still be handled. -array_fill(start_index: 0, ...[100, 50]); - -/* testCompileErrorIncorrectOrderWithVariadic */ -// Not the concern of PHPCS. Should still be handled. -test(...$values, param: $value); // Compile-time error - -/* testParseErrorNoValue */ -// Not the concern of PHPCS. Should still be handled. -test(param1:, param2:); - -/* testParseErrorDynamicName */ -// Parse error. Ignore. -function_name($variableStoringParamName: $value); - -/* testParseErrorEmpty */ -// Empty is a language construct, not a function. Named params not supported, handle it anyway. -empty(variable: $value); - -/* testParseErrorEval */ -// Eval is a language construct, not a function. Named params not supported, handle it anyway. -eval(code: $value); - -/* testParseErrorArbitraryParentheses */ -// Parse error. Not named param, handle it anyway. -$calc = (something: $value / $other); - - -/* testReservedKeywordAbstract1 */ -foobar(abstract: $value, /* testReservedKeywordAbstract2 */ abstract: $value); - -/* testReservedKeywordAnd1 */ -foobar(and: $value, /* testReservedKeywordAnd2 */ and: $value); - -/* testReservedKeywordArray1 */ -foobar(array: $value, /* testReservedKeywordArray2 */ array: $value); - -/* testReservedKeywordAs1 */ -foobar(as: $value, /* testReservedKeywordAs2 */ as: $value); - -/* testReservedKeywordBreak1 */ -foobar(break: $value, /* testReservedKeywordBreak2 */ break: $value); - -/* testReservedKeywordCallable1 */ -foobar(callable: $value, /* testReservedKeywordCallable2 */ callable: $value); - -/* testReservedKeywordCase1 */ -foobar(case: $value, /* testReservedKeywordCase2 */ case: $value); - -/* testReservedKeywordCatch1 */ -foobar(catch: $value, /* testReservedKeywordCatch2 */ catch: $value); - -/* testReservedKeywordClass1 */ -foobar(class: $value, /* testReservedKeywordClass2 */ class: $value); - -/* testReservedKeywordClone1 */ -foobar(clone: $value, /* testReservedKeywordClone2 */ clone: $value); - -/* testReservedKeywordConst1 */ -foobar(const: $value, /* testReservedKeywordConst2 */ const: $value); - -/* testReservedKeywordContinue1 */ -foobar(continue: $value, /* testReservedKeywordContinue2 */ continue: $value); - -/* testReservedKeywordDeclare1 */ -foobar(declare: $value, /* testReservedKeywordDeclare2 */ declare: $value); - -/* testReservedKeywordDefault1 */ -foobar(default: $value, /* testReservedKeywordDefault2 */ default: $value); - -/* testReservedKeywordDie1 */ -foobar(die: $value, /* testReservedKeywordDie2 */ die: $value); - -/* testReservedKeywordDo1 */ -foobar(do: $value, /* testReservedKeywordDo2 */ do: $value); - -/* testReservedKeywordEcho1 */ -foobar(echo: $value, /* testReservedKeywordEcho2 */ echo: $value); - -/* testReservedKeywordElse1 */ -foobar(else: $value, /* testReservedKeywordElse2 */ else: $value); - -/* testReservedKeywordElseif1 */ -foobar(elseif: $value, /* testReservedKeywordElseif2 */ elseif: $value); - -/* testReservedKeywordEmpty1 */ -foobar(empty: $value, /* testReservedKeywordEmpty2 */ empty: $value); - -/* testReservedKeywordEnum1 */ -foobar(enum: $value, /* testReservedKeywordEnum2 */ enum: $value); - -/* testReservedKeywordEnddeclare1 */ -foobar(enddeclare: $value, /* testReservedKeywordEnddeclare2 */ enddeclare: $value); - -/* testReservedKeywordEndfor1 */ -foobar(endfor: $value, /* testReservedKeywordEndfor2 */ endfor: $value); - -/* testReservedKeywordEndforeach1 */ -foobar(endforeach: $value, /* testReservedKeywordEndforeach2 */ endforeach: $value); - -/* testReservedKeywordEndif1 */ -foobar(endif: $value, /* testReservedKeywordEndif2 */ endif: $value); - -/* testReservedKeywordEndswitch1 */ -foobar(endswitch: $value, /* testReservedKeywordEndswitch2 */ endswitch: $value); - -/* testReservedKeywordEndwhile1 */ -foobar(endwhile: $value, /* testReservedKeywordEndwhile2 */ endwhile: $value); - -/* testReservedKeywordEval1 */ -foobar(eval: $value, /* testReservedKeywordEval2 */ eval: $value); - -/* testReservedKeywordExit1 */ -foobar(exit: $value, /* testReservedKeywordExit2 */ exit: $value); - -/* testReservedKeywordExtends1 */ -foobar(extends: $value, /* testReservedKeywordExtends2 */ extends: $value); - -/* testReservedKeywordFinal1 */ -foobar(final: $value, /* testReservedKeywordFinal2 */ final: $value); - -/* testReservedKeywordFinally1 */ -foobar(finally: $value, /* testReservedKeywordFinally2 */ finally: $value); - -/* testReservedKeywordFn1 */ -foobar(fn: $value, /* testReservedKeywordFn2 */ fn: $value); - -/* testReservedKeywordFor1 */ -foobar(for: $value, /* testReservedKeywordFor2 */ for: $value); - -/* testReservedKeywordForeach1 */ -foobar(foreach: $value, /* testReservedKeywordForeach2 */ foreach: $value); - -/* testReservedKeywordFunction1 */ -foobar(function: $value, /* testReservedKeywordFunction2 */ function: $value); - -/* testReservedKeywordGlobal1 */ -foobar(global: $value, /* testReservedKeywordGlobal2 */ global: $value); - -/* testReservedKeywordGoto1 */ -foobar(goto: $value, /* testReservedKeywordGoto2 */ goto: $value); - -/* testReservedKeywordIf1 */ -foobar(if: $value, /* testReservedKeywordIf2 */ if: $value); - -/* testReservedKeywordImplements1 */ -foobar(implements: $value, /* testReservedKeywordImplements2 */ implements: $value); - -/* testReservedKeywordInclude1 */ -foobar(include: $value, /* testReservedKeywordInclude2 */ include: $value); - -/* testReservedKeywordInclude_once1 */ -foobar(include_once: $value, /* testReservedKeywordInclude_once2 */ include_once: $value); - -/* testReservedKeywordInstanceof1 */ -foobar(instanceof: $value, /* testReservedKeywordInstanceof2 */ instanceof: $value); - -/* testReservedKeywordInsteadof1 */ -foobar(insteadof: $value, /* testReservedKeywordInsteadof2 */ insteadof: $value); - -/* testReservedKeywordInterface1 */ -foobar(interface: $value, /* testReservedKeywordInterface2 */ interface: $value); - -/* testReservedKeywordIsset1 */ -foobar(isset: $value, /* testReservedKeywordIsset2 */ isset: $value); - -/* testReservedKeywordList1 */ -foobar(list: $value, /* testReservedKeywordList2 */ list: $value); - -/* testReservedKeywordMatch1 */ -foobar(match: $value, /* testReservedKeywordMatch2 */ match: $value); - -/* testReservedKeywordNamespace1 */ -foobar(namespace: $value, /* testReservedKeywordNamespace2 */ namespace: $value); - -/* testReservedKeywordNew1 */ -foobar(new: $value, /* testReservedKeywordNew2 */ new: $value); - -/* testReservedKeywordOr1 */ -foobar(or: $value, /* testReservedKeywordOr2 */ or: $value); - -/* testReservedKeywordPrint1 */ -foobar(print: $value, /* testReservedKeywordPrint2 */ print: $value); - -/* testReservedKeywordPrivate1 */ -foobar(private: $value, /* testReservedKeywordPrivate2 */ private: $value); - -/* testReservedKeywordProtected1 */ -foobar(protected: $value, /* testReservedKeywordProtected2 */ protected: $value); - -/* testReservedKeywordPublic1 */ -foobar(public: $value, /* testReservedKeywordPublic2 */ public: $value); - -/* testReservedKeywordReadonly1 */ -foobar(readonly: $value, /* testReservedKeywordReadonly2 */ readonly: $value); - -/* testReservedKeywordRequire1 */ -foobar(require: $value, /* testReservedKeywordRequire2 */ require: $value); - -/* testReservedKeywordRequire_once1 */ -foobar(require_once: $value, /* testReservedKeywordRequire_once2 */ require_once: $value); - -/* testReservedKeywordReturn1 */ -foobar(return: $value, /* testReservedKeywordReturn2 */ return: $value); - -/* testReservedKeywordStatic1 */ -foobar(static: $value, /* testReservedKeywordStatic2 */ static: $value); - -/* testReservedKeywordSwitch1 */ -foobar(switch: $value, /* testReservedKeywordSwitch2 */ switch: $value); - -/* testReservedKeywordThrow1 */ -foobar(throw: $value, /* testReservedKeywordThrow2 */ throw: $value); - -/* testReservedKeywordTrait1 */ -foobar(trait: $value, /* testReservedKeywordTrait2 */ trait: $value); - -/* testReservedKeywordTry1 */ -foobar(try: $value, /* testReservedKeywordTry2 */ try: $value); - -/* testReservedKeywordUnset1 */ -foobar(unset: $value, /* testReservedKeywordUnset2 */ unset: $value); - -/* testReservedKeywordUse1 */ -foobar(use: $value, /* testReservedKeywordUse2 */ use: $value); - -/* testReservedKeywordVar1 */ -foobar(var: $value, /* testReservedKeywordVar2 */ var: $value); - -/* testReservedKeywordWhile1 */ -foobar(while: $value, /* testReservedKeywordWhile2 */ while: $value); - -/* testReservedKeywordXor1 */ -foobar(xor: $value, /* testReservedKeywordXor2 */ xor: $value); - -/* testReservedKeywordYield1 */ -foobar(yield: $value, /* testReservedKeywordYield2 */ yield: $value); - -/* testReservedKeywordInt1 */ -foobar(int: $value, /* testReservedKeywordInt2 */ int: $value); - -/* testReservedKeywordFloat1 */ -foobar(float: $value, /* testReservedKeywordFloat2 */ float: $value); - -/* testReservedKeywordBool1 */ -foobar(bool: $value, /* testReservedKeywordBool2 */ bool: $value); - -/* testReservedKeywordString1 */ -foobar(string: $value, /* testReservedKeywordString2 */ string: $value); - -/* testReservedKeywordTrue1 */ -foobar(true: $value, /* testReservedKeywordTrue2 */ true: $value); - -/* testReservedKeywordFalse1 */ -foobar(false: $value, /* testReservedKeywordFalse2 */ false: $value); - -/* testReservedKeywordNull1 */ -foobar(null: $value, /* testReservedKeywordNull2 */ null: $value); - -/* testReservedKeywordVoid1 */ -foobar(void: $value, /* testReservedKeywordVoid2 */ void: $value); - -/* testReservedKeywordIterable1 */ -foobar(iterable: $value, /* testReservedKeywordIterable2 */ iterable: $value); - -/* testReservedKeywordObject1 */ -foobar(object: $value, /* testReservedKeywordObject2 */ object: $value); - -/* testReservedKeywordResource1 */ -foobar(resource: $value, /* testReservedKeywordResource2 */ resource: $value); - -/* testReservedKeywordMixed1 */ -foobar(mixed: $value, /* testReservedKeywordMixed2 */ mixed: $value); - -/* testReservedKeywordNumeric1 */ -foobar(numeric: $value, /* testReservedKeywordNumeric2 */ numeric: $value); - -/* testReservedKeywordParent1 */ -foobar(parent: $value, /* testReservedKeywordParent2 */ parent: $value); - -/* testReservedKeywordSelf1 */ -foobar(self: $value, /* testReservedKeywordSelf2 */ self: $value); - -/* testReservedKeywordNever1 */ -foobar(never: $value, /* testReservedKeywordNever2 */ never: $value); diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/NamedFunctionCallArgumentsTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/NamedFunctionCallArgumentsTest.php deleted file mode 100644 index 33aaa81..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/NamedFunctionCallArgumentsTest.php +++ /dev/null @@ -1,992 +0,0 @@ - - * @copyright 2020 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\PHP; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; -use PHP_CodeSniffer\Util\Tokens; - -final class NamedFunctionCallArgumentsTest extends AbstractTokenizerTestCase -{ - - - /** - * Verify that parameter labels are tokenized as T_PARAM_NAME and that - * the colon after it is tokenized as a T_COLON. - * - * @param string $testMarker The comment prefacing the target token. - * @param array $parameters The token content for each parameter label to look for. - * - * @dataProvider dataNamedFunctionCallArguments - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testNamedFunctionCallArguments($testMarker, $parameters) - { - $tokens = $this->phpcsFile->getTokens(); - - foreach ($parameters as $content) { - $label = $this->getTargetToken($testMarker, [T_STRING, T_PARAM_NAME], $content); - - $this->assertSame( - T_PARAM_NAME, - $tokens[$label]['code'], - 'Token tokenized as '.$tokens[$label]['type'].', not T_PARAM_NAME (code)' - ); - $this->assertSame( - 'T_PARAM_NAME', - $tokens[$label]['type'], - 'Token tokenized as '.$tokens[$label]['type'].', not T_PARAM_NAME (type)' - ); - - // Get the next non-empty token. - $colon = $this->phpcsFile->findNext(Tokens::$emptyTokens, ($label + 1), null, true); - - $this->assertSame( - ':', - $tokens[$colon]['content'], - 'Next token after parameter name is not a colon. Found: '.$tokens[$colon]['content'] - ); - $this->assertSame( - T_COLON, - $tokens[$colon]['code'], - 'Token tokenized as '.$tokens[$colon]['type'].', not T_COLON (code)' - ); - $this->assertSame( - 'T_COLON', - $tokens[$colon]['type'], - 'Token tokenized as '.$tokens[$colon]['type'].', not T_COLON (type)' - ); - }//end foreach - - }//end testNamedFunctionCallArguments() - - - /** - * Data provider. - * - * @see testNamedFunctionCallArguments() - * - * @return array>> - */ - public static function dataNamedFunctionCallArguments() - { - return [ - 'function call, single line, all named args' => [ - 'testMarker' => '/* testNamedArgs */', - 'parameters' => [ - 'start_index', - 'count', - 'value', - ], - ], - 'function call, multi-line, all named args' => [ - 'testMarker' => '/* testNamedArgsMultiline */', - 'parameters' => [ - 'start_index', - 'count', - 'value', - ], - ], - 'function call, single line, all named args; comments and whitespace' => [ - 'testMarker' => '/* testNamedArgsWithWhitespaceAndComments */', - 'parameters' => [ - 'start_index', - 'count', - 'value', - ], - ], - 'function call, single line, mixed positional and named args' => [ - 'testMarker' => '/* testMixedPositionalAndNamedArgs */', - 'parameters' => [ - 'double_encode', - ], - ], - 'function call containing nested function call values' => [ - 'testMarker' => '/* testNestedFunctionCallOuter */', - 'parameters' => [ - 'start_index', - 'count', - 'value', - ], - ], - 'function call nested in named arg [1]' => [ - 'testMarker' => '/* testNestedFunctionCallInner1 */', - 'parameters' => [ - 'skip', - ], - ], - 'function call nested in named arg [2]' => [ - 'testMarker' => '/* testNestedFunctionCallInner2 */', - 'parameters' => [ - 'array_or_countable', - ], - ], - 'namespace relative function call' => [ - 'testMarker' => '/* testNamespaceRelativeFunction */', - 'parameters' => [ - 'label', - 'more', - ], - ], - 'partially qualified function call' => [ - 'testMarker' => '/* testPartiallyQualifiedFunction */', - 'parameters' => [ - 'label', - 'more', - ], - ], - 'fully qualified function call' => [ - 'testMarker' => '/* testFullyQualifiedFunction */', - 'parameters' => [ - 'label', - 'more', - ], - ], - 'variable function call' => [ - 'testMarker' => '/* testVariableFunction */', - 'parameters' => [ - 'label', - 'more', - ], - ], - 'variable variable function call' => [ - 'testMarker' => '/* testVariableVariableFunction */', - 'parameters' => [ - 'label', - 'more', - ], - ], - 'method call' => [ - 'testMarker' => '/* testMethodCall */', - 'parameters' => [ - 'label', - 'more', - ], - ], - 'variable method call' => [ - 'testMarker' => '/* testVariableMethodCall */', - 'parameters' => [ - 'label', - 'more', - ], - ], - 'class instantiation' => [ - 'testMarker' => '/* testClassInstantiation */', - 'parameters' => [ - 'label', - 'more', - ], - ], - 'class instantiation with "self"' => [ - 'testMarker' => '/* testClassInstantiationSelf */', - 'parameters' => [ - 'label', - 'more', - ], - ], - 'class instantiation with "static"' => [ - 'testMarker' => '/* testClassInstantiationStatic */', - 'parameters' => [ - 'label', - 'more', - ], - ], - 'anonymous class instantiation' => [ - 'testMarker' => '/* testAnonClass */', - 'parameters' => [ - 'label', - 'more', - ], - ], - 'function call with non-ascii characters in the variable name labels' => [ - 'testMarker' => '/* testNonAsciiNames */', - 'parameters' => [ - '💩💩💩', - 'Пасха', - '_valid', - ], - ], - 'PHP 8.4+: named arg in exit()' => [ - 'testMarker' => '/* testPHP84Exit */', - 'parameters' => [ - 'status', - ], - ], - 'PHP 8.4+: named arg in die()' => [ - 'testMarker' => '/* testPHP84Die */', - 'parameters' => [ - 'status', - ], - ], - 'PHP 8.4+: named arg in fully qualified exit()' => [ - 'testMarker' => '/* testPHP84FullyQualifiedExit */', - 'parameters' => [ - 'status', - ], - ], - 'PHP 8.4+: named arg in fully qualified die()' => [ - 'testMarker' => '/* testPHP84FullyQualifiedDie */', - 'parameters' => [ - 'status', - ], - ], - - // Coding errors which should still be handled. - 'invalid: named arg before positional (compile error)' => [ - 'testMarker' => '/* testCompileErrorNamedBeforePositional */', - 'parameters' => [ - 'param', - ], - ], - 'invalid: duplicate parameter name [1]' => [ - 'testMarker' => '/* testDuplicateName1 */', - 'parameters' => [ - 'param', - ], - ], - 'invalid: duplicate parameter name [2]' => [ - 'testMarker' => '/* testDuplicateName2 */', - 'parameters' => [ - 'param', - ], - ], - 'invalid: named arg before variadic (error exception)' => [ - 'testMarker' => '/* testIncorrectOrderWithVariadic */', - 'parameters' => [ - 'start_index', - ], - ], - 'invalid: named arg after variadic (compile error)' => [ - 'testMarker' => '/* testCompileErrorIncorrectOrderWithVariadic */', - 'parameters' => [ - 'param', - ], - ], - 'invalid: named arg without value (parse error)' => [ - 'testMarker' => '/* testParseErrorNoValue */', - 'parameters' => [ - 'param1', - 'param2', - ], - ], - 'invalid: named arg in empty() (parse error)' => [ - 'testMarker' => '/* testParseErrorEmpty */', - 'parameters' => [ - 'variable', - ], - ], - 'invalid: named arg in eval() (parse error)' => [ - 'testMarker' => '/* testParseErrorEval */', - 'parameters' => [ - 'code', - ], - ], - 'invalid: named arg in arbitrary parentheses (parse error)' => [ - 'testMarker' => '/* testParseErrorArbitraryParentheses */', - 'parameters' => [ - 'something', - ], - ], - ]; - - }//end dataNamedFunctionCallArguments() - - - /** - * Verify that other T_STRING tokens within a function call are still tokenized as T_STRING. - * - * @param string $testMarker The comment prefacing the target token. - * @param string $content The token content to look for. - * - * @dataProvider dataOtherTstringInFunctionCall - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testOtherTstringInFunctionCall($testMarker, $content) - { - $tokens = $this->phpcsFile->getTokens(); - - $label = $this->getTargetToken($testMarker, [T_STRING, T_PARAM_NAME], $content); - - $this->assertSame( - T_STRING, - $tokens[$label]['code'], - 'Token tokenized as '.$tokens[$label]['type'].', not T_STRING (code)' - ); - $this->assertSame( - 'T_STRING', - $tokens[$label]['type'], - 'Token tokenized as '.$tokens[$label]['type'].', not T_STRING (type)' - ); - - }//end testOtherTstringInFunctionCall() - - - /** - * Data provider. - * - * @see testOtherTstringInFunctionCall() - * - * @return array> - */ - public static function dataOtherTstringInFunctionCall() - { - return [ - 'not arg name - global constant' => [ - 'testMarker' => '/* testPositionalArgs */', - 'content' => 'START_INDEX', - ], - 'not arg name - fully qualified constant' => [ - 'testMarker' => '/* testPositionalArgs */', - 'content' => 'COUNT', - ], - 'not arg name - namespace relative constant' => [ - 'testMarker' => '/* testPositionalArgs */', - 'content' => 'VALUE', - ], - 'not arg name - unqualified function call' => [ - 'testMarker' => '/* testNestedFunctionCallInner2 */', - 'content' => 'count', - ], - ]; - - }//end dataOtherTstringInFunctionCall() - - - /** - * Verify whether the colons are tokenized correctly when a ternary is used in a mixed - * positional and named arguments function call. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testMixedPositionalAndNamedArgsWithTernary() - { - $tokens = $this->phpcsFile->getTokens(); - - $true = $this->getTargetToken('/* testMixedPositionalAndNamedArgsWithTernary */', T_TRUE); - - // Get the next non-empty token. - $colon = $this->phpcsFile->findNext(Tokens::$emptyTokens, ($true + 1), null, true); - - $this->assertSame( - T_INLINE_ELSE, - $tokens[$colon]['code'], - 'Token tokenized as '.$tokens[$colon]['type'].', not T_INLINE_ELSE (code)' - ); - $this->assertSame( - 'T_INLINE_ELSE', - $tokens[$colon]['type'], - 'Token tokenized as '.$tokens[$colon]['type'].', not T_INLINE_ELSE (type)' - ); - - $label = $this->getTargetToken('/* testMixedPositionalAndNamedArgsWithTernary */', T_PARAM_NAME, 'name'); - - // Get the next non-empty token. - $colon = $this->phpcsFile->findNext(Tokens::$emptyTokens, ($label + 1), null, true); - - $this->assertSame( - ':', - $tokens[$colon]['content'], - 'Next token after parameter name is not a colon. Found: '.$tokens[$colon]['content'] - ); - $this->assertSame( - T_COLON, - $tokens[$colon]['code'], - 'Token tokenized as '.$tokens[$colon]['type'].', not T_COLON (code)' - ); - $this->assertSame( - 'T_COLON', - $tokens[$colon]['type'], - 'Token tokenized as '.$tokens[$colon]['type'].', not T_COLON (type)' - ); - - }//end testMixedPositionalAndNamedArgsWithTernary() - - - /** - * Verify whether the colons are tokenized correctly when a ternary is used - * in a named arguments function call. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testNamedArgWithTernary() - { - $tokens = $this->phpcsFile->getTokens(); - - /* - * First argument. - */ - - $label = $this->getTargetToken('/* testNamedArgWithTernary */', T_PARAM_NAME, 'label'); - - // Get the next non-empty token. - $colon = $this->phpcsFile->findNext(Tokens::$emptyTokens, ($label + 1), null, true); - - $this->assertSame( - ':', - $tokens[$colon]['content'], - 'First arg: Next token after parameter name is not a colon. Found: '.$tokens[$colon]['content'] - ); - $this->assertSame( - T_COLON, - $tokens[$colon]['code'], - 'First arg: Token tokenized as '.$tokens[$colon]['type'].', not T_COLON (code)' - ); - $this->assertSame( - 'T_COLON', - $tokens[$colon]['type'], - 'First arg: Token tokenized as '.$tokens[$colon]['type'].', not T_COLON (type)' - ); - - $true = $this->getTargetToken('/* testNamedArgWithTernary */', T_TRUE); - - // Get the next non-empty token. - $colon = $this->phpcsFile->findNext(Tokens::$emptyTokens, ($true + 1), null, true); - - $this->assertSame( - T_INLINE_ELSE, - $tokens[$colon]['code'], - 'First arg ternary: Token tokenized as '.$tokens[$colon]['type'].', not T_INLINE_ELSE (code)' - ); - $this->assertSame( - 'T_INLINE_ELSE', - $tokens[$colon]['type'], - 'First arg ternary: Token tokenized as '.$tokens[$colon]['type'].', not T_INLINE_ELSE (type)' - ); - - /* - * Second argument. - */ - - $label = $this->getTargetToken('/* testNamedArgWithTernary */', T_PARAM_NAME, 'more'); - - // Get the next non-empty token. - $colon = $this->phpcsFile->findNext(Tokens::$emptyTokens, ($label + 1), null, true); - - $this->assertSame( - ':', - $tokens[$colon]['content'], - 'Second arg: Next token after parameter name is not a colon. Found: '.$tokens[$colon]['content'] - ); - $this->assertSame( - T_COLON, - $tokens[$colon]['code'], - 'Second arg: Token tokenized as '.$tokens[$colon]['type'].', not T_COLON (code)' - ); - $this->assertSame( - 'T_COLON', - $tokens[$colon]['type'], - 'Second arg: Token tokenized as '.$tokens[$colon]['type'].', not T_COLON (type)' - ); - - $true = $this->getTargetToken('/* testNamedArgWithTernary */', T_STRING, 'CONSTANT_A'); - - // Get the next non-empty token. - $colon = $this->phpcsFile->findNext(Tokens::$emptyTokens, ($true + 1), null, true); - - $this->assertSame( - T_INLINE_ELSE, - $tokens[$colon]['code'], - 'Second arg ternary: Token tokenized as '.$tokens[$colon]['type'].', not T_INLINE_ELSE (code)' - ); - $this->assertSame( - 'T_INLINE_ELSE', - $tokens[$colon]['type'], - 'Second arg ternary: Token tokenized as '.$tokens[$colon]['type'].', not T_INLINE_ELSE (type)' - ); - - }//end testNamedArgWithTernary() - - - /** - * Verify whether the colons are tokenized correctly when named arguments - * function calls are used in a ternary. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testTernaryWithFunctionCallsInThenElse() - { - $tokens = $this->phpcsFile->getTokens(); - - /* - * Then. - */ - - $label = $this->getTargetToken('/* testTernaryWithFunctionCallsInThenElse */', T_PARAM_NAME, 'label'); - - // Get the next non-empty token. - $colon = $this->phpcsFile->findNext(Tokens::$emptyTokens, ($label + 1), null, true); - - $this->assertSame( - ':', - $tokens[$colon]['content'], - 'Function in then: Next token after parameter name is not a colon. Found: '.$tokens[$colon]['content'] - ); - $this->assertSame( - T_COLON, - $tokens[$colon]['code'], - 'Function in then: Token tokenized as '.$tokens[$colon]['type'].', not T_COLON (code)' - ); - $this->assertSame( - 'T_COLON', - $tokens[$colon]['type'], - 'Function in then: Token tokenized as '.$tokens[$colon]['type'].', not T_COLON (type)' - ); - - $closeParens = $this->getTargetToken('/* testTernaryWithFunctionCallsInThenElse */', T_CLOSE_PARENTHESIS); - - // Get the next non-empty token. - $colon = $this->phpcsFile->findNext(Tokens::$emptyTokens, ($closeParens + 1), null, true); - - $this->assertSame( - T_INLINE_ELSE, - $tokens[$colon]['code'], - 'Token tokenized as '.$tokens[$colon]['type'].', not T_INLINE_ELSE (code)' - ); - $this->assertSame( - 'T_INLINE_ELSE', - $tokens[$colon]['type'], - 'Token tokenized as '.$tokens[$colon]['type'].', not T_INLINE_ELSE (type)' - ); - - /* - * Else. - */ - - $label = $this->getTargetToken('/* testTernaryWithFunctionCallsInThenElse */', T_PARAM_NAME, 'more'); - - // Get the next non-empty token. - $colon = $this->phpcsFile->findNext(Tokens::$emptyTokens, ($label + 1), null, true); - - $this->assertSame( - ':', - $tokens[$colon]['content'], - 'Function in else: Next token after parameter name is not a colon. Found: '.$tokens[$colon]['content'] - ); - $this->assertSame( - T_COLON, - $tokens[$colon]['code'], - 'Function in else: Token tokenized as '.$tokens[$colon]['type'].', not T_COLON (code)' - ); - $this->assertSame( - 'T_COLON', - $tokens[$colon]['type'], - 'Function in else: Token tokenized as '.$tokens[$colon]['type'].', not T_COLON (type)' - ); - - }//end testTernaryWithFunctionCallsInThenElse() - - - /** - * Verify whether the colons are tokenized correctly when constants are used in a ternary. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testTernaryWithConstantsInThenElse() - { - $tokens = $this->phpcsFile->getTokens(); - - $constant = $this->getTargetToken('/* testTernaryWithConstantsInThenElse */', T_STRING, 'CONSTANT_NAME'); - - // Get the next non-empty token. - $colon = $this->phpcsFile->findNext(Tokens::$emptyTokens, ($constant + 1), null, true); - - $this->assertSame( - T_INLINE_ELSE, - $tokens[$colon]['code'], - 'Token tokenized as '.$tokens[$colon]['type'].', not T_INLINE_ELSE (code)' - ); - $this->assertSame( - 'T_INLINE_ELSE', - $tokens[$colon]['type'], - 'Token tokenized as '.$tokens[$colon]['type'].', not T_INLINE_ELSE (type)' - ); - - }//end testTernaryWithConstantsInThenElse() - - - /** - * Verify whether the colons are tokenized correctly in a switch statement. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testSwitchStatement() - { - $tokens = $this->phpcsFile->getTokens(); - - $label = $this->getTargetToken('/* testSwitchCaseWithConstant */', T_STRING, 'MY_CONSTANT'); - - // Get the next non-empty token. - $colon = $this->phpcsFile->findNext(Tokens::$emptyTokens, ($label + 1), null, true); - - $this->assertSame( - T_COLON, - $tokens[$colon]['code'], - 'First case: Token tokenized as '.$tokens[$colon]['type'].', not T_COLON (code)' - ); - $this->assertSame( - 'T_COLON', - $tokens[$colon]['type'], - 'First case: Token tokenized as '.$tokens[$colon]['type'].', not T_COLON (type)' - ); - - $label = $this->getTargetToken('/* testSwitchCaseWithClassProperty */', T_STRING, 'property'); - - // Get the next non-empty token. - $colon = $this->phpcsFile->findNext(Tokens::$emptyTokens, ($label + 1), null, true); - - $this->assertSame( - T_COLON, - $tokens[$colon]['code'], - 'Second case: Token tokenized as '.$tokens[$colon]['type'].', not T_COLON (code)' - ); - $this->assertSame( - 'T_COLON', - $tokens[$colon]['type'], - 'Second case: Token tokenized as '.$tokens[$colon]['type'].', not T_COLON (type)' - ); - - $default = $this->getTargetToken('/* testSwitchDefault */', T_DEFAULT); - - // Get the next non-empty token. - $colon = $this->phpcsFile->findNext(Tokens::$emptyTokens, ($default + 1), null, true); - - $this->assertSame( - T_COLON, - $tokens[$colon]['code'], - 'Default case: Token tokenized as '.$tokens[$colon]['type'].', not T_COLON (code)' - ); - $this->assertSame( - 'T_COLON', - $tokens[$colon]['type'], - 'Default case: Token tokenized as '.$tokens[$colon]['type'].', not T_COLON (type)' - ); - - }//end testSwitchStatement() - - - /** - * Verify that a variable parameter label (parse error) is still tokenized as T_VARIABLE. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testParseErrorVariableLabel() - { - $tokens = $this->phpcsFile->getTokens(); - - $label = $this->getTargetToken('/* testParseErrorDynamicName */', [T_VARIABLE, T_PARAM_NAME], '$variableStoringParamName'); - - $this->assertSame( - T_VARIABLE, - $tokens[$label]['code'], - 'Token tokenized as '.$tokens[$label]['type'].', not T_VARIABLE (code)' - ); - $this->assertSame( - 'T_VARIABLE', - $tokens[$label]['type'], - 'Token tokenized as '.$tokens[$label]['type'].', not T_VARIABLE (type)' - ); - - // Get the next non-empty token. - $colon = $this->phpcsFile->findNext(Tokens::$emptyTokens, ($label + 1), null, true); - - $this->assertSame( - ':', - $tokens[$colon]['content'], - 'Next token after parameter name is not a colon. Found: '.$tokens[$colon]['content'] - ); - $this->assertSame( - T_COLON, - $tokens[$colon]['code'], - 'Token tokenized as '.$tokens[$colon]['type'].', not T_COLON (code)' - ); - $this->assertSame( - 'T_COLON', - $tokens[$colon]['type'], - 'Token tokenized as '.$tokens[$colon]['type'].', not T_COLON (type)' - ); - - }//end testParseErrorVariableLabel() - - - /** - * Verify whether the colons are tokenized correctly when a return type is used for an inline - * closure/arrow function declaration in a ternary. - * - * @param string $testMarker The comment prefacing the target token. - * - * @dataProvider dataOtherColonsInTernary - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testOtherColonsInTernary($testMarker) - { - $tokens = $this->phpcsFile->getTokens(); - - $startOfStatement = $this->getTargetToken($testMarker, T_VARIABLE); - - // Walk the statement and check the tokenization. - // There should be no T_PARAM_NAME tokens. - // First colon should be T_COLON for the return type. - // Second colon should be T_INLINE_ELSE for the ternary. - // Third colon should be T_COLON for the return type. - $colonCount = 0; - for ($i = ($startOfStatement + 1); $tokens[$i]['line'] === $tokens[$startOfStatement]['line']; $i++) { - $this->assertNotSame(T_PARAM_NAME, $tokens[$i]['code'], "Token $i is tokenized as parameter label"); - - if ($tokens[$i]['content'] === ':') { - ++$colonCount; - - if ($colonCount === 1) { - $this->assertSame(T_COLON, $tokens[$i]['code'], 'First colon is not tokenized as T_COLON'); - } else if ($colonCount === 2) { - $this->assertSame(T_INLINE_ELSE, $tokens[$i]['code'], 'Second colon is not tokenized as T_INLINE_ELSE'); - } else if ($colonCount === 3) { - $this->assertSame(T_COLON, $tokens[$i]['code'], 'Third colon is not tokenized as T_COLON'); - } else { - $this->fail('Unexpected colon encountered in statement'); - } - } - } - - }//end testOtherColonsInTernary() - - - /** - * Data provider. - * - * @see testOtherColonsInTernary() - * - * @return array> - */ - public static function dataOtherColonsInTernary() - { - return [ - 'closures with return types in ternary' => [ - 'testMarker' => '/* testTernaryWithClosuresAndReturnTypes */', - ], - 'arrow functions with return types in ternary' => [ - 'testMarker' => '/* testTernaryWithArrowFunctionsAndReturnTypes */', - ], - ]; - - }//end dataOtherColonsInTernary() - - - /** - * Verify that reserved keywords used as a parameter label are tokenized as T_PARAM_NAME - * and that the colon after it is tokenized as a T_COLON. - * - * @param string $testMarker The comment prefacing the target token. - * @param array $tokenTypes The token codes to look for. - * @param string $tokenContent The token content to look for. - * - * @dataProvider dataReservedKeywordsAsName - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testReservedKeywordsAsName($testMarker, $tokenTypes, $tokenContent) - { - $tokens = $this->phpcsFile->getTokens(); - $label = $this->getTargetToken($testMarker, $tokenTypes, $tokenContent); - - $this->assertSame( - T_PARAM_NAME, - $tokens[$label]['code'], - 'Token tokenized as '.$tokens[$label]['type'].', not T_PARAM_NAME (code)' - ); - $this->assertSame( - 'T_PARAM_NAME', - $tokens[$label]['type'], - 'Token tokenized as '.$tokens[$label]['type'].', not T_PARAM_NAME (type)' - ); - - // Get the next non-empty token. - $colon = $this->phpcsFile->findNext(Tokens::$emptyTokens, ($label + 1), null, true); - - $this->assertSame( - ':', - $tokens[$colon]['content'], - 'Next token after parameter name is not a colon. Found: '.$tokens[$colon]['content'] - ); - $this->assertSame( - T_COLON, - $tokens[$colon]['code'], - 'Token tokenized as '.$tokens[$colon]['type'].', not T_COLON (code)' - ); - $this->assertSame( - 'T_COLON', - $tokens[$colon]['type'], - 'Token tokenized as '.$tokens[$colon]['type'].', not T_COLON (type)' - ); - - }//end testReservedKeywordsAsName() - - - /** - * Data provider. - * - * @see testReservedKeywordsAsName() - * - * @return array>> - */ - public static function dataReservedKeywordsAsName() - { - $reservedKeywords = [ - // '__halt_compiler', NOT TESTABLE - 'abstract', - 'and', - 'array', - 'as', - 'break', - 'callable', - 'case', - 'catch', - 'class', - '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', - 'new', - 'or', - 'print', - 'private', - 'protected', - 'public', - 'readonly', - 'require', - 'require_once', - 'return', - 'static', - 'switch', - 'throw', - 'trait', - 'try', - 'unset', - 'use', - 'var', - 'while', - 'xor', - 'yield', - 'int', - 'float', - 'bool', - 'string', - 'true', - 'false', - 'null', - 'void', - 'iterable', - 'object', - 'resource', - 'mixed', - 'numeric', - 'never', - - // Not reserved keyword, but do have their own token in PHPCS. - 'parent', - 'self', - ]; - - $data = []; - - foreach ($reservedKeywords as $keyword) { - $tokensTypes = [ - T_PARAM_NAME, - T_STRING, - T_GOTO_LABEL, - ]; - $tokenName = 'T_'.strtoupper($keyword); - - if ($keyword === 'and') { - $tokensTypes[] = T_LOGICAL_AND; - } else if ($keyword === 'die') { - $tokensTypes[] = T_EXIT; - } else if ($keyword === 'or') { - $tokensTypes[] = T_LOGICAL_OR; - } else if ($keyword === 'xor') { - $tokensTypes[] = T_LOGICAL_XOR; - } else if ($keyword === '__halt_compiler') { - $tokensTypes[] = T_HALT_COMPILER; - } else if (defined($tokenName) === true) { - $tokensTypes[] = constant($tokenName); - } - - $data[$keyword.'FirstParam'] = [ - '/* testReservedKeyword'.ucfirst($keyword).'1 */', - $tokensTypes, - $keyword, - ]; - - $data[$keyword.'SecondParam'] = [ - '/* testReservedKeyword'.ucfirst($keyword).'2 */', - $tokensTypes, - $keyword, - ]; - }//end foreach - - return $data; - - }//end dataReservedKeywordsAsName() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/NullableVsInlineThenParseErrorTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/NullableVsInlineThenParseErrorTest.inc deleted file mode 100644 index fda129b..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/NullableVsInlineThenParseErrorTest.inc +++ /dev/null @@ -1,9 +0,0 @@ -phpcsFile->getTokens(); - $target = $this->getTargetToken('/* testLiveCoding */', [T_NULLABLE, T_INLINE_THEN]); - $tokenArray = $tokens[$target]; - - $this->assertSame(T_INLINE_THEN, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_INLINE_THEN (code)'); - $this->assertSame('T_INLINE_THEN', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_INLINE_THEN (type)'); - - }//end testInlineThenAtEndOfFile() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/NullableVsInlineThenTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/NullableVsInlineThenTest.inc deleted file mode 100644 index ac3c9f8..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/NullableVsInlineThenTest.inc +++ /dev/null @@ -1,79 +0,0 @@ -phpcsFile->getTokens(); - $target = $this->getTargetToken($testMarker, [T_NULLABLE, T_INLINE_THEN]); - $tokenArray = $tokens[$target]; - - $this->assertSame(T_NULLABLE, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_NULLABLE (code)'); - $this->assertSame('T_NULLABLE', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_NULLABLE (type)'); - - }//end testNullable() - - - /** - * Data provider. - * - * @see testNullable() - * - * @return array> - */ - public static function dataNullable() - { - return [ - 'property declaration, readonly, no visibility' => ['/* testNullableReadonlyOnly */'], - 'property declaration, private set' => ['/* testNullablePrivateSet */'], - 'property declaration, public and protected set' => ['/* testNullablePublicProtectedSet */'], - 'property declaration, final, no visibility' => ['/* testNullableFinalOnly */'], - 'property declaration, abstract, no visibility' => ['/* testNullableAbstractOnly */'], - - 'closure param type, nullable int' => ['/* testClosureParamTypeNullableInt */'], - 'closure param type, nullable callable' => ['/* testClosureParamTypeNullableCallable */'], - 'closure param type, nullable string with comment, issue #1216' => ['/* testClosureParamTypeNullableStringWithAttributeAndSlashComment */'], - 'closure return type, nullable int' => ['/* testClosureReturnTypeNullableInt */'], - 'function return type, nullable callable' => ['/* testFunctionReturnTypeNullableCallable */'], - ]; - - }//end dataNullable() - - - /** - * Test that a "?" when used as part of a ternary expression is tokenized as `T_INLINE_THEN`. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * - * @dataProvider dataInlineThen - * - * @return void - */ - public function testInlineThen($testMarker) - { - $tokens = $this->phpcsFile->getTokens(); - $target = $this->getTargetToken($testMarker, [T_NULLABLE, T_INLINE_THEN]); - $tokenArray = $tokens[$target]; - - $this->assertSame(T_INLINE_THEN, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_INLINE_THEN (code)'); - $this->assertSame('T_INLINE_THEN', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_INLINE_THEN (type)'); - - }//end testInlineThen() - - - /** - * Data provider. - * - * @see testInlineThen() - * - * @return array> - */ - public static function dataInlineThen() - { - return [ - 'ternary in property default value' => ['/* testInlineThenInPropertyDefaultValue */'], - - 'ternary ? followed by array declaration' => ['/* testInlineThenWithArrayDeclaration */'], - - 'ternary ? followed by unqualified constant' => ['/* testInlineThenWithUnqualifiedNameAndNothingElse */'], - 'ternary ? followed by unqualified function call' => ['/* testInlineThenWithUnqualifiedNameAndParens */'], - 'ternary ? followed by unqualified static method call' => ['/* testInlineThenWithUnqualifiedNameAndDoubleColon */'], - - 'ternary ? followed by fully qualified constant' => ['/* testInlineThenWithFullyQualifiedNameAndNothingElse */'], - 'ternary ? followed by fully qualified function call' => ['/* testInlineThenWithFullyQualifiedNameAndParens */'], - 'ternary ? followed by fully qualified static method call' => ['/* testInlineThenWithFullyQualifiedNameAndDoubleColon */'], - - 'ternary ? followed by partially qualified constant' => ['/* testInlineThenWithPartiallyQualifiedNameAndNothingElse */'], - 'ternary ? followed by partially qualified function call' => ['/* testInlineThenWithPartiallyQualifiedNameAndParens */'], - 'ternary ? followed by partially qualified static method call' => ['/* testInlineThenWithPartiallyQualifiedNameAndDoubleColon */'], - - 'ternary ? followed by namespace relative constant' => ['/* testInlineThenWithNamespaceRelativeNameAndNothingElse */'], - 'ternary ? followed by namespace relative function call' => ['/* testInlineThenWithNamespaceRelativeNameAndParens */'], - 'ternary ? followed by namespace relative static method call' => ['/* testInlineThenWithNamespaceRelativeNameAndDoubleColon */'], - ]; - - }//end dataInlineThen() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/NullsafeObjectOperatorTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/NullsafeObjectOperatorTest.inc deleted file mode 100644 index 982841e..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/NullsafeObjectOperatorTest.inc +++ /dev/null @@ -1,29 +0,0 @@ -foo; - -/* testNullsafeObjectOperator */ -echo $obj?->foo; - -/* testNullsafeObjectOperatorWriteContext */ -// Intentional parse error, but not the concern of the tokenizer. -$foo?->bar->baz = 'baz'; - -/* testTernaryThen */ -echo $obj ? $obj->prop : $other->prop; - -/* testParseErrorWhitespaceNotAllowed */ -echo $obj ? - -> foo; - -/* testParseErrorCommentNotAllowed */ -echo $obj ?/*comment*/-> foo; - -/* testLiveCoding */ -// Intentional parse error. This has to be the last test in the file. -echo $obj? diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/NullsafeObjectOperatorTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/NullsafeObjectOperatorTest.php deleted file mode 100644 index 6d6d206..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/NullsafeObjectOperatorTest.php +++ /dev/null @@ -1,144 +0,0 @@ -= 8.0 nullsafe object operator. - * - * @author Juliette Reinders Folmer - * @copyright 2020 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\PHP; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; -use PHP_CodeSniffer\Util\Tokens; - -final class NullsafeObjectOperatorTest extends AbstractTokenizerTestCase -{ - - /** - * Tokens to search for. - * - * @var array - */ - protected $find = [ - T_NULLSAFE_OBJECT_OPERATOR, - T_OBJECT_OPERATOR, - T_INLINE_THEN, - ]; - - - /** - * Test that a normal object operator is still tokenized as such. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testObjectOperator() - { - $tokens = $this->phpcsFile->getTokens(); - - $operator = $this->getTargetToken('/* testObjectOperator */', $this->find); - $this->assertSame(T_OBJECT_OPERATOR, $tokens[$operator]['code'], 'Failed asserting code is object operator'); - $this->assertSame('T_OBJECT_OPERATOR', $tokens[$operator]['type'], 'Failed asserting type is object operator'); - - }//end testObjectOperator() - - - /** - * Test that a nullsafe object operator is tokenized as such. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * - * @dataProvider dataNullsafeObjectOperator - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testNullsafeObjectOperator($testMarker) - { - $tokens = $this->phpcsFile->getTokens(); - - $operator = $this->getTargetToken($testMarker, $this->find); - $this->assertSame(T_NULLSAFE_OBJECT_OPERATOR, $tokens[$operator]['code'], 'Failed asserting code is nullsafe object operator'); - $this->assertSame('T_NULLSAFE_OBJECT_OPERATOR', $tokens[$operator]['type'], 'Failed asserting type is nullsafe object operator'); - - }//end testNullsafeObjectOperator() - - - /** - * Data provider. - * - * @see testNullsafeObjectOperator() - * - * @return array> - */ - public static function dataNullsafeObjectOperator() - { - return [ - 'nullsafe operator' => ['/* testNullsafeObjectOperator */'], - 'illegal nullsafe operator (write context)' => ['/* testNullsafeObjectOperatorWriteContext */'], - ]; - - }//end dataNullsafeObjectOperator() - - - /** - * Test that a question mark not followed by an object operator is tokenized as T_TERNARY_THEN. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * @param bool $testObjectOperator Whether to test for the next non-empty token being tokenized - * as an object operator. - * - * @dataProvider dataTernaryThen - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testTernaryThen($testMarker, $testObjectOperator=false) - { - $tokens = $this->phpcsFile->getTokens(); - - $operator = $this->getTargetToken($testMarker, $this->find); - $this->assertSame(T_INLINE_THEN, $tokens[$operator]['code'], 'Failed asserting code is inline then'); - $this->assertSame('T_INLINE_THEN', $tokens[$operator]['type'], 'Failed asserting type is inline then'); - - if ($testObjectOperator === true) { - $next = $this->phpcsFile->findNext(Tokens::$emptyTokens, ($operator + 1), null, true); - $this->assertSame(T_OBJECT_OPERATOR, $tokens[$next]['code'], 'Failed asserting code is object operator'); - $this->assertSame('T_OBJECT_OPERATOR', $tokens[$next]['type'], 'Failed asserting type is object operator'); - } - - }//end testTernaryThen() - - - /** - * Data provider. - * - * @see testTernaryThen() - * - * @return array> - */ - public static function dataTernaryThen() - { - return [ - 'ternary then' => [ - 'testMarker' => '/* testTernaryThen */', - ], - 'whitespace between question mark and object operator' => [ - 'testMarker' => '/* testParseErrorWhitespaceNotAllowed */', - 'testObjectOperator' => true, - ], - 'comment between question mark and object operator' => [ - 'testMarker' => '/* testParseErrorCommentNotAllowed */', - 'testObjectOperator' => true, - ], - 'parse error/live coding' => [ - 'testMarker' => '/* testLiveCoding */', - ], - ]; - - }//end dataTernaryThen() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/OtherContextSensitiveKeywordsTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/OtherContextSensitiveKeywordsTest.inc deleted file mode 100644 index 6d50da3..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/OtherContextSensitiveKeywordsTest.inc +++ /dev/null @@ -1,261 +0,0 @@ - $param->get(); - } -} - -/* testFalseIsKeywordUppercase */ -if ($a === FALSE) { -/* testTrueIsKeywordMixedCase */ -} elseif ( $b === True) { -/* testNullIsKeywordUppercase */ -} elseif ($c === NULL) {} - -/* testFullyQualifiedFalseIsKeyword */ -$a = \false; -/* testFullyQualifiedTrueIsKeyword */ -$b = \true; -/* testFullyQualifiedNullIsKeyword */ -$c = \null; diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/OtherContextSensitiveKeywordsTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/OtherContextSensitiveKeywordsTest.php deleted file mode 100644 index 8f230db..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/OtherContextSensitiveKeywordsTest.php +++ /dev/null @@ -1,745 +0,0 @@ - - * @copyright 2020 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\PHP; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; - -/** - * Tests the conversion of PHPCS native context sensitive keyword tokens to T_STRING. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * @covers PHP_CodeSniffer\Tokenizers\PHP::standardiseToken - */ -final class OtherContextSensitiveKeywordsTest extends AbstractTokenizerTestCase -{ - - - /** - * Clear the "resolved tokens" cache before running this test as otherwise the code - * under test may not be run during the test. - * - * @beforeClass - * - * @return void - */ - public static function clearTokenCache() - { - parent::clearResolvedTokensCache(); - - }//end clearTokenCache() - - - /** - * Test that context sensitive keyword is tokenized as string when it should be string. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * - * @dataProvider dataStrings - * - * @return void - */ - public function testStrings($testMarker) - { - $tokens = $this->phpcsFile->getTokens(); - $target = $this->getTargetToken($testMarker, [T_STRING, T_NULL, T_FALSE, T_TRUE, T_PARENT, T_SELF]); - $tokenArray = $tokens[$target]; - - $this->assertSame(T_STRING, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_STRING (code)'); - $this->assertSame('T_STRING', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_STRING (type)'); - - }//end testStrings() - - - /** - * Data provider. - * - * @see testStrings() - * - * @return array> - */ - public static function dataStrings() - { - return [ - 'constant declaration: parent' => ['/* testKeywordParentAsConstantNameShouldBeString */'], - 'constant declaration: self' => ['/* testKeywordSelfAsConstantNameShouldBeString */'], - 'constant declaration: false' => ['/* testKeywordFalseAsConstantNameShouldBeString */'], - 'constant declaration: true' => ['/* testKeywordTrueAsConstantNameShouldBeString */'], - 'constant declaration: null' => ['/* testKeywordNullAsConstantNameShouldBeString */'], - - 'function declaration with return by ref: self' => ['/* testKeywordSelfAfterFunctionByRefShouldBeString */'], - 'function declaration with return by ref: parent' => ['/* testKeywordParentAfterFunctionByRefShouldBeString */'], - 'function declaration with return by ref: false' => ['/* testKeywordFalseAfterFunctionByRefShouldBeString */'], - 'function declaration with return by ref: true' => ['/* testKeywordTrueAfterFunctionByRefShouldBeString */'], - 'function declaration with return by ref: null' => ['/* testKeywordNullAfterFunctionByRefShouldBeString */'], - - 'function call: self' => ['/* testKeywordAsFunctionCallNameShouldBeStringSelf */'], - 'function call: parent' => ['/* testKeywordAsFunctionCallNameShouldBeStringParent */'], - 'function call: false' => ['/* testKeywordAsFunctionCallNameShouldBeStringFalse */'], - 'function call: true' => ['/* testKeywordAsFunctionCallNameShouldBeStringTrue */'], - 'function call: null; with comment between keyword and parentheses' => ['/* testKeywordAsFunctionCallNameShouldBeStringNull */'], - - 'class instantiation: false' => ['/* testClassInstantiationFalseIsString */'], - 'class instantiation: true' => ['/* testClassInstantiationTrueIsString */'], - 'class instantiation: null' => ['/* testClassInstantiationNullIsString */'], - - 'constant declaration: false as name after type' => ['/* testFalseIsNameForTypedConstant */'], - 'constant declaration: true as name after type' => ['/* testTrueIsNameForTypedConstant */'], - 'constant declaration: null as name after type' => ['/* testNullIsNameForTypedConstant */'], - 'constant declaration: self as name after type' => ['/* testSelfIsNameForTypedConstant */'], - 'constant declaration: parent as name after type' => ['/* testParentIsNameForTypedConstant */'], - ]; - - }//end dataStrings() - - - /** - * Test that context sensitive keyword is tokenized as keyword when it should be keyword. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * @param string $expectedTokenType The expected token type. - * - * @dataProvider dataKeywords - * - * @return void - */ - public function testKeywords($testMarker, $expectedTokenType) - { - $tokens = $this->phpcsFile->getTokens(); - $target = $this->getTargetToken($testMarker, [T_STRING, T_NULL, T_FALSE, T_TRUE, T_PARENT, T_SELF]); - $tokenArray = $tokens[$target]; - - $this->assertSame( - constant($expectedTokenType), - $tokenArray['code'], - 'Token tokenized as '.$tokenArray['type'].', not '.$expectedTokenType.' (code)' - ); - $this->assertSame( - $expectedTokenType, - $tokenArray['type'], - 'Token tokenized as '.$tokenArray['type'].', not '.$expectedTokenType.' (type)' - ); - - }//end testKeywords() - - - /** - * Data provider. - * - * @see testKeywords() - * - * @return array> - */ - public static function dataKeywords() - { - return [ - 'self: param type declaration' => [ - 'testMarker' => '/* testSelfIsKeyword */', - 'expectedTokenType' => 'T_SELF', - ], - 'parent: param type declaration' => [ - 'testMarker' => '/* testParentIsKeyword */', - 'expectedTokenType' => 'T_PARENT', - ], - - 'parent: class instantiation' => [ - 'testMarker' => '/* testClassInstantiationParentIsKeyword */', - 'expectedTokenType' => 'T_PARENT', - ], - 'self: class instantiation' => [ - 'testMarker' => '/* testClassInstantiationSelfIsKeyword */', - 'expectedTokenType' => 'T_SELF', - ], - - 'false: param type declaration' => [ - 'testMarker' => '/* testFalseIsKeywordAsParamType */', - 'expectedTokenType' => 'T_FALSE', - ], - 'true: param type declaration' => [ - 'testMarker' => '/* testTrueIsKeywordAsParamType */', - 'expectedTokenType' => 'T_TRUE', - ], - 'null: param type declaration' => [ - 'testMarker' => '/* testNullIsKeywordAsParamType */', - 'expectedTokenType' => 'T_NULL', - ], - 'false: return type declaration in union' => [ - 'testMarker' => '/* testFalseIsKeywordAsReturnType */', - 'expectedTokenType' => 'T_FALSE', - ], - 'true: return type declaration in union' => [ - 'testMarker' => '/* testTrueIsKeywordAsReturnType */', - 'expectedTokenType' => 'T_TRUE', - ], - 'null: return type declaration in union' => [ - 'testMarker' => '/* testNullIsKeywordAsReturnType */', - 'expectedTokenType' => 'T_NULL', - ], - 'false: in comparison' => [ - 'testMarker' => '/* testFalseIsKeywordInComparison */', - 'expectedTokenType' => 'T_FALSE', - ], - 'true: in comparison' => [ - 'testMarker' => '/* testTrueIsKeywordInComparison */', - 'expectedTokenType' => 'T_TRUE', - ], - 'null: in comparison' => [ - 'testMarker' => '/* testNullIsKeywordInComparison */', - 'expectedTokenType' => 'T_NULL', - ], - - 'false: type in OO constant declaration' => [ - 'testMarker' => '/* testFalseIsKeywordAsConstType */', - 'expectedTokenType' => 'T_FALSE', - ], - 'true: type in OO constant declaration' => [ - 'testMarker' => '/* testTrueIsKeywordAsConstType */', - 'expectedTokenType' => 'T_TRUE', - ], - 'null: type in OO constant declaration' => [ - 'testMarker' => '/* testNullIsKeywordAsConstType */', - 'expectedTokenType' => 'T_NULL', - ], - 'self: type in OO constant declaration' => [ - 'testMarker' => '/* testSelfIsKeywordAsConstType */', - 'expectedTokenType' => 'T_SELF', - ], - 'parent: type in OO constant declaration' => [ - 'testMarker' => '/* testParentIsKeywordAsConstType */', - 'expectedTokenType' => 'T_PARENT', - ], - - 'false: value in constant declaration' => [ - 'testMarker' => '/* testFalseIsKeywordAsConstDefault */', - 'expectedTokenType' => 'T_FALSE', - ], - 'true: value in constant declaration' => [ - 'testMarker' => '/* testTrueIsKeywordAsConstDefault */', - 'expectedTokenType' => 'T_TRUE', - ], - 'null: value in constant declaration' => [ - 'testMarker' => '/* testNullIsKeywordAsConstDefault */', - 'expectedTokenType' => 'T_NULL', - ], - 'self: value in constant declaration' => [ - 'testMarker' => '/* testSelfIsKeywordAsConstDefault */', - 'expectedTokenType' => 'T_SELF', - ], - 'parent: value in constant declaration' => [ - 'testMarker' => '/* testParentIsKeywordAsConstDefault */', - 'expectedTokenType' => 'T_PARENT', - ], - - 'false: type in property declaration' => [ - 'testMarker' => '/* testFalseIsKeywordAsPropertyType */', - 'expectedTokenType' => 'T_FALSE', - ], - 'true: type in property declaration' => [ - 'testMarker' => '/* testTrueIsKeywordAsPropertyType */', - 'expectedTokenType' => 'T_TRUE', - ], - 'null: type in property declaration' => [ - 'testMarker' => '/* testNullIsKeywordAsPropertyType */', - 'expectedTokenType' => 'T_NULL', - ], - 'self: type in property declaration' => [ - 'testMarker' => '/* testSelfIsKeywordAsPropertyType */', - 'expectedTokenType' => 'T_SELF', - ], - 'parent: type in property declaration' => [ - 'testMarker' => '/* testParentIsKeywordAsPropertyType */', - 'expectedTokenType' => 'T_PARENT', - ], - - 'false: value in property declaration' => [ - 'testMarker' => '/* testFalseIsKeywordAsPropertyDefault */', - 'expectedTokenType' => 'T_FALSE', - ], - 'true: value in property declaration' => [ - 'testMarker' => '/* testTrueIsKeywordAsPropertyDefault */', - 'expectedTokenType' => 'T_TRUE', - ], - 'null: value in property declaration' => [ - 'testMarker' => '/* testNullIsKeywordAsPropertyDefault */', - 'expectedTokenType' => 'T_NULL', - ], - 'self: value in property declaration' => [ - 'testMarker' => '/* testSelfIsKeywordAsPropertyDefault */', - 'expectedTokenType' => 'T_SELF', - ], - 'parent: value in property declaration' => [ - 'testMarker' => '/* testParentIsKeywordAsPropertyDefault */', - 'expectedTokenType' => 'T_PARENT', - ], - - 'false: first in union type for OO constant declaration' => [ - 'testMarker' => '/* testFalseIsKeywordAsConstUnionTypeFirst */', - 'expectedTokenType' => 'T_FALSE', - ], - 'true: first in union type for OO constant declaration' => [ - 'testMarker' => '/* testTrueIsKeywordAsConstUnionTypeFirst */', - 'expectedTokenType' => 'T_TRUE', - ], - 'null: first in union type for OO constant declaration' => [ - 'testMarker' => '/* testNullIsKeywordAsConstUnionTypeFirst */', - 'expectedTokenType' => 'T_NULL', - ], - 'self: first in union type for OO constant declaration' => [ - 'testMarker' => '/* testSelfIsKeywordAsConstUnionTypeFirst */', - 'expectedTokenType' => 'T_SELF', - ], - 'parent: first in union type for OO constant declaration' => [ - 'testMarker' => '/* testParentIsKeywordAsConstUnionTypeFirst */', - 'expectedTokenType' => 'T_PARENT', - ], - - 'false: middle in union type for OO constant declaration' => [ - 'testMarker' => '/* testFalseIsKeywordAsConstUnionTypeMiddle */', - 'expectedTokenType' => 'T_FALSE', - ], - 'true: middle in union type for OO constant declaration' => [ - 'testMarker' => '/* testTrueIsKeywordAsConstUnionTypeMiddle */', - 'expectedTokenType' => 'T_TRUE', - ], - 'null: middle in union type for OO constant declaration' => [ - 'testMarker' => '/* testNullIsKeywordAsConstUnionTypeMiddle */', - 'expectedTokenType' => 'T_NULL', - ], - 'self: middle in union type for OO constant declaration' => [ - 'testMarker' => '/* testSelfIsKeywordAsConstUnionTypeMiddle */', - 'expectedTokenType' => 'T_SELF', - ], - 'parent: middle in union type for OO constant declaration' => [ - 'testMarker' => '/* testParentIsKeywordAsConstUnionTypeMiddle */', - 'expectedTokenType' => 'T_PARENT', - ], - - 'false: last in union type for OO constant declaration' => [ - 'testMarker' => '/* testFalseIsKeywordAsConstUnionTypeLast */', - 'expectedTokenType' => 'T_FALSE', - ], - 'true: last in union type for OO constant declaration' => [ - 'testMarker' => '/* testTrueIsKeywordAsConstUnionTypeLast */', - 'expectedTokenType' => 'T_TRUE', - ], - 'null: last in union type for OO constant declaration' => [ - 'testMarker' => '/* testNullIsKeywordAsConstUnionTypeLast */', - 'expectedTokenType' => 'T_NULL', - ], - 'self: last in union type for OO constant declaration' => [ - 'testMarker' => '/* testSelfIsKeywordAsConstUnionTypeLast */', - 'expectedTokenType' => 'T_SELF', - ], - 'parent: last in union type for OO constant declaration' => [ - 'testMarker' => '/* testParentIsKeywordAsConstUnionTypeLast */', - 'expectedTokenType' => 'T_PARENT', - ], - - 'false: first in union type for property declaration' => [ - 'testMarker' => '/* testFalseIsKeywordAsPropertyUnionTypeFirst */', - 'expectedTokenType' => 'T_FALSE', - ], - 'true: first in union type for property declaration' => [ - 'testMarker' => '/* testTrueIsKeywordAsPropertyUnionTypeFirst */', - 'expectedTokenType' => 'T_TRUE', - ], - 'null: first in union type for property declaration' => [ - 'testMarker' => '/* testNullIsKeywordAsPropertyUnionTypeFirst */', - 'expectedTokenType' => 'T_NULL', - ], - 'self: first in union type for property declaration' => [ - 'testMarker' => '/* testSelfIsKeywordAsPropertyUnionTypeFirst */', - 'expectedTokenType' => 'T_SELF', - ], - 'parent: first in union type for property declaration' => [ - 'testMarker' => '/* testParentIsKeywordAsPropertyUnionTypeFirst */', - 'expectedTokenType' => 'T_PARENT', - ], - - 'false: middle in union type for property declaration' => [ - 'testMarker' => '/* testFalseIsKeywordAsPropertyUnionTypeMiddle */', - 'expectedTokenType' => 'T_FALSE', - ], - 'true: middle in union type for property declaration' => [ - 'testMarker' => '/* testTrueIsKeywordAsPropertyUnionTypeMiddle */', - 'expectedTokenType' => 'T_TRUE', - ], - 'null: middle in union type for property declaration' => [ - 'testMarker' => '/* testNullIsKeywordAsPropertyUnionTypeMiddle */', - 'expectedTokenType' => 'T_NULL', - ], - 'self: middle in union type for property declaration' => [ - 'testMarker' => '/* testSelfIsKeywordAsPropertyUnionTypeMiddle */', - 'expectedTokenType' => 'T_SELF', - ], - 'parent: middle in union type for property declaration' => [ - 'testMarker' => '/* testParentIsKeywordAsPropertyUnionTypeMiddle */', - 'expectedTokenType' => 'T_PARENT', - ], - - 'false: last in union type for property declaration' => [ - 'testMarker' => '/* testFalseIsKeywordAsPropertyUnionTypeLast */', - 'expectedTokenType' => 'T_FALSE', - ], - 'true: last in union type for property declaration' => [ - 'testMarker' => '/* testTrueIsKeywordAsPropertyUnionTypeLast */', - 'expectedTokenType' => 'T_TRUE', - ], - 'null: last in union type for property declaration' => [ - 'testMarker' => '/* testNullIsKeywordAsPropertyUnionTypeLast */', - 'expectedTokenType' => 'T_NULL', - ], - 'self: last in union type for property declaration' => [ - 'testMarker' => '/* testSelfIsKeywordAsPropertyUnionTypeLast */', - 'expectedTokenType' => 'T_SELF', - ], - 'parent: last in union type for property declaration' => [ - 'testMarker' => '/* testParentIsKeywordAsPropertyUnionTypeLast */', - 'expectedTokenType' => 'T_PARENT', - ], - - 'false: first in union type for param declaration' => [ - 'testMarker' => '/* testFalseIsKeywordAsParamUnionTypeFirst */', - 'expectedTokenType' => 'T_FALSE', - ], - 'true: first in union type for param declaration' => [ - 'testMarker' => '/* testTrueIsKeywordAsParamUnionTypeFirst */', - 'expectedTokenType' => 'T_TRUE', - ], - 'null: first in union type for param declaration' => [ - 'testMarker' => '/* testNullIsKeywordAsParamUnionTypeFirst */', - 'expectedTokenType' => 'T_NULL', - ], - 'self: first in union type for param declaration' => [ - 'testMarker' => '/* testSelfIsKeywordAsParamUnionTypeFirst */', - 'expectedTokenType' => 'T_SELF', - ], - 'parent: first in union type for param declaration' => [ - 'testMarker' => '/* testParentIsKeywordAsParamUnionTypeFirst */', - 'expectedTokenType' => 'T_PARENT', - ], - - 'false: middle in union type for param declaration' => [ - 'testMarker' => '/* testFalseIsKeywordAsParamUnionTypeMiddle */', - 'expectedTokenType' => 'T_FALSE', - ], - 'true: middle in union type for param declaration' => [ - 'testMarker' => '/* testTrueIsKeywordAsParamUnionTypeMiddle */', - 'expectedTokenType' => 'T_TRUE', - ], - 'null: middle in union type for param declaration' => [ - 'testMarker' => '/* testNullIsKeywordAsParamUnionTypeMiddle */', - 'expectedTokenType' => 'T_NULL', - ], - 'self: middle in union type for param declaration' => [ - 'testMarker' => '/* testSelfIsKeywordAsParamUnionTypeMiddle */', - 'expectedTokenType' => 'T_SELF', - ], - 'parent: middle in union type for param declaration' => [ - 'testMarker' => '/* testParentIsKeywordAsParamUnionTypeMiddle */', - 'expectedTokenType' => 'T_PARENT', - ], - - 'false: last in union type for param declaration' => [ - 'testMarker' => '/* testFalseIsKeywordAsParamUnionTypeLast */', - 'expectedTokenType' => 'T_FALSE', - ], - 'true: last in union type for param declaration' => [ - 'testMarker' => '/* testTrueIsKeywordAsParamUnionTypeLast */', - 'expectedTokenType' => 'T_TRUE', - ], - 'null: last in union type for param declaration' => [ - 'testMarker' => '/* testNullIsKeywordAsParamUnionTypeLast */', - 'expectedTokenType' => 'T_NULL', - ], - 'self: last in union type for param declaration' => [ - 'testMarker' => '/* testSelfIsKeywordAsParamUnionTypeLast */', - 'expectedTokenType' => 'T_SELF', - ], - 'parent: last in union type for param declaration' => [ - 'testMarker' => '/* testParentIsKeywordAsParamUnionTypeLast */', - 'expectedTokenType' => 'T_PARENT', - ], - - 'false: first in union type for return declaration' => [ - 'testMarker' => '/* testFalseIsKeywordAsReturnUnionTypeFirst */', - 'expectedTokenType' => 'T_FALSE', - ], - 'true: first in union type for return declaration' => [ - 'testMarker' => '/* testTrueIsKeywordAsReturnUnionTypeFirst */', - 'expectedTokenType' => 'T_TRUE', - ], - 'null: first in union type for return declaration' => [ - 'testMarker' => '/* testNullIsKeywordAsReturnUnionTypeFirst */', - 'expectedTokenType' => 'T_NULL', - ], - 'self: first in union type for return declaration' => [ - 'testMarker' => '/* testSelfIsKeywordAsReturnUnionTypeFirst */', - 'expectedTokenType' => 'T_SELF', - ], - 'parent: first in union type for return declaration' => [ - 'testMarker' => '/* testParentIsKeywordAsReturnUnionTypeFirst */', - 'expectedTokenType' => 'T_PARENT', - ], - - 'false: middle in union type for return declaration' => [ - 'testMarker' => '/* testFalseIsKeywordAsReturnUnionTypeMiddle */', - 'expectedTokenType' => 'T_FALSE', - ], - 'true: middle in union type for return declaration' => [ - 'testMarker' => '/* testTrueIsKeywordAsReturnUnionTypeMiddle */', - 'expectedTokenType' => 'T_TRUE', - ], - 'null: middle in union type for return declaration' => [ - 'testMarker' => '/* testNullIsKeywordAsReturnUnionTypeMiddle */', - 'expectedTokenType' => 'T_NULL', - ], - 'self: middle in union type for return declaration' => [ - 'testMarker' => '/* testSelfIsKeywordAsReturnUnionTypeMiddle */', - 'expectedTokenType' => 'T_SELF', - ], - 'parent: middle in union type for return declaration' => [ - 'testMarker' => '/* testParentIsKeywordAsReturnUnionTypeMiddle */', - 'expectedTokenType' => 'T_PARENT', - ], - - 'false: last in union type for return declaration' => [ - 'testMarker' => '/* testFalseIsKeywordAsReturnUnionTypeLast */', - 'expectedTokenType' => 'T_FALSE', - ], - 'true: last in union type for return declaration' => [ - 'testMarker' => '/* testTrueIsKeywordAsReturnUnionTypeLast */', - 'expectedTokenType' => 'T_TRUE', - ], - 'null: last in union type for return declaration' => [ - 'testMarker' => '/* testNullIsKeywordAsReturnUnionTypeLast */', - 'expectedTokenType' => 'T_NULL', - ], - 'self: last in union type for return declaration' => [ - 'testMarker' => '/* testSelfIsKeywordAsReturnUnionTypeLast */', - 'expectedTokenType' => 'T_SELF', - ], - 'parent: last in union type for return declaration' => [ - 'testMarker' => '/* testParentIsKeywordAsReturnUnionTypeLast */', - 'expectedTokenType' => 'T_PARENT', - ], - - 'self: first in intersection type for OO constant declaration' => [ - 'testMarker' => '/* testSelfIsKeywordAsConstIntersectionTypeFirst */', - 'expectedTokenType' => 'T_SELF', - ], - 'parent: first in intersection type for OO constant declaration' => [ - 'testMarker' => '/* testParentIsKeywordAsConstIntersectionTypeFirst */', - 'expectedTokenType' => 'T_PARENT', - ], - 'self: middle in intersection type for OO constant declaration' => [ - 'testMarker' => '/* testSelfIsKeywordAsConstIntersectionTypeMiddle */', - 'expectedTokenType' => 'T_SELF', - ], - 'parent: middle in intersection type for OO constant declaration' => [ - 'testMarker' => '/* testParentIsKeywordAsConstIntersectionTypeMiddle */', - 'expectedTokenType' => 'T_PARENT', - ], - 'self: last in intersection type for OO constant declaration' => [ - 'testMarker' => '/* testSelfIsKeywordAsConstIntersectionTypeLast */', - 'expectedTokenType' => 'T_SELF', - ], - 'parent: last in intersection type for OO constant declaration' => [ - 'testMarker' => '/* testParentIsKeywordAsConstIntersectionTypeLast */', - 'expectedTokenType' => 'T_PARENT', - ], - - 'self: first in intersection type for property declaration' => [ - 'testMarker' => '/* testSelfIsKeywordAsPropertyIntersectionTypeFirst */', - 'expectedTokenType' => 'T_SELF', - ], - 'parent: first in intersection type for property declaration' => [ - 'testMarker' => '/* testParentIsKeywordAsPropertyIntersectionTypeFirst */', - 'expectedTokenType' => 'T_PARENT', - ], - 'self: middle in intersection type for property declaration' => [ - 'testMarker' => '/* testSelfIsKeywordAsPropertyIntersectionTypeMiddle */', - 'expectedTokenType' => 'T_SELF', - ], - 'parent: middle in intersection type for property declaration' => [ - 'testMarker' => '/* testParentIsKeywordAsPropertyIntersectionTypeMiddle */', - 'expectedTokenType' => 'T_PARENT', - ], - 'self: last in intersection type for property declaration' => [ - 'testMarker' => '/* testSelfIsKeywordAsPropertyIntersectionTypeLast */', - 'expectedTokenType' => 'T_SELF', - ], - 'parent: last in intersection type for property declaration' => [ - 'testMarker' => '/* testParentIsKeywordAsPropertyIntersectionTypeLast */', - 'expectedTokenType' => 'T_PARENT', - ], - - 'self: first in intersection type for param declaration' => [ - 'testMarker' => '/* testSelfIsKeywordAsParamIntersectionTypeFirst */', - 'expectedTokenType' => 'T_SELF', - ], - 'parent: first in intersection type for param declaration' => [ - 'testMarker' => '/* testParentIsKeywordAsParamIntersectionTypeFirst */', - 'expectedTokenType' => 'T_PARENT', - ], - 'self: middle in intersection type for param declaration' => [ - 'testMarker' => '/* testSelfIsKeywordAsParamIntersectionTypeMiddle */', - 'expectedTokenType' => 'T_SELF', - ], - 'parent: middle in intersection type for param declaration' => [ - 'testMarker' => '/* testParentIsKeywordAsParamIntersectionTypeMiddle */', - 'expectedTokenType' => 'T_PARENT', - ], - 'self: last in intersection type for param declaration' => [ - 'testMarker' => '/* testSelfIsKeywordAsParamIntersectionTypeLast */', - 'expectedTokenType' => 'T_SELF', - ], - 'parent: last in intersection type for param declaration' => [ - 'testMarker' => '/* testParentIsKeywordAsParamIntersectionTypeLast */', - 'expectedTokenType' => 'T_PARENT', - ], - - 'self: first in intersection type for return declaration' => [ - 'testMarker' => '/* testSelfIsKeywordAsReturnIntersectionTypeFirst */', - 'expectedTokenType' => 'T_SELF', - ], - 'parent: first in intersection type for return declaration' => [ - 'testMarker' => '/* testParentIsKeywordAsReturnIntersectionTypeFirst */', - 'expectedTokenType' => 'T_PARENT', - ], - 'self: middle in intersection type for return declaration' => [ - 'testMarker' => '/* testSelfIsKeywordAsReturnIntersectionTypeMiddle */', - 'expectedTokenType' => 'T_SELF', - ], - 'parent: middle in intersection type for return declaration' => [ - 'testMarker' => '/* testParentIsKeywordAsReturnIntersectionTypeMiddle */', - 'expectedTokenType' => 'T_PARENT', - ], - 'self: last in intersection type for return declaration' => [ - 'testMarker' => '/* testSelfIsKeywordAsReturnIntersectionTypeLast */', - 'expectedTokenType' => 'T_SELF', - ], - 'parent: last in intersection type for return declaration' => [ - 'testMarker' => '/* testParentIsKeywordAsReturnIntersectionTypeLast */', - 'expectedTokenType' => 'T_PARENT', - ], - - 'false: DNF type in OO constant declaration' => [ - 'testMarker' => '/* testFalseIsKeywordAsConstDNFType */', - 'expectedTokenType' => 'T_FALSE', - ], - 'true: DNF type in OO constant declaration' => [ - 'testMarker' => '/* testTrueIsKeywordAsConstDNFType */', - 'expectedTokenType' => 'T_TRUE', - ], - 'null: DNF type in OO constant declaration' => [ - 'testMarker' => '/* testNullIsKeywordAsConstDNFType */', - 'expectedTokenType' => 'T_NULL', - ], - 'self: DNF type in OO constant declaration' => [ - 'testMarker' => '/* testSelfIsKeywordAsConstDNFType */', - 'expectedTokenType' => 'T_SELF', - ], - 'parent: DNF type in OO constant declaration' => [ - 'testMarker' => '/* testParentIsKeywordAsConstDNFType */', - 'expectedTokenType' => 'T_PARENT', - ], - - 'false: DNF type in property declaration' => [ - 'testMarker' => '/* testFalseIsKeywordAsPropertyDNFType */', - 'expectedTokenType' => 'T_FALSE', - ], - 'true: DNF type in property declaration' => [ - 'testMarker' => '/* testTrueIsKeywordAsPropertyDNFType */', - 'expectedTokenType' => 'T_TRUE', - ], - 'null: DNF type in property declaration' => [ - 'testMarker' => '/* testNullIsKeywordAsPropertyDNFType */', - 'expectedTokenType' => 'T_NULL', - ], - 'self: DNF type in property declaration' => [ - 'testMarker' => '/* testSelfIsKeywordAsPropertyDNFType */', - 'expectedTokenType' => 'T_SELF', - ], - 'parent: DNF type in property declaration' => [ - 'testMarker' => '/* testParentIsKeywordAsPropertyDNFType */', - 'expectedTokenType' => 'T_PARENT', - ], - - 'false: DNF type in function param declaration' => [ - 'testMarker' => '/* testFalseIsKeywordAsParamDNFType */', - 'expectedTokenType' => 'T_FALSE', - ], - 'false: DNF type in function return declaration' => [ - 'testMarker' => '/* testFalseIsKeywordAsReturnDNFType */', - 'expectedTokenType' => 'T_FALSE', - ], - 'true: DNF type in function param declaration' => [ - 'testMarker' => '/* testTrueIsKeywordAsParamDNFType */', - 'expectedTokenType' => 'T_TRUE', - ], - 'true: DNF type in function return declaration' => [ - 'testMarker' => '/* testTrueIsKeywordAsReturnDNFType */', - 'expectedTokenType' => 'T_TRUE', - ], - 'null: DNF type in function param declaration' => [ - 'testMarker' => '/* testNullIsKeywordAsParamDNFType */', - 'expectedTokenType' => 'T_NULL', - ], - 'null: DNF type in function return declaration' => [ - 'testMarker' => '/* testNullIsKeywordAsReturnDNFType */', - 'expectedTokenType' => 'T_NULL', - ], - 'self: DNF type in function param declaration' => [ - 'testMarker' => '/* testSelfIsKeywordAsParamDNFType */', - 'expectedTokenType' => 'T_SELF', - ], - 'self: DNF type in function return declaration' => [ - 'testMarker' => '/* testSelfIsKeywordAsReturnDNFType */', - 'expectedTokenType' => 'T_SELF', - ], - 'parent: DNF type in function param declaration' => [ - 'testMarker' => '/* testParentIsKeywordAsParamDNFType */', - 'expectedTokenType' => 'T_PARENT', - ], - 'parent: DNF type in function return declaration' => [ - 'testMarker' => '/* testParentIsKeywordAsReturnDNFType */', - 'expectedTokenType' => 'T_PARENT', - ], - - 'false: in comparison, uppercase' => [ - 'testMarker' => '/* testFalseIsKeywordUppercase */', - 'expectedTokenType' => 'T_FALSE', - ], - 'true: in comparison, mixed case' => [ - 'testMarker' => '/* testTrueIsKeywordMixedCase */', - 'expectedTokenType' => 'T_TRUE', - ], - 'null: in comparison, uppercase' => [ - 'testMarker' => '/* testNullIsKeywordUppercase */', - 'expectedTokenType' => 'T_NULL', - ], - 'false: in assignment, fully qualified' => [ - 'testMarker' => '/* testFullyQualifiedFalseIsKeyword */', - 'expectedTokenType' => 'T_FALSE', - ], - 'true: in assignment, fully qualified' => [ - 'testMarker' => '/* testFullyQualifiedTrueIsKeyword */', - 'expectedTokenType' => 'T_TRUE', - ], - 'null: in assignment, fully qualified' => [ - 'testMarker' => '/* testFullyQualifiedNullIsKeyword */', - 'expectedTokenType' => 'T_NULL', - ], - ]; - - }//end dataKeywords() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/PHPOpenTagEOF1Test.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/PHPOpenTagEOF1Test.inc deleted file mode 100644 index 2244b38..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/PHPOpenTagEOF1Test.inc +++ /dev/null @@ -1,4 +0,0 @@ - -phpcsFile->getTokens(); - $stackPtr = $this->getTargetToken('/* testLongOpenTagEndOfFileSpaceNoNewLine */', [T_OPEN_TAG, T_STRING, T_INLINE_HTML]); - - $this->assertSame( - T_OPEN_TAG, - $tokens[$stackPtr]['code'], - 'Token tokenized as '.Tokens::tokenName($tokens[$stackPtr]['code']).', not T_OPEN_TAG (code)' - ); - $this->assertSame( - 'T_OPEN_TAG', - $tokens[$stackPtr]['type'], - 'Token tokenized as '.$tokens[$stackPtr]['type'].', not T_OPEN_TAG (type)' - ); - $this->assertSame('assertArrayNotHasKey(($stackPtr + 1), $tokens); - - }//end testLongOpenTagAtEndOfFile() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/PHPOpenTagEOF2Test.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/PHPOpenTagEOF2Test.inc deleted file mode 100644 index 191bdae..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/PHPOpenTagEOF2Test.inc +++ /dev/null @@ -1,4 +0,0 @@ - -phpcsFile->getTokens(); - $stackPtr = $this->getTargetToken('/* testLongOpenTagEndOfFileNoSpaceNoNewLine */', [T_OPEN_TAG, T_STRING, T_INLINE_HTML]); - - $this->assertSame( - T_OPEN_TAG, - $tokens[$stackPtr]['code'], - 'Token tokenized as '.Tokens::tokenName($tokens[$stackPtr]['code']).', not T_OPEN_TAG (code)' - ); - $this->assertSame( - 'T_OPEN_TAG', - $tokens[$stackPtr]['type'], - 'Token tokenized as '.$tokens[$stackPtr]['type'].', not T_OPEN_TAG (type)' - ); - $this->assertSame('assertArrayNotHasKey(($stackPtr + 1), $tokens); - - }//end testLongOpenTagAtEndOfFile() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/PHPOpenTagEOF3Test.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/PHPOpenTagEOF3Test.inc deleted file mode 100644 index 583314d..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/PHPOpenTagEOF3Test.inc +++ /dev/null @@ -1,4 +0,0 @@ - -phpcsFile->getTokens(); - $stackPtr = $this->getTargetToken('/* testLongOpenTagEndOfFileNoSpaceNoNewLineUppercase */', [T_OPEN_TAG, T_STRING, T_INLINE_HTML]); - - $this->assertSame( - T_OPEN_TAG, - $tokens[$stackPtr]['code'], - 'Token tokenized as '.Tokens::tokenName($tokens[$stackPtr]['code']).', not T_OPEN_TAG (code)' - ); - $this->assertSame( - 'T_OPEN_TAG', - $tokens[$stackPtr]['type'], - 'Token tokenized as '.$tokens[$stackPtr]['type'].', not T_OPEN_TAG (type)' - ); - $this->assertSame('assertArrayNotHasKey(($stackPtr + 1), $tokens); - - }//end testLongOpenTagAtEndOfFile() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ResolveSimpleTokenTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ResolveSimpleTokenTest.inc deleted file mode 100644 index d7383d8..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ResolveSimpleTokenTest.inc +++ /dev/null @@ -1,51 +0,0 @@ - $var; - -/* testBooleanNot */ -$a = ! $var; - -/* testComma */ -echo $a, $b, $c; - -/* testAsperand */ -$a = @callMe(); - -/* testDollarAndCurlies */ -echo ${$var}; - -/* testBacktick */ -$a = `ls -e`; diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ResolveSimpleTokenTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ResolveSimpleTokenTest.php deleted file mode 100644 index af95711..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ResolveSimpleTokenTest.php +++ /dev/null @@ -1,433 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\PHP; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; -use PHP_CodeSniffer\Util\Tokens; - -/** - * Tests that simple tokens are assigned the correct token type and code. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::resolveSimpleToken - */ -final class ResolveSimpleTokenTest extends AbstractTokenizerTestCase -{ - - - /** - * Clear the "resolved tokens" cache before running this test as otherwise the code - * under test may not be run during the test. - * - * @beforeClass - * - * @return void - */ - public static function clearTokenCache() - { - parent::clearResolvedTokensCache(); - - }//end clearTokenCache() - - - /** - * Verify tokenization of parentheses, square brackets, curly brackets and a switch colon. - * - * @return void - */ - public function testBracesAndColon() - { - $expectedSequence = [ - T_OPEN_PARENTHESIS, - T_VARIABLE, - T_OPEN_SQUARE_BRACKET, - T_LNUMBER, - T_CLOSE_SQUARE_BRACKET, - T_CLOSE_PARENTHESIS, - T_OPEN_CURLY_BRACKET, - T_CASE, - T_STRING, - T_COLON, - T_BREAK, - T_SEMICOLON, - T_CLOSE_CURLY_BRACKET, - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_SWITCH); - - $this->checkTokenSequence(($target + 1), $expectedSequence); - - }//end testBracesAndColon() - - - /** - * Verify tokenization of colon after named parameter. - * - * @return void - */ - public function testNamedParamColon() - { - $expectedSequence = [ - T_OPEN_PARENTHESIS, - T_PARAM_NAME, - T_COLON, - T_VARIABLE, - T_CLOSE_PARENTHESIS, - T_SEMICOLON, - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_STRING); - - $this->checkTokenSequence(($target + 1), $expectedSequence); - - }//end testNamedParamColon() - - - /** - * Verify tokenization of colon for a return type. - * - * @return void - */ - public function testReturnTypeColon() - { - $expectedSequence = [ - T_EQUAL, - T_CLOSURE, - T_OPEN_PARENTHESIS, - T_CLOSE_PARENTHESIS, - T_COLON, - T_STRING, - T_OPEN_CURLY_BRACKET, - T_CLOSE_CURLY_BRACKET, - T_SEMICOLON, - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_VARIABLE); - - $this->checkTokenSequence(($target + 1), $expectedSequence); - - }//end testReturnTypeColon() - - - /** - * Verify tokenization of a concatenation operator. - * - * @return void - */ - public function testConcat() - { - $expectedSequence = [ - T_STRING_CONCAT, - T_VARIABLE, - T_SEMICOLON, - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_CONSTANT_ENCAPSED_STRING); - - $this->checkTokenSequence(($target + 1), $expectedSequence); - - }//end testConcat() - - - /** - * Verify tokenization of simple math operators. - * - * @return void - */ - public function testSimpleMathTokens() - { - $expectedSequence = [ - T_EQUAL, - T_LNUMBER, - T_MULTIPLY, - T_LNUMBER, - T_DIVIDE, - T_LNUMBER, - T_PLUS, - T_LNUMBER, - T_MINUS, - T_LNUMBER, - T_MODULUS, - T_LNUMBER, - T_SEMICOLON, - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_VARIABLE); - - $this->checkTokenSequence(($target + 1), $expectedSequence); - - }//end testSimpleMathTokens() - - - /** - * Verify tokenization of unary plus/minus operators. - * - * @return void - */ - public function testUnaryPlusMinus() - { - $expectedSequence = [ - T_EQUAL, - T_PLUS, - T_LNUMBER, - T_DIVIDE, - T_MINUS, - T_LNUMBER, - T_SEMICOLON, - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_VARIABLE); - - $this->checkTokenSequence(($target + 1), $expectedSequence); - - }//end testUnaryPlusMinus() - - - /** - * Verify tokenization of bitwise operator tokens. - * - * @return void - */ - public function testBitwiseTokens() - { - $expectedSequence = [ - T_EQUAL, - T_STRING, - T_BITWISE_XOR, - T_STRING, - T_BITWISE_AND, - T_STRING, - T_BITWISE_OR, - T_STRING, - T_BITWISE_NOT, - T_STRING, - T_SEMICOLON, - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_VARIABLE); - - $this->checkTokenSequence(($target + 1), $expectedSequence); - - }//end testBitwiseTokens() - - - /** - * Verify tokenization of bitwise operator tokens. - * - * @return void - */ - public function testBitwiseOrInCatch() - { - $expectedSequence = [ - T_OPEN_PARENTHESIS, - T_STRING, - T_BITWISE_OR, - T_STRING, - T_VARIABLE, - T_CLOSE_PARENTHESIS, - T_OPEN_CURLY_BRACKET, - T_CLOSE_CURLY_BRACKET, - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_CATCH); - - $this->checkTokenSequence(($target + 1), $expectedSequence); - - }//end testBitwiseOrInCatch() - - - /** - * Verify tokenization of a less than operator. - * - * @return void - */ - public function testLessThan() - { - $expectedSequence = [ - T_LESS_THAN, - T_VARIABLE, - T_SEMICOLON, - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_LNUMBER); - - $this->checkTokenSequence(($target + 1), $expectedSequence); - - }//end testLessThan() - - - /** - * Verify tokenization of a greater than operator. - * - * @return void - */ - public function testGreaterThan() - { - $expectedSequence = [ - T_GREATER_THAN, - T_VARIABLE, - T_SEMICOLON, - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_LNUMBER); - - $this->checkTokenSequence(($target + 1), $expectedSequence); - - }//end testGreaterThan() - - - /** - * Verify tokenization of a boolean not operator. - * - * @return void - */ - public function testBooleanNot() - { - $expectedSequence = [ - T_BOOLEAN_NOT, - T_VARIABLE, - T_SEMICOLON, - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_EQUAL); - - $this->checkTokenSequence(($target + 1), $expectedSequence); - - }//end testBooleanNot() - - - /** - * Verify tokenization of commas. - * - * @return void - */ - public function testComma() - { - $expectedSequence = [ - T_COMMA, - T_VARIABLE, - T_COMMA, - T_VARIABLE, - T_SEMICOLON, - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_VARIABLE); - - $this->checkTokenSequence(($target + 1), $expectedSequence); - - }//end testComma() - - - /** - * Verify tokenization of the silence operator. - * - * @return void - */ - public function testAsperand() - { - $expectedSequence = [ - T_ASPERAND, - T_STRING, - T_OPEN_PARENTHESIS, - T_CLOSE_PARENTHESIS, - T_SEMICOLON, - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_EQUAL); - - $this->checkTokenSequence(($target + 1), $expectedSequence); - - }//end testAsperand() - - - /** - * Verify tokenization of the dollar token and curlies for a variable variable. - * - * @return void - */ - public function testDollarAndCurlies() - { - $expectedSequence = [ - T_DOLLAR, - T_OPEN_CURLY_BRACKET, - T_VARIABLE, - T_CLOSE_CURLY_BRACKET, - T_SEMICOLON, - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_ECHO); - - $this->checkTokenSequence(($target + 1), $expectedSequence); - - }//end testDollarAndCurlies() - - - /** - * Verify tokenization of the backtick operator. - * - * @return void - */ - public function testBacktick() - { - $expectedSequence = [ - T_BACKTICK, - T_ENCAPSED_AND_WHITESPACE, - T_BACKTICK, - T_SEMICOLON, - ]; - - $target = $this->getTargetToken('/* '.__FUNCTION__.' */', T_EQUAL); - - $this->checkTokenSequence(($target + 1), $expectedSequence); - - }//end testBacktick() - - - /** - * Test helper. Check a token sequence complies with an expected token sequence. - * - * @param int $startPtr The position in the file to start checking from. - * @param array $expectedSequence The consecutive token constants to expect. - * - * @return void - */ - private function checkTokenSequence($startPtr, array $expectedSequence) - { - $tokens = $this->phpcsFile->getTokens(); - - $sequenceKey = 0; - $sequenceCount = count($expectedSequence); - - for ($i = $startPtr; $sequenceKey < $sequenceCount; $i++) { - if (isset(Tokens::$emptyTokens[$tokens[$i]['code']]) === true) { - // Ignore whitespace and comments, not interested in the tokenization of those for these tests. - continue; - } - - $expectedTokenName = Tokens::tokenName($expectedSequence[$sequenceKey]); - - $this->assertSame( - $expectedSequence[$sequenceKey], - $tokens[$i]['code'], - 'Token tokenized as '.Tokens::tokenName($tokens[$i]['code']).', not '.$expectedTokenName.' (code)' - ); - - $this->assertSame( - $expectedTokenName, - $tokens[$i]['type'], - 'Token tokenized as '.$tokens[$i]['type'].', not '.$expectedTokenName.' (type)' - ); - - ++$sequenceKey; - }//end for - - }//end checkTokenSequence() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ShortArrayTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ShortArrayTest.inc deleted file mode 100644 index cf3b91e..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ShortArrayTest.inc +++ /dev/null @@ -1,128 +0,0 @@ -function_call()[$x]; - -/* testStaticMethodCallDereferencing */ -$var = ClassName::function_call()[$x]; - -/* testPropertyDereferencing */ -$var = $obj->property[2]; - -/* testPropertyDereferencingWithInaccessibleName */ -$var = $ref->{'ref-type'}[1]; - -/* testStaticPropertyDereferencing */ -$var ClassName::$property[2]; - -/* testStringDereferencing */ -$var = 'PHP'[1]; - -/* testStringDereferencingDoubleQuoted */ -$var = "PHP"[$y]; - -/* testConstantDereferencing */ -$var = MY_CONSTANT[1]; - -/* testClassConstantDereferencing */ -$var ClassName::CONSTANT_NAME[2]; - -/* testMagicConstantDereferencing */ -$var = __FILE__[0]; - -/* testArrayAccessCurlyBraces */ -$var = $array{'key'}['key']; - -/* testArrayLiteralDereferencing */ -echo array(1, 2, 3)[0]; - -echo [1, 2, 3]/* testShortArrayLiteralDereferencing */[0]; - -/* testClassMemberDereferencingOnInstantiation1 */ -(new foo)[0]; - -/* testClassMemberDereferencingOnInstantiation2 */ -$a = (new Foo( array(1, array(4, 5), 3) ))[1][0]; - -/* testClassMemberDereferencingOnClone */ -echo (clone $iterable)[20]; - -/* testNullsafeMethodCallDereferencing */ -$var = $obj?->function_call()[$x]; - -/* testInterpolatedStringDereferencing */ -$var = "PHP{$rocks}"[1]; - -/* testNewAnonClassNoParenthesesExpressionDereferencing */ -$a = new class {}[0]; - -$a = new class (['value']) - /* testNewAnonClassParenthesesExpressionDereferencing */ - {}[0]; - -/* testNewAnonClassExtendsExpressionDereferencing */ -$a = new readonly class extends ArrayObject {}[0]; - -/* testNewAnonClassImplementsExpressionDereferencing */ -$a = new class implements ArrayAccess {}[0]; - -/* - * Short array brackets. - */ - -/* testShortArrayDeclarationEmpty */ -$array = []; - -/* testShortArrayDeclarationWithOneValue */ -$array = [1]; - -/* testShortArrayDeclarationWithMultipleValues */ -$array = [1, 2, 3]; - -/* testShortArrayDeclarationWithDereferencing */ -echo [1, 2, 3][0]; - -/* testShortListDeclaration */ -[ $a, $b ] = $array; - -[ $a, $b, /* testNestedListDeclaration */, [$c, $d]] = $array; - -/* testArrayWithinFunctionCall */ -$var = functionCall([$x, $y]); - -if ( true ) { - /* testShortListDeclarationAfterBracedControlStructure */ - [ $a ] = [ 'hi' ]; -} - -if ( true ) - /* testShortListDeclarationAfterNonBracedControlStructure */ - [ $a ] = [ 'hi' ]; - -if ( true ) : - /* testShortListDeclarationAfterAlternativeControlStructure */ - [ $a ] = [ 'hi' ]; -endif; - -class Foo extends ArrayObject {} -/* testShortListDeclarationAfterClassDeclaration */ -[$a] = ['hi']; - -/* testLiveCoding */ -// Intentional parse error. This has to be the last test in the file. -$array = [ diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ShortArrayTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ShortArrayTest.php deleted file mode 100644 index 010d610..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/ShortArrayTest.php +++ /dev/null @@ -1,146 +0,0 @@ - - * @copyright 2020 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\PHP; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; - -final class ShortArrayTest extends AbstractTokenizerTestCase -{ - - - /** - * Test that real square brackets are still tokenized as square brackets. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * - * @dataProvider dataSquareBrackets - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testSquareBrackets($testMarker) - { - $tokens = $this->phpcsFile->getTokens(); - $opener = $this->getTargetToken($testMarker, [T_OPEN_SQUARE_BRACKET, T_OPEN_SHORT_ARRAY]); - $tokenArray = $tokens[$opener]; - - $this->assertSame(T_OPEN_SQUARE_BRACKET, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_OPEN_SQUARE_BRACKET (code)'); - $this->assertSame('T_OPEN_SQUARE_BRACKET', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_OPEN_SQUARE_BRACKET (type)'); - - if (isset($tokens[$opener]['bracket_closer']) === true) { - $closer = $tokens[$opener]['bracket_closer']; - $tokenArray = $tokens[$closer]; - - $this->assertSame(T_CLOSE_SQUARE_BRACKET, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_CLOSE_SQUARE_BRACKET (code)'); - $this->assertSame('T_CLOSE_SQUARE_BRACKET', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_CLOSE_SQUARE_BRACKET (type)'); - } - - }//end testSquareBrackets() - - - /** - * Data provider. - * - * @see testSquareBrackets() - * - * @return array> - */ - public static function dataSquareBrackets() - { - return [ - 'array access 1' => ['/* testArrayAccess1 */'], - 'array access 2' => ['/* testArrayAccess2 */'], - 'array assignment' => ['/* testArrayAssignment */'], - 'function call dereferencing' => ['/* testFunctionCallDereferencing */'], - 'method call dereferencing' => ['/* testMethodCallDereferencing */'], - 'static method call dereferencing' => ['/* testStaticMethodCallDereferencing */'], - 'property dereferencing' => ['/* testPropertyDereferencing */'], - 'property dereferencing with inaccessable name' => ['/* testPropertyDereferencingWithInaccessibleName */'], - 'static property dereferencing' => ['/* testStaticPropertyDereferencing */'], - 'string dereferencing single quotes' => ['/* testStringDereferencing */'], - 'string dereferencing double quotes' => ['/* testStringDereferencingDoubleQuoted */'], - 'global constant dereferencing' => ['/* testConstantDereferencing */'], - 'class constant dereferencing' => ['/* testClassConstantDereferencing */'], - 'magic constant dereferencing' => ['/* testMagicConstantDereferencing */'], - 'array access with curly braces' => ['/* testArrayAccessCurlyBraces */'], - 'array literal dereferencing' => ['/* testArrayLiteralDereferencing */'], - 'short array literal dereferencing' => ['/* testShortArrayLiteralDereferencing */'], - 'class member dereferencing on instantiation 1' => ['/* testClassMemberDereferencingOnInstantiation1 */'], - 'class member dereferencing on instantiation 2' => ['/* testClassMemberDereferencingOnInstantiation2 */'], - 'class member dereferencing on clone' => ['/* testClassMemberDereferencingOnClone */'], - 'nullsafe method call dereferencing' => ['/* testNullsafeMethodCallDereferencing */'], - 'interpolated string dereferencing' => ['/* testInterpolatedStringDereferencing */'], - 'new anonymous class expression dereferencing 1' => ['/* testNewAnonClassNoParenthesesExpressionDereferencing */'], - 'new anonymous class expression dereferencing 2' => ['/* testNewAnonClassParenthesesExpressionDereferencing */'], - 'new anonymous class expression dereferencing 3' => ['/* testNewAnonClassExtendsExpressionDereferencing */'], - 'new anonymous class expression dereferencing 4' => ['/* testNewAnonClassImplementsExpressionDereferencing */'], - 'live coding' => ['/* testLiveCoding */'], - ]; - - }//end dataSquareBrackets() - - - /** - * Test that short arrays and short lists are still tokenized as short arrays. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * - * @dataProvider dataShortArrays - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testShortArrays($testMarker) - { - $tokens = $this->phpcsFile->getTokens(); - $opener = $this->getTargetToken($testMarker, [T_OPEN_SQUARE_BRACKET, T_OPEN_SHORT_ARRAY]); - $tokenArray = $tokens[$opener]; - - $this->assertSame(T_OPEN_SHORT_ARRAY, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_OPEN_SHORT_ARRAY (code)'); - $this->assertSame('T_OPEN_SHORT_ARRAY', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_OPEN_SHORT_ARRAY (type)'); - - if (isset($tokens[$opener]['bracket_closer']) === true) { - $closer = $tokens[$opener]['bracket_closer']; - $tokenArray = $tokens[$closer]; - - $this->assertSame(T_CLOSE_SHORT_ARRAY, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_CLOSE_SHORT_ARRAY (code)'); - $this->assertSame('T_CLOSE_SHORT_ARRAY', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_CLOSE_SHORT_ARRAY (type)'); - } - - }//end testShortArrays() - - - /** - * Data provider. - * - * @see testShortArrays() - * - * @return array> - */ - public static function dataShortArrays() - { - return [ - 'short array empty' => ['/* testShortArrayDeclarationEmpty */'], - 'short array with value' => ['/* testShortArrayDeclarationWithOneValue */'], - 'short array with values' => ['/* testShortArrayDeclarationWithMultipleValues */'], - 'short array with dereferencing' => ['/* testShortArrayDeclarationWithDereferencing */'], - 'short list' => ['/* testShortListDeclaration */'], - 'short list nested' => ['/* testNestedListDeclaration */'], - 'short array within function call' => ['/* testArrayWithinFunctionCall */'], - 'short list after braced control structure' => ['/* testShortListDeclarationAfterBracedControlStructure */'], - 'short list after non-braced control structure' => ['/* testShortListDeclarationAfterNonBracedControlStructure */'], - 'short list after alternative control structure' => ['/* testShortListDeclarationAfterAlternativeControlStructure */'], - 'short list after class declaration' => ['/* testShortListDeclarationAfterClassDeclaration */'], - ]; - - }//end dataShortArrays() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/StableCommentWhitespaceTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/StableCommentWhitespaceTest.inc deleted file mode 100644 index 3bf013c..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/StableCommentWhitespaceTest.inc +++ /dev/null @@ -1,139 +0,0 @@ - - - - * @copyright 2020 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\PHP; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; -use PHP_CodeSniffer\Util\Tokens; - -final class StableCommentWhitespaceTest extends AbstractTokenizerTestCase -{ - - - /** - * Test that comment tokenization with new lines at the end of the comment is stable. - * - * @param string $testMarker The comment prefacing the test. - * @param array> $expectedTokens The tokenization expected. - * - * @dataProvider dataCommentTokenization - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testCommentTokenization($testMarker, $expectedTokens) - { - $tokens = $this->phpcsFile->getTokens(); - $comment = $this->getTargetToken($testMarker, Tokens::$commentTokens); - - foreach ($expectedTokens as $tokenInfo) { - $this->assertSame( - constant($tokenInfo['type']), - $tokens[$comment]['code'], - 'Token tokenized as '.Tokens::tokenName($tokens[$comment]['code']).', not '.$tokenInfo['type'].' (code)' - ); - $this->assertSame( - $tokenInfo['type'], - $tokens[$comment]['type'], - 'Token tokenized as '.$tokens[$comment]['type'].', not '.$tokenInfo['type'].' (type)' - ); - $this->assertSame($tokenInfo['content'], $tokens[$comment]['content']); - - ++$comment; - } - - }//end testCommentTokenization() - - - /** - * Data provider. - * - * @see testCommentTokenization() - * - * @return array>>> - */ - public static function dataCommentTokenization() - { - return [ - 'slash comment, single line' => [ - 'testMarker' => '/* testSingleLineSlashComment */', - 'expectedTokens' => [ - [ - 'type' => 'T_COMMENT', - 'content' => '// Comment -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'slash comment, single line, trailing' => [ - 'testMarker' => '/* testSingleLineSlashCommentTrailing */', - 'expectedTokens' => [ - [ - 'type' => 'T_COMMENT', - 'content' => '// Comment -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'slash ignore annotation, single line' => [ - 'testMarker' => '/* testSingleLineSlashAnnotation */', - 'expectedTokens' => [ - [ - 'type' => 'T_PHPCS_DISABLE', - 'content' => '// phpcs:disable Stnd.Cat -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'slash comment, multi-line' => [ - 'testMarker' => '/* testMultiLineSlashComment */', - 'expectedTokens' => [ - [ - 'type' => 'T_COMMENT', - 'content' => '// Comment1 -', - ], - [ - 'type' => 'T_COMMENT', - 'content' => '// Comment2 -', - ], - [ - 'type' => 'T_COMMENT', - 'content' => '// Comment3 -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'slash comment, multi-line, indented' => [ - 'testMarker' => '/* testMultiLineSlashCommentWithIndent */', - 'expectedTokens' => [ - [ - 'type' => 'T_COMMENT', - 'content' => '// Comment1 -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_COMMENT', - 'content' => '// Comment2 -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_COMMENT', - 'content' => '// Comment3 -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'slash comment, multi-line, ignore annotation as first line' => [ - 'testMarker' => '/* testMultiLineSlashCommentWithAnnotationStart */', - 'expectedTokens' => [ - [ - 'type' => 'T_PHPCS_IGNORE', - 'content' => '// phpcs:ignore Stnd.Cat -', - ], - [ - 'type' => 'T_COMMENT', - 'content' => '// Comment2 -', - ], - [ - 'type' => 'T_COMMENT', - 'content' => '// Comment3 -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'slash comment, multi-line, ignore annotation as middle line' => [ - 'testMarker' => '/* testMultiLineSlashCommentWithAnnotationMiddle */', - 'expectedTokens' => [ - [ - 'type' => 'T_COMMENT', - 'content' => '// Comment1 -', - ], - [ - 'type' => 'T_PHPCS_IGNORE', - 'content' => '// @phpcs:ignore Stnd.Cat -', - ], - [ - 'type' => 'T_COMMENT', - 'content' => '// Comment3 -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'slash comment, multi-line, ignore annotation as last line' => [ - 'testMarker' => '/* testMultiLineSlashCommentWithAnnotationEnd */', - 'expectedTokens' => [ - [ - 'type' => 'T_COMMENT', - 'content' => '// Comment1 -', - ], - [ - 'type' => 'T_COMMENT', - 'content' => '// Comment2 -', - ], - [ - 'type' => 'T_PHPCS_IGNORE', - 'content' => '// phpcs:ignore Stnd.Cat -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'star comment, single line' => [ - 'testMarker' => '/* testSingleLineStarComment */', - 'expectedTokens' => [ - [ - 'type' => 'T_COMMENT', - 'content' => '/* Single line star comment */', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'star comment, single line, trailing' => [ - 'testMarker' => '/* testSingleLineStarCommentTrailing */', - 'expectedTokens' => [ - [ - 'type' => 'T_COMMENT', - 'content' => '/* Comment */', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'star ignore annotation, single line' => [ - 'testMarker' => '/* testSingleLineStarAnnotation */', - 'expectedTokens' => [ - [ - 'type' => 'T_PHPCS_IGNORE', - 'content' => '/* phpcs:ignore Stnd.Cat */', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'star comment, multi-line' => [ - 'testMarker' => '/* testMultiLineStarComment */', - 'expectedTokens' => [ - [ - 'type' => 'T_COMMENT', - 'content' => '/* Comment1 -', - ], - [ - 'type' => 'T_COMMENT', - 'content' => ' * Comment2 -', - ], - [ - 'type' => 'T_COMMENT', - 'content' => ' * Comment3 */', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'star comment, multi-line, indented' => [ - 'testMarker' => '/* testMultiLineStarCommentWithIndent */', - 'expectedTokens' => [ - [ - 'type' => 'T_COMMENT', - 'content' => '/* Comment1 -', - ], - [ - 'type' => 'T_COMMENT', - 'content' => ' * Comment2 -', - ], - [ - 'type' => 'T_COMMENT', - 'content' => ' * Comment3 */', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'star comment, multi-line, ignore annotation as first line' => [ - 'testMarker' => '/* testMultiLineStarCommentWithAnnotationStart */', - 'expectedTokens' => [ - [ - 'type' => 'T_PHPCS_IGNORE', - 'content' => '/* @phpcs:ignore Stnd.Cat -', - ], - [ - 'type' => 'T_COMMENT', - 'content' => ' * Comment2 -', - ], - [ - 'type' => 'T_COMMENT', - 'content' => ' * Comment3 */', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'star comment, multi-line, ignore annotation as middle line' => [ - 'testMarker' => '/* testMultiLineStarCommentWithAnnotationMiddle */', - 'expectedTokens' => [ - [ - 'type' => 'T_COMMENT', - 'content' => '/* Comment1 -', - ], - [ - 'type' => 'T_PHPCS_IGNORE', - 'content' => ' * phpcs:ignore Stnd.Cat -', - ], - [ - 'type' => 'T_COMMENT', - 'content' => ' * Comment3 */', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'star comment, multi-line, ignore annotation as last line' => [ - 'testMarker' => '/* testMultiLineStarCommentWithAnnotationEnd */', - 'expectedTokens' => [ - [ - 'type' => 'T_COMMENT', - 'content' => '/* Comment1 -', - ], - [ - 'type' => 'T_COMMENT', - 'content' => ' * Comment2 -', - ], - [ - 'type' => 'T_PHPCS_IGNORE', - 'content' => ' * phpcs:ignore Stnd.Cat */', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - - 'docblock comment, single line' => [ - 'testMarker' => '/* testSingleLineDocblockComment */', - 'expectedTokens' => [ - [ - 'type' => 'T_DOC_COMMENT_OPEN_TAG', - 'content' => '/**', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_DOC_COMMENT_STRING', - 'content' => 'Comment ', - ], - [ - 'type' => 'T_DOC_COMMENT_CLOSE_TAG', - 'content' => '*/', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'docblock comment, single line, trailing' => [ - 'testMarker' => '/* testSingleLineDocblockCommentTrailing */', - 'expectedTokens' => [ - [ - 'type' => 'T_DOC_COMMENT_OPEN_TAG', - 'content' => '/**', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_DOC_COMMENT_STRING', - 'content' => 'Comment ', - ], - [ - 'type' => 'T_DOC_COMMENT_CLOSE_TAG', - 'content' => '*/', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'docblock ignore annotation, single line' => [ - 'testMarker' => '/* testSingleLineDocblockAnnotation */', - 'expectedTokens' => [ - [ - 'type' => 'T_DOC_COMMENT_OPEN_TAG', - 'content' => '/**', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_PHPCS_IGNORE', - 'content' => 'phpcs:ignore Stnd.Cat.Sniff ', - ], - [ - 'type' => 'T_DOC_COMMENT_CLOSE_TAG', - 'content' => '*/', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - - 'docblock comment, multi-line' => [ - 'testMarker' => '/* testMultiLineDocblockComment */', - 'expectedTokens' => [ - [ - 'type' => 'T_DOC_COMMENT_OPEN_TAG', - 'content' => '/**', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' -', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_DOC_COMMENT_STAR', - 'content' => '*', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_DOC_COMMENT_STRING', - 'content' => 'Comment1', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' -', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_DOC_COMMENT_STAR', - 'content' => '*', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_DOC_COMMENT_STRING', - 'content' => 'Comment2', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' -', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_DOC_COMMENT_STAR', - 'content' => '*', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' -', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_DOC_COMMENT_STAR', - 'content' => '*', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_DOC_COMMENT_TAG', - 'content' => '@tag', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_DOC_COMMENT_STRING', - 'content' => 'Comment', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' -', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_DOC_COMMENT_CLOSE_TAG', - 'content' => '*/', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'docblock comment, multi-line, indented' => [ - 'testMarker' => '/* testMultiLineDocblockCommentWithIndent */', - 'expectedTokens' => [ - [ - 'type' => 'T_DOC_COMMENT_OPEN_TAG', - 'content' => '/**', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' -', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_DOC_COMMENT_STAR', - 'content' => '*', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_DOC_COMMENT_STRING', - 'content' => 'Comment1', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' -', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_DOC_COMMENT_STAR', - 'content' => '*', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_DOC_COMMENT_STRING', - 'content' => 'Comment2', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' -', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_DOC_COMMENT_STAR', - 'content' => '*', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' -', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_DOC_COMMENT_STAR', - 'content' => '*', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_DOC_COMMENT_TAG', - 'content' => '@tag', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_DOC_COMMENT_STRING', - 'content' => 'Comment', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' -', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_DOC_COMMENT_CLOSE_TAG', - 'content' => '*/', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'docblock comment, multi-line, ignore annotation' => [ - 'testMarker' => '/* testMultiLineDocblockCommentWithAnnotation */', - 'expectedTokens' => [ - [ - 'type' => 'T_DOC_COMMENT_OPEN_TAG', - 'content' => '/**', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' -', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_DOC_COMMENT_STAR', - 'content' => '*', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_DOC_COMMENT_STRING', - 'content' => 'Comment', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' -', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_DOC_COMMENT_STAR', - 'content' => '*', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' -', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_DOC_COMMENT_STAR', - 'content' => '*', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_PHPCS_IGNORE', - 'content' => 'phpcs:ignore Stnd.Cat', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' -', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_DOC_COMMENT_STAR', - 'content' => '*', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_DOC_COMMENT_TAG', - 'content' => '@tag', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_DOC_COMMENT_STRING', - 'content' => 'Comment', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' -', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_DOC_COMMENT_CLOSE_TAG', - 'content' => '*/', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'docblock comment, multi-line, ignore annotation as tag' => [ - 'testMarker' => '/* testMultiLineDocblockCommentWithTagAnnotation */', - 'expectedTokens' => [ - [ - 'type' => 'T_DOC_COMMENT_OPEN_TAG', - 'content' => '/**', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' -', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_DOC_COMMENT_STAR', - 'content' => '*', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_DOC_COMMENT_STRING', - 'content' => 'Comment', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' -', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_DOC_COMMENT_STAR', - 'content' => '*', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' -', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_DOC_COMMENT_STAR', - 'content' => '*', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_PHPCS_IGNORE', - 'content' => '@phpcs:ignore Stnd.Cat', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' -', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_DOC_COMMENT_STAR', - 'content' => '*', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_DOC_COMMENT_TAG', - 'content' => '@tag', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_DOC_COMMENT_STRING', - 'content' => 'Comment', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' -', - ], - [ - 'type' => 'T_DOC_COMMENT_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_DOC_COMMENT_CLOSE_TAG', - 'content' => '*/', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'hash comment, single line' => [ - 'testMarker' => '/* testSingleLineHashComment */', - 'expectedTokens' => [ - [ - 'type' => 'T_COMMENT', - 'content' => '# Comment -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'hash comment, single line, trailing' => [ - 'testMarker' => '/* testSingleLineHashCommentTrailing */', - 'expectedTokens' => [ - [ - 'type' => 'T_COMMENT', - 'content' => '# Comment -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'hash comment, multi-line' => [ - 'testMarker' => '/* testMultiLineHashComment */', - 'expectedTokens' => [ - [ - 'type' => 'T_COMMENT', - 'content' => '# Comment1 -', - ], - [ - 'type' => 'T_COMMENT', - 'content' => '# Comment2 -', - ], - [ - 'type' => 'T_COMMENT', - 'content' => '# Comment3 -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'hash comment, multi-line, indented' => [ - 'testMarker' => '/* testMultiLineHashCommentWithIndent */', - 'expectedTokens' => [ - [ - 'type' => 'T_COMMENT', - 'content' => '# Comment1 -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_COMMENT', - 'content' => '# Comment2 -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_COMMENT', - 'content' => '# Comment3 -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'slash comment, single line, without new line at end' => [ - 'testMarker' => '/* testSingleLineSlashCommentNoNewLineAtEnd */', - 'expectedTokens' => [ - [ - 'type' => 'T_COMMENT', - 'content' => '// Slash ', - ], - [ - 'type' => 'T_CLOSE_TAG', - 'content' => '?> -', - ], - ], - ], - 'hash comment, single line, without new line at end' => [ - 'testMarker' => '/* testSingleLineHashCommentNoNewLineAtEnd */', - 'expectedTokens' => [ - [ - 'type' => 'T_COMMENT', - 'content' => '# Hash ', - ], - [ - 'type' => 'T_CLOSE_TAG', - 'content' => '?> -', - ], - ], - ], - 'unclosed star comment at end of file' => [ - 'testMarker' => '/* testCommentAtEndOfFile */', - 'expectedTokens' => [ - [ - 'type' => 'T_COMMENT', - 'content' => '/* Comment', - ], - ], - ], - ]; - - }//end dataCommentTokenization() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/StableCommentWhitespaceWinTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/StableCommentWhitespaceWinTest.inc deleted file mode 100644 index dc98eb0..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/StableCommentWhitespaceWinTest.inc +++ /dev/null @@ -1,63 +0,0 @@ - - - - * @copyright 2020 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\PHP; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; -use PHP_CodeSniffer\Util\Tokens; - -final class StableCommentWhitespaceWinTest extends AbstractTokenizerTestCase -{ - - - /** - * Test that comment tokenization with new lines at the end of the comment is stable. - * - * @param string $testMarker The comment prefacing the test. - * @param array> $expectedTokens The tokenization expected. - * - * @dataProvider dataCommentTokenization - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testCommentTokenization($testMarker, $expectedTokens) - { - $tokens = $this->phpcsFile->getTokens(); - $comment = $this->getTargetToken($testMarker, Tokens::$commentTokens); - - foreach ($expectedTokens as $tokenInfo) { - $this->assertSame( - constant($tokenInfo['type']), - $tokens[$comment]['code'], - 'Token tokenized as '.Tokens::tokenName($tokens[$comment]['code']).', not '.$tokenInfo['type'].' (code)' - ); - $this->assertSame( - $tokenInfo['type'], - $tokens[$comment]['type'], - 'Token tokenized as '.$tokens[$comment]['type'].', not '.$tokenInfo['type'].' (type)' - ); - $this->assertSame($tokenInfo['content'], $tokens[$comment]['content']); - - ++$comment; - } - - }//end testCommentTokenization() - - - /** - * Data provider. - * - * @see testCommentTokenization() - * - * @return array>>> - */ - public static function dataCommentTokenization() - { - return [ - 'slash comment, single line' => [ - 'testMarker' => '/* testSingleLineSlashComment */', - 'expectedTokens' => [ - [ - 'type' => 'T_COMMENT', - 'content' => '// Comment -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'slash comment, single line, trailing' => [ - 'testMarker' => '/* testSingleLineSlashCommentTrailing */', - 'expectedTokens' => [ - [ - 'type' => 'T_COMMENT', - 'content' => '// Comment -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'slash ignore annotation, single line' => [ - 'testMarker' => '/* testSingleLineSlashAnnotation */', - 'expectedTokens' => [ - [ - 'type' => 'T_PHPCS_DISABLE', - 'content' => '// phpcs:disable Stnd.Cat -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'slash comment, multi-line' => [ - 'testMarker' => '/* testMultiLineSlashComment */', - 'expectedTokens' => [ - [ - 'type' => 'T_COMMENT', - 'content' => '// Comment1 -', - ], - [ - 'type' => 'T_COMMENT', - 'content' => '// Comment2 -', - ], - [ - 'type' => 'T_COMMENT', - 'content' => '// Comment3 -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'slash comment, multi-line, indented' => [ - 'testMarker' => '/* testMultiLineSlashCommentWithIndent */', - 'expectedTokens' => [ - [ - 'type' => 'T_COMMENT', - 'content' => '// Comment1 -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_COMMENT', - 'content' => '// Comment2 -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_COMMENT', - 'content' => '// Comment3 -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'slash comment, multi-line, ignore annotation as first line' => [ - 'testMarker' => '/* testMultiLineSlashCommentWithAnnotationStart */', - 'expectedTokens' => [ - [ - 'type' => 'T_PHPCS_IGNORE', - 'content' => '// phpcs:ignore Stnd.Cat -', - ], - [ - 'type' => 'T_COMMENT', - 'content' => '// Comment2 -', - ], - [ - 'type' => 'T_COMMENT', - 'content' => '// Comment3 -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'slash comment, multi-line, ignore annotation as middle line' => [ - 'testMarker' => '/* testMultiLineSlashCommentWithAnnotationMiddle */', - 'expectedTokens' => [ - [ - 'type' => 'T_COMMENT', - 'content' => '// Comment1 -', - ], - [ - 'type' => 'T_PHPCS_IGNORE', - 'content' => '// @phpcs:ignore Stnd.Cat -', - ], - [ - 'type' => 'T_COMMENT', - 'content' => '// Comment3 -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'slash comment, multi-line, ignore annotation as last line' => [ - 'testMarker' => '/* testMultiLineSlashCommentWithAnnotationEnd */', - 'expectedTokens' => [ - [ - 'type' => 'T_COMMENT', - 'content' => '// Comment1 -', - ], - [ - 'type' => 'T_COMMENT', - 'content' => '// Comment2 -', - ], - [ - 'type' => 'T_PHPCS_IGNORE', - 'content' => '// phpcs:ignore Stnd.Cat -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'slash comment, single line, without new line at end' => [ - 'testMarker' => '/* testSingleLineSlashCommentNoNewLineAtEnd */', - 'expectedTokens' => [ - [ - 'type' => 'T_COMMENT', - 'content' => '// Slash ', - ], - [ - 'type' => 'T_CLOSE_TAG', - 'content' => '?> -', - ], - ], - ], - 'hash comment, single line' => [ - 'testMarker' => '/* testSingleLineHashComment */', - 'expectedTokens' => [ - [ - 'type' => 'T_COMMENT', - 'content' => '# Comment -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'hash comment, single line, trailing' => [ - 'testMarker' => '/* testSingleLineHashCommentTrailing */', - 'expectedTokens' => [ - [ - 'type' => 'T_COMMENT', - 'content' => '# Comment -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'hash comment, multi-line' => [ - 'testMarker' => '/* testMultiLineHashComment */', - 'expectedTokens' => [ - [ - 'type' => 'T_COMMENT', - 'content' => '# Comment1 -', - ], - [ - 'type' => 'T_COMMENT', - 'content' => '# Comment2 -', - ], - [ - 'type' => 'T_COMMENT', - 'content' => '# Comment3 -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'hash comment, multi-line, indented' => [ - 'testMarker' => '/* testMultiLineHashCommentWithIndent */', - 'expectedTokens' => [ - [ - 'type' => 'T_COMMENT', - 'content' => '# Comment1 -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_COMMENT', - 'content' => '# Comment2 -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_COMMENT', - 'content' => '# Comment3 -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'hash comment, single line, without new line at end' => [ - 'testMarker' => '/* testSingleLineHashCommentNoNewLineAtEnd */', - 'expectedTokens' => [ - [ - 'type' => 'T_COMMENT', - 'content' => '# Hash ', - ], - [ - 'type' => 'T_CLOSE_TAG', - 'content' => '?> -', - ], - ], - ], - 'unclosed star comment at end of file' => [ - 'testMarker' => '/* testCommentAtEndOfFile */', - 'expectedTokens' => [ - [ - 'type' => 'T_COMMENT', - 'content' => '/* Comment', - ], - ], - ], - ]; - - }//end dataCommentTokenization() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/TypeIntersectionTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/TypeIntersectionTest.inc deleted file mode 100644 index c5792d6..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/TypeIntersectionTest.inc +++ /dev/null @@ -1,185 +0,0 @@ - $param & $int; - -/* testTypeIntersectionArrowReturnType */ -$arrowWithReturnType = fn ($param) : Foo&Bar => $param * 10; - -/* testBitwiseAndInArrayKey */ -$array = array( - A & B => /* testBitwiseAndInArrayValue */ B & C -); - -/* testBitwiseAndInShortArrayKey */ -$array = [ - A & B => /* testBitwiseAndInShortArrayValue */ B & C -]; - -/* testBitwiseAndNonArrowFnFunctionCall */ -$obj->fn($something & $else); - -/* testBitwiseAnd6 */ -function &fn(/* testTypeIntersectionNonArrowFunctionDeclaration */ Foo&Bar $something) {} - -/* testTypeIntersectionWithInvalidTypes */ -function (int&string $var) {}; - -/* testLiveCoding */ -// Intentional parse error. This has to be the last test in the file. -return function( Foo& diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/TypeIntersectionTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/TypeIntersectionTest.php deleted file mode 100644 index bee07fe..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/TypeIntersectionTest.php +++ /dev/null @@ -1,165 +0,0 @@ - - * @author Jaroslav Hanslík - * @copyright 2020 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\PHP; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; - -final class TypeIntersectionTest extends AbstractTokenizerTestCase -{ - - - /** - * Test that non-intersection type bitwise and tokens are still tokenized as bitwise and. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * - * @dataProvider dataBitwiseAnd - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testBitwiseAnd($testMarker) - { - $tokens = $this->phpcsFile->getTokens(); - $target = $this->getTargetToken($testMarker, [T_BITWISE_AND, T_TYPE_INTERSECTION]); - $tokenArray = $tokens[$target]; - - $this->assertSame(T_BITWISE_AND, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_BITWISE_AND (code)'); - $this->assertSame('T_BITWISE_AND', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_BITWISE_AND (type)'); - - }//end testBitwiseAnd() - - - /** - * Data provider. - * - * @see testBitwiseAnd() - * - * @return array> - */ - public static function dataBitwiseAnd() - { - return [ - 'in simple assignment 1' => ['/* testBitwiseAnd1 */'], - 'in simple assignment 2' => ['/* testBitwiseAnd2 */'], - 'in OO constant default value' => ['/* testBitwiseAndOOConstDefaultValue */'], - 'in property default value' => ['/* testBitwiseAndPropertyDefaultValue */'], - 'in method parameter default value' => ['/* testBitwiseAndParamDefaultValue */'], - 'reference for method parameter' => ['/* testBitwiseAnd3 */'], - 'in return statement' => ['/* testBitwiseAnd4 */'], - 'reference for function parameter' => ['/* testBitwiseAnd5 */'], - 'in OO constant default value DNF-like' => ['/* testBitwiseAndOOConstDefaultValueDNF */'], - 'in property default value DNF-like' => ['/* testBitwiseAndPropertyDefaultValueDNF */'], - 'in method parameter default value DNF-like' => ['/* testBitwiseAndParamDefaultValueDNF */'], - 'in closure parameter default value' => ['/* testBitwiseAndClosureParamDefault */'], - 'in arrow function parameter default value' => ['/* testBitwiseAndArrowParamDefault */'], - 'in arrow function return expression' => ['/* testBitwiseAndArrowExpression */'], - 'in long array key' => ['/* testBitwiseAndInArrayKey */'], - 'in long array value' => ['/* testBitwiseAndInArrayValue */'], - 'in short array key' => ['/* testBitwiseAndInShortArrayKey */'], - 'in short array value' => ['/* testBitwiseAndInShortArrayValue */'], - 'in parameter in function call' => ['/* testBitwiseAndNonArrowFnFunctionCall */'], - 'function return by reference' => ['/* testBitwiseAnd6 */'], - 'live coding / undetermined' => ['/* testLiveCoding */'], - ]; - - }//end dataBitwiseAnd() - - - /** - * Test that bitwise and tokens when used as part of a intersection type are tokenized as `T_TYPE_INTERSECTION`. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * - * @dataProvider dataTypeIntersection - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testTypeIntersection($testMarker) - { - $tokens = $this->phpcsFile->getTokens(); - $target = $this->getTargetToken($testMarker, [T_BITWISE_AND, T_TYPE_INTERSECTION]); - $tokenArray = $tokens[$target]; - - $this->assertSame(T_TYPE_INTERSECTION, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_TYPE_INTERSECTION (code)'); - $this->assertSame('T_TYPE_INTERSECTION', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_TYPE_INTERSECTION (type)'); - - }//end testTypeIntersection() - - - /** - * Data provider. - * - * @see testTypeIntersection() - * - * @return array> - */ - public static function dataTypeIntersection() - { - return [ - 'type for OO constant' => ['/* testTypeIntersectionOOConstSimple */'], - 'type for OO constant, reversed modifier order' => ['/* testTypeIntersectionOOConstReverseModifierOrder */'], - 'type for OO constant, first of multi-intersect' => ['/* testTypeIntersectionOOConstMulti1 */'], - 'type for OO constant, middle of multi-intersect + comments' => ['/* testTypeIntersectionOOConstMulti2 */'], - 'type for OO constant, last of multi-intersect' => ['/* testTypeIntersectionOOConstMulti3 */'], - 'type for OO constant, using namespace relative names' => ['/* testTypeIntersectionOOConstNamespaceRelative */'], - 'type for OO constant, using partially qualified names' => ['/* testTypeIntersectionOOConstPartiallyQualified */'], - 'type for OO constant, using fully qualified names' => ['/* testTypeIntersectionOOConstFullyQualified */'], - 'type for static property' => ['/* testTypeIntersectionPropertySimple */'], - 'type for static property, reversed modifier order' => ['/* testTypeIntersectionPropertyReverseModifierOrder */'], - 'type for property, first of multi-intersect' => ['/* testTypeIntersectionPropertyMulti1 */'], - 'type for property, middle of multi-intersect, also comments' => ['/* testTypeIntersectionPropertyMulti2 */'], - 'type for property, last of multi-intersect' => ['/* testTypeIntersectionPropertyMulti3 */'], - 'type for property using namespace relative names' => ['/* testTypeIntersectionPropertyNamespaceRelative */'], - 'type for property using partially qualified names' => ['/* testTypeIntersectionPropertyPartiallyQualified */'], - 'type for property using fully qualified names' => ['/* testTypeIntersectionPropertyFullyQualified */'], - 'type for readonly property' => ['/* testTypeIntersectionPropertyWithReadOnlyKeyword */'], - 'type for static readonly property' => ['/* testTypeIntersectionPropertyWithStaticKeyword */'], - 'type for final property' => ['/* testTypeIntersectionWithPHP84FinalKeyword */'], - 'type for final property reversed modifier order' => ['/* testTypeIntersectionWithPHP84FinalKeywordFirst */'], - 'type for asymmetric visibility (private(set)) property' => ['/* testTypeIntersectionPropertyWithPrivateSet */'], - 'type for asymmetric visibility (public private(set)) prop' => ['/* testTypeIntersectionPropertyWithPublicPrivateSet */'], - 'type for asymmetric visibility (protected(set)) property' => ['/* testTypeIntersectionPropertyWithProtectedSet */'], - 'type for asymmetric visibility (public protected(set)) prop' => ['/* testTypeIntersectionPropertyWithPublicProtectedSet */'], - 'type for abstract property' => ['/* testTypeIntersectionWithPHP84AbstractKeyword */'], - 'type for abstract property reversed modifier order' => ['/* testTypeIntersectionWithPHP84AbstractKeywordFirst */'], - 'type for method parameter' => ['/* testTypeIntersectionParam1 */'], - 'type for method parameter, first in multi-intersect' => ['/* testTypeIntersectionParam2 */'], - 'type for method parameter, last in multi-intersect' => ['/* testTypeIntersectionParam3 */'], - 'type for method parameter with namespace relative names' => ['/* testTypeIntersectionParamNamespaceRelative */'], - 'type for method parameter with partially qualified names' => ['/* testTypeIntersectionParamPartiallyQualified */'], - 'type for method parameter with fully qualified names' => ['/* testTypeIntersectionParamFullyQualified */'], - 'type for property in constructor property promotion' => ['/* testTypeIntersectionConstructorPropertyPromotion */'], - 'return type for method' => ['/* testTypeIntersectionReturnType */'], - 'return type for method, first of multi-intersect' => ['/* testTypeIntersectionAbstractMethodReturnType1 */'], - 'return type for method, last of multi-intersect' => ['/* testTypeIntersectionAbstractMethodReturnType2 */'], - 'return type for method with namespace relative names' => ['/* testTypeIntersectionReturnTypeNamespaceRelative */'], - 'return type for method with partially qualified names' => ['/* testTypeIntersectionReturnPartiallyQualified */'], - 'return type for method with fully qualified names' => ['/* testTypeIntersectionReturnFullyQualified */'], - 'type for function parameter with reference' => ['/* testTypeIntersectionWithReference */'], - 'type for function parameter with spread operator' => ['/* testTypeIntersectionWithSpreadOperator */'], - 'DNF type for OO constant, union before DNF' => ['/* testTypeIntersectionConstantTypeUnionBeforeDNF */'], - 'DNF type for property, union after DNF' => ['/* testTypeIntersectionPropertyTypeUnionAfterDNF */'], - 'DNF type for function param, union before and after DNF' => ['/* testTypeIntersectionParamUnionBeforeAndAfterDNF */'], - 'DNF type for function return, union after DNF with null' => ['/* testTypeIntersectionReturnTypeUnionAfterDNF */'], - 'type for closure parameter with illegal nullable' => ['/* testTypeIntersectionClosureParamIllegalNullable */'], - 'return type for closure' => ['/* testTypeIntersectionClosureReturn */'], - 'type for arrow function parameter' => ['/* testTypeIntersectionArrowParam */'], - 'return type for arrow function' => ['/* testTypeIntersectionArrowReturnType */'], - 'type for function parameter, return by ref' => ['/* testTypeIntersectionNonArrowFunctionDeclaration */'], - 'type for function parameter with invalid types' => ['/* testTypeIntersectionWithInvalidTypes */'], - ]; - - }//end dataTypeIntersection() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/TypedConstantsTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/TypedConstantsTest.inc deleted file mode 100644 index 4c6212b..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/TypedConstantsTest.inc +++ /dev/null @@ -1,156 +0,0 @@ -const ? 0 : 1; - -/* testGlobalConstantCannotBeTyped */ -const GLOBAL_UNTYPED = true; - -/* testGlobalConstantTypedShouldStillBeHandled */ -const ?int GLOBAL_TYPED = true; - -class ClassWithPlainTypedConstants { - /* testClassConstFinalUntyped */ - final const FINAL_UNTYPED = true; - - /* testClassConstVisibilityUntyped */ - public const /*comment*/VISIBLE_UNTYPED = true; - - /* testClassConstTypedTrue */ - const true TYPED_TRUE = true; - /* testClassConstTypedFalse */ - final const false TYPED_FALSE = false; - /* testClassConstTypedNull */ - public const null TYPED_NULL = null; - /* testClassConstTypedBool */ - final protected const/*comment*/bool TYPED_BOOL = false; - /* testClassConstTypedInt */ - private const int TYPED_INT = 0; - /* testClassConstTypedFloat */ - const float TYPED_FLOAT = 0.5; - /* testClassConstTypedString */ - public final const string/*comment*/TYPED_STRING = 'string'; - /* testClassConstTypedArray */ - private final const array TYPED_ARRAY = []; - /* testClassConstTypedObject */ - const - object - TYPED_OBJECT = MyClass::getInstance(); - /* testClassConstTypedIterable */ - const iterable typed_iterable = []; - /* testClassConstTypedMixed */ - const mixed TYPED_MIXED = 'string'; - - /* testClassConstTypedClassUnqualified */ - const MyClass TYPED_UNQUALIFIED_CLASSNAME = MyClass::getInstance(); - /* testClassConstTypedClassFullyQualified */ - public const \MyClass TYPED_FULLY_QUALIFIED_CLASSNAME = MyClass::getInstance(); - /* testClassConstTypedClassNamespaceRelative */ - protected const namespace\MyClass TYPED_NAMESPACE_RELATIVE_CLASSNAME = MyClass::getInstance(); - /* testClassConstTypedClassPartiallyQualified */ - private const Partial\MyClass TYPED_PARTIALLY_QUALIFIED_CLASSNAME = MyClass::getInstance(); - /* testClassConstTypedParent */ - const parent TYPED_PARENT = parent::getInstance(); - - // Illegal types - the fact that these are not allowed in PHP is not the concern of the PHPCS tokenizer. - /* testClassConstTypedCallable */ - protected const callable TYPED_CALLABLE = 'function_name'; - /* testClassConstTypedVoid */ - protected const void TYPED_VOID = null; - /* testClassConstTypedNever */ - protected const NEVER TYPED_NEVER = null; -} - -trait TraitWithNullableTypedConstants { - /* testTraitConstTypedNullableTrue */ - const ?true TYPED_TRUE = true; - /* testTraitConstTypedNullableFalse */ - final const ?false TYPED_FALSE = false; - /* testTraitConstTypedNullableNull */ - public const ?null TYPED_NULL = null; - /* testTraitConstTypedNullableBool */ - final protected const ?bool TYPED_BOOL = false; - /* testTraitConstTypedNullableInt */ - private const ?int TYPED_INT = 0; - /* testTraitConstTypedNullableFloat */ - const ? /*comment*/ float TYPED_FLOAT = 0.5; - /* testTraitConstTypedNullableString */ - public final const ?string TYPED_STRING = 'string'; - /* testTraitConstTypedNullableArray */ - private final const ? array TYPED_ARRAY = []; - /* testTraitConstTypedNullableObject */ - const ?object TYPED_OBJECT = MyClass::getInstance(); - /* testTraitConstTypedNullableIterable */ - const ?iterable TYPED_ITERABLE = []; - /* testTraitConstTypedNullableMixed */ - const ?mixed TYPED_MIXED = 'string'; - - /* testTraitConstTypedNullableClassUnqualified */ - const ?MyClass TYPED_UNQUALIFIED_CLASSNAME = MyClass::getInstance(); - /* testTraitConstTypedNullableClassFullyQualified */ - public const ?\MyClass TYPED_FULLY_QUALIFIED_CLASSNAME = MyClass::getInstance(); - /* testTraitConstTypedNullableClassNamespaceRelative */ - protected const ?namespace\MyClass TYPED_NAMESPACE_RELATIVE_CLASSNAME = MyClass::getInstance(); - /* testTraitConstTypedNullableClassPartiallyQualified */ - private const ?Partial\MyClass TYPED_PARTIALLY_QUALIFIED_CLASSNAME = MyClass::getInstance(); - /* testTraitConstTypedNullableParent */ - const ?parent TYPED_PARENT = parent::getInstance(); -} - -interface InterfaceWithUnionTypedConstants { - /* testInterfaceConstTypedUnionTrueNull */ - const true|null /*comment*/ UNION_TRUE_NULL = true; - /* testInterfaceConstTypedUnionArrayObject */ - const array|object UNION_ARRAY_OBJECT = []; - /* testInterfaceConstTypedUnionStringArrayInt */ - const string | array | int UNION_STRING_ARRAY_INT = 'array middle'; - /* testInterfaceConstTypedUnionFloatBoolArray */ - const float /*comment*/| bool|array UNION_FLOAT_BOOL_ARRAY = false; - /* testInterfaceConstTypedUnionIterableFalse */ - const iterable|false UNION_ITERABLE_FALSE = false; - /* testInterfaceConstTypedUnionUnqualifiedNamespaceRelative */ - const Unqualified|namespace\Relative UNION_UNQUALIFIED_NSRELATIVE = new Unqualified(); - /* testInterfaceConstTypedUnionFullyQualifiedPartiallyQualified */ - const \Fully\Qualified|Partially\Qualified UNION_FQN_PARTIAL = new Partial\Qualified; -} - -enum EnumWithIntersectionTypedConstants { - // Illegal types in a class, but legal in an enum. - /* testEnumConstTypedSelf */ - final const self TYPED_SELF = self::getInstance(); - /* testEnumConstTypedStatic */ - const static TYPED_STATIC = static::getInstance(); - /* testEnumConstTypedNullableSelf */ - public const ?self TYPED_SELF = self::getInstance(); - /* testEnumConstTypedNullableStatic */ - const ?static TYPED_STATIC = static::getInstance(); - - /* testEnumConstTypedIntersectUnqualifiedNamespaceRelative */ - const Unqualified&namespace\Relative UNION_UNQUALIFIED_NSRELATIVE = new Unqualified(); - /* testEnumConstTypedIntersectFullyQualifiedPartiallyQualified */ - const \Fully\Qualified&Partially\Qualified UNION_FQN_PARTIAL = new Partial\Qualified; -} - -$anonClassWithDNFTypes = new class() extends Something { - /* testAnonClassConstDNFTypeNullAfter */ - const (A&B)|null DNF_OR_NULL_1 = null; - /* testAnonClassConstDNFTypeNullBefore */ - public final const NULL|(A&B) DNF_OR_NULL_2 = null; - /* testAnonClassConstDNFTypeFalseBefore */ - final const false|(C&D) DNF_OR_FALSE = false; - /* testAnonClassConstDNFTypeTrueAfter */ - private final const ( F & G ) | true DNF_OR_ARRAY = true; - /* testAnonClassConstDNFTypeTrueBeforeFalseAfter */ - public const TRUE|(SplBool&Stringable)|FALSE DNF_OR_BOOL = true; - /* testAnonClassConstDNFTypeArrayAfter */ - final protected const (Traversable&Countable)|array DNF_OR_ARRAY_1 = []; - /* testAnonClassConstDNFTypeArrayBefore */ - private const array /*comment*/ | ( Traversable /*comment*/ & Countable ) DNF_OR_ARRAY_2 = new MyClass; - /* testAnonClassConstDNFTypeInvalidNullable */ - const ? (Invalid&Fatal)|NullableNotAllowed DNF = null; - - /* testAnonClassConstDNFTypeFQNRelativePartiallyQualified */ - const (\FQN&namespace\Relative)|Partially\Qualified DNF_CLASSNAME = MyClass::getInstance(); - /* testAnonClassConstDNFTypeParentSelfStatic */ - const (parent&self)|static DNF_PARENT = parent::getInstance(); -}; diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/TypedConstantsTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/TypedConstantsTest.php deleted file mode 100644 index 8a69f8c..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/TypedConstantsTest.php +++ /dev/null @@ -1,668 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\PHP; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; -use PHP_CodeSniffer\Util\Tokens; - -final class TypedConstantsTest extends AbstractTokenizerTestCase -{ - - - /** - * Test that a ? after a "const" which is not the constant keyword is tokenized as ternary then, not as the nullable operator. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testTernaryIsInlineThen() - { - $tokens = $this->phpcsFile->getTokens(); - $target = $this->getTargetToken('/* testTernaryIsTernaryAfterConst */', [T_NULLABLE, T_INLINE_THEN]); - - $this->assertSame( - T_INLINE_THEN, - $tokens[$target]['code'], - 'Token tokenized as '.Tokens::tokenName($tokens[$target]['code']).', not T_INLINE_THEN (code)' - ); - $this->assertSame( - 'T_INLINE_THEN', - $tokens[$target]['type'], - 'Token tokenized as '.$tokens[$target]['type'].', not T_INLINE_THEN (type)' - ); - - }//end testTernaryIsInlineThen() - - - /** - * Test the token name for an untyped constant is tokenized as T_STRING. - * - * @param string $testMarker The comment prefacing the target token. - * - * @dataProvider dataUntypedConstant - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testUntypedConstant($testMarker) - { - $tokens = $this->phpcsFile->getTokens(); - $target = $this->getTargetToken($testMarker, T_CONST); - - for ($i = ($target + 1); $tokens[$i]['code'] !== T_EQUAL; $i++) { - if (isset(Tokens::$emptyTokens[$tokens[$i]['code']]) === true) { - // Ignore whitespace and comments, not interested in the tokenization of those. - continue; - } - - $this->assertSame( - T_STRING, - $tokens[$i]['code'], - 'Token tokenized as '.Tokens::tokenName($tokens[$i]['code']).', not T_STRING (code)' - ); - $this->assertSame( - 'T_STRING', - $tokens[$i]['type'], - 'Token tokenized as '.$tokens[$i]['type'].', not T_STRING (type)' - ); - } - - }//end testUntypedConstant() - - - /** - * Data provider. - * - * @see testUntypedConstant() - * - * @return array> - */ - public static function dataUntypedConstant() - { - return [ - 'non OO constant (untyped)' => [ - 'testMarker' => '/* testGlobalConstantCannotBeTyped */', - ], - 'OO constant, final, untyped' => [ - 'testMarker' => '/* testClassConstFinalUntyped */', - ], - 'OO constant, public, untyped, with comment' => [ - 'testMarker' => '/* testClassConstVisibilityUntyped */', - ], - ]; - - }//end dataUntypedConstant() - - - /** - * Test the tokens in the type of a typed constant as well as the constant name are tokenized correctly. - * - * @param string $testMarker The comment prefacing the target token. - * @param array $sequence The expected token sequence. - * - * @dataProvider dataTypedConstant - * @dataProvider dataNullableTypedConstant - * @dataProvider dataUnionTypedConstant - * @dataProvider dataIntersectionTypedConstant - * @dataProvider dataDNFTypedConstant - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * @covers PHP_CodeSniffer\Tokenizers\PHP::processAdditional - * - * @return void - */ - public function testTypedConstant($testMarker, array $sequence) - { - $tokens = $this->phpcsFile->getTokens(); - $target = $this->getTargetToken($testMarker, T_CONST); - - $current = 0; - for ($i = ($target + 1); $tokens[$i]['code'] !== T_EQUAL; $i++) { - if (isset(Tokens::$emptyTokens[$tokens[$i]['code']]) === true) { - // Ignore whitespace and comments, not interested in the tokenization of those. - continue; - } - - $this->assertSame( - $sequence[$current], - $tokens[$i]['code'], - 'Token tokenized as '.Tokens::tokenName($tokens[$i]['code']).', not '.Tokens::tokenName($sequence[$current]).' (code)' - ); - - ++$current; - } - - }//end testTypedConstant() - - - /** - * Data provider. - * - * @see testTypedConstant() - * - * @return array>> - */ - public static function dataTypedConstant() - { - $data = [ - 'simple type: true' => [ - 'testMarker' => '/* testClassConstTypedTrue */', - 'sequence' => [T_TRUE], - ], - 'simple type: false' => [ - 'testMarker' => '/* testClassConstTypedFalse */', - 'sequence' => [T_FALSE], - ], - 'simple type: null' => [ - 'testMarker' => '/* testClassConstTypedNull */', - 'sequence' => [T_NULL], - ], - 'simple type: bool' => [ - 'testMarker' => '/* testClassConstTypedBool */', - 'sequence' => [T_STRING], - ], - 'simple type: int' => [ - 'testMarker' => '/* testClassConstTypedInt */', - 'sequence' => [T_STRING], - ], - 'simple type: float' => [ - 'testMarker' => '/* testClassConstTypedFloat */', - 'sequence' => [T_STRING], - ], - 'simple type: string' => [ - 'testMarker' => '/* testClassConstTypedString */', - 'sequence' => [T_STRING], - ], - 'simple type: array' => [ - 'testMarker' => '/* testClassConstTypedArray */', - 'sequence' => [T_STRING], - ], - 'simple type: object' => [ - 'testMarker' => '/* testClassConstTypedObject */', - 'sequence' => [T_STRING], - ], - 'simple type: iterable' => [ - 'testMarker' => '/* testClassConstTypedIterable */', - 'sequence' => [T_STRING], - ], - 'simple type: mixed' => [ - 'testMarker' => '/* testClassConstTypedMixed */', - 'sequence' => [T_STRING], - ], - 'simple type: unqualified name' => [ - 'testMarker' => '/* testClassConstTypedClassUnqualified */', - 'sequence' => [T_STRING], - ], - 'simple type: fully qualified name' => [ - 'testMarker' => '/* testClassConstTypedClassFullyQualified */', - 'sequence' => [ - T_NS_SEPARATOR, - T_STRING, - ], - ], - 'simple type: namespace relative name' => [ - 'testMarker' => '/* testClassConstTypedClassNamespaceRelative */', - 'sequence' => [ - T_NAMESPACE, - T_NS_SEPARATOR, - T_STRING, - ], - ], - 'simple type: partially qualified name' => [ - 'testMarker' => '/* testClassConstTypedClassPartiallyQualified */', - 'sequence' => [ - T_STRING, - T_NS_SEPARATOR, - T_STRING, - ], - ], - 'simple type: parent' => [ - 'testMarker' => '/* testClassConstTypedParent */', - 'sequence' => [T_PARENT], - ], - - 'simple type: callable (invalid)' => [ - 'testMarker' => '/* testClassConstTypedCallable */', - 'sequence' => [T_CALLABLE], - ], - 'simple type: void (invalid)' => [ - 'testMarker' => '/* testClassConstTypedVoid */', - 'sequence' => [T_STRING], - ], - 'simple type: NEVER (invalid)' => [ - 'testMarker' => '/* testClassConstTypedNever */', - 'sequence' => [T_STRING], - ], - - 'simple type: self (only valid in enum)' => [ - 'testMarker' => '/* testEnumConstTypedSelf */', - 'sequence' => [T_SELF], - ], - 'simple type: static (only valid in enum)' => [ - 'testMarker' => '/* testEnumConstTypedStatic */', - 'sequence' => [T_STATIC], - ], - ]; - - // The constant name, as the last token in the sequence, is always T_STRING. - foreach ($data as $key => $value) { - $data[$key]['sequence'][] = T_STRING; - } - - return $data; - - }//end dataTypedConstant() - - - /** - * Data provider. - * - * @see testTypedConstant() - * - * @return array>> - */ - public static function dataNullableTypedConstant() - { - $data = [ - // Global constants cannot be typed in PHP, but that's not our concern. - 'global typed constant, invalid, ?int' => [ - 'testMarker' => '/* testGlobalConstantTypedShouldStillBeHandled */', - 'sequence' => [T_STRING], - ], - - // OO constants. - 'nullable type: true' => [ - 'testMarker' => '/* testTraitConstTypedNullableTrue */', - 'sequence' => [T_TRUE], - ], - 'nullable type: false' => [ - 'testMarker' => '/* testTraitConstTypedNullableFalse */', - 'sequence' => [T_FALSE], - ], - 'nullable type: null' => [ - 'testMarker' => '/* testTraitConstTypedNullableNull */', - 'sequence' => [T_NULL], - ], - 'nullable type: bool' => [ - 'testMarker' => '/* testTraitConstTypedNullableBool */', - 'sequence' => [T_STRING], - ], - 'nullable type: int' => [ - 'testMarker' => '/* testTraitConstTypedNullableInt */', - 'sequence' => [T_STRING], - ], - 'nullable type: float' => [ - 'testMarker' => '/* testTraitConstTypedNullableFloat */', - 'sequence' => [T_STRING], - ], - 'nullable type: string' => [ - 'testMarker' => '/* testTraitConstTypedNullableString */', - 'sequence' => [T_STRING], - ], - 'nullable type: array' => [ - 'testMarker' => '/* testTraitConstTypedNullableArray */', - 'sequence' => [T_STRING], - ], - 'nullable type: object' => [ - 'testMarker' => '/* testTraitConstTypedNullableObject */', - 'sequence' => [T_STRING], - ], - 'nullable type: iterable' => [ - 'testMarker' => '/* testTraitConstTypedNullableIterable */', - 'sequence' => [T_STRING], - ], - 'nullable type: mixed' => [ - 'testMarker' => '/* testTraitConstTypedNullableMixed */', - 'sequence' => [T_STRING], - ], - 'nullable type: unqualified name' => [ - 'testMarker' => '/* testTraitConstTypedNullableClassUnqualified */', - 'sequence' => [T_STRING], - ], - 'nullable type: fully qualified name' => [ - 'testMarker' => '/* testTraitConstTypedNullableClassFullyQualified */', - 'sequence' => [ - T_NS_SEPARATOR, - T_STRING, - ], - ], - 'nullable type: namespace relative name' => [ - 'testMarker' => '/* testTraitConstTypedNullableClassNamespaceRelative */', - 'sequence' => [ - T_NAMESPACE, - T_NS_SEPARATOR, - T_STRING, - ], - ], - 'nullable type: partially qualified name' => [ - 'testMarker' => '/* testTraitConstTypedNullableClassPartiallyQualified */', - 'sequence' => [ - T_STRING, - T_NS_SEPARATOR, - T_STRING, - ], - ], - 'nullable type: parent' => [ - 'testMarker' => '/* testTraitConstTypedNullableParent */', - 'sequence' => [T_PARENT], - ], - - 'nullable type: self (only valid in enum)' => [ - 'testMarker' => '/* testEnumConstTypedNullableSelf */', - 'sequence' => [T_SELF], - ], - 'nullable type: static (only valid in enum)' => [ - 'testMarker' => '/* testEnumConstTypedNullableStatic */', - 'sequence' => [T_STATIC], - ], - ]; - - // The nullable operator, as the first token in the sequence, is always T_NULLABLE. - // The constant name, as the last token in the sequence, is always T_STRING. - foreach ($data as $key => $value) { - array_unshift($data[$key]['sequence'], T_NULLABLE); - $data[$key]['sequence'][] = T_STRING; - } - - return $data; - - }//end dataNullableTypedConstant() - - - /** - * Data provider. - * - * @see testTypedConstant() - * - * @return array>> - */ - public static function dataUnionTypedConstant() - { - $data = [ - 'union type: true|null' => [ - 'testMarker' => '/* testInterfaceConstTypedUnionTrueNull */', - 'sequence' => [ - T_TRUE, - T_TYPE_UNION, - T_NULL, - ], - ], - 'union type: array|object' => [ - 'testMarker' => '/* testInterfaceConstTypedUnionArrayObject */', - 'sequence' => [ - T_STRING, - T_TYPE_UNION, - T_STRING, - ], - ], - 'union type: string|array|int' => [ - 'testMarker' => '/* testInterfaceConstTypedUnionStringArrayInt */', - 'sequence' => [ - T_STRING, - T_TYPE_UNION, - T_STRING, - T_TYPE_UNION, - T_STRING, - ], - ], - 'union type: float|bool|array' => [ - 'testMarker' => '/* testInterfaceConstTypedUnionFloatBoolArray */', - 'sequence' => [ - T_STRING, - T_TYPE_UNION, - T_STRING, - T_TYPE_UNION, - T_STRING, - ], - ], - 'union type: iterable|false' => [ - 'testMarker' => '/* testInterfaceConstTypedUnionIterableFalse */', - 'sequence' => [ - T_STRING, - T_TYPE_UNION, - T_FALSE, - ], - ], - 'union type: Unqualified|Namespace\Relative' => [ - 'testMarker' => '/* testInterfaceConstTypedUnionUnqualifiedNamespaceRelative */', - 'sequence' => [ - T_STRING, - T_TYPE_UNION, - T_NAMESPACE, - T_NS_SEPARATOR, - T_STRING, - ], - ], - 'union type: FQN|Partial' => [ - 'testMarker' => '/* testInterfaceConstTypedUnionFullyQualifiedPartiallyQualified */', - 'sequence' => [ - T_NS_SEPARATOR, - T_STRING, - T_NS_SEPARATOR, - T_STRING, - T_TYPE_UNION, - T_STRING, - T_NS_SEPARATOR, - T_STRING, - ], - ], - ]; - - // The constant name, as the last token in the sequence, is always T_STRING. - foreach ($data as $key => $value) { - $data[$key]['sequence'][] = T_STRING; - } - - return $data; - - }//end dataUnionTypedConstant() - - - /** - * Data provider. - * - * @see testTypedConstant() - * - * @return array>> - */ - public static function dataIntersectionTypedConstant() - { - $data = [ - 'intersection type: Unqualified&Namespace\Relative' => [ - 'testMarker' => '/* testEnumConstTypedIntersectUnqualifiedNamespaceRelative */', - 'sequence' => [ - T_STRING, - T_TYPE_INTERSECTION, - T_NAMESPACE, - T_NS_SEPARATOR, - T_STRING, - ], - ], - 'intersection type: FQN&Partial' => [ - 'testMarker' => '/* testEnumConstTypedIntersectFullyQualifiedPartiallyQualified */', - 'sequence' => [ - T_NS_SEPARATOR, - T_STRING, - T_NS_SEPARATOR, - T_STRING, - T_TYPE_INTERSECTION, - T_STRING, - T_NS_SEPARATOR, - T_STRING, - ], - ], - ]; - - // The constant name, as the last token in the sequence, is always T_STRING. - foreach ($data as $key => $value) { - $data[$key]['sequence'][] = T_STRING; - } - - return $data; - - }//end dataIntersectionTypedConstant() - - - /** - * Data provider. - * - * @see testTypedConstant() - * - * @return array>> - */ - public static function dataDNFTypedConstant() - { - $data = [ - 'DNF type: null after' => [ - 'testMarker' => '/* testAnonClassConstDNFTypeNullAfter */', - 'sequence' => [ - T_TYPE_OPEN_PARENTHESIS, - T_STRING, - T_TYPE_INTERSECTION, - T_STRING, - T_TYPE_CLOSE_PARENTHESIS, - T_TYPE_UNION, - T_NULL, - ], - ], - 'DNF type: null before' => [ - 'testMarker' => '/* testAnonClassConstDNFTypeNullBefore */', - 'sequence' => [ - T_NULL, - T_TYPE_UNION, - T_TYPE_OPEN_PARENTHESIS, - T_STRING, - T_TYPE_INTERSECTION, - T_STRING, - T_TYPE_CLOSE_PARENTHESIS, - ], - ], - 'DNF type: false before' => [ - 'testMarker' => '/* testAnonClassConstDNFTypeFalseBefore */', - 'sequence' => [ - T_FALSE, - T_TYPE_UNION, - T_TYPE_OPEN_PARENTHESIS, - T_STRING, - T_TYPE_INTERSECTION, - T_STRING, - T_TYPE_CLOSE_PARENTHESIS, - ], - ], - 'DNF type: true after' => [ - 'testMarker' => '/* testAnonClassConstDNFTypeTrueAfter */', - 'sequence' => [ - T_TYPE_OPEN_PARENTHESIS, - T_STRING, - T_TYPE_INTERSECTION, - T_STRING, - T_TYPE_CLOSE_PARENTHESIS, - T_TYPE_UNION, - T_TRUE, - ], - ], - 'DNF type: true before, false after' => [ - 'testMarker' => '/* testAnonClassConstDNFTypeTrueBeforeFalseAfter */', - 'sequence' => [ - T_TRUE, - T_TYPE_UNION, - T_TYPE_OPEN_PARENTHESIS, - T_STRING, - T_TYPE_INTERSECTION, - T_STRING, - T_TYPE_CLOSE_PARENTHESIS, - T_TYPE_UNION, - T_FALSE, - ], - ], - 'DNF type: array after' => [ - 'testMarker' => '/* testAnonClassConstDNFTypeArrayAfter */', - 'sequence' => [ - T_TYPE_OPEN_PARENTHESIS, - T_STRING, - T_TYPE_INTERSECTION, - T_STRING, - T_TYPE_CLOSE_PARENTHESIS, - T_TYPE_UNION, - T_STRING, - ], - ], - 'DNF type: array before' => [ - 'testMarker' => '/* testAnonClassConstDNFTypeArrayBefore */', - 'sequence' => [ - T_STRING, - T_TYPE_UNION, - T_TYPE_OPEN_PARENTHESIS, - T_STRING, - T_TYPE_INTERSECTION, - T_STRING, - T_TYPE_CLOSE_PARENTHESIS, - ], - ], - 'DNF type: invalid nullable DNF' => [ - 'testMarker' => '/* testAnonClassConstDNFTypeInvalidNullable */', - 'sequence' => [ - T_NULLABLE, - T_TYPE_OPEN_PARENTHESIS, - T_STRING, - T_TYPE_INTERSECTION, - T_STRING, - T_TYPE_CLOSE_PARENTHESIS, - T_TYPE_UNION, - T_STRING, - ], - ], - 'DNF type: FQN/namespace relative/partially qualified names' => [ - 'testMarker' => '/* testAnonClassConstDNFTypeFQNRelativePartiallyQualified */', - 'sequence' => [ - T_TYPE_OPEN_PARENTHESIS, - T_NS_SEPARATOR, - T_STRING, - T_TYPE_INTERSECTION, - T_NAMESPACE, - T_NS_SEPARATOR, - T_STRING, - T_TYPE_CLOSE_PARENTHESIS, - T_TYPE_UNION, - T_STRING, - T_NS_SEPARATOR, - T_STRING, - ], - ], - 'DNF type: invalid self/parent/static' => [ - 'testMarker' => '/* testAnonClassConstDNFTypeParentSelfStatic */', - 'sequence' => [ - T_TYPE_OPEN_PARENTHESIS, - T_PARENT, - T_TYPE_INTERSECTION, - T_SELF, - T_TYPE_CLOSE_PARENTHESIS, - T_TYPE_UNION, - T_STATIC, - ], - ], - ]; - - // The constant name, as the last token in the sequence, is always T_STRING. - foreach ($data as $key => $value) { - $data[$key]['sequence'][] = T_STRING; - } - - return $data; - - }//end dataDNFTypedConstant() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/UndoNamespacedNameSingleTokenTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/UndoNamespacedNameSingleTokenTest.inc deleted file mode 100644 index 50dccbd..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/UndoNamespacedNameSingleTokenTest.inc +++ /dev/null @@ -1,200 +0,0 @@ - - * @copyright 2020 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\PHP; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; -use PHP_CodeSniffer\Util\Tokens; - -final class UndoNamespacedNameSingleTokenTest extends AbstractTokenizerTestCase -{ - - - /** - * Test that identifier names are tokenized the same across PHP versions, based on the PHP 5/7 tokenization. - * - * @param string $testMarker The comment prefacing the test. - * @param array> $expectedTokens The tokenization expected. - * - * @dataProvider dataIdentifierTokenization - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - * - * @return void - */ - public function testIdentifierTokenization($testMarker, $expectedTokens) - { - $tokens = $this->phpcsFile->getTokens(); - $identifier = $this->getTargetToken($testMarker, constant($expectedTokens[0]['type'])); - - foreach ($expectedTokens as $tokenInfo) { - $this->assertSame( - constant($tokenInfo['type']), - $tokens[$identifier]['code'], - 'Token tokenized as '.Tokens::tokenName($tokens[$identifier]['code']).', not '.$tokenInfo['type'].' (code)' - ); - $this->assertSame( - $tokenInfo['type'], - $tokens[$identifier]['type'], - 'Token tokenized as '.$tokens[$identifier]['type'].', not '.$tokenInfo['type'].' (type)' - ); - $this->assertSame($tokenInfo['content'], $tokens[$identifier]['content']); - - ++$identifier; - } - - }//end testIdentifierTokenization() - - - /** - * Data provider. - * - * @see testIdentifierTokenization() - * - * @return array>>> - */ - public static function dataIdentifierTokenization() - { - return [ - 'namespace declaration' => [ - 'testMarker' => '/* testNamespaceDeclaration */', - 'expectedTokens' => [ - [ - 'type' => 'T_STRING', - 'content' => 'Package', - ], - [ - 'type' => 'T_SEMICOLON', - 'content' => ';', - ], - ], - ], - 'namespace declaration, multi-level' => [ - 'testMarker' => '/* testNamespaceDeclarationWithLevels */', - 'expectedTokens' => [ - [ - 'type' => 'T_STRING', - 'content' => 'Vendor', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'SubLevel', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Domain', - ], - [ - 'type' => 'T_SEMICOLON', - 'content' => ';', - ], - ], - ], - 'import use statement, class' => [ - 'testMarker' => '/* testUseStatement */', - 'expectedTokens' => [ - [ - 'type' => 'T_STRING', - 'content' => 'ClassName', - ], - [ - 'type' => 'T_SEMICOLON', - 'content' => ';', - ], - ], - ], - 'import use statement, class, multi-level' => [ - 'testMarker' => '/* testUseStatementWithLevels */', - 'expectedTokens' => [ - [ - 'type' => 'T_STRING', - 'content' => 'Vendor', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Level', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Domain', - ], - [ - 'type' => 'T_SEMICOLON', - 'content' => ';', - ], - ], - ], - 'import use statement, function' => [ - 'testMarker' => '/* testFunctionUseStatement */', - 'expectedTokens' => [ - [ - 'type' => 'T_STRING', - 'content' => 'function', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_STRING', - 'content' => 'function_name', - ], - [ - 'type' => 'T_SEMICOLON', - 'content' => ';', - ], - ], - ], - 'import use statement, function, multi-level' => [ - 'testMarker' => '/* testFunctionUseStatementWithLevels */', - 'expectedTokens' => [ - [ - 'type' => 'T_STRING', - 'content' => 'function', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Vendor', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Level', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'function_in_ns', - ], - [ - 'type' => 'T_SEMICOLON', - 'content' => ';', - ], - ], - ], - 'import use statement, constant' => [ - 'testMarker' => '/* testConstantUseStatement */', - 'expectedTokens' => [ - [ - 'type' => 'T_STRING', - 'content' => 'const', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_STRING', - 'content' => 'CONSTANT_NAME', - ], - [ - 'type' => 'T_SEMICOLON', - 'content' => ';', - ], - ], - ], - 'import use statement, constant, multi-level' => [ - 'testMarker' => '/* testConstantUseStatementWithLevels */', - 'expectedTokens' => [ - [ - 'type' => 'T_STRING', - 'content' => 'const', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Vendor', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Level', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'OTHER_CONSTANT', - ], - [ - 'type' => 'T_SEMICOLON', - 'content' => ';', - ], - ], - ], - 'import use statement, multi-statement, unqualified class' => [ - 'testMarker' => '/* testMultiUseUnqualified */', - 'expectedTokens' => [ - [ - 'type' => 'T_STRING', - 'content' => 'UnqualifiedClassName', - ], - [ - 'type' => 'T_COMMA', - 'content' => ',', - ], - ], - ], - 'import use statement, multi-statement, partially qualified class' => [ - 'testMarker' => '/* testMultiUsePartiallyQualified */', - 'expectedTokens' => [ - [ - 'type' => 'T_STRING', - 'content' => 'Sublevel', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'PartiallyClassName', - ], - [ - 'type' => 'T_SEMICOLON', - 'content' => ';', - ], - ], - ], - 'group use statement, multi-level prefix, mix inside group' => [ - 'testMarker' => '/* testGroupUseStatement */', - 'expectedTokens' => [ - [ - 'type' => 'T_STRING', - 'content' => 'Vendor', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Level', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_OPEN_USE_GROUP', - 'content' => '{', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_STRING', - 'content' => 'AnotherDomain', - ], - [ - 'type' => 'T_COMMA', - 'content' => ',', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_STRING', - 'content' => 'function', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_STRING', - 'content' => 'function_grouped', - ], - [ - 'type' => 'T_COMMA', - 'content' => ',', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_STRING', - 'content' => 'const', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_STRING', - 'content' => 'CONSTANT_GROUPED', - ], - [ - 'type' => 'T_COMMA', - 'content' => ',', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Sub', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'YetAnotherDomain', - ], - [ - 'type' => 'T_COMMA', - 'content' => ',', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_STRING', - 'content' => 'function', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_STRING', - 'content' => 'SubLevelA', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'function_grouped_too', - ], - [ - 'type' => 'T_COMMA', - 'content' => ',', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_STRING', - 'content' => 'const', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_STRING', - 'content' => 'SubLevelB', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'CONSTANT_GROUPED_TOO', - ], - [ - 'type' => 'T_COMMA', - 'content' => ',', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - [ - 'type' => 'T_CLOSE_USE_GROUP', - 'content' => '}', - ], - [ - 'type' => 'T_SEMICOLON', - 'content' => ';', - ], - ], - ], - 'class declaration' => [ - 'testMarker' => '/* testClassName */', - 'expectedTokens' => [ - [ - 'type' => 'T_STRING', - 'content' => 'MyClass', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'class declaration, extends fully qualified name' => [ - 'testMarker' => '/* testExtendedFQN */', - 'expectedTokens' => [ - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Vendor', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Level', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'FQN', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'class declaration, implements namespace relative name' => [ - 'testMarker' => '/* testImplementsRelative */', - 'expectedTokens' => [ - [ - 'type' => 'T_NAMESPACE', - 'content' => 'namespace', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Name', - ], - [ - 'type' => 'T_COMMA', - 'content' => ',', - ], - ], - ], - 'class declaration, implements fully qualified name' => [ - 'testMarker' => '/* testImplementsFQN */', - 'expectedTokens' => [ - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Fully', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Qualified', - ], - [ - 'type' => 'T_COMMA', - 'content' => ',', - ], - ], - ], - 'class declaration, implements unqualified name' => [ - 'testMarker' => '/* testImplementsUnqualified */', - 'expectedTokens' => [ - [ - 'type' => 'T_STRING', - 'content' => 'Unqualified', - ], - [ - 'type' => 'T_COMMA', - 'content' => ',', - ], - ], - ], - 'class declaration, implements partially qualified name' => [ - 'testMarker' => '/* testImplementsPartiallyQualified */', - 'expectedTokens' => [ - [ - 'type' => 'T_STRING', - 'content' => 'Sub', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Level', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Name', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'method declaration' => [ - 'testMarker' => '/* testFunctionName */', - 'expectedTokens' => [ - [ - 'type' => 'T_STRING', - 'content' => 'function_name', - ], - [ - 'type' => 'T_OPEN_PARENTHESIS', - 'content' => '(', - ], - ], - ], - 'param type declaration, namespace relative name' => [ - 'testMarker' => '/* testTypeDeclarationRelative */', - 'expectedTokens' => [ - [ - 'type' => 'T_NAMESPACE', - 'content' => 'namespace', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Name', - ], - [ - 'type' => 'T_TYPE_UNION', - 'content' => '|', - ], - [ - 'type' => 'T_STRING', - 'content' => 'object', - ], - ], - ], - 'param type declaration, fully qualified name' => [ - 'testMarker' => '/* testTypeDeclarationFQN */', - 'expectedTokens' => [ - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Fully', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Qualified', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Name', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - ], - ], - 'param type declaration, unqualified name' => [ - 'testMarker' => '/* testTypeDeclarationUnqualified */', - 'expectedTokens' => [ - [ - 'type' => 'T_STRING', - 'content' => 'Unqualified', - ], - [ - 'type' => 'T_TYPE_UNION', - 'content' => '|', - ], - [ - 'type' => 'T_FALSE', - 'content' => 'false', - ], - ], - ], - 'param type declaration, partially qualified name' => [ - 'testMarker' => '/* testTypeDeclarationPartiallyQualified */', - 'expectedTokens' => [ - [ - 'type' => 'T_NULLABLE', - 'content' => '?', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Sublevel', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Name', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - ], - ], - 'return type declaration, fully qualified name' => [ - 'testMarker' => '/* testReturnTypeFQN */', - 'expectedTokens' => [ - [ - 'type' => 'T_NULLABLE', - 'content' => '?', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Name', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - ], - ], - 'function call, namespace relative name' => [ - 'testMarker' => '/* testFunctionCallRelative */', - 'expectedTokens' => [ - [ - 'type' => 'T_NAMESPACE', - 'content' => 'NameSpace', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'function_name', - ], - [ - 'type' => 'T_OPEN_PARENTHESIS', - 'content' => '(', - ], - ], - ], - 'function call, fully qualified name' => [ - 'testMarker' => '/* testFunctionCallFQN */', - 'expectedTokens' => [ - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Vendor', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Package', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'function_name', - ], - [ - 'type' => 'T_OPEN_PARENTHESIS', - 'content' => '(', - ], - ], - ], - 'function call, unqualified name' => [ - 'testMarker' => '/* testFunctionCallUnqualified */', - 'expectedTokens' => [ - [ - 'type' => 'T_STRING', - 'content' => 'function_name', - ], - [ - 'type' => 'T_OPEN_PARENTHESIS', - 'content' => '(', - ], - ], - ], - 'function call, partially qualified name' => [ - 'testMarker' => '/* testFunctionCallPartiallyQualified */', - 'expectedTokens' => [ - [ - 'type' => 'T_STRING', - 'content' => 'Level', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'function_name', - ], - [ - 'type' => 'T_OPEN_PARENTHESIS', - 'content' => '(', - ], - ], - ], - 'catch, namespace relative name' => [ - 'testMarker' => '/* testCatchRelative */', - 'expectedTokens' => [ - [ - 'type' => 'T_NAMESPACE', - 'content' => 'namespace', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'SubLevel', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Exception', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - ], - ], - 'catch, fully qualified name' => [ - 'testMarker' => '/* testCatchFQN */', - 'expectedTokens' => [ - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Exception', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - ], - ], - 'catch, unqualified name' => [ - 'testMarker' => '/* testCatchUnqualified */', - 'expectedTokens' => [ - [ - 'type' => 'T_STRING', - 'content' => 'Exception', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - ], - ], - 'catch, partially qualified name' => [ - 'testMarker' => '/* testCatchPartiallyQualified */', - 'expectedTokens' => [ - [ - 'type' => 'T_STRING', - 'content' => 'Level', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Exception', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - ], - ], - 'class instantiation, namespace relative name' => [ - 'testMarker' => '/* testNewRelative */', - 'expectedTokens' => [ - [ - 'type' => 'T_NAMESPACE', - 'content' => 'namespace', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'ClassName', - ], - [ - 'type' => 'T_OPEN_PARENTHESIS', - 'content' => '(', - ], - ], - ], - 'class instantiation, fully qualified name' => [ - 'testMarker' => '/* testNewFQN */', - 'expectedTokens' => [ - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Vendor', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'ClassName', - ], - [ - 'type' => 'T_OPEN_PARENTHESIS', - 'content' => '(', - ], - ], - ], - 'class instantiation, unqualified name' => [ - 'testMarker' => '/* testNewUnqualified */', - 'expectedTokens' => [ - [ - 'type' => 'T_STRING', - 'content' => 'ClassName', - ], - [ - 'type' => 'T_SEMICOLON', - 'content' => ';', - ], - ], - ], - 'class instantiation, partially qualified name' => [ - 'testMarker' => '/* testNewPartiallyQualified */', - 'expectedTokens' => [ - [ - 'type' => 'T_STRING', - 'content' => 'Level', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'ClassName', - ], - [ - 'type' => 'T_SEMICOLON', - 'content' => ';', - ], - ], - ], - 'double colon class access, namespace relative name' => [ - 'testMarker' => '/* testDoubleColonRelative */', - 'expectedTokens' => [ - [ - 'type' => 'T_NAMESPACE', - 'content' => 'namespace', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'ClassName', - ], - [ - 'type' => 'T_DOUBLE_COLON', - 'content' => '::', - ], - ], - ], - 'double colon class access, fully qualified name' => [ - 'testMarker' => '/* testDoubleColonFQN */', - 'expectedTokens' => [ - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'ClassName', - ], - [ - 'type' => 'T_DOUBLE_COLON', - 'content' => '::', - ], - ], - ], - 'double colon class access, unqualified name' => [ - 'testMarker' => '/* testDoubleColonUnqualified */', - 'expectedTokens' => [ - [ - 'type' => 'T_STRING', - 'content' => 'ClassName', - ], - [ - 'type' => 'T_DOUBLE_COLON', - 'content' => '::', - ], - ], - ], - 'double colon class access, partially qualified name' => [ - 'testMarker' => '/* testDoubleColonPartiallyQualified */', - 'expectedTokens' => [ - [ - 'type' => 'T_STRING', - 'content' => 'Level', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'ClassName', - ], - [ - 'type' => 'T_DOUBLE_COLON', - 'content' => '::', - ], - ], - ], - 'instanceof, namespace relative name' => [ - 'testMarker' => '/* testInstanceOfRelative */', - 'expectedTokens' => [ - [ - 'type' => 'T_NAMESPACE', - 'content' => 'namespace', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'ClassName', - ], - [ - 'type' => 'T_SEMICOLON', - 'content' => ';', - ], - ], - ], - 'instanceof, fully qualified name' => [ - 'testMarker' => '/* testInstanceOfFQN */', - 'expectedTokens' => [ - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Full', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'ClassName', - ], - [ - 'type' => 'T_CLOSE_PARENTHESIS', - 'content' => ')', - ], - ], - ], - 'instanceof, unqualified name' => [ - 'testMarker' => '/* testInstanceOfUnqualified */', - 'expectedTokens' => [ - [ - 'type' => 'T_STRING', - 'content' => 'ClassName', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - ], - ], - 'instanceof, partially qualified name' => [ - 'testMarker' => '/* testInstanceOfPartiallyQualified */', - 'expectedTokens' => [ - [ - 'type' => 'T_STRING', - 'content' => 'Partially', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'ClassName', - ], - [ - 'type' => 'T_SEMICOLON', - 'content' => ';', - ], - ], - ], - 'exit in partially qualified name (start)' => [ - 'testMarker' => '/* testExitInNamespacedNameStart */', - 'expectedTokens' => [ - [ - 'type' => 'T_STRING', - 'content' => 'Exit', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Name', - ], - [ - 'type' => 'T_SEMICOLON', - 'content' => ';', - ], - ], - ], - 'exit in fully qualified name (middle)' => [ - 'testMarker' => '/* testExitInNamespacedNameMiddle */', - 'expectedTokens' => [ - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Not', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'exit', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Name', - ], - [ - 'type' => 'T_SEMICOLON', - 'content' => ';', - ], - ], - ], - 'exit in fully qualified name (end)' => [ - 'testMarker' => '/* testExitInNamespacedNameEnd */', - 'expectedTokens' => [ - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Not', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Exit', - ], - [ - 'type' => 'T_SEMICOLON', - 'content' => ';', - ], - ], - ], - 'PHP 8.4 exit as function call, fully qualified' => [ - 'testMarker' => '/* testFullyQualifiedExitFunctionCall */', - 'expectedTokens' => [ - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_EXIT', - 'content' => 'Exit', - ], - [ - 'type' => 'T_OPEN_PARENTHESIS', - 'content' => '(', - ], - ], - ], - 'exit as constant, fully qualified (illegal)' => [ - 'testMarker' => '/* testFullyQualifiedExitConstant */', - 'expectedTokens' => [ - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_EXIT', - 'content' => 'exit', - ], - [ - 'type' => 'T_SEMICOLON', - 'content' => ';', - ], - ], - ], - 'die in partially qualified name (start)' => [ - 'testMarker' => '/* testDieInNamespacedNameStart */', - 'expectedTokens' => [ - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Die', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Name', - ], - [ - 'type' => 'T_SEMICOLON', - 'content' => ';', - ], - ], - ], - 'die in fully qualified name (middle)' => [ - 'testMarker' => '/* testDieInNamespacedNameMiddle */', - 'expectedTokens' => [ - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Not', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'die', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Name', - ], - [ - 'type' => 'T_SEMICOLON', - 'content' => ';', - ], - ], - ], - 'die in fully qualified name (end)' => [ - 'testMarker' => '/* testDieInNamespacedNameEnd */', - 'expectedTokens' => [ - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Not', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'DIE', - ], - [ - 'type' => 'T_SEMICOLON', - 'content' => ';', - ], - ], - ], - 'PHP 8.4 die as function call, fully qualified' => [ - 'testMarker' => '/* testFullyQualifiedDieFunctionCall */', - 'expectedTokens' => [ - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_EXIT', - 'content' => 'die', - ], - [ - 'type' => 'T_OPEN_PARENTHESIS', - 'content' => '(', - ], - ], - ], - 'die as constant, fully qualified (illegal)' => [ - 'testMarker' => '/* testFullyQualifiedDieConstant */', - 'expectedTokens' => [ - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_EXIT', - 'content' => 'DIE', - ], - [ - 'type' => 'T_SEMICOLON', - 'content' => ';', - ], - ], - ], - 'false in partially qualified name (start)' => [ - 'testMarker' => '/* testFalseInNamespacedNameStart */', - 'expectedTokens' => [ - [ - 'type' => 'T_STRING', - 'content' => 'False', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Name', - ], - [ - 'type' => 'T_SEMICOLON', - 'content' => ';', - ], - ], - ], - 'false in fully qualified name (middle)' => [ - 'testMarker' => '/* testFalseInNamespacedNameMiddle */', - 'expectedTokens' => [ - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Not', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'false', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Name', - ], - [ - 'type' => 'T_SEMICOLON', - 'content' => ';', - ], - ], - ], - 'false in fully qualified name (end)' => [ - 'testMarker' => '/* testFalseInNamespacedNameEnd */', - 'expectedTokens' => [ - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Not', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'FALSE', - ], - [ - 'type' => 'T_SEMICOLON', - 'content' => ';', - ], - ], - ], - 'false, fully qualified' => [ - 'testMarker' => '/* testFullyQualifiedFalse */', - 'expectedTokens' => [ - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_FALSE', - 'content' => 'false', - ], - [ - 'type' => 'T_SEMICOLON', - 'content' => ';', - ], - ], - ], - 'true in partially qualified name (start)' => [ - 'testMarker' => '/* testTrueInNamespacedNameStart */', - 'expectedTokens' => [ - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'True', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Name', - ], - [ - 'type' => 'T_SEMICOLON', - 'content' => ';', - ], - ], - ], - 'true in fully qualified name (middle)' => [ - 'testMarker' => '/* testTrueInNamespacedNameMiddle */', - 'expectedTokens' => [ - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Not', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'true', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Name', - ], - [ - 'type' => 'T_SEMICOLON', - 'content' => ';', - ], - ], - ], - 'true in fully qualified name (end)' => [ - 'testMarker' => '/* testTrueInNamespacedNameEnd */', - 'expectedTokens' => [ - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Not', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'True', - ], - [ - 'type' => 'T_SEMICOLON', - 'content' => ';', - ], - ], - ], - 'true, fully qualified' => [ - 'testMarker' => '/* testFullyQualifiedTrue */', - 'expectedTokens' => [ - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_TRUE', - 'content' => 'TRUE', - ], - [ - 'type' => 'T_SEMICOLON', - 'content' => ';', - ], - ], - ], - 'null in partially qualified name (start)' => [ - 'testMarker' => '/* testNullInNamespacedNameStart */', - 'expectedTokens' => [ - [ - 'type' => 'T_STRING', - 'content' => 'Null', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Name', - ], - [ - 'type' => 'T_SEMICOLON', - 'content' => ';', - ], - ], - ], - 'null in fully qualified name (middle)' => [ - 'testMarker' => '/* testNullInNamespacedNameMiddle */', - 'expectedTokens' => [ - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Not', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Null', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Name', - ], - [ - 'type' => 'T_SEMICOLON', - 'content' => ';', - ], - ], - ], - 'null in fully qualified name (end)' => [ - 'testMarker' => '/* testNullInNamespacedNameEnd */', - 'expectedTokens' => [ - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Not', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'null', - ], - [ - 'type' => 'T_SEMICOLON', - 'content' => ';', - ], - ], - ], - 'null, fully qualified' => [ - 'testMarker' => '/* testFullyQualifiedNull */', - 'expectedTokens' => [ - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_NULL', - 'content' => 'Null', - ], - [ - 'type' => 'T_SEMICOLON', - 'content' => ';', - ], - ], - ], - - 'function call, namespace relative, with whitespace (invalid in PHP 8)' => [ - 'testMarker' => '/* testInvalidInPHP8Whitespace */', - 'expectedTokens' => [ - [ - 'type' => 'T_NAMESPACE', - 'content' => 'namespace', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Sublevel', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_STRING', - 'content' => 'function_name', - ], - [ - 'type' => 'T_OPEN_PARENTHESIS', - 'content' => '(', - ], - ], - ], - 'double colon class access, fully qualified, with whitespace and comments (invalid in PHP 8)' => [ - 'testMarker' => '/* testInvalidInPHP8Comments */', - 'expectedTokens' => [ - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Fully', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_PHPCS_IGNORE', - 'content' => '// phpcs:ignore Stnd.Cat.Sniff -- for reasons -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Qualified', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_COMMENT', - 'content' => '/* comment */', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_NS_SEPARATOR', - 'content' => '\\', - ], - [ - 'type' => 'T_STRING', - 'content' => 'Name', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - ]; - - }//end dataIdentifierTokenization() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/YieldTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/YieldTest.inc deleted file mode 100644 index 3130b84..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/YieldTest.inc +++ /dev/null @@ -1,77 +0,0 @@ -yield; - - /* testYieldUsedAsPropertyName2 */ - echo $obj?->yield(); - - /* testYieldUsedForClassConstantAccess1 */ - echo MyClass::YIELD; - /* testFromUsedForClassConstantAccess1 */ - echo MyClass::FROM; - } - - /* testYieldUsedAsMethodNameReturnByRef */ - public function &yield() {} -} - -function myGen() { - /* testYieldLiveCoding */ - yield diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/YieldTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/YieldTest.php deleted file mode 100644 index a2f37a9..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/PHP/YieldTest.php +++ /dev/null @@ -1,448 +0,0 @@ - - * @copyright 2021 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\PHP; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; -use PHP_CodeSniffer\Util\Tokens; - -/** - * Tests the tokenization of the `yield` and `yield from` keywords. - * - * @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize - */ -final class YieldTest extends AbstractTokenizerTestCase -{ - - - /** - * Test that the yield keyword is tokenized as such. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * @param string $expectedContent Expected token content. - * - * @dataProvider dataYieldKeyword - * - * @return void - */ - public function testYieldKeyword($testMarker, $expectedContent) - { - $tokens = $this->phpcsFile->getTokens(); - $target = $this->getTargetToken($testMarker, [T_YIELD, T_YIELD_FROM, T_STRING]); - $tokenArray = $tokens[$target]; - - $this->assertSame(T_YIELD, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_YIELD (code)'); - - // This assertion would fail on PHP 5.4 with PHPUnit 4 as PHPUnit polyfills the `T_YIELD` token too, but - // with a different value, which causes the token 'type' to be set to `UNKNOWN`. - // This issue _only_ occurs when running the tests, not when running PHPCS outside of a test situation. - // The PHPUnit polyfilled token is declared in the PHP_CodeCoverage_Report_HTML_Renderer_File class - // in vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/File.php. - if (PHP_VERSION_ID >= 50500) { - $this->assertSame('T_YIELD', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_YIELD (type)'); - } - - $this->assertSame($expectedContent, $tokenArray['content'], 'Token content does not match expectation'); - - }//end testYieldKeyword() - - - /** - * Data provider. - * - * @see testYieldKeyword() - * - * @return array> - */ - public static function dataYieldKeyword() - { - return [ - 'yield' => [ - 'testMarker' => '/* testYield */', - 'expectedContent' => 'yield', - ], - 'yield followed by comment' => [ - 'testMarker' => '/* testYieldFollowedByComment */', - 'expectedContent' => 'YIELD', - ], - 'yield at end of file, live coding' => [ - 'testMarker' => '/* testYieldLiveCoding */', - 'expectedContent' => 'yield', - ], - ]; - - }//end dataYieldKeyword() - - - /** - * Test that the yield from keyword is tokenized as a single token when it in on a single line - * and only has whitespace between the words. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * @param string $expectedContent Expected token content. - * - * @dataProvider dataYieldFromKeywordSingleToken - * - * @return void - */ - public function testYieldFromKeywordSingleToken($testMarker, $expectedContent) - { - $tokens = $this->phpcsFile->getTokens(); - $target = $this->getTargetToken($testMarker, [T_YIELD, T_YIELD_FROM, T_STRING]); - $tokenArray = $tokens[$target]; - - $this->assertSame(T_YIELD_FROM, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_YIELD_FROM (code)'); - $this->assertSame('T_YIELD_FROM', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_YIELD_FROM (type)'); - - if (isset($tokenArray['orig_content']) === true) { - $this->assertSame($expectedContent, $tokenArray['orig_content'], 'Token (orig) content does not match expectation'); - } else { - $this->assertSame($expectedContent, $tokenArray['content'], 'Token content does not match expectation'); - } - - }//end testYieldFromKeywordSingleToken() - - - /** - * Data provider. - * - * @see testYieldFromKeywordSingleToken() - * - * @return array> - */ - public static function dataYieldFromKeywordSingleToken() - { - return [ - 'yield from' => [ - 'testMarker' => '/* testYieldFrom */', - 'expectedContent' => 'yield from', - ], - 'yield from with extra space between' => [ - 'testMarker' => '/* testYieldFromWithExtraSpacesBetween */', - 'expectedContent' => 'Yield From', - ], - 'yield from with tab between' => [ - 'testMarker' => '/* testYieldFromWithTabBetween */', - 'expectedContent' => 'yield from', - ], - ]; - - }//end dataYieldFromKeywordSingleToken() - - - /** - * Test that the yield from keyword is tokenized as a single token when it in on a single line - * and only has whitespace between the words. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * @param array> $expectedTokens The tokenization expected. - * - * @dataProvider dataYieldFromKeywordMultiToken - * - * @return void - */ - public function testYieldFromKeywordMultiToken($testMarker, $expectedTokens) - { - $tokens = $this->phpcsFile->getTokens(); - $target = $this->getTargetToken($testMarker, [T_YIELD, T_YIELD_FROM, T_STRING]); - - foreach ($expectedTokens as $nr => $tokenInfo) { - $this->assertSame( - constant($tokenInfo['type']), - $tokens[$target]['code'], - 'Token tokenized as '.Tokens::tokenName($tokens[$target]['code']).', not '.$tokenInfo['type'].' (code)' - ); - $this->assertSame( - $tokenInfo['type'], - $tokens[$target]['type'], - 'Token tokenized as '.$tokens[$target]['type'].', not '.$tokenInfo['type'].' (type)' - ); - $this->assertSame( - $tokenInfo['content'], - $tokens[$target]['content'], - 'Content of token '.($nr + 1).' ('.$tokens[$target]['type'].') does not match expectations' - ); - - ++$target; - } - - }//end testYieldFromKeywordMultiToken() - - - /** - * Data provider. - * - * @see testYieldFromKeywordMultiToken() - * - * @return array>>> - */ - public static function dataYieldFromKeywordMultiToken() - { - return [ - 'yield from with new line' => [ - 'testMarker' => '/* testYieldFromSplitByNewLines */', - 'expectedTokens' => [ - [ - 'type' => 'T_YIELD_FROM', - 'content' => 'yield', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_YIELD_FROM', - 'content' => 'FROM', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'yield from with comment' => [ - 'testMarker' => '/* testYieldFromSplitByComment */', - 'expectedTokens' => [ - [ - 'type' => 'T_YIELD_FROM', - 'content' => 'yield', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_COMMENT', - 'content' => '/* comment */', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_YIELD_FROM', - 'content' => 'from', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - ], - ], - 'yield from with trailing comment' => [ - 'testMarker' => '/* testYieldFromWithTrailingComment */', - 'expectedTokens' => [ - [ - 'type' => 'T_YIELD_FROM', - 'content' => 'yield', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_COMMENT', - 'content' => '// comment -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_YIELD_FROM', - 'content' => 'from', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - ], - ], - 'yield from with trailing annotation' => [ - 'testMarker' => '/* testYieldFromWithTrailingAnnotation */', - 'expectedTokens' => [ - [ - 'type' => 'T_YIELD_FROM', - 'content' => 'yield', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_PHPCS_IGNORE', - 'content' => '// phpcs:ignore Stnd.Cat.Sniff -- for reasons. -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_YIELD_FROM', - 'content' => 'from', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - ], - ], - 'yield from with new line and comment' => [ - 'testMarker' => '/* testYieldFromSplitByNewLineAndComments */', - 'expectedTokens' => [ - [ - 'type' => 'T_YIELD_FROM', - 'content' => 'yield', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_COMMENT', - 'content' => '/* comment line 1 -', - ], - [ - 'type' => 'T_COMMENT', - 'content' => ' line 2 */', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_COMMENT', - 'content' => '// another comment -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_YIELD_FROM', - 'content' => 'from', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - 'yield from with new line and annotation' => [ - 'testMarker' => '/* testYieldFromSplitByNewLineAndAnnotation */', - 'expectedTokens' => [ - [ - 'type' => 'T_YIELD_FROM', - 'content' => 'YIELD', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_PHPCS_DISABLE', - 'content' => '// @phpcs:disable Stnd.Cat.Sniff -- for reasons. -', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' ', - ], - [ - 'type' => 'T_YIELD_FROM', - 'content' => 'From', - ], - [ - 'type' => 'T_WHITESPACE', - 'content' => ' -', - ], - ], - ], - ]; - - }//end dataYieldFromKeywordMultiToken() - - - /** - * Test that 'yield' or 'from' when not used as the reserved keyword are tokenized as `T_STRING`. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * - * @dataProvider dataYieldNonKeyword - * - * @return void - */ - public function testYieldNonKeyword($testMarker) - { - $tokens = $this->phpcsFile->getTokens(); - $target = $this->getTargetToken($testMarker, [T_YIELD, T_YIELD_FROM, T_STRING]); - $tokenArray = $tokens[$target]; - - $this->assertSame(T_STRING, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_STRING (code)'); - $this->assertSame('T_STRING', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_STRING (type)'); - - }//end testYieldNonKeyword() - - - /** - * Data provider. - * - * @see testYieldNonKeyword() - * - * @return array> - */ - public static function dataYieldNonKeyword() - { - return [ - 'yield used as class name' => ['/* testYieldUsedAsClassName */'], - 'yield used as class constant name' => ['/* testYieldUsedAsClassConstantName */'], - 'yield used as method name' => ['/* testYieldUsedAsMethodName */'], - 'yield used as property access 1' => ['/* testYieldUsedAsPropertyName1 */'], - 'yield used as property access 2' => ['/* testYieldUsedAsPropertyName2 */'], - 'yield used as class constant access' => ['/* testYieldUsedForClassConstantAccess1 */'], - 'from used as class constant access' => ['/* testFromUsedForClassConstantAccess1 */'], - 'yield used as method name with ref' => ['/* testYieldUsedAsMethodNameReturnByRef */'], - ]; - - }//end dataYieldNonKeyword() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/CreateParenthesisNestingMapDNFTypesTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/CreateParenthesisNestingMapDNFTypesTest.inc deleted file mode 100644 index 89031bd..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/CreateParenthesisNestingMapDNFTypesTest.inc +++ /dev/null @@ -1,185 +0,0 @@ - 10 ) {} - -/* testParensOwnerFor */ -for ($i =0; $i < /* testParensNoOwnerInForCondition */ ( CONST_A & CONST_B ); $i++ ); - -/* testParensOwnerMatch */ -$match = match(CONST_A & CONST_B) { - default => $a, -}; - -/* testParensOwnerArray */ -$array = array ( - 'text', - \CONST_A & \Fully\Qualified\CONST_B, - /* testParensNoOwnerFunctionCallWithAmpersandInCallable */ - do_something($a, /* testParensOwnerArrowFn */ fn($b) => $a & $b, $c), -); - -/* testParensOwnerListWithRefVars */ -list(&$a, &$b) = $array; - -/* testParensNoOwnerFunctionCallwithDNFLookALikeParam */ -$obj->static((CONST_A&CONST_B)|CONST_C | $var); - - -/* - * DNF parentheses. - */ - -abstract class DNFTypes { - /* testDNFTypeOOConstUnqualifiedClasses */ - public const (A&B)|D UNQUALIFIED = new Foo; - - /* testDNFTypeOOConstReverseModifierOrder */ - protected final const int|(Foo&Bar)|float MODIFIERS_REVERSED /* testParensNoOwnerOOConstDefaultValue */ = (E_WARNING & E_NOTICE) | E_DEPRECATED; - - const - /* testDNFTypeOOConstMulti1 */ - (A&B) | - /* testDNFTypeOOConstMulti2 */ - (C&D) | // phpcs:ignore Stnd.Cat.Sniff - /* testDNFTypeOOConstMulti3 */ - (Y&D) - | null MULTI_DNF = null; - - /* testDNFTypeOOConstNamespaceRelative */ - final protected const (namespace\Sub\NameA&namespace\Sub\NameB)|namespace\Sub\NameC NAMESPACE_RELATIVE = new namespace\Sub\NameB; - - /* testDNFTypeOOConstPartiallyQualified */ - const Partially\Qualified\NameC|(Partially\Qualified\NameA&Partially\Qualified\NameB) PARTIALLY_QUALIFIED = new Partially\Qualified\NameA; - - /* testDNFTypeOOConstFullyQualified */ - const (\Fully\Qualified\NameA&\Fully\Qualified\NameB)|\Fully\Qualified\NameC FULLY_QUALIFIED = new \Fully\Qualified\NameB(); - - /* testDNFTypePropertyUnqualifiedClasses */ - public static (Foo&Bar)|array $obj; - - /* testDNFTypePropertyReverseModifierOrder */ - static protected string|(A&B)|int $dnf /* testParensNoOwnerPropertyDefaultValue1 */ = ( E_WARNING & E_NOTICE ) | /* testParensNoOwnerPropertyDefaultValue2 */ (E_ALL & E_DEPRECATED); - - private - /* testDNFTypePropertyMultiNamespaceRelative */ - (namespace\Sub\NameA&namespace\Sub\NameB) | - /* testDNFTypePropertyMultiPartiallyQualified */ - (Partially\Qualified\NameA&Partially\Qualified\NameB) | // phpcs:ignore Stnd.Cat.Sniff - false - /* testDNFTypePropertyMultiFullyQualified */ - | (\Fully\Qualified\NameA&\Fully\Qualified\NameB) $multiDnf; - - /* testDNFTypePropertyWithReadOnlyKeyword1 */ - protected readonly (A&B) | /* testDNFTypePropertyWithReadOnlyKeyword2 */ (C&D) $readonly; - - /* testDNFTypePropertyWithStaticAndReadOnlyKeywords */ - static readonly (A&B&C)|array $staticReadonly; - - /* testDNFTypePropertyWithOnlyStaticKeyword */ - static (A&B&C)|true $onlyStaticModified; - - public function paramTypes( - /* testDNFTypeParam1WithAttribute */ - #[MyAttribute] - (\Foo&Bar)|int|float $paramA /* testParensNoOwnerParamDefaultValue */ = SOMETHING | (CONSTANT_A & CONSTANT_B), - - /* testDNFTypeParam2 */ - (Foo&\Bar) /* testDNFTypeParam3 */ |(Baz&Fop) &...$paramB, - ) { - /* testParensNoOwnerInReturnValue1 */ - return ( - /* testParensNoOwnerInReturnValue2 */ - ($a1 & $b1) | - /* testParensNoOwnerInReturnValue3 */ - ($a2 & $b2) - ) + $c; - } - - public function identifierNames( - /* testDNFTypeParamNamespaceRelative */ - (namespace\Sub\NameA&namespace\Sub\NameB)|false $paramA, - /* testDNFTypeParamPartiallyQualified */ - Partially\Qualified\NameC|(Partially\Qualified\NameA&Partially\Qualified\NameB) $paramB, - /* testDNFTypeParamFullyQualified */ - name|(\Fully\Qualified\NameA&\Fully\Qualified\NameB) $paramC, - ) {} - - public function __construct( - /* testDNFTypeConstructorPropertyPromotion1 */ - public (A&B)| /* testDNFTypeConstructorPropertyPromotion2 */ (A&D) $property - ) {} - - public function returnType()/* testDNFTypeReturnType1 */ : A|(B&D)|/* testDNFTypeReturnType2 */(B&W)|null {} - - abstract public function abstractMethod(): /* testDNFTypeAbstractMethodReturnType1 */ (X&Y) /* testDNFTypeAbstractMethodReturnType2 */ |(W&Z); - - public function identifierNamesReturnRelative( - ) : /* testDNFTypeReturnTypeNamespaceRelative */ (namespace\Sub\NameA&namespace\Sub\NameB)|namespace\Sub\NameC {} - - public function identifierNamesReturnPQ( - ) : /* testDNFTypeReturnPartiallyQualified */Partially\Qualified\NameA|(Partially\Qualified\NameB&Partially\Qualified\NameC) {} - - // Illegal type: segments which are strict subsets of others are disallowed, but that's not the concern of the tokenizer. - public function identifierNamesReturnFQ( - ) /* testDNFTypeReturnFullyQualified */ : (\Fully\Qualified\NameA&\Fully\Qualified\NameB)|\Fully\Qualified\NameB {} -} - -function globalFunctionWithSpreadAndReference( - /* testDNFTypeWithReference */ - float|(B&A) &$paramA, - /* testDNFTypeWithSpreadOperator */ - string|(B&D) ...$paramB -) {} - - -$closureWithParamType = function ( /* testDNFTypeClosureParamIllegalNullable */ ?(A&B)|bool $string) {}; - -/* testParensOwnerClosureAmpersandInDefaultValue */ -$closureWithReturnType = function ($string = NONSENSE & FAKE) /* testDNFTypeClosureReturn */ : (\Package\MyA&PackageB)|null {}; - -/* testParensOwnerArrowDNFUsedWithin */ -$arrowWithParamType = fn ( - /* testDNFTypeArrowParam */ - int|(A&B&C)|array $param, - /* testParensNoOwnerAmpersandInDefaultValue */ ?int $int = (CONSTA & CONSTB )| CONST_C -) - /* testParensNoOwnerInArrowReturnExpression */ - => ($param & $foo ) | $int; - -$arrowWithReturnType = fn ($param) : /* testDNFTypeArrowReturnType */ int|(A&B) => $param * 10; - -$arrowWithParamReturnByRef = fn &( - /* testDNFTypeArrowParamWithReturnByRef */ - (A&B)|null $param -) => $param * 10; - -function InvalidSyntaxes( - /* testDNFTypeParamIllegalUnnecessaryParens */ - (A&B) $parensNotNeeded, - - /* testDNFTypeParamIllegalIntersectUnionReversed */ - A&(B|D) $onlyIntersectAllowedWithinParensAndUnionOutside, - - /* testDNFTypeParamIllegalNestedParens */ - A|(B&(D|W)|null) $nestedParensNotAllowed, -) {} diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/CreateParenthesisNestingMapDNFTypesTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/CreateParenthesisNestingMapDNFTypesTest.php deleted file mode 100644 index a72beca..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/CreateParenthesisNestingMapDNFTypesTest.php +++ /dev/null @@ -1,374 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\Tokenizer; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; - -final class CreateParenthesisNestingMapDNFTypesTest extends AbstractTokenizerTestCase -{ - - - /** - * Test that parentheses when **not** used in a type declaration are correctly tokenized. - * - * @param string $testMarker The comment prefacing the target token. - * @param int|false $owner Optional. The parentheses owner or false when no parentheses owner is expected. - * - * @dataProvider dataNormalParentheses - * @covers PHP_CodeSniffer\Tokenizers\Tokenizer::createParenthesisNestingMap - * - * @return void - */ - public function testNormalParentheses($testMarker, $owner=false) - { - $tokens = $this->phpcsFile->getTokens(); - - $openPtr = $this->getTargetToken($testMarker, [T_OPEN_PARENTHESIS, T_TYPE_OPEN_PARENTHESIS]); - $opener = $tokens[$openPtr]; - - // Make sure we're looking at the right token. - $this->assertSame(T_OPEN_PARENTHESIS, $opener['code'], 'Token tokenized as '.$opener['type'].', not T_OPEN_PARENTHESIS (code)'); - - if ($owner !== false) { - $this->assertArrayHasKey('parenthesis_owner', $opener, 'Parenthesis owner is not set'); - $this->assertSame(($openPtr + $owner), $opener['parenthesis_owner'], 'Opener parenthesis owner is not the expected token'); - } else { - $this->assertArrayNotHasKey('parenthesis_owner', $opener, 'Parenthesis owner is set'); - } - - $this->assertArrayHasKey('parenthesis_opener', $opener, 'Parenthesis opener is not set'); - $this->assertArrayHasKey('parenthesis_closer', $opener, 'Parenthesis closer is not set'); - $this->assertSame($openPtr, $opener['parenthesis_opener'], 'Parenthesis opener is not the expected token'); - - $closePtr = $opener['parenthesis_closer']; - $closer = $tokens[$closePtr]; - - // Make sure we're looking at the right token. - $this->assertSame(T_CLOSE_PARENTHESIS, $closer['code'], 'Token tokenized as '.$closer['type'].', not T_CLOSE_PARENTHESIS (code)'); - - if ($owner !== false) { - $this->assertArrayHasKey('parenthesis_owner', $closer, 'Parenthesis owner is not set'); - $this->assertSame(($openPtr + $owner), $closer['parenthesis_owner'], 'Closer parenthesis owner is not the expected token'); - } else { - $this->assertArrayNotHasKey('parenthesis_owner', $closer, 'Parenthesis owner is set'); - } - - $this->assertArrayHasKey('parenthesis_opener', $closer, 'Parenthesis opener is not set'); - $this->assertArrayHasKey('parenthesis_closer', $closer, 'Parenthesis closer is not set'); - $this->assertSame($closePtr, $closer['parenthesis_closer'], 'Parenthesis closer is not the expected token'); - - for ($i = ($openPtr + 1); $i < $closePtr; $i++) { - $this->assertArrayHasKey('nested_parenthesis', $tokens[$i], "Nested parenthesis key not set on token $i ({$tokens[$i]['type']})"); - $this->assertArrayHasKey($openPtr, $tokens[$i]['nested_parenthesis'], 'Nested parenthesis is missing target parentheses set'); - $this->assertSame($closePtr, $tokens[$i]['nested_parenthesis'][$openPtr], 'Nested parenthesis closer not set correctly'); - } - - }//end testNormalParentheses() - - - /** - * Data provider. - * - * @see testNormalParentheses() - * - * @return array> - */ - public static function dataNormalParentheses() - { - // "Owner" offsets are relative to the open parenthesis. - return [ - 'parens without owner' => [ - 'testMarker' => '/* testParensNoOwner */', - ], - 'parens without owner in ternary then' => [ - 'testMarker' => '/* testParensNoOwnerInTernary */', - ], - 'parens without owner in short ternary' => [ - 'testMarker' => '/* testParensNoOwnerInShortTernary */', - ], - 'parens with owner: function; & in default value' => [ - 'testMarker' => '/* testParensOwnerFunctionAmpersandInDefaultValue */', - 'owner' => -3, - ], - 'parens with owner: closure; param declared by & ref' => [ - 'testMarker' => '/* testParensOwnerClosureAmpersandParamRef */', - 'owner' => -1, - ], - 'parens with owner: if' => [ - 'testMarker' => '/* testParensOwnerIf */', - 'owner' => -2, - ], - 'parens without owner in if condition' => [ - 'testMarker' => '/* testParensNoOwnerInIfCondition */', - ], - 'parens with owner: for' => [ - 'testMarker' => '/* testParensOwnerFor */', - 'owner' => -2, - ], - 'parens without owner in for condition' => [ - 'testMarker' => '/* testParensNoOwnerInForCondition */', - ], - 'parens with owner: match' => [ - 'testMarker' => '/* testParensOwnerMatch */', - 'owner' => -1, - ], - 'parens with owner: array' => [ - 'testMarker' => '/* testParensOwnerArray */', - 'owner' => -2, - ], - 'parens without owner in array; function call with & in callable' => [ - 'testMarker' => '/* testParensNoOwnerFunctionCallWithAmpersandInCallable */', - ], - 'parens with owner: fn; & in return value' => [ - 'testMarker' => '/* testParensOwnerArrowFn */', - 'owner' => -1, - ], - 'parens with owner: list with reference vars' => [ - 'testMarker' => '/* testParensOwnerListWithRefVars */', - 'owner' => -1, - ], - 'parens without owner, function call with DNF look-a-like param' => [ - 'testMarker' => '/* testParensNoOwnerFunctionCallwithDNFLookALikeParam */', - ], - - 'parens without owner in OO const default value' => [ - 'testMarker' => '/* testParensNoOwnerOOConstDefaultValue */', - ], - 'parens without owner in property default 1' => [ - 'testMarker' => '/* testParensNoOwnerPropertyDefaultValue1 */', - ], - 'parens without owner in property default 2' => [ - 'testMarker' => '/* testParensNoOwnerPropertyDefaultValue2 */', - ], - 'parens without owner in param default value' => [ - 'testMarker' => '/* testParensNoOwnerParamDefaultValue */', - ], - 'parens without owner in return statement 1' => [ - 'testMarker' => '/* testParensNoOwnerInReturnValue1 */', - ], - 'parens without owner in return statement 2' => [ - 'testMarker' => '/* testParensNoOwnerInReturnValue2 */', - ], - 'parens without owner in return statement 3' => [ - 'testMarker' => '/* testParensNoOwnerInReturnValue3 */', - ], - 'parens with owner: closure; & in default value' => [ - 'testMarker' => '/* testParensOwnerClosureAmpersandInDefaultValue */', - 'owner' => -2, - ], - 'parens with owner: fn; dnf used within' => [ - 'testMarker' => '/* testParensOwnerArrowDNFUsedWithin */', - 'owner' => -2, - ], - 'parens without owner: default value for param in arrow function' => [ - 'testMarker' => '/* testParensNoOwnerAmpersandInDefaultValue */', - ], - 'parens without owner in arrow function return expression' => [ - 'testMarker' => '/* testParensNoOwnerInArrowReturnExpression */', - ], - ]; - - }//end dataNormalParentheses() - - - /** - * Test that parentheses when used in a DNF type declaration are correctly tokenized. - * - * Includes verifying that: - * - the tokens between the parentheses all have a "nested_parenthesis" key. - * - all ampersands between the parentheses are tokenized as T_TYPE_INTERSECTION. - * - * @param string $testMarker The comment prefacing the target token. - * - * @dataProvider dataDNFTypeParentheses - * @covers PHP_CodeSniffer\Tokenizers\Tokenizer::createParenthesisNestingMap - * - * @return void - */ - public function testDNFTypeParentheses($testMarker) - { - $tokens = $this->phpcsFile->getTokens(); - - $openPtr = $this->getTargetToken($testMarker, [T_OPEN_PARENTHESIS, T_TYPE_OPEN_PARENTHESIS]); - $opener = $tokens[$openPtr]; - - // Make sure we're looking at the right token. - $this->assertSame(T_TYPE_OPEN_PARENTHESIS, $opener['code'], 'Token tokenized as '.$opener['type'].', not T_TYPE_OPEN_PARENTHESIS (code)'); - - $this->assertArrayNotHasKey('parenthesis_owner', $opener, 'Parenthesis owner is set'); - $this->assertArrayHasKey('parenthesis_opener', $opener, 'Parenthesis opener is not set'); - $this->assertArrayHasKey('parenthesis_closer', $opener, 'Parenthesis closer is not set'); - $this->assertSame($openPtr, $opener['parenthesis_opener'], 'Parenthesis opener is not the expected token'); - - $closePtr = $opener['parenthesis_closer']; - $closer = $tokens[$closePtr]; - - // Make sure we're looking at the right token. - $this->assertSame(T_TYPE_CLOSE_PARENTHESIS, $closer['code'], 'Token tokenized as '.$closer['type'].', not T_TYPE_CLOSE_PARENTHESIS (code)'); - - $this->assertArrayNotHasKey('parenthesis_owner', $closer, 'Parenthesis owner is set'); - $this->assertArrayHasKey('parenthesis_opener', $closer, 'Parenthesis opener is not set'); - $this->assertArrayHasKey('parenthesis_closer', $closer, 'Parenthesis closer is not set'); - $this->assertSame($closePtr, $closer['parenthesis_closer'], 'Parenthesis closer is not the expected token'); - - for ($i = ($openPtr + 1); $i < $closePtr; $i++) { - $this->assertArrayHasKey('nested_parenthesis', $tokens[$i], "Nested parenthesis key not set on token $i ({$tokens[$i]['type']})"); - $this->assertArrayHasKey($openPtr, $tokens[$i]['nested_parenthesis'], 'Nested parenthesis is missing target parentheses set'); - $this->assertSame($closePtr, $tokens[$i]['nested_parenthesis'][$openPtr], 'Nested parenthesis closer not set correctly'); - }//end for - - }//end testDNFTypeParentheses() - - - /** - * Data provider. - * - * @see testDNFTypeParentheses() - * - * @return array> - */ - public static function dataDNFTypeParentheses() - { - return [ - 'OO const type: unqualified classes' => [ - 'testMarker' => '/* testDNFTypeOOConstUnqualifiedClasses */', - ], - 'OO const type: modifiers in reverse order' => [ - 'testMarker' => '/* testDNFTypeOOConstReverseModifierOrder */', - ], - 'OO const type: multi-dnf part 1' => [ - 'testMarker' => '/* testDNFTypeOOConstMulti1 */', - ], - 'OO const type: multi-dnf part 2' => [ - 'testMarker' => '/* testDNFTypeOOConstMulti2 */', - ], - 'OO const type: multi-dnf part 3' => [ - 'testMarker' => '/* testDNFTypeOOConstMulti3 */', - ], - 'OO const type: namespace relative classes' => [ - 'testMarker' => '/* testDNFTypeOOConstNamespaceRelative */', - ], - 'OO const type: partially qualified classes' => [ - 'testMarker' => '/* testDNFTypeOOConstPartiallyQualified */', - ], - 'OO const type: fully qualified classes' => [ - 'testMarker' => '/* testDNFTypeOOConstFullyQualified */', - ], - - 'OO property type: unqualified classes' => [ - 'testMarker' => '/* testDNFTypePropertyUnqualifiedClasses */', - ], - 'OO property type: modifiers in reverse order' => [ - 'testMarker' => '/* testDNFTypePropertyReverseModifierOrder */', - ], - 'OO property type: multi-dnf namespace relative classes' => [ - 'testMarker' => '/* testDNFTypePropertyMultiNamespaceRelative */', - ], - 'OO property type: multi-dnf partially qualified classes' => [ - 'testMarker' => '/* testDNFTypePropertyMultiPartiallyQualified */', - ], - 'OO property type: multi-dnf fully qualified classes' => [ - 'testMarker' => '/* testDNFTypePropertyMultiFullyQualified */', - ], - - 'OO property type: multi-dnf with readonly keyword 1' => [ - 'testMarker' => '/* testDNFTypePropertyWithReadOnlyKeyword1 */', - ], - 'OO property type: multi-dnf with readonly keyword 2' => [ - 'testMarker' => '/* testDNFTypePropertyWithReadOnlyKeyword2 */', - ], - 'OO property type: with static and readonly keywords' => [ - 'testMarker' => '/* testDNFTypePropertyWithStaticAndReadOnlyKeywords */', - ], - 'OO property type: with only static keyword' => [ - 'testMarker' => '/* testDNFTypePropertyWithOnlyStaticKeyword */', - ], - 'OO method param type: first param' => [ - 'testMarker' => '/* testDNFTypeParam1WithAttribute */', - ], - 'OO method param type: second param, first DNF' => [ - 'testMarker' => '/* testDNFTypeParam2 */', - ], - 'OO method param type: second param, second DNF' => [ - 'testMarker' => '/* testDNFTypeParam3 */', - ], - 'OO method param type: namespace relative classes' => [ - 'testMarker' => '/* testDNFTypeParamNamespaceRelative */', - ], - 'OO method param type: partially qualified classes' => [ - 'testMarker' => '/* testDNFTypeParamPartiallyQualified */', - ], - 'OO method param type: fully qualified classes' => [ - 'testMarker' => '/* testDNFTypeParamFullyQualified */', - ], - 'Constructor property promotion with multi DNF 1' => [ - 'testMarker' => '/* testDNFTypeConstructorPropertyPromotion1 */', - ], - 'Constructor property promotion with multi DNF 2' => [ - 'testMarker' => '/* testDNFTypeConstructorPropertyPromotion2 */', - ], - 'OO method return type: multi DNF 1' => [ - 'testMarker' => '/* testDNFTypeReturnType1 */', - ], - 'OO method return type: multi DNF 2' => [ - 'testMarker' => '/* testDNFTypeReturnType2 */', - ], - 'OO abstract method return type: multi DNF 1' => [ - 'testMarker' => '/* testDNFTypeAbstractMethodReturnType1 */', - ], - 'OO abstract method return type: multi DNF 2' => [ - 'testMarker' => '/* testDNFTypeAbstractMethodReturnType2 */', - ], - 'OO method return type: namespace relative classes' => [ - 'testMarker' => '/* testDNFTypeReturnTypeNamespaceRelative */', - ], - 'OO method return type: partially qualified classes' => [ - 'testMarker' => '/* testDNFTypeReturnPartiallyQualified */', - ], - 'OO method return type: fully qualified classes' => [ - 'testMarker' => '/* testDNFTypeReturnFullyQualified */', - ], - 'function param type: with reference' => [ - 'testMarker' => '/* testDNFTypeWithReference */', - ], - 'function param type: with spread' => [ - 'testMarker' => '/* testDNFTypeWithSpreadOperator */', - ], - 'closure param type: with illegal nullable' => [ - 'testMarker' => '/* testDNFTypeClosureParamIllegalNullable */', - ], - 'closure return type' => [ - 'testMarker' => '/* testDNFTypeClosureReturn */', - ], - 'arrow function param type' => [ - 'testMarker' => '/* testDNFTypeArrowParam */', - ], - 'arrow function return type' => [ - 'testMarker' => '/* testDNFTypeArrowReturnType */', - ], - 'arrow function param type with return by ref' => [ - 'testMarker' => '/* testDNFTypeArrowParamWithReturnByRef */', - ], - - 'illegal syntax: unnecessary parentheses (no union)' => [ - 'testMarker' => '/* testDNFTypeParamIllegalUnnecessaryParens */', - ], - 'illegal syntax: union within parentheses, intersect outside' => [ - 'testMarker' => '/* testDNFTypeParamIllegalIntersectUnionReversed */', - ], - 'illegal syntax: nested parentheses' => [ - 'testMarker' => '/* testDNFTypeParamIllegalNestedParens */', - ], - ]; - - }//end dataDNFTypeParentheses() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/CreatePositionMapHeredocNowdocCloserTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/CreatePositionMapHeredocNowdocCloserTest.inc deleted file mode 100644 index a800980..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/CreatePositionMapHeredocNowdocCloserTest.inc +++ /dev/null @@ -1,43 +0,0 @@ - - * @copyright 2020 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\Tokenizer; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; - -/** - * Heredoc/nowdoc closer token test. - * - * @requires PHP 7.3 - * - * @covers PHP_CodeSniffer\Tokenizers\Tokenizer::createPositionMap - */ -final class CreatePositionMapHeredocNowdocCloserTest extends AbstractTokenizerTestCase -{ - - - /** - * Verify that leading (indent) whitespace in a heredoc/nowdoc closer token get the tab replacement treatment. - * - * @param string $testMarker The comment prefacing the target token. - * @param array $expected Expectations for the token array. - * - * @dataProvider dataHeredocNowdocCloserTabReplacement - * - * @return void - */ - public function testHeredocNowdocCloserTabReplacement($testMarker, $expected) - { - $tokens = $this->phpcsFile->getTokens(); - - $closer = $this->getTargetToken($testMarker, [T_END_HEREDOC, T_END_NOWDOC]); - - foreach ($expected as $key => $value) { - if ($key === 'orig_content' && $value === null) { - $this->assertArrayNotHasKey($key, $tokens[$closer], "Unexpected 'orig_content' key found in the token array."); - continue; - } - - $this->assertArrayHasKey($key, $tokens[$closer], "Key $key not found in the token array."); - $this->assertSame($value, $tokens[$closer][$key], "Value for key $key does not match expectation."); - } - - }//end testHeredocNowdocCloserTabReplacement() - - - /** - * Data provider. - * - * @see testHeredocNowdocCloserTabReplacement() - * - * @return array>> - */ - public static function dataHeredocNowdocCloserTabReplacement() - { - return [ - 'Heredoc closer without indent' => [ - 'testMarker' => '/* testHeredocCloserNoIndent */', - 'expected' => [ - 'length' => 3, - 'content' => 'EOD', - 'orig_content' => null, - ], - ], - 'Nowdoc closer without indent' => [ - 'testMarker' => '/* testNowdocCloserNoIndent */', - 'expected' => [ - 'length' => 3, - 'content' => 'EOD', - 'orig_content' => null, - ], - ], - 'Heredoc closer with indent, spaces' => [ - 'testMarker' => '/* testHeredocCloserSpaceIndent */', - 'expected' => [ - 'length' => 7, - 'content' => ' END', - 'orig_content' => null, - ], - ], - 'Nowdoc closer with indent, spaces' => [ - 'testMarker' => '/* testNowdocCloserSpaceIndent */', - 'expected' => [ - 'length' => 8, - 'content' => ' END', - 'orig_content' => null, - ], - ], - 'Heredoc closer with indent, tabs' => [ - 'testMarker' => '/* testHeredocCloserTabIndent */', - 'expected' => [ - 'length' => 8, - 'content' => ' END', - 'orig_content' => ' END', - ], - ], - 'Nowdoc closer with indent, tabs' => [ - 'testMarker' => '/* testNowdocCloserTabIndent */', - 'expected' => [ - 'length' => 7, - 'content' => ' END', - 'orig_content' => ' END', - ], - ], - ]; - - }//end dataHeredocNowdocCloserTabReplacement() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/CreatePositionMapHeredocNowdocOpenerTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/CreatePositionMapHeredocNowdocOpenerTest.inc deleted file mode 100644 index dc2b2f2..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/CreatePositionMapHeredocNowdocOpenerTest.inc +++ /dev/null @@ -1,31 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\Tokenizer; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; - -/** - * Heredoc/nowdoc opener token test. - * - * @covers PHP_CodeSniffer\Tokenizers\Tokenizer::createPositionMap - */ -final class CreatePositionMapHeredocNowdocOpenerTest extends AbstractTokenizerTestCase -{ - - - /** - * Verify that spaces/tabs in a heredoc/nowdoc opener token get the tab replacement treatment. - * - * @param string $testMarker The comment prefacing the target token. - * @param array $expected Expectations for the token array. - * - * @dataProvider dataHeredocNowdocOpenerTabReplacement - * - * @return void - */ - public function testHeredocNowdocOpenerTabReplacement($testMarker, $expected) - { - $tokens = $this->phpcsFile->getTokens(); - $opener = $this->getTargetToken($testMarker, [T_START_HEREDOC, T_START_NOWDOC]); - - foreach ($expected as $key => $value) { - if ($key === 'orig_content' && $value === null) { - $this->assertArrayNotHasKey($key, $tokens[$opener], "Unexpected 'orig_content' key found in the token array."); - continue; - } - - $this->assertArrayHasKey($key, $tokens[$opener], "Key $key not found in the token array."); - $this->assertSame($value, $tokens[$opener][$key], "Value for key $key does not match expectation."); - } - - }//end testHeredocNowdocOpenerTabReplacement() - - - /** - * Data provider. - * - * @see testHeredocNowdocOpenerTabReplacement() - * - * @return array>> - */ - public static function dataHeredocNowdocOpenerTabReplacement() - { - return [ - 'Heredoc opener without space' => [ - 'testMarker' => '/* testHeredocOpenerNoSpace */', - 'expected' => [ - 'length' => 6, - 'content' => '<< null, - ], - ], - 'Nowdoc opener without space' => [ - 'testMarker' => '/* testNowdocOpenerNoSpace */', - 'expected' => [ - 'length' => 8, - 'content' => "<<<'EOD' -", - 'orig_content' => null, - ], - ], - 'Heredoc opener with space(s)' => [ - 'testMarker' => '/* testHeredocOpenerHasSpace */', - 'expected' => [ - 'length' => 7, - 'content' => '<<< END -', - 'orig_content' => null, - ], - ], - 'Nowdoc opener with space(s)' => [ - 'testMarker' => '/* testNowdocOpenerHasSpace */', - 'expected' => [ - 'length' => 21, - 'content' => "<<< 'END' -", - 'orig_content' => null, - ], - ], - 'Heredoc opener with tab(s)' => [ - 'testMarker' => '/* testHeredocOpenerHasTab */', - 'expected' => [ - 'length' => 18, - 'content' => '<<< "END" -', - 'orig_content' => '<<< "END" -', - ], - ], - 'Nowdoc opener with tab(s)' => [ - 'testMarker' => '/* testNowdocOpenerHasTab */', - 'expected' => [ - 'length' => 11, - 'content' => "<<< 'END' -", - 'orig_content' => "<<< 'END' -", - ], - ], - ]; - - }//end dataHeredocNowdocOpenerTabReplacement() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/CreatePositionMapTabWidth0Test.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/CreatePositionMapTabWidth0Test.php deleted file mode 100644 index 687c6a0..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/CreatePositionMapTabWidth0Test.php +++ /dev/null @@ -1,107 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\Tokenizer; - -/** - * Tab replacement test using tab width 0, means no tab replacement will take place. - * - * @covers PHP_CodeSniffer\Tokenizers\Tokenizer::createPositionMap - */ -final class CreatePositionMapTabWidth0Test extends ReplaceTabsInTokenTestCase -{ - - /** - * The tab width setting to use when tokenizing the file. - * - * @var integer - */ - protected $tabWidth = 0; - - - /** - * Data provider helper. - * - * @see ReplaceTabsInTokenTestCase::dataTabReplacement() - * - * @return array> - */ - public static function getTabReplacementExpected() - { - return [ - 'Tab indentation' => [ - 'length' => 2, - 'content' => ' ', - 'orig_content' => null, - ], - 'Mixed tab/space indentation' => [ - 'length' => 3, - 'content' => ' ', - 'orig_content' => null, - ], - 'Inline: single tab in text string' => [ - 'length' => 15, - 'content' => "'tab separated'", - 'orig_content' => null, - ], - 'Inline: single tab between each word in text string' => [ - 'length' => 24, - 'content' => '"tab $between each word"', - 'orig_content' => null, - ], - 'Inline: multiple tabs in heredoc' => [ - 'length' => 15, - 'content' => 'tab separated -', - 'orig_content' => null, - ], - 'Inline: multiple tabs between each word in nowdoc' => [ - 'length' => 27, - 'content' => 'tab between each word -', - 'orig_content' => null, - ], - 'Inline: mixed spaces/tabs in text string' => [ - 'length' => 20, - 'content' => "'tab separated'", - 'orig_content' => null, - ], - 'Inline: mixed spaces/tabs between each word in text string' => [ - 'length' => 31, - 'content' => '"tab $between each word"', - 'orig_content' => null, - ], - 'Inline: tab becomes single space in comment (with tabwidth 4)' => [ - 'length' => 50, - 'content' => '// -123 With tabwidth 4, the tab size should be 1. -', - 'orig_content' => null, - ], - 'Inline: tab becomes 2 spaces in comment (with tabwidth 4)' => [ - 'length' => 52, - 'content' => '/* -12 With tabwidth 4, the tab size should be 2. */', - 'orig_content' => null, - ], - 'Inline: tab becomes 3 spaces in doc comment string (with tabwidth 4)' => [ - 'length' => 45, - 'content' => '-1 With tabwidth 4, the tab size should be 3.', - 'orig_content' => null, - ], - 'Inline: tab becomes 4 spaces in comment (with tabwidth 4)' => [ - 'length' => 47, - 'content' => '// - With tabwidth 4, the tab size should be 4. -', - 'orig_content' => null, - ], - ]; - - }//end getTabReplacementExpected() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/CreatePositionMapYieldFromTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/CreatePositionMapYieldFromTest.inc deleted file mode 100644 index 59365dd..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/CreatePositionMapYieldFromTest.inc +++ /dev/null @@ -1,15 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\Tokenizer; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; - -/** - * Yield from token test. - * - * @covers PHP_CodeSniffer\Tokenizers\Tokenizer::createPositionMap - */ -final class CreatePositionMapYieldFromTest extends AbstractTokenizerTestCase -{ - - - /** - * Verify that spaces/tabs in "yield from" tokens get the tab replacement treatment. - * - * @param string $testMarker The comment prefacing the target token. - * @param array $expected Expectations for the token array. - * @param string $content Optional. The test token content to search for. - * Defaults to null. - * - * @dataProvider dataYieldFromTabReplacement - * - * @return void - */ - public function testYieldFromTabReplacement($testMarker, $expected, $content=null) - { - $tokens = $this->phpcsFile->getTokens(); - $target = $this->getTargetToken($testMarker, [T_YIELD_FROM], $content); - - foreach ($expected as $key => $value) { - if ($key === 'orig_content' && $value === null) { - $this->assertArrayNotHasKey($key, $tokens[$target], "Unexpected 'orig_content' key found in the token array."); - continue; - } - - $this->assertArrayHasKey($key, $tokens[$target], "Key $key not found in the token array."); - $this->assertSame($value, $tokens[$target][$key], "Value for key $key does not match expectation."); - } - - }//end testYieldFromTabReplacement() - - - /** - * Data provider. - * - * @see testYieldFromTabReplacement() - * - * @return array>> - */ - public static function dataYieldFromTabReplacement() - { - return [ - 'Yield from, single line, single space' => [ - 'testMarker' => '/* testYieldFromHasSingleSpace */', - 'expected' => [ - 'length' => 10, - 'content' => 'yield from', - 'orig_content' => null, - ], - ], - 'Yield from, single line, multiple spaces' => [ - 'testMarker' => '/* testYieldFromHasMultiSpace */', - 'expected' => [ - 'length' => 14, - 'content' => 'yield from', - 'orig_content' => null, - ], - ], - 'Yield from, single line, has tabs' => [ - 'testMarker' => '/* testYieldFromHasTabs */', - 'expected' => [ - 'length' => 16, - 'content' => 'yield from', - 'orig_content' => 'yield from', - ], - ], - 'Yield from, single line, mix of tabs and spaces' => [ - 'testMarker' => '/* testYieldFromMixedTabsSpaces */', - 'expected' => [ - 'length' => 20, - 'content' => 'Yield From', - 'orig_content' => 'Yield From', - ], - ], - ]; - - }//end dataYieldFromTabReplacement() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/CreateTokenMapArrayParenthesesTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/CreateTokenMapArrayParenthesesTest.inc deleted file mode 100644 index 6d8adfc..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/CreateTokenMapArrayParenthesesTest.inc +++ /dev/null @@ -1,58 +0,0 @@ - 10); - -/* testArrayWithComment */ -$var = Array /*comment*/ (1 => 10); - -/* testNestingArray */ -$var = array( - /* testNestedArray */ - array( - 'key' => 'value', - - /* testClosureReturnType */ - 'closure' => function($a) use($global) : Array {}, - ), -); - -/* testFunctionDeclarationParamType */ -function typedParam(array $a) {} - -/* testFunctionDeclarationReturnType */ -function returnType($a) : int|array|null {} - -class Bar { - /* testClassConst */ - const ARRAY = []; - - /* testClassMethod */ - public function array() {} - - /* testOOConstType */ - const array /* testTypedOOConstName */ ARRAY = /* testOOConstDefault */ array(); - - /* testOOPropertyType */ - protected array $property; -} - -class DNFTypes { - /* testOOConstDNFType */ - const (A&B)|array|(C&D) NAME = []; - - /* testOOPropertyDNFType */ - protected (A&B)|ARRAY|null $property; - - /* testFunctionDeclarationParamDNFType */ - public function name(null|array|(A&B) $param) { - /* testClosureDeclarationParamDNFType */ - $cl = function ( array|(A&B) $param) {}; - - /* testArrowDeclarationReturnDNFType */ - $arrow = fn($a): (A&B)|Array => new $a; - } -} diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/CreateTokenMapArrayParenthesesTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/CreateTokenMapArrayParenthesesTest.php deleted file mode 100644 index 186ca8e..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/CreateTokenMapArrayParenthesesTest.php +++ /dev/null @@ -1,212 +0,0 @@ - - * @copyright 2021 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\Tokenizer; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; - -final class CreateTokenMapArrayParenthesesTest extends AbstractTokenizerTestCase -{ - - - /** - * Test that the array keyword is correctly tokenized as `T_ARRAY`. - * - * @param string $testMarker The comment prefacing the target token. - * @param string $testContent Optional. The token content to look for. - * - * @dataProvider dataArrayKeyword - * @covers PHP_CodeSniffer\Tokenizers\Tokenizer::createTokenMap - * - * @return void - */ - public function testArrayKeyword($testMarker, $testContent='array') - { - $tokens = $this->phpcsFile->getTokens(); - - $token = $this->getTargetToken($testMarker, [T_ARRAY, T_STRING], $testContent); - $tokenArray = $tokens[$token]; - - // Make sure we're looking at the right token. - $this->assertSame(T_ARRAY, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_ARRAY (code)'); - - $this->assertArrayHasKey('parenthesis_owner', $tokenArray, 'Parenthesis owner is not set'); - $this->assertArrayHasKey('parenthesis_opener', $tokenArray, 'Parenthesis opener is not set'); - $this->assertArrayHasKey('parenthesis_closer', $tokenArray, 'Parenthesis closer is not set'); - - }//end testArrayKeyword() - - - /** - * Data provider. - * - * @see testArrayKeyword() - * - * @return array> - */ - public static function dataArrayKeyword() - { - return [ - 'empty array' => [ - 'testMarker' => '/* testEmptyArray */', - ], - 'array with space before parenthesis' => [ - 'testMarker' => '/* testArrayWithSpace */', - ], - 'array with comment before parenthesis' => [ - 'testMarker' => '/* testArrayWithComment */', - 'testContent' => 'Array', - ], - 'nested: outer array' => [ - 'testMarker' => '/* testNestingArray */', - ], - 'nested: inner array' => [ - 'testMarker' => '/* testNestedArray */', - ], - 'OO constant default value' => [ - 'testMarker' => '/* testOOConstDefault */', - ], - ]; - - }//end dataArrayKeyword() - - - /** - * Test that the array keyword when used in a type declaration is correctly tokenized as `T_STRING`. - * - * @param string $testMarker The comment prefacing the target token. - * @param string $testContent Optional. The token content to look for. - * - * @dataProvider dataArrayType - * @covers PHP_CodeSniffer\Tokenizers\Tokenizer::createTokenMap - * - * @return void - */ - public function testArrayType($testMarker, $testContent='array') - { - $tokens = $this->phpcsFile->getTokens(); - - $token = $this->getTargetToken($testMarker, [T_ARRAY, T_STRING], $testContent); - $tokenArray = $tokens[$token]; - - // Make sure we're looking at the right token. - $this->assertSame(T_STRING, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_STRING (code)'); - - $this->assertArrayNotHasKey('parenthesis_owner', $tokenArray, 'Parenthesis owner is set'); - $this->assertArrayNotHasKey('parenthesis_opener', $tokenArray, 'Parenthesis opener is set'); - $this->assertArrayNotHasKey('parenthesis_closer', $tokenArray, 'Parenthesis closer is set'); - - }//end testArrayType() - - - /** - * Data provider. - * - * @see testArrayType() - * - * @return array> - */ - public static function dataArrayType() - { - return [ - 'closure return type' => [ - 'testMarker' => '/* testClosureReturnType */', - 'testContent' => 'Array', - ], - 'function param type' => [ - 'testMarker' => '/* testFunctionDeclarationParamType */', - ], - 'function union return type' => [ - 'testMarker' => '/* testFunctionDeclarationReturnType */', - ], - 'OO constant type' => [ - 'testMarker' => '/* testOOConstType */', - ], - 'OO property type' => [ - 'testMarker' => '/* testOOPropertyType */', - ], - - 'OO constant DNF type' => [ - 'testMarker' => '/* testOOConstDNFType */', - ], - 'OO property DNF type' => [ - 'testMarker' => '/* testOOPropertyDNFType */', - 'testContent' => 'ARRAY', - ], - 'function param DNF type' => [ - 'testMarker' => '/* testFunctionDeclarationParamDNFType */', - ], - 'closure param DNF type' => [ - 'testMarker' => '/* testClosureDeclarationParamDNFType */', - ], - 'arrow return DNF type' => [ - 'testMarker' => '/* testArrowDeclarationReturnDNFType */', - 'testContent' => 'Array', - ], - ]; - - }//end dataArrayType() - - - /** - * Verify that the retokenization of `T_ARRAY` tokens to `T_STRING` is handled correctly - * for tokens with the contents 'array' which aren't in actual fact the array keyword. - * - * @param string $testMarker The comment prefacing the target token. - * @param string $testContent The token content to look for. - * - * @dataProvider dataNotArrayKeyword - * @covers PHP_CodeSniffer\Tokenizers\Tokenizer::createTokenMap - * - * @return void - */ - public function testNotArrayKeyword($testMarker, $testContent='array') - { - $tokens = $this->phpcsFile->getTokens(); - - $token = $this->getTargetToken($testMarker, [T_ARRAY, T_STRING], $testContent); - $tokenArray = $tokens[$token]; - - // Make sure we're looking at the right token. - $this->assertSame(T_STRING, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_STRING (code)'); - - $this->assertArrayNotHasKey('parenthesis_owner', $tokenArray, 'Parenthesis owner is set'); - $this->assertArrayNotHasKey('parenthesis_opener', $tokenArray, 'Parenthesis opener is set'); - $this->assertArrayNotHasKey('parenthesis_closer', $tokenArray, 'Parenthesis closer is set'); - - }//end testNotArrayKeyword() - - - /** - * Data provider. - * - * @see testNotArrayKeyword() - * - * @return array> - */ - public static function dataNotArrayKeyword() - { - return [ - 'class-constant-name' => [ - 'testMarker' => '/* testClassConst */', - 'testContent' => 'ARRAY', - ], - 'class-method-name' => [ - 'testMarker' => '/* testClassMethod */', - ], - 'class-constant-name-after-type' => [ - 'testMarker' => '/* testTypedOOConstName */', - 'testContent' => 'ARRAY', - ], - ]; - - }//end dataNotArrayKeyword() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapCaseKeywordConditionsTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapCaseKeywordConditionsTest.inc deleted file mode 100644 index c41aedd..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapCaseKeywordConditionsTest.inc +++ /dev/null @@ -1,134 +0,0 @@ - $num) - return bar( - baz( - "foobarbaz" - ) - ); - break; -} diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapCaseKeywordConditionsTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapCaseKeywordConditionsTest.php deleted file mode 100644 index c60c9bb..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapCaseKeywordConditionsTest.php +++ /dev/null @@ -1,272 +0,0 @@ - - * @copyright 2021 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\Tokenizer; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; - -final class RecurseScopeMapCaseKeywordConditionsTest extends AbstractTokenizerTestCase -{ - - - /** - * Test that enum "case" tokens does not get scope indexes. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * - * @dataProvider dataEnumCases - * @covers PHP_CodeSniffer\Tokenizers\Tokenizer::recurseScopeMap - * - * @return void - */ - public function testEnumCases($testMarker) - { - $tokens = $this->phpcsFile->getTokens(); - $enumCase = $this->getTargetToken($testMarker, [T_ENUM_CASE, T_CASE]); - $tokenArray = $tokens[$enumCase]; - - // Make sure we're looking at the right token. - $this->assertSame(T_ENUM_CASE, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_ENUM_CASE (code)'); - - $this->assertArrayNotHasKey('scope_condition', $tokenArray, 'Scope condition is set'); - $this->assertArrayNotHasKey('scope_opener', $tokenArray, 'Scope opener is set'); - $this->assertArrayNotHasKey('scope_closer', $tokenArray, 'Scope closer is set'); - - }//end testEnumCases() - - - /** - * Data provider. - * - * @see testEnumCases() - * - * @return array> - */ - public static function dataEnumCases() - { - return [ - 'enum case, no value' => ['/* testPureEnumCase */'], - 'enum case, integer value' => ['/* testBackingIntegerEnumCase */'], - 'enum case, string value' => ['/* testBackingStringEnumCase */'], - 'enum case, integer value in more complex enum' => ['/* testEnumCaseInComplexEnum */'], - 'enum case, keyword in mixed case' => ['/* testEnumCaseIsCaseInsensitive */'], - 'enum case, after switch statement' => ['/* testEnumCaseAfterSwitch */'], - 'enum case, after switch statement using alternative syntax' => ['/* testEnumCaseAfterSwitchWithEndSwitch */'], - ]; - - }//end dataEnumCases() - - - /** - * Test that switch "case" tokens do get the scope indexes. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * @param array $expectedTokens The expected token codes for the scope opener/closer. - * @param string|null $testCloserMarker Optional. The comment which prefaces the scope closer if different - * from the test marker. - * - * @dataProvider dataNotEnumCases - * @covers PHP_CodeSniffer\Tokenizers\Tokenizer::recurseScopeMap - * - * @return void - */ - public function testNotEnumCases($testMarker, $expectedTokens, $testCloserMarker=null) - { - $tokens = $this->phpcsFile->getTokens(); - $caseIndex = $this->getTargetToken($testMarker, [T_ENUM_CASE, T_CASE]); - $tokenArray = $tokens[$caseIndex]; - - $scopeCloserMarker = $testMarker; - if (isset($testCloserMarker) === true) { - $scopeCloserMarker = $testCloserMarker; - } - - $expectedScopeCondition = $caseIndex; - $expectedScopeOpener = $this->getTargetToken($testMarker, $expectedTokens['scope_opener']); - $expectedScopeCloser = $this->getTargetToken($scopeCloserMarker, $expectedTokens['scope_closer']); - - // Make sure we're looking at the right token. - $this->assertSame(T_CASE, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_CASE (code)'); - - $this->assertArrayHasKey('scope_condition', $tokenArray, 'Scope condition is not set'); - $this->assertSame( - $expectedScopeCondition, - $tokenArray['scope_condition'], - sprintf( - 'Scope condition not set correctly; expected T_CASE, found %s.', - $tokens[$tokenArray['scope_condition']]['type'] - ) - ); - - $this->assertArrayHasKey('scope_opener', $tokenArray, 'Scope opener is not set'); - $this->assertSame( - $expectedScopeOpener, - $tokenArray['scope_opener'], - sprintf( - 'Scope opener not set correctly; expected %s, found %s.', - $tokens[$expectedScopeOpener]['type'], - $tokens[$tokenArray['scope_opener']]['type'] - ) - ); - - $this->assertArrayHasKey('scope_closer', $tokenArray, 'Scope closer is not set'); - $this->assertSame( - $expectedScopeCloser, - $tokenArray['scope_closer'], - sprintf( - 'Scope closer not set correctly; expected %s, found %s.', - $tokens[$expectedScopeCloser]['type'], - $tokens[$tokenArray['scope_closer']]['type'] - ) - ); - - }//end testNotEnumCases() - - - /** - * Data provider. - * - * @see testNotEnumCases() - * - * @return array>> - */ - public static function dataNotEnumCases() - { - return [ - 'switch case with constant, semicolon condition end' => [ - 'testMarker' => '/* testCaseWithSemicolonIsNotEnumCase */', - 'expectedTokens' => [ - 'scope_opener' => T_SEMICOLON, - 'scope_closer' => T_CLOSE_CURLY_BRACKET, - ], - ], - 'switch case with constant, colon condition end' => [ - 'testMarker' => '/* testCaseWithConstantIsNotEnumCase */', - 'expectedTokens' => [ - 'scope_opener' => T_COLON, - 'scope_closer' => T_CLOSE_CURLY_BRACKET, - ], - 'testCloserMarker' => '/* testCaseConstantCloserMarker */', - ], - 'switch case with constant, comparison' => [ - 'testMarker' => '/* testCaseWithConstantAndIdenticalIsNotEnumCase */', - 'expectedTokens' => [ - 'scope_opener' => T_COLON, - 'scope_closer' => T_CLOSE_CURLY_BRACKET, - ], - 'testCloserMarker' => '/* testCaseConstantCloserMarker */', - ], - 'switch case with constant, assignment' => [ - 'testMarker' => '/* testCaseWithAssignmentToConstantIsNotEnumCase */', - 'expectedTokens' => [ - 'scope_opener' => T_COLON, - 'scope_closer' => T_CLOSE_CURLY_BRACKET, - ], - 'testCloserMarker' => '/* testCaseConstantCloserMarker */', - ], - 'switch case with constant, keyword in mixed case' => [ - 'testMarker' => '/* testIsNotEnumCaseIsCaseInsensitive */', - 'expectedTokens' => [ - 'scope_opener' => T_COLON, - 'scope_closer' => T_CLOSE_CURLY_BRACKET, - ], - 'testCloserMarker' => '/* testCaseConstantCloserMarker */', - ], - 'switch case, body in curlies declares enum' => [ - 'testMarker' => '/* testCaseInSwitchWhenCreatingEnumInSwitch1 */', - 'expectedTokens' => [ - 'scope_opener' => T_OPEN_CURLY_BRACKET, - 'scope_closer' => T_CLOSE_CURLY_BRACKET, - ], - 'testCloserMarker' => '/* testCaseInSwitchWhenCreatingEnumInSwitch1CloserMarker */', - ], - 'switch case, body after semicolon declares enum' => [ - 'testMarker' => '/* testCaseInSwitchWhenCreatingEnumInSwitch2 */', - 'expectedTokens' => [ - 'scope_opener' => T_SEMICOLON, - 'scope_closer' => T_BREAK, - ], - 'testCloserMarker' => '/* testCaseInSwitchWhenCreatingEnumInSwitch2CloserMarker */', - ], - 'switch case, shared closer with switch' => [ - 'testMarker' => '/* testSwitchCaseScopeCloserSharedWithSwitch */', - 'expectedTokens' => [ - 'scope_opener' => T_COLON, - 'scope_closer' => T_ENDSWITCH, - ], - ], - 'switch case, nested inline if/elseif/else with and without braces' => [ - 'testMarker' => '/* testSwitchCaseNestedIfWithAndWithoutBraces */', - 'expectedTokens' => [ - 'scope_opener' => T_COLON, - 'scope_closer' => T_BREAK, - ], - ], - 'switch case, nested inline if' => [ - 'testMarker' => '/* testSwitchCaseNestedInlineIfWithMoreThanThreeLines */', - 'expectedTokens' => [ - 'scope_opener' => T_COLON, - 'scope_closer' => T_BREAK, - ], - ], - ]; - - }//end dataNotEnumCases() - - - /** - * Test that a "case" keyword which is not a switch or enum case, does not get the scope indexes. - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * - * @dataProvider dataKeywordAsEnumCaseNameShouldBeString - * @covers PHP_CodeSniffer\Tokenizers\Tokenizer::recurseScopeMap - * - * @return void - */ - public function testKeywordAsEnumCaseNameShouldBeString($testMarker) - { - $tokens = $this->phpcsFile->getTokens(); - $enumCaseName = $this->getTargetToken($testMarker, [T_STRING, T_INTERFACE, T_TRAIT, T_ENUM, T_FUNCTION, T_FALSE, T_DEFAULT, T_ARRAY]); - $tokenArray = $tokens[$enumCaseName]; - - // Make sure we're looking at the right token. - $this->assertSame(T_STRING, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_STRING (code)'); - - $this->assertArrayNotHasKey('scope_condition', $tokenArray, 'Scope condition is set'); - $this->assertArrayNotHasKey('scope_opener', $tokenArray, 'Scope opener is set'); - $this->assertArrayNotHasKey('scope_closer', $tokenArray, 'Scope closer is set'); - - }//end testKeywordAsEnumCaseNameShouldBeString() - - - /** - * Data provider. - * - * @see testKeywordAsEnumCaseNameShouldBeString() - * - * @return array> - */ - public static function dataKeywordAsEnumCaseNameShouldBeString() - { - return [ - '"interface" as case name' => ['/* testKeywordAsEnumCaseNameShouldBeString1 */'], - '"trait" as case name' => ['/* testKeywordAsEnumCaseNameShouldBeString2 */'], - '"enum" as case name' => ['/* testKeywordAsEnumCaseNameShouldBeString3 */'], - '"function" as case name' => ['/* testKeywordAsEnumCaseNameShouldBeString4 */'], - '"false" as case name' => ['/* testKeywordAsEnumCaseNameShouldBeString5 */'], - '"default" as case name' => ['/* testKeywordAsEnumCaseNameShouldBeString6 */'], - '"array" as case name' => ['/* testKeywordAsEnumCaseNameShouldBeString7 */'], - '"exit" as case name' => ['/* testKeywordAsEnumCaseNameShouldBeString8 */'], - ]; - - }//end dataKeywordAsEnumCaseNameShouldBeString() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapDefaultKeywordConditionsTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapDefaultKeywordConditionsTest.inc deleted file mode 100644 index c98f518..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapDefaultKeywordConditionsTest.inc +++ /dev/null @@ -1,231 +0,0 @@ - 1, - 2 => 2, - /* testSimpleMatchDefault */ - default => 'default', - }; -} - -function switchWithDefault($i) { - switch ($i) { - case 1: - return 1; - case 2: - return 2; - /* testSimpleSwitchDefault */ - default: - return 'default'; - } -} - -function switchWithDefaultAndCurlies($i) { - switch ($i) { - case 1: - return 1; - case 2: - return 2; - /* testSimpleSwitchDefaultWithCurlies */ - default: /* testSimpleSwitchDefaultWithCurliesScopeOpener */ { - /* testSimpleSwitchDefaultWithCurliesConditionStop */ - return 'default'; - /* testSimpleSwitchDefaultWithCurliesScopeCloser */ - } - } -} - -function matchWithDefaultInSwitch() { - switch ($something) { - case 'foo': - $var = [1, 2, 3]; - $var = match ($i) { - 1 => 1, - /* testMatchDefaultNestedInSwitchCase1 */ - default => 'default', - }; - continue; - - case 'bar' : - $i = callMe($a, $b); - return match ($i) { - 1 => 1, - /* testMatchDefaultNestedInSwitchCase2 */ - default => 'default', - }; - - /* testSwitchDefault */ - default; - echo 'something', match ($i) { - 1, => 1, - /* testMatchDefaultNestedInSwitchDefault */ - default, => 'default', - }; - /* testSwitchDefaultCloserMarker */ - break; - } -} - -function switchWithDefaultInMatch() { - $x = match ($y) { - 5, 8 => function($z) { - switch($z) { - case 'a'; - $var = [1, 2, 3]; - return 'a'; - /* testSwitchDefaultNestedInMatchCase */ - default: - $var = [1, 2, 3]; - return 'default1'; - } - }, - /* testMatchDefault */ - default => function($z) { - switch($z) { - case 'a': - $i = callMe($a, $b); - return 'b'; - /* testSwitchDefaultNestedInMatchDefault */ - default: - $i = callMe($a, $b); - return 'default2'; - } - } - }; -} - -function switchAndDefaultSharingScopeCloser($i) { - switch ($i): - /* testSwitchAndDefaultSharingScopeCloser */ - default: - echo 'one'; - /* testSwitchAndDefaultSharingScopeCloserScopeCloser */ - endswitch; -} - -function switchDefaultNestedIfWithAndWithoutBraces($i, $foo, $baz) { - switch ($i) { - /* testSwitchDefaultNestedIfWithAndWithoutBraces */ - default: - if ($foo) { - return true; - } elseif ($baz) - return true; - else { - echo 'else'; - } - /* testSwitchDefaultNestedIfWithAndWithoutBracesScopeCloser */ - break; - } -} - -function shortArrayWithConstantKey() { - $arr = [ - /* testClassConstantAsShortArrayKey */ - SomeClass::DEFAULT => 1, - /* testClassPropertyAsShortArrayKey */ - SomeClass->DEFAULT => 1, - /* testNamespacedConstantAsShortArrayKey */ - // Intentional parse error PHP < 8.0. Reserved keyword used as namespaced constant. - SomeNamespace\DEFAULT => 1, - /* testFQNGlobalConstantAsShortArrayKey */ - // Intentional parse error in PHP < 8.0. Reserved keyword used as global constant. - \DEFAULT => 1, - ]; -} - -function longArrayWithConstantKey() { - $arr = array( - /* testClassConstantAsLongArrayKey */ - SomeClass::DEFAULT => 1, - ); -} - -function yieldWithConstantKey() { - /* testClassConstantAsYieldKey */ - yield SomeClass::DEFAULT => 1; -} - -function longArrayWithConstantKeyNestedInMatch() { - return match($x) { - /* testMatchDefaultWithNestedLongArrayWithClassConstantKey */ - DEFAULT => array( - /* testClassConstantAsLongArrayKeyNestedInMatch */ - SomeClass::DEFAULT => match($x) { - /* testMatchDefaultWithNestedLongArrayWithClassConstantKeyLevelDown */ - DEFAULT => array( - /* testClassConstantAsLongArrayKeyNestedInMatchLevelDown */ - SomeClass::DEFAULT => 1, - ), - }, - ), - }; -} - -function shortArrayWithConstantKeyNestedInMatch() { - return match($x) { - /* testMatchDefaultWithNestedShortArrayWithClassConstantKey */ - DEFAULT => [ - /* testClassConstantAsShortArrayKeyNestedInMatch */ - SomeClass::DEFAULT => match($x) { - /* testMatchDefaultWithNestedShortArrayWithClassConstantKeyLevelDown */ - DEFAULT => [ - /* testClassConstantAsShortArrayKeyNestedInMatchLevelDown */ - SomeClass::DEFAULT => 1, - ], - }, - ], - }; -} - - -function longArrayWithConstantKeyWithNestedMatch() { - return array( - /* testClassConstantAsLongArrayKeyWithNestedMatch */ - SomeClass::DEFAULT => match($x) { - /* testMatchDefaultNestedInLongArray */ - DEFAULT => 'foo' - }, - ); -} - -function shortArrayWithConstantKeyWithNestedMatch() { - return [ - /* testClassConstantAsShortArrayKeyWithNestedMatch */ - SomeClass::DEFAULT => match($x) { - /* testMatchDefaultNestedInShortArray */ - DEFAULT => 'foo' - }, - ]; -} - -function switchWithConstantNonDefault($i) { - switch ($i) { - /* testClassConstantInSwitchCase */ - case SomeClass::DEFAULT: - return 1; - - /* testClassPropertyInSwitchCase */ - case SomeClass->DEFAULT: - return 2; - - /* testNamespacedConstantInSwitchCase */ - // Intentional parse error PHP < 8.0. Reserved keyword used as constant. - case SomeNamespace\DEFAULT: - return 2; - - /* testNamespaceRelativeConstantInSwitchCase */ - // Intentional parse error PHP < 8.0. Reserved keyword used as global constant. - case namespace\DEFAULT: - return 2; - } -} - -class Foo { - /* testClassConstant */ - const DEFAULT = 'foo'; - - /* testMethodDeclaration */ - public function default() {} -} diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapDefaultKeywordConditionsTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapDefaultKeywordConditionsTest.php deleted file mode 100644 index 976f69d..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapDefaultKeywordConditionsTest.php +++ /dev/null @@ -1,487 +0,0 @@ - - * @copyright 2020-2021 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\Tokenizer; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; - -final class RecurseScopeMapDefaultKeywordConditionsTest extends AbstractTokenizerTestCase -{ - - /** - * Condition stop tokens when `default` is used with curlies. - * - * @var array - */ - protected $conditionStopTokens = [ - T_BREAK, - T_CONTINUE, - T_EXIT, - T_GOTO, - T_RETURN, - T_THROW, - ]; - - - /** - * Test that match "default" tokens does not get scope indexes. - * - * Note: Cases and default structures within a match structure do *NOT* get case/default scope - * conditions, in contrast to case and default structures in switch control structures. - * - * @param string $testMarker The comment prefacing the target token. - * @param string $testContent The token content to look for. - * - * @dataProvider dataMatchDefault - * @covers PHP_CodeSniffer\Tokenizers\Tokenizer::recurseScopeMap - * - * @return void - */ - public function testMatchDefault($testMarker, $testContent='default') - { - $tokens = $this->phpcsFile->getTokens(); - - $token = $this->getTargetToken($testMarker, [T_MATCH_DEFAULT, T_DEFAULT, T_STRING], $testContent); - $tokenArray = $tokens[$token]; - - // Make sure we're looking at the right token. - $this->assertSame( - T_MATCH_DEFAULT, - $tokenArray['code'], - sprintf('Token tokenized as %s, not T_MATCH_DEFAULT (code). Marker: %s.', $tokenArray['type'], $testMarker) - ); - - $this->assertArrayNotHasKey( - 'scope_condition', - $tokenArray, - sprintf('Scope condition is set. Marker: %s.', $testMarker) - ); - $this->assertArrayNotHasKey( - 'scope_opener', - $tokenArray, - sprintf('Scope opener is set. Marker: %s.', $testMarker) - ); - $this->assertArrayNotHasKey( - 'scope_closer', - $tokenArray, - sprintf('Scope closer is set. Marker: %s.', $testMarker) - ); - - }//end testMatchDefault() - - - /** - * Data provider. - * - * @see testMatchDefault() - * - * @return array> - */ - public static function dataMatchDefault() - { - return [ - 'simple_match_default' => [ - 'testMarker' => '/* testSimpleMatchDefault */', - ], - 'match_default_in_switch_case_1' => [ - 'testMarker' => '/* testMatchDefaultNestedInSwitchCase1 */', - ], - 'match_default_in_switch_case_2' => [ - 'testMarker' => '/* testMatchDefaultNestedInSwitchCase2 */', - ], - 'match_default_in_switch_default' => [ - 'testMarker' => '/* testMatchDefaultNestedInSwitchDefault */', - ], - 'match_default_containing_switch' => [ - 'testMarker' => '/* testMatchDefault */', - ], - - 'match_default_with_nested_long_array_and_default_key' => [ - 'testMarker' => '/* testMatchDefaultWithNestedLongArrayWithClassConstantKey */', - 'testContent' => 'DEFAULT', - ], - 'match_default_with_nested_long_array_and_default_key_2' => [ - 'testMarker' => '/* testMatchDefaultWithNestedLongArrayWithClassConstantKeyLevelDown */', - 'testContent' => 'DEFAULT', - ], - 'match_default_with_nested_short_array_and_default_key' => [ - 'testMarker' => '/* testMatchDefaultWithNestedShortArrayWithClassConstantKey */', - 'testContent' => 'DEFAULT', - ], - 'match_default_with_nested_short_array_and_default_key_2' => [ - 'testMarker' => '/* testMatchDefaultWithNestedShortArrayWithClassConstantKeyLevelDown */', - 'testContent' => 'DEFAULT', - ], - 'match_default_in_long_array' => [ - 'testMarker' => '/* testMatchDefaultNestedInLongArray */', - 'testContent' => 'DEFAULT', - ], - 'match_default_in_short_array' => [ - 'testMarker' => '/* testMatchDefaultNestedInShortArray */', - 'testContent' => 'DEFAULT', - ], - ]; - - }//end dataMatchDefault() - - - /** - * Test that switch "default" tokens do get the scope indexes. - * - * Note: Cases and default structures within a switch control structure *do* get case/default scope - * conditions. - * - * @param string $testMarker The comment prefacing the target token. - * @param string $openerMarker The comment prefacing the scope opener token. - * @param string $closerMarker The comment prefacing the scope closer token. - * @param string|null $conditionStopMarker The expected offset in relation to the testMarker, after which tokens stop - * having T_DEFAULT as a scope condition. - * @param string $testContent The token content to look for. - * @param bool $sharedScopeCloser Whether to skip checking for the `scope_condition` of the - * scope closer. Needed when the default and switch - * structures share a scope closer. See - * https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/810. - * - * @dataProvider dataSwitchDefault - * @covers PHP_CodeSniffer\Tokenizers\Tokenizer::recurseScopeMap - * - * @return void - */ - public function testSwitchDefault($testMarker, $openerMarker, $closerMarker, $conditionStopMarker=null, $testContent='default', $sharedScopeCloser=false) - { - $tokens = $this->phpcsFile->getTokens(); - - $token = $this->getTargetToken($testMarker, [T_MATCH_DEFAULT, T_DEFAULT, T_STRING], $testContent); - $tokenArray = $tokens[$token]; - $expectedScopeOpener = $this->getTargetToken($openerMarker, [T_COLON, T_OPEN_CURLY_BRACKET, T_SEMICOLON]); - $expectedScopeCloser = $this->getTargetToken($closerMarker, [T_BREAK, T_CLOSE_CURLY_BRACKET, T_RETURN, T_ENDSWITCH]); - - // Make sure we're looking at the right token. - $this->assertSame( - T_DEFAULT, - $tokenArray['code'], - sprintf('Token tokenized as %s, not T_DEFAULT (code). Marker: %s.', $tokenArray['type'], $testMarker) - ); - - $this->assertArrayHasKey( - 'scope_condition', - $tokenArray, - sprintf('Scope condition is not set. Marker: %s.', $testMarker) - ); - $this->assertArrayHasKey( - 'scope_opener', - $tokenArray, - sprintf('Scope opener is not set. Marker: %s.', $testMarker) - ); - $this->assertArrayHasKey( - 'scope_closer', - $tokenArray, - sprintf('Scope closer is not set. Marker: %s.', $testMarker) - ); - $this->assertSame( - $token, - $tokenArray['scope_condition'], - sprintf('Scope condition is not the T_DEFAULT token. Marker: %s.', $testMarker) - ); - $this->assertSame( - $expectedScopeOpener, - $tokenArray['scope_opener'], - sprintf('Scope opener of the T_DEFAULT token incorrect. Marker: %s.', $testMarker) - ); - $this->assertSame( - $expectedScopeCloser, - $tokenArray['scope_closer'], - sprintf('Scope closer of the T_DEFAULT token incorrect. Marker: %s.', $testMarker) - ); - - $opener = $tokenArray['scope_opener']; - $this->assertArrayHasKey( - 'scope_condition', - $tokens[$opener], - sprintf('Opener scope condition is not set. Marker: %s.', $openerMarker) - ); - $this->assertArrayHasKey( - 'scope_opener', - $tokens[$opener], - sprintf('Opener scope opener is not set. Marker: %s.', $openerMarker) - ); - $this->assertArrayHasKey( - 'scope_closer', - $tokens[$opener], - sprintf('Opener scope closer is not set. Marker: %s.', $openerMarker) - ); - $this->assertSame( - $token, - $tokens[$opener]['scope_condition'], - sprintf('Opener scope condition is not the T_DEFAULT token. Marker: %s.', $openerMarker) - ); - $this->assertSame( - $expectedScopeOpener, - $tokens[$opener]['scope_opener'], - sprintf('T_DEFAULT opener scope opener token incorrect. Marker: %s.', $openerMarker) - ); - $this->assertSame( - $expectedScopeCloser, - $tokens[$opener]['scope_closer'], - sprintf('T_DEFAULT opener scope closer token incorrect. Marker: %s.', $openerMarker) - ); - - $closer = $expectedScopeCloser; - - if ($sharedScopeCloser === false) { - $closer = $tokenArray['scope_closer']; - $this->assertArrayHasKey( - 'scope_condition', - $tokens[$closer], - sprintf('Closer scope condition is not set. Marker: %s.', $closerMarker) - ); - $this->assertArrayHasKey( - 'scope_opener', - $tokens[$closer], - sprintf('Closer scope opener is not set. Marker: %s.', $closerMarker) - ); - $this->assertArrayHasKey( - 'scope_closer', - $tokens[$closer], - sprintf('Closer scope closer is not set. Marker: %s.', $closerMarker) - ); - $this->assertSame( - $token, - $tokens[$closer]['scope_condition'], - sprintf('Closer scope condition is not the T_DEFAULT token. Marker: %s.', $closerMarker) - ); - $this->assertSame( - $expectedScopeOpener, - $tokens[$closer]['scope_opener'], - sprintf('T_DEFAULT closer scope opener token incorrect. Marker: %s.', $closerMarker) - ); - $this->assertSame( - $expectedScopeCloser, - $tokens[$closer]['scope_closer'], - sprintf('T_DEFAULT closer scope closer token incorrect. Marker: %s.', $closerMarker) - ); - }//end if - - if (($opener + 1) !== $closer) { - $end = $closer; - if (isset($conditionStopMarker) === true) { - $end = ( $this->getTargetToken($conditionStopMarker, $this->conditionStopTokens) + 1); - } - - for ($i = ($opener + 1); $i < $end; $i++) { - $this->assertArrayHasKey( - $token, - $tokens[$i]['conditions'], - sprintf('T_DEFAULT condition not added for token belonging to the T_DEFAULT structure. Marker: %s.', $testMarker) - ); - } - }//end if - - }//end testSwitchDefault() - - - /** - * Data provider. - * - * @see testSwitchDefault() - * - * @return array> - */ - public static function dataSwitchDefault() - { - return [ - 'simple_switch_default' => [ - 'testMarker' => '/* testSimpleSwitchDefault */', - 'openerMarker' => '/* testSimpleSwitchDefault */', - 'closerMarker' => '/* testSimpleSwitchDefault */', - ], - 'simple_switch_default_with_curlies' => [ - // For a default structure with curly braces, the scope opener - // will be the open curly and the closer the close curly. - // However, scope conditions will not be set for open to close, - // but only for the open token up to the "break/return/continue" etc. - 'testMarker' => '/* testSimpleSwitchDefaultWithCurlies */', - 'openerMarker' => '/* testSimpleSwitchDefaultWithCurliesScopeOpener */', - 'closerMarker' => '/* testSimpleSwitchDefaultWithCurliesScopeCloser */', - 'conditionStopMarker' => '/* testSimpleSwitchDefaultWithCurliesConditionStop */', - ], - 'switch_default_toplevel' => [ - 'testMarker' => '/* testSwitchDefault */', - 'openerMarker' => '/* testSwitchDefault */', - 'closerMarker' => '/* testSwitchDefaultCloserMarker */', - ], - 'switch_default_nested_in_match_case' => [ - 'testMarker' => '/* testSwitchDefaultNestedInMatchCase */', - 'openerMarker' => '/* testSwitchDefaultNestedInMatchCase */', - 'closerMarker' => '/* testSwitchDefaultNestedInMatchCase */', - ], - 'switch_default_nested_in_match_default' => [ - 'testMarker' => '/* testSwitchDefaultNestedInMatchDefault */', - 'openerMarker' => '/* testSwitchDefaultNestedInMatchDefault */', - 'closerMarker' => '/* testSwitchDefaultNestedInMatchDefault */', - ], - 'switch_and_default_sharing_scope_closer' => [ - 'testMarker' => '/* testSwitchAndDefaultSharingScopeCloser */', - 'openerMarker' => '/* testSwitchAndDefaultSharingScopeCloser */', - 'closerMarker' => '/* testSwitchAndDefaultSharingScopeCloserScopeCloser */', - 'conditionStopMarker' => null, - 'testContent' => 'default', - 'sharedScopeCloser' => true, - ], - 'switch_and_default_with_nested_if_with_and_without_braces' => [ - 'testMarker' => '/* testSwitchDefaultNestedIfWithAndWithoutBraces */', - 'openerMarker' => '/* testSwitchDefaultNestedIfWithAndWithoutBraces */', - 'closerMarker' => '/* testSwitchDefaultNestedIfWithAndWithoutBracesScopeCloser */', - ], - ]; - - }//end dataSwitchDefault() - - - /** - * Test that a "default" keyword which is not a switch or match default, does not get the scope indexes. - * - * @param string $testMarker The comment prefacing the target token. - * @param string $testContent The token content to look for. - * - * @dataProvider dataNotDefaultKeyword - * @covers PHP_CodeSniffer\Tokenizers\Tokenizer::recurseScopeMap - * - * @return void - */ - public function testNotDefaultKeyword($testMarker, $testContent='DEFAULT') - { - $tokens = $this->phpcsFile->getTokens(); - - $token = $this->getTargetToken($testMarker, [T_MATCH_DEFAULT, T_DEFAULT, T_STRING], $testContent); - $tokenArray = $tokens[$token]; - - // Make sure we're looking at the right token. - $this->assertSame( - T_STRING, - $tokenArray['code'], - sprintf('Token tokenized as %s, not T_STRING (code). Marker: %s.', $tokenArray['type'], $testMarker) - ); - - $this->assertArrayNotHasKey( - 'scope_condition', - $tokenArray, - sprintf('Scope condition is set. Marker: %s.', $testMarker) - ); - $this->assertArrayNotHasKey( - 'scope_opener', - $tokenArray, - sprintf('Scope opener is set. Marker: %s.', $testMarker) - ); - $this->assertArrayNotHasKey( - 'scope_closer', - $tokenArray, - sprintf('Scope closer is set. Marker: %s.', $testMarker) - ); - - }//end testNotDefaultKeyword() - - - /** - * Data provider. - * - * @see testNotDefaultKeyword() - * - * @return array> - */ - public static function dataNotDefaultKeyword() - { - return [ - 'class-constant-as-short-array-key' => [ - 'testMarker' => '/* testClassConstantAsShortArrayKey */', - ], - 'class-property-as-short-array-key' => [ - 'testMarker' => '/* testClassPropertyAsShortArrayKey */', - ], - 'namespaced-constant-as-short-array-key' => [ - 'testMarker' => '/* testNamespacedConstantAsShortArrayKey */', - ], - 'fqn-global-constant-as-short-array-key' => [ - 'testMarker' => '/* testFQNGlobalConstantAsShortArrayKey */', - ], - 'class-constant-as-long-array-key' => [ - 'testMarker' => '/* testClassConstantAsLongArrayKey */', - ], - 'class-constant-as-yield-key' => [ - 'testMarker' => '/* testClassConstantAsYieldKey */', - ], - - 'class-constant-as-long-array-key-nested-in-match' => [ - 'testMarker' => '/* testClassConstantAsLongArrayKeyNestedInMatch */', - ], - 'class-constant-as-long-array-key-nested-in-match-2' => [ - 'testMarker' => '/* testClassConstantAsLongArrayKeyNestedInMatchLevelDown */', - ], - 'class-constant-as-short-array-key-nested-in-match' => [ - 'testMarker' => '/* testClassConstantAsShortArrayKeyNestedInMatch */', - ], - 'class-constant-as-short-array-key-nested-in-match-2' => [ - 'testMarker' => '/* testClassConstantAsShortArrayKeyNestedInMatchLevelDown */', - ], - 'class-constant-as-long-array-key-with-nested-match' => [ - 'testMarker' => '/* testClassConstantAsLongArrayKeyWithNestedMatch */', - ], - 'class-constant-as-short-array-key-with-nested-match' => [ - 'testMarker' => '/* testClassConstantAsShortArrayKeyWithNestedMatch */', - ], - - 'class-constant-in-switch-case' => [ - 'testMarker' => '/* testClassConstantInSwitchCase */', - ], - 'class-property-in-switch-case' => [ - 'testMarker' => '/* testClassPropertyInSwitchCase */', - ], - 'namespaced-constant-in-switch-case' => [ - 'testMarker' => '/* testNamespacedConstantInSwitchCase */', - ], - 'namespace-relative-constant-in-switch-case' => [ - 'testMarker' => '/* testNamespaceRelativeConstantInSwitchCase */', - ], - - 'class-constant-declaration' => [ - 'testMarker' => '/* testClassConstant */', - ], - 'class-method-declaration' => [ - 'testMarker' => '/* testMethodDeclaration */', - 'testContent' => 'default', - ], - ]; - - }//end dataNotDefaultKeyword() - - - /** - * Test a specific edge case where a scope opener would be incorrectly set. - * - * @link https://github.com/squizlabs/PHP_CodeSniffer/issues/3326 - * - * @covers PHP_CodeSniffer\Tokenizers\Tokenizer::recurseScopeMap - * - * @return void - */ - public function testIssue3326() - { - $tokens = $this->phpcsFile->getTokens(); - - $token = $this->getTargetToken('/* testClassConstant */', [T_SEMICOLON]); - $tokenArray = $tokens[$token]; - - $this->assertArrayNotHasKey('scope_condition', $tokenArray, 'Scope condition is set'); - $this->assertArrayNotHasKey('scope_opener', $tokenArray, 'Scope opener is set'); - $this->assertArrayNotHasKey('scope_closer', $tokenArray, 'Scope closer is set'); - - }//end testIssue3326() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapIfKeywordConditionsTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapIfKeywordConditionsTest.inc deleted file mode 100644 index e303c38..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapIfKeywordConditionsTest.inc +++ /dev/null @@ -1,13 +0,0 @@ - - * @author Rodrigo Primo - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\Tokenizer; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; - -final class RecurseScopeMapIfKeywordConditionsTest extends AbstractTokenizerTestCase -{ - - - /** - * Tests setting the scope for T_IF token with nested case statement missing break statement. - * - * @link https://github.com/squizlabs/PHP_CodeSniffer/issues/497#ref-commit-fddc61a - * - * @covers \PHP_CodeSniffer\Tokenizers\Tokenizer::recurseScopeMap - * - * @return void - */ - public function testIfElseWithNestedCaseMissingBreakSharedClosers() - { - - $tokens = $this->phpcsFile->getTokens(); - $ifTestMarker = '/* testIfElseWithNestedCaseMissingBreak */'; - $ifCloserTestMarker = '/* testIfElseWithNestedCaseMissingBreakCloser */'; - $ifTokenIndex = $this->getTargetToken($ifTestMarker, T_IF); - $tokenArray = $tokens[$ifTokenIndex]; - - $expectedScopeCondition = $ifTokenIndex; - $expectedScopeOpener = $this->getTargetToken($ifTestMarker, T_COLON); - $expectedScopeCloser = $this->getTargetToken($ifCloserTestMarker, T_ELSE); - - $this->assertArrayHasKey('scope_condition', $tokenArray, 'Scope condition not set'); - $this->assertSame( - $expectedScopeCondition, - $tokenArray['scope_condition'], - sprintf( - 'Scope condition not set correctly; expected T_IF, found %s', - $tokens[$tokenArray['scope_condition']]['type'] - ) - ); - - $this->assertArrayHasKey('scope_opener', $tokenArray, 'Scope opener not set'); - $this->assertSame( - $expectedScopeOpener, - $tokenArray['scope_opener'], - sprintf( - 'Scope opener not set correctly; expected %s, found %s', - $tokens[$expectedScopeOpener]['type'], - $tokens[$tokenArray['scope_opener']]['type'] - ) - ); - - $this->assertArrayHasKey('scope_closer', $tokenArray, 'Scope closer not set'); - $this->assertSame( - $expectedScopeCloser, - $tokenArray['scope_closer'], - sprintf( - 'Scope closer not set correctly; expected %s, found %s', - $tokens[$expectedScopeCloser]['type'], - $tokens[$tokenArray['scope_closer']]['type'] - ) - ); - - }//end testIfElseWithNestedCaseMissingBreakSharedClosers() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapSwitchTokenScopeTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapSwitchTokenScopeTest.inc deleted file mode 100644 index 6df910b..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapSwitchTokenScopeTest.inc +++ /dev/null @@ -1,60 +0,0 @@ - $obj->{$foo . $bar})()) /* testSwitchArrowFunctionWithinConditionScopeOpener */ { - case 1: - return 'test'; -/* testSwitchArrowFunctionWithinConditionScopeCloser */ -} - -/* testSwitchArrowFunctionWithReturnTypeWithinCondition */ -switch((fn(): string => $condition ? 'foo' : 'bar')()) /* testSwitchArrowFunctionWithReturnTypeWithinConditionScopeOpener */ : - /* testSwitchArrowFunctionWithReturnTypeWithinConditionEnsureTestWillNotPickUpWrongColon */ - case 1: - return 'test'; -/* testSwitchArrowFunctionWithReturnTypeWithinConditionScopeCloser */ -endswitch; diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapSwitchTokenScopeTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapSwitchTokenScopeTest.php deleted file mode 100644 index 535ca56..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapSwitchTokenScopeTest.php +++ /dev/null @@ -1,160 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\Tokenizer; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; - -final class RecurseScopeMapSwitchTokenScopeTest extends AbstractTokenizerTestCase -{ - - - /** - * Tests setting the scope for T_SWITCH token (normal and alternative syntax). - * - * @param string $testMarker The comment which prefaces the target token in the test file. - * @param array $expectedTokens The expected token codes for the scope opener/closer. - * @param string|null $testOpenerMarker Optional. The comment which prefaces the scope opener if different - * from the test marker. - * @param string|null $testCloserMarker Optional. The comment which prefaces the scope closer if different - * from the test marker. - * - * @link https://github.com/squizlabs/PHP_CodeSniffer/issues/497#ref-commit-b24b96b - * - * @dataProvider dataSwitchScope - * @covers \PHP_CodeSniffer\Tokenizers\Tokenizer::recurseScopeMap - * - * @return void - */ - public function testSwitchScope($testMarker, $expectedTokens, $testOpenerMarker=null, $testCloserMarker=null) - { - $tokens = $this->phpcsFile->getTokens(); - $switchIndex = $this->getTargetToken($testMarker, [T_SWITCH]); - $tokenArray = $tokens[$switchIndex]; - - $scopeOpenerMarker = $testMarker; - if (isset($testOpenerMarker) === true) { - $scopeOpenerMarker = $testOpenerMarker; - } - - $scopeCloserMarker = $testMarker; - if (isset($testCloserMarker) === true) { - $scopeCloserMarker = $testCloserMarker; - } - - $expectedScopeCondition = $switchIndex; - $expectedScopeOpener = $this->getTargetToken($scopeOpenerMarker, $expectedTokens['scope_opener']); - $expectedScopeCloser = $this->getTargetToken($scopeCloserMarker, $expectedTokens['scope_closer']); - - $this->assertArrayHasKey('scope_condition', $tokenArray, 'Scope condition not set'); - $this->assertSame( - $expectedScopeCondition, - $tokenArray['scope_condition'], - sprintf( - 'Scope condition not set correctly; expected T_SWITCH, found %s', - $tokens[$tokenArray['scope_condition']]['type'] - ) - ); - - $this->assertArrayHasKey('scope_opener', $tokenArray, 'Scope opener not set'); - $this->assertSame( - $expectedScopeOpener, - $tokenArray['scope_opener'], - sprintf( - 'Scope opener not set correctly; expected %s, found %s', - $tokens[$expectedScopeOpener]['type'], - $tokens[$tokenArray['scope_opener']]['type'] - ) - ); - - $this->assertArrayHasKey('scope_closer', $tokenArray, 'Scope closer not set'); - $this->assertSame( - $expectedScopeCloser, - $tokenArray['scope_closer'], - sprintf( - 'Scope closer not set correctly; expected %s, found %s', - $tokens[$expectedScopeCloser]['type'], - $tokens[$tokenArray['scope_closer']]['type'] - ) - ); - - }//end testSwitchScope() - - - /** - * Data provider. - * - * @see testSwitchScope() - * - * @return array|null>> - */ - public static function dataSwitchScope() - { - return [ - 'switch normal syntax' => [ - 'testMarker' => '/* testSwitchNormalSyntax */', - 'expectedTokens' => [ - 'scope_opener' => T_OPEN_CURLY_BRACKET, - 'scope_closer' => T_CLOSE_CURLY_BRACKET, - ], - 'testOpenerMarker' => null, - 'testCloserMarker' => '/* testSwitchNormalSyntaxScopeCloser */', - ], - 'switch alternative syntax' => [ - 'testMarker' => '/* testSwitchAlternativeSyntax */', - 'expectedTokens' => [ - 'scope_opener' => T_COLON, - 'scope_closer' => T_ENDSWITCH, - ], - 'testOpenerMarker' => null, - 'testCloserMarker' => '/* testSwitchAlternativeSyntaxScopeCloser */', - ], - 'switch with closure in the condition' => [ - 'testMarker' => '/* testSwitchClosureWithinCondition */', - 'expectedTokens' => [ - 'scope_opener' => T_OPEN_CURLY_BRACKET, - 'scope_closer' => T_CLOSE_CURLY_BRACKET, - ], - 'testOpenerMarker' => '/* testSwitchClosureWithinConditionScopeOpener */', - 'testCloserMarker' => '/* testSwitchClosureWithinConditionScopeCloser */', - ], - 'switch alternative syntax with closure containing return type in the condition' => [ - 'testMarker' => '/* testSwitchClosureWithReturnTypeWithinCondition */', - 'expectedTokens' => [ - 'scope_opener' => T_COLON, - 'scope_closer' => T_ENDSWITCH, - ], - 'testOpenerMarker' => '/* testSwitchClosureWithReturnTypeWithinConditionScopeOpener */', - 'testCloserMarker' => '/* testSwitchClosureWithReturnTypeWithinConditionScopeCloser */', - ], - 'switch with arrow function in the condition' => [ - 'testMarker' => '/* testSwitchArrowFunctionWithinCondition */', - 'expectedTokens' => [ - 'scope_opener' => T_OPEN_CURLY_BRACKET, - 'scope_closer' => T_CLOSE_CURLY_BRACKET, - ], - 'testOpenerMarker' => '/* testSwitchArrowFunctionWithinConditionScopeOpener */', - 'testCloserMarker' => '/* testSwitchArrowFunctionWithinConditionScopeCloser */', - ], - 'switch alternative syntax with arrow function containing return type in the condition' => [ - 'testMarker' => '/* testSwitchArrowFunctionWithReturnTypeWithinCondition */', - 'expectedTokens' => [ - 'scope_opener' => T_COLON, - 'scope_closer' => T_ENDSWITCH, - ], - 'testOpenerMarker' => '/* testSwitchArrowFunctionWithReturnTypeWithinConditionScopeOpener */', - 'testCloserMarker' => '/* testSwitchArrowFunctionWithReturnTypeWithinConditionScopeCloser */', - ], - - ]; - - }//end dataSwitchScope() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapWithNamespaceOperatorTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapWithNamespaceOperatorTest.inc deleted file mode 100644 index 38e5a47..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapWithNamespaceOperatorTest.inc +++ /dev/null @@ -1,19 +0,0 @@ - new namespace\Baz; diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapWithNamespaceOperatorTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapWithNamespaceOperatorTest.php deleted file mode 100644 index 2009b9b..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapWithNamespaceOperatorTest.php +++ /dev/null @@ -1,98 +0,0 @@ - - * @copyright 2020 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\Tokenizer; - -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; - -final class RecurseScopeMapWithNamespaceOperatorTest extends AbstractTokenizerTestCase -{ - - - /** - * Test that the scope opener/closers are set correctly when the namespace keyword is encountered as an operator. - * - * @param string $testMarker The comment which prefaces the target tokens in the test file. - * @param array $tokenTypes The token type to search for. - * @param array $open Optional. The token type for the scope opener. - * @param array $close Optional. The token type for the scope closer. - * - * @dataProvider dataScopeSetting - * @covers PHP_CodeSniffer\Tokenizers\Tokenizer::recurseScopeMap - * - * @return void - */ - public function testScopeSetting($testMarker, $tokenTypes, $open=[T_OPEN_CURLY_BRACKET], $close=[T_CLOSE_CURLY_BRACKET]) - { - $tokens = $this->phpcsFile->getTokens(); - - $target = $this->getTargetToken($testMarker, $tokenTypes); - $opener = $this->getTargetToken($testMarker, $open); - $closer = $this->getTargetToken($testMarker, $close); - - $this->assertArrayHasKey('scope_opener', $tokens[$target], 'Scope opener missing'); - $this->assertArrayHasKey('scope_closer', $tokens[$target], 'Scope closer missing'); - $this->assertSame($opener, $tokens[$target]['scope_opener'], 'Scope opener not same'); - $this->assertSame($closer, $tokens[$target]['scope_closer'], 'Scope closer not same'); - - $this->assertArrayHasKey('scope_opener', $tokens[$opener], 'Scope opener missing for open curly'); - $this->assertArrayHasKey('scope_closer', $tokens[$opener], 'Scope closer missing for open curly'); - $this->assertSame($opener, $tokens[$opener]['scope_opener'], 'Scope opener not same for open curly'); - $this->assertSame($closer, $tokens[$opener]['scope_closer'], 'Scope closer not same for open curly'); - - $this->assertArrayHasKey('scope_opener', $tokens[$closer], 'Scope opener missing for close curly'); - $this->assertArrayHasKey('scope_closer', $tokens[$closer], 'Scope closer missing for close curly'); - $this->assertSame($opener, $tokens[$closer]['scope_opener'], 'Scope opener not same for close curly'); - $this->assertSame($closer, $tokens[$closer]['scope_closer'], 'Scope closer not same for close curly'); - - }//end testScopeSetting() - - - /** - * Data provider. - * - * @see testScopeSetting() - * - * @return array>> - */ - public static function dataScopeSetting() - { - return [ - 'class which extends namespace relative name' => [ - 'testMarker' => '/* testClassExtends */', - 'tokenTypes' => [T_CLASS], - ], - 'class which implements namespace relative name' => [ - 'testMarker' => '/* testClassImplements */', - 'tokenTypes' => [T_ANON_CLASS], - ], - 'interface which extend namespace relative name' => [ - 'testMarker' => '/* testInterfaceExtends */', - 'tokenTypes' => [T_INTERFACE], - ], - 'namespace relative name in function return type' => [ - 'testMarker' => '/* testFunctionReturnType */', - 'tokenTypes' => [T_FUNCTION], - ], - 'namespace relative name in closure return type' => [ - 'testMarker' => '/* testClosureReturnType */', - 'tokenTypes' => [T_CLOSURE], - ], - 'namespace relative name in arrow function return type' => [ - 'testMarker' => '/* testArrowFunctionReturnType */', - 'tokenTypes' => [T_FN], - 'open' => [T_FN_ARROW], - 'close' => [T_SEMICOLON], - ], - ]; - - }//end dataScopeSetting() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/ReplaceTabsInTokenMiscTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/ReplaceTabsInTokenMiscTest.php deleted file mode 100644 index a9fd9a6..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/ReplaceTabsInTokenMiscTest.php +++ /dev/null @@ -1,124 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\Tokenizer; - -use PHP_CodeSniffer\Files\DummyFile; -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Tests\ConfigDouble; -use PHPUnit\Framework\TestCase; - -/** - * Miscellaneous tests for tab replacement. - * - * @covers PHP_CodeSniffer\Tokenizers\Tokenizer::replaceTabsInToken - */ -final class ReplaceTabsInTokenMiscTest extends TestCase -{ - - - /** - * Test that when no tab width is set or passed, the tab width will be set to 1. - * - * @return void - */ - public function testTabWidthNotSet() - { - $config = new ConfigDouble(); - $ruleset = new Ruleset($config); - - $content = <<parse(); - - $tokens = $phpcsFile->getTokens(); - $target = $phpcsFile->findNext(T_WHITESPACE, 0); - - // Verify initial state. - $this->assertTrue(is_int($target), 'Target token was not found'); - $this->assertSame(' ', $tokens[$target]['content'], 'Content after initial parsing does not contain tabs'); - $this->assertSame(2, $tokens[$target]['length'], 'Length after initial parsing is not as expected'); - $this->assertArrayNotHasKey('orig_content', $tokens[$target], "Key 'orig_content' found in the initial token array."); - - $phpcsFile->tokenizer->replaceTabsInToken($tokens[$target]); - - // Verify tab replacement. - $this->assertSame(' ', $tokens[$target]['content'], 'Content after tab replacement is not as expected'); - $this->assertSame(2, $tokens[$target]['length'], 'Length after tab replacement is not as expected'); - $this->assertArrayHasKey('orig_content', $tokens[$target], "Key 'orig_content' not found in the token array."); - - }//end testTabWidthNotSet() - - - /** - * Test that the length calculation handles text in non-ascii encodings correctly. - * - * @requires extension iconv - * - * @return void - */ - public function testLengthSettingRespectsEncoding() - { - $config = new ConfigDouble(); - $config->tabWidth = 4; - $ruleset = new Ruleset($config); - - $content = <<parse(); - - $tokens = $phpcsFile->getTokens(); - $target = $phpcsFile->findNext(T_CONSTANT_ENCAPSED_STRING, 0); - - $this->assertTrue(is_int($target), 'Target token was not found'); - $this->assertSame("'пасха пасха'", $tokens[$target]['content'], 'Content is not as expected'); - $this->assertSame(17, $tokens[$target]['length'], 'Length is not as expected'); - $this->assertArrayHasKey('orig_content', $tokens[$target], "Key 'orig_content' not found in the token array."); - $this->assertSame("'пасха пасха'", $tokens[$target]['orig_content'], 'Orig_content is not as expected'); - - }//end testLengthSettingRespectsEncoding() - - - /** - * Test that the length calculation falls back to byte length if iconv detects an illegal character. - * - * @requires extension iconv - * - * @return void - */ - public function testLengthSettingFallsBackToBytesWhenTextContainsIllegalChars() - { - $config = new ConfigDouble(); - $config->tabWidth = 4; - $ruleset = new Ruleset($config); - - $content = <<parse(); - - $tokens = $phpcsFile->getTokens(); - $target = $phpcsFile->findNext(T_CONSTANT_ENCAPSED_STRING, 0); - - $this->assertTrue(is_int($target), 'Target token was not found'); - $this->assertSame(11, $tokens[$target]['length'], 'Length is not as expected'); - $this->assertArrayHasKey('orig_content', $tokens[$target], "Key 'orig_content' not found in the token array."); - - }//end testLengthSettingFallsBackToBytesWhenTextContainsIllegalChars() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/ReplaceTabsInTokenTabWidth1Test.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/ReplaceTabsInTokenTabWidth1Test.php deleted file mode 100644 index 1ee8184..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/ReplaceTabsInTokenTabWidth1Test.php +++ /dev/null @@ -1,111 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\Tokenizer; - -/** - * Tab replacement test using tab width 1. - * - * @covers PHP_CodeSniffer\Tokenizers\Tokenizer::replaceTabsInToken - */ -final class ReplaceTabsInTokenTabWidth1Test extends ReplaceTabsInTokenTestCase -{ - - /** - * The tab width setting to use when tokenizing the file. - * - * @var integer - */ - protected $tabWidth = 1; - - - /** - * Data provider helper. - * - * @see ReplaceTabsInTokenTestCase::dataTabReplacement() - * - * @return array> - */ - public static function getTabReplacementExpected() - { - return [ - 'Tab indentation' => [ - 'length' => 2, - 'content' => ' ', - 'orig_content' => ' ', - ], - 'Mixed tab/space indentation' => [ - 'length' => 3, - 'content' => ' ', - 'orig_content' => ' ', - ], - 'Inline: single tab in text string' => [ - 'length' => 15, - 'content' => "'tab separated'", - 'orig_content' => "'tab separated'", - ], - 'Inline: single tab between each word in text string' => [ - 'length' => 24, - 'content' => '"tab $between each word"', - 'orig_content' => '"tab $between each word"', - ], - 'Inline: multiple tabs in heredoc' => [ - 'length' => 15, - 'content' => 'tab separated -', - 'orig_content' => 'tab separated -', - ], - 'Inline: multiple tabs between each word in nowdoc' => [ - 'length' => 27, - 'content' => 'tab between each word -', - 'orig_content' => 'tab between each word -', - ], - 'Inline: mixed spaces/tabs in text string' => [ - 'length' => 20, - 'content' => "'tab separated'", - 'orig_content' => "'tab separated'", - ], - 'Inline: mixed spaces/tabs between each word in text string' => [ - 'length' => 31, - 'content' => '"tab $between each word"', - 'orig_content' => '"tab $between each word"', - ], - 'Inline: tab becomes single space in comment (with tabwidth 4)' => [ - 'length' => 50, - 'content' => '// -123 With tabwidth 4, the tab size should be 1. -', - 'orig_content' => '// -123 With tabwidth 4, the tab size should be 1. -', - ], - 'Inline: tab becomes 2 spaces in comment (with tabwidth 4)' => [ - 'length' => 52, - 'content' => '/* -12 With tabwidth 4, the tab size should be 2. */', - 'orig_content' => '/* -12 With tabwidth 4, the tab size should be 2. */', - ], - 'Inline: tab becomes 3 spaces in doc comment string (with tabwidth 4)' => [ - 'length' => 45, - 'content' => '-1 With tabwidth 4, the tab size should be 3.', - 'orig_content' => '-1 With tabwidth 4, the tab size should be 3.', - ], - 'Inline: tab becomes 4 spaces in comment (with tabwidth 4)' => [ - 'length' => 47, - 'content' => '// - With tabwidth 4, the tab size should be 4. -', - 'orig_content' => '// - With tabwidth 4, the tab size should be 4. -', - ], - ]; - - }//end getTabReplacementExpected() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/ReplaceTabsInTokenTabWidth2Test.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/ReplaceTabsInTokenTabWidth2Test.php deleted file mode 100644 index 7a13649..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/ReplaceTabsInTokenTabWidth2Test.php +++ /dev/null @@ -1,111 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\Tokenizer; - -/** - * Tab replacement test using tab width 2. - * - * @covers PHP_CodeSniffer\Tokenizers\Tokenizer::replaceTabsInToken - */ -final class ReplaceTabsInTokenTabWidth2Test extends ReplaceTabsInTokenTestCase -{ - - /** - * The tab width setting to use when tokenizing the file. - * - * @var integer - */ - protected $tabWidth = 2; - - - /** - * Data provider helper. - * - * @see ReplaceTabsInTokenTestCase::dataTabReplacement() - * - * @return array> - */ - public static function getTabReplacementExpected() - { - return [ - 'Tab indentation' => [ - 'length' => 4, - 'content' => ' ', - 'orig_content' => ' ', - ], - 'Mixed tab/space indentation' => [ - 'length' => 4, - 'content' => ' ', - 'orig_content' => ' ', - ], - 'Inline: single tab in text string' => [ - 'length' => 15, - 'content' => "'tab separated'", - 'orig_content' => "'tab separated'", - ], - 'Inline: single tab between each word in text string' => [ - 'length' => 26, - 'content' => '"tab $between each word"', - 'orig_content' => '"tab $between each word"', - ], - 'Inline: multiple tabs in heredoc' => [ - 'length' => 17, - 'content' => 'tab separated -', - 'orig_content' => 'tab separated -', - ], - 'Inline: multiple tabs between each word in nowdoc' => [ - 'length' => 34, - 'content' => 'tab between each word -', - 'orig_content' => 'tab between each word -', - ], - 'Inline: mixed spaces/tabs in text string' => [ - 'length' => 23, - 'content' => "'tab separated'", - 'orig_content' => "'tab separated'", - ], - 'Inline: mixed spaces/tabs between each word in text string' => [ - 'length' => 32, - 'content' => '"tab $between each word"', - 'orig_content' => '"tab $between each word"', - ], - 'Inline: tab becomes single space in comment (with tabwidth 4)' => [ - 'length' => 50, - 'content' => '// -123 With tabwidth 4, the tab size should be 1. -', - 'orig_content' => '// -123 With tabwidth 4, the tab size should be 1. -', - ], - 'Inline: tab becomes 2 spaces in comment (with tabwidth 4)' => [ - 'length' => 53, - 'content' => '/* -12 With tabwidth 4, the tab size should be 2. */', - 'orig_content' => '/* -12 With tabwidth 4, the tab size should be 2. */', - ], - 'Inline: tab becomes 3 spaces in doc comment string (with tabwidth 4)' => [ - 'length' => 45, - 'content' => '-1 With tabwidth 4, the tab size should be 3.', - 'orig_content' => '-1 With tabwidth 4, the tab size should be 3.', - ], - 'Inline: tab becomes 4 spaces in comment (with tabwidth 4)' => [ - 'length' => 48, - 'content' => '// - With tabwidth 4, the tab size should be 4. -', - 'orig_content' => '// - With tabwidth 4, the tab size should be 4. -', - ], - ]; - - }//end getTabReplacementExpected() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/ReplaceTabsInTokenTabWidth4Test.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/ReplaceTabsInTokenTabWidth4Test.php deleted file mode 100644 index 043a329..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/ReplaceTabsInTokenTabWidth4Test.php +++ /dev/null @@ -1,111 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\Tokenizer; - -/** - * Tab replacement test using tab width 4. - * - * @covers PHP_CodeSniffer\Tokenizers\Tokenizer::replaceTabsInToken - */ -final class ReplaceTabsInTokenTabWidth4Test extends ReplaceTabsInTokenTestCase -{ - - /** - * The tab width setting to use when tokenizing the file. - * - * @var integer - */ - protected $tabWidth = 4; - - - /** - * Data provider helper. - * - * @see ReplaceTabsInTokenTestCase::dataTabReplacement() - * - * @return array> - */ - public static function getTabReplacementExpected() - { - return [ - 'Tab indentation' => [ - 'length' => 8, - 'content' => ' ', - 'orig_content' => ' ', - ], - 'Mixed tab/space indentation' => [ - 'length' => 6, - 'content' => ' ', - 'orig_content' => ' ', - ], - 'Inline: single tab in text string' => [ - 'length' => 17, - 'content' => "'tab separated'", - 'orig_content' => "'tab separated'", - ], - 'Inline: single tab between each word in text string' => [ - 'length' => 32, - 'content' => '"tab $between each word"', - 'orig_content' => '"tab $between each word"', - ], - 'Inline: multiple tabs in heredoc' => [ - 'length' => 21, - 'content' => 'tab separated -', - 'orig_content' => 'tab separated -', - ], - 'Inline: multiple tabs between each word in nowdoc' => [ - 'length' => 48, - 'content' => 'tab between each word -', - 'orig_content' => 'tab between each word -', - ], - 'Inline: mixed spaces/tabs in text string' => [ - 'length' => 25, - 'content' => "'tab separated'", - 'orig_content' => "'tab separated'", - ], - 'Inline: mixed spaces/tabs between each word in text string' => [ - 'length' => 36, - 'content' => '"tab $between each word"', - 'orig_content' => '"tab $between each word"', - ], - 'Inline: tab becomes single space in comment (with tabwidth 4)' => [ - 'length' => 50, - 'content' => '// -123 With tabwidth 4, the tab size should be 1. -', - 'orig_content' => '// -123 With tabwidth 4, the tab size should be 1. -', - ], - 'Inline: tab becomes 2 spaces in comment (with tabwidth 4)' => [ - 'length' => 53, - 'content' => '/* -12 With tabwidth 4, the tab size should be 2. */', - 'orig_content' => '/* -12 With tabwidth 4, the tab size should be 2. */', - ], - 'Inline: tab becomes 3 spaces in doc comment string (with tabwidth 4)' => [ - 'length' => 47, - 'content' => '-1 With tabwidth 4, the tab size should be 3.', - 'orig_content' => '-1 With tabwidth 4, the tab size should be 3.', - ], - 'Inline: tab becomes 4 spaces in comment (with tabwidth 4)' => [ - 'length' => 50, - 'content' => '// - With tabwidth 4, the tab size should be 4. -', - 'orig_content' => '// - With tabwidth 4, the tab size should be 4. -', - ], - ]; - - }//end getTabReplacementExpected() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/ReplaceTabsInTokenTabWidth5Test.php b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/ReplaceTabsInTokenTabWidth5Test.php deleted file mode 100644 index f25b2fa..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/ReplaceTabsInTokenTabWidth5Test.php +++ /dev/null @@ -1,111 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\Tokenizer; - -/** - * Tab replacement test using tab width 5. - * - * @covers PHP_CodeSniffer\Tokenizers\Tokenizer::replaceTabsInToken - */ -final class ReplaceTabsInTokenTabWidth5Test extends ReplaceTabsInTokenTestCase -{ - - /** - * The tab width setting to use when tokenizing the file. - * - * @var integer - */ - protected $tabWidth = 5; - - - /** - * Data provider helper. - * - * @see ReplaceTabsInTokenTestCase::dataTabReplacement() - * - * @return array> - */ - public static function getTabReplacementExpected() - { - return [ - 'Tab indentation' => [ - 'length' => 10, - 'content' => ' ', - 'orig_content' => ' ', - ], - 'Mixed tab/space indentation' => [ - 'length' => 7, - 'content' => ' ', - 'orig_content' => ' ', - ], - 'Inline: single tab in text string' => [ - 'length' => 15, - 'content' => "'tab separated'", - 'orig_content' => "'tab separated'", - ], - 'Inline: single tab between each word in text string' => [ - 'length' => 25, - 'content' => '"tab $between each word"', - 'orig_content' => '"tab $between each word"', - ], - 'Inline: multiple tabs in heredoc' => [ - 'length' => 24, - 'content' => 'tab separated -', - 'orig_content' => 'tab separated -', - ], - 'Inline: multiple tabs between each word in nowdoc' => [ - 'length' => 54, - 'content' => 'tab between each word -', - 'orig_content' => 'tab between each word -', - ], - 'Inline: mixed spaces/tabs in text string' => [ - 'length' => 30, - 'content' => "'tab separated'", - 'orig_content' => "'tab separated'", - ], - 'Inline: mixed spaces/tabs between each word in text string' => [ - 'length' => 35, - 'content' => '"tab $between each word"', - 'orig_content' => '"tab $between each word"', - ], - 'Inline: tab becomes single space in comment (with tabwidth 4)' => [ - 'length' => 52, - 'content' => '// -123 With tabwidth 4, the tab size should be 1. -', - 'orig_content' => '// -123 With tabwidth 4, the tab size should be 1. -', - ], - 'Inline: tab becomes 2 spaces in comment (with tabwidth 4)' => [ - 'length' => 55, - 'content' => '/* -12 With tabwidth 4, the tab size should be 2. */', - 'orig_content' => '/* -12 With tabwidth 4, the tab size should be 2. */', - ], - 'Inline: tab becomes 3 spaces in doc comment string (with tabwidth 4)' => [ - 'length' => 49, - 'content' => '-1 With tabwidth 4, the tab size should be 3.', - 'orig_content' => '-1 With tabwidth 4, the tab size should be 3.', - ], - 'Inline: tab becomes 4 spaces in comment (with tabwidth 4)' => [ - 'length' => 47, - 'content' => '// - With tabwidth 4, the tab size should be 4. -', - 'orig_content' => '// - With tabwidth 4, the tab size should be 4. -', - ], - ]; - - }//end getTabReplacementExpected() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/ReplaceTabsInTokenTest.inc b/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/ReplaceTabsInTokenTest.inc deleted file mode 100644 index e604650..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Tokenizers/Tokenizer/ReplaceTabsInTokenTest.inc +++ /dev/null @@ -1,46 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Tokenizers\Tokenizer; - -use Exception; -use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase; - -/** - * Tab replacement test case. - * - * @covers PHP_CodeSniffer\Tokenizers\Tokenizer::replaceTabsInToken - */ -abstract class ReplaceTabsInTokenTestCase extends AbstractTokenizerTestCase -{ - - /** - * The name of the test case file used by this test. - * - * @var string - */ - private static $caseFileName; - - - /** - * Make a copy the test case file we want to use for this test (as the file will be used by multiple tests). - * - * @beforeClass - * - * @return void - * - * @throws \Exception In case the base test case file would not be available. - */ - public static function copyCaseFile() - { - $relativeCN = str_replace(__NAMESPACE__.'\\', '', get_called_class()); - self::$caseFileName = __DIR__.DIRECTORY_SEPARATOR.$relativeCN.'.inc'; - - $baseFileName = realpath(__DIR__.'/ReplaceTabsInTokenTest.inc'); - if (is_string($baseFileName) === false) { - throw new Exception('Base test case file "ReplaceTabsInTokenTest.inc" not found'); - } - - if (copy($baseFileName, self::$caseFileName) === false) { - throw new Exception(sprintf('Failed to copy test case file "ReplaceTabsInTokenTest.inc" to %s', self::$caseFileName)); - } - - }//end copyCaseFile() - - - /** - * Delete the copied test case file after use. - * - * @afterClass - * - * @return void - */ - public static function deleteCaseFile() - { - @unlink(self::$caseFileName); - - }//end deleteCaseFile() - - - /** - * Verify that if a token not containing tabs would be passed to the replaceTabsInToken() method, - * yes, the `orig_content` key is added, but no changes are made to the token `content` or `length` values. - * - * @param string $testMarker The comment prefacing the target token. - * @param int|string $testTarget Token code to look for. - * @param array $expected Expectations for the token array. - * @param int $offset Optional. Offset from the target token to get to the _real_ target. - * This is specifically needed to target indentation whitespace. - * - * @dataProvider dataNoReplacementsAreMadeWhenNoTabsAreFound - * - * @return void - */ - public function testNoReplacementsAreMadeWhenNoTabsAreFound($testMarker, $testTarget, $expected, $offset=0) - { - $tokens = $this->phpcsFile->getTokens(); - $target = $this->getTargetToken($testMarker, $testTarget); - $target += $offset; - - foreach ($expected as $key => $value) { - if ($key === 'orig_content' && $value === null) { - $this->assertArrayNotHasKey($key, $tokens[$target], "Unexpected 'orig_content' key found in the token array."); - continue; - } - - $this->assertArrayHasKey($key, $tokens[$target], "Key $key not found in the token array."); - $this->assertSame($value, $tokens[$target][$key], "Value for key $key does not match expectation."); - } - - }//end testNoReplacementsAreMadeWhenNoTabsAreFound() - - - /** - * Data provider. - * - * @see testNoReplacementsAreMadeWhenNoTabsAreFound() - * - * @return array>> - */ - public static function dataNoReplacementsAreMadeWhenNoTabsAreFound() - { - return [ - 'Indentation whitespace, only spaces' => [ - 'testMarker' => '/* testNoReplacementNeeded */', - 'testTarget' => T_WHITESPACE, - 'expected' => [ - 'length' => 4, - 'content' => ' ', - 'orig_content' => null, - ], - 'offset' => 1, - ], - 'Trailing comment not containing any tabs' => [ - 'testMarker' => '/* testNoReplacementNeeded */', - 'testTarget' => T_COMMENT, - 'expected' => [ - 'length' => 35, - 'content' => '// Comment not containing any tabs. -', - 'orig_content' => null, - ], - ], - ]; - - }//end dataNoReplacementsAreMadeWhenNoTabsAreFound() - - - /** - * Test tab replacement in tokens. - * - * @param string $testMarker The comment prefacing the target token. - * @param int|string $testTarget Token code to look for. - * @param array $expected Expectations for the token array. - * @param int $offset Optional. Offset from the target token to get to the _real_ target. - * This is specifically needed to target indentation whitespace. - * - * @dataProvider dataTabReplacement - * - * @return void - */ - public function testTabReplacement($testMarker, $testTarget, $expected, $offset=0) - { - $tokens = $this->phpcsFile->getTokens(); - $target = $this->getTargetToken($testMarker, $testTarget); - $target += $offset; - - foreach ($expected as $key => $value) { - if ($key === 'orig_content' && $value === null) { - $this->assertArrayNotHasKey($key, $tokens[$target], "Unexpected 'orig_content' key found in the token array."); - continue; - } - - $this->assertArrayHasKey($key, $tokens[$target], "Key $key not found in the token array."); - $this->assertSame($value, $tokens[$target][$key], "Value for key $key does not match expectation."); - } - - }//end testTabReplacement() - - - /** - * Data provider. - * - * @see testTabReplacement() - * - * @return array>> - * - * @throws \Exception When the getTabReplacementExpected() method doesn't provide data in the correct format. - */ - public static function dataTabReplacement() - { - $data = [ - 'Tab indentation' => [ - 'testMarker' => '/* testTabIndentation */', - 'testTarget' => T_WHITESPACE, - ], - 'Mixed tab/space indentation' => [ - 'testMarker' => '/* testMixedIndentation */', - 'testTarget' => T_WHITESPACE, - ], - 'Inline: single tab in text string' => [ - 'testMarker' => '/* testInlineSingleTab */', - 'testTarget' => T_CONSTANT_ENCAPSED_STRING, - ], - 'Inline: single tab between each word in text string' => [ - 'testMarker' => '/* testInlineSingleTabBetweenEachWord */', - 'testTarget' => T_DOUBLE_QUOTED_STRING, - ], - 'Inline: multiple tabs in heredoc' => [ - 'testMarker' => '/* testInlineMultiTab */', - 'testTarget' => T_HEREDOC, - ], - 'Inline: multiple tabs between each word in nowdoc' => [ - 'testMarker' => '/* testInlineMultipleTabsBetweenEachWord */', - 'testTarget' => T_NOWDOC, - ], - 'Inline: mixed spaces/tabs in text string' => [ - 'testMarker' => '/* testInlineMixedSpacesTabs */', - 'testTarget' => T_CONSTANT_ENCAPSED_STRING, - ], - 'Inline: mixed spaces/tabs between each word in text string' => [ - 'testMarker' => '/* testInlineMixedSpacesTabsBetweenEachWord */', - 'testTarget' => T_DOUBLE_QUOTED_STRING, - ], - 'Inline: tab becomes single space in comment (with tabwidth 4)' => [ - 'testMarker' => '/* testInlineSize1 */', - 'testTarget' => T_COMMENT, - ], - 'Inline: tab becomes 2 spaces in comment (with tabwidth 4)' => [ - 'testMarker' => '/* testInlineSize2 */', - 'testTarget' => T_COMMENT, - ], - 'Inline: tab becomes 3 spaces in doc comment string (with tabwidth 4)' => [ - 'testMarker' => '/* testInlineSize3 */', - 'testTarget' => T_DOC_COMMENT_STRING, - ], - 'Inline: tab becomes 4 spaces in comment (with tabwidth 4)' => [ - 'testMarker' => '/* testInlineSize4 */', - 'testTarget' => T_COMMENT, - ], - ]; - - $expectations = static::getTabReplacementExpected(); - - foreach ($data as $key => $value) { - if (isset($expectations[$key]) === false || is_array($expectations[$key]) === false) { - throw new Exception( - sprintf('Invalid getTabReplacementExpected() method. Missing expectation array for the "%s" test case', $key) - ); - } - - if (isset($expectations[$key]['length'], $expectations[$key]['content']) === false - || array_key_exists('orig_content', $expectations[$key]) === false - ) { - throw new Exception( - sprintf('Invalid expectation array for the "%s" test case. The array must contain the "length", "content" and "orig_content" keys', $key) - ); - } - - $data[$key]['expected'] = $expectations[$key]; - } - - // Set offset for test cases targetting whitespace. - $data['Tab indentation']['offset'] = 1; - $data['Mixed tab/space indentation']['offset'] = 1; - - return $data; - - }//end dataTabReplacement() - - - /** - * Data provider helper. - * - * Should be declared in child classes to set the expectations for the token array. - * - * @see dataTabReplacement() - * - * @return array> - */ - abstract public static function getTabReplacementExpected(); - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Util/Common/EscapeshellcmdTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Util/Common/EscapeshellcmdTest.php deleted file mode 100644 index eb1bef5..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Util/Common/EscapeshellcmdTest.php +++ /dev/null @@ -1,91 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Util\Common; - -use PHP_CodeSniffer\Util\Common; -use PHPUnit\Framework\TestCase; - -/** - * Tests for the \PHP_CodeSniffer\Util\Common::escapeshellcmd() method. - * - * @covers \PHP_CodeSniffer\Util\Common::escapeshellcmd - * @group Windows - */ -final class EscapeshellcmdTest extends TestCase -{ - - - /** - * Test escaping shell commands. - * - * @param string $command The command provided. - * @param string $expected Expected function output. - * @param string $expectedWin Optional. Expected function output on Windows. - * Only needs to be passed if the output on Windows would be different. - * - * @dataProvider dataEscapeshellcmd - * - * @return void - */ - public function testEscapeshellcmd($command, $expected, $expectedWin=null) - { - if (stripos(PHP_OS, 'WIN') === 0 && empty($expectedWin) === false) { - $expected = $expectedWin; - } - - $this->assertSame($expected, Common::escapeshellcmd($command)); - - }//end testEscapeshellcmd() - - - /** - * Data provider. - * - * Note: we're only testing the PHPCS functionality, not the PHP native `escapeshellcmd()` - * function (as that's not our responsibility). - * - * @see testEscapeshellcmd() - * - * @return array> - */ - public static function dataEscapeshellcmd() - { - return [ - 'Command is empty string' => [ - 'command' => '', - 'expected' => '', - ], - 'Command is simple string' => [ - 'command' => 'csslint', - 'expected' => 'csslint', - ], - 'Command containing characters which PHP escapes' => [ - 'command' => '&#;`|*?~<>^()[]{}$\,%!', - 'expected' => '\&\#\;\`\|\*\?\~\<\>\^\(\)\[\]\{\}\$\\\\,%!', - 'expectedWin' => '^&^#^;^`^|^*^?^~^<^>^^^(^)^[^]^{^}^$^\,^%^!', - ], - // @link https://github.com/squizlabs/PHP_CodeSniffer/pull/3214 - 'Command containing spaces, which can cause problems on Windows' => [ - 'command' => 'C:\Program Files\nodejs\csslint.cmd', - 'expected' => 'C:\\\\Program Files\\\\nodejs\\\\csslint.cmd', - 'expectedWin' => 'C:^\Program^ Files^\nodejs^\csslint.cmd', - ], - // @link https://github.com/php/doc-en/pull/511 - 'Command containing spaces with additional arguments' => [ - 'command' => 'php -f ./~home/path to/file.php', - 'expected' => 'php -f ./\~home/path to/file.php', - 'expectedWin' => 'php^ -f^ ./^~home/path^ to/file.php', - ], - ]; - - }//end dataEscapeshellcmd() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Util/Common/GetSniffCodeTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Util/Common/GetSniffCodeTest.php deleted file mode 100644 index 27e41bb..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Util/Common/GetSniffCodeTest.php +++ /dev/null @@ -1,212 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Util\Common; - -use PHP_CodeSniffer\Util\Common; -use PHPUnit\Framework\TestCase; - -/** - * Tests for the \PHP_CodeSniffer\Util\Common::getSniffCode() method. - * - * @covers \PHP_CodeSniffer\Util\Common::getSniffCode - */ -final class GetSniffCodeTest extends TestCase -{ - - - /** - * Test receiving an expected exception when the $sniffClass parameter is not passed a string value or is passed an empty string. - * - * @param mixed $input NOT a fully qualified sniff class name. - * - * @dataProvider dataGetSniffCodeThrowsExceptionOnInvalidInput - * - * @return void - */ - public function testGetSniffCodeThrowsExceptionOnInvalidInput($input) - { - $exception = 'InvalidArgumentException'; - $message = 'The $sniffClass parameter must be a non-empty string'; - - if (method_exists($this, 'expectException') === true) { - // PHPUnit 5+. - $this->expectException($exception); - $this->expectExceptionMessage($message); - } else { - // PHPUnit 4. - $this->setExpectedException($exception, $message); - } - - Common::getSniffCode($input); - - }//end testGetSniffCodeThrowsExceptionOnInvalidInput() - - - /** - * Data provider. - * - * @see testGetSniffCodeThrowsExceptionOnInvalidInput() - * - * @return array> - */ - public static function dataGetSniffCodeThrowsExceptionOnInvalidInput() - { - return [ - 'Class name is not a string' => [true], - 'Class name is empty' => [''], - ]; - - }//end dataGetSniffCodeThrowsExceptionOnInvalidInput() - - - /** - * Test receiving an expected exception when the $sniffClass parameter is not passed a value which - * could be a fully qualified sniff(test) class name. - * - * @param string $input String input which can not be a fully qualified sniff(test) class name. - * - * @dataProvider dataGetSniffCodeThrowsExceptionOnInputWhichIsNotASniffTestClass - * - * @return void - */ - public function testGetSniffCodeThrowsExceptionOnInputWhichIsNotASniffTestClass($input) - { - $exception = 'InvalidArgumentException'; - $message = 'The $sniffClass parameter was not passed a fully qualified sniff(test) class name. Received:'; - - if (method_exists($this, 'expectException') === true) { - // PHPUnit 5+. - $this->expectException($exception); - $this->expectExceptionMessage($message); - } else { - // PHPUnit 4. - $this->setExpectedException($exception, $message); - } - - Common::getSniffCode($input); - - }//end testGetSniffCodeThrowsExceptionOnInputWhichIsNotASniffTestClass() - - - /** - * Data provider. - * - * @see testGetSniffCodeThrowsExceptionOnInputWhichIsNotASniffTestClass() - * - * @return array> - */ - public static function dataGetSniffCodeThrowsExceptionOnInputWhichIsNotASniffTestClass() - { - return [ - 'Unqualified class name' => ['ClassName'], - 'Fully qualified class name, not enough parts' => ['Fully\\Qualified\\ClassName'], - 'Fully qualified class name, doesn\'t end on Sniff or UnitTest' => ['Fully\\Sniffs\\Qualified\\ClassName'], - ]; - - }//end dataGetSniffCodeThrowsExceptionOnInputWhichIsNotASniffTestClass() - - - /** - * Test transforming a sniff class name to a sniff code. - * - * @param string $fqnClass A fully qualified sniff class name. - * @param string $expected Expected function output. - * - * @dataProvider dataGetSniffCode - * - * @return void - */ - public function testGetSniffCode($fqnClass, $expected) - { - $this->assertSame($expected, Common::getSniffCode($fqnClass)); - - }//end testGetSniffCode() - - - /** - * Data provider. - * - * @see testGetSniffCode() - * - * @return array> - */ - public static function dataGetSniffCode() - { - return [ - 'PHPCS native sniff' => [ - 'fqnClass' => 'PHP_CodeSniffer\\Standards\\Generic\\Sniffs\\Arrays\\ArrayIndentSniff', - 'expected' => 'Generic.Arrays.ArrayIndent', - ], - 'Class is a PHPCS native test class' => [ - 'fqnClass' => 'PHP_CodeSniffer\\Standards\\Generic\\Tests\\Arrays\\ArrayIndentUnitTest', - 'expected' => 'Generic.Arrays.ArrayIndent', - ], - 'Sniff in external standard without namespace prefix' => [ - 'fqnClass' => 'MyStandard\\Sniffs\\PHP\\MyNameSniff', - 'expected' => 'MyStandard.PHP.MyName', - ], - 'Test in external standard without namespace prefix' => [ - 'fqnClass' => 'MyStandard\\Tests\\PHP\\MyNameUnitTest', - 'expected' => 'MyStandard.PHP.MyName', - ], - 'Sniff in external standard with namespace prefix' => [ - 'fqnClass' => 'Vendor\\Package\\MyStandard\\Sniffs\\Category\\AnalyzeMeSniff', - 'expected' => 'MyStandard.Category.AnalyzeMe', - ], - 'Test in external standard with namespace prefix' => [ - 'fqnClass' => 'Vendor\\Package\\MyStandard\\Tests\\Category\\AnalyzeMeUnitTest', - 'expected' => 'MyStandard.Category.AnalyzeMe', - ], - - /* - * These are not valid sniff codes and is an undesirable result, but can't be helped - * as changing this would be a BC-break. - * Supporting these to allow for tags directly including sniff files. - * See: https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/675 - */ - - 'Fully qualified class name, ends on Sniff, but isn\'t' => [ - 'fqnClass' => 'Fully\\Sniffs\\AbstractSomethingSniff', - 'expected' => '.Sniffs.AbstractSomething', - ], - 'Sniff provided via file include and doesn\'t comply with naming conventions [1]' => [ - 'fqnClass' => 'CheckMeSniff', - 'expected' => '..CheckMe', - ], - 'Sniff provided via file include and doesn\'t comply with naming conventions [2]' => [ - 'fqnClass' => 'CompanyName\\CheckMeSniff', - 'expected' => '.CompanyName.CheckMe', - ], - 'Sniff provided via file include and doesn\'t comply with naming conventions [3]' => [ - 'fqnClass' => 'CompanyName\\Sniffs\\CheckMeSniff', - 'expected' => '.Sniffs.CheckMe', - ], - 'Sniff provided via file include and doesn\'t comply with naming conventions [4]' => [ - 'fqnClass' => 'CompanyName\\CustomSniffs\\Whatever\\CheckMeSniff', - 'expected' => 'CompanyName.Whatever.CheckMe', - ], - 'Sniff provided via file include and doesn\'t comply with naming conventions [5]' => [ - 'fqnClass' => 'CompanyName\\Sniffs\\Category\\Sniff', - 'expected' => 'CompanyName.Category.', - ], - 'Sniff provided via file include and doesn\'t comply with naming conventions [6]' => [ - 'fqnClass' => 'CompanyName\\Tests\\Category\\UnitTest', - 'expected' => 'CompanyName.Category.', - ], - 'Sniff provided via file include and doesn\'t comply with naming conventions [7]' => [ - 'fqnClass' => 'Sniffs\\Category\\NamedSniff', - 'expected' => '.Category.Named', - ], - ]; - - }//end dataGetSniffCode() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Util/Common/IsCamelCapsTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Util/Common/IsCamelCapsTest.php deleted file mode 100644 index c2570ad..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Util/Common/IsCamelCapsTest.php +++ /dev/null @@ -1,512 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Util\Common; - -use PHP_CodeSniffer\Util\Common; -use PHPUnit\Framework\TestCase; - -/** - * Tests for the \PHP_CodeSniffer\Util\Common::isCamelCaps method. - * - * @covers \PHP_CodeSniffer\Util\Common::isCamelCaps - */ -final class IsCamelCapsTest extends TestCase -{ - - - /** - * Test valid public function/method names. - * - * @param string $name The tested name. - * @param bool $strict Value of the $strict flag. - * - * @dataProvider dataValidNotClassFormatPublic - * - * @return void - */ - public function testValidNotClassFormatPublic($name, $strict) - { - $this->assertTrue(Common::isCamelCaps($name, false, true, $strict)); - - }//end testValidNotClassFormatPublic() - - - /** - * Data provider. - * - * @see testValidNotClassFormatPublic() - * - * @return array> - */ - public static function dataValidNotClassFormatPublic() - { - return [ - 'lower camelCase string in strict mode' => [ - 'name' => 'thisIsCamelCaps', - 'strict' => true, - ], - 'lower camelCase string with acronym in relaxed mode' => [ - 'name' => 'thisISCamelCaps', - 'strict' => false, - ], - 'lower camelCase string with initial acronym' => [ - 'name' => 'ISThisCamelCaps', - 'strict' => false, - ], - ]; - - }//end dataValidNotClassFormatPublic() - - - /** - * Test invalid public function/method names. - * - * @param string $name The tested name. - * - * @dataProvider dataInvalidNotClassFormatPublic - * - * @return void - */ - public function testInvalidNotClassFormatPublic($name) - { - $this->assertFalse(Common::isCamelCaps($name, false, true, true)); - - }//end testInvalidNotClassFormatPublic() - - - /** - * Data provider. - * - * @see testInvalidNotClassFormatPublic() - * - * @return array> - */ - public static function dataInvalidNotClassFormatPublic() - { - return [ - 'string with initial underscore (invalid when $public is true)' => [ - 'name' => '_thisIsCamelCaps', - ], - 'lower camelCase string with acronym (invalid when $strict is true)' => [ - 'name' => 'thisISCamelCaps', - ], - 'lower camelCase string with initial acronym (invalid when $strict is true)' => [ - 'name' => 'ISThisCamelCaps', - ], - 'PascalCase string' => [ - 'name' => 'ThisIsCamelCaps', - ], - 'lower camelCase string with initial digit' => [ - 'name' => '3thisIsCamelCaps', - ], - 'lower camelCase string with initial illegal character: *' => [ - 'name' => '*thisIsCamelCaps', - ], - 'lower camelCase string with initial illegal character: -' => [ - 'name' => '-thisIsCamelCaps', - ], - 'lower camelCase string with initial illegal character: é' => [ - 'name' => 'éCamelCaps', - ], - 'lower camelCase string with medial illegal character: *' => [ - 'name' => 'this*IsCamelCaps', - ], - 'lower camelCase string with medial illegal character: -' => [ - 'name' => 'this-IsCamelCaps', - ], - 'lower camelCase string with medial illegal character: é' => [ - // No camels were harmed in the cspell:disable-next-line. - 'name' => 'thisIsCamélCaps', - ], - 'lower camelCase string with single medial underscore' => [ - 'name' => 'this_IsCamelCaps', - ], - 'snake_case string' => [ - 'name' => 'this_is_camel_caps', - ], - 'empty string' => [ - 'name' => '', - ], - ]; - - }//end dataInvalidNotClassFormatPublic() - - - /** - * Test valid private method names. - * - * @param string $name The tested name. - * @param bool $strict Value of the $strict flag. - * - * @dataProvider dataValidNotClassFormatPrivate - * - * @return void - */ - public function testValidNotClassFormatPrivate($name, $strict) - { - $this->assertTrue(Common::isCamelCaps($name, false, false, $strict)); - - }//end testValidNotClassFormatPrivate() - - - /** - * Data provider. - * - * @see testValidNotClassFormatPrivate() - * - * @return array> - */ - public static function dataValidNotClassFormatPrivate() - { - return [ - 'lower camelCase string with initial underscore' => [ - 'name' => '_thisIsCamelCaps', - 'strict' => true, - ], - 'lower camelCase string with acronym and initial underscore' => [ - 'name' => '_thisISCamelCaps', - 'strict' => false, - ], - 'lower camelCase string with acronym after initial underscore' => [ - 'name' => '_ISThisCamelCaps', - 'strict' => false, - ], - 'numeronym with initial underscore and capital after digit' => [ - 'name' => '_i18N', - 'strict' => true, - ], - 'numeronym with initial underscore and lowercase character after digit' => [ - 'name' => '_i18n', - 'strict' => true, - ], - ]; - - }//end dataValidNotClassFormatPrivate() - - - /** - * Test invalid private method names. - * - * @param string $name The tested name. - * @param bool $strict Value of the $strict flag. - * - * @dataProvider dataInvalidNotClassFormatPrivate - * - * @return void - */ - public function testInvalidNotClassFormatPrivate($name, $strict) - { - $this->assertFalse(Common::isCamelCaps($name, false, false, $strict)); - - }//end testInvalidNotClassFormatPrivate() - - - /** - * Data provider. - * - * @see testInvalidNotClassFormatPrivate() - * - * @return array> - */ - public static function dataInvalidNotClassFormatPrivate() - { - return [ - 'lower camelCase string without initial underscore' => [ - 'name' => 'thisIsCamelCaps', - 'strict' => true, - ], - 'lower camelCase string with initial underscore, but with an acronym, in strict mode' => [ - 'name' => '_thisISCamelCaps', - 'strict' => true, - ], - 'PascalCase string with initial underscore' => [ - 'name' => '_ThisIsCamelCaps', - 'strict' => true, - ], - 'lower camelCase string with two initial underscores' => [ - 'name' => '__thisIsCamelCaps', - 'strict' => true, - ], - 'lower camelCase string with two initial underscores and acronym in relaxed mode' => [ - 'name' => '__thisISCamelCaps', - 'strict' => false, - ], - 'lower camelCase string with initial digit' => [ - 'name' => '3thisIsCamelCaps', - 'strict' => true, - ], - 'lower camelCase string with initial illegal character: *' => [ - 'name' => '*thisIsCamelCaps', - 'strict' => true, - ], - 'lower camelCase string with initial illegal character: -' => [ - 'name' => '-thisIsCamelCaps', - 'strict' => true, - ], - 'lower camelCase string with initial illegal character: é' => [ - 'name' => 'éCamelCaps', - 'strict' => true, - ], - 'snake_case string with initial underscore' => [ - 'name' => '_this_is_camel_caps', - 'strict' => true, - ], - 'single underscore' => [ - 'name' => '_', - 'strict' => true, - ], - 'empty string' => [ - 'name' => '', - 'strict' => true, - ], - ]; - - }//end dataInvalidNotClassFormatPrivate() - - - /** - * Test valid class names. - * - * @param string $name The tested name. - * @param bool $strict Value of the $strict flag. - * - * @dataProvider dataValidClassFormatPublic - * - * @return void - */ - public function testValidClassFormatPublic($name, $strict) - { - $this->assertTrue(Common::isCamelCaps($name, true, true, $strict)); - - }//end testValidClassFormatPublic() - - - /** - * Data provider. - * - * @see testValidClassFormatPublic() - * - * @return array> - */ - public static function dataValidClassFormatPublic() - { - return [ - 'PascalCase string' => [ - 'name' => 'ThisIsCamelCaps', - 'strict' => true, - ], - 'PascalCase string with acronym' => [ - 'name' => 'ThisISCamelCaps', - 'strict' => false, - ], - 'PascalCase string with digit between words' => [ - 'name' => 'This3IsCamelCaps', - 'strict' => false, - ], - 'PascalCase string with digit inside word' => [ - 'name' => 'Th1sIsCamelCaps', - 'strict' => false, - ], - 'Single capital (strict)' => [ - 'name' => 'A', - 'strict' => true, - ], - 'Single capital with digit (strict)' => [ - 'name' => 'A1', - 'strict' => true, - ], - 'Single capital (relaxed)' => [ - 'name' => 'A', - 'strict' => false, - ], - 'Single capital with digit (relaxed)' => [ - 'name' => 'A1', - 'strict' => false, - ], - ]; - - }//end dataValidClassFormatPublic() - - - /** - * Test invalid class names. - * - * @param string $name The tested name. - * - * @dataProvider dataInvalidClassFormat - * - * @return void - */ - public function testInvalidClassFormat($name) - { - $this->assertFalse(Common::isCamelCaps($name, true)); - - }//end testInvalidClassFormat() - - - /** - * Data provider. - * - * @see testInvalidClassFormat() - * - * @return array> - */ - public static function dataInvalidClassFormat() - { - return [ - 'lower camelCase string' => [ - 'name' => 'thisIsCamelCaps', - ], - 'PascalCase string with medial illegal character: -' => [ - 'name' => 'This-IsCamelCaps', - ], - 'capitalised snake case' => [ - 'name' => 'This_Is_Camel_Caps', - ], - 'empty string' => [ - 'name' => '', - ], - ]; - - }//end dataInvalidClassFormat() - - - /** - * Test invalid class names with the public flag set. - * - * Note that the public flag is ignored if the class format - * flag is set, so these names are all invalid. - * - * @param string $name The tested name. - * @param bool $public Value of the $public flag. - * - * @dataProvider dataInvalidClassFormatWithPublicFlag - * - * @return void - */ - public function testInvalidClassFormatWithPublicFlag($name, $public) - { - $this->assertFalse(Common::isCamelCaps($name, true, $public)); - - }//end testInvalidClassFormatWithPublicFlag() - - - /** - * Data provider. - * - * @see testInvalidClassFormatWithPublicFlag() - * - * @return array> - */ - public static function dataInvalidClassFormatWithPublicFlag() - { - return [ - 'PascalCase string with initial underscore (public)' => [ - 'name' => '_ThisIsCamelCaps', - 'public' => true, - ], - 'PascalCase string with initial underscore (private)' => [ - 'name' => '_ThisIsCamelCaps', - 'public' => false, - ], - 'empty string (public)' => [ - 'name' => '', - 'public' => true, - ], - 'empty string (private)' => [ - 'name' => '', - 'public' => false, - ], - ]; - - }//end dataInvalidClassFormatWithPublicFlag() - - - /** - * Test valid strings with default arguments. - * - * @param string $name The tested name. - * - * @dataProvider dataValidDefaultArguments - * - * @return void - */ - public function testValidDefaultArguments($name) - { - $this->assertTrue(Common::isCamelCaps($name)); - - }//end testValidDefaultArguments() - - - /** - * Data provider. - * - * @see testValidDefaultArguments() - * - * @return array> - */ - public static function dataValidDefaultArguments() - { - return [ - 'lower camelCase string' => [ - 'name' => 'thisIsCamelCaps', - ], - 'lower camelCase string with medial digit' => [ - 'name' => 'this3IsCamelCaps', - ], - ]; - - }//end dataValidDefaultArguments() - - - /** - * Test invalid strings with default arguments. - * - * @param string $name The tested name. - * - * @dataProvider dataInvalidDefaultArguments - * - * @return void - */ - public function testInvalidDefaultArguments($name) - { - $this->assertFalse(Common::isCamelCaps($name)); - - }//end testInvalidDefaultArguments() - - - /** - * Data provider. - * - * @see testInvalidDefaultArguments() - * - * @return array> - */ - public static function dataInvalidDefaultArguments() - { - return [ - 'PascalCase string' => [ - 'name' => 'ThisIsCamelCaps', - ], - 'PascalCase string with acronym' => [ - 'name' => 'ThisISCamelCaps', - ], - 'lower camelCase string with initial underscore' => [ - 'name' => '_thisIsCamelCaps', - ], - 'lower camelCase string with acronym' => [ - 'name' => 'thisISCamelCaps', - ], - ]; - - }//end dataInvalidDefaultArguments() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Util/Common/PrepareForOutputTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Util/Common/PrepareForOutputTest.php deleted file mode 100644 index 75c689f..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Util/Common/PrepareForOutputTest.php +++ /dev/null @@ -1,113 +0,0 @@ -assertSame($expected, Common::prepareForOutput($content, $exclude)); - - }//end testPrepareForOutput() - - - /** - * Test formatting whitespace characters, on Windows. - * - * @param string $content The content to prepare. - * @param string[] $exclude A list of characters to leave invisible. - * @param string $expected Expected function output (unused in this test). - * @param string $expectedWin Expected function output on Windows. - * - * @requires OS ^WIN.*. - * @dataProvider dataPrepareForOutput - * - * @return void - */ - public function testPrepareForOutputWindows($content, $exclude, $expected, $expectedWin) - { - $this->assertSame($expectedWin, Common::prepareForOutput($content, $exclude)); - - }//end testPrepareForOutputWindows() - - - /** - * Data provider. - * - * @see testPrepareForOutput() - * @see testPrepareForOutputWindows() - * - * @return array> - */ - public static function dataPrepareForOutput() - { - return [ - 'Special characters are replaced with their escapes' => [ - 'content' => "\r\n\t", - 'exclude' => [], - 'expected' => "\033[30;1m\\r\033[0m\033[30;1m\\n\033[0m\033[30;1m\\t\033[0m", - 'expectedWin' => "\\r\\n\\t", - ], - 'Spaces are replaced with a unique mark' => [ - 'content' => " ", - 'exclude' => [], - 'expected' => "\033[30;1m·\033[0m\033[30;1m·\033[0m\033[30;1m·\033[0m\033[30;1m·\033[0m", - 'expectedWin' => " ", - ], - 'Other characters are unaffected' => [ - 'content' => "{echo 1;}", - 'exclude' => [], - 'expected' => "{echo\033[30;1m·\033[0m1;}", - 'expectedWin' => "{echo 1;}", - ], - 'No replacements' => [ - 'content' => 'nothing-should-be-replaced', - 'exclude' => [], - 'expected' => 'nothing-should-be-replaced', - 'expectedWin' => 'nothing-should-be-replaced', - ], - 'Excluded whitespace characters are unaffected' => [ - 'content' => "\r\n\t ", - 'exclude' => [ - "\r", - "\n", - ], - 'expected' => "\r\n\033[30;1m\\t\033[0m\033[30;1m·\033[0m", - 'expectedWin' => "\r\n\\t ", - ], - ]; - - }//end dataPrepareForOutput() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Util/Common/StripColorsTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Util/Common/StripColorsTest.php deleted file mode 100644 index a3136fb..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Util/Common/StripColorsTest.php +++ /dev/null @@ -1,96 +0,0 @@ - - * @copyright 2024 Juliette Reinders Folmer. All rights reserved. - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Util\Common; - -use PHP_CodeSniffer\Util\Common; -use PHPUnit\Framework\TestCase; - -/** - * Tests for the \PHP_CodeSniffer\Util\Common::stripColors() method. - * - * @covers \PHP_CodeSniffer\Util\Common::stripColors - */ -final class StripColorsTest extends TestCase -{ - - - /** - * Test stripping color codes from a text. - * - * @param string $text The text provided. - * @param string $expected Expected function output. - * - * @dataProvider dataStripColors - * - * @return void - */ - public function testStripColors($text, $expected) - { - $this->assertSame($expected, Common::stripColors($text)); - - }//end testStripColors() - - - /** - * Data provider. - * - * @see testStripColors() - * - * @return array> - */ - public static function dataStripColors() - { - return [ - 'Text is empty' => [ - 'text' => '', - 'expected' => '', - ], - 'Text enclosed in color code' => [ - 'text' => "\033[36mSome text\033[0m", - 'expected' => 'Some text', - ], - 'Text containing color code' => [ - 'text' => "Some text \033[33mSome other text", - 'expected' => 'Some text Some other text', - ], - 'Text enclosed in color code, bold' => [ - 'text' => "\033[1;32mSome text\033[0m", - 'expected' => 'Some text', - ], - 'Text enclosed in color code, with escaped text' => [ - 'text' => "\033[30;1m\\n\033[0m", - 'expected' => '\n', - ], - 'Text enclosed in color code, bold, dark, italic' => [ - 'text' => "\033[1;2;3mtext\033[0m", - 'expected' => 'text', - ], - 'Text enclosed in color code, foreground color' => [ - 'text' => "\033[38;5;255mtext\033[0m", - 'expected' => 'text', - ], - 'Text enclosed in color code, foreground color and background color' => [ - 'text' => "\033[38;5;200;48;5;255mtext\033[0m", - 'expected' => 'text', - ], - 'Multiline text containing multiple color codes' => [ - 'text' => "First \033[36mSecond\033[0m -Third \033[1;2;3mFourth -Next line\033[0m Last", - 'expected' => 'First Second -Third Fourth -Next line Last', - ], - ]; - - }//end dataStripColors() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Util/Common/SuggestTypeTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Util/Common/SuggestTypeTest.php deleted file mode 100644 index 6001b1c..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Util/Common/SuggestTypeTest.php +++ /dev/null @@ -1,224 +0,0 @@ - - * @copyright 2019 Juliette Reinders Folmer. All rights reserved. - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Util\Common; - -use PHP_CodeSniffer\Util\Common; -use PHPUnit\Framework\TestCase; - -/** - * Tests for the \PHP_CodeSniffer\Util\Common::suggestType() method. - * - * @covers \PHP_CodeSniffer\Util\Common::suggestType - */ -final class SuggestTypeTest extends TestCase -{ - - - /** - * Test passing an empty type to the suggestType() method. - * - * @return void - */ - public function testSuggestTypeEmpty() - { - $this->assertSame('', Common::suggestType('')); - - }//end testSuggestTypeEmpty() - - - /** - * Test passing one of the allowed types to the suggestType() method. - * - * @param string $varType The type. - * - * @dataProvider dataSuggestTypeAllowedType - * - * @return void - */ - public function testSuggestTypeAllowedType($varType) - { - $result = Common::suggestType($varType); - $this->assertSame($varType, $result); - - }//end testSuggestTypeAllowedType() - - - /** - * Data provider. - * - * @see testSuggestTypeAllowedType() - * - * @return array> - */ - public static function dataSuggestTypeAllowedType() - { - $data = []; - foreach (Common::$allowedTypes as $type) { - $data['Type: '.$type] = [$type]; - } - - return $data; - - }//end dataSuggestTypeAllowedType() - - - /** - * Test passing one of the allowed types in the wrong case to the suggestType() method. - * - * @param string $varType The type found. - * @param string $expected Expected suggested type. - * - * @dataProvider dataSuggestTypeAllowedTypeWrongCase - * - * @return void - */ - public function testSuggestTypeAllowedTypeWrongCase($varType, $expected) - { - $result = Common::suggestType($varType); - $this->assertSame($expected, $result); - - }//end testSuggestTypeAllowedTypeWrongCase() - - - /** - * Data provider. - * - * @see testSuggestTypeAllowedTypeWrongCase() - * - * @return array> - */ - public static function dataSuggestTypeAllowedTypeWrongCase() - { - $data = []; - foreach (Common::$allowedTypes as $type) { - $data['Mixed case: '.$type] = [ - 'varType' => ucfirst($type), - 'expected' => $type, - ]; - $data['Uppercase: '.$type] = [ - 'varType' => strtoupper($type), - 'expected' => $type, - ]; - } - - return $data; - - }//end dataSuggestTypeAllowedTypeWrongCase() - - - /** - * Test the suggestType() method for all other cases. - * - * @param string $varType The type found. - * @param string $expected Expected suggested type. - * - * @dataProvider dataSuggestTypeOther - * - * @return void - */ - public function testSuggestTypeOther($varType, $expected) - { - $result = Common::suggestType($varType); - $this->assertSame($expected, $result); - - }//end testSuggestTypeOther() - - - /** - * Data provider. - * - * @see testSuggestTypeOther() - * - * @return array> - */ - public static function dataSuggestTypeOther() - { - return [ - // Short forms. - 'Short form type: bool, lowercase' => [ - 'varType' => 'bool', - 'expected' => 'boolean', - ], - 'Short form type: bool, uppercase' => [ - 'varType' => 'BOOL', - 'expected' => 'boolean', - ], - 'Short form type: double, lowercase' => [ - 'varType' => 'double', - 'expected' => 'float', - ], - 'Short form type: real, mixed case' => [ - 'varType' => 'Real', - 'expected' => 'float', - ], - 'Short form type: double, mixed case' => [ - 'varType' => 'DoUbLe', - 'expected' => 'float', - ], - 'Short form type: int, lowercase' => [ - 'varType' => 'int', - 'expected' => 'integer', - ], - 'Short form type: int, uppercase' => [ - 'varType' => 'INT', - 'expected' => 'integer', - ], - - // Array types. - 'Array type: mixed case keyword, empty parentheses' => [ - 'varType' => 'Array()', - 'expected' => 'array', - ], - 'Array type: short form type as value within the parentheses' => [ - 'varType' => 'array(real)', - 'expected' => 'array(float)', - ], - 'Array type: short form type as key within the parentheses' => [ - 'varType' => 'array(int => object)', - 'expected' => 'array(integer => object)', - ], - 'Array type: valid specification' => [ - 'varType' => 'array(integer => array(string => resource))', - 'expected' => 'array(integer => array(string => resource))', - ], - 'Array type: short form + uppercase types within the parentheses' => [ - 'varType' => 'ARRAY(BOOL => DOUBLE)', - 'expected' => 'array(boolean => float)', - ], - 'Array type: no space around the arrow within the parentheses' => [ - 'varType' => 'array(string=>resource)', - 'expected' => 'array(string => resource)', - ], - - // Incomplete array type. - 'Array type: incomplete specification' => [ - 'varType' => 'array(int =>', - 'expected' => 'array', - ], - - // Custom types are returned unchanged. - 'Unknown type: " => "' => [ - 'varType' => ' => ', - 'expected' => ' => ', - ], - 'Unknown type: "string[]"' => [ - 'varType' => 'string[]', - 'expected' => 'string[]', - ], - 'Unknown type: "\DateTime"' => [ - 'varType' => '\DateTime', - 'expected' => '\DateTime', - ], - ]; - - }//end dataSuggestTypeOther() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Util/Help/HelpTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Util/Help/HelpTest.php deleted file mode 100644 index a8e9fe5..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Util/Help/HelpTest.php +++ /dev/null @@ -1,792 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Util\Help; - -use PHP_CodeSniffer\Tests\ConfigDouble; -use PHP_CodeSniffer\Util\Help; -use PHPUnit\Framework\TestCase; -use ReflectionMethod; -use ReflectionProperty; - -/** - * Test the Help class. - * - * @covers \PHP_CodeSniffer\Util\Help - */ -final class HelpTest extends TestCase -{ - - - /** - * QA check: verify that the category names are at most the minimum screen width - * and that option argument names are always at most half the length of the minimum screen width. - * - * If this test would start failing, either wrapping of argument info would need to be implemented - * or the minimum screen width needs to be upped. - * - * @coversNothing - * - * @return void - */ - public function testQaArgumentNamesAreWithinAcceptableBounds() - { - $help = new Help(new ConfigDouble(), []); - $allOptions = $this->invokeReflectionMethod($help, 'getAllOptions'); - - $this->assertGreaterThan(0, count($allOptions), 'No categories found'); - - $minScreenWidth = Help::MIN_WIDTH; - $maxArgWidth = ($minScreenWidth / 2); - - foreach ($allOptions as $category => $options) { - $this->assertLessThanOrEqual( - Help::MIN_WIDTH, - strlen($category), - "Category name $category is longer than the minimum screen width of $minScreenWidth" - ); - - foreach ($options as $option) { - if (isset($option['argument']) === false) { - continue; - } - - $this->assertLessThanOrEqual( - $maxArgWidth, - strlen($option['argument']), - "Option name {$option['argument']} is longer than the half the minimum screen width of $minScreenWidth" - ); - } - } - - }//end testQaArgumentNamesAreWithinAcceptableBounds() - - - /** - * QA check: verify that each option only contains a spacer, text or argument + description combo. - * - * @coversNothing - * - * @return void - */ - public function testQaValidCategoryOptionDefinitions() - { - $help = new Help(new ConfigDouble(), []); - $allOptions = $this->invokeReflectionMethod($help, 'getAllOptions'); - - $this->assertGreaterThan(0, count($allOptions), 'No categories found'); - - foreach ($allOptions as $category => $options) { - $this->assertGreaterThan(0, count($options), "No options found in category $category"); - - foreach ($options as $name => $option) { - if (isset($option['spacer']) === true) { - $this->assertStringStartsWith('blank-line', $name, 'The name for spacer items should start with "blank-line"'); - } - - $this->assertFalse( - isset($option['spacer'], $option['text']), - "Option $name: spacer and text should not be combined in one option" - ); - $this->assertFalse( - isset($option['spacer'], $option['argument']), - "Option $name: spacer and argument should not be combined in one option" - ); - $this->assertFalse( - isset($option['spacer'], $option['description']), - "Option $name: spacer and description should not be combined in one option" - ); - $this->assertFalse( - isset($option['text'], $option['argument']), - "Option $name: text and argument should not be combined in one option" - ); - $this->assertFalse( - isset($option['text'], $option['description']), - "Option $name: text and description should not be combined in one option" - ); - - if (isset($option['argument']) === true) { - $this->assertArrayHasKey( - 'description', - $option, - "Option $name: an argument should always be accompanied by a description" - ); - } - - if (isset($option['description']) === true) { - $this->assertArrayHasKey( - 'argument', - $option, - "Option $name: a description should always be accompanied by an argument" - ); - } - }//end foreach - }//end foreach - - }//end testQaValidCategoryOptionDefinitions() - - - /** - * Test receiving an expected exception when the shortOptions parameter is not passed a string value. - * - * @return void - */ - public function testConstructorInvalidArgumentException() - { - $exception = 'InvalidArgumentException'; - $message = 'The $shortOptions parameter must be a string'; - - if (method_exists($this, 'expectException') === true) { - // PHPUnit 5+. - $this->expectException($exception); - $this->expectExceptionMessage($message); - } else { - // PHPUnit 4. - $this->setExpectedException($exception, $message); - } - - new Help(new ConfigDouble(), [], []); - - }//end testConstructorInvalidArgumentException() - - - /** - * Test filtering of the options by requested options. - * - * Tests that: - * - Options not explicitly requested are removed. - * - Short options passed via the longOptions array are still respected. - * - A category gets removed if all options are removed, even if the category still has spacers. - * - * @param array $longOptions The long options which should be displayed. - * @param string $shortOptions The short options which should be displayed. - * @param array $expected The categories expected after filtering with the number - * of expected help items per category. - * - * @dataProvider dataOptionFiltering - * - * @return void - */ - public function testOptionFiltering($longOptions, $shortOptions, $expected) - { - $help = new Help(new ConfigDouble(), $longOptions, $shortOptions); - - $activeOptions = $this->getReflectionProperty($help, 'activeOptions'); - - // Simplify the value to make it comparible. - foreach ($activeOptions as $category => $options) { - $activeOptions[$category] = count($options); - } - - $this->assertSame($expected, $activeOptions, 'Option count per category does not match'); - - }//end testOptionFiltering() - - - /** - * Data provider. - * - * @return array|array>> - */ - public static function dataOptionFiltering() - { - $allLongOptions = explode(',', Help::DEFAULT_LONG_OPTIONS); - $allLongOptions[] = 'cache'; - $allLongOptions[] = 'no-cache'; - $allLongOptions[] = 'report'; - $allLongOptions[] = 'report-file'; - $allLongOptions[] = 'report-report'; - $allLongOptions[] = 'runtime-set'; - $allLongOptions[] = 'config-explain'; - $allLongOptions[] = 'config-set'; - $allLongOptions[] = 'config-delete'; - $allLongOptions[] = 'config-show'; - $allLongOptions[] = 'generator'; - $allLongOptions[] = 'suffix'; - - $allShortOptions = Help::DEFAULT_SHORT_OPTIONS.'saem'; - - return [ - 'No options' => [ - 'longOptions' => [], - 'shortOptions' => '', - 'expected' => [], - ], - 'Invalid options have no influence' => [ - 'longOptions' => [ - 'doesnotexist', - 'invalid', - ], - 'shortOptions' => 'bjrz', - 'expected' => [], - ], - 'Short options passed as long options works fine' => [ - 'longOptions' => [ - 's', - 'suffix', - 'a', - 'e', - 'colors', - ], - 'shortOptions' => '', - 'expected' => [ - 'Rule Selection Options' => 1, - 'Run Options' => 2, - 'Reporting Options' => 2, - ], - ], - 'All options' => [ - 'longOptions' => $allLongOptions, - 'shortOptions' => $allShortOptions, - 'expected' => [ - 'Scan targets' => 8, - 'Rule Selection Options' => 7, - 'Run Options' => 8, - 'Reporting Options' => 19, - 'Configuration Options' => 8, - 'Miscellaneous Options' => 5, - ], - ], - 'Default options only' => [ - 'longOptions' => explode(',', Help::DEFAULT_LONG_OPTIONS), - 'shortOptions' => Help::DEFAULT_SHORT_OPTIONS, - 'expected' => [ - 'Scan targets' => 8, - 'Rule Selection Options' => 5, - 'Run Options' => 4, - 'Reporting Options' => 14, - 'Configuration Options' => 4, - 'Miscellaneous Options' => 5, - ], - ], - 'Only one category' => [ - 'longOptions' => [ - 'file', - 'stdin-path', - 'file-list', - 'filter', - 'ignore', - 'extensions', - ], - 'shortOptions' => '-l', - 'expected' => [ - 'Scan targets' => 8, - ], - ], - 'All except one category' => [ - 'longOptions' => array_diff($allLongOptions, ['version', 'vv', 'vvv']), - 'shortOptions' => str_replace(['h', 'v'], '', $allShortOptions), - 'expected' => [ - 'Scan targets' => 8, - 'Rule Selection Options' => 7, - 'Run Options' => 8, - 'Reporting Options' => 19, - 'Configuration Options' => 8, - ], - ], - ]; - - }//end dataOptionFiltering() - - - /** - * Test filtering of the options by requested options does not leave stray spacers at the start - * or end of a category and that a category does not contain two consecutive spacers. - * - * {@internal Careful! This test may need updates to still test what it is supposed to test - * if/when the defined options in Help::getAllOptions() change.} - * - * @param array $longOptions The long options which should be displayed. - * @param string $shortOptions The short options which should be displayed. - * - * @dataProvider dataOptionFilteringSpacerHandling - * - * @return void - */ - public function testOptionFilteringSpacerHandling($longOptions, $shortOptions) - { - $help = new Help(new ConfigDouble(), $longOptions, $shortOptions); - - $activeOptions = $this->getReflectionProperty($help, 'activeOptions'); - - $this->assertNotEmpty($activeOptions, 'Active options is empty, test is invalid'); - - foreach ($activeOptions as $options) { - $first = reset($options); - $this->assertArrayNotHasKey('spacer', $first, 'Found spacer at start of category'); - - $last = end($options); - $this->assertArrayNotHasKey('spacer', $last, 'Found spacer at end of category'); - - $previousWasSpacer = false; - foreach ($options as $option) { - $this->assertFalse((isset($option['spacer']) && $previousWasSpacer === true), 'Consecutive spacers found'); - $previousWasSpacer = isset($option['spacer']); - } - } - - }//end testOptionFilteringSpacerHandling() - - - /** - * Data provider. - * - * @return array>> - */ - public static function dataOptionFilteringSpacerHandling() - { - return [ - 'No spacer at start of category' => [ - 'longOptions' => ['generator'], - 'shortOptions' => 'ie', - ], - 'No spacer at end of category' => [ - 'longOptions' => [ - 'encoding', - 'tab-width', - ], - 'shortOptions' => '', - ], - 'No consecutive spacers within category' => [ - 'longOptions' => [ - 'report', - 'report-file', - 'report-report', - 'report-width', - 'basepath', - 'ignore-annotations', - 'colors', - 'no-colors', - ], - 'shortOptions' => 'spqm', - ], - ]; - - }//end dataOptionFilteringSpacerHandling() - - - /** - * Test that if no short/long options are passed, only usage information is displayed (CS mode). - * - * @param array $cliArgs Command line arguments. - * @param string $expectedRegex Regex to validate expected output. - * - * @dataProvider dataDisplayUsage - * - * @return void - */ - public function testDisplayUsageCS($cliArgs, $expectedRegex) - { - if (PHP_CODESNIFFER_CBF === true) { - $this->markTestSkipped('This test needs CS mode to run'); - } - - $expectedRegex = str_replace('phpc(bf|s)', 'phpcs', $expectedRegex); - $this->verifyDisplayUsage($cliArgs, $expectedRegex); - - }//end testDisplayUsageCS() - - - /** - * Test that if no short/long options are passed, only usage information is displayed (CBF mode). - * - * @param array $cliArgs Command line arguments. - * @param string $expectedRegex Regex to validate expected output. - * - * @dataProvider dataDisplayUsage - * @group CBF - * - * @return void - */ - public function testDisplayUsageCBF($cliArgs, $expectedRegex) - { - if (PHP_CODESNIFFER_CBF === false) { - $this->markTestSkipped('This test needs CBF mode to run'); - } - - $expectedRegex = str_replace('phpc(bf|s)', 'phpcbf', $expectedRegex); - $this->verifyDisplayUsage($cliArgs, $expectedRegex); - - }//end testDisplayUsageCBF() - - - /** - * Helper method to test that if no short/long options are passed, only usage information is displayed - * (and displayed correctly). - * - * @param array $cliArgs Command line arguments. - * @param string $expectedRegex Regex to validate expected output. - * - * @return void - */ - private function verifyDisplayUsage($cliArgs, $expectedRegex) - { - $help = new Help(new ConfigDouble($cliArgs), []); - - $this->expectOutputRegex($expectedRegex); - - $help->display(); - - }//end verifyDisplayUsage() - - - /** - * Data provider. - * - * @return array>> - */ - public static function dataDisplayUsage() - { - return [ - 'Usage without colors' => [ - 'cliArgs' => ['--no-colors'], - 'expectedRegex' => '`^\s*Usage:\s+phpc(bf|s) \[options\] \\s+$`', - ], - 'Usage with colors' => [ - 'cliArgs' => ['--colors'], - 'expectedRegex' => '`^\s*\\033\[33mUsage:\\033\[0m\s+phpc(bf|s) \[options\] \\s+$`', - ], - ]; - - }//end dataDisplayUsage() - - - /** - * Test the column width calculations. - * - * This tests the following aspects: - * 1. That the report width is never less than Help::MIN_WIDTH, even when a smaller width is passed. - * 2. That the first column width is calculated correctly and is based on the longest argument. - * 3. That the word wrapping of the description respects the maximum report width. - * 4. That if the description is being wrapped, the indent for the second line is calculated correctly. - * - * @param int $reportWidth Report width for the test. - * @param array $longOptions The long options which should be displayed. - * @param string $expectedOutput Expected output. - * - * @dataProvider dataReportWidthCalculations - * - * @return void - */ - public function testReportWidthCalculations($reportWidth, $longOptions, $expectedOutput) - { - $config = new ConfigDouble(["--report-width=$reportWidth", '--no-colors']); - $help = new Help($config, $longOptions); - - $this->invokeReflectionMethod($help, 'printCategories'); - - $this->expectOutputString($expectedOutput); - - }//end testReportWidthCalculations() - - - /** - * Data provider. - * - * @return array>> - */ - public static function dataReportWidthCalculations() - { - $longOptions = [ - 'e', - 'generator', - ]; - - // phpcs:disable Squiz.Strings.ConcatenationSpacing.PaddingFound -- Test readability is more important. - return [ - 'Report width small: 40; forces report width to minimum width of 60' => [ - 'reportWidth' => 40, - 'longOptions' => $longOptions, - 'expectedOutput' => PHP_EOL.'Rule Selection Options:'.PHP_EOL - .' -e Explain a standard by showing the'.PHP_EOL - .' names of all the sniffs it'.PHP_EOL - .' includes.'.PHP_EOL - .' --generator= Show documentation for a standard.'.PHP_EOL - .' Use either the "HTML", "Markdown"'.PHP_EOL - .' or "Text" generator.'.PHP_EOL, - ], - 'Report width is minimum: 60 (= self::MIN_WIDTH)' => [ - 'reportWidth' => Help::MIN_WIDTH, - 'longOptions' => $longOptions, - 'expectedOutput' => PHP_EOL.'Rule Selection Options:'.PHP_EOL - .' -e Explain a standard by showing the'.PHP_EOL - .' names of all the sniffs it'.PHP_EOL - .' includes.'.PHP_EOL - .' --generator= Show documentation for a standard.'.PHP_EOL - .' Use either the "HTML", "Markdown"'.PHP_EOL - .' or "Text" generator.'.PHP_EOL, - ], - 'Report width matches length for one line, not the other: 96; only one should wrap' => [ - 'reportWidth' => 96, - 'longOptions' => $longOptions, - 'expectedOutput' => PHP_EOL.'Rule Selection Options:'.PHP_EOL - .' -e Explain a standard by showing the names of all the sniffs it includes.'.PHP_EOL - .' --generator= Show documentation for a standard. Use either the "HTML", "Markdown"'.PHP_EOL - .' or "Text" generator.'.PHP_EOL, - ], - 'Report width matches longest line: 119; the messages should not wrap and there should be no stray new line at the end' => [ - 'reportWidth' => 119, - 'longOptions' => $longOptions, - 'expectedOutput' => PHP_EOL.'Rule Selection Options:'.PHP_EOL - .' -e Explain a standard by showing the names of all the sniffs it includes.'.PHP_EOL - .' --generator= Show documentation for a standard. Use either the "HTML", "Markdown" or "Text" generator.'.PHP_EOL, - ], - ]; - // phpcs:enable - - }//end dataReportWidthCalculations() - - - /** - * Verify that variable elements in an argument specification get colorized correctly. - * - * @param string $input String to colorize. - * @param string $expected Expected function output. - * - * @dataProvider dataColorizeVariableInput - * - * @return void - */ - public function testColorizeVariableInput($input, $expected) - { - $help = new Help(new ConfigDouble(), []); - $result = $this->invokeReflectionMethod($help, 'colorizeVariableInput', $input); - - $this->assertSame($expected, $result); - - }//end testColorizeVariableInput() - - - /** - * Data provider. - * - * @return array>> - */ - public static function dataColorizeVariableInput() - { - return [ - 'Empty string' => [ - 'input' => '', - 'expected' => '', - ], - 'String without variable element(s)' => [ - 'input' => 'This is text', - 'expected' => 'This is text', - ], - 'String with variable element' => [ - 'input' => 'This text', - 'expected' => "This \033[36m\033[32m text", - ], - 'String with multiple variable elements' => [ - 'input' => ' is ', - 'expected' => "\033[36m\033[32m is \033[36m\033[32m", - ], - 'String with unclosed variable element' => [ - 'input' => 'This 'This [ - 'input' => ' text>', - 'expected' => "\033[36m text>\033[32m", - ], - 'String with nested elements and surrounding text' => [ - 'input' => 'Start text> end', - 'expected' => "Start \033[36m text>\033[32m end", - ], - ]; - - }//end dataColorizeVariableInput() - - - /** - * Test the various option types within a category get displayed correctly. - * - * @param array> $input The options to print. - * @param array $expectedRegex Regexes to validate expected output. - * - * @dataProvider dataPrintCategoryOptions - * - * @return void - */ - public function testPrintCategoryOptionsNoColor($input, $expectedRegex) - { - $config = new ConfigDouble(['--no-colors']); - $help = new Help($config, []); - - $this->setReflectionProperty($help, 'activeOptions', ['cat' => $input]); - $this->invokeReflectionMethod($help, 'setMaxOptionNameLength'); - $this->invokeReflectionMethod($help, 'printCategoryOptions', $input); - - $this->expectOutputRegex($expectedRegex['no-color']); - - }//end testPrintCategoryOptionsNoColor() - - - /** - * Test the various option types within a category get displayed correctly. - * - * @param array> $input The options to print. - * @param array $expectedRegex Regexes to validate expected output. - * - * @dataProvider dataPrintCategoryOptions - * - * @return void - */ - public function testPrintCategoryOptionsColor($input, $expectedRegex) - { - $config = new ConfigDouble(['--colors']); - $help = new Help($config, []); - - $this->setReflectionProperty($help, 'activeOptions', ['cat' => $input]); - $this->invokeReflectionMethod($help, 'setMaxOptionNameLength'); - $this->invokeReflectionMethod($help, 'printCategoryOptions', $input); - - $this->expectOutputRegex($expectedRegex['color']); - - }//end testPrintCategoryOptionsColor() - - - /** - * Data provider. - * - * @return array>|array>> - */ - public static function dataPrintCategoryOptions() - { - $indentLength = strlen(Help::INDENT); - $gutterLength = strlen(Help::GUTTER); - - // phpcs:disable Squiz.Strings.ConcatenationSpacing.PaddingFound -- Test readability is more important. - // phpcs:disable Generic.Strings.UnnecessaryStringConcat.Found -- Test readability is more important. - return [ - 'Input: arg, spacer, arg; new lines in description get preserved' => [ - 'input' => [ - 'short-option' => [ - 'argument' => '-a', - 'description' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.', - ], - 'blank-line' => [ - 'spacer' => '', - ], - 'long-option-multi-line-description' => [ - 'argument' => '--something=', - 'description' => 'Proin sit amet malesuada libero, finibus bibendum tortor. Nulla vitae quam nec orci finibus pharetra.' - ."\n".'Nam eget blandit dui.', - ], - ], - 'expectedRegex' => [ - 'no-color' => '`^ {'.$indentLength.'}-a {15} {'.$gutterLength.'}Lorem ipsum dolor sit amet, consectetur adipiscing elit\.\R' - .'\R' - .' {'.$indentLength.'}--something= {'.$gutterLength.'}Proin sit amet malesuada libero, finibus bibendum tortor\.\R' - .' {'.($indentLength + 17).'} {'.$gutterLength.'}Nulla vitae quam nec orci finibus pharetra\.\R' - .' {'.($indentLength + 17).'} {'.$gutterLength.'}Nam eget blandit dui\.\R$`', - 'color' => '`^ {'.$indentLength.'}\\033\[32m-a {15}\\033\[0m {'.$gutterLength.'}Lorem ipsum dolor sit amet, consectetur adipiscing elit\.\R' - .'\R' - .' {'.$indentLength.'}\\033\[32m--something=\\033\[36m\\033\[32m\\033\[0m {'.$gutterLength.'}Proin sit amet malesuada libero, finibus bibendum tortor\.\R' - .' {'.($indentLength + 17).'} {'.$gutterLength.'}Nulla vitae quam nec orci finibus pharetra\.\R' - .' {'.($indentLength + 17).'} {'.$gutterLength.'}Nam eget blandit dui\.\R$`', - ], - ], - 'Input: text, arg, text; multi-line text gets wrapped' => [ - 'input' => [ - 'single-line-text' => [ - 'text' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.', - ], - 'argument-description' => [ - 'argument' => '--something', - 'description' => 'Fusce dapibus sodales est eu sodales.', - ], - 'multi-line-text-gets-wrapped' => [ - 'text' => 'Maecenas vulputate ligula vel feugiat finibus. Mauris sem dui, pretium in turpis auctor, consectetur ultrices lorem.', - ], - ], - 'expectedRegex' => [ - 'no-color' => '`^ {'.$indentLength.'}Lorem ipsum dolor sit amet, consectetur adipiscing elit\.\R' - .' {'.$indentLength.'}--something {'.$gutterLength.'}Fusce dapibus sodales est eu sodales\.\R' - .' {'.$indentLength.'}Maecenas vulputate ligula vel feugiat finibus. Mauris sem dui, pretium in\R' - .' {'.$indentLength.'}turpis auctor, consectetur ultrices lorem\.\R$`', - 'color' => '`^ {'.$indentLength.'}Lorem ipsum dolor sit amet, consectetur adipiscing elit\.\R' - .' {'.$indentLength.'}\\033\[32m--something\\033\[0m {'.$gutterLength.'}Fusce dapibus sodales est eu sodales\.\R' - .' {'.$indentLength.'}Maecenas vulputate ligula vel feugiat finibus. Mauris sem dui, pretium in\R' - .' {'.$indentLength.'}turpis auctor, consectetur ultrices lorem\.\R$`', - ], - ], - ]; - // phpcs:enable - - }//end dataPrintCategoryOptions() - - - /** - * Test Helper: invoke a reflected method which is not publicly accessible. - * - * @param \PHP_CodeSniffer\Util\Help $help Instance of a Help object. - * @param string $methodName The name of the method to invoke. - * @param mixed $params Optional. Parameters to pass to the method invocation. - * - * @return mixed - */ - private function invokeReflectionMethod(Help $help, $methodName, $params=null) - { - $reflMethod = new ReflectionMethod($help, $methodName); - (PHP_VERSION_ID < 80100) && $reflMethod->setAccessible(true); - - if ($params === null) { - $returnValue = $reflMethod->invoke($help); - } else { - $returnValue = $reflMethod->invoke($help, $params); - } - - (PHP_VERSION_ID < 80100) && $reflMethod->setAccessible(false); - - return $returnValue; - - }//end invokeReflectionMethod() - - - /** - * Test Helper: retrieve the value of property which is not publicly accessible. - * - * @param \PHP_CodeSniffer\Util\Help $help Instance of a Help object. - * @param string $properyName The name of the property to retrieve. - * - * @return mixed - */ - private function getReflectionProperty(Help $help, $properyName) - { - $reflProperty = new ReflectionProperty($help, $properyName); - (PHP_VERSION_ID < 80100) && $reflProperty->setAccessible(true); - $returnValue = $reflProperty->getValue($help); - (PHP_VERSION_ID < 80100) && $reflProperty->setAccessible(false); - - return $returnValue; - - }//end getReflectionProperty() - - - /** - * Test Helper: set the value of property which is not publicly accessible. - * - * @param \PHP_CodeSniffer\Util\Help $help Instance of a Help object. - * @param string $properyName The name of the property to set. - * @param mixed $value The value to set. - * - * @return void - */ - private function setReflectionProperty(Help $help, $properyName, $value) - { - $reflProperty = new ReflectionProperty($help, $properyName); - (PHP_VERSION_ID < 80100) && $reflProperty->setAccessible(true); - $reflProperty->setValue($help, $value); - (PHP_VERSION_ID < 80100) && $reflProperty->setAccessible(false); - - }//end setReflectionProperty() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Util/MessageCollector/MessageCollectorTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Util/MessageCollector/MessageCollectorTest.php deleted file mode 100644 index e147635..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Util/MessageCollector/MessageCollectorTest.php +++ /dev/null @@ -1,538 +0,0 @@ -expectException($exception); - $this->expectExceptionMessage($exceptionMsg); - } else { - // PHPUnit 4. - $this->setExpectedException($exception, $exceptionMsg); - } - - $msgCollector = new MessageCollector(); - $msgCollector->add($message); - - }//end testAddingNonStringMessageResultsInException() - - - /** - * Data provider. - * - * @see testAddingNonStringMessageResultsInException() - * - * @return array> - */ - public static function dataAddingNonStringMessageResultsInException() - { - return [ - 'null' => [null], - 'boolean' => [true], - 'integer' => [10], - 'array' => [['something' => 'incorrect']], - ]; - - }//end dataAddingNonStringMessageResultsInException() - - - /** - * Verify that passing a message type which is not one of the predefined types is rejected with an exception. - * - * @param mixed $type The invalid "type" to pass. - * - * @dataProvider dataAddingMessageWithUnsupportedMessageTypeResultsInException - * - * @return void - */ - public function testAddingMessageWithUnsupportedMessageTypeResultsInException($type) - { - $exception = 'InvalidArgumentException'; - $exceptionMsg = 'The message $type should be one of the predefined MessageCollector constants. Received: '; - if (method_exists($this, 'expectException') === true) { - // PHPUnit 5+. - $this->expectException($exception); - $this->expectExceptionMessage($exceptionMsg); - } else { - // PHPUnit 4. - $this->setExpectedException($exception, $exceptionMsg); - } - - $msgCollector = new MessageCollector(); - $msgCollector->add('Message', $type); - - }//end testAddingMessageWithUnsupportedMessageTypeResultsInException() - - - /** - * Data provider. - * - * @see testAddingMessageWithUnsupportedMessageTypeResultsInException() - * - * @return array> - */ - public static function dataAddingMessageWithUnsupportedMessageTypeResultsInException() - { - return [ - 'null' => [null], - 'boolean' => [true], - 'string' => ['DEPRECATED'], - 'integer which doesn\'t match any of the message type constants: -235' => [-235], - 'integer which doesn\'t match any of the message type constants: 0' => [0], - 'integer which doesn\'t match any of the message type constants: 3' => [3], - 'integer which doesn\'t match any of the message type constants: 6' => [6], - 'integer which doesn\'t match any of the message type constants: 123' => [123], - 'integer which doesn\'t match any of the message type constants: PHP_INT_MAX' => [PHP_INT_MAX], - ]; - - }//end dataAddingMessageWithUnsupportedMessageTypeResultsInException() - - - /** - * Verify that the `containsBlockingErrors()` method correctly identifies whether the collected messages - * include messages which are blocking (errors), or only include non-blocking (warnings, notices, - * deprecations) messages. - * - * @param array $messages The messages to display. - * Key is the message, value is the error level. - * @param bool $expected The expected function output. - * - * @dataProvider dataContainsBlockingErrors - * - * @return void - */ - public function testContainsBlockingErrors($messages, $expected) - { - $msgCollector = new MessageCollector(); - $this->createErrorCache($msgCollector, $messages); - - $this->assertSame($expected, $msgCollector->containsBlockingErrors()); - - }//end testContainsBlockingErrors() - - - /** - * Data provider. - * - * @see testContainsBlockingErrors() - * - * @return array|bool>> - */ - public static function dataContainsBlockingErrors() - { - return [ - 'No messages' => [ - 'messages' => [], - 'expected' => false, - ], - 'Only non-blocking messages' => [ - 'messages' => [ - 'First message' => MessageCollector::WARNING, - 'Second message' => MessageCollector::NOTICE, - 'Third message' => MessageCollector::DEPRECATED, - ], - 'expected' => false, - ], - 'Only blocking messages' => [ - 'messages' => [ - 'First message' => MessageCollector::ERROR, - 'Second message' => MessageCollector::ERROR, - 'Third message' => MessageCollector::ERROR, - ], - 'expected' => true, - ], - 'Mix of blocking and non-blocking messages' => [ - 'messages' => [ - 'First message' => MessageCollector::DEPRECATED, - 'Second message' => MessageCollector::ERROR, - 'Third message' => MessageCollector::WARNING, - ], - 'expected' => true, - ], - ]; - - }//end dataContainsBlockingErrors() - - - /** - * Test displaying non-blocking messages only. - * - * Verifies that: - * - Each message is prefixed with the appropriate prefix. - * - The default message order is observed. - * - The messages use the appropriate OS-specific EOL character. - * - * @param array $messages The messages to display. - * Key is the message, value is the error level. - * @param string $expected The expected exception message. - * - * @dataProvider dataDisplayingNonBlockingMessages - * - * @return void - */ - public function testDisplayingNonBlockingMessages($messages, $expected) - { - $msgCollector = new MessageCollector(); - $this->createErrorCache($msgCollector, $messages); - - $this->expectOutputString($expected); - - $msgCollector->display(); - - }//end testDisplayingNonBlockingMessages() - - - /** - * Data provider. - * - * @see testDisplayingNonBlockingMessages() - * - * @return array|string>> - */ - public static function dataDisplayingNonBlockingMessages() - { - // phpcs:disable Squiz.Strings.ConcatenationSpacing.PaddingFound -- Test readability is more important. - return [ - 'No messages' => [ - 'messages' => [], - 'expected' => '', - ], - 'One warning' => [ - 'messages' => [ - 'This is a warning' => MessageCollector::WARNING, - ], - 'expected' => 'WARNING: This is a warning'.PHP_EOL.PHP_EOL, - ], - 'One notice' => [ - 'messages' => [ - 'This is a notice' => MessageCollector::NOTICE, - ], - 'expected' => 'NOTICE: This is a notice'.PHP_EOL.PHP_EOL, - ], - 'One deprecation' => [ - 'messages' => [ - 'This is a deprecation' => MessageCollector::DEPRECATED, - ], - 'expected' => 'DEPRECATED: This is a deprecation'.PHP_EOL.PHP_EOL, - ], - 'Multiple warnings' => [ - 'messages' => [ - 'First warning' => MessageCollector::WARNING, - 'Second warning' => MessageCollector::WARNING, - ], - 'expected' => 'WARNING: First warning'.PHP_EOL - .'WARNING: Second warning'.PHP_EOL.PHP_EOL, - ], - 'Multiple notices' => [ - 'messages' => [ - 'First notice' => MessageCollector::NOTICE, - 'Second notice' => MessageCollector::NOTICE, - 'Third notice' => MessageCollector::NOTICE, - ], - 'expected' => 'NOTICE: First notice'.PHP_EOL - .'NOTICE: Second notice'.PHP_EOL - .'NOTICE: Third notice'.PHP_EOL.PHP_EOL, - ], - 'Multiple deprecations' => [ - 'messages' => [ - 'First deprecation' => MessageCollector::DEPRECATED, - 'Second deprecation' => MessageCollector::DEPRECATED, - ], - 'expected' => 'DEPRECATED: First deprecation'.PHP_EOL - .'DEPRECATED: Second deprecation'.PHP_EOL.PHP_EOL, - ], - 'All together now' => [ - 'messages' => [ - 'First deprecation' => MessageCollector::DEPRECATED, - 'Second warning' => MessageCollector::WARNING, - 'Third notice' => MessageCollector::NOTICE, - 'Fourth warning' => MessageCollector::WARNING, - ], - 'expected' => 'WARNING: Second warning'.PHP_EOL - .'WARNING: Fourth warning'.PHP_EOL - .'NOTICE: Third notice'.PHP_EOL - .'DEPRECATED: First deprecation'.PHP_EOL.PHP_EOL, - ], - ]; - // phpcs:enable - - }//end dataDisplayingNonBlockingMessages() - - - /** - * Test displaying message collections containing blocking messages. - * - * Verifies that: - * - Each message is prefixed with the appropriate prefix. - * - The default message order is observed. - * - The messages use the appropriate OS-specific EOL character. - * - * @param array $messages The messages to display. - * Key is the message, value is the error level. - * @param string $expected The expected exception message. - * - * @dataProvider dataDisplayingBlockingErrors - * - * @return void - */ - public function testDisplayingBlockingErrors($messages, $expected) - { - $exception = 'PHP_CodeSniffer\Exceptions\RuntimeException'; - if (method_exists($this, 'expectException') === true) { - // PHPUnit 5+. - $this->expectException($exception); - $this->expectExceptionMessage($expected); - } else { - // PHPUnit 4. - $this->setExpectedException($exception, $expected); - } - - $msgCollector = new MessageCollector(); - $this->createErrorCache($msgCollector, $messages); - $msgCollector->display(); - - }//end testDisplayingBlockingErrors() - - - /** - * Data provider. - * - * @see testDisplayingBlockingErrors() - * - * @return array|string>> - */ - public static function dataDisplayingBlockingErrors() - { - // phpcs:disable Squiz.Strings.ConcatenationSpacing.PaddingFound -- Test readability is more important. - return [ - 'Single error' => [ - 'messages' => [ - 'This is an error' => MessageCollector::ERROR, - ], - 'expected' => 'ERROR: This is an error'.PHP_EOL.PHP_EOL, - ], - 'Multiple errors' => [ - 'messages' => [ - 'First error' => MessageCollector::ERROR, - 'Second error' => MessageCollector::ERROR, - ], - 'expected' => 'ERROR: First error'.PHP_EOL - .'ERROR: Second error'.PHP_EOL.PHP_EOL, - ], - 'Errors mixed with non-blocking messages' => [ - 'messages' => [ - 'First deprecation' => MessageCollector::DEPRECATED, - 'Second warning' => MessageCollector::WARNING, - 'Third notice' => MessageCollector::NOTICE, - 'Fourth error' => MessageCollector::ERROR, - 'Fifth warning' => MessageCollector::WARNING, - 'Sixth error' => MessageCollector::ERROR, - 'Seventh deprecation' => MessageCollector::DEPRECATED, - ], - 'expected' => 'ERROR: Fourth error'.PHP_EOL - .'ERROR: Sixth error'.PHP_EOL - .'WARNING: Second warning'.PHP_EOL - .'WARNING: Fifth warning'.PHP_EOL - .'NOTICE: Third notice'.PHP_EOL - .'DEPRECATED: First deprecation'.PHP_EOL - .'DEPRECATED: Seventh deprecation'.PHP_EOL.PHP_EOL, - ], - ]; - // phpcs:enable - - }//end dataDisplayingBlockingErrors() - - - /** - * Verify and safeguard that adding the same message twice is accepted when messages have different error levels. - * - * Note: have multiple messages with the exact same text is not great for conveying information - * to the end-user, but that's not the concern of the MessageCollector class. - * - * @return void - */ - public function testNonUniqueMessagesWithDifferentErrorLevelAreAccepted() - { - $message = 'Trying to add the same message twice'; - $msgCollector = new MessageCollector(); - $msgCollector->add($message, MessageCollector::NOTICE); - $msgCollector->add($message, MessageCollector::WARNING); - - $expected = 'WARNING: Trying to add the same message twice'.PHP_EOL; - $expected .= 'NOTICE: Trying to add the same message twice'.PHP_EOL.PHP_EOL; - $this->expectOutputString($expected); - - $msgCollector->display(); - - }//end testNonUniqueMessagesWithDifferentErrorLevelAreAccepted() - - - /** - * Verify and safeguard that adding the same message twice is accepted when messages have the same error level. - * - * Note: have multiple messages with the exact same text is not great for conveying information - * to the end-user, but that's not the concern of the MessageCollector class. - * - * @return void - */ - public function testNonUniqueMessagesWithSameErrorLevelAreAccepted() - { - $message = 'Trying to add the same message twice'; - $msgCollector = new MessageCollector(); - $msgCollector->add($message, MessageCollector::NOTICE); - $msgCollector->add($message, MessageCollector::NOTICE); - - $expected = 'NOTICE: Trying to add the same message twice'.PHP_EOL; - $expected .= 'NOTICE: Trying to add the same message twice'.PHP_EOL.PHP_EOL; - $this->expectOutputString($expected); - - $msgCollector->display(); - - }//end testNonUniqueMessagesWithSameErrorLevelAreAccepted() - - - /** - * Ensure that the message cache is cleared when the collected messages are displayed. - * - * @return void - */ - public function testCallingDisplayTwiceWillNotShowMessagesTwice() - { - $messages = [ - 'First notice' => MessageCollector::NOTICE, - 'Second deprecation' => MessageCollector::DEPRECATED, - 'Third notice' => MessageCollector::NOTICE, - 'Fourth warning' => MessageCollector::WARNING, - ]; - - $msgCollector = new MessageCollector(); - $this->createErrorCache($msgCollector, $messages); - - $expected = 'WARNING: Fourth warning'.PHP_EOL; - $expected .= 'NOTICE: First notice'.PHP_EOL; - $expected .= 'NOTICE: Third notice'.PHP_EOL; - $expected .= 'DEPRECATED: Second deprecation'.PHP_EOL.PHP_EOL; - $this->expectOutputString($expected); - - $msgCollector->display(); - $msgCollector->display(); - - }//end testCallingDisplayTwiceWillNotShowMessagesTwice() - - - /** - * Test that messages are ordered correctly. - * - * @param string $order The display order. - * @param string $expected The expected output. - * - * @dataProvider dataDisplayOrderHandling - * - * @return void - */ - public function testDisplayOrderHandling($order, $expected) - { - $messages = [ - 'First notice' => MessageCollector::NOTICE, - 'Second deprecation' => MessageCollector::DEPRECATED, - 'Third notice' => MessageCollector::NOTICE, - 'Fourth warning' => MessageCollector::WARNING, - ]; - - $msgCollector = new MessageCollector(); - $this->createErrorCache($msgCollector, $messages); - - $this->expectOutputString($expected); - - $msgCollector->display($order); - - }//end testDisplayOrderHandling() - - - /** - * Data provider. - * - * @see testDisplayOrderHandling() - * - * @return array> - */ - public static function dataDisplayOrderHandling() - { - $expectedForSeverity = 'WARNING: Fourth warning'.PHP_EOL; - $expectedForSeverity .= 'NOTICE: First notice'.PHP_EOL; - $expectedForSeverity .= 'NOTICE: Third notice'.PHP_EOL; - $expectedForSeverity .= 'DEPRECATED: Second deprecation'.PHP_EOL.PHP_EOL; - - $expectedForReceived = 'NOTICE: First notice'.PHP_EOL; - $expectedForReceived .= 'DEPRECATED: Second deprecation'.PHP_EOL; - $expectedForReceived .= 'NOTICE: Third notice'.PHP_EOL; - $expectedForReceived .= 'WARNING: Fourth warning'.PHP_EOL.PHP_EOL; - - return [ - 'Order by severity' => [ - 'order' => MessageCollector::ORDERBY_SEVERITY, - 'expected' => $expectedForSeverity, - ], - 'Order by received' => [ - 'order' => MessageCollector::ORDERBY_RECEIVED, - 'expected' => $expectedForReceived, - ], - 'Invalid order defaults to severity' => [ - 'order' => 'unknown order', - 'expected' => $expectedForSeverity, - ], - ]; - - }//end dataDisplayOrderHandling() - - - /** - * Test helper. - * - * @param \PHP_CodeSniffer\Util\MessageCollector $collector The error cache object. - * @param array $messages The error messages to add to the cache. - * Key is the message, value is the error level. - * - * @return void - */ - private function createErrorCache(MessageCollector $collector, $messages) - { - foreach ($messages as $msg => $type) { - $collector->add($msg, $type); - } - - }//end createErrorCache() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Util/Timing/GetHumanReadableDurationTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Util/Timing/GetHumanReadableDurationTest.php deleted file mode 100644 index 8b0f35d..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Util/Timing/GetHumanReadableDurationTest.php +++ /dev/null @@ -1,114 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Util\Timing; - -use PHP_CodeSniffer\Util\Timing; -use PHPUnit\Framework\TestCase; - -/** - * Tests for the \PHP_CodeSniffer\Util\Timing::getHumanReadableDuration() method. - * - * @covers \PHP_CodeSniffer\Util\Timing::getHumanReadableDuration - */ -final class GetHumanReadableDurationTest extends TestCase -{ - - - /** - * Test the method. - * - * @param int|float $duration A duration in milliseconds. - * @param string $expected The expected human readable string. - * - * @dataProvider dataGetHumanReadableDuration - * - * @return void - */ - public function testGetHumanReadableDuration($duration, $expected) - { - $this->assertSame($expected, Timing::getHumanReadableDuration($duration)); - - }//end testGetHumanReadableDuration() - - - /** - * Data provider. - * - * @return array> - */ - public static function dataGetHumanReadableDuration() - { - return [ - 'Duration: 0' => [ - 'duration' => 0, - 'expected' => '0ms', - ], - 'Duration: 13 milliseconds' => [ - 'duration' => 13.232101565, - 'expected' => '13ms', - ], - 'Duration: 14 milliseconds' => [ - 'duration' => 13.916015625, - 'expected' => '14ms', - ], - 'Duration: 999 milliseconds' => [ - 'duration' => 999.2236, - 'expected' => '999ms', - ], - 'Duration: 999+ milliseconds' => [ - 'duration' => 999.89236, - 'expected' => '1000ms', - ], - 'Duration: 1 second' => [ - 'duration' => 1000, - 'expected' => '1 secs', - ], - 'Duration: slightly more than 1 second' => [ - 'duration' => 1001.178215, - 'expected' => '1 secs', - ], - 'Duration: just under a 1 minute' => [ - 'duration' => 59999.3851, - 'expected' => '60 secs', - ], - 'Duration: exactly 1 minute' => [ - 'duration' => 60000, - 'expected' => '1 mins', - ], - 'Duration: slightly more than 1 minute' => [ - 'duration' => 60001.7581235, - 'expected' => '1 mins', - ], - 'Duration: 1 minute, just under half a second' => [ - 'duration' => 60499.83639, - 'expected' => '1 mins, 0.5 secs', - ], - 'Duration: 1 minute, just over half a second' => [ - 'duration' => 60501.961238, - 'expected' => '1 mins, 0.5 secs', - ], - 'Duration: 1 minute, 1 second' => [ - 'duration' => 61000, - 'expected' => '1 mins, 1 secs', - ], - 'Duration: exactly 1 hour' => [ - 'duration' => 3600000, - 'expected' => '60 mins', - ], - 'Duration: 89.4 mins' => [ - 'duration' => 5364000, - 'expected' => '89 mins, 24 secs', - ], - ]; - - }//end dataGetHumanReadableDuration() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Util/Timing/TimingTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Util/Timing/TimingTest.php deleted file mode 100644 index 5934c0e..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Util/Timing/TimingTest.php +++ /dev/null @@ -1,121 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Util\Timing; - -use PHP_CodeSniffer\Util\Timing; -use PHPUnit\Framework\TestCase; - -/** - * Tests for the \PHP_CodeSniffer\Util\Timing class. - * - * {@internal These tests need to run in separate processes as the Timing class uses static properties - * to keep track of the start time and whether or not the runtime has been printed and these - * can't be unset/reset once set.} - * - * @covers \PHP_CodeSniffer\Util\Timing - * - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - */ -final class TimingTest extends TestCase -{ - - - /** - * Verify that getDuration() returns 0 when the timer wasn't started. - * - * @return void - */ - public function testGetDurationWithoutStartReturnsZero() - { - $this->assertSame(0, Timing::getDuration()); - - }//end testGetDurationWithoutStartReturnsZero() - - - /** - * Verify that getDuration() returns the time in milliseconds. - * - * @return void - */ - public function testGetDurationWithStartReturnsMilliseconds() - { - Timing::startTiming(); - usleep(1500); - $duration = Timing::getDuration(); - - $this->assertTrue(is_float($duration)); - - }//end testGetDurationWithStartReturnsMilliseconds() - - - /** - * Verify that printRunTime() doesn't print anything if the timer wasn't started. - * - * @return void - */ - public function testTimeIsNotPrintedIfTimerWasNeverStarted() - { - $this->expectOutputString(''); - Timing::printRunTime(); - - }//end testTimeIsNotPrintedIfTimerWasNeverStarted() - - - /** - * Verify that printRunTime() doesn't print anything if the timer wasn't started. - * - * @return void - */ - public function testTimeIsNotPrintedIfTimerWasNeverStartedEvenWhenForced() - { - $this->expectOutputString(''); - Timing::printRunTime(true); - - }//end testTimeIsNotPrintedIfTimerWasNeverStartedEvenWhenForced() - - - /** - * Verify that printRunTime() when called multiple times only prints the runtime information once. - * - * @return void - */ - public function testTimeIsPrintedOnlyOnce() - { - $this->expectOutputRegex('`^Time: [0-9]+ms; Memory: [0-9\.]+MB'.PHP_EOL.PHP_EOL.'$`'); - - Timing::startTiming(); - usleep(2000); - Timing::printRunTime(); - Timing::printRunTime(); - Timing::printRunTime(); - - }//end testTimeIsPrintedOnlyOnce() - - - /** - * Verify that printRunTime() when called multiple times prints the runtime information multiple times if forced. - * - * @return void - */ - public function testTimeIsPrintedMultipleTimesOnlyIfForced() - { - $this->expectOutputRegex('`^(Time: [0-9]+ms; Memory: [0-9\.]+MB'.PHP_EOL.PHP_EOL.'){3}$`'); - - Timing::startTiming(); - usleep(2000); - Timing::printRunTime(true); - Timing::printRunTime(true); - Timing::printRunTime(true); - - }//end testTimeIsPrintedMultipleTimesOnlyIfForced() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Util/Tokens/GetHighestWeightedTokenTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Util/Tokens/GetHighestWeightedTokenTest.php deleted file mode 100644 index 344c93a..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Util/Tokens/GetHighestWeightedTokenTest.php +++ /dev/null @@ -1,162 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Util\Tokens; - -use PHP_CodeSniffer\Util\Tokens; -use PHPUnit\Framework\TestCase; - -/** - * Tests for the \PHP_CodeSniffer\Util\Tokens::getHighestWeightedToken() method. - * - * @covers \PHP_CodeSniffer\Util\Tokens::getHighestWeightedToken - */ -final class GetHighestWeightedTokenTest extends TestCase -{ - - - /** - * Test the method. - * - * @param array $tokens The tokens to find the heighest weighted one. - * @param int|false $expected The expected function return value. - * - * @dataProvider dataGetHighestWeightedToken - * - * @return void - */ - public function testGetHighestWeightedToken($tokens, $expected) - { - $this->assertSame($expected, Tokens::getHighestWeightedToken($tokens)); - - }//end testGetHighestWeightedToken() - - - /** - * Data provider. - * - * @return array>> - */ - public static function dataGetHighestWeightedToken() - { - $data = [ - 'Array of non-tokens passed, returns first' => [ - 'tokens' => [ - PHP_SAPI, - PHP_MAJOR_VERSION, - PHP_OS, - ], - 'expected' => PHP_SAPI, - ], - 'No weightings available for any of the selected tokens, first one wins' => [ - 'tokens' => [ - T_VARIABLE, - T_STRING, - T_EXTENDS, - T_IMPLEMENTS, - ], - 'expected' => T_VARIABLE, - ], - 'single token always returns that token' => [ - 'tokens' => [T_VARIABLE], - 'expected' => T_VARIABLE, - ], - 'Unknown and known token, known token wins' => [ - 'tokens' => [ - T_VARIABLE, - T_SELF, - ], - 'expected' => T_SELF, - ], - 'Known and unknown token, known token wins' => [ - 'tokens' => [ - T_CLOSURE, - T_STRING, - ], - 'expected' => T_CLOSURE, - ], - 'Two tokens with equal weights passed, first one wins' => [ - 'tokens' => [ - T_CLOSURE, - T_FUNCTION, - ], - 'expected' => T_CLOSURE, - ], - 'Five tokens with equal weights passed, first one wins' => [ - 'tokens' => [ - T_NAMESPACE, - T_TRAIT, - T_ENUM, - T_CLASS, - T_INTERFACE, - ], - 'expected' => T_NAMESPACE, - ], - 'Tokens with different weights passed, heightest (25) wins' => [ - 'tokens' => [ - T_BITWISE_OR, - T_SELF, - T_MUL_EQUAL, - ], - 'expected' => T_SELF, - ], - 'Tokens with different weights passed, heightest (50) wins' => [ - 'tokens' => [ - T_BITWISE_XOR, - T_CATCH, - T_SPACESHIP, - T_PARENT, - ], - 'expected' => T_CATCH, - ], - ]; - - $high100 = [ - T_MULTIPLY, - T_BITWISE_AND, - T_SELF, - T_FOREACH, - T_CLOSURE, - ]; - $data['Tokens with different weights passed, ordered low-high, heightest (100) wins'] = [ - 'tokens' => $high100, - 'expected' => T_CLOSURE, - ]; - - shuffle($high100); - $data['Tokens with different weights passed, order random, heightest (100) wins'] = [ - 'tokens' => $high100, - 'expected' => T_CLOSURE, - ]; - - $high1000 = [ - T_ENUM, - T_FUNCTION, - T_ELSEIF, - T_PARENT, - T_BITWISE_OR, - T_MODULUS, - ]; - $data['Tokens with different weights passed, ordered low-high, heightest (1000) wins'] = [ - 'tokens' => $high1000, - 'expected' => T_ENUM, - ]; - - shuffle($high1000); - $data['Tokens with different weights passed, order random, heightest (1000) wins'] = [ - 'tokens' => $high1000, - 'expected' => T_ENUM, - ]; - - return $data; - - }//end dataGetHighestWeightedToken() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Core/Util/Tokens/TokenNameTest.php b/vendor/squizlabs/php_codesniffer/tests/Core/Util/Tokens/TokenNameTest.php deleted file mode 100644 index 600e05b..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Core/Util/Tokens/TokenNameTest.php +++ /dev/null @@ -1,197 +0,0 @@ - - * @copyright 2024 PHPCSStandards and contributors - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Core\Util\Tokens; - -use PHP_CodeSniffer\Util\Tokens; -use PHPUnit\Framework\TestCase; - -/** - * Tests for the \PHP_CodeSniffer\Util\Tokens::tokenName() method. - * - * @covers \PHP_CodeSniffer\Util\Tokens::tokenName - */ -final class TokenNameTest extends TestCase -{ - - - /** - * Test the method. - * - * @param int|string $tokenCode The PHP/PHPCS token code to get the name for. - * @param string $expected The expected token name. - * - * @dataProvider dataTokenName - * @dataProvider dataPolyfilledPHPNativeTokens - * - * @return void - */ - public function testTokenName($tokenCode, $expected) - { - $this->assertSame($expected, Tokens::tokenName($tokenCode)); - - }//end testTokenName() - - - /** - * Data provider. - * - * @return array> - */ - public static function dataTokenName() - { - return [ - 'PHP native token: T_ECHO' => [ - 'tokenCode' => T_ECHO, - 'expected' => 'T_ECHO', - ], - 'PHP native token: T_FUNCTION' => [ - 'tokenCode' => T_FUNCTION, - 'expected' => 'T_FUNCTION', - ], - 'PHPCS native token: T_CLOSURE' => [ - 'tokenCode' => T_CLOSURE, - 'expected' => 'T_CLOSURE', - ], - 'PHPCS native token: T_STRING_CONCAT' => [ - 'tokenCode' => T_STRING_CONCAT, - 'expected' => 'T_STRING_CONCAT', - ], - - // Document the current behaviour for invalid input. - // This behaviour is subject to change. - 'Non-token integer passed' => [ - 'tokenCode' => 100000, - 'expected' => 'UNKNOWN', - ], - 'Non-token string passed' => [ - 'tokenCode' => 'something', - 'expected' => 'ing', - ], - ]; - - }//end dataTokenName() - - - /** - * Data provider. - * - * @return array> - */ - public static function dataPolyfilledPHPNativeTokens() - { - return [ - 'PHP 5.5 native token, polyfilled: T_FINALLY' => [ - 'tokenCode' => T_FINALLY, - 'expected' => 'T_FINALLY', - ], - 'PHP 5.5 native token, polyfilled: T_YIELD' => [ - 'tokenCode' => T_YIELD, - 'expected' => 'T_YIELD', - ], - - 'PHP 5.6 native token, polyfilled: T_ELLIPSIS' => [ - 'tokenCode' => T_ELLIPSIS, - 'expected' => 'T_ELLIPSIS', - ], - 'PHP 5.6 native token, polyfilled: T_POW' => [ - 'tokenCode' => T_POW, - 'expected' => 'T_POW', - ], - 'PHP 5.6 native token, polyfilled: T_POW_EQUAL' => [ - 'tokenCode' => T_POW_EQUAL, - 'expected' => 'T_POW_EQUAL', - ], - - 'PHP 7.0 native token, polyfilled: T_SPACESHIP' => [ - 'tokenCode' => T_SPACESHIP, - 'expected' => 'T_SPACESHIP', - ], - 'PHP 7.0 native token, polyfilled: T_COALESCE' => [ - 'tokenCode' => T_COALESCE, - 'expected' => 'T_COALESCE', - ], - 'PHP 7.0 native token, polyfilled: T_YIELD_FROM' => [ - 'tokenCode' => T_YIELD_FROM, - 'expected' => 'T_YIELD_FROM', - ], - - 'PHP 7.4 native token, polyfilled: T_COALESCE_EQUAL' => [ - 'tokenCode' => T_COALESCE_EQUAL, - 'expected' => 'T_COALESCE_EQUAL', - ], - 'PHP 7.4 native token, polyfilled: T_BAD_CHARACTER' => [ - 'tokenCode' => T_BAD_CHARACTER, - 'expected' => 'T_BAD_CHARACTER', - ], - 'PHP 7.4 native token, polyfilled: T_FN' => [ - 'tokenCode' => T_FN, - 'expected' => 'T_FN', - ], - - 'PHP 8.0 native token, polyfilled: T_NULLSAFE_OBJECT_OPERATOR' => [ - 'tokenCode' => T_NULLSAFE_OBJECT_OPERATOR, - 'expected' => 'T_NULLSAFE_OBJECT_OPERATOR', - ], - 'PHP 8.0 native token, polyfilled: T_NAME_QUALIFIED' => [ - 'tokenCode' => T_NAME_QUALIFIED, - 'expected' => 'T_NAME_QUALIFIED', - ], - 'PHP 8.0 native token, polyfilled: T_NAME_FULLY_QUALIFIED' => [ - 'tokenCode' => T_NAME_FULLY_QUALIFIED, - 'expected' => 'T_NAME_FULLY_QUALIFIED', - ], - 'PHP 8.0 native token, polyfilled: T_NAME_RELATIVE' => [ - 'tokenCode' => T_NAME_RELATIVE, - 'expected' => 'T_NAME_RELATIVE', - ], - 'PHP 8.0 native token, polyfilled: T_MATCH' => [ - 'tokenCode' => T_MATCH, - 'expected' => 'T_MATCH', - ], - 'PHP 8.0 native token, polyfilled: T_ATTRIBUTE' => [ - 'tokenCode' => T_ATTRIBUTE, - 'expected' => 'T_ATTRIBUTE', - ], - - 'PHP 8.1 native token, polyfilled: T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG' => [ - 'tokenCode' => T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG, - 'expected' => 'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG', - ], - 'PHP 8.1 native token, polyfilled: T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG' => [ - 'tokenCode' => T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG, - 'expected' => 'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG', - ], - 'PHP 8.1 native token, polyfilled: T_READONLY' => [ - 'tokenCode' => T_READONLY, - 'expected' => 'T_READONLY', - ], - 'PHP 8.1 native token, polyfilled: T_ENUM' => [ - 'tokenCode' => T_ENUM, - 'expected' => 'T_ENUM', - ], - - 'PHP 8.4 native token, polyfilled: T_PUBLIC_SET' => [ - 'tokenCode' => T_PUBLIC_SET, - 'expected' => 'T_PUBLIC_SET', - ], - 'PHP 8.4 native token, polyfilled: T_PROTECTED_SET' => [ - 'tokenCode' => T_PROTECTED_SET, - 'expected' => 'T_PROTECTED_SET', - ], - 'PHP 8.4 native token, polyfilled: T_PRIVATE_SET' => [ - 'tokenCode' => T_PRIVATE_SET, - 'expected' => 'T_PRIVATE_SET', - ], - ]; - - }//end dataPolyfilledPHPNativeTokens() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/EndToEnd/Fixtures/ClassOneWithoutStyleError.inc b/vendor/squizlabs/php_codesniffer/tests/EndToEnd/Fixtures/ClassOneWithoutStyleError.inc deleted file mode 100644 index fadd465..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/EndToEnd/Fixtures/ClassOneWithoutStyleError.inc +++ /dev/null @@ -1,18 +0,0 @@ - - - The coding standard for end to end tests. - - - - . - - - - - - diff --git a/vendor/squizlabs/php_codesniffer/tests/EndToEnd/outofmemory_test.sh b/vendor/squizlabs/php_codesniffer/tests/EndToEnd/outofmemory_test.sh deleted file mode 100644 index 86c5497..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/EndToEnd/outofmemory_test.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env bash - -function tear_down() { - rm -f tests/EndToEnd/Fixtures/*.fixed -} - -function test_phpcs_out_of_memory_error_handling() { - OUTPUT="$(bin/phpcs -d memory_limit=4M --standard=tests/EndToEnd/Fixtures/endtoend.xml.dist tests/EndToEnd/Fixtures/)" - # Exit code may be 255 or 139 depending on the PHP version, but the exact code is not our concern, just that it's non-zero. - assert_unsuccessful_code - - assert_contains "The PHP_CodeSniffer \"phpcs\" command ran out of memory." "$OUTPUT" - assert_contains "Either raise the \"memory_limit\" of PHP in the php.ini file or raise the memory limit at runtime" "$OUTPUT" - assert_contains "using \"phpcs -d memory_limit=512M\" (replace 512M with the desired memory limit)." "$OUTPUT" -} - -function test_phpcbf_out_of_memory_error_handling() { - OUTPUT="$(bin/phpcbf -d memory_limit=4M --standard=tests/EndToEnd/Fixtures/endtoend.xml.dist tests/EndToEnd/Fixtures/ --suffix=.fixed)" - # Exit code may be 255 or 139 depending on the PHP version, but the exact code is not our concern, just that it's non-zero. - assert_unsuccessful_code - - assert_contains "The PHP_CodeSniffer \"phpcbf\" command ran out of memory." "$OUTPUT" - assert_contains "Either raise the \"memory_limit\" of PHP in the php.ini file or raise the memory limit at runtime" "$OUTPUT" - assert_contains "using \"phpcbf -d memory_limit=512M\" (replace 512M with the desired memory limit)." "$OUTPUT" -} diff --git a/vendor/squizlabs/php_codesniffer/tests/EndToEnd/phpcbf_test.sh b/vendor/squizlabs/php_codesniffer/tests/EndToEnd/phpcbf_test.sh deleted file mode 100644 index 68d7bc7..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/EndToEnd/phpcbf_test.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env bash - -function tear_down() { - rm -rf tests/EndToEnd/Fixtures/*.fixed -} - -function test_phpcbf_is_working() { - OUTPUT="$(bin/phpcbf --no-cache --standard=tests/EndToEnd/Fixtures/endtoend.xml.dist tests/EndToEnd/Fixtures/ClassOneWithoutStyleError.inc tests/EndToEnd/Fixtures/ClassTwoWithoutStyleError.inc)" - - assert_successful_code - assert_contains "No violations were found" "$OUTPUT" -} - -function test_phpcbf_is_working_in_parallel() { - OUTPUT="$(bin/phpcbf --no-cache --parallel=2 --standard=tests/EndToEnd/Fixtures/endtoend.xml.dist tests/EndToEnd/Fixtures/ClassOneWithoutStyleError.inc tests/EndToEnd/Fixtures/ClassTwoWithoutStyleError.inc)" - - assert_successful_code - assert_contains "No violations were found" "$OUTPUT" -} - -function test_phpcbf_returns_error_on_issues() { - OUTPUT="$(bin/phpcbf --no-colors --no-cache --suffix=.fixed --standard=tests/EndToEnd/Fixtures/endtoend.xml.dist tests/EndToEnd/Fixtures/ClassWithStyleError.inc)" - assert_exit_code 1 - - assert_contains "F 1 / 1 (100%)" "$OUTPUT" - assert_contains "A TOTAL OF 1 ERROR WERE FIXED IN 1 FILE" "$OUTPUT" -} - -function test_phpcbf_bug_1112() { - # See https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/1112 - if [[ "$(uname)" == "Darwin" ]]; then - # Perform some magic with `& fg` to prevent the processes from turning into a background job. - assert_successful_code "$(bash -ic 'bash --init-file <(echo "echo \"Subprocess\"") -c "bin/phpcbf --no-cache --parallel=2 --standard=tests/EndToEnd/Fixtures/endtoend.xml.dist tests/EndToEnd/Fixtures/ClassOneWithoutStyleError.inc tests/EndToEnd/Fixtures/ClassTwoWithoutStyleError.inc" & fg')" - else - # This is not needed on Linux / GitHub Actions - assert_successful_code "$(bash -ic 'bash --init-file <(echo "echo \"Subprocess\"") -c "bin/phpcbf --no-cache --parallel=2 --standard=tests/EndToEnd/Fixtures/endtoend.xml.dist tests/EndToEnd/Fixtures/ClassOneWithoutStyleError.inc tests/EndToEnd/Fixtures/ClassTwoWithoutStyleError.inc"')" - fi -} diff --git a/vendor/squizlabs/php_codesniffer/tests/EndToEnd/phpcs_test.sh b/vendor/squizlabs/php_codesniffer/tests/EndToEnd/phpcs_test.sh deleted file mode 100644 index 3bdf417..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/EndToEnd/phpcs_test.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env bash - -function test_phpcs_is_working() { - assert_successful_code "$(bin/phpcs --no-cache --standard=tests/EndToEnd/Fixtures/endtoend.xml.dist tests/EndToEnd/Fixtures/ClassOneWithoutStyleError.inc tests/EndToEnd/Fixtures/ClassTwoWithoutStyleError.inc)" -} - -function test_phpcs_is_working_in_parallel() { - assert_successful_code "$(bin/phpcs --no-cache --parallel=2 --standard=tests/EndToEnd/Fixtures/endtoend.xml.dist tests/EndToEnd/Fixtures/ClassOneWithoutStyleError.inc tests/EndToEnd/Fixtures/ClassTwoWithoutStyleError.inc)" -} - -function test_phpcs_returns_error_on_issues() { - OUTPUT="$(bin/phpcs --no-colors --no-cache --standard=tests/EndToEnd/Fixtures/endtoend.xml.dist tests/EndToEnd/Fixtures/ClassWithStyleError.inc)" - assert_exit_code 2 - - assert_contains "E 1 / 1 (100%)" "$OUTPUT" - assert_contains "FOUND 1 ERROR AFFECTING 1 LINE" "$OUTPUT" -} - -function test_phpcs_bug_1112() { - # See https://github.com/PHPCSStandards/PHP_CodeSniffer/issues/1112 - if [[ "$(uname)" == "Darwin" ]]; then - # Perform some magic with `& fg` to prevent the processes from turning into a background job. - assert_successful_code "$(bash -ic 'bash --init-file <(echo "echo \"Subprocess\"") -c "bin/phpcs --no-cache --parallel=2 --standard=tests/EndToEnd/Fixtures/endtoend.xml.dist tests/EndToEnd/Fixtures/ClassOneWithoutStyleError.inc tests/EndToEnd/Fixtures/ClassTwoWithoutStyleError.inc" & fg')" - else - # This is not needed on Linux / GitHub Actions - assert_successful_code "$(bash -ic 'bash --init-file <(echo "echo \"Subprocess\"") -c "bin/phpcs --no-cache --parallel=2 --standard=tests/EndToEnd/Fixtures/endtoend.xml.dist tests/EndToEnd/Fixtures/ClassOneWithoutStyleError.inc tests/EndToEnd/Fixtures/ClassTwoWithoutStyleError.inc"')" - fi -} diff --git a/vendor/squizlabs/php_codesniffer/tests/FileList.php b/vendor/squizlabs/php_codesniffer/tests/FileList.php deleted file mode 100644 index b7d4439..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/FileList.php +++ /dev/null @@ -1,98 +0,0 @@ - - * @copyright 2019 Juliette Reinders Folmer. All rights reserved. - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests; - -use RecursiveDirectoryIterator; -use RecursiveIteratorIterator; -use RegexIterator; - -class FileList -{ - - /** - * The path to the project root directory. - * - * @var string - */ - protected $rootPath; - - /** - * Recursive directory iterator. - * - * @var \DirectoryIterator - */ - public $fileIterator; - - /** - * Base regex to use if no filter regex is provided. - * - * Matches based on: - * - File path starts with the project root (replacement done in constructor). - * - Don't match .git/ files. - * - Don't match dot files, i.e. "." or "..". - * - Don't match backup files. - * - Match everything else in a case-insensitive manner. - * - * @var string - */ - private $baseRegex = '`^%s(?!\.git/)(?!(.*/)?\.+$)(?!.*\.(bak|orig)).*$`Dix'; - - - /** - * Constructor. - * - * @param string $directory The directory to examine. - * @param string $rootPath Path to the project root. - * @param string $filter PCRE regular expression to filter the file list with. - */ - public function __construct($directory, $rootPath='', $filter='') - { - $this->rootPath = $rootPath; - - $directory = new RecursiveDirectoryIterator( - $directory, - RecursiveDirectoryIterator::UNIX_PATHS - ); - $flattened = new RecursiveIteratorIterator( - $directory, - RecursiveIteratorIterator::LEAVES_ONLY, - RecursiveIteratorIterator::CATCH_GET_CHILD - ); - - if ($filter === '') { - $filter = sprintf($this->baseRegex, preg_quote($this->rootPath)); - } - - $this->fileIterator = new RegexIterator($flattened, $filter); - - return $this; - - }//end __construct() - - - /** - * Retrieve the filtered file list as an array. - * - * @return array - */ - public function getList() - { - $fileList = []; - - foreach ($this->fileIterator as $file) { - $fileList[] = str_replace($this->rootPath, '', $file); - } - - return $fileList; - - }//end getList() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Standards/AbstractSniffUnitTest.php b/vendor/squizlabs/php_codesniffer/tests/Standards/AbstractSniffUnitTest.php deleted file mode 100644 index a62de78..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Standards/AbstractSniffUnitTest.php +++ /dev/null @@ -1,468 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Standards; - -use DirectoryIterator; -use PHP_CodeSniffer\Exceptions\RuntimeException; -use PHP_CodeSniffer\Files\LocalFile; -use PHP_CodeSniffer\Ruleset; -use PHP_CodeSniffer\Tests\ConfigDouble; -use PHP_CodeSniffer\Util\Common; -use PHPUnit\Framework\TestCase; - -abstract class AbstractSniffUnitTest extends TestCase -{ - - /** - * Enable or disable the backup and restoration of the $GLOBALS array. - * Overwrite this attribute in a child class of TestCase. - * Setting this attribute in setUp() has no effect! - * - * @var boolean - */ - protected $backupGlobals = false; - - /** - * The path to the standard's main directory. - * - * @var string - */ - public $standardsDir = null; - - /** - * The path to the standard's test directory. - * - * @var string - */ - public $testsDir = null; - - - /** - * Sets up this unit test. - * - * @before - * - * @return void - */ - protected function setUpPrerequisites() - { - $class = get_class($this); - $this->standardsDir = $GLOBALS['PHP_CODESNIFFER_STANDARD_DIRS'][$class]; - $this->testsDir = $GLOBALS['PHP_CODESNIFFER_TEST_DIRS'][$class]; - - }//end setUpPrerequisites() - - - /** - * Get a list of all test files to check. - * - * These will have the same base as the sniff name but different extensions. - * We ignore the .php file as it is the class. - * - * @param string $testFileBase The base path that the unit tests files will have. - * - * @return string[] - */ - protected function getTestFiles($testFileBase) - { - $testFiles = []; - - $dir = substr($testFileBase, 0, strrpos($testFileBase, DIRECTORY_SEPARATOR)); - $di = new DirectoryIterator($dir); - - foreach ($di as $file) { - $path = $file->getPathname(); - if (substr($path, 0, strlen($testFileBase)) === $testFileBase) { - if ($path !== $testFileBase.'php' && substr($path, -5) !== 'fixed' && substr($path, -4) !== '.bak') { - $testFiles[] = $path; - } - } - } - - // Put them in order. - sort($testFiles, SORT_NATURAL); - - return $testFiles; - - }//end getTestFiles() - - - /** - * Should this test be skipped for some reason. - * - * @return boolean - */ - protected function shouldSkipTest() - { - return false; - - }//end shouldSkipTest() - - - /** - * Tests the extending classes Sniff class. - * - * @return void - * @throws \PHPUnit\Framework\Exception - */ - final public function testSniff() - { - // Skip this test if we can't run in this environment. - if ($this->shouldSkipTest() === true) { - $this->markTestSkipped(); - } - - $sniffCode = Common::getSniffCode(get_class($this)); - list($standardName, $categoryName, $sniffName) = explode('.', $sniffCode); - - $testFileBase = $this->testsDir.$categoryName.DIRECTORY_SEPARATOR.$sniffName.'UnitTest.'; - - // Get a list of all test files to check. - $testFiles = $this->getTestFiles($testFileBase); - $GLOBALS['PHP_CODESNIFFER_SNIFF_CASE_FILES'][] = $testFiles; - - if (isset($GLOBALS['PHP_CODESNIFFER_CONFIG']) === true) { - $config = $GLOBALS['PHP_CODESNIFFER_CONFIG']; - } else { - $config = new ConfigDouble(); - $config->cache = false; - $GLOBALS['PHP_CODESNIFFER_CONFIG'] = $config; - } - - $config->standards = [$standardName]; - $config->sniffs = [$sniffCode]; - $config->ignored = []; - - if (isset($GLOBALS['PHP_CODESNIFFER_RULESETS']) === false) { - $GLOBALS['PHP_CODESNIFFER_RULESETS'] = []; - } - - if (isset($GLOBALS['PHP_CODESNIFFER_RULESETS'][$standardName]) === false) { - $ruleset = new Ruleset($config); - $GLOBALS['PHP_CODESNIFFER_RULESETS'][$standardName] = $ruleset; - } - - $ruleset = $GLOBALS['PHP_CODESNIFFER_RULESETS'][$standardName]; - - $sniffFile = $this->standardsDir.DIRECTORY_SEPARATOR.'Sniffs'.DIRECTORY_SEPARATOR.$categoryName.DIRECTORY_SEPARATOR.$sniffName.'Sniff.php'; - - $sniffClassName = substr(get_class($this), 0, -8).'Sniff'; - $sniffClassName = str_replace('\Tests\\', '\Sniffs\\', $sniffClassName); - $sniffClassName = Common::cleanSniffClass($sniffClassName); - - $restrictions = [strtolower($sniffClassName) => true]; - $ruleset->registerSniffs([$sniffFile], $restrictions, []); - $ruleset->populateTokenListeners(); - - $failureMessages = []; - foreach ($testFiles as $testFile) { - $filename = basename($testFile); - $oldConfig = $config->getSettings(); - - try { - $this->setCliValues($filename, $config); - $phpcsFile = new LocalFile($testFile, $ruleset, $config); - $phpcsFile->process(); - } catch (RuntimeException $e) { - $this->fail('An unexpected exception has been caught: '.$e->getMessage()); - } - - $failures = $this->generateFailureMessages($phpcsFile); - $failureMessages = array_merge($failureMessages, $failures); - - if ($phpcsFile->getFixableCount() > 0) { - // Attempt to fix the errors. - $phpcsFile->fixer->fixFile(); - $fixable = $phpcsFile->getFixableCount(); - if ($fixable > 0) { - $failureMessages[] = "Failed to fix $fixable fixable violations in $filename"; - } - - // Check for a .fixed file to check for accuracy of fixes. - $fixedFile = $testFile.'.fixed'; - $filename = basename($testFile); - if (file_exists($fixedFile) === true) { - if ($phpcsFile->fixer->getContents() !== file_get_contents($fixedFile)) { - // Only generate the (expensive) diff if a difference is expected. - $diff = $phpcsFile->fixer->generateDiff($fixedFile); - if (trim($diff) !== '') { - $fixedFilename = basename($fixedFile); - $failureMessages[] = "Fixed version of $filename does not match expected version in $fixedFilename; the diff is\n$diff"; - } - } - } else if (is_callable([$this, 'addWarning']) === true) { - $this->addWarning("Missing fixed version of $filename to verify the accuracy of fixes, while the sniff is making fixes against the test case file"); - } - }//end if - - // Restore the config. - $config->setSettings($oldConfig); - }//end foreach - - if (empty($failureMessages) === false) { - $this->fail(implode(PHP_EOL, $failureMessages)); - } - - }//end testSniff() - - - /** - * Generate a list of test failures for a given sniffed file. - * - * @param \PHP_CodeSniffer\Files\LocalFile $file The file being tested. - * - * @return array - * @throws \PHP_CodeSniffer\Exceptions\RuntimeException - */ - public function generateFailureMessages(LocalFile $file) - { - $testFile = $file->getFilename(); - - $foundErrors = $file->getErrors(); - $foundWarnings = $file->getWarnings(); - $expectedErrors = $this->getErrorList(basename($testFile)); - $expectedWarnings = $this->getWarningList(basename($testFile)); - - if (is_array($expectedErrors) === false) { - throw new RuntimeException('getErrorList() must return an array'); - } - - if (is_array($expectedWarnings) === false) { - throw new RuntimeException('getWarningList() must return an array'); - } - - /* - We merge errors and warnings together to make it easier - to iterate over them and produce the errors string. In this way, - we can report on errors and warnings in the same line even though - it's not really structured to allow that. - */ - - $allProblems = []; - $failureMessages = []; - - foreach ($foundErrors as $line => $lineErrors) { - foreach ($lineErrors as $column => $errors) { - if (isset($allProblems[$line]) === false) { - $allProblems[$line] = [ - 'expected_errors' => 0, - 'expected_warnings' => 0, - 'found_errors' => [], - 'found_warnings' => [], - ]; - } - - $foundErrorsTemp = []; - foreach ($allProblems[$line]['found_errors'] as $foundError) { - $foundErrorsTemp[] = $foundError; - } - - $errorsTemp = []; - foreach ($errors as $foundError) { - $errorsTemp[] = $foundError['message'].' ('.$foundError['source'].')'; - - $source = $foundError['source']; - if (in_array($source, $GLOBALS['PHP_CODESNIFFER_SNIFF_CODES'], true) === false) { - $GLOBALS['PHP_CODESNIFFER_SNIFF_CODES'][] = $source; - } - - if ($foundError['fixable'] === true - && in_array($source, $GLOBALS['PHP_CODESNIFFER_FIXABLE_CODES'], true) === false - ) { - $GLOBALS['PHP_CODESNIFFER_FIXABLE_CODES'][] = $source; - } - } - - $allProblems[$line]['found_errors'] = array_merge($foundErrorsTemp, $errorsTemp); - }//end foreach - - if (isset($expectedErrors[$line]) === true) { - $allProblems[$line]['expected_errors'] = $expectedErrors[$line]; - } else { - $allProblems[$line]['expected_errors'] = 0; - } - - unset($expectedErrors[$line]); - }//end foreach - - foreach ($expectedErrors as $line => $numErrors) { - if (isset($allProblems[$line]) === false) { - $allProblems[$line] = [ - 'expected_errors' => 0, - 'expected_warnings' => 0, - 'found_errors' => [], - 'found_warnings' => [], - ]; - } - - $allProblems[$line]['expected_errors'] = $numErrors; - } - - foreach ($foundWarnings as $line => $lineWarnings) { - foreach ($lineWarnings as $column => $warnings) { - if (isset($allProblems[$line]) === false) { - $allProblems[$line] = [ - 'expected_errors' => 0, - 'expected_warnings' => 0, - 'found_errors' => [], - 'found_warnings' => [], - ]; - } - - $foundWarningsTemp = []; - foreach ($allProblems[$line]['found_warnings'] as $foundWarning) { - $foundWarningsTemp[] = $foundWarning; - } - - $warningsTemp = []; - foreach ($warnings as $warning) { - $warningsTemp[] = $warning['message'].' ('.$warning['source'].')'; - - $source = $warning['source']; - if (in_array($source, $GLOBALS['PHP_CODESNIFFER_SNIFF_CODES'], true) === false) { - $GLOBALS['PHP_CODESNIFFER_SNIFF_CODES'][] = $source; - } - - if ($warning['fixable'] === true - && in_array($source, $GLOBALS['PHP_CODESNIFFER_FIXABLE_CODES'], true) === false - ) { - $GLOBALS['PHP_CODESNIFFER_FIXABLE_CODES'][] = $source; - } - } - - $allProblems[$line]['found_warnings'] = array_merge($foundWarningsTemp, $warningsTemp); - }//end foreach - - if (isset($expectedWarnings[$line]) === true) { - $allProblems[$line]['expected_warnings'] = $expectedWarnings[$line]; - } else { - $allProblems[$line]['expected_warnings'] = 0; - } - - unset($expectedWarnings[$line]); - }//end foreach - - foreach ($expectedWarnings as $line => $numWarnings) { - if (isset($allProblems[$line]) === false) { - $allProblems[$line] = [ - 'expected_errors' => 0, - 'expected_warnings' => 0, - 'found_errors' => [], - 'found_warnings' => [], - ]; - } - - $allProblems[$line]['expected_warnings'] = $numWarnings; - } - - // Order the messages by line number. - ksort($allProblems); - - foreach ($allProblems as $line => $problems) { - $numErrors = count($problems['found_errors']); - $numWarnings = count($problems['found_warnings']); - $expectedErrors = $problems['expected_errors']; - $expectedWarnings = $problems['expected_warnings']; - - $errors = ''; - $foundString = ''; - - if ($expectedErrors !== $numErrors || $expectedWarnings !== $numWarnings) { - $lineMessage = "[LINE $line]"; - $expectedMessage = 'Expected '; - $foundMessage = 'in '.basename($testFile).' but found '; - - if ($expectedErrors !== $numErrors) { - $expectedMessage .= "$expectedErrors error(s)"; - $foundMessage .= "$numErrors error(s)"; - if ($numErrors !== 0) { - $foundString .= 'error(s)'; - $errors .= implode(PHP_EOL.' -> ', $problems['found_errors']); - } - - if ($expectedWarnings !== $numWarnings) { - $expectedMessage .= ' and '; - $foundMessage .= ' and '; - if ($numWarnings !== 0) { - if ($foundString !== '') { - $foundString .= ' and '; - } - } - } - } - - if ($expectedWarnings !== $numWarnings) { - $expectedMessage .= "$expectedWarnings warning(s)"; - $foundMessage .= "$numWarnings warning(s)"; - if ($numWarnings !== 0) { - $foundString .= 'warning(s)'; - if (empty($errors) === false) { - $errors .= PHP_EOL.' -> '; - } - - $errors .= implode(PHP_EOL.' -> ', $problems['found_warnings']); - } - } - - $fullMessage = "$lineMessage $expectedMessage $foundMessage."; - if ($errors !== '') { - $fullMessage .= " The $foundString found were:".PHP_EOL." -> $errors"; - } - - $failureMessages[] = $fullMessage; - }//end if - }//end foreach - - return $failureMessages; - - }//end generateFailureMessages() - - - /** - * Get a list of CLI values to set before the file is tested. - * - * @param string $filename The name of the file being tested. - * @param \PHP_CodeSniffer\Config $config The config data for the run. - * - * @return void - */ - public function setCliValues($filename, $config) - { - - }//end setCliValues() - - - /** - * Returns the lines where errors should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of errors that should occur on that line. - * - * @return array - */ - abstract protected function getErrorList(); - - - /** - * Returns the lines where warnings should occur. - * - * The key of the array should represent the line number and the value - * should represent the number of warnings that should occur on that line. - * - * @return array - */ - abstract protected function getWarningList(); - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/Standards/AllSniffs.php b/vendor/squizlabs/php_codesniffer/tests/Standards/AllSniffs.php deleted file mode 100644 index 58b061a..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/Standards/AllSniffs.php +++ /dev/null @@ -1,114 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests\Standards; - -use PHP_CodeSniffer\Autoload; -use PHP_CodeSniffer\Util\Standards; -use PHPUnit\Framework\TestSuite; -use PHPUnit\TextUI\TestRunner; -use RecursiveDirectoryIterator; -use RecursiveIteratorIterator; - -class AllSniffs -{ - - - /** - * Prepare the test runner. - * - * @return void - */ - public static function main() - { - TestRunner::run(self::suite()); - - }//end main() - - - /** - * Add all sniff unit tests into a test suite. - * - * Sniff unit tests are found by recursing through the 'Tests' directory - * of each installed coding standard. - * - * @return \PHPUnit\Framework\TestSuite - */ - public static function suite() - { - $GLOBALS['PHP_CODESNIFFER_SNIFF_CODES'] = []; - $GLOBALS['PHP_CODESNIFFER_FIXABLE_CODES'] = []; - $GLOBALS['PHP_CODESNIFFER_SNIFF_CASE_FILES'] = []; - - $suite = new TestSuite('PHP CodeSniffer Standards'); - - // Optionally allow for ignoring the tests for one or more standards. - $ignoreTestsForStandards = getenv('PHPCS_IGNORE_TESTS'); - if ($ignoreTestsForStandards === false) { - $ignoreTestsForStandards = []; - } else { - $ignoreTestsForStandards = explode(',', $ignoreTestsForStandards); - } - - $installedStandards = self::getInstalledStandardDetails(); - - foreach ($installedStandards as $standard => $details) { - Autoload::addSearchPath($details['path'], $details['namespace']); - - if (in_array($standard, $ignoreTestsForStandards, true) === true) { - continue; - } - - $testsDir = $details['path'].DIRECTORY_SEPARATOR.'Tests'.DIRECTORY_SEPARATOR; - if (is_dir($testsDir) === false) { - // No tests for this standard. - continue; - } - - $di = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($testsDir)); - - foreach ($di as $file) { - // Skip hidden files. - if (substr($file->getFilename(), 0, 1) === '.') { - continue; - } - - // Tests must have the extension 'php'. - $parts = explode('.', $file); - $ext = array_pop($parts); - if ($ext !== 'php') { - continue; - } - - $className = Autoload::loadFile($file->getPathname()); - $GLOBALS['PHP_CODESNIFFER_STANDARD_DIRS'][$className] = $details['path']; - $GLOBALS['PHP_CODESNIFFER_TEST_DIRS'][$className] = $testsDir; - $suite->addTestSuite($className); - } - }//end foreach - - return $suite; - - }//end suite() - - - /** - * Get the details of all coding standards installed. - * - * @return array - * @see Standards::getInstalledStandardDetails() - */ - protected static function getInstalledStandardDetails() - { - return Standards::getInstalledStandardDetails(true); - - }//end getInstalledStandardDetails() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/TestSuite.php b/vendor/squizlabs/php_codesniffer/tests/TestSuite.php deleted file mode 100644 index be9b2f3..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/TestSuite.php +++ /dev/null @@ -1,35 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests; - -use PHPUnit\Framework\TestResult; -use PHPUnit\Framework\TestSuite as PHPUnit_TestSuite; - -class TestSuite extends PHPUnit_TestSuite -{ - - - /** - * Runs the tests and collects their result in a TestResult. - * - * @param \PHPUnit\Framework\TestResult $result A test result. - * - * @return \PHPUnit\Framework\TestResult - */ - public function run(TestResult $result=null) - { - $result = parent::run($result); - printPHPCodeSnifferTestOutput(); - return $result; - - }//end run() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/TestSuite7.php b/vendor/squizlabs/php_codesniffer/tests/TestSuite7.php deleted file mode 100644 index c628d1c..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/TestSuite7.php +++ /dev/null @@ -1,35 +0,0 @@ - - * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -namespace PHP_CodeSniffer\Tests; - -use PHPUnit\Framework\TestResult; -use PHPUnit\Framework\TestSuite as PHPUnit_TestSuite; - -class TestSuite extends PHPUnit_TestSuite -{ - - - /** - * Runs the tests and collects their result in a TestResult. - * - * @param \PHPUnit\Framework\TestResult|null $result A test result. - * - * @return \PHPUnit\Framework\TestResult - */ - public function run(?TestResult $result=null): TestResult - { - $result = parent::run($result); - printPHPCodeSnifferTestOutput(); - return $result; - - }//end run() - - -}//end class diff --git a/vendor/squizlabs/php_codesniffer/tests/bootstrap.php b/vendor/squizlabs/php_codesniffer/tests/bootstrap.php deleted file mode 100644 index 2b2f35a..0000000 --- a/vendor/squizlabs/php_codesniffer/tests/bootstrap.php +++ /dev/null @@ -1,99 +0,0 @@ - - * @copyright 2006-2017 Squiz Pty Ltd (ABN 77 084 670 600) - * @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/HEAD/licence.txt BSD Licence - */ - -if (defined('PHP_CODESNIFFER_IN_TESTS') === false) { - define('PHP_CODESNIFFER_IN_TESTS', true); -} - -/* - * Determine whether the test suite should be run in CBF mode. - * - * Use `` in a `phpunit.xml` file - * or set the ENV variable at an OS-level to enable CBF mode. - * - * To run the CBF specific tests, use the following command: - * vendor/bin/phpunit --group CBF --exclude-group nothing - * - * If the ENV variable has not been set, or is set to "false", the tests will run in CS mode. - */ - -if (defined('PHP_CODESNIFFER_CBF') === false) { - $cbfMode = getenv('PHP_CODESNIFFER_CBF'); - if ($cbfMode === '1') { - define('PHP_CODESNIFFER_CBF', true); - echo 'Note: Tests are running in "CBF" mode'.PHP_EOL.PHP_EOL; - } else { - define('PHP_CODESNIFFER_CBF', false); - echo 'Note: Tests are running in "CS" mode'.PHP_EOL.PHP_EOL; - } -} - -if (defined('PHP_CODESNIFFER_VERBOSITY') === false) { - define('PHP_CODESNIFFER_VERBOSITY', 0); -} - -require_once __DIR__.'/../autoload.php'; - -$tokens = new \PHP_CodeSniffer\Util\Tokens(); - -// Compatibility for PHPUnit < 6 and PHPUnit 6+. -if (class_exists('PHPUnit_Framework_TestSuite') === true && class_exists('PHPUnit\Framework\TestSuite') === false) { - class_alias('PHPUnit_Framework_TestSuite', 'PHPUnit'.'\Framework\TestSuite'); -} - -if (class_exists('PHPUnit_Framework_TestCase') === true && class_exists('PHPUnit\Framework\TestCase') === false) { - class_alias('PHPUnit_Framework_TestCase', 'PHPUnit'.'\Framework\TestCase'); -} - -if (class_exists('PHPUnit_TextUI_TestRunner') === true && class_exists('PHPUnit\TextUI\TestRunner') === false) { - class_alias('PHPUnit_TextUI_TestRunner', 'PHPUnit'.'\TextUI\TestRunner'); -} - -if (class_exists('PHPUnit_Framework_TestResult') === true && class_exists('PHPUnit\Framework\TestResult') === false) { - class_alias('PHPUnit_Framework_TestResult', 'PHPUnit'.'\Framework\TestResult'); -} - - -/** - * A global util function to help print unit test fixing data. - * - * @return void - */ -function printPHPCodeSnifferTestOutput() -{ - echo PHP_EOL.PHP_EOL; - - $output = 'The test files'; - $data = []; - - $codeCount = count($GLOBALS['PHP_CODESNIFFER_SNIFF_CODES']); - if (empty($GLOBALS['PHP_CODESNIFFER_SNIFF_CASE_FILES']) === false) { - $files = call_user_func_array('array_merge', $GLOBALS['PHP_CODESNIFFER_SNIFF_CASE_FILES']); - $files = array_unique($files); - $fileCount = count($files); - - $output = '%d sniff test files'; - $data[] = $fileCount; - } - - $output .= ' generated %d unique error codes'; - $data[] = $codeCount; - - if ($codeCount > 0) { - $fixes = count($GLOBALS['PHP_CODESNIFFER_FIXABLE_CODES']); - $percent = round(($fixes / $codeCount * 100), 2); - - $output .= '; %d were fixable (%d%%)'; - $data[] = $fixes; - $data[] = $percent; - } - - vprintf($output, $data); - -}//end printPHPCodeSnifferTestOutput() diff --git a/vendor/symfony/deprecation-contracts/CHANGELOG.md b/vendor/symfony/deprecation-contracts/CHANGELOG.md deleted file mode 100644 index 7932e26..0000000 --- a/vendor/symfony/deprecation-contracts/CHANGELOG.md +++ /dev/null @@ -1,5 +0,0 @@ -CHANGELOG -========= - -The changelog is maintained for all Symfony contracts at the following URL: -https://github.com/symfony/contracts/blob/main/CHANGELOG.md diff --git a/vendor/symfony/deprecation-contracts/README.md b/vendor/symfony/deprecation-contracts/README.md deleted file mode 100644 index 9814864..0000000 --- a/vendor/symfony/deprecation-contracts/README.md +++ /dev/null @@ -1,26 +0,0 @@ -Symfony Deprecation Contracts -============================= - -A generic function and convention to trigger deprecation notices. - -This package provides a single global function named `trigger_deprecation()` that triggers silenced deprecation notices. - -By using a custom PHP error handler such as the one provided by the Symfony ErrorHandler component, -the triggered deprecations can be caught and logged for later discovery, both on dev and prod environments. - -The function requires at least 3 arguments: - - the name of the Composer package that is triggering the deprecation - - the version of the package that introduced the deprecation - - the message of the deprecation - - more arguments can be provided: they will be inserted in the message using `printf()` formatting - -Example: -```php -trigger_deprecation('symfony/blockchain', '8.9', 'Using "%s" is deprecated, use "%s" instead.', 'bitcoin', 'fabcoin'); -``` - -This will generate the following message: -`Since symfony/blockchain 8.9: Using "bitcoin" is deprecated, use "fabcoin" instead.` - -While not recommended, the deprecation notices can be completely ignored by declaring an empty -`function trigger_deprecation() {}` in your application. diff --git a/vendor/symfony/deprecation-contracts/composer.json b/vendor/symfony/deprecation-contracts/composer.json deleted file mode 100644 index 5533b5c..0000000 --- a/vendor/symfony/deprecation-contracts/composer.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "symfony/deprecation-contracts", - "type": "library", - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=8.1" - }, - "autoload": { - "files": [ - "function.php" - ] - }, - "minimum-stability": "dev", - "extra": { - "branch-alias": { - "dev-main": "3.6-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - } -} diff --git a/vendor/symfony/polyfill-php80/README.md b/vendor/symfony/polyfill-php80/README.md deleted file mode 100644 index 3816c55..0000000 --- a/vendor/symfony/polyfill-php80/README.md +++ /dev/null @@ -1,25 +0,0 @@ -Symfony Polyfill / Php80 -======================== - -This component provides features added to PHP 8.0 core: - -- [`Stringable`](https://php.net/stringable) interface -- [`fdiv`](https://php.net/fdiv) -- [`ValueError`](https://php.net/valueerror) class -- [`UnhandledMatchError`](https://php.net/unhandledmatcherror) class -- `FILTER_VALIDATE_BOOL` constant -- [`get_debug_type`](https://php.net/get_debug_type) -- [`PhpToken`](https://php.net/phptoken) class -- [`preg_last_error_msg`](https://php.net/preg_last_error_msg) -- [`str_contains`](https://php.net/str_contains) -- [`str_starts_with`](https://php.net/str_starts_with) -- [`str_ends_with`](https://php.net/str_ends_with) -- [`get_resource_id`](https://php.net/get_resource_id) - -More information can be found in the -[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md). - -License -======= - -This library is released under the [MIT license](LICENSE). diff --git a/vendor/symfony/polyfill-php80/composer.json b/vendor/symfony/polyfill-php80/composer.json deleted file mode 100644 index a503b03..0000000 --- a/vendor/symfony/polyfill-php80/composer.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "symfony/polyfill-php80", - "type": "library", - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "keywords": ["polyfill", "shim", "compatibility", "portable"], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.2" - }, - "autoload": { - "psr-4": { "Symfony\\Polyfill\\Php80\\": "" }, - "files": [ "bootstrap.php" ], - "classmap": [ "Resources/stubs" ] - }, - "minimum-stability": "dev", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - } -} diff --git a/vendor/theseer/tokenizer/CHANGELOG.md b/vendor/theseer/tokenizer/CHANGELOG.md deleted file mode 100644 index d867649..0000000 --- a/vendor/theseer/tokenizer/CHANGELOG.md +++ /dev/null @@ -1,87 +0,0 @@ -# Changelog - -All notable changes to Tokenizer are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. - -## [1.2.3] - 2024-03-03 - -### Changed - -* Do not use implicitly nullable parameters - -## [1.2.2] - 2023-11-20 - -### Fixed - -* [#18](https://github.com/theseer/tokenizer/issues/18): Tokenizer fails on protobuf metadata files - - -## [1.2.1] - 2021-07-28 - -### Fixed - -* [#13](https://github.com/theseer/tokenizer/issues/13): Fatal error when tokenizing files that contain only a single empty line - - -## [1.2.0] - 2020-07-13 - -This release is now PHP 8.0 compliant. - -### Fixed - -* Whitespace handling in general (only noticable in the intermediate `TokenCollection`) is now consitent - -### Changed - -* Updated `Tokenizer` to deal with changed whitespace handling in PHP 8.0 - The XMLSerializer was unaffected. - - -## [1.1.3] - 2019-06-14 - -### Changed - -* Ensure XMLSerializer can deal with empty token collections - -### Fixed - -* [#2](https://github.com/theseer/tokenizer/issues/2): Fatal error in infection / phpunit - - -## [1.1.2] - 2019-04-04 - -### Changed - -* Reverted PHPUnit 8 test update to stay PHP 7.0 compliant - - -## [1.1.1] - 2019-04-03 - -### Fixed - -* [#1](https://github.com/theseer/tokenizer/issues/1): Empty file causes invalid array read - -### Changed - -* Tests should now be PHPUnit 8 compliant - - -## [1.1.0] - 2017-04-07 - -### Added - -* Allow use of custom namespace for XML serialization - - -## [1.0.0] - 2017-04-05 - -Initial Release - -[1.2.3]: https://github.com/theseer/tokenizer/compare/1.2.2...1.2.3 -[1.2.2]: https://github.com/theseer/tokenizer/compare/1.2.1...1.2.2 -[1.2.1]: https://github.com/theseer/tokenizer/compare/1.2.0...1.2.1 -[1.2.0]: https://github.com/theseer/tokenizer/compare/1.1.3...1.2.0 -[1.1.3]: https://github.com/theseer/tokenizer/compare/1.1.2...1.1.3 -[1.1.2]: https://github.com/theseer/tokenizer/compare/1.1.1...1.1.2 -[1.1.1]: https://github.com/theseer/tokenizer/compare/1.1.0...1.1.1 -[1.1.0]: https://github.com/theseer/tokenizer/compare/1.0.0...1.1.0 -[1.0.0]: https://github.com/theseer/tokenizer/compare/b2493e57de80c1b7414219b28503fa5c6b4d0a98...1.0.0 diff --git a/vendor/theseer/tokenizer/LICENSE b/vendor/theseer/tokenizer/LICENSE deleted file mode 100644 index e9694ad..0000000 --- a/vendor/theseer/tokenizer/LICENSE +++ /dev/null @@ -1,30 +0,0 @@ -Tokenizer - -Copyright (c) 2017 Arne Blankerts and contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of Arne Blankerts nor the names of contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT * NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, -OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/theseer/tokenizer/README.md b/vendor/theseer/tokenizer/README.md deleted file mode 100644 index a5f891b..0000000 --- a/vendor/theseer/tokenizer/README.md +++ /dev/null @@ -1,47 +0,0 @@ -# Tokenizer - -A small library for converting tokenized PHP source code into XML. - -[![Test](https://github.com/theseer/tokenizer/actions/workflows/ci.yml/badge.svg)](https://github.com/theseer/tokenizer/actions/workflows/ci.yml) - -## Installation - -You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - - composer require theseer/tokenizer - -If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - - composer require --dev theseer/tokenizer - -## Usage examples - -```php -$tokenizer = new TheSeer\Tokenizer\Tokenizer(); -$tokens = $tokenizer->parse(file_get_contents(__DIR__ . '/src/XMLSerializer.php')); - -$serializer = new TheSeer\Tokenizer\XMLSerializer(); -$xml = $serializer->toXML($tokens); - -echo $xml; -``` - -The generated XML structure looks something like this: - -```xml - - - - <?php - declare - ( - strict_types - - = - - 1 - ) - ; - - -``` diff --git a/vendor/theseer/tokenizer/composer.json b/vendor/theseer/tokenizer/composer.json deleted file mode 100644 index 3f452a9..0000000 --- a/vendor/theseer/tokenizer/composer.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "theseer/tokenizer", - "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - } - ], - "support": { - "issues": "https://github.com/theseer/tokenizer/issues" - }, - "require": { - "php": "^7.2 || ^8.0", - "ext-xmlwriter": "*", - "ext-dom": "*", - "ext-tokenizer": "*" - }, - "autoload": { - "classmap": [ - "src/" - ] - } -} - diff --git a/vendor/theseer/tokenizer/composer.lock b/vendor/theseer/tokenizer/composer.lock deleted file mode 100644 index 07fba9b..0000000 --- a/vendor/theseer/tokenizer/composer.lock +++ /dev/null @@ -1,22 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "b010f1b3d9d47d431ee1cb54ac1de755", - "packages": [], - "packages-dev": [], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": "^7.2 || ^8.0", - "ext-xmlwriter": "*", - "ext-dom": "*", - "ext-tokenizer": "*" - }, - "platform-dev": [] -} diff --git a/vendor/theseer/tokenizer/src/Exception.php b/vendor/theseer/tokenizer/src/Exception.php deleted file mode 100644 index 71fc117..0000000 --- a/vendor/theseer/tokenizer/src/Exception.php +++ /dev/null @@ -1,5 +0,0 @@ -ensureValidUri($value); - $this->value = $value; - } - - public function asString(): string { - return $this->value; - } - - private function ensureValidUri($value): void { - if (\strpos($value, ':') === false) { - throw new NamespaceUriException( - \sprintf("Namespace URI '%s' must contain at least one colon", $value) - ); - } - } -} diff --git a/vendor/theseer/tokenizer/src/NamespaceUriException.php b/vendor/theseer/tokenizer/src/NamespaceUriException.php deleted file mode 100644 index ab1c48d..0000000 --- a/vendor/theseer/tokenizer/src/NamespaceUriException.php +++ /dev/null @@ -1,5 +0,0 @@ -line = $line; - $this->name = $name; - $this->value = $value; - } - - public function getLine(): int { - return $this->line; - } - - public function getName(): string { - return $this->name; - } - - public function getValue(): string { - return $this->value; - } -} diff --git a/vendor/theseer/tokenizer/src/TokenCollection.php b/vendor/theseer/tokenizer/src/TokenCollection.php deleted file mode 100644 index 2bfc857..0000000 --- a/vendor/theseer/tokenizer/src/TokenCollection.php +++ /dev/null @@ -1,82 +0,0 @@ - - */ -class TokenCollection implements IteratorAggregate, ArrayAccess, Countable { - - /** @var Token[] */ - private $tokens = []; - - public function addToken(Token $token): void { - $this->tokens[] = $token; - } - - public function getIterator(): Iterator - { - return new ArrayIterator($this->tokens); - } - - public function count(): int { - return \count($this->tokens); - } - - public function offsetExists($offset): bool { - return isset($this->tokens[$offset]); - } - - /** - * @throws TokenCollectionException - */ - public function offsetGet($offset): Token { - if (!$this->offsetExists($offset)) { - throw new TokenCollectionException( - \sprintf('No Token at offest %s', $offset) - ); - } - - return $this->tokens[$offset]; - } - - /** - * @param Token $value - * - * @throws TokenCollectionException - */ - public function offsetSet($offset, $value): void { - if (!\is_int($offset)) { - $type = \gettype($offset); - - throw new TokenCollectionException( - \sprintf( - 'Offset must be of type integer, %s given', - $type === 'object' ? \get_class($value) : $type - ) - ); - } - - if (!$value instanceof Token) { - $type = \gettype($value); - - throw new TokenCollectionException( - \sprintf( - 'Value must be of type %s, %s given', - Token::class, - $type === 'object' ? \get_class($value) : $type - ) - ); - } - $this->tokens[$offset] = $value; - } - - public function offsetUnset($offset): void { - unset($this->tokens[$offset]); - } -} diff --git a/vendor/theseer/tokenizer/src/TokenCollectionException.php b/vendor/theseer/tokenizer/src/TokenCollectionException.php deleted file mode 100644 index 4291ce0..0000000 --- a/vendor/theseer/tokenizer/src/TokenCollectionException.php +++ /dev/null @@ -1,5 +0,0 @@ - 'T_OPEN_BRACKET', - ')' => 'T_CLOSE_BRACKET', - '[' => 'T_OPEN_SQUARE', - ']' => 'T_CLOSE_SQUARE', - '{' => 'T_OPEN_CURLY', - '}' => 'T_CLOSE_CURLY', - ';' => 'T_SEMICOLON', - '.' => 'T_DOT', - ',' => 'T_COMMA', - '=' => 'T_EQUAL', - '<' => 'T_LT', - '>' => 'T_GT', - '+' => 'T_PLUS', - '-' => 'T_MINUS', - '*' => 'T_MULT', - '/' => 'T_DIV', - '?' => 'T_QUESTION_MARK', - '!' => 'T_EXCLAMATION_MARK', - ':' => 'T_COLON', - '"' => 'T_DOUBLE_QUOTES', - '@' => 'T_AT', - '&' => 'T_AMPERSAND', - '%' => 'T_PERCENT', - '|' => 'T_PIPE', - '$' => 'T_DOLLAR', - '^' => 'T_CARET', - '~' => 'T_TILDE', - '`' => 'T_BACKTICK' - ]; - - public function parse(string $source): TokenCollection { - $result = new TokenCollection(); - - if ($source === '') { - return $result; - } - - $tokens = \token_get_all($source); - - $lastToken = new Token( - $tokens[0][2], - 'Placeholder', - '' - ); - - foreach ($tokens as $pos => $tok) { - if (\is_string($tok)) { - $token = new Token( - $lastToken->getLine(), - self::MAP[$tok], - $tok - ); - $result->addToken($token); - $lastToken = $token; - - continue; - } - - $line = $tok[2]; - $values = \preg_split('/\R+/Uu', $tok[1]); - - if (!$values) { - $result->addToken( - new Token( - $line, - \token_name($tok[0]), - '{binary data}' - ) - ); - - continue; - } - - foreach ($values as $v) { - $token = new Token( - $line, - \token_name($tok[0]), - $v - ); - $lastToken = $token; - $line++; - - if ($v === '') { - continue; - } - - $result->addToken($token); - } - } - - return $this->fillBlanks($result, $lastToken->getLine()); - } - - private function fillBlanks(TokenCollection $tokens, int $maxLine): TokenCollection { - $prev = new Token( - 0, - 'Placeholder', - '' - ); - - $final = new TokenCollection(); - $prevLine = $prev->getLine(); - - foreach ($tokens as $token) { - $line = $token->getLine(); - $gap = $line - $prevLine; - - while ($gap > 1) { - $linebreak = new Token( - $prevLine + 1, - 'T_WHITESPACE', - '' - ); - $final->addToken($linebreak); - $prevLine = $linebreak->getLine(); - $gap--; - } - - $final->addToken($token); - $prevLine = $line; - } - - $gap = $maxLine - $prevLine; - - while ($gap > 0) { - $linebreak = new Token( - $prevLine + 1, - 'T_WHITESPACE', - '' - ); - $final->addToken($linebreak); - $prevLine = $linebreak->getLine(); - $gap--; - } - - return $final; - } -} \ No newline at end of file diff --git a/vendor/theseer/tokenizer/src/XMLSerializer.php b/vendor/theseer/tokenizer/src/XMLSerializer.php deleted file mode 100644 index 3f477b5..0000000 --- a/vendor/theseer/tokenizer/src/XMLSerializer.php +++ /dev/null @@ -1,74 +0,0 @@ -xmlns = $xmlns; - } - - public function toDom(TokenCollection $tokens): DOMDocument { - $dom = new DOMDocument(); - $dom->preserveWhiteSpace = false; - $dom->loadXML($this->toXML($tokens)); - - return $dom; - } - - public function toXML(TokenCollection $tokens): string { - $writer = new \XMLWriter(); - $writer->openMemory(); - $writer->setIndent(true); - $writer->startDocument(); - $writer->startElement('source'); - $writer->writeAttribute('xmlns', $this->xmlns->asString()); - - if (\count($tokens) > 0) { - $writer->startElement('line'); - $writer->writeAttribute('no', '1'); - - $iterator = $tokens->getIterator(); - $previousToken = $iterator->current(); - $previousLine = $previousToken->getLine(); - - foreach ($iterator as $token) { - $line = $token->getLine(); - if ($previousLine < $line) { - $writer->endElement(); - - $writer->startElement('line'); - $writer->writeAttribute('no', (string)$line); - $previousLine = $line; - } - - $value = $token->getValue(); - if ($value !== '') { - $writer->startElement('token'); - $writer->writeAttribute('name', $token->getName()); - $writer->writeRaw(\htmlspecialchars($value, \ENT_NOQUOTES | \ENT_DISALLOWED | \ENT_XML1)); - $writer->endElement(); - } - } - - $writer->endElement(); - } - - $writer->endElement(); - $writer->endDocument(); - - return $writer->outputMemory(); - } -} diff --git a/vendor/wp-coding-standards/wpcs/CHANGELOG.md b/vendor/wp-coding-standards/wpcs/CHANGELOG.md deleted file mode 100644 index d08d7fb..0000000 --- a/vendor/wp-coding-standards/wpcs/CHANGELOG.md +++ /dev/null @@ -1,1777 +0,0 @@ -# Change Log for WordPress Coding Standards - -All notable changes to this project will be documented in this file. - -This projects adheres to [Semantic Versioning](https://semver.org/) and [Keep a CHANGELOG](https://keepachangelog.com/). - -## [Unreleased] - -_No documentation available about unreleased changes as of yet._ - -## [3.3.0] - 2025-11-25 - -### Added -- Support for attributes on anonymous classes (PHP 8.0) and `readonly` anonymous classes (PHP 8.3) to the `WordPress.Security.EscapeOutput` sniff. Props [@rodrigoprimo]. [#2559] -- Support for handling "exit as a function call" (PHP 8.4) to the `WordPress.Security.EscapeOutput` sniff. [#2563] -- WordPress-Extra: the following sniffs have been added to the ruleset: `Universal.Attributes.BracketSpacing` and `Universal.Attributes.DisallowAttributeParentheses`. [#2646] - -### Changed -- The minimum supported PHP version is now PHP 7.2 (was PHP 5.4). [#2614] -- The minimum required `PHP_CodeSniffer` version to 3.13.4 (was 3.13.0). [#2630] -- The minimum required `PHPCSExtra` version to 1.5.0 (was 1.4.0). [#2646] -- The default value for `minimum_wp_version`, as used by a [number of sniffs detecting usage of deprecated WP features](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Customizable-sniff-properties#various-sniffs-set-the-minimum-supported-wp-version), has been updated to `6.6`. [#2656] -- `WordPress.DB.DirectDatabaseQuery` will now recognize more caching functions, like the `wp_cache_*_multiple()` functions as added in WordPress 6.0 and the `wp_cache_*_salted()` functions as added in WordPress 6.9. [#2654] -- `WordPress.NamingConventions.PrefixAllGlobals` has been updated to recognize pluggable functions introduced in WP up to WP 6.9.0. [#2652] -- `WordPress.WP.ClassNameCase` has been updated to recognize classes introduced in WP up to WP 6.9.0. [#2652] -- `WordPress.WP.DeprecatedFunctions` now detects functions deprecated in WordPress up to WP 6.9.0. [#2652] -- `WordPress.WP.DeprecatedParameters` now detects parameters deprecated in WordPress up to WP 6.9.0. [#2652] -- `WordPress.Security.ValidatedSanitizedInput`: improved the clarity of the error message for the `InputNotValidated` error code. Props [@rodrigoprimo]. [#2642] -- README: updated `testVersion` recommendations for PHPCompatibility. Props [@johnjago]. [#2471] -- Example ruleset: updated the `minimum_wp_version` and `testVersion` recommendations. [#2608] -- All sniffs are now also being tested against PHP 8.5 for consistent sniff results. [#2649] -- Various housekeeping, including documentation and test improvements. Includes contributions by [@rodrigoprimo]. - -### Deprecated -- The WordPress.PHP.POSIXFunctions sniff (as it is no longer relevant). [#2616] - -### Removed -- `wp_kses_allowed_html()` from the list of escaping functions. [#2566] - This affects the `WordPress.Security.EscapeOutput` sniff. - -### Fixed -- `WordPress.DB.DirectDatabaseQuery`: false positive when function call to caching functions did not use the canonical function name. Props [@rodrigoprimo]. [#2613] -- `WordPress.DB.DirectDatabaseQuery`: potential false negative when a class property or constant would mirror the name of one of the caching functions. Props [@rodrigoprimo]. [#2615] -- `WordPress.DB.PreparedSQL`: false positive for correctly escaped SQL snippets when the function call did not use the canonical function name. Props [@rodrigoprimo]. [#2570] -- `WordPress.DB.PreparedSQLPlaceholders`: improved handling of fully qualified calls to global functions. Props [@rodrigoprimo]. [#2569] -- `WordPress.Security.EscapeOutput`: expanded protection against false positives for `*::class`. Props [@rodrigoprimo]. [#2605] -- `WordPress.Security.NonceVerification`: false positive when nonce checking function call did not use the canonical function name. Props [@rodrigoprimo]. [#2572] -- `WordPress.WP.EnqueuedResourceParameters`: the sniff could cause a PHP 8.5 deprecation notice if the _code under scan_ contained one of the deprecated type casts. [#2573] -- `WordPress.WP.EnqueuedResourceParameters`: improved recognition of non-lowercase and fully qualified `true`/`false`/`null` when passed as the `$ver` parameter value. Props [@rodrigoprimo]. [#2630] - -[#2471]: https://github.com/WordPress/WordPress-Coding-Standards/pull/2471 -[#2559]: https://github.com/WordPress/WordPress-Coding-Standards/pull/2559 -[#2563]: https://github.com/WordPress/WordPress-Coding-Standards/pull/2563 -[#2566]: https://github.com/WordPress/WordPress-Coding-Standards/pull/2566 -[#2569]: https://github.com/WordPress/WordPress-Coding-Standards/pull/2569 -[#2570]: https://github.com/WordPress/WordPress-Coding-Standards/pull/2570 -[#2572]: https://github.com/WordPress/WordPress-Coding-Standards/pull/2572 -[#2573]: https://github.com/WordPress/WordPress-Coding-Standards/pull/2573 -[#2605]: https://github.com/WordPress/WordPress-Coding-Standards/pull/2605 -[#2608]: https://github.com/WordPress/WordPress-Coding-Standards/pull/2608 -[#2613]: https://github.com/WordPress/WordPress-Coding-Standards/pull/2613 -[#2614]: https://github.com/WordPress/WordPress-Coding-Standards/pull/2614 -[#2615]: https://github.com/WordPress/WordPress-Coding-Standards/pull/2615 -[#2616]: https://github.com/WordPress/WordPress-Coding-Standards/pull/2616 -[#2630]: https://github.com/WordPress/WordPress-Coding-Standards/pull/2630 -[#2642]: https://github.com/WordPress/WordPress-Coding-Standards/pull/2642 -[#2646]: https://github.com/WordPress/WordPress-Coding-Standards/pull/2646 -[#2649]: https://github.com/WordPress/WordPress-Coding-Standards/pull/2649 -[#2652]: https://github.com/WordPress/WordPress-Coding-Standards/pull/2652 -[#2654]: https://github.com/WordPress/WordPress-Coding-Standards/pull/2654 -[#2656]: https://github.com/WordPress/WordPress-Coding-Standards/pull/2656 - - -## [3.2.0] - 2025-07-24 - -### Added -- New `WordPress.WP.GetMetaSingle` sniff to the `WordPress-Extra` ruleset. Props [@rodrigoprimo]! [#2465] - This sniff warns when `get_*_meta()` and `get_metadata*()` functions are used with the `$meta_key`/`$key` param, but without the `$single` parameter as this could lead to unexpected behavior due to the different return types. -- `WordPress-Extra`: the following additional sniffs have been added to the ruleset: `Generic.Strings.UnnecessaryHeredoc` and `Generic.WhiteSpace.HereNowdocIdentifierSpacing`. [#2534] -- The `rest_sanitize_boolean()` functions to the list of known "sanitizing" functions. Props [@westonruter]. [#2530] -- End-user documentation to the following existing sniffs: `WordPress.DB.PreparedSQL` (props [@jaymcp], [#2454]), `WordPress.NamingConventions.ValidFunctionName` (props [@richardkorthuis] and [@rodrigoprimo], [#2452], [#2531]), `WordPress.NamingConventions.ValidVariableName` (props [@richardkorthuis], [#2457]), `WordPress.PHP.DontExtract` (props [@aiolachiara], [#2456]). - This documentation can be exposed via the [`PHP_CodeSniffer` `--generator=...` command-line argument](https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki/Usage). - -### Changed -- The minimum required `PHP_CodeSniffer` version to 3.13.0 (was 3.9.0). [#2532] -- The minimum required `PHPCSUtils` version to 1.1.0 (was 1.0.10). [#2532] -- The minimum required `PHPCSExtra` version to 1.4.0 (was 1.2.1). [#2532] -- Sniffs based on the `AbstractFunctionParameterSniff` will now call a dedicated `process_first_class_callable()` method for PHP 8.1+ first class callables. Props [@rodrigoprimo], [@jrfnl]. [#2518], [#2544] - By default, the method won't do anything, but individual sniffs extending the `AbstractFunctionParameterSniff` class can choose to implement the method to handle first class callables. - Previously, first class callables were treated as a function call without parameters and would trigger the `process_no_parameters()` method. -- The minimum required prefix length for the `WordPress.NamingConventions.PrefixAllGlobals` sniff has been changed from 3 to 4 characters. Props [@davidperezgar]. [#2479] -- The default value for `minimum_wp_version`, as used by a [number of sniffs detecting usage of deprecated WP features](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Customizable-sniff-properties#various-sniffs-set-the-minimum-supported-wp-version), has been updated to `6.5`. [#2553] -- `WordPress.NamingConventions.ValidVariableName` now allows for PHP 8.4 properties in interfaces. [#2532] -- `WordPress.NamingConventions.PrefixAllGlobals` has been updated to recognize pluggable functions introduced in WP up to WP 6.8.1. [#2537] -- `WordPress.WP.Capabilities` has been updated to recognize new capabilities introduced in WP up to WP 6.8.1. [#2537] -- `WordPress.WP.ClassNameCase` has been updated to recognize classes introduced in WP up to WP 6.8.1. [#2537] -- `WordPress.WP.DeprecatedFunctions` now detects functions deprecated in WordPress up to WP 6.8.1. [#2537] -- `WordPress.WP.DeprecatedParameters` now detects parameters deprecated in WordPress up to WP 6.8.1. [#2537] -- `WordPress.WP.DeprecatedParameterValues` now detects parameter values deprecated in WordPress up to WP 6.8.1. [#2537] -- Minor performance improvements. -- Developer happiness: prevent creating a `composer.lock` file. Thanks [@fredden]! [#2443] -- Various housekeeping, including documentation and test improvements. Includes contributions by [@rodrigoprimo] and [@szepeviktor]. -- All sniffs are now also being tested against PHP 8.4 for consistent sniff results. [#2511] - -### Removed -- The `Generic.Functions.CallTimePassByReference` has been removed from the `WordPress-Extra` ruleset. Props [@rodrigoprimo]. [#2536] - This sniff was dated anyway and deprecated in PHP_CodeSniffer. If you need to check if your code is PHP cross-version compatible, use the [PHPCompatibility] standard instead. - -### Fixed -- Sniffs based on the `AbstractClassRestrictionsSniff` could previously run into a PHPCS `Internal.Exception`, leading to fixes not being made. [#2500] -- Sniffs based on the `AbstractFunctionParameterSniff` will now bow out more often when it is sure the code under scan is not calling the target function and during live coding, preventing false positives. Props [@rodrigoprimo]. [#2518] - -[#2443]: https://github.com/WordPress/WordPress-Coding-Standards/pull/2443 -[#2465]: https://github.com/WordPress/WordPress-Coding-Standards/pull/2465 -[#2452]: https://github.com/WordPress/WordPress-Coding-Standards/pull/2452 -[#2454]: https://github.com/WordPress/WordPress-Coding-Standards/pull/2454 -[#2456]: https://github.com/WordPress/WordPress-Coding-Standards/pull/2456 -[#2457]: https://github.com/WordPress/WordPress-Coding-Standards/pull/2457 -[#2479]: https://github.com/WordPress/WordPress-Coding-Standards/pull/2479 -[#2500]: https://github.com/WordPress/WordPress-Coding-Standards/pull/2500 -[#2511]: https://github.com/WordPress/WordPress-Coding-Standards/pull/2511 -[#2518]: https://github.com/WordPress/WordPress-Coding-Standards/pull/2518 -[#2530]: https://github.com/WordPress/WordPress-Coding-Standards/pull/2530 -[#2531]: https://github.com/WordPress/WordPress-Coding-Standards/pull/2531 -[#2532]: https://github.com/WordPress/WordPress-Coding-Standards/pull/2532 -[#2534]: https://github.com/WordPress/WordPress-Coding-Standards/pull/2534 -[#2536]: https://github.com/WordPress/WordPress-Coding-Standards/pull/2536 -[#2537]: https://github.com/WordPress/WordPress-Coding-Standards/pull/2537 -[#2544]: https://github.com/WordPress/WordPress-Coding-Standards/pull/2544 -[#2553]: https://github.com/WordPress/WordPress-Coding-Standards/pull/2553 - - -## [3.1.0] - 2024-03-25 - -### Added -- WordPress-Core ruleset: now includes the `Universal.PHP.LowercasePHPTag` sniff. -- WordPress-Extra ruleset: now includes the `Generic.CodeAnalysis.RequireExplicitBooleanOperatorPrecedence` and the `Universal.CodeAnalysis.NoDoubleNegative` sniffs. -- The `sanitize_locale_name()` function to the list of known "escaping" functions. Props [@Chouby] -- The `sanitize_locale_name()` function to the list of known "sanitize & unslash" functions. Props [@Chouby] - -### Changed -- The minimum required `PHP_CodeSniffer` version to 3.9.0 (was 3.7.2). -- The minimum required `PHPCSUtils` version to 1.0.10 (was 1.0.8). -- The minimum required `PHPCSExtra` version to 1.2.1 (was 1.1.0). - Please ensure you run `composer update wp-coding-standards/wpcs --with-dependencies` to benefit from these updates. -- Core ruleset: the spacing after the `use` keyword for closure `use` statements will now consistently be checked. Props [@westonruter] for reporting. -- The default value for `minimum_wp_version`, as used by a [number of sniffs detecting usage of deprecated WP features](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Customizable-sniff-properties#various-sniffs-set-the-minimum-supported-wp-version), has been updated to `6.2`. -- `WordPress.NamingConventions.PrefixAllGlobals` has been updated to recognize pluggable functions introduced in WP 6.4 and 6.5. -- `WordPress.NamingConventions.ValidPostTypeSlug` has been updated to recognize reserved post types introduced in WP 6.4 and 6.5. -- `WordPress.WP.ClassNameCase` has been updated to recognize classes introduced in WP 6.4 and 6.5. -- `WordPress.WP.DeprecatedClasses` now detects classes deprecated in WordPress up to WP 6.5. -- `WordPress.WP.DeprecatedFunctions` now detects functions deprecated in WordPress up to WP 6.5. -- The `IsUnitTestTrait` will now recognize classes which extend the new WP Core `WP_Font_Face_UnitTestCase` class as test classes. -- The test suite can now run on PHPUnit 4.x - 9.x (was 4.x - 7.x), which should make contributing more straight forward. -- Various housekeeping, includes a contribution from [@rodrigoprimo]. - -### Fixed -- `WordPress.WP.PostsPerPage` could potentially result in an `Internal.Exception` when encountering a query string which doesn't include the value for `posts_per_page` in the query string. Props [@anomiex] for reporting. - - -## [3.0.1] - 2023-09-14 - -### Added -- In WordPressCS 3.0.0, the functionality of the `WordPress.Security.EscapeOutput` sniff was updated to report unescaped message parameters passed to exceptions created in `throw` statements. This specific violation now has a separate error code: `ExceptionNotEscaped`. This will allow users to ignore or exclude that specific error code. Props [@anomiex]. - The error code(s) for other escaping issues flagged by the sniff remain unchanged. - -### Changed -- Updated the CI workflow to test the example ruleset for issues. -- Funding files and updates in the Readme about funding the project. - -### Fixed -- Fixed a sniff name in the `phpcs.xml.dist.sample` file (case-sensitive sniff name). Props [@dawidurbanski]. - - -## [3.0.0] - 2023-08-21 - -### Important information about this release: - -At long last... WordPressCS 3.0.0 is here. - -This is an important release which makes significant changes to improve the accuracy, performance, stability and maintainability of all sniffs, as well as making WordPressCS much better at handling modern PHP. - -WordPressCS 3.0.0 contains breaking changes, both for people using ignore annotations, people maintaining custom rulesets, as well as for sniff developers who maintain a custom PHPCS standard based on WordPressCS. - -If you are an end-user or maintain a custom WordPressCS based ruleset, please start by reading the [Upgrade Guide to WordPressCS 3.0.0 for end-users](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Upgrade-Guide-to-WordPressCS-3.0.0-for-end-users) which lists the most important changes and contains a step by step guide for upgrading. - -If you are a maintainer of an external standard based on WordPressCS and any of your custom sniffs are based on or extend WordPressCS sniffs, please read the [Upgrade Guide to WordPressCS 3.0.0 for Developers](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Upgrade-Guide-to-WordPressCS-3.0.0-for-Developers-of-external-standards). - -In all cases, please read the complete changelog carefully before you upgrade. - - -### Added -- Dependencies on the following packages: [PHPCSUtils](https://phpcsutils.com/), [PHPCSExtra](https://github.com/PHPCSStandards/PHPCSExtra) and the [Composer PHPCS plugin]. -- A best effort has been made to add support for the new PHP syntaxes/features to all WordPressCS native sniffs and utility functions (or to verify/improve existing support). - While support in external sniffs used by WordPressCS has not be exhaustively verified, a lot of work has been done to try and add support for new PHP syntaxes to those as well. - WordPressCS native sniffs and utilities have received fixes for the following syntaxes: - * PHP 7.2 - - Keyed lists. - * PHP 7.3 - - Flexible heredoc/nowdoc (providing the PHPCS scan is run on PHP 7.3 or higher). - - Trailing commas in function calls. - * PHP 7.4 - - Arrow functions. - - Array unpacking in array expressions. - - Numeric literals with underscores. - - Typed properties. - - Null coalesce equals operator. - * PHP 8.0 - - Nullsafe object operators. - - Match expressions. - - Named arguments in function calls. - - Attributes. - - Union types // including supporting the `false` and `null` types. - - Constructor property promotion. - - `$object::class` - - Throw as an expression. - * PHP 8.1 - - Enumerations. - - Explicit octal notation. - - Final class constants - - First class callables. - - Intersection types. - * PHP 8.2 - - Constants in traits. -- New `WordPress.CodeAnalysis.AssignmentInTernaryCondition` sniff to the `WordPress-Core` ruleset which partially replaces the removed `WordPress.CodeAnalysis.AssignmentInCondition` sniff. -- New `WordPress.WhiteSpace.ObjectOperatorSpacing` sniff which replaces the use of the `Squiz.WhiteSpace.ObjectOperatorSpacing` sniff in the `WordPress-Core` ruleset. -- New `WordPress.WP.ClassNameCase` sniff to the `WordPress-Core` ruleset, to check that any class name references to WP native classes and classes from external dependencies use the case of the class as per the class declaration. -- New `WordPress.WP.Capabilities` sniff to the `WordPress-Extra` ruleset. This sniff checks that valid capabilities are used, not roles or user levels. Props, amongst others, to [@grappler] and [@khacoder]. - Custom capabilities can be added to the sniff via a `custom_capabilities` ruleset property. - The sniff also supports the `minimum_wp_version` property to allow the sniff to accurately determine how the use of deprecated capabilities should be flagged. -- The `WordPress.WP.CapitalPDangit` sniff contains a new check to verify the correct spelling of `WordPress` in namespace names. -- The `WordPress.WP.I18n` sniff contains a new `EmptyTextDomain` error code for an empty text string being passed as the text domain, which overrules the default value of the parameter and renders a text untranslatable. -- The `WordPress.DB.PreparedSQLPlaceholders` sniff has been expanded with additional checks for the correct use of the `%i` placeholder, which was introduced in WP 6.2. Props [@craigfrancis]. - The sniff now also supports the `minimum_wp_version` ruleset property to determine whether the `%i` placeholder can be used. -- `WordPress-Core`: the following additional sniffs (or select error codes from these sniffs) have been added to the ruleset: `Generic.CodeAnalysis.AssignmentInCondition`, `Generic.CodeAnalysis.EmptyPHPStatement` (replaces the WordPressCS native sniff), `Generic.VersionControl.GitMergeConflict`, `Generic.WhiteSpace.IncrementDecrementSpacing`, `Generic.WhiteSpace.LanguageConstructSpacing`, `Generic.WhiteSpace.SpreadOperatorSpacingAfter`, `PSR2.Classes.ClassDeclaration`, `PSR2.Methods.FunctionClosingBrace`, `PSR12.Classes.ClassInstantiation`, `PSR12.Files.FileHeader` (select error codes only), `PSR12.Functions.NullableTypeDeclaration`, `PSR12.Functions.ReturnTypeDeclaration`, `PSR12.Traits.UseDeclaration`, `Squiz.Functions.MultiLineFunctionDeclaration` (replaces part of the `WordPress.WhiteSpace.ControlStructureSpacing` sniff), `Modernize.FunctionCalls.Dirname`, `NormalizedArrays.Arrays.ArrayBraceSpacing` (replaces part of the `WordPress.Arrays.ArrayDeclarationSpacing` sniff), `NormalizedArrays.Arrays.CommaAfterLast` (replaces the WordPressCS native sniff), `Universal.Classes.ModifierKeywordOrder`, `Universal.Classes.RequireAnonClassParentheses`, `Universal.Constants.LowercaseClassResolutionKeyword`, `Universal.Constants.ModifierKeywordOrder`, `Universal.Constants.UppercaseMagicConstants`, `Universal.Namespaces.DisallowCurlyBraceSyntax`, `Universal.Namespaces.DisallowDeclarationWithoutName`, `Universal.Namespaces.OneDeclarationPerFile`, `Universal.NamingConventions.NoReservedKeywordParameterNames`, `Universal.Operators.DisallowShortTernary` (replaces the WordPressCS native sniff), `Universal.Operators.DisallowStandalonePostIncrementDecrement`, `Universal.Operators.StrictComparisons` (replaces the WordPressCS native sniff), `Universal.Operators.TypeSeparatorSpacing`, `Universal.UseStatements.DisallowMixedGroupUse`, `Universal.UseStatements.KeywordSpacing`, `Universal.UseStatements.LowercaseFunctionConst`, `Universal.UseStatements.NoLeadingBackslash`, `Universal.UseStatements.NoUselessAliases`, `Universal.WhiteSpace.CommaSpacing`, `Universal.WhiteSpace.DisallowInlineTabs` (replaces the WordPressCS native sniff), `Universal.WhiteSpace.PrecisionAlignment` (replaces the WordPressCS native sniff), `Universal.WhiteSpace.AnonClassKeywordSpacing`. -- `WordPress-Extra`: the following additional sniffs have been added to the ruleset: `Generic.CodeAnalysis.UnusedFunctionParameter`, `Universal.Arrays.DuplicateArrayKey`, `Universal.CodeAnalysis.ConstructorDestructorReturn`, `Universal.CodeAnalysis.ForeachUniqueAssignment`, `Universal.CodeAnalysis.NoEchoSprintf`, `Universal.CodeAnalysis.StaticInFinalClass`, `Universal.ControlStructures.DisallowLonelyIf`, `Universal.Files.SeparateFunctionsFromOO`. -- `WordPress.Utils.I18nTextDomainFixer`: the `load_script_textdomain()` function to the functions the sniff looks for. -- `WordPress.WP.AlternativeFunctions`: the following PHP native functions have been added to the sniff and will now be flagged when used: `unlink()` (in a new `unlink` group) , `rename()` (in a new `rename` group), `chgrp()`, `chmod()`, `chown()`, `is_writable()` `is_writeable()`, `mkdir()`, `rmdir()`, `touch()`, `fputs()` (in the existing `file_system_operations` group, which was previously named `file_system_read`). Props [@sandeshjangam] and [@JDGrimes]. -- The `PHPUnit_Adapter_TestCase` class to the list of "known test (case) classes". -- The `antispambot()` function to the list of known "formatting" functions. -- The `esc_xml()` and `wp_kses_one_attr()` functions to the list of known "escaping" functions. -- The `wp_timezone_choice()` and `wp_readonly()` functions to the list of known "auto escaping" functions. -- The `sanitize_url()` and `wp_kses_one_attr()` functions to the list of known "sanitizing" functions. -- Metrics for blank lines at the start/end of a control structure body to the `WordPress.WhiteSpace.ControlStructureSpacing` sniff. These can be displayed using `--report=info` when the `blank_line_check` property has been set to `true`. -- End-user documentation to the following new and pre-existing sniffs: `WordPress.DateTime.RestrictedFunctions`, `WordPress.NamingConventions.PrefixAllGlobals` (props [@Ipstenu]), `WordPress.PHP.StrictInArray` (props [@marconmartins]), `WordPress.PHP.YodaConditions` (props [@Ipstenu]), `WordPress.WhiteSpace.ControlStructureSpacing` (props [@ckanitz]), `WordPress.WhiteSpace.ObjectOperatorSpacing`, `WordPress.WhiteSpace.OperatorSpacing` (props [@ckanitz]), `WordPress.WP.CapitalPDangit` (props [@NielsdeBlaauw]), `WordPress.WP.Capabilities`, `WordPress.WP.ClassNameCase`, `WordPress.WP.EnqueueResourceParameters` (props [@NielsdeBlaauw]). - This documentation can be exposed via the [`PHP_CodeSniffer` `--generator=...` command-line argument](https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki/Usage). - Note: all sniffs which have been added from PHPCSExtra (Universal, Modernize, NormalizedArrays sniffs) are also fully documented. - -#### Added (internal/dev-only) -- New Helper classes: - - `ArrayWalkingFunctionsHelper` - - `ConstantsHelper` * - - `ContextHelper` * - - `DeprecationHelper` * - - `FormattingFunctionsHelper` - - `ListHelper` * - - `RulesetPropertyHelper` * - - `SnakeCaseHelper` * - - `UnslashingFunctionsHelper` - - `ValidationHelper` - - `VariableHelper` * - - `WPGlobalVariablesHelper` - - `WPHookHelper` -- New Helper traits: - - `EscapingFunctionsTrait` - - `IsUnitTestTrait` - - `MinimumWPVersionTrait` - - `PrintingFunctionsTrait` - - `SanitizationHelperTrait` * - - `WPDBTrait` - -These classes and traits mostly contain pre-existing functionality moved from the `Sniff` class. -The classes marked with an `*` are considered _internal_ and do not have any promise of future backward compatibility. - -More information is available in the [Upgrade Guide to WordPressCS 3.0.0 for Developers](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Upgrade-Guide-to-WordPressCS-3.0.0-for-Developers-of-external-standards). - - -### Changed -- As of this version, installation via Composer is the only supported manner of installation. - Installing in a different manner (git clone/PEAR/PHAR) is still possible, but no longer supported. -- The minimum required `PHP_CodeSniffer` version to 3.7.2 (was 3.3.1). -- Composer: the package will now identify itself as a static analysis tool. -- The PHP `filter`, `libxml` and `XMLReader` extensions are now explicitly required. - It is recommended to also have the `Mbstring` and `iconv` extensions enabled for the most accurate results. -- The release branch has been renamed from `master` to `main`. -- The following sniffs have been moved from `WordPress-Extra` to `WordPress-Core`: the `Generic.Files.OneObjectStructurePerFile` (also changed from `warning` to `error`), - `Generic.PHP.BacktickOperator`, `PEAR.Files.IncludingFile`, `PSR2.Classes.PropertyDeclaration`, `PSR2.Methods.MethodDeclaration`, `Squiz.Scope.MethodScope`, `Squiz.WhiteSpace.ScopeKeywordSpacing` sniffs. Props, amongst others, to [@desrosj]. -- `WordPress-Core`: The `Generic.Arrays.DisallowShortArraySyntax` sniff has been replaced by the `Universal.Arrays.DisallowShortArraySyntax` sniff. - The new sniff will recognize short lists correctly and ignore them. -- `WordPress-Core`: The `Generic.Files.EndFileNewline` sniff has been replaced by the more comprehensive `PSR2.Files.EndFileNewline` sniff. -- A number of sniffs support setting the minimum WP version for the code being scanned. - This could be done in two different ways: - 1. By setting the `minimum_supported_version` property for each sniff from a ruleset. - 2. By passing `--runtime-set minimum_supported_wp_version #.#` on the command line. - The names of the property and the CLI setting have now been aligned to both use `minimum_wp_version` as the name. - Both ways of passing the value are still supported. -- `WordPress.NamingConventions.PrefixAllGlobals`: the `custom_test_class_whitelist` property has been renamed to `custom_test_classes`. -- `WordPress.NamingConventions.ValidVariableName`: the `customPropertiesWhitelist` property has been renamed to `allowed_custom_properties`. -- `WordPress.PHP.NoSilencedErrors`: the `custom_whitelist` property has been renamed to `customAllowedFunctionsList`. -- `WordPress.PHP.NoSilencedErrors`: the `use_default_whitelist` property has been renamed to `usePHPFunctionsList`. -- `WordPress.WP.GlobalVariablesOverride`: the `custom_test_class_whitelist` property has been renamed to `custom_test_classes`. -- Sniffs are now able to handle fully qualified names for custom test classes provided via a `custom_test_classes` (previously `custom_test_class_whitelist`) ruleset property. -- The default value for `minimum_supported_wp_version`, as used by a [number of sniffs detecting usage of deprecated WP features](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Customizable-sniff-properties#minimum-wp-version-to-check-for-usage-of-deprecated-functions-classes-and-function-parameters), has been updated to `6.0`. -- `WordPress.NamingConventions.PrefixAllGlobals` now takes new pluggable constants into account as introduced in WordPress up to WP 6.3. -- `WordPress.NamingConventions.ValidPostTypeSlug` now takes new reserved post types into account as introduced in WordPress up to WP 6.3. -- `WordPress.WP.DeprecatedClasses` now detects classes deprecated in WordPress up to WP 6.3. -- `WordPress.WP.DeprecatedFunctions` now detects functions deprecated in WordPress up to WP 6.3. -- `WordPress.WP.DeprecatedParameters` now detects parameters deprecated in WordPress up to WP 6.3. -- `WordPress.WP.DeprecatedParameterValues` now detects parameter values deprecated in WordPress up to WP 6.3. -- `WordPress.Utils.I18nTextDomainFixer`: the lists of recognized plugin and theme header tags has been updated based on the current information in the plugin and theme handbooks. -- `WordPress.WP.AlternativeFunctions`: the "group" name `file_system_read`, which can be used with the `exclude` property, has been renamed to `file_system_operations`. - This also means that the error codes for individual functions flagged via that group have changed from `WordPress.WP.AlternativeFunctions.file_system_read_*` to `WordPress.WP.AlternativeFunctions.file_system_operations_*`. -- `WordPress.WP.CapitalPDangit`: the `Misspelled` error code has been split into two error codes - `MisspelledInText` and `MisspelledInComment` - to allow for more modular exclusions/selectively turning off the auto-fixer for the sniff. -- `WordPress.WP.I18n` no longer throws both the `MissingSingularPlaceholder` and the `MismatchedPlaceholders` for the same code, as the errors have an overlap. -- `WordPress-Core`: previously only the spacing around commas in arrays, function declarations and function calls was checked. Now, the spacing around commas will be checked in all contexts. -- `WordPress.Arrays.ArrayKeySpacingRestrictions`: a new `SpacesBetweenBrackets` error code has been introduced for the spacing between square brackets for array assignments without key. Previously, this would throw a `NoSpacesAroundArrayKeys` error with an unclear error message. -- `WordPress.Files.FileName` now recognizes more word separators, meaning that files using other word separators than underscores will now be flagged for not using hyphenation. -- `WordPress.Files.FileName` now checks if a file contains a test class and if so, will bow out. - This change was made to prevent issues with PHPUnit 9.1+, which strongly prefers PSR4-style file names. - Whether something is test class or not is based on a pre-defined list of "known" test case classes which can be extended and, optionally, a list of user provided test case classes provided via setting the `custom_test_classes` property in a custom ruleset or the complete test directory can be excluded via a custom ruleset. -- `WordPress.NamingConventions.PrefixAllGlobals` now allows for pluggable functions and classes, which should not be prefixed when "plugged". -- `WordPress.PHP.NoSilencedErrors`: the metric, which displays in the `info` report, has been renamed from "whitelisted function call" to "silencing allowed function call". -- `WordPress.Security.EscapeOutput` now flags the use of `get_search_query( false )` when generating output (as the `false` turns off the escaping). -- `WordPress.Security.EscapeOutput` now also examines parameters passed for exception creation in `throw` statements and expressions for correct escaping. -- `WordPress.Security.ValidatedSanitizedInput` now examines _all_ superglobal (except for `$GLOBALS`). Previously, the `$_SESSION` and `$_ENV` superglobals would not be flagged as needing validation/sanitization. -- `WordPress.WP.I18n` now recognizes the new PHP 8.0+ `h` and `H` type specifiers. -- `WordPress.WP.PostsPerPage` has improved recognition for numbers prefixed with a unary operator and non-decimal numbers. -- `WordPress.DB.PreparedSQL` will identify more precisely the code which is problematic. -- `WordPress.DB.PreparedSQLPlaceholders` will identify more precisely the code which is problematic. -- `WordPress.DB.SlowDBQuery` will identify more precisely the code which is problematic. -- `WordPress.Security.PluginMenuSlug`: the error will now be thrown more precisely on the code which triggered the error. Depending on code layout, this may mean that an error will now be thrown on a different line. -- `WordPress.WP.DiscouragedConstants`: the error will now be thrown more precisely on the code which triggered the error. Depending on code layout, this may mean that an error will now be thrown on a different line. -- `WordPress.WP.EnqueuedResourceParameters`: the error will now be thrown more precisely on the code which triggered the error. Depending on code layout, this may mean that an error will now be thrown on a different line. -- `WordPress.WP.I18n`: the errors will now be thrown more precisely on the code which triggered the error. Depending on code layout, this may mean that an error will now be thrown on a different line. -- `WordPress.WP.PostsPerPage` will identify more precisely the code which is problematic. -- `WordPress.PHP.TypeCasts.UnsetFound` has been changed from a `warning` to an `error` as the `(unset)` cast is no longer available in PHP 8.0 and higher. -- `WordPress.WP.EnqueuedResourceParameters.MissingVersion` has been changed from an `error` to a `warning`. -- `WordPress.Arrays.ArrayKeySpacingRestrictions`: improved the clarity of the error messages for the `TooMuchSpaceBeforeKey` and `TooMuchSpaceAfterKey` error codes. -- `WordPress.CodeAnalysis.EscapedNotTranslated`: improved the clarity of the error message. -- `WordPress.PHP.IniSet`: improved the clarity of the error messages for the sniff. -- `WordPress.PHP.PregQuoteDelimiter`: improved the clarity of the error message for the `Missing` error code. -- `WordPress.PHP.RestrictedFunctions`: improved the clarity of the error messages for the sniff. -- `WordPress.PHP.RestrictedPHPFunctions`: improved the error message for the `create_function_create_function` error code. -- `WordPress.PHP.TypeCast`: improved the clarity of the error message for the `UnsetFound` error code. It will no longer advise assigning `null`. -- `WordPress.Security.SafeRedirect`: improved the clarity of the error message. (very minor) -- `WordPress.Security.ValidatedSanitizedInput`: improved the clarity of the error messages for the `MissingUnslash` error code. -- `WordPress.WhiteSpace.CastStructureSpacing`: improved the clarity of the error message for the `NoSpaceBeforeOpenParenthesis` error code. -- `WordPress.WP.I18n`: improved the clarity of the error messages for the sniff. -- `WordPress.WP.I18n`: the error messages will now use the correct parameter name. -- The error messages for the `WordPress.CodeAnalysis.EscapedNotTranslated`, `WordPress.NamingConventions.PrefixAllGlobals`, `WordPress.NamingConventions.ValidPostTypeSlug`, `WordPress.PHP.IniSet`, and the `WordPress.PHP.NoSilencedErrors` sniff will now display the code sample found without comments and extranuous whitespace. -- Various updates to the README, the example ruleset and other documentation. Props, amongst others, to [@Luc45], [@slaFFik]. -- Continuous Integration checks are now run via GitHub Actions. Props [@desrosj]. -- Various other CI/QA improvements. -- Code coverage will now be monitored via [CodeCov](https://app.codecov.io/gh/WordPress/WordPress-Coding-Standards). -- All sniffs are now also being tested against PHP 8.0, 8.1, 8.2 and 8.3 for consistent sniff results. - -#### Changed (internal/dev-only) -- All non-abstract classes in WordPressCS are now `final` with the exception of the following four classes which are known to be extended by external PHPCS standards build on top of WordPressCS: `WordPress.NamingConventions.ValidHookName`, `WordPress.Security.EscapeOutput`,`WordPress.Security.NonceVerification`, `WordPress.Security.ValidatedSanitizedInput`. -- Most remaining utility properties and methods, previously contained in the `WordPressCS\WordPress\Sniff` class, have been moved to dedicated Helper classes and traits or, in some cases, to the sniff class using them. - As this change is only relevant for extenders, the full details of these moves are not included in this changelog, but can be found in the [Developers Upgrade Guide to WordPressCS 3.0.0](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Upgrade-Guide-to-WordPressCS-3.0.0-for-Developers-of-external-standards) -- A few customizable `public` properties, which were used by multiple sniffs, have been moved from `*Sniff` classes to traits. Again, the full details of these moves are not included in this changelog, but can be found in the [Developers Upgrade Guide to WordPressCS 3.0.0](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Upgrade-Guide-to-WordPressCS-3.0.0-for-Developers-of-external-standards) -- A number of non-public properties in sniffs have been renamed. - As this change is only relevant for extenders, the full details of these renames are not included in this changelog, but can be found in the [Developers Upgrade Guide to WordPressCS 3.0.0](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Upgrade-Guide-to-WordPressCS-3.0.0-for-Developers-of-external-standards) -- `AbstractFunctionRestrictionsSniff`: The `whitelist` key in the `$groups` array property has been renamed to `allow`. -- The `WordPress.NamingConventions.ValidFunctionName` sniff no longer extends the similar PHPCS native `PEAR` sniff. - -### Removed -- Support for the deprecated, old-style WordPressCS native ignore annotations. Use the PHPCS native selective ignore annotations instead. -- The following WordPressCS native sniffs have been removed: - - The `WordPress.Arrays.CommaAfterArrayItem` sniff (replaced by the `NormalizedArrays.Arrays.CommaAfterLast` and the `Universal.WhiteSpace.CommaSpacing` sniffs). - - The `WordPress.Classes.ClassInstantiation` sniff (replaced by the `PSR12.Classes.ClassInstantiation`, `Universal.Classes.RequireAnonClassParentheses` and `Universal.WhiteSpace.AnonClassKeywordSpacing` sniffs). - - The `WordPress.CodeAnalysis.AssignmentInCondition` sniff (replaced by the `Generic.CodeAnalysis.AssignmentInCondition` and the `WordPress.CodeAnalysis.AssignmentInTernaryCondition` sniffs). - - The `WordPress.CodeAnalysis.EmptyStatement` sniff (replaced by the `Generic.CodeAnalysis.EmptyPHPStatement` sniff). - - The `WordPress.PHP.DisallowShortTernary` sniff (replaced by the `Universal.Operators.DisallowShortTernary` sniff). - - The `WordPress.PHP.StrictComparisons` sniff (replaced by the `Universal.Operators.StrictComparisons` sniff). - - The `WordPress.WhiteSpace.DisallowInlineTabs` sniff (replaced by the `Universal.WhiteSpace.DisallowInlineTabs` sniff). - - The `WordPress.WhiteSpace.PrecisionAlignment` sniff (replaced by the `Universal.WhiteSpace.PrecisionAlignment` sniff). - - The `WordPress.WP.TimezoneChange` sniff (replaced by the `WordPress.DateTime.RestrictedFunctions` sniff). This sniff was previously already deprecated. -- `WordPress-Extra`: The `Squiz.WhiteSpace.LanguageConstructSpacing` sniff (replaced by the added, more comprehensive `Generic.WhiteSpace.LanguageConstructSpacing` sniff in the `WordPress-Core` ruleset). -- `WordPress.Arrays.ArrayDeclarationSpacing`: array brace spacing checks (replaced by the `NormalizedArrays.Arrays.ArrayBraceSpacing` sniff). -- `WordPress.WhiteSpace.ControlStructureSpacing`: checks for the spacing for function declarations (replaced by the `Squiz.Functions.MultiLineFunctionDeclaration` sniff). - Includes removal of the `spaces_before_closure_open_paren` property for this sniff. -- `WordPress.WP.I18n`: the `check_translator_comments` property. - Exclude the `WordPress.WP.I18n.MissingTranslatorsComment` and the `WordPress.WP.I18n.TranslatorsCommentWrongStyle` error codes instead. -- WordPressCS will no longer check for assigning the return value of an object instantiation by reference. - This is a PHP parse error since PHP 7.0. Use the `PHPCompatibilityWP` standard to check for PHP cross-version compatibility issues. -- The check for object instantiations will no longer check JavaScript files. -- The `WordPress.Arrays.ArrayKeySpacingRestrictions.MissingBracketCloser` error code as sniffs should not report on parse errors. -- The `WordPress.CodeAnalysis.AssignmentIn[Ternary]Condition.NonVariableAssignmentFound` error code as sniffs should not report on parse errors. -- The `Block_Supported_Styles_Test` class will no longer incorrectly be recognized as an extendable test case class. - -#### Removed (internal/dev-only) -- `AbstractArrayAssignmentRestrictionsSniff`: support for the optional `'callback'` key in the array returned by `getGroups()`. -- `WordPressCS\WordPress\PHPCSHelper` class (use the `PHPCSUtils\BackCompat\Helper` class instead). -- `WordPressCS\WordPress\Sniff::addMessage()` method (use the `PHPCSUtils\Utils\MessageHelper::addMessage()` method instead). -- `WordPressCS\WordPress\Sniff::addFixableMessage()` method (use the `PHPCSUtils\Utils\MessageHelper::addFixableMessage()` method instead). -- `WordPressCS\WordPress\Sniff::determine_namespace()` method (use the `PHPCSUtils\Utils\Namespaces::determineNamespace()` method instead). -- `WordPressCS\WordPress\Sniff::does_function_call_have_parameters()` method (use the `PHPCSUtils\Utils\PassedParameters::hasParameters()` method instead). -- `WordPressCS\WordPress\Sniff::find_array_open_close()` method (use the `PHPCSUtils\Utils\Arrays::getOpenClose()` method instead). -- `WordPressCS\WordPress\Sniff::find_list_open_close()` method (use the `PHPCSUtils\Utils\Lists::getOpenClose()` method instead). -- `WordPressCS\WordPress\Sniff::get_declared_namespace_name()` method (use the `PHPCSUtils\Utils\Namespaces::getDeclaredName()` method instead). -- `WordPressCS\WordPress\Sniff::get_function_call_parameter_count()` method (use the `PHPCSUtils\Utils\PassedParameters::getParameterCount()` method instead). -- `WordPressCS\WordPress\Sniff::get_function_call_parameters()` method (use the `PHPCSUtils\Utils\PassedParameters::getParameters()` method instead). -- `WordPressCS\WordPress\Sniff::get_function_call_parameter()` method (use the `PHPCSUtils\Utils\PassedParameters::getParameter()` method instead). -- `WordPressCS\WordPress\Sniff::get_interpolated_variables()` method (use the `PHPCSUtils\Utils\TextStrings::getEmbeds()` method instead). -- `WordPressCS\WordPress\Sniff::get_last_ptr_on_line()` method (no replacement available at this time). -- `WordPressCS\WordPress\Sniff::get_use_type()` method (use the `PHPCSUtils\Utils\UseStatements::getType()` method instead). -- `WordPressCS\WordPress\Sniff::has_whitelist_comment()` method (no replacement). -- `WordPressCS\WordPress\Sniff::$hookFunctions` property (no replacement available at this time). -- `WordPressCS\WordPress\Sniff::init()` method (no replacement). -- `WordPressCS\WordPress\Sniff::is_class_constant()` method (use the `PHPCSUtils\Utils\Scopes::isOOConstant()` method instead). -- `WordPressCS\WordPress\Sniff::is_class_property()` method (use the `PHPCSUtils\Utils\Scopes::isOOProperty()` method instead). -- `WordPressCS\WordPress\Sniff::is_foreach_as()` method (use the `PHPCSUtils\Utils\Context::inForeachCondition()` method instead). -- `WordPressCS\WordPress\Sniff::is_short_list()` method (depending on your needs, use the `PHPCSUtils\Utils\Lists::isShortList()` or the `PHPCSUtils\Utils\Arrays::isShortArray()` method instead). -- `WordPressCS\WordPress\Sniff::is_token_in_test_method()` method (no replacement available at this time). -- `WordPressCS\WordPress\Sniff::REGEX_COMPLEX_VARS` constant (use the PHPCSUtils `PHPCSUtils\Utils\TextStrings::stripEmbeds()` and `PHPCSUtils\Utils\TextStrings::getEmbeds()` methods instead). -- `WordPressCS\WordPress\Sniff::string_to_errorcode()` method (use the `PHPCSUtils\Utils\MessageHelper::stringToErrorcode()` method instead). -- `WordPressCS\WordPress\Sniff::strip_interpolated_variables()` method (use the `PHPCSUtils\Utils\TextStrings::stripEmbeds()` method instead). -- `WordPressCS\WordPress\Sniff::strip_quotes()` method (use the `PHPCSUtils\Utils\TextStrings::stripQuotes()` method instead). -- `WordPressCS\WordPress\Sniff::valid_direct_scope()` method (use the `PHPCSUtils\Utils\Scopes::validDirectScope()` method instead). -- Unused dev-only files in the (now removed) `bin` directory. - -### Fixed -- All sniffs which, in one way or another, check whether code represents a short list or a short array will now do so more accurately. - This fixes various false positives and false negatives. -- Sniffs supporting the `minimum_wp_version` property (previously `minimum_supported_version`) will no longer throw a "passing null to non-nullable" deprecation notice on PHP 8.1+. -- `WordPress.WhiteSpace.ControlStructureSpacing` no longer throws a `TypeError` on PHP 8.0+. -- `WordPress.NamingConventions.PrefixAllGlobals`no longer throws a "passing null to non-nullable" deprecation notice on PHP 8.1+. -- `WordPress.WP.I18n` no longer throws a "passing null to non-nullable" deprecation notice on PHP 8.1+. -- `VariableHelper::is_comparison()` (previously `Sniff::is_comparison()`): fixed risk of undefined array key notice when scanning code containing parse errors. -- `AbstractArrayAssignmentRestrictionsSniff` could previously get confused when it encountered comments in unexpected places. - This fix has a positive impact on all sniffs which are based on this abstract (2 sniffs). -- `AbstractArrayAssignmentRestrictionsSniff` no longer examines numeric string keys as PHP treats those as integer keys, which were never intended as the target of this abstract. - This fix has a positive impact on all sniffs which are based on this abstract (2 sniffs). -- `AbstractArrayAssignmentRestrictionsSniff` in case of duplicate entries, the sniff will now only examine the last value, as that's the value PHP will see. - This fix has a positive impact on all sniffs which are based on this abstract (2 sniffs). -- `AbstractArrayAssignmentRestrictionsSniff` now determines the assigned value with higher accuracy. - This fix has a positive impact on all sniffs which are based on this abstract (2 sniffs). -- `AbstractClassRestrictionsSniff` now treats the `namespace` keyword when used as an operator case-insensitively. - This fix has a positive impact on all sniffs which are based on this abstract (3 sniffs). -- `AbstractClassRestrictionsSniff` now treats the hierarchy keywords (`self`, `parent`, `static`) case-insensitively. - This fix has a positive impact on all sniffs which are based on this abstract (3 sniffs). -- `AbstractClassRestrictionsSniff` now limits itself correctly when trying to find a class name before a `::`. - This fix has a positive impact on all sniffs which are based on this abstract (3 sniffs). -- `AbstractClassRestrictionsSniff`: false negatives on class instantiation statements ending on a PHP close tag. - This fix has a positive impact on all sniffs which are based on this abstract (3 sniffs). -- `AbstractClassRestrictionsSniff`: false negatives on class instantiation statements combined with method chaining. - This fix has a positive impact on all sniffs which are based on this abstract (3 sniffs). -- `AbstractFunctionRestrictionsSniff`: false positives on function declarations when the function returns by reference. - This fix has a positive impact on all sniffs which are based on this abstract (nearly half of the WordPressCS sniffs). -- `AbstractFunctionRestrictionsSniff`: false positives on instantiation of a class with the same name as a targeted function. - This fix has a positive impact on all sniffs which are based on this abstract (nearly half of the WordPressCS sniffs). -- `AbstractFunctionRestrictionsSniff` now respects that function names in PHP are case-insensitive in more places. - This fix has a positive impact on all sniffs which are based on this abstract (nearly half of the WordPressCS sniffs). -- Various utility methods in Helper classes/traits have received fixes to correctly treat function and class names as case-insensitive. - These fixes have a positive impact on all sniffs using these methods. -- Version comparisons done by sniffs supporting the `minimum_wp_version` property (previously `minimum_supported_version`) will now be more precise. -- `WordPress.Arrays.ArrayIndentation` now ignores indentation issues for array items which are not the first thing on a line. This fixes a potential fixer conflict. -- `WordPress.Arrays.ArrayKeySpacingRestrictions`: signed positive integer keys will now be treated the same as signed negative integer keys. -- `WordPress.Arrays.ArrayKeySpacingRestrictions`: keys consisting of calculations will now be recognized more accurately. -- `WordPress.Arrays.ArrayKeySpacingRestrictions.NoSpacesAroundArrayKeys`: now has better protection in case of a fixer conflict. -- `WordPress.Classes.ClassInstantiation` could create parse errors when fixing a class instantiation using variable variables. This has been fixed by replacing the sniff with the `PSR12.Classes.ClassInstantiation` sniff (and some others). -- `WordPress.DB.DirectDatabaseQuery` could previously get confused when it encountered comments in unexpected places. -- `WordPress.DB.DirectDatabaseQuery` now respects that function (method) names in PHP are case-insensitive. -- `WordPress.DB.DirectDatabaseQuery` now only looks at the current statement to find a method call to the `$wpdb` object. -- `WordPress.DB.DirectDatabaseQuery` no longer warns about `TRUNCATE` queries as those cannot be cached and need a direct database query. -- `WordPress.DB.PreparedSQL` could previously get confused when it encountered comments in unexpected places. -- `WordPress.DB.PreparedSQL` now respects that function names in PHP are case-insensitive. -- `WordPress.DB.PreparedSQL` improved recognition of interpolated variables and expressions in the `$text` argument. This fixes both some false negatives as well as some false positives. -- `WordPress.DB.PreparedSQL` stricter recognition of the `$wpdb` variable in double quoted query strings. -- `WordPress.DB.PreparedSQL` false positive for floating point numbers concatenated into an SQL query. -- `WordPress.DB.PreparedSQLPlaceholders` could previously get confused when it encountered comments in unexpected places. -- `WordPress.DB.PreparedSQLPlaceholders` now respects that function names in PHP are case-insensitive. -- `WordPress.DB.PreparedSQLPlaceholders` stricter recognition of the `$wpdb` variable in double quotes query strings. -- `WordPress.DB.PreparedSQLPlaceholders` false positive when a fully qualified function call is encountered in an `implode( ', ', array_fill(...))` pattern. -- `WordPress.Files.FileName` no longer presumes a three character file extension. -- `WordPress.NamingConventions.PrefixAllGlobals` could previously get confused when it encountered comments in unexpected places in function calls which were being examined. -- `WordPress.NamingConventions.PrefixAllGlobals` now respects that function names in PHP are case-insensitive when checking whether a function declaration is polyfilling a PHP native function. -- `WordPress.NamingConventions.PrefixAllGlobals` improved false positive prevention for variable assignments via keyed lists. -- `WordPress.NamingConventions.PrefixAllGlobals` now only looks at the current statement when determining which variables were imported via a `global` statement. This prevents both false positives as well as false negatives. -- `WordPress.NamingConventions.PrefixAllGlobals` no longer gets confused over `global` statements in nested clsure/function declarations. -- `WordPress.NamingConventions.ValidFunctionName` now also checks the names of (global) functions when the declaration is nested within an OO method. -- `WordPress.NamingConventions.ValidFunctionName` no longer throws false positives for triple underscore methods. -- `WordPress.NamingConventions.ValidFunctionName` the suggested replacement names in the error message no longer remove underscores from a name in case of leading or trailing underscores, or multiple underscores in the middle of a name. -- `WordPress.NamingConventions.ValidFunctionName` the determination whether a name is in `snake_case` is now more accurate and has improved handling of non-ascii characters. -- `WordPress.NamingConventions.ValidFunctionName` now correctly recognizes a PHP4-style constructor when the class and the constructor method name contains non-ascii characters. -- `WordPress.NamingConventions.ValidHookName` no longer throws false positives when the hook name is generated via a function call and that function is passed string literals as parameters. -- `WordPress.NamingConventions.ValidHookName` now ignores parameters in a variable function call (like a call to a closure). -- `WordPress.NamingConventions.ValidPostTypeSlug` no longer throws false positives for interpolated text strings with complex embedded variables/expressions. -- `WordPress.NamingConventions.ValidVariableName` the suggested replacement names in the error message will no longer remove underscores from a name in case of leading or trailing underscores, or multiple underscores in the middle of a name. -- `WordPress.NamingConventions.ValidVariableName` the determination whether a name is in `snake_case` is now more accurate and has improved handling of non-ascii characters. -- `WordPress.NamingConventions.ValidVariableName` now examines all variables and variables in expressions in a text string containing interpolation. -- `WordPress.NamingConventions.ValidVariableName` now has improved recognition of variables in complex embedded variables/expressions in interpolated text strings. -- `WordPress.PHP.IniSet` no longer gets confused over comments in the code when determining whether the ini value is an allowed one. -- `WordPress.PHP.NoSilencedErrors` no longer throws an error when error silencing is encountered for function calls to the PHP native `libxml_disable_entity_loader()` and `imagecreatefromwebp()` methods. -- `WordPress.PHP.StrictInArray` no longer gets confused over comments in the code when determining whether the `$strict` parameter is used. -- `WordPress.Security.EscapeOutput` no longer throws a false positive on function calls where the parameters need escaping, when no parameters are being passed. -- `WordPress.Security.EscapeOutput` no longer throws a false positive when a fully qualified function call to the `\basename()` function is encountered within a call to `_deprecated_file()`. -- `WordPress.Security.EscapeOutput` could previously get confused when it encountered comments in the `$file` parameter for `_deprecated_file()`. -- `WordPress.Security.EscapeOutput` now ignores significantly more operators which should yield more accurate results. -- `WordPress.Security.EscapeOutput` now respects that function names in PHP are case-insensitive when checking whether a printing function is being used. -- `WordPress.Security.EscapeOutput` no longer throws an `Internal.Exception` when it encounters a constant or property mirroring the name of one of the printing functions being targeted, nor will it throw false positives for those. -- `WordPress.Security.EscapeOutput` no longer incorrectly handles method calls or calls to namespaced functions mirroring the name of one of the printing functions being targeted. -- `WordPress.Security.EscapeOutput` now ignores `exit`/`die` statements without a status being passed, preventing false positives on code after the statement. -- `WordPress.Security.EscapeOutput` now has improved recognition that `print` can also be used as an expression, not only as a statement. -- `WordPress.Security.EscapeOutput` now has much, much, much more accurate handling of code involving ternary expressions and should now correctly ignore the ternary condition in all long ternaries being examined. -- `WordPress.Security.EscapeOutput` no longer disregards the ternary condition in a short ternary. -- `WordPress.Security.EscapeOutput` no longer skips over a constant or property mirroring the name of one of the (auto-)escaping/formatting functions being targeted. -- `WordPress.Security.EscapeOutput` no longer throws false positives for `*::class`, which will always evaluate to a plain string. -- `WordPress.Security.EscapeOutput` no longer throws false positives on output generating keywords encountered in an inline expression. -- `WordPress.Security.EscapeOutput` no longer throws false positives on parameters passed to `_e()` or `_ex()`, which won't be used in the output. -- `WordPress.Security.EscapeOutput` no longer throws false positives on heredocs not using interpolation. -- `WordPress.Security.NonceVerification` now respects that function names in PHP are case-insensitive when checking whether an array comparison function is being used. -- `WordPress.Security.NonceVerification` now also checks for nonce verification when the `$_FILES` superglobal is being used. -- `WordPress.Security.NonceVerification` now ignores properties named after superglobals. -- `WordPress.Security.NonceVerification` now ignores list assignments to superglobals. -- `WordPress.Security.NonceVerification` now ignores superglobals being unset. -- `WordPress.Security.ValidatedSanitizedInput` now respects that function names in PHP are case-insensitive when checking whether an array comparison function is being used. -- `WordPress.Security.ValidatedSanitizedInput` now respects that function names in PHP are case-insensitive when checking whether a variable is being validated using `[array_]key_exists()`. -- `WordPress.Security.ValidatedSanitizedInput` improved recognition of interpolated variables and expression in the text strings. This fixes some false negatives. -- `WordPress.Security.ValidatedSanitizedInput` no longer incorrectly regards an `unset()` as variable validation. -- `WordPress.Security.ValidatedSanitizedInput` no longer incorrectly regards validation in a nested scope as validation which applies to the superglobal being examined. -- `WordPress.WP.AlternativeFunctions` could previously get confused when it encountered comments in unexpected places. -- `WordPress.WP.AlternativeFunctions` now correctly takes the `minimum_wp_version` into account when determining whether a call to `parse_url()` could switch over to using `wp_parse_url()`. -- `WordPress.WP.CapitalPDangit` now skips (keyed) list assignments to prevent false positives. -- `WordPress.WP.CapitalPDangit` now always skips all array keys, not just plain text array keys. -- `WordPress.WP.CronInterval` no longer throws a `ChangeDetected` warning for interval calculations wrapped in parentheses, but for which the value for the interval is otherwise known. -- `WordPress.WP.CronInterval` no longer throws a `ChangeDetected` warning for interval calculations using fully qualified WP native time constants, but for which the value for the interval is otherwise known. -- `WordPress.WP.DeprecatedParameters` no longer throws a false positive for function calls to `comments_number()` using the fourth parameter (which was deprecated, but has been repurposed since WP 5.4). -- `WordPress.WP.DeprecatedParameters` now looks for the correct parameter in calls to the `unregister_setting()` function. -- `WordPress.WP.DeprecatedParameters` now lists the correct WP version for the deprecation of the third parameter in function calls to `get_user_option()`. -- `WordPress.WP.DiscouragedConstants` could previously get confused when it encountered comments in unexpected places. -- `WordPress.WP.EnqueuedResources` now recognizes enqueuing in a multi-line text string correctly. -- `WordPress.WP.EnqueuedResourceParameters` could previously get confused when it encountered comments in unexpected places. -- `WordPress.WP.GlobalVariablesOverride` improved false positive prevention for variable assignments via keyed lists. -- `WordPress.WP.GlobalVariablesOverride` now only looks at the current statement when determining which variables were imported via a `global` statement. This prevents both false positives as well as false negatives. -- `WordPress.WP.I18n` improved recognition of interpolated variables and expression in the `$text` argument. This fixes some false negatives. -- `WordPress.WP.I18n` no longer potentially creates parse errors when auto-fixing an `UnorderedPlaceholders*` error involving a multi-line text string. -- `WordPress.WP.I18n` no longer throws false positives for compound parameters starting with a text string, which were previously checked as if the parameter only consisted of a text string. -- `WordPress.WP.PostsPerPage` now determines the end of statement with more precision and will no longer throw a false positive for function calls on PHP 8.0+. - - -## [2.3.0] - 2020-05-14 - -### Added -- The `WordPress.WP.I18n` sniff contains a new check for translatable text strings which are wrapped in HTML tags, like `

    Translate me

    `. Those tags should be moved out of the translatable string. - Note: Translatable strings wrapped in `` tags where the URL is intended to be localized will not trigger this check. - -### Changed -- The default value for `minimum_supported_wp_version`, as used by a [number of sniffs detecting usage of deprecated WP features](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Customizable-sniff-properties#minimum-wp-version-to-check-for-usage-of-deprecated-functions-classes-and-function-parameters), has been updated to `5.1`. -- The `WordPress.WP.DeprecatedFunctions` sniff will now detect functions deprecated in WP 5.4. -- Improved grammar of an error message in the `WordPress.WP.DiscouragedFunctions` sniff. -- CI: The codebase is now - preliminary - being tested against the PHPCS 4.x development branch. - -### Fixed -- All function call detection sniffs: fixed a bug where constants with the same name as one of the targeted functions could inadvertently be recognized as if they were a called function. -- `WordPress.DB.PreparedSQL`: fixed a bug where the sniff would trigger on the namespace separator character `\\`. -- `WordPress.Security.EscapeOutput`: fixed a bug with the variable replacement in one of the error messages. - - -## [2.2.1] - 2020-02-04 - -### Added -- Metrics to the `WordPress.Arrays.CommaAfterArrayItem` sniff. These can be displayed using `--report=info`. -- The `sanitize_hex_color()` and the `sanitize_hex_color_no_hash()` functions to the `escapingFunctions` list used by the `WordPress.Security.EscapeOutput` sniff. - -### Changed -- The recommended version of the suggested [Composer PHPCS plugin] is now `^0.6`. - -### Fixed -- `WordPress.PHP.NoSilencedErrors`: depending on the custom properties set, the metrics would be different. -- `WordPress.WhiteSpace.ControlStructureSpacing`: fixed undefined index notice for closures with `use`. -- `WordPress.WP.GlobalVariablesOverride`: fixed undefined offset notice when the `treat_files_as_scoped` property would be set to `true`. -- `WordPress.WP.I18n`: fixed a _Trying to access array offset on value of type null_ error when the sniff was run on PHP 7.4 and would encounter a translation function expecting singular and plural texts for which one of these arguments was missing. - -## [2.2.0] - 2019-11-11 - -Note: The repository has moved. The new URL is https://github.com/WordPress/WordPress-Coding-Standards. -The move does not affect the package name for Packagist. This remains the same: `wp-coding-standards/wpcs`. - -### Added -- New `WordPress.DateTime.CurrentTimeTimestamp` sniff to the `WordPress-Core` ruleset, which checks against the use of the WP native `current_time()` function to retrieve a timestamp as this won't be a _real_ timestamp. Includes an auto-fixer. -- New `WordPress.DateTime.RestrictedFunctions` sniff to the `WordPress-Core` ruleset, which checks for the use of certain date/time related functions. Initially this sniff forbids the use of the PHP native `date_default_timezone_set()` and `date()` functions. -- New `WordPress.PHP.DisallowShortTernary` sniff to the `WordPress-Core` ruleset, which, as the name implies, disallows the use of short ternaries. -- New `WordPress.CodeAnalysis.EscapedNotTranslated` sniff to the `WordPress-Extra` ruleset which will warn when a text string is escaped for output, but not being translated, while the arguments passed to the function call give the impression that translation is intended. -- New `WordPress.NamingConventions.ValidPostTypeSlug` sniff to the `WordPress-Extra` ruleset which will examine calls to `register_post_type()` and throw errors when an invalid post type slug is used. -- `Generic.Arrays.DisallowShortArraySyntax` to the `WordPress-Core` ruleset. -- `WordPress.NamingConventions.PrefixAllGlobals`: the `PHP` prefix has been added to the prefix blacklist as it is reserved by PHP itself. -- The `wp_sanitize_redirect()` function to the `sanitizingFunctions` list used by the `WordPress.Security.NonceVerification`, `WordPress.Security.ValidatedSanitizedInput` and `WordPress.Security.EscapeOutput` sniffs. -- The `sanitize_key()` and the `highlight_string()` functions to the `escapingFunctions` list used by the `WordPress.Security.EscapeOutput` sniff. -- The `RECOVERY_MODE_COOKIE` constant to the list of WP Core constants which may be defined by plugins and themes and therefore don't need to be prefixed (`WordPress.NamingConventions.PrefixAllGlobals`). -- `$content_width`, `$plugin`, `$mu_plugin` and `$network_plugin` to the list of WP globals which is used by both the `WordPress.Variables.GlobalVariables` and the `WordPress.NamingConventions.PrefixAllGlobals` sniffs. -- `Sniff::is_short_list()` utility method to determine whether a _short array_ open/close token actually represents a PHP 7.1+ short list. -- `Sniff::find_list_open_close()` utility method to find the opener and closer for `list()` constructs, including short lists. -- `Sniff::get_list_variables()` utility method which will retrieve an array with the token pointers to the variables which are being assigned to in a `list()` construct. Includes support for short lists. -- `Sniff::is_function_deprecated()` static utility method to determine whether a declared function has been marked as deprecated in the function DocBlock. -- End-user documentation to the following existing sniffs: `WordPress.Arrays.ArrayIndentation`, `WordPress.Arrays.ArrayKeySpacingRestrictions`, `WordPress.Arrays.MultipleStatementAlignment`, `WordPress.Classes.ClassInstantiation`, `WordPress.NamingConventions.ValidHookName`, `WordPress.PHP.IniSet`, `WordPress.Security.SafeRedirect`, `WordPress.WhiteSpace.CastStructureSpacing`, `WordPress.WhiteSpace.DisallowInlineTabs`, `WordPress.WhiteSpace.PrecisionAlignment`, `WordPress.WP.CronInterval`, `WordPress.WP.DeprecatedClasses`, `WordPress.WP.DeprecatedFunctions`, `WordPress.WP.DeprecatedParameters`, `WordPress.WP.DeprecatedParameterValues`, `WordPress.WP.EnqueuedResources`, `WordPress.WP.PostsPerPage`. - This documentation can be exposed via the [`PHP_CodeSniffer` `--generator=...` command-line argument](https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki/Usage). - -### Changed -- The default value for `minimum_supported_wp_version`, as used by a [number of sniffs detecting usage of deprecated WP features](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Customizable-sniff-properties#minimum-wp-version-to-check-for-usage-of-deprecated-functions-classes-and-function-parameters), has been updated to `5.0`. -- The `WordPress.Arrays.ArrayKeySpacingRestrictions` sniff has two new error codes: `TooMuchSpaceBeforeKey` and `TooMuchSpaceAfterKey`. Both auto-fixable. - The sniff will now check that there is _exactly_ one space on the inside of the square brackets around the array key for non-string, non-numeric array keys. Previously, it only checked that there was whitespace, not how much whitespace. -- `WordPress.Arrays.ArrayKeySpacingRestrictions`: the fixers have been made more efficient and less fixer-conflict prone. -- `WordPress.NamingConventions.PrefixAllGlobals`: plugin/theme prefixes should be at least three characters long. A new `ShortPrefixPassed` error has been added for when the prefix passed does not comply with this rule. -- `WordPress.WhiteSpace.CastStructureSpacing` now allows for no whitespace before a cast when the cast is preceded by the spread `...` operator. This pre-empts a fixer conflict for when the spacing around the spread operator will start to get checked. -- The `WordPress.WP.DeprecatedClasses` sniff will now detect classes deprecated in WP 4.9 and WP 5.3. -- The `WordPress.WP.DeprecatedFunctions` sniff will now detect functions deprecated in WP 5.3. -- `WordPress.NamingConventions.ValidHookName` now has "cleaner" error messages and higher precision for the line on which an error is thrown. -- `WordPress.Security.EscapeOutput`: if an error refers to array access via a variable, the array index key will now be included in the error message. -- The processing of the `WordPress` ruleset by `PHP_CodeSniffer` will now be faster. -- Various minor code tweaks and clean up. -- Various minor documentation fixes. -- Documentation: updated the repo URL in all relevant places. - -### Deprecated -- The `WordPress.WP.TimezoneChange` sniff. Use the `WordPress.DateTime.RestrictedFunctions` instead. - The deprecated sniff will be removed in WPCS 3.0.0. - -### Fixed -- All sniffs in the `WordPress.Arrays` category will no longer treat _short lists_ as if they were a short array. -- The `WordPress.NamingConventions.ValidFunctionName` and the `WordPress.NamingConventions.PrefixAllGlobals` sniff will now ignore functions marked as `@deprecated`. -- Both the `WordPress.NamingConventions.PrefixAllGlobals` sniff as well as the `WordPress.WP.GlobalVariablesOverride` sniff have been updated to recognize variables being declared via (long/short) `list()` constructs and handle them correctly. -- Both the `WordPress.NamingConventions.PrefixAllGlobals` sniff as well as the `WordPress.WP.GlobalVariablesOverride` sniff will now take a limited list of WP global variables _which are intended to be overwritten by plugins/themes_ into account. - Initially this list contains the `$content_width` and the `$wp_cockneyreplace` variables. -- `WordPress.NamingConventions.ValidHookName`: will no longer examine a string array access index key as if it were a part of the hook name. -- `WordPress.Security.EscapeOutput`: will no longer trigger on the typical `basename( __FILE__ )` pattern if found as the first parameter passed to a call to `_deprecated_file()`. -- `WordPress.WP.CapitalPDangit`: now allows for the `.test` TLD in URLs. -- WPCS is now fully compatible with PHP 7.4. - Note: `PHP_CodeSniffer` itself is only compatible with PHP 7.4 from PHPCS 3.5.0 onwards. - - -## [2.1.1] - 2019-05-21 - -### Changed -- The `WordPress.WP.CapitalPDangit` will now ignore misspelled instances of `WordPress` within constant declarations. - This covers both constants declared using `defined()` as well as constants declared using the `const` keyword. -- The default value for `minimum_supported_wp_version`, as used by a [number of sniffs detecting usage of deprecated WP features](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Customizable-sniff-properties#minimum-wp-version-to-check-for-usage-of-deprecated-functions-classes-and-function-parameters), has been updated to `4.9`. - -### Removed -- `paginate_comments_links()` from the list of auto-escaped functions `Sniff::$autoEscapedFunctions`. - This affects the `WordPress.Security.EscapeOutput` sniff. - -### Fixed -- The `$current_blog` and `$tag_ID` variables have been added to the list of WordPress global variables. - This fixes some false positives from the `WordPress.NamingConventions.PrefixAllGlobals` and the `WordPress.WP.GlobalVariablesOverride` sniffs. -- The generic `TestCase` class name has been added to the `$test_class_whitelist`. - This fixes some false positives from the `WordPress.NamingConventions.FileName`, `WordPress.NamingConventions.PrefixAllGlobals` and the `WordPress.WP.GlobalVariablesOverride` sniffs. -- The `WordPress.NamingConventions.ValidVariableName` sniff will now correctly recognize `$tag_ID` as a WordPress native, mixed-case variable. -- The `WordPress.Security.NonceVerification` sniff will now correctly recognize nonce verification within a nested closure or anonymous class. - - -## [2.1.0] - 2019-04-08 - -### Added -- New `WordPress.PHP.IniSet` sniff to the `WordPress-Extra` ruleset. - This sniff will detect calls to `ini_set()` and `ini_alter()` and warn against their use as changing configuration values at runtime leads to an unpredictable runtime environment, which can result in conflicts between core/plugins/themes. - - The sniff will not throw notices about a very limited set of "safe" ini directives. - - For a number of ini directives for which there are alternative, non-conflicting ways to achieve the same available, the sniff will throw an `error` and advise using the alternative. -- `doubleval()`, `count()` and `sizeof()` to `Sniff::$unslashingSanitizingFunctions` property. - While `count()` and its alias `sizeof()`, don't actually unslash or sanitize, the output of these functions is safe to use without unslashing or sanitizing. - This affects the `WordPress.Security.ValidatedSanitizedInput` and the `WordPress.Security.NonceVerification` sniffs. -- The new WP 5.1 `WP_UnitTestCase_Base` class to the `Sniff::$test_class_whitelist` property. -- New `Sniff::get_array_access_keys()` utility method to retrieve all array keys for a variable using multi-level array access. -- New `Sniff::is_class_object_call()`, `Sniff::is_token_namespaced()` utility methods. - These should help make the checking of whether or not a function call is a global function, method call or a namespaced function call more consistent. - This also implements allowing for the [namespace keyword being used as an operator](https://www.php.net/manual/en/language.namespaces.nsconstants.php#example-258). -- New `Sniff::is_in_function_call()` utility method to facilitate checking whether a token is (part of) a parameter passed to a specific (set of) function(s). -- New `Sniff::is_in_type_test()` utility method to determine if a variable is being type tested, along with a `Sniff::$typeTestFunctions` property containing the names of the functions this applies to. -- New `Sniff::is_in_array_comparison()` utility method to determine if a variable is (part of) a parameter in an array-value comparison, along with a `Sniff::$arrayCompareFunctions` property containing the names of the relevant functions. -- New `Sniff::$arrayWalkingFunctions` property containing the names of array functions which apply a callback to the array, but don't change the array by reference. -- New `Sniff::$unslashingFunctions` property containing the names of functions which unslash data passed to them and return the unslashed result. - -### Changed -- Moved the `WordPress.PHP.StrictComparisons`, `WordPress.PHP.StrictInArray` and the `WordPress.CodeAnalysis.AssignmentInCondition` sniff from the `WordPress-Extra` to the `WordPress-Core` ruleset. -- The `Squiz.Commenting.InlineComment.SpacingAfter` error is no longer included in the `WordPress-Docs` ruleset. -- The default value for `minimum_supported_wp_version`, as used by a [number of sniffs detecting usage of deprecated WP features](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Customizable-sniff-properties#minimum-wp-version-to-check-for-usage-of-deprecated-functions-classes-and-function-parameters), has been updated to `4.8`. -- The `WordPress.WP.DeprecatedFunctions` sniff will now detect functions deprecated in WP 5.1. -- The `WordPress.Security.NonceVerification` sniff now allows for variable type testing, comparisons, unslashing and sanitization before the nonce check. A nonce check within the same scope, however, is still required. -- The `WordPress.Security.ValidatedSanitizedInput` sniff now allows for using a superglobal in an array-value comparison without sanitization, same as when the superglobal is used in a scalar value comparison. -- `WordPress.NamingConventions.PrefixAllGlobals`: some of the error messages have been made more explicit. -- The error messages for the `WordPress.Security.ValidatedSanitizedInput` sniff will now contain information on the index keys accessed. -- The error message for the `WordPress.Security.ValidatedSanitizedInput.InputNotValidated` has been reworded to make it more obvious what the actual issue being reported is. -- The error message for the `WordPress.Security.ValidatedSanitizedInput.MissingUnslash` has been reworded. -- The `Sniff::is_comparison()` method now has a new `$include_coalesce` parameter to allow for toggling whether the null coalesce operator should be seen as a comparison operator. Defaults to `true`. -- All sniffs are now also being tested against PHP 7.4 (unstable) for consistent sniff results. -- The recommended version of the suggested [Composer PHPCS plugin] is now `^0.5.0`. -- Various minor code tweaks and clean up. - -### Removed -- `ini_set` and `ini_alter` from the list of functions detected by the `WordPress.PHP.DiscouragedFunctions` sniff. - These are now covered via the new `WordPress.PHP.IniSet` sniff. -- `in_array()` and `array_key_exists()` from the list of `Sniff::$sanitizingFunctions`. These are now handled differently. - -### Fixed -- The `WordPress.NamingConventions.PrefixAllGlobals` sniff would underreport when global functions would be autoloaded via a Composer autoload `files` configuration. -- The `WordPress.Security.EscapeOutput` sniff will now recognize `map_deep()` for escaping the values in an array via a callback to an output escaping function. This should prevent false positives. -- The `WordPress.Security.NonceVerification` sniff will no longer inadvertently allow for a variable to be sanitized without a nonce check within the same scope. -- The `WordPress.Security.ValidatedSanitizedInput` sniff will no longer throw errors when a variable is only being type tested. -- The `WordPress.Security.ValidatedSanitizedInput` sniff will now correctly recognize the null coalesce (PHP 7.0) and null coalesce equal (PHP 7.4) operators and will now throw errors for missing unslashing and sanitization where relevant. -- The `WordPress.WP.AlternativeFunctions` sniff will no longer recommend using the WP_FileSystem when PHP native input streams, like `php://input`, or the PHP input stream constants are being read or written to. -- The `WordPress.WP.AlternativeFunctions` sniff will no longer report on usage of the `curl_version()` function. -- The `WordPress.WP.CronInterval` sniff now has improved function recognition which should lower the chance of false positives. -- The `WordPress.WP.EnqueuedResources` sniff will no longer throw false positives for inline jQuery code trying to access a stylesheet link tag. -- Various bugfixes for the `Sniff::has_nonce_check()` method: - - The method will no longer incorrectly identify methods/namespaced functions mirroring the name of WP native nonce verification functions as if they were the global functions. - This will prevent some false negatives. - - The method will now skip over nested closed scopes, such as closures and anonymous classes. This should prevent some false negatives for nonce verification being done while not in the correct scope. - - These fixes affect the `WordPress.Security.NonceVerification` sniff. -- The `Sniff::is_in_isset_or_empty()` method now also checks for usage of `array_key_exist()` and `key_exists()` and will regard these as correct ways to validate a variable. - This should prevent false positives for the `WordPress.Security.ValidatedSanitizedInput` and the `WordPress.Security.NonceVerification` sniffs. -- Various bugfixes for the `Sniff::is_sanitized()` method: - - The method presumed the WordPress coding style regarding code layout, which could lead to false positives. - - The method will no longer incorrectly identify methods/namespaced functions mirroring the name of WP/PHP native unslashing/sanitization functions as if they were the global functions. - This will prevent some false negatives. - - The method will now recognize `map_deep()` for sanitizing an array via a callback to a sanitization function. This should prevent false positives. - - The method will now recognize `stripslashes_deep()` and `stripslashes_from_strings_only()` as valid unslashing functions. This should prevent false positives. - All these fixes affect both the `WordPress.Security.ValidatedSanitizedInput` and the `WordPress.Security.NonceVerification` sniff. -- Various bugfixes for the `Sniff::is_validated()` method: - - The method did not verify correctly whether a variable being validated was the same variable as later used which could lead to false negatives. - - The method did not verify correctly whether a variable being validated had the same array index keys as the variable as later used which could lead to both false negatives as well as false positives. - - The method now also checks for usage of `array_key_exist()` and `key_exists()` and will regard these as correct ways to validate a variable. This should prevent some false positives. - - The methods will now recognize the null coalesce and the null coalesce equal operators as ways to validate a variable. This prevents some false positives. - The results from the `WordPress.Security.ValidatedSanitizedInput` sniff should be more accurate because of these fixes. -- A potential "Undefined index" notice from the `Sniff::is_assignment()` method. - - -## [2.0.0] - 2019-01-16 - -### Important information about this release: - -WordPressCS 2.0.0 contains breaking changes, both for people using custom rulesets as well as for sniff developers who maintain a custom PHPCS standard based on WordPressCS. - -Support for `PHP_CodeSniffer` 2.x has been dropped, the new minimum `PHP_CodeSniffer` version is 3.3.1. -Also, all previously deprecated sniffs, properties and methods have been removed. - -Please read the complete changelog carefully before you upgrade. - -If you are a maintainer of an external standard based on WordPressCS and any of your custom sniffs are based on or extend WPCS sniffs, please read the [Developers Upgrade Guide to WordPressCS 2.0.0](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Upgrade-Guide-to-WordPressCS-2.0.0-for-Developers-of-external-standards). - -### Changes since 2.0.0-RC1 - -#### Fixed -- `WordPress-Extra`: Reverted back to including the `Squiz.WhiteSpace.LanguageConstructSpacing` sniff instead of the new `Generic.WhiteSpace.LanguageConstructSpacing` sniff as the new sniff is not (yet) available when the PEAR install of PHPCS is used. - -### Changes since 1.2.1 -For a full list of changes from the 1.2.1 version, please review the following changelog: -* https://github.com/WordPress/WordPress-Coding-Standards/releases/tag/2.0.0-RC1 - - -## [2.0.0-RC1] - 2018-12-31 - -### Important information about this release: - -This is the first release candidate for WordPressCS 2.0.0. -WordPressCS 2.0.0 contains breaking changes, both for people using custom rulesets as well as for sniff developers who maintain a custom PHPCS standard based on WordPressCS. - -Support for `PHP_CodeSniffer` 2.x has been dropped, the new minimum `PHP_CodeSniffer` version is 3.3.1. -Also, all previously deprecated sniffs, properties and methods have been removed. - -Please read the complete changelog carefully before you upgrade. - -If you are a maintainer of an external standard based on WordPressCS and any of your custom sniffs are based on or extend WPCS sniffs, please read the [Developers Upgrade Guide to WordPressCS 2.0.0](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Upgrade-Guide-to-WordPressCS-2.0.0-for-Developers-of-external-standards). - -### Added -- `Generic.PHP.DiscourageGoto`, `Generic.PHP.LowerCaseType`, `Generic.WhiteSpace.ArbitraryParenthesesSpacing` and `PSR12.Keywords.ShortFormTypeKeywords` to the `WordPress-Core` ruleset. -- Checking the spacing around the `instanceof` operator to the `WordPress.WhiteSpace.OperatorSpacing` sniff. - -### Changed -- The minimum required `PHP_CodeSniffer` version to 3.3.1 (was 2.9.0). -- The namespace used by WordPressCS has been changed from `WordPress` to `WordPressCS\WordPress`. - This was not possible while `PHP_CodeSniffer` 2.x was still supported, but WordPressCS, as a good Open Source citizen, does not want to occupy the `WordPress` namespace and is releasing its use of it now this is viable. -- The `WordPress.DB.PreparedSQL` sniff used the same error code for two different errors. - The `NotPrepared` error code remains, however an additional `InterpolatedNotPrepared` error code has been added for the second error. - If you are referencing the old error code in a ruleset XML file or in inline annotations, you may need to update it. -- The `WordPress.NamingConventions.PrefixAllGlobals` sniff used the same error code for some errors as well as warnings. - The `NonPrefixedConstantFound` error code remains for the related error, but the warning will now use the new `VariableConstantNameFound` error code. - The `NonPrefixedHooknameFound` error code remains for the related error, but the warning will now use the new `DynamicHooknameFound` error code. - If you are referencing the old error codes in a ruleset XML file or in inline annotations, you may need to update these to use the new codes instead. -- `WordPress.NamingConventions.ValidVariableName`: the error messages and error codes used by this sniff have been changed for improved usability and consistency. - - The error messages will now show a suggestion for a valid alternative name for the variable. - - The `NotSnakeCaseMemberVar` error code has been renamed to `UsedPropertyNotSnakeCase`. - - The `NotSnakeCase` error code has been renamed to `VariableNotSnakeCase`. - - The `MemberNotSnakeCase` error code has been renamed to `PropertyNotSnakeCase`. - - The `StringNotSnakeCase` error code has been renamed to `InterpolatedVariableNotSnakeCase`. - If you are referencing the old error codes in a ruleset XML file or in inline annotations, you may need to update these to use the new codes instead. -- The `WordPress.Security.NonceVerification` sniff used the same error code for both an error as well as a warning. - The old error code `NoNonceVerification` is no longer used. - The `error` now uses the `Missing` error code, while the `warning` now uses the `Recommended` error code. - If you are referencing the old error code in a ruleset XML file or in inline annotations, please update these to use the new codes instead. -- The `WordPress.WP.DiscouragedConstants` sniff used to have two error codes `UsageFound` and `DeclarationFound`. - These error codes will now be prefixed by the name of the constant found to allow for more fine-grained excluding/ignoring of warnings generated by this sniff. - If you are referencing the old error codes in a ruleset XML file or in inline annotations, you may need to update these to use the new codes instead. -- The `WordPress.WP.GlobalVariablesOverride.OverrideProhibited` error code has been replaced by the `WordPress.WP.GlobalVariablesOverride.Prohibited` error code. - If you are referencing the old error code in a ruleset XML file or in inline annotations, you may need to update it. -- `WordPress-Extra`: Replaced the inclusion of the `Generic.Files.OneClassPerFile`, `Generic.Files.OneInterfacePerFile` and the `Generic.Files.OneTraitPerFile` sniffs with the new `Generic.Files.OneObjectStructurePerFile` sniff. -- `WordPress-Extra`: Replaced the inclusion of the `Squiz.WhiteSpace.LanguageConstructSpacing` sniff with the new `Generic.WhiteSpace.LanguageConstructSpacing` sniff. -- `WordPress-Extra`: Replaced the inclusion of the `Squiz.Scope.MemberVarScope` sniff with the more comprehensive `PSR2.Classes.PropertyDeclaration` sniff. -- `WordPress.NamingConventions.ValidFunctionName`: Added a unit test confirming support for interfaces extending multiple interfaces. -- `WordPress.NamingConventions.ValidVariableName`: Added unit tests confirming support for multi-variable/property declarations. -- The `get_name_suggestion()` method has been moved from the `WordPress.NamingConventions.ValidFunctionName` sniff to the base `Sniff` class, renamed to `get_snake_case_name_suggestion()` and made static. -- The rulesets are now validated against the `PHP_CodeSniffer` XSD schema. -- Updated the [custom ruleset example](https://github.com/WordPress/WordPress-Coding-Standards/blob/develop/phpcs.xml.dist.sample) to use the recommended ruleset syntax for `PHP_CodeSniffer` 3.3.1+, including using the new [array property format](https://github.com/PHPCSStandards/PHP_CodeSniffer/releases/tag/3.3.0) which is now supported. -- Dev: The command to run the unit tests has changed. Please see the updated instructions in the [CONTRIBUTING.md](https://github.com/WordPress/WordPress-Coding-Standards/blob/develop/.github/CONTRIBUTING.md) file. - The `bin/pre-commit` example git hook has been updated to match. Additionally a `run-tests` script has been added to the `composer.json` file for your convenience. - To facilitate this, PHPUnit has been added to `require-dev`, even though it is strictly speaking a dependency of PHPCS, not of WPCS. -- Dev: The [Composer PHPCS plugin] has been added to `require-dev`. -- Various code tweaks and clean up. -- User facing documentation, including the wiki, as well as inline documentation has been updated for all the changes contained in WordPressCS 2.0 and other recommended best practices for `PHP_CodeSniffer` 3.3.1+. - -### Deprecated -- The use of the [WordPressCS native whitelist comments](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Whitelisting-code-which-flags-errors), which were introduced in WPCS 0.4.0, have been deprecated and support will be removed in WPCS 3.0.0. - The WordPressCS native whitelist comments will continue to work for now, but a deprecation warning will be thrown when they are encountered. - You are encouraged to upgrade our whitelist comment to use the [PHPCS native selective ignore annotations](https://github.com/PHPCSStandards/PHP_CodeSniffer/releases/tag/3.2.0) as introduced in `PHP_CodeSniffer` 3.2.0, as soon as possible. - -### Removed -- Support for PHP 5.3. PHP 5.4 is the minimum requirement for `PHP_CodeSniffer` 3.x. - Includes removing any and all workarounds which were in place to still support PHP 5.3. -- Support for `PHP_CodeSniffer` < 3.3.1. - Includes removing any and all workarounds which were in place for supporting older `PHP_CodeSniffer` versions. -- The `WordPress-VIP` standard which was deprecated since WordPressCS 1.0.0. - For checking a theme/plugin for hosting on the WordPress.com VIP platform, please use the [Automattic VIP coding standards](https://github.com/Automattic/VIP-Coding-Standards) instead. -- Support for array properties set in a custom ruleset without the `type="array"` attribute. - Support for this was deprecated in WPCS 1.0.0. - If in doubt about how properties should be set in your custom ruleset, please refer to the [Customizable sniff properties](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Customizable-sniff-properties) wiki page which contains XML code examples for setting each and every WPCS native sniff property. - As the minimum `PHP_CodeSniffer` version is now 3.3.1, you can now also use the [new format for setting array properties](https://github.com/PHPCSStandards/PHP_CodeSniffer/releases/tag/3.3.0), so this would be a great moment to review and update your custom ruleset. - Note: the ability to set select properties from the command-line as comma-delimited strings is _not_ affected by this change. -- The following sniffs have been removed outright without deprecation. - If you are referencing these sniffs in a ruleset XML file or in inline annotations, please update these to reference the replacement sniffs instead. - - `WordPress.Functions.FunctionCallSignatureNoParams` - superseded by a bug fix in the upstream `PEAR.Functions.FunctionCallSignature` sniff. - - `WordPress.PHP.DiscourageGoto` - replaced by the same sniff which is now available upstream: `Generic.PHP.DiscourageGoto`. - - `WordPress.WhiteSpace.SemicolonSpacing` - superseded by a bug fix in the upstream `Squiz.WhiteSpace.SemicolonSpacing` sniff. - - `WordPress.WhiteSpace.ArbitraryParenthesesSpacing` - replaced by the same sniff which is now available upstream: `Generic.WhiteSpace.ArbitraryParenthesesSpacing`. -- The following "base" sniffs which were previously already deprecated and turned into abstract base classes, have been removed: - - `WordPress.Arrays.ArrayAssignmentRestrictions` - use the `AbstractArrayAssignmentRestrictionsSniff` class instead. - - `WordPress.Functions.FunctionRestrictions` - use the `AbstractFunctionRestrictionsSniff` class instead. - - `WordPress.Variables.VariableRestrictions` without replacement. -- The following sniffs which were previously deprecated, have been removed: - - `WordPress.Arrays.ArrayDeclaration` - use the other sniffs in the `WordPress.Arrays` category instead. - - `WordPress.CSRF.NonceVerification` - use `WordPress.Security.NonceVerification` instead. - - `WordPress.Functions.DontExtract` - use `WordPress.PHP.DontExtract` instead. - - `WordPress.Variables.GlobalVariables` - use `WordPress.WP.GlobalVariablesOverride` instead. - - `WordPress.VIP.CronInterval` - use `WordPress.WP.CronInterval` instead. - - `WordPress.VIP.DirectDatabaseQuery` - use `WordPress.DB.DirectDatabaseQuery` instead. - - `WordPress.VIP.PluginMenuSlug` - use `WordPress.Security.PluginMenuSlug` instead. - - `WordPress.VIP.SlowDBQuery` - use `WordPress.DB.SlowDBQuery` instead. - - `WordPress.VIP.TimezoneChange` - use `WordPress.WP.TimezoneChange` instead. - - `WordPress.VIP.ValidatedSanitizedInput` - use `WordPress.Security.ValidatedSanitizedInput` instead. - - `WordPress.WP.PreparedSQL` - use `WordPress.DB.PreparedSQL` instead. - - `WordPress.XSS.EscapeOutput` - use `WordPress.Security.EscapeOutput` instead. - - `WordPress.PHP.DiscouragedFunctions` without direct replacement. - The checks previously contained in this sniff were moved to separate sniffs in WPCS 0.11.0. - - `WordPress.Variables.VariableRestrictions` without replacement. - - `WordPress.VIP.AdminBarRemoval` without replacement. - - `WordPress.VIP.FileSystemWritesDisallow` without replacement. - - `WordPress.VIP.OrderByRand` without replacement. - - `WordPress.VIP.PostsPerPage` without replacement. - Part of the previous functionality was split off in WPCS 1.0.0 to the `WordPress.WP.PostsPerPage` sniff. - - `WordPress.VIP.RestrictedFunctions` without replacement. - - `WordPress.VIP.RestrictedVariables` without replacement. - - `WordPress.VIP.SessionFunctionsUsage` without replacement. - - `WordPress.VIP.SessionVariableUsage` without replacement. - - `WordPress.VIP.SuperGlobalInputUsage` without replacement. -- The `WordPress.DB.SlowDBQuery.DeprecatedWhitelistFlagFound` error code which is superseded by the blanket deprecation warning for using the now deprecated WPCS native whitelist comments. -- The `WordPress.PHP.TypeCasts.NonLowercaseFound` error code which has been replaced by the upstream `Generic.PHP.LowerCaseType` sniff. -- The `WordPress.PHP.TypeCasts.LongBoolFound` and `WordPress.PHP.TypeCasts.LongIntFound` error codes which has been replaced by the new upstream `PSR12.Keywords.ShortFormTypeKeywords` sniff. -- The `WordPress.Security.EscapeOutput.OutputNotEscapedShortEcho` error code which was only ever used if WPCS was run on PHP 5.3 with the `short_open_tag` ini directive set to `off`. -- The following sniff categories which were previously deprecated, have been removed, though select categories may be reinstated in the future: - - `CSRF` - - `Functions` - - `Variables` - - `VIP` - - `XSS` -- `WordPress.NamingConventions.ValidVariableName`: The `customVariableWhitelist` property, which had been deprecated since WordPressCS 0.11.0. Use the `customPropertiesWhitelist` property instead. -- `WordPress.Security.EscapeOutput`: The `customSanitizingFunctions` property, which had been deprecated since WordPressCS 0.5.0. Use the `customEscapingFunctions` property instead. -- `WordPress.Security.NonceVerification`: The `errorForSuperGlobals` and `warnForSuperGlobals` properties, which had been deprecated since WordPressCS 0.12.0. -- The `vip_powered_wpcom` function from the `Sniff::$autoEscapedFunctions` list which is used by the `WordPress.Security.EscapeOutput` sniff. -- The `AbstractVariableRestrictionsSniff` class, which was deprecated since WordPressCS 1.0.0. -- The `Sniff::has_html_open_tag()` utility method, which was deprecated since WordPressCS 1.0.0. -- The internal `$php_reserved_vars` property from the `WordPress.NamingConventions.ValidVariableName` sniff in favor of using a PHPCS native property which is now available. -- The class aliases and WPCS native autoloader used for PHPCS cross-version support. -- The unit test framework workarounds for PHPCS cross-version unit testing. -- Support for the `@codingStandardsChangeSetting` annotation, which is generally only used in unit tests. -- The old generic GitHub issue template which was replaced by more specific issue templates in WPCS 1.2.0. - -### Fixed -- Support for PHP 7.3. - `PHP_CodeSniffer` < 3.3.1 was not fully compatible with PHP 7.3. Now the minimum required PHPCS has been upped to `PHP_CodeSniffer` 3.3.1, WordPressCS will run on PHP 7.3 without issue. -- `WordPress.Arrays.ArrayDeclarationSpacing`: improved fixing of the placement of array items following an array item with a trailing multi-line comment. -- `WordPress.NamingConventions.ValidFunctionName`: the sniff will no longer throw false positives nor duplicate errors for methods declared in nested anonymous classes. - The error message has also been improved for methods in anonymous classes. -- `WordPress.NamingConventions.ValidFunctionName`: the sniff will no longer throw false positives for PHP 4-style class constructors/destructors where the name of the constructor/destructor method did not use the same case as the class name. - - -## [1.2.1] - 2018-12-18 - -Note: This will be the last release supporting PHP_CodeSniffer 2.x. - -### Changed -- The default value for `minimum_supported_wp_version`, as used by a [number of sniffs detecting usage of deprecated WP features](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Customizable-sniff-properties#minimum-wp-version-to-check-for-usage-of-deprecated-functions-classes-and-function-parameters), has been updated to `4.7`. -- The `WordPress.NamingConventions.PrefixAllGlobals` sniff will now report the error for hook names and constant names declared with `define()` on the line containing the parameter for the hook/constant name. Previously, it would report the error on the line containing the function call. -- Various minor housekeeping fixes to inline documentation, rulesets, code. - -### Removed -- `comment_author_email_link()`, `comment_author_email()`, `comment_author_IP()`, `comment_author_link()`, `comment_author_rss()`, `comment_author_url_link()`, `comment_author_url()`, `comment_author()`, `comment_date()`, `comment_excerpt()`, `comment_form_title()`, `comment_form()`, `comment_id_fields()`, `comment_ID()`, `comment_reply_link()`, `comment_text_rss()`, `comment_text()`, `comment_time()`, `comment_type()`, `comments_link()`, `comments_number()`, `comments_popup_link()`, `comments_popup_script()`, `comments_rss_link()`, `delete_get_calendar_cache()`, `edit_bookmark_link()`, `edit_comment_link()`, `edit_post_link()`, `edit_tag_link()`, `get_footer()`, `get_header()`, `get_sidebar()`, `get_the_title()`, `next_comments_link()`, `next_image_link()`, `next_post_link()`, `next_posts_link()`, `permalink_anchor()`, `posts_nav_link()`, `previous_comments_link()`, `previous_image_link()`, `previous_post_link()`, `previous_posts_link()`, `sticky_class()`, `the_attachment_link()`, `the_author_link()`, `the_author_meta()`, `the_author_posts_link()`, `the_author_posts()`, `the_category_rss()`, `the_category()`, `the_content_rss()`, `the_content()`, `the_date_xml()`, `the_excerpt_rss()`, `the_excerpt()`, `the_feed_link()`, `the_ID()`, `the_meta()`, `the_modified_author()`, `the_modified_date()`, `the_modified_time()`, `the_permalink()`, `the_post_thumbnail()`, `the_search_query()`, `the_shortlink()`, `the_tags()`, `the_taxonomies()`, `the_terms()`, `the_time()`, `the_title_rss()`, `the_title()`, `wp_enqueue_script()`, `wp_meta()`, `wp_shortlink_header()` and `wp_shortlink_wp_head()` from the list of auto-escaped functions `Sniff::$autoEscapedFunctions`. This affects the `WordPress.Security.EscapeOutput` sniff. - -### Fixed -- The `WordPress.WhiteSpace.PrecisionAlignment` sniff would loose the value of a custom set `ignoreAlignmentTokens` property when scanning more than one file. - - -## [1.2.0] - 2018-11-12 - -### Added -- New `WordPress.PHP.TypeCasts` sniff to the `WordPress-Core` ruleset. - This new sniff checks that PHP type casts are: - * lowercase; - * short form, i.e. `(bool)` not `(boolean)`; - * normalized, i.e. `(float)` not `(real)`. - Additionally, the new sniff discourages the use of the `(unset)` and `(binary)` type casts. -- New `WordPress.Utils.I18nTextDomainFixer` sniff which can compehensively replace/add `text-domain`s in a plugin or theme. - Important notes: - - This sniff is disabled by default and intended as a utility tool. - - The sniff will fix the text domains in all I18n function calls as well as in a plugin/theme `Text Domain:` header. - - Passing the following properties will activate the sniff: - - `old_text_domain`: an array with one or more (old) text domains which need to be replaced; - - `new_text_domain`: the correct (new) text domain as a string. -- The `WordPress.NamingConventions.PrefixAllGlobals` sniff will now also verify that namespace names use a valid prefix. - * The sniff allows for underscores and (other) non-word characters in a passed prefix to be converted to namespace separators when used in a namespace name. - In other words, if a prefix of `my_plugin` is passed as a value to the `prefixes` property, a namespace name of both `My\Plugin` as well as `My_Plugin\\`, will be accepted automatically. - * Passing a prefix property value containing namespace separators will now also be allowed and will no longer trigger a warning. -- `WordPress` to the prefix blacklist for the `WordPress.NamingConventions.PrefixAllGlobals` sniff. - While the prefix cannot be `WordPress`, a prefix can still _start with_ or _contain_ `WordPress`. -- Additional unit tests covering a change in the tokenizer which will be included in the upcoming `PHP_CodeSniffer` 3.4.0 release. -- A variety of issue templates for use on GitHub. - -### Changed -- The `Sniff::valid_direct_scope()` method will now return the `$stackPtr` to the valid scope if a valid direct scope has been detected. Previously, it would return `true`. -- Minor hardening and efficiency improvements to the `WordPress.NamingConventions.PrefixAllGlobals` sniff. -- The inline documentation of the `WordPress-Core` ruleset has been updated to be in line again with [the handbook](https://developer.wordpress.org/coding-standards/wordpress-coding-standards/php/). -- The inline links to documentation about the VIP requirements have been updated. -- Updated the [custom ruleset example](https://github.com/WordPress/WordPress-Coding-Standards/blob/develop/phpcs.xml.dist.sample) to recommend using `PHPCompatibilityWP` rather than `PHPCompatibility`. -- All sniffs are now also being tested against PHP 7.3 for consistent sniff results. - Note: PHP 7.3 is only supported in combination with PHPCS 3.3.1 or higher as `PHP_CodeSniffer` itself has an incompatibility in earlier versions. -- Minor grammar fixes in text strings and documentation. -- Minor consistency improvement for the unit test case files. -- Minor tweaks to the `composer.json` file. -- Updated the PHPCompatibility `dev` dependency. - -### Removed -- The `WordPress.WhiteSpace.CastStructureSpacing.NoSpaceAfterCloseParenthesis` error code as an error for the same issue was already being thrown by an included upstream sniff. - -### Fixed -- The `WordPress.CodeAnalysis.EmptyStatement` would throw a false positive for an empty condition in a `for()` statement. -- The `Sniff::is_class_property()` method could, in certain circumstances, incorrectly recognize parameters in a method declaration as class properties. It would also, incorrectly, fail to recognize class properties when the object they are declared in, was nested in parentheses. - This affected, amongst others, the `GlobalVariablesOverride` sniff. -- The `Sniff::get_declared_namespace_name()` method could get confused over whitespace and comments within a namespace name, which could lead to incorrect results (mostly underreporting). - This affected, amongst others, the `GlobalVariablesOverride` sniff. - The return value of the method will now no longer contain any whitespace or comments encountered. -- The `Sniff::has_whitelist_comment()` method would sometimes incorrectly regard `// phpcs:set` comments as whitelist comments. - -## [1.1.0] - 2018-09-10 - -### Added -- New `WordPress.PHP.NoSilencedErrors` sniff. This sniff replaces the `Generic.PHP.NoSilencedErrors` sniff which was previously used and included in the `WordPress-Core` ruleset. - The WordPress specific version of the sniff differs from the PHPCS version in that it: - * Allows the error control operator `@` if it precedes a function call to a limited list of PHP functions for which no amount of error checking can prevent a PHP warning from being thrown. - * Allows for a used-defined list of (additional) function names to be passed to the sniff via the `custom_whitelist` property in a custom ruleset, for which - if the error control operator is detected in front of a function call to one of the functions in this whitelist - no warnings will be thrown. - * Displays a brief snippet of code in the `warning` message text to show the context in which the error control operator is being used. The length of the snippet (in tokens) can be customized via the `context_length` property. - * Contains a public `use_default_whitelist` property which can be set from a custom ruleset which regulates whether or not the standard whitelist of PHP functions should be used by the sniff. - The user-defined whitelist will always be respected. - By default, this property is set to `true` for the `WordPress-Core` ruleset and to `false` for the `WordPress-Extra` ruleset (which is stricter regarding these kind of best practices). -- Metrics to the `WordPress.NamingConventions.PrefixAllGlobals` sniff to aid people in determining the most commonly used prefix in a legacy project. - For an example of how to use this feature, please see the detailed explanation in the [pull request](https://github.com/WordPress/WordPress-Coding-Standards/pull/1437). - -### Changed -- The `PEAR.Functions.FunctionCallSignature` sniff, which is part of the `WordPress-Core` ruleset, used to allow multiple function call parameters per line in multi-line function calls. This will no longer be allowed. - As of this release, if a function call is multi-line, each parameter should start on a new line and an `error` will be thrown if the code being analyzed does not comply with that rule. - The sniff behavior for single-line function calls is not affected by this change. -- Moved the `WordPress.CodeAnalysis.EmptyStatement` sniff from the `WordPress-Extra` to the `WordPress-Core` ruleset. -- Moved the `Squiz.PHP.CommentedOutCode` sniff from the `WordPress-Docs` to the `WordPress-Extra` ruleset and lowered the threshold for determining whether or not a comment is commented out code from 45% to 40%. -- The `WordPress.NamingConventions.PrefixAllGlobals` sniff now has improved support for recognizing whether or not (non-prefixed) globals are declared in the context of unit tests. -- The `is_foreach_as()` method has been moved from the `GlobalVariablesOverrideSniff` class to the WordPress `Sniff` base class. -- The `Sniff::is_token_in_test_method()` utility method now has improved support for recognizing test methods in anonymous classes. -- Minor efficiency improvement to the `Sniff::is_safe_casted()` method. -- CI: Minor tweaks to the Travis script. -- CI: Improved Composer scripts for use by WPCS developers. -- Dev: Removed IDE specific files from `.gitignore`. -- Readme: Improved the documentation about the project history and the badge display. - -### Fixed -- The `WordPress.Security.ValidatedSanitizedInput` sniff will now recognize array keys in superglobals independently of the string quote-style used for the array key. -- The `WordPress.WhiteSpace.PrecisionAlignment` sniff will no longer throw false positives for DocBlocks for JavaScript functions within inline HTML. -- `WordPress.WP.DeprecatedClasses`: The error codes for this sniff were unstable as they were based on the code being analyzed instead of on fixed values. -- Various bugfixes for the `WordPress.WP.GlobalVariablesOverride` sniff: - - Previously, the sniff only checked variables in the global namespace when a `global` statement would be encountered. As of now, all variable assignments in the global namespace will be checked. - - Nested functions/closures/classes which don't import the global variable will now be skipped over when encountered within another function, preventing false positives. - - Parameters in function declarations will no longer throw false positives. - - The error message for assignments to a subkey of the `$GLOBALS` superglobal has been improved. - - Various efficiency improvements. -- The `Sniff::is_in_isset_or_empty()` method presumed the WordPress coding style regarding code layout, which could lead to incorrect results (mostly underreporting). - This affected, amongst others, the `WordPress.Security.ValidatedSanitizedInput` sniff. -- Broken links in the inline developer documentation. - - -## [1.0.0] - 2018-07-25 - -### Important information about this release: - -If you use the WordPress Coding Standards with a custom ruleset, please be aware that a number of sniffs have been moved between categories and that the old sniff names have been deprecated. -If you selectively include any of these sniffs in your custom ruleset or set custom property values for these sniffs, your custom ruleset will need to be updated. - -The `WordPress-VIP` ruleset has also been deprecated. If you used that ruleset to check your theme/plugin for hosting on the WordPress.com VIP platform, please use the [Automattic VIP coding standards](https://github.com/Automattic/VIP-Coding-Standards) instead. -If you used that ruleset for any other reason, you should probably use the `WordPress-Extra` or `WordPress` ruleset instead. - -These and some related changes have been annotated in detail in the `Deprecated` section of this changelog. - -Please read the complete changelog carefully before you upgrade. - -If you are a maintainer of an external standard based on WPCS and any of your custom sniffs are based on or extend WPCS sniffs, the same applies. - -### Added -- `WordPress.PHP.PregQuoteDelimiter` sniff to the `WordPress-Extra` ruleset to warn about calls to `preg_quote()` which don't pass the `$delimiter` parameter. -- `WordPress.Security.SafeRedirect` sniff to the `WordPress-Extra` ruleset to warn about potential open redirect vulnerabilities. -- `WordPress.WP.DeprecatedParameterValues` sniff to the `WordPress-Extra` ruleset to detect deprecated parameter values being passed to select functions. -- `WordPress.WP.EnqueuedResourceParameters` sniff to the `WordPress-Extra` ruleset to detect: - - Calls to the script/style register/enqueue functions which don't pass a `$version` for the script/style, which can cause issues with browser caching; and/or - - Calls to the register/enqueue script functions which don't pass the `$in_footer` parameter, which causes scripts - by default - to be loaded in the HTML header in a layout rendering blocking manner. -- Detection of calls to `strip_tags()` and various PHP native `..rand()` functions to the `WordPress.WP.AlternativeFunctions` sniff. -- `readonly()` to the list of auto-escaped functions `Sniff::$autoEscapedFunctions`. This affects the `WordPress.Security.EscapeOutput` sniff. -- The `WordPress.Security.PluginMenuSlug`, `WordPress.WP.CronInterval`, `WordPress.WP.PostsPerPage` and `WordPress.WP.TimezoneChange` sniffs are now included in the `WordPress-Extra` ruleset. Previously, they were already included in the `WordPress` and `WordPress-VIP` rulesets. -- New utility method `Sniff::is_use_of_global_constant()`. -- A rationale to the package suggestion made via `composer.json`. -- CI: Validation of the `composer.json` file on each build. -- A wiki page with instructions on how to [set up WordPressCS to run with Eclipse on XAMPP](https://github.com/WordPress/WordPress-Coding-Standards/wiki/How-to-use-WordPressCS-with-Eclipse-and-XAMPP). -- Readme: A link to an external resource with more examples for setting up PHPCS for CI. -- Readme: A badge-based quick overview of the project. - -### Changed -- The `WordPress` ruleset no longer includes the `WordPress-VIP` ruleset, nor does it include any of the (deprecated) `VIP` sniffs anymore. -- The following sniffs have been moved to a new category: - - `CronInterval` from the `VIP` category to the `WP` category. - - `DirectDatabaseQuery` from the `VIP` category to the `DB` category. - - `DontExtract` from the `Functions` category to the `PHP` category. - - `EscapeOutput` from the `XSS` category to the `Security` category. - - `GlobalVariables` from the `Variables` category to the `WP` category. - - `NonceVerification` from the `CSRF` category to the `Security` category. - - `PluginMenuSlug` from the `VIP` category to the `Security` category. - - `PreparedSQL` from the `WP` category to the `DB` category. - - `SlowDBQuery` from the `VIP` category to the `DB` category. - - `TimezoneChange` from the `VIP` category to the `WP` category. - - `ValidatedSanitizedInput` from the `VIP` category to the `Security` category. -- The `WordPress.VIP.PostsPerPage` sniff has been split into two distinct sniffs: - - `WordPress.WP.PostsPerPage` which will check for the use of a high pagination limit and will throw a `warning` when this is encountered. For the `VIP` ruleset, the error level remains `error`. - - `WordPress.VIP.PostsPerPage` which will check for disabling of pagination. -- The default value for `minimum_supported_wp_version`, as used by a [number of sniffs detecting usage of deprecated WP features](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Customizable-sniff-properties#minimum-wp-version-to-check-for-usage-of-deprecated-functions-classes-and-function-parameters), has been updated to `4.6`. -- The `WordPress.WP.AlternativeFunctions` sniff will now only throw a warning if/when the recommended alternative function is available in the minimum supported WP version of a project. - In addition to this, certain alternatives are only valid alternatives in certain circumstances, like when the WP version only supports the first parameter of the PHP function it is trying to replace. - This will now be taken into account for: - - `wp_strip_all_tags()` is only a valid alternative for the PHP native `strip_tags()` when the second parameter `$allowed_tags` has not been passed. - - `wp_parse_url()` only added support for the second parameter `$component` of the PHP native `parse_url()` function in WP 4.7.0. -- The `WordPress.WP.DeprecatedFunctions` sniff will now detect functions deprecated in WP 4.9. -- The `WordPress.WP.GlobalVariablesOverride` sniff will now display the name of the variable being overridden in the error message. -- The `WordPress.WP.I18n` sniff now extends the `AbstractFunctionRestrictionSniff`. -- Assignments in conditions in ternaries as detected by the `WordPress.CodeAnalysis.AssignmentInCondition` sniff will now be reported under a separate error code `FoundInTernaryCondition`. -- The default error level for the notices from the `WordPress.DB.DirectDatabaseQuery` sniff has been lowered from `error` to `warning`. For the `VIP` ruleset, the error level remains `error`. -- The default error level for the notices from the `WordPress.Security.PluginMenuSlug` sniff has been lowered from `error` to `warning`. For the `VIP` ruleset, the error level remains `error`. -- The default error level for the notices from the `WordPress.WP.CronInterval` sniff has been lowered from `error` to `warning`. For the `VIP` ruleset, the error level remains `error`. -- The `Sniff::get_function_call_parameters()` utility method now has improved handling of closures when passed as function call parameters. -- Rulesets: a number of error codes were previously silenced by explicitly `exclude`-ing them. Now, they will be silenced by setting the `severity` to `0` which makes it more easily discoverable for maintainers of custom rulesets how to enable these error codes again. -- Various performance optimizations which should most notably make a difference when running WPCS on PHP 7. -- References to the WordPress.com VIP platform have been clarified. -- Unit Tests: custom properties set in unit test files are reset after use. -- Various improvements to the ruleset used by the WPCS project itself and minor code clean up related to this. -- CI: Each change will now also be tested against the lowest supported PHPCS 3 version. -- CI: Each change will now also be checked for PHP cross-version compatibility. -- CI: The rulesets will now also be tested on each change to ensure no unexpected messages are thrown. -- CI: Minor changes to the script to make the build testing faster. -- Updated the [custom ruleset example](https://github.com/WordPress/WordPress-Coding-Standards/blob/develop/phpcs.xml.dist.sample) for the changes contained in this release and to reflect current best practices regarding the PHPCompatibility standard. -- The instructions on how to set up WPCS for various IDEs have been moved from the `README` to the [wiki](https://github.com/WordPress/WordPress-Coding-Standards/wiki). -- Updated output examples in `README.md` and `CONTRIBUTING.md` and other minor changes to these files. -- Updated references to the PHPCompatibility standard to reflect its new location and recommend using PHPCompatibilityWP. - -### Deprecated -- The `WordPress-VIP` ruleset has been deprecated. - For checking a theme/plugin for hosting on the WordPress.com VIP platform, please use the [Automattic VIP coding standards](https://github.com/Automattic/VIP-Coding-Standards) instead. - If you used the `WordPress-VIP` ruleset for any other reason, you should probably use the `WordPress-Extra` or `WordPress` ruleset instead. -- The following sniffs have been deprecated and will be removed in WPCS 2.0.0: - - `WordPress.CSRF.NonceVerification` - use `WordPress.Security.NonceVerification` instead. - - `WordPress.Functions.DontExtract` - use `WordPress.PHP.DontExtract` instead. - - `WordPress.Variables.GlobalVariables` - use `WordPress.WP.GlobalVariablesOverride` instead. - - `WordPress.VIP.CronInterval` - use `WordPress.WP.CronInterval` instead. - - `WordPress.VIP.DirectDatabaseQuery` - use `WordPress.DB.DirectDatabaseQuery` instead. - - `WordPress.VIP.PluginMenuSlug` - use `WordPress.Security.PluginMenuSlug` instead. - - `WordPress.VIP.SlowDBQuery` - use `WordPress.DB.SlowDBQuery` instead. - - `WordPress.VIP.TimezoneChange` - use `WordPress.WP.TimezoneChange` instead. - - `WordPress.VIP.ValidatedSanitizedInput` - use `WordPress.Security.ValidatedSanitizedInput` instead. - - `WordPress.WP.PreparedSQL` - use `WordPress.DB.PreparedSQL` instead. - - `WordPress.XSS.EscapeOutput` - use `WordPress.Security.EscapeOutput` instead. - - `WordPress.VIP.AdminBarRemoval` without replacement. - - `WordPress.VIP.FileSystemWritesDisallow` without replacement. - - `WordPress.VIP.OrderByRand` without replacement. - - `WordPress.VIP.RestrictedFunctions` without replacement. - - `WordPress.VIP.RestrictedVariables` without replacement. - - `WordPress.VIP.SessionFunctionsUsage` without replacement. - - `WordPress.VIP.SessionVariableUsage` without replacement. - - `WordPress.VIP.SuperGlobalInputUsage` without replacement. -- The following sniff categories have been deprecated and will be removed in WPCS 2.0.0: - - `CSRF` - - `Variables` - - `XSS` -- The `posts_per_page` property in the `WordPress.VIP.PostsPerPage` sniff has been deprecated as the related functionality has been moved to the `WordPress.WP.PostsPerPage` sniff. - See [WP PostsPerPage: post limit](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Customizable-sniff-properties#wp-postsperpage-post-limit) for more information about this property. -- The `exclude` property which is available to most sniffs which extend the `AbstractArrayAssignmentRestrictions`, `AbstractFunctionRestrictions` and `AbstractVariableRestrictions` classes or any of their children, used to be a `string` property and expected a comma-delimited list of groups to exclude. - The type of the property has now been changed to `array`. Custom rulesets which pass this property need to be adjusted to reflect this change. - Support for passing the property as a comma-delimited string has been deprecated and will be removed in WPCS 2.0.0. - See [Excluding a group of checks](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Customizable-sniff-properties#excluding-a-group-of-checks) for more information about the sniffs affected by this change. -- The `AbstractVariableRestrictionsSniff` class has been deprecated as all sniffs depending on this class have been deprecated. Unless a new sniff is created in the near future which uses this class, the abstract class will be removed in WPCS 2.0.0. -- The `Sniff::has_html_open_tag()` utility method has been deprecated as it is now only used by deprecated sniffs. The method will be removed in WPCS 2.0.0. - -### Removed -- `cancel_comment_reply_link()`, `get_bookmark()`, `get_comment_date()`, `get_comment_time()`, `get_template_part()`, `has_post_thumbnail()`, `is_attachment()`, `post_password_required()` and `wp_attachment_is_image()` from the list of auto-escaped functions `Sniff::$autoEscapedFunctions`. This affects the `WordPress.Security.EscapeOutput` sniff. -- WPCS no longer explicitly supports HHVM and builds are no longer tested against HHVM. - For now, running WPCS on HHVM to test PHP code may still work for a little while, but HHVM has announced they are [dropping PHP support](https://hhvm.com/blog/2017/09/18/the-future-of-hhvm.html). - -### Fixed -- Compatibility with PHP 7.3. A change in PHP 7.3 was causing the `WordPress.DB.RestrictedClasses`, `WordPress.DB.RestrictedFunctions` and the `WordPress.WP.AlternativeFunctions` sniffs to fail to correctly detect issues. -- Compatibility with the latest releases from [PHP_CodeSniffer](https://github.com/PHPCSStandards/PHP_CodeSniffer). - PHPCS 3.2.0 introduced new annotations which can be used inline to selectively disable/ignore certain sniffs. - **Note**: The initial implementation of the new annotations was buggy. If you intend to start using these new style annotations, you are strongly advised to use PHPCS 3.3.0 or higher. - For more information about these annotations, please refer to the [PHPCS Wiki](https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki/Advanced-Usage#ignoring-parts-of-a-file). - - The [WPCS native whitelist comments](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Whitelisting-code-which-flags-errors) can now be combined with the new style PHPCS whitelist annotations in the `-- for reasons` part of the annotation. - - `WordPress.Arrays.ArrayDeclarationSpacing`: the fixer will now handle the new style annotations correctly. - - `WordPress.Arrays.CommaAfterArrayItem`: prevent a fixer loop when new style annotations are encountered. - - `WordPress.Files.FileName`: respect the new style annotations if these would selectively disable this sniff. - - `WordPress.WhiteSpace.ControlStructureSpacing`: handle the new style annotations correctly for the "blank line at the start/end of control structure" checks and prevent a fixer conflict when the new style annotations are encountered. - - `WordPress.WhiteSpace.PrecisionAlignment`: allow for checking of for precision alignment on lines containing new style annotations when `phpcs` is run with `--ignore-annotations`. -- The `Sniff::is_test_class()` method now has improved recognition of namespaced test classes. - This positively affects the `WordPress.Files.FileName`, `WordPress.NamingConventions.PrefixAllGlobals` and `WordPress.WP.GlobalVariablesOverride` sniffs, which each allow for test classes to (partially) not comply with the rules these sniffs check for. - This fixes the following bugs: - - Namespaced classes where the classname was one of the whitelisted global classes would incorrectly be recognized as a test class, even though they were not the same class. - This also happened if a namespaced class `extend`ed one of the whitelisted global classes. - - A namespaced custom test class where the name was split between the namespace declaration and the extended class declaration was not correctly recognized as the whitelisted test class. - - A namespaced test class which extended another class using a FQCN prefixed with a `\\` would not be correctly recognized. - - The `custom_test_class_whitelist` property which is available for each of these sniffs expects to be passed a Fully Qualified Class Name. FQCNs prefixed with a global namespace indicator will now be correctly handled. -- The determination of whether a `T_STRING` is a function call or not has been improved in the `AbstractFunctionRestrictions` class. This improvement benefits all sniffs which extend this abstract and any of its children (> 10 sniffs) and fixes the following false positives: - - Class declarations will no longer be confused with function calls. - - Use statement alias declarations will no longer be confused with function calls. -- Various bugs in the `WordPress.Arrays.ArrayIndentation` sniff: - - The sniff will no longer throw false positives or try to fix multi-line text strings where the closing quote is on a line by itself. - - The sniff would go into a fixer loop when it encountered a multi-line trailing comment after an array item. -- The `WordPress.CodeAnalysis.AssignmentInCondition` was throwing false positives for ternaries in nested, but unrelated, parentheses. -- The `WordPress.CodeAnalysis.EmptyStatement` and `WordPress.Files.FileName` sniffs underreported as they did not take PHP short open echo tags into account. -- Various bugs in the `WordPress.NamingConventions.PrefixAllGlobals` sniff: - - Parameters in a closure declaration were incorrectly being regarded as global variables. - - Non-prefixed variables created by a `foreach()` construct in the global namespace were previously not detected. - - Non-prefixed globals found in namespaced test classes should be ignored by the sniff, but were not. - - Definition of non-prefixed global WP constants which are intended to be overruled, should not trigger an error from this sniff. - - The sniff presumed the WP naming conventions for PHP constructs, while it should check for the construct being prefixed regardless of whether camelCase, PascalCase, snake_case or other naming conventions are used. - - The sniff presumed the WP naming conventions for prefixes used in hook names. The sniff will now be more tolerant when non-conventional word separators are used in prefixes for hooks. -- The `WordPress.NamingConventions.ValidFunctionName` sniff no longer "hides" one message behind another. The sniff will now correctly throw a message about function names not being in `snake_case`, even when the `FunctionDoubleUnderscore` or `MethodDoubleUnderscore` error codes have been excluded. -- The `WordPress.PHP.StrictInArray` sniff will no longer throw an error when `in_array`, `array_search` or `array_keys` are used in a file `use` statement. -- Various bugs in the `WordPress.Security.EscapeOutput` sniff: - - A limited list of native PHP constants which are safe to use, such as `PHP_EOL`, has been added. When any of these constants are encountered, the sniff will no longer demand output escaping for them. - - The sniff was underreporting issues with variables passed to `trigger_error()`. - - While reporting an issue, sometimes the wrong error message was used. The sniff logic has been adjusted to prevent this. - - The sniff will now correctly ignore the open and close brackets of short arrays. - - The sniff would throw false positives when `echo`, `print`, `exit` or `die` were encountered as constants, function or class names. While it may not be a good idea to use PHP keywords in such a way, it is allowed, so the sniff should handle this correctly. -- The `WordPress.WhiteSpace.ControlStructureSpacing` sniff would inadvertently throw an error for the spacing around the colon for a return type in a function declaration. -- The `WordPress.WP.AlternativeFunctions` sniff used to flag all function calls to `file_get_contents()` twice, suggesting to use `wp_remote_get()` - which is only applicable for remote URLs - and the `WP_FileSystem` API - which is not needed when just _reading_ local files. These messages contradicted each other. - The sniff will now try to determine whether the file requested is local or remote and will only throw a `warning` suggesting to use `wp_remote_get()`, if a remote URL is being requested or when it could not be determined if the requested file is local or remote. -- The expected default value for `wp_upload_bits()` in the `WordPress.WP.DeprecatedParameters` sniff. -- The `WordPress.WP.GlobalVariablesOverride` sniff previously did not detect variables created by a `foreach()` construct which would override WP global variables. -- Various bugs in the `WordPress.WP.I18n` sniff: - - The sniff will no longer throw false positives for calls to methods carrying the same name as any of the global WP functions being targeted and has improved handling of parse errors and live coding. - - A numeric `0` would throw a false positive for "no translatable content found". -- The fixer in the `WordPress.WhiteSpace.ControlStructureSpacing` sniff will no longer inadvertently remove return type declarations. -- Various bugs in the `WordPress.WhiteSpace.PrecisionAlignment` sniff: - - Inline HTML before the first PHP open tag was not being examined. - - Files which only contained short open echo tags for PHP were not being examined. - - The last line of inline HTML in a file was not being examined. -- Some best practice sniffs presumed the WordPress coding style regarding code layout, which could lead to incorrect results (mostly underreporting). - The following sniffs have received fixes related to this: - - `WordPress.DB.PreparedSQL` - - `WordPress.NamingConventions.ValidVariableName` - - `WordPress.WP.CronInterval` - - `WordPress.WP.I18n` -- Various minor fixes based on visual inspection and Scrutinizer analysis feedback. -- Typo in the instructions contained in `CONTRIBUTING.md`. -- Broken link in the `README.md` file. - - -## [0.14.1] - 2018-02-15 - -### Fixed -- The `WordPress.NamingConventions.PrefixAllGlobals` sniff contained a bug which could inadvertently trigger class autoloading of the project being sniffed and by extension could cause fatal errors during the PHPCS run. - -## [0.14.0] - 2017-11-01 - -### Added -- `WordPress.Arrays.MultipleStatementAlignment` sniff to the `WordPress-Core` ruleset which will align the array assignment operator for multi-item, multi-line associative arrays. - This new sniff offers four custom properties to customize its behavior: [`ignoreNewlines`](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Customizable-sniff-properties#array-alignment-allow-for-new-lines), [`exact`](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Customizable-sniff-properties#array-alignment-allow-non-exact-alignment), [`maxColumn`](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Customizable-sniff-properties#array-alignment-maximum-column) and [`alignMultilineItems`](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Customizable-sniff-properties#array-alignment-dealing-with-multi-line-items). -- `WordPress.DB.PreparedSQLPlaceholders` sniff to the `WordPress-Core` ruleset which will analyze the placeholders passed to `$wpdb->prepare()` for their validity, check whether queries using `IN ()` and `LIKE` statements are created correctly and will check whether a correct number of replacements are passed. - This sniff should help detect queries which are impacted by the security fixes to `$wpdb->prepare()` which shipped with WP 4.8.2 and 4.8.3. - The sniff also adds a new ["PreparedSQLPlaceholders replacement count" whitelist comment](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Whitelisting-code-which-flags-errors#preparedsql-placeholders-vs-replacements) for pertinent replacement count vs placeholder mismatches. Please consider carefully whether something could be a bug when you are tempted to use the whitelist comment and if so, [report it](https://github.com/WordPress/WordPress-Coding-Standards/issues/new). -- `WordPress.PHP.DiscourageGoto` sniff to the `WordPress-Core` ruleset. -- `WordPress.PHP.RestrictedFunctions` sniff to the `WordPress-Core` ruleset which initially forbids the use of `create_function()`. - This was previous only discouraged under certain circumstances. -- `WordPress.WhiteSpace.ArbitraryParenthesesSpacing` sniff to the `WordPress-Core` ruleset which checks the spacing on the inside of arbitrary parentheses. -- `WordPress.WhiteSpace.PrecisionAlignment` sniff to the `WordPress-Core` ruleset which will throw a warning when precision alignment is detected in PHP, JS and CSS files. -- `WordPress.WhiteSpace.SemicolonSpacing` sniff to the `WordPress-Core` ruleset which will throw a (fixable) error when whitespace is found before a semi-colon, except for when the semi-colon denotes an empty `for()` condition. -- `WordPress.CodeAnalysis.AssignmentInCondition` sniff to the `WordPress-Extra` ruleset. -- `WordPress.WP.DiscouragedConstants` sniff to the `WordPress-Extra` and `WordPress-VIP` rulesets to detect usage of deprecated WordPress constants, such as `STYLESHEETPATH` and `HEADER_IMAGE`. -- Ability to pass the `minimum_supported_version` to use for the `DeprecatedFunctions`, `DeprecatedClasses` and `DeprecatedParameters` sniff in one go. You can pass a `minimum_supported_wp_version` runtime variable for this [from the command line or pass it using a `config` directive in a custom ruleset](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Customizable-sniff-properties#setting-minimum-supported-wp-version-for-all-sniffs-in-one-go-wpcs-0140). -- `Generic.Formatting.MultipleStatementAlignment` - customized to have a `maxPadding` of `40` -, `Generic.Functions.FunctionCallArgumentSpacing` and `Squiz.WhiteSpace.ObjectOperatorSpacing` to the `WordPress-Core` ruleset. -- `Squiz.Scope.MethodScope`, `Squiz.Scope.MemberVarScope`, `Squiz.WhiteSpace.ScopeKeywordSpacing`, `PSR2.Methods.MethodDeclaration`, `Generic.Files.OneClassPerFile`, `Generic.Files.OneInterfacePerFile`, `Generic.Files.OneTraitPerFile`, `PEAR.Files.IncludingFile`, `Squiz.WhiteSpace.LanguageConstructSpacing`, `PSR2.Namespaces.NamespaceDeclaration` to the `WordPress-Extra` ruleset. -- The `is_class_constant()`, `is_class_property` and `valid_direct_scope()` utility methods to the `WordPress\Sniff` class. - -### Changed -- When passing an array property via a custom ruleset to PHP_CodeSniffer, spaces around the key/value are taken as intentional and parsed as part of the array key/value. In practice, this leads to confusion and WPCS does not expect any values which could be preceded/followed by a space, so for the WordPress Coding Standard native array properties, like `customAutoEscapedFunction`, `text_domain`, `prefixes`, WPCS will now trim whitespace from the keys/values received before use. -- The WPCS native whitelist comments used to only work when they were put on the _end of the line_ of the code they applied to. As of now, they will also be recognized when they are be put at the _end of the statement_ they apply to. -- The `WordPress.Arrays.ArrayDeclarationSpacing` sniff used to enforce all associative arrays to be multi-line. The handbook has been updated to only require this for multi-item associative arrays and the sniff has been updated accordingly. - [The original behavior can still be enforced](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Customizable-sniff-properties#arrays-forcing-single-item-associative-arrays-to-be-multi-line) by setting the new `allow_single_item_single_line_associative_arrays` property to `false` in a custom ruleset. -- The `WordPress.NamingConventions.PrefixAllGlobals` sniff will now allow for a limited list of WP core hooks which are intended to be called by plugins and themes. -- The `WordPress.PHP.DiscouragedFunctions` sniff used to include `create_function`. This check has been moved to the new `WordPress.PHP.RestrictedFunctions` sniff. -- The `WordPress.PHP.StrictInArray` sniff now has a separate error code `FoundNonStrictFalse` for when the `$strict` parameter has been set to `false`. This allows for excluding the warnings for that particular situation, which will normally be intentional, via a custom ruleset. -- The `WordPress.VIP.CronInterval` sniff now allows for customizing the minimum allowed cron interval by [setting a property in a custom ruleset](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Customizable-sniff-properties#vip-croninterval-minimum-interval). -- The `WordPress.VIP.RestrictedFunctions` sniff used to prohibit the use of certain WP native functions, recommending the use of `wpcom_vip_get_term_link()`, `wpcom_vip_get_term_by()` and `wpcom_vip_get_category_by_slug()` instead, as the WP native functions were not being cached. As the results of the relevant WP native functions are cached as of WP 4.8, the advice has now been reversed i.e. use the WP native functions instead of `wpcom...` functions. -- The `WordPress.VIP.PostsPerPage` sniff now allows for customizing the `post_per_page` limit for which the sniff will trigger by [setting a property in a custom ruleset](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Customizable-sniff-properties#vip-postsperpage-post-limit). -- The `WordPress.WP.I18n` sniff will now allow and actively encourage omitting the text domain in I18n function calls if the text domain passed via the `text_domain` property is `default`, i.e. the domain used by Core. - When `default` is one of several text domains passed via the `text_domain` property, the error thrown when the domain is missing has been downgraded to a `warning`. -- The `WordPress.XSS.EscapeOutput` sniff now has a separate error code `OutputNotEscapedShortEcho` and the error message texts have been updated. -- Moved `Squiz.PHP.Eval` from the `WordPress-Extra` and `WordPress-VIP` to the `WordPress-Core` ruleset. -- Removed two sniffs from the `WordPress-VIP` ruleset which were already included via the `WordPress-Core` ruleset. -- The unit test suite is now compatible with PHPCS 3.1.0+ and PHPUnit 6.x. -- Some tidying up of the unit test case files. -- All sniffs are now also being tested against PHP 7.2 for consistent sniff results. -- An attempt is made to detect potential fixer conflicts early via a special build test. -- Various minor documentation fixes. -- Improved the Atom setup instructions in the Readme. -- Updated the unit testing information in Contributing. -- Updated the [custom ruleset example](https://github.com/WordPress/WordPress-Coding-Standards/blob/develop/phpcs.xml.dist.sample) for the changes contained in this release and to make it more explicit what is recommended versus example code. -- The minimum recommended version for the suggested `DealerDirect/phpcodesniffer-composer-installer` Composer plugin has gone up to `0.4.3`. This patch version fixes support for PHP 5.3. - -### Fixed -- The `WordPress.Arrays.ArrayIndentation` sniff did not correctly handle array items with multi-line strings as a value. -- The `WordPress.Arrays.ArrayIndentation` sniff did not correctly handle array items directly after an array item with a trailing comment. -- The `WordPress.Classes.ClassInstantiation` sniff will now correctly handle detection when using `new $array['key']` or `new $array[0]`. -- The `WordPress.NamingConventions.PrefixAllGlobals` sniff did not allow for arbitrary word separators in hook names. -- The `WordPress.NamingConventions.PrefixAllGlobals` sniff did not correctly recognize namespaced constants as prefixed. -- The `WordPress.PHP.StrictInArray` sniff would erroneously trigger if the `true` for `$strict` was passed in uppercase. -- The `WordPress.PHP.YodaConditions` sniff could get confused over complex ternaries containing assignments. This has been remedied. -- The `WordPress.WP.PreparedSQL` sniff would erroneously throw errors about comments found within a DB function call. -- The `WordPress.WP.PreparedSQL` sniff would erroneously throw errors about `(int)`, `(float)` and `(bool)` casts and would also flag the subsequent variable which had been safe casted. -- The `WordPress.XSS.EscapeOutput` sniff would erroneously trigger when using a fully qualified function call - including the global namespace `\` indicator - to one of the escaping functions. -- The lists of WP global variables and WP mixed case variables have been synchronized, which fixes some false positives. - - -## [0.13.1] - 2017-08-07 - -### Fixed -- Fatal error when using PHPCS 3.x with the `installed_paths` config variable set via the ruleset. - -## [0.13.0] - 2017-08-03 - -### Added -- Support for PHP_CodeSniffer 3.0.2+. The minimum required PHPCS version (2.9.0) stays the same. -- Support for the PHPCS 3 `--ignore-annotations` command line option. If you pass this option, both PHPCS native `@ignore ...` annotations as well as the WPCS specific [whitelist flags](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Whitelisting-code-which-flags-errors) will be ignored. - -### Changed -- The minimum required PHP version is now 5.3 when used in combination with PHPCS 2.x and PHP 5.4 when used in combination with PHPCS 3.x. -- The way the unit tests can be run is now slightly different for PHPCS 2.x versus 3.x. For more details, please refer to the updated information in the [Contributing Guidelines](CONTRIBUTING.md). -- Release archives will no longer contain the unit tests and other typical development files. You can still get these by using Composer with `--prefer-source` or by checking out a git clone of the repository. -- Various textual improvements to the Readme. -- Various textual improvements to the Contributing Guidelines. -- Minor internal changes. - -### Removed -- The `WordPress.Arrays.ArrayDeclaration` sniff has been deprecated. The last remaining checks this sniff contained have been moved to the `WordPress.Arrays.ArrayDeclarationSpacing` sniff. -- Work-arounds which were in place to support PHP 5.2. - -### Fixed -- A minor bug where the auto-fixer could accidentally remove a comment near an array opener. - - -## [0.12.0] - 2017-07-21 - -### Added -- A default file encoding setting to the `WordPress-Core` ruleset. All files sniffed will now be regarded as `utf-8` by default. -- `WordPress.Arrays.ArrayIndentation` sniff to the `WordPress-Core` ruleset to verify - and auto-fix - the indentation of array items and the array closer for multi-line arrays. This replaces the (partial) indentation fixing contained within the `WordPress.Array.ArrayDeclarationSpacing` sniff. -- `WordPress.Arrays.CommaAfterArrayItem` sniff to the `WordPress-Core` ruleset to enforce that each array item is followed by a comma - except for the last item in a single-line array - and checks the spacing around the comma. This replaces (and improves) the checks which were previously included in the `WordPress.Arrays.ArrayDeclaration` sniff which were causing incorrect fixes and fixer conflicts. -- `WordPress.Functions.FunctionCallSignatureNoParams` sniff to the `WordPress-Core` ruleset to verify that function calls without parameters do not have any whitespace between the parentheses. -- `WordPress.WhiteSpace.DisallowInlineTabs` to the `WordPress-Core` ruleset to verify - and auto-fix - that spaces are used for mid-line alignment. -- `WordPress.WP.CapitalPDangit` sniff to the `WordPress-Core` ruleset to - where relevant - verify that `WordPress` is spelled correctly. For misspellings in text strings and comment text, the sniff can auto-fix violations. -- `Squiz.Classes.SelfMemberReference` whitespace related checks to the `WordPress-Core` ruleset and the additional check for using `self` rather than a FQN to the `WordPress-Extra` ruleset. -- `Squiz.PHP.EmbeddedPhp` sniff to the `WordPress-Core` ruleset to check PHP code embedded within HTML blocks. -- `PSR2.ControlStructures.SwitchDeclaration` to the `WordPress-Core` ruleset to check for the correct layout of `switch` control structures. -- `WordPress.Classes.ClassInstantiation` sniff to the `WordPress-Extra` ruleset to detect - and auto-fix - missing parentheses on object instantiation and superfluous whitespace in PHP and JS files. The sniff will also detect `new` being assigned by reference. -- `WordPress.CodeAnalysis.EmptyStatement` sniff to the `WordPress-Extra` ruleset to detect - and auto-fix - superfluous semi-colons and empty PHP open-close tag combinations. -- `WordPress.NamingConventions.PrefixAllGlobals` sniff to the `WordPress-Extra` ruleset to verify that all functions, classes, interfaces, traits, variables, constants and hook names which are declared/defined in the global namespace are prefixed with one of the prefixes provided via a custom property or via the command line. - To activate this sniff, [one or more allowed prefixes should be provided to the sniff](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Customizable-sniff-properties#naming-conventions-prefix-everything-in-the-global-namespace). This can be done using a custom ruleset or via the command line. - PHP superglobals and WP global variables are exempt from variable name prefixing. Deprecated hook names will also be disregarded when non-prefixed. Back-fills for known native PHP functionality is also accounted for. - For verified exceptions, [unprefixed code can be whitelisted](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Whitelisting-code-which-flags-errors#non-prefixed-functionclassvariableconstant-in-the-global-namespace). - Code in unit test files is automatically exempt from this sniff. -- `WordPress.WP.DeprecatedClasses` sniff to the `WordPress-Extra` ruleset to detect usage of deprecated WordPress classes. -- `WordPress.WP.DeprecatedParameters` sniff to the `WordPress-Extra` ruleset to detect deprecated parameters being passed to WordPress functions with a value other than the expected default. -- The `sanitize_textarea_field()` function to the `sanitizingFunctions` list used by the `WordPress.CSRF.NonceVerification`, `WordPress.VIP.ValidatedSanitizedInput` and `WordPress.XSS.EscapeOutput` sniffs. -- The `find_array_open_closer()` utility method to the `WordPress_Sniff` class. -- Information about setting `installed_paths` using a custom ruleset to the Readme. -- Additional support links to the `composer.json` file. -- Support for Composer PHPCS plugins which sort out the `installed_paths` setting. -- Linting and code-style check of the XML ruleset files provided by WPCS. - -### Changed -- The minimum required PHP_CodeSniffer version to 2.9.0 (was 2.8.1). **Take note**: PHPCS 3.x is not (yet) supported. The next release is expected to fix that. -- Improved support for detecting issues in code using heredoc and/or nowdoc syntax. -- Improved sniff efficiency, precision and performance for a number of sniffs. -- Updated a few sniffs to take advantage of new features and fixes which are included in PHP_CodeSniffer 2.9.0. -- `WordPress.Files.Filename`: The "file name mirrors the class name prefixed with 'class'" check for PHP files containing a class will no longer be applied to typical unit test classes, i.e. for classes which extend `WP_UnitTestCase`, `PHPUnit_Framework_TestCase` and `PHPUnit\Framework\TestCase`. Additional test case base classes can be passed to the sniff using the new [`custom_test_class_whitelist` property](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Customizable-sniff-properties#custom-unit-test-classes). -- The `WordPress.Files.FileName` sniff allows now for more theme-specific template hierarchy based file name exceptions. -- The whitelist flag for the `WordPress.VIP.SlowQuery` sniff was `tax_query` which was unintuitive. This has now been changed to `slow query` to be in line with other whitelist flags. -- The `WordPress.WhiteSpace.OperatorSpacing` sniff will now ignore operator spacing within `declare()` statements. -- The `WordPress.WhiteSpace.OperatorSpacing` sniff now extends the upstream `Squiz.WhiteSpace.OperatorSpacing` sniff for improved results and will now also examine the spacing around ternary operators and logical (`&&`, `||`) operators. -- The `WordPress.WP.DeprecatedFunctions` sniff will now detect functions deprecated in WP 4.7 and 4.8. Additionally, a number of other deprecated functions which were previously not being detected have been added to the sniff and for a number of functions the "alternative" for the deprecated function has been added/improved. -- The `WordPress.XSS.EscapeOutput` sniff will now also detect unescaped output when the short open echo tags `` PHP open tags. -- `WordPress.Classes.ClassOpeningStatement` sniff to the `WordPress-Core` ruleset to flag - and fix - class opening brace placement. -- `WordPress.NamingConventions.ValidHookName` sniff to the `WordPress-Core` ruleset to flag filter and action hooks which don't comply with the guideline of lowercase letters and underscores. For maintaining backward-compatibility of hook names an `additionalWordDelimiters` property can be added via a custom ruleset. -- `WordPress.Functions.DontExtract` sniff to the `WordPress-Core` ruleset to flag usage of the `extract()` function. -- `WordPress.PHP.POSIXFunctions` sniff to the `WordPress-Core` ruleset to flag usage of regex functions from the POSIX PHP extension which was deprecated since PHP 5.3 and removed in PHP 7. -- `WordPress.DB.RestrictedFunctions` and `WordPress.DB.RestrictedClasses` sniffs to the `WordPress-Core` ruleset to flag usage of direct database calls using PHP functions and classes rather than the WP functions for the same. -- Abstract `AbstractClassRestrictions` parent class to allow for easier sniffing for usage of specific classes. -- `Squiz.Strings.ConcatenationSpacing`, `PSR2.ControlStructures.ElseIfDeclaration`, `PSR2.Files.ClosingTag`, `Generic.NamingConventions.UpperCaseConstantName` to the `WordPress-Core` ruleset. -- Ability to add arbitrary variables to the whitelist via a custom ruleset property for the `WordPress.NamingConventions.ValidVariableName` sniff. -- Ability to use a whitelist comment for tax queries for the `WordPress.VIP.SlowDBQuery` sniff. -- Instructions on how to use WPCS with Atom and SublimeLinter to the Readme. -- Reference to the [wiki](https://github.com/WordPress/WordPress-Coding-Standards/wiki) to the Readme. -- Recommendation to also use the [PHPCompatibility](https://github.com/PHPCompatibility/PHPCompatibility) ruleset to the Readme. - -### Changed -- The minimum required PHP_CodeSniffer version to 2.6.0. -- Moved the `WordPress.WP.PreparedSQL` sniff from `WordPress-Extra` to `WordPress-Core`. -- `WordPress.PHP.StrictInArray` will now also flag non-strict usage of `array_keys()` and `array_search()`. -- Added `_deprecated_constructor()` and `_deprecated_hook()` to the list of printing functions. -- Added numerous additional functions to sniff for to the `WordPress.VIP.RestrictedFunctions` sniff as per the VIP guidelines. -- Upped the `posts_per_page` limit from 50 to 100 in `WordPress.VIP.PostsPerPage` sniff as per the VIP guidelines. -- Added `cat_ID` to the whitelisted exceptions for the `WordPress.NamingConventions.ValidVariableName` sniff. -- Added `__debugInfo` to the magic method whitelist for class methods starting with double underscore in the `WordPress.NamingConventions.ValidFunctionName` sniff. -- An error will now also be thrown for non-magic _functions_ using a double underscore prefix - `WordPress.NamingConventions.ValidFunctionName` sniff. -- The `WordPress.Arrays.ArrayAssignmentRestrictions`, `WordPress.Functions.FunctionRestrictions`, `WordPress.Variables.VariableRestrictions` sniffs weren't in actual fact sniffs, but parent classes for child sniffs. These have now all been turned into proper abstract parent classes and moved to the main `WordPress` directory. -- The array provided to `AbstractFunctionRestrictions` can now take a `whitelist` key to whitelist select functions when blocking a group of functions by function prefix. -- Updated installation instructions in the readme. -- The `WordPress-Core` ruleset is now ordered according to the handbook -- The WPCS code base itself now complies with the WordPress-Core, -Extra and -Docs coding standards. -- Various other code quality and code consistency improvements under the hood. - -### Removed -- `Squiz.Functions.FunctionDeclarationArgumentSpacing.SpacingBeforeClose` from the `WordPress-Core` standard (was causing duplicate messages for the same issue). -- `Squiz.Commenting.FunctionComment.ScalarTypeHintMissing`, `Squiz.Commenting.InlineComment.NotCapital` from the `WordPress-Docs` standard. -- Removed the sniffing for `get_pages()` from the `WordPress.VIP.RestrictedFunctions` sniff as per the VIP guidelines. -- Removed the sniffing for `extract()` from the `WordPress.VIP.RestrictedFunctions` sniff as it's now covered in a separate sniff. -- Removed the sniffing for the POSIX functions from the `WordPress.PHP.DiscouragedFunctions` sniff as it's now covered in a separate sniff. - -### Fixed -- Error message precision for the `WordPress.NamingConventions.ValidVariableName` sniff. -- Bug in the `WordPress.WhiteSpace.ControlStructureSpacing.BlankLineAfterEnd` sniff which was incorrectly being triggered on last method of class. -- Function name sniffs based on the `AbstractFunctionRestrictions` parent class will now do a case-insensitive function name comparison. -- Function name sniffs in the `WordPress.PHP.DiscouragedFunctions` sniff will now do a case-insensitive function name comparison. -- Whitelist comments directly followed by a PHP closing tag were not being recognized. -- Some PHP Magic constants were not recognized by the `WordPress.XSS.EscapeOutput` sniff. -- An error message suggesting camel caps rather than the intended snake case format in the `WordPress.NamingConventions.ValidFunctionName` sniff. -- `WordPress.WhiteSpace.ControlStructureSpacing` should no longer throw error notices during live code review. -- Errors will be no longer be thrown for methods not complying with the naming conventions when the class extends a parent class or implements an interface - `WordPress.NamingConventions.ValidFunctionName` sniff. - - -## [0.9.0] - 2016-02-01 - -### Added -- `count()` to the list of auto-escaped functions. -- `Squiz.PHP.CommentedOutCode` sniff to `WordPress-VIP` ruleset. -- Support for PHP 5.2. -- `attachment_url_to_postid()` and `parse_url()` to the restricted functions for `WordPress-VIP`. -- `WordPress.VIP.OrderByRand` sniff. -- `WordPress.PHP.StrictInArray` sniff for `WordPress-VIP` and `WordPress-Extra`. -- `get_tag_link()`, `get_category_link()`, `get_cat_ID()`, `url_to_post_id()`, `attachment_url_to_postid()` -`get_posts()`, `wp_get_recent_posts()`, `get_pages()`, `get_children()`, `wp_get_post_terms()` -`wp_get_post_categories()`, `wp_get_post_tags()`, `wp_get_object_terms()`, `term_exists()`, -`count_user_posts()`, `wp_old_slug_redirect()`, `get_adjacent_post()`, `get_previous_post()`, -`get_next_post()` to uncached functions in `WordPress.VIP.RestrictedFunctions` sniff. -- `wp_handle_upload()` and `array_key_exists()` to the list of sanitizing functions. -- Checking for object properties in `WordPress.PHP.YodaConditions` sniff. -- `WordPress.NamingConventions.ValidVariableName` sniff. -- Flagging of function calls incorporated into database queries in `WordPress.WP.PreparedSQL`. -- Recognition of escaping and auto-escaped functions in `WordPress.WP.PreparedSQL`. -- `true`, `false`, and `null` to the tokens ignored in `WordPress.XSS.EscapeOutput`. - -### Fixed -- Incorrect ternary detection in `WordPress.XSS.EscapeOutput` sniff. -- False positives when detecting variables interpolated into strings in the -`WordPress.WP.PreparedSQL` and `WordPress.VIP.ValidatedSanitizedInput` sniffs. -- False positives in `WordPress.PHP.YodaConditions` when the variable is being casted. -- `$wpdb` properties being flagged in `WordPress.WP.PreparedSQL` sniff. -- False positive in `WordPress.PHP.YodaConditions` when the a string is on the left side of the -comparison. - -## [0.8.0] - 2015-10-02 - -### Added -- `implode()` and `join()` to the list of formatting functions in the `WordPress.XSS.EscapeOutput` -sniff. This is useful when you need to have HTML in the `$glue` parameter. -- Support in the `WordPress.XSS.EscapeOutput` sniff for escaping an array of values -using `array_map()`. (Otherwise the support for `implode()` isn't of much use :) -- Docs for running WPCS in Sublime Text. -- `nl2br()` to the list of formatting functions. -- `wp_dropdown_pages()` to the list of printing functions. -- Error codes to all error/warning messages. -- `WordPress.WP.PreparedSQL` sniff for flagging unprepared SQL queries. - -### Removed -- Sniffing for the number of spaces before a closure's opening parenthesis from the -default configuration of the `WordPress.WhiteSpace.ControlStructureSpacing` sniff. It -can be re-enabled per-project as desired. - -### Fixed -- The `WordPress.XSS.EscapeOutput` sniff giving error messages with the closing -parenthesis in them instead of the offending function's name. - -## [0.7.1] - 2015-08-31 - -### Changed -- The default number of spaces before a closure's opening parenthesis from 1 to 0. - -## [0.7.0] - 2015-08-30 - -### Added -- Automatic error fixing to the `WordPress.Arrays.ArrayKeySpacingRestrictions` sniff. -- Functions and closures to the control structures checked by the `WordPress.WhiteSpace.ControlStructureSpacing` -sniff. -- Sniffing and fixing for extra spacing in the `WordPress.WhiteSpace.ControlStructureSpacing` -sniff. (Previously it only checked for insufficient spacing.) -- `.twig` files to the default ignored files. -- `esc_url_raw()` and `hash_equals()` to the list of sanitizing functions. -- `intval()` and `boolval()` to list of unslashing functions. -- `do_shortcode()` to the list of auto-escaped functions. - -### Removed -- `WordPress.Functions.FunctionDeclarationArgumentSpacing` in favor of the upstream -sniff `Squiz.Functions.FunctionDeclarationArgumentSpacing`. - -### Fixed -- Reference to incorrect issue in the inline docs of the `WordPress.VIP.SessionVariableUsage` -sniff. -- `WordPress.XSS.EscapeOutput` sniff incorrectly handling ternary conditions in -`echo` statements without parentheses in some cases. - -## [0.6.0] - 2015-06-30 - -### Added -- Support for `wp_cache_add()` and `wp_cache_delete()`, as well as custom cache -functions,in the `WordPress.VIP.DirectDatabaseQuery` sniff. - -### Removed -- `WordPress.Functions.FunctionRestrictions` and `WordPress.Variables.VariableRestrictions` -from the `WordPress-VIP` standard, since they are just parents for other sniffs. - -## [0.5.0] - 2015-06-01 - -### Added -- `WordPress.CSRF.NonceVerification` sniff to flag form processing without nonce verification. -- `in_array()` and `is_array()` to the list of sanitizing functions. -- Support for automatic error fixing to the `WordPress.Arrays.ArrayDeclaration` sniff. -- `WordPress.PHP.StrictComparisons` to the `WordPress-VIP` and `WordPress-Extra` rulesets. -- `WordPress-Docs` ruleset to sniff for proper commenting. -- `Generic.PHP.LowerCaseKeyword`, `Generic.Files.EndFileNewline`, `Generic.Files.LowercasedFilename`, -`Generic.Formatting.SpaceAfterCast`, and `Generic.Functions.OpeningFunctionBraceKernighanRitchie` to the `WordPress-Core` ruleset. -- `Generic.PHP.DeprecatedFunctions`, `Generic.PHP.ForbiddenFunctions`, `Generic.Functions.CallTimePassByReference`, -`Generic.Formatting.DisallowMultipleStatements`, `Generic.CodeAnalysis.EmptyStatement`, -`Generic.CodeAnalysis.ForLoopShouldBeWhileLoop`, `Generic.CodeAnalysis.ForLoopWithTestFunctionCall`, -`Generic.CodeAnalysis.JumbledIncrementer`, `Generic.CodeAnalysis.UnconditionalIfStatement`, -`Generic.CodeAnalysis.UnnecessaryFinalModifier`, `Generic.CodeAnalysis.UselessOverridingMethod`, -`Generic.Classes.DuplicateClassName`, and `Generic.Strings.UnnecessaryStringConcat` to the `WordPress-Extra` ruleset. -- Error for missing use of `wp_unslash()` on superglobal data to the `WordPress.VIP.ValidatedSanitizedInput` sniff. - -### Changed -- The `WordPress.VIP.ValidatedSanitizedInput` sniff to require sanitization of input even when it is being directly escaped and output. -- The minimum required PHP_CodeSniffer version to 2.2.0. -- The `WordPress.VIP.ValidatedSanitizedInput` and `WordPress.XSS.EscapeOutput` sniffs: -the list of escaping functions was split from the list of sanitizing functions. The `customSanitizingFunctions` -property has been moved to the `ValidatedSanitizedInput` sniff, and the `customEscapingFunctions` -property should now be used instead for the `EscapeOutput` sniff. -- The `WordPress.Arrays.ArrayDeclaration` sniff to give errors for `NoSpaceAfterOpenParenthesis`, `SpaceAfterArrayOpener`, and `SpaceAfterArrayCloser`, instead of warnings. -- The `WordPress.NamingConventions.ValidFunctionName` sniff to allow camelCase method names in classes that implement interfaces. - -### Fixed -- The `WordPress.VIP.ValidatedSanitizedInput` sniff not reporting missing validation when reporting missing sanitization. -- The `WordPress.VIP.ValidatedSanitizedInput` sniff flagging superglobals as needing sanitization when they were only being used in a comparison using `if` or `switch`, etc. - -## [0.4.0] - 2015-05-01 - -### Added -- Change log file. -- Handling for string-interpolated input variables in the `WordPress.VIP.ValidatedSanitizedInput` sniff. -- Errors for using uncached functions when cached equivalents exist. -- `space_before_colon` setting for the `WordPress.WhiteSpace.ControlStructureSpacing` sniff, for control structures using alternative syntax. Possible values: `'required'`, `'optional'`, `'forbidden'`. -- Support for `sanitization` whitelisting comments for the `WordPress.VIP.ValidatedSanitizedInput` sniff. -- Granular error/warning names for all errors and warnings. -- Handling for ternary conditions in the `WordPress.XSS.EscapeOutput` sniff. -- `die`, `exit`, `printf`, `vprintf`, `wp_die`, `_deprecated_argument`, `_deprecated_function`, `_deprecated_file`, `_doing_it_wrong`, `trigger_error`, and `user_error` to the list of printing functions in the `WordPress.XSS.EscapeOutput` sniff. -- `customPrintingFunctions` setting for the `WordPress.XSS.EscapeOutput` sniff. -- `rawurlencode()` and `wp_parse_id_list()` to the list of "sanitizing" functions in the `WordPress.XSS.EscapeOutput` sniff. -- `json_encode()` to the list of discouraged functions in the `WordPress.PHP.DiscouragedFunctions` sniff, in favor of `wp_json_encode()`. -- `vip_powered_wpcom()` to the list of auto-escaped functions in the `WordPress.XSS.EscapeOutput` sniff. -- `debug_print_backtrace()` and `var_export()` to the list of discouraged functions in the `WordPress.PHP.DiscouragedFunctions` sniff. -- Smart handling for formatting functions (`sprintf()` and `wp_sprintf()`) in the `WordPress.XSS.EscapeOutput` sniff. -- `WordPress.PHP.StrictComparisons` sniff. -- Correct handling of `array_map()` in the `WordPress.VIP.ValidatedSanitizedInput` sniff. -- `$_COOKIE` and `$_FILE` to the list of superglobals flagged by the `WordPress.VIP.ValidatedSanitizedInput` and `WordPress.VIP.SuperGlobalInputUsage` sniffs. -- `$_SERVER` to the list of superglobals flagged by the `WordPress.VIP.SuperGlobalInputUsage` sniff. -- `Squiz.ControlStructures.ControlSignature` sniff to the rulesets. - -### Changed -- `WordPress.Arrays.ArrayKeySpacingRestrictions` sniff to give errors for `NoSpacesAroundArrayKeys` and `SpacesAroundArrayKeys` instead of just warnings. -- `WordPress.NamingConventions.ValidFunctionName` sniff to allow for camel caps method names in child classes. -- `WordPress.XSS.EscapeOutput` sniff to allow for integers (e.g. `echo 5` and `print( -1 )`). - -### Removed -- Errors for mixed key/keyless array elements in the `WordPress.Arrays.ArrayDeclaration` sniff. -- BOM from `WordPress.WhiteSpace.OperatorSpacing` sniff file. -- `$content_width` from the list of non-overwritable globals in the `WordPress.Variables.GlobalVariables` sniff. -- `WordPress.Arrays.ArrayAssignmentRestrictions` sniff from the `WordPress-VIP` ruleset. - -### Fixed -- Incorrect errors for `else` statements using alternative syntax. -- `WordPress.VIP.ValidatedSanitizedInput` sniff not always treating casting as sanitization. -- `WordPress.XSS.EscapeOutput` sniff flagging comments as needing to be escaped. -- `WordPress.XSS.EscapeOutput` sniff not sniffing comma-delimited `echo` arguments after encountering the first escaping function in the statement. -- `WordPress.PHP.YodaConditions` sniff not flagging comparisons to constants or function calls. -- `WordPress.Arrays.ArrayDeclaration` sniff not ignoring doc comments. -- Link to phpStorm instructions in `README.md`. -- Poor performance of the `WordPress.Arrays.ArrayAssignmentRestrictions` sniff. -- Poor performance of the `WordPress.Files.FileName` sniff. - -## [0.3.0] - 2014-12-11 - -See the comparison for full list. - -### Changed -- Use semantic version tags for releases. - -## [2013-10-06] - -See the comparison for full list. - -## 2013-06-11 - -Initial tagged release. - -[Composer PHPCS plugin]: https://github.com/PHPCSStandards/composer-installer -[PHP_CodeSniffer]: https://github.com/PHPCSStandards/PHP_CodeSniffer -[PHPCompatibility]: https://github.com/PHPCompatibility/PHPCompatibility - -[Unreleased]: https://github.com/WordPress/WordPress-Coding-Standards/compare/main...HEAD -[3.3.0]: https://github.com/WordPress/WordPress-Coding-Standards/compare/3.2.0...3.3.0 -[3.2.0]: https://github.com/WordPress/WordPress-Coding-Standards/compare/3.1.0...3.2.0 -[3.1.0]: https://github.com/WordPress/WordPress-Coding-Standards/compare/3.0.1...3.1.0 -[3.0.1]: https://github.com/WordPress/WordPress-Coding-Standards/compare/3.0.0...3.0.1 -[3.0.0]: https://github.com/WordPress/WordPress-Coding-Standards/compare/2.3.0...3.0.0 -[2.3.0]: https://github.com/WordPress/WordPress-Coding-Standards/compare/2.2.1...2.3.0 -[2.2.1]: https://github.com/WordPress/WordPress-Coding-Standards/compare/2.2.0...2.2.1 -[2.2.0]: https://github.com/WordPress/WordPress-Coding-Standards/compare/2.1.1...2.2.0 -[2.1.1]: https://github.com/WordPress/WordPress-Coding-Standards/compare/2.1.0...2.1.1 -[2.1.0]: https://github.com/WordPress/WordPress-Coding-Standards/compare/2.0.0...2.1.0 -[2.0.0]: https://github.com/WordPress/WordPress-Coding-Standards/compare/2.0.0-RC1...2.0.0 -[2.0.0-RC1]: https://github.com/WordPress/WordPress-Coding-Standards/compare/1.2.1...2.0.0-RC1 -[1.2.1]: https://github.com/WordPress/WordPress-Coding-Standards/compare/1.2.0...1.2.1 -[1.2.0]: https://github.com/WordPress/WordPress-Coding-Standards/compare/1.1.0...1.2.0 -[1.1.0]: https://github.com/WordPress/WordPress-Coding-Standards/compare/1.0.0...1.1.0 -[1.0.0]: https://github.com/WordPress/WordPress-Coding-Standards/compare/0.14.1...1.0.0 -[0.14.1]: https://github.com/WordPress/WordPress-Coding-Standards/compare/0.14.0...0.14.1 -[0.14.0]: https://github.com/WordPress/WordPress-Coding-Standards/compare/0.13.1...0.14.0 -[0.13.1]: https://github.com/WordPress/WordPress-Coding-Standards/compare/0.13.0...0.13.1 -[0.13.0]: https://github.com/WordPress/WordPress-Coding-Standards/compare/0.12.0...0.13.0 -[0.12.0]: https://github.com/WordPress/WordPress-Coding-Standards/compare/0.11.0...0.12.0 -[0.11.0]: https://github.com/WordPress/WordPress-Coding-Standards/compare/0.10.0...0.11.0 -[0.10.0]: https://github.com/WordPress/WordPress-Coding-Standards/compare/0.9.0...0.10.0 -[0.9.0]: https://github.com/WordPress/WordPress-Coding-Standards/compare/0.8.0...0.9.0 -[0.8.0]: https://github.com/WordPress/WordPress-Coding-Standards/compare/0.7.1...0.8.0 -[0.7.1]: https://github.com/WordPress/WordPress-Coding-Standards/compare/0.7.0...0.7.1 -[0.7.0]: https://github.com/WordPress/WordPress-Coding-Standards/compare/0.6.0...0.7.0 -[0.6.0]: https://github.com/WordPress/WordPress-Coding-Standards/compare/0.5.0...0.6.0 -[0.5.0]: https://github.com/WordPress/WordPress-Coding-Standards/compare/0.4.0...0.5.0 -[0.4.0]: https://github.com/WordPress/WordPress-Coding-Standards/compare/0.3.0...0.4.0 -[0.3.0]: https://github.com/WordPress/WordPress-Coding-Standards/compare/2013-10-06...0.3.0 -[2013-10-06]: https://github.com/WordPress/WordPress-Coding-Standards/compare/2013-06-11...2013-10-06 - -[@anomiex]: https://github.com/anomiex -[@aiolachiara]: https://github.com/aiolachiara -[@Chouby]: https://github.com/Chouby -[@ckanitz]: https://github.com/ckanitz -[@craigfrancis]: https://github.com/craigfrancis -[@davidperezgar]: https://github.com/davidperezgar -[@dawidurbanski]: https://github.com/dawidurbanski -[@desrosj]: https://github.com/desrosj -[@dingo-d]: https://github.com/dingo-d -[@fredden]: https://github.com/fredden -[@GaryJones]: https://github.com/GaryJones -[@grappler]: https://github.com/grappler -[@Ipstenu]: https://github.com/Ipstenu -[@jaymcp]: https://github.com/jaymcp -[@JDGrimes]: https://github.com/JDGrimes -[@johnjago]: https://github.com/johnjago -[@jrfnl]: https://github.com/jrfnl -[@khacoder]: https://github.com/khacoder -[@Luc45]: https://github.com/Luc45 -[@marconmartins]: https://github.com/marconmartins -[@NielsdeBlaauw]: https://github.com/NielsdeBlaauw -[@richardkorthuis]: https://github.com/richardkorthuis -[@rodrigoprimo]: https://github.com/rodrigoprimo -[@slaFFik]: https://github.com/slaFFik -[@sandeshjangam]: https://github.com/sandeshjangam -[@szepeviktor]: https://github.com/szepeviktor -[@westonruter]: https://github.com/westonruter diff --git a/vendor/wp-coding-standards/wpcs/LICENSE b/vendor/wp-coding-standards/wpcs/LICENSE deleted file mode 100644 index 359e1a7..0000000 --- a/vendor/wp-coding-standards/wpcs/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2009 John Godley and contributors. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/wp-coding-standards/wpcs/README.md b/vendor/wp-coding-standards/wpcs/README.md deleted file mode 100644 index 5ebe6c6..0000000 --- a/vendor/wp-coding-standards/wpcs/README.md +++ /dev/null @@ -1,261 +0,0 @@ - - - -# WordPress Coding Standards for PHP_CodeSniffer - -* [Introduction](#introduction) -* [Minimum Requirements](#minimum-requirements) -* [Installation](#installation) - + [Composer Project-based Installation](#composer-project-based-installation) - + [Composer Global Installation](#composer-global-installation) - + [Updating your WordPressCS install to a newer version](#updating-your-wordpresscs-install-to-a-newer-version) - + [Using your WordPressCS install](#using-your-wordpresscs-install) -* [Rulesets](#rulesets) - + [Standards subsets](#standards-subsets) - + [Using a custom ruleset](#using-a-custom-ruleset) - + [Customizing sniff behavior](#customizing-sniff-behavior) - + [Recommended additional rulesets](#recommended-additional-rulesets) -* [How to use](#how-to-use) - + [Command line](#command-line) - + [Using PHPCS and WordPressCS from within your IDE](#using-phpcs-and-wordpresscs-from-within-your-ide) -* [Running your code through WordPressCS automatically using Continuous Integration tools](#running-your-code-through-wordpresscs-automatically-using-continuous-integration-tools) -* [Fixing errors or ignoring them](#fixing-errors-or-ignoring-them) - + [Tools shipped with WordPressCS](#tools-shipped-with-wordpresscs) -* [Contributing](#contributing) -* [Funding](#funding) -* [License](#license) - ---- - -## Introduction - -This project is a collection of [PHP_CodeSniffer](https://github.com/PHPCSStandards/PHP_CodeSniffer) rules (sniffs) to validate code developed for WordPress. It ensures code quality and adherence to coding conventions, especially the official [WordPress Coding Standards](https://make.wordpress.org/core/handbook/best-practices/coding-standards/). - -**This project needs funding. [Find out how you can help](#funding).** - -## Minimum Requirements - -The WordPress Coding Standards package requires: -* PHP 7.2 or higher with the following extensions enabled: - - [Filter](https://www.php.net/book.filter) - - [libxml](https://www.php.net/book.libxml) - - [Tokenizer](https://www.php.net/book.tokenizer) - - [XMLReader](https://www.php.net/book.xmlreader) -* [Composer](https://getcomposer.org/) - -For the best results, it is recommended to also ensure the following additional PHP extensions are enabled: -- [iconv](https://www.php.net/book.iconv) -- [Multibyte String](https://www.php.net/book.mbstring) - -## Installation - -As of [WordPressCS 3.0.0](https://make.wordpress.org/core/2023/08/21/wordpresscs-3-0-0-is-now-available/), installation via Composer using the below instructions is the only supported type of installation. - -[Composer](https://getcomposer.org/) will automatically install the project dependencies and register the rulesets from WordPressCS and other external standards with PHP_CodeSniffer using the [Composer PHPCS plugin](https://github.com/PHPCSStandards/composer-installer). - -> If you are upgrading from an older WordPressCS version to version 3.0.0, please read the [Upgrade guide for ruleset maintainers and end-users](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Upgrade-Guide-to-WordPressCS-3.0.0-for-ruleset-maintainers) first! - -### Composer Project-based Installation - -Run the following from the root of your project: -```bash -composer config allow-plugins.dealerdirect/phpcodesniffer-composer-installer true -composer require --dev wp-coding-standards/wpcs:"^3.0" -``` - -### Composer Global Installation - -Alternatively, you may want to install this standard globally: -```bash -composer global config allow-plugins.dealerdirect/phpcodesniffer-composer-installer true -composer global require --dev wp-coding-standards/wpcs:"^3.0" -``` - -### Updating your WordPressCS install to a newer version - -If you installed WordPressCS using either of the above commands, you can upgrade to a newer version as follows: -```bash -# Project local install -composer update wp-coding-standards/wpcs --with-dependencies - -# Global install -composer global update wp-coding-standards/wpcs --with-dependencies -``` - -### Using your WordPressCS install - -Once you have installed WordPressCS using either of the above commands, use it as follows: -```bash -# Project local install -vendor/bin/phpcs -ps . --standard=WordPress - -# Global install -%USER_DIRECTORY%/Composer/vendor/bin/phpcs -ps . --standard=WordPress -``` - -> **Pro-tip**: For the convenience of using `phpcs` as a global command, use the _Global install_ method and add the path to the `%USER_DIRECTORY%/Composer/vendor/bin` directory to the `PATH` environment variable for your operating system. - - -## Rulesets - -### Standards subsets - -The project encompasses a super-set of the sniffs that the WordPress community may need. If you use the `WordPress` standard you will get all the checks. - -You can use the following as standard names when invoking `phpcs` to select sniffs, fitting your needs: - -* `WordPress` - complete set with all of the sniffs in the project - - `WordPress-Core` - main ruleset for [WordPress core coding standards](https://developer.wordpress.org/coding-standards/wordpress-coding-standards/php/) - - `WordPress-Docs` - additional ruleset for [WordPress inline documentation standards](https://developer.wordpress.org/coding-standards/inline-documentation-standards/php/) - - `WordPress-Extra` - extended ruleset with recommended best practices, not sufficiently covered in the WordPress core coding standards - - includes `WordPress-Core` - -### Using a custom ruleset - -If you need to further customize the selection of sniffs for your project - you can create a custom ruleset file. - -When you name this file either `.phpcs.xml`, `phpcs.xml`, `.phpcs.xml.dist` or `phpcs.xml.dist`, PHP_CodeSniffer will automatically locate it as long as it is placed in the directory from which you run the CodeSniffer or in a directory above it. If you follow these naming conventions you don't have to supply a `--standard` CLI argument. - -For more info, read about [using a default configuration file](https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki/Advanced-Usage#using-a-default-configuration-file). See also the provided WordPressCS [`phpcs.xml.dist.sample`](phpcs.xml.dist.sample) file and the [fully annotated example ruleset](https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki/Annotated-ruleset.xml) in the PHP_CodeSniffer documentation. - -### Customizing sniff behavior - -The WordPress Coding Standard contains a number of sniffs which are configurable. This means that you can turn parts of the sniff on or off, or change the behavior by setting a property for the sniff in your custom `[.]phpcs.xml[.dist]` file. - -You can find a complete list of all the properties you can change for the WordPressCS sniffs in the [wiki](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Customizable-sniff-properties). - -WordPressCS also uses sniffs from PHPCSExtra and from PHP_CodeSniffer itself. -The [README for PHPCSExtra](https://github.com/PHPCSStandards/PHPCSExtra) contains information on the properties which can be set for the sniff from PHPCSExtra. -Information on custom properties which can be set for sniffs from PHP_CodeSniffer can be found in the [PHP_CodeSniffer wiki](https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki/Customisable-Sniff-Properties). - - -### Recommended additional rulesets - -#### PHPCompatibility - -The [PHPCompatibility](https://github.com/PHPCompatibility/PHPCompatibility) ruleset and its subset [PHPCompatibilityWP](https://github.com/PHPCompatibility/PHPCompatibilityWP) come highly recommended. -The [PHPCompatibility](https://github.com/PHPCompatibility/PHPCompatibility) sniffs are designed to analyze your code for cross-version PHP compatibility. - -The [PHPCompatibilityWP](https://github.com/PHPCompatibility/PHPCompatibilityWP) ruleset is based on PHPCompatibility, but specifically crafted to prevent false positives for projects which expect to run within the context of WordPress, i.e. core, plugins and themes. - -Install either as a separate ruleset and run it separately against your code or add it to your custom ruleset, like so: -```xml - - - *\.php$ - -``` - -Whichever way you run it, do make sure you set the `testVersion` to run the sniffs against. The `testVersion` determines for which PHP versions you will receive compatibility information. The recommended setting for this at this moment is `7.2-` to support the same PHP versions as WordPress Core supports. - -For more information about setting the `testVersion`, see: -* [PHPCompatibility: Sniffing your code for compatibility with specific PHP version(s)](https://github.com/PHPCompatibility/PHPCompatibility#sniffing-your-code-for-compatibility-with-specific-php-versions) -* [PHPCompatibility: Using a custom ruleset](https://github.com/PHPCompatibility/PHPCompatibility#using-a-custom-ruleset) - -#### VariableAnalysis - -For some additional checks around (undefined/unused) variables, the [`VariableAnalysis`](https://github.com/sirbrillig/phpcs-variable-analysis/) standard is a handy addition. - -#### VIP Coding Standards - -For those projects which deploy to the WordPress VIP platform, it is recommended to also use the [official WordPress VIP coding standards](https://github.com/Automattic/VIP-Coding-Standards) ruleset. - - -## How to use - -### Command line - -Run the `phpcs` command line tool on a given file or directory, for example: -```bash -vendor/bin/phpcs --standard=WordPress wp-load.php -``` - -Will result in following output: -``` --------------------------------------------------------------------------------- -FOUND 6 ERRORS AND 4 WARNINGS AFFECTING 5 LINES --------------------------------------------------------------------------------- - 36 | WARNING | error_reporting() can lead to full path disclosure. - 36 | WARNING | error_reporting() found. Changing configuration values at - | | runtime is strongly discouraged. - 52 | WARNING | Silencing errors is strongly discouraged. Use proper error - | | checking instead. Found: @file_exists( dirname(... - 52 | WARNING | Silencing errors is strongly discouraged. Use proper error - | | checking instead. Found: @file_exists( dirname(... - 75 | ERROR | Overriding WordPress globals is prohibited. Found assignment - | | to $path - 78 | ERROR | Detected usage of a possibly undefined superglobal array - | | index: $_SERVER['REQUEST_URI']. Use isset() or empty() to - | | check the index exists before using it - 78 | ERROR | $_SERVER['REQUEST_URI'] not unslashed before sanitization. Use - | | wp_unslash() or similar - 78 | ERROR | Detected usage of a non-sanitized input variable: - | | $_SERVER['REQUEST_URI'] - 104 | ERROR | All output should be run through an escaping function (see the - | | Security sections in the WordPress Developer Handbooks), found - | | '$die'. - 104 | ERROR | All output should be run through an escaping function (see the - | | Security sections in the WordPress Developer Handbooks), found - | | '__'. --------------------------------------------------------------------------------- -``` - -### Using PHPCS and WordPressCS from within your IDE - -The [wiki](https://github.com/WordPress/WordPress-Coding-Standards/wiki) contains links to various in- and external tutorials about setting up WordPressCS to work in your IDE. - - -## Running your code through WordPressCS automatically using Continuous Integration tools - -- [Running in GitHub Actions](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Running-in-GitHub-Actions) -- [Running in Travis](https://github.com/WordPress/WordPress-Coding-Standards/wiki/Running-in-Travis) - - -## Fixing errors or ignoring them - -You can find information on how to deal with some of the more frequent issues in the [wiki](https://github.com/WordPress/WordPress-Coding-Standards/wiki). - -### Tools shipped with WordPressCS - -Since version 1.2.0, WordPressCS has a special sniff category `Utils`. - -This sniff category contains some tools which, generally speaking, will only be needed to be run once over a codebase and for which the fixers can be considered _risky_, i.e. very careful review by a developer is needed before accepting the fixes made by these sniffs. - -The sniffs in this category are disabled by default and can only be activated by adding some properties for each sniff via a custom ruleset. - -At this moment, WordPressCS offer the following tools: -* `WordPress.Utils.I18nTextDomainFixer` - This sniff can replace the text domain used in a code-base. - The sniff will fix the text domains in both I18n function calls as well as in a plugin/theme header. - Passing the following properties will activate the sniff: - - `old_text_domain`: an array with one or more (old) text domain names which need to be replaced; - - `new_text_domain`: the correct (new) text domain as a string. - - -## Contributing - -See [CONTRIBUTING](.github/CONTRIBUTING.md), including information about [unit testing](.github/CONTRIBUTING.md#unit-testing) the standard. - -## Funding - -If you want to sponsor the work on WordPressCS, you can do so by donating to the [PHP_CodeSniffer Open Collective](https://opencollective.com/php_codesniffer). - -## License - -See [LICENSE](LICENSE) (MIT). diff --git a/vendor/wp-coding-standards/wpcs/WordPress-Core/ruleset.xml b/vendor/wp-coding-standards/wpcs/WordPress-Core/ruleset.xml deleted file mode 100644 index c8f1bed..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress-Core/ruleset.xml +++ /dev/null @@ -1,944 +0,0 @@ - - - - Non-controversial generally-agreed upon WordPress Coding Standards - - - - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - warning - - - warning - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - 0 - - - 0 - - - 0 - - - - - - - - - - - - - - - - - - - - - - - 0 - - - - - - 0 - - - 0 - - - 0 - - - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - 0 - - - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - - - 0 - - - - 0 - - - 0 - - - - - - - - 0 - - - - - - - - - - - - - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - warning - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - warning - - - - - - - - - - - - - error - The "goto" language construct should not be used. - - - - - error - eval() is a security risk so not allowed. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - - 0 - - - - - - 0 - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/wp-coding-standards/wpcs/WordPress-Docs/ruleset.xml b/vendor/wp-coding-standards/wpcs/WordPress-Docs/ruleset.xml deleted file mode 100644 index bc64617..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress-Docs/ruleset.xml +++ /dev/null @@ -1,109 +0,0 @@ - - - - WordPress Coding Standards for Inline Documentation and Comments - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/wp-coding-standards/wpcs/WordPress-Extra/ruleset.xml b/vendor/wp-coding-standards/wpcs/WordPress-Extra/ruleset.xml deleted file mode 100644 index a939d1e..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress-Extra/ruleset.xml +++ /dev/null @@ -1,211 +0,0 @@ - - - - Best practices beyond core WordPress Coding Standards - - - - - - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - - - 5 - - - - - - 5 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - error - - - error - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/wp-coding-standards/wpcs/WordPress/AbstractArrayAssignmentRestrictionsSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/AbstractArrayAssignmentRestrictionsSniff.php deleted file mode 100644 index 9ca127b..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/AbstractArrayAssignmentRestrictionsSniff.php +++ /dev/null @@ -1,261 +0,0 @@ - - */ - public static $groups = array(); - - /** - * Cache for the excluded groups information. - * - * @since 0.11.0 - * - * @var array - */ - protected $excluded_groups = array(); - - /** - * Cache for the group information. - * - * @since 0.13.0 - * - * @var array - */ - protected $groups_cache = array(); - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() { - // Retrieve the groups only once and don't set up a listener if there are no groups. - if ( false === $this->setup_groups() ) { - return array(); - } - - return array( - \T_DOUBLE_ARROW, - \T_CLOSE_SQUARE_BRACKET, - \T_CONSTANT_ENCAPSED_STRING, - \T_DOUBLE_QUOTED_STRING, - ); - } - - /** - * Groups of variables to restrict. - * - * This method should be overridden in extending classes. - * - * Example: groups => array( - * 'groupname' => array( - * 'type' => 'error' | 'warning', - * 'message' => 'Descriptive error message. The error message will be passed the $key and $val of the current array assignment.', - * 'keys' => array( 'key1', 'another_key' ), - * ) - * ) - * - * @return array - */ - abstract public function getGroups(); - - /** - * Cache the groups. - * - * @since 0.13.0 - * - * @return bool True if the groups were setup. False if not. - */ - protected function setup_groups() { - $this->groups_cache = $this->getGroups(); - - if ( empty( $this->groups_cache ) && empty( self::$groups ) ) { - return false; - } - - // Allow for adding extra unit tests. - if ( ! empty( self::$groups ) ) { - $this->groups_cache = array_merge( $this->groups_cache, self::$groups ); - } - - return true; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param int $stackPtr The position of the current token in the stack. - * - * @return void - */ - public function process_token( $stackPtr ) { - - $this->excluded_groups = RulesetPropertyHelper::merge_custom_array( $this->exclude ); - if ( array_diff_key( $this->groups_cache, $this->excluded_groups ) === array() ) { - // All groups have been excluded. - // Don't remove the listener as the exclude property can be changed inline. - return; - } - - $token = $this->tokens[ $stackPtr ]; - - if ( \T_CLOSE_SQUARE_BRACKET === $token['code'] ) { - $equalPtr = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $stackPtr + 1 ), null, true ); - if ( \T_EQUAL !== $this->tokens[ $equalPtr ]['code'] - && \T_COALESCE_EQUAL !== $this->tokens[ $equalPtr ]['code'] - ) { - // This is not an assignment. Bow out. - return; - } - } - - // Instances: Multi-dimensional array. - $inst = array(); - - /* - * Covers array assignments: - * `$foo = array( 'bar' => 'taz' );` - * `$foo['bar'] = $taz;` - */ - if ( \T_CLOSE_SQUARE_BRACKET === $token['code'] || \T_DOUBLE_ARROW === $token['code'] ) { - $operator = $stackPtr; // T_DOUBLE_ARROW. - if ( \T_CLOSE_SQUARE_BRACKET === $token['code'] ) { - $operator = $equalPtr; - } - - $keyIdx = $this->phpcsFile->findPrevious( Tokens::$emptyTokens, ( $stackPtr - 1 ), null, true ); - if ( isset( Tokens::$stringTokens[ $this->tokens[ $keyIdx ]['code'] ] ) - && ! is_numeric( $this->tokens[ $keyIdx ]['content'] ) - ) { - $key = TextStrings::stripQuotes( $this->tokens[ $keyIdx ]['content'] ); - $valStart = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $operator + 1 ), null, true ); - $valEnd = BCFile::findEndOfStatement( $this->phpcsFile, $valStart, \T_COLON ); - if ( \T_COMMA === $this->tokens[ $valEnd ]['code'] - || \T_SEMICOLON === $this->tokens[ $valEnd ]['code'] - ) { - // FindEndOfStatement includes the comma/semi-colon if that's the end of the statement. - // That's not what we want (and inconsistent), so remove it. - --$valEnd; - } - - $val = trim( GetTokensAsString::compact( $this->phpcsFile, $valStart, $valEnd, true ) ); - $inst[ $key ] = array( - 'value' => $val, - 'line' => $token['line'], - 'keyptr' => $keyIdx, - ); - } - } elseif ( isset( Tokens::$stringTokens[ $token['code'] ] ) ) { - /* - * Covers assignments via query parameters: `$foo = 'bar=taz&other=thing';`. - */ - if ( preg_match_all( '#(?:^|&)([a-z_]+)=([^&]*)#i', TextStrings::stripQuotes( $token['content'] ), $matches ) <= 0 ) { - return; // No assignments here, nothing to check. - } - - foreach ( $matches[1] as $match_nr => $key ) { - $inst[ $key ] = array( - 'value' => $matches[2][ $match_nr ], - 'line' => $token['line'], - 'keyptr' => $stackPtr, - ); - } - } - - if ( empty( $inst ) ) { - return; - } - - foreach ( $this->groups_cache as $groupName => $group ) { - - if ( isset( $this->excluded_groups[ $groupName ] ) ) { - continue; - } - - foreach ( $inst as $key => $assignment ) { - if ( ! \in_array( $key, $group['keys'], true ) ) { - continue; - } - - $output = \call_user_func( array( $this, 'callback' ), $key, $assignment['value'], $assignment['line'], $group ); - - if ( ! isset( $output ) || false === $output ) { - continue; - } elseif ( true === $output ) { - $message = $group['message']; - } else { - $message = $output; - } - - MessageHelper::addMessage( - $this->phpcsFile, - $message, - $assignment['keyptr'], - ( 'error' === $group['type'] ), - MessageHelper::stringToErrorcode( $groupName . '_' . $key ), - array( $key, $assignment['value'] ) - ); - } - } - } - - /** - * Callback to process each confirmed key, to check value. - * - * This method must be extended to add the logic to check assignment value. - * - * @param string $key Array index / key. - * @param mixed $val Assigned value. - * @param int $line Token line. - * @param array $group Group definition. - * - * @return mixed FALSE if no match, TRUE if matches, STRING if matches - * with custom error message passed to ->process(). - */ - abstract public function callback( $key, $val, $line, $group ); -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/AbstractClassRestrictionsSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/AbstractClassRestrictionsSniff.php deleted file mode 100644 index e0f1c85..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/AbstractClassRestrictionsSniff.php +++ /dev/null @@ -1,268 +0,0 @@ - array( - * 'lambda' => array( - * 'type' => 'error' | 'warning', - * 'message' => 'Avoid direct calls to the database.', - * 'classes' => array( 'PDO', '\Namespace\Classname' ), - * ) - * ) - * - * You can use * wildcards to target a group of (namespaced) classes. - * Aliased namespaces (use ..) are currently not supported. - * - * Documented here for clarity. Not (re)defined as it is already defined in the parent class. - * - * @return array - * - abstract public function getGroups(); - */ - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() { - // Prepare the function group regular expressions only once. - if ( false === $this->setup_groups( 'classes' ) ) { - return array(); - } - - return array( - \T_DOUBLE_COLON, - \T_NEW, - \T_EXTENDS, - \T_IMPLEMENTS, - ); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * {@internal Unlike in the `AbstractFunctionRestrictionsSniff`, - * we can't do a preliminary check on classes as at this point - * we don't know the class name yet.}} - * - * @param int $stackPtr The position of the current token in the stack. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function process_token( $stackPtr ) { - // Reset the temporary storage before processing the token. - unset( $this->classname ); - - $this->excluded_groups = RulesetPropertyHelper::merge_custom_array( $this->exclude ); - if ( array_diff_key( $this->groups, $this->excluded_groups ) === array() ) { - // All groups have been excluded. - // Don't remove the listener as the exclude property can be changed inline. - return; - } - - if ( true === $this->is_targetted_token( $stackPtr ) ) { - return $this->check_for_matches( $stackPtr ); - } - } - - /** - * Determine if we have a valid classname for the target token. - * - * @since 0.11.0 This logic was originally contained in the `process()` method. - * - * @param int $stackPtr The position of the current token in the stack. - * - * @return bool - */ - public function is_targetted_token( $stackPtr ) { - - $token = $this->tokens[ $stackPtr ]; - $classname = ''; - - if ( \in_array( $token['code'], array( \T_NEW, \T_EXTENDS, \T_IMPLEMENTS ), true ) ) { - if ( \T_NEW === $token['code'] ) { - $nextNonEmpty = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $stackPtr + 1 ), null, true ); - - if ( false === $nextNonEmpty - || \in_array( $this->tokens[ $nextNonEmpty ]['code'], array( \T_READONLY, \T_ANON_CLASS, \T_ATTRIBUTE ), true ) - ) { - // Live coding or anonymous class. Bow out. - return false; - } - - $nameEnd = ( $this->phpcsFile->findNext( array( \T_OPEN_PARENTHESIS, \T_WHITESPACE, \T_SEMICOLON, \T_CLOSE_PARENTHESIS, \T_CLOSE_TAG ), ( $stackPtr + 2 ) ) - 1 ); - } else { - $nameEnd = ( $this->phpcsFile->findNext( array( \T_CLOSE_CURLY_BRACKET, \T_WHITESPACE ), ( $stackPtr + 2 ) ) - 1 ); - } - - if ( isset( $this->tokens[ $stackPtr + 2 ] ) && false !== $nameEnd ) { - $classname = GetTokensAsString::noEmpties( $this->phpcsFile, ( $stackPtr + 2 ), $nameEnd ); - $classname = $this->get_namespaced_classname( $classname, ( $stackPtr - 1 ) ); - } - } - - if ( \T_DOUBLE_COLON === $token['code'] ) { - $nameEnd = $this->phpcsFile->findPrevious( Tokens::$emptyTokens, ( $stackPtr - 1 ), null, true ); - if ( \T_STRING !== $this->tokens[ $nameEnd ]['code'] ) { - // Hierarchy keyword or object stored in variable. - return false; - } - - $nameStart = ( $this->phpcsFile->findPrevious( Collections::namespacedNameTokens(), ( $nameEnd - 1 ), null, true ) + 1 ); - $classname = GetTokensAsString::noEmpties( $this->phpcsFile, $nameStart, $nameEnd ); - $classname = $this->get_namespaced_classname( $classname, ( $nameStart - 1 ) ); - } - - // Stop if we couldn't determine a classname. - if ( empty( $classname ) ) { - return false; - } - - // Nothing to do if one of the hierarchy keywords - 'parent', 'self' or 'static' - is used. - if ( \in_array( strtolower( $classname ), array( '\parent', '\self', '\static' ), true ) ) { - return false; - } - - $this->classname = $classname; - return true; - } - - /** - * Verify if the current token is one of the targeted classes. - * - * @since 0.11.0 Split out from the `process()` method. - * - * @param int $stackPtr The position of the current token in the stack. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function check_for_matches( $stackPtr ) { - $skip_to = array(); - - foreach ( $this->groups as $groupName => $group ) { - - if ( isset( $this->excluded_groups[ $groupName ] ) ) { - continue; - } - - if ( preg_match( $group['regex'], $this->classname ) === 1 ) { - $skip_to[] = $this->process_matched_token( $stackPtr, $groupName, $this->classname ); - } - } - - if ( empty( $skip_to ) || min( $skip_to ) === 0 ) { - return; - } - - return min( $skip_to ); - } - - /** - * Process a matched token. - * - * @since 0.11.0 Split out from the `process()` method. - * - * @param int $stackPtr The position of the current token in the stack. - * @param string $group_name The name of the group which was matched. - * @param string $matched_content The token content (function name) which was matched - * in it original case. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - * - * @phpcs:disable Generic.CodeAnalysis.UselessOverridingMethod.Found - */ - public function process_matched_token( $stackPtr, $group_name, $matched_content ) { - parent::process_matched_token( $stackPtr, $group_name, $matched_content ); - } - // phpcs:enable - - /** - * Prepare the class name for use in a regular expression. - * - * The getGroups() method allows for providing class names with a wildcard * to target - * a group of classes within a namespace. It also allows for providing class names as - * 'ordinary' names or prefixed with one or more namespaces. - * This prepare routine takes that into account while still safely escaping the - * class name for use in a regular expression. - * - * @param string $classname Class name, potentially prefixed with namespaces. - * @return string Regex escaped class name. - */ - protected function prepare_name_for_regex( $classname ) { - $classname = trim( $classname, '\\' ); // Make sure all classnames have a \ prefix, but only one. - return parent::prepare_name_for_regex( $classname ); - } - - /** - * See if the classname was found in a namespaced file and if so, add the namespace to the classname. - * - * @param string $classname The full classname as found. - * @param int $search_from The token position to search up from. - * @return string Classname, potentially prefixed with the namespace. - */ - protected function get_namespaced_classname( $classname, $search_from ) { - // Don't do anything if this is already a fully qualified classname. - if ( empty( $classname ) || '\\' === $classname[0] ) { - return $classname; - } - - // Remove the namespace keyword if used. - if ( 0 === stripos( $classname, 'namespace\\' ) ) { - $classname = substr( $classname, 10 ); - } - - $namespace = Namespaces::determineNamespace( $this->phpcsFile, $search_from ); - if ( '' === $namespace ) { - // No namespace keyword found at all, so global namespace. - $classname = '\\' . $classname; - } else { - $classname = '\\' . $namespace . '\\' . $classname; - } - - return $classname; - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/AbstractFunctionParameterSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/AbstractFunctionParameterSniff.php deleted file mode 100644 index 7b36958..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/AbstractFunctionParameterSniff.php +++ /dev/null @@ -1,169 +0,0 @@ - The only requirement for this array is that the top level - * array keys are the names of the functions you're looking for. - * Other than that, the array can have arbitrary content - * depending on your needs. - */ - protected $target_functions = array(); - - /** - * Groups of functions to restrict. - * - * @return array>> - */ - public function getGroups() { - if ( empty( $this->target_functions ) ) { - return array(); - } - - return array( - $this->group_name => array( - 'functions' => array_keys( $this->target_functions ), - ), - ); - } - - /** - * Process a matched token. - * - * @param int $stackPtr The position of the current token in the stack. - * @param string $group_name The name of the group which was matched. - * @param string $matched_content The token content (function name) which was matched - * in lowercase. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function process_matched_token( $stackPtr, $group_name, $matched_content ) { - - $parameters = PassedParameters::getParameters( $this->phpcsFile, $stackPtr ); - - if ( empty( $parameters ) ) { - /* - * Check if this is a first class callable. - * - * No need for extensive defensive coding as the `is_targetted_token()` method has already - * validated the open and close parentheses exist. - */ - $openParens = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $stackPtr + 1 ), null, true ); - $firstNonEmpty = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $openParens + 1 ), null, true ); - if ( \T_ELLIPSIS === $this->tokens[ $firstNonEmpty ]['code'] ) { - return $this->process_first_class_callable( $stackPtr, $group_name, $matched_content ); - } else { - return $this->process_no_parameters( $stackPtr, $group_name, $matched_content ); - } - } else { - return $this->process_parameters( $stackPtr, $group_name, $matched_content, $parameters ); - } - } - - /** - * Verify if the current token is a function call. Behaves like the parent method, except that - * it returns false if there is no opening parenthesis after the function name (likely a - * function import) or if it is a first class callable. - * - * @param int $stackPtr The position of the current token in the stack. - * - * @return bool - */ - public function is_targetted_token( $stackPtr ) { - if ( ! parent::is_targetted_token( $stackPtr ) ) { - return false; - } - - $next = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $stackPtr + 1 ), null, true ); - - if ( \T_OPEN_PARENTHESIS !== $this->tokens[ $next ]['code'] ) { - // Not a function call (likely a function import). - return false; - } - - if ( isset( $this->tokens[ $next ]['parenthesis_closer'] ) === false ) { - // Syntax error or live coding: missing closing parenthesis. - return false; - } - - return true; - } - - /** - * Process the parameters of a matched function. - * - * This method has to be made concrete in child classes. - * - * @param int $stackPtr The position of the current token in the stack. - * @param string $group_name The name of the group which was matched. - * @param string $matched_content The token content (function name) which was matched - * in lowercase. - * @param array $parameters Array with information about the parameters. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - abstract public function process_parameters( $stackPtr, $group_name, $matched_content, $parameters ); - - /** - * Process the function if no parameters were found. - * - * Defaults to doing nothing. Can be overloaded in child classes to handle functions - * were parameters are expected, but none found. - * - * @param int $stackPtr The position of the current token in the stack. - * @param string $group_name The name of the group which was matched. - * @param string $matched_content The token content (function name) which was matched - * in lowercase. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function process_no_parameters( $stackPtr, $group_name, $matched_content ) {} - - /** - * Process the function if it is used as a first class callable. - * - * Defaults to doing nothing. Can be overloaded in child classes to implement specific checks - * on first class callable use of the function. - * - * @param int $stackPtr The position of the current token in the stack. - * @param string $group_name The name of the group which was matched. - * @param string $matched_content The token content (function name) which was matched - * in lowercase. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function process_first_class_callable( $stackPtr, $group_name, $matched_content ) {} -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/AbstractFunctionRestrictionsSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/AbstractFunctionRestrictionsSniff.php deleted file mode 100644 index 7f300cb..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/AbstractFunctionRestrictionsSniff.php +++ /dev/null @@ -1,358 +0,0 @@ - array( - * 'lambda' => array( - * 'type' => 'error' | 'warning', - * 'message' => 'Use anonymous functions instead please!', - * 'functions' => array( 'file_get_contents', 'create_function', 'mysql_*' ), - * // Only useful when using wildcards: - * 'allow' => array( 'mysql_to_rfc3339' => true, ), - * ) - * ) - * - * You can use * wildcards to target a group of functions. - * When you use * wildcards, you may inadvertently restrict too many - * functions. In that case you can add the `allow` key to - * safe list individual functions to prevent false positives. - * - * @return array - */ - abstract public function getGroups(); - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() { - // Prepare the function group regular expressions only once. - if ( false === $this->setup_groups( 'functions' ) ) { - return array(); - } - - return array( - \T_STRING, - ); - } - - /** - * Set up the regular expressions for each group. - * - * @since 0.10.0 - * - * @param string $key The group array index key where the input for the regular expression can be found. - * @return bool True if the groups were setup. False if not. - */ - protected function setup_groups( $key ) { - // Prepare the function group regular expressions only once. - $this->groups = $this->getGroups(); - - if ( empty( $this->groups ) && empty( self::$unittest_groups ) ) { - return false; - } - - // Allow for adding extra unit tests. - if ( ! empty( self::$unittest_groups ) ) { - $this->groups = array_merge( $this->groups, self::$unittest_groups ); - } - - $all_items = array(); - foreach ( $this->groups as $groupName => $group ) { - if ( empty( $group[ $key ] ) ) { - unset( $this->groups[ $groupName ] ); - continue; - } - - // Lowercase the items and potential allows as the comparisons should be done case-insensitively. - // Note: this disregards non-ascii names, but as we don't have any of those, that is okay for now. - $items = array_map( 'strtolower', $group[ $key ] ); - $this->groups[ $groupName ][ $key ] = $items; - - if ( ! empty( $group['allow'] ) ) { - $this->groups[ $groupName ]['allow'] = array_change_key_case( $group['allow'], \CASE_LOWER ); - } - - $items = array_map( array( $this, 'prepare_name_for_regex' ), $items ); - $all_items[] = $items; - $items = implode( '|', $items ); - - $this->groups[ $groupName ]['regex'] = sprintf( $this->regex_pattern, $items ); - } - - if ( empty( $this->groups ) ) { - return false; - } - - // Create one "super-regex" to allow for initial filtering. - $all_items = \call_user_func_array( 'array_merge', $all_items ); - $all_items = implode( '|', array_unique( $all_items ) ); - $this->prelim_check_regex = sprintf( $this->regex_pattern, $all_items ); - - return true; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param int $stackPtr The position of the current token in the stack. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function process_token( $stackPtr ) { - - $this->excluded_groups = RulesetPropertyHelper::merge_custom_array( $this->exclude ); - if ( array_diff_key( $this->groups, $this->excluded_groups ) === array() ) { - // All groups have been excluded. - // Don't remove the listener as the exclude property can be changed inline. - return; - } - - // Preliminary check. If the content of the T_STRING is not one of the functions we're - // looking for, we can bow out before doing the heavy lifting of checking whether - // this is a function call. - if ( preg_match( $this->prelim_check_regex, $this->tokens[ $stackPtr ]['content'] ) !== 1 ) { - return; - } - - if ( true === $this->is_targetted_token( $stackPtr ) ) { - return $this->check_for_matches( $stackPtr ); - } - } - - /** - * Verify if the current token is a function call. - * - * @since 0.11.0 Split out from the `process()` method. - * - * @param int $stackPtr The position of the current token in the stack. - * - * @return bool - */ - public function is_targetted_token( $stackPtr ) { - // Exclude function definitions, class methods, and namespaced calls. - if ( ContextHelper::has_object_operator_before( $this->phpcsFile, $stackPtr ) === true ) { - return false; - } - - if ( ContextHelper::is_token_namespaced( $this->phpcsFile, $stackPtr ) === true ) { - return false; - } - - if ( Context::inAttribute( $this->phpcsFile, $stackPtr ) ) { - // Class instantiation or constant in attribute, not function call. - return false; - } - - $search = Tokens::$emptyTokens; - $search[ \T_BITWISE_AND ] = \T_BITWISE_AND; - - $prev = $this->phpcsFile->findPrevious( $search, ( $stackPtr - 1 ), null, true ); - - // Skip sniffing on function, OO definitions or for function aliases in use statements. - $invalid_tokens = Tokens::$ooScopeTokens; - $invalid_tokens += array( - \T_FUNCTION => \T_FUNCTION, - \T_NEW => \T_NEW, - \T_AS => \T_AS, // Use declaration alias. - ); - - if ( isset( $invalid_tokens[ $this->tokens[ $prev ]['code'] ] ) ) { - return false; - } - - // Check if this could even be a function call. - $next = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $stackPtr + 1 ), null, true ); - if ( false === $next ) { - return false; - } - - // Check for `use function ... (as|;)`. - if ( ( \T_STRING === $this->tokens[ $prev ]['code'] && 'function' === $this->tokens[ $prev ]['content'] ) - && ( \T_AS === $this->tokens[ $next ]['code'] || \T_SEMICOLON === $this->tokens[ $next ]['code'] ) - ) { - return true; - } - - // If it's not a `use` statement, there should be parenthesis. - if ( \T_OPEN_PARENTHESIS !== $this->tokens[ $next ]['code'] ) { - return false; - } - - return true; - } - - /** - * Verify if the current token is one of the targeted functions. - * - * @since 0.11.0 Split out from the `process()` method. - * - * @param int $stackPtr The position of the current token in the stack. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function check_for_matches( $stackPtr ) { - $token_content = strtolower( $this->tokens[ $stackPtr ]['content'] ); - $skip_to = array(); - - foreach ( $this->groups as $groupName => $group ) { - - if ( isset( $this->excluded_groups[ $groupName ] ) ) { - continue; - } - - if ( isset( $group['allow'][ $token_content ] ) ) { - continue; - } - - if ( preg_match( $group['regex'], $token_content ) === 1 ) { - $skip_to[] = $this->process_matched_token( $stackPtr, $groupName, $token_content ); - } - } - - if ( empty( $skip_to ) || min( $skip_to ) === 0 ) { - return; - } - - return min( $skip_to ); - } - - /** - * Process a matched token. - * - * @since 0.11.0 Split out from the `process()` method. - * - * @param int $stackPtr The position of the current token in the stack. - * @param string $group_name The name of the group which was matched. - * @param string $matched_content The token content (function name) which was matched - * in lowercase. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function process_matched_token( $stackPtr, $group_name, $matched_content ) { - - MessageHelper::addMessage( - $this->phpcsFile, - $this->groups[ $group_name ]['message'], - $stackPtr, - ( 'error' === $this->groups[ $group_name ]['type'] ), - MessageHelper::stringToErrorcode( $group_name . '_' . $matched_content ), - array( $matched_content ) - ); - } - - /** - * Prepare the function name for use in a regular expression. - * - * The getGroups() method allows for providing function names with a wildcard * to target - * a group of functions. This prepare routine takes that into account while still safely - * escaping the function name for use in a regular expression. - * - * @since 0.10.0 - * - * @param string $function_name Function name. - * @return string Regex escaped function name. - */ - protected function prepare_name_for_regex( $function_name ) { - $function_name = str_replace( array( '.*', '*' ), '@@', $function_name ); // Replace wildcards with placeholder. - $function_name = preg_quote( $function_name, '`' ); - $function_name = str_replace( '@@', '.*', $function_name ); // Replace placeholder with regex wildcard. - - return $function_name; - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Docs/Arrays/ArrayIndentationStandard.xml b/vendor/wp-coding-standards/wpcs/WordPress/Docs/Arrays/ArrayIndentationStandard.xml deleted file mode 100644 index 6d03347..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Docs/Arrays/ArrayIndentationStandard.xml +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - - 22, -); - ]]> - - - 22, - ); - ]]> - - - - - - - - 22, - 'comment_count' => array( - 'value' => 25, - 'compare' => '>=', - ), - 'post_type' => array( - 'post', - 'page', - ), -); - ]]> - - - 22, - 'comment_count' => array( - 'value' => 25, - 'compare' => '>=', - ), - 'post_type' => array( - 'post', - 'page', - ), -); - ]]> - - - - - - - - 'start of phrase' - . 'concatenated additional phrase' - . 'more text', -); - ]]> - - - 'start of phrase' -. 'concatenated additional phrase' -. 'more text', -); - ]]> - - - - - - - - << - start of phrase - concatenated additional phrase - more text -EOD -, -); - ]]> - - - diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Docs/Arrays/ArrayKeySpacingRestrictionsStandard.xml b/vendor/wp-coding-standards/wpcs/WordPress/Docs/Arrays/ArrayKeySpacingRestrictionsStandard.xml deleted file mode 100644 index 55c2593..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Docs/Arrays/ArrayKeySpacingRestrictionsStandard.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - [ $post_id ]; -$post_title = $post[ 'concatenated' . $title ]; -$post = $posts[ HOME_PAGE ]; -$post = $posts[123]; -$post_title = $post['post_title']; - ]]> - - - [$post_id]; -$post_title = $post['concatenated' . $title ]; -$post = $posts[HOME_PAGE]; -$post = $posts[ 123 ]; -$post_title = $post[ 'post_title' ]; - ]]> - - - diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Docs/Arrays/MultipleStatementAlignmentStandard.xml b/vendor/wp-coding-standards/wpcs/WordPress/Docs/Arrays/MultipleStatementAlignmentStandard.xml deleted file mode 100644 index 35eb913..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Docs/Arrays/MultipleStatementAlignmentStandard.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - => 22 ); -$bar = array( 'year' => $current_year ); - ]]> - - - =>22 ); -$bar = array( 'year'=> $current_year ); - ]]> - - - - - - - - => 22, - 'year' => $current_year, - 'monthnum' => $current_month, -); - ]]> - - - => 22, - 'year' => $current_year, - 'monthnum' => $current_month, -); - ]]> - - - diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Docs/CodeAnalysis/EscapedNotTranslatedStandard.xml b/vendor/wp-coding-standards/wpcs/WordPress/Docs/CodeAnalysis/EscapedNotTranslatedStandard.xml deleted file mode 100644 index 43950a0..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Docs/CodeAnalysis/EscapedNotTranslatedStandard.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - esc_html__( 'text', 'domain' ); - ]]> - - - esc_html( 'text', 'domain' ); - ]]> - - - diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Docs/DB/PreparedSQLStandard.xml b/vendor/wp-coding-standards/wpcs/WordPress/Docs/DB/PreparedSQLStandard.xml deleted file mode 100644 index d58d617..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Docs/DB/PreparedSQLStandard.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - prepare() to escape and quote the contents of variables. This prevents SQL injection. - Use placeholders for all variables used in the query. You should not use variable interpolation or concatenation. - ]]> - - - - prepare( - 'SELECT * from table - WHERE field = %s', - $_GET['foo'] -); - ]]> - - - query( - "SELECT * from table - WHERE field = {$_GET['foo']}" -); - ]]> - - - - - - prepare( - 'SELECT * from table - WHERE field = %s', - $value -); - ]]> - - - get_results( - "SELECT * from table - WHERE field = " . $value -); - ]]> - - - diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Docs/DateTime/CurrentTimeTimestampStandard.xml b/vendor/wp-coding-standards/wpcs/WordPress/Docs/DateTime/CurrentTimeTimestampStandard.xml deleted file mode 100644 index 2dd3e9f..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Docs/DateTime/CurrentTimeTimestampStandard.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - time(); - ]]> - - - current_time( 'timestamp', true ); - ]]> - - - - - 'Y-m-d' ); - ]]> - - - current_time( 'U', false ); - ]]> - - - diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Docs/DateTime/RestrictedFunctionsStandard.xml b/vendor/wp-coding-standards/wpcs/WordPress/Docs/DateTime/RestrictedFunctionsStandard.xml deleted file mode 100644 index 845869d..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Docs/DateTime/RestrictedFunctionsStandard.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - DateTime(); -$date->setTimezone( - new DateTimeZone( 'Europe/Amsterdam' ) -); - ]]> - - - date_default_timezone_set( 'Europe/Amsterdam' ); - ]]> - - - - - - - - gmdate( - 'Y-m-d\TH:i:s', - strtotime( $plugin['last_updated'] ) -); - ]]> - - - date( - 'Y-m-d\TH:i:s', - strtotime( $plugin['last_updated'] ) -); - ]]> - - - diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Docs/NamingConventions/PrefixAllGlobalsStandard.xml b/vendor/wp-coding-standards/wpcs/WordPress/Docs/NamingConventions/PrefixAllGlobalsStandard.xml deleted file mode 100644 index bb518db..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Docs/NamingConventions/PrefixAllGlobalsStandard.xml +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - - - 'ECPT_VERSION', '1.0' ); - -$ecpt_admin = new ECPT_Admin_Page(); - -class ECPT_Admin_Page {} - -apply_filter( - 'ecpt_modify_content', - $ecpt_content -); - ]]> - - - 'PLUGIN_VERSION', '1.0' ); - -$admin = new Admin_Page(); - -class Admin_Page {} - -apply_filter( - 'modify_content', - $content -); - ]]> - - - - - ECPT_Plugin\Admin; - -// Constants declared using `const` will -// be namespaced and therefore prefixed. -const VERSION = 1.0; - -// A class declared in a (prefixed) namespace -// is automatically prefixed. -class Admin_Page {} - -// Variables in a namespaced file are not -// namespaced, so still need prefixing. -$ecpt_admin = new Admin_Page(); - -// Hook names are not subject to namespacing. -apply_filter( - 'ecpt_modify_content', - $ecpt_content -); - ]]> - - - Admin; - -// As the namespace is not prefixed, this -// is still bad. -const VERSION = 1.0; - -// As the namespace is not prefixed, this -// is still bad. -class Admin_Page {} - ]]> - - - - - - - - mycoolplugin_save_post() {} - ]]> - - - wp_save_post() {} - ]]> - - - - - - - - MyPluginIsCool {} - ]]> - - - My {} - ]]> - - - diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Docs/NamingConventions/ValidFunctionNameStandard.xml b/vendor/wp-coding-standards/wpcs/WordPress/Docs/NamingConventions/ValidFunctionNameStandard.xml deleted file mode 100644 index 429f699..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Docs/NamingConventions/ValidFunctionNameStandard.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - prefix_function_name() {} - ]]> - - - Prefix_Function_NAME() {} - ]]> - - - - - method_name() {} -} - ]]> - - - methodName() {} -} - ]]> - - - - - _prefix_function_name() {} - ]]> - - - __prefix_function_name() {} - ]]> - - - diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Docs/NamingConventions/ValidHookNameStandard.xml b/vendor/wp-coding-standards/wpcs/WordPress/Docs/NamingConventions/ValidHookNameStandard.xml deleted file mode 100644 index 4130dea..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Docs/NamingConventions/ValidHookNameStandard.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - 'prefix_hook_name', $var ); - ]]> - - - 'Prefix_Hook_NAME', $var ); - ]]> - - - - - 'prefix_hook_name', $var ); - ]]> - - - 'prefix\hook-name', $var ); - ]]> - - - diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Docs/NamingConventions/ValidPostTypeSlugStandard.xml b/vendor/wp-coding-standards/wpcs/WordPress/Docs/NamingConventions/ValidPostTypeSlugStandard.xml deleted file mode 100644 index 639dda5..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Docs/NamingConventions/ValidPostTypeSlugStandard.xml +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - - - 'my_short_slug', - array() -); - ]]> - - - 'my_own_post_type_too_long', - array() -); - ]]> - - - - - - - - 'my_post_type_slug', - array() -); - ]]> - - - 'my/post/type/slug', - array() -); - ]]> - - - - - - - - 'my_post_active', - array() -); - ]]> - - - "my_post_{$status}", - array() -); - ]]> - - - - - - - - 'prefixed_author', - array() -); - ]]> - - - 'author', - array() -); - ]]> - - - - - - - - 'prefixed_author', - array() -); - ]]> - - - 'wp_author', - array() -); - ]]> - - - diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Docs/NamingConventions/ValidVariableNameStandard.xml b/vendor/wp-coding-standards/wpcs/WordPress/Docs/NamingConventions/ValidVariableNameStandard.xml deleted file mode 100644 index 56d400c..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Docs/NamingConventions/ValidVariableNameStandard.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - $prefix_variable_name = 'value'; - -echo $prefix_variable_name; - ]]> - - - $Prefix_Variable_NAME = 'value'; - -echo $Prefix_Variable_NAME; - ]]> - - - - - $property_name = 'value'; -} - ]]> - - - $propertyName = 'value'; -} - ]]> - - - diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Docs/PHP/DontExtractStandard.xml b/vendor/wp-coding-standards/wpcs/WordPress/Docs/PHP/DontExtractStandard.xml deleted file mode 100644 index ac42ce0..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Docs/PHP/DontExtractStandard.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - 'My title', - 'content' => 'My content', - 'ID' => 123 -); -echo $post_data['title']; - ]]> - - - 'My title', - 'content' => 'My content', - 'ID' => 123 -); - -extract( $var_array ); -echo $title; - ]]> - - - diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Docs/PHP/IniSetStandard.xml b/vendor/wp-coding-standards/wpcs/WordPress/Docs/PHP/IniSetStandard.xml deleted file mode 100644 index 3b8bfbe..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Docs/PHP/IniSetStandard.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - 'short_open_tag', 'off' ); - ]]> - - - - - - - - wp_raise_memory_limit(); - ]]> - - - 'memory_limit', '256M' ); - ]]> - - - diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Docs/PHP/StrictInArrayStandard.xml b/vendor/wp-coding-standards/wpcs/WordPress/Docs/PHP/StrictInArrayStandard.xml deleted file mode 100644 index e280a92..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Docs/PHP/StrictInArrayStandard.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - true ) ) {} - ]]> - - - ) ) {} - ]]> - - - - - - true ); - ]]> - - - ); - ]]> - - - - - - true ); - ]]> - - - ); - ]]> - - - diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Docs/PHP/YodaConditionsStandard.xml b/vendor/wp-coding-standards/wpcs/WordPress/Docs/PHP/YodaConditionsStandard.xml deleted file mode 100644 index 96666d5..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Docs/PHP/YodaConditionsStandard.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - true === $the_force ) { - $victorious = you_will( $be ); -} - ]]> - - - $the_force === false ) { - $victorious = you_will_not( $be ); -} - ]]> - - - diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Docs/Security/SafeRedirectStandard.xml b/vendor/wp-coding-standards/wpcs/WordPress/Docs/Security/SafeRedirectStandard.xml deleted file mode 100644 index aee63a6..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Docs/Security/SafeRedirectStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - wp_safe_redirect( $location ); - ]]> - - - wp_redirect( $location ); - ]]> - - - diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/CapabilitiesStandard.xml b/vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/CapabilitiesStandard.xml deleted file mode 100644 index c864664..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/CapabilitiesStandard.xml +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - 'manage_sites' ) ) { } - ]]> - - - 'manage_site', $user->ID ); - ]]> - - - - - - - - 'manage_options', - 'options_page_slug', - 'project_options_page_cb' -); - ]]> - - - 'author', - 'options_page_slug', - 'project_options_page_cb' -); - ]]> - - - - - - - - 'read' ) ) { } - ]]> - - - 'level_6' ) ) { } - ]]> - - - diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/CapitalPDangitStandard.xml b/vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/CapitalPDangitStandard.xml deleted file mode 100644 index 0cdf49b..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/CapitalPDangitStandard.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - WordPress_Example { - - /** - * This function is about WordPress. - */ - public function explain() { - echo 'This is an explanation - about WordPress.'; - } -} - ]]> - - - Wordpress_Example { - - /** - * This function is about Wordpress. - */ - public function explain() { - echo 'This is an explanation - about wordpress.'; - } -} - ]]> - - - diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/ClassNameCaseStandard.xml b/vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/ClassNameCaseStandard.xml deleted file mode 100644 index 2d66d9f..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/ClassNameCaseStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/CronIntervalStandard.xml b/vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/CronIntervalStandard.xml deleted file mode 100644 index 03c75b8..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/CronIntervalStandard.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - HOUR_IN_SECONDS, - 'display' => __( 'Every hour' ) - ); - return $schedules; -} - -add_filter( - 'cron_schedules', - 'adjust_schedules' -); - ]]> - - - 9 * 60, - 'display' => __( 'Every 9 minutes' ) - ); - return $schedules; -} - -add_filter( - 'cron_schedules', - 'adjust_schedules' -); - ]]> - - - diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/DeprecatedClassesStandard.xml b/vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/DeprecatedClassesStandard.xml deleted file mode 100644 index cf4dc07..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/DeprecatedClassesStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - WP_User_Query(); - ]]> - - - WP_User_Search(); // Deprecated WP 3.1. - ]]> - - - diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/DeprecatedFunctionsStandard.xml b/vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/DeprecatedFunctionsStandard.xml deleted file mode 100644 index 9b6071e..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/DeprecatedFunctionsStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - get_sites(); - ]]> - - - wp_get_sites(); // Deprecated WP 4.6. - ]]> - - - diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/DeprecatedParameterValuesStandard.xml b/vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/DeprecatedParameterValuesStandard.xml deleted file mode 100644 index 00ef2c2..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/DeprecatedParameterValuesStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - 'url' ); - ]]> - - - 'home' ); // Deprecated WP 2.2.0. - ]]> - - - diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/DeprecatedParametersStandard.xml b/vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/DeprecatedParametersStandard.xml deleted file mode 100644 index 1c2366a..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/DeprecatedParametersStandard.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - after the deprecated parameter, only ever pass the default value. - ]]> - - - - - - - $string ); - ]]> - - - - - '', 'yes' ); - ]]> - - - 'oops', 'yes' ); - ]]> - - - diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/EnqueuedResourceParametersStandard.xml b/vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/EnqueuedResourceParametersStandard.xml deleted file mode 100644 index 4060d79..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/EnqueuedResourceParametersStandard.xml +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - '1.0.0' -); - ]]> - - - - - - - - - - - '1.0.0', - true -); - ]]> - - - false, - true -); - ]]> - - - - - - - - true -); - ]]> - - - - - - diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/EnqueuedResourcesStandard.xml b/vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/EnqueuedResourcesStandard.xml deleted file mode 100644 index 1f70130..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/EnqueuedResourcesStandard.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - wp_enqueue_script( - 'someScript-js', - $path_to_file, - array( 'jquery' ), - '1.0.0', - true -); - ]]> - - - ', - esc_url( $path_to_file ) -); - ]]> - - - - - - - - wp_enqueue_style( - 'style-name', - $path_to_file, - array(), - '1.0.0' -); - ]]> - - - ', - esc_url( $path_to_file ) -); - ]]> - - - diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/GetMetaSingleStandard.xml b/vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/GetMetaSingleStandard.xml deleted file mode 100644 index 0d1a977..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/GetMetaSingleStandard.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - 'admin_color', - true -); -$post_meta = get_metadata( 'post', $post_id ); - ]]> - - - 'admin_color' -); - ]]> - - - diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/PostsPerPageStandard.xml b/vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/PostsPerPageStandard.xml deleted file mode 100644 index 0191cf2..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Docs/WP/PostsPerPageStandard.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - -1, -); -$args = array( - 'posts_per_page' => 100, -); -$args = array( - 'posts_per_page' => '10', -); - -$query_args['posts_per_page'] = 100; - -_query_posts( 'nopaging=1&posts_per_page=50' ); - ]]> - - - 101, -); - -$query_args['posts_per_page'] = 200; - -_query_posts( 'nopaging=1&posts_per_page=999' ); - ]]> - - - - - -1, -); -$args = array( - 'numberposts' => 100, -); -$args = array( - 'numberposts' => '10', -); - -$query_args['numberposts'] = '-1'; - -_query_posts( 'numberposts=50' ); - ]]> - - - 101, -); - -$query_args['numberposts'] = '200'; - -_query_posts( 'numberposts=999' ); - ]]> - - - diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Docs/WhiteSpace/CastStructureSpacingStandard.xml b/vendor/wp-coding-standards/wpcs/WordPress/Docs/WhiteSpace/CastStructureSpacingStandard.xml deleted file mode 100644 index d5e6172..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Docs/WhiteSpace/CastStructureSpacingStandard.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - (int) '420'; - -// No space between spread operator and cast. -$a = function_call( ...(array) $mixed ); - ]]> - - - =(int) '420'; - ]]> - - -
    diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Docs/WhiteSpace/ControlStructureSpacingStandard.xml b/vendor/wp-coding-standards/wpcs/WordPress/Docs/WhiteSpace/ControlStructureSpacingStandard.xml deleted file mode 100644 index 943967a..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Docs/WhiteSpace/ControlStructureSpacingStandard.xml +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - ( have_posts() ) {} - -// For multi-line conditions, -// a new line is also accepted. -if ( true === $condition - && $count > 10 -) {} - ]]> - - - (have_posts()){} - -// Too much space. -while ( have_posts() ) {} - ]]> - - - - - - - - { - // Do something. -} catch ( - ExceptionA | ExceptionB $e -) { -} - ]]> - - - { - // Do something. -} catch ( Exception $e ) -( -} - ]]> - - - - - { - // Do something. -} - ]]> - - - { - // Do something. -} - ]]> - - - - - - - - : - // Do something. -endforeach; - ]]> - - - : - // Do something. -endforeach; - ]]> - - - - - - - - - - - - - -} - ]]> - - - - - - - - - - - - - echo $a; - - -} - ]]> - - - diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Docs/WhiteSpace/ObjectOperatorSpacingStandard.xml b/vendor/wp-coding-standards/wpcs/WordPress/Docs/WhiteSpace/ObjectOperatorSpacingStandard.xml deleted file mode 100644 index 10fb004..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Docs/WhiteSpace/ObjectOperatorSpacingStandard.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - , ?->, ::) should not have any spaces around them, though new lines are allowed except for use with the `::class` constant. - ]]> - - - - ->bar(); - ]]> - - - ?-> bar(); - ]]> - - - diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Docs/WhiteSpace/OperatorSpacingStandard.xml b/vendor/wp-coding-standards/wpcs/WordPress/Docs/WhiteSpace/OperatorSpacingStandard.xml deleted file mode 100644 index 7b2f877..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Docs/WhiteSpace/OperatorSpacingStandard.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - === $b && $b === $c ) {} -if ( ! $var ) {} - ]]> - - - && $b === $c ) {} -if ( ! $var ) {} - -// Too little space. -if ( $a===$b &&$b ===$c ) {} -if ( !$var ) {} - ]]> - - - - - - && $b === $c -) {} - ]]> - - - - && $b === $c -) {} - ]]> - - - - - = 'foo'; -$all = 'foobar'; - ]]> - - - = 'foo'; -$all ='foobar'; - ]]> - - - diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Helpers/ArrayWalkingFunctionsHelper.php b/vendor/wp-coding-standards/wpcs/WordPress/Helpers/ArrayWalkingFunctionsHelper.php deleted file mode 100644 index 76623d7..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Helpers/ArrayWalkingFunctionsHelper.php +++ /dev/null @@ -1,108 +0,0 @@ - - */ - private static $arrayWalkingFunctions = array( - 'array_map' => array( - 'position' => 1, - 'name' => 'callback', - ), - 'map_deep' => array( - 'position' => 2, - 'name' => 'callback', - ), - ); - - /** - * Retrieve a list of the supported "array walking" functions. - * - * @since 3.0.0 - * - * @return array - */ - public static function get_functions() { - return \array_fill_keys( \array_keys( self::$arrayWalkingFunctions ), true ); - } - - /** - * Check if a particular function is an "array walking" function. - * - * @since 3.0.0 - * - * @param string $functionName The name of the function to check. - * - * @return bool - */ - public static function is_array_walking_function( $functionName ) { - return isset( self::$arrayWalkingFunctions[ strtolower( $functionName ) ] ); - } - - /** - * Retrieve the parameter information for the callback parameter for an array walking function. - * - * @since 3.0.0 - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found. - * @param int $stackPtr The position of function call name token. - * - * @return array|false Array with information on the callback parameter. - * Or `FALSE` if the parameter is not found. - * See the PHPCSUtils PassedParameters::getParameters() documentation - * for the format of the returned (single-dimensional) array. - */ - public static function get_callback_parameter( File $phpcsFile, $stackPtr ) { - $tokens = $phpcsFile->getTokens(); - if ( isset( $tokens[ $stackPtr ] ) === false ) { - return false; - } - - $functionName = strtolower( $tokens[ $stackPtr ]['content'] ); - if ( isset( self::$arrayWalkingFunctions[ $functionName ] ) === false ) { - return false; - } - - return PassedParameters::getParameter( - $phpcsFile, - $stackPtr, - self::$arrayWalkingFunctions[ $functionName ]['position'], - self::$arrayWalkingFunctions[ $functionName ]['name'] - ); - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Helpers/ConstantsHelper.php b/vendor/wp-coding-standards/wpcs/WordPress/Helpers/ConstantsHelper.php deleted file mode 100644 index 6decbb4..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Helpers/ConstantsHelper.php +++ /dev/null @@ -1,135 +0,0 @@ -getTokens(); - - // Check for the existence of the token. - if ( ! isset( $tokens[ $stackPtr ] ) ) { - return false; - } - - // Is this one of the tokens this function handles ? - if ( \T_STRING !== $tokens[ $stackPtr ]['code'] ) { - return false; - } - - $next = $phpcsFile->findNext( Tokens::$emptyTokens, ( $stackPtr + 1 ), null, true ); - if ( false !== $next - && ( \T_OPEN_PARENTHESIS === $tokens[ $next ]['code'] - || \T_DOUBLE_COLON === $tokens[ $next ]['code'] ) - ) { - // Function call or declaration. - return false; - } - - // Array of tokens which if found preceding the $stackPtr indicate that a T_STRING is not a global constant. - $tokens_to_ignore = array( - \T_NAMESPACE => true, - \T_USE => true, - \T_EXTENDS => true, - \T_IMPLEMENTS => true, - \T_NEW => true, - \T_FUNCTION => true, - \T_INSTANCEOF => true, - \T_INSTEADOF => true, - \T_GOTO => true, - ); - $tokens_to_ignore += Tokens::$ooScopeTokens; - $tokens_to_ignore += Collections::objectOperators(); - $tokens_to_ignore += Tokens::$scopeModifiers; - - $prev = $phpcsFile->findPrevious( Tokens::$emptyTokens, ( $stackPtr - 1 ), null, true ); - if ( isset( $tokens_to_ignore[ $tokens[ $prev ]['code'] ] ) ) { - // Not the use of a constant. - return false; - } - - if ( ContextHelper::is_token_namespaced( $phpcsFile, $stackPtr ) === true ) { - // Namespaced constant of the same name. - return false; - } - - if ( \T_CONST === $tokens[ $prev ]['code'] - && Scopes::isOOConstant( $phpcsFile, $prev ) - ) { - // Class constant declaration of the same name. - return false; - } - - /* - * Deal with a number of variations of use statements. - */ - for ( $i = $stackPtr; $i > 0; $i-- ) { - if ( $tokens[ $i ]['line'] !== $tokens[ $stackPtr ]['line'] ) { - break; - } - } - - $firstOnLine = $phpcsFile->findNext( Tokens::$emptyTokens, ( $i + 1 ), null, true ); - if ( false !== $firstOnLine && \T_USE === $tokens[ $firstOnLine ]['code'] ) { - $nextOnLine = $phpcsFile->findNext( Tokens::$emptyTokens, ( $firstOnLine + 1 ), null, true ); - if ( false !== $nextOnLine ) { - if ( \T_STRING === $tokens[ $nextOnLine ]['code'] - && 'const' === $tokens[ $nextOnLine ]['content'] - ) { - $hasNsSep = $phpcsFile->findNext( \T_NS_SEPARATOR, ( $nextOnLine + 1 ), $stackPtr ); - if ( false !== $hasNsSep ) { - // Namespaced const (group) use statement. - return false; - } - } else { - // Not a const use statement. - return false; - } - } - } - - return true; - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Helpers/ContextHelper.php b/vendor/wp-coding-standards/wpcs/WordPress/Helpers/ContextHelper.php deleted file mode 100644 index b90006f..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Helpers/ContextHelper.php +++ /dev/null @@ -1,394 +0,0 @@ - Key is token constant, value irrelevant. - */ - private static $safe_casts = array( - \T_INT_CAST => true, - \T_DOUBLE_CAST => true, - \T_BOOL_CAST => true, - \T_UNSET_CAST => true, - ); - - /** - * List of PHP native functions to test the type of a variable. - * - * Using these functions is safe in combination with superglobals without - * unslashing or sanitization. - * - * They should, however, not be regarded as unslashing or sanitization functions. - * - * @since 2.1.0 - * @since 3.0.0 - Moved from the Sniff class to this class. - * - The property visibility was changed from `protected` to `private static`. - * - * @var array Key is function name, value irrelevant. - */ - private static $typeTestFunctions = array( - 'is_array' => true, - 'is_bool' => true, - 'is_callable' => true, - 'is_countable' => true, - 'is_double' => true, - 'is_float' => true, - 'is_int' => true, - 'is_integer' => true, - 'is_iterable' => true, - 'is_long' => true, - 'is_null' => true, - 'is_numeric' => true, - 'is_object' => true, - 'is_real' => true, - 'is_resource' => true, - 'is_scalar' => true, - 'is_string' => true, - ); - - /** - * List of PHP native functions to check if an array index exists. - * - * @since 3.0.0 - * - * @var array Key is function name, value irrelevant. - */ - private static $key_exists_functions = array( - 'array_key_exists' => true, - 'key_exists' => true, // Alias. - ); - - /** - * Array functions to compare a $needle to a predefined set of values. - * - * If the value is set to an array, the parameter specified in the array is - * required for the function call to be considered as a comparison. - * - * @since 2.1.0 - * @since 3.0.0 - Moved from the Sniff class to this class. - * - The property visibility was changed from `protected` to `private static`. - * - * @var array - */ - private static $arrayCompareFunctions = array( - 'in_array' => true, - 'array_search' => true, - 'array_keys' => array( - 'position' => 2, - 'name' => 'filter_value', - ), - ); - - /** - * Check if a particular token acts - statically or non-statically - on an object. - * - * {@internal Note: this may still mistake a namespaced function imported via a `use` statement for - * a global function!} - * - * @since 2.1.0 - * @since 3.0.0 - Moved from the Sniff class to this class. - * - The method was renamed from `is_class_object_call() to `has_object_operator_before()`. - * - The method visibility was changed from `protected` to `public static`. - * - The `$phpcsFile` parameter was added. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The index of the token in the stack. - * - * @return bool - */ - public static function has_object_operator_before( File $phpcsFile, $stackPtr ) { - $tokens = $phpcsFile->getTokens(); - if ( isset( $tokens[ $stackPtr ] ) === false ) { - return false; - } - - $before = $phpcsFile->findPrevious( Tokens::$emptyTokens, ( $stackPtr - 1 ), null, true ); - - return isset( Collections::objectOperators()[ $tokens[ $before ]['code'] ] ); - } - - /** - * Check if a particular token is prefixed with a namespace. - * - * {@internal This will give a false positive if the file is not namespaced and the token is prefixed - * with `namespace\`.} - * - * @since 2.1.0 - * @since 3.0.0 - Moved from the Sniff class to this class. - * - The method visibility was changed from `protected` to `public static`. - * - The `$phpcsFile` parameter was added. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The index of the token in the stack. - * - * @return bool - */ - public static function is_token_namespaced( File $phpcsFile, $stackPtr ) { - $tokens = $phpcsFile->getTokens(); - if ( isset( $tokens[ $stackPtr ] ) === false ) { - return false; - } - - $prev = $phpcsFile->findPrevious( Tokens::$emptyTokens, ( $stackPtr - 1 ), null, true ); - - if ( \T_NS_SEPARATOR !== $tokens[ $prev ]['code'] ) { - return false; - } - - $before_prev = $phpcsFile->findPrevious( Tokens::$emptyTokens, ( $prev - 1 ), null, true ); - if ( \T_STRING !== $tokens[ $before_prev ]['code'] - && \T_NAMESPACE !== $tokens[ $before_prev ]['code'] - ) { - return false; - } - - return true; - } - - /** - * Check if a token is (part of) a parameter for a function call to a select list of functions. - * - * This is useful, for instance, when trying to determine the context a variable is used in. - * - * For example: this function could be used to determine if the variable `$foo` is used - * in a global function call to the function `is_foo()`. - * In that case, a call to this function would return the stackPtr to the T_STRING `is_foo` - * for code like: `is_foo( $foo, 'some_other_param' )`, while it would return `false` for - * the following code `is_bar( $foo, 'some_other_param' )`. - * - * @since 2.1.0 - * @since 3.0.0 - Moved from the Sniff class to this class. - * - The method visibility was changed from `protected` to `public static`. - * - The `$phpcsFile` parameter was added. - * - The `$global` parameter was renamed to `$global_function`. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The index of the token in the stack. - * @param array $valid_functions List of valid function names. - * Note: The keys to this array should be the function names - * in lowercase. Values are irrelevant. - * @param bool $global_function Optional. Whether to make sure that the function call is - * to a global function. If `false`, calls to methods, be it static - * `Class::method()` or via an object `$obj->method()`, and - * namespaced function calls, like `MyNS\function_name()` will - * also be accepted. - * Defaults to `true`. - * @param bool $allow_nested Optional. Whether to allow for nested function calls within the - * call to this function. - * I.e. when checking whether a token is within a function call - * to `strtolower()`, whether to accept `strtolower( trim( $var ) )` - * or only `strtolower( $var )`. - * Defaults to `false`. - * - * @return int|bool Stack pointer to the function call T_STRING token or false otherwise. - */ - public static function is_in_function_call( File $phpcsFile, $stackPtr, array $valid_functions, $global_function = true, $allow_nested = false ) { - $tokens = $phpcsFile->getTokens(); - if ( ! isset( $tokens[ $stackPtr ]['nested_parenthesis'] ) ) { - return false; - } - - $nested_parenthesis = $tokens[ $stackPtr ]['nested_parenthesis']; - if ( false === $allow_nested ) { - $nested_parenthesis = array_reverse( $nested_parenthesis, true ); - } - - foreach ( $nested_parenthesis as $open => $close ) { - $prev_non_empty = $phpcsFile->findPrevious( Tokens::$emptyTokens, ( $open - 1 ), null, true ); - if ( false === $prev_non_empty || \T_STRING !== $tokens[ $prev_non_empty ]['code'] ) { - continue; - } - - if ( isset( $valid_functions[ strtolower( $tokens[ $prev_non_empty ]['content'] ) ] ) === false ) { - if ( false === $allow_nested ) { - // Function call encountered, but not to one of the allowed functions. - return false; - } - - continue; - } - - if ( false === $global_function ) { - return $prev_non_empty; - } - - /* - * Now, make sure it is a global function. - */ - if ( self::has_object_operator_before( $phpcsFile, $prev_non_empty ) === true ) { - continue; - } - - if ( self::is_token_namespaced( $phpcsFile, $prev_non_empty ) === true ) { - continue; - } - - return $prev_non_empty; - } - - return false; - } - - /** - * Check if a token is inside of an is_...() statement. - * - * @since 2.1.0 - * @since 3.0.0 - Moved from the Sniff class to this class. - * - The method visibility was changed from `protected` to `public static`. - * - The `$phpcsFile` parameter was added. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The index of the token in the stack. - * - * @return bool Whether the token is being type tested. - */ - public static function is_in_type_test( File $phpcsFile, $stackPtr ) { - /* - * Casting the potential integer stack pointer return value to boolean here is fine. - * The return can never be `0` as there will always be a PHP open tag before the - * function call. - */ - return (bool) self::is_in_function_call( $phpcsFile, $stackPtr, self::$typeTestFunctions ); - } - - /** - * Check if a token is inside of an isset(), empty() or array_key_exists() statement. - * - * @since 0.5.0 - * @since 2.1.0 Now checks for the token being used as the array parameter - * in function calls to array_key_exists() and key_exists() as well. - * @since 3.0.0 - Moved from the Sniff class to this class. - * - The method visibility was changed from `protected` to `public static`. - * - The `$phpcsFile` parameter was added. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The index of the token in the stack. - * - * @return bool Whether the token is inside an isset() or empty() statement. - */ - public static function is_in_isset_or_empty( File $phpcsFile, $stackPtr ) { - if ( Parentheses::lastOwnerIn( $phpcsFile, $stackPtr, array( \T_ISSET, \T_EMPTY ) ) !== false ) { - return true; - } - - $functionPtr = self::is_in_function_call( $phpcsFile, $stackPtr, self::$key_exists_functions ); - if ( false !== $functionPtr ) { - /* - * Both functions being checked have the same parameters. If the function list would - * be expanded, this needs to be revisited. - */ - $array_param = PassedParameters::getParameter( $phpcsFile, $functionPtr, 2, 'array' ); - if ( false !== $array_param - && ( $stackPtr >= $array_param['start'] && $stackPtr <= $array_param['end'] ) - ) { - return true; - } - } - - return false; - } - - /** - * Retrieve a list of the tokens which are regarded as "safe casts". - * - * @since 3.0.0 - * - * @return array - */ - public static function get_safe_cast_tokens() { - return self::$safe_casts; - } - - /** - * Check if something is being casted to a safe value. - * - * @since 0.5.0 - * @since 3.0.0 - Moved from the Sniff class to this class. - * - The method visibility was changed from `protected` to `public static`. - * - The `$phpcsFile` parameter was added. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The index of the token in the stack. - * - * @return bool Whether the token being casted. - */ - public static function is_safe_casted( File $phpcsFile, $stackPtr ) { - $tokens = $phpcsFile->getTokens(); - if ( isset( $tokens[ $stackPtr ] ) === false ) { - return false; - } - - $prev = $phpcsFile->findPrevious( Tokens::$emptyTokens, ( $stackPtr - 1 ), null, true ); - - return isset( self::$safe_casts[ $tokens[ $prev ]['code'] ] ); - } - - /** - * Check if a token is inside of an array-value comparison function. - * - * @since 2.1.0 - * @since 3.0.0 - Moved from the Sniff class to this class. - * - The method visibility was changed from `protected` to `public static`. - * - The `$phpcsFile` parameter was added. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The index of the token in the stack. - * - * @return bool Whether the token is (part of) a parameter to an - * array-value comparison function. - */ - public static function is_in_array_comparison( File $phpcsFile, $stackPtr ) { - $function_ptr = self::is_in_function_call( $phpcsFile, $stackPtr, self::$arrayCompareFunctions, true, true ); - if ( false === $function_ptr ) { - return false; - } - - $tokens = $phpcsFile->getTokens(); - $function_name = strtolower( $tokens[ $function_ptr ]['content'] ); - if ( true === self::$arrayCompareFunctions[ $function_name ] ) { - return true; - } - - $target_param = self::$arrayCompareFunctions[ $function_name ]; - $found_param = PassedParameters::getParameter( $phpcsFile, $function_ptr, $target_param['position'], $target_param['name'] ); - if ( false !== $found_param ) { - return true; - } - - return false; - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Helpers/DeprecationHelper.php b/vendor/wp-coding-standards/wpcs/WordPress/Helpers/DeprecationHelper.php deleted file mode 100644 index 1327349..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Helpers/DeprecationHelper.php +++ /dev/null @@ -1,84 +0,0 @@ -getTokens(); - if ( isset( $tokens[ $stackPtr ] ) === false ) { - return false; - } - - $ignore = Tokens::$methodPrefixes; - $ignore[ \T_WHITESPACE ] = \T_WHITESPACE; - - for ( $comment_end = ( $stackPtr - 1 ); $comment_end >= 0; $comment_end-- ) { - if ( isset( $ignore[ $tokens[ $comment_end ]['code'] ] ) === true ) { - continue; - } - - if ( \T_ATTRIBUTE_END === $tokens[ $comment_end ]['code'] - && isset( $tokens[ $comment_end ]['attribute_opener'] ) === true - ) { - $comment_end = $tokens[ $comment_end ]['attribute_opener']; - continue; - } - - break; - } - - if ( \T_DOC_COMMENT_CLOSE_TAG !== $tokens[ $comment_end ]['code'] ) { - // Function doesn't have a doc comment or is using the wrong type of comment. - return false; - } - - $comment_start = $tokens[ $comment_end ]['comment_opener']; - foreach ( $tokens[ $comment_start ]['comment_tags'] as $tag ) { - if ( '@deprecated' === $tokens[ $tag ]['content'] ) { - return true; - } - } - - return false; - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Helpers/EscapingFunctionsTrait.php b/vendor/wp-coding-standards/wpcs/WordPress/Helpers/EscapingFunctionsTrait.php deleted file mode 100644 index b3fbf61..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Helpers/EscapingFunctionsTrait.php +++ /dev/null @@ -1,255 +0,0 @@ - - */ - private $escapingFunctions = array( - 'absint' => true, - 'esc_attr__' => true, - 'esc_attr_e' => true, - 'esc_attr_x' => true, - 'esc_attr' => true, - 'esc_html__' => true, - 'esc_html_e' => true, - 'esc_html_x' => true, - 'esc_html' => true, - 'esc_js' => true, - 'esc_sql' => true, - 'esc_textarea' => true, - 'esc_url_raw' => true, - 'esc_url' => true, - 'esc_xml' => true, - 'filter_input' => true, - 'filter_var' => true, - 'floatval' => true, - 'highlight_string' => true, - 'intval' => true, - 'json_encode' => true, - 'like_escape' => true, - 'number_format' => true, - 'rawurlencode' => true, - 'sanitize_hex_color' => true, - 'sanitize_hex_color_no_hash' => true, - 'sanitize_html_class' => true, - 'sanitize_key' => true, - 'sanitize_locale_name' => true, - 'sanitize_user_field' => true, - 'tag_escape' => true, - 'urlencode_deep' => true, - 'urlencode' => true, - 'wp_json_encode' => true, - 'wp_kses_data' => true, - 'wp_kses_one_attr' => true, - 'wp_kses_post' => true, - 'wp_kses' => true, - ); - - /** - * Functions whose output is automatically escaped for display. - * - * @since 0.5.0 - * @since 0.11.0 Changed from public static to protected non-static. - * @since 3.0.0 - Moved from the Sniff class to this trait. - * - Visibility changed from protected to private. - * - * @var array - */ - private $autoEscapedFunctions = array( - 'allowed_tags' => true, - 'bloginfo' => true, - 'body_class' => true, - 'calendar_week_mod' => true, - 'category_description' => true, - 'checked' => true, - 'comment_class' => true, - 'count' => true, - 'disabled' => true, - 'do_shortcode' => true, - 'do_shortcode_tag' => true, - 'get_archives_link' => true, - 'get_attachment_link' => true, - 'get_avatar' => true, - 'get_bookmark_field' => true, - 'get_calendar' => true, - 'get_comment_author_link' => true, - 'get_current_blog_id' => true, - 'get_delete_post_link' => true, - 'get_search_form' => true, - 'get_search_query' => true, - 'get_the_author_link' => true, - 'get_the_author' => true, - 'get_the_date' => true, - 'get_the_ID' => true, - 'get_the_post_thumbnail' => true, - 'get_the_term_list' => true, - 'post_type_archive_title' => true, - 'readonly' => true, - 'selected' => true, - 'single_cat_title' => true, - 'single_month_title' => true, - 'single_post_title' => true, - 'single_tag_title' => true, - 'single_term_title' => true, - 'tag_description' => true, - 'term_description' => true, - 'the_author' => true, - 'the_date' => true, - 'the_title_attribute' => true, - 'walk_nav_menu_tree' => true, - 'wp_dropdown_categories' => true, - 'wp_dropdown_users' => true, - 'wp_generate_tag_cloud' => true, - 'wp_get_archives' => true, - 'wp_get_attachment_image' => true, - 'wp_get_attachment_link' => true, - 'wp_link_pages' => true, - 'wp_list_authors' => true, - 'wp_list_bookmarks' => true, - 'wp_list_categories' => true, - 'wp_list_comments' => true, - 'wp_login_form' => true, - 'wp_loginout' => true, - 'wp_nav_menu' => true, - 'wp_readonly' => true, - 'wp_register' => true, - 'wp_tag_cloud' => true, - 'wp_timezone_choice' => true, - 'wp_title' => true, - ); - - /** - * Cache of previously added custom functions. - * - * Prevents having to do the same merges over and over again. - * - * @since 0.4.0 - * @since 0.11.0 - Changed from public static to protected non-static. - * - Changed the format from simple bool to array. - * @since 3.0.0 - Moved from the EscapeOutput Sniff class to this trait. - * - Visibility changed from protected to private. - * - * @var array - */ - private $addedCustomEscapingFunctions = array( - 'escape' => array(), - 'autoescape' => array(), - ); - - /** - * Combined list of WP native and custom escaping functions. - * - * @since 3.0.0 - * - * @var array - */ - private $allEscapingFunctions = array(); - - /** - * Combined list of WP native and custom auto-escaping functions. - * - * @since 3.0.0 - * - * @var array - */ - private $allAutoEscapedFunctions = array(); - - /** - * Check if a particular function is regarded as an escaping function. - * - * @since 3.0.0 - * - * @param string $functionName The name of the function to check. - * - * @return bool - */ - final public function is_escaping_function( $functionName ) { - if ( array() === $this->allEscapingFunctions - || $this->customEscapingFunctions !== $this->addedCustomEscapingFunctions['escape'] - ) { - $this->allEscapingFunctions = RulesetPropertyHelper::merge_custom_array( - $this->customEscapingFunctions, - $this->escapingFunctions - ); - - $this->addedCustomEscapingFunctions['escape'] = $this->customEscapingFunctions; - } - - return isset( $this->allEscapingFunctions[ strtolower( $functionName ) ] ); - } - - /** - * Check if a particular function is regarded as an auto-escaped function. - * - * @since 3.0.0 - * - * @param string $functionName The name of the function to check. - * - * @return bool - */ - final public function is_auto_escaped_function( $functionName ) { - if ( array() === $this->allAutoEscapedFunctions - || $this->customAutoEscapedFunctions !== $this->addedCustomEscapingFunctions['autoescape'] - ) { - $this->allAutoEscapedFunctions = RulesetPropertyHelper::merge_custom_array( - $this->customAutoEscapedFunctions, - $this->autoEscapedFunctions - ); - - $this->addedCustomEscapingFunctions['autoescape'] = $this->customAutoEscapedFunctions; - } - - return isset( $this->allAutoEscapedFunctions[ strtolower( $functionName ) ] ); - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Helpers/FormattingFunctionsHelper.php b/vendor/wp-coding-standards/wpcs/WordPress/Helpers/FormattingFunctionsHelper.php deleted file mode 100644 index e04298a..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Helpers/FormattingFunctionsHelper.php +++ /dev/null @@ -1,60 +0,0 @@ - - */ - private static $formattingFunctions = array( - 'antispambot' => true, - 'array_fill' => true, - 'ent2ncr' => true, - 'implode' => true, - 'join' => true, - 'nl2br' => true, - 'sprintf' => true, - 'vsprintf' => true, - 'wp_sprintf' => true, - ); - - /** - * Check if a particular function is regarded as a formatting function. - * - * @since 3.0.0 - * - * @param string $functionName The name of the function to check. - * - * @return bool - */ - public static function is_formatting_function( $functionName ) { - return isset( self::$formattingFunctions[ strtolower( $functionName ) ] ); - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Helpers/IsUnitTestTrait.php b/vendor/wp-coding-standards/wpcs/WordPress/Helpers/IsUnitTestTrait.php deleted file mode 100644 index 0c9c77d..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Helpers/IsUnitTestTrait.php +++ /dev/null @@ -1,238 +0,0 @@ - - * - * - * - * - * - * - * - * ``` - * - * Note: it is strongly _recommended_ to exclude your test directories for - * select error codes of those particular sniffs instead of relying on this - * property/trait. - * - * @since 0.11.0 - * @since 3.0.0 Moved from the Sniff class to this dedicated Trait. - * Renamed from `$custom_test_class_whitelist` to `$custom_test_classes`. - * - * @var string[] - */ - public $custom_test_classes = array(); - - /** - * List of PHPUnit and WP native classes which test classes can extend. - * - * {internal These are the test cases provided in the `/tests/phpunit/includes/` - * directory of WP Core.} - * - * @since 0.11.0 - * @since 3.0.0 - Moved from the Sniff class to this dedicated Trait. - * - Renamed from `$test_class_whitelist` to `$known_test_classes`. - * - Visibility changed from protected to private. - * - * @var array Key is class name, value irrelevant. - */ - private $known_test_classes = array( - // Base test cases. - 'WP_UnitTestCase' => true, - 'WP_UnitTestCase_Base' => true, - 'PHPUnit_Adapter_TestCase' => true, - - // Domain specific base test cases. - 'WP_Ajax_UnitTestCase' => true, - 'WP_Canonical_UnitTestCase' => true, - 'WP_Font_Face_UnitTestCase' => true, - 'WP_Test_REST_Controller_Testcase' => true, - 'WP_Test_REST_Post_Type_Controller_Testcase' => true, - 'WP_Test_REST_TestCase' => true, - 'WP_Test_XML_TestCase' => true, - 'WP_XMLRPC_UnitTestCase' => true, - - // PHPUnit native test cases. - 'PHPUnit_Framework_TestCase' => true, - 'PHPUnit\\Framework\\TestCase' => true, - // PHPUnit native TestCase class when imported via use statement. - 'TestCase' => true, - ); - - /** - * Cache of previously added custom test classes. - * - * Prevents having to do the same merges over and over again. - * - * @since 3.0.0 - * - * @var string[] - */ - private $added_custom_test_classes = array(); - - /** - * Combined list of WP/PHPUnit native and custom test classes. - * - * @since 3.0.0 - * - * @var array - */ - private $all_test_classes = array(); - - /** - * Retrieve a list of all registered test classes, both WP/PHPUnit native as well as custom. - * - * @since 3.0.0 - * - * @return array - */ - final protected function get_all_test_classes() { - if ( array() === $this->all_test_classes - || $this->custom_test_classes !== $this->added_custom_test_classes - ) { - /* - * Show some tolerance for user input. - * The custom test class names should be passed as FQN without a prefixing `\`. - */ - $custom_test_classes = array(); - if ( ! empty( $this->custom_test_classes ) ) { - foreach ( $this->custom_test_classes as $v ) { - $custom_test_classes[] = ltrim( $v, '\\' ); - } - } - - /* - * Lowercase all names, both custom as well as "known", as PHP treats namespaced names case-insensitively. - */ - $custom_test_classes = array_map( 'strtolower', $custom_test_classes ); - $known_test_classes = array_change_key_case( $this->known_test_classes, \CASE_LOWER ); - - $this->all_test_classes = RulesetPropertyHelper::merge_custom_array( - $custom_test_classes, - $known_test_classes - ); - - // Store the original value so the comparison can succeed. - $this->added_custom_test_classes = $this->custom_test_classes; - } - - return $this->all_test_classes; - } - - /** - * Check if a class token is part of a unit test suite. - * - * Unit test classes are identified as such: - * - Class which either extends one of the known test cases, such as `WP_UnitTestCase` - * or `PHPUnit_Framework_TestCase` or extends a custom unit test class as listed in the - * `custom_test_classes` property. - * - * @since 0.12.0 Split off from the `is_token_in_test_method()` method. - * @since 1.0.0 Improved recognition of namespaced class names. - * @since 3.0.0 - Moved from the Sniff class to this dedicated Trait. - * - The `$phpcsFile` parameter was added. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the token to be examined. - * This should be a class, anonymous class or trait token. - * - * @return bool True if the class is a unit test class, false otherwise. - */ - final protected function is_test_class( File $phpcsFile, $stackPtr ) { - - $tokens = $phpcsFile->getTokens(); - - if ( isset( $tokens[ $stackPtr ], Tokens::$ooScopeTokens[ $tokens[ $stackPtr ]['code'] ] ) === false ) { - return false; - } - - // Add any potentially extra custom test classes to the known test classes list. - $known_test_classes = $this->get_all_test_classes(); - - $namespace = strtolower( Namespaces::determineNamespace( $phpcsFile, $stackPtr ) ); - - // Is the class/trait one of the known test classes ? - $className = ObjectDeclarations::getName( $phpcsFile, $stackPtr ); - if ( empty( $className ) === false ) { - $className = strtolower( $className ); - if ( '' !== $namespace ) { - if ( isset( $known_test_classes[ $namespace . '\\' . $className ] ) ) { - return true; - } - } elseif ( isset( $known_test_classes[ $className ] ) ) { - return true; - } - } - - // Does the class/trait extend one of the known test classes ? - $extendedClassName = ObjectDeclarations::findExtendedClassName( $phpcsFile, $stackPtr ); - if ( false === $extendedClassName ) { - return false; - } - - $extendedClassName = strtolower( $extendedClassName ); - - if ( '\\' === $extendedClassName[0] ) { - if ( isset( $known_test_classes[ substr( $extendedClassName, 1 ) ] ) ) { - return true; - } - } elseif ( '' !== $namespace ) { - if ( isset( $known_test_classes[ $namespace . '\\' . $extendedClassName ] ) ) { - return true; - } - } elseif ( isset( $known_test_classes[ $extendedClassName ] ) ) { - return true; - } - - /* - * Not examining imported classes via `use` statements as with the variety of syntaxes, - * this would get very complicated. - * After all, users can add an `` for a particular sniff to their - * custom ruleset to selectively exclude the test directory. - */ - - return false; - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Helpers/ListHelper.php b/vendor/wp-coding-standards/wpcs/WordPress/Helpers/ListHelper.php deleted file mode 100644 index 6567573..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Helpers/ListHelper.php +++ /dev/null @@ -1,101 +0,0 @@ -getTokens(); - - // Is this one of the tokens this function handles ? - if ( isset( $tokens[ $stackPtr ], Collections::listOpenTokensBC()[ $tokens[ $stackPtr ]['code'] ] ) === false ) { - return array(); - } - - if ( isset( Collections::shortArrayListOpenTokensBC()[ $tokens[ $stackPtr ]['code'] ] ) - && Lists::isShortList( $phpcsFile, $stackPtr ) === false - ) { - return array(); - } - - try { - $assignments = Lists::getAssignments( $phpcsFile, $stackPtr ); - } catch ( UnexpectedTokenType $e ) { - // Parse error/live coding. - return array(); - } - - $var_pointers = array(); - - foreach ( $assignments as $assign ) { - if ( true === $assign['is_empty'] ) { - continue; - } - - if ( true === $assign['is_nested_list'] ) { - /* - * Recurse into the nested list and get the variables. - * No need to `catch` any errors as only lists can be nested in lists. - */ - $var_pointers += self::get_list_variables( $phpcsFile, $assign['assignment_token'] ); - continue; - } - - /* - * Ok, so this must be a "normal" assignment in the list. - * Set the variable pointer both as the key as well as the value, so we can use array join - * for nested lists (above). - */ - $var_pointers[ $assign['assignment_token'] ] = $assign['assignment_token']; - } - - return $var_pointers; - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Helpers/MinimumWPVersionTrait.php b/vendor/wp-coding-standards/wpcs/WordPress/Helpers/MinimumWPVersionTrait.php deleted file mode 100644 index b651e80..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Helpers/MinimumWPVersionTrait.php +++ /dev/null @@ -1,159 +0,0 @@ - - * - * - * - * - * - * Alternatively, the value can be passed in one go for all sniffs using it via - * the command line or by setting a `` value in a custom phpcs.xml ruleset. - * - * CL: `phpcs --runtime-set minimum_wp_version 5.7` - * Ruleset: `` - * - * @since 0.14.0 Previously the individual sniffs each contained this property. - * @since 3.0.0 - Moved from the Sniff class to this dedicated Trait. - * - The property has been renamed from `$minimum_supported_version` to `$minimum_wp_version`. - * - The CLI option has been renamed from `minimum_supported_wp_version` to `minimum_wp_version`. - * - * @var string WordPress version. - */ - public $minimum_wp_version; - - /** - * Default minimum supported WordPress version. - * - * By default, the minimum_wp_version presumes that a project will support the current - * WP version and up to three releases before. - * - * {@internal This should be a constant, but constants in traits are not supported - * until PHP 8.2.}} - * - * @since 3.0.0 - * - * @var string WordPress version. - */ - private $default_minimum_wp_version = '6.6'; - - /** - * Overrule the minimum supported WordPress version with a command-line/config value. - * - * Handle setting the minimum supported WP version in one go for all sniffs which - * expect it via the command line or via a `` variable in a ruleset. - * The config variable overrules the default `$minimum_wp_version` and/or a - * `$minimum_wp_version` set for individual sniffs through the ruleset. - * - * @since 0.14.0 - * @since 3.0.0 - Moved from the Sniff class to this dedicated Trait. - * - Renamed from `get_wp_version_from_cl()` to `set_minimum_wp_version()`. - * - * @return void - */ - final protected function set_minimum_wp_version() { - $minimum_wp_version = ''; - - // Use a ruleset provided value if available. - if ( ! empty( $this->minimum_wp_version ) ) { - $minimum_wp_version = $this->minimum_wp_version; - } - - // A CLI provided value overrules a ruleset provided value. - $cli_supported_version = Helper::getConfigData( 'minimum_wp_version' ); - if ( ! empty( $cli_supported_version ) ) { - $minimum_wp_version = $cli_supported_version; - } - - // If no valid value was provided, use the default. - if ( filter_var( $minimum_wp_version, \FILTER_VALIDATE_FLOAT ) === false ) { - $minimum_wp_version = $this->default_minimum_wp_version; - } - - $this->minimum_wp_version = $minimum_wp_version; - } - - /** - * Compares two version numbers. - * - * @since 3.0.0 - * - * @param string $version1 First version number. - * @param string $version2 Second version number. - * @param string $operator Comparison operator. - * - * @return bool - */ - final protected function wp_version_compare( $version1, $version2, $operator ) { - $version1 = $this->normalize_version_number( $version1 ); - $version2 = $this->normalize_version_number( $version2 ); - - return version_compare( $version1, $version2, $operator ); - } - - /** - * Normalize a version number. - * - * Ensures that a version number is comparable via the PHP version_compare() function - * by making sure it complies with the minimum "PHP-standardized" version number requirements. - * - * Presumes the input is a numeric version number string. The behavior with other input is undefined. - * - * @since 3.0.0 - * - * @param string $version Version number. - * - * @return string - */ - private function normalize_version_number( $version ) { - if ( preg_match( '`^\d+\.\d+$`', $version ) ) { - $version .= '.0'; - } - - return $version; - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Helpers/PrintingFunctionsTrait.php b/vendor/wp-coding-standards/wpcs/WordPress/Helpers/PrintingFunctionsTrait.php deleted file mode 100644 index edd6dbe..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Helpers/PrintingFunctionsTrait.php +++ /dev/null @@ -1,122 +0,0 @@ - - */ - private $printingFunctions = array( - '_deprecated_argument' => true, - '_deprecated_constructor' => true, - '_deprecated_file' => true, - '_deprecated_function' => true, - '_deprecated_hook' => true, - '_doing_it_wrong' => true, - '_e' => true, - '_ex' => true, - 'printf' => true, - 'trigger_error' => true, - 'user_error' => true, - 'vprintf' => true, - 'wp_die' => true, - 'wp_dropdown_pages' => true, - ); - - /** - * Cache of previously added custom functions. - * - * Prevents having to do the same merges over and over again. - * - * @since 0.4.0 - * @since 0.11.0 - Changed from public static to protected non-static. - * - Changed the format from simple bool to array. - * @since 3.0.0 - Moved from the EscapeOutput Sniff class to this trait. - * - Visibility changed from protected to private. - * - * @var string[] - */ - private $addedCustomPrintingFunctions = array(); - - /** - * Combined list of WP/PHP native and custom printing functions. - * - * @since 3.0.0 - * - * @var array - */ - private $allPrintingFunctions = array(); - - /** - * Retrieve a list of all known printing functions. - * - * @since 3.0.0 - * - * @return array - */ - final public function get_printing_functions() { - if ( array() === $this->allPrintingFunctions - || $this->customPrintingFunctions !== $this->addedCustomPrintingFunctions - ) { - $this->allPrintingFunctions = RulesetPropertyHelper::merge_custom_array( - $this->customPrintingFunctions, - $this->printingFunctions - ); - - $this->addedCustomPrintingFunctions = $this->customPrintingFunctions; - } - - return $this->allPrintingFunctions; - } - - /** - * Check if a particular function is regarded as a printing function. - * - * @since 3.0.0 - * - * @param string $functionName The name of the function to check. - * - * @return bool - */ - final public function is_printing_function( $functionName ) { - return isset( $this->get_printing_functions()[ strtolower( $functionName ) ] ); - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Helpers/RulesetPropertyHelper.php b/vendor/wp-coding-standards/wpcs/WordPress/Helpers/RulesetPropertyHelper.php deleted file mode 100644 index b20c6ed..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Helpers/RulesetPropertyHelper.php +++ /dev/null @@ -1,73 +0,0 @@ - true` format. - * * Any custom items will be given the value `false` to be able to - * distinguish them from pre-set (base array) values. - * * Will filter previously added custom items out from the base array - * before merging/returning to allow for resetting to the base array. - * - * {@internal Function is static as it doesn't use any of the properties or others - * methods anyway.} - * - * @since 0.11.0 - * @since 2.0.0 No longer supports custom array properties which were incorrectly - * passed as a string. - * @since 3.0.0 Moved from the Sniff class to this class. - * - * @param array $custom Custom list as provided via a ruleset. - * @param array $base Optional. Base list. Defaults to an empty array. - * Expects `value => true` format when `$flip` is true. - * @param bool $flip Optional. Whether or not to flip the custom list. - * Defaults to true. - * @return array - */ - public static function merge_custom_array( $custom, array $base = array(), $flip = true ) { - if ( true === $flip ) { - $base = array_filter( $base ); - } - - if ( empty( $custom ) || ! \is_array( $custom ) ) { - return $base; - } - - if ( true === $flip ) { - $custom = array_fill_keys( $custom, false ); - } - - if ( empty( $base ) ) { - return $custom; - } - - return array_merge( $base, $custom ); - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Helpers/SanitizationHelperTrait.php b/vendor/wp-coding-standards/wpcs/WordPress/Helpers/SanitizationHelperTrait.php deleted file mode 100644 index 31661d1..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Helpers/SanitizationHelperTrait.php +++ /dev/null @@ -1,419 +0,0 @@ - - */ - private $sanitizingFunctions = array( - '_wp_handle_upload' => true, - 'esc_url_raw' => true, - 'filter_input' => true, - 'filter_var' => true, - 'hash_equals' => true, - 'is_email' => true, - 'number_format' => true, - 'sanitize_bookmark_field' => true, - 'sanitize_bookmark' => true, - 'sanitize_email' => true, - 'sanitize_file_name' => true, - 'sanitize_hex_color_no_hash' => true, - 'sanitize_hex_color' => true, - 'sanitize_html_class' => true, - 'sanitize_meta' => true, - 'sanitize_mime_type' => true, - 'sanitize_option' => true, - 'sanitize_sql_orderby' => true, - 'sanitize_term_field' => true, - 'sanitize_term' => true, - 'sanitize_text_field' => true, - 'sanitize_textarea_field' => true, - 'sanitize_title_for_query' => true, - 'sanitize_title_with_dashes' => true, - 'sanitize_title' => true, - 'sanitize_url' => true, - 'sanitize_user_field' => true, - 'sanitize_user' => true, - 'validate_file' => true, - 'wp_handle_sideload' => true, - 'wp_handle_upload' => true, - 'wp_kses_allowed_html' => true, - 'wp_kses_data' => true, - 'wp_kses_one_attr' => true, - 'wp_kses_post' => true, - 'wp_kses' => true, - 'wp_parse_id_list' => true, - 'wp_redirect' => true, - 'wp_safe_redirect' => true, - 'wp_sanitize_redirect' => true, - 'wp_strip_all_tags' => true, - ); - - /** - * Sanitizing functions that implicitly unslash the data passed to them. - * - * This list is complementary to the `$sanitizingFunctions` list. - * Sanitizing functions should be added to this list if they also - * implicitly unslash data and to the `$sanitizingFunctions` list - * if they don't. - * - * @since 0.5.0 - * @since 0.11.0 Changed from public static to protected non-static. - * @since 3.0.0 - Moved from the Sniff class to this trait. - * - Visibility changed from protected to private. - * - * @var array - */ - private $unslashingSanitizingFunctions = array( - 'absint' => true, - 'boolval' => true, - 'count' => true, - 'doubleval' => true, - 'floatval' => true, - 'intval' => true, - 'rest_sanitize_boolean' => true, - 'sanitize_key' => true, - 'sanitize_locale_name' => true, - 'sizeof' => true, - ); - - /** - * Cache of previously added custom functions. - * - * Prevents having to do the same merges over and over again. - * - * @since 0.4.0 - * @since 0.11.0 - Changed from public static to protected non-static. - * - Changed the format from simple bool to array. - * @since 3.0.0 - Moved from the NonceVerification and the ValidatedSanitizedInput sniff classes to this class. - * - Visibility changed from protected to private. - * - * @var array - */ - private $addedCustomSanitizingFunctions = array( - 'sanitize' => array(), - 'unslashsanitize' => array(), - ); - - /** - * Combined list of WP/PHP native and custom sanitizing functions. - * - * @since 3.0.0 - * - * @var array - */ - private $allSanitizingFunctions = array(); - - /** - * Combined list of WP/PHP native and custom sanitizing and unslashing functions. - * - * @since 3.0.0 - * - * @var array - */ - private $allUnslashingSanitizingFunctions = array(); - - /** - * Retrieve a list of all known sanitizing functions. - * - * @since 3.0.0 - * - * @return array - */ - final public function get_sanitizing_functions() { - if ( array() === $this->allSanitizingFunctions - || $this->customSanitizingFunctions !== $this->addedCustomSanitizingFunctions['sanitize'] - ) { - $this->allSanitizingFunctions = RulesetPropertyHelper::merge_custom_array( - $this->customSanitizingFunctions, - $this->sanitizingFunctions - ); - - $this->addedCustomSanitizingFunctions['sanitize'] = $this->customSanitizingFunctions; - } - - return $this->allSanitizingFunctions; - } - - /** - * Retrieve a list of all known sanitizing and unslashing functions. - * - * @since 3.0.0 - * - * @return array - */ - final public function get_sanitizing_and_unslashing_functions() { - if ( array() === $this->allUnslashingSanitizingFunctions - || $this->customUnslashingSanitizingFunctions !== $this->addedCustomSanitizingFunctions['unslashsanitize'] - ) { - $this->allUnslashingSanitizingFunctions = RulesetPropertyHelper::merge_custom_array( - $this->customUnslashingSanitizingFunctions, - $this->unslashingSanitizingFunctions - ); - - $this->addedCustomSanitizingFunctions['unslashsanitize'] = $this->customUnslashingSanitizingFunctions; - } - - return $this->allUnslashingSanitizingFunctions; - } - - /** - * Check if a particular function is regarded as a sanitizing function. - * - * @since 3.0.0 - * - * @param string $functionName The name of the function to check. - * - * @return bool - */ - final public function is_sanitizing_function( $functionName ) { - return isset( $this->get_sanitizing_functions()[ strtolower( $functionName ) ] ); - } - - /** - * Check if a particular function is regarded as a sanitizing and unslashing function. - * - * @since 3.0.0 - * - * @param string $functionName The name of the function to check. - * - * @return bool - */ - final public function is_sanitizing_and_unslashing_function( $functionName ) { - return isset( $this->get_sanitizing_and_unslashing_functions()[ strtolower( $functionName ) ] ); - } - - /** - * Check if something is only being sanitized. - * - * @since 0.5.0 - * @since 3.0.0 - Moved from the Sniff class to this class. - * - The method visibility was changed from `protected` to `public`. - * - The `$phpcsFile` parameter was added. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The index of the token in the stack. - * - * @return bool Whether the token is only within a sanitization. - */ - final public function is_only_sanitized( File $phpcsFile, $stackPtr ) { - $tokens = $phpcsFile->getTokens(); - - // If it isn't being sanitized at all. - if ( ! $this->is_sanitized( $phpcsFile, $stackPtr ) ) { - return false; - } - - // If the token isn't in parentheses, we know the value must have only been casted, because - // is_sanitized() would have returned `false` otherwise. - if ( ! isset( $tokens[ $stackPtr ]['nested_parenthesis'] ) ) { - return true; - } - - // At this point we're expecting the value to have not been casted. If it - // was, it wasn't *only* casted, because it's also in a function. - if ( ContextHelper::is_safe_casted( $phpcsFile, $stackPtr ) ) { - return false; - } - - // The only parentheses should belong to the sanitizing function. If there's - // more than one set, this isn't *only* sanitization. - return ( \count( $tokens[ $stackPtr ]['nested_parenthesis'] ) === 1 ); - } - - /** - * Check if something is being sanitized. - * - * @since 0.5.0 - * @since 3.0.0 - Moved from the Sniff class to this class. - * - The method visibility was changed from `protected` to `public`. - * - The `$phpcsFile` parameter was added. - * - The $require_unslash parameter has been changed from - * a boolean toggle to a ?callable $unslash_callback parameter to - * allow a sniff calling this method to handle their "unslashing" - * related messaging itself. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The index of the token in the stack. - * @param callable|null $unslash_callback Optional. When passed, this method will check if - * an unslashing function is used on the variable before - * sanitization and if not, the callback will be called - * to handle the missing unslashing. - * The callback will receive the $phpcsFile object and - * the $stackPtr. - * When not passed or `null`, this method will **not** - * check for unslashing issues. - * Defaults to `null` (skip unslashing checks). - * - * @return bool Whether the token is being sanitized. - */ - final public function is_sanitized( File $phpcsFile, $stackPtr, $unslash_callback = null ) { - $tokens = $phpcsFile->getTokens(); - $require_unslash = is_callable( $unslash_callback ); - - if ( isset( $tokens[ $stackPtr ] ) === false ) { - return false; - } - - // If the variable is just being unset, the value isn't used at all, so it's safe. - if ( Context::inUnset( $phpcsFile, $stackPtr ) ) { - return true; - } - - // First we check if it is being casted to a safe value. - if ( ContextHelper::is_safe_casted( $phpcsFile, $stackPtr ) ) { - return true; - } - - // If this isn't within a function call, we know already that it's not safe. - if ( ! isset( $tokens[ $stackPtr ]['nested_parenthesis'] ) ) { - if ( $require_unslash ) { - call_user_func( $unslash_callback, $phpcsFile, $stackPtr ); - } - - return false; - } - - $sanitizing_functions = $this->get_sanitizing_functions(); - $sanitizing_functions += $this->get_sanitizing_and_unslashing_functions(); - $sanitizing_functions += ArrayWalkingFunctionsHelper::get_functions(); - $valid_functions = $sanitizing_functions + UnslashingFunctionsHelper::get_functions(); - - // Get the function that it's in. - $functionPtr = ContextHelper::is_in_function_call( $phpcsFile, $stackPtr, $valid_functions ); - - // If this isn't a call to one of the valid functions, it sure isn't a sanitizing function. - if ( false === $functionPtr ) { - if ( true === $require_unslash ) { - call_user_func( $unslash_callback, $phpcsFile, $stackPtr ); - } - - return false; - } - - $functionName = $tokens[ $functionPtr ]['content']; - - // Check if an unslashing function is being used. - $is_unslashed = false; - if ( UnslashingFunctionsHelper::is_unslashing_function( $functionName ) ) { - $is_unslashed = true; - - // Check whether this function call is wrapped within a sanitizing function. - $higherFunctionPtr = ContextHelper::is_in_function_call( $phpcsFile, $functionPtr, $sanitizing_functions ); - - // If there is no other valid function being used, this value is unsanitized. - if ( false === $higherFunctionPtr ) { - return false; - } - - $functionPtr = $higherFunctionPtr; - $functionName = $tokens[ $functionPtr ]['content']; - } - - // Arrays might be sanitized via an array walking function using a callback. - if ( ArrayWalkingFunctionsHelper::is_array_walking_function( $functionName ) ) { - // Get the callback parameter. - $callback = ArrayWalkingFunctionsHelper::get_callback_parameter( $phpcsFile, $functionPtr ); - - if ( ! empty( $callback ) ) { - /* - * If this is a function callback (not a method callback array) and we're able - * to resolve the function name, do so. - */ - $first_non_empty = $phpcsFile->findNext( - Tokens::$emptyTokens, - $callback['start'], - ( $callback['end'] + 1 ), - true - ); - - if ( false !== $first_non_empty && \T_CONSTANT_ENCAPSED_STRING === $tokens[ $first_non_empty ]['code'] ) { - $functionName = TextStrings::stripQuotes( $tokens[ $first_non_empty ]['content'] ); - } - } - } - - // If slashing is required, give an error. - if ( false === $is_unslashed - && true === $require_unslash - && ! $this->is_sanitizing_and_unslashing_function( $functionName ) - ) { - call_user_func( $unslash_callback, $phpcsFile, $stackPtr ); - } - - // Check if this is a sanitizing function. - return ( $this->is_sanitizing_function( $functionName ) || $this->is_sanitizing_and_unslashing_function( $functionName ) ); - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Helpers/SnakeCaseHelper.php b/vendor/wp-coding-standards/wpcs/WordPress/Helpers/SnakeCaseHelper.php deleted file mode 100644 index 9937e5e..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Helpers/SnakeCaseHelper.php +++ /dev/null @@ -1,60 +0,0 @@ - - */ - private static $unslashingFunctions = array( - 'stripslashes_deep' => true, - 'stripslashes_from_strings_only' => true, - 'wp_unslash' => true, - ); - - /** - * Retrieve a list of the unslashing functions. - * - * @since 3.0.0 - * - * @return array - */ - public static function get_functions() { - return self::$unslashingFunctions; - } - - /** - * Check if a particular function is regarded as a unslashing function. - * - * @since 3.0.0 - * - * @param string $functionName The name of the function to check. - * - * @return bool - */ - public static function is_unslashing_function( $functionName ) { - return isset( self::$unslashingFunctions[ strtolower( $functionName ) ] ); - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Helpers/ValidationHelper.php b/vendor/wp-coding-standards/wpcs/WordPress/Helpers/ValidationHelper.php deleted file mode 100644 index d5a22d7..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Helpers/ValidationHelper.php +++ /dev/null @@ -1,349 +0,0 @@ - - */ - private static $targets = array( - \T_ISSET => 'construct', - \T_EMPTY => 'construct', - \T_STRING => 'function_call', - \T_COALESCE => 'coalesce', - \T_COALESCE_EQUAL => 'coalesce', - ); - - /** - * List of PHP native functions to check if an array index exists. - * - * @since 3.0.0 - * - * @var array - */ - private static $key_exists_functions = array( - 'array_key_exists' => true, - 'key_exists' => true, // Alias. - ); - - /** - * Check if the existence of a variable is validated with isset(), empty(), array_key_exists() - * or key_exists(). - * - * When $in_condition_only is `false`, (which is the default), this is considered - * valid: - * - * ```php - * if ( isset( $var ) ) { - * // Do stuff, like maybe return or exit (but could be anything) - * } - * - * foo( $var ); - * ``` - * - * When it is `true`, that would be invalid; the use of the variable must be within - * the scope of the validating condition, like this: - * - * ```php - * if ( isset( $var ) ) { - * foo( $var ); - * } - * ``` - * - * @since 0.5.0 - * @since 2.1.0 Now recognizes array_key_exists() and key_exists() as validation functions. - * @since 2.1.0 Stricter check on whether the correct variable and the correct - * array keys are being validated. - * @since 3.0.0 - Moved from the Sniff class to this class. - * - The method visibility was changed from `protected` to `public static`. - * - The `$phpcsFile` parameter was added. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The index of this token in the stack. - * @param array|string $array_keys An array key to check for ("bar" in $foo['bar']) - * or an array of keys for multi-level array access. - * @param bool $in_condition_only Whether to require that this use of the - * variable occurs within the scope of the - * validating condition, or just in the same - * scope (default). - * - * @return bool Whether the var is validated. - */ - public static function is_validated( File $phpcsFile, $stackPtr, $array_keys = array(), $in_condition_only = false ) { - $tokens = $phpcsFile->getTokens(); - if ( isset( $tokens[ $stackPtr ] ) === false ) { - return false; - } - - if ( $in_condition_only ) { - /* - * This is a stricter check, requiring the variable to be used only - * within the validation condition. - */ - $conditionPtr = Conditions::getLastCondition( $phpcsFile, $stackPtr ); - if ( false === $conditionPtr ) { - // If there are no conditions, there's no validation. - return false; - } - - $condition = $tokens[ $conditionPtr ]; - if ( ! isset( $condition['parenthesis_opener'] ) ) { - // Live coding or parse error. - return false; - } - - $scope_start = $condition['parenthesis_opener']; - $scope_end = $condition['parenthesis_closer']; - - } else { - /* - * We are more loose, requiring only that the variable be validated - * in the same function/file scope as it is used. - */ - $scope_start = 0; - - /* - * Check if we are in a function. - * - * Note: PHP 7.4+ arrow functions are not taken into account as those are not - * included in the "conditions" array. Additionally, arrow functions have - * access to variables outside their direct scope. - */ - $function = Conditions::getLastCondition( $phpcsFile, $stackPtr, array( \T_FUNCTION, \T_CLOSURE ) ); - - // If so, we check only within the function, otherwise the whole file. - if ( false !== $function ) { - $scope_start = $tokens[ $function ]['scope_opener']; - } - - $scope_end = $stackPtr; - } - - if ( ! empty( $array_keys ) && ! is_array( $array_keys ) ) { - $array_keys = (array) $array_keys; - } - - $bare_array_keys = self::strip_quotes_from_array_values( $array_keys ); - - // phpcs:ignore Generic.CodeAnalysis.JumbledIncrementer.Found -- On purpose, see below. - for ( $i = ( $scope_start + 1 ); $i < $scope_end; $i++ ) { - - if ( isset( Collections::closedScopes()[ $tokens[ $i ]['code'] ] ) - && isset( $tokens[ $i ]['scope_closer'] ) - ) { - // Jump over nested closed scopes as validation done within those does not apply. - $i = $tokens[ $i ]['scope_closer']; - continue; - } - - if ( \T_FN === $tokens[ $i ]['code'] - && isset( $tokens[ $i ]['scope_closer'] ) - && $tokens[ $i ]['scope_closer'] < $scope_end - ) { - // Jump over nested arrow functions as long as the current variable isn't *in* the arrow function. - $i = $tokens[ $i ]['scope_closer']; - continue; - } - - if ( isset( self::$targets[ $tokens[ $i ]['code'] ] ) === false ) { - continue; - } - - switch ( self::$targets[ $tokens[ $i ]['code'] ] ) { - case 'construct': - $issetOpener = $phpcsFile->findNext( Tokens::$emptyTokens, ( $i + 1 ), null, true ); - if ( false === $issetOpener - || \T_OPEN_PARENTHESIS !== $tokens[ $issetOpener ]['code'] - || isset( $tokens[ $issetOpener ]['parenthesis_closer'] ) === false - ) { - // Parse error or live coding. - continue 2; - } - - $issetCloser = $tokens[ $issetOpener ]['parenthesis_closer']; - - // Look for this variable. We purposely stomp $i from the parent loop. - for ( $i = ( $issetOpener + 1 ); $i < $issetCloser; $i++ ) { - - if ( \T_VARIABLE !== $tokens[ $i ]['code'] ) { - continue; - } - - if ( $tokens[ $stackPtr ]['content'] !== $tokens[ $i ]['content'] ) { - continue; - } - - // If we're checking for specific array keys (ex: 'hello' in - // $_POST['hello']), that must match too. Quote-style, however, doesn't matter. - if ( ! empty( $bare_array_keys ) ) { - $found_keys = VariableHelper::get_array_access_keys( $phpcsFile, $i ); - $found_keys = self::strip_quotes_from_array_values( $found_keys ); - $diff = array_diff_assoc( $bare_array_keys, $found_keys ); - if ( ! empty( $diff ) ) { - continue; - } - } - - return true; - } - - break; - - case 'function_call': - // Only check calls to array_key_exists() and key_exists(). - if ( isset( self::$key_exists_functions[ strtolower( $tokens[ $i ]['content'] ) ] ) === false ) { - continue 2; - } - - $next_non_empty = $phpcsFile->findNext( Tokens::$emptyTokens, ( $i + 1 ), null, true ); - if ( false === $next_non_empty || \T_OPEN_PARENTHESIS !== $tokens[ $next_non_empty ]['code'] ) { - // Not a function call. - continue 2; - } - - if ( Context::inAttribute( $phpcsFile, $i ) === true ) { - // Definitely not the function call as those are not allowed in attributes. - continue 2; - } - - if ( ContextHelper::has_object_operator_before( $phpcsFile, $i ) === true ) { - // Method call. - continue 2; - } - - if ( ContextHelper::is_token_namespaced( $phpcsFile, $i ) === true ) { - // Namespaced function call. - continue 2; - } - - $params = PassedParameters::getParameters( $phpcsFile, $i ); - - // As `key_exists()` is an alias of `array_key_exists()`, the param positions and names are the same. - $array_param = PassedParameters::getParameterFromStack( $params, 2, 'array' ); - if ( false === $array_param ) { - continue 2; - } - - $array_param_first_token = $phpcsFile->findNext( Tokens::$emptyTokens, $array_param['start'], ( $array_param['end'] + 1 ), true ); - if ( false === $array_param_first_token - || \T_VARIABLE !== $tokens[ $array_param_first_token ]['code'] - || $tokens[ $array_param_first_token ]['content'] !== $tokens[ $stackPtr ]['content'] - ) { - continue 2; - } - - if ( ! empty( $bare_array_keys ) ) { - // Prevent the original array from being altered. - $bare_keys = $bare_array_keys; - $last_key = array_pop( $bare_keys ); - - /* - * For multi-level array access, the complete set of keys could be split between - * the $key and the $array parameter, but could also be completely in the $array - * parameter, so we need to check both options. - */ - $found_keys = VariableHelper::get_array_access_keys( $phpcsFile, $array_param_first_token ); - $found_keys = self::strip_quotes_from_array_values( $found_keys ); - - // First try matching the complete set against the array parameter. - $diff = array_diff_assoc( $bare_array_keys, $found_keys ); - if ( empty( $diff ) ) { - return true; - } - - // If that failed, try getting an exact match for the subset against the - // $array parameter and the last key against the first. - $key_param = PassedParameters::getParameterFromStack( $params, 1, 'key' ); - if ( false !== $key_param - && $bare_keys === $found_keys - && TextStrings::stripQuotes( $key_param['raw'] ) === $last_key - ) { - return true; - } - - // Didn't find the correct array keys. - continue 2; - } - - return true; - - case 'coalesce': - $prev = $i; - do { - $prev = $phpcsFile->findPrevious( Tokens::$emptyTokens, ( $prev - 1 ), null, true ); - // Skip over array keys, like `$_GET['key']['subkey']`. - if ( \T_CLOSE_SQUARE_BRACKET === $tokens[ $prev ]['code'] ) { - $prev = $tokens[ $prev ]['bracket_opener']; - continue; - } - - break; - } while ( $prev >= ( $scope_start + 1 ) ); - - // We should now have reached the variable. - if ( \T_VARIABLE !== $tokens[ $prev ]['code'] ) { - continue 2; - } - - if ( $tokens[ $prev ]['content'] !== $tokens[ $stackPtr ]['content'] ) { - continue 2; - } - - if ( ! empty( $bare_array_keys ) ) { - $found_keys = VariableHelper::get_array_access_keys( $phpcsFile, $prev ); - $found_keys = self::strip_quotes_from_array_values( $found_keys ); - $diff = array_diff_assoc( $bare_array_keys, $found_keys ); - if ( ! empty( $diff ) ) { - continue 2; - } - } - - // Right variable, correct key. - return true; - } - } - - return false; - } - - /** - * Strip quotes of all the values in an array containing only text strings. - * - * @since 3.0.0 - * - * @param string[] $text_strings The input array. - * - * @return string[] - */ - private static function strip_quotes_from_array_values( array $text_strings ) { - return array_map( array( 'PHPCSUtils\Utils\TextStrings', 'stripQuotes' ), $text_strings ); - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Helpers/VariableHelper.php b/vendor/wp-coding-standards/wpcs/WordPress/Helpers/VariableHelper.php deleted file mode 100644 index 264d8e9..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Helpers/VariableHelper.php +++ /dev/null @@ -1,262 +0,0 @@ -getTokens(); - $keys = array(); - - if ( isset( $tokens[ $stackPtr ] ) === false - || \T_VARIABLE !== $tokens[ $stackPtr ]['code'] - ) { - return $keys; - } - - $current = $stackPtr; - - do { - // Find the next non-empty token. - $open_bracket = $phpcsFile->findNext( - Tokens::$emptyTokens, - ( $current + 1 ), - null, - true - ); - - // If it isn't a bracket, this isn't an array-access. - if ( false === $open_bracket - || \T_OPEN_SQUARE_BRACKET !== $tokens[ $open_bracket ]['code'] - || ! isset( $tokens[ $open_bracket ]['bracket_closer'] ) - ) { - break; - } - - $key = GetTokensAsString::compact( - $phpcsFile, - ( $open_bracket + 1 ), - ( $tokens[ $open_bracket ]['bracket_closer'] - 1 ), - true - ); - - $keys[] = trim( $key ); - $current = $tokens[ $open_bracket ]['bracket_closer']; - } while ( isset( $tokens[ $current ] ) && true === $all ); - - return $keys; - } - - /** - * Get the index key of an array variable. - * - * E.g., "bar" in $foo['bar']. - * - * @since 0.5.0 - * @since 2.1.0 Now uses get_array_access_keys() under the hood. - * @since 3.0.0 - Moved from the Sniff class to this class. - * - Visibility is now `public` (was `protected`) and the method `static`. - * - The `$phpcsFile` parameter was added. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The index of the variable token in the stack. - * - * @return string|false The array index key whose value is being accessed. - */ - public static function get_array_access_key( File $phpcsFile, $stackPtr ) { - $keys = self::get_array_access_keys( $phpcsFile, $stackPtr, false ); - if ( isset( $keys[0] ) ) { - return $keys[0]; - } - - return false; - } - - /** - * Check whether a variable is being compared to another value. - * - * E.g., $var === 'foo', 1 <= $var, etc. - * - * Also recognizes `switch ( $var )` and `match ( $var )`. - * - * @since 0.5.0 - * @since 2.1.0 Added the $include_coalesce parameter. - * @since 3.0.0 - Moved from the Sniff class to this class. - * - Visibility is now `public` (was `protected`) and the method `static`. - * - The `$phpcsFile` parameter was added. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The index of this token in the stack. - * @param bool $include_coalesce Optional. Whether or not to regard the null - * coalesce operator - ?? - as a comparison operator. - * Defaults to true. - * Null coalesce is a special comparison operator in this - * sense as it doesn't compare a variable to whatever is - * on the other side of the comparison operator. - * - * @return bool Whether this is a comparison. - */ - public static function is_comparison( File $phpcsFile, $stackPtr, $include_coalesce = true ) { - $tokens = $phpcsFile->getTokens(); - if ( isset( $tokens[ $stackPtr ] ) === false ) { - return false; - } - - $comparisonTokens = Tokens::$comparisonTokens; - if ( false === $include_coalesce ) { - unset( $comparisonTokens[ \T_COALESCE ] ); - } - - // We first check if this is a switch or match statement (switch ( $var )). - if ( Parentheses::lastOwnerIn( $phpcsFile, $stackPtr, array( \T_SWITCH, \T_MATCH ) ) !== false ) { - return true; - } - - // Find the previous non-empty token. We check before the var first because - // yoda conditions are usually expected. - $previous_token = $phpcsFile->findPrevious( Tokens::$emptyTokens, ( $stackPtr - 1 ), null, true ); - - if ( isset( $comparisonTokens[ $tokens[ $previous_token ]['code'] ] ) ) { - return true; - } - - // Maybe the comparison operator is after this. - $next_token = $phpcsFile->findNext( Tokens::$emptyTokens, ( $stackPtr + 1 ), null, true ); - - // This might be an opening square bracket in the case of arrays ($var['a']). - while ( false !== $next_token - && \T_OPEN_SQUARE_BRACKET === $tokens[ $next_token ]['code'] - && isset( $tokens[ $next_token ]['bracket_closer'] ) - ) { - $next_token = $phpcsFile->findNext( - Tokens::$emptyTokens, - ( $tokens[ $next_token ]['bracket_closer'] + 1 ), - null, - true - ); - } - - if ( false !== $next_token && isset( $comparisonTokens[ $tokens[ $next_token ]['code'] ] ) ) { - return true; - } - - return false; - } - - /** - * Check if this variable is being assigned a value. - * - * E.g., $var = 'foo'; - * - * Also handles array assignments to arbitrary depth: - * - * $array['key'][ $foo ][ something() ] = $bar; - * - * @since 0.5.0 - * @since 3.0.0 - Moved from the Sniff class to this class. - * - Visibility is now `public` (was `protected`) and the method `static`. - * - The `$phpcsFile` parameter was added. - * - The `$include_coalesce` parameter was added. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The index of the token in the stack. - * This must point to either a T_VARIABLE or - * T_CLOSE_SQUARE_BRACKET token. - * @param bool $include_coalesce Optional. Whether or not to regard the null - * coalesce equal operator - `??=` - as an assignment operator. - * Defaults to true. - * Null coalesce is a special assignment operator, in the - * sense that the assignment will only happen if the variable - * being assigned to is currently `null`. - * - * @return bool Whether the token is a variable being assigned a value. - */ - public static function is_assignment( File $phpcsFile, $stackPtr, $include_coalesce = true ) { - $tokens = $phpcsFile->getTokens(); - if ( isset( $tokens[ $stackPtr ] ) === false ) { - return false; - } - - static $valid = array( - \T_VARIABLE => true, - \T_CLOSE_SQUARE_BRACKET => true, - ); - - // Must be a variable or closing square bracket (see below). - if ( ! isset( $valid[ $tokens[ $stackPtr ]['code'] ] ) ) { - return false; - } - - $next_non_empty = $phpcsFile->findNext( Tokens::$emptyTokens, ( $stackPtr + 1 ), null, true, null, true ); - - // No token found. - if ( false === $next_non_empty ) { - return false; - } - - $assignmentTokens = Tokens::$assignmentTokens; - if ( false === $include_coalesce ) { - unset( $assignmentTokens[ \T_COALESCE_EQUAL ] ); - } - - // If the next token is an assignment, that's all we need to know. - if ( isset( $assignmentTokens[ $tokens[ $next_non_empty ]['code'] ] ) ) { - return true; - } - - // Check if this is an array assignment, e.g., `$var['key'] = 'val';` . - if ( \T_OPEN_SQUARE_BRACKET === $tokens[ $next_non_empty ]['code'] - && isset( $tokens[ $next_non_empty ]['bracket_closer'] ) - ) { - return self::is_assignment( $phpcsFile, $tokens[ $next_non_empty ]['bracket_closer'], $include_coalesce ); - } - - return false; - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Helpers/WPDBTrait.php b/vendor/wp-coding-standards/wpcs/WordPress/Helpers/WPDBTrait.php deleted file mode 100644 index afa6ffc..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Helpers/WPDBTrait.php +++ /dev/null @@ -1,115 +0,0 @@ -getTokens(); - if ( isset( $tokens[ $stackPtr ] ) === false ) { - return false; - } - - // Check for wpdb. - if ( ( \T_VARIABLE === $tokens[ $stackPtr ]['code'] && '$wpdb' !== $tokens[ $stackPtr ]['content'] ) - || ( \T_STRING === $tokens[ $stackPtr ]['code'] && 'wpdb' !== strtolower( $tokens[ $stackPtr ]['content'] ) ) - ) { - return false; - } - - // Check that this is a method call. - $is_object_call = $phpcsFile->findNext( Tokens::$emptyTokens, ( $stackPtr + 1 ), null, true ); - if ( false === $is_object_call - || isset( Collections::objectOperators()[ $tokens[ $is_object_call ]['code'] ] ) === false - ) { - return false; - } - - $methodPtr = $phpcsFile->findNext( Tokens::$emptyTokens, ( $is_object_call + 1 ), null, true, null, true ); - if ( false === $methodPtr ) { - return false; - } - - if ( \T_STRING === $tokens[ $methodPtr ]['code'] && property_exists( $this, 'methodPtr' ) ) { - $this->methodPtr = $methodPtr; - } - - // Find the opening parenthesis. - $opening_paren = $phpcsFile->findNext( Tokens::$emptyTokens, ( $methodPtr + 1 ), null, true, null, true ); - - if ( false === $opening_paren ) { - return false; - } - - if ( property_exists( $this, 'i' ) ) { - $this->i = $opening_paren; - } - - if ( \T_OPEN_PARENTHESIS !== $tokens[ $opening_paren ]['code'] - || ! isset( $tokens[ $opening_paren ]['parenthesis_closer'] ) - ) { - return false; - } - - // Check that this is one of the methods that we are interested in. - if ( ! isset( $target_methods[ strtolower( $tokens[ $methodPtr ]['content'] ) ] ) ) { - return false; - } - - // Find the end of the first parameter. - $end = BCFile::findEndOfStatement( $phpcsFile, $opening_paren + 1 ); - - if ( \T_COMMA !== $tokens[ $end ]['code'] ) { - ++$end; - } - - if ( property_exists( $this, 'end' ) ) { - $this->end = $end; - } - - return true; - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Helpers/WPGlobalVariablesHelper.php b/vendor/wp-coding-standards/wpcs/WordPress/Helpers/WPGlobalVariablesHelper.php deleted file mode 100644 index b509793..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Helpers/WPGlobalVariablesHelper.php +++ /dev/null @@ -1,312 +0,0 @@ - The key is the name of a WP global variable, the value is irrelevant. - */ - private static $wp_globals = array( - '_links_add_base' => true, - '_links_add_target' => true, - '_menu_item_sort_prop' => true, - '_nav_menu_placeholder' => true, - '_new_bundled_files' => true, - '_old_files' => true, - '_parent_pages' => true, - '_registered_pages' => true, - '_updated_user_settings' => true, - '_wp_additional_image_sizes' => true, - '_wp_admin_css_colors' => true, - '_wp_default_headers' => true, - '_wp_deprecated_widgets_callbacks' => true, - '_wp_last_object_menu' => true, - '_wp_last_utility_menu' => true, - '_wp_menu_nopriv' => true, - '_wp_nav_menu_max_depth' => true, - '_wp_post_type_features' => true, - '_wp_real_parent_file' => true, - '_wp_registered_nav_menus' => true, - '_wp_sidebars_widgets' => true, - '_wp_submenu_nopriv' => true, - '_wp_suspend_cache_invalidation' => true, - '_wp_theme_features' => true, - '_wp_using_ext_object_cache' => true, - 'action' => true, - 'active_signup' => true, - 'admin_body_class' => true, - 'admin_page_hooks' => true, - 'all_links' => true, - 'allowedentitynames' => true, - 'allowedposttags' => true, - 'allowedtags' => true, - 'auth_secure_cookie' => true, - 'authordata' => true, - 'avail_post_mime_types' => true, - 'avail_post_stati' => true, - 'blog_id' => true, - 'blog_title' => true, - 'blogname' => true, - 'cat' => true, - 'cat_id' => true, - 'charset_collate' => true, - 'comment' => true, - 'comment_alt' => true, - 'comment_depth' => true, - 'comment_status' => true, - 'comment_thread_alt' => true, - 'comment_type' => true, - 'comments' => true, - 'compress_css' => true, - 'compress_scripts' => true, - 'concatenate_scripts' => true, - 'content_width' => true, - 'current_blog' => true, - 'current_screen' => true, - 'current_site' => true, - 'current_user' => true, - 'currentcat' => true, - 'currentday' => true, - 'currentmonth' => true, - 'custom_background' => true, - 'custom_image_header' => true, - 'default_menu_order' => true, - 'descriptions' => true, - 'domain' => true, - 'editor_styles' => true, - 'error' => true, - 'errors' => true, - 'EZSQL_ERROR' => true, - 'feeds' => true, - 'GETID3_ERRORARRAY' => true, - 'hook_suffix' => true, - 'HTTP_RAW_POST_DATA' => true, - 'id' => true, - 'in_comment_loop' => true, - 'interim_login' => true, - 'is_apache' => true, - 'is_chrome' => true, - 'is_gecko' => true, - 'is_IE' => true, - 'is_IIS' => true, - 'is_iis7' => true, - 'is_macIE' => true, - 'is_NS4' => true, - 'is_opera' => true, - 'is_safari' => true, - 'is_winIE' => true, - 'l10n' => true, - 'link' => true, - 'link_id' => true, - 'locale' => true, - 'locked_post_status' => true, - 'lost' => true, - 'm' => true, - 'map' => true, - 'menu' => true, - 'menu_order' => true, - 'merged_filters' => true, - 'mode' => true, - 'monthnum' => true, - 'more' => true, - 'mu_plugin' => true, - 'multipage' => true, - 'names' => true, - 'nav_menu_selected_id' => true, - 'network_plugin' => true, - 'new_whitelist_options' => true, - 'numpages' => true, - 'one_theme_location_no_menus' => true, - 'opml' => true, - 'order' => true, - 'orderby' => true, - 'overridden_cpage' => true, - 'page' => true, - 'paged' => true, - 'pagenow' => true, - 'pages' => true, - 'parent_file' => true, - 'pass_allowed_html' => true, - 'pass_allowed_protocols' => true, - 'path' => true, - 'per_page' => true, - 'PHP_SELF' => true, - 'phpmailer' => true, - 'plugin_page' => true, - 'plugin' => true, - 'plugins' => true, - 'post' => true, - 'post_default_category' => true, - 'post_default_title' => true, - 'post_ID' => true, - 'post_id' => true, - 'post_mime_types' => true, - 'post_type' => true, - 'post_type_object' => true, - 'posts' => true, - 'preview' => true, - 'previouscat' => true, - 'previousday' => true, - 'previousweekday' => true, - 'redir_tab' => true, - 'required_mysql_version' => true, - 'required_php_version' => true, - 'rnd_value' => true, - 'role' => true, - 's' => true, - 'search' => true, - 'self' => true, - 'shortcode_tags' => true, - 'show_admin_bar' => true, - 'sidebars_widgets' => true, - 'status' => true, - 'submenu' => true, - 'submenu_file' => true, - 'super_admins' => true, - 'tab' => true, - 'table_prefix' => true, - 'tabs' => true, - 'tag' => true, - 'tag_ID' => true, - 'targets' => true, - 'tax' => true, - 'taxnow' => true, - 'taxonomy' => true, - 'term' => true, - 'text_direction' => true, - 'theme_field_defaults' => true, - 'themes_allowedtags' => true, - 'timeend' => true, - 'timestart' => true, - 'tinymce_version' => true, - 'title' => true, - 'totals' => true, - 'type' => true, - 'typenow' => true, - 'updated_timestamp' => true, - 'upgrading' => true, - 'urls' => true, - 'user_email' => true, - 'user_ID' => true, - 'user_identity' => true, - 'user_level' => true, - 'user_login' => true, - 'user_url' => true, - 'userdata' => true, - 'usersearch' => true, - 'whitelist_options' => true, - 'withcomments' => true, - 'wp' => true, - 'wp_actions' => true, - 'wp_admin_bar' => true, - 'wp_cockneyreplace' => true, - 'wp_current_db_version' => true, - 'wp_current_filter' => true, - 'wp_customize' => true, - 'wp_dashboard_control_callbacks' => true, - 'wp_db_version' => true, - 'wp_did_header' => true, - 'wp_embed' => true, - 'wp_file_descriptions' => true, - 'wp_filesystem' => true, - 'wp_filter' => true, - 'wp_hasher' => true, - 'wp_header_to_desc' => true, - 'wp_importers' => true, - 'wp_json' => true, - 'wp_list_table' => true, - 'wp_local_package' => true, - 'wp_locale' => true, - 'wp_meta_boxes' => true, - 'wp_object_cache' => true, - 'wp_plugin_paths' => true, - 'wp_post_statuses' => true, - 'wp_post_types' => true, - 'wp_queries' => true, - 'wp_query' => true, - 'wp_registered_sidebars' => true, - 'wp_registered_widget_controls' => true, - 'wp_registered_widget_updates' => true, - 'wp_registered_widgets' => true, - 'wp_rewrite' => true, - 'wp_rich_edit' => true, - 'wp_rich_edit_exists' => true, - 'wp_roles' => true, - 'wp_scripts' => true, - 'wp_settings_errors' => true, - 'wp_settings_fields' => true, - 'wp_settings_sections' => true, - 'wp_smiliessearch' => true, - 'wp_styles' => true, - 'wp_taxonomies' => true, - 'wp_the_query' => true, - 'wp_theme_directories' => true, - 'wp_themes' => true, - 'wp_user_roles' => true, - 'wp_version' => true, - 'wp_widget_factory' => true, - 'wp_xmlrpc_server' => true, - 'wpcommentsjavascript' => true, - 'wpcommentspopupfile' => true, - 'wpdb' => true, - 'wpsmiliestrans' => true, - 'year' => true, - ); - - /** - * Retrieve a list with the names of global WP variables. - * - * @since 3.0.0 - * - * @return array Array with the variables names as keys. The value is irrelevant. - */ - public static function get_names() { - return self::$wp_globals; - } - - /** - * Verify if a given variable name is the name of a WP global variable. - * - * @since 3.0.0 - * - * @param string $name The full variable name with or without leading dollar sign. - * This allows for passing an array key variable name, such as - * `'_GET'` retrieved from `$GLOBALS['_GET']`. - * > Note: when passing an array key, string quotes are expected - * to have been stripped already. - * - * @return bool - */ - public static function is_wp_global( $name ) { - if ( strpos( $name, '$' ) === 0 ) { - $name = substr( $name, 1 ); - } - - return isset( self::$wp_globals[ $name ] ); - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Helpers/WPHookHelper.php b/vendor/wp-coding-standards/wpcs/WordPress/Helpers/WPHookHelper.php deleted file mode 100644 index b5b4f4a..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Helpers/WPHookHelper.php +++ /dev/null @@ -1,113 +0,0 @@ -> Function name as key, array with target - * parameter position and name(s) as value. - */ - private static $hookInvokeFunctions = array( - 'do_action' => array( - 'position' => 1, - 'name' => 'hook_name', - ), - 'do_action_ref_array' => array( - 'position' => 1, - 'name' => 'hook_name', - ), - 'do_action_deprecated' => array( - 'position' => 1, - 'name' => 'hook_name', - ), - 'apply_filters' => array( - 'position' => 1, - 'name' => 'hook_name', - ), - 'apply_filters_ref_array' => array( - 'position' => 1, - 'name' => 'hook_name', - ), - 'apply_filters_deprecated' => array( - 'position' => 1, - 'name' => 'hook_name', - ), - ); - - /** - * Retrieve a list of the WordPress functions which invoke hooks. - * - * @since 3.0.0 - * - * @param bool $include_deprecated Whether to include the names of functions - * which are used to invoke deprecated hooks. - * Defaults to `true`. - * - * @return array Array with the function names as keys. The value is irrelevant. - */ - public static function get_functions( $include_deprecated = true ) { - $hooks = array_fill_keys( array_keys( self::$hookInvokeFunctions ), true ); - if ( false === $include_deprecated ) { - unset( - $hooks['do_action_deprecated'], - $hooks['apply_filters_deprecated'] - ); - } - - return $hooks; - } - - /** - * Retrieve the parameter information for the hook name parameter from a stack of parameters - * passed to one of the WP hook functions. - * - * @since 3.0.0 - * - * @param string $function_name The name of the WP hook function which the parameters were passed to. - * @param array $parameters The output of a previous call to PassedParameters::getParameters(). - * - * @return array|false Array with information on the parameter at the specified offset, - * or with the specified name. - * Or `FALSE` if the specified parameter is not found. - * See the PHPCSUtils PassedParameters::getParameters() documentation - * for the format of the returned (single-dimensional) array. - */ - public static function get_hook_name_param( $function_name, array $parameters ) { - $function_lc = strtolower( $function_name ); - if ( isset( self::$hookInvokeFunctions[ $function_lc ] ) === false ) { - return false; - } - - return PassedParameters::getParameterFromStack( - $parameters, - self::$hookInvokeFunctions[ $function_lc ]['position'], - self::$hookInvokeFunctions[ $function_lc ]['name'] - ); - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniff.php deleted file mode 100644 index eaa7c22..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniff.php +++ /dev/null @@ -1,72 +0,0 @@ -phpcsFile = $phpcsFile; - $this->tokens = $phpcsFile->getTokens(); - - return $this->process_token( $stackPtr ); - } - - /** - * Processes a sniff when one of its tokens is encountered. - * - * @since 0.11.0 - * - * @param int $stackPtr The position of the current token in the stack. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - abstract public function process_token( $stackPtr ); -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Arrays/ArrayDeclarationSpacingSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Arrays/ArrayDeclarationSpacingSniff.php deleted file mode 100644 index bd0f75a..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Arrays/ArrayDeclarationSpacingSniff.php +++ /dev/null @@ -1,252 +0,0 @@ -tokens[ $stackPtr ]['code'] ] ) - && Arrays::isShortArray( $this->phpcsFile, $stackPtr ) === false - ) { - // Short list, not short array. - return; - } - - /* - * Determine the array opener & closer. - */ - $array_open_close = Arrays::getOpenClose( $this->phpcsFile, $stackPtr ); - if ( false === $array_open_close ) { - // Array open/close could not be determined. - return; - } - - $opener = $array_open_close['opener']; - $closer = $array_open_close['closer']; - unset( $array_open_close ); - - // Pass off to either the single line or multi-line array analysis. - if ( $this->tokens[ $opener ]['line'] === $this->tokens[ $closer ]['line'] ) { - $this->process_single_line_array( $stackPtr, $opener, $closer ); - } else { - $this->process_multi_line_array( $stackPtr, $opener ); - } - } - - /** - * Check that associative arrays are always multi-line. - * - * @since 0.13.0 The actual checks contained in this method used to - * be in the `process()` method. - * - * @param int $stackPtr The position of the current token in the stack. - * @param int $opener The position of the array opener. - * @param int $closer The position of the array closer. - * - * @return void - */ - protected function process_single_line_array( $stackPtr, $opener, $closer ) { - $array_items = PassedParameters::getParameters( $this->phpcsFile, $stackPtr ); - if ( ( false === $this->allow_single_item_single_line_associative_arrays - && empty( $array_items ) ) - || ( true === $this->allow_single_item_single_line_associative_arrays - && \count( $array_items ) === 1 ) - ) { - return; - } - - /* - * Make sure the double arrow is for *this* array, not for a nested one. - */ - $array_has_keys = false; - foreach ( $array_items as $item ) { - if ( Arrays::getDoubleArrowPtr( $this->phpcsFile, $item['start'], $item['end'] ) !== false ) { - $array_has_keys = true; - break; - } - } - - if ( false === $array_has_keys ) { - return; - } - $error = 'When an array uses associative keys, each value should start on %s.'; - if ( true === $this->allow_single_item_single_line_associative_arrays ) { - $error = 'When a multi-item array uses associative keys, each value should start on %s.'; - } - - /* - * Just add a new line before the array closer. - * The multi-line array fixer will then fix the individual array items in the next fixer loop. - */ - SpacesFixer::checkAndFix( - $this->phpcsFile, - $closer, - $this->phpcsFile->findPrevious( \T_WHITESPACE, ( $closer - 1 ), null, true ), - 'newline', - $error, - 'AssociativeArrayFound', - 'error' - ); - } - - /** - * Process a multi-line array. - * - * @since 0.13.0 The actual checks contained in this method used to - * be in the `ArrayDeclaration` sniff. - * @since 3.0.0 Removed the `$closer` parameter. - * - * @param int $stackPtr The position of the current token in the stack. - * @param int $opener The position of the array opener. - * - * @return void - */ - protected function process_multi_line_array( $stackPtr, $opener ) { - /* - * Check that each array item starts on a new line. - */ - $array_items = PassedParameters::getParameters( $this->phpcsFile, $stackPtr ); - $end_of_last_item = $opener; - - foreach ( $array_items as $item ) { - $end_of_this_item = ( $item['end'] + 1 ); - - // Find the line on which the item starts. - $first_content = $this->phpcsFile->findNext( - array( \T_WHITESPACE, \T_DOC_COMMENT_WHITESPACE ), - $item['start'], - $end_of_this_item, - true - ); - - // Ignore comments after array items if the next real content starts on a new line. - if ( $this->tokens[ $first_content ]['line'] === $this->tokens[ $end_of_last_item ]['line'] - && ( \T_COMMENT === $this->tokens[ $first_content ]['code'] - || isset( Tokens::$phpcsCommentTokens[ $this->tokens[ $first_content ]['code'] ] ) ) - ) { - $end_of_comment = $first_content; - - // Find the end of (multi-line) /* */- style trailing comments. - if ( substr( ltrim( $this->tokens[ $end_of_comment ]['content'] ), 0, 2 ) === '/*' ) { - while ( ( \T_COMMENT === $this->tokens[ $end_of_comment ]['code'] - || isset( Tokens::$phpcsCommentTokens[ $this->tokens[ $end_of_comment ]['code'] ] ) ) - && substr( rtrim( $this->tokens[ $end_of_comment ]['content'] ), -2 ) !== '*/' - && ( $end_of_comment + 1 ) < $end_of_this_item - ) { - ++$end_of_comment; - } - - if ( $this->tokens[ $end_of_comment ]['line'] !== $this->tokens[ $end_of_last_item ]['line'] ) { - // Multi-line trailing comment. - $end_of_last_item = $end_of_comment; - } - } - - $next = $this->phpcsFile->findNext( - array( \T_WHITESPACE, \T_DOC_COMMENT_WHITESPACE ), - ( $end_of_comment + 1 ), - $end_of_this_item, - true - ); - - if ( false === $next ) { - // Shouldn't happen, but just in case. - $end_of_last_item = $end_of_this_item; // @codeCoverageIgnore - continue; // @codeCoverageIgnore - } - - if ( $this->tokens[ $next ]['line'] !== $this->tokens[ $first_content ]['line'] ) { - $first_content = $next; - } - } - - if ( false === $first_content ) { - // Shouldn't happen, but just in case. - $end_of_last_item = $end_of_this_item; // @codeCoverageIgnore - continue; // @codeCoverageIgnore - } - - if ( $this->tokens[ $end_of_last_item ]['line'] === $this->tokens[ $first_content ]['line'] ) { - SpacesFixer::checkAndFix( - $this->phpcsFile, - $first_content, - $end_of_last_item, - 'newline', - 'Each item in a multi-line array must be on %s. Found: %s', - 'ArrayItemNoNewLine', - 'error' - ); - } - - $end_of_last_item = $end_of_this_item; - } - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Arrays/ArrayIndentationSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Arrays/ArrayIndentationSniff.php deleted file mode 100644 index f793ad4..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Arrays/ArrayIndentationSniff.php +++ /dev/null @@ -1,550 +0,0 @@ -ignore_tokens = Tokens::$heredocTokens; - unset( $this->ignore_tokens[ \T_START_HEREDOC ], $this->ignore_tokens[ \T_START_NOWDOC ] ); - $this->ignore_tokens[ \T_INLINE_HTML ] = \T_INLINE_HTML; - - return Collections::arrayOpenTokensBC(); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param int $stackPtr The position of the current token in the stack. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function process_token( $stackPtr ) { - if ( ! isset( $this->tab_width ) ) { - $this->tab_width = Helper::getTabWidth( $this->phpcsFile ); - } - - if ( isset( Collections::shortArrayListOpenTokensBC()[ $this->tokens[ $stackPtr ]['code'] ] ) - && Arrays::isShortArray( $this->phpcsFile, $stackPtr ) === false - ) { - // Short list, not short array. - return; - } - - /* - * Determine the array opener & closer. - */ - $array_open_close = Arrays::getOpenClose( $this->phpcsFile, $stackPtr ); - if ( false === $array_open_close ) { - // Array open/close could not be determined. - return; - } - - $opener = $array_open_close['opener']; - $closer = $array_open_close['closer']; - - if ( $this->tokens[ $opener ]['line'] === $this->tokens[ $closer ]['line'] ) { - // Not interested in single line arrays. - return; - } - - /* - * Check the closing bracket is lined up with the start of the content on the line - * containing the array opener. - */ - $opener_line_spaces = $this->get_indentation_size( $opener ); - $closer_line_spaces = ( $this->tokens[ $closer ]['column'] - 1 ); - - if ( $closer_line_spaces !== $opener_line_spaces ) { - $error = 'Array closer not aligned correctly; expected %s space(s) but found %s'; - $error_code = 'CloseBraceNotAligned'; - - /* - * Report & fix the issue if the close brace is on its own line with - * nothing or only indentation whitespace before it. - */ - if ( 0 === $closer_line_spaces - || ( \T_WHITESPACE === $this->tokens[ ( $closer - 1 ) ]['code'] - && 1 === $this->tokens[ ( $closer - 1 ) ]['column'] ) - ) { - $this->add_array_alignment_error( - $closer, - $error, - $error_code, - $opener_line_spaces, - $closer_line_spaces, - $this->get_indentation_string( $opener_line_spaces ) - ); - } else { - /* - * Otherwise, only report the error, don't try and fix it (yet). - * - * It will get corrected in a future loop of the fixer once the closer - * has been moved to its own line by the `ArrayDeclarationSpacing` sniff. - */ - $this->phpcsFile->addError( - $error, - $closer, - $error_code, - array( $opener_line_spaces, $closer_line_spaces ) - ); - } - - unset( $error, $error_code ); - } - - /* - * Verify & correct the array item indentation. - */ - $array_items = PassedParameters::getParameters( $this->phpcsFile, $stackPtr ); - if ( empty( $array_items ) ) { - // Strange, no array items found. - return; - } - - $expected_spaces = ( $opener_line_spaces + $this->tab_width ); - $expected_indent = $this->get_indentation_string( $expected_spaces ); - $end_of_previous_item = $opener; - - foreach ( $array_items as $item ) { - $end_of_this_item = ( $item['end'] + 1 ); - - // Find the line on which the item starts. - $first_content = $this->phpcsFile->findNext( - array( \T_WHITESPACE, \T_DOC_COMMENT_WHITESPACE ), - $item['start'], - $end_of_this_item, - true - ); - - // Deal with trailing comments. - if ( false !== $first_content - && \T_COMMENT === $this->tokens[ $first_content ]['code'] - && $this->tokens[ $first_content ]['line'] === $this->tokens[ $end_of_previous_item ]['line'] - ) { - $first_content = $this->phpcsFile->findNext( - array( \T_WHITESPACE, \T_DOC_COMMENT_WHITESPACE, \T_COMMENT ), - ( $first_content + 1 ), - $end_of_this_item, - true - ); - } - - if ( false === $first_content ) { - $end_of_previous_item = $end_of_this_item; - continue; - } - - // Bow out from reporting and fixing mixed multi-line/single-line arrays. - // That is handled by the ArrayDeclarationSpacingSniff. - if ( $this->tokens[ $first_content ]['line'] === $this->tokens[ $end_of_previous_item ]['line'] ) { - return $closer; - } - - // Ignore this item if there is anything but whitespace before the start of the next item. - if ( 1 !== $this->tokens[ $first_content ]['column'] ) { - // Go to the start of the line. - $i = $first_content; - while ( 1 !== $this->tokens[ --$i ]['column'] ); - - if ( \T_WHITESPACE !== $this->tokens[ $i ]['code'] ) { - $end_of_previous_item = $end_of_this_item; - continue; - } - } - - $found_spaces = ( $this->tokens[ $first_content ]['column'] - 1 ); - - if ( $found_spaces !== $expected_spaces ) { - $this->add_array_alignment_error( - $first_content, - 'Array item not aligned correctly; expected %s spaces but found %s', - 'ItemNotAligned', - $expected_spaces, - $found_spaces, - $expected_indent - ); - } - - // No need for further checking if this is a one-line array item. - if ( $this->tokens[ $first_content ]['line'] === $this->tokens[ $item['end'] ]['line'] ) { - $end_of_previous_item = $end_of_this_item; - continue; - } - - /* - * Multi-line array items. - * - * Verify & if needed, correct the indentation of subsequent lines. - * Subsequent lines may be indented more or less than the minimum expected indent, - * but the "first line after" should be indented - at least - as much as the very first line - * of the array item. - * Indentation correction for subsequent lines will be based on that diff. - */ - - // Find first token on second line of the array item. - // If the second line is a heredoc/nowdoc, continue on until we find a line with a different token. - // Same for the second line of a multi-line text string. - for ( $ptr = ( $first_content + 1 ); $ptr <= $item['end']; $ptr++ ) { - if ( $this->tokens[ $first_content ]['line'] !== $this->tokens[ $ptr ]['line'] - && 1 === $this->tokens[ $ptr ]['column'] - && false === $this->ignore_token( $ptr ) - ) { - break; - } - } - - $first_content_on_line2 = $this->phpcsFile->findNext( - array( \T_WHITESPACE, \T_DOC_COMMENT_WHITESPACE ), - $ptr, - $end_of_this_item, - true - ); - - if ( false === $first_content_on_line2 ) { - /* - * Apparently there were only tokens in the ignore list on subsequent lines. - * - * In that case, the comma after the array item might be on a line by itself, - * so check its placement. - */ - if ( $this->tokens[ $item['end'] ]['line'] !== $this->tokens[ $end_of_this_item ]['line'] - && \T_COMMA === $this->tokens[ $end_of_this_item ]['code'] - && ( $this->tokens[ $end_of_this_item ]['column'] - 1 ) !== $expected_spaces - ) { - $this->add_array_alignment_error( - $end_of_this_item, - 'Comma after multi-line array item not aligned correctly; expected %s spaces, but found %s', - 'MultiLineArrayItemCommaNotAligned', - $expected_spaces, - ( $this->tokens[ $end_of_this_item ]['column'] - 1 ), - $expected_indent - ); - } - - $end_of_previous_item = $end_of_this_item; - continue; - } - - $found_spaces_on_line2 = $this->get_indentation_size( $first_content_on_line2 ); - $expected_spaces_on_line2 = $expected_spaces; - - if ( $found_spaces < $found_spaces_on_line2 ) { - $expected_spaces_on_line2 += ( $found_spaces_on_line2 - $found_spaces ); - } - - if ( $found_spaces_on_line2 !== $expected_spaces_on_line2 ) { - - $fix = $this->phpcsFile->addFixableError( - 'Multi-line array item not aligned correctly; expected %s spaces, but found %s', - $first_content_on_line2, - 'MultiLineArrayItemNotAligned', - array( - $expected_spaces_on_line2, - $found_spaces_on_line2, - ) - ); - - if ( true === $fix ) { - $expected_indent_on_line2 = $this->get_indentation_string( $expected_spaces_on_line2 ); - - $this->phpcsFile->fixer->beginChangeset(); - - // Fix second line for the array item. - if ( 1 === $this->tokens[ $first_content_on_line2 ]['column'] - && \T_COMMENT === $this->tokens[ $first_content_on_line2 ]['code'] - ) { - $actual_comment = ltrim( $this->tokens[ $first_content_on_line2 ]['content'] ); - $replacement = $expected_indent_on_line2 . $actual_comment; - - $this->phpcsFile->fixer->replaceToken( $first_content_on_line2, $replacement ); - - } else { - $this->fix_alignment_error( $first_content_on_line2, $expected_indent_on_line2 ); - } - - // Fix subsequent lines. - for ( $i = ( $first_content_on_line2 + 1 ); $i <= $item['end']; $i++ ) { - // We're only interested in the first token on each line. - if ( 1 !== $this->tokens[ $i ]['column'] ) { - if ( $this->tokens[ $i ]['line'] === $this->tokens[ $item['end'] ]['line'] ) { - // We might as well quit if we're past the first token on the last line. - break; - } - continue; - } - - $first_content_on_line = $this->phpcsFile->findNext( - array( \T_WHITESPACE, \T_DOC_COMMENT_WHITESPACE ), - $i, - $end_of_this_item, - true - ); - - if ( false === $first_content_on_line ) { - break; - } - - // Ignore lines with heredoc and nowdoc tokens and subsequent lines in multi-line strings. - if ( true === $this->ignore_token( $first_content_on_line ) ) { - $i = $first_content_on_line; - continue; - } - - $found_spaces_on_line = $this->get_indentation_size( $first_content_on_line ); - $expected_spaces_on_line = ( $expected_spaces_on_line2 + ( $found_spaces_on_line - $found_spaces_on_line2 ) ); - $expected_spaces_on_line = max( $expected_spaces_on_line, 0 ); // Can't be below 0. - $expected_indent_on_line = $this->get_indentation_string( $expected_spaces_on_line ); - - if ( $found_spaces_on_line !== $expected_spaces_on_line ) { - if ( 1 === $this->tokens[ $first_content_on_line ]['column'] - && \T_COMMENT === $this->tokens[ $first_content_on_line ]['code'] - ) { - $actual_comment = ltrim( $this->tokens[ $first_content_on_line ]['content'] ); - $replacement = $expected_indent_on_line . $actual_comment; - - $this->phpcsFile->fixer->replaceToken( $first_content_on_line, $replacement ); - } else { - $this->fix_alignment_error( $first_content_on_line, $expected_indent_on_line ); - } - } - - // Move past any potential empty lines between the previous non-empty line and this one. - // No need to do the fixes twice. - $i = $first_content_on_line; - } - - /* - * Check the placement of the comma after the array item as it might be on a line by itself. - */ - if ( $this->tokens[ $item['end'] ]['line'] !== $this->tokens[ $end_of_this_item ]['line'] - && \T_COMMA === $this->tokens[ $end_of_this_item ]['code'] - && ( $this->tokens[ $end_of_this_item ]['column'] - 1 ) !== $expected_spaces - ) { - $this->add_array_alignment_error( - $end_of_this_item, - 'Comma after array item not aligned correctly; expected %s spaces, but found %s', - 'MultiLineArrayItemCommaNotAligned', - $expected_spaces, - ( $this->tokens[ $end_of_this_item ]['column'] - 1 ), - $expected_indent - ); - } - - $this->phpcsFile->fixer->endChangeset(); - } - } - - $end_of_previous_item = $end_of_this_item; - } - } - - /** - * Should the token be ignored ? - * - * This method is only intended to be used with the first token on a line - * for subsequent lines in an multi-line array item. - * - * @param int $ptr Stack pointer to the first token on a line. - * - * @return bool - */ - protected function ignore_token( $ptr ) { - $token_code = $this->tokens[ $ptr ]['code']; - - if ( isset( $this->ignore_tokens[ $token_code ] ) ) { - return true; - } - - /* - * If it's a subsequent line of a multi-line sting, it will not start with a quote - * character, nor just *be* a quote character. - */ - if ( isset( Tokens::$stringTokens[ $token_code ] ) === true ) { - // Deal with closing quote of a multi-line string being on its own line. - if ( "'" === $this->tokens[ $ptr ]['content'] - || '"' === $this->tokens[ $ptr ]['content'] - ) { - return true; - } - - // Deal with subsequent lines of a multi-line string where the token is broken up per line. - if ( "'" !== $this->tokens[ $ptr ]['content'][0] - && '"' !== $this->tokens[ $ptr ]['content'][0] - ) { - return true; - } - } - - return false; - } - - /** - * Determine the line indentation whitespace. - * - * @param int $ptr Stack pointer to an arbitrary token on a line. - * - * @return int Nr of spaces found. Where necessary, tabs are translated to spaces. - */ - protected function get_indentation_size( $ptr ) { - - // Find the first token on the line. - for ( ; $ptr >= 0; $ptr-- ) { - if ( 1 === $this->tokens[ $ptr ]['column'] ) { - break; - } - } - - $whitespace = ''; - - if ( \T_WHITESPACE === $this->tokens[ $ptr ]['code'] - || \T_DOC_COMMENT_WHITESPACE === $this->tokens[ $ptr ]['code'] - ) { - return $this->tokens[ $ptr ]['length']; - } - - /* - * Special case for multi-line, non-docblock comments. - * Only applicable for subsequent lines in an array item. - * - * First/Single line is tokenized as T_WHITESPACE + T_COMMENT - * Subsequent lines are tokenized as T_COMMENT including the indentation whitespace. - */ - if ( \T_COMMENT === $this->tokens[ $ptr ]['code'] ) { - $content = $this->tokens[ $ptr ]['content']; - $actual_comment = ltrim( $content ); - $whitespace = str_replace( $actual_comment, '', $content ); - } - - return \strlen( $whitespace ); - } - - /** - * Create an indentation string. - * - * @param int $nr Number of spaces the indentation should be. - * - * @return string - */ - protected function get_indentation_string( $nr ) { - if ( 0 >= $nr ) { - return ''; - } - - // Space-based indentation. - if ( false === $this->tabIndent ) { - return str_repeat( ' ', $nr ); - } - - // Tab-based indentation. - $num_tabs = (int) floor( $nr / $this->tab_width ); - $remaining = ( $nr % $this->tab_width ); - $tab_indent = str_repeat( "\t", $num_tabs ); - $tab_indent .= str_repeat( ' ', $remaining ); - - return $tab_indent; - } - - /** - * Throw an error and fix incorrect array alignment. - * - * @param int $ptr Stack pointer to the first content on the line. - * @param string $error Error message. - * @param string $error_code Error code. - * @param int $expected Expected nr of spaces (tabs translated to space value). - * @param int $found Found nr of spaces (tabs translated to space value). - * @param string $new_indent Whitespace indent replacement content. - * - * @return void - */ - protected function add_array_alignment_error( $ptr, $error, $error_code, $expected, $found, $new_indent ) { - - $fix = $this->phpcsFile->addFixableError( $error, $ptr, $error_code, array( $expected, $found ) ); - if ( true === $fix ) { - $this->fix_alignment_error( $ptr, $new_indent ); - } - } - - /** - * Fix incorrect array alignment. - * - * @param int $ptr Stack pointer to the first content on the line. - * @param string $new_indent Whitespace indent replacement content. - * - * @return void - */ - protected function fix_alignment_error( $ptr, $new_indent ) { - if ( 1 === $this->tokens[ $ptr ]['column'] ) { - $this->phpcsFile->fixer->addContentBefore( $ptr, $new_indent ); - } else { - $this->phpcsFile->fixer->replaceToken( ( $ptr - 1 ), $new_indent ); - } - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Arrays/ArrayKeySpacingRestrictionsSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Arrays/ArrayKeySpacingRestrictionsSniff.php deleted file mode 100644 index b32fb26..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Arrays/ArrayKeySpacingRestrictionsSniff.php +++ /dev/null @@ -1,174 +0,0 @@ -tokens[ $stackPtr ]; - if ( ! isset( $token['bracket_closer'] ) ) { - return; - } - - /* - * Handle square brackets without a key (array assignments) first. - */ - $first_non_ws = $this->phpcsFile->findNext( \T_WHITESPACE, ( $stackPtr + 1 ), null, true ); - if ( $first_non_ws === $token['bracket_closer'] ) { - $error = 'There should be %1$s between the square brackets for an array assignment without an explicit key. Found: %2$s'; - SpacesFixer::checkAndFix( - $this->phpcsFile, - $stackPtr, - $token['bracket_closer'], - 0, - $error, - 'SpacesBetweenBrackets' - ); - - return; - } - - /* - * Handle the spaces around explicit array keys. - */ - $needs_spaces = true; - - // Skip over a potential plus/minus sign for integers. - $first_effective = $first_non_ws; - if ( \T_MINUS === $this->tokens[ $first_effective ]['code'] || \T_PLUS === $this->tokens[ $first_effective ]['code'] ) { - $first_effective = $this->phpcsFile->findNext( \T_WHITESPACE, ( $first_effective + 1 ), null, true ); - } - - $next_non_ws = $this->phpcsFile->findNext( \T_WHITESPACE, ( $first_effective + 1 ), null, true ); - if ( ( \T_CONSTANT_ENCAPSED_STRING === $this->tokens[ $first_effective ]['code'] - || \T_LNUMBER === $this->tokens[ $first_effective ]['code'] ) - && $next_non_ws === $token['bracket_closer'] - ) { - $needs_spaces = false; - } - - $has_space_after_opener = ( \T_WHITESPACE === $this->tokens[ ( $stackPtr + 1 ) ]['code'] ); - $has_space_before_close = ( \T_WHITESPACE === $this->tokens[ ( $token['bracket_closer'] - 1 ) ]['code'] ); - - // The array key should be surrounded by spaces unless the key only consists of a string or an integer. - if ( true === $needs_spaces - && ( false === $has_space_after_opener || false === $has_space_before_close ) - ) { - $error = 'Array keys must be surrounded by spaces unless they contain a string or an integer.'; - $fix = $this->phpcsFile->addFixableError( $error, $stackPtr, 'NoSpacesAroundArrayKeys' ); - if ( true === $fix ) { - $this->phpcsFile->fixer->beginChangeset(); - - if ( false === $has_space_after_opener ) { - $this->phpcsFile->fixer->addContent( $stackPtr, ' ' ); - } - - if ( false === $has_space_before_close ) { - $this->phpcsFile->fixer->addContentBefore( $token['bracket_closer'], ' ' ); - } - - $this->phpcsFile->fixer->endChangeset(); - } - } elseif ( false === $needs_spaces && ( $has_space_after_opener || $has_space_before_close ) ) { - $error = 'Array keys must NOT be surrounded by spaces if they only contain a string or an integer.'; - $fix = $this->phpcsFile->addFixableError( $error, $stackPtr, 'SpacesAroundArrayKeys' ); - if ( true === $fix ) { - if ( $has_space_after_opener ) { - $this->phpcsFile->fixer->beginChangeset(); - - for ( $i = ( $stackPtr + 1 ); $i < $token['bracket_closer']; $i++ ) { - if ( \T_WHITESPACE !== $this->tokens[ $i ]['code'] ) { - break; - } - - $this->phpcsFile->fixer->replaceToken( $i, '' ); - } - - $this->phpcsFile->fixer->endChangeset(); - } - - if ( $has_space_before_close ) { - $this->phpcsFile->fixer->beginChangeset(); - - for ( $i = ( $token['bracket_closer'] - 1 ); $i > $stackPtr; $i-- ) { - if ( \T_WHITESPACE !== $this->tokens[ $i ]['code'] ) { - break; - } - - $this->phpcsFile->fixer->replaceToken( $i, '' ); - } - - $this->phpcsFile->fixer->endChangeset(); - } - } - } - - // If spaces are needed, check that there is only one space. - if ( true === $needs_spaces ) { - if ( $has_space_after_opener ) { - $error = 'There should be exactly %1$s before the array key. Found: %2$s'; - SpacesFixer::checkAndFix( - $this->phpcsFile, - $stackPtr, - $first_non_ws, - 1, - $error, - 'TooMuchSpaceBeforeKey' - ); - } - - if ( $has_space_before_close ) { - $last_non_ws = $this->phpcsFile->findPrevious( \T_WHITESPACE, ( $token['bracket_closer'] - 1 ), null, true ); - $error = 'There should be exactly %1$s after the array key. Found: %2$s'; - SpacesFixer::checkAndFix( - $this->phpcsFile, - $last_non_ws, - $token['bracket_closer'], - 1, - $error, - 'TooMuchSpaceAfterKey' - ); - } - } - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Arrays/MultipleStatementAlignmentSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Arrays/MultipleStatementAlignmentSniff.php deleted file mode 100644 index 038a042..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Arrays/MultipleStatementAlignmentSniff.php +++ /dev/null @@ -1,583 +0,0 @@ -= 60, align at column 60. - * - for the outliers, i.e. the array indexes where the end position - * goes past column 60, it will not align the arrow, the sniff will - * just make sure there is only one space between the end of the - * array index and the double arrow. - * - * The column value is regarded as a hard value, i.e. includes indentation, - * so setting it very low is not a good idea. - * - * @since 0.14.0 - * - * @var int - */ - public $maxColumn = 1000; - - /** - * Whether or not to align the arrow operator for multi-line array items. - * - * Whether or not an item is regarded as multi-line is based on the **value** - * of the item, not the key. - * - * Valid values are: - * - 'always': Default. Align all arrays items regardless of single/multi-line. - * - 'never': Never align array items which span multiple lines. - * This will enforce one space between the array index and the - * double arrow operator for multi-line array items, independently - * of the alignment of the rest of the array items. - * Multi-line items where the arrow is already aligned with the - * "expected" alignment, however, will be left alone. - * - operator : Only align the operator for multi-line arrays items if the - * + number percentage of multi-line items passes the comparison. - * - As it is a percentage, the number has to be between 0 and 100. - * - Supported operators: <, <=, >, >=, ==, =, !=, <> - * - The percentage is calculated against all array items - * (with and without assignment operator). - * - The (new) expected alignment will be calculated based only - * on the items being aligned. - * - Multi-line items where the arrow is already aligned with the - * (new) "expected" alignment, however, will be left alone. - * Examples: - * * Setting this to `!=100` or `<100` means that alignment will - * be enforced, unless *all* array items are multi-line. - * This is probably the most commonly desired situation. - * * Setting this to `=100` means that alignment will only - * be enforced, if *all* array items are multi-line. - * * Setting this to `<50` means that the majority of array items - * need to be single line before alignment is enforced for - * multi-line items in the array. - * * Setting this to `=0` is useless as in that case there are - * no multi-line items in the array anyway. - * - * This setting will respect the `ignoreNewlines` and `maxColumn` settings. - * - * @since 0.14.0 - * - * @var string|int - */ - public $alignMultilineItems = 'always'; - - /** - * Storage for parsed $alignMultilineItems operator part. - * - * @since 0.14.0 - * - * @var string - */ - private $operator; - - /** - * Storage for parsed $alignMultilineItems numeric part. - * - * Stored as a string as the comparison will be done string based. - * - * @since 0.14.0 - * - * @var string - */ - private $number; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 0.14.0 - * - * @return array - */ - public function register() { - return Collections::arrayOpenTokensBC(); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 0.14.0 - * - * @param int $stackPtr The position of the current token in the stack. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function process_token( $stackPtr ) { - - if ( isset( Collections::shortArrayListOpenTokensBC()[ $this->tokens[ $stackPtr ]['code'] ] ) - && Arrays::isShortArray( $this->phpcsFile, $stackPtr ) === false - ) { - // Short list, not short array. - return; - } - - /* - * Determine the array opener & closer. - */ - $array_open_close = Arrays::getOpenClose( $this->phpcsFile, $stackPtr ); - if ( false === $array_open_close ) { - // Array open/close could not be determined. - return; - } - - $opener = $array_open_close['opener']; - $closer = $array_open_close['closer']; - - $array_items = PassedParameters::getParameters( $this->phpcsFile, $stackPtr ); - if ( empty( $array_items ) ) { - return; - } - - // Pass off to either the single line or multi-line array analysis. - if ( $this->tokens[ $opener ]['line'] === $this->tokens[ $closer ]['line'] ) { - return $this->process_single_line_array( $stackPtr, $array_items, $opener, $closer ); - } else { - return $this->process_multi_line_array( $stackPtr, $array_items, $opener, $closer ); - } - } - - /** - * Process a single-line array. - * - * While the WP standard does not allow single line multi-item associative arrays, - * this sniff should function independently of that. - * - * The `WordPress.WhiteSpace.OperatorSpacing` sniff already covers checking that - * there is a space between the array key and the double arrow, but doesn't - * enforce it to be exactly one space for single line arrays. - * That is what this method covers. - * - * @since 0.14.0 - * - * @param int $stackPtr The position of the current token in the stack. - * @param array $items Info array containing information on each array item. - * @param int $opener The position of the array opener. - * @param int $closer The position of the array closer. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - protected function process_single_line_array( $stackPtr, $items, $opener, $closer ) { - /* - * For single line arrays, we don't care about what level the arrow is from. - * Just find and fix them all. - */ - $next_arrow = $this->phpcsFile->findNext( - \T_DOUBLE_ARROW, - ( $opener + 1 ), - $closer - ); - - while ( false !== $next_arrow ) { - if ( \T_WHITESPACE === $this->tokens[ ( $next_arrow - 1 ) ]['code'] ) { - $space_length = $this->tokens[ ( $next_arrow - 1 ) ]['length']; - if ( 1 !== $space_length ) { - $error = 'Expected 1 space between "%s" and double arrow; %s found'; - $data = array( - $this->tokens[ ( $next_arrow - 2 ) ]['content'], - $space_length, - ); - - $fix = $this->phpcsFile->addFixableWarning( $error, $next_arrow, 'SpaceBeforeDoubleArrow', $data ); - if ( true === $fix ) { - $this->phpcsFile->fixer->replaceToken( ( $next_arrow - 1 ), ' ' ); - } - } - } - - // Find the position of the next double arrow. - $next_arrow = $this->phpcsFile->findNext( - \T_DOUBLE_ARROW, - ( $next_arrow + 1 ), - $closer - ); - } - - // Ignore any child-arrays as the double arrows in these will already have been handled. - return ( $closer + 1 ); - } - - /** - * Process a multi-line array. - * - * @since 0.14.0 - * - * @param int $stackPtr The position of the current token in the stack. - * @param array $items Info array containing information on each array item. - * @param int $opener The position of the array opener. - * @param int $closer The position of the array closer. - * - * @return void - */ - protected function process_multi_line_array( $stackPtr, $items, $opener, $closer ) { - - $this->maxColumn = (int) $this->maxColumn; - $this->validate_align_multiline_items(); - - /* - * Determine what the spacing before the arrow should be. - * - * Will unset any array items without double arrow and with new line whitespace - * if newlines are to be ignored, so the second foreach loop only has to deal - * with items which need attention. - * - * This sniff does not take incorrect indentation of array keys into account. - * That's for the `WordPress.Arrays.ArrayIndentation` sniff to fix. - * If that would affect the alignment, a second (or third) loop of the fixer - * will correct it (again) after the indentation has been fixed. - */ - $index_end_cols = array(); // Keep track of the end column position of index keys. - $double_arrow_cols = array(); // Keep track of arrow column position and count. - $multi_line_count = 0; - $total_items = \count( $items ); - - foreach ( $items as $key => $item ) { - // Find the double arrow if there is one. - $double_arrow = Arrays::getDoubleArrowPtr( $this->phpcsFile, $item['start'], $item['end'] ); - if ( false === $double_arrow ) { - unset( $items[ $key ] ); - continue; - } - - // Find the end of the array key. - $last_index_token = $this->phpcsFile->findPrevious( - \T_WHITESPACE, - ( $double_arrow - 1 ), - $item['start'], - true - ); - - if ( true === $this->ignoreNewlines - && $this->tokens[ $last_index_token ]['line'] !== $this->tokens[ $double_arrow ]['line'] - ) { - // Ignore this item as it has a new line between the item key and the double arrow. - unset( $items[ $key ] ); - continue; - } - - $index_end_position = ( $this->tokens[ $last_index_token ]['column'] + ( $this->tokens[ $last_index_token ]['length'] - 1 ) ); - $items[ $key ]['operatorPtr'] = $double_arrow; - $items[ $key ]['last_index_token'] = $last_index_token; - $items[ $key ]['last_index_col'] = $index_end_position; - - if ( $this->tokens[ $last_index_token ]['line'] === $this->tokens[ $item['end'] ]['line'] ) { - $items[ $key ]['single_line'] = true; - } else { - $items[ $key ]['single_line'] = false; - ++$multi_line_count; - } - - if ( ( $index_end_position + 2 ) <= $this->maxColumn ) { - $index_end_cols[] = $index_end_position; - } - - if ( ! isset( $double_arrow_cols[ $this->tokens[ $double_arrow ]['column'] ] ) ) { - $double_arrow_cols[ $this->tokens[ $double_arrow ]['column'] ] = 1; - } else { - ++$double_arrow_cols[ $this->tokens[ $double_arrow ]['column'] ]; - } - } - unset( $key, $item, $double_arrow, $last_index_token ); - - if ( empty( $items ) || empty( $index_end_cols ) ) { - // No actionable array items found. - return; - } - - /* - * Determine whether the operators for multi-line items should be aligned. - */ - if ( 'always' === $this->alignMultilineItems ) { - $alignMultilineItems = true; - } elseif ( 'never' === $this->alignMultilineItems ) { - $alignMultilineItems = false; - } else { - $percentage = (string) round( ( $multi_line_count / $total_items ) * 100, 0 ); - - // Bit hacky, but this is the only comparison function in PHP which allows to - // pass the comparison operator. And hey, it works ;-). - $alignMultilineItems = version_compare( $percentage, $this->number, $this->operator ); - } - - /* - * If necessary, rebuild the $index_end_cols and $double_arrow_cols arrays - * excluding multi-line items. - */ - if ( false === $alignMultilineItems ) { - $select_index_end_cols = array(); - $double_arrow_cols = array(); - - foreach ( $items as $item ) { - if ( false === $item['single_line'] ) { - continue; - } - - if ( ( $item['last_index_col'] + 2 ) <= $this->maxColumn ) { - $select_index_end_cols[] = $item['last_index_col']; - } - - if ( ! isset( $double_arrow_cols[ $this->tokens[ $item['operatorPtr'] ]['column'] ] ) ) { - $double_arrow_cols[ $this->tokens[ $item['operatorPtr'] ]['column'] ] = 1; - } else { - ++$double_arrow_cols[ $this->tokens[ $item['operatorPtr'] ]['column'] ]; - } - } - } - - /* - * Determine the expected position of the double arrows. - */ - if ( ! empty( $select_index_end_cols ) ) { - $max_index_width = max( $select_index_end_cols ); - } else { - $max_index_width = max( $index_end_cols ); - } - - $expected_col = ( $max_index_width + 2 ); - - if ( false === $this->exact && ! empty( $double_arrow_cols ) ) { - /* - * If the alignment does not have to be exact, see if a majority - * group of the arrows is already at an acceptable position. - */ - arsort( $double_arrow_cols, \SORT_NUMERIC ); - reset( $double_arrow_cols ); - $count = current( $double_arrow_cols ); - - if ( $count > 1 || ( 1 === $count && \count( $items ) === 1 ) ) { - // Allow for several groups of arrows having the same $count. - $filtered_double_arrow_cols = array_keys( $double_arrow_cols, $count, true ); - - foreach ( $filtered_double_arrow_cols as $col ) { - if ( $col > $expected_col && $col <= $this->maxColumn ) { - $expected_col = $col; - break; - } - } - } - } - unset( $max_index_width, $count, $filtered_double_arrow_cols, $col ); - - /* - * Verify and correct the spacing around the double arrows. - */ - foreach ( $items as $item ) { - if ( $this->tokens[ $item['operatorPtr'] ]['column'] === $expected_col - && $this->tokens[ $item['operatorPtr'] ]['line'] === $this->tokens[ $item['last_index_token'] ]['line'] - ) { - // Already correctly aligned. - continue; - } - - if ( \T_WHITESPACE !== $this->tokens[ ( $item['operatorPtr'] - 1 ) ]['code'] ) { - $before = 0; - } elseif ( $this->tokens[ $item['last_index_token'] ]['line'] !== $this->tokens[ $item['operatorPtr'] ]['line'] ) { - $before = 'newline'; - } else { - $before = $this->tokens[ ( $item['operatorPtr'] - 1 ) ]['length']; - } - - /* - * Deal with index sizes larger than maxColumn and with multi-line - * array items which should not be aligned. - */ - if ( ( $item['last_index_col'] + 2 ) > $this->maxColumn - || ( false === $alignMultilineItems && false === $item['single_line'] ) - ) { - - if ( ( $item['last_index_col'] + 2 ) === $this->tokens[ $item['operatorPtr'] ]['column'] - && $this->tokens[ $item['operatorPtr'] ]['line'] === $this->tokens[ $item['last_index_token'] ]['line'] - ) { - // MaxColumn/Multi-line item exception, already correctly aligned. - continue; - } - - $prefix = 'LongIndex'; - if ( false === $alignMultilineItems && false === $item['single_line'] ) { - $prefix = 'MultilineItem'; - } - - $error_code = $prefix . 'SpaceBeforeDoubleArrow'; - if ( 0 === $before ) { - $error_code = $prefix . 'NoSpaceBeforeDoubleArrow'; - } - - $fix = $this->phpcsFile->addFixableWarning( - 'Expected 1 space between "%s" and double arrow; %s found.', - $item['operatorPtr'], - $error_code, - array( - $this->tokens[ $item['last_index_token'] ]['content'], - $before, - ) - ); - - if ( true === $fix ) { - $this->phpcsFile->fixer->beginChangeset(); - - // Remove whitespace tokens between the end of the index and the arrow, if any. - for ( $i = ( $item['last_index_token'] + 1 ); $i < $item['operatorPtr']; $i++ ) { - $this->phpcsFile->fixer->replaceToken( $i, '' ); - } - - // Add the correct whitespace. - $this->phpcsFile->fixer->addContent( $item['last_index_token'], ' ' ); - - $this->phpcsFile->fixer->endChangeset(); - } - continue; - } - - /* - * Deal with the space before double arrows in all other cases. - */ - $expected_whitespace = $expected_col - ( $this->tokens[ $item['last_index_token'] ]['column'] + $this->tokens[ $item['last_index_token'] ]['length'] ); - - $fix = $this->phpcsFile->addFixableWarning( - 'Array double arrow not aligned correctly; expected %s space(s) between "%s" and double arrow, but found %s.', - $item['operatorPtr'], - 'DoubleArrowNotAligned', - array( - $expected_whitespace, - $this->tokens[ $item['last_index_token'] ]['content'], - $before, - ) - ); - - if ( true === $fix ) { - if ( 0 === $before || 'newline' === $before ) { - $this->phpcsFile->fixer->beginChangeset(); - - // Remove whitespace tokens between the end of the index and the arrow, if any. - for ( $i = ( $item['last_index_token'] + 1 ); $i < $item['operatorPtr']; $i++ ) { - $this->phpcsFile->fixer->replaceToken( $i, '' ); - } - - // Add the correct whitespace. - $this->phpcsFile->fixer->addContent( - $item['last_index_token'], - str_repeat( ' ', $expected_whitespace ) - ); - - $this->phpcsFile->fixer->endChangeset(); - } elseif ( $expected_whitespace > $before ) { - // Add to the existing whitespace to prevent replacing tabs with spaces. - // That's the concern of another sniff. - $this->phpcsFile->fixer->addContent( - ( $item['operatorPtr'] - 1 ), - str_repeat( ' ', ( $expected_whitespace - $before ) ) - ); - } else { - // Too much whitespace found. - $this->phpcsFile->fixer->replaceToken( - ( $item['operatorPtr'] - 1 ), - str_repeat( ' ', $expected_whitespace ) - ); - } - } - } - } - - /** - * Validate that a valid value has been received for the alignMultilineItems property. - * - * This message may be thrown more than once if the property is being changed inline in a file. - * - * @since 0.14.0 - * - * @return void - */ - protected function validate_align_multiline_items() { - $alignMultilineItems = $this->alignMultilineItems; - - if ( 'always' === $alignMultilineItems || 'never' === $alignMultilineItems ) { - return; - } else { - // Correct for a potentially added % sign. - $alignMultilineItems = rtrim( $alignMultilineItems, '%' ); - - if ( preg_match( '`^([=<>!]{1,2})(100|[0-9]{1,2})$`', $alignMultilineItems, $matches ) > 0 ) { - $operator = $matches[1]; - $number = (int) $matches[2]; - - if ( \in_array( $operator, array( '<', '<=', '>', '>=', '==', '=', '!=', '<>' ), true ) === true - && ( $number >= 0 && $number <= 100 ) - ) { - $this->alignMultilineItems = $alignMultilineItems; - $this->number = (string) $number; - $this->operator = $operator; - return; - } - } - } - - $this->phpcsFile->addError( - 'Invalid property value passed: "%s". The value for the "alignMultilineItems" property for the "WordPress.Arrays.MultipleStatementAlignment" sniff should be either "always", "never" or an comparison operator + a number between 0 and 100.', - 0, - 'InvalidPropertyPassed', - array( $this->alignMultilineItems ) - ); - - // Reset to the default if an invalid value was received. - $this->alignMultilineItems = 'always'; - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/CodeAnalysis/AssignmentInTernaryConditionSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/CodeAnalysis/AssignmentInTernaryConditionSniff.php deleted file mode 100644 index 3d192cf..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/CodeAnalysis/AssignmentInTernaryConditionSniff.php +++ /dev/null @@ -1,173 +0,0 @@ -assignment_tokens = Tokens::$assignmentTokens; - unset( $this->assignment_tokens[ \T_DOUBLE_ARROW ] ); - - $starters = Tokens::$booleanOperators; - $starters[ \T_SEMICOLON ] = \T_SEMICOLON; - $starters[ \T_OPEN_PARENTHESIS ] = \T_OPEN_PARENTHESIS; - $starters[ \T_INLINE_ELSE ] = \T_INLINE_ELSE; - - $this->condition_start_tokens = $starters; - - return array( - \T_INLINE_THEN, - ); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 0.14.0 - * - * @param int $stackPtr The position of the current token in the stack. - * - * @return void - */ - public function process_token( $stackPtr ) { - - $token = $this->tokens[ $stackPtr ]; - - // Check if the condition for the ternary is bracketed. - $prev = $this->phpcsFile->findPrevious( Tokens::$emptyTokens, ( $stackPtr - 1 ), null, true ); - if ( \T_CLOSE_PARENTHESIS === $this->tokens[ $prev ]['code'] ) { - if ( ! isset( $this->tokens[ $prev ]['parenthesis_opener'] ) ) { - return; - } - - $opener = $this->tokens[ $prev ]['parenthesis_opener']; - $closer = $prev; - } elseif ( isset( $token['nested_parenthesis'] ) ) { - $opener = Parentheses::getLastOpener( $this->phpcsFile, $stackPtr ); - $closer = Parentheses::getLastCloser( $this->phpcsFile, $stackPtr ); - - $next_statement_closer = BCFile::findEndOfStatement( $this->phpcsFile, $stackPtr, array( \T_COLON, \T_CLOSE_PARENTHESIS, \T_CLOSE_SQUARE_BRACKET ) ); - if ( false !== $next_statement_closer && $next_statement_closer < $closer ) { - // Parentheses are unrelated to the ternary. - return; - } - - $prev_statement_closer = BCFile::findStartOfStatement( $this->phpcsFile, $stackPtr, array( \T_COLON, \T_OPEN_PARENTHESIS, \T_OPEN_SQUARE_BRACKET ) ); - if ( false !== $prev_statement_closer && $opener < $prev_statement_closer ) { - // Parentheses are unrelated to the ternary. - return; - } - - if ( $closer > $stackPtr ) { - $closer = $stackPtr; - } - } else { - // No parenthesis found, can't determine where the conditional part of the ternary starts. - return; - } - - $startPos = $opener; - - do { - $hasAssignment = $this->phpcsFile->findNext( $this->assignment_tokens, ( $startPos + 1 ), $closer ); - if ( false === $hasAssignment ) { - return; - } - - // Examine whether the left side is a variable. - $hasVariable = false; - $conditionStart = $startPos; - $altConditionStart = $this->phpcsFile->findPrevious( - $this->condition_start_tokens, - ( $hasAssignment - 1 ), - $startPos - ); - if ( false !== $altConditionStart ) { - $conditionStart = $altConditionStart; - } - - for ( $i = $hasAssignment; $i > $conditionStart; $i-- ) { - if ( isset( Tokens::$emptyTokens[ $this->tokens[ $i ]['code'] ] ) ) { - continue; - } - - // If this is a variable or array, we've seen all we need to see. - if ( \T_VARIABLE === $this->tokens[ $i ]['code'] - || \T_CLOSE_SQUARE_BRACKET === $this->tokens[ $i ]['code'] - ) { - $hasVariable = true; - break; - } - - // If this is a function call or something, we are OK. - if ( \T_CLOSE_PARENTHESIS === $this->tokens[ $i ]['code'] ) { - break; - } - } - - if ( true === $hasVariable ) { - $this->phpcsFile->addWarning( - 'Variable assignment found within a condition. Did you mean to do a comparison?', - $hasAssignment, - 'FoundInTernaryCondition' - ); - } - - $startPos = $hasAssignment; - - } while ( $startPos < $closer ); - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/CodeAnalysis/EscapedNotTranslatedSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/CodeAnalysis/EscapedNotTranslatedSniff.php deleted file mode 100644 index 4508449..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/CodeAnalysis/EscapedNotTranslatedSniff.php +++ /dev/null @@ -1,89 +0,0 @@ - Key is the name of the function being matched, value the alternative to use. - */ - protected $target_functions = array( - 'esc_html' => 'esc_html__', - 'esc_attr' => 'esc_attr__', - ); - - /** - * Process the parameters of a matched function. - * - * @since 2.2.0 - * - * @param int $stackPtr The position of the current token in the stack. - * @param string $group_name The name of the group which was matched. - * @param string $matched_content The token content (function name) which was matched - * in lowercase. - * @param array $parameters Array with information about the parameters. - * - * @return void - */ - public function process_parameters( $stackPtr, $group_name, $matched_content, $parameters ) { - if ( \count( $parameters ) === 1 ) { - return; - } - - /* - * We already know that there will be a valid open+close parenthesis, otherwise the sniff - * would have bowed out long before. - */ - $opener = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $stackPtr + 1 ), null, true ); - $closer = $this->tokens[ $opener ]['parenthesis_closer']; - - $data = array( - $matched_content, - $this->target_functions[ $matched_content ], - GetTokensAsString::compact( $this->phpcsFile, $stackPtr, $closer, true ), - ); - - $this->phpcsFile->addWarning( - '%s() expects only a $text parameter. Did you mean to use %s() ? Found: %s', - $stackPtr, - 'Found', - $data - ); - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/DB/DirectDatabaseQuerySniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/DB/DirectDatabaseQuerySniff.php deleted file mode 100644 index 3271a41..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/DB/DirectDatabaseQuerySniff.php +++ /dev/null @@ -1,324 +0,0 @@ - array(), - 'cacheset' => array(), - 'cachedelete' => array(), - ); - - /** - * A list of functions that get data from the cache. - * - * @since 0.6.0 - * @since 0.11.0 Changed from public static to protected non-static. - * @since 3.0.0 Moved from the generic `Sniff` class to this class. - * - * @var array - */ - protected $cacheGetFunctions = array( - 'wp_cache_get' => true, - 'wp_cache_get_multiple' => true, - 'wp_cache_get_multiple_salted' => true, - 'wp_cache_get_salted' => true, - ); - - /** - * A list of functions that set data in the cache. - * - * @since 0.6.0 - * @since 0.11.0 Changed from public static to protected non-static. - * @since 3.0.0 Moved from the generic `Sniff` class to this class. - * - * @var array - */ - protected $cacheSetFunctions = array( - 'wp_cache_add' => true, - 'wp_cache_add_multiple' => true, - 'wp_cache_set' => true, - 'wp_cache_set_multiple' => true, - 'wp_cache_set_multiple_salted' => true, - 'wp_cache_set_salted' => true, - ); - - /** - * A list of functions that delete data from the cache. - * - * @since 0.6.0 - * @since 0.11.0 Changed from public static to protected non-static. - * @since 3.0.0 Moved from the generic `Sniff` class to this class. - * - * @var array - */ - protected $cacheDeleteFunctions = array( - 'wp_cache_delete' => true, - 'wp_cache_delete_multiple' => true, - 'wp_cache_flush_group' => true, - 'wp_cache_flush_runtime' => true, - 'clean_attachment_cache' => true, - 'clean_blog_cache' => true, - 'clean_bookmark_cache' => true, - 'clean_category_cache' => true, - 'clean_comment_cache' => true, - 'clean_network_cache' => true, - 'clean_object_term_cache' => true, - 'clean_page_cache' => true, - 'clean_post_cache' => true, - 'clean_term_cache' => true, - 'clean_user_cache' => true, - ); - - /** - * The lists of $wpdb methods. - * - * @since 0.6.0 - * @since 0.11.0 Changed from static to non-static. - * - * @var array[] - */ - protected $methods = array( - 'cachable' => array( - 'delete' => true, - 'get_var' => true, - 'get_col' => true, - 'get_row' => true, - 'get_results' => true, - 'query' => true, - 'replace' => true, - 'update' => true, - ), - 'noncachable' => array( - 'insert' => true, - ), - ); - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() { - return array( - \T_VARIABLE, - ); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param int $stackPtr The position of the current token in the stack. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function process_token( $stackPtr ) { - - // Check for $wpdb variable. - if ( '$wpdb' !== $this->tokens[ $stackPtr ]['content'] ) { - return; - } - - $is_object_call = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $stackPtr + 1 ), null, true ); - if ( false === $is_object_call - || ( \T_OBJECT_OPERATOR !== $this->tokens[ $is_object_call ]['code'] - && \T_NULLSAFE_OBJECT_OPERATOR !== $this->tokens[ $is_object_call ]['code'] ) - ) { - // This is not a call to the wpdb object. - return; - } - - $methodPtr = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $is_object_call + 1 ), null, true ); - $method = strtolower( $this->tokens[ $methodPtr ]['content'] ); - - $this->mergeFunctionLists(); - - if ( ! isset( $this->methods['all'][ $method ] ) ) { - return; - } - - $endOfStatement = $this->phpcsFile->findNext( array( \T_SEMICOLON, \T_CLOSE_TAG ), ( $stackPtr + 1 ) ); - if ( false === $endOfStatement ) { - return; - } - - // Check for Database Schema Changes/ table truncation. - for ( $_pos = ( $stackPtr + 1 ); $_pos < $endOfStatement; $_pos++ ) { - $_pos = $this->phpcsFile->findNext( Tokens::$textStringTokens, $_pos, $endOfStatement ); - if ( false === $_pos ) { - break; - } - - if ( strpos( strtoupper( TextStrings::stripQuotes( $this->tokens[ $_pos ]['content'] ) ), 'TRUNCATE ' ) === 0 ) { - // Ignore queries to truncate the database as caching those is irrelevant and they need a direct db query. - return; - } - - if ( preg_match( '#\b(?:ALTER|CREATE|DROP)\b#i', $this->tokens[ $_pos ]['content'] ) > 0 ) { - $this->phpcsFile->addWarning( 'Attempting a database schema change is discouraged.', $_pos, 'SchemaChange' ); - } - } - - $this->phpcsFile->addWarning( 'Use of a direct database call is discouraged.', $stackPtr, 'DirectQuery' ); - - if ( ! isset( $this->methods['cachable'][ $method ] ) ) { - return $endOfStatement; - } - - $cached = false; - $wp_cache_get = false; - - $scope_function = Conditions::getLastCondition( $this->phpcsFile, $stackPtr, Collections::functionDeclarationTokens() ); - if ( false !== $scope_function ) { - $scopeStart = $this->tokens[ $scope_function ]['scope_opener']; - $scopeEnd = $this->tokens[ $scope_function ]['scope_closer']; - - for ( $i = ( $scopeStart + 1 ); $i < $scopeEnd; $i++ ) { - if ( \T_STRING === $this->tokens[ $i ]['code'] ) { - $nextNonEmpty = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $i + 1 ), null, true ); - - if ( \T_OPEN_PARENTHESIS !== $this->tokens[ $nextNonEmpty ]['code'] ) { - continue; - } - - $content = strtolower( $this->tokens[ $i ]['content'] ); - - if ( isset( $this->cacheDeleteFunctions[ $content ] ) ) { - - if ( \in_array( $method, array( 'query', 'update', 'replace', 'delete' ), true ) ) { - $cached = true; - break; - } - } elseif ( isset( $this->cacheGetFunctions[ $content ] ) ) { - - $wp_cache_get = true; - - } elseif ( isset( $this->cacheSetFunctions[ $content ] ) ) { - - if ( $wp_cache_get ) { - $cached = true; - break; - } - } - } - } - } - - if ( ! $cached ) { - $message = 'Direct database call without caching detected. Consider using wp_cache_get() / wp_cache_set() or wp_cache_delete().'; - $this->phpcsFile->addWarning( $message, $stackPtr, 'NoCaching' ); - } - - return $endOfStatement; - } - - /** - * Merge custom functions provided via a custom ruleset with the defaults, if we haven't already. - * - * @since 0.11.0 Split out from the `process()` method. - * - * @return void - */ - protected function mergeFunctionLists() { - if ( ! isset( $this->methods['all'] ) ) { - $this->methods['all'] = array_merge( $this->methods['cachable'], $this->methods['noncachable'] ); - } - - if ( $this->customCacheGetFunctions !== $this->addedCustomFunctions['cacheget'] ) { - $this->cacheGetFunctions = RulesetPropertyHelper::merge_custom_array( - $this->customCacheGetFunctions, - $this->cacheGetFunctions - ); - - $this->cacheGetFunctions = array_change_key_case( $this->cacheGetFunctions ); - - $this->addedCustomFunctions['cacheget'] = $this->customCacheGetFunctions; - } - - if ( $this->customCacheSetFunctions !== $this->addedCustomFunctions['cacheset'] ) { - $this->cacheSetFunctions = RulesetPropertyHelper::merge_custom_array( - $this->customCacheSetFunctions, - $this->cacheSetFunctions - ); - - $this->cacheSetFunctions = array_change_key_case( $this->cacheSetFunctions ); - - $this->addedCustomFunctions['cacheset'] = $this->customCacheSetFunctions; - } - - if ( $this->customCacheDeleteFunctions !== $this->addedCustomFunctions['cachedelete'] ) { - $this->cacheDeleteFunctions = RulesetPropertyHelper::merge_custom_array( - $this->customCacheDeleteFunctions, - $this->cacheDeleteFunctions - ); - - $this->cacheDeleteFunctions = array_change_key_case( $this->cacheDeleteFunctions ); - - $this->addedCustomFunctions['cachedelete'] = $this->customCacheDeleteFunctions; - } - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/DB/PreparedSQLPlaceholdersSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/DB/PreparedSQLPlaceholdersSniff.php deleted file mode 100644 index ba72cab..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/DB/PreparedSQLPlaceholdersSniff.php +++ /dev/null @@ -1,766 +0,0 @@ -prepare method. - * - * Checks the following issues: - * - The only placeholders supported are: %d, %f (%F), %s, %i, and their variations. - * - Literal % signs need to be properly escaped as `%%`. - * - Simple placeholders (%d, %f, %F, %s, %i) should be left unquoted in the query string. - * - Complex placeholders - numbered and formatted variants - will not be quoted - * automagically by $wpdb->prepare(), so if used for values, should be quoted in - * the query string. - * The only exception to this is complex placeholders for %i. In that case, the - * replacement *will* still be backtick-quoted. - * - Either an array of replacements should be passed matching the number of - * placeholders found or individual parameters for each placeholder should - * be passed. - * - Wildcards for LIKE compare values should be passed in via a replacement parameter. - * - * The sniff allows for a specific pattern with a variable number of placeholders - * created using code along the lines of: - * `sprintf( 'query .... IN (%s) ...', implode( ',', array_fill( 0, count( $something ), '%s' ) ) )`. - * - * @link https://developer.wordpress.org/reference/classes/wpdb/prepare/ - * @link https://core.trac.wordpress.org/changeset/41496 - * @link https://core.trac.wordpress.org/changeset/41471 - * @link https://core.trac.wordpress.org/changeset/55151 - * - * @since 0.14.0 - * @since 3.0.0 Support for the %i placeholder has been added - * - * @uses \WordPressCS\WordPress\Helpers\MinimumWPVersionTrait::$minimum_wp_version - */ -final class PreparedSQLPlaceholdersSniff extends Sniff { - - use MinimumWPVersionTrait; - use WPDBTrait; - - /** - * These regexes were originally copied from https://www.php.net/function.sprintf#93552 - * and adjusted for limitations in `$wpdb->prepare()`. - * - * Near duplicate of the one used in the WP.I18n sniff, but with fewer types allowed. - * - * Note: The regex delimiters and modifiers are not included to allow this regex to be - * concatenated together with other regex partials. - * - * @since 0.14.0 - * - * @var string - */ - const PREPARE_PLACEHOLDER_REGEX = '(?: - (? true, - ); - - /** - * Storage for the stack pointer to the method call token. - * - * @since 0.14.0 - * - * @var int - */ - protected $methodPtr; - - /** - * Simple regex snippet to recognize and remember quotes. - * - * @since 0.14.0 - * - * @var string - */ - private $regex_quote = '["\']'; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 0.14.0 - * - * @return array - */ - public function register() { - return array( - \T_VARIABLE, - \T_STRING, - ); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 0.14.0 - * - * @param int $stackPtr The position of the current token in the stack. - * - * @return void - */ - public function process_token( $stackPtr ) { - - $this->set_minimum_wp_version(); - - if ( ! $this->is_wpdb_method_call( $this->phpcsFile, $stackPtr, $this->target_methods ) ) { - return; - } - - $parameters = PassedParameters::getParameters( $this->phpcsFile, $this->methodPtr ); - if ( empty( $parameters ) ) { - return; - } - - $query = PassedParameters::getParameterFromStack( $parameters, 1, 'query' ); - if ( false === $query ) { - return; - } - - $text_string_tokens_found = false; - $variable_found = false; - $sql_wildcard_found = false; - $total_placeholders = 0; - $total_parameters = \count( $parameters ); - $valid_in_clauses = array( - 'uses_in' => 0, - 'implode_fill' => 0, - 'adjustment_count' => 0, - ); - $skip_from = null; - $skip_to = null; - - for ( $i = $query['start']; $i <= $query['end']; $i++ ) { - // Skip over groups of tokens if they are part of an inline function call. - if ( isset( $skip_from, $skip_to ) && $i >= $skip_from && $i <= $skip_to ) { - $i = $skip_to; - continue; - } - - if ( ! isset( Tokens::$textStringTokens[ $this->tokens[ $i ]['code'] ] ) ) { - if ( \T_VARIABLE === $this->tokens[ $i ]['code'] ) { - if ( '$wpdb' !== $this->tokens[ $i ]['content'] ) { - $variable_found = true; - } - continue; - } - - // Detect a specific pattern for variable replacements in combination with `IN`. - if ( \T_STRING === $this->tokens[ $i ]['code'] ) { - - if ( 'sprintf' === strtolower( $this->tokens[ $i ]['content'] ) ) { - $sprintf_parameters = PassedParameters::getParameters( $this->phpcsFile, $i ); - - if ( ! empty( $sprintf_parameters ) ) { - /* - * Check for named params. sprintf() does not support this due to its variadic nature, - * and we cannot analyze the code correctly if it is used, so skip the whole sprintf() - * in that case. - */ - $valid_sprintf = true; - foreach ( $sprintf_parameters as $param ) { - if ( isset( $param['name'] ) ) { - $valid_sprintf = false; - break; - } - } - - if ( false === $valid_sprintf ) { - $next = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $i + 1 ), null, true ); - if ( \T_OPEN_PARENTHESIS === $this->tokens[ $next ]['code'] - && isset( $this->tokens[ $next ]['parenthesis_closer'] ) - ) { - $skip_from = ( $i + 1 ); - $skip_to = $this->tokens[ $next ]['parenthesis_closer']; - } - - continue; - } - - // We know for sure this sprintf() uses positional parameters, so this will be fine. - $skip_from = ( $sprintf_parameters[1]['end'] + 1 ); - $last_param = end( $sprintf_parameters ); - $skip_to = ( $last_param['end'] + 1 ); - - $valid_in_clauses['implode_fill'] += $this->analyse_sprintf( $sprintf_parameters ); - $valid_in_clauses['adjustment_count'] += ( \count( $sprintf_parameters ) - 1 ); - } - unset( $sprintf_parameters, $valid_sprintf, $last_param ); - - } elseif ( 'implode' === strtolower( $this->tokens[ $i ]['content'] ) ) { - $ignore_tokens = Tokens::$emptyTokens + array( - \T_STRING_CONCAT => \T_STRING_CONCAT, - \T_NS_SEPARATOR => \T_NS_SEPARATOR, - ); - - $prev = $this->phpcsFile->findPrevious( - $ignore_tokens, - ( $i - 1 ), - $query['start'], - true - ); - - if ( isset( Tokens::$textStringTokens[ $this->tokens[ $prev ]['code'] ] ) ) { - $prev_content = TextStrings::stripQuotes( $this->tokens[ $prev ]['content'] ); - $regex_quote = $this->get_regex_quote_snippet( $prev_content, $this->tokens[ $prev ]['content'] ); - - // Only examine the implode if preceded by an ` IN (`. - if ( preg_match( '`\s+IN\s*\(\s*(' . $regex_quote . ')?$`i', $prev_content, $match ) > 0 ) { - - if ( isset( $match[1] ) && $regex_quote !== $this->regex_quote ) { - $this->phpcsFile->addError( - 'Dynamic placeholder generation should not have surrounding quotes.', - $prev, - 'QuotedDynamicPlaceholderGeneration' - ); - } - - if ( $this->analyse_implode( $i ) === true ) { - ++$valid_in_clauses['uses_in']; - ++$valid_in_clauses['implode_fill']; - - $next = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $i + 1 ), null, true ); - if ( \T_OPEN_PARENTHESIS === $this->tokens[ $next ]['code'] - && isset( $this->tokens[ $next ]['parenthesis_closer'] ) - ) { - $skip_from = ( $i + 1 ); - $skip_to = $this->tokens[ $next ]['parenthesis_closer']; - } - } - } - unset( $next, $prev_content, $regex_quote, $match ); - } - unset( $prev ); - } - } - - continue; - } - - $text_string_tokens_found = true; - $content = $this->tokens[ $i ]['content']; - - $regex_quote = $this->regex_quote; - if ( isset( Tokens::$stringTokens[ $this->tokens[ $i ]['code'] ] ) ) { - $content = TextStrings::stripQuotes( $content ); - $regex_quote = $this->get_regex_quote_snippet( $content, $this->tokens[ $i ]['content'] ); - } - - if ( \T_DOUBLE_QUOTED_STRING === $this->tokens[ $i ]['code'] - || \T_HEREDOC === $this->tokens[ $i ]['code'] - ) { - // Only interested in actual query text, so strip out variables. - $stripped_content = TextStrings::stripEmbeds( $content ); - if ( $stripped_content !== $content ) { - $vars_without_wpdb = array_filter( - TextStrings::getEmbeds( $content ), - static function ( $symbol ) { - return preg_match( '`^\{?\$\{?wpdb\??->`', $symbol ) !== 1; - } - ); - - $content = $stripped_content; - - if ( ! empty( $vars_without_wpdb ) ) { - $variable_found = true; - } - } - unset( $stripped_content, $vars_without_wpdb ); - } - - $placeholders = preg_match_all( '`' . self::PREPARE_PLACEHOLDER_REGEX . '`x', $content, $matches ); - if ( $placeholders > 0 ) { - $total_placeholders += $placeholders; - } - - /* - * Analyze the query for incorrect LIKE queries. - * - * - `LIKE %s` is the only correct one. - * - `LIKE '%s'` or `LIKE "%s"` will not be reported here, but in the quote check. - * - Any other `LIKE` statement should be reported, either for using `LIKE` without - * SQL wildcards or for not passing the SQL wildcards via the replacement. - */ - $regex = '`\s+LIKE\s*(?:(' . $regex_quote . ')(?!%s(?:\1|$))(?P.*?)(?:\1|$)|(?:concat\((?![^\)]*%s[^\)]*\))(?P[^\)]*))\))`i'; - if ( preg_match_all( $regex, $content, $matches ) > 0 ) { - $walk = array(); - if ( ! empty( $matches['content'] ) ) { - $matches['content'] = array_filter( $matches['content'] ); - if ( ! empty( $matches['content'] ) ) { - $walk[] = 'content'; - } - } - if ( ! empty( $matches['concat'] ) ) { - $matches['concat'] = array_filter( $matches['concat'] ); - if ( ! empty( $matches['concat'] ) ) { - $walk[] = 'concat'; - } - } - - if ( ! empty( $walk ) ) { - foreach ( $walk as $match_key ) { - foreach ( $matches[ $match_key ] as $index => $match ) { - $data = array( $matches[0][ $index ] ); - - // Both a `%` as well as a `_` are wildcards in SQL. - if ( strpos( $match, '%' ) === false && strpos( $match, '_' ) === false ) { - $this->phpcsFile->addWarning( - 'Unless you are using SQL wildcards, using LIKE is inefficient. Use a straight compare instead. Found: %s.', - $i, - 'LikeWithoutWildcards', - $data - ); - } else { - $sql_wildcard_found = true; - - if ( strpos( $match, '%s' ) === false ) { - $this->phpcsFile->addError( - 'SQL wildcards for a LIKE query should be passed in through a replacement parameter. Found: %s.', - $i, - 'LikeWildcardsInQuery', - $data - ); - } else { - $this->phpcsFile->addError( - 'SQL wildcards for a LIKE query should be passed in through a replacement parameter and the variable part of the replacement should be escaped using "esc_like()". Found: %s.', - $i, - 'LikeWildcardsInQueryWithPlaceholder', - $data - ); - } - } - - /* - * Don't throw `UnescapedLiteral`, `UnsupportedPlaceholder` or `QuotedPlaceholder` - * for this part of the SQL query. - */ - $content = preg_replace( '`' . preg_quote( $match, '`' ) . '`', '', $content, 1 ); - } - } - } - unset( $matches, $index, $match, $data ); - } - - if ( strpos( $content, '%' ) === false ) { - continue; - } - - /* - * Analyze the query for unsupported placeholders. - */ - if ( preg_match_all( self::UNSUPPORTED_PLACEHOLDER_REGEX, $content, $matches ) > 0 ) { - if ( ! empty( $matches[0] ) ) { - foreach ( $matches[0] as $match ) { - if ( '%' === $match ) { - $this->phpcsFile->addError( - 'Found unescaped literal "%%" character.', - $i, - 'UnescapedLiteral', - array( $match ) - ); - } else { - $this->phpcsFile->addError( - 'Unsupported placeholder used in $wpdb->prepare(). Found: "%s".', - $i, - 'UnsupportedPlaceholder', - array( $match ) - ); - } - } - } - unset( $match, $matches ); - } - - if ( $this->wp_version_compare( $this->minimum_wp_version, '6.2', '<' ) ) { - if ( preg_match_all( '`' . self::PREPARE_PLACEHOLDER_REGEX . '`x', $content, $matches ) > 0 ) { - if ( ! empty( $matches[0] ) ) { - foreach ( $matches[0] as $match ) { - if ( 'i' === substr( $match, -1 ) ) { - $this->phpcsFile->addError( - 'The %%i modifier is only supported in WP 6.2 or higher. Found: "%s".', - $i, - 'UnsupportedIdentifierPlaceholder', - array( $match ) - ); - } - } - } - } - unset( $match, $matches ); - } - - /* - * Analyze the query for single/double quoted simple value placeholders - * Identifiers are checked separately. - */ - $regex = '`(' . $regex_quote . ')%[dfFs]\1`'; - if ( preg_match_all( $regex, $content, $matches ) > 0 ) { - if ( ! empty( $matches[0] ) ) { - foreach ( $matches[0] as $match ) { - $this->phpcsFile->addError( - 'Simple placeholders should not be quoted in the query string in $wpdb->prepare(). Found: %s.', - $i, - 'QuotedSimplePlaceholder', - array( $match ) - ); - } - } - unset( $match, $matches ); - } - - /* - * Analyze the query for quoted identifier placeholders. - */ - $regex = '/(' . $regex_quote . '|`)(?' . self::PREPARE_PLACEHOLDER_REGEX . ')\1/x'; - if ( preg_match_all( $regex, $content, $matches ) > 0 ) { - if ( ! empty( $matches ) ) { - foreach ( $matches['placeholder'] as $index => $match ) { - if ( 'i' === substr( $match, -1 ) ) { - $this->phpcsFile->addError( - 'Placeholders used for identifiers (%%i) in the query string in $wpdb->prepare() are always quoted automagically. Please remove the surrounding quotes. Found: %s', - $i, - 'QuotedIdentifierPlaceholder', - array( $matches[0][ $index ] ) - ); - } - } - } - unset( $index, $match, $matches ); - } - - /* - * Analyze the query for unquoted complex placeholders. - */ - $regex = '`(? 0 ) { - if ( ! empty( $matches[0] ) ) { - foreach ( $matches[0] as $match ) { - if ( substr( $match, -1 ) !== 'i' && preg_match( '`^%[dfFsi]$`', $match ) !== 1 ) { // Identifiers must always be unquoted. - $this->phpcsFile->addWarning( - 'Complex placeholders used for values in the query string in $wpdb->prepare() will NOT be quoted automagically. Found: %s.', - $i, - 'UnquotedComplexPlaceholder', - array( $match ) - ); - } - } - } - unset( $match, $matches ); - } - - /* - * Check for an ` IN (%s)` clause. - */ - $found_in = preg_match_all( '`\s+IN\s*\(\s*%s\s*\)`i', $content, $matches ); - if ( $found_in > 0 ) { - $valid_in_clauses['uses_in'] += $found_in; - } - unset( $found_in ); - } - - if ( false === $text_string_tokens_found ) { - // Query string passed in as a variable or function call, nothing to examine. - return; - } - - if ( 0 === $total_placeholders ) { - if ( 1 === $total_parameters ) { - if ( false === $variable_found && false === $sql_wildcard_found ) { - /* - * Only throw this warning if the PreparedSQL sniff won't throw one about - * variables being found. - * Also don't throw it if we just advised to use a replacement variable to pass a - * string containing an SQL wildcard. - */ - $this->phpcsFile->addWarning( - 'It is not necessary to prepare a query which doesn\'t use variable replacement.', - $i, - 'UnnecessaryPrepare' - ); - } - } elseif ( 0 === $valid_in_clauses['uses_in'] ) { - $this->phpcsFile->addWarning( - 'Replacement variables found, but no valid placeholders found in the query.', - $i, - 'UnfinishedPrepare' - ); - } - - return; - } - - if ( 1 === $total_parameters ) { - $this->phpcsFile->addError( - 'Placeholders found in the query passed to $wpdb->prepare(), but no replacements found. Expected %d replacement(s) parameters.', - $stackPtr, - 'MissingReplacements', - array( $total_placeholders ) - ); - return; - } - - $replacements = $parameters; - unset( $replacements['query'], $replacements[1] ); // Remove the query param, whether passed positionally or named. - - // The parameters may have been passed as an array in the variadic $args parameter. - $args_param = PassedParameters::getParameterFromStack( $parameters, 2, 'args' ); - if ( false !== $args_param && 2 === $total_parameters ) { - $next = $this->phpcsFile->findNext( - Tokens::$emptyTokens, - $args_param['start'], - ( $args_param['end'] + 1 ), - true - ); - - if ( false !== $next - && ( \T_ARRAY === $this->tokens[ $next ]['code'] - || ( isset( Collections::shortArrayListOpenTokensBC()[ $this->tokens[ $next ]['code'] ] ) - && Arrays::isShortArray( $this->phpcsFile, $next ) === true ) ) - ) { - $replacements = PassedParameters::getParameters( $this->phpcsFile, $next ); - } - } - - $total_replacements = \count( $replacements ); - $total_placeholders -= $valid_in_clauses['adjustment_count']; - - // Bow out when `IN` clauses have been used which appear to be correct. - if ( $valid_in_clauses['uses_in'] > 0 - && $valid_in_clauses['uses_in'] === $valid_in_clauses['implode_fill'] - && 1 === $total_replacements - ) { - return; - } - - /* - * Verify that the correct amount of replacements have been passed. - */ - if ( $total_replacements !== $total_placeholders ) { - $this->phpcsFile->addWarning( - 'Incorrect number of replacements passed to $wpdb->prepare(). Found %d replacement parameters, expected %d.', - $stackPtr, - 'ReplacementsWrongNumber', - array( $total_replacements, $total_placeholders ) - ); - } - } - - /** - * Retrieve a regex snippet to recognize and remember quotes based on the quote style - * used in the original string (if any). - * - * This allows for recognizing `"` and `\'` in single quoted strings, - * recognizing `'` and `\"` in double quotes strings and `'` and `"`when the quote - * style is unknown or it is a non-quoted string (heredoc/nowdoc and such). - * - * @since 0.14.0 - * - * @param string $stripped_content Text string content without surrounding quotes. - * @param string $original_content Original content for the same text string. - * - * @return string - */ - protected function get_regex_quote_snippet( $stripped_content, $original_content ) { - $regex_quote = $this->regex_quote; - - if ( $original_content !== $stripped_content ) { - $quote_style = $original_content[0]; - - if ( '"' === $quote_style ) { - $regex_quote = '\\\\"|\''; - } elseif ( "'" === $quote_style ) { - $regex_quote = '"|\\\\\''; - } - } - - return $regex_quote; - } - - /** - * Analyze a sprintf() query wrapper to see if it contains a specific code pattern - * to deal correctly with `IN` queries. - * - * The pattern we are searching for is: - * `sprintf( 'query ....', implode( ',', array_fill( 0, count( $something ), '%s' ) ) )` - * - * @since 0.14.0 - * - * @param array $sprintf_params Parameters details for the sprintf call. - * - * @return int The number of times the pattern was found in the replacements. - */ - protected function analyse_sprintf( $sprintf_params ) { - $found = 0; - - unset( $sprintf_params[1] ); // Remove the positionally passed $format param. - - foreach ( $sprintf_params as $sprintf_param ) { - $implode = $this->phpcsFile->findNext( - Tokens::$emptyTokens + array( \T_NS_SEPARATOR => \T_NS_SEPARATOR ), - $sprintf_param['start'], - $sprintf_param['end'], - true - ); - if ( \T_STRING === $this->tokens[ $implode ]['code'] - && 'implode' === strtolower( $this->tokens[ $implode ]['content'] ) - ) { - if ( $this->analyse_implode( $implode ) === true ) { - ++$found; - } - } - } - - return $found; - } - - /** - * Analyze an implode() function call to see if it contains a specific code pattern - * to dynamically create placeholders. - * - * The pattern we are searching for is: - * `implode( ',', array_fill( 0, count( $something ), '%s' ) )` - * - * This pattern presumes unquoted placeholders! - * - * Identifiers (%i) are not supported, as this function is designed to work - * with `IN()`, which contains a list of values. In the future, it should - * be possible to simplify code using the implode/array_fill pattern to - * use a variable number of identifiers, e.g. `CONCAT(%...i)`, - * https://core.trac.wordpress.org/ticket/54042 - * - * @since 0.14.0 - * - * @param int $implode_token The stackPtr to the implode function call. - * - * @return bool True if the pattern is found, false otherwise. - */ - protected function analyse_implode( $implode_token ) { - $implode_params = PassedParameters::getParameters( $this->phpcsFile, $implode_token ); - if ( empty( $implode_params ) || \count( $implode_params ) !== 2 ) { - return false; - } - - $implode_separator_param = PassedParameters::getParameterFromStack( $implode_params, 1, 'separator' ); - if ( false === $implode_separator_param - || preg_match( '`^(["\']), ?\1$`', $implode_separator_param['clean'] ) !== 1 - ) { - return false; - } - - $implode_array_param = PassedParameters::getParameterFromStack( $implode_params, 2, 'array' ); - if ( false === $implode_array_param ) { - return false; - } - - $array_fill = $this->phpcsFile->findNext( - Tokens::$emptyTokens + array( \T_NS_SEPARATOR => \T_NS_SEPARATOR ), - $implode_array_param['start'], - $implode_array_param['end'], - true - ); - - if ( \T_STRING !== $this->tokens[ $array_fill ]['code'] - || 'array_fill' !== strtolower( $this->tokens[ $array_fill ]['content'] ) - ) { - return false; - } - - $array_fill_value_param = PassedParameters::getParameter( $this->phpcsFile, $array_fill, 3, 'value' ); - if ( false === $array_fill_value_param ) { - return false; - } - - if ( "'%i'" === $array_fill_value_param['clean'] - || '"%i"' === $array_fill_value_param['clean'] - ) { - $firstNonEmpty = $this->phpcsFile->findNext( Tokens::$emptyTokens, $array_fill_value_param['start'], $array_fill_value_param['end'], true ); - - $this->phpcsFile->addError( - 'The %i placeholder cannot be used within SQL `IN()` clauses.', - $firstNonEmpty, - 'IdentifierWithinIN' - ); - return false; - } - - return (bool) preg_match( '`^(["\'])%[dfFs]\1$`', $array_fill_value_param['clean'] ); - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/DB/PreparedSQLSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/DB/PreparedSQLSniff.php deleted file mode 100644 index 05f0efc..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/DB/PreparedSQLSniff.php +++ /dev/null @@ -1,243 +0,0 @@ - - */ - protected $methods = array( - 'get_var' => true, - 'get_col' => true, - 'get_row' => true, - 'get_results' => true, - 'prepare' => true, - 'query' => true, - ); - - /** - * Functions that escape values for use in SQL queries. - * - * @since 0.9.0 - * @since 0.11.0 Changed from public static to protected non-static. - * @since 3.0.0 - Moved from the Sniff class to this class. - * - The property visibility has changed from `protected` to `private`. - * - * @var array - */ - private $SQLEscapingFunctions = array( - 'absint' => true, - 'esc_sql' => true, - 'floatval' => true, - 'intval' => true, - 'like_escape' => true, - ); - - /** - * Functions whose output is automatically escaped for use in SQL queries. - * - * @since 0.9.0 - * @since 0.11.0 Changed from public static to protected non-static. - * @since 3.0.0 - Moved from the Sniff class to this class. - * - The property visibility has changed from `protected` to `private`. - * - * @var array - */ - private $SQLAutoEscapedFunctions = array( - 'count' => true, - ); - - /** - * Tokens that we don't flag when they are found in a $wpdb method call. - * - * This token array is augmented from within the register() method. - * - * @since 0.9.0 - * @since 3.0.0 The property visibility has changed from `protected` to `private`. - * - * @var array - */ - private $ignored_tokens = array( - \T_STRING_CONCAT => true, - \T_CONSTANT_ENCAPSED_STRING => true, - \T_COMMA => true, - \T_LNUMBER => true, - \T_DNUMBER => true, - \T_NS_SEPARATOR => true, - ); - - /** - * A loop pointer. - * - * It is a property so that we can access it in all of our methods. - * - * @since 0.9.0 - * - * @var int - */ - protected $i; - - /** - * The loop end marker. - * - * It is a property so that we can access it in all of our methods. - * - * @since 0.9.0 - * - * @var int - */ - protected $end; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 0.8.0 - * - * @return array - */ - public function register() { - // Enrich the array of tokens which can be safely ignored. - $this->ignored_tokens += Tokens::$bracketTokens; - $this->ignored_tokens += Tokens::$heredocTokens; - $this->ignored_tokens += Tokens::$castTokens; - $this->ignored_tokens += Tokens::$arithmeticTokens; - $this->ignored_tokens += Collections::incrementDecrementOperators(); - $this->ignored_tokens += Collections::objectOperators(); - $this->ignored_tokens += Tokens::$emptyTokens; - - // The contents of heredoc tokens needs to be examined. - unset( $this->ignored_tokens[ \T_HEREDOC ] ); - - return array( - \T_VARIABLE, - \T_STRING, - ); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 0.8.0 - * - * @param int $stackPtr The position of the current token in the stack. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function process_token( $stackPtr ) { - - if ( ! $this->is_wpdb_method_call( $this->phpcsFile, $stackPtr, $this->methods ) ) { - return; - } - - for ( $this->i; $this->i < $this->end; $this->i++ ) { - - if ( isset( $this->ignored_tokens[ $this->tokens[ $this->i ]['code'] ] ) ) { - continue; - } - - if ( \T_DOUBLE_QUOTED_STRING === $this->tokens[ $this->i ]['code'] - || \T_HEREDOC === $this->tokens[ $this->i ]['code'] - ) { - - $bad_variables = array_filter( - TextStrings::getEmbeds( $this->tokens[ $this->i ]['content'] ), - static function ( $symbol ) { - return preg_match( '`^\{?\$\{?wpdb\??->`', $symbol ) !== 1; - } - ); - - foreach ( $bad_variables as $bad_variable ) { - $this->phpcsFile->addError( - 'Use placeholders and $wpdb->prepare(); found interpolated variable %s at %s', - $this->i, - 'InterpolatedNotPrepared', - array( - $bad_variable, - $this->tokens[ $this->i ]['content'], - ) - ); - } - continue; - } - - if ( \T_VARIABLE === $this->tokens[ $this->i ]['code'] ) { - if ( '$wpdb' === $this->tokens[ $this->i ]['content'] ) { - $this->is_wpdb_method_call( $this->phpcsFile, $this->i, $this->methods ); - continue; - } - - if ( ContextHelper::is_safe_casted( $this->phpcsFile, $this->i ) ) { - continue; - } - } - - if ( \T_STRING === $this->tokens[ $this->i ]['code'] ) { - $content_lowercase = strtolower( $this->tokens[ $this->i ]['content'] ); - - if ( - isset( $this->SQLEscapingFunctions[ $content_lowercase ] ) - || isset( $this->SQLAutoEscapedFunctions[ $content_lowercase ] ) - ) { - - // Find the opening parenthesis. - $opening_paren = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $this->i + 1 ), null, true ); - - if ( false !== $opening_paren - && \T_OPEN_PARENTHESIS === $this->tokens[ $opening_paren ]['code'] - && isset( $this->tokens[ $opening_paren ]['parenthesis_closer'] ) - ) { - // Skip past to the end of the function call. - $this->i = $this->tokens[ $opening_paren ]['parenthesis_closer']; - continue; - } - } elseif ( FormattingFunctionsHelper::is_formatting_function( $this->tokens[ $this->i ]['content'] ) ) { - continue; - } - } - - $this->phpcsFile->addError( - 'Use placeholders and $wpdb->prepare(); found %s', - $this->i, - 'NotPrepared', - array( $this->tokens[ $this->i ]['content'] ) - ); - } - - return $this->end; - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/DB/RestrictedClassesSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/DB/RestrictedClassesSniff.php deleted file mode 100644 index 4262889..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/DB/RestrictedClassesSniff.php +++ /dev/null @@ -1,57 +0,0 @@ - array( - * 'lambda' => array( - * 'type' => 'error' | 'warning', - * 'message' => 'Avoid direct calls to the database.', - * 'classes' => array( 'PDO', '\Namespace\Classname' ), - * ) - * ) - * - * @return array - */ - public function getGroups() { - return array( - - 'mysql' => array( - 'type' => 'error', - 'message' => 'Accessing the database directly should be avoided. Please use the $wpdb object and associated functions instead. Found: %s.', - 'classes' => array( - 'mysqli', - 'PDO', - 'PDOStatement', - ), - ), - - ); - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/DB/RestrictedFunctionsSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/DB/RestrictedFunctionsSniff.php deleted file mode 100644 index 7d23ada..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/DB/RestrictedFunctionsSniff.php +++ /dev/null @@ -1,63 +0,0 @@ - array( - * 'lambda' => array( - * 'type' => 'error' | 'warning', - * 'message' => 'Use anonymous functions instead please!', - * 'functions' => array( 'file_get_contents', 'create_function' ), - * ) - * ) - * - * @return array - */ - public function getGroups() { - return array( - - 'mysql' => array( - 'type' => 'error', - 'message' => 'Accessing the database directly should be avoided. Please use the $wpdb object and associated functions instead. Found: %s.', - 'functions' => array( - 'mysql_*', - 'mysqli_*', - 'mysqlnd_ms_*', - 'mysqlnd_qc_*', - 'mysqlnd_uh_*', - 'mysqlnd_memcache_*', - 'maxdb_*', - ), - 'allow' => array( - 'mysql_to_rfc3339' => true, - ), - ), - ); - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/DB/SlowDBQuerySniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/DB/SlowDBQuerySniff.php deleted file mode 100644 index 061a3e7..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/DB/SlowDBQuerySniff.php +++ /dev/null @@ -1,58 +0,0 @@ - array( - 'type' => 'warning', - 'message' => 'Detected usage of %s, possible slow query.', - 'keys' => array( - 'tax_query', - 'meta_query', - 'meta_key', - 'meta_value', - ), - ), - ); - } - - /** - * Callback to process each confirmed key, to check value. - * - * @param string $key Array index / key. - * @param mixed $val Assigned value. - * @param int $line Token line. - * @param array $group Group definition. - * - * @return bool Always returns TRUE as the value is irrelevant. - */ - public function callback( $key, $val, $line, $group ) { - return true; - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/DateTime/CurrentTimeTimestampSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/DateTime/CurrentTimeTimestampSniff.php deleted file mode 100644 index 34bfe51..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/DateTime/CurrentTimeTimestampSniff.php +++ /dev/null @@ -1,168 +0,0 @@ - Key is function name, value irrelevant. - */ - protected $target_functions = array( - 'current_time' => true, - ); - - /** - * Process the parameters of a matched function. - * - * @since 2.2.0 - * - * @param int $stackPtr The position of the current token in the stack. - * @param string $group_name The name of the group which was matched. - * @param string $matched_content The token content (function name) which was matched - * in lowercase. - * @param array $parameters Array with information about the parameters. - * - * @return void - */ - public function process_parameters( $stackPtr, $group_name, $matched_content, $parameters ) { - /* - * We already know there will be valid open & close parentheses as otherwise the parameter - * retrieval function call would have returned an empty array, so no additional checks needed. - */ - $open_parens = $this->phpcsFile->findNext( \T_OPEN_PARENTHESIS, $stackPtr ); - $close_parens = $this->tokens[ $open_parens ]['parenthesis_closer']; - - /* - * Check whether the first parameter is a timestamp format. - */ - $type_param = PassedParameters::getParameterFromStack( $parameters, 1, 'type' ); - if ( false === $type_param ) { - // Type parameter not found. Bow out. - return; - } - - $content_type = ''; - for ( $i = $type_param['start']; $i <= $type_param['end']; $i++ ) { - if ( isset( Tokens::$emptyTokens[ $this->tokens[ $i ]['code'] ] ) ) { - continue; - } - - if ( isset( Tokens::$textStringTokens[ $this->tokens[ $i ]['code'] ] ) ) { - $content_type = trim( TextStrings::stripQuotes( $this->tokens[ $i ]['content'] ) ); - if ( 'U' !== $content_type && 'timestamp' !== $content_type ) { - // Most likely valid use of current_time(). - return; - } - - continue; - } - - if ( isset( Tokens::$heredocTokens[ $this->tokens[ $i ]['code'] ] ) ) { - continue; - } - - /* - * If we're still here, we've encountered an unexpected token, like a variable or - * function call. Bow out as we can't determine the runtime value. - */ - return; - } - - $gmt_true = false; - - /* - * Check whether the second parameter, $gmt, is a set to `true` or `1`. - */ - $gmt_param = PassedParameters::getParameterFromStack( $parameters, 2, 'gmt' ); - if ( is_array( $gmt_param ) ) { - $content_gmt = ''; - if ( 'true' === $gmt_param['clean'] || '1' === $gmt_param['clean'] ) { - $content_gmt = $gmt_param['clean']; - $gmt_true = true; - } - } - - /* - * Non-UTC timestamp requested. - */ - if ( false === $gmt_true ) { - $this->phpcsFile->addWarning( - 'Calling current_time() with a $type of "timestamp" or "U" is strongly discouraged as it will not return a Unix (UTC) timestamp. Please consider using a non-timestamp format or otherwise refactoring this code.', - $stackPtr, - 'Requested' - ); - - return; - } - - /* - * UTC timestamp requested. Should use time() instead. - */ - $has_comment = $this->phpcsFile->findNext( Tokens::$commentTokens, ( $stackPtr + 1 ), ( $close_parens + 1 ) ); - $error = 'Don\'t use current_time() for retrieving a Unix (UTC) timestamp. Use time() instead. Found: %s'; - $error_code = 'RequestedUTC'; - - $code_snippet = "current_time( '" . $content_type . "'"; - if ( isset( $content_gmt ) ) { - $code_snippet .= ', ' . $content_gmt; - } - $code_snippet .= ' )'; - - if ( false !== $has_comment ) { - // If there are comments, we don't auto-fix as it would remove those comments. - $this->phpcsFile->addError( $error, $stackPtr, $error_code, array( $code_snippet ) ); - return; - } - - $fix = $this->phpcsFile->addFixableError( $error, $stackPtr, $error_code, array( $code_snippet ) ); - if ( true === $fix ) { - $this->phpcsFile->fixer->beginChangeset(); - - for ( $i = ( $stackPtr + 1 ); $i < $close_parens; $i++ ) { - $this->phpcsFile->fixer->replaceToken( $i, '' ); - } - - $this->phpcsFile->fixer->replaceToken( $stackPtr, 'time(' ); - $this->phpcsFile->fixer->endChangeset(); - } - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/DateTime/RestrictedFunctionsSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/DateTime/RestrictedFunctionsSniff.php deleted file mode 100644 index 16c279b..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/DateTime/RestrictedFunctionsSniff.php +++ /dev/null @@ -1,59 +0,0 @@ - array( - 'type' => 'error', - 'message' => 'Using %s() and similar isn\'t allowed, instead use WP internal timezone support.', - 'functions' => array( - 'date_default_timezone_set', - ), - ), - - /* - * Use gmdate(), not date(). - * Don't rely on the current PHP time zone as it might have been changed by third party code. - * - * @link https://make.wordpress.org/core/2019/09/23/date-time-improvements-wp-5-3/ - * @link https://core.trac.wordpress.org/ticket/46438 - * @link https://github.com/WordPress/WordPress-Coding-Standards/issues/1713 - */ - 'date' => array( - 'type' => 'error', - 'message' => '%s() is affected by runtime timezone changes which can cause date/time to be incorrectly displayed. Use gmdate() instead.', - 'functions' => array( - 'date', - ), - ), - ); - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Files/FileNameSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Files/FileNameSniff.php deleted file mode 100644 index 2cdbd96..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Files/FileNameSniff.php +++ /dev/null @@ -1,312 +0,0 @@ - true, - 'class.wp-scripts.php' => true, - 'class.wp-styles.php' => true, - 'functions.wp-scripts.php' => true, - 'functions.wp-styles.php' => true, - ); - - /** - * Unit test version of the historical exceptions in WP core. - * - * @since 0.11.0 - * @since 3.0.0 Property has been renamed from `$unittest_class_exceptions` to `$unittest_hyphenation_exceptions`, - * - * @var array - */ - private $unittest_hyphenation_exceptions = array( - 'class.wp-dependencies.inc' => true, - 'class.wp-scripts.inc' => true, - 'class.wp-styles.inc' => true, - 'functions.wp-scripts.inc' => true, - 'functions.wp-styles.inc' => true, - ); - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() { - if ( \defined( '\PHP_CODESNIFFER_IN_TESTS' ) ) { - $this->hyphenation_exceptions += $this->unittest_hyphenation_exceptions; - } - - return Collections::phpOpenTags(); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param int $stackPtr The position of the current token in the stack. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function process_token( $stackPtr ) { - $file = FilePath::getName( $this->phpcsFile ); - if ( 'STDIN' === $file ) { - return $this->phpcsFile->numTokens; - } - - $class_ptr = $this->phpcsFile->findNext( \T_CLASS, $stackPtr ); - if ( false !== $class_ptr && $this->is_test_class( $this->phpcsFile, $class_ptr ) ) { - /* - * This rule should not be applied to test classes (at all). - * @link https://github.com/WordPress/WordPress-Coding-Standards/issues/1995 - */ - return $this->phpcsFile->numTokens; - } - - // Respect phpcs:disable comments as long as they are not accompanied by an enable. - $i = -1; - while ( $i = $this->phpcsFile->findNext( \T_PHPCS_DISABLE, ( $i + 1 ) ) ) { - if ( empty( $this->tokens[ $i ]['sniffCodes'] ) - || isset( $this->tokens[ $i ]['sniffCodes']['WordPress'] ) - || isset( $this->tokens[ $i ]['sniffCodes']['WordPress.Files'] ) - || isset( $this->tokens[ $i ]['sniffCodes']['WordPress.Files.FileName'] ) - ) { - do { - $i = $this->phpcsFile->findNext( \T_PHPCS_ENABLE, ( $i + 1 ) ); - } while ( false !== $i - && ! empty( $this->tokens[ $i ]['sniffCodes'] ) - && ! isset( $this->tokens[ $i ]['sniffCodes']['WordPress'] ) - && ! isset( $this->tokens[ $i ]['sniffCodes']['WordPress.Files'] ) - && ! isset( $this->tokens[ $i ]['sniffCodes']['WordPress.Files.FileName'] ) ); - - if ( false === $i ) { - // The entire (rest of the) file is disabled. - return $this->phpcsFile->numTokens; - } - } - } - - $file_name = basename( $file ); - - $this->check_filename_is_hyphenated( $file_name ); - - if ( true === $this->strict_class_file_names && false !== $class_ptr ) { - $this->check_filename_has_class_prefix( $class_ptr, $file_name ); - } - - if ( false !== strpos( $file, '/wp-includes/' ) - && false === $class_ptr - ) { - $this->check_filename_for_template_suffix( $stackPtr, $file_name ); - } - - // Only run this sniff once per file, no need to run it again. - return $this->phpcsFile->numTokens; - } - - /** - * Generic check for lowercase hyphenated file names. - * - * @since 3.0.0 - * - * @param string $file_name The name of the current file. - * - * @return void - */ - protected function check_filename_is_hyphenated( $file_name ) { - $extension = strrchr( $file_name, '.' ); - $name = substr( $file_name, 0, ( strlen( $file_name ) - strlen( $extension ) ) ); - - $expected = strtolower( preg_replace( '`[[:punct:]]`', '-', $name ) ) . $extension; - if ( $file_name === $expected - || isset( $this->hyphenation_exceptions[ $file_name ] ) - ) { - return; - } - - if ( true === $this->is_theme && 1 === preg_match( self::THEME_EXCEPTIONS_REGEX, $file_name ) ) { - return; - } - - $this->phpcsFile->addError( - 'Filenames should be all lowercase with hyphens as word separators. Expected %s, but found %s.', - 0, - 'NotHyphenatedLowercase', - array( $expected, $file_name ) - ); - } - - - /** - * Check files containing a class for the "class-" prefix and that the rest of - * the file name reflects the class name. - * - * @since 3.0.0 - * - * @param int $class_ptr Stack pointer to the first T_CLASS in the file. - * @param string $file_name The name of the current file. - * - * @return void - */ - protected function check_filename_has_class_prefix( $class_ptr, $file_name ) { - $extension = strrchr( $file_name, '.' ); - $class_name = ObjectDeclarations::getName( $this->phpcsFile, $class_ptr ); - $expected = 'class-' . strtolower( str_replace( '_', '-', $class_name ) ) . $extension; - - if ( $file_name === $expected ) { - return; - } - - $this->phpcsFile->addError( - 'Class file names should be based on the class name with "class-" prepended. Expected %s, but found %s.', - 0, - 'InvalidClassFileName', - array( - $expected, - $file_name, - ) - ); - } - - /** - * Check non-class files in "wp-includes" with a "@subpackage Template" tag for a "-template" suffix. - * - * @since 3.0.0 - * - * @param int $stackPtr Stack pointer to the first PHP open tag in the file. - * @param string $file_name The name of the current file. - * - * @return void - */ - protected function check_filename_for_template_suffix( $stackPtr, $file_name ) { - $subpackage_tag = $this->phpcsFile->findNext( \T_DOC_COMMENT_TAG, $stackPtr, null, false, '@subpackage' ); - if ( false === $subpackage_tag ) { - return; - } - - $subpackage = $this->phpcsFile->findNext( \T_DOC_COMMENT_STRING, $subpackage_tag ); - if ( false === $subpackage ) { - return; - } - - $fileName_end = substr( $file_name, -13 ); - - if ( ( 'Template' === trim( $this->tokens[ $subpackage ]['content'] ) - && $this->tokens[ $subpackage_tag ]['line'] === $this->tokens[ $subpackage ]['line'] ) - && ( ( ! \defined( '\PHP_CODESNIFFER_IN_TESTS' ) && '-template.php' !== $fileName_end ) - || ( \defined( '\PHP_CODESNIFFER_IN_TESTS' ) && '-template.inc' !== $fileName_end ) ) - ) { - $this->phpcsFile->addError( - 'Files containing template tags should have "-template" appended to the end of the file name. Expected %s, but found %s.', - 0, - 'InvalidTemplateTagFileName', - array( - substr( $file_name, 0, -4 ) . '-template.php', - $file_name, - ) - ); - } - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/NamingConventions/PrefixAllGlobalsSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/NamingConventions/PrefixAllGlobalsSniff.php deleted file mode 100644 index fb5b1bd..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/NamingConventions/PrefixAllGlobalsSniff.php +++ /dev/null @@ -1,1312 +0,0 @@ - Key is prefix, value irrelevant. - */ - protected $prefix_blocklist = array( - 'wordpress' => true, - 'wp' => true, - '_' => true, - 'php' => true, // See #1728, the 'php' prefix is reserved by PHP itself. - ); - - /** - * Target prefixes after validation. - * - * All prefixes are lowercased for case-insensitive compare. - * - * @since 0.12.0 - * - * @var array - */ - private $validated_prefixes = array(); - - /** - * Target namespace prefixes after validation with regex indicator. - * - * All prefixes are lowercased for case-insensitive compare. - * If the prefix doesn't already contain a namespace separator, but does contain - * non-word characters, these will have been replaced with regex syntax to allow - * for namespace separators and the `is_regex` indicator will have been set to `true`. - * - * @since 1.2.0 - * - * @var array> - */ - private $validated_namespace_prefixes = array(); - - /** - * Cache of previously set prefixes. - * - * Prevents having to do the same prefix validation over and over again. - * - * @since 0.12.0 - * - * @var string[] - */ - private $previous_prefixes = array(); - - /** - * A list of core hooks that are allowed to be called by plugins and themes. - * - * @since 0.14.0 - * @since 3.0.0 Renamed from `$whitelisted_core_hooks` to `$allowed_core_hooks`. - * - * @var array Key is hook name, value irrelevant. - */ - protected $allowed_core_hooks = array( - 'widget_title' => true, - 'add_meta_boxes' => true, - ); - - /** - * A list of core constants that are allowed to be defined by plugins and themes. - * - * Source: {@link https://core.trac.wordpress.org/browser/trunk/src/wp-includes/default-constants.php#L0} - * The constants are listed in alphabetic order. - * Only overrulable constants are listed, i.e. those defined within core within - * a `if ( ! defined() ) {}` wrapper. - * - * {@internal To be updated after every major release. Last updated for WordPress 6.9.0-RC2.} - * - * @since 1.0.0 - * @since 3.0.0 Renamed from `$whitelisted_core_constants` to `$allowed_core_constants`. - * - * @var array Key is constant name, value irrelevant. - */ - protected $allowed_core_constants = array( - 'ADMIN_COOKIE_PATH' => true, - 'AUTH_COOKIE' => true, - 'AUTOSAVE_INTERVAL' => true, - 'COOKIEHASH' => true, - 'COOKIEPATH' => true, - 'COOKIE_DOMAIN' => true, - 'EMPTY_TRASH_DAYS' => true, - 'FORCE_SSL_ADMIN' => true, - 'FORCE_SSL_LOGIN' => true, // Deprecated. - 'LOGGED_IN_COOKIE' => true, - 'MEDIA_TRASH' => true, - 'MUPLUGINDIR' => true, // Deprecated. - 'PASS_COOKIE' => true, - 'PLUGINDIR' => true, // Deprecated. - 'PLUGINS_COOKIE_PATH' => true, - 'RECOVERY_MODE_COOKIE' => true, - 'SCRIPT_DEBUG' => true, - 'SECURE_AUTH_COOKIE' => true, - 'SHORTINIT' => true, - 'SITECOOKIEPATH' => true, - 'TEST_COOKIE' => true, - 'USER_COOKIE' => true, - 'WPMU_PLUGIN_DIR' => true, - 'WPMU_PLUGIN_URL' => true, - 'WP_CACHE' => true, - 'WP_CONTENT_DIR' => true, - 'WP_CONTENT_URL' => true, - 'WP_CRON_LOCK_TIMEOUT' => true, - 'WP_DEBUG' => true, - 'WP_DEBUG_DISPLAY' => true, - 'WP_DEBUG_LOG' => true, - 'WP_DEFAULT_THEME' => true, - 'WP_DEVELOPMENT_MODE' => true, - 'WP_MAX_MEMORY_LIMIT' => true, - 'WP_MEMORY_LIMIT' => true, - 'WP_PLUGIN_DIR' => true, - 'WP_PLUGIN_URL' => true, - 'WP_POST_REVISIONS' => true, - 'WP_START_TIMESTAMP' => true, - ); - - /** - * A list of functions declared in WP core as "Pluggable", i.e. overloadable from a plugin. - * - * Note: deprecated functions should still be included in this list as plugins may support older WP versions. - * - * {@internal To be updated after every major release. Last updated for WordPress 6.9.0-RC2.} - * - * @since 3.0.0. - * - * @var array Key is function name, value irrelevant. - */ - protected $pluggable_functions = array( - 'auth_redirect' => true, - 'cache_users' => true, - 'check_admin_referer' => true, - 'check_ajax_referer' => true, - 'get_avatar' => true, - 'get_currentuserinfo' => true, // Deprecated. - 'get_user_by' => true, - 'get_user_by_email' => true, // Deprecated. - 'get_userdata' => true, - 'get_userdatabylogin' => true, // Deprecated. - 'graceful_fail' => true, - 'install_global_terms' => true, - 'install_network' => true, - 'is_user_logged_in' => true, - // 'lowercase_octets' => true, => unclear if this function is meant to be publicly pluggable. - 'maybe_add_column' => true, - 'maybe_create_table' => true, - 'set_current_user' => true, // Deprecated. - 'twenty_twenty_one_entry_meta_footer' => true, - 'twenty_twenty_one_post_thumbnail' => true, - 'twenty_twenty_one_post_title' => true, - 'twenty_twenty_one_posted_by' => true, - 'twenty_twenty_one_posted_on' => true, - 'twenty_twenty_one_setup' => true, - 'twenty_twenty_one_the_posts_navigation' => true, - 'twentyeleven_admin_header_image' => true, - 'twentyeleven_admin_header_style' => true, - 'twentyeleven_comment' => true, - 'twentyeleven_content_nav' => true, - 'twentyeleven_continue_reading_link' => true, - 'twentyeleven_header_image' => true, - 'twentyeleven_header_style' => true, - 'twentyeleven_posted_on' => true, - 'twentyeleven_setup' => true, - 'twentyfifteen_comment_nav' => true, - 'twentyfifteen_entry_meta' => true, - 'twentyfifteen_excerpt_more' => true, - 'twentyfifteen_fonts_url' => true, - 'twentyfifteen_get_color_scheme' => true, - 'twentyfifteen_get_color_scheme_choices' => true, - 'twentyfifteen_get_link_url' => true, - 'twentyfifteen_header_style' => true, - 'twentyfifteen_post_thumbnail' => true, - 'twentyfifteen_sanitize_color_scheme' => true, - 'twentyfifteen_setup' => true, - 'twentyfifteen_the_custom_logo' => true, - 'twentyfourteen_admin_header_image' => true, - 'twentyfourteen_admin_header_style' => true, - 'twentyfourteen_excerpt_more' => true, - 'twentyfourteen_font_url' => true, - 'twentyfourteen_header_image' => true, - 'twentyfourteen_header_style' => true, - 'twentyfourteen_list_authors' => true, - 'twentyfourteen_paging_nav' => true, - 'twentyfourteen_post_nav' => true, - 'twentyfourteen_post_thumbnail' => true, - 'twentyfourteen_posted_on' => true, - 'twentyfourteen_setup' => true, - 'twentyfourteen_the_attached_image' => true, - 'twentynineteen_comment_count' => true, - 'twentynineteen_comment_form' => true, - 'twentynineteen_discussion_avatars_list' => true, - 'twentynineteen_entry_footer' => true, - 'twentynineteen_get_user_avatar_markup' => true, - 'twentynineteen_post_thumbnail' => true, - 'twentynineteen_posted_by' => true, - 'twentynineteen_posted_on' => true, - 'twentynineteen_setup' => true, - 'twentynineteen_the_posts_navigation' => true, - 'twentyseventeen_edit_link' => true, - 'twentyseventeen_entry_footer' => true, - 'twentyseventeen_fonts_url' => true, - 'twentyseventeen_header_style' => true, - 'twentyseventeen_posted_on' => true, - 'twentyseventeen_time_link' => true, - 'twentysixteen_categorized_blog' => true, - 'twentysixteen_entry_date' => true, - 'twentysixteen_entry_meta' => true, - 'twentysixteen_entry_taxonomies' => true, - 'twentysixteen_excerpt' => true, - 'twentysixteen_excerpt_more' => true, - 'twentysixteen_fonts_url' => true, - 'twentysixteen_get_color_scheme' => true, - 'twentysixteen_get_color_scheme_choices' => true, - 'twentysixteen_header_style' => true, - 'twentysixteen_post_thumbnail' => true, - 'twentysixteen_sanitize_color_scheme' => true, - 'twentysixteen_setup' => true, - 'twentysixteen_the_custom_logo' => true, - 'twentyten_admin_header_style' => true, - 'twentyten_comment' => true, - 'twentyten_continue_reading_link' => true, - 'twentyten_header_image' => true, - 'twentyten_posted_in' => true, - 'twentyten_posted_on' => true, - 'twentyten_setup' => true, - 'twentythirteen_entry_date' => true, - 'twentythirteen_entry_meta' => true, - 'twentythirteen_excerpt_more' => true, - 'twentythirteen_fonts_url' => true, - 'twentythirteen_paging_nav' => true, - 'twentythirteen_post_nav' => true, - 'twentythirteen_the_attached_image' => true, - 'twentytwelve_comment' => true, - 'twentytwelve_content_nav' => true, - 'twentytwelve_entry_meta' => true, - 'twentytwelve_get_font_url' => true, - 'twentytwenty_customize_partial_blogdescription' => true, - 'twentytwenty_customize_partial_blogname' => true, - 'twentytwenty_customize_partial_site_logo' => true, - 'twentytwenty_generate_css' => true, - 'twentytwenty_get_customizer_css' => true, - 'twentytwenty_get_theme_svg' => true, - 'twentytwenty_the_theme_svg' => true, - 'twentytwentyfive_block_styles' => true, - 'twentytwentyfive_editor_style' => true, - 'twentytwentyfive_enqueue_styles' => true, - 'twentytwentyfive_format_binding' => true, - 'twentytwentyfive_pattern_categories' => true, - 'twentytwentyfive_post_format_setup' => true, - 'twentytwentyfive_register_block_bindings' => true, - 'twentytwentyfour_block_styles' => true, - 'twentytwentyfour_block_stylesheets' => true, - 'twentytwentyfour_pattern_categories' => true, - 'twentytwentytwo_styles' => true, - 'twentytwentytwo_support' => true, - 'wp_authenticate' => true, - 'wp_cache_add_multiple' => true, - 'wp_cache_delete_multiple' => true, - 'wp_cache_flush_group' => true, - 'wp_cache_flush_runtime' => true, - 'wp_cache_get_multiple' => true, - 'wp_cache_get_multiple_salted' => true, - 'wp_cache_get_salted' => true, - 'wp_cache_set_multiple' => true, - 'wp_cache_set_multiple_salted' => true, - 'wp_cache_set_salted' => true, - 'wp_cache_supports' => true, - 'wp_check_password' => true, - 'wp_clear_auth_cookie' => true, - 'wp_clearcookie' => true, // Deprecated. - 'wp_create_nonce' => true, - 'wp_generate_auth_cookie' => true, - 'wp_generate_password' => true, - 'wp_get_cookie_login' => true, // Deprecated. - 'wp_get_current_user' => true, - // 'wp_handle_upload_error' => true, => unclear if this function is meant to be publicly pluggable. - 'wp_hash' => true, - 'wp_hash_password' => true, - 'wp_install' => true, - 'wp_install_defaults' => true, - 'wp_login' => true, // Deprecated. - 'wp_logout' => true, - 'wp_mail' => true, - 'wp_new_blog_notification' => true, - 'wp_new_user_notification' => true, - 'wp_nonce_tick' => true, - 'wp_notify_moderator' => true, - 'wp_notify_postauthor' => true, - 'wp_parse_auth_cookie' => true, - 'wp_password_change_notification' => true, - 'wp_password_needs_rehash' => true, - 'wp_rand' => true, - 'wp_redirect' => true, - 'wp_safe_redirect' => true, - 'wp_salt' => true, - 'wp_sanitize_redirect' => true, - 'wp_set_auth_cookie' => true, - 'wp_set_current_user' => true, - 'wp_set_password' => true, - 'wp_setcookie' => true, // Deprecated. - 'wp_text_diff' => true, - 'wp_upgrade' => true, - 'wp_validate_auth_cookie' => true, - 'wp_validate_redirect' => true, - 'wp_verify_nonce' => true, - ); - - /** - * A list of classes declared in WP core as "Pluggable", i.e. overloadable from a plugin. - * - * Source: {@link https://core.trac.wordpress.org/browser/trunk/src/wp-includes/pluggable.php} - * and {@link https://core.trac.wordpress.org/browser/trunk/src/wp-includes/pluggable-deprecated.php} - * - * Note: deprecated classes should still be included in this list as plugins may support older WP versions. - * - * {@internal To be updated after every major release. Last updated for WordPress 6.9.0-RC2.} - * - * @since 3.0.0. - * - * @var array Key is class name, value irrelevant. - */ - protected $pluggable_classes = array( - 'TwentyTwenty_Customize' => true, - 'TwentyTwenty_Non_Latin_Languages' => true, - 'TwentyTwenty_SVG_Icons' => true, - 'TwentyTwenty_Script_Loader' => true, - 'TwentyTwenty_Separator_Control' => true, - 'TwentyTwenty_Walker_Comment' => true, - 'TwentyTwenty_Walker_Page' => true, - 'Twenty_Twenty_One_Customize' => true, - 'WP_Block_Cloner' => true, - 'WP_User_Search' => true, - 'wp_atom_server' => true, // Deprecated. - ); - - /** - * List of all PHP native functions. - * - * Using this list rather than a call to `function_exists()` prevents - * false negatives from user-defined functions when those would be - * autoloaded via a Composer autoload files directives. - * - * @var array - */ - private $built_in_functions; - - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 0.12.0 - * - * @return array - */ - public function register() { - // Get a list of all PHP native functions. - $all_functions = get_defined_functions(); - $this->built_in_functions = array_flip( $all_functions['internal'] ); - $this->built_in_functions = array_change_key_case( $this->built_in_functions, \CASE_LOWER ); - - // Make sure the pluggable functions and classes list can be easily compared. - $this->pluggable_functions = array_change_key_case( $this->pluggable_functions, \CASE_LOWER ); - $this->pluggable_classes = array_change_key_case( $this->pluggable_classes, \CASE_LOWER ); - - // Set the sniff targets. - $targets = array( - \T_NAMESPACE => \T_NAMESPACE, - \T_FUNCTION => \T_FUNCTION, - \T_CONST => \T_CONST, - \T_VARIABLE => \T_VARIABLE, - \T_DOLLAR => \T_DOLLAR, // Variable variables. - \T_FN_ARROW => \T_FN_ARROW, // T_FN_ARROW is only used for skipping over (for now). - ); - $targets += Tokens::$ooScopeTokens; // T_ANON_CLASS is only used for skipping over test classes. - $targets += Collections::listOpenTokensBC(); - - // Add function call target for hook names and constants defined using define(). - $parent = parent::register(); - if ( ! empty( $parent ) ) { - $targets[] = \T_STRING; - } - - return $targets; - } - - /** - * Groups of functions to restrict. - * - * @since 0.12.0 - * - * @return array - */ - public function getGroups() { - // Only retrieve functions which are not used for deprecated hooks. - $this->target_functions = WPHookHelper::get_functions( false ); - $this->target_functions['define'] = true; - - return parent::getGroups(); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 0.12.0 - * - * @param int $stackPtr The position of the current token in the stack. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function process_token( $stackPtr ) { - - // Allow overruling the prefixes set in a ruleset via the command line. - $cl_prefixes = Helper::getConfigData( 'prefixes' ); - if ( ! empty( $cl_prefixes ) ) { - $cl_prefixes = trim( $cl_prefixes ); - if ( '' !== $cl_prefixes ) { - $this->prefixes = array_filter( array_map( 'trim', explode( ',', $cl_prefixes ) ) ); - } - } - - $this->prefixes = RulesetPropertyHelper::merge_custom_array( $this->prefixes, array(), false ); - if ( empty( $this->prefixes ) ) { - // No prefixes passed, nothing to do. - return; - } - - $this->validate_prefixes(); - if ( empty( $this->validated_prefixes ) ) { - // No _valid_ prefixes passed, nothing to do. - return; - } - - // Ignore test classes. - if ( isset( Tokens::$ooScopeTokens[ $this->tokens[ $stackPtr ]['code'] ] ) - && true === $this->is_test_class( $this->phpcsFile, $stackPtr ) - ) { - if ( $this->tokens[ $stackPtr ]['scope_condition'] === $stackPtr && isset( $this->tokens[ $stackPtr ]['scope_closer'] ) ) { - // Skip forward to end of test class. - return $this->tokens[ $stackPtr ]['scope_closer']; - } - return; - } - - if ( \T_ANON_CLASS === $this->tokens[ $stackPtr ]['code'] ) { - // Token was only registered to allow skipping over test classes. - return; - } - - /* - * Ignore the contents of arrow functions which do not declare closures. - * - * - Parameters declared by arrow functions do not need to be prefixed (handled elsewhere). - * - New variables declared within an arrow function are local to the arrow function, so can be ignored. - * - A `global` statement is not allowed within an arrow function. - * - * Note: this does mean some convoluted code may get ignored (false negatives), but this is currently - * not reliably solvable as PHPCS does not add arrow functions to the 'conditions' array. - */ - if ( \T_FN_ARROW === $this->tokens[ $stackPtr ]['code'] - && isset( $this->tokens[ $stackPtr ]['scope_closer'] ) - ) { - $has_closure = $this->phpcsFile->findNext( \T_CLOSURE, ( $stackPtr + 1 ), $this->tokens[ $stackPtr ]['scope_closer'] ); - if ( false !== $has_closure ) { - // Skip to the start of the closure. - return $has_closure; - } - - // Skip the arrow function completely. - return $this->tokens[ $stackPtr ]['scope_closer']; - } - - if ( \T_STRING === $this->tokens[ $stackPtr ]['code'] ) { - // Disallow excluding function groups for this sniff. - $this->exclude = array(); - - return parent::process_token( $stackPtr ); - - } elseif ( \T_DOLLAR === $this->tokens[ $stackPtr ]['code'] ) { - - return $this->process_variable_variable( $stackPtr ); - - } elseif ( \T_VARIABLE === $this->tokens[ $stackPtr ]['code'] ) { - - return $this->process_variable_assignment( $stackPtr ); - - } elseif ( isset( Collections::listOpenTokensBC()[ $this->tokens[ $stackPtr ]['code'] ] ) ) { - return $this->process_list_assignment( $stackPtr ); - - } elseif ( \T_NAMESPACE === $this->tokens[ $stackPtr ]['code'] ) { - $namespace_name = Namespaces::getDeclaredName( $this->phpcsFile, $stackPtr ); - - if ( false === $namespace_name || '' === $namespace_name || '\\' === $namespace_name ) { - return; - } - - foreach ( $this->validated_namespace_prefixes as $key => $prefix_info ) { - if ( false === $prefix_info['is_regex'] ) { - if ( stripos( $namespace_name, $prefix_info['prefix'] ) === 0 ) { - $this->phpcsFile->recordMetric( $stackPtr, 'Prefix all globals: allowed prefixes', $key ); - return; - } - } else { - // Ok, so this prefix should be used as a regex. - $regex = '`^' . $prefix_info['prefix'] . '`i'; - if ( preg_match( $regex, $namespace_name ) > 0 ) { - $this->phpcsFile->recordMetric( $stackPtr, 'Prefix all globals: allowed prefixes', $key ); - return; - } - } - } - - // Still here ? In that case, we have a non-prefixed namespace name. - $recorded = $this->phpcsFile->addError( - self::ERROR_MSG, - $stackPtr, - 'NonPrefixedNamespaceFound', - array( - 'Namespaces declared', - $namespace_name, - ) - ); - - if ( true === $recorded ) { - $this->record_potential_prefix_metric( $stackPtr, $namespace_name ); - } - - return; - - } else { - - // Namespaced methods, classes and constants do not need to be prefixed. - $namespace = Namespaces::determineNamespace( $this->phpcsFile, $stackPtr ); - if ( '' !== $namespace && '\\' !== $namespace ) { - return; - } - - $item_name = ''; - $error_text = 'Unknown syntax used'; - $error_code = 'NonPrefixedSyntaxFound'; - - switch ( $this->tokens[ $stackPtr ]['code'] ) { - case \T_FUNCTION: - // Methods in a class do not need to be prefixed. - if ( Scopes::isOOMethod( $this->phpcsFile, $stackPtr ) === true ) { - return; - } - - if ( DeprecationHelper::is_function_deprecated( $this->phpcsFile, $stackPtr ) === true ) { - /* - * Deprecated functions don't have to comply with the naming conventions, - * otherwise functions deprecated in favor of a function with a compliant - * name would still trigger an error. - */ - return; - } - - $item_name = FunctionDeclarations::getName( $this->phpcsFile, $stackPtr ); - $item_lc = strtolower( $item_name ); - if ( isset( $this->built_in_functions[ $item_lc ] ) ) { - // Backfill for PHP native function. - return; - } - - if ( isset( $this->pluggable_functions[ $item_lc ] ) ) { - // Pluggable function should not be prefixed. - return; - } - - $error_text = 'Functions declared in the global namespace'; - $error_code = 'NonPrefixedFunctionFound'; - break; - - case \T_CLASS: - case \T_INTERFACE: - case \T_TRAIT: - case \T_ENUM: - $item_name = ObjectDeclarations::getName( $this->phpcsFile, $stackPtr ); - $error_text = 'Classes declared'; - $error_code = 'NonPrefixedClassFound'; - - switch ( $this->tokens[ $stackPtr ]['code'] ) { - case \T_CLASS: - if ( isset( $this->pluggable_classes[ strtolower( $item_name ) ] ) ) { - // Pluggable class should not be prefixed. - return; - } - - if ( class_exists( '\\' . $item_name, false ) ) { - // Backfill for PHP native class. - return; - } - break; - - case \T_INTERFACE: - if ( interface_exists( '\\' . $item_name, false ) ) { - // Backfill for PHP native interface. - return; - } - - $error_text = 'Interfaces declared'; - $error_code = 'NonPrefixedInterfaceFound'; - break; - - case \T_TRAIT: - // phpcs:ignore PHPCompatibility.FunctionUse.NewFunctions.trait_existsFound - if ( function_exists( '\trait_exists' ) && trait_exists( '\\' . $item_name, false ) ) { - // Backfill for PHP native trait. - return; - } - - $error_text = 'Traits declared'; - $error_code = 'NonPrefixedTraitFound'; - break; - - case \T_ENUM: - // phpcs:ignore PHPCompatibility.FunctionUse.NewFunctions.enum_existsFound - if ( function_exists( '\enum_exists' ) && enum_exists( '\\' . $item_name, false ) ) { - // Backfill for PHP native enum. - return; - } - - $error_text = 'Enums declared'; - $error_code = 'NonPrefixedEnumFound'; - break; - } - - break; - - case \T_CONST: - // Constants in an OO construct do not need to be prefixed. - if ( true === Scopes::isOOConstant( $this->phpcsFile, $stackPtr ) ) { - return; - } - - $constant_name_ptr = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $stackPtr + 1 ), null, true, null, true ); - if ( false === $constant_name_ptr ) { - // Live coding. - return; - } - - $item_name = $this->tokens[ $constant_name_ptr ]['content']; - if ( \defined( '\\' . $item_name ) ) { - // Backfill for PHP native constant. - return; - } - - if ( isset( $this->allowed_core_constants[ $item_name ] ) ) { - // Defining a WP Core constant intended for overruling. - return; - } - - $error_text = 'Global constants defined'; - $error_code = 'NonPrefixedConstantFound'; - break; - - default: - // Left empty on purpose. - break; - - } - - if ( empty( $item_name ) || $this->is_prefixed( $stackPtr, $item_name ) === true ) { - return; - } - - $recorded = $this->phpcsFile->addError( - self::ERROR_MSG, - $stackPtr, - $error_code, - array( - $error_text, - $item_name, - ) - ); - - if ( true === $recorded ) { - $this->record_potential_prefix_metric( $stackPtr, $item_name ); - } - } - } - - /** - * Handle variable variables defined in the global namespace. - * - * @since 0.12.0 - * - * @param int $stackPtr The position of the current token in the stack. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - protected function process_variable_variable( $stackPtr ) { - static $indicators = array( - \T_OPEN_CURLY_BRACKET => true, - \T_VARIABLE => true, - ); - - // Is this a variable variable ? - // Not concerned with nested ones as those will be recognized on their own token. - $next_non_empty = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $stackPtr + 1 ), null, true, null, true ); - if ( false === $next_non_empty || ! isset( $indicators[ $this->tokens[ $next_non_empty ]['code'] ] ) ) { - return; - } - - if ( \T_OPEN_CURLY_BRACKET === $this->tokens[ $next_non_empty ]['code'] - && isset( $this->tokens[ $next_non_empty ]['bracket_closer'] ) - ) { - // Skip over the variable part. - $next_non_empty = $this->tokens[ $next_non_empty ]['bracket_closer']; - } - - $maybe_assignment = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $next_non_empty + 1 ), null, true, null, true ); - - while ( false !== $maybe_assignment - && \T_OPEN_SQUARE_BRACKET === $this->tokens[ $maybe_assignment ]['code'] - && isset( $this->tokens[ $maybe_assignment ]['bracket_closer'] ) - ) { - $maybe_assignment = $this->phpcsFile->findNext( - Tokens::$emptyTokens, - ( $this->tokens[ $maybe_assignment ]['bracket_closer'] + 1 ), - null, - true, - null, - true - ); - } - - if ( false === $maybe_assignment ) { - return; - } - - if ( ! isset( Tokens::$assignmentTokens[ $this->tokens[ $maybe_assignment ]['code'] ] ) ) { - // Not an assignment. - return; - } - - $error = self::ERROR_MSG; - - /* - * Local variable variables in a function do not need to be prefixed. - * But a variable variable could evaluate to the name of an imported global - * variable. - * Not concerned with imported variable variables (global.. ) as that has been - * forbidden since PHP 7.0. Presuming cross-version code and if not, that - * is for the PHPCompatibility standard to detect. - */ - $functionPtr = Conditions::getLastCondition( $this->phpcsFile, $stackPtr, Collections::functionDeclarationTokens() ); - if ( false !== $functionPtr ) { - $has_global = $this->phpcsFile->findPrevious( \T_GLOBAL, ( $stackPtr - 1 ), $this->tokens[ $functionPtr ]['scope_opener'] ); - if ( false === $has_global ) { - // No variable import happening. - return; - } - - $error = 'Variable variable which could potentially override an imported global variable detected. ' . $error; - } - - $variable_name = $this->phpcsFile->getTokensAsString( $stackPtr, ( ( $next_non_empty - $stackPtr ) + 1 ) ); - - // Still here ? In that case, the variable name should be prefixed. - $recorded = $this->phpcsFile->addWarning( - $error, - $stackPtr, - 'NonPrefixedVariableFound', - array( - 'Global variables defined', - $variable_name, - ) - ); - - if ( true === $recorded ) { - $this->record_potential_prefix_metric( $stackPtr, $variable_name ); - } - - // Skip over the variable part of the variable. - return ( $next_non_empty + 1 ); - } - - /** - * Check that defined global variables are prefixed. - * - * @since 0.12.0 - * @since 2.2.0 Added $in_list parameter. - * - * @param int $stackPtr The position of the current token in the stack. - * @param bool $in_list Whether or not this is a variable in a list assignment. - * Defaults to false. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - protected function process_variable_assignment( $stackPtr, $in_list = false ) { - /* - * We're only concerned with variables which are being defined. - * `is_assignment()` will not recognize property assignments, which is good in this case. - * However it will also not recognize $b in `foreach( $a as $b )` as an assignment, so - * we need a separate check for that. - */ - if ( false === $in_list - && false === VariableHelper::is_assignment( $this->phpcsFile, $stackPtr ) - && Context::inForeachCondition( $this->phpcsFile, $stackPtr ) !== 'afterAs' - ) { - return; - } - - $is_error = true; - $variable_name = substr( $this->tokens[ $stackPtr ]['content'], 1 ); // Strip the dollar sign. - - // Bow out early if we know for certain no prefix is needed. - if ( 'GLOBALS' !== $variable_name - && $this->variable_prefixed_or_allowed( $stackPtr, $variable_name ) === true - ) { - return; - } - - if ( 'GLOBALS' === $variable_name ) { - $array_open = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $stackPtr + 1 ), null, true, null, true ); - if ( false === $array_open || \T_OPEN_SQUARE_BRACKET !== $this->tokens[ $array_open ]['code'] ) { - // Live coding or something very silly. - return; - } - - $array_key = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $array_open + 1 ), null, true, null, true ); - if ( false === $array_key ) { - // No key found, nothing to do. - return; - } - - $stackPtr = $array_key; - $variable_name = TextStrings::stripQuotes( $this->tokens[ $array_key ]['content'] ); - - // Check whether a prefix is needed. - if ( isset( Tokens::$stringTokens[ $this->tokens[ $array_key ]['code'] ] ) - && $this->variable_prefixed_or_allowed( $stackPtr, $variable_name ) === true - ) { - return; - } - - if ( \T_DOUBLE_QUOTED_STRING === $this->tokens[ $array_key ]['code'] ) { - // If the array key is a double quoted string, try again with only - // the part before the first variable (if any). - $exploded = explode( '$', $variable_name ); - $first = rtrim( $exploded[0], '{' ); - if ( '' !== $first ) { - if ( $this->variable_prefixed_or_allowed( $array_key, $first ) === true ) { - return; - } - } else { - // If the first part was dynamic, throw a warning. - $is_error = false; - } - } elseif ( ! isset( Tokens::$stringTokens[ $this->tokens[ $array_key ]['code'] ] ) ) { - // Dynamic array key, throw a warning. - $is_error = false; - } - } else { - // Function parameters do not need to be prefixed. - if ( false === $in_list ) { - $functionPtr = Parentheses::getLastOwner( $this->phpcsFile, $stackPtr, Collections::functionDeclarationTokens() ); - if ( false !== $functionPtr ) { - return; - } - unset( $functionPtr ); - } - - // Properties in a class do not need to be prefixed. - if ( false === $in_list && true === Scopes::isOOProperty( $this->phpcsFile, $stackPtr ) ) { - return; - } - - // Local variables in a function do not need to be prefixed unless they are being imported. - $functionPtr = Conditions::getLastCondition( $this->phpcsFile, $stackPtr, Collections::functionDeclarationTokens() ); - if ( false !== $functionPtr ) { - $has_global = $this->phpcsFile->findPrevious( \T_GLOBAL, ( $stackPtr - 1 ), $this->tokens[ $functionPtr ]['scope_opener'] ); - if ( false === $has_global - || Conditions::getLastCondition( $this->phpcsFile, $has_global, Collections::functionDeclarationTokens() ) !== $functionPtr - ) { - // No variable import happening in the current scope. - return; - } - - // Ok, this may be an imported global variable. - $end_of_statement = $this->phpcsFile->findNext( array( \T_SEMICOLON, \T_CLOSE_TAG ), ( $has_global + 1 ) ); - if ( false === $end_of_statement ) { - // No semi-colon - live coding. - return; - } - - for ( $ptr = ( $has_global + 1 ); $ptr <= $end_of_statement; $ptr++ ) { - // Move the stack pointer to the next variable. - $ptr = $this->phpcsFile->findNext( \T_VARIABLE, $ptr, $end_of_statement, false, null, true ); - - if ( false === $ptr ) { - // Reached the end of the global statement without finding the variable, - // so this must be a local variable. - return; - } - - if ( substr( $this->tokens[ $ptr ]['content'], 1 ) === $variable_name ) { - break; - } - } - - unset( $has_global, $end_of_statement, $ptr ); - } - } - - // Still here ? In that case, the variable name should be prefixed. - $recorded = MessageHelper::addMessage( - $this->phpcsFile, - self::ERROR_MSG, - $stackPtr, - $is_error, - 'NonPrefixedVariableFound', - array( - 'Global variables defined', - '$' . $variable_name, - ) - ); - - if ( true === $recorded ) { - $this->record_potential_prefix_metric( $stackPtr, $variable_name ); - } - } - - /** - * Check that global variables declared via a list construct are prefixed. - * - * {@internal No need to take special measures for nested lists. Nested or not, - * each list part can only contain one variable being written to.} - * - * @since 2.2.0 - * - * @param int $stackPtr The position of the current token in the stack. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - protected function process_list_assignment( $stackPtr ) { - $list_open_close = Lists::getOpenClose( $this->phpcsFile, $stackPtr ); - if ( false === $list_open_close ) { - // Short array, not short list. - return; - } - - $var_pointers = ListHelper::get_list_variables( $this->phpcsFile, $stackPtr ); - foreach ( $var_pointers as $ptr ) { - $this->process_variable_assignment( $ptr, true ); - } - - // No need to re-examine these variables. - return $list_open_close['closer']; - } - - /** - * Process the parameters of a matched function. - * - * @since 0.12.0 - * - * @param int $stackPtr The position of the current token in the stack. - * @param string $group_name The name of the group which was matched. - * @param string $matched_content The token content (function name) which was matched - * in lowercase. - * @param array $parameters Array with information about the parameters. - * - * @return void - */ - public function process_parameters( $stackPtr, $group_name, $matched_content, $parameters ) { - if ( 'define' === $matched_content ) { - $target_param = PassedParameters::getParameterFromStack( $parameters, 1, 'constant_name' ); - - } else { - $target_param = WPHookHelper::get_hook_name_param( $matched_content, $parameters ); - } - - if ( false === $target_param ) { - return; - } - - $is_error = true; - $clean_content = TextStrings::stripQuotes( $target_param['clean'] ); - - if ( ( 'define' !== $matched_content - && isset( $this->allowed_core_hooks[ $clean_content ] ) ) - || ( 'define' === $matched_content - && isset( $this->allowed_core_constants[ $clean_content ] ) ) - ) { - return; - } - - if ( $this->is_prefixed( $target_param['start'], $clean_content ) === true ) { - return; - } else { - // This may be a dynamic hook/constant name. - $first_non_empty = $this->phpcsFile->findNext( - Tokens::$emptyTokens, - $target_param['start'], - ( $target_param['end'] + 1 ), - true - ); - - if ( false === $first_non_empty ) { - return; - } - - $first_non_empty_content = TextStrings::stripQuotes( $this->tokens[ $first_non_empty ]['content'] ); - - // Try again with just the first token if it's a text string. - if ( isset( Tokens::$stringTokens[ $this->tokens[ $first_non_empty ]['code'] ] ) - && $this->is_prefixed( $target_param['start'], $first_non_empty_content ) === true - ) { - return; - } - - if ( \T_DOUBLE_QUOTED_STRING === $this->tokens[ $first_non_empty ]['code'] ) { - // If the first part of the parameter is a double quoted string, try again with only - // the part before the first variable (if any). - $exploded = explode( '$', $first_non_empty_content ); - $first = rtrim( $exploded[0], '{' ); - if ( '' !== $first ) { - if ( $this->is_prefixed( $target_param['start'], $first ) === true ) { - return; - } - } else { - // Start of hook/constant name is dynamic, throw a warning. - $is_error = false; - } - } elseif ( ! isset( Tokens::$stringTokens[ $this->tokens[ $first_non_empty ]['code'] ] ) ) { - // Dynamic hook/constant name, throw a warning. - $is_error = false; - } - } - - if ( 'define' === $matched_content ) { - if ( \defined( '\\' . $clean_content ) ) { - // Backfill for PHP native constant. - return; - } - - if ( strpos( $clean_content, '\\' ) !== false ) { - // Namespaced or unreachable constant. - return; - } - - $data = array( 'Global constants defined' ); - $error_code = 'NonPrefixedConstantFound'; - if ( false === $is_error ) { - $error_code = 'VariableConstantNameFound'; - } - } else { - $data = array( 'Hook names invoked' ); - $error_code = 'NonPrefixedHooknameFound'; - if ( false === $is_error ) { - $error_code = 'DynamicHooknameFound'; - } - } - - $data[] = $clean_content; - - $recorded = MessageHelper::addMessage( $this->phpcsFile, self::ERROR_MSG, $first_non_empty, $is_error, $error_code, $data ); - - if ( true === $recorded ) { - $this->record_potential_prefix_metric( $stackPtr, $clean_content ); - } - } - - /** - * Check if a function/class/constant/variable name is prefixed with one of the expected prefixes. - * - * @since 0.12.0 - * @since 0.14.0 Allows for other non-word characters as well as underscores to better support hook names. - * @since 1.0.0 Does not require a word separator anymore after a prefix. - * This allows for improved code style independent checking, - * i.e. allows for camelCase naming and the likes. - * @since 1.0.1 - Added $stackPtr parameter. - * - The function now also records metrics about the prefixes encountered. - * - * @param int $stackPtr The position of the token to record the metric against. - * @param string $name Name to check for a prefix. - * - * @return bool True when the name is one of the prefixes or starts with an allowed prefix. - * False otherwise. - */ - private function is_prefixed( $stackPtr, $name ) { - foreach ( $this->validated_prefixes as $prefix ) { - if ( stripos( $name, $prefix ) === 0 ) { - $this->phpcsFile->recordMetric( $stackPtr, 'Prefix all globals: allowed prefixes', $prefix ); - return true; - } - } - - return false; - } - - /** - * Check if a variable name might need a prefix. - * - * Prefix is not needed for: - * - superglobals, - * - WP native globals, - * - variables which are already prefixed. - * - * @since 0.12.0 - * @since 1.0.1 Added $stackPtr parameter. - * @since 3.0.0 Renamed from `variable_prefixed_or_whitelisted()` to `variable_prefixed_or_allowed()`. - * - * @param int $stackPtr The position of the token to record the metric against. - * @param string $name Variable name without the dollar sign. - * - * @return bool True if the variable name is allowed or already prefixed. - * False otherwise. - */ - private function variable_prefixed_or_allowed( $stackPtr, $name ) { - // Ignore superglobals and WP global variables. - if ( Variables::isSuperglobalName( $name ) || WPGlobalVariablesHelper::is_wp_global( $name ) ) { - return true; - } - - return $this->is_prefixed( $stackPtr, $name ); - } - - /** - * Validate an array of prefixes as passed through a custom property or via the command line. - * - * Checks that the prefix: - * - is not one of the blocked ones. - * - complies with the PHP rules for valid function, class, variable, constant names. - * - * @since 0.12.0 - * - * @return void - */ - private function validate_prefixes() { - if ( $this->previous_prefixes === $this->prefixes ) { - return; - } - - // Set the cache *before* validation so as to not break the above compare. - $this->previous_prefixes = $this->prefixes; - - // Validate the passed prefix(es). - $prefixes = array(); - $ns_prefixes = array(); - foreach ( $this->prefixes as $key => $prefix ) { - $prefixLC = strtolower( $prefix ); - - if ( isset( $this->prefix_blocklist[ $prefixLC ] ) ) { - $this->phpcsFile->addError( - 'The "%s" prefix is not allowed.', - 0, - 'ForbiddenPrefixPassed', - array( $prefix ) - ); - continue; - } - - $prefix_length = strlen( $prefix ); - if ( function_exists( 'iconv_strlen' ) ) { - $prefix_length = iconv_strlen( $prefix, Helper::getEncoding( $this->phpcsFile ) ); - } - - if ( $prefix_length < self::MIN_PREFIX_LENGTH ) { - $this->phpcsFile->addError( - 'The "%s" prefix is too short. Short prefixes are not unique enough and may cause name collisions with other code.', - 0, - 'ShortPrefixPassed', - array( $prefix ) - ); - continue; - } - - /* - * Validate the prefix against characters allowed for function, class, constant names etc. - * Note: this does not use the PHPCSUtils `NamingConventions::isValidIdentifierName()` method - * as we want to allow namespace separators in the prefixes. - */ - if ( preg_match( '`^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff\\\\]*$`', $prefix ) !== 1 ) { - - $this->phpcsFile->addWarning( - 'The "%s" prefix is not a valid namespace/function/class/variable/constant prefix in PHP.', - 0, - 'InvalidPrefixPassed', - array( $prefix ) - ); - } - - // Lowercase the prefix to allow for direct compare. - $prefixes[ $key ] = $prefixLC; - - /* - * Replace non-word characters in the prefix with a regex snippet, but only if the - * string doesn't already contain namespace separators. - */ - $is_regex = false; - if ( strpos( $prefix, '\\' ) === false && preg_match( '`[_\W]`', $prefix ) > 0 ) { - $prefix = preg_replace( '`([_\W])`', '[\\\\\\\\$1]', $prefixLC ); - $is_regex = true; - } - - $ns_prefixes[ $prefixLC ] = array( - 'prefix' => $prefix, - 'is_regex' => $is_regex, - ); - } - - // Set the validated prefixes caches. - $this->validated_prefixes = $prefixes; - $this->validated_namespace_prefixes = $ns_prefixes; - } - - /** - * Record the "potential prefix" metric. - * - * @since 1.0.1 - * - * @param int $stackPtr The position of the token to record the metric against. - * @param string $construct_name Name of the global construct to try and distill a potential prefix from. - * - * @return void - */ - private function record_potential_prefix_metric( $stackPtr, $construct_name ) { - if ( preg_match( '`^([A-Z]*[a-z0-9]*+)`', ltrim( $construct_name, '\$_' ), $matches ) > 0 - && '' !== $matches[1] - ) { - $this->phpcsFile->recordMetric( $stackPtr, 'Prefix all globals: potential prefixes - start of non-prefixed construct', strtolower( $matches[1] ) ); - } - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/NamingConventions/ValidFunctionNameSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/NamingConventions/ValidFunctionNameSniff.php deleted file mode 100644 index c253d9c..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/NamingConventions/ValidFunctionNameSniff.php +++ /dev/null @@ -1,188 +0,0 @@ -phpcsFile, $stackPtr ) === true ) { - /* - * Deprecated functions don't have to comply with the naming conventions, - * otherwise functions deprecated in favor of a function with a compliant - * name would still trigger an error. - */ - return; - } - - $name = FunctionDeclarations::getName( $this->phpcsFile, $stackPtr ); - if ( empty( $name ) === true ) { - // Live coding or parse error. - return; - } - - if ( '' === ltrim( $name, '_' ) ) { - // Ignore special functions, like __(). - return; - } - - $ooPtr = Scopes::validDirectScope( $this->phpcsFile, $stackPtr, Tokens::$ooScopeTokens ); - if ( false === $ooPtr ) { - $this->process_function_declaration( $stackPtr, $name ); - } else { - $this->process_method_declaration( $stackPtr, $name, $ooPtr ); - } - } - - /** - * Processes a function declaration for a function in the global namespace. - * - * @since 0.1.0 - * @since 3.0.0 Renamed from `processTokenOutsideScope()` to `process_function_declaration()`. - * Method signature has been changed as well as this method no longer overloads - * a method from the PEAR sniff which was previously the sniff parent. - * - * @param int $stackPtr The position where this token was found. - * @param string $functionName The name of the function. - * - * @return void - */ - protected function process_function_declaration( $stackPtr, $functionName ) { - // PHP magic functions are exempt from our rules. - if ( FunctionDeclarations::isMagicFunctionName( $functionName ) === true ) { - return; - } - - // Is the function name prefixed with "__" ? - if ( preg_match( '`^__[^_]`', $functionName ) === 1 ) { - $error = 'Function name "%s" is invalid; only PHP magic methods should be prefixed with a double underscore'; - $errorData = array( $functionName ); - $this->phpcsFile->addError( $error, $stackPtr, 'FunctionDoubleUnderscore', $errorData ); - } - - $suggested_name = SnakeCaseHelper::get_suggestion( $functionName ); - if ( $suggested_name !== $functionName ) { - $error = 'Function name "%s" is not in snake case format, try "%s"'; - $errorData = array( - $functionName, - $suggested_name, - ); - $this->phpcsFile->addError( $error, $stackPtr, 'FunctionNameInvalid', $errorData ); - } - } - - /** - * Processes a method declaration. - * - * @since 0.1.0 - * @since 3.0.0 Renamed from `processTokenWithinScope()` to `process_method_declaration()`. - * Method signature has been changed as well, as this method no longer overloads - * a method from the PEAR sniff which was previously the sniff parent. - * - * @param int $stackPtr The position where this token was found. - * @param string $methodName The name of the method. - * @param int $currScope The position of the current scope. - * - * @return void - */ - protected function process_method_declaration( $stackPtr, $methodName, $currScope ) { - - if ( \T_ANON_CLASS === $this->tokens[ $currScope ]['code'] ) { - $className = '[Anonymous Class]'; - } else { - $className = ObjectDeclarations::getName( $this->phpcsFile, $currScope ); - - // PHP4 constructors are allowed to break our rules. - if ( NamingConventions::isEqual( $methodName, $className ) === true ) { - return; - } - - // PHP4 destructors are allowed to break our rules. - if ( NamingConventions::isEqual( $methodName, '_' . $className ) === true ) { - return; - } - } - - // PHP magic methods are exempt from our rules. - if ( FunctionDeclarations::isMagicMethodName( $methodName ) === true ) { - return; - } - - $extended = ObjectDeclarations::findExtendedClassName( $this->phpcsFile, $currScope ); - $interfaces = ObjectDeclarations::findImplementedInterfaceNames( $this->phpcsFile, $currScope ); - - // If this is a child class or interface implementation, it may have to use camelCase or double underscores. - if ( ! empty( $extended ) || ! empty( $interfaces ) ) { - return; - } - - // Is the method name prefixed with "__" ? - if ( preg_match( '`^__[^_]`', $methodName ) === 1 ) { - $error = 'Method name "%s" is invalid; only PHP magic methods should be prefixed with a double underscore'; - $errorData = array( $className . '::' . $methodName ); - $this->phpcsFile->addError( $error, $stackPtr, 'MethodDoubleUnderscore', $errorData ); - } - - // Check for all lowercase. - $suggested_name = SnakeCaseHelper::get_suggestion( $methodName ); - if ( $suggested_name !== $methodName ) { - $error = 'Method name "%s" in class %s is not in snake case format, try "%s"'; - $errorData = array( - $methodName, - $className, - $suggested_name, - ); - $this->phpcsFile->addError( $error, $stackPtr, 'MethodNameInvalid', $errorData ); - } - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/NamingConventions/ValidHookNameSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/NamingConventions/ValidHookNameSniff.php deleted file mode 100644 index 55dee3b..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/NamingConventions/ValidHookNameSniff.php +++ /dev/null @@ -1,277 +0,0 @@ - - * - * - * - * - * - * Provide several extra delimiters as one string: - * - * - * - * - * - * - * @var string - */ - public $additionalWordDelimiters = ''; - - /** - * Regular expression to test for correct punctuation of a hook name. - * - * The placeholder will be replaced by potentially provided additional - * word delimiters in the `prepare_regex()` method. - * - * @var string - */ - protected $punctuation_regex = '`[^\w%s]`'; - - /** - * Groups of functions to restrict. - * - * @since 0.11.0 - * - * @return array>> - */ - public function getGroups() { - // Only retrieve functions which are not used for deprecated hooks. - $this->target_functions = WPHookHelper::get_functions( false ); - - return parent::getGroups(); - } - - /** - * Process the parameters of a matched function. - * - * @since 0.11.0 - * - * @param int $stackPtr The position of the current token in the stack. - * @param string $group_name The name of the group which was matched. - * @param string $matched_content The token content (function name) which was matched - * in lowercase. - * @param array $parameters Array with information about the parameters. - * - * @return void - */ - public function process_parameters( $stackPtr, $group_name, $matched_content, $parameters ) { - - $hook_name_param = WPHookHelper::get_hook_name_param( $matched_content, $parameters ); - if ( false === $hook_name_param ) { - return; - } - - $regex = $this->prepare_regex(); - - $case_errors = 0; - $underscores = 0; - $content = array(); - $expected = array(); - $last_non_empty = null; - - for ( $i = $hook_name_param['start']; $i <= $hook_name_param['end']; $i++ ) { - // Skip past comment tokens. - if ( isset( Tokens::$commentTokens[ $this->tokens[ $i ]['code'] ] ) ) { - continue; - } - - $content[ $i ] = $this->tokens[ $i ]['content']; - $expected[ $i ] = $this->tokens[ $i ]['content']; - - // Skip past potential variable array access: `$var['key']`. - if ( \T_VARIABLE === $this->tokens[ $i ]['code'] ) { - do { - $open_bracket = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $i + 1 ), null, true ); - if ( false === $open_bracket - || \T_OPEN_SQUARE_BRACKET !== $this->tokens[ $open_bracket ]['code'] - || ! isset( $this->tokens[ $open_bracket ]['bracket_closer'] ) - ) { - $last_non_empty = $i; - continue 2; - } - - $i = $this->tokens[ $open_bracket ]['bracket_closer']; - - } while ( isset( $this->tokens[ $i ] ) && $i <= $hook_name_param['end'] ); - - $last_non_empty = $i; - continue; - } - - // Skip over parameters passed to function calls. - if ( \T_OPEN_PARENTHESIS === $this->tokens[ $i ]['code'] - && ( \T_STRING === $this->tokens[ $last_non_empty ]['code'] - || \T_VARIABLE === $this->tokens[ $last_non_empty ]['code'] ) - && isset( $this->tokens[ $i ]['parenthesis_closer'] ) - ) { - $i = $this->tokens[ $i ]['parenthesis_closer']; - $last_non_empty = $i; - continue; - } - - // Skip past non text string tokens. - if ( isset( Tokens::$stringTokens[ $this->tokens[ $i ]['code'] ] ) === false ) { - $last_non_empty = $i; - continue; - } - - $last_non_empty = $i; - $string = TextStrings::stripQuotes( $this->tokens[ $i ]['content'] ); - - /* - * Here be dragons - a double quoted string can contain extrapolated variables - * which don't have to comply with these rules. - */ - if ( \T_DOUBLE_QUOTED_STRING === $this->tokens[ $i ]['code'] ) { - $transform = $this->transform_complex_string( $string, $regex ); - $case_transform = $this->transform_complex_string( $string, $regex, 'case' ); - $punct_transform = $this->transform_complex_string( $string, $regex, 'punctuation' ); - } else { - $transform = $this->transform( $string, $regex ); - $case_transform = $this->transform( $string, $regex, 'case' ); - $punct_transform = $this->transform( $string, $regex, 'punctuation' ); - } - - if ( $string === $transform ) { - continue; - } - - if ( \T_DOUBLE_QUOTED_STRING === $this->tokens[ $i ]['code'] ) { - $expected[ $i ] = '"' . $transform . '"'; - } else { - $expected[ $i ] = '\'' . $transform . '\''; - } - - if ( $string !== $case_transform ) { - ++$case_errors; - } - if ( $string !== $punct_transform ) { - ++$underscores; - } - } - - $first_non_empty = $this->phpcsFile->findNext( - Tokens::$emptyTokens, - $hook_name_param['start'], - ( $hook_name_param['end'] + 1 ), - true - ); - - $data = array( - trim( implode( '', $expected ) ), - trim( implode( '', $content ) ), - ); - - if ( $case_errors > 0 ) { - $error = 'Hook names should be lowercase. Expected: %s, but found: %s.'; - $this->phpcsFile->addError( $error, $first_non_empty, 'NotLowercase', $data ); - } - - if ( $underscores > 0 ) { - $error = 'Words in hook names should be separated using underscores. Expected: %s, but found: %s.'; - $this->phpcsFile->addWarning( $error, $first_non_empty, 'UseUnderscores', $data ); - } - } - - /** - * Prepare the punctuation regular expression. - * - * Merges the existing regular expression with potentially provided extra word delimiters to allow. - * This is done 'late' and for each found token as otherwise inline `phpcs:set` directives - * would be ignored. - * - * @return string - */ - protected function prepare_regex() { - $extra = ''; - if ( '' !== $this->additionalWordDelimiters && \is_string( $this->additionalWordDelimiters ) ) { - $extra = preg_quote( $this->additionalWordDelimiters, '`' ); - } - - return sprintf( $this->punctuation_regex, $extra ); - } - - /** - * Transform an arbitrary string to lowercase and replace punctuation and spaces with underscores. - * - * @param string $text_string The target string. - * @param string $regex The punctuation regular expression to use. - * @param string $transform_type Whether to do a partial or complete transform. - * Valid values are: 'full', 'case', 'punctuation'. - * @return string - */ - protected function transform( $text_string, $regex, $transform_type = 'full' ) { - - switch ( $transform_type ) { - case 'case': - return strtolower( $text_string ); - - case 'punctuation': - return preg_replace( $regex, '_', $text_string ); - - case 'full': - default: - return preg_replace( $regex, '_', strtolower( $text_string ) ); - } - } - - /** - * Transform a complex string which may contain variable extrapolation. - * - * @param string $text_string The target string. - * @param string $regex The punctuation regular expression to use. - * @param string $transform_type Whether to do a partial or complete transform. - * Valid values are: 'full', 'case', 'punctuation'. - * @return string - */ - protected function transform_complex_string( $text_string, $regex, $transform_type = 'full' ) { - $plain_text = TextStrings::stripEmbeds( $text_string ); - $embeds = TextStrings::getEmbeds( $text_string ); - - $transformed_text = $this->transform( $plain_text, $regex, $transform_type ); - - // Inject the embeds back into the text string. - foreach ( $embeds as $offset => $embed ) { - $transformed_text = substr_replace( $transformed_text, $embed, $offset, 0 ); - } - - return $transformed_text; - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/NamingConventions/ValidPostTypeSlugSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/NamingConventions/ValidPostTypeSlugSniff.php deleted file mode 100644 index f5cb955..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/NamingConventions/ValidPostTypeSlugSniff.php +++ /dev/null @@ -1,230 +0,0 @@ - Key is function name, value irrelevant. - */ - protected $target_functions = array( - 'register_post_type' => true, - ); - - /** - * Array of reserved post type names which can not be used by themes and plugins. - * - * Source: {@link https://developer.wordpress.org/reference/functions/register_post_type/#reserved-post-types} - * - * {@internal To be updated after every major release. Last updated for WordPress 6.9.0-RC2.} - * - * @since 2.2.0 - * - * @var array Key is reserved post type name, value irrelevant. - */ - protected $reserved_names = array( - 'action' => true, // Not a WP post type, but prevents other problems. - 'attachment' => true, - 'author' => true, // Not a WP post type, but prevents other problems. - 'custom_css' => true, - 'customize_changeset' => true, - 'nav_menu_item' => true, - 'oembed_cache' => true, - 'order' => true, // Not a WP post type, but prevents other problems. - 'page' => true, - 'post' => true, - 'revision' => true, - 'theme' => true, // Not a WP post type, but prevents other problems. - 'user_request' => true, - 'wp_block' => true, - 'wp_font_face' => true, - 'wp_font_family' => true, - 'wp_global_styles' => true, - 'wp_navigation' => true, - 'wp_template' => true, - 'wp_template_part' => true, - ); - - /** - * All valid tokens for in the first parameter of register_post_type(). - * - * Set in `register()`. - * - * @since 2.2.0 - * - * @var array - */ - private $valid_tokens = array(); - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 2.2.0 - * - * @return array - */ - public function register() { - $this->valid_tokens = Tokens::$textStringTokens + Tokens::$heredocTokens + Tokens::$emptyTokens; - return parent::register(); - } - - /** - * Process the parameter of a matched function. - * - * Errors on invalid post type names when reserved keywords are used, - * the post type is too long, or contains invalid characters. - * - * @since 2.2.0 - * - * @param int $stackPtr The position of the current token in the stack. - * @param string $group_name The name of the group which was matched. - * @param string $matched_content The token content (function name) which was matched - * in lowercase. - * @param array $parameters Array with information about the parameters. - * - * @return void - */ - public function process_parameters( $stackPtr, $group_name, $matched_content, $parameters ) { - $post_type_param = PassedParameters::getParameterFromStack( $parameters, 1, 'post_type' ); - if ( false === $post_type_param || '' === $post_type_param['clean'] ) { - // Error for using empty slug. - $this->phpcsFile->addError( - 'register_post_type() called without a post type slug. The slug must be a non-empty string.', - false === $post_type_param ? $stackPtr : $post_type_param['start'], - 'Empty' - ); - return; - } - - $string_start = $this->phpcsFile->findNext( Collections::textStringStartTokens(), $post_type_param['start'], ( $post_type_param['end'] + 1 ) ); - $string_pos = $this->phpcsFile->findNext( Tokens::$textStringTokens, $post_type_param['start'], ( $post_type_param['end'] + 1 ) ); - - $has_invalid_tokens = $this->phpcsFile->findNext( $this->valid_tokens, $post_type_param['start'], ( $post_type_param['end'] + 1 ), true ); - if ( false !== $has_invalid_tokens || false === $string_pos ) { - // Check for non string based slug parameter (we cannot determine if this is valid). - $this->phpcsFile->addWarning( - 'The post type slug is not a string literal. It is not possible to automatically determine the validity of this slug. Found: %s.', - $stackPtr, - 'NotStringLiteral', - array( - $post_type_param['clean'], - ), - 3 - ); - return; - } - - $post_type = TextStrings::getCompleteTextString( $this->phpcsFile, $string_start ); - if ( isset( Tokens::$heredocTokens[ $this->tokens[ $string_start ]['code'] ] ) ) { - // Trim off potential indentation from PHP 7.3 flexible heredoc/nowdoc content. - $post_type = ltrim( $post_type ); - } - - $data = array( - $post_type, - ); - - // Warn for dynamic parts in the slug parameter. - if ( \T_DOUBLE_QUOTED_STRING === $this->tokens[ $string_pos ]['code'] - || ( \T_HEREDOC === $this->tokens[ $string_pos ]['code'] - && strpos( $this->tokens[ $string_pos ]['content'], '$' ) !== false ) - ) { - $this->phpcsFile->addWarning( - 'The post type slug may, or may not, get too long with dynamic contents and could contain invalid characters. Found: "%s".', - $string_pos, - 'PartiallyDynamic', - $data - ); - $post_type = TextStrings::stripEmbeds( $post_type ); - } - - if ( preg_match( self::VALID_POST_TYPE_CHARACTERS, $post_type ) === 0 ) { - // Error for invalid characters. - $this->phpcsFile->addError( - 'register_post_type() called with invalid post type "%s". Post type contains invalid characters. Only lowercase alphanumeric characters, dashes, and underscores are allowed.', - $string_pos, - 'InvalidCharacters', - $data - ); - } - - if ( isset( $this->reserved_names[ $post_type ] ) ) { - // Error for using reserved slug names. - $this->phpcsFile->addError( - 'register_post_type() called with reserved post type "%s". Reserved post types should not be used as they interfere with the functioning of WordPress itself.', - $string_pos, - 'Reserved', - $data - ); - } elseif ( stripos( $post_type, 'wp_' ) === 0 ) { - // Error for using reserved slug prefix. - $this->phpcsFile->addError( - 'The post type passed to register_post_type() uses a prefix reserved for WordPress itself. Found: "%s".', - $string_pos, - 'ReservedPrefix', - $data - ); - } - - // Error for slugs that are too long. - if ( strlen( $post_type ) > self::POST_TYPE_MAX_LENGTH ) { - $this->phpcsFile->addError( - 'A post type slug must not exceed %d characters. Found: "%s" (%d characters).', - $string_pos, - 'TooLong', - array( - self::POST_TYPE_MAX_LENGTH, - $post_type, - strlen( $post_type ), - ) - ); - } - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/NamingConventions/ValidVariableNameSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/NamingConventions/ValidVariableNameSniff.php deleted file mode 100644 index 9d41e8b..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/NamingConventions/ValidVariableNameSniff.php +++ /dev/null @@ -1,289 +0,0 @@ - true, - 'GETID3_ERRORARRAY' => true, - 'is_IE' => true, - 'is_IIS' => true, - 'is_macIE' => true, - 'is_NS4' => true, - 'is_winIE' => true, - 'PHP_SELF' => true, - 'post_ID' => true, - 'tag_ID' => true, - 'user_ID' => true, - ); - - /** - * List of member variables that can have mixed case. - * - * @since 0.9.0 - * @since 0.11.0 Changed from public to protected. - * @since 3.0.0 Renamed from `$whitelisted_mixed_case_member_var_names` to `$allowed_mixed_case_member_var_names`. - * - * @var array - */ - protected $allowed_mixed_case_member_var_names = array( - 'cat_ID' => true, - 'comment_ID' => true, - 'comment_author_IP' => true, - 'comment_post_ID' => true, - 'ID' => true, - 'post_ID' => true, - ); - - /** - * Custom list of properties which can have mixed case. - * - * @since 0.11.0 - * @since 3.0.0 Renamed from `$customPropertiesWhitelist` to `$allowed_custom_properties`. - * - * @var string[] - */ - public $allowed_custom_properties = array(); - - /** - * Cache of previously added custom functions. - * - * Prevents having to do the same merges over and over again. - * - * @since 0.10.0 - * @since 0.11.0 - Name changed from $addedCustomVariables. - * - Changed the format from simple bool to array. - * - * @var array - */ - protected $addedCustomProperties = array( - 'properties' => null, - ); - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - protected function processVariable( File $phpcsFile, $stackPtr ) { - $tokens = $phpcsFile->getTokens(); - - // If it's a php reserved var, then its ok. - if ( Variables::isPHPReservedVarName( $tokens[ $stackPtr ]['content'] ) ) { - return; - } - - // Merge any custom variables with the defaults. - $this->merge_allow_lists(); - - $var_name = ltrim( $tokens[ $stackPtr ]['content'], '$' ); - - // Likewise if it is a mixed-case var used by WordPress core. - if ( isset( $this->wordpress_mixed_case_vars[ $var_name ] ) ) { - return; - } - - $obj_operator = $phpcsFile->findNext( Tokens::$emptyTokens, ( $stackPtr + 1 ), null, true ); - if ( \T_OBJECT_OPERATOR === $tokens[ $obj_operator ]['code'] - || \T_NULLSAFE_OBJECT_OPERATOR === $tokens[ $obj_operator ]['code'] - ) { - // Check to see if we are using a variable from an object. - $var = $phpcsFile->findNext( Tokens::$emptyTokens, ( $obj_operator + 1 ), null, true ); - if ( \T_STRING === $tokens[ $var ]['code'] ) { - $bracket = $phpcsFile->findNext( Tokens::$emptyTokens, ( $var + 1 ), null, true ); - if ( \T_OPEN_PARENTHESIS !== $tokens[ $bracket ]['code'] ) { - $obj_var_name = $tokens[ $var ]['content']; - - if ( isset( $this->allowed_mixed_case_member_var_names[ $obj_var_name ] ) ) { - return; - } - - $suggested_name = SnakeCaseHelper::get_suggestion( $obj_var_name ); - if ( $suggested_name !== $obj_var_name ) { - $error = 'Object property "$%s" is not in valid snake_case format, try "$%s"'; - $data = array( - $obj_var_name, - $suggested_name, - ); - $phpcsFile->addError( $error, $var, 'UsedPropertyNotSnakeCase', $data ); - } - } - } - } - - $in_class = false; - if ( ContextHelper::has_object_operator_before( $phpcsFile, $stackPtr ) === true ) { - // The variable lives within a class, and is referenced like - // this: MyClass::$_variable or $class->variable. - $in_class = true; - } - - $suggested_name = SnakeCaseHelper::get_suggestion( $var_name ); - if ( $suggested_name !== $var_name ) { - if ( $in_class && ! isset( $this->allowed_mixed_case_member_var_names[ $var_name ] ) ) { - $error = 'Object property "$%s" is not in valid snake_case format, try "$%s"'; - $error_name = 'UsedPropertyNotSnakeCase'; - } elseif ( ! $in_class ) { - $error = 'Variable "$%s" is not in valid snake_case format, try "$%s"'; - $error_name = 'VariableNotSnakeCase'; - } - - if ( isset( $error, $error_name ) ) { - $data = array( - $var_name, - $suggested_name, - ); - $phpcsFile->addError( $error, $stackPtr, $error_name, $data ); - } - } - } - - /** - * Processes class member variables. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the current token in the - * stack passed in $tokens. - * - * @return void - */ - protected function processMemberVar( File $phpcsFile, $stackPtr ) { - // Make sure this is actually an OO property and not an OO method parameter or illegal property declaration. - if ( Scopes::isOOProperty( $phpcsFile, $stackPtr ) === false ) { - return; - } - - // Merge any custom variables with the defaults. - $this->merge_allow_lists(); - - $tokens = $phpcsFile->getTokens(); - $var_name = ltrim( $tokens[ $stackPtr ]['content'], '$' ); - - if ( isset( $this->allowed_mixed_case_member_var_names[ $var_name ] ) ) { - return; - } - - $suggested_name = SnakeCaseHelper::get_suggestion( $var_name ); - if ( $suggested_name !== $var_name ) { - $error = 'Member variable "$%s" is not in valid snake_case format, try "$%s"'; - $data = array( - $var_name, - $suggested_name, - ); - $phpcsFile->addError( $error, $stackPtr, 'PropertyNotSnakeCase', $data ); - } - } - - /** - * Processes the variables found within a double quoted string. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The position of the double quoted - * string. - * - * @return void - */ - protected function processVariableInString( File $phpcsFile, $stackPtr ) { - $tokens = $phpcsFile->getTokens(); - - // There will always be embeds if the processVariableInString() was called. - $embeds = TextStrings::getEmbeds( $tokens[ $stackPtr ]['content'] ); - - // Merge any custom variables with the defaults. - $this->merge_allow_lists(); - - foreach ( $embeds as $embed ) { - // Grab any variables contained in the embed. - if ( preg_match_all( '`\$(\{)?(?[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*)(?(1)\})`', $embed, $matches ) === 0 ) { - continue; - } - - foreach ( $matches['name'] as $var_name ) { - // If it's a php reserved var, then its ok. - if ( Variables::isPHPReservedVarName( $var_name ) ) { - continue; - } - - // Likewise if it is a mixed-case var used by WordPress core. - if ( isset( $this->wordpress_mixed_case_vars[ $var_name ] ) ) { - continue; - } - - $suggested_name = SnakeCaseHelper::get_suggestion( $var_name ); - if ( $suggested_name !== $var_name ) { - $error = 'Variable "$%s" is not in valid snake_case format, try "$%s"'; - $data = array( - $var_name, - $suggested_name, - ); - $phpcsFile->addError( $error, $stackPtr, 'InterpolatedVariableNotSnakeCase', $data ); - } - } - } - } - - /** - * Merge a custom allow list provided via a custom ruleset with the predefined allow list, - * if we haven't already. - * - * @since 0.10.0 - * @since 2.0.0 Removed unused $phpcs_file parameter. - * @since 3.0.0 Renamed from `mergeWhiteList()` to `merge_allow_lists()`. - * - * @return void - */ - protected function merge_allow_lists() { - if ( $this->allowed_custom_properties !== $this->addedCustomProperties['properties'] ) { - // Fix property potentially passed as comma-delimited string. - $customProperties = RulesetPropertyHelper::merge_custom_array( $this->allowed_custom_properties, array(), false ); - - $this->allowed_mixed_case_member_var_names = RulesetPropertyHelper::merge_custom_array( - $customProperties, - $this->allowed_mixed_case_member_var_names - ); - - $this->addedCustomProperties['properties'] = $this->allowed_custom_properties; - } - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/DevelopmentFunctionsSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/DevelopmentFunctionsSniff.php deleted file mode 100644 index af1c2eb..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/DevelopmentFunctionsSniff.php +++ /dev/null @@ -1,63 +0,0 @@ - array( - * 'lambda' => array( - * 'type' => 'error' | 'warning', - * 'message' => 'Use anonymous functions instead please!', - * 'functions' => array( 'file_get_contents', 'create_function' ), - * ) - * ) - * - * @return array - */ - public function getGroups() { - return array( - 'error_log' => array( - 'type' => 'warning', - 'message' => '%s() found. Debug code should not normally be used in production.', - 'functions' => array( - 'error_log', - 'var_dump', - 'var_export', - 'print_r', - 'trigger_error', - 'set_error_handler', - 'debug_backtrace', - 'debug_print_backtrace', - 'wp_debug_backtrace_summary', - ), - ), - - 'prevent_path_disclosure' => array( - 'type' => 'warning', - 'message' => '%s() can lead to full path disclosure.', - 'functions' => array( - 'error_reporting', - 'phpinfo', - ), - ), - ); - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/DiscouragedPHPFunctionsSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/DiscouragedPHPFunctionsSniff.php deleted file mode 100644 index 058fa0d..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/DiscouragedPHPFunctionsSniff.php +++ /dev/null @@ -1,100 +0,0 @@ - array( - * 'lambda' => array( - * 'type' => 'error' | 'warning', - * 'message' => 'Use anonymous functions instead please!', - * 'functions' => array( 'file_get_contents', 'create_function' ), - * ) - * ) - * - * @return array - */ - public function getGroups() { - return array( - 'serialize' => array( - 'type' => 'warning', - 'message' => '%s() found. Serialized data has known vulnerability problems with Object Injection. JSON is generally a better approach for serializing data. See https://www.owasp.org/index.php/PHP_Object_Injection', - 'functions' => array( - 'serialize', - 'unserialize', - ), - ), - - 'urlencode' => array( - 'type' => 'warning', - 'message' => '%s() should only be used when dealing with legacy applications rawurlencode() should now be used instead. See https://www.php.net/function.rawurlencode and http://www.faqs.org/rfcs/rfc3986.html', - 'functions' => array( - 'urlencode', - ), - ), - - 'runtime_configuration' => array( - 'type' => 'warning', - 'message' => '%s() found. Changing configuration values at runtime is strongly discouraged.', - 'functions' => array( - 'error_reporting', - 'ini_restore', - 'apache_setenv', - 'putenv', - 'set_include_path', - 'restore_include_path', - // This alias was DEPRECATED in PHP 5.3.0, and REMOVED as of PHP 7.0.0. - 'magic_quotes_runtime', - // Warning This function was DEPRECATED in PHP 5.3.0, and REMOVED as of PHP 7.0.0. - 'set_magic_quotes_runtime', - // Warning This function was removed from most SAPIs in PHP 5.3.0, and was removed from PHP-FPM in PHP 7.0.0. - 'dl', - ), - ), - - 'system_calls' => array( - 'type' => 'warning', - 'message' => '%s() found. PHP system calls are often disabled by server admins.', - 'functions' => array( - 'exec', - 'passthru', - 'proc_open', - 'shell_exec', - 'system', - 'popen', - ), - ), - - 'obfuscation' => array( - 'type' => 'warning', - 'message' => '%s() can be used to obfuscate code which is strongly discouraged. Please verify that the function is used for benign reasons.', - 'functions' => array( - 'base64_decode', - 'base64_encode', - 'convert_uudecode', - 'convert_uuencode', - 'str_rot13', - ), - ), - ); - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/DontExtractSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/DontExtractSniff.php deleted file mode 100644 index 0d94252..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/DontExtractSniff.php +++ /dev/null @@ -1,52 +0,0 @@ - array( - * 'lambda' => array( - * 'type' => 'error' | 'warning', - * 'message' => 'Use anonymous functions instead please!', - * 'functions' => array( 'file_get_contents', 'create_function' ), - * ) - * ) - * - * @return array - */ - public function getGroups() { - return array( - - 'extract' => array( - 'type' => 'error', - 'message' => '%s() usage is highly discouraged, due to the complexity and unintended issues it might cause.', - 'functions' => array( - 'extract', - ), - ), - - ); - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/IniSetSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/IniSetSniff.php deleted file mode 100644 index 656c23b..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/IniSetSniff.php +++ /dev/null @@ -1,190 +0,0 @@ - Key is function name, value irrelevant. - */ - protected $target_functions = array( - 'ini_set' => true, - 'ini_alter' => true, // Alias function name. - ); - - /** - * Array of PHP configuration options that are safe to be manipulated, as changing - * the value of these, won't cause interoperability issues between WP/plugins/themes. - * - * @since 2.1.0 - * @since 3.0.0 Renamed from `$whitelisted_options` to `$safe_options`. - * - * @var array>> Multidimensional array with parameter details. - * $safe_options = array( - * (string) option name. = array( - * (string[]) 'valid_values' = array() - * ) - * ); - */ - protected $safe_options = array( - 'auto_detect_line_endings' => array(), - 'highlight.bg' => array(), - 'highlight.comment' => array(), - 'highlight.default' => array(), - 'highlight.html' => array(), - 'highlight.keyword' => array(), - 'highlight.string' => array(), - 'short_open_tag' => array( - 'valid_values' => array( 'true', '1', 'on' ), - ), - ); - - /** - * Array of PHP configuration options that are not allowed to be manipulated, as changing - * the value of these, will be problematic for interoperability between WP/plugins/themes. - * - * @since 2.1.0 - * @since 3.0.0 Renamed from `$blacklisted_options` to `$disallowed_options`. - * - * @var array>> Multidimensional array with parameter details. - * $disallowed_options = array( - * (string) option name. = array( - * (string[]) 'invalid_values' = array() - * (string) 'message' - * ) - * ); - */ - protected $disallowed_options = array( - 'bcmath.scale' => array( - 'message' => 'Use `bcscale()` instead.', - ), - 'display_errors' => array( - 'message' => 'Use `WP_DEBUG_DISPLAY` instead.', - ), - 'error_reporting' => array( - 'message' => 'Use `WP_DEBUG` instead.', - ), - 'filter.default' => array( - 'message' => 'Changing the option value can break other plugins. Use the filter flag constants when calling the Filter functions instead.', - ), - 'filter.default_flags' => array( - 'message' => 'Changing the option value can break other plugins. Use the filter flag constants when calling the Filter functions instead.', - ), - 'iconv.input_encoding' => array( - 'message' => 'This option is not supported since PHP 5.6 - use `iconv_set_encoding()` instead.', - ), - 'iconv.internal_encoding' => array( - 'message' => 'This option is not supported since PHP 5.6 - use `iconv_set_encoding()` instead.', - ), - 'iconv.output_encoding' => array( - 'message' => 'This option is not supported since PHP 5.6 - use `iconv_set_encoding()` instead.', - ), - 'ignore_user_abort' => array( - 'message' => 'Use `ignore_user_abort()` instead.', - ), - 'log_errors' => array( - 'message' => 'Use `WP_DEBUG_LOG` instead.', - ), - 'max_execution_time' => array( - 'message' => 'Use `set_time_limit()` instead.', - ), - 'memory_limit' => array( - 'message' => 'Use `wp_raise_memory_limit()` or hook into the filters in that function.', - ), - 'short_open_tag' => array( - 'invalid_values' => array( 'false', '0', 'off' ), - 'message' => 'Turning off short_open_tag is prohibited as it can break other plugins.', - ), - ); - - /** - * Process the parameter of a matched function. - * - * Errors if an option is found in the disallow-list. Warns as - * 'risky' when the option is not found in the safe-list. - * - * @since 2.1.0 - * - * @param int $stackPtr The position of the current token in the stack. - * @param string $group_name The name of the group which was matched. - * @param string $matched_content The token content (function name) which was matched - * in lowercase. - * @param array $parameters Array with information about the parameters. - * - * @return void - */ - public function process_parameters( $stackPtr, $group_name, $matched_content, $parameters ) { - $option_param = PassedParameters::getParameterFromStack( $parameters, 1, 'option' ); - $value_param = PassedParameters::getParameterFromStack( $parameters, 2, 'value' ); - - if ( false === $option_param || false === $value_param ) { - // Missing required param. Not the concern of this sniff. Bow out. - return; - } - - $option_name = TextStrings::stripQuotes( $option_param['clean'] ); - $option_value = TextStrings::stripQuotes( $value_param['clean'] ); - if ( isset( $this->safe_options[ $option_name ] ) ) { - $safe_option = $this->safe_options[ $option_name ]; - if ( empty( $safe_option['valid_values'] ) || in_array( strtolower( $option_value ), $safe_option['valid_values'], true ) ) { - return; - } - } - - if ( isset( $this->disallowed_options[ $option_name ] ) ) { - $disallowed_option = $this->disallowed_options[ $option_name ]; - if ( empty( $disallowed_option['invalid_values'] ) - || in_array( strtolower( $option_value ), $disallowed_option['invalid_values'], true ) - ) { - $this->phpcsFile->addError( - 'Found: %s(%s, %s). %s', - $stackPtr, - MessageHelper::stringToErrorcode( $option_name . '_Disallowed' ), - array( - $matched_content, - $option_param['clean'], - $value_param['clean'], - $disallowed_option['message'], - ) - ); - return; - } - } - - $this->phpcsFile->addWarning( - 'Changing configuration values at runtime is strongly discouraged. Found: %s(%s, %s)', - $stackPtr, - 'Risky', - array( - $matched_content, - $option_param['clean'], - $value_param['clean'], - ) - ); - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/NoSilencedErrorsSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/NoSilencedErrorsSniff.php deleted file mode 100644 index 400da4a..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/NoSilencedErrorsSniff.php +++ /dev/null @@ -1,245 +0,0 @@ - Key is function name, value irrelevant. - */ - protected $allowedFunctionsList = array( - // Directory extension. - 'chdir' => true, - 'opendir' => true, - 'scandir' => true, - - // File extension. - 'file_exists' => true, - 'file_get_contents' => true, - 'file' => true, - 'fileatime' => true, - 'filectime' => true, - 'filegroup' => true, - 'fileinode' => true, - 'filemtime' => true, - 'fileowner' => true, - 'fileperms' => true, - 'filesize' => true, - 'filetype' => true, - 'fopen' => true, - 'is_dir' => true, - 'is_executable' => true, - 'is_file' => true, - 'is_link' => true, - 'is_readable' => true, - 'is_writable' => true, - 'is_writeable' => true, - 'lstat' => true, - 'mkdir' => true, - 'move_uploaded_file' => true, - 'readfile' => true, - 'readlink' => true, - 'rename' => true, - 'rmdir' => true, - 'stat' => true, - 'unlink' => true, - - // FTP extension. - 'ftp_chdir' => true, - 'ftp_login' => true, - 'ftp_rename' => true, - - // Stream extension. - 'stream_select' => true, - 'stream_set_chunk_size' => true, - - // Zlib extension. - 'deflate_add' => true, - 'deflate_init' => true, - 'inflate_add' => true, - 'inflate_init' => true, - 'readgzfile' => true, - - // LibXML extension. - 'libxml_disable_entity_loader' => true, // PHP 8.0 deprecation warning, but function call still needed in select cases. - - // Miscellaneous other functions. - 'imagecreatefromstring' => true, - 'imagecreatefromwebp' => true, - 'parse_url' => true, // Pre-PHP 5.3.3 an E_WARNING was thrown when URL parsing failed. - 'unserialize' => true, - ); - - /** - * Tokens which are regarded as empty for the purpose of determining - * the name of the called function. - * - * This property is set from within the register() method. - * - * @since 1.1.0 - * - * @var array - */ - private $empty_tokens = array(); - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.1.0 - * - * @return array - */ - public function register() { - $this->empty_tokens = Tokens::$emptyTokens; - $this->empty_tokens[ \T_NS_SEPARATOR ] = \T_NS_SEPARATOR; - $this->empty_tokens[ \T_BITWISE_AND ] = \T_BITWISE_AND; - - return array( - \T_ASPERAND, - ); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.1.0 - * - * @param int $stackPtr The position of the current token in the stack. - */ - public function process_token( $stackPtr ) { - // Handle the user-defined custom function list. - $this->customAllowedFunctionsList = RulesetPropertyHelper::merge_custom_array( $this->customAllowedFunctionsList, array(), false ); - $this->customAllowedFunctionsList = array_map( 'strtolower', $this->customAllowedFunctionsList ); - - /* - * Check if the error silencing is done for one of the allowed functions. - * - * @internal The function call name determination is done even when there is no allow list active - * to allow the metrics to be more informative. - */ - $next_non_empty = $this->phpcsFile->findNext( $this->empty_tokens, ( $stackPtr + 1 ), null, true, null, true ); - if ( false !== $next_non_empty && \T_STRING === $this->tokens[ $next_non_empty ]['code'] ) { - $has_parenthesis = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $next_non_empty + 1 ), null, true, null, true ); - if ( false !== $has_parenthesis && \T_OPEN_PARENTHESIS === $this->tokens[ $has_parenthesis ]['code'] ) { - $function_name = strtolower( $this->tokens[ $next_non_empty ]['content'] ); - if ( ( true === $this->usePHPFunctionsList - && isset( $this->allowedFunctionsList[ $function_name ] ) === true ) - || ( ! empty( $this->customAllowedFunctionsList ) - && in_array( $function_name, $this->customAllowedFunctionsList, true ) === true ) - ) { - $this->phpcsFile->recordMetric( $stackPtr, 'Error silencing', 'silencing allowed function call: ' . $function_name ); - return; - } - } - } - - $this->context_length = (int) $this->context_length; - $context_length = $this->context_length; - if ( $this->context_length <= 0 ) { - $context_length = 2; - } - - // Prepare the "Found" string to display. - $end_of_statement = BCFile::findEndOfStatement( $this->phpcsFile, $stackPtr, \T_COMMA ); - if ( ( $end_of_statement - $stackPtr ) < $context_length ) { - $context_length = ( $end_of_statement - $stackPtr ); - } - - $found = GetTokensAsString::compact( $this->phpcsFile, $stackPtr, ( $stackPtr + $context_length - 1 ), true ) . '...'; - $error_msg = 'Silencing errors is strongly discouraged. Use proper error checking instead.'; - $data = array(); - if ( $this->context_length > 0 ) { - $error_msg .= ' Found: %s'; - $data[] = $found; - } - - $this->phpcsFile->addWarning( - $error_msg, - $stackPtr, - 'Discouraged', - $data - ); - - if ( isset( $function_name ) ) { - $this->phpcsFile->recordMetric( $stackPtr, 'Error silencing', '@' . $function_name ); - } else { - $this->phpcsFile->recordMetric( $stackPtr, 'Error silencing', $found ); - } - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/POSIXFunctionsSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/POSIXFunctionsSniff.php deleted file mode 100644 index a6fedf7..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/POSIXFunctionsSniff.php +++ /dev/null @@ -1,103 +0,0 @@ - array( - * 'lambda' => array( - * 'type' => 'error' | 'warning', - * 'message' => 'Use anonymous functions instead please!', - * 'functions' => array( 'file_get_contents', 'create_function' ), - * ) - * ) - * - * @return array - */ - public function getGroups() { - return array( - 'ereg' => array( - 'type' => 'error', - 'message' => '%s() has been deprecated since PHP 5.3 and removed in PHP 7.0, please use preg_match() instead.', - 'functions' => array( - 'ereg', - 'eregi', - 'sql_regcase', - ), - ), - - 'ereg_replace' => array( - 'type' => 'error', - 'message' => '%s() has been deprecated since PHP 5.3 and removed in PHP 7.0, please use preg_replace() instead.', - 'functions' => array( - 'ereg_replace', - 'eregi_replace', - ), - ), - - 'split' => array( - 'type' => 'error', - 'message' => '%s() has been deprecated since PHP 5.3 and removed in PHP 7.0, please use explode(), str_split() or preg_split() instead.', - 'functions' => array( - 'split', - 'spliti', - ), - ), - - ); - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/PregQuoteDelimiterSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/PregQuoteDelimiterSniff.php deleted file mode 100644 index 3a1ab1e..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/PregQuoteDelimiterSniff.php +++ /dev/null @@ -1,70 +0,0 @@ - Key is function name, value irrelevant. - */ - protected $target_functions = array( - 'preg_quote' => true, - ); - - /** - * Process the parameters of a matched function. - * - * @since 1.0.0 - * - * @param int $stackPtr The position of the current token in the stack. - * @param string $group_name The name of the group which was matched. - * @param string $matched_content The token content (function name) which was matched - * in lowercase. - * @param array $parameters Array with information about the parameters. - * - * @return void - */ - public function process_parameters( $stackPtr, $group_name, $matched_content, $parameters ) { - - $delimiter = PassedParameters::getParameterFromStack( $parameters, 2, 'delimiter' ); - if ( false !== $delimiter ) { - return; - } - - $this->phpcsFile->addWarning( - 'Passing the $delimiter parameter to preg_quote() is strongly recommended.', - $stackPtr, - 'Missing' - ); - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/RestrictedPHPFunctionsSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/RestrictedPHPFunctionsSniff.php deleted file mode 100644 index f3102e3..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/RestrictedPHPFunctionsSniff.php +++ /dev/null @@ -1,45 +0,0 @@ - array( - * 'lambda' => array( - * 'type' => 'error' | 'warning', - * 'message' => 'Use anonymous functions instead please!', - * 'functions' => array( 'file_get_contents', 'create_function' ), - * ) - * ) - * - * @return array - */ - public function getGroups() { - return array( - 'create_function' => array( - 'type' => 'error', - 'message' => '%s() is deprecated as of PHP 7.2 and removed in PHP 8.0. Please use declared named or anonymous functions instead.', - 'functions' => array( - 'create_function', - ), - ), - ); - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/StrictInArraySniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/StrictInArraySniff.php deleted file mode 100644 index dc7aa7a..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/StrictInArraySniff.php +++ /dev/null @@ -1,122 +0,0 @@ - Key is the function name. - */ - protected $target_functions = array( - 'in_array' => array( - 'param_position' => 3, - 'param_name' => 'strict', - 'always_needed' => true, - ), - 'array_search' => array( - 'param_position' => 3, - 'param_name' => 'strict', - 'always_needed' => true, - ), - 'array_keys' => array( - 'param_position' => 3, - 'param_name' => 'strict', - 'always_needed' => false, - ), - ); - - /** - * Process the parameters of a matched function. - * - * @since 0.11.0 - * - * @param int $stackPtr The position of the current token in the stack. - * @param string $group_name The name of the group which was matched. - * @param string $matched_content The token content (function name) which was matched - * in lowercase. - * @param array $parameters Array with information about the parameters. - * - * @return void - */ - public function process_parameters( $stackPtr, $group_name, $matched_content, $parameters ) { - $param_info = $this->target_functions[ $matched_content ]; - - /* - * Check if the strict check is actually needed. - * - * Important! This check only applies to array_keys() in the current form of the sniff - * and has been written to be specific to that function. - * If more functions would be added with 'always_needed' set to `false`, - * this code will need to be adjusted to handle those. - */ - if ( false === $param_info['always_needed'] ) { - $has_filter_value = PassedParameters::getParameterFromStack( $parameters, 2, 'filter_value' ); - if ( false === $has_filter_value ) { - return; - } - } - - $found_parameter = PassedParameters::getParameterFromStack( $parameters, $param_info['param_position'], $param_info['param_name'] ); - if ( false === $found_parameter || 'true' !== strtolower( $found_parameter['clean'] ) ) { - $errorcode = 'MissingTrueStrict'; - - /* - * Use a different error code when `false` is found to allow for excluding - * the warning as this will be a conscious choice made by the dev. - */ - if ( is_array( $found_parameter ) && 'false' === strtolower( $found_parameter['clean'] ) ) { - $errorcode = 'FoundNonStrictFalse'; - } - - $this->phpcsFile->addWarning( - 'Not using strict comparison for %s; supply true for $%s argument.', - ( isset( $found_parameter['start'] ) ? $found_parameter['start'] : $stackPtr ), - $errorcode, - array( $matched_content, $param_info['param_name'] ) - ); - } - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/TypeCastsSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/TypeCastsSniff.php deleted file mode 100644 index 3e07c7f..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/TypeCastsSniff.php +++ /dev/null @@ -1,90 +0,0 @@ -tokens[ $stackPtr ]['code']; - $typecast = str_replace( ' ', '', $this->tokens[ $stackPtr ]['content'] ); - $typecast_lc = strtolower( $typecast ); - - switch ( $token_code ) { - case \T_DOUBLE_CAST: - if ( '(float)' !== $typecast_lc ) { - $fix = $this->phpcsFile->addFixableError( - 'Normalized type keywords must be used; expected "(float)" but found "%s"', - $stackPtr, - 'DoubleRealFound', - array( $typecast ) - ); - - if ( true === $fix ) { - $this->phpcsFile->fixer->replaceToken( $stackPtr, '(float)' ); - } - } - break; - - case \T_UNSET_CAST: - $this->phpcsFile->addError( - 'Using the "(unset)" cast is forbidden as the type cast is removed in PHP 8.0. Use the "unset()" language construct instead.', - $stackPtr, - 'UnsetFound' - ); - break; - - case \T_BINARY_CAST: - $this->phpcsFile->addWarning( - 'Using binary casting is strongly discouraged. Found: "%s"', - $stackPtr, - 'BinaryFound', - array( $typecast ) - ); - break; - } - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/YodaConditionsSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/YodaConditionsSniff.php deleted file mode 100644 index cff8161..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/PHP/YodaConditionsSniff.php +++ /dev/null @@ -1,123 +0,0 @@ -condition_start_tokens = $starters; - - return array( - \T_IS_EQUAL, - \T_IS_NOT_EQUAL, - \T_IS_IDENTICAL, - \T_IS_NOT_IDENTICAL, - ); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param int $stackPtr The position of the current token in the stack. - * - * @return void - */ - public function process_token( $stackPtr ) { - - $start = $this->phpcsFile->findPrevious( $this->condition_start_tokens, $stackPtr, null, false, null, true ); - - $needs_yoda = false; - - // Note: going backwards! - for ( $i = $stackPtr; $i > $start; $i-- ) { - - // Ignore whitespace. - if ( isset( Tokens::$emptyTokens[ $this->tokens[ $i ]['code'] ] ) ) { - continue; - } - - // If this is a variable or array assignment, we've seen all we need to see. - if ( \T_VARIABLE === $this->tokens[ $i ]['code'] - || \T_CLOSE_SQUARE_BRACKET === $this->tokens[ $i ]['code'] - ) { - $needs_yoda = true; - break; - } - - // If this is a function call or something, we are OK. - if ( \T_CLOSE_PARENTHESIS === $this->tokens[ $i ]['code'] ) { - return; - } - } - - if ( ! $needs_yoda ) { - return; - } - - // Check if this is a var to var comparison, e.g.: if ( $var1 == $var2 ). - $next_non_empty = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $stackPtr + 1 ), null, true ); - - if ( isset( Tokens::$castTokens[ $this->tokens[ $next_non_empty ]['code'] ] ) ) { - $next_non_empty = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $next_non_empty + 1 ), null, true ); - } - - if ( isset( Collections::ooHierarchyKeywords()[ $this->tokens[ $next_non_empty ]['code'] ] ) === true ) { - $next_non_empty = $this->phpcsFile->findNext( - ( Tokens::$emptyTokens + array( \T_DOUBLE_COLON => \T_DOUBLE_COLON ) ), - ( $next_non_empty + 1 ), - null, - true - ); - } - - if ( \T_VARIABLE === $this->tokens[ $next_non_empty ]['code'] ) { - return; - } - - $this->phpcsFile->addError( 'Use Yoda Condition checks, you must.', $stackPtr, 'NotYoda' ); - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Security/EscapeOutputSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Security/EscapeOutputSniff.php deleted file mode 100644 index e0714e3..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Security/EscapeOutputSniff.php +++ /dev/null @@ -1,920 +0,0 @@ - - */ - protected $unsafePrintingFunctions = array( - '_e' => array( - 'alternative' => 'esc_html_e() or esc_attr_e()', - 'params' => array( - 1 => 'text', - ), - ), - '_ex' => array( - 'alternative' => 'echo esc_html_x() or echo esc_attr_x()', - 'params' => array( - 1 => 'text', - ), - ), - ); - - /** - * List of names of the native PHP constants which can be considered safe. - * - * @since 1.0.0 - * - * @var array - */ - private $safe_php_constants = array( - 'PHP_EOL' => true, // String. - 'PHP_VERSION' => true, // Integer. - 'PHP_MAJOR_VERSION' => true, // Integer. - 'PHP_MINOR_VERSION' => true, // Integer. - 'PHP_RELEASE_VERSION' => true, // Integer. - 'PHP_VERSION_ID' => true, // Integer. - 'PHP_EXTRA_VERSION' => true, // String. - 'PHP_DEBUG' => true, // Integer. - ); - - /** - * List of tokens which can be considered as safe when directly part of the output. - * - * This list is enhanced with additional tokens in the `register()` method. - * - * @since 0.12.0 - * - * @var array - */ - private $safe_components = array( - \T_LNUMBER => \T_LNUMBER, - \T_DNUMBER => \T_DNUMBER, - \T_TRUE => \T_TRUE, - \T_FALSE => \T_FALSE, - \T_NULL => \T_NULL, - \T_CONSTANT_ENCAPSED_STRING => \T_CONSTANT_ENCAPSED_STRING, - \T_START_NOWDOC => \T_START_NOWDOC, - \T_NOWDOC => \T_NOWDOC, - \T_END_NOWDOC => \T_END_NOWDOC, - \T_BOOLEAN_NOT => \T_BOOLEAN_NOT, - ); - - /** - * List of keyword tokens this sniff listens for, which can also be used as an inline expression. - * - * @since 3.0.0 - * - * @var array - */ - private $target_keywords = array( - \T_EXIT => \T_EXIT, - \T_PRINT => \T_PRINT, - \T_THROW => \T_THROW, - ); - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return string|int[] - */ - public function register() { - // Enrich the list of "safe components" tokens. - $this->safe_components += Tokens::$comparisonTokens; - $this->safe_components += Tokens::$operators; - $this->safe_components += Tokens::$booleanOperators; - $this->safe_components += Collections::incrementDecrementOperators(); - - // Set up the tokens the sniff should listen to. - $targets = array_merge( parent::register(), $this->target_keywords ); - $targets[] = \T_ECHO; - $targets[] = \T_OPEN_TAG_WITH_ECHO; - - return $targets; - } - - /** - * Groups of functions this sniff is looking for. - * - * @since 3.0.0 - * - * @return array - */ - public function getGroups() { - // Make sure all array keys are lowercase (could contain user-provided function names). - $printing_functions = array_change_key_case( $this->get_printing_functions(), \CASE_LOWER ); - - // Remove the unsafe printing functions to prevent duplicate notices. - $printing_functions = array_diff_key( $printing_functions, $this->unsafePrintingFunctions ); - - return array( - 'unsafe_printing_functions' => array( - 'functions' => array_keys( $this->unsafePrintingFunctions ), - ), - 'printing_functions' => array( - 'functions' => array_keys( $printing_functions ), - ), - ); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 3.0.0 This method has been split up. - * - * @param int $stackPtr The position of the current token in the stack. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function process_token( $stackPtr ) { - $start = ( $stackPtr + 1 ); - - switch ( $this->tokens[ $stackPtr ]['code'] ) { - case \T_STRING: - // Prevent exclusion of any of the function groups. - $this->exclude = array(); - - // In the tests, custom printing functions may be added/removed on the fly. - if ( defined( 'PHP_CODESNIFFER_IN_TESTS' ) ) { - $this->setup_groups( 'functions' ); - } - - // Let the abstract parent class handle the initial function call check. - return parent::process_token( $stackPtr ); - - case \T_EXIT: - $params = PassedParameters::getParameters( $this->phpcsFile, $stackPtr ); - if ( empty( $params ) ) { - // Live coding/parse error or an exit/die which doesn't pass a status. Ignore. - return; - } - - // There should only be one parameter ($status), but just to be on the safe side. - foreach ( $params as $param ) { - $this->check_code_is_escaped( $param['start'], ( $param['end'] + 1 ) ); - } - - // Skip to the end of the last found parameter. - return ( $param['end'] + 1 ); - - case \T_THROW: - // Find the open parentheses, while stepping over the exception creation tokens. - $ignore = Tokens::$emptyTokens; - $ignore += Collections::namespacedNameTokens(); - $ignore += Collections::functionCallTokens(); - $ignore += Collections::objectOperators(); - $ignore[ \T_READONLY ] = \T_READONLY; - - $next_relevant = $stackPtr; - do { - $next_relevant = $this->phpcsFile->findNext( $ignore, ( $next_relevant + 1 ), null, true ); - if ( false === $next_relevant ) { - return; - } - - if ( \T_NEW === $this->tokens[ $next_relevant ]['code'] ) { - continue; - } - - // Skip over attribute declarations when searching for the open parenthesis. - if ( \T_ATTRIBUTE === $this->tokens[ $next_relevant ]['code'] ) { - if ( isset( $this->tokens[ $next_relevant ]['attribute_closer'] ) === false ) { - return; - } - - $next_relevant = $this->tokens[ $next_relevant ]['attribute_closer']; - continue; - } - - break; - } while ( $next_relevant < ( $this->phpcsFile->numTokens - 1 ) ); - - if ( \T_OPEN_PARENTHESIS !== $this->tokens[ $next_relevant ]['code'] - || isset( $this->tokens[ $next_relevant ]['parenthesis_closer'] ) === false - ) { - // Live coding/parse error or a pre-created exception. Nothing to do for us. - return; - } - - $end = $this->tokens[ $next_relevant ]['parenthesis_closer']; - - // Check if the throw is within a `try-catch`. - // Doing this here (instead of earlier) to allow skipping to the end of the statement. - $search_for = Collections::closedScopes(); - $search_for[ \T_TRY ] = \T_TRY; - - $last_condition = Conditions::getLastCondition( $this->phpcsFile, $stackPtr, $search_for ); - if ( false !== $last_condition && \T_TRY === $this->tokens[ $last_condition ]['code'] ) { - // This exception will (probably) be caught, so ignore it. - return $end; - } - - $call_token = $this->phpcsFile->findPrevious( Tokens::$emptyTokens, ( $next_relevant - 1 ), null, true ); - $params = PassedParameters::getParameters( $this->phpcsFile, $call_token ); - if ( empty( $params ) ) { - // No parameters passed, nothing to do. - return $end; - } - - // Examine each parameter individually. - foreach ( $params as $param ) { - $this->check_code_is_escaped( $param['start'], ( $param['end'] + 1 ), 'ExceptionNotEscaped' ); - } - - return $end; - - case \T_PRINT: - $end = BCFile::findEndOfStatement( $this->phpcsFile, $stackPtr ); - if ( \T_COMMA !== $this->tokens[ $end ]['code'] - && \T_SEMICOLON !== $this->tokens[ $end ]['code'] - && \T_COLON !== $this->tokens[ $end ]['code'] - && \T_DOUBLE_ARROW !== $this->tokens[ $end ]['code'] - && isset( $this->tokens[ ( $end + 1 ) ] ) - ) { - /* - * FindEndOfStatement includes a comma/(semi-)colon/double arrow if that's the end of - * the statement, but for everything else, it returns the last non-empty token _before_ - * the end, which would mean the last non-empty token in the statement would not - * be examined. Let's fix that. - */ - ++$end; - } - - // Note: no need to check for close tag as close tag will have the token before the tag as the $end. - if ( $end >= ( $this->phpcsFile->numTokens - 1 ) ) { - $last_non_empty = $this->phpcsFile->findPrevious( Tokens::$emptyTokens, $end, null, true ); - if ( \T_SEMICOLON !== $this->tokens[ $last_non_empty ]['code'] ) { - // Live coding/parse error at end of file. Ignore. - return; - } - } - - // Special case for a print statement *within* a ternary, where we need to find the "inline else" as the end token. - $prev_non_empty = $this->phpcsFile->findPrevious( Tokens::$emptyTokens, ( $stackPtr - 1 ), null, true ); - if ( \T_INLINE_THEN === $this->tokens[ $prev_non_empty ]['code'] ) { - $target_nesting_level = 0; - if ( empty( $this->tokens[ $stackPtr ]['nested_parenthesis'] ) === false ) { - $target_nesting_level = \count( $this->tokens[ $stackPtr ]['nested_parenthesis'] ); - } - - $inline_else = false; - for ( $i = ( $stackPtr + 1 ); $i < $end; $i++ ) { - if ( \T_INLINE_ELSE !== $this->tokens[ $i ]['code'] ) { - continue; - } - - if ( empty( $this->tokens[ $i ]['nested_parenthesis'] ) - && 0 === $target_nesting_level - ) { - $inline_else = $i; - break; - } - - if ( empty( $this->tokens[ $i ]['nested_parenthesis'] ) === false - && \count( $this->tokens[ $i ]['nested_parenthesis'] ) === $target_nesting_level - ) { - $inline_else = $i; - break; - } - } - - if ( false === $inline_else ) { - // Live coding/parse error. Bow out. - return; - } - - $end = $inline_else; - } - - break; - - // Echo, open tag with echo. - default: - $end = $this->phpcsFile->findNext( array( \T_SEMICOLON, \T_CLOSE_TAG ), $stackPtr ); - if ( false === $end ) { - // Live coding/parse error. Bow out. - return; - } - - break; - } - - return $this->check_code_is_escaped( $start, $end ); - } - - /** - * Process a matched function call token. - * - * @since 3.0.0 Split off from the process_token() method. - * - * @param int $stackPtr The position of the current token in the stack. - * @param string $group_name The name of the group which was matched. - * @param string $matched_content The token content (function name) which was matched - * in lowercase. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function process_matched_token( $stackPtr, $group_name, $matched_content ) { - // Make sure we only deal with actual function calls, not function import use statements. - $next_non_empty = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $stackPtr + 1 ), null, true ); - if ( false === $next_non_empty - || \T_OPEN_PARENTHESIS !== $this->tokens[ $next_non_empty ]['code'] - || isset( $this->tokens[ $next_non_empty ]['parenthesis_closer'] ) === false - ) { - // Live coding, parse error or not a function _call_. - return; - } - - $end = $this->tokens[ $next_non_empty ]['parenthesis_closer']; - - if ( 'unsafe_printing_functions' === $group_name ) { - $error = $this->phpcsFile->addError( - "All output should be run through an escaping function (like %s), found '%s'.", - $stackPtr, - 'UnsafePrintingFunction', - array( $this->unsafePrintingFunctions[ $matched_content ]['alternative'], $matched_content ) - ); - - // If the error was reported, don't bother checking the function's arguments. - if ( $error || empty( $this->unsafePrintingFunctions[ $matched_content ]['params'] ) ) { - return $end; - } - - // If the function was not reported for being unsafe, examine the relevant parameters. - $params = PassedParameters::getParameters( $this->phpcsFile, $stackPtr ); - foreach ( $this->unsafePrintingFunctions[ $matched_content ]['params'] as $position => $name ) { - $param = PassedParameters::getParameterFromStack( $params, $position, $name ); - if ( false === $param ) { - // Parameter doesn't exist. Nothing to do. - continue; - } - - $this->check_code_is_escaped( $param['start'], ( $param['end'] + 1 ) ); - } - - return $end; - } - - $params = PassedParameters::getParameters( $this->phpcsFile, $stackPtr ); - - /* - * These functions only need to have their first argument - `$message` - escaped. - * Note: user_error() is an alias for trigger_error(), so the param names are the same. - */ - if ( 'trigger_error' === $matched_content || 'user_error' === $matched_content ) { - $message_param = PassedParameters::getParameterFromStack( $params, 1, 'message' ); - if ( false === $message_param ) { - // Message parameter doesn't exist. Nothing to do. - return $end; - } - - return $this->check_code_is_escaped( $message_param['start'], ( $message_param['end'] + 1 ) ); - } - - /* - * If the first param to `_deprecated_file()` - `$file` - follows the typical `basename( __FILE__ )` - * pattern, it doesn't need to be escaped. - */ - if ( '_deprecated_file' === $matched_content ) { - $file_param = PassedParameters::getParameterFromStack( $params, 1, 'file' ); - - if ( false !== $file_param ) { - // Check for a particular code pattern which can safely be ignored. - if ( preg_match( '`^[\\\\]?basename\s*\(\s*__FILE__\s*\)$`', $file_param['clean'] ) === 1 ) { - unset( $params[1], $params['file'] ); // Remove the param, whether passed positionally or named. - } - } - unset( $file_param ); - } - - // Examine each parameter individually. - foreach ( $params as $param ) { - $this->check_code_is_escaped( $param['start'], ( $param['end'] + 1 ) ); - } - - return $end; - } - - /** - * Check whether each relevant part of an arbitrary group of token is output escaped. - * - * @since 3.0.0 Split off from the process_token() method. - * - * @param int $start The position to start checking from. - * @param int $end The position to stop the check at. - * @param string $code Code to use for the PHPCS error. - * - * @return int Integer stack pointer to skip forward. - */ - protected function check_code_is_escaped( $start, $end, $code = 'OutputNotEscaped' ) { - /* - * Check for a ternary operator. - * We only need to do this here if this statement is lacking parenthesis. - * Otherwise it will be handled in the below loop. - */ - $ternary = false; - $next_non_empty = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $start + 1 ), null, true ); - $last_non_empty = $this->phpcsFile->findPrevious( Tokens::$emptyTokens, ( $end - 1 ), null, true ); - - if ( \T_OPEN_PARENTHESIS !== $this->tokens[ $next_non_empty ]['code'] - || \T_CLOSE_PARENTHESIS !== $this->tokens[ $last_non_empty ]['code'] - || ( \T_OPEN_PARENTHESIS === $this->tokens[ $next_non_empty ]['code'] - && \T_CLOSE_PARENTHESIS === $this->tokens[ $last_non_empty ]['code'] - && isset( $this->tokens[ $next_non_empty ]['parenthesis_closer'] ) - && $this->tokens[ $next_non_empty ]['parenthesis_closer'] !== $last_non_empty - ) - ) { - // If there is a (long) ternary, skip over the part before the ?. - $ternary = $this->find_long_ternary( $start, $end ); - if ( false !== $ternary ) { - $start = ( $ternary + 1 ); - } - } - - $in_cast = false; - $watch = true; - - // Looping through echo'd components. - for ( $i = $start; $i < $end; $i++ ) { - // Ignore whitespaces and comments. - if ( isset( Tokens::$emptyTokens[ $this->tokens[ $i ]['code'] ] ) ) { - continue; - } - - // Skip over irrelevant tokens. - if ( isset( Tokens::$magicConstants[ $this->tokens[ $i ]['code'] ] ) // Magic constants for debug functions. - || \T_NS_SEPARATOR === $this->tokens[ $i ]['code'] - || \T_DOUBLE_ARROW === $this->tokens[ $i ]['code'] - || \T_CLOSE_PARENTHESIS === $this->tokens[ $i ]['code'] - ) { - continue; - } - - if ( \T_OPEN_PARENTHESIS === $this->tokens[ $i ]['code'] ) { - if ( ! isset( $this->tokens[ $i ]['parenthesis_closer'] ) ) { - // Live coding or parse error. - break; - } - - if ( $in_cast ) { - // Skip to the end of a function call if it has been cast to a safe value. - $i = $this->tokens[ $i ]['parenthesis_closer']; - $in_cast = false; - - } else { - // Skip over the condition part of a (long) ternary (i.e., to after the ?). - $ternary = $this->find_long_ternary( ( $i + 1 ), $this->tokens[ $i ]['parenthesis_closer'] ); - if ( false !== $ternary ) { - $i = $ternary; - } - } - - continue; - } - - /* - * If a keyword is encountered in an inline expression and the keyword is one - * this sniff listens to, recurse into the sniff, handle the expression - * based on the keyword and skip over the code examined. - */ - if ( isset( $this->target_keywords[ $this->tokens[ $i ]['code'] ] ) ) { - $return_value = $this->process_token( $i ); - if ( isset( $return_value ) ) { - $i = $return_value; - } - continue; - } - - // Handle PHP 8.0+ match expressions. - if ( \T_MATCH === $this->tokens[ $i ]['code'] ) { - $match_valid = $this->walk_match_expression( $i, $code ); - if ( false === $match_valid ) { - // Live coding or parse error. Shouldn't be possible as PHP[CS] will tokenize the keyword as `T_STRING` in that case. - break; // @codeCoverageIgnore - } - - $i = $match_valid; - continue; - } - - // Examine the items in an array individually for array parameters. - if ( isset( Collections::arrayOpenTokensBC()[ $this->tokens[ $i ]['code'] ] ) ) { - $array_open_close = Arrays::getOpenClose( $this->phpcsFile, $i ); - if ( false === $array_open_close ) { - // Short list or misidentified short array token. - continue; - } - - $array_items = PassedParameters::getParameters( $this->phpcsFile, $i, 0, true ); - if ( ! empty( $array_items ) ) { - foreach ( $array_items as $array_item ) { - $this->check_code_is_escaped( $array_item['start'], ( $array_item['end'] + 1 ), $code ); - } - } - - $i = $array_open_close['closer']; - continue; - } - - // Ignore safe PHP native constants. - if ( \T_STRING === $this->tokens[ $i ]['code'] - && isset( $this->safe_php_constants[ $this->tokens[ $i ]['content'] ] ) - && ConstantsHelper::is_use_of_global_constant( $this->phpcsFile, $i ) - ) { - continue; - } - - // Wake up on concatenation characters, another part to check. - if ( \T_STRING_CONCAT === $this->tokens[ $i ]['code'] ) { - $watch = true; - continue; - } - - // Wake up after a ternary else (:). - if ( false !== $ternary && \T_INLINE_ELSE === $this->tokens[ $i ]['code'] ) { - $watch = true; - continue; - } - - // Wake up for commas. - if ( \T_COMMA === $this->tokens[ $i ]['code'] ) { - $in_cast = false; - $watch = true; - continue; - } - - if ( false === $watch ) { - continue; - } - - // Allow T_CONSTANT_ENCAPSED_STRING eg: echo 'Some String'; - // Also T_LNUMBER, e.g.: echo 45; exit -1; and booleans. - if ( isset( $this->safe_components[ $this->tokens[ $i ]['code'] ] ) ) { - continue; - } - - // Check for use of *::class. - if ( \T_STRING === $this->tokens[ $i ]['code'] - || \T_VARIABLE === $this->tokens[ $i ]['code'] - || isset( Collections::ooHierarchyKeywords()[ $this->tokens[ $i ]['code'] ] ) - || \T_NAMESPACE === $this->tokens[ $i ]['code'] - ) { - $skip_tokens = Tokens::$emptyTokens; - $skip_tokens[ \T_STRING ] = \T_STRING; - $skip_tokens[ \T_NS_SEPARATOR ] = \T_NS_SEPARATOR; - - $double_colon = $this->phpcsFile->findNext( $skip_tokens, ( $i + 1 ), $end, true ); - if ( false !== $double_colon - && \T_DOUBLE_COLON === $this->tokens[ $double_colon ]['code'] - ) { - $class_keyword = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $double_colon + 1 ), $end, true ); - if ( false !== $class_keyword - && \T_STRING === $this->tokens[ $class_keyword ]['code'] - && 'class' === strtolower( $this->tokens[ $class_keyword ]['content'] ) - ) { - $i = $class_keyword; - continue; - } - } - } - - $watch = false; - - // Allow int/double/bool casted variables. - if ( isset( ContextHelper::get_safe_cast_tokens()[ $this->tokens[ $i ]['code'] ] ) ) { - /* - * If the next thing is a match expression, skip over it as whatever is - * being returned will be safely cast. - * Do not set `$in_cast` to `true`. - */ - $next_non_empty = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $i + 1 ), $end, true ); - if ( false !== $next_non_empty - && \T_MATCH === $this->tokens[ $next_non_empty ]['code'] - && isset( $this->tokens[ $next_non_empty ]['scope_closer'] ) - ) { - $i = $this->tokens[ $next_non_empty ]['scope_closer']; - continue; - } - - $in_cast = true; - continue; - } - - // Handle heredocs separately as they only need escaping when interpolation is used. - if ( \T_START_HEREDOC === $this->tokens[ $i ]['code'] ) { - $current = ( $i + 1 ); - while ( isset( $this->tokens[ $current ] ) && \T_HEREDOC === $this->tokens[ $current ]['code'] ) { - $embeds = TextStrings::getEmbeds( $this->tokens[ $current ]['content'] ); - if ( ! empty( $embeds ) ) { - $this->phpcsFile->addError( - 'All output should be run through an escaping function (see the Security sections in the WordPress Developer Handbooks), found interpolation in unescaped heredoc.', - $current, - 'HeredocOutputNotEscaped' - ); - } - ++$current; - } - - $i = $current; - continue; - } - - // Now check that the next token is a function call. - if ( \T_STRING === $this->tokens[ $i ]['code'] ) { - $ptr = $i; - $functionName = $this->tokens[ $i ]['content']; - $function_opener = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $i + 1 ), null, true ); - $is_formatting_function = FormattingFunctionsHelper::is_formatting_function( $functionName ); - - if ( false !== $function_opener - && \T_OPEN_PARENTHESIS === $this->tokens[ $function_opener ]['code'] - ) { - if ( ArrayWalkingFunctionsHelper::is_array_walking_function( $functionName ) ) { - // Get the callback parameter. - $callback = ArrayWalkingFunctionsHelper::get_callback_parameter( $this->phpcsFile, $ptr ); - - if ( ! empty( $callback ) ) { - /* - * If this is a function callback (not a method callback array) and we're able - * to resolve the function name, do so. - */ - $mapped_function = $this->phpcsFile->findNext( - Tokens::$emptyTokens, - $callback['start'], - ( $callback['end'] + 1 ), - true - ); - - if ( false !== $mapped_function - && \T_CONSTANT_ENCAPSED_STRING === $this->tokens[ $mapped_function ]['code'] - ) { - $functionName = TextStrings::stripQuotes( $this->tokens[ $mapped_function ]['content'] ); - $ptr = $mapped_function; - } - } - } - - // If this is a formatting function, we examine the parameters individually. - if ( $is_formatting_function ) { - $formatting_params = PassedParameters::getParameters( $this->phpcsFile, $i ); - if ( ! empty( $formatting_params ) ) { - foreach ( $formatting_params as $format_param ) { - $this->check_code_is_escaped( $format_param['start'], ( $format_param['end'] + 1 ), $code ); - } - } - - $watch = true; - } - - // Skip pointer to after the function. - if ( isset( $this->tokens[ $function_opener ]['parenthesis_closer'] ) ) { - $i = $this->tokens[ $function_opener ]['parenthesis_closer']; - } else { - // Live coding or parse error. - break; - } - } - - // If this is a safe function, we don't flag it. - if ( $is_formatting_function - || $this->is_escaping_function( $functionName ) - || $this->is_auto_escaped_function( $functionName ) - ) { - // Special case get_search_query() which is unsafe if $escaped = false. - if ( 'get_search_query' === strtolower( $functionName ) ) { - $escaped_param = PassedParameters::getParameter( $this->phpcsFile, $ptr, 1, 'escaped' ); - if ( false !== $escaped_param && 'true' !== $escaped_param['clean'] ) { - $this->phpcsFile->addError( - 'Output from get_search_query() is unsafe due to $escaped parameter being set to "false".', - $ptr, - 'UnsafeSearchQuery' - ); - } - } - - continue; - } - - $content = $functionName; - - } else { - $content = $this->tokens[ $i ]['content']; - $ptr = $i; - } - - // Make the error message a little more informative for array access variables. - if ( \T_VARIABLE === $this->tokens[ $ptr ]['code'] ) { - $array_keys = VariableHelper::get_array_access_keys( $this->phpcsFile, $ptr ); - - if ( ! empty( $array_keys ) ) { - $content .= '[' . implode( '][', $array_keys ) . ']'; - } - } - - $this->phpcsFile->addError( - "All output should be run through an escaping function (see the Security sections in the WordPress Developer Handbooks), found '%s'.", - $ptr, - $code, - array( $content ) - ); - } - - return $end; - } - - /** - * Check whether there is a ternary token at the right nesting level in an arbitrary set of tokens. - * - * @since 3.0.0 Split off from the process_token() method. - * - * @param int $start The position to start checking from. - * @param int $end The position to stop the check at. - * - * @return int|false Stack pointer to the ternary or FALSE if no ternary was found or - * if this is a short ternary. - */ - private function find_long_ternary( $start, $end ) { - for ( $i = $start; $i < $end; $i++ ) { - // Ignore anything within square brackets. - if ( isset( $this->tokens[ $i ]['bracket_opener'], $this->tokens[ $i ]['bracket_closer'] ) - && $i === $this->tokens[ $i ]['bracket_opener'] - ) { - $i = $this->tokens[ $i ]['bracket_closer']; - continue; - } - - // Skip past nested arrays, function calls and arbitrary groupings. - if ( \T_OPEN_PARENTHESIS === $this->tokens[ $i ]['code'] - && isset( $this->tokens[ $i ]['parenthesis_closer'] ) - ) { - $i = $this->tokens[ $i ]['parenthesis_closer']; - continue; - } - - // Skip past closures, anonymous classes and anything else scope related. - if ( isset( $this->tokens[ $i ]['scope_condition'], $this->tokens[ $i ]['scope_closer'] ) - && $this->tokens[ $i ]['scope_condition'] === $i - ) { - $i = $this->tokens[ $i ]['scope_closer']; - continue; - } - - if ( \T_INLINE_THEN !== $this->tokens[ $i ]['code'] ) { - continue; - } - - /* - * Okay, we found a ternary and it should be at the correct nesting level. - * If this is a short ternary, it shouldn't be ignored though. - */ - if ( Operators::isShortTernary( $this->phpcsFile, $i ) === true ) { - return false; - } - - return $i; - } - - return false; - } - - /** - * Examine a match expression and only check for escaping in the "returned" parts of the match expression. - * - * {@internal PHPCSUtils will likely contain a utility for parsing match expressions in the future. - * Ref: https://github.com/PHPCSStandards/PHPCSUtils/issues/497} - * - * @since 3.0.0 - * - * @param int $stackPtr Pointer to a T_MATCH token. - * @param string $code Code to use for the PHPCS error. - * - * @return int|false Stack pointer to skip to or FALSE if the match expression contained a parse error. - */ - private function walk_match_expression( $stackPtr, $code ) { - if ( ! isset( $this->tokens[ $stackPtr ]['scope_opener'], $this->tokens[ $stackPtr ]['scope_closer'] ) ) { - // Parse error/live coding. Shouldn't be possible as PHP[CS] will tokenize the keyword as `T_STRING` in that case. - return false; // @codeCoverageIgnore - } - - $current = $this->tokens[ $stackPtr ]['scope_opener']; - $end = $this->tokens[ $stackPtr ]['scope_closer']; - do { - $current = $this->phpcsFile->findNext( \T_MATCH_ARROW, ( $current + 1 ), $end ); - if ( false === $current ) { - // We must have reached the last match item (or there is a parse error). - break; - } - - $item_start = ( $current + 1 ); - $item_end = false; - - // Find the first comma at the same level. - for ( $i = $item_start; $i <= $end; $i++ ) { - // Ignore anything within square brackets. - if ( isset( $this->tokens[ $i ]['bracket_opener'], $this->tokens[ $i ]['bracket_closer'] ) - && $i === $this->tokens[ $i ]['bracket_opener'] - ) { - $i = $this->tokens[ $i ]['bracket_closer']; - continue; - } - - // Skip past nested arrays, function calls and arbitrary groupings. - if ( \T_OPEN_PARENTHESIS === $this->tokens[ $i ]['code'] - && isset( $this->tokens[ $i ]['parenthesis_closer'] ) - ) { - $i = $this->tokens[ $i ]['parenthesis_closer']; - continue; - } - - // Skip past closures, anonymous classes and anything else scope related. - if ( isset( $this->tokens[ $i ]['scope_condition'], $this->tokens[ $i ]['scope_closer'] ) - && $this->tokens[ $i ]['scope_condition'] === $i - ) { - $i = $this->tokens[ $i ]['scope_closer']; - continue; - } - - if ( \T_COMMA !== $this->tokens[ $i ]['code'] - && $i !== $end - ) { - continue; - } - - $item_end = $i; - break; - } - - if ( false === $item_end ) { - // Parse error/live coding. Shouldn't be possible. - return false; // @codeCoverageIgnore - } - - // Now check that the value returned by this match "leaf" is correctly escaped. - $this->check_code_is_escaped( $item_start, $item_end, $code ); - - // Independently of whether or not the check was successful or ran into (parse error) problems, - // always skip to the identified end of the item. - $current = $item_end; - } while ( $current < $end ); - - return $end; - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Security/NonceVerificationSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Security/NonceVerificationSniff.php deleted file mode 100644 index 06b941f..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Security/NonceVerificationSniff.php +++ /dev/null @@ -1,426 +0,0 @@ - true, - '$_FILES' => true, - '$_GET' => false, - '$_REQUEST' => false, - ); - - /** - * Custom list of functions which verify nonces. - * - * @since 0.5.0 - * - * @var string[] - */ - public $customNonceVerificationFunctions = array(); - - /** - * List of the functions which verify nonces. - * - * @since 0.5.0 - * @since 0.11.0 Changed from public static to protected non-static. - * @since 3.0.0 - Moved from the generic `Sniff` class to this class. - * - Visibility changed from `protected` to `private. - * - * @var array - */ - private $nonceVerificationFunctions = array( - 'wp_verify_nonce' => true, - 'check_admin_referer' => true, - 'check_ajax_referer' => true, - ); - - /** - * Cache of previously added custom functions. - * - * Prevents having to do the same merges over and over again. - * - * @since 0.5.0 - * @since 0.11.0 - Changed from public static to protected non-static. - * - Changed the format from simple bool to array. - * @since 3.0.0 - Property rename from `$addedCustomFunctions` to `$addedCustomNonceFunctions`. - * - Visibility changed from `protected` to `private. - * - Format changed from a multi-dimensional array to a single-dimensional array. - * - * @var array - */ - private $addedCustomNonceFunctions = array(); - - /** - * Information on the all scopes that were checked to find a nonce verification in a particular file. - * - * The array will be in the following format: - * ``` - * array( - * 'file' => (string) The name of the file. - * 'cache' => (array) array( - * # => array( The key is the token pointer to the "start" position. - * 'end' => (int) The token pointer to the "end" position. - * 'nonce' => (int|bool) The token pointer where n nonce check - * was found, or false if none was found. - * ) - * ) - * ) - * ``` - * - * @since 3.0.0 - * - * @var array - */ - private $cached_results; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() { - $targets = array( \T_VARIABLE => \T_VARIABLE ); - $targets += Collections::listOpenTokensBC(); // We need to skip over lists. - - return $targets; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param int $stackPtr The position of the current token in the stack. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function process_token( $stackPtr ) { - // Skip over lists as whatever is in those will always be assignments. - if ( isset( Collections::listOpenTokensBC()[ $this->tokens[ $stackPtr ]['code'] ] ) ) { - $open_close = Lists::getOpenClose( $this->phpcsFile, $stackPtr ); - $skip_to = $stackPtr; - if ( false !== $open_close ) { - $skip_to = $open_close['closer']; - } - - return $skip_to; - } - - if ( ! isset( $this->superglobals[ $this->tokens[ $stackPtr ]['content'] ] ) ) { - return; - } - - if ( Scopes::isOOProperty( $this->phpcsFile, $stackPtr ) ) { - // Property with the same name as a superglobal. Not our target. - return; - } - - // Determine the cache keys for this item. - $cache_keys = array( - 'file' => $this->phpcsFile->getFilename(), - 'start' => 0, - 'end' => $stackPtr, - ); - - // If we're in a function, only look inside of it. - // This doesn't take arrow functions into account as those are "open". - $functionPtr = Conditions::getLastCondition( $this->phpcsFile, $stackPtr, array( \T_FUNCTION, \T_CLOSURE ) ); - if ( false !== $functionPtr ) { - $cache_keys['start'] = $this->tokens[ $functionPtr ]['scope_opener']; - } - - $this->mergeFunctionLists(); - - $needs_nonce = $this->needs_nonce_check( $stackPtr, $cache_keys ); - if ( false === $needs_nonce ) { - return; - } - - if ( $this->has_nonce_check( $stackPtr, $cache_keys, ( 'after' === $needs_nonce ) ) ) { - return; - } - - // If we're still here, no nonce-verification function was found. - $error_code = 'Missing'; - if ( false === $this->superglobals[ $this->tokens[ $stackPtr ]['content'] ] ) { - $error_code = 'Recommended'; - } - - MessageHelper::addMessage( - $this->phpcsFile, - 'Processing form data without nonce verification.', - $stackPtr, - $this->superglobals[ $this->tokens[ $stackPtr ]['content'] ], - $error_code - ); - } - - /** - * Determine whether or not a nonce check is needed for the current superglobal. - * - * @since 3.0.0 - * - * @param int $stackPtr The position of the current token in the stack of tokens. - * @param array $cache_keys The keys for the applicable cache (to potentially set). - * - * @return string|false String "before" or "after" if a nonce check is needed. - * FALSE when no nonce check is needed. - */ - protected function needs_nonce_check( $stackPtr, array $cache_keys ) { - $in_nonce_check = ContextHelper::is_in_function_call( $this->phpcsFile, $stackPtr, $this->nonceVerificationFunctions ); - if ( false !== $in_nonce_check ) { - // This *is* the nonce check, so bow out, but do store to cache. - // @todo Change to use arg unpacking once PHP < 5.6 has been dropped. - $this->set_cache( $cache_keys['file'], $cache_keys['start'], $cache_keys['end'], $in_nonce_check ); - return false; - } - - if ( Context::inUnset( $this->phpcsFile, $stackPtr ) ) { - // Variable is only being unset, no nonce check needed. - return false; - } - - if ( VariableHelper::is_assignment( $this->phpcsFile, $stackPtr, false ) ) { - // Overwriting the value of a superglobal. - return false; - } - - $needs_nonce = 'before'; - if ( ContextHelper::is_in_isset_or_empty( $this->phpcsFile, $stackPtr ) - || ContextHelper::is_in_type_test( $this->phpcsFile, $stackPtr ) - || VariableHelper::is_comparison( $this->phpcsFile, $stackPtr ) - || VariableHelper::is_assignment( $this->phpcsFile, $stackPtr, true ) - || ContextHelper::is_in_array_comparison( $this->phpcsFile, $stackPtr ) - || ContextHelper::is_in_function_call( $this->phpcsFile, $stackPtr, UnslashingFunctionsHelper::get_functions() ) !== false - || $this->is_only_sanitized( $this->phpcsFile, $stackPtr ) - ) { - $needs_nonce = 'after'; - } - - return $needs_nonce; - } - - /** - * Check if this token has an associated nonce check. - * - * @since 0.5.0 - * @since 3.0.0 - Moved from the generic `Sniff` class to this class. - * - Visibility changed from `protected` to `private. - * - New `$cache_keys` parameter. - * - New `$allow_nonce_after` parameter. - * - * @param int $stackPtr The position of the current token in the stack of tokens. - * @param array $cache_keys The keys for the applicable cache. - * @param bool $allow_nonce_after Whether the nonce check _must_ be before the $stackPtr or - * is allowed _after_ the $stackPtr. - * - * @return bool - */ - private function has_nonce_check( $stackPtr, array $cache_keys, $allow_nonce_after = false ) { - $start = $cache_keys['start']; - $end = $cache_keys['end']; - - // We allow for certain actions, such as an isset() check to come before the nonce check. - // If this superglobal is inside such a check, look for the nonce after it as well, - // all the way to the end of the scope. - if ( true === $allow_nonce_after ) { - $end = ( 0 === $start ) ? $this->phpcsFile->numTokens : $this->tokens[ $start ]['scope_closer']; - } - - // Check against the cache. - $current_cache = $this->get_cache( $cache_keys['file'], $start ); - if ( false !== $current_cache['nonce'] ) { - // If we have already found a nonce check in this scope, we just - // need to check whether it comes before this token. It is OK if the - // check is after the token though, if this was only an isset() check. - return ( true === $allow_nonce_after || $current_cache['nonce'] < $stackPtr ); - } elseif ( $end <= $current_cache['end'] ) { - // If not, we can still go ahead and return false if we've already - // checked to the end of the search area. - return false; - } - - $search_start = $start; - if ( $current_cache['end'] > $start ) { - // We haven't checked this far yet, but we can still save work by - // skipping over the part we've already checked. - $search_start = $this->cached_results['cache'][ $start ]['end']; - } - - // Loop through the tokens looking for nonce verification functions. - for ( $i = $search_start; $i < $end; $i++ ) { - // Skip over nested closed scope constructs. - if ( isset( Collections::closedScopes()[ $this->tokens[ $i ]['code'] ] ) - || \T_FN === $this->tokens[ $i ]['code'] - ) { - if ( isset( $this->tokens[ $i ]['scope_closer'] ) ) { - $i = $this->tokens[ $i ]['scope_closer']; - } - continue; - } - - // If this isn't a function name, skip it. - if ( \T_STRING !== $this->tokens[ $i ]['code'] ) { - continue; - } - - $content_lc = \strtolower( $this->tokens[ $i ]['content'] ); - - // If this is one of the nonce verification functions, we can bail out. - if ( isset( $this->nonceVerificationFunctions[ $content_lc ] ) ) { - /* - * Now, make sure it is a call to a global function. - */ - if ( ContextHelper::has_object_operator_before( $this->phpcsFile, $i ) === true ) { - continue; - } - - if ( ContextHelper::is_token_namespaced( $this->phpcsFile, $i ) === true ) { - continue; - } - - $this->set_cache( $cache_keys['file'], $start, $end, $i ); - return true; - } - } - - // We're still here, so no luck. - $this->set_cache( $cache_keys['file'], $start, $end, false ); - - return false; - } - - /** - * Helper function to retrieve results from the cache. - * - * @since 3.0.0 - * - * @param string $filename The name of the current file. - * @param int $start The stack pointer searches started from. - * - * @return array - */ - private function get_cache( $filename, $start ) { - if ( is_array( $this->cached_results ) - && $filename === $this->cached_results['file'] - && isset( $this->cached_results['cache'][ $start ] ) - ) { - return $this->cached_results['cache'][ $start ]; - } - - return array( - 'end' => 0, - 'nonce' => false, - ); - } - - /** - * Helper function to store results to the cache. - * - * @since 3.0.0 - * - * @param string $filename The name of the current file. - * @param int $start The stack pointer searches started from. - * @param int $end The stack pointer searched stopped at. - * @param int|bool $nonce Stack pointer to the nonce verification function call or false if none was found. - * - * @return void - */ - private function set_cache( $filename, $start, $end, $nonce ) { - if ( is_array( $this->cached_results ) === false - || $filename !== $this->cached_results['file'] - ) { - $this->cached_results = array( - 'file' => $filename, - 'cache' => array( - $start => array( - 'end' => $end, - 'nonce' => $nonce, - ), - ), - ); - return; - } - - // Okay, so we know the current cache is for the current file. Check if we've seen this start pointer before. - if ( isset( $this->cached_results['cache'][ $start ] ) === false ) { - $this->cached_results['cache'][ $start ] = array( - 'end' => $end, - 'nonce' => $nonce, - ); - return; - } - - // Update existing entry. - if ( $end > $this->cached_results['cache'][ $start ]['end'] ) { - $this->cached_results['cache'][ $start ]['end'] = $end; - } - - $this->cached_results['cache'][ $start ]['nonce'] = $nonce; - } - - /** - * Merge custom functions provided via a custom ruleset with the defaults, if we haven't already. - * - * @since 0.11.0 Split out from the `process()` method. - * - * @return void - */ - protected function mergeFunctionLists() { - if ( $this->customNonceVerificationFunctions !== $this->addedCustomNonceFunctions ) { - $this->nonceVerificationFunctions = RulesetPropertyHelper::merge_custom_array( - $this->customNonceVerificationFunctions, - $this->nonceVerificationFunctions - ); - - $this->nonceVerificationFunctions = array_change_key_case( $this->nonceVerificationFunctions ); - - $this->addedCustomNonceFunctions = $this->customNonceVerificationFunctions; - } - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Security/PluginMenuSlugSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Security/PluginMenuSlugSniff.php deleted file mode 100644 index 7efb287..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Security/PluginMenuSlugSniff.php +++ /dev/null @@ -1,126 +0,0 @@ -> Key is the name of the functions being targeted. - * Value is an array with parameter positions as the - * keys and parameter names as the values - */ - protected $target_functions = array( - 'add_comments_page' => array( - 4 => 'menu_slug', - ), - 'add_dashboard_page' => array( - 4 => 'menu_slug', - ), - 'add_links_page' => array( - 4 => 'menu_slug', - ), - 'add_management_page' => array( - 4 => 'menu_slug', - ), - 'add_media_page' => array( - 4 => 'menu_slug', - ), - 'add_menu_page' => array( - 4 => 'menu_slug', - ), - 'add_object_page' => array( - 4 => 'menu_slug', - ), - 'add_options_page' => array( - 4 => 'menu_slug', - ), - 'add_pages_page' => array( - 4 => 'menu_slug', - ), - 'add_plugins_page' => array( - 4 => 'menu_slug', - ), - 'add_posts_page' => array( - 4 => 'menu_slug', - ), - 'add_submenu_page' => array( - 1 => 'parent_slug', - 5 => 'menu_slug', - ), - 'add_theme_page' => array( - 4 => 'menu_slug', - ), - 'add_users_page' => array( - 4 => 'menu_slug', - ), - 'add_utility_page' => array( - 4 => 'menu_slug', - ), - ); - - /** - * Process the parameters of a matched function. - * - * @since 0.11.0 - * - * @param int $stackPtr The position of the current token in the stack. - * @param string $group_name The name of the group which was matched. - * @param string $matched_content The token content (function name) which was matched - * in lowercase. - * @param array $parameters Array with information about the parameters. - * - * @return void - */ - public function process_parameters( $stackPtr, $group_name, $matched_content, $parameters ) { - foreach ( $this->target_functions[ $matched_content ] as $position => $param_name ) { - $found_param = PassedParameters::getParameterFromStack( $parameters, $position, $param_name ); - if ( false === $found_param ) { - continue; - } - - $file_constant = $this->phpcsFile->findNext( \T_FILE, $found_param['start'], ( $found_param['end'] + 1 ) ); - if ( false !== $file_constant ) { - $this->phpcsFile->addWarning( 'Using __FILE__ for menu slugs risks exposing filesystem structure.', $file_constant, 'Using__FILE__' ); - } - } - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Security/SafeRedirectSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Security/SafeRedirectSniff.php deleted file mode 100644 index 88a0831..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Security/SafeRedirectSniff.php +++ /dev/null @@ -1,45 +0,0 @@ - array( - * 'lambda' => array( - * 'type' => 'error' | 'warning', - * 'message' => 'Use anonymous functions instead please!', - * 'functions' => array( 'file_get_contents', 'create_function' ), - * ) - * ) - * - * @return array - */ - public function getGroups() { - return array( - 'wp_redirect' => array( - 'type' => 'warning', - 'message' => '%s() found. Using wp_safe_redirect(), along with the "allowed_redirect_hosts" filter if needed, can help avoid any chances of malicious redirects within code. It is also important to remember to call exit() after a redirect so that no other unwanted code is executed.', - 'functions' => array( - 'wp_redirect', - ), - ), - ); - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Security/ValidatedSanitizedInputSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Security/ValidatedSanitizedInputSniff.php deleted file mode 100644 index 45ea8ce..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Security/ValidatedSanitizedInputSniff.php +++ /dev/null @@ -1,244 +0,0 @@ - - */ - private $slashed_superglobals = array( - '$_COOKIE' => true, - '$_GET' => true, - '$_POST' => true, - '$_REQUEST' => true, - '$_SERVER' => true, - ); - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() { - return array( - \T_VARIABLE, - \T_DOUBLE_QUOTED_STRING, - \T_HEREDOC, - ); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param int $stackPtr The position of the current token in the stack. - * - * @return void - */ - public function process_token( $stackPtr ) { - - // Handling string interpolation. - if ( \T_DOUBLE_QUOTED_STRING === $this->tokens[ $stackPtr ]['code'] - || \T_HEREDOC === $this->tokens[ $stackPtr ]['code'] - ) { - // Retrieve all embeds, but use only the initial variable name part. - $interpolated_variables = array_map( - static function ( $embed ) { - return preg_replace( '`^(\{?\$\{?\(?)([a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*)(.*)$`', '$2', $embed ); - }, - TextStrings::getEmbeds( $this->tokens[ $stackPtr ]['content'] ) - ); - - // Filter the embeds down to superglobals only. - $interpolated_superglobals = array_filter( - $interpolated_variables, - static function ( $var_name ) { - return ( 'GLOBALS' !== $var_name && Variables::isSuperglobalName( $var_name ) ); - } - ); - - foreach ( $interpolated_superglobals as $bad_variable ) { - $this->phpcsFile->addError( 'Detected usage of a non-sanitized, non-validated input variable %s: %s', $stackPtr, 'InputNotValidatedNotSanitized', array( $bad_variable, $this->tokens[ $stackPtr ]['content'] ) ); - } - - return; - } - - /* Handle variables */ - - // Check if this is a superglobal we want to examine. - if ( '$GLOBALS' === $this->tokens[ $stackPtr ]['content'] - || Variables::isSuperglobalName( $this->tokens[ $stackPtr ]['content'] ) === false - ) { - return; - } - - // If the variable is being unset, we don't care about it. - if ( Context::inUnset( $this->phpcsFile, $stackPtr ) ) { - return; - } - - // If we're overriding a superglobal with an assignment, no need to test. - if ( VariableHelper::is_assignment( $this->phpcsFile, $stackPtr ) ) { - return; - } - - // This superglobal is being validated. - if ( ContextHelper::is_in_isset_or_empty( $this->phpcsFile, $stackPtr ) ) { - return; - } - - $array_keys = VariableHelper::get_array_access_keys( $this->phpcsFile, $stackPtr ); - - if ( empty( $array_keys ) ) { - return; - } - - $error_data = array( $this->tokens[ $stackPtr ]['content'] . '[' . implode( '][', $array_keys ) . ']' ); - - /* - * Check for validation first. - */ - $validated = false; - - for ( $i = ( $stackPtr + 1 ); $i < $this->phpcsFile->numTokens; $i++ ) { - if ( isset( Tokens::$emptyTokens[ $this->tokens[ $i ]['code'] ] ) ) { - continue; - } - - if ( \T_OPEN_SQUARE_BRACKET === $this->tokens[ $i ]['code'] - && isset( $this->tokens[ $i ]['bracket_closer'] ) - ) { - // Skip over array keys. - $i = $this->tokens[ $i ]['bracket_closer']; - continue; - } - - if ( \T_COALESCE === $this->tokens[ $i ]['code'] ) { - $validated = true; - } - - // Anything else means this is not a validation coalesce. - break; - } - - if ( false === $validated ) { - $validated = ValidationHelper::is_validated( $this->phpcsFile, $stackPtr, $array_keys, $this->check_validation_in_scope_only ); - } - - if ( false === $validated ) { - $this->phpcsFile->addError( - 'Detected usage of a possibly undefined superglobal array index: %s. Check that the array index exists before using it.', - $stackPtr, - 'InputNotValidated', - $error_data - ); - } - - // If this variable is being tested with one of the `is_..()` functions, sanitization isn't needed. - if ( ContextHelper::is_in_type_test( $this->phpcsFile, $stackPtr ) ) { - return; - } - - // If this is a comparison ('a' == $_POST['foo']), sanitization isn't needed. - if ( VariableHelper::is_comparison( $this->phpcsFile, $stackPtr, false ) ) { - return; - } - - // If this is a comparison using the array comparison functions, sanitization isn't needed. - if ( ContextHelper::is_in_array_comparison( $this->phpcsFile, $stackPtr ) ) { - return; - } - - // Now look for sanitizing functions. - if ( ! $this->is_sanitized( $this->phpcsFile, $stackPtr, array( $this, 'add_unslash_error' ) ) ) { - $this->phpcsFile->addError( - 'Detected usage of a non-sanitized input variable: %s', - $stackPtr, - 'InputNotSanitized', - $error_data - ); - } - } - - /** - * Add an error for missing use of unslashing. - * - * @since 0.5.0 - * @since 3.0.0 - Moved from the `Sniff` class to this class. - * - The `$phpcsFile` parameter was added. - * - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. - * @param int $stackPtr The index of the token in the stack - * which is missing unslashing. - * - * @return void - */ - public function add_unslash_error( File $phpcsFile, $stackPtr ) { - $tokens = $phpcsFile->getTokens(); - $var_name = $tokens[ $stackPtr ]['content']; - - if ( isset( $this->slashed_superglobals[ $var_name ] ) === false ) { - // WP doesn't slash these, so they don't need unslashing. - return; - } - - // We know there will be array keys as that's checked in the process_token() method. - $array_keys = VariableHelper::get_array_access_keys( $phpcsFile, $stackPtr ); - $error_data = array( $var_name . '[' . implode( '][', $array_keys ) . ']' ); - - $phpcsFile->addError( - '%s not unslashed before sanitization. Use wp_unslash() or similar', - $stackPtr, - 'MissingUnslash', - $error_data - ); - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Utils/I18nTextDomainFixerSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Utils/I18nTextDomainFixerSniff.php deleted file mode 100644 index 1d85ea0..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/Utils/I18nTextDomainFixerSniff.php +++ /dev/null @@ -1,862 +0,0 @@ -> Function name as key, array with target - * parameter and name as value. - */ - protected $target_functions = array( - 'load_textdomain' => array( - 'position' => 1, - 'name' => 'domain', - ), - 'load_plugin_textdomain' => array( - 'position' => 1, - 'name' => 'domain', - ), - 'load_muplugin_textdomain' => array( - 'position' => 1, - 'name' => 'domain', - ), - 'load_theme_textdomain' => array( - 'position' => 1, - 'name' => 'domain', - ), - 'load_child_theme_textdomain' => array( - 'position' => 1, - 'name' => 'domain', - ), - 'load_script_textdomain' => array( - 'position' => 2, - 'name' => 'domain', - ), - 'unload_textdomain' => array( - 'position' => 1, - 'name' => 'domain', - ), - - '__' => array( - 'position' => 2, - 'name' => 'domain', - ), - '_e' => array( - 'position' => 2, - 'name' => 'domain', - ), - '_x' => array( - 'position' => 3, - 'name' => 'domain', - ), - '_ex' => array( - 'position' => 3, - 'name' => 'domain', - ), - '_n' => array( - 'position' => 4, - 'name' => 'domain', - ), - '_nx' => array( - 'position' => 5, - 'name' => 'domain', - ), - '_n_noop' => array( - 'position' => 3, - 'name' => 'domain', - ), - '_nx_noop' => array( - 'position' => 4, - 'name' => 'domain', - ), - 'translate_nooped_plural' => array( - 'position' => 3, - 'name' => 'domain', - ), - - 'esc_html__' => array( - 'position' => 2, - 'name' => 'domain', - ), - 'esc_html_e' => array( - 'position' => 2, - 'name' => 'domain', - ), - 'esc_html_x' => array( - 'position' => 3, - 'name' => 'domain', - ), - 'esc_attr__' => array( - 'position' => 2, - 'name' => 'domain', - ), - 'esc_attr_e' => array( - 'position' => 2, - 'name' => 'domain', - ), - 'esc_attr_x' => array( - 'position' => 3, - 'name' => 'domain', - ), - - 'is_textdomain_loaded' => array( - 'position' => 1, - 'name' => 'domain', - ), - 'get_translations_for_domain' => array( - 'position' => 1, - 'name' => 'domain', - ), - - // Deprecated functions. - '_c' => array( - 'position' => 2, - 'name' => 'domain', - ), - '_nc' => array( - 'position' => 4, - 'name' => 'domain', - ), - '__ngettext' => array( - 'position' => 4, - 'name' => 'domain', - ), - '__ngettext_noop' => array( - 'position' => 3, - 'name' => 'domain', - ), - 'translate_with_context' => array( - 'position' => 2, - 'name' => 'domain', - ), - - // Shouldn't be used by plugins/themes. - 'translate' => array( - 'position' => 2, - 'name' => 'domain', - ), - 'translate_with_gettext_context' => array( - 'position' => 3, - 'name' => 'domain', - ), - - // WP private functions. Shouldn't be used by plugins/themes. - '_load_textdomain_just_in_time' => array( - 'position' => 1, - 'name' => 'domain', - ), - '_get_path_to_translation_from_lang_dir' => array( - 'position' => 1, - 'name' => 'domain', - ), - '_get_path_to_translation' => array( - 'position' => 1, - 'name' => 'domain', - ), - ); - - /** - * Whether a valid new text domain was found. - * - * @since 1.2.0 - * - * @var bool - */ - private $is_valid = false; - - /** - * The new text domain as validated. - * - * @since 1.2.0 - * - * @var string - */ - private $validated_textdomain = ''; - - /** - * Whether the plugin/theme header has been seen and fixed yet. - * - * @since 1.2.0 - * - * @var bool - */ - private $header_found = false; - - /** - * Possible headers for a theme. - * - * @link https://developer.wordpress.org/themes/basics/main-stylesheet-style-css/ - * - * @since 1.2.0 - * - * @var array Array key is the header name, the value indicated whether it is a - * required (true) or optional (false) header. - */ - private $theme_headers = array( - 'Theme Name' => true, - 'Theme URI' => false, - 'Author' => true, - 'Author URI' => false, - 'Description' => true, - 'Version' => true, - 'Requires at least' => true, - 'Tested up to' => true, - 'Requires PHP' => true, - 'License' => true, - 'License URI' => true, - 'Text Domain' => true, - 'Tags' => false, - 'Domain Path' => false, - ); - - /** - * Possible headers for a plugin. - * - * @link https://developer.wordpress.org/plugins/plugin-basics/header-requirements/ - * - * @since 1.2.0 - * - * @var array Array key is the header name, the value indicated whether it is a - * required (true) or optional (false) header. - */ - private $plugin_headers = array( - 'Plugin Name' => true, - 'Plugin URI' => false, - 'Description' => false, - 'Version' => false, - 'Requires at least' => false, - 'Requires PHP' => false, - 'Author' => false, - 'Author URI' => false, - 'License' => false, - 'License URI' => false, - 'Text Domain' => false, - 'Domain Path' => false, - 'Network' => false, - 'Update URI' => false, - ); - - /** - * Regex template to match theme/plugin headers. - * - * @since 1.2.0 - * - * @var string - */ - private $header_regex_template = '`^(?:\s*(?:(?:\*|//)\s*)?)?(%s)\s*:\s*([^\r\n]+)`'; - - /** - * Regex to match theme headers. - * - * Set from within the register() method. - * - * @since 1.2.0 - * - * @var string - */ - private $theme_header_regex; - - /** - * Regex to match plugin headers. - * - * Set from within the register() method. - * - * @since 1.2.0 - * - * @var string - */ - private $plugin_header_regex; - - /** - * The --tab-width CLI value that is being used. - * - * @since 1.2.0 - * - * @var int - */ - private $tab_width = null; - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 1.2.0 - * - * @return array - */ - public function register() { - $headers = array_map( - 'preg_quote', - array_keys( $this->theme_headers ), - array_fill( 0, \count( $this->theme_headers ), '`' ) - ); - $this->theme_header_regex = sprintf( $this->header_regex_template, implode( '|', $headers ) ); - - $headers = array_map( - 'preg_quote', - array_keys( $this->plugin_headers ), - array_fill( 0, \count( $this->plugin_headers ), '`' ) - ); - $this->plugin_header_regex = sprintf( $this->header_regex_template, implode( '|', $headers ) ); - - $targets = parent::register(); - - $targets[] = \T_DOC_COMMENT_OPEN_TAG; - $targets[] = \T_COMMENT; - - return $targets; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.2.0 - * - * @param int $stackPtr The position of the current token in the stack. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function process_token( $stackPtr ) { - // Check if the old/new properties are correctly set. If not, bow out. - if ( ! is_string( $this->new_text_domain ) - || '' === $this->new_text_domain - ) { - return $this->phpcsFile->numTokens; - } - - if ( isset( $this->old_text_domain ) ) { - $this->old_text_domain = RulesetPropertyHelper::merge_custom_array( $this->old_text_domain, array(), false ); - - if ( ! is_array( $this->old_text_domain ) - || array() === $this->old_text_domain - ) { - return $this->phpcsFile->numTokens; - } - } - - // Only validate and throw warning about the text domain once. - if ( $this->new_text_domain !== $this->validated_textdomain ) { - $this->is_valid = false; - $this->validated_textdomain = $this->new_text_domain; - $this->header_found = false; - - if ( 'default' === $this->new_text_domain ) { - $this->phpcsFile->addWarning( - 'The "default" text domain is reserved for WordPress core use and should not be used by plugins or themes', - 0, - 'ReservedNewDomain', - array( $this->new_text_domain ) - ); - - return $this->phpcsFile->numTokens; - } - - if ( preg_match( '`^[a-z0-9-]+$`', $this->new_text_domain ) !== 1 ) { - $this->phpcsFile->addWarning( - 'The text domain should be a simple lowercase text string with words separated by dashes. "%s" appears invalid', - 0, - 'InvalidNewDomain', - array( $this->new_text_domain ) - ); - - return $this->phpcsFile->numTokens; - } - - // If the text domain passed both validations, it should be considered valid. - $this->is_valid = true; - - } elseif ( false === $this->is_valid ) { - return $this->phpcsFile->numTokens; - } - - if ( isset( $this->tab_width ) === false ) { - $this->tab_width = Helper::getTabWidth( $this->phpcsFile ); - } - - if ( \T_DOC_COMMENT_OPEN_TAG === $this->tokens[ $stackPtr ]['code'] - || \T_COMMENT === $this->tokens[ $stackPtr ]['code'] - ) { - // Examine for plugin/theme file header. - return $this->process_comments( $stackPtr ); - - } elseif ( isset( $this->phpcsFile->tokenizerType ) === false || 'CSS' !== $this->phpcsFile->tokenizerType ) { - // Examine a T_STRING token in a PHP file as a function call. - return parent::process_token( $stackPtr ); - } - } - - - /** - * Process the parameters of a matched function. - * - * @since 1.2.0 - * - * @param int $stackPtr The position of the current token in the stack. - * @param string $group_name The name of the group which was matched. - * @param string $matched_content The token content (function name) which was matched - * in lowercase. - * @param array $parameters Array with information about the parameters. - * - * @return void - */ - public function process_parameters( $stackPtr, $group_name, $matched_content, $parameters ) { - $target_param_specs = $this->target_functions[ $matched_content ]; - $found_param = PassedParameters::getParameterFromStack( $parameters, $target_param_specs['position'], $target_param_specs['name'] ); - - if ( false === $found_param && 1 !== $target_param_specs['position'] ) { - $error_msg = 'Missing $domain arg'; - $error_code = 'MissingArgDomain'; - - $has_named_params = false; - foreach ( $parameters as $param ) { - if ( isset( $param['name'] ) ) { - $has_named_params = true; - break; - } - } - - if ( false === $has_named_params && isset( $parameters[ ( $target_param_specs['position'] - 1 ) ] ) ) { - $fix = $this->phpcsFile->addFixableError( $error_msg, $stackPtr, $error_code ); - - if ( true === $fix ) { - $start_previous = $parameters[ ( $target_param_specs['position'] - 1 ) ]['start']; - $end_previous = $parameters[ ( $target_param_specs['position'] - 1 ) ]['end']; - if ( \T_WHITESPACE === $this->tokens[ $start_previous ]['code'] - && $this->tokens[ $start_previous ]['content'] === $this->phpcsFile->eolChar - ) { - // Replicate the new line + indentation of the previous item. - $replacement = ','; - for ( $i = $start_previous; $i <= $end_previous; $i++ ) { - if ( \T_WHITESPACE !== $this->tokens[ $i ]['code'] ) { - break; - } - - if ( isset( $this->tokens[ $i ]['orig_content'] ) ) { - $replacement .= $this->tokens[ $i ]['orig_content']; - } else { - $replacement .= $this->tokens[ $i ]['content']; - } - } - - $replacement .= "'{$this->new_text_domain}'"; - } else { - $replacement = ", '{$this->new_text_domain}'"; - } - - if ( \T_WHITESPACE === $this->tokens[ $end_previous ]['code'] ) { - $this->phpcsFile->fixer->addContentBefore( $end_previous, $replacement ); - } else { - $this->phpcsFile->fixer->addContent( $end_previous, $replacement ); - } - } - } elseif ( true === $has_named_params ) { - /* - * Function call using named arguments. For now, we will not auto-fix this. - * - * {@internal If we don't bother with indentation and such, this can be made - * auto-fixable by getting the 'end' of the last seen parameter and adding the - * domain parameter, with the 'domain: ' parameter label, after the last - * seen parameter.} - */ - $this->phpcsFile->addError( $error_msg, $stackPtr, $error_code ); - } else { - $error_msg .= ' and preceding argument(s)'; - $error_code = 'MissingArgs'; - - // Expected preceding param also missing, just throw the warning. - $this->phpcsFile->addWarning( $error_msg, $stackPtr, $error_code ); - } - - return; - } - - // Target parameter found. Let's examine it. - $domain_param_start = $found_param['start']; - $domain_param_end = $found_param['end']; - $domain_token = null; - - for ( $i = $domain_param_start; $i <= $domain_param_end; $i++ ) { - if ( isset( Tokens::$emptyTokens[ $this->tokens[ $i ]['code'] ] ) ) { - continue; - } - - if ( \T_CONSTANT_ENCAPSED_STRING !== $this->tokens[ $i ]['code'] ) { - // Unexpected token found, not our concern. This is handled by the I18n sniff. - return; - } - - if ( isset( $domain_token ) ) { - // More than one T_CONSTANT_ENCAPSED_STRING found, not our concern. This is handled by the I18n sniff. - return; - } - - $domain_token = $i; - } - - // If we're still here, this means only one T_CONSTANT_ENCAPSED_STRING was found. - $old_domain = TextStrings::stripQuotes( $this->tokens[ $domain_token ]['content'] ); - - if ( ! \in_array( $old_domain, $this->old_text_domain, true ) ) { - // Not a text domain targeted for replacement, ignore. - return; - } - - $fix = $this->phpcsFile->addFixableError( - 'Mismatched text domain. Expected \'%s\' but found \'%s\'', - $domain_token, - 'TextDomainMismatch', - array( $this->new_text_domain, $old_domain ) - ); - - if ( true === $fix ) { - $replacement = str_replace( $old_domain, $this->new_text_domain, $this->tokens[ $domain_token ]['content'] ); - $this->phpcsFile->fixer->replaceToken( $domain_token, $replacement ); - } - } - - /** - * Process the function if no parameters were found. - * - * @since 1.2.0 - * - * @param int $stackPtr The position of the current token in the stack. - * @param string $group_name The name of the group which was matched. - * @param string $matched_content The token content (function name) which was matched - * in lowercase. - * - * @return void - */ - public function process_no_parameters( $stackPtr, $group_name, $matched_content ) { - $target_param = $this->target_functions[ $matched_content ]; - - if ( 1 !== $target_param['position'] ) { - // Only process the no param case as fixable if the text domain is expected to be the first parameter. - $this->phpcsFile->addWarning( 'Missing $domain arg and preceding argument(s)', $stackPtr, 'MissingArgs' ); - return; - } - - $opener = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $stackPtr + 1 ), null, true ); - if ( \T_OPEN_PARENTHESIS !== $this->tokens[ $opener ]['code'] - || isset( $this->tokens[ $opener ]['parenthesis_closer'] ) === false - ) { - // Parse error or live coding. - return; - } - - $fix = $this->phpcsFile->addFixableError( 'Missing $domain arg', $stackPtr, 'MissingArgDomain' ); - if ( true === $fix ) { - $closer = $this->tokens[ $opener ]['parenthesis_closer']; - $replacement = " '{$this->new_text_domain}' "; - - if ( $this->tokens[ $opener ]['line'] !== $this->tokens[ $closer ]['line'] ) { - $replacement = trim( $replacement ); - $addBefore = ( $closer - 1 ); - if ( \T_WHITESPACE === $this->tokens[ ( $closer - 1 ) ]['code'] - && $this->tokens[ $closer - 1 ]['line'] === $this->tokens[ $closer ]['line'] - ) { - if ( isset( $this->tokens[ ( $closer - 1 ) ]['orig_content'] ) ) { - $replacement = $this->tokens[ ( $closer - 1 ) ]['orig_content'] - . "\t" - . $replacement; - } else { - $replacement = $this->tokens[ ( $closer - 1 ) ]['content'] - . str_repeat( ' ', $this->tab_width ) - . $replacement; - } - - --$addBefore; - } else { - // We don't know whether the code uses tabs or spaces, so presume WPCS, i.e. tabs. - $replacement = "\t" . $replacement; - } - - $replacement = $this->phpcsFile->eolChar . $replacement; - - $this->phpcsFile->fixer->addContentBefore( $addBefore, $replacement ); - - } elseif ( \T_WHITESPACE === $this->tokens[ ( $closer - 1 ) ]['code'] ) { - $this->phpcsFile->fixer->replaceToken( ( $closer - 1 ), $replacement ); - } else { - $this->phpcsFile->fixer->addContentBefore( $closer, $replacement ); - } - } - } - - - /** - * Process comments to find the plugin/theme headers. - * - * @since 1.2.0 - * - * @param int $stackPtr The position of the current token in the stack. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function process_comments( $stackPtr ) { - if ( true === $this->header_found && ! defined( 'PHP_CODESNIFFER_IN_TESTS' ) ) { - return; - } - - $regex = $this->plugin_header_regex; - $headers = $this->plugin_headers; - $type = 'plugin'; - - $file = FilePath::getName( $this->phpcsFile ); - if ( 'STDIN' === $file ) { - return; - } - - $file_name = basename( $file ); - if ( isset( $this->phpcsFile->tokenizerType ) && 'CSS' === $this->phpcsFile->tokenizerType ) { - if ( 'style.css' !== $file_name && ! defined( 'PHP_CODESNIFFER_IN_TESTS' ) ) { - // CSS files only need to be examined for the file header. - return $this->phpcsFile->numTokens; - } - - $regex = $this->theme_header_regex; - $headers = $this->theme_headers; - $type = 'theme'; - } - - $comment_details = array( - 'required_header_found' => false, - 'headers_found' => 0, - 'text_domain_ptr' => false, - 'text_domain_found' => '', - 'last_header_ptr' => false, - 'last_header_matches' => array(), - ); - - if ( \T_COMMENT === $this->tokens[ $stackPtr ]['code'] ) { - $block_comment = false; - if ( substr( $this->tokens[ $stackPtr ]['content'], 0, 2 ) === '/*' ) { - $block_comment = true; - } - - $current = $stackPtr; - do { - if ( false === $comment_details['text_domain_ptr'] - || false === $comment_details['required_header_found'] - || $comment_details['headers_found'] < 3 - ) { - $comment_details = $this->examine_comment_line( $current, $regex, $headers, $comment_details ); - } - - if ( true === $block_comment && substr( $this->tokens[ $current ]['content'], -2 ) === '*/' ) { - ++$current; - break; - } - - ++$current; - } while ( isset( $this->tokens[ $current ] ) && \T_COMMENT === $this->tokens[ $current ]['code'] ); - - $skip_to = $current; - - } else { - if ( ! isset( $this->tokens[ $stackPtr ]['comment_closer'] ) ) { - return; - } - - $closer = $this->tokens[ $stackPtr ]['comment_closer']; - $current = $stackPtr; - - while ( ( $current = $this->phpcsFile->findNext( \T_DOC_COMMENT_STRING, ( $current + 1 ), $closer ) ) !== false ) { - $comment_details = $this->examine_comment_line( $current, $regex, $headers, $comment_details ); - - if ( false !== $comment_details['text_domain_ptr'] - && true === $comment_details['required_header_found'] - && $comment_details['headers_found'] >= 3 - ) { - // No need to look at the rest of the docblock. - break; - } - } - - $skip_to = $closer; - } - - // So, was this the plugin/theme header ? - if ( true === $comment_details['required_header_found'] - && $comment_details['headers_found'] >= 3 - ) { - $this->header_found = true; - - $text_domain_ptr = $comment_details['text_domain_ptr']; - $text_domain_found = $comment_details['text_domain_found']; - - if ( false !== $text_domain_ptr ) { - if ( $this->new_text_domain !== $text_domain_found - && ( \in_array( $text_domain_found, $this->old_text_domain, true ) ) - ) { - $fix = $this->phpcsFile->addFixableError( - 'Mismatched text domain in %s header. Expected \'%s\' but found \'%s\'', - $text_domain_ptr, - 'TextDomainHeaderMismatch', - array( - $type, - $this->new_text_domain, - $text_domain_found, - ) - ); - - if ( true === $fix ) { - if ( isset( $this->tokens[ $text_domain_ptr ]['orig_content'] ) ) { - $replacement = $this->tokens[ $text_domain_ptr ]['orig_content']; - } else { - $replacement = $this->tokens[ $text_domain_ptr ]['content']; - } - - $replacement = str_replace( $text_domain_found, $this->new_text_domain, $replacement ); - - $this->phpcsFile->fixer->replaceToken( $text_domain_ptr, $replacement ); - } - } - } else { - $last_header_ptr = $comment_details['last_header_ptr']; - $last_header_matches = $comment_details['last_header_matches']; - - $fix = $this->phpcsFile->addFixableError( - 'Missing "Text Domain" in %s header', - $last_header_ptr, - 'MissingTextDomainHeader', - array( $type ) - ); - - if ( true === $fix ) { - if ( isset( $this->tokens[ $last_header_ptr ]['orig_content'] ) ) { - $replacement = $this->tokens[ $last_header_ptr ]['orig_content']; - } else { - $replacement = $this->tokens[ $last_header_ptr ]['content']; - } - - $replacement = str_replace( $last_header_matches[1], 'Text Domain', $replacement ); - $replacement = str_replace( $last_header_matches[2], $this->new_text_domain, $replacement ); - - if ( \T_DOC_COMMENT_OPEN_TAG === $this->tokens[ $stackPtr ]['code'] ) { - for ( $i = ( $last_header_ptr - 1 ); ; $i-- ) { - if ( $this->tokens[ $i ]['line'] !== $this->tokens[ $last_header_ptr ]['line'] ) { - ++$i; - break; - } - } - - $replacement = $this->phpcsFile->eolChar - . GetTokensAsString::origContent( $this->phpcsFile, $i, ( $last_header_ptr - 1 ) ) - . $replacement; - } - - $this->phpcsFile->fixer->addContent( $comment_details['last_header_ptr'], $replacement ); - } - } - } - - return $skip_to; - } - - /** - * Examine an individual token in a larger comment for plugin/theme headers. - * - * @since 1.2.0 - * - * @param int $stackPtr The position of the current token in the stack. - * @param string $regex The regex to use to examine the comment line. - * @param array $headers Valid headers for a plugin or theme. - * @param array $comment_details The information collected so far. - * - * @return array Adjusted $comment_details array - */ - protected function examine_comment_line( $stackPtr, $regex, $headers, $comment_details ) { - if ( preg_match( $regex, $this->tokens[ $stackPtr ]['content'], $matches ) === 1 ) { - ++$comment_details['headers_found']; - - if ( true === $headers[ $matches[1] ] ) { - $comment_details['required_header_found'] = true; - } - - if ( 'Text Domain' === $matches[1] ) { - $comment_details['text_domain_ptr'] = $stackPtr; - $comment_details['text_domain_found'] = trim( $matches[2] ); - } - - $comment_details['last_header_ptr'] = $stackPtr; - $comment_details['last_header_matches'] = $matches; - } - - return $comment_details; - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/AlternativeFunctionsSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/AlternativeFunctionsSniff.php deleted file mode 100644 index 40fb0c6..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/AlternativeFunctionsSniff.php +++ /dev/null @@ -1,371 +0,0 @@ - true, - 'php://output' => true, - 'php://stdin' => true, - 'php://stdout' => true, - 'php://stderr' => true, - ); - - /** - * Local input streams which should not be flagged for the file system function checks if - * the $filename starts with them. - * - * @link https://www.php.net/wrappers.php - * - * @since 2.1.0 - * @since 3.0.0 The visibility was changed from `protected` to `private`. - * - * @var array - */ - private $allowed_local_stream_partials = array( - 'php://temp/', - 'php://fd/', - ); - - /** - * Local input stream constants which should not be flagged for the file system function checks. - * - * @link https://www.php.net/wrappers.php - * - * @since 2.1.0 - * @since 3.0.0 The visibility was changed from `protected` to `private`. - * - * @var array - */ - private $allowed_local_stream_constants = array( - 'STDIN' => true, - 'STDOUT' => true, - 'STDERR' => true, - ); - - /** - * Groups of functions to restrict. - * - * Example: groups => array( - * 'lambda' => array( - * 'type' => 'error' | 'warning', - * 'message' => 'Use anonymous functions instead please!', - * 'since' => '4.9.0', //=> the WP version in which the alternative became available. - * 'functions' => array( 'file_get_contents', 'create_function' ), - * ) - * ) - * - * @return array - */ - public function getGroups() { - return array( - 'curl' => array( - 'type' => 'warning', - 'message' => 'Using cURL functions is highly discouraged. Use wp_remote_get() instead.', - 'since' => '2.7.0', - 'functions' => array( - 'curl_*', - ), - 'allow' => array( - 'curl_version' => true, - ), - ), - - 'parse_url' => array( - 'type' => 'warning', - 'message' => '%s() is discouraged because of inconsistency in the output across PHP versions; use wp_parse_url() instead.', - 'since' => '4.4.0', - 'functions' => array( - 'parse_url', - ), - ), - - 'json_encode' => array( - 'type' => 'warning', - 'message' => '%s() is discouraged. Use wp_json_encode() instead.', - 'since' => '4.1.0', - 'functions' => array( - 'json_encode', - ), - ), - - 'file_get_contents' => array( - 'type' => 'warning', - 'message' => '%s() is discouraged. Use wp_remote_get() for remote URLs instead.', - 'since' => '2.7.0', - 'functions' => array( - 'file_get_contents', - ), - ), - - 'unlink' => array( - 'type' => 'warning', - 'message' => '%s() is discouraged. Use wp_delete_file() to delete a file.', - 'since' => '4.2.0', - 'functions' => array( - 'unlink', - ), - ), - - 'rename' => array( - 'type' => 'warning', - 'message' => '%s() is discouraged. Use WP_Filesystem::move() to rename a file.', - 'since' => '2.5.0', - 'functions' => array( - 'rename', - ), - ), - - 'file_system_operations' => array( - 'type' => 'warning', - 'message' => 'File operations should use WP_Filesystem methods instead of direct PHP filesystem calls. Found: %s().', - 'since' => '2.5.0', - 'functions' => array( - 'chgrp', - 'chmod', - 'chown', - 'fclose', - 'file_put_contents', - 'fopen', - 'fputs', - 'fread', - 'fsockopen', - 'fwrite', - 'is_writable', - 'is_writeable', - 'mkdir', - 'pfsockopen', - 'readfile', - 'rmdir', - 'touch', - ), - ), - - 'strip_tags' => array( - 'type' => 'warning', - 'message' => '%s() is discouraged. Use the more comprehensive wp_strip_all_tags() instead.', - 'since' => '2.9.0', - 'functions' => array( - 'strip_tags', - ), - ), - - 'rand_seeding' => array( - 'type' => 'warning', - 'message' => '%s() is discouraged. Rand seeding is not necessary when using the wp_rand() function (as you should).', - 'since' => '2.6.2', - 'functions' => array( - 'mt_srand', - 'srand', - ), - ), - - 'rand' => array( - 'type' => 'warning', - 'message' => '%s() is discouraged. Use the far less predictable wp_rand() instead.', - 'since' => '2.6.2', - 'functions' => array( - 'mt_rand', - 'rand', - ), - ), - ); - } - - /** - * Process a matched token. - * - * @param int $stackPtr The position of the current token in the stack. - * @param string $group_name The name of the group which was matched. - * @param string $matched_content The token content (function name) which was matched - * in lowercase. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function process_matched_token( $stackPtr, $group_name, $matched_content ) { - - $this->set_minimum_wp_version(); - - /* - * Deal with exceptions. - */ - switch ( $matched_content ) { - case 'strip_tags': - /* - * The function `wp_strip_all_tags()` is only a valid alternative when - * only the first parameter, `$string`, is passed to `strip_tags()`. - */ - $has_allowed_tags = PassedParameters::getParameter( $this->phpcsFile, $stackPtr, 2, 'allowed_tags' ); - if ( false !== $has_allowed_tags ) { - return; - } - - unset( $has_allowed_tags ); - break; - - case 'parse_url': - /* - * Before WP 4.7.0, the function `wp_parse_url()` was only a valid alternative - * if the second param - `$component` - was not passed to `parse_url()`. - * - * @see https://developer.wordpress.org/reference/functions/wp_parse_url/#changelog - */ - $has_component = PassedParameters::getParameter( $this->phpcsFile, $stackPtr, 2, 'component' ); - if ( false !== $has_component - && $this->wp_version_compare( $this->minimum_wp_version, '4.7.0', '<' ) - ) { - return; - } - - unset( $has_component ); - break; - - case 'file_get_contents': - /* - * Using `wp_remote_get()` will only work for remote URLs. - * See if we can determine if this function call is for a local file and if so, bow out. - */ - $params = PassedParameters::getParameters( $this->phpcsFile, $stackPtr ); - - $use_include_path_param = PassedParameters::getParameterFromStack( $params, 2, 'use_include_path' ); - if ( false !== $use_include_path_param && 'true' === $use_include_path_param['clean'] ) { - // Setting `$use_include_path` to `true` is only relevant for local files. - return; - } - - $filename_param = PassedParameters::getParameterFromStack( $params, 1, 'filename' ); - if ( false === $filename_param ) { - // If the file to get is not set, this is a non-issue anyway. - return; - } - - if ( strpos( $filename_param['clean'], 'http:' ) !== false - || strpos( $filename_param['clean'], 'https:' ) !== false - ) { - // Definitely a URL, throw notice. - break; - } - - $contains_wp_path_constant = preg_match( - '`\b(?:ABSPATH|WP_(?:CONTENT|PLUGIN)_DIR|WPMU_PLUGIN_DIR|TEMPLATEPATH|STYLESHEETPATH|(?:MU)?PLUGINDIR)\b`', - $filename_param['clean'] - ); - if ( 1 === $contains_wp_path_constant ) { - // Using any of the constants matched in this regex is an indicator of a local file. - return; - } - - $contains_wp_path_function_call = preg_match( - '`(?:get_home_path|plugin_dir_path|get_(?:stylesheet|template)_directory|wp_upload_dir)\s*\(`i', - $filename_param['clean'] - ); - if ( 1 === $contains_wp_path_function_call ) { - // Using any of the functions matched in the regex is an indicator of a local file. - return; - } - - if ( $this->is_local_data_stream( $filename_param['clean'] ) === true ) { - // Local data stream. - return; - } - - unset( $params, $use_include_path_param, $filename_param, $contains_wp_path_constant, $contains_wp_path_function_call ); - break; - - case 'file_put_contents': - case 'fopen': - case 'readfile': - /* - * Allow for handling raw data streams from the request body. - * - * Note: at this time (December 2022) these three functions use the same parameter name for their - * first parameter. If this would change at any point in the future, this code will need to - * be made more modular and will need to pass the parameter name based on the function call detected. - */ - $filename_param = PassedParameters::getParameter( $this->phpcsFile, $stackPtr, 1, 'filename' ); - if ( false === $filename_param ) { - // If the file to work with is not set, local data streams don't come into play. - break; - } - - if ( $this->is_local_data_stream( $filename_param['clean'] ) === true ) { - // Local data stream. - return; - } - - unset( $filename_param ); - break; - } - - if ( ! isset( $this->groups[ $group_name ]['since'] ) ) { - return parent::process_matched_token( $stackPtr, $group_name, $matched_content ); - } - - // Verify if the alternative is available in the minimum supported WP version. - if ( $this->wp_version_compare( $this->groups[ $group_name ]['since'], $this->minimum_wp_version, '<=' ) ) { - return parent::process_matched_token( $stackPtr, $group_name, $matched_content ); - } - } - - /** - * Determine based on the "clean" parameter value, whether a file parameter points to - * a local data stream. - * - * @param string $clean_param_value Parameter value without comments. - * - * @return bool True if this is a local data stream. False otherwise. - */ - protected function is_local_data_stream( $clean_param_value ) { - - $stripped = TextStrings::stripQuotes( $clean_param_value ); - if ( isset( $this->allowed_local_streams[ $stripped ] ) - || isset( $this->allowed_local_stream_constants[ $clean_param_value ] ) - ) { - return true; - } - - foreach ( $this->allowed_local_stream_partials as $partial ) { - if ( strpos( $stripped, $partial ) === 0 ) { - return true; - } - } - - return false; - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/CapabilitiesSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/CapabilitiesSniff.php deleted file mode 100644 index 758359f..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/CapabilitiesSniff.php +++ /dev/null @@ -1,479 +0,0 @@ - The key is the name of a function we're targeting, - * the value is an array containing the 1-based parameter position - * of the "capability" parameter within the function, as well as - * the name of the parameter as declared in the function. - * If the parameter name has been renamed since the release of PHP 8.0, - * the parameter can be set as an array. - */ - protected $target_functions = array( - 'add_comments_page' => array( - 'position' => 3, - 'name' => 'capability', - ), - 'add_dashboard_page' => array( - 'position' => 3, - 'name' => 'capability', - ), - 'add_links_page' => array( - 'position' => 3, - 'name' => 'capability', - ), - 'add_management_page' => array( - 'position' => 3, - 'name' => 'capability', - ), - 'add_media_page' => array( - 'position' => 3, - 'name' => 'capability', - ), - 'add_menu_page' => array( - 'position' => 3, - 'name' => 'capability', - ), - 'add_object_page' => array( // Deprecated since WP 4.5.0. - 'position' => 3, - 'name' => 'capability', - ), - 'add_options_page' => array( - 'position' => 3, - 'name' => 'capability', - ), - 'add_pages_page' => array( - 'position' => 3, - 'name' => 'capability', - ), - 'add_plugins_page' => array( - 'position' => 3, - 'name' => 'capability', - ), - 'add_posts_page' => array( - 'position' => 3, - 'name' => 'capability', - ), - 'add_submenu_page' => array( - 'position' => 4, - 'name' => 'capability', - ), - 'add_theme_page' => array( - 'position' => 3, - 'name' => 'capability', - ), - 'add_users_page' => array( - 'position' => 3, - 'name' => 'capability', - ), - 'add_utility_page' => array( // Deprecated since WP 4.5.0. - 'position' => 3, - 'name' => 'capability', - ), - 'author_can' => array( - 'position' => 2, - 'name' => 'capability', - ), - 'current_user_can' => array( - 'position' => 1, - 'name' => 'capability', - ), - 'current_user_can_for_blog' => array( - 'position' => 2, - 'name' => 'capability', - ), - 'map_meta_cap' => array( - 'position' => 1, - 'name' => 'cap', - ), - 'user_can' => array( - 'position' => 2, - 'name' => 'capability', - ), - ); - - /** - * List of core roles which should not to be used directly. - * - * @since 3.0.0 - * - * @var array Key is role available in WP Core, value irrelevant. - */ - private $core_roles = array( - 'super_admin' => true, - 'administrator' => true, - 'editor' => true, - 'author' => true, - 'contributor' => true, - 'subscriber' => true, - ); - - /** - * List of known primitive and meta core capabilities. - * - * Sources: - * - {@link https://wordpress.org/support/article/roles-and-capabilities/ Roles and Capabilities handbook page} - * - The `map_meta_cap()` function in the `src/wp-includes/capabilities.php` file. - * - The tests in the `tests/phpunit/tests/user/capabilities.php` file. - * - * List is sorted alphabetically. - * - * {@internal To be updated after every major release. Last updated for WordPress 6.9.0-RC2.} - * - * @since 3.0.0 - * - * @var array All capabilities available in core. - */ - private $core_capabilities = array( - 'activate_plugin' => true, - 'activate_plugins' => true, - 'add_comment_meta' => true, - 'add_post_meta' => true, - 'add_term_meta' => true, - 'add_user_meta' => true, - 'add_users' => true, - 'assign_categories' => true, - 'assign_post_tags' => true, - 'assign_term' => true, - 'create_app_password' => true, - 'create_sites' => true, - 'create_users' => true, - 'customize' => true, - 'deactivate_plugin' => true, - 'deactivate_plugins' => true, - 'delete_app_password' => true, - 'delete_app_passwords' => true, - 'delete_block' => true, // Only seen in tests. - 'delete_blocks' => true, // Alias for 'delete_posts', but supported. - 'delete_categories' => true, - 'delete_comment_meta' => true, - 'delete_others_blocks' => true, // Alias for 'delete_others_posts', but supported. - 'delete_others_pages' => true, - 'delete_others_posts' => true, - 'delete_page' => true, // Alias, but supported. - 'delete_pages' => true, - 'delete_plugins' => true, - 'delete_post_tags' => true, - 'delete_post' => true, // Alias, but supported. - 'delete_post_meta' => true, - 'delete_posts' => true, - 'delete_private_blocks' => true, // Alias for 'delete_private_posts', but supported. - 'delete_private_pages' => true, - 'delete_private_posts' => true, - 'delete_published_blocks' => true, // Alias for 'delete_published_posts', but supported. - 'delete_published_pages' => true, - 'delete_published_posts' => true, - 'delete_site' => true, - 'delete_sites' => true, - 'delete_term' => true, - 'delete_term_meta' => true, - 'delete_themes' => true, - 'delete_user' => true, // Alias for 'delete_users', but supported. - 'delete_user_meta' => true, - 'delete_users' => true, - 'edit_app_password' => true, - 'edit_categories' => true, - 'edit_block' => true, // Only seen in tests. - 'edit_block_binding' => true, - 'edit_blocks' => true, // Alias for 'edit_posts', but supported. - 'edit_comment' => true, // Alias, but supported. - 'edit_comment_meta' => true, - 'edit_css' => true, - 'edit_dashboard' => true, - 'edit_files' => true, - 'edit_others_blocks' => true, // Alias for 'edit_others_posts', but supported. - 'edit_others_pages' => true, - 'edit_others_posts' => true, - 'edit_page' => true, // Alias, but supported. - 'edit_pages' => true, - 'edit_plugins' => true, - 'edit_post_tags' => true, - 'edit_post' => true, // Alias, but supported. - 'edit_post_meta' => true, - 'edit_posts' => true, - 'edit_private_blocks' => true, // Alias for 'edit_private_posts', but supported. - 'edit_private_pages' => true, - 'edit_private_posts' => true, - 'edit_published_blocks' => true, // Alias for 'edit_published_posts', but supported. - 'edit_published_pages' => true, - 'edit_published_posts' => true, - 'edit_term' => true, - 'edit_term_meta' => true, - 'edit_theme_options' => true, - 'edit_themes' => true, - 'edit_user' => true, // Alias for 'edit_users', but supported. - 'edit_user_meta' => true, - 'edit_users' => true, - 'erase_others_personal_data' => true, - 'export' => true, - 'export_others_personal_data' => true, - 'import' => true, - 'install_languages' => true, - 'install_plugins' => true, - 'install_themes' => true, - 'list_app_passwords' => true, - 'list_users' => true, - 'manage_categories' => true, - 'manage_links' => true, - 'manage_network' => true, - 'manage_network_options' => true, - 'manage_network_plugins' => true, - 'manage_network_themes' => true, - 'manage_network_users' => true, - 'manage_options' => true, - 'manage_post_tags' => true, - 'manage_privacy_options' => true, - 'manage_sites' => true, - 'moderate_comments' => true, - 'publish_blocks' => true, // Alias for 'publish_posts', but supported. - 'publish_pages' => true, - 'publish_post' => true, // Alias, but supported. - 'publish_posts' => true, - 'promote_user' => true, - 'promote_users' => true, - 'read' => true, - 'read_block' => true, // Only seen in tests. - 'read_post' => true, // Alias, but supported. - 'read_page' => true, // Alias, but supported. - 'read_app_password' => true, - 'read_private_blocks' => true, // Alias for 'read_private_posts', but supported. - 'read_private_pages' => true, - 'read_private_posts' => true, - 'remove_user' => true, // Alias for 'remove_users', but supported. - 'remove_users' => true, - 'resume_plugin' => true, // Alias for 'resume_plugins', but supported. - 'resume_plugins' => true, - 'resume_theme' => true, // Alias for 'resume_themes', but supported. - 'resume_themes' => true, - 'setup_network' => true, - 'switch_themes' => true, - 'unfiltered_html' => true, - 'unfiltered_upload' => true, - 'update_core' => true, - 'update_https' => true, - 'update_languages' => true, - 'update_plugins' => true, - 'update_php' => true, - 'update_themes' => true, - 'upgrade_network' => true, - 'upload_files' => true, - 'upload_plugins' => true, - 'upload_themes' => true, - 'view_site_health_checks' => true, - ); - - /** - * List of deprecated core capabilities. - * - * User Levels were deprecated in version 3.0. - * - * {@internal To be updated after every major release. Last updated for WordPress 6.1.0.} - * - * @link https://github.com/WordPress/wordpress-develop/blob/master/tests/phpunit/tests/user/capabilities.php - * - * @since 3.0.0 - * - * @var array All deprecated capabilities in core. - */ - private $deprecated_capabilities = array( - 'level_10' => '3.0.0', - 'level_9' => '3.0.0', - 'level_8' => '3.0.0', - 'level_7' => '3.0.0', - 'level_6' => '3.0.0', - 'level_5' => '3.0.0', - 'level_4' => '3.0.0', - 'level_3' => '3.0.0', - 'level_2' => '3.0.0', - 'level_1' => '3.0.0', - 'level_0' => '3.0.0', - ); - - /** - * Process the parameters of a matched function. - * - * @since 3.0.0 - * - * @param int $stackPtr The position of the current token in the stack. - * @param string $group_name The name of the group which was matched. - * @param string $matched_content The token content (function name) which was matched - * in lowercase. - * @param array $parameters Array with information about the parameters. - * - * @return void - */ - public function process_parameters( $stackPtr, $group_name, $matched_content, $parameters ) { - $function_details = $this->target_functions[ $matched_content ]; - - $parameter = PassedParameters::getParameterFromStack( - $parameters, - $function_details['position'], - $function_details['name'] - ); - - if ( false === $parameter ) { - return; - } - - // If the parameter is anything other than T_CONSTANT_ENCAPSED_STRING throw a warning and bow out. - $first_non_empty = null; - for ( $i = $parameter['start']; $i <= $parameter['end']; $i++ ) { - if ( isset( Tokens::$emptyTokens[ $this->tokens[ $i ]['code'] ] ) ) { - continue; - } - - if ( \T_CONSTANT_ENCAPSED_STRING !== $this->tokens[ $i ]['code'] - || null !== $first_non_empty - ) { - // Throw warning at low severity. - $this->phpcsFile->addWarning( - 'Couldn\'t determine the value passed to the $%s parameter in function call to %s(). Please check if it matches a valid capability. Found: %s', - $i, - 'Undetermined', - array( - $function_details['name'], - $matched_content, - $parameter['clean'], - ), - 3 // Message severity set to below default. - ); - return; - } - - $first_non_empty = $i; - } - - if ( null === $first_non_empty ) { - // Parse error. Bow out. - return; - } - - /* - * As of this point we know that the `$capabilities` parameter only contains the one token - * and that that token is a `T_CONSTANT_ENCAPSED_STRING`. - */ - $matched_parameter = TextStrings::stripQuotes( $this->tokens[ $first_non_empty ]['content'] ); - - if ( isset( $this->core_capabilities[ $matched_parameter ] ) ) { - return; - } - - if ( empty( $matched_parameter ) ) { - $this->phpcsFile->addError( - 'An empty string is not a valid capability. Empty string found as the $%s parameter in a function call to %s()"', - $first_non_empty, - 'Invalid', - array( - $function_details['name'], - $matched_content, - ) - ); - return; - } - - // Check if additional capabilities were registered via the ruleset and if the found capability matches any of those. - $custom_capabilities = RulesetPropertyHelper::merge_custom_array( $this->custom_capabilities, array() ); - if ( isset( $custom_capabilities[ $matched_parameter ] ) ) { - return; - } - - if ( isset( $this->deprecated_capabilities[ $matched_parameter ] ) ) { - $this->set_minimum_wp_version(); - $is_error = $this->wp_version_compare( $this->deprecated_capabilities[ $matched_parameter ], $this->minimum_wp_version, '<' ); - - $data = array( - $matched_parameter, - $matched_content, - $this->deprecated_capabilities[ $matched_parameter ], - ); - - MessageHelper::addMessage( - $this->phpcsFile, - 'The capability "%s", found in the function call to %s(), has been deprecated since WordPress version %s.', - $first_non_empty, - $is_error, - 'Deprecated', - $data - ); - return; - } - - if ( isset( $this->core_roles[ $matched_parameter ] ) ) { - $this->phpcsFile->addError( - 'Capabilities should be used instead of roles. Found "%s" in function call to %s()', - $first_non_empty, - 'RoleFound', - array( - $matched_parameter, - $matched_content, - ) - ); - return; - } - - $this->phpcsFile->addWarning( - 'Found unknown capability "%s" in function call to %s(). Please check the spelling of the capability. If this is a custom capability, please verify the capability is registered with WordPress via a call to WP_Role(s)->add_cap().' . \PHP_EOL . 'Custom capabilities can be made known to this sniff by setting the "custom_capabilities" property in the PHPCS ruleset.', - $first_non_empty, - 'Unknown', - array( - $matched_parameter, - $matched_content, - ) - ); - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/CapitalPDangitSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/CapitalPDangitSniff.php deleted file mode 100644 index c183f15..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/CapitalPDangitSniff.php +++ /dev/null @@ -1,315 +0,0 @@ -\'"()]*?\.(?:php|js|css|png|j[e]?pg|gif|pot))#i'; - - /** - * Regex to match a large number or spelling variations of WordPress in class names. - * - * @var string - */ - const WP_CLASSNAME_REGEX = '`(?:^|_)(Word[_]*Pres+)(?:_|$)`i'; - - /** - * Comment tokens we want to listen for as they contain text strings. - * - * @var array - */ - private $comment_text_tokens = array( - \T_DOC_COMMENT => \T_DOC_COMMENT, - \T_DOC_COMMENT_STRING => \T_DOC_COMMENT_STRING, - \T_COMMENT => \T_COMMENT, - ); - - /** - * Combined text string and comment tokens array. - * - * This property is set in the register() method and used for lookups. - * - * @var array - */ - private $text_and_comment_tokens = array(); - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 0.12.0 - * - * @return array - */ - public function register() { - // Union the arrays - keeps the array keys. - $this->text_and_comment_tokens = ( Tokens::$textStringTokens + $this->comment_text_tokens ); - - $targets = $this->text_and_comment_tokens; - $targets += Tokens::$ooScopeTokens; - $targets[ \T_NAMESPACE ] = \T_NAMESPACE; - - // Also sniff for array tokens to make skipping anything within those more efficient. - $targets += Collections::arrayOpenTokensBC(); - $targets += Collections::listTokens(); - $targets[ \T_OPEN_SQUARE_BRACKET ] = \T_OPEN_SQUARE_BRACKET; - - return $targets; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 0.12.0 - * - * @param int $stackPtr The position of the current token in the stack. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function process_token( $stackPtr ) { - /* - * Ignore tokens within array and list definitions as well as within - * array keys as this is a false positive in 80% of all cases. - * - * The return values skip to the end of the array. - * This prevents the sniff "hanging" on very long configuration arrays. - */ - if ( ( \T_ARRAY === $this->tokens[ $stackPtr ]['code'] - || \T_LIST === $this->tokens[ $stackPtr ]['code'] ) - && isset( $this->tokens[ $stackPtr ]['parenthesis_closer'] ) - ) { - return $this->tokens[ $stackPtr ]['parenthesis_closer']; - } - - if ( ( \T_OPEN_SHORT_ARRAY === $this->tokens[ $stackPtr ]['code'] - || \T_OPEN_SQUARE_BRACKET === $this->tokens[ $stackPtr ]['code'] ) - && isset( $this->tokens[ $stackPtr ]['bracket_closer'] ) - ) { - return $this->tokens[ $stackPtr ]['bracket_closer']; - } - - /* - * Deal with misspellings in namespace names. - * These are not auto-fixable, but need the attention of a developer. - */ - if ( \T_NAMESPACE === $this->tokens[ $stackPtr ]['code'] ) { - $ns_name = Namespaces::getDeclaredName( $this->phpcsFile, $stackPtr ); - if ( empty( $ns_name ) ) { - // Namespace operator or declaration without name. - return; - } - - $levels = explode( '\\', $ns_name ); - foreach ( $levels as $level ) { - if ( preg_match_all( self::WP_CLASSNAME_REGEX, $level, $matches, \PREG_PATTERN_ORDER ) > 0 ) { - $misspelled = $this->retrieve_misspellings( $matches[1] ); - - if ( ! empty( $misspelled ) ) { - $this->phpcsFile->addWarning( - 'Please spell "WordPress" correctly. Found: "%s" as part of the namespace name.', - $stackPtr, - 'MisspelledNamespaceName', - array( implode( ', ', $misspelled ) ) - ); - } - } - } - - return; - } - - /* - * Deal with misspellings in class/interface/trait/enum names. - * These are not auto-fixable, but need the attention of a developer. - */ - if ( isset( Tokens::$ooScopeTokens[ $this->tokens[ $stackPtr ]['code'] ] ) ) { - $classname = ObjectDeclarations::getName( $this->phpcsFile, $stackPtr ); - if ( empty( $classname ) ) { - return; - } - - if ( preg_match_all( self::WP_CLASSNAME_REGEX, $classname, $matches, \PREG_PATTERN_ORDER ) > 0 ) { - $misspelled = $this->retrieve_misspellings( $matches[1] ); - - if ( ! empty( $misspelled ) ) { - $this->phpcsFile->addWarning( - 'Please spell "WordPress" correctly. Found: "%s" as part of the class/interface/trait/enum name.', - $stackPtr, - 'MisspelledClassName', - array( implode( ', ', $misspelled ) ) - ); - } - } - - return; - } - - /* - * Deal with misspellings in text strings and documentation. - */ - - // Ignore content of docblock @link tags. - if ( \T_DOC_COMMENT_STRING === $this->tokens[ $stackPtr ]['code'] - || \T_DOC_COMMENT === $this->tokens[ $stackPtr ]['code'] - ) { - - $comment_tag = $this->phpcsFile->findPrevious( - array( \T_DOC_COMMENT_TAG, \T_DOC_COMMENT_OPEN_TAG ), - ( $stackPtr - 1 ) - ); - if ( false !== $comment_tag - && \T_DOC_COMMENT_TAG === $this->tokens[ $comment_tag ]['code'] - && '@link' === $this->tokens[ $comment_tag ]['content'] - ) { - // @link tag, so ignore. - return; - } - } - - // Ignore constant declarations via define(). - if ( ContextHelper::is_in_function_call( $this->phpcsFile, $stackPtr, array( 'define' => true ), true, true ) ) { - return; - } - - // Ignore constant declarations using the const keyword. - $stop_points = array( - \T_CONST, - \T_SEMICOLON, - \T_OPEN_TAG, - \T_CLOSE_TAG, - \T_OPEN_CURLY_BRACKET, - ); - $maybe_const = $this->phpcsFile->findPrevious( $stop_points, ( $stackPtr - 1 ) ); - if ( false !== $maybe_const && \T_CONST === $this->tokens[ $maybe_const ]['code'] ) { - return; - } - - $content = $this->tokens[ $stackPtr ]['content']; - - if ( preg_match_all( self::WP_REGEX, $content, $matches, ( \PREG_PATTERN_ORDER | \PREG_OFFSET_CAPTURE ) ) > 0 ) { - /* - * Prevent some typical false positives. - */ - if ( isset( $this->text_and_comment_tokens[ $this->tokens[ $stackPtr ]['code'] ] ) ) { - $offset = 0; - foreach ( $matches[1] as $key => $match_data ) { - $next_offset = ( $match_data[1] + \strlen( $match_data[0] ) ); - - // Prevent matches on part of a URL. - if ( preg_match( '`http[s]?://[^\s<>\'"()]*' . preg_quote( $match_data[0], '`' ) . '`', $content, $discard, 0, $offset ) === 1 ) { - unset( $matches[1][ $key ] ); - } elseif ( preg_match( '`[a-z]+=(["\'])' . preg_quote( $match_data[0], '`' ) . '\1`', $content, $discard, 0, $offset ) === 1 ) { - // Prevent matches on html attributes like: `value="wordpress"`. - unset( $matches[1][ $key ] ); - } elseif ( preg_match( '`\\\\\'' . preg_quote( $match_data[0], '`' ) . '\\\\\'`', $content, $discard, 0, $offset ) === 1 ) { - // Prevent matches on xpath queries and such: `\'wordpress\'`. - unset( $matches[1][ $key ] ); - } elseif ( preg_match( '`(?:\?|&|&)[a-z0-9_]+=' . preg_quote( $match_data[0], '`' ) . '(?:&|$)`', $content, $discard, 0, $offset ) === 1 ) { - // Prevent matches on url query strings: `?something=wordpress`. - unset( $matches[1][ $key ] ); - } - - $offset = $next_offset; - } - - if ( empty( $matches[1] ) ) { - return; - } - } - - $misspelled = $this->retrieve_misspellings( $matches[1] ); - - if ( empty( $misspelled ) ) { - return; - } - - $code = 'MisspelledInText'; - if ( isset( Tokens::$commentTokens[ $this->tokens[ $stackPtr ]['code'] ] ) ) { - $code = 'MisspelledInComment'; - } - - $fix = $this->phpcsFile->addFixableWarning( - 'Please spell "WordPress" correctly. Found %s misspelling(s): %s', - $stackPtr, - $code, - array( - \count( $misspelled ), - implode( ', ', $misspelled ), - ) - ); - - if ( true === $fix ) { - // Apply fixes based on offset to ensure we don't replace false positives. - $replacement = $content; - foreach ( $matches[1] as $match ) { - $replacement = substr_replace( $replacement, 'WordPress', $match[1], \strlen( $match[0] ) ); - } - - $this->phpcsFile->fixer->replaceToken( $stackPtr, $replacement ); - } - } - } - - /** - * Retrieve a list of misspellings based on an array of matched variations on the target word. - * - * @param array $match_stack Array of matched variations of the target word. - * @return array Array containing only the misspelled variants. - */ - protected function retrieve_misspellings( $match_stack ) { - $misspelled = array(); - foreach ( $match_stack as $match ) { - // Deal with multi-dimensional arrays when capturing offset. - if ( \is_array( $match ) ) { - $match = $match[0]; - } - - if ( 'WordPress' !== $match ) { - $misspelled[] = $match; - } - } - - return $misspelled; - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/ClassNameCaseSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/ClassNameCaseSniff.php deleted file mode 100644 index ef8170e..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/ClassNameCaseSniff.php +++ /dev/null @@ -1,975 +0,0 @@ -class_groups as $name ) { - $name_lc = $name . '_lc'; - $this->$name_lc = array_map( 'strtolower', $this->$name ); - $this->$name = array_combine( $this->$name_lc, $this->$name ); - } - } - - /** - * Groups of classes to restrict. - * - * @since 3.0.0 - * - * @return array - */ - public function getGroups() { - $groups = array(); - foreach ( $this->class_groups as $name ) { - $name_lc = $name . '_lc'; - $groups[ $name ] = array( - 'classes' => $this->$name_lc, - ); - } - - return $groups; - } - - /** - * Process a matched token. - * - * @since 3.0.0 - * - * @param int $stackPtr The position of the current token in the stack. - * @param string $group_name The name of the group which was matched. Will - * always be 'wp_classes'. - * @param string $matched_content The token content (class name) which was matched. - * in its original case. - * - * @return void - */ - public function process_matched_token( $stackPtr, $group_name, $matched_content ) { - - $matched_unqualified = ltrim( $matched_content, '\\' ); - $matched_lowercase = strtolower( $matched_unqualified ); - $matched_proper_case = $this->get_proper_case( $matched_lowercase ); - - if ( $matched_unqualified === $matched_proper_case ) { - // Already using proper case, nothing to do. - return; - } - - $warning = 'It is strongly recommended to refer to classes by their properly cased name. Expected: %s Found: %s'; - $data = array( - $matched_proper_case, - $matched_unqualified, - ); - - $this->phpcsFile->addWarning( $warning, $stackPtr, 'Incorrect', $data ); - } - - /** - * Match a lowercase class name to its proper cased name. - * - * @since 3.0.0 - * - * @param string $matched_lc Lowercase class name. - * - * @return string - */ - private function get_proper_case( $matched_lc ) { - foreach ( $this->class_groups as $name ) { - $current = $this->$name; // Needed to prevent issues with PHP < 7.0. - if ( isset( $current[ $matched_lc ] ) ) { - return $current[ $matched_lc ]; - } - } - - // Shouldn't be possible. - return ''; // @codeCoverageIgnore - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/CronIntervalSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/CronIntervalSniff.php deleted file mode 100644 index a93315d..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/CronIntervalSniff.php +++ /dev/null @@ -1,321 +0,0 @@ - 60, - 'HOUR_IN_SECONDS' => 3600, - 'DAY_IN_SECONDS' => 86400, - 'WEEK_IN_SECONDS' => 604800, - 'MONTH_IN_SECONDS' => 2592000, - 'YEAR_IN_SECONDS' => 31536000, - ); - - /** - * Function within which the hook should be found. - * - * @var array - */ - protected $valid_functions = array( - 'add_filter' => true, - ); - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() { - return Tokens::$stringTokens; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param int $stackPtr The position of the current token in the stack. - * - * @return void - */ - public function process_token( $stackPtr ) { - $token = $this->tokens[ $stackPtr ]; - - if ( 'cron_schedules' !== TextStrings::stripQuotes( $token['content'] ) ) { - return; - } - - // Check if the text was found within a function call to add_filter(). - $functionPtr = ContextHelper::is_in_function_call( $this->phpcsFile, $stackPtr, $this->valid_functions ); - if ( false === $functionPtr ) { - return; - } - - $callback = PassedParameters::getParameter( $this->phpcsFile, $functionPtr, 2, 'callback' ); - if ( false === $callback ) { - return; - } - - if ( $stackPtr >= $callback['start'] && $stackPtr <= $callback['end'] ) { - // "cron_schedules" found in the second parameter, not the first. - return; - } - - // Detect callback function name. - $callbackArrayPtr = $this->phpcsFile->findNext( Tokens::$emptyTokens, $callback['start'], ( $callback['end'] + 1 ), true ); - - // If callback is array, get second element. - if ( false !== $callbackArrayPtr - && ( \T_ARRAY === $this->tokens[ $callbackArrayPtr ]['code'] - || ( isset( Collections::shortArrayListOpenTokensBC()[ $this->tokens[ $callbackArrayPtr ]['code'] ] ) - && Arrays::isShortArray( $this->phpcsFile, $callbackArrayPtr ) === true ) - ) - ) { - $callback = PassedParameters::getParameter( $this->phpcsFile, $callbackArrayPtr, 2 ); - - if ( false === $callback ) { - $this->confused( $stackPtr ); - return; - } - } - - unset( $functionPtr ); - - // Search for the function in tokens. - $search = Tokens::$stringTokens; - $search[ \T_CLOSURE ] = \T_CLOSURE; - $search[ \T_FN ] = \T_FN; - $search[ \T_ELLIPSIS ] = \T_ELLIPSIS; - $callbackFunctionPtr = $this->phpcsFile->findNext( $search, $callback['start'], ( $callback['end'] + 1 ) ); - - if ( false === $callbackFunctionPtr ) { - $this->confused( $stackPtr ); - return; - } - - if ( \T_CLOSURE === $this->tokens[ $callbackFunctionPtr ]['code'] - || \T_FN === $this->tokens[ $callbackFunctionPtr ]['code'] - ) { - $functionPtr = $callbackFunctionPtr; - } elseif ( \T_ELLIPSIS === $this->tokens[ $callbackFunctionPtr ]['code'] ) { - // Check if this is a PHP 8.1 first class callable. - $before = $this->phpcsFile->findPrevious( Tokens::$emptyTokens, ( $callbackFunctionPtr - 1 ), null, true ); - $after = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $callbackFunctionPtr + 1 ), null, true ); - if ( ( false !== $before && \T_OPEN_PARENTHESIS === $this->tokens[ $before ]['code'] ) - && ( false !== $after && \T_CLOSE_PARENTHESIS === $this->tokens[ $after ]['code'] ) - ) { - // Ok, now see if we can find the function name. - $beforeOpen = $this->phpcsFile->findPrevious( Tokens::$emptyTokens, ( $before - 1 ), null, true ); - if ( false !== $beforeOpen && \T_STRING === $this->tokens[ $beforeOpen ]['code'] ) { - $found_function = $this->find_function_by_name( $this->tokens[ $beforeOpen ]['content'] ); - if ( false !== $found_function ) { - $functionPtr = $found_function; - } - } - } - unset( $before, $after, $beforeOpen ); - } else { - $functionName = TextStrings::stripQuotes( $this->tokens[ $callbackFunctionPtr ]['content'] ); - $found_function = $this->find_function_by_name( $functionName ); - if ( false !== $found_function ) { - $functionPtr = $found_function; - } - } - - if ( ! isset( $functionPtr ) ) { - $this->confused( $stackPtr ); - return; - } - - if ( ! isset( $this->tokens[ $functionPtr ]['scope_opener'], $this->tokens[ $functionPtr ]['scope_closer'] ) ) { - return; - } - - $opening = $this->tokens[ $functionPtr ]['scope_opener']; - $closing = $this->tokens[ $functionPtr ]['scope_closer']; - for ( $i = $opening; $i <= $closing; $i++ ) { - - if ( isset( Tokens::$stringTokens[ $this->tokens[ $i ]['code'] ] ) === true ) { - if ( 'interval' === TextStrings::stripQuotes( $this->tokens[ $i ]['content'] ) ) { - $operator = $this->phpcsFile->findNext( \T_DOUBLE_ARROW, $i, null, false, null, true ); - if ( false === $operator ) { - $this->confused( $stackPtr ); - return; - } - - $valueStart = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $operator + 1 ), null, true, null, true ); - $valueEnd = $this->phpcsFile->findNext( array( \T_COMMA, \T_CLOSE_PARENTHESIS ), ( $valueStart + 1 ) ); - $value = ''; - $parentheses_count = 0; - for ( $j = $valueStart; $j <= $valueEnd; $j++ ) { - if ( isset( Tokens::$emptyTokens[ $this->tokens[ $j ]['code'] ] ) ) { - continue; - } - - if ( \T_NS_SEPARATOR === $this->tokens[ $j ]['code'] ) { - $value .= ' '; - continue; - } - - if ( $j === $valueEnd && \T_COMMA === $this->tokens[ $j ]['code'] ) { - break; - } - - // Make sure that PHP 7.4 numeric literals and PHP 8.1 explicit octals don't cause problems. - if ( \T_LNUMBER === $this->tokens[ $j ]['code'] - || \T_DNUMBER === $this->tokens[ $j ]['code'] - ) { - $number_info = Numbers::getCompleteNumber( $this->phpcsFile, $j ); - $value .= $number_info['decimal']; - $j = $number_info['last_token']; - continue; - } - - if ( \T_OPEN_PARENTHESIS === $this->tokens[ $j ]['code'] ) { - $value .= $this->tokens[ $j ]['content']; - ++$parentheses_count; - continue; - } - - if ( \T_CLOSE_PARENTHESIS === $this->tokens[ $j ]['code'] ) { - // Only add a close parenthesis if there are open parentheses. - if ( $parentheses_count > 0 ) { - $value .= $this->tokens[ $j ]['content']; - --$parentheses_count; - } - continue; - } - - $value .= $this->tokens[ $j ]['content']; - } - - if ( $parentheses_count > 0 ) { - // Make sure all open parenthesis are closed. - $value .= str_repeat( ')', $parentheses_count ); - } - - if ( is_numeric( $value ) ) { - $interval = $value; - break; - } - - // Deal correctly with WP time constants. - $value = str_replace( array_keys( $this->wp_time_constants ), array_values( $this->wp_time_constants ), $value ); - - // If all parentheses, digits and operators, eval! - if ( preg_match( '#^[\s\d()+*/-]+$#', $value ) > 0 ) { - $interval = eval( "return ( $value );" ); // phpcs:ignore Squiz.PHP.Eval -- No harm here. - break; - } - - $this->confused( $stackPtr ); - return; - } - } - } - - $this->min_interval = (int) $this->min_interval; - - if ( isset( $interval ) && $interval < $this->min_interval ) { - $minutes = round( ( $this->min_interval / 60 ), 1 ); - $this->phpcsFile->addWarning( - 'Scheduling crons at %s sec ( less than %s minutes ) is discouraged.', - $stackPtr, - 'CronSchedulesInterval', - array( - $interval, - $minutes, - ) - ); - return; - } - } - - /** - * Find a declared function in a file based on the function name. - * - * @param string $functionName The name of the function to find. - * - * @return int|false Integer stack pointer to the function keyword token or - * false if not found. - */ - private function find_function_by_name( $functionName ) { - $functionPtr = false; - for ( $ptr = 0; $ptr < $this->phpcsFile->numTokens; $ptr++ ) { - if ( \T_FUNCTION === $this->tokens[ $ptr ]['code'] ) { - $foundName = FunctionDeclarations::getName( $this->phpcsFile, $ptr ); - if ( $foundName === $functionName ) { - $functionPtr = $ptr; - break; - } elseif ( isset( $this->tokens[ $ptr ]['scope_closer'] ) ) { - // Skip to the end of the function definition. - $ptr = $this->tokens[ $ptr ]['scope_closer']; - } - } - } - - return $functionPtr; - } - - /** - * Add warning about unclear cron schedule change. - * - * @param int $stackPtr The position of the current token in the stack. - * - * @return void - */ - public function confused( $stackPtr ) { - $this->phpcsFile->addWarning( - 'Detected changing of cron_schedules, but could not detect the interval value.', - $stackPtr, - 'ChangeDetected' - ); - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/DeprecatedClassesSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/DeprecatedClassesSniff.php deleted file mode 100644 index eec0d8f..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/DeprecatedClassesSniff.php +++ /dev/null @@ -1,152 +0,0 @@ - value - * in a custom ruleset. - * - * @uses \WordPressCS\WordPress\Helpers\MinimumWPVersionTrait::$minimum_wp_version - */ -final class DeprecatedClassesSniff extends AbstractClassRestrictionsSniff { - - use MinimumWPVersionTrait; - - /** - * List of deprecated classes with alternative when available. - * - * To be updated after every major release. - * - * Version numbers should be fully qualified. - * - * {@internal To be updated after every major release. Last updated for WordPress 6.9.0-RC2.} - * - * @var array - */ - private $deprecated_classes = array( - - // WP 3.1.0. - 'WP_User_Search' => array( - 'alt' => 'WP_User_Query', - 'version' => '3.1.0', - ), - - // WP 3.7.0. - 'WP_HTTP_Fsockopen' => array( - 'alt' => 'WP_HTTP::request()', - 'version' => '3.7.0', - ), - - // WP 4.9.0. - 'WP_Customize_New_Menu_Section' => array( - 'version' => '4.9.0', - ), - 'WP_Customize_New_Menu_Control' => array( - 'version' => '4.9.0', - ), - - // WP 5.3.0. - 'WP_Privacy_Data_Export_Requests_Table' => array( - 'alt' => 'WP_Privacy_Data_Export_Requests_List_Table', - 'version' => '5.3.0', - ), - 'WP_Privacy_Data_Removal_Requests_Table' => array( - 'alt' => 'WP_Privacy_Data_Removal_Requests_List_Table', - 'version' => '5.3.0', - ), - 'Services_JSON' => array( - 'alt' => 'The PHP native JSON extension', - 'version' => '5.3.0', - ), - 'Services_JSON_Error' => array( - 'alt' => 'The PHP native JSON extension', - 'version' => '5.3.0', - ), - - // WP 6.4.0. - 'WP_Http_Curl' => array( - 'alt' => 'WP_Http', - 'version' => '6.4.0', - ), - 'WP_Http_Streams' => array( - 'alt' => 'WP_Http', - 'version' => '6.4.0', - ), - ); - - /** - * Groups of classes to restrict. - * - * @return array - */ - public function getGroups() { - // Make sure all array keys are lowercase. - $this->deprecated_classes = array_change_key_case( $this->deprecated_classes, \CASE_LOWER ); - - return array( - 'deprecated_classes' => array( - 'classes' => array_keys( $this->deprecated_classes ), - ), - ); - } - - /** - * Process a matched token. - * - * @param int $stackPtr The position of the current token in the stack. - * @param string $group_name The name of the group which was matched. Will - * always be 'deprecated_classes'. - * @param string $matched_content The token content (class name) which was matched - * in its original case. - * - * @return void - */ - public function process_matched_token( $stackPtr, $group_name, $matched_content ) { - - $this->set_minimum_wp_version(); - - $class_name = ltrim( strtolower( $matched_content ), '\\' ); - - $message = 'The %s class has been deprecated since WordPress version %s.'; - $data = array( - ltrim( $matched_content, '\\' ), - $this->deprecated_classes[ $class_name ]['version'], - ); - - if ( ! empty( $this->deprecated_classes[ $class_name ]['alt'] ) ) { - $message .= ' Use %s instead.'; - $data[] = $this->deprecated_classes[ $class_name ]['alt']; - } - - MessageHelper::addMessage( - $this->phpcsFile, - $message, - $stackPtr, - ( $this->wp_version_compare( $this->deprecated_classes[ $class_name ]['version'], $this->minimum_wp_version, '<' ) ), - MessageHelper::stringToErrorcode( $class_name . 'Found' ), - $data - ); - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/DeprecatedFunctionsSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/DeprecatedFunctionsSniff.php deleted file mode 100644 index 6b74d62..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/DeprecatedFunctionsSniff.php +++ /dev/null @@ -1,1776 +0,0 @@ - value - * in a custom ruleset. - * - * @uses \WordPressCS\WordPress\Helpers\MinimumWPVersionTrait::$minimum_wp_version - */ -final class DeprecatedFunctionsSniff extends AbstractFunctionRestrictionsSniff { - - use MinimumWPVersionTrait; - - /** - * List of deprecated functions with alternative when available. - * - * Version numbers should be fully qualified. - * Replacement functions should have parentheses. - * - * To retrieve a function list for comparison, the following tool is available: - * https://github.com/JDGrimes/wp-deprecated-code-scanner - * - * {@internal To be updated after every major release. Last updated for WordPress 6.9.0-RC2.} - * - * @var array - */ - private $deprecated_functions = array( - // WP 0.71. - 'the_category_head' => array( - 'alt' => 'get_the_category_by_ID()', - 'version' => '0.71', - ), - 'the_category_ID' => array( - 'alt' => 'get_the_category()', - 'version' => '0.71', - ), - - // WP 1.2.0. - 'permalink_link' => array( - 'alt' => 'the_permalink()', - 'version' => '1.2.0', - ), - - // WP 1.5.0. - 'start_wp' => array( - // Verified correct alternative. - 'alt' => 'the Loop', - 'version' => '1.5.0', - ), - - // WP 1.5.1. - 'get_postdata' => array( - 'alt' => 'get_post()', - 'version' => '1.5.1', - ), - - // WP 2.0.0. - 'create_user' => array( - 'alt' => 'wp_create_user()', - 'version' => '2.0.0', - ), - 'next_post' => array( - 'alt' => 'next_post_link()', - 'version' => '2.0.0', - ), - 'previous_post' => array( - 'alt' => 'previous_post_link()', - 'version' => '2.0.0', - ), - 'user_can_create_draft' => array( - 'alt' => 'current_user_can()', - 'version' => '2.0.0', - ), - 'user_can_create_post' => array( - 'alt' => 'current_user_can()', - 'version' => '2.0.0', - ), - 'user_can_delete_post' => array( - 'alt' => 'current_user_can()', - 'version' => '2.0.0', - ), - 'user_can_delete_post_comments' => array( - 'alt' => 'current_user_can()', - 'version' => '2.0.0', - ), - 'user_can_edit_post' => array( - 'alt' => 'current_user_can()', - 'version' => '2.0.0', - ), - 'user_can_edit_post_comments' => array( - 'alt' => 'current_user_can()', - 'version' => '2.0.0', - ), - 'user_can_edit_post_date' => array( - 'alt' => 'current_user_can()', - 'version' => '2.0.0', - ), - 'user_can_edit_user' => array( - 'alt' => 'current_user_can()', - 'version' => '2.0.0', - ), - 'user_can_set_post_date' => array( - 'alt' => 'current_user_can()', - 'version' => '2.0.0', - ), - - // WP 2.1.0. - 'dropdown_cats' => array( - 'alt' => 'wp_dropdown_categories()', - 'version' => '2.1.0', - ), - 'get_archives' => array( - 'alt' => 'wp_get_archives()', - 'version' => '2.1.0', - ), - 'get_author_link' => array( - 'alt' => 'get_author_posts_url()', - 'version' => '2.1.0', - ), - 'get_autotoggle' => array( - 'alt' => '', - 'version' => '2.1.0', - ), - 'get_link' => array( - 'alt' => 'get_bookmark()', - 'version' => '2.1.0', - ), - 'get_linkcatname' => array( - 'alt' => 'get_category()', - 'version' => '2.1.0', - ), - 'get_linkobjects' => array( - 'alt' => 'get_bookmarks()', - 'version' => '2.1.0', - ), - 'get_linkobjectsbyname' => array( - 'alt' => 'get_bookmarks()', - 'version' => '2.1.0', - ), - 'get_linkrating' => array( - 'alt' => 'sanitize_bookmark_field()', - 'version' => '2.1.0', - ), - 'get_links' => array( - 'alt' => 'get_bookmarks()', - 'version' => '2.1.0', - ), - 'get_links_list' => array( - 'alt' => 'wp_list_bookmarks()', - 'version' => '2.1.0', - ), - 'get_links_withrating' => array( - 'alt' => 'get_bookmarks()', - 'version' => '2.1.0', - ), - 'get_linksbyname' => array( - 'alt' => 'get_bookmarks()', - 'version' => '2.1.0', - ), - 'get_linksbyname_withrating' => array( - 'alt' => 'get_bookmarks()', - 'version' => '2.1.0', - ), - 'get_settings' => array( - 'alt' => 'get_option()', - 'version' => '2.1.0', - ), - 'link_pages' => array( - 'alt' => 'wp_link_pages()', - 'version' => '2.1.0', - ), - 'links_popup_script' => array( - 'alt' => '', - 'version' => '2.1.0', - ), - 'list_authors' => array( - 'alt' => 'wp_list_authors()', - 'version' => '2.1.0', - ), - 'list_cats' => array( - 'alt' => 'wp_list_categories()', - 'version' => '2.1.0', - ), - 'tinymce_include' => array( - 'alt' => 'wp_editor()', - 'version' => '2.1.0', - ), - 'wp_get_links' => array( - 'alt' => 'wp_list_bookmarks()', - 'version' => '2.1.0', - ), - 'wp_get_linksbyname' => array( - 'alt' => 'wp_list_bookmarks()', - 'version' => '2.1.0', - ), - 'wp_get_post_cats' => array( - 'alt' => 'wp_get_post_categories()', - 'version' => '2.1.0', - ), - 'wp_list_cats' => array( - 'alt' => 'wp_list_categories()', - 'version' => '2.1.0', - ), - 'wp_set_post_cats' => array( - 'alt' => 'wp_set_post_categories()', - 'version' => '2.1.0', - ), - - // WP 2.2.0. - 'comments_rss' => array( - 'alt' => 'get_post_comments_feed_link()', - 'version' => '2.2.0', - ), - - // WP 2.3.0. - 'permalink_single_rss' => array( - 'alt' => 'the_permalink_rss()', - 'version' => '2.3.0', - ), - - // WP 2.5.0. - 'comments_rss_link' => array( - 'alt' => 'post_comments_feed_link()', - 'version' => '2.5.0', - ), - 'documentation_link' => array( - 'alt' => '', - 'version' => '2.5.0', - ), - 'get_attachment_icon' => array( - 'alt' => 'wp_get_attachment_image()', - 'version' => '2.5.0', - ), - 'get_attachment_icon_src' => array( - 'alt' => 'wp_get_attachment_image_src()', - 'version' => '2.5.0', - ), - 'get_attachment_innerHTML' => array( - 'alt' => 'wp_get_attachment_image()', - 'version' => '2.5.0', - ), - 'get_author_rss_link' => array( - 'alt' => 'get_author_feed_link()', - 'version' => '2.5.0', - ), - 'get_category_rss_link' => array( - 'alt' => 'get_category_feed_link()', - 'version' => '2.5.0', - ), - 'get_the_attachment_link' => array( - 'alt' => 'wp_get_attachment_link()', - 'version' => '2.5.0', - ), - 'gzip_compression' => array( - 'alt' => '', - 'version' => '2.5.0', - ), - 'wp_clearcookie' => array( - 'alt' => 'wp_clear_auth_cookie()', - 'version' => '2.5.0', - ), - 'wp_get_cookie_login' => array( - 'alt' => '', - 'version' => '2.5.0', - ), - 'wp_login' => array( - 'alt' => 'wp_signon()', - 'version' => '2.5.0', - ), - 'wp_setcookie' => array( - 'alt' => 'wp_set_auth_cookie()', - 'version' => '2.5.0', - ), - - // WP 2.6.0. - 'dropdown_categories' => array( - 'alt' => 'wp_category_checklist()', - 'version' => '2.6.0', - ), - 'dropdown_link_categories' => array( - 'alt' => 'wp_link_category_checklist()', - 'version' => '2.6.0', - ), - - // WP 2.7.0. - 'get_commentdata' => array( - 'alt' => 'get_comment()', - 'version' => '2.7.0', - ), - // This is a method i.e. WP_Filesystem_Base::find_base_dir() See #731. - 'find_base_dir' => array( - 'alt' => 'WP_Filesystem::abspath()', - 'version' => '2.7.0', - ), - // This is a method i.e. WP_Filesystem_Base::get_base_dir() See #731. - 'get_base_dir' => array( - 'alt' => 'WP_Filesystem::abspath()', - 'version' => '2.7.0', - ), - - // WP 2.8.0. - '__ngettext' => array( - 'alt' => '_n()', - 'version' => '2.8.0', - ), - '__ngettext_noop' => array( - 'alt' => '_n_noop()', - 'version' => '2.8.0', - ), - 'attribute_escape' => array( - 'alt' => 'esc_attr()', - 'version' => '2.8.0', - ), - 'get_author_name' => array( - 'alt' => 'get_the_author_meta(\'display_name\')', - 'version' => '2.8.0', - ), - 'get_category_children' => array( - 'alt' => 'get_term_children()', - 'version' => '2.8.0', - ), - 'get_catname' => array( - 'alt' => 'get_cat_name()', - 'version' => '2.8.0', - ), - 'get_the_author_aim' => array( - 'alt' => 'get_the_author_meta(\'aim\')', - 'version' => '2.8.0', - ), - 'get_the_author_description' => array( - 'alt' => 'get_the_author_meta(\'description\')', - 'version' => '2.8.0', - ), - 'get_the_author_email' => array( - 'alt' => 'get_the_author_meta(\'email\')', - 'version' => '2.8.0', - ), - 'get_the_author_firstname' => array( - 'alt' => 'get_the_author_meta(\'first_name\')', - 'version' => '2.8.0', - ), - 'get_the_author_icq' => array( - 'alt' => 'get_the_author_meta(\'icq\')', - 'version' => '2.8.0', - ), - 'get_the_author_ID' => array( - 'alt' => 'get_the_author_meta(\'ID\')', - 'version' => '2.8.0', - ), - 'get_the_author_lastname' => array( - 'alt' => 'get_the_author_meta(\'last_name\')', - 'version' => '2.8.0', - ), - 'get_the_author_login' => array( - 'alt' => 'get_the_author_meta(\'login\')', - 'version' => '2.8.0', - ), - 'get_the_author_msn' => array( - 'alt' => 'get_the_author_meta(\'msn\')', - 'version' => '2.8.0', - ), - 'get_the_author_nickname' => array( - 'alt' => 'get_the_author_meta(\'nickname\')', - 'version' => '2.8.0', - ), - 'get_the_author_url' => array( - 'alt' => 'get_the_author_meta(\'url\')', - 'version' => '2.8.0', - ), - 'get_the_author_yim' => array( - 'alt' => 'get_the_author_meta(\'yim\')', - 'version' => '2.8.0', - ), - 'js_escape' => array( - 'alt' => 'esc_js()', - 'version' => '2.8.0', - ), - 'register_sidebar_widget' => array( - 'alt' => 'wp_register_sidebar_widget()', - 'version' => '2.8.0', - ), - 'register_widget_control' => array( - 'alt' => 'wp_register_widget_control()', - 'version' => '2.8.0', - ), - 'the_author_aim' => array( - 'alt' => 'the_author_meta(\'aim\')', - 'version' => '2.8.0', - ), - 'the_author_description' => array( - 'alt' => 'the_author_meta(\'description\')', - 'version' => '2.8.0', - ), - 'the_author_email' => array( - 'alt' => 'the_author_meta(\'email\')', - 'version' => '2.8.0', - ), - 'the_author_firstname' => array( - 'alt' => 'the_author_meta(\'first_name\')', - 'version' => '2.8.0', - ), - 'the_author_icq' => array( - 'alt' => 'the_author_meta(\'icq\')', - 'version' => '2.8.0', - ), - 'the_author_ID' => array( - 'alt' => 'the_author_meta(\'ID\')', - 'version' => '2.8.0', - ), - 'the_author_lastname' => array( - 'alt' => 'the_author_meta(\'last_name\')', - 'version' => '2.8.0', - ), - 'the_author_login' => array( - 'alt' => 'the_author_meta(\'login\')', - 'version' => '2.8.0', - ), - 'the_author_msn' => array( - 'alt' => 'the_author_meta(\'msn\')', - 'version' => '2.8.0', - ), - 'the_author_nickname' => array( - 'alt' => 'the_author_meta(\'nickname\')', - 'version' => '2.8.0', - ), - 'the_author_url' => array( - 'alt' => 'the_author_meta(\'url\')', - 'version' => '2.8.0', - ), - 'the_author_yim' => array( - 'alt' => 'the_author_meta(\'yim\')', - 'version' => '2.8.0', - ), - 'unregister_sidebar_widget' => array( - 'alt' => 'wp_unregister_sidebar_widget()', - 'version' => '2.8.0', - ), - 'unregister_widget_control' => array( - 'alt' => 'wp_unregister_widget_control()', - 'version' => '2.8.0', - ), - 'wp_specialchars' => array( - 'alt' => 'esc_html()', - 'version' => '2.8.0', - ), - - // WP 2.9.0. - '_c' => array( - 'alt' => '_x()', - 'version' => '2.9.0', - ), - '_nc' => array( - 'alt' => '_nx()', - 'version' => '2.9.0', - ), - 'get_real_file_to_edit' => array( - 'alt' => '', - 'version' => '2.9.0', - ), - 'make_url_footnote' => array( - 'alt' => '', - 'version' => '2.9.0', - ), - 'the_content_rss' => array( - 'alt' => 'the_content_feed()', - 'version' => '2.9.0', - ), - 'translate_with_context' => array( - 'alt' => '_x()', - 'version' => '2.9.0', - ), - - // WP 3.0.0. - 'activate_sitewide_plugin' => array( - 'alt' => 'activate_plugin()', - 'version' => '3.0.0', - ), - 'add_option_update_handler' => array( - 'alt' => 'register_setting()', - 'version' => '3.0.0', - ), - 'automatic_feed_links' => array( - 'alt' => 'add_theme_support( \'automatic-feed-links\' )', - 'version' => '3.0.0', - ), - 'clean_url' => array( - 'alt' => 'esc_url()', - 'version' => '3.0.0', - ), - 'clear_global_post_cache' => array( - 'alt' => 'clean_post_cache()', - 'version' => '3.0.0', - ), - 'codepress_footer_js' => array( - 'alt' => '', - 'version' => '3.0.0', - ), - 'codepress_get_lang' => array( - 'alt' => '', - 'version' => '3.0.0', - ), - 'deactivate_sitewide_plugin' => array( - 'alt' => 'deactivate_plugin()', - 'version' => '3.0.0', - ), - 'delete_usermeta' => array( - 'alt' => 'delete_user_meta()', - 'version' => '3.0.0', - ), - // Verified; see https://core.trac.wordpress.org/ticket/41121, patch 3. - 'funky_javascript_callback' => array( - 'alt' => '', - 'version' => '3.0.0', - ), - 'funky_javascript_fix' => array( - 'alt' => '', - 'version' => '3.0.0', - ), - 'generate_random_password' => array( - 'alt' => 'wp_generate_password()', - 'version' => '3.0.0', - ), - 'get_alloptions' => array( - 'alt' => 'wp_load_alloptions()', - 'version' => '3.0.0', - ), - 'get_blog_list' => array( - 'alt' => 'wp_get_sites()', - 'version' => '3.0.0', - ), - 'get_most_active_blogs' => array( - 'alt' => '', - 'version' => '3.0.0', - ), - 'get_profile' => array( - 'alt' => 'get_the_author_meta()', - 'version' => '3.0.0', - ), - 'get_user_details' => array( - 'alt' => 'get_user_by()', - 'version' => '3.0.0', - ), - 'get_usermeta' => array( - 'alt' => 'get_user_meta()', - 'version' => '3.0.0', - ), - 'get_usernumposts' => array( - 'alt' => 'count_user_posts()', - 'version' => '3.0.0', - ), - 'graceful_fail' => array( - 'alt' => 'wp_die()', - 'version' => '3.0.0', - ), - // Verified version & alternative. - 'install_blog_defaults' => array( - 'alt' => 'wp_install_defaults', - 'version' => '3.0.0', - ), - 'is_main_blog' => array( - 'alt' => 'is_main_site()', - 'version' => '3.0.0', - ), - 'is_site_admin' => array( - 'alt' => 'is_super_admin()', - 'version' => '3.0.0', - ), - 'is_taxonomy' => array( - 'alt' => 'taxonomy_exists()', - 'version' => '3.0.0', - ), - 'is_term' => array( - 'alt' => 'term_exists()', - 'version' => '3.0.0', - ), - 'is_wpmu_sitewide_plugin' => array( - 'alt' => 'is_network_only_plugin()', - 'version' => '3.0.0', - ), - 'mu_options' => array( - 'alt' => '', - 'version' => '3.0.0', - ), - 'remove_option_update_handler' => array( - 'alt' => 'unregister_setting()', - 'version' => '3.0.0', - ), - 'set_current_user' => array( - 'alt' => 'wp_set_current_user()', - 'version' => '3.0.0', - ), - 'update_usermeta' => array( - 'alt' => 'update_user_meta()', - 'version' => '3.0.0', - ), - 'use_codepress' => array( - 'alt' => '', - 'version' => '3.0.0', - ), - 'validate_email' => array( - 'alt' => 'is_email()', - 'version' => '3.0.0', - ), - 'wp_dropdown_cats' => array( - 'alt' => 'wp_dropdown_categories()', - 'version' => '3.0.0', - ), - 'wp_shrink_dimensions' => array( - 'alt' => 'wp_constrain_dimensions()', - 'version' => '3.0.0', - ), - 'wpmu_checkAvailableSpace' => array( - 'alt' => 'is_upload_space_available()', - 'version' => '3.0.0', - ), - 'wpmu_menu' => array( - 'alt' => '', - 'version' => '3.0.0', - ), - - // WP 3.1.0. - 'get_author_user_ids' => array( - 'alt' => 'get_users()', - 'version' => '3.1.0', - ), - 'get_dashboard_blog' => array( - 'alt' => 'get_site()', - 'version' => '3.1.0', - ), - 'get_editable_authors' => array( - 'alt' => 'get_users()', - 'version' => '3.1.0', - ), - 'get_editable_user_ids' => array( - 'alt' => 'get_users()', - 'version' => '3.1.0', - ), - 'get_nonauthor_user_ids' => array( - 'alt' => 'get_users()', - 'version' => '3.1.0', - ), - 'get_others_drafts' => array( - 'alt' => '', - 'version' => '3.1.0', - ), - 'get_others_pending' => array( - 'alt' => '', - 'version' => '3.1.0', - ), - 'get_others_unpublished_posts' => array( - 'alt' => '', - 'version' => '3.1.0', - ), - 'get_users_of_blog' => array( - 'alt' => 'get_users()', - 'version' => '3.1.0', - ), - 'install_themes_feature_list' => array( - 'alt' => 'get_theme_feature_list()', - 'version' => '3.1.0', - ), - 'is_plugin_page' => array( - // Verified correct alternative. - 'alt' => 'global $plugin_page and/or get_plugin_page_hookname() hooks', - 'version' => '3.1.0', - ), - 'update_category_cache' => array( - 'alt' => '', - 'version' => '3.1.0', - ), - - // WP 3.2.0. - 'favorite_actions' => array( - 'alt' => 'WP_Admin_Bar', - 'version' => '3.2.0', - ), - 'wp_dashboard_quick_press_output' => array( - 'alt' => 'wp_dashboard_quick_press()', - 'version' => '3.2.0', - ), - 'wp_timezone_supported' => array( - 'alt' => '', - 'version' => '3.2.0', - ), - - // WP 3.3.0. - 'add_contextual_help' => array( - 'alt' => 'get_current_screen()->add_help_tab()', - 'version' => '3.3.0', - ), - 'get_boundary_post_rel_link' => array( - 'alt' => '', - 'version' => '3.3.0', - ), - 'get_index_rel_link' => array( - 'alt' => '', - 'version' => '3.3.0', - ), - 'get_parent_post_rel_link' => array( - 'alt' => '', - 'version' => '3.3.0', - ), - 'get_user_by_email' => array( - 'alt' => 'get_user_by(\'email\')', - 'version' => '3.3.0', - ), - 'get_user_metavalues' => array( - 'alt' => '', - 'version' => '3.3.0', - ), - 'get_userdatabylogin' => array( - 'alt' => 'get_user_by(\'login\')', - 'version' => '3.3.0', - ), - 'index_rel_link' => array( - 'alt' => '', - 'version' => '3.3.0', - ), - 'is_blog_user' => array( - 'alt' => 'is_user_member_of_blog()', - 'version' => '3.3.0', - ), - 'media_upload_audio' => array( - 'alt' => 'wp_media_upload_handler()', - 'version' => '3.3.0', - ), - 'media_upload_file' => array( - 'alt' => 'wp_media_upload_handler()', - 'version' => '3.3.0', - ), - 'media_upload_image' => array( - 'alt' => 'wp_media_upload_handler()', - 'version' => '3.3.0', - ), - 'media_upload_video' => array( - 'alt' => 'wp_media_upload_handler()', - 'version' => '3.3.0', - ), - 'parent_post_rel_link' => array( - 'alt' => '', - 'version' => '3.3.0', - ), - 'sanitize_user_object' => array( - 'alt' => '', - 'version' => '3.3.0', - ), - 'screen_layout' => array( - 'alt' => '$current_screen->render_screen_layout()', - 'version' => '3.3.0', - ), - // Verified; see https://core.trac.wordpress.org/ticket/41121, patch 3. - 'screen_meta' => array( - 'alt' => '$current_screen->render_screen_meta()', - 'version' => '3.3.0', - ), - 'screen_options' => array( - 'alt' => '$current_screen->render_per_page_options()', - 'version' => '3.3.0', - ), - 'start_post_rel_link' => array( - 'alt' => '', - 'version' => '3.3.0', - ), - 'the_editor' => array( - 'alt' => 'wp_editor()', - 'version' => '3.3.0', - ), - 'type_url_form_audio' => array( - 'alt' => 'wp_media_insert_url_form(\'audio\')', - 'version' => '3.3.0', - ), - 'type_url_form_file' => array( - 'alt' => 'wp_media_insert_url_form(\'file\')', - 'version' => '3.3.0', - ), - 'type_url_form_image' => array( - 'alt' => 'wp_media_insert_url_form(\'image\')', - 'version' => '3.3.0', - ), - 'type_url_form_video' => array( - 'alt' => 'wp_media_insert_url_form(\'video\')', - 'version' => '3.3.0', - ), - 'wp_admin_bar_dashboard_view_site_menu' => array( - 'alt' => '', - 'version' => '3.3.0', - ), - 'wp_preload_dialogs' => array( - 'alt' => 'wp_editor()', - 'version' => '3.3.0', - ), - 'wp_print_editor_js' => array( - 'alt' => 'wp_editor()', - 'version' => '3.3.0', - ), - 'wp_quicktags' => array( - 'alt' => 'wp_editor()', - 'version' => '3.3.0', - ), - 'wp_tiny_mce' => array( - 'alt' => 'wp_editor()', - 'version' => '3.3.0', - ), - 'wpmu_admin_do_redirect' => array( - 'alt' => 'wp_redirect()', - 'version' => '3.3.0', - ), - 'wpmu_admin_redirect_add_updated_param' => array( - 'alt' => 'add_query_arg()', - 'version' => '3.3.0', - ), - - // WP 3.4.0. - 'add_custom_background' => array( - 'alt' => 'add_theme_support( \'custom-background\', $args )', - 'version' => '3.4.0', - ), - 'add_custom_image_header' => array( - 'alt' => 'add_theme_support( \'custom-header\', $args )', - 'version' => '3.4.0', - ), - 'clean_page_cache' => array( - 'alt' => 'clean_post_cache()', - 'version' => '3.4.0', - ), - 'clean_pre' => array( - 'alt' => '', - 'version' => '3.4.0', - ), - 'current_theme_info' => array( - 'alt' => 'wp_get_theme()', - 'version' => '3.4.0', - ), - 'debug_fclose' => array( - 'alt' => 'error_log()', - 'version' => '3.4.0', - ), - 'debug_fopen' => array( - 'alt' => 'error_log()', - 'version' => '3.4.0', - ), - 'debug_fwrite' => array( - 'alt' => 'error_log()', - 'version' => '3.4.0', - ), - 'display_theme' => array( - 'alt' => '', - 'version' => '3.4.0', - ), - 'get_allowed_themes' => array( - 'alt' => 'wp_get_themes( array( \'allowed\' => true ) )', - 'version' => '3.4.0', - ), - 'get_broken_themes' => array( - 'alt' => 'wp_get_themes( array( \'errors\' => true )', - 'version' => '3.4.0', - ), - 'get_current_theme' => array( - 'alt' => 'wp_get_theme()', - 'version' => '3.4.0', - ), - 'get_site_allowed_themes' => array( - 'alt' => 'WP_Theme::get_allowed_on_network()', - 'version' => '3.4.0', - ), - 'get_theme' => array( - 'alt' => 'wp_get_theme( $stylesheet )', - 'version' => '3.4.0', - ), - 'get_theme_data' => array( - 'alt' => 'wp_get_theme()', - 'version' => '3.4.0', - ), - 'get_themes' => array( - 'alt' => 'wp_get_themes()', - 'version' => '3.4.0', - ), - 'logIO' => array( - 'alt' => 'error_log()', - 'version' => '3.4.0', - ), - 'remove_custom_background' => array( - 'alt' => 'remove_theme_support( \'custom-background\' )', - 'version' => '3.4.0', - ), - 'remove_custom_image_header' => array( - 'alt' => 'remove_theme_support( \'custom-header\' )', - 'version' => '3.4.0', - ), - 'update_page_cache' => array( - 'alt' => 'update_post_cache()', - 'version' => '3.4.0', - ), - 'wpmu_get_blog_allowedthemes' => array( - 'alt' => 'WP_Theme::get_allowed_on_site()', - 'version' => '3.4.0', - ), - - // WP 3.4.1. - 'wp_explain_nonce' => array( - 'alt' => 'wp_nonce_ays()', - 'version' => '3.4.1', - ), - - // WP 3.5.0. - '_flip_image_resource' => array( - 'alt' => 'WP_Image_Editor::flip()', - 'version' => '3.5.0', - ), - '_get_post_ancestors' => array( - 'alt' => '', - 'version' => '3.5.0', - ), - '_insert_into_post_button' => array( - 'alt' => '', - 'version' => '3.5.0', - ), - '_media_button' => array( - 'alt' => '', - 'version' => '3.5.0', - ), - '_rotate_image_resource' => array( - 'alt' => 'WP_Image_Editor::rotate()', - 'version' => '3.5.0', - ), - // Verified; see https://core.trac.wordpress.org/ticket/41121, patch 3. - '_save_post_hook' => array( - 'alt' => '', - 'version' => '3.5.0', - ), - 'gd_edit_image_support' => array( - 'alt' => 'wp_image_editor_supports()', - 'version' => '3.5.0', - ), - 'get_default_page_to_edit' => array( - 'alt' => 'get_default_post_to_edit( \'page\' )', - 'version' => '3.5.0', - ), - 'get_post_to_edit' => array( - 'alt' => 'get_post()', - 'version' => '3.5.0', - ), - 'get_udims' => array( - 'alt' => 'wp_constrain_dimensions()', - 'version' => '3.5.0', - ), - 'image_resize' => array( - 'alt' => 'wp_get_image_editor()', - 'version' => '3.5.0', - ), - 'sticky_class' => array( - 'alt' => 'post_class()', - 'version' => '3.5.0', - ), - 'user_pass_ok' => array( - 'alt' => 'wp_authenticate()', - 'version' => '3.5.0', - ), - 'wp_cache_reset' => array( - 'alt' => 'wp_cache_switch_to_blog()', - 'version' => '3.5.0', - ), - 'wp_create_thumbnail' => array( - 'alt' => 'image_resize()', - 'version' => '3.5.0', - ), - 'wp_get_single_post' => array( - 'alt' => 'get_post()', - 'version' => '3.5.0', - ), - 'wp_load_image' => array( - 'alt' => 'wp_get_image_editor()', - 'version' => '3.5.0', - ), - - // WP 3.6.0. - 'get_user_id_from_string' => array( - 'alt' => 'get_user_by()', - 'version' => '3.6.0', - ), - 'wp_convert_bytes_to_hr' => array( - 'alt' => 'size_format()', - 'version' => '3.6.0', - ), - 'wp_nav_menu_locations_meta_box' => array( - 'alt' => '', - 'version' => '3.6.0', - ), - - // WP 3.7.0. - '_search_terms_tidy' => array( - 'alt' => '', - 'version' => '3.7.0', - ), - 'get_blogaddress_by_domain' => array( - 'alt' => '', - 'version' => '3.7.0', - ), - 'the_attachment_links' => array( - 'alt' => '', - 'version' => '3.7.0', - ), - 'wp_update_core' => array( - 'alt' => 'new Core_Upgrader();', - 'version' => '3.7.0', - ), - 'wp_update_plugin' => array( - 'alt' => 'new Plugin_Upgrader();', - 'version' => '3.7.0', - ), - 'wp_update_theme' => array( - 'alt' => 'new Theme_Upgrader();', - 'version' => '3.7.0', - ), - - // WP 3.8.0. - 'get_screen_icon' => array( - 'alt' => '', - 'version' => '3.8.0', - ), - 'screen_icon' => array( - 'alt' => '', - 'version' => '3.8.0', - ), - // Verified; see https://core.trac.wordpress.org/ticket/41121, patch 3. - 'wp_dashboard_incoming_links' => array( - 'alt' => '', - 'version' => '3.8.0', - ), - // Verified; see https://core.trac.wordpress.org/ticket/41121, patch 3. - 'wp_dashboard_incoming_links_control' => array( - 'alt' => '', - 'version' => '3.8.0', - ), - // Verified; see https://core.trac.wordpress.org/ticket/41121, patch 3. - 'wp_dashboard_incoming_links_output' => array( - 'alt' => '', - 'version' => '3.8.0', - ), - // Verified; see https://core.trac.wordpress.org/ticket/41121, patch 3. - 'wp_dashboard_plugins' => array( - 'alt' => '', - 'version' => '3.8.0', - ), - // Verified; see https://core.trac.wordpress.org/ticket/41121, patch 3. - 'wp_dashboard_primary_control' => array( - 'alt' => '', - 'version' => '3.8.0', - ), - // Verified; see https://core.trac.wordpress.org/ticket/41121, patch 3. - 'wp_dashboard_recent_comments_control' => array( - 'alt' => '', - 'version' => '3.8.0', - ), - // Verified; see https://core.trac.wordpress.org/ticket/41121, patch 3. - 'wp_dashboard_secondary' => array( - 'alt' => '', - 'version' => '3.8.0', - ), - // Verified; see https://core.trac.wordpress.org/ticket/41121, patch 3. - 'wp_dashboard_secondary_control' => array( - 'alt' => '', - 'version' => '3.8.0', - ), - // Verified; see https://core.trac.wordpress.org/ticket/41121, patch 3. - 'wp_dashboard_secondary_output' => array( - 'alt' => '', - 'version' => '3.8.0', - ), - - // WP 3.9.0. - '_relocate_children' => array( - 'alt' => '', - 'version' => '3.9.0', - ), - // Verified; see https://core.trac.wordpress.org/ticket/41121, patch 3. - 'default_topic_count_text' => array( - 'alt' => '', - 'version' => '3.9.0', - ), - 'format_to_post' => array( - 'alt' => '', - 'version' => '3.9.0', - ), - 'get_current_site_name' => array( - 'alt' => 'get_current_site()', - 'version' => '3.9.0', - ), - 'rich_edit_exists' => array( - 'alt' => '', - 'version' => '3.9.0', - ), - 'wpmu_current_site' => array( - 'alt' => '', - 'version' => '3.9.0', - ), - - // WP 4.0.0. - 'get_all_category_ids' => array( - 'alt' => 'get_terms()', - 'version' => '4.0.0', - ), - 'like_escape' => array( - 'alt' => 'wpdb::esc_like()', - 'version' => '4.0.0', - ), - 'url_is_accessable_via_ssl' => array( - 'alt' => '', - 'version' => '4.0.0', - ), - - // WP 4.1.0. - // This is a method from the WP_Customize_Image_Control class. See #731. - 'add_tab' => array( - 'alt' => '', - 'version' => '4.1.0', - ), - // This is a method from the WP_Customize_Image_Control class. See #731. - 'prepare_control' => array( - 'alt' => '', - 'version' => '4.1.0', - ), - // This is a method from the WP_Customize_Image_Control class. See #731. - 'print_tab_image' => array( - 'alt' => '', - 'version' => '4.1.0', - ), - // This is a method from the WP_Customize_Image_Control class. See #731. - 'remove_tab' => array( - 'alt' => '', - 'version' => '4.1.0', - ), - - // WP 4.2.0. - // This is a method from the WP_Customize_Widgets class. See #731. - 'prepreview_added_sidebars_widgets' => array( - 'alt' => 'the \'customize_dynamic_setting_args\' filter', - 'version' => '4.2.0', - ), - // This is a method from the WP_Customize_Widgets class. See #731. - 'prepreview_added_widget_instance' => array( - 'alt' => 'the \'customize_dynamic_setting_args\' filter', - 'version' => '4.2.0', - ), - // This is a method from the WP_Customize_Widgets class. See #731. - 'remove_prepreview_filters' => array( - 'alt' => 'the \'customize_dynamic_setting_args\' filter', - 'version' => '4.2.0', - ), - // This is a method from the WP_Customize_Widgets class. See #731. - 'setup_widget_addition_previews' => array( - 'alt' => 'the \'customize_dynamic_setting_args\' filter', - 'version' => '4.2.0', - ), - - // WP 4.3.0. - '_preview_theme_stylesheet_filter' => array( - 'alt' => '', - 'version' => '4.3.0', - ), - '_preview_theme_template_filter' => array( - 'alt' => '', - 'version' => '4.3.0', - ), - 'preview_theme' => array( - 'alt' => '', - 'version' => '4.3.0', - ), - 'preview_theme_ob_filter' => array( - 'alt' => '', - 'version' => '4.3.0', - ), - 'preview_theme_ob_filter_callback' => array( - 'alt' => '', - 'version' => '4.3.0', - ), - // Verified; see https://core.trac.wordpress.org/ticket/41121, patch 3. - 'wp_ajax_wp_fullscreen_save_post' => array( - 'alt' => '', - 'version' => '4.3.0', - ), - 'wp_htmledit_pre' => array( - 'alt' => 'format_for_editor()', - 'version' => '4.3.0', - ), - 'wp_richedit_pre' => array( - 'alt' => 'format_for_editor()', - 'version' => '4.3.0', - ), - - // WP 4.4.0. - 'create_empty_blog' => array( - 'alt' => '', - 'version' => '4.4.0', - ), - 'force_ssl_login' => array( - 'alt' => 'force_ssl_admin()', - 'version' => '4.4.0', - ), - 'get_admin_users_for_domain' => array( - 'alt' => '', - 'version' => '4.4.0', - ), - 'post_permalink' => array( - 'alt' => 'get_permalink()', - 'version' => '4.4.0', - ), - 'wp_get_http' => array( - 'alt' => 'the WP_Http class', - 'version' => '4.4.0', - ), - // This is a method i.e. WP_Widget_Recent_Comments::flush_widget_cache() See #731. - 'flush_widget_cache' => array( - 'alt' => '', - 'version' => '4.4.0', - ), - - // WP 4.5.0. - 'add_object_page' => array( - 'alt' => 'add_menu_page()', - 'version' => '4.5.0', - ), - 'add_utility_page' => array( - 'alt' => 'add_menu_page()', - 'version' => '4.5.0', - ), - 'comments_popup_script' => array( - 'alt' => '', - 'version' => '4.5.0', - ), - 'get_comments_popup_template' => array( - 'alt' => '', - 'version' => '4.5.0', - ), - 'get_currentuserinfo' => array( - 'alt' => 'wp_get_current_user()', - 'version' => '4.5.0', - ), - 'is_comments_popup' => array( - 'alt' => '', - 'version' => '4.5.0', - ), - 'popuplinks' => array( - 'alt' => '', - 'version' => '4.5.0', - ), - - // WP 4.6.0. - 'post_form_autocomplete_off' => array( - 'alt' => '', - 'version' => '4.6.0', - ), - 'wp_embed_handler_googlevideo' => array( - 'alt' => '', - 'version' => '4.6.0', - ), - 'wp_get_sites' => array( - 'alt' => 'get_sites()', - 'version' => '4.6.0', - ), - - // WP 4.7.0. - '_sort_nav_menu_items' => array( - 'alt' => 'wp_list_sort()', - 'version' => '4.7.0', - ), - '_usort_terms_by_ID' => array( - 'alt' => 'wp_list_sort()', - 'version' => '4.7.0', - ), - '_usort_terms_by_name' => array( - 'alt' => 'wp_list_sort()', - 'version' => '4.7.0', - ), - 'get_paged_template' => array( - 'alt' => '', - 'version' => '4.7.0', - ), - 'wp_get_network' => array( - 'alt' => 'get_network()', - 'version' => '4.7.0', - ), - 'wp_kses_js_entities' => array( - 'alt' => '', - 'version' => '4.7.0', - ), - - // WP 4.8.0. - 'wp_dashboard_plugins_output' => array( - 'alt' => '', - 'version' => '4.8.0', - ), - - // WP 4.9.0. - 'get_shortcut_link' => array( - 'alt' => '', - 'version' => '4.9.0', - ), - 'is_user_option_local' => array( - 'alt' => '', - 'version' => '4.9.0', - ), - 'wp_ajax_press_this_add_category' => array( - 'alt' => '', - 'version' => '4.9.0', - ), - 'wp_ajax_press_this_save_post' => array( - 'alt' => '', - 'version' => '4.9.0', - ), - - // WP 5.1.0. - 'insert_blog' => array( - 'alt' => 'wp_insert_site()', - 'version' => '5.1.0', - ), - 'install_blog' => array( - 'alt' => '', - 'version' => '5.1.0', - ), - - // WP 5.3.0. - '_wp_json_prepare_data' => array( - 'alt' => '', - 'version' => '5.3.0', - ), - '_wp_privacy_requests_screen_options' => array( - 'alt' => '', - 'version' => '5.3.0', - ), - 'update_user_status' => array( - 'alt' => 'wp_update_user()', - 'version' => '5.3.0', - ), - - // WP 5.4.0. - 'wp_get_user_request_data' => array( - 'alt' => 'wp_get_user_request()', - 'version' => '5.4.0', - ), - - // WP 5.5.0. - '_wp_register_meta_args_whitelist' => array( - 'alt' => '_wp_register_meta_args_allowed_list()', - 'version' => '5.5.0', - ), - 'add_option_whitelist' => array( - 'alt' => 'add_allowed_options()', - 'version' => '5.5.0', - ), - 'remove_option_whitelist' => array( - 'alt' => 'remove_allowed_options()', - 'version' => '5.5.0', - ), - 'wp_blacklist_check' => array( - 'alt' => 'wp_check_comment_disallowed_list()', - 'version' => '5.5.0', - ), - 'wp_make_content_images_responsive' => array( - 'alt' => 'wp_filter_content_tags()', - 'version' => '5.5.0', - ), - 'wp_unregister_GLOBALS' => array( - 'alt' => '', - 'version' => '5.5.0', - ), - - // WP 5.7.0. - 'noindex' => array( - 'alt' => 'wp_robots_noindex()', - 'version' => '5.7.0', - ), - 'wp_no_robots' => array( - 'alt' => 'wp_robots_no_robots()', - 'version' => '5.7.0', - ), - 'wp_sensitive_page_meta' => array( - 'alt' => 'wp_robots_sensitive_page()', - 'version' => '5.7.0', - ), - - // WP 5.8.0. - '_excerpt_render_inner_columns_blocks' => array( - 'alt' => '_excerpt_render_inner_blocks()', - 'version' => '5.8.0', - ), - - // WP 5.9.0. - 'readonly' => array( - 'alt' => 'wp_readonly()', - 'version' => '5.9.0', - ), - - // WP 5.9.1. - 'wp_render_duotone_filter_preset' => array( - 'alt' => 'wp_get_duotone_filter_property()', - 'version' => '5.9.1', - ), - - // WP 6.0.0. - 'image_attachment_fields_to_save' => array( - 'alt' => '', - 'version' => '6.0.0', - ), - 'wp_add_iframed_editor_assets_html' => array( - 'alt' => '', - 'version' => '6.0.0', - ), - 'wp_skip_border_serialization' => array( - 'alt' => 'wp_should_skip_block_supports_serialization()', - 'version' => '6.0.0', - ), - 'wp_skip_dimensions_serialization' => array( - 'alt' => 'wp_should_skip_block_supports_serialization()', - 'version' => '6.0.0', - ), - 'wp_skip_spacing_serialization' => array( - 'alt' => 'wp_should_skip_block_supports_serialization()', - 'version' => '6.0.0', - ), - - // WP 6.0.2. - 'the_meta' => array( - 'alt' => 'get_post_meta()', - 'version' => '6.0.2', - ), - - // WP 6.0.3. - // Verified; see https://core.trac.wordpress.org/ticket/56791#comment:10. - '_filter_query_attachment_filenames' => array( - 'alt' => 'add_filter( "wp_allow_query_attachment_by_filename", "__return_true" )', - 'version' => '6.0.3', - ), - - // WP 6.1.0. - '_get_path_to_translation' => array( - 'alt' => 'WP_Textdomain_Registry', - 'version' => '6.1.0', - ), - '_get_path_to_translation_from_lang_dir' => array( - 'alt' => 'WP_Textdomain_Registry', - 'version' => '6.1.0', - ), - '_wp_multiple_block_styles' => array( - 'alt' => '', - 'version' => '6.1.0', - ), - 'global_terms' => array( - 'alt' => '', - 'version' => '6.1.0', - ), - 'global_terms_enabled' => array( - 'alt' => '', - 'version' => '6.1.0', - ), - 'install_global_terms' => array( - 'alt' => '', - 'version' => '6.1.0', - ), - 'sync_category_tag_slugs' => array( - 'alt' => '', - 'version' => '6.1.0', - ), - 'wp_get_attachment_thumb_file' => array( - 'alt' => '', - 'version' => '6.1.0', - ), - 'wp_typography_get_css_variable_inline_style' => array( - 'alt' => 'wp_style_engine_get_styles()', - 'version' => '6.1.0', - ), - - // WP 6.2.0. - '_resolve_home_block_template' => array( - 'alt' => '', - 'version' => '6.2.0', - ), - 'get_page_by_title' => array( - 'alt' => 'WP_Query', - 'version' => '6.2.0', - ), - - // WP 6.3.0. - '_wp_tinycolor_bound_alpha' => array( - 'alt' => '', - 'version' => '6.3.0', - ), - 'block_core_navigation_get_classic_menu_fallback' => array( - 'alt' => 'WP_Navigation_Fallback::get_classic_menu_fallback', - 'version' => '6.3.0', - ), - 'block_core_navigation_get_classic_menu_fallback_blocks' => array( - 'alt' => 'WP_Navigation_Fallback::get_classic_menu_fallback_blocks', - 'version' => '6.3.0', - ), - 'block_core_navigation_get_most_recently_published_navigation' => array( - 'alt' => 'WP_Navigation_Fallback::get_most_recently_published_navigation', - 'version' => '6.3.0', - ), - 'block_core_navigation_maybe_use_classic_menu_fallback' => array( - 'alt' => 'WP_Navigation_Fallback::create_classic_menu_fallback', - 'version' => '6.3.0', - ), - 'block_core_navigation_parse_blocks_from_menu_items' => array( - 'alt' => 'WP_Navigation_Fallback::parse_blocks_from_menu_items', - 'version' => '6.3.0', - ), - 'block_core_navigation_submenu_build_css_colors' => array( - // Verified correct alternative. - 'alt' => 'wp_apply_colors_support()', - 'version' => '6.3.0', - ), - 'wlwmanifest_link' => array( - 'alt' => '', - 'version' => '6.3.0', - ), - 'wp_get_duotone_filter_id' => array( - 'alt' => '', - 'version' => '6.3.0', - ), - 'wp_get_duotone_filter_property' => array( - 'alt' => '', - 'version' => '6.3.0', - ), - 'wp_get_duotone_filter_svg' => array( - 'alt' => 'WP_Duotone::get_filter_svg_from_preset()', - 'version' => '6.3.0', - ), - 'wp_get_global_styles_svg_filters' => array( - 'alt' => '', - 'version' => '6.3.0', - ), - 'wp_get_loading_attr_default' => array( - 'alt' => 'wp_get_loading_optimization_attributes()', - 'version' => '6.3.0', - ), - 'wp_global_styles_render_svg_filters' => array( - 'alt' => '', - 'version' => '6.3.0', - ), - 'wp_img_tag_add_loading_attr' => array( - 'alt' => 'wp_img_tag_add_loading_optimization_attrs()', - 'version' => '6.3.0', - ), - 'wp_queue_comments_for_comment_meta_lazyload' => array( - 'alt' => 'wp_lazyload_comment_meta()', - 'version' => '6.3.0', - ), - 'wp_register_duotone_support' => array( - 'alt' => 'WP_Duotone::register_duotone_support()', - 'version' => '6.3.0', - ), - 'wp_render_duotone_support' => array( - 'alt' => 'WP_Duotone::render_duotone_support()', - 'version' => '6.3.0', - ), - 'wp_tinycolor_bound01' => array( - 'alt' => '', - 'version' => '6.3.0', - ), - 'wp_tinycolor_hsl_to_rgb' => array( - 'alt' => '', - 'version' => '6.3.0', - ), - 'wp_tinycolor_hue_to_rgb' => array( - 'alt' => '', - 'version' => '6.3.0', - ), - 'wp_tinycolor_rgb_to_rgb' => array( - 'alt' => '', - 'version' => '6.3.0', - ), - 'wp_tinycolor_string_to_rgb' => array( - 'alt' => '', - 'version' => '6.3.0', - ), - - // WP 6.4.0. - '_admin_bar_bump_cb' => array( - 'alt' => 'wp_enqueue_admin_bar_bump_styles()', - 'version' => '6.4.0', - ), - '_inject_theme_attribute_in_block_template_content' => array( - 'alt' => 'traverse_and_serialize_blocks( parse_blocks( $template_content ), "_inject_theme_attribute_in_template_part_block" )', - 'version' => '6.4.0', - ), - '_remove_theme_attribute_in_block_template_content' => array( - 'alt' => 'traverse_and_serialize_blocks( parse_blocks( $template_content ), "_remove_theme_attribute_from_template_part_block" )', - 'version' => '6.4.0', - ), - '_wp_theme_json_webfonts_handler' => array( - 'alt' => 'wp_print_font_faces()', - 'version' => '6.4.0', - ), - 'print_embed_styles' => array( - 'alt' => 'wp_enqueue_embed_styles()', - 'version' => '6.4.0', - ), - 'print_emoji_styles' => array( - 'alt' => 'wp_enqueue_emoji_styles()', - 'version' => '6.4.0', - ), - 'the_block_template_skip_link' => array( - 'alt' => 'wp_enqueue_block_template_skip_link()', - 'version' => '6.4.0', - ), - 'wp_admin_bar_header' => array( - 'alt' => 'wp_enqueue_admin_bar_header_styles()', - 'version' => '6.4.0', - ), - 'wp_img_tag_add_decoding_attr' => array( - 'alt' => 'wp_img_tag_add_loading_optimization_attrs()', - 'version' => '6.4.0', - ), - 'wp_update_https_detection_errors' => array( - // Verified correct alternative. - 'alt' => 'wp_get_https_detection_errors()', - 'version' => '6.4.0', - ), - - // WP 6.5.0. - 'block_core_file_ensure_interactivity_dependency' => array( - 'alt' => 'wp_register_script_module()', - 'version' => '6.5.0', - ), - 'block_core_image_ensure_interactivity_dependency' => array( - 'alt' => 'wp_register_script_module()', - 'version' => '6.5.0', - ), - 'block_core_query_ensure_interactivity_dependency' => array( - 'alt' => 'wp_register_script_module()', - 'version' => '6.5.0', - ), - - // WP 6.6.0. - 'wp_interactivity_process_directives_of_interactive_blocks' => array( - 'alt' => '', - 'version' => '6.6.0', - ), - 'wp_render_elements_support' => array( - 'alt' => 'wp_render_elements_class_name()', - 'version' => '6.6.0', - ), - - // WP 6.7.0. - 'current_user_can_for_blog' => array( - 'alt' => 'current_user_can_for_site()', - 'version' => '6.7.0', - ), - 'wp_create_block_style_variation_instance_name' => array( - 'alt' => 'wp_unique_id( $variation . \'--\' )', - 'version' => '6.7.0', - ), - 'wp_enqueue_global_styles_custom_css' => array( - 'alt' => 'wp_enqueue_global_styles()', - 'version' => '6.7.0', - ), - 'wp_get_global_styles_custom_css' => array( - 'alt' => 'wp_get_global_stylesheet() or WP_Theme_JSON::get_styles_for_block()', - 'version' => '6.7.0', - ), - 'wp_init_targeted_link_rel_filters' => array( - 'alt' => '', - 'version' => '6.7.0', - ), - 'wp_remove_targeted_link_rel_filters' => array( - 'alt' => '', - 'version' => '6.7.0', - ), - 'wp_simplepie_autoload' => array( - 'alt' => 'SimplePie_Autoloader', - 'version' => '6.7.0', - ), - 'wp_targeted_link_rel' => array( - 'alt' => '', - 'version' => '6.7.0', - ), - 'wp_targeted_link_rel_callback' => array( - 'alt' => '', - 'version' => '6.7.0', - ), - - // WP 6.8.0. - 'wp_add_editor_classic_theme_styles' => array( - 'alt' => 'wp_enqueue_classic_theme_styles()', - 'version' => '6.8.0', - ), - - // WP 6.9.0. - // Note: the deprecation of the (polyfilled) `utf8_encode()` and `utf8_decode()` functions is deliberately - // not listed here as these are polyfills for the PHP native functions, not WP native functions. - 'seems_utf8' => array( - 'alt' => 'wp_is_valid_utf8()', - 'version' => '6.9.0', - ), - 'wp_print_auto_sizes_contain_css_fix' => array( - 'alt' => 'wp_enqueue_img_auto_sizes_contain_css_fix()', - 'version' => '6.9.0', - ), - ); - - /** - * Groups of functions to restrict. - * - * @return array - */ - public function getGroups() { - // Make sure all array keys are lowercase. - $this->deprecated_functions = array_change_key_case( $this->deprecated_functions, \CASE_LOWER ); - - return array( - 'deprecated_functions' => array( - 'functions' => array_keys( $this->deprecated_functions ), - ), - ); - } - - /** - * Process a matched token. - * - * @param int $stackPtr The position of the current token in the stack. - * @param string $group_name The name of the group which was matched. Will - * always be 'deprecated_functions'. - * @param string $matched_content The token content (function name) which was matched - * in lowercase. - * - * @return void - */ - public function process_matched_token( $stackPtr, $group_name, $matched_content ) { - - $this->set_minimum_wp_version(); - - $message = '%s() has been deprecated since WordPress version %s.'; - $data = array( - $this->tokens[ $stackPtr ]['content'], - $this->deprecated_functions[ $matched_content ]['version'], - ); - - if ( ! empty( $this->deprecated_functions[ $matched_content ]['alt'] ) ) { - $message .= ' Use %s instead.'; - $data[] = $this->deprecated_functions[ $matched_content ]['alt']; - } - - MessageHelper::addMessage( - $this->phpcsFile, - $message, - $stackPtr, - ( $this->wp_version_compare( $this->deprecated_functions[ $matched_content ]['version'], $this->minimum_wp_version, '<' ) ), - MessageHelper::stringToErrorcode( $matched_content . 'Found' ), - $data - ); - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/DeprecatedParameterValuesSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/DeprecatedParameterValuesSniff.php deleted file mode 100644 index 1eefb65..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/DeprecatedParameterValuesSniff.php +++ /dev/null @@ -1,307 +0,0 @@ ->> Multidimensional array with parameter details. - * $target_functions = array( - * (string) Function name. => array( - * (int) Target parameter position, 1-based. => array( - * (string) 'name' => (string|array) Parameter name(s), - * (string) 'values' => array( - * (string) Parameter value. => array( - * 'alt' => (string) Suggested alternative. - * 'version' => (int) The WordPress version when deprecated. - * ) - * ) - * ) - * ) - * ); - */ - protected $target_functions = array( - 'add_option' => array( - 1 => array( - 'name' => 'option', - 'values' => array( - 'blacklist_keys' => array( - 'alt' => 'disallowed_keys', - 'version' => '5.5.0', - ), - 'comment_whitelist' => array( - 'alt' => 'comment_previously_approved', - 'version' => '5.5.0', - ), - ), - ), - ), - 'add_settings_field' => array( - 4 => array( - 'name' => 'page', - 'values' => array( - 'misc' => array( - 'alt' => 'another settings group', - 'version' => '3.0.0', - ), - 'privacy' => array( - 'alt' => 'another settings group', - 'version' => '3.5.0', - ), - ), - ), - ), - 'add_settings_section' => array( - 4 => array( - 'name' => 'page', - 'values' => array( - 'misc' => array( - 'alt' => 'another settings group', - 'version' => '3.0.0', - ), - 'privacy' => array( - 'alt' => 'another settings group', - 'version' => '3.5.0', - ), - ), - ), - ), - 'bloginfo' => array( - 1 => array( - 'name' => 'show', - 'values' => array( - 'home' => array( - 'alt' => 'the "url" argument', - 'version' => '2.2.0', - ), - 'siteurl' => array( - 'alt' => 'the "url" argument', - 'version' => '2.2.0', - ), - 'text_direction' => array( - 'alt' => 'is_rtl()', - 'version' => '2.2.0', - ), - ), - ), - ), - 'get_bloginfo' => array( - 1 => array( - 'name' => 'show', - 'values' => array( - 'home' => array( - 'alt' => 'the "url" argument', - 'version' => '2.2.0', - ), - 'siteurl' => array( - 'alt' => 'the "url" argument', - 'version' => '2.2.0', - ), - 'text_direction' => array( - 'alt' => 'is_rtl()', - 'version' => '2.2.0', - ), - ), - ), - ), - 'get_option' => array( - 1 => array( - 'name' => 'option', - 'values' => array( - 'blacklist_keys' => array( - 'alt' => 'disallowed_keys', - 'version' => '5.5.0', - ), - 'comment_whitelist' => array( - 'alt' => 'comment_previously_approved', - 'version' => '5.5.0', - ), - ), - ), - ), - 'register_setting' => array( - 1 => array( - 'name' => 'option_group', - 'values' => array( - 'misc' => array( - 'alt' => 'another settings group', - 'version' => '3.0.0', - ), - 'privacy' => array( - 'alt' => 'another settings group', - 'version' => '3.5.0', - ), - ), - ), - ), - 'unregister_setting' => array( - 1 => array( - 'name' => 'option_group', - 'values' => array( - 'misc' => array( - 'alt' => 'another settings group', - 'version' => '3.0.0', - ), - 'privacy' => array( - 'alt' => 'another settings group', - 'version' => '3.5.0', - ), - ), - ), - ), - 'update_option' => array( - 1 => array( - 'name' => 'option', - 'values' => array( - 'blacklist_keys' => array( - 'alt' => 'disallowed_keys', - 'version' => '5.5.0', - ), - 'comment_whitelist' => array( - 'alt' => 'comment_previously_approved', - 'version' => '5.5.0', - ), - ), - ), - ), - 'wp_get_typography_font_size_value' => array( - 2 => array( - 'name' => 'settings', - 'values' => array( - 'true' => array( - 'alt' => 'an array', - 'version' => '6.6.0', - ), - 'false' => array( - 'alt' => 'an array', - 'version' => '6.6.0', - ), - ), - ), - ), - ); - - /** - * Process the parameters of a matched function. - * - * @since 1.0.0 - * - * @param int $stackPtr The position of the current token in the stack. - * @param string $group_name The name of the group which was matched. - * @param string $matched_content The token content (function name) which was matched - * in lowercase. - * @param array $parameters Array with information about the parameters. - * - * @return void - */ - public function process_parameters( $stackPtr, $group_name, $matched_content, $parameters ) { - $this->set_minimum_wp_version(); - - foreach ( $this->target_functions[ $matched_content ] as $position => $parameter_args ) { - $found_param = PassedParameters::getParameterFromStack( $parameters, $position, $parameter_args['name'] ); - - // Skip if the parameter was not found. - if ( false === $found_param ) { - continue; - } - - $this->process_parameter( $matched_content, $found_param, $parameter_args['values'] ); - } - } - - /** - * Process the parameter of a matched function. - * - * @since 1.0.0 - * - * @param string $matched_content The token content (function name) which was matched - * in lowercase. - * @param array $parameter Array with start and end token position of the parameter. - * @param array $parameter_args Array with alternative and WordPress deprecation version of the parameter. - * - * @return void - */ - protected function process_parameter( $matched_content, $parameter, $parameter_args ) { - - $parameter_position = $this->phpcsFile->findNext( - Tokens::$emptyTokens, - $parameter['start'], - $parameter['end'] + 1, - true - ); - - if ( false === $parameter_position ) { - return; - } - - $matched_parameter = TextStrings::stripQuotes( $this->tokens[ $parameter_position ]['content'] ); - if ( ! isset( $parameter_args[ $matched_parameter ] ) ) { - return; - } - - $message = 'The parameter value "%s" has been deprecated since WordPress version %s.'; - $data = array( - $matched_parameter, - $parameter_args[ $matched_parameter ]['version'], - ); - - if ( ! empty( $parameter_args[ $matched_parameter ]['alt'] ) ) { - $message .= ' Use %s instead.'; - $data[] = $parameter_args[ $matched_parameter ]['alt']; - } - - $is_error = $this->wp_version_compare( $parameter_args[ $matched_parameter ]['version'], $this->minimum_wp_version, '<' ); - MessageHelper::addMessage( - $this->phpcsFile, - $message, - $parameter_position, - $is_error, - 'Found', - $data - ); - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/DeprecatedParametersSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/DeprecatedParametersSniff.php deleted file mode 100644 index 265035f..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/DeprecatedParametersSniff.php +++ /dev/null @@ -1,531 +0,0 @@ - value - * in a custom ruleset. - * - * @uses \WordPressCS\WordPress\Helpers\MinimumWPVersionTrait::$minimum_wp_version - */ -final class DeprecatedParametersSniff extends AbstractFunctionParameterSniff { - - use MinimumWPVersionTrait; - - /** - * The group name for this group of functions. - * - * @since 0.12.0 - * - * @var string - */ - protected $group_name = 'wp_deprecated_parameters'; - - /** - * Array of function, argument, and default value for deprecated argument. - * - * The functions are ordered alphabetically. - * - * {@internal To be updated after every major release. Last updated for WordPress 6.9.0-RC2.} - * - * @since 0.12.0 - * - * @var array>> Multidimensional array with parameter details. - * $target_functions = array( - * (string) Function name. => array( - * (int) Target parameter position, 1-based. => array( - * 'name' => (string|array) Parameter name or list of names if the parameter - * was renamed since the release of PHP 8.0. - * 'value' => (mixed) Expected default value for the deprecated parameter. - * Currently the default values: true, false, null, empty arrays - * and both empty and non-empty strings can be handled correctly - * by the process_parameters() method. - * When an additional default value is added, the relevant code - * in the process_parameters() method will need to be adjusted. - * 'version' => (int) The WordPress version when deprecated. - * ) - * ) - * ); - */ - protected $target_functions = array( - '_future_post_hook' => array( - 1 => array( - 'name' => 'deprecated', - 'value' => null, - 'version' => '2.3.0', - ), - ), - '_load_remote_block_patterns' => array( - 1 => array( - 'name' => 'deprecated', - 'value' => null, - 'version' => '5.9.0', - ), - ), - '_wp_can_use_pcre_u' => array( - 1 => array( - 'name' => 'set', - 'value' => null, - 'version' => '6.9.0', - ), - ), - '_wp_post_revision_fields' => array( - 2 => array( - 'name' => 'deprecated', - 'value' => false, - 'version' => '4.5.0', - ), - ), - 'add_option' => array( - 3 => array( - 'name' => 'deprecated', - 'value' => '', - 'version' => '2.3.0', - ), - ), - 'comments_link' => array( - 1 => array( - 'name' => 'deprecated', - 'value' => '', - 'version' => '0.72', - ), - 2 => array( - 'name' => 'deprecated_2', - 'value' => '', - 'version' => '1.3.0', - ), - ), - 'convert_chars' => array( - 2 => array( - 'name' => 'deprecated', - 'value' => '', - 'version' => '0.71', - ), - ), - 'delete_plugins' => array( - 2 => array( - 'name' => 'deprecated', - 'value' => '', - 'version' => '4.0.0', - ), - ), - 'discover_pingback_server_uri' => array( - 2 => array( - 'name' => 'deprecated', - 'value' => '', - 'version' => '2.7.0', - ), - ), - 'get_blog_list' => array( - 3 => array( - 'name' => 'deprecated', - 'value' => '', - 'version' => '3.0.0', // Was previously part of MU. - ), - ), - 'get_category_parents' => array( - 5 => array( - 'name' => 'deprecated', - 'value' => array(), - 'version' => '4.8.0', - ), - ), - 'get_delete_post_link' => array( - 2 => array( - 'name' => 'deprecated', - 'value' => '', - 'version' => '3.0.0', - ), - ), - 'get_last_updated' => array( - 1 => array( - 'name' => 'deprecated', - 'value' => '', - 'version' => '3.0.0', // Was previously part of MU. - ), - ), - 'get_site_option' => array( - 3 => array( - 'name' => 'deprecated', - 'value' => true, - 'version' => '4.4.0', - ), - ), - 'get_terms' => array( - 2 => array( - 'name' => 'deprecated', - 'value' => '', - 'version' => '4.5.0', - ), - ), - 'get_the_author' => array( - 1 => array( - 'name' => 'deprecated', - 'value' => '', - 'version' => '2.1.0', - ), - ), - 'get_user_option' => array( - 3 => array( - 'name' => 'deprecated', - 'value' => '', - 'version' => '3.0.0', - ), - ), - 'get_wp_title_rss' => array( - 1 => array( - 'name' => 'deprecated', - 'value' => '–', - 'version' => '4.4.0', - ), - ), - 'global_terms' => array( - 2 => array( - 'name' => 'deprecated', - 'value' => '', - 'version' => '6.1.0', - ), - ), - 'iframe_header' => array( - 2 => array( - 'name' => 'deprecated', - 'value' => false, - 'version' => '4.2.0', - ), - ), - 'inject_ignored_hooked_blocks_metadata_attributes' => array( - 2 => array( - 'name' => 'deprecated', - 'value' => null, - 'version' => '6.5.3', - ), - ), - 'install_search_form' => array( - 1 => array( - 'name' => 'deprecated', - 'value' => true, - 'version' => '4.6.0', - ), - ), - 'is_email' => array( - 2 => array( - 'name' => 'deprecated', - 'value' => false, - 'version' => '3.0.0', - ), - ), - 'load_plugin_textdomain' => array( - 2 => array( - 'name' => 'deprecated', - 'value' => false, - 'version' => '2.7.0', - ), - ), - 'newblog_notify_siteadmin' => array( - 2 => array( - 'name' => 'deprecated', - 'value' => '', - 'version' => '3.0.0', - ), - ), - 'permalink_single_rss' => array( - 1 => array( - 'name' => 'deprecated', - 'value' => '', - 'version' => '2.3.0', - ), - ), - 'redirect_this_site' => array( - 1 => array( - 'name' => 'deprecated', - 'value' => '', - 'version' => '3.0.0', - ), - ), - 'register_meta' => array( - 4 => array( - 'name' => 'deprecated', - 'value' => null, - 'version' => '4.6.0', - ), - ), - 'safecss_filter_attr' => array( - 2 => array( - 'name' => 'deprecated', - 'value' => '', - 'version' => '2.8.1', - ), - ), - 'switch_to_blog' => array( - 2 => array( - 'name' => 'deprecated', - 'value' => null, - 'version' => '3.5.0', // Was previously part of MU. - ), - ), - 'term_description' => array( - 2 => array( - 'name' => 'deprecated', - 'value' => null, - 'version' => '4.9.2', - ), - ), - 'the_attachment_link' => array( - 3 => array( - 'name' => 'deprecated', - 'value' => false, - 'version' => '2.5.0', - ), - ), - 'the_author' => array( - 1 => array( - 'name' => 'deprecated', - 'value' => '', - 'version' => '2.1.0', - ), - 2 => array( - 'name' => 'deprecated_echo', - 'value' => true, - 'version' => '1.5.0', - ), - ), - 'the_author_posts_link' => array( - 1 => array( - 'name' => 'deprecated', - 'value' => '', - 'version' => '2.1.0', - ), - ), - 'trackback_rdf' => array( - 1 => array( - 'name' => 'deprecated', - 'value' => '', - 'version' => '2.5.0', - ), - ), - 'trackback_url' => array( - 1 => array( - 'name' => 'deprecated_echo', - 'value' => true, - 'version' => '2.5.0', - ), - ), - 'unregister_setting' => array( - 3 => array( - 'name' => 'deprecated', - 'value' => '', - 'version' => '4.7.0', - ), - ), - 'update_blog_option' => array( - 4 => array( - 'name' => 'deprecated', - 'value' => null, - 'version' => '3.1.0', - ), - ), - 'update_blog_status' => array( - 4 => array( - 'name' => 'deprecated', - 'value' => null, - 'version' => '3.1.0', - ), - ), - 'update_posts_count' => array( - 1 => array( - 'name' => 'deprecated', - 'value' => '', - 'version' => '3.0.0', - ), - ), - 'update_user_status' => array( - 4 => array( - 'name' => 'deprecated', - 'value' => null, - 'version' => '3.0.2', - ), - ), - 'wp_count_terms' => array( - 2 => array( - 'name' => 'deprecated', - 'value' => '', - 'version' => '5.6.0', - ), - ), - 'wp_create_thumbnail' => array( - 3 => array( - 'name' => 'deprecated', - 'value' => '', - 'version' => '3.5.0', - ), - ), - 'wp_get_http_headers' => array( - 2 => array( - 'name' => 'deprecated', - 'value' => false, - 'version' => '2.7.0', - ), - ), - 'wp_get_sidebars_widgets' => array( - 1 => array( - 'name' => 'deprecated', - 'value' => true, - 'version' => '2.8.1', - ), - ), - 'wp_install' => array( - 5 => array( - 'name' => 'deprecated', - 'value' => '', - 'version' => '2.6.0', - ), - ), - 'wp_login' => array( - 3 => array( - 'name' => 'deprecated', - 'value' => '', - 'version' => '2.5.0', - ), - ), - 'wp_new_user_notification' => array( - 2 => array( - 'name' => 'deprecated', - 'value' => null, - 'version' => '4.3.1', - ), - ), - 'wp_notify_postauthor' => array( - 2 => array( - 'name' => 'deprecated', - 'value' => null, - 'version' => '3.8.0', - ), - ), - 'wp_render_elements_support_styles' => array( - 1 => array( - 'name' => 'parsed_block', - 'value' => null, - 'version' => '6.6.0', - ), - ), - 'wp_title_rss' => array( - 1 => array( - 'name' => 'deprecated', - 'value' => '–', - 'version' => '4.4.0', - ), - ), - 'wp_upload_bits' => array( - 2 => array( - 'name' => 'deprecated', - 'value' => null, - 'version' => '2.0.0', - ), - ), - 'xfn_check' => array( - 3 => array( - 'name' => 'deprecated', - 'value' => '', - 'version' => '2.5.0', - ), - ), - ); - - /** - * Process the parameters of a matched function. - * - * @since 0.12.0 - * - * @param int $stackPtr The position of the current token in the stack. - * @param string $group_name The name of the group which was matched. - * @param string $matched_content The token content (function name) which was matched - * in lowercase. - * @param array $parameters Array with information about the parameters. - * - * @return void - */ - public function process_parameters( $stackPtr, $group_name, $matched_content, $parameters ) { - - $this->set_minimum_wp_version(); - - $paramCount = \count( $parameters ); - foreach ( $this->target_functions[ $matched_content ] as $position => $parameter_args ) { - - $found_param = PassedParameters::getParameterFromStack( $parameters, $position, $parameter_args['name'] ); - if ( false === $found_param ) { - continue; - } - - // The list will need to updated if the default value is not supported. - switch ( $found_param['raw'] ) { - case 'true': - $matched_parameter = true; - break; - case 'false': - $matched_parameter = false; - break; - case 'null': - $matched_parameter = null; - break; - case 'array()': - case '[]': - $matched_parameter = array(); - break; - default: - $matched_parameter = TextStrings::stripQuotes( $found_param['raw'] ); - break; - } - - if ( $parameter_args['value'] === $matched_parameter ) { - continue; - } - - $message = 'The parameter "%s" at position #%s of %s() has been deprecated since WordPress version %s.'; - $is_error = $this->wp_version_compare( $parameter_args['version'], $this->minimum_wp_version, '<' ); - $code = MessageHelper::stringToErrorcode( ucfirst( $matched_content ) . 'Param' . $position . 'Found' ); - - $data = array( - $found_param['raw'], - $position, - $matched_content, - $parameter_args['version'], - ); - - if ( isset( $parameter_args['value'] ) - && isset( $found_param['name'] ) === false - && $position < $paramCount - ) { - $message .= ' Use "%s" instead.'; - $data[] = (string) $parameter_args['value']; - } else { - $message .= ' Instead do not pass the parameter.'; - } - - MessageHelper::addMessage( $this->phpcsFile, $message, $stackPtr, $is_error, $code, $data, 0 ); - } - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/DiscouragedConstantsSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/DiscouragedConstantsSniff.php deleted file mode 100644 index 7db5a37..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/DiscouragedConstantsSniff.php +++ /dev/null @@ -1,160 +0,0 @@ - 'get_stylesheet_directory()', - 'TEMPLATEPATH' => 'get_template_directory()', - 'PLUGINDIR' => 'WP_PLUGIN_DIR', - 'MUPLUGINDIR' => 'WPMU_PLUGIN_DIR', - 'HEADER_IMAGE' => 'add_theme_support( \'custom-header\' )', - 'NO_HEADER_TEXT' => 'add_theme_support( \'custom-header\' )', - 'HEADER_TEXTCOLOR' => 'add_theme_support( \'custom-header\' )', - 'HEADER_IMAGE_WIDTH' => 'add_theme_support( \'custom-header\' )', - 'HEADER_IMAGE_HEIGHT' => 'add_theme_support( \'custom-header\' )', - 'BACKGROUND_COLOR' => 'add_theme_support( \'custom-background\' )', - 'BACKGROUND_IMAGE' => 'add_theme_support( \'custom-background\' )', - ); - - /** - * Array of functions to check. - * - * @since 0.14.0 - * @since 3.0.0 The format of the value has changed from an integer parameter - * position to an array with the parameter position and name. - * - * @var array> Function name as key, array with target - * parameter and name as value. - */ - protected $target_functions = array( - 'define' => array( - 'position' => 1, - 'name' => 'constant_name', - ), - ); - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 0.14.0 - * - * @param int $stackPtr The position of the current token in the stack. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function process_token( $stackPtr ) { - if ( isset( $this->target_functions[ strtolower( $this->tokens[ $stackPtr ]['content'] ) ] ) ) { - // Disallow excluding function groups for this sniff. - $this->exclude = array(); - - return parent::process_token( $stackPtr ); - - } else { - return $this->process_arbitrary_tstring( $stackPtr ); - } - } - - /** - * Process an arbitrary T_STRING token to determine whether it is one of the target constants. - * - * @since 0.14.0 - * - * @param int $stackPtr The position of the current token in the stack. - * - * @return void - */ - public function process_arbitrary_tstring( $stackPtr ) { - $content = $this->tokens[ $stackPtr ]['content']; - - if ( ! isset( $this->discouraged_constants[ $content ] ) ) { - return; - } - - if ( ConstantsHelper::is_use_of_global_constant( $this->phpcsFile, $stackPtr ) === false ) { - return; - } - - $this->phpcsFile->addWarning( - 'Found usage of constant "%s". Use %s instead.', - $stackPtr, - MessageHelper::stringToErrorcode( $content . 'UsageFound' ), - array( - $content, - $this->discouraged_constants[ $content ], - ) - ); - } - - /** - * Process the parameters of a matched `define` function call. - * - * @since 0.14.0 - * - * @param int $stackPtr The position of the current token in the stack. - * @param string $group_name The name of the group which was matched. - * @param string $matched_content The token content (function name) which was matched - * in lowercase. - * @param array $parameters Array with information about the parameters. - * - * @return void - */ - public function process_parameters( $stackPtr, $group_name, $matched_content, $parameters ) { - $target_param = $this->target_functions[ $matched_content ]; - - // Was the target parameter passed ? - $found_param = PassedParameters::getParameterFromStack( $parameters, $target_param['position'], $target_param['name'] ); - if ( false === $found_param ) { - return; - } - - $clean_content = TextStrings::stripQuotes( $found_param['clean'] ); - - if ( isset( $this->discouraged_constants[ $clean_content ] ) ) { - $first_non_empty = $this->phpcsFile->findNext( - Tokens::$emptyTokens, - $found_param['start'], - ( $found_param['end'] + 1 ), - true - ); - - $this->phpcsFile->addWarning( - 'Found declaration of constant "%s". Use %s instead.', - $first_non_empty, - MessageHelper::stringToErrorcode( $clean_content . 'DeclarationFound' ), - array( - $clean_content, - $this->discouraged_constants[ $clean_content ], - ) - ); - } - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/DiscouragedFunctionsSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/DiscouragedFunctionsSniff.php deleted file mode 100644 index 941b992..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/DiscouragedFunctionsSniff.php +++ /dev/null @@ -1,54 +0,0 @@ - array( - * 'lambda' => array( - * 'type' => 'error' | 'warning', - * 'message' => 'Use anonymous functions instead please!', - * 'functions' => array( 'file_get_contents', 'create_function' ), - * ) - * ) - * - * @return array - */ - public function getGroups() { - return array( - 'query_posts' => array( - 'type' => 'warning', - 'message' => '%s() is discouraged. Use WP_Query instead.', - 'functions' => array( - 'query_posts', - ), - ), - - 'wp_reset_query' => array( - 'type' => 'warning', - 'message' => '%s() is discouraged. Use wp_reset_postdata() instead.', - 'functions' => array( - 'wp_reset_query', - ), - ), - ); - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/EnqueuedResourceParametersSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/EnqueuedResourceParametersSniff.php deleted file mode 100644 index 28b4ba8..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/EnqueuedResourceParametersSniff.php +++ /dev/null @@ -1,268 +0,0 @@ - Key is function name, value irrelevant. - */ - protected $target_functions = array( - 'wp_register_script' => true, - 'wp_enqueue_script' => true, - 'wp_register_style' => true, - 'wp_enqueue_style' => true, - ); - - /** - * False + T_NS_SEPARATOR + the empty tokens array. - * - * This array is enriched with the $emptyTokens array in the register() method. - * - * @var array - */ - private $false_tokens = array( - \T_FALSE => \T_FALSE, - \T_NS_SEPARATOR => \T_NS_SEPARATOR, // Needed to handle fully qualified \false (PHPCS 3.x). - ); - - /** - * Token codes which are "safe" to accept to determine whether a version would evaluate to `false`. - * - * This array is enriched with several of the PHPCS token arrays in the register() method. - * - * @var array - */ - private $safe_tokens = array( - \T_NULL => \T_NULL, - \T_FALSE => \T_FALSE, - \T_TRUE => \T_TRUE, - \T_LNUMBER => \T_LNUMBER, - \T_DNUMBER => \T_DNUMBER, - \T_CONSTANT_ENCAPSED_STRING => \T_CONSTANT_ENCAPSED_STRING, - \T_START_NOWDOC => \T_START_NOWDOC, - \T_NOWDOC => \T_NOWDOC, - \T_END_NOWDOC => \T_END_NOWDOC, - \T_OPEN_PARENTHESIS => \T_OPEN_PARENTHESIS, - \T_CLOSE_PARENTHESIS => \T_CLOSE_PARENTHESIS, - \T_STRING_CONCAT => \T_STRING_CONCAT, - ); - - /** - * Returns an array of tokens this test wants to listen for. - * - * Overloads and calls the parent method to allow for adding additional tokens to the - * $false_tokens and $safe_tokens properties. - * - * @return array - */ - public function register() { - $this->false_tokens += Tokens::$emptyTokens; - - $this->safe_tokens += Tokens::$emptyTokens; - $this->safe_tokens += Tokens::$assignmentTokens; - $this->safe_tokens += Tokens::$comparisonTokens; - $this->safe_tokens += Tokens::$operators; - $this->safe_tokens += Tokens::$booleanOperators; - $this->safe_tokens += Tokens::$castTokens; - - return parent::register(); - } - - /** - * Process the parameters of a matched function. - * - * @since 1.0.0 - * - * @param int $stackPtr The position of the current token in the stack. - * @param string $group_name The name of the group which was matched. - * @param string $matched_content The token content (function name) which was matched - * in lowercase. - * @param array $parameters Array with information about the parameters. - * - * @return void - */ - public function process_parameters( $stackPtr, $group_name, $matched_content, $parameters ) { - // Check to see if a source ($src) is specified. - $src_param = PassedParameters::getParameterFromStack( $parameters, 2, 'src' ); - if ( false === $src_param ) { - return; - } - - /* - * Version Check: Check to make sure the version is set explicitly. - */ - - $version_param = PassedParameters::getParameterFromStack( $parameters, 4, 'ver' ); - - $error_ptr = $stackPtr; - if ( false !== $version_param ) { - $error_ptr = $this->phpcsFile->findNext( Tokens::$emptyTokens, $version_param['start'], ( $version_param['end'] + 1 ), true ); - if ( false === $error_ptr ) { - $error_ptr = $version_param['start']; - } - } - - if ( false === $version_param || strtolower( ltrim( $version_param['clean'], '\\' ) ) === 'null' ) { - $type = 'script'; - if ( strpos( $matched_content, '_style' ) !== false ) { - $type = 'style'; - } - - $this->phpcsFile->addWarning( - 'Resource version not set in call to %s(). This means new versions of the %s may not always be loaded due to browser caching.', - $error_ptr, - 'MissingVersion', - array( $matched_content, $type ) - ); - // The version argument should have a non-false value. - } elseif ( $this->is_falsy( $version_param['start'], $version_param['end'] ) ) { - $this->phpcsFile->addError( - 'Version parameter is not explicitly set or has been set to an equivalent of "false" for %s; ' . - 'This means that the WordPress core version will be used which is not recommended for plugin or theme development.', - $error_ptr, - 'NoExplicitVersion', - array( $matched_content ) - ); - } - - /* - * In footer Check - * - * Check to make sure that $in_footer is explicitly set. - * Warn the user if it is not set. - * - * Only wp_register_script and wp_enqueue_script need this check, - * as this parameter is not available to wp_register_style and wp_enqueue_style. - */ - if ( 'wp_register_script' !== $matched_content && 'wp_enqueue_script' !== $matched_content ) { - return; - } - - $infooter_param = PassedParameters::getParameterFromStack( $parameters, 5, 'in_footer' ); - if ( false === $infooter_param ) { - // If in footer is not set, throw a warning about the default. - $this->phpcsFile->addWarning( - 'In footer ($in_footer) is not set explicitly %s; ' . - 'It is recommended to load scripts in the footer. Please set this value to `true` to load it in the footer, or explicitly `false` if it should be loaded in the header.', - $stackPtr, - 'NotInFooter', - array( $matched_content ) - ); - } - } - - /** - * Determine if a range has a falsy value. - * - * @param int $start The position to start looking from. - * @param int $end The position to stop looking (inclusive). - * - * @return bool True if the parameter is falsy. - * False if the parameter is not falsy or when it - * couldn't be reliably determined. - */ - protected function is_falsy( $start, $end ) { - - // Find anything excluding the false tokens. - $has_non_false = $this->phpcsFile->findNext( $this->false_tokens, $start, ( $end + 1 ), true ); - // If no non-false tokens are found, we are good. - if ( false === $has_non_false ) { - return true; - } - - $code_string = ''; - for ( $i = $start; $i <= $end; $i++ ) { - if ( isset( $this->safe_tokens[ $this->tokens[ $i ]['code'] ] ) === false ) { - // Function call/variable or other token which makes it neigh impossible - // to determine whether the actual value would evaluate to false. - return false; - } - - if ( isset( Tokens::$emptyTokens[ $this->tokens[ $i ]['code'] ] ) === true ) { - continue; - } - - // Make sure that PHP 7.4 numeric literals and PHP 8.1 explicit octals don't cause problems. - if ( \T_LNUMBER === $this->tokens[ $i ]['code'] || \T_DNUMBER === $this->tokens[ $i ]['code'] ) { - $number_info = Numbers::getCompleteNumber( $this->phpcsFile, $i ); - $code_string .= $number_info['decimal']; - $i = $number_info['last_token']; - continue; - } - - // Make sure that when deprecated casts are used in the code under scan and the sniff is run on PHP 8.5, - // the eval() won't cause a deprecation notice, borking the scan of the file. - if ( \PHP_VERSION_ID >= 80500 ) { - if ( \T_INT_CAST === $this->tokens[ $i ]['code'] ) { - $code_string .= '(int)'; - continue; - } - - if ( \T_DOUBLE_CAST === $this->tokens[ $i ]['code'] ) { - $code_string .= '(float)'; - continue; - } - - if ( \T_BOOL_CAST === $this->tokens[ $i ]['code'] ) { - $code_string .= '(bool)'; - continue; - } - - if ( \T_BINARY_CAST === $this->tokens[ $i ]['code'] ) { - $code_string .= '(string)'; - continue; - } - } - - $code_string .= $this->tokens[ $i ]['content']; - } - - if ( '' === $code_string ) { - return false; - } - - // Evaluate the argument to figure out the outcome is false or not. - // phpcs:ignore Squiz.PHP.Eval -- No harm here. - return ( false === eval( "return (bool) $code_string;" ) ); - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/EnqueuedResourcesSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/EnqueuedResourcesSniff.php deleted file mode 100644 index 28142e8..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/EnqueuedResourcesSniff.php +++ /dev/null @@ -1,106 +0,0 @@ -tokens[ $stackPtr ]['content']; - if ( \T_INLINE_HTML !== $this->tokens[ $stackPtr ]['code'] ) { - try { - $end_ptr = TextStrings::getEndOfCompleteTextString( $this->phpcsFile, $stackPtr ); - $content = TextStrings::getCompleteTextString( $this->phpcsFile, $stackPtr ); - } catch ( ValueError $e ) { - // Parse error/live coding. - return; - } - } - - if ( preg_match_all( '# rel=\\\\?[\'"]?stylesheet\\\\?[\'"]?#', $content, $matches, \PREG_OFFSET_CAPTURE ) > 0 ) { - foreach ( $matches[0] as $match ) { - $this->phpcsFile->addError( - 'Stylesheets must be registered/enqueued via wp_enqueue_style()', - $this->find_token_in_multiline_string( $stackPtr, $content, $match[1] ), - 'NonEnqueuedStylesheet' - ); - } - } - - if ( preg_match_all( '#]*(?<=src=)#', $content, $matches, \PREG_OFFSET_CAPTURE ) > 0 ) { - foreach ( $matches[0] as $match ) { - $this->phpcsFile->addError( - 'Scripts must be registered/enqueued via wp_enqueue_script()', - $this->find_token_in_multiline_string( $stackPtr, $content, $match[1] ), - 'NonEnqueuedScript' - ); - } - } - - return ( $end_ptr + 1 ); - } - - /** - * Find the exact token on which the error should be reported for multi-line strings. - * - * @param int $stackPtr The position of the current token in the stack. - * @param string $content The complete, potentially multi-line, text string. - * @param int $match_offset The offset within the content at which the match was found. - * - * @return int The stack pointer to the token containing the start of the match. - */ - private function find_token_in_multiline_string( $stackPtr, $content, $match_offset ) { - $newline_count = 0; - if ( $match_offset > 0 ) { - $newline_count = substr_count( $content, "\n", 0, $match_offset ); - } - - // Account for heredoc/nowdoc text starting at the token *after* the opener. - if ( isset( Tokens::$heredocTokens[ $this->tokens[ $stackPtr ]['code'] ] ) === true ) { - ++$newline_count; - } - - return ( $stackPtr + $newline_count ); - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/GetMetaSingleSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/GetMetaSingleSniff.php deleted file mode 100644 index 76b576d..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/GetMetaSingleSniff.php +++ /dev/null @@ -1,161 +0,0 @@ -> - */ - private const GENERIC_META_FUNCTIONS_FORMAT = array( - 'condition' => array( - 'param_name' => 'meta_key', - 'position' => 3, - ), - 'recommended' => array( - 'param_name' => 'single', - 'position' => 4, - ), - ); - - /** - * Relevant signature structure for specific meta functions. - * - * These functions use 'key' as the parameter name at position 2 and - * 'single' as the parameter name at position 3. - * - * @since 3.3.0 - * - * @var array> - */ - private const SPECIFIC_META_FUNCTIONS_FORMAT = array( - 'condition' => array( - 'param_name' => 'key', - 'position' => 2, - ), - 'recommended' => array( - 'param_name' => 'single', - 'position' => 3, - ), - ); - - /** - * The group name for this group of functions. - * - * @since 3.2.0 - * - * @var string - */ - protected $group_name = 'get_meta'; - - /** - * List of functions this sniff should examine. - * - * @link https://developer.wordpress.org/reference/functions/get_comment_meta/ - * @link https://developer.wordpress.org/reference/functions/get_metadata/ - * @link https://developer.wordpress.org/reference/functions/get_metadata_default/ - * @link https://developer.wordpress.org/reference/functions/get_metadata_raw/ - * @link https://developer.wordpress.org/reference/functions/get_post_meta/ - * @link https://developer.wordpress.org/reference/functions/get_site_meta/ - * @link https://developer.wordpress.org/reference/functions/get_term_meta/ - * @link https://developer.wordpress.org/reference/functions/get_user_meta/ - * - * @since 3.2.0 - * - * @var array>> Key is function name, value is - * an array containing information - * about the name and position of - * the relevant parameters. - */ - protected $target_functions = array( - 'get_comment_meta' => self::SPECIFIC_META_FUNCTIONS_FORMAT, - 'get_metadata' => self::GENERIC_META_FUNCTIONS_FORMAT, - 'get_metadata_default' => self::GENERIC_META_FUNCTIONS_FORMAT, - 'get_metadata_raw' => self::GENERIC_META_FUNCTIONS_FORMAT, - 'get_post_meta' => self::SPECIFIC_META_FUNCTIONS_FORMAT, - 'get_site_meta' => self::SPECIFIC_META_FUNCTIONS_FORMAT, - 'get_term_meta' => self::SPECIFIC_META_FUNCTIONS_FORMAT, - 'get_user_meta' => self::SPECIFIC_META_FUNCTIONS_FORMAT, - ); - - /** - * Process the parameters of a matched function. - * - * @since 3.2.0 - * - * @param int $stackPtr The position of the current token in the stack. - * @param string $group_name The name of the group which was matched. - * @param string $matched_content The token content (function name) which was matched - * in lowercase. - * @param array $parameters Array with information about the parameters. - * - * @return void - */ - public function process_parameters( $stackPtr, $group_name, $matched_content, $parameters ) { - $condition = $this->target_functions[ $matched_content ]['condition']; - $recommended = $this->target_functions[ $matched_content ]['recommended']; - - $meta_key = PassedParameters::getParameterFromStack( $parameters, $condition['position'], $condition['param_name'] ); - if ( ! is_array( $meta_key ) ) { - return; - } - - $single = PassedParameters::getParameterFromStack( $parameters, $recommended['position'], $recommended['param_name'] ); - if ( is_array( $single ) ) { - $this->phpcsFile->recordMetric( $stackPtr, self::METRIC_NAME, 'yes' ); - return; - } - - $this->phpcsFile->recordMetric( $stackPtr, self::METRIC_NAME, 'no' ); - - $tokens = $this->phpcsFile->getTokens(); - $message_data = array( - $condition['param_name'], - $tokens[ $stackPtr ]['content'], - $recommended['param_name'], - ); - - $this->phpcsFile->addWarning( - 'When passing the $%s parameter to %s(), it is recommended to also pass the $%s parameter to explicitly indicate whether a single value or multiple values are expected to be returned.', - $stackPtr, - 'Missing', - $message_data - ); - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/GlobalVariablesOverrideSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/GlobalVariablesOverrideSniff.php deleted file mode 100644 index 934c3e6..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/GlobalVariablesOverrideSniff.php +++ /dev/null @@ -1,436 +0,0 @@ - Key is variable name, value irrelevant. - */ - protected $override_allowed = array( - 'content_width' => true, - 'wp_cockneyreplace' => true, - ); - - /** - * Returns an array of tokens this test wants to listen for. - * - * @since 0.3.0 - * @since 1.1.0 Added class tokens for improved test classes skipping. - * - * @return array - */ - public function register() { - $targets = array( - \T_GLOBAL, - \T_VARIABLE, - ); - $targets += Collections::listOpenTokensBC(); - - // Only used to skip over test classes. - $targets += Tokens::$ooScopeTokens; - - return $targets; - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 0.3.0 - * @since 1.1.0 Split the token specific logic off into separate methods. - * - * @param int $stackPtr The position of the current token in the stack. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - public function process_token( $stackPtr ) { - - $token = $this->tokens[ $stackPtr ]; - - // Ignore variable overrides in test classes. - if ( isset( Tokens::$ooScopeTokens[ $token['code'] ] ) ) { - - if ( true === $this->is_test_class( $this->phpcsFile, $stackPtr ) - && $token['scope_condition'] === $stackPtr - && isset( $token['scope_closer'] ) - ) { - // Skip forward to end of test class. - return $token['scope_closer']; - } - - // Otherwise ignore the tokens as they were only registered to enable skipping over test classes. - return; - } - - /* - * Examine variables within a function scope based on a `global` statement in the - * function. - * Examine variables not within a function scope, but within a list construct, based - * on that. - * Examine variables not within a function scope and access to the `$GLOBALS` - * variable based on the variable token. - * - * Note: No special handling here for code found within PHP 7.4+ arrow functions. - * Arrow functions are "open", i.e. they have by value access to variables in the - * surrounding scope, but they cannot modify the value. - * Additionally, as they can only have one statement, a `global` statement _within_ - * an arrow function declaration will lead to a parse error as the result is - * not a returnable value. - */ - $in_function_scope = Conditions::hasCondition( $this->phpcsFile, $stackPtr, array( \T_FUNCTION, \T_CLOSURE ) ); - - if ( isset( Collections::listOpenTokensBC()[ $token['code'] ] ) - && false === $in_function_scope - && false === $this->treat_files_as_scoped - ) { - return $this->process_list_assignment( $stackPtr ); - } elseif ( \T_VARIABLE === $token['code'] - && ( '$GLOBALS' === $token['content'] - || ( false === $in_function_scope && false === $this->treat_files_as_scoped ) ) - ) { - return $this->process_variable_assignment( $stackPtr ); - } elseif ( \T_GLOBAL === $token['code'] - && ( true === $in_function_scope || true === $this->treat_files_as_scoped ) - ) { - return $this->process_global_statement( $stackPtr, $in_function_scope ); - } - } - - /** - * Check that global variables declared via a list construct are prefixed. - * - * {@internal No need to take special measures for nested lists. Nested or not, - * each list part can only contain one variable being written to.} - * - * @since 2.2.0 - * - * @param int $stackPtr The position of the current token in the stack. - * - * @return int|void Integer stack pointer to skip forward or void to continue - * normal file processing. - */ - protected function process_list_assignment( $stackPtr ) { - $list_open_close = Lists::getOpenClose( $this->phpcsFile, $stackPtr ); - if ( false === $list_open_close ) { - // Live coding or short array, not short list. - return; - } - - $var_pointers = ListHelper::get_list_variables( $this->phpcsFile, $stackPtr ); - foreach ( $var_pointers as $ptr ) { - $this->process_variable_assignment( $ptr, true ); - } - - // No need to re-examine these variables. - return $list_open_close['closer']; - } - - /** - * Check that defined global variables are prefixed. - * - * @since 1.1.0 Logic was previously contained in the process_token() method. - * - * @param int $stackPtr The position of the current token in the stack. - * @param bool $in_list Whether or not this is a variable in a list assignment. - * Defaults to false. - * - * @return void - */ - protected function process_variable_assignment( $stackPtr, $in_list = false ) { - - $token = $this->tokens[ $stackPtr ]; - $var_name = substr( $token['content'], 1 ); // Strip the dollar sign. - $data = array(); - - // Determine the variable name for `$GLOBALS['array_key']`. - if ( 'GLOBALS' === $var_name ) { - $bracketPtr = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $stackPtr + 1 ), null, true ); - - if ( false === $bracketPtr - || \T_OPEN_SQUARE_BRACKET !== $this->tokens[ $bracketPtr ]['code'] - || ! isset( $this->tokens[ $bracketPtr ]['bracket_closer'] ) - ) { - return; - } - - // Retrieve the array key and avoid getting tripped up by some simple obfuscation. - $var_name = ''; - $start = ( $bracketPtr + 1 ); - for ( $ptr = $start; $ptr < $this->tokens[ $bracketPtr ]['bracket_closer']; $ptr++ ) { - /* - * If the globals array key contains a variable, constant, function call - * or interpolated variable, bow out. - */ - if ( \T_VARIABLE === $this->tokens[ $ptr ]['code'] - || \T_STRING === $this->tokens[ $ptr ]['code'] - || \T_DOUBLE_QUOTED_STRING === $this->tokens[ $ptr ]['code'] - ) { - return; - } - - if ( \T_CONSTANT_ENCAPSED_STRING === $this->tokens[ $ptr ]['code'] ) { - $var_name .= TextStrings::stripQuotes( $this->tokens[ $ptr ]['content'] ); - } - } - - if ( '' === $var_name ) { - // Shouldn't happen, but just in case. - return; - } - - // Set up the data for the error message. - $data[] = '$GLOBALS[\'' . $var_name . '\']'; - } - - /* - * Is this one of the WP global variables ? - */ - if ( WPGlobalVariablesHelper::is_wp_global( $var_name ) === false ) { - return; - } - - /* - * Is this one of the WP global variables which are allowed to be overwritten ? - */ - if ( isset( $this->override_allowed[ $var_name ] ) === true ) { - return; - } - - /* - * Check if the variable value is being changed. - */ - if ( false === $in_list - && false === VariableHelper::is_assignment( $this->phpcsFile, $stackPtr ) - && Context::inForeachCondition( $this->phpcsFile, $stackPtr ) !== 'afterAs' - ) { - return; - } - - /* - * Function parameters with the same name as a WP global variable are fine, - * including when they are being assigned a default value. - */ - if ( false === $in_list ) { - $functionPtr = Parentheses::getLastOwner( $this->phpcsFile, $stackPtr, Collections::functionDeclarationTokens() ); - if ( false !== $functionPtr ) { - return; - } - - unset( $functionPtr ); - } - - /* - * Class property declarations with the same name as WP global variables are fine. - */ - if ( false === $in_list && true === Scopes::isOOProperty( $this->phpcsFile, $stackPtr ) ) { - return; - } - - // Still here ? In that case, the WP global variable is being tampered with. - $this->add_error( $stackPtr, $data ); - } - - /** - * Check that global variables imported into a function scope using a global statement - * are not being overruled. - * - * @since 1.1.0 Logic was previously contained in the process_token() method. - * - * @param int $stackPtr The position of the current token in the stack. - * @param bool $in_function_scope Whether the global statement is within a scoped function/closure. - * - * @return void - */ - protected function process_global_statement( $stackPtr, $in_function_scope ) { - /* - * Collect the variables to watch for. - */ - $search = array(); - $ptr = ( $stackPtr + 1 ); - $end_of_statement = $this->phpcsFile->findNext( array( \T_SEMICOLON, \T_CLOSE_TAG ), $ptr ); - - while ( isset( $this->tokens[ $ptr ] ) && $ptr < $end_of_statement ) { - if ( \T_VARIABLE === $this->tokens[ $ptr ]['code'] ) { - $var_name = substr( $this->tokens[ $ptr ]['content'], 1 ); - if ( WPGlobalVariablesHelper::is_wp_global( $var_name ) - && isset( $this->override_allowed[ $var_name ] ) === false - ) { - $search[ $this->tokens[ $ptr ]['content'] ] = true; - } - } - - ++$ptr; - } - - if ( empty( $search ) ) { - return; - } - - /* - * Search for assignments to the imported global variables within the relevant scope. - */ - $start = $ptr; - if ( true === $in_function_scope ) { - $functionPtr = Conditions::getLastCondition( $this->phpcsFile, $stackPtr, Collections::functionDeclarationTokens() ); - if ( isset( $this->tokens[ $functionPtr ]['scope_closer'] ) === false ) { - // Live coding or parse error. - return; - } - $end = $this->tokens[ $functionPtr ]['scope_closer']; - } else { - // Global statement in the global namespace in a file which is being treated as scoped. - $end = $this->phpcsFile->numTokens; - } - - for ( $ptr = $start; $ptr < $end; $ptr++ ) { - - // Skip over nested functions, classes and the likes. - if ( isset( Collections::closedScopes()[ $this->tokens[ $ptr ]['code'] ] ) ) { - if ( ! isset( $this->tokens[ $ptr ]['scope_closer'] ) ) { - // Live coding or parse error. - break; - } - - $ptr = $this->tokens[ $ptr ]['scope_closer']; - continue; - } - - // Make sure to recognize assignments to variables in a list construct. - if ( isset( Collections::listOpenTokensBC()[ $this->tokens[ $ptr ]['code'] ] ) ) { - $list_open_close = Lists::getOpenClose( $this->phpcsFile, $ptr ); - - if ( false === $list_open_close ) { - // Short array, not short list. - continue; - } - - $var_pointers = ListHelper::get_list_variables( $this->phpcsFile, $ptr ); - foreach ( $var_pointers as $ptr ) { - $var_name = $this->tokens[ $ptr ]['content']; - if ( '$GLOBALS' === $var_name ) { - $var_name = '$' . TextStrings::stripQuotes( VariableHelper::get_array_access_key( $this->phpcsFile, $ptr ) ); - } - - if ( isset( $search[ $var_name ] ) ) { - $this->process_variable_assignment( $ptr, true ); - } - } - - // No need to re-examine these variables. - $ptr = $list_open_close['closer']; - continue; - } - - if ( \T_VARIABLE !== $this->tokens[ $ptr ]['code'] ) { - continue; - } - - if ( isset( $search[ $this->tokens[ $ptr ]['content'] ] ) === false ) { - // Not one of the variables we're interested in. - continue; - } - - // Don't throw false positives for static class properties. - if ( ContextHelper::has_object_operator_before( $this->phpcsFile, $ptr ) === true ) { - continue; - } - - if ( true === VariableHelper::is_assignment( $this->phpcsFile, $ptr ) ) { - $this->add_error( $ptr ); - continue; - } - - // Check if this is a variable assignment within a `foreach()` declaration. - if ( Context::inForeachCondition( $this->phpcsFile, $ptr ) === 'afterAs' ) { - $this->add_error( $ptr ); - } - } - } - - /** - * Add the error. - * - * @since 1.1.0 - * - * @param int $stackPtr The position of the token to throw the error for. - * @param array $data Optional. Array containing one entry holding the - * name of the variable being overruled. - * Defaults to the 'content' of the $stackPtr token. - * - * @return void - */ - protected function add_error( $stackPtr, $data = array() ) { - if ( empty( $data ) ) { - $data[] = $this->tokens[ $stackPtr ]['content']; - } - - $this->phpcsFile->addError( - 'Overriding WordPress globals is prohibited. Found assignment to %s', - $stackPtr, - 'Prohibited', - $data - ); - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/I18nSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/I18nSniff.php deleted file mode 100644 index 33158ed..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/I18nSniff.php +++ /dev/null @@ -1,977 +0,0 @@ - Key is function name, value is the function type. - */ - protected $i18n_functions = array( - 'translate' => 'simple', - '__' => 'simple', - 'esc_attr__' => 'simple', - 'esc_html__' => 'simple', - '_e' => 'simple', - 'esc_attr_e' => 'simple', - 'esc_html_e' => 'simple', - 'translate_with_gettext_context' => 'context', - '_x' => 'context', - '_ex' => 'context', - 'esc_attr_x' => 'context', - 'esc_html_x' => 'context', - '_n' => 'number', - '_nx' => 'number_context', - '_n_noop' => 'noopnumber', - '_nx_noop' => 'noopnumber_context', - ); - - /** - * Whether or not the `default` text domain is one of the allowed text domains. - * - * @since 0.14.0 - * - * @var bool - */ - private $text_domain_contains_default = false; - - /** - * Whether or not the `default` text domain is the only allowed text domain. - * - * @since 0.14.0 - * - * @var bool - */ - private $text_domain_is_default = false; - - /** - * Parameter specifications for the functions in each group. - * - * {@internal Even when not all parameters will be examined, the parameter list should still - * be complete in the below array to allow for a correct "total parameters" calculation.} - * - * @since 3.0.0 - * - * @var array Array of the parameter positions and names. - */ - private $parameter_specs = array( - 'simple' => array( - 1 => 'text', - 2 => 'domain', - ), - 'context' => array( - 1 => 'text', - 2 => 'context', - 3 => 'domain', - ), - 'number' => array( - 1 => 'single', - 2 => 'plural', - 3 => 'number', - 4 => 'domain', - ), - 'number_context' => array( - 1 => 'single', - 2 => 'plural', - 3 => 'number', - 4 => 'context', - 5 => 'domain', - ), - 'noopnumber' => array( - 1 => 'singular', - 2 => 'plural', - 3 => 'domain', - ), - 'noopnumber_context' => array( - 1 => 'singular', - 2 => 'plural', - 3 => 'context', - 4 => 'domain', - ), - ); - - /** - * Groups of functions to restrict. - * - * Example: groups => array( - * 'lambda' => array( - * 'type' => 'error' | 'warning', - * 'message' => 'Use anonymous functions instead please!', - * 'functions' => array( 'file_get_contents', 'create_function' ), - * ) - * ) - * - * @return array - */ - public function getGroups() { - return array( - 'i18n' => array( - 'functions' => array_keys( $this->i18n_functions ), - ), - 'typos' => array( - 'functions' => array( - '_', - ), - ), - ); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @since 1.0.0 Defers to the abstractFunctionRestriction sniff for determining - * whether something is a function call. The logic after that has - * been split off to the `process_matched_token()` method. - * - * @param int $stackPtr The position of the current token in the stack. - * - * @return void - */ - public function process_token( $stackPtr ) { - - // Reset defaults. - $this->text_domain_contains_default = false; - $this->text_domain_is_default = false; - - // Allow overruling the text_domain set in a ruleset via the command line. - $cl_text_domain = Helper::getConfigData( 'text_domain' ); - if ( ! empty( $cl_text_domain ) ) { - $cl_text_domain = trim( $cl_text_domain ); - if ( '' !== $cl_text_domain ) { - $this->text_domain = array_filter( array_map( 'trim', explode( ',', $cl_text_domain ) ) ); - } - } - - $this->text_domain = RulesetPropertyHelper::merge_custom_array( $this->text_domain, array(), false ); - - if ( ! empty( $this->text_domain ) ) { - if ( \in_array( 'default', $this->text_domain, true ) ) { - $this->text_domain_contains_default = true; - if ( \count( $this->text_domain ) === 1 ) { - $this->text_domain_is_default = true; - } - } - } - - // Prevent exclusion of the i18n group. - $this->exclude = array(); - - parent::process_token( $stackPtr ); - } - - /** - * Process a matched token. - * - * @since 1.0.0 Logic split off from the `process_token()` method. - * - * @param int $stackPtr The position of the current token in the stack. - * @param string $group_name The name of the group which was matched. - * @param string $matched_content The token content (function name) which was matched - * in lowercase. - * - * @return void - */ - public function process_matched_token( $stackPtr, $group_name, $matched_content ) { - - $func_open_paren_token = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $stackPtr + 1 ), null, true ); - if ( ! isset( $this->tokens[ $func_open_paren_token ]['parenthesis_closer'] ) ) { - // Live coding, parse error or not a function call. - return; - } - - if ( 'typos' === $group_name && '_' === $matched_content ) { - $this->phpcsFile->addError( - 'Found single-underscore "_()" function when double-underscore expected.', - $stackPtr, - 'SingleUnderscoreGetTextFunction' - ); - return; - } - - if ( 'translate' === $matched_content || 'translate_with_gettext_context' === $matched_content ) { - $this->phpcsFile->addWarning( - 'Use of the "%s()" function is reserved for low-level API usage.', - $stackPtr, - 'LowLevelTranslationFunction', - array( $matched_content ) - ); - } - - parent::process_matched_token( $stackPtr, $group_name, $matched_content ); - } - - /** - * Process the function if no parameters were found. - * - * @since 3.0.0 - * - * @param int $stackPtr The position of the current token in the stack. - * @param string $group_name The name of the group which was matched. - * @param string $matched_content The token content (function name) which was matched - * in lowercase. - * - * @return void - */ - public function process_no_parameters( $stackPtr, $group_name, $matched_content ) { - $function_param_specs = $this->parameter_specs[ $this->i18n_functions[ $matched_content ] ]; - - foreach ( $function_param_specs as $param_name ) { - $error_code = MessageHelper::stringToErrorcode( 'MissingArg' . ucfirst( $param_name ) ); - $this->phpcsFile->addError( - 'Missing $%s parameter in function call to %s().', - $stackPtr, - $error_code, - array( $param_name, $matched_content ) - ); - } - } - - /** - * Process the parameters of a matched function. - * - * @since 3.0.0 - * - * @param int $stackPtr The position of the current token in the stack. - * @param string $group_name The name of the group which was matched. - * @param string $matched_content The token content (function name) which was matched - * in lowercase. - * @param array $parameters Array with information about the parameters. - * - * @return void - */ - public function process_parameters( $stackPtr, $group_name, $matched_content, $parameters ) { - /* - * Retrieve the individual parameters from the array in a way that we know which is which. - */ - $parameter_details = array(); - - $function_param_specs = $this->parameter_specs[ $this->i18n_functions[ $matched_content ] ]; - $expected_args = count( $function_param_specs ); - - foreach ( $function_param_specs as $position => $name ) { - if ( 'number' === $name ) { - // This sniff does not examine the $number parameter. - continue; - } - - $parameter_details[ $name ] = PassedParameters::getParameterFromStack( $parameters, $position, $name ); - } - - /* - * Examine the individual parameters. - */ - $this->check_argument_count( $stackPtr, $matched_content, $parameters, $expected_args ); - - foreach ( $parameter_details as $param_name => $param_info ) { - $is_string_literal = $this->check_argument_is_string_literal( $stackPtr, $matched_content, $param_name, $param_info ); - - /* - * If the parameter exists, remember whether the argument was a valid string literal. - * This is used in a few places to determine whether the checks which examine a text string should run. - */ - if ( false !== $param_info ) { - $parameter_details[ $param_name ]['is_string_literal'] = $is_string_literal; - } - - if ( false === $is_string_literal ) { - continue; - } - - if ( 'domain' === $param_name ) { - $this->check_textdomain_matches( $matched_content, $param_name, $param_info ); - } - - if ( \in_array( $param_name, array( 'text', 'single', 'singular', 'plural' ), true ) ) { - $this->check_placeholders_in_string( $matched_content, $param_name, $param_info ); - $has_content = $this->check_string_has_translatable_content( $matched_content, $param_name, $param_info ); - if ( true === $has_content ) { - $this->check_string_has_no_html_wrapper( $matched_content, $param_name, $param_info ); - } - } - } - - /* - * For _n*() calls, compare the singular and plural strings. - * - * If either of the arguments is missing, empty or has more than 1 token, skip out. - * An error for that will already have been reported via the `check_argument_is_string_literal()` method. - */ - $single_details = null; - if ( isset( $parameter_details['single'] ) ) { - $single_details = $parameter_details['single']; - } elseif ( isset( $parameter_details['singular'] ) ) { - $single_details = $parameter_details['singular']; - } - - if ( isset( $single_details, $parameter_details['plural'] ) - && false !== $single_details - && false !== $parameter_details['plural'] - && true === $single_details['is_string_literal'] - && true === $parameter_details['plural']['is_string_literal'] - ) { - $this->compare_single_and_plural_arguments( $stackPtr, $single_details, $parameter_details['plural'] ); - } - - /* - * Check if a translators comments is necessary and if so, if it exists. - */ - $this->check_for_translator_comment( $stackPtr, $matched_content, $parameter_details ); - } - - /** - * Verify that there are no superfluous function arguments. - * - * @since 3.0.0 Check moved from the `process_matched_token()` method to this method. - * - * @param int $stackPtr The position of the current token in the stack. - * @param string $matched_content The token content (function name) which was matched - * in lowercase. - * @param array $parameters The parameters array. - * @param int $expected_count The expected number of passed arguments. - * - * @return void - */ - private function check_argument_count( $stackPtr, $matched_content, $parameters, $expected_count ) { - $actual_count = count( $parameters ); - if ( $actual_count > $expected_count ) { - $this->phpcsFile->addError( - 'Too many parameters passed to function "%s()". Expected: %s parameters, received: %s', - $stackPtr, - 'TooManyFunctionArgs', - array( $matched_content, $expected_count, $actual_count ) - ); - } - } - - /** - * Check if an arbitrary function call parameter is a text string literal suitable for use in the translation functions. - * - * Will also check and warn about missing parameters. - * - * @since 3.0.0 Most of the logic in this method used to be contained in the, now removed, `check_argument_tokens()` method. - * - * @param int $stackPtr The position of the current token in the stack. - * @param string $matched_content The token content (function name) which was matched - * in lowercase. - * @param string $param_name The name of the parameter being examined. - * @param array|false $param_info Parameter info array for an individual parameter, - * as received from the PassedParameters class. - * - * @return bool Whether or not the argument is a string literal. - */ - private function check_argument_is_string_literal( $stackPtr, $matched_content, $param_name, $param_info ) { - /* - * Check if the parameter was supplied. - */ - if ( false === $param_info || '' === $param_info['clean'] ) { - $error_code = MessageHelper::stringToErrorcode( 'MissingArg' . ucfirst( $param_name ) ); - - /* - * Special case the text domain parameter, which is allowed to be "missing" - * when set to `default` (= WP Core translation). - */ - if ( 'domain' === $param_name ) { - if ( empty( $this->text_domain ) ) { - // If no text domain is passed, presume WP Core. - return false; - } - - if ( true === $this->text_domain_is_default ) { - return false; - } - - if ( true === $this->text_domain_contains_default ) { - $this->phpcsFile->addWarning( - 'Missing $%s parameter in function call to %s(). If this text string is supposed to use a WP Core translation, use the "default" text domain.', - $stackPtr, - $error_code . 'Default', - array( $param_name, $matched_content ) - ); - return false; - } - } - - $this->phpcsFile->addError( - 'Missing $%s parameter in function call to %s().', - $stackPtr, - $error_code, - array( $param_name, $matched_content ) - ); - - return false; - } - - /* - * Check if the parameter consists of one singular text string literal. - * Heredoc/nowdocs not allowed. Multi-line single/double quoted strings are allowed. - */ - $first_non_empty = $this->phpcsFile->findNext( Tokens::$emptyTokens, $param_info['start'], ( $param_info['end'] + 1 ), true ); - for ( $i = $first_non_empty; $i <= $param_info['end']; $i++ ) { - if ( isset( Tokens::$emptyTokens[ $this->tokens[ $i ]['code'] ] ) ) { - continue; - } - - if ( isset( Tokens::$stringTokens[ $this->tokens[ $i ]['code'] ] ) === false ) { - $error_code = MessageHelper::stringToErrorcode( 'NonSingularStringLiteral' . ucfirst( $param_name ) ); - $this->phpcsFile->addError( - 'The $%s parameter must be a single text string literal. Found: %s', - $first_non_empty, - $error_code, - array( $param_name, $param_info['clean'] ) - ); - return false; - } - } - - /* - * Make sure the text string does not contain any interpolated variable. - */ - if ( \T_DOUBLE_QUOTED_STRING === $this->tokens[ $first_non_empty ]['code'] ) { - $error_code = MessageHelper::stringToErrorcode( 'InterpolatedVariable' . ucfirst( $param_name ) ); - - $interpolated_variables = TextStrings::getEmbeds( $param_info['clean'] ); - foreach ( $interpolated_variables as $interpolated_variable ) { - $this->phpcsFile->addError( - 'The $%s parameter must not contain interpolated variables or expressions. Found: %s', - $first_non_empty, - $error_code, - array( $param_name, $interpolated_variable ) - ); - } - - if ( ! empty( $interpolated_variables ) ) { - return false; - } - } - - return true; - } - - /** - * Check the correct text domain is being used. - * - * @since 3.0.0 The logic in this method used to be contained in the, now removed, `check_argument_tokens()` method. - * - * @param string $matched_content The token content (function name) which was matched - * in lowercase. - * @param string $param_name The name of the parameter being examined. - * @param array|false $param_info Parameter info array for an individual parameter, - * as received from the PassedParameters class. - * - * @return void - */ - private function check_textdomain_matches( $matched_content, $param_name, $param_info ) { - $stripped_content = TextStrings::stripQuotes( $param_info['clean'] ); - - if ( empty( $this->text_domain ) && '' === $stripped_content ) { - $first_non_empty = $this->phpcsFile->findNext( Tokens::$emptyTokens, $param_info['start'], ( $param_info['end'] + 1 ), true ); - - $this->phpcsFile->addError( - 'The passed $domain should never be an empty string. Either pass a text domain or remove the parameter.', - $first_non_empty, - 'EmptyTextDomain' - ); - } - - if ( empty( $this->text_domain ) ) { - // Nothing more to do, the other checks all depend on a text domain being known. - return; - } - - if ( ! \in_array( $stripped_content, $this->text_domain, true ) ) { - $first_non_empty = $this->phpcsFile->findNext( Tokens::$emptyTokens, $param_info['start'], ( $param_info['end'] + 1 ), true ); - - $this->phpcsFile->addError( - 'Mismatched text domain. Expected \'%s\' but got %s.', - $first_non_empty, - 'TextDomainMismatch', - array( implode( "' or '", $this->text_domain ), $param_info['clean'] ) - ); - return; - } - - if ( true === $this->text_domain_is_default && 'default' === $stripped_content ) { - $fixable = false; - $error = 'No need to supply the text domain in function call to %s() when the only accepted text domain is "default".'; - $error_code = 'SuperfluousDefaultTextDomain'; - $data = array( $matched_content ); - - $first_non_empty = $this->phpcsFile->findNext( Tokens::$emptyTokens, $param_info['start'], ( $param_info['end'] + 1 ), true ); - - // Prevent removing comments when auto-fixing. - $remove_from = ( $param_info['start'] - 1 ); - $remove_to = $first_non_empty; - - if ( isset( $param_info['name_token'] ) ) { - $remove_from = $this->phpcsFile->findPrevious( Tokens::$emptyTokens, ( $param_info['name_token'] - 1 ), null, true ); - if ( \T_OPEN_PARENTHESIS === $this->tokens[ $remove_from ]['code'] ) { - ++$remove_from; // Don't remove the open parenthesis. - - /* - * Named param as first param in the function call, if we fix this, we need to - * remove the comma _after_ the parameter as well to prevent creating a parse error. - */ - $remove_to = $param_info['end']; - if ( \T_COMMA === $this->tokens[ ( $param_info['end'] + 1 ) ]['code'] ) { - ++$remove_to; // Include the comma. - } - } - } - - // Now, make sure there are no comments in the tokens we want to remove. - if ( $this->phpcsFile->findNext( Tokens::$commentTokens, $remove_from, ( $remove_to + 1 ) ) === false ) { - $fixable = true; - } - - if ( false === $fixable ) { - $this->phpcsFile->addWarning( $error, $first_non_empty, $error_code, $data ); - return; - } - - $fix = $this->phpcsFile->addFixableWarning( $error, $first_non_empty, $error_code, $data ); - if ( true === $fix ) { - $this->phpcsFile->fixer->beginChangeset(); - for ( $i = $remove_from; $i <= $remove_to; $i++ ) { - $this->phpcsFile->fixer->replaceToken( $i, '' ); - } - $this->phpcsFile->fixer->endChangeset(); - } - } - } - - /** - * Check the placeholders used in translatable text for common problems. - * - * @since 3.0.0 The logic in this method used to be contained in the, now removed, `check_text()` method. - * - * @param string $matched_content The token content (function name) which was matched - * in lowercase. - * @param string $param_name The name of the parameter being examined. - * @param array|false $param_info Parameter info array for an individual parameter, - * as received from the PassedParameters class. - * - * @return void - */ - private function check_placeholders_in_string( $matched_content, $param_name, $param_info ) { - $content = $param_info['clean']; - - // UnorderedPlaceholders: Check for multiple unordered placeholders. - $unordered_matches_count = preg_match_all( self::UNORDERED_SPRINTF_PLACEHOLDER_REGEX, $content, $unordered_matches ); - $unordered_matches = $unordered_matches[0]; - $all_matches_count = preg_match_all( self::SPRINTF_PLACEHOLDER_REGEX, $content, $all_matches ); - - if ( $unordered_matches_count > 0 - && $unordered_matches_count !== $all_matches_count - && $all_matches_count > 1 - ) { - $first_non_empty = $this->phpcsFile->findNext( Tokens::$emptyTokens, $param_info['start'], ( $param_info['end'] + 1 ), true ); - $error_code = MessageHelper::stringToErrorcode( 'MixedOrderedPlaceholders' . ucfirst( $param_name ) ); - - $this->phpcsFile->addError( - 'Multiple placeholders in translatable strings should be ordered. Mix of ordered and non-ordered placeholders found. Found: "%s" in %s.', - $first_non_empty, - $error_code, - array( implode( ', ', $all_matches[0] ), $param_info['clean'] ) - ); - return; - } - - if ( $unordered_matches_count >= 2 ) { - $first_non_empty = $this->phpcsFile->findNext( Tokens::$emptyTokens, $param_info['start'], ( $param_info['end'] + 1 ), true ); - $error_code = MessageHelper::stringToErrorcode( 'UnorderedPlaceholders' . ucfirst( $param_name ) ); - - $suggestions = array(); - $replace_regexes = array(); - $replacements = array(); - for ( $i = 0; $i < $unordered_matches_count; $i++ ) { - $to_insert = ( $i + 1 ); - $to_insert .= ( '"' !== $content[0] ) ? '$' : '\$'; - $suggestions[ $i ] = substr_replace( $unordered_matches[ $i ], $to_insert, 1, 0 ); - - // Prepare the strings for use in a regex. - $replace_regexes[ $i ] = '`\Q' . $unordered_matches[ $i ] . '\E`'; - // Note: the initial \\ is a literal \, the four \ in the replacement translate also to a literal \. - $replacements[ $i ] = str_replace( '\\', '\\\\', $suggestions[ $i ] ); - // Note: the $ needs escaping to prevent numeric sequences after the $ being interpreted as match replacements. - $replacements[ $i ] = str_replace( '$', '\\$', $replacements[ $i ] ); - } - - $fix = $this->phpcsFile->addFixableError( - 'Multiple placeholders in translatable strings should be ordered. Expected "%s", but got "%s" in %s.', - $first_non_empty, - $error_code, - array( implode( ', ', $suggestions ), implode( ', ', $unordered_matches ), $param_info['clean'] ) - ); - - if ( true === $fix ) { - $this->phpcsFile->fixer->beginChangeset(); - - $fixed_str = preg_replace( $replace_regexes, $replacements, $content, 1 ); - - $this->phpcsFile->fixer->replaceToken( $first_non_empty, $fixed_str ); - - $i = ( $first_non_empty + 1 ); - while ( $i <= $param_info['end'] && isset( Tokens::$stringTokens[ $this->tokens[ $i ]['code'] ] ) ) { - $this->phpcsFile->fixer->replaceToken( $i, '' ); - ++$i; - } - - $this->phpcsFile->fixer->endChangeset(); - } - } - } - - /** - * Check if a parameter which is supposed to hold translatable text actually has translatable text. - * - * @since 3.0.0 The logic in this method used to be contained in the, now removed, `check_text()` method. - * - * @param string $matched_content The token content (function name) which was matched - * in lowercase. - * @param string $param_name The name of the parameter being examined. - * @param array|false $param_info Parameter info array for an individual parameter, - * as received from the PassedParameters class. - * - * @return bool Whether or not the text string has translatable content. - */ - private function check_string_has_translatable_content( $matched_content, $param_name, $param_info ) { - // Strip placeholders and surrounding quotes. - $content_without_quotes = trim( TextStrings::stripQuotes( $param_info['clean'] ) ); - $non_placeholder_content = preg_replace( self::SPRINTF_PLACEHOLDER_REGEX, '', $content_without_quotes ); - - if ( '' === $non_placeholder_content ) { - $first_non_empty = $this->phpcsFile->findNext( Tokens::$emptyTokens, $param_info['start'], ( $param_info['end'] + 1 ), true ); - - $this->phpcsFile->addError( - 'The $%s text string should have translatable content. Found: %s', - $first_non_empty, - 'NoEmptyStrings', - array( $param_name, $param_info['clean'] ) - ); - return false; - } - - return true; - } - - /** - * Ensure that a translatable text string is not wrapped in HTML code. - * - * If the text is wrapped in HTML, the HTML should be moved out of the translatable text string. - * - * @since 3.0.0 The logic in this method used to be contained in the, now removed, `check_text()` method. - * - * @param string $matched_content The token content (function name) which was matched - * in lowercase. - * @param string $param_name The name of the parameter being examined. - * @param array|false $param_info Parameter info array for an individual parameter, - * as received from the PassedParameters class. - * - * @return void - */ - private function check_string_has_no_html_wrapper( $matched_content, $param_name, $param_info ) { - // Strip surrounding quotes. - $content_without_quotes = trim( TextStrings::stripQuotes( $param_info['clean'] ) ); - - $reader = new XMLReader(); - $reader->XML( $content_without_quotes, 'UTF-8', \LIBXML_NOERROR | \LIBXML_ERR_NONE | \LIBXML_NOWARNING ); - - // Is the first node an HTML element? - if ( ! $reader->read() || XMLReader::ELEMENT !== $reader->nodeType ) { - return; - } - - // If the opening HTML element includes placeholders in its attributes, we don't warn. - // E.g. ''. - $i = 0; - while ( $attr = $reader->getAttributeNo( $i ) ) { - if ( preg_match( self::SPRINTF_PLACEHOLDER_REGEX, $attr ) === 1 ) { - return; - } - - ++$i; - } - - // We don't flag strings wrapped in `...`, as the link target might actually need localization. - if ( 'a' === $reader->name && $reader->getAttribute( 'href' ) ) { - return; - } - - // Does the entire string only consist of this HTML node? - if ( $reader->readOuterXml() === $content_without_quotes ) { - $first_non_empty = $this->phpcsFile->findNext( Tokens::$emptyTokens, $param_info['start'], ( $param_info['end'] + 1 ), true ); - - $this->phpcsFile->addWarning( - 'Translatable string should not be wrapped in HTML. Found: %s', - $first_non_empty, - 'NoHtmlWrappedStrings', - array( $param_info['clean'] ) - ); - } - } - - /** - * Check for inconsistencies in the placeholders between single and plural form of the translatable text string. - * - * @since 3.0.0 - The parameter names and expected format for the $param_info_single - * and the $param_info_plural parameters has changed. - * - The method visibility has been changed from `protected` to `private`. - * - * @param int $stackPtr The position of the function call token in the stack. - * @param array $param_info_single Parameter info array for the `$single` parameter, - * as received from the PassedParameters class. - * @param array $param_info_plural Parameter info array for the `$plural` parameter, - * as received from the PassedParameters class. - * - * @return void - */ - private function compare_single_and_plural_arguments( $stackPtr, $param_info_single, $param_info_plural ) { - $single_content = $param_info_single['clean']; - $plural_content = $param_info_plural['clean']; - - preg_match_all( self::SPRINTF_PLACEHOLDER_REGEX, $single_content, $single_placeholders ); - $single_placeholders = $single_placeholders[0]; - - preg_match_all( self::SPRINTF_PLACEHOLDER_REGEX, $plural_content, $plural_placeholders ); - $plural_placeholders = $plural_placeholders[0]; - - // English conflates "singular" with "only one", described in the codex: - // https://codex.wordpress.org/I18n_for_WordPress_Developers#Plurals . - if ( \count( $single_placeholders ) < \count( $plural_placeholders ) ) { - $error_string = 'Missing singular placeholder, needed for some languages. See https://codex.wordpress.org/I18n_for_WordPress_Developers#Plurals'; - $first_non_empty_single = $this->phpcsFile->findNext( Tokens::$emptyTokens, $param_info_single['start'], ( $param_info_single['end'] + 1 ), true ); - - $this->phpcsFile->addError( $error_string, $first_non_empty_single, 'MissingSingularPlaceholder' ); - return; - } - - // Reordering is fine, but mismatched placeholders is probably wrong. - sort( $single_placeholders, \SORT_NATURAL ); - sort( $plural_placeholders, \SORT_NATURAL ); - - if ( $single_placeholders !== $plural_placeholders ) { - $this->phpcsFile->addWarning( 'Mismatched placeholders is probably an error', $stackPtr, 'MismatchedPlaceholders' ); - } - } - - /** - * Check for the presence of a translators comment if one of the text strings contains a placeholder. - * - * @since 3.0.0 - The parameter names and expected format for the $parameters parameter has changed. - * - The method visibility has been changed from `protected` to `private`. - * - * @param int $stackPtr The position of the gettext call token in the stack. - * @param string $matched_content The token content (function name) which was matched - * in lowercase. - * @param array $parameters Array with information about the parameters. - * - * @return void - */ - private function check_for_translator_comment( $stackPtr, $matched_content, $parameters ) { - $needs_translators_comment = false; - - foreach ( $parameters as $param_name => $param_info ) { - if ( false === \in_array( $param_name, array( 'text', 'single', 'singular', 'plural' ), true ) ) { - continue; - } - - if ( false === $param_info || false === $param_info['is_string_literal'] ) { - continue; - } - - if ( preg_match( self::SPRINTF_PLACEHOLDER_REGEX, $param_info['clean'] ) === 1 ) { - $needs_translators_comment = true; - break; - } - } - - if ( false === $needs_translators_comment ) { - // No text string with placeholders found, no translation comment needed. - return; - } - - $previous_comment = $this->phpcsFile->findPrevious( Tokens::$commentTokens, ( $stackPtr - 1 ) ); - - if ( false !== $previous_comment ) { - /* - * Check that the comment is either on the line before the gettext call or - * if it's not, that there is only whitespace between. - */ - $correctly_placed = false; - - if ( ( $this->tokens[ $previous_comment ]['line'] + 1 ) === $this->tokens[ $stackPtr ]['line'] ) { - $correctly_placed = true; - } else { - $next_non_whitespace = $this->phpcsFile->findNext( \T_WHITESPACE, ( $previous_comment + 1 ), $stackPtr, true ); - if ( false === $next_non_whitespace || $this->tokens[ $next_non_whitespace ]['line'] === $this->tokens[ $stackPtr ]['line'] ) { - // No non-whitespace found or next non-whitespace is on same line as gettext call. - $correctly_placed = true; - } - unset( $next_non_whitespace ); - } - - /* - * Check that the comment starts with 'translators:'. - */ - if ( true === $correctly_placed ) { - if ( \T_COMMENT === $this->tokens[ $previous_comment ]['code'] ) { - $comment_text = trim( $this->tokens[ $previous_comment ]['content'] ); - - // If it's multi-line /* */ comment, collect all the parts. - if ( '*/' === substr( $comment_text, -2 ) && '/*' !== substr( $comment_text, 0, 2 ) ) { - for ( $i = ( $previous_comment - 1 ); 0 <= $i; $i-- ) { - if ( \T_COMMENT !== $this->tokens[ $i ]['code'] ) { - break; - } - - $comment_text = trim( $this->tokens[ $i ]['content'] ) . $comment_text; - } - } - - if ( true === $this->is_translators_comment( $comment_text ) ) { - // Comment is ok. - return; - } - } - - if ( \T_DOC_COMMENT_CLOSE_TAG === $this->tokens[ $previous_comment ]['code'] ) { - // If it's docblock comment (wrong style) make sure that it's a translators comment. - if ( isset( $this->tokens[ $previous_comment ]['comment_opener'] ) ) { - $db_start = $this->tokens[ $previous_comment ]['comment_opener']; - } else { - $db_start = $this->phpcsFile->findPrevious( \T_DOC_COMMENT_OPEN_TAG, ( $previous_comment - 1 ) ); - } - - $db_first_text = $this->phpcsFile->findNext( \T_DOC_COMMENT_STRING, ( $db_start + 1 ), $previous_comment ); - - if ( true === $this->is_translators_comment( $this->tokens[ $db_first_text ]['content'] ) ) { - $this->phpcsFile->addWarning( - 'A "translators:" comment must be a "/* */" style comment. Docblock comments will not be picked up by the tools to generate a ".pot" file.', - $stackPtr, - 'TranslatorsCommentWrongStyle' - ); - return; - } - } - } - } - - // Found placeholders but no translators comment. - $this->phpcsFile->addWarning( - 'A function call to %s() with texts containing placeholders was found, but was not accompanied by a "translators:" comment on the line above to clarify the meaning of the placeholders.', - $stackPtr, - 'MissingTranslatorsComment', - array( $matched_content ) - ); - } - - /** - * Check if a (collated) comment string starts with 'translators:'. - * - * @since 0.11.0 - * - * @param string $content Comment string content. - * - * @return bool - */ - private function is_translators_comment( $content ) { - if ( preg_match( '`^(?:(?://|/\*{1,2}) )?translators:`i', $content ) === 1 ) { - return true; - } - return false; - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/PostsPerPageSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/PostsPerPageSniff.php deleted file mode 100644 index 6c62b92..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/PostsPerPageSniff.php +++ /dev/null @@ -1,102 +0,0 @@ - array( - 'type' => 'warning', - 'message' => 'Detected high pagination limit, `%s` is set to `%s`', - 'keys' => array( - 'posts_per_page', - 'numberposts', - ), - ), - ); - } - - /** - * Callback to process each confirmed key, to check value. - * - * @param string $key Array index / key. - * @param mixed $val Assigned value. - * @param int $line Token line. - * @param array $group Group definition. - * - * @return bool FALSE if no match, TRUE if matches. - */ - public function callback( $key, $val, $line, $group ) { - $stripped_val = TextStrings::stripQuotes( $val ); - - if ( '' === $stripped_val ) { - return false; - } - - if ( $val !== $stripped_val ) { - // The value was a text string. For text strings, we only accept purely numeric values. - if ( preg_match( '`^[0-9]+$`', $stripped_val ) !== 1 ) { - // Not a purely numeric value, so any comparison would be a false comparison. - return false; - } - - // Purely numeric string, treat it as an integer from here on out. - $val = $stripped_val; - } - - $first_char = $val[0]; - if ( '-' === $first_char || '+' === $first_char ) { - $val = ltrim( $val, '-+' ); - } else { - $first_char = ''; - } - - $real_value = Numbers::getDecimalValue( $val ); - if ( false === $real_value ) { - // This wasn't a purely numeric value, so any comparison would be a false comparison. - return false; - } - - $val = $first_char . $real_value; - - return ( (int) $val > (int) $this->posts_per_page ); - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WhiteSpace/CastStructureSpacingSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WhiteSpace/CastStructureSpacingSniff.php deleted file mode 100644 index af27166..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WhiteSpace/CastStructureSpacingSniff.php +++ /dev/null @@ -1,59 +0,0 @@ -tokens[ ( $stackPtr - 1 ) ]['code'] - && \T_ELLIPSIS !== $this->tokens[ ( $stackPtr - 1 ) ]['code'] - ) { - $error = 'Expected a space before the type cast open parenthesis; none found'; - $fix = $this->phpcsFile->addFixableError( $error, $stackPtr, 'NoSpaceBeforeOpenParenthesis' ); - if ( true === $fix ) { - $this->phpcsFile->fixer->addContentBefore( $stackPtr, ' ' ); - } - } - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WhiteSpace/ControlStructureSpacingSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WhiteSpace/ControlStructureSpacingSniff.php deleted file mode 100644 index f177075..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WhiteSpace/ControlStructureSpacingSniff.php +++ /dev/null @@ -1,486 +0,0 @@ - true, - \T_ELSE => true, - \T_TRY => true, - \T_FINALLY => true, - ); - - /** - * Returns an array of tokens this test wants to listen for. - * - * @return array - */ - public function register() { - return array( - \T_IF, - \T_WHILE, - \T_FOREACH, - \T_FOR, - \T_SWITCH, - \T_DO, - \T_ELSE, - \T_ELSEIF, - \T_TRY, - \T_CATCH, - \T_FINALLY, - \T_MATCH, - ); - } - - /** - * Processes this test, when one of its tokens is encountered. - * - * @param int $stackPtr The position of the current token in the stack. - * - * @return void - */ - public function process_token( $stackPtr ) { - if ( isset( $this->tokens[ ( $stackPtr + 1 ) ] ) && \T_WHITESPACE !== $this->tokens[ ( $stackPtr + 1 ) ]['code'] - && ! ( \T_ELSE === $this->tokens[ $stackPtr ]['code'] && \T_COLON === $this->tokens[ ( $stackPtr + 1 ) ]['code'] ) - ) { - $error = 'Space after opening control structure is required'; - $fix = $this->phpcsFile->addFixableError( $error, $stackPtr, 'NoSpaceAfterStructureOpen' ); - - if ( true === $fix ) { - $this->phpcsFile->fixer->addContent( $stackPtr, ' ' ); - } - } - - if ( ! isset( $this->tokens[ $stackPtr ]['scope_opener'], $this->tokens[ $stackPtr ]['scope_closer'] ) ) { - if ( \T_WHILE !== $this->tokens[ $stackPtr ]['code'] ) { - return; - } - } else { - $scopeOpener = $this->tokens[ $stackPtr ]['scope_opener']; - $scopeCloser = $this->tokens[ $stackPtr ]['scope_closer']; - } - - // Alternative syntax. - if ( isset( $scopeOpener ) && \T_COLON === $this->tokens[ $scopeOpener ]['code'] ) { - - if ( 'required' === $this->space_before_colon ) { - - if ( \T_WHITESPACE !== $this->tokens[ ( $scopeOpener - 1 ) ]['code'] ) { - $error = 'Space between opening control structure and T_COLON is required'; - $fix = $this->phpcsFile->addFixableError( $error, $scopeOpener, 'NoSpaceBetweenStructureColon' ); - - if ( true === $fix ) { - $this->phpcsFile->fixer->addContentBefore( $scopeOpener, ' ' ); - } - } - } elseif ( 'forbidden' === $this->space_before_colon ) { - - if ( \T_WHITESPACE === $this->tokens[ ( $scopeOpener - 1 ) ]['code'] ) { - $error = 'Extra space between opening control structure and T_COLON found'; - $fix = $this->phpcsFile->addFixableError( $error, ( $scopeOpener - 1 ), 'SpaceBetweenStructureColon' ); - - if ( true === $fix ) { - $this->phpcsFile->fixer->replaceToken( ( $scopeOpener - 1 ), '' ); - } - } - } - } - - $parenthesisOpener = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $stackPtr + 1 ), null, true ); - - if ( \T_COLON !== $this->tokens[ $parenthesisOpener ]['code'] - && ( $stackPtr + 1 ) === $parenthesisOpener - ) { - // Checking space between keyword and open parenthesis, i.e. `if[*](...) {}`. - $error = 'No space before opening parenthesis is prohibited'; - $fix = $this->phpcsFile->addFixableError( $error, $stackPtr, 'NoSpaceBeforeOpenParenthesis' ); - - if ( true === $fix ) { - $this->phpcsFile->fixer->addContent( $stackPtr, ' ' ); - } - } - - if ( \T_WHITESPACE === $this->tokens[ ( $stackPtr + 1 ) ]['code'] - && ' ' !== $this->tokens[ ( $stackPtr + 1 ) ]['content'] - ) { - // Checking (too much) space between keyword and open parenthesis, i.e. `if [*](...) {}`. - $error = 'Expected exactly one space before opening parenthesis; "%s" found.'; - $fix = $this->phpcsFile->addFixableError( - $error, - $stackPtr, - 'ExtraSpaceBeforeOpenParenthesis', - array( $this->tokens[ ( $stackPtr + 1 ) ]['content'] ) - ); - - if ( true === $fix ) { - $this->phpcsFile->fixer->replaceToken( ( $stackPtr + 1 ), ' ' ); - } - } - - if ( \T_CLOSE_PARENTHESIS !== $this->tokens[ ( $parenthesisOpener + 1 ) ]['code'] ) { - if ( \T_WHITESPACE !== $this->tokens[ ( $parenthesisOpener + 1 ) ]['code'] ) { - // Checking space directly after the open parenthesis, i.e. `if ([*]...) {}`. - $error = 'No space after opening parenthesis is prohibited'; - $fix = $this->phpcsFile->addFixableError( $error, $stackPtr, 'NoSpaceAfterOpenParenthesis' ); - - if ( true === $fix ) { - $this->phpcsFile->fixer->addContent( $parenthesisOpener, ' ' ); - } - } elseif ( ( ' ' !== $this->tokens[ ( $parenthesisOpener + 1 ) ]['content'] - && "\n" !== $this->tokens[ ( $parenthesisOpener + 1 ) ]['content'] - && "\r\n" !== $this->tokens[ ( $parenthesisOpener + 1 ) ]['content'] ) - && ! isset( $this->ignore_extra_space_after_open_paren[ $this->tokens[ $stackPtr ]['code'] ] ) - ) { - // Checking (too much) space directly after the open parenthesis, i.e. `if ([*]...) {}`. - $error = 'Expected exactly one space after opening parenthesis; "%s" found.'; - $fix = $this->phpcsFile->addFixableError( - $error, - $stackPtr, - 'ExtraSpaceAfterOpenParenthesis', - array( $this->tokens[ ( $parenthesisOpener + 1 ) ]['content'] ) - ); - - if ( true === $fix ) { - $this->phpcsFile->fixer->replaceToken( ( $parenthesisOpener + 1 ), ' ' ); - } - } - } - - if ( isset( $this->tokens[ $parenthesisOpener ]['parenthesis_closer'] ) ) { - - $parenthesisCloser = $this->tokens[ $parenthesisOpener ]['parenthesis_closer']; - - if ( \T_CLOSE_PARENTHESIS !== $this->tokens[ ( $parenthesisOpener + 1 ) ]['code'] ) { - - // Checking space directly before the close parenthesis, i.e. `if (...[*]) {}`. - if ( \T_WHITESPACE !== $this->tokens[ ( $parenthesisCloser - 1 ) ]['code'] ) { - $error = 'No space before closing parenthesis is prohibited'; - $fix = $this->phpcsFile->addFixableError( $error, $parenthesisCloser, 'NoSpaceBeforeCloseParenthesis' ); - - if ( true === $fix ) { - $this->phpcsFile->fixer->addContentBefore( $parenthesisCloser, ' ' ); - } - } elseif ( ' ' !== $this->tokens[ ( $parenthesisCloser - 1 ) ]['content'] ) { - $prevNonEmpty = $this->phpcsFile->findPrevious( Tokens::$emptyTokens, ( $parenthesisCloser - 1 ), null, true ); - if ( $this->tokens[ ( $parenthesisCloser ) ]['line'] === $this->tokens[ ( $prevNonEmpty + 1 ) ]['line'] ) { - $error = 'Expected exactly one space before closing parenthesis; "%s" found.'; - $fix = $this->phpcsFile->addFixableError( - $error, - $stackPtr, - 'ExtraSpaceBeforeCloseParenthesis', - array( $this->tokens[ ( $parenthesisCloser - 1 ) ]['content'] ) - ); - - if ( true === $fix ) { - $this->phpcsFile->fixer->replaceToken( ( $parenthesisCloser - 1 ), ' ' ); - } - } - } - - if ( \T_WHITESPACE !== $this->tokens[ ( $parenthesisCloser + 1 ) ]['code'] - && ( isset( $scopeOpener ) && \T_COLON !== $this->tokens[ $scopeOpener ]['code'] ) - ) { - $error = 'Space between opening control structure and closing parenthesis is required'; - $fix = $this->phpcsFile->addFixableError( $error, $scopeOpener, 'NoSpaceAfterCloseParenthesis' ); - - if ( true === $fix ) { - $this->phpcsFile->fixer->addContentBefore( $scopeOpener, ' ' ); - } - } - } - - if ( isset( $this->tokens[ $parenthesisOpener ]['parenthesis_owner'] ) - && ( isset( $scopeOpener ) - && $this->tokens[ $parenthesisCloser ]['line'] !== $this->tokens[ $scopeOpener ]['line'] ) - ) { - $error = 'Opening brace should be on the same line as the declaration'; - $fix = $this->phpcsFile->addFixableError( $error, $parenthesisOpener, 'OpenBraceNotSameLine' ); - - if ( true === $fix ) { - $this->phpcsFile->fixer->beginChangeset(); - - for ( $i = ( $parenthesisCloser + 1 ); $i < $scopeOpener; $i++ ) { - $this->phpcsFile->fixer->replaceToken( $i, '' ); - } - - $this->phpcsFile->fixer->addContent( $parenthesisCloser, ' ' ); - $this->phpcsFile->fixer->endChangeset(); - } - return; - - } elseif ( \T_WHITESPACE === $this->tokens[ ( $parenthesisCloser + 1 ) ]['code'] - && ' ' !== $this->tokens[ ( $parenthesisCloser + 1 ) ]['content'] - ) { - // Checking space between the close parenthesis and the open brace, i.e. `if (...) [*]{}`. - $error = 'Expected exactly one space between closing parenthesis and opening control structure; "%s" found.'; - $fix = $this->phpcsFile->addFixableError( - $error, - $stackPtr, - 'ExtraSpaceAfterCloseParenthesis', - array( $this->tokens[ ( $parenthesisCloser + 1 ) ]['content'] ) - ); - - if ( true === $fix ) { - $this->phpcsFile->fixer->replaceToken( ( $parenthesisCloser + 1 ), ' ' ); - } - } - } - - if ( false !== $this->blank_line_check && isset( $scopeOpener ) ) { - $firstContent = $this->phpcsFile->findNext( \T_WHITESPACE, ( $scopeOpener + 1 ), null, true ); - - // We ignore spacing for some structures that tend to have their own rules. - $ignore = array( - \T_DOC_COMMENT_OPEN_TAG => true, - \T_CLOSE_TAG => true, - \T_COMMENT => true, - ); - $ignore += Collections::closedScopes(); - - if ( ! isset( $ignore[ $this->tokens[ $firstContent ]['code'] ] ) - && $this->tokens[ $firstContent ]['line'] > ( $this->tokens[ $scopeOpener ]['line'] + 1 ) - ) { - $gap = ( $this->tokens[ $firstContent ]['line'] - $this->tokens[ $scopeOpener ]['line'] - 1 ); - $this->phpcsFile->recordMetric( $stackPtr, 'Blank lines at start of control structure', $gap ); - - $error = 'Blank line found at start of control structure'; - $fix = $this->phpcsFile->addFixableError( $error, $scopeOpener, 'BlankLineAfterStart' ); - - if ( true === $fix ) { - $this->phpcsFile->fixer->beginChangeset(); - - for ( $i = ( $scopeOpener + 1 ); $i < $firstContent; $i++ ) { - if ( $this->tokens[ $i ]['line'] === $this->tokens[ $firstContent ]['line'] ) { - break; - } - $this->phpcsFile->fixer->replaceToken( $i, '' ); - } - - $this->phpcsFile->fixer->addNewline( $scopeOpener ); - $this->phpcsFile->fixer->endChangeset(); - } - } else { - $this->phpcsFile->recordMetric( $stackPtr, 'Blank lines at start of control structure', 0 ); - } - - if ( isset( $scopeCloser ) && $firstContent !== $scopeCloser ) { - $lastContent = $this->phpcsFile->findPrevious( \T_WHITESPACE, ( $scopeCloser - 1 ), null, true ); - - $lastNonEmptyContent = $this->phpcsFile->findPrevious( Tokens::$emptyTokens, ( $scopeCloser - 1 ), null, true ); - - $checkToken = $lastContent; - if ( isset( $this->tokens[ $lastNonEmptyContent ]['scope_condition'] ) ) { - $checkToken = $this->tokens[ $lastNonEmptyContent ]['scope_condition']; - } - - if ( ! isset( $ignore[ $this->tokens[ $checkToken ]['code'] ] ) - && $this->tokens[ $lastContent ]['line'] <= ( $this->tokens[ $scopeCloser ]['line'] - 2 ) - ) { - $gap = ( $this->tokens[ $scopeCloser ]['line'] - $this->tokens[ $lastContent ]['line'] - 1 ); - $this->phpcsFile->recordMetric( $stackPtr, 'Blank lines at end of control structure', $gap ); - - for ( $i = ( $scopeCloser - 1 ); $i > $lastContent; $i-- ) { - if ( $this->tokens[ $i ]['line'] < $this->tokens[ $scopeCloser ]['line'] - && \T_OPEN_TAG !== $this->tokens[ $firstContent ]['code'] - ) { - // TODO: Reporting error at empty line won't highlight it in IDE. - $error = 'Blank line found at end of control structure'; - $fix = $this->phpcsFile->addFixableError( $error, $i, 'BlankLineBeforeEnd' ); - - if ( true === $fix ) { - $this->phpcsFile->fixer->beginChangeset(); - - for ( $j = ( $lastContent + 1 ); $j < $scopeCloser; $j++ ) { - if ( $this->tokens[ $j ]['line'] === $this->tokens[ $scopeCloser ]['line'] ) { - break; - } - $this->phpcsFile->fixer->replaceToken( $j, '' ); - } - - /* - * PHPCS annotations, like normal inline comments, are tokenized including - * the new line at the end, so don't add any extra as it would cause a fixer - * conflict. - */ - if ( \T_COMMENT !== $this->tokens[ $lastContent ]['code'] - && ! isset( Tokens::$phpcsCommentTokens[ $this->tokens[ $lastContent ]['code'] ] ) ) { - $this->phpcsFile->fixer->addNewlineBefore( $j ); - } - - $this->phpcsFile->fixer->endChangeset(); - } - break; - } - } - } else { - $this->phpcsFile->recordMetric( $stackPtr, 'Blank lines at end of control structure', 0 ); - } - } - unset( $ignore ); - } - - if ( ! isset( $scopeCloser ) || true !== $this->blank_line_after_check ) { - return; - } - - if ( \T_MATCH === $this->tokens[ $stackPtr ]['code'] ) { - // Move the scope closer to the semicolon/comma. - $next = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $scopeCloser + 1 ), null, true ); - if ( false !== $next - && ( \T_SEMICOLON === $this->tokens[ $next ]['code'] || \T_COMMA === $this->tokens[ $next ]['code'] ) - ) { - $scopeCloser = $next; - } - } - - // {@internal This is just for the blank line check. Only whitespace should be considered, - // not "other" empty tokens.}} - $trailingContent = $this->phpcsFile->findNext( \T_WHITESPACE, ( $scopeCloser + 1 ), null, true ); - if ( false === $trailingContent ) { - return; - } - - if ( \T_COMMENT === $this->tokens[ $trailingContent ]['code'] - || isset( Tokens::$phpcsCommentTokens[ $this->tokens[ $trailingContent ]['code'] ] ) - ) { - // Special exception for code where the comment about - // an ELSE or ELSEIF is written between the control structures. - $nextCode = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $scopeCloser + 1 ), null, true ); - - if ( \T_ELSE === $this->tokens[ $nextCode ]['code'] || \T_ELSEIF === $this->tokens[ $nextCode ]['code'] ) { - $trailingContent = $nextCode; - } - - // Move past end comments. - if ( $this->tokens[ $trailingContent ]['line'] === $this->tokens[ $scopeCloser ]['line'] ) { - if ( preg_match( '`^//[ ]?end`i', $this->tokens[ $trailingContent ]['content'] ) > 0 ) { - $scopeCloser = $trailingContent; - $trailingContent = $this->phpcsFile->findNext( \T_WHITESPACE, ( $trailingContent + 1 ), null, true ); - } - } - } - - if ( \T_ELSE === $this->tokens[ $trailingContent ]['code'] && \T_IF === $this->tokens[ $stackPtr ]['code'] ) { - // IF with ELSE. - return; - } - - if ( \T_WHILE === $this->tokens[ $trailingContent ]['code'] && \T_DO === $this->tokens[ $stackPtr ]['code'] ) { - // DO with WHILE. - return; - } - - if ( \T_CATCH === $this->tokens[ $trailingContent ]['code'] && \T_TRY === $this->tokens[ $stackPtr ]['code'] ) { - // TRY with CATCH. - return; - } - - if ( \T_FINALLY === $this->tokens[ $trailingContent ]['code'] && \T_CATCH === $this->tokens[ $stackPtr ]['code'] ) { - // CATCH with FINALLY. - return; - } - - if ( \T_FINALLY === $this->tokens[ $trailingContent ]['code'] && \T_TRY === $this->tokens[ $stackPtr ]['code'] ) { - // TRY with FINALLY. - return; - } - - if ( \T_CLOSE_TAG === $this->tokens[ $trailingContent ]['code'] ) { - // At the end of the script or embedded code. - return; - } - - if ( isset( $this->tokens[ $trailingContent ]['scope_condition'] ) - && \T_CLOSE_CURLY_BRACKET === $this->tokens[ $trailingContent ]['code'] - ) { - // Another control structure's closing brace. - $owner = $this->tokens[ $trailingContent ]['scope_condition']; - if ( isset( Collections::closedScopes()[ $this->tokens[ $owner ]['code'] ] ) === true ) { - // The next content is the closing brace of a function, class, interface or trait - // so normal function/class rules apply and we can ignore it. - return; - } - - if ( ( $this->tokens[ $scopeCloser ]['line'] + 1 ) !== $this->tokens[ $trailingContent ]['line'] ) { - // TODO: Won't cover following case: "} echo 'OK';". - $error = 'Blank line found after control structure'; - $fix = $this->phpcsFile->addFixableError( $error, $scopeCloser, 'BlankLineAfterEnd' ); - - if ( true === $fix ) { - $this->phpcsFile->fixer->beginChangeset(); - - $i = ( $scopeCloser + 1 ); - while ( $this->tokens[ $i ]['line'] !== $this->tokens[ $trailingContent ]['line'] ) { - $this->phpcsFile->fixer->replaceToken( $i, '' ); - ++$i; - } - - // TODO: Instead a separate error should be triggered when content comes right after closing brace. - if ( \T_COMMENT !== $this->tokens[ $scopeCloser ]['code'] - && isset( Tokens::$phpcsCommentTokens[ $this->tokens[ $scopeCloser ]['code'] ] ) === false - ) { - $this->phpcsFile->fixer->addNewlineBefore( $trailingContent ); - } - $this->phpcsFile->fixer->endChangeset(); - } - } - } - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WhiteSpace/ObjectOperatorSpacingSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WhiteSpace/ObjectOperatorSpacingSniff.php deleted file mode 100644 index 9ad532e..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WhiteSpace/ObjectOperatorSpacingSniff.php +++ /dev/null @@ -1,63 +0,0 @@ -getTokens(); - $property_adjusted = false; - - // Check for `::class` and don't ignore new lines in that case. - if ( true === $this->ignoreNewlines - && \T_DOUBLE_COLON === $tokens[ $stackPtr ]['code'] - ) { - $next_non_empty = $phpcsFile->findNext( Tokens::$emptyTokens, ( $stackPtr + 1 ), null, true ); - if ( \T_STRING === $tokens[ $next_non_empty ]['code'] - && 'class' === strtolower( $tokens[ $next_non_empty ]['content'] ) - ) { - $property_adjusted = true; - $this->ignoreNewlines = false; - } - } - - $return = parent::process( $phpcsFile, $stackPtr ); - - if ( true === $property_adjusted ) { - $this->ignoreNewlines = true; - } - - return $return; - } -} diff --git a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WhiteSpace/OperatorSpacingSniff.php b/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WhiteSpace/OperatorSpacingSniff.php deleted file mode 100644 index 5e1ceb6..0000000 --- a/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WhiteSpace/OperatorSpacingSniff.php +++ /dev/null @@ -1,60 +0,0 @@ - - - - WordPress Coding Standards - - - - - - - - - diff --git a/vendor/wp-coding-standards/wpcs/_typos.toml b/vendor/wp-coding-standards/wpcs/_typos.toml deleted file mode 100644 index 5cc8428..0000000 --- a/vendor/wp-coding-standards/wpcs/_typos.toml +++ /dev/null @@ -1,26 +0,0 @@ -[files] -extend-exclude = [ - "WordPress/Tests/*/*.inc", - "WordPress/Tests/*/*.fixed", - "WordPress/Tests/*/*.css", - "WordPress/Tests/*/*.js", -] -ignore-hidden = true - -[default] -locale = "en-us" -check-filename = true -extend-ignore-identifiers-re = [ - # Renaming these (function/array key) names would be a BC-break. - 'analyse_implode', - 'analyse_sprintf', - 'cachable', - 'is_targetted_token', - # These are search targets for sniffs, can't be helped. - 'avail_post_stati', - 'url_is_accessable_via_ssl', -] - -[default.extend-words] -# Don't correct a limited list of specific words. -Automattic = "Automattic" diff --git a/vendor/wp-coding-standards/wpcs/composer.json b/vendor/wp-coding-standards/wpcs/composer.json deleted file mode 100644 index 898bf88..0000000 --- a/vendor/wp-coding-standards/wpcs/composer.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "name": "wp-coding-standards/wpcs", - "type": "phpcodesniffer-standard", - "description": "PHP_CodeSniffer rules (sniffs) to enforce WordPress coding conventions", - "keywords": [ - "phpcs", - "standards", - "static analysis", - "WordPress" - ], - "license": "MIT", - "authors": [ - { - "name": "Contributors", - "homepage": "https://github.com/WordPress/WordPress-Coding-Standards/graphs/contributors" - } - ], - "require": { - "php": ">=7.2", - "ext-filter": "*", - "ext-libxml": "*", - "ext-tokenizer": "*", - "ext-xmlreader": "*", - "squizlabs/php_codesniffer": "^3.13.4", - "phpcsstandards/phpcsutils": "^1.1.0", - "phpcsstandards/phpcsextra": "^1.5.0" - }, - "require-dev": { - "phpcompatibility/php-compatibility": "^10.0.0@dev", - "phpunit/phpunit": "^8.0 || ^9.0", - "phpcsstandards/phpcsdevtools": "^1.2.0", - "php-parallel-lint/php-parallel-lint": "^1.4.0", - "php-parallel-lint/php-console-highlighter": "^1.0.0" - }, - "suggest": { - "ext-iconv": "For improved results", - "ext-mbstring": "For improved results" - }, - "minimum-stability": "dev", - "prefer-stable": true, - "config": { - "allow-plugins": { - "dealerdirect/phpcodesniffer-composer-installer": true - }, - "lock": false - }, - "scripts": { - "lint": [ - "@php ./vendor/php-parallel-lint/php-parallel-lint/parallel-lint . -e php --show-deprecated --exclude vendor --exclude .git" - ], - "check-cs": [ - "@php ./vendor/squizlabs/php_codesniffer/bin/phpcs" - ], - "fix-cs": [ - "@php ./vendor/squizlabs/php_codesniffer/bin/phpcbf" - ], - "run-tests": [ - "@php ./vendor/phpunit/phpunit/phpunit --filter WordPress ./vendor/squizlabs/php_codesniffer/tests/AllTests.php --no-coverage" - ], - "coverage": [ - "@php ./vendor/phpunit/phpunit/phpunit --filter WordPress ./vendor/squizlabs/php_codesniffer/tests/AllTests.php" - ], - "check-complete": [ - "@php ./vendor/phpcsstandards/phpcsdevtools/bin/phpcs-check-feature-completeness -q ./WordPress" - ], - "check-complete-strict": [ - "@php ./vendor/phpcsstandards/phpcsdevtools/bin/phpcs-check-feature-completeness ./WordPress" - ], - "check-all": [ - "@lint", - "@check-cs", - "@run-tests", - "@check-complete-strict" - ] - }, - "scripts-descriptions": { - "lint": "Lint PHP files against parse errors.", - "check-cs": "Run the PHPCS script against the entire codebase.", - "fix-cs": "Run the PHPCBF script to fix all the autofixable violations on the codebase.", - "run-tests": "Run all the unit tests for the WordPress Coding Standards sniffs without code coverage.", - "coverage": "Run all the unit tests for the WordPress Coding Standards sniffs with code coverage.", - "check-complete": "Check if all the sniffs have tests.", - "check-complete-strict": "Check if all the sniffs have unit tests and XML documentation.", - "check-all": "Run all checks (lint, phpcs, feature completeness) and tests." - }, - "support": { - "issues": "https://github.com/WordPress/WordPress-Coding-Standards/issues", - "wiki": "https://github.com/WordPress/WordPress-Coding-Standards/wiki", - "source": "https://github.com/WordPress/WordPress-Coding-Standards" - } -} diff --git a/vendor/wp-coding-standards/wpcs/phpcs.xml.dist.sample b/vendor/wp-coding-standards/wpcs/phpcs.xml.dist.sample deleted file mode 100644 index cfb232b..0000000 --- a/vendor/wp-coding-standards/wpcs/phpcs.xml.dist.sample +++ /dev/null @@ -1,153 +0,0 @@ - - - - A custom set of rules to check for a WPized WordPress project - - - - . - - - /docroot/wp-admin/* - /docroot/wp-includes/* - /docroot/wp-*.php - /docroot/index.php - /docroot/xmlrpc.php - /docroot/wp-content/plugins/* - - - /vendor/* - - - /node_modules/* - - - *.min.js - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - /path/to/Tests/*Test\.php - - - /path/to/Tests/*Test\.php - - -